summaryrefslogtreecommitdiff
path: root/graphics/metapost
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/metapost
Initial commit
Diffstat (limited to 'graphics/metapost')
l---------graphics/metapost/contrib/macros/3d1
-rw-r--r--graphics/metapost/contrib/macros/automata/README41
-rw-r--r--graphics/metapost/contrib/macros/automata/automata.mp787
-rw-r--r--graphics/metapost/contrib/macros/automata/example.mp76
-rw-r--r--graphics/metapost/contrib/macros/automata/example.pdfbin0 -> 90447 bytes
-rw-r--r--graphics/metapost/contrib/macros/automata/example.tex35
-rw-r--r--graphics/metapost/contrib/macros/bbcard/README.bbcard45
-rw-r--r--graphics/metapost/contrib/macros/bbcard/README.calendar38
-rw-r--r--graphics/metapost/contrib/macros/bbcard/README.scorecard11
-rw-r--r--graphics/metapost/contrib/macros/bbcard/bbcard.mp262
-rw-r--r--graphics/metapost/contrib/macros/bbcard/bbcard.tpm22
-rw-r--r--graphics/metapost/contrib/macros/bbcard/breakwidth.mp101
-rw-r--r--graphics/metapost/contrib/macros/bbcard/calendar.mp216
-rw-r--r--graphics/metapost/contrib/macros/bbcard/scorecard.mp152
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/README54
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.pdfbin0 -> 288114 bytes
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.tex266
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.mp63
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.pdfbin0 -> 17522 bytes
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.mp73
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.pdfbin0 -> 12780 bytes
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/docblockprefs.mp18
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/tiddetext.sty71
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/documentation/tighttoc.sty64
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/implementation/blockdraw.mp310
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/implementation/bondgraph.mp226
-rw-r--r--graphics/metapost/contrib/macros/blockdraw_mp/implementation/shiftoff.mp130
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/CHANGES28
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/README41
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/TODO3
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/bpolynomial.mp302
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/bpolynomial.pdfbin0 -> 217467 bytes
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/bpolynomial.tex659
-rw-r--r--graphics/metapost/contrib/macros/bpolynomial/examples.mp271
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/README23
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/cmarrows.mp69
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/cmarrows.pdfbin0 -> 52267 bytes
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/rgbx0009.mp236
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/rgbx0016.mp195
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/rgbx0020.mp196
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/rgbx0025.mp236
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0008.mp240
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0010.mp240
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0011.mp242
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0012.mp213
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0013.mp213
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0014.mp199
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0015.mp141
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0017.mp196
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0018.mp181
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0019.mp142
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0021.mp174
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0022.mp181
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0023.mp250
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/sgbx0024.mp211
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0000.mp100
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0001.mp326
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0002.mp326
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0003.mp325
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0004.mp325
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0005.mp336
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0006.mp179
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0007.mp140
-rw-r--r--graphics/metapost/contrib/macros/cmarrows/tgbx0027.mp216
-rw-r--r--graphics/metapost/contrib/macros/drv/README21
-rw-r--r--graphics/metapost/contrib/macros/drv/doc/drv-guide.mp2110
-rw-r--r--graphics/metapost/contrib/macros/drv/doc/drv-guide.tex2243
-rw-r--r--graphics/metapost/contrib/macros/drv/doc/drv.mp3033
-rw-r--r--graphics/metapost/contrib/macros/drv/doc/makefile48
-rwxr-xr-xgraphics/metapost/contrib/macros/drv/doc/readme.sh18
-rw-r--r--graphics/metapost/contrib/macros/drv/drv-guide.pdfbin0 -> 222384 bytes
-rw-r--r--graphics/metapost/contrib/macros/drv/drv.mp3033
-rw-r--r--graphics/metapost/contrib/macros/drv/sample/coq-sample.mp101
-rw-r--r--graphics/metapost/contrib/macros/drv/sample/coq-sample.tex258
-rw-r--r--graphics/metapost/contrib/macros/drv/sample/drv.mp3033
-rw-r--r--graphics/metapost/contrib/macros/drv/sample/makefile50
-rwxr-xr-xgraphics/metapost/contrib/macros/drv/sample/readme.sh16
-rw-r--r--graphics/metapost/contrib/macros/drv/template/drv.mp3033
-rw-r--r--graphics/metapost/contrib/macros/drv/template/makefile46
-rwxr-xr-xgraphics/metapost/contrib/macros/drv/template/readme.sh16
-rw-r--r--graphics/metapost/contrib/macros/drv/template/template.mp177
-rw-r--r--graphics/metapost/contrib/macros/drv/template/template.tex60
-rw-r--r--graphics/metapost/contrib/macros/dviincl/0czytaj.sla48
-rw-r--r--graphics/metapost/contrib/macros/dviincl/0dviincl.inf63
-rw-r--r--graphics/metapost/contrib/macros/dviincl/README63
-rw-r--r--graphics/metapost/contrib/macros/dviincl/README.pl48
-rw-r--r--graphics/metapost/contrib/macros/dviincl/fix_brks.mp25
-rw-r--r--graphics/metapost/contrib/macros/dviincl/fix_page.mp7
-rw-r--r--graphics/metapost/contrib/macros/dviincl/storyx.tex22
-rw-r--r--graphics/metapost/contrib/macros/dviincl/test-bop.mp18
-rw-r--r--graphics/metapost/contrib/macros/dviincl/test-bop.tex13
-rw-r--r--graphics/metapost/contrib/macros/dviincl/testit.bat44
-rw-r--r--graphics/metapost/contrib/macros/dviincl/testit.sh18
-rw-r--r--graphics/metapost/contrib/macros/epsincl/0info.txt13
-rw-r--r--graphics/metapost/contrib/macros/epsincl/README13
-rw-r--r--graphics/metapost/contrib/macros/epsincl/epsincl.awk176
-rw-r--r--graphics/metapost/contrib/macros/epsincl/epsincl.bat11
-rw-r--r--graphics/metapost/contrib/macros/epsincl/epsincl.mp116
-rw-r--r--graphics/metapost/contrib/macros/epsincl/testinc0.eps114
-rw-r--r--graphics/metapost/contrib/macros/epsincl/testincl.bat3
-rw-r--r--graphics/metapost/contrib/macros/epsincl/testincl.mp10
-rw-r--r--graphics/metapost/contrib/macros/epsincl/testincl.sh4
-rw-r--r--graphics/metapost/contrib/macros/expressg/README101
-rw-r--r--graphics/metapost/contrib/macros/expressg/aam.mp921
-rw-r--r--graphics/metapost/contrib/macros/expressg/aamfigs.pdfbin0 -> 42281 bytes
-rw-r--r--graphics/metapost/contrib/macros/expressg/aamfigs.tex65
-rw-r--r--graphics/metapost/contrib/macros/expressg/expeg.pdfbin0 -> 61100 bytes
-rw-r--r--graphics/metapost/contrib/macros/expressg/expressg.dtx6553
-rw-r--r--graphics/metapost/contrib/macros/expressg/expressg.ins114
-rw-r--r--graphics/metapost/contrib/macros/expressg/expressg.pdfbin0 -> 433000 bytes
-rw-r--r--graphics/metapost/contrib/macros/exteps/LICENSE340
-rw-r--r--graphics/metapost/contrib/macros/exteps/README5
-rw-r--r--graphics/metapost/contrib/macros/exteps/delfin108
-rw-r--r--graphics/metapost/contrib/macros/exteps/exteps.mp235
-rw-r--r--graphics/metapost/contrib/macros/exteps/exteps.pdfbin0 -> 179682 bytes
-rw-r--r--graphics/metapost/contrib/macros/exteps/exteps.tex410
-rw-r--r--graphics/metapost/contrib/macros/featpost/MPexamples.html1097
-rw-r--r--graphics/metapost/contrib/macros/featpost/README26
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/COMPILE.sh72
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/dvipngproof.sh9
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/laproof.sh8
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/makehtmlindex.sh29
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/pdflatexproof.sh9
-rwxr-xr-xgraphics/metapost/contrib/macros/featpost/bash/pngmaker.sh18
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/Exemplifier.pdfbin0 -> 7516906 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/alldefs.txt176
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.pdfbin0 -> 985121 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.tex9
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/featpostdocsource.tex2072
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/featpostmanual.pdfbin0 -> 1008696 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/featpostmanual.tex9
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.pdfbin0 -> 43469 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.tex22
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.pdfbin0 -> 181700 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.tex225
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.pdfbin0 -> 835943 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.tex402
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.eps49
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.jpegbin0 -> 33936 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.pgm4
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/CompanionsCollection.jpgbin0 -> 24816 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.diabin0 -> 1191 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.mp78
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/KnuthCollection.jpgbin0 -> 29776 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/dia.pngbin0 -> 43270 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.1156
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.mp21
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.144
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.mp52
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/metapostpropaganda.pngbin0 -> 56622 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.mps303
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.pdfbin0 -> 3705 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpegbin0 -> 48049 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpgbin0 -> 3535 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.mp24
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.pngbin0 -> 51239 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpaf.jpegbin0 -> 109617 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafphoto.jpgbin0 -> 57396 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.0118
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.1151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.10151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.11151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.12151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.13151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.14151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.15151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.2151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.3151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.4151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.5151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.6151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.7151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.8151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.9151
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.mp139
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.16157
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.21693
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.3397
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.mp80
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal-1.svg15
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal.mp102
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/todo.jpgbin0 -> 313659 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.11707
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.21284
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.mp320
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/xfig.pngbin0 -> 22649 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/otherinfo/BezierApprox.pdfbin0 -> 556387 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/otherinfo/CHANGESv1.803.txt1504
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/otherinfo/Zpravodaj2009-4.pdfbin0 -> 810278 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/otherinfo/jdbug.pngbin0 -> 9836 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/doc/otherinfo/tb88henderson.pdfbin0 -> 258010 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/38.mp54
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/A131.mp222
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/CAT.mp45
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/DebianSwirlsmallEdited.mp55
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/EBcrossed.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/LED.mp76
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/SlowDownNowBitmapScanned.mp172
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/acmaglev.mp38
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/acoplanv.mp81
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ahoraesglobal.mp277
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/aledlogo.mp183
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/allgreatideas.mp166
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/anglinerigorouscircle.mp111
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/antimattermeteor.mp70
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/avalzero.mp85
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/badshreeyantra.mp73
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/balllauncher.mp115
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/bananadimmer.mp78
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/beautiful00.mp40
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/bichaepolicia.mp370
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/brownellips.mp128
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/bstr.mp15
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/bughunt.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/buildcyclebug.mp203
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/canschemes.mp159
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cap29res.mp380
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/caratk3edit.mp339
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cartaxes.mp31
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/casadopessoal.mp63
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cellevolve.mp72
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cinemwork.mp322
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/circlespeedprofile.mp43
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/closingbox.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cmykropes.mp287
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cone.mp39
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/conegetready.mp36
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/conicurv.mp103
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/conoscopy.mp224
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/convergingspirals.mp361
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/crossingline.mp112
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cruztuga.mp37
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cubicfacecentered.mp112
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cubicfigures.mp44
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cubicstructurefcc.mp64
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cubicstructures.mp410
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cylimple.mp50
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/cylinderborders.mp50
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/daliasensor.mp70
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/decorstatement.mp29
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/defaultcmr.mp32
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/deperspective.mp94
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/derivondatriang.mp82
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/diameters.mp36
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/directfonts.mp20
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/doitnow.mp33
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/downloadicon.mp66
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/dreamhouse.mp212
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/durgayantra.mp174
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/eemcsblabla.mp294
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/electricpotential.mp153
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/electrospiral.mp50
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ellipticextrusionpress.mp31
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ellipticprism.mp41
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ellipticproperties.mp45
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/elliptictable.mp83
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ellipticthing.mp47
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/embroncordada.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/emptylines.mp28
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/equilatrianglelines.mp40
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/equilibriodetorques.mp47
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/esteveslogo.mp52
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/experimental.mp177
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/experimental2Dsetup.mp175
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/f1aula03.mp104
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/f1aula05.mp98
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fakehole.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fallinthewind.mp106
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/featpostlogo.mp29
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ffcbob.mp84
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fieldlines.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fieldlinesnorma.mp104
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaper.mp183
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaperwork.mp139
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fis1prex.mp198
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fis3prex.mp481
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fis3prex7.mp165
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/fis3prey.mp158
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/frustum.mp48
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/galvanometro-inducao.mp245
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/gausslawframe.mp145
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geombasic.mp82
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geomcasq.mp84
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geometricaverage.mp60
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geomfiguei.mp71
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geomfreder.mp94
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geommine.mp106
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/geomsrinath.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/gnupost.mp110
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/gnupost3Dlogo.mp125
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/goldenellipse.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/graphene.mp81
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/graphexample.mp16
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/graphs.mp65
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/halfcirclesfear.mp43
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hap.mp137
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/heatfromroom.mp90
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/helix.mp27
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hermitespliknot.mp117
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hexacylon.mp23
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hexagonalgrid.mp132
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hexagonaltrimesh.mp25
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hiddenlinegraph.mp74
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hiddensurface.mp153
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/hiddensurfaces.mp65
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/iamsorrykarl.mp94
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/inductionbob.mp116
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/integerbars.mp58
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/integratorfigures.mp112
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/interdigitrodes.mp24
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/intersectorus.mp30
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/intersectprolatespheroid.mp27
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/iplaca.mp45
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/jd44.mp172
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/jdbug.mp26
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/joinedemptylines.mp47
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/keplernewtonfeynman.mp80
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/kindofcube.mp81
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/kindofcuber.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/kopptrammel.mp39
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/labelconstruct.mp30
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/labelinspace.mp33
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lamarquejaune.mp100
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lasermachine.mp29
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/latexboxes.mp25
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lawofcosines.mp167
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lcurvature.mp114
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ledlogo.mp202
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lgc2refractionEdited.mp126
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/loglogpaper.mp71
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/logofontest.mp35
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/lowcostgreenhouse.mp71
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/magneticflux.mp105
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mainmemtest.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/manjusha.mp76
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/matricskoc.mp22
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mce-lng.mp89
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/metalcharge.mp98
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/micostufas.mp41
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/micromu.mp34
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/milimetricpaper.mp52
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mpfields.mp160
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mptoolcone.mp49
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/muslimpattern.mp73
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mypatent.mp319
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mypatentpieces.mp634
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/mysquaresectionbar.mp33
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/naoestacionar.mp39
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/naotocanacalote.mp58
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nembends.mp48
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nembiaxi.mp64
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nemdirector.mp82
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nemquira.mp60
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nemquirapitch.mp69
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nemsaddl.mp86
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nemuniax.mp61
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/newcommunism.mp237
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/newexperimental.mp156
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nosimples.mp61
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nosuspension.mp131
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nsmetica.mp60
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nulldefectanglexample.mp134
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/nurbstobeziern.mp205
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/onebigword.mp17
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/optest.mp51
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/optica.mp206
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/par3Dplotexamples.mp151
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/parabolaonthestage.mp17
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/parafuso.mp140
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/parafusoprojxy.mp64
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/pathernon.mp67
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/pathofstraightline.mp29
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/perspec.mp76
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/photorefer.mp198
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/photoreverse.mp242
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/pifpaf.mp56
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/pixelgrid.mp45
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/plaintangency.mp106
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/planintersection.mp107
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/planpht.mp291
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/polyhedr.mp191
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/positivecharge.mp28
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/potenciadecicloeliptico.mp46
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/probtodooterr.mp75
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/profaux.mp70
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/project.mp74
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/qap.mp117
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/quartertorus.mp77
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/radiativeforcing.mp243
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/raiodoscirculos.mp97
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/redplanet.mp137
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/reeditedgoodquestionmark.mp102
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/resistcircuit.mp66
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/reuleaux.mp34
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/revolipsoid.mp50
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/revolutionparaboloid.mp167
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/revolvers.mp184
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorcubo.mp36
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorouscircle.mp49
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorouscone.mp36
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorousdiscSD.mp49
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorousdiscoptions.mp31
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rigorousfearpath.mp66
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rmnbob.mp48
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/roadincline.mp67
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rodarolaremplaninc.mp52
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ropepatterns.mp30
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rosadosventos.mp52
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rotatnlc.mp49
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rothexagrid.mp45
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/rungekuttasecond.mp103
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sal.mp106
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sap.mp179
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/saturn.mp130
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sfearschem.mp34
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sharpraytrace.mp133
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/signalvertexSD.mp40
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplecar.mp25
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplecarparam.mp70
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplecenterofmass.mp127
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplelens.mp114
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplependulum.mp51
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/simplexperiment.mp72
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sincityredesigned.mp264
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/slingshot.mp87
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/smC.mp153
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/sniperlogo.mp38
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/solarconcentrator.mp64
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/solardish.mp112
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/some2Dvecs.mp77
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/spaceinvader.mp210
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/spatialhalfsfear.mp17
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/spherample.mp49
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/splineperspective.mp719
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/splineperspectives.mp272
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/spltwiben.mp81
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/squareanglines.mp14
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/srinathpolineni.mp223
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/stageforthree.mp115
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/statement.mp51
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/statethreelines.mp21
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/steamcamera.mp58
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/strength1defect.mp85
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/symbol.mp97
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tangency2D.mp58
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tangencypoint.mp38
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tdarrow.mp26
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tdcircarrow.mp29
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/telemira.mp22
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/telheiro.mp96
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tete.mp24
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tetrapodes.mp140
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/theHURD.mp102
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/thearchicon.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/thethreekindsofperspec.mp195
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/thunderproblem.mp37
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tiposdetrans.mp71
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tiposdetransb.mp57
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tiposdetranst.mp43
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/toro4transit.mp202
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/torus.mp323
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/torusexperiment.mp152
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/trajectoryline.mp88
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/trebuchet.mp36
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/treecarbonedited.mp2128
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/trianglecenterofmass.mp43
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/triangulartrimesh.mp39
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/trig.mp84
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/trigonometry.mp89
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/troncoconedef.mp54
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tropicalglobe.mp99
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/troysfear.mp77
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tshirtfig.mp39
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/tuftescatter.mp83
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twistflat.mp55
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twistnlc.mp54
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twistroundbiax.mp62
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twoDcolision.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twocyclestogether.mp113
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twoholes.mp31
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twoplustwo.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twosolarpanels.mp85
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/twoupcones.mp51
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ubhtransients.mp139
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ultraeye.mp16
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/ultraimprovertex.mp63
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/unperfection.mp59
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/unperfectionremoved.mp34
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/vanallenbelt.mp51
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/verygoodcone.mp28
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/wwfpmp.mp154
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/xcmplaca2buraquads.mp69
-rw-r--r--graphics/metapost/contrib/macros/featpost/example/xraycamera.mp117
-rw-r--r--graphics/metapost/contrib/macros/featpost/featpost.mp2
-rw-r--r--graphics/metapost/contrib/macros/featpost/featpost3Dplus2D.mp4625
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/38.1.pngbin0 -> 107995 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/A131.1.pngbin0 -> 14793 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/CAT.1.pngbin0 -> 7770 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/DebianSwirlsmallEdited.1.pngbin0 -> 14201 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/EBcrossed.1.pngbin0 -> 6397 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/LED.1.pngbin0 -> 4480 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/SlowDownNowBitmapScanned.1.pngbin0 -> 11377 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/acmaglev.1.pngbin0 -> 4742 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/acoplanv.1.pngbin0 -> 8538 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ahoraesglobal.1.pngbin0 -> 11594 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/aledlogo.1.pngbin0 -> 32753 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/aledlogo.2.pngbin0 -> 9366 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/allgreatideas.1.pngbin0 -> 9154 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/anglinerigorouscircle.1.pngbin0 -> 8219 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/antimattermeteor.1.pngbin0 -> 38549 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/avalzero.1.pngbin0 -> 11177 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/avalzero.2.pngbin0 -> 6735 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/avalzero.3.pngbin0 -> 5311 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/avalzero.4.pngbin0 -> 3842 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/badshreeyantra.1.pngbin0 -> 12933 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/balllauncher.0.pngbin0 -> 5812 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/balllauncher.9.pngbin0 -> 9531 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/bananadimmer.1.pngbin0 -> 14160 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/beautiful00.1.pngbin0 -> 11574 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/bichaepolicia.0.pngbin0 -> 6977 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/brownellips.0.pngbin0 -> 37605 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/bstr.1.pngbin0 -> 5331 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/bughunt.1.pngbin0 -> 9538 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/bughunt.2.pngbin0 -> 7015 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/buildcyclebug.1.pngbin0 -> 34937 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/buildcyclebug.2.pngbin0 -> 7670 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/canschemes.1.pngbin0 -> 8591 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/canschemes.2.pngbin0 -> 11873 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/canschemes.3.pngbin0 -> 7473 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.1.pngbin0 -> 5715 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.2.pngbin0 -> 5187 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.3.pngbin0 -> 5364 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.4.pngbin0 -> 6070 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.5.pngbin0 -> 5618 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.6.pngbin0 -> 3854 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.7.pngbin0 -> 5720 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.8.pngbin0 -> 9046 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cap29res.9.pngbin0 -> 8178 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/caratk3edit.1.pngbin0 -> 14735 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cartaxes.1.pngbin0 -> 4417 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cartaxes.2.pngbin0 -> 7099 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/casadopessoal.1.pngbin0 -> 4913 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/casadopessoal.2.pngbin0 -> 4675 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/casadopessoal.3.pngbin0 -> 5083 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/casadopessoal.4.pngbin0 -> 4597 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cellevolve.0.pngbin0 -> 61393 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cinemwork.1.pngbin0 -> 7266 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cinemwork.2.pngbin0 -> 8236 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/circlespeedprofile.1.pngbin0 -> 13391 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/closingbox.1.pngbin0 -> 11334 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cmykropes.1.pngbin0 -> 33759 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cone.1.pngbin0 -> 12367 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conegetready.1.pngbin0 -> 5094 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conicurv.1.pngbin0 -> 9949 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conoscopy.1.pngbin0 -> 15319 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conoscopy.2.pngbin0 -> 14813 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conoscopy.3.pngbin0 -> 18633 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conoscopy.4.pngbin0 -> 13005 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/conoscopy.5.pngbin0 -> 13146 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/convergingspirals.1.pngbin0 -> 18777 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/convergingspirals.2.pngbin0 -> 24444 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/convergingspirals.3.pngbin0 -> 13621 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/convergingspirals.4.pngbin0 -> 14927 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/convergingspirals.5.pngbin0 -> 18978 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/crossingline.1.pngbin0 -> 10774 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/crossingline.2.pngbin0 -> 11887 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/crossingline.3.pngbin0 -> 9064 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cruztuga.1.pngbin0 -> 4681 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicfacecentered.1.pngbin0 -> 20409 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicfigures.1.pngbin0 -> 8470 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicfigures.2.pngbin0 -> 10473 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicfigures.3.pngbin0 -> 10692 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructurefcc.1.pngbin0 -> 19825 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.1.pngbin0 -> 14770 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.2.pngbin0 -> 13676 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.3.pngbin0 -> 16106 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.4.pngbin0 -> 17105 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.5.pngbin0 -> 26940 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cubicstructures.6.pngbin0 -> 15928 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cylimple.1.pngbin0 -> 10965 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/cylinderborders.1.pngbin0 -> 10992 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/daliasensor.1.pngbin0 -> 47189 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/decorstatement.0.pngbin0 -> 11038 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/defaultcmr.0.pngbin0 -> 9958 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/deperspective.1.pngbin0 -> 5767 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/deperspective.2.pngbin0 -> 17550 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/deperspective.3.pngbin0 -> 9618 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/deperspective.4.pngbin0 -> 14699 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/derivondatriang.1.pngbin0 -> 6205 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/diameters.1.pngbin0 -> 9904 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/directfonts.0.pngbin0 -> 7975 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/doitnow.1.pngbin0 -> 12842 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/downloadicon.1.pngbin0 -> 9202 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/dreamhouse.1.pngbin0 -> 8143 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/dreamhouse.2.pngbin0 -> 10178 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/durgayantra.1.pngbin0 -> 8840 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/durgayantra.2.pngbin0 -> 14869 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/eemcsblabla.1.pngbin0 -> 12089 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/electricpotential.0.pngbin0 -> 26052 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/electricpotential.1.pngbin0 -> 24142 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/electricpotential.2.pngbin0 -> 34531 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/electricpotential.3.pngbin0 -> 36667 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/electrospiral.1.pngbin0 -> 9534 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ellipticextrusionpress.1.pngbin0 -> 14582 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ellipticprism.1.pngbin0 -> 13672 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ellipticproperties.1.pngbin0 -> 7260 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/elliptictable.1.pngbin0 -> 7912 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ellipticthing.1.pngbin0 -> 10330 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/embroncordada.1.pngbin0 -> 44092 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/emptylines.1.pngbin0 -> 6765 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/equilatrianglelines.1.pngbin0 -> 10456 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/equilibriodetorques.1.pngbin0 -> 5758 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/esteveslogo.1.pngbin0 -> 10431 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/experimental.1.pngbin0 -> 13652 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/experimental2Dsetup.1.pngbin0 -> 11502 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula03.1.pngbin0 -> 4305 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula03.2.pngbin0 -> 4076 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula03.3.pngbin0 -> 5956 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula03.4.pngbin0 -> 5593 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula05.1.pngbin0 -> 9475 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/f1aula05.2.pngbin0 -> 10843 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fakehole.1.pngbin0 -> 27295 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fakehole.2.pngbin0 -> 8673 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fallinthewind.1.pngbin0 -> 42432 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/featpostlogo.1.pngbin0 -> 3938 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ffcbob.1.pngbin0 -> 18469 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlines.1.pngbin0 -> 7875 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.1.pngbin0 -> 8596 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.2.pngbin0 -> 26999 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.1.pngbin0 -> 48673 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.2.pngbin0 -> 39078 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaperwork.1.pngbin0 -> 8179 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis1prex.1.pngbin0 -> 8772 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis1prex.2.pngbin0 -> 9339 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis1prex.3.pngbin0 -> 9536 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.1.pngbin0 -> 9733 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.2.pngbin0 -> 15999 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.3.pngbin0 -> 7438 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.4.pngbin0 -> 9364 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.5.pngbin0 -> 10352 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.6.pngbin0 -> 6334 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.7.pngbin0 -> 10023 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.8.pngbin0 -> 14083 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex.9.pngbin0 -> 11651 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.1.pngbin0 -> 11024 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.2.pngbin0 -> 8721 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.3.pngbin0 -> 10025 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.4.pngbin0 -> 9574 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.5.pngbin0 -> 9877 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.6.pngbin0 -> 12315 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.7.pngbin0 -> 10986 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prex7.8.pngbin0 -> 10062 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prey.1.pngbin0 -> 10796 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prey.2.pngbin0 -> 11904 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/fis3prey.3.pngbin0 -> 12234 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/frustum.1.pngbin0 -> 8661 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/galvanometro-inducao.1.pngbin0 -> 17123 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/gausslawframe.1.pngbin0 -> 51543 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geombasic.1.pngbin0 -> 8468 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geomcasq.1.pngbin0 -> 7232 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geometricaverage.1.pngbin0 -> 6368 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geomfiguei.1.pngbin0 -> 10020 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geomfreder.1.pngbin0 -> 22048 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geommine.1.pngbin0 -> 11126 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/geomsrinath.1.pngbin0 -> 8834 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/gnupost.1.pngbin0 -> 11185 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/gnupost3Dlogo.1.pngbin0 -> 13340 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/goldenellipse.1.pngbin0 -> 8732 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/graphene.1.pngbin0 -> 20409 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/graphexample.1.pngbin0 -> 13301 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/graphs.1.pngbin0 -> 9420 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/graphs.2.pngbin0 -> 7285 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/halfcirclesfear.1.pngbin0 -> 13165 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hap.1.pngbin0 -> 35227 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/heatfromroom.1.pngbin0 -> 7718 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/helix.1.pngbin0 -> 24460 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hermitespliknot.1.pngbin0 -> 12403 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hexacylon.1.pngbin0 -> 5755 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.1.pngbin0 -> 5833 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.2.pngbin0 -> 10413 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.3.pngbin0 -> 9597 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hexagonaltrimesh.1.pngbin0 -> 78971 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hiddenlinegraph.1.pngbin0 -> 66268 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hiddensurface.1.pngbin0 -> 20902 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/hiddensurfaces.1.pngbin0 -> 48661 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/iamsorrykarl.1.pngbin0 -> 5745 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/inductionbob.1.pngbin0 -> 22318 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/integerbars.1.pngbin0 -> 12290 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/integratorfigures.1.pngbin0 -> 12618 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/integratorfigures.2.pngbin0 -> 14928 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/interdigitrodes.1.pngbin0 -> 4306 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/intersectorus.1.pngbin0 -> 10526 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/intersectprolatespheroid.1.pngbin0 -> 13479 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/iplaca.1.pngbin0 -> 3822 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jd44.1.pngbin0 -> 7402 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jd44.2.pngbin0 -> 7565 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jd44.3.pngbin0 -> 5338 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jd44.4.pngbin0 -> 8613 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jdbug.1.pngbin0 -> 5621 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/jdbug.2.pngbin0 -> 5605 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/joinedemptylines.1.pngbin0 -> 15539 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/keplernewtonfeynman.1.pngbin0 -> 24518 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/kindofcube.1.pngbin0 -> 34590 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/kindofcube.2.pngbin0 -> 9910 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/kindofcuber.1.pngbin0 -> 12786 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/kopptrammel.1.pngbin0 -> 5677 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/labelconstruct.1.pngbin0 -> 7185 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/labelinspace.1.pngbin0 -> 7575 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lamarquejaune.1.pngbin0 -> 9648 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lasermachine.1.pngbin0 -> 12862 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/latexboxes.0.pngbin0 -> 3237 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/latexboxes.1.pngbin0 -> 3214 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lawofcosines.1.pngbin0 -> 35661 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lawofcosines.2.pngbin0 -> 12243 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lcurvature.1.pngbin0 -> 33515 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lcurvature.2.pngbin0 -> 21804 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ledlogo.1.pngbin0 -> 7001 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ledlogo.2.pngbin0 -> 7234 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ledlogo.3.pngbin0 -> 9443 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ledlogo.4.pngbin0 -> 4098 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.1.pngbin0 -> 13548 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.2.pngbin0 -> 18635 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.3.pngbin0 -> 10836 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.4.pngbin0 -> 20404 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/loglogpaper.1.pngbin0 -> 7020 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/logofontest.0.pngbin0 -> 7564 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/lowcostgreenhouse.1.pngbin0 -> 6665 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/magneticflux.1.pngbin0 -> 24475 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/magneticflux.2.pngbin0 -> 41127 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mainmemtest.1.pngbin0 -> 8704 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/manjusha.1.pngbin0 -> 5088 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/manjusha.4.pngbin0 -> 5383 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/manjusha.6.pngbin0 -> 11485 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/matricskoc.1.pngbin0 -> 8650 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mce-lng.1.pngbin0 -> 13306 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/metalcharge.1.pngbin0 -> 6525 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/micostufas.1.pngbin0 -> 6962 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/micromu.1.pngbin0 -> 6699 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/milimetricpaper.1.pngbin0 -> 5213 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/milimetricpaper.2.pngbin0 -> 2674 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.0.pngbin0 -> 3576 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.1.pngbin0 -> 11092 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.2.pngbin0 -> 3588 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.3.pngbin0 -> 9857 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.4.pngbin0 -> 3565 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.5.pngbin0 -> 8460 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.6.pngbin0 -> 10650 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mpfields.7.pngbin0 -> 9430 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mptoolcone.0.pngbin0 -> 7826 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/muslimpattern.1.pngbin0 -> 17222 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/muslimpattern.2.pngbin0 -> 17947 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mypatent.1.pngbin0 -> 6342 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mypatent.2.pngbin0 -> 7639 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mypatent.3.pngbin0 -> 4537 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mypatent.4.pngbin0 -> 10007 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mypatentpieces.1.pngbin0 -> 24451 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/mysquaresectionbar.1.pngbin0 -> 23103 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/naoestacionar.1.pngbin0 -> 9079 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/naotocanacalote.1.pngbin0 -> 6408 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nembends.1.pngbin0 -> 16594 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nembiaxi.1.pngbin0 -> 19951 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nemdirector.1.pngbin0 -> 22484 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nemquira.1.pngbin0 -> 12863 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nemquirapitch.1.pngbin0 -> 12325 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nemsaddl.1.pngbin0 -> 26173 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nemuniax.1.pngbin0 -> 50005 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/newcommunism.1.pngbin0 -> 7117 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/newcommunism.2.pngbin0 -> 5549 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/newexperimental.1.pngbin0 -> 14444 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nosimples.1.pngbin0 -> 7456 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nosuspension.0.pngbin0 -> 6371 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nsmetica.1.pngbin0 -> 39185 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.1.pngbin0 -> 6158 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.2.pngbin0 -> 10424 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.3.pngbin0 -> 11918 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.4.pngbin0 -> 10932 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/nurbstobeziern.0.pngbin0 -> 5387 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/onebigword.1.pngbin0 -> 5889 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/optest.1.pngbin0 -> 13695 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/optest.2.pngbin0 -> 4550 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/optica.1.pngbin0 -> 11887 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.1.pngbin0 -> 32036 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.2.pngbin0 -> 51824 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/parafuso.1.pngbin0 -> 21234 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/parafuso.2.pngbin0 -> 14691 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/parafuso.3.pngbin0 -> 31366 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/parafuso.4.pngbin0 -> 33267 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/parafusoprojxy.1.pngbin0 -> 10420 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/pathernon.0.pngbin0 -> 17679 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/pathofstraightline.1.pngbin0 -> 12252 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/perspec.1.pngbin0 -> 8645 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/photorefer.1.pngbin0 -> 7745 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/photorefer.2.pngbin0 -> 9386 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/photoreverse.1.pngbin0 -> 8980 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/pifpaf.1.pngbin0 -> 11998 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/pixelgrid.1.pngbin0 -> 3894 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/plaintangency.0.pngbin0 -> 6693 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/plaintangency.1.pngbin0 -> 7236 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planintersection.1.pngbin0 -> 8725 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.1.pngbin0 -> 8552 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.2.pngbin0 -> 8063 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.3.pngbin0 -> 8363 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.4.pngbin0 -> 9873 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.5.pngbin0 -> 8861 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.6.pngbin0 -> 8398 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/planpht.7.pngbin0 -> 13160 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/polyhedr.1.pngbin0 -> 7855 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/polyhedr.2.pngbin0 -> 14469 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/polyhedr.3.pngbin0 -> 29329 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/positivecharge.1.pngbin0 -> 28125 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/potenciadecicloeliptico.1.pngbin0 -> 5642 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/probtodooterr.1.pngbin0 -> 9555 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/profaux.1.pngbin0 -> 8811 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/project.1.pngbin0 -> 8053 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/qap.1.pngbin0 -> 49569 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/quartertorus.1.pngbin0 -> 16650 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/quartertorus.2.pngbin0 -> 10800 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/radiativeforcing.0.pngbin0 -> 9858 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.1.pngbin0 -> 7435 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.2.pngbin0 -> 6288 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.3.pngbin0 -> 7162 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.4.pngbin0 -> 6454 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.5.pngbin0 -> 5978 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.6.pngbin0 -> 6131 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.7.pngbin0 -> 5963 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.8.pngbin0 -> 7433 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.9.pngbin0 -> 6650 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/redplanet.1.pngbin0 -> 12188 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/reeditedgoodquestionmark.1.pngbin0 -> 9493 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/resistcircuit.1.pngbin0 -> 3617 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/reuleaux.1.pngbin0 -> 5791 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/reuleaux.2.pngbin0 -> 37201 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolipsoid.1.pngbin0 -> 38221 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolipsoid.2.pngbin0 -> 17823 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.1.pngbin0 -> 9034 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.2.pngbin0 -> 7196 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.3.pngbin0 -> 21230 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.4.pngbin0 -> 10912 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.5.pngbin0 -> 14919 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.1.pngbin0 -> 16366 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.2.pngbin0 -> 16366 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.3.pngbin0 -> 13350 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.4.pngbin0 -> 8427 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.5.pngbin0 -> 13277 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.6.pngbin0 -> 13974 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/revolvers.7.pngbin0 -> 10327 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorcubo.0.pngbin0 -> 9452 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorouscircle.1.pngbin0 -> 14510 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorouscone.1.pngbin0 -> 9690 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorousdiscSD.1.pngbin0 -> 26638 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorousdiscoptions.1.pngbin0 -> 20582 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rigorousfearpath.1.pngbin0 -> 16409 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rmnbob.1.pngbin0 -> 18988 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/roadincline.1.pngbin0 -> 7574 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rodarolaremplaninc.1.pngbin0 -> 9778 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ropepatterns.1.pngbin0 -> 71292 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rosadosventos.1.pngbin0 -> 21520 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rotatnlc.1.pngbin0 -> 21798 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rothexagrid.1.pngbin0 -> 13370 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.1.pngbin0 -> 10650 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.2.pngbin0 -> 18544 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sal.1.pngbin0 -> 12827 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sal.2.pngbin0 -> 6051 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sap.1.pngbin0 -> 52753 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/saturn.1.pngbin0 -> 6970 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sfearschem.1.pngbin0 -> 8204 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sharpraytrace.1.pngbin0 -> 8099 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sharpraytrace.2.pngbin0 -> 5588 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sharpraytrace.3.pngbin0 -> 6460 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sharpraytrace.4.pngbin0 -> 8680 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/signalvertexSD.1.pngbin0 -> 11206 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplecar.1.pngbin0 -> 23744 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplecarparam.1.pngbin0 -> 16484 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.0.pngbin0 -> 6571 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.1.pngbin0 -> 6535 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplelens.1.pngbin0 -> 17613 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplependulum.1.pngbin0 -> 7164 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/simplexperiment.1.pngbin0 -> 10163 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sincityredesigned.1.pngbin0 -> 7666 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sincityredesigned.2.pngbin0 -> 8770 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/slingshot.1.pngbin0 -> 22524 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/smC.1.pngbin0 -> 10767 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/sniperlogo.1.pngbin0 -> 7584 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/solarconcentrator.1.pngbin0 -> 16831 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/solardish.1.pngbin0 -> 12981 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/solardish.2.pngbin0 -> 19691 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/solardish.3.pngbin0 -> 19282 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/solardish.4.pngbin0 -> 12725 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/some2Dvecs.1.pngbin0 -> 12748 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/spaceinvader.1.pngbin0 -> 4206 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/spaceinvader.2.pngbin0 -> 7325 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/spatialhalfsfear.1.pngbin0 -> 14321 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/spherample.1.pngbin0 -> 8336 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.0.pngbin0 -> 9028 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.1.pngbin0 -> 10539 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.2.pngbin0 -> 9235 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.3.pngbin0 -> 4776 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.4.pngbin0 -> 5320 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspective.5.pngbin0 -> 8993 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspectives.1.pngbin0 -> 9851 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspectives.2.pngbin0 -> 11458 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/splineperspectives.3.pngbin0 -> 14997 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/spltwiben.1.pngbin0 -> 14666 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/squareanglines.1.pngbin0 -> 6118 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.1.pngbin0 -> 25578 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.2.pngbin0 -> 24693 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.3.pngbin0 -> 21449 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.5.pngbin0 -> 51646 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.6.pngbin0 -> 49945 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.7.pngbin0 -> 48833 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.8.pngbin0 -> 47872 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/srinathpolineni.9.pngbin0 -> 62711 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/stageforthree.1.pngbin0 -> 23392 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/stageforthree.2.pngbin0 -> 30939 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/stageforthree.3.pngbin0 -> 27158 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/statement.1.pngbin0 -> 6640 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/statement.2.pngbin0 -> 8268 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/statethreelines.0.pngbin0 -> 6576 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/steamcamera.0.pngbin0 -> 11554 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/strength1defect.1.pngbin0 -> 17936 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/symbol.1.pngbin0 -> 14698 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tangency2D.1.pngbin0 -> 7422 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tangencypoint.1.pngbin0 -> 6693 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tdarrow.1.pngbin0 -> 73278 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tdcircarrow.1.pngbin0 -> 20019 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/telemira.1.pngbin0 -> 13511 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/telheiro.1.pngbin0 -> 7433 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/telheiro.2.pngbin0 -> 8498 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tete.1.pngbin0 -> 7568 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tetrapodes.1.pngbin0 -> 11278 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tetrapodes.2.pngbin0 -> 6649 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tetrapodes.3.pngbin0 -> 74373 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/theHURD.1.pngbin0 -> 5283 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/thearchicon.1.pngbin0 -> 10079 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.1.pngbin0 -> 7773 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.2.pngbin0 -> 8766 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.3.pngbin0 -> 11068 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/thunderproblem.1.pngbin0 -> 7302 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tiposdetrans.1.pngbin0 -> 8474 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tiposdetransb.1.pngbin0 -> 7930 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tiposdetranst.1.pngbin0 -> 8177 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/toro4transit.1.pngbin0 -> 7479 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.1.pngbin0 -> 11118 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.2.pngbin0 -> 6934 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.3.pngbin0 -> 35689 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.4.pngbin0 -> 13801 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.5.pngbin0 -> 37474 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.6.pngbin0 -> 9955 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torus.7.pngbin0 -> 20855 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torusexperiment.1.pngbin0 -> 11018 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/torusexperiment.2.pngbin0 -> 9055 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trajectoryline.1.pngbin0 -> 8648 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trajectoryline.2.pngbin0 -> 13865 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trebuchet.1.pngbin0 -> 23272 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/treecarbonedited.0.pngbin0 -> 13455 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trianglecenterofmass.1.pngbin0 -> 7947 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/triangulartrimesh.1.pngbin0 -> 45251 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trig.1.pngbin0 -> 5805 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/trigonometry.1.pngbin0 -> 6704 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/troncoconedef.0.pngbin0 -> 7936 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tropicalglobe.1.pngbin0 -> 19353 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tropicalglobe.2.pngbin0 -> 19813 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tropicalglobe.3.pngbin0 -> 18458 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/troysfear.1.pngbin0 -> 31219 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tshirtfig.1.pngbin0 -> 28189 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/tuftescatter.1.pngbin0 -> 27254 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twistflat.1.pngbin0 -> 19557 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twistnlc.1.pngbin0 -> 10187 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twistroundbiax.1.pngbin0 -> 14071 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twoDcolision.1.pngbin0 -> 7928 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twocyclestogether.1.pngbin0 -> 13269 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twoholes.1.pngbin0 -> 18922 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twoplustwo.1.pngbin0 -> 7956 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twosolarpanels.1.pngbin0 -> 15244 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/twoupcones.1.pngbin0 -> 8980 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ubhtransients.0.pngbin0 -> 25215 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ultraeye.1.pngbin0 -> 11783 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.1.pngbin0 -> 13353 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.2.pngbin0 -> 11194 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.3.pngbin0 -> 13238 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/unperfection.1.pngbin0 -> 18555 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/unperfectionremoved.1.pngbin0 -> 16497 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/vanallenbelt.1.pngbin0 -> 7993 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/vanallenbelt.2.pngbin0 -> 8025 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/verygoodcone.1.pngbin0 -> 13958 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/wwfpmp.1.pngbin0 -> 13535 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/xcmplaca2buraquads.1.pngbin0 -> 5147 bytes
-rw-r--r--graphics/metapost/contrib/macros/featpost/png/xraycamera.1.pngbin0 -> 14712 bytes
-rw-r--r--graphics/metapost/contrib/macros/fiziko/README19
-rw-r--r--graphics/metapost/contrib/macros/fiziko/fiziko.mp2163
-rw-r--r--graphics/metapost/contrib/macros/fiziko/fiziko.pdfbin0 -> 4559755 bytes
-rw-r--r--graphics/metapost/contrib/macros/fiziko/fiziko.tex841
-rw-r--r--graphics/metapost/contrib/macros/garrigues/README7
-rw-r--r--graphics/metapost/contrib/macros/garrigues/article.txt5
-rw-r--r--graphics/metapost/contrib/macros/garrigues/garrigues.mp1392
-rw-r--r--graphics/metapost/contrib/macros/hatching/README52
-rw-r--r--graphics/metapost/contrib/macros/hatching/hatching.mp64
-rw-r--r--graphics/metapost/contrib/macros/hatching/htchuse.mp55
-rw-r--r--graphics/metapost/contrib/macros/hatching/htchuse_.tex11
-rw-r--r--graphics/metapost/contrib/macros/latexmp/README12
-rw-r--r--graphics/metapost/contrib/macros/latexmp/doc/latexmp.pdfbin0 -> 174008 bytes
-rw-r--r--graphics/metapost/contrib/macros/latexmp/latexmp.mp459
-rw-r--r--graphics/metapost/contrib/macros/m3D/README52
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Danim.gifbin0 -> 974294 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dchair.1.jpgbin0 -> 13748 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Ddirect.jpgbin0 -> 25339 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dlego.gifbin0 -> 478673 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.1.jpgbin0 -> 6931 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.2.jpgbin0 -> 12525 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.3.jpgbin0 -> 6976 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.4.jpgbin0 -> 9455 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.5.jpgbin0 -> 5453 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.6.jpgbin0 -> 7348 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.7.jpgbin0 -> 4546 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.8.jpgbin0 -> 3637 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dpolyhedron.gifbin0 -> 879516 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/gallery/m3Dviviani.1.jpgbin0 -> 10415 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/manual/m3Dmanmac.tex1378
-rw-r--r--graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.mp244
-rw-r--r--graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.pdfbin0 -> 658285 bytes
-rw-r--r--graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.tex391
-rw-r--r--graphics/metapost/contrib/macros/m3D/mpinputs/m3Dlib01.mp543
-rw-r--r--graphics/metapost/contrib/macros/m3D/mpinputs/m3Dplain.mp1335
-rw-r--r--graphics/metapost/contrib/macros/m3D/mpinputs/m3Dsty01.mp76
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Danim.mp65
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dchair.mp174
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Ddirect.mp61
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dlego.mp302
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dpicts.mp225
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dpolyhedron.mp53
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dsimpletext.mp28
-rw-r--r--graphics/metapost/contrib/macros/m3D/trials/m3Dviviani.mp188
-rw-r--r--graphics/metapost/contrib/macros/makecirc/MakeCirc-en.pdfbin0 -> 259764 bytes
-rw-r--r--graphics/metapost/contrib/macros/makecirc/MakeCirc.pdfbin0 -> 241753 bytes
-rw-r--r--graphics/metapost/contrib/macros/makecirc/README17
-rw-r--r--graphics/metapost/contrib/macros/makecirc/ejemplos.mp307
-rw-r--r--graphics/metapost/contrib/macros/makecirc/ejemplos.pdfbin0 -> 62658 bytes
-rw-r--r--graphics/metapost/contrib/macros/makecirc/latex.mp246
-rw-r--r--graphics/metapost/contrib/macros/makecirc/makecirc.mp981
-rw-r--r--graphics/metapost/contrib/macros/matlab/Makefile22
-rw-r--r--graphics/metapost/contrib/macros/matlab/README36
-rw-r--r--graphics/metapost/contrib/macros/matlab/example.mp21
-rw-r--r--graphics/metapost/contrib/macros/matlab/latexmp.mp459
-rw-r--r--graphics/metapost/contrib/macros/matlab/lstmp.tex360
-rw-r--r--graphics/metapost/contrib/macros/matlab/matlab.mp430
-rw-r--r--graphics/metapost/contrib/macros/matlab/matlab.tex139
-rw-r--r--graphics/metapost/contrib/macros/matlab/sample_data20
-rw-r--r--graphics/metapost/contrib/macros/matlab/simple.mp23
-rw-r--r--graphics/metapost/contrib/macros/matlab/user_guide.pdfbin0 -> 56024 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/README51
-rw-r--r--graphics/metapost/contrib/macros/metago/example-program.mp19
-rw-r--r--graphics/metapost/contrib/macros/metago/example-program.pdfbin0 -> 13206 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-1.pdfbin0 -> 6735 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-2.pdfbin0 -> 6892 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-3.pdfbin0 -> 7025 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-4.pdfbin0 -> 7133 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-5.pdfbin0 -> 7282 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-6.pdfbin0 -> 7416 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-7.pdfbin0 -> 7551 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script-8.pdfbin0 -> 7560 bytes
-rw-r--r--graphics/metapost/contrib/macros/metago/example-script.mp5
-rw-r--r--graphics/metapost/contrib/macros/metago/metago.mp799
-rw-r--r--graphics/metapost/contrib/macros/metago/script.go8
-rw-r--r--graphics/metapost/contrib/macros/metaobj/README46
-rw-r--r--graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf23593
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/connections.mp512
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/mobjstandard.mp931
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/proofex.mp153
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/pstricksex1.mp311
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/pstricksex2.mp136
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/pstricksex3.mp127
-rw-r--r--graphics/metapost/contrib/macros/metaobj/examples/pstricksex4.mp25
-rw-r--r--graphics/metapost/contrib/macros/metaobj/inputs/metaobj.mp7710
-rw-r--r--graphics/metapost/contrib/macros/metaobj/license.txt9
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/README.md49
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-cmyk.mp1739
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-rgb.mp1739
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.mp45
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.pdfbin0 -> 21531 bytes
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.pngbin0 -> 229223 bytes
-rw-r--r--graphics/metapost/contrib/macros/metapost-colorbrewer/make_mp_colorbrewer.py148
-rw-r--r--graphics/metapost/contrib/macros/metauml/README19
-rw-r--r--graphics/metapost/contrib/macros/metauml/doc/metauml-manual-v0.2.6-19d34de3da75cbd9f814f0a9ec03b4e0861b1541.pdfbin0 -> 413691 bytes
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity.mp52
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity_diagrams.mp59
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/appetizer.mp203
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/boxes_vs_util.mp92
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class.mp134
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_association.mp72
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization.mp94
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization2.mp31
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_diagrams.mp212
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_templates.mp29
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/component.mp61
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/group.mp51
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/how-links-work.mp38
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/instance.mp9
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/mptextmp.mp1
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/note.mp74
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/object_stack.mp46
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/package.mp93
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths.mp132
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths_man.mp143
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_info.mp86
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_stack.mp44
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/positioning.mp139
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/properties.mp58
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/state.mp55
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/statemachine_diagrams.mp78
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_activity.mp46
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class.mp156
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_feature_types.mp53
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_qual_assoc.mp53
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_templates.mp62
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_component.mp30
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_font.mp81
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_group.mp60
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_instance.mp35
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lars_issues.mp94
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lowlevel.mp66
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_note.mp39
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_package.mp54
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_paths.mp100
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture.mp273
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_stack.mp130
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_tex_rendering.mp43
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_positioning.mp195
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins.mp26
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins_global_defaults.mp29
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_state.mp73
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_usecase.mp185
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase.mp43
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase_diagrams.mp48
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.bib64
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.tex2072
-rw-r--r--graphics/metapost/contrib/macros/metauml/examples/manual/test-suite.tex82
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml.mp66
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_activity.mp229
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_base.mp171
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_behavioral_common.mp214
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_class.mp485
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_class_assoc.mp93
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_class_relations.mp172
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_component.mp186
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_component_relations.mp55
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_defaults.mp31
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_instance.mp186
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_links.mp86
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_note.mp140
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_package.mp176
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_package_relations.mp37
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_paths.mp173
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_skin_simple.mp28
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_state.mp201
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_stereotype.mp25
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_templates.mp132
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase.mp215
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase_clipart.mp158
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_commons.mp137
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_group.mp181
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_infrastructure.mp56
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_log.mp31
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_margins.mp21
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_object.mp233
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_picture.mp285
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_picture_stack.mp153
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_positioning.mp242
-rw-r--r--graphics/metapost/contrib/macros/metauml/inputs/util_shade.mp53
-rw-r--r--graphics/metapost/contrib/macros/misc/closefrm.mp44
-rw-r--r--graphics/metapost/contrib/macros/misc/gpdata.mp62
-rw-r--r--graphics/metapost/contrib/macros/misc/interpol.mp89
-rw-r--r--graphics/metapost/contrib/macros/misc/testeq.mp79
-rw-r--r--graphics/metapost/contrib/macros/mp3d/README87
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/README23
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/gut2001.pdfbin0 -> 247845 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/paper1997corrected.pdfbin0 -> 138588 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.pdfbin0 -> 175795 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.ps19323
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/tb57roegel.ltx1149
-rw-r--r--graphics/metapost/contrib/macros/mp3d/doc/tugboat-geometry-space.pdfbin0 -> 263816 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube10.mp88
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube4-eng.mp124
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube5.mp86
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube6.mp94
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube7.mp133
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube8.mp48
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/cube9.mp66
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp1-eng.mp75
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp1.mp76
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp2-eng.mp90
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp2.mp91
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp3-eng.mp98
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp3.mp99
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp4-eng.mp112
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp4.mp113
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp5-eng.mp84
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp5.mp85
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp6-eng.mp100
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp6.mp101
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp7-eng.mp102
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp7.mp103
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp8-eng.mp120
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp8.mp121
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/gutmp9.mp63
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/monge-eng.mp148
-rw-r--r--graphics/metapost/contrib/macros/mp3d/examples/monge.mp149
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/3d.mp1259
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/3danim.mp269
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/3dgeom.mp931
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/3dpoly.mp294
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/3dutil.mp37
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/animpoly.mp35
-rw-r--r--graphics/metapost/contrib/macros/mp3d/inputs/create_animation.sh15
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/Changes139
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/README86
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/3d-1.0.mp1040
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/README22
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel.mp50
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel2.mp46
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/barre-arcenciel.gifbin0 -> 3652 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.gifbin0 -> 22570 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.log0
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.gifbin0 -> 31691 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.gifbin0 -> 30671 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.mp60
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.gifbin0 -> 33742 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.mp96
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel.gifbin0 -> 5631 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel2.gifbin0 -> 5853 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel.gifbin0 -> 5597 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel2.gifbin0 -> 5827 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayonmine.mp120
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/essai.gifbin0 -> 31538 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gifbin0 -> 6657 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif_oldbin0 -> 6657 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-g.gifbin0 -> 6609 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-d.gifbin0 -> 29839 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-g.gifbin0 -> 80963 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-1.gifbin0 -> 3193 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-2.gifbin0 -> 3379 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-3.gifbin0 -> 4658 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-4.gifbin0 -> 5631 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.gifbin0 -> 16652 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.gifbin0 -> 10150 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.gifbin0 -> 10187 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.gifbin0 -> 16848 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.mp43
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.dvibin0 -> 89956 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.log19
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.mp1040
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.ps3695
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.tex1257
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.1477
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.2497
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.3449
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.4497
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.5497
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/animpoly.mp32
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/cube.ps34
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/dodeca.ps80
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa-w.ps157
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa.ps100
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugbib.bst1154
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugboat.cls1105
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/makedoc.sh9
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2.mft146
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2mft.sed37
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/mpt85
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/octa.ps40
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.aux57
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bbl40
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bib71
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.blg0
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.dvibin0 -> 49796 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.log223
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.ps6074
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.tex1130
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.dvibin0 -> 23940 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.log18
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.mp274
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.ps1861
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.tex287
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/tetra.ps30
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.128
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.10102
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1144
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.12119
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1336
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1446
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1538
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.16150
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1796
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.253
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.355
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.432
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.532
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.658
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.735
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.8157
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.991
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.log5
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.mp350
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-dode.gifbin0 -> 73924 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico-octa.gifbin0 -> 155394 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico.gifbin0 -> 110561 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron.gifbin0 -> 41938 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron2.gifbin0 -> 42896 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron3.gifbin0 -> 43263 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron4.gifbin0 -> 79589 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron5.gifbin0 -> 35047 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron6.gifbin0 -> 87535 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron7.gifbin0 -> 50916 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron8.gifbin0 -> 58703 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron9.gifbin0 -> 56454 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/examples/icosahedron-small.gifbin0 -> 27191 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/inputs/3d-1.0.mp1040
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/inputs/animpoly.mp32
-rw-r--r--graphics/metapost/contrib/macros/mp3d/v1.0/inputs/poly.mp274
-rw-r--r--graphics/metapost/contrib/macros/mparrows/LICENSE674
-rw-r--r--graphics/metapost/contrib/macros/mparrows/README21
-rw-r--r--graphics/metapost/contrib/macros/mparrows/mparrows.mp170
-rw-r--r--graphics/metapost/contrib/macros/mparrows/mparrows.pdfbin0 -> 99966 bytes
-rw-r--r--graphics/metapost/contrib/macros/mparrows/mparrows.tex282
-rw-r--r--graphics/metapost/contrib/macros/mparrows/mparrowsexamples.mp90
-rw-r--r--graphics/metapost/contrib/macros/mpattern/README129
-rw-r--r--graphics/metapost/contrib/macros/mpattern/README.PL133
-rw-r--r--graphics/metapost/contrib/macros/mpattern/mpattern.mp287
-rw-r--r--graphics/metapost/contrib/macros/mpattern/mpattern_test.pdfbin0 -> 13956 bytes
-rw-r--r--graphics/metapost/contrib/macros/mpattern/mpattern_test.ps1249
-rw-r--r--graphics/metapost/contrib/macros/mpattern/mpattern_test.tex22
-rw-r--r--graphics/metapost/contrib/macros/mpattern/test.mp146
l---------graphics/metapost/contrib/macros/mpcolornames/README1
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/CHANGES35
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/LICENSE14
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/README20
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/expl-array-index.mp13
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/fig-clash-svg-dvips.mp21
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.pdfbin0 -> 100188 bytes
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.tex359
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-mpcolornames.mp28
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-dvipsnam-def.mp74
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-plain-mp.mp10
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-svgnam-def.mp156
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-x11nam-def.mp322
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-xcolor-sty.mp64
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-clash-svg-dvips.tex50
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-dvipsnam-def.tex79
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-plain-mp.tex16
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-svgnam-def.tex162
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-x11nam-def.tex328
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-xcolor-sty.tex34
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-dvipsnam-def.mp148
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-plain-mp.mp22
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-svgnam-def.mp314
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-x11nam-def.mp409
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-xcolor-sty.mp128
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames.mp60
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/Makefile76
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-dvipsnam-def.awk72
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-plain-mp.awk72
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-svgnam-def.awk70
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-x11nam-def.awk81
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-xcolor-sty.awk130
-rw-r--r--graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/tab-clash-svg-dvips.awk40
-rw-r--r--graphics/metapost/contrib/macros/mptrees/README.md8
-rw-r--r--graphics/metapost/contrib/macros/mptrees/mptrees-doc.pdfbin0 -> 429600 bytes
-rw-r--r--graphics/metapost/contrib/macros/mptrees/mptrees-doc.tex717
-rw-r--r--graphics/metapost/contrib/macros/mptrees/mptrees.mp469
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/INSTALL20
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/LEGAL104
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/README17
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.mp146
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.pdfbin0 -> 32908 bytes
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/examples/wec.mp122
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/examples/wec.pdfbin0 -> 8824 bytes
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/examples/worldmap.jpgbin0 -> 23616 bytes
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/piechartmp.mp1108
-rw-r--r--graphics/metapost/contrib/macros/piechartmp/piechartmp.pdfbin0 -> 316716 bytes
-rw-r--r--graphics/metapost/contrib/macros/repere/README.md13
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.pdfbin0 -> 479044 bytes
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.tex1949
-rw-r--r--graphics/metapost/contrib/macros/repere/repere.mp2919
-rw-r--r--graphics/metapost/contrib/macros/roundrect/CHANGES19
-rw-r--r--graphics/metapost/contrib/macros/roundrect/README24
-rw-r--r--graphics/metapost/contrib/macros/roundrect/lppl.txt416
-rw-r--r--graphics/metapost/contrib/macros/roundrect/roundrect.dtx737
-rw-r--r--graphics/metapost/contrib/macros/roundrect/roundrect.ins69
-rw-r--r--graphics/metapost/contrib/macros/roundrect/roundrect.pdfbin0 -> 277781 bytes
-rw-r--r--graphics/metapost/contrib/macros/shapes/CHANGES6
-rw-r--r--graphics/metapost/contrib/macros/shapes/README25
-rw-r--r--graphics/metapost/contrib/macros/shapes/lppl.txt416
-rw-r--r--graphics/metapost/contrib/macros/shapes/shapes.dtx471
-rw-r--r--graphics/metapost/contrib/macros/shapes/shapes.ins69
-rw-r--r--graphics/metapost/contrib/macros/shapes/shapes.pdfbin0 -> 176460 bytes
-rw-r--r--graphics/metapost/contrib/macros/slideshow/pathalong.mp53
-rw-r--r--graphics/metapost/contrib/macros/slideshow/slideshow.mp387
-rw-r--r--graphics/metapost/contrib/macros/slideshow/slideshow.txt431
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex.mp42
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex.pdfbin0 -> 15013 bytes
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex2.mp36
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex2.pdfbin0 -> 28962 bytes
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex3.mp23
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowex3.pdfbin0 -> 8153 bytes
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowintro.mp206
-rw-r--r--graphics/metapost/contrib/macros/slideshow/sshowintro.pdfbin0 -> 92201 bytes
-rw-r--r--graphics/metapost/contrib/macros/splines/README44
-rw-r--r--graphics/metapost/contrib/macros/splines/splines.dtx393
-rw-r--r--graphics/metapost/contrib/macros/splines/splines.ins48
-rw-r--r--graphics/metapost/contrib/macros/splines/splines.pdfbin0 -> 103753 bytes
-rw-r--r--graphics/metapost/contrib/macros/splines/testsplines.mp122
-rw-r--r--graphics/metapost/contrib/macros/suanpan/README6
-rw-r--r--graphics/metapost/contrib/macros/suanpan/abacus.mp138
-rw-r--r--graphics/metapost/contrib/macros/suanpan/article.txt5
-rw-r--r--graphics/metapost/contrib/macros/suanpan/suanpan.mp501
-rw-r--r--graphics/metapost/contrib/macros/tableauvariations/README1
-rw-r--r--graphics/metapost/contrib/macros/tableauvariations/copyright12
-rw-r--r--graphics/metapost/contrib/macros/tableauvariations/doc_fr.pdfbin0 -> 46007 bytes
-rw-r--r--graphics/metapost/contrib/macros/tableauvariations/exemples.mp166
-rw-r--r--graphics/metapost/contrib/macros/tableauvariations/tableauVariation.mp368
-rw-r--r--graphics/metapost/contrib/macros/textpath/CHANGES12
-rw-r--r--graphics/metapost/contrib/macros/textpath/README41
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpath.mp454
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpath.pdfbin0 -> 253738 bytes
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpath.tex601
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpathfigs.mp263
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpathfigs.tex12
-rw-r--r--graphics/metapost/contrib/macros/textpath/textpathmp.sty14
-rw-r--r--graphics/metapost/contrib/macros/threeddice/README39
-rw-r--r--graphics/metapost/contrib/macros/threeddice/threeddice-doc.pdfbin0 -> 116376 bytes
-rw-r--r--graphics/metapost/contrib/macros/threeddice/threeddice-doc.tex139
-rw-r--r--graphics/metapost/contrib/macros/threeddice/threeddice.mp261
-rw-r--r--graphics/metapost/contrib/macros/truchet/README37
-rw-r--r--graphics/metapost/contrib/macros/truchet/README.french28
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.1101
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.2293
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.3130
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.4312
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.51806
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.dvibin0 -> 2268 bytes
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.mp49
-rw-r--r--graphics/metapost/contrib/macros/truchet/example.tex53
-rw-r--r--graphics/metapost/contrib/macros/truchet/mproof.dvibin0 -> 336 bytes
-rw-r--r--graphics/metapost/contrib/macros/truchet/mproof.ps1966
-rw-r--r--graphics/metapost/contrib/macros/truchet/plain.mft27
-rw-r--r--graphics/metapost/contrib/macros/truchet/readme.pdfbin0 -> 50071 bytes
-rw-r--r--graphics/metapost/contrib/macros/truchet/readme.tex120
-rw-r--r--graphics/metapost/contrib/macros/truchet/test.dvibin0 -> 636 bytes
-rw-r--r--graphics/metapost/contrib/macros/truchet/test.ps2771
-rw-r--r--graphics/metapost/contrib/macros/truchet/test.tex13
-rw-r--r--graphics/metapost/contrib/macros/truchet/tiling.dvibin0 -> 27576 bytes
-rw-r--r--graphics/metapost/contrib/macros/truchet/tiling.mp471
-rw-r--r--graphics/metapost/contrib/macros/truchet/tiling.tex609
-rw-r--r--graphics/metapost/contrib/macros/txp/DOCUMENT.pdfbin0 -> 137989 bytes
-rw-r--r--graphics/metapost/contrib/macros/txp/README.txt18
-rw-r--r--graphics/metapost/contrib/macros/txp/example.mp50
-rw-r--r--graphics/metapost/contrib/macros/txp/example.ps938
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fcmr10228
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fphvb8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fphvbo8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fphvr8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fphvro8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fpplb8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fpplbo8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fpplr8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fpplri8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fptmb8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fptmbi8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fptmr8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fptmri8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/fontdata/fpzcmi8r229
-rw-r--r--graphics/metapost/contrib/macros/txp/gentyp.awk5
-rw-r--r--graphics/metapost/contrib/macros/txp/txp.mp25
-rw-r--r--graphics/metapost/contrib/macros/venn/README19
-rw-r--r--graphics/metapost/contrib/macros/venn/venn.mp218
-rw-r--r--graphics/metapost/contrib/misc/mp.mft62
-rw-r--r--graphics/metapost/contrib/misc/mp2.mft146
-rw-r--r--graphics/metapost/contrib/misc/mp2mft.sed37
-rw-r--r--graphics/metapost/contrib/misc/mpt85
-rw-r--r--graphics/metapost/contrib/tools/MPEdit/Readme.txt38
-rw-r--r--graphics/metapost/contrib/tools/mpstoeps/README15
-rw-r--r--graphics/metapost/contrib/tools/mpstoeps/mpstoeps121
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/scripts/context/perl/mptopdf.pl154
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mis.mkii733
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mpe.mkii1370
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-pdf.mkii2187
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/tex/context/base/syst-tex.mkii314
-rw-r--r--graphics/metapost/contrib/tools/mptopdf/tex/generic/context/mptopdf.tex176
l---------graphics/metapost/tools1
1493 files changed, 249675 insertions, 0 deletions
diff --git a/graphics/metapost/contrib/macros/3d b/graphics/metapost/contrib/macros/3d
new file mode 120000
index 0000000000..c4b0a8837e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/3d
@@ -0,0 +1 @@
+mp3d \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/automata/README b/graphics/metapost/contrib/macros/automata/README
new file mode 100644
index 0000000000..ee2805fc3c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/automata/README
@@ -0,0 +1,41 @@
+AUTOMATA.MP - version 0.3
+
+This package is a collection of macros for METAPOST to
+make easier to draw finite-state machines, automata,
+labeled graphs, etc. Nodes can be either isolated or
+arranged into matrices or trees; edges connect pairs
+of nodes through arbitrary paths. Some parameters can
+be specified to define different shapes for nodes and/or
+different styles for the edges.
+
+The archive consists of the following files:
+
+- README This file
+
+- automata.mp This file defines the macros. It should
+ be included in a main .mp file by using the directive
+ input automata;
+
+- example.mp This is a short example of an .mp file
+ that produces a finite-state automaton
+ (it should be compiled with metapost using
+ mp -tex=latex example.mp
+ and it should produce a PS file named example.0)
+
+- example.0 This is the PS file generated from
+ example.mp
+
+- example.tex This shows how to include MetaPost
+ figures in a LaTeX document
+
+- example.pdf This is the PDF file generated from
+ example.tex
+
+
+The material is subject to the LaTeX Project Public
+License and it can be downloaded from the web page
+ http://users.dimi.uniud.it/~gabriele.puppis
+by following the link "Other links".
+
+
+Gabriele Puppis - gabriele.puppis@gmail.com
diff --git a/graphics/metapost/contrib/macros/automata/automata.mp b/graphics/metapost/contrib/macros/automata/automata.mp
new file mode 100644
index 0000000000..f3e1e24c4e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/automata/automata.mp
@@ -0,0 +1,787 @@
+% PACKAGE FOR METAPOST TO DRAW FINITE STATE MACHINES, GRAPHS, TREES, ETC.
+% Author: gabriele puppis
+
+% declares a grid of equally-spaced nodes
+%
+% syntax: matrix.<name>(<#rows>,<#cols>);
+%
+% example: matrix.a(2,3);
+%
+% parameters: spacing = (60,30) | ...
+% offset = (0,0) | ...
+% numbering = (0,0) | ...
+%
+% (nodes are identified by <name>[<row>][<col>],
+% <name> can't be c,h,x,y or any other global variable,
+% the center/anchor of a node is <name>[<row>][<col>].c/.h,
+% <row> and <col> start from 0,
+% so <name>[0][0] is the top left-most node,
+% <name>[<#rows>-1][<#cols>-1] is the bottom right-most node)
+vardef matrix@# expr d =
+ pair @#[][].c;
+ pair @#[][].h;
+ pair @#[][].s;
+ path @#[][].f;
+ numeric @#[][].m;
+
+ for i=0 upto xpart(d)-1:
+ for j=0 upto ypart(d)-1:
+ @#[xpart(numbering)+i][ypart(numbering)+j].c :=
+ (xpart(spacing)*j,-ypart(spacing)*i) shifted offset;
+ endfor;
+ endfor;
+enddef;
+
+
+% declares a tree-shaped arrangement of nodes
+%
+% syntax: tree.<name>(<#levels>,<arity>);
+%
+% example: tree.a(4,2);
+%
+% parameters: spacing = (60,30) | ...
+% offset = (0,0) | ...
+% numbering = (0,0) | ...
+%
+% (nodes are identified by <name>[<depth>][<child>],
+% <name> can't be c,h,x,y or any other global variable,
+% the center/anchor of a node is <name>[<depth>][<child>].c/.h,
+% <depth> and <child> start from 0,
+% so <name>[0][0] is the root,
+% <name>[1][0] ... <name>[1][<arity>-1] are the children of the root,
+% and so on)
+vardef tree@# expr d =
+ pair @#[][].c;
+ pair @#[][].h;
+ pair @#[][].s;
+ path @#[][].f;
+ numeric @#[][].m;
+
+ for i=0 upto xpart(d)-1:
+ for j=0 upto (ypart(d)**i) - 1:
+ @#[xpart(numbering)+i][ypart(numbering)+j].c =
+ (xpart(spacing) * ((j+0.5)*(ypart(d)**(xpart(d)-i)) - 0.5*(ypart(d)**xpart(d))),
+ -ypart(spacing) * i) shifted offset;
+ endfor;
+ endfor;
+enddef;
+
+
+% declares a single node
+%
+% syntax: put.<name>(x,y);
+%
+% example: put.a(100,100);
+%
+% (the center/anchor of a node is <name>.c/.h,
+% <name> can't be c,h,x,y or any other global variable)
+vardef put@# expr p =
+ pair @#.c;
+ pair @#.h;
+ pair @#.s;
+ path @#.f;
+ numeric @#.m;
+
+ @#.c := p;
+enddef;
+
+
+% declares an additional single node inside an existing matrix or tree
+% (or change the position of an existing node)
+%
+% syntax: setpos.<name>[<row>][<col>](x,y);
+%
+% example: setpos.a[0][0](100,100);
+%
+% (the center/anchor of a node is <name>[<row>][<col>].c/.h)
+vardef setpos@# expr p =
+ @#.c := p;
+enddef;
+
+
+% change the position of an existing node
+%
+% syntax: movepos.<name>(x,y);
+%
+% example: movepos.a(10,10);
+% movepos.b[0][0](10,10);
+vardef movepos@# expr p =
+ @#.c := @#.c shifted p;
+ @#.h := @#.h shifted p;
+enddef;
+
+
+% draws an existing node
+%
+% syntax: node.<node> <label>;
+%
+% example: node.a[0][0] btex $\alpha$ etex;
+%
+% parameters: size = 7 | ...
+% nodemargin = 1.5 | ...
+% shape = circle | utriangle | ltriangle | btriangle | rtriangle |
+% boxed | fixedbox | roundbox | roundfixedbox | diamond | none
+% boxmargin = 5 | ...
+% fixedboxwidth = 14 | ...
+% fixedboxheight = 14 | ...
+% border = solid | bold | dash | double | none
+% bordercolor = black | white | ...
+% filling = none | solid | lefthalf | righthalf
+% fillingcolor = black | white | ...
+% nodelabel = yes | no
+% nodelabelcolor = black | white | ...
+% solidsize = 0.9 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+% doublesize = 0.75 | ...
+vardef node@#(expr l) =
+ save pic,fs,fm;
+ picture pic; pic := thelabel(l, (0,0));
+ pair fs;
+ numeric fm;
+
+ if (shape=circle):
+ @#.s := (size,size);
+ @#.f := circlepath;
+ @#.h := @#.c;
+ fs := (size,size);
+ fm := 0;
+ elseif (shape=utriangle):
+ @#.s := (size+solidsize,size+solidsize);
+ @#.f := utrianglepath;
+ @#.h := @#.c shifted (0,0.5ypart(@#.s));
+ fs = (size,size);
+ fm := 4solidsize;
+ elseif (shape=ltriangle):
+ @#.s := (size+solidsize,size+solidsize);
+ @#.f := ltrianglepath;
+ @#.h := @#.c shifted (-0.5xpart(@#.s),0);
+ fs = (size,size);
+ fm := 4solidsize;
+ elseif (shape=btriangle):
+ @#.s := (size+solidsize,size+solidsize);
+ @#.f := btrianglepath;
+ @#.h := @#.c shifted (0,-0.5ypart(@#.s));
+ fs = (size,size);
+ fm := 4solidsize;
+ elseif (shape=rtriangle):
+ @#.s := (size+solidsize,size+solidsize);
+ @#.f := rtrianglepath;
+ @#.h := @#.c shifted (0.5xpart(@#.s),0);
+ fs := (size,size);
+ fm := 4solidsize;
+ elseif (shape=boxed):
+ @#.s := urcorner pic - llcorner pic + (boxmargin,boxmargin);
+ @#.f := squarepath;
+ @#.h := @#.c;
+ fs := @#.s;
+ fm := 0;
+ elseif (shape=fixedbox):
+ @#.s := (fixedboxwidth,fixedboxheight);
+ @#.f := squarepath;
+ @#.h := @#.c;
+ fs := @#.s;
+ fm := 0;
+ elseif (shape=roundbox):
+ @#.s := urcorner pic - llcorner pic;
+ @#.f := rrectangle(xpart(@#.s),ypart(@#.s));
+ @#.h := @#.c;
+ fs := @#.s;
+ fm := 0;
+ elseif (shape=roundfixedbox):
+ @#.s := (fixedboxwidth,fixedboxheight);
+ @#.f := rrectangle(xpart(@#.s),ypart(@#.s));
+ @#.h := @#.c;
+ fs := @#.s;
+ fm := 0;
+ elseif (shape=diamond):
+ @#.s := (size,size);
+ @#.f := diamondpath;
+ @#.h := @#.c;
+ fs := (size,size);
+ fm := 0;
+ elseif (shape=none):
+ @#.s := (0,0);
+ @#.f := (0,0)..(0,0);
+ @#.h := @#.c;
+ @#.m := 0;
+ fs := (0,0);
+ fm := 0;
+ else:
+ errmessage("Node shape not defined");
+ fi
+
+ if (shape<>none):
+
+ if (filling=solid):
+ if (border=double):
+ fill @#.f xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize)
+ shifted @#.c withcolor fillingcolor;
+ else:
+ fill @#.f xscaled xpart(fs) yscaled ypart(fs)
+ shifted @#.c withcolor fillingcolor;
+ fi
+ elseif (filling=lefthalf):
+ if (border=double):
+ fill buildcycle(@#.f,(0,-1)--(0,1))
+ xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize)
+ shifted @#.c withcolor fillingcolor;
+ else:
+ fill buildcycle(@#.f,(0,-1)--(0,1))
+ xscaled xpart(fs) yscaled ypart(fs)
+ shifted @#.c withcolor fillingcolor;
+ fi
+ elseif (filling=righthalf):
+ if (border=double):
+ fill buildcycle(@#.f,(0,-1)--(0,1)) rotated 180
+ xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize)
+ shifted @#.c withcolor fillingcolor;
+ else:
+ fill buildcycle(@#.f,(0,-1)--(0,1)) rotated 180
+ xscaled xpart(fs) yscaled ypart(fs)
+ shifted @#.c withcolor fillingcolor;
+ fi
+ fi
+
+ if (border=solid):
+ @#.m := nodemargin * solidsize + fm;
+ draw @#.f xscaled xpart(fs) yscaled ypart(fs) shifted @#.c
+ withpen pencircle scaled solidsize withcolor bordercolor;
+ elseif (border=bold):
+ @#.m := nodemargin * boldsize + fm;
+ draw @#.f xscaled xpart(fs) yscaled ypart(fs) shifted @#.c
+ withpen pencircle scaled boldsize withcolor bordercolor;
+ elseif (border=dash):
+ @#.m := nodemargin * solidsize + fm;
+ draw @#.f xscaled xpart(fs) yscaled ypart(fs) shifted @#.c
+ withpen pencircle scaled solidsize dashed evenly scaled dashsize withcolor bordercolor;
+ elseif (border=double):
+ @#.m := nodemargin * solidsize + fm;
+ draw @#.f xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize) shifted @#.c
+ withpen pencircle scaled solidsize withcolor bordercolor;
+ draw @#.f xscaled xpart(fs) yscaled ypart(fs) shifted @#.c
+ withpen pencircle scaled solidsize withcolor bordercolor;
+ elseif (border=none):
+ @#.m := nodemargin;
+ else:
+ errmessage("Node border not defined");
+ fi
+
+ fi
+
+ if (nodelabel=yes):
+ if ((urcorner pic - llcorner pic) <> (0,0)):
+ label(l, @#.c) withcolor nodelabelcolor;
+ fi
+ fi
+enddef;
+
+
+% draws an arrow between two nodes and labels it
+%
+% syntax: arrow.<labelpos>(<labeloff>,<label>)(<node>,<node>) <path>;
+% where <labelpos> = lft | rt | top | bot | ulft | urt | llft | lrt
+% <labeloff> is between 0.0 and 1.0
+% <node> is a node
+% <path> is a path
+%
+% example: arrow.top(0.5, btex $a$ etex)(a[0][0],a[0][1]) a[0][0].c{dir90}..a[0][1].c;
+%
+% parameters: style = solid | bold | dash | bolddash | invisible
+% arrowcolor = black | white | ...
+% arrowlabel = yes | no
+% unfillonarrowlabel = yes | no
+% unfillcolor = white | black | ...
+% arrowlabelcolor = black | white | ...
+% tipangle = 25 | ...;
+% tipsharpness = 10 | ...;
+% tipsize = 4 | ...;
+% arrowmargin = 1.5 | ...
+% solidsize = 0.9 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef arrow@#(expr o,l)(suffix a,b) expr p =
+ save cutp;
+ path cutp;
+ if ((style=bold) or (style=bolddash)):
+ cutp := (p) cutbefore (a.f xscaled xpart(a.s) yscaled ypart(a.s) shifted a.c)
+ cutafter (b.f xscaled (xpart(b.s)+b.m+arrowmargin*boldsize)
+ yscaled (ypart(b.s)+b.m+arrowmargin*boldsize) shifted b.c);
+ else:
+ cutp := (p) cutbefore (a.f xscaled xpart(a.s) yscaled ypart(a.s) shifted a.c)
+ cutafter (b.f xscaled (xpart(b.s)+b.m+arrowmargin*solidsize)
+ yscaled (ypart(b.s)+b.m+arrowmargin*solidsize) shifted b.c);
+ fi
+
+ save endpoint,endpointdir,pathtotip,tippoint,tipa,tipb,tip;
+ pair endpoint; endpoint := point length(cutp) of cutp;
+ pair endpointdir; endpointdir := unitvector(direction length(cutp) of cutp);
+ path pathtotip; pathtotip := cutp cutafter (circlepath scaled 2tipsize shifted endpoint);
+ pair tippoint; tippoint := point length(pathtotip) of pathtotip;
+ path tipa; tipa := endpoint{-endpointdir rotated tipsharpness}..
+ (endpoint - ((endpoint-tippoint) rotated tipangle));
+ path tipb; tipb := endpoint{-endpointdir rotated -tipsharpness}..
+ (endpoint - ((endpoint-tippoint) rotated -tipangle));
+ path tip;
+ if ((style=bold) or (style=bolddash)):
+ tip := reverse(tipa)--tipb--cycle;
+ else:
+ tip := tipa--reverse(tipa)--tipb--reverse(tipb)--cycle;
+ fi
+
+ if (style=solid):
+ draw cutp withpen pencircle scaled solidsize withcolor arrowcolor;
+ draw tip withpen pencircle scaled solidsize withcolor arrowcolor;
+ elseif (style=bold):
+ draw cutp withpen pencircle scaled boldsize withcolor arrowcolor;
+ draw tip withpen pencircle scaled boldsize withcolor arrowcolor;
+ elseif (style=dash):
+ draw cutp withpen pencircle scaled solidsize dashed evenly scaled dashsize withcolor arrowcolor;
+ draw tip withpen pencircle scaled solidsize withcolor arrowcolor;
+ elseif (style=bolddash):
+ draw cutp withpen pencircle scaled boldsize dashed evenly scaled dashsize withcolor arrowcolor;
+ draw tip withpen pencircle scaled boldsize withcolor arrowcolor;
+ elseif (style=invisible):
+ else:
+ errmessage("Arrow style not defined");
+ fi
+
+ if (arrowlabel=yes):
+ save lab;
+ picture lab;
+ lab := thelabel.@#(l, point o*length(cutp) of cutp);
+ if (unfillonarrowlabel=yes):
+ fill (bbox lab) withcolor unfillcolor;
+ fi
+ draw lab withcolor arrowlabelcolor;
+ %label.@#(l, point o*length(cutp) of cutp) withcolor arrowlabelcolor;
+ fi
+enddef;
+
+
+% draws an arrow looping around a node and labels it
+%
+% syntax: loop.<labelpos>(<labeloff>,<label>)(<node>) <dir>;
+% where <labelpos> = lft | rt | top | bot | ulft | urt | llft | lrt
+% <labeloff> is between 0.0 and 1.0
+% <node> is a node
+% <dir> is an angle
+%
+% example: loop.top(0.5, btex $a$ etex)(a[0][0]) 90;
+%
+% parameters: loopsize = 15 | ...
+% looporientation = counterclockwiseorientation | clockwiseorientation
+% style = solid | bold | dash | bolddash | invisible
+% arrowcolor = black | white | ...
+% arrowlabel = yes | no
+% tipangle = 25 | ...;
+% tipsharpness = 10 | ...;
+% tipsize = 4 | ...;
+% arrowmargin = 1.5 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef loop@#(expr o,l)(suffix a) expr d =
+ save p;
+ path p;
+ if (looporientation=clockwiseorientation):
+ p := (-0.5*loopsize,0)..(0,0.5*loopsize)..(0.5*loopsize,0)..(0,-0.5*loopsize)..cycle;
+ elseif (looporientation=counterclockwiseorientation):
+ p := (-0.5*loopsize,0)..(0,-0.5*loopsize)..(0.5*loopsize,0)..(0,0.5*loopsize)..cycle;
+ else:
+ errmessage("Loop orientation not defined");
+ fi
+ arrow.@#(o,l)(a,a) (p shifted (0.6*loopsize,0) rotated d shifted a.c)
+enddef;
+
+
+% draws an arrow reaching a node and labels it
+%
+% syntax: incoming.<labelpos>(<labeloff>,<label>)(<node>) <dir>;
+% where <labelpos> = lft | rt | top | bot | ulft | urt | llft | lrt
+% <labeloff> is between 0.0 and 1.0
+% <node> is a node
+% <dir> is an angle
+%
+% example: incoming.lft(0.5, btex $a$ etex)(a[0][0]) 90;
+%
+% parameters: incominglength = 20 | ...
+% style = solid | bold | dash | bolddash
+% arrowcolor = black | white | ...
+% arrowlabel = yes | no
+% tipangle = 25 | ...;
+% tipsharpness = 10 | ...;
+% tipsize = 4 | ...;
+% arrowmargin = 1 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef incoming@#(expr o,l)(suffix a) expr d =
+ save incoming_a;
+ put.incoming_a ((incominglength,0) rotated d shifted a.c);
+ node_marker.incoming_a("");
+
+ arrow.@#(o,l)(incoming_a,a) incoming_a.c--a.c;
+enddef;
+
+
+% draws an arrow departing from a node and labels it
+%
+% syntax: outgoing.<labelpos>(<labeloff>,<label>)(<node>) <dir>;
+% where <labelpos> = lft | rt | top | bot | ulft | urt | llft | lrt
+% <labeloff> is between 0.0 and 1.0
+% <node> is a node
+% <dir> is an angle
+%
+% example: outgoing.lft(0.5, btex $a$ etex)(a[0][0]) 90;
+%
+% parameters: outgoinglength = 20 | ...
+% style = solid | bold | dash | bolddash
+% arrowcolor = black | white | ...
+% arrowlabel = yes | no
+% tipangle = 25 | ...;
+% tipsharpness = 10 | ...;
+% tipsize = 4 | ...;
+% arrowmargin = 1 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef outgoing@#(expr o,l)(suffix a) expr d =
+ save outgoing_a;
+ put.outgoing_a ((outgoinglength,0) rotated d shifted a.c);
+ node_marker.outgoing_a("");
+
+ arrow.@#(o,l)(a,outgoing_a) a.c--outgoing_a.c;
+enddef;
+
+
+% this function can be used to enclose a sequence of points inside a bounding area
+%
+% syntax: enclose <path>;
+% where <path> is a closed path, whose points are listed in clockwise order
+%
+% example: enclose a[0][0].c--a[0][1].c--a[1][1].c--cycle;
+%
+% parameters: style = solid | bold | dash | bolddash
+% enclosurecolor = black | white | ...
+% enclosuremargin = 5 | ...
+% solidsize = 0.9 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef enclose expr p =
+ if (style=solid):
+ draw enclosure(p) withpen pencircle scaled solidsize withcolor enclosurecolor;
+ elseif (style=bold):
+ draw enclosure(p) withpen pencircle scaled boldsize withcolor enclosurecolor;
+ elseif (style=dash):
+ draw enclosure(p) withpen pencircle scaled solidsize dashed evenly scaled dashsize withcolor enclosurecolor;
+ elseif (style=bolddash):
+ draw enclosure(p) withpen pencircle scaled boldsize dashed evenly scaled dashsize withcolor enclosurecolor;
+ else:
+ errmessage("Arrow style not defined");
+ fi
+enddef;
+
+
+% shorthand macros
+def node_circle = with shape(circle) node enddef;
+def node_utriangle = with shape(utriangle) node enddef;
+def node_ltriangle = with shape(ltriangle) node enddef;
+def node_dtriangle = with shape(dtriangle) node enddef;
+def node_rtriangle = with shape(rtriangle) node enddef;
+def node_diamond = with shape(diamond) node enddef;
+def node_unfilled = with filling(none) node enddef;
+def node_filled = with filling(solid) node enddef;
+def node_filledleft = with filling(lefthalf) node enddef;
+def node_filledright = with filling(righthalf) node enddef;
+def node_solid = with border(solid) node enddef;
+def node_bold = with border(bold) node enddef;
+def node_dash = with border(dash) node enddef;
+def node_double = with border(double) node enddef;
+def node_hidden = with border(none) node enddef;
+def node_boxed = with shape(boxed) node enddef;
+def node_fixed = with shape(fixedbox) node enddef;
+def node_roundbox = with shape(roundbox) node enddef;
+def node_roundfixed = with shape(roundfixedbox) node enddef;
+def node_marker = with shape(none) node enddef;
+def arrow_solid = with style(solid) arrow enddef;
+def arrow_bold = with style(bold) arrow enddef;
+def arrow_dash = with style(dash) arrow enddef;
+def arrow_bolddash = with style(bolddash) arrow enddef;
+def arrow_invisible = with style(invisible) arrow enddef;
+def loop_solid = with style(solid) loop enddef;
+def loop_bold = with style(bold) loop enddef;
+def loop_dash = with style(dash) loop enddef;
+def loop_bolddash = with style(bolddash) loop enddef;
+def loop_invisible = with style(invisible) loop enddef;
+def loop_cw = with looporientation(clockwiseorientation) loop enddef;
+def loop_ccw = with looporientation(counterclockwiseorientation) loop enddef;
+def incoming_solid = with style(solid) incoming enddef;
+def incoming_bold = with style(bold) incoming enddef;
+def incoming_dash = with style(dash) incoming enddef;
+def incoming_bolddash = with style(bolddash) incoming enddef;
+def incoming_invisible = with style(invisible) incoming enddef;
+def outgoing_solid = with style(solid) outgoing enddef;
+def outgoing_bold = with style(bold) outgoing enddef;
+def outgoing_dash = with style(dash) outgoing enddef;
+def outgoing_bolddash = with style(bolddash) outgoing enddef;
+def outgoing_invisible = with style(invisible) outgoing enddef;
+def enclose_solid = with style(solid) enclose enddef;
+def enclose_bold = with style(bold) enclose enddef;
+def enclose_dash = with style(dash) enclose enddef;
+def enclose_bolddash = with style(bolddash) enclose enddef;
+def enclose_thin = with style(dash) dashsize(0.5) enclose enddef;
+% e.g. with fillingcolor(black) node ...
+vardef with@#(expr v) text e = push.@#; @# := v; e; pop.@# enddef;
+% e.g. light.gray, light.light.gray, ...
+vardef dark@# = 0.5[@#,black] enddef;
+vardef light@# = 0.5[white,@#] enddef;
+def gray = dark.white enddef;
+% e.g. push fillingcolor; fillingcolor := gray; ... pop fillingcolor;
+vardef push@# = @#.back[@#.count] := @#; @#.count := @#.count + 1 enddef;
+vardef pop@# = @#.count := @#.count - 1; @# := @#.back[@#.count] enddef;
+
+
+% default paths
+def circlepath = ((0.5,0)..(0,0.5)..(-0.5,0)..(0,-0.5)..cycle) enddef;
+def trianglepath = ((0.433,-0.25)--(0,0.5)--(-0.433,-0.25)--cycle) enddef;
+def utrianglepath = trianglepath enddef;
+def ltrianglepath = (trianglepath rotated 90) enddef;
+def btrianglepath = (trianglepath rotated 180) enddef;
+def rtrianglepath = (trianglepath rotated 270) enddef;
+def squarepath = ((0.5,-0.5)--(-0.5,-0.5)--(-0.5,0.5)--(0.5,0.5)--cycle) enddef;
+def diamondpath = ((0.5,0)--(0,0.5)--(-0.5,0)--(0,-0.5)--cycle) enddef;
+def urdiamondpath = ((0,0.5)--(0.5,0)--(0,0)--cycle) enddef;
+def uldiamondpath = ((-0.5,0)--(0,0.5)--(0,0)--cycle) enddef;
+def lrdiamondpath = ((0.5,0)--(0,-0.5)--(0,0)--cycle) enddef;
+def lldiamondpath = ((0,0)--(0,-0.5)--(-0.5,0)--cycle) enddef;
+vardef rrectangle(expr w,h) = (((0.5w-0.25h,-0.5h)---(-0.5w+0.25h,-0.5h)..
+ (-0.5w+0.25h,0.5h)---(0.5w-0.25h,0.5h)..cycle)
+ xscaled (1/w) yscaled (1/h)) enddef;
+vardef sqr(expr x) = ((x)*(x)) enddef;
+vardef firstenclosurepoint(expr p,q) = ((ypart(p)-ypart(q)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + xpart(p),
+ (xpart(q)-xpart(p)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + ypart(p)) enddef;
+vardef secondenclosurepoint(expr p,q) = ((ypart(p)-ypart(q)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + xpart(q),
+ (xpart(q)-xpart(p)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + ypart(q)) enddef; vardef enclosuresegment(expr p,q) = firstenclosurepoint(p,q)---secondenclosurepoint(p,q) enddef;
+vardef enclosure(expr p) =
+ save enc;
+ save i;
+ path enc;
+ if (pair p):
+ enc := circlepath scaled (2*enclosuremargin) shifted point 1 of p;
+ else:
+ enc := enclosuresegment(point 0 of p, point 1 of p);
+ for i=1 upto length(p)-1:
+ enc := enc..enclosuresegment(point i of p, point i+1 of p);
+ endfor;
+ enc := enc..cycle;
+ fi
+ enc
+enddef;
+
+
+% general appearence constants and variables
+def none = 1 enddef;
+def yes = 2 enddef;
+def no = 3 enddef;
+def circle = 10 enddef;
+def utriangle = 11 enddef;
+def ltriangle = 12 enddef;
+def btriangle = 13 enddef;
+def rtriangle = 14 enddef;
+def boxed = 15 enddef;
+def fixedbox = 16 enddef;
+def roundbox = 17 enddef;
+def roundfixedbox = 18 enddef;
+def diamond = 19 enddef;
+def solid = 20 enddef;
+def lefthalf = 21 enddef;
+def righthalf = 22 enddef;
+def bold = 30 enddef;
+def dash = 31 enddef;
+def bolddash = 32 enddef;
+def double = 33 enddef;
+def invisible = 34 enddef;
+def clockwiseorientation = 40 enddef;
+def counterclockwiseorientation = 41 enddef;
+
+pair spacing;
+pair offset;
+pair numbering;
+numeric size;
+numeric shape;
+numeric boxmargin;
+numeric fixedboxwidth;
+numeric fixedboxheight;
+numeric border;
+numeric filling;
+numeric style;
+numeric nodelabel;
+numeric arrowlabel;
+numeric unfillonarrowlabel;
+numeric tipangle;
+numeric tipsharpness;
+numeric tipsize;
+numeric loopsize;
+numeric looporientation;
+numeric incominglength;
+numeric outgoinglength;
+numeric solidsize;
+numeric boldsize;
+numeric dashsize;
+numeric doublesize;
+numeric nodemargin;
+numeric arrowmargin;
+numeric enclosuremargin;
+color bordercolor;
+color fillingcolor;
+color nodelabelcolor;
+color arrowcolor;
+color arrowlabelcolor;
+color unfillcolor;
+color enclosurecolor;
+
+spacing = (60,30);
+offset = (0,0);
+numbering = (0,0);
+size := 5;
+shape := circle;
+boxmargin := 5;
+fixedboxwidth := 14;
+fixedboxheight := 14;
+border := solid;
+filling := none;
+style := solid;
+nodelabel := yes;
+arrowlabel := yes;
+unfillonarrowlabel := no;
+unfillcolor := white;
+tipangle := 20;
+tipsharpness := 15;
+tipsize := 4;
+loopsize := 14;
+looporientation := counterclockwiseorientation;
+incominglength := 20;
+outgoinglength := 20;
+solidsize := 0.7;
+boldsize := 1.5;
+dashsize := 0.7;
+doublesize := 1.3;
+nodemargin := 1.5;
+arrowmargin := 3.8;
+enclosuremargin := 5;
+bordercolor = black;
+fillingcolor = black;
+nodelabelcolor = black;
+arrowcolor = black;
+arrowlabelcolor = black;
+enclosurecolor = gray;
+linecap := butt;
+linejoin := mitered;
+
+
+% variable stacks
+pair spacing.back[];
+pair offset.back[];
+pair numbering.back[];
+numeric size.back[];
+numeric shape.back[];
+numeric boxmargin.back[];
+numeric fixedboxwidth.back[];
+numeric fixedboxheight.back[];
+numeric border.back[];
+numeric filling.back[];
+numeric style.back[];
+numeric nodelabel.back[];
+numeric arrowlabel.back[];
+numeric unfillonarrowlabel.back[];
+numeric tipangle.back[];
+numeric tipsharpness.back[];
+numeric tipsize.back[];
+numeric loopsize.back[];
+numeric looporientation.back[];
+numeric incominglength.back[];
+numeric outgoinglength.back[];
+numeric solidsize.back[];
+numeric boldsize.back[];
+numeric dashsize.back[];
+numeric doublesize.back[];
+numeric nodemargin.back[];
+numeric arrowmargin.back[];
+numeric enclosuremargin.back[];
+color bordercolor.back[];
+color fillingcolor.back[];
+color nodelabelcolor.back[];
+color arrowcolor.back[];
+color arrowlabelcolor.back[];
+color unfillcolor.back[];
+color enclosurecolor.back[];
+
+numeric spacing.count;
+numeric offset.count;
+numeric numbering.count;
+numeric size.count;
+numeric shape.count;
+numeric boxmargin.count;
+numeric fixedboxwidth.count;
+numeric fixedboxheight.count;
+numeric border.count;
+numeric filling.count;
+numeric style.count;
+numeric nodelabel.count;
+numeric arrowlabel.count;
+numeric unfillonarrowlabel.count;
+numeric unfillcolor.count;
+numeric tipangle.count;
+numeric tipsharpness.count;
+numeric tipsize.count;
+numeric loopsize.count;
+numeric looporientation.count;
+numeric incominglength.count;
+numeric outgoinglength.count;
+numeric solidsize.count;
+numeric boldsize.count;
+numeric dashsize.count;
+numeric doublesize.count;
+numeric nodemargin.count;
+numeric arrowmargin.count;
+numeric enclosuremargin.count;
+numeric bordercolor.count;
+numeric fillingcolor.count;
+numeric nodelabelcolor.count;
+numeric arrowcolor.count;
+numeric arrowlabelcolor.count;
+numeric enclosurecolor.count;
+
+spacing.count := 0;
+offset.count := 0;
+numbering.count := 0;
+size.count := 0;
+shape.count := 0;
+boxmargin.count := 0;
+fixedboxwidth.count := 0;
+fixedboxheight.count := 0;
+border.count := 0;
+filling.count := 0;
+style.count := 0;
+nodelabel.count := 0;
+arrowlabel.count := 0;
+unfillonarrowlabel.count := 0;
+unfillcolor.count := 0;
+tipangle.count := 0;
+tipsharpness.count := 0;
+tipsize.count := 0;
+loopsize.count := 0;
+looporientation.count := 0;
+incominglength.count := 0;
+outgoinglength.count := 0;
+solidsize.count := 0;
+boldsize.count := 0;
+dashsize.count := 0;
+doublesize.count := 0;
+nodemargin.count := 0;
+arrowmargin.count := 0;
+enclosuremargin.count := 0;
+bordercolor.count := 0;
+fillingcolor.count := 0;
+nodelabelcolor.count := 0;
+arrowcolor.count := 0;
+arrowlabelcolor.count := 0;
+enclosurecolor.count := 0;
diff --git a/graphics/metapost/contrib/macros/automata/example.mp b/graphics/metapost/contrib/macros/automata/example.mp
new file mode 100644
index 0000000000..79adb2f68e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/automata/example.mp
@@ -0,0 +1,76 @@
+input automata;
+
+verbatimtex
+% generic layout
+\documentclass{article}
+\usepackage[english]{babel}
+\usepackage[latin1]{inputenc}
+\selectlanguage{english}
+% additional packages
+\usepackage{amsmath}
+\begin{document}
+etex
+
+
+% EXAMPLE FOR THE PACKAGE automata.mp
+
+beginfig(0);
+
+ % Setting of some global parameters.
+
+ size := 15;
+ incominglength := 25;
+ loopsize := 22;
+
+ % The following command defines a grid of nodes with 7 rows and 10 columns.
+ % Instead of using "spacing := (36,29)" and thus change the global parameter for the ditance
+ % between nodes, one can use `with spacing((36,29))' to temporarily change the value of this
+ % parameter.
+
+ with spacing((36,29)) matrix.a(7,10);
+
+ % Next, one declares the shape of the nodes and possibly their labels. One can use the directives
+ % "btex" and "etex" to include LaTeX-compiled labels in nodes, or just "" to leave them unlabeled.
+ % Moreover, one can use several shapes for the nodes. There are some predefined shorhands for
+ % modified styles of nodes and arrows (e.g., "node_double" is equivalent to "with border(double) node")
+
+ node.a[4][0](btex $s_0$ etex);
+ with shape(boxed) node.a[4][2](btex $s_1$ etex);
+ with shape(fixedbox) node.a[4][4](btex $s_2$ etex);
+ with size(18) with shape(diamond) node.a[4][6](btex $s_3$ etex);
+ with size(22) with shape(utriangle) node.a[4][8](btex $s_4$ etex);
+ node.a[2][2](btex $s_5$ etex);
+ node.a[2][5](btex $s_6$ etex);
+ node.a[1][6](btex $s_7$ etex);
+ node_double.a[1][8](btex $s_8$ etex);
+
+ % One can define arrows of different forms. Each arrow follow a path from an initial node to a
+ % final node and this path must be explicitly given as a MetaPost path expression (e.g., point..point--point).
+ % Note that labels of nodes and arrows can be rotated using the MetaPost directive "rotated".
+
+ incoming(0, "") (a[4][0]) 120;
+ loop.bot(.65, btex \small $a$ etex) (a[4][0]) -165;
+ arrow_dash.bot(.5, btex \small $b$ etex) (a[4][0],a[4][2]) a[4][0].c..a[4][2].c;
+ arrow.bot(.5, btex \small $a$ etex) (a[4][2],a[4][4]) a[4][2].c..a[4][4].c;
+ arrow.bot(.5, btex \small $a$ etex) (a[4][4],a[4][6]) a[4][4].c..a[4][6].c;
+ arrow.bot(.5, btex \small $a$ etex) (a[4][6],a[4][8]) a[4][6].c..a[4][8].c;
+ arrow.bot(.5, btex \small $c$ etex) (a[4][8],a[4][0]) a[4][8].c..a[5][7].c---a[5][1].c..a[4][0].c;
+ arrow_dash.rt(.5, btex \small $a$ etex rotated 90) (a[4][2],a[2][2]) a[4][2].c..a[2][2].c;
+ arrow.bot(.5, btex \small $c$ etex rotated 39) (a[2][2],a[4][0]) a[2][2].c..a[4][0].c;
+ arrow_dash.bot(.5, btex \small $a$ etex) (a[2][2],a[2][5]) a[2][2].c{dir-30}..a[2][5].c;
+ arrow_dash.rt(.5, btex \small $a$ etex rotated 90) (a[4][6],a[1][6]) a[4][6].c..a[1][6].c;
+ arrow.top(.5, btex \small $a$ etex) (a[1][6],a[1][8]) a[1][6].c..a[1][8].c;
+ arrow.bot(.38, btex \small $c$ etex) (a[2][5],a[4][0]) a[2][5].c..a[1][4].c---a[1][2].c shifted(-10,0)..a[2][1].c shifted (-10,0)---a[4][0].c;
+ arrow_bold.bot(.5, btex \small $c$ etex) (a[1][8],a[4][0]) a[1][8].c..a[2][9].c---a[5][9].c..a[6][8].c---a[6][1].c..a[5][0].c---a[4][0].c;
+ arrow_bold.top(.38, btex \small $c$ etex) (a[1][8],a[4][0]) a[1][8].c..a[0][7].c---a[0][1].c..a[1][0].c---a[4][0].c;
+
+ % Finally, one may want to highligh a given set of nodes. This can done using the macro
+ % "enclose"/"enclosure", which draws/returns a path that goes around the given sequence
+ % of vertices (it is always a good idea if the sequence is given in clockwise order and
+ % if it defines a convex region!).
+
+ with enclosuremargin(20) draw enclosure(a[4][4].c--a[2][5].c--a[1][6].c--a[4][6].c--cycle) withcolor light.light.green withpen pencircle scaled 3;
+
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/automata/example.pdf b/graphics/metapost/contrib/macros/automata/example.pdf
new file mode 100644
index 0000000000..8fa83dc5c4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/automata/example.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/automata/example.tex b/graphics/metapost/contrib/macros/automata/example.tex
new file mode 100644
index 0000000000..4544ebb032
--- /dev/null
+++ b/graphics/metapost/contrib/macros/automata/example.tex
@@ -0,0 +1,35 @@
+\documentclass{article}
+\usepackage{a4wide}
+\usepackage[english]{babel}
+\usepackage[latin1]{inputenc}
+\selectlanguage{english}
+\usepackage{amsmath,url,graphics,verbatim}
+\DeclareGraphicsRule{*}{mps}{*}{}
+
+\begin{document}
+
+\title{An example of automaton generated\\with the MetaPost package \url{automata.mp}}
+\author{Gabriele Puppis\\
+ \url{gabriele.puppis@gmail.com}}
+
+\maketitle
+
+This \LaTeX\ document shows how to include a picture generated with MetaPost.
+By default, the extension of a file generated with MetaPost is a number
+(e.g., \url{.0}), so you should use the package \url{graphics} and the command
+\verb \DeclareGraphicsRule{*}{mps}{*}{} to make \LaTeX\ recognize these
+extensions as files in PS format.
+
+The file \url{example.mp} contains the MetaPost source code that was used to generate
+the automaton in Figure \ref{fig:example}. This file should be compiled with MetaPost
+(e.g., run ``\verb mp \verb -tex=latex \verb example.mp '' from the shell command
+line). Such an example uses the package \url{automata.mp} to easily draw the states
+and the transitions of the automaton (you can find some documentation inside the files
+\url{example.mp} and \url{automata.mp}).
+
+\begin{figure}[!!h]
+\centering\includegraphics{example.0}
+\caption{An example of automaton}\label{fig:example}
+\end{figure}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/bbcard/README.bbcard b/graphics/metapost/contrib/macros/bbcard/README.bbcard
new file mode 100644
index 0000000000..58f5c720bd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/README.bbcard
@@ -0,0 +1,45 @@
+Bullshit Bingo
+
+This is a metapost implementation of Bullshit Bingo. It's based on
+http://www.perkigoth.com/home/kermit/stuff/BullshitBingo. I've taken
+additional phrases from http://www.lssu.edu/banished.
+
+To be perfectly honest, I wrote this because I needed a meaningful,
+client-focused playing card which could be the best of breed. I
+basically felt that I could use my best practices to bring a total
+quality approach to the challenge. Having said that, the actual fact is
+I also wanted to control the list of words. This version is not
+web-enabled, but it has a few value-added features which should empower
+employees, and put them on the critical path towards realising their
+core competencies:
+
+-- dynamic logo-style heading
+-- four grids per card -- speaks to serious play
+-- user-friendly method of generating many cards at once
+-- more than 100 very unique bullshit phrases
+-- it's easy to add and remove phrases, so you can be proactive,
+ not reactive
+
+--
+
+To generate a single card:
+ mpost bbcard
+and the card will be written to bbcard.ps
+
+To generate 12 cards:
+ mpost '\nocards:=12; input bbcard'
+and the cards will be written to bbcard.1, bbcard.2, .., bbcard.12
+
+Those command-lines assume a recent Unix installation. On your
+machine, metapost might be called mp rather than mpost, and the
+single-quotes might not be necessary. bbcard requires your installation
+to be configured to use the font ptmr8r (Times Roman). It is not
+suitable for use with the CM fonts.
+
+bbcard.mp contains instructions for adding additional phrases.
+breakwidth.mp can be used to perform simple-minded line breaking
+with other metapost routines.
+
+bbcard.mp is released to the public domain
+breakwidth.mp is copyright by patrick mcphee, but there are
+no limitations on its use
diff --git a/graphics/metapost/contrib/macros/bbcard/README.calendar b/graphics/metapost/contrib/macros/bbcard/README.calendar
new file mode 100644
index 0000000000..a7f16f8026
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/README.calendar
@@ -0,0 +1,38 @@
+Calendar
+
+This is a metapost calendar, which I use to mark down appointments.
+It prints one month per page, and can generate an entire year's
+with one command.
+
+To generate the next month's calendar:
+ mpost calendar
+and the card will be written to bbcard.{number}, where {number} is
+the month number. One drawback: some common metapost implementations
+don't determine the month dynamically, but instead report the month
+of compilation or the month of the last change to the code or something
+like that. In that case, you must set theyear and themonth as indicated
+below:
+
+To generate a year's worth:
+ mpost '\theyear:=2003; themonth:=-1; input calendar'
+
+To generate April 2003:
+ mpost '\theyear:=2003; themonth:=4; input calendar'
+
+Those command-lines assume a recent Unix installation. On your
+machine, metapost might be called mp rather than mpost, and the
+single-quotes might not be necessary. calendar requires your installation
+to be configured to use the font pplr8r (Palatino). It is not
+suitable for use with the CM fonts.
+
+I've included a few holidays, which I called brands for some reason
+I don't recall. You can remove them or add more by setting the values
+of the approriate element of the `brands' array. For instance:
+
+ brands[7][4] := "Independance Day";
+
+sets the US independance day, which is July 4.
+
+You are free to enhance this file or integrate it with other packages
+if you like. If you do something splendid like adding support for
+floating holidays, send them to me and I'll update the package on CTAN.
diff --git a/graphics/metapost/contrib/macros/bbcard/README.scorecard b/graphics/metapost/contrib/macros/bbcard/README.scorecard
new file mode 100644
index 0000000000..ec4580c883
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/README.scorecard
@@ -0,0 +1,11 @@
+Baseball score card
+
+This card can be used to score any baseball game which lasts fewer
+than twelve innings. Dave Rebnord added the little grey diamonds.
+
+To generate:
+ mpost scorecard
+and the card will be written to scorecard.ps.
+
+You are free to enhance this file or integrate it with other packages
+if you like.
diff --git a/graphics/metapost/contrib/macros/bbcard/bbcard.mp b/graphics/metapost/contrib/macros/bbcard/bbcard.mp
new file mode 100644
index 0000000000..1d03256b68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/bbcard.mp
@@ -0,0 +1,262 @@
+
+% bullshit bingo card
+% prepared by patrick tj mcphee, december 2002 ptjm@interlog.com
+% released to the public domain. have fun
+
+% concept and many phrases taken from
+% http://www.perkigoth.com/home/kermit/stuff/BullshitBingo
+% others from the list of banished words of Lake Superior State University:
+% http://www.lssu.edu/banished
+% my thanks to all who have contributed to these efforts
+
+% to run off a single card, give a command like
+% mpost bbcard
+% and the card will written to bbcard.ps
+
+% to run off cards for several players, try
+% mpost '\nocards := 7; input bbcard'
+% and the cards will be written to bbcard.1, bbcard.2, .., bbcard.7
+
+% to add additional phrases, duplicate one of the lines starting with
+% i := i + 1; bs[i] :=
+% and replace the phrase in quotes
+% I keep them in alphabetical order to ease maintenance, but you don't
+% have to. I suggest commenting out phrases which are not known in
+% your community and adding the irritating ones which are.
+
+input breakwidth;
+
+defaultfont := "ptmr8r";
+
+prologues := 2;
+
+string bs[];
+i := 0;
+
+i := i + 1; bs[i] := "action item";
+i := i + 1; bs[i] := "actual facts";
+i := i + 1; bs[i] := "articulate";
+i := i + 1; bs[i] := "as we speak";
+i := i + 1; bs[i] := "at the end of the day";
+i := i + 1; bs[i] := "at this point in time";
+i := i + 1; bs[i] := "backward compatible";
+i := i + 1; bs[i] := "ballpark";
+i := i + 1; bs[i] := "bandwidth";
+i := i + 1; bs[i] := "basically";
+i := i + 1; bs[i] := "been there, done that";
+i := i + 1; bs[i] := "benchmark";
+i := i + 1; bs[i] := "best of breed";
+i := i + 1; bs[i] := "best practice";
+i := i + 1; bs[i] := "buzz";
+i := i + 1; bs[i] := "by and large";
+i := i + 1; bs[i] := "challenge";
+i := i + 1; bs[i] := "client-focused";
+i := i + 1; bs[i] := "collaborative";
+i := i + 1; bs[i] := "conceptualize";
+i := i + 1; bs[i] := "core business";
+i := i + 1; bs[i] := "core competency";
+i := i + 1; bs[i] := "critical path";
+i := i + 1; bs[i] := "down the road";
+i := i + 1; bs[i] := "down time";
+i := i + 1; bs[i] := "downsizing";
+i := i + 1; bs[i] := "drill down";
+i := i + 1; bs[i] := "dynamic";
+i := i + 1; bs[i] := "each and every";
+i := i + 1; bs[i] := "empower employees";
+i := i + 1; bs[i] := "extreme";
+i := i + 1; bs[i] := "fast-track";
+i := i + 1; bs[i] := "fault tolerant";
+i := i + 1; bs[i] := "front lines";
+i := i + 1; bs[i] := "game plan";
+i := i + 1; bs[i] := "gap analysis";
+i := i + 1; bs[i] := "go public";
+i := i + 1; bs[i] := "go the extra mile";
+i := i + 1; bs[i] := "going forward";
+i := i + 1; bs[i] := "hard-won lessons";
+i := i + 1; bs[i] := "hardball";
+i := i + 1; bs[i] := "having said that";
+i := i + 1; bs[i] := "heads up";
+i := i + 1; bs[i] := "issues";
+i := i + 1; bs[i] := "knock-on effect";
+i := i + 1; bs[i] := "knowledgebase";
+i := i + 1; bs[i] := "lessons learned";
+i := i + 1; bs[i] := "make no mistake";
+i := i + 1; bs[i] := "manage expectations";
+i := i + 1; bs[i] := "meaningful";
+i := i + 1; bs[i] := "metrics";
+i := i + 1; bs[i] := "mind share";
+i := i + 1; bs[i] := "mindset";
+i := i + 1; bs[i] := "mission critical";
+i := i + 1; bs[i] := "move the goal posts";
+i := i + 1; bs[i] := "movers and shakers";
+i := i + 1; bs[i] := "new economy";
+i := i + 1; bs[i] := "no blame";
+i := i + 1; bs[i] := "no-brainer";
+i := i + 1; bs[i] := "now, more than ever";
+i := i + 1; bs[i] := "off-site meeting";
+i := i + 1; bs[i] := "off-the-shelf";
+i := i + 1; bs[i] := "offload";
+i := i + 1; bs[i] := "on the same page";
+i := i + 1; bs[i] := "open source";
+i := i + 1; bs[i] := "out of the loop";
+i := i + 1; bs[i] := "out-source";
+i := i + 1; bs[i] := "outside the box";
+i := i + 1; bs[i] := "paradigm";
+i := i + 1; bs[i] := "partnership";
+i := i + 1; bs[i] := "proactive, not reactive";
+i := i + 1; bs[i] := "profitability";
+i := i + 1; bs[i] := "progressing";
+i := i + 1; bs[i] := "pushback";
+i := i + 1; bs[i] := "put this one to bed";
+i := i + 1; bs[i] := "results-driven";
+i := i + 1; bs[i] := "revenue";
+i := i + 1; bs[i] := "revisit";
+i := i + 1; bs[i] := "robust";
+i := i + 1; bs[i] := "run it up the flagpole";
+i := i + 1; bs[i] := "run the numbers";
+i := i + 1; bs[i] := "sales driven";
+i := i + 1; bs[i] := "scope";
+i := i + 1; bs[i] := "service oriented";
+i := i + 1; bs[i] := "slippery slide";
+i := i + 1; bs[i] := "speaks to";
+i := i + 1; bs[i] := "strategic fit";
+i := i + 1; bs[i] := "stretch the envelope";
+i := i + 1; bs[i] := "synergy";
+i := i + 1; bs[i] := "take that offline";
+i := i + 1; bs[i] := "target audience";
+i := i + 1; bs[i] := "team player";
+i := i + 1; bs[i] := "the big picture";
+i := i + 1; bs[i] := "the bottom line";
+i := i + 1; bs[i] := "think outside the box";
+i := i + 1; bs[i] := "ticks in boxes";
+i := i + 1; bs[i] := "time to market";
+i := i + 1; bs[i] := "timeline";
+i := i + 1; bs[i] := "to be perfectly honest";
+i := i + 1; bs[i] := "total quality";
+i := i + 1; bs[i] := "touch base";
+i := i + 1; bs[i] := "up to speed";
+i := i + 1; bs[i] := "user friendly";
+i := i + 1; bs[i] := "value-added";
+i := i + 1; bs[i] := "vast majority";
+i := i + 1; bs[i] := "very unique";
+i := i + 1; bs[i] := "walk the talk";
+i := i + 1; bs[i] := "web-enabled";
+i := i + 1; bs[i] := "win-win situation";
+i := i + 1; bs[i] := "wow factor";
+
+bsmax := i;
+
+radius := .5 cm;
+
+offset := 1 cm;
+boxwid := 1.9 cm;
+
+
+% co-ordinates for the grid
+pair bpos[], bpos[].ll, bpos[].ul, bpos[].ur, bpos[].lr;
+ for i = 0 upto 4:
+ for j = 0 upto 4:
+ bpos[i+j*5+1] := ((j+0.5)*boxwid, (i+0.5)*boxwid);
+ bpos[i+j*5+1].ll := (j*boxwid, i*boxwid);
+ bpos[i+j*5+1].ul := (j*boxwid, (i+1)*boxwid);
+ bpos[i+j*5+1].lr := ((j+1)*boxwid, i*boxwid);
+ bpos[i+j*5+1].ur := ((j+1)*boxwid, (i+1)*boxwid);
+ endfor;
+ endfor;
+
+picture bbcard[];
+
+% the grid itself
+bbcard[0] := image(
+ z1 = (0, radius) = z2 - (0, 5boxwid - 2radius) =
+ z6 - (5boxwid, 0) = z8 - (radius, -radius);
+ z3 = z8 + (0, 5boxwid) = z4 - (5boxwid-2radius, 0);
+ x5 = x6; y5 = y2;
+ x7 = x4;
+ y7 = y8;
+
+ pickup pencircle xscaled 4pt yscaled 1pt rotated 30;
+
+ draw z1---z2..z3---z4..z5---z6..z7---z8..cycle;
+
+ fill ((unitsquare shifted -(.5,.5)) scaled boxwid) shifted bpos[13] withcolor .8 white;
+
+ pickup pencircle scaled 1pt;
+ for i = 2 upto 5:
+ draw bpos[i].ll--bpos[i+20].lr;
+ endfor;
+
+ for i = 10 step 5 until 25:
+ draw bpos[i].ul--bpos[i-4].ll;
+ endfor;
+);
+
+% handle > 1 card if nocards was set on the command-line
+if known nocards:
+ for bsno = 1 upto nocards:
+else:
+ if unknown bsno:
+ bsno := -1;
+ fi;
+fi;
+
+ % select the strings for each card
+ % after we're done, we set the middle square to `Free Square'
+ % dups[] is used to keep track of already used values to eliminate
+ % duplicates within each grid (a playing card has four grids on it)
+
+ for bb = 1 upto 4:
+ string bstring[];
+ numeric dups[];
+
+ for i = 1 upto 25:
+ j := 1+floor(uniformdeviate bsmax);
+
+ forever:
+ exitif unknown dups[j];
+ j := 1+floor(uniformdeviate bsmax);
+ endfor;
+ dups[j] := i;
+ bstring[i] = bs[j];
+ endfor;
+
+ bstring[13] := "Free Square";
+
+ bbcard[bb] := image(
+ draw bbcard[0];
+ for i = 1 upto 25:
+ label(breaktowidth(bstring[i], 1.5cm, 11pt), bpos[i]);
+ endfor;
+ );
+ endfor;
+
+ beginfig(bsno);
+ picture p;
+ p := ("Bullshit Bingo" infont defaultfont scaled 2)
+ shifted ((offset, 3offset)+2.25*ulcorner bbcard[0]);
+
+ fill ((llcorner p)..(ulcorner p).. tension 2 .. (urcorner p)..
+ (lrcorner p) .. tension 2 .. cycle)
+ withcolor .5 white;
+ draw p withcolor white;
+
+ draw ("Advanced Playing Card" infont defaultfont scaled 1.2)
+ shifted ((lrcorner p) + (10pt, 6pt));
+ draw ("Stay awake!" infont defaultfont)
+ shifted ((lrcorner p) + (10pt, -14pt));
+ draw ("Watch for duplicates!" infont defaultfont)
+ shifted ((lrcorner p) + (10pt, -25pt));
+ draw ("Have fun!" infont defaultfont)
+ shifted ((lrcorner p) + (10pt, -36pt));
+
+ draw bbcard[1] shifted (offset, offset);
+ draw bbcard[2] shifted ((1.25offset, offset)+lrcorner bbcard[0]);
+ draw bbcard[3] shifted ((1.25offset, 2offset)+urcorner bbcard[0]);
+ draw bbcard[4] shifted ((offset, 2offset)+ulcorner bbcard[0]);
+ endfig;
+
+if known nocards:
+ endfor;
+fi;
+
+end;
diff --git a/graphics/metapost/contrib/macros/bbcard/bbcard.tpm b/graphics/metapost/contrib/macros/bbcard/bbcard.tpm
new file mode 100644
index 0000000000..0f455f9d4f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/bbcard.tpm
@@ -0,0 +1,22 @@
+<!DOCTYPE rdf:RDF SYSTEM "../tpm.dtd">
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:TPM="http://texlive.dante.de/">
+ <rdf:Description about="http://texlive.dante.de/texlive/bbcard.zip"><TPM:Name>bbcard</TPM:Name><TPM:Date>2003/01/31</TPM:Date><TPM:Version>1.0</TPM:Version><TPM:Creator>ptjm</TPM:Creator><TPM:Title>
+Bullshit Bingo playing card, calendar, baseball score card (metapost).
+ </TPM:Title><TPM:Description>
+Playing card for bullshit bingo, written in metapost. Includes a macro for
+wrapping text without using an external formatter and code for performing
+random string selection.
+Monthly calendar, written in metapost. Has some support for marking holidays.
+Baseball scorecard, written in metapost.
+ </TPM:Description><TPM:Flags/><TPM:RunFiles size="17493">
+texmf/metapost/misc/bbcard/bbcard.mp
+texmf/metapost/misc/bbcard/breakwidth.mp
+texmf/metapost/misc/bbcard/calendar.mp
+texmf/metapost/misc/bbcard/scorecard.mp
+</TPM:RunFiles><TMP:DocFiles size="3622"><!-- feel free to move this -->
+texmf/metapost/misc/bbcard/README.bbcard
+texmf/metapost/misc/bbcard/README.calendar
+texmf/metapost/misc/bbcard/README.scorecard
+</TPM:DocFiles>
+<TPM:Requires/></rdf:Description>
+</rdf:RDF>
diff --git a/graphics/metapost/contrib/macros/bbcard/breakwidth.mp b/graphics/metapost/contrib/macros/bbcard/breakwidth.mp
new file mode 100644
index 0000000000..54777cd81f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/breakwidth.mp
@@ -0,0 +1,101 @@
+%%
+%% naive paragraph formatting for metapost. You get better results using
+%% btex .. etex, since that will give you kerning, ligatures, and the
+%% famous TeX paragraph breaking algorithm. This one is OK for me, though,
+%%
+%% Copyright 2001,2003 Patrick TJ McPhee
+%% everyone is welcome to use this code for any purpose, to modify it, and
+%% to copy it in whole or in part for use in other macro sets, with the
+%% conditions that this copyright notice be preserved with any significant
+%% portion of the code, and that modifications to this file be clearly
+%% marked.
+
+
+% arguments
+% s - text to format
+% w - maximum width
+% b = baseline skip
+
+vardef breaktowidth(expr s, w, b) =
+ save p;
+ picture p;
+
+ p := s infont defaultfont scaled defaultscale;
+ % if the string is too long to fit within bounds, we break it up on
+ % word boundaries.
+ if xpart(lrcorner p) > w:
+ save q, gq, offs, len, goodlen, gl, ls, sp;
+
+ picture q, gq;
+ numeric offs, len, goodlen, ls, gl;
+ string sp;
+
+ p := nullpicture;
+ offs := 0; % offset of current substring within s
+ len := 1; % most recent character examined
+ goodlen := 0; % most recent reasonable break point
+ ls := length(s);
+
+ forever:
+ if len < ls:
+ sp := substring(len, len+1) of s;
+ else:
+ sp := " ";
+ fi;
+
+ if (sp = " ") or (sp = "-") or (sp = "/"):
+
+ if sp <>" ":
+ len := len + 1;
+ fi;
+
+ % test to see if this is within the needed width
+ q := (substring(offs, len) of s) infont defaultfont scaled defaultscale;
+
+
+ if xpart (lrcorner q) > w:
+ % if there's no good break point, build up until we
+ % get something that fits -- can't use goodlen as the
+ % array index as it is reset to 0 after the loop ends
+ if goodlen <= offs:
+ for gl = (len-1) downto (offs+1):
+ goodlen := gl;
+ gq := (substring(offs, goodlen) of s) infont defaultfont scaled defaultscale;
+ exitunless xpart (lrcorner gq) > w;
+ endfor;
+ fi;
+
+
+ p := image(draw p shifted (0, b);
+ draw gq;);
+ offs := goodlen;
+ len := offs + 1;
+
+ % we still fit, so save the current position
+ else:
+ if sp <> " ":
+ goodlen := len;
+ else:
+ goodlen := len+1;
+ fi;
+ gq := q;
+ fi;
+ fi;
+
+ exitunless len < ls;
+
+ len := len + 1;
+ endfor;
+
+ if goodlen < ls:
+ gq := (substring(offs, ls) of s) infont defaultfont scaled defaultscale;
+ fi;
+
+ if goodlen <> ls:
+ p := image(draw p shifted (0, b);
+ draw gq;);
+ fi;
+ fi;
+ p
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/bbcard/calendar.mp b/graphics/metapost/contrib/macros/bbcard/calendar.mp
new file mode 100644
index 0000000000..27c0db6de6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/calendar.mp
@@ -0,0 +1,216 @@
+%% One-page calendar
+%% Patrick TJ McPhee, 1997
+%% you are permitted to modify or distribute this file
+%% any way you like, but please indicate modifications
+%%
+%% Instructions: if you run this file through metafont, it will produce a
+%% one-month calendar for next month, suitable for printing on US letter-size
+%% paper. You can set two parameters, theyear affects the year for which the
+%% calendar will be printed, and themonth affects the month. The valid
+%% range for theyear is 1997 to some year well off in the future, and the
+%% valid range for themonth is -1 to 12. If themonth is set to -1, calendars
+%% will be printed for every month in the year. If themonth is set to 0,
+%% a calendar will be printed for the following month.
+%% The ouput file for each month is calendar.<themonth>. e.g., the
+%% file for April would be calendar.4.
+
+%% fonts used to put up numbers, days of the week and holidays
+string brandfont;
+brandfont := "pplr8r";
+defaultfont:="pplr8r";
+defaultscale := 2;
+prologues:=1;
+
+%% list of holidays. The first element of the array is the month, and the
+%% second is the day of the month
+string brands[][];
+
+brands[12][25] := "Christmas";
+brands[1][1] = "Hogmany";
+brands[1][25] = "Robbie Burns";
+brands[2][14] = "Valentine";
+brands[11][11] = "Remembrance";
+brands[11][1] = "All Saints";
+brands[11][2] = "All Souls";
+brands[7][1] = "Canada Day";
+
+%% days of the week
+string weekdays[];
+weekdays[1] = "Sunday";
+weekdays[2] = "Monday";
+weekdays[3] = "Tuesday";
+weekdays[4] = "Wednesday";
+weekdays[5] = "Thursday";
+weekdays[6] = "Friday";
+weekdays[7] = "Saturday";
+
+%% names of the months
+string mnames[];
+
+mnames[1] = "January";
+mnames[2] = "February";
+mnames[3] = "March";
+mnames[4] = "April";
+mnames[5] = "May";
+mnames[6] = "June";
+mnames[7] = "July";
+mnames[8] = "August";
+mnames[9] = "September";
+mnames[10] = "October";
+mnames[11] = "November";
+mnames[12] = "December";
+
+%% I don't think anything needs to change below this point to support
+%% other languages or other anticipated modifications
+
+% the same as `label', but specify the size
+vardef alabel@#(expr s,z,sz) = % Position s near z size sz
+ save p; picture p;
+ if picture s: p=s
+ else: p = s infont brandfont scaled sz
+ fi;
+ p shifted (z + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p
+ )
+ )
+enddef;
+
+def brand = draw alabel enddef;
+
+hoff:=.5in;
+voff:= hoff;
+
+width:= 10in;
+height := 7.5in;
+margin := .05in;
+daynameh := .5 in;
+
+daywidth := (width - 2margin)/7;
+dayheight := (height - 2margin - daynameh)/5;
+
+picture frame;
+
+ pickup pencircle scaled 2 pt yscaled .6 pt rotated 135;
+% pickup penrazor scaled 2 pt rotated 135;
+ bot y1 = voff = bot y8 = top y4 - height = top y5 - height;
+ lft x2 = hoff = lft x3 = rt x6 - width = rt x7 - width;
+ x1 - x4 = 0 = y2 - y7 = y3 - y6 = x5 - x8;
+ x1 - x2 = hoff = y2 - y1 = y4 - y3 = x7 - x8;
+
+% draw z1..z2---z3..z4---z5..z6---z7..z8---cycle;
+ draw (x3-.25hoff,y4+.25voff){dir(-45)}..z4---z5..z6---z7..{dir(-45)}(x7+.25hoff, .75voff)
+ {dir(135)}..z8---z1..z2---z3..{dir(135)}cycle;
+
+
+ pickup pencircle scaled .6 pt;
+ z1 - z9 = (margin, -margin) = z6 - z14 = z10 - z2 = z13 - z5;
+ z3 - z11 = (-margin, -margin) = z8 - z16 = z12 - z4 = z15 - z7;
+
+ draw z9..z10---z11..z12---z13..z14---z15..z16---cycle;
+
+ for i := 1 upto 6:
+ draw (x10+i*daywidth, y9)--(x10+i*daywidth, y12);
+ endfor;
+
+ for i := 1 upto 5:
+ draw (x10, y9+i*dayheight)--(x15, y9+i*dayheight);
+ endfor;
+
+ for i := 1 upto 7:
+ label(weekdays[i], (x10+(i-.5)*daywidth, y9+5daywidth+.2 daynameh));
+ endfor;
+
+lftedge := x10;
+rtedge := x15;
+botedge := y9;
+
+frame := currentpicture;
+
+clearit;
+
+mdays[1] = 31;
+mdays[2] = 28;
+mdays[3] = 31;
+mdays[4] = 30;
+mdays[5] = 31;
+mdays[6] = 30;
+mdays[7] = 31;
+mdays[8] = 31;
+mdays[9] = 30;
+mdays[10] = 31;
+mdays[11] = 30;
+mdays[12] = 31;
+
+def drawmonth (expr mon, startday) :=
+beginfig(mon);
+ draw frame;
+
+ numhoff := lftedge + startday*daywidth;
+ numvoff := botedge + 5 * dayheight;
+
+ if startday > 1:
+ undraw (lftedge+daywidth, numvoff-.25 dayheight)..(lftedge+daywidth, numvoff-.75 dayheight);
+ brand (mnames[mon], (lftedge+daywidth,numvoff-.5 dayheight), 3);
+ brand (decimal theyear, (lftedge+daywidth,numvoff-.7 dayheight), 1);
+ fi;
+
+ for i := 1 upto mdays[mon]:
+ if numvoff > botedge:
+ label.lrt(decimal i, (numhoff, numvoff));
+ else:
+ label.ulft(decimal i, (numhoff+daywidth, numvoff));
+ fi;
+ numhoff := numhoff + daywidth;
+
+ if known brands[mon][i]: brand.llft(brands[mon][i], (numhoff,numvoff), 1); fi
+
+ if numhoff >= rtedge:
+ numhoff := lftedge;
+ numvoff := numvoff - dayheight;
+ fi
+ endfor;
+
+ if startday <= 1:
+ undraw (lftedge+6daywidth, numvoff-.25 dayheight)..(lftedge+6daywidth, numvoff-.75 dayheight);
+ brand (mnames[mon], (lftedge+6daywidth,numvoff-.5 dayheight), 3);
+ brand (decimal theyear, (lftedge+6daywidth,numvoff-.7 dayheight), 1);
+ fi;
+
+ currentpicture := currentpicture rotatedaround((4.25in,4.25in),90);
+endfig;
+enddef;
+
+%% if no year is specified, try for the current year
+if unknown theyear: theyear:=year;
+elseif theyear=0: theyear:=year;
+fi;
+firstday := (3 + (theyear - 1997) + (theyear - 1997) div 4) mod 7;
+
+%% if no month is specified, try for next month
+if unknown themonth: themonth := month + 1;
+elseif themonth=0: themonth := month + 1;
+fi;
+if themonth = 13:
+ theyear := theyear+1;
+ themonth := 1;
+ fi;
+
+if ((theyear mod 4) = 0)
+ and (((theyear mod 100) <> 0) or ((theyear mod 400) = 0)):
+ mdays[2] := 29;
+ fi;
+
+% special value of themonth: -1 prints the whole year's calendar
+if themonth = -1:
+ for j = 1 upto 12:
+ drawmonth(j, firstday);
+ firstday := (firstday + mdays[j]) mod 7;
+ endfor;
+else:
+ for j = 1 upto (themonth-1):
+ firstday := (firstday + mdays[j]) mod 7;
+ endfor;
+ drawmonth(themonth, firstday);
+fi
+end;
diff --git a/graphics/metapost/contrib/macros/bbcard/scorecard.mp b/graphics/metapost/contrib/macros/bbcard/scorecard.mp
new file mode 100644
index 0000000000..5b9bcb796c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bbcard/scorecard.mp
@@ -0,0 +1,152 @@
+%
+% Ball score card
+
+defaultfont:="rptmr";
+defaultscale := 1;
+prologues := 1;
+special "/rptmr /Times-Roman def";
+
+% pen for the outer box
+pickup pencircle scaled 1 pt;
+fat nib = savepen;
+
+% pen for the cross-lines
+pickup pencircle scaled .5 pt;
+medium nib = savepen;
+
+% pen for slashes
+pickup pencircle scaled .1 pt;
+thin nib = savepen;
+
+un = 1 cm;
+
+def urc (expr x,y) =
+ ((x,y)-(.2un,0)){right}..{down}((x,y)-(0,.2un))
+enddef;
+def lrc (expr x, y) =
+ ((x,y)+(0,.2un)){down}..{left}((x,y)-(.2un,0))
+enddef;
+def llc (expr x, y) =
+ ((x,y)+(.2un,0)){left}..{up}((x,y)+(0,.2un))
+enddef;
+def ulc (expr x, y) =
+ ((x,y)-(0,.2un)){up}..{right}((x,y)+(.2un,0))
+enddef;
+
+
+beginfig(-1);
+
+ picture pitcherbox, batterbox;
+
+ batterbox = image (
+ % outer frame
+ pickup fat nib;
+ draw llc (0,0)---ulc (0,11un)---urc(20un,11un)---lrc (20un,0)---cycle;
+
+ % and some frame-like lines
+ draw (0,1un)---(20un,1un);
+ draw (0,10un)---(20un,10un);
+ draw (4un,0)---(4un,11un);
+
+ % name separators
+ pickup medium nib;
+ for i = 2un step un until 9 un:
+ draw (0,i)---(20un,i);
+ endfor;
+
+ for i := 5 un step un until 19 un:
+ draw (i, 0)---(i, 11un);
+ endfor;
+% added by Dave Rebnord
+ for i := 4 un step un until 14 un:
+ for j := 1 un step un until 9 un :
+ draw (i+0.2un,j+0.5un)---(i+0.5un, j+0.8un)---(i+0.8un,j+0.5un)---(i+0.5un,j+0.2un)---cycle withcolor .25[white, black];
+ endfor;
+ endfor;
+
+ % slashes and other light lines
+ pickup thin nib;
+ for i := 4un step un until 15un:
+ draw (i,0)---(i+un, un);
+ endfor;
+
+ for i := un step un until 9un:
+ draw (0, i+.5un)---(4un, i+.5un);
+ draw (15un, i)---(16un, i+un);
+ draw (19un, i)---(20un, i+un);
+ endfor;
+
+
+ draw (15un, 0)---(16un, un);
+ draw (19un, 0)---(20un, un);
+ draw (15un, 10un)---(16un, 11un);
+ draw (19un, 10un)---point .5 of (urc (20un,11un));
+
+
+ % labels
+ for i := 1 upto 11:
+ label(decimal i, ((3.5+i)*un, 10.5un));
+ endfor;
+
+ label.rt("Totals", (0, .5un));
+
+ label.lft("Runs", (4un, 2/3un));
+ label.lft("Hits", (4un, 1/3un));
+
+
+ label.bot("ab", (15.3un, 11un));
+ label.top("ap", (15.7un, 10un));
+
+ label("r", (16.5un, 10.5un));
+ label("h", (17.5un, 10.5un));
+ label("rbi", (18.5un, 10.5un));
+
+ label.bot("ob", (19.3un, 11un));
+ label.top("e", (19.7un, 10un));
+ );
+
+
+ pitcherbox = image (
+ % outer frame
+ pickup fat nib;
+ ph = 4.5un/5;
+ draw llc (0,0)---ulc (0, 5ph)---urc (20un,5ph)---lrc (20un,0)---cycle;
+
+ % and some frame-like lines
+ draw urc (10un,5ph)---lrc (10un, 4ph)---llc (0,4ph);
+
+ draw urc (10un, 4ph)---(10un,0);
+ draw (4un,0)..(4un,5ph);
+
+ % name separators
+ pickup medium nib;
+
+ draw ulc (10un, 4ph)---(20un,4ph);
+ draw llc (10un, 4ph);
+
+ for i = ph step ph until 3ph:
+ draw (0,i)---(20un,i);
+ endfor;
+
+ for i := 0 step un until 4un:
+ draw (5un+i,0)---(5un+i, 5ph);
+ draw (14un+i,0)---(14un+i, 5ph);
+ endfor;
+ draw (19un,0)---(19un, 5ph);
+
+ label("Pitchers", (2un, 4.5ph));
+ label("IP", (4.5un, 4.5ph));
+ label("H", (5.5un, 4.5ph));
+ label("R", (6.5un, 4.5ph));
+ label("ER", (7.5un, 4.5ph));
+ label("K", (8.5un, 4.5ph));
+ label("BB", (9.5un, 4.5ph));
+ );
+
+
+ draw batterbox shifted (.75un, .75un);
+ draw pitcherbox shifted (.75un, 11.85un);
+ draw batterbox shifted (.75un, 16.45un);
+
+endfig;
+end;
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/README b/graphics/metapost/contrib/macros/blockdraw_mp/README
new file mode 100644
index 0000000000..3364dcd1bb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/README
@@ -0,0 +1,54 @@
+The blockdraw_mp package
+========================
+
+This material is subject to the LaTeX Project Public License. See
+http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+for the details of that license.
+
+History
+-------
+o Submitted to CTAN: 2006-03-08
+ - First submission.
+o Updated 2006-07-18
+ - Added documentation sources and created separate sub-directories
+ for the implementation and documentation.
+o Updated 2007-01-21 (Backward incompatible changes for bond graphs.)
+ - Bond graphs can be drawn with arrowheads that are not filled.
+ - Bond graph labels that depend on the LaTeX preamble have been
+ removed from the bond graph package file, and must now be defined
+ in every bond graph application source.
+ - See further comments in bondgraph.mp, and how the changes affect
+ the example bonddemo.mp.
+ - Thanks to Johan Engelen for suggesting added features and bringing
+ my attention to the problem of preamble-dependent content in package
+ files.
+
+Description
+-----------
+This package targets the simple problem of producing block diagrams
+and bond graphs. In more detail, the provided functionality can be
+divided into
+o Standard elements such as labeled blocks and bond graph arrows.
+o Standardized way for selecting input and output points on blocks.
+o Means for the construction of "carpented" paths connecting points.
+o Standardized label positioning along block connections.
+o Higher-level macros that specialize and/or combine some of the above.
+
+An important example from the group of higher-level macros is the
+macro that takes two blocks as arguments and generates a path connecting
+them.
+
+Experienced MetaPost users will certainly prefer to write their own
+macros for this purpose, but less experienced users may find these
+simple macros accessible and handy in combination with the series
+of examples provided on the WWW (see below).
+
+Further information
+-------------------
+The main source of information for this package is located at
+ http://www.control.isy.liu.se/~tidefelt/projects/blockdraw/
+
+
+Please let me know if you run into problems or have suggestions,
+
+Henrik Tidefelt
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.pdf b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.pdf
new file mode 100644
index 0000000000..2bca3b8c1c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.tex b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.tex
new file mode 100644
index 0000000000..81c36bdb87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/blockdraw_mp.tex
@@ -0,0 +1,266 @@
+\documentclass{ltxdoc}
+
+\usepackage[bookmarks,colorlinks,pdfauthor={Henrik Tidefelt},pdftitle={blockdraw_mp}]{hyperref}
+\usepackage[american]{babel}
+\usepackage{lmodern}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
+\usepackage{graphicx}
+\usepackage{tiddetext}
+\usepackage[squaren]{SIunits}
+\usepackage[labelsep=period,font={small,sl}]{caption}
+\usepackage[2ex]{tighttoc} % must be loaded before parskip!
+\usepackage{parskip}
+\usepackage[addtotoc]{abstract}
+
+\title{The \emph{blockdraw\_{}mp} package\\
+{\large MetaPost macros for the creation of block diagrams and bond graphs}}
+\author{Henrik Tidefelt\\
+{\small tidefelt@isy.liu.se}}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+This is not the right place to motivate why MetaPost should be used for the production of technical illustrations, in particular those to be used in material produced using \LaTeX{}. Block diagrams are no exception since consistent layout of blocks, arrangement of connections, formatting of labels, placement of labels, et~c{} are such demanding tasks. This package provides macros that facilitate the drawing of block diagrams using MetaPost. To extend the capabilities to bond graphs is a small step, and such macros are also included in this package.
+
+This document describes the package, but is not the main manual. However, the $2$-sided appendix starting on an odd page may be used on its own as a reference sheet.
+\end{abstract}
+
+\tableofcontents
+
+\newpage
+
+\section{Motivation}%
+%
+The pdf format has several advantages to PostScript, perhaps most importantly that previewers for pdf are more generally available and of better quality. This is obviously the reason why there is pdf(La)\TeX{}. However, one problem for some potential pdf(La)\TeX{} users is that the psfrag package is not compatible with pdf(La)\TeX{}. On the other hand, since psfrag is not the most convenient way of putting good looking labels in a figure anyway, alternatives should be welcome. The drawing-language MetaPost is a powerful option for those who do not fear the expressiveness of text-based computer languages. This packages provide macros that facilitate the drawing of block diagrams and bond graphs in MetaPost. Two examples are given in \figuresref{demo1} and~\fgref{demo2}.
+
+Also the user who have no experience of MetaPost but needs a way to draw nice block diagrams without too much effort should consider using this package, because it might well be worthwhile to learn the few necessary bits of MetaPost. This typically amounts to looking at a few examples, learning how to invoke the MetaPost interpreter, and get acquainted with the \emph{MetaPost output} format.
+
+\begin{figure}[tbp]
+ \fglabel{demo1}
+ \centering
+ \includegraphics{cascadedemo}
+ \caption{Example figure: block diagram.}
+\end{figure}
+
+\begin{figure}[tbp]
+ \fglabel{demo2}
+ \centering
+ \includegraphics{bonddemo}
+ \caption{Example figure: bond graph.}
+\end{figure}
+
+
+\section{The Full Name}%
+%
+Although the main implementation file of this package is called \emph{blockdraw.mp}, the package has not been given the name \emph{blockdraw}. The full name of the package is precisely \emph{blockdraw\_{}mp}, and the reason for this is that the idea of drawing block diagrams with abstractions like those of this package can easily be, have been, and will be implemented in other languages than the presently targeted language MetaPost. For example, the implementation\footnote{%
+Note that it is not a well defined language that is implemented, but merely an idea of how to organize the drawing of block diagrams.
+} % The preceding whitespace matters to LaTeX!
+I have been using mostly myself was for the language Drool (written by the author, not yet published). Nevertheless, the present implementation have been used successfully by several others, and support have been provided whenever asked for. Hence, although I am not a user of the package myself, I am convinced that it is truly useful.
+
+\section{This Document and the WWW-Based Documentation}%
+%
+The documentation provided in the appendix is meant to be only a brief summary of the variables and macros defined by the MetaPost-hosted package for drawing block diagrams and bond graphs. Details, illustrations, and examples can be found in the WWW-based documentation, currently available at \href{http://www.control.isy.liu.se/~tidefelt/projects/blockdraw/}{http://www.control.isy.liu.se/$\sim$tidefelt/projects/blockdraw/}. Still, the appendix might be useful as a reference sheet.
+
+\section{Files}%
+%
+The implementation consists of three files, which are located in the \emph{implementation} directory:
+\begin{itemize}
+\item \emph{shiftoff.mp} contains general-purpose macros for placing objects relative to a point. This file is included from \emph{blockdraw.mp}.
+\item \emph{blockdraw.mp} contains the things that are specific to drawing block diagrams.
+\item \emph{bondgraph.mp} contains additional macros that are useful when drawing bond graphs.
+\end{itemize}
+
+The documentation and the sources needed to compile it are located in the \emph{documentation} directory:
+\begin{itemize}
+\item \emph{blockdraw\_mp.tex} is the source of this document.
+\item \emph{blockdraw\_mp.pdf}
+\item \emph{tiddetext.sty} contains various macros used.
+\item \emph{tighttoc.sty} is my ugly solution to make the table of contents consume less vertical space. Perhaps someone would like to have a look at it and make it a proper package\ldots
+\item \emph{cascadedemo.mp} is the source of the first demo figure.
+\item \emph{cascadedemo.pdf}
+\item \emph{bonddemo.mp} is the source of the second demo figure.
+\item \emph{bonddemo.pdf}
+\item \emph{docblockprefs.mp} is a file with settings to be used in block diagrams produces for this document. (Currently, there is only one such figure. A similar file could be creaded for bond diagrams to further emphasize how settings should be factored out in separate files, but I didn't just for brevity.)
+\end{itemize}
+
+% Make sure that the appendix starts at an odd page, so that it can be printed selectively.
+\newpage
+~\\
+\newpage
+
+\appendix
+
+\scriptsize
+
+\section{Miscellaneous macros}
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{mspoint} & ( \varname{con}, \varname{mediation}, \varname{slide} ) & Alternative to \texttt{point\ldots of\ldots}. \\
+ \funname{to\_{}dir} & ( \varname{pt} ) & (Low-level) Converts a direction vector to a direction constant. \\
+ \funname{dir\_{}to} & ( \varname{dir} ) & (Low-level) Converts a direction constant to a direction unit vector. \\
+ \funname{shiftoff} & ( \varname{pic}, \varname{corner} ) & Places \varname{pic} relative to the origin, according to \varname{corner} which shall be a direction constant (see below). \\
+ \funname{shiftoffwlm} & ( \varname{pic}, \varname{corner} ) & Like \funname{shiftoff}, but with ``label margin''. \\
+ \hline
+ \end{tabular}
+\end{center}
+
+\section{Block macros}
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{sizedblock} & ( \varname{pict}, \varname{center}, \varname{rx}, \varname{ry} ) & For subsystems of explicitly specified size. \\
+ \funname{longblock} & ( \varname{pict}, \varname{center} ) & For subsystems. \\
+ \funname{squareblock} & ( \varname{pict}, \varname{center} ) & For simple subsystems. \\
+ \funname{roundblock} & ( \varname{pict}, \varname{center} ) & For, for example, summations. \\
+ \funname{splitdot} & ( \varname{center} ) & A split point, drawn as a dot. \\
+ \funname{termcircle} & ( \varname{center} ) & A connection/terminal point, drawn as a small circle. \\
+ \funname{pointpicture} & ( \varname{center} ) & A <typename>picture</typename> that only serves to define a coordinate pair. \\
+ \funname{conlabel} & ( \varname{shiftdir}, \varname{pict}, \varname{z} ) & Similar to \funname{label}, but honors the \varname{textscale} setting. \\
+ \end{tabular}
+\end{center}
+
+\section{Point macros}
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{leftpoint} & ( \varname{pict}, \varname{total}, \varname{index} ) & For connections on the left side. \\
+ \funname{rightpoint} & ( \varname{pict}, \varname{total}, \varname{index} ) & For connections on the right side. \\
+ \funname{bottompoint} & ( \varname{pict}, \varname{total}, \varname{index} ) & For connections on the bottom side. \\
+ \funname{toppoint} & ( \varname{pict}, \varname{total}, \varname{index} ) & For connections on the top side. \\
+ \end{tabular}
+\end{center}
+
+\section{Connection macros}
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{hhconnect} & ( \varname{point1}, \varname{point2}, \varname{mediation}, \varname{slide} ) & For horizontal to horizontal connections. \\
+ \funname{vvconnect} & ( \varname{point1}, \varname{point2}, \varname{mediation}, \varname{slide} ) & For vertical to vertical connections. \\
+ \funname{hvconnect} & ( \varname{point1}, \varname{point2} ) & For horizontal to vertical connections. \\
+ \funname{vhconnect} & ( \varname{point1}, \varname{point2} ) & For vertical to horizontal connections. \\
+ \funname{connect} & ( \varname{pict1}, \varname{pict2} ) & Automatic side to automatic side. \\
+ \funname{lrconnect} & ( \varname{pict1}, \varname{pict2} ) & Left side to right side. \\
+ \funname{rlconnect} & ( \varname{pict1}, \varname{pict2} ) & Right side to left side. \\
+ \funname{btconnect} & ( \varname{pict1}, \varname{pict2} ) & Bottom side to top side. \\
+ \funname{tbconnect} & ( \varname{pict1}, \varname{pict2} ) & Top side to bottom side. \\
+ \funname{ltconnect} & ( \varname{pict1}, \varname{pict2} ) & Left side to top side. \\
+ \funname{lbconnect} & ( \varname{pict1}, \varname{pict2} ) & Left side to bottom side. \\
+ \funname{rtconnect} & ( \varname{pict1}, \varname{pict2} ) & Right side to top side. \\
+ \funname{rbconnect} & ( \varname{pict1}, \varname{pict2} ) & Right side to bottom side. \\
+ \funname{tlconnect} & ( \varname{pict1}, \varname{pict2} ) & Top side to left side. \\
+ \funname{trconnect} & ( \varname{pict1}, \varname{pict2} ) & Top side to right side. \\
+ \funname{blconnect} & ( \varname{pict1}, \varname{pict2} ) & Bottom side to left side. \\
+ \funname{brconnect} & ( \varname{pict1}, \varname{pict2} ) & Bottom side to right side. \\
+ \funname{llconnect} & ( \varname{pict1}, \varname{pict2}, \varname{slide} ) & Left side to left side. \\
+ \funname{rrconnect} & ( \varname{pict1}, \varname{pict2}, \varname{slide} ) & Right side to right side. \\
+ \funname{bbconnect} & ( \varname{pict1}, \varname{pict2}, \varname{slide} ) & Bottom side to bottom side. \\
+ \funname{ttconnect} & ( \varname{pict1}, \varname{pict2}, \varname{slide} ) & Top side to top side. \\
+ \end{tabular}
+\end{center}
+
+\section{Bond graph macros}%
+%
+The macros \funname{junction} and \funname{junctionlbl} should only be used in the definitions of specialized macros such as \funname{sjunction} and \funname{tfjunction}.
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{junction} & ( \varname{symbol}, \varname{center} ) & Generic junction without parameter. \\
+ \funname{junctionlbl} & ( \varname{symbol}, \varname{arrowdir}, \varname{lbl}, \varname{center}, \varname{drawarrow} ) & Generic junction with parameter. \\
+ \funname{terminal} & ( \varname{shiftdir}, \varname{pict}, \varname{point} ) & Terminal elements. \\
+ \funname{bgconnect} & ( \varname{pica}, \varname{picb} ) & Returns straight path from \varname{pica} to \varname{picb}, assuming that both pictures are circular with radii \varname{smallblockr}. This is similar to the macro \funname{connect} (documented <a href="../connections/">here</a>), which return paths with carpented segments. \\
+ \funname{bond} & ( \varname{pth} ) & Draws the half-arrow. \\
+ \funname{causalmark} & ( \varname{pth}, \varname{where} ) & Draws the causality mark. \varname{where} is a path time, and shall be 0 for the tail and infinity for the head. \\
+ \funname{tbond} & ( \varname{pth} ) & Draws the half-arrow and a causality mark at the tail. \\
+ \funname{hbond} & ( \varname{pth} ) & Draws the half-arrow and a causality mark at the head. \\
+ \funname{terminalto} & ( \varname{jct}, \varname{pict}, \varname{point} ) & Connection points to the junction. \\
+ \funname{terminalfr} & ( \varname{jct}, \varname{pict}, \varname{point} ) & Connection points to the junction. \\
+ \funname{effortlabel} & ( \varname{pth}, \varname{pict} ) & Puts the label (\varname{pict}) on the effort side of the path \varname{pth}. \\
+ \funname{flowlabel} & ( \varname{pth}, \varname{pict} ) & Puts the label (\varname{pict}) on the flow side of the path \varname{pth}. \\
+ \hline
+ \end{tabular}
+\end{center}
+
+\section{Standard user junction definitions}%
+%
+A bond graph application source file should define junction macros compatible with the following table.
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Argument list} & \textbf{Description} \\
+ \hline
+ \hline
+ \funname{sjunction} & ( \varname{center} ) & For serial (type 1) junctions. \\
+ \funname{pjunction} & ( \varname{center} ) & For parallell (type 0) junctions. \\
+ \funname{tfjunction} & ( \varname{center}, \varname{arrowdir}, \varname{lbl} ) & For transformer junctions. \\
+ \funname{gyjunction} & ( \varname{center}, \varname{arrowdir}, \varname{lbl} ) & For gyrator junctions. \\
+ \hline
+ \end{tabular}
+\end{center}
+
+\section{Setting variables}
+
+\begin{center}
+ \begin{tabular}{l c p{5cm}}
+ \hline
+ \textbf{Name} & \textbf{Type} & \textbf{Description} \\
+ \hline
+ \hline
+ \varname{shiftofflabelmargin} & Length & Similar to MetaPost's \varname{labelmargin}. \\
+ \varname{longblockrx} & Length & Horizontal size of standard rectangular blocks. \\
+ \varname{longblockry} & Length & Vertical size of standard rectangular blocks. \\
+ \varname{smallblockr} & Length & Size of square blocks. \\
+ \varname{connectionlw} & Length & Width of connection lines. \\
+ \varname{blocklw} & Length & Width of block frames. \\
+ \varname{textscale} & Scalar & Scaling applied to all labels. \\
+ \varname{implicitdraw} & Boolean & If true, generated objects are drawn before they are returned. \\
+ \varname{junctionimplicitdraw} & Boolean & Like \varname{implicitdraw}, but used in bond graphs. \\
+ \varname{useopenbonds} & Boolean & If true, the asymmetric arrowheads used in bond graphs are not filled. \\
+ \hline
+ \end{tabular}
+\end{center}
+
+\section{Direction constants}
+
+\begin{center}
+ \begin{tabular}{l p{8cm}}
+ \hline
+ \textbf{Name} &\textbf{Description} \\
+ \hline
+ \hline
+ \varname{to\_{}center} & Tells \funname{shiftoff} and \funname{shiftoffwlm} to center an object at the origin. \\
+ \varname{to\_{}lft} & Tells \funname{shiftoff} and \funname{shiftoffwlm} to place an object to the left of the origin, in a fashion analogue to the \varname{lft} suffix on MetaPost's \funname{label} macro. \\
+ \varname{to\_{}ulft} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}top} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}urt} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}rt} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}lrt} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}bot} & Analogue to the corresponding \funname{label} suffix. \\
+ \varname{to\_{}llft} & Analogue to the corresponding \funname{label} suffix. \\
+ \hline
+ \end{tabular}
+\end{center}
+
+\end{document}
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.mp b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.mp
new file mode 100644
index 0000000000..3f74bd9abe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.mp
@@ -0,0 +1,63 @@
+verbatimtex
+%& latex
+\documentclass[a4]{article}
+\begin{document}
+etex
+
+input bondgraph;
+def pjunction(expr z ) =
+ junction( btex p etex, z )
+enddef;
+def sjunction(expr z ) =
+ junction( btex s etex, z )
+enddef;
+def tfjunction(expr z, arrowdir, lbl ) =
+ junctionlbl( btex TF etex, arrowdir, lbl, z, true )
+enddef;
+def gyjunction(expr z, arrowdir, lbl ) =
+ junctionlbl( btex GY etex, arrowdir, lbl, z, false )
+enddef;
+
+beginfig( -1 )
+ numeric u;
+ u := 2cm;
+ ahlength := 0.15*u;
+
+ picture j[];
+ j1 := sjunction( (1u,1u) );
+ j2 := gyjunction( (2u,1u), to_rt, btex $\mu$ etex );
+ j3 := sjunction( (3u,1u) );
+ j4 := tfjunction( (4u,1u), to_rt, btex $r$ etex );
+ j5 := pjunction( (5u,1u) );
+ j6 := sjunction( (5u,-0.5u) );
+ j7 := sjunction( (5u,2u) );
+
+ tbond( bgconnect( j1, j2 ) );
+ hbond( bgconnect( j2, j3 ) );
+ tbond( bgconnect( j3, j4 ) );
+ tbond( bgconnect( j4, j5 ) );
+ hbond( bgconnect( j5, j6 ) );
+ tbond( bgconnect( j5, j7 ) );
+
+ tbond( terminalfr( j1, btex R: $\phi_{1}(\bullet)$ etex, (1u,0u) ) );
+ hbond( terminalfr( j1, btex I: $m_{1}$ etex, (1u,2u) ) );
+ hbond( terminalfr( j3, btex I: $m_{2}$ etex, (3u,2u) ) );
+ tbond( terminalfr( j3, btex R: $R_{2}$ etex, (center j3)+1u*dir(-120) ) );
+ tbond( terminalfr( j3, btex R: $R_{3}$ etex, (center j3)+1u*dir(-60) ) );
+
+ hbond( terminalto( j6, btex $S_{\mathrm{e}}$ etex, (center j6)+(-1u,0u) ) );
+ hbond( terminalfr( j6, btex I: $m_{3}$ etex, (center j6)+(1u,0u) ) );
+
+ tbond( terminalfr( j7, btex C: $C_{1}$ etex, (4u,2u) ) );
+ tbond( terminalfr( j7, btex R: $R_{1}$ etex, (6u,2u) ) );
+
+ path con;
+ picture lab;
+
+ con := terminalto( j1, btex $S_{\mathrm{e}}$ etex, (0u,1u) );
+ hbond( con );
+ flowlabel( con, btex f etex );
+ effortlabel( con, btex e etex );
+
+endfig;
+end;
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.pdf b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.pdf
new file mode 100644
index 0000000000..8613ed3900
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/bonddemo.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.mp b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.mp
new file mode 100644
index 0000000000..26c919bb83
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.mp
@@ -0,0 +1,73 @@
+verbatimtex
+%& latex
+\documentclass[a4]{article}
+\begin{document}
+etex
+
+input blockdraw;
+input ./docblockprefs;
+
+
+beginfig( -1 )
+
+ % The controller box has corners (x1,y1), (x2,y2)
+ % The inner system box has corners (x3,y3), (x4,y4)
+ y1 := -2u;
+ y2 := 1.3u;
+ y3 := -1.4u;
+ y4 := 1u;
+
+ picture reg[];
+ reg1 := longblock( btex Reg.~1 etex, (-1u,0) );
+ reg2 := longblock( btex Reg.~2 etex, (-4u,0) );
+
+ picture G[];
+ G1 := longblock( btex $G_{1}$ etex, (1.5u,0) );
+ G2 := longblock( btex $G_{2}$ etex, (4u,0) );
+
+ picture terminator[];
+ terminator1 := pointpicture( leftpoint( reg2, 2, 2 ) - (1u,0) );
+ terminator2 := pointpicture( (5.5u,0) );
+
+ path con;
+ picture lab;
+
+ con := hhconnect( center( terminator1 ), leftpoint( reg2, 2, 2 ), 0.5, 0 );
+ lab := conlabel( to_ulft, btex $y_{\mathrm{ref}}$ etex, point infinity of con );
+ x1 := xpart( mspoint( con, 0.2, 0 ) );
+
+ con := hhconnect( rightpoint( reg2, 2, 2 ), leftpoint( reg1, 2, 2 ), 0.5, 0 );
+ lab := conlabel( to_urt, btex $z_{\mathrm{ref}}$ etex, point 0 of con );
+ x3 := xpart( mspoint( con, 0.6, 0 ) );
+
+ con := rlconnect( reg1, G1 );
+ lab := conlabel( to_top, btex $u$ etex, mspoint( con, 0.8, 0 ) );
+ x2 := xpart( mspoint( con, 0.3, 0 ) );
+
+ picture split[];
+
+ con := rlconnect( G1, G2 );
+ lab := conlabel( to_top, btex $z$ etex, mspoint( con, 0.8, 0 ) );
+ split1 := splitdot( mspoint( con, 0.3, 0 ) );
+ x4 := xpart( mspoint( con, 0.5, 0 ) );
+
+ con := rlconnect( G2, terminator2 );
+ lab := conlabel( to_top, btex $y$ etex, mspoint( con, 0.8, 0 ) );
+ split2 := splitdot( mspoint( con, 0.4, 0 ) );
+
+ % Draw boxes
+ draw (x1,y1)--(x1,y2)--(x2,y2)--(x2,y1)--cycle withpen pencircle scaled dashlw dashed gldash1;
+ draw (x3,y3)--(x3,y4)--(x4,y4)--(x4,y3)--cycle withpen pencircle scaled dashlw dashed gldash2;
+
+ % Draw broken connections
+ pair p;
+ p := ( x2, 0.5[y1,y3] );
+ con := vhconnect( center split2, p );
+ con := hhconnect( p, leftpoint( reg2, 2, 1 ), 1, 0.4u );
+
+ p := ( x2, 1.5[y1,y3] );
+ con := vhconnect( center split1, p );
+ con := hhconnect( p, leftpoint( reg1, 2, 1 ), 1, 0.4u );
+
+endfig;
+end;
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.pdf b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.pdf
new file mode 100644
index 0000000000..1b7a7aaeae
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/cascadedemo.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/docblockprefs.mp b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/docblockprefs.mp
new file mode 100644
index 0000000000..1aa63c0f01
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/docblockprefs.mp
@@ -0,0 +1,18 @@
+numeric u;
+u := 1cm;
+
+numeric dashlw;
+dashlw := 0.3pt;
+picture gldash[];
+gldash1 := dashpattern( on 0.25u off 0.25u );
+gldash2 := dashpattern( on 0.5u off 0.1u on 0.1u off 0.1u on 0.1u off 0.1u );
+
+longblockrx := 0.7u;
+longblockry := 0.4u;
+smallblockr := 0.3u;
+connectionlw := 0.8pt;
+textscale := 1;
+
+shiftofflabelmargin := 2bboxmargin;
+pickup pencircle scaled connectionlw;
+
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tiddetext.sty b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tiddetext.sty
new file mode 100644
index 0000000000..f3a462b5c4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tiddetext.sty
@@ -0,0 +1,71 @@
+\RequirePackage{xspace}
+
+% label and ref pairs
+\newcommand{\qlabel}[1]{\label{eq:#1}}
+\newcommand{\qref}[1]{\eqref{eq:#1}}
+\newcommand{\Equationref}[1]{Equation~\qref{#1}}
+\newcommand{\equationref}[1]{\qref{#1}}
+\newcommand{\Equationsref}[1]{Equations~\qref{#1}}
+\newcommand{\equationsref}[1]{\qref{#1}}
+
+\newcommand{\fglabel}[1]{\label{fig:#1}}
+\newcommand{\fgref}[1]{\ref{fig:#1}}
+\newcommand{\Figureref}[1]{Figure~\fgref{#1}}
+\newcommand{\figureref}[1]{figure~\fgref{#1}}
+\newcommand{\Figuresref}[1]{Figures~\fgref{#1}}
+\newcommand{\figuresref}[1]{figures~\fgref{#1}}
+
+\newcommand{\tblabel}[1]{\label{fig:#1}}
+\newcommand{\tbref}[1]{\ref{fig:#1}}
+\newcommand{\Tableref}[1]{Table~\tbref{#1}}
+\newcommand{\tableref}[1]{table~\tbref{#1}}
+\newcommand{\Tablesref}[1]{Tables~\tbref{#1}}
+\newcommand{\tablesref}[1]{tables~\tbref{#1}}
+
+\newcommand{\alglabel}[1]{\label{fig:#1}}
+\newcommand{\algref}[1]{\ref{fig:#1}}
+\newcommand{\Algorithmref}[1]{Algorithm~\algref{#1}}
+\newcommand{\algorithmref}[1]{algorithm~\algref{#1}}
+\newcommand{\Algorithmsref}[1]{Algorithms~\algref{#1}}
+\newcommand{\algorithmsref}[1]{algorithms~\algref{#1}}
+
+\newcommand{\chalabel}[1]{\label{fig:#1}}
+\newcommand{\charef}[1]{\ref{fig:#1}}
+\newcommand{\Chapterref}[1]{Chapter~\charef{#1}}
+\newcommand{\chapterref}[1]{chapter~\charef{#1}}
+\newcommand{\Chaptersref}[1]{Chapters~\charef{#1}}
+\newcommand{\chaptersref}[1]{chapters~\charef{#1}}
+
+\newcommand{\seclabel}[1]{\label{fig:#1}}
+\newcommand{\secref}[1]{\ref{fig:#1}}
+\newcommand{\Sectionref}[1]{Section~\secref{#1}}
+\newcommand{\sectionref}[1]{section~\secref{#1}}
+\newcommand{\Sectionsref}[1]{Sections~\secref{#1}}
+\newcommand{\sectionsref}[1]{sections~\secref{#1}}
+
+\newcommand{\applabel}[1]{\label{fig:#1}}
+\newcommand{\appref}[1]{\ref{fig:#1}}
+\newcommand{\Appendixref}[1]{Appendix~\appref{#1}}
+\newcommand{\appendixref}[1]{appendix~\appref{#1}}
+\newcommand{\Appendicesref}[1]{Appendices~\appref{#1}}
+\newcommand{\appendicesref}[1]{appendices~\appref{#1}}
+
+\newcommand{\ost}[1]{\ensuremath{{#1}^{\textrm{st}}}}
+\newcommand{\ond}[1]{\ensuremath{{#1}^{\textrm{nd}}}}
+\newcommand{\ord}[1]{\ensuremath{{#1}^{\textrm{rd}}}}
+\newcommand{\oth}[1]{\ensuremath{{#1}^{\textrm{th}}}}
+
+\newcommand{\abbetc}{etc\xspace}
+\newcommand{\abbie}{i~e\xspace}
+\newcommand{\Matlab}{\textsc{Matlab}\xspace}
+\newcommand{\Mathematica}{\textit{Mathematica}\xspace}
+
+\newenvironment{codeverbatim}%
+ {\hspace{0.05\textwidth}\begin{minipage}[c]{0.95\textwidth}}%
+ {\end{minipage}}
+\newcommand{\inline}[1]{\textnormal{\texttt{#1}}}
+
+\newcommand{\funname}[1]{\textnormal{\texttt{#1}}}
+\newcommand{\typename}[1]{\textnormal{\textbf{\textit{#1}}}}
+\newcommand{\varname}[1]{\textnormal{\textit{#1}}}
+\newcommand{\filename}[1]{\emph{#1}}
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tighttoc.sty b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tighttoc.sty
new file mode 100644
index 0000000000..ebfd73b4f4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/documentation/tighttoc.sty
@@ -0,0 +1,64 @@
+% This package was written for the CTAN submission of the blockdraw_mp documentation source.
+%
+% It is my first package using options...
+%
+% It should be loaded before the parskip package, or else it will not work!
+%
+% Author: Henrik Tidefelt
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tighttoc}[2006/07/18 Tight table of contents]
+
+\RequirePackage{ifthen}
+
+\newcounter{oldtocdepth}
+\newcounter{tighttoctocdepth}
+\newboolean{overridetocdepth}
+\newboolean{bookmarktoc}
+\newboolean{tighttoc}
+\newlength{\tighttocparskipreduction}
+
+\DeclareOption{bookmark}{\setboolean{bookmarktoc}{true}}
+\DeclareOption{nobookmark}{\setboolean{bookmarktoc}{false}}
+\DeclareOption{depthdefault}{\setboolean{overridetocdepth}{false}}
+\DeclareOption{depth0}{\setcounter{tighttoctocdepth}{0}\setboolean{overridetocdepth}{true}}
+\DeclareOption{depth1}{\setcounter{tighttoctocdepth}{1}\setboolean{overridetocdepth}{true}}
+\DeclareOption{depth2}{\setcounter{tighttoctocdepth}{2}\setboolean{overridetocdepth}{true}}
+\DeclareOption{depth3}{\setcounter{tighttoctocdepth}{3}\setboolean{overridetocdepth}{true}}
+\DeclareOption{depth4}{\setcounter{tighttoctocdepth}{4}\setboolean{overridetocdepth}{true}}
+\DeclareOption{0ex}{\setlength{\tighttocparskipreduction}{0ex}}
+\DeclareOption{1ex}{\setlength{\tighttocparskipreduction}{1ex}}
+\DeclareOption{2ex}{\setlength{\tighttocparskipreduction}{2ex}}
+\DeclareOption{3ex}{\setlength{\tighttocparskipreduction}{3ex}}
+
+\ExecuteOptions{bookmark,depthdefault,1ex}
+\ProcessOptions\relax
+
+\let\@oldstarttoc\@starttoc
+
+\renewcommand{\tableofcontents}%
+{%
+ \ifthenelse{\isundefined{\href}}{%
+ % Don't add a bookmark!
+ }{%
+ \ifthenelse{\boolean{bookmarktoc}}{%
+ \pdfbookmark[1]{Contents}{thetocanchor}%
+ }{%
+ % do nothing
+ }%
+ }%
+ \section*{\contentsname}%
+ \addtolength{\parskip}{-\tighttocparskipreduction}%
+ \setcounter{oldtocdepth}{\value{tocdepth}}%
+ \ifthenelse{\boolean{overridetocdepth}}{%
+ \setcounter{tocdepth}{\thetighttocdepth} % limit the depth of the conents tree
+ }{%
+ % do nothing
+ }%
+ \makeatletter
+ \@oldstarttoc{toc}%
+ \makeatother
+ \setcounter{tocdepth}{\value{oldtocdepth}}%
+ \addtolength{\parskip}{\tighttocparskipreduction}%
+}
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/implementation/blockdraw.mp b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/blockdraw.mp
new file mode 100644
index 0000000000..1396f574ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/blockdraw.mp
@@ -0,0 +1,310 @@
+%% blockdraw.mp
+%% Copyright 2006 Henrik Tidefelt
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained´.
+%
+% The Current Maintainer of this work is Henrik Tidefelt,
+% tidefelt@isy.liu.se.
+%
+% This work, referred to as blockdraw.mp, consists of the files
+% shiftoff.mp
+% blockdraw.mp
+% bondgraph.mp
+% blockdraw_mp.pdf
+
+numeric longblockrx;
+numeric longblockry;
+numeric smallblockr;
+longblockrx := 0.7cm;
+longblockry := 0.4cm;
+smallblockr := 0.3cm;
+
+numeric connectionlw;
+numeric blocklw;
+connectionlw := 0.8pt;
+blocklw = connectionlw;
+
+numeric textscale;
+textscale := 1;
+
+boolean implicitdraw;
+implicitdraw := true;
+
+input shiftoff;
+
+def sizedblock(expr txt, z, rx, ry ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+ addto tmppic doublepath (-rx,-ry)--(-rx,ry)--(rx,ry)--(rx,-ry)--cycle withpen pencircle scaled blocklw;
+ tmppic := tmppic shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def longblock(expr txt, z ) =
+ sizedblock( txt, z, longblockrx, longblockry )
+enddef;
+def squareblock(expr txt, z ) =
+ sizedblock( txt, z, smallblockr, smallblockr )
+enddef;
+def roundblock(expr txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+ addto tmppic doublepath (smallblockr,0)...(0,smallblockr)...(-smallblockr,0)...(0,-smallblockr)...cycle withpen pencircle scaled blocklw;
+ tmppic := tmppic shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def splitdot(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic contour fullcircle scaled 2.5connectionlw shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def termcircle(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic doublepath fullcircle scaled 7connectionlw shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def pointpicture(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic contour fullcircle scaled 0 shifted z;
+ tmppic
+ endgroup
+enddef;
+
+def mspoint( expr pth, mediation, slide ) =
+(point (arctime mediation * arclength(pth) + slide of pth) of pth)
+enddef;
+def hhconnect(expr pa, pb, mediation, slide ) =
+ begingroup
+ save mid, respath;
+ numeric mid;
+ path respath;
+ mid := (mediation)[ xpart pa, xpart pb ] + (if (xpart pb) > (xpart pa): 1 else: -1 fi) * slide;
+ respath := pa--( mid, ypart pa )--( mid, ypart pb )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def vvconnect(expr pa, pb, mediation, slide ) =
+ begingroup
+ save mid, respath;
+ numeric mid;
+ path respath;
+ mid := (mediation)[ ypart pa, ypart pb ] + (if (ypart pb) > (ypart pa): 1 else: -1 fi) * slide;
+ respath := pa--( xpart pa, mid )--( xpart pb, mid )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def hvconnect(expr pa, pb ) =
+ begingroup
+ save respath;
+ path respath;
+ respath := pa--( xpart pb, ypart pa )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def vhconnect(expr pa, pb ) =
+ begingroup
+ save respath;
+ path respath;
+ respath := pa--( xpart pa, ypart pb )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+
+def conlabel(expr shiftdir, txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := shiftoffwlm( txt scaled textscale, shiftdir ) shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+
+def leftpoint(expr pic, n, i ) =
+ (i/(n+1))[llcorner pic,ulcorner pic]
+enddef;
+def rightpoint(expr pic, n, i ) =
+ (i/(n+1))[lrcorner pic,urcorner pic]
+enddef;
+def bottompoint(expr pic, n, i ) =
+ (i/(n+1))[llcorner pic,lrcorner pic]
+enddef;
+def toppoint(expr pic, n, i ) =
+ (i/(n+1))[ulcorner pic,urcorner pic]
+enddef;
+def llconnect(expr pica, picb, slide ) =
+ begingroup
+ hhconnect( leftpoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def rrconnect(expr pica, picb, slide ) =
+ begingroup
+ hhconnect( rightpoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def ttconnect(expr pica, picb, slide ) =
+ begingroup
+ vvconnect( toppoint( pica, 1, 1 ), toppoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def bbconnect(expr pica, picb, slide ) =
+ begingroup
+ vvconnect( bottompoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def lrconnect(expr pica, picb ) =
+ begingroup
+ hhconnect( leftpoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def rlconnect(expr pica, picb ) =
+ begingroup
+ hhconnect( rightpoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def btconnect(expr pica, picb ) =
+ begingroup
+ vvconnect( bottompoint( pica, 1, 1 ), toppoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def tbconnect(expr pica, picb ) =
+ begingroup
+ vvconnect( toppoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def ltconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( leftpoint( pica, 1, 1 ), toppoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def lbconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( leftpoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def rtconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( rightpoint( pica, 1, 1 ), toppoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def rbconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( rightpoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def tlconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( toppoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def trconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( toppoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def blconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( bottompoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def brconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( bottompoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+
+def connect(expr pica, picb ) =
+ begingroup
+ save rxa, rya, rxb, ryb;
+ numeric rxa;
+ numeric rya;
+ numeric rxb;
+ numeric ryb;
+ save ca, cb;
+ pair ca;
+ pair cb;
+ rxa = 0.5 * ((xpart lrcorner pica) - (xpart llcorner pica));
+ rya = 0.5 * ((ypart ulcorner pica) - (ypart llcorner pica));
+ rxb = 0.5 * ((xpart lrcorner picb) - (xpart llcorner picb));
+ ryb = 0.5 * ((ypart ulcorner picb) - (ypart llcorner picb));
+ ca = center pica;
+ cb = center picb;
+ if (xpart ca) < (xpart cb) - ( rxa + rxb ):
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ rbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ rtconnect( pica, picb )
+ else:
+ rlconnect( pica, picb )
+ fi
+ elseif (xpart ca) > (xpart cb) + ( rxa + rxb ):
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ lbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ ltconnect( pica, picb )
+ else:
+ lrconnect( pica, picb )
+ fi
+ else:
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ tbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ btconnect( pica, picb )
+ else:
+ hvconnect( center pica, center picb )
+ fi
+ fi
+ endgroup
+enddef;
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/implementation/bondgraph.mp b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/bondgraph.mp
new file mode 100644
index 0000000000..ba5d861d14
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/bondgraph.mp
@@ -0,0 +1,226 @@
+%% bondgraph.mp
+%% Copyright 2007 Henrik Tidefelt
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained´.
+%
+% The Current Maintainer of this work is Henrik Tidefelt,
+% tidefelt@isy.liu.se.
+%
+% This work, referred to as blockdraw.mp, consists of the files
+% shiftoff.mp
+% blockdraw.mp
+% bondgraph.mp
+% blockdraw_mp.pdf
+%
+%
+% === Notes regarding the backward incompatible changes of 2007-01-21. ===
+%
+% As it was discovered that MetaPost uses the verbatimtex construct only in
+% the file it appears in, it was concluded that package files cannot contain
+% any content that depends on the LaTeX preamble. In other words, any
+% btex ... etex constructs must be moved from package files to the application
+% sources from where the package files are included.
+%
+% With the definition of, say, p-junction blocks in the application source,
+% it is easy to change notation from the letters "p" and "s" to the numbers
+% "0" and "1".
+%
+% The obvious drawback, beside backward incompatibility, is that this will
+% cause a lot of code replication, making bond graph source files
+% less concise, and require multiple file search-and-replace actions when
+% changing junction notation for a collection of graphs. However, since
+% MetaPost only allows literal character strings in the btex ... etex
+% construct, these inconveniences seem impossible to work around. Ideas,
+% anyone?
+
+input blockdraw;
+implicitdraw := false;
+
+boolean junctionimplicitdraw;
+junctionimplicitdraw := true;
+
+boolean useopenbonds;
+useopenbonds := false;
+
+connectionlw := 0.5pt;
+ahlength := 3mm;
+bboxmargin := 1.5mm;
+
+def withbbmargin(expr pic ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic = pic;
+ setbounds tmppic to bbox pic;
+ tmppic
+ endgroup
+enddef;
+
+def junction(expr txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+ setbounds tmppic to (-smallblockr,-smallblockr)--(-smallblockr,smallblockr)--(smallblockr,smallblockr)--(smallblockr,-smallblockr)--cycle;
+ tmppic := tmppic shifted z;
+ if junctionimplicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+
+
+def junctionlbl(expr txt, arrowdir, lbl, z, arrow ) =
+ begingroup
+ save tmppic, ahlength, p, d;
+ ahlength := 1mm;
+ path p;
+ numeric d;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+
+ if arrowdir = to_top:
+ p := ((lrcorner tmppic)--(urcorner tmppic)) shifted ( z + (connectionlw + 2*ahlength*sind(0.5*ahangle),0) );
+ d = to_rt;
+ elseif arrowdir = to_lft:
+ p := ((urcorner tmppic)--(ulcorner tmppic)) shifted ( z + (0,connectionlw + 2*ahlength*sind(0.5*ahangle)) );
+ d = to_top;
+ elseif arrowdir = to_bot:
+ p := ((urcorner tmppic)--(lrcorner tmppic)) shifted ( z + (connectionlw + 2*ahlength*sind(0.5*ahangle),0) );
+ d = to_rt;
+ elseif arrowdir = to_rt:
+ p := ((ulcorner tmppic)--(urcorner tmppic)) shifted ( z + (0,connectionlw + 2*ahlength*sind(0.5*ahangle)) );
+ d = to_top;
+ fi
+
+ setbounds tmppic to (-smallblockr,-smallblockr)--(-smallblockr,smallblockr)--(smallblockr,smallblockr)--(smallblockr,-smallblockr)--cycle;
+ tmppic := tmppic shifted z;
+
+ if junctionimplicitdraw:
+ if arrow:
+ drawarrow p withpen pencircle scaled connectionlw;
+ fi
+ draw conlabel( d, lbl, mspoint( p, 0.5, 0 ) );
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+
+def terminal(expr d, txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := shiftoff( withbbmargin( txt scaled textscale ), d ) shifted ( z - smallblockr * dir_to( d ) );
+ if junctionimplicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+
+def ignorepicture(expr pic ) =
+ show 0
+enddef;
+
+def terminalto(expr j, txt, z ) =
+ begingroup
+ ignorepicture( terminal( to_dir( z - (center j) ), txt, z ) );
+ bgconnect( pointpicture( z ) , j )
+ endgroup
+enddef;
+
+def terminalfr(expr j, txt, z ) =
+ begingroup
+ ignorepicture( terminal( to_dir( z - (center j) ), txt, z ) );
+ bgconnect( j, pointpicture( z ) )
+ endgroup
+enddef;
+
+def bgconnect(expr pica, picb ) =
+ begingroup
+ save d;
+ pair d;
+ if (center pica) = (center picb):
+ d := (1,0);
+ else:
+ d := unitvector( (center picb) - (center pica) );
+ fi
+ ((center pica)+d*smallblockr)--((center picb)-d*smallblockr)
+ endgroup
+enddef;
+
+def bond(expr p ) =
+ begingroup
+ save t;
+ numeric t;
+ t := arctime arclength(p) - ahlength of p;
+ save z;
+ pair z;
+ z = (point t of p) + dir(angle(direction t of p)+90) * ahlength*sind(0.5*ahangle);
+ save res;
+ path res;
+ if useopenbonds:
+ draw p--z withpen pencircle scaled connectionlw
+ else:
+ draw p withpen pencircle scaled connectionlw;
+ res = (subpath (t,infinity) of p)--z--cycle;
+ filldraw res withpen pencircle scaled connectionlw
+ fi
+ endgroup
+enddef;
+
+def causalmark(expr p, where ) =
+ begingroup
+ save d;
+ numeric d;
+ d = angle( direction where of p );
+ if where = 0:
+ d := d + 180;
+ fi
+ save z;
+ pair z;
+ z = ( point where of p ) + dir(d) * connectionlw;
+ save res;
+ path res;
+ res = (z+dir(d+90)*ahlength*sind(0.5*ahangle))--(z+dir(d-90)*ahlength*sind(0.5*ahangle));
+ draw res withpen pencircle scaled (2*connectionlw)
+ endgroup
+enddef;
+
+def hbond(expr p ) =
+ begingroup
+ bond( p );
+ causalmark( p, infinity )
+ endgroup
+enddef;
+
+def tbond(expr p ) =
+ begingroup
+ bond( p );
+ causalmark( p, 0 )
+ endgroup
+enddef;
+
+def flowlabel(expr p, txt ) =
+% the midpoint has typically singular direction, so we can't do the obvious:
+% draw( conlabel( to_dir( dir( angle( direction (0.5*length(p)) of p ) - 90 ) ), txt, mspoint( p, 0.5, 0 ) ) )
+ draw conlabel( to_dir( dir( angle( (point infinity of p) - (point 0 of p) ) - 90 ) ), txt, mspoint( p, 0.5, 0 ) ) withpen pencircle scaled connectionlw
+enddef;
+
+def effortlabel(expr p, txt ) =
+% the midpoint has typically singular direction, so we can't do the obvious:
+% draw( conlabel( to_dir( dir( angle( direction (0.5*length(p)) of p ) + 90 ) ), txt, mspoint( p, 0.5, 0 ) ) )
+ draw conlabel( to_dir( dir( angle( (point infinity of p) - (point 0 of p) ) + 90 ) ), txt, mspoint( p, 0.5, 0 ) ) withpen pencircle scaled connectionlw
+enddef;
diff --git a/graphics/metapost/contrib/macros/blockdraw_mp/implementation/shiftoff.mp b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/shiftoff.mp
new file mode 100644
index 0000000000..b5ad73f834
--- /dev/null
+++ b/graphics/metapost/contrib/macros/blockdraw_mp/implementation/shiftoff.mp
@@ -0,0 +1,130 @@
+%% shiftoff.mp
+%% Copyright 2006 Henrik Tidefelt
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained´.
+%
+% The Current Maintainer of this work is Henrik Tidefelt,
+% tidefelt@isy.liu.se.
+%
+% This work, referred to as blockdraw.mp, consists of the files
+% shiftoff.mp
+% blockdraw.mp
+% bondgraph.mp
+% blockdraw_mp.pdf
+
+numeric to_lft;
+to_lft = 0;
+numeric to_llft;
+to_llft = 1;
+numeric to_bot;
+to_bot = 2;
+numeric to_lrt;
+to_lrt = 3;
+numeric to_rt;
+to_rt = 4;
+numeric to_urt;
+to_urt = 5;
+numeric to_top;
+to_top = 6;
+numeric to_ulft;
+to_ulft = 7;
+numeric to_center;
+to_center = 8;
+
+def to_dir(expr z ) =
+ if (xpart z) > 0:
+ if (ypart z) > 0:
+ if abs(xpart z) > 2*abs(ypart z):
+ to_rt
+ elseif abs(ypart z) > 2*abs(xpart z):
+ to_top
+ else:
+ to_urt
+ fi
+ else:
+ if abs(xpart z) > 2*abs(ypart z):
+ to_rt
+ elseif abs(ypart z) > 2*abs(xpart z):
+ to_bot
+ else:
+ to_lrt
+ fi
+ fi
+ else:
+ if (ypart z) > 0:
+ if abs(xpart z) > 2*abs(ypart z):
+ to_lft
+ elseif abs(ypart z) > 2*abs(xpart z):
+ to_top
+ else:
+ to_ulft
+ fi
+ else:
+ if abs(xpart z) > 2*abs(ypart z):
+ to_lft
+ elseif abs(ypart z) > 2*abs(xpart z):
+ to_bot
+ else:
+ to_llft
+ fi
+ fi
+ fi
+enddef;
+
+def dir_to(expr d ) =
+ dir( 180 + d * 45 )
+enddef;
+
+def shiftoff(expr pic, corner ) =
+ if corner = to_lft:
+ (pic shifted ((-center pic)+((xpart llcorner pic)-(xpart center pic),0)))
+ elseif corner = to_llft:
+ (pic shifted ((-center pic)+(llcorner pic)-(center pic)))
+ elseif corner = to_bot:
+ (pic shifted ((-center pic)+(0,(ypart llcorner pic)-(ypart center pic))))
+ elseif corner = to_lrt:
+ (pic shifted ((-center pic)+(lrcorner pic)-(center pic)))
+ elseif corner = to_rt:
+ (pic shifted ((-center pic)+((xpart lrcorner pic)-(xpart center pic),0)))
+ elseif corner = to_urt:
+ (pic shifted ((-center pic)+(urcorner pic)-(center pic)))
+ elseif corner = to_top:
+ (pic shifted ((-center pic)+(0,(ypart ulcorner pic)-(ypart center pic))))
+ elseif corner = to_ulft:
+ (pic shifted ((-center pic)+(ulcorner pic)-(center pic)))
+ else:
+ (pic shifted (-center pic))
+ fi
+enddef;
+
+numeric shiftofflabelmargin;
+shiftofflabelmargin := bboxmargin;
+def shiftoffwlm(expr pic, corner ) =
+ if corner = to_lft:
+ (pic shifted ((-center pic)+((xpart llcorner pic)-(xpart center pic),0)+(-shiftofflabelmargin,0)))
+ elseif corner = to_llft:
+ (pic shifted ((-center pic)+(llcorner pic)-(center pic)+(-shiftofflabelmargin,-shiftofflabelmargin)))
+ elseif corner = to_bot:
+ (pic shifted ((-center pic)+(0,(ypart llcorner pic)-(ypart center pic))+(0,-shiftofflabelmargin)))
+ elseif corner = to_lrt:
+ (pic shifted ((-center pic)+(lrcorner pic)-(center pic)+(shiftofflabelmargin,-shiftofflabelmargin)))
+ elseif corner = to_rt:
+ (pic shifted ((-center pic)+((xpart lrcorner pic)-(xpart center pic),0)+(shiftofflabelmargin,0)))
+ elseif corner = to_urt:
+ (pic shifted ((-center pic)+(urcorner pic)-(center pic)+(shiftofflabelmargin,shiftofflabelmargin)))
+ elseif corner = to_top:
+ (pic shifted ((-center pic)+(0,(ypart ulcorner pic)-(ypart center pic))+(0,shiftofflabelmargin)))
+ elseif corner = to_ulft:
+ (pic shifted ((-center pic)+(ulcorner pic)-(center pic)+(-shiftofflabelmargin,shiftofflabelmargin)))
+ else:
+ (pic shifted (-center pic))
+ fi
+enddef;
diff --git a/graphics/metapost/contrib/macros/bpolynomial/CHANGES b/graphics/metapost/contrib/macros/bpolynomial/CHANGES
new file mode 100644
index 0000000000..6b935bdab0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/CHANGES
@@ -0,0 +1,28 @@
+Version 0.5 released on 2007-12-12:
+* New:
+ + The package can now compute paths of square and cubic roots.
+ + Added a plain interface.
+ + Improved documentation.
+
+
+Version 0.4 released on 2007-11-28:
+* New:
+ + The package can now compute paths of derivatives and tangents.
+ + Improved documentation.
+
+
+Version 0.3 released on 2007-11-26:
+* Changed:
+ + Improved documentation.
+ + Slightly improved numeric stability.
+
+
+Version 0.2 pre-released on 2007-11-25:
+* New:
+ + Added documentation.
+* Changed:
+ + New user-interface.
+
+
+Version 0.1 of 2007-11-24:
+* First working version.
diff --git a/graphics/metapost/contrib/macros/bpolynomial/README b/graphics/metapost/contrib/macros/bpolynomial/README
new file mode 100644
index 0000000000..8562f37814
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/README
@@ -0,0 +1,41 @@
+% This material is subject to the LaTeX Project Public License. See
+% http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+% for the details of that license.
+
+package: bpolynomial v0.5 2007/12/12
+author: Stephan Hennig (stephanhennig@arcor.de)
+
+
+Description
+-----------
+The MetaPost package bpolynomial helps drawing polynomial functions
+of up to degree three. It provides macros to calculate Bezier curves
+exactly matching a given constant, linear, quadratic or cubic polynomial.
+Additionally, paths of derivatives and tangents can be calculated.
+
+
+Installation
+------------
+To install the package put the files into the following
+directories in a local texmf tree and update the file
+name data base.
+
+<localtexmftree>/doc/metapost/bpolynomial:
+ bpolynomial.pdf
+ bpolynomial.tex
+ examples.mp
+ README
+ CHANGES
+ TODO
+
+<localtexmftree>/metapost/bpolynomial:
+ bpolynomial.mp
+
+
+Usage Notes
+-----------
+See file bpolynomial.pdf.
+
+
+Happy TeXing!
+Stephan Hennig
diff --git a/graphics/metapost/contrib/macros/bpolynomial/TODO b/graphics/metapost/contrib/macros/bpolynomial/TODO
new file mode 100644
index 0000000000..fcfc73a622
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/TODO
@@ -0,0 +1,3 @@
+* Approximation of arbitrary polynomials by multi-segment Bezier curves.
+
+Contributions are welcome!
diff --git a/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.mp b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.mp
new file mode 100644
index 0000000000..e4f27a434a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.mp
@@ -0,0 +1,302 @@
+%%% bpolynomial.mp
+%%% Copyright 2007 Stephan Hennig <stephanhennig@arcor.de>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+
+%%% Identify yourself.
+if known bpolynomial_fileversion: endinput fi;
+string bpolynomial_fileversion;
+bpolynomial_fileversion := "v0.5 (2007/12/12)";
+message "Loading bpolynomial " & bpolynomial_fileversion;
+
+
+%%% Main user macro for defining polynomials.
+%%% Arguments are a suffix and the coefficients
+%%% of the function a*x^3 + b*x^2 + c*x + d.
+vardef newBPolynomial@#(expr a, b, c, d)=
+ bpolynomial__defineBPolynomial.@#(a, b, c, d);
+ bpolynomial__defineBPolynomial.@#'(0, 3a, 2b, c);
+ bpolynomial__defineBPolynomial.@#''(0, 0, 6a, 2b);
+ bpolynomial__defineBPolynomial.@#'''(0, 0, 0, 6a);
+enddef;
+
+
+%%% This macro returns the path of a Bezier curve that matches
+%%% a function a*x^3 + b*x^2 + c*x + d between two points A and D.
+%%% This macro is the heart of this package and is used by
+%%% several other macros.
+%%% Arguments are the coefficients of the polynomial and the
+%%% start and end point of the graph/path.
+vardef bpolynomial__getBezierFromPolynomial(expr a, b, c, d, A, D)=
+save xA,xB,xC,xD,yA,yB,yC,yD;
+save xl,yl,xr,yr,dx;
+numeric xA,xB,xC,xD,yA,yB,yC,yD;
+numeric xl,yl,xr,yr,dx;
+ xl := xpart A;
+ yl := ypart A;
+ xr := xpart D;
+ yr := ypart D;
+ dx := xpart D - xpart A;
+ %%% Original equation system for x values.
+% xA = xl;
+% 3(xB - xA) = dx;
+% 3(xC - 2xB + xA) = 0;
+% xD - 3xC + 3xB - xA = 0;
+ %%% Modified equation system.
+ xA := xl;
+ xB := xl + dx/3;
+ xC := xr - dx/3;
+ xD := xr;
+ %%% Original equation system for y values.
+% yA = ((a*xl + b)*xl + c)*xl + d;
+% 3(yB - yA) = dx*((3a*xl + 2b)*xl + c);
+% 3(yC - 2yB + yA) = dx*dx*(3a*xl + b);
+% yD - 3yC + 3yB - yA = a*dx*dx*dx;
+ %%% Modified equation system.
+ yA := yl;
+ 3(yB - yA) = dx*((3a*xl + 2b)*xl + c);
+ 3(yC - 2yB + yA) = dx*dx*(3a*xl + b);
+ yD := yr;
+ %%% Return path A..controls B and C..D.
+ (xA,yA)..controls (xB,yB) and (xC,yC)..(xD,yD)
+enddef;
+
+
+%%% This macro returns the path of a Bezier curve that matches
+%%% a function a*x^3 + b*x^2 + c*x + d in the range [xl, xr].
+%%% Arguments are the coefficients of the polynomial and the
+%%% range boundaries of the graph/path.
+vardef getBezierFromPolynomial(expr a, b, c, d, xl, xr)=
+ bpolynomial__getBezierFromPolynomial(a, b, c, d,
+ (xl, ((a*xl+b)*xl+c)*xl+d),
+ (xr, ((a*xr+b)*xr+c)*xr+d))
+enddef;
+
+
+%%% This macro returns the path of a Bezier curve that matches
+%%% a function a*x^3 + b*x^2 + c*x + d in the range [xl, xr].
+%%% Arguments are the coefficients of the polynomial and the
+%%% range boundaries of the graph/path.
+vardef getBezierFromSqrRoot(expr u, v, w, xl, xr)=
+save yl, yr;
+numeric yl,yr;
+ if (xl >= -v):
+ yl := xl;
+ else:
+ message "Package bpolynomial warning: Replacing lower range boundary " & decimal xl & " by " & decimal -v & "!";
+ yl := -v;
+ fi
+ if (xr >= -v):
+ yr := xr;
+ else:
+ message "Package bpolynomial warning: Replacing upper range boundary " & decimal xr & " by " & decimal -v & "!";
+ yr := -v;
+ fi
+ bpolynomial__getBezierFromPolynomial(0, 1/u/u, -2*w/u/u, (w/u)*(w/u)-v,
+ (u*sqrt(yl+v)+w, yl),
+ (u*sqrt(yr+v)+w, yr)) reflectedabout ((0,0),(1,1))
+enddef;
+
+
+%%% This macro returns the path of a Bezier curve that matches
+%%% a function a*x^3 + b*x^2 + c*x + d in the range [xl, xr].
+%%% Arguments are the coefficients of the polynomial and the
+%%% range boundaries of the graph/path.
+vardef getBezierFromCubRoot(expr u, v, w, xl, xl)=
+save yl, yr;
+numeric yl,yr;
+ if (xl >= -v):
+ yl := xl;
+ else:
+ message "Package bpolynomial warning: Replacing lower range boundary " & decimal xl & " by " & decimal -v & "!";
+ yl := -v;
+ fi
+ if (xr >= -v):
+ yr := xr;
+ else:
+ message "Package bpolynomial warning: Replacing upper range boundary " & decimal xr & " by " & decimal -v & "!";
+ yr := -v & "!";
+ fi
+ bpolynomial__getBezierFromPolynomial(1/u/u/u, -3w/u/u/u, 3(w/u)*(w/u)/u, (w/u)*(w/u)*(w/u)-v,
+ (u*((yl+v)**(1/3))+w, yl),
+ (u*((yr+v)**(1/3))+w, yr)) reflectedabout ((0,0),(1,1))
+enddef;
+
+
+%%% This internal macro defines a new polynomial.
+%%% Arguments are a suffix macro and the coefficients
+%%% of the polynomial a*x^3 + b*x^2 + c*x + d.
+vardef bpolynomial__defineBPolynomial@#(expr ca,cb,cc,cd)=
+numeric @#.a, @#.b, @#.c, @#.d;
+ %%% Save coefficients for later access.
+ %%% Variable @#.a refers to coefficient a of polynomial @#.
+ @#.a := ca;
+ @#.b := cb;
+ @#.c := cc;
+ @#.d := cd;
+
+ %%% This macro returns values of polynomial @#.
+ %%% Argument is an x value.
+ vardef @#.eval(expr x)=
+ (((@#.a*x + @#.b)*x + @#.c)*x + @#.d)
+ enddef;
+
+ %%% This macro returns the path corresponding to polynomial @#
+ %%% on the intervall [xl, xr].
+ vardef @#.getPath(expr xl,xr)=
+ bpolynomial__getBezierFromPolynomial(@#.a, @#.b, @#.c, @#.d, (xl, @#.eval(xl)), (xr, @#.eval(xr)))
+ enddef;
+
+ %%% This macro returns a path tangent to @# at point (x, f(x))
+ %%% covering the interval [x+xm, x+xp].
+ vardef @#.getTangent(expr x, xm, xp)=
+ save m, y;
+ numeric m, y;
+ m := (3@#.a*x + 2@#.b)*x + @#.c;
+ y := @#.eval(x);
+ (x+xm, y + m*xm) -- (x+xp, y + m*xp)
+ enddef;
+
+enddef;
+
+
+%%% This macro defines a new square root.
+%%% Arguments are a suffix macro and the parameters
+%%% of the function u*(x + v)^(1/2) + w.
+vardef newBSqrRoot@#(expr cu,cv,cw)=
+numeric @#.a, @#.b, @#.c, @#.d;
+numeric @#.u, @#.v, @#.w;
+ %%% Save parameters for later access.
+ %%% Variable @#.v refers to parameters of square root @#.
+ %%% Variables @#.a to @#.d store the coefficients of the
+ %%% corresponding polynomial.
+ @#.u := cu;
+ @#.v := cv;
+ @#.w := cw;
+ @#.a := 0;
+ @#.b := 1/cu/cu;
+ @#.c := -2*cw/cu/cu;
+ @#.d := (cw/cu)*(cw/cu)-cv;
+
+ %%% This macro returns values of polynomial @#.
+ %%% Argument is an x value.
+ vardef @#.eval(expr x)=
+ if (x >= -@#.v):
+ @#.u*sqrt(x + @#.v) + @#.w
+ else:
+ message "Package bpolynomial warning: Cannot evaluate function at x = " & decimal x & "!";
+ @#.w
+ fi
+ enddef;
+
+ %%% This macro returns the path corresponding to square root @#
+ %%% on the intervall [yl, yr]. The path of the corresponing
+ %%% polynomial is computed and then transformed.
+ vardef @#.getPath(expr xl,xr)=
+ save yl, yr;
+ numeric yl, yr;
+ if (xl >= -@#.v):
+ yl := xl;
+ else:
+ message "Package bpolynomial warning: Replacing lower range boundary " & decimal xl & " by " & decimal -@#.v & "!";
+ yl := -@#.v;
+ fi
+ if (xr >= -@#.v):
+ yr := xr;
+ else:
+ message "Package bpolynomial warning: Replacing upper range boundary " & decimal xr & " by " & decimal -@#.v & "!";
+ yr := -@#.v;
+ fi
+ bpolynomial__getBezierFromPolynomial(@#.a, @#.b, @#.c, @#.d, (@#.eval(yl), yl), (@#.eval(yr), yr))
+ reflectedabout ((0,0),(1,1))
+ enddef;
+
+ %%% This macro returns a path tangent to square root @#
+ %%% at point (x, f(x)) covering the interval [x+xm, x+xp].
+ vardef @#.getTangent(expr x, epsl, epsr)=
+ save m, y;
+ numeric m, y;
+ if (x >= -@#.v):
+ m := @#.u/(2sqrt(x + @#.v));
+ y := @#.eval(x);
+ (x+epsl, y + m*epsl) -- (x+epsr, y + m*epsr)
+ else:
+ message "Package bpolynomial warning: Cannot draw tangent at x = " & decimal x & "!";
+ (-@#.v, @#.w)--(-@#.v, @#.w+1)
+ fi
+ enddef;
+
+enddef;
+
+
+%%% This macro defines a new cubic root.
+%%% Arguments are a suffix macro and the parameters
+%%% of the function u*(x + v)^(1/3) + w.
+vardef newBCubRoot@#(expr cu,cv,cw)=
+numeric @#.a, @#.b, @#.c, @#.d;
+numeric @#.u, @#.v, @#.w;
+ %%% Save parameters for later access.
+ %%% Variable @#.v refers to parameters of cubic root @#.
+ %%% Variables @#.a to @#.d store the coefficients of the
+ %%% corresponding polynomial.
+ @#.u := cu;
+ @#.v := cv;
+ @#.w := cw;
+ @#.a := 1/cu/cu/cu;
+ @#.b := -3cw/cu/cu/cu;
+ @#.c := 3(cw/cu)*(cw/cu)/cu;
+ @#.d := (cw/cu)*(cw/cu)*(cw/cu)-cv;
+
+ %%% This macro returns values of polynomial @#.
+ %%% Argument is an x value.
+ vardef @#.eval(expr x)=
+ if (x >= -@#.v):
+ @#.u*((x+@#.v)**(1/3)) + @#.w
+ else:
+ message "Package bpolynomial warning: Cannot evaluate function at x = " & decimal x & "!";
+ @#.w
+ fi
+ enddef;
+
+ %%% This macro returns the path corresponding to cubic root @#
+ %%% on the intervall [yl, yr]. The path of the corresponing
+ %%% polynomial is computed and then transformed.
+ vardef @#.getPath(expr xl,xr)=
+ save yl, yr;
+ numeric yl, yr;
+ if (xl >= -@#.v):
+ yl := xl;
+ else:
+ message "Package bpolynomial warning: Replacing lower range boundary " & decimal xl & " by " & decimal -@#.v & "!";
+ yl := -@#.v;
+ fi
+ if (xr >= -@#.v):
+ yr := xr;
+ else:
+ message "Package bpolynomial warning: Replacing upper range boundary " & decimal xr & " by " & decimal -@#.v & "!";
+ yr := -@#.v;
+ fi
+ bpolynomial__getBezierFromPolynomial(@#.a, @#.b, @#.c, @#.d, (@#.eval(yl), yl), (@#.eval(yr), yr))
+ reflectedabout ((0,0),(1,1))
+ enddef;
+
+ %%% This macro returns a path tangent to cubic root @#
+ %%% at point (x, f(x)) covering the interval [x+xm, x+xp].
+ vardef @#.getTangent(expr x, epsl, epsr)=
+ save m, y;
+ numeric m, y;
+ if (x >= -@#.v):
+ m := @#.u/3/((x + @#.v)**(2/3));
+ y := @#.eval(x);
+ (x+epsl, y + m*epsl) -- (x+epsr, y + m*epsr)
+ else:
+ message "Package bpolynomial warning: Cannot draw tangent at x = " & decimal x & "!";
+ (-@#.v, @#.w)--(-@#.v, @#.w+1)
+ fi
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.pdf b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.pdf
new file mode 100644
index 0000000000..42e5439106
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.tex b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.tex
new file mode 100644
index 0000000000..6b8141233d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/bpolynomial.tex
@@ -0,0 +1,659 @@
+%%% bpolynomial.tex
+%%% Copyright 2007 Stephan Hennig <stephanhennig@arcor.de>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+\RequirePackage[resetfonts]{cmap}
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage{ae}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\newcommand*{\cmd}[1]{\texttt{#1}}
+\newcommand*{\name}[1]{\textsf{#1}}
+\newcommand*{\pkg}{\name{bpolynomial}}
+\newcommand{\user}[1]{\emph{#1}}
+\newcommand*{\B}{B\'ezier}
+\usepackage{xcolor}
+\colorlet{framecol}{black!50}
+\usepackage{listings}
+\lstloadlanguages{MetaPost,[LaTeX]TeX}
+\lstset{language=MetaPost, basicstyle=\small\ttfamily, keywordstyle={}, commentstyle={}, columns=flexible, showspaces=false, showstringspaces=false, frame=single, rulecolor=\color{framecol}, aboveskip=2ex, belowskip=2ex, framesep=2ex, xleftmargin=2ex, xrightmargin=2ex}
+\lstnewenvironment{listing}[1][]
+{\lstset{#1}}
+{}
+\usepackage{multicol}
+\usepackage{url}
+\usepackage{graphicx}
+\setcounter{topnumber}{1}
+\setcounter{bottomnumber}{0}
+\usepackage{ifpdf}
+\ifpdf
+\DeclareGraphicsRule{*}{mps}{*}{}
+\fi
+
+\begin{document}
+\title{The \pkg\ package\thanks{This document describes \pkg\ v0.5, last revised 2007/12/12.}}
+\author{Stephan Hennig\thanks{stephanhennig@arcor.de}}
+\maketitle
+
+\begin{abstract}
+The MetaPost package \pkg\ helps plotting polynomial and root functions. It provides macros to calculate one-segment \B\ curves exactly matching a given cubic polynomial or square or cubic root function. Additionally, tangents on all functions and derivatives of polynomials can be calculated.
+\end{abstract}
+
+\setcounter{secnumdepth}{3}
+\setcounter{tocdepth}{2}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+
+\section{Introduction}\label{sec:intro}
+MetaPost has a variable type \cmd{path} that can be used for drawing smooth and visualy pleasing curves. When plotting graphs, the problem users are confronted with is how to define a suitable path representing a given function $f(x)$?
+
+The \name{splines} package by Dan Luecking provides macros for drawing smooth piece-wise \B\ curves through arbitrary sample points of a function.~\cite{mp:splines} Since \B\ curves are polynomials of degree three, for cubic polynomials we can do better and find a matching one-segment \B\ curve. This package eases the task of finding a \B\ curve corresponding to a given function of the following types:
+\begin{align}
+f(x) & = ax^3 + bx^2 + cx + d \\
+f(x) & = u \sqrt{x + v} + w \\
+f(x) & = u \sqrt[3]{x + v} + w
+\end{align}
+
+
+\section{Usage}\label{sec:usage}
+The \pkg\ package provides two flavours of user interfaces:
+\begin{itemize}
+\item An advanced interface, that first requires a function to be defined and then provides access to the \B\ curve corresponding to the function, its tangent or derivative in a given intervall.
+\item A plain interface, that gives instant access to the \B\ curve matching a given function in an intervall.
+\end{itemize}
+The plain interface is less powerful, but might be convenient in certain circumstances. It is briefly described in section~\ref{sec:plaininterface}. The average user most likely wants to use the advanced interface, so we will discuss that first.
+
+\subsection{Plotting polynomials}\label{sec:polynomials}
+\subsubsection{Defining polynomials}\label{sec:newBPolynomial}
+As was said before, calculating the \B\ curve of a polynomial function first requires a function to be defined. The macro for defining a polynomial
+\begin{equation}
+ f(x) = ax^3 + bx^2 + cx + d
+\end{equation}
+is called
+\begin{center}
+ \cmd{newBPolynomial}
+\end{center}
+and takes five arguments. First argument is a suffix and the remaining four arguments are the four coefficients of the polynomial function $a$, $b$, $c$, $d$.
+
+A definition of a polynomial
+\begin{equation}
+ f(x) = 2x^3 + 0x^2 - 3x - 1
+\end{equation}
+associated with suffix \cmd{f} exemplary looks like this
+\begin{listing}
+newBPolynomial.f(2, 0, -3, -1);
+\end{listing}
+
+The suffix argument \cmd{f} serves as an identifier for deriving names of other macros, that are defined by \cmd{newBPolynomial}. To be more precise, command
+\begin{center}
+ \cmd{newBPolynomial.<suffix>}
+\end{center}
+defines three new macros
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{<suffix>.getPath} \\
+ \cmd{<suffix>.eval} \\
+ \cmd{<suffix>.getTangent} \\
+ \end{tabular}
+\end{center}
+that do the real work. These macros are described in the following sections.
+
+\subsubsection{Getting the \B\ curve of a polynomial}\label{sec:getPath}
+Once a polynomial $\langle$suffix$\rangle$ is defined, the macro to request a \B\ curve matching the function on an intervall $[x_l, x_r]$ is
+\begin{center}
+ \cmd{<suffix>.getPath}
+\end{center}
+This macro takes two argument, the intervall boundaries $x_l$ and $x_r$, and returns a polynomial shaped \B\ curve corresponding to function $\langle$suffix$\rangle$. Command \cmd{<suffix>.getPath} can be called as often as required with varying intervall boundaries and always returns a path corresponding to the new intervall.
+
+Let's have a look at an example. Plotting our polynomial $f(x)$ on the intervall $(-2, 2)$ can be done with the following code (figure~\ref{fig:cubic}).
+\begin{listing}
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+\end{listing}
+
+\begin{figure}
+% \begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{examples.1}
+ \caption{A cubic polynomial.}
+ \label{fig:cubic}
+% \end{minipage}
+\end{figure}
+
+\emph{Hint:} Since the \pkg\ package never uses $\langle$suffix$\rangle$ as a complete identifier, you can use that as the name of a path variable to store the path returned by \cmd{<suffix>.getPath} for later drawing. Any other path (array) variable serves the same purpose, though.
+\begin{listing}
+ newBPolynomial.f(2, 0, -3, -1);
+ path f;
+ f := f.getPath(-2, 2);
+ draw f transformed T;
+\end{listing}
+
+Note, since the base unit of MetaPost is a big point ($1\,\text{bp}=\frac{1}{72}\,\text{in}$) in most cases functions have to be scaled to a proper size before plotting. It is \emph{not} recommended, however, to apply scaling to polynomial coefficients, since current MetaPost versions can't handle large numbers very well.%
+\footnote{At the time of writing the latest release is MetaPost v1.002.}
+Instead, scaling should be applied to paths during \cmd{draw} operations. If not stated otherwise, in this manual, scaling is applied by an affine transform
+\begin{center}
+ \cmd{T = identity xscaled 10mm yscaled 1mm;}
+\end{center}
+
+\subsubsection{Getting a tangent on a polynomial}\label{sec:getTangent}
+Another macro set up during a function definition is
+\begin{center}
+ \cmd{<suffix>.getTangent}
+\end{center}
+This macro returns a path tangent to a function $\langle$suffix$\rangle$ at a specific point. Arguments are an $x$-coordinate, where the tangent is placed, and two values $\epsilon_l$, $\epsilon_r$ that specify the neighbourhood around $x$. The tangent path then covers the intervall $[x+\epsilon_l,x+\epsilon_r]$. This syntax has been choosen to make it easy to move a tangent along a function, keeping its neighbourhood at a fixed size.
+
+As an example, the following code draws a tangent that touches $f$ at $x=-0.5$ with a neighbourhood $\epsilon = \pm 1$ (figure~\ref{fig:tangent}).%
+\footnote{Both types of arguments to \cmd{f.getTangent}---$x$ and $\epsilon$ values---have been put in separate pairs of parentheses to make the code more readable. Even if the second pair of parentheses looks like a coordinate of type \cmd{pair}---it isn't. For MetaPost this syntax is equivalent to
+ \begin{center}
+ \cmd{draw f.getTangent(-0.5, -1, 1) transformed T;}
+ \end{center}
+}
+\begin{listing}
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+ draw f.getTangent(-0.5)(-1, 1) transformed T;
+\end{listing}
+
+\begin{figure}
+ \begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{examples.2}
+ \caption{Cubic polynomial with a tangent.}
+ \label{fig:tangent}
+ \end{minipage}\hfill%
+ \begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{examples.3}
+ \caption{And a labelled point.}
+ \label{fig:labelled}
+ \end{minipage}
+\end{figure}
+
+\subsubsection{Evaluating polynomials}\label{sec:eval}
+Additionally to getting the \B\ curve or tangent of a polynomial, polynomial functions can also be evaluated numerically at a specific location. Defining a function $\langle$suffix$\rangle$ sets up a macro
+\begin{center}
+ \cmd{<suffix>.eval}
+\end{center}
+that takes as argument an $x$-coordinate and returns the function value at that location. As an example, labelling an arbitrary point on $f$ can be done as follows (figure~\ref{fig:labelled}).
+\begin{listing}
+ dotlabeldiam := 2bp;
+ labeloffset := 10bp;
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+ x := -0.5;
+ show (x, f.eval(x));
+ draw f.getTangent(x)(-1, 1) transformed T;
+ dotlabel.top(btex $(-0.5, 0.25)$ etex, (x, f.eval(x)) transformed T);
+\end{listing}
+
+For simplicity, the label has been provided explicitly in this example (after reading the coordinates off the \cmd{log} file). But it is also possible to attach the correct coordinates automatically with the help of the MetaPost package \name{LaTeXMP} and \LaTeX\ package \name{numprint}. While the former helps passing dynamically generated text from MetaPost to \LaTeX, the latter can be used to format and round numbers.~\cite{latex:numprint, mp:latexmp}.
+
+\subsection{Plotting square and cubic roots}\label{sec:roots}
+Two other types of functions can be described by \B\ curves: square and cubic roots%
+\footnote{The reason square and cubic roots can be expressed in terms of \B\ curves is that both are inverse functions of cubic polynomials. More information can be found in appendix~\ref{app:roots}.}%
+. The \pkg\ package provides support for square and cubic root functions of the following type
+\begin{align}
+ f_{sqr}(x) = u \sqrt{x + v} + w\label{eq:square} \\
+ f_{cub}(x) = u \sqrt[3]{x + v} + w\label{eq:cubic}
+\end{align}
+through macros
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{newBSqrRoot} \\
+ \cmd{newBCubRoot} \\
+ \end{tabular}
+\end{center}
+
+These macros are similar to \cmd{newBPolynomial}. Both macros take as arguments a suffix $\langle$suffix$\rangle$ and the three parameters $u$, $v$ and $w$ of the respective function. They define three macros
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{<suffix>.getPath} \\
+ \cmd{<suffix>.eval} \\
+ \cmd{<suffix>.getTangent} \\
+ \end{tabular}
+\end{center}
+that can be used the same way as for polynomial functions.
+
+There is one notable difference between polynomial and root functions. While polynomials $z^k$ are defined for all arguments $z \in \mathbb{R}$, roots $\sqrt[k]{z}$ are only defined for non-negative arguments $z \in \mathbb{R_+}$ and therefore the functions from equations~\ref{eq:square} and~\ref{eq:cubic} are only defined for
+\begin{equation}
+ x \geq -v.\label{eq:rootargument}
+\end{equation}
+
+In case the arguments to macros \cmd{<suffix>.getPath}, \cmd{<suffix>.getTangent} or \cmd{<suffix>.eval} violate equation~\ref{eq:rootargument} all macros write a warning to the log file, but go on with their calculations replacing the arguments in question (or the resulting range boundaries) by $-v$.
+
+The following example plots two functions $s(x) = \sqrt{x}$ and $c(x) = \sqrt[3]{x}$ with a tangent on $s$ at $x=3$ (figure~\ref{fig:squareroot}).
+\begin{listing}
+ T := identity scaled 10mm;
+ newBSqrRoot.s(1,0,0);
+ newBCubRoot.c(1,0,0);
+ draw s.getPath(0,6) transformed T;
+ draw c.getPath(0,6) transformed T;
+ draw s.getTangent(3)(-2, 2) transformed T;
+\end{listing}
+
+\begin{figure}
+ \begin{minipage}[t]{.55\linewidth}
+ \centering
+ \includegraphics{examples.5}
+ \caption{Square and cubic roots with a tangent.}
+ \label{fig:squareroot}
+ \end{minipage}\hfill%
+ \begin{minipage}[t]{.4\linewidth}
+ \centering
+ \includegraphics{examples.4}
+ \caption{First derivative of a cubic polynomial with tangent.}
+ \label{fig:derivative}
+ \end{minipage}
+\end{figure}
+
+\subsection{Dealing with derivatives}\label{sec:derivatives}
+Since plotting function often involves plotting derivatives of functions, too, the \pkg\ package provides support for plotting derivatives of polynomials and tangents thereof. Unfortunately, derivatives of root functions cannot be described by \B\ curves, so those are not supported.
+
+In section~\ref{sec:newBPolynomial} it was said macro \cmd{newBPolynomial} defines three new macros. But this is not the full story. In fact, the command
+\begin{center}
+ \cmd{newBPolynomial.<suffix>}
+\end{center}
+defines twelve macros, three of them we already know, \cmd{<suffix>.getPath}, \cmd{<suffix>.eval}, \cmd{<suffix>.getTangent}. The remaining nine macros are similar, but correspond to the first, second and third derivative of a polynomial $\langle$suffix$\rangle$, resp. To access these macros just add the required number of prime characters to the suffix name (three at maximum). For instance, to get the path corresponding to the first derivative of polynomial $\langle$suffix$\rangle$ call
+\begin{center}
+ \cmd{<suffix>'.getPath}
+\end{center}
+and to get a tangent on the first derivative call
+\begin{center}
+ \cmd{<suffix>'.getTangent}.
+\end{center}
+
+In total these are the macros defined by \cmd{newBPolynomial.<suffix>}:
+\begin{center}
+ \begin{minipage}{.77\textwidth}
+ \begin{multicols}{2}
+ \cmd{<suffix>.getPath} \\
+ \cmd{<suffix>.eval} \\
+ \cmd{<suffix>.getTangent} \\
+ \cmd{<suffix>'.getPath} \\
+ \cmd{<suffix>'.eval} \\
+ \cmd{<suffix>'.getTangent} \\
+ \cmd{<suffix>'{}'.getPath} \\
+ \cmd{<suffix>'{}'.eval} \\
+ \cmd{<suffix>'{}'.getTangent} \\
+ \cmd{<suffix>'{}'{}'.getPath} \\
+ \cmd{<suffix>'{}'{}'.eval} \\
+ \cmd{<suffix>'{}'{}'.getTangent}
+ \end{multicols}
+\end{minipage}
+\end{center}
+
+As an example, the following code draws a tangent on the first derivative of a polynomial \cmd{f} (figure~\ref{fig:derivative}).
+
+\begin{listing}
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f'.getPath(-2, 2) transformed T;
+ draw f'.getTangent(-0.25)(-1, 1) transformed T;
+\end{listing}
+
+
+\subsection{Accessing function parameters}\label{sec:parameters}
+The parameters passed to one of the function defining macros are saved for internal calculations. These variables can be accessed by users, too, but should not be changed.
+
+Defining a polynomial with
+\begin{center}
+ \cmd{newBPolynomial.<suffix>(<a>, <b>, <c>, <d>)}
+\end{center}
+defines variables
+\begin{center}
+ \begin{minipage}{.77\textwidth}
+ \begin{multicols}{2}
+ \cmd{<suffix>.a} \\
+ \cmd{<suffix>.b} \\
+ \cmd{<suffix>.c} \\
+ \cmd{<suffix>.d} \\
+ \cmd{<suffix>'.a} \\
+ \cmd{<suffix>'.b} \\
+ \cmd{<suffix>'.c} \\
+ \cmd{<suffix>'.d} \\
+ \cmd{<suffix>'{}'.a} \\
+ \cmd{<suffix>'{}'.b} \\
+ \cmd{<suffix>'{}'.c} \\
+ \cmd{<suffix>'{}'.d} \\
+ \cmd{<suffix>'{}'{}'.a} \\
+ \cmd{<suffix>'{}'{}'.b} \\
+ \cmd{<suffix>'{}'{}'.c} \\
+ \cmd{<suffix>'{}'{}'.d}
+ \end{multicols}
+\end{minipage}
+\end{center}
+and sets them to the value of the corresponding coefficient.
+
+For root functions the following variables are used:
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{<suffix>.u} \\
+ \cmd{<suffix>.v} \\
+ \cmd{<suffix>.w} \\
+ \end{tabular}
+\end{center}
+
+Additionally, variables
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{<suffix>.a} \\
+ \cmd{<suffix>.b} \\
+ \cmd{<suffix>.c} \\
+ \cmd{<suffix>.d} \\
+ \end{tabular}
+\end{center}
+contain the coefficients of the inverse polynomial function.
+
+\subsection{The plain interface}\label{sec:plaininterface}
+The \pkg\ package provides a plain interface, too. This interface avoids the necessity to define a function prior to calculating paths, but is limited to calculating \B\ curves of explicitly given polynomials and root functions---tangents and derivatives are not supported. The plain interface consists of three macros
+\begin{center}
+ \begin{tabular}{l}
+ \cmd{getBezierFromPolynomial} \\
+ \cmd{getBezierFromSqrRoot} \\
+ \cmd{getBezierFromCubRoot} \\
+ \end{tabular}
+\end{center}
+that take as arguments the parameters of the polynomial or root function plus the range the path should cover.
+
+For instance, the first example could as well have been drawn with the following code
+\begin{listing}
+ draw getBezierFromPolynomial(2, 0, -3, -1)(-2, 2) transformed T;
+\end{listing}
+
+All three macros call a macro \verb+bpolynomial_getBezierFromPolynomial+ behind the scenes, that does the necessary calculations and, in fact, is the heart of this package. The mathematics behind that macro are described in appendix~\ref{app:mathematics}.
+
+
+\section{Examples}\label{sec:examples}
+This section contains some more elaborate examples. The code of all examples is copied here, so that you can easily compare it with the resulting figures. If you want to play around with the code you can also find it in file \cmd{examples.mp}, that actually contains the code of all examples in this manual.
+
+\emph{One additional note in advance:} While playing with figure~\ref{fig:transparency}, the author noticed a subtle rendering bug in Adobe Reader~7.0.9, that caused the graphs and the filled area not matching exactly. In print or with GSview~4.8 and Ghostscript~8.60 everything looked fine. The problem is actually unrelated to the filling, but there seem to be some numeric issues in the \B\ curve rendering algorithm of Adobe Reader. A work-around is to modifiy problematic paths, \emph{e.\,g.}, by slightly changing their plotting range.
+
+The first example demonstrates how \pkg\ and John Hobby's \name{graph} package\cite{mp:graph} can be used together to plot polynomials in a coordinate system. The \cmd{draw} command has just to be replaced by \cmd{gdraw}. The latter command additionally clips paths to the boundaries of the coordinate system (see figure~\ref{fig:graph.mp}). Finally, in this example a table of points is printed to the console and \cmd{log} file.
+
+\begin{figure}
+ \centering
+ \includegraphics{examples.21}
+ \caption{Packages \pkg\ and \name{graph} interacting.}
+ \label{fig:graph.mp}
+\end{figure}
+
+\begin{listing}
+path f, g;
+ xmin := -7; xmax := 7;
+ ymin := -7; ymax := 7;
+ %%% Define polynomials f and g.
+ newBPolynomial.f(0.3, 0, -3, -1);
+ f := f.getPath(xmin, xmax);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ g := g.getPath(xmin, xmax);
+ %%% Draw graph.
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+ show f;
+ %%% Write table with some points of f to log file.
+ show "Polynomial: " & decimal f.a & "x^3 + " &
+ decimal f.b & "x^2 + " & decimal f.c & "x + " & decimal f.d;
+ for x=-5 upto 5:
+ show (x, f.eval(x));
+ endfor
+\end{listing}
+
+Note command \cmd{show f} that writes path~\cmd{f} to the \cmd{log} file. Inspecting that we can easily verify \cmd{f} consists of just one path segment:
+\begingroup\small
+\begin{verbatim}
+(-7,-82.90105)..controls (-2.33333,108.90105) and (2.33333,-110.90105)
+ ..(7,80.90105)
+\end{verbatim}
+\endgroup
+
+In the next example, a cubic polynomial $f$ is plotted together with its derivatives $f'$, $f''$ and $f'''$. Additionally, for all four functions the tangents are drawn at $x=2$. Admittedly, the plot is a little bit crowded. But it should only serve as an example (figure~\ref{fig:derivatives}).
+
+\begin{figure}
+ \centering
+ \includegraphics{examples.22}
+ \caption{A cubic polynomial with derivatives and tangents.}
+ \label{fig:derivatives}
+\end{figure}
+
+\begin{listing}
+ xmin := -6; xmax := 6;
+ ymin := -6; ymax := 6;
+ newBPolynomial.f(0.3, -0.5, -0.5, -1);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ drawoptions(withpen pencircle scaled 1bp);
+ %%% Draw f and its derivatives f', f'', f'''.
+ gdraw f.getPath(xmin, xmax);
+ gdraw f'.getPath(xmin, xmax) dashed evenly scaled 2;
+ gdraw f''.getPath(xmin, xmax) dashed withdots
+ withpen pencircle scaled 2bp;
+ gdraw f'''.getPath(-5, 5) withcolor .6white;
+ %%% Draw tangents and mark points.
+ x := 2;
+ drawoptions(withcolor (1, 0.6, 0.6));
+ gdraw f.getTangent(x)(-2, 2);
+ gdraw f'.getTangent(x)(-1, 1);
+ gdraw f''.getTangent(x)(-2, 2);
+ gdraw f'''.getTangent(x)(-2, 2);
+ drawoptions(withcolor (0.6, 0.6, 1));
+ dotlabeldiam := 2.5bp;
+ gdotlabel("", (x, f.eval(x)));
+ gdotlabel("", (x, f'.eval(x)));
+ gdotlabel("", (x, f''.eval(x)));
+ gdotlabel("", (x, f'''.eval(x)));
+ drawoptions();
+ endgraph;
+\end{listing}
+
+How about some eye candy, \emph{e.\,g.}, transparency effects? In the next example the area enclosed by two functions is filled with a transparent colour (figure~\ref{fig:transparency}).
+
+Note, advanced PDF features like transparency and shadings are provided by package \name{metafun}.~\cite{mp:metafun} Figures using such features have to be converted to stand-alone PDF files with the \cmd{mptopdf} utility before including them into a \LaTeX\ document.
+
+\begin{figure}
+ \centering
+ \includegraphics{examples-23}
+ \caption{Applying a transparent fill to an area enclosed by two functions.}
+ \label{fig:transparency}
+\end{figure}
+
+\begin{listing}
+path f, g, A;
+ xmin := -3; xmax := 6;
+ ymin := -3; ymax := 6;
+ newBPolynomial.f(-0.25, 0.5, 2, -1);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ f := f.getPath(-2.5, 5.5);
+ g := g.getPath(-1.5, 5.5);
+ %%% Find area between f and g.
+ A := buildcycle(g, reverse f);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ %%% Fill area with transparent colour.
+ gfill A withcolor transparent (1, .3, (1, 0.5, 0));
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+\end{listing}
+
+As an alternative to solid fills areas can be emphasized by hatch patterns. Hatching support is provided by package \name{hatching}.~\cite{mp:hatching} Unfortunately, packages \name{graph} and \name{hatching} do not work together. Therefore, in the next example a simple coordinate system had to be drawn manually (figure~\ref{fig:hatching.mp}).
+
+\begin{figure}
+ \centering
+ \includegraphics{examples.14}
+ \caption{Hatching an area enclosed by two functions.}
+ \label{fig:hatching.mp}
+\end{figure}
+
+\begin{listing}
+path f, g, A;
+ T := identity xscaled 10mm yscaled 6mm;
+ %%% Draw coordinate system.
+ xmin := -3; xmax := 6;
+ ymin := -3; ymax := 6;
+ drawoptions(withpen pencircle scaled 1bp withcolor 0.8white);
+ drawarrow ((xmin,0)--(xmax,0)) transformed T;
+ drawarrow ((0,ymin)--(0,ymax)) transformed T;
+ newBPolynomial.f(-0.25, 0.5, 2, -1);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ f := f.getPath(-2.5, 4.2);
+ g := g.getPath(-1, 5);
+ A := buildcycle(g, reverse f);
+ %%% Fill area with pattern.
+ drawoptions();
+ hatchoptions(withcolor (0.6, 0.3, 0.3));
+ hatchfill A transformed T
+ withcolor (-45, 2mm, -0.5bp) withcolor (45, 2mm, -0.5bp);
+ drawoptions(withpen pencircle scaled 1bp);
+ draw f transformed T;
+ draw g transformed T dashed evenly scaled 2;
+\end{listing}
+
+
+\appendix
+\section{Calculating \B\ curves}\label{app:mathematics}
+\subsection{Polynomials}\label{app:polynomials}
+%Internally, paths are \B\ curves and MetaPost is able to calculate the points along such a curve.%
+%\footnote{Since PostScript has a concept of \B\ curves, too, for MetaPost drawing a path is simply an act of copying the parameters of the corresponding \B\ curve into PostScript output. But nonetheless MetaPost \emph{can} calculate points on a \B\ curve.}
+%
+A \B\ curve $P(t)$ with end points $A=(x_A,y_A)$ and $D=(x_D,y_D)$ and control points $B=(x_B,y_B)$ and $C=(x_C,y_C)$ is defined as~\cite{mfbook}
+\begin{equation}
+P(t) = \left(
+ \begin{array}{@{}c@{}}
+ x\\
+ y\\
+ \end{array}
+ \right)(t) = (1-t)^3A + 3(1-t)^2tB + 3(1-t)t^2C + t^3D,\quad 0\leq t\leq 1.
+\end{equation}
+
+This equation can be rewritten as
+\begin{equation}
+P(t) = A + 3(B-A)t + 3(C-2B+A)t^2 + (D-3C+3B-A)t^3,\quad 0\leq t\leq 1.
+\end{equation}
+
+An arbitrary function $y=f(x)$ can be written in parameter form as
+\begin{equation}
+ F(t) = \left(
+ \begin{array}{@{}c@{}}
+ x \\
+ y \\
+ \end{array}
+ \right)(t) = \left(
+ \begin{array}{@{}c@{}}
+ x(t) \\
+ f\big(x(t)\big) \\
+ \end{array}
+ \right),\quad t\in \mathbb{R}
+\end{equation}
+with parameter $t$.
+
+For a polynomial function
+\begin{equation}
+ f(x) = ax^3 + bx^2 + cx + d,\quad x\in [x_0, x_1]
+\end{equation}
+we have
+\begin{equation}
+ x(t) = x_0 + (x_1-x_0)t,\quad 0\leq t\leq 1
+\end{equation}
+and hence
+\begin{equation}
+ F(t) = \left(
+ \begin{array}{@{}c@{}}
+ x_0 + (x_1-x_0)t \\
+ ax(t)^3 + bx(t)^2 + cx(t) + d \\
+ \end{array}
+ \right),\quad 0\leq t\leq 1.
+\end{equation}
+Writing F(t) down explicitly is left as an exercise for the interested reader.
+
+Finally, setting
+\begin{equation}
+ P(t) = F(t)
+\end{equation}
+and sorting the coefficients of the $t^k$ one arrives at the following \emph{original} equation system:
+\begin{align}
+ x_A & = x_0 \label{eq:xA} \\
+ 3(x_B-x_A) & = x_1 - x_0 \label{eq:xB} \\
+ 3(x_C-2x_B+x_A) & = 0 \label{eq:xC} \\
+ x_D-3x_C+3x_B-x_A & = 0 \label{eq:xD} \\
+ y_A & = ax_0^3 + bx_0^2 + cx_0 + d \label{eq:yA} \\
+ 3(y_B-y_A) & = 3ax_0^2(x_1-x_0) + 2bx_0(x_1-x_0) + c(x_1-x_0) \label{eq:yB} \\
+ 3(y_C-2y_B+y_A) & = 3ax_0(x_1-x_0)^2 + b(x_1-x_0)^2 \label{eq:yC} \\
+ y_D-3y_C+3y_B-y_A & = a(x_1-x_0)^3 \label{eq:yD}
+\end{align}
+Note, there are only constants on the right-hand side of all equations. That is, this equation system is linear in the eight variables $x_A$, $x_B$, $x_C$, $x_D$, $y_A$, $y_B$, $y_C$, $y_D$.
+
+Since MetaPost can solve linear equation systems, hacking equations~\ref{eq:xA} to~\ref{eq:yD} into MetaPost code and requesting a path segment
+\begin{center}\ttfamily
+ ($x_A$,$y_A$)..controls ($x_B$,$y_B$) and ($x_C$,$y_C$)..($x_D$,$y_D$)
+\end{center}
+returns the polynomial shaped curve we are looking for.
+
+Internally, the \pkg\ package does not solve the original equation system, but a \emph{modified} variant, that is numerically slightly more robust.
+
+Equations~\ref{eq:xA} to~\ref{eq:xD} can be written down explicitly as
+\begin{align}
+ x_A & = x_0 \label{eq:xA'} \\
+ x_B & = x_0 + \frac{1}{3}(x_1-x_0) \label{eq:xB'} \\
+ x_C & = x_1 - \frac{1}{3}(x_1-x_0) \label{eq:xC'} \\
+ x_D & = x_1 \label{eq:xD'}
+\end{align}
+
+Additionally, we know that $D=(x_D,y_D)$ is a point on the polynomial. Therefore, equation~\ref{eq:yD} of the original system can be replaced by
+\begin{align}
+ y_D & = ax_1^3 + bx_1^2 + cx_1 + d \label{eq:yD'}
+\end{align}
+
+Equations~\ref{eq:yA} to~\ref{eq:yC} of the original equation system and the new equations~\ref{eq:xA'} to~\ref{eq:yD'} constitute the modified equation system, that is solved in \pkg.
+
+\subsection{Square and cubic roots}\label{app:roots}
+When requesting the \B\ curve of a root function, the \pkg\ package first calculates the inverse function, then calculates the corresponding path and finally reflects that on the function $f(x)=x$ to get the inverse again.
+
+The inverse functions of the root functions from equations~\ref{eq:square} and~\ref{eq:cubic} are
+\begin{align}
+ \widetilde f_{sqr}(y) & = \left(\frac{y-w}{u}\right)^2 - v = 0 y^3 + \frac{1}{u^2} y^2 + \frac{-2w}{u^2} y + \frac{w^2}{u^2} - v \\
+ \widetilde f_{cub}(y) & = \left(\frac{y-w}{u}\right)^3 - v = \frac{1}{u^3} y^3 + \frac{-3w}{u^3} y^2 + \frac{3w^2}{u^3} y + \frac{w^3}{u^3} - v
+\end{align}
+which both are clearly polynomials.
+
+\nobreak
+\bigskip
+\raggedright
+\parbox{\linewidth}{\itshape
+ Happy \TeX ing!\par
+ Stephan Hennig
+}
+
+
+\begin{thebibliography}{999}
+\bibitem{mp:metafun} \textsc{Hagen}, Hans, \emph{metafun}, \url{http://www.pragma-ade.com/general/manuals/metafun-p.pdf}
+\bibitem{latex:numprint} \textsc{Harders}, Harald, \emph{The numprint package}, 2007, \url{CTAN:macros/latex/contrib/numprint/numprint.pdf}
+\bibitem{mp:graph} \textsc{Hobby}, John~D., \emph{Drawing graphs with MetaPost}, \url{http://www.tug.org/docs/metapost/mpgraph.pdf}
+\bibitem{mp:hatching} \textsc{Jackowski}, B., \emph{hatching.mp}, \url{CTAN:graphics/metapost/contrib/macros/hatching/README}
+\bibitem{mfbook} \textsc{Knuth}, Donald~E., \emph{The METAFONTbook}, Addison-Wesley, Reading, Massachusetts, 1986, (Computers \& Typesetting, C)
+\bibitem{mp:splines} \textsc{Luecking}, Dan, \emph{Macros to compute splines}, 2005, \url{CTAN:graphics/metapost/contrib/macros/splines/splines.pdf}
+\bibitem{mp:latexmp} \textsc{Morawski}, Jens-Uwe, \emph{latexMP}, 2005, \url{CTAN:graphics/metapost/contrib/macros/latexmp/doc/latexmp.pdf}
+\end{thebibliography}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/metapost/contrib/macros/bpolynomial/examples.mp b/graphics/metapost/contrib/macros/bpolynomial/examples.mp
new file mode 100644
index 0000000000..8caa5ced68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/bpolynomial/examples.mp
@@ -0,0 +1,271 @@
+input bpolynomial;
+input metafun
+input graph
+input hatching
+prologues := 3;
+
+transform T;
+T := identity xscaled 10mm yscaled 1mm;
+
+beginfig(1);
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+endfig;
+
+
+beginfig(2);
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+ draw f.getTangent(-0.5)(-1, 1) transformed T;
+endfig;
+
+
+beginfig(3);
+ dotlabeldiam := 2bp;
+ labeloffset := 10bp;
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f.getPath(-2, 2) transformed T;
+ x := -0.5;
+ show (x, f.eval(x));
+ draw f.getTangent(x)(-1, 1) transformed T;
+ dotlabel.top(btex $(-0.5, 0.25)$ etex, (x, f.eval(x)) transformed T);
+endfig;
+
+labeloffset := 3bp;
+
+beginfig(4);
+ newBPolynomial.f(2, 0, -3, -1);
+ draw f'.getPath(-2, 2) transformed T;
+ draw f'.getTangent(-0.25)(-1, 1) transformed T;
+endfig;
+
+
+beginfig(5);
+ T := identity scaled 10mm;
+ newBSqrRoot.s(1,0,0);
+ newBCubRoot.c(1,0,0);
+ draw s.getPath(0,6) transformed T;
+ draw c.getPath(0,6) transformed T;
+ draw s.getTangent(3)(-2, 2) transformed T;
+endfig;
+
+
+T := identity xscaled 10mm yscaled 1mm;
+beginfig(6);
+ draw getBezierFromPolynomial(2, 0, -3, -1)(-2, 2) transformed T;
+endfig;
+
+
+beginfig(11);
+path f, g;
+ xmin := -7; xmax := 7;
+ ymin := -7; ymax := 7;
+ %%% Define polynomials f and g.
+ newBPolynomial.f(0.3, 0, -3, -1);
+ f := f.getPath(xmin, xmax);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ g := g.getPath(xmin, xmax);
+ %%% Draw graph.
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+ show f;
+ %%% Write table with some points of f to log file.
+ show "Polynomial: " & decimal f.a & "x^3 + " &
+ decimal f.b & "x^2 + " & decimal f.c & "x + " & decimal f.d;
+ for x=-5 upto 5:
+ show (x, f.eval(x));
+ endfor
+endfig;
+
+
+beginfig(12);
+ xmin := -6; xmax := 6;
+ ymin := -6; ymax := 6;
+ newBPolynomial.f(0.3, -0.5, -0.5, -1);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ drawoptions(withpen pencircle scaled 1bp);
+ %%% Draw f and its derivatives f', f'', f'''.
+ gdraw f.getPath(xmin, xmax);
+ gdraw f'.getPath(xmin, xmax) dashed evenly scaled 2;
+ gdraw f''.getPath(xmin, xmax) dashed withdots
+ withpen pencircle scaled 2bp;
+ gdraw f'''.getPath(-5, 5) withcolor .6white;
+ %%% Draw tangents and mark points.
+ x := 2;
+ drawoptions(withcolor (1, 0.6, 0.6));
+ gdraw f.getTangent(x)(-2, 2);
+ gdraw f'.getTangent(x)(-1, 1);
+ gdraw f''.getTangent(x)(-2, 2);
+ gdraw f'''.getTangent(x)(-2, 2);
+ drawoptions(withcolor (0.6, 0.6, 1));
+ dotlabeldiam := 2.5bp;
+ gdotlabel("", (x, f.eval(x)));
+ gdotlabel("", (x, f'.eval(x)));
+ gdotlabel("", (x, f''.eval(x)));
+ gdotlabel("", (x, f'''.eval(x)));
+ drawoptions();
+ endgraph;
+endfig;
+
+
+beginfig(13);
+path f, g, A;
+ xmin := -3; xmax := 6;
+ ymin := -3; ymax := 6;
+ newBPolynomial.f(-0.25, 0.5, 2, -1);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ f := f.getPath(-2.5, 5.5);
+ g := g.getPath(-1.5, 5.5);
+ %%% Find area between f and g.
+ A := buildcycle(g, reverse f);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+ autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ %%% Fill area with transparent colour.
+ gfill A withcolor transparent (1, .3, (1, 0.5, 0));
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+endfig;
+
+
+beginfig(14);
+path f, g, A;
+ T := identity xscaled 10mm yscaled 6mm;
+ %%% Draw coordinate system.
+ xmin := -3; xmax := 6;
+ ymin := -3; ymax := 6;
+ drawoptions(withpen pencircle scaled 1bp withcolor 0.8white);
+ drawarrow ((xmin,0)--(xmax,0)) transformed T;
+ drawarrow ((0,ymin)--(0,ymax)) transformed T;
+ newBPolynomial.f(-0.25, 0.5, 2, -1);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ f := f.getPath(-2.5, 4.2);
+ g := g.getPath(-1, 5);
+ A := buildcycle(g, reverse f);
+ %%% Fill area with pattern.
+ drawoptions();
+ hatchoptions(withcolor (0.6, 0.3, 0.3));
+ hatchfill A transformed T
+ withcolor (-45, 2mm, -0.5bp) withcolor (45, 2mm, -0.5bp);
+ drawoptions(withpen pencircle scaled 1bp);
+ draw f transformed T;
+ draw g transformed T dashed evenly scaled 2;
+endfig;
+
+
+%%% The following figures work around a bug in metafun's
+%%% mp-form.mp package for the original figures 11 to 13.
+%%% The bug shows up when rendering negative numbers
+%%% on corrdinate axes using macro 'format'.
+beginfig(21);
+path f, g;
+ xmin := -7; xmax := 7;
+ ymin := -7; ymax := 7;
+ %%% Define polynomials f and g.
+ newBPolynomial.f(0.3, 0, -3, -1);
+ f := f.getPath(xmin, xmax);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ g := g.getPath(xmin, xmax);
+ %%% Draw graph.
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+% autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ for i=xmin+1 step 2 until xmax-1:
+ grid.bot(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ for i=ymin+1 step 2 until ymax-1:
+ grid.lft(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+ show f;
+ %%% Write table with some points of f to log file.
+ show "Polynomial: " & decimal f.a & "x^3 + " &
+ decimal f.b & "x^2 + " & decimal f.c & "x + " & decimal f.d;
+ for x=-5 upto 5:
+ show (x, f.eval(x));
+ endfor
+endfig;
+
+
+beginfig(22);
+ xmin := -6; xmax := 6;
+ ymin := -6; ymax := 6;
+ newBPolynomial.f(0.3, -0.5, -0.5, -1);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+% autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ for i=xmin step 2 until xmax:
+ grid.bot(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ for i=ymin step 2 until ymax:
+ grid.lft(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ drawoptions(withpen pencircle scaled 1bp);
+ %%% Draw f and its derivatives f', f'', f'''.
+ gdraw f.getPath(xmin, xmax);
+ gdraw f'.getPath(xmin, xmax) dashed evenly scaled 2;
+ gdraw f''.getPath(xmin, xmax) dashed withdots
+ withpen pencircle scaled 2bp;
+ gdraw f'''.getPath(-5, 5) withcolor .6white;
+ %%% Draw tangents and mark points.
+ x := 2;
+ drawoptions(withcolor (1, 0.6, 0.6));
+ gdraw f.getTangent(x)(-2, 2);
+ gdraw f'.getTangent(x)(-1, 1);
+ gdraw f''.getTangent(x)(-2, 2);
+ gdraw f'''.getTangent(x)(-2, 2);
+ drawoptions(withcolor (0.6, 0.6, 1));
+ dotlabeldiam := 2.5bp;
+ gdotlabel("", (x, f.eval(x)));
+ gdotlabel("", (x, f'.eval(x)));
+ gdotlabel("", (x, f''.eval(x)));
+ gdotlabel("", (x, f'''.eval(x)));
+ drawoptions();
+ endgraph;
+endfig;
+
+
+beginfig(23);
+path f, g, A;
+ xmin := -3; xmax := 6;
+ ymin := -3; ymax := 6;
+ newBPolynomial.f(-0.25, 0.5, 2, -1);
+ newBPolynomial.g(0, 0.5, -2, 0);
+ f := f.getPath(-2.5, 5.5);
+ g := g.getPath(-1.5, 5.5);
+ %%% Find area between f and g.
+ A := buildcycle(g, reverse f);
+ draw begingraph(10cm, 6cm);
+ setrange(xmin,ymin, xmax,ymax);
+% autogrid(grid.bot, grid.lft) dashed evenly withcolor .9white;
+ for i=xmin+1 step 2 until xmax:
+ grid.bot(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ for i=ymin+1 step 2 until ymax:
+ grid.lft(decimal i, i) dashed evenly withcolor .9white;
+ endfor
+ %%% Fill area with transparent colour.
+ gfill A withcolor transparent (1, .3, (1, 0.5, 0));
+ drawoptions(withpen pencircle scaled 1bp);
+ gdraw f;
+ gdraw g dashed evenly scaled 2;
+ drawoptions();
+ endgraph;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/cmarrows/README b/graphics/metapost/contrib/macros/cmarrows/README
new file mode 100644
index 0000000000..dd0d33dfb4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/README
@@ -0,0 +1,23 @@
+CMARROWS
+========
+
+This MetaPost package contains macros to draw arrows and braces in the
+Computer Modern style.
+
+See the documentation file cmarrows.pdf for more information on how to
+use the package.
+
+The files of this package consists of
+
+ README cmarrows.mp cmarrows.pdf rgbx0009.mp rgbx0016.mp
+ rgbx0020.mp rgbx0025.mp sgbx0008.mp sgbx0010.mp sgbx0011.mp
+ sgbx0012.mp sgbx0013.mp sgbx0014.mp sgbx0015.mp sgbx0017.mp
+ sgbx0018.mp sgbx0019.mp sgbx0021.mp sgbx0022.mp sgbx0023.mp
+ sgbx0024.mp tgbx0000.mp tgbx0001.mp tgbx0002.mp tgbx0003.mp
+ tgbx0004.mp tgbx0005.mp tgbx0006.mp tgbx0007.mp tgbx0027.mp
+
+This material is subject to the LaTeX Project Public License. See
+http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html for
+the details of that license.
+
+/Tommy Ekola <tek@kth.se> \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/cmarrows.mp b/graphics/metapost/contrib/macros/cmarrows/cmarrows.mp
new file mode 100644
index 0000000000..fe02d670dd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/cmarrows.mp
@@ -0,0 +1,69 @@
+%% cmarrows.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+if known cmarrows_fileversion: endinput fi;
+string cmarrows_fileversion;
+cmarrows_fileversion := "2006/12/18, v0.9";
+message "Loading cmarrows " & cmarrows_fileversion;
+
+vardef setup_cmarrows(text argument_list) =
+
+ save sfile;
+ string sfile;
+
+ save arrow_name, brace_name, parameter_file, macro_name;
+ string arrow_name, brace_name, parameter_file, macro_name;
+
+ argument_list;
+
+ if not known arrow_name:
+ arrow_name := brace_name;
+ fi
+
+ if arrow_name="Bigbrace" : sfile = "tgbx0001.mp";
+ elseif arrow_name="Biggbrace" : sfile = "tgbx0002.mp";
+ elseif arrow_name="bigbrace" : sfile = "tgbx0003.mp";
+ elseif arrow_name="biggbrace" : sfile = "tgbx0004.mp";
+ elseif arrow_name="extensiblebrace" : sfile = "tgbx0005.mp";
+ elseif arrow_name="parallelarrows" : sfile = "tgbx0006.mp";
+ elseif arrow_name="twoheadarrow" : sfile = "tgbx0007.mp";
+ elseif arrow_name="twowayoldarrow" : sfile = "sgbx0008.mp";
+ elseif arrow_name="paralleloppositearrows": sfile = "rgbx0009.mp";
+ elseif arrow_name="twowayarrow" : sfile = "sgbx0010.mp";
+ elseif arrow_name="twowaydoublearrow" : sfile = "sgbx0011.mp";
+ elseif arrow_name="hookleftarrow" : sfile = "sgbx0012.mp";
+ elseif arrow_name="hookrightarrow" : sfile = "sgbx0013.mp";
+ elseif arrow_name="doublearrow" : sfile = "sgbx0014.mp";
+ elseif arrow_name="lefthalfarrow" : sfile = "sgbx0015.mp";
+ elseif arrow_name="paralleloppositerighthalfarrows": sfile = "rgbx0016.mp";
+ elseif arrow_name="mapstoarrow" : sfile = "sgbx0017.mp";
+ elseif arrow_name="oldtexarrow" : sfile = "sgbx0018.mp";
+ elseif arrow_name="righthalfarrow" : sfile = "sgbx0019.mp";
+ elseif arrow_name="paralleloppositelefthalfarrows" : sfile = "rgbx0020.mp";
+ elseif arrow_name="shortaxisarrow" : sfile = "sgbx0021.mp";
+ elseif arrow_name="texarrow" : sfile = "sgbx0022.mp";
+ elseif arrow_name="tailarrow" : sfile = "sgbx0023.mp";
+ elseif arrow_name="tripplearrow" : sfile = "sgbx0024.mp";
+ elseif arrow_name="paralleloppositerightarrows": sfile = "rgbx0025.mp";
+ elseif arrow_name="paren" : sfile = "tgbx0027.mp";
+ else : errmessage "unknown options";
+ fi
+
+ expandafter save scantokens ("setup_" & arrow_name);
+
+ scantokens ("input " & sfile);
+
+ scantokens ("setup_" & arrow_name & "(" &
+ ditto & parameter_file & ditto & "," &
+ ditto & macro_name & ditto & ");" );
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/cmarrows.pdf b/graphics/metapost/contrib/macros/cmarrows/cmarrows.pdf
new file mode 100644
index 0000000000..ffb4f351fd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/cmarrows.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/cmarrows/rgbx0009.mp b/graphics/metapost/contrib/macros/cmarrows/rgbx0009.mp
new file mode 100644
index 0000000000..c206b64ed1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/rgbx0009.mp
@@ -0,0 +1,236 @@
+%% rgbx0009.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_paralleloppositearrows (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__rgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__rgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ % Path macros
+
+ save parallellineright;
+ vardef parallellineright expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp>0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ (.24asc_height#+eps)*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ (.24asc_height#+eps)*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save parallellineleft;
+ vardef parallellineleft expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp>0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp -
+ (.24asc_height#+eps)*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp -
+ (.24asc_height#+eps)*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Macros for drawing the arrow head
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save pq; path pq; pq = z0..{z4-z9}z4r;
+ save right_texarrowhead;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart (pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of pq--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ save qq; path qq; qq = z3l{z9-z3}..z5r;
+ save qp; path qp; qp = z3r{z9-z3}..z0;
+ save left_texarrowhead;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of qq
+ --subpath(xpart ( qp intersectiontimes
+ (point s of qq -- point s of qq + (2rule_thickness#,0)))
+ ,length qp) of qp) transformed T
+ enddef;
+
+ % Draw the arrows. First the left arrow and then the right arrow
+
+ save pa, pb, T, tt, ttt;
+ save f,s;
+
+ save p_left; path p_left; p_left := parallellineleft apth;
+ save p_right; path p_right; p_right := parallellineright apth;
+
+ for ppp = reverse p_left, p_right:
+ transform T;
+ numeric tt; tt := arctime(arclength ppp - (x0-x9)) of ppp;
+ numeric ttt; ttt := arctime(arclength ppp - (x0-x2)) of ppp;
+
+ % Draw the right half of the arrow head
+
+ if arclength ppp = 0:
+ T:=identity shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp - z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9-(0,3rule_thickness#),
+ point tt of ppp - 3rule_thickness#
+ *(unitvector (direction tt of ppp)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of ppp)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ if arclength ppp = 0:
+ T:=identity shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp - z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9+(0,3rule_thickness#),
+ point tt of ppp + 3rule_thickness#
+ *(unitvector (direction tt of ppp)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (qq transformed T) - point tt of ppp)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length qq, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle withpen nullpen text_;
+
+ % Draw the path
+
+ if arclength ppp > x0-x2:
+ draw subpath(0,ttt) of ppp withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ endfor
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/rgbx0016.mp b/graphics/metapost/contrib/macros/cmarrows/rgbx0016.mp
new file mode 100644
index 0000000000..22186db1b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/rgbx0016.mp
@@ -0,0 +1,195 @@
+%% rgbx0016.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_paralleloppositerighthalfarrows (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__rgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__rgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ save t; numeric t;
+ save pq; path pq; pq = z4l..{2(x0-x4),y0-y4}z6r;
+ t=xpart(pq intersectiontimes ((0,y2l)--(w,y2l))); x2=xpart point t of pq;
+ z9=.2[.5[z3,z4],z0];
+
+ save parallellineright;
+ vardef parallellineright expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp > 0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ spread/2*(unitvector direction (arctime s of pppp)
+ of pppp rotated -90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ spread/2*(unitvector direction (length pppp)
+ of pppp rotated -90)
+ fi
+ enddef;
+
+ save parallellineleft;
+ vardef parallellineleft expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp>0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ spread/2*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ spread/2*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Macro for drawing the half arrow head
+
+ save pp; path pp; pp := (z3l..{2(x0-x3),y0-y3}z5r);
+ save pq; path pq; pq := (z3r..{2(x0-x3),y0-y3}z5l);
+
+ save halfarrowhead, pa;
+ vardef halfarrowhead(expr T, s) =
+ (z0--(x0,y2l)--z2l--z2r
+ ..subpath(t,s) of pp
+ --subpath(xpart( pq intersectiontimes
+ (point s of pp -- point s of pp +(2rule_thickness#,0))),
+ length (z3r..{2(x0-x3),y0-y3}z5l)) of pq --cycle)
+ transformed T
+ enddef;
+
+ % Draw the half arrows
+
+ save pa, pb, T, tt, ttt;
+
+ save p_left; path p_left; p_left = parallellineleft apth;
+ save p_right; path p_right; p_right = parallellineright apth;
+
+ for ppp = reverse p_left, p_right:
+
+ transform T;
+ numeric tt; tt = arctime(arclength ppp - (x0-x9)) of ppp;
+ numeric ttt; ttt = arctime(arclength ppp - (x0-x2)) of ppp;
+
+ if arclength ppp = 0:
+ T:=identity reflectedabout(z0+(-1pt,0),z0)
+ shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity reflectedabout(z0+(-1pt,0),z0)
+ rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp -z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9+(0,3rule_thickness#),
+ point tt of ppp - 3rule_thickness#*
+ (unitvector (direction tt of ppp) rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of ppp)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ filldraw halfarrowhead(T,s) text_;
+
+ % Draw the path
+
+ if arclength ppp > x0-x2: draw subpath(0,ttt) of ppp
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+
+ endfor;
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/rgbx0020.mp b/graphics/metapost/contrib/macros/cmarrows/rgbx0020.mp
new file mode 100644
index 0000000000..0263156bd9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/rgbx0020.mp
@@ -0,0 +1,196 @@
+%% rgbx0020.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_paralleloppositelefthalfarrows (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__rgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__rgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ save t; numeric t;
+ save pq; path pq; pq = z4l..{2(x0-x4),y0-y4}z6r;
+ t=xpart(pq intersectiontimes ((0,y2l)--(w,y2l))); x2=xpart point t of pq;
+ z9=.2[.5[z3,z4],z0];
+
+ % Path macros
+
+ save parallellineright;
+ vardef parallellineright expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp > 0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ spread/2*(unitvector direction (arctime s of pppp)
+ of pppp rotated -90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ spread/2*(unitvector direction (length pppp)
+ of pppp rotated -90)
+ fi
+ enddef;
+
+ save parallellineleft;
+ vardef parallellineleft expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp > 0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ spread/2*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ spread/2*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Macro for drawing the half arrow head
+
+ save pp; path pp; pp := (z3l..{2(x0-x3),y0-y3}z5r);
+ save pq; path pq; pq := (z3r..{2(x0-x3),y0-y3}z5l);
+
+ save halfarrowhead;
+ vardef halfarrowhead(expr T, s) =
+ (z0--(x0,y2l)--z2l--z2r
+ ..subpath(t,s) of pp
+ --subpath(xpart( pq intersectiontimes
+ (point s of pp -- point s of pp +(2rule_thickness#,0))),
+ length (z3r..{2(x0-x3),y0-y3}z5l)) of pq --cycle)
+ transformed T
+ enddef;
+
+ % Draw the half arrows
+
+ save pa, pb, T, tt, ttt;
+
+ save p_left; path p_left; p_left = parallellineleft apth;
+ save p_right; path p_right; p_right = parallellineright apth;
+
+ for ppp = p_left, reverse p_right:
+
+ transform T;
+ numeric tt; tt = arctime(arclength ppp - (x0-x9)) of ppp;
+ numeric ttt; ttt = arctime(arclength ppp - (x0-x2)) of ppp;
+
+ if arclength ppp = 0:
+ T:=identity shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp -z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9+(0,3rule_thickness#),
+ point tt of ppp + 3rule_thickness#*
+ (unitvector (direction tt of ppp) rotated 90));
+
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of ppp)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ filldraw halfarrowhead(T,s) text_;
+
+ % Draw the path
+
+ if arclength ppp > x0-x2: draw subpath(0,ttt) of ppp
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+
+ endfor;
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/rgbx0025.mp b/graphics/metapost/contrib/macros/cmarrows/rgbx0025.mp
new file mode 100644
index 0000000000..1fc4597651
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/rgbx0025.mp
@@ -0,0 +1,236 @@
+%% rgbx0025.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_paralleloppositerightarrows (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__rgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__rgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ % Path macros
+
+ save parallellineright;
+ vardef parallellineright expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp>0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp +
+ (.24asc_height#+eps)*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp +
+ (.24asc_height#+eps)*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save parallellineleft;
+ vardef parallellineleft expr pppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength pppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength pppp)/stp;
+
+ if stp>0:
+ for s=0 step stp until arclength pppp - stp:
+ point (arctime s of pppp) of pppp -
+ (.24asc_height#+eps)*(unitvector direction (arctime s of pppp)
+ of pppp rotated 90)
+ {direction (arctime s of pppp) of pppp}..
+ endfor
+ {direction (length pppp) of pppp}
+ point (length pppp) of pppp -
+ (.24asc_height#+eps)*(unitvector direction (length pppp)
+ of pppp rotated 90)
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Macros for drawing the arrow head
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save pq; path pq; pq = z0..{z4-z9}z4r;
+ save right_texarrowhead;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart (pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of pq--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ save qq; path qq; qq = z3l{z9-z3}..z5r;
+ save qp; path qp; qp = z3r{z9-z3}..z0;
+ save left_texarrowhead;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of qq
+ --subpath(xpart ( qp intersectiontimes
+ (point s of qq -- point s of qq + (2rule_thickness#,0)))
+ ,length qp) of qp) transformed T
+ enddef;
+
+ % Draw the arrows. First the left arrow and then the right arrow
+
+ save pa, pb, T, tt, ttt;
+ save f,s;
+
+ save p_left; path p_left; p_left := parallellineleft apth;
+ save p_right; path p_right; p_right := parallellineright apth;
+
+ for ppp = p_left, reverse p_right:
+ transform T;
+ numeric tt; tt := arctime(arclength ppp - (x0-x9)) of ppp;
+ numeric ttt; ttt := arctime(arclength ppp - (x0-x2)) of ppp;
+
+ % Draw the right half of the arrow head
+
+ if arclength ppp = 0:
+ T:=identity shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp - z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9-(0,3rule_thickness#),
+ point tt of ppp - 3rule_thickness#
+ *(unitvector (direction tt of ppp)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of ppp)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ if arclength ppp = 0:
+ T:=identity shifted (point (length ppp) of ppp - z0);
+ elseif arclength ppp < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length ppp) of ppp))
+ shifted (point (length ppp) of ppp - z0);
+ else:
+ T:=mapto(z0,
+ point (length ppp) of ppp,
+ z2,
+ point ttt of ppp,
+ z9+(0,3rule_thickness#),
+ point tt of ppp + 3rule_thickness#
+ *(unitvector (direction tt of ppp)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (qq transformed T) - point tt of ppp)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength ppp < x0-x3l): s := 0;
+ else: s := solve f(length qq, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the path
+
+ if arclength ppp > x0-x2:
+ draw subpath(0,ttt) of ppp withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ endfor
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0008.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0008.mp
new file mode 100644
index 0000000000..70d308b987
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0008.mp
@@ -0,0 +1,240 @@
+%% sgbx0008.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_twowayoldarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+ save ss; numeric ss; ss = arctime x0-x9 of apth;
+ save sss; numeric sss; sss = arctime x0-x2 of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9-(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ if arclength apth = 0:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ shifted (point (length 0) of apth -z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ rotatedaround(z0, angle direction (length 0) of apth)
+ shifted (point (length 0) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point 0 of apth,
+ z2,
+ point sss of apth,
+ z9-(0,3rule_thickness#),
+ point ss of apth - 3rule_thickness#
+ *(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ save pc; path pc;
+ pc := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ if arclength apth = 0:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ shifted (point (length 0) of apth -z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ rotatedaround(z0, angle direction (length 0) of apth)
+ shifted (point (length 0) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point 0 of apth,
+ z2,
+ point sss of apth,
+ z9+(0,3rule_thickness#),
+ point ss of apth + 3rule_thickness#
+ *(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ save pd; path pd;
+ pd := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+ filldraw pc--pd--cycle text_;
+
+ if arclength apth > 2(x0-x2):
+ draw subpath(sss,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0010.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0010.mp
new file mode 100644
index 0000000000..e9e3cf9b49
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0010.mp
@@ -0,0 +1,240 @@
+%% sgbx0010.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_twowayarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9=.2[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+ save ss; numeric ss; ss = arctime x0-x9 of apth;
+ save sss; numeric sss; sss = arctime x0-x2 of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9-(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ if arclength apth = 0:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ shifted (point (length 0) of apth -z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ rotatedaround(z0, angle direction (length 0) of apth)
+ shifted (point (length 0) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point 0 of apth,
+ z2,
+ point sss of apth,
+ z9-(0,3rule_thickness#),
+ point ss of apth - 3rule_thickness#
+ *(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ save pc; path pc;
+ pc := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ if arclength apth = 0:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ shifted (point (length 0) of apth -z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity reflectedabout ((x0,y3),(x0,y4))
+ rotatedaround(z0, angle direction (length 0) of apth)
+ shifted (point (length 0) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point 0 of apth,
+ z2,
+ point sss of apth,
+ z9+(0,3rule_thickness#),
+ point ss of apth + 3rule_thickness#
+ *(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ save pd; path pd;
+ pd := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+ filldraw pc--pd--cycle text_;
+
+ if arclength apth > 2(x0-x2):
+ draw subpath(sss,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0011.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0011.mp
new file mode 100644
index 0000000000..bd2659ade7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0011.mp
@@ -0,0 +1,242 @@
+%% sgbx0011.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_twowaydoublearrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#,.55x_height#];
+ w:=18u#;
+
+ lft x1 = u#-eps; x2=x1; x7=x8=w-x1;
+ y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis#;
+
+ rt x0 = w-u#+eps; y0 = math_axis#;
+ penpos3(rule_thickness#,0); penpos4(rule_thickness#,0);
+ y3-y1 = y2-y4 = .24asc_height#+eps; x3=x4=x0-6u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9 = .381966[.5[z3,z4],z0];
+
+ save pp;
+ path pp; pp = z4l{z9-z4}..z6r;
+ save t;
+ numeric t; t = xpart(pp intersectiontimes ((0,y0)--(w,y0)));
+ numeric t[]; t1 = xpart(pp intersectiontimes ( (0,y2-rule_thickness#/2)
+ --(w,y2-rule_thickness#/2)));
+ t2 = xpart(pp intersectiontimes ( (0,y2+rule_thickness#/2)
+ --(w,y2+rule_thickness#/2)));
+ save qq;
+ path qq; qq = z3l{z9-z3}..z5r;
+
+ save parallelline;
+ vardef parallelline expr ppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength ppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength ppp)/stp;
+
+ if arclength apth > 0:
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp +
+ spread/2*(unitvector direction (arctime s of ppp)
+ of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp +
+ spread/2*(unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness#
+ text_;
+
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp -
+ spread/2*(unitvector direction (arctime s of ppp)
+ of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp -
+ spread/2*(unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Draw the front arrow head
+
+ save doublearrowhead;
+ vardef doublearrowhead(expr T, s, ss) =
+ (subpath(0, xpart((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)
+ --subpath(s,t1) of pp
+ --(xpart point t1 of pp, ypart point t2 of pp)
+ --subpath(t2,t) of pp
+ --subpath(t,t2) of qq
+ --(xpart point t1 of qq, ypart point t2 of qq)
+ --subpath(t1,ss) of qq
+ --subpath(xpart ((z3r{z9-z3}..z0) intersectiontimes
+ (point ss of qq -- point ss of qq + (2rule_thickness#,0))),1)
+ of (z3r{z9-z3}..z0)
+ & cycle) transformed T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt;
+ tt = arctime (arclength apth - (x0 - xpart point t1 of pp)) of apth;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-xpart(point t2 of pp):
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T := mapto(
+ z0,
+ point (length apth) of apth,
+ point t1 of pp + (0,rule_thickness#/2),
+ point tt of apth +
+ spread/2*(unitvector direction tt of apth rotated 90),
+ point t1 of qq - (0,rule_thickness#/2),
+ point tt of apth -
+ spread/2*(unitvector direction tt of apth rotated 90));
+ fi
+
+ save f,s,ss,ttt;
+ ttt = arctime(arclength apth - (x0-x9)) of apth;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ttt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ vardef f(expr ss) =
+ length(point ss of (qq transformed T) - point ttt of apth)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): ss := 0;
+ else: ss := solve f(length qq, 0);
+ fi
+
+ filldraw doublearrowhead(T,s,ss) text_;
+
+ % Draw the back arrow head
+
+ save ttt; numeric ttt;
+ ttt = arctime (x0 - xpart point t1 of pp) of apth;
+
+ if arclength apth = 0:
+ T:=identity rotatedaround(z0, 180)
+ shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-xpart(point t2 of pp):
+ T:=identity rotatedaround(z0,angle (direction 0 of apth)+180)
+ shifted (point 0 of apth - z0);
+ else:
+ T := mapto(
+ z0,
+ point 0 of apth,
+ point t1 of pp + (0,rule_thickness#/2),
+ point ttt of apth +
+ spread/2*(unitvector direction ttt of apth rotated 90),
+ point t1 of qq - (0,rule_thickness#/2),
+ point ttt of apth -
+ spread/2*(unitvector direction ttt of apth rotated 90));
+ fi
+
+
+ ttt := arctime(x0-x9) of apth;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ttt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ vardef f(expr ss) =
+ length(point ss of (qq transformed T) - point ttt of apth)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): ss := 0;
+ else: ss := solve f(length qq, 0);
+ fi
+
+ filldraw doublearrowhead(T,s,ss) text_;
+
+ % Draw the path
+
+ if arclength apth > 2(x0-xpart(point t1 of pp)):
+ parallelline (subpath(ttt,tt) of apth);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0012.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0012.mp
new file mode 100644
index 0000000000..94c225afbc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0012.mp
@@ -0,0 +1,213 @@
+%% sgbx0012.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_hookleftarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=if monospace: .24 else: .36 fi asc_height#+eps;
+ x3=x4=x0-if monospace: 3u# else: 4u# fi - eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9=.2[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ % the hook
+ x12-rule_thickness#/2=u#-eps; x11=x13=5u#-x12;
+ y11-y13=spread; y12=.5[y11,y13]; y13=0;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+ save ss; numeric ss; ss = arctime x11-x12 of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9-(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the hook
+
+ save hook;
+ vardef hook(expr T) =
+ (z11{left}...z12{down}...z13{right}) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z13);
+ elseif arclength apth < x11-x12:
+ T:=identity rotatedaround(z13,angle (direction 0 of apth))
+ shifted (point 0 of apth - z13)
+ shifted ((x11-x12)*(unitvector
+ (point (length apth) of apth - point 0 of apth)));
+ else:
+ T:=mapto(z11,
+ point ss of apth,
+ z12,
+ point 0 of apth + (y11-y12)*(unitvector (direction 0 of apth)
+ rotated 90),
+ z13,
+ point ss of apth + (y11-y13)*(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ draw hook(T) withpen pencircle scaled rule_thickness# text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2 + x11-x12:
+ draw subpath(ss,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0013.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0013.mp
new file mode 100644
index 0000000000..fd5b839225
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0013.mp
@@ -0,0 +1,213 @@
+%% sgbx0013.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_hookrightarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=if monospace: .24 else: .36 fi asc_height#+eps;
+ x3=x4=x0-if monospace: 3u# else: 4u# fi - eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9=.2[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ % the hook
+ x12-rule_thickness#/2=u#-eps; x11=x13=5u#-x12;
+ y11-y13=spread; y12=.5[y11,y13]; y13=0;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+ save ss; numeric ss; ss = arctime x11-x12 of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9-(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the hook
+
+ save hook;
+ vardef hook(expr T) =
+ (z11{left}...z12{down}...z13{right}) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z11);
+ elseif arclength apth < x11-x12:
+ T:=identity rotatedaround(z11,angle (direction 0 of apth))
+ shifted (point 0 of apth - z11)
+ shifted ((x11-x12)*(unitvector
+ (point (length apth) of apth - point 0 of apth)));
+ else:
+ T:=mapto(z11,
+ point ss of apth,
+ z12,
+ point 0 of apth - (y11-y12)*(unitvector (direction 0 of apth)
+ rotated 90),
+ z13,
+ point ss of apth - (y11-y13)*(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ draw hook(T) withpen pencircle scaled rule_thickness# text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2 + x11-x12:
+ draw subpath(ss,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0014.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0014.mp
new file mode 100644
index 0000000000..2986a54c8e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0014.mp
@@ -0,0 +1,199 @@
+%% sgbx0014.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_doublearrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#,.55x_height#];
+ w:=18u#;
+
+ lft x1 = u#-eps; x2=x1; x7=x8=w-x1;
+ y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis#;
+
+ rt x0 = w-u#+eps; y0 = math_axis#;
+ penpos3(rule_thickness#,0); penpos4(rule_thickness#,0);
+ y3-y1 = y2-y4 = .24asc_height#+eps; x3=x4=x0-6u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9 = .381966[.5[z3,z4],z0];
+
+ save pp;
+ path pp; pp = z4l{z9-z4}..z6r;
+ save t;
+ numeric t; t = xpart(pp intersectiontimes ((0,y0)--(w,y0)));
+ numeric t[]; t1 = xpart(pp intersectiontimes ( (0,y2-rule_thickness#/2)
+ --(w,y2-rule_thickness#/2)));
+ t2 = xpart(pp intersectiontimes ( (0,y2+rule_thickness#/2)
+ --(w,y2+rule_thickness#/2)));
+ save qq;
+ path qq; qq = z3l{z9-z3}..z5r;
+
+ save parallelline;
+ vardef parallelline expr ppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength ppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength ppp)/stp;
+
+ if stp > 0:
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp +
+ spread/2*
+ (unitvector direction (arctime s of ppp) of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp +
+ spread/2*
+ (unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness# text_;
+
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp -
+ spread/2*
+ (unitvector direction (arctime s of ppp) of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp -
+ spread/2*
+ (unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Draw the arrow head
+
+ save doublearrowhead;
+ vardef doublearrowhead(expr T, s, ss) =
+ (subpath(0, xpart((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)
+ --subpath(s,t1) of pp
+ --(xpart point t1 of pp, ypart point t2 of pp)
+ --subpath(t2,t) of pp
+ --subpath(t,t2) of qq
+ --(xpart point t1 of qq, ypart point t2 of qq)
+ --subpath(t1,ss) of qq
+ --subpath(xpart ((z3r{z9-z3}..z0) intersectiontimes
+ (point ss of qq -- point ss of qq + (2rule_thickness#,0))),1)
+ of (z3r{z9-z3}..z0)
+ & cycle) transformed T
+ enddef;
+
+ save T; transform T;
+ save tt;
+ tt = arctime (arclength apth - (x0 - xpart point t1 of pp)) of apth;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-xpart(point t2 of pp):
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T := mapto(
+ z0,
+ point (length apth) of apth,
+ point t1 of pp + (0,rule_thickness#/2),
+ point tt of apth +
+ spread/2*(unitvector direction tt of apth rotated 90),
+ point t1 of qq - (0,rule_thickness#/2),
+ point tt of apth -
+ spread/2*(unitvector direction tt of apth rotated 90));
+ fi
+
+ save f,s,ss,ttt;
+ ttt = arctime(arclength apth - (x0-x9)) of apth;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ttt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ vardef f(expr ss) =
+ length(point ss of (qq transformed T) - point ttt of apth)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): ss := 0;
+ else: ss := solve f(length qq, 0);
+ fi
+
+ filldraw doublearrowhead(T,s,ss) text_;
+
+ % Draw the path
+
+ if arclength apth > (x0-xpart(point t1 of pp)):
+ parallelline (subpath(0,tt) of apth);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0015.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0015.mp
new file mode 100644
index 0000000000..838219b64e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0015.mp
@@ -0,0 +1,141 @@
+%% sgbx0015.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_lefthalfarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ save t; numeric t;
+ save pq; path pq; pq = z4l..{2(x0-x4),y0-y4}z6r;
+ t=xpart(pq intersectiontimes ((0,y2l)--(w,y2l))); x2=xpart point t of pq;
+ z9=.2[.5[z3,z4],z0];
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ % Draw the arrow head
+
+ save pp; path pp; pp := (z3l..{2(x0-x3),y0-y3}z5r);
+ save pq; path pq; pq := (z3r..{2(x0-x3),y0-y3}z5l);
+
+ save halfarrowhead, pa;
+ vardef halfarrowhead(expr T, s) =
+ (z0--(x0,y2l)--z2l--z2r
+ ..subpath(t,s) of pp
+ --subpath(xpart( pq intersectiontimes
+ (point s of pp -- point s of pp +(2rule_thickness#,0))),
+ length (z3r..{2(x0-x3),y0-y3}z5l)) of pq --cycle)
+ transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth -z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#*
+ (unitvector (direction tt of apth) rotated 90));
+
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ filldraw halfarrowhead(T,s) text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2: draw subpath(0,ttt) of apth
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0017.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0017.mp
new file mode 100644
index 0000000000..9a1ac77970
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0017.mp
@@ -0,0 +1,196 @@
+%% sgbx0017.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_mapstoarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9=.2[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T, s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth -z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the tail
+
+ if arclength apth > x0-x2:
+ draw point 0 of apth + (.24asc_height#+eps)*
+ (unitvector (direction 0 of apth) rotated 90)--
+ point 0 of apth - (.24asc_height#+eps)*
+ (unitvector (direction 0 of apth) rotated 90)
+ withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ % Draw the path
+
+ if arclength apth > x0-x2:
+ draw subpath(0,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0018.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0018.mp
new file mode 100644
index 0000000000..60f4561d16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0018.mp
@@ -0,0 +1,181 @@
+%% sgbx0018.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_oldtexarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth +
+ 3rule_thickness#*(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left half of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2:
+ draw subpath(0,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0019.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0019.mp
new file mode 100644
index 0000000000..7cb9b29dbc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0019.mp
@@ -0,0 +1,142 @@
+%% sgbx0019.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_righthalfarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.36asc_height#+eps;
+ x3=x4=x0-4u#-eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ save t; numeric t;
+ save pq; path pq; pq = z4l..{2(x0-x4),y0-y4}z6r;
+ t=xpart(pq intersectiontimes ((0,y2l)--(w,y2l))); x2=xpart point t of pq;
+ z9=.2[.5[z3,z4],z0];
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ % Draw the arrow head
+
+ save pp; path pp; pp := (z3l..{2(x0-x3),y0-y3}z5r);
+ save pq; path pq; pq := (z3r..{2(x0-x3),y0-y3}z5l);
+
+ save halfarrowhead, pa;
+ vardef halfarrowhead(expr T, s) =
+ (z0--(x0,y2l)--z2l--z2r
+ ..subpath(t,s) of pp
+ --subpath(xpart( pq intersectiontimes
+ (point s of pp -- point s of pp +(2rule_thickness#,0))),
+ length (z3r..{2(x0-x3),y0-y3}z5l)) of pq --cycle)
+ transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity reflectedabout(z0+(-1pt,0),z0)
+ shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity reflectedabout(z0+(-1pt,0),z0)
+ rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth -z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#*
+ (unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ filldraw halfarrowhead(T,s) text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2: draw subpath(0,ttt) of apth
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0021.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0021.mp
new file mode 100644
index 0000000000..8597e69b13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0021.mp
@@ -0,0 +1,174 @@
+%% sgbx0021.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_shortaxisarrow(expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ pickup pencircle scaled rule_thickness#;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 9u#;
+
+ penpos1(.25rule_thickness#, 90); penpos2(.25rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#;
+ x1=1.5u#-eps;
+ rt x0=w-x1;
+ y3-y0=y0-y4=.24asc_height#+eps; x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0; penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+ save pp; path pp; pp=z4l{z9-z4}..z6r;
+ save t; numeric t;
+ t=xpart(pp intersectiontimes ((0,y2l)--(w,y2l))); x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x5l-x2)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x5l-x3)) of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_arrowhead, pa;
+ vardef right_arrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point tt of apth,
+ (x3,y9)-(0,3rule_thickness#),
+ point ttt of apth -
+ 3rule_thickness#*(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z2)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_arrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point tt of apth,
+ (x3,y9)+(0,3rule_thickness#),
+ point ttt of apth +
+ 3rule_thickness#*(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z2)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2:
+ draw subpath(0,tt) of apth withpen pencircle scaled 1.25rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0022.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0022.mp
new file mode 100644
index 0000000000..f5091b73d0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0022.mp
@@ -0,0 +1,181 @@
+%% sgbx0022.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_texarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, math_axis," &
+ " monospace,asc_height,eps, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "u# := " & decimal u# & ";" &
+ "math_spread := " & decimal math_spread & ";" &
+ "x_height# := " & decimal x_height# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "math_axis# := " & decimal math_axis# & ";" &
+ "monospace := " & if monospace : "true" else: "false" fi & ";" &
+ "asc_height# := " & decimal asc_height# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fudge := " & decimal fudge & ";" &
+ "crisp# := " & decimal crisp# & ";" &
+ "hair# := " & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(rule_thickness#, 0); penpos4(rule_thickness#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=if monospace: .24 else: .36 fi asc_height#+eps;
+ x3=x4=x0-if monospace: 3u# else: 4u# fi - eps;
+ penpos5(rule_thickness#, angle(z4-z0)); z5l=z0;
+ penpos6(rule_thickness#, angle(z3-z0)); z6l=z0;
+ z9=.2[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ % Draw the right half of the arrow head
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9-(0,3rule_thickness#),
+ point tt of apth - 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left part of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the path
+
+ if arclength apth > x0-x2:
+ draw subpath(0,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0023.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0023.mp
new file mode 100644
index 0000000000..89fd897b03
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0023.mp
@@ -0,0 +1,250 @@
+%% sgbx0023.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_tailarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+ save ssss; numeric ssss; ssss = arctime(x0-x3l) of apth;
+
+ % Draw the right half of the arrowhead
+
+ save right_texarrowhead, pa;
+ vardef right_texarrowhead(expr T,s) =
+ (subpath(0, xpart ((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)--subpath(s,t) of pp--z2l) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth -z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth +
+ 3rule_thickness#*(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ save f,s;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pa;
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left half of the arrow head
+
+ pp := (z3l{z9-z3}..z5r);
+ save pq; path pq; pq := (z3r{z9-z3}..z0);
+
+ save left_texarrowhead, pb;
+ vardef left_texarrowhead(expr T, s) =
+ (z2r--subpath(t,s) of pp
+ --subpath(xpart ( pq intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0)))
+ ,length pq) of pq) transformed T
+ enddef;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#
+ *(unitvector (direction tt of apth)
+ rotated 90));
+ fi
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point tt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ path pb;
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the right half of the tail
+
+ save ss; ss := arctime(x9-x3l) of apth;
+ save sss; sss := arctime(x2-x3l) of apth;
+
+ if arclength apth = 0:
+ T:=identity shifted (point 0 of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction 0 of apth))
+ shifted (point 0 of apth - z0);
+ else:
+ T:=mapto(z0,
+ point ssss of apth,
+ z2,
+ point sss of apth,
+ z9+(0,3rule_thickness#),
+ point ss of apth +
+ 3rule_thickness#*(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ pp := z4l{z9-z4}..z6r;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ pa := right_texarrowhead(T,s);
+
+ % Draw the left half of the tail
+
+ if arclength apth = 0:
+ T:=identity shifted (point 0 of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction 0 of apth))
+ shifted (point 0 of apth - z0);
+ else:
+ T:=mapto(z0,
+ point ssss of apth,
+ z2,
+ point sss of apth,
+ z9-(0,3rule_thickness#),
+ point ss of apth -
+ 3rule_thickness#*(unitvector (direction ss of apth)
+ rotated 90));
+ fi
+
+ pp := (z3l{z9-z3}..z5r);
+ pq := (z3r{z9-z3}..z0);
+
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ss of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ pb := left_texarrowhead(T,s);
+
+ filldraw pa--pb--cycle text_;
+
+ % Draw the path
+
+ if arclength apth > 2(x0-x2):
+ save stt; stt := arctime(.5(x0+x2)-x3l) of apth;
+ draw subpath(stt,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/sgbx0024.mp b/graphics/metapost/contrib/macros/cmarrows/sgbx0024.mp
new file mode 100644
index 0000000000..72fe6a0ade
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/sgbx0024.mp
@@ -0,0 +1,211 @@
+%% sgbx0024.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_tripplearrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__sgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__sgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, monospace, fudge, crisp, hair;" &
+ "boolean monospace;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "monospace :=" & if monospace: "true" else: "false" fi & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#,.55x_height#];
+ w:=18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(1.5bar#, 0); penpos4(1.5bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0 = w-u#;
+ x0'=x0''=x0; x1'=x1''=x1;
+ y1'=y1+spread; y1''=y1-spread; y0'=y1'; y0''=y1'';
+
+ y3-y0'=y0''-y4=.24asc_height#+eps; x3=x4=x0-6u#-eps;
+ penpos5(bar#,angle(z0-z4)); z5r=z0; penpos6(bar#,angle(z0-z3));
+ z6r=z0; z9=.381966[.5[z3,z4],z0];
+ save pp;
+ path pp; pp = z4l{z9-z4}..z6l;
+ save ss;
+ numeric ss; ss = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2 = xpart point ss of pp;
+ save t;
+ numeric t; t = xpart(pp intersectiontimes ((0,y0'')--(w,y0'')));
+ numeric t[]; t1 = xpart(pp intersectiontimes ((0,y0''-rule_thickness#/2)
+ --(w,y0''-rule_thickness#/2)));
+ t2 = xpart(pp intersectiontimes ((0,y0''+rule_thickness#/2)
+ --(w,y0''+rule_thickness#/2)));
+ t3 = xpart(pp intersectiontimes ((x2,y4)--(x2,y3)));
+ save qq;
+ path qq; qq = z3l{z9-z3}..z5l;
+
+ save parallelline;
+ vardef parallelline expr ppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength ppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength ppp)/stp;
+
+ if stp > 0:
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp +
+ spread*(unitvector direction (arctime s of ppp) of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp +
+ spread*(unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness#
+ text_;
+
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp -
+ spread*(unitvector direction (arctime s of ppp) of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp -
+ spread*(unitvector direction (length ppp) of ppp rotated 90)
+ withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % Draw the arrow head
+
+ save tripplearrowhead;
+ vardef tripplearrowhead(expr T,s,ss) =
+ (subpath(0,xpart((z0..{z4-z9}z4r) intersectiontimes
+ (point s of pp -- point s of pp + (2rule_thickness#,0))))
+ of (z0..{z4-z9}z4r)
+ --subpath(s,t1) of pp
+ --(xpart point t1 of pp, ypart point t2 of pp)
+ --subpath(t2,t3) of pp
+ --subpath(t3,t2) of qq
+ --(xpart point t1 of qq, ypart point t2 of qq)
+ --subpath(t1,ss) of qq
+ --subpath(xpart((z3r{z9-z3}..z0) intersectiontimes
+ (point ss of qq -- point ss of qq + (2rule_thickness#,0))),1)
+ of (z3r{z9-z3}..z0)
+ & cycle) transformed T
+ enddef;
+
+ save T; transform T;
+ save tt;
+ tt = arctime (arclength apth - (x0 - xpart point t1 of pp)) of apth;
+ save ttt;
+ ttt = arctime (arclength apth - (x0 - x2)) of apth;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-xpart(point t1 of pp):
+ T:=identity rotatedaround(z0, angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T := mapto(z2,
+ point ttt of apth,
+ point t1 of pp + (0,rule_thickness#/2),
+ point tt of apth +
+ spread*(unitvector direction tt of apth rotated 90),
+ point t1 of qq - (0,rule_thickness#/2),
+ point tt of apth -
+ spread*(unitvector direction tt of apth rotated 90));
+ fi
+
+ save f,s,ss;
+ ttt := arctime(arclength apth - (x0-x9)) of apth;
+ vardef f(expr s) =
+ length(point s of (pp transformed T) - point ttt of apth)
+ < length(point 0 of pp - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): s := 0;
+ else: s := solve f(length pp, 0);
+ fi
+
+ vardef f(expr ss) =
+ length(point ss of (qq transformed T) - point ttt of apth)
+ < length(point 0 of qq - z9)
+ enddef;
+
+ if f(0) or (arclength apth < x0-x3l): ss := 0;
+ else: ss := solve f(length qq, 0);
+ fi
+
+ filldraw tripplearrowhead(T,s,ss) text_;
+
+ % Draw the path
+
+ ttt := arctime (arclength apth - (x0 - x2)) of apth;
+ if arclength apth > x0 - xpart(point t1 of pp):
+ parallelline (subpath(0,tt) of apth);
+ fi
+
+ if arclength apth > x0 - x2:
+ draw subpath(0,ttt) of apth withpen pencircle scaled rule_thickness#
+ text_;
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0000.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0000.mp
new file mode 100644
index 0000000000..0993553a7d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0000.mp
@@ -0,0 +1,100 @@
+%% tgbx0000.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+save
+font_identifier,
+cmbase,
+font_size,
+
+u,
+width_adj,
+serif_fit,
+cap_serif_fit,
+letter_fit,
+
+body_height,
+asc_height,
+cap_height,
+fig_height,
+x_height,
+math_axis,
+bar_height,
+comma_depth,
+desc_depth,
+
+crisp,
+tiny,
+fine,
+thin_join,
+hair,
+stem,
+curve,
+ess,
+flare,
+dot_size,
+cap_hair,
+cap_stem,
+cap_curve,
+cap_ess,
+rule_thickness,
+
+dish,
+bracket,
+jut,
+cap_jut,
+beak_jut,
+beak,
+vair,
+notch_cut,
+bar,
+slab,
+cap_bar,
+cap_band,
+cap_notch_cut,
+serif_drop,
+stem_corr,
+vair_corr,
+apex_corr,
+
+o,
+apex_o,
+
+slant,
+fudge,
+math_spread,
+superness,
+superpull,
+beak_darkness,
+ligs,
+
+square_dots,
+hefty,
+serifs,
+monospace,
+variant_g,
+low_asterisk,
+math_fitting,
+
+designsize,
+
+generate;
+
+vardef generate suffix g = enddef;
+numeric cmbase; cmbase = 0;
+string font_identifier;
+vardef font_size expr g = designsize = g enddef;
+boolean square_dots, hefty, serifs, monospace, variant_g, low_asterisk,
+ math_fitting;
+pt#:=1pt;
+
+
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0001.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0001.mp
new file mode 100644
index 0000000000..e8c80c03a7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0001.mp
@@ -0,0 +1,326 @@
+%% tgbx0001.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_Bigbrace (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, hair, rule_thickness, eps, fine, " &
+ "fudge;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "hair# := " & decimal hair# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st;" &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w:=10u#;
+ save h; numeric h; h:=rule_thickness#;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=3dh-rule_thickness#;
+ save bold; numeric bold; bold:=curve#;
+ save min_breadth; numeric min_breadth;
+ min_breadth:=rule_thickness#;
+ save max_breadth; numeric max_breadth;
+ max_breadth:=.5[stem#,bold];
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine# := fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ forsuffixes $ = 1,1',4,4',7,7': penpos$(min_breadth,0); endfor
+ forsuffixes $ = 2,3,5,6: penpos$(max_breadth,0); endfor
+ x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
+ lft x4l=1.5u#-.5min_breadth; lft x2l=.5w-.5max_breadth;
+ top y1=h; bot y7=1-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
+ y1-y2=y3-y4=(y1-y4)/4;
+ y1-y1'=y4-y4'=y7'-y7=min_breadth-fine#;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the brace
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z6l{down}...{3(x7l-x6l),y7-y6}z7l
+ --z7r--z7'r{3(x6r-x7r),y6-y7'}...{up}z6r--z6l & cycle)
+ transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth + abs(x7-x6)
+ *(unitvector (direction s of apth) rotated 90)))
+ < abs(z7 - z6)
+ enddef;
+
+ save tolerence; tolerence := epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform for the bottom part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z7r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(z6l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z6r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z6l,
+ point s of apth
+ +abs(x7r-x6l)
+ *(unitvector (direction s of apth) rotated 90),
+ z6r,
+ point s of apth
+ +abs(x7r-x6r)
+ *(unitvector (direction s of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ fi
+ bottom_part(T);
+
+ % The top part of the brace
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}...{down}z2l
+ --z2r{up}...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle)
+ transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth
+ - (point t of apth + abs(x1r-x2)
+ *(unitvector (direction t of apth) rotated 90)))
+ < abs(z1r-z2)
+ enddef;
+
+ save t; numeric t;
+
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T := mapto(z2l,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z2r,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth,0);
+ T := mapto(z2l,
+ point t of apth
+ +abs(x1r-x2l)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth
+ +abs(x1r-x2r)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi
+ top_part(T);
+
+ % The lower part of the middle piece
+
+ save middle_part_bottom;
+ vardef middle_part_bottom(expr T) =
+ (.5[z4r,z4'r]{3(x5r-x4r),y5-.5[y4,y4']}...{down}z5r
+ --z5l{up}...{3(x4l-x5l),y4'-y5}z4'l) transformed T
+ enddef;
+
+ save ff;
+ vardef ff(expr ss) =
+ abs(point st of apth
+ +abs(x7r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point ss of apth + abs(x7r-x5)
+ *(unitvector (direction ss of apth) rotated 90)))
+ > abs(z4-z5)
+ enddef;
+
+ save ss; numeric ss;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4'l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ ss := solve ff(0,st);
+ T:=mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z5l,
+ point ss of apth
+ +abs(x1r-x5l)
+ *(unitvector (direction ss of apth) rotated 90),
+ z5r,
+ point ss of apth
+ +abs(x1r-x5r)
+ *(unitvector (direction ss of apth) rotated 90));
+ fi
+
+ save pb; path pb;
+ pb:=middle_part_bottom(T);
+
+ % The upper part of the middle piece
+
+ save middle_part_top;
+ vardef middle_part_top(expr T) =
+ (z4l{3(x3l-x4l),y3-y4}...{up}z3l--z3r{down}
+ ...{3(x4r-x3r),.5[y4,y4']-y3}.5[z4r,z4'r]) transformed T
+ enddef;
+
+ save gg;
+ vardef gg(expr tt) =
+ abs(point st of apth
+ +abs(x1r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point tt of apth + abs(x1r-x3)
+ *(unitvector (direction tt of apth) rotated 90)))
+ > abs(z3-z4)
+ enddef;
+
+ save tt; numeric tt;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3l,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ tt := solve gg(length apth, st);
+ T := mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z3l,
+ point tt of apth
+ +abs(x1r-x3l)
+ *(unitvector (direction tt of apth) rotated 90),
+ z3r,
+ point tt of apth
+ +abs(x1r-x3r)
+ *(unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save ptt; path ptt;
+ ptt:=middle_part_top(T);
+
+ filldraw pb--ptt--cycle text_;
+
+ % The extension parts
+
+ save extension_part, stp;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled (x5r-x5l+fine#);
+
+ if stp > 0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + abs(x1r-x6)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + abs(x1r-x6)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y3-y5+y6-y7:
+ extension_part(s,ss); extension_part(tt,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0002.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0002.mp
new file mode 100644
index 0000000000..a554e46747
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0002.mp
@@ -0,0 +1,326 @@
+%% tgbx0000.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_Biggbrace (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, hair, rule_thickness, eps, fine, " &
+ "fudge;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "hair# := " & decimal hair# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st; " &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w:=11.5u#;
+ save h; numeric h; h:=rule_thickness#;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=5dh-rule_thickness#;
+ save bold; numeric bold; bold:=curve#;
+ save min_breadth; numeric min_breadth;
+ min_breadth:=rule_thickness#+.4dw;
+ save max_breadth; numeric max_breadth;
+ max_breadth:=bold+dw;
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine#:=fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ forsuffixes $ = 1,1',4,4',7,7': penpos$(min_breadth,0); endfor
+ forsuffixes $ = 2,3,5,6: penpos$(max_breadth,0); endfor
+ x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
+ lft x4l=1.5u#-.5min_breadth; lft x2l=.5w-.5max_breadth;
+ top y1=h; bot y7=1-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
+ y1-y2=y3-y4=(y1-y4)/4;
+ y1-y1'=y4-y4'=y7'-y7=min_breadth-fine#;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the brace
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z6l{down}...{3(x7l-x6l),y7-y6}z7l
+ --z7r--z7'r{3(x6r-x7r),y6-y7'}...{up}z6r--z6l & cycle)
+ transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth + abs(x7-x6)
+ *(unitvector (direction s of apth) rotated 90)))
+ < abs(z7 - z6)
+ enddef;
+
+ save tolerence; tolerence := epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform for the bottom part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z7r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(z6l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z6r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z6l,
+ point s of apth
+ +abs(x7r-x6l)
+ *(unitvector (direction s of apth) rotated 90),
+ z6r,
+ point s of apth
+ +abs(x7r-x6r)
+ *(unitvector (direction s of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ fi
+ bottom_part(T);
+
+ % The top part of the brace
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}...{down}z2l
+ --z2r{up}...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle)
+ transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth
+ - (point t of apth + abs(x1r-x2)
+ *(unitvector (direction t of apth) rotated 90)))
+ < abs(z1r-z2)
+ enddef;
+
+ save t; numeric t;
+
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T := mapto(z2l,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z2r,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth,0);
+ T := mapto(z2l,
+ point t of apth
+ +abs(x1r-x2l)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth
+ +abs(x1r-x2r)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi
+ top_part(T);
+
+ % The lower part of the middle piece
+
+ save middle_part_bottom;
+ vardef middle_part_bottom(expr T) =
+ (.5[z4r,z4'r]{3(x5r-x4r),y5-.5[y4,y4']}...{down}z5r
+ --z5l{up}...{3(x4l-x5l),y4'-y5}z4'l) transformed T
+ enddef;
+
+ save ff;
+ vardef ff(expr ss) =
+ abs(point st of apth
+ +abs(x7r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point ss of apth + abs(x7r-x5)
+ *(unitvector (direction ss of apth) rotated 90)))
+ > abs(z4-z5)
+ enddef;
+
+ save ss; numeric ss;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4'l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ ss := solve ff(0,st);
+ T:=mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z5l,
+ point ss of apth
+ +abs(x1r-x5l)
+ *(unitvector (direction ss of apth) rotated 90),
+ z5r,
+ point ss of apth
+ +abs(x1r-x5r)
+ *(unitvector (direction ss of apth) rotated 90));
+ fi
+
+ save pb; path pb;
+ pb:=middle_part_bottom(T);
+
+ % The upper part of the middle piece
+
+ save middle_part_top;
+ vardef middle_part_top(expr T) =
+ (z4l{3(x3l-x4l),y3-y4}...{up}z3l--z3r{down}
+ ...{3(x4r-x3r),.5[y4,y4']-y3}.5[z4r,z4'r]) transformed T
+ enddef;
+
+ save gg;
+ vardef gg(expr tt) =
+ abs(point st of apth
+ +abs(x1r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point tt of apth + abs(x1r-x3)
+ *(unitvector (direction tt of apth) rotated 90)))
+ > abs(z3-z4)
+ enddef;
+
+ save tt; numeric tt;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3l,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ tt := solve gg(length apth, st);
+ T := mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z3l,
+ point tt of apth
+ +abs(x1r-x3l)
+ *(unitvector (direction tt of apth) rotated 90),
+ z3r,
+ point tt of apth
+ +abs(x1r-x3r)
+ *(unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save ptt; path ptt;
+ ptt:=middle_part_top(T);
+
+ filldraw pb--ptt--cycle text_;
+
+ % The extension parts
+
+ save extension_part, stp;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled (x5r-x5l+fine#);
+
+ if stp>0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + abs(x1r-x6)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + abs(x1r-x6)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y3-y5+y6-y7:
+ extension_part(s,ss); extension_part(tt,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0003.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0003.mp
new file mode 100644
index 0000000000..92ca195413
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0003.mp
@@ -0,0 +1,325 @@
+%% tgbx0003.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_bigbrace (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, hair, rule_thickness, eps, fine, " &
+ "fudge;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "hair# := " & decimal hair# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st;" &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w:=9u#;
+ save h; numeric h; h:=rule_thickness#;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=2dh-rule_thickness#;
+ save min_breadth; numeric min_breadth;
+ min_breadth:=hair#;
+ save max_breadth; numeric max_breadth;
+ max_breadth:=stem#;
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine# := fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ forsuffixes $ = 1,1',4,4',7,7': penpos$(min_breadth,0); endfor
+ forsuffixes $ = 2,3,5,6: penpos$(max_breadth,0); endfor
+ x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
+ lft x4l=1.5u#-.5min_breadth; lft x2l=.5w-.5max_breadth;
+ top y1=h; bot y7=1-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
+ y1-y2=y3-y4=(y1-y4)/4;
+ y1-y1'=y4-y4'=y7'-y7=min_breadth-fine#;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the brace
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z6l{down}...{3(x7l-x6l),y7-y6}z7l
+ --z7r--z7'r{3(x6r-x7r),y6-y7'}...{up}z6r--z6l & cycle)
+ transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth + abs(x7-x6)
+ *(unitvector (direction s of apth) rotated 90)))
+ < abs(z7 - z6)
+ enddef;
+
+ save tolerence; tolerence := epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform for the bottom part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z7r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(z6l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z6r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z6l,
+ point s of apth
+ +abs(x7r-x6l)
+ *(unitvector (direction s of apth) rotated 90),
+ z6r,
+ point s of apth
+ +abs(x7r-x6r)
+ *(unitvector (direction s of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ fi
+ bottom_part(T);
+
+ % The top part of the brace
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}...{down}z2l
+ --z2r{up}...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle)
+ transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth
+ - (point t of apth + abs(x1r-x2)
+ *(unitvector (direction t of apth) rotated 90)))
+ < abs(z1r-z2)
+ enddef;
+
+ save t; numeric t;
+
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T := mapto(z2l,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z2r,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth,0);
+ T := mapto(z2l,
+ point t of apth
+ +abs(x1r-x2l)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth
+ +abs(x1r-x2r)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi
+ top_part(T);
+
+ % The lower part of the middle piece
+
+ save middle_part_bottom;
+ vardef middle_part_bottom(expr T) =
+ (.5[z4r,z4'r]{3(x5r-x4r),y5-.5[y4,y4']}...{down}z5r
+ --z5l{up}...{3(x4l-x5l),y4'-y5}z4'l) transformed T
+ enddef;
+
+ save ff;
+ vardef ff(expr ss) =
+ abs(point st of apth
+ +abs(x7r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point ss of apth + abs(x7r-x5)
+ *(unitvector (direction ss of apth) rotated 90)))
+ > abs(z4-z5)
+ enddef;
+
+ save ss; numeric ss;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4'l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ ss := solve ff(0,st);
+ T:=mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z5l,
+ point ss of apth
+ +abs(x1r-x5l)
+ *(unitvector (direction ss of apth) rotated 90),
+ z5r,
+ point ss of apth
+ +abs(x1r-x5r)
+ *(unitvector (direction ss of apth) rotated 90));
+ fi
+
+ save pb; path pb;
+ pb:=middle_part_bottom(T);
+
+ % The upper part of the middle piece
+
+ save middle_part_top;
+ vardef middle_part_top(expr T) =
+ (z4l{3(x3l-x4l),y3-y4}...{up}z3l--z3r{down}
+ ...{3(x4r-x3r),.5[y4,y4']-y3}.5[z4r,z4'r]) transformed T
+ enddef;
+
+ save gg;
+ vardef gg(expr tt) =
+ abs(point st of apth
+ +abs(x1r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point tt of apth + abs(x1r-x3)
+ *(unitvector (direction tt of apth) rotated 90)))
+ > abs(z3-z4)
+ enddef;
+
+ save tt; numeric tt;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3l,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ tt := solve gg(length apth, st);
+ T := mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z3l,
+ point tt of apth
+ +abs(x1r-x3l)
+ *(unitvector (direction tt of apth) rotated 90),
+ z3r,
+ point tt of apth
+ +abs(x1r-x3r)
+ *(unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save ptt; path ptt;
+ ptt:=middle_part_top(T);
+
+ filldraw pb--ptt--cycle text_;
+
+ % The extension parts
+
+ save extension_part, stp;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled (x5r-x5l+fine#);
+
+ if stp > 0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + abs(x1r-x6)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + abs(x1r-x6)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y3-y5+y6-y7:
+ extension_part(s,ss); extension_part(tt,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0004.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0004.mp
new file mode 100644
index 0000000000..ec0b4d7d70
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0004.mp
@@ -0,0 +1,325 @@
+%% tgbx0004.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_biggbrace (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, hair, rule_thickness, eps, fine, " &
+ "fudge;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "hair# := " & decimal hair# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st;" &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w:=11u#;
+ save h; numeric h; h:=rule_thickness#;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=4dh-rule_thickness#;
+ save bold; numeric bold; bold:=curve#;
+ save min_breadth; numeric min_breadth;
+ min_breadth:=rule_thickness#+.2dw;
+ save max_breadth; numeric max_breadth;
+ max_breadth:=bold;
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine#:=fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ forsuffixes $ = 1,1',4,4',7,7': penpos$(min_breadth,0); endfor
+ forsuffixes $ = 2,3,5,6: penpos$(max_breadth,0); endfor
+ x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
+ lft x4l=1.5u#-.5min_breadth; lft x2l=.5w-.5max_breadth;
+ top y1=h; bot y7=1-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
+ y1-y2=y3-y4=(y1-y4)/4;
+ y1-y1'=y4-y4'=y7'-y7=min_breadth-fine#;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the brace
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z6l{down}...{3(x7l-x6l),y7-y6}z7l
+ --z7r--z7'r{3(x6r-x7r),y6-y7'}...{up}z6r--z6l & cycle)
+ transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth + abs(x7-x6)
+ *(unitvector (direction s of apth) rotated 90)))
+ < abs(z7 - z6)
+ enddef;
+
+ save tolerence; tolerence := epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform for the bottom part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z7r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(z6l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z6r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z6l,
+ point s of apth
+ +abs(x7r-x6l)
+ *(unitvector (direction s of apth) rotated 90),
+ z6r,
+ point s of apth
+ +abs(x7r-x6r)
+ *(unitvector (direction s of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ fi
+ bottom_part(T);
+
+ % The top part of the brace
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}...{down}z2l
+ --z2r{up}...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle)
+ transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth
+ - (point t of apth + abs(x1r-x2)
+ *(unitvector (direction t of apth) rotated 90)))
+ < abs(z1r-z2)
+ enddef;
+
+ save t; numeric t;
+
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T := mapto(z2l,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z2r,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth,0);
+ T := mapto(z2l,
+ point t of apth
+ +abs(x1r-x2l)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth
+ +abs(x1r-x2r)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi
+ top_part(T);
+
+ % The lower part of the middle piece
+
+ save middle_part_bottom;
+ vardef middle_part_bottom(expr T) =
+ (.5[z4r,z4'r]{3(x5r-x4r),y5-.5[y4,y4']}...{down}z5r
+ --z5l{up}...{3(x4l-x5l),y4'-y5}z4'l) transformed T
+ enddef;
+
+ save ff;
+ vardef ff(expr ss) =
+ abs(point st of apth
+ +abs(x7r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point ss of apth + abs(x7r-x5)
+ *(unitvector (direction ss of apth) rotated 90)))
+ > abs(z4-z5)
+ enddef;
+
+ save ss; numeric ss;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4'l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ ss := solve ff(0,st);
+ T:=mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z5l,
+ point ss of apth
+ +abs(x1r-x5l)
+ *(unitvector (direction ss of apth) rotated 90),
+ z5r,
+ point ss of apth
+ +abs(x1r-x5r)
+ *(unitvector (direction ss of apth) rotated 90));
+ fi
+
+ save pb; path pb;
+ pb:=middle_part_bottom(T);
+
+ % The upper part of the middle piece
+
+ save middle_part_top;
+ vardef middle_part_top(expr T) =
+ (z4l{3(x3l-x4l),y3-y4}...{up}z3l--z3r{down}
+ ...{3(x4r-x3r),.5[y4,y4']-y3}.5[z4r,z4'r]) transformed T
+ enddef;
+
+ save gg;
+ vardef gg(expr tt) =
+ abs(point st of apth
+ +abs(x1r-x4)*(unitvector (direction st of apth) rotated 90)
+ -(point tt of apth + abs(x1r-x3)
+ *(unitvector (direction tt of apth) rotated 90)))
+ > abs(z3-z4)
+ enddef;
+
+ save tt; numeric tt;
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3l,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ tt := solve gg(length apth, st);
+ T := mapto(.5[z4r,z4'r],
+ point st of apth
+ +abs(x1r-.5[x4r,x4'r])
+ *(unitvector (direction st of apth) rotated 90),
+ z3l,
+ point tt of apth
+ +abs(x1r-x3l)
+ *(unitvector (direction tt of apth) rotated 90),
+ z3r,
+ point tt of apth
+ +abs(x1r-x3r)
+ *(unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save ptt; path ptt;
+ ptt:=middle_part_top(T);
+
+ filldraw pb--ptt--cycle text_;
+
+ % The extension parts
+
+ save extension_part, stp;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled (x5r-x5l+fine#);
+
+ if stp > 0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + abs(x1r-x6)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + abs(x1r-x6)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y3-y5+y6-y7:
+ extension_part(s,ss); extension_part(tt,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0005.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0005.mp
new file mode 100644
index 0000000000..6e5c14634c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0005.mp
@@ -0,0 +1,336 @@
+%% tgbx0005.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_extensiblebrace (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, hair, rule_thickness, eps, fine, " &
+ "fudge;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "hair# := " & decimal hair# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st;" &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w :=12u#;
+ save h; numeric h; h :=0;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=1.5dh;
+ save min_breadth; numeric min_breadth#;
+ min_breadth#:=rule_thickness#+0.6dw;
+ save heavy_rule_thickness; numeric heavy_rule_thickness#;
+ heavy_rule_thickness#:=3rule_thickness#;
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine#:=fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ penpos7(min_breadth#,0); penpos7'(min_breadth#,0);
+ penpos6(heavy_rule_thickness#,0);
+ rt x7r = rt x7'r = w-1.5u#+.5min_breadth#;
+ lft x6l = .5w-.5heavy_rule_thickness#;
+ bot y7 = -d; y6 = .5[h+eps,y7]; y7'-y7 = min_breadth#-fine#;
+
+ penpos1(min_breadth#,0); penpos1'(min_breadth#,0);
+ penpos2(heavy_rule_thickness#,0);
+ rt x1r = rt x1'r = w-1.5u#+.5min_breadth#;
+ lft x2 = .5w;
+ top y1 = h; y2 = .5[y1,-d-eps]; y1-y1' = min_breadth#-fine#;
+
+ penpos4'(min_breadth#,0); penpos4(min_breadth#,0);
+ penpos5(heavy_rule_thickness#,0);
+ penpos3(heavy_rule_thickness#,0);
+ lft x4l=lft x4'l=1.5u#-.5min_breadth#;
+ lft x5l=.5w-.5heavy_rule_thickness#;
+ y4'-y5=(h+2d+2eps)/4;
+ y4-y4'=min_breadth#-fine#; y4=0;
+ lft x3l = .5w-.5heavy_rule_thickness#;
+ y3-y4 = (h+2d+2eps)/4;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the brace
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z6l{down}...{3(x7l-x6l),y7-y6}z7l
+ --z7r--z7'r{3(x6r-x7r),y6-y7'}...{up}z6r--z6l & cycle)
+ transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction s of apth) rotated 90)))
+ < ((d/2) ++ (.5w-1.5u#+.5min_breadth#))
+ enddef;
+
+ save tolerence; tolerence := epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform for the bottom part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z7r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(z6l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z6r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ +abs(x7r-x6r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z6l,
+ point s of apth
+ +(.5w-1.5u#+.5min_breadth#+.5heavy_rule_thickness#)
+ *(unitvector (direction s of apth) rotated 90),
+ z6r,
+ point s of apth
+ +(.5w-1.5u#+.5min_breadth#-.5heavy_rule_thickness#)
+ *(unitvector (direction s of apth) rotated 90),
+ z7r,
+ point 0 of apth);
+ fi
+ bottom_part(T);
+
+ % The top part of the brace
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}...{down}z2l
+ --z2r{up}...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle)
+ transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth
+ - (point t of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction t of apth) rotated 90)))
+ < ((d/2) ++ (.5w-1.5u#+.5min_breadth#))
+ enddef;
+
+ save t; numeric t;
+
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T := mapto(z2l,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z2r,
+ .75[point 0 of apth, point (length apth) of apth] +
+ abs(x1r-x2r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth,0);
+ T := mapto(z2l,
+ point t of apth
+ +(.5w-1.5u#+.5min_breadth#+.5heavy_rule_thickness#)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth
+ +(.5w-1.5u#+.5min_breadth#-.5heavy_rule_thickness#)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi
+ top_part(T);
+
+ % The lower part of the middle piece
+
+ save middle_part_bottom;
+ vardef middle_part_bottom(expr T) =
+ (.5[z4r,z4'r]{3(x5r-x4r),y5-.5[y4,y4']}...{down}z5r
+ --z5l{up}...{3(x4l-x5l),y4'-y5}z4'l) transformed T
+ enddef;
+
+ save ff;
+ vardef ff(expr ss) =
+ abs(point st of apth
+ +(w-3u#)*(unitvector (direction st of apth) rotated 90)
+ -(point ss of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction ss of apth) rotated 90)))
+ > ((h+2d+2eps)/4+(min_breadth#-fine#)/2) ++ (.5w-1.5u#-.5min_breadth#)
+ enddef;
+
+ save ss; numeric ss;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4'l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5l,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z5r,
+ .25[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x5r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ ss := solve ff(0,st);
+ T:=mapto(.5[z4r,z4'r],
+ point st of apth
+ +(w-3u#)*(unitvector (direction st of apth) rotated 90),
+ z5l,
+ point ss of apth
+ +(.5w-1.5u#+.5min_breadth#+.5heavy_rule_thickness#)
+ *(unitvector (direction ss of apth) rotated 90),
+ z5r,
+ point ss of apth
+ +(.5w-1.5u#+.5min_breadth#-.5heavy_rule_thickness#)
+ *(unitvector (direction ss of apth) rotated 90));
+ fi
+
+ save pb; path pb;
+ pb:=middle_part_bottom(T);
+
+ % The upper part of the middle piece
+
+ save middle_part_top;
+ vardef middle_part_top(expr T) =
+ (z4l{3(x3l-x4l),y3-y4}...{up}z3l--z3r{down}
+ ...{3(x4r-x3r),.5[y4,y4']-y3}.5[z4r,z4'r]) transformed T
+ enddef;
+
+ save gg;
+ vardef gg(expr tt) =
+ abs(point st of apth
+ +(w-3u#)*(unitvector (direction st of apth) rotated 90)
+ -(point tt of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction tt of apth) rotated 90)))
+ > ((h+2d+2eps)/4+(min_breadth#-fine#)/2) ++ (.5w-1.5u#-.5min_breadth#)
+ enddef;
+
+ save tt; numeric tt;
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z4l);
+ elseif arclength apth < y1-y2+y3-y5+y6-y7:
+ T:=mapto(.5[z4r,z4'r],
+ .5[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-.5[x4r,x4'r])
+ *(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3l,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ .75[point 0 of apth, point (length apth) of apth]+
+ abs(x1r-x3r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90));
+ else:
+ tt := solve gg(length apth, st);
+ T := mapto(.5[z4r,z4'r],
+ point st of apth
+ +(w-3u#)*(unitvector (direction st of apth) rotated 90),
+ z3l,
+ point tt of apth
+ +(.5w-1.5u#+.5min_breadth#+.5heavy_rule_thickness#)
+ *(unitvector (direction tt of apth) rotated 90),
+ z3r,
+ point tt of apth
+ +(.5w-1.5u#+.5min_breadth#-.5heavy_rule_thickness#)
+ *(unitvector (direction tt of apth) rotated 90));
+ fi
+
+ save ptt; path ptt;
+ ptt:=middle_part_top(T);
+
+ filldraw pb--ptt--cycle text_;
+
+ % The extension parts
+
+ save extension_part;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled (heavy_rule_thickness#+fine#);
+
+ if stp>0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + (.5w-1.5u#+.5min_breadth#)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y3-y5+y6-y7:
+ extension_part(s,ss); extension_part(tt,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0006.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0006.mp
new file mode 100644
index 0000000000..fb135522d8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0006.mp
@@ -0,0 +1,179 @@
+%% tgbx0006.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_parallelarrows (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save texarrowhead;
+ vardef texarrowhead(expr T) =
+ filldraw (z0..{z4-z9}z4r--subpath(0,t) of pp
+ --z2l--z2r--subpath(t,0) of (z3l{z9-z3}..z5r)
+ --z3r{z9-z3}..z0 & cycle) transformed T text_;
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x3l)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ save parallelline;
+ vardef parallelline expr ppp =
+ save s, stp;
+ numeric s, stp; stp:=(arclength ppp) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(arclength ppp)/stp;
+
+ if stp>0:
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp +
+ (.24asc_height#+eps)*(unitvector direction (arctime s of ppp)
+ of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp +
+ (.24asc_height#+eps)*(unitvector direction (length ppp)
+ of ppp rotated 90)
+ withpen pencircle scaled rule_thickness# text_;
+
+ draw for s=0 step stp until arclength ppp - stp:
+ point (arctime s of ppp) of ppp -
+ (.24asc_height#+eps)*(unitvector direction (arctime s of ppp)
+ of ppp rotated 90)
+ {direction (arctime s of ppp) of ppp}..
+ endfor
+ {direction (length ppp) of ppp}
+ point (length ppp) of ppp -
+ (.24asc_height#+eps)*(unitvector direction (length ppp)
+ of ppp rotated 90)
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+ enddef;
+
+ if arclength apth > x0-x2: parallelline subpath(0,ttt) of apth; fi
+
+ save T; transform T;
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0)
+ shifted (0,.24asc_height#+eps);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0)
+ shifted ((.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated 90));
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth +
+ (.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated 90),
+ z2,
+ point ttt of apth +
+ (.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated 90),
+ z3l,
+ point tt of apth);
+ fi
+ texarrowhead(T);
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0)
+ shifted (0,-.24asc_height#+eps);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0)
+ shifted ((.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated -90));
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth -
+ (.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated 90),
+ z2,
+ point ttt of apth -
+ (.24asc_height#+eps)*
+ (unitvector (direction (length apth) of apth) rotated 90),
+ z4l,
+ point tt of apth);
+ fi
+ texarrowhead(T);
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0007.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0007.mp
new file mode 100644
index 0000000000..27218cfff5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0007.mp
@@ -0,0 +1,140 @@
+%% tgbx0007.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_twoheadarrow (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save math_spread, x_height, u, rule_thickness, bar, math_axis," &
+ " asc_height, eps, fudge, crisp, hair;" &
+
+ "math_spread :=" & decimal math_spread & ";" &
+ "x_height# :=" & decimal x_height# & ";" &
+ "u# :=" & decimal u# & ";" &
+ "rule_thickness# :=" & decimal rule_thickness# & ";" &
+ "bar# :=" & decimal bar# & ";" &
+ "math_axis# :=" & decimal math_axis# & ";" &
+ "asc_height# :=" & decimal asc_height# & ";" &
+ "eps :=" & decimal eps & ";" &
+ "fudge :=" & decimal fudge & ";" &
+ "crisp# :=" & decimal crisp# & ";" &
+ "hair# :=" & decimal hair# & ";")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save x,y;
+ numeric x[], x[]', x[]l, x[]'l, x[]r, x[]'r,
+ y[], y[]', y[]l, y[]'l, y[]r, y[]'r;
+ save spread, w;
+ numeric spread, w;
+
+ if crisp#>fudge*hair#:
+ crisp#:=fudge*hair#;
+ fi
+ pickup if crisp#=0: nullpen else: pencircle scaled crisp# fi;
+
+ spread = math_spread[.45x_height#, .55x_height#];
+ w = 18u#;
+
+ penpos1(rule_thickness#, 90); penpos2(rule_thickness#, 90);
+ penpos3(bar#, 0); penpos4(bar#, 0);
+ y0=y1=y2=math_axis#; x1-.5rule_thickness#=u#; rt x0=w-u#;
+ y3-y0=y0-y4=.24asc_height#+eps;
+ x3=x4=x0-3u#-eps;
+ penpos5(bar#, angle(z4-z0)); z5l=z0;
+ penpos6(bar#, angle(z3-z0)); z6l=z0;
+ z9=.381966[.5[z3,z4],z0];
+
+ save pp; path pp; pp = z4l{z9-z4}..z6r;
+ save t; numeric t; t = xpart(pp intersectiontimes ((0,y2l)--(w,y2l)));
+ x2=xpart point t of pp;
+
+ save texarrowhead;
+ vardef texarrowhead(expr T) =
+ filldraw (z0..{z4-z9}z4r--subpath(0,t) of pp
+ --z2l--z2r--subpath(t,0) of (z3l{z9-z3}..z5r)
+ --z3r{z9-z3}..z0 & cycle) transformed T text_;
+ enddef;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ save T; transform T;
+ save tt; numeric tt; tt = arctime(arclength apth - (x0-x9)) of apth;
+ save ttt; numeric ttt; ttt = arctime(arclength apth - (x0-x2)) of apth;
+
+ if arclength apth > x0-x2:
+ draw subpath(0,ttt) of apth
+ withpen pencircle scaled rule_thickness# text_;
+ fi
+
+ if arclength apth = 0:
+ T:=identity shifted (point (length apth) of apth - z0);
+ elseif arclength apth < x0-x3l:
+ T:=identity rotatedaround(z0,angle (direction (length apth) of apth))
+ shifted (point (length apth) of apth - z0);
+ else:
+ T:=mapto(z0,
+ point (length apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#*
+ (unitvector (direction tt of apth) rotated 90));
+ fi
+ texarrowhead(T);
+
+ tt :=arctime(arclength apth - (x0-x9) + (x3l-x0)) of apth;
+ ttt:=arctime(arclength apth - (x0-x2) + (x3l-x0)) of apth;
+ if arclength apth = 0:
+ T:=identity shifted (point 0 of apth - z0)
+ shifted (x3l-x0,0);
+ elseif arclength apth < x0-x3l+x0-x9:
+ T:=identity rotatedaround(z0,angle direction 0 of apth)
+ shifted ((x0-x3l)*
+ unitvector (point 0 of apth - point (length apth) of apth))
+ shifted ((point (length apth) of apth) - z0);
+ else:
+ T:=mapto(z0,
+ point (arctime((arclength apth)+(x3l-x0)) of apth) of apth,
+ z2,
+ point ttt of apth,
+ z9+(0,3rule_thickness#),
+ point tt of apth + 3rule_thickness#*
+ (unitvector (direction tt of apth) rotated 90));
+ fi
+ texarrowhead(T);
+
+ pickup prevpen;
+
+ enddef;
+
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/cmarrows/tgbx0027.mp b/graphics/metapost/contrib/macros/cmarrows/tgbx0027.mp
new file mode 100644
index 0000000000..6e024dc85d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/cmarrows/tgbx0027.mp
@@ -0,0 +1,216 @@
+%% tgbx0027.mp
+%% Copyright 2006 Tommy Ekola <tek@kth.se>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status `maintained'. The Current
+% Maintainer of this work is Tommy Ekola. The Base Interpreter is
+% MetaPost.
+
+vardef setup_paren (expr source_file, cmdname) =
+
+ scantokens ("input tgbx0000");
+
+ scantokens ("input " & source_file);
+
+ expandafter def scantokens cmdname expr p =
+ scantokens (cmdname & "__tgbxww")(p)
+ enddef;
+
+ expandafter vardef scantokens (cmdname & "__tgbxww " & "(expr apth) " &
+ "text text_ = " &
+
+ "save u, designsize, curve, stem, rule_thickness, eps, fine, " &
+ " fudge, hair;" &
+
+ "u# := " & decimal u# & ";" &
+ "designsize := " & decimal designsize & ";" &
+ "curve# := " & decimal curve# & ";" &
+ "stem# := " & decimal stem# & ";" &
+ "rule_thickness# := " & decimal rule_thickness# & ";" &
+ "eps := " & decimal eps & ";" &
+ "fine# := " & decimal fine# & ";" &
+ "fudge := " & decimal fudge & ";" &
+ "hair# := " & decimal hair# & ";" &
+
+ % Time for middle piece
+
+ "save st; numeric st;" &
+ "if unknown " & cmdname & "_middle_time:" &
+ " st := arctime (arclength apth)/2 of apth;" &
+ "else: st:=" & cmdname & "_middle_time; fi")
+
+ save prevpen;
+ prevpen:=savepen;
+
+ save w; numeric w; w :=12u#;
+ save h; numeric h; h :=0;
+ save dh; numeric dh; dh:=0.6designsize;
+ save dw; numeric dw; dw:=curve#-stem#;
+ save d; numeric d; d :=1.5dh;
+ save bold; numeric bold; bold := curve#;
+ save min_breadth; numeric min_breadth;
+ min_breadth:=rule_thickness#+0.6dw;
+ save max_breadth; numeric max_breadth;
+ max_breadth:=bold+2dw;
+ save heavy_rule_thickness; numeric heavy_rule_thickness#;
+ heavy_rule_thickness#:=3rule_thickness#;
+
+ save x,y;
+ numeric x[],x[]',x[]l,x[]'l,x[]r,x[]'r,
+ y[],y[]',y[]l,y[]'l,y[]r,y[]'r;
+
+ if fine#>fudge*hair#:
+ fine# := fudge*hair#;
+ fi
+ pickup if fine#=0: nullpen else: pencircle scaled fine# fi;
+
+ penpos3(min_breadth,0); penpos4(max_breadth,0);
+ rt x3r = w-1.25u#+0.5min_breadth; lft x4l = 1.25u#;
+ bot y3=-d; y4=h;
+
+ penpos1(min_breadth,0); penpos2(max_breadth,0);
+ rt x1r = w-1.25u#+0.5min_breadth; lft x2l = 1.25u#;
+ top y1 = h; y2=-d;
+
+ save mapto, n;
+ vardef mapto(text t) =
+ hide(numeric n; n:=0;
+ numeric x,x_[],y,y_[];
+ for z=t: z_[incr n]:=z; endfor;
+ transform T;
+ z_2 = z_1 transformed T;
+ z_4 = z_3 transformed T;
+ z_6 = z_5 transformed T;)
+ T
+ enddef;
+
+ % The bottom part of the parenthesis
+
+ save bottom_part;
+ vardef bottom_part(expr T) =
+ filldraw (z3l{3(x4l-x3l),y4-y3}..{up}z4l
+ --reverse(z3r{3(x4r-x3r),y4-y3}..{up}z4r)
+ --cycle) transformed T text_;
+ enddef;
+
+ save f;
+ vardef f(expr s) =
+ abs(point 0 of apth - (point s of apth +
+ (w-2.5u#+0.5min_breadth+0.5*max_breadth)
+ *(unitvector (direction s of apth) rotated 90)))
+ < ((h+d) ++ (w-2.5u#+0.5min_breadth+0.5*max_breadth))
+ enddef;
+
+ save tolerence; tolerence:=epsilon;
+ save s; numeric s;
+
+ save T; transform T; % transform the bottom part
+ if arclength apth=0:
+ T := identity shifted (point (length apth) of apth - z3r);
+ elseif arclength apth < y1-y2+y4-y3:
+ T := mapto(z4l,
+ 0.5[point 0 of apth, point (length apth) of apth]
+ + abs(x3r-x4l)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z4r,
+ 0.5[point 0 of apth, point (length apth) of apth]
+ + abs(x3r-x4r)*(unitvector (point (length apth) of apth -
+ point 0 of apth) rotated 90),
+ z3r,
+ point 0 of apth);
+ else:
+ s := solve f(0,length apth);
+ T := mapto(z4l,
+ point s of apth + (w-2.5u#+0.5min_breadth+0.5max_breadth)
+ *(unitvector (direction s of apth) rotated 90),
+ z4r,
+ point s of apth + (w-2.5u#+0.5min_breadth-0.5max_breadth)
+ *(unitvector (direction s of apth) rotated 90),
+ z3r,
+ point 0 of apth);
+ fi;
+
+ bottom_part(T);
+
+ % The top part of the parenthesis
+
+ save top_part;
+ vardef top_part(expr T) =
+ filldraw (z1l{3(x2l-x1l),y2-y1}..{down}z2l
+ --reverse(z1r{3(x2r-x1r),y2-y1}..{down}z2r)
+ --cycle) transformed T text_;
+ enddef;
+
+ save g;
+ vardef g(expr t) =
+ abs(point (length apth) of apth - (point t of apth +
+ (w-2.5u#+0.5min_breadth+0.5max_breadth)
+ *(unitvector (direction s of apth) rotated 90)))
+ < ((h+d) ++ (w-2.5u#+0.5min_breadth+0.5max_breadth))
+ enddef;
+
+ save t; numeric t;
+ transform T; % transform the top part
+ if arclength apth = 0:
+ T := identity shifted (point (length apth) of apth - z1r);
+ elseif arclength apth < y1-y2+y4-y3:
+ T := mapto(z2l,
+ 0.5[point 0 of apth, point (length apth) of apth]
+ +abs(x1r-x2l)*(unitvector (point (length apth) of apth
+ - point 0 of apth) rotated 90),
+ z2r,
+ 0.5[point 0 of apth, point (length apth) of apth]
+ +abs(x1r-x2r)*(unitvector (point (length apth) of apth
+ - point 0 of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ else:
+ t := solve g(length apth, 0);
+ T := mapto(z2l,
+ point t of apth + (w-2.5u#+0.5min_breadth+0.5max_breadth)
+ *(unitvector (direction t of apth) rotated 90),
+ z2r,
+ point t of apth + (w-2.5u#+0.5min_breadth-0.5max_breadth)
+ *(unitvector (direction t of apth) rotated 90),
+ z1r,
+ point (length apth) of apth);
+ fi;
+
+ top_part(T);
+
+ % The extension part
+
+ save extension_part;
+ vardef extension_part(expr ss,tt) =
+ numeric stp; stp:=(ss-tt) div 5pt;
+ if stp=0: stp:=1; fi
+ stp:=(ss-tt)/stp;
+
+ pickup pencircle scaled heavy_rule_thickness#;
+
+ if stp>0:
+ draw for uu=ss step stp until tt-stp:
+ point uu of apth + (w-2.5u#+.5min_breadth)
+ *(unitvector (direction uu of apth) rotated 90)
+ {direction uu of apth} ..
+ endfor
+ {direction tt of apth}
+ point tt of apth + (w-2.5u#+.5min_breadth)
+ *(unitvector (direction tt of apth) rotated 90) text_;
+ fi
+ enddef;
+
+ if arclength apth > y1-y2+y4-y3:
+ extension_part(s,t);
+ fi
+
+ pickup prevpen;
+
+ enddef;
+
+enddef;
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/drv/README b/graphics/metapost/contrib/macros/drv/README
new file mode 100644
index 0000000000..72248d2b54
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/README
@@ -0,0 +1,21 @@
+drv - derivation trees with MetaPost
+version 0.97
+
+Licence
+lppl
+
+Description
+drv is a set of MetaPost macros for typesetting derivation trees (such as
+used in sequent calculus, type inference, programming language semantics...)
+NO MetaPost knowledge is needed to use these macros.
+
+Contents
+drv.mp the main file
+drv-guide.pdf a user guide attempt
+doc/ the sources for drv-guide.pdf
+sample/ an example of use in conjunction with the beamer class
+template/ a basic set of files for your own tries
+README this file
+
+Any feedback is welcome.
+laurent.mehats@gmail.com
diff --git a/graphics/metapost/contrib/macros/drv/doc/drv-guide.mp b/graphics/metapost/contrib/macros/drv/doc/drv-guide.mp
new file mode 100644
index 0000000000..e2bf1ba983
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/doc/drv-guide.mp
@@ -0,0 +1,2110 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Structure of a MetaPost file using drv
+% 1. Preamble
+% input drv;
+% verbatimtex%&latex
+% <LaTeX preamble>
+% \begin{document}
+% etex;
+% 2. Figures
+% <optional drv tunings>
+% beginfig(<index>)
+% <judgment & inference declarations>
+% draw drv_tree;
+% <optional extra MetaPost code>
+% endfig;
+% 3. Postamble
+% end
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 1. Preamble
+%
+
+input drv;
+
+verbatimtex%&latex
+
+% Any piece of code related to font selection in the preamble of
+% `drv-guide.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{stmaryrd}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\newcommand{\limp}{\multimapinv}
+\newcommand{\rimp}{\multimap}
+
+\begin{document}
+etex;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 2. Figures
+%
+
+%
+% Uncomment the following line to experiment the radial mode.
+% drv_radial_mode on;
+%
+
+%
+% title page
+%
+
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+
+%
+% first example
+%
+
+beginfig(110)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+nfr 0 () ("f", 1);
+nfr 1 () ("g", 1);
+nfr 2 (0, 1) ("\circ", 1);
+draw drv_tree;
+endfig;
+
+%
+% sub-judgments
+%
+
+beginfig(111)
+jgm 0 "A\vdash B";
+jgm 1 "A", "\vdash", "B";
+nfr 0 () ("f", 1);
+nfr 1 (0) ("f", 1);
+draw drv_tree;
+endfig;
+
+
+%
+% inference line styles
+%
+
+beginfig(120)
+jgm 0 "\text{none}";
+jgm 1 "\text{simple}";
+jgm 2 "\text{double}";
+jgm 3 "\text{dotted}";
+jgm 4 "\text{dashed}";
+jgm 5 "\text{waved}";
+jgm 6 "\text{\TeX-dotted}";
+jgm 7 "\text{default}";
+nfr 0 ( ) ("\leftarrow 0", 0);
+nfr 1 (0) ("\leftarrow 1", 1);
+nfr 2 (1) ("\leftarrow 2", 2);
+nfr 3 (2) ("\leftarrow 3", 3);
+nfr 4 (3) ("\leftarrow 4", 4);
+nfr 5 (4) ("\leftarrow 5", 5);
+nfr 6 (5) ("\leftarrow 6", 6);
+nfr 7 (6) ("\leftarrow\_", _);
+draw drv_tree;
+endfig;
+
+%
+% declarations order
+%
+
+beginfig(130)
+% preorder declarations
+jgm 0 "0";
+ jgm 1 "00";
+ jgm 2 "000";
+ jgm 3 "001";
+ jgm 4 "002";
+ jgm 5 "01";
+ jgm 6 "010";
+ jgm 7 "011";
+ jgm 8 "012";
+ jgm 9 "02";
+ jgm 10 "020";
+ jgm 11 "021";
+ jgm 12 "022";
+nfr 0 (1, 5, 9) ("a", _);
+ nfr 1 (2, 3, 4) ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 () ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 (6, 7, 8) ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 () ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 (10, 11, 12) ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 () ("l", _);
+ nfr 12 () ("m", _);
+draw drv_tree;
+endfig;
+
+beginfig(131)
+% postorder declarations
+ jgm 0 "000";
+ jgm 1 "001";
+ jgm 2 "002";
+ jgm 3 "00";
+ jgm 4 "010";
+ jgm 5 "011";
+ jgm 6 "012";
+ jgm 7 "01";
+ jgm 8 "020";
+ jgm 9 "021";
+ jgm 10 "022";
+ jgm 11 "02";
+jgm 12 "0";
+ nfr 0 () ("a", _);
+ nfr 1 () ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 (0, 1, 2) ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 () ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 (4, 5, 6) ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 () ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 (8, 9, 10) ("l", _);
+nfr 12 (3, 7, 11) ("m", _);
+draw drv_tree;
+endfig;
+
+%
+% dcl
+%
+
+beginfig(140)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 () ("g", 1) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+beginfig(141)
+dcl 0 () ("f", 1) "A", "\vdash", "B";
+draw drv_tree;
+endfig;
+
+beginfig(141)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 (0) ("f", 1) "A", "\vdash", "B";
+draw drv_tree;
+endfig;
+
+beginfig(150)
+dcl 0 (1, 5, 9) ("a", _) "0";
+ dcl 1 (2, 3, 4) ("b", _) "00";
+ dcl 2 () ("c", _) "000";
+ dcl 3 () ("d", _) "001";
+ dcl 4 () ("e", _) "002";
+ dcl 5 (6, 7, 8) ("f", _) "01";
+ dcl 6 () ("g", _) "010";
+ dcl 7 () ("h", _) "011";
+ dcl 8 () ("i", _) "012";
+ dcl 9 (10, 11, 12) ("j", _) "02";
+ dcl 10 () ("k", _) "020";
+ dcl 11 () ("l", _) "021";
+ dcl 12 () ("m", _) "022";
+draw drv_tree;
+endfig;
+
+%
+% bxd
+%
+
+beginfig(160)
+dcl 0 (1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+
+beginfig(161)
+dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+
+vardef auxbox[]=
+ if drv_radialmode_on:
+ save l_ngl, r_ngl, min_rad, max_rad, tnum;
+ numeric l_ngl, r_ngl, min_rad, max_rad, tnum;
+ l_ngl:=ngl_part sub_lmost_ppt[@];
+ r_ngl:=ngl_part sub_rmost_ppt[@];
+ tnum:=if bot_jdg[@]: - fi 1;
+ min_rad:=iln[ccl[@]].rad+iln[ccl[@]].hg+min_clr_scl*min_clr[drv_sty]/2;
+ max_rad:=sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ ((dir l_ngl) scaled min_rad--(dir l_ngl) scaled max_rad
+ {dir (l_ngl+tnum*90)} .. {dir (r_ngl+tnum*90)}
+ (dir r_ngl) scaled max_rad--(dir r_ngl) scaled min_rad
+ {dir (r_ngl-tnum*90)} .. {dir (l_ngl-tnum*90)}
+ cycle) shifted jdg[@].org
+ else:
+ ((sub_min_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)--
+ (sub_min_x[@], sub_max_y[@])--
+ (sub_max_x[@], sub_max_y[@])--
+ (sub_max_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)--
+ cycle) shifted (0, min_clr_scl*min_clr[drv_sty]/2)
+ fi
+enddef;
+
+beginfig(162)
+dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+draw auxbox[1] withcolor (1, 0, 0);
+endfig;
+
+%
+% mvd
+%
+
+beginfig(170)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (mvd 1 (2, 3), 2, 3) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(171)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (1, mvd 2 (2, 4), 3) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(172)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (1, 2, mvd 3 (2, 6)) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(180)
+jgm 0 "\textsc{Size matters -- Part 1}";
+jgm 1 "\text{Here is a rather long judgment"& % string concatenation
+ " that I don't want to shorten.}";
+jgm 2 "\text{Will the derivation tree fit on the page?}";
+jgm 3 "\text{It does.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (mvd 1 (2, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+
+%
+% Nfr
+%
+
+beginfig(190)
+jgm 0 "a";
+jgm 1 "b";
+jgm 2 "c";
+jgm 3 "d";
+Nfr 0 () ("0", "", "", _);
+Nfr 1 () ("1", "", "", _);
+Nfr 2 (0, 1) ("2", "E", "", _);
+Nfr 3 (2) ("3", "", "F", _);
+draw drv_tree;
+endfig;
+
+%
+% Dcl
+%
+
+beginfig(200)
+Dcl 0 () ("", "", "", _) "a";
+Dcl 1 (0) ("", "", "B", _) "c";
+Dcl 2 () ("", "", "", _) "d";
+Dcl 3 (1, 2) ("", "E", "", _) "f";
+draw drv_tree;
+endfig;
+
+%
+% Mvd
+%
+
+beginfig(210)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 (Mvd 1 (2, "d", "", 3), 2) ("", _);
+draw drv_tree;
+endfig;
+
+%
+% drv_font_size
+%
+
+drv_font_size "\tiny";
+
+beginfig(220)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\small";
+
+beginfig(221)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\Large";
+
+beginfig(222)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% drv_math_style (drv, );
+%
+
+beginfig(230)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\textstyle");
+
+beginfig(231)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\scriptstyle");
+
+beginfig(232)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\displaystyle");
+
+%
+% drv_math_style (jdg, );
+%
+
+drv_math_style (jdg, "\displaystyle");
+
+beginfig(240)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\textstyle");
+
+beginfig(241)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\scriptstyle");
+
+beginfig(242)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\textstyle");
+
+%
+% drv_math_style (ilb, );
+%
+
+drv_math_style (ilb, "\textstyle");
+
+beginfig(250)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+
+beginfig(251)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptscriptstyle");
+
+beginfig(252)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+
+%
+% drv_scale (clr, );
+%
+
+drv_scale (clr, 0);
+
+beginfig(260)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 1);
+
+beginfig(261)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 2.5);
+
+beginfig(262)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 4);
+
+beginfig(263)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 1);
+
+%
+% drv_scale (prm, );
+%
+
+drv_scale (prm, 0);
+
+beginfig(270)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 1);
+
+beginfig(271)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 2.5);
+
+beginfig(272)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 4);
+
+beginfig(273)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 1);
+
+%
+% drv_scale (jgm, );
+%
+
+drv_scale (jgm, 0);
+
+beginfig(280)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 1);
+
+beginfig(281)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 2.5);
+
+beginfig(282)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 4);
+
+beginfig(283)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 1);
+
+%
+% drv_scale (ilb, );
+%
+
+drv_scale (ilb, 0);
+
+beginfig(290)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 1);
+
+beginfig(291)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 2.5);
+
+beginfig(292)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 4);
+
+beginfig(293)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 1);
+
+%
+% drv_junction_style
+%
+
+drv_junction_style 0;
+
+beginfig(300)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_junction_style 1;
+
+beginfig(301)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+draw auxbox[8] withcolor .9(1, 1, 1);
+endfig;
+
+drv_junction_style 2;
+
+beginfig(302)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+draw auxbox[5] withcolor .9(1, 1, 1);
+draw auxbox[8] withcolor .9(1, 1, 1);
+endfig;
+
+drv_junction_style 1;
+
+%
+% drv_alignment_style
+%
+
+drv_alignment_style l;
+
+beginfig(310)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style c;
+
+beginfig(311)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style r;
+
+beginfig(312)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style c;
+
+%
+% drv_labels_position
+%
+
+drv_labels_position l;
+
+beginfig(320)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_labels_position r;
+
+beginfig(321)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_roots_position
+%
+
+drv_roots_position t;
+
+beginfig(330)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+drv_axis (iln, 3);
+endfig;
+
+drv_roots_position b;
+
+beginfig(331)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_axis_reference
+%
+
+beginfig(340)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_axis_reference jdg;
+
+beginfig(341)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_axis_reference iln;
+
+%
+% drv_left_delimiter
+%
+
+drv_left_delimiter "(";
+
+beginfig(350)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\lfloor";
+
+beginfig(351)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter ".";
+
+beginfig(352)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\lbrace";
+
+%
+% drv_right_delimiter
+%
+
+drv_right_delimiter "\rangle";
+
+beginfig(360)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter "\uparrow";
+
+beginfig(361)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter ".";
+
+beginfig(362)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter "\rbrace";
+
+%
+% drv_box_mode
+%
+
+drv_box_mode on;
+
+beginfig(370)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+beginfig(371)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+for idx=0, 1, 2, 3:
+ draw auxbox[idx] withcolor (1, 0, 0);
+endfor
+endfig;
+
+drv_box_mode off;
+
+beginfig(372)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_fraction_mode
+%
+
+beginfig(380)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 0);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+endfig;
+
+drv_fraction_mode off;
+
+beginfig(381)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 0);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+endfig;
+
+drv_fraction_mode on;
+
+beginfig(382)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 1);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+draw iln[0] withcolor background withpen drv_pen scaled 2;
+draw iln[0] withcolor (1, 0, 0);
+endfig;
+
+%
+% drv_proof_mode
+%
+
+drv_proof_mode on;
+
+beginfig(390)
+jgm 0 "A", "\vdash", "A";
+jgm 1 "B", "\vdash", "B";
+jgm 2 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 3 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 0 () ("1", 1);
+nfr 1 () ("1", 1);
+nfr 2 (0, 1) ("\multimap_{L}", 1);
+nfr 3 (2) ("\multimap_{R}", 1);
+draw drv_tree;
+endfig;
+
+drv_proof_mode off;
+
+beginfig(391)
+jgm 0 "A", "\vdash", "A";
+jgm 1 "B", "\vdash", "B";
+jgm 2 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 3 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 0 () ("1", 1);
+nfr 1 () ("1", 1);
+nfr 2 (0, 1) ("\multimap_{L}", 1);
+nfr 3 (2) ("\multimap_{R}", 1);
+draw drv_tree;
+endfig;
+
+%
+% a fraction
+%
+
+drv_font_size "\huge";
+drv_scale (jgm, 0);
+
+beginfig(400)
+dcl 0 ( ) ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree;
+endfig;
+
+drv_font_size "\normalsize";
+drv_scale (jgm, 1);
+
+%
+% drv_bbox
+%
+
+beginfig(410)
+dcl 0 (1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color
+draw drv_tree;
+endfig;
+
+beginfig(411)
+dcl 0 (bxd 1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color
+draw drv_tree;
+endfig;
+
+%
+% drv_axis
+%
+
+beginfig(420)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (iln, 0);
+endfig;
+
+beginfig(421)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (jdg, 1);
+endfig;
+
+beginfig(422)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (dlm, 1);
+endfig;
+
+%
+% NFR
+%
+
+beginfig(430)
+jgm 0 "a";
+NFR 0 () ("1", "2", "3", "4", _, _, _);
+draw drv_tree;
+endfig;
+
+%
+% DCL
+%
+
+beginfig(440)
+DCL 0 () ("1", "", "", "", _, _, _) "a";
+DCL 1 () ("", "2", "", "", _, _, _) "b";
+DCL 2 (0, 1) ("", "", "3", "", _, _, _) "c";
+DCL 3 (2) ("", "", "", "4", _, _, _) "d";
+draw drv_tree;
+endfig;
+
+%
+% MVD
+%
+
+beginfig(450)
+jgm 0 "a";
+ jgm 1 "b";
+ jgm 2 "cccccc";
+ jgm 3 "ddd";
+ jgm 4 "eeeeeeeee";
+nfr 0 (1, MVD 4 (5, "", "F", r, 4)) ("", _);
+ nfr 1 (MVD 2 (2, "G", "", l, 3), 3) ("", _);
+ nfr 2 () ("", _);
+ nfr 3 () ("", _);
+ nfr 4 () ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(460)
+jgm 0 "\textsc{Size matters -- Part 2}";
+jgm 1 "\text{Here is an even longer judgment"&
+ " that I don't want to shorten either.}";
+jgm 2 "\text{This time I'm pretty sure that the"&
+ " derivation tree won't fit on the page.}";
+jgm 3 "\text{It does! Amazing.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (MVD 1 (2, "", "", l, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+
+%
+% Components and central points
+%
+
+drv_font_size "\large";
+
+beginfig(470) % components
+DCL 5 () ("", "", "", "", _, _, 0) "A";
+DCL 6 (5) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "B", "C";
+DCL 7 (MVD 6 (2, "(5)", "(6)", _, 6)) ("", "", "", "", _, _, 1) "D";
+drv_freeze; % usually called by drv_tree
+draw jdg[5]; % judgment A
+draw sbj[6][0] withcolor (3, 0, 0)/3; % sub-judgment B
+draw sbj[6][1] withcolor (2, 0, 0)/3; % sub-judgment C
+draw iln[6] withcolor (0, 4, 0)/4; % inference line
+draw l_ilb[6] withcolor (0, 3, 0)/4; % left inference label (1)
+draw r_ilb[6] withcolor (0, 2, 0)/4; % right inference label (2)
+draw l_dlm[6] withcolor (0, 0, 3)/3; % left delimiter
+draw l_dlb[6] withcolor (0, 0, 2)/3; % left delimiter label (3)
+draw r_dlm[6] withcolor (3, 0, 3)/3; % right delimiter
+draw r_dlb[6] withcolor (2, 0, 2)/3; % right delimiter label (4)
+draw phm[6] withcolor (0, 3, 3)/4; % phantom steps path
+draw l_plb[6] withcolor (0, 2, 2)/4; % left phantom steps label (5)
+draw r_plb[6] withcolor (0, 1, 1)/4; % right phantom steps label (6)
+draw jdg[7]; % judgment D
+draw iln[7]; % inference line
+endfig;
+
+beginfig(471) % central points
+DCL 5 () ("", "", "", "", _, _, 0) "A";
+DCL 6 (5) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "B", "C";
+DCL 7 (MVD 6 (2, "(5)", "(6)", _, 6)) ("", "", "", "", _, _, 1) "D";
+pickup pencircle scaled 2.5;
+draw drv_tree withcolor (3, 3, 3)/4;
+draw jdg[5].c; % judgment A
+draw sbj[6][0].c withcolor (3, 0, 0)/3; % sub-judgment B
+draw sbj[6][1].c withcolor (2, 0, 0)/3; % sub-judgment C
+draw iln[6].c withcolor (0, 4, 0)/4; % inference line
+draw l_ilb[6].c withcolor (0, 3, 0)/4; % left inference label (1)
+draw r_ilb[6].c withcolor (0, 2, 0)/4; % right inference label (2)
+draw l_dlm[6].c withcolor (0, 0, 3)/3; % left delimiter
+draw l_dlb[6].c withcolor (0, 0, 2)/3; % left delimiter label (3)
+draw r_dlm[6].c withcolor (3, 0, 3)/3; % right delimiter
+draw r_dlb[6].c withcolor (2, 0, 2)/3; % right delimiter label (4)
+draw phm[6].c withcolor (0, 3, 3)/4; % phantom steps path
+draw l_plb[6].c withcolor (0, 2, 2)/4; % left phantom steps label (5)
+draw r_plb[6].c withcolor (0, 1, 1)/4; % right phantom steps label (6)
+draw jdg[7].c; % judgment D
+draw iln[7].c; % inference line
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% Dimensions
+%
+
+vardef aux_drawdblarrow expr pth=
+save ah;
+path ah;
+ah:=ahlength*(dir (180-ahangle/2))--(0, 0)--
+ ahlength*(dir (180+ahangle/2));
+if direction infinity of pth<>(0, 0):
+ draw pth;
+ draw ah rotated (angle (direction infinity of pth))
+ shifted (point infinity of pth);
+ draw ah rotated (180+angle (direction -infinity of pth))
+ shifted (point -infinity of pth);
+fi
+enddef;
+
+drv_box
+ "jdg_ma[]",
+ "jdg_cp[]",
+ "jdg_hg[]",
+ "jdg_dp[]",
+ "iln_cp[]",
+ "n_hg",
+ "d_dp";
+for idx=0, 1:
+ box_init jdg_ma[idx](mth_tex[1]"\textit{math axis}");
+ box_init jdg_cp[idx](mth_tex[2]"\texttt{jdg["&decimal idx&"].c}");
+ box_init jdg_hg[idx](mth_tex[1]"\texttt{jdg["&decimal idx&"].hg}");
+ box_init jdg_dp[idx](mth_tex[1]"\texttt{jdg["&decimal idx&"].dp}");
+ box_init iln_cp[idx](mth_tex[2]"\texttt{iln["&decimal idx&"].c}");
+endfor
+box_init n_hg(mth_tex[1]"\texttt{num\_hg}");
+box_init d_dp(mth_tex[1]"\texttt{den\_dp}");
+
+drv_font_size "\fontsize{100}{0}";
+
+beginfig(480)
+dcl 0 () ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree withcolor .75*background;
+interim linejoin:=beveled;
+interim ahangle:=60;
+lref[0]:=xpart iln[1].l-20pt;
+lref[1]:=xpart iln[1].l-10pt;
+lref[2]:=xpart iln[1].l-25pt;
+rref[0]:=xpart iln[1].r+20pt;
+rref[1]:=xpart iln[1].r+10pt;
+rref[2]:=xpart iln[1].r+25pt;
+for idx=0, 1:
+ forsuffixes sfx=l, c ,r:
+ draw jdg[idx].sfx withpen pencircle scaled 2.5;
+ endfor
+ lx[idx]:=xpart jdg[idx].l;
+ rx[idx]:=xpart jdg[idx].r;
+ ty[idx]:=ypart jdg[idx].c+jdg[idx].hg;
+ cy[idx]:=ypart jdg[idx].c;
+ by[idx]:=ypart jdg[idx].c+jdg[idx].dp;
+ for pth=
+ (lx[idx], ty[idx])--(rref[0], ty[idx]),
+ (lref[0], cy[idx])--(rref[0], cy[idx]),
+ (lx[idx], by[idx])--(rref[0], by[idx]),
+ (lx[idx], ty[idx])--(lx[idx], by[idx]),
+ (rx[idx], ty[idx])--(rx[idx], by[idx]):
+ draw pth dashed evenly scaled .5;
+ endfor
+ for pth=
+ (rref[1], ty[idx])--(rref[1], cy[idx]),
+ (rref[1], cy[idx])--(rref[1], by[idx]):
+ aux_drawdblarrow pth;
+ endfor
+ jdg_ma[idx].r=(lref[2], cy[idx]);
+ jdg_cp[idx].c=jdg[idx].c shifted (0, -7.5pt);
+ jdg_hg[idx].l=(rref[2], (ty[idx]+cy[idx])/2);
+ jdg_dp[idx].l=(rref[2], (cy[idx]+by[idx])/2);
+ forsuffixes sfx=jdg_ma, jdg_cp, jdg_hg, jdg_dp:
+ box_freeze sfx[idx];
+ draw sfx[idx];
+ endfor
+endfor
+draw iln[1].c withpen pencircle scaled 2.5;
+iln_cp[1].c=iln[1].c shifted (0, -7.5pt);
+box_freeze iln_cp[1];
+draw iln_cp[1];
+iln_y:=ypart iln[1].c;
+draw (lref[0], iln_y)--(rref[0], iln_y) dashed evenly scaled .5;
+aux_drawdblarrow (lref[1], cy[0])--(lref[1], iln_y);
+aux_drawdblarrow (lref[1], iln_y)--(lref[1], cy[1]);
+n_hg.r=(lref[2], (cy[0]+iln_y)/2);
+d_dp.r=(lref[2], (iln_y+cy[1])/2);
+forsuffixes sfx=n_hg, d_dp:
+ box_freeze sfx;
+ draw sfx;
+endfor
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% drv_styled
+%
+
+beginfig(490)
+jgm 4 "A", "\vdash", "A";
+jgm 5 "B", "_2", "\vdash", "B", "_3";
+jgm 6 "A", ",", "A", "\multimap", "B", "_1", "\vdash", "B", "_4";
+jgm 7 "A", "\multimap", "B", "_0", "\vdash", "A", "\multimap", "B", "_5";
+nfr 4 () ("1", _);
+nfr 5 () ("1", _);
+nfr 6 (4, 5) ("\multimap_{L}", _);
+nfr 7 (6) ("\multimap_{R}", _);
+drv_freeze; % B
+draw (sbj[7][2].c shifted (0, -num_hg) .. % 0
+ sbj[7][2].c {up} .. % 0
+ sbj[6][4].c .. % 1
+ sbj[5][0].c .. tension 1.2 .. % 2
+ sbj[5][3].c .. % 3
+ sbj[6][7].c .. % 4
+ sbj[7][7].c {down} .. % 5
+ sbj[7][7].c shifted (0, -num_hg)) % 5
+drv_styled 2 withcolor (1, 0, 0);
+draw drv_tree;
+endfig;
+
+%
+% ``User specified'' junction style
+%
+
+beginfig(500)
+jgm 0 "{\cdot}";
+jgm 1 "{\cdot}";
+jgm 2 "\text{You may check that"&
+ if drv_radialmode_on:
+ " the angle between the two dots above is 45$^\circ$.}"
+ else:
+ " the distance between the two dots above is 5 cm.}"
+ fi;
+NFR 0 () ("", "", "", "", _, _, _);
+NFR 1 () ("", "", "", "", _, _, _);
+NFR 2 (0, 1) ("", "", "", "", 3, _, _); % caution: 3
+if drv_radialmode_on:
+ jdg[1].lng=jdg[0].rng-45;
+else:
+ xpart jdg[1].c=xpart jdg[0].c+5cm;
+fi
+draw drv_tree;
+endfig;
+
+%
+% ``User specified'' alignment style
+%
+
+beginfig(510) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+if drv_radialmode_on:
+ sbj[1][1].cng=sbj[0][1].cng;
+ sbj[2][1].cng=sbj[1][1].cng;
+else:
+ xpart sbj[1][1].c=xpart sbj[0][1].c;
+ xpart sbj[2][1].c=xpart sbj[1][1].c;
+fi
+draw drv_tree;
+endfig;
+
+beginfig(511) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+if drv_radialmode_on:
+ sbj[1][1].lng=sbj[0][1].rng;
+ sbj[2][1].lng=sbj[1][1].rng;
+else:
+ xpart sbj[1][1].l=xpart sbj[0][1].r;
+ xpart sbj[2][1].l=xpart sbj[1][1].r;
+fi
+draw drv_tree;
+endfig;
+
+%
+% debugging
+%
+
+beginfig(520)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+jgm 3 "C\vdash D";
+jgm 4 "A\vdash D";
+nfr 0 () ("f", _);
+nfr 1 () ("g", _);
+nfr 2 (0, 1) ("\circ", _);
+nfr 3 () ("h", _);
+nfr 4 (2, 3) ("\circ", _);
+draw drv_tree;
+endfig;
+
+%
+% derivation forests
+%
+
+beginfig(530)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+draw drv_tree;
+endfig;
+
+beginfig(531)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+% relative positionning
+if drv_radialmode_on:
+ jdg[10].rad=jdg[22].rad;
+else:
+ ypart jdg[10].c=ypart jdg[22].c;
+fi
+draw drv_tree;
+endfig;
+
+beginfig(532)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+% relative positionning
+if drv_radialmode_on:
+ iln[10].rng=iln[20].lng;
+else:
+ xpart iln[10].r=xpart iln[20].l;
+fi
+draw drv_tree;
+endfig;
+
+%
+% drv_root
+%
+
+beginfig(533)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+drv_root (20, t); % root at top!
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\downarrow";
+drv_right_delimiter "\uparrow";
+
+beginfig(540)
+% first tree
+jgm 10 "A\vdash D";
+Nfr 10 (11, 14) ("\circ", "h\circ (g\circ f)", "", 1);
+ dcl 11 (12, 13) ("\circ", 1) "A\vdash C";
+ dcl 12 () ("f", 2) "A\vdash B";
+ dcl 13 () ("g", 3) "B\vdash C";
+ dcl 14 () ("h", 4) "C\vdash D";
+% second tree
+jgm 20 "\phantom{A\vdash D}";
+Nfr 20 (21, 22) ("\circ", "", "(h\circ g)\circ f", 1);
+ dcl 21 () ("f", 2) "A\vdash B";
+ dcl 22 (23, 24) ("\circ", 1) "B\vdash D";
+ dcl 23 () ("g", 3) "B\vdash C";
+ dcl 24 () ("h", 4) "C\vdash D";
+drv_root (20, t); % root at top!
+% overlapping
+jdg[10].c=jdg[20].c;
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+
+%
+% drv_radial_mode
+%
+
+drv_radial_mode on;
+
+beginfig(550)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 () ("h", 4) "C\vdash D";
+dcl 3 (1, 2) ("\circ", 1) "B\vdash D";
+dcl 4 (0, 3) ("\circ", 1) "A\vdash D";
+draw drv_tree;
+endfig;
+
+drv_roots_position t;
+
+beginfig(551)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 () ("h", 4) "C\vdash D";
+dcl 3 (1, 2) ("\circ", 1) "B\vdash D";
+dcl 4 (0, 3) ("\circ", 1) "A\vdash D";
+draw drv_tree;
+endfig;
+
+drv_roots_position b;
+drv_radial_mode off;
+
+beginfig(552)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 () ("h", 4) "C\vdash D";
+dcl 3 (1, 2) ("\circ", 1) "B\vdash D";
+dcl 4 (0, 3) ("\circ", 1) "A\vdash D";
+draw drv_tree;
+endfig;
+
+drv_roots_position t;
+
+beginfig(553)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 () ("h", 4) "C\vdash D";
+dcl 3 (1, 2) ("\circ", 1) "B\vdash D";
+dcl 4 (0, 3) ("\circ", 1) "A\vdash D";
+draw drv_tree;
+endfig;
+
+drv_roots_position b;
+
+%
+% drv_scale (crv, );
+%
+
+drv_radial_mode on;
+drv_scale (crv, 0.5);
+
+beginfig(560)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_scale (crv, 1);
+
+beginfig(561)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_scale (crv, 2);
+
+beginfig(562)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_scale (crv, 4);
+
+beginfig(563)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_scale (crv, 1);
+drv_radial_mode off;
+
+%
+% drv_azimuth
+%
+
+drv_radial_mode on;
+drv_azimuth 120;
+
+beginfig(570)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_azimuth 90;
+
+beginfig(571)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_azimuth 60;
+
+beginfig(572)
+dcl 0 () ("f", 2) "A\vdash B";
+dcl 1 () ("g", 3) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+drv_azimuth 90;
+drv_radial_mode off;
+
+%
+% Size matters - Part 3
+%
+
+drv_radial_mode on;
+
+beginfig(580)
+dcl 0 () ("", 0) "\textsc{Size matters -- Part 3}";
+dcl 1 (0) ("", 1) "\text{How could this very long judgment fit on the page"&
+ " without being desperately bent into a circle arc ?}";
+draw drv_tree;
+endfig;
+
+drv_radial_mode off;
+
+%
+% User specified junction and alignment styles
+%
+
+drv_radial_mode on;
+
+beginfig(590) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+sbj[1][1].cng=sbj[0][1].cng;
+sbj[2][1].cng=sbj[1][1].cng;
+draw drv_tree;
+endfig;
+
+beginfig(591) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+sbj[1][1].lng=sbj[0][1].rng;
+sbj[2][1].lng=sbj[1][1].rng;
+draw drv_tree;
+endfig;
+
+drv_radial_mode off;
+
+%
+% example - triple unit
+%
+
+drv_verbatimtex
+ "\renewcommand{\limp}{\thinspace{\multimapinv}\thinspace}"&
+ "\renewcommand{\rimp}{\thinspace{\multimap}\thinspace}";
+
+string id, Llimp, Rlimp, Lrimp, Rrimp;
+id:="\text{id}";
+Llimp:="\overset{\multimapinv}{\eta}";
+Rlimp:="\overset{\multimapinv}{\varepsilon}";
+Lrimp:="\overset{\multimap}{\eta}";
+Rrimp:="\overset{\multimap}{\varepsilon}";
+
+beginfig(600)
+jgm 10 "1\limp(a\rimp 1)\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1";
+ jgm 11 "1\limp(a\rimp 1)\vdash 1\limp(a\rimp 1)";
+ jgm 12 "1\limp(a\rimp 1)\otimes a\rimp 1\vdash 1";
+ jgm 13 "a\rimp 1\vdash a\rimp 1";
+ jgm 14 "a\otimes a\rimp 1\vdash 1";
+ jgm 15 "a\vdash a";
+ jgm 16 "1\vdash 1";
+ jgm 17 "1\vdash 1";
+ jgm 18 "1\vdash 1";
+nfr 10 (11, 18) (Lrimp, 1);
+ nfr 11 (12) (Rlimp, 1);
+ nfr 12 (13, 17) (Llimp, 1);
+ nfr 13 (14) (Rrimp, 1);
+ nfr 14 (15, 16) (Lrimp, 1);
+ nfr 15 () (id, 1);
+ nfr 16 () (id, 1);
+ nfr 17 () (id, 1);
+ nfr 18 () (id, 1);
+draw drv_tree;
+endfig;
+
+beginfig(601)
+jgm 20 "1\limp(a\rimp 1)\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1";
+ jgm 21 "\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash a\rimp 1";
+ jgm 22 "a\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1";
+ jgm 23 "a\vdash 1\limp(a\rimp 1)";
+ jgm 24 "a\otimes a\rimp 1\vdash 1";
+ jgm 25 "a\vdash a";
+ jgm 26 "1\vdash 1";
+ jgm 27 "1\vdash 1";
+ jgm 28 "1\vdash 1";
+nfr 20 (21, 28) (Llimp, 1);
+ nfr 21 (22) (Rrimp, 1);
+ nfr 22 (23, 27) (Lrimp, 1);
+ nfr 23 (24) (Rlimp, 1);
+ nfr 24 (25, 26) (Lrimp, 1);
+ nfr 25 () (id, 1);
+ nfr 26 () (id, 1);
+ nfr 27 () (id, 1);
+ nfr 28 () (id, 1);
+draw drv_tree;
+endfig;
+
+%
+% example - Restall
+%
+
+string Lor, Ror[], Land[], Rand;
+Lor:="\vee L";
+Ror1:="\vee R_1";
+Ror2:="\vee R_2";
+Land1:="\wedge L_1";
+Land2:="\wedge L_2";
+Rand:="\wedge R";
+
+beginfig(610)
+jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge r_2))";
+ jgm 1 "p\wedge(q\vee(r_1\wedge r_2))\vdash p";
+ jgm 2 "p\vdash p";
+ jgm 3 "p\wedge(q\vee(r_1\wedge r_2))\vdash q\vee(r_1\wedge r_2)";
+ jgm 4 "q\vee(r_1\wedge r_2)\vdash q\vee(r_1\wedge r_2)";
+ jgm 5 "q\vdash q\vee(r_1\wedge r_2)";
+ jgm 6 "q\vdash q";
+ jgm 7 "r_1\wedge r_2\vdash q\vee(r_1\wedge r_2)";
+ jgm 8 "r_1\wedge r_2\vdash r_1\wedge r_2";
+ jgm 9 "r_1\wedge r_2\vdash r_1";
+ jgm 10 "r_1\vdash r_1";
+ jgm 11 "r_1\wedge r_2\vdash r_2";
+ jgm 12 "r_2\vdash r_2";
+nfr 0 (1, 3) (Rand, 1);
+ nfr 1 (2) (Land1, 1);
+ nfr 2 () ("", 0);
+ nfr 3 (bxd 4) (Land2, 1); % fig. 611 -> nfr 3 (mvd 4 (1, 3))
+ nfr 4 (5, 7) (Lor, 1); % fig. 611 -> Nfr
+ nfr 5 (6) (Ror1, 1);
+ nfr 6 () ("", 0);
+ nfr 7 (bxd 8) (Ror2, 1); % fig. 611 -> nfr 7 (mvd 8 (1, 3))
+ nfr 8 (9, 11) (Rand, 1); % fig. 611 -> Nfr
+ nfr 9 (10) (Land1, 1);
+ nfr 10 () ("", 0);
+ nfr 11 (12) (Land2, 1);
+ nfr 12 () ("", 0);
+fill drv_bbox 4 withcolor (255, 230, 205)/255;
+fill drv_bbox 8 withcolor (236, 211, 185)/255;
+draw drv_tree;
+endfig;
+
+beginfig(611)
+jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge r_2))";
+ jgm 1 "p\wedge(q\vee(r_1\wedge r_2))\vdash p";
+ jgm 2 "p\vdash p";
+ jgm 3 "p\wedge(q\vee(r_1\wedge r_2))\vdash q\vee(r_1\wedge r_2)";
+ jgm 4 "q\vee(r_1\wedge r_2)\vdash q\vee(r_1\wedge r_2)";
+ jgm 5 "q\vdash q\vee(r_1\wedge r_2)";
+ jgm 6 "q\vdash q";
+ jgm 7 "r_1\wedge r_2\vdash q\vee(r_1\wedge r_2)";
+ jgm 8 "r_1\wedge r_2\vdash r_1\wedge r_2";
+ jgm 9 "r_1\wedge r_2\vdash r_1";
+ jgm 10 "r_1\vdash r_1";
+ jgm 11 "r_1\wedge r_2\vdash r_2";
+ jgm 12 "r_2\vdash r_2";
+nfr 0 (1, 3) (Rand, 1);
+ nfr 1 (2) (Land1, 1);
+ nfr 2 () ("", 0);
+ nfr 3 (mvd 4 (1, 3)) (Land2, 1);
+ Nfr 4 (5, 7) (Lor, "\text{Id\,}_{q\vee(r_1\wedge r_2)}", "", 1);
+ nfr 5 (6) (Ror1, 1);
+ nfr 6 () ("", 0);
+ nfr 7 (mvd 8 (1, 3)) (Ror2, 1);
+ Nfr 8 (9, 11) (Rand, "\text{Id\,}_{r_1\wedge r_2}", "", 1);
+ nfr 9 (10) (Land1, 1);
+ nfr 10 () ("", 0);
+ nfr 11 (12) (Land2, 1);
+ nfr 12 () ("", 0);
+fill drv_bbox 4 withcolor (255, 230, 205)/255;
+fill drv_bbox 8 withcolor (236, 211, 185)/255;
+draw drv_tree;
+endfig;
+
+%
+% example - Roegel
+%
+
+drv_junction_style 0;
+drv_scale (jdg, 0.9);
+drv_scale (prm, 0.9);
+
+vardef mix[]=
+ "\textit{mix}("&(decimal @)&")"
+enddef;
+
+beginfig(620)
+jgm 0 "\Gamma_A, \Gamma'\vdash\Delta, \Delta'_A";
+ jgm 1 "\Gamma_A, \Gamma', \Gamma_A, \Gamma', \Gamma_A, \Gamma'\vdash"&
+ "\Delta, \Delta'_A, \Delta, \Delta'_A, \Delta, \Delta'_A";
+ jgm 2 "\Gamma_A, \Gamma', \Gamma_A\vdash"& % a space character is
+ " C, \Delta, \Delta'_A, \Delta, \Delta'_A"; % needed before 'C'!
+ jgm 3 "\Gamma_A, \Gamma'\vdash B, C, \Delta, \Delta'_A";
+ jgm 4 "\Gamma, B\vee C\vdash \Delta";
+ jgm 5 "\Gamma, B\vdash \Delta";
+ jgm 6 "\Pi_1";
+ jgm 7 "\Gamma, C\vdash \Delta";
+ jgm 8 "\Pi_2";
+ jgm 9 "\Gamma'\vdash B, C, \Delta'";
+ jgm 10 "\Pi_3";
+ jgm 11 "\Gamma_A, \Gamma', B\vdash\Delta, \Delta'_A";
+ jgm 12 "\Gamma, B\vdash \Delta";
+ jgm 13 "\Pi_1";
+ jgm 14 "\Gamma'\vdash B\vee C, \Delta'";
+ jgm 15 "\Gamma'\vdash B, C, \Delta'";
+ jgm 16 "\Pi_3";
+ jgm 17 "\Gamma_A, \Gamma', C\vdash\Delta, \Delta'_A";
+ jgm 18 "\Gamma, C\vdash \Delta";
+ jgm 19 "\Pi_2";
+ jgm 20 "\Gamma'\vdash B\vee C, \Delta'";
+ jgm 21 "\Gamma'\vdash B, C, \Delta'";
+ jgm 22 "\Pi_3";
+nfr 0 (1) ("\text{contr$_g$, contr$_d$}", 1);
+ nfr 1 (2, 17) (mix5, 1);
+ nfr 2 (mvd 3 (5, 6), 11) (mix3 , 1);
+ nfr 3 (4, 9) (mix1, 1);
+ nfr 4 (5, 7) ("\vee_g", 1);
+ nfr 5 (mvd 6 (1, 6)) ("", 0);
+ nfr 6 () ("", 0);
+ nfr 7 (mvd 8 (1, 6)) ("", 0);
+ nfr 8 () ("", 0);
+ nfr 9 (mvd 10 (1, 6)) ("", 0);
+ nfr 10 () ("", 0);
+ nfr 11 (12, 14) (mix2, 1);
+ nfr 12 (mvd 13 (1, 6)) ("", 0);
+ nfr 13 () ("", 0);
+ nfr 14 (15) ("\vee_d", 1);
+ nfr 15 (mvd 16 (1, 6)) ("", 0);
+ nfr 16 () ("", 0);
+ nfr 17 (18, 20) (mix4, 1);
+ nfr 18 (mvd 19 (1, 6)) ("", 0);
+ nfr 19 () ("", 0);
+ nfr 20 (21) ("\vee_d", 1);
+ nfr 21 (mvd 22 (1, 6)) ("", 0);
+ nfr 22 () ("", 0);
+draw drv_tree;
+endfig;
+
+drv_junction_style 1;
+drv_scale (jdg, 1);
+drv_scale (prm, 1);
+
+%
+% example - Lutz
+%
+
+drv_math_style (ilb, "\textstyle");
+drv_labels_position (ilb, l);
+drv_scale (clr, 1.5);
+drv_axis_reference jdg;
+
+string neg, par, otm;
+neg:="^\bot";
+par:="\mathbin{\bindnasrepma}"; % from stmaryrd.sty
+otm:="\otimes";
+
+beginfig(630)
+ % 0 1 2 3 4 5 6 7 8 9
+jgm 0 "a", neg, par, "a";
+jgm 1 "a", neg, par, "(", "a", otm, "(", "a", par, "a", neg, ")", ")";
+jgm 2 "a", neg, par, "(", "a", otm, "a", ")", par, "a", neg;
+jgm 3 "a", neg, par, "(", "a", otm, "a", ")", par, "(",
+ "(", "a", par, "a", neg, ")", otm, "a", neg, ")";
+jgm 4 "a", neg, par, "(", "a", otm, "a", ")", par, "a",
+ par, "(", "a", neg, otm, "a", neg, ")";
+nfr 0 ( ) ("\textsf{id}", 1);
+nfr 1 (0) ("\textsf{id}", 1);
+nfr 2 (1) ("\textsf{s}", 1);
+nfr 3 (2) ("\textsf{id}", 1);
+nfr 4 (3) ("\textsf{s}", 1);
+drv_freeze;
+drawoptions (withpen drv_pen scaled 2 withcolor (255, 94, 94)/255);
+draw
+ sbj[4][12].c shifted (0, -num_hg) .. {up}
+ sbj[4][12].c ..
+ sbj[3][13].c .. tension .9 ..
+ sbj[3][11].c ..
+ sbj[4][9].c {down} ..
+ sbj[4][9].c shifted (0, -num_hg);
+draw
+ sbj[4][15].c shifted (0, -num_hg) .. {up}
+ sbj[4][15].c ..
+ sbj[3][17].c .. tension 1.2 ..
+ sbj[2][9].c ..
+ sbj[1][9].c {up} .. tension 1.5.. {down}
+ sbj[1][7].c ..
+ sbj[2][6].c .. tension 1.2 ..
+ sbj[3][6].c ..
+ sbj[4][6].c {down} ..
+ sbj[4][6].c shifted (0, -num_hg);
+draw
+ sbj[4][0].c shifted (0, -num_hg) .. {up}
+ sbj[4][0].c ..
+ sbj[3][0].c .. tension 1.2 ..
+ sbj[2][0].c ..
+ sbj[1][0].c .. tension 1.2 ..
+ sbj[0][0].c {up} .. tension 1.8.. {down}
+ sbj[0][3].c .. tension 1.2 ..
+ sbj[1][4].c ..
+ sbj[2][4].c .. tension 1.2 ..
+ sbj[3][4].c ..
+ sbj[4][4].c {down} ..
+ sbj[4][4].c shifted (0, -num_hg);
+drawoptions ();
+draw drv_tree; % fig. 631 -> draw jdg[4];
+endfig;
+
+beginfig(631)
+ % 0 1 2 3 4 5 6 7 8 9
+jgm 0 "a", neg, par, "a";
+jgm 1 "a", neg, par, "(", "a", otm, "(", "a", par, "a", neg, ")", ")";
+jgm 2 "a", neg, par, "(", "a", otm, "a", ")", par, "a", neg;
+jgm 3 "a", neg, par, "(", "a", otm, "a", ")", par, "(",
+ "(", "a", par, "a", neg, ")", otm, "a", neg, ")";
+jgm 4 "a", neg, par, "(", "a", otm, "a", ")", par, "a",
+ par, "(", "a", neg, otm, "a", neg, ")";
+nfr 0 ( ) ("\textsf{id}", 1);
+nfr 1 (0) ("\textsf{id}", 1);
+nfr 2 (1) ("\textsf{s}", 1);
+nfr 3 (2) ("\textsf{id}", 1);
+nfr 4 (3) ("\textsf{s}", 1);
+drv_freeze;
+drawoptions (withpen drv_pen scaled 2 withcolor (255, 94, 94)/255);
+draw
+ sbj[4][12].c shifted (0, -num_hg) .. {up}
+ sbj[4][12].c ..
+ sbj[3][13].c .. tension .9 ..
+ sbj[3][11].c ..
+ sbj[4][9].c {down} ..
+ sbj[4][9].c shifted (0, -num_hg);
+draw
+ sbj[4][15].c shifted (0, -num_hg) .. {up}
+ sbj[4][15].c ..
+ sbj[3][17].c .. tension 1.2 ..
+ sbj[2][9].c ..
+ sbj[1][9].c {up} .. tension 1.5.. {down}
+ sbj[1][7].c ..
+ sbj[2][6].c .. tension 1.2 ..
+ sbj[3][6].c ..
+ sbj[4][6].c {down} ..
+ sbj[4][6].c shifted (0, -num_hg);
+draw
+ sbj[4][0].c shifted (0, -num_hg) .. {up}
+ sbj[4][0].c ..
+ sbj[3][0].c .. tension 1.2 ..
+ sbj[2][0].c ..
+ sbj[1][0].c .. tension 1.2 ..
+ sbj[0][0].c {up} .. tension 1.8.. {down}
+ sbj[0][3].c .. tension 1.2 ..
+ sbj[1][4].c ..
+ sbj[2][4].c .. tension 1.2 ..
+ sbj[3][4].c ..
+ sbj[4][4].c {down} ..
+ sbj[4][4].c shifted (0, -num_hg);
+drawoptions ();
+draw jdg[4]; % fig. 630 -> draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+drv_labels_position (ilb, r);
+drv_scale (clr, 1);
+drv_axis_reference iln;
+
+%
+% example - a continued fraction
+%
+
+drv_math_style (ilb, "\textstyle");
+drv_scale (jdg, 0);
+drv_scale (ilb, 0);
+drv_labels_position (ilb, l);
+drv_roots_position t;
+drv_box_mode on;
+
+beginfig(640)
+dcl 0 (1) ("1+", 1) "a";
+dcl 1 (2) ("2+", 1) "b";
+dcl 2 (3) ("3+", 1) "c";
+dcl 3 (4) ("4+", 1) "d";
+dcl 4 ( ) ("", 0) "\cdots";
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_labels_position (ilb, r);
+drv_roots_position b;
+drv_box_mode off;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3. Postamble
+%
+
+end
diff --git a/graphics/metapost/contrib/macros/drv/doc/drv-guide.tex b/graphics/metapost/contrib/macros/drv/doc/drv-guide.tex
new file mode 100644
index 0000000000..e90bc73ac5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/doc/drv-guide.tex
@@ -0,0 +1,2243 @@
+%\enlargethispage
+%\pagebreak
+
+% Any piece of code related to font selection in the following preamble
+% (document class, font package, font selection commands ...) should be
+% reported in `drv-guide.mp'.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{microtype}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{stmaryrd}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\usepackage{mflogo}
+\usepackage{array}
+\usepackage{multicol}
+\raggedcolumns
+\usepackage{fancyvrb}
+\fvset{fontsize=\small}
+\usepackage{color}
+\definecolor{myblue}{rgb}{.0,.0,.5}
+\definecolor{mygrey}{rgb}{.75,.75,.75}
+
+\usepackage{hyperref}
+\hypersetup{colorlinks=true}
+\hypersetup{citecolor=myblue}
+\hypersetup{linkcolor=myblue}
+\hypersetup{urlcolor=myblue}
+\hypersetup{pdftitle={drv - derivation trees with MetaPost}}
+\hypersetup{pdfauthor={Laurent M\'ehats}}
+\hypersetup{pdfkeywords={%
+derivation trees,
+proof trees,
+deduction trees,
+sequent proofs,
+natural deduction,
+latex,
+metapost}}
+% Picture inclusion macro: \drv
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\newcommand{\param}[1]{\textrm{\textit{$\langle$#1\/$\rangle$}}}
+\newcommand{\default}[1][]{\emph{$*$ default#1 $*$}}
+\newcommand{\tbs}{\textbackslash}
+\newcommand{\resplap}{\llap{\textrm{\emph{resp. }}}}
+
+\title{\texttt{drv}\\
+derivation trees with \MP%
+\thanks{Available on
+\href{http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/drv/}
+{CTAN}. You don't need to know \MP\ to use this package.}\\
+{\small almost a user's guide%
+\thanks{Feel free to improve! (E.g., by correcting the poor English.)
+Last update: \today.}}}
+\author{Laurent \textsc{M\'ehats}\\
+{\small\href{mailto:laurent.mehats@gmail.com?subject=[drv 0.97]}
+{\texttt{laurent.mehats@gmail.com}}}}
+\date{documented version: 0.97}
+
+\pagestyle{myheadings}
+\renewcommand{\sectionmark}[1]{%
+\markboth{\upshape\sc#1}{}}
+\renewcommand{\subsectionmark}[1]{%
+\markright{\upshape\thesubsection\quad#1}}
+
+\begin{document}
+\maketitle
+%
+%
+\begin{gather*}
+\drv{drv-guide.100}
+\end{gather*}
+%
+%
+\pdfbookmark[1]{\contentsname}{}%
+\tableofcontents
+%
+%
+\section{Usage\label{sec-usage}}
+%
+%
+\subsection{Structure of a \MP\ file using \texttt{drv}%
+\label{sec-structure}}
+%
+%
+\begin{description}
+\item[Preamble]\
+ \begin{Verbatim}[commandchars=\\\{\}]
+ input drv;
+ verbatimtex%&latex
+ \param{\LaTeX\ preamble}
+ \texttt{\tbs{}begin\{document\}}
+ etex;
+ \end{Verbatim}
+\item[Figures]\
+ \begin{Verbatim}[commandchars=\\\{\}]
+ \param{optional \texttt{drv} tunings}
+ beginfig(\param{index})
+ \param{judgment and inference declarations}
+ draw drv_tree;
+ \param{optional extra \MP\ code}
+ endfig;
+ \end{Verbatim}
+\item[Postamble]\
+ \begin{Verbatim}
+ end
+ \end{Verbatim}
+\end{description}
+For each ``\texttt{beginfig(\param{index})}, \texttt{endfig;}'' pair in a file
+\texttt{\param{jobname}.mp}, \MP\ generates an Encapsulated PostScript file
+\texttt{\param{jobname}.\param{index}}.
+%
+%
+\subsection{Running \MP\label{sec-running}}
+%
+%
+You have to run \emph{at least twice}
+\begin{center}
+\texttt{mpost \param{jobname}.mp}
+\end{center}
+(once more if you use sub-tree delimiters, see~\S~\ref{sec-sub-tree}). On the
+first run \MP\ collects the \LaTeX\ code generated by \texttt{drv}
+declaration macros and writes it to the file
+\texttt{\param{jobname}-delayed.mp}. On the second run \MP\ preprocesses the
+\LaTeX\ code in \texttt{\param{jobname}-delayed.mp} and then typesets the
+derivation trees.
+
+If you get an error on the first run then it comes from the
+\texttt{drv}/\MP\ code. If you get an error on the second run then it comes
+from the \LaTeX\ code. In both cases, correct the error (see
+Appendix~\ref{sec-debugging}), delete \texttt{\param{jobname}-delayed.mp} and
+run ``\texttt{mpost \param{jobname}.mp}'' twice again (a \texttt{makefile} can
+do that for you).
+%
+%
+\subsection{\LaTeX\ inclusion commands\label{sec-inclusion}}
+%
+%
+Encapsulated PostScript files \texttt{\param{jobname}.\param{index}} generated
+by \MP\ can be included in \LaTeX\ documents using the
+\texttt{\tbs{}includegraphics\{\param{jobname}.\param{index}\}}
+command from the \texttt{graphicx.sty} (or \texttt{graphics.sty}) package%
+\footnote{You may get standalone picture files (e.g., transparent \textsc{png}
+for inclusion in a webpage) from each \texttt{\param{jobname}.\param{index}}
+file as described in Appendix~\ref{sec-standalone}.}.
+
+However \texttt{drv} provides ways to set the baseline of
+derivation tree pictures (see~\S~\ref{sec-axis-reference}
+ and~\S~\ref{sec-axis}). Then I suggest using the following
+\texttt{\tbs{}drv\{\param{jobname}.\param{index}\}} command which is
+such that the baseline of the included picture coincides with the baseline of
+the inclusion point.
+\begin{Verbatim}
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+\end{Verbatim}
+The code for \texttt{\tbs{}drv} was suggested by Josselin
+\textsc{Noirel} on the \texttt{fr.comp.text.tex} Usenet group.
+%
+%
+\section{Judgment and inference declarations\label{sec-declarations}}
+%
+%
+\subsection{\texttt{jgm} and \texttt{nfr}\label{sec-jgm-nfr}}
+%
+%
+\texttt{jgm \param{nat} \param{str list}}\\
+\begin{tabular}{ll}
+\param{nat}& judgment index\\
+\param{str list}& sub-judgments \emph{math-mode} \LaTeX\ code
+\end{tabular}\\[1ex]
+\texttt{nfr \param{nat} (\param{nat list}) (\param{str}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str}& inference label \emph{math-mode} \LaTeX\ code\\
+\param{id}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+``\texttt{jgm} \param{nat}'' declares a judgment which index is
+\param{nat} while ``\texttt{nfr} \param{nat}'' declares an inference which
+conclusion is the index \param{nat} judgment (you can declare a judgment
+before or after the corresponding inference, no matter).
+
+A premise index \param{nat} refers to the sub-tree ending with the index
+\param{nat} judgment. A list of premise indices may be arbitrary long.
+%
+%
+\begin{multicols}{2}
+\paragraph{First example\label{fig-110}}
+%
+%
+%\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(110)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+nfr 0 () ("f", 1);
+nfr 1 () ("g", 1);
+nfr 2 (0, 1) ("\circ", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.110}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{Sub-judgments}
+%
+%
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(111)
+jgm 0 "A\vdash B";
+jgm 1 "A", "\vdash", "B";
+nfr 0 () ("f", 1);
+nfr 1 (0) ("f", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.111}
+\end{gather*}
+\end{multicols}
+\noindent
+The outputs induced by
+\begin{center}
+\texttt{jgm 0 "A\tbs{}vdash B";}\qquad and\qquad
+\texttt{jgm 1 "A", "\tbs{}vdash", "B";}
+\end{center}
+are the same. Using the latter declaration, you can manipulate sub-judgments
+independently from each-other (see \S~\ref{sec-inside}).
+%
+%
+\paragraph{Inference line styles}
+%
+%
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(120)
+jgm 0 "\text{none}";
+jgm 1 "\text{simple}";
+jgm 2 "\text{double}";
+jgm 3 "\text{dotted}";
+jgm 4 "\text{dashed}";
+jgm 5 "\text{waved}";
+jgm 6 "\text{\TeX-dotted}";
+jgm 7 "\text{default}";
+nfr 0 ( ) ("\leftarrow 0", 0);
+nfr 1 (0) ("\leftarrow 1", 1);
+nfr 2 (1) ("\leftarrow 2", 2);
+nfr 3 (2) ("\leftarrow 3", 3);
+nfr 4 (3) ("\leftarrow 4", 4);
+nfr 5 (4) ("\leftarrow 5", 5);
+nfr 6 (5) ("\leftarrow 6", 6);
+nfr 7 (6) ("\leftarrow\_", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.120}
+\end{gather*}
+\end{multicols}
+\noindent
+The default inference line style is set by the \texttt{drv\_path\_style} macro
+(see \S~\ref{sec-path-style}).
+%
+%
+\paragraph{Declarations order}
+%
+%
+Declarations may occur in any order.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(130)
+% preorder declarations
+jgm 0 "0";
+ jgm 1 "00";
+ jgm 2 "000";
+ jgm 3 "001";
+ jgm 4 "002";
+ jgm 5 "01";
+ jgm 6 "010";
+ jgm 7 "011";
+ jgm 8 "012";
+ jgm 9 "02";
+ jgm 10 "020";
+ jgm 11 "021";
+ jgm 12 "022";
+nfr 0 (1, 5, 9) ("a", _);
+ nfr 1 (2, 3, 4) ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 () ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 (6, 7, 8) ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 () ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 (10, 11, 12) ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 () ("l", _);
+ nfr 12 () ("m", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\begin{Verbatim}
+beginfig(131)
+% postorder declarations
+ jgm 0 "000";
+ jgm 1 "001";
+ jgm 2 "002";
+ jgm 3 "00";
+ jgm 4 "010";
+ jgm 5 "011";
+ jgm 6 "012";
+ jgm 7 "01";
+ jgm 8 "020";
+ jgm 9 "021";
+ jgm 10 "022";
+ jgm 11 "02";
+jgm 12 "0";
+ nfr 0 () ("a", _);
+ nfr 1 () ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 (0, 1, 2) ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 () ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 (4, 5, 6) ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 () ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 (8, 9, 10) ("l", _);
+nfr 12 (3, 7, 11) ("m", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\end{multicols}
+\begin{gather*}
+\drv{drv-guide.130}\tag{130}\\[1ex]
+\drv{drv-guide.131}\tag{131}
+\end{gather*}
+%
+%
+\paragraph{Code for the title page derivation tree}
+%
+%
+\begin{Verbatim}
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+%
+%
+\subsection{\texttt{dcl}\label{sec-dcl}}
+%
+%
+\texttt{dcl} enables the simultaneous declarations of a judgment and of the
+corresponding inference:
+%\begin{center}
+``\texttt{dcl \param{nat} (\param{nat list})
+(\param{str}, \param{id}) \param{str list}}''
+%\end{center}
+is a shorthand for
+``\texttt{jgm \param{nat} \param{str list}; nfr \param{nat} (\param{nat list})
+(\param{str}, \param{id})}''.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(140)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 () ("g", 1) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+beginfig(141)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 (0) ("f", 1) "A", "\vdash", "B";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.140}
+\end{gather*}
+\vfill
+\begin{gather*}
+\drv{drv-guide.141}
+\end{gather*}
+\end{multicols}
+\begin{Verbatim}
+beginfig(150)
+dcl 0 (1, 5, 9) ("a", _) "0";
+ dcl 1 (2, 3, 4) ("b", _) "00";
+ dcl 2 () ("c", _) "000";
+ dcl 3 () ("d", _) "001";
+ dcl 4 () ("e", _) "002";
+ dcl 5 (6, 7, 8) ("f", _) "01";
+ dcl 6 () ("g", _) "010";
+ dcl 7 () ("h", _) "011";
+ dcl 8 () ("i", _) "012";
+ dcl 9 (10, 11, 12) ("j", _) "02";
+ dcl 10 () ("k", _) "020";
+ dcl 11 () ("l", _) "021";
+ dcl 12 () ("m", _) "022";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.150}
+\end{gather*}
+%
+%
+\subsection{\texttt{bxd} and \texttt{mvd}\label{sec-bxd-mvd}}
+%
+%
+\paragraph{\texttt{bxd}}
+%
+%
+A premise index \param{nat} can be replaced with ``\texttt{bxd \param{nat}}''
+so that the whole sub-tree ending with the index \param{nat} judgment behaves
+as if it was enclosed within a box.
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(160)
+dcl 0 (1, 4) ("", _) "a";
+\resplap{}dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.160}\quad\text{resp.}\quad
+\drv{drv-guide.161}\quad\text{typeset as}\quad
+\drv{drv-guide.162}
+\end{gather*}
+%
+%
+\paragraph{\texttt{mvd}}
+%
+%
+A premise index \param{nat 1} in an inference declaration can be replaced with
+``\texttt{mvd \param{nat 1} (\param{nat 2}, \param{id})}'' so as to declare
+\param{nat 2} ``phantom'' inference steps starting from the index \param{nat 1}
+judgment. The ``phantom'' inference steps are intended to be drawn as
+a path using the path-style \param{id}.\\[1ex]
+\texttt{mvd \param{nat 1} (\param{nat 2}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{id}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{2}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(170)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (mvd 1 (2, 3), 2, 3) ("", _);
+\resplap{}nfr 4 (1, mvd 2 (2, 4), 3) ("", _);
+\resplap{}nfr 4 (1, 2, mvd 3 (2, 6)) ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\begin{gather*}
+\drv{drv-guide.170}\\[1ex]
+\drv{drv-guide.171}\\[1ex]
+\drv{drv-guide.172}
+\end{gather*}
+\end{multicols}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(180)
+jgm 0 "\tbs{}textsc\{Size matters -- Part 1\}";
+jgm 1 "\tbs{}text\{Here is a rather long judgment"&\textrm{\emph{
+ % string concatenation}}
+ " that I don't want to shorten.\}";
+jgm 2 "\tbs{}text\{Will the derivation tree fit on the page?\}";
+jgm 3 "\tbs{}text\{It does.\}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (mvd 1 (2, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.180}
+\end{gather*}
+%The default phantom steps path-style ``''is set by the
+%\texttt{drv\_path\_style} macro (see~\S~\ref{sec-path-style}).
+%
+%
+\subsection{Sub-tree delimiters and labels\label{sec-sub-tree}}
+%
+%
+\paragraph{\texttt{Nfr}}
+%
+%
+The \texttt{Nfr} declaration macro is an alternative for \texttt{nfr} that
+enables the typesetting of delimiters.\\[1ex]
+\texttt{Nfr \param{nat} (\param{nat list})
+(\param{str 1}, \param{str 2}, \param{str 3}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str 1}& inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& left delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{str 3}& right delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{id}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+If both \param{str 2} and \param{str 3} are the empty string
+\texttt{""} then \texttt{Nfr} behaves exactly the same way as \texttt{nfr}.
+However, if \param{str 2} is a non-empty string then a delimiter is placed to
+the left of the sub-tree ending with the index \param{nat} judgment and
+\param{str 2} is attached to it as a label. The same way, if \param{str 3} is
+a non-empty string then a delimiter is placed to the right of the sub-tree
+ending with the index \param{nat} judgment and \param{str 3} is attached to it
+as a label. Both \param{str 2} and \param{str 3} may be non-empty strings. You
+may use \texttt{"\{\}"} as a string argument to get a delimiter without a
+label.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(190)
+jgm 0 "a";
+jgm 1 "b";
+jgm 2 "c";
+jgm 3 "d";
+Nfr 0 () ("0", "", "", _);
+Nfr 1 () ("1", "", "", _);
+Nfr 2 (0, 1) ("2", "E", "", _);
+Nfr 3 (2) ("3", "", "F", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.190}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{Dcl}}
+%
+%
+The \texttt{Dcl} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{Nfr} in the same way as \texttt{dcl} is a shorthand for \texttt{jgm}
+and \texttt{nfr}.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(200)
+Dcl 0 () ("", "", "", _) "a";
+Dcl 1 (0) ("", "", "B", _) "c";
+Dcl 2 () ("", "", "", _) "d";
+Dcl 3 (1, 2) ("", "E", "", _) "f";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.200}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{Mvd}}
+%
+%
+The \texttt{Mvd} macro is an alternative for \texttt{mvd} that enables the
+attachment of labels to phantom steps paths.\\[1ex]
+\texttt{Mvd \param{nat 1}
+(\param{nat 2}, \param{str 1}, \param{str 2}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str 1}& left label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right label \emph{math-mode} \LaTeX\ code\\
+\param{id}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+If \param{str 1} is a non-empty string then it is attached as a label to the
+left of the phantom steps path. The same way, if \param{str 2} is a non-empty
+string then it is attached as a label to the right of the phantom steps path.
+Both \param{str 1} and \param{str 2} may be non-empty strings.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(210)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 (Mvd 1 (2, "d", "", 3), 2) ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.210}
+\end{gather*}
+\end{multicols}
+%
+%
+\section{\texttt{drv} tunings\label{sec-tunings}}
+%
+%
+\texttt{drv} tuning macros set the parameters according to which derivation
+trees are typeset. You have to call these macros \emph{outside} figure
+environments (delimited by ``\texttt{beginfig(\param{index})},
+\texttt{endfig;}'' pairs).
+%
+%
+\begin{multicols}{2}
+\subsection{\texttt{drv\_font\_size}\label{sec-font-size}}
+%
+%
+\texttt{drv\_font\_size \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& \LaTeX\ font-size command\\
+& \begin{tabular}{l}
+ \texttt{"\tbs{}tiny"}\\
+ \texttt{"\tbs{}scriptsize"}\\
+ \texttt{"\tbs{}footnotesize"}\\
+ \texttt{"\tbs{}small"}\\
+ \texttt{"\tbs{}normalsize"}\rlap{\quad\default}\\
+ \texttt{"\tbs{}large"}\\
+ \texttt{"\tbs{}Large"}\\
+ etc.
+ \end{tabular}
+\end{tabular}
+\columnbreak
+\begin{gather*}
+\texttt{"\tbs{}tiny"}\\
+\drv{drv-guide.220}\\
+\texttt{"\tbs{}small"}\\
+\drv{drv-guide.221}\\
+\texttt{"\tbs{}Large"}\\
+\drv{drv-guide.222}
+\end{gather*}
+\end{multicols}
+%
+%
+\subsection{\texttt{drv\_math\_style}\label{sec-math-style}}
+%
+%
+\texttt{drv\_math\_style (\param{id}, \param{str})}\\
+\begin{tabular}{ll}
+\param{id}& component identifier ({\tt drv}, {\tt jdg}, {\tt ilb},
+ {\tt dlb} or {\tt plb})\\
+& \begin{tabular}{lll}
+ {\tt drv}& derivation trees&
+ \default[ style: \texttt{"\tbs{}displaystyle"}]\\
+ {\tt jdg}& judgments&
+ \default[ style: \texttt{"\tbs{}textstyle"}]\\
+ {\tt ilb}& inference labels&
+ \default[ style: \texttt{"\tbs{}scriptstyle"}]\\
+ {\tt dlb}& delimiter labels&
+ \default[ style: \texttt{"\tbs{}textstyle"}]\\
+ {\tt plb}& phantom steps labels&
+ \default[ style: \texttt{"\tbs{}textstyle"}]
+ \end{tabular}\\
+\param{str}& \LaTeX\ math-style command
+\end{tabular}\\[1ex]
+%
+%
+``\texttt{drv\_math\_style (drv, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}displaystyle"}&
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&\\[1ex]
+\drv{drv-guide.230}&
+\drv{drv-guide.231}&
+\drv{drv-guide.232}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_math\_style (jdg, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}displaystyle"}&
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&\\[1ex]
+\drv{drv-guide.240}&
+\drv{drv-guide.241}&
+\drv{drv-guide.242}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_math\_style (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&
+\texttt{"\tbs{}scriptscriptstyle"}&\\[1ex]
+\drv{drv-guide.250}&
+\drv{drv-guide.251}&
+\drv{drv-guide.252}&
+\end{array}
+\end{gather*}
+Notice that the math-style of derivation trees determines the math-style of
+judgments (and of labels) in the same way as the math-style of fractions
+determines the math-style of numerators and denominators.
+%
+%
+\subsection{\texttt{drv\_scale}\label{sec-scale}}
+%
+%
+\texttt{drv\_scale (\param{id}, \param{float})}\\
+\begin{tabular}{ll}
+\param{id}& scale identifier ({\tt clr}, {\tt prm}, {\tt jdg} or
+ {\tt ilb})\\
+& \begin{tabular}{lll}
+ {\tt clr}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt prm}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt jdg}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt ilb}&nice explanation soon
+ (see examples)&\default[ scale: 1]
+ \end{tabular}\\
+\param{float}&scale value
+\end{tabular}\\[1ex]
+%
+%
+``\texttt{drv\_scale (clr, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.260}&
+\drv{drv-guide.261}&
+\drv{drv-guide.262}&
+\drv{drv-guide.263}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (prm, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.270}&
+\drv{drv-guide.271}&
+\drv{drv-guide.272}&
+\drv{drv-guide.273}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (jgm, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.280}&
+\drv{drv-guide.281}&
+\drv{drv-guide.282}&
+\drv{drv-guide.283}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.290}&
+\drv{drv-guide.291}&
+\drv{drv-guide.292}&
+\drv{drv-guide.293}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_junction\_style}\label{sec-junction-style}}
+%
+%
+This macro sets the default way the premises of an inference are
+horizontally joined.\\[1ex]
+\texttt{drv\_junction\_style \param{id}}\\
+\begin{tabular}{ll}
+\param{id}&junction style identifier ({\tt 0}, {\tt 1} or {\tt 2})\\
+& \begin{tabular}{ll}
+ {\tt 0}&``fully-interlacing''\\
+ {\tt 1}&``semi-interlacing''\quad\default\\
+ {\tt 2}&``non-interlacing''
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2}&\\[1ex]
+\drv{drv-guide.300}&
+\drv{drv-guide.301}&
+\drv{drv-guide.302}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_alignment\_style}\label{sec-alignment-style}}
+%
+%
+This macro sets the default way a judgment is horizontally aligned
+relatively to its premises.\\[1ex]
+\texttt{drv\_alignment\_style \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& alignment style identifier ({\tt l}, {\tt c} or {\tt r})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt c}&centered\quad\default\\
+ {\tt r}&right
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{l}&
+\texttt{c}&
+\texttt{r}&\\[1ex]
+\drv{drv-guide.310}&
+\drv{drv-guide.311}&
+\drv{drv-guide.312}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_path\_style}\label{sec-path-style}}
+%
+%
+\texttt{drv\_path\_style (\param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{id 1}& path-type identifier ({\tt iln} or {\tt phm})\\
+& \begin{tabular}{lll}
+ {\tt iln} &inference lines&\default[ style: {\tt1}]\\
+ {\tt phm} &phantom steps paths&\default[ style: {\tt3}]
+ \end{tabular}\\
+\param{id 2}& path-style identifier ({\tt0}, {\tt1}, {\tt2}, {\tt3}, {\tt4},
+ {\tt5} or {\tt6})
+\end{tabular}
+%
+%
+\subsection{\texttt{drv\_labels\_position}\label{sec-labels-position}}
+%
+%
+\texttt{drv\_labels\_position (\param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{id 1}& label-type identifier ({\tt ilb}, {\tt plb} or {\tt dlb})\\
+& \begin{tabular}{lll}
+ {\tt ilb} &inference labels&
+ \default[ position: {\tt r}]\\
+ {\tt dlb} &delimiter labels&
+ \default[ position: {\tt l}]\\
+ {\tt plb} &phantom steps labels&
+ \default[ position: {\tt l}]
+ \end{tabular}\\
+\param{id 2}& position identifier ({\tt l} or {\tt r})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt r}&right
+ \end{tabular}
+\end{tabular}\\[1ex]
+``\texttt{drv\_labels\_position (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.24\textwidth}}@{}l@{}}
+{\tt l}&{\tt r}&\\[1ex]
+\drv{drv-guide.320}&
+\drv{drv-guide.321}&
+\end{array}
+\end{gather*}
+Setting a default position for delimiter labels (thus for delimiters) and for
+phantom steps labels may be useful in conjunction with declaration macros
+taking optional label arguments (see~\S~\ref{sec-labels}).
+%
+%
+\begin{multicols}{2}
+\subsection{\texttt{drv\_roots\_position}\label{sec-roots-position}}
+%
+%
+\texttt{drv\_roots\_position \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& position identifier ({\tt t} or {\tt b})\\
+& \begin{tabular}{ll}
+ {\tt t}&top\\
+ {\tt b}&bottom\quad\default
+ \end{tabular}
+\end{tabular}
+\columnbreak
+
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.24\textwidth}}@{}l@{}}
+\drv{drv-guide.330}&
+\drv{drv-guide.331}&
+\end{array}
+\end{gather*}
+\end{multicols}
+%
+%
+\subsection{\texttt{drv\_axis\_reference}\label{sec-axis-reference}}
+%
+%
+The baseline of derivation tree pictures is set in such a way that their
+math axis coincides either with the axis of their root inference line or with
+the math axis of their root judgment according to the default behaviour set by
+\texttt{drv\_axis\_reference}.\\[1ex]
+\texttt{drv\_axis\_reference \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& reference identifier ({\tt iln} or {\tt jdg})\\
+& \begin{tabular}{lll}
+ {\tt iln}&root inference line axis&\default\\
+ {\tt jdg}&root judgment math axis
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\frac{\qquad}{}\textit{math axis}\frac{\qquad}{}
+\drv{drv-guide.340}\frac{\qquad}{}
+\drv{drv-guide.341}\frac{\qquad}{}
+\end{gather*}
+Notice that \texttt{drv\_axis\_reference} is irrelevant if you don't use the
+\texttt{\tbs{}drv} inclusion command (see \S~\ref{sec-inclusion}).
+%
+%
+\subsection{\texttt{drv\_left\_delimiter} and \texttt{drv\_right\_delimiter}%
+\label{sec-delimiters}}
+%
+%
+\texttt{drv\_left\_delimiter \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& left delimiter math-mode \LaTeX\ code\\
+& \begin{tabular}{llll}
+ \texttt{"("}& $($\\
+ \texttt{"["}& $[$\\
+ \texttt{"\tbs{}lbrace"}& $\lbrace$&\default\\
+ \texttt{"\tbs{}langle"}& $\langle$\\
+ etc.
+ \end{tabular}
+\end{tabular}\clearpage\noindent%\\[1ex]
+\texttt{drv\_right\_delimiter \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& right delimiter math-mode \LaTeX\ code\\
+& \begin{tabular}{llll}
+ \texttt{")"}& $)$\\
+ \texttt{"]"}& $]$\\
+ \texttt{"\tbs{}rbrace"}& $\rbrace$&\default\\
+ \texttt{"\tbs{}rangle"}& $\rangle$\\
+ etc.
+ \end{tabular}
+\end{tabular}\\[1ex]
+``\texttt{drv\_left\_delimiter {\rm ---};}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"("}&
+\texttt{"\tbs{}lfloor"}&
+\texttt{"."}&\\[1ex]
+\drv{drv-guide.350}&
+\drv{drv-guide.351}&
+\drv{drv-guide.352}&
+\end{array}
+\end{gather*}
+``\texttt{drv\_right\_delimiter {\rm ---};}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}rangle"}&
+\texttt{"\tbs{}uparrow"}&
+\texttt{"."}&\\[1ex]
+\drv{drv-guide.360}&
+\drv{drv-guide.361}&
+\drv{drv-guide.362}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_box\_mode}\label{sec-box-mode}}
+%
+%
+When in ``box mode'', derivation trees are typeset in such a way that all
+sub-trees behave as if they were enclosed within boxes (that is as if all
+premise indices were prefixed with \texttt{bxd},
+see~\S~\ref{sec-bxd-mvd}).\\[1ex]
+%
+%
+\texttt{drv\_box\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}\\
+ {\tt off}&\default
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{on}&
+typeset as&
+\texttt{off}&\\[1ex]
+\drv{drv-guide.370}&
+\drv{drv-guide.371}&
+\drv{drv-guide.372}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_fraction\_mode}\label{sec-fraction-mode}}
+%
+%
+\texttt{drv} typesets derivation trees in
+such a way that: the distance from the axis of an inference line to the
+math axis of a judgment above it is always the same (\texttt{num\_hg},
+see~\S~\ref{sec-components}); the distance from the axis of an inference line
+to the math axis of a judgment below it is always the same (\texttt{den\_dp},
+see~\S~\ref{sec-components}). When in ``fraction mode'', if roots are at bottom
+then the height of leaf judgments above which there is no inference line is
+ignored (the depth of root judgments is always ignored); if roots are at top
+then the depth of leaf judgments below which there is no inference line is
+ignored (the height of root judgments is always ignored). This mode may cause
+overlaps when used in conjunction with
+interlacing junction-styles (\texttt{0} and \texttt{1}).\\[1ex]
+\texttt{drv\_fraction\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}&\default\\
+ {\tt off}
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{on}&
+\texttt{off}&
+typeset as&\\[1ex]
+\drv{drv-guide.380}&
+\drv{drv-guide.381}&
+\drv{drv-guide.382}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_proof\_mode}\label{sec-proof-mode}}
+%
+%
+\texttt{drv\_proof\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}\\
+ {\tt off}&\default
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.5\textwidth}}@{}l@{}}
+\texttt{on}&
+\texttt{off}&\\[1ex]
+\drv{drv-guide.390}&
+\drv{drv-guide.391}&
+\end{array}\\[1ex]
+\end{gather*}
+Red numbers (resp. dots) refer to judgment indices (resp. central points,
+see~\S~\ref{sec-components}) while blue numbers (resp. dots) refer to
+sub-judgment indices (resp. central points, see~\S~\ref{sec-components}).
+%
+%
+\subsection{\texttt{drv\_labels\_mode}\label{sec-labels-mode}}
+%
+%
+This macro turns the typesetting of labels on or off, whether labels are
+specified or~not.\\[1ex]
+\texttt{drv\_labels\_mode (\param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{id 1}& label-type identifier ({\tt ilb}, {\tt plb} or {\tt dlb})\\
+& \begin{tabular}{lll}
+ {\tt ilb} &inference labels&
+ \default[ status: {\tt on}]\\
+ {\tt dlb} &delimiter labels&
+ \default[ status: {\tt on}]\\
+ {\tt plb} &phantom steps labels&
+ \default[ status: {\tt on}]
+ \end{tabular}\\
+\param{id 2}& status identifier ({\tt on} or {\tt off})
+\end{tabular}
+%
+%
+\subsection{\texttt{drv\_verbatimtex}\label{sec-verbatimtex}}
+%
+%
+This macro enables the use of \LaTeX{} material that is not intended
+to be typeset (e.g. \texttt{\tbs{}renewcommand} statements) by adding a
+\MP{} \texttt{verbatimtex}/\texttt{etex} block to
+\texttt{\param{jobname}-delayed.mp}.\\[1ex]
+\texttt{drv\_verbatimtex \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& \LaTeX\ material
+\end{tabular}
+%
+%
+\section{Pictures, bounding boxes and math axis\label{sec-pictures}}
+%
+%
+\subsection{\texttt{drv\_freeze} and \texttt{drv\_tree}}
+%
+%
+\texttt{drv} composes derivation trees with respect to judgment and
+inference declarations only once the \texttt{drv\_freeze} macro is called.
+This is usually done by \texttt{drv\_tree} which is a macro that
+returns a picture. You may however call \texttt{drv\_freeze} yourself if you
+have no need for the whole derivation tree picture that \texttt{drv\_tree}
+would otherwise return (Section~\ref{sec-components} illustrates such a
+situation).
+
+\texttt{drv} composes derivation trees essentially according to the
+algorithm for composing fractions described in Appendix~G of the {\TeX}book
+(see~\cite{jackowski06,knuth84}). In particular, \texttt{drv} uses
+``\texttt{\tbs{}fontdimen}'' parameters so that the derivation tree pictures
+it generates should integrate smoothly within any document, whatever the fonts
+you use. As an example, compare the following fractions (the first one is
+composed by \texttt{drv} while the second one is composed by the standard
+\texttt{\tbs{}frac} command).\\[1ex]\mbox{}{\hfill%
+\drv{drv-guide.400}\quad{\huge$\displaystyle\frac{\gamma}{\delta}$}\hfill}
+%
+%
+\subsection{\texttt{drv\_bbox}\label{sec-bbox}}
+%
+%
+\texttt{drv\_bbox \param{nat}}\\
+\begin{tabular}{ll}
+\param{nat}& sub-tree root index
+\end{tabular}\\[1ex]
+``\texttt{drv\_bbox \param{nat}}'' returns a \MP\ closed path
+(see~\cite[Section~4]{hobby09}) standing for the bounding box of the sub-tree
+ending with the index \param{nat} judgment. \texttt{drv\_bbox} calls
+\texttt{drv\_freeze} if necessary.
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(410)
+dcl 0 (1, 5) ("", _) "a";
+\resplap{}dcl 0 (bxd 1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255;\textrm{\emph{
+ % rgb color}}
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.410}\quad\text{resp.}\quad\drv{drv-guide.411}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_axis}\label{sec-axis}}
+%
+%
+\texttt{drv\_axis} locally overrides \texttt{drv\_axis\_reference} (see
+\S~\ref{sec-axis-reference}), enabling the explicit setting of
+the math axis of a tree once it has been drawn.\\[1ex]
+\texttt{drv\_axis (\param{id}, \param{nat})}\\
+\begin{tabular}{ll}
+\param{id}& reference type identifier ({\tt iln}, {\tt jdg} or {\tt dlm})\\
+& \begin{tabular}{ll}
+ {\tt iln}&inference line axis\\
+ {\tt jdg}&judgment math axis\\
+ {\tt dlm}&delimiter axis
+ \end{tabular}\\
+\param{nat}& reference index
+\end{tabular}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(420)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "\{\}", "", _) "b";
+draw drv_tree;
+drv_axis (iln, 0);
+\resplap{}drv_axis (jdg, 1);
+\resplap{}drv_axis (dlm, 1);
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\frac{\qquad}{}\textit{ math axis }\frac{\qquad}{}
+\drv{drv-guide.420}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{}
+\drv{drv-guide.421}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{}
+\drv{drv-guide.422}
+\end{gather*}
+Notice that \texttt{drv\_axis} is irrelevant if you don't use the
+\texttt{\tbs{}drv} inclusion command.% (see \S~\ref{sec-inclusion}).
+%
+%
+\section{Low level inference declaration macros\label{sec-low-level}}
+%
+%
+\subsection{\texttt{NFR}, \texttt{DCL} and \texttt{MVD}\label{sec-NFR-DCL-MVD}}
+%
+%
+\paragraph{\texttt{NFR}}
+%
+%
+The \texttt{NFR} declaration macro is the lowest level one. It enables the
+specification of all the labels and styles of an inference.\\[1ex]
+\texttt{NFR
+\param{nat}
+(\param{nat\;list})
+(\param{str~1},\;\param{str~2},\;\param{str~3},\;\param{str~4},\;%
+\param{id~1},\;\param{id~2},\;\param{id~3})}
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str 1}& left inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 3}& left delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{str 4}& right delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& junction style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3} or {\tt\_})\\
+& \begin{tabular}{ll}
+ {\tt0}&fully-interlacing\\
+ {\tt1}&semi-interlacing\\
+ {\tt2}&non-interlacing\\
+ {\tt3}&user specified (tricky,
+ see~\S~\ref{sec-user-specified})\\
+ {\tt\_}&default (set by \texttt{drv\_junction\_style},
+ see~\S~\ref{sec-junction-style})
+ \end{tabular}\\
+\param{id 2}& alignment style identifier ({\tt l}, {\tt c}, {\tt r},
+ {\tt u} or {\tt\_})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt c}&centered\\
+ {\tt r}&right\\
+ {\tt u}&user specified (tricky,
+ see~\S~\ref{sec-user-specified})\\
+ {\tt\_}&default (set by \texttt{drv\_alignment\_style},
+ see~\S~\ref{sec-alignment-style})
+ \end{tabular}\\
+\param{id 3}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(430)
+jgm 0 "a";
+NFR 0 () ("1", "2", "3", "4", _, _, _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.430}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{DCL}}
+%
+%
+The \texttt{DCL} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{NFR} in the same way as \texttt{dcl} is a shorthand for \texttt{jgm}
+and \texttt{nfr}.
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(440)
+DCL 0 () ("1", "", "", "", _, _, _) "a";
+DCL 1 () ("", "2", "", "", _, _, _) "b";
+DCL 2 (0, 1) ("", "", "3", "", _, _, _) "c";
+DCL 3 (2) ("", "", "", "4", _, _, _) "d";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.440}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{MVD}}
+%
+%
+The \texttt{MVD} macro is a generalization of \texttt{Mvd} that enables the
+specification of the alignment style of phantom inferences.\\[1ex]
+\texttt{MVD \param{nat 1}
+(\param{nat 2}, \param{str 1}, \param{str 2}, \param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str 1}& left label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right label \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& alignment style identifier ({\tt l}, {\tt c} or {\tt r})\\
+\param{id 2}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(450)
+jgm 0 "a";
+ jgm 1 "b";
+ jgm 2 "cccccc";
+ jgm 3 "ddd";
+ jgm 4 "eeeeeeeee";
+nfr 0 (1, MVD 4 (5, "", "F", r, 4)) ("", _);
+ nfr 1 (MVD 2 (2, "G", "", l, 3), 3) ("", _);
+ nfr 2 () ("", _);
+ nfr 3 () ("", _);
+ nfr 4 () ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.450}
+\end{gather*}
+\end{multicols}\clearpage
+\begin{Verbatim}
+beginfig(460)
+jgm 0 "\textsc{Size matters -- Part 2}";
+jgm 1 "\text{Here is an even longer judgment"&
+ " that I don't want to shorten either.}";
+jgm 2 "\text{This time I'm pretty sure that the"&
+ " derivation tree won't fit on the page.}";
+jgm 3 "\text{It does! Amazing.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (MVD 1 (2, "", "", l, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.460}
+\end{gather*}
+%
+%
+\subsection{Optional labels\label{sec-labels}}
+%
+%
+\paragraph{\texttt{NFR\_opt}}
+%
+%
+The \texttt{NFR\_opt} declaration macro is an alternative for \texttt{NFR}
+that lets you specify labels at your option.\\[1ex]
+\texttt{NFR\_opt
+\param{nat}
+(\param{nat list})
+(\param{str list 1})
+(\param{str list 2})
+(\param{id 1}, \param{id 2}, \param{id 3})}
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str list 1}& list of inference labels \emph{math-mode}
+ \LaTeX\ code\\
+\param{str list 2}& list of delimiter labels \emph{math-mode}
+ \LaTeX\ code\\
+\param{id 1}& junction style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3} or {\tt\_})\\
+\param{id 2}& alignment style identifier ({\tt l}, {\tt c}, {\tt r},
+ {\tt u} or {\tt\_})\\
+\param{id 3}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+%
+%
+The list \param{str list 1} may contain zero, one or two
+strings specifying inference labels. If no label is specified then no label
+is attached to the inference line. If two labels are specified then the first
+one is attached to the left and the second one to the right. Finally, if one
+label only is specified then it is attached either to the left or to the right
+of the inference line depending on the default inference labels position set by
+\texttt{drv\_labels\_position} (see~\S~\ref{sec-labels-position}).
+
+The same way, \param{str list 2} may contain zero, one or two strings
+specifying delimiter labels. If one label only is specified then it is attached
+to a delimiter placed either to the left or to the right of the sub-tree ending
+with the index \param{nat} judgment depending on the default delimiter labels
+position set by \texttt{drv\_labels\_position}.
+
+As an example, ``\texttt{nfr \param{nat} (\param{nat list})
+(\param{str}, \param{id})}'' behaves exactly the same way as
+``\texttt{NFR\_opt \param{nat} (\param{nat list}) (\param{str}) ()
+(\_, \_, \param{id})}''.
+%
+%
+\paragraph{\texttt{DCL\_opt}}
+%
+%
+The \texttt{DCL\_opt} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{NFR\_opt} in the same way as \texttt{DCL} is a shorthand for
+\texttt{jgm} and \texttt{NFR}.
+%
+%
+\paragraph{\texttt{MVD\_opt}}
+%
+%
+The \texttt{MVD\_opt} macro is an alternative for \texttt{MVD} that lets you
+specify labels at your option.\\[1ex]
+\texttt{MVD\_opt \param{nat 1} (\param{nat 2})
+(\param{str list}) (\param{id 1} \param{id 2})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str list}& list of labels \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& alignment style identifier ({\tt l}, {\tt c}
+ or {\tt r})\\
+\param{id 2}& phantom steps path-style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+The list \param{str list} may contain zero, one or two
+strings specifying labels. If one label only is specified then it is attached
+either to the left or to the right of the phantom steps path depending on the
+default phantom steps labels position set by
+\texttt{drv\_labels\_position} (see~\S~\ref{sec-labels-position}).
+%
+%
+\subsection{User defined declaration macros (tricky)\label{sec-user-defined}}
+%
+%
+Here are the \MP\ headers for \texttt{NFR}, \texttt{MVD}, \texttt{NFR\_opt} and
+\texttt{MVD\_opt}.
+\begin{Verbatim}[commandchars=\\\{\}]
+NFR[](text PRM)(expr lilb, \!rilb, \!ldlb, \!rdlb)(suffix jsty, \!asty, \!isty)
+MVD[](expr num, lplb, rplb)(suffix asty, psty)
+NFR_opt[](text PRM)(text ILB)(text DLB)(suffix jsty, asty, isty)
+MVD_opt[](expr num)(text PLB)(suffix asty, psty)
+\end{Verbatim}
+``\texttt{[]}'' in the header of a macro indicates that this macro expects a
+numeric argument referred to as ``\texttt{@}'' in its body.
+``\texttt{text}'', ``\texttt{expr}'' and ``\texttt{suffix}'' specify argument
+types (see~\cite[Section 10]{hobby09}). You may use \texttt{NFR}, \texttt{MVD},
+\texttt{NFR\_opt} and \texttt{MVD\_opt} to define your own declaration macros.
+As an example, here are possible definitions for \texttt{Nfr} and \texttt{Mvd}.
+\begin{Verbatim}
+vardef Nfr[](text PRM)(expr ilb, ldlb, rdlb)(suffix isty)=
+ NFR_opt[@](PRM)(ilb)(ldlb, rdlb)(_, _, isty);
+enddef;
+\end{Verbatim}
+\begin{Verbatim}
+vardef Mvd[](expr num, lplb, rplb)(suffix psty)=
+ MVD[@](num, lplb, rplb, _, psty) % Mvd returns an index, no `;'!
+enddef;
+\end{Verbatim}
+%
+%
+\section{Inside derivation trees\label{sec-inside}}
+%
+%
+\subsection{Components, distinguished points and
+dimensions\label{sec-components}}
+%
+%
+\paragraph{Components}
+%
+%
+Once \texttt{drv\_freeze} has been called, all the components of a derivation
+tree are accessible independently from each-other. Given an inference
+index~\param{nat}, you can access the inference components (provided they were
+declared) via the following indentifiers.
+\begin{center}
+\begin{tabular}{lr}
+judgment &\texttt{jdg[\param{nat}]}\\
+sub-judgments &\texttt{sbj[\param{nat}][\param{nat$'$}]}\\
+inference line &\texttt{iln[\param{nat}]}\\
+left inference label &\texttt{l\_ilb[\param{nat}]}\\
+right inference label &\texttt{r\_ilb[\param{nat}]}\\
+left delimiter &\texttt{l\_dlm[\param{nat}]}\\
+left delimiter label &\texttt{l\_dlb[\param{nat}]}\\
+right delimiter &\texttt{r\_dlm[\param{nat}]}\\
+right delimiter label &\texttt{r\_dlb[\param{nat}]}\\
+phantom steps path &\texttt{phm[\param{nat}]}\\
+left phantom steps label &\texttt{l\_plb[\param{nat}]}\\
+right phantom steps label &\texttt{l\_plb[\param{nat}]}
+\end{tabular}
+\end{center}
+The sub-judgment index \param{nat$'$} ranges from 0 to the number of sub-judgments minus 1.
+%
+%
+\enlargethispage{\baselineskip}
+\begin{Verbatim}
+beginfig(470) % components
+DCL 5 () ("", "", "", "", _, _, 0) "A";
+DCL 6 (5) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "B", "C";
+DCL 7 (MVD 6 (2, "(5)", "(6)", _, 6)) ("", "", "", "", _, _, 1) "D";
+drv_freeze; % usually called by drv_tree
+draw jdg[5]; % judgment A
+draw sbj[6][0] withcolor (3, 0, 0)/3; % sub-judgment B
+draw sbj[6][1] withcolor (2, 0, 0)/3; % sub-judgment C
+draw iln[6] withcolor (0, 4, 0)/4; % inference line
+draw l_ilb[6] withcolor (0, 3, 0)/4; % left inference label (1)
+draw r_ilb[6] withcolor (0, 2, 0)/4; % right inference label (2)
+draw l_dlm[6] withcolor (0, 0, 3)/3; % left delimiter
+draw l_dlb[6] withcolor (0, 0, 2)/3; % left delimiter label (3)
+draw r_dlm[6] withcolor (3, 0, 3)/3; % right delimiter
+draw r_dlb[6] withcolor (2, 0, 2)/3; % right delimiter label (4)
+draw phm[6] withcolor (0, 3, 3)/4; % phantom steps path
+draw l_plb[6] withcolor (0, 2, 2)/4; % left phantom steps label (5)
+draw r_plb[6] withcolor (0, 1, 1)/4; % right phantom steps label (6)
+draw jdg[7]; % judgment D
+draw iln[7]; % inference line
+endfig;
+\end{Verbatim}
+%
+%
+\paragraph{Distinguished points}
+%
+%
+Three distinguished points are associated with each component \param{cpn},
+namely \texttt{\param{cpn}.l}, \texttt{\param{cpn}.c} and
+\texttt{\param{cpn}.r} that lie respectively to the left, at the center and to
+the right of the component math axis.
+\begin{gather*}
+\begin{array}{cc}
+\text{components}&\text{central points}\\[1ex]
+\drv{drv-guide.470}&\drv{drv-guide.471}
+\end{array}
+\end{gather*}
+%
+%
+\paragraph{Dimensions}
+%
+%
+Two dimensions are associated with each component \param{cpn}, a depth
+\texttt{\param{cpn}.dp} and a height \texttt{\param{cpn}.hg} that both are
+relative to the component math axis. Two overall dimensions are associated with
+each derivation tree, \texttt{den\_dp} and \texttt{num\_hg}. The former
+refers to the depth of a judgment math axis relatively to the axis of an
+inference line above it while the latter refers to the height of a judgment
+math axis relatively to the axis of an inference line below it. Depths are
+negative while heights are positive.
+\begin{Verbatim}
+beginfig(470)
+dcl 0 () ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+(The picture below may look weird if you don't use scalable fonts.)
+\begin{gather*}
+\drv{drv-guide.480}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_styled}\label{sec-styled}}
+%
+%
+\texttt{drv\_styled} enables the drawing of \MP\ paths
+%(see~\cite[Section~4]{hobby09})
+using \texttt{drv} path-styles.\\[1ex]
+\texttt{\param{path} drv\_styled \param{id}}\\
+\begin{tabular}{ll}
+\param{path}& \MP\ path expression\\
+\param{id}& path style identifier ({\tt0}, {\tt1}, {\tt2}, {\tt3},
+ {\tt4}, {\tt5} or {\tt6})
+\end{tabular}
+\begin{Verbatim}
+beginfig(490)
+jgm 4 "A", "\vdash", "A";
+jgm 5 "B", "_2", "\vdash", "B", "_3";
+jgm 6 "A", ",", "A", "\multimap", "B", "_1", "\vdash", "B", "_4";
+jgm 7 "A", "\multimap", "B", "_0", "\vdash", "A", "\multimap", "B", "_5";
+nfr 4 () ("1", _);
+nfr 5 () ("1", _);
+nfr 6 (4, 5) ("\multimap_{L}", _);
+nfr 7 (6) ("\multimap_{R}", _);
+drv_freeze; % B
+draw (sbj[7][2].c shifted (0, -num_hg) .. % 0
+ sbj[7][2].c {up} .. % 0
+ sbj[6][4].c .. % 1
+ sbj[5][0].c .. tension 1.2 .. % 2
+ sbj[5][3].c .. % 3
+ sbj[6][7].c .. % 4
+ sbj[7][7].c {down} .. % 5
+ sbj[7][7].c shifted (0, -num_hg)) % 5
+drv_styled 2 withcolor (1, 0, 0);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.490}
+\end{gather*}
+%
+%
+\subsection{User specified junction and alignment styles
+(tricky)\label{sec-user-specified}}
+%
+%
+\texttt{drv} composes derivation trees by stating geometrical constraints to
+be solved by \MP. These constraints express how the components of a derivation
+tree must be arranged with respect to each-other. In the example about
+dimensions (see above), such a constraint could be that the vertical
+distance from
+\texttt{iln[1].c} to \texttt{jdg[0].c} has to be \texttt{num\_hg}, which could
+be \emph{stated} in the \MP\ syntax as
+``\texttt{ypart jdg[0].c=ypart iln[1].c+num\_hg}'' (this is \emph{not} an
+affectation).
+
+You can prevent \texttt{drv} from stating \emph{horizontal}
+constraints about premises junction or judgments alignment by using the
+junction style~\texttt{3} or the alignment style~\texttt{u} of the \texttt{NFR}
+and \texttt{NFR\_opt} macros
+(see~\S~\ref{sec-NFR-DCL-MVD},~\ref{sec-labels}). In such cases, you have
+to state your own constraints. All the constraints related to a derivation tree
+must be stated \emph{before} \texttt{drv\_freeze} is called. \MP\ will complain
+if the constraints you state are insufficient, redundant or inconsistent.
+%
+%
+\paragraph{User specified junction style}
+%
+%
+The \emph{horizontal} constraints you state should express how the premises
+of the inference have to be joined.
+\begin{Verbatim}
+beginfig(500)
+jgm 0 "{\cdot}";
+jgm 1 "{\cdot}";
+jgm 2 "\text{You may check that the distance"&
+ " between the two dots above is 5 cm.}";
+NFR 0 () ("", "", "", "", _, _, _);
+NFR 1 () ("", "", "", "", _, _, _);
+NFR 2 (0, 1) ("", "", "", "", 3, _, _); % caution: 3
+xpart jdg[1].c=xpart jdg[0].c+5cm;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.500}
+\end{gather*}
+%
+%
+\paragraph{User specified alignment style}
+The \emph{horizontal} constraints you state should express how the inferred
+judgment has to be aligned with respect to its premises.
+%
+%
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(510) % "\tbs{}vdash":
+jgm 0 "B, A, \tbs{}Gamma", "\tbs{
+}vdash", "C"; % sbj[0][1]
+jgm 1 "A, \tbs{}Gamma", "\tbs{
+}vdash", "B\tbs{}multimap C"; % sbj[1][1]
+jgm 2 "\tbs{}Gamma", "\tbs{
+}vdash", "A\tbs{}multimap(B\tbs{}multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+xpart sbj[1][1].c=xpart sbj[0][1].c;
+\resplap{}xpart sbj[1][1].l=xpart sbj[0][1].r;
+xpart sbj[2][1].c=xpart sbj[1][1].c;
+\resplap{}xpart sbj[2][1].l=xpart sbj[1][1].r;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\label{fig-510}
+\begin{gather*}
+\drv{drv-guide.510}\quad\text{resp.}\quad\drv{drv-guide.511}
+\end{gather*}
+%
+%
+\addcontentsline{toc}{section}{References}
+%
+%
+\begin{thebibliography}{1}
+\bibitem{hobby09}
+John~D. \textsc{Hobby}.
+\href{http://tug.org/docs/metapost/mpman.pdf}
+{\emph{A User's Manual for \MP}}, 2009
+\bibitem{jackowski06}
+Bogus{\l}aw \textsc{Jackowski}.
+\href{http://tug.org/TUGboat/Articles/tb27-1/tb86jackowski.pdf}
+{\emph{Appendix G illuminated}}. \emph{TUGboat}, 27(1):83--90, 2006.
+\bibitem{knuth84}
+Donald~E. \textsc{Knuth}.
+\emph{The {\TeX}book}.
+Addison-Wesley, 1984.
+\bibitem{restall06}
+Greg \textsc{Restall}.
+\href{http://consequently.org/papers/ptp.pdf}
+{\emph{Proof Theory and Philosophy}}. Book in progress, 2006.
+\bibitem{roegel02}
+Denis \textsc{Roegel}.
+\href{http://www.ctan.org/get/graphics/metapost/contrib/macros/%
+metaobj/doc/momanual.pdf}{\emph{The MetaObj tutorial and reference manual}},
+2002.
+\bibitem{lutz06}
+Lutz \textsc{Stra\ss{}burger}.
+\href{http://www.lix.polytechnique.fr/~lutz/papers/RR-6013.pdf}
+{\emph{Proof Nets and the Identity of Proofs}}. \textsc{Inria}, 2006.
+\end{thebibliography}
+%
+%
+\appendix
+\section{Debugging and proofing\label{sec-debugging}}
+%
+%
+\subsection*{Debugging}
+%
+%
+Recall that you have to run ``\texttt{mpost \param{jobname}.mp}'' \emph{at
+least twice} (once more if you use sub-tree delimiters). If you get an error on
+the first run then it comes from the \texttt{drv}/\MP\ code. If you get an
+error on the second run then it comes from the \LaTeX\ code.
+%
+%
+\paragraph{Error on the first run}
+\MP\ behaves essentially as \TeX/\LaTeX\ when it finds and error
+(see~\cite[Debugging]{hobby09}). It stops, ``explains'' the error in some way
+(look for the line starting with an exclamation mark \texttt{!}), shows some
+lines of context, and asks you what to do next (answer \texttt{h} to get some
+help or \texttt{x} to terminate the run). If you're lucky, the error comes from
+an inconsistency that \texttt{drv} can detect. In such a case the
+explanation should be quite understandable.
+\begin{multicols}{2}
+\begin{Verbatim}[numbers=left,firstnumber=46]
+beginfig(520)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+jgm 3 "C\vdash D";
+jgm 4 "A\vdash D";
+nfr 0 () ("f", _);
+nfr 1 () ("g", _);
+nfr 2 (0, 1) ("\circ", _);
+nfr 3 () ("h", _);
+nfr 4 (0, 3) ("\circ", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\MP\ error message.
+\begin{Verbatim}[commandchars=\\\{\}]
+! drv (fig. 520): 0 has been used
+already as a premise index for
+inference declaration 2.
+\param{error context}
+l.56 nfr 4 (0, 3) ("{\tbs}circ", 1)
+ ;
+?
+\end{Verbatim}
+\end{multicols}
+%
+%
+\paragraph{Error on the second run}
+\MP\ fails to preprocess the \LaTeX\ code in
+\texttt{\param{jobname}-delayed.mp} and suggests that you ``\texttt{see
+mpxerr.log}'' which is a regular \LaTeX\ log-file. This file shows you which
+part of the \LaTeX\ code is faulty but unfortunately not where to find it in
+\texttt{\param{jobname}.mp}.
+%
+%
+\subsection*{Proofing}
+%
+%
+Recall that for each ``\texttt{beginfig(\param{index})}, \texttt{endfig;}''
+pair in a file \texttt{\param{jobname}.mp}, \MP\ generates an Encapsulated
+PostScript file \texttt{\param{jobname}.\param{index}}. In addition,
+\texttt{drv} generates a \LaTeX\ file \texttt{\param{jobname}-proof.tex}
+that contains a copy of the \LaTeX\ preamble in \texttt{\param{jobname}.mp}
+and includes each \texttt{\param{jobname}.\param{index}}%
+\footnote{To \MP\ users: proof file generation does not take
+\texttt{outputtemplate} into account yet.}
+picture file using the \texttt{\tbs{}drv} inclusion command, together with
+some information about its text size, math style and math axis. As an example,
+regarding the first figure on page~\pageref{fig-110}, processing
+\texttt{drv-guide-proof.tex} produces:\\[1ex]
+\texttt{drv-guide.110}
+ (\verb+\normalsize+, \verb+\displaystyle+)
+ {\normalsize
+ \[\displaystyle
+ \frac{\quad}{}\drv{drv-guide.110}\frac{\quad}{}
+ \]}
+%
+%
+\section{Derivation forests\label{sec-forests}}
+%
+%
+You may declare several derivation trees within a single figure environment.
+Then trees are drawn from left to right in the order their roots are
+declared, and in such a way that: root judgments are horizontally aligned; the
+distance between two trees is the same as the distance between two
+non-interleaving premises (and thus is affected by \texttt{drv\_scale}, see
+\S~\ref{sec-scale}).
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(530)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}}
+\drv{drv-guide.530}
+\end{gather*}
+\end{multicols}
+\noindent You can however state constraints (horizontal or vertical, at your
+option) specifying the relative positioning of trees before
+\texttt{drv\_freeze} is called.
+\begin{multicols}{2}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(531)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+% relative positionning
+ypart jdg[10].c=ypart jdg[22].c;
+\resplap{}xpart iln[10].r=xpart iln[20].l;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}}
+\drv{drv-guide.531}
+\end{gather*}
+\begin{gather*}
+\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}}
+\drv{drv-guide.532}
+\end{gather*}
+\end{multicols}
+\noindent Notice that the math axis of a forest is set according to
+\texttt{drv\_axis\_reference} (see \S~\ref{sec-axis-reference}) relatively to
+the first declared root (you can override this behaviour by using
+\texttt{drv\_axis}, see \S~\ref{sec-axis}).
+%
+%
+\subsection*{\texttt{drv\_root}}
+%
+%
+\texttt{drv\_root} locally overrides \texttt{drv\_roots\_position} (see
+\S~\ref{sec-roots-position}), enabling the explicit setting of
+the position of a root.\\[1ex]
+\texttt{drv\_root (\param{nat}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat}& root index\\
+\param{id}& position identifier ({\tt t} or {\tt b})\\
+& \begin{tabular}{ll}
+ {\tt t}&top\\
+ {\tt b}&bottom
+ \end{tabular}
+\end{tabular}
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(533)
+% first tree
+dcl 10 () ("", _) "a";
+% second tree
+dcl 20 (21, 22) ("", _) "d";
+ dcl 21 () ("", _) "b";
+ dcl 22 () ("", _) "c";
+drv_root (20, t); % root at top!
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}}
+\drv{drv-guide.533}
+\end{gather*}
+\end{multicols}
+\noindent Then again, you can state constraints specifying the relative
+positioning (e.g., the overlapping) of trees before \texttt{drv\_freeze} is
+called\label{code-overlapping}.
+\begin{Verbatim}
+drv_left_delimiter "\downarrow";
+drv_right_delimiter "\uparrow";
+
+beginfig(540)
+% first tree
+jgm 10 "A\vdash D";
+Nfr 10 (11, 14) ("\circ", "h\circ (g\circ f)", "", 1);
+ dcl 11 (12, 13) ("\circ", 1) "A\vdash C";
+ dcl 12 () ("f", 2) "A\vdash B";
+ dcl 13 () ("g", 3) "B\vdash C";
+ dcl 14 () ("h", 4) "C\vdash D";
+% second tree
+jgm 20 "\phantom{A\vdash D}"; % hidden judgment
+Nfr 20 (21, 22) ("\circ", "", "(h\circ g)\circ f", 1);
+ dcl 21 () ("f", 2) "A\vdash B";
+ dcl 22 (23, 24) ("\circ", 1) "B\vdash D";
+ dcl 23 () ("g", 3) "B\vdash C";
+ dcl 24 () ("h", 4) "C\vdash D";
+drv_root (20, t); % root at top!
+% overlapping
+jdg[10].c=jdg[20].c;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\enlargethispage{\baselineskip}
+(The resulting figure is in Appendix~\ref{sec-gallery} on
+page~\pageref{fig-overlapping}.)
+%
+%
+\section{Radial mode (beta version)\label{sec-radial}}
+%
+%
+A few more tuning macros (see~\S~\ref{sec-tunings}) are available that enable
+the manipulation of \emph{radial} trees rather than ``linear'' ones.
+%
+%
+\subsection*{\texttt{drv\_radial\_mode}}
+%
+%
+\texttt{drv\_radial\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}\\
+ {\tt off}&\default
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.5\textwidth}}@{}l@{}}
+\texttt{on}&
+\texttt{off}&\\[1ex]
+\drv{drv-guide.550}&
+\drv{drv-guide.552}&\\[4ex]
+\drv{drv-guide.551}&
+\drv{drv-guide.553}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection*{\texttt{drv\_scale (crv, {\rm ---})}}
+%
+%
+\texttt{drv\_scale (crv, \param{float})}\\
+\begin{tabular}{lll}
+{\tt crv}& scale identifier\\
+\param{float}&scale value&\default[: 1]
+\end{tabular}
+%
+%
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0.5}&
+\texttt{1}&
+\texttt{2}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.560}&
+\drv{drv-guide.561}&
+\drv{drv-guide.562}&
+\drv{drv-guide.563}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection*{\texttt{drv\_azimuth}}
+%
+%
+\texttt{drv\_azimuth \param{float}}\\
+\begin{tabular}{lll}
+\param{float}&azimuth degree&\default[: 90]
+\end{tabular}
+%
+%
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{120}&
+\texttt{90}&
+\texttt{60}&\\[1ex]
+\drv{drv-guide.570}&
+\drv{drv-guide.571}&
+\drv{drv-guide.572}&
+\end{array}
+\end{gather*}
+The azimuth of a derivation tree is that of the central point of its root
+judgment. Notice that both \texttt{drv\_scale (crv, {\rm ---})} and
+\texttt{drv\_azimuth} are irrelevant when not in radial mode.
+%
+%
+\begin{gather*}
+\drv{drv-guide.580}
+\end{gather*}
+%
+%
+\subsection*{User specified junction and alignment styles (tricky)}
+%
+%
+When in radial mode, \texttt{drv} composes derivation trees by stating
+\emph{angular} constraints rather than horizontal ones. To this end, three
+distinguished angles are associated with each component \param{cpn}, namely
+\texttt{\param{cpn}.lng}, \texttt{\param{cpn}.cng} and \texttt{\param{cpn}.rng}
+that refer to the relative angles of \texttt{\param{cpn}.l},
+\texttt{\param{cpn}.c} and \texttt{\param{cpn}.r} respectively. (Radial
+constraints are essentially the same as vertical ones; however, each component
+comes also with a radius \texttt{\param{cpn}.rad} and an origin point
+\texttt{\param{cpn}.org}.)
+
+You can prevent \texttt{drv} from stating angular constraints about
+premises junction or judgments alignment by using the junction
+style~\texttt{3} or the alignment style~\texttt{u} of the \texttt{NFR} and
+\texttt{NFR\_opt} macros (see~\S~\ref{sec-NFR-DCL-MVD},~\ref{sec-labels}).
+Then again, you have to state your own constraints. As an example, compare the
+code below with the one for figure~510 on page~\pageref{fig-510}.
+%
+%
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(590) % "\tbs{}vdash":
+jgm 0 "B, A, \tbs{}Gamma", "\tbs{
+}vdash", "C"; % sbj[0][1]
+jgm 1 "A, \tbs{}Gamma", "\tbs{
+}vdash", "B\tbs{}multimap C"; % sbj[1][1]
+jgm 2 "\tbs{}Gamma", "\tbs{
+}vdash", "A\tbs{}multimap(B\tbs{}multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+sbj[1][1].cng=sbj[0][1].cng;
+\resplap{}sbj[1][1].lng=sbj[0][1].rng;
+sbj[2][1].cng=sbj[1][1].cng;
+\resplap{}sbj[2][1].lng=sbj[1][1].rng;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.590}\quad\text{resp.}\quad\drv{drv-guide.591}
+\end{gather*}
+%
+%
+\section{Gallery\label{sec-gallery}}
+%
+%
+Here are two simple derivation trees (figures~600,~601).
+\begin{gather*}
+\drv{drv-guide.600}\quad
+\drv{drv-guide.601}
+\end{gather*}
+%
+%
+Here are the \texttt{drv} version of a derivation tree found
+in~\cite[p.~57]{restall06} and an alternative for it (figures~610,~611).
+\begin{gather*}
+\hbox to 0pt{\hss{\drv{drv-guide.610}}\hss}
+\end{gather*}
+\begin{gather*}
+\drv{drv-guide.611}
+\end{gather*}
+%
+%
+Here are overlapping trees with opposite directions (figure~540, code on
+page~\pageref{code-overlapping}).
+\begin{gather*}
+\drv{drv-guide.540}\label{fig-overlapping}
+\end{gather*}
+%
+%
+Here is the \texttt{drv} version of a derivation tree found
+in~\cite[p.~86]{roegel02} (figure~620).
+\begin{gather*}
+\drv{drv-guide.620}
+\end{gather*}
+%
+%
+Here are the \texttt{drv} versions of derivation trees found
+in~\cite[p.~50]{lutz06} (figures~630,~631).
+\begin{gather*}
+\drv{drv-guide.630}\quad\to\quad\drv{drv-guide.631}
+\end{gather*}
+%
+%
+Here is a continued fraction (figure~640).
+\begin{gather*}
+\drv{drv-guide.640}
+\end{gather*}
+%
+%
+\section{Standalone picture files\label{sec-standalone}}
+%
+%
+Given a PostScript file \texttt{\param{jobname}.\param{index}} generated by
+\MP, you may get a standalone \textsc{pdf} file (with embedded fonts)
+\texttt{\param{jobname}-\param{index}.pdf} by running
+\begin{center}
+\texttt{mptopdf \param{jobname}.\param{index}}
+\end{center}
+(\texttt{mptopdf} should be part of your \TeX\ distribution). Next you may
+get a standalone \textsc{ps} file \texttt{\param{jobname}-\param{index}.ps} by
+running
+\begin{center}
+\texttt{pdftops \param{jobname}-\param{index}.pdf}
+\end{center}
+(\texttt{pdftops} is part of the Xpdf software package). Finally you may get a
+standalone \emph{transparent} \textsc{png} file
+\texttt{\param{jobname}-\param{index}.png} by running
+\begin{center}
+\texttt{convert \param{jobname}-\param{index}.ps
+\param{jobname}-\param{index}.png}
+\end{center}
+(\texttt{convert} is part of the ImageMagick software package). Notice that you
+can run \texttt{convert} on \texttt{\param{jobname}-\param{index}.pdf} but then
+the \textsc{png} file you get is not transparent.
+%
+%
+\section{Related packages\label{sec-related}}
+%
+%
+\begin{itemize}
+\item
+\href{http://math.ucsd.edu/~sbuss/ResearchWeb/bussproofs/}
+{\texttt{bussproofs.sty}}
+(Samuel R. \textsc{Buss});
+\item
+\href{http://cristal.inria.fr/~remy/latex/}
+{\texttt{mathpartir.sty}}
+(Didier \textsc{R\'emy});
+\item
+\href{http://research.nii.ac.jp/~tatsuta/proof-sty.html}
+{\texttt{proof.sty}}
+(Makoto \textsc{Tatsuta});
+\item
+\href{http://www.paultaylor.eu/proofs/index.html}
+{\texttt{prooftree.sty}}
+(Paul \textsc{Taylor});
+\item
+the \texttt{Ptree} constructor from
+\href{http://tug.ctan.org/tex-archive/graphics/%
+metapost/contrib/macros/metaobj/}{\texttt{metaobj.mp}}
+(Denis \textsc{Roegel}, see~\cite{roegel02});
+\item
+\href{http://tug.ctan.org/tex-archive/macros/latex/contrib/semantic/}
+{\texttt{semantic.sty}}
+(Peter M\o ller \textsc{Neergaard} and Arne John \textsc{Glenstrup});
+\item
+\href{http://www.utdallas.edu/~hamlen/projects.html}
+{\texttt{trfrac.sty}}
+(Kevin W. \textsc{Hamlen});
+\item
+\href{http://alessio.guglielmi.name/res/vl/}
+{\texttt{virginialake.sty}}
+(Alessio \textsc{Guglielmi}).
+\end{itemize}
+Some of these are described on Peter \textsc{Smith}'s
+``\href{http://www.logicmatters.net/latex-for-logicians/}
+{\LaTeX\ for Logicians}'' webpage.
+\end{document}
diff --git a/graphics/metapost/contrib/macros/drv/doc/drv.mp b/graphics/metapost/contrib/macros/drv/doc/drv.mp
new file mode 100644
index 0000000000..09cd16a41d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/doc/drv.mp
@@ -0,0 +1,3033 @@
+%% drv 0.97
+%% Copyright 2011 Laurent M\'ehats
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+newinternal drv_version;
+drv_version:=0.97;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, crv, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% crv nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "("
+% "["
+% "\lbrace"
+% "\langle"
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_labels_mode (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> status identifier (on or off)
+%
+% drv_verbatimtex <str>
+% <str> LaTeX material
+%
+% drv_radial_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_azimuth <float>
+% <float> azimuth degree
+%
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_root (<nat>, <id>)
+% <nat> root index
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+drv_message "version "&decimal drv_version&".";
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_find_verbatimtex=
+ save readfrom_str;
+ string readfrom_str;
+ forever:
+ readfrom_str:=readfrom jobname;
+ exitif (readfrom_str="verbatimtex%&latex")
+ or (readfrom_str="verbatimtex %&latex")
+ or (readfrom_str=EOF);
+ endfor
+ if readfrom_str="verbatimtex %&latex":
+ drv_message "warning, "&ditto&"verbatimtex %&latex"&ditto&
+ " is deprecated, you should use "&ditto&"verbatimtex%&latex"&ditto&
+ " instead.";
+ fi
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain "&
+ ditto&"verbatimtex%&latex"&ditto&" on a single line.");
+ drv_errmessage (ditto&"verbatimtex%&latex"&ditto&" is missing");
+ fi
+enddef;
+
+vardef drv_find (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex%&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_find_verbatimtex;
+ drv_find ("\begin{document}", tex_preamble_str[0]);
+ drv_find ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex%&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_rnk;
+tex_pct_rnk:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_rnk)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_rnk]:
+ tex_pct[tex_pct_rnk]
+ else:
+ nullpicture
+ fi;
+ tex_pct_rnk:=tex_pct_rnk+1;
+ pct
+enddef;
+
+vardef drv_verbatimtex expr tex_str=
+ write char(10)&
+ "% drv_verbatimtex"&char(10)&char(10)&
+ "verbatimtex"&char(10)&
+ tex_str&char(10)&
+ "etex;"
+ to delayed_tex_file;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+%vardef drv_fontdimen[] expr font=
+% save dim_pct;
+% picture dim_pct;
+% dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+% width dim_pct
+%enddef;
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct, dim_str;
+ picture dim_pct;
+ string dim_str;
+ dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}");
+ dim_str:="0";
+ for tok within dim_pct:
+ dim_str:=dim_str&(textpart tok);
+ endfor
+ scantokens dim_str
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,"; % thinspace
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\:"; % medspace
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;"; % thickspace
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ drv_arc str;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-arcs
+%
+
+vardef drv_arc text STR=
+ for str=STR:
+ expandafter numeric scantokens str.rad;
+ expandafter numeric scantokens str.lng;
+ expandafter numeric scantokens str.cng;
+ expandafter numeric scantokens str.rng;
+ expandafter pair scantokens str.org;
+ endfor
+enddef;
+
+vardef arc_init @# (expr pct, ngl)=
+ @#:=pct;
+ @#.rng-@#.lng=ngl;
+ @#.cng=(@#.lng+@#.rng)/2;
+enddef;
+
+vardef arc_freeze @#=
+ @#:=@# rotated @#.lng shifted @#.org;
+ @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org;
+ @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org;
+ @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Polar coordinates, angles & text torsion
+%
+
+vardef rad_part expr ppt=
+ xpart ppt
+enddef;
+
+vardef ngl_part expr ppt=
+ ypart ppt
+enddef;
+
+vardef minrad (expr ppt_a, ppt_b)=
+ min (rad_part ppt_a, rad_part ppt_b)
+enddef;
+
+% "tnum" (turning number) argument:
+% -1: clockwise
+% 1: counterclockwise
+
+vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef arc_angle (expr rad, arc_len) expr tnum=
+ if rad>0:
+ save pth;
+ path pth;
+ pth:=fullcircle scaled (2*rad);
+ tnum*(angle point (arctime arc_len of pth) of pth)
+ else:
+ 0
+ fi
+enddef;
+
+vardef circ_path (expr rad, ngl) expr tnum=
+ save pth;
+ path pth;
+ pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad);
+ subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth
+enddef;
+
+vardef text_arc (expr pct, rad) expr tnum=
+ save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct;
+ picture arc_pct, chr_pct;
+ numeric tok_ngl, hlf_wd;
+ string tok_str;
+ arc_pct:=nullpicture;
+ for tok within pct:
+ if textual tok:
+ transform tok_trn;
+ tok_str:=textpart tok;
+ (0, 0) transformed tok_trn=(0, 0);
+ (0, 1) transformed tok_trn=(xypart tok, yypart tok);
+ (1, 0) transformed tok_trn=(xxpart tok, yxpart tok);
+ tok_ngl:=arc_angle (rad, xpart tok) tnum;
+ for chr_rnk=0 upto (length tok_str-1):
+ chr_pct:=
+ substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok)
+ transformed tok_trn;
+ hlf_wd:=(width chr_pct)/2;
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ addto arc_pct also chr_pct
+ shifted (-hlf_wd, 0)
+ rotated (tok_ngl+tnum*90)
+ shifted (dir tok_ngl scaled (rad-tnum*(ypart tok)));
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ endfor
+ elseif stroked tok:
+ path pth;
+ pair src, tgt;
+ numeric src_ngl, tgt_ngl;
+ pth:=pathpart tok;
+ src:=point 0 of pth;
+ tgt:=point length pth of pth;
+ src_ngl:=arc_angle (rad, xpart src) tnum;
+ tgt_ngl:=arc_angle (rad, xpart tgt) tnum;
+ interim linecap:=butt;
+ addto arc_pct doublepath
+ if xpart src<>xpart tgt: % horizontal rule
+ (circ_path (rad-tnum*(ypart src), tgt_ngl-src_ngl) tnum)
+ rotated src_ngl
+ else: % vertical rule
+ pth shifted -src rotated (src_ngl+tnum*90)
+ shifted (dir src_ngl scaled (rad-tnum*(ypart src)))
+ fi withpen penpart tok;
+ fi
+ endfor
+ arc_pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ % bot_jdg[i] boolean
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ boolean bot_jdg[];
+ %
+ % nfr_min_x[i] inference minimal x
+ % nfr_lmost_ppt[i] inference leftmost polar point
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % nfr_max_x[i] inference maximal x
+ % nfr_rmost_ppt[i] inference rightmost polar point
+ %
+ numeric nfr_min_x[];
+ pair nfr_lmost_ppt[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric nfr_max_x[];
+ pair nfr_rmost_ppt[];
+ %
+ % Sub-trees
+ %
+ % sub_min_x[i] sub-tree minimal x
+ % sub_lmost_ppt[i] sub-tree leftmost polar point
+ % sub_max_x[i] sub-tree maximal x
+ % sub_rmost_ppt[i] sub-tree rightmost polar point
+ % sub_min_y[i] sub-tree minimal y
+ % sub_min_rad[i] sub-tree minimal radius
+ % sub_max_y[i] sub-tree maximal y
+ % sub_max_rad[i] sub-tree maximal radius
+ % boxed[i] boolean
+ %
+ numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[];
+ pair sub_lmost_ppt[], sub_rmost_ppt[];
+ numeric sub_min_rad[], sub_max_rad[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_checked boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=mth_tex[jdg_sty[drv_sty]] sub;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l; % irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=jdg_wd+width sbj_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].l=sbj[@][0].l; % irrelevant if sbj_num=0
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+%
+% 1. Global parameters
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_ilb_on; % inference labels on
+boolean drv_dlb_on; % delimiter labels on
+boolean drv_plb_on; % phantom steps labels on
+
+%
+% 2. Macros
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr str=
+ if str<>"":
+ box_init @# (mth_tex[@] str);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk, root_rnk;
+ numeric prm_rnk, root_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ root_rnk:=0;
+ forever:
+ exitif root[root_rnk]=prm_idx;
+ root_rnk:=root_rnk+1;
+ endfor
+ forever:
+ exitif root_rnk=root_num-1;
+ root[root_rnk]:=root[root_rnk+1];
+ root_rnk:=root_rnk+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ if drv_ilb_on:
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ fi
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ if drv_dlb_on:
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ else:
+ if ldlb<>"":
+ box_init l_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ if rdlb<>"":
+ box_init r_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ fi
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save prm_idx, pth_sty, phm_jdg;
+ numeric prm_idx, pth_sty;
+ picture phm_jdg;
+ pth_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[pth_sty]-iln_dp[pth_sty], 0)--cycle;
+ prm_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (prm_idx) ("", "", "", "", 0, a_sty, 0);
+ prm_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=pth_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ if drv_plb_on:
+ opt_init[plb_sty[drv_sty]] l_plb[@] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[@] rplb;
+ fi
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ string fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ string snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ string @#.l;
+ string @#.r;
+ if lbl_num=0:
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_ldlm_str; % left delimiter LaTeX code
+string drv_rdlm_str; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef min_y[]=
+ if bot_jdg[@]:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_y[]=
+ if bot_jdg[@]:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi
+enddef;
+
+vardef min_rad[]=
+ if known ccl[@]:
+ if bot_jdg[@]:
+ jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ else:
+ jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])]
+ fi+min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_rad[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_rad[]=
+ sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_ldlm_str&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_rdlm_str
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+boolean drv_radialmode_on; %
+numeric crv_scl; %
+numeric azimuth_ngl; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_bot_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=true;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_bot_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ endfor
+ if not fraction_inference[@]:
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_top_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=false;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_top_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ endfor
+ if not fraction_inference[@]:
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_root (expr idx) (suffix pos_sfx)=
+ save root_idx;
+ numeric root_idx;
+ root_idx:=idx;
+ forever:
+ exitif unknown ccl[root_idx];
+ root_idx:=ccl[root_idx];
+ endfor
+ if idx<>root_idx:
+ drv_message "warning, "&(decimal idx)&" is not a root index"&
+ " (the actual root index is "&(decimal root_idx)&").";
+ fi
+ bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx, root_str;
+ numeric root_idx;
+ string root_str;
+ for root_rnk=0 upto root_num-1:
+ root_idx:=root[root_rnk];
+ if unknown bot_jdg[root_idx]:
+ bot_jdg[root_idx]:=drv_bot_roots;
+ fi
+ if bot_jdg[root_idx]:
+ drv_bot_check[root_idx];
+ else:
+ drv_top_check[root_idx];
+ fi
+ root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx;
+ endfor
+ if root_num>1:
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_lin_build[]=
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ sub_max_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]);
+ endfor
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ sub_min_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln_dp[iln_sty[@]]
+ fi;
+ sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]);
+ endfor
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_max_x:=nfr_max_x[l_rmost];
+ r_min_x:=nfr_min_x[r_lmost];
+ min_skp[0]:=r_min_x-l_max_x;
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_max_x:=max (l_max_x, nfr_max_x[l_rmost]);
+ r_min_x:=min (r_min_x, nfr_min_x[r_lmost]);
+ min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]);
+ endfor
+ min_skp[1]:=r_min_x-l_max_x;
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:= r_prm[l_rmost];
+ l_max_x:=sub_max_x[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_min_x:=sub_min_x[r_lmost];
+ fi
+ min_skp[2]:=r_min_x-l_max_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_min_x[@]:=xpart jdg[@].l;
+ nfr_max_x[@]:=xpart jdg[@].r;
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[l_prm[@]]:
+ sub_min_x[l_prm[@]]
+ else:
+ xpart jdg[l_prm[@]].l
+ fi;
+ r_xref=
+ if boxed[r_prm[@]]:
+ sub_max_x[r_prm[@]]
+ else:
+ xpart jdg[r_prm[@]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ nfr_min_x[@]:=min (xpart jdg[@].l, l_xref);
+ nfr_max_x[@]:=max (xpart jdg[@].r, r_xref);
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=nfr_max_x[@]-nfr_min_x[@]+2*jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(nfr_min_x[@]+nfr_max_x[@])/2;
+ if iln_sty[@]>0:
+ nfr_min_x[@]:=xpart iln[@].l;
+ nfr_max_x[@]:=xpart iln[@].r;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_min_x[@]:=xpart l_ilb[@].l;
+ sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_max_x[@]:=xpart r_ilb[@].r;
+ sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, bot_y, top_y, phm_pct;
+ numeric trg, bot_y, top_y;
+ picture phm_pct;
+ trg:=tgt[@];
+ if bot_jdg[@]:
+ bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=min_y[trg];
+ else:
+ bot_y:=max_y[trg];
+ top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2))
+ drv_styled phm_sty[@];
+ box_init phm[trg] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[trg].c=(xpart jdg[@].c, (top_y+bot_y)/2);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[trg].l);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[trg].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].r=phm[trg].l shifted (-plb_skp[drv_sty], 0);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[trg].l);
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].l=phm[trg].r shifted ( plb_skp[drv_sty], 0);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[trg].r);
+ fi
+ fi
+ %
+ % sub_min_x & sub_max_x
+ %
+ sub_min_x[@]:=nfr_min_x[@];
+ sub_max_x[@]:=nfr_max_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]);
+ sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save miny, maxy;
+ numeric miny, maxy;
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (maxy-miny));
+ l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ sub_min_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (maxy-miny));
+ r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ sub_max_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_min_x[idx]:=sub_min_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_max_x[idx]:=sub_max_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_rad_build[]=
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ sbj[@][sbj_rnk].rad=jdg[@].rad;
+ sbj[@][sbj_rnk].org=jdg[@].org;
+ endfor
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ iln[@].rad=jdg[@].rad-den_dp;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad+jdg[@].dp;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad+jdg[@].hg
+ else:
+ iln[@].rad+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor
+ else:
+ iln[@].rad=jdg[@].rad+num_hg;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad-jdg[@].hg;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad-jdg[@].dp
+ else:
+ iln[@].rad-iln_dp[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].rad=iln[@].rad;
+ l_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].rad=iln[@].rad;
+ r_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad;
+ numeric trg, src_rad, tgt_rad;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm[trg].rad=(src_rad+tgt_rad)/2;
+ phm[trg].org=jdg[@].org;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].rad=phm[trg].rad;
+ l_plb[trg].org=phm[trg].org;
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].rad=phm[trg].rad;
+ r_plb[trg].org=phm[trg].org;
+ fi
+ fi
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save minr, maxr;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ l_dlm[@].rad=(minr+maxr)/2;
+ l_dlb[@].rad=l_dlm[@].rad;
+ l_dlb[@].org=l_dlm[@].org=jdg[@].org;
+ fi
+ if known r_dlb[@]:
+ r_dlm[@].rad=(minr+maxr)/2;
+ r_dlb[@].rad=r_dlm[@].rad;
+ r_dlb[@].org=r_dlm[@].org=jdg[@].org;
+ fi
+ fi
+enddef;
+
+vardef drv_ngl_build[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_ngl_build[prm[@][prm_rnk]];
+ endfor
+ save tnum;
+ numeric tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ %
+ % judgment arc
+ %
+ save jdg_pct, jdg_ngl;
+ picture jdg_pct;
+ numeric jdg_ngl;
+ jdg_pct:=nullpicture;
+ jdg_ngl:=0;
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ arc_init sbj[@][sbj_rnk]
+ (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum,
+ arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl;
+ jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng;
+ endfor
+ arc_init jdg[@] (jdg_pct, jdg_ngl);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost;
+ pair l_rmost_ppt, r_lmost_ppt, ppt_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_rmost_ppt:=nfr_rmost_ppt[l_rmost];
+ r_lmost_ppt:=nfr_lmost_ppt[r_lmost];
+ ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum;
+ r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum;
+ ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum;
+ endfor
+ ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:=r_prm[l_rmost];
+ l_rmost_ppt:=sub_rmost_ppt[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_lmost_ppt:=sub_lmost_ppt[r_lmost];
+ fi
+ ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if jct_sty[@]<3:
+ (ngl_part ppt_skp[jct_sty[@]])=
+ arc_angle(rad_part ppt_skp[jct_sty[@]],
+ prm_skp_scl*prm_skp[drv_sty]) tnum;
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng);
+ nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng);
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_ngl_ref, r_ngl_ref;
+ numeric l_ngl_ref, r_ngl_ref;
+ l_ngl_ref=
+ if boxed[l_prm[@]]:
+ ngl_part sub_lmost_ppt[l_prm[@]]
+ else:
+ jdg[l_prm[@]].lng
+ fi;
+ r_ngl_ref=
+ if boxed[r_prm[@]]:
+ ngl_part sub_rmost_ppt[r_prm[@]]
+ else:
+ jdg[r_prm[@]].rng
+ fi;
+ if alg_sty[@]="l":
+ jdg[@].lng=l_ngl_ref;
+ elseif alg_sty[@]="c":
+ jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2;
+ elseif alg_sty[@]="r":
+ jdg[@].rng=r_ngl_ref;
+ fi
+ nfr_lmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref));
+ nfr_rmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref));
+ fi
+ %
+ % inference line
+ %
+ save iln_ngl;
+ numeric iln_ngl;
+ iln_ngl:=2*(arc_angle(iln[@].rad,
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum)
+ +(ngl_part nfr_rmost_ppt[@])
+ -(ngl_part nfr_lmost_ppt[@]);
+ arc_init iln[@]
+ ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl);
+ iln[@].hg=iln_hg[iln_sty[@]];
+ iln[@].dp=iln_dp[iln_sty[@]];
+ iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2;
+ if iln_sty[@]>0:
+ nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng);
+ nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng);
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ arc_init l_ilb[@](
+ text_arc (l_ilb[@], l_ilb[@].rad) tnum,
+ arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum);
+ l_ilb[@].rng=iln[@].lng
+ -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng);
+ fi
+ if known r_ilb[@]:
+ arc_init r_ilb[@](
+ text_arc (r_ilb[@], r_ilb[@].rad) tnum,
+ arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum);
+ r_ilb[@].lng=iln[@].rng
+ +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad, phm_pct;
+ numeric trg, src_rad, tgt_rad;
+ picture phm_pct;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2))
+ drv_styled phm_sty[@];
+ arc_init phm[trg] (
+ phm_pct
+ rotated (tnum*90+arc_angle (phm[trg].rad, (width phm_pct)/2) tnum)
+ shifted ((dir 0) scaled phm[trg].rad),
+ arc_angle (phm[trg].rad, width phm_pct) tnum);
+ phm[trg].cng=jdg[@].cng;
+ nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@],
+ (phm[trg].rad, phm[trg].lng)) tnum;
+ nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@],
+ (phm[trg].rad, phm[trg].rng)) tnum;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ arc_init l_plb[trg](
+ text_arc (l_plb[trg], l_plb[trg].rad) tnum,
+ arc_angle (l_plb[trg].rad, width l_plb[trg]) tnum);
+ l_plb[trg].rng=phm[trg].lng
+ -arc_angle (l_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=
+ lmost_ppt(nfr_lmost_ppt[@], (l_plb[trg].rad, l_plb[trg].lng)) tnum;
+ fi
+ if known r_plb[trg]:
+ arc_init r_plb[trg](
+ text_arc (r_plb[trg], r_plb[trg].rad) tnum,
+ arc_angle (r_plb[trg].rad, width r_plb[trg]) tnum);
+ r_plb[trg].lng=phm[trg].rng
+ +arc_angle (r_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=
+ rmost_ppt(nfr_rmost_ppt[@], (r_plb[trg].rad, r_plb[trg].rng)) tnum;
+ fi
+ fi
+ %
+ % sub_lmost_ppt & sub_rmost_ppt
+ %
+ sub_lmost_ppt[@]:=nfr_lmost_ppt[@];
+ sub_rmost_ppt[@]:=nfr_rmost_ppt[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_lmost_ppt[@]:=
+ lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum;
+ sub_rmost_ppt[@]:=
+ rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum;
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save dlm_pct, minr, maxr;
+ picture dlm_pct;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ dlm_pct:=delim l (maxr-minr);
+ arc_init l_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled l_dlm[@].rad),
+ arc_angle (l_dlm[@].rad, width dlm_pct) tnum);
+ l_dlm[@].rng=ngl_part sub_lmost_ppt[@];
+ arc_init l_dlb[@](
+ text_arc (l_dlb[@], l_dlb[@].rad) tnum,
+ arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum);
+ l_dlb[@].rng=l_dlm[@].lng;
+ sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng);
+ fi
+ if known r_dlb[@]:
+ dlm_pct:=delim r (maxr-minr);
+ arc_init r_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled r_dlm[@].rad),
+ arc_angle (r_dlm[@].rad, width dlm_pct) tnum);
+ r_dlm[@].lng=ngl_part sub_rmost_ppt[@];
+ arc_init r_dlb[@](
+ text_arc (r_dlb[@], r_dlb[@].rad) tnum,
+ arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum);
+ r_dlb[@].lng=r_dlm[@].rng;
+ sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng);
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_lmost_ppt[idx]:=sub_lmost_ppt[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_rmost_ppt[idx]:=sub_rmost_ppt[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_box_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_box_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_arc_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_arc_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ arc_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ arc_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_checked:
+ drv_check;
+ fi
+ save root_idx, tnum;
+ numeric root_idx, tnum;
+ %
+ % first root
+ %
+ root_idx:=root[0];
+ if drv_radialmode_on:
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ if unknown jdg[root_idx].cng:
+ jdg[root_idx].cng=-tnum*azimuth_ngl;
+ fi
+ if unknown jdg[root_idx].org:
+ %
+ % default math axis
+ %
+ jdg[root_idx].org=
+ (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+
+ if drv_axis_ref="iln":
+ iln[root_idx].rad
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].rad
+ fi);
+ fi
+ drv_arc_freeze[root_idx];
+ else:
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ xpart jdg[root_idx].c=0;
+ fi
+ if unknown ypart jdg[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ ypart iln[root_idx].c=axis_hg[drv_sty];
+ else: % drv_axis_ref="jdg"
+ ypart jdg[root_idx].c=axis_hg[drv_sty];
+ fi
+ fi
+ drv_box_freeze[root_idx];
+ fi
+ %
+ % other roots
+ %
+ if drv_radialmode_on:
+ save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]];
+ l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]];
+ r_lmost_rad:=rad_part sub_lmost_ppt[root_idx];
+ r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx];
+ if unknown jdg[root_idx].cng:
+ r_lmost_ngl=l_rmost_ngl+
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ arc_angle (min (r_lmost_rad, l_rmost_rad),
+ prm_skp_scl*prm_skp[drv_sty]) tnum
+ else:
+ 180
+ fi;
+ fi
+ if unknown jdg[root_idx].org:
+ jdg[root_idx].org=
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ jdg[root[root_rnk-1]].org
+ else:
+ (dir l_rmost_ngl)
+ scaled jdg[root[root_rnk-1]].rad
+ shifted jdg[root[root_rnk-1]].org
+ shifted ((dir (l_rmost_ngl-tnum*90))
+ scaled (prm_skp_scl*prm_skp[drv_sty]))
+ shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad)
+ fi;
+ fi
+ drv_arc_freeze[root_idx];
+ endfor
+ else:
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]]
+ +prm_skp_scl*prm_skp[drv_sty];
+ fi
+ if unknown ypart jdg[root_idx].c:
+ ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c;
+ fi
+ drv_box_freeze[root_idx];
+ endfor
+ fi
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_rnk=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_rnk]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_rnk]);
+ else:
+ drv_tree_addto pct (root[root_rnk]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if drv_radialmode_on:
+ save l_ngl, r_ngl, tnum;
+ numeric l_ngl, r_ngl, tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ l_ngl:=
+ if known l_dlm[@].rng:
+ l_dlm[@].rng-arc_angle
+ (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_lmost_ppt[@])-arc_angle
+ (rad_part sub_lmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ r_ngl:=
+ if known r_dlm[@].lng:
+ r_dlm[@].lng+arc_angle
+ (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_rmost_ppt[@])+arc_angle
+ (rad_part sub_rmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ (circ_path(max_rad[@], r_ngl-l_ngl) tnum--
+ reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum--
+ cycle) rotated l_ngl shifted jdg[@].org
+ else:
+ save minx, maxx, miny, maxy;
+ numeric minx, maxx, maxy, miny;
+ minx:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ sub_min_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ maxx:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ sub_max_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ (minx, miny)--
+ (minx, maxy)--
+ (maxx, maxy)--
+ (maxx, miny)--
+ cycle
+ fi
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_bot (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ false
+ elseif pos_str="b":
+ true
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min (idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ elseif scl_str="crv":
+ crv_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg,"&
+ " ilb and"&
+ " crv.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_ldlm_str:=dlm_str;
+ else:
+ drv_rdlm_str:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+vardef drv_labels_mode (suffix typ_sfx, status_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_ilb_on:=check_mode_on (status_sfx, drv_ilb_on);
+ elseif typ_str="dlb":
+ drv_dlb_on:=check_mode_on (status_sfx, drv_dlb_on);
+ elseif typ_str="plb":
+ drv_plb_on:=check_mode_on (status_sfx, drv_plb_on);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_radial_mode suffix status_sfx=
+ drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on);
+enddef;
+
+vardef drv_azimuth expr ngl=
+ azimuth_ngl:=ngl;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+drv_labels_mode (ilb, on);
+drv_labels_mode (dlb, on);
+drv_labels_mode (plb, on);
+
+drv_radial_mode off;
+drv_scale (crv, 1);
+drv_azimuth 90;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/graphics/metapost/contrib/macros/drv/doc/makefile b/graphics/metapost/contrib/macros/drv/doc/makefile
new file mode 100644
index 0000000000..0579656327
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/doc/makefile
@@ -0,0 +1,48 @@
+MAIN= drv-guide
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+ pdfopt $(MAIN).pdf $(MAIN)-opt.pdf
+ mv $(MAIN)-opt.pdf $(MAIN).pdf
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ latex $(MAIN)
+ latex $(MAIN)
+ dvips $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/graphics/metapost/contrib/macros/drv/doc/readme.sh b/graphics/metapost/contrib/macros/drv/doc/readme.sh
new file mode 100755
index 0000000000..e9d55e741d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/doc/readme.sh
@@ -0,0 +1,18 @@
+# In order to compile the sources and to get a pdf file,
+# use `make' or `./readme.sh' or:
+
+# 1. run metapost THREE TIMES:
+mpost drv-guide.mp
+mpost drv-guide.mp
+mpost drv-guide.mp
+
+# 2. run latex (three times):
+latex drv-guide.tex
+latex drv-guide.tex
+latex drv-guide.tex
+
+# 3. run dvips (once):
+dvips drv-guide.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf drv-guide.ps
diff --git a/graphics/metapost/contrib/macros/drv/drv-guide.pdf b/graphics/metapost/contrib/macros/drv/drv-guide.pdf
new file mode 100644
index 0000000000..76bc074a94
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/drv-guide.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/drv/drv.mp b/graphics/metapost/contrib/macros/drv/drv.mp
new file mode 100644
index 0000000000..09cd16a41d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/drv.mp
@@ -0,0 +1,3033 @@
+%% drv 0.97
+%% Copyright 2011 Laurent M\'ehats
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+newinternal drv_version;
+drv_version:=0.97;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, crv, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% crv nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "("
+% "["
+% "\lbrace"
+% "\langle"
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_labels_mode (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> status identifier (on or off)
+%
+% drv_verbatimtex <str>
+% <str> LaTeX material
+%
+% drv_radial_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_azimuth <float>
+% <float> azimuth degree
+%
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_root (<nat>, <id>)
+% <nat> root index
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+drv_message "version "&decimal drv_version&".";
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_find_verbatimtex=
+ save readfrom_str;
+ string readfrom_str;
+ forever:
+ readfrom_str:=readfrom jobname;
+ exitif (readfrom_str="verbatimtex%&latex")
+ or (readfrom_str="verbatimtex %&latex")
+ or (readfrom_str=EOF);
+ endfor
+ if readfrom_str="verbatimtex %&latex":
+ drv_message "warning, "&ditto&"verbatimtex %&latex"&ditto&
+ " is deprecated, you should use "&ditto&"verbatimtex%&latex"&ditto&
+ " instead.";
+ fi
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain "&
+ ditto&"verbatimtex%&latex"&ditto&" on a single line.");
+ drv_errmessage (ditto&"verbatimtex%&latex"&ditto&" is missing");
+ fi
+enddef;
+
+vardef drv_find (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex%&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_find_verbatimtex;
+ drv_find ("\begin{document}", tex_preamble_str[0]);
+ drv_find ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex%&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_rnk;
+tex_pct_rnk:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_rnk)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_rnk]:
+ tex_pct[tex_pct_rnk]
+ else:
+ nullpicture
+ fi;
+ tex_pct_rnk:=tex_pct_rnk+1;
+ pct
+enddef;
+
+vardef drv_verbatimtex expr tex_str=
+ write char(10)&
+ "% drv_verbatimtex"&char(10)&char(10)&
+ "verbatimtex"&char(10)&
+ tex_str&char(10)&
+ "etex;"
+ to delayed_tex_file;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+%vardef drv_fontdimen[] expr font=
+% save dim_pct;
+% picture dim_pct;
+% dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+% width dim_pct
+%enddef;
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct, dim_str;
+ picture dim_pct;
+ string dim_str;
+ dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}");
+ dim_str:="0";
+ for tok within dim_pct:
+ dim_str:=dim_str&(textpart tok);
+ endfor
+ scantokens dim_str
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,"; % thinspace
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\:"; % medspace
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;"; % thickspace
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ drv_arc str;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-arcs
+%
+
+vardef drv_arc text STR=
+ for str=STR:
+ expandafter numeric scantokens str.rad;
+ expandafter numeric scantokens str.lng;
+ expandafter numeric scantokens str.cng;
+ expandafter numeric scantokens str.rng;
+ expandafter pair scantokens str.org;
+ endfor
+enddef;
+
+vardef arc_init @# (expr pct, ngl)=
+ @#:=pct;
+ @#.rng-@#.lng=ngl;
+ @#.cng=(@#.lng+@#.rng)/2;
+enddef;
+
+vardef arc_freeze @#=
+ @#:=@# rotated @#.lng shifted @#.org;
+ @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org;
+ @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org;
+ @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Polar coordinates, angles & text torsion
+%
+
+vardef rad_part expr ppt=
+ xpart ppt
+enddef;
+
+vardef ngl_part expr ppt=
+ ypart ppt
+enddef;
+
+vardef minrad (expr ppt_a, ppt_b)=
+ min (rad_part ppt_a, rad_part ppt_b)
+enddef;
+
+% "tnum" (turning number) argument:
+% -1: clockwise
+% 1: counterclockwise
+
+vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef arc_angle (expr rad, arc_len) expr tnum=
+ if rad>0:
+ save pth;
+ path pth;
+ pth:=fullcircle scaled (2*rad);
+ tnum*(angle point (arctime arc_len of pth) of pth)
+ else:
+ 0
+ fi
+enddef;
+
+vardef circ_path (expr rad, ngl) expr tnum=
+ save pth;
+ path pth;
+ pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad);
+ subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth
+enddef;
+
+vardef text_arc (expr pct, rad) expr tnum=
+ save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct;
+ picture arc_pct, chr_pct;
+ numeric tok_ngl, hlf_wd;
+ string tok_str;
+ arc_pct:=nullpicture;
+ for tok within pct:
+ if textual tok:
+ transform tok_trn;
+ tok_str:=textpart tok;
+ (0, 0) transformed tok_trn=(0, 0);
+ (0, 1) transformed tok_trn=(xypart tok, yypart tok);
+ (1, 0) transformed tok_trn=(xxpart tok, yxpart tok);
+ tok_ngl:=arc_angle (rad, xpart tok) tnum;
+ for chr_rnk=0 upto (length tok_str-1):
+ chr_pct:=
+ substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok)
+ transformed tok_trn;
+ hlf_wd:=(width chr_pct)/2;
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ addto arc_pct also chr_pct
+ shifted (-hlf_wd, 0)
+ rotated (tok_ngl+tnum*90)
+ shifted (dir tok_ngl scaled (rad-tnum*(ypart tok)));
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ endfor
+ elseif stroked tok:
+ path pth;
+ pair src, tgt;
+ numeric src_ngl, tgt_ngl;
+ pth:=pathpart tok;
+ src:=point 0 of pth;
+ tgt:=point length pth of pth;
+ src_ngl:=arc_angle (rad, xpart src) tnum;
+ tgt_ngl:=arc_angle (rad, xpart tgt) tnum;
+ interim linecap:=butt;
+ addto arc_pct doublepath
+ if xpart src<>xpart tgt: % horizontal rule
+ (circ_path (rad-tnum*(ypart src), tgt_ngl-src_ngl) tnum)
+ rotated src_ngl
+ else: % vertical rule
+ pth shifted -src rotated (src_ngl+tnum*90)
+ shifted (dir src_ngl scaled (rad-tnum*(ypart src)))
+ fi withpen penpart tok;
+ fi
+ endfor
+ arc_pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ % bot_jdg[i] boolean
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ boolean bot_jdg[];
+ %
+ % nfr_min_x[i] inference minimal x
+ % nfr_lmost_ppt[i] inference leftmost polar point
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % nfr_max_x[i] inference maximal x
+ % nfr_rmost_ppt[i] inference rightmost polar point
+ %
+ numeric nfr_min_x[];
+ pair nfr_lmost_ppt[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric nfr_max_x[];
+ pair nfr_rmost_ppt[];
+ %
+ % Sub-trees
+ %
+ % sub_min_x[i] sub-tree minimal x
+ % sub_lmost_ppt[i] sub-tree leftmost polar point
+ % sub_max_x[i] sub-tree maximal x
+ % sub_rmost_ppt[i] sub-tree rightmost polar point
+ % sub_min_y[i] sub-tree minimal y
+ % sub_min_rad[i] sub-tree minimal radius
+ % sub_max_y[i] sub-tree maximal y
+ % sub_max_rad[i] sub-tree maximal radius
+ % boxed[i] boolean
+ %
+ numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[];
+ pair sub_lmost_ppt[], sub_rmost_ppt[];
+ numeric sub_min_rad[], sub_max_rad[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_checked boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=mth_tex[jdg_sty[drv_sty]] sub;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l; % irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=jdg_wd+width sbj_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].l=sbj[@][0].l; % irrelevant if sbj_num=0
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+%
+% 1. Global parameters
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_ilb_on; % inference labels on
+boolean drv_dlb_on; % delimiter labels on
+boolean drv_plb_on; % phantom steps labels on
+
+%
+% 2. Macros
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr str=
+ if str<>"":
+ box_init @# (mth_tex[@] str);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk, root_rnk;
+ numeric prm_rnk, root_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ root_rnk:=0;
+ forever:
+ exitif root[root_rnk]=prm_idx;
+ root_rnk:=root_rnk+1;
+ endfor
+ forever:
+ exitif root_rnk=root_num-1;
+ root[root_rnk]:=root[root_rnk+1];
+ root_rnk:=root_rnk+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ if drv_ilb_on:
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ fi
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ if drv_dlb_on:
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ else:
+ if ldlb<>"":
+ box_init l_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ if rdlb<>"":
+ box_init r_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ fi
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save prm_idx, pth_sty, phm_jdg;
+ numeric prm_idx, pth_sty;
+ picture phm_jdg;
+ pth_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[pth_sty]-iln_dp[pth_sty], 0)--cycle;
+ prm_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (prm_idx) ("", "", "", "", 0, a_sty, 0);
+ prm_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=pth_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ if drv_plb_on:
+ opt_init[plb_sty[drv_sty]] l_plb[@] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[@] rplb;
+ fi
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ string fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ string snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ string @#.l;
+ string @#.r;
+ if lbl_num=0:
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_ldlm_str; % left delimiter LaTeX code
+string drv_rdlm_str; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef min_y[]=
+ if bot_jdg[@]:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_y[]=
+ if bot_jdg[@]:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi
+enddef;
+
+vardef min_rad[]=
+ if known ccl[@]:
+ if bot_jdg[@]:
+ jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ else:
+ jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])]
+ fi+min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_rad[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_rad[]=
+ sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_ldlm_str&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_rdlm_str
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+boolean drv_radialmode_on; %
+numeric crv_scl; %
+numeric azimuth_ngl; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_bot_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=true;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_bot_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ endfor
+ if not fraction_inference[@]:
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_top_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=false;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_top_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ endfor
+ if not fraction_inference[@]:
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_root (expr idx) (suffix pos_sfx)=
+ save root_idx;
+ numeric root_idx;
+ root_idx:=idx;
+ forever:
+ exitif unknown ccl[root_idx];
+ root_idx:=ccl[root_idx];
+ endfor
+ if idx<>root_idx:
+ drv_message "warning, "&(decimal idx)&" is not a root index"&
+ " (the actual root index is "&(decimal root_idx)&").";
+ fi
+ bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx, root_str;
+ numeric root_idx;
+ string root_str;
+ for root_rnk=0 upto root_num-1:
+ root_idx:=root[root_rnk];
+ if unknown bot_jdg[root_idx]:
+ bot_jdg[root_idx]:=drv_bot_roots;
+ fi
+ if bot_jdg[root_idx]:
+ drv_bot_check[root_idx];
+ else:
+ drv_top_check[root_idx];
+ fi
+ root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx;
+ endfor
+ if root_num>1:
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_lin_build[]=
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ sub_max_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]);
+ endfor
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ sub_min_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln_dp[iln_sty[@]]
+ fi;
+ sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]);
+ endfor
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_max_x:=nfr_max_x[l_rmost];
+ r_min_x:=nfr_min_x[r_lmost];
+ min_skp[0]:=r_min_x-l_max_x;
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_max_x:=max (l_max_x, nfr_max_x[l_rmost]);
+ r_min_x:=min (r_min_x, nfr_min_x[r_lmost]);
+ min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]);
+ endfor
+ min_skp[1]:=r_min_x-l_max_x;
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:= r_prm[l_rmost];
+ l_max_x:=sub_max_x[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_min_x:=sub_min_x[r_lmost];
+ fi
+ min_skp[2]:=r_min_x-l_max_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_min_x[@]:=xpart jdg[@].l;
+ nfr_max_x[@]:=xpart jdg[@].r;
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[l_prm[@]]:
+ sub_min_x[l_prm[@]]
+ else:
+ xpart jdg[l_prm[@]].l
+ fi;
+ r_xref=
+ if boxed[r_prm[@]]:
+ sub_max_x[r_prm[@]]
+ else:
+ xpart jdg[r_prm[@]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ nfr_min_x[@]:=min (xpart jdg[@].l, l_xref);
+ nfr_max_x[@]:=max (xpart jdg[@].r, r_xref);
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=nfr_max_x[@]-nfr_min_x[@]+2*jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(nfr_min_x[@]+nfr_max_x[@])/2;
+ if iln_sty[@]>0:
+ nfr_min_x[@]:=xpart iln[@].l;
+ nfr_max_x[@]:=xpart iln[@].r;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_min_x[@]:=xpart l_ilb[@].l;
+ sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_max_x[@]:=xpart r_ilb[@].r;
+ sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, bot_y, top_y, phm_pct;
+ numeric trg, bot_y, top_y;
+ picture phm_pct;
+ trg:=tgt[@];
+ if bot_jdg[@]:
+ bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=min_y[trg];
+ else:
+ bot_y:=max_y[trg];
+ top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2))
+ drv_styled phm_sty[@];
+ box_init phm[trg] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[trg].c=(xpart jdg[@].c, (top_y+bot_y)/2);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[trg].l);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[trg].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].r=phm[trg].l shifted (-plb_skp[drv_sty], 0);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[trg].l);
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].l=phm[trg].r shifted ( plb_skp[drv_sty], 0);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[trg].r);
+ fi
+ fi
+ %
+ % sub_min_x & sub_max_x
+ %
+ sub_min_x[@]:=nfr_min_x[@];
+ sub_max_x[@]:=nfr_max_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]);
+ sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save miny, maxy;
+ numeric miny, maxy;
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (maxy-miny));
+ l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ sub_min_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (maxy-miny));
+ r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ sub_max_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_min_x[idx]:=sub_min_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_max_x[idx]:=sub_max_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_rad_build[]=
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ sbj[@][sbj_rnk].rad=jdg[@].rad;
+ sbj[@][sbj_rnk].org=jdg[@].org;
+ endfor
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ iln[@].rad=jdg[@].rad-den_dp;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad+jdg[@].dp;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad+jdg[@].hg
+ else:
+ iln[@].rad+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor
+ else:
+ iln[@].rad=jdg[@].rad+num_hg;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad-jdg[@].hg;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad-jdg[@].dp
+ else:
+ iln[@].rad-iln_dp[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].rad=iln[@].rad;
+ l_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].rad=iln[@].rad;
+ r_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad;
+ numeric trg, src_rad, tgt_rad;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm[trg].rad=(src_rad+tgt_rad)/2;
+ phm[trg].org=jdg[@].org;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].rad=phm[trg].rad;
+ l_plb[trg].org=phm[trg].org;
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].rad=phm[trg].rad;
+ r_plb[trg].org=phm[trg].org;
+ fi
+ fi
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save minr, maxr;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ l_dlm[@].rad=(minr+maxr)/2;
+ l_dlb[@].rad=l_dlm[@].rad;
+ l_dlb[@].org=l_dlm[@].org=jdg[@].org;
+ fi
+ if known r_dlb[@]:
+ r_dlm[@].rad=(minr+maxr)/2;
+ r_dlb[@].rad=r_dlm[@].rad;
+ r_dlb[@].org=r_dlm[@].org=jdg[@].org;
+ fi
+ fi
+enddef;
+
+vardef drv_ngl_build[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_ngl_build[prm[@][prm_rnk]];
+ endfor
+ save tnum;
+ numeric tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ %
+ % judgment arc
+ %
+ save jdg_pct, jdg_ngl;
+ picture jdg_pct;
+ numeric jdg_ngl;
+ jdg_pct:=nullpicture;
+ jdg_ngl:=0;
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ arc_init sbj[@][sbj_rnk]
+ (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum,
+ arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl;
+ jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng;
+ endfor
+ arc_init jdg[@] (jdg_pct, jdg_ngl);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost;
+ pair l_rmost_ppt, r_lmost_ppt, ppt_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_rmost_ppt:=nfr_rmost_ppt[l_rmost];
+ r_lmost_ppt:=nfr_lmost_ppt[r_lmost];
+ ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum;
+ r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum;
+ ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum;
+ endfor
+ ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:=r_prm[l_rmost];
+ l_rmost_ppt:=sub_rmost_ppt[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_lmost_ppt:=sub_lmost_ppt[r_lmost];
+ fi
+ ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if jct_sty[@]<3:
+ (ngl_part ppt_skp[jct_sty[@]])=
+ arc_angle(rad_part ppt_skp[jct_sty[@]],
+ prm_skp_scl*prm_skp[drv_sty]) tnum;
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng);
+ nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng);
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_ngl_ref, r_ngl_ref;
+ numeric l_ngl_ref, r_ngl_ref;
+ l_ngl_ref=
+ if boxed[l_prm[@]]:
+ ngl_part sub_lmost_ppt[l_prm[@]]
+ else:
+ jdg[l_prm[@]].lng
+ fi;
+ r_ngl_ref=
+ if boxed[r_prm[@]]:
+ ngl_part sub_rmost_ppt[r_prm[@]]
+ else:
+ jdg[r_prm[@]].rng
+ fi;
+ if alg_sty[@]="l":
+ jdg[@].lng=l_ngl_ref;
+ elseif alg_sty[@]="c":
+ jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2;
+ elseif alg_sty[@]="r":
+ jdg[@].rng=r_ngl_ref;
+ fi
+ nfr_lmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref));
+ nfr_rmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref));
+ fi
+ %
+ % inference line
+ %
+ save iln_ngl;
+ numeric iln_ngl;
+ iln_ngl:=2*(arc_angle(iln[@].rad,
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum)
+ +(ngl_part nfr_rmost_ppt[@])
+ -(ngl_part nfr_lmost_ppt[@]);
+ arc_init iln[@]
+ ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl);
+ iln[@].hg=iln_hg[iln_sty[@]];
+ iln[@].dp=iln_dp[iln_sty[@]];
+ iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2;
+ if iln_sty[@]>0:
+ nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng);
+ nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng);
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ arc_init l_ilb[@](
+ text_arc (l_ilb[@], l_ilb[@].rad) tnum,
+ arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum);
+ l_ilb[@].rng=iln[@].lng
+ -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng);
+ fi
+ if known r_ilb[@]:
+ arc_init r_ilb[@](
+ text_arc (r_ilb[@], r_ilb[@].rad) tnum,
+ arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum);
+ r_ilb[@].lng=iln[@].rng
+ +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad, phm_pct;
+ numeric trg, src_rad, tgt_rad;
+ picture phm_pct;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2))
+ drv_styled phm_sty[@];
+ arc_init phm[trg] (
+ phm_pct
+ rotated (tnum*90+arc_angle (phm[trg].rad, (width phm_pct)/2) tnum)
+ shifted ((dir 0) scaled phm[trg].rad),
+ arc_angle (phm[trg].rad, width phm_pct) tnum);
+ phm[trg].cng=jdg[@].cng;
+ nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@],
+ (phm[trg].rad, phm[trg].lng)) tnum;
+ nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@],
+ (phm[trg].rad, phm[trg].rng)) tnum;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ arc_init l_plb[trg](
+ text_arc (l_plb[trg], l_plb[trg].rad) tnum,
+ arc_angle (l_plb[trg].rad, width l_plb[trg]) tnum);
+ l_plb[trg].rng=phm[trg].lng
+ -arc_angle (l_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=
+ lmost_ppt(nfr_lmost_ppt[@], (l_plb[trg].rad, l_plb[trg].lng)) tnum;
+ fi
+ if known r_plb[trg]:
+ arc_init r_plb[trg](
+ text_arc (r_plb[trg], r_plb[trg].rad) tnum,
+ arc_angle (r_plb[trg].rad, width r_plb[trg]) tnum);
+ r_plb[trg].lng=phm[trg].rng
+ +arc_angle (r_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=
+ rmost_ppt(nfr_rmost_ppt[@], (r_plb[trg].rad, r_plb[trg].rng)) tnum;
+ fi
+ fi
+ %
+ % sub_lmost_ppt & sub_rmost_ppt
+ %
+ sub_lmost_ppt[@]:=nfr_lmost_ppt[@];
+ sub_rmost_ppt[@]:=nfr_rmost_ppt[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_lmost_ppt[@]:=
+ lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum;
+ sub_rmost_ppt[@]:=
+ rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum;
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save dlm_pct, minr, maxr;
+ picture dlm_pct;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ dlm_pct:=delim l (maxr-minr);
+ arc_init l_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled l_dlm[@].rad),
+ arc_angle (l_dlm[@].rad, width dlm_pct) tnum);
+ l_dlm[@].rng=ngl_part sub_lmost_ppt[@];
+ arc_init l_dlb[@](
+ text_arc (l_dlb[@], l_dlb[@].rad) tnum,
+ arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum);
+ l_dlb[@].rng=l_dlm[@].lng;
+ sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng);
+ fi
+ if known r_dlb[@]:
+ dlm_pct:=delim r (maxr-minr);
+ arc_init r_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled r_dlm[@].rad),
+ arc_angle (r_dlm[@].rad, width dlm_pct) tnum);
+ r_dlm[@].lng=ngl_part sub_rmost_ppt[@];
+ arc_init r_dlb[@](
+ text_arc (r_dlb[@], r_dlb[@].rad) tnum,
+ arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum);
+ r_dlb[@].lng=r_dlm[@].rng;
+ sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng);
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_lmost_ppt[idx]:=sub_lmost_ppt[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_rmost_ppt[idx]:=sub_rmost_ppt[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_box_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_box_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_arc_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_arc_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ arc_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ arc_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_checked:
+ drv_check;
+ fi
+ save root_idx, tnum;
+ numeric root_idx, tnum;
+ %
+ % first root
+ %
+ root_idx:=root[0];
+ if drv_radialmode_on:
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ if unknown jdg[root_idx].cng:
+ jdg[root_idx].cng=-tnum*azimuth_ngl;
+ fi
+ if unknown jdg[root_idx].org:
+ %
+ % default math axis
+ %
+ jdg[root_idx].org=
+ (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+
+ if drv_axis_ref="iln":
+ iln[root_idx].rad
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].rad
+ fi);
+ fi
+ drv_arc_freeze[root_idx];
+ else:
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ xpart jdg[root_idx].c=0;
+ fi
+ if unknown ypart jdg[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ ypart iln[root_idx].c=axis_hg[drv_sty];
+ else: % drv_axis_ref="jdg"
+ ypart jdg[root_idx].c=axis_hg[drv_sty];
+ fi
+ fi
+ drv_box_freeze[root_idx];
+ fi
+ %
+ % other roots
+ %
+ if drv_radialmode_on:
+ save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]];
+ l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]];
+ r_lmost_rad:=rad_part sub_lmost_ppt[root_idx];
+ r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx];
+ if unknown jdg[root_idx].cng:
+ r_lmost_ngl=l_rmost_ngl+
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ arc_angle (min (r_lmost_rad, l_rmost_rad),
+ prm_skp_scl*prm_skp[drv_sty]) tnum
+ else:
+ 180
+ fi;
+ fi
+ if unknown jdg[root_idx].org:
+ jdg[root_idx].org=
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ jdg[root[root_rnk-1]].org
+ else:
+ (dir l_rmost_ngl)
+ scaled jdg[root[root_rnk-1]].rad
+ shifted jdg[root[root_rnk-1]].org
+ shifted ((dir (l_rmost_ngl-tnum*90))
+ scaled (prm_skp_scl*prm_skp[drv_sty]))
+ shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad)
+ fi;
+ fi
+ drv_arc_freeze[root_idx];
+ endfor
+ else:
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]]
+ +prm_skp_scl*prm_skp[drv_sty];
+ fi
+ if unknown ypart jdg[root_idx].c:
+ ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c;
+ fi
+ drv_box_freeze[root_idx];
+ endfor
+ fi
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_rnk=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_rnk]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_rnk]);
+ else:
+ drv_tree_addto pct (root[root_rnk]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if drv_radialmode_on:
+ save l_ngl, r_ngl, tnum;
+ numeric l_ngl, r_ngl, tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ l_ngl:=
+ if known l_dlm[@].rng:
+ l_dlm[@].rng-arc_angle
+ (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_lmost_ppt[@])-arc_angle
+ (rad_part sub_lmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ r_ngl:=
+ if known r_dlm[@].lng:
+ r_dlm[@].lng+arc_angle
+ (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_rmost_ppt[@])+arc_angle
+ (rad_part sub_rmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ (circ_path(max_rad[@], r_ngl-l_ngl) tnum--
+ reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum--
+ cycle) rotated l_ngl shifted jdg[@].org
+ else:
+ save minx, maxx, miny, maxy;
+ numeric minx, maxx, maxy, miny;
+ minx:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ sub_min_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ maxx:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ sub_max_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ (minx, miny)--
+ (minx, maxy)--
+ (maxx, maxy)--
+ (maxx, miny)--
+ cycle
+ fi
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_bot (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ false
+ elseif pos_str="b":
+ true
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min (idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ elseif scl_str="crv":
+ crv_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg,"&
+ " ilb and"&
+ " crv.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_ldlm_str:=dlm_str;
+ else:
+ drv_rdlm_str:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+vardef drv_labels_mode (suffix typ_sfx, status_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_ilb_on:=check_mode_on (status_sfx, drv_ilb_on);
+ elseif typ_str="dlb":
+ drv_dlb_on:=check_mode_on (status_sfx, drv_dlb_on);
+ elseif typ_str="plb":
+ drv_plb_on:=check_mode_on (status_sfx, drv_plb_on);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_radial_mode suffix status_sfx=
+ drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on);
+enddef;
+
+vardef drv_azimuth expr ngl=
+ azimuth_ngl:=ngl;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+drv_labels_mode (ilb, on);
+drv_labels_mode (dlb, on);
+drv_labels_mode (plb, on);
+
+drv_radial_mode off;
+drv_scale (crv, 1);
+drv_azimuth 90;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/graphics/metapost/contrib/macros/drv/sample/coq-sample.mp b/graphics/metapost/contrib/macros/drv/sample/coq-sample.mp
new file mode 100644
index 0000000000..131d7eee26
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/sample/coq-sample.mp
@@ -0,0 +1,101 @@
+input drv;
+
+verbatimtex%&latex
+
+% Any piece of code related to font selection in the preambule of
+% `coq-sample.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[8pt]{beamer}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[varg]{txfonts}
+\newcommand{\var}{\text{Var}}
+\newcommand{\app}{\text{App}}
+\newcommand{\lam}{\text{Lam}}
+\begin{document}
+etex;
+
+drv_font_size "\small";
+drv_labels_position l;
+
+for index=0 upto 6:
+ beginfig(index)
+ jgm 0 "\vdash", "(P\to(Q\to R))\to(Q\to(P\to R))";
+ jgm 1 "P\to(Q\to R)\vdash", "Q\to(P\to R)";
+ jgm 2 "P\to(Q\to R), Q\vdash", "P\to R";
+ jgm 3 "P\to(Q\to R), Q, P\vdash", "R";
+ jgm 4 "P\to(Q\to R), Q, P\vdash", "Q\to R";
+ jgm 5 "P\to(Q\to R), Q, P\vdash", "P\to(Q\to R)";
+ jgm 6 "P\to(Q\to R), Q, P\vdash", "P";
+ jgm 7 "P\to(Q\to R), Q, P\vdash", "Q";
+ nfr 0 (1) ("\lam", 1);
+ nfr 1 (2) ("\lam", 1);
+ nfr 2 (3) ("\lam", 1);
+ nfr 3 (4, 7) ("\app", 1);
+ nfr 4 (5, 6) ("\app", 1);
+ nfr 5 () ("\var", 1);
+ nfr 6 () ("\var", 1);
+ nfr 7 () ("\var", 1);
+ setbounds currentpicture to drv_bbox 0;
+ % All the pictures will have the same bounding box
+ % as the full derivation tree.
+ draw sbj[0][0];
+ if index=0:
+ draw sbj[0][1] withcolor blue;
+ else:
+ draw sbj[0][1];
+ draw iln[0];
+ draw l_ilb[0];
+ draw sbj[1][0];
+ if index=1:
+ draw sbj[1][1] withcolor blue;
+ else:
+ draw sbj[1][1];
+ draw iln[1];
+ draw l_ilb[1];
+ draw sbj[2][0];
+ if index=2:
+ draw sbj[2][1] withcolor blue;
+ else:
+ draw sbj[2][1];
+ draw iln[2];
+ draw l_ilb[2];
+ draw sbj[3][0];
+ if index=3:
+ draw sbj[3][1] withcolor blue;
+ else:
+ draw sbj[3][1];
+ draw iln[3];
+ draw l_ilb[3];
+ draw jdg[4];
+ draw iln[4];
+ draw l_ilb[4];
+ draw jdg[5];
+ draw iln[5];
+ draw l_ilb[5];
+ draw sbj[6][0];
+ draw sbj[7][0];
+ if index=4:
+ draw sbj[6][1] withcolor blue;
+ draw sbj[7][1] withcolor blue;
+ else:
+ draw sbj[6][1];
+ draw iln[6];
+ draw l_ilb[6];
+ if index=5:
+ draw sbj[7][1] withcolor blue;
+ else:
+ draw sbj[7][1];
+ draw iln[7];
+ draw l_ilb[7];
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ endfig;
+endfor
+
+end
diff --git a/graphics/metapost/contrib/macros/drv/sample/coq-sample.tex b/graphics/metapost/contrib/macros/drv/sample/coq-sample.tex
new file mode 100644
index 0000000000..d572ef3e7b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/sample/coq-sample.tex
@@ -0,0 +1,258 @@
+% Any piece of code related to font selection in the following preambule
+% (document class, font package, font selection commands ...) should be
+% reported in `coq-sample.mp'.
+
+\documentclass[8pt]{beamer}
+\usetheme{Warsaw}
+
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[varg]{txfonts}
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\title{Une construction de preuve en logique minimale}
+\institute{INF462 -- Master S\&T Informatique -- Bordeaux 1}
+\date{}
+
+\begin{document}
+
+\begin{frame}
+\titlepage
+\end{frame}
+
+\ttfamily
+\itshape
+\small
+
+\begin{frame}
+\begin{block}{}
+%
+% coq-tex output
+%
+\begin{overlayarea}{\textwidth}{.5\textheight}
+\only<1>{%
+ \textup{Coq~{<}~Variables~P~Q~R~:~Prop.}\\
+ P~is~assumed\\
+ Q~is~assumed\\
+ R~is~assumed\\
+ \medskip
+ \textup{%
+ Coq~{<}~Lemma~imp\_perm~:~(P~-{>}~(Q~-{>}~R))~-{>}~(Q~-{>}~(P~-{>}~R)).}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~============================\\
+ ~~~\textcolor{blue}{(P~-{>}~Q~-{>}~R)~-{>}~Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~Proof.}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<2>{%
+ \textup{Coq~{<}~Variables~P~Q~R~:~Prop.}\\
+ P~is~assumed\\
+ Q~is~assumed\\
+ R~is~assumed\\
+ \medskip
+ \textup{%
+ Coq~{<}~Lemma~imp\_perm~:~(P~-{>}~(Q~-{>}~R))~-{>}~(Q~-{>}~(P~-{>}~R)).}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~============================\\
+ ~~~\textcolor{blue}{(P~-{>}~Q~-{>}~R)~-{>}~Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~Proof.}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~H.}}
+\only<3>{%
+ \textup{Coq~{<}~~~intro~H.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<4>{%
+ \textup{Coq~{<}~~~intro~H.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~q.}}
+\only<5>{%
+ \textup{Coq~{<}~~~intro~q.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<6>{%
+ \textup{Coq~{<}~~~intro~q.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~p.}}
+\only<7>{%
+ \textup{Coq~{<}~~~intro~p.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<8>{%
+ \textup{Coq~{<}~~~intro~p.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{R}\\
+ \medskip
+ \textup{Coq~{<}~~~apply~H.}}
+\only<9>{%
+ \textup{Coq~{<}~~~apply~H.}\\
+ 2~subgoals\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P}\\
+ subgoal~2~is:\\
+ ~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<10>{%
+ \textup{Coq~{<}~~~apply~H.}\\
+ 2~subgoals\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P}\\
+ subgoal~2~is:\\
+ ~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}~~~assumption.}}
+\only<11>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<12>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}~~~assumption.}}
+\only<13>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ Proof~completed.\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<14>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ Proof~completed.\\
+ \medskip
+ \textup{Coq~{<}~Qed.}}
+\only<15>{%
+ \textup{Coq~{<}~Qed.}\\
+ intro~H.\\
+ intro~q.\\
+ intro~p.\\
+ apply~H.\\
+ assumption.\\
+ assumption.\\
+ imp\_perm~is~defined\\
+ \medskip
+ \textup{Coq~{<}~}}
+\end{overlayarea}
+\end{block}
+\begin{block}{}
+%
+% derivation tree
+%
+\begin{overprint}
+\begin{gather*}
+\only<1-2> {\drv{coq-sample.0}}
+\only<3-4> {\drv{coq-sample.1}}
+\only<5-6> {\drv{coq-sample.2}}
+\only<7-8> {\drv{coq-sample.3}}
+\only<9-10> {\drv{coq-sample.4}}
+\only<11-12> {\drv{coq-sample.5}}
+\only<13-15> {\drv{coq-sample.6}}
+\end{gather*}
+\end{overprint}
+\end{block}
+\end{frame}
+\end{document}
diff --git a/graphics/metapost/contrib/macros/drv/sample/drv.mp b/graphics/metapost/contrib/macros/drv/sample/drv.mp
new file mode 100644
index 0000000000..09cd16a41d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/sample/drv.mp
@@ -0,0 +1,3033 @@
+%% drv 0.97
+%% Copyright 2011 Laurent M\'ehats
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+newinternal drv_version;
+drv_version:=0.97;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, crv, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% crv nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "("
+% "["
+% "\lbrace"
+% "\langle"
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_labels_mode (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> status identifier (on or off)
+%
+% drv_verbatimtex <str>
+% <str> LaTeX material
+%
+% drv_radial_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_azimuth <float>
+% <float> azimuth degree
+%
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_root (<nat>, <id>)
+% <nat> root index
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+drv_message "version "&decimal drv_version&".";
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_find_verbatimtex=
+ save readfrom_str;
+ string readfrom_str;
+ forever:
+ readfrom_str:=readfrom jobname;
+ exitif (readfrom_str="verbatimtex%&latex")
+ or (readfrom_str="verbatimtex %&latex")
+ or (readfrom_str=EOF);
+ endfor
+ if readfrom_str="verbatimtex %&latex":
+ drv_message "warning, "&ditto&"verbatimtex %&latex"&ditto&
+ " is deprecated, you should use "&ditto&"verbatimtex%&latex"&ditto&
+ " instead.";
+ fi
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain "&
+ ditto&"verbatimtex%&latex"&ditto&" on a single line.");
+ drv_errmessage (ditto&"verbatimtex%&latex"&ditto&" is missing");
+ fi
+enddef;
+
+vardef drv_find (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex%&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_find_verbatimtex;
+ drv_find ("\begin{document}", tex_preamble_str[0]);
+ drv_find ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex%&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_rnk;
+tex_pct_rnk:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_rnk)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_rnk]:
+ tex_pct[tex_pct_rnk]
+ else:
+ nullpicture
+ fi;
+ tex_pct_rnk:=tex_pct_rnk+1;
+ pct
+enddef;
+
+vardef drv_verbatimtex expr tex_str=
+ write char(10)&
+ "% drv_verbatimtex"&char(10)&char(10)&
+ "verbatimtex"&char(10)&
+ tex_str&char(10)&
+ "etex;"
+ to delayed_tex_file;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+%vardef drv_fontdimen[] expr font=
+% save dim_pct;
+% picture dim_pct;
+% dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+% width dim_pct
+%enddef;
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct, dim_str;
+ picture dim_pct;
+ string dim_str;
+ dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}");
+ dim_str:="0";
+ for tok within dim_pct:
+ dim_str:=dim_str&(textpart tok);
+ endfor
+ scantokens dim_str
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,"; % thinspace
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\:"; % medspace
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;"; % thickspace
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ drv_arc str;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-arcs
+%
+
+vardef drv_arc text STR=
+ for str=STR:
+ expandafter numeric scantokens str.rad;
+ expandafter numeric scantokens str.lng;
+ expandafter numeric scantokens str.cng;
+ expandafter numeric scantokens str.rng;
+ expandafter pair scantokens str.org;
+ endfor
+enddef;
+
+vardef arc_init @# (expr pct, ngl)=
+ @#:=pct;
+ @#.rng-@#.lng=ngl;
+ @#.cng=(@#.lng+@#.rng)/2;
+enddef;
+
+vardef arc_freeze @#=
+ @#:=@# rotated @#.lng shifted @#.org;
+ @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org;
+ @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org;
+ @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Polar coordinates, angles & text torsion
+%
+
+vardef rad_part expr ppt=
+ xpart ppt
+enddef;
+
+vardef ngl_part expr ppt=
+ ypart ppt
+enddef;
+
+vardef minrad (expr ppt_a, ppt_b)=
+ min (rad_part ppt_a, rad_part ppt_b)
+enddef;
+
+% "tnum" (turning number) argument:
+% -1: clockwise
+% 1: counterclockwise
+
+vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef arc_angle (expr rad, arc_len) expr tnum=
+ if rad>0:
+ save pth;
+ path pth;
+ pth:=fullcircle scaled (2*rad);
+ tnum*(angle point (arctime arc_len of pth) of pth)
+ else:
+ 0
+ fi
+enddef;
+
+vardef circ_path (expr rad, ngl) expr tnum=
+ save pth;
+ path pth;
+ pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad);
+ subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth
+enddef;
+
+vardef text_arc (expr pct, rad) expr tnum=
+ save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct;
+ picture arc_pct, chr_pct;
+ numeric tok_ngl, hlf_wd;
+ string tok_str;
+ arc_pct:=nullpicture;
+ for tok within pct:
+ if textual tok:
+ transform tok_trn;
+ tok_str:=textpart tok;
+ (0, 0) transformed tok_trn=(0, 0);
+ (0, 1) transformed tok_trn=(xypart tok, yypart tok);
+ (1, 0) transformed tok_trn=(xxpart tok, yxpart tok);
+ tok_ngl:=arc_angle (rad, xpart tok) tnum;
+ for chr_rnk=0 upto (length tok_str-1):
+ chr_pct:=
+ substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok)
+ transformed tok_trn;
+ hlf_wd:=(width chr_pct)/2;
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ addto arc_pct also chr_pct
+ shifted (-hlf_wd, 0)
+ rotated (tok_ngl+tnum*90)
+ shifted (dir tok_ngl scaled (rad-tnum*(ypart tok)));
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ endfor
+ elseif stroked tok:
+ path pth;
+ pair src, tgt;
+ numeric src_ngl, tgt_ngl;
+ pth:=pathpart tok;
+ src:=point 0 of pth;
+ tgt:=point length pth of pth;
+ src_ngl:=arc_angle (rad, xpart src) tnum;
+ tgt_ngl:=arc_angle (rad, xpart tgt) tnum;
+ interim linecap:=butt;
+ addto arc_pct doublepath
+ if xpart src<>xpart tgt: % horizontal rule
+ (circ_path (rad-tnum*(ypart src), tgt_ngl-src_ngl) tnum)
+ rotated src_ngl
+ else: % vertical rule
+ pth shifted -src rotated (src_ngl+tnum*90)
+ shifted (dir src_ngl scaled (rad-tnum*(ypart src)))
+ fi withpen penpart tok;
+ fi
+ endfor
+ arc_pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ % bot_jdg[i] boolean
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ boolean bot_jdg[];
+ %
+ % nfr_min_x[i] inference minimal x
+ % nfr_lmost_ppt[i] inference leftmost polar point
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % nfr_max_x[i] inference maximal x
+ % nfr_rmost_ppt[i] inference rightmost polar point
+ %
+ numeric nfr_min_x[];
+ pair nfr_lmost_ppt[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric nfr_max_x[];
+ pair nfr_rmost_ppt[];
+ %
+ % Sub-trees
+ %
+ % sub_min_x[i] sub-tree minimal x
+ % sub_lmost_ppt[i] sub-tree leftmost polar point
+ % sub_max_x[i] sub-tree maximal x
+ % sub_rmost_ppt[i] sub-tree rightmost polar point
+ % sub_min_y[i] sub-tree minimal y
+ % sub_min_rad[i] sub-tree minimal radius
+ % sub_max_y[i] sub-tree maximal y
+ % sub_max_rad[i] sub-tree maximal radius
+ % boxed[i] boolean
+ %
+ numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[];
+ pair sub_lmost_ppt[], sub_rmost_ppt[];
+ numeric sub_min_rad[], sub_max_rad[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_checked boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=mth_tex[jdg_sty[drv_sty]] sub;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l; % irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=jdg_wd+width sbj_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].l=sbj[@][0].l; % irrelevant if sbj_num=0
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+%
+% 1. Global parameters
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_ilb_on; % inference labels on
+boolean drv_dlb_on; % delimiter labels on
+boolean drv_plb_on; % phantom steps labels on
+
+%
+% 2. Macros
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr str=
+ if str<>"":
+ box_init @# (mth_tex[@] str);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk, root_rnk;
+ numeric prm_rnk, root_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ root_rnk:=0;
+ forever:
+ exitif root[root_rnk]=prm_idx;
+ root_rnk:=root_rnk+1;
+ endfor
+ forever:
+ exitif root_rnk=root_num-1;
+ root[root_rnk]:=root[root_rnk+1];
+ root_rnk:=root_rnk+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ if drv_ilb_on:
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ fi
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ if drv_dlb_on:
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ else:
+ if ldlb<>"":
+ box_init l_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ if rdlb<>"":
+ box_init r_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ fi
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save prm_idx, pth_sty, phm_jdg;
+ numeric prm_idx, pth_sty;
+ picture phm_jdg;
+ pth_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[pth_sty]-iln_dp[pth_sty], 0)--cycle;
+ prm_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (prm_idx) ("", "", "", "", 0, a_sty, 0);
+ prm_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=pth_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ if drv_plb_on:
+ opt_init[plb_sty[drv_sty]] l_plb[@] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[@] rplb;
+ fi
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ string fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ string snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ string @#.l;
+ string @#.r;
+ if lbl_num=0:
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_ldlm_str; % left delimiter LaTeX code
+string drv_rdlm_str; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef min_y[]=
+ if bot_jdg[@]:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_y[]=
+ if bot_jdg[@]:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi
+enddef;
+
+vardef min_rad[]=
+ if known ccl[@]:
+ if bot_jdg[@]:
+ jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ else:
+ jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])]
+ fi+min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_rad[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_rad[]=
+ sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_ldlm_str&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_rdlm_str
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+boolean drv_radialmode_on; %
+numeric crv_scl; %
+numeric azimuth_ngl; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_bot_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=true;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_bot_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ endfor
+ if not fraction_inference[@]:
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_top_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=false;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_top_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ endfor
+ if not fraction_inference[@]:
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_root (expr idx) (suffix pos_sfx)=
+ save root_idx;
+ numeric root_idx;
+ root_idx:=idx;
+ forever:
+ exitif unknown ccl[root_idx];
+ root_idx:=ccl[root_idx];
+ endfor
+ if idx<>root_idx:
+ drv_message "warning, "&(decimal idx)&" is not a root index"&
+ " (the actual root index is "&(decimal root_idx)&").";
+ fi
+ bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx, root_str;
+ numeric root_idx;
+ string root_str;
+ for root_rnk=0 upto root_num-1:
+ root_idx:=root[root_rnk];
+ if unknown bot_jdg[root_idx]:
+ bot_jdg[root_idx]:=drv_bot_roots;
+ fi
+ if bot_jdg[root_idx]:
+ drv_bot_check[root_idx];
+ else:
+ drv_top_check[root_idx];
+ fi
+ root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx;
+ endfor
+ if root_num>1:
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_lin_build[]=
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ sub_max_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]);
+ endfor
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ sub_min_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln_dp[iln_sty[@]]
+ fi;
+ sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]);
+ endfor
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_max_x:=nfr_max_x[l_rmost];
+ r_min_x:=nfr_min_x[r_lmost];
+ min_skp[0]:=r_min_x-l_max_x;
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_max_x:=max (l_max_x, nfr_max_x[l_rmost]);
+ r_min_x:=min (r_min_x, nfr_min_x[r_lmost]);
+ min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]);
+ endfor
+ min_skp[1]:=r_min_x-l_max_x;
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:= r_prm[l_rmost];
+ l_max_x:=sub_max_x[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_min_x:=sub_min_x[r_lmost];
+ fi
+ min_skp[2]:=r_min_x-l_max_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_min_x[@]:=xpart jdg[@].l;
+ nfr_max_x[@]:=xpart jdg[@].r;
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[l_prm[@]]:
+ sub_min_x[l_prm[@]]
+ else:
+ xpart jdg[l_prm[@]].l
+ fi;
+ r_xref=
+ if boxed[r_prm[@]]:
+ sub_max_x[r_prm[@]]
+ else:
+ xpart jdg[r_prm[@]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ nfr_min_x[@]:=min (xpart jdg[@].l, l_xref);
+ nfr_max_x[@]:=max (xpart jdg[@].r, r_xref);
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=nfr_max_x[@]-nfr_min_x[@]+2*jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(nfr_min_x[@]+nfr_max_x[@])/2;
+ if iln_sty[@]>0:
+ nfr_min_x[@]:=xpart iln[@].l;
+ nfr_max_x[@]:=xpart iln[@].r;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_min_x[@]:=xpart l_ilb[@].l;
+ sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_max_x[@]:=xpart r_ilb[@].r;
+ sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, bot_y, top_y, phm_pct;
+ numeric trg, bot_y, top_y;
+ picture phm_pct;
+ trg:=tgt[@];
+ if bot_jdg[@]:
+ bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=min_y[trg];
+ else:
+ bot_y:=max_y[trg];
+ top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2))
+ drv_styled phm_sty[@];
+ box_init phm[trg] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[trg].c=(xpart jdg[@].c, (top_y+bot_y)/2);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[trg].l);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[trg].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].r=phm[trg].l shifted (-plb_skp[drv_sty], 0);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[trg].l);
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].l=phm[trg].r shifted ( plb_skp[drv_sty], 0);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[trg].r);
+ fi
+ fi
+ %
+ % sub_min_x & sub_max_x
+ %
+ sub_min_x[@]:=nfr_min_x[@];
+ sub_max_x[@]:=nfr_max_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]);
+ sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save miny, maxy;
+ numeric miny, maxy;
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (maxy-miny));
+ l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ sub_min_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (maxy-miny));
+ r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ sub_max_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_min_x[idx]:=sub_min_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_max_x[idx]:=sub_max_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_rad_build[]=
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ sbj[@][sbj_rnk].rad=jdg[@].rad;
+ sbj[@][sbj_rnk].org=jdg[@].org;
+ endfor
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ iln[@].rad=jdg[@].rad-den_dp;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad+jdg[@].dp;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad+jdg[@].hg
+ else:
+ iln[@].rad+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor
+ else:
+ iln[@].rad=jdg[@].rad+num_hg;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad-jdg[@].hg;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad-jdg[@].dp
+ else:
+ iln[@].rad-iln_dp[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].rad=iln[@].rad;
+ l_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].rad=iln[@].rad;
+ r_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad;
+ numeric trg, src_rad, tgt_rad;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm[trg].rad=(src_rad+tgt_rad)/2;
+ phm[trg].org=jdg[@].org;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].rad=phm[trg].rad;
+ l_plb[trg].org=phm[trg].org;
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].rad=phm[trg].rad;
+ r_plb[trg].org=phm[trg].org;
+ fi
+ fi
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save minr, maxr;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ l_dlm[@].rad=(minr+maxr)/2;
+ l_dlb[@].rad=l_dlm[@].rad;
+ l_dlb[@].org=l_dlm[@].org=jdg[@].org;
+ fi
+ if known r_dlb[@]:
+ r_dlm[@].rad=(minr+maxr)/2;
+ r_dlb[@].rad=r_dlm[@].rad;
+ r_dlb[@].org=r_dlm[@].org=jdg[@].org;
+ fi
+ fi
+enddef;
+
+vardef drv_ngl_build[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_ngl_build[prm[@][prm_rnk]];
+ endfor
+ save tnum;
+ numeric tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ %
+ % judgment arc
+ %
+ save jdg_pct, jdg_ngl;
+ picture jdg_pct;
+ numeric jdg_ngl;
+ jdg_pct:=nullpicture;
+ jdg_ngl:=0;
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ arc_init sbj[@][sbj_rnk]
+ (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum,
+ arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl;
+ jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng;
+ endfor
+ arc_init jdg[@] (jdg_pct, jdg_ngl);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost;
+ pair l_rmost_ppt, r_lmost_ppt, ppt_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_rmost_ppt:=nfr_rmost_ppt[l_rmost];
+ r_lmost_ppt:=nfr_lmost_ppt[r_lmost];
+ ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum;
+ r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum;
+ ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum;
+ endfor
+ ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:=r_prm[l_rmost];
+ l_rmost_ppt:=sub_rmost_ppt[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_lmost_ppt:=sub_lmost_ppt[r_lmost];
+ fi
+ ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if jct_sty[@]<3:
+ (ngl_part ppt_skp[jct_sty[@]])=
+ arc_angle(rad_part ppt_skp[jct_sty[@]],
+ prm_skp_scl*prm_skp[drv_sty]) tnum;
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng);
+ nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng);
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_ngl_ref, r_ngl_ref;
+ numeric l_ngl_ref, r_ngl_ref;
+ l_ngl_ref=
+ if boxed[l_prm[@]]:
+ ngl_part sub_lmost_ppt[l_prm[@]]
+ else:
+ jdg[l_prm[@]].lng
+ fi;
+ r_ngl_ref=
+ if boxed[r_prm[@]]:
+ ngl_part sub_rmost_ppt[r_prm[@]]
+ else:
+ jdg[r_prm[@]].rng
+ fi;
+ if alg_sty[@]="l":
+ jdg[@].lng=l_ngl_ref;
+ elseif alg_sty[@]="c":
+ jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2;
+ elseif alg_sty[@]="r":
+ jdg[@].rng=r_ngl_ref;
+ fi
+ nfr_lmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref));
+ nfr_rmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref));
+ fi
+ %
+ % inference line
+ %
+ save iln_ngl;
+ numeric iln_ngl;
+ iln_ngl:=2*(arc_angle(iln[@].rad,
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum)
+ +(ngl_part nfr_rmost_ppt[@])
+ -(ngl_part nfr_lmost_ppt[@]);
+ arc_init iln[@]
+ ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl);
+ iln[@].hg=iln_hg[iln_sty[@]];
+ iln[@].dp=iln_dp[iln_sty[@]];
+ iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2;
+ if iln_sty[@]>0:
+ nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng);
+ nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng);
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ arc_init l_ilb[@](
+ text_arc (l_ilb[@], l_ilb[@].rad) tnum,
+ arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum);
+ l_ilb[@].rng=iln[@].lng
+ -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng);
+ fi
+ if known r_ilb[@]:
+ arc_init r_ilb[@](
+ text_arc (r_ilb[@], r_ilb[@].rad) tnum,
+ arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum);
+ r_ilb[@].lng=iln[@].rng
+ +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad, phm_pct;
+ numeric trg, src_rad, tgt_rad;
+ picture phm_pct;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2))
+ drv_styled phm_sty[@];
+ arc_init phm[trg] (
+ phm_pct
+ rotated (tnum*90+arc_angle (phm[trg].rad, (width phm_pct)/2) tnum)
+ shifted ((dir 0) scaled phm[trg].rad),
+ arc_angle (phm[trg].rad, width phm_pct) tnum);
+ phm[trg].cng=jdg[@].cng;
+ nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@],
+ (phm[trg].rad, phm[trg].lng)) tnum;
+ nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@],
+ (phm[trg].rad, phm[trg].rng)) tnum;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ arc_init l_plb[trg](
+ text_arc (l_plb[trg], l_plb[trg].rad) tnum,
+ arc_angle (l_plb[trg].rad, width l_plb[trg]) tnum);
+ l_plb[trg].rng=phm[trg].lng
+ -arc_angle (l_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=
+ lmost_ppt(nfr_lmost_ppt[@], (l_plb[trg].rad, l_plb[trg].lng)) tnum;
+ fi
+ if known r_plb[trg]:
+ arc_init r_plb[trg](
+ text_arc (r_plb[trg], r_plb[trg].rad) tnum,
+ arc_angle (r_plb[trg].rad, width r_plb[trg]) tnum);
+ r_plb[trg].lng=phm[trg].rng
+ +arc_angle (r_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=
+ rmost_ppt(nfr_rmost_ppt[@], (r_plb[trg].rad, r_plb[trg].rng)) tnum;
+ fi
+ fi
+ %
+ % sub_lmost_ppt & sub_rmost_ppt
+ %
+ sub_lmost_ppt[@]:=nfr_lmost_ppt[@];
+ sub_rmost_ppt[@]:=nfr_rmost_ppt[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_lmost_ppt[@]:=
+ lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum;
+ sub_rmost_ppt[@]:=
+ rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum;
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save dlm_pct, minr, maxr;
+ picture dlm_pct;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ dlm_pct:=delim l (maxr-minr);
+ arc_init l_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled l_dlm[@].rad),
+ arc_angle (l_dlm[@].rad, width dlm_pct) tnum);
+ l_dlm[@].rng=ngl_part sub_lmost_ppt[@];
+ arc_init l_dlb[@](
+ text_arc (l_dlb[@], l_dlb[@].rad) tnum,
+ arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum);
+ l_dlb[@].rng=l_dlm[@].lng;
+ sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng);
+ fi
+ if known r_dlb[@]:
+ dlm_pct:=delim r (maxr-minr);
+ arc_init r_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled r_dlm[@].rad),
+ arc_angle (r_dlm[@].rad, width dlm_pct) tnum);
+ r_dlm[@].lng=ngl_part sub_rmost_ppt[@];
+ arc_init r_dlb[@](
+ text_arc (r_dlb[@], r_dlb[@].rad) tnum,
+ arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum);
+ r_dlb[@].lng=r_dlm[@].rng;
+ sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng);
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_lmost_ppt[idx]:=sub_lmost_ppt[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_rmost_ppt[idx]:=sub_rmost_ppt[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_box_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_box_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_arc_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_arc_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ arc_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ arc_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_checked:
+ drv_check;
+ fi
+ save root_idx, tnum;
+ numeric root_idx, tnum;
+ %
+ % first root
+ %
+ root_idx:=root[0];
+ if drv_radialmode_on:
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ if unknown jdg[root_idx].cng:
+ jdg[root_idx].cng=-tnum*azimuth_ngl;
+ fi
+ if unknown jdg[root_idx].org:
+ %
+ % default math axis
+ %
+ jdg[root_idx].org=
+ (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+
+ if drv_axis_ref="iln":
+ iln[root_idx].rad
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].rad
+ fi);
+ fi
+ drv_arc_freeze[root_idx];
+ else:
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ xpart jdg[root_idx].c=0;
+ fi
+ if unknown ypart jdg[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ ypart iln[root_idx].c=axis_hg[drv_sty];
+ else: % drv_axis_ref="jdg"
+ ypart jdg[root_idx].c=axis_hg[drv_sty];
+ fi
+ fi
+ drv_box_freeze[root_idx];
+ fi
+ %
+ % other roots
+ %
+ if drv_radialmode_on:
+ save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]];
+ l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]];
+ r_lmost_rad:=rad_part sub_lmost_ppt[root_idx];
+ r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx];
+ if unknown jdg[root_idx].cng:
+ r_lmost_ngl=l_rmost_ngl+
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ arc_angle (min (r_lmost_rad, l_rmost_rad),
+ prm_skp_scl*prm_skp[drv_sty]) tnum
+ else:
+ 180
+ fi;
+ fi
+ if unknown jdg[root_idx].org:
+ jdg[root_idx].org=
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ jdg[root[root_rnk-1]].org
+ else:
+ (dir l_rmost_ngl)
+ scaled jdg[root[root_rnk-1]].rad
+ shifted jdg[root[root_rnk-1]].org
+ shifted ((dir (l_rmost_ngl-tnum*90))
+ scaled (prm_skp_scl*prm_skp[drv_sty]))
+ shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad)
+ fi;
+ fi
+ drv_arc_freeze[root_idx];
+ endfor
+ else:
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]]
+ +prm_skp_scl*prm_skp[drv_sty];
+ fi
+ if unknown ypart jdg[root_idx].c:
+ ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c;
+ fi
+ drv_box_freeze[root_idx];
+ endfor
+ fi
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_rnk=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_rnk]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_rnk]);
+ else:
+ drv_tree_addto pct (root[root_rnk]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if drv_radialmode_on:
+ save l_ngl, r_ngl, tnum;
+ numeric l_ngl, r_ngl, tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ l_ngl:=
+ if known l_dlm[@].rng:
+ l_dlm[@].rng-arc_angle
+ (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_lmost_ppt[@])-arc_angle
+ (rad_part sub_lmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ r_ngl:=
+ if known r_dlm[@].lng:
+ r_dlm[@].lng+arc_angle
+ (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_rmost_ppt[@])+arc_angle
+ (rad_part sub_rmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ (circ_path(max_rad[@], r_ngl-l_ngl) tnum--
+ reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum--
+ cycle) rotated l_ngl shifted jdg[@].org
+ else:
+ save minx, maxx, miny, maxy;
+ numeric minx, maxx, maxy, miny;
+ minx:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ sub_min_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ maxx:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ sub_max_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ (minx, miny)--
+ (minx, maxy)--
+ (maxx, maxy)--
+ (maxx, miny)--
+ cycle
+ fi
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_bot (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ false
+ elseif pos_str="b":
+ true
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min (idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ elseif scl_str="crv":
+ crv_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg,"&
+ " ilb and"&
+ " crv.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_ldlm_str:=dlm_str;
+ else:
+ drv_rdlm_str:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+vardef drv_labels_mode (suffix typ_sfx, status_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_ilb_on:=check_mode_on (status_sfx, drv_ilb_on);
+ elseif typ_str="dlb":
+ drv_dlb_on:=check_mode_on (status_sfx, drv_dlb_on);
+ elseif typ_str="plb":
+ drv_plb_on:=check_mode_on (status_sfx, drv_plb_on);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_radial_mode suffix status_sfx=
+ drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on);
+enddef;
+
+vardef drv_azimuth expr ngl=
+ azimuth_ngl:=ngl;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+drv_labels_mode (ilb, on);
+drv_labels_mode (dlb, on);
+drv_labels_mode (plb, on);
+
+drv_radial_mode off;
+drv_scale (crv, 1);
+drv_azimuth 90;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/graphics/metapost/contrib/macros/drv/sample/makefile b/graphics/metapost/contrib/macros/drv/sample/makefile
new file mode 100644
index 0000000000..18f01e9eec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/sample/makefile
@@ -0,0 +1,50 @@
+MAIN= coq-sample
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+ pdfopt $(MAIN).pdf $(MAIN)-opt.pdf
+ mv $(MAIN)-opt.pdf $(MAIN).pdf
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ latex $(MAIN)
+ dvips -t unknown $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips -t unknown $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).snm
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.nav
+ $(RM) $(MAIN)-proof.out
+ $(RM) $(MAIN)-proof.snm
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/graphics/metapost/contrib/macros/drv/sample/readme.sh b/graphics/metapost/contrib/macros/drv/sample/readme.sh
new file mode 100755
index 0000000000..65e275906e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/sample/readme.sh
@@ -0,0 +1,16 @@
+# In order to compile the sources and to get a pdf file,
+# use `make' or `./readme.sh' or:
+
+# 1. run metapost TWICE:
+mpost coq-sample.mp
+mpost coq-sample.mp
+
+# 2. run latex (twice):
+latex coq-sample.tex
+latex coq-sample.tex
+
+# 3. run dvips (once):
+dvips coq-sample.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf coq-sample.ps
diff --git a/graphics/metapost/contrib/macros/drv/template/drv.mp b/graphics/metapost/contrib/macros/drv/template/drv.mp
new file mode 100644
index 0000000000..09cd16a41d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/template/drv.mp
@@ -0,0 +1,3033 @@
+%% drv 0.97
+%% Copyright 2011 Laurent M\'ehats
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+newinternal drv_version;
+drv_version:=0.97;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, crv, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% crv nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "("
+% "["
+% "\lbrace"
+% "\langle"
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+%
+% drv_labels_mode (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> status identifier (on or off)
+%
+% drv_verbatimtex <str>
+% <str> LaTeX material
+%
+% drv_radial_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_azimuth <float>
+% <float> azimuth degree
+%
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_root (<nat>, <id>)
+% <nat> root index
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+drv_message "version "&decimal drv_version&".";
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_find_verbatimtex=
+ save readfrom_str;
+ string readfrom_str;
+ forever:
+ readfrom_str:=readfrom jobname;
+ exitif (readfrom_str="verbatimtex%&latex")
+ or (readfrom_str="verbatimtex %&latex")
+ or (readfrom_str=EOF);
+ endfor
+ if readfrom_str="verbatimtex %&latex":
+ drv_message "warning, "&ditto&"verbatimtex %&latex"&ditto&
+ " is deprecated, you should use "&ditto&"verbatimtex%&latex"&ditto&
+ " instead.";
+ fi
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain "&
+ ditto&"verbatimtex%&latex"&ditto&" on a single line.");
+ drv_errmessage (ditto&"verbatimtex%&latex"&ditto&" is missing");
+ fi
+enddef;
+
+vardef drv_find (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex%&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_find_verbatimtex;
+ drv_find ("\begin{document}", tex_preamble_str[0]);
+ drv_find ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex%&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_rnk;
+tex_pct_rnk:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_rnk)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_rnk]:
+ tex_pct[tex_pct_rnk]
+ else:
+ nullpicture
+ fi;
+ tex_pct_rnk:=tex_pct_rnk+1;
+ pct
+enddef;
+
+vardef drv_verbatimtex expr tex_str=
+ write char(10)&
+ "% drv_verbatimtex"&char(10)&char(10)&
+ "verbatimtex"&char(10)&
+ tex_str&char(10)&
+ "etex;"
+ to delayed_tex_file;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+%vardef drv_fontdimen[] expr font=
+% save dim_pct;
+% picture dim_pct;
+% dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+% width dim_pct
+%enddef;
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct, dim_str;
+ picture dim_pct;
+ string dim_str;
+ dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}");
+ dim_str:="0";
+ for tok within dim_pct:
+ dim_str:=dim_str&(textpart tok);
+ endfor
+ scantokens dim_str
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,"; % thinspace
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\:"; % medspace
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;"; % thickspace
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ drv_arc str;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-arcs
+%
+
+vardef drv_arc text STR=
+ for str=STR:
+ expandafter numeric scantokens str.rad;
+ expandafter numeric scantokens str.lng;
+ expandafter numeric scantokens str.cng;
+ expandafter numeric scantokens str.rng;
+ expandafter pair scantokens str.org;
+ endfor
+enddef;
+
+vardef arc_init @# (expr pct, ngl)=
+ @#:=pct;
+ @#.rng-@#.lng=ngl;
+ @#.cng=(@#.lng+@#.rng)/2;
+enddef;
+
+vardef arc_freeze @#=
+ @#:=@# rotated @#.lng shifted @#.org;
+ @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org;
+ @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org;
+ @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Polar coordinates, angles & text torsion
+%
+
+vardef rad_part expr ppt=
+ xpart ppt
+enddef;
+
+vardef ngl_part expr ppt=
+ ypart ppt
+enddef;
+
+vardef minrad (expr ppt_a, ppt_b)=
+ min (rad_part ppt_a, rad_part ppt_b)
+enddef;
+
+% "tnum" (turning number) argument:
+% -1: clockwise
+% 1: counterclockwise
+
+vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum=
+ if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b):
+ ppt_a
+ else:
+ ppt_b
+ fi
+enddef;
+
+vardef arc_angle (expr rad, arc_len) expr tnum=
+ if rad>0:
+ save pth;
+ path pth;
+ pth:=fullcircle scaled (2*rad);
+ tnum*(angle point (arctime arc_len of pth) of pth)
+ else:
+ 0
+ fi
+enddef;
+
+vardef circ_path (expr rad, ngl) expr tnum=
+ save pth;
+ path pth;
+ pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad);
+ subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth
+enddef;
+
+vardef text_arc (expr pct, rad) expr tnum=
+ save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct;
+ picture arc_pct, chr_pct;
+ numeric tok_ngl, hlf_wd;
+ string tok_str;
+ arc_pct:=nullpicture;
+ for tok within pct:
+ if textual tok:
+ transform tok_trn;
+ tok_str:=textpart tok;
+ (0, 0) transformed tok_trn=(0, 0);
+ (0, 1) transformed tok_trn=(xypart tok, yypart tok);
+ (1, 0) transformed tok_trn=(xxpart tok, yxpart tok);
+ tok_ngl:=arc_angle (rad, xpart tok) tnum;
+ for chr_rnk=0 upto (length tok_str-1):
+ chr_pct:=
+ substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok)
+ transformed tok_trn;
+ hlf_wd:=(width chr_pct)/2;
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ addto arc_pct also chr_pct
+ shifted (-hlf_wd, 0)
+ rotated (tok_ngl+tnum*90)
+ shifted (dir tok_ngl scaled (rad-tnum*(ypart tok)));
+ tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum;
+ endfor
+ elseif stroked tok:
+ path pth;
+ pair src, tgt;
+ numeric src_ngl, tgt_ngl;
+ pth:=pathpart tok;
+ src:=point 0 of pth;
+ tgt:=point length pth of pth;
+ src_ngl:=arc_angle (rad, xpart src) tnum;
+ tgt_ngl:=arc_angle (rad, xpart tgt) tnum;
+ interim linecap:=butt;
+ addto arc_pct doublepath
+ if xpart src<>xpart tgt: % horizontal rule
+ (circ_path (rad-tnum*(ypart src), tgt_ngl-src_ngl) tnum)
+ rotated src_ngl
+ else: % vertical rule
+ pth shifted -src rotated (src_ngl+tnum*90)
+ shifted (dir src_ngl scaled (rad-tnum*(ypart src)))
+ fi withpen penpart tok;
+ fi
+ endfor
+ arc_pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ % bot_jdg[i] boolean
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ boolean bot_jdg[];
+ %
+ % nfr_min_x[i] inference minimal x
+ % nfr_lmost_ppt[i] inference leftmost polar point
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % nfr_max_x[i] inference maximal x
+ % nfr_rmost_ppt[i] inference rightmost polar point
+ %
+ numeric nfr_min_x[];
+ pair nfr_lmost_ppt[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric nfr_max_x[];
+ pair nfr_rmost_ppt[];
+ %
+ % Sub-trees
+ %
+ % sub_min_x[i] sub-tree minimal x
+ % sub_lmost_ppt[i] sub-tree leftmost polar point
+ % sub_max_x[i] sub-tree maximal x
+ % sub_rmost_ppt[i] sub-tree rightmost polar point
+ % sub_min_y[i] sub-tree minimal y
+ % sub_min_rad[i] sub-tree minimal radius
+ % sub_max_y[i] sub-tree maximal y
+ % sub_max_rad[i] sub-tree maximal radius
+ % boxed[i] boolean
+ %
+ numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[];
+ pair sub_lmost_ppt[], sub_rmost_ppt[];
+ numeric sub_min_rad[], sub_max_rad[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_checked boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=mth_tex[jdg_sty[drv_sty]] sub;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l; % irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=jdg_wd+width sbj_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].l=sbj[@][0].l; % irrelevant if sbj_num=0
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+%
+% 1. Global parameters
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_ilb_on; % inference labels on
+boolean drv_dlb_on; % delimiter labels on
+boolean drv_plb_on; % phantom steps labels on
+
+%
+% 2. Macros
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr str=
+ if str<>"":
+ box_init @# (mth_tex[@] str);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk, root_rnk;
+ numeric prm_rnk, root_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ root_rnk:=0;
+ forever:
+ exitif root[root_rnk]=prm_idx;
+ root_rnk:=root_rnk+1;
+ endfor
+ forever:
+ exitif root_rnk=root_num-1;
+ root[root_rnk]:=root[root_rnk+1];
+ root_rnk:=root_rnk+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ if drv_ilb_on:
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ fi
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ if drv_dlb_on:
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ else:
+ if ldlb<>"":
+ box_init l_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ if rdlb<>"":
+ box_init r_dlb[@] (mth_tex[dlb_sty[drv_sty]] "{}");
+ fi
+ fi
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save prm_idx, pth_sty, phm_jdg;
+ numeric prm_idx, pth_sty;
+ picture phm_jdg;
+ pth_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[pth_sty]-iln_dp[pth_sty], 0)--cycle;
+ prm_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (prm_idx) ("", "", "", "", 0, a_sty, 0);
+ prm_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=pth_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ if drv_plb_on:
+ opt_init[plb_sty[drv_sty]] l_plb[@] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[@] rplb;
+ fi
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ string fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ string snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ string @#.l;
+ string @#.r;
+ if lbl_num=0:
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_ldlm_str; % left delimiter LaTeX code
+string drv_rdlm_str; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef min_y[]=
+ if bot_jdg[@]:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+ else:
+ sub_min_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_y[]=
+ if bot_jdg[@]:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_max_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi
+enddef;
+
+vardef min_rad[]=
+ if known ccl[@]:
+ if bot_jdg[@]:
+ jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ else:
+ jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])]
+ fi+min_clr_scl*min_clr[drv_sty]/2
+ else:
+ sub_min_rad[@]-min_clr_scl*min_clr[drv_sty]
+ fi
+enddef;
+
+vardef max_rad[]=
+ sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_ldlm_str&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_rdlm_str
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+boolean drv_radialmode_on; %
+numeric crv_scl; %
+numeric azimuth_ngl; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_bot_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=true;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_bot_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ endfor
+ if not fraction_inference[@]:
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_top_check[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a premise index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ bot_jdg[@]:=false;
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_top_check[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ den_dp:=min (den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ endfor
+ if not fraction_inference[@]:
+ num_hg:=max (num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=drv_boxmode_on;
+ fi
+ fi
+enddef;
+
+vardef drv_root (expr idx) (suffix pos_sfx)=
+ save root_idx;
+ numeric root_idx;
+ root_idx:=idx;
+ forever:
+ exitif unknown ccl[root_idx];
+ root_idx:=ccl[root_idx];
+ endfor
+ if idx<>root_idx:
+ drv_message "warning, "&(decimal idx)&" is not a root index"&
+ " (the actual root index is "&(decimal root_idx)&").";
+ fi
+ bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx, root_str;
+ numeric root_idx;
+ string root_str;
+ for root_rnk=0 upto root_num-1:
+ root_idx:=root[root_rnk];
+ if unknown bot_jdg[root_idx]:
+ bot_jdg[root_idx]:=drv_bot_roots;
+ fi
+ if bot_jdg[root_idx]:
+ drv_bot_check[root_idx];
+ else:
+ drv_top_check[root_idx];
+ fi
+ root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx;
+ endfor
+ if root_num>1:
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_lin_build[]=
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ sub_max_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]);
+ endfor
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ sub_min_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln_dp[iln_sty[@]]
+ fi;
+ sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp;
+ drv_lin_build[prm[@][prm_rnk]];
+ sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]);
+ endfor
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_max_x:=nfr_max_x[l_rmost];
+ r_min_x:=nfr_min_x[r_lmost];
+ min_skp[0]:=r_min_x-l_max_x;
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_max_x:=max (l_max_x, nfr_max_x[l_rmost]);
+ r_min_x:=min (r_min_x, nfr_min_x[r_lmost]);
+ min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]);
+ endfor
+ min_skp[1]:=r_min_x-l_max_x;
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:= r_prm[l_rmost];
+ l_max_x:=sub_max_x[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_min_x:=sub_min_x[r_lmost];
+ fi
+ min_skp[2]:=r_min_x-l_max_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_min_x[@]:=xpart jdg[@].l;
+ nfr_max_x[@]:=xpart jdg[@].r;
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[l_prm[@]]:
+ sub_min_x[l_prm[@]]
+ else:
+ xpart jdg[l_prm[@]].l
+ fi;
+ r_xref=
+ if boxed[r_prm[@]]:
+ sub_max_x[r_prm[@]]
+ else:
+ xpart jdg[r_prm[@]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ nfr_min_x[@]:=min (xpart jdg[@].l, l_xref);
+ nfr_max_x[@]:=max (xpart jdg[@].r, r_xref);
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=nfr_max_x[@]-nfr_min_x[@]+2*jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(nfr_min_x[@]+nfr_max_x[@])/2;
+ if iln_sty[@]>0:
+ nfr_min_x[@]:=xpart iln[@].l;
+ nfr_max_x[@]:=xpart iln[@].r;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_min_x[@]:=xpart l_ilb[@].l;
+ sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ nfr_max_x[@]:=xpart r_ilb[@].r;
+ sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, bot_y, top_y, phm_pct;
+ numeric trg, bot_y, top_y;
+ picture phm_pct;
+ trg:=tgt[@];
+ if bot_jdg[@]:
+ bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=min_y[trg];
+ else:
+ bot_y:=max_y[trg];
+ top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2))
+ drv_styled phm_sty[@];
+ box_init phm[trg] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[trg].c=(xpart jdg[@].c, (top_y+bot_y)/2);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[trg].l);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[trg].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].r=phm[trg].l shifted (-plb_skp[drv_sty], 0);
+ nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[trg].l);
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].l=phm[trg].r shifted ( plb_skp[drv_sty], 0);
+ nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[trg].r);
+ fi
+ fi
+ %
+ % sub_min_x & sub_max_x
+ %
+ sub_min_x[@]:=nfr_min_x[@];
+ sub_max_x[@]:=nfr_max_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]);
+ sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save miny, maxy;
+ numeric miny, maxy;
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (maxy-miny));
+ l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ sub_min_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (maxy-miny));
+ r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ sub_max_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_min_x[idx]:=sub_min_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_max_x[idx]:=sub_max_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_rad_build[]=
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ sbj[@][sbj_rnk].rad=jdg[@].rad;
+ sbj[@][sbj_rnk].org=jdg[@].org;
+ endfor
+ %
+ % orientation
+ %
+ if bot_jdg[@]:
+ iln[@].rad=jdg[@].rad-den_dp;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad+jdg[@].dp;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad+jdg[@].hg
+ else:
+ iln[@].rad+iln_hg[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor
+ else:
+ iln[@].rad=jdg[@].rad+num_hg;
+ iln[@].org=jdg[@].org;
+ sub_min_rad[@]:=jdg[@].rad-jdg[@].hg;
+ sub_max_rad[@]:=
+ if iln_sty[@]=0:
+ jdg[@].rad-jdg[@].dp
+ else:
+ iln[@].rad-iln_dp[iln_sty[@]]
+ fi;
+ for prm_rnk=0 upto prm_num[@]-1:
+ jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp;
+ jdg[prm[@][prm_rnk]].org=iln[@].org;
+ drv_rad_build[prm[@][prm_rnk]];
+ sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].rad=iln[@].rad;
+ l_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].rad=iln[@].rad;
+ r_ilb[@].org=iln[@].org;
+ sub_max_rad[@]:=max (sub_max_rad[@],
+ r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad;
+ numeric trg, src_rad, tgt_rad;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm[trg].rad=(src_rad+tgt_rad)/2;
+ phm[trg].org=jdg[@].org;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ l_plb[trg].rad=phm[trg].rad;
+ l_plb[trg].org=phm[trg].org;
+ fi
+ if known r_plb[trg]:
+ r_plb[trg].rad=phm[trg].rad;
+ r_plb[trg].org=phm[trg].org;
+ fi
+ fi
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save minr, maxr;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ l_dlm[@].rad=(minr+maxr)/2;
+ l_dlb[@].rad=l_dlm[@].rad;
+ l_dlb[@].org=l_dlm[@].org=jdg[@].org;
+ fi
+ if known r_dlb[@]:
+ r_dlm[@].rad=(minr+maxr)/2;
+ r_dlb[@].rad=r_dlm[@].rad;
+ r_dlb[@].org=r_dlm[@].org=jdg[@].org;
+ fi
+ fi
+enddef;
+
+vardef drv_ngl_build[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_ngl_build[prm[@][prm_rnk]];
+ endfor
+ save tnum;
+ numeric tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ %
+ % judgment arc
+ %
+ save jdg_pct, jdg_ngl;
+ picture jdg_pct;
+ numeric jdg_ngl;
+ jdg_pct:=nullpicture;
+ jdg_ngl:=0;
+ for sbj_rnk=0 upto (sbj_num[@]-1):
+ arc_init sbj[@][sbj_rnk]
+ (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum,
+ arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum);
+ if sbj_rnk>0: % non mandatory test
+ sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0
+ fi
+ addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl;
+ jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng;
+ endfor
+ arc_init jdg[@] (jdg_pct, jdg_ngl);
+ if sbj_num[@]>0: % non mandatory test
+ jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0
+ fi
+ %
+ % premises junction (from left to right)
+ %
+ save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp;
+ numeric l_lmost, l_rmost, r_lmost, r_rmost;
+ pair l_rmost_ppt, r_lmost_ppt, ppt_skp[];
+ for prm_rnk=1 upto prm_num[@]-1:
+ l_lmost:=prm[@][0];
+ l_rmost:=prm[@][prm_rnk-1];
+ r_lmost:=prm[@][prm_rnk];
+ r_rmost:=prm[@][prm_rnk];
+ l_rmost_ppt:=nfr_rmost_ppt[l_rmost];
+ r_lmost_ppt:=nfr_lmost_ppt[r_lmost];
+ ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ forever:
+ exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]);
+ l_lmost:=l_prm[l_lmost];
+ l_rmost:=r_prm[l_rmost];
+ r_lmost:=l_prm[r_lmost];
+ r_rmost:=r_prm[r_rmost];
+ l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum;
+ r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum;
+ ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum;
+ endfor
+ ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if known r_prm[l_rmost]:
+ r_prm[r_rmost]:=r_prm[l_rmost];
+ l_rmost_ppt:=sub_rmost_ppt[l_rmost];
+ elseif known l_prm[r_lmost]:
+ l_prm[l_lmost]:=l_prm[r_lmost];
+ r_lmost_ppt:=sub_lmost_ppt[r_lmost];
+ fi
+ ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt),
+ (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt));
+ if jct_sty[@]<3:
+ (ngl_part ppt_skp[jct_sty[@]])=
+ arc_angle(rad_part ppt_skp[jct_sty[@]],
+ prm_skp_scl*prm_skp[drv_sty]) tnum;
+ fi
+ endfor
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng);
+ nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng);
+ else:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ save l_ngl_ref, r_ngl_ref;
+ numeric l_ngl_ref, r_ngl_ref;
+ l_ngl_ref=
+ if boxed[l_prm[@]]:
+ ngl_part sub_lmost_ppt[l_prm[@]]
+ else:
+ jdg[l_prm[@]].lng
+ fi;
+ r_ngl_ref=
+ if boxed[r_prm[@]]:
+ ngl_part sub_rmost_ppt[r_prm[@]]
+ else:
+ jdg[r_prm[@]].rng
+ fi;
+ if alg_sty[@]="l":
+ jdg[@].lng=l_ngl_ref;
+ elseif alg_sty[@]="c":
+ jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2;
+ elseif alg_sty[@]="r":
+ jdg[@].rng=r_ngl_ref;
+ fi
+ nfr_lmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref));
+ nfr_rmost_ppt[@]:=(
+ jdg[@].rad,
+ tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref));
+ fi
+ %
+ % inference line
+ %
+ save iln_ngl;
+ numeric iln_ngl;
+ iln_ngl:=2*(arc_angle(iln[@].rad,
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum)
+ +(ngl_part nfr_rmost_ppt[@])
+ -(ngl_part nfr_lmost_ppt[@]);
+ arc_init iln[@]
+ ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl);
+ iln[@].hg=iln_hg[iln_sty[@]];
+ iln[@].dp=iln_dp[iln_sty[@]];
+ iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2;
+ if iln_sty[@]>0:
+ nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng);
+ nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng);
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ arc_init l_ilb[@](
+ text_arc (l_ilb[@], l_ilb[@].rad) tnum,
+ arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum);
+ l_ilb[@].rng=iln[@].lng
+ -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng);
+ fi
+ if known r_ilb[@]:
+ arc_init r_ilb[@](
+ text_arc (r_ilb[@], r_ilb[@].rad) tnum,
+ arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum);
+ r_ilb[@].lng=iln[@].rng
+ +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save trg, src_rad, tgt_rad, phm_pct;
+ numeric trg, src_rad, tgt_rad;
+ picture phm_pct;
+ trg:=tgt[@];
+ src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2;
+ tgt_rad:=min_rad[trg];
+ phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2))
+ drv_styled phm_sty[@];
+ arc_init phm[trg] (
+ phm_pct
+ rotated (tnum*90+arc_angle (phm[trg].rad, (width phm_pct)/2) tnum)
+ shifted ((dir 0) scaled phm[trg].rad),
+ arc_angle (phm[trg].rad, width phm_pct) tnum);
+ phm[trg].cng=jdg[@].cng;
+ nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@],
+ (phm[trg].rad, phm[trg].lng)) tnum;
+ nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@],
+ (phm[trg].rad, phm[trg].rng)) tnum;
+ %
+ % phantom steps labels
+ %
+ if known l_plb[trg]:
+ arc_init l_plb[trg](
+ text_arc (l_plb[trg], l_plb[trg].rad) tnum,
+ arc_angle (l_plb[trg].rad, width l_plb[trg]) tnum);
+ l_plb[trg].rng=phm[trg].lng
+ -arc_angle (l_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_lmost_ppt[@]:=
+ lmost_ppt(nfr_lmost_ppt[@], (l_plb[trg].rad, l_plb[trg].lng)) tnum;
+ fi
+ if known r_plb[trg]:
+ arc_init r_plb[trg](
+ text_arc (r_plb[trg], r_plb[trg].rad) tnum,
+ arc_angle (r_plb[trg].rad, width r_plb[trg]) tnum);
+ r_plb[trg].lng=phm[trg].rng
+ +arc_angle (r_plb[trg].rad, plb_skp[drv_sty]) tnum;
+ nfr_rmost_ppt[@]:=
+ rmost_ppt(nfr_rmost_ppt[@], (r_plb[trg].rad, r_plb[trg].rng)) tnum;
+ fi
+ fi
+ %
+ % sub_lmost_ppt & sub_rmost_ppt
+ %
+ sub_lmost_ppt[@]:=nfr_lmost_ppt[@];
+ sub_rmost_ppt[@]:=nfr_rmost_ppt[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ sub_lmost_ppt[@]:=
+ lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum;
+ sub_rmost_ppt[@]:=
+ rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum;
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save dlm_pct, minr, maxr;
+ picture dlm_pct;
+ numeric minr, maxr;
+ minr:=min_rad[@];
+ maxr:=max_rad[@];
+ if known l_dlb[@]:
+ dlm_pct:=delim l (maxr-minr);
+ arc_init l_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled l_dlm[@].rad),
+ arc_angle (l_dlm[@].rad, width dlm_pct) tnum);
+ l_dlm[@].rng=ngl_part sub_lmost_ppt[@];
+ arc_init l_dlb[@](
+ text_arc (l_dlb[@], l_dlb[@].rad) tnum,
+ arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum);
+ l_dlb[@].rng=l_dlm[@].lng;
+ sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng);
+ fi
+ if known r_dlb[@]:
+ dlm_pct:=delim r (maxr-minr);
+ arc_init r_dlm[@] (
+ dlm_pct
+ rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum)
+ shifted ((dir 0) scaled r_dlm[@].rad),
+ arc_angle (r_dlm[@].rad, width dlm_pct) tnum);
+ r_dlm[@].lng=ngl_part sub_rmost_ppt[@];
+ arc_init r_dlb[@](
+ text_arc (r_dlb[@], r_dlb[@].rad) tnum,
+ arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum);
+ r_dlb[@].lng=r_dlm[@].rng;
+ sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng);
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_lmost_ppt[idx]:=sub_lmost_ppt[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ save idx;
+ numeric idx;
+ idx:=@;
+ forever:
+ nfr_rmost_ppt[idx]:=sub_rmost_ppt[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_box_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_box_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_arc_freeze[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_arc_freeze[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ arc_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ arc_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_checked:
+ drv_check;
+ fi
+ save root_idx, tnum;
+ numeric root_idx, tnum;
+ %
+ % first root
+ %
+ root_idx:=root[0];
+ if drv_radialmode_on:
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ if unknown jdg[root_idx].cng:
+ jdg[root_idx].cng=-tnum*azimuth_ngl;
+ fi
+ if unknown jdg[root_idx].org:
+ %
+ % default math axis
+ %
+ jdg[root_idx].org=
+ (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+
+ if drv_axis_ref="iln":
+ iln[root_idx].rad
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].rad
+ fi);
+ fi
+ drv_arc_freeze[root_idx];
+ else:
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ xpart jdg[root_idx].c=0;
+ fi
+ if unknown ypart jdg[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ ypart iln[root_idx].c=axis_hg[drv_sty];
+ else: % drv_axis_ref="jdg"
+ ypart jdg[root_idx].c=axis_hg[drv_sty];
+ fi
+ fi
+ drv_box_freeze[root_idx];
+ fi
+ %
+ % other roots
+ %
+ if drv_radialmode_on:
+ save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl;
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_rad_build[root_idx];
+ if unknown jdg[root_idx].rad:
+ jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl;
+ fi
+ drv_ngl_build[root_idx];
+ tnum:=if bot_jdg[root_idx]: - fi 1; % turning number
+ l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]];
+ l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]];
+ r_lmost_rad:=rad_part sub_lmost_ppt[root_idx];
+ r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx];
+ if unknown jdg[root_idx].cng:
+ r_lmost_ngl=l_rmost_ngl+
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ arc_angle (min (r_lmost_rad, l_rmost_rad),
+ prm_skp_scl*prm_skp[drv_sty]) tnum
+ else:
+ 180
+ fi;
+ fi
+ if unknown jdg[root_idx].org:
+ jdg[root_idx].org=
+ if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]:
+ jdg[root[root_rnk-1]].org
+ else:
+ (dir l_rmost_ngl)
+ scaled jdg[root[root_rnk-1]].rad
+ shifted jdg[root[root_rnk-1]].org
+ shifted ((dir (l_rmost_ngl-tnum*90))
+ scaled (prm_skp_scl*prm_skp[drv_sty]))
+ shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad)
+ fi;
+ fi
+ drv_arc_freeze[root_idx];
+ endfor
+ else:
+ for root_rnk=1 upto root_num-1:
+ root_idx:=root[root_rnk];
+ drv_lin_build[root_idx];
+ if unknown xpart jdg[root_idx].c:
+ sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]]
+ +prm_skp_scl*prm_skp[drv_sty];
+ fi
+ if unknown ypart jdg[root_idx].c:
+ ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c;
+ fi
+ drv_box_freeze[root_idx];
+ endfor
+ fi
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_rnk=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_rnk]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_rnk]);
+ else:
+ drv_tree_addto pct (root[root_rnk]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if drv_radialmode_on:
+ save l_ngl, r_ngl, tnum;
+ numeric l_ngl, r_ngl, tnum;
+ tnum:=if bot_jdg[@]: - fi 1; % turning number
+ l_ngl:=
+ if known l_dlm[@].rng:
+ l_dlm[@].rng-arc_angle
+ (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_lmost_ppt[@])-arc_angle
+ (rad_part sub_lmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ r_ngl:=
+ if known r_dlm[@].lng:
+ r_dlm[@].lng+arc_angle
+ (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ else:
+ (ngl_part sub_rmost_ppt[@])+arc_angle
+ (rad_part sub_rmost_ppt[@],
+ jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum
+ fi;
+ (circ_path(max_rad[@], r_ngl-l_ngl) tnum--
+ reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum--
+ cycle) rotated l_ngl shifted jdg[@].org
+ else:
+ save minx, maxx, miny, maxy;
+ numeric minx, maxx, maxy, miny;
+ minx:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ sub_min_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ maxx:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ sub_max_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ miny:=min_y[@];
+ maxy:=max_y[@];
+ (minx, miny)--
+ (minx, maxy)--
+ (maxx, maxy)--
+ (maxx, miny)--
+ cycle
+ fi
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_bot (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ false
+ elseif pos_str="b":
+ true
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min (idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ elseif scl_str="crv":
+ crv_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg,"&
+ " ilb and"&
+ " crv.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots);
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_ldlm_str:=dlm_str;
+ else:
+ drv_rdlm_str:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+vardef drv_labels_mode (suffix typ_sfx, status_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_ilb_on:=check_mode_on (status_sfx, drv_ilb_on);
+ elseif typ_str="dlb":
+ drv_dlb_on:=check_mode_on (status_sfx, drv_dlb_on);
+ elseif typ_str="plb":
+ drv_plb_on:=check_mode_on (status_sfx, drv_plb_on);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_radial_mode suffix status_sfx=
+ drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on);
+enddef;
+
+vardef drv_azimuth expr ngl=
+ azimuth_ngl:=ngl;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+drv_labels_mode (ilb, on);
+drv_labels_mode (dlb, on);
+drv_labels_mode (plb, on);
+
+drv_radial_mode off;
+drv_scale (crv, 1);
+drv_azimuth 90;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/graphics/metapost/contrib/macros/drv/template/makefile b/graphics/metapost/contrib/macros/drv/template/makefile
new file mode 100644
index 0000000000..33507213d5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/template/makefile
@@ -0,0 +1,46 @@
+MAIN= template
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+ pdfopt $(MAIN).pdf $(MAIN)-opt.pdf
+ mv $(MAIN)-opt.pdf $(MAIN).pdf
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ dvips $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/graphics/metapost/contrib/macros/drv/template/readme.sh b/graphics/metapost/contrib/macros/drv/template/readme.sh
new file mode 100755
index 0000000000..6aae46abd1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/template/readme.sh
@@ -0,0 +1,16 @@
+# In order to compile the sources and to get a pdf file,
+# use `make' or `./readme.sh' or:
+
+# 1. run metapost THREE TIMES:
+mpost template.mp
+mpost template.mp
+mpost template.mp
+
+# 2. run latex (once):
+latex template.tex
+
+# 3. run dvips (once):
+dvips template.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf template.ps
diff --git a/graphics/metapost/contrib/macros/drv/template/template.mp b/graphics/metapost/contrib/macros/drv/template/template.mp
new file mode 100644
index 0000000000..5c799c73cc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/template/template.mp
@@ -0,0 +1,177 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Structure of a MetaPost file using drv
+% 1. Preamble
+% input drv;
+% verbatimtex%&latex
+% <LaTeX preamble>
+% \begin{document}
+% etex;
+% 2. Figures
+% <optional drv tunings>
+% beginfig(<index>)
+% <judgment & inference declarations>
+% draw drv_tree;
+% <optional extra MetaPost code>
+% endfig;
+% 3. Postamble
+% end
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 1. Preamble
+%
+
+input drv;
+
+verbatimtex%&latex
+
+% Any piece of code related to font selection in the preamble of
+% `template.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\begin{document}
+etex;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 2. Figures
+%
+
+% Default settings
+%
+% drv_font_size "\normalsize";
+% drv_math_style (drv, "\displaystyle");
+% drv_math_style (jdg, "\textstyle");
+% drv_math_style (ilb, "\scriptstyle");
+% drv_math_style (dlb, "\textstyle");
+% drv_math_style (plb, "\textstyle");
+% drv_scale (clr, 1);
+% drv_scale (prm, 1);
+% drv_scale (jdg, 1);
+% drv_scale (ilb, 1);
+% drv_junction_style 1;
+% drv_alignment_style c;
+% drv_path_style (iln, 1);
+% drv_path_style (phm, 3);
+% drv_labels_position (ilb, r);
+% drv_labels_position (dlb, l);
+% drv_labels_position (plb, l);
+% drv_roots_position b;
+% drv_axis_reference iln;
+% drv_left_delimiter "\lbrace";
+% drv_right_delimiter "\rbrace";
+% drv_box_mode off;
+% drv_fraction_mode on;
+% drv_proof_mode off;
+% drv_radial_mode off;
+% drv_labels_mode (ilb, on);
+% drv_labels_mode (dlb, on);
+% drv_labels_mode (plb, on);
+% drv_scale (crv, 1);
+% drv_azimuth 90;
+
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+
+string Lor, Ror[], Land[], Rand;
+Lor:="\vee L";
+Ror1:="\vee R_1";
+Ror2:="\vee R_2";
+Land1:="\wedge L_1";
+Land2:="\wedge L_2";
+Rand:="\wedge R";
+
+beginfig(110)
+jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge r_2))";
+ jgm 1 "p\wedge(q\vee(r_1\wedge r_2))\vdash p";
+ jgm 2 "p\vdash p";
+ jgm 3 "p\wedge(q\vee(r_1\wedge r_2))\vdash q\vee(r_1\wedge r_2)";
+ jgm 4 "q\vee(r_1\wedge r_2)\vdash q\vee(r_1\wedge r_2)";
+ jgm 5 "q\vdash q\vee(r_1\wedge r_2)";
+ jgm 6 "q\vdash q";
+ jgm 7 "r_1\wedge r_2\vdash q\vee(r_1\wedge r_2)";
+ jgm 8 "r_1\wedge r_2\vdash r_1\wedge r_2";
+ jgm 9 "r_1\wedge r_2\vdash r_1";
+ jgm 10 "r_1\vdash r_1";
+ jgm 11 "r_1\wedge r_2\vdash r_2";
+ jgm 12 "r_2\vdash r_2";
+nfr 0 (1, 3) (Rand, 1);
+ nfr 1 (2) (Land1, 1);
+ nfr 2 () ("", 0);
+ nfr 3 (mvd 4 (1, 3)) (Land2, 1);
+ Nfr 4 (5, 7) (Lor, "\text{Id\,}_{q\vee(r_1\wedge r_2)}", "", 1);
+ nfr 5 (6) (Ror1, 1);
+ nfr 6 () ("", 0);
+ nfr 7 (mvd 8 (1, 3)) (Ror2, 1);
+ Nfr 8 (9, 11) (Rand, "\text{Id\,}_{r_1\wedge r_2}", "", 1);
+ nfr 9 (10) (Land1, 1);
+ nfr 10 () ("", 0);
+ nfr 11 (12) (Land2, 1);
+ nfr 12 () ("", 0);
+fill drv_bbox 4 withcolor (255, 230, 205)/255;
+fill drv_bbox 8 withcolor (236, 211, 185)/255;
+draw drv_tree;
+endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3. Postamble
+%
+
+end
diff --git a/graphics/metapost/contrib/macros/drv/template/template.tex b/graphics/metapost/contrib/macros/drv/template/template.tex
new file mode 100644
index 0000000000..6b11487ae5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/drv/template/template.tex
@@ -0,0 +1,60 @@
+% Any piece of code related to font selection in the following preamble
+% (document class, font package, font selection commands ...) should be
+% reported in `template.mp'.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+% Picture inclusion macro: \drv
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\begin{document}
+\paragraph{First example}
+\begin{gather*}
+\drv{template.100}
+\end{gather*}
+\paragraph{Second example}
+\begin{gather*}
+\drv{template.110}
+\end{gather*}
+\end{document}
diff --git a/graphics/metapost/contrib/macros/dviincl/0czytaj.sla b/graphics/metapost/contrib/macros/dviincl/0czytaj.sla
new file mode 100644
index 0000000000..ec0ddde765
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/0czytaj.sla
@@ -0,0 +1,48 @@
+DVIINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+[This is `README' in Polish (slash notation)]
+
+Chcia/loby si/e czasem w/l/aczy/c do obrazka METAPOST-owego
+stron/e z przygotowanego wcze/sniej pliku .dvi (zw/laszcza
+w kontek/scie prezentacji Bachotkowo-PDF-owo-typograficznej).
+Czasem mo/ze to by/c prostsze ni/z wciskanie kodu
+TeX-owego mi/edzy znaczniki `btex' i `etex',
+szczeg/olnie w przypadku plik/ow wielostronicowych.
+
+Marcin Woli/nski wpad/l na pomys/l, by do tego celu wykorzystywa/c
+program DVITOMP. Problem wszak/ze w tym, /ze DVITOMP pstrzy
+plik wynikowy znacznikami `mpxbreak', nie tolerowanymi
+przez METAPOST-a w normalnym trybie przetwarzania.
+Ale nie ma /zadnych przeciwwskaza/n, /zeby wynik programu
+DVITOMP wst/epnie przetworzy/c, cho/cby AWK-iem lub PERL-em,
+a najlepiej... METAPOST-em!
+
+BOP proponuje nast/epuj/acy spos/ob post/epowania:
+
+1. Plik .dvi konwertujemy programem DVITOMP:
+ dvitomp plik_DVI plik_MPX
+
+2. Przetwarzamy plik MPX za pomoc/a METAPOST-a:
+ mpost \vardef ifi = str plik_MPX enddef; vardef ofi = str plik_MPY enddef; input fix_brks.mp
+ (por. za/l/aczony testit.bat dla DOS/WIN32 lub skrypt testit.sh dla U*X);
+ Powstaje plik MPY, chytrze zmieniony w stosunku do pliku MPX -- wstawione
+ zostaj/a po prostu instrukcje warunkowe.
+
+ Program `fix_brks.mp' korzysta z za/lo/zenia, /ze operacja `mpxbreak'
+ umieszczana jest bez zb/ednych spacji w osobnym wierszu. Gdyby jaki/s
+ wariant DVITOMP-a dzia/la/l inaczej, trzeba by zmodyfikowa/c `fix_brks.mp'.
+
+3. W pliku METAPOST-owym, w kt/orym chcemy stron/e (strony) wykorzysta/c,
+ nale/zy skorzysta/c z makierka `fix_page' zdefiniowanego
+ w pliczku `fix_page.mp', np. tak:
+ ...
+ picture p;
+ p:=fix_page(10,"plik.mpy"); % ,10' to przyk/ladowy numer strony,
+ % "plik.mpy" to przyk/ladowa nazwa
+ draw p;
+ ...
+
+4. I ju/z.
+
+Komentarze mile widziane.
+
+Kontakt: bop@bop.com.pl
diff --git a/graphics/metapost/contrib/macros/dviincl/0dviincl.inf b/graphics/metapost/contrib/macros/dviincl/0dviincl.inf
new file mode 100644
index 0000000000..14bca16996
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/0dviincl.inf
@@ -0,0 +1,63 @@
+DVIINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+[This is a short information about the DVIINCL utility]
+
+One of the auxiliary programs belonging to every METAPOST package
+is DVItoMP, converting a DVI into a METAPOST file. Hence the idea
+(due to Marcin Woli/nski) of including a DVI page into the EPS
+files generated by METAPOST.
+
+There are, however, several problems to overcome:
+ (1) Some DVI items are neglected by DVItoMP, most notably
+ `special' commands;
+ (2) DVItoMP expects that each page in a DVI file contains
+ a vrule of width 1sp positioned at the right lower
+ corner of the page; thanks to it, MPtoDVI knows the size
+ of the bounding box of a page. If such a rule do not occur
+ in the dvi file, the result of conversion is unpredictable,
+ e.g., Oostrum's (DOS) implementation simply doesn't write
+ `setbounds' commands (which are responsible for assigning
+ the proper bounding box to a translated DVI page), while
+ Delorie's (Web2C) implementation generates `setbounds'
+ commands corresponding to an empty box;
+ (3) MP files generated by DVItoMP contain special directives,
+ `mpxbreak', that METAPOST does not accept in its ``normal'' mode;
+
+Ad 1. This imposes limits on the possible applications.
+Ad 2. It is reasonable to ignore the `setbound' command if the source
+ DVI is not generated by MPtoTeX+TeX.
+Ad 3. A simple postprocessor is sufficient to circumvent the problem;
+ the treatment is so simple, that it can be even METAPOST itself.
+
+SYNOPSIS
+
+1. Use DVItoMP to convert a DVI file into the corresponding MPX file:
+
+dvitomp DVI_file MPX_file
+
+2. Proceed the resulting MPX with METAPOST:
+
+mpost \vardef ifi = str MPX_file enddef; vardef ofi = str MPY_file enddef; input fix_brks.mp
+
+ (cf. a batch file testit.bat for DOS/WIN32 or testit.sh for U*X);
+ In the resulting MPY_file, `mpxbreak' directives are replaced with
+ `if' commands.
+
+ The program `fix_brks.mp' basic assumes that `mpxbreak' directives occur
+ in separate lines, without superfluous spaces.
+
+3. The METAPOST file making use of such a DVI page should use the following
+ construction:
+ ...
+ picture p;
+ p:=fix_page(10,"file.mpy"); % `10' is an imaginary page number,
+ % "file.mpy" is an imaginary file name
+ draw p;
+ ...
+ where `fix_page' is a macro defined in file `fix_page.mp'.
+
+
+4. That's all.
+
+Comments are welcome
+
+e-mail contact: bop@bop.com.pl
diff --git a/graphics/metapost/contrib/macros/dviincl/README b/graphics/metapost/contrib/macros/dviincl/README
new file mode 100644
index 0000000000..14bca16996
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/README
@@ -0,0 +1,63 @@
+DVIINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+[This is a short information about the DVIINCL utility]
+
+One of the auxiliary programs belonging to every METAPOST package
+is DVItoMP, converting a DVI into a METAPOST file. Hence the idea
+(due to Marcin Woli/nski) of including a DVI page into the EPS
+files generated by METAPOST.
+
+There are, however, several problems to overcome:
+ (1) Some DVI items are neglected by DVItoMP, most notably
+ `special' commands;
+ (2) DVItoMP expects that each page in a DVI file contains
+ a vrule of width 1sp positioned at the right lower
+ corner of the page; thanks to it, MPtoDVI knows the size
+ of the bounding box of a page. If such a rule do not occur
+ in the dvi file, the result of conversion is unpredictable,
+ e.g., Oostrum's (DOS) implementation simply doesn't write
+ `setbounds' commands (which are responsible for assigning
+ the proper bounding box to a translated DVI page), while
+ Delorie's (Web2C) implementation generates `setbounds'
+ commands corresponding to an empty box;
+ (3) MP files generated by DVItoMP contain special directives,
+ `mpxbreak', that METAPOST does not accept in its ``normal'' mode;
+
+Ad 1. This imposes limits on the possible applications.
+Ad 2. It is reasonable to ignore the `setbound' command if the source
+ DVI is not generated by MPtoTeX+TeX.
+Ad 3. A simple postprocessor is sufficient to circumvent the problem;
+ the treatment is so simple, that it can be even METAPOST itself.
+
+SYNOPSIS
+
+1. Use DVItoMP to convert a DVI file into the corresponding MPX file:
+
+dvitomp DVI_file MPX_file
+
+2. Proceed the resulting MPX with METAPOST:
+
+mpost \vardef ifi = str MPX_file enddef; vardef ofi = str MPY_file enddef; input fix_brks.mp
+
+ (cf. a batch file testit.bat for DOS/WIN32 or testit.sh for U*X);
+ In the resulting MPY_file, `mpxbreak' directives are replaced with
+ `if' commands.
+
+ The program `fix_brks.mp' basic assumes that `mpxbreak' directives occur
+ in separate lines, without superfluous spaces.
+
+3. The METAPOST file making use of such a DVI page should use the following
+ construction:
+ ...
+ picture p;
+ p:=fix_page(10,"file.mpy"); % `10' is an imaginary page number,
+ % "file.mpy" is an imaginary file name
+ draw p;
+ ...
+ where `fix_page' is a macro defined in file `fix_page.mp'.
+
+
+4. That's all.
+
+Comments are welcome
+
+e-mail contact: bop@bop.com.pl
diff --git a/graphics/metapost/contrib/macros/dviincl/README.pl b/graphics/metapost/contrib/macros/dviincl/README.pl
new file mode 100644
index 0000000000..ec0ddde765
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/README.pl
@@ -0,0 +1,48 @@
+DVIINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+[This is `README' in Polish (slash notation)]
+
+Chcia/loby si/e czasem w/l/aczy/c do obrazka METAPOST-owego
+stron/e z przygotowanego wcze/sniej pliku .dvi (zw/laszcza
+w kontek/scie prezentacji Bachotkowo-PDF-owo-typograficznej).
+Czasem mo/ze to by/c prostsze ni/z wciskanie kodu
+TeX-owego mi/edzy znaczniki `btex' i `etex',
+szczeg/olnie w przypadku plik/ow wielostronicowych.
+
+Marcin Woli/nski wpad/l na pomys/l, by do tego celu wykorzystywa/c
+program DVITOMP. Problem wszak/ze w tym, /ze DVITOMP pstrzy
+plik wynikowy znacznikami `mpxbreak', nie tolerowanymi
+przez METAPOST-a w normalnym trybie przetwarzania.
+Ale nie ma /zadnych przeciwwskaza/n, /zeby wynik programu
+DVITOMP wst/epnie przetworzy/c, cho/cby AWK-iem lub PERL-em,
+a najlepiej... METAPOST-em!
+
+BOP proponuje nast/epuj/acy spos/ob post/epowania:
+
+1. Plik .dvi konwertujemy programem DVITOMP:
+ dvitomp plik_DVI plik_MPX
+
+2. Przetwarzamy plik MPX za pomoc/a METAPOST-a:
+ mpost \vardef ifi = str plik_MPX enddef; vardef ofi = str plik_MPY enddef; input fix_brks.mp
+ (por. za/l/aczony testit.bat dla DOS/WIN32 lub skrypt testit.sh dla U*X);
+ Powstaje plik MPY, chytrze zmieniony w stosunku do pliku MPX -- wstawione
+ zostaj/a po prostu instrukcje warunkowe.
+
+ Program `fix_brks.mp' korzysta z za/lo/zenia, /ze operacja `mpxbreak'
+ umieszczana jest bez zb/ednych spacji w osobnym wierszu. Gdyby jaki/s
+ wariant DVITOMP-a dzia/la/l inaczej, trzeba by zmodyfikowa/c `fix_brks.mp'.
+
+3. W pliku METAPOST-owym, w kt/orym chcemy stron/e (strony) wykorzysta/c,
+ nale/zy skorzysta/c z makierka `fix_page' zdefiniowanego
+ w pliczku `fix_page.mp', np. tak:
+ ...
+ picture p;
+ p:=fix_page(10,"plik.mpy"); % ,10' to przyk/ladowy numer strony,
+ % "plik.mpy" to przyk/ladowa nazwa
+ draw p;
+ ...
+
+4. I ju/z.
+
+Komentarze mile widziane.
+
+Kontakt: bop@bop.com.pl
diff --git a/graphics/metapost/contrib/macros/dviincl/fix_brks.mp b/graphics/metapost/contrib/macros/dviincl/fix_brks.mp
new file mode 100644
index 0000000000..43ff4e8c48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/fix_brks.mp
@@ -0,0 +1,25 @@
+if unknown ifi: string ifi; ifi:="~vicar~.mpx"; fi
+if unknown ofi: string ofi; ofi:="~vicar~.mpy"; fi
+selected_page:=1;
+write "if selected_page=1:" to ofi;
+forever:
+ % re-declaration apparently cures problems with the string pool with
+ % large DVI files, such as TeXbook.DVI (Oostrum's DOS implementation
+ % swallows occasionally strings and issues "???" instead)
+ string l_; l_:=readfrom ifi;
+ exitif (l_=EOF);
+ if (l_="mpxbreak"):
+ l_:="elseif selected_page=" & decimal(incr(selected_page)) & ":";
+ fi
+ write l_ to ofi;
+endfor
+write "errmessage " &
+ ditto & "Non-existant page " & decimal(selected_page) & ditto & ";"
+ to ofi;
+write "else:" to ofi;
+write "errmessage " &
+ ditto & "Non-existant page " & ditto & " & decimal(selected_page);"
+ to ofi;
+write "fi" to ofi;
+write "endinput" to ofi;
+end
diff --git a/graphics/metapost/contrib/macros/dviincl/fix_page.mp b/graphics/metapost/contrib/macros/dviincl/fix_page.mp
new file mode 100644
index 0000000000..fe33dc44ef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/fix_page.mp
@@ -0,0 +1,7 @@
+vardef fix_page (expr p_,f_) =
+ save selected_page; selected_page=p_;
+ save setbounds; def setbounds text t = enddef; % we'd better ignore it
+ scantokens ("input " & f_)
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/dviincl/storyx.tex b/graphics/metapost/contrib/macros/dviincl/storyx.tex
new file mode 100644
index 0000000000..1e6eeba529
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/storyx.tex
@@ -0,0 +1,22 @@
+\hsize55mm \vsize50mm \raggedbottom
+%%%
+\hrule
+\vskip 1in
+\centerline{\bf A SHORT STORY}
+\vskip 6pt
+\centerline{\sl by A. U. Thor}
+\vskip .5cm
+Once upon a time, in a distant
+ galaxy called \"O\"o\c c,
+there lived a computer
+named R.~J. Drofnats.
+
+Mr.~Drofnats---or ``R. J.,'' as
+he preferred to be called---
+was happiest when he was at work
+typesetting beautiful documents.
+\vskip 1in
+\hrule
+\vfill\eject
+%%%
+\end
diff --git a/graphics/metapost/contrib/macros/dviincl/test-bop.mp b/graphics/metapost/contrib/macros/dviincl/test-bop.mp
new file mode 100644
index 0000000000..a348a2798d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/test-bop.mp
@@ -0,0 +1,18 @@
+% Admittedly silly but instructive example;
+input fix_page;
+
+def silly_display expr p =
+ draw p shifted (.5,.25) withcolor red; draw p;
+ pickup pensquare scaled .5pt;
+ bboxmargin:=0;
+ draw bbox p withcolor blue;
+ pickup pencircle scaled .5pt;
+ draw lrcorner p -- ulcorner p withcolor blue;
+ draw urcorner p -- llcorner p withcolor blue;
+enddef;
+
+beginfig(101); silly_display fix_page(1, "storyx.mpy"); endfig;
+beginfig(102); silly_display fix_page(2, "storyx.mpy"); endfig;
+beginfig(103); silly_display fix_page(3, "storyx.mpy"); endfig;
+
+bye.
diff --git a/graphics/metapost/contrib/macros/dviincl/test-bop.tex b/graphics/metapost/contrib/macros/dviincl/test-bop.tex
new file mode 100644
index 0000000000..b64a6b8fad
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/test-bop.tex
@@ -0,0 +1,13 @@
+\input epsf
+\nopagenumbers
+
+\leftline{The first page:}
+\epsffile{test-bop.101}
+\vfill
+\leftline{The second page:}
+\epsffile{test-bop.102}
+\vfill
+\leftline{The third page (the result of missing `setbounds'):}
+\epsffile{test-bop.103}
+
+\end
diff --git a/graphics/metapost/contrib/macros/dviincl/testit.bat b/graphics/metapost/contrib/macros/dviincl/testit.bat
new file mode 100644
index 0000000000..69371474a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/testit.bat
@@ -0,0 +1,44 @@
+@echo off
+
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+:: PREPARE:
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+
+:: setting the environment variable texfonts is needed by dvitomp:
+
+:: mp by Piet van Oostrum and emTeX
+:: set texfonts=c:/emtex/tfms!
+:: set tex_call=call tex &plain \input
+:: set mp_call=mp &plain
+:: set dvitomp_call=c:\emtex\mp\mplib\dvitomp
+
+:: fpTeX, MiKTeX, DJ Delorie
+set mp_call=mpost &mpost
+set dvitomp_call=dvitomp
+
+:: COMMON
+set tex_call=call tex \input
+set dvips_call=dvips -F -K
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+:: DO JOB:
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+
+%tex_call% storyx
+%dvitomp_call% storyx.dvi storyx.mpx
+:: it is advisable to avoid quotes -- hence the `str' operation:
+%mp_call% \vardef ifi = str storyx.mpx enddef; vardef ofi = str storyx.mpy enddef; input fix_brks.mp
+%mp_call% test-bop.mp
+%tex_call% test-bop.tex
+%dvips_call% test-bop.dvi
+
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+:: CLEAN:
+:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
+
+del storyx.dvi
+del storyx.log
+:: del storyx.mpx
+:: del storyx.mpy
+del test-bop.dvi
+del test-bop.log
+del test-bop.10*
diff --git a/graphics/metapost/contrib/macros/dviincl/testit.sh b/graphics/metapost/contrib/macros/dviincl/testit.sh
new file mode 100644
index 0000000000..6d665c45f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/dviincl/testit.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+## simple test of DVI file inclusion in EPS file generated by METAPOST
+tex storyx
+dvitomp storyx.dvi storyx.mpx
+## it is advisable to avoid quotes -- hence the `str' operation:
+mpost "\vardef ifi = str storyx.mpx enddef; vardef ofi = str storyx.mpy enddef; input fix_brks.mp"
+mpost test-bop.mp
+tex test-bop.tex
+dvips test-bop.dvi -o test-bop.ps
+## CLEAN:
+rm storyx.dvi
+rm storyx.log
+# rm storyx.mpx
+# rm storyx.mpy
+rm test-bop.dvi
+rm test-bop.log
+rm test-bop.10*
+
diff --git a/graphics/metapost/contrib/macros/epsincl/0info.txt b/graphics/metapost/contrib/macros/epsincl/0info.txt
new file mode 100644
index 0000000000..e8682f3eb7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/0info.txt
@@ -0,0 +1,13 @@
+EPSINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+history: 20.08.1999: ver. 0.1, pre-release
+ 05.01.2000: ver. 0.2, first release
+
+ENGLISH | POLSKI
+ |
+The package EPSINCL facilitates | Pakiet EPSINCL u/latwia w/l/aczanie
+including EPS files in METAPOST | plik/ow EPS do dokument/ow
+documents; it makes use of (G)AWK. | METAPOST-owych; wykorzystywany jest
+Using it is very simple -- see | (G)AWK. Spos/ob u/zycia demonstruje
+testincl.mp and testincl.bat | za/l/aczony przyk/lad (testincl.mp)
+(DOS/WIN32) or testincl.sh (U*X) | i pliki testincl.bat (DOS/WIN32)
+files to see this. | lub testincl.sh (U*X)
diff --git a/graphics/metapost/contrib/macros/epsincl/README b/graphics/metapost/contrib/macros/epsincl/README
new file mode 100644
index 0000000000..e8682f3eb7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/README
@@ -0,0 +1,13 @@
+EPSINCL: made in BOP s.c., bop@bop.com.pl; public domain software
+history: 20.08.1999: ver. 0.1, pre-release
+ 05.01.2000: ver. 0.2, first release
+
+ENGLISH | POLSKI
+ |
+The package EPSINCL facilitates | Pakiet EPSINCL u/latwia w/l/aczanie
+including EPS files in METAPOST | plik/ow EPS do dokument/ow
+documents; it makes use of (G)AWK. | METAPOST-owych; wykorzystywany jest
+Using it is very simple -- see | (G)AWK. Spos/ob u/zycia demonstruje
+testincl.mp and testincl.bat | za/l/aczony przyk/lad (testincl.mp)
+(DOS/WIN32) or testincl.sh (U*X) | i pliki testincl.bat (DOS/WIN32)
+files to see this. | lub testincl.sh (U*X)
diff --git a/graphics/metapost/contrib/macros/epsincl/epsincl.awk b/graphics/metapost/contrib/macros/epsincl/epsincl.awk
new file mode 100644
index 0000000000..2c394da7ac
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/epsincl.awk
@@ -0,0 +1,176 @@
+# made in BOP s.c., bop@bop.com.pl; public domain software
+# history: 20.08.1999: ver. 0.1, pre-release
+# 05.01.2000: ver. 0.2, first release
+BEGIN {
+ hd["0"]=0; hd["1"]=1; hd["2"]=2; hd["3"]=3; hd["4"]=4
+ hd["5"]=5; hd["6"]=6; hd["7"]=7; hd["8"]=8; hd["9"]=9
+ hd["a"]=hd["A"]=10; hd["b"]=hd["B"]=11; hd["c"]=hd["C"]=12
+ hd["d"]=hd["D"]=13; hd["e"]=hd["E"]=14; hd["f"]=hd["F"]=15
+ #
+ hb["0"]="0000"; hb["1"]="0001"; hb["2"]="0010"; hb["3"]="0011"
+ hb["4"]="0100"; hb["5"]="0101"; hb["6"]="0110"; hb["7"]="0111"
+ hb["8"]="1000"; hb["9"]="1001"; hb["a"]="1010"; hb["b"]="1011"
+ hb["c"]="1100"; hb["d"]="1101"; hb["e"]="1110"; hb["f"]="1111"
+ #
+ for (i in hb) bh[hb[i]]=i
+ #
+ hb["A"]="1010"; hb["B"]="1011"; hb["C"]="1100"
+ hb["D"]="1101"; hb["E"]="1110"; hb["F"]="1111"
+ #
+ comments=1
+}
+
+/^[^%]/ && (comments==1) {comments=0; flush_prolog()}
+
+comments==1 {process_prolog()}
+
+(l==7) {l=0}
+
+(l==6) {
+ if ($0~/ *closepath/) {l=7; IncludeEPS(Anum)} else l=-6
+}
+
+(l==5) {
+ if (is_lineto()) {l=6}
+ else if (is_curveto()) {l=6}
+ else if ($0~/ *closepath/) {l=7; IncludeEPS(Anum)}
+ else l=-5
+}
+
+(l==4) {
+ if (is_lineto()) {l=5; Aulx=$1; Auly=$2}
+ else if (is_curveto()) {l=5; Aulx=$5; Auly=$6}
+ else l=-4
+}
+
+(l==3) {
+ if (is_lineto()) {l=4; Aurx=$1; Aury=$2}
+ else if (is_curveto()) {l=4; Aurx=$5; Aury=$6}
+ else l=-3
+}
+
+(l==2) {
+ if (is_lineto()) {l=3; Adrx=$1; Adry=$2}
+ else if (is_curveto()) {l=3; Adrx=$5; Adry=$6}
+ else l=-2
+}
+
+(l==1) {
+ if ($0~/^newpath -?[0-9\.]+ -?[0-9\.]+ moveto$/) {
+ l=2
+ Adlx=$2; Adly=$3
+ } else l=-1
+}
+
+(l<0) {
+ print "Something strange in EPS colour (" (-l) ")" > "CON"
+ print NR, is_lineto(), is_curveto() > "CON"
+ print $0 > "CON"
+ exit
+ l=0
+}
+
+/setrgbcolor$/ && (n>0) && (comments==0) {
+ for (i in Ename)
+ if ((Ecolr[i]==$1) && (Ecolg[i]==$2) && (Ecolb[i]==$3)) {
+ Anum=i; l=1
+ }
+}
+
+(l==0) && (comments==0) {gsub(/fshow/, "nshow"); print}
+
+function hexval(x) {return hd[substr(x,1,1)]*16+hd[substr(x,2,1)]}
+
+function process_prolog(){
+ if (/^%\*Font:/) {
+ f_ch[$2 "\001" $4]=fix_chars(f_ch[$2 "\001" $4],$5)
+ } else
+ if (/^%EPS/) {
+ Ecolr[++n]=$2+0; Ecolg[n]=$3+0; Ecolb[n]=$4+0
+ Ename[n]=$5 ""
+ Ebbl[n]=$6+0; Ebbd[n]=$7+0; Ebbr[n]=$8+0; Ebbu[n]=$9+0
+ } else
+ prolog[++prolog[0]]=$0
+}
+
+function flush_prolog( j,l){
+ for (l=1; l<=prolog[0]; ++l) {
+ if (prolog[l]~/^%%EndProlog/) j=flush_fonts();
+ print prolog[l]
+ }
+ if (j>0) print "/nshow {gsave 10 div dup scale 10 fshow grestore} def"
+ if (n>0) print "/MEPSDict 50 dict def"
+}
+
+function flush_fonts( i,j) {
+ j=0
+ for (i in f_ch) {
+ j++
+ split(i,a,"\001")
+ printf("%%*Font: %s 10.0 %s %s\n", a[1], a[2], out_chars(f_ch[i]))
+ }
+ return j
+}
+
+function fix_chars(f,c, a) {
+ split(c,a,":")
+ return mix_chars((f=="" ? sprintf("%0256d", 0) : f), a[2], hexval(a[1]))
+}
+
+function mix_chars(f,c,x, h,k,l) {
+ for (k=1; k<=length(c); k++) {
+ h=hb[substr(c,k,1)]
+ for (l=1; l<=length(h); l++)
+ if (substr(h,l,1)=="1") f=substr(f,1,x+4*k+l-5) "1" substr(f,x+4*k+l-3)
+ }
+ return f
+}
+
+function out_chars(f, i,j,k,g) {
+ while ((i<256) && (substr(f,i,1)=="0")) ++i
+ g=""
+ for (j=i; j<=length(f); j+=4) {
+ k=sprintf("%-4s", substr(f,j,4)); gsub(/ /,"0",k); g=g bh[k]
+ }
+ sub (/0+$/,"",g)
+ return sprintf("%02X", (i-1)) ":" g
+}
+
+function is_lineto() {
+ return ($0~/^-?[0-9\.]+ -?[0-9\.]+ lineto$/)
+}
+
+function is_curveto() {
+ return ($0~/^-?[0-9\.]+ -?[0-9\.]+ -?[0-9\.]+ -?[0-9\.]+ -?[0-9\.]+ -?[0-9\.]+ curveto$/)
+}
+
+function IncludeEPS(i, comments, s) {
+ print "%BeginInclude"
+ print "MEPSDict begin /MEPSSave save def gsave"
+ print "count /MEPSocount exch def /MEPSdcount countdictstack def"
+ print "/showpage {} def /erasepage {} def /copypage {} def"
+ print "/letter {} def /note {} def /a4 {} def /legal {} def"
+ printf ("[ %f %f %f %f %f %f ] matrix invertmatrix\n",
+ Ebbr[i]-Ebbl[i], 0, 0, Ebbu[i]-Ebbd[i], Ebbl[i], Ebbd[i])
+ printf ("[ %f %f %f %f %f %f ] matrix concatmatrix\n",
+ Adrx-Adlx, Adry-Adly, Aulx-Adlx, Auly-Adly, Adlx, Adly)
+ print "concat"
+ print "0 setlinecap 0 setlinejoin 10 setmiterlimit [] 0 setdash"
+ print "1 setlinewidth 0 setgray newpath"
+ print "%StartInclude"
+#
+ comments=1
+ while (getline s < Ename[i] >0)
+ if ((s!~/^%[%!\*]/) || (comments==0)) {
+ comments=0; gsub(/fshow/, "nshow", s); print s
+ }
+ close(Ename[i])
+#
+ print "%StopInclude"
+ print "count MEPSocount sub {pop} repeat"
+ print "countdictstack MEPSdcount sub {end} repeat"
+ print "grestore MEPSSave restore end"
+ print "%EndInclude"
+}
+
+
diff --git a/graphics/metapost/contrib/macros/epsincl/epsincl.bat b/graphics/metapost/contrib/macros/epsincl/epsincl.bat
new file mode 100644
index 0000000000..fd56369f7f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/epsincl.bat
@@ -0,0 +1,11 @@
+:: made in BOP s.c., bop@bop.com.pl; public domain software
+:: history: 20.08.1999: ver. 0.1, pre-release
+:: 05.01.2000: ver. 0.2, first release
+@echo off
+if "%2"=="" goto USAGE
+gawk -f epsincl.awk %1 > %2
+goto DONE
+:USAGE
+echo USAGE:
+echo epsincl inputfile outputfile
+:DONE
diff --git a/graphics/metapost/contrib/macros/epsincl/epsincl.mp b/graphics/metapost/contrib/macros/epsincl/epsincl.mp
new file mode 100644
index 0000000000..27b1f6bc00
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/epsincl.mp
@@ -0,0 +1,116 @@
+%%% addto closefrom readfrom
+% made in BOP s.c., bop@bop.com.pl; public domain software
+% history: 20.08.1999: ver. 0.1, pre-release
+% 05.01.2000: ver. 0.2, first release
+
+def verify_operator primary x = x if not x: expandafter gobble fi enddef;
+
+if not verify_operator known closefrom "????????": % tricky, isn't it
+% |closefrom| primitive is available in MP since ver. 0.64
+ def closefrom expr eps_name =
+ forever: exitif (readfrom eps_name)=EOF; endfor
+ enddef;
+fi
+
+% The structure |eps_data| is presumed to be local for a given figure.
+% If the same outer picture is to be included in several figures, its
+% header must be examined each time anew. This is necassary if we want
+% to include EPS files generated by METAPOST; otherwise we would have
+% to store the information about the fonts used in EPS files being
+% included. Note that the possibility of multiple reading necessitates
+% using the |closefrom| operator.
+
+def ini_eps =
+% The common construction |save eps_data| must not be used,
+% because of implicit reference to |ini_eps| in |use_eps|.
+ numeric eps_data.used[\\];
+ string eps_data.name[\\];
+ pair eps_data.ll[\\], eps_data.ur[\\];
+ color eps_data.col[\\];
+ eps_data.num:=0; eps_data.col[eps_data.num]=(0, 1, .5);
+enddef;
+
+vardef fix_eps(expr eps_name) =
+ save i_, j_, k_, l_, n_;
+ i_:=0;
+ forever:
+ i_:=i_+1; exitif i_>eps_data.num; exitif eps_data.name[i_]=eps_name;
+ endfor
+ if i_<=eps_data.num: errmessage "EPS " & eps_name & " already fixed";
+ else:
+ forever:
+ string l_; % this improves string memory handling (why?)
+ l_:=readfrom eps_name; exitif l_=EOF;
+ if substring (0,14) of l_="%%BoundingBox:":
+ j_:=14;
+ for k_=1,2,3,4:
+ i_:=j_;
+ forever: % scan spaces
+ exitif (substring (i_,i_+1) of l_) <> " "; i_:=i_+1;
+ endfor
+ j_:=i_;
+ forever: % scan digits
+ exitif ((substring (j_,j_+1) of l_) = " ")
+ or ((substring (j_,j_+1) of l_) = "");
+ j_:=j_+1;
+ endfor
+ n_[k_]:=scantokens substring (i_,j_) of l_;
+ endfor;
+ elseif substring (0,7) of l_="%*Font:": special l_;
+ elseif substring (0,1) of l_<>"%":
+ expandafter exitif expandafter true expandafter; % avoid ``dangling'' fi
+ fi
+ endfor
+ eps_data.num:=eps_data.num+1;
+ eps_data.name[eps_data.num]:=eps_name;
+ if l_=EOF:
+ eps_data.used[eps_data.num]:=-1;
+ message "EPS file " & eps_name & " malformed or not found.";
+ else:
+ eps_data.used[eps_data.num]:=0;
+ eps_data.ll[eps_data.num]:=(n_1, n_2);
+ eps_data.ur[eps_data.num]:=(n_3, n_4);
+ eps_data.col[eps_data.num]:=eps_data.col0+1/1000eps_data.num*(1, -1,0);
+ fi
+ closefrom eps_name;
+ fi
+enddef;
+
+vardef use_eps(expr eps_name) =
+ if unknown eps_data.num: ini_eps; fi
+ save currentpicture; picture currentpicture; currentpicture:=nullpicture;
+ save i_; i_:=0;
+ forever:
+ i_:=i_+1;
+ exitif i_>eps_data.num;
+ exitif eps_data.name[i_]=eps_name;
+ endfor
+ if i_>eps_data.num: fix_eps(eps_name); fi
+ % invariant: |(eps_data.name[i_]=eps_name) && known eps_data.used[i_]|
+ if eps_data.used[i_]>=0: % fixing was successful
+ fill unitsquare
+ xscaled xpart(eps_data.ur[i_]-eps_data.ll[i_])
+ yscaled ypart(eps_data.ur[i_]-eps_data.ll[i_])
+ withcolor eps_data.col[i_];
+ if eps_data.used[i_]=0:
+ special "%EPS "
+ & decimal(redpart(eps_data.col[i_])) & " "
+ & decimal(greenpart(eps_data.col[i_])) & " "
+ & decimal(bluepart(eps_data.col[i_])) & " "
+ & eps_name & " "
+ & decimal(xpart(eps_data.ll[i_])) & " "
+ & decimal(ypart(eps_data.ll[i_])) & " "
+ & decimal(xpart(eps_data.ur[i_])) & " "
+ & decimal(ypart(eps_data.ur[i_]));
+ eps_data.used[i_]:=1;
+ fi
+ currentpicture
+ else: % fixing failed (either missing file or bounding box not found)
+ nullpicture
+ fi
+enddef;
+
+extra_beginfig:=extra_beginfig & ";ini_eps;";
+
+endinput;
+%%\end
diff --git a/graphics/metapost/contrib/macros/epsincl/testinc0.eps b/graphics/metapost/contrib/macros/epsincl/testinc0.eps
new file mode 100644
index 0000000000..28c3ea8001
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/testinc0.eps
@@ -0,0 +1,114 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: GhostScript rev. 540
+%%BoundingBox: -8.642 -147.685 210.468 22.11
+%%EndComments
+%%BeginProlog
+/GSexport 100 dict def GSexport begin
+/h {closepath} def
+/m {moveto} def
+/c {curveto} def
+/l {lineto} def
+/k {setcmykcolor} def
+/K {setcmykcolor} def
+/*u {/oper_kind -1 def} def
+/*U {*U*f *U*d *U*c} def
+/f {/oper_kind 0 def} def
+/*U*f {0 oper_kind eq {eofill} if} def
+/s {closepath /oper_kind 1 def} def
+/S {/oper_kind 1 def} def
+/*U*d {1 oper_kind eq {stroke} if} def
+/W {} def
+/n {/oper_kind 2 def} def
+/*U*c {2 oper_kind eq {eoclip newpath} if} def
+/w {setlinewidth} def
+/j {setlinejoin} def
+/J {setlinecap} def
+/M {setmiterlimit} def
+/d {setdash} def
+/setcmykcolor where {pop}
+ {/setcmykcolor {1 sub /mf exch def
+ 3 {mf add neg dup 0 lt {pop 0} if 3 1 roll} repeat
+ setrgbcolor} def} ifelse
+/q {gsave} def
+/Q {grestore} def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+*u
+1 1 0 0 k
+-6.137 -5.033 m
+0.643 -14.716 9.125 -23.088 18.897 -29.74 c
+29.082 -36.673 40.683 -41.669 53.008 -41.669 c
+63.424 -41.669 73.447 -38.22 82.504 -33.085 c
+90.97 -28.285 98.514 -22.085 105.999 -15.873 c
+112.765 -10.258 119.54 -4.595 127.194 -0.259 c
+133.852 3.513 141.161 6.236 148.819 6.236 c
+157.826 6.236 166.216 2.355 173.661 -2.707 c
+182.295 -8.575 189.764 -15.996 195.689 -24.592 c
+198.181 -28.207 203.352 -28.573 206.859 -25.696 c
+210.16 -22.989 210.468 -18.103 207.964 -14.526 c
+201.184 -4.843 192.701 3.529 182.93 10.181 c
+172.745 17.114 161.144 22.11 148.819 22.11 c
+138.402 22.11 128.379 18.661 119.323 13.526 c
+110.857 8.726 103.312 2.526 95.828 -3.686 c
+89.062 -9.301 82.286 -14.964 74.632 -19.3 c
+67.974 -23.072 60.665 -25.795 53.008 -25.795 c
+44.001 -25.795 35.611 -21.914 28.165 -16.852 c
+19.531 -10.984 12.062 -3.563 6.137 5.033 c
+3.646 8.648 -1.525 9.014 -5.033 6.137 c
+-8.334 3.43 -8.642 -1.456 -6.137 -5.033 c
+f
+*U
+*u
+1 1 0 0 k
+-6.137 -58.04 m
+0.643 -67.724 9.125 -76.096 18.897 -82.748 c
+29.082 -89.681 40.683 -94.677 53.008 -94.677 c
+63.424 -94.677 73.447 -91.228 82.504 -86.093 c
+90.97 -81.293 98.514 -75.092 105.999 -68.881 c
+112.765 -63.266 119.54 -57.603 127.194 -53.266 c
+133.852 -49.495 141.161 -46.772 148.819 -46.772 c
+157.826 -46.772 166.216 -50.653 173.661 -55.714 c
+182.295 -61.583 189.764 -69.004 195.689 -77.599 c
+198.181 -81.215 203.352 -81.58 206.859 -78.704 c
+210.16 -75.997 210.468 -71.111 207.964 -67.534 c
+201.184 -57.851 192.701 -49.479 182.93 -42.827 c
+172.745 -35.894 161.144 -30.898 148.819 -30.898 c
+138.402 -30.898 128.379 -34.347 119.323 -39.482 c
+110.857 -44.282 103.312 -50.482 95.828 -56.694 c
+89.062 -62.308 82.286 -67.972 74.632 -72.308 c
+67.974 -76.08 60.665 -78.803 53.008 -78.803 c
+44.001 -78.803 35.611 -74.921 28.165 -69.86 c
+19.531 -63.991 12.062 -56.571 6.137 -47.975 c
+3.646 -44.36 -1.525 -43.994 -5.033 -46.87 c
+-8.334 -49.577 -8.642 -54.463 -6.137 -58.04 c
+f
+*U
+*u
+1 1 0 0 k
+-6.137 -111.048 m
+0.643 -120.732 9.125 -129.103 18.897 -135.755 c
+29.082 -142.689 40.683 -147.685 53.008 -147.685 c
+63.424 -147.685 73.447 -144.235 82.504 -139.1 c
+90.97 -134.301 98.514 -128.1 105.999 -121.889 c
+112.765 -116.274 119.54 -110.61 127.194 -106.274 c
+133.852 -102.503 141.161 -99.779 148.819 -99.779 c
+157.826 -99.779 166.216 -103.661 173.661 -108.722 c
+182.295 -114.591 189.764 -122.012 195.689 -130.607 c
+198.181 -134.222 203.352 -134.588 206.859 -131.712 c
+210.16 -129.005 210.468 -124.119 207.964 -120.542 c
+201.184 -110.858 192.701 -102.487 182.93 -95.835 c
+172.745 -88.901 161.144 -83.905 148.819 -83.905 c
+138.402 -83.905 128.379 -87.355 119.323 -92.49 c
+110.857 -97.289 103.312 -103.49 95.828 -109.701 c
+89.062 -115.316 82.286 -120.98 74.632 -125.316 c
+67.974 -129.087 60.665 -131.811 53.008 -131.811 c
+44.001 -131.811 35.611 -127.929 28.165 -122.868 c
+19.531 -116.999 12.062 -109.578 6.137 -100.983 c
+3.646 -97.368 -1.525 -97.002 -5.033 -99.878 c
+-8.334 -102.585 -8.642 -107.471 -6.137 -111.048 c
+f
+*U
+%%Trailer
+end
+showpage
diff --git a/graphics/metapost/contrib/macros/epsincl/testincl.bat b/graphics/metapost/contrib/macros/epsincl/testincl.bat
new file mode 100644
index 0000000000..e09233f069
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/testincl.bat
@@ -0,0 +1,3 @@
+@echo off
+mpost testincl.mp
+call epsincl testincl.100 testincl.eps
diff --git a/graphics/metapost/contrib/macros/epsincl/testincl.mp b/graphics/metapost/contrib/macros/epsincl/testincl.mp
new file mode 100644
index 0000000000..0db25cca4a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/testincl.mp
@@ -0,0 +1,10 @@
+input epsincl;
+
+tertiarydef p scaledto x = p scaled (x/xpart(urcorner(p)-llcorner(p))) enddef;
+
+beginfig(100);
+ label(use_eps("testinc0.eps") rotated 30 scaledto 100mm, origin);
+ label(image(fill unitsquare scaled 2mm rotated 45), origin) withcolor .7white;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/epsincl/testincl.sh b/graphics/metapost/contrib/macros/epsincl/testincl.sh
new file mode 100644
index 0000000000..c5de96e7c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/epsincl/testincl.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+## test of EPS inclusion in METAPOST file
+mpost testincl.mp
+gawk -f epsincl.awk testincl.100 > testincl.eps
diff --git a/graphics/metapost/contrib/macros/expressg/README b/graphics/metapost/contrib/macros/expressg/README
new file mode 100644
index 0000000000..f267a4f162
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/README
@@ -0,0 +1,101 @@
+ The expressg MetaPost package provides facilities to assist in
+drawing diagrams that consist of boxes, lines, and annotations,
+such as IDEF or UML. Particular support is provided for creating
+EXPRESS-G diagrams.
+
+-----------------------------------------------------------------
+ Author: Peter Wilson (CUA) now at peter.r.wilson@boeing.com until June 2004
+ (or: pandgwilson at earthlink dot net)
+ Copyright 2001, 2002, 2003, 2004 Peter R. Wilson
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3 of this license or (at your option) any
+ later version.
+ The latest version of the license is in
+ http://www.latex-project.org/lppl.txt
+ and version 1.3 or later is part of all distributions of
+ LaTeX version 2003/06/01 or later.
+
+ This work has the LPPL maintenance status "author-maintained".
+
+ This work consists of the files:
+README (this file)
+expressg.dtx
+expressg.ins
+ and the derived files:
+expressg.pdf
+expressg.mp
+expeg.mp
+expeg.tex
+n2mps.sh
+n2mpsprl.prl
+
+-----------------------------------------------------------------
+
+ The distribution consists of the following files:
+README (this file)
+expressg.ins
+expressg.dtx
+expressg.pdf (approximately 100 pages)
+expeg.pdf
+aam.mp
+aamfigs.tex
+aamfigs.pdf
+
+Changes in version 1.61 (2004/03/17)
+o Added parentheses to namespace macro
+
+Changes in version 1.6 (2004/02/29)
+o Additional `box' types: outputbox, stickfigure, bullseye
+
+Changes in version 1.5 (2003/07/31)
+o Minor bug fixes
+
+Changes in version 1.4 (2000/07/10)
+o Additional line end types
+
+Changes in version 1.3 (2000/05/22)
+o Additional box and line types
+o Additional examples
+o Scripts for copying files basename.N to basenameN.mps,
+ where N is an integer
+
+Changes in version 1.2 (1999/11/15)
+o Additional examples
+
+Changes in version 1.1 (1999/10/30)
+o New path calculation routines
+o Improved documentation
+
+Changes in version 1.0 (1996/05/09)
+o First public release
+
+ To install the package:
+o run: latex expressg.ins (which will generate expressg.mp,
+ expeg.mp, expeg.tex, n2mps.sh and n2mpsprl.prl)
+o run: latex expressg.dtx
+ (Note: if you don't have the docmfp package, read the instructions
+ at the start of this file)
+o If you want an index then run: makeindex -s gind.ist expressg
+o run: latex expressg.dtx
+o Print expressg.dvi for a hardcopy of the package manual
+o Move expressg.mp to a location where MetaPost will find it.
+o To use the scripts make them executable (and they may require editing
+ to run on your system).
+
+ The file expeg.ps contains some example diagrams. To generate your
+own copy, and to test your installation:
+o Move expeg.mp and expeg.tex to a working directory
+o Run MetaPost on expeg.mp (probably either as: mp expeg or as: mpost expeg)
+o Run LaTeX on expeg.tex
+o print the result via dvips or other dvi processor that supports PostScript
+ graphics.
+
+ The file aam.mp contains some more example MetaPost code. The
+resulting diagrams are in aamfigs.pdf which has been generated by pdfLaTeX
+from aamfigs.tex.
+
+2004/03/17
+Peter Wilson
+
diff --git a/graphics/metapost/contrib/macros/expressg/aam.mp b/graphics/metapost/contrib/macros/expressg/aam.mp
new file mode 100644
index 0000000000..930c16fb52
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/aam.mp
@@ -0,0 +1,921 @@
+% aam.mp MetaPost for AAM figures
+% Copyright 2000, 2004 Peter R Wilson
+% All rights reserved
+input expressg
+
+verbatimtex
+ \def\twolines#1#2{\vbox{\hbox{#1} \hbox{#2}}}
+ \def\threelines#1#2#3{\vbox{\hbox{#1} \hbox{#2} \hbox{#3}}}
+ \def\fourlines#1#2#3#4{\vbox{\hbox{#1} \hbox{#2} \hbox{#3} \hbox{#4}}}
+etex
+
+
+
+beginfig(5) % FILES
+
+numeric lb[]; numeric hb[]; % box dimens
+lb1 := namespace(btex Root etex)(nextra); % leaf nodes
+lb4 := namespace(btex Root etex)(nextra); % root
+hb1 := onelineh;
+
+numeric upshift, sideshift;
+upshift := 10u;
+sideshift := 5u;
+
+numeric cx[];
+numeric lyc[];
+
+cx1 := 0;
+cx2 := cx1 + sideshift;
+cx3 := cx2 + sideshift;
+cx4 := cx2 + sideshift + lb1;
+cx5 := cx4 + sideshift;
+cx6 := cx4 + sideshift + lb1;
+cx7 := cx6 + sideshift + lb1;
+cx8 := cx7 + sideshift + lb1;
+cx9 := cx8 + sideshift + lb1;
+
+lb2 := (cx9-cx1); % FILES 1 length
+
+cx11 := cx9 + sideshift;
+cx12 := cx11 + sideshift;
+cx13 := cx12 + sideshift + lb1;
+cx14 := cx13 + 0.5*(sideshift + lb1);
+cx15 := cx13 + sideshift + lb1;
+cx16 := cx14 + sideshift + lb1;
+cx17 := cx16 + sideshift + lb1;
+cx18 := cx13 + sideshift;
+
+lb3 := (cx17-cx11); % FILES 2 length
+
+lyc1 := 0;
+lyc2 := lyc1 + upshift;
+lyc3 := lyc2 + upshift + hb1;
+lyc4 := lyc3 + upshift + hb1;
+
+hb3 := (lyc4 + upshift + hb1 -lyc1); % FILES 2 height
+
+lyc5 := lyc2 + hb1;
+lyc6 := lyc5 + upshift + hb1;
+lyc7 := lyc6 + upshift + hb1;
+lyc8 := lyc7 + upshift + hb1;
+lyc9 := lyc8 + upshift + hb1;
+
+hb2 := (lyc9 - lyc5); % FILES 1 height
+
+%% left FILE
+z15=(cx1,lyc5);
+drawENT(15, lb2, hb2)(" ");
+label.top(btex FILE 1 etex, z15bm);
+
+%% right file
+z111=(cx11,lyc1);
+drawENT(111, lb3, hb3)("");
+label.top(btex FILE 2 etex, z111bm);
+
+%% bottom row of left tree
+z26=(cx2,lyc6); drawENT(26, lb1, hb1)(btex N3 etex);
+z46=(cx4,lyc6); drawENT(46, lb1, hb1)(btex N4 etex);
+z66=(cx6,lyc6); drawENT(66, lb1, hb1)(btex N5 etex);
+z76=(cx7,lyc6); drawENT(76, lb1, hb1)(btex N6 etex);
+z86=(cx8,lyc6); drawENT(86, lb1, hb1)(btex L2 etex);
+
+%% middle row of left tree
+z37=(cx3,lyc7); drawENT(37, lb1, hb1)(btex N1 etex);
+z57=(cx5,lyc7); drawENT(57, lb1, hb1)(btex L1 etex);
+z77=(cx7,lyc7); drawENT(77, lb1, hb1)(btex N2 etex);
+
+%% top row of left tree
+z68=(cx6,lyc8); drawENT(68, lb4, hb1)(btex Root etex);
+
+%% bottom row right tree
+z142=(cx14,lyc2); drawENT(142, lb1, hb1)(btex F4 etex);
+z162=(cx16,lyc2); drawENT(162, lb1, hb1)(btex F5 etex);
+
+%% middle row of right tree
+z123=(cx12,lyc3); drawENT(123, lb1, hb1)(btex F1 etex);
+z133=(cx13,lyc3); drawENT(133, lb1, hb1)(btex F2 etex);
+z153=(cx15,lyc3); drawENT(153, lb1, hb1)(btex F3 etex);
+
+%% top row of right tree
+z184=(cx18,lyc4); drawENT(184, lb4, hb1)(btex Root etex);
+
+%%%%%%%%%%%%%%%%%%% lines
+
+%%% thick lines
+
+%% Arrow L1 to N5 (57-66)
+z66A=1/4[z66tl,z66tr];
+pickup thickpen;
+drawnormalCA(57bm,66A);
+pickup normalpen;
+
+%% Arrow L2 to F4 (86-142)
+pickup thickpen;
+drawnormalCA(86bm,142ml);
+pickup normalpen;
+
+%%% thin lines
+pickup thinpen;
+
+%%% file 1
+
+%% N1 to N3 & N4 (37, 26, 46)
+x36=x37bm; y36=1/2[y26tm,y37bm];
+VyV(26tm, 36, 46tm);
+drawnormalfour(26tm, 26tm.vyv, 46tm.vyv, 46tm);
+drawnormal(37bm,36);
+
+%% N2 to N5, N6 & L2 (77, 66, 76, 86)
+x76A=x76tm; y76A=1/2[y76tm,y77bm];
+VyV(66tm, 76A, 86tm);
+drawnormalfour(66tm, 66tm.vyv, 86tm.vyv, 86tm);
+drawnormal(77bm, 76tm);
+
+%% Root to N1, L1 and N2 (68, 37, 57, 77)
+x68A=x68bm; y68A=1/2[y57tm,y68bm];
+VyV(37tm, 68A, 77tm);
+drawnormalfour(37tm, 37tm.vyv, 77tm.vyv, 77tm);
+drawnormal(68bm,68A);
+z57A=(x57tm,y68A);
+drawnormal(57A, 57tm);
+
+%%% file 2
+
+%% F3 to F4 and F5 (153, 142, 162)
+x153A=x153bm; y153A=1/2[y142tm,y153bm];
+VyV(142tm, 153A, 162tm);
+drawnormalfour(142tm, 142tm.vyv, 162tm.vyv, 162tm);
+drawnormal(153bm, 153A);
+
+%% Root to F1, F2 and F3 (184, 123, 133, 153)
+x184A=x184bm; y184A=1/2[y184bm,y133tm];
+VyV(123tm, 184A, 153tm);
+drawnormalfour(123tm, 123tm.vyv, 153tm.vyv, 153tm);
+drawnormal(184bm,184A);
+z133A=(x133tm,y184A);
+drawnormal(133tm,133A);
+
+
+
+pickup normalpen;
+
+endfig;
+
+%%end
+
+
+
+beginfig(3) % DATA FLOW
+
+
+smoothrad := 2u;
+
+numeric lb, hb; % length & height of boxes
+lb := namespace(btex Analysis Process A0 etex)(nextra);
+hb := 5onelineh;
+
+numeric hspace[];
+hspace1 := namespace(btex Geometry (ISO 10303-203, or other source) etc etex)(ndextra);
+
+numeric upshift; % vertical distance between rows
+upshift = 5u; % 20u
+numeric sideshift; % horizontal distance between boxes
+sideshift = 5u; % 10u;
+
+numeric lb[];
+
+%lb5 := namespace(btex to Model and etex)(nextra);
+lb5 := namespace(btex Computational etex)(nextra);
+lb1 := lb5;
+lb2 := lb5;
+lb3 := lb5;
+lb4 := lb5;
+lb6 := lb5;
+lb25 := lb5;
+lb41 := lb5;
+lb65 := lb5;
+lb84 := lb1;
+
+numeric hb[];
+
+hb1 := 4onelineh;
+hb2 := hb1;
+hb3 := hb1;
+hb4 := hb1;
+hb5 := 4onelineh;
+hb6 := hb5;
+hb25 := 4onelineh;
+hb41 := hb25;
+hb65 := hb25;
+hb84 := 3/2hb1;
+
+numeric lyc[];
+lyc1 := 0;
+lyc2 := lyc1 + hb41;
+lyc3 := lyc2 + upshift + hb6;
+lyc5 := lyc3 + hb5;
+lyc4 := 1/2[lyc3,lyc5];
+lyc6 := lyc5 + upshift;
+lyc7 := lyc5 + 4upshift + hb25;
+lyc8 := lyc7 + 1/2hb1;
+lyc9 := lyc8 + upshift;
+
+numeric cx[];
+cx1 := 0;
+cx2 := cx1 + sideshift;
+cx3 := cx2 + sideshift + lb25;
+cx4 := cx3 + sideshift + lb1;
+cx5 := cx4 + sideshift + lb41;
+cx6 := cx5 + sideshift + lb5;
+cx7 := cx6 + sideshift + lb65;
+cx8 := cx7 + lb4;
+cx9 := cx8 + sideshift;
+
+%%% Modified geometry
+z41=(cx4,lyc1);
+drawdrum(41, lb41, hb41)(btex \threelines{Modified}{Geometry}{Data} etex);
+%%dotlabel.llft("41", z41);
+
+%%% Optimize Geometry (A6)
+z52=(cx5,lyc2);
+drawENT(52, lb6, hb6)(btex \threelines{Optimize}{Geometry}{(A6)} etex);
+%%dotlabel.llft("52", z52);
+
+%%% Adaptive Modification (A5)
+z53=(cx5,lyc3);
+drawENT(53, lb5, hb5)(btex \fourlines{Adaptive}{Modification}{to Model and}{Process (A5)} etex);
+%%dotlabel.llft("53", z53);
+
+%%% Initial Geometry
+z25=(cx2,lyc5);
+drawdrum(25, lb25, hb25)(btex \twolines{Geometry}{Data} etex);
+%%dotlabel.llft("25", z25);
+
+%%% Aerodynamic data
+z65=(cx6,lyc5);
+drawdrum(65, lb65, hb65)(btex \twolines{Aerodynamic}{Data} etex);
+%%dotlabel.llft("65", z65);
+
+
+%%% Acquire & Modify Geometery (A1)
+z37=(cx3,lyc7);
+drawENT(37, lb1, hb1)(btex \fourlines{Acquire and}{Modify}{Geometry}{(A1)} etex);
+%%dotlabel.llft("37", z37);
+
+
+%%% Extract Engineering Data (A4)
+z77=(cx7,lyc7);
+drawENT(77, lb4, hb4)(btex \threelines{Extract}{Engineering}{Data (A4)} etex);
+%%dotlabel.llft("77", z77);
+
+%%% Build Computational Model (A2)
+z57=(cx5,lyc7);
+drawENT(57, lb2, hb2)(btex \threelines{Build}{Computational}{Model (A2)} etex);
+%%dotlabel.llft("57", z57);
+
+%%% Compute Flowfield (A3)
+z67=(cx6,lyc7);
+drawENT(67, lb3, hb3)(btex \threelines{Compute}{Flowfield}{(A3)} etex);
+%%dotlabel.llft("67", z67);
+
+%%% End Users
+z84=(cx8,lyc4);
+drawASDT(84, lb84, hb84)(btex \twolines{END}{USERS} etex);
+%%dotlabel.llft("84", z84);
+
+
+%%%%%%%%%%%%%%%%%%%%%%% lines
+
+%%% Geometry INPUT
+z18=(cx1,lyc8);
+VH(25tml,18);
+drawnormal(18, 25tml.vh);
+drawnormalCA(25tml.vh, 25tml);
+smooth(18, 25tml.vh, 25tml);
+label.top(btex Geometry etex, z18);
+
+%%% Geom -> A1 (25-37)
+VH(25tmr, 37ml);
+drawnormal(25tmr, 25tmr.vh);
+drawnormalCA(25tmr.vh, 37ml);
+smooth(25tmr, 25tmr.vh, 37ml);
+
+%%% A1 -> Modified Geom (37-41)
+VH(41tml, 37mr);
+drawnormalthreeCA(37mr, 41tml.vh, 41tml);
+smooth(37mr, 41tml.vh, 41tml);
+
+%%% Modified Geom -> A2 (41-57)
+VH(41tm, 57ml);
+drawnormalthreeCA(41tm, 41tm.vh, 57ml);
+smooth(41tm, 41tm.vh, 57ml);
+
+%%% Adaptive A5 -> Mod Geom (53-41) & A6 -> Mod Geom (52-41)
+VH(41tmr, 53ml);
+drawnormalthreeCA(53ml, 41tmr.vh, 41tmr);
+z42=(x41tmr, y52ml);
+drawnormal(52ml,42);
+smooth(53ml, 41tmr.vh, 41tmr);
+smooth(52ml, 42, 41tmr);
+
+%% Aero Data -> Adapt mod (A5) & Opt Geom (A6) (65-53,52)
+VH(65bm, 52mr);
+drawnormalthreeCA(65bm, 65bm.vh, 52mr);
+z63=(x65bm, y53mr);
+drawnormalCA(63, 53mr);
+smooth(65bm, 65bm.vh, 52mr);
+smooth(65bm, 63, 53mr);
+
+%% Mod Geom -> USERS (41-84)
+z84A=1/4[z84bl,z84tl];
+%%HvH(41mr, 84A);
+HxH(41mr, 77bm, 84A)
+drawnormalfourCA(41mr, 41mr.hxh, 84A.hxh, 84A);
+smoothtwo(41mr, 41mr.hxh, 84A.hxh, 84A);
+
+%% Aero -> Model (65-57)
+VhV(65tml, 57bm);
+drawnormalthreeCA(65tml.vhv, 57bm.vhv, 57bm);
+drawnormalCA(65tml.vhv, 65tml);
+smoothtwo(65tml, 65tml.vhv, 57bm.vhv, 57bm);
+
+%% Aero -> Flowfield (65-67)
+drawnormalCA(65tm,67bm);
+drawnormalCA(67bm,65tm);
+
+%% Aero -> Data (65-77)
+VhV(65tmr, 77bm);
+drawnormalthreeCA(65tmr.vhv, 77bm.vhv, 77bm);
+drawnormalCA(65tmr.vhv, 65tmr);
+smoothtwo(65tmr, 65tmr.vhv, 77bm.vhv, 77bm);
+
+%% Aero -> USERS (65-84)
+z84B=(x84bl, y65mr);
+drawnormalCA(65mr, 84B);
+
+%% Data -> USERS (77-84)
+VH(84tm,77mr);
+drawnormalthreeCA(77mr, 84tm.vh, 84tm);
+smooth(77mr, 84tm.vh, 84tm);
+
+
+%%%%%%%%% test smoothed dashed/dotted line
+VH(25bm,41ml);
+%%drawdashthree(25bm, 25bm.vh, 41ml);
+%%smoothdash(25bm, 25bm.vh, 41ml);
+drawdotsthree(25bm, 25bm.vh, 41ml);
+smoothdots(25bm, 25bm.vh, 41ml);
+
+endfig; % end fig 3
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%%end
+%%%%%%%%%%%%%%%%%%%%%%%%%
+
+beginfig(1) % IDEF A0 model
+
+%%%%drawgrid;
+
+smoothrad := 2u;
+
+numeric lb, hb; % length & height of boxes
+lb := namespace(btex Analysis Process A0 etex)(nextra);
+hb := 5onelineh;
+
+numeric hspace[];
+hspace1 := namespace(btex Geometry (ISO 10303-203, or other source) etc etex)(ndextra);
+
+numeric upshift; % vertical distance between rows
+upshift = 20u;
+numeric sideshift; % horizontal distance between boxes
+sideshift = 10u;
+
+numeric lyc[];
+lyc1 := 0;
+lyc2 := lyc1;% +upshift;
+lyc3 := lyc2+upshift;
+lyc4 := lyc3+upshift+hb;
+lyc5 := lyc4;% +upshift;
+
+%%%%%%%%%%%%%%%%%%%% A0 box
+z33=(hspace1,lyc3);
+drawENT(33, lb, hb)(btex \threelines{Computational}{Fluid Dynamics}{Analysis Process} etex);
+label.ulft(btex A0 etex, z33br);
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Inputs
+z33A=1/8[z33bl,z33tl];
+z33B=z33ml;
+z33C=7/8[z33bl,z33tl];
+z13=(0,y33A); z14=(0,y33B); z15=(0,y33C);
+drawnormalCA(13,33A);
+label.urt(btex Analysis Objectives etex, z13);
+drawnormalCA(14,33B);
+label.urt(btex Definition of Expected Flow Physics etex, z14);
+drawnormalCA(15,33C);
+label.urt(btex Geometry (ISO 10303-203, or other source) etex, z15);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Outputs
+z33D=1/8[z33br,z33tr];
+z33E=z33mr;
+z33F=7/8[z33br,z33tr];
+
+hspace2 := x33br+namespace(btex Flowfield Data etex)(ndextra);
+z63=(hspace2,y33D); z64=(hspace2,y33E); z65=(hspace2,y33F);
+drawnormalCA(33D,63);
+label.rt(btex Flowfield Data etex, z63);
+drawnormalCA(33E,64);
+label.rt(btex Optimized Geometry etex, z64);
+drawnormalCA(33F,65);
+label.rt(btex \twolines{Information to Analysis}{Customer} etex, z65);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Resources
+hspace3 := namespace(btex Organizational etex)(ndextra);
+z33G=1/5[z33bl,z33br];
+z33H=2/5[z33bl,z33br];
+z33I=3/5[z33bl,z33br];
+z33J=4/5[z33bl,z33br];
+hspace4 :=1/5lb;
+
+x41=x33bm + 1/2hspace4 + 1/2hspace3;
+x51=x41+hspace3+hspace4;
+x31=x41-hspace3-hspace4;
+x21=x31-hspace3-hspace4;
+y21=y31=y41=-y51=lyc1;
+label.bot(btex \twolines{Trained}{Staff} etex, z21);
+label.bot(btex \twolines{Computing}{Practices} etex, z31);
+label.bot(btex \twolines{Organizational}{Best Practices} etex, z41);
+label.bot(btex \twolines{Support}{Infrastructure} etex, z51);
+
+y1=1/3[lyc1,lyc3]; y2=2/3[lyc1,lyc3];
+
+VyV(21,2,33G);
+drawnormalthree(21, 21vyv, 33G.vyv);
+drawnormalCA(33G.vyv, 33G);
+smooth(21, 21vyv, 33G.vyv); %smooth(21vyv, 33G.vyv, 33G);
+smooth(33G, 33G.vyv, 21vyv);
+VyV(31,1,33H);
+drawnormalthree(31, 31vyv, 33H.vyv);
+drawnormalCA(33H.vyv, 33H);
+smoothtwo(31, 31vyv, 33H.vyv, 33H);
+VyV(41,1,33I);
+drawnormalthree(41, 41vyv, 33I.vyv);
+drawnormalCA(33I.vyv, 33I);
+smoothtwo(41, 41vyv, 33I.vyv, 33I);
+VyV(51,2,33J);
+drawnormalthree(51, 51vyv, 33J.vyv);
+drawnormalCA(33J.vyv, 33J);
+smooth(51, 51vyv, 33J.vyv); smooth(51vyv, 33J.vyv, 33J);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Controls
+z33M=1/4[z33tl,z33tr];
+z33N=3/4[z33tl,z33tr];
+
+z35=(x31,lyc5); z45=(x41,lyc5);
+label.top(btex \threelines{Mathematical}{Model of Fluid}{Dynamics} etex, z35);
+label.top(btex \twolines{Computing}{Implementation} etex, z45);
+VhV(33M,35);
+drawnormalthree(35, 35vhv, 33M.vhv);
+drawnormalCA(33M.vhv, 33M);
+smoothtwo(35, 35vhv, 33M.vhv, 33M);
+VhV(33N,45);
+drawnormalthree(45, 45vhv, 33N.vhv);
+drawnormalCA(33N.vhv, 33N);
+smoothtwo(45, 45vhv, 33N.vhv, 33N);
+
+endfig; % end fig 1
+
+
+
+beginfig(2) % IDEF A1+ model
+
+%%%%drawgrid;
+
+numeric lb[];
+numeric hb; % length & height of boxes
+lb1 := namespace(btex Acquire and etex)(nextra);
+lb2 := namespace(btex Computational etex)(nextra);
+lb3 := namespace(btex Flow Field etex)(nextra);
+lb4 := namespace(btex Engineering etex)(nextra);
+lb5 := namespace(btex Modification to etex)(nextra);
+lb6 := lb5;
+hb := 4onelineh;
+
+numeric hspace[];
+hspace1 := namespace(btex Geometry (ISO 10303-203, or other source) etc etex)(ndextra);
+
+numeric upshift; % vertical distance between rows
+upshift = 12u;
+numeric sideshift; % horizontal distance between boxes
+sideshift = 10u;
+
+numeric lyc[];
+lyc1 := 0;
+lyc2 := lyc1+1/2upshift;
+lyc3 := lyc2+upshift;
+lyc4 := lyc3+1/2upshift+hb;
+lyc5 := lyc4+1/2upshift+hb;
+lyc6 := lyc5+1/2upshift+hb;
+lyc7 := lyc6 + 1/2upshift + hb;
+lyc8 := lyc7 + 1/2upshift;
+lyc9 := lyc8 + 1/2upshift;
+lyc10 := lyc9+upshift;
+lyc11 := lyc10+upshift;
+
+numeric cx[];
+cx1 := 0;
+cx2 := cx1+sideshift;
+cx3 := cx2+sideshift;
+%%cx4 := cx3+sideshift;
+cx5 := cx3 + 5/4sideshift + lb1;
+%%cx6 := cx5+sideshift;
+cx7 := cx5+sideshift+lb2;
+%%cx8 := cx7+sideshift;
+cx9 := cx7 + 3/4sideshift + lb3;
+%%cx10 := cx9+sideshift;
+cx11 := cx9 + 3/4sideshift + lb4;
+cx12 := cx11+sideshift;
+
+%%%%%%%%%%%%%%%%%%%% A1 box
+z36=(cx3,lyc6);
+drawENT(36, lb1, hb)(btex \threelines{Acquire and}{Modify}{Geometry} etex);
+label.ulft(btex A1 etex, z36br);
+%%dotlabel.urt("z36", z36);
+
+%%%%%%%%%%%%%%%%%%%% A2 box
+z55=(cx5,lyc5);
+drawENT(55, lb2, hb)(btex \threelines{Build}{Computational}{Model (Grid)} etex);
+label.ulft(btex A2 etex, z55br);
+%%dotlabel.urt("z55", z55);
+
+%%%%%%%%%%%%%%%%%%%% A3 box
+z74=(cx7,lyc4);
+drawENT(74, lb3, hb)(btex \twolines{Compute}{Flowfield} etex);
+label.ulft(btex A3 etex, z74br);
+%%dotlabel.urt("z74", z74);
+
+%%%%%%%%%%%%%%%%%%%% A4 box
+z93=(cx9,lyc3);
+drawENT(93, lb4, hb)(btex \threelines{Extract}{Engineering}{Data} etex);
+label.ulft(btex A4 etex, z93br);
+%%dotlabel.urt("z93", z93);
+
+%%%%%%%%%%%%%%%%%%%% A5 box
+z116=(cx11,lyc6);
+drawENT(116, lb5, hb)(btex \fourlines{Adaptive}{Modification to}{Model and}{Process} etex);
+label.ulft(btex A5 etex, z116br);
+%%dotlabel.urt("z116", z116);
+
+%%%%%%%%%%%%%%%%%%%% A6 box
+z114=(cx11+1/2sideshift,lyc4);
+drawENT(114, lb6, hb)(btex \twolines{Optimize}{Geometry} etex);
+label.ulft(btex A6 etex, z114br);
+%%dotlabel.urt("z114", z114);
+
+%%%%%%%%%% Computing Implementation CONTROL
+
+z36A=z36tm; z55A=z55tm; z74A=1/4[z74tl,z74tr]; z93A=z93tm; z116A=z116tm;
+x114A=1/2[x116br,x114br]; y114A=y114tr;
+
+x38=x36A; x58=x55A; x78=x74A; x98=x93A; x1168=x116A; x1148=x114A;
+y38=y58=y78=y98=y1168=y1148=lyc8;
+
+drawnormal(38,1148);
+drawnormalCA(38,36A);
+drawnormalCA(58,55A);
+drawnormalCA(78,74A);
+drawnormalCA(98,93A);
+drawnormalCA(1168,116A);
+drawnormalCA(1148,114A);
+%%dotlabel.lft("z38", z38);
+%%dotlabel.rt("z1148", z1148);
+smooth(36A, 38, 58);
+smooth(55A, 58, 78);
+smooth(58, 78, 74A);
+smooth(78, 98, 93A);
+smooth(98, 1168, 116A);
+smooth(1168, 1148, 114A);
+
+z55B=3/4[z55tl,z55tr];
+z59=(x55B,lyc9); z58B=(x55B,lyc8);
+drawnormal(59,58B);
+label.top(btex \twolines{Computing}{Implementation} etex, z59);
+smooth(59, 58B, 58);
+smooth(59, 58B, 78);
+
+drawnormal(1168,58);
+
+%%%%%%%%%%%%%%%%% Math Model CONTROL
+
+z74B=3/4[z74tl,z74tr];
+z79=(x74B,lyc9);
+
+drawnormalCA(79,74B);
+label.top(btex \twolines{Mathematical Model}{of Fluid Dynamics} etex, z79);
+
+
+%%%%%%%%%%%%%%%%%%%% Support Infrastructure RESOURCE
+
+z93F=4/5[z93bl,z93br];
+z74F=4/5[z74bl,z74br];
+z55F=4/5[z55bl,z55br];
+z36F=4/5[z36bl,z36br];
+x92F=x93F; x72F=x74F; x52F=x55F; x32F=x36F;
+y92F=y72F=y52F=y32F=lyc2;
+
+drawnormal(32F,92F);
+
+x82F=1/2[x74br,x93bl];
+y82F=y92F;
+z81F=(x82F,lyc1);
+drawnormal(81F,82F);
+label.bot(btex \twolines{Support}{Infrastructure} etex, z81F);
+
+drawnormalCA(92F,93F);
+drawnormalCA(72F,74F);
+drawnormalCA(52F,55F);
+drawnormalCA(32F,36F);
+smooth(93F, 92F, 72F);
+smooth(92F, 72F, 74F);
+smooth(72F, 52F, 55F);
+smooth(52F, 32F, 36F);
+
+smooth(81F, 82F, 92F);
+smooth(81F, 82F, 72F);
+
+drawnormal(52F,72F);
+
+%%%%%%%%%%%%%%%%%%%%%%% Practices RESOURCE
+
+z93E=3/5[z93bl,z93br];
+z74E=3/5[z74bl,z74br];
+z55E=3/5[z55bl,z55br];
+z36E=3/5[z36bl,z36br];
+x92E=x93E; x72E=x74E; x52E=x55E; x32E=x36E;
+y92E=y72E=y52E=y32E=1/4[lyc2,lyc3];
+
+drawnormal(32E,92E);
+
+x62E=1/2[x55br,x74bl];
+y62E=y92E;
+z61E=(x62E,lyc1);
+drawnormal(61E,62E);
+label.bot(btex \twolines{Organizational}{Best Practices} etex, z61E);
+
+drawnormalCA(92E,93E);
+drawnormalCA(72E,74E);
+drawnormalCA(52E,55E);
+drawnormalCA(32E,36E);
+smoothtwo(61E, 62E, 92E, 93E);
+smoothtwo(61E, 62E, 32E, 36E);
+smooth(62E, 72E, 74E);
+smooth(62E, 52E, 55E);
+
+%%%%%%%%%%%%%%%%%%%%%%% Computing Assets RESOURCE
+
+z93D=2/5[z93bl,z93br];
+z74D=2/5[z74bl,z74br];
+z55D=2/5[z55bl,z55br];
+z36D=2/5[z36bl,z36br];
+x92D=x93D; x72D=x74D; x52D=x55D; x32D=x36D;
+y92D=y72D=y52D=y32D=2/4[lyc2,lyc3];
+
+drawnormal(32D,92D);
+
+x42D=1/2[x36br,x55bl];
+y42D=y92D;
+z41D=(x42D,lyc1);
+drawnormal(41D,42D);
+label.bot(btex \twolines{Computing}{Assets} etex, z41D);
+
+drawnormalCA(92D,93D);
+drawnormalCA(72D,74D);
+drawnormalCA(52D,55D);
+drawnormalCA(32D,36D);
+
+smoothtwo(41D, 42D, 92D, 93D);
+smoothtwo(41D, 42D, 32D, 36D);
+smooth(42D, 72D, 74D);
+smooth(42D, 52D, 55D);
+
+
+%%%%%%%%%%%%%%%%%%%%%%% Staff RESOURCE
+
+z93C=1/5[z93bl,z93br];
+z74C=1/5[z74bl,z74br];
+z55C=1/5[z55bl,z55br];
+z36C=1/5[z36bl,z36br];
+x92C=x93C; x72C=x74C; x52C=x55C; x32C=x36C;
+y92C=y72C=y52C=y32C=3/4[lyc2,lyc3];
+
+drawnormal(32C,92C);
+
+x42C=1/2[x36br,x55bl];
+y42C=y92C;
+z41C=(x62C,lyc1);
+z31C=(x36C,lyc1);
+drawnormal(31C,32C);
+label.bot(btex \twolines{Trained}{Staff} etex, z31C);
+
+drawnormalCA(92C,93C);
+drawnormalCA(72C,74C);
+drawnormalCA(52C,55C);
+drawnormalCA(32C,36C);
+
+smooth(93C, 92C, 72C);
+smooth(74C, 72C, 52C);
+smooth(55C, 52C, 32C);
+smooth(31C, 32C, 52C);
+
+drawnormal(72C,32C);
+drawnormal(31C,32C);
+
+%%%%%%%%%%%%%%%%% Geometry INPUT
+
+x36G=x36; y36G=2/3[y36bl, y36tl];
+z16G=(cx1, y36G);
+drawnormalCA(16G, 36G);
+label.ulft(btex Geometry etex, z36G);
+
+%%%%%%%%%%%%%%%%%% Optimized Geometry OUTPUT
+
+x114P=x114br; y114P=1/3[y114br,y114tr];
+z124P=(x114P+sideshift, y114P);
+drawnormalCA(114P,124P);
+label.lrt(btex \twolines{Optimized}{Geometry} etex, z114P);
+
+%%%%%%%%%%%%%%%%%%%% A6 -> A2
+
+x114L=x114br; y114L=2/3[y114br,y114tr];
+z124L=(x114L+sideshift, y114L);
+drawnormal(114L,124L);
+
+x55H=x55bl; y55H=4/6[y55bl,y55tl];
+x45H=2/4[x36br,x55H]; y45H=y55H;
+drawnormalCA(45H,55H);
+
+y97A=2/3[y116tl,lyc8];
+VyV(45H, 97A, 124L);
+drawnormalfour(45H, 45H.vyv, 124L.vyv, 124L);
+smoothtwo(114L, 124L, 124L.vyv, 45H.vyv);
+smoothtwo(124L.vyv, 45H.vyv, 45H, 55H);
+
+%%%%%%%%%%%%%%%%%%%%%%%% A1 -> A2
+
+x36M=x36br; y36M=y36mr;
+x55I=x55bl; y55I=3/6[y55bl,y55tl];
+x45I=1/4[x36M,x55I];
+HxH(36M, 45I, 55I);
+drawnormalthree(36M, 36M.hxh, 55I.hxh);
+drawnormalCA(55I.hxh, 55I);
+smoothtwo(36M, 36M.hxh, 55I.hxh, 55I);
+
+%%%%%%%%%%%%%%%%%%%%%%% A2 -> A3
+
+x55M=x55br; y55M=y55mr;
+x74H=x74bl; y74H=3/5[y74bl,y74tl];
+x64H=1/3[x55M,x74H];
+HxH(55M, 64H, 74H);
+drawnormalthree(55M, 55M.hxh, 74H.hxh);
+drawnormalCA(74H.hxh, 74H);
+smoothtwo(55M, 55M.hxh, 74H.hxh, 74H);
+
+
+%%%%%%%%%%%%%%%%%%%%%% A3 -> A4
+
+x74N=x74br; y74N=1/3[y74br,y74tr];
+x93G=x93bl; y93G=3/4[y93bl,y93tl];
+x83G=1/2[x74N,x93G];
+HxH(74N, 83G, 93G);
+drawnormalthree(74N, 74N.hxh, 93G.hxh);
+drawnormalCA(93G.hxh,93G);
+smoothtwo(74N, 74N.hxh, 93G.hxh, 93G);
+
+%%%%%%%%%%%%%%%%%%%%%% A4 -> A5
+
+x93L=x93br; y93L=4/5[y93br,y93tr];
+x116H=x116bl; y116H=1/3[y116bl,y116tl];
+x106H=1/3[x93L,x116H];
+HxH(93L, 106H, 116H);
+drawnormalthree(93L, 93L.hxh, 116H.hxh);
+drawnormalCA(116H.hxh, 116H);
+smoothtwo(93L, 93L.hxh, 116H.hxh, 116H);
+
+%%%%%%%%%%%%%%%%%%%%%%% A4 -> A6
+
+x93M=x93br; y93M=3/5[y93br,y93tr];
+x114H=x114bl; y114H=1/2[y114bl,y114tl];
+x104H=1/2[x93M,x114H];
+HxH(93M, 104H, 114H);
+drawnormalthree(93M, 93M.hxh, 114H.hxh);
+drawnormalCA(114H.hxh, 114H);
+smoothtwo(93M, 93M.hxh, 114H.hxh, 114H);
+
+%%%%%%%%%%%%%%%%%%%%%% A3 -> A5
+
+x74M=x74br; y74M=2/3[y74br,y74tr];
+x116J=x116bl; y116J=2/3[y116bl,y116tl];
+x106J=2/3[x74N,x116J];
+HxH(74M, 106J, 116J);
+drawnormalthree(74M, 74M.hxh, 116J.hxh);
+drawnormalCA(116J.hxh,116J);
+smoothtwo(74M, 74M.hxh, 116J.hxh, 116J);
+
+%%%%%%%%%%%%%%%%%%%% A5 -> A2
+
+x116N=x116br; y116N=1/3[y116br,y116tr];
+x126N=2/3[x114L,x124L]; y126N=y116N;
+drawnormal(116N,126N);
+
+x55G=x55bl; y55G=5/6[y55bl,y55tl];
+x45G=3/4[x36br,x55G]; y45G=y55G;
+drawnormalCA(45G,55G);
+
+y97B=2/3[y116tl,y97A];
+VyV(45G, 97B, 126N);
+drawnormalfour(45G, 45G.vyv, 126N.vyv, 126N);
+smoothtwo(116N, 126N, 126N.vyv, 45G.vyv);
+smoothtwo(126N.vyv, 45G.vyv, 45G, 55G);
+
+%%%%%%%%%%%%%%%%%%%% A5 -> A3
+
+x116M=x116br; y116M=2/3[y116br,y116tr];
+x126M=1/3[x114L,x124L]; y126M=y116M;
+drawnormal(116M,126M);
+
+x74G=x74bl; y74G=4/5[y74bl,y74tl];
+x64G=2/3[x55br,x74G]; y64G=y74G;
+drawnormalCA(64G,74G);
+
+y97C=1/3[y116tl,y97A];
+VyV(64G, 97C, 126M);
+drawnormalfour(64G, 64G.vyv, 126M.vyv, 126M);
+smoothtwo(116M, 126M, 126M.vyv, 64G.vyv);
+smoothtwo(126M.vyv, 64G.vyv, 64G, 74G);
+
+
+%%%%%%%%%%%%%%%%%%%%%% Analysis Objectives INPUT
+
+x36J=x36bl; y36J=1/3[y36bl, y36tl];
+x93I=x93bl; y93I=2/4[y93bl, y93tl];
+x25=cx2; y25=1/2[y55,y36];
+z15=(cx1,y25);
+label.ulft(btex \twolines{Analysis}{Objectives} etex, z25);
+HxH(36J, 25, 93I);
+drawnormalCA(36J.hxh, 36J); % to A1
+drawnormalCA(93I.hxh, 93I); % to A4
+drawnormal(15,25);
+drawnormal(36J.hxh,93I.hxh);
+smoothtwo(15, 25, 36J.hxh, 36J);
+smoothtwo(15, 25, 93I.hxh, 93I);
+
+x55J=x55bl; y55J=2/6[y55bl,y55tl]; % to A2
+z25J=(x25,y55J);
+drawnormalCA(25J,55J);
+smooth(25, 25J, 55J);
+
+x74J=x74bl; y74J=2/5[y74bl,y74tl]; % to A3
+z24J=(x25,y74J);
+drawnormalCA(24J,74J);
+smooth(25, 24J, 74J);
+
+%%%%%%%%%%%%%%%%%%%%%% Flow Physics INPUT
+
+
+x55K=x55bl; y55K=1/6[y55bl,y55tl]; % to A2
+x93J=x93bl; y93J=1/4[y93bl, y93tl]; % to A4
+x25B=1/3[cx2,cx3]; y25B=1/2[y93,y74];
+z15B=(cx1,y25B);
+z25C=(x25,y25B);
+label.ulft(btex \threelines{Definition of}{Expected Flow}{Physics} etex, z25C);
+HxH(55K, 25B, 93J);
+drawnormalCA(55K.hxh, 55K); % to A2
+drawnormalCA(93J.hxh, 93J); % to A4
+drawnormal(15B,25B);
+drawnormal(55K.hxh, 93J.hxh);
+smoothtwo(15B, 25B, 55K.hxh, 55K);
+smoothtwo(15B, 25B, 93J.hxh, 93J);
+
+x74K=x74bl; y74K=1/5[y74bl,y74tl]; % to A3
+z24K=(x25B,y74K);
+drawnormalCA(24K,74K);
+smooth(25B, 24K, 74K);
+
+%%%%%%%%%%%%%%%%%%%%%% Flowfield & Customer OUTPUT
+
+x93N=x93br; y93N=2/5[y93br,y93tr];
+z103N=(x114, y93N);
+drawnormalCA(93N,103N);
+label.urt(btex Flowfield Data etex, z103N);
+
+x93P=x93br; y93P=1/5[y93br,y93tr];
+z103P=(x103N,y93P);
+drawnormalCA(93P,103P);
+label.lrt(btex \twolines{Information to}{Analysis Customer} etex, z103P);
+
+
+
+endfig; % end fig 2
+
+end
+
diff --git a/graphics/metapost/contrib/macros/expressg/aamfigs.pdf b/graphics/metapost/contrib/macros/expressg/aamfigs.pdf
new file mode 100644
index 0000000000..55a02e1280
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/aamfigs.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/expressg/aamfigs.tex b/graphics/metapost/contrib/macros/expressg/aamfigs.tex
new file mode 100644
index 0000000000..00153a8926
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/aamfigs.tex
@@ -0,0 +1,65 @@
+% aamfigs.tex AAM figures
+
+\documentclass[11pt]{article}
+
+% set up for (pdf)LaTeX processing
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+ \pdffalse
+\else
+ \pdftrue
+\fi
+\ifpdf
+ \pdfoutput=1
+ \usepackage[pdftex,final]{graphicx}
+ \DeclareGraphicsRule{*}{mps}{*}{}
+\else
+ \usepackage[final]{graphicx}
+\fi
+\usepackage{rotating} % or \usepackage{isorot}
+
+% isopage.tex Dimensions of an ISO page on US letterpaper
+\setlength{\headheight}{11pt}
+\setlength{\headsep}{10mm}
+\setlength{\topskip}{11pt}
+\setlength{\footskip}{11mm}
+\setlength{\textwidth}{160mm}
+\setlength{\textheight}{221mm}
+\setlength{\columnsep}{10mm}
+\setlength{\topmargin}{-9.4mm}
+\setlength{\oddsidemargin}{1.55mm}
+\setlength{\evensidemargin}{1.55mm}
+
+\title{AAMFIGS.TEX}
+\author{Peter Wilson} \date{22 May 2000}
+\begin{document}
+\maketitle
+\listoffigures
+\clearpage
+
+\begin{sidewaysfigure}
+\centering
+\includegraphics{aam.1}
+\caption{AAM 1}
+\end{sidewaysfigure}
+
+\begin{sidewaysfigure}
+\centering
+\includegraphics{aam.2}
+\caption{AAM 2}
+\end{sidewaysfigure}
+
+\begin{sidewaysfigure}
+\centering
+\includegraphics{aam.3}
+\caption{AAM 3}
+\end{sidewaysfigure}
+
+\begin{figure}
+\centering
+\includegraphics{aam.5}
+\caption{AAM 5}
+\end{figure}
+
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/expressg/expeg.pdf b/graphics/metapost/contrib/macros/expressg/expeg.pdf
new file mode 100644
index 0000000000..326d63b17f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/expeg.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/expressg/expressg.dtx b/graphics/metapost/contrib/macros/expressg/expressg.dtx
new file mode 100644
index 0000000000..f8a737c8e5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/expressg.dtx
@@ -0,0 +1,6553 @@
+% \iffalse meta-comment
+%
+% expressg.dtx
+% Author: Peter Wilson (CUA) now at peter.r.wilson@boeing.com until June 2004
+% (or: pandgwilson at earthlink dot net)
+% Copyright 1996, 2003, 2004 Peter R. Wilson
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 of this license or (at your option) any
+% later version.
+% The latest version of the license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of
+% LaTeX version 2003/06/01 or later.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% This work consists of the files listed in the README file.
+%
+% If you do not have the docmfp package (available from CTAN in
+% tex-archive/macros/latex/contrib/supported), comment out the
+% \usepackage{docmfp} line below and uncomment the line following it.
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{docmfp}
+%%%% \newenvironment{variable}[1]{}{} \newenvironment{routine}[1]{}{}
+\providecommand{\DescribeVariable}[1]{} \providecommand{\DescribeRoutine}[1]{}
+\providecommand{\variablestring}{} \renewcommand{\variablestring}{\space(v)}
+\providecommand{\routinestring}{} \renewcommand{\routinestring}{\space(r)}
+\EnableCrossrefs
+\CodelineIndex
+\setcounter{StandardModuleDepth}{1}
+
+\begin{document}
+ \DocInput{expressg.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \CheckSum{171}
+%
+% \DoNotIndex{\',\.,\@M,\@@input,\@addtoreset,\@arabic,\@badmath}
+% \DoNotIndex{\@centercr,\@cite}
+% \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue}
+% \DoNotIndex{\@input,\@ixpt,\@m}
+% \DoNotIndex{\@minus,\@mkboth,\@ne,\@nil,\@nomath,\@plus,\@set@topoint}
+% \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb}
+% \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt}
+% \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt}
+% \DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace}
+% \DoNotIndex{\advance,\Alph,\alph}
+% \DoNotIndex{\arabic,\ast,\begin,\begingroup,\bfseries,\bgroup,\box}
+% \DoNotIndex{\bullet}
+% \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption}
+% \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass}
+% \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist}
+% \DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup}
+% \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter}
+% \DoNotIndex{\fbox}
+% \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef}
+% \DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule}
+% \DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi}
+% \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi}
+% \DoNotIndex{\input}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark}
+% \DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright}
+% \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment}
+% \DoNotIndex{\NeedsTeXFormat,\newdimen}
+% \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number}
+% \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@}
+% \DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip}
+% \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions}
+% \DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright}
+% \DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font}
+% \DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily,\roman}
+% \DoNotIndex{\roman,\secdef,\selectfont,\setbox,\setcounter,\setlength}
+% \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space}
+% \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase}
+% \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt}
+% \DoNotIndex{\viipt,\vipt,\vskip,\vspace}
+% \DoNotIndex{\wd,\xiipt,\year,\z@}
+%
+% \changes{v1.0}{1996/05/09}{First public release}
+% \changes{v1.1}{1999/10/30}{Improved documentation using docmfp package}
+% \changes{v1.1}{1999/10/30}{Reordered descriptions and code}
+% \changes{v1.1}{1999/10/30}{Deleted Express Book examples}
+% \changes{v1.1}{1999/10/30}{Updated references}
+% \changes{v1.2}{1999/11/15}{Reincluded Express Book examples, plus NIAM and S-M}
+% \changes{v1.3}{2000/05/22}{Added smoothing, drawdrum, and others}
+% \changes{v1.4}{2000/07/10}{Added sharp and smooth lines}
+% \changes{v1.5}{2003/07/31}{Minor bug fixes}
+% \changes{v1.6}{2004/02/29}{More boxes}
+% \changes{v1.61}{2004/03/17}{Minor namespace feature fix}
+%
+% \newcommand{\dtxfilename}{\texttt{expressg.dtx}}
+% ^^A \def\fileversion{v1.0}
+% \def\firstfiledate{1996/05/09}
+% ^^A \def\fileversion{v1.1}
+% ^^A \def\filedate{1999/10/30}
+% ^^A \def\fileversion{v1.2}
+% ^^A \def\filedate{1999/11/15}
+% ^^A \def\fileversion{v1.3}
+% ^^A \def\filedate{2000/05/22}
+% \def\fileversion{v1.4} \def\filedate{2000/07/10}
+% \def\fileversion{v1.5} \def\filedate{2003/07/31}
+% \def\fileversion{v1.6} \def\filedate{2004/02/29}
+% \def\fileversion{v1.61} \def\filedate{2004/03/17}
+% \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package
+% \newcommand*{\Lopt}[1]{\textsf {#1}} ^^A typeset an option
+% \newcommand*{\file}[1]{\texttt {#1}} ^^A typeset a file
+% \newcommand*{\Lcount}[1]{\textsl {\small#1}} ^^A typeset a counter
+% \newcommand*{\pstyle}[1]{\textsl {#1}} ^^A typeset a pagestyle
+% \newcommand*{\Lenv}[1]{\texttt {#1}} ^^A typeset an environment
+% \newcommand*{\Express}{\textsc{express}}
+% \newcommand*{\ExpressG}{\textsc{express-g}}
+% \newcommand*{\Mpost}{\textsc{MetaPost}}
+% \newcommand*{\Mfont}{METAFONT}
+% \newcommand*{\fref}[1]{Figure~\ref{#1}}
+% \newcommand*{\pref}[1]{page~\pageref{#1}}
+% \newcommand*{\PS}{PostScript}
+% \newcommand*{\EPS}{Encapsulated \PS}
+% \newcommand*{\pdflatex}{pdf\LaTeX}
+%
+% \title{The \Lpack{Expressg} \Mpost{} package for drawing
+% box-line-annotation diagrams\thanks{This
+% file (\dtxfilename) has version number \fileversion, last revised
+% \filedate.}}
+%
+% \author{%
+% Peter Wilson\\
+% Catholic University of America \\
+% Now at \texttt{peter.r.wilson@boeing.com}
+% }
+% \date{(First published \firstfiledate) \\ \filedate}
+% \maketitle
+% \begin{abstract}
+% The \Lpack{expressg} \Mpost{} package provides facilities to assist in
+% drawing diagrams that consist of boxes, lines, and annotations.
+% Particular support is provided for creating \ExpressG{} diagrams
+% \end{abstract}
+% \tableofcontents
+% \listoffigures
+%
+% \StopEventually{}
+%
+% \section{Introduction}
+%
+% \ExpressG{} is an ISO international standard graphical information
+% modeling
+% language~\cite{STEP11,EBOOK}, and is a subset of the \Express{} lexical
+% object-flavoured information modeling language. Like most graphical
+% modeling languages, \ExpressG{} diagrams consist of boxes, lines, and
+% annotations associated with the boxes and the lines. As a colleague
+% of mine once put it, these kinds of graphical languages are BLA
+% (boxes, lines, annotations) with respect to lexical languages.
+%
+% \Mpost~\cite{MPOST} is a powerful lexical language for producing
+% \EPS\footnote{\PS{} is a registered trademark of Adobe
+% Systems Incorporated.} diagrams, and is based on the \Mfont~\cite{MFONT}
+% language for creating fonts.
+%
+% The \Lpack{expressg} package provides extensions to the base
+% \Mpost{} language to facilitate the creation of \ExpressG{} diagrams.
+% The package may also be used as is, or certainly by
+% extension, for the creation of other BLA diagrams.
+%
+% \Mpost{} is typically used to generate pictures for inclusion
+% in \LaTeX{} documents~\cite{LATEX}. By default it uses \TeX{} for
+% typesetting any text; this behaviour can be modified so that \LaTeX{}
+% is used instead. If standard \PS{} fonts (like Times) are
+% used, then \LaTeX{} typesetting may be avoided altogether. Running
+% \Mpost{} and methods of including \Mpost{} diagrams in (pdf)LaTeX
+% documents are described in~\cite{METAFP}.
+%
+%
+% The \Lpack{expressg} package has been some years
+% in the making. For
+% occasional diagrams I got by with using either the simple \LaTeX{}
+% picture commands,
+% or general GUI drawing packages. As time went on and the number
+% and complexity of the diagrams increased it became, to me at least, more
+% important to use a robust and powerful drawing language than fancy
+% GUI packages. This was especially important if a diagram had to be
+% changed at a later date, as the language denoted exactly how the drawing
+% had been produced. With the GUI tools all that you had was the picture
+% and whatever graphics file format the tool used --- there was no
+% user-sensible record
+% of how any result was achieved. Also, generally speaking I find it quicker
+% to use \Mpost{} than a GUI tool as too much time has to be spent using
+% a mouse or a cursor to reposition and rescale the drawing elements.
+%
+% Section~\ref{sec:usc} describes the facilities provided by the package.
+% Several worked
+% example diagrams are presented in Section~\ref{sec:example}, together
+% with information on how to run \Mpost.
+% Commented code for the package macros\footnote{If requested,
+% I may be prepared to consider providing additional macros, but no promises.}
+% is in Section~\ref{sec:mf}.
+%
+% It is assumed that the reader has some understanding of \Mpost, although
+% the example in Section~\ref{sec:example} does provide an
+% \textit{aide-memoire} for most of the \Mpost{} constructs that are likely
+% to be used in creating BLA diagrams. The definitive \Mpost{}
+% manual is~\cite{MPOST} but both~\cite{HOENIG98} and~\cite{GOOSSENS97}
+% give some interesting examples of how to use it; in fact the front cover
+% of Hoenig's book is a \Mpost{} picture.
+% Similarly, some familiarity with
+% BLA diagramming would be of assistance.
+%
+% I suggest that on first reading it may be sensible to skim
+% Section~\ref{sec:usc} first
+% and then peruse the example in Section~\ref{sec:example} more closely.
+% After this
+% go back and re-read Section~\ref{sec:usc} as it then should make
+% more sense.
+%
+% This manual is typeset according to the conventions of the
+% \LaTeX{} \textsc{docstrip} utility which enables the automatic
+% extraction of the \LaTeX{} macro source files~\cite{GOOSSENS94}.
+%
+%
+%
+% \section{The \Lpack{expressg} package} \label{sec:usc}
+%
+% \subsection{Internal variables}
+%
+% The package includes several internal variables that are initialised to
+% commonly appropriate values.
+% This section describes the principal internal variables.
+% Short descriptions
+% of the others, which
+% are likely to be used in diagrams only very occasionally, can be found
+% in Section~\ref{sec:mf}.
+%
+% The values of internal variables in \Mpost{} can only be changed via
+% assignment. For example:
+% \begin{verbatim}
+% internal_variable := expression;
+% \end{verbatim}
+%
+% \DescribeVariable{u}
+% \DescribeVariable{maxx}
+% \DescribeVariable{maxy}
+% |u| is the value of the unit of length for a diagram; it is initialised
+% to 1mm. All lengths, except for line thicknesses,
+% are defined in terms of |u|.
+% |maxx| and |maxy| are the maximum x and y coordinate values
+% for a diagram. These are initialised to the maximum size for a diagram
+% within an ISO standard document (i.e., |maxx:=159.5u| and |maxy:=210u|).
+%
+% The next set of variables control the thickness of lines and the
+% dimensions of line end styles.
+%
+% \DescribeVariable{normalpen}
+% Lines with normal linethickness are drawn with |normalpen|.
+%
+% \DescribeVariable{thickpen}
+% Thick lines are drawn with |thickpen|.
+%
+% \DescribeVariable{thinpenpen}
+% Thin lines are drawn with |thinpen|.
+%
+% \DescribeVariable{dotspen}
+% Dotted lines are drawn with |dotspen|.
+%
+% \DescribeVariable{dotpen}
+% |dotpen| is for drawing the black dot line end style.
+%
+% \DescribeVariable{dotdiam}
+% |dotdiam| is the diameter of an open circle or dot line end style.
+%
+% \DescribeVariable{smoothrad}
+% |smoothrad| is the radius of the circular arc used to round the join between
+% two straight lines.
+%
+% \DescribeVariable{drumlid}
+% |drumlid| is the ratio of the minor to major diameter of the ellipse
+% forming the top of the drum box; the larger the value the more the
+% apparent viewpoint shifts to above the drum. The default value is 0.2.
+%
+% \begin{figure}
+% \setlength{\unitlength}{1mm}
+% \centering
+% \begin{picture}(105,40)
+% \put(0,0){\framebox(105,40){}}
+% \put(5,0){\begin{picture}(60,40)
+% ^^A \put(0,0){\framebox(60,40){}}
+% \thicklines
+% \put(0,20){\line(1,0){10}}
+% \put(10,10){\line(2,1){20}}
+% \put(10,30){\line(2,-1){20}}
+% \put(10,10){\line(0,1){20}}
+% \thinlines
+% \put(10,5){\vector(1,0){20}} \put(10,5){\vector(-1,0){0}}
+% \put(20,3){\makebox(0,0)[t]{length}}
+% \put(35,10){\vector(0,1){20}} \put(35,10){\vector(0,-1){0}}
+% \put(40,20){\makebox(0,0)[l]{base width}}
+% \end{picture}}
+% \put(65,0){\begin{picture}(35,40)
+% ^^A \put(0,0){\framebox(60,40){}}
+% \thicklines
+% \put(5,20){\line(1,0){30}}
+% \put(5,10){\line(2,1){20}}
+% \put(5,30){\line(2,-1){20}}
+% \thinlines
+% \put(5,5){\vector(1,0){20}} \put(5,5){\vector(-1,0){0}}
+% \put(15,3){\makebox(0,0)[t]{length}}
+% \put(0,10){\vector(0,1){20}} \put(0,10){\vector(0,-1){0}}
+% \end{picture}}
+% \end{picture}
+% \caption{Length parameters for arrowhead and fanin line end styles}\label{fig:trifan}
+% \end{figure}
+%
+%
+% \DescribeVariable{gal}
+% \DescribeVariable{gab}
+% An arrowhead is defined by the height of the triangle and the base of
+% the triangle forming the arrowhead, as shown in \fref{fig:trifan}.
+% |gal| and |gab| are the length
+% and base width of arrows for arrowed line end styles.
+%
+% \DescribeVariable{gfl}
+% \DescribeVariable{gfb}
+% Like an arrowhead, a fanin is defined by the height and the base of
+% the triangular fan shape, as shown in \fref{fig:trifan}.
+% |gfl| and |gfb| are the length and base
+% width of fans for fanin line end styles. They are initialised to the
+% default values.
+%
+% The next set of variables control certain geometric aspects of
+% the various \ExpressG{} boxes.
+%
+% \DescribeVariable{onelineh}
+% |onelineh| is the minimum height of a box that encloses a single
+% line of text. This is initialised to |5u|.
+%
+% \begin{figure}
+% \setlength{\unitlength}{1mm}
+% \centering
+% \begin{picture}(65,40)
+% \put(0,0){\framebox(65,40){}}
+% \put(5,0){\begin{picture}(60,40)
+% ^^A \put(0,0){\framebox(60,40){}}
+% \thicklines
+% \put(0,10){\framebox(40,15){}}
+% \put(30,10){\line(0,1){15}}
+% \thinlines
+% \put(0,5){\vector(1,0){40}} \put(0,5){\vector(-1,0){0}}
+% \put(20,3){\makebox(0,0)[t]{length}}
+% \put(45,10){\vector(0,1){15}} \put(45,10){\vector(0,-1){0}}
+% \put(47,17.5){\makebox(0,0)[l]{height}}
+% \put(40,30){\vector(-1,0){10}} \put(40,30){\vector(1,0){0}}
+% \put(35,32){\makebox(0,0)[b]{inset}}
+% \end{picture}}
+% \end{picture}
+% \caption{Parameters for (inset) boxes}\label{fig:bool}
+% \end{figure}
+%
+% \DescribeVariable{sdtbl}
+% \DescribeVariable{sdtbh}
+% \DescribeVariable{sdtbs}
+% The length (|sdtbl|), height (|sdtbh|) and line inset (|sdtbs|) for
+% simple data type boxes (e.g., a BOOLEAN data type box), as illustrated
+% in \fref{fig:bool}. These are
+% initialised as |22u|, |onelineh| and |2u| respectively.
+%
+% \DescribeVariable{sdtebl}
+% \DescribeVariable{sdtebh}
+% \DescribeVariable{sdtebs}
+% The length (|sdtebl|), height (|sdtebh|) and line inset (|sdtebs|)
+% for a simple data type EXPRESSION box. The value of |sdtebl| is |28u|,
+% and the other values are the same as for the other simple data type boxes.
+%
+% \DescribeVariable{sdtbgel}
+% \DescribeVariable{sdtbgeh}
+% \DescribeVariable{sdtbges}
+% The length (|sdtbgel|), height (|sdtbgeh|) and inset for GENERICENT
+% data type boxes. The value of |sdtbgel| is |38u|,
+% and the other values are the same as for the other simple data type boxes.
+%
+% \DescribeVariable{pconl}
+% \DescribeVariable{pconh}
+% The length (|pconl|) of an average numeric (proxy) page connector
+% (e.g., for |(9,9 (9,9))|)
+% and the height (|pconh|)
+% of an average page connector, which is initialised for one line of text.
+%
+% \DescribeVariable{enth}
+% \DescribeVariable{typeh}
+% \DescribeVariable{schemah}
+% The heights of an average entity (|enth|),
+% type --- including enumeration and select --- (|typeh|),
+% and schema (|schemah|) boxes. These are all initialised to cater for
+% one line of text.
+%
+% \DescribeVariable{ish}
+% \DescribeVariable{isrh}
+% |ish| is the height of an interschema reference box with one line of text.
+% |isrh| is the height of an interschema reference box with a rename, where
+% there is one line of text each for the original and renamed
+% names.
+%
+% \DescribeVariable{eventh}
+% \DescribeVariable{eventslope}
+% The height (|eventh|) of a one-lined event box, and the slope (|eventslope|)
+% of the sides of an
+% event box (e.g., 0.25 or 1/4).
+%
+% The next set of variables control the amount of space surrounding text
+% on \ExpressG{} diagrams.
+%
+% \DescribeVariable{nextra}
+% |nextra| is the margin around names when put into entity, schema,
+% interschema reference,
+% page connector, and event boxes.
+%
+% \DescribeVariable{niextra}
+% |niextra| is the margin around names when put into type boxes.
+%
+% \DescribeVariable{ndextra}
+% |ndextra| is the margin around names when used on attribute lines.
+%
+% \subsection{Routines}
+%
+% The principal aspects of an \ExpressG{} diagram are lines and line ends of
+% various styles, and boxes of several different kinds. Many routines
+% are provided for positioning and drawing these on a diagram.
+%
+% The following sections describe most of the routines. Short descriptions
+% of the others, which
+% are effectively only used as internal support routines, can be found
+% in Section~\ref{sec:mf}.
+%
+% A note on naming conventions used in describing the routines:
+% \begin{itemize}
+% \item As usual with \Mpost, a name starting with |z| is a point, and
+% names staring with |x| or |y| are x- and y-coordinates respectively.
+% \item The letters |i| through |n| denote (point, coordinate) suffixes.
+% Suffixes are usually a number, such as |37|, but may also have
+% alphanumeric characters after the number (e.g., |37C2D|).
+% \end{itemize}
+%
+%
+% \subsubsection{Utility routines}
+%
+% Several utility routines are provided defining some shortcuts and
+% to ease some of the calculations
+% that may be required when producing a diagram.
+%
+% \DescribeRoutine{VH}
+% |VH(j, k)| calculates the intersection point, |zjvh|, between the vertical
+% line through the point |zj| and the horizontal line through the point |zk|,
+% as shown in \fref{fig:vhvh}.
+%
+%
+% \DescribeRoutine{VhV}
+% |VhV(j, k)| calculates the point |zjvhv| on the vertical line through
+% the point |zj| and the point |zkvhv| on the vertical line through the
+% point |zk|, such that the line |zjvhv--zkvhv| is horizontal and centered
+% vertically between the two given points,
+% as shown in \fref{fig:vhvh}.
+%
+% \begin{figure}
+% \setlength{\unitlength}{1mm}
+% \centering
+% \begin{picture}(130,50)
+% \put(0,0){\framebox(120,50){}}
+% \put(5,5){\begin{picture}(30,40)
+% ^^A \put(0,0){\framebox(30,40){}}
+% \put(5,35){\circle*{2}}
+% \put(3,37){\makebox(0,0)[br]{\texttt{zj}}}
+% \put(25,5){\circle*{2}}
+% \put(27,3){\makebox(0,0)[tl]{\texttt{zk}}}
+% \put(5,5){\circle{2}}
+% \put(3,3){\makebox(0,0)[tr]{\texttt{zjvh}}}
+% \put(5,0){\line(0,1){40}}
+% \put(0,5){\line(1,0){30}}
+% \end{picture}}
+% \put(45,5){\begin{picture}(30,40)
+% ^^A \put(0,0){\framebox(30,40){}}
+% \put(5,35){\circle*{2}}
+% \put(3,37){\makebox(0,0)[br]{\texttt{zj}}}
+% \put(25,5){\circle*{2}}
+% \put(27,3){\makebox(0,0)[tl]{\texttt{zk}}}
+% \put(5,20){\circle{2}}
+% \put(3,18){\makebox(0,0)[tr]{\texttt{zjvhv}}}
+% \put(25,20){\circle{2}}
+% \put(27,22){\makebox(0,0)[bl]{\texttt{zkvhv}}}
+% \put(5,40){\line(0,-1){25}}
+% \put(0,20){\line(1,0){30}}
+% \put(25,0){\line(0,1){25}}
+% \end{picture}}
+% \put(85,5){\begin{picture}(30,40)
+% ^^A \put(0,0){\framebox(30,40){}}
+% \put(5,35){\circle*{2}}
+% \put(3,37){\makebox(0,0)[br]{\texttt{zj}}}
+% \put(25,5){\circle*{2}}
+% \put(27,3){\makebox(0,0)[tl]{\texttt{zk}}}
+% \put(15,35){\circle{2}}
+% \put(17,37){\makebox(0,0)[bl]{\texttt{zjhvh}}}
+% \put(15,5){\circle{2}}
+% \put(13,3){\makebox(0,0)[tr]{\texttt{zkhvh}}}
+% \put(15,0){\line(0,1){40}}
+% \put(0,35){\line(1,0){20}}
+% \put(30,5){\line(-1,0){20}}
+% \end{picture}}
+% \end{picture}
+% \caption[Results of the \texttt{VH}, \texttt{VhV} and \texttt{HvH}
+% routines]%
+% {Results of the \texttt{VH} (left), \texttt{VhV} (middle)
+% and \texttt{HvH} (right) routines}\label{fig:vhvh}
+% \end{figure}
+%
+% \DescribeRoutine{HvH}
+% |HvH(j, k)| calculates the point |zjhvh| on the horizontal line through
+% the point |zj| and the point |zkhvh| on the horizontal line through the
+% point |zk|, such that the line |zjhvh--zkhvh| is vertical and centered
+% horizontally between the two given points,
+% as shown in \fref{fig:vhvh}.
+%
+% \DescribeRoutine{VyV}
+% |VyV(j, i, k)| is a generalisation of the |VhV| routine. It calculates
+% the point |zjvyv| which is on the vertical line through |zj| and the
+% horizontal line through |yi|, and the point |zkvyv| which is on the
+% vertical line through |zk| and the horizontal line through |yi|. An example
+% result is shown in \fref{fig:vyxh}.
+%
+% \begin{figure}
+% \setlength{\unitlength}{1mm}
+% \centering
+% \begin{picture}(90,50)
+% \put(0,0){\framebox(90,50){}}
+% \put(10,5){\begin{picture}(30,40)
+% \put(5,35){\circle*{2}}
+% \put(3,37){\makebox(0,0)[br]{\texttt{zj}}}
+% \put(25,5){\circle{2}}
+% \put(27,3){\makebox(0,0)[tl]{\texttt{zkvyv}}}
+% \put(5,5){\circle{2}}
+% \put(3,3){\makebox(0,0)[tr]{\texttt{zjvyv}}}
+% \put(25,20){\circle*{2}}
+% \put(27,22){\makebox(0,0)[bl]{\texttt{zk}}}
+% \put(5,40){\line(0,-1){40}} ^^A V through zj
+% \put(0,5){\line(1,0){30}} ^^A H through yi
+% \put(32,5){\makebox(0,0)[bl]{\texttt{yi}}}
+% \put(25,0){\line(0,1){25}} ^^A V through zk
+% \end{picture}}
+% \put(50,5){\begin{picture}(30,40)
+% \put(5,35){\circle*{2}}
+% \put(3,37){\makebox(0,0)[br]{\texttt{zj}}}
+% \put(25,5){\circle{2}}
+% \put(27,3){\makebox(0,0)[tl]{\texttt{zkhxh}}}
+% \put(25,35){\circle{2}}
+% \put(27,33){\makebox(0,0)[tl]{\texttt{zjhxh}}}
+% \put(15,5){\circle*{2}}
+% \put(13,3){\makebox(0,0)[tr]{\texttt{zk}}}
+% \put(25,0){\line(0,1){40}} ^^A V through xi
+% \put(25,42){\makebox(0,0)[b]{\texttt{xi}}}
+% \put(0,35){\line(1,0){30}} ^^A H through zj
+% \put(30,5){\line(-1,0){20}} ^^A H through zk
+% \end{picture}}
+% \end{picture}
+% \caption[Results of the \texttt{VyV} and \texttt{HxH}
+% routines]%
+% {Results of the \texttt{VyV} (left) and \texttt{HxH} (right)
+% routines}\label{fig:vyxh}
+% \end{figure}
+%
+% \DescribeRoutine{HxH}
+% |HxH(j, i, k)| is a generalisation of the |HvH| routine. It calculates
+% the point |zjhxh| which is on the horizontal line through |zj| and the
+% vertical line through |xi|, and the point |zkhxh| which is on the
+% horizontal line through |zk| and the vertical line through |xi|. An example
+% result is shown in \fref{fig:vyxh}.
+%
+% \DescribeRoutine{namespace}
+% |namespace(|\meta{name}|)(|\meta{margin}|)| calculates the length of
+% the text string \meta{name} plus the \meta{margin} length. You may
+% use it like: \\
+% |c = 3/2namespace(btex name etex)(4u)|
+%
+%
+% \DescribeRoutine{dashes}
+% |dashes| is shorthand for a dashed linestyle. Use it like: |draw ... dashes;|.
+%
+% \DescribeRoutine{dots}
+% |dots| is shorthand for a dotted linestyle. Use it like: |draw ... dots;|.
+%
+% \DescribeRoutine{drawgrid}
+% |drawgrid| draws a 16 by 21cm, 1cm spaced grid composed of thin dashed lines.
+% Labels are typeset giving the distance of the lines from the bottom left
+% corner of the grid in millimetres.
+%
+% \subsubsection{Path routines}
+%
+% The package provides some general path making routines.
+%
+% \DescribeRoutine{sharply}
+% |sharply(zi, zj, ... zn)| will generate a piecewise linear
+% path consisting of the
+% straight lines from point |zi| to point |zj| \ldots to point |zn|.
+% It may be used like: \\
+% |draw sharply(z1, z2, z3, z4);| \\
+% to draw a line through the given points.
+%
+% \DescribeRoutine{smoothly}
+% Like the |sharply| routine, |smoothly(zi, zj, ... zn)| will generate a
+% piecewise linear path consisting of the
+% straight lines from point |zi| to point |zj| \ldots to point |zn|, except
+% that the corners of the path at the interior points are rounded with an
+% arc of radius |smoothrad|.
+% It may be used like: \\
+% |draw smoothly(z1, z2, z3, z4) dashes;| \\
+% to draw a dashed line with rounded corners at the given points. Or if
+% a dotted line is needed:
+% \begin{verbatim}
+% pickup dotspen;
+% draw smoothly(z1, z2, z3, z4) dots;
+% pickup normalpen;
+% \end{verbatim}
+%
+% \DescribeRoutine{~}
+% Like the |&| operator, the binary |~| operator concatenates two paths
+% replacing the sharp join with a circular arc of radius |smoothrad|.
+%
+% \subsubsection{Line drawing routines}
+%
+% Routines are provided for drawing a variety of lines with differing line
+% ending styles. Line styles include dotted, dashed, and continuous, and line
+% thicknesses may be normal or thick. Line end styles include open circles,
+% black dots, open and closed (black) arrowheads, and a fanin style.
+%
+% The final uppercase characters of a line drawing routine indicate the kind
+% of line end style that will be used.
+% The character |O| (uppercase O, not zero) is for an \textbf{O}pen circle,
+% |D| is for a black \textbf{D}ot,
+% |OA| is for an \textbf{O}pen \textbf{A}rrowhead,
+% |CA| is for a \textbf{C}losed (black) \textbf{A}rrowhead,
+% and |F| is for a \textbf{F}anin.
+%
+% The line ending drawing routines are described first.
+% \DescribeRoutine{drawO}
+% |drawO(i, j)| draws an open circle, diameter |dotdiam|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% \DescribeRoutine{drawD}
+% |drawD(i, j)| draws a black dot, diameter |dotdiam|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% \DescribeRoutine{drawOA}
+% |drawOA(i, j)| draws an open arrowhead, length |gal| and base width
+% |gab|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% \DescribeRoutine{drawCA}
+% |drawCA(i, j)| draws a closed (black) arrowhead, length |gal| and base width
+% |gab|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% \DescribeRoutine{drawF}
+% |drawF(i, j)| draws a fanin, length |gfl| and base width |gfb|,
+% at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% The line drawing routines are essentially prepackaged versions of
+% different combinations of the path and line ending routines.
+%
+% \DescribeRoutine{drawdots}
+% |drawdots(i, j)| draws the dotted line |zi--zj|.
+%
+% \DescribeRoutine{drawdotsthree}
+% |drawdotsthree(i, j, k)| draws the dotted piecewise linear line |zi--zj--zk|.
+%
+% \DescribeRoutine{drawdotsfour}
+% |drawdotsfour(i, j, k, l)| draws the dotted piecewise linear line |zi--zj--zk--zl|.
+%
+% \DescribeRoutine{drawdotsO}
+% |drawdotsO(i, j)| draws the dotted line |zi--zj|,
+% ending in an open circle, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawdotsthreeO}
+% |drawdotsthreeO(i, j, k)| draws the dotted piecewise linear line |zi--zj--zk|.
+% ending in an open circle, diameter |dotdiam|, at |zk|.
+%
+% \DescribeRoutine{drawdotsfourO}
+% |drawdotsfourO(i, j, k, l)| draws the dotted piecewise linear line |zi--zj--zk--zl|,
+% ending in an open circle, diameter |dotdiam|, at |zl|.
+%
+% \DescribeRoutine{drawdotsOO}
+% |drawdotsOO(i, j)| draws the dotted line |zi--zj|,
+% ending in open circles, diameter |dotdiam|, at |zi| and |zj|.
+%
+% \DescribeRoutine{drawdash}
+% |drawdash(i, j)| draws the dashed line |zi--zj|.
+%
+% \DescribeRoutine{drawdashthree}
+% |drawdashthree(i, j, k)| draws the dashed piecewise linear line |zi--zj--zk|.
+%
+% \DescribeRoutine{drawdashfour}
+% |drawdashfour(i, j, k, l)| draws the dashed piecewise linear line |zi--zj--zk--zl|.
+%
+% \DescribeRoutine{drawdashO}
+% |drawdashO(i, j)| draws the dashed line |zi--zj|,
+% ending in an open circle, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawdashthreeO}
+% |drawdashthreeO(i, j, k)| draws the dashed piecewise linear line |zi--zj--zk|.
+% ending in an open circle, diameter |dotdiam|, at |zk|.
+%
+% \DescribeRoutine{drawdashfourO}
+% |drawdashfourO(i, j, k, l)| draws the dashed piecewise linear line |zi--zj--zk--zl|.
+% ending in an open circle, diameter |dotdiam|, at |zl|.
+%
+% \DescribeRoutine{drawdashOO}
+% |drawdashOO(i, j)| draws the dashed line |zi--zj--zk--zl|.
+% ending in open circles, diameter |dotdiam|, at |zi| and |zj|.
+%
+% \DescribeRoutine{drawnormal}
+% |drawnormal(i, j)| draws the normal thickness line |zi--zj|.
+%
+% \DescribeRoutine{drawnormalthree}
+% |drawnormalthree(i, j, k)| draws the normal thickness piecewise linear
+% line |zi--zj--zk|.
+%
+% \DescribeRoutine{drawnormalfour}
+% |drawnormalfour(i, j, k, l)| draws the normal thickness piecewise linear
+% line |zi--zj--zk--zl|.
+%
+% \DescribeRoutine{drawnormalO}
+% |drawnormalO(i, j)| draws the normal thickness line |zi--zj|,
+% ending in an open circle, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawnormalthreeO}
+% |drawnormalthreeO(i, j, k)| draws the normal thickness piecewise linear
+% line |zi--zj--zk|,
+% ending in an open circle, diameter |dotdiam|, at |zk|.
+%
+% \DescribeRoutine{drawnormalfourO}
+% |drawnormalfourO(i, j, k, l)| draws the normal thickness piecewise linear
+% line |zi--zj--zk--zl|,
+% ending in an open circle, diameter |dotdiam|, at |zl|.
+%
+% \DescribeRoutine{drawnormalOO}
+% |drawnormalOO(i, j)| draws the normal thickness line |zi--zj|,
+% ending in open circles, diameter |dotdiam|, at |zi| and |zj|.
+%
+% \DescribeRoutine{drawnormalD}
+% |drawnormalD(i, j)| draws the normal thickness line |zi--zj|,
+% ending in a black dot, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawnormalthreeD}
+% |drawnormalthreeD(i, j, k)| draws the normal thickness piecewise linear
+% line |zi--zj--zk|,
+% ending in a black dot, diameter |dotdiam|, at |zk|.
+%
+% \DescribeRoutine{drawnormalfourD}
+% |drawnormalfourD(i, j, k, l)| draws the normal thickness piecewise linear
+% line |zi--zj--zk--zl|,
+% ending in a black dot, diameter |dotdiam|, at |zl|.
+%
+% \DescribeRoutine{drawnormalDD}
+% |drawnormalDD(i, j)| draws the normal thickness line |zi--zj|,
+% ending in black dots, diameter |dotdiam|, at |zi| and |zj|.
+%
+% \DescribeRoutine{drawnormalCA}
+% |drawnormalCA(i, j)| draws the normal thickness line |zi--zj|,
+% ending in a closed (black) arrowhead, length |gal| and base width |gab|,
+% at |zj|.
+%
+% \DescribeRoutine{drawnormalthreeCA}
+% |drawnormalthreeCA(i, j, k)| draws the normal thickness piecewise linear
+% line |zi--zj--zk|
+% ending in a closed (black) arrowhead, length |gal| and base width |gab|,
+% at |zk|.
+%
+% \DescribeRoutine{drawnormalfourCA}
+% |drawnormalfourCA(i, j, k, l)| draws the normal thickness piecewise linear
+% line |zi--zj--zk--zl|
+% ending in a closed (black) arrowhead, length |gal| and base width |gab|,
+% at |zl|.
+%
+% \DescribeRoutine{drawnormalOA}
+% |drawnormalOA(i, j)| draws the normal thickness line |zi--zj|,
+% ending in an open arrowhead, length |gal| and base width |gab|,
+% at |zj|.
+%
+% \DescribeRoutine{drawnormalF}
+% |drawnormalF(i, j)| draws the normal thickness line |zi--zj|,
+% ending in a fanin, length |gfl| and base width |gfb|,
+% at |zj|.
+%
+% \DescribeRoutine{drawnormalFO}
+% |drawnormalFO(i, j)| draws the normal thickness line |zi--zj|,
+% ending in a fanin, length |gfl| and base width |gfb|,
+% at |zi| and an open circle, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawthick}
+% |drawthick(i, j)| draws the thick line |zi--zj|.
+%
+% \DescribeRoutine{drawthickO}
+% |drawthickO(i, j)| draws the thick line |zi--zj|,
+% ending in an open circle, diameter |dotdiam|, at |zj|.
+%
+% \DescribeRoutine{drawthickOO}
+% |drawthickOO(i, j)| draws the thick line |zi--zj|,
+% ending in open circles, diameter |dotdiam|, at |zi| and |zj|.
+%
+% \DescribeRoutine{smooth}
+% |smooth(i, j, k)| replaces the sharp corner on the line |zi--zj--zk|
+% with an arc radius |smoothrad|.
+%
+% \DescribeRoutine{smoothtwo}
+% |smoothtwo(i, j, k, l)| replaces the sharp corners on the line |zi--zj--zk--zl|
+% with arcs radius |smoothrad|.
+%
+% \DescribeRoutine{smoothdash}
+% |smoothdash(i, j, k)| replaces the sharp corner on the dashed line |zi--zj--zk|
+% with an arc radius |smoothrad|.
+%
+% \DescribeRoutine{smoothdots}
+% |smoothdots(i, j, k)| replaces the sharp corner on the dotted line |zi--zj--zk|
+% with an arc radius |smoothrad|.
+%
+%
+%
+% \subsubsection{Box drawing routines}
+%
+% Routines are provided for drawing the different kinds of \ExpressG{}
+% boxes.
+%
+% The first argument to the box drawing routines is the suffix of the
+% point that will be the left-hand bottom corner point of the box. The
+% last argument, except where noted below, is the text that is to be placed
+% at the center of the box. Intermediate arguments, if any, are the length
+% and height of the box.
+%
+% Every box routine calculates the four corner points of the box and the
+% midpoints of each side of the box. For example, if the suffix is |j|,
+% then as illustrated in figure~\ref{fig:boxpoints}, the corner points
+% will be called |zjbl|, |zjbr|, |zjtr| and |zjtl| and the midpoints
+% will be called |zjbm|, |zjmr|, |zjtm| and |zjml|. The center point for
+% postioning the text is |zjc| and the center of the text is placed at
+% this point.
+%
+% The text center point is not necessarily the geometric center of the box.
+% The geometric center is not calculated but lies at the intersection of
+% the lines |zjml--zjmr| and |zjbm--zjtm|.
+%
+% \begin{figure}
+% \centering
+% \setlength{\unitlength}{1mm}
+% \begin{picture}(50,40)
+% \put(0,0){\framebox(50,40){}}
+% \put(10,10){\begin{picture}(30,20)
+% \put(0,0){\framebox(30,20){}}
+% \multiput(0,0)(15,0){3}{\circle*{2}}
+% \multiput(0,10)(15,0){3}{\circle*{2}}
+% \multiput(0,20)(15,0){3}{\circle*{2}}
+% \put(-2,-2){\makebox(0,0)[tr]{\texttt{zjbl}}}
+% \put(15,-2){\makebox(0,0)[t]{\texttt{zjbm}}}
+% \put(32,-2){\makebox(0,0)[tl]{\texttt{zjbr}}}
+% \put(-2,10){\makebox(0,0)[r]{\texttt{zjml}}}
+% \put(13,10){\makebox(0,0)[r]{\texttt{zjc}}}
+% \put(32,10){\makebox(0,0)[l]{\texttt{zjmr}}}
+% \put(-2,22){\makebox(0,0)[br]{\texttt{zjtl}}}
+% \put(15,22){\makebox(0,0)[b]{\texttt{zjtm}}}
+% \put(32,22){\makebox(0,0)[bl]{\texttt{zjtr}}}
+% \end{picture}}
+% \end{picture}
+% \setlength{\unitlength}{1pt}
+% \caption[Calculated points on rectangular boxes]%
+% {Calculated points on rectangular boxes
+% (suffix is \texttt{j} and located at \texttt{zjbl=zj})}
+% \label{fig:boxpoints}
+% \end{figure}
+%
+% \DescribeRoutine{drawSCHEMA}
+% A SCHEMA box is rectangular with a normal perimeter and the box is divided
+% into top and bottom halves by a horizontal line.
+%
+% |drawSCHEMA(j, len, ht)(btex schema\_a etex)| draws a SCHEMA double rectangular
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |schema_a| is placed at the text center of the box,
+% which is central within the upper half.
+%
+% \DescribeRoutine{drawBINARY}
+% A simple data type box is rectangular with a solid boundary and a solid
+% interior vertical line near the right hand edge.
+%
+% |drawBINARY(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |BINARY| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawBOOLEAN}
+% |drawBOOLEAN(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |BOOLEAN| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawCOMPLEX}
+% |drawCOMPLEX(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |COMPLEX| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawEXPRESSION}
+% |drawEXPRESSION(j)| draws a simple data type rectangular
+% box of length |sdtbel| and height |sdtbeh| with its left-hand bottom corner
+% at |zj|. The string |EXPRESSION| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawGENERIC}
+% |drawGENERIC(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |GENERIC| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawINTEGER}
+% |drawINTEGER(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |INTEGER| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawLOGICAL}
+% |drawLOGICAL(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |LOGICAL| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawNUMBER}
+% |drawNUMBER(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |NUMBER| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawREAL}
+% |drawREAL(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |REAL| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawSTRING}
+% |drawSTRING(j)| draws a simple data type rectangular
+% box of length |sdtbl| and height |sdtbh| with its left-hand bottom corner
+% at |zj|. The string |STRING| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawENUM}
+% An ENUMERATION box is a rectangular box with a dashed perimeter and an
+% interior dashed vertical line near the right hand edge.
+%
+% |drawENUM(j, len, ht)(btex an\_enum etex)| draws a rectangular dashed ENUMERATION type
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |an_enum| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawSELECT}
+% A SELECT box is rectangular with a dashed boundary and an interior
+% dashed vertical
+% line near the left hand edge.
+%
+% |drawSELECT(j, len, ht)(btex a\_select etex)| draws a rectangular dashed SELECT type
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |a_select| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawTYPE}
+% A TYPE box is rectangular with a dashed boundary.
+%
+% |drawTYPE(j, len, ht)(btex a\_type etex)| draws a rectangular dashed TYPE type
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |a_type| is placed at the text center of the box,
+% which is central within the main part of the box.
+%
+% \DescribeRoutine{drawENT}
+% An ENTITY box is a rectangular box with a solid boundary.
+%
+% |drawENT(j, len, ht)(btex an\_entity etex)| draws a rectangular ENTITY type
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |an_entity| is placed at the text center of the box,
+% which is also the geometric center of the box.
+%
+% \DescribeRoutine{drawPREF}
+% A page reference box is a rectangle with rounded ends and a solid boundary.
+%
+% |drawPREF(j, len, ht)(btex page ref etex)| draws an oval page
+% reference
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |page ref| is placed at the text center of the box,
+% which is also the geometric center of the box.
+%
+% \DescribeRoutine{drawISU}
+% An interschema box is a rectangle surrounding a page reference like box.
+% The rectangular box may have either a solid or a dashed boundary.
+%
+% |drawISU(j, len, ht)(btex sch.ent etex)| draws a three-part rectangular
+% interschema USE
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |sch.ent| is placed at the text center of the box,
+% which is also the geometric center of the box.
+%
+% \DescribeRoutine{drawISUR}
+% |drawISUR(j, len, ht)(btex sch.ent etex)(btex newname etex)| draws a three-part rectangular
+% interschema USE and RENAME
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |sch.ent| is placed at the text center of the box,
+% which is also the geometric center of the box. The string |newname| is
+% placed at the geometric center of the bottom third of the box (this is
+% the point |zjrnm|).
+%
+% \DescribeRoutine{drawISR}
+% |drawISR(j, len, ht)(btex sch.ent etex)| draws a three-part rectangular
+% dashed interschema REFERENCE
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |sch.ent| is placed at the text center of the box,
+% which is also the geometric center of the box.
+%
+% \DescribeRoutine{drawISRR}
+% |drawISRR(j, len, ht)(btex sch.ent etex)(btex newname etex)| draws a three-part rectangular
+% dashed interschema REFERENCE and RENAME
+% box of length |len| and height |ht| with its left-hand bottom corner
+% at |zj|. The string |sch.ent| is placed at the text center of the box,
+% which is also the geometric center of the box. The string |newname| is
+% placed at the geometric center of the bottom third of the box (this is
+% the point |zjrnm|).
+%
+% \DescribeRoutine{drawLEVENT}
+% An EVENT box is a rhomboid with a solid boundary.
+%
+% |drawLEVENT(j, len, ht)(btex local\_event etex)| draws a rhomboidal
+% Local EVENT
+% box of length |len|, height |ht| and slope |eventslope| with its left-hand bottom corner
+% at |zj|. The string |local_event| is placed at the text center of the box,
+% which is also the geometric center of the box. Like the rectangular boxes,
+% the calculated bottom and top middle points are vertically below and above
+% the geometric center, but this means that they are \emph{not} midway
+% beteen the bottom and top corner points. This is illustrated in
+% \fref{fig:eventpoints}.
+%
+% \begin{figure}
+% \centering
+% \setlength{\unitlength}{1mm}
+% \begin{picture}(55,40)
+% \put(0,0){\framebox(55,40){}}
+% \put(10,10){\begin{picture}(40,20)
+% ^^A \put(0,0){\framebox(30,20){}}
+% \put(0,0){\line(1,0){30}}
+% \put(5,20){\line(1,0){30}}
+% \put(0,0){\line(1,4){5}}
+% \put(30,0){\line(1,4){5}}
+% \multiput(0,0)(30,0){2}{\circle*{2}}
+% \multiput(2.5,10)(30,0){2}{\circle*{2}}
+% \multiput(5,20)(30,0){2}{\circle*{2}}
+% \multiput(17.5,0)(0,10){3}{\circle*{2}}
+% \put(-2,-2){\makebox(0,0)[tr]{\texttt{zjbl}}}
+% \put(17.5,-2){\makebox(0,0)[t]{\texttt{zjbm}}}
+% \put(32,-2){\makebox(0,0)[tl]{\texttt{zjbr}}}
+% \put(0.5,10){\makebox(0,0)[r]{\texttt{zjml}}}
+% \put(15.5,10){\makebox(0,0)[r]{\texttt{zjc}}}
+% \put(34.5,10){\makebox(0,0)[l]{\texttt{zjmr}}}
+% \put(3,22){\makebox(0,0)[br]{\texttt{zjtl}}}
+% \put(17.5,22){\makebox(0,0)[b]{\texttt{zjtm}}}
+% \put(37,22){\makebox(0,0)[bl]{\texttt{zjtr}}}
+% \end{picture}}
+% \end{picture}
+% \setlength{\unitlength}{1pt}
+% \caption[Calculated points on rhomboidal boxes]%
+% {Calculated points on rhomboidal boxes
+% (suffix is \texttt{j} and located at \texttt{zjbl=zj})}
+% \label{fig:eventpoints}
+% \end{figure}
+%
+% \DescribeRoutine{drawGEVENT}
+% |drawGEVENT(j, len, ht)(btex global\_event etex)| draws a thick rhomboidal
+% Global EVENT
+% box of length |len|, height |ht| and slope |eventslope| with its left-hand bottom corner
+% at |zj|. The string |global_event| is placed at the text center of the box,
+% which is also the geometric center of the box.
+%
+%
+% \DescribeRoutine{drawcirclebox}
+% A circle box is a circle with a solid boundary.
+%
+% |drawcirclebox(j, diam)(btex ABC etex)| draws a circle diameter |diam|
+% and center at |zj|. The string |ABC| is placed at the center of the circle.
+% In this case the four midside points, |zjbm|, |zjmr|, |zjtm| and |zjml|,
+% are at on the circle at the extreme bottom, right, top and left (i.e., at
+% the S, E, N and W compass points). The
+% corner points, |zjbl|, |zjbr|, |zjtr| and |zjtl|, are also on the
+% circumference midway between the midpoints (i.e., at the SW, SE, NE and NW
+% compass points).
+%
+% \DescribeRoutine{drawdashcircle}
+% |drawdashcircle(j, diam)| draws a dashed circle. The location
+% and size parameters are the same as for |drawcirclebox|, as are the
+% calculated points.
+%
+% \subsection{Extra BLA variables and routines}
+%
+% In addition to the facilities described above for \ExpressG{}
+% diagrams, extra line styles and boxes are provided for other
+% kinds of diagrams.
+%
+% Additional line end styles are coded by:
+% |A| for an \textbf{A}rrowhead,
+% |OD| for an \textbf{O}pen \textbf{D}iamond,
+% |CD| for a \textbf{C}losed \textbf{D}iamond.
+%
+% \DescribeVariable{gdl}
+% \DescribeVariable{gdb}
+% The variables |gdl| and |gdb| hold the the length and base width of
+% diamond line end styles (see \fref{fig:diales}),
+% analagous to the corresponding variables
+% for arrow heads and fanin. By default, |gdl| is twice the default
+% arrowhead length and |gdb| is three quarters of the default
+% arrowhead base width.
+%
+% \begin{figure}
+% \setlength{\unitlength}{1mm}
+% \centering
+% \begin{picture}(90,40)
+% \put(0,0){\framebox(90,40){}}
+% \put(5,0){\begin{picture}(85,40)
+% ^^A \put(0,0){\framebox(85,40){}}
+% \thicklines
+% \put(0,20){\line(1,0){10}}
+% ^^A \put(10,10){\line(2,1){20}}
+% ^^A \put(10,30){\line(2,-1){20}}
+% ^^A \put(10,10){\line(0,1){20}}
+% \put(10,20){\line(2,1){20}}
+% \put(10,20){\line(2,-1){20}}
+% \put(50,20){\line(-2,1){20}}
+% \put(50,20){\line(-2,-1){20}}
+% \thinlines
+% ^^A \put(10,5){\vector(1,0){20}} \put(10,5){\vector(-1,0){0}}
+% ^^A \put(20,3){\makebox(0,0)[t]{length}}
+% ^^A \put(35,10){\vector(0,1){20}} \put(35,10){\vector(0,-1){0}}
+% ^^A \put(40,20){\makebox(0,0)[l]{base width}}
+% \put(10,5){\vector(1,0){40}} \put(10,5){\vector(-1,0){0}}
+% \put(30,3){\makebox(0,0)[t]{length}}
+% \put(55,10){\vector(0,1){20}} \put(55,10){\vector(0,-1){0}}
+% \put(60,20){\makebox(0,0)[l]{base width}}
+% \end{picture}}
+% \end{picture}
+% \caption{Length parameters for diamond line end styles}\label{fig:diales}
+% \end{figure}
+%
+% \DescribeRoutine{drawA}
+% |drawA(i, j)| draws a simple arrowhead, length |gal| and base width
+% |gab|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+%
+% \DescribeRoutine{drawDCA}
+% |drawDCA(i, j)| draws a double closed arrowhead, each of length |gal|
+% and base width
+% |gab|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+%
+% \DescribeRoutine{drawOD}
+% |drawOD(i, j)| draws an open diamond, length |gdl| and base width
+% |gdb|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+% \DescribeRoutine{drawCD}
+% |drawCD(i, j)| draws a closed (black) diamond, length |gdl| and base width
+% |gdb|, at the |zj| end
+% of the vector from |zi| to |zj|.
+%
+%
+% \DescribeRoutine{drawdashA}
+% |drawdashA(i, j)| draws the dashed line |zi--zj|,
+% ending in an arrowhead, length |gal| and base width |gab|,
+% at |zj|.
+%
+% \DescribeRoutine{drawdashOA}
+% |drawdashOA(i, j)| draws the dashed line |zi--zj|,
+% ending in an open arrowhead, length |gal| and base width |gab|,
+% at |zj|.
+%
+% \DescribeRoutine{drawnormalOD}
+% |drawnormalOD(i, j)| draws the normal thickness line |zi--zj|,
+% ending in an open diamond, length |gdl| and base width |gdb|,
+% at |zj|.
+%
+% \DescribeRoutine{drawnormalCD}
+% |drawnormalCD(i, j)| draws the normal thickness line |zi--zj|,
+% ending in a closed (black) diamond, length |gdl| and base width |gdb|,
+% at |zj|.
+%
+% \DescribeRoutine{drawcircleA}
+% |drawcircleA(j, diam)| draws a circle diameter |diam| centered at |zj|.
+% A counterclockwise pointing arrow is placed at the top of the circle.
+% The midside and `corner' points are the same as calculated by
+% the |drawcirclebox| routine.
+%
+% \DescribeRoutine{drawDot}
+% |drawDot(j, diam)| draws a black dot, diameter |diam| centered at |zj|.
+% There are no calculated points.
+%
+% \DescribeRoutine{drawCircledDot}
+% |drawCircledDot(j, diam)| draws a black dot with a circle outside
+% it, overall diameter |diam|, centered at |zj|.
+% There are no calculated points. This could be used for a UML
+% `bullseye'. The white ring should obscure anything
+% drawn earlier that lies underneath it (by definition the black dot covers
+% up anything underneath itself). For example:
+% \begin{verbatim}
+% draw z1--z2; % line from z1 to z2
+% drawCircledDot(2, len); % obscures last len of above line
+% draw z3--z2; % not obscured
+% \end{verbatim}
+%
+% Commands of the form |draw...box| have a text argument
+% which is printed at the center of the box. If an empty box is
+% required the text argument should be an empty string (|""|). For
+% example |draw...box(...)("")|.
+%
+% \DescribeRoutine{drawcardbox}
+% |drawcardbox(j, len, ht, fold)(btex note etex)| draws a rectangular
+% box, length |len| and height |ht|, with its bottom left corner at |zj|.
+% The top right corner of the box is folded down, with the side length
+% of the fold given by |fold|. The string |note| is placed at the
+% center of the box. If no text is required, then use an empty string (i.e.,
+% |""|), as in \\
+% |\drawcardbox(23, el, eh, 1/8eh)("")|
+%
+% \DescribeRoutine{drawdiamondbox}
+% |drawdiamondbox(j, len, ht)(btex str etex)| draws a diamond shaped
+% box, length |len| and height |ht|, with its center at |zj|. The usual
+% corner, center and midpoints are also calculated except that the points
+% |z$tm| etc., are at the corners of the diamond and the points |z$tl| etc.,
+% are at the middle of each line, as shown in \fref{fig:diamondpoints}.
+% The text |str| is placed at the center of the box.
+%
+% \begin{figure}
+% \centering
+% \setlength{\unitlength}{1mm}
+% \begin{picture}(50,40)
+% \put(0,0){\framebox(50,40){}}
+% \put(10,10){\begin{picture}(30,20)
+% ^^A \put(0,0){\framebox(30,20){}}
+% \put(0,10){\line(3,2){15}}
+% \put(0,10){\line(3,-2){15}}
+% \put(30,10){\line(-3,2){15}}
+% \put(30,10){\line(-3,-2){15}}
+% \multiput(0,10)(15,0){3}{\circle*{2}}
+% \multiput(15,0)(0,20){2}{\circle*{2}}
+% \multiput(7.5,5)(0,10){2}{\circle*{2}}
+% \multiput(22.5,5)(0,10){2}{\circle*{2}}
+% \put(13,10){\makebox(0,0)[r]{\texttt{zjc}}}
+% \put(15,-2){\makebox(0,0)[t]{\texttt{zjbm}}}
+% \put(-2,10){\makebox(0,0)[r]{\texttt{zjml}}}
+% \put(32,10){\makebox(0,0)[l]{\texttt{zjmr}}}
+% \put(15,22){\makebox(0,0)[b]{\texttt{zjtm}}}
+%
+% \put(5.5,3){\makebox(0,0)[tr]{\texttt{zjbl}}}
+% \put(24.5,3){\makebox(0,0)[tl]{\texttt{zjbr}}}
+% \put(5.5,17){\makebox(0,0)[br]{\texttt{zjtl}}}
+% \put(24.5,17){\makebox(0,0)[bl]{\texttt{zjtr}}}
+% \end{picture}}
+% \end{picture}
+% \setlength{\unitlength}{1pt}
+% \caption[Calculated points on diamond boxes]%
+% {Calculated points on diamond boxes
+% (suffix is \texttt{j} and located at \texttt{zjc=zj})}
+% \label{fig:diamondpoints}
+% \end{figure}
+%
+%
+% \DescribeRoutine{drawtwodiamondbox}
+% |drawtwodiamondbox(j, len, ht, inset)(btex str etex)| draws a diamond shaped
+% box, length |len| and height |ht|, with its center at |zj|.
+% The text |str| is placed at the center of the box.
+% A second diamond is drawn inside the first. The parameter |inset| is
+% the space between adjacent outer and inner lines.
+% No calculated points are available for the inner diamond.
+%
+% \DescribeRoutine{drawdoublerectangle}
+% |drawdoublerectangle(j, len, ht, tf)| draws a rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. The box
+% is divided horizontally
+% into a top and bottom portion, with the height of the top portion being
+% the fraction |tf| of the total height of the box. The center points of
+% the two portions are calculated as |zjct| and |zjcb| for the top and
+% bottom respectively.
+% The ends of the dividing line are at |zjtfl| and |zjtfr|.
+%
+% \DescribeRoutine{drawtriplerectangle}
+% |drawtriplerectangle(j, len, ht, tf, bf)| draws a rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. The box
+% is divided horizontally
+% into a top, middle and bottom portion.
+% The height of the top portion is the fraction |tf| of the total height
+% of the box.
+% The height of the bottom portion is the fraction |bf| of the total height
+% of the box.
+% The center points of
+% the three portions are calculated as |zjct|, |zjcm| and |zjcb| for the
+% top, middle and bottom respectively.
+% The ends of the dividing lines are at |zjtfl| and |zjtfr| for the upper
+% line, and at |zjbfl| and |zjbfr| for the lower line.
+%
+% \DescribeRoutine{hiderectangle}
+% |hiderectangle(j, len, ht)| draws an invisible rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. The box
+% covers up anything underneath it. Note that unlike all the other boxes
+% the only point handle to the box is the bottom left corner --- the
+% |zjbl|, |zjtr|, etc., points are not available and hence cannot
+% be used for positioning or alignment purposes.
+%
+% \DescribeRoutine{drawdashboxover}
+% |drawdashboxover(j, len, ht)| draws a dashed rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. The box
+% covers up anything underneath it.
+%
+% \DescribeRoutine{drawindexbox}
+% |drawindexbox(j, len, ht, lenp, htp)(btex str etex)|
+% draws a rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. Another
+% rectangular box, length |lenp| and height |htp|, is drawn with its
+% bottom left corner at the top left corner of the first box (like an index
+% card). The main box points are |zjbl| etc., but the secondary box
+% points are |zjP.bl|, |zjP.bm| etc. The text |str| is placed at the center
+% (|zjP.c|) of the secondary box.
+%
+% \DescribeRoutine{drawroundedbox}
+% |drawroundedbox(j, len, ht, rad)(btex str etex)|
+% draws a rectangular box, length |len|
+% and height |ht|, located with its bottom left corner at |zj|. The corners
+% of the box are rounded using radius |rad|. If |2rad| is greater
+% than |len| or |ht|, then |2rad| is reduced to the lesser of |len| and
+% |ht|, thereby producing at least one pair of semicircular sides.
+% The text |str| is placed at the center of the box.
+%
+% \DescribeRoutine{drawovalbox}
+% |drawovalbox(j, len, ht)(btex str etex)|
+% draws an elliptical box,
+% horizontal diameter |len|
+% and vertical diameter |ht|, located with its center at |zj|. Like the
+% diamond box, |zjtm|, |zjmr|, etc., are at the extremes of the ellipse
+% and the points |zjtr|, |zjbr|, etc., are on the ellipse approximately
+% halfway between the extremum points, similar to the positions shown
+% in \fref{fig:diamondpoints}. The text |str| is placed at the center
+% of the box.
+%
+% \DescribeRoutine{drawoutputbox}
+% |drawoutputbox(j, len, ht)(btex str etex)|
+% draws a box,
+% length |len| and height |ht|, located with its bottom left corner at |zj|.
+% The bottom of the box is a wavy line and the other three sides
+% are straight. The text |str| is placed at the center of the box.
+% This kind of box is often used as a flowchart symbol for output;
+% it is meant to be a represention of printed paper which has been
+% torn from a long continuous roll.
+%
+%
+% \DescribeRoutine{drawdashellipse}
+% |drawdashellipse(j, len, ht)|
+% draws a dashed ellipse. The location and dimensional parameters
+% correspond to those for |drawovalbox|, as do the calculated points.
+%
+% \DescribeRoutine{drawdrum}
+% |drawdrum(j, len, ht)(btex str etex)|
+% draws a `drum' box. This is constructed as a rectangular box of width
+% width |len| and height |ht|, with its bottom left hand corner at |zj|.
+% The horizontal line at the bottom of the
+% rectangle is replaced by a half-ellipse with a major diameter of |len|
+% and the minor diameter given by |drumlid*len|. The horizontal line
+% at the top is replaced by a full ellipse with the same dimensions.
+%
+%\begin{figure}
+%\centering
+%\setlength{\unitlength}{0.6mm}
+%
+%\begin{picture}(100,100)
+% \put(0,0){\framebox(120,120){}}
+% \put(20,20){\begin{picture}(80,80)
+% \put(0,10){\line(0,1){60}}
+% \put(80,10){\line(0,1){60}}
+% \qbezier(0,10)(0,0)(40,0)
+% \qbezier(40,0)(80,0)(80,10)
+%
+% \qbezier(0,70)(0,80)(40,80)
+% \qbezier(40,80)(80,80)(80,70)
+% \qbezier(0,70)(0,60)(40,60)
+% \qbezier(40,60)(80,60)(80,70)
+%
+% \multiput(0,10)(0,30){3}{\circle*{2}}
+% \put(-2,10){\makebox(0,0)[r]{\texttt{zjbl}}}
+% \put(-2,40){\makebox(0,0)[r]{\texttt{zjml}}}
+% \put(-2,70){\makebox(0,0)[r]{\texttt{zjtl}}}
+% \multiput(80,10)(0,30){3}{\circle*{2}}
+% \put(82,10){\makebox(0,0)[l]{\texttt{zjbr}}}
+% \put(82,40){\makebox(0,0)[l]{\texttt{zjmr}}}
+% \put(82,70){\makebox(0,0)[l]{\texttt{zjtr}}}
+% \put(40,0){\circle*{2}}
+% \put(40,-2){\makebox(0,0)[t]{\texttt{zjbm}}}
+% \put(40,80){\circle*{2}}
+% \put(40,82){\makebox(0,0)[b]{\texttt{zjtm}}}
+% \put(40,35){\circle*{2}}
+% \put(40,37){\makebox(0,0)[b]{\texttt{zjc}}}
+%
+% \put(20,1){\circle*{2}}
+% \put(20,-1){\makebox(0,0)[t]{\texttt{zjbml}}}
+% \put(60,1){\circle*{2}}
+% \put(60,-1){\makebox(0,0)[t]{\texttt{zjbmr}}}
+% \put(20,79){\circle*{2}}
+% \put(20,81){\makebox(0,0)[b]{\texttt{zjtml}}}
+% \put(60,79){\circle*{2}}
+% \put(60,81){\makebox(0,0)[b]{\texttt{zjtmr}}}
+%
+% \end{picture}}
+%\end{picture}
+%\setlength{\unitlength}{1pt}
+%\caption[Calculated points on a drum]{Calculated points on a drum
+% (suffix is \texttt{j} and located at \texttt{zjbl=zj})}
+% \label{fig:drum}
+%\end{figure}
+%
+% As shown in Figure~\ref{fig:drum},
+% the calculated points on the vertical sides of the drum are the same
+% as for a rectangular box. There are three calculated points on the base
+% of the drum, called |zjbml|, |zjbm| and |zjbmr|. Similarly there are
+% three points on the top of the drum called |zjtml|, |zjtm| and |zjtmr|.
+% The center point, |zjc| is halfway between the sides and halfway between
+% the two lower ellipse halves. The text |str| is placed at this center point.
+%
+% \DescribeRoutine{drawstickman}
+% |drawstickman(j, len, ht)|
+% draws a genderless full frontal (or rear) stick figure enclosed in
+% an invisible box,
+% length |len| and height |ht|, located with its bottom left corner at |zj|.
+% This can be used, for example to represent an actor in a UML Use Case
+% diagram. Setting the height to be twice the length produces a reasonable
+% result, for instance:
+% \verb?drawstickman(3, wd, 2wd);?
+%
+%
+% \section{An example} \label{sec:example}
+%
+% The example attempts to bring out the main methods that can be used
+% in defining \ExpressG{} diagrams. The code for eleven diagrams is provided, none
+% of which necessarily has anything to do with a real example of \ExpressG{}
+% modeling, but rather is meant to be illustrative of diagramming techniques.
+%
+% This section is best studied with a copy of the printed diagrams to
+% hand. Section~\ref{sec:run} on \pref{sec:run} explains briefly how
+% to run the example and obtain the diagrams.
+%
+% The default extension for a \Mpost{} file is \file{.mp}.
+% \begin{macrocode}
+%<*eg>
+%%% EXPEG.MP Example MetaPost EXPRESS-G diagrams
+
+% \end{macrocode}
+%
+% Assuming that the diagrams are to be eventually embedded in, or processed
+% through, a \LaTeX{} document then any \TeX{} macros must come at the
+% start of the file between a |verbatimtex| \ldots |etex| pair. When dealing
+% with text, \Mpost{} does not handle more than a single line. The macro
+% below is to enable two lines of text to be handled by \Mpost.
+%
+% \begin{macrocode}
+
+% use btex \twolines{first}{second} etex for two-line labels
+verbatimtex \def\twolines#1#2{\vbox{\hbox{#1} \hbox{#2}}} etex
+
+% \end{macrocode}
+%
+% The \Lpack{expressg} package file has to be input to make the routines
+% available.
+% \begin{macrocode}
+input expressg
+
+% \end{macrocode}
+%
+% \subsection{Diagram 1: Some boxes and lines}
+%
+% Many diagrams can be defined in one file. Each diagram starts with
+% |beginfig(N)|, where N is a unique integer, and ends with |endfig;|.
+% \EPS{} for each diagram is written to a file called
+% \file{mproot.N}, where \file{mproot} is the root name of the input file.
+% In our
+% case the output files will be \file{expeg.1} through \file{expeg.11}.
+% \begin{macrocode}
+beginfig(1)
+
+% \end{macrocode}
+%
+% The first diagram consists of some of the \Lpack{expressg} box and line styles.
+% The main point is to illustrate how \Mpost{} allows the boxes to be aligned.
+% Start off by defining a point |z1| at the origin. By default, a variable name
+% starting with the letter |z| is assumed to be a point. Similarly, variables
+% starting with |x| and |y| are assumed to be x- and y-coordinates. If |zk|
+% is defined with a value then automatically |xk| is the value of the x
+% coordinate of
+% the point |zk| and |yk| is the value of the
+% y coordinate. Conversely, if |xj| and |yj| are defined, |zj| is automatically
+% defined.
+%
+% Note that the |=| sign denotes an equation, not an assignment. The power
+% of \Mpost{} comes from its ability to solve linear equations.
+%
+% Having defined the point |z1|, draw an EXPRESSION box with its bottom
+% left hand corner at |z1|.
+% \begin{macrocode}
+z1=(0,0);
+drawEXPRESSION(1);
+
+% \end{macrocode}
+%
+% Remember that when a box is drawn, its corner and mid points are
+% calculated. These can be used in defining other points. In particular
+% there is the point |z1tr| which is the top right hand corner
+% of the EXPRESSION box. Also, if another box is drawn at point |z2| then
+% it will have its bottom left hand corner at |z2bl|.
+%
+% The point |z2bl| is defined by a linear equation with respect to
+% the point |z2|. As \Mpost{} can solve linear equations, given the
+% point |z2bl| it can solve for the point |z2|.
+%
+% The next box has its bottom left hand corner at the top right hand
+% corner of the EXPRESSION box, by specifying that the
+% point |z2bl| and |z1tr| are the same location and then drawing a box located
+% at |z2|. The third (BOOLEAN) box is also stacked in the same way with
+% respect to the second (INTEGER) box.
+%
+% \begin{macrocode}
+z2bl=z1tr;
+drawINTEGER(2);
+
+z3bl=z2tr;
+drawBOOLEAN(3);
+
+% \end{macrocode}
+%
+% Next a piece of circled text is drawn. Using the same method as before,
+% the bottom of the circle is made to be coincident with the middle of the top
+% of the BOOLEAN box. The |namespace| routine is used to specify the circle
+% diameter. Note that an argument to a routine can itself be a routine.
+% \begin{macrocode}
+z4bm=z3tm;
+drawcirclebox(4, namespace(btex ABS etex)(nextra))(btex ABS etex);
+
+% \end{macrocode}
+%
+% \Mpost{} is a typed language, and new variables can be declared of a
+% particular type. A |numeric| variable holds a number (or a length).
+% The diameter of the circle just drawn is going to be used as a length
+% in later parts of this diagram, so it is sensible to store its value
+% in a new variable called |diam|. We then use it in drawing another
+% circle directly on top of the first one.
+% \begin{macrocode}
+numeric diam;
+diam = namespace(btex ABS etex)(nextra);
+
+z5bm=z4tm;
+drawcirclebox(5, diam)(btex SAB etex);
+
+% \end{macrocode}
+%
+% The next element in the diagram is an ENTITY box.
+% We use the default height for the entity box and the default page connector
+% length as its length (no reason, but it saves inventing another variable
+% or value).
+%
+% The ENTITY box is positioned with respect to the SAB circle, but in a
+% slightly more complicated way than earlier positions. We want the left hand
+% side of the box to align with the right hand side of the circle. Also,
+% the middle of the box should align with the top of the circle.
+%
+% The ENTITY box will be located at point |z6|. The easiest way is to
+% specify |z6| is |z6ml=(x5mr, y5tm)|, but to demonstrate more of \Mpost's
+% equation solving abilities a more complicated approach is taken to the
+% specification of the x coordinate. The horizontal distance between the
+% points |z5ml| and |z5tl| on the circle is the same as the distance
+% between the points |z5tr| and |z5mr|. We can express this as
+% |x5ml-x5tl = x5tr-x5mr|. As we want |x6ml|, which is the same as |x6bl|,
+% to be the same as |x5mr| we
+% can substitute into this equation, as done in the code below. Note that
+% \Mpost{} can solve for the unknown |x6bl| even though it is on
+% the right hand side
+% of the equation because the other three values are known.
+%
+% The y coordinate of the point |z6mr| is specified as
+% equal to the y coordinate of the top of the circle. Because of the linear
+% relations involving all the points on a box, it is sufficient to provide
+% one x coordinate and one y coordinate to fix all the points on the box.
+% \begin{macrocode}
+x5ml-x5tl = x5tr-x6bl;
+y6mr=y5tm;
+drawENT(6, pconl, enth)(btex an\_ent etex);
+
+% \end{macrocode}
+%
+% The geometric center of the next box, an LEVENT, is vertically above
+% the geometric center of the ENTITY box, and the bottom of LEVENT is slightly
+% (one lenth unit) above the top of the ENTITY box. This is accomplished here
+% by specifying |z7bm| in terms of expressions involving the coordinates
+% of the point |z6tm|.
+% \begin{macrocode}
+z7bm=(x6tm,y6tm+u);
+drawLEVENT(7, pconl, eventh)(btex levent etex);
+
+% \end{macrocode}
+%
+% At point |z8| a GEVENT box is drawn. It's bottom left hand corner is
+% vertically above the top left hand corner of the LEVENT box. If you look
+% at the resulting diagram, you will see that GEVENT is shifted right with
+% respect to LEVENT. For vertical alignment of EVENT boxes it is best to
+% use the middle rather than corner points.
+% \begin{macrocode}
+z8=(x7tl, y7tr+u);
+drawGEVENT(8, pconl, eventh)(btex gevent etex);
+
+% \end{macrocode}
+%
+% \DescribeRoutine{mediation}
+% For the last of the aligned boxes another aspect of \Mpost{} is used.
+% \Mpost{} provides a \emph{mediation} facility whose syntax is |frac[a,b]|.
+% The result of a mediation is a value that is |frac| between the value |a|
+% and the value |b|. For example, the result of |0.25[10,30]| is 15. Similarly,
+% the result of |1/3[zj,zk]| is the point one third of the way between point
+% |zj| and point |zk|.
+%
+% The SCHEMA box is positioned with its bottom right hand corner at one
+% eighth of the way along, and at the top of, the BOOLEAN box.
+% \begin{macrocode}
+z9br=1/8[z3tl,z3tr];
+drawSCHEMA(9, pconl, schemah)(btex a\_schema etex);
+
+% \end{macrocode}
+%
+% The second half of the diagram illustrates various line and end
+% styles. These are all horizontal, the same length and are aligned
+% vertically, so
+% define the x coordinate |xmid| of the left hand end of the lines, and
+% the length |len| of the lines.
+% \begin{macrocode}
+numeric xmid, len;
+xmid = x8tr + diam;
+len = 2diam;
+
+% \end{macrocode}
+%
+% \DescribeRoutine{shifted}
+% The next line of code exhibits another \Mpost{} function. A point can
+% be specified as being some other point that is \emph{shifted} by given
+% amounts in the x and y directions. More precisely, the shift is specified
+% by a pair of values, written as |(a,b)|. The first line is aligned
+% vertically with the center of the first box and its start point is |z11|.
+% The end point, |z111|, is specified as being the start point shifted
+% horizontally by the length of the line.
+% \begin{macrocode}
+z11=(xmid, y1ml); z111=z11 shifted (len, 0);
+drawdashO(11, 111);
+
+% \end{macrocode}
+%
+% Because we will be using the same horizontal shift for all the lines,
+% define a \emph{pair}, called |moveright|, that is the required shift.
+% The next two lines are also aligned vertically with the centers of the
+% second and third boxes.
+% \begin{macrocode}
+pair moveright;
+moveright = (len, 0);
+
+z12=(xmid, y2ml); z121=z12 shifted moveright;
+drawnormalO(12, 121);
+
+z13=(xmid, y3ml); z131=z13 shifted moveright;
+drawthickO(13, 131);
+
+% \end{macrocode}
+%
+% The remaining lines will have the same vertical spacing as the first three,
+% so define another pair, |moveup|, that we can use for vertical shift.
+% \begin{macrocode}
+pair moveup;
+moveup = (0, y13-y12);
+
+z14=z13 shifted moveup; z141=z14 shifted moveright;
+drawnormalD(14, 141);
+
+z15=z14 shifted moveup; z151=z15 shifted moveright;
+drawnormalCA(15, 151);
+
+z16=z15 shifted moveup; z161=z16 shifted moveright;
+drawnormalOA(16, 161);
+
+z17=z16 shifted moveup; z171=z17 shifted moveright;
+drawnormalF(17, 171);
+
+% \end{macrocode}
+%
+% The upper part of the diagram illustrates some of the additional
+% line styles and boxes provided that are not part of the
+% \ExpressG{} language.
+% \changes{v1.1}{1999/10/30}{Extended upper half of diagram 1 for new box
+% types}
+%
+% The upper half is seperated from the bottom half by a dashed line, just
+% to make the distinction. The line is set above the highest box so far,
+% which is located at |z8|, and extends across the width of the diagram.
+% \begin{macrocode}
+z300=(0,y8tm+diam); z301=(x111,y300);
+draw z300--z301 dashes;
+
+% \end{macrocode}
+% Define |mup| to be a distance, which we will use for vertical seperation.
+% \begin{macrocode}
+numeric mup; mup := onelineh;
+
+% \end{macrocode}
+%
+% As previously, we'll start with the boxes which will be placed in
+% a column at the left side of the diagram. The first box, high enough
+% for one line of enclosed text, has its top right hand corner folded
+% down by one quarter the box height. Text is placed at the center
+% of the box, but if this is not required then it can be given as an
+% empty string (i.e., |""|).
+% \begin{macrocode}
+z302=(0,y300+mup);
+drawcardbox(302, pconl, onelineh, 1/4onelineh)("");
+
+% \end{macrocode}
+%
+% The next box is a diamond shape. Unlike the rectangular and rhomboidal
+% boxes, these are positioned
+% via the center of the box instead of the bottom left hand corner.
+% \begin{macrocode}
+z303bm=(x302tm, y302tm+mup);
+drawdiamondbox(303, pconl, 2onelineh)(btex jewel etex);
+
+% \end{macrocode}
+%
+% Now there is a double box with the top portion being 3/4 of the box
+% height. Text is put into the top half of the box using \Mpost's
+% labeling routine (see \pref{page:label}).
+% \begin{macrocode}
+z304=(0, y303tm+mup);
+drawdoublerectangle(304, pconl, 2onelineh, 3/4);
+label(btex top etex, z304ct);
+
+% \end{macrocode}
+%
+% Next comes a triple box with the bottom portion being one fifth of
+% the height, and the top portion being two fifths of the height.
+% Text is placed in the top and middle portions, but not into the bottom.
+% \begin{macrocode}
+z305=(0, y304tm+mup);
+drawtriplerectangle(305, pconl, 3onelineh, 2/5, 0.2);
+label(btex top etex, z305ct);
+label("middle", z305cm);
+
+% \end{macrocode}
+%
+% Some languages include a box that looks a little like an index card, and
+% this is shown next.
+% A small box is also drawn inside the main part of the index box,
+% just to illustrate
+% that drawings may be placed inside boxes.
+% \begin{macrocode}
+z306=(0,y305tm+mup);
+drawindexbox(306, 2pconl, 3onelineh, 3/4pconl, onelineh)(btex pack etex);
+z307=1/8[z306bl,z306tr];
+drawENT(307, 1/4pconl, onelineh)(btex E etex);
+
+% \end{macrocode}
+%
+% Another box shown here is a dotted box that covers up anything that
+% is underneath it. To demonstrate, a folded corner box is drawn first,
+% and then the
+% dashed box is drawn second. They have to be done in this order.
+% (The reason for the notation |y306P.tl| is explained under diagram 2
+% on \pref{page:dotsuffix}).
+% \begin{macrocode}
+z308=(0, y306P.tl+mup);
+z309ml=z308c;
+drawcardbox(308, pconl, 2onelineh, 1/4onelineh)(btex covered etex);
+drawdashboxover(309, pconl, onelineh);
+
+% \end{macrocode}
+%
+% An oval box comes next. The perimeter is an ellipse.
+% \begin{macrocode}
+z310bm=(x306bm,y309tm+mup);
+drawovalbox(310, 2pconl, 2onelineh)("");
+
+% \end{macrocode}
+%
+% Now we have two rounded boxes. In the first one the corner radius is
+% small and the corners are neatly rounded. The radius is large in the
+% second case, and it is automatically reduced to give semicircular ends.
+% Further, the center portion of the second of these boxes is `deleted'
+% by putting a |hiderectangle| over it.
+% \begin{macrocode}
+z311ml=(x310mr+mup, y310ml);
+drawroundedbox(311, 2pconl, 2onelineh, 1/2onelineh)("rounded");
+
+z312ml=(x311mr+mup, y311mr);
+drawroundedbox(312, 2pconl, 2onelineh, 3/2onelineh)(btex large radius etex);
+
+z314=(x312bm-1/4pconl, y312bm-1/2mup);
+hiderectangle(314, 1/2pconl, (3/2onelineh + mup));
+
+% \end{macrocode}
+%
+% The last of the simple enclosed shapes are a dashed ellipse and a dashed circle,
+% which are aligned below the partially obscured rounded box.
+% \begin{macrocode}
+z315tm=(x312bm, y312bm-mup);
+drawdashellipse(315, 2pconl, 2onelineh);
+
+z316tm=(x315bm, y315bm-mup);
+drawdashcircle(316, diam);
+
+% \end{macrocode}
+%
+% A drum box is now presented. This is centered with respect to the
+% rounded box and aligned with the bottom of the triple box. It is the
+% same nominal size as the triple box.
+% \begin{macrocode}
+z317bc=(x311bm,y304br);
+drawdrum(317, pconl, 3onelineh)(btex drum etex);
+% \end{macrocode}
+% To be a little different, I'll add a `handle' to the top of the drum. The
+% top of the handle will be above the drum at the point |z317A|, and the
+% attachement points are at the |tml| and |tmr| points on the drum. The
+% normally sharp join in the middle of the handle is smoothed off.
+% \begin{macrocode}
+z317A=(x317tc, y317tc+2onelineh);
+drawnormalthree(317tml, 317A, 317tmr);
+smooth(317tml, 317A, 317tmr);
+
+% \end{macrocode}
+%
+% Below the drum box is a stick figure. It is centered with respect to the
+% drum box and based on the bottom row.
+% \changes{v1.6}{2004/02/29}{Added stickman to example drawing}
+% \begin{macrocode}
+z320bm = (x317bm, y302);
+drawstickman(320, onelineh, 2onelineh);
+
+% \end{macrocode}
+%
+% Above the drum box there is an output box, vertically aligned with the
+% stick figure, labelled `output'.
+% \changes{v1.6}{2004/02/29}{Added output box to example drawing}
+% \begin{macrocode}
+z325bm = (x320bm, y306);
+drawoutputbox(325, pconl, 2onelineh)(btex output etex);
+
+% \end{macrocode}
+%
+% Above the output box there is a simple circled dot.
+% \changes{v1.6}{2004/02/29}{Added circled dot to example drawing}
+% \begin{macrocode}
+z330 = (x320bm, y309ml);
+drawCircledDot(330, 3/2onelineh);
+
+% \end{macrocode}
+%
+% As in the bottom half, line styles are drawn on the right side of
+% of the diagram. First, though, there is an arrowed circle symbol.
+% This is vertically aligned with the centers of the lines.
+% \begin{macrocode}
+z401bm=(1/2[x11,x111], y301+mup);
+drawcircleA(401, diam);
+
+% \end{macrocode}
+%
+% Finish off with assorted linestyles.
+% \begin{macrocode}
+z402=(xmid, y401tm+mup); z502=(x111, y402);
+drawdashA(402, 502);
+
+z403=(xmid, y402+mup); z503=(x111, y403);
+drawdashOA(403, 503);
+
+z404=(xmid, y403+mup); z504=(x111, y404);
+drawnormalOD(404, 504);
+
+z405=(xmid, y404+mup); z505=(x111, y405);
+drawnormalCD(405, 505);
+
+z406=(xmid, y405+mup); z506=(x111, y406);
+drawnormalDCA(406, 506);
+
+% \end{macrocode}
+%
+% Lines can be drawn at any angle, and the non-circular line end styles
+% remain aligned.
+%
+% A set of lines and endstyles are drawn rotating about the common
+% start point of the lines.
+% \DescribeRoutine{rotatedaround}
+% |pt1 rotatatedaround(pt2, ang)| is \Mpost{} code that rotates
+% the point |pt1| around the point |pt2| counterclockwise through the angle
+% |ang| in degrees.
+%
+% \begin{macrocode}
+numeric ang; ang = 180/7;
+z600=(xmid, y406+2mup);
+z699=(x600+len, y600);
+z601=z699 rotatedaround(z600, ang);
+z602=z699 rotatedaround(z600, 2ang);
+z603=z699 rotatedaround(z600, 3ang);
+z604=z699 rotatedaround(z600, 4ang);
+z605=z699 rotatedaround(z600, 5ang);
+z606=z699 rotatedaround(z600, 6ang);
+z607=z699 rotatedaround(z600, 7ang);
+drawnormalCA(600,601);
+drawnormalOA(600,602);
+drawnormalF(600,603);
+drawdashA(600,604);
+drawnormalOD(600,605);
+drawnormalCD(600,606);
+
+% \end{macrocode}
+%
+% This is the end of the first diagram.
+% \begin{macrocode}
+endfig; % end figure 1
+
+% \end{macrocode}
+%
+% \subsection{Diagrams 2--5: EXPRESS-G like models}
+%
+% The diagrams in this section are all drawn using the \ExpressG{}
+% specific routines. Nevertheless, they do illustrate general BLA techniques.
+%
+% \subsubsection{Diagram 2: Schema level diagram}
+%
+% In contrast to the first diagram, this one is much more like an
+% \ExpressG{} diagram. It illustrates a diagram consisting of SCHEMA
+% boxes and interconnections.
+%
+% \begin{macrocode}
+beginfig(2) % schema level model
+
+% \end{macrocode}
+%
+% First define some lengths to assist in laying out the diagram, which is
+% going to consists of three rows of boxes with varying numbers of boxes
+% in each row; the bottom row has two, the middle has four, and the top row
+% has one. We also want to align the boxes vertically in a `nice' manner.
+%
+% \begin{macrocode}
+numeric lb, hb; % length & height of boxes
+lb=20u; hb=schemah;
+numeric upshift; % vertical distance between rows
+upshift = 20u;
+numeric sideshift; % horizontal distance between boxes
+sideshift = 10u;
+
+% \end{macrocode}
+%
+% The bottom row has two boxes and the second four. The two bottom boxes
+% will be aligned vertically under the two middle boxes in the middle row.
+% Allowance must be made for a `missing' box at the start of the bottom
+% row. The second box on the bottom row is spaced from the first one.
+% \begin{macrocode}
+%%% bottom row
+
+z9=(lb+sideshift,0);
+drawSCHEMA(9, lb, hb)("nine");
+
+z11=(x9br+sideshift,y9);
+drawSCHEMA(11, lb, hb)("eleven");
+
+% \end{macrocode}
+%
+% The bottom of the boxes on the second row are all at a fixed distance
+% above the top of the boxes on the first row. We only need to specify the
+% y coordinate of the bottom of one box in the row, and use that for the
+% remainder,
+% \begin{macrocode}
+%%% middle row
+
+z1=(0,y9tl+upshift);
+drawSCHEMA(1, lb, hb)("one");
+
+z3=(x1br+sideshift, y1);
+drawSCHEMA(3, lb, hb)("three");
+
+z5=(x3br+sideshift, y1);
+drawSCHEMA(5, lb, hb)("five");
+
+z7=(x5br+sideshift, y1);
+drawSCHEMA(7, lb, hb)("seven");
+
+% \end{macrocode}
+%
+% The single box on the top row will be position centrally above the
+% two middle boxes of the middle row. Mediation is used to calculate
+% the x coordinate that is halfway between the right side of the left
+% box and the left side of the right box.
+% \begin{macrocode}
+%%% top row
+
+x50 = 1/2[x3br,x5bl];
+z31bm=(x50,y1tl+upshift);
+drawSCHEMA(31, lb, hb)("thirtyone");
+
+% \end{macrocode}
+%
+% This completes the boxes. The diagram is finished off by drawing
+% connections between the boxes. The first set of connections are just
+% straight lines between known points on boxes.
+% \begin{macrocode}
+%%% connectors
+
+drawdashOO(9tm, 3bm); % three/nine
+drawdashO(5bm, 11tm); % five/eleven
+drawdashO(3ml, 1mr); % three/one
+drawdashO(3mr, 5ml); % three/five
+drawdashOO(9mr, 11ml); % nine/eleven
+
+% \end{macrocode}
+%
+% The next connection is more complex. It goes from schema thirtyone
+% to schema nine on a three-legged route. It goes horizontally left from
+% thirtynine, then vertically down, and finally horizontally right to nine. It
+% also passes to the left of schema one.
+%
+% The route is constructed by specifying a point |z90| to the left of
+% schema nine, and the point |z31A| on the left hand of schema thirtynine.
+% The |VH| routine is then called to generate the corner point on the
+% (rotated) L shaped path between |z90| and |z31A|. The connection is then
+% drawn using these four points.
+% \begin{macrocode}
+%%% thirtyone/nine
+z90=((x1bl-sideshift), y9ml);
+z31A=3/4[z31bl,z31tl];
+VH(90, 31A);
+drawdashO(90vh, 31A);
+drawdashthreeO(90vh, 90, 9ml);
+% \end{macrocode}
+%
+% \DescribeRoutine{pickup}
+% To demonstrate another aspect of \Mpost, a dot is drawn at the location
+% of |z90|. If the drawing pen is thick enough, just drawing one point is
+% sufficient to make a noticeable dot. The code |pickup thickpen;| drops
+% the current pen and picks up
+% the thickpen for drawing. The code |pickup normalpen;| picks up the
+% normal pen, which is the one that is normally used.
+%
+% \DescribeRoutine{label}
+% \DescribeRoutine{dotlabel}
+% The last line of code here is |label.lft("z90", z90);| which puts the
+% text `z90' at the left of point |z90|.\label{page:label}
+% The label routine has two arguments,
+% the first the text and the second the point at or near which the text is
+% to be placed. The simplest form of the routine is |label("text", zk)| which
+% centers the text over the point |zk|. A
+% suffix can be used after the |label| (e.g., |.lft| in the code below) to
+% modify the placement. |.lft| positions the text at the left of the point.
+% The other modifiers are: |.rt|, |.top|, |.bot|, |.ulft|, |.urt|, |.llft| and
+% |.lrt|. There is also a |dotlabel.suffix("text", zk)| routine which draws
+% the point as well. For complicated diagrams it can be useful to label
+% some points during development, and then comment them out for the final
+% picture.
+% \begin{macrocode}
+pickup thickpen;
+draw z90;
+pickup normalpen;
+label.lft("z90", z90);
+
+% \end{macrocode}
+%
+% The next two connectors, between schemas one and eleven and between
+% thirtyone and eleven are of a similar U shape. There is, though, one tricky
+% point to remember. Up till now, all point arguments to the \Lpack{expressg}
+% routines have been of the form |3| or |4bm|;
+% that is, either a number or a number
+% followed by letter(s). For example, |VH(3,4bm)| will calculate
+% the point |z3vh|. However, if a routine adds more letters to an argument
+% that already has letters, such as |VH(4bm,3)|, the calculated point is
+% \emph{not} |z4bmvh| as might be expected, but instead
+% is |z4bm.vh|.\label{page:dotsuffix}
+% This has tripped me up on several occasions.
+% \begin{macrocode}
+%%% one/eleven
+z1A=1/3[z1bl,z1br];
+z11A=(x11bm, (y11bm-sideshift));
+VH(1A, 11A);
+drawdashthree(1A, 1A.vh, 11A); % note it is 1A.vh and not 1Avh
+drawdashO(11A, 11bm);
+dotlabel.rt("z11A", z11A);
+dotlabel.lft("z1A.vh", z1A.vh); % note it is z1A.vh and not z1Avh
+
+% \end{macrocode}
+%
+% The connector between thirtyone and eleven is the same general shape
+% as the thirtyone to nine connector. This time, I'll use the |HxH| routine
+% to calculate the turning points
+% \begin{macrocode}
+%%% thirtyone/eleven
+z31B=3/4[z31br,z31tr];
+x31BC=x7br+sideshift;
+HxH(31B, 31BC, 11mr);
+drawdashfourO(31B, 31B.hxh, 11mr.hxh, 11mr);
+
+% \end{macrocode}
+%
+% The next two connectors, between thirtyone and seven, and between
+% thirtyone and one, are simple L shapes, which are easier to produce than the
+% U shaped ones.
+% \begin{macrocode}
+%%% thirtyone/seven
+z31D=1/4[z31br,z31tr];
+VH(7tm, 31D);
+drawnormalthreeO(31D, 7tm.vh, 7tm);
+
+%%% thirtyone/one
+z31C=1/4[z31bl,z31tl];
+VH(1tm, 31C);
+drawdashO(1tm.vh, 31C);
+drawdashO(1tm.vh, 1tm);
+
+% \end{macrocode}
+%
+% The last two connectors are also simple, each consisting of vertical then
+% horizontal then vertical lines and the turning points can be calculated
+% by the |VhV| routine..
+% \begin{macrocode}
+%%% thirtyone/three
+z31E=1/4[z31bl,z31br];
+VhV(31E, 3tm);
+drawnormalfourO(31E, 31E.vhv, 3tm.vhv, 3tm);
+
+%%% thirtyone/five
+z31F=3/4[z31bl,z31br];
+VhV(31F, 5tm);
+drawnormalfourO(31F, 31F.vhv, 5tm.vhv, 5tm);
+
+% \end{macrocode}
+%
+% The last element in the diagram is a vertical closed arrowheaded line
+% with a label alongside. The arrowhead is on the top line of the connector
+% between thirtyone and eleven. Note the point mediation expression expression
+% in the |label| routine call.
+% \begin{macrocode}
+%%% labeled arrow
+z3111=1/4[z31B,z31B.hxh];
+numeric arrowsize;
+arrowsize := schemah;
+z3112=(x3111, y3111+arrowsize);
+drawnormalCA(3112, 3111);
+label.rt(btex an\_import etex, 1/2[z3111, z3112]);
+
+% \end{macrocode}
+%
+% The end of this diagram.
+% \begin{macrocode}
+endfig; % end fig 2
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 3: Tree structure}
+%
+% This diagram is the first of three that are related in style. It is
+% useful at this point to define some variables, and values for some of
+% these as they will probably be used in all three diagrams.
+%
+% Values are assigned (e.g., |var := val;|) so that they can be changed
+% later if necessary (e.g., |var := newval;|). If values were equated like
+% |var = val;| then they cannot be changed afterwards\footnote{Except
+% by assignment.} as |var = newval;|
+% will then have specified two incompatible equations for |var| and \Mpost will
+% report a problem.
+% \begin{macrocode}
+
+%%%% some commonly used variables & values
+
+numeric pl, ph; % length & height of numeric page connectors
+pl:=pconl; ph:=pconh; % for eg., 9,9 (9,9)
+numeric plnamed; % length of named page connector
+numeric irh; % height of interschema boxes
+irh:=ish; % normally one line of text
+numeric sdtl, sdth; % length & height of SDT (e.g. INTEGER) boxes
+sdtl:=sdtbl; sdth:=sdtbh;
+numeric edtl, edth; % length & height of enum boxes (inset is sdtbs)
+edth:=sdtbh; % normally one text line
+numeric el, eh; % length & height of entity boxes
+eh:=enth; % normally one text line
+numeric upshift; % vertical space between rows of boxes
+numeric nextup; % vertical space between bases of rows of boxes
+% \end{macrocode}
+%
+% Now another bit of \Mpost. There is another type of variable called
+% a |picture| variable. This can hold something as trivial as a dot or
+% a text string, up to a complete diagram. References to an Index
+% type is a common element in some of the diagrams. It is useful to
+% create a shorthand for these by using picture variables.
+% \begin{macrocode}
+picture sindex, pindex;
+sindex := btex eleven.Index etex; % interschema reference text
+pindex := btex 9,9 Index etex; % page reference text
+numeric slindex, plindex;
+slindex := namespace(sindex)(nextra); % length of Index interschema
+plindex := namespace(pindex)(nextra); % length of Index page reference
+% \end{macrocode}
+%
+% Yet more new \Mpost. Array variables are supported. These are declared
+% by giving the variable name immediately followed by a pair of square
+% brackets. An element of an array can be simply accessed by suffixing the
+% variable name with the integer number denoting the desired position.
+% Actually we have been using array variables all along, as |z3| or |x7|
+% are elements of the arrays |z[]| and |x[]| respectively. We define
+% two arrays, one to be used for specifying horizontal spaces (lengths)
+% and the other for vertical (y) coordinates.
+% \begin{macrocode}
+numeric hspace[]; % horizontal spaces
+numeric lyc[]; % Y coords of box bases
+
+%%%%%%%%%%% end commonly used variables & values
+
+% \end{macrocode}
+%
+% Diagram 3 consists of type boxes. We will make these all the same length
+% and height.
+% \begin{macrocode}
+beginfig(3) % example fig 3
+%%%drawgrid;
+
+% \end{macrocode}
+%
+% The space required for the longest name is |edtl|.
+% \begin{macrocode}
+edtl := namespace(btex standard\_data\_name etex)(niextra);
+% \end{macrocode}
+%
+% There are several rows in the diagram. Specify the vertical space
+% between the rows, and the space between the bottoms of the boxes (the
+% height of a box is the normal height, |sdth|, for a type box). Also
+% specify the y coordinates for each row, counting from the bottom.
+% \begin{macrocode}
+upshift=2sdth;
+nextup=sdth+upshift;
+%%% the y coords of box bases
+lyc1:=0;
+lyc2:=lyc1+nextup;
+lyc3:=lyc2+nextup;
+lyc4:=lyc3+nextup;
+lyc5:=lyc4+nextup;
+lyc6:=lyc5+nextup;
+lyc7:=lyc6+nextup;
+lyc8:=lyc7+nextup;
+% \end{macrocode}
+% Specify two horizontal spaces.
+% \begin{macrocode}
+hspace1 := 1/3edtl; % space between data enums
+hspace2 := 2/3edtl; % initial space at start of second row
+
+% \end{macrocode}
+% Draw the 3 boxes in the first row and the 3 in the second; these are
+% staggered with respect to each other and overlap as otherwise there
+% there is not enough space to get them all onto one page.
+% I'll use a numbering scheme for
+% points so that |zCR| is a point in the Cth column and the Rth row.
+% \begin{macrocode}
+%%% bottom two rows (1 & 2)
+
+z11=(0,lyc1);
+drawENUM(11, edtl, edth)(btex coordinates etex);
+
+z22=(hspace2, lyc2);
+drawENUM(22, edtl, edth)(btex solution\_data etex);
+
+z31=(x11br+hspace1, lyc1);
+drawENUM(31, edtl, edth)(btex pressure\_loads etex);
+
+z42=(x22br+hspace1, lyc2);
+drawENUM(42, edtl, edth)(btex nondimensional etex);
+
+z51=(x31br+hspace1, lyc1);
+drawENUM(51, edtl, edth)(btex temperature etex);
+
+z62=(x42br+hspace1, lyc2);
+drawENUM(62, edtl, edth)(btex force\_loads etex);
+
+% \end{macrocode}
+%
+% The third `row' consists of a horizontal line stretching from the middle
+% of the leftmost box to the middle of the rightmost box. There are
+% connections from this line to the top middle of each of the boxes. We can
+% use the |VyV| routine for the end points of the line.
+% \begin{macrocode}
+%%% third row (horizontal line between 2 & 4 row)
+
+z13=(x11tm,lyc3);
+VyV(11tm, 13, 62tm);
+drawnormal(11tm.vyv, 62tm.vyv);
+% \end{macrocode}
+%
+% Calculate the points on this line vertically above the midpoints of
+% the boxes and draw the connections.
+% \begin{macrocode}
+z23=(x22tm,lyc3); z33=(x31tm,lyc3); z43=(x42tm,lyc3); z53=(x51tm,lyc3);
+drawnormalO(11tm.vyv,11tm);
+drawnormalO(23,22tm);
+drawnormalO(33,31tm);
+drawnormalO(43,42tm);
+drawnormalO(53,51tm);
+drawnormalO(62tm.vyv,62tm);
+
+% \end{macrocode}
+%
+% The fourth row consists of three boxes. There is a vertical line
+% from the bottom
+% of the leftmost box to the horizontal line drawn in row 4. The three
+% boxes are aligned horizontally with respect to this line.
+% \begin{macrocode}
+%%% fourth row
+
+z3224=1/3[z13,z62tm.vyv];
+z3554=2/3[z13,z62tm.vyv];
+
+%%% standard_data_name
+z24bm=(x3224,lyc4);
+drawSELECT(24, edtl, edth)(btex standard\_data\_name etex);
+drawnormal(24bm,3224);
+
+%%% adhoc_data_name
+z54bm=(x3554,lyc4);
+drawTYPE(54, edtl, edth)(btex adhoc\_data\_name etex);
+
+%%% STRING
+z64br=(x62br,lyc4);
+drawSTRING(64);
+
+% \end{macrocode}
+%
+% The fifth `row' consists of two vertical connectors to the tops of
+% the SELECT and TYPE boxes, with a horizontal line connecting the tops
+% of the connectors.
+% \begin{macrocode}
+%%% fifth row
+
+z35=(1/2[x24tm,x54tm], lyc5);
+VyV(24tm, 35, 54tm);
+drawnormalthreeO(35, 24tm.vyv, 24tm);
+drawnormalthreeO(35, 54tm.vyv, 54tm);
+
+% \end{macrocode}
+%
+% The top row consists of a SELECT box vertically aligned above the center
+% of the horizontal line from the 5th row, together with a line joining
+% these two, and also a page reference box
+% off towards the right hand side
+% \begin{macrocode}
+%%% sixth row
+
+z36bm=(x35,lyc6);
+drawSELECT(36,edtl, edth)(btex data\_name etex);
+drawnormal(36bm,35);
+
+%%% data_name
+z66=(x62,lyc6);
+drawPREF(66, sdtl, ph)(btex 3,1 (4) etex);
+
+% \end{macrocode}
+%
+% The remaining elements on the diagram are:
+% a connector on the 4th row from adhoc\_data\_name to STRING;
+% and a connector on the 6th row from the page reference to data\_name.
+% \begin{macrocode}
+%%%% rest of the connectors
+
+%%% adhoc/STRING (54, 64)
+drawnormalO(54mr,64ml);
+
+%%% PREF/data_name (36, 66)
+drawdashO(66ml,36mr);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 3
+
+% \end{macrocode}
+%
+% \subsubsection{Diagram 4: Supertypes and subtypes}
+%
+% This diagram consists of a supertype entity and its four subtypes. The
+% entities have various attributes.
+%
+% \begin{macrocode}
+
+beginfig(4) % example 4
+%%%drawgrid;
+
+% \end{macrocode}
+%
+% Define some useful lengths.
+% \begin{macrocode}
+%%% length of named page reference boxes
+plnamed := namespace(btex 9,9 data\_name etex)(nextra);
+
+%%% length of entity boxes
+el := namespace(btex (ABS) Data\_t etex)(nextra);
+
+upshift := 2sdth; % vertical space between boxes
+nextup := sdth+upshift; % vertical space between bases of boxes
+hspace1 := 1/2el; % space between entity boxes
+
+%%% the y coords of box bases
+lyc1:=0;
+lyc2:=lyc1+nextup;
+lyc3:=lyc2+nextup;
+lyc4:=lyc3+nextup;
+lyc5:=lyc4+nextup;
+lyc6:=lyc5+nextup;
+lyc7:=lyc6+nextup;
+lyc8:=lyc7+nextup;
+
+% \end{macrocode}
+%
+% We'll start with the second row which consists of 4 entity (subtype)
+% boxes. The numbering scheme for point suffixes is |zCR|, where |C|
+% is the column number and |R| is the row number.
+% \begin{macrocode}
+%%%% 2nd row
+
+%%% IntArray
+z12=(0,lyc2);
+drawENT(12, el, eh)(btex IntArray etex);
+
+%%% RealArray
+z22=(x12br+hspace1, lyc2);
+drawENT(22, el, eh)(btex RealArray etex);
+
+%%% CharArray
+z42=(x22br+hspace1, lyc2);
+drawENT(42, el, eh)(btex CharArray etex);
+
+%%% BitArray
+z52=(x42br+hspace1, lyc2);
+drawENT(52, el, eh)(btex BitArray etex);
+
+% \end{macrocode}
+%
+% The first row is four simple data type boxes, aligned underneath the
+% entity boxes.
+% \begin{macrocode}
+%%%% 1st row
+
+z11bm=(x12bm,lyc1);
+drawINTEGER(11);
+
+z21bm=(x22bm,lyc1);
+drawREAL(21);
+
+z41bm=(x42bm,lyc1);
+drawSTRING(41);
+
+z51bm=(x52bm,lyc1);
+drawBINARY(51);
+
+% \end{macrocode}
+%
+% The third `row' is the thick lines connecting the subtype boxes.
+% \begin{macrocode}
+%%% 3rd row
+
+y13= y23= y43= y53=lyc3;
+x13=x12tm; x23=x22tm; x43=x42tm; x53=x52tm;
+drawthick(13,53); % horizontal line
+%%% vertical connectors
+drawthickO(13,12tm); drawthickO(23,22tm);
+drawthickO(43, 42tm); drawthickO(53, 52tm);
+
+z33=1/2[z13,z53]; % midpoint of horizontal line
+
+% \end{macrocode}
+%
+% The 4th row is an abstract supertype entity box, which is made 3 times
+% taller than the default entity box height. The entity box is centered
+% with respect to the row of subtype boxes and is connected to the
+% subtype boxes connector. The digit 1 is placed near the connection point.
+% There is also a page reference
+% and an INTEGER box at the left and right (as attributes of the supertype).
+% \begin{macrocode}
+%%% 4th row
+
+%%% Data_t
+z34bm=(x33,lyc4);
+drawENT(34, el, 3eh)(btex \twolines{(ABS)}{Data\_t} etex);
+drawthick(34bm,33);
+label.urt("1", z33); % label the connection point
+
+%%% Index
+z14=(0,lyc4);
+drawPREF(14, plindex, ph)(pindex);
+
+%%% INTEGER
+z54br=(x51br,lyc4);
+drawINTEGER(54);
+
+% \end{macrocode}
+%
+% The 5th row has page reference boxes at the left and right
+% (as attributes of the supertype).
+% \begin{macrocode}
+%%% 5th row
+
+lyc5:=y34tm-ph; % change the initial y coord value
+
+%%% Index
+z15=(0,lyc5);
+drawPREF(15, plindex, ph)(pindex);
+
+%%% DataType
+z55=(x54,lyc5);
+drawPREF(55, plnamed, ph)(btex 3,1 data\_name etex);
+
+% \end{macrocode}
+%
+% The 6th, and last, row, just consists of a page reference centered
+% above the supertype box.
+% \begin{macrocode}
+%%% 6th row
+
+%%% PREF to Data_t
+lyc6:=lyc5+nextup;
+z36bm=(x34tm,lyc6);
+drawPREF(36, pl, ph)(btex 7,5 (6) etex);
+
+% \end{macrocode}
+%
+% The rest of the diagram consists of the labelled attribute lines.
+% \begin{macrocode}
+%%%% attributes
+
+%%% Sizes Data_t/Index (34, 14)
+z3414=(x34,y14mr);
+drawnormal(3414,14mr);
+label.ulft(btex Sizes A[1:Limit] etex, z3414);
+
+%%% num Data_t/INTEGER (34, 54)
+z3454=(x34mr,y54ml);
+drawnormalO(3454,54ml);
+label.urt(btex (DER) num etex, z3454);
+
+%%% Limit Data_t/Index (34, 15)
+z3415=(x34,y15mr);
+drawnormal(3415,15mr);
+label.ulft(btex Limit etex, z3415);
+
+%%% Kind Data_t/data_name (34, 55)
+z3455=(x34mr, y55ml);
+drawnormal(3455, 55ml);
+label.urt(btex Kind etex, z3455);
+
+%%% PREF into Data_t (36, 34)
+drawdashO(36bm, 34tm);
+
+%%% Data IntArray/INTEGER (12, 11)
+drawnormalO(12bm, 11tm);
+label.lrt(btex Data A[1:num] etex, z12bm);
+
+%%% Data RealArray/REAL (22, 21)
+drawnormalO(22bm, 21tm);
+label.lrt(btex Data A[1:num] etex, z22bm);
+
+%%% Data CharArray/STRING (42, 41)
+drawnormalO(42bm, 41tm);
+label.lrt(btex Data A[1:num] etex, z42bm);
+
+%%% Data BitArray/BINARY (52, 51)
+drawnormalO(52bm, 51tm);
+label.lrt(btex Data A[1:num] etex, z52bm);
+
+% \end{macrocode}
+%
+% The end of this diagram.
+% \begin{macrocode}
+endfig; % end fig 4
+
+% \end{macrocode}
+%
+% \subsubsection{Diagram 5: Portion of larger model}
+%
+% This diagram is more complex than the previous ones. It is, nevertheless,
+% presented with virtually no commentary. It consists of three entity boxes
+% and various page reference and interschema boxes to support the
+% entities' attributes.
+%
+% \begin{macrocode}
+beginfig(5) % example 5
+%%drawgrid;
+
+% \end{macrocode}
+%
+% As usual, specify commonly used variables and values.
+% \begin{macrocode}
+plnamed := namespace(btex 7,4 Unstructured\_Donor etex)(nextra);
+
+numeric irls, irll; % length of short and long ISR boxes
+irls = namespace(btex eleven.MeshLocation etex)(nextra);
+irll = namespace(btex eleven.MeshConnectivityType etex)(nextra);
+
+upshift := irh;
+nextup := irh+upshift;
+
+numeric maxrx; % max x coordinate value of LH of right column boxes
+maxrx := maxx-irrl;
+numeric xmid; % x coord of figure center
+xmid := 1/2[irls, maxx-irll];
+
+el := namespace(btex MeshConnectivity1\_1 etex)(nextra);
+eh := irh;
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+nextup;
+lyc3 := lyc2+nextup;
+lyc4 := lyc3+nextup+irh;
+lyc5 := lyc4+nextup;
+lyc6 := lyc5+nextup;
+lyc7 := lyc6+nextup;
+lyc8 := lyc7+nextup;
+lyc9 := lyc8+nextup;
+
+% \end{macrocode}
+%
+% Rows one and two have one centered box each.
+% \begin{macrocode}
+%%% Zcol/row
+%%% row 1
+
+%%% PREF for Overlapping
+z21bm=(xmid,lyc1);
+drawPREF(21, pl, ph)(btex 5,3 (8) etex)
+
+%%% row 2
+
+%%% OverlappingArea
+z22bm=(x21bm,lyc2);
+drawENT(22, el, eh)(btex OverlappingArea etex);
+
+% \end{macrocode}
+%
+% Row three has three boxes, and the middle one is centered.
+% \begin{macrocode}
+%%% row 3
+
+%%% IndexArray
+z13=(pl,lyc3);
+drawISR(13, irls, irh)(btex eleven.IndexArray etex);
+
+%%% Index
+z23bm=(x22bm,lyc3);
+drawISR(23, slindex, irh)(sindex);
+
+%%% MeshLocation
+z33br=(maxx,lyc3);
+drawISR(33, irls, irh)(btex eleven.MeshLocation etex);
+
+% \end{macrocode}
+%
+% Row four has three boxes, and the middle one is centered.
+% \begin{macrocode}
+%%% row 4
+
+%%% MeshConnectivity
+z24bm=(x23bm,lyc4);
+drawENT(24, el, eh)(btex MeshConnectivity etex);
+
+%%% PREF for MeshConnectivity
+z14ml=(pl,y24ml);
+drawPREF(14, pl, ph)(btex 5,2 (8) etex);
+
+%%% Structured_Donor
+z34br=(maxx,lyc4);
+drawPREF(34, plnamed, ph)(btex 7,5 Structured\_Donor etex);
+
+% \end{macrocode}
+%
+% Rows five and six have one box each, at the right hand side.
+% \begin{macrocode}
+%%% row 5
+
+%%% Unstructured_donor
+z35br=(maxx,lyc5);
+drawPREF(35, plnamed, ph)(btex 7,4 Unstructured\_Donor etex);
+
+%%% row 6
+
+%%% MeshConnType
+z36br=(maxx,lyc6);
+drawISR(36, irll, irh)(btex eleven.MeshConnectivityType etex);
+
+% \end{macrocode}
+%
+% Row seven has three boxes, and the middle one is centered.
+% \begin{macrocode}
+%%% row 7
+
+%%% IndexRange
+z17=(0,lyc7);
+drawISR(17, irls, irh)(btex eleven.IndexRange etex);
+
+%%% INTEGER
+x27bm=x24bm; y27ml=y17mr;
+drawINTEGER(27);
+
+%%% Zone
+z37br=(maxx,lyc7);
+drawISR(37, irls, irh)(btex seven.Zone etex);
+
+% \end{macrocode}
+%
+% Rows eight and nine have one centered box each.
+% \begin{macrocode}
+%%% row 8
+
+%%% 1to1
+z28bm=(x24bm,lyc8);
+drawENT(28, el, eh)(btex MeshConnectivity1\_1 etex);
+
+%%% row 9
+
+%%% PREF to 1to1
+z29bm=(x28bm,lyc9);
+drawPREF(29, pl, ph)(btex 5,1 (8) etex);
+
+% \end{macrocode}
+%
+% All the boxes have been drawn. The remainder is adding and labelling
+% attribute lines. First page references to subtype entities.
+% \begin{macrocode}
+%%%% attributes, etc
+
+drawthickO(21tm,22bm); % PREF to Overlap (21, 22)
+drawthickO(14mr,24ml); % PREF to MeshConn (14, 24)
+drawthickO(29bm,28tm); % PREF to 1to1 (29, 28)
+
+% \end{macrocode}
+%
+% The attributes of entity OverlappingArea (|z22|)
+% \begin{macrocode}
+%%% PointListSize (22, 23)
+drawdashO(22tm,23bm);
+label.llft(btex PointListSize etex, z23bm);
+
+%%% PointRange (22, 17)
+z22A=1/4[z22bl,z22tl]; z17A=(1/2[0,x13], y17);
+VH(17A,22A);
+drawdashthreeO(22A, 17A.vh, 17A);
+label.ulft(btex PointRange etex, z22A);
+
+%%% PointList (22, 13)
+z22B=3/4[z22bl,z22tl];
+VH(13bm,22B);
+drawdashthreeO(22B, 13bm.vh, 13bm);
+label.ulft(btex PointList etex, z22B);
+
+%%% MeshLocation (22, 33)
+z22C=1/4[z22br,z22tr];
+z33B=2/3[z33bl,z33br];
+VH(33B,22C);
+drawnormalthreeO(22C, 33B.vh, 33B);
+label.urt(btex (DER) Location etex, z22C);
+
+%%% Meshloc (22, 33)
+z22D=3/4[z22br,z22tr];
+z33A=1/3[z33bl,z33br];
+VH(33A,22D);
+drawdashthreeO(22D, 33A.vh, 33A);
+label.urt(btex Meshloc etex, z22D);
+
+% \end{macrocode}
+%
+% The attributes of entity MeshConnectivity (|z24|).
+% \begin{macrocode}
+%%% PointListSize (24, 23)
+drawnormalO(24bm, 23tm);
+label.ulft(btex PointListSize etex, z23tm);
+
+%%% StructuredDonor (24, 34)
+z24A=(x24br,y34ml);
+draw z24A--z34ml dashes;
+label.lrt(btex StructuredDonor etex, z24A);
+
+%%% UnstructuredDonor (24, 35)
+z24B=3/4[z24br,z24tr];
+HvH(24B,35ml);
+drawdashfourO(24B, 24B.hvh, 35ml.hvh, 35ml);
+label.urt(btex UnstructuredDonor etex, z24B.hvh);
+
+%%% Meshloc (24, 33)
+z24C=4/6[z24bl,z24br];
+z33C=(x33A,y33tm);
+y2433C=1/3[y33C,y24C];
+VyV(24C, 2433C, 33C);
+drawdashfourO(24C, 24C.vyv, 33C.vyv, 33C);
+label.lrt(btex Meshloc etex, z24C.vyv);
+
+%%% Location (24, 33)
+z24D=5/6[z24bl,z24br];
+z33D=(x33B,y33tm);
+y2433D=2/3[y33D,y24D];
+VyV(24D, 2433D, 33D);
+drawnormalfourO(24D, 24D.vyv, 33D.vyv, 33D);
+label.lrt(btex (DER) Location etex, z24D.vyv);
+
+%%% ConnectivityType (24, 36)
+z24H=(x24D,y24tr);
+z36H=z36bm;
+y2436H=1/2[y35tr,y36br];
+VyV(24H, 2436H, 36H);
+drawnormalfourO(24H, 24H.vyv, 36H.vyv, 36H);
+label.urt(btex (DER) ConnectivityType etex, z24H.vyv);
+
+%%% Meshcon (24, 36)
+z24G=(x24C,y24tr);
+z36G=z36ml;
+VH(24G,36G);
+drawdashthreeO(24G, 24G.vh, 36G);
+label.urt(btex Meshcon etex, z24G.vh);
+
+%%% K (24, 27)
+drawnormalO(24tm, 27bm);
+label.ulft(btex K etex, z24tm);
+
+%%% PointRange (24, 17)
+z24E=1/4[z24tl,z24tr];
+x17br-x17E = x17A-x17bl;
+y17E = y17A;
+VhV(24E,17E);
+drawdashfourO(24E, 24E.vhv, 17E.vhv, 17E);
+label.ulft(btex PointRange etex, z24E);
+
+%%% PointList (24, 13)
+z24F=1/4[z24bl,z24br];
+z13F=1/2[z13tl,z13tr];
+VhV(24F,13F);
+drawnormalfourO(24F, 24F.vhv, 13F.vhv, 13F);
+label.llft(btex PointList etex, z24F);
+
+% \end{macrocode}
+%
+% The attributes of entity MeshConnectivity1\_1 (|z28|)
+% \begin{macrocode}
+%%% N (28, 27)
+z27A=1/5[z27tl,z27tr];
+z28A=(x27A,y28bl);
+drawnormalO(28A,27A);
+label.llft(btex N etex, z28A);
+
+%%% trans (28, 27)
+z27B=1/2[z27tl,z27tr];
+z28B=(x27B,y28bl);
+drawdashO(28B,27B);
+label.lrt(btex \twolines{trans}{A[1:N]} etex, z28B);
+
+%%% Transform (28, 27)
+z27C=1/2[z27br,z27tr];
+z28C=(1/2[x27C,x28br], y28br);
+VH(28C,27C);
+drawnormalthreeO(28C,28C.vh,27C);
+label.lrt(btex (DER) Transform A[1:N] etex , z28C);
+
+%%% DonorZone (28, 37)
+z28D=1/2[z28br,z28tr];
+z37D=z37tm;
+VH(37D,28D);
+drawdashthreeO(28D,37D.vh,37D);
+label.urt(btex DonorZone etex, z28D);
+
+%%% DonorPointRange (28, 17)
+z28G=3/4[z28bl,z28tl];
+z17G=(x17A,y17tl);
+VH(17G,28G);
+drawnormalthreeO(28G,17G.vh,17G);
+label.ulft(btex DonorPointRange etex, z28G);
+
+%%% PointRange (28, 17)
+z28H=1/4[z28bl,z28tl];
+z17H=(x17E,y17G);
+VH(17H,28H);
+drawnormalthreeO(28H,17H.vh,17H);
+label.ulft(btex PointRange etex, z28H);
+
+% \end{macrocode}
+%
+% The end of this diagram.
+% \begin{macrocode}
+endfig; % end fig 5
+
+% \end{macrocode}
+%
+% \subsection{Diagrams 6--11: Car model}
+%
+% The diagrams in this section are all taken from~\cite[Chapter~2]{EBOOK}.
+% A simple information/data model of a car, car model, and car manufacturer
+% is presented in a variety of BLA languages, among which is,
+% of course, \ExpressG. In words, the model is:
+% \begin{quote} \itshape
+% A car is made by a manufacturer. Each manufacturer has a unique name.
+% A manufacturer constructs cars in several models and a car is of a
+% particular model. A manufacturer gives a serial number to each car
+% he produces and this is unique across all cars produced by that
+% manufacturer. Each model also has a name, and this is unique across
+% all models. A car has a year of production.
+% \end{quote}
+% This model is a small portion of a conceptual model developed as a common
+% specification for comparing modeling languages~\cite{TR9007}.
+%
+% The purpose of these diagrams is to
+% illustrate how the \Lpack{expressg} package supports a range of graphical
+% languages.
+%
+%
+% \subsubsection{Diagram 6: \ExpressG}
+%
+% Having already seen several examples of \ExpressG{} diagrams, this one
+% is presented with no further comments.
+% \begin{macrocode}
+
+beginfig(6) % example 6 EXPRESS-G
+%%%drawgrid;
+
+upshift := 3/2onelineh;
+nextup := onelineh+upshift;
+
+el := namespace(btex manufacturer etex)(nextra);
+eh := onelineh;
+
+hspace1 := 1/2el;
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+nextup;
+lyc3 := lyc2+nextup;
+lyc4 := lyc3+nextup;
+lyc5 := lyc4+nextup;
+
+%%% Zcol/row
+
+%%% rows 4 and 5
+z14=(0,lyc4);
+drawENT(14, el, eh)(btex manufacturer etex);
+
+z25=(x14br+hspace1, lyc5);
+drawSTRING(25);
+
+z34=(x25br+hspace1, lyc4);
+drawENT(34, el, eh)(btex car\_model etex);
+
+%%% row 3
+
+z33bm=(x34bm, lyc3);
+drawENT(33, el, eh)(btex car etex);
+
+%%% row 2
+
+z22=(x25, lyc2);
+drawINTEGER(22);
+
+%%% row 1
+
+z21=(x22, lyc1);
+drawSTRING(21);
+
+%%% attributes
+
+%%% manufacturer name (14, 25)
+VH(14tm, 25ml);
+drawnormalthreeO(14tm, 14tm.vh, 25ml);
+label.urt(btex *name etex, z14tm.vh);
+
+%%% model name (34, 25)
+VH(34tm, 25mr);
+drawnormalthreeO(34tm, 34tm.vh, 25mr);
+label.ulft(btex *name etex, z34tm.vh);
+
+%%% made_by (34, 14)
+drawnormalO(34ml, 14mr);
+label.ulft(btex made\_by etex, z34ml);
+
+%%% model_type (33, 34)
+drawnormalO(33tm, 34bm);
+label.urt(btex model\_type etex, z33tm);
+
+%%% DER made_by (33, 14)
+VH(14bm, 33ml);
+drawnormalthreeO(33ml, 14bm.vh, 14bm);
+label.ulft(btex (DER) *made\_by etex, z33ml);
+
+%%% year (33, 22)
+z33A=1/3[z33bl, z33br];
+VH(33A, 22mr);
+drawnormalthreeO(33A, 33A.vh, 22mr);
+label.ulft(btex year etex, z33A.vh);
+
+%%% serial_no
+z33B=2/3[z33bl, z33br];
+VH(33B, 21mr);
+drawnormalthreeO(33B, 33B.vh, 21mr);
+label.ulft(btex *serial\_no etex, z33B.vh);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 6
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 7: Shlaer-Mellor}
+%
+% The Shlaer-Mellor graphical language~\cite{SHLAER88} is fairly simple,
+% consisting basically of rectangles and arrowheaded lines. However, unlike
+% \ExpressG{} each box usually has several lines of text. These are placed
+% individually at the desired positions within each box.
+%
+% Notice below that
+% I have used |drawENT| with an empty string to draw the rectangular boxes;
+% the routines for \ExpressG{} diagrams can, if suitable, be used in any
+% sort of diagram.
+%
+% \begin{macrocode}
+
+beginfig(7) % example 7
+%%%drawgrid;
+
+el := namespace(btex MANUFACTURER etex)(niextra);
+eh := onelineh;
+
+hspace1 := namespace(btex made by maker of etex)(4ndextra);
+
+hspace2 := 6onelineh; % height of CAR
+hspace3 := 5onelineh; % space between rows
+hspace4 := 3onelineh; % height of MANUFACTURER
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+hspace2+hspace3;
+
+%%% Zcol/row
+
+%%% row 2
+
+z12=(0, lyc2);
+drawENT(12, el, hspace4)("");
+x121=x12+sdtbs;
+label.rt(btex MANUFACTURER etex, (x121, 2/3[y12bl, y12tl]));
+label.rt(btex * manuf-name etex, (x121, 1/3[y12bl, y12tl]));
+
+z22=(x12br+hspace1, lyc2);
+drawENT(22, el, hspace4)("");
+x221=x22+sdtbs;
+label.rt(btex CAR-MODEL etex, (x221, 2/3[y12bl, y12tl]));
+label.rt(btex * model-name etex, (x221, 1/3[y12bl, y12tl]));
+
+%%% row 1
+
+z21=(x22, lyc1);
+drawENT(21, el, hspace2)("");
+x211=x21+sdtbs;
+label.rt(btex CAR etex, (x211, 5/6[y21bl, y21tl]));
+label.rt(btex o year etex, (x211, 4/6[y21bl, y21tl]));
+label.rt(btex o model (R) etex, (x211, 3/6[y21bl, y21tl]));
+label.rt(btex * serial-no etex, (x211, 2/6[y21bl, y21tl]));
+label.rt(btex * maker (R) etex, (x211, 1/6[y21bl, y21tl]));
+
+%%%%% relationship lines
+
+% \end{macrocode}
+% In this diagram the labels on the relationship lines tend to bump
+% into the line ending symbol. \Mpost{} ignores initial and final spaces
+% within |btex...etex|. The paired braces below, each enclosing one space,
+% supply non-discarded spaces. (These could also have been written as
+% |\space|).
+% \begin{macrocode}
+%%% MANUFACTURER / CAR-MODEL (12, 22)
+drawnormalDCA(12mr, 22ml);
+drawnormalCA(22ml, 12mr);
+label.urt(btex { }{ }made by etex, z12mr);
+label.llft(btex maker of{ }{ } etex, z22ml);
+
+%%% MANUFACTURER / CAR (12, 21)
+VH(12bm, 21ml);
+drawnormalCA(12bm.vh, 12bm);
+drawnormalDCA(12bm.vh, 21ml);
+label.llft(btex { }{ }made by etex, z12bm);
+label.ulft(btex maker of{ }{ } etex, z21ml);
+
+%%% CAR-MODEL / CAR (22, 21)
+drawnormalDCA(22bm, 21tm);
+drawnormalCA(21tm, 22bm);
+label.lrt(btex { }one of etex, z22bm);
+label.ulft(btex type of{ } etex, z21tm);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 7
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 8: IDEF1X}
+%
+% IDEF1X is a popular language in America for representing the structure
+% of relational databases, and was developed under the auspices of the
+% US Air Force~\cite{IDEF1X}.
+%
+% The general layout of the diagram mimics the previous one. All the boxes
+% are divided horizontally into an upper and lower part.
+% The |drawdoublerectangle| is used for the rectangular boxes, but the dividing
+% line in the rounded box has to be added by hand, as it were.
+%
+% \begin{macrocode}
+
+beginfig(8) % example 8 IDEF1X
+%%%drawgrid;
+
+el := namespace(btex MANUFACTURER etex)(niextra);
+eh := onelineh;
+
+hspace1 := namespace(btex made by maker of etex)(4ndextra);
+
+hspace2 := 5onelineh; % height of CAR
+hspace3 := 5onelineh; % space between rows
+hspace4 := 3onelineh; % height of MANUFACTURER
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+hspace2+hspace3;
+
+%%% Zcol/row
+
+%%% row 2
+
+z12=(0, lyc2);
+drawdoublerectangle(12, el, hspace4, 1/2);
+label.urt(btex Manufacturer etex, z12tl);
+x121=x12+sdtbs;
+label.rt(btex manuf-name etex, (x121, 3/4[y12bl, y12tl]));
+
+z22=(x12br+hspace1, lyc2);
+drawdoublerectangle(22, el, hspace4, 1/2);
+label.urt(btex Car-model etex, z22tl);
+x221=x22+sdtbs;
+label.rt(btex Model-name etex, (x221, 3/4[y12bl, y12tl]));
+label.rt(btex Manuf-name (FK) etex, (x221, 1/4[y12bl, y12tl]));
+
+%%% row 1
+
+z21=(x22, lyc1);
+drawroundedbox(21, el, hspace2, 2sdtbs)("");
+label.urt(btex Car etex, z21tl);
+draw z21ml--z21mr;
+x211=x21+sdtbs;
+label.rt(btex Serial-no etex, (x211, 5/6[y21bl, y21tl]));
+label.rt(btex Manuf-name (FK) etex, (x211, 4/6[y21bl, y21tl]));
+label.rt(btex Model-name (FK) etex, (x211, 2/6[y21bl, y21tl]));
+label.rt(btex Year etex, (x211, 1/6[y21bl, y21tl]));
+
+%%%%% relationship lines
+
+%%% MANUFACTURER / CAR-MODEL (12, 22)
+drawnormalD(12mr, 22ml);
+label.top(btex of etex, 1/2[z12mr, z22ml]);
+
+%%% MANUFACTURER / CAR (12, 21)
+VH(12bm, 21ml);
+drawnormalthreeD(12bm, 12bm.vh, 21ml);
+label.top(btex makes etex, 1/2[z12bm.vh, z21ml]);
+label.ulft(btex P{ } etex, z21ml);
+
+%%% CAR-MODEL / CAR (22, 21)
+drawnormalD(22bm, 21tm);
+label.lft(btex of etex, 1/2[z21tm,z22bm]);
+label.urt(btex { }P etex, z21tm);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 8
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 9: OMT}
+%
+% OMT~\cite{RUMBAUGH91} was the precursor to the currently popular UML
+% structure modeling language.
+% If you are curious as to why I believe that lexical languages are in
+% general better than BLA languages, the chapter on developing a compiler
+% for OMT highlights, probably unintentionally, some of the disadvantages
+% of BLAs.
+%
+% The general look of the OMT diagram is almost identical
+% to the IDEF1X diagram.
+%
+% \begin{macrocode}
+
+beginfig(9) % example 9 OMT
+%%%drawgrid;
+
+el := namespace(btex {\bf MANUFACTURER} etex)(niextra);
+eh := onelineh;
+
+hspace1 := namespace(btex made by maker of etex)(4ndextra);
+
+hspace2 := 4onelineh; % height of CAR
+hspace3 := 4onelineh; % space between rows
+hspace4 := 3onelineh; % height of MANUFACTURER
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+hspace2+hspace3;
+
+%%% Zcol/row
+
+%%% row 2
+
+z12=(0, lyc2);
+drawdoublerectangle(12, el, hspace4, 1/2);
+x121=x12+sdtbs;
+label.rt(btex {\bf Manufacturer} etex, (x121, 3/4[y12bl, y12tl]));
+label.rt(btex name : String etex, (x121, 1/4[y12bl, y12tl]));
+
+z22=(x12br+hspace1, lyc2);
+drawdoublerectangle(22, el, hspace4, 1/2);
+x221=x22+sdtbs;
+label.rt(btex {\bf Car Model} etex, (x221, 3/4[y22bl, y22tl]));
+label.rt(btex name: String etex, (x221, 1/4[y22bl, y22tl]));
+
+%%% row 1
+
+z21=(x22, lyc1);
+drawdoublerectangle(21, el, hspace2, 1/3);
+x211=x21+sdtbs;
+label.rt(btex {\bf Car} etex, (x211, 5/6[y21bl, y21tl]));
+label.rt(btex serial-no : String etex, (x211, 4/9[y21bl, y21tl]));
+label.rt(btex year : Integer etex, (x211, 2/9[y21bl, y21tl]));
+
+%%%%% relationship lines
+
+%%% MANUFACTURER / CAR-MODEL (12, 22)
+drawnormalD(12mr, 22ml);
+label.top(btex {\it makes} etex, 1/2[z12mr, z22ml]);
+label.ulft(btex 1+{ } etex, z22ml);
+
+%%% MANUFACTURER / CAR (12, 21)
+VH(12bm, 21ml);
+drawnormalthreeD(12bm, 12bm.vh, 21ml);
+label.top(btex {\it makes} etex, 1/2[z12bm.vh, z21ml]);
+label.ulft(btex 1+{ } etex, z21ml);
+
+%%% CAR-MODEL / CAR (22, 21)
+drawnormalD(22bm, 21tm);
+label.lft(btex {\it produced as} etex, 1/2[z21tm,z22bm]);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 9
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 10: E-R}
+%
+% There are several flavours of Entity-Relationship modeling icons.
+% I have used a style from~\cite{ELMASRI89}.
+%
+% This example introduces some new icons and \Mpost{} modeling.
+%
+% \begin{macrocode}
+
+beginfig(10) % example 10 E-R
+%%%drawgrid;
+
+numeric diam; diam := 2onelineh;
+
+upshift := diam; % circle diameter
+nextup := diam+upshift;
+
+el := namespace(btex MANUFACTURER etex)(niextra);
+eh := onelineh;
+
+numeric dl, dh; % length and height of diamond boxes
+dl := 1/2el; dh := 2eh;
+
+numeric marg; marg := 4u; % double the seperation between parallel lines
+
+hspace1 := 1/2el;
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+nextup;
+lyc3 := lyc2+nextup;
+lyc4 := lyc3+nextup;
+lyc5 := lyc4+nextup;
+
+% \end{macrocode}
+%
+% The diagram has 5 rows. Start with the 4th as it is the widest row.
+% \begin{macrocode}
+%%% Zcol/row
+%%% row 4
+
+z14=(0,lyc4);
+drawENT(14, el, eh)(btex manufacturer etex);
+
+z34ml=(x14br+hspace1, y14mr);
+drawdiamondbox(34, dl, dh)(btex has etex);
+
+z54ml=(x34mr+hspace1, y34mr);
+drawENT(54, el, eh)(btex car\_model etex);
+
+%%% row 5
+
+z15bm=(x14bm, lyc5);
+drawcirclebox(15, diam)(btex Name etex);
+
+z55bm=(x54bm, lyc5);
+drawcirclebox(55, diam)(btex Name etex);
+
+% \end{macrocode}
+%
+% The third row consists of an ordinary diamond box at the right and
+% a doubly enclosed diamond on the left. The |drawtwodiamondbox| routine
+% is used for the latter. Note that values of |marg| are
+% used to make the oustside of the double diamond larger than the single
+% diamonds.
+% \begin{macrocode}
+%%% row 3
+
+z53bm=(x54bm, lyc3);
+drawdiamondbox(53, dl, dh)(btex of etex);
+
+z13c=(x14bm, y53c);
+drawtwodiamondbox(13, dl+marg, dh+marg, 2/5marg)(btex Makes etex);
+
+% \end{macrocode}
+%
+% The second row just consists of a doubly enclosed rectangular box.
+% There is no explicit routine for drawing this, so two |drawENT| routines
+% are used for drawing smaller and larger superimposed boxes (one with
+% an empty text argument).
+% \begin{macrocode}
+%%% row 2
+
+z32bm=(x34bm, lyc2);
+drawENT(32, el, eh)(btex car etex);
+z31c=z32c;
+drawENT(31, el+marg, eh+marg)("");
+
+%%% row 1
+
+z21bm=(x32bl, lyc1);
+drawcirclebox(21, 5/4diam)(btex \twolines{Serial}{No} etex);
+
+z41bm=(x32br, lyc1);
+drawcirclebox(41, diam)(btex Year etex);
+
+%%%%%% lines
+
+%%% Name / manufacturer (15, 14)
+drawnormal(15bm, 14tm);
+
+%%% Name / model (55, 54)
+drawnormal(55bm, 54tm);
+
+%%% Mnf / has (14, 34)
+drawnormal(14mr, 34ml);
+label.top(btex 1 etex, 1/2[z14mr,z34ml]);
+
+%%% has/ model (34, 54)
+drawnormal(34mr, 54ml);
+label.top(btex N etex, 1/2[z34mr,z54ml]);
+
+%%% Mnf / makes (14, 13)
+drawnormal(14bm, 13tm);
+label.rt(btex 1 etex, 1/2[z14bm,z13tm]);
+
+%%% model / of (54, 53)
+drawnormal(54bm, 53tm);
+label.rt(btex 1 etex, 1/2[z54bm,z53tm]);
+
+% \end{macrocode}
+% In the diagrams so far, except trivially in the first,
+% the lines have all been vertical and/or
+% horizontal. Now we meet lines in arbitrary directions, and parallel
+% to boot.
+%
+% A pair of parallel lines joins the bottom of the doubly enclosed diamond
+% to the left side of the doubly enclosed rectangle. Drawing one of these is
+% simple --- just draw a straight line between the bottom middle of the
+% diamond to the middle left of the rectangle.
+% \begin{macrocode}
+%%% makes / car (13, 31)
+drawnormal(13bm, 31ml);
+% \end{macrocode}
+%
+% The point |z31A| is |1/2marg| above the point |z31ml|. This is one end
+% of the parallel line.
+% \begin{macrocode}
+z31A=(x31ml, y31ml+1/2marg);
+% \end{macrocode}
+%
+% The \Mpost{} equation |z1-z2 = frac*(z3-z4)| means that
+% (a) the line |z1--z2| is parallel to the line |z3--z4|, and (b)
+% the length of the line |z1--z2| is |frac| of the length of |z3--z4|.
+% We next specify that the line |z13U--z31A| is parallel to, and the same
+% length as, the line |z13bm--z31ml|;
+% \begin{macrocode}
+z13U-z31A = z13bm-z31ml;
+% \end{macrocode}
+%
+% The final part of the calculation is to determine the point |z13A| so
+% that the line |z31A--z13A| is parallel to our first line and starts
+% and ends at the outer perimeters of the boxes (and we already
+% know what |z31A| is).
+%
+% \DescribeVariable{whatever}
+% Remember mediation? A point, |z1234| is on the line |z1--z2| if \\
+% |z1234=frac1[z1,z2| holds. \\
+% Similarly a point |z1234| is on the line |z3--z4| if \\
+% |z1234=frac2[z3,z4]| holds.
+%
+% These two equations are linear and provided enough variables are known
+% it is easy, even if tedious and error
+% prone, to solve
+% for all the unknowns using simple mathematics. Fortunately \Mpost{} has an
+% idiom for this kind of calculation using the built-in variable
+% called |whatever|. Each time |whatever| is used it is internally given
+% a new name which saves a lot of name inventions on the part of the user.
+% The following line of code results in \Mpost{} calculating the intersection
+% point, which I call |z13A|, between the two lines |z13U,z31A|, which is
+% our parallel lines whose points are known, and the line |z13bm--z13mr|
+% which is the lower right line of the outer diamond whose points are known.
+% \begin{macrocode}
+z13A = whatever[z13U,z31A] = whatever[z13bm,z13mr];
+% \end{macrocode}
+%
+% Finally, draw the second parallel line in the desired position and length.
+% \begin{macrocode}
+draw z13A--z31A;
+label.urt(btex N etex, 1/2[z13A,z31A]);
+
+% \end{macrocode}
+%
+% Another pair of parallel lines connects the doubly bounded rectangle
+% and the singly bounded diamond, and we use a similar calculation as above.
+% \begin{macrocode}
+%%% of / car (53, 31)
+drawnormal(53bm, 31mr);
+z31B=(x31mr, y31mr+1/2marg);
+z53U - z31B = z53bm - z31mr;
+z53B = whatever[z53U,z31B] = whatever[z53bm,z53ml];
+draw z53B--z31B;
+label.ulft(btex N etex, 1/2[z53B,z31B]);
+
+% \end{macrocode}
+%
+% That's the end of the tricky bits for this diagram.
+% \begin{macrocode}
+%%% car / serial no (31, 21)
+z31C=(x21tm, y31bl);
+drawnormal(31C, 21tm);
+
+%%% car / year (31, 41)
+z31D=(x41tm, y31br);
+drawnormal(31D, 41tm);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 10
+
+% \end{macrocode}
+%
+%
+% \subsubsection{Diagram 11: NIAM}
+%
+% Like IDEF1X, NIAM~\cite{NIJSSEN89} is a language for relational database
+% structures. In Europe it tends to be preferred to IDEF1X.
+%
+% Although the layout and icons of the NIAM illustration differ from
+% the prior
+% diagrams, no new techniques are used. The most obvious of the differences
+% are the use of oval and circular boxes in place of the rectangular boxes,
+% and the use of pairs of rectangular boxes in the middle of the relationship
+% lines.
+% \begin{macrocode}
+
+beginfig(11) % example 11 NIAM
+%%%drawgrid;
+
+numeric diam; diam := 2onelineh; % circle diameter
+
+upshift := diam;
+nextup := diam+upshift;
+
+numeric hel, vel; % length of horizontal and vertical box pairs
+eh := onelineh;
+hel = namespace(btex made by etex)(nextra);
+vel = namespace(btex of prod etex)(nextra);
+
+numeric del, deh; % horizontal & vertical diameters of oval boxes
+del := namespace(btex MANUFACTURER etex)(niextra);
+deh := 2eh;
+
+numeric marg; marg := 2u; % margin for doubly enclosed oval boxes
+numeric lmarg; lmarg := marg; % gap for short lines
+
+numeric dashel, dasheh; % diameters of dashed ellipses
+dashel := del+2marg;
+dasheh := deh+2marg;
+
+hspace1 := diam;
+
+%%% y coords
+lyc1 := 0;
+lyc2 := lyc1+nextup;
+lyc3 := lyc2+nextup;
+
+%%% Zcol/row
+
+%%% row 3
+
+x13ml=0; y13bm=lyc3;
+drawovalbox(13, del, deh)(btex manufacturer etex);
+z14=z13c;
+drawdashellipse(14, dashel, dasheh);
+
+z23ml=(x14mr+hspace1, y14mr);
+drawENT(23, hel, eh)(btex of etex);
+
+z33bl=z23br;
+drawENT(33, hel, eh)(btex made by etex);
+
+z44ml=(x33mr+hspace1, y33mr);
+drawdashellipse(44, dashel, dasheh);
+z43=z44c;
+drawovalbox(43, del, deh)(btex car model etex);
+
+z53ml=(x44mr+hspace1, y44mr);
+drawdashcircle(53, diam);
+label(btex year etex, z53c);
+
+%%% row 2
+
+z22c=(x23bm,lyc2);
+drawcirclebox(22, namespace(btex U etex)(2nextra))(btex U etex);
+
+x42tm=x43bm; y42ml=lyc2;
+drawdoublerectangle(42, vel, 2eh, 1/2);
+label(btex of etex, z42ct);
+label(btex is of etex, z42cb);
+
+%%z52c=(x53x,lyc2);
+x52tm=x53bm; y52ml=lyc2;
+drawdoublerectangle(52, vel, 2eh, 1/2);
+label(btex of prod etex, z52ct);
+label(btex prod in etex, z52cb);
+
+%%% row 1
+
+z11ml=(x13ml,lyc1);
+drawdashellipse(11, del, deh);
+label(btex serial no etex, z11c);
+
+z21ml=(x23ml,lyc1);
+drawENT(21, hel, eh)(btex of etex);
+
+z31bl=z21br;
+drawENT(31, hel, eh)(btex has etex);
+
+z41c=(x43c,lyc1);
+drawcirclebox(41, diam)(btex car etex);
+
+%%%%%% lines
+
+%%% manufacturer / of (14, 23)
+drawnormal(14mr, 23ml);
+
+%%% made by / car model (33, 44)
+drawnormal(33mr, 44ml);
+draw (x33tl, y33tl+lmarg)--(x33tr, y33tl+lmarg);
+draw (x33mr, y33mr+lmarg)--(x33mr+eh, y33mr+lmarg);
+
+%%% serial no / of (11, 21)
+drawnormal(11mr, 21ml);
+
+%%% of / of (23, 22, 21)
+drawnormal(23bm, 22tm); drawnormal(22bm, 21tm);
+label.rt(btex id etex, z22mr);
+
+%%% has / car (31, 41)
+drawnormal(31mr, 41ml);
+draw (x31tl, y31tl+lmarg)--(x31tr, y31tl+lmarg);
+draw (x31mr, y31mr+lmarg)--(x33mr+eh, y31mr+lmarg);
+
+%%% model / of (44, 42)
+drawnormal(43bm, 42tm);
+
+%%% is of / car (42, 41)
+drawnormal(42bm, 41tm);
+draw (x42tfr+lmarg, y42tfr)--(x42tfr+lmarg, y42br);
+draw (x42bm+lmarg, y42bm)--(x42bm+lmarg, y42bm-eh);
+
+%%% year / of prod (53, 52)
+drawnormal(53bm, 52tm);
+
+%%% prod in / car (52, 41)
+VH(52bm,41mr);
+drawnormalthree(52bm, 52bm.vh, 41mr);
+draw (x52tfr+lmarg, y52tfr)--(x52tfr+lmarg, y52br);
+draw (x52bm+lmarg, y52bm)--(x52bm+lmarg, y52bm-eh);
+
+% \end{macrocode}
+%
+% The end of this diagram
+% \begin{macrocode}
+endfig; % end fig 11
+
+% \end{macrocode}
+%
+% Note that the centers of the boxes on the bottom row are all at |y=0|,
+% and hence the bottom halves have negative y values. This does not matter
+% as \Mpost{} determines the actual space required for a diagram and does
+% not base it on the origin of the coordinate system.
+%
+%
+% The end of the \Mpost{} examples file.
+% \begin{macrocode}
+end
+
+% \end{macrocode}
+% The end of the example.
+% \begin{macrocode}
+%</eg>
+% \end{macrocode}
+%
+% \subsection{Comments}
+%
+% Everyone is likely to have a different style of diagramming. You have
+% seen how I do it but that might not be what suits you. Nevertheless,
+% the following comments may be of assistance.
+%
+% In my own work I tend to draw a lot of diagrams, using different
+% \file{.mp} files, that have similar sets of `commonly used variables
+% \& values'. Rather than repeating the list in each file, I create a
+% \Mpost{} file, called say \file{mycommons.mp}, that includes these
+% and then |input mycommons| after the |input expressg| near the start
+% of each diagram file.
+%
+% I find it a help to sketch out the diagrams using pencil and paper
+% before coding them up. I have to admit, though, that the final results
+% often look very different from my initial ideas of the layout.
+%
+% You might have noticed that I start the coding at different places
+% in the diagrams. Basically I try and plan on getting the boxes aligned
+% roughly in rows and/or columns. I then typically start with the longest
+% column, or more often with the widest row, and then fill in the rest
+% from there.
+%
+% \subsection{Running the \Mpost{} example file} \label{sec:run}
+%
+% The \file{expeg.mp} file has to be processed by \Mpost{} to obtain
+% \EPS{} (\file{eps}) files for viewing or printing.
+% Depending on your installation the command to run \Mpost{} may be
+% either: \\
+% |mpost expeg| or \\
+% |mp expeg| \\
+% or perhaps something similar. This will produce eleven files, \file{expeg.1}
+% to \file{expeg.11}, each of which is an \file{eps} file for the corresponding
+% |beginfig(N)| in \file{expeg.mp}. \Mpost{} defaults to using \TeX{} for
+% processing labels which outputs them using Computer Modern
+% fonts. Unfortunately \PS{} applications do not understand these so it
+% is necessary to get the fonts inserted. This is most simply done by
+% \LaTeX ing a document that includes the \Mpost{} output. A suitable
+% file is provided below and is configured to be processed by either
+% \LaTeX{} or \pdflatex. Run \LaTeX{} and then dvips (or what you normally
+% use to generate printable output) and you will get all eleven diagrams.
+%
+%
+% \begin{macrocode}
+%<*egt>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%%% expeg.tex display expressg.dtx MetaPost examples
+
+\documentclass[11pt]{article}
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+ \pdffalse
+\else
+ \pdftrue
+\fi
+
+\ifpdf
+ \pdfoutput=1
+ \usepackage[pdftex,final]{graphicx}
+ \DeclareGraphicsRule{*}{mps}{*}{}
+\else
+ \usepackage[final]{graphicx}
+\fi
+
+%%%% page sizes for ISO document on A4 paper
+\setlength{\headheight}{11pt}
+\setlength{\headsep}{10mm}
+\setlength{\topskip}{11pt}
+\setlength{\footskip}{11mm}
+\setlength{\textwidth}{160mm}
+\setlength{\textheight}{221.5mm}
+\setlength{\columnsep}{10mm}
+\setlength{\topmargin}{0mm}
+\setlength{\oddsidemargin}{0mm}
+\setlength{\evensidemargin}{0mm}
+\setlength{\marginparwidth}{0pt}
+\setlength{\marginparsep}{0pt}
+\setlength{\marginparpush}{0pt}
+\setlength{\footnotesep}{12pt}
+ %%%% for US letterpaper need to change some margins
+\setlength{\topmargin}{-9.4mm}
+\setlength{\oddsidemargin}{1.55mm}
+\setlength{\evensidemargin}{1.55mm}
+
+\begin{document}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.1}
+\caption{Some boxes and line styles}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.2}
+\caption{Example schema level diagram}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.3}
+\caption{Example diagram of a tree structure}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.4}
+\caption{Supertypes and subtypes}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.5}
+\caption{A portion of a large model}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.6}
+\caption{Car model using EXPRESS-G}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.7}
+\caption{Car model using Shlaer-Mellor}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.8}
+\caption{Car model using IDEF1X}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.9}
+\caption{Car model using OMT}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.10}
+\caption{Car model using E-R}
+\end{figure}
+
+\begin{figure}
+\centering
+ \includegraphics{expeg.11}
+\caption{Car model using NIAM}
+\end{figure}
+
+\end{document}
+
+% \end{macrocode}
+%
+% The end of the \LaTeX{} file.
+% \begin{macrocode}
+%</egt>
+% \end{macrocode}
+%
+% \subsubsection{Using \pdflatex}
+%
+% \pdflatex{} generates a \file{.pdf} file directly from \LaTeX{} source
+% instead of a \file{.dvi} file. Unfortunately \pdflatex{} does not understand
+% \EPS{} in general, but it \emph{does} understand the restricted form
+% of \EPS{} generated by \Mpost. By default \pdflatex{} will recognise
+% files with an \file{.mps} extension as coming from \Mpost, but \Mpost{}
+% generates files with a numeric extension.
+% If you like to use both \Mpost{} and \pdflatex, then it can
+% get tedious changing all the numeric extensions to \file{.mps}. The
+% following two scripts can help with this. The first is a shell
+% script\footnote{You may well have to modify this to run on your
+% operating system.} which calls a Perl script.
+%
+% The shell script is called \file{n2mps.sh}. To get suitable versions
+% of the example \Mpost{} output files for use with \pdflatex, just do: \\
+% |n2mps.sh expeg| \\
+% after having run \Mpost{} on \file{expeg.mp}.
+%
+% \begin{macrocode}
+%<*shell>
+#! /bin/sh
+
+#####################################################################
+# Shell script n2mps.sh
+# Call as: n2mps.sh basename
+# List each file basename.* in the directory and run the Perl script
+# to copy each basename.N to basenameN.mps, where N is an integer
+#
+# Copyright 2000, Mauro S. Costa and Peter R. Wilson
+#####################################################################
+
+basename=${1:?"A file basename is required."}
+extname=N.mps
+echo Files $basename.N, where N is a number, will be copied to $basename$extname
+for file in `ls $basename.*`
+do
+ n2mpsprl.prl $file
+done
+
+####################### end shell script ###########################
+
+%</shell>
+% \end{macrocode}
+% The Perl script, which is called by the \file{n2mps} script:
+% \begin{macrocode}
+%<*perl>
+
+#!/usr/local/bin/perl -w
+
+###################################################################
+# Perl script: n2mpsprl.prl
+# Call as: n2mpsprl.prl filename
+# If filename is of the form basename.N, where N is an integer,
+# copies file basename.N to file basenameN.mps
+#
+# Copyright 2000, Mauro S. Costa and Peter R. Wilson
+##################################################################
+
+# Test for correct number of input parameters
+die "Invalid command line arguments.\nTry $0 <src> \n" if($#ARGV > 1);
+die "Invalid command line arguments.\nTry $0 <src> \n" if($#ARGV < 0);
+
+# Assign input file name to variable
+$input_file = $ARGV[0];
+
+## test if ends with a number, exit if not
+if ($input_file =~ /\w\.\d/) { ; } else { exit; }
+
+# Remove the "dot" from the string variable
+# holding the input file name
+$input_file =~ s/\.// ;
+
+# Create a list variable composed of the string variable holding
+# the concatenated input file name and the extension ".mps"
+@name_list = ($input_file,'.mps') ;
+
+# Join the string variables in the name_list variable into
+# a single string variable
+$output_file = join("",@name_list) ;
+
+# create a list variable composed to the parameters needed
+# for the system copy command excution
+@exec_list = ('cp', $ARGV[0], $output_file) ;
+
+# Execute the system copy ("cp") command
+system(@exec_list) ;
+
+############################ end perl script ##########################
+
+%</perl>
+% \end{macrocode}
+%
+% As an alternative when using \pdflatex{} and the \Lpack{graphicx} package,
+% putting \\
+% |\DeclareGraphicsRule{*}{mps}{*}{}| \\
+% will cause included graphics files with unknown extensions
+% (e.g., as generated by \Mpost) to be treated as \file{.mps} files.
+% \begin{verbatim}
+% \documentclass...
+% \usepackage{ifpdf}% you should have this
+% \ifpdf
+% \pdfoutput=1
+% \usepackage[pdftex,final]{graphicx}
+% \DeclareGraphicsRule{*}{mps}{*}{}
+% \else
+% \usepackage[final]{graphicx}
+% \fi
+% ...
+% \includegraphics{mpfig.23}
+% ...
+% \end{verbatim}
+%
+%
+% \subsection{Using \LaTeX{} instead of \TeX}
+%
+% As already noted, \Mpost{} defaults to using \TeX{} for typesetting
+% labels. If you would prefer it to use \LaTeX{} instead, then two things
+% have to be done.
+% \begin{enumerate}
+% \item \Mpost{} looks at the value of an environment variable called |TEX|
+% to see what typesetting system it should use. If the variable is
+% not set, then it uses \TeX. To get it to use \LaTeX{} the environment
+% variable has to be set to |latex|. For example, on the system I use
+% this is done by:
+% \begin{verbatim}
+% TEX=latex
+% export TEX
+% \end{verbatim}
+%
+% \item \LaTeX{} |\documentclass| and |\begin{document}| commands must
+% be put into the |verbatimtex|\ldots|etex| group at the start of
+% the diagramming file. For the example, this might look like
+% \begin{verbatim}
+% verbatimtex
+% \documentclass{article}
+% % \usepackage{...} % for any packages
+% \def\twolines#1#2{\vbox{\hbox{#1} \hbox{#2}}}
+% \begin{document}
+% etex
+% \end{verbatim}
+%
+% \end{enumerate}
+%
+% \textbf{NOTE:} Both the above are required for \LaTeX. On the other hand,
+% if |TEX| is either undefined or has a value other than |tex|,
+% then there must
+% be no \LaTeX{} code anywhere in the \file{.mp} file.
+%
+% If you need to generate individual self-contained \file{ps} files
+% for inclusion in non-\LaTeX{} documents where the font used for labels
+% is a member of the Computer Modern family,
+% then you need to use LaTeX{} and dvips on \file{*.tex} files that consist
+% of only a single diagram and no other text at all. At least on my setup
+% I have found it best to run dvips as normal but with output to a file
+% instead of a printer. Then use whatever tools are available to you to
+% convert the \file{.ps} file to an \file{.eps} one (or at least set the
+% correct bounding box values). The primary source on generating and
+% using \EPS{} in the \LaTeX{} world is~\cite{RECKDAHL97},
+% and~\cite{GOOSSENS97} also has useful information.
+%
+% \subsection{Using \PS{} fonts}
+%
+% \Mpost{} can be made to use \PS{} fonts and, providing the labels
+% don't require any special (\TeX) processing, then use of \LaTeX{} may
+% be avoided altogether. In order to do this, certain requirements have
+% to be put on the content on the \file{.mp} file.
+%
+% \begin{itemize}
+% \item \DescribeVariable{prologues} The
+% diagram file must begin with the line \\
+% |prologues:=2;| \\
+% which will add a prologue for \PS{} font to the output file.
+%
+% \item \DescribeVariable{defaultfont} The
+% |defaultfont| must be changed. What it has to be changed
+% to depends on the font you want to use. For example, to use the
+% Times Roman font, put: \\
+% |defaultfont:="ptmr8r";| \\
+% just after the |prologues| line.
+%
+% For this incantation to work, the file \file{ptmr8r.tfm} must exist
+% in a location where \Mpost{} looks for \file{.tfm} files (on the system
+% I use it is in directory \texttt{../texmf/fonts/tfm/adobe/times}). Also,
+% the file \file{psfonts.map} must include a line like \\
+% |ptmr8r Times-Roman ...| \\
+% Again, on my system \file{psfonts.map} is in directory
+% \texttt{../texmf/dvips/misc}.
+%
+% I don't know whether or not this works if you don't have a \LaTeX{}
+% distribution --- it probably doesn't. But it's unlikely that you don't
+% have one if you
+% intend to use \Mpost.
+%
+% \end{itemize}
+%
+% As a final note on changing fonts, the \Mpost{} |defaultfont| and
+% |defaultscale| values only apply to quoted text
+% (e.g., \texttt{"quoted text"}) and not to `btexed' text
+% (e.g., \texttt{btex btexed text etex}). Conversely, \TeX{} or \LaTeX{}
+% commands only apply to btexed text and not to quoted text. For more
+% details on this, see~\cite{METAFP}.
+%
+%
+%
+%
+% \section{The \Mpost{} code} \label{sec:mf}
+%
+%
+% We start by announcing what it is for.
+%
+% \begin{macrocode}
+%<*up>
+%%% EXPRESSG.MP MetaPost macros for EXPRESS-G and other BLA diagrams
+%%% version 1.5, 31 July 2003
+%%% version 1.6, 29 February 2004
+%%% version 1.61, 17 March 2004
+
+show "expressg.mp version 1.61, 2004/03/17";
+
+% \end{macrocode}
+%
+% \subsection{Variables}
+%
+% \begin{variable}{u}
+% The unit of length.
+% \begin{macrocode}
+newinternal u; numeric u;
+u := 1mm;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{maxx}
+% \begin{variable}{maxy}
+% The maximum x and y coordinates for a diagram.
+% \begin{macrocode}
+newinternal maxx, maxy;
+numeric maxx, maxy;
+maxx := 159.5u; % smidgeon under 160mm for ISO
+maxy := 210u; % 210mm for ISO
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{defaultdotdiam}
+% \begin{variable}{dotdiam}
+% The default and actual diameter of circle and dot line end styles.
+% \begin{macrocode}
+newinternal defaultdotdiam, dotdiam;
+numeric defaultdotdiam, dotdiam;
+defaultdotdiam := 2u;
+dotdiam := defaultdotdiam;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{normalpensize}
+% \begin{variable}{normalpensize}
+% \begin{variable}{normalpensize}
+% The diameters of the pens for drawing normal, thick and thin lines. (The
+% size of the default \Mpost{} pen is 0.5bp).
+% \begin{macrocode}
+newinternal normalpensize, thickpensize, thinpensize;
+numeric normalpensize, thickpensize, thinpensize;
+normalpensize := 0.5bp;
+thickpensize := 1.5bp;
+thinpensize := 0.25bp;
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{dotsscale}
+% |dotsscale| is the amount the |...pensize| has to be increased so that a
+% dotted line looks as thick as a continuous or dashed line.
+% \begin{macrocode}
+newinternal dotsscale; numeric dotsscale;
+dotsscale := 2;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{normalpen}
+% \begin{variable}{thickpen}
+% \begin{variable}{thinpen}
+% \begin{variable}{dotspen}
+% \begin{variable}{dotpen}
+% The pens for drawing lines, plus |dotpen| for drawing a dot line end style.
+% \begin{macrocode}
+newinternal normalpen, thickpen, thinpen, dotspen, dotpen;
+pen normalpen, thickpen, thinpen, dotspen, dotpen;
+normalpen := pencircle scaled normalpensize; % i.e. defaultpen;
+thickpen := pencircle scaled thickpensize;
+thinpen := pencircle scaled thinpensize;
+dotspen := pencircle scaled (dotsscale*normalpensize);
+dotpen := pencircle scaled dotdiam;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{defaultsmoothrad}
+% \begin{variable}{smoothrad}
+% The default and initial values for the radius of the arc used for joining
+% two lines.
+% \changes{v1.3}{2000/05/22}{Added defaultsmoothrad and smoothrad variables}
+% \begin{macrocode}
+newinternal defaultsmoothrad;
+numeric smoothrad, defaultsmoothrad;
+smoothrad := defaultsmoothrad := 2u;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{defaultdrumlid}
+% \begin{variable}{drumlid}
+% The default and initial values for the ratio of the minor to major
+% diameter of ellipses for the top and bottom of drums.
+% \changes{v1.3}{2000/05/22}{Added defaultdrumlid and drumlid variables}
+% \begin{macrocode}
+newinternal defaultdrumlid;
+numeric drumlid, defaultdrumlid;
+drumlid := defaultdrumlid := 0.2;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{defaultgal}
+% \begin{variable}{defaultgab}
+% \begin{variable}{defaultgfl}
+% \begin{variable}{defaultgfb}
+% The default values for the length and base width width of arrowheads and fanins.
+%
+% \begin{macrocode}
+%%% default length and base width for arrowheads and fanin
+newinternal defaultgal, defaultgab, defaultgfl, defaultgfb;
+numeric defaultgal, defaultgab, defaultgfl, defaultgfb;
+defaultgal := defaultgfl := defaultdotdiam;
+defaultgab := defaultgfb := defaultgal;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{gal}
+% \begin{variable}{gab}
+% \begin{variable}{gfl}
+% \begin{variable}{gfb}
+% Values of length and base width of arrowheads and fanins.
+% \begin{macrocode}
+%%% length and base width of arrowheads and fanins
+newinternal gal, gab, gfl, gfb;
+numeric gal, gab, gfl, gfb;
+gal := defaultgal;
+gab := defaultgab;
+gfl := defaultgfl;
+gfb := defaultgfb;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{onelineh}
+% The minimum height of a box that encloses a single line of text.
+%
+% \begin{macrocode}
+newinternal onelineh;
+numeric onelineh;
+onelineh := 5u;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{sdtbl}
+% \begin{variable}{sdtbh}
+% \begin{variable}{sdtbs}
+% The length, height and inset for a simple data type box. The length is
+% sufficient for the name `BOOLEAN' and the height for one line of text.
+% \begin{macrocode}
+%%% length, height & inset for simple data type boxes
+newinternal sdtbl, sdtbh, sdtbs;
+numeric sdtbl, sdtbh, sdtbs;
+sdtbl := 22u;
+sdtbh := onelineh;
+sdtbs := 2u;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{sdtbel}
+% \begin{variable}{sdtbeh}
+% \begin{variable}{sdtbes}
+% The length, height and inset for a simple EXPRESSION data type box.
+% The length is
+% sufficient for the name `EXPRESSION' and the height for one line of text.
+% \begin{macrocode}
+%%% length, height & inset for EXPRESSION data type boxes
+newinternal sdtbel, sdtbeh, sdtbes;
+numeric sdtbel, sdtbeh, sdtbes;
+sdtbel := 28u;
+sdtbeh := sdtbh; sdtbes := sdtbs;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{sdtbgel}
+% \begin{variable}{sdtbgeh}
+% \begin{variable}{sdtbges}
+% The length, height and inset for a simple GENERICENT data type box.
+% The length is
+% sufficient for the name `GENERIC\_ENTITY' and the height for one line of text.
+% \changes{v1.5}{2003/07/31}{Added sdtbgel, sdtbgeh and sdtbges box lengths}
+% \begin{macrocode}
+%%% length, height & inset for GENERICENT data type boxes
+newinternal sdtbgel, sdtbgeh, sdtbges;
+numeric sdtbgel, sdtbgeh, sdtbges;
+sdtbgel := 38u;
+sdtbgeh := sdtbh; sdtbges := sdtbs;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{pconl}
+% The average length of a numeric page connector (e.g., for |9,9 (9,9)|).
+% \begin{macrocode}
+%%% average length of numeric page connector
+newinternal pconl;
+numeric pconl; % length of page connector (for e.g., 9,9 (9,9) )
+pconl:=15u;
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{pconh}
+% Height of average page connector (one line of text).
+% \begin{macrocode}
+%%% height of page connectors (one line)
+newinternal pconh;
+numeric pconh;
+pconh := onelineh;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{enth}
+% \begin{variable}{typeh}
+% The height of a one line ENT(ITY) box (|enth|) and the height of a
+% one line ENUM(ERATION), SELECT or TYPE box.
+%
+% \begin{macrocode}
+%%% heights of entity, enum, select, type boxes (One text line)
+newinternal enth, typeh;
+numeric enth, typeh;
+enth := onelineh;
+typeh := onelineh;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{ish}
+% \begin{variable}{isrh}
+% The height of a normal one line interschema box (|ish|) and an
+% interschema box with one line each for the name and rename (|isrh|).
+% \begin{macrocode}
+%%% height of interschema boxes (one text line, no rename), and (name + rename)
+newinternal ish, isrh;
+numeric ish, isrh;
+ish := 2onelineh;
+isrh := 3onelineh;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{schemah}
+% Height of a one line SCHEMA box.
+% \begin{macrocode}
+%%% height of schema boxes (one text line)
+newinternal schemah;
+numeric schemah;
+schemah := 2onelineh;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{eventh}
+% \begin{variable}{eventslope}
+% The height (|eventh|) of a one line (G/L)EVENT box and the slope of the
+% sides of a (G/L)EVENT box.
+% \begin{macrocode}
+%%% height and slope of event boxes
+newinternal eventh, eventslope;
+numeric eventh, eventslope;
+eventh := onelineh;
+eventslope := 0.25;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{nextra}
+% \begin{variable}{niextra}
+% Margins for namespaces in normal (|nextra|) and inset (|niextra|) boxes.
+% Inset boxes are the ENUM, SELECT and TYPE boxes.
+% \begin{macrocode}
+%%% extra namespaces for boxed names
+newinternal nextra, niextra;
+numeric nextra, niextra;
+nextra := 2u;
+niextra := nextra+sdtbs;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{variable}{ndextra}
+% Margin for namespace on a relationship line.
+% \begin{macrocode}
+%%% extra namespace for attribute names
+newinternal ndextra;
+numeric ndextra;
+ndextra := nextra+dotdiam;
+
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Utility routines}
+%
+% \begin{routine}{VH}
+% \changes{v1.1}{1999/10/30}{Added VH routine}
+% Calculates the intersection point |z$vh| between the vertical line through
+% |z$| and the horizontal line through |z$$| (see \fref{fig:vhvh}).
+% \begin{macrocode}
+%%% calculates mid-point on a path like |_ (vertical, horizontal)
+%%% final points are: z$, z$vh, z$$, where z$vh=(x$,y$$)
+def VH(suffix $, $$) =
+ z$vh=(x$,y$$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{VhV}
+% \changes{v1.1}{1999/10/30}{Added VhV routine}
+% Calculates the point |z$vhv| on the vertical line through |z$| and the
+% point |z$$vhv| on the vertical line through |z$$|, such that the line
+% |z$vhv--z$$vhv| is horizontal and centered vertically between the given
+% points (see \fref{fig:vhvh}).
+% \begin{macrocode}
+%%% Calculates mid-points on a path like |_
+%%% | (vertical, horizontal, vertical)
+%%% final points are: z$, z$vhv, z$$vhv, z$$
+def VhV(suffix $, $$) =
+ y$$vhv=1/2[y$,y$$]; x$$vhv=x$$;
+ z$vhv=(x$,y$$vhv);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{HvH}
+% \changes{v1.1}{1999/10/30}{Added HvH routine}
+% Calculates the point |z$hvh| on the horizontal line through |z$| and the
+% point |z$$hvh| on the horizontal line through |z$$|, such that the line
+% |z$hvh--z$$hvh| is vertical and centered horizontally between the given
+% points (see \fref{fig:vhvh}).
+% \begin{macrocode}
+%%% Calculates mid-points on a path like -|_ (horizontal, vertical, horizontal)
+%%% final points are: z$, z$hvh, z$$hvh, z$$
+def HvH(suffix $, $$) =
+ x$hvh=1/2[x$,x$$]; y$hvh=y$;
+ z$$hvh=(x$hvh,y$$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{VyV}
+% \changes{v1.1}{1999/10/30}{Added VyV routine}
+% A generalisation of |VhV|.
+% Calculates the point |z$vyv| on the vertical line through |z$| and the
+% horizontal line through |y@|, and the point |z$$vyv| on the vertical
+% line through |z$$| and the horizontal line through |y@| (see \fref{fig:vyxh}).
+% \begin{macrocode}
+%%% Calculates turning points on a U shaped path (vertical, horizontal, vertical)
+%%% final points are: z$, z$vyv, z$$vyv, z$$
+def VyV(suffix $, @, $$) =
+ z$$vyv=(x$$,y@);
+ z$vyv =(x$, y@);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{HxH}
+% \changes{v1.1}{1999/10/30}{Added HxH routine}
+% A generalisation of |HvH|.
+% Calculates the point |z$hxh| on the horizontal line through |z$| and the
+% vertical line through |x@|, and the
+% point |z$$hgh| on the horizontal line through |z$$| and the vertical
+% line through |x@| (see \fref{fig:vyxh}).
+% \begin{macrocode}
+%%% Calculates corner points rotated U shaped path (horizontal, vertical, horizontal)
+%%% final points are: z$, z$hxh, z$$hxh, z$$
+def HxH(suffix $, @, $$) =
+ z$$hxh=(x@,y$$);
+ z$hxh =(x@,y$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{namespace}
+% |namespace(|\meta{name}|)(|\meta{margin}|)| calculates the length of
+% the text string \meta{name} plus the \meta{margin} length. The
+% body is enclosed in parentheses\footnote{Requested by Stephan Hennig,
+% \texttt{ctt} thread \textit{[MP, expressg, latexmp] namespace and textext},
+% 16 March 2004}
+% so you can do \verb?c=2namespace...?
+% \changes{v1.61}{2004/03/17}{Added parentheses to namespace macro}
+% \begin{macrocode}
+%%% calculates length taken up by typesetting str, plus margin
+def namespace(text str)(expr margin) =
+ (xpart lrcorner(str) - xpart llcorner(str) + margin)
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{dashes}
+% Shorthand for a dashed line style. Use as: |draw ... dashes;|.
+% \begin{macrocode}
+def dashes =
+ dashed evenly
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{dots}
+% Shorthand for a dotted line style. Use as: |draw ... dots;|.
+% \begin{macrocode}
+def dots =
+ dashed withdots
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{dashedgrid}
+% |dashedgrid(|\meta{nx}, \meta{ny}, \meta{dist}|)| draws a thin dashed grid
+% with \meta{nx} and \meta{ny} divisions in the $x$ and $y$ directions,
+% with \meta{dist} between the grid lines. The grid lines are numbered.
+% \begin{macrocode}
+% draw a general dashed grid
+def dashedgrid(expr nx, ny, dist) =
+ save zg_, zg__, oldpen;
+ pair zg_[], zg__[];
+ pen oldpen; oldpen = currentpen;
+ pickup thinpen;
+ for i = 0 upto nx:
+ zg_[i] = (i*dist, 0); zg_[i+1000] = (i*dist, ny*dist);
+ draw zg_[i]--zg_[i+1000] dashes;
+ label.bot(decimal(i), zg_[i]);
+ endfor
+ for i = 0 upto ny:
+ zg__[i] = (0, i*dist); zg__[i+1000] = (nx*dist, i*dist);
+ draw zg__[i]--zg__[i+1000] dashes;
+ label.lft(decimal(i), zg__[i]);
+ endfor
+ pickup oldpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawgrid}
+% |drawgrid| draws a thin dashed grid filling the permitted space for an
+% ISO Standard diagram. The units are in mm and the lines are at 10mm intervals
+% with labeling in terms of mm.
+% \begin{macrocode}
+%%% draw a 1cm spaced grid of 16(x) by 21(y) cms. (units are mm)
+def drawgrid =
+ dashedgrid(16, 21, 10mm);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% The box drawing routines take as an argument the suffix (|$|) of the
+% left-hand bottom corner point of the box, and normally the length and
+% height of the box.
+% The coordinates of the box corners
+% are calculated (|z$bl|, |z$br|, |z$tr| and |z$tl|). The midpoints of
+% the sides of the box (|z$bm|, |z$mr|, |z$tm|, |z$ml|) are calculated
+% as well. The text `center' of the box is |z$c|, while the geometric
+% center of the box will be at the intersection point of the lines
+% |z$bm--z$tm| and |z$ml--z$mr|. See \fref{fig:boxpoints} for an
+% illustration.
+%
+% \begin{routine}{rectpoints}
+% \changes{v1.1}{1999/10/30}{Added rectpoints routine}
+% The routine |rectpoints($, l, h)| calculates
+% the corner and midpoints of a rectangular box with bottom left
+% at |z$|, length |l| and height |h|. Note that it does \emph{not}
+% calculate the center point (see \fref{fig:boxpoints}).
+% \begin{macrocode}
+%%% calculates corner and midpoints of a rectangle,
+%%% bottom left at $, length l, height h
+def rectpoints(suffix $)(expr l, h) =
+ z$bl = z$;
+ z$tr = (x$+l, y$+h);
+ z$br = (x$tr, y$bl);
+ z$tl = (x$bl, y$tr);
+ z$ml = 1/2[z$bl, z$tl];
+ z$mr = 1/2[z$br, z$tr];
+ z$bm = 1/2[z$bl, z$br];
+ z$tm = 1/2[z$tl, z$tr];
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{rhompoints}
+% \changes{v1.1}{1999/10/30}{Added rhompoints routine}
+% The routine |rhompoints($, l, h, s)| calculates the corner and midpoints
+% of a rhomboid length |l|, height |h|, sideslope |s|, and positioned
+% with its bottom left hand corner at |z$|. The center point is \emph{not}
+% calculated (see \fref{fig:eventpoints}).
+% \begin{macrocode}
+%%% calculate corner, midpoints and center point of a rhomboid.
+def rhompoints(suffix $)(expr l, h, s) =
+ save eshift;
+ numeric eshift; eshift = s*h;
+ z$bl = z$;
+ z$tr = (x$+l+eshift, y$+h);
+ z$br = (x$bl+l, y$bl);
+ z$tl = (x$bl+eshift, y$tr);
+ z$ml = 1/2[z$bl, z$tl];
+ z$mr = 1/2[z$br, z$tr];
+ z$bm = (1/2[x$ml,x$mr], y$bl);
+ z$tm = (x$bm, y$tr);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{circpoints}
+% \changes{v1.1}{1999/10/30}{Added circpoints routine}
+% The routine |circpoints($, d)| calculates the `corner' and `midpoints'
+% on the circumference of a circle, center |z$| and diameter |d|.
+% \begin{macrocode}
+%%% calculate circumferential points on a circle
+def circpoints(suffix $)(expr diam) =
+ save rad, sinrad, cosrad;
+ numeric rad, sinrad, cosrad;
+ rad = diam/2;
+ sinrad = rad*(sind 45);
+ cosrad = rad*(cosd 45);
+ z$c=z$;
+ z$ml=(x$c-rad, y$c);
+ z$mr=(x$c+rad, y$c);
+ z$bm=(x$c, y$c-rad);
+ z$tm=(x$c, y$c+rad);
+ z$tr=(x$c+cosrad, y$c+sinrad);
+ z$bl=(x$c-cosrad, y$c-sinrad);
+ z$br=(x$tr, y$bl);
+ z$tl=(x$bl, y$tr);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \subsection{Path routines}
+% \changes{v1.4}{2000/07/10}{Added path routines}
+%
+% \begin{routine}{~}
+% The binary operator |~| is a reimplementation of the METAFONT plain base
+% |softjoin| path connector (METAFONTbook, page 266);
+% it connects paths via a small circular arc
+% radius |smoothrad|.
+% \begin{macrocode}
+%%% circular arc join between two paths
+tertiarydef p ~ q =
+ begingroup
+ c_ := fullcircle scaled 2smoothrad shifted point 0 of q;
+ a_ := ypart(c_ intersectiontimes p);
+ b_ := ypart(c_ intersectiontimes q);
+ if a_ < 0: point 0 of p{direction 0 of p} else: subpath(0,a_) of p fi
+ ... if b_ < 0: {direction infinity of q}point infinity of q
+ else: subpath(b_,infinity) of q fi
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{sharply}
+% |sharply(zi, zj, ...zn)| creates a piecewise linear path through the
+% given points. (The code is based on the |flex| routine,
+% page 267 of the METAFONTbook).
+% \begin{macrocode}
+%%% piecewise linear path between the given points
+def sharply(text t) = % t is a list of pairs
+ hide(n_:=0; for z=t: z_[incr n_]:=z; endfor)
+ z_1 for k=2 upto n_: --z_[k] endfor
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{smoothly}
+% |smoothly(zi, zj, ...zn)| creates a piecewise linear path through the
+% given points, with the sharp corners replaced by circular arcs of radius
+% |smoothrad|.
+% page 267 of the METAFONTbook).
+% \begin{macrocode}
+%%% piecewise linear path between the given points with smooth corners
+def smoothly(text t) = % t is a list of pairs
+ hide(n_:=0; for z=t: z_[incr n_]:=z; endfor)
+ (z_1 for k=2 upto n_-1: --z_[k]) ~ (z_[k] endfor --z_[n_])
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \subsection{Line end drawing routines}
+%
+% \changes{v1.4}{2000/07/10}{Added individual line end drawing routines}
+% \begin{routine}{drawO}
+% Draw an open circle, diameter |dotdiam| at the end of the vector
+% |z$| to |z$$|. Any underlying graphic/text will be hidden.
+% All the line end drawing routines have similar code.
+% \begin{macrocode}
+%%% Draw an open circle at end of vector from $ to $$
+def drawO(suffix $, $$) =
+% \end{macrocode}
+% Keep everything inside a group and specify the local variables.
+% \begin{macrocode}
+ begingroup
+ save v_, c_, l, p;
+% \end{macrocode}
+% Specify the types of the local variables.
+% \begin{macrocode}
+ pair v_, c_;
+ numeric l;
+ path p;
+% \end{macrocode}
+% |v_| is the difference between the start and end points of the line.
+% That is, it is the vector from the end point to the start point.
+% \begin{macrocode}
+ v_ := z$-z$$;
+% \end{macrocode}
+% \DescribeRoutine{++}
+% \DescribeRoutine{xpart}
+% \DescribeRoutine{ypart}
+% Using \Mpost's Pythagorean addition operator |++|, where |a++b| means
+% $\sqrt{a^{2}+b^{2}}$, we can calculate the length |l| of the line from
+% the x and y dimension (|xpart| and |ypart|) of the vector |v_|.
+% \begin{macrocode}
+ l := (xpart v_)++(ypart v_); % length of the line
+% \end{macrocode}
+% Using mediation involving the ratio of the circle radius to the length
+% of the line, calculate |c_|, the required position of the center of
+% the circle at the end of the line.
+% \begin{macrocode}
+ c_ := (dotdiam/(2l))[z$$,z$];
+% \end{macrocode}
+% |p| is the path for drawing the circle.
+% \begin{macrocode}
+ p := fullcircle scaled dotdiam shifted c_;
+% \end{macrocode}
+% Erase anything underneath the circle.
+% \begin{macrocode}
+ unfill p;
+% \end{macrocode}
+% Now we can draw the circle (twice to make sure it shows).
+% \begin{macrocode}
+ draw p; draw p;
+% \end{macrocode}
+% Finish the local group and end.
+% \begin{macrocode}
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawD}
+% Draw a closed circle, diameter |dotdiam| at the end of the vector
+% |z$| to |z$$|. Any underlying graphic/text will be hidden.
+% \begin{macrocode}
+%%% Draw a closed circle at end of vector from $ to $$
+def drawD(suffix $, $$) =
+ begingroup
+ save v_, c_, l, p;
+ pair v_, c_;
+ numeric l;
+ path p;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (dotdiam/(2l))[z$$,z$];
+ p := fullcircle scaled dotdiam shifted c_;
+ fill p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawOA}
+% Draw an open arrowhead, length |gal| and base width |gab|,
+% at the end of the vector from |z$| to |z$$|.
+% The same general code pattern is used for non-circular
+% line end styles, and is described here. It is not too different
+% from drawing circular ends, except that the orientation of the line
+% has to be taken into account.
+% \begin{macrocode}
+%%% draw an open arrowhead at end of vector from $ to $$
+def drawOA(suffix $, $$) =
+ begingroup
+ save v_, c_, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gab/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gal/(l))[z$$,z$]; % base of arrowhead
+% \end{macrocode}
+% Calculate the unit vector in the direction of the line.
+% \begin{macrocode}
+ v_u := unitvector v_;
+% \end{macrocode}
+% Calculate one of the corner points on the base of the triangle by
+% shifting the midbase point in the direction of the normal to the
+% line by half the base width.
+% \begin{macrocode}
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+% \end{macrocode}
+% Specify that the other corner point is symmetrically opposite the first.
+% \begin{macrocode}
+ c_b - c_ = c_ - c_t;
+% \end{macrocode}
+% Draw the triangular arrowhead.
+% \begin{macrocode}
+ p = c_b--z$$--c_t--cycle;
+ unfill p;
+ draw p; draw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawCA}
+% Draw a closed (black) arrowhead, length |gal| and base width |gab|,
+% at the end of the vector from |z$| to |z$$|.
+% \begin{macrocode}
+%%% draw a closed arrowhead at end of vector from $ to $$
+def drawCA(suffix $, $$) =
+ begingroup
+ save v_, c_, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gab/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gal/(l))[z$$,z$]; % base of arrowhead
+ v_u := unitvector v_;
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - c_ = c_ - c_t;
+ p = c_b--z$$--c_t--cycle;
+ filldraw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawA}
+% Draw a simple arrowhead, length |gal| and base width |gab|,
+% at the end of the vector from |z$| to |z$$|.
+% \begin{macrocode}
+%%% draw a simple arrowhead at end of vector from $ to $$
+def drawA(suffix $, $$) =
+ begingroup
+ save v_, c_, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gab/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gal/(l))[z$$,z$]; % base of arrowhead
+ v_u := unitvector v_;
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - c_ = c_ - c_t;
+ p = c_b--z$$--c_t;
+ draw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawF}
+% Draw a fanin, length |gfl| and base width |gfb|,
+% at the end of the vector from |z$| to |z$$|.
+% \begin{macrocode}
+%%% draws a fanin at the end of the vector from $ to $$
+def drawF(suffix $, $$) =
+ begingroup
+ save v_, c_, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gfb/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gfl/(l))[z$$,z$]; % apex of fan
+ v_u := unitvector v_;
+ c_t := z$$ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - z$$ = z$$ - c_t;
+ p = c_b--c_--c_t;
+ draw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \subsection{Line drawing routines}
+% \changes{v1.4}{2000/07/10}{Stripped in-line line end code from line drawing routines}
+%
+% \begin{routine}{drawdots}
+% Draw a dotted line between the two points |z$| and |z$$|.
+% \begin{macrocode}
+%%% Draw a dotted line from $ to $$
+def drawdots(suffix $, $$) =
+ pickup dotspen;
+ draw z$--z$$ dots;
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsthree}
+% Draw a straight dotted line between the three points |z$|, |z@| and |z$$|.
+% \begin{macrocode}
+%%% Draws the dotted line $--@--$$
+def drawdotsthree(suffix $, @, $$) =
+ pickup dotspen;
+ draw z$--z@--z$$ dots;
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsfour}
+% Draw a straight dotted line between the four points |z$|, |z@|, |z@@| and |z$$|.
+% \begin{macrocode}
+%%% Draw the dotted line $--@--@@--$$
+def drawdotsfour(suffix $, @, @@, $$) =
+ pickup dotspen;
+ draw z$--z@--z@@--z$$ dots;
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsO}
+% Draw a dotted line between the two points |z$| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% Draw a dotted line from $ to $$ with open circle at $$
+def drawdotsO(suffix $, $$) =
+ pickup dotspen;
+ draw z$--z$$ dots;
+ pickup normalpen;
+ drawO($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsthreeO}
+% Draw a straight dotted line between the three points |z$|, |z@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% Draws the dotted line $--@--$$
+def drawdotsthreeO(suffix $, @, $$) =
+ pickup dotspen;
+ draw z$--z@--z$$ dots;
+ pickup normalpen;
+ drawO(@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsfourO}
+% Draw a straight dotted line between the four points |z$|, |z@|, |z@@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% Draw the dotted line $--@--@@--$$
+def drawdotsfourO(suffix $, @, @@, $$) =
+ pickup dotspen;
+ draw z$--z@--z@@--z$$ dots;
+ pickup normalpen;
+ drawO(@@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdotsOO}
+% Draw a dotted line between the two points |z$| and |z$$|,
+% ending in open circles, diameter |dotdiam|, at |z$| and |z$$|.
+% \begin{macrocode}
+%%% Draw the dotted line from $ to $$, ending in circles diameter dotdiam at $ and $$
+def drawdotsOO(suffix $, $$) =
+ pickup dotspen;
+ draw z$--z$$ dots;
+ pickup normalpen;
+ drawO($, $$); drawO($$, $);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdash}
+% Draw a dashed line between the two points |z$| and |z$$|.
+% \begin{macrocode}
+%%% draws a dashed line from $ to $$
+def drawdash(suffix $, $$) =
+ draw z$--z$$ dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashthree}
+% Draw a straight dashed line between the three points |z$|, |z@| and |z$$|.
+% \begin{macrocode}
+%%% draws the dashed line $--@--$$
+def drawdashthree(suffix $, @, $$) =
+ draw z$--z@--z$$ dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashfour}
+% Draw a straight dashed line between the four points |z$|, |z@|, |z@@| and |z$$|.
+% \begin{macrocode}
+%%% draws the dashed line $--@--@@--$$
+def drawdashfour(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$ dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashO}
+% Draw a dashed line between the two points |z$| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws a dashed line from $ to $$, ending in a circle diameter dotdiam at $$
+def drawdashO(suffix $, $$) =
+ draw z$--z$$ dashes;
+ drawO($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashthreeO}
+% Draw a straight dashed line between the three points |z$|, |z@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the dashed line $--@--$$ with circle at $$
+def drawdashthreeO(suffix $, @, $$) =
+ draw z$--z@--z$$ dashes;
+ drawO(@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashfourO}
+% Draw a straight dashed line between the four points |z$|, |z@|, |z@@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the dashed line $--@--@@--$$ with circle at $$
+def drawdashfourO(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$ dashes;
+ drawO(@@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashOO}
+% Draw a dashed line between the two points |z$| and |z$$|,
+% ending in open circles, diameter |dotdiam|, at |z$| and |z$$|.
+% \begin{macrocode}
+% drawdashOO($, $$)
+%%% draws a dashed line from $ to $$, ending in circles diameter dotdiam at $ and $$
+def drawdashOO(suffix $, $$) =
+ draw z$--z$$ dashes;
+ drawO($, $$); drawO($$, $);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormal}
+% Draw a normal thickness line between the two points |z$| and |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$.
+def drawnormal(suffix $, $$) =
+ draw z$--z$$;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalthree}
+% Draw a straight normal thickness line between the three points |z$|, |z@| and |z$$|.
+% \begin{macrocode}
+% drawnormalthree($, @, $$)
+%%% draws the normal line $--@--$$
+def drawnormalthree(suffix $, @, $$) =
+ draw z$--z@--z$$;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalfour}
+% Draw a straight normal thickness line between the four points |z$|, |z@|, |z@@| and |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--@@--$$
+def drawnormalfour(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalO}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+% drawnormalO($, $$)
+%%% draws a normal line from $ to $$, ending in a circle diameter dotdiam at $$
+def drawnormalO(suffix $, $$) =
+ draw z$--z$$;
+ drawO($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalthreeO}
+% Draw a straight normal thickness line between the three points |z$|, |z@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--$$, ending in a circle at $$
+def drawnormalthreeO(suffix $, @, $$) =
+ draw z$--z@--z$$;
+ drawO(@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalfourO}
+% Draw a straight normal thickness line between the four points |z$|, |z@|, |z@@| and |z$$|,
+% ending in an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the line $--@--@@--$$, ending in a circle at $$
+def drawnormalfourO(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$;
+ drawO(@@, $$);
+enddef;
+
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalOO}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending in open circles, diameter |dotdiam|, at |z$| and |z$$|.
+% \begin{macrocode}
+% drawnormalOO($, $$)
+%%% draws a normal line from $ to $$, ending in circles diameter dotdiam at $ and $$
+def drawnormalOO(suffix $, $$) =
+ draw z$--z$$;
+ drawO($, $$); drawO($$, $);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalD}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending in a black dot, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending in a dot diameter dotdiam at $$
+def drawnormalD(suffix $, $$) =
+ draw z$--z$$;
+ drawD($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalthreeD}
+% Draw a straight normal thickness line between the three points |z$|, |z@| and |z$$|,
+% ending in a black dot, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--$$, ending in a dot at $$
+def drawnormalthreeD(suffix $, @, $$) =
+ draw z$--z@--z$$;
+ drawD(@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalfourD}
+% Draw a straight normal thickness line between the four points |z$|, |z@|, |z@@| and |z$$|,
+% ending in a black dot, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--@@--$$, ending in a dot at $$
+def drawnormalfourD(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$;
+ drawD(@@, $$);
+enddef;
+
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalDD}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending in black dots, diameter |dotdiam|, at |z$| and |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending in dots diameter dotdiam at $ and $$
+def drawnormalDD(suffix $, $$) =
+ draw z$--z$$;
+ drawD($, $$); drawD($$, $);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalOA}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with an open arrowhead, length |gal| and base width |gab|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with an open arrowhead at $$
+def drawnormalOA(suffix $, $$) =
+ draw z$--z$$;
+ drawOA($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalCA}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with a closed (black) arrowhead, length |gal| and base width |gab|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with a closed arrowhead at $$
+def drawnormalCA(suffix $, $$) =
+ draw z$--z$$;
+ drawCA($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalthreeCA}
+% Draw a straight normal thickness line between the three points |z$|, |z@| and |z$$|,
+% ending in a closed arrowhead at |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--$$, ending in a black arrowhead at $$
+def drawnormalthreeCA(suffix $, @, $$) =
+ draw z$--z@--z$$;
+ drawCA(@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalfourCA}
+% Draw a straight normal thickness line between the four points |z$|, |z@|, |z@@| and |z$$|,
+% ending in a closed arrowhead at |z$$|.
+% \begin{macrocode}
+%%% draws the normal line $--@--@@--$$, ending in a black arrowhead at $$
+def drawnormalfourCA(suffix $, @, @@, $$) =
+ draw z$--z@--z@@--z$$;
+ drawCA(@@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalF}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with a fanin, length |gfl| and base width |gfb|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with a fanin at $$
+def drawnormalF(suffix $, $$) =
+ draw z$--z$$;
+ drawF($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalFO}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with a fanin, length |gfl| and base width |gfb|,
+% at |z$| and an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, with a fanin at $ and an open circle at $$
+def drawnormalFO(suffix $, $$) =
+ draw z$--z$$;
+ drawO($, $$); drawF($$, $);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawthick}
+% Draw a straight thick line between the two points |z$| and |z$$|
+% \begin{macrocode}
+%%% draws a thick line from $ to $$.
+def drawthick(suffix $, $$) =
+ pickup thickpen;
+ draw z$--z$$;
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawthickO}
+% Draw a straight thick line between the two points |z$| and |z$$|,
+% ending with an open circle, diameter |dotdiam|, at |z$$|.
+% \begin{macrocode}
+%%% draws a thick line from $ to $$, ending in a circle diameter dotdiam at $$
+def drawthickO(suffix $, $$) =
+ pickup thickpen;
+ draw z$--z$$;
+ drawO($, $$);
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawthickOO}
+% Draw a straight thick line between the two points |z$| and |z$$|,
+% ending with open circles, diameter |dotdiam|, at |z$| and |z$$|.
+% \changes{v1.5}{2003/07/31}{Added thickpen to drawthickOO}
+% \begin{macrocode}
+%%% draws a thick line from $ to $$, ending in circles diameter dotdiam at $ and $$
+def drawthickOO(suffix $, $$) =
+ pickup thickpen;
+ draw z$--z$$;
+ drawO($, $$); drawO($$, $);
+ pickup normalpen;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{smooth}
+% Rounds the join at |z@| between the two straight lines |z$--z@--z$$|.
+% The radius of the circular arc is |smoothrad|. The code employs the
+% same technique as used for putting dots, etc., at the end of a line.
+% However, in this case we `undraw' the sharp corner before drawing the
+% arc.
+% \changes{v1.3}{2000/05/22}{Added smooth routine}
+% \begin{macrocode}
+%%% replaces the sharp corner on $--@--$$ with a circular arc radius smoothrad
+def smooth(suffix $, @, $$) =
+ begingroup
+ save v_, c_, l, p;
+ pair v_, v_', c_, c_';
+ path p;
+ v_ := z@-z$;
+ l := (xpart v_)++(ypart v_); % length of $--@
+ c_ := (smoothrad/l)[z@,z$]; % start of arc on $--@
+ v_' := z$$-z@;
+ l := (xpart v_')++(ypart v_'); % length of @--$$
+ c_' := (smoothrad/l)[z@,z$$]; % end of arc on @--$$
+ undraw c_--z@--c_'; % blank original join
+ draw c_{v_}..{v_'}c_'; % draw the arc
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{smoothtwo}
+% Rounds the joins at |z@| and |z@@| between the three straight lines
+% |z$--z@--z@@--z$$|.
+% The radius of the circular arc is |smoothrad|.
+% \changes{v1.3}{2000/05/22}{Added smoothtwo routine}
+% \begin{macrocode}
+%%% replaces the sharp corners on $--@--@@--$$ with a circular arc radius smoothrad
+def smoothtwo(suffix $, @, @@, $$) =
+ smooth($, @, @@); smooth(@, @@, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{smoothdash}
+% Rounds the join at |z@| between the two dashed straight lines |z$--z@--z$$|.
+% The radius of the circular arc is |smoothrad|.
+% \changes{v1.3}{2000/05/22}{Added smoothdash routine}
+% \begin{macrocode}
+%%% replaces the sharp corner on the dashed lines $--@--$$
+%%% with a circular arc radius smoothrad
+def smoothdash(suffix $, @, $$) =
+ begingroup
+ save v_, c_, l, p;
+ pair v_, v_', c_, c_';
+ path p;
+ v_ := z@-z$;
+ l := (xpart v_)++(ypart v_); % length of $--@
+ c_ := (smoothrad/l)[z@,z$]; % start of arc on $--@
+ v_' := z$$-z@;
+ l := (xpart v_')++(ypart v_'); % length of @--$$
+ c_' := (smoothrad/l)[z@,z$$]; % end of arc on @--$$
+ undraw c_--z@--c_'; % blank original join
+ draw c_{v_}..{v_'}c_' dashes; % draw the dashed arc
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{smoothdots}
+% Rounds the join at |z@| between the two dotted straight lines |z$--z@--z$$|.
+% The radius of the circular arc is |smoothrad|.
+% \changes{v1.3}{2000/05/22}{Added smoothdots routine}
+% \begin{macrocode}
+%%% replaces the sharp corner on the dotted line $--@--$$
+%%% with a circular arc radius smoothrad
+def smoothdots(suffix $, @, $$) =
+ begingroup
+ save oldpen;
+ pen oldpen; oldpen := currentpen;
+ save v_, c_, l, p;
+ pair v_, v_', c_, c_';
+ path p;
+ v_ := z@-z$;
+ l := (xpart v_)++(ypart v_); % length of $--@
+ c_ := (smoothrad/l)[z@,z$]; % start of arc on $--@
+ v_' := z$$-z@;
+ l := (xpart v_')++(ypart v_'); % length of @--$$
+ c_' := (smoothrad/l)[z@,z$$]; % end of arc on @--$$
+ undraw c_--z@--c_'; % blank original join
+ pickup dotspen;
+ draw c_{v_}..{v_'}c_' dots; % draw the dotted arc
+ pickup oldpen;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \subsection{Box drawing routines}
+%
+% The box drawing routines take as an argument the suffix (|$|) of the
+% left-hand bottom corner point of the box, and normally the length and
+% height of the box. There is normally also a text argument that gets
+% typeset at the `center' of the box. The coordinates of the box corners
+% are calculated (|z$bl|, |z$br|, |z$tr| and |z$tl|). The midpoints of
+% the sides of the box (|z$bm|, |z$mr|, |z$tm|, |z$ml|) are calculated
+% as well. The text `center' of the box is |z$c|, while the geometric
+% center of the box will be at the intersection point of the lines
+% |z$bm--z$tm| and |z$ml--z$mr|. See \fref{fig:boxpoints} for an
+% illustration.
+%
+%
+% \begin{routine}{drawSCHEMA}
+% |drawSCHEMA(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a SCHEMA box.
+% \begin{macrocode}
+%%% draws a schema box, bottom left at $, length l, height h
+def drawSCHEMA(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ x$c = 1/2[x$ml, x$mr];
+ y$c = 1/2[y$ml, y$tl];
+ draw z$bl--z$br--z$tr--z$tl--cycle; % outer box
+ draw z$ml--z$mr; % dividing line
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawSDT}
+% |drawSDT(|\meta{suffix}|)(|\meta{name}|)| draws
+% a simple data type box of length |sdtbl| and height |sdtbh|.
+% \begin{macrocode}
+% drawSDT($)(name)
+% draw a simple data type box, bottom left at $
+def drawSDT(suffix $)(text str) =
+ rectpoints($, sdtbl, sdtbh);
+ z$ti = (x$tr-sdtbs, y$tr);
+ z$bi = (x$ti, y$br);
+ z$c = 1/2[z$bl,z$ti];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ draw z$bi--z$ti;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawASDT}
+% |drawASDT(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a simple data type box.
+% \begin{macrocode}
+% drawASDT($, l, h)(name)
+% draw a simple data type box, bottom left at $, length l, height h
+def drawASDT(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ z$ti = (x$tr-sdtbs, y$tr);
+ z$bi = (x$ti, y$br);
+ z$c = 1/2[z$bl,z$ti];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ draw z$bi--z$ti;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% The |drawNAME(|\meta{suffix}|)| routines draw a simple data type
+% box of the given name using the applicable lengths and heights.
+% \begin{routine}{drawBINARY}
+% \begin{routine}{drawBOOLEAN}
+% \begin{routine}{drawCOMPLEX}
+% \begin{routine}{drawEXPRESSION}
+% \begin{macrocode}
+def drawBINARY(suffix $) = drawASDT($)(sdtbl, sdtbh)("BINARY");
+ enddef;
+def drawBOOLEAN(suffix $) = drawASDT($)(sdtbl, sdtbh)("BOOLEAN");
+ enddef;
+def drawCOMPLEX(suffix $) = drawASDT($)(sdtbl, sdtbh)("COMPLEX");
+ enddef;
+def drawEXPRESSION(suffix $) = drawASDT($)(sdtbel, sdtbeh)("EXPRESSION");
+ enddef;
+% \end{macrocode}
+% \end{routine}
+% \end{routine}
+% \end{routine}
+% \end{routine}
+%
+% \begin{routine}{drawGENERIC}
+% \begin{routine}{drawINTEGER}
+% \begin{routine}{drawLOGICAL}
+% \begin{routine}{drawNUMBER}
+% \begin{macrocode}
+def drawGENERIC(suffix $) = drawASDT($)(sdtbl, sdtbh)("GENERIC");
+ enddef;
+def drawINTEGER(suffix $) = drawASDT($)(sdtbl, sdtbh)("INTEGER");
+ enddef;
+def drawLOGICAL(suffix $) = drawASDT($)(sdtbl, sdtbh)("LOGICAL");
+ enddef;
+def drawNUMBER(suffix $) = drawASDT($)(sdtbl, sdtbh)("NUMBER");
+ enddef;
+% \end{macrocode}
+% \end{routine}
+% \end{routine}
+% \end{routine}
+% \end{routine}
+%
+% \begin{routine}{drawREAL}
+% \begin{routine}{drawSTRING}
+% \begin{macrocode}
+def drawREAL(suffix $) = drawASDT($)(sdtbl, sdtbh)("REAL");
+ enddef;
+def drawSTRING(suffix $) = drawASDT($)(sdtbl, sdtbh)("STRING");
+ enddef;
+
+% \end{macrocode}
+% \end{routine}
+% \end{routine}
+%
+% \begin{routine}{drawENUM}
+% |drawENUM(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% an ENUMERATION type box.
+% \begin{macrocode}
+% drawENUM($, l, h)(name)
+%%% draw an enumeration type box, bottom left at $, length l, height h
+def drawENUM(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ z$ti = (x$tr-sdtbs, y$tr);
+ z$bi = (x$ti, y$br);
+ z$c = 1/2[z$bl,z$ti];
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+ draw z$bi--z$ti dashes;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawSELECT}
+% |drawSELECT(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a SELECT type box.
+% \begin{macrocode}
+% drawSELECT($, l, h)(name)
+%%% draw a select type box, bottom left at $, length l, height h
+def drawSELECT(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ z$ti = (x$tl+sdtbs, y$tl);
+ z$bi = (x$ti, y$bl);
+ z$c = 1/2[z$br,z$ti];
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+ draw z$bi--z$ti dashes;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawTYPE}
+% |drawTYPE(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a user-defined TYPE type box.
+% \begin{macrocode}
+% drawTYPE($, l, h)(name)
+%%% draw a simple user defined TYPE box, bottom left at $, length l, height h
+def drawTYPE(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ z$c = 1/2[z$bl,z$tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawENT}
+% |drawENT(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% an ENTITY box.
+% \begin{macrocode}
+% drawENT($, l, h)(name)
+%%% draw an entity box, bottom left at $, length l, height h
+def drawENT(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ z$c = 1/2[z$bl,z$tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawOB}
+% |drawOB(|\meta{suffix}, \meta{l}, \meta{h}|)| draws
+% a rectangular box with rounded corners (an \ExpressG{} oval box).
+% \begin{macrocode}
+% drawOB($, l, h)
+% draw an oval box, bottom left at $, length l, height h
+def drawOB(suffix $)(expr l, h) =
+ save rad;
+ numeric rad; rad := h/2;
+ rectpoints($, l, h);
+ z$cl = 1/2[z$bl, z$tl];
+ z$cr = 1/2[z$br, z$tr];
+ z$bli = (x$bl+rad, y$bl);
+ z$tli = (x$bli, y$tl);
+ z$bri = (x$br-rad, y$br);
+ z$tri = (x$bri, y$tr);
+ z$c = 1/2[z$bl,z$tr];
+ draw z$bli--z$bri..z$cr..z$tri--z$tli..z$cl..cycle;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawPREF}
+% |drawPREF(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a page reference oval box.
+% \begin{macrocode}
+% drawPREF($, l, h)(name)
+%%% draw a page reference box oval, bottom left at $, length l, height h
+def drawPREF(suffix $)(expr l, h)(text str) =
+ drawOB($, l, h);
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \begin{routine}{drawISU}
+% |drawISU(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% an interschema USE box.
+% \begin{macrocode}
+% drawISU($, l, h)(name)
+%%% draw an interschema USE box, bottom left at $, length l, height h
+def drawISU(suffix $)(expr l, h)(text str) =
+ save quarter;
+ numeric quarter; quarter := h/4;
+ rectpoints($, l, h);
+ z$o = (x$, y$+quarter);
+ drawOB($o, l, 2quarter);
+ z$c = 1/2[z$bl,z$tr];
+ label(str, z$c);
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawISUR}
+% |drawISUR(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)(|\meta{rename}|)| draws
+% an interschema USE RENAME box.
+% \changes{v1.5}{2003/07/31}{Changed rnm to rname in drawISUR}
+% \begin{macrocode}
+% drawISUR($, l, h)(name)(rename)
+%%% draw an interschema USE RENAME box, bottom left at $, length l, height h
+def drawISUR(suffix $)(expr l, h)(text str, rname) =
+ save third;
+ numeric third; third := h/3;
+ rectpoints($, l, h);
+ z$o = (x$, y$+third);
+ drawOB($o, l, third);
+ z$c = 1/2[z$bl, z$tr];
+ label(str, z$c);
+ z$rnm = 1/2[z$bl,(x$br,y$br+third)];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ label(rname, z$rnm);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawISR}
+% |drawISR(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% an interschema RERERENCE box.
+% \begin{macrocode}
+% drawISR($, l, h)(name)
+%%% draw an interschema REFERENCE box, bottom left at $, length l, height h
+def drawISR(suffix $)(expr l, h)(text str) =
+ save quarter;
+ numeric quarter; quarter := h/4;
+ rectpoints($, l, h);
+ z$o = (x$, y$+quarter);
+ drawOB($o, l, 2quarter);
+ z$c = 1/2[z$bl,z$tr];
+ label(str, z$c);
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawISRR}
+% |drawISRR(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)(|\meta{rename}|)| draws
+% an interschema REFERENCE RENAME box.
+% \changes{v1.5}{2003/07/31}{Changed rnm to rname in drawISSR}
+% \begin{macrocode}
+% drawISRR($, l, h)(name)(rename)
+%%% draw an interschema REFERENCE RENAME box, bottom left at $, length l, height h
+def drawISRR(suffix $)(expr l, h)(text str, rname) =
+ save third;
+ numeric third; third := h/3;
+ rectpoints($, l, h);
+ z$o = (x$, y$+third);
+ drawOB($o, l, third);
+ z$c = 1/2[z$bl,z$tr];
+ label(str, z$c);
+ z$rnm = 1/2[z$bl,(x$br,y$br+third)];
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+ label(rname, z$rnm);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \begin{routine}{drawLEVENT}
+% |drawLEVENT(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a Local EVENT box, with side slope |eventslope|.
+% \begin{macrocode}
+% drawLEVENT($, l, h)(name)
+%%% draw a Local EVENT box, bottom left at $, length l, height h
+def drawLEVENT(suffix $)(expr l, h)(text str) =
+ rhompoints($, l, h, eventslope);
+ z$c = 1/2[z$ml,z$mr];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawGEVENT}
+% |drawGEVENT(|\meta{suffix}, \meta{l}, \meta{h}|)(|\meta{name}|)| draws
+% a Global EVENT box, with side slope |eventslope|.
+% \begin{macrocode}
+% drawGEVENT($, l, h)(name)
+%%% draw a Global EVENT box, bottom left at $, length l, height h
+def drawGEVENT(suffix $)(expr l, h)(text str) =
+ rhompoints($, l, h, eventslope);
+ z$c = 1/2[z$ml,z$mr];
+ pickup thickpen;
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ pickup normalpen;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+%
+% \begin{routine}{drawcirclebox}
+% |drawcirclebox(|\meta{suffix}, \meta{diam}|)(|\meta{name}|)| draws
+% a circle, center |zsuffix| and diameter \meta{diam}, around \meta{name}.
+% \begin{macrocode}
+% drawcirclebox($, diam)(name)
+%%% draw a circled name, diameter diam centered at $
+def drawcirclebox(suffix $)(expr diam)(text str) =
+ circpoints($, diam);
+ draw z$bl..z$bm..z$br..z$mr..z$tr..z$tm..z$tl..z$ml..cycle;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \subsection{Extra BLA variables and routines}
+%
+% Some extra facilities are provided for assistance in drawing
+% non-\ExpressG{} BLA diagrams, such as flow charts, IDEF diagrams
+% or UML structure diagrams.
+%
+% \begin{variable}{gdl}
+% \begin{variable}{gdb}
+% |gdl| is the length of a diamond line end style and |gdb| is the base
+% width.
+% \begin{macrocode}
+%%% length and base width of diamond line end styles
+newinternal gdl, gdb;
+numeric gdl, gdb;
+gdl := 2defaultgal;
+gdb := 0.75defaultgab;
+
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+%
+% \begin{routine}{ellipsepoints}
+% \changes{v1.2}{1999/11/15}{Added ellipsepoints routine}
+% Calculates the points on an ellipse, center at |z$| with horizontal
+% diameter |l| and vertical diameter |h|. It does \emph{not} calculate
+% the center point.
+% \begin{macrocode}
+def ellipsepoints(suffix $)(expr l, h) =
+ save epp, move;
+ path epp;
+ pair move;
+ z$ml=(x$-l/2, y$); z$mr=(x$ml+l,y$);
+ z$tm=(x$, y$+h/2); z$bm=(x$, y$tm-h);
+ move = 1/2[z$ml,z$mr];
+ epp = fullcircle scaled h xscaled (l/h) shifted move;
+ z$tr = point 1.2 of epp;
+ z$tl = point 2.8 of epp;
+ z$bl = point 5.2 of epp;
+ z$br = point 6.8 of epp;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawDCA}
+% Draw double closed arrowheads, each length |gal| and base
+% width |gab|, at end of vector from |z$| to |z$$|.
+% \changes{v1.4}{2000/07/10}{Added drawDCA}
+% \begin{macrocode}
+%%% draws double closed arrowheads at end of vector from $ to $$
+def drawDCA(suffix $, $$) =
+ begingroup
+ save v_, c_, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, v_u, c_t, c_b;
+ path p[];
+ numeric l, hb;
+ hb := gab/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gal/(l))[z$$,z$]; % base of arrowhead
+ v_u := unitvector v_;
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - c_ = c_ - c_t;
+ p1 := c_b--z$$--c_t--cycle;
+ filldraw p1;
+ p2 := p1 shifted ((xpart c_ - x$$), (ypart c_ - y$$));
+ filldraw p2;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawOD}
+% Draw an open diamond, length |gdl| and base width |gdb|,
+% at end of vector from |z$| to |z$$|.
+% \begin{macrocode}
+%%% draws an open diamond at end of vector from $ to $$
+def drawOD(suffix $, $$) =
+ begingroup
+ save v_, c_, c__, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, c__, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gdb/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gdl/(2l))[z$$,z$]; % base of diamond
+ c__ := (gdl/(l))[z$$,z$]; % interior tip of diamond
+ v_u := unitvector v_;
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - c_ = c_ - c_t;
+ p = c_b--z$$--c_t--c__--cycle;
+ unfill p;
+ draw p; draw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawCD}
+% Draw a closed diamond, length |gdl| and base width |gdb|,
+% at end of vector from |z$| to |z$$|.
+% \begin{macrocode}
+%%% draws a closed diamond at end of vector from $ to $$
+def drawCD(suffix $, $$) =
+ begingroup
+ save v_, c_, c__, v_u, c_t, c_b, l, hb, p;
+ pair v_, c_, c__, v_u, c_t, c_b;
+ numeric l, hb;
+ path p;
+ hb := gdb/2;
+ v_ := z$-z$$;
+ l := (xpart v_)++(ypart v_); % length of the line
+ c_ := (gdl/(2l))[z$$,z$]; % base of diamond
+ c__ := (gdl/(l))[z$$,z$]; % interior tip of diamond
+ v_u := unitvector v_;
+ c_t := c_ shifted (-hb*(ypart v_u), hb*(xpart v_u));
+ c_b - c_ = c_ - c_t;
+ p = c_b--z$$--c_t--c__--cycle;
+ filldraw p;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \begin{routine}{drawdashA}
+% Draw a straight dashed line between the two points |z$| and |z$$|,
+% ending with an arrowhead, length |gal| and base width |gab|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a dashed line from $ to $$, ending with an arrowhead at $$
+def drawdashA(suffix $, $$) =
+ draw z$--z$$ dashes;
+ drawA($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashOA}
+% Draw a straight dashed line between the two points |z$| and |z$$|,
+% ending with an open arrowhead, length |gal| and base width |gab|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a dashed line from $ to $$, ending with an open arrowhead at $$
+def drawdashOA(suffix $, $$) =
+ draw z$--z$$ dashes;
+ drawOA($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalDCA}
+% Draw a straight normal line between the two points |z$| and |z$$|,
+% ending with double closed arrowheads, each length |gal| and base
+% width |gab|, at |z$$|.
+% \changes{v1.2}{1999/11/15}{Added drawnormalDCA}
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with double closed arrowheads at $$
+def drawnormalDCA(suffix $, $$) =
+ draw z$--z$$;
+ drawDCA($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalOD}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with an open diamond, length |gdl| and base width |gdb|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with an open diamond at $$
+def drawnormalOD(suffix $, $$) =
+ draw z$--z$$;
+ drawOD($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawnormalCD}
+% Draw a straight normal thickness line between the two points |z$| and |z$$|,
+% ending with a closed diamond, length |gdl| and base width |gdb|,
+% at |z$$|.
+% \begin{macrocode}
+%%% draws a normal line from $ to $$, ending with a closed diamond at $$
+def drawnormalCD(suffix $, $$) =
+ draw z$--z$$;
+ drawCD($, $$);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashcircle}
+% \changes{v1.2}{1999/11/15}{Added drawdashcircle}
+% Draw a normal thickness dashed open circle, center |z$|, diameter |diam|.
+% \begin{macrocode}
+%%% draws an open dashed circle, center z$, diameter diam
+def drawdashcircle(suffix $)(expr diam) =
+ circpoints($, diam);
+ draw z$bl..z$bm..z$br..z$mr..z$tr..z$tm..z$tl..z$ml..cycle dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawcircleA}
+% \changes{v1.1}{1999/10/30}{Added drawcircleA routine}
+% Draw a normal thickness open circle, center |z$|, diameter |diam|, and with
+% a counterclockwise pointing arrow at the topmost point. The arrow has
+% length |gal| and base width |gab|.
+% \begin{macrocode}
+%%% draws an open circle, center z$, diameter diam, with an arrow at the top
+def drawcircleA(suffix $)(expr diam) =
+ circpoints($, diam);
+ begingroup
+ save c_, c_t, c_b, hb;
+ pair c_, c_t, c_b;
+ numeric hb;
+ hb := gab/2;
+ c_ := z$tm shifted (gal*right); % base of arrowhead
+ c_t := c_ shifted (hb*up);
+ c_b := c_ shifted (hb*down);
+ draw z$bl..z$bm..z$br..z$mr..z$tr..z$tm..z$tl..z$ml..cycle;
+ draw c_t--z$tm--c_b;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawDot}
+% Draw a black dot, center |z$|, diameter |diam|.
+% \changes{v1.6}{2004/02/29}{Added drawDot}
+% \begin{macrocode}
+%%% draws black dot, center z$, diameter diam
+def drawDot(suffix $)(expr diam) =
+ begingroup
+ save p;
+ path p;
+ p := fullcircle scaled diam shifted z$;
+ filldraw p;
+ endgroup
+enddef;
+
+% \nd{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawCircledDot}
+% Draw a black dot, center |z$|, surrounded by a circle, overall
+% diameter |diam|.
+% \changes{v1.6}{2004/02/29}{Added drawCircledDot}
+% \begin{macrocode}
+%%% draws black dot surrounded by a circle, center z$, diameter diam
+def drawCircledDot(suffix $)(expr diam) =
+ begingroup
+ save l_, p;
+ numeric l_;
+ path p[];
+ l_ := 5/7diam;
+ p1 := fullcircle scaled diam shifted z$;
+ unfill p1;
+ draw p1;
+ p2 := fullcircle scaled l_ shifted z$;
+ filldraw p2;
+ endgroup
+enddef;
+
+% \nd{macrocode}
+% \end{routine}
+%
+%
+% \begin{routine}{drawcardbox}
+% \changes{v1.1}{1999/10/30}{Added drawcardbox routine}
+% Draw a rectangular box that has its top righthand corner folded down.
+% |m| is the height/length of the fold.
+% \begin{macrocode}
+def drawcardbox(suffix $)(expr l, h, m)(text str) =
+ rectpoints($, l, h);
+ begingroup
+ save c;
+ pair c[];
+ c1 = (x$tr-m, y$tr);
+ c3 = (x$tr, y$tr-m);
+ c2 = (xpart c1, ypart c3);
+ draw z$bl--z$br--c3--c1--z$tl--cycle;
+ draw c1--c2--c3;
+ endgroup;
+ z$c = 1/2[z$ml,z$mr];
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdiamondbox}
+% Draw a diamond shaped box. Like circles, the box is located at its
+% center point and
+% not at the bottom left corner (see \fref{fig:diamondpoints}).
+%
+% \begin{macrocode}
+def drawdiamondbox(suffix $)(expr l, h)(text str) =
+ z$ml=(x$-l/2, y$); z$tm=(x$, y$+h/2);
+ z$mr=(x$ml+l, y$); z$bm=(x$, y$tm-h);
+ z$bl=1/2[z$ml,z$bm];
+ z$br=1/2[z$bm,z$mr];
+ z$tr=1/2[z$mr,z$tm];
+ z$tl=1/2[z$tm,z$ml];
+ z$c=z$;
+ draw z$ml--z$bm--z$mr--z$tm--cycle;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawtwodiamondbox}
+% \changes{v1.2}{1999/11/15}{Added drawtwodiamondbox routine}
+% Draw a diamond shaped box with a smaller diamond inside.
+%
+% \begin{macrocode}
+def drawtwodiamondbox(suffix $)(expr l, h, mrg)(text str) =
+ z$ml=(x$-l/2, y$); z$tm=(x$, y$+h/2);
+ z$mr=(x$ml+l, y$); z$bm=(x$, y$tm-h);
+ z$bl=1/2[z$ml,z$bm];
+ z$br=1/2[z$bm,z$mr];
+ z$tr=1/2[z$mr,z$tm];
+ z$tl=1/2[z$tm,z$ml];
+ z$c=z$;
+ begingroup
+ save v_, p, tl, sf;
+ pair v_;
+ numeric tl, sf;
+ path p[];
+ p1 = z$ml--z$bm--z$mr--z$tm--cycle;
+ draw p1;
+ v_ := z$c-z$tr;
+ tl := (xpart v_)++(ypart v_);
+ sf = 1.0 - mrg/tl;
+ p2 = p1 shifted -z$c scaled sf shifted z$c;
+ draw p2;
+ endgroup;
+ label(str, z$c);
+
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdoublerectangle}
+% Draw a double box where |tf| is the fraction of the height of the
+% top portion. The ends of the dividing line are |z$tfl| and |z$tfr|.
+% The text centers are |z$ct| and |z$cb| for the top and bottom portions.
+% \begin{macrocode}
+def drawdoublerectangle(suffix $)(expr l, h, tf) =
+ rectpoints($, l, h);
+ z$tfl=tf[z$tl,z$bl]; z$tfr=tf[z$tr,z$br];
+ z$cb=1/2[z$bl,z$tfr];
+ z$ct=1/2[z$tfl,z$tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ draw z$tfl--z$tfr;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+%
+% \begin{routine}{drawtriplerectangle}
+% \changes{v1.1}{1999/10/30}{Added drawtriplerectangle routine}
+% Draws a triple box, where |tf| is the fraction of the height for the
+% top portion and |bf| is the fraction of the height for the bottom
+% portion. Text centers for the three portions are |z$ct|, |z$cm| and |z$cb|
+% for the top, middle and bottom portions. The points at the ends of the
+% dividing lines are |z$tfl| and |z$tfr| for the top portion
+% and |z$bfl| and |z$bfr| for the bottom.
+%
+% \begin{macrocode}
+def drawtriplerectangle(suffix $)(expr l, h, tf, bf) =
+ rectpoints($, l, h);
+ z$tfl=tf[z$tl,z$bl]; z$tfr=tf[z$tr,z$br];
+ z$bfl=bf[z$bl,z$tl]; z$bfr=bf[z$br,z$tr];
+ z$cb=1/2[z$bl,z$bfr];
+ z$cm=1/2[z$bfl,z$tfr];
+ z$ct=1/2[z$tfl,z$tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ draw z$bfl--z$bfr;
+ draw z$tfl--z$tfr;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{hiderectangle}
+% Draws an invisible rectangular box of the usual dimensions that
+% covers up anything underneath it.
+% \begin{macrocode}
+def hiderectangle(suffix $)(expr l, h) =
+ begingroup
+ save c;
+ pair c[];
+ c1=(x$,y$);
+ c2=c1+(l,0);
+ c3=c1+(l,h);
+ c4=c1+(0,h);
+ unfilldraw c1--c2--c3--c4--cycle;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashboxover}
+% Draws a dashed box that covers up anything underneath it.
+% \begin{macrocode}
+def drawdashboxover(suffix $)(expr l, h) =
+ rectpoints($, l, h);
+ hiderectangle($, l, h);
+ z$c = 1/2[z$bl,z$tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle dashes;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawindexbox}
+% Draws an index box. The main box is |l| by |h| and the small box
+% at the top left is |lp| by |hp|. The main box points are the usual
+% |z$bl| etc, but the top box points are |z$P.bl| etc. The |str|
+% is put at the center (|z$P.c|) of the small box.
+% \begin{macrocode}
+def drawindexbox(suffix $)(expr l, h, lp, hp)(text str) =
+ rectpoints($, l, h);
+ z$c = 1/2[z$bl,z$tr];
+ z$P = z$tl;
+ rectpoints($P, lp, hp);
+ z$P.c = 1/2[z$P.bl, z$P.tr];
+ draw z$bl--z$br--z$tr--z$tl--cycle;
+ draw z$P.bl--z$P.br--z$P.tr--z$P.tl--cycle;
+ label(str, z$P.c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawroundedbox}
+% Draws a rectangular box with rounded corners (like the \LaTeX{} |\oval|).
+% The box is |l| by |h| and located by the bottom left corner. The
+% corners are rounded with a radius of |r|. If the radius is too large for
+% the box it is reduced so that at least two opposite sides are semi-circular.
+% The |str| is put at the center (|z$c|) of the box.
+% \begin{macrocode}
+def drawroundedbox(suffix $)(expr l, h, r)(text str) =
+ rectpoints($, l, h);
+ begingroup
+ save rad;
+ numeric rad; rad := r;
+ if rad > l/2:
+ rad := l/2;
+ fi
+ if rad > h/2:
+ rad := h/2;
+ fi
+ draw (x$br-rad, y$br){right}..{up}(x$br, y$br+rad)--
+ (x$tr, y$tr-rad){up}..{left}(x$tr-rad, y$tr)--
+ (x$tl+rad, y$tl){left}..{down}(x$tl, y$tl-rad)--
+ (x$bl, y$bl+rad){down}..{right}(x$bl+rad, y$bl)--cycle;
+ endgroup;
+ z$c = 1/2[z$bl,z$tr];
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawovalbox}
+% \changes{v1.1}{1999/10/30}{Added drawovalbox routine}
+% Draws an elliptical box with horizontal diameter |l| and vertical diameter
+% |h|. The box is located by the center point.
+% \begin{macrocode}
+def drawovalbox(suffix $)(expr l, h)(text str) =
+ ellipsepoints($, l, h);
+ z$c = 1/2[z$ml,z$mr];
+ begingroup
+ save p;
+ path p;
+ p = fullcircle scaled h xscaled (l/h) shifted z$c;
+ draw p;
+ endgroup;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdashellipse}
+% \changes{v1.2}{1999/11/15}{Added drawdashellipse routine}
+% Draws a dashed elliptical box with horizontal diameter |l| and vertical diameter
+% |h|. The ellipse is located by the center point.
+% \begin{macrocode}
+def drawdashellipse(suffix $)(expr l, h) =
+ ellipsepoints($, l, h);
+ z$c = 1/2[z$ml,z$mr];
+ begingroup
+ save p;
+ path p;
+ p = fullcircle scaled h xscaled (l/h) shifted z$c;
+ draw p dashes;
+ endgroup
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawdrum}
+% \changes{v1.3}{2000/05/22}{Added drawdrum routine}
+% Draws a drum box with length |l| and height |h|. The top and bottom
+% ellipse minor/major diamter ratio id |drumlid|. The text is put at the
+% (curved) center of the drum.
+% \begin{macrocode}
+def drawdrum(suffix $)(expr l, h)(text str) =
+ save vdia; numeric vdia;
+ vdia := drumlid*l; % ellipse vertical diameter
+ save pf, ph; path pf, ph; % full & half ellipse paths
+
+ % points on the basic rectangle
+ z$bl = z$;
+ z$tr = (x$+l, y$+h);
+ z$br = (x$tr, y$);
+ z$tl = (x$, y$tr);
+ z$ml = 1/2[z$bl,z$tl];
+ z$mr = 1/2[z$br,z$tr];
+ z$tc = 1/2[z$tl,z$tr]; % center of top rectangle line
+ z$bc = 1/2[z$bl,z$br];
+ % draw box sides
+ draw z$tl--z$bl; draw z$tr--z$br;
+
+ % points on top ellipse
+ z$T''' = z$tc; % ellipse center
+ ellipsepoints($T''', l, vdia);
+ z$tm = z$T'''.tm;
+ z$tml = z$T'''.tl;
+ z$tmr = z$T'''.tr;
+
+ % points on bottom ellipse
+ z$B''' = z$bc;
+ ellipsepoints($B''', l, vdia);
+ z$bm = z$B'''.bm;
+ z$bml = z$B'''.bl;
+ z$bmr = z$B'''.br;
+
+ % box center point
+ z$c = 1/2[z$T'''.bm, z$B'''.bm];
+
+ % draw top ellipse
+ pf = fullcircle scaled vdia xscaled (l/vdia) shifted z$T''';
+ draw pf;
+ % draw bottom half ellipse
+ ph = (halfcircle rotated 180) scaled vdia xscaled (l/vdia) shifted z$B''';
+ draw ph;
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+% \begin{routine}{drawoutputbox}
+% Draws an output box. The box is |l| by |h| and the |str|
+% is put at the center. The bottom of the box is a wavy line.
+%
+% This code was supplied by Guy Worthington (see \texttt{comp.text.tex}
+% newsgroup thread \textit{Trial, ignore}, January 2004, and in
+% particuar Guy's message of 2004/01/27).
+% \changes{v1.6}{2004/02/29}{Added drawoutputbox}
+% \begin{macrocode}
+def drawoutputbox(suffix $)(expr l, h)(text str) =
+ rectpoints($, l, h);
+ begingroup
+ save c;
+ pair c[];
+ c1 = (x$br, y$br+1/8h); % right side of box is shorter
+ c2 = (x$bm, y$bm+1/16h);
+ % draw the tear
+ draw z$bl..c2{dir 45}..c1{dir -15}--z$tr--z$tl--cycle;
+ endgroup;
+ z$c = (x$bm, 1/2(y$bm+y$tm));
+ label(str, z$c);
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+% \begin{routine}{drawstickman}
+% Draws a full frontal genderless stick figure, inside a rectangle
+% |l| by |h|.
+% \changes{v1.6}{2004/02/29}{Added drawstickman}
+% \begin{macrocode}
+\def drawstickman(suffix $)(expr l, h) =
+ rectpoints($,l,h);
+ begingroup
+ save c;
+ pair c[];
+ c1 = 8/24[z$bm,z$tm];
+ c2 = 15/24[z$bm,z$tm];
+ c3 = 18/24[z$bm,z$tm];
+ c4 = 1/2[c3,z$tm];
+ c6 = (x$bl, ypart(c2));
+ c7 = (x$br, ypart(c2));
+ draw z$bl--c1--z$br; % legs
+ draw c1--c3; % body
+ draw c6--c7; % arms
+ draw c3{right}..z$tm{left}..cycle; % head
+ endgroup;
+enddef;
+
+% \end{macrocode}
+% \end{routine}
+%
+%
+%
+%
+% The end of the package
+%
+% \begin{macrocode}
+%</up>
+% \end{macrocode}
+%
+%
+% \bibliographystyle{alpha}
+% \begin{thebibliography}{RBP+91}
+%
+% \bibitem[EN89]{ELMASRI89}
+% R.~Elmasri and S.~B.~Navathe.
+% \newblock \emph{Fundamentals of Database Systems}.
+% \newblock Benjamin Cummings Publishing Co. Inc., 1989.
+%
+% \bibitem[GMS94]{GOOSSENS94}
+% Michel Goossens, Frank Mittelbach, and Alexander Samarin.
+% \newblock \emph{The LaTeX Companion}.
+% \newblock Addison-Wesley Publishing Company, 1994.
+%
+% \bibitem[GRM97]{GOOSSENS97}
+% Michel Goossens, Sebastian Rahtz, and Frank Mittelbach.
+% \newblock \emph{The LaTeX Graphics Companion}.
+% \newblock Addison-Wesley Publishing Company, 1997.
+%
+% \bibitem[Hob92]{MPOST}
+% John D.~Hobby.
+% \newblock \emph{A user's manual for MetaPost}.
+% \newblock Computing Science Technical Report no. 162,
+% AT\&T Bell Laboratories, Murray Hill, NJ, April 1992.
+% (Available from CTAN with the MetaPost distribution
+% in \texttt{.../graphics/metapost}).
+%
+% \bibitem[Hoe98]{HOENIG98}
+% Alan Hoenig.
+% \newblock \emph{TeX Unbound}.
+% \newblock Oxford University Press, 1998.
+%
+% \bibitem[IDE85]{IDEF1X}
+% AFWAL/MLTC, Wright-Patterson AFB, OH.
+% \newblock \emph{Integrated Informatiuon Support Systems (IISS), Vol.~V:
+% Common Data Model Subsystem, Part 4: Information Modeling Manual
+% --- IDEF1X}.
+% \newblock Report Number: AFWAL--TR--86--4006, Volume~V, 1985.
+%
+% \bibitem[ISO87]{TR9007}
+% ISO TR9007.
+% \newblock \emph{Information processing systems ---
+% Concepts and terminology for the conceptual schema and
+% the information base}, 1987.
+%
+% \bibitem[ISO94]{STEP11}
+% ISO 10303-11:1994.
+% \newblock \emph{Industrial automation systems and integration ---
+% Product data representation and exchange ---
+% Part~11: Description methods: The EXPRESS language reference manual},
+% 1994.
+%
+% \bibitem[Knu86]{MFONT}
+% Donald E~Knuth.
+% \newblock \emph{The METAFONTbook}.
+% \newblock Addison-Wesley Publishing Company, 1986.
+%
+% \bibitem[Lam94]{LATEX}
+% Leslie Lamport.
+% \newblock \emph{\LaTeX: A Document Preperation System}.
+% \newblock Second edition. Addison-Wesley Publishing Company, 1994.
+%
+% \bibitem[NH89]{NIJSSEN89}
+% G.~M.~Nijssen and T.~A.~Halpin.
+% \newblock \emph{Conceptual Schema and Relational Database Design}.
+% \newblock Prentice Hall, 1989.
+%
+% \bibitem[Rec97]{RECKDAHL97}
+% Keith Reckdahl.
+% \newblock \emph{Using EPS Graphics in LaTeX2e Documents}.
+% \newblock February 1997.
+% (Available from CTAN as \texttt{../info/epslatex.ps}).
+%
+%
+% \bibitem[RBP+91]{RUMBAUGH91}
+% J.~Rumbaugh, M.~Blaha, W.~Premerlani, F.~Eddy and W.~Lorensen.
+% \newblock \emph{Object-Oriented Modeling and Design }
+% \newblock Prentice Hall, 1991.
+%
+% \bibitem[SW94]{EBOOK}
+% Douglas A.~Schenck and Peter R.~Wilson.
+% \newblock \emph{Information Modeling the EXPRESS Way}.
+% \newblock Oxford University Press, 1994.
+% (ISBN 0-19-508714-3)
+%
+% \bibitem[SM88]{SHLAER88}
+% S.~Shlaer and S.~J.~Mellor.
+% \newblock \emph{Object-Oriented System Analysis}.
+% \newblock Yourdon Press, 1988.
+%
+% \bibitem[Wil99]{METAFP}
+% Peter Wilson.
+% \newblock \emph{Some Experiences in Running METAFONT and MetaPost}.
+% \newblock November, 1999.
+% (Available from CTAN as \texttt{../info/metafp.ps}).
+%
+% \end{thebibliography}
+%
+% \textbf{Note:} See \texttt{http://www.tug.org} for information on accessing
+% CTAN --- the Comprehensive \TeX{} Archive Network.
+%
+%
+% \Finale
+% \PrintIndex
+%
+\endinput
+
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+
+
diff --git a/graphics/metapost/contrib/macros/expressg/expressg.ins b/graphics/metapost/contrib/macros/expressg/expressg.ins
new file mode 100644
index 0000000000..7d467b833e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/expressg.ins
@@ -0,0 +1,114 @@
+%% expressg.ins
+%% Author: Peter Wilson (CUA) now at peter.r.wilson@boeing.com until June 2004
+%% (or: pandgwilson at earthlink dot net)
+%% Copyright 1996, 2003, 2004 Peter R. Wilson
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any
+%% later version.
+%% The latest version of the license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2003/06/01 or later.
+%%
+%% This work has the LPPL maintenance status "author-maintained".
+%%
+%% This work consists of the files listed in the README file.
+%%
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this work when run through
+%% LaTeX.
+%%
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{expressg.ins}
+\input docstrip.tex
+\preamble
+
+ Author: Peter Wilson (CUA) now at peter.r.wilson@boeing.com until June 2004
+ (or pandgwilson@earthlink.net)
+ Copyright 1996, 2003 Peter R. Wilson
+
+ v1.0 1996/05/09 (first release)
+ v1.2 1999/11/15
+ v1.3 2000/05/22
+ v1.4 2000/07/10
+ v1.5 2003/07/31
+ v1.6 2004/02/29
+ v1.61 2004/03/17
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3 of this license or (at your option) any
+ later version.
+ The latest version of the license is in
+ http://www.latex-project.org/lppl.txt
+ and version 1.3 or later is part of all distributions of
+ LaTeX version 2003/06/01 or later.
+
+ This work has the LPPL maintenance status "author-maintained".
+
+ This work consists of the files listed in the README file.
+ This program is provided under the terms of the
+ LaTeX Project Public License distributed from CTAN
+ archives in directory macros/latex/base/lppl.txt.
+
+\endpreamble
+
+\keepsilent
+
+%%% \Msg{*** Generating the driver file ***}
+%%% \generateFile{expressg.drv}{t}{\from{expressg.dtx}{driver}}
+
+\Msg{*** Generating the Metapost files ***}
+
+\usepostamble\empty
+\generateFile{expressg.mp}{t}{\from{expressg.dtx}{up}}
+\generateFile{expeg.mp}{t}{\from{expressg.dtx}{eg}}
+
+
+\Msg{*** Generating the LaTeX files ***}
+\usepostamble\defaultpostamble
+
+\generateFile{expeg.tex}{t}{\from{expressg.dtx}{egt}}
+
+\Msg{*** Generating the script files ***}
+
+\usepreamble\empty
+\usepostamble\empty
+\generateFile{n2mps.sh}{t}{\from{expressg.dtx}{shell}}
+\generateFile{n2mpsprl.prl}{t}{\from{expressg.dtx}{perl}}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into directories searched by Metapost:}
+\Msg{*}
+\Msg{* \space\space expressg.mp}
+\Msg{*}
+\Msg{* To run the examples move the following files into a}
+\Msg{* working directory:}
+\Msg{* \space\space expeg.mp}
+\Msg{* \space\space expeg.tex}
+\Msg{* Then run MetaPost on expeg.mp and (pdf)LaTeX on expeg.tex.}
+\Msg{*}
+\Msg{* To run the scripts, make the following files executable:}
+\Msg{* \space\space n2mps.sh}
+\Msg{* \space\space n2mpsprl.prl}
+\Msg{*}
+\Msg{*}
+\Msg{* To produce the documentation run the files ending with}
+\Msg{* `.dtx' through LaTeX.}
+\Msg{* Process any name.idx file by:}
+\Msg{* \space\space\space\space makeindex -s gind.ist name}
+\Msg{* Process any name.glo file by:}
+\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+
+\endinput
diff --git a/graphics/metapost/contrib/macros/expressg/expressg.pdf b/graphics/metapost/contrib/macros/expressg/expressg.pdf
new file mode 100644
index 0000000000..30a2c2a991
--- /dev/null
+++ b/graphics/metapost/contrib/macros/expressg/expressg.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/exteps/LICENSE b/graphics/metapost/contrib/macros/exteps/LICENSE
new file mode 100644
index 0000000000..6d45519c8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/graphics/metapost/contrib/macros/exteps/README b/graphics/metapost/contrib/macros/exteps/README
new file mode 100644
index 0000000000..2710a87f20
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/README
@@ -0,0 +1,5 @@
+exteps is a module for including external EPS figures into MetaPost
+figures. It is written entirely in MetaPost, and therefore does not
+require any post processing of the MetaPost output.
+
+Palle Jorgensen
diff --git a/graphics/metapost/contrib/macros/exteps/delfin b/graphics/metapost/contrib/macros/exteps/delfin
new file mode 100644
index 0000000000..e3f7c2b692
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/delfin
@@ -0,0 +1,108 @@
+#! /usr/bin/perl -w
+#
+# Program for inserting EPS files into MetaPost output files. Requires
+# the extpeps module for MetaPost -- and it is probably not even
+# necessary to run this program
+#
+# Copyright (C) 2005 Palle Jorgensen <hamselv@pallej.dk>
+# http://pallej.dk/exteps/
+# http://pallej.dk/
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# Bugs and comments can be reported to Palle Jorgensen,
+# <hamselv@pallej.dk>.
+#
+# This is version 0.12 Mon Dec 26 2005
+
+use strict;
+our($opt_h,$opt_q,$opt_v,$opt_V,$opt_i);
+
+use Getopt::Std;
+getopts('-helpvqVi');
+
+use Env qw(HOME);
+
+my $progversion = 0.12;
+my $progname = "delfin";
+my $prognamelong = "Delfin, the Exteps Large File INserter";
+if ($opt_h) { version(); help(); exit; }
+if ($opt_v) { version(); exit; }
+if ($opt_V) { versionbrief(); exit; }
+
+unless ( $opt_q ) {
+ print "This is $progname version $progversion\n";
+ print "$prognamelong\n";
+}
+
+foreach ( @ARGV ) {
+ my $mpsfile = $_;
+ my $elffound = 0;
+ open (MPSIN, "$mpsfile") or die "Cannot open file $mpsfile";
+ my @OUT;
+ foreach ( <MPSIN> ) {
+ if ($_ =~ /^%% MetaPost exteps large file->/) {
+ $elffound = 1;
+ my $epsfile = (split(/->|\n/,$_))[1];
+ unless ( $opt_q ) {
+ print "Inserting $epsfile into $mpsfile\n";
+ }
+ open(EPS, "$epsfile") or die "cannot open file $epsfile";
+ push (@OUT, <EPS>);
+ } else {
+ push (@OUT, $_);
+ }
+ }
+ close MPSIN;
+ if ( $elffound ) {
+ open (MPSOUT, ">$_") or die "Cannot write to file $_";
+ print MPSOUT @OUT;
+ close MPSOUT;
+ }
+ else {
+ unless ( $opt_q ) {
+ print "No file to insert into $mpsfile\n"
+ }
+ }
+}
+
+sub help {
+ print << "EOF";
+Usage:
+$progname [options] file.n [file.m [file.l ... ]]
+Options:
+ -h\tPrint this message end exit
+ -q\tBe quiet
+ -i\tIgnore configuration file
+ -v\tDisplay version and license and exit
+ -V\tDisplay version number and exit
+See exteps.pdf for further documentation
+(texdoc exteps on most unix systems)
+EOF
+}
+
+sub version {
+ print << "EOF"
+This is $progname version $progversion
+$prognamelong
+Copyright 2005 by Palle Jorgensen
+The license of $progname is GNU General Public License (GPL)
+EOF
+}
+
+sub versionbrief {
+ print "$progversion\n";
+}
diff --git a/graphics/metapost/contrib/macros/exteps/exteps.mp b/graphics/metapost/contrib/macros/exteps/exteps.mp
new file mode 100644
index 0000000000..fafd0abd3f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/exteps.mp
@@ -0,0 +1,235 @@
+% Copyright 2005, 2006 by Palle Jorgensen
+%
+% This file is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+% MA 02111-1307, USA.
+%
+% This is version 0.41 Tue Sep 26 2006 Dec
+%
+% The module is documentet in exteps.pdf
+
+picture epspicture;
+string extra_begineps; extra_begineps = "";
+string extra_endeps; extra_endeps = "";
+boolean extepsverbose; extepsverbose = true;
+
+%% String handling tool
+string string_split[];
+def splitstring expr S =
+ begingroup
+ save __splitctr; numeric __splitctr; __splitctr = 0;
+ save __prevchar; string __prevchar, __currentchar; __prevchar = " ";
+ for i = 0 upto infinity:
+ __currentchar := substring(i, i+1) of S;
+ if (__currentchar = " ") and (__prevchar = " "):
+ relax;
+ elseif (__currentchar <> " ") and (__prevchar = " "):
+ string_split[__splitctr] := __currentchar;
+ elseif (__currentchar <> " ") and (__prevchar <> " "):
+ string_split[__splitctr] := string_split[__splitctr] & __currentchar;
+ elseif (__currentchar = " ") and (__prevchar <> " "):
+ __splitctr := __splitctr+1;
+ fi
+ __prevchar := __currentchar;
+ endfor
+ endgroup;
+enddef;
+%% End string handling tool
+
+def begineps text F =
+ begingroup;
+ save file; string file; file = F;
+ save angle; numeric angle; angle = 0;
+ save clipping; boolean clipping; clipping = false;
+ save scale; pair scale; scale = (1,1);
+ save base; pair base; base = origin;
+ save __bbxfound; boolean __bbxfound; __bbxfound = false;
+ save grid; boolean grid; grid = false;
+ save gridstep; numeric gridstep; gridstep = 10;
+ save __base; pair __base;
+ save __eps__currentline; string __eps__currentline;
+ save __bbxline; string __bbxline;
+ save llx, lly, urx, ury; numeric llx, lly, urx, ury;
+ save pct; numeric pct;
+ save width; numeric width;
+ save height; numeric height;
+ save clippath; path clippath;
+ save largefile; boolean largefile; largefile = false;
+ save gridllx; numeric gridllx;
+ save gridlly; numeric gridlly;
+ save gridurx; numeric gridurx;
+ save gridury; numeric gridury;
+%% Finding the bounding box
+ forever:
+ __eps__currentline := readfrom F;
+ if substring(0,14) of __eps__currentline = "%%BoundingBox:":
+ exitif __eps__currentline = EOF; % PATCH D. Roegel 23-sep-2006
+ __bbxline := substring(14, infinity) of __eps__currentline;
+ __bbxfound := true;
+ splitstring __bbxline;
+ llx = scantokens string_split[0];
+ lly = scantokens string_split[1];
+ urx = scantokens string_split[2];
+ ury = scantokens string_split[3];
+ fi
+ exitif __bbxfound;
+ endfor
+ if not __bbxfound:
+ message "Warning: No bounding box found.";
+ message " Setting bounding box to 0 0 1 1";
+ llx = lly = 0;
+ urx = ury = 1;
+ fi
+ closefrom F;
+ scantokens extra_begineps;
+ __base = -(llx,lly);
+ pct = (urx - llx)/100;
+%% To ensure the right bounding box of the output file
+%% a picture with the same size as the eps figure is added.
+ epspicture := nullpicture;
+ clippath = (0,0)--(0,ury-lly)--(urx-llx,ury-lly)--(urx-llx,0)--cycle;
+ setbounds epspicture to clippath;
+enddef;
+
+def endeps =
+%% Calculating scale if width and/or height is known
+ if (known width) and (known height):
+ scale := (width/(urx - llx),height/(ury - lly));
+ elseif known width:
+ scale := (width/(urx - llx),width/(urx - llx));
+ elseif known height:
+ scale := (height/(ury - lly),height/(ury - lly));
+ fi
+%% The graphics inclusion commands
+ special "gsave";
+ if base <> origin:
+ special decimal.xpart.base & " " & decimal.ypart.base & " translate";
+ fi
+ if angle <> 0:
+ special decimal angle & " rotate";
+ fi
+ if __base <> origin:
+ special decimal.xpart.__base & " " & decimal.ypart.__base & " translate";
+ fi
+ if scale <> (1,1):
+ epspicture := epspicture scaled xpart.scale
+ if xpart.scale <> ypart.scale:
+ yscaled (ypart.scale/xpart.scale)
+ fi;
+ special decimal xpart.scale & " " & decimal ypart.scale & " scale";
+ fi
+ if angle <> 0:
+ epspicture := epspicture rotatedaround(origin)(angle);
+ fi
+%% Drawing the grid !! After the scaling :-)
+ if unknown gridllx:
+ gridllx = 0;
+ fi
+ if unknown gridlly:
+ gridlly = 0;
+ fi
+ if unknown gridurx:
+ gridurx = (urx - llx)/pct;
+ fi
+ if unknown gridury:
+ gridury = (ury - lly)/pct;
+ fi
+ if grid:
+ save __gridpicture; picture __gridpicture; __gridpicture := nullpicture;
+ for i = gridllx*pct step gridstep*pct until (epsilon + gridurx*pct):
+ addto __gridpicture doublepath (i*xpart.scale,gridlly*pct*ypart.scale)--(i*xpart.scale,gridury*pct*ypart.scale) withpen currentpen;
+ addto __gridpicture also thelabel.bot(((decimal.(i/pct) & "%") infont defaultfont) rotated -90, (i*xpart.scale,gridlly*pct*ypart.scale));
+ endfor
+ for i = gridlly*pct step gridstep*pct until (epsilon + gridury*pct):
+ addto __gridpicture doublepath (gridllx*pct*xpart.scale,i*ypart.scale)--(gridurx*pct*xpart.scale,i*ypart.scale) withpen currentpen;
+ addto __gridpicture also thelabel.lft(((decimal.(i/pct) & "%") infont defaultfont), (gridllx*pct*xpart.scale,i*ypart.scale));
+ endfor
+ if angle <> 0:
+ __gridpicture := __gridpicture rotatedaround(origin)(angle);
+ fi
+ addto epspicture also __gridpicture;
+ fi
+ if clipping:
+ save __clippath; path __clippath;
+ __clippath=clippath shifted (llx,lly);
+ special "newpath " & decimal.xpart.point 0 of __clippath
+ & " " & decimal.ypart.point 0 of __clippath & " moveto";
+ for i = 0 upto length.__clippath-1:
+ special decimal.xpart.postcontrol i of __clippath & " " &
+ decimal.ypart.postcontrol i of __clippath & " " &
+ decimal.xpart.precontrol (i+1) of __clippath & " " &
+ decimal.ypart.precontrol (i+1) of __clippath & " " &
+ decimal.xpart.point (i+1) of __clippath & " " &
+ decimal.ypart.point (i+1) of __clippath & " curveto";
+ endfor;
+ special "closepath clip";
+ fi
+ special "save";
+ special "userdict begin";
+ special "/showpage {} def";
+ special "%%BeginDocument: " & file;
+ if largefile:
+ special "%% MetaPost exteps large file->" & file;
+ if extepsverbose:
+ message "exteps notification: File " & file & " not inserted into " & jobname & "." & decimal.charcode;
+ message " Run 'delfin " & jobname & "." & decimal.charcode & "' to insert " & file;
+ message " This is caused by setting 'largefile:=true'";
+ message "";
+ fi
+ else:
+ if extepsverbose:
+ message "Inserting " & file & " into " & jobname & "." & decimal.charcode;
+ fi
+ forever:
+ __eps__currentline := readfrom file;
+ exitunless __eps__currentline <> EOF;
+ special __eps__currentline;
+ endfor
+ fi
+ special "%%EndDocument: " & file;
+ scantokens extra_endeps;
+ special "end restore";
+ special "grestore";
+ closefrom file;
+ if base <> (0,0):
+ epspicture := epspicture shifted base;
+ fi
+ addto currentpicture also epspicture;
+ endgroup;
+enddef;
+
+%% Special drawing commands
+def epsfill expr c = addto epspicture contour c _op_ enddef;
+
+def epsdraw expr p =
+ addto epspicture
+ if picture p:
+ also p
+ else:
+ doublepath p withpen currentpen
+ fi
+ _op_
+enddef;
+
+def epsfilldraw expr c =
+ addto epspicture contour c withpen currentpen
+ _op_ enddef;
+
+def epsdrawdot expr z =
+ addto epspicture contour makepath currentpen shifted z
+ _op_ enddef;
+
+def epslabel = epsdraw thelabel enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/exteps/exteps.pdf b/graphics/metapost/contrib/macros/exteps/exteps.pdf
new file mode 100644
index 0000000000..007b5864de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/exteps.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/exteps/exteps.tex b/graphics/metapost/contrib/macros/exteps/exteps.tex
new file mode 100644
index 0000000000..a2314a15e2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/exteps/exteps.tex
@@ -0,0 +1,410 @@
+\documentclass[a4paper,11pt,british,DIVcalc]{scrartcl}
+\usepackage[T1]{fontenc,url}
+\usepackage[latin1]{inputenc}
+\usepackage{soul,babel,mflogo,xspace,tabularx,fancyref,booktabs,textcomp,ifpdf}
+\usepackage[dvips]{graphicx}
+\usepackage[final]{listings}
+\usepackage[sc]{mathpazo}
+%\usepackage{luximono}
+
+
+\newcommand{\exteps}{\texttt{\upshape exteps}\xspace}
+\newcommand{\delfin}{\texttt{\upshape delfin}\xspace}
+%\let\delfin\relax
+
+\usepackage{hyperref}
+\addto\itemize{\def\labelitemi{-\kern-.15em-}}
+\hypersetup{ps2pdf,a4paper,pdfauthor=Palle Jørgensen, pdftitle={exteps
+ documentation}, pdfsubject={Inclusion of external EPS graphics in
+ MetaPost figures},pdfkeywords={MetaPost,EPS,external,exteps}}
+\author{Palle Jørgensen}
+
+\title{\so{Using external EPS graphics in} \MP\\\LARGE \so{The}
+ \exteps \so{module}\\\so{Version} \oldstylenums{0.41}}
+
+\lstset{basicstyle=\small,breaklines=true,columns=fullflexible}
+\renewcommand{\thesection}{\oldstylenums{\arabic{section}}}
+\renewcommand{\thesubsection}{\oldstylenums{\arabic{subsection}}}
+\renewcommand{\thefigure}{\oldstylenums{\arabic{figure}}}
+\renewcommand{\thepage}{\oldstylenums{\arabic{page}}}
+
+\makeatletter
+\let\vref@space\space
+\let\old@section\section
+\def\section{%
+ \@ifstar{%
+ \old@section*%
+ }{%
+ \so@section}%
+}
+\def\so@@@section#1{\old@section[#1]{\so{#1}}}
+\def\so@@section[#1]#2{\old@section[#1]{\so{#2}}}
+\def\so@section{%
+ \@ifnextchar[%]
+ {%
+ \so@@section
+ }{%
+ \so@@@section
+ }%
+}
+
+\let\old@subsection\subsection
+\def\subsection{%
+ \@ifstar{%
+ \old@subsection*%
+ }{%
+ \so@subsection}%
+}
+\def\so@@subsection[#1]#2{\old@subsection[#1]{\so{#2}}}
+\def\so@@@subsection#1{\old@subsection[#1]{\so{#1}}}
+\def\so@subsection{%
+ \@ifnextchar[%]
+ {%
+ \so@@subsection
+ }{%
+ \so@@@subsection
+ }%
+}
+\def\trr{\rightskip\@flushglue}
+
+\makeatother
+\renewcommand{\textfraction}{0}
+\addtokomafont{sectioning}{\normalfont\scshape}
+\lstset{language=metapost}
+
+\begin{document}
+\def\contentsname{\so{Contents}}
+\maketitle
+\tableofcontents
+
+\clearpage
+\section{Introduction}
+\label{sec:introduction}
+
+This document describes the use of the \exteps module for inclusion of
+external EPS figures in \MP\ figures. Unlike the previous attempt
+(epsincl) it make no use external programs\footnote{This is only
+ partly true, as \MP\ is unable to handle large files; a workaround
+ is described in appendix~\vref{sec:large-eps-files}}; it is
+entirely written in \MP.
+
+The EPS graphics is included using the \emph{special} command in \MP.
+\clearpage
+
+\section{Using \exteps}
+\label{sec:using-exteps}
+
+To illustrate the use of the \exteps module an example is given below.
+Between the \texttt{begineps} and \texttt{endeps} commands both
+settings can be set, as well as special drawing commands can be added.
+The output of the example and the original picture can be seen in
+\fref{fig:orig-and-mod}.
+
+\lstinputlisting[lastline=15]{example.mp}
+\begin{figure}[!h]
+ \includegraphics[bb = 0 -50 150 200,clip,scale=.71]{pallej}\hfill
+ \includegraphics[bb= -25 -25 180 225,scale=.71,clip=true]{example.1}\hfill
+ \includegraphics[bb = 10 -25 175 225,scale=.71,clip=false]{example.5}
+ \caption{The original (left) and the with \exteps modified picture
+ (middle). To the right there is one without the grid and the dot at the
+ origin.}
+ \label{fig:orig-and-mod}
+\end{figure}
+
+\clearpage
+\subsection{Settings}
+\label{sec:settings}
+
+The parameters of the settings and their defaults can be seen the
+table below\bigskip.
+
+\noindent\begin{tabularx}{\linewidth}{llp{2cm}<\trr X}
+ \toprule
+ Parameter & Type & Default & Description\\
+ \midrule
+ angle & numeric & 0 & The counterclockwise rotation of the EPS figure.\\
+ clipping\footnotemark & boolean & false & If true, the EPS figure is
+ clipped to its bounding box.\\
+ clippath & path & Bounding box of the EPS file & Path to which the
+ EPS picture is clipped, if the \emph{clipping} switch is \emph{true.}\\
+ base & pair & (0,0) & The offset of the lower left corner of the EPS
+ picture.\\
+ scale & pair & (1,1) & The scaling of the picture.\\
+ width & numeric & No default & Specify the width of the picture;
+ overrules the scale setting.\\
+ height & numeric & No default & Specify the height of the picture;
+ overrules the scale setting.\\
+ grid & boolean & false & If true a grid is draw on top of the
+ picture; mostly (only?) meant to help when drawing on top of the EPS
+ figure.\\
+ gridstep & numeric & 10 & The distance in percent between the lines
+ of the grid.\\
+ gridllx & numeric & 0 & The x-part of the lower left corner of the grid; in pct \\
+ gridlly & numeric & 0 & The y-part\\
+ gridurx & numeric & \emph{full width} & The x-part of the upper rightt corner of the grid\\
+ gridury & numeric & \emph{full height} & The y-part\\
+ \bottomrule
+\end{tabularx}
+\footnotetext{In version \oldstylenums{0.1} named \emph{clip}}
+
+\subsection{Special values}
+\label{sec:special-values}
+
+\texttt{begineps} saves the original bounding box of the EPS picture
+in the values \texttt{llx}, \texttt{lly}, \texttt{urx} and
+\texttt{urx}. These values can be used in the settings, and for
+drawing commands. Furthermore a numeric value \texttt{pct} is set.
+This is a length that is one percent of the width of the picture.
+
+If for instance one wants the picture to be placed at the same place on
+the page as the original picture it is simply typing
+\begin{lstlisting}
+ base:=(llx,lly);
+\end{lstlisting}
+between \texttt{begineps} and \texttt{endeps}.
+
+\subsection{Drawing commands}
+\label{sec:drawing-commands}
+
+When \texttt{begineps} is called a special picture,
+\texttt{epspicture}, is created. To draw on this picture, and whence
+drawing on the EPS picture the special commands \texttt{epsdraw},
+\texttt{epsfill}, \texttt{epsfilldraw}, \texttt{epsdrawdot} and
+\texttt{epslabel} are defined. They work as the normal drawing
+commands, but now adds to the \texttt{epspicture}.
+
+At \texttt{endeps} the \texttt{epspicture} is scaled, rotated and
+translated in the same way as the included EPS figure.
+
+\subsection{Clipping the EPS picture}
+\label{sec:clipping-eps-picture}
+
+From version \oldstylenums{0.2} it is possible to do advanced clipping of the EPS
+picture.
+
+This is done by specifying the path \emph{clippath} along which the
+EPS picture is to be clipped, and setting \emph{clipping} to
+\emph{true}.
+
+A minor example and the result in \fref{fig:clipped}:
+\lstinputlisting[firstline=37,lastline=44]{example.mp}
+
+\begin{figure}[tb]
+ \includegraphics[scale=.71]{example.3}\hfill
+ \includegraphics[bb = 30 -2 175 225,,scale=.71]{example.2}\hfill
+ \includegraphics[bb = 30 -2 175 225,,scale=.71]{example.4}
+ \caption{The clipped picture to the right, and the original with a
+ grid to the left. The clippath is marked with blue. The picture in
+ the midlle is created by keeping the blue line on top of the
+ clipped picture.}
+ \label{fig:clipped}
+\end{figure}
+
+Please note that this does not clip the \texttt{epspicture}.
+You can do this manually by specifying
+\begin{lstlisting}
+ clip epspicture to clippath;
+\end{lstlisting}
+or
+\begin{lstlisting}
+ setbounds epspicture to clippath;
+\end{lstlisting}
+
+The section about the grid~\vpageref{sec:grid} also provides an
+example of the clipping commands.
+
+\newpage
+\subsection{The grid}
+\label{sec:grid}
+It is possible to finetune the settings og the grid, for instance when
+clipping the picture. The example below shows the impact of setting
+the values of \texttt{gridstep}, \texttt{gridllx}, \texttt{gridlly},
+\texttt{gridurx}, and \texttt{gridury}. The result can be seen in
+\fref{fig:grid}.
+
+\lstinputlisting[firstline=55,lastline=69]{example.mp}
+
+\begin{figure}[tbp]
+ \includegraphics[scale=.71]{example.6}
+ \caption{The picture with the finetuned grid, and some clipping.}
+ \label{fig:grid}
+\end{figure}
+
+\section{Limitations of \exteps}
+\label{sec:limitations}
+\begin{itemize}
+\item \exteps only looks at the first line in the document
+ that says \\\verb|%%BoundingBox:|~\dots
+
+ Thus it will cause trouble if this line does not provide the
+ bounding box; some PostScript drivers may write
+ \verb|%%BoundingBox: (atend)|. This is not supported.
+
+\item As all of the graphics inclusion is done with \MP, it is limited
+ by \MP's memory capacity. More specific on the string pool size.
+
+ Read more about this problem, and about the \emph{delfin} workaround
+ perl script in \appendixname~\vref{sec:large-eps-files}
+
+\item As the module makes it possible to include external EPS pictures
+ it may not be possible to use the output with \textsc{pdf}\TeX.
+
+ A way to get around this is to use the program epstopdf.
+
+ epstopdf is located on CTAN at\\
+ \url{http://tug.ctan.org/tex-archive/support/epstopdf/}.
+
+ Another possible work-around for this is to use the program
+ purifyeps to ``clean up'' the PostScript picture.
+
+ purifyeps is located on CTAN at\\
+ \url{http://tug.ctan.org/tex-archive/support/purifyeps/}.
+
+ Yet another work-around is to use the program pstoedit to generate
+ \MP\ code form EPS files and include this into your \MP\ file.
+
+ See \url{http://www.pstoedit.net/pstoedit/}.
+\end{itemize}
+
+
+\section{Changes}
+\label{sec:changes}
+
+\addtocontents{toc}{\setcounter{tocdepth}{1}}
+\subsection{From version \mbox{\oldstylenums{0.1}} to \mbox{\oldstylenums{0.2}}}
+\label{sec:from-version-0.1-to-0.2}
+
+\begin{itemize}
+\item Adding advanced clipping, see \fref{sec:clipping-eps-picture}.
+\item Renaming the \emph{clip} switch to \emph{clipping}.
+\item Eliminating the \verb|showpage| ``problem'' in version \oldstylenums{0.1}.
+\end{itemize}
+
+\subsection{From version \mbox{\oldstylenums{0.2}} to \mbox{\oldstylenums{0.3}}}
+\label{sec:from-version-0.2-to-0.3}
+
+\begin{itemize}
+\item Improvement of the grid drawing commands. The grid is now drawn
+ \emph{after} the scaling of the picture.
+\item Introducing a workaround for large files. This includes a Perl
+ script.
+\end{itemize}
+
+\section{Comments and Bug Reports}
+\label{sec:comments-bug-reports}
+
+All comments, questions and bug reports, both on the module itself as
+well as this document may be sent to Palle Jørgensen,
+\href{mailto:hamselv@pallej.dk}{hamselv@pallej.dk}.
+
+\section{This document}
+\label{sec:this-document}
+
+\textcopyright\ \the\year\ by Palle Jørgensen.\\ The license of this
+document is GNU General Public License. Source of this document and the
+used example can be found at \url{http://pallej.dk/exteps/}.
+
+\clearpage
+\appendix
+\section{Source code of \exteps}
+\label{sec:source-code-exteps}
+
+\lstinputlisting[firstline=22,extendedchars=true]{exteps.mp}
+
+\clearpage
+\section{Large EPS files}
+\label{sec:large-eps-files}
+
+In case of a too large EPS file, the \exteps module causes an error
+message from \MP, due to the limited memory capacity of \MP.
+
+The error message looks somewhat like this:
+
+\begin{verbatim}
+camel25:~/tmp% mpost et.mp
+This is MetaPost, Version 0.641 (Web2C 7.5.2)
+(/usr/local/TeX/texmf/web2c/cp8bit.tcx)
+(et.mp (/users/pallej/texmf/metapost/exteps.mp)
+Inserting sk.eps into et.1
+! MetaPost capacity exceeded, sorry [pool size=476396].
+<read>
+
+<forever> __eps__currentline:=readfrom.file;
+ exitunless.__eps__currentline<>E...
+
+endeps->...<>EOF;special.__eps__currentline;endfor
+ .fi.special"%%EndDocument:...
+l.14 endeps
+\end{verbatim}
+A workaround for this problem is to set the value \texttt{largefile}
+to \texttt{true}:
+\begin{lstlisting}
+ largefile:=true;
+\end{lstlisting}
+
+\exteps now writes
+\begin{lstlisting}
+ %% MetaPost exteps large file->file.eps
+\end{lstlisting}
+into the \MP\ output file. Afterwards one must run the Perl script
+\delfin onto the \MP\ output file.
+
+First run \MP:
+\begin{verbatim}
+This is MetaPost, Version 0.641 (Web2C 7.5.2)
+(/usr/local/TeX/texmf/web2c/cp8bit.tcx)
+(et.mp (/users/pallej/texmf/metapost/exteps.mp)
+exteps notification: File sk.eps not inserted into et.1
+ Run 'delfin et.1' to insert sk.eps
+ This is caused by setting 'largefile:=true'
+[1] )
+1 output file written: et.1
+Transcript written on et.log.
+camel25:~/tmp%
+\end{verbatim}
+
+and then \delfin
+\begin{verbatim}
+camel25:~/tmp% delfin et.1
+This is delfin version 0.1
+Delfin, the Exteps Large File INserter
+Inserting sk.eps into et.1
+camel25:~/tmp%
+\end{verbatim}
+
+It is possible to turn off the \exteps notification; just set the
+(global) value \texttt{extepsverbose} to false
+\begin{lstlisting}
+ extepsverbose = false;
+\end{lstlisting}
+
+If you are unable to use the \delfin program, it is still possible
+to do the finishing. Just open the \MP\ output file in your favourite
+editor, and replace the line mentioned above with the entire EPS file.
+
+\subsection{Using \delfin}
+\label{sec:delfin-program}
+Usage of the \delfin program:
+\begin{verbatim}
+delfin [options] file.n [file.m [file.l ... ]]
+Options:
+ -h Print this message end exit
+ -q Be quiet
+ -v Display version and license and exit
+ -V Display version number and exit
+
+\end{verbatim}
+
+\subsection{Source of \delfin}
+\label{sec:source-delfin}
+
+\lstinputlisting[lastline=1,extendedchars=true,language=perl]{delfin}
+[license stuff etc.]%\vskip-\baselineskip
+\lstinputlisting[firstline=31,extendedchars=true,language=perl]{delfin}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/metapost/contrib/macros/featpost/MPexamples.html b/graphics/metapost/contrib/macros/featpost/MPexamples.html
new file mode 100644
index 0000000000..3a76863a7a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/MPexamples.html
@@ -0,0 +1,1097 @@
+<HTML><HEAD><TITLE>MetaPost Examples</TITLE> <META NAME="KEYWORDS" content="MetaPost, Examples, examples, code"> </HEAD><BODY TEXT="#000000" LINK="#0000FF" VLINK="#AA00AA" ALINK="#AA0000" BGCOLOR="#b0c4de"> <H1><CODE>MetaPost</CODE> Examples</H1>
+<P align="center"><a href="./example/38.mp"> 38.mp</a>
+<img align="middle" src="./png/38.1.png" alt=" 38.1 ">
+</P>
+<P align="center"><a href="./example/A131.mp"> A131.mp</a>
+<img align="middle" src="./png/A131.1.png" alt=" A131.1 ">
+</P>
+<P align="center"><a href="./example/acmaglev.mp"> acmaglev.mp</a>
+<img align="middle" src="./png/acmaglev.1.png" alt=" acmaglev.1 ">
+</P>
+<P align="center"><a href="./example/acoplanv.mp"> acoplanv.mp</a>
+<img align="middle" src="./png/acoplanv.1.png" alt=" acoplanv.1 ">
+</P>
+<P align="center"><a href="./example/ahoraesglobal.mp"> ahoraesglobal.mp</a>
+<img align="middle" src="./png/ahoraesglobal.1.png" alt=" ahoraesglobal.1 ">
+</P>
+<P align="center"><a href="./example/aledlogo.mp"> aledlogo.mp</a>
+<img align="middle" src="./png/aledlogo.1.png" alt=" aledlogo.1 ">
+<img align="middle" src="./png/aledlogo.2.png" alt=" aledlogo.2 ">
+</P>
+<P align="center"><a href="./example/allgreatideas.mp"> allgreatideas.mp</a>
+<img align="middle" src="./png/allgreatideas.1.png" alt=" allgreatideas.1 ">
+</P>
+<P align="center"><a href="./example/anglinerigorouscircle.mp"> anglinerigorouscircle.mp</a>
+<img align="middle" src="./png/anglinerigorouscircle.1.png" alt=" anglinerigorouscircle.1 ">
+</P>
+<P align="center"><a href="./example/antimattermeteor.mp"> antimattermeteor.mp</a>
+<img align="middle" src="./png/antimattermeteor.1.png" alt=" antimattermeteor.1 ">
+</P>
+<P align="center"><a href="./example/avalzero.mp"> avalzero.mp</a>
+<img align="middle" src="./png/avalzero.1.png" alt=" avalzero.1 ">
+<img align="middle" src="./png/avalzero.2.png" alt=" avalzero.2 ">
+<img align="middle" src="./png/avalzero.3.png" alt=" avalzero.3 ">
+<img align="middle" src="./png/avalzero.4.png" alt=" avalzero.4 ">
+</P>
+<P align="center"><a href="./example/badshreeyantra.mp"> badshreeyantra.mp</a>
+<img align="middle" src="./png/badshreeyantra.1.png" alt=" badshreeyantra.1 ">
+</P>
+<P align="center"><a href="./example/balllauncher.mp"> balllauncher.mp</a>
+<img align="middle" src="./png/balllauncher.0.png" alt=" balllauncher.0 ">
+<img align="middle" src="./png/balllauncher.9.png" alt=" balllauncher.9 ">
+</P>
+<P align="center"><a href="./example/bananadimmer.mp"> bananadimmer.mp</a>
+<img align="middle" src="./png/bananadimmer.1.png" alt=" bananadimmer.1 ">
+</P>
+<P align="center"><a href="./example/beautiful00.mp"> beautiful00.mp</a>
+<img align="middle" src="./png/beautiful00.1.png" alt=" beautiful00.1 ">
+</P>
+<P align="center"><a href="./example/bichaepolicia.mp"> bichaepolicia.mp</a>
+<img align="middle" src="./png/bichaepolicia.0.png" alt=" bichaepolicia.0 ">
+</P>
+<P align="center"><a href="./example/brownellips.mp"> brownellips.mp</a>
+<img align="middle" src="./png/brownellips.0.png" alt=" brownellips.0 ">
+</P>
+<P align="center"><a href="./example/bstr.mp"> bstr.mp</a>
+<img align="middle" src="./png/bstr.1.png" alt=" bstr.1 ">
+</P>
+<P align="center"><a href="./example/bughunt.mp"> bughunt.mp</a>
+<img align="middle" src="./png/bughunt.1.png" alt=" bughunt.1 ">
+<img align="middle" src="./png/bughunt.2.png" alt=" bughunt.2 ">
+</P>
+<P align="center"><a href="./example/buildcyclebug.mp"> buildcyclebug.mp</a>
+<img align="middle" src="./png/buildcyclebug.1.png" alt=" buildcyclebug.1 ">
+<img align="middle" src="./png/buildcyclebug.2.png" alt=" buildcyclebug.2 ">
+</P>
+<P align="center"><a href="./example/canschemes.mp"> canschemes.mp</a>
+<img align="middle" src="./png/canschemes.1.png" alt=" canschemes.1 ">
+<img align="middle" src="./png/canschemes.2.png" alt=" canschemes.2 ">
+<img align="middle" src="./png/canschemes.3.png" alt=" canschemes.3 ">
+</P>
+<P align="center"><a href="./example/cap29res.mp"> cap29res.mp</a>
+<img align="middle" src="./png/cap29res.1.png" alt=" cap29res.1 ">
+<img align="middle" src="./png/cap29res.2.png" alt=" cap29res.2 ">
+<img align="middle" src="./png/cap29res.3.png" alt=" cap29res.3 ">
+<img align="middle" src="./png/cap29res.4.png" alt=" cap29res.4 ">
+<img align="middle" src="./png/cap29res.5.png" alt=" cap29res.5 ">
+<img align="middle" src="./png/cap29res.6.png" alt=" cap29res.6 ">
+<img align="middle" src="./png/cap29res.7.png" alt=" cap29res.7 ">
+<img align="middle" src="./png/cap29res.8.png" alt=" cap29res.8 ">
+<img align="middle" src="./png/cap29res.9.png" alt=" cap29res.9 ">
+</P>
+<P align="center"><a href="./example/caratk3edit.mp"> caratk3edit.mp</a>
+<img align="middle" src="./png/caratk3edit.1.png" alt=" caratk3edit.1 ">
+</P>
+<P align="center"><a href="./example/cartaxes.mp"> cartaxes.mp</a>
+<img align="middle" src="./png/cartaxes.1.png" alt=" cartaxes.1 ">
+<img align="middle" src="./png/cartaxes.2.png" alt=" cartaxes.2 ">
+</P>
+<P align="center"><a href="./example/casadopessoal.mp"> casadopessoal.mp</a>
+<img align="middle" src="./png/casadopessoal.1.png" alt=" casadopessoal.1 ">
+<img align="middle" src="./png/casadopessoal.2.png" alt=" casadopessoal.2 ">
+<img align="middle" src="./png/casadopessoal.3.png" alt=" casadopessoal.3 ">
+<img align="middle" src="./png/casadopessoal.4.png" alt=" casadopessoal.4 ">
+</P>
+<P align="center"><a href="./example/CAT.mp"> CAT.mp</a>
+<img align="middle" src="./png/CAT.1.png" alt=" CAT.1 ">
+</P>
+<P align="center"><a href="./example/cellevolve.mp"> cellevolve.mp</a>
+<img align="middle" src="./png/cellevolve.0.png" alt=" cellevolve.0 ">
+</P>
+<P align="center"><a href="./example/cinemwork.mp"> cinemwork.mp</a>
+<img align="middle" src="./png/cinemwork.1.png" alt=" cinemwork.1 ">
+<img align="middle" src="./png/cinemwork.2.png" alt=" cinemwork.2 ">
+</P>
+<P align="center"><a href="./example/circlespeedprofile.mp"> circlespeedprofile.mp</a>
+<img align="middle" src="./png/circlespeedprofile.1.png" alt=" circlespeedprofile.1 ">
+</P>
+<P align="center"><a href="./example/closingbox.mp"> closingbox.mp</a>
+<img align="middle" src="./png/closingbox.1.png" alt=" closingbox.1 ">
+</P>
+<P align="center"><a href="./example/cmykropes.mp"> cmykropes.mp</a>
+<img align="middle" src="./png/cmykropes.1.png" alt=" cmykropes.1 ">
+</P>
+<P align="center"><a href="./example/conegetready.mp"> conegetready.mp</a>
+<img align="middle" src="./png/conegetready.1.png" alt=" conegetready.1 ">
+</P>
+<P align="center"><a href="./example/cone.mp"> cone.mp</a>
+<img align="middle" src="./png/cone.1.png" alt=" cone.1 ">
+</P>
+<P align="center"><a href="./example/conicurv.mp"> conicurv.mp</a>
+<img align="middle" src="./png/conicurv.1.png" alt=" conicurv.1 ">
+</P>
+<P align="center"><a href="./example/conoscopy.mp"> conoscopy.mp</a>
+<img align="middle" src="./png/conoscopy.1.png" alt=" conoscopy.1 ">
+<img align="middle" src="./png/conoscopy.2.png" alt=" conoscopy.2 ">
+<img align="middle" src="./png/conoscopy.3.png" alt=" conoscopy.3 ">
+<img align="middle" src="./png/conoscopy.4.png" alt=" conoscopy.4 ">
+<img align="middle" src="./png/conoscopy.5.png" alt=" conoscopy.5 ">
+</P>
+<P align="center"><a href="./example/convergingspirals.mp"> convergingspirals.mp</a>
+<img align="middle" src="./png/convergingspirals.1.png" alt=" convergingspirals.1 ">
+<img align="middle" src="./png/convergingspirals.2.png" alt=" convergingspirals.2 ">
+<img align="middle" src="./png/convergingspirals.3.png" alt=" convergingspirals.3 ">
+<img align="middle" src="./png/convergingspirals.4.png" alt=" convergingspirals.4 ">
+<img align="middle" src="./png/convergingspirals.5.png" alt=" convergingspirals.5 ">
+</P>
+<P align="center"><a href="./example/crossingline.mp"> crossingline.mp</a>
+<img align="middle" src="./png/crossingline.1.png" alt=" crossingline.1 ">
+<img align="middle" src="./png/crossingline.2.png" alt=" crossingline.2 ">
+<img align="middle" src="./png/crossingline.3.png" alt=" crossingline.3 ">
+</P>
+<P align="center"><a href="./example/cruztuga.mp"> cruztuga.mp</a>
+<img align="middle" src="./png/cruztuga.1.png" alt=" cruztuga.1 ">
+</P>
+<P align="center"><a href="./example/cubicfacecentered.mp"> cubicfacecentered.mp</a>
+<img align="middle" src="./png/cubicfacecentered.1.png" alt=" cubicfacecentered.1 ">
+</P>
+<P align="center"><a href="./example/cubicfigures.mp"> cubicfigures.mp</a>
+<img align="middle" src="./png/cubicfigures.1.png" alt=" cubicfigures.1 ">
+<img align="middle" src="./png/cubicfigures.2.png" alt=" cubicfigures.2 ">
+<img align="middle" src="./png/cubicfigures.3.png" alt=" cubicfigures.3 ">
+</P>
+<P align="center"><a href="./example/cubicstructurefcc.mp"> cubicstructurefcc.mp</a>
+<img align="middle" src="./png/cubicstructurefcc.1.png" alt=" cubicstructurefcc.1 ">
+</P>
+<P align="center"><a href="./example/cubicstructures.mp"> cubicstructures.mp</a>
+<img align="middle" src="./png/cubicstructures.1.png" alt=" cubicstructures.1 ">
+<img align="middle" src="./png/cubicstructures.2.png" alt=" cubicstructures.2 ">
+<img align="middle" src="./png/cubicstructures.3.png" alt=" cubicstructures.3 ">
+<img align="middle" src="./png/cubicstructures.4.png" alt=" cubicstructures.4 ">
+<img align="middle" src="./png/cubicstructures.5.png" alt=" cubicstructures.5 ">
+<img align="middle" src="./png/cubicstructures.6.png" alt=" cubicstructures.6 ">
+</P>
+<P align="center"><a href="./example/cylimple.mp"> cylimple.mp</a>
+<img align="middle" src="./png/cylimple.1.png" alt=" cylimple.1 ">
+</P>
+<P align="center"><a href="./example/cylinderborders.mp"> cylinderborders.mp</a>
+<img align="middle" src="./png/cylinderborders.1.png" alt=" cylinderborders.1 ">
+</P>
+<P align="center"><a href="./example/daliasensor.mp"> daliasensor.mp</a>
+<img align="middle" src="./png/daliasensor.1.png" alt=" daliasensor.1 ">
+</P>
+<P align="center"><a href="./example/DebianSwirlsmallEdited.mp"> DebianSwirlsmallEdited.mp</a>
+<img align="middle" src="./png/DebianSwirlsmallEdited.1.png" alt=" DebianSwirlsmallEdited.1 ">
+</P>
+<P align="center"><a href="./example/decorstatement.mp"> decorstatement.mp</a>
+<img align="middle" src="./png/decorstatement.0.png" alt=" decorstatement.0 ">
+</P>
+<P align="center"><a href="./example/defaultcmr.mp"> defaultcmr.mp</a>
+<img align="middle" src="./png/defaultcmr.0.png" alt=" defaultcmr.0 ">
+</P>
+<P align="center"><a href="./example/deperspective.mp"> deperspective.mp</a>
+<img align="middle" src="./png/deperspective.1.png" alt=" deperspective.1 ">
+<img align="middle" src="./png/deperspective.2.png" alt=" deperspective.2 ">
+<img align="middle" src="./png/deperspective.3.png" alt=" deperspective.3 ">
+<img align="middle" src="./png/deperspective.4.png" alt=" deperspective.4 ">
+</P>
+<P align="center"><a href="./example/derivondatriang.mp"> derivondatriang.mp</a>
+<img align="middle" src="./png/derivondatriang.1.png" alt=" derivondatriang.1 ">
+</P>
+<P align="center"><a href="./example/diameters.mp"> diameters.mp</a>
+<img align="middle" src="./png/diameters.1.png" alt=" diameters.1 ">
+</P>
+<P align="center"><a href="./example/directfonts.mp"> directfonts.mp</a>
+<img align="middle" src="./png/directfonts.0.png" alt=" directfonts.0 ">
+</P>
+<P align="center"><a href="./example/doitnow.mp"> doitnow.mp</a>
+<img align="middle" src="./png/doitnow.1.png" alt=" doitnow.1 ">
+</P>
+<P align="center"><a href="./example/downloadicon.mp"> downloadicon.mp</a>
+<img align="middle" src="./png/downloadicon.1.png" alt=" downloadicon.1 ">
+</P>
+<P align="center"><a href="./example/dreamhouse.mp"> dreamhouse.mp</a>
+<img align="middle" src="./png/dreamhouse.1.png" alt=" dreamhouse.1 ">
+<img align="middle" src="./png/dreamhouse.2.png" alt=" dreamhouse.2 ">
+</P>
+<P align="center"><a href="./example/durgayantra.mp"> durgayantra.mp</a>
+<img align="middle" src="./png/durgayantra.1.png" alt=" durgayantra.1 ">
+<img align="middle" src="./png/durgayantra.2.png" alt=" durgayantra.2 ">
+</P>
+<P align="center"><a href="./example/EBcrossed.mp"> EBcrossed.mp</a>
+<img align="middle" src="./png/EBcrossed.1.png" alt=" EBcrossed.1 ">
+</P>
+<P align="center"><a href="./example/eemcsblabla.mp"> eemcsblabla.mp</a>
+<img align="middle" src="./png/eemcsblabla.1.png" alt=" eemcsblabla.1 ">
+</P>
+<P align="center"><a href="./example/electricpotential.mp"> electricpotential.mp</a>
+<img align="middle" src="./png/electricpotential.0.png" alt=" electricpotential.0 ">
+<img align="middle" src="./png/electricpotential.1.png" alt=" electricpotential.1 ">
+<img align="middle" src="./png/electricpotential.2.png" alt=" electricpotential.2 ">
+<img align="middle" src="./png/electricpotential.3.png" alt=" electricpotential.3 ">
+</P>
+<P align="center"><a href="./example/electrospiral.mp"> electrospiral.mp</a>
+<img align="middle" src="./png/electrospiral.1.png" alt=" electrospiral.1 ">
+</P>
+<P align="center"><a href="./example/ellipticextrusionpress.mp"> ellipticextrusionpress.mp</a>
+<img align="middle" src="./png/ellipticextrusionpress.1.png" alt=" ellipticextrusionpress.1 ">
+</P>
+<P align="center"><a href="./example/ellipticprism.mp"> ellipticprism.mp</a>
+<img align="middle" src="./png/ellipticprism.1.png" alt=" ellipticprism.1 ">
+</P>
+<P align="center"><a href="./example/ellipticproperties.mp"> ellipticproperties.mp</a>
+<img align="middle" src="./png/ellipticproperties.1.png" alt=" ellipticproperties.1 ">
+</P>
+<P align="center"><a href="./example/elliptictable.mp"> elliptictable.mp</a>
+<img align="middle" src="./png/elliptictable.1.png" alt=" elliptictable.1 ">
+</P>
+<P align="center"><a href="./example/ellipticthing.mp"> ellipticthing.mp</a>
+<img align="middle" src="./png/ellipticthing.1.png" alt=" ellipticthing.1 ">
+</P>
+<P align="center"><a href="./example/embroncordada.mp"> embroncordada.mp</a>
+<img align="middle" src="./png/embroncordada.1.png" alt=" embroncordada.1 ">
+</P>
+<P align="center"><a href="./example/emptylines.mp"> emptylines.mp</a>
+<img align="middle" src="./png/emptylines.1.png" alt=" emptylines.1 ">
+</P>
+<P align="center"><a href="./example/equilatrianglelines.mp"> equilatrianglelines.mp</a>
+<img align="middle" src="./png/equilatrianglelines.1.png" alt=" equilatrianglelines.1 ">
+</P>
+<P align="center"><a href="./example/equilibriodetorques.mp"> equilibriodetorques.mp</a>
+<img align="middle" src="./png/equilibriodetorques.1.png" alt=" equilibriodetorques.1 ">
+</P>
+<P align="center"><a href="./example/esteveslogo.mp"> esteveslogo.mp</a>
+<img align="middle" src="./png/esteveslogo.1.png" alt=" esteveslogo.1 ">
+</P>
+<P align="center"><a href="./example/experimental2Dsetup.mp"> experimental2Dsetup.mp</a>
+<img align="middle" src="./png/experimental2Dsetup.1.png" alt=" experimental2Dsetup.1 ">
+</P>
+<P align="center"><a href="./example/experimental.mp"> experimental.mp</a>
+<img align="middle" src="./png/experimental.1.png" alt=" experimental.1 ">
+</P>
+<P align="center"><a href="./example/f1aula03.mp"> f1aula03.mp</a>
+<img align="middle" src="./png/f1aula03.1.png" alt=" f1aula03.1 ">
+<img align="middle" src="./png/f1aula03.2.png" alt=" f1aula03.2 ">
+<img align="middle" src="./png/f1aula03.3.png" alt=" f1aula03.3 ">
+<img align="middle" src="./png/f1aula03.4.png" alt=" f1aula03.4 ">
+</P>
+<P align="center"><a href="./example/f1aula05.mp"> f1aula05.mp</a>
+<img align="middle" src="./png/f1aula05.1.png" alt=" f1aula05.1 ">
+<img align="middle" src="./png/f1aula05.2.png" alt=" f1aula05.2 ">
+</P>
+<P align="center"><a href="./example/fakehole.mp"> fakehole.mp</a>
+<img align="middle" src="./png/fakehole.1.png" alt=" fakehole.1 ">
+<img align="middle" src="./png/fakehole.2.png" alt=" fakehole.2 ">
+</P>
+<P align="center"><a href="./example/fallinthewind.mp"> fallinthewind.mp</a>
+<img align="middle" src="./png/fallinthewind.1.png" alt=" fallinthewind.1 ">
+</P>
+<P align="center"><a href="./example/featpostlogo.mp"> featpostlogo.mp</a>
+<img align="middle" src="./png/featpostlogo.1.png" alt=" featpostlogo.1 ">
+</P>
+<P align="center"><a href="./example/ffcbob.mp"> ffcbob.mp</a>
+<img align="middle" src="./png/ffcbob.1.png" alt=" ffcbob.1 ">
+</P>
+<P align="center"><a href="./example/fieldlines.mp"> fieldlines.mp</a>
+<img align="middle" src="./png/fieldlines.1.png" alt=" fieldlines.1 ">
+</P>
+<P align="center"><a href="./example/fieldlinesnorma.mp"> fieldlinesnorma.mp</a>
+<img align="middle" src="./png/fieldlinesnorma.1.png" alt=" fieldlinesnorma.1 ">
+<img align="middle" src="./png/fieldlinesnorma.2.png" alt=" fieldlinesnorma.2 ">
+</P>
+<P align="center"><a href="./example/fieldlinesnormapaper.mp"> fieldlinesnormapaper.mp</a>
+<img align="middle" src="./png/fieldlinesnormapaper.1.png" alt=" fieldlinesnormapaper.1 ">
+<img align="middle" src="./png/fieldlinesnormapaper.2.png" alt=" fieldlinesnormapaper.2 ">
+</P>
+<P align="center"><a href="./example/fieldlinesnormapaperwork.mp"> fieldlinesnormapaperwork.mp</a>
+<img align="middle" src="./png/fieldlinesnormapaperwork.1.png" alt=" fieldlinesnormapaperwork.1 ">
+</P>
+<P align="center"><a href="./example/fis1prex.mp"> fis1prex.mp</a>
+<img align="middle" src="./png/fis1prex.1.png" alt=" fis1prex.1 ">
+<img align="middle" src="./png/fis1prex.2.png" alt=" fis1prex.2 ">
+<img align="middle" src="./png/fis1prex.3.png" alt=" fis1prex.3 ">
+</P>
+<P align="center"><a href="./example/fis3prex7.mp"> fis3prex7.mp</a>
+<img align="middle" src="./png/fis3prex7.1.png" alt=" fis3prex7.1 ">
+<img align="middle" src="./png/fis3prex7.2.png" alt=" fis3prex7.2 ">
+<img align="middle" src="./png/fis3prex7.3.png" alt=" fis3prex7.3 ">
+<img align="middle" src="./png/fis3prex7.4.png" alt=" fis3prex7.4 ">
+<img align="middle" src="./png/fis3prex7.5.png" alt=" fis3prex7.5 ">
+<img align="middle" src="./png/fis3prex7.6.png" alt=" fis3prex7.6 ">
+<img align="middle" src="./png/fis3prex7.7.png" alt=" fis3prex7.7 ">
+<img align="middle" src="./png/fis3prex7.8.png" alt=" fis3prex7.8 ">
+</P>
+<P align="center"><a href="./example/fis3prex.mp"> fis3prex.mp</a>
+<img align="middle" src="./png/fis3prex.1.png" alt=" fis3prex.1 ">
+<img align="middle" src="./png/fis3prex.2.png" alt=" fis3prex.2 ">
+<img align="middle" src="./png/fis3prex.3.png" alt=" fis3prex.3 ">
+<img align="middle" src="./png/fis3prex.4.png" alt=" fis3prex.4 ">
+<img align="middle" src="./png/fis3prex.5.png" alt=" fis3prex.5 ">
+<img align="middle" src="./png/fis3prex.6.png" alt=" fis3prex.6 ">
+<img align="middle" src="./png/fis3prex.7.png" alt=" fis3prex.7 ">
+<img align="middle" src="./png/fis3prex.8.png" alt=" fis3prex.8 ">
+<img align="middle" src="./png/fis3prex.9.png" alt=" fis3prex.9 ">
+</P>
+<P align="center"><a href="./example/fis3prey.mp"> fis3prey.mp</a>
+<img align="middle" src="./png/fis3prey.1.png" alt=" fis3prey.1 ">
+<img align="middle" src="./png/fis3prey.2.png" alt=" fis3prey.2 ">
+<img align="middle" src="./png/fis3prey.3.png" alt=" fis3prey.3 ">
+</P>
+<P align="center"><a href="./example/frustum.mp"> frustum.mp</a>
+<img align="middle" src="./png/frustum.1.png" alt=" frustum.1 ">
+</P>
+<P align="center"><a href="./example/galvanometro-inducao.mp"> galvanometro-inducao.mp</a>
+<img align="middle" src="./png/galvanometro-inducao.1.png" alt=" galvanometro-inducao.1 ">
+</P>
+<P align="center"><a href="./example/gausslawframe.mp"> gausslawframe.mp</a>
+<img align="middle" src="./png/gausslawframe.1.png" alt=" gausslawframe.1 ">
+</P>
+<P align="center"><a href="./example/geombasic.mp"> geombasic.mp</a>
+<img align="middle" src="./png/geombasic.1.png" alt=" geombasic.1 ">
+</P>
+<P align="center"><a href="./example/geomcasq.mp"> geomcasq.mp</a>
+<img align="middle" src="./png/geomcasq.1.png" alt=" geomcasq.1 ">
+</P>
+<P align="center"><a href="./example/geometricaverage.mp"> geometricaverage.mp</a>
+<img align="middle" src="./png/geometricaverage.1.png" alt=" geometricaverage.1 ">
+</P>
+<P align="center"><a href="./example/geomfiguei.mp"> geomfiguei.mp</a>
+<img align="middle" src="./png/geomfiguei.1.png" alt=" geomfiguei.1 ">
+</P>
+<P align="center"><a href="./example/geomfreder.mp"> geomfreder.mp</a>
+<img align="middle" src="./png/geomfreder.1.png" alt=" geomfreder.1 ">
+</P>
+<P align="center"><a href="./example/geommine.mp"> geommine.mp</a>
+<img align="middle" src="./png/geommine.1.png" alt=" geommine.1 ">
+</P>
+<P align="center"><a href="./example/geomsrinath.mp"> geomsrinath.mp</a>
+<img align="middle" src="./png/geomsrinath.1.png" alt=" geomsrinath.1 ">
+</P>
+<P align="center"><a href="./example/gnupost3Dlogo.mp"> gnupost3Dlogo.mp</a>
+<img align="middle" src="./png/gnupost3Dlogo.1.png" alt=" gnupost3Dlogo.1 ">
+</P>
+<P align="center"><a href="./example/gnupost.mp"> gnupost.mp</a>
+<img align="middle" src="./png/gnupost.1.png" alt=" gnupost.1 ">
+</P>
+<P align="center"><a href="./example/goldenellipse.mp"> goldenellipse.mp</a>
+<img align="middle" src="./png/goldenellipse.1.png" alt=" goldenellipse.1 ">
+</P>
+<P align="center"><a href="./example/graphene.mp"> graphene.mp</a>
+<img align="middle" src="./png/graphene.1.png" alt=" graphene.1 ">
+</P>
+<P align="center"><a href="./example/graphexample.mp"> graphexample.mp</a>
+<img align="middle" src="./png/graphexample.1.png" alt=" graphexample.1 ">
+</P>
+<P align="center"><a href="./example/graphs.mp"> graphs.mp</a>
+<img align="middle" src="./png/graphs.1.png" alt=" graphs.1 ">
+<img align="middle" src="./png/graphs.2.png" alt=" graphs.2 ">
+</P>
+<P align="center"><a href="./example/halfcirclesfear.mp"> halfcirclesfear.mp</a>
+<img align="middle" src="./png/halfcirclesfear.1.png" alt=" halfcirclesfear.1 ">
+</P>
+<P align="center"><a href="./example/hap.mp"> hap.mp</a>
+<img align="middle" src="./png/hap.1.png" alt=" hap.1 ">
+</P>
+<P align="center"><a href="./example/heatfromroom.mp"> heatfromroom.mp</a>
+<img align="middle" src="./png/heatfromroom.1.png" alt=" heatfromroom.1 ">
+</P>
+<P align="center"><a href="./example/helix.mp"> helix.mp</a>
+<img align="middle" src="./png/helix.1.png" alt=" helix.1 ">
+</P>
+<P align="center"><a href="./example/hermitespliknot.mp"> hermitespliknot.mp</a>
+<img align="middle" src="./png/hermitespliknot.1.png" alt=" hermitespliknot.1 ">
+</P>
+<P align="center"><a href="./example/hexacylon.mp"> hexacylon.mp</a>
+<img align="middle" src="./png/hexacylon.1.png" alt=" hexacylon.1 ">
+</P>
+<P align="center"><a href="./example/hexagonalgrid.mp"> hexagonalgrid.mp</a>
+<img align="middle" src="./png/hexagonalgrid.1.png" alt=" hexagonalgrid.1 ">
+<img align="middle" src="./png/hexagonalgrid.2.png" alt=" hexagonalgrid.2 ">
+<img align="middle" src="./png/hexagonalgrid.3.png" alt=" hexagonalgrid.3 ">
+</P>
+<P align="center"><a href="./example/hexagonaltrimesh.mp"> hexagonaltrimesh.mp</a>
+<img align="middle" src="./png/hexagonaltrimesh.1.png" alt=" hexagonaltrimesh.1 ">
+</P>
+<P align="center"><a href="./example/hiddenlinegraph.mp"> hiddenlinegraph.mp</a>
+<img align="middle" src="./png/hiddenlinegraph.1.png" alt=" hiddenlinegraph.1 ">
+</P>
+<P align="center"><a href="./example/hiddensurface.mp"> hiddensurface.mp</a>
+<img align="middle" src="./png/hiddensurface.1.png" alt=" hiddensurface.1 ">
+</P>
+<P align="center"><a href="./example/hiddensurfaces.mp"> hiddensurfaces.mp</a>
+<img align="middle" src="./png/hiddensurfaces.1.png" alt=" hiddensurfaces.1 ">
+</P>
+<P align="center"><a href="./example/iamsorrykarl.mp"> iamsorrykarl.mp</a>
+<img align="middle" src="./png/iamsorrykarl.1.png" alt=" iamsorrykarl.1 ">
+</P>
+<P align="center"><a href="./example/inductionbob.mp"> inductionbob.mp</a>
+<img align="middle" src="./png/inductionbob.1.png" alt=" inductionbob.1 ">
+</P>
+<P align="center"><a href="./example/integerbars.mp"> integerbars.mp</a>
+<img align="middle" src="./png/integerbars.1.png" alt=" integerbars.1 ">
+</P>
+<P align="center"><a href="./example/integratorfigures.mp"> integratorfigures.mp</a>
+<img align="middle" src="./png/integratorfigures.1.png" alt=" integratorfigures.1 ">
+<img align="middle" src="./png/integratorfigures.2.png" alt=" integratorfigures.2 ">
+</P>
+<P align="center"><a href="./example/interdigitrodes.mp"> interdigitrodes.mp</a>
+<img align="middle" src="./png/interdigitrodes.1.png" alt=" interdigitrodes.1 ">
+</P>
+<P align="center"><a href="./example/intersectorus.mp"> intersectorus.mp</a>
+<img align="middle" src="./png/intersectorus.1.png" alt=" intersectorus.1 ">
+</P>
+<P align="center"><a href="./example/intersectprolatespheroid.mp"> intersectprolatespheroid.mp</a>
+<img align="middle" src="./png/intersectprolatespheroid.1.png" alt=" intersectprolatespheroid.1 ">
+</P>
+<P align="center"><a href="./example/iplaca.mp"> iplaca.mp</a>
+<img align="middle" src="./png/iplaca.1.png" alt=" iplaca.1 ">
+</P>
+<P align="center"><a href="./example/jd44.mp"> jd44.mp</a>
+<img align="middle" src="./png/jd44.1.png" alt=" jd44.1 ">
+<img align="middle" src="./png/jd44.2.png" alt=" jd44.2 ">
+<img align="middle" src="./png/jd44.3.png" alt=" jd44.3 ">
+<img align="middle" src="./png/jd44.4.png" alt=" jd44.4 ">
+</P>
+<P align="center"><a href="./example/jdbug.mp"> jdbug.mp</a>
+<img align="middle" src="./png/jdbug.1.png" alt=" jdbug.1 ">
+<img align="middle" src="./png/jdbug.2.png" alt=" jdbug.2 ">
+</P>
+<P align="center"><a href="./example/joinedemptylines.mp"> joinedemptylines.mp</a>
+<img align="middle" src="./png/joinedemptylines.1.png" alt=" joinedemptylines.1 ">
+</P>
+<P align="center"><a href="./example/keplernewtonfeynman.mp"> keplernewtonfeynman.mp</a>
+<img align="middle" src="./png/keplernewtonfeynman.1.png" alt=" keplernewtonfeynman.1 ">
+</P>
+<P align="center"><a href="./example/kindofcube.mp"> kindofcube.mp</a>
+<img align="middle" src="./png/kindofcube.1.png" alt=" kindofcube.1 ">
+<img align="middle" src="./png/kindofcube.2.png" alt=" kindofcube.2 ">
+</P>
+<P align="center"><a href="./example/kindofcuber.mp"> kindofcuber.mp</a>
+<img align="middle" src="./png/kindofcuber.1.png" alt=" kindofcuber.1 ">
+</P>
+<P align="center"><a href="./example/kopptrammel.mp"> kopptrammel.mp</a>
+<img align="middle" src="./png/kopptrammel.1.png" alt=" kopptrammel.1 ">
+</P>
+<P align="center"><a href="./example/labelconstruct.mp"> labelconstruct.mp</a>
+<img align="middle" src="./png/labelconstruct.1.png" alt=" labelconstruct.1 ">
+</P>
+<P align="center"><a href="./example/labelinspace.mp"> labelinspace.mp</a>
+<img align="middle" src="./png/labelinspace.1.png" alt=" labelinspace.1 ">
+</P>
+<P align="center"><a href="./example/lamarquejaune.mp"> lamarquejaune.mp</a>
+<img align="middle" src="./png/lamarquejaune.1.png" alt=" lamarquejaune.1 ">
+</P>
+<P align="center"><a href="./example/lasermachine.mp"> lasermachine.mp</a>
+<img align="middle" src="./png/lasermachine.1.png" alt=" lasermachine.1 ">
+</P>
+<P align="center"><a href="./example/latexboxes.mp"> latexboxes.mp</a>
+<img align="middle" src="./png/latexboxes.0.png" alt=" latexboxes.0 ">
+<img align="middle" src="./png/latexboxes.1.png" alt=" latexboxes.1 ">
+</P>
+<P align="center"><a href="./example/lawofcosines.mp"> lawofcosines.mp</a>
+<img align="middle" src="./png/lawofcosines.1.png" alt=" lawofcosines.1 ">
+<img align="middle" src="./png/lawofcosines.2.png" alt=" lawofcosines.2 ">
+</P>
+<P align="center"><a href="./example/lcurvature.mp"> lcurvature.mp</a>
+<img align="middle" src="./png/lcurvature.1.png" alt=" lcurvature.1 ">
+<img align="middle" src="./png/lcurvature.2.png" alt=" lcurvature.2 ">
+</P>
+<P align="center"><a href="./example/ledlogo.mp"> ledlogo.mp</a>
+<img align="middle" src="./png/ledlogo.1.png" alt=" ledlogo.1 ">
+<img align="middle" src="./png/ledlogo.2.png" alt=" ledlogo.2 ">
+<img align="middle" src="./png/ledlogo.3.png" alt=" ledlogo.3 ">
+<img align="middle" src="./png/ledlogo.4.png" alt=" ledlogo.4 ">
+</P>
+<P align="center"><a href="./example/LED.mp"> LED.mp</a>
+<img align="middle" src="./png/LED.1.png" alt=" LED.1 ">
+</P>
+<P align="center"><a href="./example/lgc2refractionEdited.mp"> lgc2refractionEdited.mp</a>
+<img align="middle" src="./png/lgc2refractionEdited.1.png" alt=" lgc2refractionEdited.1 ">
+<img align="middle" src="./png/lgc2refractionEdited.2.png" alt=" lgc2refractionEdited.2 ">
+<img align="middle" src="./png/lgc2refractionEdited.3.png" alt=" lgc2refractionEdited.3 ">
+<img align="middle" src="./png/lgc2refractionEdited.4.png" alt=" lgc2refractionEdited.4 ">
+</P>
+<P align="center"><a href="./example/loglogpaper.mp"> loglogpaper.mp</a>
+<img align="middle" src="./png/loglogpaper.1.png" alt=" loglogpaper.1 ">
+</P>
+<P align="center"><a href="./example/logofontest.mp"> logofontest.mp</a>
+<img align="middle" src="./png/logofontest.0.png" alt=" logofontest.0 ">
+</P>
+<P align="center"><a href="./example/lowcostgreenhouse.mp"> lowcostgreenhouse.mp</a>
+<img align="middle" src="./png/lowcostgreenhouse.1.png" alt=" lowcostgreenhouse.1 ">
+</P>
+<P align="center"><a href="./example/magneticflux.mp"> magneticflux.mp</a>
+<img align="middle" src="./png/magneticflux.1.png" alt=" magneticflux.1 ">
+<img align="middle" src="./png/magneticflux.2.png" alt=" magneticflux.2 ">
+</P>
+<P align="center"><a href="./example/mainmemtest.mp"> mainmemtest.mp</a>
+<img align="middle" src="./png/mainmemtest.1.png" alt=" mainmemtest.1 ">
+</P>
+<P align="center"><a href="./example/manjusha.mp"> manjusha.mp</a>
+<img align="middle" src="./png/manjusha.1.png" alt=" manjusha.1 ">
+<img align="middle" src="./png/manjusha.4.png" alt=" manjusha.4 ">
+<img align="middle" src="./png/manjusha.6.png" alt=" manjusha.6 ">
+</P>
+<P align="center"><a href="./example/matricskoc.mp"> matricskoc.mp</a>
+<img align="middle" src="./png/matricskoc.1.png" alt=" matricskoc.1 ">
+</P>
+<P align="center"><a href="./example/mce-lng.mp"> mce-lng.mp</a>
+<img align="middle" src="./png/mce-lng.1.png" alt=" mce-lng.1 ">
+</P>
+<P align="center"><a href="./example/metalcharge.mp"> metalcharge.mp</a>
+<img align="middle" src="./png/metalcharge.1.png" alt=" metalcharge.1 ">
+</P>
+<P align="center"><a href="./example/micostufas.mp"> micostufas.mp</a>
+<img align="middle" src="./png/micostufas.1.png" alt=" micostufas.1 ">
+</P>
+<P align="center"><a href="./example/micromu.mp"> micromu.mp</a>
+<img align="middle" src="./png/micromu.1.png" alt=" micromu.1 ">
+</P>
+<P align="center"><a href="./example/milimetricpaper.mp"> milimetricpaper.mp</a>
+<img align="middle" src="./png/milimetricpaper.1.png" alt=" milimetricpaper.1 ">
+<img align="middle" src="./png/milimetricpaper.2.png" alt=" milimetricpaper.2 ">
+</P>
+<P align="center"><a href="./example/mpfields.mp"> mpfields.mp</a>
+<img align="middle" src="./png/mpfields.0.png" alt=" mpfields.0 ">
+<img align="middle" src="./png/mpfields.1.png" alt=" mpfields.1 ">
+<img align="middle" src="./png/mpfields.2.png" alt=" mpfields.2 ">
+<img align="middle" src="./png/mpfields.3.png" alt=" mpfields.3 ">
+<img align="middle" src="./png/mpfields.4.png" alt=" mpfields.4 ">
+<img align="middle" src="./png/mpfields.5.png" alt=" mpfields.5 ">
+<img align="middle" src="./png/mpfields.6.png" alt=" mpfields.6 ">
+<img align="middle" src="./png/mpfields.7.png" alt=" mpfields.7 ">
+</P>
+<P align="center"><a href="./example/mptoolcone.mp"> mptoolcone.mp</a>
+<img align="middle" src="./png/mptoolcone.0.png" alt=" mptoolcone.0 ">
+</P>
+<P align="center"><a href="./example/muslimpattern.mp"> muslimpattern.mp</a>
+<img align="middle" src="./png/muslimpattern.1.png" alt=" muslimpattern.1 ">
+<img align="middle" src="./png/muslimpattern.2.png" alt=" muslimpattern.2 ">
+</P>
+<P align="center"><a href="./example/mypatent.mp"> mypatent.mp</a>
+<img align="middle" src="./png/mypatent.1.png" alt=" mypatent.1 ">
+<img align="middle" src="./png/mypatent.2.png" alt=" mypatent.2 ">
+<img align="middle" src="./png/mypatent.3.png" alt=" mypatent.3 ">
+<img align="middle" src="./png/mypatent.4.png" alt=" mypatent.4 ">
+</P>
+<P align="center"><a href="./example/mypatentpieces.mp"> mypatentpieces.mp</a>
+<img align="middle" src="./png/mypatentpieces.1.png" alt=" mypatentpieces.1 ">
+</P>
+<P align="center"><a href="./example/mysquaresectionbar.mp"> mysquaresectionbar.mp</a>
+<img align="middle" src="./png/mysquaresectionbar.1.png" alt=" mysquaresectionbar.1 ">
+</P>
+<P align="center"><a href="./example/naoestacionar.mp"> naoestacionar.mp</a>
+<img align="middle" src="./png/naoestacionar.1.png" alt=" naoestacionar.1 ">
+</P>
+<P align="center"><a href="./example/naotocanacalote.mp"> naotocanacalote.mp</a>
+<img align="middle" src="./png/naotocanacalote.1.png" alt=" naotocanacalote.1 ">
+</P>
+<P align="center"><a href="./example/nembends.mp"> nembends.mp</a>
+<img align="middle" src="./png/nembends.1.png" alt=" nembends.1 ">
+</P>
+<P align="center"><a href="./example/nembiaxi.mp"> nembiaxi.mp</a>
+<img align="middle" src="./png/nembiaxi.1.png" alt=" nembiaxi.1 ">
+</P>
+<P align="center"><a href="./example/nemdirector.mp"> nemdirector.mp</a>
+<img align="middle" src="./png/nemdirector.1.png" alt=" nemdirector.1 ">
+</P>
+<P align="center"><a href="./example/nemquira.mp"> nemquira.mp</a>
+<img align="middle" src="./png/nemquira.1.png" alt=" nemquira.1 ">
+</P>
+<P align="center"><a href="./example/nemquirapitch.mp"> nemquirapitch.mp</a>
+<img align="middle" src="./png/nemquirapitch.1.png" alt=" nemquirapitch.1 ">
+</P>
+<P align="center"><a href="./example/nemsaddl.mp"> nemsaddl.mp</a>
+<img align="middle" src="./png/nemsaddl.1.png" alt=" nemsaddl.1 ">
+</P>
+<P align="center"><a href="./example/nemuniax.mp"> nemuniax.mp</a>
+<img align="middle" src="./png/nemuniax.1.png" alt=" nemuniax.1 ">
+</P>
+<P align="center"><a href="./example/newcommunism.mp"> newcommunism.mp</a>
+<img align="middle" src="./png/newcommunism.1.png" alt=" newcommunism.1 ">
+<img align="middle" src="./png/newcommunism.2.png" alt=" newcommunism.2 ">
+</P>
+<P align="center"><a href="./example/newexperimental.mp"> newexperimental.mp</a>
+<img align="middle" src="./png/newexperimental.1.png" alt=" newexperimental.1 ">
+</P>
+<P align="center"><a href="./example/nosimples.mp"> nosimples.mp</a>
+<img align="middle" src="./png/nosimples.1.png" alt=" nosimples.1 ">
+</P>
+<P align="center"><a href="./example/nosuspension.mp"> nosuspension.mp</a>
+<img align="middle" src="./png/nosuspension.0.png" alt=" nosuspension.0 ">
+</P>
+<P align="center"><a href="./example/nsmetica.mp"> nsmetica.mp</a>
+<img align="middle" src="./png/nsmetica.1.png" alt=" nsmetica.1 ">
+</P>
+<P align="center"><a href="./example/nulldefectanglexample.mp"> nulldefectanglexample.mp</a>
+<img align="middle" src="./png/nulldefectanglexample.1.png" alt=" nulldefectanglexample.1 ">
+<img align="middle" src="./png/nulldefectanglexample.2.png" alt=" nulldefectanglexample.2 ">
+<img align="middle" src="./png/nulldefectanglexample.3.png" alt=" nulldefectanglexample.3 ">
+<img align="middle" src="./png/nulldefectanglexample.4.png" alt=" nulldefectanglexample.4 ">
+</P>
+<P align="center"><a href="./example/nurbstobeziern.mp"> nurbstobeziern.mp</a>
+<img align="middle" src="./png/nurbstobeziern.0.png" alt=" nurbstobeziern.0 ">
+</P>
+<P align="center"><a href="./example/onebigword.mp"> onebigword.mp</a>
+<img align="middle" src="./png/onebigword.1.png" alt=" onebigword.1 ">
+</P>
+<P align="center"><a href="./example/optest.mp"> optest.mp</a>
+<img align="middle" src="./png/optest.1.png" alt=" optest.1 ">
+<img align="middle" src="./png/optest.2.png" alt=" optest.2 ">
+</P>
+<P align="center"><a href="./example/optica.mp"> optica.mp</a>
+<img align="middle" src="./png/optica.1.png" alt=" optica.1 ">
+</P>
+<P align="center"><a href="./example/par3Dplotexamples.mp"> par3Dplotexamples.mp</a>
+<img align="middle" src="./png/par3Dplotexamples.1.png" alt=" par3Dplotexamples.1 ">
+<img align="middle" src="./png/par3Dplotexamples.2.png" alt=" par3Dplotexamples.2 ">
+</P>
+<P align="center"><a href="./example/parafuso.mp"> parafuso.mp</a>
+<img align="middle" src="./png/parafuso.1.png" alt=" parafuso.1 ">
+<img align="middle" src="./png/parafuso.2.png" alt=" parafuso.2 ">
+<img align="middle" src="./png/parafuso.3.png" alt=" parafuso.3 ">
+<img align="middle" src="./png/parafuso.4.png" alt=" parafuso.4 ">
+</P>
+<P align="center"><a href="./example/parafusoprojxy.mp"> parafusoprojxy.mp</a>
+<img align="middle" src="./png/parafusoprojxy.1.png" alt=" parafusoprojxy.1 ">
+</P>
+<P align="center"><a href="./example/pathernon.mp"> pathernon.mp</a>
+<img align="middle" src="./png/pathernon.0.png" alt=" pathernon.0 ">
+</P>
+<P align="center"><a href="./example/pathofstraightline.mp"> pathofstraightline.mp</a>
+<img align="middle" src="./png/pathofstraightline.1.png" alt=" pathofstraightline.1 ">
+</P>
+<P align="center"><a href="./example/perspec.mp"> perspec.mp</a>
+<img align="middle" src="./png/perspec.1.png" alt=" perspec.1 ">
+</P>
+<P align="center"><a href="./example/photorefer.mp"> photorefer.mp</a>
+<img align="middle" src="./png/photorefer.1.png" alt=" photorefer.1 ">
+<img align="middle" src="./png/photorefer.2.png" alt=" photorefer.2 ">
+</P>
+<P align="center"><a href="./example/photoreverse.mp"> photoreverse.mp</a>
+<img align="middle" src="./png/photoreverse.1.png" alt=" photoreverse.1 ">
+</P>
+<P align="center"><a href="./example/pifpaf.mp"> pifpaf.mp</a>
+<img align="middle" src="./png/pifpaf.1.png" alt=" pifpaf.1 ">
+</P>
+<P align="center"><a href="./example/pixelgrid.mp"> pixelgrid.mp</a>
+<img align="middle" src="./png/pixelgrid.1.png" alt=" pixelgrid.1 ">
+</P>
+<P align="center"><a href="./example/plaintangency.mp"> plaintangency.mp</a>
+<img align="middle" src="./png/plaintangency.0.png" alt=" plaintangency.0 ">
+<img align="middle" src="./png/plaintangency.1.png" alt=" plaintangency.1 ">
+</P>
+<P align="center"><a href="./example/planintersection.mp"> planintersection.mp</a>
+<img align="middle" src="./png/planintersection.1.png" alt=" planintersection.1 ">
+</P>
+<P align="center"><a href="./example/planpht.mp"> planpht.mp</a>
+<img align="middle" src="./png/planpht.1.png" alt=" planpht.1 ">
+<img align="middle" src="./png/planpht.2.png" alt=" planpht.2 ">
+<img align="middle" src="./png/planpht.3.png" alt=" planpht.3 ">
+<img align="middle" src="./png/planpht.4.png" alt=" planpht.4 ">
+<img align="middle" src="./png/planpht.5.png" alt=" planpht.5 ">
+<img align="middle" src="./png/planpht.6.png" alt=" planpht.6 ">
+<img align="middle" src="./png/planpht.7.png" alt=" planpht.7 ">
+</P>
+<P align="center"><a href="./example/polyhedr.mp"> polyhedr.mp</a>
+<img align="middle" src="./png/polyhedr.1.png" alt=" polyhedr.1 ">
+<img align="middle" src="./png/polyhedr.2.png" alt=" polyhedr.2 ">
+<img align="middle" src="./png/polyhedr.3.png" alt=" polyhedr.3 ">
+</P>
+<P align="center"><a href="./example/positivecharge.mp"> positivecharge.mp</a>
+<img align="middle" src="./png/positivecharge.1.png" alt=" positivecharge.1 ">
+</P>
+<P align="center"><a href="./example/potenciadecicloeliptico.mp"> potenciadecicloeliptico.mp</a>
+<img align="middle" src="./png/potenciadecicloeliptico.1.png" alt=" potenciadecicloeliptico.1 ">
+</P>
+<P align="center"><a href="./example/probtodooterr.mp"> probtodooterr.mp</a>
+<img align="middle" src="./png/probtodooterr.1.png" alt=" probtodooterr.1 ">
+</P>
+<P align="center"><a href="./example/profaux.mp"> profaux.mp</a>
+<img align="middle" src="./png/profaux.1.png" alt=" profaux.1 ">
+</P>
+<P align="center"><a href="./example/project.mp"> project.mp</a>
+<img align="middle" src="./png/project.1.png" alt=" project.1 ">
+</P>
+<P align="center"><a href="./example/qap.mp"> qap.mp</a>
+<img align="middle" src="./png/qap.1.png" alt=" qap.1 ">
+</P>
+<P align="center"><a href="./example/quartertorus.mp"> quartertorus.mp</a>
+<img align="middle" src="./png/quartertorus.1.png" alt=" quartertorus.1 ">
+<img align="middle" src="./png/quartertorus.2.png" alt=" quartertorus.2 ">
+</P>
+<P align="center"><a href="./example/radiativeforcing.mp"> radiativeforcing.mp</a>
+<img align="middle" src="./png/radiativeforcing.0.png" alt=" radiativeforcing.0 ">
+</P>
+<P align="center"><a href="./example/raiodoscirculos.mp"> raiodoscirculos.mp</a>
+<img align="middle" src="./png/raiodoscirculos.1.png" alt=" raiodoscirculos.1 ">
+<img align="middle" src="./png/raiodoscirculos.2.png" alt=" raiodoscirculos.2 ">
+<img align="middle" src="./png/raiodoscirculos.3.png" alt=" raiodoscirculos.3 ">
+<img align="middle" src="./png/raiodoscirculos.4.png" alt=" raiodoscirculos.4 ">
+<img align="middle" src="./png/raiodoscirculos.5.png" alt=" raiodoscirculos.5 ">
+<img align="middle" src="./png/raiodoscirculos.6.png" alt=" raiodoscirculos.6 ">
+<img align="middle" src="./png/raiodoscirculos.7.png" alt=" raiodoscirculos.7 ">
+<img align="middle" src="./png/raiodoscirculos.8.png" alt=" raiodoscirculos.8 ">
+<img align="middle" src="./png/raiodoscirculos.9.png" alt=" raiodoscirculos.9 ">
+</P>
+<P align="center"><a href="./example/redplanet.mp"> redplanet.mp</a>
+<img align="middle" src="./png/redplanet.1.png" alt=" redplanet.1 ">
+</P>
+<P align="center"><a href="./example/reeditedgoodquestionmark.mp"> reeditedgoodquestionmark.mp</a>
+<img align="middle" src="./png/reeditedgoodquestionmark.1.png" alt=" reeditedgoodquestionmark.1 ">
+</P>
+<P align="center"><a href="./example/resistcircuit.mp"> resistcircuit.mp</a>
+<img align="middle" src="./png/resistcircuit.1.png" alt=" resistcircuit.1 ">
+</P>
+<P align="center"><a href="./example/reuleaux.mp"> reuleaux.mp</a>
+<img align="middle" src="./png/reuleaux.1.png" alt=" reuleaux.1 ">
+<img align="middle" src="./png/reuleaux.2.png" alt=" reuleaux.2 ">
+</P>
+<P align="center"><a href="./example/revolipsoid.mp"> revolipsoid.mp</a>
+<img align="middle" src="./png/revolipsoid.1.png" alt=" revolipsoid.1 ">
+<img align="middle" src="./png/revolipsoid.2.png" alt=" revolipsoid.2 ">
+</P>
+<P align="center"><a href="./example/revolutionparaboloid.mp"> revolutionparaboloid.mp</a>
+<img align="middle" src="./png/revolutionparaboloid.1.png" alt=" revolutionparaboloid.1 ">
+<img align="middle" src="./png/revolutionparaboloid.2.png" alt=" revolutionparaboloid.2 ">
+<img align="middle" src="./png/revolutionparaboloid.3.png" alt=" revolutionparaboloid.3 ">
+<img align="middle" src="./png/revolutionparaboloid.4.png" alt=" revolutionparaboloid.4 ">
+<img align="middle" src="./png/revolutionparaboloid.5.png" alt=" revolutionparaboloid.5 ">
+</P>
+<P align="center"><a href="./example/revolvers.mp"> revolvers.mp</a>
+<img align="middle" src="./png/revolvers.1.png" alt=" revolvers.1 ">
+<img align="middle" src="./png/revolvers.2.png" alt=" revolvers.2 ">
+<img align="middle" src="./png/revolvers.3.png" alt=" revolvers.3 ">
+<img align="middle" src="./png/revolvers.4.png" alt=" revolvers.4 ">
+<img align="middle" src="./png/revolvers.5.png" alt=" revolvers.5 ">
+<img align="middle" src="./png/revolvers.6.png" alt=" revolvers.6 ">
+<img align="middle" src="./png/revolvers.7.png" alt=" revolvers.7 ">
+</P>
+<P align="center"><a href="./example/rigorcubo.mp"> rigorcubo.mp</a>
+<img align="middle" src="./png/rigorcubo.0.png" alt=" rigorcubo.0 ">
+</P>
+<P align="center"><a href="./example/rigorouscircle.mp"> rigorouscircle.mp</a>
+<img align="middle" src="./png/rigorouscircle.1.png" alt=" rigorouscircle.1 ">
+</P>
+<P align="center"><a href="./example/rigorouscone.mp"> rigorouscone.mp</a>
+<img align="middle" src="./png/rigorouscone.1.png" alt=" rigorouscone.1 ">
+</P>
+<P align="center"><a href="./example/rigorousdiscoptions.mp"> rigorousdiscoptions.mp</a>
+<img align="middle" src="./png/rigorousdiscoptions.1.png" alt=" rigorousdiscoptions.1 ">
+</P>
+<P align="center"><a href="./example/rigorousdiscSD.mp"> rigorousdiscSD.mp</a>
+<img align="middle" src="./png/rigorousdiscSD.1.png" alt=" rigorousdiscSD.1 ">
+</P>
+<P align="center"><a href="./example/rigorousfearpath.mp"> rigorousfearpath.mp</a>
+<img align="middle" src="./png/rigorousfearpath.1.png" alt=" rigorousfearpath.1 ">
+</P>
+<P align="center"><a href="./example/rmnbob.mp"> rmnbob.mp</a>
+<img align="middle" src="./png/rmnbob.1.png" alt=" rmnbob.1 ">
+</P>
+<P align="center"><a href="./example/roadincline.mp"> roadincline.mp</a>
+<img align="middle" src="./png/roadincline.1.png" alt=" roadincline.1 ">
+</P>
+<P align="center"><a href="./example/rodarolaremplaninc.mp"> rodarolaremplaninc.mp</a>
+<img align="middle" src="./png/rodarolaremplaninc.1.png" alt=" rodarolaremplaninc.1 ">
+</P>
+<P align="center"><a href="./example/ropepatterns.mp"> ropepatterns.mp</a>
+<img align="middle" src="./png/ropepatterns.1.png" alt=" ropepatterns.1 ">
+</P>
+<P align="center"><a href="./example/rosadosventos.mp"> rosadosventos.mp</a>
+<img align="middle" src="./png/rosadosventos.1.png" alt=" rosadosventos.1 ">
+</P>
+<P align="center"><a href="./example/rotatnlc.mp"> rotatnlc.mp</a>
+<img align="middle" src="./png/rotatnlc.1.png" alt=" rotatnlc.1 ">
+</P>
+<P align="center"><a href="./example/rothexagrid.mp"> rothexagrid.mp</a>
+<img align="middle" src="./png/rothexagrid.1.png" alt=" rothexagrid.1 ">
+</P>
+<P align="center"><a href="./example/rungekuttasecond.mp"> rungekuttasecond.mp</a>
+<img align="middle" src="./png/rungekuttasecond.1.png" alt=" rungekuttasecond.1 ">
+<img align="middle" src="./png/rungekuttasecond.2.png" alt=" rungekuttasecond.2 ">
+</P>
+<P align="center"><a href="./example/sal.mp"> sal.mp</a>
+<img align="middle" src="./png/sal.1.png" alt=" sal.1 ">
+<img align="middle" src="./png/sal.2.png" alt=" sal.2 ">
+</P>
+<P align="center"><a href="./example/sap.mp"> sap.mp</a>
+<img align="middle" src="./png/sap.1.png" alt=" sap.1 ">
+</P>
+<P align="center"><a href="./example/saturn.mp"> saturn.mp</a>
+<img align="middle" src="./png/saturn.1.png" alt=" saturn.1 ">
+</P>
+<P align="center"><a href="./example/sfearschem.mp"> sfearschem.mp</a>
+<img align="middle" src="./png/sfearschem.1.png" alt=" sfearschem.1 ">
+</P>
+<P align="center"><a href="./example/sharpraytrace.mp"> sharpraytrace.mp</a>
+<img align="middle" src="./png/sharpraytrace.1.png" alt=" sharpraytrace.1 ">
+<img align="middle" src="./png/sharpraytrace.2.png" alt=" sharpraytrace.2 ">
+<img align="middle" src="./png/sharpraytrace.3.png" alt=" sharpraytrace.3 ">
+<img align="middle" src="./png/sharpraytrace.4.png" alt=" sharpraytrace.4 ">
+</P>
+<P align="center"><a href="./example/signalvertexSD.mp"> signalvertexSD.mp</a>
+<img align="middle" src="./png/signalvertexSD.1.png" alt=" signalvertexSD.1 ">
+</P>
+<P align="center"><a href="./example/simplecar.mp"> simplecar.mp</a>
+<img align="middle" src="./png/simplecar.1.png" alt=" simplecar.1 ">
+</P>
+<P align="center"><a href="./example/simplecarparam.mp"> simplecarparam.mp</a>
+<img align="middle" src="./png/simplecarparam.1.png" alt=" simplecarparam.1 ">
+</P>
+<P align="center"><a href="./example/simplecenterofmass.mp"> simplecenterofmass.mp</a>
+<img align="middle" src="./png/simplecenterofmass.0.png" alt=" simplecenterofmass.0 ">
+<img align="middle" src="./png/simplecenterofmass.1.png" alt=" simplecenterofmass.1 ">
+</P>
+<P align="center"><a href="./example/simplelens.mp"> simplelens.mp</a>
+<img align="middle" src="./png/simplelens.1.png" alt=" simplelens.1 ">
+</P>
+<P align="center"><a href="./example/simplependulum.mp"> simplependulum.mp</a>
+<img align="middle" src="./png/simplependulum.1.png" alt=" simplependulum.1 ">
+</P>
+<P align="center"><a href="./example/simplexperiment.mp"> simplexperiment.mp</a>
+<img align="middle" src="./png/simplexperiment.1.png" alt=" simplexperiment.1 ">
+</P>
+<P align="center"><a href="./example/sincityredesigned.mp"> sincityredesigned.mp</a>
+<img align="middle" src="./png/sincityredesigned.1.png" alt=" sincityredesigned.1 ">
+<img align="middle" src="./png/sincityredesigned.2.png" alt=" sincityredesigned.2 ">
+</P>
+<P align="center"><a href="./example/slingshot.mp"> slingshot.mp</a>
+<img align="middle" src="./png/slingshot.1.png" alt=" slingshot.1 ">
+</P>
+<P align="center"><a href="./example/SlowDownNowBitmapScanned.mp"> SlowDownNowBitmapScanned.mp</a>
+<img align="middle" src="./png/SlowDownNowBitmapScanned.1.png" alt=" SlowDownNowBitmapScanned.1 ">
+</P>
+<P align="center"><a href="./example/smC.mp"> smC.mp</a>
+<img align="middle" src="./png/smC.1.png" alt=" smC.1 ">
+</P>
+<P align="center"><a href="./example/sniperlogo.mp"> sniperlogo.mp</a>
+<img align="middle" src="./png/sniperlogo.1.png" alt=" sniperlogo.1 ">
+</P>
+<P align="center"><a href="./example/solarconcentrator.mp"> solarconcentrator.mp</a>
+<img align="middle" src="./png/solarconcentrator.1.png" alt=" solarconcentrator.1 ">
+</P>
+<P align="center"><a href="./example/solardish.mp"> solardish.mp</a>
+<img align="middle" src="./png/solardish.1.png" alt=" solardish.1 ">
+<img align="middle" src="./png/solardish.2.png" alt=" solardish.2 ">
+<img align="middle" src="./png/solardish.3.png" alt=" solardish.3 ">
+<img align="middle" src="./png/solardish.4.png" alt=" solardish.4 ">
+</P>
+<P align="center"><a href="./example/some2Dvecs.mp"> some2Dvecs.mp</a>
+<img align="middle" src="./png/some2Dvecs.1.png" alt=" some2Dvecs.1 ">
+</P>
+<P align="center"><a href="./example/spaceinvader.mp"> spaceinvader.mp</a>
+<img align="middle" src="./png/spaceinvader.1.png" alt=" spaceinvader.1 ">
+<img align="middle" src="./png/spaceinvader.2.png" alt=" spaceinvader.2 ">
+</P>
+<P align="center"><a href="./example/spatialhalfsfear.mp"> spatialhalfsfear.mp</a>
+<img align="middle" src="./png/spatialhalfsfear.1.png" alt=" spatialhalfsfear.1 ">
+</P>
+<P align="center"><a href="./example/spherample.mp"> spherample.mp</a>
+<img align="middle" src="./png/spherample.1.png" alt=" spherample.1 ">
+</P>
+<P align="center"><a href="./example/splineperspective.mp"> splineperspective.mp</a>
+<img align="middle" src="./png/splineperspective.0.png" alt=" splineperspective.0 ">
+<img align="middle" src="./png/splineperspective.1.png" alt=" splineperspective.1 ">
+<img align="middle" src="./png/splineperspective.2.png" alt=" splineperspective.2 ">
+<img align="middle" src="./png/splineperspective.3.png" alt=" splineperspective.3 ">
+<img align="middle" src="./png/splineperspective.4.png" alt=" splineperspective.4 ">
+<img align="middle" src="./png/splineperspective.5.png" alt=" splineperspective.5 ">
+</P>
+<P align="center"><a href="./example/splineperspectives.mp"> splineperspectives.mp</a>
+<img align="middle" src="./png/splineperspectives.1.png" alt=" splineperspectives.1 ">
+<img align="middle" src="./png/splineperspectives.2.png" alt=" splineperspectives.2 ">
+<img align="middle" src="./png/splineperspectives.3.png" alt=" splineperspectives.3 ">
+</P>
+<P align="center"><a href="./example/spltwiben.mp"> spltwiben.mp</a>
+<img align="middle" src="./png/spltwiben.1.png" alt=" spltwiben.1 ">
+</P>
+<P align="center"><a href="./example/squareanglines.mp"> squareanglines.mp</a>
+<img align="middle" src="./png/squareanglines.1.png" alt=" squareanglines.1 ">
+</P>
+<P align="center"><a href="./example/srinathpolineni.mp"> srinathpolineni.mp</a>
+<img align="middle" src="./png/srinathpolineni.1.png" alt=" srinathpolineni.1 ">
+<img align="middle" src="./png/srinathpolineni.2.png" alt=" srinathpolineni.2 ">
+<img align="middle" src="./png/srinathpolineni.3.png" alt=" srinathpolineni.3 ">
+<img align="middle" src="./png/srinathpolineni.5.png" alt=" srinathpolineni.5 ">
+<img align="middle" src="./png/srinathpolineni.6.png" alt=" srinathpolineni.6 ">
+<img align="middle" src="./png/srinathpolineni.7.png" alt=" srinathpolineni.7 ">
+<img align="middle" src="./png/srinathpolineni.8.png" alt=" srinathpolineni.8 ">
+<img align="middle" src="./png/srinathpolineni.9.png" alt=" srinathpolineni.9 ">
+</P>
+<P align="center"><a href="./example/stageforthree.mp"> stageforthree.mp</a>
+<img align="middle" src="./png/stageforthree.1.png" alt=" stageforthree.1 ">
+<img align="middle" src="./png/stageforthree.2.png" alt=" stageforthree.2 ">
+<img align="middle" src="./png/stageforthree.3.png" alt=" stageforthree.3 ">
+</P>
+<P align="center"><a href="./example/statement.mp"> statement.mp</a>
+<img align="middle" src="./png/statement.1.png" alt=" statement.1 ">
+<img align="middle" src="./png/statement.2.png" alt=" statement.2 ">
+</P>
+<P align="center"><a href="./example/statethreelines.mp"> statethreelines.mp</a>
+<img align="middle" src="./png/statethreelines.0.png" alt=" statethreelines.0 ">
+</P>
+<P align="center"><a href="./example/steamcamera.mp"> steamcamera.mp</a>
+<img align="middle" src="./png/steamcamera.0.png" alt=" steamcamera.0 ">
+</P>
+<P align="center"><a href="./example/strength1defect.mp"> strength1defect.mp</a>
+<img align="middle" src="./png/strength1defect.1.png" alt=" strength1defect.1 ">
+</P>
+<P align="center"><a href="./example/symbol.mp"> symbol.mp</a>
+<img align="middle" src="./png/symbol.1.png" alt=" symbol.1 ">
+</P>
+<P align="center"><a href="./example/tangency2D.mp"> tangency2D.mp</a>
+<img align="middle" src="./png/tangency2D.1.png" alt=" tangency2D.1 ">
+</P>
+<P align="center"><a href="./example/tangencypoint.mp"> tangencypoint.mp</a>
+<img align="middle" src="./png/tangencypoint.1.png" alt=" tangencypoint.1 ">
+</P>
+<P align="center"><a href="./example/tdarrow.mp"> tdarrow.mp</a>
+<img align="middle" src="./png/tdarrow.1.png" alt=" tdarrow.1 ">
+</P>
+<P align="center"><a href="./example/tdcircarrow.mp"> tdcircarrow.mp</a>
+<img align="middle" src="./png/tdcircarrow.1.png" alt=" tdcircarrow.1 ">
+</P>
+<P align="center"><a href="./example/telemira.mp"> telemira.mp</a>
+<img align="middle" src="./png/telemira.1.png" alt=" telemira.1 ">
+</P>
+<P align="center"><a href="./example/telheiro.mp"> telheiro.mp</a>
+<img align="middle" src="./png/telheiro.1.png" alt=" telheiro.1 ">
+<img align="middle" src="./png/telheiro.2.png" alt=" telheiro.2 ">
+</P>
+<P align="center"><a href="./example/tete.mp"> tete.mp</a>
+<img align="middle" src="./png/tete.1.png" alt=" tete.1 ">
+</P>
+<P align="center"><a href="./example/tetrapodes.mp"> tetrapodes.mp</a>
+<img align="middle" src="./png/tetrapodes.1.png" alt=" tetrapodes.1 ">
+<img align="middle" src="./png/tetrapodes.2.png" alt=" tetrapodes.2 ">
+<img align="middle" src="./png/tetrapodes.3.png" alt=" tetrapodes.3 ">
+</P>
+<P align="center"><a href="./example/thearchicon.mp"> thearchicon.mp</a>
+<img align="middle" src="./png/thearchicon.1.png" alt=" thearchicon.1 ">
+</P>
+<P align="center"><a href="./example/theHURD.mp"> theHURD.mp</a>
+<img align="middle" src="./png/theHURD.1.png" alt=" theHURD.1 ">
+</P>
+<P align="center"><a href="./example/thethreekindsofperspec.mp"> thethreekindsofperspec.mp</a>
+<img align="middle" src="./png/thethreekindsofperspec.1.png" alt=" thethreekindsofperspec.1 ">
+<img align="middle" src="./png/thethreekindsofperspec.2.png" alt=" thethreekindsofperspec.2 ">
+<img align="middle" src="./png/thethreekindsofperspec.3.png" alt=" thethreekindsofperspec.3 ">
+</P>
+<P align="center"><a href="./example/thunderproblem.mp"> thunderproblem.mp</a>
+<img align="middle" src="./png/thunderproblem.1.png" alt=" thunderproblem.1 ">
+</P>
+<P align="center"><a href="./example/tiposdetransb.mp"> tiposdetransb.mp</a>
+<img align="middle" src="./png/tiposdetransb.1.png" alt=" tiposdetransb.1 ">
+</P>
+<P align="center"><a href="./example/tiposdetrans.mp"> tiposdetrans.mp</a>
+<img align="middle" src="./png/tiposdetrans.1.png" alt=" tiposdetrans.1 ">
+</P>
+<P align="center"><a href="./example/tiposdetranst.mp"> tiposdetranst.mp</a>
+<img align="middle" src="./png/tiposdetranst.1.png" alt=" tiposdetranst.1 ">
+</P>
+<P align="center"><a href="./example/toro4transit.mp"> toro4transit.mp</a>
+<img align="middle" src="./png/toro4transit.1.png" alt=" toro4transit.1 ">
+</P>
+<P align="center"><a href="./example/torusexperiment.mp"> torusexperiment.mp</a>
+<img align="middle" src="./png/torusexperiment.1.png" alt=" torusexperiment.1 ">
+<img align="middle" src="./png/torusexperiment.2.png" alt=" torusexperiment.2 ">
+</P>
+<P align="center"><a href="./example/torus.mp"> torus.mp</a>
+<img align="middle" src="./png/torus.1.png" alt=" torus.1 ">
+<img align="middle" src="./png/torus.2.png" alt=" torus.2 ">
+<img align="middle" src="./png/torus.3.png" alt=" torus.3 ">
+<img align="middle" src="./png/torus.4.png" alt=" torus.4 ">
+<img align="middle" src="./png/torus.5.png" alt=" torus.5 ">
+<img align="middle" src="./png/torus.6.png" alt=" torus.6 ">
+<img align="middle" src="./png/torus.7.png" alt=" torus.7 ">
+</P>
+<P align="center"><a href="./example/trajectoryline.mp"> trajectoryline.mp</a>
+<img align="middle" src="./png/trajectoryline.1.png" alt=" trajectoryline.1 ">
+<img align="middle" src="./png/trajectoryline.2.png" alt=" trajectoryline.2 ">
+</P>
+<P align="center"><a href="./example/trebuchet.mp"> trebuchet.mp</a>
+<img align="middle" src="./png/trebuchet.1.png" alt=" trebuchet.1 ">
+</P>
+<P align="center"><a href="./example/treecarbonedited.mp"> treecarbonedited.mp</a>
+<img align="middle" src="./png/treecarbonedited.0.png" alt=" treecarbonedited.0 ">
+</P>
+<P align="center"><a href="./example/trianglecenterofmass.mp"> trianglecenterofmass.mp</a>
+<img align="middle" src="./png/trianglecenterofmass.1.png" alt=" trianglecenterofmass.1 ">
+</P>
+<P align="center"><a href="./example/triangulartrimesh.mp"> triangulartrimesh.mp</a>
+<img align="middle" src="./png/triangulartrimesh.1.png" alt=" triangulartrimesh.1 ">
+</P>
+<P align="center"><a href="./example/trig.mp"> trig.mp</a>
+<img align="middle" src="./png/trig.1.png" alt=" trig.1 ">
+</P>
+<P align="center"><a href="./example/trigonometry.mp"> trigonometry.mp</a>
+<img align="middle" src="./png/trigonometry.1.png" alt=" trigonometry.1 ">
+</P>
+<P align="center"><a href="./example/troncoconedef.mp"> troncoconedef.mp</a>
+<img align="middle" src="./png/troncoconedef.0.png" alt=" troncoconedef.0 ">
+</P>
+<P align="center"><a href="./example/tropicalglobe.mp"> tropicalglobe.mp</a>
+<img align="middle" src="./png/tropicalglobe.1.png" alt=" tropicalglobe.1 ">
+<img align="middle" src="./png/tropicalglobe.2.png" alt=" tropicalglobe.2 ">
+<img align="middle" src="./png/tropicalglobe.3.png" alt=" tropicalglobe.3 ">
+</P>
+<P align="center"><a href="./example/troysfear.mp"> troysfear.mp</a>
+<img align="middle" src="./png/troysfear.1.png" alt=" troysfear.1 ">
+</P>
+<P align="center"><a href="./example/tshirtfig.mp"> tshirtfig.mp</a>
+<img align="middle" src="./png/tshirtfig.1.png" alt=" tshirtfig.1 ">
+</P>
+<P align="center"><a href="./example/tuftescatter.mp"> tuftescatter.mp</a>
+<img align="middle" src="./png/tuftescatter.1.png" alt=" tuftescatter.1 ">
+</P>
+<P align="center"><a href="./example/twistflat.mp"> twistflat.mp</a>
+<img align="middle" src="./png/twistflat.1.png" alt=" twistflat.1 ">
+</P>
+<P align="center"><a href="./example/twistnlc.mp"> twistnlc.mp</a>
+<img align="middle" src="./png/twistnlc.1.png" alt=" twistnlc.1 ">
+</P>
+<P align="center"><a href="./example/twistroundbiax.mp"> twistroundbiax.mp</a>
+<img align="middle" src="./png/twistroundbiax.1.png" alt=" twistroundbiax.1 ">
+</P>
+<P align="center"><a href="./example/twocyclestogether.mp"> twocyclestogether.mp</a>
+<img align="middle" src="./png/twocyclestogether.1.png" alt=" twocyclestogether.1 ">
+</P>
+<P align="center"><a href="./example/twoDcolision.mp"> twoDcolision.mp</a>
+<img align="middle" src="./png/twoDcolision.1.png" alt=" twoDcolision.1 ">
+</P>
+<P align="center"><a href="./example/twoholes.mp"> twoholes.mp</a>
+<img align="middle" src="./png/twoholes.1.png" alt=" twoholes.1 ">
+</P>
+<P align="center"><a href="./example/twoplustwo.mp"> twoplustwo.mp</a>
+<img align="middle" src="./png/twoplustwo.1.png" alt=" twoplustwo.1 ">
+</P>
+<P align="center"><a href="./example/twosolarpanels.mp"> twosolarpanels.mp</a>
+<img align="middle" src="./png/twosolarpanels.1.png" alt=" twosolarpanels.1 ">
+</P>
+<P align="center"><a href="./example/twoupcones.mp"> twoupcones.mp</a>
+<img align="middle" src="./png/twoupcones.1.png" alt=" twoupcones.1 ">
+</P>
+<P align="center"><a href="./example/ubhtransients.mp"> ubhtransients.mp</a>
+<img align="middle" src="./png/ubhtransients.0.png" alt=" ubhtransients.0 ">
+</P>
+<P align="center"><a href="./example/ultraeye.mp"> ultraeye.mp</a>
+<img align="middle" src="./png/ultraeye.1.png" alt=" ultraeye.1 ">
+</P>
+<P align="center"><a href="./example/ultraimprovertex.mp"> ultraimprovertex.mp</a>
+<img align="middle" src="./png/ultraimprovertex.1.png" alt=" ultraimprovertex.1 ">
+<img align="middle" src="./png/ultraimprovertex.2.png" alt=" ultraimprovertex.2 ">
+<img align="middle" src="./png/ultraimprovertex.3.png" alt=" ultraimprovertex.3 ">
+</P>
+<P align="center"><a href="./example/unperfection.mp"> unperfection.mp</a>
+<img align="middle" src="./png/unperfection.1.png" alt=" unperfection.1 ">
+</P>
+<P align="center"><a href="./example/unperfectionremoved.mp"> unperfectionremoved.mp</a>
+<img align="middle" src="./png/unperfectionremoved.1.png" alt=" unperfectionremoved.1 ">
+</P>
+<P align="center"><a href="./example/vanallenbelt.mp"> vanallenbelt.mp</a>
+<img align="middle" src="./png/vanallenbelt.1.png" alt=" vanallenbelt.1 ">
+<img align="middle" src="./png/vanallenbelt.2.png" alt=" vanallenbelt.2 ">
+</P>
+<P align="center"><a href="./example/verygoodcone.mp"> verygoodcone.mp</a>
+<img align="middle" src="./png/verygoodcone.1.png" alt=" verygoodcone.1 ">
+</P>
+<P align="center"><a href="./example/wwfpmp.mp"> wwfpmp.mp</a>
+<img align="middle" src="./png/wwfpmp.1.png" alt=" wwfpmp.1 ">
+</P>
+<P align="center"><a href="./example/xcmplaca2buraquads.mp"> xcmplaca2buraquads.mp</a>
+<img align="middle" src="./png/xcmplaca2buraquads.1.png" alt=" xcmplaca2buraquads.1 ">
+</P>
+<P align="center"><a href="./example/xraycamera.mp"> xraycamera.mp</a>
+<img align="middle" src="./png/xraycamera.1.png" alt=" xraycamera.1 ">
+</P>
+<HR SIZE=4><BR><ADDRESS><A HREF="lnobreg at gmail">L. Nobre G.</A> </ADDRESS></BODY></HTML>
diff --git a/graphics/metapost/contrib/macros/featpost/README b/graphics/metapost/contrib/macros/featpost/README
new file mode 100644
index 0000000000..86d1dd241d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/README
@@ -0,0 +1,26 @@
+Welcome to FeatPost-0.8.8!
+ The file "MPexamples.html" contains the complete collection of examples
+ as raster PNG images and links to the source code of each one.
+ That same collection of examples is also in "doc" directory in the file
+ "doc/Exemplifier.pdf" as exact postscript diagrams but without links.
+ The user manual is also in the "doc" directory: "doc/featpostmanual.pdf".
+ There a smaller presentation version: "doc/featpostbeamer.pdf".
+ A wide-range tutorial can be found in "doc/metapostpropaganda.pdf".
+ The "doc/metapostpropagandafiles" directory contains additional examples.
+
+Please,
+ the first time you make a diagram with FeatPost-0.8.8, send me an e-mail
+ message with the subject "FeatPost". My address is lng@fct.unl.pt
+
+% This is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 3
+% of the License, or (at your option) any later version.
+
+% This set of macros is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+
+2014/OCT/01 L. Nobre G.
+
diff --git a/graphics/metapost/contrib/macros/featpost/bash/COMPILE.sh b/graphics/metapost/contrib/macros/featpost/bash/COMPILE.sh
new file mode 100755
index 0000000000..2493a95482
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/COMPILE.sh
@@ -0,0 +1,72 @@
+#! /bin/bash
+rm -fR mps png
+mkdir png
+mkdir mps
+cd example
+mpost --tex=latex graphs.mp
+mpost --tex=latex hexagonalgrid.mp
+mv graphs.? graphs.??? hexagonalgrid.? hexagonalgrid.??? ../
+cd ..
+echo \\documentclass[twocolumn]{article}\
+ \\usepackage[dvips]{epsfig}\
+ \\begin{document}\
+ \\title{Exemplifier}\
+ \\author{L. Nobre G.}\
+ \\date{\\today}\
+ \\maketitle\
+ \\begin{center}\
+ > Exemplifier.tex
+for a in example/*.mp
+do
+ b=`basename $a .mp`
+ mpost1.504 --tex=latex example/$b
+ for c in $b.?
+ do
+ echo \\vfill\
+ \\begin\{tabular\}\{c\}\
+ \\epsfig\{file=$c\,width=0.9\\columnwidth\} \\\\\
+ \\texttt\{$c\}\
+ \\end\{tabular\} \\\\ >> Exemplifier.tex
+ done
+done
+echo \\end{center}\\end{document} >> Exemplifier.tex
+latex Exemplifier.tex
+dvips -o Exemplifier.ps Exemplifier.dvi
+ps2pdf Exemplifier.ps
+#bzip2 Exemplifier.ps
+rm Exemplifier.aux
+rm Exemplifier.dvi
+rm Exemplifier.tex
+#mv Exemplifier.ps.bz2 doc/
+mv Exemplifier.pdf doc/
+cp *.? mps/
+echo "<HTML><HEAD><TITLE>MetaPost Examples</TITLE>"\
+ "<META NAME=\"KEYWORDS\" content=\"MetaPost, Examples, examples, code\">"\
+ "</HEAD><BODY TEXT=\"#000000\" LINK=\"#0000FF\" VLINK=\"#AA00AA\""\
+ "ALINK=\"#AA0000\" BGCOLOR=\"#b0c4de\">"\
+ "<H1><CODE>MetaPost</CODE> Examples</H1>" > MPexamples.html
+for a in example/*.mp
+do
+ b=`basename $a .mp`
+ echo "<P align=\"center\"><a href=\"./example/"$b.mp"\">"\
+ $b.mp"</a>" >> MPexamples.html
+ for c in $b.?
+ do
+###############################################################################
+ ./laproof.sh $c
+ ./pngmaker.sh $c.eps
+###############################################################################
+ echo "<img align=\"middle\" src=\"./png/"$c".png\" alt=\""\
+ $c "\">" >> MPexamples.html
+ done
+ echo "</P>" >> MPexamples.html
+done
+echo "<HR SIZE=4><BR><ADDRESS><A HREF=\"lnobreg at gmail\">L. Nobre G.</A>"\
+ "</ADDRESS></BODY></HTML>" >> MPexamples.html
+rm *.?
+rm *.?.aux *.?.latex *.?.dvi *.log *.?.mgk *.?.orig *.?.eps
+rm example/*.mpx *.mpx
+cd doc
+pdflatex featpostmanual.tex
+pdflatex featpostmanual.tex
+#rm -fR ../mps
diff --git a/graphics/metapost/contrib/macros/featpost/bash/dvipngproof.sh b/graphics/metapost/contrib/macros/featpost/bash/dvipngproof.sh
new file mode 100755
index 0000000000..47f334daaf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/dvipngproof.sh
@@ -0,0 +1,9 @@
+echo \\documentclass{minimal}\
+ \\usepackage{graphicx}\
+ \\begin{document}\
+ \\includegraphics{$1}\
+ \\end{document} > ZZZtemporarygarbage.tex
+latex ZZZtemporarygarbage.tex
+dvipng -v -D 100 -T tight -bg Transparent -o ZZZtemporarygarbage.png ZZZtemporarygarbage.dvi
+display ZZZtemporarygarbage.png &
+#rm ZZZtemporarygarbage.*
diff --git a/graphics/metapost/contrib/macros/featpost/bash/laproof.sh b/graphics/metapost/contrib/macros/featpost/bash/laproof.sh
new file mode 100755
index 0000000000..92b089d52e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/laproof.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+echo \\documentclass{minimal} > $1.latex
+echo \\usepackage[dvips]{epsfig} >> $1.latex
+echo \\begin{document} >> $1.latex
+echo \\epsfig{file=$1} >> $1.latex
+echo \\end{document} >> $1.latex
+latex $1.latex
+dvips -E -o $1.eps $1.dvi \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/bash/makehtmlindex.sh b/graphics/metapost/contrib/macros/featpost/bash/makehtmlindex.sh
new file mode 100755
index 0000000000..290d57d2fa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/makehtmlindex.sh
@@ -0,0 +1,29 @@
+#! /bin/bash
+#cd example
+#mpost --tex=latex graphs.mp
+#mv graphs.? graphs.??? ../
+#cd ..
+echo "<HTML><HEAD><TITLE>MetaPost Examples</TITLE>"\
+ "<META NAME=\"KEYWORDS\" content=\"MetaPost, Examples, examples, code\">"\
+ "</HEAD><BODY TEXT=\"#000000\" LINK=\"#0000FF\" VLINK=\"#AA00AA\""\
+ "ALINK=\"#AA0000\" BGCOLOR=\"#b0c4de\">"\
+ "<H1><CODE>MetaPost</CODE> Examples</H1>" > MPexamples.html
+for a in example/*.mp
+do
+ b=`basename $a .mp`
+ #mpost --tex=latex example/$b
+ echo "<P align=\"center\"><a href=\"./example/"$b.mp"\">"\
+ $b.mp"</a>" >> MPexamples.html
+ for c in $b.?
+ do
+ ./laproof.sh $c
+ ./pngmaker.sh $c.eps
+ echo "<img align=\"middle\" src=\"./png/"$c".png\" alt=\""\
+ $c "\">" >> MPexamples.html
+ done
+ echo "</P>" >> MPexamples.html
+done
+echo "<HR SIZE=4><BR><ADDRESS><A HREF=\"lnobreg at gmail\">L. Nobre G.</A>"\
+ "</ADDRESS></BODY></HTML>" >> MPexamples.html
+#rm *.?
+
diff --git a/graphics/metapost/contrib/macros/featpost/bash/pdflatexproof.sh b/graphics/metapost/contrib/macros/featpost/bash/pdflatexproof.sh
new file mode 100755
index 0000000000..44af955342
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/pdflatexproof.sh
@@ -0,0 +1,9 @@
+echo \\documentclass{minimal}\
+ \\usepackage{graphicx}\
+ \\DeclareGraphicsRule{*}{mps}{*}{}\
+ \\begin{document}\
+ \\includegraphics{$1}\
+ \\end{document} > ZZZtemporarygarbage.tex
+pdflatex ZZZtemporarygarbage.tex
+xpdf ZZZtemporarygarbage.pdf &
+#rm ZZZtemporarygarbage.* \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/bash/pngmaker.sh b/graphics/metapost/contrib/macros/featpost/bash/pngmaker.sh
new file mode 100755
index 0000000000..2d9bf5b359
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/bash/pngmaker.sh
@@ -0,0 +1,18 @@
+outf=`basename $1 eps`png
+prefwidth=160
+prefheigh=144
+prefratio=$(( 1000 * $prefwidth / $prefheigh ))
+tmpf=`mktemp pngmaker.XXXXXX`
+epstopdf --nogs -o $tmpf $1
+epswidth=`identify $tmpf | cut -d " " -f 3 | cut -d x -f 1`
+epsheigh=`identify $tmpf | cut -d " " -f 3 | cut -d x -f 2`
+aspectra=$(( 1000 * $epswidth / $epsheigh ))
+if test $aspectra -ge $prefratio
+then resol=$(( 116 * $prefwidth / $epswidth ))
+else resol=$(( 116 * $prefheigh / $epsheigh ))
+fi
+echo " Resolution:" $resol "dpi."
+gs -q -sDEVICE=pngalpha -r$resol -dNOPAUSE -sOutputFile=$outf -dTextAlphaBits=4 -dGraphicsAlphaBits=4 $tmpf </dev/null
+mv $outf png/
+rm $tmpf
+
diff --git a/graphics/metapost/contrib/macros/featpost/doc/Exemplifier.pdf b/graphics/metapost/contrib/macros/featpost/doc/Exemplifier.pdf
new file mode 100644
index 0000000000..e874dd8a43
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/Exemplifier.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/alldefs.txt b/graphics/metapost/contrib/macros/featpost/doc/alldefs.txt
new file mode 100644
index 0000000000..d1fae3e241
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/alldefs.txt
@@ -0,0 +1,176 @@
+Part I
+very basic
+ def X(expr A) =
+ def Y(expr A) =
+ def Z(expr A) =
+ def W(expr A) =
+ def conorm(expr A) =
+ def cmyknorm(expr A) = %% This is not good when MalcomX is true
+ def makecmyk( expr A, B ) =
+ def maketrio( expr A ) =
+Vector Calculus
+ def N(expr A) =
+ def cdotprod(expr A, B) =
+ def ccrossprod(expr A, B) =
+ def ndotprod(expr A, B) =
+ def ncrossprod(expr A, B) =
+ def paircrossprod(expr A, B) =
+ def getangle(expr A, B) =
+ def getcossine( expr Center, Radius ) =
+ vardef planarrotation( expr VecX, VecY, TheAngle ) =
+ def eulerrotation( expr AngA, AngB, AngC, Vec ) =
+ def rotvecaroundanother( expr Angle, RotVec, FixVec ) =
+ def inplanarvolume( expr PointPerpA, PointPerpB, Point ) =
+ def getanglepair( expr InVec ) =
+Auxiliary
+ def ps(expr A, Thicken_Factor) =
+ def signalvertex(expr A, TF, Col) =
+ def signalshadowvertex(expr A, TF, Col) =
+ def resolvec(expr A, B) =
+ def produce_vga_border =
+ def produce_auto_scale =
+ vardef cstr( expr Cl ) =
+ vardef bstr( expr bv ) =
+Fundamental
+ def rp(expr R) =
+ def vp(expr D) =
+ def cb(expr R) =
+ def projectpoint(expr ViewCentr, R) =
+ def lineintersectplan( expr LinePoi, LineDir, PlanPoi, PlanDir ) =
+Basic Functions
+ def pathofstraightline( expr A, B ) =
+ def drawsegment( expr A, B ) =
+ def cartaxes(expr axex, axey, axez) =
+ def orthaxes(expr axex, strx, axey, stry, axez, strz ) =
+ def angline(expr A, B, Or, W, S)(suffix RelPos) =
+ def anglinen(expr A, B, Or, W, S, RelPos) =
+ def squareangline(expr A, B, Or, W) =
+ def rigorouscircle( expr CenterPos, AngulMom, Radius ) =
+ def tdarrow(expr FromPos, ToTip ) =
+ def tdcircarrow(expr CenterPos, AngulMom, Ray, StartAngle, Amplituda ) =
+ def emptyline(expr JoinP,ThickenFactor,OutCol,InCol,theN,EmptyFrac,sN)(text LinFunc) =
+ def closedline( expr ThisIsClosed, theN, ForeFrac, BackFrac )( text LinFunc ) =
+ def twocyclestogether( expr CycleA, CycleB ) =
+ def ellipticpath(expr CenterPos, OneAxe, OtherAxe ) =
+ def ellipticshadowpath(expr CenterPos, OneAxe, OtherAxe ) =
+ def labelinspace(expr KeepRatio,RefPoi,BaseVec,UpVec)(text SomeString) =
+ def closedpathinspace( expr SomeTDPath, NDivide )( text ConverterFunc ) =
+Standard Objects
+ def goodcirclepath(expr CenterPos, AngulMom, Radius ) =
+ def circleshadowpath(expr CenterPos, AngulMom, Radius ) =
+ def head_on_circle(expr Pos, Radius ) =
+ def spatialhalfcircle(expr Center, AngulMom, Radius, ItsTheNearest ) =
+ def rigorousdisc(expr InRay, FullFill, BaseCenter, Radius, LenVec) =
+ def rigorouscone(expr UsualForm,CenterPos,AngulMom,Radius,VertexPos) =
+ def verygoodcone(expr BackDash,CenterPos,AngulMom,Radius,VertexPos) =
+ def rigorousfearpath(expr Center, Radius ) =
+ def rigorousfearshadowpath(expr Center, Radius ) =
+ def tropicalglobe( expr NumLats, TheCenter, Radius, AngulMom ) =
+ def whatisthis(expr CenterPos,OneAxe,OtherAxe,CentersDist,TheFactor) =
+ def spheroidshadow( expr CentrPoi, NorthPoleVec, Ray ) =
+ def spheroid( expr CentrPoi, NorthPoleVec, Ray ) =
+ def ellipsoid( expr Centr, AxOne, AxTwo, AxThr ) =
+ def ellipsoidshadow( expr Centr, AxOne, AxTwo, AxThr ) =
+ def revolparab( expr BaseCenter, ParabTip, BaseRay ) =
+ def fakehole( expr CenterPos, LenVec, Radius ) =
+ def kindofcube(expr WithDash, IsVertex, RefP, AngA, AngB, AngC, LenA, LenB, LenC ) =
+ def setthestage( expr NumberOfSideSquares, SideSize ) =
+ def setthearena( expr NumberOfDiameterCircles, ArenaDiameter ) =
+ def spatialhalfsfear(expr Center, AngulMom, Radius ) =
+Toroidal Stuff
+ def smoothtorus( expr Tcenter, Tmoment, Bray, Sray ) =
+ def torushadow( expr Tcenter, Tmoment, Bray, Sray ) =
+ def quartertorus( expr Tcenter, Tstart, Tfinis, Sray ) =
+ def pointinsidetorus( expr Point, Tcenter, Tmoment, Bray, Sray ) =
+ def pointrelativetotorus( expr Point, Tcenter, Tmoment, Bray, Sray ) =
+ def intersectorus( expr Tcenter, Tmoment, Bray, Sray, LinePoi, LineDir ) =
+Non-standard objects
+ def positivecharge( expr InFactPositive, Center, BallRay ) =
+ def simplecar(expr RefP, AngCol, LenCol, FronWheelCol, RearWheelCol ) =
+Differential Equations
+ def fieldlinestep( expr Spos, Step )( text VecFunc ) =
+ def fieldlinepath( expr Numb, Spos, Step )( text VecFunc ) =
+ def trajectorypath( expr Numb, Spos, Svel, Step )( text VecFunc ) =
+ def dragtrajectorypath( expr Spos, Svel, Step )( text VecFunc ) =
+ def magnetictrajectorypath( expr Numb, Spos, Svel, Step )( text VecFunc ) =
+Part II
+Advanced 3D-Object Definition Functions
+ vardef makeline@#( text vertices ) =
+ vardef makeface@#( text vertices ) =
+ vardef getready( expr commstr, refpoi ) =
+ def flipvector(expr A, B) =
+ def facevector(expr A, B, C) =
+ def masscenter(expr Nsides)(suffix Coords) =
+ def covervector(expr A, B, MassCenter) =
+ def themarkisinview(expr Mark, OwnFace) =
+ def maycrossviewplan(expr Ea, Eb, La, Lb) =
+ def crossingpoint(expr Ea, Eb, La, Lb) =
+ def crossingpointf(expr Ea, Eb, Fen) =
+ def maycrossviewplanf(expr Ea, Eb, Fen) =
+ def insidedge(expr Point, Ea, Eb) =
+ def insideviewsphere(expr Ea, Eb, La, Lb) =
+ def insidethistriangle(expr Point, A, B, C ) =
+ def insideviewtriangle(expr Point, Ea, Eb) =
+ def insidethisface(expr Point, FaN) =
+ def coarse_line(expr A, B, Facen, Press, Col) =
+ def facepath(expr Facen) =
+ def faceshadowpath(expr Facen) =
+ def face_invisible( expr Facen )( text LineAtribs ) =
+Different kinds of renderers
+ def sharpraytrace
+ def lineraytrace(expr Press, Col) =
+ def faceraytrace(expr Press, Col) =
+ def draw_all_test( expr AlsoDrawLines ) =
+ def fill_faces( text LineAtribs ) =
+ def doitnow =
+Nematic Liquid Crystal wise
+ def generatedirline(expr Lin, Phi, Theta, Long, Currpos ) =
+ def generatedirface(expr Fen, Phi, Theta, Long, Base, Currpos ) =
+ def generateonebiax(expr Lin, Phi, Theta, Long, SndDirAngl, Base, Currpos ) =
+ def director_invisible( expr SortEmAll, ThickenFactor, CyclicLines ) =
+ def circularsheet( expr CenterP, Rad, VecX, VecY, StartA, FinisA, Width ) =
+ def banana( expr CenterPos, Radius, AngleColor, Wid, Amp ) =
+Plotting
+ def hexagonaltrimesh( expr BeHexa,theN,SideSize )( text SurFunc ) =
+ def fillfacewithlight( expr FaceN ) =
+Part III
+parametric plots and another renderer
+ def face_drawfill( expr Facen, dmin_, dmax_ ,ColAtrib, ColAtribone ) =
+ def draw_invisible( expr Option, DoJS, ColAtrib, ColAtribone ) =
+ def bracket( expr low, poi, hig ) =
+ def partrimesh( expr nt,ns,lowt,higt,lows,higs,lowx,higx,lowy,higy,lowz,higz,facz)( text parSurFunc ) =
+Part IV
+automatic perspective tuning and minimization
+ def randomfear =
+ def renormalizevc( expr inF, inVC ) =
+ def calculatecost( expr TryF, TryVc, TrySp, TrySh ) =
+ def forcepointinsidefear( text A ) =
+ def forcepairinsidepage( text A ) =
+ def calculatejump( expr AverCost, PrevCost, RandCost, JumpLimit ) =
+ def photoreverse( expr IterNum, ExpTao, JumpFact ) =
+ def minimizestep( expr Abcisscolor )( text PlainFunc ) =
+Part V
+Intersections
+ def calculatecostver(expr VerA,DisA,VerB,DisB,VerC,DisC,TryV) =
+ def improvertex( expr VerA, DisA, VerB, DisB, VerC, DisC, IniV ) =
+ def ultraimprovertex( expr PlanPoi, PlanDir, BaseCenter, Radius, LenVec,
+ def necplusimprovertex( expr PlanPoi, PlanDir,
+ def intersectprolatespheroid( expr CentrPoi, NorthPoleVec, Ray,
+Part VI
+strictly two-dimensional
+ def is_cyclic expr cpath =
+ def springpath( expr begp, endp, piturnum, piturnproj, spgfrac ) =
+ def zigzagfrontier( expr begp, endp, nzigs, dev, zthick, tthick, fthick, excol, incol ) =
+ def randomcirc( expr radi, stddev, numpois ) =
+ def labeln(expr S, Pos, RelPos) =
+ def dotlabelrand(expr S, Pos ) =
+ def radialcross( expr A, la, B, lb, GoUp) =
+ def ropethread( expr Index ) =
+ def ropepattern( expr BasePath, RopeWidth, Nturns ) =
+ def firsttangencypoint( expr Path, Point, ResolvN ) =
+ def lasermachine( expr DefinedPath, Beam, CosLimit ) =
+ def startahead( expr DefinedPath, JumpTime ) =
+ def crossingline( expr FirstPath, SecondPath, TimeTolerance ) =
+ vardef segmentarea( expr Ps ) =
+ vardef cyclicpatharea( expr P ) = % result = area of the interior
+ vardef archangle@#( expr _p, _q, _s, archwidth ) text _t =
diff --git a/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.pdf b/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.pdf
new file mode 100644
index 0000000000..93220f5030
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.tex b/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.tex
new file mode 100644
index 0000000000..03583a2af3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/featpostbeamer.tex
@@ -0,0 +1,9 @@
+\documentclass[ignorenonframetext]{beamer}
+\usetheme{Pittsburgh}
+\setbeamercolor{normal text}{bg=red!7}
+\usepackage{xmpmulti}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \documentclass[11pt,oneside]{article}
+% \usepackage{beamerarticle,hyperref,a4wide}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\input{featpostdocsource}
diff --git a/graphics/metapost/contrib/macros/featpost/doc/featpostdocsource.tex b/graphics/metapost/contrib/macros/featpost/doc/featpostdocsource.tex
new file mode 100644
index 0000000000..00f6dfbdf8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/featpostdocsource.tex
@@ -0,0 +1,2072 @@
+\usepackage{amsmath,amssymb,graphicx,alltt}
+\DeclareGraphicsRule{*}{mps}{*}{}
+\graphicspath{{../mps/}}
+\newfont{\normald}{logod10 scaled 1024}
+\newcommand{\MF}{{\normald METAFONT}}
+\newcommand{\MP}{{\normald METAPOST}}
+\newcommand{\FP}{{\normald FEATPOST}}
+\newcommand{\changeableframetitle}[1]{\mode<presentation>{\frametitle{#1}}}
+\newcommand{\myem}[1]{\texttt{#1}}
+\title{\FP\ manual}
+\author{\href{mailto:lnobreg@gmail.com}{L. Nobre G.}}
+\date{0.8.8}
+\begin{document}
+\mode<article>{\maketitle}
+\frame{\titlepage}
+\frame{
+ \changeableframetitle{Abstract}
+ \FP\ is an extension of the \MP\ language that has a fairly large set of
+ \alert{feat}ures to facilitate the production of schematic diagrams, both in
+ three dimensions (3D) and in two dimensions (2D).
+
+ These schematic diagrams are vectorial and focus on the representation
+ of edges (unlike ray-traced raster images that focus on surfaces).
+}
+
+\mode<article>{\tableofcontents}
+
+\section{Getting started}
+
+\frame{
+ \changeableframetitle{Getting started}
+ \myem{input featpost3Dplus2D;}
+}
+
+\section{First taste of \FP}
+
+\frame{
+ \changeableframetitle{First taste of \FP}
+ Each perspective depends on the point of view. \FP\ uses the global
+ variable \myem{f}, of \myem{color} type, to store the $(X,Y,Z)$
+ space coordinates of the point of view. Also important is the aim of view
+ (global variable \myem{viewcentr}). This pair of points defines the line of
+ view.
+}
+
+\frame{
+ The perspective
+ consists of a projection from space coordinates into planar $(u,v)$
+ coordinates on the projection plane. \FP\ uses a projection plane that
+ is perpendicular to the line of view and contains the
+ \myem{viewcentr}. Furthermore, one of the projection plane axes is
+ horizontal and the other is perpendicular and on the projection plane.
+ ``Horizontal'' means parallel to the $XY$ plane.
+}
+
+\frame{
+ One consequence of this setup is that \myem{f} and \myem{viewcentr}
+ must not be on the same vertical line. The three kinds of projection known
+ to \FP\ are schematized in figures \ref{coniproj}, \ref{paraproj} and
+ \ref{spheproj}. The macro that actually does the projection is, in all
+ cases, \myem{rp}.
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \begin{tabular}{cc}
+ \includegraphics[width=65mm]{thethreekindsofperspec.2} &
+ \includegraphics[width=0.25\columnwidth]{cubicfigures.2}
+ \end{tabular}
+ \end{center}
+ \caption{Central projection (default).}
+ \label{coniproj}
+ \end{figure}
+}
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \begin{tabular}{cc}
+ \includegraphics[width=65mm]{thethreekindsofperspec.1} &
+ \includegraphics[width=0.25\columnwidth]{cubicfigures.1}
+ \end{tabular}
+ \end{center}
+ \caption{Parallel projection.}
+ \label{paraproj}
+ \end{figure}
+}
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \begin{tabular}{cc}
+ \includegraphics[width=65mm]{thethreekindsofperspec.3} &
+ \includegraphics[width=0.25\columnwidth]{cubicfigures.3}
+ \end{tabular}
+ \end{center}
+ \caption{Spherical projection. The
+ spherical projection is the composition of two operations: (i)~there
+ is a projection onto a sphere and (ii)~the sphere is plaited
+ onto the projection plane.}
+ \label{spheproj}
+ \end{figure}
+}
+
+\subsection{Bugs}
+
+\frame{
+ \changeableframetitle{Bugs}
+ It is important to keep in mind that some capabilities of \FP,
+ although usable, may be considered ``buggy'' or only partially
+ implemented. These include the drawing of cylinders with holes, as
+ in figure \ref{buggydisc}.
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \includegraphics[width=65mm]{fakehole.1}
+ \end{center}
+ \caption{\FP\ example containing a
+ \myem{rigorousdisc} with five holes, four of which are fake.}
+ \label{buggydisc}
+ \end{figure}
+}
+
+\subsection{Moving on, slowly}
+
+\frame{
+ \changeableframetitle{Moving on}
+ It is highly beneficial to
+ be able to understand and cope with \MP\ error messages as
+ \FP\ has no protection against mistaken inputs. One
+ probable cause of errors is the use of variables with the name of
+ procedures (macros), like
+ \begin{quote}
+\begin{alltt}
+X, Y, Z, W, N, rp, cb, ps, vp
+\end{alltt}
+ \end{quote}
+ All other procedure names have six or more characters.
+}
+
+\frame{
+ The user must be aware that \MP\ has a limited arithmetic power
+ and that the author has limited programming skills,
+ which may lead to unperfect 3D figures, very long processing
+ time or shear bugs.
+ It's advisable not to try very complex diagrams at first
+ and it's recommended to
+ keep 3D coordinates near order 1 (default \MP\ units).
+}
+
+\frame{
+ All three-dimensional \FP\ macros are build apon
+ the \MP\
+ \myem{color} variable type. It looks like this:
+ \begin{quote}
+\begin{alltt}
+(red,green,blue)
+\end{alltt}
+ \end{quote}
+
+ Its components may, nevertheless,
+ be arbtitrary numbers, like:
+ \begin{quote}
+\begin{alltt}
+(X,Y,Z)
+\end{alltt}
+ \end{quote}
+ So, the
+ \myem{color} type is adequate to define not only colors but
+ also 3D points and vectors.
+}
+
+\frame{
+ \changeableframetitle{Hello world}
+ One very minimalistic example program could be:
+ \begin{quote}
+\begin{alltt}
+input featpost3Dplus2D;
+beginfig(1);
+ cartaxes(1,1,1);
+endfig;
+end.
+\end{alltt}
+ \end{quote}
+ where \myem{cartaxes} is a
+ \FP\ macro that produces
+ the Cartesian reference frame with axis labels.
+}
+
+\frame{
+ The main variable of any three-dimensional figure is the
+ point of view. \FP\ uses the variable \myem{f}
+ as the point of view. \myem{Spread} is another global
+ variable that controls the size of the projection.
+ Therefore the minimalistic program above should also contain,
+ for example:
+ \begin{quote}
+\begin{alltt}
+f:=(6,1,3);
+Spread:=40;
+\end{alltt}
+ \end{quote}
+}
+
+\subsection{Why \FP?}
+
+\frame{
+ \changeableframetitle{Why \FP?}
+ \FP\ is good enough to produce scientific diagrams:
+ \begin{itemize}
+ \item Figure 1 of
+ \href{http://pre.aps.org/abstract/PRE/v60/i3/p2985_1}{\textit{Phys. Rev. E},
+ \textbf{60}, 2985-2989 (1999)}.
+ \item Figures 4, 6 and 8 of
+ \href{http://www.springerlink.com/content/pmwu8a2y9pkxr5rq/}{\textit{Eur.
+ Phys. J. E}, \textbf{2}, 351-358 (2000)}.
+ \item Figures 8 and 12 of
+ \href{http://www.springerlink.com/content/w41308176vnk7408/}{\textit{Eur.
+ Phys. J. E}, \textbf{20}, 55-61 (2006)}.
+ \end{itemize}
+}
+
+\subsection{A small subset of features}
+
+\subsubsection{Angles}
+
+\frame{
+ \changeableframetitle{Angles}
+ Some problems often require defining angles, and diagrams are
+ needed to visualize their meanings. The \myem{angline} and
+ \myem{squareangline} macros support this (see figure \ref{figcartaxes2}).
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \includegraphics[width=65mm]{cartaxes.2}
+ \end{center}
+ \caption{Example that uses \myem{cartaxes}, \myem{squareangline},
+ \myem{angline} and \myem{getangle}.}
+ \label{figcartaxes2}
+ \end{figure}
+}
+
+\subsubsection{Parametric lines}
+
+\frame{
+ \changeableframetitle{Parametric lines}
+ Visualizing parametric lines is another need. When two
+ lines cross, one should be able to see which line is in front of the
+ other. The macro \myem{emptyline} can help here (see figure
+ \ref{induction}).
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \includegraphics[width=65mm]{parafuso.1}
+ \end{center}
+ \caption{\FP\ diagram using \myem{emptyline}.}
+ \label{induction}
+ \end{figure}
+}
+
+\subsubsection{Curved solids}
+
+\frame{
+ \changeableframetitle{Curved solids}
+ \begin{sloppypar}
+ Some curved surface solid objects can be drawn with \FP. Among them
+ are cones (\myem{very\-good\-cone}), cylinders (\myem{rigorous\-disc})
+ and globes (\myem{trop\-ical\-globe}). These can also cast their shadows
+ on a horizontal plane (see figure
+ \ref{anddisc}). The production of shadows
+ involves the global variables \myem{LightSource}, \myem{ShadowOn}
+ and \myem{HoriZon}.
+ \end{sloppypar}
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \includegraphics[width=65mm]{stageforthree.3}
+ \end{center}
+ \caption{\FP\ diagram using
+ the macros \myem{rigorousdisc}, \myem{verygoodcone},
+ \myem{tropicalglobe} and \myem{setthestage}.}
+ \label{anddisc}
+ \end{figure}
+}
+
+\subsubsection{Fat sticks}
+
+\frame{
+ \changeableframetitle{Fat sticks}
+ One feature that merges 2D and 3D involves what might be called
+ ``fat sticks''. A fat stick resembles the Teflon magnets used to mix
+ chemicals. They have volume but can be drawn like a small straight
+ line segment stroked with a big \myem{pencircle}. Fat sticks may be used
+ to represent direction fields (unitary vector fields without arrows).
+ See figure \ref{nsmetica}.
+}
+
+\frame{
+ \begin{figure}[hbtp]
+ \begin{center}
+ \includegraphics[width=65mm]{nsmetica.1}
+ \end{center}
+ \caption{\FP\ direction field macro \myem{director\_invisible} was
+ used to produce this representation of the molecular structure of
+ a Smectic A liquid crystal.}
+ \label{nsmetica}
+ \end{figure}
+}
+
+\subsubsection{From 3D to 2D}
+
+\frame{
+ \changeableframetitle{From 3D to 2D}
+ The most important macro is \myem{rp} that converts 3D points
+ to two-dimensional (2D) rigorous, orthogonal
+ or fish-eye projections. To draw a line in
+ 3D-space try
+ \begin{quote}
+\begin{alltt}
+draw rp(a)--rp(b);
+\end{alltt}
+ \end{quote}
+ where
+ \myem{a} and \myem{b} are points in space
+ (of \myem{color} type).
+}
+
+\frame{
+ \changeableframetitle{``Straight lines''}
+ But if you're going for fish-eye it's better to
+ \begin{quote}
+\begin{alltt}
+draw pathofstraightline(a,b);
+\end{alltt}
+ \end{quote}
+ If
+ you don't know, leave it as
+ \begin{quote}
+\begin{alltt}
+drawsegment(a,b);
+\end{alltt}
+ \end{quote}
+}
+
+\subsubsection{Intersections}
+
+The most advanced feature of \FP\ is the
+ability to calculate the intersections of planar and
+convex polygons\footnote{Unfortunately, this is also the
+most "bugged" feature.}. It can draw the visible
+part of arbitrary sets of polygons as in
+the following program:
+\begin{quote}
+\begin{alltt}
+input featpost3Dplus2D;
+numeric phi;
+phi = 0.5*(1+sqrt(5));
+V1 := ( 1, phi,0);V2 := (-1, phi,0);
+V3 := (-1,-phi,0);V4 := ( 1,-phi,0);
+V5 := (0, 1, phi);V6 := (0,-1, phi);
+V7 := (0,-1,-phi);V8 := (0, 1,-phi);
+V9 := ( phi,0, 1);V10:= ( phi,0,-1);
+V11:= (-phi,0,-1);V12:= (-phi,0, 1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+beginfig(1);
+ sharpraytrace;
+endfig;
+end
+\end{alltt}
+\end{quote}
+See figure \ref{figsharpraytrace}.
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{sharpraytrace.1}
+ \end{center}
+ \caption{Intersecting polygons drawn with the macro \myem{sharpraytrace}.}
+ \label{figsharpraytrace}
+ \end{figure}
+}
+
+\subsubsection{Coming back to 3D from 2D}
+
+\frame{
+ \changeableframetitle{Coming back to 3D from 2D}
+ It is possible to do an "automatic perspective tuning"
+ with the aid of macro \myem{photoreverse}. Please, refer both to example
+ \myem{photoreverse.mp} (see figure \ref{figphotoreverse}) and to the
+ following web page:
+ \href{http://matagalatlante.org/nobre/hyt/technicaldrawfromphoto.html}{FeatPost
+ Deeper Technicalities}.
+}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=0.45\columnwidth]{photoreverse.1}
+ \end{center}
+ \caption{Example that uses \myem{photoreverse}. It may
+ not work when vertical lines are not vertical in
+ average on the photo.}
+ \label{figphotoreverse}
+ \end{figure}
+}
+
+The idea here is to: (i) have a \MP-coded vectorized image; (ii) associate 3D
+coordinates to a few specific points of the vectorized image; (iii)
+use \myem{photoreverse} to obtain the perspective parameters
+corresponding to the image; and (iv) use those perspective parameters to
+draw 3D matching schematic diagrams on the image.
+
+\subsubsection{Coming back to 3D from 1D}
+
+\frame{
+ \changeableframetitle{Coming back to 3D from 1D}
+ Using almost the same algorithm as \myem{photoreverse}, the
+ macro \myem{improvertex} allows one to approximate a
+ point in 3D-space with given distances $d$ from three other
+ points (an initial guess $\vec{i}$ is required).
+ \begin{center}
+ \myem{point := improvertex}( $\vec{a}$, $d_a$, $\vec{b}$, $d_b$,
+ $\vec{c}$, $d_c$, $\vec{i}$ );
+ \end{center}
+}
+
+\frame{
+ \changeableframetitle{\myem{ultraimprovertex}}
+ Approximating a
+ point in 3D-space with given distances from three other
+ points is the same as calculating the intersection of three spheres.
+ And the method to do that is the same as the method to calculate the
+ intersection of a plane, a cylinder and a spheroid (see figure
+ \ref{figultraimprove}).
+}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=0.45\columnwidth]{ultraimprovertex.1}
+ \end{center}
+ \caption{Example that uses \myem{ultraimprovertex}.}
+ \label{figultraimprove}
+ \end{figure}
+}
+
+\subsubsection{Scalar function minimization}
+
+\frame{
+ \changeableframetitle{Scalar function minimization}
+ Macro \myem{minimizestep} is a
+ minimization routine for scalar functions like $y=f(x)$ where an initial
+ triplet $(x_1,x_2,x_3)$ with $x_1<x_2<x_3$ is given as a parabolic squeleton that
+ provides a way to search for the smallest value of $y$ (if iterated).
+ \begin{center}
+ \myem{point := minimizestep}( $\vec{x}$ )( $f$ );
+ \end{center}
+}
+
+\mode<presentation>{\frame{
+ \changeableframetitle{The features}
+ 3D dots, vectors, flat and curved arrows, angles, parametric
+ lines, circles and ellipses, cuboids, cones, cylinders, cylindric
+ holes, parts of cylindrical surfaces, spheres and spheroids, globes,
+ hemispheres, tora, elliptical frusta, revolution paraboloids,
+ polygons, polyhedra, functional and parametric surfaces, direction
+ fields, field lines and trajectories in vector fields (differential
+ equations), schematic automobiles, schematic electric charges,
+ automatic perspective tuning, 2D representation of ropes, reference
+ horizontal surfaces, hexagonal plots, schematic 2D springs, zig--zag
+ lines, irregular circles, selective intersection of two circles, 2D
+ detection of tangency, paths for laser cutting machines,
+ minimization of scalar functions, intersection of 2D areas,
+ intersection point of three spheres, intersection point of a plane,
+ a cylinder and a spheroid, intersection of a straight line and a
+ spheroid, intersection of a straight line and a torus.
+
+ And much more.
+}}
+
+\section{Reference Manual}
+
+Some words about notation.
+The meaning of macro, function, procedure and routine is the same.
+Global variables are presented like this:
+\begin{quote}
+\begin{alltt}
+vartype var, anothervar
+anothervartype yetanothervar
+\end{alltt}
+\end{quote}
+Explanation of \myem{var}, \myem{anothervar} and
+\myem{yetanothervar}. \myem{vartype} can be any one of
+\MP\ types but the meaning
+of \myem{color} is a three-dimensional point or vector, not an
+actual color like yellow, black or white. If the meaning is
+an actual color then the type will be \myem{colour}.
+Most of the global variables have default values.
+
+Functions are presented like this:
+\begin{itemize}
+\item returntype {\bfseries function()}
+Explanation of this function. ``returntype'' can be any one of \MP\
+types plus global, draw, drawlabel or MD.
+``global'' means that the function
+changes some of the global variables. ``draw'' means that
+the function
+changes the currentpicture. ``drawlabel'' means that the
+function changes
+the currentpicture and adds text to it. ``MD'' means that the
+returntype is the same as the type of the arguments (1, 2, 3 or 4D,
+that is \myem{numeric}, \myem{pair}, \myem{color} or \myem{cmykcolor}).
+\begin{enumerate}
+\item \myem{type1}
+Explanation of the first argument. The type of
+one argument can be any one
+of \MP\ types plus \myem{suffix} or
+\myem{text}.
+\item \myem{type2}
+Explanation of the second argument.
+There is the possibility that the
+function has no arguments. In that case the
+function is presented like
+"\myem{returntype} {\bfseries function}".
+\item Etc.
+\end{enumerate}
+\end{itemize}
+
+\subsection{Global variables}
+
+\begin{quote}
+\begin{alltt}
+boolean ParallelProj
+boolean SphericalDistortion
+boolean MalcomX
+\end{alltt}
+\end{quote}
+Kind of projection calculated by \myem{rp}.
+By default projections
+are rigorous but if \myem{ParallelProj} is set
+\myem{true} then
+parallel lines remain parallel in the projection.
+It is the same as
+placing the point of view infinitely far without loosing
+sight.
+If \myem{SphericalDistortion} is set \myem{true}
+there will be a
+distortion coming from: (i) the projection being done
+on a sphere of
+center \myem{f} and (ii) this sphere being plaited
+onto the paper page.
+When \myem{MalcomX} is set \myem{true}, perspectives are calculated
+with the x coordinate (first coordinate) replaced by the fourth
+coordinate. The idea here is to use the fourth coordinate as ``time''
+and visualize yz projections of an animation in a single
+figure\footnote{To be developed in future versions.}.
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{rigorousdiscSD.1}
+ \end{center}
+ \caption{Figure that uses \myem{SphericalDistortion:=true}
+ and \myem{rigorousdisc}.}
+ \label{sphericaldisc}
+ \end{figure}
+}
+
+\begin{quote}
+\begin{alltt}
+color f, viewcentr
+\end{alltt}
+\end{quote}
+The point of view is \myem{f}. The plane or sphere
+of projection contains
+the center of view \myem{viewcentr}.
+The axis, parallel to zz, that contains the
+\myem{viewcentr} is projected on a vertical line.
+\begin{quote}
+\begin{alltt}
+numeric MaxFearLimit
+\end{alltt}
+\end{quote}
+The above variable defines the maximum allowed 3D distance between
+\myem{viewcentr} and the projection of a point as calculated by
+\myem{rp} (remember that 3D distances have no units). Everything
+located beyond this maximum is compressed into a circumference.
+\begin{quote}
+\begin{alltt}
+numeric Spread
+pair ShiftV, OriginProjPagePos
+numeric PageWidth
+numeric PageHeight
+\end{alltt}
+\end{quote}
+These variables control
+the placement of the projection on the
+paper. \myem{Spread} is the magnification
+and \myem{ShiftV} is the position of the
+\myem{viewcentr} projection on the
+paper. But, if at some point in your program you introduce
+\myem{produce\_auto\_scale} then the
+\myem{currentpicture} will be
+centered at \myem{OriginProjPagePos}
+and scaled to fit inside a rectangle of
+\myem{PageWidth} by \myem{PageHeight}.
+\begin{quote}
+\begin{alltt}
+color V[]
+color L[]p[]
+color F[]p[]
+\end{alltt}
+\end{quote}
+Vertexes, lines and faces.
+The idea here is to draw
+polygons and/or arbitrary lines in 3D space.
+Defining the polygons and
+the lines can be a bit tedious as \FP\ is not
+interactive\footnote{The lines could become the skeleton of NURBS.}.
+First, one defines a list of the
+vertexes (\myem{V[]}) that define the
+polygons and/or the lines.
+There is a list of polygons and a list of
+lines. Each polygon (\myem{F[]p[]}) or
+line (\myem{L[]p[]}) is itself a list of vertexes.
+All vertexes of the same poligon should belong
+to the same plane.
+\begin{quote}
+\begin{alltt}
+numeric NL
+numeric npl[]
+numeric NF
+numeric npf[]
+\end{alltt}
+\end{quote}
+Number of lines, number of vertexes of each line,
+number of faces, number of vertexes of each face.
+\begin{quote}
+\begin{alltt}
+numeric PrintStep
+\end{alltt}
+\end{quote}
+\myem{Printstep} is the size of iterative jumps
+along lines. Used by
+\myem{lineraytrace}, \myem{faceraytrace} and
+\myem{pathofstraightline}.
+Big \myem{Printstep}s make fast \myem{lineraytrace}ings.
+\begin{quote}
+\begin{alltt}
+boolean FCD[]
+colour TableC[]
+numeric TableColors
+numeric FC[]
+colour HigColor
+colour SubColor
+color LightSource
+\end{alltt}
+\end{quote}
+\myem{FCD} means "face color defined". The
+\myem{draw\_invisible} macro draws
+polygons in colour, if it is defined. The colour must be
+selected from the table of colours \myem{TableC} that has
+as many as \myem{TableColors}. The colour \myem{FC}
+of each polygon will depend on its position relatively to
+\myem{LightSource} where we suppose there is a lamp that
+emits light coloured \myem{HigColor}. Furthermore the
+colour of each polygon may be modified if it belongs to a
+functional or parametric surface. In this case, if we are
+looking at the polygon from below than \myem{SubColor} is
+subtracted from its colour.
+\begin{quote}
+\begin{alltt}
+numeric RopeColorSeq[]
+numeric RopeColors
+\end{alltt}
+\end{quote}
+The above variables are used by \myem{ropepattern}.
+
+\begin{quote}
+\begin{alltt}
+numeric TDAtiplen
+numeric TDAhalftipbase
+numeric TDAhalfthick
+\end{alltt}
+\end{quote}
+The above variables control the shape of Three-Dimensional Arrows.
+
+\begin{quote}
+\begin{alltt}
+boolean ShadowOn
+numeric HoriZon
+\end{alltt}
+\end{quote}
+When \myem{ShadowOn} is set \myem{true}, some objects can
+cast a black shadow on a horizontal plane of \myem{Z}
+coordinate equal to \myem{HoriZon} (an area from
+this plane may be drawn with \myem{setthestage} or with
+\myem{setthearena}) as if there is a punctual source of light at
+\myem{LightSource}.
+The macros that can produce shadows, in addition to their
+specific production, are
+\begin{itemize}
+\item \myem{emptyline}
+\item \myem{rigorousdisc}
+\item \myem{verygoodcone}
+\item \myem{tropicalglobe}
+\item \myem{positivecharge}
+\item \myem{whatisthis}
+\item \myem{spheroid}
+\item \myem{ellipsoid}
+\item \myem{kindofcube}
+\item \myem{draw\_all\_test}
+\item \myem{fill\_faces}
+\item \myem{smoothtorus}
+\end{itemize}
+All macros that contain {\bfseries shadow} in their name
+calculate the location of shadows using \myem{cb}. These are:
+\myem{circleshadowpath};
+\myem{signalshadowvertex};
+\myem{ellipticshadowpath};
+\myem{circleshadowpath};
+\myem{spheroidshadow};
+\myem{ellipsoidshadow};
+\myem{torushadow};
+\myem{rigorousfearshadowpath}; and
+\myem{faceshadowpath}.
+\begin{quote}
+\begin{alltt}
+path VGAborder
+\end{alltt}
+\end{quote}
+This path and the macro \myem{produce\_vga\_border} are
+meant to help you clip the \myem{currentpicture} to a 4:3
+rectangle as in a (old) movie frame.
+
+\begin{quote}
+\begin{alltt}
+pair PhotoPair[]
+color PhotoPoint[]
+numeric PhotoMarks
+\end{alltt}
+\end{quote}
+The above variables are used by \myem{photoreverse}.
+
+\begin{quote}
+\begin{alltt}
+pen ForePen, BackPen
+path CLPath
+numeric NCL
+\end{alltt}
+\end{quote}
+The above variables are used by \myem{closedline}.
+
+\begin{quote}
+\begin{alltt}
+boolean OverRidePolyhedricColor
+string ostr[]
+numeric ActuC, Nobjects, RefDist[]
+\end{alltt}
+\end{quote}
+\myem{OverRidePolyhedricColor} is used by \myem{fillfacewithlight}.
+\myem{Nobjects}, \myem{ostr} and \myem{RefDist[]} are auxiliary
+variables used by \myem{getready} and \myem{doitnow}.
+\myem{Actuc} is used both by \myem{hexagonaltrimesh} and
+by \myem{partrimesh}.
+
+\subsection{Definitions}
+
+\begin{itemize}
+\item global makeline@\#( text1)
+\item global makeface@\#( text1)
+\end{itemize}
+Both of these functions ease the task of
+defining lines and polygons. Just
+provide a list of vertexes in a correct
+sequence for each polygon and/or
+line. Suppose a tetrahedron
+\begin{quote}
+\begin{alltt}
+V3:=(+1,-1,-1);V2:=(-1,+1,-1);
+V4:=(+1,+1,+1);V1:=(-1,-1,+1);
+makeface2(1,2,3);makeface3(1,2,4);
+makeface1(3,4,1);makeface4(3,4,2);
+\end{alltt}
+\end{quote}
+The
+number in the last makeface or last
+makeline procedure name must be the
+number of polygons or lines. All polygons and lines from 1 upto this
+number must be defined but the sorting may be any of your liking.
+
+\subsection{Macros}
+
+\subsubsection{Very Basic Macros}
+
+\begin{itemize}
+\item numeric {\bfseries X()}
+Returns the first coordinate of a point or vector (triplet of
+color type) if \myem{MalcomX} is false but returns the fourth coordinate
+of a tetraplet (of cmykcolor type) if \myem{MalcomX} is true.
+\item numeric {\bfseries Y()}
+Returns the second coordinate of a point or vector.
+Replaces \myem{greenpart}.
+\item numeric {\bfseries Z()}
+Returns the third coordinate of a point or vector.
+Replaces \myem{bluepart}.
+\item numeric {\bfseries W()}
+Returns the fourth coordinate of a 4D point or vector.
+Replaces \myem{blackpart}.
+\item cmykcolor {\bfseries makecmyk()} Produces a tetraplet from a
+ triplet and a scalar.
+\item color {\bfseries maketrio()} This is, in fact, a projection from
+ 4D into 3D. The single input is a tetraplet and the output is a
+ triplet (the fourth coordinate is discarded). The output triplet
+ takes in consideration the value of \myem{MalcomX} (see \myem{X}).
+\item draw {\bfseries produce\_auto\_scale}
+The currentpicture is centered in, and adjusted
+to the size of, an A4
+paper page. This avoids the control of \myem{Spread} and
+\myem{ShiftV}.
+\item string {\bfseries cstr()} Converts a color into its
+string. Usefull in combination with \myem{getready}.
+\item string {\bfseries bstr()} Converts a boolean
+expression into its
+string. Usefull in combination with \myem{getready}.
+\end{itemize}
+
+\subsubsection{Vector Calculus}
+
+\begin{itemize}
+\item color {\bfseries N()} Unit vector. Returns
+\myem{black} (the null vector) when the argument has
+null norm. The "N" means "normalized".
+\item numeric {\bfseries cdotprod()} Dot product of two
+vectors.
+\item color {\bfseries ccrossprod()} Cross product of two
+vectors.
+\item numeric {\bfseries ndotprod()} Cossine of the angle
+beetween two vectors.
+\item color {\bfseries ncrossprod()} Normalized cross product
+of twovectors.
+\item numeric {\bfseries conorm()} Euclidean norm of a
+vector.
+\item numeric {\bfseries cmyknorm()} Euclidean norm of a
+4D vector. Should not be used when \myem{MalcomX} is \myem{true}.
+\item numeric {\bfseries getangle()} Angle beetween two
+vectors.
+\item numeric {\bfseries getcossine()} Cossine of the angle between
+ segment A and segment B, where A connects \myem{f} and the center of
+ a sphere, and where B contains \myem{f} and is tangent to that sphere.
+\item pair {\bfseries getanglepair()} Orientation angles
+of a vector. The first angle (\myem{xpart}) is
+measured beetween the vector projection on the \myem{XY}
+plane and the \myem{X} axis. The second angle
+(\myem{ypart}) is measured
+beetween the vector and its projection on the \myem{XY}
+plane. This may be usefull to find the arguments of
+\myem{kindofcube}
+\item color {\bfseries eulerrotation()} Three-dimensional
+rotation of a vector. See the figure \ref{kindofcube2} to visualize
+the following movement: (i) grab the \myem{X} component of the
+vector; (ii) rotate it on the \myem{XY} plane as
+much as the first argument;
+(iii) raise it up as much as the second argument; and
+(iv) turn it around as much as the third argument.
+\begin{enumerate}
+\item \myem{numeric} Angle of rotation around the
+\myem{Z} component.
+\item \myem{numeric} Angle of rotation around the
+rotated \myem{Y} component.
+\item \myem{numeric} Angle of rotation around the
+two times rotated \myem{X} component.
+\item \myem{color} Vector to be rotated.
+\end{enumerate}
+\item color {\bfseries randomfear} Generates a randomly
+oriented unit vector.
+\item MD {\bfseries planarrotation($\vec{A},\vec{B},\theta$)} $=\vec{A}\cos\theta+\vec{B}\sin\theta$
+\item color {\bfseries rotvecaroundanother} Rotates a vector around
+ another.
+\begin{enumerate}
+\item \myem{numeric} Angle of rotation around the fixed vector.
+\item \myem{color} Vector to be rotated.
+\item \myem{color} Fixed vector.
+\end{enumerate}
+
+\end{itemize}
+
+
+
+\subsubsection{Projection Macros}
+
+\begin{itemize}
+\item pair {\bfseries rp()} Converts spatial positions into
+planar positions on the paper page. The conversion
+considers the values of the following global
+variables: \myem{viewcentr},
+\myem{ParallelProj}, \myem{SphericalDistortion},
+\myem{Spread}, \myem{ShiftV} and \myem{MaxFearLimit}. When both
+\myem{ParallelProj} and \myem{SphericalDistortion}
+are \myem{false} it won't work if either (i) the
+vectors \myem{f-viewcentr} and \myem{f-R} are
+perpendicular (\myem{R} is the argument) or (ii)
+\myem{f} and \myem{viewcentr} share the same
+\myem{X} and \myem{Y} coordinates.
+\begin{enumerate}
+\item \myem{color} Spatial position.
+\end{enumerate}
+\item pair {\bfseries vp()} Converts spatial directions into
+planar positions on the paper page. These positions are the
+vanishing points of those directions. The conversion
+considers the values of the same global
+variables as \myem{rp}.
+\begin{enumerate}
+\item \myem{color} Spatial direction.
+\end{enumerate}
+\item color {\bfseries cb()} Calculates the position of the
+shadow of a point. Uses \myem{HoriZon} and
+\myem{LightSource}.
+\begin{enumerate}
+\item \myem{color} Point position.
+\end{enumerate}
+\item color {\bfseries projectpoint()} Calculates the
+intersection beetween a plane and a straight
+line. The plane contains a given point and is
+perpendicular to the line connecting the
+\myem{LightSource} and this same point.
+The line is defined by another given point and the
+\myem{LightSource}. Summary: \myem{projectpoint}
+returns the projection of the second argument on a
+plane that contains the first argument. Can be used to
+draw shadows cast on generic planes.
+\begin{enumerate}
+\item \myem{color} Origin of the projection plane.
+\item \myem{color} Point to be projected.
+\end{enumerate}
+\item color {\bfseries lineintersectplan()} Calculates the
+intersection beetween a generic plane and a straight
+line. The plane contains a given point and is
+perpendicular to a given vector.
+The line contains a given point and is parallel to
+a given vector.
+\begin{enumerate}
+\item \myem{color} Point of the line.
+\item \myem{color} Vector parallel to the line.
+\item \myem{color} Point of the projection plane.
+\item \myem{color} Vector perpendicular to the
+projection plane.
+\end{enumerate}
+\item numeric {\bfseries ps()} Used by \myem{signalvertex}.
+\end{itemize}
+
+
+\subsubsection{Plain Basic Macros}
+
+\begin{itemize}
+\item draw {\bfseries signalvertex()} Draws a dot
+sized inversely proportional to its distance from
+the viewpoint \myem{f}.
+\begin{enumerate}
+\item \myem{color} Location.
+\item \myem{numeric} Factor of proportionality
+("size of the dot").
+\item \myem{colour} Colour of the dot.
+\end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{torus.1}
+ \end{center}
+ \caption{Figure that uses \myem{signalvertex}.}
+ \end{figure}
+}
+\item path {\bfseries pathofstraightline()} When using
+\myem{SphericalDistortion:=true}, straight lines
+look like curves. This macro returns the curved path
+of a straight line beetween two points. This path will
+have a greater \myem{length} ("time") when
+\myem{PrintStep} is made smaller.
+\item draw {\bfseries drawsegment()} Alternative
+\myem{pathofstraightline} that avoids the
+calculation of all the intermediate points when
+\myem{SphericalDistortion:=false}.
+\item drawlabel {\bfseries cartaxes()}
+Cartesean axis with prescribed lenghtes and apropriate labels.
+\begin{enumerate}
+\item \myem{numeric} Length of the \myem{X} axis.
+\item \myem{numeric} Length of the \myem{Y} axis.
+\item \myem{numeric} Length of the \myem{Z} axis.
+\end{enumerate}
+\item drawlabel {\bfseries orthaxes()}
+Cartesean axis with prescribed lenghtes and prescribed labels.
+\begin{enumerate}
+\item \myem{numeric} Length of the \myem{X} axis.
+\item \myem{label} Label of the \myem{X} axis.
+\item \myem{numeric} Length of the \myem{Y} axis.
+\item \myem{label} Label of the \myem{Y} axis.
+\item \myem{numeric} Length of the \myem{Z} axis.
+\item \myem{label} Label of the \myem{Z} axis.
+\end{enumerate}
+\item draw {\bfseries emptyline()} This procedure produces
+a sort of a tube that can cross over itself. It
+facilitates the drawing of, for instance, thick
+helical curves but it won't
+look right if the curves are drawn getting apart from
+the point of view. Please, accept this inconveniance.
+As like many other \FP\ macros this one
+can produce visually correct diagrams only in limited
+conditions. Can cast a shadow.
+\begin{enumerate}
+\item \myem{boolean} Choose \myem{true} to join
+this line with a previously drawn line.
+\item \myem{numeric} Factor of proportionality
+("diameter of the tube"). The tubes are just
+sequences of dots drawn by \myem{signalvertex}.
+\item \myem{colour} Colour of the tube border.
+\item \myem{colour} Colour of the tube.
+\item \myem{numeric} Total number of dots on the
+tube line.
+\item \myem{numeric} Fraction of the tube diameter
+that is drawn with the tube colour.
+\item \myem{numeric} This is the number of dots
+that are redrawn with the colour of the tube for
+each drawn dot with the color of the tube
+border. Usually 1 or 2 are enough.
+\item \myem{text} This is the name a function
+that returns a 3D point of the line for each value
+of a parameter in beetween 0 and 1.
+\end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{joinedemptylines.1}
+ \end{center}
+ \caption{Figure that uses \myem{emptyline}.
+ The junction point of two different lines is indicated
+ by an arrow. }
+ \label{joinedemptylines}
+ \end{figure}
+}
+\item draw {\bfseries closedline()} This procedure produces
+a tube that can cross over itself. It
+facilitates the drawing of, for instance, thick
+helical curves but it won't
+look right as its thickness does not change with the
+distance from the point of view. The drawing is
+entirely done in two dimensions, so the tube diameter
+depends on the global variables \myem{ForePen} and
+\myem{BackPen}. There can be more than one
+line in a figure but all get the same diameter.
+When calling \myem{closedline()} in different
+figures of the same program you must reinitialize both
+\myem{NCL} and \myem{Nobjects} (because
+\myem{closedline()} uses \myem{getready()}).
+\begin{enumerate}
+\item \myem{boolean} Value of "the line is closed".
+\item \myem{numeric} Total number of path segments
+on the tube line.
+\item \myem{numeric} Use 0.5 or more.
+\item \myem{numeric} Use 0.75 or more.
+\item \myem{text} This is the name of a function
+that returns a 3D point of the line for each value
+of a parameter in beetween 0 and 1.
+\end{enumerate}
+\item drawlabel {\bfseries angline()}
+Draws an arch beetween two straight lines with a
+common point and places a label
+near the middle of the arch (marks an
+angle). Note that the arch is not circular.
+\begin{enumerate}
+\item \myem{color} Point of one line.
+\item \myem{color} Point ot the other line.
+\item \myem{color} Common point.
+\item \myem{numeric} Distance beetween the arch and
+the common point.
+\item \myem{picture} Label.
+\item \myem{suffix} Position of the label relatively
+to the middle of the arch. May
+be one of \myem{lft, rt, top, bot, ulft, urt,
+llft} and \myem{lrt}.
+\end{enumerate}
+\item drawlabel {\bfseries anglinen()}
+The same as the previous function but the
+sixth argument is numeric:
+0=\myem{rt};
+1=\myem{urt};
+2=\myem{top};
+3=\myem{ulft};
+4=\myem{lft};
+5=\myem{llft};
+6=\myem{bot};
+7=\myem{lrt};
+any other number places the label
+on the middle of the arch.
+\item draw {\bfseries squareangline()}
+This is supposed to mark 90 degree angles
+but works for any angle value.
+\begin{enumerate}
+\item \myem{color} Point of one line.
+\item \myem{color} Point ot the other line.
+\item \myem{color} Common point.
+\item \myem{numeric} Distance beetween the "arch"
+and the common point.
+\end{enumerate}
+\item path {\bfseries rigorouscircle()}
+3D circle. The total "time" of this path is 8. This
+small number makes it easy to select parts of the
+path. The circle is drawn using the
+"left-hand-rule". If you put your left-hand thumb
+parallel the circle axis then the other left-hand
+fingers curl in the same sense as the circle
+path. This path allways starts, approching the view
+point, from a point on a diameter of the
+circle that projects orthogonaly to its axis, and
+rotating around the axis in the way of the left-hand-rule.
+\begin{enumerate}
+\item \myem{color} Center of the circle.
+\item \myem{color} Direction orthogonal to the
+circle (circle axis).
+\item \myem{numeric} Radius of the circle.
+\end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=0.45\columnwidth]{anglinerigorouscircle.1}
+ \end{center}
+ \caption{Figure that uses \myem{anglinen}
+ and \myem{rigorouscircle}.}
+ \end{figure}
+}
+\item draw {\bfseries tdarrow()} Draws a flat arrow that
+begins at the first argument and ends at the second.
+The shape of the arrow is controled by the global
+variables \myem{TDAtiplen, TDAhalftipbase, TDAhalfthick}.
+This arrow is drawn on the plane that maximizes the perspective of its
+width. Also, the tip is contracted when \myem{TDAtiplen} is larger
+than the length of the arrow.
+\item draw {\bfseries tdcircarrow()} Draws a flat curving arrow. The
+ curve is a circular arch on a plane.
+The shape of the arrow is controled both by the global
+variables \myem{TDAtiplen, TDAhalftipbase, TDAhalfthick} and by the
+three last arguments.
+\begin{enumerate}
+\item \myem{color} Position of the center ($\vec{c}$).
+\item \myem{color} Vector perpendicular to the plane $P$ that contains the
+ arrow (rotation axis $\vec{A}$).
+\item \myem{numeric} Curve ray.
+\item \myem{numeric} Arrow starting angle. Note that the angle is measured
+ relative to the axis pointing from $\vec{c}$ to \myem{f} and
+ projected onto $P$ ($\vec{B}$). The angle is positive when it
+ approaches $\vec{A}\times\vec{B}$.
+\item \myem{numeric} Angular amplitude of the curve (may be negative).
+\end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=0.45\columnwidth]{tdcircarrow.1}
+ \end{center}
+ \caption{Figure that uses \myem{tdarrow}
+ and \myem{tdcircarrow}.}
+ \end{figure}
+}
+\item path {\bfseries twocyclestogether()} This macro
+allows you to draw any solid that has no vertexes
+and that has two, exactly two, planar cyclic edges.
+In fact, it doesn't need to be a solid. Just
+provide the pathes of both cyclic edges as arguments
+but note that the returned path is polygonal.
+In order to complete
+the drawing of this solid you have to choose one of
+the edges to be drawn immediatly afterwards. This is
+done automatically by the \myem{whatisthis} macro
+for the case of two parallel and concentric ellipses.
+\item path {\bfseries ellipticpath()} Produces an elliptic
+path in 3D space.
+\begin{enumerate}
+\item \myem{color} Position of the center.
+\item \myem{color} Major or minor axis.
+\item \myem{color} The other axis.
+\end{enumerate}
+\item drawlabel {\bfseries labelinspace()} Draw some 2D
+\myem{picture} on some 3D plane (only when
+\myem{ParallelProj:=true}). Just \myem{Transform}s the
+ label in the same
+ way as its bounding box, that is, the same way as two perpendicular sides
+ of its bounding box. This is only exact for parallel perspectives.
+\begin{enumerate}
+\item \myem{color} Position for the lower-left
+corner.
+\item \myem{color} Orientation of the picture's
+bottom edge.
+\item \myem{color} Orientation of the picture's
+letf edge.
+\item \myem{text} 2D picture's name.
+\end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{labelinspace.1}
+ \end{center}
+ \caption{Example that uses \myem{labelinspace}.}
+ \end{figure}
+}
+\end{itemize}
+
+
+\subsubsection{Standard Objects}
+
+\begin{itemize}
+\item path {\bfseries goodcirclepath()}
+Another 3D circle macro. More rigorous
+than \myem{rigorouscircle} but when
+the direction ortogonal to the circle is almost
+orthogonal to the line \myem{viewpoint--center}
+it doesn't work correctly.
+The total "time" of this path is 36.
+\begin{enumerate}
+\item \myem{color} Center of the circle.
+\item \myem{color} Direction ortogonal to
+the circle.
+\item \myem{numeric} Radius of the
+circle.
+\end{enumerate}
+\item draw {\bfseries spatialhalfsfear()} An
+hemisphere. Doesn't work with \myem{f} inside it.
+\begin{enumerate}
+\item \myem{color} Center.
+\item \myem{color} Vector ortogonal to
+the frontier circle and pointing
+out of the concavity.
+\item \myem{numeric} Radius of the
+(hemi)sphere.
+\end{enumerate}
+\item path {\bfseries spatialhalfcircle()}
+And yet another 3D circle macro. Only the visible or the hidden
+part. This is usefull to mark sections of
+cylinders or spherical major circles.
+\begin{enumerate}
+\item \myem{color} Center of the circle.
+\item \myem{color} Direction ortogonal to the
+circle.
+\item \myem{numeric} Radius of the circle.
+\item \myem{boolean} The visible part is selected with
+\myem{true} and the hidden
+with \myem{false}.
+\end{enumerate}
+\item draw {\bfseries rigorousdisc()}
+3D opaque cylinder with/without a hole. Can cast a
+shadow (without the hole).
+\begin{enumerate}
+\item \myem{numeric} Ray of an axial hole.
+\item \myem{boolean} Option for completly opaque cylinder
+(\myem{true}) or partial
+pipe (\myem{false}) when there is no hole. When
+the cylinder has an hole this option should be
+\myem{true}.
+\item \myem{color} Center of one circular base.
+\item \myem{numeric} Radius of both circular bases.
+\item \myem{color} Vector that defines the length and
+orientation of the
+cylinder. The addition the third and fifth
+arguments should give the
+position of the center of the other circular base.
+\end{enumerate}
+\item draw {\bfseries verygoodcone()} 3D cone. Can cast a shadow.
+\begin{enumerate}
+\item \myem{bolean} Option to draw dashed evenly
+the invisible edge (\myem{true}) or not
+(\myem{false}).
+\item \myem{color} Center of the circular base.
+\item \myem{color} Direction ortogonal to the
+circular base.
+\item \myem{numeric} Radius of the circular base.
+\item \myem{color} Position of the vertex
+\end{enumerate}
+\item path {\bfseries rigorousfearpath()}
+3D sphere. Simple but hard.
+\begin{enumerate}
+\item \myem{color} Center position.
+\item \myem{numeric} Radius.
+\end{enumerate}
+\item draw {\bfseries tropicalglobe()} Globe with
+minor circles. Can cast a shadow.
+\begin{enumerate}
+\item \myem{numeric} Number of marked latitudes.
+\item \myem{color} Center position.
+\item \myem{numeric} Radius
+\item \myem{color} Axis orientation.
+\end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{tropicalglobe.1}
+ \end{center}
+ \caption{Figure that uses \myem{tropicalglobe}.}
+ \end{figure}
+}
+\item draw {\bfseries spheroid()} Revolution ellipsoid. Can cast a shadow.
+\begin{enumerate}
+\item \myem{color} Center position.
+\item \myem{color} Position of one pole relative to the center.
+\item \myem{numeric} Radius
+\end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{revolipsoid.2}
+ \end{center}
+ \caption{Figure that uses \myem{spheroid}.}
+ \end{figure}
+}
+\item draw {\bfseries whatisthis()} An elliptic
+frustum. Both edges are elliptic an have the same
+orientation but one may be greater than the other.
+Can cast a shadow.
+\begin{enumerate}
+\item \myem{color} Reference edge center.
+\item \myem{color} Major or minor axis.
+\item \myem{color} The other axis.
+\item \myem{numeric} Length of the original
+cylinder.
+\item \myem{numeric} Edges axis length ratio.
+\end{enumerate}
+\item draw {\bfseries kindofcube()} Polyhedron with six
+orthogonal faces (cuboid).
+\begin{enumerate}
+\item \myem{boolean} Also draw the invisible edges
+\myem{dashed evenly} (\myem{true}) or do not.
+\item \myem{boolean} The reference point may be a
+vertex (\myem{true}) or the center(\myem{false}).
+\item \myem{color} Reference point.
+\item \myem{numeric} Alpha1.
+\item \myem{numeric} Alpha2.
+\item \myem{numeric} Alpha3.
+\item \myem{numeric} L1. Length of the first side.
+\item \myem{numeric} L2. Length of the second side.
+\item \myem{numeric} L3. Length of the third side.
+\end{enumerate}
+These arguments are represented in figure \ref{kindofcube2}.
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{kindofcube.2}
+ \end{center}
+ \caption{Figure that uses and explains
+ \myem{kindofcube}. Note that the three indicated
+ angles may be used as arguments of \myem{eulerrotation}.}
+ \label{kindofcube2}
+ \end{figure}
+}
+\item draw {\bfseries setthestage()} Produces an horizontal
+square made of squares. Its \myem{Z} coordinate is defined by
+\myem{HoriZon}.
+\begin{enumerate}
+\item \myem{numeric} Number of squares in each side.
+\item \myem{numeric} Size of each side.
+\end{enumerate}
+\item draw {\bfseries setthearena()} Produces an horizontal
+circle made of circles. Its \myem{Z} coordinate is defined by
+\myem{HoriZon}. Due to the fact that the center of a
+circle is not on the center of its central perspective
+projection, this may look a bit strange.
+\begin{enumerate}
+\item \myem{numeric} Number of circles on a
+diameter.
+\item \myem{numeric} Diameter.
+\end{enumerate}
+\item draw {\bfseries smoothtorus()} Toxic donut (not to be
+eaten). Produces an error message when \myem{f} is
+close to the table. Can cast a shadow.
+\begin{enumerate}
+\item \myem{color} Center.
+\item \myem{color} Direction orthogonal to the
+torus plane.
+\item \myem{numeric} Big ray.
+\item \myem{numeric} Small ray.
+\end{enumerate}
+\end{itemize}
+
+
+\subsubsection{Composed Objects}
+
+\begin{itemize}
+\item draw {\bfseries positivecharge()} Draws a sphere with a
+plus or minus sign on the surface. The horizontal
+segment of the sign is drawn on the horizontal plane
+that contains the sphere center. The middle point of
+this segment is on a vertical plane containing the
+viewpoint.
+\begin{enumerate}
+\item \myem{boolean} Selects the sign (\myem{true}
+means positive).
+\item \myem{color} Position of the center.
+\item \myem{numeric} Sphere ray.
+\end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=0.55\columnwidth]{positivecharge.1}
+ \end{center}
+ \caption{Figure that uses \myem{positivecharge},
+ \myem{getready} and \myem{doitnow}.}
+ \end{figure}
+}
+\item draw {\bfseries simplecar()} Draws a cuboid and four
+discs in a configuration ressembling an automobile. The
+first three arguments of \myem{simplecar} are the same
+as the the last seven arguments of \myem{kindofcube}
+but grouped in colors.
+\begin{enumerate}
+\item \myem{color} Center of the cuboid that
+constitutes the body of the car..
+\item \myem{color} Angles defining the orientation
+of the car (see \myem{kindofcube}).
+\item \myem{color} Dimensions of the car.
+\item \myem{color} Characteristics of the front
+wheels. \myem{redpart}-distance from the
+front. \myem{greenpart}-width of the front wheels (length
+of the cylinders). \myem{bluepart}-wheel ray.
+\item \myem{color} Same as above for the rear wheels
+\end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{simplecar.1}
+ \end{center}
+ \caption{Figure that uses \myem{setthearena} and
+ \myem{simplecar}.}
+ \end{figure}
+}
+
+\item draw {\bfseries banana()} Draws a cylindrical strip with a mark in
+ the middle angle.
+ \begin{enumerate}
+ \item \myem{color} Center of the base circle.
+ \item \myem{numeric} Radius.
+ \item \myem{color} Euler angles for the orientation of the strip
+ (uses \myem{eulerrotation} as if the cylindrical strip axis is the rotation
+ of $\hat{z}$).
+ \item \myem{numeric} Length of the cylindrical strip.
+ \item \myem{numeric} Angular amplitude of half of the cylindrical strip.
+ \end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{bananadimmer.1}
+ \end{center}
+ \caption{Figure that uses \myem{banana}.}
+ \end{figure}
+}
+
+\item draw {\bfseries quartertorus()} Draws a part of a torus.
+ \begin{enumerate}
+ \item \myem{color} Center of the base torus.
+ \item \myem{color} Vector indicating the position, relative to the
+ center of the base torus, of the center of the circle obtained by
+ cutting the base torus through a plane containing its axle.
+ \item \myem{color} Vector indicating the orientation of another
+ similar cutting plane (the norm of vector has no meaning).
+ \item \myem{numeric} Radius of cross-section circles.
+ \end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{quartertorus.2}
+ \end{center}
+ \caption{Figure that uses \myem{quartertorus}.}
+ \end{figure}
+}
+
+\end{itemize}
+
+
+\subsubsection{Shadow Pathes}
+
+Please remember that not all shadows are pathes.
+\begin{itemize}
+\item draw {\bfseries signalshadowvertex()} Draws the
+shadow of a \myem{signalvertex} dot. Used by \myem{emptyline}.
+\begin{enumerate}
+\item \myem{color} Location of the light-blocking dot.
+\item \myem{numeric} Factor of proportionality
+("size of the dot").
+\item \myem{colour} Colour of the dot.
+\end{enumerate}
+\item path {\bfseries ellipticshadowpath()} Produces the
+shadow of an elliptic path.
+\begin{enumerate}
+\item \myem{color} Position of the center.
+\item \myem{color} Major or minor axis.
+\item \myem{color} The other axis.
+\end{enumerate}
+\item path {\bfseries circleshadowpath()} Produces the
+shadow of a circle.
+\begin{enumerate}
+\item \myem{color} Center of the circle.
+\item \myem{color} Direction ortogonal to
+the circle.
+\item \myem{numeric} Radius of the
+circle.
+\end{enumerate}
+\item path {\bfseries rigorousfearshadowpath()}
+3D sphere shadow.
+\begin{enumerate}
+\item \myem{color} Center position.
+\item \myem{numeric} Radius.
+\end{enumerate}
+\end{itemize}
+
+
+\subsubsection{Differential Equations}
+
+Before we proceed, be aware that solving differential
+equations (DE) is mainly an experimental activity. The most
+probable result of a procedure that atempts to solve a DE
+is garbage. The procedure may be unstable, the solution
+may be littered with singularities or something may go
+wrong. If you don't have a basic understanding of
+differential equations then skip this section, please.
+
+\begin{itemize}
+\item path {\bfseries fieldlinepath()} A vectorial field line is
+everywhere tangent to the field vectors.
+Two different parallel fields
+have the same field lines. So the field only
+constrains the direction of the field lines, not any kind
+of "speed" and, therefore, it is recommended to
+normalize the field before using this macro that
+contains a second-order Runge-Kutta method
+implementation.
+\begin{enumerate}
+\item \myem{numeric} Total number of steps.
+\item \myem{color} Initial position.
+\item \myem{numeric} Step (arc)length.
+\item \myem{text} Name of the function that
+returns a field vector for each 3D position.
+\end{enumerate}
+\item path {\bfseries trajectorypath()} The acceleration of a
+particle in a conservative force field is equal to the
+ratio (conservative force)/(particle mass). The
+acceleration is also equal to the second order time
+derivative of the particle position. This produces a
+second order differential equation that we solve using a
+second-order Runge-Kutta method implementation.
+\begin{enumerate}
+\item \myem{numeric} Total number of steps.
+\item \myem{color} Initial position.
+\item \myem{color} Initial velocity.
+\item \myem{numeric} Time step.
+\item \myem{text} Name of the function that
+returns a (force/mass) vector for each 3D position.
+\end{enumerate}
+\item path {\bfseries magnetictrajectorypath()} The
+acceleration of a
+charged particle in a magnetic field is equal to the
+ratio (magnetic force)/(particle mass) but the magnetic
+force depends on both the velocity and the magnetic field. The
+acceleration is also equal to the second order time
+derivative of the particle position. This produces a
+second order differential equation that we solve using a
+fourth-order Runge-Kutta method implementation.
+\begin{enumerate}
+\item \myem{numeric} Total number of steps.
+\item \myem{color} Initial position.
+\item \myem{color} Initial velocity.
+\item \myem{numeric} Time step.
+\item \myem{text} Name of the function that
+returns a (charge)*(magnetic field)/(partcle mass)
+vector for each 3D position.
+\end{enumerate}
+\end{itemize}
+
+\subsubsection{Renderers}
+
+\begin{itemize}
+\item draw {\bfseries sharpraytrace} Heavy procedure that
+draws only the visible part of all edges of all defined
+faces. There's no point in using this procedure when
+there are no intersections beetween faces. Any how
+this will not work for non-convex faces nor when
+\myem{SphericalDistortion:=true}.
+\item draw {\bfseries lineraytrace()} Draws only the
+visible part of all defined lines using sequences of dots
+(\myem{signalvertex} and \myem{PrintStep}).
+\begin{enumerate}
+\item \myem{numeric} Dot size.
+\item \myem{colour} Dot colour.
+\end{enumerate}
+\item draw {\bfseries faceraytrace()} Draws only the
+visible part of all edges of all defined faces
+using sequences of dots
+(\myem{signalvertex} and \myem{PrintStep}).
+\begin{enumerate}
+\item \myem{numeric} Dot size.
+\item \myem{colour} Dot colour.
+\end{enumerate}
+\item draw {\bfseries draw\_all\_test()} Draws all defined
+edges (and lines) in a correct way independently of
+the kind of projection used. Can cast a shadow (but
+the shadow is not correct when
+\myem{SphericalDistortion:=true}).
+\begin{enumerate}
+\item \myem{boolean} If \myem{true} the lines
+are also drawn.
+\end{enumerate}
+\item draw {\bfseries fill\_faces()} Unfills and draws all
+faces in the order they were defined (without
+sorting). Can cast a shadow.
+\begin{enumerate}
+\item \myem{text} Like the argument of
+\myem{drawoptions} but used only inside this
+macro and only for the edges.
+\end{enumerate}
+\item draw {\bfseries draw\_invisible()} This is a fast way
+of removing hidden lines that doesn't
+allow for intersecting polygons nor
+polygons of very different area. It works by
++sorting all polygons by
+distance to \myem{f} and then by "filling" the
+polygons. This routine may be used to draw graphs
+of 3D surfaces.
+\begin{enumerate}
+\item \myem{boolean} If \myem{true} polygons are
+sorted relatively to
+nearest vertex and, if \myem{false}, relatively to their
+mass center. Choose \myem{false} for surface
+plots.
+\item \myem{boolean} If \myem{false} then the
+polygons are painted with their \myem{FC} colour
+modified by \myem{LightSource}. If \myem{true}
+then the next two arguments are used and the
+polygons are darkened proportionaly to their
+distance from \myem{f}.
+\item \myem{colour} Colour of faces.
+\item \myem{colour} Colour of the edges.
+\end{enumerate}
+\item global {\bfseries getready()} When you don't want to
+edit the source of the \MP\ program, to resort the
+objects so they'll be drawn correctly, use this macro
+and the next.
+\begin{enumerate}
+\item \myem{string} Command line that would draw
+some object.
+
+For instance: ``\myem{draw rigorousfearpath(black,1);}''.
+\item \myem{color} Reference position of that
+object.
+\end{enumerate}
+\item draw {\bfseries doitnow} The reference positions
+given as arguments of previous \myem{getready} calls
+are used to sort and draw the objects also given as
+string arguments to previous \myem{getready}
+calls. Remember to initialize \myem{Nobjects:=0;}
+before a second figure.
+\end{itemize}
+
+
+\subsubsection{Nematics (Direction Fields)}
+
+Nematics are the least ordered liquid crystals. Their
+configurations can be described by direction fields
+(vector fields without arrows). The two following routines
+ease the task of representing their configurations.
+
+\begin{itemize}
+\item global {\bfseries generatedirline()} Defines a single
+straight line segment in a given position and with a
+given orientation.
+\begin{enumerate}
+\item \myem{numeric} Line index number.
+\item \myem{numeric} Angle beetween the \myem{X}
+axis and the projection of the line on the
+\myem{XY} plane.
+\item \myem{numeric} Angle beetween the line
+and the \myem{XY} plane.
+\item \myem{numeric} Line (arc)length.
+\item \myem{color} Position of the line middle
+point.
+\end{enumerate}
+\item draw {\bfseries director\_invisible()} This is a
+direction field renderer that can sort direction
+lines. This routine
+draws straight lines of given "thickness" beetween the
+first all the points
+of all the \myem{L[]p[]} lines. It is supposed to
+help you draw vector fields
+without arrows but taking care of invisibility.
+The lines may be
+generated by \myem{generatedirline} or by other macros.
+\begin{enumerate}
+\item \myem{boolean} When there is no need to sort
+lines you may use \myem{false} here.
+\item \myem{numeric} "Thickness" of the
+direction lines
+\item \myem{boolean} Use \myem{true} for cyclic
+"direction" lines.
+\end{enumerate}
+\end{itemize}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{twistflat.1}
+ \end{center}
+ \caption{Figure that uses \myem{director\_invisible}
+ and \myem{generatedirline}.}
+ \end{figure}
+}
+
+\subsubsection{Surface Plots}
+
+\FP\ surface plots are geared towards unusual features like
+equilateral triangular grid, hexagonal domain and merging
+together functional and parametric surface descriptions.
+\begin{itemize}
+\item draw {\bfseries hexagonaltrimesh()} Plots a
+functional surface on a triangular or hexagonal
+domain. Uses the \myem{LightSource}.
+\begin{enumerate}
+\item \myem{boolean} Select the kind of
+domain. \myem{true} for hexagonal and
+\myem{false} for triangular. The domain is
+centered on the origin (\myem{black}). When the
+domain is hexagonal two of its corners are on the
+\myem{-YY} axis. When the
+domain is triangular one of its corners is on the
+\myem{X} axis.
+\item \myem{numeric} Number of small triangles on
+each side of the triangular domain or three times
+the number of small triangles on
+each side of the hexagonal domain.
+\item \myem{numeric} Length of the triangular
+domain side or three times the hexagonal domain
+side.
+\item \myem{text} Name of the function that
+returns the \myem{Z} coordinate of a surface
+point of coordinates \myem{X} and \myem{Y}.
+\end{enumerate}
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{hexagonaltrimesh.1}
+ \end{center}
+ \caption{Figure that uses \myem{hexagonaltrimesh}.}
+ \end{figure}
+}
+\item global {\bfseries partrimesh()} Defines a parametric
+surface that can be drawn with
+\myem{draw\_invisible}. In the following descriptions
+\myem{S} and \myem{T} are the parameters. Remember
+to initialize \myem{NF}. The surface is defined so
+that quadrangles are used whenever possible. If
+impossible, two triangles are used but their
+orientation is selected to maximize the surface
+smoothness. Also note that, unlike
+\myem{hexagonaltrimesh()}, the spatial range you
+require to be visible is always first reshaped into a
+cube and second compressed or extended vertically. How
+much the cube is compressed or extended depends on the
+last \myem{numeric} argument, the compression factor
+for \myem{Z}, meaning that the final height of the
+cube is 2/(compression factor). Thanks to Sebastian
+Sturm for pointing the need to explain this.
+\begin{enumerate}
+\item \myem{numeric} Number of \myem{T} steps.
+\item \myem{numeric} Number of \myem{S} steps.
+\item \myem{numeric} Minimal \myem{T} value.
+\item \myem{numeric} Maximal \myem{T} value.
+\item \myem{numeric} Minimal \myem{S} value.
+\item \myem{numeric} Maximal \myem{S} value.
+\item \myem{numeric} Minimal \myem{X} value.
+\item \myem{numeric} Maximal \myem{X} value.
+\item \myem{numeric} Minimal \myem{Y} value.
+\item \myem{numeric} Maximal \myem{Y} value.
+\item \myem{numeric} Minimal \myem{Z} value.
+\item \myem{numeric} Maximal \myem{Z} value.
+\item \myem{numeric} Compression factor for \myem{Z}
+values.
+\item \myem{text} Name of the function that
+returns a surface point (of \myem{color} type)
+for each pair (\myem{S},\myem{T}).
+\end{enumerate}
+\end{itemize}
+
+
+\subsubsection{Strictly 2D}
+\begin{itemize}
+\item path {\bfseries springpath()}
+ \begin{enumerate}
+ \item \myem{pair} Start point.
+ \item \myem{pair} Finish point.
+ \item \myem{numeric} Number of swings.
+ \item \myem{numeric} Half-width of the swings.
+ \item \myem{numeric} Fraction of the length that is occcupied with swings.
+ \end{enumerate}
+\item path+draw {\bfseries zigzagfrontier()}
+ \begin{enumerate}
+ \item \myem{pair} Start point.
+ \item \myem{pair} Finish point.
+ \item \myem{numeric} Number of swings.
+ \item \myem{numeric} Standart deviation of the swings' amplitude.
+ \item \myem{numeric} Average swings' amplitude.
+ \item \myem{numeric} Outside thickness.
+ \item \myem{numeric} Inside thickness.
+ \item \myem{colour} Outside color.
+ \item \myem{colour} Inside color.
+ \end{enumerate}
+\item path {\bfseries randomcirc()}
+ \begin{enumerate}
+ \item \myem{numeric} Average radius.
+ \item \myem{numeric} Standart deviation.
+ \item \myem{numeric} Number of points.
+ \end{enumerate}
+\item pair {\bfseries radialcross()} Calculates one of both
+ intersections between to circles.
+ \begin{enumerate}
+ \item \myem{pair} Center of the first circle.
+ \item \myem{numeric} Radius of the first circle.
+ \item \myem{pair} Center of the second circle.
+ \item \myem{numeric} Radius of the second circle.
+ \item \myem{boolean} Choice between the upside (\myem{true}) or
+ downside (\myem{false}) intersection (relative to the segment
+ connecting both centers).
+ \end{enumerate}
+\item draw {\bfseries ropepattern()} Draws a (climbing) rope over a
+ path (see figure \ref{ropes}).
+ \begin{enumerate}
+ \item \myem{path} The path.
+ \item \myem{numeric} Width or thickness of the rope.
+ \item \myem{numeric} Number of windings of each thread.
+ \end{enumerate}
+
+\frame{
+ \begin{figure}[bpt]
+ \begin{center}
+ \includegraphics[width=65mm]{ropepatterns.1}
+ \end{center}
+ \caption{Figure that uses \myem{ropepattern}.}
+ \label{ropes}
+ \end{figure}
+}
+\item pair {\bfseries firsttangencypoint()} Returns the first point on
+ a path for which the segment connecting that point and another given
+ reference point is tangent to the path.
+ \begin{enumerate}
+ \item \myem{path} The path.
+ \item \myem{pair} The reference point
+ \item \myem{numeric} Reciprocal of the sampling step along the path
+ in default units.
+ \end{enumerate}
+\item path {\bfseries lasermachine()} Shrink or swell a cyclic path
+ without cusp points and without
+ coinciding pre and post control points.
+ \begin{enumerate}
+ \item \myem{path} The original path.
+ \item \myem{numeric} Directed distance between the original path and the
+ returned path (positive values are to the right and negative
+ values are to the left of the original path).
+ \item \myem{numeric} Maximum cossine of corner angle above which it
+ remains a sharp corner (only for negative values of directed distance).
+ \end{enumerate}
+\item path {\bfseries crossingline()} Produces a single path out of
+ two intersecting and cyclic paths. The paths must be adapted with
+ \myem{startahead} and/or \myem{reverse} so that they both rotate in the same
+ direction and they start on consecutive "lobes".
+ Now pay attention: given the direction of rotation (clockwise or
+ counter-clockwise) the SecondPath must start BEFORE the FirstPath.
+ And another problem: there must be at least four intersection points.
+ \begin{enumerate}
+ \item \myem{path} FirstPath.
+ \item \myem{path} SecondPath.
+ \item \myem{numeric} Time resolution.
+ \end{enumerate}
+\end{itemize}
+
+\section{Missing documentation}
+\begin{alltt}
+minimizestep( expr Abcisscolor )( text PlainFunc )
+
+improvertex( expr VerA, DisA, VerB, DisB, VerC, DisC, IniV )
+
+ultraimprovertex( expr PlanPoi, PlanDir, BaseCenter, Radius, LenVec,
+ CentrPoi, NorthPoleVec, Ray, IniV )
+
+necplusimprovertex( expr PlanPoi, PlanDir,
+ CentrPoiA, NorthPoleVecA, RayA,
+ CentrPoiB, NorthPoleVecB, RayB, IniV )
+
+intersectprolatespheroid( expr CentrPoi, NorthPoleVec, Ray,
+ LinePoi, LineDir, IniV )
+
+intersectorus( expr Tcenter, Tmoment, Bray, Sray, LinePoi, LineDir )
+
+ellipsoid( expr Centr, AxOne, AxTwo, AxThr )
+
+revolparab( expr BaseCenter, ParabTip, BaseRay )
+
+pointinsidetorus( expr Point, Tcenter, Tmoment, Bray, Sray )
+\end{alltt}
+
+
+
+\mode<article>{\newpage}
+
+\section{Reference-at-a-glance}
+
+\subsection{Sphere}
+
+\frame{
+ \frametitle{\myem{tropicalglobe}( $N$, $\vec{c}$, $R$, $\vec{A}$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{revolvers.1} \\
+
+ \myem{tropicalglobe( 5, black, 1, blue );}
+ \end{center}
+}
+
+\subsection{Disc}
+
+\frame{
+ \frametitle{\myem{rigorousdisc}( $R_i$,
+ \myem{bool}, $\vec{c}$, $R_o$, $\vec{A}$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{revolvers.2} \\
+
+ \myem{rigorousdisc( 0.5, true, black, 1, 0.85blue );}
+ \end{center}
+}
+
+\subsection{Torus}
+
+\frame{
+ \frametitle{\myem{smoothtorus}( $\vec{c}$, $\vec{A}$, $R_b$, $R_s$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{revolvers.3} \\
+
+ \myem{smoothtorus( black, blue, 0.7, 0.4 );}
+ \end{center}
+}
+
+\subsection{Bowl}
+
+\frame{
+ \frametitle{\myem{spatialhalfsfear}( $\vec{c}$, $\vec{A}$, $R$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{revolvers.4} \\
+
+ \myem{spatialhalfsfear( black, blue, 1 );}
+ \end{center}
+}
+
+\subsection{Cuboid}
+
+\frame{
+ \frametitle{\myem{kindofcube}(\myem{bool,bool},$\vec{o},\alpha_1,\alpha_2,\alpha_3,l_1,l_2,l_3$)}
+ \begin{center}
+ \includegraphics[width=65mm]{kindofcuber.1} \\
+
+ \myem{kindofcube( false, true, black, 130, 32, 67, 0.3, 0.6, 0.9 );}
+ \end{center}
+}
+
+\subsection{Simple car}
+
+\frame{
+ \frametitle{\myem{simplecar}( $\vec{o}$,($\alpha_1,\alpha_2,\alpha_3$),
+ ($l_1,l_2,l_3$), (Xf,Yf,Zf), (Xr,Yr,Zr) )}
+ \begin{center}
+ \includegraphics[width=65mm]{simplecarparam.1} \\
+
+\myem{simplecar( black, black, (0.8,0.35,0.18), (0.1,0.2,0.132),
+ (0.06,0.06,0.1) );}
+ \end{center}
+}
+
+\subsection{Cone}
+
+\frame{
+ \frametitle{\myem{verygoodcone}( \myem{bool}, $\vec{c}$,
+ $\vec{A}$, $R$, $\vec{v}$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{cone.1} \\
+
+ \myem{verygoodcone( true, black, blue, 0.8, blue+green );}
+ \end{center}
+}
+
+\subsection{Elliptic prism}
+
+\frame{
+ \frametitle{\myem{whatisthis}( $\vec{c}$, $\vec{S}_1$,
+ $\vec{B}_1$, $D$, $||\vec{S}_2||/||\vec{S}_1||$ )}
+ \begin{center}
+ \includegraphics[width=65mm]{ellipticprism.1} \\
+
+ \myem{whatisthis( black, 0.5red, green, 0.85, 0.8 );}
+ \end{center}
+}
+
+\subsection{Spheroid}
+
+\frame{
+ \frametitle{\myem{spheroid}( $\vec{c}$, $\vec{S}$, $R$ )}
+ \begin{center}
+ \includegraphics[width=40mm]{revolvers.5} \\
+
+ \myem{spheroid( black, 2*blue, 1 );}
+ \end{center}
+}
+
+\subsection{Cylindrical strip}
+
+\frame{
+ \frametitle{\myem{banana}( $\vec{c}$, $R$,
+ $(\alpha_M,\beta_M,\gamma_M)$, $L$, $\theta$ )}
+ \begin{center}
+ \includegraphics[width=70mm]{revolvers.6} \\
+
+ \myem{banana( black, 1, black, 0.3, 145 );}
+ \end{center}
+}
+
+\subsection{Torus' slice}
+
+\frame{
+ \frametitle{\myem{quartertorus}( $\vec{c}$, $\vec{A}$, $\vec{B}$, $R$ )}
+ \begin{center}
+ \includegraphics[width=70mm]{revolvers.7} \\
+
+ \myem{quartertorus( black, -red, red-green, 0.25 );}
+ \end{center}
+}
+
+\section{References}
+
+\begin{description}
+\item[1.] ``The \MF book'' by Don Knuth
+\item[2.] ``\MP, a user’s manual'' by John Hobby and the
+ MetaPost development team
+\item[3.] ``The NURBSbook'' by Les Piegl and Wayne Tiller
+\end{description}
+
+\section{Acknowledgements}
+
+\frame{
+ \changeableframetitle{Acknowledgements}
+ Many people have contributed to make \FP\ what it is today.
+ Perhaps it would have never come into being without the early
+ intervention of Jorge B\'arrios, providing access to his father's
+ computer in 1986. Another important moment happened when Jos\'e Esteves
+ first spoke about \MP\ sometime in the late nineties.
+
+ Also, the very accurate criticism of Cristian Barbarosie has
+ significantly contributed to fundamental improvements. Jens
+ Schwai\-ger contributed new macros. Pedro Sebas\-ti\~ao, Jo\~ao Dinis and
+ Gon\-\c{c}alo Mo\-rais proposed challenging new features.
+}
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.pdf b/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.pdf
new file mode 100644
index 0000000000..86d946919e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.tex b/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.tex
new file mode 100644
index 0000000000..106bc5d469
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/featpostmanual.tex
@@ -0,0 +1,9 @@
+% \documentclass[ignorenonframetext]{beamer}
+% \usetheme{Pittsburgh}
+% \setbeamercolor{normal text}{bg=red!7}
+% \usepackage{xmpmulti}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\documentclass[11pt,oneside]{article}
+\usepackage{beamerarticle,hyperref,a4wide}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\input{featpostdocsource}
diff --git a/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.pdf b/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.pdf
new file mode 100644
index 0000000000..9bfdf4e13b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.tex b/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.tex
new file mode 100644
index 0000000000..e8222d7a76
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/lastfiguretest.tex
@@ -0,0 +1,22 @@
+\documentclass[ignorenonframetext]{beamer}
+\usetheme{Pittsburgh}
+\setbeamercolor{normal text}{bg=red!7}
+\usepackage{amsmath,amssymb,graphicx}
+\DeclareGraphicsRule{*}{mps}{*}{}
+\graphicspath{{../}}
+\newfont{\normald}{logod10 scaled 1024}
+\newcommand{\MF}{{\normald METAFONT}}
+\newcommand{\MP}{{\normald METAPOST}}
+\newcommand{\FP}{{\normald FEATPOST}}
+\newcommand{\myem}[1]{\texttt{#1}}
+\begin{document}
+
+\frame{
+ \frametitle{\myem{intersectorus}( $\vec{c}$, $\vec{M}$, $R_B$, $R_s$, $\vec{p}$, $\vec{D}$ )}
+ \begin{center}
+ \includegraphics[width=80mm]{intersectorus.1}
+ \end{center}
+}
+
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.pdf b/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.pdf
new file mode 100644
index 0000000000..abe5c56a3a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.tex b/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.tex
new file mode 100644
index 0000000000..6a24f260db
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/letterfor3Dand4D.tex
@@ -0,0 +1,225 @@
+\documentclass{article}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{hyperref}
+\usepackage{a4wide}
+\newfont{\normald}{logod10 scaled 1024}
+\newfont{\biglogo}{logod10 scaled 2048}
+\newcommand{\MF}{{\normald METAFONT}}
+\newcommand{\MP}{{\normald METAPOST}}
+\newcommand{\FP}{{\normald FEATPOST}}
+\newcommand{\AM}{{\normald ANEEMATE}}
+\hypersetup{
+ pdftitle={Extending MP to 3D and 4D},
+ pdfauthor={L. Nobre G.},
+ pdfkeywords={MetaPost}
+}
+\DeclareGraphicsRule{*}{mps}{*}{}
+\graphicspath{{../mps/}}
+\begin{document}
+\title{Extending {\biglogo METAPOST} to 3D and 4D}
+\author{L.\ Nobre G.}
+\date{\today}
+\maketitle
+\begin{abstract}
+Many authors have been working with three dimensions in \MP\ but, up
+to now, these works have not been integrated in the core of \MP. Since
+I am one of those authors, I would like to propose now a framing for
+that integration.
+\end{abstract}
+\setlength{\columnsep}{2.5em}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+Since {\tt colors} and {\tt cmykcolors} were introduced in \MP, it
+became a simulation machine. Ordinary differential equations could be
+solved in 3D or 4D using the exact same Runge--Kutta code as for 2D.
+
+But some way of projection had to be developed by the user in order to
+draw the results of the simulation.
+
+\section{Projecting from 3D into 2D}
+
+Many different kinds of projections exist, I tried a few and I think
+it is enough to project through a single point $\vec{f}$ onto a
+plane\footnote{When the point is at infinity, the projection is
+ parallel and it defines only a direction.}.
+This kind of projection can take advantage of \MP's linear equations.
+Take, for instance, the following figure.
+\begin{center}
+ \includegraphics[width=0.6\textwidth]{photorefer.2}
+\end{center}
+Point $\vec{p}$ can be calculated from the following equations:
+\begin{equation}
+ \left\{
+ \begin{array}[c]{l}
+ \vec{R}+\lambda\left(\vec{R}-\vec{f}\right) = \vec{o}+\vec{p} \\
+ \left(\vec{h}\times\vec{v}\right)\cdot\vec{p} = 0
+ \end{array}
+ \right.
+\end{equation}
+which can be coded as below:
+\begin{quote}
+\begin{verbatim}
+color p;
+R + whatever*(R-f) = o + p;
+(h crossproduct v) dotproduct p = 0;
+\end{verbatim}
+\end{quote}
+where {\tt R, f, o, h} and {\tt v} are known {\tt colors}. Of course,
+this requires that one defines {\tt crossproduct}, the cross product of
+two vectors\footnote{I don't know how to define the cross product in
+ 4D.}.
+This kind of projection is called ``perspective'' and can easily
+be transformed into a parallel projection, like this:
+\begin{quote}
+\begin{verbatim}
+color p;
+R + whatever*(o-f) = o + p;
+(h crossproduct v) dotproduct p = 0;
+\end{verbatim}
+\end{quote}
+There are a few problems, though:
+\begin{itemize}
+\item Depending on the positions of $\vec{f}$ and $\vec{R}$ the linear
+equations may produce divisions by zero. But these equations are quite
+simple and can be solved in advance so that divisions by zero can be
+caught as is done in \FP.
+\item $\vec{p}$ is a {\tt color}, not a {\tt pair}, so it must be
+converted. But this is very easy:
+\begin{quote}
+\begin{verbatim}
+x = p dotproduct h;
+y = p dotproduct v;
+\end{verbatim}
+\end{quote}
+\item if both $\vec{R}$ is a node or control point of a 3D path and
+ the projection is a perspective then the path perspective is no
+ longer a B\'{e}zier spline, it is a non-uniform rational basis spline
+ (NURBS). The only way around this is to ignore the problem.
+\end{itemize}
+
+\subsection{Exactly how?}
+
+Given that the actual way to draw a 3D path depends not only on the
+definition of that path but also on the kind of projection being used,
+I propose that the projection be done only at {\tt shipout} time.
+
+A perspective is not an affine transform and cannot be inverted by
+linear equations. A perspective is a new thing for \MP.
+
+The parallel projection is an affine transform but \MP\ has not yet a
+framework neither for 3D nor for 4D {\tt transforms}.
+
+The transition from the actual \MP\ to a full--fledged 3D \MP\ depends
+critically on the support for smooth 3D and 4D paths.
+
+Once \MP\ is beyond this
+transition what will certainly show up is the need for full path
+tansforms which may either be affine or not. I propose to call these
+``generic'' transforms as {\tt maps}. But note that these full path
+transforms cannot be perspectives because they only map each node and
+control point of a given path\footnote{A {\tt map} may be regarded as
+ an approximation of a perspective.}.
+
+\section{The whole package}
+
+\subsection{Already on the Tracker}
+
+The next most basic 3D and 4D capability that needs to be added to
+\MP\ is already published as Tracker item \# 104: both {\tt abs} and
+{\tt unitvector} must be expanded to accept {\tt colors} and {\tt
+ cmykcolors} as arguments.
+
+\subsection{Cross product}
+
+A good {\tt crossproduct} for \MP\ would accept {\tt numerics}, {\tt
+ pairs} and {\tt colors} as arguments.
+\begin{description}
+ \item[{\tt numerics}] the result is {\tt 0}
+ \item[{\tt pairs A} and {\tt B}] the result is a {\tt color} with
+ all parts null except that the {\tt bluepart=Ax*By-Ay*Bx}
+ \item[{\tt colors}] the result is the standard cross product
+\end{description}
+
+\subsection{\tt angle}
+
+\begin{quote}
+\begin{verbatim}
+color A, B;
+angle( A, B ) = angle( abs( A crossproduct B ), A dotproduct B );
+\end{verbatim}
+\end{quote}
+
+\subsection{Commands to be adapted}
+
+The following commands should be adapted to accept 3D (and 4D) points and
+paths:
+\begin{quote}
+\begin{verbatim}
+draw undraw drawarrow drawdblarrow
+fill unfill filldraw unfilldraw
+reverse
+precontrol postcontrol
+arclength arctime
+label dotlabel
+slanted shifted rotated scaled xscaled yscaled
+rotatedaround reflectedabout
+bbox
+subpath
+path
+transform transformed identity inverse
+direction of
+point of
+\end{verbatim}
+\end{quote}
+And the following commands should be adapted to accept the new 3D and
+4D {\tt transforms}
+\begin{quote}
+\begin{verbatim}
+xpart ypart xxpart xypart yxpart yypart
+cyanpart magentapart yellowpart blackpart
+\end{verbatim}
+\end{quote}
+%%%%%%% $$ \hbox{\verb|draw (20,20)--(0,0)|} $$
+
+\subsection{New commands}
+
+{\tt Colors} and {\tt cmykcolors} should have analogues to {\tt z} to
+be wiped--out on {\tt beginfig}. I propose {\tt C} for {\tt colors}
+and {\tt D} for {\tt cmykcolors}. There should exist predefined names for
+unitary 4D vectors like {\tt purecyan = (1,0,0,0); puremagenta =
+ (0,1,0,0)}, etc.
+\begin{quote}
+\begin{verbatim}
+zscaled tdtransform tdtransformed fdtransform fdtransformed
+xzpart yzpart zzpart zpart zxpart zypart
+ccpart cmpart cepart ckpart
+mcpart mmpart mepart mkpart
+ecpart empart eepart ekpart
+kcpart kmpart kepart kkpart
+mapped
+\end{verbatim}
+\end{quote}
+This last one {\tt mapped} is perhaps the most messy of all. It should
+work like this:
+\begin{quote}
+\begin{verbatim}
+anypath mapped NameOfUserMap;
+\end{verbatim}
+\end{quote}
+where {\tt NameOfUserMap} is the name of a macro that uses as a single
+argument each node and control point of the {\tt anypath}. It returns
+a new path that may have different dimensionality\footnote{Standard
+ affine {\tt transforms} keep the dimensionality.}
+
+\subsection{Commands that should not be touched}
+
+One of the problems of extending \MP\ is that somethings really cannot
+be extended. This is related with the smoothness of 2D paths. With the
+exception of cusp points, the {\tt direction} is well--behaved on a 2D
+path. But on a 3D path (and specially on a 4D path) most directions
+cannot be found. Also, {\tt intersections} become exceedingly hard to
+find.
+
+\end{document} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.pdf b/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.pdf
new file mode 100644
index 0000000000..014301dc44
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.tex b/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.tex
new file mode 100644
index 0000000000..ee28b90bfa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropaganda.tex
@@ -0,0 +1,402 @@
+\documentclass{beamer}
+\usepackage[norsk]{babel}
+\usepackage[utf8]{inputenx}
+\usepackage[stickyper,obeyall,locale=DE,dp=4]{siunitx}
+\usetheme{Pittsburgh}
+\setbeamercolor{normal text}{bg=red!7}
+\setbeamertemplate{footline}{\insertpagenumber}
+\usepackage{xmpmulti,amsmath,amssymb,graphicx,mflogo}
+\DeclareGraphicsRule{*}{mps}{*}{}
+\graphicspath{{./metapostpropagandafiles/}}
+\newcommand{\myem}[1]{\texttt{#1}}
+\title{Wide--range \MP\ tutorial}
+\author{
+ Luís Nobre Gonçalves \\
+ (\href{mailto:lnobreg@gmail.com}{\underline{L. Nobre G.}})
+}
+\date{\today}
+\begin{document}
+\frame{
+ \titlepage
+ \begin{abstract}
+ Sort of workshop about \TeX--things, focusing on the \MP\ language.
+ \end{abstract}
+}
+
+\frame{
+ \frametitle{The Church of Free Software}
+ Pope: \href{http://stallman.org/}{\underline{Richard Stallman}}.
+}
+
+\frame{
+ \frametitle{Evil}
+ {\LARGE WYSIWYG}
+ \pause
+
+ What you get is what you \textcolor{red}{don't} see
+}
+
+\frame{
+ \frametitle{Freedom}
+ You choose what you get \pause
+
+ but
+
+ you only get it at the end of a long path.
+}
+
+\frame{\tableofcontents}
+
+\section{Introduction}
+
+\subsection{A bit of history}
+
+\frame{
+ \frametitle{A bit of history}
+ \href{http://news.stanford.edu/news/2011/june/knuth-engineering-hero-060111.html}{\underline{Donald Knuth -- \textit{The Art of Computer Programming}}}
+ \begin{itemize}
+ \item Volume1, 1969, hot metal
+ \item Volume2, $2^{\mathrm{\underline{nd}}}$ ed., 1977, photographic
+ \item \TeX, v1, 1978, $\mathrm{v}\longrightarrow\pi$
+ \item \MF, v1, 1979, $\mathrm{v}\longrightarrow e$ --- \textrm{affine}
+ \item AMS, 1983
+ \item APS, AIP, OSA, AAS, Springer-Verlag
+ \item \MP, 1994, John Hobby
+ \end{itemize}
+ \pause
+ \MP\ is the realm of graphic \textcolor{green}{parameterization}.
+}
+
+\subsection{What is \MP ?}
+
+\frame{
+ \frametitle{Main features of \MP}
+ \begin{itemize}
+ \item It is easy to express geometry as \MP\ code
+ \item \MP\ outputs \myem{postscript}, SVG or PNG
+ \begin{quote}
+ \myem{outputformat := \dq svg\dq;}
+ \end{quote}
+ \item Very good control of 2D B\'{e}zier splines
+ \item Special 2D operators
+ \item Many operators work the same way in 1, 2, 3 or 4D
+ \item Linear equations
+ \item May include \LaTeX
+ \item May be included in \LaTeX
+ \end{itemize}
+}
+
+\subsection{Main reason to use \MP}
+
+\frame{
+ \frametitle{Use \MP\ because}
+ \MP\ helps the user to experiment different
+ diagram layouts without changing specified
+ \textcolor{green}{geometric relationships} among diagram elements.
+}
+
+\section{For Almost Absolute Beginners}
+
+\frame{
+ \frametitle{For Almost Absolute Beginners}
+ \begin{itemize}
+ \item Availability
+ \item Mathematically oriented
+ \item Programmability/Scriptability
+ \item Forced simplicity
+ \item \textcolor{green}{Consistency}
+ \end{itemize}
+}
+
+\subsection{Availability}
+
+\frame{
+ \frametitle{Availability}
+ \begin{itemize}
+ \item \href{http://foundry.supelec.fr/gf/project/metapost}{\underline{Development site}}
+ \item \href{http://www.ctan.org/}{\underline{CTAN}}
+ \begin{itemize}
+ \item \href{http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros}{\underline{/graphics/metapost/contrib/macros}}
+ \end{itemize}
+ \pause
+ \item \TeX\ Users Group
+ \begin{itemize}
+ \item \href{http://www.tug.org/texlive/}{\underline{\texttt{texlive}}}
+ \end{itemize}
+ \item \href{http://packages.debian.org/search?keywords=texlive&searchon=names&suite=stable&section=all}{\underline{Debian}}
+ \begin{itemize}
+ \item \href{http://packages.debian.org/squeeze/texlive-metapost}{\underline{\texttt{texlive-metapost}}}
+ \item \href{http://packages.debian.org/squeeze/texlive-publishers}{\underline{\texttt{texlive-publishers}}} includes \href{https://authors.aps.org/revtex4/}{\underline{RevTeX}}
+ \item \href{http://packages.debian.org/squeeze/latex-beamer}{\underline{\texttt{latex-beamer}}}
+ \item \href{http://tug.org/tex4ht/}{\underline{\texttt{tex4ht}}}
+ \end{itemize}
+ \item ``The \LaTeX\ Companions''
+ \end{itemize}
+}
+
+\subsection{Mathematically oriented}
+
+\frame{
+ \frametitle{Linear equations}
+ \begin{center}
+ \includegraphics[height=35mm]{intersection2D.1}
+ \\
+ \begin{itemize}
+ \item Constraints may be expressed as linear equations
+ \begin{quote}
+ \myem{z5 = whatever[z1,z2];} \\
+ \myem{z5 = whatever[z3,z4];}
+ \end{quote}
+ \item No need to explicitly assign calculations to unknowns
+ \end{itemize}
+ \end{center}
+}
+
+\frame{
+ \frametitle{\myem{pair} doublets}
+ \begin{itemize}
+ \item \myem{pair}
+ \begin{tabular}[t]{cc}
+ \myem{(\textit{x,y})}$\longrightarrow$ & \myem{(X,Y)} \\
+ \myem{origin} & (0,0)
+ \end{tabular}
+ \item Coordinates
+ \begin{quote}
+ \myem{z[i] = (x[i],y[i]);}
+ \end{quote}
+ \end{itemize}
+}
+
+\frame{
+ \frametitle{\myem{color} triplets}
+ \begin{itemize}
+ \item \myem{color}
+ \begin{tabular}[t]{cc}
+ \myem{(\textit{red,green,blue})}$\longrightarrow$ & \myem{(X,Y,Z)} \\
+ \myem{black} & (0,0,0) \\
+ \myem{red} & (1,0,0) \\
+ \myem{green} & (0,1,0) \\
+ \myem{blue} & (0,0,1) \\
+ \myem{white} & (1,1,1)
+ \end{tabular}
+ \end{itemize}
+}
+
+\frame{
+ \frametitle{\myem{cmykcolor} tetraplets}
+ \begin{itemize}
+ \item \myem{cmykcolor}
+
+ \myem{(\textit{cyan,magenta,yellow,black})}$\longrightarrow$\myem{(X,Y,Z,W)}
+ (\href{http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation}{\underline{quaternions}},
+ \href{http://en.wikipedia.org/wiki/Homogeneous_coordinates}{\underline{homogeneous coordinates}}, 4D splines, animation frames, straight line segments, etc.)
+ \end{itemize}
+}
+
+\frame{
+ \frametitle{Special operators}
+ \begin{itemize}
+ \item Pythagorean addition and subtraction
+ \begin{quote}
+ \myem{h = a ++ b +-+ c;} ($h=\sqrt{a^2+b^2-c^2}$)
+ \end{quote}
+ \pause
+ \item Interval 0---1 ND operator s[,]
+ \begin{quote}
+ \begin{tabular}{lcl}
+ \myem{0.5[(1,1),(3,5)]} & $\longrightarrow$ & \myem{(2,3)} \\
+ \myem{-0.5[(1,1,1),(3,5,7)]} & $\longrightarrow$ & \myem{(0,-1,-2)} \\
+ \myem{1.5[(1,1,1,1),(3,5,7,9)]} & $\longrightarrow$ & \myem{(4,7,10,13)}
+ \end{tabular}
+ \end{quote}
+ \pause
+ \item N-dimensional scalar arithmetic
+ \begin{quote}
+ \myem{b = 2a;} \\
+ \myem{z1 = 2*(1,2);} \\
+ \myem{c2 = 2*(1,2,3); grey = 0.5white;} \\
+ \myem{cc3 = 2*(1,2,3,4);}
+ \end{quote}
+ \end{itemize}
+}
+
+\frame{
+ \frametitle{Other features}
+ \begin{itemize}
+ \item Throw--in--the--garbage unknowns
+ \begin{quote}
+ \myem{whatever}
+ \end{quote}
+ \pause
+ \item Special functions
+ \begin{quote}
+ \myem{dir() abs() angle() unitvector() \\ sind() cosd()}
+ \end{quote}
+ \pause
+ \item Affine transforms (linear)
+ \item Totally parameterized 2D cubic B\'{e}zier splines
+ \end{itemize}
+}
+
+\subsection{Programmability/Scriptability}
+
+\frame{
+ \frametitle{Programmability}
+ \begin{center}
+ \includegraphics[width=0.57\columnwidth]{recursives.2}
+ \end{center}
+ ø æ å ì § ü ç @ £ œ ß « » “ †… 3.14159e-2 = \num{3.14159e-2}
+}
+
+\frame{
+ \frametitle{Scriptability}
+ \begin{itemize}
+ \item \begin{quote}
+ \myem{scantokens \dq\textsl{string of commands}\dq;}
+ \end{quote}
+ \item MPlib
+ \end{itemize}
+}
+
+\subsection{Forced Simplicity}
+
+\frame{
+ \frametitle{Forced Simplicity}
+ \begin{itemize}
+ \item $(8\times)4096$
+ \item 1/65536
+ \item 2000 points in a path
+ \item Memory
+ \item Number of variables
+ \end{itemize}
+ Since \MP\ version 1.803, the command line switch
+ \myem{--numbersystem} provides other over- and underflows
+}
+
+\subsection{Consistency}
+
+\frame{
+ \frametitle{Consistency}
+ \begin{itemize}
+ \item emacs+auctex/\href{http://www.texmacs.org/}{\underline{texmacs}}
+ \item latexmp
+ \item emp/Lua\TeX
+ \item graphicx
+ \item beamer+xmpmulti
+ \item GNUPLOT
+ \item xfig
+ \item dia/expressg
+ \item gs+potrace+pstoedit+PstoeditMpostPreeditor
+ \item siunitx
+ \end{itemize}
+}
+
+\frame{\frametitle{emacs+auctex}
+ \begin{center}
+ \includegraphics[height=61mm]{metapostpropaganda.png}
+ \end{center}
+ \href{run:metapostpropaganda.tex}{\underline{See code}}
+}
+
+\frame{\frametitle{latexmp}
+ \begin{center}
+ \includegraphics[height=61mm]{fekslatexmp.1}
+ \end{center}
+ \href{run:metapostpropagandafiles/fekslatexmp.mp}{\underline{See code}.}
+}
+
+\frame{\frametitle{graphicx}
+ \begin{quote}
+ \textbackslash usepackage\{graphicx\} \\
+ \textbackslash DeclareGraphicsRule\{*\}\{mps\}\{*\}\{\} \\
+ --- \\
+ \textbackslash includegraphics[height=61mm]\{fekslatexmp.1\}
+ \end{quote}
+}
+\frame{\frametitle{beamer+xmpmulti}
+ \begin{quote}
+ \textbackslash usepackage\{xmpmulti\} \\
+ --- \\
+ \textbackslash
+ multiinclude[$<+>$][graphics=\{width=8cm\},end=10] \\
+ \{feksmulti\}
+ \end{quote}
+}
+\frame{\frametitle{GNUPLOT}
+ \begin{quote}
+ set term mp color solid latex \\
+ set output \dq feksgnuplot.mp\dq
+ \end{quote}
+}
+\frame{\frametitle{xfig}
+ \begin{center}
+ \includegraphics[height=61mm]{xfig.png}
+ \end{center}
+ fig2ps
+}
+\frame{\frametitle{dia}
+ \begin{center}
+ \includegraphics[height=55mm]{dia.png}
+ \end{center}
+}
+\frame{\frametitle{epspdf+gs}
+ \begin{flushright}
+ epspdf minimal-1.mps \\
+ --- \\
+ gs -q -sDEVICE=jpeggray -r100 -dNOPAUSE \\
+ -sOutputFile=minimal.jpg minimal-1.pdf $<$ /dev/null
+ \end{flushright}
+}
+
+\frame{\frametitle{potrace+pstoedit+PstoeditMpostPreeditor}
+ \href{http://matagalatlante.org/nobre/MetaPost/debianswirl/DebianSwirl.html}{\underline{Example}}
+}
+
+\frame{\frametitle{PstoeditMpostPreeditor}
+ \href{http://matagalatlante.org/nobre/MetaPost/QuestionMark/questionmark.html}{\underline{Example}}
+}
+
+\section{Workflow}
+
+\frame{
+ \frametitle{Basic workflow}
+ \begin{center}
+ \includegraphics[height=65mm]{workflow-from-mpman-charts.2}
+ \end{center}
+}
+
+\frame{\frametitle{Workflow}
+ \begin{enumerate}
+ \item Draw scheme by hand
+ \item Identify parameters
+ \pause
+ \item Express constraints
+ \item Determine valid ranges
+ \item Program
+ \item Test
+ \end{enumerate}
+}
+
+\subsection{Workflow example}
+
+\frame{
+ \frametitle{Workflow example (0)}
+ \begin{center}
+ \includegraphics[height=65mm]{pifpafphoto.jpg}
+ \end{center}
+}
+
+\frame{
+ \frametitle{Workflow example (1)}
+ \begin{center}
+ \includegraphics[height=65mm]{pifpaf.jpeg}
+ \end{center}
+}
+
+\frame{
+ \frametitle{Workflow example (2)}
+ \multiinclude[<+>][graphics={width=8cm},end=16]{pifpafpropaganda}
+}
+
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.eps b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.eps
new file mode 100644
index 0000000000..a45bd0f1a0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.eps
@@ -0,0 +1,49 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: potrace 1.8, written by Peter Selinger 2001-2007
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 468 235
+%%Pages: 1
+%%EndComments
+%%Page: 1 1
+currentfile /ASCII85Decode filter /LZWDecode filter cvx exec
+J.'GRZOs"gA.TUeVISs@bR,/NO(T\_Yh4@J6j[M4)8+mQN'n!XZ\3Wk0/t#m@KDR@U`_@Z+
+VM&=\m[?*),CGm7%EIf1*'*k!MG$G0/f@qP[O^GO\1h)BG;q0JECu/#S"dP4VFeK3X>qqag
+Hf\-T7RXUp0s)b'T[T&#POEJ>">L*m>rUSE>!.QsTt#ff>/f/Xk@n;KJ8m[mcUIMkU:kf^T
+9%airqQ\:W@0Y@m:MRh^ED0c4<k7RKc%95GHg7h]YY(1(D\%VsMg?:J<F)fG5%;j#_TF>q>
+/q$F=3%ECE^H2NXBhD-`Db-TeXFZ338K^312A):J]+O9A][-\-NL+i/UF1^aEkKu35n8'03
+-*U_!NbLJ-4fGPliXd`Gb%rl0iir.ZY+mIA0tU4h>d;*t";[2]_qZmJ-Rh%)4fiK6hY=(.@
+`$ElBm\_;":Vfo2n7/.XG@<>o#<O4i_$)A\1fU%2(=KA:-BhS@,<o&UO^3B-a'tt4gd%QkV
+J5d$dLn$"%k,.NoSi/.n^N%5qWSonh,l[j-[^D!C;6@(^>PIEZ:irPj(8*$F%N(Xh[bP*!W
+BEBH)[4>7_Z1CdO"!V.)t0(5?[#(8eQ.*@;W%WEX"0"ehuK(5>DTa%ut7Wgcr4+Ti;6ZaBr
+&U9P.uABoo[(l(\;D!5(bX@]@(QIfQ$D-Thqc"rZsFK16[V3M\4>ld6LHITB3PCm.qc(0#4
+:fZgZ)@!R&>T6Sk8r1d@=%-D&2Jhc(e@$fA:n"g9"a1b1[f$A!>[a`G&7$kYdn/?),+@H@<
+M`?BZ@Gst:-S=#//fjp9st31.;3Ubi)I\g8_A8aB7!gL?kmVc(Zkc:d8VDtMI"_sC9`JdUN
+@A[MCiuei--,P)7N\<?'nW,D4,-o37]m3=Z>)ee:t)"1`B<$\sn/"6*@b;#5IS>E`1N68V:
+JDXu2$dgKd)#D891PYQkq)M6'ZbZ<Nj-GqC9[?7B?A9k'EBo4qlFQ@5$L6+CeN[^mckS2C<
+O%s;p#NY'_'\;i"4C_T=X)2B3n?(Q)hQVE`^YglV$i]EbN)cE[YAfA+).m&CG6&XoR=HoCg
+NAVlN\^0f9IGKhdSMngDoc&rrQ$N7fAWPtS(hZ_A]fUjh;I!6;9\R5YK%/X\Ak-fQQqh(@m
++k,AUid-t2k6su/a71M=HD)E(`P/UX/)2pFm)J(@J5#.7FsIGr6lZR-[)ZWe>njRI*rC\0a
+rd=Q8_@U_2=k)O@\1YkRQk36Z@U[9o,f=eH9*?_dkD<E\fS[bhDY\?&M^Q/LPr/JVc6sLWm
+#W?ki.'=:/OH,T.tPkb=H^WD\Mr8!MVWYLR]:/4Tmi1[nr3h5ih?$IU"G`dhs"g>aN[TULJ
+ZCiEF.@opt&VSX[1OB58%;Jk+-'$#mhf"np%k!AXGQDe\e1bF'U-:G+JR][^,J1Jng9dlrl
+CtT2L/9$i>\4'[@=GmJdWnJ%<aZh3oo!EG@,!MBMI`^YK^/435U-'!'c2kaMA1HDtX7\raf
+>'(C&f'0-2KX//_s(^5ja7_C[`IKS6tN9@r0imo%Ff3$4Ts<'/$N^]b8caU;4nlPi`@IpS:
+6\P=<'^X3ji6]UF=T^5q(2YnRnSlQ:M_G729tT=Ree(X`A!Te%C+_14qOoAZdj\XW:uKh?M
+@5(bLGL`n?$72m,>*c"@r-6(;"d0&9%!nlirn]_t9T'm3=Ca!m:sCaG"u<]G^C9%d(?.''p
++\`Os`)R?JBKb9S;<t@CBUYhc*`1oM@>9@8N]SH$&91MOJ(KKG#E:+09Z]cNF(86Nh/l>kC
+(dfrh.l2ZT2I<@bd-;TK"e%/lK1b1O<t%Lj-F+*sRh]V`lb[gN-L-+Jem.J$e96T3;3+M='
+*'FBQ"[t?*"oXTiYhYO0acp90h.9BPhN9U&j;'%1[Sl*d]$kieZ+eQpnoHYWFMiONN(),E"
+q\JQ53A(.gEO5RD!EqC5rhKF\o@^<AIN/DM1$U=W@m?r)`/5f#)Vr7+bI)\b3CFf:#I.<`H
+b9$Nff:([lN!)rb_u'kgG+hX41Q%VWl$C`lnE#YaRiP8;]*P.F"f9+rG.e2gqLbJ)'K`AiJ
+bU,KN=HE;\!Wc,9f)lj'&*gVK.O&_`^\`-[8)-"8<;Di3R=%e+D)P&Vs^)OH0UIaG[iJ<Zj
+_Rs';#T6HbM!T;KcJ0>L:(%;+Kc7'gp<;L\$_#+8:7_Q(>esm6%"U%+&A&*'N`tX,DbES:7
+>497neMgNkLr8IqaCg(FM.o8g72?g$G3:Ml;S8DSD$Cs[$;i4Yg/])YgmHRhX/p2Z,30M\C
+#UQ_U!,mo`DZ/D+N3n7::;8:9o`e^;5Ce-BR(,^6MWPEcaR\b=phN=l<"(eM.:IRjCJ'"Q5
+^W.*=PRTf3sf;\[eD<)7YU>25g5V)**u3E";0VH&p!`kt]^l']=lG:2P\XA[M1>ZM[!\u8N
+?A90>XiORgT(-:`;XbCuNp,#WL[5NB?JPo$oJQ!Z.&9*Y08n:8If/.NU5:)?Z:$21Y=F-WM
+m*:AZ$F+:0nO?[K0/H#mAMMZAI?=okH95969-CkiX%jKK8W0E@<OH)&MqMoV8nc8@7]*M9A
+RR\@9hXZn8-[-MCp^a1Y4>iZLeTb4\$tFqiDrlp0d>:e=$`m<K0*tTS`daG[/I0Aq'aSVOh
+rE[p@[M62m"(QY]hUq/F)r%/eXh["RF[j5?h$VF_[sjnR$VV(%&4gA&suO!+Q$]lbLAM;K_
+KWl+2.!0uA[qcHQW('#n0qi8$D=Z>a^`ZGYt]26,3/#Fs=RABnp.oQW_Xg#Wrjn[4J-(#"Q
+jJ\?O.R%!!BQe@reiN-s=+Cb)^;0jaGI+02/nJ1tf""84N!Q[$HU&k~>
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.jpeg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.jpeg
new file mode 100644
index 0000000000..464e8a83fa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.jpeg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.pgm b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.pgm
new file mode 100644
index 0000000000..ee823f2277
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/3.pgm
@@ -0,0 +1,4 @@
+P5
+1115 558
+255
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ðð÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüè÷ýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþëûÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿîþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿîþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþþìûÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþþëûÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿîþÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿòÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿþÿþþýüýþþÿþþýþþþþÿÿÿÿþÿÿÿþþþûýþÿþþþþþýþÿÿþþþüÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþÿÿþþþþýýýþþÿþþþþþþÿÿþþÿþÿÿÿÿþþþÿþýýýýýÿÿþýûúüÿÿÿÿýüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþÿÿÿÿþþÿÿÿÿÿÿþþþÿÿþþþýþÿÿÿÿþþþþþþýýþþþþüþÿÿÿÿÿÿÿþÿþþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþÿÿÿÿþÿþþÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþýýüýþÿþýýýýýýüýþýûÿýþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþÿþÿþþþþþþþþÿþþýýýýþþþþþÿÿþþýýüûúüþþýùûþþýþýüýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþÿÿÿþþþþýýþþÿþýýýýþþþþÿÿÿþþþþþýþþþøýþþþÿÿýÿÿþüýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþþþþþþþþýþþþþýýþþýýýþþþþþþýýþþýúûüüûöùýý÷þÿþüÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþþýþþþþþþüýüýýýýýýýýþþýýýýúùûûöêÝÝÛɬš£»Íáôýýûþþùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿþüüýýýøøúýþþýü÷ýüöøþþûþþüûú÷ôñÚ¼ž¬¬qnzssw‰„•·ûüñýøüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþøúþÿÿÿþûýýþþüûýýþûÿÿ÷üþõ÷üùèÝϨ}wtolknprqzsz†£«²§·òûôýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿþýûûûï÷ûûýÿþý÷ø÷úûõæéäÖ­s}gipvvuz†‘›´Ëëøùûúîçüÿþþûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþùûüúúýü÷ûùõñâ·ˆ~}zuuwwtwƒ—±Êàï÷ùú÷úûüõûÿûùþüùú÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿÿûüýýýúúùýüûúúùòé—œ¢}u€l‡{~‰œ°ìóùûüüüýúý÷ÿÿþúýùùõùùùúûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûüýýýùûüøèÄ–uvaqpr}nm¢ÆâõøúöùüýüûûüþþúýûýùýúýýüúúüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿÿÿÿýüüýÿÿþþþþýýþþÿþüþýýùôåÍ­–‡|xyt}vs‡• ³ñô÷øûýþüÿÿüûüýúøúÿýÿýÿöù÷üýùúüûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿþþþþþþþþþþÿþþüüüüþþÿþüúúüþÿüüüýýýüýýüû÷éЯ™“ƒxxwst{w–³ÊåöûüúûýýþúýþûýþþýûýýþþþþúþüþþüüûüüùüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýüýþÿþÿþþþþþþþýþýýþýþýúûþþýþúýþþýýûûüúöùþüööåÊ«’€toy{{yx¥Ñãîøüýþýùþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþÿþÿÿþþþþþþþþþþþÿûþÿÿûúüýøüúøûûûþô÷÷ýýôÒ«‰€wrrvyŒ‹œËñüøõüþýûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþþþÿÿÿÿÿÿÿþþýýüüüýýüûüþþüýÿÿüþþûýûúøêÔ¶‘xvwwuuy‰Öñùñïöýþþÿþûøûþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýýýýýþþþþþÿþþþþýüüüüþÿþÿþúóíóõüûõüüô»¥’…†‰}~ztu†«×õ÷úúüýþûûúýþüúüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþýýýüüüýýþþþþþþÿþÿþþþþþþýüùøúýýýõúñʼ¯„‚xzux€{Æåõùøøüýýýùïòþúýþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýýþþþþþþþþÿÿþþþþþþÿùöüþþùóéĸ¡w}Žwnnyms™¾åøúûüûúýþýþýùýþþþþþþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþþþþþþÿÿþÿÿÿÿþþþþþýýýýýýýýüüþüóÔ®•Œ€†‡w}Š„x…«¶Íî÷ûúûûüüýþý÷þþøúýûúþþýýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþýýýýýýþþþþþþþþþþÿýýýüüüüüúûóÖ¨ƒyuvuuyƒ—¬­Êùûøýöüüüýþþþýûûþýýýýýýýýþÿþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþþÿÿþýýüýüúúüýýýüúýþþýýýýøýøóû츩”—‚s†xtpp{—½â÷ùûýûûþÿûÿþÿÿþþþþþþþþýýýýýþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþýûýýýýýøôþþýþþýøðúöúîϵ™ˆŒ{k„‚xªÁÜðúúõùûýúûþþúÿÿÿÿÿÿþÿÿþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþýøùüüþþþ÷ÿÿûûüûùø»ž|u~is``fˆž¶Üàú÷öøþþþþúýýúûýýúÿÿÿþþýýýýýýýþþÿÿÿþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþÿÿÿþþþþþþû÷øöýýü÷õæ¾”²‚}sjdZ}t”¿æððýüûûýþþÿùôüþþýýþþüþþþþýýýýýýýýýþþþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþúúýýüûûûúöÛ±‘„€|zssxy€£Ðèïöýüùýûþûöòóùþþüüüüüýýüþþþþÿÿÿþýýýýýþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿþöýüöõîèèȧptyqeo‡Š¥ÇÝöøýÿÿÿÿþûúýþþþüúùúüûüüýýüýþþÿÿÿÿÿþÿþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþþÿÿÿÿþûüïÔɯŽ„zmosrx‚µÚáñýýþõ÷üþþþþüÿûüýýýýþÿýýýþþýýýþþþþþÿþþýýýýþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿûüýþþýüûüüüüüûûùáܧutsirztx„ˆ‘·á÷ûøüþ÷ûþÿþþúýþüÿÿÿþýÿÿþÿþýþþþþýþþþþþþþÿþýüýýþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþýýüüýýýýþþþþþÿÿþþþþýüýþûùüþþþüø÷úþþþòýýùóè꾚¹bmrnxŽ¡«ÂíûúûýþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþýýýþþþþþþþþþÿÿÿþþýþûþþüûüûøÿÿþúúþûõýõóᵄŒšs—ˆqka‰ÐÙòúøýú÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþþþþýýýûýÿþýöüüûûüúðÎÁÀ‘†”‹~tŽƒ‡¯ÇÞûïýýýýþùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþýýýþþþþÿÿÿÿþþþþþúúúûüüúøúûûùæÆ †~|Ÿ€‚•€Ìâäõüüù÷û÷öþþú÷ÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþýýýýýýýýýýýýýþÿþþýüüüüûüþýýûÐű¤ƒwxœ~ž­ÕóûôòûûþþüýþýýüûýþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþþþýþýþþþþýýýþÿþýüüüþýýýüíØÈŠ„ƒ‡†|ut~¨Ñ½Ïñøöôûúýýõúþùûýýúûþþþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþýþþþÿÿþÿýýýýþþþÿÿþþþþýýþü÷õöîѤƒ|zvv‘ž£Ììýõûöýýûüüù÷úüöþþýÿÿÿþùþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþÿþþùùúüýþþþûúúúûûüüüüüüüüüúÛ¹–Œ”˜‡€Š–°Øñöûþúùþúþûþþþýüüüûþúýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþÿÿþþøýýýþú÷üþüþþúùúûýûöøùñ×½¦‚rs‚ •½Ðãî÷üüôüüýýþÿÿþþþþþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýþþýýýýûúûüüþýôòúúüþöðûæƇ‹ˆ•‘ƒ{x•ÑÑÔðøýþþþþþýüýþþÿþþýýýþþþþþþþþþþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþû÷ùþþþüüýüü÷ô÷Ø¢…~u†|t˜°ÊÏÙûù÷ýþþüúùúüþýþþÿþþþýýýýýýþþþþþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþþþþ÷ÿÿÿöôûþðýûõѸ¬|‹|‰u‹{ž¬Õæùýöýôþýûûýüûüþÿþÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýýþþÿþúýýüüûõùåäx‹s†Å»îöýøõûøûõýþþþþþþýþþþþþþþþþþþþÿÿþþþÿþþÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþú÷ùõðÛ¸¿‡ƒ}~‘«•¥ÍÐñîþüúüøýúþþþÿþûúùùùøþýþþþþþÿÿþþþþþþþÿÿÿÿÿþþþþþÿþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþýýýþþþùøùáµ”„Ž‚…‚’¥ªÉØéùþþþÿùùþýúïúþþþþýùúþþûýýþþÿþþþþþþÿÿþþþþÿÿþþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûúúûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþþþûúùøøùùùÝο {y‡ƒœ¾³ÍóðüüþþþüúüÿüýûýýýýûþþÿûýþýûýýþþÿþýýýýþÿþþýýþÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿúúÿÿñÿñÿÿüÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþÿþÿþþÿþþþÿþþýýýþþþÿþýüùûüýýþþþþüþÿúúýýþùýúûÜÁ¹uŠ›‡Œ‰…É¡Ôûûïòüþþÿþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúøüÿÿã¸øÿ÷êðÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþþþþÿþþþÿÿÿþþþþÿÿÿÿþþûûúúúöøþûþÿûúýþýóüòÕ¬‡‚‡{¬ž’¼Íìòþþúúþþùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöþÿþ÷ûüòÍüþÿÿýÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþýýýþþÿþýýý÷üýýÿÿüþöþþýýüñ㵫ġ–ˆ†›‡ÖßÒüýþþþþùûþýõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿþûÿÿú®ÿøõýÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿþþþþýýýýýýþþþýýüùûûøþþõôöýüúõÜ­ŒznŸ‹„™œ®âÔ÷ýûþôýôúþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûýþÿøèÿðêÿþûüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþÿÿþþýüüù÷ýýýýüêϹ¬ œŸŽ†‚Ž’Ùîúûüûþ÷ôþÿÿýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿþôõÿÿû´Çöûùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþþþþþÿÿÿþÿý÷üýýöóù´§£Ÿ“–°Å²§¶Þòçø÷ïüûýûûþõÿýúûüüúùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúýÿýûúõòÿòÎûþïþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýþþþþþþþþýýýþþþþþþþþþþýþò鳪‰~Š“§Ðá÷åýùýþñþþýýýôùýô÷üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿþþÿÿÿûÿöÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþüûûûüüüüþýüûûüýþúýùʈŒu†{§±Ùúûýþÿ÷þÿþÿþþþýýýúýþÿÿýþÿþûÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþûþÿÿÿýùõüûüýþþýþóþøüúõ׶¸Æ̤†}yž•¬Ïëûþûøþýþþÿÿþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþþþþùöúÿÿþüüýýûüüúùòüúઋˆ‚•’™³·ÃòõùûûùúûþýýþÿþþýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþþüþþýýþþüýýþýýþþõüéÞš–žž€‚€Ÿª¸æùûüýÿûúúüþþýþþþþýýýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿ÷ÿÿÿûø÷÷ýûýý÷øôã±£¯’‘’¥•Ž®ä÷ùûûñôøýþþþüûþþþÿþþýýýýþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿþúøûýýùøûôÞ϶’—Œ…•‹ÇàØîúöüþúüýýÿÿþýüýÿÿþþþþþþþþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿý÷øýýüôôåÖ¾¤¥¤‹‡ž”¼ÀØû÷öûýöþþúýûûûûüüüýÿþÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüûûûð×ÁŒ˜˜ …’¹Êûø÷þþøþýýûöúÿÿÿÿÿÿþýûÿÿÿþþþýýýþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿüüüüüüüüúýûóáÄ£Œ›•œ™”°Å³ÞõúýûýúþþùûÿÿþþûýýýýÿÿÿÿÿþÿþþþýýýþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþÿÿþþþþÿÿÿþþÿþýþþþþþýûþÿþþüúýûõùýþþüôúíÉ™±´•¢»´§Æìøú÷üþÿûùúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþþþÿÿþþþþýýýþÿþþýòõûøôýþøúýþüéÕк‚‘ ‹¥¯‘Š¥ÏÞÜíýþþûþÿÿüûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþþþþüýþþþþþþÿýþþüþþóõüõëÅž Œ–Œ˜…­Ï³¡Íîûúýýýþÿÿÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþþÿÿþþþþþÿÿþýýþþþýþþþùõùûøúýøìΰˆu‘¢‰Á¿ÛüùýöûüúüýùúþýýýýþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿþþþýýýýýýþþøþüýýéÍж²³—‚Ÿ²¶Âúúøüöþüüýüþþüúüüüþÿþüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþÿÿþþÿÿÿÿþþþþýýþþþþþüýü÷ðÅ”‰Š¡…ŒÆÞîûíûøþþúýúüýýûûýþüýþþÿÿýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýþþþþþþþÿÿÿþþþþþþþþýüøòнÀ³•‹—˜©ÅÀÌôýþýùüøÿ÷þýýýýü÷ùþþþýþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýþýþþþþÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýþÿþþþûüüüüüüüþüûüýùñéÛ“Š¯¡„–¶âéöüûûþùúþþþÿøþüýýýþþÿþùýþþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýýýýýýýýÿþÿÿÿÿÿÿþýüûûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþûø÷ùûýýýüþùýúýöûý÷Õ¦‘•¢ž…ªìÙÀôöùûýýüûüÿÿÿÿÿÿÿÿÿþÿÿþþþþþþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþÿýöþüþÿÿÿþýûýþÿÿÿÿÿÿûÿÿùñòúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþþþýùöûúÿúúõøéüñíÙ®›‹¼¬µÝ÷÷øþúûüýýýÿÿþþÿÿÿÿþþþÿþþþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýûóýþüÿýúÿÿýúúýÿÿúüþþûôíèïöüúö÷üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûûûýþÿÿþþüýùýõüÒ¢—ÂÖ¤‰Ÿ¨íáðüùýþóüýþýýýþþþþþþÿþþþþþþþþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþ÷ÿÿ÷ÿþïúýÿÿÿÿÿüûüþý÷ïæàëóûýüýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþýûùùùöéîäã–¡‡ªÐ·®Øøùýþûüþú÷üüýýýýýþÿÿÿþþþþþþþþþþþþþþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿüõüûùþþþøýÿÿÿÿÿûþýýüùöóòõúÿÿÿþú÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüüûúúûóÁ–ˆ§½„€¢ÑåÞâóúöüùôþþúüûûüýþþþüýþþÿþþýýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýýþþþüý÷íþüþûôõýÿÿþþýýýþÿÿÿÿÿþýýûøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýüøìäÆÍ©’}§µ‘žÙøùõûÿýüúûýýýüùüüüýþþýûþþþÿÿþþþÿþþÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþûýôîôÞÈäùüûõõýÿýýýÿÿÿÿÿþþþýúûþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþúýýúëÒ´Ÿ«´¨­­ÙáØêöüýþþøòþùþþýþÿúýüüüþýüüýþþÿþþýþþÿÿÿÿþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýûüýýçá×ÕäÝÍÝóüÿýýÿþöýþÿÿÿÿýüüýýûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþýýýýýýýýýýýýýýýýüüüüüûûûüïÙò¥›•²¯®ÃÙùùûþýüýúýþþüýýýþþýýüüüýþþýüüýþþþýýýþÿÿÿþþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿýýýýýýýýÿÿÿÿÿÿÿÿÿþþþþþþÿÿþùôðìêéþëßÞîùóóúÿÿüüÿÿüÿÿÿÿÿÿÿÿýÿÿÿþÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþþþþþþþþþÿþþþþþýýýüû÷ÿþýýýÿüùþüüýûýðþù÷ûìôÄÉ“œ—œ©ÅÔèöûûüýþþþþÿÿÿÿþþþÿÿÿÿÿþþþÿÿþþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿþþþþþþþþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþù÷þýþöþþýþýüýýýôùüþþýûúùýúøüýýðâàåýûèÙ×óüúùûýþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþþþþþþþþþÿþþþÿþþýýýýþÿýúýýÿÿýüøúýûõýñøòÙ§§®—™Ÿž»ÓòöüþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿþþþþþþÿþÿÿÿþÿþþþÿýþþþÿÿÿþýûþþþþÿÿùúûþþüýýýýýýûûýýûõëâÜÕÍÇÓÜõøòðîþüüýýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿþþþþþÿÿÿÿþþþþþþþþûþøüÿýûöôùüüúþýüù÷öäÀ¿¯–°¬¢®âèûûüýýûûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþÿþÿÿÿþþÿÿþÿþÿÿÿÿÿÿÿþþüüûþþþú÷ýþþüøùøöüûüýýôâÕÁË×ßááâãò÷ýýþþúüüþÿÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþþÿþþþýýúþüýþþýüûô÷øüöÍž©©Ê˜ª³£´ëëèæüóûóúúüýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿþþþÿÿþþþþþþÿþþÿúþþþüúûýúüýýüýìÕÒÞâ×ȵÊåøýüûûýüýûýþþþþÿÿÿýüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþþþþþÿýýþÿþýýüúüýû÷öüüüûüä̦Ž˜Ž°˜½ÎØùïùþþþ÷üüøûþþþüûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþþþþýýþÿþþþþþþÿþþýýýýýýûûüòýüýýýøøîæãÞçôÚ¿½ÒèíéèòûþþüúûþúöûýúýÿÿþýýþþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþþþþÿýüþÿþýüüúúùþþýüñÜ»¥Œ”®¢’‚±Ùîáïúõÿþøþûþúõúüþüù÷øùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþþþþþÿþþþþþþÿýýþþþþþþùüü÷ýýõìèóö͸ÈÉÍèâÞäñùûøüüûûúûýÿþþúþþõùúÿþüüþþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýýþþþÿÿþþþþþþþþþþþýýþþþþúúýúøòдœ˜Š•··¸ªûùûôøüýúûüûóüúüÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþþþþþýýýýýþþÿþþþþþÿýþÿþþþýüûüæë÷üàÔÈáóÏÈîôöûûúûüýþþýýüüþÿþýñøôûüöþúþþþþþþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûüüýþÿÿýýýýýýýýþýûúúûýýýøúïɾȱ¿¦¤” ËÜîûûüýþýþýýüþþüþþûþþûüÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýüüüüüýüüüüüüûûüýýýû÷ôñòç­·ÁèÇÅñéùõõüôþþþþþþþýûÿÿþþÿÿÿÿýþþþýüÿüýþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþþþÿÿÿÿûüþýúü÷ûûýþþý÷ûìÛ¶Ž¡ŸÚæÓÌéôðûýüýýþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþÿþþûûþþþûûþÿûûÿÿúøûúüýüþþùý÷ýîæìκáР»ÉèÕéùûýýüüüýþþþþÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿÿþüüýÿüûþúúþþúøüîýßÎÜ´ª«—Š‘¢Æôý÷ðýýüýþþýþþþÿÿÿÿÿÿÿÿÿþþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿÿÿþúûýýüþÿÿþÿýùûûüýýýýýý÷ùýöìîÒÄÑÇÆõìÍâéüðüýÿÿþþþþþþþþþþþþþÿÿþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷üþþþüýÿôúýþþùýöýüõ¾Ðœ¨½®—“®Îæüøÿþûþýøùÿÿÿþÿÿÿÿþþþþÿÿÿþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüýýýúüþþûò÷üþþþýûý÷ëèèÚÏ×ÆËàÕÑçïúýûòûûþýÿþþþþýüýþþýþþþþþþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýüýÿþýüûüüýùüùøüúÙí𴹕“¢ ÑÈÞóóþ÷ùûýûøúýûþÿÿþÿþþþþþþþþþÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþýþþüüýþû÷þýûüûúöîüïÈ­®°»Õ×ãûùñùûýúûþþüýýøýþýýüüüþþýþþþþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþýýýüúùüúûõæÞ¿™«¾¦¤ª¹ÂÈûòøúìýûüúýþûþþþþþþþþþýþÿþþÿÿÿþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿýýÿÿúüýýýùúýúëáßÚ×ͼäëÕµ°¼×úùüþýøù÷öþþþþþþÿúþþþþÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüþþýýú÷îIJ¥£µ¡ŽˆŸµ·×îùúþÿþþüõüüùûýûüüöÿÿþþþþýþþÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿþþýüûüüûùɳª«®»Ã¹Þó÷ìéîóþõó÷úûþþÿÿþþûþþþýýýüýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüýýþþÿÿÿüýþþûòçß½¸Ž…ˆ›Ä»””¹Ýàöþþÿ÷þýúûöþþþþþþþûúÿþþÿÿÿþþÿþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþþÿÿÿÿÿÿþÿÿÿýøöúóãáîõó¿­ª¯µÑîõüýýüýþþûÿýýÿþûýöûÿøùýüöþþýüýþÿþýþþþþþþÿÿÿÿÿÿþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýùúúûüýþýýüüùêÔ¾°¯±Žœ»íêÙâûüöþþýüþüþþýýúþþþýÿþýÿþþþþÿþÿÿÿþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿüüüüüüüüúúûüýþþþþýúüþûñçÇèí̶ËíüÂÇâòïöûûüúýþþýþüÿýýþþûýýýÿúÿþþõÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþýýþþþþþþýýýþþÿÿÿÿÿÿþþýüýøýøþþýýùúýúöþøýøæÖÌԷѼ×ßµÖÔÉëòû÷ûþýûúüÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿýþþþþýþÿþþþþþþþþþþþþÿÿÿÿ÷ýþþúüýýýþþýþþüþýþÿÿùýýøùøüõù⦱ÉèôãÝðýúïôùýýýýþþþþÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýþþþþþþýýýþÿÿÿþþýüýþýýþÿþûøùûþýýýüúýõè¼™£‘¾²ÒÊÞóÚúýôýýþûþÿÿþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþþþþÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿþþüýþþÿÿþÿüþüþöþÿýþûüøëèäÛïßãܬÅâõþùõûÿüøûþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþÿÿÿÿÿþþýþþþþþþþþýýÿþþþùúþýþþùöýøûúòÔ¿œ¡ª•«ÊÊïõüðþþûýûùüüýýþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿþÿþþþþþþþþþþþÿÿùùÿÿýùûÿþùþýþüþùýóóýø͹·²ãàê÷ÖôøûþþþÿýüþþþýüüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþýþþþþþþþþþþþþþþÿýÿþÿúúýýþýëÞÛÔ§¡·¦»»Í÷ãýûþûøûù÷üüýüûüþþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿþýþþþþþþþþþþþþþþþþúüþþþûúüýüýüýõ÷êùùÏÒæʾÌÈÇòùûýñýþûúþÿþýýÿÿþüüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýýþþþþþþûÿþþüýýýùüþüúü÷óçȤŸºœ›Î»ÚØùýýöþûÿúþÿüÿþÿþýþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþþþþþþþÿþþþþþþþþþþþþþþÿûþþùøýýüüúûòûàåÀÜÊŒ»éÈÞý÷ôýþüøûüþþûúûÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýþþÿÿþþýþþüûþýþùýúñáÏı¯²¨§ÓÊÀãùýøûõûòÿùüùýýúþûÿþýþÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿþþþþþþþÿÿÿþÿÿÿþþüýýöúýüõïÜÚÆÙÂ׳ºÆ£Ùüõýýýþõÿý÷þþüÿÿýüÿÿûýýþÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþþþýýþþþþþþþþþþþþýþþþöùùÓ¼¦•£”¡ÅææûüôýýýþùÿõûüþýþýùýÿÿþýýýþýüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿÿÿýûþÿþþþþþþÿÿþýýýýýüüúüøíçêìêÔ¹¬´ÉÅãÎØùøûøóýûüÿúÿþüþúüÿÿþÿÿýúýüüýþÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþþþþþþþþþþþýýþûýýüüüñâ·Á›—˜Éû×üûûþþúýþùÿýÿÿþÿøþþûÿþúÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿøüÿþùøûÿüüüüûüüüýýüüüüüüíêßÆ°°ÆÝÔ½´áòôüùýûüýýþþüÿÿþþþþûþÿýüþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþÿÿýû÷üûûýùöûøþöüú¾Åª¤ª…Œ—ªíûøüþúúþþüþþþþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûûÿþÿýüþþøýþýþøûþüùüýýýùýôò÷ûóÛ²¯ÏÛ¼¸ßö÷øøùùúûüþýþþÿÿþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýþÿþýýþüþþþÿûýñÎÄ™˜•Ð¾–¬Ôéýïúþýúúþþúþþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþûøüþþøúÿýþþüÿþ÷üüýýïùý÷Ó¼ÁÌâ ¬Øóèãóûúûûûûûûûþþþþþÿþþþÿÿþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ùûûùùúüúþýúýüôðõä׶º“Š¼õúùúù÷ýþüÿÿûûýüùÿþþþþþþÿÿþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûúûýþþúÿÿÿö÷üõýýõýüûóËËßáÆ®°ÅÒÅÆÐëüüûýüüüýýýüüüþþþþþÿþþþþýýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþýüþýùúöâÎÈÖ·™‰«›¥õýù÷ùýýúóýþþýüýýûþþþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþûûþþþüÿûúøùýýýýýóéØàà³”ÑæçÝ×áöúûûù÷úýýýüüýýýýþþýýýþþþþþþýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûûüýýûþñäæÚ¶¢®Á§—ÁÉ×ýúúþþüýüýüüüýýþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþùöúþùúúý÷àæããÓ­³ÙêÛ²íøûýüøýýýýüöüýýýýýýýýýýýþþþþþÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøùýýýýýùãñº´’ˆ²éæäûøùøýûûùúûõóúûûüüýþýþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþþüþþþúýóöøÈœ¨·ÎʱÏñõüðúûúþþúýýöýüúþþüûþþÿþýüûûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿþþýõìæ亢›²»¨ªÇàøôûý÷ýýüþýþþþþýüüüýýýýþþþþþþþþÿþÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþüýþýùøüôÃáé´˜¦Ïèñíýýóúþþþýþýõûýûüýûúûûûÿÿþþýýýüþþþþþÿÿþþþþþþþýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿÿþþþýýýýýýýýüüüüüüûûüõå˱£¢§¶«´ÖçßâùþþøþþýýüþþþÿþýþûþþþþÿþþþÿþþþþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿþþþþþþþþüüüüüüüüýýýýýýüüûññïϱËüåžÞöÒÈÉùüýýýþþþþþþûþÿÿÿüüúüýûüþþþÿÿþýýýýýýþþþÿÿþþþþýýýýþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿþþþþþþýýþþýýýûýûþûöüýùýúýüú÷ÛÚ´¨«‘y‘¹ÀÎáóüýýûÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþýþþþÿÿÿþþþýýýýþþÿýþÿÿÿþþýûþþûýþûüþûúüùøþ÷ûþöùýæøھƼŽÁûÜÆéüöüüùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþÿþþþÿþüüùûøýþüüøûý÷ûû฻¯ª¢ŽŒ²Ýéïöúüûúøÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿüÿÿþýöþúõýÿùûýøýúêáêާ̷±ºÔ³âüüìûýüýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþþþüüþÿþýýýúÿüýýýþüùúíÜÑ´¥ª¢¿ÒÍÁÈäüýþþýûûúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿþþþþþþþþþþþþþÿûúþþùüýüþýûþýûúúÛÓ¾»Äʾ·ÄÒæûïûøýüûþú÷þøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿþþýýþûûýþþüüûùýýþþü÷çëˤŸ«¨žš¤Öôôóõùþùûüýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýýþþÿÿþþýýýýýýþþýýþþþþþýþû÷ûüûúùüïåçÔÎк ¯Ä¿»½ÙõïýöýúûøþùþþûþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþÿÿÿþþþÿýýþþýýüüùüûýûèÍ«§–Ÿ‘¬½ÑîýûþþùúúüþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþýýýþþþþþþþþþþþþÿþþþþþþþþüûýùýüùúäÐàýˡ ÂÊÂÏëóõöòýúþðýöþöþúþþüþúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþÿÿÿþþþþþþþþÿþýþÿÿþýýýüúðظ¡µ›±Ã¼ÏëóûýýùüýûûþÿþýûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþþþÿÿÿþÿÿþþþþþþþþøýýòòêÒ仕­«¿Ö³ÂìûõõüýýùûÿÿÿÿÿüüøþøøûùûûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýþþþþþþþýýýýþþüüþþýýûúòìÛ˳ ¤äÎáóöüüøýûûüùúüúýýýüüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýþþÿÿþýýýýýýýþþþÿþþýýýüûìÓ×ù³œ³ÉãôéøúþùüýøüýþýùñûûýþþûþþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþþýýýýüüüüþýýýýûöïéäÔ½£¦®°»¾üöþþþþúýüùýþüüþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýþþþþþûûûüüüüüúüýüüúûüñÛ¶¦ÏÌ´ÑØæõüüüþüÿþþýûüûûþþþýþøÿþöþþþþùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýûþýöøýõûÿýüøýûôýö³‡›¸Ê™£³Àáðüþþþÿþÿÿÿþþþþþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿüþÿÿþü÷òúþþ÷ùýöûúÿûÿÿúÿûøûøÛʹÞÅÅ°Ôíóç÷úûüýþþþþþþÿþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþýýþþþþÿýõýüúýãܳ’š´É¦Çëõûöþþþþþÿþÿÿþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿþüúúüÿÿþøûþøþÿùþþý÷ûýýýìåÏÞ›œÆÆÞÄÕéøýõþüûüýþþþþþþþþþýýþÿÿþÿþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùûþøüþûþúúþøúñöð¹Ä­†‰ØöÜîþûü÷üþþþÿÿÿÿÿÿÿþþþþýþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿýüýÿÿþýýýýýøþþóýûüüôÞÚÞÈƴב´çûùîüüûýùýýýþþþþÿþþþýüüûûüþÿþÿþÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿýýüüøöýú÷ÞÊê³Ð¢…œ²ùúóþþ÷ýýúþþþþÿÿÿÿÿÿþþýýüýþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþüþÿþýùø÷ýýþþþþöüââçÖ®«Á¾¿ÊäÀµçòüýüüýøûøûýýþþþþýýþýþýüüüüþÿÿÿÿÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõþþþþûùüúúúÀ¬§’Âå¾µÝîþõ÷üýúþþûþþþþþÿþþþþþþýýýþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþûþýø÷ûýýüûýúòëÜÚº¨²¸®½ÚâêûüüçýúüýùþþûûüþûûüüýýüüþþÿÿÿþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùþûûýüöõäÖÍ”§™§¨§Öóùûüûýýûûýú÷ûýþþþþÿÿþþþþþþþÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþ÷þþúûýûîøçâͳµ¹¹¤—²ÑÞîøüúûôþûýúþþùûÿüúûýüüüüýýüûþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþýìåáÒ¥™§³ØÉÆÙàøýûúûýûú÷úþþüüüþþþþÿÿþÿÿÿÿþþþýþÿþþþþþþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýýþþÿÿÿþþþþþþþþþþþþÿÿþþöþýùûüâ½Ê·½«“±ÔØÈÆåøþþüÿþýùøýøúþþþüþûúüöýýþýýýýýþþþþþþýþÿþþþÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿüüüüüüüüøïüõ´¢´§¡ÊõùòüÿýýýüþþþÿþýûüýýúþþþþþÿÿÿÿÿþþýýüþÿþþþþþþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿûûüüýþÿþýýýýýýýýüüüüüüûûùüöêïñΪ¡¾½ªÓûûüúþþþþùý÷þþúùþýþýþýþüþÿúýüýýýýýüþþþþþþþþÿþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþýüüüüýýþþþþþþþþþÿþÿÿÿÿÿþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþýýþþþþýýþÿÿþýýýþÿûÿþÿôüÿòþ÷øûþøâÊáÄ £˜ª¡Áãõûüüùÿþþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿþþþÿþýýýýüýýþþþÿÿÿÿÿýþþýùøûýùýùûýúûúýôþ÷ýíéÚáää˸ÕÛ­ÒÒíçáöøýþþÿÿþÿþþþþþþþþþþþÿþÿþÿÿþþþþþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýþþþþÿÿþÿþþþÿþÿÿÿÿÿþÿþÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþÿþþþþþþýýýýþóöùÿþþûýøýøõüàÖ°¨ž·º°¶²²Üëùýþþýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿþþþÿþþýþþþþþþþÿÿÿÿÿÿþýÿþþþþüýýþôüýýþýüñóüß«–®½»®ÀèõçøòþûôþüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþÿÿýýýþþþþþþýýýýýýþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþýþýýþþþþþþþÿüüüüöûìÏÞÁÄ•š—¥ºÆÚñõûýýüûýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþÿÿÿÿÿþýýúøùüüüôóýñ÷üúûàà·ÉåÞ££ ÈÒÓðýú÷þ÷þüùþ÷øþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþÿþÿÿþýüýýýýýýýýýýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþüýýþþþþýüþþÿþýýüüüüþøýü÷ûÁ­¦ºÍÇœ¤Ððøûûùûüüúûþýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿþþýýýþþþþþþþþþþÿþúýýþþüûûüüûûñøíé­µŸÀàܧ©Ùøýøÿþ÷þÿöýýüþúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþþþþÿÿÿþþþþþþÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþýýýþþþþýûþþÿûüûüüýûüëçÒÉå·Œ˜äæ¼ÎÔòøöûöþûþÿÿþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþÿýüüýýýþþþþþþÿÿÿÿùûþþþýýýõøÖéÄÇÊÌœ¥²Öóúöüöýþü÷øüýÿüþþÿÿûÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþÿÿÿÿþþþÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþþþþþþþþþþþÿþþûþþýýþþþûúîâĬ‘’ÁÙ›–¬íùñúôýþþþõþüþþÿýüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþþÿýýýþþþþþþþþþþÿÿþýýüüüûö𻾔¸š«ÊÕ¸ÂåøûøúôøñøþýþýôøýýúüúøýÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþþÿþþþþþþþþþþþþþþýýýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþþþþþþþþþþþþþþþþýüÿÿýýýýõÄÎÌ´®‰†›Ûã·äüüòüþþúúýüûýûûüüüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþþþýýýþþþþþþþþþþþýýúúùôéßØÕ– šÂ»Ðòøø÷üúùöþÿþüúýûýþùøÿÿûÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþüüüüüüüüýýýýýýýýûûûûüüüüýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿüüüüüüüüýýýýýýýýþþþûúöçÔ’ªÆ²È˜¥Ãùûüüùÿùþüþúþþ÷ýýýþýÿþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþûûûüüüüüýýýýýýýüðé׸Ÿ ºÓ °Òìñ÷ýüýýþüÿÿþüùþþÿþûýýùþþùþþþûÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþþþøþþþþùûûþþÿöþýúþøþüñýþøþûÿûûÿúýþúüÿýþþþÿÿþýÿûúÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþþûþýûþúþüýþûýüûÿþíüòÅæ꣠ÓÃÕÈßøýýþþýýýýþþþþÿÿþþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþýþþòùþüþúûýôúÿüþùýýýüôæÚßÈ ª¶š©ÚæÝçôûþüúùþþþþþýýýþþÿþýýüýþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþûþùùý÷ôýùþùóþýñþýûýøûÿþþûõÿø÷þöþüýþþýûýþûÿÿúÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþýüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþþý÷þþþþúûûÿúþþñýùüôéÓ¦µ¸ÔËÍøñûðñûþþÿþýýüüþÿþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüýþþÿþþöýøþþûýôùùóþþ÷üýùãõâ̾±·ž¶ÔÑàûûöúýþýûûûþþþþýýýþþþþþýüüýþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþüþùþóýüíüýüüýüùÿûüûøþüïøþþüÿÿýþýýþþþþýÿÿüüþöÿûüùÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþùúýüþþþ÷õýû쾶»ÅÑ –³ßüöþöüþÿÿþþÿÿÿþþþþþþÿþþþýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýþþÿÿüÿüþþýÿÿþúýýöùûúˬÇÍÈÅ¥¬ÏÈßøùýýúýþþýûûþþÿÿþÿþþþýþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþÿþúüþóýÙį·ÔîÝßåÒãäôüüýúýôþòþþóþõøúøøþÿÿÿþüþüÿ÷ûÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþøþþþýüüýüøýøð桘œ³Í™¥Þüüùý÷ùþù÷ÿÿþþþþþþÿþÿÿÿþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýþþþÿÿÿûø÷÷ûûúõûÔ¹Ôѽª’©ºÑíóöøþþþûú÷úûýþýýþþþþþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþûûýꈕžª¾£»ÒǨ ¿Ë¸ºÇÎÛïøýøñûýüýýýþþûûýüþúþùþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýþÿÿýýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþóúüýüýüýþñÜéæÕ~š©§àøÚçøûôùûýýþúôþþýýýýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþþþþûøýýüüööûî벓¼¾¦˜©Æåçîûùûþÿüüýþÿþþþþþýüüýýþþþÿÿÿþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿøþýöüñ[z²ÃÚßàÜÔïÇÇ¢¡³²¥¬àÐÂξáØèëîúýûýúþþûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüüýúúñöñ§¼Õ⯯Úäúù÷ýùüýýú÷÷ÿÿþþþþýýýýþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýùüûïáÙãÒº¼ž”ÂÓÑÝáûûöüûüûü÷÷ÿÿþüÿþýüüýþþþþþþÿÿÿÿþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿùúüüúûÉ|‰·È×÷ðûúõãòîÖÙä⾺äÐÃͳ͸¾·¿ãõòòûýôþýþ÷þþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþýüúüþÿÿÿýûþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþþþøþøóèÛØÉÖ泶ËèêÞõýûöþþøùùûüüþûþûþþþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿþþýüùöæäÓµŸ£Çñ¿ÃÈèøûüûýõõýúüþþýýÿþø÷üûúúüýþþþþþþþþþÿþþþþÿþþÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþÿÿþýøüüòûîÅÅÎÇå×ûøýøýýùýýûûûúôîæÕÌóะÔãνæ×Ëøöòàùüüüýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿùûýþýùõòäéñ÷üýüûýþþþþþþþýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþýýýýýýýýüüüüüüûûøøÝ¿¤ ¼ÇÜÊÃÍæùüùýþûýÿõþüýýýýþûþþþÿÿÿþÿþÿÿÿÿÿÿÿþÿþþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþþþÿÿÿþþþþþþþÿýýýýýýýýúûûú÷óîë½²½³™Ž§àæáòúùüýýøþúþýøûûûþÿÿýûÿÿÿÿÿþþþýüþýþþþþþÿþþþþþþþþÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþÿÿÿÿþþÿþÿÿÿÿÿþþþýýüûúøùèÞÁÊÄÜáøüþþýûúúüýúøýþú÷ûüöèíïÚÔäáÍêñ·¿æáõüîúýøýûýüýýöúýþûúþüùüýþýûýûúþÿöûïýø¢rt‰¥ËÕûûõýùøýþð÷ýóýýýøþûùûýûÿÿüÿÿÿýüýþþþþþþÿÿþþþþþÿÿÿÿÿÿþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿþþþþÿÿþþþÿýýþþÿþþþúøùþýýÿùÿýýøüýõù׳”äÌÂÎßóýþúúýÿÿþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþÿþþüüüüýþþþúýýýþüüþùûüýýúüþøÿþùüüúÿûù÷øØÞƽ¯ŽºÆ§¼äýùûýþþýûùÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþþýüù÷ýô÷ÛÓÃÙÙèå÷óýýùþþýþþýýþýüøþþùûùûôöùËÓ×éßàØÉÚôóèòæòüùýý÷þþüûýýþþþýûþþþÿúþþùõûÎk‚¡¬œ˜¸®ŸÁÛéôñòýþûþýþùüöþþýþúñúÿýþÿÿÿÿýüþþþÿÿþþþþþÿÿÿÿÿÿÿÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþÿÿÿÿÿÿþýýýþþþþýþþüúýýúúþõþýòë˧²–Æœ½Ûêøüþýúùýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþÿþÿÿÿþÿþÿþýýýþþÿÿþþþýüüýýþúö÷øüþþüþýûýýúúìëñΧ²º¹ž–ÙøîôûþþþÿÿÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþþþþüüýþþþþþþüþñúñúøíãñØíØëäæñ÷øüýýÿÿôúüýþüþúýýýýïýýöóðäÙäöüÜåËëøäþýÙé÷þþûøþûýûûþýööõúýýùüî­¸òùѨ‹¦¢š‘Š“ªÀËÐêóûøýýýüîýýþþûÿùúûüüûüþþþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýÿþþþþ÷þÿøúýüýýýöõéÛÝ»§¹“¼ÓõúùþÿþýüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþýýýþþþÿÿÿÿþýþþþþýûþþþÿýòüüüüüòÞÇžµéÁ§¶ÑÐãÖôýùýýþþþýýüüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþþýýþþÿÿÿÿÿÿþþþüüüüýýýýö÷þÿÿÿþúýõûãòÝëäâíñò÷ùúÿÿöþþùýüúüþïþñýüü÷þþûùùûþùô×õõÎâìá×ÖæêÞäþþþüùüýýÿþøúôýò¶šÙûõøüûûá½®¤š“‘­ÇÑìôûüýýýøøþÿöÿþÿþüüýýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿþþÿýýþþþÿþýôúýýýûöûàÒÜÞÖÙË´ÇÚÌÒøúüý÷øúýÿÿüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿþþþûûûýýþþþûýþþþýýþýýýýûþþûüóìàÓ蓧éÐÃßûûüùüú÷þúüýýýüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþþþþÿÿÿþþþÿþþþýýýýþþþÿþþþ÷úøþþüøûôû÷üûöûù÷ûûùûû÷þúóýýûþÿðÿõÿøøùþûøýýúýþüòüøáåõøåØáãÐËÛçóüþþûøûþþýöýö¤cÑõøþûóüøûúûðÊ­ ’ˆ–›¢¯ÆÖüôÿþþýøþúûüÿÿþþûþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþÿÿÿþÿþþÿþþþýýýþýüûûüúúûõÕÊνž©ÅÝîãÏïûýöýêýþÿÿýûûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿþüûüýþþþþüþþþýýýüøýüûþøìæåؾ ›¶¼£¸Ìûüòýüðøûýþþýùøþÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþýýýþþþüüýþþþþþþþüÿýþüýþþüùýþüüø÷ûîêùüûù÷þÿÿûÿÿÿÿüûÿÿüüôúþùúþúþûùö÷ùí×ÍÙê÷ûùîæèî÷òýýýò©ûÿýÿÿüþþþùýýùùøîÛÕÅ¢—–œ²ÂéôðúþþþýüüýþÿÿþþþþþþþþþÿÿÿÿÿÿþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþÿÿþþþþþÿþþþýýþþýýüûûúòúÞ¦§£¸ª¢Ñíñýöþýùþýùþúþÿÿýûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþþþþþþÿÿÿÿÿþýýýþÿþþþþþÿýýÿÿÿþþú÷ûâ»°¾Á¶¤¯ÕäÖüûüûðþüúýþþûüûøúüþÿÿÿÿýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿüýÿÿÿÿýüþýýþþþþþþýýýýüýýýýüýüýüýüþùþûþûûøûù÷ýÿýþÿþþõöüúþöøÿòÿñõüþýýÿÿýú÷ýþþùúþ÷ùþþýøüýùôûþùðíìñüòóé÷ðñüäûôøøþûð÷ûûþþøùþýú÷úïãɼ¬š­¸È¼ÀêïüýýýüûüþþþýýýþýþþþþÿÿÿþþÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüýþþýýýýýþþþþþþÿýýþýüúöãæÛóΛ¿ºÇÓÓóüðý÷ùùûÿùûþþùûýÿÿþüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþýýýýýýÿþýþþÿöûûáÏؽ¡³ÆÙßÜéûûöÿÿöþþþþûøýüþýüûýýýýýýýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿùûýþþýûùýüüýýýýýýýüüýýþþúûúüúýüüýüúýüþüûöýüûÿþüýþþÿþþþöþúÿÿõÿþûþþûþþûúüûþûûüÿÿøþùýûûýüûýùþþþþûûÿýþ÷îùùÞÉÊÑõõýøíüþüûûüýýþÿôûûýùüõæÖºãÅŠ»Ë·ËåöüüüýüüüüýýýýüüüüüüüüþþÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýüüüüýýýüüüýþýýüôâÓ£´¯ÙºšàßúùûüþÿúþþþþøþúþûþÿþþÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþýýýýýýýýýýüüüüýýüüûùýúìØËÝĵí£Ïöüýøûþþÿúþöýþúÿÿÿÿýþþûþþþÿÿýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿûûÿûíÿÿúþýñùÿûÿúüþþýýúûýüýüþþþûÿÿüüþþúÿÿûþþùýõþÿþÿÿÿþüýþþþþýþýýýþþþüûùýýüüûûúúúüýûûýüúþþþþþþþþýþýù÷öñëçõøùúçÙå÷ðððúýùùüýýýýúúüüúðõçËÏÒÌ›ÇàÙêüüýùùüüüýþýüú÷ûþþýúýü÷ýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùûýýýúýþþýúúûïûýúÞ¼¹¼¦©ºÓÊÐùüûûýþÿþýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿýýùüþüüþûûþüþøü÷ýú÷ìØãßΰ¨ÌåÔèÏÝöüüýýþþþþþþþÿþÿþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿ÷ùúøúÿÿ÷ñðùüûüýûýþúúþýøúýýúýûþùûøûþþþýýþùûóüþþþüýýþþþþþÿýýþþþýýýýýýþýüûúýýüüûûûúöúüüüüúöýýýýýýýýúýþüûýýüøüûúùêáîõõëâðñàêçôûùùþýüüüûúùøùöÁÒºÈʹ·êÈÕúüùüòõ÷ùÿÿÿýúöüþüýþþýùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöþüýûùùðþþóúüõüûý÷öãϾ¥©›®ÞûùøûúûüýþþþýýýýþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþþÿüþþþþþþþùýûÿþþúóÔζ›´È͸Þöñûóôüþýþþýýüýþÿÿÿÿþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿûü÷ÿö­‘„†Ÿ³¸ÊæûûööýýúûûúöýýÿýþÿþúÿþüùûþþþþùóúúþþþþýþþþýþþþþýýýýýýýýüûûþýýýüüüûôùýþþýùôýýýýýýýýúþþýùûþþýýüûýöñüøýðáòíØéãïùøóòñïô÷ýýþþýùØÜáèëÚ×ûÅ£»¸ÍûûüýþûøùþÿÿÿÿýùþüüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþüþþûþþþþòþýñüûÞÐèϽ±ÐÏÙùýýþ÷ýýþÿþþýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþþýÿÿúûúúþûýýðëãÝÒ ¨œŽ·ÖååÞöýüýýþüþþþþþþýýþÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿùý÷ÿÿÿô¢frvyzv¹È»¹¾Éäûýùûýöüûþúþýüþÿÿÿÿôøûþÿÿþüþþþþþþþýþþþþþþþýþþþýýýýýþþþþþýýýøûþþþþûøþþþþþþþþüþÿüùøùûüþüýþýúþýþûñûúíù÷ôøý÷æáèðãòú÷ëÚæùûûúûîñéèÃË­£ËÎÖíøúöùýúóûûþÿÿûúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþÿþüûúùý÷ôèÎÎÕº­ËÈÒéßõõûýúûüòúþþþþþýþþþþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþýüþûþú÷ýýûýøðîÕÕÂÀ²¤½ÆÂçùüýüýüüôÿýùþþþþþþþþþþþÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿôÿùÿÿúþå}Žƒt…˜¢±·—–™•¾éç»ÇáÍéëüúóýþýùûüùþýùôúÿþùþýüýþþþþþþþþþþþþÿþÿþþþþÿÿÿÿþÿþÿþüþÿþþþþüüüüüüüüüúúûþÿþýýüüûüþþúûþøþþûþþÿþûûþþòíóöæóü÷å×íùùöåîñûíðàÚÌÈÖμÀáïéëóøüý÷úþüþþùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöþúûüùüúøëɳ¡“¨ÁÅÚäîøøþùþ÷÷þþþýþþþþþþþÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþþþüýþýúøýýýüûË´¸¹àÝáÒÛð÷íþþþýþüùþùþýýþþþþýýýýÿþþþÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿùþÿóûýäÒµ±ÇÊÂËèÍÏ˲Æàͱ»Ó²Æ¾ÕÇöñçáîýý÷ñüýûöüúùÿþÿþþÿÿÿþþþþþþþþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿýÿþüüþÿýþþþþþþþþûúûþÿÿýüüù÷øúýýýþòþþôüþúýþþýþþþùý÷ûüöïíúýóýäàäãêàòå×ÕÑÐÆ¿ÜÝ÷ÀÚõóôýýúýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþþüöíóãÛËš’Ÿ–²Úíøüûñüþüþðõþûþþþþÿÿþþþþþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýýÿþþýôòøñæáß´¤µÇõøüüøþÿùü÷ýüýú÷þúýúþþþþþþýýýÿþþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýú÷üÿþüý÷ññüùÞÚöúôûùéëîÛÏÕàÎÔÌØÒÓ¼£¢¿ÞáÖ©Ðø÷ôýûúúþÿÿÿýþÿþþþþþþþþýþþÿÿþþýýüüüýýýýþÿþüüþþýþþþþþÿÿÿÿýýþþûúüüùùúúÿÿÿÿöüøôúûüùþþùùþþûýþýüùöüûûñýóíçäïÒèÇÁåæÑÁØáؾª—»Ëâéíýýùúþþþþþþþþþþþþþþþþþþþþþþþþÿÿþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿôÿùýíļ®©¾º™¦ÅÉÝúüõþÿÿþóûþüÿÿü÷øüýþþÿÿþþþþþÿÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿþþÿüþþýö÷ØÔÛÉÂÐ×âÞëìüóüûüöþýýøþþþþúü÷úùþþþþþþýýþÿþÿÿÿÿÿþþþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿøÿÿþýýüûþýýÿ÷þýúúüûøõõõôïêêîäѽ¶»Á¿ºÍ×ÛÁÂâæãÞëøýþûýþþþþþþþþþüüþÿÿþüûûûüüüüüüþÿþþþþþýýýýýýýýýÿÿþþþûþÿÿÿÿÿýÿÿûýüøð÷üøýùúýþüûýþùþøþþûÿþýþùþýòüùåûçÎïïÙâêãÖÒδªÂÍÓ«¤ãûõûüüüüýýýýþþþþþþþþýýýýýýýýþþýüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþþþþþþüüüüüüüüøüÜâÈ™¶«ŒÆÔÇØð÷ûüýýýýýþþþøþÿþþúýýýþþÿÿÿþþþþÿþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþÿýýýýýýýýüüüüüüüüøýýúüýòßܱ¯¼®·àöýþþùþýýýþöþþþùýýüþþÿÿþÿþþþþþýýüýÿþÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿúüþþþýúøýüûø÷õóòüø÷÷ø÷õòßõãåË®ÕßÝÒÒ×ÖÙèôúûýýûýýüýúöüúøþýþøÿÿýþûýþüùúýþþýÿþýþþÿÿÿþþþþÿÿÿÿþÿÿÿÿÿÿÿþþûùùûýþûûûûûûüüùùúúûûüüþþþþþþþýýüûúúû÷ñûöëëéßáÞÊÑ°žÂǸÕåÈÜøùûüûýûû÷ûþýüûûùûûüý÷ýûúýþþÿÿÿÿÿþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿþþÿÿÿÿÿþþýýþþüûþøþüýüþôùþúþþó鬜¶­¨·«´áõöüü÷óýþþÿÿÿþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþþþÿÿþÿÿþþþþþýýúýþþÿþþýùýþúúÿþþüþþþýöþýùûßâÑÇ⺫­ÅÕÎ×òýþÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿþüûÿÿþýüûúúþÿÿÿÿþÿþõýó÷éÕîòÜØÞãÜÔÒÐñêóøîì÷üñýýýýúüõÿÿÿýÿ÷ÿýüþþûþÿÿûüþÿÿþþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿþþýýþþþýýýýýýýýøøùùúûûûýýýþþþþýûüúùüýü÷þüðôüüûîØÕ̽ÒÆ™®£–®Ïéñåêüûüüúùøýþýøüû÷üþûýÿÿÿýúúÿÿÿÿÿÿþþÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿþÿÿÿÿÿýýþþþþþþûþþûþýÿþþüþþíûè螘ÁÁ£¾ÔÀîýýüýþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþþþÿÿþÿþþþþþþþþþþþýýþýýÿþþþýüûûþóùðôþöäïßɨ¡¦ÒÆÅÓíúõ÷ýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþýýýýýþþþþ÷ûþýùøûþþþøþüõúúúùýýõéÜÏôäîöá×èõÎïóïõúýýýþøþþöþ÷ùþþûûþüóþþÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþýýýýýýýýùùùúúûüüùùúûûýüýýýüûþþþýûþýýþþýúòæóíõ篽Ïõ¡µ¾ž§×ÚçûýøøþüúûþþýüþýþýûùûÿþþýþþþþÿÿÿþþþþþþÿÿÿÿÿÿþþþþþÿÿÿÿþþþþÿÿÿþþþþþþÿþÿþþôüþþýýúùúøýòèîÏÒ›–Ïзàûýýüûüû÷øýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿþþþþÿýÿÿÿþþýúúþþþþþïýýýñÚåâÝ¿Ê°¾âåæòüýþÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûüüýþþþûÿÿÿüúýÿÿøùûýþúûþþýýýýýòýïøüåÚêõËçàÙæïöøýýóýýýüýùýýýýýýûþýûýþþýøÿÿÿÿÿÿÿÿÿþþþþþþþýþÿÿþÿþýýýýýýýýýüüüýýþþþùúûüýüüýþýüûûüýüùþþþú÷þüüòþýýýåìæáÍž­Ê´·³›“¸ßîùüûüüõ÷ýûúöûýýýýýûýýþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþþÿþÿþþþþþþþÿýýýþøûþýöôéæÄáÞÕÏš¡àûûü÷÷üöúÿÿüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþþþÿÿþþþýýþþýþÿÿÿÿþýûûýþüûýúûéóïÁ¿ÛäÌçÎëõüúùüøóöûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿþÿÿÿÿþÿÿþùþüüþùþÿýûøøþþ÷þúþþóñüþòýêâìçâàüôåîàùÚóöóöýýûýýýüüýþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþýþýþþþþþþþþþþþþþÿÿÿÿýýþþÿþþýýûùøøøùùþúòûþúþþýþþýúúþûø÷øÜÙéÔǼ¸°·¬¡ÀßÖèùøøùöüüüüûùûþþþýýüýýýþÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿþýýýýýü÷þ÷ýõðÖæÖ²žÕÝîæÆâóùüúûþþýþÿûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýþþþýýýýýþþÿþýûüþøûþþýúúû÷ȶ®ÕÍ äúóûóýýýøþþûüþþûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿùùùúüýýüþýþýùûúþþÿÿÿûüùîýþÿþúüþüþþöúþöêãûñèêÔç±Ìîæçïíãçõòöûûúûþþþþþþþþþþÿþÿÿÿÿÿÿþÿþýýýþþÿþþþþþþþýþþþþþþþþýþþÿÿÿÿýûùúûúûþþùóýûðùÿùþúúòîûïþøýý÷÷òéÜÛÎÔ˸ÆκŸ¼ßÛ¾ËïóúýüùûþÿþþþþþþÿÿÿÿþþþþþþÿÿÿÿÿÿþÿÿÿþþþþþþþþÿÿÿÿÿþþþþþþþþüüþôçÛÖºÅÆ›²Üñú÷ñýýúþûüþöýþúùûûùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýýýýýýýþþÿþýýýýýýýüüøîèçÆ®œÓÞÆùúþüþ÷÷÷ùÿûýþþýúüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþÿÿÿÿÿýýýýþþþþþþþÿÿÿÿþüþüüúùýýøöûÿþÿÿúüÿýùþýøúøûøþþþþøýüüüôóÆØñëêíçÜÞéñíëïöüûûûýüþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþýýýýýýþþýüüýþýýýþüüýýýþþøýýþöéõþõùööðêìäøûúýùøüø÷úîìÝÍÝÞÑ·¹»µš•Ñ¼ÏëûûéÞÞúûýþþþþþÿÿÿÿÿÿÿÿýþÿÿÿÿþýþþþþþþýýþþÿÿÿÿþýüþþþþþþýûûùß­·ÇÌ«ÀºáôýüýþüùùûûøüöþÿþÿÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþþþýýýýþþþþýþþþýýýüýþþöúëçîçÏÁÄÃɯÎööýùôûüþúû÷ÿÿùýÿùúþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþýþþýþûþþþþýþþþÿþþþÿýÿýûÿÿúÿÿþþþúúþýýýûûýýõýüüýý÷òôúøæØàõý÷èðñóöøûýþýýþþþþþþýýþþþþýýüüüüüüüüþþþþþþþþûûüüýýýýýüüýýúúýüþýþþúþýþúýüù÷ëîßýúüþüüæõûøúúòõãÞÍÔÕͪ’Á¯¼ÒàÖÁ¿ËëîóøûüûûüüüüüüüüüüþþþþüüýýýýýýýýûüýþþýüûúüýýûøóðÀààÓ‡¯Ç­ÃâøþüùþÿñÿÿôÿÿýþÿûøÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿýýýýýýýýýýýýýýýüüýýúûüîÚǯ²ÐØúÇéìðþþøÿûþüþýÿÿ÷þþüþÿùþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿýþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýýýþýýüûù÷÷óòõ÷òäØæóìÛçþûÜöùúúüýþþþþýýÿÿúû÷ýüþþüþþþúúþüþûîþþþþûøüùøþýþþþÿÿýÿþýÿþûýýýüûüüúóóûÿþüùñæöñëìôúûøëòëò˹¶ÜÒÐáÚæÚÒöÚíáëåàëøûýýþöþûÿÿÿøûüúþýþûûÿüöþõøúôþÿòõý÷ýúü÷ÆÅĹÈ×Ñ™¿ÀÙúûûûüûûüþÿþÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþþööýýÿþýüüýüüýûýùý÷×ËÉé²¹àåÒçôùûþÿÿþûùþþÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþÿýûüþþú÷ôô÷ûýýùõðõðåìûõááäæèëðòòüøøøûþþþþþôüþ÷ýþõþþþþüûþöùúþþþþþÿþüÿÿòóþþûýýùûÿüýýýýýýýýöýþýûûöïóîêíøýüöÞõûûÕÔÜ÷æÓâ×ÜßÞæÄÕíëØïðçÜïéÊÐùýõõþÿÿÿþþþþúüøþùþùþýøù÷úýüüûúóÑ´ÖÓ¼ÏîúÞ÷ðúúüüüûûúûþÿþþþÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿþþþþþþþýøööúüüýýôúäóâľ´½¥Òíüüñýýüýýþÿþýüÿÿÿÿÿÿþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýúûÿÿüøùûýýýþþþþþýúûþûõðòóòóõöôùîëêæîøøðøùþþþþûüþúöþûóþþþýûýýùúýýüüþþþþýøýýöúþûüüüþýûüýúýýüüþüøû÷ôöýþùîÎïýüÛëôøñØíäßèàÀÆÉçÜÑ÷õûçøîÅÍèÙ¿ì÷öóìêøüõùÿúþþùþúüþþýýüëȾàí¿®æåÌÔðüòüùûûüýýþýûûþþþþþÿÿÿÿþþþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿþúøüþüýýýüüüöïíáÌäÌèâÑÒÀÐèþþüøùþüþþþýýþýþþÿÿÿþþÿÿþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýûüÿÿþûþýþýûùûüýþþýüüüüþýýûùùø÷ûíëçÚàëåÎòþüôóñßôýýûþþþùûüýûýþúþþþþûþþÿõööüýýþþþþýüþþüüÿýýþüýÿþýþþüýþþ÷íØîûúåûúåöèúíçî߯ÊÏÚÙäïÙúñøñçîöß×òõåÓÈÐìùüþöýùýùýúýüüíÔɼ¡Áä¿®ëùüõþþûýýýüýþÿþþýýþþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþûþúôúýüúöóéØƲžÎÅäïóýøýþþóøÿÿÿöÿþýýýýýþþþÿÿÿþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýþþýþþÿýýýþþþþýùþÿýúüþþùûûúúüýûþöøöèêòéÜö÷åÖÔ×ÇÈãýúäîüóüþþþüýöüûêøüüøõýþþþúÿýóûÿüúüþýýþþÿÿþþÿÿþúüýüýþûø÷ûÿÿôþýéüûüèêòëÎÁÑÉËÕÞÓßäóôöïûóûûûèÔÍÙòùýõÇéÛõûôõûìÙ¤ž§œšÊíäÑòýþúþýýùøùüüýþþþýýÿÿþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿùýýüüøøäѸ«©¶Á÷úøúùúþùúúùþþüýýýýýýüüûüþþÿÿÿÿþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿþÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûýþþüüþÿüûüþÿÿÿýüÿÿþüÿÿþûýþýþÿÿÿÿúÿþùûþúûùíéâÜàÝÐáøã¶Ãá×ä×ؼŸ¡§¹ÉÍêéØÞäðöûðêüý÷ýþþÿüüýýûýþþþÿþýüøüþýûýþþÿÿÿÿ÷üþûùþýìõ÷ùòÏã×̶ÓⲫÔññàïæáñõëèðùûíûí´ä×êïDzĺ­©©¶Á¸Ìîûüúüùþýÿÿþþþþûûüüüüüüÿÿÿÿÿÿÿÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûøýûü÷ÙÖÁ®¨®°¼ÚôõýúýþýþúÿÿþüøúüýüýþþýýüüþþþÿÿþþþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþÿþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþýýýýüýþÿýýþÿÿÿýûûüüûúúúúþþþýüýýûúûþÿÿÿÿþýûóüýøûûýûùäÈÑäÜÚÆÉžjmšƒ¿œ}–œ•ÆȺ¾ÛççòøýýýùýÿþþþþþÿýüüýþÿþüüýüþùúüúöúÿøüÿúþùþýîýûöÐÞç«œ­ÞäåÝÖ¿Ó×Óà÷ûöÒûúØôèؾŒƒ†–¬³ÁÒÆíùûöûûûõúþ÷øøúûýüüüüüüýýÿÿÿÿÿÿÿÿþþþýýþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþûñÞåÞ¶¹¹»ÏæëëñøùýýþþþüöùüþüþþþøþþýþþýýþÿþÿÿþþþþýþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþÿÿÿÿûýþýüûüþýýýýýýýýÿÿÿÿÿÿÿÿþþþþþþþþÿýûûýþþýüþÿÿÿþÿÿþýýÿþÿþÿþþþýþÿþþþÿÿÿÿýüþüýýýýûýýüýýüúýýüîßíÅy†™‘£ÁŸ‚ –«Ÿ‘‘ž¦¢œØéñëéñùúýýýýýüüþûýýûûüûøüùúþþüùýþùýþþòþûýþúþõ÷ýøûÈàá齸¤·¸±Äéøè¼æóï÷ôѯ´•«ÕÐÎÕ³íòûøýýþúúýùüùýùùþýýýýþÿÿÿÿÿÿÿÿÿÿýýýýýýüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿüüüüüüüüüüüüüüüüýýýýüüûûóåÌ´ÍÙÂ×ëéòûûüýýýüýûÿþùþþýýýýþüþþÿþýýýýýÿþÿÿþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþùøþüüüñùøýýúýþõüþþüþüùüÿøþøùÿùÿÿÿÿÿýüþÿýÿÿþþÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþþþþþþþþþþþþþþþüðûòÝáààáæêÏ·Ïңɹ£“Ž‘•˜¦˜„ Ã÷úÛæûöïüý÷þîÿÿþþûøþþøþþöÿÿùúþþþþùþüüýýþþüýïøýûêÛ½ž»·ÁääÇ®ÀÆÉéâÄ”x¤»¸ãôäìËéóøòñúýüøûúöþúýûÿüøøûþýûýüúþþýþüüÿþýüþþûþþþþþþÿÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýþýýýüûüýþþÿþûýÿûýýýýþþýýþýþýþÿýûøúþþýüüýýûûüî̾˾´¾Äæýðùùûþþþþüúþþÿÿÿþþÿÿÿÿÿÿþÿÿÿÿþþþþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþøäèûûâñ÷ý÷ýûýýùöýþûùþÿüþþüþúÿüþÿÿÿÿþýÿÿþþþþýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþüôþþöýýýùúýõéúýäúóéÝÔÍÈÅ”—Š¡­¯¤¾ž‰—¯¨¨ÂÔûýñýøöùþúû÷þÿñÿöÿþúúó÷úþûýþþþþýúþýþüþþûïàãÂÄõõ̬ ½µ¡©œVR‚ÄãðúúöñùûøòõûûôîùúëÙøóþúûüþþþÿÿþþüþþþÿÿøüþþþþþýþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþüÿÿûþÿÿöþ÷õûýûûþýýýýþþýýüüûûüýÿÿÿýõþü÷þôùøóàÀ§¤¬¯ºÛéøþøþýþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþÿÿÿý÷඲ÌÈ´Ïãßìøýóøýúóùþþùüüÿÿýþúÿÿþþÿÿÿýûÿþþþþþþþþÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüþüùû÷úþûýýýýýýøûüûøóîìãßµ ·¶”‰Ž…ƒ„‡™­³ ¶ÃËÙûûùýüúúýøþþóþýþýýùþûþýûýûùýúÿýùüþýüôûóíøᵩ¯®Š{?fnšàðëùùùû÷îìöüùëúûõôÜýøüøýþÿûøúüþþýüýþþý÷ûýþÿÿþûþþþþþþþþþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþþþûþþüõ÷þþøþþýüûúýþþýýýþþþýýþþüüþþûýõýüøüÙÊÄƲ­´³ÚáüýûýõüþþýýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿüøïÎ¥ØãξÝÈáÍàÀ³ÆÎÐâ÷ýüýýÿþþÿþÿÿÿýýýþýüÿýüþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüüûþþúýþýûþþûøýøúüüûù÷÷øûöàìÞ¸–Ç»˜}°´ŸŒ ¨ˆ²½Éùóûøðýóôûþ÷û÷ýøþýþüúþÿþþþýûýùûùüûõáÝÞÒÀ©”†¶¾œs@RZ‹×çæûûöìæâçöýùíùüòüîæüùüþÿöêäéïüûýûûýûüþÿÿÿÿÿýüþþþþþþþþÿÿÿÿÿþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþýýýþüøùþþûöõúþýûýüúýýýýýýüýýýýýþþþüúýúìóóÝÑź§°ÂÃÏé÷ûöýý÷þþþþýüüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþþÿÿýþüܤžÇÕå²ÖØäÄãÉÚÛàìïååõþüö÷úûüøüýþþþýýýÿýýþÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþÿùýúýÿÿÿþýþýýþþüþýýýüýýüüýõû÷ûï÷õøúñãëéÆœ»£™†‚˜‚ «¼ÏÅøèäõýþþýþýÿùúûüþþýüþúüüûýüë辫±©·Ç®º¼ìöÔžlJKÀêÝôýùùããåîùýúóÞúùî­‘Éûüü÷êÞÛäîûùûõõýûýýþýþýþþþþþþþþþþþþþþþþþþÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþýýþüüûûüýþýý÷ñûþüùþýþþþüýýþúùùýÿþýûûåÉÂÈ«œÏ¼Åèûöðûýü÷üýüÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿöýýýëâèâàÇâîßëüéåêðø÷îíùúöéëïîïçð÷þþüùùúÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþÿûþü÷úôùþþûýýüýûúùúýþþþýðþþýöþüùüúûüûøúùѨ‘”«Š€‹Å…‡•¥Ž™ÂÓîøö÷üùýüýýüýþùø÷ý÷øö뿳“Ÿ³›¨ÎÁîùùúížhW˜íùìöùý÷ëëðøýýúøÜúøºNGxøûüöîèêóúøòùìíúùýôòñôöøûÿþÿÿÿÿÿÿþþÿÿÿþÿþÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþûþþüûýúñî÷üýùúþûþþþþþýþþýýþüùøùûØÉ´—§°«ãêóýüóùýýýýþþüûú÷ýþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóûýýüùøúüùàù÷Ôàóúö÷üüûù÷êîñîñèî÷þûòìðöøÿÿýýÿÿúþþþþþþþþþþþþþþþþþþþýýýýýþþþþþþþþþþþþþþþþýýûþýûÿüýþþþüþþüþÿÿþüûúúúýþùøþþóþþþÿøòøýýýüîáñãáºñ™ˆ¦’~‘­§¾»ÀÉäÚâáõûøûüúüûóÛ÷ëäϺžªÌÍÝûöùþòýùŠZ‰öüûýùöýëëêíöýþûúóüìŸN@\ñûýûøøøúúìêøíîûõüçåçìñôùýýýþþÿÿÿÿýýþþþÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýýû÷ùýûÛ¨š·éüõøþùþþýþýýýüûûûìÕÎÝì¿ÉȲÃâåò÷ûûùûþþøøþûûüûþþýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿýÿøþþúúýýùöúüüîÛàêïóø÷÷ýþþùþþüþûôûýôåßèôêôøóõþþõþþþþþþþþþþþþþþþþýýýýýýýýýýýýýýýýýýýýýýýýþþýÿùöÿ÷ýüÿÿüýÿÿûþþþüûýþþþûùþþýþýýþþÿÿÿùþýþþýþùýûúãÛÙÆÁ°Â¥±£©«Á£žÓòíð÷æÛ»•w³¥¶ÓÓÇÑñø÷üýÿþøýóŠ}ÚúüøûûúòÖäÝßíúþüûøõá©ŽVtõûýýüýûõîäçü÷ùýô÷äãçîóöùý÷øøùúûûüúúûüýþþÿÿþþþþþþþýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüüüýùûö¼f65<?îüøüýûûûûúúùùêñíЫ¡ºÙåáçòöûýüüüüýþüûþýþûûþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþýüýüûüýüöýýêäàáøýýýøõúúúþþõûýðòûöî÷õôúõíñýóöìÖæýüý÷ùýùùþú÷þþûÿÿûûýÿÿúþÿÿýÿÿÿúùÿÿýþÿÿûúýÿþþþþþþþþþþþþþýýþþþþþþýýýþÿþþþþþþþþþþÿÿÿÿýüû÷òûû÷õàËÒÇÍÌÊ‚’•À¬¦ŸŸ±Š‚™s”ª¬ÃØÛàùûûøýööýþû©¿÷üùòýýüûùúîðôðøöáßÀ™]€edöúýýûûüúõÞÞôüûþýùóìðûûñóýýçÈóýóøýýýûüþýüüøüþüùùüÿÿúÿüûÿùüþÿÿüþÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþøÿøýýüû¹|Q39(72cÊòùôüøùûüõúùÆÎáеˆ§ÌöüýýþýýýýýýýþÿþýýýýýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþýþþþýýþûúÿúþûõþúüýøöûûùýýõüþóõþþüüùûýóêòýêèåÒÙóûüùûýûûüýüûøúþþýþýþÿûÿúÿýþøøÿÿÿüûùüÿÿÿþþþþþþþþþýûþþþþþþþþþþþþþþýþÿþþþþþþþþþÿÿÿÿÿþûüø÷üüûûüùûóñÖȚΫ°‘qOW“n˜»’†ž¼ÊØÝéíøóíÝÉüûçëòúúúýýýöýúóýûüüüý÷æ”iY7MV|õûü÷öûþþûúôÿÿøûùõõöüýøìòýóïÕçìðú÷öûýýýýýýþÿÿÿÿÿþþýûþþüþþüþÿÿüüþþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿýúþ÷ýûùÎi<?46:+@a‹Ùúûýýýôãäåн¶ÌÔȾÐìüüüüüýýüýþþþÿþþýýýýþþþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿþÿÿûÿÿÿüüýýüþýþþüÿüýþúùýýûþþùþþòñûûýûùýý÷òüøéïóäãïîÜòöÙáöèæûéêûýûúýúþÿüÿþÿÿÿüþÿÿüýþþýüýýüüýþþþþþþýüþþþþþþþÿþÿþþþþþþþþþþþþþÿÿþþþþþþýúûúüþýûÿîúþóý÷ûëð«¨W2;q~­—x£¿ËÊËÁÎÃàâã¾ÀãØûûøøúùøùþþþüýýûûûúüýø XI51] åúõíìõýÿúüõýüúÿþþùüýý÷ïóüôýìíãéóîïó÷÷ùüüûýöôùþýûûøùüþúýþøþÿÿþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþüúýùò¯])2?AD?50R[¨ßôãåîóÑÂƼÊÔàôëùøýýúûûüýþþþÿþþþþþýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþþüþþþüüüüþüøùúüþþþþýüþþüþþýþþôñö÷üùùýýýüýòõýý÷ùøç×ôøÒà÷àçóÕÙøýðëîûýöýûþýùüþþûøûýúþÿýÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿüüýþþúúþþþþ÷ýõþü–SHHFY‘Œ¡ÖÀÊ̯©ÇÍÞØÚ¼ªÂÏû÷éÝèæÜåçûüûøýûûûùûüú«T?=@—áøûûõôúÿÿüÿúþýûþùüýüúúûúù÷ûýùýîæëðöëåìôöôôýòìôýýýýýýýýúûýöûýþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøúýüûøÊI-8BHcniY-DYœÌàÓ¼ÐîÛºÉàèûûþöþûþôüýýþþþþÿþþþþþþþþþÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþþþþýýþþþþýýûüýþþþýþþýüÿÿüþÿüýÿüûýþþþþüûýþûúûþþøþþòóõøîúøàýóÒÕóöäÞáûëÕü÷ýèñþýýýþýýùúùüþþþüüþþýüüýþÿþþþþþþþþþþþþþþÿþþþþþÿÿÿþþýýýüüüýþüþÿûúýþöíøýùçóôôÌ©ZVC25NŒÛò³ÚààŸºÌÕ×ϸÏîóêñèãÚÓݹâõöÖæåîöùûüó­cEES½ò÷üýþüýþûøýùüûýýøýþþûûþþþûøüøþöðñûýïçñôëéðøîéïöõðìüûûýúûýûüüýþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùþ÷ýüñïx0JNKˆ©lSIUƒÎéÌÀªÒìëÛêýûÿþþ÷úûýúþþþþýüüýþþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþûûýþÿýýþúþýþÿýþýþüûþþûþþûûýÿÿþÿýþþû÷ýÿøÿ÷øþüøúüûöúøþøêýýçãóôæâèõÒ»úøøÜôøéêøöéðýýþþüûýþþÿÿÿþýýþÿþþþþþþþþþþþþþþþþþþþþþÿÿþþþýýýüýýþüþþûÿÿüüþýùÚÅǵãä—„nP0AG-Lµùãøùñºž¡·ÂÑÏÈèòïèóûöæíÁèóõØÒÈÏ×ÛìîÒ€S>DbØ÷ûöûþþüûùöîêíïøü÷ýýþþÿÿþÿÿùþùýõýýþýö÷üõâáïíëêëêäÙÏéãèéïõöýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþüþýâèù¼BHJSs§£dMIWa—Î÷دµñùôù÷þþúþüþúþýþþþþþýýüüþþþÿÿþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþþûûýþüüþÿúþøùþûþþÿüûÿÿüÿþþýþÿüùüýùþÿúþÿüýùûþþûúüüÿÿûùþþùþùô÷úòï÷õÚÍ÷üùèôæÍËãç×ßú÷ýýüùþþþûýþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþþýýýýþþþûþþúÿþñüûèÕõ­ŸÕÜ‚’€H,IF?/rÜüûýýïÚÙº¶¹Ó·ÀÊÏÄÈ÷øøëùèûý÷ôèÓÖØÐÞÒœtP=?dãíõïõúúúüüûêçèçîèÚãüúúüýûüþþþýüöÿýþøûýýõèêõñøùöòïçÞçÙß×ãèÚùþúøýÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿþýþøꦲÝq8G6TznMCSTUS²ì÷ÐÙûüûýùõþúüúÿúü÷øÿÿþþýüüüþþþÿÿþþþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþþþþþþÿþÿÿþüþÿþûÿÿþþûþÿÿþüÿÿþÿýÿÿÿÿýûÿÿùýÿýýþþýÿþûúþþýþüþÿúüÿøõýúøüú÷ýýùôøýýõëêÊÃæýúçàÃÛîññóíâðôúýýýüýýüýýýýýýþþÿÿþþÿþüüüüýýýýýýüûûüüýýüÿüøüúäÔ·•¯Ç±¨Àôå·PAHNZ=P’õúúúþöûøûííÌãÈ´ŽšëæÑÛõòõüøûõäóûóøÜ’Š]EDlóïóÛßäæêñõöæåççëÞÇËùïêóûûùøþüúÿûþõú÷ýþü÷øüýôýýüúýýûüííÙàÞÁëôîíóúûúùþþþþÿÿÿÿÿþþÿþÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþþþþþþþÿÿÿþþüüþþþþüü÷ü™tƒ–J835<IK?:@<PQ£á÷úöýøýýþþüþÿýûþþþþþÿÿþþýýýýþþþÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿüüüüüüüüÿýüüÿþùó÷èíøöùòÛÑíëîèáëÛíæûëêûëøø÷ýýýüøüýüüþþýüþûüüøýúþüúýüýüýùþüõüûöݱ•‡ˆ±ÎÊÜúùüÌ«ŒMQMHOH2aïýþüöüýúøýûùøájr]ÇÌÂÏËÏïíÜõôüûûûøê…od>B³ûõüéÀœ¢ÈçêßßâåääáÖÌÙÕÇÌÈØûîøþùñüüÿÿöýþüþýûûþþþþþþþûýöýÔÜðÉé÷íãÜÝÓÆÖð÷üüù÷üþüüüýýþþþþüüüþýýúýÿÿÿþýÿÿþþýýþÿýýÿÿþþþÿÿþÿþþþþþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþÿÿÿÿþÿÿþþþýþýþþþÿþþýüüüüüýýýþþýýüøøüþÿøõŽRc}D103,6JA08:Uhƒ÷÷üûþþÿþþþýýþÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿýþÿÿûöÿöûÿýÿÿïîý÷öîçóçîçõåáèÑÒäØØÏÒãíüóûýþûýûöõûüúþþüÿüýôùüþüýøüñDz§Ž‘‰Œ¤Øúúøþÿöñ¤†\WXAcK2;œôúúùûùùýþüüûð’z¢ëë´¹¶¾ÛѹÐèÏçû÷ñÃuPMThðùþ÷÷ëâèõùïãÛàèìçààä×Öµ³ÄÌͲ½áýïýôùûþüùøÿùýûûüýýýþÿÿÿýúèõýçõüóêââØÈÐÚãíðíïöýÿÿþýýýýýøÿÿúøýþÿÿýüýÿÿüøýþþþýýýþÿÿÿÿÿÿÿþÿþþþþþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþÿÿÿÿþþÿÿþþþýýþþþÿÿþýüýýþþþÿþýþõöüþþûýþýù€RezV57538@DEF3Rhxæùõþþþþÿýþýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿüÿÿúüÿüýýúû÷ñü÷ðîóíëê×ÍÛÄÀ¬®ÆÏêôûùèâðüýüûùüúúóüúþýýúü÷óúÙ¯™’{¡½Áß÷ýþûýýööªƒP_O9^E5(IÙû÷üýýýýýþøýõå“øùûüøëåéÈ¡­Î´À¾Í»m`RSE‹ûûþþýüûûûüú÷þþþýïÝÛåÏÓºÈÚ¹¢¥¡ÄÛ¾ÍÕáúõöýþúþþóþþþÿûúûýüþúùÿûûýýûú÷ûúïòàèïðìêîôõöøúûüýýúýýúöûýùýüüþÿÿÿüþÿÿÿþþþÿÿþÿÿÿÿÿÿþÿÿÿÿþþþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþÿÿÿþþþþþþÿÿÿþþúúüýýýüüþýÿþýùûûýûŸXCUH;2+<>4R[+HPo‡ª÷óùþþÿþýýþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþûÿÿ÷øÿÿüþùþþúýüôø÷ûýúôèñÚÛÈÇÕËÛãÜË´¨³ÑèèÝÜû÷ûýüþüüüïõ຤²½ š£¨Üøõüýô÷úþûüñ§m\p]F-O,-=‡óûüýüÿûøþýðýý×üûûýûøûý÷áëåßض¾–`aMdKÀûýöþýûúøùûýý÷õøþþúüýöûîø÷ȳɳʽ³¢À ÃäÚàîÝñöç÷øûþÿÿþþøÿüÿþôþþþýþþýýøúùûüüöñïïÛßåìñõööõö÷úüüû÷üþþþþýÿÿþþÿþþþþþÿþÿÿþþþþÿÿþÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþþþþþþÿÿþÿþýþþþÿÿþþþþþþþþþþýþþÿþþüý÷ùüüýýüéäψR\U€›{[LWkU"8CT~nâüüþþÿþýýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþýýÿÿÿþÿÿüýÿÿÿÿûÿÿüýûúþúþþûþöýîóíïôàãðÞÏı¦¸ÖįԻÏïÖööûë°«žp¡£¼¿Ìâãõüôúúöþþúüþü¬^ŠN6;/B&Rµç÷øôüþþþÿôþýõúùþöøûùýþ÷ýýøýïÓŽ…QElgØöôïïíöûûûýü÷þþþþüüûúúýúùûúûûõôÊÉ£ÀŠªÉ›“ÕÎåßàåèñûþþþýúùþþýþþþûøÿûøûøúþþýýýüùõéêêéäÜÕÐãÞåõûùúüýýúùùûýþþýûüþÿýüÿÿÿÿÿÿÿÿþÿþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþþýýþþþÿÿþþþþþþþþþþýüýþþûüüýûïóøîÕÉÞÔ¸±­æõ¤s1*!A8NY´üþþþþýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþÿÿþþþþþþþþÿýûüýüüüýÿûüúøýûýôöøýþôòüíåå×ÃÉàÛßɠ³Á˜“ªÁ°~“¦’ ¥Ëíúûüýùûùþþúý÷ùþüÜŒx¥UW18H?užÖûýûþþúøÿðþóÿöþüþþú÷þþþù÷ûûèCSpjÒÍêÖÉÑãòòíðøþúþþþüýÿþþýþüøûýöûûóûç䶾͢ǻÝÛÞÇÏáóüûúúýòûùùýýðþ÷ÿþýþþþýúùûýýýúüûúõíâØÒçâèóîàèüýõîðúþþþþþþþþþÿþÿÿÿÿÿÿÿÿþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþþþþþþþþþþþþþþÿþÿþþþþûüüúüýýûöððàÄÈÛÛÅÙæûøñøûùüüõà°e-7>C=X†îøþÿýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿþüþûúýüúüýûüùûÿþþÿýþýýþþÿþþùþþüþýýüøöòîóùõóÝøÙ㲆s”•ƒ|Ÿ¦šy²ÕèøüûîúþôþýïüüùýôûÚ‚j‘kIF=9>']k­ñüýùüû÷üþõþúþøþüþý÷þþüûþûùí§nVi|™èÒñÓ´ÂÓÝÓÇÏåöøùùúúûýýùõþþþýûþþúûüù÷ööüêÔйÛãÕ¨¸ÓëôôöûúìîéäøúåýñùýúûøøþýûüþýýüøúüýýýýýùöùûëØÞóøòíîóùúúûýþþüûüþüýþÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþÿÿÿÿþþþþÿþþÿÿþÿþþþþþþþþþþþÿþýýûòι»¾±¿ÞçÖøúüüúýñþòúýûûÙ€Y4PJPwÄöýþýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿýÿÿÿüÿýüÿþÿþÿþÿþüÿûÿþÿÿüþùþ÷þýñýûùüûõöýýúûûçìÛï‡|¿¼’ˆ†–«Óļ¿µÌåØàÄä÷éûùýöýìóŸg}pU,R>29Eu“Ïùü÷üþþúþþûüûýýòüýúþýüþ÷ýúÑ´hXŠ“îûûóûßÆÙãÖ¾ÈÒéÛØæöûûýûþüð÷ýúüüûüþüþÿøüøýûô÷êIJÂÛëêàÞäëäâÚÎåùííÚåõúÿýýþÿÿþýýýýþþþþþþÿÿþüÿþùëì÷õ÷öîäßãéñ÷ûøóðõûùúûýþþþþýýýýýýýýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþþþþÿÿþþþþþþþþÿÿÿþýýýýýýýýüþùòíçÛÎƦ¯ÏØæùûþþýýýüýÿûþýüýûöùnFPKCkiäûýüûûüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþþüûüýþþýûöõûúûýúþüõåãÛÞ§¯™ÊØÄÂÍ×äòóì׿´¼ÈÚº‰±¿œÃéûïáúìÆ~Šoj;=;>@Fšúëýýý÷úþýýþýþþ÷ýýÿþùýýÿüúÃWu™ÉùùüóýùõûûèàÍÕÍëÍ¡¨âûøòýðüÿôøþüþöüþûýûóøÿÿüøúýûãçîðäÖØäØØÌØêæçðçß¼¾öø×îüþÿÿÿþúôúþþþýùúüýýûýþþúÿüüûõéßàèòúéåàÏØãôùýúöýýôùþþûøûûøþþþþüýþþÿþüüüýüüýÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúùüÿþþþúýþþÿþþüþýúýþýûûüýüýýûýôýý龪´½¸ÄÆÖîù÷úþþÿþþþÿþýüýýýýýüú½O"ZFQVÕüôûøûüûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþúùûýüþúúúúôô¿ ²ÎÎÎɼ۶æúøúûø÷õúýûóèÝÖáÔ©ªªŸ¹Âμ¯åÆÂytSe[BBFE7d­Ÿñû÷þýÿÿþþþþúõýûþøúþúýþþúù¯oP‡¶îûûüüýùûýýúüñúõñ༰ÉÚÝèÜöùììûÿúõýóûüúøþþÿýúûÿÿûýüüúïãåîßÕÇÈÒæñßàççéùïÐÔþýýÿýõíéóöüÿýúýÿþÿüöüÿýùþýýýüøùýñøéçæÚàçïôüøï÷úìé÷ùüýýýûùüýüýþþüÿÿÿþþþÿÿÿÿýûûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüþÿþûùþþþûúýþýýýýþÿýúøýýûüüüüóäó躤ºÖÞêëòýÿù÷üþÿÿþÿþýüûýýþþþüûøQ948BO»ôûѤÙüñþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷üþýýÿþþôýüûúïÀŠ„ƒ¡¥ÌÒÞ÷çûþöüýýþÿþüûüüûúùûîÝÕÛá̹™´Ìʬ€KUSW=@LA83˜œ¼ûòý÷þúõöûÿþþþþÿùûþúþÿõôã„OQ©¹ûøûüýõÿúûúúüøýýüýîÜØÓÓá·êÚÀÎâõüùüøýþýûýýúúúúýþùýûûûøõùþøµ¯áåÚêéßæøúøüüýþüøøöðîðïéêôûúùýýþûöùúúþýûúüýüûûûýö÷úõøûø÷øëÜëøêßöùýýòùûýýþüýþþûýþÿÿþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþþýùýþþÿÿþúüþþþÿþþýüýùöìáÓ¸­Ý÷ëáòûúüýýþÿüúûþþþÿþþýüüýýýþþüûû‹+*1/V”øÛp\züôûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþüýþþþýüùûÞÊĨϠ²œ{•Üóúþûþü÷ûüøùúüýüúúûûúúûû÷üüëåÄîÞöĸrbMW>9S@A*l¥çûýûúýýýüúûýûú÷ùþþ÷ÿþûõ´_NWµ¶üóüûûøÿÿþúüüôùø÷þþýûõòø×óÔÁ»ÔçÔÉùûðñüüüúþþûùûùþþþþþþþþþÕÓöòææÐÌ×ôû÷öòóýýûùøøøøíæçîñîñùýñèóý÷óûýýýýýýûùýýüüüüýýýúùêÚé÷çÌêðøðÚèõüüú÷÷ûþþüýýþþýüûþýÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüýûýþþýþþýûúûýýýþþûúýýûõêÔÉ¿¾ÊÆÈéüûúýüøøüþýýýýýþþÿÿþþýüüýýþþþýüõé2A)9A]щ;Ueùþòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýúøûþýüûð„¤Š¾­´ËµµÍõýþûûüüüýýüüôûÿþüúúûýôûûöýýüýúýùýöíÑo[MFYI=-HšÆ¹²Â×ïúùõøýýÿüùýýùüõúØ‚NMqÄ×üûþýúÿúþÿûþý÷ûýüýûûüýþýûýîðäÈÖàÄÙÈÛëöûüóýþþüýýýþýüýþüúûûúüùûõÒºÊåññâÑÝöûýýýýýøòó÷÷íæïüýêÛìýýðíùûýýýýüûûüýüùüüúûûýûðøùæÏéî÷ôÝÞëáçìììñøüýýüüþþýûÿÿþýüüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüùöüüýþÿÿÿÿûüýýýýüùÜÐÁÁ¿Ééùýýûõôúüûøýþýüþüûþþþþþþýüüýþþþþþþþù466BLpMM^«õûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþúùüÿúïï÷뢌˜˜žÓíõö÷üüý÷úýûùø÷ùýÿÿþûúüýþþÿýþýüþþþöþõûøþúø¨gWcWM::VÅ¡º°ž³ÊÓÏÌÑÚàôäÙíûýýùù«cKI åûûýùýýþóùýøÿûúýþþþþüùøúüúûøýüñû÷ëÅÖ£ÌÒÊêïÜåöóõþýúýüøúþÿþùûøþÿýþüóùúñæ˺Óóö÷õöüýýýýýüúøøûùøóóüýöññõ÷õóòòñéìú÷õýüøõùýýýýýõòûûûýëÐÑÓÞèëéêíïýüøøúüþþÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüùøøøùýüüüûüûù÷øýüùùøîá×¾ÊÜïíéöýýüþþþþýþûþþþýýûúþýýþÿþþþýýþþþþýýý÷óe1&Mb?9DK¬öõþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿýþýýþýýöÖµ·Í÷Ú®¢éÝòúøûûþ÷ûþþþýÿÿÿýüùüûüÿþýüùõúúûþýú÷øþýýþøþøèvrXcWID4N‚íäÜëãÚÚØÏÀ±¦¡»Å¨£ÀÔëûûàVP^¹ðýôûõûþýøüýøþüþþûöùÿÿÿÿÿþüüûûûþþþûùøÉÏÀ½ééÓØßÌÉÝæúýýýüþþýÿÿþû÷úþúøüþûõçÛéöðëìëëòüûýüýþþþøöÿÿþúúûþúüüøôôòïàáôóðûñåìöøúþúùýþýýõýñÈËåíõõòñððûøòëçëôûûþüøüÿÿùþþþþþþþþþþþþþþþþþþþþþþþþÿþÿþýùöùúøøûýþÿþûìâäâÒ¾³¾Øïýûùþÿýýýþýù÷øýýþÿþýýþþþþÿÿÿÿþýýýýþþýüõýôÝB?3`E7&5}úõûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüüüÿþþýüûúúöñëÕ¦ƒ–ÂÕèõÝýþûþûûüýýþþûýýþþýþþýýýÿþýüüüüýøüþûþþþýúþýùþýûŽg^H`IM<4dÉóÐõûûøõöôçоÞÍ›”¤Ÿ¶ÛÎ…j?M~¶áúôýûûþóÿûýóûøþýöÿüýþûûü÷üþý÷þþùýýýùüýü÷ûõááÔ¦”¯Ã×åðòõûýûýöøþú÷þûþûþüüþüùùîíöïÚÕàßõþþ÷öüÿÿýùûþÿúþýýýùøúøóöóýýøüéÓÝïöûþóìüûüýóýýáòøûüûûüýý÷óêÜÓ×åóþûíÞäøþÿýýýýýýýýýýýýýýýýýýýýýýýý÷öúøݪ€oq‰´ÞöûöóØÆÁÓäåßÞÒîýþøúÿøÿþýûýýýûýýýÿÿüýþþÿÿÿÿÿþþýýýþþþýýõöùû«b4P@6+2…üùþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþüüûüüûþþýûúòüþøÄÈÀ¯Â¶†£éêóùúüþþûþþþþÿÿÿþþÿÿÿÿÿÿÿþþÿÿþþþþþþþþþÿÿÿþþþþþþþþïèaV?WWB9;- ÷ÛòöôúûýýûõýüûÛÍÊÂÎÓ¸nXKOw¤¶Ðƹáøóüûýöüüöÿÿ÷ûúýýõøþÿÿþþþýùùüüùý÷þûùþûúöã×½·º¸ÓåàÛáâÜøîøýüûôôüûüþþþþûûøùýõÈÂÊÆìõ÷öïùþþÿÿþùüþóþüúýþýüûõ÷÷þþûûðõôúý÷ççòÖÈÌçûûúüðïüüøûý÷øýõêïëíüôûÆÂÒÜîüûüþùûùþýûýÿôÿþþýþûùûÿþöþúüüó´bQvMEGfÏààÖËÍäöûûýóüþûùýþýÿÿþþþþýýýýþþþþþÿÿÿÿÿÿÿÿþþþÿÿÿÿþÿý÷þýíÝG?8.4G¿üþõþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþþþþþÿþþüùþþÿÿúûúþþðýèé˨›®ÇÀ³Íúöüþüüþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿýþýò]cIROK+54yéðãúûüܽû÷þøüøýøîïõû­kUC_›È¬Ÿœ¬·½ÔÐÔÖúüúý÷ýýúûýýýúðøýÿþþÿÿùþþþúõÿüúùûú÷ýöêáÙéðèãÞιÝÞÔøöúþþþþþüùùúû÷ÿýþýðîì×îó÷ëÓÚéøêíþùõþùþýýüüýþÿÿÿüþüúþýþûüýûôõûÖÏÒä÷û÷ðîíì×ëïüø÷ýû÷ýû÷üýûÁÆèèÝíÏëýúîÝöúüôþüøóýôúüÿþüûûýþýóÉŒm‚¥rT6,Nˆ¼ëôìéõþþúûùýþýýþþþÿþÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüõúüþø®G;37GîýþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþþÿÿþþþÿþþýûþýùüúýûùÓßáÒÞô¿³âùðõúýüÿþüúýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþûùŸWXrr>65FU¿÷àêñù¦€ïüþ÷ÿøýýüûûñŠrTS­àõà¡¿¸§šŸ­œš£¤ÉÑÀÛñûôïêåîüýýýýûúýýüøøýÿþþþüøÿûùüþýýùýûõñêгÀʦäÙâøüøûüüýýýþýþ÷öúþþþøüûüìÉÍäõÒÑòñêùú÷þþüùüþþúþûýüøýûÿþüýýüüüúùõôûýòßòñáµççùüüÿôíøýûþþóÜÚÞôôèÀåùüíÒôûüýøòþûùþýüýùôþþùÄÒЧnh«{\L?Sw§ùüüûýýýüûþþýþþþþýþþþþÿþÿþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýøþý÷v@67`üöþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþÿÿÿÿþþþþûûüúüüúóÝÀ‡¤¦Ÿ¿éÅÁìûùýþóüþþûúýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþøùõžrfdH;"DH…ãúìùû†_¿úóýüþîþþüûÅ}nZŠé÷ùúìøñÚÉÄ¿£®¦“¢¢»ÙÉÆÎÊÆÜùüùüüõóûýýþûñþñûûýþý÷ó÷ûþþÿÿúüúìØÙà¹ãÑÜôûóíåæòûûõùýöúú÷øûýûûü÷æëûøÕÔíÜÍëúøþþúùþþûöþýþþüþþûüüüýþüùüýýúüýøëúúíÈôîùüþþðäí÷úýþõïéáûûùñüøüóÎëùïìÛàüýñøþüüüùýöÊmz—“ePhoHDKl“æùûýýüüýýþýüýýüüýýýþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýöõüø›@9?šù÷þüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿþþýþøüöþþûâ¶ë¾¡¨ŸåõëïóýýùÿþüþþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþýþþûûêhWG< ;P`¢õúúù“Yœûôýõþ÷þþüì˜}PaÁ÷öý÷ôüùùüýýóøÝçìïÒ¤É×¢Š¥±žªÖÜáðñãçõ÷Úûùöýýûþüûúüþýúý÷üþýýþþøüüïóäíüýúæÌÄÓãÝÎßõýýýûûûüúüûüýûùûïôøÒ½áûüûòèê÷þüüþûúþûþþûþÿþýÿÿü÷úüüüþþþýüûòýøûýþÿü÷úýûùý÷ÔÛ÷óÖòýüóüöËàøÖ²¸ÔÚìå·îøûüøûõÌZQi~fLR^nMIP~š–Ê÷üþüûüýüþýýýýúûýýýþþþþþþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüøúýûî‰<BG¾ûþþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿþþþþþýþú÷ìÒ±ŽÔÉͯ¼Îûüýýöýýïúýüüþþýüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþýýõþñò§hj9=39VZZ·ööø¹\˜ûýüþýýõüú­chGkÅûúþþþþþþýùùýþþþ÷ýüéüǫ̀¬¼¼ÄÙ©±¿¶§¿ÜÞ“ØÚâì÷÷üýüýöþûüû÷ýþþýýþüüúýøôúýýûîÖÎÚâÒºÌê÷ìòóýúýúýýþýüñýýýýéÜñûûïÛÏÕæó÷øýö÷ýüûüþþþýúüþþþþþþýúüþûùüýüüüýýýÿþÿþÿýýôÓàöðÕàìïøýöË×úÏ©¤»¿ØÔ¬ÌéøùéÞãÊ]HHTQHFB>EQJeˆ²÷üýüüýýýýÿþþüûýýýþþþþÿÿÿÿÿþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøùüýõèm<DD°ùþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýþýýýýýëíÛdz“›¶Òéèäýúó÷øøýþúûüüýýýýûûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþýþúþýüÍUWN348DT>mÆïúá°ïýüþ÷ýõýæ}QSV‰²ýóòùù÷úûûüýþéÿøúþøþûûûøîõú÷õ±¤¥Ÿ¤ÄÉ»âçÛÖÒõû÷óðÕóöýúúùøùüýûúøôþüþþþüýûôðôõéÖÑáæÌÝÛôîèÜî÷÷ûûþþþöûýýþûúíßÙÝäèèèòèðýýüüýýüûûúüþøúûûûûýþûüúþùþüüÿùøýüüþþüûóýõúýí÷ùýüùÚÖ÷öâÀ½¾ÎÒÜÅãìòܺ«>83101/*1APJOe¤øùúüýüüüûþþüûýþþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúþúøó¸\;9N¼õûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýüüüüüüûúúúÀɼ½¾”³èñüòþþøÿÿöþþûþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿøøüì’P`;4?.?51s¹øûÒñ÷û÷þþýüø´YKOV­½ýïÿýýþþýþþÿûÿÿþýþþüüüüûüüûøüøÓÐÜËÄÔÜÒÔøâÝÚÒ×È¿¢ßõûæøîçëøüüùûóùüþþüúýýýú÷üýúÛÚàÊäÐèãÝÆ×åÝÚãüùþøøýüüþþúúüüõèàÏÕÅÏî÷úýûùûýýýúúýýýýýýýûÿÿúôüÿüúþ÷÷þþüýþúþïýüöüüýøüïûùïøóÔ´¦ƒ‹¢¹ £‰‰„hZ@-;?6-*/:@8CX^TXlüúùýþüúúûþýøùüýúþþþþþþþþûüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûþùúùkJ5-híûþþòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûýþÿÿÿþýþüùýþùùüüøüùäƺÊÙ¯ÝÚÑáÈæó÷üÿþþþÿÿÿÿÿÿþÿþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþÿóüûûÔmb?0934;4G›ðïþüôýüþöþîø’XJEZ¬Çþüþûþýýýýýýýýüüüüüüüýýýýýýýýûúúúûûüûëåøâۥμ§ ¾¡ÐãÞÂäëçßëûûíÒÕîøýöýüþüýüÿøðýüùüîîí÷äѵÙïäɺèüüýüüýúûý÷þôúþïôìèÐÈÛâÞãÜõþùùþþ÷úþþûþþùÿþþòþþïþþýøüýûüõüþòýýúûõòöèúïôñÛܵyAQ`D>PKKC516721)&+4AD;3LIZuj{µõýþøþþ÷ÿõþýüýú÷ýþùùþûüþøþþüýþþýùÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþüþùû½B4=;~úüõþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþõþþþþþýùüýüÓ©œ®¢¡éõñüíÿùüþþýýüüÿÿþÿÿÿÿÿÿþþþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþþþýüúôþô¶‘[J/7?28D~àüþùðôüõùþ÷é|Tf‚˜Ëäýýþýýýýýýýýýýþýýþþþþþÿÿÿþþþþüüüûûüüüü÷ûøñÒìÞ¾ÞËâÛèáâÚÑÚîóëØÜïðîçøýùüþûþþüýýûüùúùúóìãðóéÆ¥ÀË×ÞÚäûûûþþþûýþøù÷öþûýûÒËÊÐáØÛóøýüýø÷ûø÷ý÷þýûûýüõó÷úëØùúìàäñ㼪´Å‚tm`M@H,8,63,=3772-+/57-;F@6<DA4A@e“©ÎòòôÞ÷úýíùþþþýûþþüýüýþþþþöñ÷ýþýûýþþþþþþÿþþÿÿÿÿÿÿÿþú÷þýó911;¥òúúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüüýþÿþýúøúýþýöïøÙ°Ÿ¢Ë¥¸òûöÿúýüýýþþýüüÿÿþÿÿÿÿÿþþþýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþþÿùýõõþüîÂqZ88?34;]›ñîöéýûôüøû¹]\­ÄÛéýùýýþÿÿÿÿÿþþþþþýýýýüýýþþþþþþþýýýýýþþÿÿÿøþüöýôôîýöúîØÏîéÛÍÍÛåçÙÕßÜÝ×áßýûû÷òëâéìõ÷ùúþÿþùüûøüêÔáÏÒ¿¥´âøôòù÷úüûýüü÷÷ïôüöóúèúéâôßàõùúø÷õïëíî÷ØËÔ½µ—†rmpavzskcK>Q`G1/08.,%;9NQ=?JG<8314;EM?7566:;75/&[¡ÎîèîÉ«Ïïûúûïíüý÷þþòûûýÿÿÿüùÿÿÿÿüûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþýÏKF?KjðûþÿûùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿþýþþýùãÇãÖóøëÚÑøéíûùôûüøûüýþÿýüüþÿÿÿÿÿÿÿþþþýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþÿþøþøþÿ÷ûãŠ]S92@-27V·ûüôýôûüõó‚\|áåøõþ÷úþÿÿÿÿÿþþþýýüüûûûûûýþþþþþþþýýüûûüüýýüóþûüÿùþûþüúü÷ýýøëÞÙÝæîîåãØÖÔßÝüìöýñÒÉàÖæçåóýúû÷ýúúüûú÷ðñÖ¸ÂãôåØæãíëèøðóùî÷õèïÒ¿ºòæÔÓ˜‚x„‹‚y|vdqt„i]gVYMI4?I>3\oZ::97OXOX`ZOJpyz[¦¢voMafYICKUTNIH\lY@G]JNCxÀæõÚ覔—ÞèòÖ©¹ðüàØöýþýþüûýúþøøúþþþþøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿúÿùø™7C8@üøþþüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýöüüêæçϨÏÚùûüýöûýþüÿþýýúüýýýþþýýþÿÿÿþþþþÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþø÷ýþûöýø¿wd?-B2.%FfôüóþûüúúÄbq²çñüøÿúùÿüþþÿÿÿÿþþþþþýýýüýýþþþþþþþþþýýýýýýýûûüüùÿþúùúúøþûýþûùôðð÷üîçáŹ¼ÙæÒÖïüûêÝìîíçæúüõñõúúüûõûîùø×µª¶Æ½œ©ž£’‚’‚ˆ’vxtmzZS^ ”}„ZLHNPG<?A:ECHIHE@Db[[]Kht[^ZEC<9Ypls‚¡ÇÔØ©—ŠØ½}tObFSVHBTtŠ€šÐíÕ¥˜¥¡¿¸ÍóüþõõÄÅ¥ßÕਕ•ÌñÑÀâúûøýýúýûýýýùùûýýýÿÿÿÿþýþþÿÿÿÿÿÿÿÿøþýûr<//7–÷öúýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüûûüÿÿþüôÛ·¿ËÓÞðýõóþýøøøöþþúûüþþýýþþýüÿÿÿÿþþþþÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþþþý÷þüöýþúò­pJ7;91-E?µûôüþüùùƒOxãêùÿýüþýþùþþþþÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþþþþþþýüþúþøþÿýÿÿþþþþøûýþþþüþýýøóÝ×ÝóøÒèöóûûøù÷õðù÷ôõûìèëóáÞñãø†]HOs|gofgQARB?FOFJUC5<;RD;LC><>FPSPS]]WM[^QOHYmi\V‰˜j’‰‰‹‰–¤µÇßîõîב{‰vTPE@FS[[i•Ïööôùûûöö÷îûûøýþúþýõûáðìðËмÐèÒ¾ÑèçÝóùöü÷òùýýþùøþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþýýëS>(@cÔûþýüýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿýûêßͺ²¼Õéøýüýúôýþüþþþþûûþþþýþþþüûÿþþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿþþþýýþýûûøûüøýã¡YKK9>26FuïûþùûüÏcX†ö÷ýýýüúþüúÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþÿÿÿÿþþýýýþýüÿøþüýþýýüúþýþúýýþþþýýüÿþþöüþþõûþýõ÷çÛ÷õößÙ££” ’Œ‰‚ru†‚XU6.07RO>CFNBE^WZeqYYcFD5::@?:=8W^]Z\O@>FMKS[`lk‹®¥°ÐñúöûøðîöôàÚéñöÖ«•’ltZMZgaSFm[\·àöýýþþþûýýùûùúõúþøþûþýú÷þýûó÷üùÞÊÚôÞÅàéåñäÏ©Äçüýþûûÿýûýÿÿÿþþþþþþþþþüøó´66-A~óùýüýýûþÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýýüüüüüüüüýýýýýýýýÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿüüüüüüüüüýþûôèÛÔ¯ËÈ­¹êüúýþùþþøþûüþþûÿþúýýýýþþþýýÿþþþþþÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿþýüÿùýýõüýõûÛh[k6N8(8>}ïöüüö‹gz§õøüüýûôÿùþÿÿÿÿÿÿÿÿþþýýýþýýüüüüüüüüþýýüüüüüþþüúþþûýúøûüþøýûþýýüýýýûøúýøûúýðüòîõ礑ږ¢wy@nRFBIG<9>AD34"5OW[>IGLOCKb_Jij\`_UOK^S[I-I[tˆ¡µ¯¦›°·¦¡¶ÍÔóùîûûüüúøþþöõðÖØôóñºuZeX\]gbfdNWfqžÛûüúýÿúüýüúüýýóþþùþüþýüüþÿýýþúýýùýýüüíÄØÝÓßÉ©Œ¢Ãáòúüþùõóöûþüùýýýýýýýýýü÷5:9/‡ûöûùþýûÿþþþþÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøþýûýýüüûýüýþýýþûþýüþûÿÿüüÿýþÿþþþÿþþþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþþþþþþþþþþþþþþþýüÿÿÿþýÿüÿüýþûüüûýöúüѧ¸µ¸È¾Ðøúþþþþþþÿÿþþþÿÿÿÿÿÿþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþÿþþÿÿþÿüíú¥Vr:9</??@“Òññ½|j•ÚùíùüþüøúþþüþþýùûÿÿýúýÿüþþýþÿþíþùÿÿøúýþøûþúûõÿøûÿñýÿùþöýöûûüùýýõüûöûùôúìæÑÇ¿˜fcYiG^FY6E+?O?]BG[I7:@.4kzCzNSSOLR^ga€‚wƒšb‚}š”‚¶Öòïìøöúóòû÷÷ù÷ôôôôúñæáôôúòûòñìι»õê»…_P[aSOTjxf[p”¿ìþýùüþÿþþÿþþþþÿÿþþþþÿÿÿþþþÿÿÿÿÿÿþþþþþþûûöúëÝâб®ÏÞàõýýãÊÜýóßëýùýþùüþ÷øýûúÏ7,A*vÐúýøüûüúþþþþüýþüþûÿøþüûÿþÿÿÿÿÿÿÿþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýý÷ØÜüü÷ûøüýýüöüþûÿüüÿúýÿÿÿÿþÿÿûþþÿþÿþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþþþþþþþþþþþþþþþÿÿýþþüüþýÿÿ÷ôýýùýùÕØûÝÛêåîþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþõûûí™gY-:.!5>N¡´‹WHKˆÕìüþöûýþüþ÷þþþÿÿÿþýüúýÿýþýûòüþÿÿÿöóþûúþþøüþþúúüÿÿÿþþüöïüøþøü÷öèßàÔÇš¥‘¨¢ŒauUR]\8?KI@YFA9NGVV>hG_~g>1418W^_kv‡‘¤½ÌÁÔÑÇÉØáÒ³ÀÊëêÇÙúöÉÀíø÷õüöýüøý÷ëîøëÜÚÙùäìúõãÛå¼³¬È±oMSNQcCVOc‡}ŒÈëöþýýþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿýõ÷ùõ÷éóìßêñô˲Ñüã²ÀíûüíæôþþýùûáÔ9/3-<}ÞóüþöÿþýúûþþþüýþÿÿýþýÿÿþÿþþÿÿÿÿþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùØ“’¸¤‘áßïüýþùýüúýýþþüþúûþÿûþþ÷ÿÿÿÿþÿþÿÿÿÿÿÿÿþþÿÿÿÿÿþþþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿþþüþÿÿÿÿþøþþþøøøòïÕÏìòäåûóýýýþöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþý÷ýÔPM/6.4C3†J.:C]‰¸úûùüýøÿþöÿþýþþþüûþþÿþþþþÿýþòúúÿõÿýþû÷üýýûûþýýúùûçðøùøùÛÔµš”ŒumqcWKaJXW[9IDaYX:7H9VzwZ_`PFB6[Orza'5%3&HQžž£ºÖçîôùûùüõóööûöì÷ïççÖ×óö”j¯ÞêÚÏëâðúôúýýùøßÒÄ÷ôóíË«¥Ï§¦‹{…R:]cPNTUF~ÎÛáùýþþúøûýûÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿüøþüþþøýúðöûüàÕêýëÍÎÞ×ÞÇÎëóöòÏÛ«©69!))L´ñüþóþþÿýüýþþþü÷÷ûÿþýüÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüùá¡£¾›‰µ±ÀÓçòìïúùüùõ÷õýûûÿýüþþûÿÿþþþþþþÿÿÿÿþþþþþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿüýþÿÿÿÿÿþöøý÷ÙÌçòëÛÜò÷õüýùýýþýöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþõþùôÌlZ02D2;7a‚XA;YZ]œÏùûûøöÿýýþýþþþýþþýþüûýüûþúúöþþûóýôûíÒÜóóðàñûóÜØÏ­£¦°™˜vs_\bcROXNF;DEPM^SEIcQXJDYa^ƒ€_muspSdr‡£|P":/9;Y™æÚãîøúøöõõüýøþýûüùðýþûýûäàÓœ®Ñà×ÙÏËèñȵÕñíûíîÑÆÅ£‡gbŒjrSVwfWicPIRbƒÊòùüýóúþþþÿÿÿÿÿÿÿÿÿþþþþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþÿûøÿýúüöøù÷þýûüýûüúüúöúõãÎÝÅÖ÷ööê—‘–}@L(=9N‹úùþùüûûüüüüüüþþúþþþþþÿþþþþþþþÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýýæòüåæÑü¹ÆÕÌÃÁÒðûüüüýýýýûúþþûþÿþþþþþþþÿþþþþþþÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþÿþþýüýþùýöÞÕ´žÇßãæðýýøøýüþüüþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùøýûøùÄSJ4C;67?{C5:YH9góüù÷ÿûõþþþþþþüüý÷ýüýþýüýûôùë澶¯È·Ÿ‡‹™œ¯”¡Ä®†~mblag[`n\ZTW_VU^SFUDD@JBG@Zplmdfwœ­«Ÿ­ÃÍÛæùôöõ½I2+EMjuëùúûúöîéêëëàíðôòòýþþïüùóüúûòùóöòìâõÕâäì⦘Ó÷Ó©¥“[aHIVNIOBWP^`\_VNf‡­Þû÷íýùþýûûþþýûþÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþõþûÿÿúýùÿþþþùøýüüøùüüýýþðùßêýøüñ¹–YP7H:Lˆùøþùþûûûüýýýüúþþþóþúþÿÿþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþýýý÷üüöìÝàæÔž±ÔäëòóüüûýýýýþýþþþÿÿÿþþÿþþþþþþþÿþÿþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿþýþþÿøüöåÞ³’ÄÒéûüùýýüúýþüüþþúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüû÷úûê¼XJFAI<?3K<BWN4/;R¶êýýþþüþúúúüþþþúùþýûýõéêš…¡Œ”pŠ¾‘ˆŽ†i]†wvšpg_tbZ^yw¢_TjXVKDQN?AMN9g\`d_Š¨­ª·¼áÛò÷úøûûüïùþôøá>@4`Ž€ŸõùûüýþýýúòëÚæåççêòíìåþþîúüûðûöúüýúýúøîðá•f‡“\WI\=616NRNAJZ_UHJVSo®Ëèöûýþþ÷ùüüüú÷÷ùûþÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþöþ÷ýÿøÿþüÿûýýúþþýúûþþýþþúþðöû÷úñŸ¨¿¿ƒmdcJ_¼öüøçöîôúùóòúýôûùÿûÿýýÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøþýöûüûúýüýý÷ñÖÑÐÁ¸½ÃÒÞäôýû÷ûýüüýýþþþþþþÿÿþþýþþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþþÿþýþþýøá×éøúظâúûýüùþýöüþüüýýý÷þþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúú÷ÿú¡eSAPIJ6>/&Ik[029,3f¬ïûøýýùýüýüøüüùúøÞÁ«ŠlhgWŒŠk|¹”¦‘mWsoq„‚xtsƒnmk€yŸqlmU[WHWbYM}œ“ÄÆøÂæùúöøíüøýþþõùøøûöþúüåLJX‡×¥Øïþüÿÿþüüýúö÷úóöúùóãÊÕëêäõûóýýýýùýúôóðîÕ–VDQ?/C.OUQQWVTI<MJLGL^vŠ¼îòåâòõúþõþõüüüüúüýþþþþÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþûþûùþúúÿûÿýþþùûöýþþûÿÿü÷û÷ûþþþþõ‹‰’®—Ž›†¨íúýöãïãâßÚÙáðûåçúþþôûþýþþÿÿþþýÿÿÿþþþþþþþþþþþþþÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþùþþúþûþýþýüýýýûööæн¨£¤²ÐåàØàìüûýýýýýýüüüüüüüüþÿÿÿÿÿÿÿÿþÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþýýüûüùëܹ¯Óìúûëúý÷ûþýüþþÿÿúýÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûýõýÏYOS]XYM05,9Z²ƒAB2.1I_³ùúõõèëñå¿šŒŒŒln[KLD=GfV‘Š‰n•|ªš¤vqaeZmmijieXV`hac{Žž˜µÂ­¸ÉÅÓáù÷ûøûøùýûýýþøÿþýþýûýýýüöùý÷¾F4]œðØõþÿþûýþþþþþþúþüýüúüøáÝßîùøúþìâîüëñÝ­Œ”~[I?@Oa^WL`ZZW_NQA<PLUU_~®Íå÷õ£˜Þýöýûþýúøúýþúõþþþÿþÿÿÿýýýýýýýýÿÿÿÿþþþþþþþþþþþþýþþûÿÿ÷ÿúÿùþÿûþÿüþÿÿÿýüÿÿõþþ÷ýþøpXhvuom ½ìøýûûõøùÞÃÃÝôúöÀÍý÷ñ»ÛøüüýýýýýüÿÿÿÿÿÿÿÿýýýýýýýýÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿþþýýýõùýýöæÒŹ®Ðì  ªšæ÷ýýúûýýüüýýþþþÿüú÷õøüþÿþþþþþþüüþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿÿþýþûýÿúøýþ÷øèÉÔóîß–µÜõüüüýýýþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷õý²V[\mg\@+.9DgÉ—5E>19>k¥ŽnOXaGFH>C467@KTae]vn„|zŽjƒ{lbgohY^Tdk`r„sy}“¤®Ïïóóöøúûúøøùúúûüüýþþþþþþþþþþýýýýýýýûöýûõ>/U“ìùùþþþÿþþþþþþþþþýúûýýþþûýýýýöýÐÏòÙ¦ŽhU<1GMCUkq|jULRYVNXV[HDav†Š¨¼ÃöõîÖ³Éûüüìàðöúùûýõþþõôûöüþòþþüúþû÷þýýýýþþýüÿÿÿýýþþüþÿÿÿÿþþþþþþÿÿÿÿÿÿÿþþþÿÿÿþþþþþýýûŽ>>SGI}ÑÖõýùþþøþüîàãñù÷î¡Ëôüü²Úßüüüûûûüüþþþþþþþþüýþþþýû÷þýüüýþþýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþýýýýýýþþþÿþþþÿþþþýûúù÷ìò÷¾¬£–é×´¹íü÷éýüüøúøûùÿÿüüÿÿüôÿþýýþþþÿÿÿþþýüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüýþüþÿÿÿþýý÷Ø°¿ìöðÄØðýýüüýýýþþÿþþþýýýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöûýúÏvIPWaT;776E;gsM9E?&<56DLD=B?N;@JFQPHHQSLR[Vc[oafsˆfo{‚…’›œ£ž¬·»ÕìèòñúúñúýüüüýýþýýýýýþþþþþþþþþþþþþþþþþþþþþýûüýøÕaF.E”îýûüüþþþþýýýýýúýþþÿþýúòùþüûýüûÖ¤¨yPVALY[ˆk_cg`VOOKC@BaWam‘ÁÑÓÕ×ÜàîäëÑ£ºÜïýëºÈ¯ÒáÙÙøÿãûþûõþþñýøýþüþþýþùþþÿûøûÿúüýýÿþþüÿþþþþþþþþþþþÿÿÿþþþþþþþÿÿþþþþýýýýó’WIh§×úíýþøýþúÿÿøòöýýúòÌãøúïµ×âûùõòó÷üýýýüûûüþþúüþþÿýýþÿÿþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýýþþþþþþþþþþýþúùùúüþþýýûúûôéââõ鼬ÑÝËÌåëûöýûýûùûüûûþþýûüýþþþýüÿÿÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýþÿÿûüýþÿýúõýýâÀÑùüüñøýýýþýýýýýþÿÿþýýýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûûúØe6DShU=D?5C@?VTE>-*56++624L=M=@JBLWkm|r{’“˜Šœ²Ã¦”¹âöüüüûûûûúõùüõýüýþøûþõþýüûûûüþýýýýýýýýþþþþþþÿÿÿÿþþþþþþûýüø™BJ<K™àöùýþúþþþþþýýýúüýüûýþýþÿøöùúïÌu^WMYrlhj“q[Y`S=.28@ZxšÆÝê÷ø÷éÚÙݶ®ßرÈïùöëÏÐʶ£¤Ÿ¾íÜñäöþýý÷ý÷ýýûúýýúþþþþþÿþüüýýýþþþýþþþþþþþþþþþþþþþþþþþþþþÿÿþþþþþýýýõàØÎàûúùüþýöüüøýýýþÿÿþüøúüüûïÐäôöóîìîóùýýüøööøüþýýþþþüþþÿÿÿÿþÿþÿþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýýþþþþþþþþþýýþøúýþþþüúýúüûüûúüøüñÓÁ­¦µ¿Íéãóîúö÷þþþûûüûüÿþÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþÿÿÿÿþþþþúðàÝçýûñßëüûøýþýýüýþþþþþþÿÿþþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûüñ÷¿469^oYBA;6=@?E?L>:;2-Gs‰ŠŽŠœ• ³±½Ðöñøõßßëè÷õöêöûüïûýþûöùþþõûþýþþþþüúüüúþþþþýûûûüýþýýýýüüüüÿþþþÿÿÿþþþýýýüüýþûüøi??MT¢ßöùýþøþþþþÿÿÿþþþþþþû÷ôõóýùÞÉšlGXR]]i„hndoeH=<@A37Sq†³îñøøöûüüúîçñ¹´æãʼâíÑÔÞÚÑÁÅÕÝòûàÔ±âýöúñæüûúûýþýüþûùúþþýùÿþþûüþþýÿþþþþþþþþþþþþþþþþþþþþþÿÿþþþþþþýýþýýõûýøüýÿûúýü÷üûüýüüûýýýúüüóëîûóòòóõ÷úûûùöôôöùûýùûþþöòôýþÿþüüýþþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþþþþþþþþþþþþÿþýüüþþþýùýüýóüùýýýõàÔÏÈÙÞéÏË·ÄÂßêñòóùýýûþüúûÿÿÿþÿþüþÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþýùöûøõòÞ¿Áàýúøòøû÷þþûùúýþþýþþþþÿÿþþþþþþþÿÿþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöþüùÅA@CV]OB83:6.0C:>D3CV^°Òéöóûýùûýø÷þý÷ýýõùýýüûüûýüüøøüýýþþþøþýü÷úúùüþþýûùüþûþýýþþÿÿÿÿÿÿÿÿþþþþþþþþþþýýýüüüüüýýùûút>:DN¡ñþþýüýýûüüüûüýúúùùúüýüúÒÀov^XUQhVOeXTLEF8.=KQfpŒ¸Ýïõ÷ýüûþüüùïÿÿôþññúæíããßÌ·¿ááËØÜãïßÜÏÐèóúâ³Ãóæàê÷øøþýþþþýýþþüþþýýþþüÿþþþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿþþþþþþþþûûøöýúðüýýûüýýûýþýüüûüýýûöúýûýöýùúüýþþþþúùø÷÷øùúóñõýüïßÖüýþüûúüþþþþþþþþþÿþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿþþþþþþþþþüüûúúúûüùòþþþ÷ÿþý÷þþüýýñýüüàˬ­¬³ÆÐÇÀÎêýùýýýþþþúÿÿÿûüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿþýùôßØ×àØ»Âíýüþýÿþùÿþýüýþþþûþþþþÿÿþþÿÿÿÿÿþþþþþÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûÿþð}8M<A:@:3@794FMJEMyœ¯Ûöõúþþüüûûýù÷úþúúýýýûùöõúþþùþþüþÿüúüýüýýüûýüûþüýýÿÿþÿþûüþþþþýýÿÿÿþþþýýþþþþþþþþþþþþýýýþøýùû¶@L?TðýýüýþþýýüýüýýþþþýüùðëŃhKMdMJaUXVPMED9>G>EkŠ›èîôùýþýýöûûøéäøþôøðþýþþóô÷éßЧ¨ÜùÜêàÚàÑæÚöûôüÙ£ÁäÚÏÙéãäúþùóõúüøññøþþþþþþÿþþÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþöýýúýûûþþþýýüûýýþþþÿÿþûùþýþþþþüÿÿÿþýþÿÿÿüüüüüüüüíð÷ýýòÛÈûþþýùøûþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþþþþÿÿÿÿÿüúþýþúúóôôüûþþúùþþúûýûñßÞâÇ×Ù¬°ÉÝêðóòöýýý÷ÿÿÿýÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýþýøóðïÄ»ºÒãÕÙü÷úÿüþþ÷ýþþþþþþýüþþÿÿÿÿþþþþþþþþþþþþÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûðóûý¹SC28)8B5;7>HJTW?Y¬÷÷ùüþÿýøýûþþúÿÿþüýùûþþúþÿþÿÿûøûûúþþþüüüüöøüþþþüúúýýýÿüúüüýýþþýüûýýýýýýýýþþþþÿÿÿÿÿþþþþþþþöÿüûëTSL`|èñúýýýþþþþþÿÿþýúòé×¾£“cSLJNQKLHS8QM.F67Kmƒ¢Ïíüýþþþüüýþþýøûóìùøÿþþýõûôýýýûüî×ÜòÖÇÖ¿¶ÞáÔÓèöüûìÔÓáéßÛä×ÙûûèÙàóöâÊåï÷ùøúýýýþÿÿÿÿþýÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþ÷öÿÿÿøþüýüùûþýýýþÿÿþûøûþþúúøüúþýüûûüþþþþþÿÿþþþóøüüýûêÙøûþü÷õøýþþþþþþþþüÿÿÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþþÿÿÿþþþþþþÿþýüýþþþýýúøýýûýýþþýÿÿûþþýüýýúüýõúöêßÙÏÄÇÇÃÀÌä÷ýãóýþüüýûýþþþþþþþýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿþþþÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüûüûþý÷éÞÛÝŹ´Òóðìýýþþùýþþþýýþýýýýþþþÿÿÿÿÿÿþþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûüüøþó¦C7@!/F2-27Z]O>.QŒà÷üþÿøöþü÷þýñûÿûüþýüþý÷þþúüþýÿÿüÿÿýþþþþþþþþÿûýÿÿþÿÿþÿþýÿþþÿÿÿþýýþþþþþþþÿÿþþþþÿÿÿþþþýýüüýþþýùúhBX[rñùþùúûúúúúúúø÷íÊ—nWRYbPS:@F>IAETDKG@__…šÅâ÷ûýýþüýþÿÿÿþýýúþþ÷þÿþõþüöùîöûþ÷üüûûûöÔêùæçÙ­ÜçðûûðÜÀÕìåØÙÊÎùýðãêûúáÇÜäëêèìôúúûýþþýûúÿÿÿÿÿÿÿÿýýýýýýýýþþþþþþýþýþýþûøÿþýüþþüÿþùüýþÿþþþþúþþýþúþþýýþþþþþþþþþþþþþÿûýüõ÷ýúðöúýúôòöûþþþþþþþþöúýû÷õøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþôùøàñåÚ¿Ï­ÈÜ¿ÑÄËñíãúðûýòýþíúýþú÷ûýþýõûþþþýûüþþþþûúÿÿþþþýýüýýýÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþýÿÿÿÿÿÿþþÿÿÿÿÿÿÿþþþþþþþþÿüþþýüþýýúþñúýø÷üòüòéÍÅåã»Â×òüúùþþÿÿÿÿÿþþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúûþúþý×¥=?*$3385PvŸYK4>Mtíõêü÷ÿþþþþüüýüûþþýýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿþþþþþþþþþýýûüøÿûõó]0<Paèù÷ÿûýôüýýùûíƃ[KDGLG[QRBGI<AAIJ7Nt áôõöøûýýþþÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿýûúøøþþþþýýþþûøøûý÷êÝÝêðãɸ¸ÁÊÓÔÑÐÑÝðõþáýüþþûýùüîÌãïêìæ÷óþûóøúüûûûùúþþþþþþýûúþýýýþþýüýöøýûúýþúüüûþÿÿùÿÿÿÿþþþþþþþþþþþþþþþþþÿÿÿþþþþþþþþýþýùúþý÷üùþùéòþýþþþþþþþþñíùþçÆÓüÿÿÿÿÿÿÿÿþüÿÿýþÿüÿýÿüøÿÿûþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúÿ÷ÿÿîþûùëøßãṢƨµâ̸Ê÷ôÑÛüýýûó÷ýýúúüøþþÿùùþþüöûþþþþýúÿþþþþýýýÿþþþþþþþþþþþþÿþþþþþþþþÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù÷ûþþðÙÉÎÜôýùúåÔèâÛÌÍïóâäîúþþþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþ÷ùþüîrA&/665\‘­ç–V'0GC¾öûþúøþýýþþüüýþþþýýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþÿÿþþýýýöÿýú~.03RÔýÿüýîýûîûíµŽU]JBWR7AWVC.8D?CNtžÊèòýþüüþþþýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýýþþþþþþþþûûüÿÿýöðøúõæÑÄÅÊÈÏÛϬ­Óìòîèïõýýýëýüùíøýú÷ôþüþþöúöûùû÷û÷öýþþþþþþþþýýýþþþýûýýþþþþúþþþþÿÿÿþþþþÿþþþþþþþþþþþÿþþþþþþþþþþþþþþþþÿÿÿýýÿþüüùþüîöþûþþþþþþþþöõýýí×ßøÿÿÿÿÿÿÿÿÿüøùýÿÿþÿûÿýùÿÿýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûÿùÿÿóþýýúýüúúÞÒìÎÍê׺´®ÎÆ´Êçóüúòò÷ùûýýøôôùþþþþþþþüûüþþþþüþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿùþþýüôáØÔòüüïñÆÂàßÛÙßùýûýþþþþþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöþþþýüüø„@.A^ƒrˆ¼òÙi>*-\w²áðöýüúûýýú÷øûÿÿþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿþþþýþýùüýë‚.03HÈøûüûõóÊ•ŽzYYQ8G:MG4SZD=BTt¤ÀóøðøüùþýÿÿÿÿÿþýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþþÿÿÿÿþþþþþþþþúüþÿþýýþþýúöóôøúàÞðणÔèâ¿ÙÓéûüôæüïýûùÿÿüùþûöýýýúýúþõÿüöùùûúøøøùþýýýýýýýÿÿúôôûþüÿÿÿÿýûûüþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþÿÿÿÿÿþþÿýûÿÿõûÿúþþþþþþþþýþþýøñóùÿÿÿÿÿÿÿÿüúïíûÿúþÿúÿÿüÿüýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÿôýþþû÷ýøýøýú÷ýøöóÒ´ÝÛ¯¹ÕÊÈÙÅÅÞðöúûýüýýýûùüúûüþþþþüüýüûüüûýþþþþþþþþÿþþþþÿÿÿþþþþþþÿÿÿÿþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþýýþþýýþþûúþþõùýüñçúéèÙèÅÑññíñôüüúþþþüþþûþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýùýþýýõm87TŠÊËÀÁëöO7#Hkx†¿òûøýýýþþþýþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýþþÿþýýýýýýñýõ¤;)COàûòîÅ¿‚ieNEK:A;I7BF>H3D\ˆªÙúöóùüûýþýÿ÷ýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýþÿýûûüþÿýûýþýýüùóûöÌÊèîצÄÅÞõöÛË×È÷úðýìûùüúùûýüýþùÿõþþþ÷ùøõïìëíýüüüüüüüúüüþþþüûýüüýûùþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþüýÿÿûüÿþýÿÿûþÿûþþþþþþþþýþþþþýþþÿÿÿÿÿÿÿÿûüîëüþ÷ÿùïúÿþþûÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿüÿüþþùþöþþþüûÿþüýôôýûÜâçĻԾ®®ºÎÞßßê÷üüûüýþþýûûýúõúýýúùúúûþþþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþþþþþþþÿþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþÿþùûýüþýöÚÌÏ­ÍÑíæëýþúþþüø÷ýþüüþÿüþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþý÷þýýúÜ^03b¼óõ¹ºú÷ÇSHF3Kgx{®õøûüúúýýýýþþþýþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿþþýþöýöùùÒKBSeÖãÀ£k_EDM68OBDJLJF=?VlŒÀ÷ûøû÷üüýüûúøúùûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþþþþþþþÿÿÿÿþþýüýüüýüùòíþüýýöó÷ùÒµÅ×ßóöÖËÏ™±ÒÞõûûúûúüúýôþüùþúûúþûüüùóïïñþýýýýýýüöüôèñüýþþþÿÿûùýþÿþþýýþÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþýûýÿþúûÿÿþÿÿýÿÿýþþþþþþþþúøùþþþýþÿÿÿÿÿÿÿÿýÿøôÿÿùÿèàðüþÿýÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿýýþøøþüþõýþþþþþüööýýûýüüöãïúêÌ­¯ÌÓ¼£§ÉõúÞÕçêöüûûýþûþþþþûýýüþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿþþþþþÿþþþþÿÿþýýþýþüóìßΠ×æöû÷þýùýþþûýþþûùýþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþþþüýô¶R03vŠ¤øüÍ”ãûèz@JC4V‰ts½ÛôûýûùûûùþþüüýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþþþþÿÿþþþùüþùúöUPGa‹’qRLA<H7;FEK=5:KASŒ·ÞùüýüüüùýøûþÿþýüýýþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþþþþÿÿþÿÿÿþûùûýþÿÿþþüÿûùþüöýýùóûåãàÄ­Ï–‹¿Ì·ÇúôæãûøýýþþþÿþþûÿþÿÿþüüýÿþýýýþþþýôüäÂÎñýþ÷ùùûþþýøþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþþþþþþþýþÿþüýÿÿÿþýýýþþþþþþþþþþýùùþþûúþÿÿÿÿÿÿÿÿýÿÿüÿþûÿîçõþþÿüÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþýúýûÿûþýùó÷øýôüþùüÿþþñòüýýøúüüóåêûîÉ»±Ëøô¦±¥Êçíï÷ûöýòøþýüÿþþþþþþþþýýýýýýýüýþþþþþþþþþÿþýýýþÿþþþÿþþýýþÿÿÿÿþþþýüýýþþýýùýùäÚÑÓãöéäÈóøúüüúýûùýýþÿþþüûûýþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüüóýø™=9M«š¯ö÷ߨüô¾lK>SPbŒ{‘ÅæüþþýüüþýüüüþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûüüþþþýýýýýþþþýýùüûñåO,)GKTJ=IAFP3@K>PKP^y±öûôøýøüþûþÿÿÿþúùúúüþÿþþýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþýýýþÿÿþüýýþýýüþÿþÿýûÿûöþùþýþøùøíÅÕ¶š²¾™®ÞÚ·ÌèõóûûýýëþþþþþýþþÿÿþþþýýýþþýýóýñÛéüûùæèêñÿÿúåýýþþþþþýþþþþþþþþýýýþÿÿÿÿþþþþþþþþþÿÿýýþþüûþþýþûúþþýþþþþþþÿþýþÿþþþÿÿÿÿÿÿÿÿýþþþþýüýþöÿÿýÿüþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿÿÿöþþþþþþþþþüþþüüþþþþ÷üýýûýýýûýýùýøúûñ׸¦›¹Çµ¬ÀØâùØâûõñúöýýýýýýýýþþýýýýüýýýýýýýýýüýýüúúýÿÿþþýüûúúþþþÿÿÿÿþûûûüýýüüüüÞ± š©ÍìæóãúüüýþùÿþûýþþýýþþþþýþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûýÿóýÙN1?lã°µëýø¦‹õüôߎe@HSi‹‚ux¶îýùúûùþýüûýþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûüüýýýýýýýþþþþýõúîå–l6,1B>69?<?@C7:ITm‡¸Øûú÷þüýõÿÿýþüþüûûþþþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿþÿÿþþþþþþÿÿþýýÿÿþþþûýü÷þþýú÷âòëÚâÆԼŜÎåõÙãðùîÌøúüúþþýüýýüüþüüüýýüüþýöôþý÷þþúòòüûÛ´õ÷ûýüû÷õþþþþþþþþüüýþÿÿÿÿþþþþþþþþþÿþúüþþøøýþþÿúøýþýþþþþþþþÿþûýþþýÿÿÿÿÿÿÿÿÿýþÿþÿÿýÿøÿýúÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüúúüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþøúýýý÷ëâÎÚÔ¸©³¿¾âÆÏÄÛÚøýúõùýþùõúÿüûÿûôþüùþþþþþýüþÿÿúüþûüúþþûüþûûüýüýþü÷üýüüúþýõßÝÜÆÈÉ´Éôöøúüþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúöýÿð‰98NŸäêéûüø¦°üûýùóiWD@n‘|tnwåùûûüýþýüüýÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñþþûþþüÿþÿðþüôüéÙɤ–]UC/+4>A<644G`u…§×ôù÷ûüúûþþûýýýýýþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýýýþþþþþý÷ýüú÷ìòÞ¹Ëçéá¢Ù¹ãÖ¥ÜòúûüøýúúüþñùùûýýýûùÿþýýûøûÿþÿÿûüøßÃëòùüþûëÙðëòûûûþþýÿýùýýúúûþýþþúþþüýûýÿþùýÿûýÿýÿÿýþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþýýþþþþþýþþþþþþþþûÿÿÿüüþÿþÿÿýûüþÿþÿþýþÿÿþÿÿÿÿÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþþúùûýýüûüüîãèëåͨÞરžÙßÄÌàýöýýýü÷øýûõûýýþú÷ýþýþüúüÿþþýúþþýýüûþþüüùúûþþüþþýýøéÂáÞæÞèóêúûýýþþþþýÿÿþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ýþêåK01aÕ÷õöþûö»¹øþúúú•UMPGŒ¯kar“úý÷ûþþýýýþÿýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþúúþûõõ÷ýõøûúÙu…twTNE492/8EPUW’ÆñûóôùúùüýûüþþüýýýýýþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþýþÿÿÿÿÿýõþþþþõýýñööéåªÄÄâÛ³ÓÎÉÇÏÊíûùóýüýþþÿýûüþ÷ýþýþÿÿøþýýþþý÷ïøûûùùúôéèÚÓÕÖáôþìóûþýÿþþþýôüþþþóýÿüûÿÿþÿþÿÿþúþÿùÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿþþýüüþþþþþþþþýüûüÿÿýö÷ýÿÿýþÿþûÿÿÿÿÿþüþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýþÿþþþÿÿÿÿþþþþþþýþþþÿÿÿÿÿÿÿþýýþþþýòùûøøýýüûõøüÇŸ­Ë¿™¥±ÞÂÈÂÝÝØÕäûû÷üýüüýþþþþþþùüþûøÿÿÿýÿþüþÿöÿþÿùÿ÷úû÷ѳÃÖ¼àÚååïüøýÿÿÿÿÿþýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþú°@5N|ïúüøþþûΪ×ûûýûÕhG[@l®lq|ÓïúýþþþýýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüùúüúúþýüïõøÏœn`YRP;4>9,0;GWx¯ÞùþþøøþþþúýýüüþþüÿþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþýýýýþþÿúþþþþúþøþýüôüÜéíðâ¾Âª¤¨ª™ÈæÞÜúûùûüýýúüþÿÿÿüýþþüÿüüþþüýýþþüøùüüøøëåäãëúþäçõþüýüïýþþþþøþþýÿÿúþÿþþúÿÿýøþÿûÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþýýüþþþþþþþþþøóöÿÿöèíùÿþüÿÿüÿÿÿüúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýýýþþþÿÿþþþþýýýþþþþÿÿÿÿüýþþþþùôþþýýþþÿþýýöøúÒüüÞÇÎÄàÆÀ¨¾Á³— Ôáºòììøýöòøöûûüýùúý÷ùùúýýýýý÷þùûöþüúøææ¹ÕÅùôüüûþþÿþþþþþþÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþûðüvA;^¨÷ûüøùÿþ穽üüýúøªZORRw˜oMhvªûöúþÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüùûüùþüï絶¸’kPH=103:9MIG=L€¼áôúøøøùûüûùúýþüüþþüþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþþÿÿÿÿþýýüüüüýþÿýþþþþüþ÷ýöýûüùýûüûúîÃ¥”Åš¨­˜ŸÄ·××àñûûûüùøøúùùüÿüüÿÿû÷øýúýýûüþþþþûýþûûûûñéôþýûíÐîûûõæßóþïþÿúûþþþþþþþûþþýÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþûüýþÿÿÿÿþþþþþþþþÿúôöýþòåçõýûùþÿúÿÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþýýýýýþþþþþþþþþþþýþþþþþÿþýýýþþýþþüûú÷õöøÿøÿôþ÷øýûúûöûøòáÙ×Æ¢ŸÍרͻ»ØâËÅÝüûùøùøúüýüýýüûüøüøüýýüýðîêæßÅÀÙáúøþýøúùùþþþþÿþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúþöóc2>[Ýûü÷þþÿþýúýûûüûð£NITW€ŠbVNnãûýÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýÿüýû䬅q‚uUMB?2=LFF?fv— ¼äûýûüüýþýøöûþûüüûüüüûþþþþÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþýýüüüüýþûûúüýýþþÿÿôþýöùýýøûúüøûùõÍÇ°˜¥¾¡š£Âãõùû÷üýýþûù÷÷ýþÿýþýûøüÿÿÿÿþýüùüÿüüþûþõúþýüñÕóôëèåäòöÞóýûûýþþþøùýýúûýþþþÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþûüýþÿÿÿÿþþþþþþþþÿÿýûýþùòêõûùøýÿýýþþþþþþüþþýþþþþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿþþþþþþþþþþýýýýþþþúûþþþþþþúûýúøþþýûûùüûüüýü÷ðäàõúá̼¼ØÛ±›±ØæàÅÌô÷Ïññùûöúüü÷ûûüüùßÇÏíñÜÃËíùúýÿþþýýþÿþþþýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþýûÜG??“úüýûýûúþû£òøûýûüäASYP|Ž_ANˆùõÿþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøýüñæÒ˜TZCJI@;399@CCa‰Ôùù÷úþÿüüýúùüþþþú÷üüýüüûûüþþþÿÿÿþþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþûýúýþûþýøþ÷ÿþýÿùÿþþýýþýüüöûêßèòÓ´¡™¦·¿ÇÑíñòòøýþüûþþýþÿÿýþþþÿþýýýÿûþÿüþÿýþûýþúýþõþüòõùùýúäõþýüùøûüêêúýûûýþþþþÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþýýüþþþþþþþþüÿÿýüþÿþôøûûûýÿÿþüöñòùýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþÿþþþþþþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿüþþþþüûùûýþþýüûùþÿçÿ÷ýþöþþùþùúøþÿüüýùýþõüùôúôÌ®¶¸Åȳ·áÝ¢³ÉÏÌÒÒÛòûûÙÌÎÜĹÂðöâãøýó÷þúùþûúþþýþýüüüüÿÿÿþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþóûøöš-HPâüóýüüùúýöÆšìûüûýôûÍkJSC\’qLYMÚûþþüüýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿýøøíÚÁ”`>39>99=;>E[v Øóûóûýýüúøøûúþÿû÷ùÿÿþýþÿþýýýÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿþüûýýþþþþýýüþÿùýøüÿýÿÿýÿùûúûýûûû÷øüÿüþüüïöæÕȳžœ©Í·°Æäóùþþýüýþýýþþþýþþýýýþüÿÿýýý÷ýüûúúýþþúþüýýùýýøþþýýùõø÷ãßîø÷ôïþþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿþþýüüþþþþþþþþúýþüüþÿÿþûûþþýþÿþýòæãìùþþþþþûúýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþÿþþþþþþþþÿÿÿþÿþþþþþÿÿÿÿÿÿþþþýýýýþÿþþýþþþþÿüÿþþûþþûûûüüýýýýýÿÿüþþüüýýøý÷íõøÞäñßÍ»šªÎÁ¨©–ºîì´¡§Èµ´¹éùûüúüýûþø÷ÿýøýýüûúúúûûÿÿþþþþþþþþþþþþþþýýýýýýýýÿÿþÿþÿþÿþÿþÿþÿþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüþöøKD7wûûþÿ÷ýþýýüé¸úþûúû÷þø¤LHQUkVVS5wéüýûúúüýýþÿÿÿþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýýùùùøøøøö®›†‚zW;>=93<JNaÇíûýøýýüýþþþþþþþÿÿþÿÿÿúþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿþûûüýýþþþùþúþÿüýüþüüÿÿ÷ÿþþþþþüüýýýþüøÿþþþýýý÷Ü¿ÁÖÓžŽ»àÛÕâúöøþþúúÿûùúýþþþýþýþþûþÿþÿÿúùÿÿüùýþþýýüýþÿþûûþÿüþþêàæîîåÖüüüüüüüüýþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþýýþþþþþýþþþþþþþþþÿþþÿþÿûÿüúÿÿüûÿûþüòêíöþýþþøïìòùýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýþþþþþÿÿþþþþþÿþþüûúù÷ýýòüûæÙÎæýåǸˆ°×ßµ­˜«—ŸÈæììúûöûýúüþþþüõþþûþùûÿùþüúüûþøõýüöùþþÿ÷ÿÿþþýûþÿÿýýýÿþÿþÿþÿþÿþþýýýýýýýþþþþÿÿÿÿÿþþÿÿþþþþþþþþÿÿþþÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýþþþýþüõ¶<5QŸûþüüþüþýûýݼýþþûûþôûíFTZUXMXQHŒúòýû÷øóÿþþþýýýýþþþþþþþÿÿþþþþþþþþñÿþüþþùþþýüüûúúüþýòûòÞ©—€MIC1?C87AWy£Éâíóúýýýÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿþþüûúùù÷üȬËêàȾܼ¿ÅæûüùýýýöôüüûþõüþýùÿþþûûûùûÿþþþþþýýýþÿþþþþÿÿÿúøöôóñïíÿöüÿûüñÓÈÜñúýþûõùøýýù÷õþþþþþüûüþüüýýþÿÿÿûÿùþþøÿúÿÿýýþÿÿÿþþþþþÿÿÿþýþýýüûúþþýþþþþþüýþüúùûýýþýúööùýåãæïûþÿúþþþþþþþþýýýüúùùûüþÿþüüÿÿÿÿþýûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþÿþþþþýýýþûþýýýôøóöýüë˧£ÀÌÛ£zz·®›²­µœ¨ÇçÎËÕâòýüôöüûøùþùôÿùúÿøüýýûþýÿÿÿýüÿþúùöüþûþÿÿþÿþÿþüþÿÿÿÿÿÿþýýýþýþþþþÿÿÿÿÿþþþþÿÿþþþþýþþþÿþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþúýûlF>UÏüþûüþýýþþûÊ©ùúþÿþúûüúâ¨YWRWFI^VVÜüøýýýþûþþÿþþþþþþþþþÿþÿÿÿþþþþþþþüþýýþþùúþýüûûýþþýòøçŸ|XS49FD=43NnŸÕñõõüýúýþýüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüüüþøøûòßÙáÃœœ±çûôÚÜíûýüûüûýöõüþþþ÷üüþüüýþûþþýýýþþþþþþþþþÿÿÿþýüüúùøÿøýÿùý÷àÓàíñõúûøçèíùýýþþ÷ûþþýüýÿýÿÿÿÿüøõúÿøþþùÿüýþþþýýýþÿÿÿÿÿÿÿÿþýüûùöôóþþþþþþþþÿÿþþþþþþüüüüüýÿÿðéæðþþ÷êÿÿÿÿþýýýÿÿÿÿÿþýüýþÿÿÿÿþýýýýþÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþýþþÿþþþÿûþþü÷ùþüýöûûôغÍÏÙ¸¤ºïòåԽ̭ÀÈÔ’ ¦¤™ºÙÊÅîöýðôýûýýôþýþþøþýúüýúüþþþûþþüþúüýýýþýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿþþþþþþþþÿÿþþþÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþüû9DB]ðüþüüþýýþþð§’ñþÿýþôúýúûð¦dYUO=5BVîü÷ùùþíÿÿÿþþþþþÿÿÿÿÿÿÿÿþþþÿÿþþþûþþúøöûþúþÿýùûøóÏ£—i;@<B=@8.<RwµðøûøúýýýÿþýüûúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþüþþýüûùóΠ£Æìæ̸Çßìùòçùüýýüûýþþüúüÿúýûþóþþÿÿÿÿÿþþþþþÿÿÿÿþþþþþþþþþúþþøýýðóùûûûþþþëíèùúîööïöýþýûüþüüûûûüýþÿÿþÿÿüþüüþÿÿÿýþÿÿÿÿÿÿÿÿþÿþþüú÷õôþþþþþþýþÿþüüþÿþüÿþþÿÿÿþüþþþþþúòìÿþýüûúùøüúùúüþþýýüüþÿÿÿÿþþþÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþýýþþýýýýþýýþüýýôñòñèðÒ¬ßõùõòøû÷öûïùåõíåªÁǽ²Ä›ŒÁÅѸ¼ÝáïúýýýòûöýýûýþþþÿüýùþþüþþþÿþþþýýþþþþþþþþþþþýýýýýþþþþþþþþþþþþþÿþþþþþÿÿÿÿÿþþÿÿÿÿÿþþþÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþøÊC9C÷ýþüýþýþþýð ’îýýûýýøúøöûõàY@F2/?I£ùüøþõþþþþýýýýþÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþýþþþúù÷ûúøüøÊ“ZRJ2FN<0@I[l…¯ÝûûüýüüþúïÿýûýüùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþøþþøøüûöñÕÛíõÖ¼¬¡ÅØíÞÁÒØèôûú÷øûýöôþøþûþýýýþþþþýûþþþþÿÿÿÿýüüýþþþþÿýÿþøüÿûýþþþþþýøùþóþóÜïóñøþþøñííýþýýýþþÿüýüüüûüûýþþÿþþþþÿÿþþþþþýÿÿÿÿþýüüþþþþþþþþÿýüüýþýüûüþÿÿþüúúýþýúùüþþýýüúùùøúôîîóúþÿÿÿÿþþÿÿÿÿÿþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿþýýþþýüüüý÷úþþöîíÝÌ¿ÛÖÃôëúýúüþþþþþýôýýøíùúüëêÚ±¿Ó³®ž™¦«Ê¸ëÜßÁâïëõëëöüûüýþþ÷þù÷þ÷ùûþÿÿÿþýþÿÿÿÿÿÿÿþýýýþþþþþþþþþþþþþþþþÿÿÿÿÿÿþÿÿþþþÿÿÿÿÿÿÿþþþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþÿþûƒM9N¼úþþýýþþþþüüªœèõöÿõþüöýûüüúï˜NBFB'AUÂ÷üþéþÿþþþþþþþþþÿÿÿÿÿþþþþþþþþþþþþüøøüýüýïÑ»£l2)8:9K<D=b•Æßìõûüøüü÷÷þþþÿúúþþúúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüýýýýýþþÿÿüøúüýûýýöûö强ÙäñÙ²½ÀÂÊßôúúûûü÷üýýøýþýýýþþþýýþÿÿÿÿÿÿÿþþýþÿÿÿþýþÿþûüþþúûüýþÿþûûþ÷þüéýþúþþüñæÞÛ¿ÊÚëøýþýüûþþÿþþþÿýüüþÿþýÿÿÿÿþþþþýþþÿÿÿþþþþþþþýýýþÿÿÿýýÿÿñöüÿÿþÿÿþýûûþþÿýÿÿÿÿÿþþþýöðïõûþþúþÿÿýüýÿýþÿþüûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþÿþÿþýþþþÿÿþûúýûõçßîâ´´Ìçûùûúÿÿø÷úýøïýøüþýóþþýýùýúìüüâÚÎÇÉ¿Á¬Ë¦Âª¼ÈÁ¿Ç¸«Æíúôåï÷ýýûþûÿÿþþÿþþÿÿþþþþþþþþþþþÿÿÿÿÿÿÿþþþþÿÿþþþÿþÿÿÿÿÿÿÿþþþþÿþÿþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿûûV<Gcìýþþþþþþþþÿü•Œáýûýûýûýþýþ÷ñüê©O)=9A5mºæýþïþþþþþþþþþþÿþÿþþþþþþþþþþþýþþú÷üü÷÷Ý¡W04ADP:5LQK…Çùûúýüóûüûùúþþûóýûûþÿýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýýýÿøôûþþÿýøÿþ÷üýüÜøüûøܸ¹ºš¥Ìï÷÷ôéñåëüýúùýþÿþþýýüýþÿÿÿÿÿÿÿþþþþÿÿþýüÿÿÿþýýþþþýýþþþÿûþöþþûþüüþþþ÷ðêèæìõüÿýøõÿýÿüûýøúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþýþüþÿþüüþÿôùþÿþýÿÿüýþþþþûùÿÿÿÿÿÿÿÿþûøùýþû÷äîùþüúüÿüÿÿÿÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿýþÿÿþÿþýüýýýþþÿþýýùååàÚöìØëüöüþùþùùþýýüýüüûýúû÷þøþý÷þþýøýüüúøüûåêß¹ÔÊ¿º´©»ž~£ØâÛµ¸×ãöüóøýþüüþþýúÿþþþþþþþþþþýýýüýþþýýýýüþþÿÿÿÿÿÿþþþþþþþþþþþýþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿýþÿÿýýþþûÜF5Sûýþþýýþýýþþø{vÖþþúþûùþýõþþý÷ýó¤T=8238j£ÛýýþýýýýýþýþþþþþþþþþþþþþýýýþûûûúóÑždF9;>=<65] ÂÑõöôþöîýø÷ýýþþýùøþþýþþýþÿþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþüýþýùøûûúüÿþîü÷øüýûèÍ»²§«Ñîìëྐྵ»Éôûüüýöüþþþýüýþþþþþþþþþýýýþþýüýÿýþþþûýþÿýûúùúüÿþüþÿÿûõýþþþþþýýþþþýýþÿÿþ÷ûòîïåèùýþþþüüýüýýþþþþÿÿÿÿÿÿþýýýþþþþþþþüüýüüýþÿþÿÿÿýüüýåïùýúùýÿýýýýþþþþýüüþÿþúõãëõûüûýÿþüùúýþþþþþþþþþþþþþþþÿÿÿÿþþþþþþþþþþþþþþýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿúûýÿÿýûúûûüüüüûûöõÞ½ÉÕÒðìñ÷ýýúÿøýýýþøþþüýûüýúþþúþþüþþøýýýüýýúûýüýýûøøøûñ×Ó²¥ÃʼÀ¼•¤¤ÔøÃøÂÔêùü÷ðûûüüüüüüþþýýýüûüüýýýüüüüüüüüüüüüýýýýýýýýþþþþþþýþþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿúüýüûúûüø§>@V•úúþþýýþýýýûû€tÉøûþûýþúÿÿþþþýúýûÊu?<<.;W‚ÎüûüüûüüüûþþþþþþýþýýýýýýýýùýûÛªpL=14DD7=QrŸÏìûúùþþþüþþûþüþýþþþüúýÿÿÿüýÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûýþþýýþþýþÿøþþýûüüûöêæèÙéüùû⢦²ÂòóüëâÕâòüýýûûüýýýýýýýþþýýþþþýþÿûüþþûýýþÿÿÿÿÿÿüýÿüûÿÿÿþþþþþþþþþþþþÿÿÿÿÿúÿøõøîòëôýþ÷òòõùúúûüýþþûûüüüýýüýýþþýýþþÿÿýþÿÿÿÿÿþýýþÿÿÿÿÿþÿÿÿÿýÿÿÿÿþþþþþýýþÿÿþûüýÿþýüýþþõëêòúýýýýýýýýýýÿþþþÿÿÿÿýýýýýýýýýþþþýüúùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþýúüþýùýüüþýûþúþýòþøüúòìÐÒÉ¿Àäìõøüýþþþüþþþþÿÿþþÿÿÿÿÿÿÿÿþþþþþþþÿþþþÿÿÿÿþþþþýüûúùû÷öùùðÜËÛŸ–¢Ç̫Ы¦¥ºØÝÆ°Õíúëûñõûùþ÷üøûùûüüþýýþýùþúûþþýùûúü÷þÿüÿÿþþýýþþþüýýþþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿûþþýÿÿýûƒGKV¹þûþÿýýÿþýþýûyzÌ÷þþýýþþþþþÿôþÿöýüÙ 4B;2?;R¡üîþùóúÿùþþúûþýùüöüý÷ñýüóὉeRE@A2:H7*_£îõüþýûýÿÿÿÿÿþþþþÿÿÿþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþÿÿþþþûüþýýýûúûóõûüô×­­ÙÝûó÷ÓâÂÃßûøõýúýþýüþþþþüûùøûÿÿýÿÿÿÿþýýþþþþþþÿÿÿþþþÿÿÿþþÿþþþþþþþþþþþÿÿÿÿÿÿÿþýûúúûþþþúôðîîìîöúøúþòòòóöùûüýöýøüþõþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþøîëòýþûúþþûûþþúÿúüÿüüþýÿüþÿþþþúþþüùþþüùÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøýþþþþþþýýüþüýþþéýýöíÜØÃÀËééâáúûüýþþþþýüþþÿÿþþýýýýþþþþþþþþþÿÿþþþýýýýþþþþþþþþþýýüýýýüúùûûüáãäðïÚñÕÁ¯¼ÙÚµ“¦³Ã·È¼Õïô÷øýøüúýøýýúüú÷ÿþü÷ûû÷üýüþþþúöýúüûûûüüüýûþþúûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþ÷þÿÿÿüýõj8Uêþüþÿýýÿþýþýû}yËúþùýýþþýýþÿþýüüþþþö£B1:;B5?¹üïûýþùýóþþ÷õþÿûÿüýûúùÞ¸VA8@A2=31Q|žÐùüøûýýýüûûÿþþþþþþþþÿÿþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþýýþýýüüýýûûüýýìÖÕøúýäàÑç©ÁÛðùòëö÷øöùûøüüþþþþýÿþüýýüýþÿþþþþÿÿÿÿÿÿþþþþÿÿþþÿÿÿþþþþþþþþþÿÿÿÿþþþþþþýþüþþþýúùøû÷÷ûûöõùúøôíèèîôûòáàæïúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþùöùþþþþüïââïüþúÿÿûüÿÿýþüþúóöþþûþþúýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþýþþüúûþùüÿÿÿþúöüæǯͿÍȱÖüýûøýýþþÿþþþýþþÿÿþþýüüüýýýþþþþÿÿþþþþþýýýýýþþþþýýþþþþþÿûþþþþýÿÿýûþûùøôûû÷ëíøóÚÇÈÆŨ¡”©¶¾ºÉοÌÈÑåöîèûüúýûüüüýüþþ÷ü÷úþþþüþþþþýýýþýþþûûþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþ÷ÿÿþþõü±@7L õûúþÿþýþÿþþýû|rÆûýùþýþýýýþÿþúûÿûôùþûŒ9CA6IGYç÷ùýþõþ÷üüüýüýþûöýûòÖ”]`7;46H?B_r§áùýùôþýýýýýûùÿþþþþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþþþþþýüüýþþúþýûþþüøúþýüæâÚà »áìõóäñêÜÏáöûýýöûþüúúùùÿýüýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþþÿÿÿÿþÿýýýþþþþþÿþýýþÿÿÿþûûþþúúýýýúïåâéñü쳧¦½ùüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþýýýýýýýýþþþþþþþþýÿÿþüýþþþúðææðúþßòðåïüúõýûþÿÿÿÿøüýúúþþýÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþÿÿþþýþýûþþþþþÿþý÷ùüúýöÚº§À«ÀÓ×ñýýþþùõýüýüýþÿÿþÿÿþþýüüþþþÿÿÿÿþþþþýýýýýýýýýýþþþýýþþþþþþûúúüýýùôùûûúøüÿùûûûüüûøùûðÜ®£­Â¸ÓÉÔà«Ÿ¡ÉÄ­¬Ùû÷åëðüóñý÷ûùýýýûõüüóúýüüþþýþýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþùÿûùþúûc2KJÇðýþþÿþýþÿþþþörjÁùüþþþþþýýþÿùûþþýýüøýèIH6;J2ˆøøõøøþý÷öýýõïüúøòÁ†dKI>F?6KMV–Ùê÷ýüúüýýýüüýýüüÿÿÿþÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþýþüüýþþóþýûýýûÿþùøú÷ôêÛ²´åìáñìéóàËáöðíßí÷ýýûûýþþþþþýýýýþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþþþýýýÿþüüýþþýüúüÿÿþþÿûýþûôñôùùôÌÁ²Áüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþýýýýýýýýþþþþþþþþûþÿÿþýüýúýþüüþýúàöñæôÿûúöùÿÿýþýôüþþþþþùþÿÿÿÿÿÿþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþýþÿþÿüûþûýùûöêóøí½£°Âàùùýüøþþúýûûûýþÿÿÿþÿÿÿþþýýþýýýýýýýýýýýýýýýþþþþþþþþþþþþþþþýýû÷ùýýýüþþúþýþÿùøúøùÿþûüýüý÷öüûÞöîóÕ®¾³¯Æ¨ˆ„­æ䶬°Õ¼Áæ×áûóäîúûûüüýýýýýþùûûüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿúüûûþþíC;CcïúþýþþþþýþþþýêijÅøùýÿÿþþþþÿÿþþýúýþþùóýÚY6H%5A9ÖüýøúüýþûóøûúúöÞ½sB;5FC86b‡™Ìùðþþýþþ÷óüüýüüûüýÿþþþþÿÿÿÿþþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþþþþþöþýýýýúÿþøÿþû÷÷êÞÔóñåúøóÞÛÔòüñóéæñøôëìôüûýþþüûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþþþÿÿÿþýýüþýüüþþüúÿþþÿþüüüûýþþþþýýüýû÷çíýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþþþþþþþþþþþþþþþþþþþþýüýÿÿÿþþÿÿÿþþÿÿÿ÷ÿýõÿÿùÿí÷ýðÝáöþûþþþþøùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿûüþýýóðæäÖ¿ÑòãºÎæüùûüþøúûýøýýýþÿÿÿþýÿþþþÿÿþþþýýýýýýýýýþþþþþþþþþþÿÿÿÿþþÿÿþþþüýüýüüýþþúüúþþøúúþýûûýýýýþ÷üüøùÿøýýýñÝõôñæξ¸Æê㬞œ¾žžÂ«·Ï»¦·Ôèöôûñîøüúúýúýþøøþþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿüþúþùþû¹=C4ûüöûþþþþýýþþûähoÌüöýþþÿþþÿþþþýûüû÷÷úþöý§D56C?9®ûýüÿûùþþüûù×´rZO7>M9?Lx£Þöúýõÿÿûûÿþûþýýýýüûüýÿþþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþýýþÿþÿþýüþþüþþüþþùÿþ÷øýûüýýóúþùýíãÎêùïôäÜçëàÑÏÛèüþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþþþÿþÿÿÿûüýÿÿÿþýþþþþýüüûÿþýýþþþþþûþûöþþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüùøûþþýýÿþýûûýþÿýÿüûÿü÷þñøûëÚâøþþðáêûþúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüýÿÿýþþüýýýûöÙÆ´¸¸¶á÷ïÜûýýøüùþùý÷ûöþþÿþþþþþþþþýýýþþþþÿÿÿþÿÿÿÿþþþýýýþþþþþþþþþþýþþþþýýùüþþýúúûøüüüÿü÷þúýüúûùùþûùÿþýúüýøÿüúòýýüüúûù÷ýõÖåÞèÐÀÀ¦©œ§£žž®ÍÙܸ°Ðà×ßøíîóøûüüþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüÿ÷þõûò?GNÞûûüþþþþþýýþþþåjlÊüöüýþþþþþýþùøüþýüýýþöý÷¥QB72@òùüýþûøöøé´nED=M=7?Ex’öûñýøìþúúýÿýùüýýþþþþýüûÿÿÿÿÿÿþþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþÿÿÿÿþþþþþþþþþýþüýþûýþýþú÷ûùþýýþþûöüü÷üóÝ·ÖöúûíÔåñêÙÓÜèýýûûýýûøþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþÿþþþþýþýÿÿÿÿÿüýÿÿÿÿÿÿûüýýþÿÿÿþýýüýýþþúùüþÿÿü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûùùüýüüýýýþÿÿþýýþþýÿÿÿÿÿûýþ÷òûÿûýäÐÞúþù÷ÿÿÿÿÿÿÿÿýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûùùûýþýüùöùõصꧩ¿ÉÍûúþûÿúþýûþþýÿùþþþÿþþþýþþÿþþýýýýýþÿþÿÿþþþþþþýýýüýýþþþþþþþþýýýþýýýýýüüýýýþþþþþöÿÿõþþþýüþþþÿÿÿþûùþþþþþúÿÿþúþýýþþþþÿþüúúûðÚËȸ÷¬²ÆÕÌᥴÁ§®Ø·Æêóååöüýýýýýýýüýýýýýýýüüüüüüüüþþþþþÿÿþýýýýýýýýúÿôýõüóg=AkúøôþùýþþþýþÿþþêkdÂü÷þþþþþÿÿýýýýýýýýüûþÿôùüÄV2>$qèûöðýûíЩ{O>GC4D>Ge’ëûüþþþýýûþþÿþüýýýýüûþþýýüþÿÿÿÿÿþþþÿÿþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþÿÿÿÿþþÿÿþþþþÿþþûÿÿýþþüýþþÿýþúúþ÷þþýýþùýòÊãüøúÝÆàøùìãèðýùòòööïèûüýþþýüûþþÿÿÿÿÿÿüüüüüüüüÿÿÿÿÿþþþþþþÿÿÿÿÿþÿÿÿþýÿÿþÿÿÿþÿþýüýþþþþÿÿüÿýþÿøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýþÿÿþþÿÿþþÿÿþþÿÿýÿÿüþÿüüÿÿÿùÿÿþðäÞëúø÷ÿÿÿÿÿÿÿÿÿúúûüýþþÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþÿÿÿþÿùúþþþýüûúù÷þýþëýòùøϼ ²°¾Úïõ÷ýþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýüüø÷øùúûüü÷ÜØÕÉ»»ÚË­ª²Åºž»ßö×ÎÕÓðøùñûûùýúüþüüþþþþþùþþùúù÷ýÿùýýöúþýúûþùúú®W;BûýûýøýþÿþþýûúüìuWªûúúýþÿÿýþþýþýýýþýüþÿþøýòû´R,SQ…àøöøÁ]:BD=@@Gb}¶ñüùþþÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþÿÿÿÿþþÿÿúþ÷÷ûýôÀ¾Ý÷óüûÞôñþýøøüûèéøü÷÷ûüýùþþþþþþþÿýþÿÿþýÿÿÿþþýþþÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþýþÿÿþýÿÿÿÿÿÿÿÿýúúýþúøùþþþþþþþþûóýúóþüýüù÷úüüýÿþþþýüùúýþýüýÿÿÿÿþþþþþþýýÿÿþþþþþÿÿþþþÿÿÿÿþÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþÿÿþþþþÿþûúüþþñþþúòöýûùØÏ‹“˜œÃçô÷üýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþÿÿÿþýûúúýöøõñíëûá¾­ª¾¶‹ÈåÏ®´²®ÀÅÒêîäèóýöýú÷üüüûýúûþÿýüÿüüýüùþÿûÿûþú÷÷}<KJºûôü÷ûýþýüýýüûùûz]²÷ùûýþÿÿýýÿýüüûûüýþþþóýýôüï¢YDQ_‚¾~\PB=FB9Fx°ñûøùôûþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿõûþüûÚÜãëãõùßê÷þûûüüýôìýýòìïíêüþüùùüýûÿþûúúúüþþþþþþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüþÿþüûýÿÿÿÿÿÿÿÿÿüùúþÿþýþþþþþþþþþóÒúýëûüþþþþÿÿþþþøþþþþþþúÿþþþúõ÷üþþþþþÿþþÿÿÿþþþþþÿþþþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþþúþÿüûûûýðøüóüøúûà·š™¬ÄåûüûþýúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýýýüüüüþýýýûýùûûðáËǸŒÝðߤ¦¬“³¶­¤¬¶ÁÍÇâîÖÓéòûúüúüüüûûüþþþûþþþöýøþþüõ`?BHÏú÷þúþÿýüûüýþþüüraÂ÷øûýÿþþþþþýýýüüýýýüúýüüýøûï•YYNJcM9=BG7<`Š¾ûùùóôþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýõÿÿùþôþõôêøýñôùûöüþþýýüúøúøíêõøöóòõûþþüþÿÿÿÿýùÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþøýÿÿúøûÿÿÿÿÿÿÿÿÿûùúþÿÿþþþþþþþþþþþèýõëåÄááîùûúûýüüþþúûþþúþþÿÿÿüýÿþþþþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýûûýýúýüýõûùðꈒ•´—¾Îéûûúûüüûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýýøùúûýþÿÿüþþþýýúöùüüú÷óêóüýøÊÉÔÄßÓ̶³®°ÅÃÜØ¥›¸ÄÐÓñöæÛòûûúñúýýûóûþúôöüüÝPC6GÄøüùþ÷þýûûüþüûÿözb·øøúþÿþýÿþþþüþÿþþýûúúýõþþüéùâ`EJ1677BIRItÃéüöúýýýú÷ûÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýùÿü÷þüþùþø÷ýûüúûôúþýüòý÷ïûý÷ñü÷óððõüþþöýÿýüÿÿýÿÿÿþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþùýÿÿúøüÿÿÿÿÿÿÿÿÿýüüþÿÿþýþþþþþþþþþûþóöåÁåÝíùûûÿÿýþùõüþüøû÷øùúýÿýùÿþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþýûýþûúþñûöôÝ£ª““Ä ÐøøùþüûþýùùýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýýýÿÿÿþþþýýÿÿýÿþþþýýüüüýûôúüúüùõùúûôûõòâØìíèÚ¤‘œ•–¡ÀÔ¸¤ÇØØîæÜÚ÷ûûûöûýýûú³J;?TËóüöýùûüüüýþþþýñ£^†öüüþÿýþþþþþúþþýüýýüþö÷ýõìÉıf;<9<EHm©ªÐüý÷ýúòúÿÿÿûþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþùùÿøøøþþøüýýýþùùýûóÝÛæéëùýýýýú÷÷úûûúùýùîéðüþýýþýýýýýÿÿÿþþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýþþþýýýþÿÿÿÿÿÿÿÿþþþþÿÿÿþþþþþþþþþú÷þþûøøü÷þþÿýþùñÙÏÒçúþþþüþþûýÿüõÿÿþþþþÿþþþþþþþÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿþúûýüúøÐŒ‹‰€›¼×íüûûþùûüüýýüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýýÿÿÿþýýüüþýöüüöüýþúøýþþýþûôøýýûüøýüûýýýþøôìÖÇĵ­Àžˆ¸¼«ÃʦœÒîçãËàïúøðŠN<@eçøþþùüþþýýþÿþþýöËX^ùþöþÿýþþýþþüþþúûÿÿþüúûà߶“ƒXeA=MAHY¯èúøùüüþüýúþûõýÿþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿüøýÿ÷üüÿÿüþþþúþûûþý÷áÁ×èîôøûýýýûýþýüûùüùðèêóúúúûüýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþýþÿÿÿýÿÿÿÿÿÿÿÿúûûûýÿÿþþþþþþþþþúþþþþûþþþþþûùùôìÉÈÅÊàùþùþúøûþþþþþÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþþþþþýùþþ÷üûîºksvˆ®µàûøøóøþöýþü÷ûþýøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýüüûûüüýýþþþþúþþ÷þûþûüÿúöüþþüúþùøþøýøþüöûýþüøý÷öôéøüÛ¨³èëȼ´˜•¼¹«¿´§½ÞÜÅ_F:?€ïôùþûýûüüýþÿþþþúâi^ùýöýþýýýüýýþÿþúüþýöèûåÃݱ–ryWRjO@_O«ïúöþúùûúþüþþøþþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿûþÿüûýùùûüýùøþúþþýþöçî÷þúêéøûùúýþüûýûüþýøñðóúûûüüûúúýýþþÿÿÿÿýýþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþýþÿÿÿýÿÿÿÿÿÿÿÿùûúùûþþüþþþþþþþþöÿúòÿþòþûûûýÿÿýüùøíÞã÷üóøÖÇÞùýúýüüýþþþþýýýýýýýýþþþþþþþÿÿÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþþþþþýùþýõûõÁZf[^˜Æîúüøýúÿþþþûþþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýüüÿÿÿþþþþþùþýþþýþþþþþþþþþýúüýúüþþþþùþþýþýþþøþúýþøþúüûýýûûý꿩ù²É±Œ¢ÎÈŸD;9K¡Þßæòýöâèñøüýüûùùòˆmëñüýüûýýüýýúüûúýþòãéï·Èííà„„qŠ¨r>HEòýõþúüûþþùþÿüþýþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿýýþÿûÿþþÿÿÿÿþÿýÿþøþþûþþüþþüþûùúûùõôöþþýþý÷õøþþýüúøöõö÷øùúüýýúúûüýþþþýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿýýÿÿüþþþþþþþþÿóÿÿúþýþþüýþÿþýþþýýûþþþþþ½žÈùýôôøúûýþýûúýýýýýýýýþþþþþÿÿÿþüûüýþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùþÿöÿÿøúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþÿýþ÷üÿûüþüýýøõûé¡UXt«Ýöüýþþÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþýýýþþþþþþÿÿÿÿÿÿÿþþþþþþþþýþþþþþþýù÷÷ùûóßÌ°ÃÒÚ—MP=c¥½±Á½¬È ‘±È¼Ø÷éæù福ÖùöýûôüüöþùþûþëüôùâîñÏãñù÷ضÌöø½~PqÁûüüþùüúþþÿÿþþþýþþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþýþþþþþü÷öêãßàôþþþþþþþþÿüÿþøüýðéõÿþöòúÿþùÿÿýþûþþÿùþÿþÿüþþÿÿÿþþýÿýüÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿþþþþþþþûéÛäøþðÜ¿Þûþûùûþþþüöþþûÿýþþüÿÿüþúþþþþþþûþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿòõúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿþÿûþþþ÷øúôòþþþü÷ÔŠhÆïüýüûþþþþÿÿÿÿÿÿÿÿþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþýýýýýþþýþþþþþþþüþüúøúúúñäõòƒOI@ZÆÜÔØ´ °¢ž¥™²Ì»¨æóµ¤ßñïúôûöõóüõøÖ¼ìüþùûõñÿþþøøûúþþ÷ìÌÑíüúýþôûýüÿþýýþþüýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþýùùðéäáòûüþþþþþþýúþÿûÿÿù÷üÿýõïðôÿùúööúøÿ÷ÿÿÿûõÿÿýýýüüýýýÿþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿþþþþþþþþûøúýýøñàîúýúóä×òúûûþþûôþþþüÿþýþþþþøõøþþÿÿþþýüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøþðÿîíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþþøóþþýýéå÷òæåîéÉÔèûýüûüüýýþþÿþþýýþþþþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþþþþþþþùþþüùüþýýûùÝnT2KmìõõùÛÚãÙÈÀ³£®¶£·Ä×™¹¯¼ÖÒâÂöèÕØ›šÞúüûýúùôíûóýúùõþúøñüýúøþÿ÷÷þþþþýýþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿýÿýüùóþüýþþü÷òïüûþþüþþüþýýûùõòðüûøðôñåîûÿþÿþúÿÿÿþýýýþÿÿÿþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþÿûþþþýûýþûûûûü÷åÓûøñéìûþþýþþýÿûöøôùþþþýûùÿÿÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿõûúòþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþ÷÷åײ¾æðêìõýýþþþüûÿþüýýþþÿþýýýýþþþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþþþþþþþþýþýýþþþüüüüýýúó÷üõÉm^>aªùùùûõüüüûøìçííÞ˽ь¹¾³Çϸ¤¬‰‹|¶ÀÀÅæóúñùûüþþþþþþþöþÿþö÷ýøþýûþþýÿþþþýþþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþúùýüÿÿ÷þþþþýùòìèûþþþýüþþþýüýþþûøùþý÷úêÍÐöüûýùõüüþþþþþþÿÿþþþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþùøùûüýþüþþþýýýúôüú÷íãçâÌüþüýÿþüýýýýüýþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿöÿ²ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþ÷þþïýƨ†¿íýýþýûúðõüþÿûùûþþþÿþþýýýþþÿþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþýýýýýýþþýýþþþþþþþýùùüüýúüûúÓk@BSÞ÷ûûýûýõñüüöùýýùøúùÑÐËÛ×Ñš˜œz|Ê×½¥É·ËóÜÔÜÒõúñûüòüøûöûûýøûþ÷óýüûÿþþþþýþþýýýýýýýýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþþþþýþúýýõüþÿÿþýûù÷ùýþþüùúþþþþþþþþýúÿÿüÿíÏÑæøýüíäóþüüþþþþýüþÿÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþûüÿÿýùýÿÿþûüÿÿùûÿüòîàÅþýûûþúøýîøýýþýüüþÿþüþÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿñù²úþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþþöýúý¡”±íüüúþüûúÿýüýúõ÷üþÿÿÿþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþþþþþþþþþÿþþÿÿÿÿÿþþþþþþþþþþþþþþþþýýþþþþýýûýýüüýþþúýüäŸTc‡öíþþûþþþûþþþýýþþý÷ýü÷ûöæ­~¤¼´¶Óø÷Ê«¹ Æ贱Ȣ½¹´âßåȽæüýïúüþþþýûüúþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþþþþþþûÿÿùÿÿÿÿÿþþþþûþýúøñíóûýþþþþþþþÿÿúýøéðïûüýôíùþþÿÿÿÿÿþýþÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýþþþþþþþÿþþþþþýûüûüúúþþúûþþþ÷âÏÊ»Øóûûþþûÿÿÿûüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿî÷ÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýþÿøþýñšªìúþúúÿþýüüûûüÿþýûÿþþþÿþþþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþþöýÿþûúùùóþÿüóÁÈõýõÿýøýúýùýýüüûýþýïýúõýûùǦÅåúûüøýìÝæçøó½§Ï¥¯¡›Âª¹žªÓÓ»§Óøüïï÷ôüýýüýþþþýþþþÿÿÿþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþøùû÷ûÿøÿÿÿþþþþþþþþýùúñêò÷ùûüýþþþÿûþûûýúþþþùþÿÿÿüÿÿþüüüýýüÿÿýûýÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿþýýþÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþýþþþÿÿþ÷ûþþûûþþÿþüþÿÿþüúýûûþüùüùýþÿùàÈÃËÝäàåöü÷÷ÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþ÷ýýúùøùýþÿÿûýüúüüüûþýúþþþþÿþþþþþþÿÿþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþþþþþþýþþþþþÿþþþþþþþþþýýûûýýýýûüþý÷úýþüüýÿþùúÿýþþýùùþûýïÞÞåýûÜßôüýüüÿýýúöýþúüíüÝëÜÇÛÄ˽ÃÁ° {Œâé½±Ç×ñóôôöûüûúûúúúúúúúúúúúúúúúúþþþþþþþþþþþþþþþþÿÿÿÿÿþÿÿþÿþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿýÿÿúÿþÿþþþþþÿüþýþÿþùþûûüüûûûûþøþþûüúýûýùýþûÿûþûøôôõ÷ùúþÿúøúýþûüüüüüüüýýýýýýýýþþüüüüþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿþýþþÿÿþþþþÿÿÿÿþýþýúþþþûþþûùýýýðßäóéÎãóÿÿýýýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýýýþþÿÿÿÿþþþþþþÿþþþÿÿÿÿÿÿÿÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿþÿÿÿÿþýÿýüýþÿþþûüüüþýýûðøóßÞòýúðôûþÿþÿÿþþýýþþþþüüüûûúùùðææØÒ»•¦åÆ—ž³ÂèçÊÔÎÂÔûô÷üýøüýõþþþöÿÿñþþûýýûþþöÿøúýýýüýûûüýýüüþþýýýüýýüýþÿÿþþþÿþþþýýþþÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüüüóäéöþþ÷þûþýöûÿÿþÿÿþüùùüþþûöòÜìøõùüüüýýýþüÿþùúþþýþþüùþþúýþüúýþþþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþýýýúöùþúñïíþþíáîöûúúúúûûûúüýüúúúúûúÿýûþùþþþþþýýýýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿýýýþÿÿÿÿþüýþþüùüþþù÷úöãÏéõöììøþøýÿÿÿýûûüþþþþþþþþüüüüûúúùúöüöúóÝîìÙ±«µ§Ë㞈ºÕÓžâïëÝÀÑàøèîèýýûýýüöþýûþüøûýþþþþûûýþþúüþþþüþüþþþüþþþÿÿÿÿÿÿþþþÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþëÝç÷üõîýýýþþÿþùõýþÿÿþþýüûùø÷àëñëÛáå×ððüýóúþþþýüù÷ýÿüýþûþýþþýûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿüùûþýûùþúþöÙÑÜÞùþþøôûþûýüýþþÿýüÿþ÷ÿþþþýûüüýþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþÿþþþþþþýýüüýþþýýþýýýúãÊìöûùùþþúýþÿýúúüþþþþþþþþþüýýýüûûúýýýûýýòýüüôîðæûû˶ÙéГœæÅú™Ä·ÁªÇÚòðÆ·ÞùóüüùüûùüúþþþûøþþùýüüýýûýÿúþýþøûüþþþþþþþþÿÿþþþÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðöþõßÒáþýûîßéüþþÿýüüþþþùûþþïööïÚÞäÄìäùúþüøùûüþÿÿÿûùýþÿÿþÿþÿýù÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿûúÿÿýüÿþûýõæìúùýþðÏÈâûþüõñöþÿÿýþÿøÿþûþúýþÿÿÿþýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþüýþ÷þÿúûþùéåô÷ìèñøöùüþþþþþþúûûûûüÿÿþþþþþþþþþþÿÿþþýýüüý÷üý÷ýñúýüýöüõýõûóèÇÍùñÛ·•µ“š’³·ÉɬµÅÓÝáçóùùûýýøùúùûú÷þüùüûøýþüýýýýþþþþýþþÿþþþþþþþþÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷þþøéßê÷þúϬÉöþÿþüúùûþþúüüþùýýøóùøÕöìúùöäÚäôýþþúõôþþüøñùùúýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþüýÿÿýýÿýûýûöûþýøþöÝ×êúûøîáÝêûÿýõÿÿúõ÷þùÿÿÿÿþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþþÿÿÿþÿþþþþÿûþþþýöáÌÇâôïéòýþþþþþþüýÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿþþüþþûýþþþþýþúü÷ýúþÿÿôý÷÷ýýúäá켨¶™ÐßäÄŽš²¯Ÿ©²ÍáÚÊÁËÞõüüøõþûôýþùüöùü÷üýþûÿþýþþþýýýýþþþþþþþÿÿþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúøþþþþûþðýýÖ®¿áäöúÿÿýüýÿýûöü÷þüùüþþîýûûüÌÁÅÝõüûú÷çâúýôýýþþüùùûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûÿÿüûþþüÿüýÿýù÷õùÿÿýûÿÿúøòáÓßúþùþ÷þþýþ÷þýüüûüþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþÿþþþÿÿÿþþþøóöòäÙ×Õìþþþþýøþýýÿþýüýþÿÿÿÿÿýýþþþþþþþþýýþþþþýýþÿÿüûûùöÿüûõýøýþùüþùþþþýüýõûúñë÷øúù÷ϯÅÁ¾¤¨³°Â˱ÀŸ¥¯È×»ºÎòûüüü÷üûýýüûþÿýÿÿýýýýýýþþþþþþþþþþþþþþþÿÿþÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþùùþûùùùýóÜØâãüþþüùøúûþþùýøþùúùþüüúÿûûÚÚãóûúùûêɺãúûýööüýýû÷÷úÿÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþúÿÿûúþþúþûúÿÿÿþÿÿýúøùüÿÿüýòãêýþ÷þÛîûþýâüÿþþþýýþþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýþþþþþþþÿþýþþþýúøòéãàãìõúýûõõûþþüýþþþÿþüüüüþÿÿÿÿþþþþþþþþüýýþþþýýûùûþþýþþüüþøÿþûÿÿüþùûôý÷üþûýøüýüýùõý÷óüóæàïûõïݺȗ¥§¼É›¤‰·ÌËÑÊÀÇóõïýöýúþÿþüýþþþüþþþþþýûûþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿýýþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýûÿø÷þúûþûûþúóôùÿÿýùôîçâ÷þüþûþùþüúúÿøþüùþþþþþûûýÖÀºêýûóÌÙáîúþþþýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýýþþýýÿýúüüûüüüýþÿÿþýþþþùúþþú÷ÎØîùëÏâüýþþþþýüþþþþþþþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþþþþûùùüûõïâòñÞÛïýûþþþþþþþýÿÿÿþþÿÿþÿÿÿÿÿÿÿÿþþþþþþþþýþþÿÿÿÿþþþüþýùþûþþþ÷þýùÿþûýþþþÿûÿýýÿúÿÿûùþÿýþûûþþüúùûýüõå´ÔÖã䣬°¦Ÿ·¾®ªËÆÀâÜæäúüúùúüüûúýýýýüûùøþþþþþþýþüüüüüüüüüüüüüüüüýýýýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿýþûÿýþýüüûûþûýÿÿüéιàñøþûü÷þþõûþùüþüýüüýýüúùýöîýúïõ×äÜÙäöþýõþþþþþþþþþþþþþþþÿüüüüüüüüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿüûÿÿþýÿúÿÿúýÿÿýýÿÿýüÿÿÿýýþþþýûýûèëúþðÞàêíóúþþþþþþþþþþþþýýýýýýýýüüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷ýþøûþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýúÿÿùúþþþþûþþø÷ýìæÙÌÝÏÞùûôüý÷ùþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿýýýýþÿþþýýýüüüüüýýýýýýýþþþþýýüûûúùùûûøêÝåáÁ¤´Ì¸’Ê°£Çª˜©ëîÉÔãëíæùùûüõýý÷þýüøüÿýøþùúþþþýþùû÷ÿùþþþþõûüøùÿÿýÿÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþþþþþþþþþþþüûýýôãÔåðûÿü÷÷ùùýþúýþúýþþÿþþþüÿúþûþþýþûü÷áÞöþúÿôþøþþúþúúóþþúûþþ÷þþõÿÿïÿõùýÿþýýþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿþþþþþþþýüûüýüú÷ðóøýþþýûëþþ÷õýþþûúûþþüûýþÿûûÿÿýýÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýüþþúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùüüþùýþýþýýü÷ôÑçݺÝåìýýøýþûþþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿþþýþþþÿþþýýüüüüûüýýýýýýþþþþþþþýýýþýüþþýùôúüóáãêßÍØͱ®“ ³ÙÈž”´·¨¸Ï´ÖùÛñðùüüýýüúþþ÷þþüôöúùÿÿÿÿþøþùúÿÿýÿþúûÿþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþþþþþþþþþþÿÿÿÿüöñøýþÿ÷íèçòôûûýþõýûþýýÿÿýþöþþþþúÿýüýñîþþ÷ýþýâèöøýèýýû÷øýýõþþûþüüÿ÷ùûþÿÿþýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿþþþþþþþþþýýýþþýüùúüýþýüû½ÞöòíöùòÿÿÿÿúôúÿúÿÿÿÿþüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðüõòþþøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüÿÿüÿÿýýýûüýñàîûçºèñÍïõøþþûþþúþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþþþþþÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþþýþþþþþþþþþþþþþþúúúûûüþþñýýûüûùûøûáÈ­ÀÁ®ž‰¤¢™¿º°Ú¡¿½ØíÈØòóçöüöøûûôþþñý÷ûþÿþÿÿÿýùûÿÿûøûÿÿÿÿþýþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþþþþþþþþýþÿÿþÿÿþ÷úÿÿüøõõàáðúýøóþþÿþþþþûýúÿüþþúÿþüþýûþýøþþøÞéûüóÓÙûýøûýüý÷úøþû÷þýÿþýýýýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿþþýþÿþþþýüüüüüÔäéÒÂÝýþúýþýþÿþøüÿýùøûýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþþûýüúýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþþþþñûýòøýÚ½ØýòÔòýñýûýþüûþýøþþþÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþþþþþÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþÿþþýýýþýþþýýþþþþþþùúûûûûýþûÿýüþýûýøýüüõüûúãßÈм®Ç®˜¡Ã‘«’“¬–š¾Í¾ÑèÛÓåôûüùöüýýýüýôûõúûüýþÿÿýýþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþþþþþþþùüþÿþýþÿüýÿÿÿþüûèäíïå˾ÑûþýüþýûýþÿøüþüÿüüþþûþüûÿúúñùýüòÛÔøîËÈÍÜúýýþþþþûüþÿýûùúüþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþýþÿÿýýþÿÿþþþýþþþööõßÊÞýþÿøùÿÿø÷þÿüø÷úÿÿùþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþâèþüúþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøþþúýüûûßÒàÓÏóüýýýüüüýþþýþþþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿþþþþþþþþÿÿÿÿþÿþüüüýýþþýüýýÿÿþýüýþüùþþþýÿÿüÿøøõöýôóüúðüùâÔÓ­¸§¢¾¸™£®˜™­¨—­ÆÔÀÀãêûûöùüøüûýýú÷öøûþÿýûûþÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþþÿÿýþÿÿÿýûùÿýüýýýûùüö÷ðÙ·§»÷ûûûþþþþþÿûþþúþûýþýûüüüÿýþüüüúü÷øþàÁÉÑÜùýñòèðý÷þþþýüüüýþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþþÿýûûüýþÿÿÿÿÿÿûöþþôõüöùäåóàÁÐþÿýÿþüÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþò¹ÂõüöþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþõþûýýïøýîøãÊÖéóþüùþýùýöþÿýþÿÿÿþýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿþÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿüüüýýýþþþýûûýþþþïúüùþÿÿÿýþýýúýÿþýøüþüüüý÷ûüôóêÝáçÏÏͨœ©š–¦±œ¤Å¾ÊÝÌÖÖîúóóøüýüûüþþÿþýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþþþþÿýüýþüûúùùûþÿÿÿþüþüñß×êüýùôóíæçöúùþÿøüüþýýÿÿþüùþýûúúüÿÿÿÿõóþþøþùÐë׸ÙíöûùöøûÿþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüýþþþüúùþþþþÿÿýüÿöùÿýüÿýüøùøêÜèÿýýÿóáéúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÙÛûþùûûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿþûþòúûÙÚëÚòüõøþýïÿôøùþÿúÿþþÿÿüþþýþþþþþþþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿýýýýþþþþþýûûüýþþýÿÿþþýúþøûýüýýýúûÿÿöûÿüûýþþýúùþýøøû÷ÞÇËÛÁ¥²ª «ž” Ä½£©»Ñ°Èèøñòýýñ÷ûþþþýýþÿÿþýýþÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýüüýþþþþþþþþþýûýýÿüüûõþüüôëåÜÒÒôìâîûûþùþüþÿþþýøüúýþÿÿüüüúýþûùùùûÞùä­½×ÞüîááìùüüÿþýþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþýüÿþþþþþýüÿûûÿÿýüüöþþùúþþöûûûèÐÝùÿÿÿþýýþÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþþþùöÍ×éÒÚôô÷ÿÿùþÿüþÿþÿþüþþþÿÿÿúþþþþþþþþþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþþþþþþþþþÿÿÿþþþþýþýþþþþþþÿþÿÿþúýþþüþþýþþþþþþýþ÷ýþûùþýýúþþ÷ÿúþýýúüüúûùßôÖÉÔ«¹›ÈÙ‘¬¢Ç‡•Ìܺ¼çíÌÔãõýýýüþþþûùùûþÿþþþþþþþþüüüüüüüüÿþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýþûýÿÿþþþþýüýþÿÿÿÿþþÿùÿÿüþþýüøøóîïûàÄÕôþþôþûýþûýþýÿþÿþýýûþþùþþøýþýþöýøáàåâýçËÆÙïûûþüúûþÿýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýþþþþÿÿþþþþþþþûþÿýþþþÿÿýþÿÿýýÿûûÿôàëÿÿÿýûúúûýÿÿÿÿÿÿÿÿÿýýýýýýýýÿÿÿÿÿÿÿÿùùúüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþýýýýþþÿÿþþþþûûþýþûüÿþûþûïãÑ»Äáåæóöøùúüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþþþþþþüûúúúøøøä÷ó»ÏºÊ‰§¯¸¥–ºÉ¢šªÆÓäõøûùýöýþùÿöùþýñüýúþýýþøüüù÷ûýøüþýþüûøùþýþþùÿýÿþþþþûþþþþþþþþþþþþÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýüïµÀòûþýýõûýûýüþùüþþüüýþúýþýþþþûüýüûùùûþýøáÛðøöý÷øøýøèôþüúýþûûþûÿûûüöûÿüûÿÿÿþûøûÿÿÿÿÿÿþýÿÿÿÿÿþþþþþþþþþÿÿÿÿþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ýþø÷ûüúÿýúùùúýÿúÿþû÷÷úýóúýþÿýûÿÿÿÿÿÿÿþÿûÿþýÿüüÿþþþþþþþÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþþþýýýþþþþüûúüþÿþÿøüùýüûýøãÑÐÝÉä÷ùýøúûüüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüüûûûúùþúñüèã´ØÕ×ÎÂË¿“œ¡¦¹¶ÊÀÊÎêíÞÑÞúýôùþþþþüõøôøøÿúýþþýþýüþøþþýþùýüþÿÿÿþþüþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÝèþýøïÛöüèðùñýÿýýþþþþþþþþûûþþþþýýýýýýüþþôðþþ÷ý÷ýýûáÌàø÷ûþþþþüýòÿÿþÿüôÿüÿýøüþþÿüýýþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿûûÿÿýþýûúúûýþþãÄÂÜøþûõþþôóûþúÿÿÿÿÿÿþþýÿÿÿÿþûþþþþþþþþÿþÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿþþþýþûÿøúþÿýûüïÑÇ×øåûýúþøÿÿþþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýüüþþòüýùüýýùùûùðÝÂijʴǯ¾®¨ÁͳŸ°Õìßìôåìúøýþþûý÷ûýöù÷÷ýýýþüüÿùÿúýýÿÿþþüþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþûÿ÷üþûüóÂðõÏÛÜÆòÿýöôøüýüüûüþýúúûþýüþÿÿþûûÿÿýÿþ÷ûüýúõçÛçñÖäëòûýûÿûþûùÿÿýÿûÿÿùúÿÿöþþþþþþþþþÿþÿþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþûüÿÿüþþýüüýþþÿæËÇÝöþûëúþþþþþþÿÿÿÿÿÿþþüýýýþÿÿþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿþþþþþþýýþþÿÿþþüýùþýûëôïõûûòààòýøýúõýûÿÿÿýüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþùþúþøøûüüûûüüû÷øûûîøÝäÈÏƲº¢¡£¥½­»Å´¹ÏÎÜïöùñýþþþþöþÿùþöüþþýþþüþûÿÿÿÿþýþþþþþþþþþþþþþþþþþþþþþþþþþþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþøÿýýúúþüàùûàêÙ¼öûýþþþþþýýüþþþþýþýýýþþþÿýùþýûÿýùþýüôùþüüôÛëìíöðéóþ÷ýþöûþöûûýýüþþüÿþþþþþþþÿÿÿÿÿÿÿþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýûýÿÿûþþþþþþþþúýýøõ÷ûýÞðùøûýüýÿÿÿÿÿÿþþÿþþüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿþþþþýþüüüüûûûûúýøýööÂÈËçüýýùùýôüùþþûÿúþþüüüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþýýþþýîýþüùûùúýñøüýùýüýôåã·¯ßÛÅͼ±©œž´Æ¡ÄÔïÜõïðèìúûûûûûüüùüúþüÿüüùüýýùýÿþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþúþÿÿýþÿ÷þþþúþóÞþÿøñðõûþýÿþüüûûþþüýþþüüþÿýþûûþÿþÿ÷þýþþüÿúöÿþøþõëôÛÙíüøýýôýøûþûøýþýýþþþþþþþþÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿþþþÿÿÿÿþþûÿÿÿýüüûãý÷ÖÖñúîÿÿÿÿÿÿÿÿÿüÿÿûûÿýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþüýþþþþûúúýøüå笵Öòþûûþþüòþõþÿöÿøýýüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþùùóýøþÿþþþüÿÿýûûýþ÷øûúøþðþüöûóúöæÈ°¨­Åá’ž¤Ê«ÂÁÒ­§éãÓíæúúùüýýýþýÿþþýýûùýÿþÿÿÿÿþþþþþþþþýþþþþþÿÿÿÿÿÿÿÿþÿþþþþþþþþÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿýþþýÿÿøþ÷ùúýþøýþòàÝçîëäýþÿþÿÿýùûýþýûúýþþýýþþþþüùÿþÿüõüüúÿþüÿÿüþØØÄÉïûóúçÛêýý÷ùúÿþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿÿþþþÿÿÿÿÿÿþûøøüÿÿú÷þøÛÙíöòÿÿÿÿÿÿÿÿñéôÿüúýúÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýýýÿÿÿþþþþþþÿþþüþÿþüöïêÜóùóèëÆÙùþÿúûûûýþþ÷ûþ÷þüýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþüþýûóõûúúúûþþþ÷ÿúþøýýýýýùýþýþüþþþùñêéñûµ§¡³Ÿ±ÄÚ¼«àϤ·ÀÒß×ñïóîü÷òýþúþýùÿÿþÿÿÿþþþýýüüûûûûýýýýýýýþþþþþýþýýþþþþþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüúùüþýÿüþùüüýþøûöôúþúè×ûþýúýþþûüýþþýüüüýûþþýýþûþý÷þÿùþýÿþüûüýûûýûÏÃìõæóÊÁØøþþþøûûüþÿþýüþþþÿÿÿÿÿþþþýýþÿÿýýþþþýýþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýüýÿþþþþþþÿÿýÿÿþþÿÿüþþúúû÷÷ÿÿÿÿÿÿÿÿÿíÛæûûúþýþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùøùûüþÿÿüüüüüüüüûýþùðáÒȬÖýøýýíýÿýúÿÿýùþþþþþÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþþúýþþûýýýýûüþþÿúÿþþþûþýûüûþþúþýûþþûûýýûìæßÔßöù÷ääÖš•¼±³Â­½µêãÊïøð÷ûûüþþþÿþþþþûûûûúúúúüýýýýýýþýýýýýýýýþþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýþþÿþ÷ÿüÿûÿÿöÿûþþþþýüûûõòä×Þôþüýüüþþþûøüûþÿûýÿÿüýúÿÿ÷ýþÿýýÿþÿþýûýýûþþúþñßæõ÷ûûêæéïõøûþþûüüüýýýýþýûúúûýÿýýýýýýýýÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿþþþýýþÿÿþÿÿþþÿÿþüþþþÿÿýÿÿÿÿÿÿÿÿÿÿáäûûûþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþúûüüþÿûüýùýùýüýùüýéÅÃàóÃèúüþûõþþþþÿÿþþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþýýýþþþþøüù쵤ÒÔ¸¤¯ª¸¥Ì£´÷øÒÂßùüéýýüýõþûÿý÷ùûþùþþýùþþþýþþùþþþþûûýþüþÿÿýÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþúûõÚâìöèåéðøþþþþû÷ÿ÷÷ÿúÿþþþýþÿþþþþüýþÿÿþþþþþþþþþüûùûýúòêâÕÓÌ¿Ðïøñøûøóýûûüüõÿþ÷þøüøùýÿÿÿÿüùøûþÿþýþþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþöêì÷úþþþûùúúþÿÿöÿùùýÿùüþÿÿüÿÿþþÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýþýúúüýþúýýýüêùäãæàÕàóøâùþûÿþúþþþþÿÿÿþþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþÿÿÿÿÿÿÿþþþþþþÿýüüüýýýþþþÿÿÿÿÿþÿÿÿÿþþþÿþþùþîéüðçÓÆÊοÀšžÍá¹—½ÔÅÖÕÝüüûóøüýýúûù÷þÿýù÷úÿøþüûýýþõþÿÿÿüüûûÿþýþÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýüþóüûþõÑÔÛçïòõùýùþúúþøûûþþýýÿÿÿÿÿÿÿÿÿþýÿþÿÿÿÿþÿþüüþþÿûöüîëâÑÔáÞèïúøñýøýûþýýýùþüþýýþýúùûÿÿýüýýýýÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùúúðåæïÛèõúúûýþûýÿùþþþÿüýÿúøûüÿÿÿþÿÿýüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýþûýþþþüúýûùóÃÌáâæèëùýüúþÿøþþûýþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþþþþþþþþþþþþÿþýýýýýýýþþþÿÿþþþþýýýýþýýýúûôÿýúþúýüïùëæÛÂÇÇÖÓ¸›Žœº®©¢°áïÍÛáìøùùùûüýýýþþýûýÿþþþýþùüüýþýýþþþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýùþÿÿþýûçåéó÷ö÷ýýý÷ýþüþüýÿÿÿýþýûÿÿÿÿÿÿþýÿÿÿÿÿÿþÿüüýþþþýüþüýýóòòèæáèÝÐáÚñçýþóüþùþûûþÿÿþþþüüþþþþþüÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿýÿÿýöøÿÜé÷üûûþÿíïýüÿùýöÿÿþûýÿÿÿÿÿÿþÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýùøþþöôýýïÞæé»±ëõûùøýýþüþýùþþûúþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþýýýýýþþþÿÿþþþþþþýþþþþþþþ÷ÿüýùòûýïÿúÿôö÷ûõüùâÛÛÍÉÚÆ«¥±Öߨ‘Ÿ¶ÐÛãÔÏòéëöýýý÷ûüøþþøþþþþþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿúúþÿúùüþøøýýø÷ýýúç÷ýôþýùýþýÿÿÿÿýýýþÿÿÿÿÿÿÿÿþþþþýýþýüüüüöóùýýýý÷ùìðâÒßÕðÜöøÛîÿîþüýÿþüùøùøûüýþþÿþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþûüÿÿýþÿ÷ýÿÿüüýþÐÒðÿÿ÷þþüüøþÿûýýüÿÿýþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüýþþýúúýýÐÉáïãÖñýýýûýþþûýþþþþüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿþÿþýýýþþþþþþþþÿÿÿÿþþþÿþþþþþþþþþþþþþþþþþþþþþþüüýüüý÷ýöøøûüþþþûõûúòýûí×ÜßêñË—›Ÿ©²Ì¼µ·Á×áÜâôüüüúüüúûüûøùüþýüûÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿýýûþýþýùùþþùùþúóÚëòèüùþþüüþýûûÿÿþýýþÿÿÿÿÿÿÿÿÿÿþþþþýýýþùùýþýýýúþøþþõûëûïûòÉÛòßùÿÿþüþýýýýýþú÷úþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿûúýüùøúÿÿÿüüýþýßÚöþüæñûþøðþýðúÿûÿÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüúýýìßåìóñÃØóøûøöþþûþýûýýýþþþþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþýüýýýþþýùûúúýüøøþþýùýýûúú÷ùûÿüõÿýúôüûöûöÖͼ­¤Â­§š¨¿À±»ÙéØÞãôûûû÷ûûüüýþþýÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûÿýýùÿþýþüüÿÿþÿþýùâïóêüüþùøþþùøüþþþÿþýþþÿþÿþÿÿÿÿþÿþÿþþþÿÿÿÿÿýüþÿýùøþûþöûýýûÝçõáïù÷õ÷ûýüøóûýýþþþüþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþÿÿÿþÿüüûúýÿýùþøþþñÏÕäþåÍêþ÷þþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüñôîŬ·ÂðñÝõþýüýþþûûþþøþÿûüýûüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿþÿþþþþÿÿþþþúüþÿûúùüøüþýøüúüýþþüýþ÷üõûûþþøýþûüúòßíÊǽ¹¹­œ«ÂÂœš«ÙíßÚÙôûüöôùýúùûþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþ÷ýúÿøÿûüüþþüüþþüÿÿõüüöþþôìðþûíîúúýþþþþþþþþÿþÿÿÿÿýüüýþþÿÿùüúùûüüþþþóûøûüüþüþûýÿôõûøôóñçлÔäóùûýþúýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþüûüþÿÿÿÿüýýýþþþúþûýøößãñùÙ¹ÛüúþöÿúøÿÿþüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿþþþþþþþýúÝãç±ÅÐüýþþúÿüþýþüýþüùþþûýþþþþüÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿþÿþþþþþþÿÿÿÿþþÿþÿÿÿþÿÿÿþþþþüþþüþþþþýýýøýüýýûýýþýûþýþþùþÿüÿüþþþòýóüöçÙÁ®¾ÐÇ©œÛ㯕ž¶ÇÐÍÒåóöëð÷ûýýüýýýýýýýýýýýýýýýýýþþþþþþþþÿþþýüûúúþþþþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿûÿûÿüÿüþÿýüÿÿüýþþÿÿûÿþþùùþëÊÂÐòöüþÿþþþþþþþþþÿÿÿþþþÿÿþýÿþþþþþýþûþ÷þþýþùþ÷þþüÿÿÿþþþþûå¼™ÉÖàäèóûþúúûüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿþþÿþþþýýþþÿûþþüþûûþþòÛôþùþýùìéöþûøûýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþýþþþÿÿÿ÷ýÿþýýýÿü÷ûþúûÿþøüüûùïìøíÍ×òîñýûþþÿÿÿÿþþÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøýüôòøùñÒÖÔêÚ¨¢¡¸®§ŸÆáĽ¥ÍÚÛñùøûöþûøþþøÿþùþþûûýüøÿúúÿüûþþýþûýýýýþýýþþþþþþÿþþýýýýýýþÿþþþþÿÿþþÿÿþþþÿþÿþÿýþþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüùïÔÇÕõüÿüûÿÿþþúùüþþüöüþÿýÿÿÿýþÿÿþþþþþÿÿÿÿÿþþÿþþþþþÿÿþþÿþþûñàÓõüþöíìðóýÒ×òüþýþûþþøúþýöþýþþþúùüÿÿÿÿÿÿÿÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüøöøýÿÿýöÖÂöþõþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþÿþÿÿþþþþýþþþüüöþþýÿüùýøýôðîË®ºûäìýùúþýÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿúùÿþûýý÷ý÷ÛÜ×ÍÎνÈΰ±¥²©§ÎèؽÖõýøùýýüöýþ÷þû÷ñüþÿÿþþÿùûýùýþüýúþþþÿÿþÿÿÿÿþþþþþýýýþÿþþþþÿþþþÿÿþþþþþþþÿþÿþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüüÿÿùõÿûü÷ðñúÿÿþþþþúúþÿÿÿøûøüùÿÿÿþþþþþþÿÿþþÿÿþÿþþþÿÿÿÿÿþþþÿÿþû÷ýþþû÷øùùõÒÙñùýýþûôöýþúýþþþþþþþÿüþþþþþþþþýÿÿýýÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýþÿÿÿúãÌõþýýíüúøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿþþþûøüþûùûúþþøþþöýýùÓÃѾ´Øýöùýþüûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþüüÿþþûý÷ýýøýùûûûä×Ȭ²¹¶²¶¾»ªšÀÞãÇÂæúðñüüõýýüýýõÿÿöþþûüþùþþüþüþýýüüýýýþþÿÿÿþþþþþÿþþþþþÿþþþþþþþþþþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûûÿþúþÿüôíïùÿÿþùñïóøúúøúÿÿÿþûüÿÿþþþþþþÿÿþþÿÿþþÿþÿÿÿÿÿÿþÿÿÿÿþþþþþþüýþþýüåìøúýûüþææùõæïþýþþûýÿÿùþþþþþþþþÿÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþüüýÿþþïþùöòßìáÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþýýýþþþÿþýþýýýüþþùûùúüùùýñìÔÑääæüúüþþþýúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûûüýüýþûþùûýûý÷üûüüüüõüßÞèê×À°¤³ÉÇž—ÉݹÄÚæõöûøûýøþûòùúùýýüûûýýüýüüüüüýþþÿÿþþþþþÿÿþþýýýþÿþýýýþþþþýýþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿýÿÿû÷øþÿþüäÐÕë÷ìÛôôÿøþùÿýÿÿþþýþþÿþÿÿÿÿÿþþÿþÿÿÿÿÿÿþþþþýüûúþýûüþþþýþøþþüþúú÷ÓÐßÓÇÕäüþþþþÿüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþýüûüýôþýþúýþóúîàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþþþþþþþþþþþþþþûÿþüûýýûüöûöÕÇÚèïòøûþýûøûþþýþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüþÿüüþþþýþþüýûýúø÷ûúõûöúüúóøç½ÏÙΟ’ÀÐ¥§£¦ÕÉèèìùýýýýýøþþüþ÷öþúýÿþþþþþþþþþþþýþýþþþýýýýþÿþþýýýýþþþþþþþÿÿÿÿþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿýÿÿýüÿÿÿÿÿÿþÿêÚáöþòßíûþúïþþùÿþÿÿþÿþÿÿþÿþÿÿþÿÿÿÿÿÿÿÿÿýüüýÿþûøþýýþþýþÿüùÿþûÿüýÿîïôéêøùýýþþúíéîþþþþþþþþÿþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿÿÿþ÷þöþÿþÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþþþþþþþþþþþþþþþþþúüüûþþþöúëñߣ™ÇäýûþýõýþøûþþúüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþüüýøöùþþûýþüüÿÿþþþþýüþûúþþìõøïνÝìÕ±’ˆ¼­ÎÅ»ÌÙÖêüöôüùöýýýýüþþþþþþþþþþþþþþþþþýýýýýþþÿþþýýýþþÿþþþþþÿÿÿÿþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûÿþ÷÷ùôûþÿÿýüýÿÿýýþþþþûðþîòÊûù÷þÿÿÿþþÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþûûþÿþýýýþÿýúûÿùùÿûúþúþüúýüøþþûþüýûêÓÌÓüüüüüüüüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüýÿÿþýûþûÿúûóúõùüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýþýþýþþþþþþþþÿþþþûïéêÉÐãÚ·¼çýùûüúúþþýüûüûúùûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþýýýýüþþþþýüùüúýþþûùýúþùÿÿùóýþüýýýøýüôɶ¶ÛÑÒ´š±®žÃØËÖÑÍÐÒ÷ûçóøüüýýþþþþþþþþÿþþþýüýýþþþþþýþýþýýýþþþÿþþýýÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü÷ýÿüþÿÿýýýýýýýÿøþÿÿûùûþþþÞѪâ÷þþþþþýýþþýþþþþþýýþþþþþþþþÿÿýüüüýþýüýÿþûûþþýÿûýÿùþúüþýûýüùþýýùëÚÕÚüüüüüüüüþüýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüþþýýýýñýýþùü÷ÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþýýýýýþýýýýýýýýùøýûཷȯÐñùõöüüþþýüÿÿ÷ÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþþþÿÿþüüþþþþþýþþýþýþþüþþüþþþþúþúúÿÿýþþýøöúøëÜÍÖº˜¼Àª¼¥š•Þë½ÙÜ÷øùûüýþþüüüüüüüüúúûüýýþþþþþþüûúúþþþýüûúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿüýÿþÿüüÿÿÿÿþÿÿýýþþþþýúøãÓçýûþýüûûûüýüüþþþýûûýýýýýýýýùüÿÿþýþÿÿþþÿÿÿþÿÿýþúÿÿúÿÿÿþþþþüÿûþþþþþþþýýýýýýýýøööúûùúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿüþÿþþþþÿÿ÷ÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþÿÿÿøøúûÿÿþþõþý÷ýýüÚçøá³²êÓèúýûüýýÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþýþýþþþþþýûûüüúøøòâðæÑΡ‰šˆ¯Ö˜©©¯Ò½ÐûûöüûýüþþöüüþíýýþþýúýüÿþùúüýþýüþûþùüÿÿþÿÿÿþÿÿÿýþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþúýþûøúûýþþþôåÞãêýþüýþûûýúþÿûûûûÿÿÿþÿÿÿþýÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþÿãïùøëÝúÿÿÿÿþûúûüúúûþÿþýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüÿÿþþÿüýÿÿÿõøþüüõüüô÷ðÒ×óúðãÞóôþÿþúûýýÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿþþþþþþþþþþþþþþýýýýýýþþþýýýþýüüýüõüúóøß¹Á°ÃÕ™££«žšÁËÓÐöâÁ¾ëýýþûýüýûñýúüýüþþüúú÷þýúúúþþþþþþþþþýþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüþþüúüþþüýüòæàãèóúüýþüöþþýúÿÿÿüÿúûþÿÿÿþþÿÿÿÿþþþþþþþþÿÿÿÿþþÿÿÿÿþþþþþþþþþþþþþþþþþþÿõÿùùþòüôöúýþÿÿÿÿÿÿÿÿúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþþþþþüüþÿþûýþûýýôØË×ÕÉäýüúýüùÿþþùøýÿþþþÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþÿüýþþýýýþÿøûÿøúýùüüõðí½À¾Íš¤Èš§˜É«™¤ÌÕÔåîûûéýûýùýýüùúýþýýýþüþþúýøýþþþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿþþþþþþüýýûúýþýýþþýøöùüøùüöüöäøûÿÿÿÿûöúúüþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþþþÿÿþþþþþþþþúûÿ÷÷ÿüüíïóøüþþýýøøýþùùþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþýþÿÿþþøûþý÷òöùæÀ¿×Üé÷ýüùýýýøúúùûþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþþþþÿÿÿûþþþüûýþüõýý÷ýúû÷ñýüü÷üûôÏÞꮸž°›„z³ªµÊæϵíôûùðüüûúþþýýûþ÷ÿÿÿÿÿþþþþþþþþþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿþþþþþþþþýûûþþüûýþþýýþþþúþöüðÎáØôÿùùþþþþþÿûúüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþþÿÿÿþþþþþþþþü÷ýúúþøþõõ÷úüüùöùëçóÿÿûúþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþþú÷þüýý÷öËÌØÔÉÝóóýüûüùöûþúýþþýþýüÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿþþþþþþÿþÿÿÿÿÿÿþþþþþþþþÿþþþþþþþüþþþûùûþþ÷ýüûýûþþõþûûûùøýôüûèîáÙÕ®Œ°Ì¡–ÅΊÀÓÝøäÚßáçõûúüýýóýôüøûÿþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿþþþÿÿÿÿÿÿþüýÿÿþþþþþüûúúü÷ÿþÿöÌÓØôÿûúþþüþþþýýÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿþþþþþþþþþþÿúýÿÿýúÿÿÿÿÿÿÿû÷úîêõÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþüóüõëèæü¿ÆÝááòûûûýûþþúþüþþþþýüýþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþþþþþþþÿÿýÿÿÿûúûýþøþøùþùþþöþûûþûúýùüýýýýøúõßéðƽëá—‡µÄ®Ý⤤±Ñçóûööúüûý÷þþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿüþýûúýþýþþþÿþýýüþöýûÿýçç÷ûüþþ÷ìëñùþþÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþÿþþÿÿÿþþþþþþþþþþüÿÿûûþýúþþÿÿÿÿýüüûûýýüüþüüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþøúóöØÆÒÛõæïýýøüøþûÿûÿþûýùÿýýýýýþþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿþþÿÿþÿþþýüýÿþþþüþþûÿüùþûüÿúüþùúøýöüúõýøøþûûý÷÷ÑÚ­ÀΔ”ˆ³ÉÐÜÌÊðìôõóýüýþþþÿþÿüþÿÿÿþþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿúýþûùûýýùúûüûûüýÿûüù÷þþüýøôûþüô÷äñüüúüýüþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþþþþþþþþþþþùÿýùùýÿøüýþþþýþÿüÿÿþûûýýúúúúúúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþùúüþÿÿþþüüüüüüüüýüúùûüöíÇÓݹ¸åóýýýýúþþùÿþÿ÷þþøþþþýüýþþþþÿÿÿÿþÿþÿÿÿÿÿþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþþþþþþúüýýþþýþþÿÿþÿÿûþþùþþüþýýúýþþüüþüûüûõûåκ––‹–¹Äºº³¡Ñ«·¬¶Òôõöøúûüüúüþÿýûûüýýýýýýýýÿþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþÿÿÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþÿÿüýþþÿÿÿÿþüýþýþÿÿúþþ÷ÿÿÿûýþþþàïùõïóûÿýýýüüüüýýýýýýýýýþþþþþþþþÿÿÿÿþÿþþþþþþþþþþÿÿþþÿþÿÿÿÿÿÿþýÿÿüÿÿûþÿÿýþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýýýþþþÿÿÿþþþþþ÷þúýÿüþøþóþþûûöÿþøüôýüíÚ±ÒôëéýüüþÿÿÿÿÿÿÿÿÿÿþþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþÿÿÿþüúüýûóìÏÇÁÅÏÓÍÅ°’Ŭ¡žŸÔíÓåõùûþôþþúþûþÿüþÿøóþñþüþùþøúùýüýþþýþþüüüýþþþþþþþýþþþþÿÿþþþýýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿîÙéÿþë×óùüýðýþüûüüüüýýüûüþÿýüþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýþþþþÿÿÿþþþþþþþúþûûÿûýüþûüþþÿýôúìöùíäÙéþùöþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿÿû÷þüùûýýýûÐÇãÉŸ‘˜Ÿ½ž¶ÅÒÀâáÝòöóýõþ÷ùøûÿÿÿùþüþúÿÿÿÿÿþûýþþûýýþþþþÿþþþþþþþþÿÿÿÿþþþýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüúÿ÷èóÿúìßõûíãäýþýþÿÿþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþÿÿÿÿÿÿúüõþúþþþõþüúýüôàÑÌäÝîûõøùøþþþþùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüýþÿÿýûûúûüýüüúûûîק™Šº§Ã¤‘œ¨ž§ÀŠ¬ïìòóûøýøøþóûþýýþïýýúùýüùûþþþüûüüýýýþþþþþþþþþþþþÿÿÿþþþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøþÿ÷üÿúúñøôÉ¥µÞüýÿÿÿþýüüÿÿÿüûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþþþþþþþýùþöûùûüýüýôòõÖ¬°Üßôýúþþúúüÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýüýþÿþþþþþýþýüüúüüõôèúï÷榯¤±²ÊŽÏ½—”ÕÜõûöøüýøñýûõøþýþÿÿþüúýýúùúûüýýþþþþþþþýþþýýþþþþþÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿüýÿþýûø÷ЬÇçüþÿýüýþýùýÿÿûùüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýþþþþÿÿÿþþþþþþþÿüþøþýýýóóîÄÄçÖËÐôóþþøûûüûýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþýýýüüûüýýýüþýøüüýúùûõøüæöæøèÖ½‘ ‹˜œ®ÊÁÑùøû÷üüùúýøûøúþþø÷üýüüýýþþþÿÿÿÿÿÿÿþýýýýýþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿüûþÿûýøþðà÷þþÿÿûùüÿÿûüþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþÿÿÿÿþþþþþþøûÿüþýñïÕÊàÛ¥¨Ýâööþüþúúüûÿþþýûÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿýûúùÿýüýþþþüûøÿû÷þùýýûüýþüóûûîøÎÃЦ¨‹”´¥»–»ÁÂãÛùúüùö÷þþþþýþþÿþþþþþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿûúýþÿ÷þúöþ÷üÿýöôùýþüøôöüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýþÿþþïýõÕƸ½âéÏÚ÷üýþýûÿõÿÿýþüþþøÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüüýýüûúþýýýýýýüûûþüúùùüøýüüþòûùýýûéûýâîéÞ½µ¡’ ŽŒ ˜¬ŸÆ¿ÃèóùøöúýýÿþþþþþýýþþþþþþþþþþþþþÿÿþþþþýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿþÿþüüþüúþþþþúúÿýöôùýýýðäæóþÿúþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýýýýýýýýýùóÔüõÚËÛáùûûýûýýþûÿÿõÿûÿþùÿþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþÿþÿÿÿÿÿþþþÿþýýüÿþþúþþöþ÷ûÿûýýøþÿøýýüüñâس²˜¯§•Œ œ“ŸÃÚÔÎßòûüüüüûûúúýýýýýýýýûûúûûüüüýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýùþÿÿÿþüÿþýýþþýÿÿüùþþþÿìÚÜîþÿùýýýýýýýýÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿÿõþýøþþøûýù÷úýûúýüÏÉ´òûøøúýþþüûüþþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþþþþÿþþþþÿÿÿÿÿþþÿÿýýûúø÷öÛáÄ¡¢¦›•’­µœ‹›¶Ä½Þëëüüøýøöüÿþýýýýþûüøûþýþüþüýþüüÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿþþüüýýþþÿÿûûûýüúüÿýÿÿûùûþÿüþÿýýþþýþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüýþþùöüüûþþüýûú÷ÞÚöÛÅÛÔûþýþüþþÿþüýþþþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþÿÿÿÿÿÿþþþÿÿþþþþþÿÿþþþþÿþþÿÿÿÿþýýýþýýýýñýûìíãȸÄǸš‰Œ‘Ž˜£š­²ÅÍï÷üýóóýýøóúüþþþüøþýüûýýýüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿþþüüüüüýýýýùûÿùðñûøýÿÿüüýýÿýûþþþüüÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþûþþúýýðûîÒÎÔ¸¸êîãúõúø÷üþþþýýüüüþþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþþýýýýõÿüõþý÷÷ûóâÎÆļ²˜Ÿ¬•¥™¯±ÁÅÊáôûûýþýùûúûÿýþþüúøùüþÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿÿÿÿÿÿþþýýýýüüüüÿúüÿùéê÷êóüÿÿÿÿÿþþýýþÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿõüÿüúýþýýÖ¯¸ÒÎÓõýöýýúþýþþýýüýüûûþÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýüûúûúþû÷üýûþþýýýüûøôäÞ¼³­¬±¨–†˜´µÁæêëüýüüûúøúúþþþþþÿÿÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþÿÿÿÿÿÿþþþþþþþþþþÿýÿÿüïï÷çðùûûüÿÿúÿÿüûÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿûýýøüýàÙýñÍÂÛñ÷ûýþ÷üþüÿþúþþþþþþýýþÿÿÿÿÿÿÿÿþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþþþþþþþþþýþýüüûúúýþþþþúøûòöýþýûúüüýüõàñìÚÈ™xŒ£”žÏ¸±Ùëæðùôûûõýýüûñþþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿþþþýýþþÿÿÿÿÿÿÿÿþüúùõúüùööùûúðî÷þýûûýþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿþôûëÞݼµâêÞíýúûþúþýýþøùùøÿþþþþþþþÿÿÿÿÿþÿÿÿþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþþþþþþþþþþþþþþÿüüýþýýýýûùøøøúþþýüûûûúøùùõýúùúüóùÛÅÏË£‰•—‚§Ÿ·ËÒèôôûûðüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþüüüýþþÿÿüÿÿýÿÿÿüþÿþù÷ùüýòÎÈîþöñþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþüÿþüþÿþöÍâÙÆÊÌØ÷ùúþþû÷üýûþû÷üûÿÿüþþþýüýþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿþþþÿÿþþþþþþþþÿÿÿÿþÿþÿÿÿÿüýüýýýýýüüÿÿÿþü÷ÿÿþýþþþþþøÿÿÿøýûýúûüùÚ¸©¨™¥œ’‘…­ÅÎßÝÖóüúûýþÿÿþýþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþÿÿþþþýýýýþþþþýýþþþþþþýþþûüþþþðÌÉîüêçúÿÿûûþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýü÷üþûúöéÛ¨Æãöûø÷ýýþûûþþýþþþþùþÿýúýþþþþýþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿþþÿÿÿþþþþþþþÿÿþÿþþþþþÿþþþþýýüüûüþþþýúÿÿþûÿÿÿþþÿÿÿýþþÿüþþþüýþþýýùóîëÔƪ}‰„‰ž¥Ÿµ¶ãçîôùüüüýýýýýýýýýýýýýýýýÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþþþþþýþþþùúþþþÿþÿþþúûëëøôààòÿúõõùýûùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþþÿþþÿýýüüþüúþýñþþþûøýýüøÜñÙàÒîÏàõþþüûþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöýûúö×´°”˜©©”’›”› ›½Üëú÷ðûüûùûÿþýúúþýûÿúþ÷üýûûüüûþþþþþýýþþþþþþþýýýýýþþÿÿþþÿþþþþýÿþþÿþþþþþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúúüùòòøöþìÖæùûüþûûÿÿýþÿþþþþþþþþþþþþÿÿþýÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿþþþþþþþþþþþþüüþþþþøüýúüüúЫ×ÝÜÐóñ÷þÿþüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúþùûþûòûïíîßÄ·ª’•”ž‘”·±®Çåüüðóøþùþýþþøÿùþþþùúü÷þÿýþýúùûÿÿÿÿþþþþþþýþþþÿÿÿÿÿÿÿÿþÿþþþÿÿþþþþþÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿùúÿýþëÕâõûÿüúúþÿÿûöøúýþþþüøýþþÿþýüýÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿþÿþÿÿÿÿÿþþþþþÿÿÿþþþûûýýýÿþþýîÔÖßïÜÍèóöðþÿÿþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúùÿûøýõöûøóúóÙ̱Ÿ£’“£…œ°ËÏÉÞñöý÷ñþþóýøýûùýþýýüöõûþþþþþþþþÿÿÿþýýýþþþÿÿþþþþþþþþþþþÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿÿüýÿûÿöëôûûÿÞìúþÿÿÿýþþþþÿÿýûüþÿÿþþþÿÿÿÿÿÿÿÿþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþûúüúýýûýüþø渖±Ùêùýûýþþýýüüýÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþüõùþýýüúýüëû÷ëä̿į’“œœ—Ÿ¡ÈòÏÙúõý÷üþüúýùóûþþýþþýýûýýýþþþþýýüýýýþþÿþþýýýüýþþþþþþÿÿÿÿÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüúûýþüýÿøÿÿÿÿÿùûÜîüýûüõìûüþþýþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿýýþþýýþþù÷üûü÷äèò÷õëÇ­Íøýûúúþú÷úýþÿÿÿÿüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüýþþþþüøùûûÿÿÿíûþþûôøûÞÔ½³¨œž›™¹“©ÒÍÛÛéõøøþýùÿúþþúúÿþøÿÿÿþþþþþÿþÿþþþþþþþþþýýýýþÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüþþþþÿþÿüûüúúÿÿÿþúýûäÇàëùÿÿÿþÿÿýûüýþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþþþþþÿÿþþýûûõñÛ´¹ðõ÷þüíöýýüùüþüúÿýþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüüüûù÷úúýþýùúýûýøöÿÿôùüûøû÷ÜÓÑ·¥’™¬¦ÎÈ¿ÈéûüóõüýýüþþþþþþþþþþþþþþþþÿÿþþþþþþýýþþÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþýüÿþûúøøûÿÿÿýûÿÿïØäîúÿþûûýúúüþÿÿüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþþýýýÿýüþþþýúùæãßàË©¼ûûóøüúþüóþþþüþýþüûúûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøýþÿÿþúúýþýþûùùùýþûýûøþûúöþüóúüó×ÑÏƱš¨Ô§Œ ÃÑƲáêúûûøøýýþþþýýýýüüüüýýýýüþþþþÿþýþþþþþþþþþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüýþýûþýþþþþþúðøþýþÿÿþûüýûøõôõæïúþþþýýüýýþþÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüüüþþþýýûûûûø÷úýýøô׿¾ÅÚÚÌðùþþþþýþýþþûýûþûþÿþüüÿÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüûþþýüþþúýýýûþûÿÿüÿÿýüÿþþÿÿÿúüúúüôäâÔ䧔·Â©”Ž–¦ËíóèêøûûüûüüûüýüýýýýüüúûýÿþýûúýýýýýýýýþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿýþþþýûþþûÿÿÿüüÿþüþþþþûõíçÎÞòþþýýþûûüüýþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýûþÿýýÿùûÿüýüùþýöûüíáèÕÎÐÖäôüüûþÿÿþþþþÿÿÿÿÿÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿýüüýýýýþþþþÿÿÿÿÿûûüüüüûûùêíòåÕ·–”«Ç›œÜçéúñöýýúþüþþöýÿúøÿùôüþüüú÷ýþ÷úþûþþþþþÿþþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþþþúõòìðûþûûþýþýÿÿúøüüûþúúþýûýþÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúüýûûýÿÿýøþÿþþü÷ØÓèÒ³ÄÙçðñôùýþýüþþþþþþþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿþýüüýýýýýþþþþþÿþÿûûûûûûúúþ÷ûýûøï×»½»ª—ƒ‹ºÃ ¡«ÊäùûøýûúûýùûþþþþþûþûþúþþþþþôþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýüþüüüüûêÐûûùøüÿÿþúüõøþýúþÿüûýþüüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþþÿýþýûûûÿþõöýý«·ìÓ¸ÚçýüþþþþýýþþþþþþÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþþýþÿÿÿþþþþþþþþþþþþÿýýýýüüûúþöüþûþþøýýðÒÀ¯šŸ–¥œ™©ÃÇÅÖäõûûùüûú÷ýùùþûþøøùøüþþýýýþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿýûþÿéÆùýôðúûöøûþþþþúùþÿûùýÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùûüúúûûûôýüûÿõí줸öñçýöýùûÿþüûýÿþþþþþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþýýþþýýþþþþþþþþþÿþþþýýþþÿþþþýúÿþúúýùõôøúýùâÞ±ºÂ•Š©³Ž£¥ÂÀ¿Úûìûýúüÿÿþ÷üùûþÿÿþüýýüþþþþþÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿÿýüþýýÿúêûÿ÷òõåØáþýúñõýýüþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûøûýüúúð÷ÕÔúùçåÔÞúýûýý÷þþþþýüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿüûûûûüýýýþþþþþþÿüüüýýýýþþþþÿÿþþûýûýûúùôüûúóÀ¸ÐÈ–•«Ï£ «Ç˜ÊíÞÝó÷üüüüúøýþûõþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýÿûÿÿûûþÿýÿûúõÛÐæýîÜÆÕúý÷úþþýúýþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýüöëØÊÁÕ³¼ñúöýýýüþüöÿþÿþýýýýüüþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýüüüýýýþþþþþþþþÿýüüüüûúúþýûûüýüüüúýõõþþýù÷üúùöóíÚä㪲“œ™£Ç«¥¿Ïïúßõûøùýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿùûÿüùûýþþýÿûçèþùêܶ·äùý÷üþþþÿýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿþøøìÖÉö¤¤ËÍäüûýüþÿùþûôÿýûûüüüýþýþþþþþþþþÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþÿþÿþýþþþþþþþþÿÿÿþþÿþþþþýüûûÿÿýüÿÿþþù÷ýûýþúîÿ÷ùôþûöþüüøéòõ̹·‰€†‘º¿žËäçñýýþÿÿÿÿþþýýþþþþþþþþýþÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýýþÿÿÿþþþúûþýýýúÿýþÿþùûýúó÷ØÈåöýìêðýþÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþüüüüüüûûùôÕ¨ž·ÈÃáóòüýúý÷ÿþþÿþþÿþþÿÿÿÿþÿþþþþþþþþþÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþÿýüüüüüýýþþþÿÿÿþÿþþþþþþþþûþýüþþýþýùýýûýýþùýþòýýüþþÿýþýù÷ûùÙ¨¬¥¡»¢„–’·ãðìýýýýüûúúþþþþþþþþúûýÿÿýûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþþþþþþþþûþþþÿþÿÿþþþöþôþûõýûüÜÑÚöÿÿúÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþþþÿÿÿþþþþþþþþþþþýþÿýýþþûýýùýýøûûùþúýüüú÷ïÙÍì÷ÙÁ»Îúý÷úþþþüûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþþþþþþþÿÿÿÿÿþþþóýïü÷ìí±“‹„‰˜©´·ÔÛÙùý÷ùþüþþôþûêþüýýûþüýþýýýýýüüüþþþþþþþþþþþþþþþþþÿÿþþýýýþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüêñþþþþóûûûüþþþüÿþüûüþþþþþþþþþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿþþþýþþþþþÿÿó÷þþøöúúöýüúÿüõýöôüûÛµ¥½ðþùöóõÿùüþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿøþþùþÕÕǶª¤Ÿ—‘˜Á¿½ôýýíýüøúþûý÷ÿÿÿûþöþýüüýþþþþþÿÿÿÿÿÿþþþÿþþþþþÿÿþþýýýþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþõûþüûôÞââãéöþþûÿþþþþýýýþþýüüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿþþþþþÿÿÿûùýýýýýýðýýøýøúèÐÙÕɽ·ÙòþûþþûÿñüýýýüüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüûþúüþôýýýûîÓ°—›ˆ–ªÇì±ÁàÝùùù÷ýöþüúüýøýýýýþþüùýþþþþþþþþýþþþþÿÿÿþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþüúþþúûõàéæâåòýùìøúýÿÿÿýüþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿþþþþþþþþþþþÿÿþýþþýý÷÷úúüìýýðçÀµ°·ßáàêæýýþöøù÷ÿûüüüüüüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýöüü÷úþþýýø÷úýüûͶÌÀœ¡œÃŸ¥ÚÑÒúõýúü÷ýûøûüýýýþþþýýþýýýýþþýýýþþÿÿÿþþþýýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþýúþþûþþ÷þûôð÷þõäìð÷ýÿÿÿýûþÿÿÿÿþûþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿýýýþþþþý÷øýýýüüóûôÚ«¸»žÑ»ÔüýùþöþþþúýýûÿÿýþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿýþûþýýûýýûöòóûõõêßÔÞ½Œ‡º±•“¯‘º·ÑÛüïýþþÿüù÷ùûþþþþþýþýþþþþÿþÿþÿÿþþýýýýþÿþÿþÿÿÿþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿýüÿýýÿÿÿÿú÷üÿýòëïöüÿÿþüþÿýùùýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþýþþþÿþþýýüûôóðé³ÄÒ¼ËÖÊùý÷ùúþÿûú÷øûþýúùùýýþÿþþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúþÿþþúþûúûüýÿþýöýüøýýíøùÀ«Î¤˜‘}€¥”¤§ÐÄÖíóûýýýýûþÿþÿþÿÿþþþþþþÿÿþÿÿþþþþþþþþþþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿûûÿÿûúÿüýýüýÿþûöøüÿÿþûùûÿÿþþÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþÿÿÿÿÿÿýþþþüúüýõóöíιÂÓ¥¸òûñûøûýýüÿþøþþþýþüýÿýþýüüüþþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýúýÿüûüÿÿþþþýûúþúÿõùþìþøùëõçáÈ¥¤­š‘‡¨§¡¼ÂÎÝì÷úúûüüþþþþþþþþýýüýýþþþþþýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþûüûýÿÿüþÿÿÿÿÿûúüþÿÿÿÿþüûúþþùùþþúÿÿþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿüüüüüüüüùûüøñîïñ͵¸ÓÛÍÄÃÑáüüúýüûûýûÿþøýüÿþþüþþÿþÿÿýüþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿÿüÿÿýþþýýýþþþþøýûùüýúþúþþúûúøëãʱº¸ ”ŠŒ±ÀÇö÷ùûüýýþþþþýýüüûýýýýýüüýÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿúÿÿÿýþûüÿÿüýÿþþþþÿÿÿÿÿüïââïüÿÿýûúúûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúþþüýüùöýþýûýñûýøüüéÄ£¢µ Ìòüýýùúýþüüþþüþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþþýýýþÿÿÿþþýý÷üûûúðëÁ°µ˜”“›ÆÑÌÔãòõýþýþþõøýýûöý÷ûýûöùüþýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ÷îî÷þþÿýþþþÿÿùýüüüüûûûÿÿÿÿÿüþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþøúýùúýüýöñýôýýË¿éöáÁ œ·ÈÚòýúùýýûþÿýýÿÿüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿÿÿþþþþÿÿþþþþþþûþ÷ûúøýðûúÜÍÆ­¨£—ÄȦŽœÀÏÃâøìóüüøûýüøëýüýÿÿÿýþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿþùùþÿûÿüïæíúÿÿýýýüüüüüÿüüþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþìüüøüüùüúýðøÇÖÔ¤šÝ÷ìæ×Öñóýþùúþýüýþýüüýýûýþþþþþþþþÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿþþþÿÿÿþÿþþþÿÿþþý÷ýøûýúþþõþöøý÷ýüòåȯ—Ž›Ÿ™ÜöûúíüûúþÿþýóýýüüýÿþþüþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿûþüèÚèùþÿþþþþþýýýÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýøúýýïìôø¼Ä¼ËÎÓÆïüùûüúýûþøôþþùùüýýýûüûûýþþþÿÿþþÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿþÿÿÿÿÿÿþþþÿþþýýöýùýýøøúøýûþþûþýüûøëÀ¤ºÍ‹žÂÁÖìüöúõöûú÷ýúûûþþÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýÿÿþóÿòæöÿüýÿÿþþýýüüÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÄÍ仢¹ÃÜé·Èêðìýüüýüûüýöúþþÿþøõþýýýýýüûüþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿþþþþþýýýýýþþþþþýþøúþúúýúüùûýüüû÷ýüûñôùæ ¸…³™ Åª¸èõò÷ùþðýýüúúûþþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüþÿÿñÿþöÿÿûýþþýüúùøøþÿÿþüýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþóÊÑἧÃÙÜóöûýú÷ùþöûþùýþüþþýþÿúøþþüýþþüüýþÿþþþþýþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþþÿÿþþþþþþþþýýþþþÿþþþþûüþþûþþýýýþþÿÿüþýüüûü÷ùä½Ø±«› ŸÅÑ¿½Ìôüüüüüýýûùþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿþýùÿÿúþÿýÿýýûúù÷ööþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøçéýýöøþýþüöþþùþùüþùúþûÿú÷ûþþþúþýýþþþýþþþÿÿÿÿÿþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿþþþþþþþþþûþþýþü÷üøûüûþþýûúôþþñöþþñýýïúÄΩ¥Áªœ µØæååíöýþýþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿþþþþþþþþþþþþþþþÿþþýüüþþþþýüûúúùÿÿÿÿÿÿþ÷üýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþüþýüþþûþþøþõÿýþþüþþýþüþþþøýþýþýþþþþþþþþþþþþþÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþþþþþþþþþþþþûþý÷þþýýüýýüýþþýÿýýþýüýþÿþýþüûüâÆ沚¡¤Ä¸¯·Îè÷ýûüûüýýýýÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþþþþþþþþþþþÿÿüþÿþÿþþþÿþÿþÿþÿÿýûûþþôçöøûþÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþÿÿÿÿÿÿþþþþÿÿÿþþþþþýöùìßϬ Á°˜¤®ÄäÖÊÍßïõøúøùþòþüðÿûýûùþýùýüÿûûþþþþÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿûæÏÓéýÿþþþýþüûüþþÿÿüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüúþýýùêãøåÆÁ·µÄ«¨ž¢®¼Û÷ûýýøûýûùþÿÿÿýþøøþþþþþþýýþþÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýóæáïûýýþþüüýþÿþüûûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûúýýüýù÷ø÷üùçز¸¤œ—”ª¿ºÚÃèöðýýýôüôõþþøÿúýþüûûüüþþþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýûýþüòøûûýÿÿüýþÿÿþýýýþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúþüõüöýü÷ûûùûê÷àμ¬ºÇ¸¶›ÂÏÅÜëùüûüúüýùýþþúøýÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿýùûþþüþýüýÿÿýÿþûúýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿúþþùþþùûüþþýúíúöýü÷øñÙÐͳ£´´¹áÚÓòýñüýùýýýüþÿþúþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿýûûüýüþþýüýþýÿþùøûþøïùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüùüüùýüýþýüÿþþþýýþüûþþø÷úÖÍÚŶ»¶“°ÃÆðüòøüþþþûøùþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüþÿþþýüúüþþüûüýþþûúûúíßéöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýýþúûýþþûüÿüþöýþþþþúýýüûýýðãÇটœ¥ÙéÝåãëøýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿÿþþþüüýþþýýþüÿÿüüüóèçóþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿûüþûþúþþþÿÿüþüþþûþû÷ÿüýýúýýúûøÜäÛÓáÓÂõ¸Óíõöøýýýýýýýýüüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüýÿÿþþÿþþÿÿûÿÿýýÿÿÿöýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿþþþþþþþÿþþþÿþþþþþþþüûüýýü÷ó¿£»ØÐÜÞ±Óúýñýüôýòüùýÿúýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿûüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿþþþþþÿÿþþþÿÿÿÿÿÿþþüýþþýüûûõé÷ùëîÓ¬èüìîøûþþÿûÿÿþÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþÿÿÿÿÿþþþþþþÿÿÿÿÿþþþÿÿÿÿþþþÿþþþþüþÿþüûüüûûüûôüë¸ÕóüïÕÀºÂâéóÿýûÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþþýþþýüüýüüüýüûýýýüûüøäÍÇÌÒÞòþíëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþÿÿÿÿÿÿÿþþþÿÿþþþþþþÿþþþþþþþþþþþþýüýþÿýüûúùüûôôýüüþüùýýöö÷üúââüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþÿÿÿÿÿÿþþþþþÿÿþþþþþþÿþþþþþÿþþþþþýüýþþüúÿÿÿÿþÿýüþûþþþûû÷ÿÿüúïïþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿÿþþþÿÿþþþþþþþþÿÿÿþþþþÿÿÿÿþþþþþþýüþþûøüþûöüô÷þþúúþúûøþÿýÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþþÿÿÿÿÿþþþÿÿþþþþþþþÿÿþÿÿþþþþþþþýþþþýýþþýþþþþþþÿþþþúÿÿþýûÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýÿÿúøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüùûüÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüþÿýýýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿýø÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýôóýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿþ÷ôýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿú÷ÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ㹺èÿþúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿûÿþøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþþþþÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüüýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÕÝê÷þþÿüþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþËÐàõþýûýÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþáßêüÿûùÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿúûÿÿüüÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿþûûýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþøþÿûüÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/CompanionsCollection.jpg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/CompanionsCollection.jpg
new file mode 100644
index 0000000000..b4b87b40b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/CompanionsCollection.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.dia b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.dia
new file mode 100644
index 0000000000..38ac8e9942
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.dia
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.mp
new file mode 100644
index 0000000000..aea7284ffa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/Diagram1.mp
@@ -0,0 +1,78 @@
+% Metapost TeX macro
+% Title: /home/nobre-bu/mydirs/www/nobre/down/featpost/doc/metapostpropagandafiles/Diagram1.dia
+% Creator: Dia v0.97.1
+% CreationDate: Mon Jan 9 10:37:50 2012
+% For: nobre
+
+
+beginfig(1);
+verbatimtex
+%&latex
+\documentclass{minimal}
+\begin{document}
+etex
+% Define macro for horizontal centering.
+vardef hcentered primary P =
+ P shifted -(xpart center P, 0)
+enddef;
+% Define macro for right justification.
+vardef rjust primary P =
+ P shifted -(xpart (lrcorner P - llcorner P), 0)
+enddef;
+ % picture(1.950000,-12.600000)(13.850000,-1.350000)
+ x = 1.000000cm; y = -1.000000cm;
+
+ t = 1.000000;
+
+% set_line_color 0.000000, 0.000000, 0.000000
+% set_line_color 1.000000, 1.000000, 1.000000
+ path p;
+ p = (6.850000x,3.425000y)..(4.425000x,5.450000y)..(2.000000x,3.425000y)..(4.425000x,1.400000y)..cycle;
+ fill p withcolor (1.000000,1.000000,1.000000);
+% set_linewidth 0.100000
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw (6.850000x,3.425000y)..(4.425000x,5.450000y)..(2.000000x,3.425000y)..(4.425000x,1.400000y)..cycle
+ withpen pencircle scaled 0.1000x;
+% set_linewidth 0.100000
+% set_linewidth 0.100000
+ path p;
+ p = (8.300000x,8.758333y)..controls (9.400000x,8.189583y) and (9.950000x,8.000000y)
+ ..(11.050000x,8.000000y)..controls (12.150000x,8.000000y) and (12.700000x,8.189583y)
+ ..(13.800000x,8.758333y)--(13.800000x,11.791667y)..controls (12.700000x,12.360417y) and (12.150000x,12.550000y)
+ ..(11.050000x,12.550000y)..controls (9.950000x,12.550000y) and (9.400000x,12.360417y)
+ ..(8.300000x,11.791667y)--(8.300000x,8.758333y)
+ ..cycle;
+ fill p withcolor (1.000000,1.000000,1.000000);
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw (8.300000x,8.758333y)..controls (9.400000x,8.189583y) and (9.950000x,8.000000y)
+ ..(11.050000x,8.000000y)..controls (12.150000x,8.000000y) and (12.700000x,8.189583y)
+ ..(13.800000x,8.758333y)--(13.800000x,11.791667y)..controls (12.700000x,12.360417y) and (12.150000x,12.550000y)
+ ..(11.050000x,12.550000y)..controls (9.950000x,12.550000y) and (9.400000x,12.360417y)
+ ..(8.300000x,11.791667y)--(8.300000x,8.758333y)
+ withpen pencircle scaled 0.1000x;
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw (8.300000x,8.758333y)..controls (9.400000x,9.327083y) and (9.950000x,9.516667y)
+ ..(11.050000x,9.516667y)..controls (12.150000x,9.516667y) and (12.700000x,9.327083y)
+ ..(13.800000x,8.758333y)
+ withpen pencircle scaled 0.1000x;
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw hcentered btex {\usefont{OT1}{phv}{m}{n} } etex scaled 1.64t shifted (11.050000x,10.854167y);
+% set_linewidth 0.100000
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw (6.850000x,3.425000y)--(11.050000x,3.425000y)--(11.050000x,7.513197y)
+ withpen pencircle scaled 0.1000x;
+% set_line_color 0.000000, 0.000000, 0.000000
+% fill_polygon
+ path p;
+ p = (11.050000x,7.888197y)--(10.800000x,7.388197y)--(11.050000x,7.513197y)--(11.300000x,7.388197y)--cycle;
+ fill p
+ withpen pencircle scaled 0.1000x;
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw (11.050000x,7.888197y)--(10.800000x,7.388197y)--(11.050000x,7.513197y)--(11.300000x,7.388197y)--cycle
+ withpen pencircle scaled 0.1000x;
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw hcentered btex {\usefont{OT1}{phv}{m}{n} Hello} etex scaled 1.64t shifted (4.425000x,3.646250y);
+% set_line_color 0.000000, 0.000000, 0.000000
+ draw hcentered btex {\usefont{OT1}{phv}{m}{n} world!} etex scaled 1.64t shifted (11.050000x,10.496250y);
+endfig;
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/KnuthCollection.jpg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/KnuthCollection.jpg
new file mode 100644
index 0000000000..1ab9286e25
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/KnuthCollection.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/dia.png b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/dia.png
new file mode 100644
index 0000000000..7863bfd521
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/dia.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.1 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.1
new file mode 100644
index 0000000000..48502f20c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.1
@@ -0,0 +1,156 @@
+%!PS
+%%BoundingBox: -13 -13 141 128
+%%HiResBoundingBox: -12.75667 -12.75667 140.31549 127.80882
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2237
+%%Pages: 1
+%*Font: cmmi10 10.9091 9.96265 0b:8
+%*Font: cmss8 7.97011 7.97011 31:ff8
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+gsave newpath -12.75667 -12.75667 moveto
+140.31549 -12.75667 lineto
+140.31549 140.31549 lineto
+-12.75667 140.31549 lineto
+ closepath clip
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 127.55882 0 moveto
+127.55882 33.8322 114.11703 66.27469 90.19586 90.19586 curveto
+66.27469 114.11703 33.8322 127.55882 0 127.55882 curveto
+-33.8322 127.55882 -66.27469 114.11703 -90.19586 90.19586 curveto
+-114.11703 66.27469 -127.55882 33.8322 -127.55882 0 curveto
+-127.55882 -33.8322 -114.11703 -66.27469 -90.19586 -90.19586 curveto
+-66.27469 -114.11703 -33.8322 -127.55882 0 -127.55882 curveto
+33.8322 -127.55882 66.27469 -114.11703 90.19586 -90.19586 curveto
+114.11703 -66.27469 127.55882 -33.8322 127.55882 0 curveto closepath stroke
+ 1 setlinecap
+newpath 0 0 moveto
+126.60898 15.54584 lineto stroke
+newpath 123.12772 13.57617 moveto
+126.60898 15.54584 lineto
+122.75461 16.61478 lineto
+ closepath
+gsave fill grestore stroke
+128.70897 19.28223 moveto
+(\013) cmmi10 10.9091 fshow
+135.68758 17.64583 moveto
+(1) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 126.60898 15.54584 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+123.7692 30.86006 lineto stroke
+newpath 120.55394 28.48083 moveto
+123.7692 30.86006 lineto
+119.81331 31.4513 lineto
+ closepath
+gsave fill grestore stroke
+125.86919 34.59645 moveto
+(\013) cmmi10 10.9091 fshow
+132.8478 32.96005 moveto
+(2) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 123.7692 30.86006 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+119.08617 45.713 lineto stroke
+newpath 116.18483 42.95969 moveto
+119.08617 45.713 lineto
+115.08772 45.81775 lineto
+ closepath
+gsave fill grestore stroke
+121.18616 49.44939 moveto
+(\013) cmmi10 10.9091 fshow
+128.16476 47.81299 moveto
+(3) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 119.08617 45.713 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+112.62804 59.88467 lineto stroke
+newpath 110.08385 56.7983 moveto
+112.62804 59.88467 lineto
+108.64662 59.50136 lineto
+ closepath
+gsave fill grestore stroke
+114.72803 63.62106 moveto
+(\013) cmmi10 10.9091 fshow
+121.70663 61.98466 moveto
+(4) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 112.62804 59.88467 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+104.49017 73.16492 lineto stroke
+newpath 102.34108 69.79147 moveto
+104.49017 73.16492 lineto
+100.58513 72.29922 lineto
+ closepath
+gsave fill grestore stroke
+106.59016 76.9013 moveto
+(\013) cmmi10 10.9091 fshow
+113.56877 75.26491 moveto
+(5) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 104.49017 73.16492 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+94.79518 85.35323 lineto stroke
+newpath 93.07321 81.74303 moveto
+94.79518 85.35323 lineto
+91.02475 84.01811 lineto
+ closepath
+gsave fill grestore stroke
+96.89517 89.08961 moveto
+(\013) cmmi10 10.9091 fshow
+103.87378 87.45322 moveto
+(6) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 94.79518 85.35323 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+83.68518 96.27055 lineto stroke
+newpath 82.4161 92.47742 moveto
+83.68518 96.27055 lineto
+80.10562 94.48584 lineto
+ closepath
+gsave fill grestore stroke
+85.78517 100.00694 moveto
+(\013) cmmi10 10.9091 fshow
+92.76378 98.37054 moveto
+(7) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 83.68518 96.27055 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+71.32947 105.75143 lineto stroke
+newpath 70.53207 101.83188 moveto
+71.32947 105.75143 lineto
+67.99405 103.5438 lineto
+ closepath
+gsave fill grestore stroke
+73.42946 109.48782 moveto
+(\013) cmmi10 10.9091 fshow
+80.40807 107.85143 moveto
+(8) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 71.32947 105.75143 moveto 0 0 rlineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+57.91104 113.65573 lineto stroke
+newpath 57.59724 109.66823 moveto
+57.91104 113.65573 lineto
+54.86952 111.05809 lineto
+ closepath
+gsave fill grestore stroke
+60.01103 117.39212 moveto
+(\013) cmmi10 10.9091 fshow
+66.98964 115.75572 moveto
+(9) cmss8 7.97011 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop
+newpath 57.91104 113.65573 moveto 0 0 rlineto stroke
+grestore
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.mp
new file mode 100644
index 0000000000..7f1bb1087f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/fekslatexmp.mp
@@ -0,0 +1,21 @@
+% fekslatexmp.mp
+verbatimtex \documentclass{beamer}\begin{document} etex
+input latexmp;
+setupLaTeXMP(
+ class="beamer",
+ mode=rerun,
+ packages="calc,ifthen,mflogo" );
+beginfig(1);
+ numeric u, angstep, i, m;
+ u = 45mm;
+ m = 0.1u;
+ angstep = 7;
+ draw fullcircle scaled 2u;
+ for i=angstep step angstep until 9angstep:
+ drawarrow origin--(u*dir(i));
+ dotlabel.urt( textext("$\alpha_{" & decimal(i/angstep) & "}$" ), u*dir(i) );
+ endfor;
+ clip currentpicture to (-m,-m)--(u+m,-m)--(u+m,u+m)--(-m,u+m)--cycle;
+endfig;
+verbatimtex \end{document} etex
+end
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.1 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.1
new file mode 100644
index 0000000000..99cb002666
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.1
@@ -0,0 +1,44 @@
+%!PS
+%%BoundingBox: -13 -4 183 94
+%%HiResBoundingBox: -12.3123 -3.26555 182.39073 93.97404
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2237
+%%Pages: 1
+%*Font: cmss10 9.96265 9.96265 31:f800000000000aa60e4
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0 setrgbcolor 0 2.26768 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 90.7085 moveto
+170.07843 0 lineto stroke
+newpath 136.06274 5.66928 moveto
+147.4013 68.03137 lineto stroke
+ 0 0 1 setrgbcolor 0 4.53535 dtransform truncate idtransform setlinewidth pop
+newpath 0 90.7085 moveto 0 0 rlineto stroke
+newpath 170.07843 0 moveto 0 0 rlineto stroke
+newpath 136.06274 5.66928 moveto 0 0 rlineto stroke
+newpath 147.4013 68.03137 moveto 0 0 rlineto stroke
+newpath 17.00784 28.3464 moveto 0 0 rlineto stroke
+ 1 0 0 setrgbcolor
+newpath 138.13043 17.03795 moveto 0 0 rlineto stroke
+newpath 17.00784 17.00784 moveto 0 0 rlineto stroke
+ 0 0 0 setrgbcolor
+20.00784 25.93085 moveto
+(given) cmss10 9.96265 fshow
+20.00784 13.54858 moveto
+(unkno) cmss10 9.96265 fshow
+45.02515 13.54858 moveto
+(wn) cmss10 9.96265 fshow
+-12.3123 87.44295 moveto
+(z1) cmss10 9.96265 fshow
+173.07843 -3.26555 moveto
+(z2) cmss10 9.96265 fshow
+123.75044 2.40373 moveto
+(z3) cmss10 9.96265 fshow
+150.4013 64.76582 moveto
+(z4) cmss10 9.96265 fshow
+140.23042 19.13794 moveto
+(z5) cmss10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.mp
new file mode 100644
index 0000000000..dcdb3fd1b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/intersection2D.mp
@@ -0,0 +1,52 @@
+% intersection2D.mp
+% L. Nobre G.
+% 2004
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ numeric u;
+ pair Aa, Ab, Ba, Bb, Un, Kn, Or;
+ pen dotpen, penpen;
+ color knowncolour, notknowncol;
+ picture kn, un;
+ u = 4mm;
+ Aa = (0,8u);
+ Ab = (15u,0);
+ Ba = (12u,0.5u);
+ Bb = (13u,6u);
+ Kn = (0,1u);
+ Or = (1.5u,1.5u);
+ dotpen = pencircle scaled 0.4u;
+ penpen = pencircle scaled 0.2u;
+ knowncolour = blue;
+ notknowncol = red;
+ kn = btex given etex;
+ un = btex unknown etex;
+ drawoptions( withpen penpen );
+ draw Aa--Ab;
+ draw Ba--Bb;
+ drawoptions( withpen dotpen withcolor knowncolour );
+ draw Aa;
+ draw Ab;
+ draw Ba;
+ draw Bb;
+ draw Kn+Or;
+ drawoptions( withpen dotpen withcolor notknowncol );
+ Un = whatever[Aa,Ab];
+ Un = whatever[Ba,Bb];
+ draw Un;
+ draw Or;
+ drawoptions();
+ label.rt( kn, Kn+Or );
+ label.rt( un, Or );
+ label.lft( btex z1 etex, Aa );
+ label.rt( btex z2 etex, Ab );
+ label.lft( btex z3 etex, Ba );
+ label.rt( btex z4 etex, Bb );
+ label.urt( btex z5 etex, Un );
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/metapostpropaganda.png b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/metapostpropaganda.png
new file mode 100644
index 0000000000..90bf0448c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/metapostpropaganda.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.mps b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.mps
new file mode 100644
index 0000000000..f5a82ab2f0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.mps
@@ -0,0 +1,303 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -25 -25 127 25
+%%HiResBoundingBox: -24.17711 -24.17712 126.22417 24.17712
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.01.16:1341
+%%Pages: 1
+%%DocumentResources: procset mpost-minimal
+%%+ font SVPPQZ-CMSS10
+%%DocumentSuppliedResources: procset mpost-minimal
+%%+ font SVPPQZ-CMSS10
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset mpost-minimal
+/bd{bind def}bind def/fshow {exch findfont exch scalefont setfont show}bd
+/fcp{findfont dup length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall}bd
+/fmc{FontMatrix dup length array copy dup dup}bd/fmd{/FontMatrix exch def}bd
+/Amul{4 -1 roll exch mul 1000 div}bd/ExtendFont{fmc 0 get Amul 0 exch put fmd}bd
+/ScaleFont{dup fmc 0 get Amul 0 exch put dup dup 3 get Amul 3 exch put fmd}bd
+/SlantFont{fmc 2 get dup 0 eq{pop 1}if Amul FontMatrix 0 get mul 2 exch put fmd}bd
+%%EndResource
+%%BeginResource: font SVPPQZ-CMSS10
+%!PS-AdobeFont-1.0: CMSS10 003.002
+%%Title: CMSS10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSS10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/SVPPQZ-CMSS10 known{/SVPPQZ-CMSS10 findfont dup/UniqueID known{dup
+/UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /SVPPQZ-CMSS10 def
+/FontBBox {-61 -250 999 759 }readonly def
+/UniqueID 5000803 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSS10.) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 97 /a put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48
+63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3
+274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F
+388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B
+E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D
+AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4
+154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B
+4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200
+29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5
+CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5
+C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16
+131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682
+302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575
+F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378
+AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49
+28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18
+121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A
+A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D
+8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7
+69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7
+BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960
+C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92
+B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8
+8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01
+161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565
+F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E
+A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14
+0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674
+D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169
+B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434
+DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5
+261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA
+B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2
+64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038
+F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29
+AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3
+CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF
+5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091
+73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5
+A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D
+EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F
+1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6
+D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C
+13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7
+C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8
+08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220
+B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3
+23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA
+56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788
+2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB
+DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE
+3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D
+5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D
+9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5
+2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7
+F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB
+73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5
+B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007
+11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7
+03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE
+F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7
+5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1
+60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7
+622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F
+BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5
+C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16
+8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474
+1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647
+F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F
+D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE
+257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA
+7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315
+611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4
+246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97
+E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698
+AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1
+EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68
+0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A
+94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120
+73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680
+AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443
+8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070
+5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE
+6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28
+B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378
+129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B
+AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB
+8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C
+B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6
+753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD
+A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4
+93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE
+207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433
+3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26
+7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80
+D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825
+09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C
+5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105
+B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29
+E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26
+C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90
+F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9
+7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989
+99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A
+96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982
+1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B
+48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F
+4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A
+45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3
+D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81
+838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794
+5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA
+ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200
+DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF
+E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240
+5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5
+46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D
+491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A
+DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318
+F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B
+0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287
+EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298
+E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0
+0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD
+ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D
+8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C
+8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741
+A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447
+4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1
+AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C
+2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780
+14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A
+647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E
+6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6
+4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36
+D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD
+60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627
+4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289
+BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0
+1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194
+6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE
+65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF
+D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7
+6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9
+85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC
+7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853
+BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4
+9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440
+6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3
+2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A
+374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336
+39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6
+AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F
+1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8
+E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6
+AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD
+B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684
+CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF
+9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3
+DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441
+670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD
+99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B
+8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900
+E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A
+F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1
+DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2
+99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E
+DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF
+51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A
+40E84014F5BF40948F05E8562C99266B9E54AECEF94765BC79375C69A0385023
+A014B8705931C9A419C8F2B72C3F7054CD6487E75ED2E852BC19302D02C671FE
+3892C7AF2A90D6F29771AF31FA95258B6F3434228B377F5FB494E28B5F0393C8
+9DEA5E5726B81B7983D241BF7F78928EF8D8528C8F6DB7B307D720243DF00E84
+A37A7B2C720348F83ACEFFA78929F4CFB5CCCCB2A074C78B92C8573750B91386
+CECD4A1243D1B002B45B933534C0B4C51DDC50BE37BB6E42B8FFD25C8D5208E1
+E3019BFD5218EBE79578A072462F4B739AC8595498140CB8C6350C36E0E9313F
+4B6ADE13C28AB4BF001752E07976551121ABDF734B64061944C363CA1385BD23
+CD9BD8F1ED9F0A5C602752A62D0453AC97D649FEE6D0ED3BE5D5861FFD52EEAC
+673FD6B94354DAAA29F26C04F9CA7779F5021CE8A2CDD3F5477B7C100C82E82F
+AEC0BBEA7AEF0E819F0A3EDA5BBEBF135FBDDE4099314E3452D1C30067032966
+7BDB2B79A6C97B54B8BFE82A1E6D7F3FEEB6FAB486FE7BC2E431EE3F6186F857
+B2FB2F403BE8A511748EEA4132F47399C1241AA3613DD291F5D1D22615E65621
+AF6C3FF776ED79AF78CAE6974F6787EB52C2B8DFEE6C778AC597E3051F43CBC7
+E4B114E6BE5AE5429E759AD684FC0E0F334C1754F949E9E1698BE77227CD0E74
+95CE057D0364D9A4A02AA79B597541E1AD11C082CBEC8EF54DCEFFE333BEF65E
+D35C6D8E316EB5C27C8BCA1D90DA3C909E4BDC31C0EE2ED57A7C58F19BF9D958
+CE94B15796A594C15A7BA74AF3EC84762575B4367A6C4213D2FCF68985C7DF85
+2017A0A7EA98ED75D5541256E01ACBB8C2DF9A9EA7FE7A466D3AD4D2B93111E0
+48221BED637ABD757BBB80F95199E6E6BC476A63FA906935B33D6DBC5202A8D6
+20FFDE29D0AF2B26F99A0ABCF32042B16DC564EA67C7C5917A06BAC17ECEE22C
+A06E11D86515364471BC767A2DCE7FB2702C0CBE5EDF6BD0A5634DA5AC18C378
+27FC764C983B5D5D2D802752687ECCA35E50D82FC7F880BACEBDBC0C99138A50
+32C6EDB97CA6BA56CC22D02F44F7DF95FEA3425755BBCA75794AE11714B42BD0
+6557B6C0675D4B46B73B949922D2A7CEE66EF70D79B6D621FB0FB1F10633E0F8
+10C0F608004C0FB0E415D927C3352E3B5C10DDD006C14AE3279F2FB47CE293C1
+DE0B60F72D6F391B184573E2940663D7D88B4AA2BC90DAA7E4B0619045E8B486
+75845513DBA1C5F18220AAB86557F2FDFDBA1B1B8308E8153D4BE5A67C7322E6
+16C15666C35D386F117A682274D1F87F81FBEC469F83E27232B642E61CDEE2E0
+4A58CD82608BDD480934885232F0B7EF2807D46131B927EC2CDCA4D35B870DDF
+F2F0AF8FD122A339851BFAE6876B9B62A5A64BC7BC59AD83B59204E0807B7EBC
+A3447DC583B031A43DF12501AC04CEF69B1E44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+ /cmss10 /SVPPQZ-CMSS10 def
+%%EndSetup
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath 0 -22.67712 moveto
+0.0083 -22.67712 102.03876 -22.67712 102.04706 -22.67712 curveto
+132.28322 -22.67712 132.28322 22.67712 102.04706 22.67712 curveto
+102.03876 22.67712 0.0083 22.67712 0 22.67712 curveto
+-30.23616 22.67712 -30.23616 -22.67712 0 -22.67712 curveto closepath fill
+ 0 0 0 setrgbcolor 0 3 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 0 -22.67712 moveto
+0.0083 -22.67712 102.03876 -22.67712 102.04706 -22.67712 curveto
+132.28322 -22.67712 132.28322 22.67712 102.04706 22.67712 curveto
+102.03876 22.67712 0.0083 22.67712 0 22.67712 curveto
+-30.23616 22.67712 -30.23616 -22.67712 0 -22.67712 curveto closepath stroke
+gsave [0.99254 0.12187 -0.12187 0.99254 16.1847 -11.91039 ] concat 0 0 moveto
+(minimal) cmss10 21.81837 fshow grestore
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.pdf b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.pdf
new file mode 100644
index 0000000000..194af3bfd2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpeg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpeg
new file mode 100644
index 0000000000..9ab5e1d8e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpeg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpg
new file mode 100644
index 0000000000..fe63ec9f87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.mp
new file mode 100644
index 0000000000..8edfa3c79b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.mp
@@ -0,0 +1,24 @@
+% minimal.mp
+verbatimtex \documentclass{beamer}\begin{document} etex
+prologues := 3;
+outputformat := "eps";
+outputtemplate := "%j-%c.mps";
+beginfig(1);
+ numeric u, h, v;
+ picture title;
+ path arm;
+ u = 4mm;
+ h = 9u;
+ v = 2u;
+ z1 = (0,-v);
+ z2 = (h,-v);
+ z3 = (h,v);
+ z4 = (0,v);
+ arm = z1---z2..z3---z4..cycle;
+ title = thelabel( btex minimal etex scaled 2, origin );
+ unfill arm;
+ draw arm withpen pencircle scaled 3bp;
+ draw title rotated 7 shifted (0.5h,0);
+endfig;
+verbatimtex \end{document} etex
+end
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.png b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.png
new file mode 100644
index 0000000000..d53821c72d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/minimal.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpaf.jpeg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpaf.jpeg
new file mode 100644
index 0000000000..6705fb7baa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpaf.jpeg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafphoto.jpg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafphoto.jpg
new file mode 100644
index 0000000000..696cee4f0e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafphoto.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.0 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.0
new file mode 100644
index 0000000000..48ce15a611
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.0
@@ -0,0 +1,118 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -178 -24 178 224
+%%HiResBoundingBox: -177.43982 -23.39926 177.43982 223.05972
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+79.36993 199.66017 lineto
+-79.36993 199.66017 lineto
+ closepath fill
+newpath -21.51196 -8.55144 moveto
+-13.77463 -28.01521 13.77463 -28.0152 21.51196 -8.55144 curveto
+21.51842 -8.53519 100.87544 191.09248 100.8819 191.10873 curveto
+106.92403 206.3081 95.7262 222.80972 79.36993 222.80972 curveto
+79.35701 222.80972 -79.35701 222.80972 -79.36993 222.80972 curveto
+-95.7262 222.80972 -106.92403 206.3081 -100.8819 191.10873 curveto
+-100.87544 191.09248 -21.51842 -8.53519 -21.51196 -8.55144 curveto closepath fill
+ 0 0 1 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 0 62.66797 moveto
+45.25551 176.51064 lineto
+-45.25551 176.51064 lineto
+ closepath stroke
+newpath -21.51196 -8.55144 moveto
+-13.77463 -28.01521 13.77463 -28.0152 21.51196 -8.55144 curveto
+21.51842 -8.53519 100.87544 191.09248 100.8819 191.10873 curveto
+106.92403 206.3081 95.7262 222.80972 79.36993 222.80972 curveto
+79.35701 222.80972 -79.35701 222.80972 -79.36993 222.80972 curveto
+-95.7262 222.80972 -106.92403 206.3081 -100.8819 191.10873 curveto
+-100.87544 191.09248 -21.51842 -8.53519 -21.51196 -8.55144 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -142.44598 31.60103 moveto
+-153.22456 9.87585 -185.81233 26.04373 -175.03375 47.7689 curveto
+-175.0273 47.78192 -95.67058 207.73228 -95.66412 207.7453 curveto
+-84.88554 229.47047 -52.29778 213.3026 -63.07635 191.57742 curveto
+-63.08281 191.5644 -142.43953 31.61404 -142.44598 31.60103 curveto closepath fill
+ 0 0 1 setrgbcolor
+newpath -142.44598 31.60103 moveto
+-153.22456 9.87585 -185.81233 26.04373 -175.03375 47.7689 curveto
+-175.0273 47.78192 -95.67058 207.73228 -95.66412 207.7453 curveto
+-84.88554 229.47047 -52.29778 213.3026 -63.07635 191.57742 curveto
+-63.08281 191.5644 -142.43953 31.61404 -142.44598 31.60103 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 175.03375 47.7689 moveto
+185.81233 26.04373 153.22456 9.87585 142.44598 31.60103 curveto
+142.43953 31.61404 63.08281 191.5644 63.07635 191.57742 curveto
+52.29778 213.3026 84.88554 229.47047 95.66412 207.7453 curveto
+95.67058 207.73228 175.0273 47.78192 175.03375 47.7689 curveto closepath fill
+ 0 0 1 setrgbcolor
+newpath 175.03375 47.7689 moveto
+185.81233 26.04373 153.22456 9.87585 142.44598 31.60103 curveto
+142.43953 31.61404 63.08281 191.5644 63.07635 191.57742 curveto
+52.29778 213.3026 84.88554 229.47047 95.66412 207.7453 curveto
+95.67058 207.73228 175.0273 47.78192 175.03375 47.7689 curveto closepath stroke
+newpath 8.2677 0 moveto
+8.2677 2.19283 7.39647 4.29558 5.84602 5.84602 curveto
+4.29558 7.39647 2.19283 8.2677 0 8.2677 curveto
+-2.19283 8.2677 -4.29558 7.39647 -5.84602 5.84602 curveto
+-7.39647 4.29558 -8.2677 2.19283 -8.2677 0 curveto
+-8.2677 -2.19283 -7.39647 -4.29558 -5.84602 -5.84602 curveto
+-4.29558 -7.39647 -2.19283 -8.2677 0 -8.2677 curveto
+2.19283 -8.2677 4.29558 -7.39647 5.84602 -5.84602 curveto
+7.39647 -4.29558 8.2677 -2.19283 8.2677 0 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 87.63763 199.66017 moveto
+87.63763 201.853 86.7664 203.95575 85.21596 205.5062 curveto
+83.66551 207.05664 81.56276 207.92787 79.36993 207.92787 curveto
+77.17711 207.92787 75.07436 207.05664 73.52391 205.5062 curveto
+71.97346 203.95575 71.10223 201.853 71.10223 199.66017 curveto
+71.10223 197.46735 71.97346 195.3646 73.52391 193.81415 curveto
+75.07436 192.2637 77.17711 191.39247 79.36993 191.39247 curveto
+81.56276 191.39247 83.66551 192.2637 85.21596 193.81415 curveto
+86.7664 195.3646 87.63763 197.46735 87.63763 199.66017 curveto closepath stroke
+newpath -71.10223 199.66017 moveto
+-71.10223 201.853 -71.97346 203.95575 -73.52391 205.5062 curveto
+-75.07436 207.05664 -77.17711 207.92787 -79.36993 207.92787 curveto
+-81.56276 207.92787 -83.66551 207.05664 -85.21596 205.5062 curveto
+-86.7664 203.95575 -87.63763 201.853 -87.63763 199.66017 curveto
+-87.63763 197.46735 -86.7664 195.3646 -85.21596 193.81415 curveto
+-83.66551 192.2637 -81.56276 191.39247 -79.36993 191.39247 curveto
+-77.17711 191.39247 -75.07436 192.2637 -73.52391 193.81415 curveto
+-71.97346 195.3646 -71.10223 197.46735 -71.10223 199.66017 curveto closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.1 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.1
new file mode 100644
index 0000000000..be613ac35f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.1
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 226
+%%HiResBoundingBox: -235.21309 -23.42876 235.21309 225.81516
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+85.18884 202.41513 lineto
+-73.44347 196.57944 lineto
+ closepath fill
+newpath -7.9713 -9.36528 moveto
+0.4763 -28.53157 28.00706 -27.51889 35.02373 -7.7838 curveto
+35.02959 -7.7673 106.99533 194.64337 107.00119 194.65984 curveto
+112.48056 210.0711 100.68367 226.15002 84.3384 225.5488 curveto
+84.32547 225.54832 -74.28198 219.71425 -74.2949 219.71378 curveto
+-90.64018 219.11255 -101.2239 202.21039 -94.62714 187.24333 curveto
+-94.62009 187.22733 -7.97835 -9.34927 -7.9713 -9.36528 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 10.90831 62.59706 moveto
+51.94876 178.02682 lineto
+-38.5015 174.69977 lineto
+ closepath stroke
+newpath -7.9713 -9.36528 moveto
+0.4763 -28.53157 28.00706 -27.51889 35.02373 -7.7838 curveto
+35.02959 -7.7673 106.99533 194.64337 107.00119 194.65984 curveto
+112.48056 210.0711 100.68367 226.15002 84.3384 225.5488 curveto
+84.32547 225.54832 -74.28198 219.71425 -74.2949 219.71378 curveto
+-90.64018 219.11255 -101.2239 202.21039 -94.62714 187.24333 curveto
+-94.62009 187.22733 -7.97835 -9.34927 -7.9713 -9.36528 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -142.75989 30.99738 moveto
+-154.34334 9.69073 -186.3033 27.06592 -174.71985 48.37256 curveto
+-174.7129 48.38531 -89.43039 205.25427 -89.42345 205.26703 curveto
+-77.84 226.57367 -45.88004 209.19849 -57.46349 187.89185 curveto
+-57.47043 187.87909 -142.75294 31.01013 -142.75989 30.99738 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -142.75989 30.99738 moveto
+-154.34334 9.69073 -186.3033 27.06592 -174.71985 48.37256 curveto
+-174.7129 48.38531 -89.43039 205.25427 -89.42345 205.26703 curveto
+-77.84 226.57367 -45.88004 209.19849 -57.46349 187.89185 curveto
+-57.47043 187.87909 -142.75294 31.01013 -142.75989 30.99738 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 175.31435 47.17636 moveto
+185.30286 25.07706 152.1539 10.09427 142.16539 32.19357 curveto
+142.15941 32.20682 68.6195 194.91165 68.61353 194.92488 curveto
+58.62502 217.02419 91.77397 232.00697 101.76248 209.90767 curveto
+101.76846 209.89444 175.30836 47.1896 175.31435 47.17636 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 175.31435 47.17636 moveto
+185.30286 25.07706 152.1539 10.09427 142.16539 32.19357 curveto
+142.15941 32.20682 68.6195 194.91165 68.61353 194.92488 curveto
+58.62502 217.02419 91.77397 232.00697 101.76248 209.90767 curveto
+101.76846 209.89444 175.30836 47.1896 175.31435 47.17636 curveto closepath stroke
+newpath 21.47958 -0.02884 moveto
+21.47958 2.16399 20.60835 4.26674 19.0579 5.81718 curveto
+17.50746 7.36763 15.40471 8.23886 13.21188 8.23886 curveto
+11.01906 8.23886 8.9163 7.36763 7.36586 5.81718 curveto
+5.81541 4.26674 4.94418 2.16399 4.94418 -0.02884 curveto
+4.94418 -2.22166 5.81541 -4.32442 7.36586 -5.87486 curveto
+8.9163 -7.42531 11.01906 -8.29654 13.21188 -8.29654 curveto
+15.40471 -8.29654 17.50746 -7.42531 19.0579 -5.87486 curveto
+20.60835 -4.32442 21.47958 -2.22166 21.47958 -0.02884 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 93.45654 202.41513 moveto
+93.45654 204.60796 92.58531 206.71071 91.03487 208.26115 curveto
+89.48442 209.8116 87.38167 210.68283 85.18884 210.68283 curveto
+82.99602 210.68283 80.89326 209.8116 79.34282 208.26115 curveto
+77.79237 206.71071 76.92114 204.60796 76.92114 202.41513 curveto
+76.92114 200.2223 77.79237 198.11955 79.34282 196.5691 curveto
+80.89326 195.01866 82.99602 194.14743 85.18884 194.14743 curveto
+87.38167 194.14743 89.48442 195.01866 91.03487 196.5691 curveto
+92.58531 198.11955 93.45654 200.2223 93.45654 202.41513 curveto closepath stroke
+newpath -65.17577 196.57944 moveto
+-65.17577 198.77226 -66.047 200.87502 -67.59744 202.42546 curveto
+-69.14789 203.9759 -71.25064 204.84714 -73.44347 204.84714 curveto
+-75.63629 204.84714 -77.73904 203.9759 -79.28949 202.42546 curveto
+-80.83994 200.87502 -81.71117 198.77226 -81.71117 196.57944 curveto
+-81.71117 194.38661 -80.83994 192.28386 -79.28949 190.73341 curveto
+-77.73904 189.18297 -75.63629 188.31174 -73.44347 188.31174 curveto
+-71.25064 188.31174 -69.14789 189.18297 -67.59744 190.73341 curveto
+-66.047 192.28386 -65.17577 194.38661 -65.17577 196.57944 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.10 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.10
new file mode 100644
index 0000000000..f1a1519bf2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.10
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 238
+%%HiResBoundingBox: -235.21309 -23.67847 235.21309 237.97737
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+122.5147 214.5551 lineto
+-26.4081 159.60187 lineto
+ closepath fill
+newpath 99.95245 -15.70694 moveto
+113.9496 -31.2887 139.79552 -21.75136 140.31628 -0.81244 curveto
+140.3167 -0.79494 145.65782 213.96274 145.65825 213.98021 curveto
+146.06491 230.33157 129.8467 241.93633 114.50172 236.27393 curveto
+114.4896 236.26945 -34.41135 181.32402 -34.42348 181.31955 curveto
+-49.76845 175.65715 -54.56122 156.29922 -43.63078 144.13133 curveto
+-43.6191 144.11832 99.94078 -15.69392 99.95245 -15.70694 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 95.47882 58.55632 moveto
+98.5249 181.02733 lineto
+13.61005 149.69319 lineto
+ closepath stroke
+newpath 99.95245 -15.70694 moveto
+113.9496 -31.2887 139.79552 -21.75136 140.31628 -0.81244 curveto
+140.3167 -0.79494 145.65782 213.96274 145.65825 213.98021 curveto
+146.06491 230.33157 129.8467 241.93633 114.50172 236.27393 curveto
+114.4896 236.26945 -34.41135 181.32402 -34.42348 181.31955 curveto
+-49.76845 175.65715 -54.56122 156.29922 -43.63078 144.13133 curveto
+-43.6191 144.11832 99.94078 -15.69392 99.95245 -15.70694 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -146.52612 26.20674 moveto
+-164.49709 9.92174 -188.92458 36.87819 -170.95361 53.1632 curveto
+-170.94286 53.17294 -38.63261 173.07033 -38.62184 173.0801 curveto
+-20.65088 189.36508 3.77661 162.40863 -14.19435 146.12364 curveto
+-14.20512 146.11388 -146.51537 26.21649 -146.52612 26.20674 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -146.52612 26.20674 moveto
+-164.49709 9.92174 -188.92458 36.87819 -170.95361 53.1632 curveto
+-170.94286 53.17294 -38.63261 173.07033 -38.62184 173.0801 curveto
+-20.65088 189.36508 3.77661 162.40863 -14.19435 146.12364 curveto
+-14.20512 146.11388 -146.51537 26.21649 -146.52612 26.20674 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.5508 43.3746 moveto
+181.4703 19.62671 145.84845 12.24744 140.92894 35.99533 curveto
+140.926 36.00955 104.70639 210.85208 104.70345 210.8663 curveto
+99.78394 234.6142 135.40579 241.99347 140.3253 218.24557 curveto
+140.32825 218.23135 176.54785 43.38882 176.5508 43.3746 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.5508 43.3746 moveto
+181.4703 19.62671 145.84845 12.24744 140.92894 35.99533 curveto
+140.926 36.00955 104.70639 210.85208 104.70345 210.8663 curveto
+99.78394 234.6142 135.40579 241.99347 140.3253 218.24557 curveto
+140.32825 218.23135 176.54785 43.38882 176.5508 43.3746 curveto closepath stroke
+newpath 125.44164 -0.23697 moveto
+125.44164 1.95586 124.5704 4.05861 123.01996 5.60905 curveto
+121.46951 7.1595 119.36676 8.03073 117.17393 8.03073 curveto
+114.98111 8.03073 112.87836 7.1595 111.32791 5.60905 curveto
+109.77747 4.05861 108.90623 1.95586 108.90623 -0.23697 curveto
+108.90623 -2.4298 109.77747 -4.53255 111.32791 -6.083 curveto
+112.87836 -7.63344 114.98111 -8.50467 117.17393 -8.50467 curveto
+119.36676 -8.50467 121.46951 -7.63344 123.01996 -6.083 curveto
+124.5704 -4.53255 125.44164 -2.4298 125.44164 -0.23697 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 130.7824 214.5551 moveto
+130.7824 216.74792 129.91116 218.85068 128.36072 220.40112 curveto
+126.81027 221.95157 124.70752 222.8228 122.5147 222.8228 curveto
+120.32187 222.8228 118.21912 221.95157 116.66867 220.40112 curveto
+115.11823 218.85068 114.247 216.74792 114.247 214.5551 curveto
+114.247 212.36227 115.11823 210.25952 116.66867 208.70908 curveto
+118.21912 207.15863 120.32187 206.2874 122.5147 206.2874 curveto
+124.70752 206.2874 126.81027 207.15863 128.36072 208.70908 curveto
+129.91116 210.25952 130.7824 212.36227 130.7824 214.5551 curveto closepath stroke
+newpath -18.1404 159.60187 moveto
+-18.1404 161.7947 -19.01163 163.89745 -20.56207 165.44789 curveto
+-22.11252 166.99834 -24.21527 167.86957 -26.4081 167.86957 curveto
+-28.60092 167.86957 -30.70367 166.99834 -32.25412 165.44789 curveto
+-33.80457 163.89745 -34.6758 161.7947 -34.6758 159.60187 curveto
+-34.6758 157.40904 -33.80457 155.30629 -32.25412 153.75584 curveto
+-30.70367 152.2054 -28.60092 151.33417 -26.4081 151.33417 curveto
+-24.21527 151.33417 -22.11252 152.2054 -20.56207 153.75584 curveto
+-19.01163 155.30629 -18.1404 157.40904 -18.1404 159.60187 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.11 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.11
new file mode 100644
index 0000000000..10b87f31e6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.11
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 239
+%%HiResBoundingBox: -235.21309 -23.28256 235.21309 238.42928
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+124.76784 215.00667 lineto
+-22.01549 154.56888 lineto
+ closepath fill
+newpath 110.75836 -15.93227 moveto
+125.32355 -30.9842 150.79784 -20.49515 150.54184 0.44853 curveto
+150.54163 0.46603 147.91599 215.27245 147.91577 215.28992 curveto
+147.71585 231.64497 131.07863 242.6403 115.95428 236.41287 curveto
+115.94234 236.40794 -30.81776 175.9796 -30.82971 175.97467 curveto
+-45.95406 169.74724 -50.02573 150.22505 -38.6517 138.47092 curveto
+-38.63956 138.45836 110.74622 -15.91971 110.75836 -15.93227 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 103.53423 58.11348 moveto
+102.03706 180.61227 lineto
+18.3431 146.15137 lineto
+ closepath stroke
+newpath 110.75836 -15.93227 moveto
+125.32355 -30.9842 150.79784 -20.49515 150.54184 0.44853 curveto
+150.54163 0.46603 147.91599 215.27245 147.91577 215.28992 curveto
+147.71585 231.64497 131.07863 242.6403 115.95428 236.41287 curveto
+115.94234 236.40794 -30.81776 175.9796 -30.82971 175.97467 curveto
+-45.95406 169.74724 -50.02573 150.22505 -38.6517 138.47092 curveto
+-38.63956 138.45836 110.74622 -15.91971 110.75836 -15.93227 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -147.03874 25.75934 moveto
+-165.60623 10.15784 -189.00848 38.0091 -170.441 53.6106 curveto
+-170.42987 53.61993 -33.72772 168.48517 -33.71661 168.4945 curveto
+-15.14911 184.09601 8.25314 156.24475 -10.31436 140.64325 curveto
+-10.32547 140.63391 -147.02762 25.76868 -147.03874 25.75934 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -147.03874 25.75934 moveto
+-165.60623 10.15784 -189.00848 38.0091 -170.441 53.6106 curveto
+-170.42987 53.61993 -33.72772 168.48517 -33.71661 168.4945 curveto
+-15.14911 184.09601 8.25314 156.24475 -10.31436 140.64325 curveto
+-10.32547 140.63391 -147.02762 25.76868 -147.03874 25.75934 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.59659 43.14507 moveto
+181.21007 19.33612 145.49663 12.41592 140.88315 36.22487 curveto
+140.88039 36.23914 106.91396 211.53119 106.9112 211.54546 curveto
+102.29771 235.3544 138.01115 242.2746 142.62463 218.46565 curveto
+142.6274 218.45139 176.59383 43.15933 176.59659 43.14507 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.59659 43.14507 moveto
+181.21007 19.33612 145.49663 12.41592 140.88315 36.22487 curveto
+140.88039 36.23914 106.91396 211.53119 106.9112 211.54546 curveto
+102.29771 235.3544 138.01115 242.2746 142.62463 218.46565 curveto
+142.6274 218.45139 176.59383 43.15933 176.59659 43.14507 curveto closepath stroke
+newpath 135.66196 0.1655 moveto
+135.66196 2.35832 134.79073 4.46107 133.24028 6.01152 curveto
+131.68983 7.56197 129.58708 8.4332 127.39426 8.4332 curveto
+125.20143 8.4332 123.09868 7.56197 121.54823 6.01152 curveto
+119.99779 4.46107 119.12656 2.35832 119.12656 0.1655 curveto
+119.12656 -2.02733 119.99779 -4.13008 121.54823 -5.68053 curveto
+123.09868 -7.23097 125.20143 -8.1022 127.39426 -8.1022 curveto
+129.58708 -8.1022 131.68983 -7.23097 133.24028 -5.68053 curveto
+134.79073 -4.13008 135.66196 -2.02733 135.66196 0.1655 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 133.03554 215.00667 moveto
+133.03554 217.1995 132.1643 219.30225 130.61386 220.85269 curveto
+129.06342 222.40314 126.96066 223.27437 124.76784 223.27437 curveto
+122.57501 223.27437 120.47226 222.40314 118.92181 220.85269 curveto
+117.37137 219.30225 116.50014 217.1995 116.50014 215.00667 curveto
+116.50014 212.81384 117.37137 210.71109 118.92181 209.16064 curveto
+120.47226 207.6102 122.57501 206.73897 124.76784 206.73897 curveto
+126.96066 206.73897 129.06342 207.6102 130.61386 209.16064 curveto
+132.1643 210.71109 133.03554 212.81384 133.03554 215.00667 curveto closepath stroke
+newpath -13.74779 154.56888 moveto
+-13.74779 156.7617 -14.61902 158.86446 -16.16946 160.4149 curveto
+-17.71991 161.96535 -19.82266 162.83658 -22.01549 162.83658 curveto
+-24.20831 162.83658 -26.31107 161.96535 -27.86151 160.4149 curveto
+-29.41196 158.86446 -30.28319 156.7617 -30.28319 154.56888 curveto
+-30.28319 152.37605 -29.41196 150.2733 -27.86151 148.72285 curveto
+-26.31107 147.17241 -24.20831 146.30118 -22.01549 146.30118 curveto
+-19.82266 146.30118 -17.71991 147.17241 -16.16946 148.72285 curveto
+-14.61902 150.2733 -13.74779 152.37605 -13.74779 154.56888 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.12 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.12
new file mode 100644
index 0000000000..aa13e6633b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.12
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -23 236 239
+%%HiResBoundingBox: -235.21309 -22.69464 235.21309 238.76776
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+126.56456 215.34491 lineto
+-17.81633 149.37512 lineto
+ closepath fill
+newpath 121.33832 -15.95813 moveto
+136.46469 -30.44579 161.522 -18.99661 160.47055 1.92212 curveto
+160.46967 1.93959 149.68558 216.48997 149.68471 216.50742 curveto
+148.8636 232.843 131.82079 243.19829 116.94402 236.40082 curveto
+116.93227 236.39545 -27.42543 170.43573 -27.43718 170.43036 curveto
+-42.31395 163.63289 -45.641 143.97023 -33.82872 132.65674 curveto
+-33.8161 132.64464 121.32568 -15.94603 121.33832 -15.95813 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 111.30647 57.75931 moveto
+105.15674 180.1121 lineto
+22.83282 142.49678 lineto
+ closepath stroke
+newpath 121.33832 -15.95813 moveto
+136.46469 -30.44579 161.522 -18.99661 160.47055 1.92212 curveto
+160.46967 1.93959 149.68558 216.48997 149.68471 216.50742 curveto
+148.8636 232.843 131.82079 243.19829 116.94402 236.40082 curveto
+116.93227 236.39545 -27.42543 170.43573 -27.43718 170.43036 curveto
+-42.31395 163.63289 -45.641 143.97023 -33.82872 132.65674 curveto
+-33.8161 132.64464 121.32568 -15.94603 121.33832 -15.95813 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -147.56773 25.33165 moveto
+-166.70549 10.43547 -189.04976 39.1421 -169.912 54.03828 curveto
+-169.90054 54.04721 -28.99992 163.71951 -28.98846 163.72844 curveto
+-9.85071 178.62462 12.49356 149.91798 -6.6442 135.0218 curveto
+-6.65565 135.01288 -147.55627 25.34058 -147.56773 25.33165 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -147.56773 25.33165 moveto
+-166.70549 10.43547 -189.04976 39.1421 -169.912 54.03828 curveto
+-169.90054 54.04721 -28.99992 163.71951 -28.98846 163.72844 curveto
+-9.85071 178.62462 12.49356 149.91798 -6.6442 135.0218 curveto
+-6.65565 135.01288 -147.55627 25.34058 -147.56773 25.33165 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.63127 42.96217 moveto
+181.00089 19.10696 145.21808 12.55255 140.84846 36.40776 curveto
+140.84584 36.42204 108.67487 212.05467 108.67226 212.06897 curveto
+104.30264 235.92418 140.08545 242.47859 144.45506 218.62338 curveto
+144.45767 218.60909 176.62865 42.97646 176.63127 42.96217 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.63127 42.96217 moveto
+181.00089 19.10696 145.21808 12.55255 140.84846 36.40776 curveto
+140.84584 36.42204 108.67487 212.05467 108.67226 212.06897 curveto
+104.30264 235.92418 140.08545 242.47859 144.45506 218.62338 curveto
+144.45767 218.60909 176.62865 42.97646 176.63127 42.96217 curveto closepath stroke
+newpath 145.61826 0.75992 moveto
+145.61826 2.95274 144.74702 5.0555 143.19658 6.60594 curveto
+141.64613 8.15639 139.54338 9.02762 137.35056 9.02762 curveto
+135.15773 9.02762 133.05498 8.15639 131.50453 6.60594 curveto
+129.95409 5.0555 129.08286 2.95274 129.08286 0.75992 curveto
+129.08286 -1.4329 129.95409 -3.53566 131.50453 -5.0861 curveto
+133.05498 -6.63655 135.15773 -7.50778 137.35056 -7.50778 curveto
+139.54338 -7.50778 141.64613 -6.63655 143.19658 -5.0861 curveto
+144.74702 -3.53566 145.61826 -1.4329 145.61826 0.75992 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 134.83226 215.34491 moveto
+134.83226 217.53773 133.96103 219.64049 132.41058 221.19093 curveto
+130.86014 222.74138 128.75739 223.61261 126.56456 223.61261 curveto
+124.37173 223.61261 122.26898 222.74138 120.71854 221.19093 curveto
+119.16809 219.64049 118.29686 217.53773 118.29686 215.34491 curveto
+118.29686 213.15208 119.16809 211.04933 120.71854 209.49889 curveto
+122.26898 207.94844 124.37173 207.07721 126.56456 207.07721 curveto
+128.75739 207.07721 130.86014 207.94844 132.41058 209.49889 curveto
+133.96103 211.04933 134.83226 213.15208 134.83226 215.34491 curveto closepath stroke
+newpath -9.54863 149.37512 moveto
+-9.54863 151.56795 -10.41986 153.6707 -11.9703 155.22115 curveto
+-13.52075 156.77159 -15.6235 157.64282 -17.81633 157.64282 curveto
+-20.00916 157.64282 -22.11191 156.77159 -23.66235 155.22115 curveto
+-25.2128 153.6707 -26.08403 151.56795 -26.08403 149.37512 curveto
+-26.08403 147.1823 -25.2128 145.07954 -23.66235 143.5291 curveto
+-22.11191 141.97865 -20.00916 141.10742 -17.81633 141.10742 curveto
+-15.6235 141.10742 -13.52075 141.97865 -11.9703 143.5291 curveto
+-10.41986 145.07954 -9.54863 147.1823 -9.54863 149.37512 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.13 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.13
new file mode 100644
index 0000000000..18d64a0c7d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.13
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -22 236 240
+%%HiResBoundingBox: -235.21309 -21.88017 235.21309 239.00415
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+127.88283 215.58162 lineto
+-13.81339 144.02876 lineto
+ closepath fill
+newpath 131.68575 -15.74937 moveto
+147.36588 -29.63582 171.95743 -17.21771 170.09059 3.64409 curveto
+170.08902 3.66151 150.94206 217.62793 150.9405 217.64536 curveto
+149.48268 233.93646 132.04878 243.61893 117.44855 236.24617 curveto
+117.43701 236.24034 -24.23734 164.69844 -24.24887 164.69261 curveto
+-38.8491 157.31985 -41.40648 137.54233 -29.16176 126.69833 curveto
+-29.14867 126.68674 131.67267 -15.73778 131.68575 -15.74937 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 118.78532 57.52058 moveto
+107.86644 179.54037 lineto
+27.07277 138.74164 lineto
+ closepath stroke
+newpath 131.68575 -15.74937 moveto
+147.36588 -29.63582 171.95743 -17.21771 170.09059 3.64409 curveto
+170.08902 3.66151 150.94206 217.62793 150.9405 217.64536 curveto
+149.48268 233.93646 132.04878 243.61893 117.44855 236.24617 curveto
+117.43701 236.24034 -24.23734 164.69844 -24.24887 164.69261 curveto
+-38.8491 157.31985 -41.40648 137.54233 -29.16176 126.69833 curveto
+-29.14867 126.68674 131.67267 -15.73778 131.68575 -15.74937 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -148.11226 24.92395 moveto
+-167.79362 10.75381 -189.04884 40.27585 -169.36748 54.44598 curveto
+-169.35568 54.45447 -24.45277 158.7813 -24.441 158.78978 curveto
+-4.75963 172.95992 16.49559 143.43788 -3.18578 129.26775 curveto
+-3.19756 129.25926 -148.10046 24.93243 -148.11226 24.92395 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -148.11226 24.92395 moveto
+-167.79362 10.75381 -189.04884 40.27585 -169.36748 54.44598 curveto
+-169.35568 54.45447 -24.45277 158.7813 -24.441 158.78978 curveto
+-4.75963 172.95992 16.49559 143.43788 -3.18578 129.26775 curveto
+-3.19756 129.25926 -148.10046 24.93243 -148.11226 24.92395 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.65515 42.82784 moveto
+180.84566 18.9408 145.01509 12.65506 140.82458 36.5421 curveto
+140.82208 36.55641 109.96976 212.42334 109.96724 212.43765 curveto
+105.77675 236.32468 141.60732 242.61041 145.7978 218.72339 curveto
+145.80032 218.70908 176.65265 42.84215 176.65515 42.82784 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.65515 42.82784 moveto
+180.84566 18.9408 145.01509 12.65506 140.82458 36.5421 curveto
+140.82208 36.55641 109.96976 212.42334 109.96724 212.43765 curveto
+105.77675 236.32468 141.60732 242.61041 145.7978 218.72339 curveto
+145.80032 218.70908 176.65265 42.84215 176.65515 42.82784 curveto closepath stroke
+newpath 155.30122 1.5807 moveto
+155.30122 3.77353 154.43 5.87628 152.87955 7.42673 curveto
+151.3291 8.97717 149.22635 9.8484 147.03352 9.8484 curveto
+144.8407 9.8484 142.73795 8.97717 141.1875 7.42673 curveto
+139.63705 5.87628 138.76582 3.77353 138.76582 1.5807 curveto
+138.76582 -0.61212 139.63705 -2.71487 141.1875 -4.26532 curveto
+142.73795 -5.81577 144.8407 -6.687 147.03352 -6.687 curveto
+149.22635 -6.687 151.3291 -5.81577 152.87955 -4.26532 curveto
+154.43 -2.71487 155.30122 -0.61212 155.30122 1.5807 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 136.15053 215.58162 moveto
+136.15053 217.77444 135.2793 219.8772 133.72885 221.42764 curveto
+132.1784 222.97809 130.07565 223.84932 127.88283 223.84932 curveto
+125.69 223.84932 123.58725 222.97809 122.0368 221.42764 curveto
+120.48636 219.8772 119.61513 217.77444 119.61513 215.58162 curveto
+119.61513 213.3888 120.48636 211.28604 122.0368 209.7356 curveto
+123.58725 208.18515 125.69 207.31392 127.88283 207.31392 curveto
+130.07565 207.31392 132.1784 208.18515 133.72885 209.7356 curveto
+135.2793 211.28604 136.15053 213.3888 136.15053 215.58162 curveto closepath stroke
+newpath -5.54568 144.02876 moveto
+-5.54568 146.22159 -6.41692 148.32434 -7.96736 149.87479 curveto
+-9.5178 151.42523 -11.62056 152.29646 -13.81339 152.29646 curveto
+-16.00621 152.29646 -18.10896 151.42523 -19.65941 149.87479 curveto
+-21.20985 148.32434 -22.08109 146.22159 -22.08109 144.02876 curveto
+-22.08109 141.83594 -21.20985 139.73318 -19.65941 138.18274 curveto
+-18.10896 136.6323 -16.00621 135.76106 -13.81339 135.76106 curveto
+-11.62056 135.76106 -9.5178 136.6323 -7.96736 138.18274 curveto
+-6.41692 139.73318 -5.54568 141.83594 -5.54568 144.02876 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.14 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.14
new file mode 100644
index 0000000000..d2bb551fdb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.14
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -21 236 240
+%%HiResBoundingBox: -235.21309 -20.80424 235.21309 239.14424
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+128.69759 215.72293 lineto
+-10.01207 138.538 lineto
+ closepath fill
+newpath 141.78516 -15.26996 moveto
+158.01024 -28.51572 182.08347 -15.12025 179.38055 5.64984 curveto
+179.37828 5.66718 151.65617 218.69313 151.65392 218.71048 curveto
+149.54318 234.92996 131.73454 243.9047 117.44203 235.95168 curveto
+117.43074 235.94539 -21.25755 158.77284 -21.26884 158.76656 curveto
+-35.56136 150.81354 -37.3226 130.94922 -24.65236 120.60553 curveto
+-24.63881 120.59447 141.77162 -15.25891 141.78516 -15.26996 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 125.95338 57.42325 moveto
+110.1443 178.90671 lineto
+31.05351 134.89694 lineto
+ closepath stroke
+newpath 141.78516 -15.26996 moveto
+158.01024 -28.51572 182.08347 -15.12025 179.38055 5.64984 curveto
+179.37828 5.66718 151.65617 218.69313 151.65392 218.71048 curveto
+149.54318 234.92996 131.73454 243.9047 117.44203 235.95168 curveto
+117.43074 235.94539 -21.25755 158.77284 -21.26884 158.76656 curveto
+-35.56136 150.81354 -37.3226 130.94922 -24.65236 120.60553 curveto
+-24.63881 120.59447 141.77162 -15.25891 141.78516 -15.26996 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -148.67151 24.53677 moveto
+-168.8691 11.1123 -189.00581 41.40869 -168.80823 54.83316 curveto
+-168.79613 54.8412 -20.09253 153.67815 -20.08043 153.68619 curveto
+0.11716 167.11066 20.25388 136.81427 0.05629 123.3898 curveto
+0.04419 123.38176 -148.65941 24.54482 -148.67151 24.53677 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -148.67151 24.53677 moveto
+-168.8691 11.1123 -189.00581 41.40869 -168.80823 54.83316 curveto
+-168.79613 54.8412 -20.09253 153.67815 -20.08043 153.68619 curveto
+0.11716 167.11066 20.25388 136.81427 0.05629 123.3898 curveto
+0.04419 123.38176 -148.65941 24.54482 -148.67151 24.53677 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.66959 42.74486 moveto
+180.74944 18.83858 144.89 12.7188 140.81015 36.62508 curveto
+140.80771 36.63939 110.77002 212.64801 110.76758 212.66232 curveto
+106.68771 236.5686 142.54715 242.68839 146.62701 218.7821 curveto
+146.62946 218.76779 176.66714 42.75917 176.66959 42.74486 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.66959 42.74486 moveto
+180.74944 18.83858 144.89 12.7188 140.81015 36.62508 curveto
+140.80771 36.63939 110.77002 212.64801 110.76758 212.66232 curveto
+106.68771 236.5686 142.54715 242.68839 146.62701 218.7821 curveto
+146.62946 218.76779 176.66714 42.75917 176.66959 42.74486 curveto closepath stroke
+newpath 164.69254 2.6624 moveto
+164.69254 4.85522 163.8213 6.95798 162.27086 8.50842 curveto
+160.72041 10.05887 158.61766 10.9301 156.42484 10.9301 curveto
+154.23201 10.9301 152.12926 10.05887 150.57881 8.50842 curveto
+149.02837 6.95798 148.15714 4.85522 148.15714 2.6624 curveto
+148.15714 0.46957 149.02837 -1.63318 150.57881 -3.18362 curveto
+152.12926 -4.73407 154.23201 -5.6053 156.42484 -5.6053 curveto
+158.61766 -5.6053 160.72041 -4.73407 162.27086 -3.18362 curveto
+163.8213 -1.63318 164.69254 0.46957 164.69254 2.6624 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 136.96529 215.72293 moveto
+136.96529 217.91576 136.09406 220.01851 134.54361 221.56895 curveto
+132.99316 223.1194 130.89041 223.99063 128.69759 223.99063 curveto
+126.50476 223.99063 124.40201 223.1194 122.85156 221.56895 curveto
+121.30112 220.01851 120.42989 217.91576 120.42989 215.72293 curveto
+120.42989 213.5301 121.30112 211.42735 122.85156 209.8769 curveto
+124.40201 208.32646 126.50476 207.45523 128.69759 207.45523 curveto
+130.89041 207.45523 132.99316 208.32646 134.54361 209.8769 curveto
+136.09406 211.42735 136.96529 213.5301 136.96529 215.72293 curveto closepath stroke
+newpath -1.74437 138.538 moveto
+-1.74437 140.73082 -2.6156 142.83357 -4.16605 144.38402 curveto
+-5.71649 145.93446 -7.81924 146.8057 -10.01207 146.8057 curveto
+-12.2049 146.8057 -14.30765 145.93446 -15.8581 144.38402 curveto
+-17.40854 142.83357 -18.27977 140.73082 -18.27977 138.538 curveto
+-18.27977 136.34517 -17.40854 134.24242 -15.8581 132.69197 curveto
+-14.30765 131.14153 -12.2049 130.2703 -10.01207 130.2703 curveto
+-7.81924 130.2703 -5.71649 131.14153 -4.16605 132.69197 curveto
+-2.6156 134.24242 -1.74437 136.34517 -1.74437 138.538 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.15 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.15
new file mode 100644
index 0000000000..8e08088b60
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.15
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -20 236 240
+%%HiResBoundingBox: -235.21309 -19.43288 235.21309 239.19029
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+128.97406 215.77005 lineto
+-6.4206 132.90825 lineto
+ closepath fill
+newpath 151.6152 -14.48447 moveto
+168.37491 -27.0472 191.87308 -12.6664 188.3125 7.97415 curveto
+188.30952 7.9914 151.7909 219.68864 151.78792 219.70587 curveto
+149.00745 235.8242 130.84235 244.05397 116.89125 235.51595 curveto
+116.88022 235.5092 -18.49506 152.65999 -18.50609 152.65324 curveto
+-32.45718 144.11522 -33.39447 124.19484 -20.30672 114.38452 curveto
+-20.29272 114.37404 151.60121 -14.47397 151.6152 -14.48447 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 132.7871 57.49152 moveto
+111.9616 178.21725 lineto
+34.76012 130.97021 lineto
+ closepath stroke
+newpath 151.6152 -14.48447 moveto
+168.37491 -27.0472 191.87308 -12.6664 188.3125 7.97415 curveto
+188.30952 7.9914 151.7909 219.68864 151.78792 219.70587 curveto
+149.00745 235.8242 130.84235 244.05397 116.89125 235.51595 curveto
+116.88022 235.5092 -18.49506 152.65999 -18.50609 152.65324 curveto
+-32.45718 144.11522 -33.39447 124.19484 -20.30672 114.38452 curveto
+-20.29272 114.37404 151.60121 -14.47397 151.6152 -14.48447 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -149.2449 24.17097 moveto
+-169.93022 11.51103 -188.92015 42.53902 -168.23483 55.19896 curveto
+-168.22244 55.20654 -15.92795 148.41466 -15.91556 148.42224 curveto
+4.76976 161.08218 23.75969 130.0542 3.07437 117.39426 curveto
+3.06198 117.38667 -149.23251 24.17856 -149.2449 24.17097 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -149.2449 24.17097 moveto
+-169.93022 11.51103 -188.92015 42.53902 -168.23483 55.19896 curveto
+-168.22244 55.20654 -15.92795 148.41466 -15.91556 148.42224 curveto
+4.76976 161.08218 23.75969 130.0542 3.07437 117.39426 curveto
+3.06198 117.38667 -149.23251 24.17856 -149.2449 24.17097 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.6743 42.71655 moveto
+180.71642 18.80399 144.84755 12.74081 140.80544 36.65338 curveto
+140.80301 36.66771 111.04323 212.72263 111.0408 212.73695 curveto
+106.99869 236.64952 142.86755 242.71269 146.90967 218.80013 curveto
+146.9121 218.7858 176.67188 42.73088 176.6743 42.71655 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.6743 42.71655 moveto
+180.71642 18.80399 144.84755 12.74081 140.80544 36.65338 curveto
+140.80301 36.66771 111.04323 212.72263 111.0408 212.73695 curveto
+106.99869 236.64952 142.86755 242.71269 146.90967 218.80013 curveto
+146.9121 218.7858 176.67188 42.73088 176.6743 42.71655 curveto closepath stroke
+newpath 173.76767 4.0388 moveto
+173.76767 6.23163 172.89644 8.33438 171.346 9.88483 curveto
+169.79555 11.43527 167.6928 12.3065 165.49997 12.3065 curveto
+163.30714 12.3065 161.20439 11.43527 159.65395 9.88483 curveto
+158.1035 8.33438 157.23227 6.23163 157.23227 4.0388 curveto
+157.23227 1.84598 158.1035 -0.25677 159.65395 -1.80722 curveto
+161.20439 -3.35767 163.30714 -4.2289 165.49997 -4.2289 curveto
+167.6928 -4.2289 169.79555 -3.35767 171.346 -1.80722 curveto
+172.89644 -0.25677 173.76767 1.84598 173.76767 4.0388 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 137.24176 215.77005 moveto
+137.24176 217.96288 136.37053 220.06563 134.82008 221.61607 curveto
+133.26964 223.16652 131.16689 224.03775 128.97406 224.03775 curveto
+126.78123 224.03775 124.67848 223.16652 123.12804 221.61607 curveto
+121.57759 220.06563 120.70636 217.96288 120.70636 215.77005 curveto
+120.70636 213.57722 121.57759 211.47447 123.12804 209.92403 curveto
+124.67848 208.37358 126.78123 207.50235 128.97406 207.50235 curveto
+131.16689 207.50235 133.26964 208.37358 134.82008 209.92403 curveto
+136.37053 211.47447 137.24176 213.57722 137.24176 215.77005 curveto closepath stroke
+newpath 1.8471 132.90825 moveto
+1.8471 135.10107 0.97588 137.20383 -0.57457 138.75427 curveto
+-2.12502 140.30472 -4.22777 141.17595 -6.4206 141.17595 curveto
+-8.61342 141.17595 -10.71617 140.30472 -12.26662 138.75427 curveto
+-13.81706 137.20383 -14.6883 135.10107 -14.6883 132.90825 curveto
+-14.6883 130.71542 -13.81706 128.61267 -12.26662 127.06223 curveto
+-10.71617 125.51178 -8.61342 124.64055 -6.4206 124.64055 curveto
+-4.22777 124.64055 -2.12502 125.51178 -0.57457 127.06223 curveto
+0.97588 128.61267 1.8471 130.71542 1.8471 132.90825 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.2 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.2
new file mode 100644
index 0000000000..6a5b7900e6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.2
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 229
+%%HiResBoundingBox: -235.21309 -23.50154 235.21309 228.19232
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+90.68617 204.7902 lineto
+-67.6366 193.28224 lineto
+ closepath fill
+newpath 5.16348 -10.18842 moveto
+14.29152 -29.04019 41.76848 -27.04301 48.0745 -7.06943 curveto
+48.07976 -7.05275 112.75659 197.80394 112.76184 197.82062 curveto
+117.68625 213.41812 105.32153 229.06465 89.0082 227.87892 curveto
+88.99532 227.87798 -69.30217 216.37209 -69.31505 216.37114 curveto
+-85.62839 215.18541 -95.60056 197.91531 -88.47241 183.19385 curveto
+-88.46478 183.17812 5.15587 -10.17268 5.16348 -10.18842 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 21.45596 62.40356 moveto
+58.33974 179.22823 lineto
+-31.93373 172.66667 lineto
+ closepath stroke
+newpath 5.16348 -10.18842 moveto
+14.29152 -29.04019 41.76848 -27.04301 48.0745 -7.06943 curveto
+48.07976 -7.05275 112.75659 197.80394 112.76184 197.82062 curveto
+117.68625 213.41812 105.32153 229.06465 89.0082 227.87892 curveto
+88.99532 227.87798 -69.30217 216.37209 -69.31505 216.37114 curveto
+-85.62839 215.18541 -95.60056 197.91531 -88.47241 183.19385 curveto
+-88.46478 183.17812 5.15587 -10.17268 5.16348 -10.18842 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -143.0957 30.40593 moveto
+-155.46774 9.54706 -186.75607 28.10513 -174.38403 48.964 curveto
+-174.37662 48.9765 -83.28818 202.5488 -83.28076 202.56128 curveto
+-70.90872 223.42017 -39.62039 204.86209 -51.99243 184.0032 curveto
+-51.99985 183.99072 -143.08829 30.41843 -143.0957 30.40593 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -143.0957 30.40593 moveto
+-155.46774 9.54706 -186.75607 28.10513 -174.38403 48.964 curveto
+-174.37662 48.9765 -83.28818 202.5488 -83.28076 202.56128 curveto
+-70.90872 223.42017 -39.62039 204.86209 -51.99243 184.0032 curveto
+-51.99985 183.99072 -143.08829 30.41843 -143.0957 30.40593 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 175.55637 46.61656 moveto
+184.79848 24.19458 151.16548 10.33139 141.92337 32.75337 curveto
+141.91783 32.7668 73.87328 197.84741 73.86774 197.86084 curveto
+64.62561 220.28284 98.2586 234.14603 107.50073 211.72403 curveto
+107.50627 211.7106 175.55083 46.62999 175.55637 46.61656 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 175.55637 46.61656 moveto
+184.79848 24.19458 151.16548 10.33139 141.92337 32.75337 curveto
+141.91783 32.7668 73.87328 197.84741 73.86774 197.86084 curveto
+64.62561 220.28284 98.2586 234.14603 107.50073 211.72403 curveto
+107.50627 211.7106 175.55083 46.62999 175.55637 46.61656 curveto closepath stroke
+newpath 34.26675 -0.09993 moveto
+34.26675 2.0929 33.39552 4.19565 31.84508 5.7461 curveto
+30.29463 7.29654 28.19188 8.16777 25.99905 8.16777 curveto
+23.80623 8.16777 21.70348 7.29654 20.15303 5.7461 curveto
+18.60258 4.19565 17.73135 2.0929 17.73135 -0.09993 curveto
+17.73135 -2.29276 18.60258 -4.39551 20.15303 -5.94595 curveto
+21.70348 -7.4964 23.80623 -8.36763 25.99905 -8.36763 curveto
+28.19188 -8.36763 30.29463 -7.4964 31.84508 -5.94595 curveto
+33.39552 -4.39551 34.26675 -2.29276 34.26675 -0.09993 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 98.95387 204.7902 moveto
+98.95387 206.98303 98.08264 209.08578 96.5322 210.63623 curveto
+94.98175 212.18668 92.879 213.0579 90.68617 213.0579 curveto
+88.49335 213.0579 86.3906 212.18668 84.84015 210.63623 curveto
+83.2897 209.08578 82.41847 206.98303 82.41847 204.7902 curveto
+82.41847 202.59738 83.2897 200.49463 84.84015 198.94418 curveto
+86.3906 197.39374 88.49335 196.5225 90.68617 196.5225 curveto
+92.879 196.5225 94.98175 197.39374 96.5322 198.94418 curveto
+98.08264 200.49463 98.95387 202.59738 98.95387 204.7902 curveto closepath stroke
+newpath -59.3689 193.28224 moveto
+-59.3689 195.47507 -60.24013 197.57782 -61.79057 199.12827 curveto
+-63.34102 200.67871 -65.44377 201.54994 -67.6366 201.54994 curveto
+-69.82942 201.54994 -71.93217 200.67871 -73.48262 199.12827 curveto
+-75.03307 197.57782 -75.9043 195.47507 -75.9043 193.28224 curveto
+-75.9043 191.08942 -75.03307 188.98666 -73.48262 187.43622 curveto
+-71.93217 185.88577 -69.82942 185.01454 -67.6366 185.01454 curveto
+-65.44377 185.01454 -63.34102 185.88577 -61.79057 187.43622 curveto
+-60.24013 188.98666 -59.3689 191.08942 -59.3689 193.28224 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.3 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.3
new file mode 100644
index 0000000000..e2bb7498d6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.3
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 231
+%%HiResBoundingBox: -235.21309 -23.60762 235.21309 230.23532
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+95.8627 206.83052 lineto
+-61.95781 189.76706 lineto
+ closepath fill
+newpath 17.9476 -11.01802 moveto
+27.73238 -29.53719 55.1219 -26.57568 60.72205 -6.39302 curveto
+60.72672 -6.37619 118.16399 200.62471 118.16867 200.64157 curveto
+122.54185 216.40233 109.63507 231.6045 93.37364 229.84624 curveto
+93.3608 229.84485 -64.43294 212.78339 -64.44579 212.782 curveto
+-80.70721 211.02373 -90.06624 193.41405 -82.42523 178.95233 curveto
+-82.41707 178.93687 17.93942 -11.00256 17.9476 -11.01802 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 31.67886 62.10092 moveto
+64.4341 180.14838 lineto
+-25.55211 170.41861 lineto
+ closepath stroke
+newpath 17.9476 -11.01802 moveto
+27.73238 -29.53719 55.1219 -26.57568 60.72205 -6.39302 curveto
+60.72672 -6.37619 118.16399 200.62471 118.16867 200.64157 curveto
+122.54185 216.40233 109.63507 231.6045 93.37364 229.84624 curveto
+93.3608 229.84485 -64.43294 212.78339 -64.44579 212.782 curveto
+-80.70721 211.02373 -90.06624 193.41405 -82.42523 178.95233 curveto
+-82.41707 178.93687 17.93942 -11.00256 17.9476 -11.01802 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -143.45374 29.82755 moveto
+-156.59697 9.44604 -187.16924 29.16089 -174.026 49.54239 curveto
+-174.01813 49.5546 -77.25182 199.61227 -77.24394 199.62448 curveto
+-64.10071 220.00598 -33.52844 200.29114 -46.67168 179.90964 curveto
+-46.67955 179.89743 -143.44586 29.83975 -143.45374 29.82755 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -143.45374 29.82755 moveto
+-156.59697 9.44604 -187.16924 29.16089 -174.026 49.54239 curveto
+-174.01813 49.5546 -77.25182 199.61227 -77.24394 199.62448 curveto
+-64.10071 220.00598 -33.52844 200.29114 -46.67168 179.90964 curveto
+-46.67955 179.89743 -143.44586 29.83975 -143.45374 29.82755 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 175.76396 46.08923 moveto
+184.30298 23.39044 150.25479 10.58191 141.71577 33.2807 curveto
+141.71066 33.2943 78.84265 200.41284 78.83754 200.42644 curveto
+70.29852 223.12523 104.34671 235.93376 112.88573 213.23497 curveto
+112.89084 213.22137 175.75885 46.10283 175.76396 46.08923 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 175.76396 46.08923 moveto
+184.30298 23.39044 150.25479 10.58191 141.71577 33.2807 curveto
+141.71066 33.2943 78.84265 200.41284 78.83754 200.42644 curveto
+70.29852 223.12523 104.34671 235.93376 112.88573 213.23497 curveto
+112.89084 213.22137 175.75885 46.10283 175.76396 46.08923 curveto closepath stroke
+newpath 46.68326 -0.20367 moveto
+46.68326 1.98915 45.81203 4.0919 44.26158 5.64235 curveto
+42.71114 7.1928 40.60838 8.06403 38.41556 8.06403 curveto
+36.22273 8.06403 34.11998 7.1928 32.56953 5.64235 curveto
+31.01909 4.0919 30.14786 1.98915 30.14786 -0.20367 curveto
+30.14786 -2.3965 31.01909 -4.49925 32.56953 -6.0497 curveto
+34.11998 -7.60014 36.22273 -8.47137 38.41556 -8.47137 curveto
+40.60838 -8.47137 42.71114 -7.60014 44.26158 -6.0497 curveto
+45.81203 -4.49925 46.68326 -2.3965 46.68326 -0.20367 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 104.1304 206.83052 moveto
+104.1304 209.02335 103.25917 211.1261 101.70872 212.67654 curveto
+100.15828 214.22699 98.05553 215.09822 95.8627 215.09822 curveto
+93.66988 215.09822 91.56712 214.22699 90.01668 212.67654 curveto
+88.46623 211.1261 87.595 209.02335 87.595 206.83052 curveto
+87.595 204.6377 88.46623 202.53494 90.01668 200.9845 curveto
+91.56712 199.43405 93.66988 198.56282 95.8627 198.56282 curveto
+98.05553 198.56282 100.15828 199.43405 101.70872 200.9845 curveto
+103.25917 202.53494 104.1304 204.6377 104.1304 206.83052 curveto closepath stroke
+newpath -53.69011 189.76706 moveto
+-53.69011 191.95988 -54.56134 194.06264 -56.11179 195.61308 curveto
+-57.66223 197.16353 -59.76498 198.03476 -61.95781 198.03476 curveto
+-64.15063 198.03476 -66.25339 197.16353 -67.80383 195.61308 curveto
+-69.35428 194.06264 -70.22551 191.95988 -70.22551 189.76706 curveto
+-70.22551 187.57423 -69.35428 185.47148 -67.80383 183.92104 curveto
+-66.25339 182.37059 -64.15063 181.49936 -61.95781 181.49936 curveto
+-59.76498 181.49936 -57.66223 182.37059 -56.11179 183.92104 curveto
+-54.56134 185.47148 -53.69011 187.57423 -53.69011 189.76706 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.4 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.4
new file mode 100644
index 0000000000..862ebb2b9a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.4
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 232
+%%HiResBoundingBox: -235.21309 -23.7342 235.21309 231.98564
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+100.72028 208.57889 lineto
+-56.41254 186.04205 lineto
+ closepath fill
+newpath 30.4192 -11.84558 moveto
+40.84137 -30.0137 68.1115 -26.10258 73.00722 -5.73758 curveto
+73.01129 -5.72058 123.2236 203.15065 123.22766 203.16765 curveto
+127.05075 219.0708 113.62369 233.8155 97.43314 231.49344 curveto
+97.42035 231.49161 -59.68561 208.95932 -59.6984 208.95749 curveto
+-75.88895 206.63542 -84.63062 188.71127 -76.49188 174.5237 curveto
+-76.48318 174.50853 30.41049 -11.83041 30.4192 -11.84558 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 41.60234 61.70624 moveto
+70.23734 180.8203 lineto
+-19.35663 167.97066 lineto
+ closepath stroke
+newpath 30.4192 -11.84558 moveto
+40.84137 -30.0137 68.1115 -26.10258 73.00722 -5.73758 curveto
+73.01129 -5.72058 123.2236 203.15065 123.22766 203.16765 curveto
+127.05075 219.0708 113.62369 233.8155 97.43314 231.49344 curveto
+97.42035 231.49161 -59.68561 208.95932 -59.6984 208.95749 curveto
+-75.88895 206.63542 -84.63062 188.71127 -76.49188 174.5237 curveto
+-76.48318 174.50853 30.41049 -11.83041 30.4192 -11.84558 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -143.83313 29.26274 moveto
+-157.72943 9.3871 -187.54291 30.23155 -173.6466 50.1072 curveto
+-173.63829 50.1191 -71.32759 196.45238 -71.31927 196.46428 curveto
+-57.42297 216.33992 -27.6095 195.49547 -41.5058 175.61983 curveto
+-41.51411 175.60793 -143.82481 29.27464 -143.83313 29.26274 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -143.83313 29.26274 moveto
+-157.72943 9.3871 -187.54291 30.23155 -173.6466 50.1072 curveto
+-173.63829 50.1191 -71.32759 196.45238 -71.31927 196.46428 curveto
+-57.42297 216.33992 -27.6095 195.49547 -41.5058 175.61983 curveto
+-41.51411 175.60793 -143.82481 29.27464 -143.83313 29.26274 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 175.94214 45.59438 moveto
+183.82135 22.65802 149.41681 10.8392 141.5376 33.77556 curveto
+141.53288 33.78929 83.52267 202.65697 83.51796 202.67072 curveto
+75.63875 225.60707 110.04329 237.42589 117.9225 214.48953 curveto
+117.92722 214.47578 175.93742 45.60811 175.94214 45.59438 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 175.94214 45.59438 moveto
+183.82135 22.65802 149.41681 10.8392 141.5376 33.77556 curveto
+141.53288 33.78929 83.52267 202.65697 83.51796 202.67072 curveto
+75.63875 225.60707 110.04329 237.42589 117.9225 214.48953 curveto
+117.92722 214.47578 175.93742 45.60811 175.94214 45.59438 curveto closepath stroke
+newpath 58.76688 -0.32678 moveto
+58.76688 1.86604 57.89565 3.9688 56.3452 5.51924 curveto
+54.79475 7.06969 52.692 7.94092 50.49918 7.94092 curveto
+48.30635 7.94092 46.2036 7.06969 44.65315 5.51924 curveto
+43.1027 3.9688 42.23148 1.86604 42.23148 -0.32678 curveto
+42.23148 -2.5196 43.1027 -4.62236 44.65315 -6.1728 curveto
+46.2036 -7.72325 48.30635 -8.59448 50.49918 -8.59448 curveto
+52.692 -8.59448 54.79475 -7.72325 56.3452 -6.1728 curveto
+57.89565 -4.62236 58.76688 -2.5196 58.76688 -0.32678 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 108.98798 208.57889 moveto
+108.98798 210.77171 108.11674 212.87447 106.5663 214.42491 curveto
+105.01585 215.97536 102.9131 216.84659 100.72028 216.84659 curveto
+98.52745 216.84659 96.4247 215.97536 94.87425 214.42491 curveto
+93.3238 212.87447 92.45258 210.77171 92.45258 208.57889 curveto
+92.45258 206.38606 93.3238 204.28331 94.87425 202.73286 curveto
+96.4247 201.18242 98.52745 200.31119 100.72028 200.31119 curveto
+102.9131 200.31119 105.01585 201.18242 106.5663 202.73286 curveto
+108.11674 204.28331 108.98798 206.38606 108.98798 208.57889 curveto closepath stroke
+newpath -48.14484 186.04205 moveto
+-48.14484 188.23488 -49.01607 190.33763 -50.56651 191.88808 curveto
+-52.11696 193.43852 -54.21971 194.30975 -56.41254 194.30975 curveto
+-58.60536 194.30975 -60.70811 193.43852 -62.25856 191.88808 curveto
+-63.809 190.33763 -64.68024 188.23488 -64.68024 186.04205 curveto
+-64.68024 183.84923 -63.809 181.74648 -62.25856 180.19603 curveto
+-60.70811 178.64558 -58.60536 177.77435 -56.41254 177.77435 curveto
+-54.21971 177.77435 -52.11696 178.64558 -50.56651 180.19603 curveto
+-49.01607 181.74648 -48.14484 183.84923 -48.14484 186.04205 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.5 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.5
new file mode 100644
index 0000000000..46db36233c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.5
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 234
+%%HiResBoundingBox: -235.21309 -23.86116 235.21309 233.47723
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+105.24788 210.0667 lineto
+-51.01167 182.1154 lineto
+ closepath fill
+newpath 42.6055 -12.65521 moveto
+53.64925 -30.45242 80.76804 -25.60136 84.95718 -5.07928 curveto
+84.96066 -5.06215 127.92603 205.42003 127.9295 205.43716 curveto
+131.20082 221.46298 117.27225 235.73497 101.17155 232.85486 curveto
+101.15883 232.85258 -55.07527 204.9052 -55.088 204.90292 curveto
+-71.18869 202.02281 -79.30586 183.80725 -70.68173 169.9093 curveto
+-70.67252 169.89442 42.59628 -12.64037 42.6055 -12.65521 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 51.24057 61.23935 moveto
+75.7428 181.27211 lineto
+-13.35397 165.33434 lineto
+ closepath stroke
+newpath 42.6055 -12.65521 moveto
+53.64925 -30.45242 80.76804 -25.60136 84.95718 -5.07928 curveto
+84.96066 -5.06215 127.92603 205.42003 127.9295 205.43716 curveto
+131.20082 221.46298 117.27225 235.73497 101.17155 232.85486 curveto
+101.15883 232.85258 -55.07527 204.9052 -55.088 204.90292 curveto
+-71.18869 202.02281 -79.30586 183.80725 -70.68173 169.9093 curveto
+-70.67252 169.89442 42.59628 -12.64037 42.6055 -12.65521 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -144.23308 28.71266 moveto
+-158.86282 9.37027 -187.8764 31.31488 -173.24666 50.65727 curveto
+-173.2379 50.66885 -65.52724 193.07613 -65.51846 193.0877 curveto
+-50.88872 212.4301 -21.87514 190.48549 -36.50488 171.1431 curveto
+-36.51366 171.13152 -144.22432 28.72424 -144.23308 28.71266 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -144.23308 28.71266 moveto
+-158.86282 9.37027 -187.8764 31.31488 -173.24666 50.65727 curveto
+-173.2379 50.66885 -65.52724 193.07613 -65.51846 193.0877 curveto
+-50.88872 212.4301 -21.87514 190.48549 -36.50488 171.1431 curveto
+-36.51366 171.13152 -144.22432 28.72424 -144.23308 28.71266 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.09367 45.13338 moveto
+183.35822 21.99496 148.6506 11.09814 141.38606 34.23656 curveto
+141.38171 34.25041 87.89691 204.60567 87.89256 204.61954 curveto
+80.62802 227.75795 115.33563 238.65477 122.60017 215.51636 curveto
+122.60452 215.50249 176.08932 45.14723 176.09367 45.13338 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.09367 45.13338 moveto
+183.35822 21.99496 148.6506 11.09814 141.38606 34.23656 curveto
+141.38171 34.25041 87.89691 204.60567 87.89256 204.61954 curveto
+80.62802 227.75795 115.33563 238.65477 122.60017 215.51636 curveto
+122.60452 215.50249 176.08932 45.14723 176.09367 45.13338 curveto closepath stroke
+newpath 70.54324 -0.44943 moveto
+70.54324 1.7434 69.67201 3.84615 68.12157 5.39659 curveto
+66.57112 6.94704 64.46837 7.81827 62.27554 7.81827 curveto
+60.08272 7.81827 57.97997 6.94704 56.42952 5.39659 curveto
+54.87907 3.84615 54.00784 1.7434 54.00784 -0.44943 curveto
+54.00784 -2.64226 54.87907 -4.74501 56.42952 -6.29546 curveto
+57.97997 -7.8459 60.08272 -8.71713 62.27554 -8.71713 curveto
+64.46837 -8.71713 66.57112 -7.8459 68.12157 -6.29546 curveto
+69.67201 -4.74501 70.54324 -2.64226 70.54324 -0.44943 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 113.51558 210.0667 moveto
+113.51558 212.25952 112.64435 214.36227 111.0939 215.91272 curveto
+109.54346 217.46317 107.4407 218.3344 105.24788 218.3344 curveto
+103.05505 218.3344 100.9523 217.46317 99.40186 215.91272 curveto
+97.85141 214.36227 96.98018 212.25952 96.98018 210.0667 curveto
+96.98018 207.87387 97.85141 205.77112 99.40186 204.22067 curveto
+100.9523 202.67023 103.05505 201.799 105.24788 201.799 curveto
+107.4407 201.799 109.54346 202.67023 111.0939 204.22067 curveto
+112.64435 205.77112 113.51558 207.87387 113.51558 210.0667 curveto closepath stroke
+newpath -42.74397 182.1154 moveto
+-42.74397 184.30823 -43.6152 186.41098 -45.16565 187.96143 curveto
+-46.7161 189.51187 -48.81885 190.3831 -51.01167 190.3831 curveto
+-53.2045 190.3831 -55.30725 189.51187 -56.8577 187.96143 curveto
+-58.40814 186.41098 -59.27937 184.30823 -59.27937 182.1154 curveto
+-59.27937 179.92258 -58.40814 177.81982 -56.8577 176.26938 curveto
+-55.30725 174.71893 -53.2045 173.8477 -51.01167 173.8477 curveto
+-48.81885 173.8477 -46.7161 174.71893 -45.16565 176.26938 curveto
+-43.6152 177.81982 -42.74397 179.92258 -42.74397 182.1154 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.6 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.6
new file mode 100644
index 0000000000..47a4c782fe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.6
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 235
+%%HiResBoundingBox: -235.21309 -23.96594 235.21309 234.73909
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+109.43842 211.32628 lineto
+-45.7607 177.9871 lineto
+ closepath fill
+newpath 54.53581 -13.42805 moveto
+66.18837 -30.83261 93.12303 -25.04665 96.59996 -4.39207 curveto
+96.60284 -4.37485 132.26335 207.4662 132.26625 207.48343 curveto
+134.98138 223.61272 120.56766 237.39441 104.57628 233.95924 curveto
+104.56364 233.95653 -50.60973 200.6231 -50.62236 200.62038 curveto
+-66.61374 197.18521 -74.09607 178.69994 -64.99654 165.10861 curveto
+-64.9868 165.09407 54.5261 -13.41351 54.53581 -13.42805 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 60.61024 60.72055 moveto
+80.94672 181.52823 lineto
+-7.54514 162.51892 lineto
+ closepath stroke
+newpath 54.53581 -13.42805 moveto
+66.18837 -30.83261 93.12303 -25.04665 96.59996 -4.39207 curveto
+96.60284 -4.37485 132.26335 207.4662 132.26625 207.48343 curveto
+134.98138 223.61272 120.56766 237.39441 104.57628 233.95924 curveto
+104.56364 233.95653 -50.60973 200.6231 -50.62236 200.62038 curveto
+-66.61374 197.18521 -74.09607 178.69994 -64.99654 165.10861 curveto
+-64.9868 165.09407 54.5261 -13.41351 54.53581 -13.42805 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -144.65355 28.17784 moveto
+-159.99638 9.39609 -188.16902 32.41034 -172.82619 51.1921 curveto
+-172.817 51.20334 -59.8562 189.48297 -59.84702 189.49423 curveto
+-44.50418 208.27599 -16.33154 185.26173 -31.67438 166.47998 curveto
+-31.68356 166.46872 -144.64436 28.18909 -144.65355 28.17784 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -144.65355 28.17784 moveto
+-159.99638 9.39609 -188.16902 32.41034 -172.82619 51.1921 curveto
+-172.817 51.20334 -59.8562 189.48297 -59.84702 189.49423 curveto
+-44.50418 208.27599 -16.33154 185.26173 -31.67438 166.47998 curveto
+-31.68356 166.46872 -144.64436 28.18909 -144.65355 28.17784 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.22191 44.70651 moveto
+182.91731 21.39714 147.95323 11.35405 141.25783 34.66342 curveto
+141.25381 34.67738 91.9593 206.29137 91.9553 206.30533 curveto
+85.2599 229.6147 120.22398 239.65779 126.91939 216.34842 curveto
+126.92339 216.33446 176.2179 44.72047 176.22191 44.70651 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.22191 44.70651 moveto
+182.91731 21.39714 147.95323 11.35405 141.25783 34.66342 curveto
+141.25381 34.67738 91.9593 206.29137 91.9553 206.30533 curveto
+85.2599 229.6147 120.22398 239.65779 126.91939 216.34842 curveto
+126.92339 216.33446 176.2179 44.72047 176.22191 44.70651 curveto closepath stroke
+newpath 82.0396 -0.5494 moveto
+82.0396 1.64343 81.16837 3.74619 79.61792 5.29663 curveto
+78.06747 6.84708 75.96472 7.7183 73.7719 7.7183 curveto
+71.57907 7.7183 69.47632 6.84708 67.92587 5.29663 curveto
+66.37543 3.74619 65.5042 1.64343 65.5042 -0.5494 curveto
+65.5042 -2.74222 66.37543 -4.84497 67.92587 -6.39542 curveto
+69.47632 -7.94586 71.57907 -8.8171 73.7719 -8.8171 curveto
+75.96472 -8.8171 78.06747 -7.94586 79.61792 -6.39542 curveto
+81.16837 -4.84497 82.0396 -2.74222 82.0396 -0.5494 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 117.70612 211.32628 moveto
+117.70612 213.5191 116.83488 215.62186 115.28444 217.1723 curveto
+113.734 218.72275 111.63124 219.59398 109.43842 219.59398 curveto
+107.24559 219.59398 105.14284 218.72275 103.59239 217.1723 curveto
+102.04195 215.62186 101.17072 213.5191 101.17072 211.32628 curveto
+101.17072 209.13345 102.04195 207.0307 103.59239 205.48026 curveto
+105.14284 203.92981 107.24559 203.05858 109.43842 203.05858 curveto
+111.63124 203.05858 113.734 203.92981 115.28444 205.48026 curveto
+116.83488 207.0307 117.70612 209.13345 117.70612 211.32628 curveto closepath stroke
+newpath -37.493 177.9871 moveto
+-37.493 180.17993 -38.36423 182.28268 -39.91467 183.83313 curveto
+-41.46512 185.38358 -43.56787 186.2548 -45.7607 186.2548 curveto
+-47.95352 186.2548 -50.05627 185.38358 -51.60672 183.83313 curveto
+-53.15717 182.28268 -54.0284 180.17993 -54.0284 177.9871 curveto
+-54.0284 175.79428 -53.15717 173.69153 -51.60672 172.14108 curveto
+-50.05627 170.59064 -47.95352 169.7194 -45.7607 169.7194 curveto
+-43.56787 169.7194 -41.46512 170.59064 -39.91467 172.14108 curveto
+-38.36423 173.69153 -37.493 175.79428 -37.493 177.9871 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.7 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.7
new file mode 100644
index 0000000000..8c900057e4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.7
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -25 236 236
+%%HiResBoundingBox: -235.21309 -24.02919 235.21309 235.7993
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+113.27765 212.38298 lineto
+-40.66777 173.66533 lineto
+ closepath fill
+newpath 66.22784 -14.1471 moveto
+78.47897 -31.13588 105.19632 -24.41629 107.95258 -3.65305 curveto
+107.95486 -3.63571 136.224 209.31989 136.2263 209.33722 curveto
+138.37866 225.55136 123.49405 238.8234 107.6317 234.83391 curveto
+107.61916 234.83076 -46.30214 196.11855 -46.31468 196.1154 curveto
+-62.17703 192.12592 -69.01178 173.3913 -59.44481 160.12466 curveto
+-59.43457 160.11047 66.21762 -14.1329 66.22784 -14.1471 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 69.71896 60.16872 moveto
+85.8403 181.612 lineto
+-1.93753 159.53531 lineto
+ closepath stroke
+newpath 66.22784 -14.1471 moveto
+78.47897 -31.13588 105.19632 -24.41629 107.95258 -3.65305 curveto
+107.95486 -3.63571 136.224 209.31989 136.2263 209.33722 curveto
+138.37866 225.55136 123.49405 238.8234 107.6317 234.83391 curveto
+107.61916 234.83076 -46.30214 196.11855 -46.31468 196.1154 curveto
+-62.17703 192.12592 -69.01178 173.3913 -59.44481 160.12466 curveto
+-59.43457 160.11047 66.21762 -14.1329 66.22784 -14.1471 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -145.09372 27.6591 moveto
+-161.12819 9.46425 -188.42049 33.51598 -172.38602 51.71083 curveto
+-172.37642 51.72173 -54.32352 185.6803 -54.31392 185.6912 curveto
+-38.27945 203.88605 -10.98715 179.83432 -27.02162 161.63947 curveto
+-27.03122 161.62857 -145.08412 27.67 -145.09372 27.6591 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -145.09372 27.6591 moveto
+-161.12819 9.46425 -188.42049 33.51598 -172.38602 51.71083 curveto
+-172.37642 51.72173 -54.32352 185.6803 -54.31392 185.6912 curveto
+-38.27945 203.88605 -10.98715 179.83432 -27.02162 161.63947 curveto
+-27.03122 161.62857 -145.08412 27.67 -145.09372 27.6591 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.32959 44.31546 moveto
+182.50359 20.8625 147.32414 11.60152 141.15015 35.05447 curveto
+141.14645 35.06853 95.69077 207.73961 95.68707 207.75366 curveto
+89.51308 231.20662 124.69252 240.4676 130.86652 217.01465 curveto
+130.87021 217.0006 176.3259 44.32951 176.32959 44.31546 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.32959 44.31546 moveto
+182.50359 20.8625 147.32414 11.60152 141.15015 35.05447 curveto
+141.14645 35.06853 95.69077 207.73961 95.68707 207.75366 curveto
+89.51308 231.20662 124.69252 240.4676 130.86652 217.01465 curveto
+130.87021 217.0006 176.3259 44.32951 176.32959 44.31546 curveto closepath stroke
+newpath 93.27211 -0.60686 moveto
+93.27211 1.58597 92.40088 3.68872 90.85043 5.23917 curveto
+89.29999 6.78961 87.19724 7.66084 85.00441 7.66084 curveto
+82.81158 7.66084 80.70883 6.78961 79.15839 5.23917 curveto
+77.60794 3.68872 76.73671 1.58597 76.73671 -0.60686 curveto
+76.73671 -2.79968 77.60794 -4.90244 79.15839 -6.45288 curveto
+80.70883 -8.00333 82.81158 -8.87456 85.00441 -8.87456 curveto
+87.19724 -8.87456 89.29999 -8.00333 90.85043 -6.45288 curveto
+92.40088 -4.90244 93.27211 -2.79968 93.27211 -0.60686 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 121.54535 212.38298 moveto
+121.54535 214.5758 120.67412 216.67856 119.12367 218.229 curveto
+117.57323 219.77945 115.47047 220.65068 113.27765 220.65068 curveto
+111.08482 220.65068 108.98207 219.77945 107.43163 218.229 curveto
+105.88118 216.67856 105.00995 214.5758 105.00995 212.38298 curveto
+105.00995 210.19016 105.88118 208.0874 107.43163 206.53696 curveto
+108.98207 204.98651 111.08482 204.11528 113.27765 204.11528 curveto
+115.47047 204.11528 117.57323 204.98651 119.12367 206.53696 curveto
+120.67412 208.0874 121.54535 210.19016 121.54535 212.38298 curveto closepath stroke
+newpath -32.40007 173.66533 moveto
+-32.40007 175.85815 -33.2713 177.9609 -34.82175 179.51135 curveto
+-36.3722 181.0618 -38.47495 181.93303 -40.66777 181.93303 curveto
+-42.8606 181.93303 -44.96335 181.0618 -46.5138 179.51135 curveto
+-48.06424 177.9609 -48.93547 175.85815 -48.93547 173.66533 curveto
+-48.93547 171.4725 -48.06424 169.36975 -46.5138 167.8193 curveto
+-44.96335 166.26886 -42.8606 165.39763 -40.66777 165.39763 curveto
+-38.47495 165.39763 -36.3722 166.26886 -34.82175 167.8193 curveto
+-33.2713 169.36975 -32.40007 171.4725 -32.40007 173.66533 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.8 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.8
new file mode 100644
index 0000000000..26690e4b88
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.8
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -25 236 237
+%%HiResBoundingBox: -235.21309 -24.02069 235.21309 236.67873
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+116.74828 213.25989 lineto
+-35.74106 169.15553 lineto
+ closepath fill
+newpath 77.68956 -14.78412 moveto
+90.53026 -31.33186 116.99495 -23.67737 119.01973 -2.83005 curveto
+119.02141 -2.81264 139.78833 211.00528 139.79002 211.02267 curveto
+141.37119 227.30249 126.02925 240.04318 110.31691 235.49864 curveto
+110.30449 235.49506 -42.16133 191.39679 -42.17375 191.3932 curveto
+-57.8861 186.84866 -64.05817 167.88538 -54.0308 154.96317 curveto
+-54.02008 154.94934 77.67885 -14.77031 77.68956 -14.78412 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 78.56653 59.60858 moveto
+90.40956 181.54366 lineto
+3.46175 156.3954 lineto
+ closepath stroke
+newpath 77.68956 -14.78412 moveto
+90.53026 -31.33186 116.99495 -23.67737 119.01973 -2.83005 curveto
+119.02141 -2.81264 139.78833 211.00528 139.79002 211.02267 curveto
+141.37119 227.30249 126.02925 240.04318 110.31691 235.49864 curveto
+110.30449 235.49506 -42.16133 191.39679 -42.17375 191.3932 curveto
+-57.8861 186.84866 -64.05817 167.88538 -54.0308 154.96317 curveto
+-54.02008 154.94934 77.67885 -14.77031 77.68956 -14.78412 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -145.55305 27.15732 moveto
+-162.25659 9.5749 -188.63022 34.6302 -171.92668 52.21262 curveto
+-171.91667 52.22314 -48.93788 181.67265 -48.92787 181.68318 curveto
+-32.22433 199.2656 -5.85071 174.2103 -22.55424 156.62788 curveto
+-22.56425 156.61736 -145.54305 27.16785 -145.55305 27.15732 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -145.55305 27.15732 moveto
+-162.25659 9.5749 -188.63022 34.6302 -171.92668 52.21262 curveto
+-171.91667 52.22314 -48.93788 181.67265 -48.92787 181.68318 curveto
+-32.22433 199.2656 -5.85071 174.2103 -22.55424 156.62788 curveto
+-22.56425 156.61736 -145.54305 27.16785 -145.55305 27.15732 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.41869 43.96187 moveto
+182.12123 20.39012 146.7636 11.83632 141.06105 35.40807 curveto
+141.05763 35.42218 99.07298 208.96783 99.06956 208.98196 curveto
+93.36702 232.55371 128.72466 241.10751 134.4272 217.53577 curveto
+134.43062 217.52164 176.41527 43.97598 176.41869 43.96187 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.41869 43.96187 moveto
+182.12123 20.39012 146.7636 11.83632 141.06105 35.40807 curveto
+141.05763 35.42218 99.07298 208.96783 99.06956 208.98196 curveto
+93.36702 232.55371 128.72466 241.10751 134.4272 217.53577 curveto
+134.43062 217.52164 176.41527 43.97598 176.41869 43.96187 curveto closepath stroke
+newpath 104.24635 -0.5923 moveto
+104.24635 1.60052 103.37512 3.70328 101.82468 5.25372 curveto
+100.27423 6.80417 98.17148 7.6754 95.97865 7.6754 curveto
+93.78583 7.6754 91.68307 6.80417 90.13263 5.25372 curveto
+88.58218 3.70328 87.71095 1.60052 87.71095 -0.5923 curveto
+87.71095 -2.78513 88.58218 -4.88788 90.13263 -6.43832 curveto
+91.68307 -7.98877 93.78583 -8.86 95.97865 -8.86 curveto
+98.17148 -8.86 100.27423 -7.98877 101.82468 -6.43832 curveto
+103.37512 -4.88788 104.24635 -2.78513 104.24635 -0.5923 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 125.01598 213.25989 moveto
+125.01598 215.45271 124.14474 217.55547 122.5943 219.10591 curveto
+121.04385 220.65636 118.9411 221.52759 116.74828 221.52759 curveto
+114.55545 221.52759 112.4527 220.65636 110.90225 219.10591 curveto
+109.3518 217.55547 108.48058 215.45271 108.48058 213.25989 curveto
+108.48058 211.06706 109.3518 208.96431 110.90225 207.41386 curveto
+112.4527 205.86342 114.55545 204.99219 116.74828 204.99219 curveto
+118.9411 204.99219 121.04385 205.86342 122.5943 207.41386 curveto
+124.14474 208.96431 125.01598 211.06706 125.01598 213.25989 curveto closepath stroke
+newpath -27.47336 169.15553 moveto
+-27.47336 171.34836 -28.34459 173.45111 -29.89503 175.00156 curveto
+-31.44548 176.552 -33.54823 177.42323 -35.74106 177.42323 curveto
+-37.93388 177.42323 -40.03664 176.552 -41.58708 175.00156 curveto
+-43.13753 173.45111 -44.00876 171.34836 -44.00876 169.15553 curveto
+-44.00876 166.9627 -43.13753 164.85995 -41.58708 163.30951 curveto
+-40.03664 161.75906 -37.93388 160.88783 -35.74106 160.88783 curveto
+-33.54823 160.88783 -31.44548 161.75906 -29.89503 163.30951 curveto
+-28.34459 164.85995 -27.47336 166.9627 -27.47336 169.15553 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.9 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.9
new file mode 100644
index 0000000000..38ef570dcc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.9
@@ -0,0 +1,151 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -236 -24 236 238
+%%HiResBoundingBox: -235.21309 -23.91325 235.21309 237.3948
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 1 1 1 setrgbcolor
+newpath -158.73987 39.68497 moveto
+158.73987 39.68497 lineto
+119.83644 213.97833 lineto
+-30.98329 164.4659 lineto
+ closepath fill
+newpath 88.9302 -15.31325 moveto
+102.35233 -31.39253 128.52698 -22.79977 129.8074 -1.89388 curveto
+129.80847 -1.87642 142.94102 212.54243 142.94208 212.55988 curveto
+143.94197 228.88542 128.15593 241.07101 112.61578 235.96942 curveto
+112.60352 235.9654 -38.19128 186.4617 -38.20355 186.45767 curveto
+-53.7437 181.35608 -59.23586 162.18517 -48.75446 149.62875 curveto
+-48.74324 149.61534 88.919 -15.29982 88.9302 -15.31325 curveto closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 87.15512 59.06227 moveto
+94.64445 181.34003 lineto
+8.64961 153.10919 lineto
+ closepath stroke
+newpath 88.9302 -15.31325 moveto
+102.35233 -31.39253 128.52698 -22.79977 129.8074 -1.89388 curveto
+129.80847 -1.87642 142.94102 212.54243 142.94208 212.55988 curveto
+143.94197 228.88542 128.15593 241.07101 112.61578 235.96942 curveto
+112.60352 235.9654 -38.19128 186.4617 -38.20355 186.45767 curveto
+-53.7437 181.35608 -59.23586 162.18517 -48.75446 149.62875 curveto
+-48.74324 149.61534 88.919 -15.29982 88.9302 -15.31325 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -158.73987 26.45665 moveto
+-176.37762 26.45667 -176.37762 52.91327 -158.73987 52.91328 curveto
+-158.71404 52.91328 158.71404 52.91328 158.73987 52.91328 curveto
+176.37762 52.91327 176.37762 26.45667 158.73987 26.45665 curveto
+158.71404 26.45665 -158.71404 26.45665 -158.73987 26.45665 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath -146.0307 26.67273 moveto
+-163.38034 9.72719 -188.79868 35.75166 -171.44904 52.6972 curveto
+-171.43864 52.70735 -43.70285 177.46799 -43.69246 177.47813 curveto
+-26.34282 194.42368 -0.92448 168.3992 -18.27412 151.45366 curveto
+-18.28452 151.44351 -146.02031 26.68288 -146.0307 26.67273 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -146.0307 26.67273 moveto
+-163.38034 9.72719 -188.79868 35.75166 -171.44904 52.6972 curveto
+-171.43864 52.70735 -43.70285 177.46799 -43.69246 177.47813 curveto
+-26.34282 194.42368 -0.92448 168.3992 -18.27412 151.45366 curveto
+-18.28452 151.44351 -146.02031 26.68288 -146.0307 26.67273 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 176.49196 43.64742 moveto
+181.77522 19.97798 146.27104 12.05309 140.98778 35.72252 curveto
+140.98462 35.7367 102.08682 210.00162 102.08366 210.0158 curveto
+96.80038 233.68524 132.30457 241.61014 137.58784 217.94069 curveto
+137.591 217.92651 176.4888 43.66159 176.49196 43.64742 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 176.49196 43.64742 moveto
+181.77522 19.97798 146.27104 12.05309 140.98778 35.72252 curveto
+140.98462 35.7367 102.08682 210.00162 102.08366 210.0158 curveto
+96.80038 233.68524 132.30457 241.61014 137.58784 217.94069 curveto
+137.591 217.92651 176.4888 43.66159 176.49196 43.64742 curveto closepath stroke
+newpath 114.96927 -0.4788 moveto
+114.96927 1.71402 114.09804 3.81677 112.54759 5.36722 curveto
+110.99715 6.91766 108.8944 7.7889 106.70157 7.7889 curveto
+104.50874 7.7889 102.40599 6.91766 100.85555 5.36722 curveto
+99.3051 3.81677 98.43387 1.71402 98.43387 -0.4788 curveto
+98.43387 -2.67163 99.3051 -4.77438 100.85555 -6.32483 curveto
+102.40599 -7.87527 104.50874 -8.7465 106.70157 -8.7465 curveto
+108.8944 -8.7465 110.99715 -7.87527 112.54759 -6.32483 curveto
+114.09804 -4.77438 114.96927 -2.67163 114.96927 -0.4788 curveto closepath stroke
+newpath -150.47217 39.68497 moveto
+-150.47217 41.87779 -151.3434 43.98055 -152.89384 45.53099 curveto
+-154.44429 47.08144 -156.54704 47.95267 -158.73987 47.95267 curveto
+-160.9327 47.95267 -163.03545 47.08144 -164.58589 45.53099 curveto
+-166.13634 43.98055 -167.00757 41.87779 -167.00757 39.68497 curveto
+-167.00757 37.49214 -166.13634 35.38939 -164.58589 33.83894 curveto
+-163.03545 32.2885 -160.9327 31.41727 -158.73987 31.41727 curveto
+-156.54704 31.41727 -154.44429 32.2885 -152.89384 33.83894 curveto
+-151.3434 35.38939 -150.47217 37.49214 -150.47217 39.68497 curveto closepath stroke
+newpath 167.00757 39.68497 moveto
+167.00757 41.87779 166.13634 43.98055 164.58589 45.53099 curveto
+163.03545 47.08144 160.9327 47.95267 158.73987 47.95267 curveto
+156.54704 47.95267 154.44429 47.08144 152.89384 45.53099 curveto
+151.3434 43.98055 150.47217 41.87779 150.47217 39.68497 curveto
+150.47217 37.49214 151.3434 35.38939 152.89384 33.83894 curveto
+154.44429 32.2885 156.54704 31.41727 158.73987 31.41727 curveto
+160.9327 31.41727 163.03545 32.2885 164.58589 33.83894 curveto
+166.13634 35.38939 167.00757 37.49214 167.00757 39.68497 curveto closepath stroke
+newpath 128.10414 213.97833 moveto
+128.10414 216.17116 127.23291 218.27391 125.68246 219.82436 curveto
+124.13202 221.3748 122.02927 222.24603 119.83644 222.24603 curveto
+117.64362 222.24603 115.54086 221.3748 113.99042 219.82436 curveto
+112.43997 218.27391 111.56874 216.17116 111.56874 213.97833 curveto
+111.56874 211.7855 112.43997 209.68275 113.99042 208.13231 curveto
+115.54086 206.58186 117.64362 205.71063 119.83644 205.71063 curveto
+122.02927 205.71063 124.13202 206.58186 125.68246 208.13231 curveto
+127.23291 209.68275 128.10414 211.7855 128.10414 213.97833 curveto closepath stroke
+newpath -22.71559 164.4659 moveto
+-22.71559 166.65872 -23.58682 168.76147 -25.13727 170.31192 curveto
+-26.68771 171.86237 -28.79047 172.7336 -30.98329 172.7336 curveto
+-33.17612 172.7336 -35.27887 171.86237 -36.82932 170.31192 curveto
+-38.37976 168.76147 -39.25099 166.65872 -39.25099 164.4659 curveto
+-39.25099 162.27307 -38.37976 160.17032 -36.82932 158.61987 curveto
+-35.27887 157.06943 -33.17612 156.1982 -30.98329 156.1982 curveto
+-28.79047 156.1982 -26.68771 157.06943 -25.13727 158.61987 curveto
+-23.58682 160.17032 -22.71559 162.27307 -22.71559 164.4659 curveto closepath stroke
+ 0 1.99252 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -234.21683 50.71095 moveto 0 0 rlineto stroke
+newpath -13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath 13.21188 -0.02884 moveto 0 0 rlineto stroke
+newpath -25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath 25.99905 -0.09993 moveto 0 0 rlineto stroke
+newpath -38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath 38.4181 -0.20349 moveto 0 0 rlineto stroke
+newpath -50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath 50.49918 -0.32678 moveto 0 0 rlineto stroke
+newpath -62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath 62.27554 -0.44943 moveto 0 0 rlineto stroke
+newpath -73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath 73.7719 -0.5494 moveto 0 0 rlineto stroke
+newpath -85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath 85.00441 -0.60686 moveto 0 0 rlineto stroke
+newpath -95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath 95.97865 -0.5923 moveto 0 0 rlineto stroke
+newpath -106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath 106.699 -0.47893 moveto 0 0 rlineto stroke
+newpath -117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath 117.17393 -0.23697 moveto 0 0 rlineto stroke
+newpath -127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath 127.39426 0.1655 moveto 0 0 rlineto stroke
+newpath -137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath 137.35056 0.75992 moveto 0 0 rlineto stroke
+newpath -147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath 147.03352 1.5807 moveto 0 0 rlineto stroke
+newpath -156.42484 2.6624 moveto 0 0 rlineto stroke
+newpath 156.42484 2.6624 moveto 0 0 rlineto stroke
+ 0 2.98878 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto 0 0 rlineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.mp
new file mode 100644
index 0000000000..6f46dd450d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/pifpafpropaganda.mp
@@ -0,0 +1,139 @@
+% pifpafpropaganda.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+numeric index;
+for index=1 upto 15:
+beginfig(index);
+ numeric u, siz, lena, lenb, lenc, anga, angb, angc, astep;
+ numeric deltar, angf, angx;
+ u = 7mm;
+ siz = 11u;
+ lena = 9u;
+ lenb = 8u;
+ lenc = 4u;
+ deltar = 0.25u;
+ angf = index/15;
+ z1 = (-lenb,siz-lena);
+ z2 = (lenb,siz-lena);
+ path circa, circb;
+ numeric auxa, auxb, auxc, lend;
+ auxa = 2*(lena+2*lenc);
+ auxb = 2*lena;
+ circa = fullcircle scaled auxa shifted z1;
+ circb = fullcircle scaled auxb shifted z2;
+ z3 = circa intersectionpoint circb;
+ anga = angle(z3-z1);
+ angb = 180-angle(z3-z2);
+ auxc = lena +-+ (lenb-lenc);
+ angc = angle(lenb-lenc,auxc);
+ show (anga,angc,angb);
+ angx = angf[angc,anga];
+ astep = (angc-anga)/15;
+ z4 = z2+(lenc-lenb,auxc);
+ z5 = z1+(lenb-lenc,auxc);
+ z6 = z1+lena*dir(anga);
+ z7 = 0.5[z6,z3];
+ lend = siz-lena+auxc;
+ z8 = z7+lend*dir(anga-90);
+ pair q;
+ q = whatever*(-y8,x8)+0.5z8;
+ xpart q = 0;
+ message "Length factor: " & decimal( (ypart q)/siz );
+ numeric raya, rayb, rayc, angd, rayd;
+ rayb = (siz-lena)/3;
+ raya = rayb+deltar;
+ rayc = raya+deltar;
+ rayd = rayb-deltar;
+ drawoptions( withcolor blue );
+ z101 = (0,-raya);
+ z102 = (0,raya);
+ z103 = (lena,raya);
+ z104 = (lena,-raya);
+ path ad, a, b, c, d, ci, ax;
+ ad = z101..z102---z103..z104---cycle;
+ a = ad rotated angc shifted z1;
+ d = ad rotated (180-angc) shifted z2;
+ z201 = (0,-rayb);
+ z202 = (0,rayb);
+ z203 = (2lenb,rayb);
+ z204 = (2lenb,-rayb);
+ b = (z201..z202---z203..z204---cycle) shifted z1;
+ angd = angle(z4);
+ z301 = rayc*dir(270-angd);
+ z302 = rayc*dir(angd-90);
+ z303 = z4+rayc*dir(angd-90);
+ z304 = z4+(0,rayc);
+ z305 = z5+(0,rayc);
+ z306 = z5+rayc*dir(270-angd);
+ c = z301..z302---z303..z304---z305..z306---cycle;
+ z401 = (0,rayc/sind(90-angd));
+ z402 = z4+dir(180+0.5angd)*rayc/sind(0.5*angd);
+ ci = z401--z402--(-x402,y402)--cycle;
+ unfill z1--z2--z4--z5--cycle;
+ unfill c;
+ draw ci;
+ draw c;
+ unfill b;
+ draw b;
+ unfill a;
+ draw a;
+ unfill d;
+ draw d;
+ ax = fullcircle scaled (2rayd);
+ draw ax;
+ draw ax shifted z1;
+ draw ax shifted z2;
+ draw ax shifted z4;
+ draw ax shifted z5;
+ picture tmp;
+ tmp = currentpicture;
+ currentpicture := nullpicture;
+ drawoptions();
+ %draw z1--z2--z4--z5--cycle;
+ %draw z1--z2--z3--cycle;
+ %draw z8--z7;
+ %dotlabels.top(1,2,3,4,5,6,7,8);
+ numeric i, diamc;
+ pair parp, intp, pa, pb;
+ diamc = 4*lenc;
+ parp = z1+lena*dir(angx);
+ circa := fullcircle scaled diamc shifted parp;
+ intp = circa intersectionpoint circb;
+ pa = 0.5[parp,intp];
+ pb = pa+lend*unitvector((ypart (intp-parp),-xpart (intp-parp)));
+ unfill z1--z2--intp--parp--cycle;
+ unfill c rotated (angle(intp-parp)) shifted pb;
+ draw ci rotated (angle(intp-parp)) shifted pb;
+ draw c rotated (angle(intp-parp)) shifted pb;
+ unfill b;
+ draw b;
+ unfill ad rotated angx shifted z1;
+ draw ad rotated angx shifted z1;
+ unfill ad rotated (angle(intp-z2)) shifted z2;
+ draw ad rotated (angle(intp-z2)) shifted z2;
+ draw ax shifted pb;
+ draw ax shifted z1;
+ draw ax shifted z2;
+ draw ax shifted intp;
+ draw ax shifted parp;
+ for i=angc step -astep until anga:
+ parp := z1+lena*dir(i);
+ circa := fullcircle scaled diamc shifted parp;
+ intp := circa intersectionpoint circb;
+ pa := 0.5[parp,intp];
+ pb := lend*unitvector((ypart (intp-parp),-xpart (intp-parp)));
+ %draw pa--(pa+pb);
+ draw (-xpart (pa+pb),ypart (pa+pb)) withpen pencircle scaled 2pt;
+ draw (pa+pb) withpen pencircle scaled 2pt;
+ endfor;
+ draw origin withpen pencircle scaled 3pt;
+endfig;
+endfor;
+
+beginfig(0);
+ draw tmp;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.1 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.1
new file mode 100644
index 0000000000..1d08cbbafa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.1
@@ -0,0 +1,6157 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 -83 284 246
+%%HiResBoundingBox: -0.2536 -82.0819 283.71812 245.73816
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2237
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0.58322 1.01016 lineto stroke
+newpath 0.58322 1.01016 moveto
+-0.00002 2.02037 lineto stroke
+newpath -0.00002 2.02037 moveto
+1.16646 2.02037 lineto stroke
+newpath 1.16646 2.02037 moveto
+1.74968 3.03053 lineto stroke
+newpath 1.74968 3.03053 moveto
+1.16643 4.04074 lineto stroke
+newpath 1.16643 4.04074 moveto
+-0.0001 4.04074 lineto stroke
+newpath -0.0001 4.04074 moveto
+0.58316 5.05098 lineto stroke
+newpath 0.58316 5.05098 moveto
+-0.00009 6.06119 lineto stroke
+newpath -0.00009 6.06119 moveto
+1.1664 6.06119 lineto stroke
+newpath 1.1664 6.06119 moveto
+1.74965 7.07146 lineto stroke
+newpath 1.74965 7.07146 moveto
+2.33293 6.0612 lineto stroke
+newpath 2.33293 6.0612 moveto
+3.49942 6.0612 lineto stroke
+newpath 3.49942 6.0612 moveto
+4.08264 7.07137 lineto stroke
+newpath 4.08264 7.07137 moveto
+3.4994 8.08157 lineto stroke
+newpath 3.4994 8.08157 moveto
+4.66588 8.08157 lineto stroke
+newpath 4.66588 8.08157 moveto
+5.2491 9.09174 lineto stroke
+newpath 5.2491 9.09174 moveto
+4.66585 10.10194 lineto stroke
+newpath 4.66585 10.10194 moveto
+3.4993 10.10194 lineto stroke
+newpath 3.4993 10.10194 moveto
+4.08258 11.1122 lineto stroke
+newpath 4.08258 11.1122 moveto
+3.49933 12.1224 lineto stroke
+newpath 3.49933 12.1224 moveto
+2.33278 12.1224 lineto stroke
+newpath 2.33278 12.1224 moveto
+1.74948 11.1121 lineto stroke
+newpath 1.74948 11.1121 moveto
+1.16618 12.1224 lineto stroke
+newpath 1.16618 12.1224 moveto
+-0.00037 12.1224 lineto stroke
+newpath -0.00037 12.1224 moveto
+0.5829 13.13266 lineto stroke
+newpath 0.5829 13.13266 moveto
+-0.0004 14.14299 lineto stroke
+newpath -0.0004 14.14299 moveto
+1.16621 14.14297 lineto stroke
+newpath 1.16621 14.14297 moveto
+1.74948 15.15323 lineto stroke
+newpath 1.74948 15.15323 moveto
+1.16623 16.16344 lineto stroke
+newpath 1.16623 16.16344 moveto
+-0.00032 16.16344 lineto stroke
+newpath -0.00032 16.16344 moveto
+0.58296 17.17369 lineto stroke
+newpath 0.58296 17.17369 moveto
+-0.00029 18.1839 lineto stroke
+newpath -0.00029 18.1839 moveto
+1.1662 18.1839 lineto stroke
+newpath 1.1662 18.1839 moveto
+1.74948 19.19417 lineto stroke
+newpath 1.74948 19.19417 moveto
+2.33275 18.1839 lineto stroke
+newpath 2.33275 18.1839 moveto
+3.49924 18.1839 lineto stroke
+newpath 3.49924 18.1839 moveto
+4.0825 19.19415 lineto stroke
+newpath 4.0825 19.19415 moveto
+3.4992 20.20448 lineto stroke
+newpath 3.4992 20.20448 moveto
+4.66582 20.20447 lineto stroke
+newpath 4.66582 20.20447 moveto
+5.24908 21.21472 lineto stroke
+newpath 5.24908 21.21472 moveto
+5.83235 20.20447 lineto stroke
+newpath 5.83235 20.20447 moveto
+6.99896 20.20447 lineto stroke
+newpath 6.99896 20.20447 moveto
+6.41565 19.19415 lineto stroke
+newpath 6.41565 19.19415 moveto
+6.99892 18.1839 lineto stroke
+newpath 6.99892 18.1839 moveto
+8.1654 18.1839 lineto stroke
+newpath 8.1654 18.1839 moveto
+8.74869 19.19417 lineto stroke
+newpath 8.74869 19.19417 moveto
+9.33195 18.1839 lineto stroke
+newpath 9.33195 18.1839 moveto
+10.49844 18.1839 lineto stroke
+newpath 10.49844 18.1839 moveto
+11.08167 19.19406 lineto stroke
+newpath 11.08167 19.19406 moveto
+10.49843 20.20427 lineto stroke
+newpath 10.49843 20.20427 moveto
+11.6649 20.20427 lineto stroke
+newpath 11.6649 20.20427 moveto
+12.24812 21.21443 lineto stroke
+newpath 12.24812 21.21443 moveto
+11.66487 22.22464 lineto stroke
+newpath 11.66487 22.22464 moveto
+10.49834 22.22464 lineto stroke
+newpath 10.49834 22.22464 moveto
+11.0816 23.23488 lineto stroke
+newpath 11.0816 23.23488 moveto
+10.49835 24.24509 lineto stroke
+newpath 10.49835 24.24509 moveto
+11.66484 24.24509 lineto stroke
+newpath 11.66484 24.24509 moveto
+12.2481 25.25536 lineto stroke
+newpath 12.2481 25.25536 moveto
+12.83138 24.2451 lineto stroke
+newpath 12.83138 24.2451 moveto
+13.99786 24.2451 lineto stroke
+newpath 13.99786 24.2451 moveto
+14.58109 25.25526 lineto stroke
+newpath 14.58109 25.25526 moveto
+13.99785 26.26547 lineto stroke
+newpath 13.99785 26.26547 moveto
+15.16432 26.26547 lineto stroke
+newpath 15.16432 26.26547 moveto
+15.74754 27.27563 lineto stroke
+newpath 15.74754 27.27563 moveto
+15.16429 28.28584 lineto stroke
+newpath 15.16429 28.28584 moveto
+13.99774 28.28584 lineto stroke
+newpath 13.99774 28.28584 moveto
+14.58102 29.2961 lineto stroke
+newpath 14.58102 29.2961 moveto
+13.99777 30.3063 lineto stroke
+newpath 13.99777 30.3063 moveto
+12.83122 30.3063 lineto stroke
+newpath 12.83122 30.3063 moveto
+12.24791 29.29602 lineto stroke
+newpath 12.24791 29.29602 moveto
+11.66463 30.30632 lineto stroke
+newpath 11.66463 30.30632 moveto
+10.49808 30.30632 lineto stroke
+newpath 10.49808 30.30632 moveto
+11.08136 31.31657 lineto stroke
+newpath 11.08136 31.31657 moveto
+10.49806 32.32689 lineto stroke
+newpath 10.49806 32.32689 moveto
+11.66466 32.32687 lineto stroke
+newpath 11.66466 32.32687 moveto
+12.24794 33.33713 lineto stroke
+newpath 12.24794 33.33713 moveto
+11.66469 34.34734 lineto stroke
+newpath 11.66469 34.34734 moveto
+10.49814 34.34734 lineto stroke
+newpath 10.49814 34.34734 moveto
+11.08142 35.35759 lineto stroke
+newpath 11.08142 35.35759 moveto
+10.49817 36.3678 lineto stroke
+newpath 10.49817 36.3678 moveto
+9.33162 36.3678 lineto stroke
+newpath 9.33162 36.3678 moveto
+8.74834 35.35748 lineto stroke
+newpath 8.74834 35.35748 moveto
+8.16502 36.36778 lineto stroke
+newpath 8.16502 36.36778 moveto
+6.99847 36.36778 lineto stroke
+newpath 6.99847 36.36778 moveto
+6.41518 35.35748 lineto stroke
+newpath 6.41518 35.35748 moveto
+6.99852 34.34712 lineto stroke
+newpath 6.99852 34.34712 moveto
+5.83186 34.34712 lineto stroke
+newpath 5.83186 34.34712 moveto
+5.24857 33.33682 lineto stroke
+newpath 5.24857 33.33682 moveto
+4.66527 34.34712 lineto stroke
+newpath 4.66527 34.34712 moveto
+3.49861 34.34712 lineto stroke
+newpath 3.49861 34.34712 moveto
+4.08194 35.35747 lineto stroke
+newpath 4.08194 35.35747 moveto
+3.49864 36.36777 lineto stroke
+newpath 3.49864 36.36777 moveto
+2.33209 36.36777 lineto stroke
+newpath 2.33209 36.36777 moveto
+1.74881 35.35745 lineto stroke
+newpath 1.74881 35.35745 moveto
+1.1655 36.36775 lineto stroke
+newpath 1.1655 36.36775 moveto
+-0.00105 36.36775 lineto stroke
+newpath -0.00105 36.36775 moveto
+0.58221 37.378 lineto stroke
+newpath 0.58221 37.378 moveto
+-0.00108 38.38832 lineto stroke
+newpath -0.00108 38.38832 moveto
+1.16551 38.38832 lineto stroke
+newpath 1.16551 38.38832 moveto
+1.74878 39.39857 lineto stroke
+newpath 1.74878 39.39857 moveto
+1.16548 40.40889 lineto stroke
+newpath 1.16548 40.40889 moveto
+-0.00117 40.40889 lineto stroke
+newpath -0.00117 40.40889 moveto
+0.58215 41.41924 lineto stroke
+newpath 0.58215 41.41924 moveto
+-0.00114 42.42955 lineto stroke
+newpath -0.00114 42.42955 moveto
+1.16545 42.42955 lineto stroke
+newpath 1.16545 42.42955 moveto
+1.7488 43.4399 lineto stroke
+newpath 1.7488 43.4399 moveto
+2.3321 42.42953 lineto stroke
+newpath 2.3321 42.42953 moveto
+3.4987 42.42953 lineto stroke
+newpath 3.4987 42.42953 moveto
+4.08197 43.43979 lineto stroke
+newpath 4.08197 43.43979 moveto
+3.49867 44.4501 lineto stroke
+newpath 3.49867 44.4501 moveto
+4.66527 44.4501 lineto stroke
+newpath 4.66527 44.4501 moveto
+5.24854 45.46036 lineto stroke
+newpath 5.24854 45.46036 moveto
+4.66528 46.47057 lineto stroke
+newpath 4.66528 46.47057 moveto
+3.49873 46.47057 lineto stroke
+newpath 3.49873 46.47057 moveto
+4.08202 47.48082 lineto stroke
+newpath 4.08202 47.48082 moveto
+3.49876 48.49103 lineto stroke
+newpath 3.49876 48.49103 moveto
+2.33221 48.49103 lineto stroke
+newpath 2.33221 48.49103 moveto
+1.7489 47.48074 lineto stroke
+newpath 1.7489 47.48074 moveto
+1.16562 48.49104 lineto stroke
+newpath 1.16562 48.49104 moveto
+-0.00093 48.49104 lineto stroke
+newpath -0.00093 48.49104 moveto
+0.58235 49.5013 lineto stroke
+newpath 0.58235 49.5013 moveto
+-0.00095 50.51161 lineto stroke
+newpath -0.00095 50.51161 moveto
+1.16565 50.5116 lineto stroke
+newpath 1.16565 50.5116 moveto
+1.74893 51.52185 lineto stroke
+newpath 1.74893 51.52185 moveto
+1.16568 52.53206 lineto stroke
+newpath 1.16568 52.53206 moveto
+-0.00087 52.53206 lineto stroke
+newpath -0.00087 52.53206 moveto
+0.58241 53.54231 lineto stroke
+newpath 0.58241 53.54231 moveto
+-0.00084 54.55252 lineto stroke
+newpath -0.00084 54.55252 moveto
+1.16565 54.55252 lineto stroke
+newpath 1.16565 54.55252 moveto
+1.74893 55.56279 lineto stroke
+newpath 1.74893 55.56279 moveto
+2.3322 54.55252 lineto stroke
+newpath 2.3322 54.55252 moveto
+3.49869 54.55252 lineto stroke
+newpath 3.49869 54.55252 moveto
+4.08195 55.56277 lineto stroke
+newpath 4.08195 55.56277 moveto
+3.49866 56.5731 lineto stroke
+newpath 3.49866 56.5731 moveto
+4.66527 56.57309 lineto stroke
+newpath 4.66527 56.57309 moveto
+5.24854 57.58334 lineto stroke
+newpath 5.24854 57.58334 moveto
+5.8318 56.57309 lineto stroke
+newpath 5.8318 56.57309 moveto
+6.99841 56.57309 lineto stroke
+newpath 6.99841 56.57309 moveto
+6.4151 55.56277 lineto stroke
+newpath 6.4151 55.56277 moveto
+6.99837 54.55252 lineto stroke
+newpath 6.99837 54.55252 moveto
+8.16486 54.55252 lineto stroke
+newpath 8.16486 54.55252 moveto
+8.74814 55.56279 lineto stroke
+newpath 8.74814 55.56279 moveto
+9.3314 54.55252 lineto stroke
+newpath 9.3314 54.55252 moveto
+10.4979 54.55252 lineto stroke
+newpath 10.4979 54.55252 moveto
+11.08116 55.56277 lineto stroke
+newpath 11.08116 55.56277 moveto
+10.49786 56.5731 lineto stroke
+newpath 10.49786 56.5731 moveto
+11.66447 56.57307 lineto stroke
+newpath 11.66447 56.57307 moveto
+12.24774 57.58333 lineto stroke
+newpath 12.24774 57.58333 moveto
+11.66444 58.59364 lineto stroke
+newpath 11.66444 58.59364 moveto
+10.49779 58.59364 lineto stroke
+newpath 10.49779 58.59364 moveto
+11.08112 59.60399 lineto stroke
+newpath 11.08112 59.60399 moveto
+10.49782 60.6143 lineto stroke
+newpath 10.49782 60.6143 moveto
+11.66441 60.6143 lineto stroke
+newpath 11.66441 60.6143 moveto
+12.24776 61.62465 lineto stroke
+newpath 12.24776 61.62465 moveto
+12.83107 60.61429 lineto stroke
+newpath 12.83107 60.61429 moveto
+13.99767 60.61429 lineto stroke
+newpath 13.99767 60.61429 moveto
+14.58093 61.62454 lineto stroke
+newpath 14.58093 61.62454 moveto
+13.99763 62.63487 lineto stroke
+newpath 13.99763 62.63487 moveto
+15.16425 62.63484 lineto stroke
+newpath 15.16425 62.63484 moveto
+15.74751 63.6451 lineto stroke
+newpath 15.74751 63.6451 moveto
+16.33078 62.63484 lineto stroke
+newpath 16.33078 62.63484 moveto
+17.49739 62.63484 lineto stroke
+newpath 17.49739 62.63484 moveto
+16.91408 61.62453 lineto stroke
+newpath 16.91408 61.62453 moveto
+17.49734 60.61427 lineto stroke
+newpath 17.49734 60.61427 moveto
+18.66394 60.61427 lineto stroke
+newpath 18.66394 60.61427 moveto
+19.24727 61.62462 lineto stroke
+newpath 19.24727 61.62462 moveto
+19.83058 60.61427 lineto stroke
+newpath 19.83058 60.61427 moveto
+20.99718 60.61427 lineto stroke
+newpath 20.99718 60.61427 moveto
+20.41388 59.60397 lineto stroke
+newpath 20.41388 59.60397 moveto
+20.9972 58.59363 lineto stroke
+newpath 20.9972 58.59363 moveto
+19.83055 58.59363 lineto stroke
+newpath 19.83055 58.59363 moveto
+19.24725 57.58333 lineto stroke
+newpath 19.24725 57.58333 moveto
+19.83052 56.57307 lineto stroke
+newpath 19.83052 56.57307 moveto
+20.99713 56.57307 lineto stroke
+newpath 20.99713 56.57307 moveto
+20.41382 55.56276 lineto stroke
+newpath 20.41382 55.56276 moveto
+20.99709 54.5525 lineto stroke
+newpath 20.99709 54.5525 moveto
+22.16357 54.5525 lineto stroke
+newpath 22.16357 54.5525 moveto
+22.74686 55.56277 lineto stroke
+newpath 22.74686 55.56277 moveto
+23.33012 54.5525 lineto stroke
+newpath 23.33012 54.5525 moveto
+24.49661 54.5525 lineto stroke
+newpath 24.49661 54.5525 moveto
+25.07988 55.56276 lineto stroke
+newpath 25.07988 55.56276 moveto
+24.49658 56.57309 lineto stroke
+newpath 24.49658 56.57309 moveto
+25.6632 56.57307 lineto stroke
+newpath 25.6632 56.57307 moveto
+26.24646 57.58333 lineto stroke
+newpath 26.24646 57.58333 moveto
+26.82973 56.57307 lineto stroke
+newpath 26.82973 56.57307 moveto
+27.99634 56.57307 lineto stroke
+newpath 27.99634 56.57307 moveto
+27.41302 55.56276 lineto stroke
+newpath 27.41302 55.56276 moveto
+27.99629 54.5525 lineto stroke
+newpath 27.99629 54.5525 moveto
+29.16278 54.5525 lineto stroke
+newpath 29.16278 54.5525 moveto
+29.74606 55.56277 lineto stroke
+newpath 29.74606 55.56277 moveto
+30.32933 54.5525 lineto stroke
+newpath 30.32933 54.5525 moveto
+31.49582 54.5525 lineto stroke
+newpath 31.49582 54.5525 moveto
+32.07904 55.56267 lineto stroke
+newpath 32.07904 55.56267 moveto
+31.4958 56.57288 lineto stroke
+newpath 31.4958 56.57288 moveto
+32.66228 56.57288 lineto stroke
+newpath 32.66228 56.57288 moveto
+33.2455 57.58304 lineto stroke
+newpath 33.2455 57.58304 moveto
+32.66225 58.59325 lineto stroke
+newpath 32.66225 58.59325 moveto
+31.49571 58.59325 lineto stroke
+newpath 31.49571 58.59325 moveto
+32.07898 59.60349 lineto stroke
+newpath 32.07898 59.60349 moveto
+31.49573 60.6137 lineto stroke
+newpath 31.49573 60.6137 moveto
+32.66222 60.6137 lineto stroke
+newpath 32.66222 60.6137 moveto
+33.24547 61.62396 lineto stroke
+newpath 33.24547 61.62396 moveto
+33.82875 60.61371 lineto stroke
+newpath 33.82875 60.61371 moveto
+34.99524 60.61371 lineto stroke
+newpath 34.99524 60.61371 moveto
+35.57846 61.62387 lineto stroke
+newpath 35.57846 61.62387 moveto
+34.99522 62.63408 lineto stroke
+newpath 34.99522 62.63408 moveto
+36.1617 62.63408 lineto stroke
+newpath 36.1617 62.63408 moveto
+36.74492 63.64424 lineto stroke
+newpath 36.74492 63.64424 moveto
+36.16167 64.65445 lineto stroke
+newpath 36.16167 64.65445 moveto
+34.99512 64.65445 lineto stroke
+newpath 34.99512 64.65445 moveto
+35.5784 65.6647 lineto stroke
+newpath 35.5784 65.6647 moveto
+34.99515 66.67491 lineto stroke
+newpath 34.99515 66.67491 moveto
+33.8286 66.67491 lineto stroke
+newpath 33.8286 66.67491 moveto
+33.2453 65.66461 lineto stroke
+newpath 33.2453 65.66461 moveto
+32.662 66.67491 lineto stroke
+newpath 32.662 66.67491 moveto
+31.49545 66.67491 lineto stroke
+newpath 31.49545 66.67491 moveto
+32.07872 67.68517 lineto stroke
+newpath 32.07872 67.68517 moveto
+31.49542 68.6955 lineto stroke
+newpath 31.49542 68.6955 moveto
+32.66203 68.69548 lineto stroke
+newpath 32.66203 68.69548 moveto
+33.2453 69.70573 lineto stroke
+newpath 33.2453 69.70573 moveto
+32.66205 70.71594 lineto stroke
+newpath 32.66205 70.71594 moveto
+31.4955 70.71594 lineto stroke
+newpath 31.4955 70.71594 moveto
+32.07878 71.7262 lineto stroke
+newpath 32.07878 71.7262 moveto
+31.49553 72.7364 lineto stroke
+newpath 31.49553 72.7364 moveto
+32.66202 72.7364 lineto stroke
+newpath 32.66202 72.7364 moveto
+33.2453 73.74667 lineto stroke
+newpath 33.2453 73.74667 moveto
+33.82857 72.7364 lineto stroke
+newpath 33.82857 72.7364 moveto
+34.99506 72.7364 lineto stroke
+newpath 34.99506 72.7364 moveto
+35.57832 73.74666 lineto stroke
+newpath 35.57832 73.74666 moveto
+34.99503 74.75699 lineto stroke
+newpath 34.99503 74.75699 moveto
+36.16164 74.75697 lineto stroke
+newpath 36.16164 74.75697 moveto
+36.7449 75.76723 lineto stroke
+newpath 36.7449 75.76723 moveto
+37.32817 74.75697 lineto stroke
+newpath 37.32817 74.75697 moveto
+38.49478 74.75697 lineto stroke
+newpath 38.49478 74.75697 moveto
+37.91147 73.74666 lineto stroke
+newpath 37.91147 73.74666 moveto
+38.49474 72.7364 lineto stroke
+newpath 38.49474 72.7364 moveto
+39.66122 72.7364 lineto stroke
+newpath 39.66122 72.7364 moveto
+40.2445 73.74667 lineto stroke
+newpath 40.2445 73.74667 moveto
+40.82777 72.7364 lineto stroke
+newpath 40.82777 72.7364 moveto
+41.99426 72.7364 lineto stroke
+newpath 41.99426 72.7364 moveto
+42.57748 73.74657 lineto stroke
+newpath 42.57748 73.74657 moveto
+41.99425 74.75677 lineto stroke
+newpath 41.99425 74.75677 moveto
+43.16072 74.75677 lineto stroke
+newpath 43.16072 74.75677 moveto
+43.74394 75.76694 lineto stroke
+newpath 43.74394 75.76694 moveto
+43.16069 76.77715 lineto stroke
+newpath 43.16069 76.77715 moveto
+41.99416 76.77715 lineto stroke
+newpath 41.99416 76.77715 moveto
+42.57742 77.78738 lineto stroke
+newpath 42.57742 77.78738 moveto
+41.99417 78.79759 lineto stroke
+newpath 41.99417 78.79759 moveto
+43.16066 78.79759 lineto stroke
+newpath 43.16066 78.79759 moveto
+43.74391 79.80786 lineto stroke
+newpath 43.74391 79.80786 moveto
+44.3272 78.7976 lineto stroke
+newpath 44.3272 78.7976 moveto
+45.49368 78.7976 lineto stroke
+newpath 45.49368 78.7976 moveto
+46.0769 79.80777 lineto stroke
+newpath 46.0769 79.80777 moveto
+45.49367 80.81798 lineto stroke
+newpath 45.49367 80.81798 moveto
+46.66014 80.81798 lineto stroke
+newpath 46.66014 80.81798 moveto
+47.24336 81.82814 lineto stroke
+newpath 47.24336 81.82814 moveto
+46.66011 82.83835 lineto stroke
+newpath 46.66011 82.83835 moveto
+45.49356 82.83835 lineto stroke
+newpath 45.49356 82.83835 moveto
+46.07684 83.8486 lineto stroke
+newpath 46.07684 83.8486 moveto
+45.49359 84.85881 lineto stroke
+newpath 45.49359 84.85881 moveto
+44.32704 84.85881 lineto stroke
+newpath 44.32704 84.85881 moveto
+43.74374 83.84851 lineto stroke
+newpath 43.74374 83.84851 moveto
+43.16045 84.85881 lineto stroke
+newpath 43.16045 84.85881 moveto
+41.9939 84.85881 lineto stroke
+newpath 41.9939 84.85881 moveto
+42.57716 85.86906 lineto stroke
+newpath 42.57716 85.86906 moveto
+41.99387 86.8794 lineto stroke
+newpath 41.99387 86.8794 moveto
+43.16048 86.87936 lineto stroke
+newpath 43.16048 86.87936 moveto
+43.74374 87.88962 lineto stroke
+newpath 43.74374 87.88962 moveto
+43.16049 88.89983 lineto stroke
+newpath 43.16049 88.89983 moveto
+41.99394 88.89983 lineto stroke
+newpath 41.99394 88.89983 moveto
+42.57722 89.91008 lineto stroke
+newpath 42.57722 89.91008 moveto
+41.99397 90.92029 lineto stroke
+newpath 41.99397 90.92029 moveto
+40.82742 90.92029 lineto stroke
+newpath 40.82742 90.92029 moveto
+40.24413 89.90999 lineto stroke
+newpath 40.24413 89.90999 moveto
+39.66083 90.92029 lineto stroke
+newpath 39.66083 90.92029 moveto
+38.49428 90.92029 lineto stroke
+newpath 38.49428 90.92029 moveto
+37.91098 89.90997 lineto stroke
+newpath 37.91098 89.90997 moveto
+38.49431 88.89963 lineto stroke
+newpath 38.49431 88.89963 moveto
+37.32767 88.89963 lineto stroke
+newpath 37.32767 88.89963 moveto
+36.74437 87.88931 lineto stroke
+newpath 36.74437 87.88931 moveto
+36.16107 88.89961 lineto stroke
+newpath 36.16107 88.89961 moveto
+34.9944 88.89961 lineto stroke
+newpath 34.9944 88.89961 moveto
+35.57773 89.90997 lineto stroke
+newpath 35.57773 89.90997 moveto
+34.99443 90.92027 lineto stroke
+newpath 34.99443 90.92027 moveto
+33.82788 90.92027 lineto stroke
+newpath 33.82788 90.92027 moveto
+33.24458 89.90997 lineto stroke
+newpath 33.24458 89.90997 moveto
+32.66129 90.92027 lineto stroke
+newpath 32.66129 90.92027 moveto
+31.49474 90.92027 lineto stroke
+newpath 31.49474 90.92027 moveto
+32.078 91.93053 lineto stroke
+newpath 32.078 91.93053 moveto
+31.4947 92.94086 lineto stroke
+newpath 31.4947 92.94086 moveto
+32.66132 92.94084 lineto stroke
+newpath 32.66132 92.94084 moveto
+33.24458 93.9511 lineto stroke
+newpath 33.24458 93.9511 moveto
+32.66129 94.9614 lineto stroke
+newpath 32.66129 94.9614 moveto
+31.49463 94.96141 lineto stroke
+newpath 31.49463 94.96141 moveto
+32.07797 95.97176 lineto stroke
+newpath 32.07797 95.97176 moveto
+31.49467 96.98206 lineto stroke
+newpath 31.49467 96.98206 moveto
+32.66127 96.98206 lineto stroke
+newpath 32.66127 96.98206 moveto
+33.24461 97.99239 lineto stroke
+newpath 33.24461 97.99239 moveto
+33.82791 96.98204 lineto stroke
+newpath 33.82791 96.98204 moveto
+34.9945 96.98204 lineto stroke
+newpath 34.9945 96.98204 moveto
+35.57777 97.9923 lineto stroke
+newpath 35.57777 97.9923 moveto
+34.99448 99.00262 lineto stroke
+newpath 34.99448 99.00262 moveto
+36.16109 99.00261 lineto stroke
+newpath 36.16109 99.00261 moveto
+36.74435 100.01286 lineto stroke
+newpath 36.74435 100.01286 moveto
+36.1611 101.02307 lineto stroke
+newpath 36.1611 101.02307 moveto
+34.99455 101.02307 lineto stroke
+newpath 34.99455 101.02307 moveto
+35.57784 102.03333 lineto stroke
+newpath 35.57784 102.03333 moveto
+34.99458 103.04353 lineto stroke
+newpath 34.99458 103.04353 moveto
+33.82803 103.04353 lineto stroke
+newpath 33.82803 103.04353 moveto
+33.24474 102.03323 lineto stroke
+newpath 33.24474 102.03323 moveto
+32.66144 103.04353 lineto stroke
+newpath 32.66144 103.04353 moveto
+31.49489 103.04353 lineto stroke
+newpath 31.49489 103.04353 moveto
+32.07816 104.05379 lineto stroke
+newpath 32.07816 104.05379 moveto
+31.49486 105.06412 lineto stroke
+newpath 31.49486 105.06412 moveto
+32.66147 105.06409 lineto stroke
+newpath 32.66147 105.06409 moveto
+33.24474 106.07434 lineto stroke
+newpath 33.24474 106.07434 moveto
+32.66148 107.08455 lineto stroke
+newpath 32.66148 107.08455 moveto
+31.49493 107.08455 lineto stroke
+newpath 31.49493 107.08455 moveto
+32.07822 108.0948 lineto stroke
+newpath 32.07822 108.0948 moveto
+31.49496 109.10501 lineto stroke
+newpath 31.49496 109.10501 moveto
+30.32841 109.10501 lineto stroke
+newpath 30.32841 109.10501 moveto
+29.74513 108.0947 lineto stroke
+newpath 29.74513 108.0947 moveto
+29.16182 109.105 lineto stroke
+newpath 29.16182 109.105 moveto
+27.99527 109.105 lineto stroke
+newpath 27.99527 109.105 moveto
+27.41197 108.0947 lineto stroke
+newpath 27.41197 108.0947 moveto
+27.9953 107.08434 lineto stroke
+newpath 27.9953 107.08434 moveto
+26.82864 107.08434 lineto stroke
+newpath 26.82864 107.08434 moveto
+26.24535 106.07404 lineto stroke
+newpath 26.24535 106.07404 moveto
+25.66205 107.08434 lineto stroke
+newpath 25.66205 107.08434 moveto
+24.49538 107.08435 lineto stroke
+newpath 24.49538 107.08435 moveto
+25.07872 108.0947 lineto stroke
+newpath 25.07872 108.0947 moveto
+24.49542 109.105 lineto stroke
+newpath 24.49542 109.105 moveto
+23.32887 109.105 lineto stroke
+newpath 23.32887 109.105 moveto
+22.74559 108.09468 lineto stroke
+newpath 22.74559 108.09468 moveto
+22.16228 109.10498 lineto stroke
+newpath 22.16228 109.10498 moveto
+20.99573 109.10498 lineto stroke
+newpath 20.99573 109.10498 moveto
+20.41243 108.09467 lineto stroke
+newpath 20.41243 108.09467 moveto
+20.99576 107.08432 lineto stroke
+newpath 20.99576 107.08432 moveto
+19.82912 107.08432 lineto stroke
+newpath 19.82912 107.08432 moveto
+19.24582 106.074 lineto stroke
+newpath 19.24582 106.074 moveto
+19.82916 105.06364 lineto stroke
+newpath 19.82916 105.06364 moveto
+20.99588 105.06364 lineto stroke
+newpath 20.99588 105.06364 moveto
+20.41252 104.05325 lineto stroke
+newpath 20.41252 104.05325 moveto
+20.99586 103.0429 lineto stroke
+newpath 20.99586 103.0429 moveto
+19.82921 103.0429 lineto stroke
+newpath 19.82921 103.0429 moveto
+19.24585 102.03246 lineto stroke
+newpath 19.24585 102.03246 moveto
+18.66248 103.04288 lineto stroke
+newpath 18.66248 103.04288 moveto
+17.49582 103.04288 lineto stroke
+newpath 17.49582 103.04288 moveto
+16.91252 102.03256 lineto stroke
+newpath 16.91252 102.03256 moveto
+17.49585 101.02222 lineto stroke
+newpath 17.49585 101.02222 moveto
+16.32921 101.02222 lineto stroke
+newpath 16.32921 101.02222 moveto
+15.74591 100.0119 lineto stroke
+newpath 15.74591 100.0119 moveto
+15.16261 101.0222 lineto stroke
+newpath 15.16261 101.0222 moveto
+13.99594 101.0222 lineto stroke
+newpath 13.99594 101.0222 moveto
+14.57927 102.03256 lineto stroke
+newpath 14.57927 102.03256 moveto
+13.99597 103.04286 lineto stroke
+newpath 13.99597 103.04286 moveto
+12.82932 103.04286 lineto stroke
+newpath 12.82932 103.04286 moveto
+12.24594 102.03244 lineto stroke
+newpath 12.24594 102.03244 moveto
+11.66258 103.04286 lineto stroke
+newpath 11.66258 103.04286 moveto
+10.49593 103.04286 lineto stroke
+newpath 10.49593 103.04286 moveto
+11.07925 104.05322 lineto stroke
+newpath 11.07925 104.05322 moveto
+10.49591 105.06364 lineto stroke
+newpath 10.49591 105.06364 moveto
+11.66263 105.06361 lineto stroke
+newpath 11.66263 105.06361 moveto
+12.24596 106.07397 lineto stroke
+newpath 12.24596 106.07397 moveto
+11.66266 107.08427 lineto stroke
+newpath 11.66266 107.08427 moveto
+10.49599 107.08427 lineto stroke
+newpath 10.49599 107.08427 moveto
+11.07932 108.09464 lineto stroke
+newpath 11.07932 108.09464 moveto
+10.49602 109.10493 lineto stroke
+newpath 10.49602 109.10493 moveto
+9.32947 109.10493 lineto stroke
+newpath 9.32947 109.10493 moveto
+8.74619 108.09462 lineto stroke
+newpath 8.74619 108.09462 moveto
+8.16287 109.10492 lineto stroke
+newpath 8.16287 109.10492 moveto
+6.99632 109.10492 lineto stroke
+newpath 6.99632 109.10492 moveto
+6.41302 108.09462 lineto stroke
+newpath 6.41302 108.09462 moveto
+6.99635 107.08426 lineto stroke
+newpath 6.99635 107.08426 moveto
+5.8297 107.08426 lineto stroke
+newpath 5.8297 107.08426 moveto
+5.2464 106.07396 lineto stroke
+newpath 5.2464 106.07396 moveto
+4.6631 107.08426 lineto stroke
+newpath 4.6631 107.08426 moveto
+3.49643 107.08427 lineto stroke
+newpath 3.49643 107.08427 moveto
+4.07977 108.09462 lineto stroke
+newpath 4.07977 108.09462 moveto
+3.49648 109.10492 lineto stroke
+newpath 3.49648 109.10492 moveto
+2.32993 109.10492 lineto stroke
+newpath 2.32993 109.10492 moveto
+1.74664 108.0946 lineto stroke
+newpath 1.74664 108.0946 moveto
+1.16333 109.1049 lineto stroke
+newpath 1.16333 109.1049 moveto
+-0.00322 109.1049 lineto stroke
+newpath -0.00322 109.1049 moveto
+0.58005 110.11516 lineto stroke
+newpath 0.58005 110.11516 moveto
+-0.00325 111.12549 lineto stroke
+newpath -0.00325 111.12549 moveto
+1.16336 111.12547 lineto stroke
+newpath 1.16336 111.12547 moveto
+1.74663 112.13573 lineto stroke
+newpath 1.74663 112.13573 moveto
+1.16333 113.14603 lineto stroke
+newpath 1.16333 113.14603 moveto
+-0.00334 113.14603 lineto stroke
+newpath -0.00334 113.14603 moveto
+0.57999 114.15639 lineto stroke
+newpath 0.57999 114.15639 moveto
+-0.00331 115.16669 lineto stroke
+newpath -0.00331 115.16669 moveto
+1.16328 115.16669 lineto stroke
+newpath 1.16328 115.16669 moveto
+1.74661 116.17705 lineto stroke
+newpath 1.74661 116.17705 moveto
+2.32994 115.16669 lineto stroke
+newpath 2.32994 115.16669 moveto
+3.49654 115.16669 lineto stroke
+newpath 3.49654 115.16669 moveto
+4.0798 116.17694 lineto stroke
+newpath 4.0798 116.17694 moveto
+3.4965 117.18727 lineto stroke
+newpath 3.4965 117.18727 moveto
+4.66312 117.18726 lineto stroke
+newpath 4.66312 117.18726 moveto
+5.24638 118.19751 lineto stroke
+newpath 5.24638 118.19751 moveto
+4.66309 119.20782 lineto stroke
+newpath 4.66309 119.20782 moveto
+3.49643 119.20781 lineto stroke
+newpath 3.49643 119.20781 moveto
+4.07974 120.21817 lineto stroke
+newpath 4.07974 120.21817 moveto
+3.49644 121.22849 lineto stroke
+newpath 3.49644 121.22849 moveto
+2.32979 121.22849 lineto stroke
+newpath 2.32979 121.22849 moveto
+1.74643 120.2181 lineto stroke
+newpath 1.74643 120.2181 moveto
+1.16309 121.22849 lineto stroke
+newpath 1.16309 121.22849 moveto
+-0.00357 121.22849 lineto stroke
+newpath -0.00357 121.22849 moveto
+0.57976 122.23883 lineto stroke
+newpath 0.57976 122.23883 moveto
+-0.0036 123.24924 lineto stroke
+newpath -0.0036 123.24924 moveto
+1.16312 123.24924 lineto stroke
+newpath 1.16312 123.24924 moveto
+1.74644 124.25958 lineto stroke
+newpath 1.74644 124.25958 moveto
+1.16315 125.2699 lineto stroke
+newpath 1.16315 125.2699 moveto
+-0.00351 125.26988 lineto stroke
+newpath -0.00351 125.26988 moveto
+0.5798 126.28024 lineto stroke
+newpath 0.5798 126.28024 moveto
+-0.0035 127.29056 lineto stroke
+newpath -0.0035 127.29056 moveto
+1.16312 127.29056 lineto stroke
+newpath 1.16312 127.29056 moveto
+1.74644 128.3009 lineto stroke
+newpath 1.74644 128.3009 moveto
+2.32976 127.29056 lineto stroke
+newpath 2.32976 127.29056 moveto
+3.49637 127.29056 lineto stroke
+newpath 3.49637 127.29056 moveto
+4.0797 128.3009 lineto stroke
+newpath 4.0797 128.3009 moveto
+3.49634 129.31133 lineto stroke
+newpath 3.49634 129.31133 moveto
+4.66307 129.31131 lineto stroke
+newpath 4.66307 129.31131 moveto
+5.2464 130.32166 lineto stroke
+newpath 5.2464 130.32166 moveto
+5.82971 129.3113 lineto stroke
+newpath 5.82971 129.3113 moveto
+6.99643 129.3113 lineto stroke
+newpath 6.99643 129.3113 moveto
+6.41307 128.3009 lineto stroke
+newpath 6.41307 128.3009 moveto
+6.99638 127.29054 lineto stroke
+newpath 6.99638 127.29054 moveto
+8.163 127.29054 lineto stroke
+newpath 8.163 127.29054 moveto
+8.74632 128.30089 lineto stroke
+newpath 8.74632 128.30089 moveto
+9.32964 127.29054 lineto stroke
+newpath 9.32964 127.29054 moveto
+10.49625 127.29054 lineto stroke
+newpath 10.49625 127.29054 moveto
+11.07951 128.3008 lineto stroke
+newpath 11.07951 128.3008 moveto
+10.49622 129.31113 lineto stroke
+newpath 10.49622 129.31113 moveto
+11.66283 129.31111 lineto stroke
+newpath 11.66283 129.31111 moveto
+12.2461 130.32137 lineto stroke
+newpath 12.2461 130.32137 moveto
+11.6628 131.33167 lineto stroke
+newpath 11.6628 131.33167 moveto
+10.49612 131.33167 lineto stroke
+newpath 10.49612 131.33167 moveto
+11.07945 132.34203 lineto stroke
+newpath 11.07945 132.34203 moveto
+10.49615 133.35233 lineto stroke
+newpath 10.49615 133.35233 moveto
+11.66275 133.35233 lineto stroke
+newpath 11.66275 133.35233 moveto
+12.24608 134.36269 lineto stroke
+newpath 12.24608 134.36269 moveto
+12.8294 133.35233 lineto stroke
+newpath 12.8294 133.35233 moveto
+13.996 133.35233 lineto stroke
+newpath 13.996 133.35233 moveto
+14.57927 134.36258 lineto stroke
+newpath 14.57927 134.36258 moveto
+13.99597 135.37291 lineto stroke
+newpath 13.99597 135.37291 moveto
+15.16258 135.3729 lineto stroke
+newpath 15.16258 135.3729 moveto
+15.74585 136.38315 lineto stroke
+newpath 15.74585 136.38315 moveto
+15.1626 137.39336 lineto stroke
+newpath 15.1626 137.39336 moveto
+13.99605 137.39336 lineto stroke
+newpath 13.99605 137.39336 moveto
+14.57933 138.40361 lineto stroke
+newpath 14.57933 138.40361 moveto
+13.99608 139.41382 lineto stroke
+newpath 13.99608 139.41382 moveto
+12.82953 139.41382 lineto stroke
+newpath 12.82953 139.41382 moveto
+12.24623 138.40352 lineto stroke
+newpath 12.24623 138.40352 moveto
+11.66293 139.41382 lineto stroke
+newpath 11.66293 139.41382 moveto
+10.49638 139.41382 lineto stroke
+newpath 10.49638 139.41382 moveto
+11.07965 140.42407 lineto stroke
+newpath 11.07965 140.42407 moveto
+10.49635 141.4344 lineto stroke
+newpath 10.49635 141.4344 moveto
+11.66296 141.43437 lineto stroke
+newpath 11.66296 141.43437 moveto
+12.24623 142.44463 lineto stroke
+newpath 12.24623 142.44463 moveto
+11.66298 143.45483 lineto stroke
+newpath 11.66298 143.45483 moveto
+10.49643 143.45483 lineto stroke
+newpath 10.49643 143.45483 moveto
+11.07971 144.46509 lineto stroke
+newpath 11.07971 144.46509 moveto
+10.49646 145.4753 lineto stroke
+newpath 10.49646 145.4753 moveto
+9.32991 145.4753 lineto stroke
+newpath 9.32991 145.4753 moveto
+8.74661 144.465 lineto stroke
+newpath 8.74661 144.465 moveto
+8.16331 145.4753 lineto stroke
+newpath 8.16331 145.4753 moveto
+6.99677 145.4753 lineto stroke
+newpath 6.99677 145.4753 moveto
+6.41347 144.46498 lineto stroke
+newpath 6.41347 144.46498 moveto
+6.9968 143.45464 lineto stroke
+newpath 6.9968 143.45464 moveto
+5.83015 143.45464 lineto stroke
+newpath 5.83015 143.45464 moveto
+5.24686 142.44432 lineto stroke
+newpath 5.24686 142.44432 moveto
+4.66356 143.45462 lineto stroke
+newpath 4.66356 143.45462 moveto
+3.49689 143.45462 lineto stroke
+newpath 3.49689 143.45462 moveto
+4.08022 144.46498 lineto stroke
+newpath 4.08022 144.46498 moveto
+3.49692 145.47528 lineto stroke
+newpath 3.49692 145.47528 moveto
+2.33037 145.47528 lineto stroke
+newpath 2.33037 145.47528 moveto
+1.74707 144.46498 lineto stroke
+newpath 1.74707 144.46498 moveto
+1.16377 145.47528 lineto stroke
+newpath 1.16377 145.47528 moveto
+-0.00278 145.47528 lineto stroke
+newpath -0.00278 145.47528 moveto
+0.58049 146.48553 lineto stroke
+newpath 0.58049 146.48553 moveto
+-0.0028 147.49586 lineto stroke
+newpath -0.0028 147.49586 moveto
+1.1638 147.49585 lineto stroke
+newpath 1.1638 147.49585 moveto
+1.74707 148.5061 lineto stroke
+newpath 1.74707 148.5061 moveto
+1.16377 149.5164 lineto stroke
+newpath 1.16377 149.5164 moveto
+-0.00288 149.51642 lineto stroke
+newpath -0.00288 149.51642 moveto
+0.58046 150.52676 lineto stroke
+newpath 0.58046 150.52676 moveto
+-0.00284 151.53706 lineto stroke
+newpath -0.00284 151.53706 moveto
+1.16376 151.53706 lineto stroke
+newpath 1.16376 151.53706 moveto
+1.7471 152.5474 lineto stroke
+newpath 1.7471 152.5474 moveto
+2.3304 151.53705 lineto stroke
+newpath 2.3304 151.53705 moveto
+3.497 151.53705 lineto stroke
+newpath 3.497 151.53705 moveto
+4.08026 152.5473 lineto stroke
+newpath 4.08026 152.5473 moveto
+3.49696 153.55763 lineto stroke
+newpath 3.49696 153.55763 moveto
+4.66357 153.55762 lineto stroke
+newpath 4.66357 153.55762 moveto
+5.24684 154.56787 lineto stroke
+newpath 5.24684 154.56787 moveto
+4.66359 155.57808 lineto stroke
+newpath 4.66359 155.57808 moveto
+3.49704 155.57808 lineto stroke
+newpath 3.49704 155.57808 moveto
+4.08032 156.58833 lineto stroke
+newpath 4.08032 156.58833 moveto
+3.49707 157.59854 lineto stroke
+newpath 3.49707 157.59854 moveto
+2.33052 157.59854 lineto stroke
+newpath 2.33052 157.59854 moveto
+1.74722 156.58824 lineto stroke
+newpath 1.74722 156.58824 moveto
+1.16393 157.59854 lineto stroke
+newpath 1.16393 157.59854 moveto
+-0.00262 157.59854 lineto stroke
+newpath -0.00262 157.59854 moveto
+0.58064 158.6088 lineto stroke
+newpath 0.58064 158.6088 moveto
+-0.00266 159.61913 lineto stroke
+newpath -0.00266 159.61913 moveto
+1.16396 159.6191 lineto stroke
+newpath 1.16396 159.6191 moveto
+1.74722 160.62935 lineto stroke
+newpath 1.74722 160.62935 moveto
+1.16397 161.63956 lineto stroke
+newpath 1.16397 161.63956 moveto
+-0.00258 161.63956 lineto stroke
+newpath -0.00258 161.63956 moveto
+0.5807 162.64981 lineto stroke
+newpath 0.5807 162.64981 moveto
+-0.00255 163.66002 lineto stroke
+newpath -0.00255 163.66002 moveto
+1.16394 163.66002 lineto stroke
+newpath 1.16394 163.66002 moveto
+1.74722 164.67029 lineto stroke
+newpath 1.74722 164.67029 moveto
+2.33049 163.66002 lineto stroke
+newpath 2.33049 163.66002 moveto
+3.49698 163.66002 lineto stroke
+newpath 3.49698 163.66002 moveto
+4.08025 164.67027 lineto stroke
+newpath 4.08025 164.67027 moveto
+3.49695 165.6806 lineto stroke
+newpath 3.49695 165.6806 moveto
+4.66356 165.68059 lineto stroke
+newpath 4.66356 165.68059 moveto
+5.24683 166.69084 lineto stroke
+newpath 5.24683 166.69084 moveto
+5.8301 165.68059 lineto stroke
+newpath 5.8301 165.68059 moveto
+6.9967 165.68059 lineto stroke
+newpath 6.9967 165.68059 moveto
+6.41339 164.67027 lineto stroke
+newpath 6.41339 164.67027 moveto
+6.99666 163.66002 lineto stroke
+newpath 6.99666 163.66002 moveto
+8.16315 163.66002 lineto stroke
+newpath 8.16315 163.66002 moveto
+8.74643 164.67029 lineto stroke
+newpath 8.74643 164.67029 moveto
+9.3297 163.66002 lineto stroke
+newpath 9.3297 163.66002 moveto
+10.49619 163.66002 lineto stroke
+newpath 10.49619 163.66002 moveto
+11.07945 164.67027 lineto stroke
+newpath 11.07945 164.67027 moveto
+10.49615 165.6806 lineto stroke
+newpath 10.49615 165.6806 moveto
+11.66277 165.68059 lineto stroke
+newpath 11.66277 165.68059 moveto
+12.24603 166.69084 lineto stroke
+newpath 12.24603 166.69084 moveto
+11.66273 167.70114 lineto stroke
+newpath 11.66273 167.70114 moveto
+10.49606 167.70114 lineto stroke
+newpath 10.49606 167.70114 moveto
+11.07939 168.7115 lineto stroke
+newpath 11.07939 168.7115 moveto
+10.4961 169.7218 lineto stroke
+newpath 10.4961 169.7218 moveto
+11.66269 169.7218 lineto stroke
+newpath 11.66269 169.7218 moveto
+12.24602 170.73216 lineto stroke
+newpath 12.24602 170.73216 moveto
+12.82935 169.7218 lineto stroke
+newpath 12.82935 169.7218 moveto
+13.99594 169.7218 lineto stroke
+newpath 13.99594 169.7218 moveto
+14.57921 170.73206 lineto stroke
+newpath 14.57921 170.73206 moveto
+13.99591 171.74239 lineto stroke
+newpath 13.99591 171.74239 moveto
+15.16252 171.74237 lineto stroke
+newpath 15.16252 171.74237 moveto
+15.74579 172.75262 lineto stroke
+newpath 15.74579 172.75262 moveto
+16.32906 171.74237 lineto stroke
+newpath 16.32906 171.74237 moveto
+17.49567 171.74239 lineto stroke
+newpath 17.49567 171.74239 moveto
+16.91237 170.73206 lineto stroke
+newpath 16.91237 170.73206 moveto
+17.49564 169.7218 lineto stroke
+newpath 17.49564 169.7218 moveto
+18.66223 169.7218 lineto stroke
+newpath 18.66223 169.7218 moveto
+19.24557 170.73215 lineto stroke
+newpath 19.24557 170.73215 moveto
+19.82889 169.72179 lineto stroke
+newpath 19.82889 169.72179 moveto
+20.99548 169.72179 lineto stroke
+newpath 20.99548 169.72179 moveto
+20.41219 168.71149 lineto stroke
+newpath 20.41219 168.71149 moveto
+20.9955 167.70113 lineto stroke
+newpath 20.9955 167.70113 moveto
+19.82884 167.70114 lineto stroke
+newpath 19.82884 167.70114 moveto
+19.24554 166.69084 lineto stroke
+newpath 19.24554 166.69084 moveto
+19.82881 165.68059 lineto stroke
+newpath 19.82881 165.68059 moveto
+20.99542 165.6806 lineto stroke
+newpath 20.99542 165.6806 moveto
+20.41212 164.67027 lineto stroke
+newpath 20.41212 164.67027 moveto
+20.99539 163.66002 lineto stroke
+newpath 20.99539 163.66002 moveto
+22.16188 163.66002 lineto stroke
+newpath 22.16188 163.66002 moveto
+22.74516 164.67029 lineto stroke
+newpath 22.74516 164.67029 moveto
+23.32843 163.66002 lineto stroke
+newpath 23.32843 163.66002 moveto
+24.49492 163.66002 lineto stroke
+newpath 24.49492 163.66002 moveto
+25.07819 164.67027 lineto stroke
+newpath 25.07819 164.67027 moveto
+24.49489 165.6806 lineto stroke
+newpath 24.49489 165.6806 moveto
+25.6615 165.68059 lineto stroke
+newpath 25.6615 165.68059 moveto
+26.24477 166.69084 lineto stroke
+newpath 26.24477 166.69084 moveto
+26.82803 165.68059 lineto stroke
+newpath 26.82803 165.68059 moveto
+27.99464 165.68059 lineto stroke
+newpath 27.99464 165.68059 moveto
+27.41133 164.67027 lineto stroke
+newpath 27.41133 164.67027 moveto
+27.9946 163.66002 lineto stroke
+newpath 27.9946 163.66002 moveto
+29.16109 163.66002 lineto stroke
+newpath 29.16109 163.66002 moveto
+29.74437 164.67029 lineto stroke
+newpath 29.74437 164.67029 moveto
+30.32764 163.66002 lineto stroke
+newpath 30.32764 163.66002 moveto
+31.49413 163.66002 lineto stroke
+newpath 31.49413 163.66002 moveto
+32.0774 164.67027 lineto stroke
+newpath 32.0774 164.67027 moveto
+31.4941 165.6806 lineto stroke
+newpath 31.4941 165.6806 moveto
+32.6607 165.68059 lineto stroke
+newpath 32.6607 165.68059 moveto
+33.24397 166.69084 lineto stroke
+newpath 33.24397 166.69084 moveto
+32.66068 167.70114 lineto stroke
+newpath 32.66068 167.70114 moveto
+31.494 167.70114 lineto stroke
+newpath 31.494 167.70114 moveto
+32.07733 168.7115 lineto stroke
+newpath 32.07733 168.7115 moveto
+31.49403 169.7218 lineto stroke
+newpath 31.49403 169.7218 moveto
+32.66063 169.7218 lineto stroke
+newpath 32.66063 169.7218 moveto
+33.24396 170.73216 lineto stroke
+newpath 33.24396 170.73216 moveto
+33.82729 169.7218 lineto stroke
+newpath 33.82729 169.7218 moveto
+34.99388 169.7218 lineto stroke
+newpath 34.99388 169.7218 moveto
+35.57715 170.73206 lineto stroke
+newpath 35.57715 170.73206 moveto
+34.99385 171.74239 lineto stroke
+newpath 34.99385 171.74239 moveto
+36.16046 171.74237 lineto stroke
+newpath 36.16046 171.74237 moveto
+36.74373 172.75262 lineto stroke
+newpath 36.74373 172.75262 moveto
+36.16043 173.76292 lineto stroke
+newpath 36.16043 173.76292 moveto
+34.99376 173.76292 lineto stroke
+newpath 34.99376 173.76292 moveto
+35.57709 174.77328 lineto stroke
+newpath 35.57709 174.77328 moveto
+34.99379 175.78358 lineto stroke
+newpath 34.99379 175.78358 moveto
+33.82713 175.78358 lineto stroke
+newpath 33.82713 175.78358 moveto
+33.24377 174.7732 lineto stroke
+newpath 33.24377 174.7732 moveto
+32.66043 175.78358 lineto stroke
+newpath 32.66043 175.78358 moveto
+31.49377 175.78358 lineto stroke
+newpath 31.49377 175.78358 moveto
+32.0771 176.79393 lineto stroke
+newpath 32.0771 176.79393 moveto
+31.49374 177.80434 lineto stroke
+newpath 31.49374 177.80434 moveto
+32.66046 177.80434 lineto stroke
+newpath 32.66046 177.80434 moveto
+33.24379 178.81468 lineto stroke
+newpath 33.24379 178.81468 moveto
+32.66049 179.82498 lineto stroke
+newpath 32.66049 179.82498 moveto
+31.49382 179.82498 lineto stroke
+newpath 31.49382 179.82498 moveto
+32.07715 180.83534 lineto stroke
+newpath 32.07715 180.83534 moveto
+31.49385 181.84564 lineto stroke
+newpath 31.49385 181.84564 moveto
+32.66046 181.84564 lineto stroke
+newpath 32.66046 181.84564 moveto
+33.24379 182.85599 lineto stroke
+newpath 33.24379 182.85599 moveto
+33.8271 181.84564 lineto stroke
+newpath 33.8271 181.84564 moveto
+34.99371 181.84564 lineto stroke
+newpath 34.99371 181.84564 moveto
+35.57704 182.85599 lineto stroke
+newpath 35.57704 182.85599 moveto
+34.99367 183.86638 lineto stroke
+newpath 34.99367 183.86638 moveto
+36.16039 183.8664 lineto stroke
+newpath 36.16039 183.8664 moveto
+36.74371 184.87674 lineto stroke
+newpath 36.74371 184.87674 moveto
+37.32704 183.8664 lineto stroke
+newpath 37.32704 183.8664 moveto
+38.49376 183.86638 lineto stroke
+newpath 38.49376 183.86638 moveto
+37.91039 182.85599 lineto stroke
+newpath 37.91039 182.85599 moveto
+38.49371 181.84564 lineto stroke
+newpath 38.49371 181.84564 moveto
+39.66032 181.84564 lineto stroke
+newpath 39.66032 181.84564 moveto
+40.24365 182.85599 lineto stroke
+newpath 40.24365 182.85599 moveto
+40.82697 181.84564 lineto stroke
+newpath 40.82697 181.84564 moveto
+41.99358 181.84564 lineto stroke
+newpath 41.99358 181.84564 moveto
+42.57684 182.8559 lineto stroke
+newpath 42.57684 182.8559 moveto
+41.99355 183.86623 lineto stroke
+newpath 41.99355 183.86623 moveto
+43.16016 183.86621 lineto stroke
+newpath 43.16016 183.86621 moveto
+43.74342 184.87646 lineto stroke
+newpath 43.74342 184.87646 moveto
+43.16013 185.88676 lineto stroke
+newpath 43.16013 185.88676 moveto
+41.99345 185.88676 lineto stroke
+newpath 41.99345 185.88676 moveto
+42.57678 186.89713 lineto stroke
+newpath 42.57678 186.89713 moveto
+41.99348 187.90742 lineto stroke
+newpath 41.99348 187.90742 moveto
+43.16008 187.90742 lineto stroke
+newpath 43.16008 187.90742 moveto
+43.74341 188.91779 lineto stroke
+newpath 43.74341 188.91779 moveto
+44.32674 187.90742 lineto stroke
+newpath 44.32674 187.90742 moveto
+45.49333 187.90742 lineto stroke
+newpath 45.49333 187.90742 moveto
+46.0766 188.91768 lineto stroke
+newpath 46.0766 188.91768 moveto
+45.4933 189.92801 lineto stroke
+newpath 45.4933 189.92801 moveto
+46.65991 189.928 lineto stroke
+newpath 46.65991 189.928 moveto
+47.24318 190.93825 lineto stroke
+newpath 47.24318 190.93825 moveto
+47.82645 189.928 lineto stroke
+newpath 47.82645 189.928 moveto
+48.99306 189.92801 lineto stroke
+newpath 48.99306 189.92801 moveto
+48.40976 188.91768 lineto stroke
+newpath 48.40976 188.91768 moveto
+48.99303 187.90742 lineto stroke
+newpath 48.99303 187.90742 moveto
+50.15962 187.90742 lineto stroke
+newpath 50.15962 187.90742 moveto
+50.74297 188.91777 lineto stroke
+newpath 50.74297 188.91777 moveto
+51.32628 187.90741 lineto stroke
+newpath 51.32628 187.90741 moveto
+52.49287 187.90741 lineto stroke
+newpath 52.49287 187.90741 moveto
+51.90958 186.89711 lineto stroke
+newpath 51.90958 186.89711 moveto
+52.49289 185.88675 lineto stroke
+newpath 52.49289 185.88675 moveto
+51.32623 185.88676 lineto stroke
+newpath 51.32623 185.88676 moveto
+50.74294 184.87646 lineto stroke
+newpath 50.74294 184.87646 moveto
+51.3262 183.86621 lineto stroke
+newpath 51.3262 183.86621 moveto
+52.49281 183.86623 lineto stroke
+newpath 52.49281 183.86623 moveto
+51.90952 182.8559 lineto stroke
+newpath 51.90952 182.8559 moveto
+52.49278 181.84564 lineto stroke
+newpath 52.49278 181.84564 moveto
+53.6594 181.84564 lineto stroke
+newpath 53.6594 181.84564 moveto
+54.24272 182.85599 lineto stroke
+newpath 54.24272 182.85599 moveto
+54.82603 181.84564 lineto stroke
+newpath 54.82603 181.84564 moveto
+55.99265 181.84564 lineto stroke
+newpath 55.99265 181.84564 moveto
+56.57597 182.85599 lineto stroke
+newpath 56.57597 182.85599 moveto
+55.99263 183.8664 lineto stroke
+newpath 55.99263 183.8664 moveto
+57.15933 183.86638 lineto stroke
+newpath 57.15933 183.86638 moveto
+57.74266 184.87672 lineto stroke
+newpath 57.74266 184.87672 moveto
+58.32597 183.86638 lineto stroke
+newpath 58.32597 183.86638 moveto
+59.4927 183.86638 lineto stroke
+newpath 59.4927 183.86638 moveto
+58.90933 182.85597 lineto stroke
+newpath 58.90933 182.85597 moveto
+59.49265 181.84563 lineto stroke
+newpath 59.49265 181.84563 moveto
+60.65926 181.84563 lineto stroke
+newpath 60.65926 181.84563 moveto
+61.24258 182.85597 lineto stroke
+newpath 61.24258 182.85597 moveto
+61.8259 181.84563 lineto stroke
+newpath 61.8259 181.84563 moveto
+62.99251 181.84563 lineto stroke
+newpath 62.99251 181.84563 moveto
+62.40921 180.83533 lineto stroke
+newpath 62.40921 180.83533 moveto
+62.99254 179.82495 lineto stroke
+newpath 62.99254 179.82495 moveto
+61.82587 179.82497 lineto stroke
+newpath 61.82587 179.82497 moveto
+61.24257 178.81467 lineto stroke
+newpath 61.24257 178.81467 moveto
+61.82588 177.8043 lineto stroke
+newpath 61.82588 177.8043 moveto
+62.9926 177.8043 lineto stroke
+newpath 62.9926 177.8043 moveto
+62.40924 176.79391 lineto stroke
+newpath 62.40924 176.79391 moveto
+62.99255 175.78355 lineto stroke
+newpath 62.99255 175.78355 moveto
+61.8259 175.78357 lineto stroke
+newpath 61.8259 175.78357 moveto
+61.24254 174.77318 lineto stroke
+newpath 61.24254 174.77318 moveto
+60.6592 175.78357 lineto stroke
+newpath 60.6592 175.78357 moveto
+59.49255 175.78358 lineto stroke
+newpath 59.49255 175.78358 moveto
+58.90926 174.77328 lineto stroke
+newpath 58.90926 174.77328 moveto
+59.49258 173.76291 lineto stroke
+newpath 59.49258 173.76291 moveto
+58.32591 173.76292 lineto stroke
+newpath 58.32591 173.76292 moveto
+57.74261 172.75262 lineto stroke
+newpath 57.74261 172.75262 moveto
+58.32588 171.74237 lineto stroke
+newpath 58.32588 171.74237 moveto
+59.4925 171.74239 lineto stroke
+newpath 59.4925 171.74239 moveto
+58.9092 170.73206 lineto stroke
+newpath 58.9092 170.73206 moveto
+59.49246 169.7218 lineto stroke
+newpath 59.49246 169.7218 moveto
+60.65906 169.7218 lineto stroke
+newpath 60.65906 169.7218 moveto
+61.2424 170.73215 lineto stroke
+newpath 61.2424 170.73215 moveto
+61.82571 169.72179 lineto stroke
+newpath 61.82571 169.72179 moveto
+62.99231 169.72179 lineto stroke
+newpath 62.99231 169.72179 moveto
+62.40901 168.71149 lineto stroke
+newpath 62.40901 168.71149 moveto
+62.99232 167.70113 lineto stroke
+newpath 62.99232 167.70113 moveto
+61.82567 167.70114 lineto stroke
+newpath 61.82567 167.70114 moveto
+61.24237 166.69084 lineto stroke
+newpath 61.24237 166.69084 moveto
+61.82564 165.68059 lineto stroke
+newpath 61.82564 165.68059 moveto
+62.99225 165.6806 lineto stroke
+newpath 62.99225 165.6806 moveto
+62.40895 164.67027 lineto stroke
+newpath 62.40895 164.67027 moveto
+62.99222 163.66002 lineto stroke
+newpath 62.99222 163.66002 moveto
+64.1587 163.66002 lineto stroke
+newpath 64.1587 163.66002 moveto
+64.74199 164.67029 lineto stroke
+newpath 64.74199 164.67029 moveto
+65.32526 163.66002 lineto stroke
+newpath 65.32526 163.66002 moveto
+66.49174 163.66002 lineto stroke
+newpath 66.49174 163.66002 moveto
+67.07501 164.67027 lineto stroke
+newpath 67.07501 164.67027 moveto
+66.49171 165.6806 lineto stroke
+newpath 66.49171 165.6806 moveto
+67.65833 165.68059 lineto stroke
+newpath 67.65833 165.68059 moveto
+68.2416 166.69084 lineto stroke
+newpath 68.2416 166.69084 moveto
+68.82486 165.68059 lineto stroke
+newpath 68.82486 165.68059 moveto
+69.99147 165.68059 lineto stroke
+newpath 69.99147 165.68059 moveto
+69.40816 164.67027 lineto stroke
+newpath 69.40816 164.67027 moveto
+69.99142 163.66002 lineto stroke
+newpath 69.99142 163.66002 moveto
+71.15791 163.66002 lineto stroke
+newpath 71.15791 163.66002 moveto
+71.7412 164.67029 lineto stroke
+newpath 71.7412 164.67029 moveto
+72.32446 163.66002 lineto stroke
+newpath 72.32446 163.66002 moveto
+73.49095 163.66002 lineto stroke
+newpath 73.49095 163.66002 moveto
+74.07422 164.67027 lineto stroke
+newpath 74.07422 164.67027 moveto
+73.49092 165.6806 lineto stroke
+newpath 73.49092 165.6806 moveto
+74.65753 165.68059 lineto stroke
+newpath 74.65753 165.68059 moveto
+75.2408 166.69084 lineto stroke
+newpath 75.2408 166.69084 moveto
+74.6575 167.70114 lineto stroke
+newpath 74.6575 167.70114 moveto
+73.49083 167.70114 lineto stroke
+newpath 73.49083 167.70114 moveto
+74.07416 168.7115 lineto stroke
+newpath 74.07416 168.7115 moveto
+73.49086 169.7218 lineto stroke
+newpath 73.49086 169.7218 moveto
+74.65746 169.7218 lineto stroke
+newpath 74.65746 169.7218 moveto
+75.24078 170.73216 lineto stroke
+newpath 75.24078 170.73216 moveto
+75.82411 169.7218 lineto stroke
+newpath 75.82411 169.7218 moveto
+76.9907 169.7218 lineto stroke
+newpath 76.9907 169.7218 moveto
+77.57397 170.73206 lineto stroke
+newpath 77.57397 170.73206 moveto
+76.99068 171.74239 lineto stroke
+newpath 76.99068 171.74239 moveto
+78.15729 171.74237 lineto stroke
+newpath 78.15729 171.74237 moveto
+78.74055 172.75262 lineto stroke
+newpath 78.74055 172.75262 moveto
+79.32382 171.74237 lineto stroke
+newpath 79.32382 171.74237 moveto
+80.49043 171.74239 lineto stroke
+newpath 80.49043 171.74239 moveto
+79.90714 170.73206 lineto stroke
+newpath 79.90714 170.73206 moveto
+80.4904 169.7218 lineto stroke
+newpath 80.4904 169.7218 moveto
+81.657 169.7218 lineto stroke
+newpath 81.657 169.7218 moveto
+82.24034 170.73215 lineto stroke
+newpath 82.24034 170.73215 moveto
+82.82365 169.72179 lineto stroke
+newpath 82.82365 169.72179 moveto
+83.99025 169.72179 lineto stroke
+newpath 83.99025 169.72179 moveto
+83.40695 168.71149 lineto stroke
+newpath 83.40695 168.71149 moveto
+83.99026 167.70113 lineto stroke
+newpath 83.99026 167.70113 moveto
+82.82361 167.70114 lineto stroke
+newpath 82.82361 167.70114 moveto
+82.24031 166.69084 lineto stroke
+newpath 82.24031 166.69084 moveto
+82.82358 165.68059 lineto stroke
+newpath 82.82358 165.68059 moveto
+83.99019 165.6806 lineto stroke
+newpath 83.99019 165.6806 moveto
+83.40689 164.67027 lineto stroke
+newpath 83.40689 164.67027 moveto
+83.99016 163.66002 lineto stroke
+newpath 83.99016 163.66002 moveto
+85.15665 163.66002 lineto stroke
+newpath 85.15665 163.66002 moveto
+85.73993 164.67029 lineto stroke
+newpath 85.73993 164.67029 moveto
+86.3232 163.66002 lineto stroke
+newpath 86.3232 163.66002 moveto
+87.48969 163.66002 lineto stroke
+newpath 87.48969 163.66002 moveto
+88.07295 164.67027 lineto stroke
+newpath 88.07295 164.67027 moveto
+87.48965 165.6806 lineto stroke
+newpath 87.48965 165.6806 moveto
+88.65627 165.68059 lineto stroke
+newpath 88.65627 165.68059 moveto
+89.23953 166.69084 lineto stroke
+newpath 89.23953 166.69084 moveto
+89.8228 165.68059 lineto stroke
+newpath 89.8228 165.68059 moveto
+90.98941 165.68059 lineto stroke
+newpath 90.98941 165.68059 moveto
+90.4061 164.67027 lineto stroke
+newpath 90.4061 164.67027 moveto
+90.98936 163.66002 lineto stroke
+newpath 90.98936 163.66002 moveto
+92.15585 163.66002 lineto stroke
+newpath 92.15585 163.66002 moveto
+92.73914 164.67029 lineto stroke
+newpath 92.73914 164.67029 moveto
+93.3224 163.66002 lineto stroke
+newpath 93.3224 163.66002 moveto
+94.48889 163.66002 lineto stroke
+newpath 94.48889 163.66002 moveto
+95.07211 164.67018 lineto stroke
+newpath 95.07211 164.67018 moveto
+94.48888 165.68039 lineto stroke
+newpath 94.48888 165.68039 moveto
+95.65535 165.68039 lineto stroke
+newpath 95.65535 165.68039 moveto
+96.23857 166.69055 lineto stroke
+newpath 96.23857 166.69055 moveto
+95.65532 167.70076 lineto stroke
+newpath 95.65532 167.70076 moveto
+94.48878 167.70076 lineto stroke
+newpath 94.48878 167.70076 moveto
+95.07205 168.711 lineto stroke
+newpath 95.07205 168.711 moveto
+94.4888 169.7212 lineto stroke
+newpath 94.4888 169.7212 moveto
+95.65529 169.7212 lineto stroke
+newpath 95.65529 169.7212 moveto
+96.23854 170.73148 lineto stroke
+newpath 96.23854 170.73148 moveto
+96.82182 169.72122 lineto stroke
+newpath 96.82182 169.72122 moveto
+97.98831 169.72122 lineto stroke
+newpath 97.98831 169.72122 moveto
+98.57153 170.73138 lineto stroke
+newpath 98.57153 170.73138 moveto
+97.9883 171.7416 lineto stroke
+newpath 97.9883 171.7416 moveto
+99.15477 171.7416 lineto stroke
+newpath 99.15477 171.7416 moveto
+99.73799 172.75175 lineto stroke
+newpath 99.73799 172.75175 moveto
+99.15474 173.76196 lineto stroke
+newpath 99.15474 173.76196 moveto
+97.98819 173.76196 lineto stroke
+newpath 97.98819 173.76196 moveto
+98.57147 174.77222 lineto stroke
+newpath 98.57147 174.77222 moveto
+97.98822 175.78242 lineto stroke
+newpath 97.98822 175.78242 moveto
+96.82167 175.78242 lineto stroke
+newpath 96.82167 175.78242 moveto
+96.23837 174.77213 lineto stroke
+newpath 96.23837 174.77213 moveto
+95.65508 175.78242 lineto stroke
+newpath 95.65508 175.78242 moveto
+94.48853 175.78242 lineto stroke
+newpath 94.48853 175.78242 moveto
+95.0718 176.79268 lineto stroke
+newpath 95.0718 176.79268 moveto
+94.4885 177.80301 lineto stroke
+newpath 94.4885 177.80301 moveto
+95.6551 177.803 lineto stroke
+newpath 95.6551 177.803 moveto
+96.23837 178.81325 lineto stroke
+newpath 96.23837 178.81325 moveto
+95.65512 179.82346 lineto stroke
+newpath 95.65512 179.82346 moveto
+94.48857 179.82346 lineto stroke
+newpath 94.48857 179.82346 moveto
+95.07185 180.83371 lineto stroke
+newpath 95.07185 180.83371 moveto
+94.4886 181.84392 lineto stroke
+newpath 94.4886 181.84392 moveto
+95.65509 181.84392 lineto stroke
+newpath 95.65509 181.84392 moveto
+96.23837 182.85419 lineto stroke
+newpath 96.23837 182.85419 moveto
+96.82164 181.84392 lineto stroke
+newpath 96.82164 181.84392 moveto
+97.98813 181.84392 lineto stroke
+newpath 97.98813 181.84392 moveto
+98.5714 182.85417 lineto stroke
+newpath 98.5714 182.85417 moveto
+97.9881 183.8645 lineto stroke
+newpath 97.9881 183.8645 moveto
+99.15471 183.86449 lineto stroke
+newpath 99.15471 183.86449 moveto
+99.73798 184.87474 lineto stroke
+newpath 99.73798 184.87474 moveto
+100.32124 183.86449 lineto stroke
+newpath 100.32124 183.86449 moveto
+101.48785 183.86449 lineto stroke
+newpath 101.48785 183.86449 moveto
+100.90454 182.85417 lineto stroke
+newpath 100.90454 182.85417 moveto
+101.48781 181.84392 lineto stroke
+newpath 101.48781 181.84392 moveto
+102.6543 181.84392 lineto stroke
+newpath 102.6543 181.84392 moveto
+103.23758 182.85419 lineto stroke
+newpath 103.23758 182.85419 moveto
+103.82085 181.84392 lineto stroke
+newpath 103.82085 181.84392 moveto
+104.98734 181.84392 lineto stroke
+newpath 104.98734 181.84392 moveto
+105.57056 182.85408 lineto stroke
+newpath 105.57056 182.85408 moveto
+104.98732 183.86429 lineto stroke
+newpath 104.98732 183.86429 moveto
+106.1538 183.86429 lineto stroke
+newpath 106.1538 183.86429 moveto
+106.73701 184.87445 lineto stroke
+newpath 106.73701 184.87445 moveto
+106.15376 185.88466 lineto stroke
+newpath 106.15376 185.88466 moveto
+104.98723 185.88466 lineto stroke
+newpath 104.98723 185.88466 moveto
+105.5705 186.8949 lineto stroke
+newpath 105.5705 186.8949 moveto
+104.98724 187.9051 lineto stroke
+newpath 104.98724 187.9051 moveto
+106.15373 187.9051 lineto stroke
+newpath 106.15373 187.9051 moveto
+106.73698 188.91537 lineto stroke
+newpath 106.73698 188.91537 moveto
+107.32027 187.90512 lineto stroke
+newpath 107.32027 187.90512 moveto
+108.48676 187.90512 lineto stroke
+newpath 108.48676 187.90512 moveto
+109.06998 188.91528 lineto stroke
+newpath 109.06998 188.91528 moveto
+108.48674 189.92549 lineto stroke
+newpath 108.48674 189.92549 moveto
+109.65321 189.92549 lineto stroke
+newpath 109.65321 189.92549 moveto
+110.23643 190.93565 lineto stroke
+newpath 110.23643 190.93565 moveto
+109.65318 191.94586 lineto stroke
+newpath 109.65318 191.94586 moveto
+108.48663 191.94586 lineto stroke
+newpath 108.48663 191.94586 moveto
+109.06992 192.95612 lineto stroke
+newpath 109.06992 192.95612 moveto
+108.48666 193.96632 lineto stroke
+newpath 108.48666 193.96632 moveto
+107.32011 193.96632 lineto stroke
+newpath 107.32011 193.96632 moveto
+106.7368 192.95604 lineto stroke
+newpath 106.7368 192.95604 moveto
+106.15352 193.96634 lineto stroke
+newpath 106.15352 193.96634 moveto
+104.98697 193.96634 lineto stroke
+newpath 104.98697 193.96634 moveto
+105.57025 194.9766 lineto stroke
+newpath 105.57025 194.9766 moveto
+104.98695 195.98691 lineto stroke
+newpath 104.98695 195.98691 moveto
+106.15355 195.9869 lineto stroke
+newpath 106.15355 195.9869 moveto
+106.73683 196.99715 lineto stroke
+newpath 106.73683 196.99715 moveto
+106.15358 198.00735 lineto stroke
+newpath 106.15358 198.00735 moveto
+104.98703 198.00735 lineto stroke
+newpath 104.98703 198.00735 moveto
+105.57031 199.01761 lineto stroke
+newpath 105.57031 199.01761 moveto
+104.98706 200.02782 lineto stroke
+newpath 104.98706 200.02782 moveto
+103.82051 200.02782 lineto stroke
+newpath 103.82051 200.02782 moveto
+103.23723 199.0175 lineto stroke
+newpath 103.23723 199.0175 moveto
+102.65392 200.0278 lineto stroke
+newpath 102.65392 200.0278 moveto
+101.48737 200.0278 lineto stroke
+newpath 101.48737 200.0278 moveto
+100.90407 199.0175 lineto stroke
+newpath 100.90407 199.0175 moveto
+101.48741 198.00714 lineto stroke
+newpath 101.48741 198.00714 moveto
+100.32076 198.00714 lineto stroke
+newpath 100.32076 198.00714 moveto
+99.73746 196.99684 lineto stroke
+newpath 99.73746 196.99684 moveto
+99.15416 198.00714 lineto stroke
+newpath 99.15416 198.00714 moveto
+97.9875 198.00714 lineto stroke
+newpath 97.9875 198.00714 moveto
+98.57083 199.01749 lineto stroke
+newpath 98.57083 199.01749 moveto
+97.98753 200.02779 lineto stroke
+newpath 97.98753 200.02779 moveto
+96.82098 200.02779 lineto stroke
+newpath 96.82098 200.02779 moveto
+96.2377 199.01747 lineto stroke
+newpath 96.2377 199.01747 moveto
+95.65439 200.02777 lineto stroke
+newpath 95.65439 200.02777 moveto
+94.48784 200.02777 lineto stroke
+newpath 94.48784 200.02777 moveto
+95.0711 201.03802 lineto stroke
+newpath 95.0711 201.03802 moveto
+94.48781 202.04834 lineto stroke
+newpath 94.48781 202.04834 moveto
+95.6544 202.04834 lineto stroke
+newpath 95.6544 202.04834 moveto
+96.23767 203.0586 lineto stroke
+newpath 96.23767 203.0586 moveto
+95.65437 204.06891 lineto stroke
+newpath 95.65437 204.06891 moveto
+94.48772 204.06891 lineto stroke
+newpath 94.48772 204.06891 moveto
+95.07104 205.07925 lineto stroke
+newpath 95.07104 205.07925 moveto
+94.48775 206.08957 lineto stroke
+newpath 94.48775 206.08957 moveto
+95.65434 206.08957 lineto stroke
+newpath 95.65434 206.08957 moveto
+96.23769 207.09991 lineto stroke
+newpath 96.23769 207.09991 moveto
+96.821 206.08955 lineto stroke
+newpath 96.821 206.08955 moveto
+97.9876 206.08955 lineto stroke
+newpath 97.9876 206.08955 moveto
+98.57086 207.09981 lineto stroke
+newpath 98.57086 207.09981 moveto
+97.98756 208.11012 lineto stroke
+newpath 97.98756 208.11012 moveto
+99.15416 208.11012 lineto stroke
+newpath 99.15416 208.11012 moveto
+99.73743 209.12038 lineto stroke
+newpath 99.73743 209.12038 moveto
+99.15417 210.13058 lineto stroke
+newpath 99.15417 210.13058 moveto
+97.98763 210.13058 lineto stroke
+newpath 97.98763 210.13058 moveto
+98.5709 211.14084 lineto stroke
+newpath 98.5709 211.14084 moveto
+97.98766 212.15105 lineto stroke
+newpath 97.98766 212.15105 moveto
+96.8211 212.15105 lineto stroke
+newpath 96.8211 212.15105 moveto
+96.2378 211.14076 lineto stroke
+newpath 96.2378 211.14076 moveto
+95.65451 212.15106 lineto stroke
+newpath 95.65451 212.15106 moveto
+94.48796 212.15106 lineto stroke
+newpath 94.48796 212.15106 moveto
+95.07124 213.16132 lineto stroke
+newpath 95.07124 213.16132 moveto
+94.48795 214.17163 lineto stroke
+newpath 94.48795 214.17163 moveto
+95.65454 214.17162 lineto stroke
+newpath 95.65454 214.17162 moveto
+96.23782 215.18187 lineto stroke
+newpath 96.23782 215.18187 moveto
+95.65457 216.19208 lineto stroke
+newpath 95.65457 216.19208 moveto
+94.48802 216.19208 lineto stroke
+newpath 94.48802 216.19208 moveto
+95.0713 217.20233 lineto stroke
+newpath 95.0713 217.20233 moveto
+94.48805 218.21254 lineto stroke
+newpath 94.48805 218.21254 moveto
+95.65454 218.21254 lineto stroke
+newpath 95.65454 218.21254 moveto
+96.23782 219.22281 lineto stroke
+newpath 96.23782 219.22281 moveto
+96.82109 218.21254 lineto stroke
+newpath 96.82109 218.21254 moveto
+97.98758 218.21254 lineto stroke
+newpath 97.98758 218.21254 moveto
+98.57085 219.2228 lineto stroke
+newpath 98.57085 219.2228 moveto
+97.98755 220.23312 lineto stroke
+newpath 97.98755 220.23312 moveto
+99.15416 220.23311 lineto stroke
+newpath 99.15416 220.23311 moveto
+99.73743 221.24336 lineto stroke
+newpath 99.73743 221.24336 moveto
+100.3207 220.23311 lineto stroke
+newpath 100.3207 220.23311 moveto
+101.4873 220.23311 lineto stroke
+newpath 101.4873 220.23311 moveto
+100.90399 219.2228 lineto stroke
+newpath 100.90399 219.2228 moveto
+101.48726 218.21254 lineto stroke
+newpath 101.48726 218.21254 moveto
+102.65375 218.21254 lineto stroke
+newpath 102.65375 218.21254 moveto
+103.23703 219.22281 lineto stroke
+newpath 103.23703 219.22281 moveto
+103.8203 218.21254 lineto stroke
+newpath 103.8203 218.21254 moveto
+104.98679 218.21254 lineto stroke
+newpath 104.98679 218.21254 moveto
+105.57005 219.2228 lineto stroke
+newpath 105.57005 219.2228 moveto
+104.98676 220.23312 lineto stroke
+newpath 104.98676 220.23312 moveto
+106.15337 220.2331 lineto stroke
+newpath 106.15337 220.2331 moveto
+106.73663 221.24335 lineto stroke
+newpath 106.73663 221.24335 moveto
+106.15334 222.25366 lineto stroke
+newpath 106.15334 222.25366 moveto
+104.98668 222.25366 lineto stroke
+newpath 104.98668 222.25366 moveto
+105.57 223.264 lineto stroke
+newpath 105.57 223.264 moveto
+104.98671 224.27432 lineto stroke
+newpath 104.98671 224.27432 moveto
+106.1533 224.27432 lineto stroke
+newpath 106.1533 224.27432 moveto
+106.73665 225.28467 lineto stroke
+newpath 106.73665 225.28467 moveto
+107.31996 224.2743 lineto stroke
+newpath 107.31996 224.2743 moveto
+108.48656 224.2743 lineto stroke
+newpath 108.48656 224.2743 moveto
+109.06982 225.28456 lineto stroke
+newpath 109.06982 225.28456 moveto
+108.48653 226.29489 lineto stroke
+newpath 108.48653 226.29489 moveto
+109.65314 226.29486 lineto stroke
+newpath 109.65314 226.29486 moveto
+110.2364 227.30511 lineto stroke
+newpath 110.2364 227.30511 moveto
+110.81967 226.29486 lineto stroke
+newpath 110.81967 226.29486 moveto
+111.98628 226.29486 lineto stroke
+newpath 111.98628 226.29486 moveto
+111.40297 225.28455 lineto stroke
+newpath 111.40297 225.28455 moveto
+111.98624 224.27429 lineto stroke
+newpath 111.98624 224.27429 moveto
+113.15283 224.27429 lineto stroke
+newpath 113.15283 224.27429 moveto
+113.73616 225.28464 lineto stroke
+newpath 113.73616 225.28464 moveto
+114.31947 224.27429 lineto stroke
+newpath 114.31947 224.27429 moveto
+115.48607 224.27429 lineto stroke
+newpath 115.48607 224.27429 moveto
+114.90277 223.26399 lineto stroke
+newpath 114.90277 223.26399 moveto
+115.48608 222.25365 lineto stroke
+newpath 115.48608 222.25365 moveto
+114.31944 222.25365 lineto stroke
+newpath 114.31944 222.25365 moveto
+113.73615 221.24335 lineto stroke
+newpath 113.73615 221.24335 moveto
+114.31941 220.2331 lineto stroke
+newpath 114.31941 220.2331 moveto
+115.48602 220.2331 lineto stroke
+newpath 115.48602 220.2331 moveto
+114.90271 219.22278 lineto stroke
+newpath 114.90271 219.22278 moveto
+115.48598 218.21252 lineto stroke
+newpath 115.48598 218.21252 moveto
+116.65247 218.21252 lineto stroke
+newpath 116.65247 218.21252 moveto
+117.23575 219.2228 lineto stroke
+newpath 117.23575 219.2228 moveto
+117.81902 218.21252 lineto stroke
+newpath 117.81902 218.21252 moveto
+118.9855 218.21252 lineto stroke
+newpath 118.9855 218.21252 moveto
+119.56877 219.22278 lineto stroke
+newpath 119.56877 219.22278 moveto
+118.98547 220.23311 lineto stroke
+newpath 118.98547 220.23311 moveto
+120.15208 220.2331 lineto stroke
+newpath 120.15208 220.2331 moveto
+120.73535 221.24335 lineto stroke
+newpath 120.73535 221.24335 moveto
+121.31862 220.2331 lineto stroke
+newpath 121.31862 220.2331 moveto
+122.48523 220.2331 lineto stroke
+newpath 122.48523 220.2331 moveto
+121.90192 219.22278 lineto stroke
+newpath 121.90192 219.22278 moveto
+122.48518 218.21252 lineto stroke
+newpath 122.48518 218.21252 moveto
+123.65167 218.21252 lineto stroke
+newpath 123.65167 218.21252 moveto
+124.23495 219.2228 lineto stroke
+newpath 124.23495 219.2228 moveto
+124.81822 218.21252 lineto stroke
+newpath 124.81822 218.21252 moveto
+125.98471 218.21252 lineto stroke
+newpath 125.98471 218.21252 moveto
+126.56793 219.22269 lineto stroke
+newpath 126.56793 219.22269 moveto
+125.9847 220.2329 lineto stroke
+newpath 125.9847 220.2329 moveto
+127.15117 220.2329 lineto stroke
+newpath 127.15117 220.2329 moveto
+127.73439 221.24306 lineto stroke
+newpath 127.73439 221.24306 moveto
+127.15114 222.25327 lineto stroke
+newpath 127.15114 222.25327 moveto
+125.9846 222.25327 lineto stroke
+newpath 125.9846 222.25327 moveto
+126.56787 223.2635 lineto stroke
+newpath 126.56787 223.2635 moveto
+125.98462 224.27371 lineto stroke
+newpath 125.98462 224.27371 moveto
+127.15111 224.27371 lineto stroke
+newpath 127.15111 224.27371 moveto
+127.73436 225.28398 lineto stroke
+newpath 127.73436 225.28398 moveto
+128.31764 224.27373 lineto stroke
+newpath 128.31764 224.27373 moveto
+129.48413 224.27373 lineto stroke
+newpath 129.48413 224.27373 moveto
+130.06735 225.28389 lineto stroke
+newpath 130.06735 225.28389 moveto
+129.48412 226.2941 lineto stroke
+newpath 129.48412 226.2941 moveto
+130.65059 226.2941 lineto stroke
+newpath 130.65059 226.2941 moveto
+131.23381 227.30426 lineto stroke
+newpath 131.23381 227.30426 moveto
+130.65056 228.31447 lineto stroke
+newpath 130.65056 228.31447 moveto
+129.48401 228.31447 lineto stroke
+newpath 129.48401 228.31447 moveto
+130.06729 229.32472 lineto stroke
+newpath 130.06729 229.32472 moveto
+129.48404 230.33493 lineto stroke
+newpath 129.48404 230.33493 moveto
+128.31749 230.33493 lineto stroke
+newpath 128.31749 230.33493 moveto
+127.73419 229.32463 lineto stroke
+newpath 127.73419 229.32463 moveto
+127.1509 230.33493 lineto stroke
+newpath 127.1509 230.33493 moveto
+125.98434 230.33493 lineto stroke
+newpath 125.98434 230.33493 moveto
+126.56761 231.34518 lineto stroke
+newpath 126.56761 231.34518 moveto
+125.98431 232.35551 lineto stroke
+newpath 125.98431 232.35551 moveto
+127.15092 232.3555 lineto stroke
+newpath 127.15092 232.3555 moveto
+127.73419 233.36575 lineto stroke
+newpath 127.73419 233.36575 moveto
+127.15094 234.37596 lineto stroke
+newpath 127.15094 234.37596 moveto
+125.98439 234.37596 lineto stroke
+newpath 125.98439 234.37596 moveto
+126.56767 235.38622 lineto stroke
+newpath 126.56767 235.38622 moveto
+125.98442 236.39642 lineto stroke
+newpath 125.98442 236.39642 moveto
+127.15091 236.39642 lineto stroke
+newpath 127.15091 236.39642 moveto
+127.73419 237.4067 lineto stroke
+newpath 127.73419 237.4067 moveto
+128.31746 236.39642 lineto stroke
+newpath 128.31746 236.39642 moveto
+129.48395 236.39642 lineto stroke
+newpath 129.48395 236.39642 moveto
+130.06721 237.40668 lineto stroke
+newpath 130.06721 237.40668 moveto
+129.48392 238.417 lineto stroke
+newpath 129.48392 238.417 moveto
+130.65053 238.41699 lineto stroke
+newpath 130.65053 238.41699 moveto
+131.2338 239.42725 lineto stroke
+newpath 131.2338 239.42725 moveto
+131.81706 238.41699 lineto stroke
+newpath 131.81706 238.41699 moveto
+132.98367 238.41699 lineto stroke
+newpath 132.98367 238.41699 moveto
+132.40036 237.40668 lineto stroke
+newpath 132.40036 237.40668 moveto
+132.98363 236.39642 lineto stroke
+newpath 132.98363 236.39642 moveto
+134.15012 236.39642 lineto stroke
+newpath 134.15012 236.39642 moveto
+134.7334 237.4067 lineto stroke
+newpath 134.7334 237.4067 moveto
+135.31667 236.39642 lineto stroke
+newpath 135.31667 236.39642 moveto
+136.48315 236.39642 lineto stroke
+newpath 136.48315 236.39642 moveto
+137.06638 237.40659 lineto stroke
+newpath 137.06638 237.40659 moveto
+136.48314 238.4168 lineto stroke
+newpath 136.48314 238.4168 moveto
+137.64961 238.4168 lineto stroke
+newpath 137.64961 238.4168 moveto
+138.23283 239.42696 lineto stroke
+newpath 138.23283 239.42696 moveto
+137.64958 240.43716 lineto stroke
+newpath 137.64958 240.43716 moveto
+136.48305 240.43716 lineto stroke
+newpath 136.48305 240.43716 moveto
+137.06631 241.4474 lineto stroke
+newpath 137.06631 241.4474 moveto
+136.48306 242.45761 lineto stroke
+newpath 136.48306 242.45761 moveto
+137.64955 242.45761 lineto stroke
+newpath 137.64955 242.45761 moveto
+138.2328 243.46788 lineto stroke
+newpath 138.2328 243.46788 moveto
+138.81609 242.45763 lineto stroke
+newpath 138.81609 242.45763 moveto
+139.98257 242.45763 lineto stroke
+newpath 139.98257 242.45763 moveto
+140.5658 243.46779 lineto stroke
+newpath 140.5658 243.46779 moveto
+139.98256 244.478 lineto stroke
+newpath 139.98256 244.478 moveto
+141.14903 244.478 lineto stroke
+newpath 141.14903 244.478 moveto
+141.73225 245.48816 lineto stroke
+newpath 141.73225 245.48816 moveto
+142.31548 244.478 lineto stroke
+newpath 142.31548 244.478 moveto
+143.48196 244.47798 lineto stroke
+newpath 143.48196 244.47798 moveto
+142.89871 243.46779 lineto stroke
+newpath 142.89871 243.46779 moveto
+143.48193 242.45763 lineto stroke
+newpath 143.48193 242.45763 moveto
+144.64842 242.45763 lineto stroke
+newpath 144.64842 242.45763 moveto
+145.23172 243.46788 lineto stroke
+newpath 145.23172 243.46788 moveto
+145.81497 242.45761 lineto stroke
+newpath 145.81497 242.45761 moveto
+146.98146 242.45761 lineto stroke
+newpath 146.98146 242.45761 moveto
+146.39821 241.4474 lineto stroke
+newpath 146.39821 241.4474 moveto
+146.98146 240.43713 lineto stroke
+newpath 146.98146 240.43713 moveto
+145.81493 240.43716 lineto stroke
+newpath 145.81493 240.43716 moveto
+145.23167 239.42696 lineto stroke
+newpath 145.23167 239.42696 moveto
+145.8149 238.4168 lineto stroke
+newpath 145.8149 238.4168 moveto
+146.98138 238.41678 lineto stroke
+newpath 146.98138 238.41678 moveto
+146.39813 237.40659 lineto stroke
+newpath 146.39813 237.40659 moveto
+146.98135 236.39642 lineto stroke
+newpath 146.98135 236.39642 moveto
+148.14784 236.39642 lineto stroke
+newpath 148.14784 236.39642 moveto
+148.73112 237.4067 lineto stroke
+newpath 148.73112 237.4067 moveto
+149.31439 236.39642 lineto stroke
+newpath 149.31439 236.39642 moveto
+150.48088 236.39642 lineto stroke
+newpath 150.48088 236.39642 moveto
+151.06415 237.4067 lineto stroke
+newpath 151.06415 237.4067 moveto
+150.48085 238.41702 lineto stroke
+newpath 150.48085 238.41702 moveto
+151.64746 238.41699 lineto stroke
+newpath 151.64746 238.41699 moveto
+152.23073 239.42726 lineto stroke
+newpath 152.23073 239.42726 moveto
+152.814 238.41699 lineto stroke
+newpath 152.814 238.41699 moveto
+153.9806 238.417 lineto stroke
+newpath 153.9806 238.417 moveto
+153.39731 237.4067 lineto stroke
+newpath 153.39731 237.4067 moveto
+153.98058 236.39642 lineto stroke
+newpath 153.98058 236.39642 moveto
+155.14706 236.39642 lineto stroke
+newpath 155.14706 236.39642 moveto
+155.73035 237.4067 lineto stroke
+newpath 155.73035 237.4067 moveto
+156.31361 236.39642 lineto stroke
+newpath 156.31361 236.39642 moveto
+157.4801 236.39642 lineto stroke
+newpath 157.4801 236.39642 moveto
+156.89685 235.38622 lineto stroke
+newpath 156.89685 235.38622 moveto
+157.48012 234.37596 lineto stroke
+newpath 157.48012 234.37596 moveto
+156.31358 234.37596 lineto stroke
+newpath 156.31358 234.37596 moveto
+155.73033 233.36575 lineto stroke
+newpath 155.73033 233.36575 moveto
+156.3136 232.35548 lineto stroke
+newpath 156.3136 232.35548 moveto
+157.48021 232.35548 lineto stroke
+newpath 157.48021 232.35548 moveto
+156.8969 231.34518 lineto stroke
+newpath 156.8969 231.34518 moveto
+157.48016 230.33492 lineto stroke
+newpath 157.48016 230.33492 moveto
+156.31361 230.33492 lineto stroke
+newpath 156.31361 230.33492 moveto
+155.7303 229.32463 lineto stroke
+newpath 155.7303 229.32463 moveto
+155.14702 230.33493 lineto stroke
+newpath 155.14702 230.33493 moveto
+153.98047 230.33493 lineto stroke
+newpath 153.98047 230.33493 moveto
+153.39722 229.32472 lineto stroke
+newpath 153.39722 229.32472 moveto
+153.98048 228.31447 lineto stroke
+newpath 153.98048 228.31447 moveto
+152.81395 228.31447 lineto stroke
+newpath 152.81395 228.31447 moveto
+152.2307 227.30426 lineto stroke
+newpath 152.2307 227.30426 moveto
+152.81392 226.2941 lineto stroke
+newpath 152.81392 226.2941 moveto
+153.98041 226.29408 lineto stroke
+newpath 153.98041 226.29408 moveto
+153.39716 225.28389 lineto stroke
+newpath 153.39716 225.28389 moveto
+153.98038 224.27373 lineto stroke
+newpath 153.98038 224.27373 moveto
+155.14687 224.27373 lineto stroke
+newpath 155.14687 224.27373 moveto
+155.73016 225.28398 lineto stroke
+newpath 155.73016 225.28398 moveto
+156.31342 224.27371 lineto stroke
+newpath 156.31342 224.27371 moveto
+157.4799 224.27371 lineto stroke
+newpath 157.4799 224.27371 moveto
+156.89665 223.2635 lineto stroke
+newpath 156.89665 223.2635 moveto
+157.4799 222.25323 lineto stroke
+newpath 157.4799 222.25323 moveto
+156.31337 222.25327 lineto stroke
+newpath 156.31337 222.25327 moveto
+155.73012 221.24306 lineto stroke
+newpath 155.73012 221.24306 moveto
+156.31334 220.2329 lineto stroke
+newpath 156.31334 220.2329 moveto
+157.47983 220.23288 lineto stroke
+newpath 157.47983 220.23288 moveto
+156.89658 219.22269 lineto stroke
+newpath 156.89658 219.22269 moveto
+157.4798 218.21252 lineto stroke
+newpath 157.4798 218.21252 moveto
+158.64629 218.21252 lineto stroke
+newpath 158.64629 218.21252 moveto
+159.22957 219.2228 lineto stroke
+newpath 159.22957 219.2228 moveto
+159.81284 218.21252 lineto stroke
+newpath 159.81284 218.21252 moveto
+160.97932 218.21252 lineto stroke
+newpath 160.97932 218.21252 moveto
+161.56259 219.22278 lineto stroke
+newpath 161.56259 219.22278 moveto
+160.9793 220.23311 lineto stroke
+newpath 160.9793 220.23311 moveto
+162.1459 220.2331 lineto stroke
+newpath 162.1459 220.2331 moveto
+162.72917 221.24335 lineto stroke
+newpath 162.72917 221.24335 moveto
+163.31244 220.2331 lineto stroke
+newpath 163.31244 220.2331 moveto
+164.47905 220.2331 lineto stroke
+newpath 164.47905 220.2331 moveto
+163.89574 219.22278 lineto stroke
+newpath 163.89574 219.22278 moveto
+164.479 218.21252 lineto stroke
+newpath 164.479 218.21252 moveto
+165.6455 218.21252 lineto stroke
+newpath 165.6455 218.21252 moveto
+166.22878 219.2228 lineto stroke
+newpath 166.22878 219.2228 moveto
+166.81204 218.21252 lineto stroke
+newpath 166.81204 218.21252 moveto
+167.97853 218.21252 lineto stroke
+newpath 167.97853 218.21252 moveto
+168.5618 219.22278 lineto stroke
+newpath 168.5618 219.22278 moveto
+167.9785 220.23311 lineto stroke
+newpath 167.9785 220.23311 moveto
+169.14511 220.2331 lineto stroke
+newpath 169.14511 220.2331 moveto
+169.72838 221.24335 lineto stroke
+newpath 169.72838 221.24335 moveto
+169.14508 222.25365 lineto stroke
+newpath 169.14508 222.25365 moveto
+167.97841 222.25365 lineto stroke
+newpath 167.97841 222.25365 moveto
+168.56174 223.264 lineto stroke
+newpath 168.56174 223.264 moveto
+167.97844 224.2743 lineto stroke
+newpath 167.97844 224.2743 moveto
+169.14503 224.2743 lineto stroke
+newpath 169.14503 224.2743 moveto
+169.72836 225.28467 lineto stroke
+newpath 169.72836 225.28467 moveto
+170.31169 224.2743 lineto stroke
+newpath 170.31169 224.2743 moveto
+171.47829 224.2743 lineto stroke
+newpath 171.47829 224.2743 moveto
+172.06155 225.28456 lineto stroke
+newpath 172.06155 225.28456 moveto
+171.47826 226.29489 lineto stroke
+newpath 171.47826 226.29489 moveto
+172.64487 226.29488 lineto stroke
+newpath 172.64487 226.29488 moveto
+173.22813 227.30513 lineto stroke
+newpath 173.22813 227.30513 moveto
+173.8114 226.29488 lineto stroke
+newpath 173.8114 226.29488 moveto
+174.97801 226.29489 lineto stroke
+newpath 174.97801 226.29489 moveto
+174.39471 225.28456 lineto stroke
+newpath 174.39471 225.28456 moveto
+174.97798 224.2743 lineto stroke
+newpath 174.97798 224.2743 moveto
+176.14458 224.2743 lineto stroke
+newpath 176.14458 224.2743 moveto
+176.72792 225.28465 lineto stroke
+newpath 176.72792 225.28465 moveto
+177.31123 224.27429 lineto stroke
+newpath 177.31123 224.27429 moveto
+178.47783 224.27429 lineto stroke
+newpath 178.47783 224.27429 moveto
+177.89453 223.26399 lineto stroke
+newpath 177.89453 223.26399 moveto
+178.47784 222.25363 lineto stroke
+newpath 178.47784 222.25363 moveto
+177.31119 222.25365 lineto stroke
+newpath 177.31119 222.25365 moveto
+176.72789 221.24335 lineto stroke
+newpath 176.72789 221.24335 moveto
+177.31116 220.2331 lineto stroke
+newpath 177.31116 220.2331 moveto
+178.47777 220.23311 lineto stroke
+newpath 178.47777 220.23311 moveto
+177.89447 219.22278 lineto stroke
+newpath 177.89447 219.22278 moveto
+178.47774 218.21252 lineto stroke
+newpath 178.47774 218.21252 moveto
+179.64423 218.21252 lineto stroke
+newpath 179.64423 218.21252 moveto
+180.22751 219.2228 lineto stroke
+newpath 180.22751 219.2228 moveto
+180.81078 218.21252 lineto stroke
+newpath 180.81078 218.21252 moveto
+181.97726 218.21252 lineto stroke
+newpath 181.97726 218.21252 moveto
+182.56053 219.22278 lineto stroke
+newpath 182.56053 219.22278 moveto
+181.97723 220.23311 lineto stroke
+newpath 181.97723 220.23311 moveto
+183.14384 220.2331 lineto stroke
+newpath 183.14384 220.2331 moveto
+183.72711 221.24335 lineto stroke
+newpath 183.72711 221.24335 moveto
+184.31038 220.2331 lineto stroke
+newpath 184.31038 220.2331 moveto
+185.47699 220.2331 lineto stroke
+newpath 185.47699 220.2331 moveto
+184.89368 219.22278 lineto stroke
+newpath 184.89368 219.22278 moveto
+185.47694 218.21252 lineto stroke
+newpath 185.47694 218.21252 moveto
+186.64343 218.21252 lineto stroke
+newpath 186.64343 218.21252 moveto
+187.22672 219.2228 lineto stroke
+newpath 187.22672 219.2228 moveto
+187.80998 218.21252 lineto stroke
+newpath 187.80998 218.21252 moveto
+188.97647 218.21252 lineto stroke
+newpath 188.97647 218.21252 moveto
+188.39322 217.20232 lineto stroke
+newpath 188.39322 217.20232 moveto
+188.97649 216.19206 lineto stroke
+newpath 188.97649 216.19206 moveto
+187.80995 216.19206 lineto stroke
+newpath 187.80995 216.19206 moveto
+187.2267 215.18185 lineto stroke
+newpath 187.2267 215.18185 moveto
+187.80997 214.1716 lineto stroke
+newpath 187.80997 214.1716 moveto
+188.97658 214.17162 lineto stroke
+newpath 188.97658 214.17162 moveto
+188.39328 213.16129 lineto stroke
+newpath 188.39328 213.16129 moveto
+188.97655 212.15103 lineto stroke
+newpath 188.97655 212.15103 moveto
+187.81 212.15103 lineto stroke
+newpath 187.81 212.15103 moveto
+187.22668 211.14075 lineto stroke
+newpath 187.22668 211.14075 moveto
+186.6434 212.15105 lineto stroke
+newpath 186.6434 212.15105 moveto
+185.47685 212.15105 lineto stroke
+newpath 185.47685 212.15105 moveto
+184.8936 211.14084 lineto stroke
+newpath 184.8936 211.14084 moveto
+185.47687 210.13058 lineto stroke
+newpath 185.47687 210.13058 moveto
+184.31033 210.13058 lineto stroke
+newpath 184.31033 210.13058 moveto
+183.72708 209.12038 lineto stroke
+newpath 183.72708 209.12038 moveto
+184.31035 208.11012 lineto stroke
+newpath 184.31035 208.11012 moveto
+185.47696 208.11014 lineto stroke
+newpath 185.47696 208.11014 moveto
+184.89366 207.09981 lineto stroke
+newpath 184.89366 207.09981 moveto
+185.47693 206.08955 lineto stroke
+newpath 185.47693 206.08955 moveto
+186.64352 206.08955 lineto stroke
+newpath 186.64352 206.08955 moveto
+187.22687 207.0999 lineto stroke
+newpath 187.22687 207.0999 moveto
+187.81018 206.08954 lineto stroke
+newpath 187.81018 206.08954 moveto
+188.97678 206.08954 lineto stroke
+newpath 188.97678 206.08954 moveto
+188.39348 205.07924 lineto stroke
+newpath 188.39348 205.07924 moveto
+188.97679 204.06888 lineto stroke
+newpath 188.97679 204.06888 moveto
+187.81013 204.0689 lineto stroke
+newpath 187.81013 204.0689 moveto
+187.22684 203.0586 lineto stroke
+newpath 187.22684 203.0586 moveto
+187.8101 202.04834 lineto stroke
+newpath 187.8101 202.04834 moveto
+188.97672 202.04836 lineto stroke
+newpath 188.97672 202.04836 moveto
+188.39342 201.03802 lineto stroke
+newpath 188.39342 201.03802 moveto
+188.97668 200.02777 lineto stroke
+newpath 188.97668 200.02777 moveto
+187.81013 200.02777 lineto stroke
+newpath 187.81013 200.02777 moveto
+187.22682 199.01749 lineto stroke
+newpath 187.22682 199.01749 moveto
+186.64354 200.02779 lineto stroke
+newpath 186.64354 200.02779 moveto
+185.47699 200.02779 lineto stroke
+newpath 185.47699 200.02779 moveto
+184.89369 199.01749 lineto stroke
+newpath 184.89369 199.01749 moveto
+185.477 198.00714 lineto stroke
+newpath 185.477 198.00714 moveto
+184.31036 198.00714 lineto stroke
+newpath 184.31036 198.00714 moveto
+183.72707 196.99684 lineto stroke
+newpath 183.72707 196.99684 moveto
+183.14377 198.00714 lineto stroke
+newpath 183.14377 198.00714 moveto
+181.97713 198.00714 lineto stroke
+newpath 181.97713 198.00714 moveto
+182.56046 199.01749 lineto stroke
+newpath 182.56046 199.01749 moveto
+181.97716 200.02779 lineto stroke
+newpath 181.97716 200.02779 moveto
+180.81061 200.02779 lineto stroke
+newpath 180.81061 200.02779 moveto
+180.2273 199.0175 lineto stroke
+newpath 180.2273 199.0175 moveto
+179.64401 200.0278 lineto stroke
+newpath 179.64401 200.0278 moveto
+178.47746 200.0278 lineto stroke
+newpath 178.47746 200.0278 moveto
+177.89421 199.0176 lineto stroke
+newpath 177.89421 199.0176 moveto
+178.47748 198.00734 lineto stroke
+newpath 178.47748 198.00734 moveto
+177.31094 198.00734 lineto stroke
+newpath 177.31094 198.00734 moveto
+176.72769 196.99713 lineto stroke
+newpath 176.72769 196.99713 moveto
+177.31096 195.98688 lineto stroke
+newpath 177.31096 195.98688 moveto
+178.47757 195.9869 lineto stroke
+newpath 178.47757 195.9869 moveto
+177.89427 194.97656 lineto stroke
+newpath 177.89427 194.97656 moveto
+178.47754 193.96631 lineto stroke
+newpath 178.47754 193.96631 moveto
+177.31099 193.96631 lineto stroke
+newpath 177.31099 193.96631 moveto
+176.72768 192.95602 lineto stroke
+newpath 176.72768 192.95602 moveto
+176.1444 193.96632 lineto stroke
+newpath 176.1444 193.96632 moveto
+174.97784 193.96632 lineto stroke
+newpath 174.97784 193.96632 moveto
+174.39459 192.95612 lineto stroke
+newpath 174.39459 192.95612 moveto
+174.97786 191.94586 lineto stroke
+newpath 174.97786 191.94586 moveto
+173.81133 191.94586 lineto stroke
+newpath 173.81133 191.94586 moveto
+173.22807 190.93565 lineto stroke
+newpath 173.22807 190.93565 moveto
+173.8113 189.92549 lineto stroke
+newpath 173.8113 189.92549 moveto
+174.97778 189.92548 lineto stroke
+newpath 174.97778 189.92548 moveto
+174.39453 188.91528 lineto stroke
+newpath 174.39453 188.91528 moveto
+174.97775 187.90512 lineto stroke
+newpath 174.97775 187.90512 moveto
+176.14424 187.90512 lineto stroke
+newpath 176.14424 187.90512 moveto
+176.72754 188.91537 lineto stroke
+newpath 176.72754 188.91537 moveto
+177.31079 187.9051 lineto stroke
+newpath 177.31079 187.9051 moveto
+178.47728 187.9051 lineto stroke
+newpath 178.47728 187.9051 moveto
+177.89403 186.8949 lineto stroke
+newpath 177.89403 186.8949 moveto
+178.47728 185.88463 lineto stroke
+newpath 178.47728 185.88463 moveto
+177.31075 185.88466 lineto stroke
+newpath 177.31075 185.88466 moveto
+176.7275 184.87445 lineto stroke
+newpath 176.7275 184.87445 moveto
+177.31071 183.86429 lineto stroke
+newpath 177.31071 183.86429 moveto
+178.4772 183.86427 lineto stroke
+newpath 178.4772 183.86427 moveto
+177.89395 182.85408 lineto stroke
+newpath 177.89395 182.85408 moveto
+178.47717 181.84392 lineto stroke
+newpath 178.47717 181.84392 moveto
+179.64366 181.84392 lineto stroke
+newpath 179.64366 181.84392 moveto
+180.22694 182.85419 lineto stroke
+newpath 180.22694 182.85419 moveto
+180.81021 181.84392 lineto stroke
+newpath 180.81021 181.84392 moveto
+181.9767 181.84392 lineto stroke
+newpath 181.9767 181.84392 moveto
+182.55997 182.85419 lineto stroke
+newpath 182.55997 182.85419 moveto
+181.97667 183.86452 lineto stroke
+newpath 181.97667 183.86452 moveto
+183.14328 183.86449 lineto stroke
+newpath 183.14328 183.86449 moveto
+183.72655 184.87476 lineto stroke
+newpath 183.72655 184.87476 moveto
+184.30981 183.86449 lineto stroke
+newpath 184.30981 183.86449 moveto
+185.47643 183.8645 lineto stroke
+newpath 185.47643 183.8645 moveto
+184.89313 182.85419 lineto stroke
+newpath 184.89313 182.85419 moveto
+185.4764 181.84392 lineto stroke
+newpath 185.4764 181.84392 moveto
+186.64288 181.84392 lineto stroke
+newpath 186.64288 181.84392 moveto
+187.22617 182.85419 lineto stroke
+newpath 187.22617 182.85419 moveto
+187.80943 181.84392 lineto stroke
+newpath 187.80943 181.84392 moveto
+188.97592 181.84392 lineto stroke
+newpath 188.97592 181.84392 moveto
+188.39267 180.83371 lineto stroke
+newpath 188.39267 180.83371 moveto
+188.97594 179.82346 lineto stroke
+newpath 188.97594 179.82346 moveto
+187.8094 179.82346 lineto stroke
+newpath 187.8094 179.82346 moveto
+187.22615 178.81325 lineto stroke
+newpath 187.22615 178.81325 moveto
+187.80942 177.80298 lineto stroke
+newpath 187.80942 177.80298 moveto
+188.97603 177.80298 lineto stroke
+newpath 188.97603 177.80298 moveto
+188.39272 176.79268 lineto stroke
+newpath 188.39272 176.79268 moveto
+188.97598 175.78241 lineto stroke
+newpath 188.97598 175.78241 moveto
+187.80943 175.78241 lineto stroke
+newpath 187.80943 175.78241 moveto
+187.22612 174.77213 lineto stroke
+newpath 187.22612 174.77213 moveto
+186.64284 175.78242 lineto stroke
+newpath 186.64284 175.78242 moveto
+185.47629 175.78242 lineto stroke
+newpath 185.47629 175.78242 moveto
+184.89304 174.77222 lineto stroke
+newpath 184.89304 174.77222 moveto
+185.4763 173.76196 lineto stroke
+newpath 185.4763 173.76196 moveto
+184.30977 173.76196 lineto stroke
+newpath 184.30977 173.76196 moveto
+183.72652 172.75175 lineto stroke
+newpath 183.72652 172.75175 moveto
+184.30974 171.7416 lineto stroke
+newpath 184.30974 171.7416 moveto
+185.47623 171.74158 lineto stroke
+newpath 185.47623 171.74158 moveto
+184.89297 170.73138 lineto stroke
+newpath 184.89297 170.73138 moveto
+185.4762 169.72122 lineto stroke
+newpath 185.4762 169.72122 moveto
+186.64268 169.72122 lineto stroke
+newpath 186.64268 169.72122 moveto
+187.22598 170.73148 lineto stroke
+newpath 187.22598 170.73148 moveto
+187.80923 169.7212 lineto stroke
+newpath 187.80923 169.7212 moveto
+188.97572 169.7212 lineto stroke
+newpath 188.97572 169.7212 moveto
+188.39247 168.711 lineto stroke
+newpath 188.39247 168.711 moveto
+188.97572 167.70073 lineto stroke
+newpath 188.97572 167.70073 moveto
+187.80919 167.70076 lineto stroke
+newpath 187.80919 167.70076 moveto
+187.22594 166.69055 lineto stroke
+newpath 187.22594 166.69055 moveto
+187.80916 165.68039 lineto stroke
+newpath 187.80916 165.68039 moveto
+188.97565 165.68037 lineto stroke
+newpath 188.97565 165.68037 moveto
+188.3924 164.67018 lineto stroke
+newpath 188.3924 164.67018 moveto
+188.97562 163.66002 lineto stroke
+newpath 188.97562 163.66002 moveto
+190.1421 163.66002 lineto stroke
+newpath 190.1421 163.66002 moveto
+190.72539 164.67029 lineto stroke
+newpath 190.72539 164.67029 moveto
+191.30865 163.66002 lineto stroke
+newpath 191.30865 163.66002 moveto
+192.47514 163.66002 lineto stroke
+newpath 192.47514 163.66002 moveto
+193.05841 164.67027 lineto stroke
+newpath 193.05841 164.67027 moveto
+192.47511 165.6806 lineto stroke
+newpath 192.47511 165.6806 moveto
+193.64172 165.68059 lineto stroke
+newpath 193.64172 165.68059 moveto
+194.22499 166.69084 lineto stroke
+newpath 194.22499 166.69084 moveto
+194.80826 165.68059 lineto stroke
+newpath 194.80826 165.68059 moveto
+195.97487 165.68059 lineto stroke
+newpath 195.97487 165.68059 moveto
+195.39156 164.67027 lineto stroke
+newpath 195.39156 164.67027 moveto
+195.97482 163.66002 lineto stroke
+newpath 195.97482 163.66002 moveto
+197.14131 163.66002 lineto stroke
+newpath 197.14131 163.66002 moveto
+197.7246 164.67029 lineto stroke
+newpath 197.7246 164.67029 moveto
+198.30786 163.66002 lineto stroke
+newpath 198.30786 163.66002 moveto
+199.47435 163.66002 lineto stroke
+newpath 199.47435 163.66002 moveto
+200.05762 164.67027 lineto stroke
+newpath 200.05762 164.67027 moveto
+199.47432 165.6806 lineto stroke
+newpath 199.47432 165.6806 moveto
+200.64093 165.68059 lineto stroke
+newpath 200.64093 165.68059 moveto
+201.2242 166.69084 lineto stroke
+newpath 201.2242 166.69084 moveto
+200.6409 167.70114 lineto stroke
+newpath 200.6409 167.70114 moveto
+199.47423 167.70114 lineto stroke
+newpath 199.47423 167.70114 moveto
+200.05756 168.7115 lineto stroke
+newpath 200.05756 168.7115 moveto
+199.47426 169.7218 lineto stroke
+newpath 199.47426 169.7218 moveto
+200.64085 169.7218 lineto stroke
+newpath 200.64085 169.7218 moveto
+201.22418 170.73216 lineto stroke
+newpath 201.22418 170.73216 moveto
+201.80751 169.7218 lineto stroke
+newpath 201.80751 169.7218 moveto
+202.9741 169.7218 lineto stroke
+newpath 202.9741 169.7218 moveto
+203.55737 170.73206 lineto stroke
+newpath 203.55737 170.73206 moveto
+202.97408 171.74239 lineto stroke
+newpath 202.97408 171.74239 moveto
+204.14069 171.74237 lineto stroke
+newpath 204.14069 171.74237 moveto
+204.72395 172.75262 lineto stroke
+newpath 204.72395 172.75262 moveto
+205.30722 171.74237 lineto stroke
+newpath 205.30722 171.74237 moveto
+206.47383 171.74239 lineto stroke
+newpath 206.47383 171.74239 moveto
+205.89053 170.73206 lineto stroke
+newpath 205.89053 170.73206 moveto
+206.4738 169.7218 lineto stroke
+newpath 206.4738 169.7218 moveto
+207.6404 169.7218 lineto stroke
+newpath 207.6404 169.7218 moveto
+208.22374 170.73215 lineto stroke
+newpath 208.22374 170.73215 moveto
+208.80705 169.72179 lineto stroke
+newpath 208.80705 169.72179 moveto
+209.97365 169.72179 lineto stroke
+newpath 209.97365 169.72179 moveto
+209.39035 168.71149 lineto stroke
+newpath 209.39035 168.71149 moveto
+209.97366 167.70113 lineto stroke
+newpath 209.97366 167.70113 moveto
+208.807 167.70114 lineto stroke
+newpath 208.807 167.70114 moveto
+208.22371 166.69084 lineto stroke
+newpath 208.22371 166.69084 moveto
+208.80698 165.68059 lineto stroke
+newpath 208.80698 165.68059 moveto
+209.97359 165.6806 lineto stroke
+newpath 209.97359 165.6806 moveto
+209.39029 164.67027 lineto stroke
+newpath 209.39029 164.67027 moveto
+209.97356 163.66002 lineto stroke
+newpath 209.97356 163.66002 moveto
+211.14005 163.66002 lineto stroke
+newpath 211.14005 163.66002 moveto
+211.72333 164.67029 lineto stroke
+newpath 211.72333 164.67029 moveto
+212.3066 163.66002 lineto stroke
+newpath 212.3066 163.66002 moveto
+213.47308 163.66002 lineto stroke
+newpath 213.47308 163.66002 moveto
+214.05635 164.67027 lineto stroke
+newpath 214.05635 164.67027 moveto
+213.47305 165.6806 lineto stroke
+newpath 213.47305 165.6806 moveto
+214.63966 165.68059 lineto stroke
+newpath 214.63966 165.68059 moveto
+215.22293 166.69084 lineto stroke
+newpath 215.22293 166.69084 moveto
+215.8062 165.68059 lineto stroke
+newpath 215.8062 165.68059 moveto
+216.97281 165.68059 lineto stroke
+newpath 216.97281 165.68059 moveto
+216.3895 164.67027 lineto stroke
+newpath 216.3895 164.67027 moveto
+216.97276 163.66002 lineto stroke
+newpath 216.97276 163.66002 moveto
+218.13925 163.66002 lineto stroke
+newpath 218.13925 163.66002 moveto
+218.72253 164.67029 lineto stroke
+newpath 218.72253 164.67029 moveto
+219.3058 163.66002 lineto stroke
+newpath 219.3058 163.66002 moveto
+220.47229 163.66002 lineto stroke
+newpath 220.47229 163.66002 moveto
+221.05556 164.67027 lineto stroke
+newpath 221.05556 164.67027 moveto
+220.47226 165.6806 lineto stroke
+newpath 220.47226 165.6806 moveto
+221.63887 165.68059 lineto stroke
+newpath 221.63887 165.68059 moveto
+222.22214 166.69084 lineto stroke
+newpath 222.22214 166.69084 moveto
+221.63884 167.70114 lineto stroke
+newpath 221.63884 167.70114 moveto
+220.47217 167.70114 lineto stroke
+newpath 220.47217 167.70114 moveto
+221.0555 168.7115 lineto stroke
+newpath 221.0555 168.7115 moveto
+220.4722 169.7218 lineto stroke
+newpath 220.4722 169.7218 moveto
+221.6388 169.7218 lineto stroke
+newpath 221.6388 169.7218 moveto
+222.22212 170.73216 lineto stroke
+newpath 222.22212 170.73216 moveto
+222.80545 169.7218 lineto stroke
+newpath 222.80545 169.7218 moveto
+223.97205 169.7218 lineto stroke
+newpath 223.97205 169.7218 moveto
+224.55531 170.73206 lineto stroke
+newpath 224.55531 170.73206 moveto
+223.97202 171.74239 lineto stroke
+newpath 223.97202 171.74239 moveto
+225.13863 171.74237 lineto stroke
+newpath 225.13863 171.74237 moveto
+225.7219 172.75262 lineto stroke
+newpath 225.7219 172.75262 moveto
+225.1386 173.76292 lineto stroke
+newpath 225.1386 173.76292 moveto
+223.97192 173.76292 lineto stroke
+newpath 223.97192 173.76292 moveto
+224.55525 174.77328 lineto stroke
+newpath 224.55525 174.77328 moveto
+223.97195 175.78358 lineto stroke
+newpath 223.97195 175.78358 moveto
+222.8053 175.78358 lineto stroke
+newpath 222.8053 175.78358 moveto
+222.22192 174.77316 lineto stroke
+newpath 222.22192 174.77316 moveto
+221.63857 175.78358 lineto stroke
+newpath 221.63857 175.78358 moveto
+220.47191 175.78358 lineto stroke
+newpath 220.47191 175.78358 moveto
+221.05524 176.79395 lineto stroke
+newpath 221.05524 176.79395 moveto
+220.4719 177.80437 lineto stroke
+newpath 220.4719 177.80437 moveto
+221.63861 177.80434 lineto stroke
+newpath 221.63861 177.80434 moveto
+222.22194 178.8147 lineto stroke
+newpath 222.22194 178.8147 moveto
+221.63864 179.825 lineto stroke
+newpath 221.63864 179.825 moveto
+220.47197 179.825 lineto stroke
+newpath 220.47197 179.825 moveto
+221.0553 180.83536 lineto stroke
+newpath 221.0553 180.83536 moveto
+220.472 181.84566 lineto stroke
+newpath 220.472 181.84566 moveto
+221.63861 181.84566 lineto stroke
+newpath 221.63861 181.84566 moveto
+222.22194 182.856 lineto stroke
+newpath 222.22194 182.856 moveto
+222.80525 181.84566 lineto stroke
+newpath 222.80525 181.84566 moveto
+223.97186 181.84566 lineto stroke
+newpath 223.97186 181.84566 moveto
+224.55519 182.85602 lineto stroke
+newpath 224.55519 182.85602 moveto
+223.97185 183.86642 lineto stroke
+newpath 223.97185 183.86642 moveto
+225.13855 183.86641 lineto stroke
+newpath 225.13855 183.86641 moveto
+225.72188 184.87677 lineto stroke
+newpath 225.72188 184.87677 moveto
+226.3052 183.86641 lineto stroke
+newpath 226.3052 183.86641 moveto
+227.47191 183.8664 lineto stroke
+newpath 227.47191 183.8664 moveto
+226.88855 182.85602 lineto stroke
+newpath 226.88855 182.85602 moveto
+227.47188 181.84566 lineto stroke
+newpath 227.47188 181.84566 moveto
+228.63849 181.84566 lineto stroke
+newpath 228.63849 181.84566 moveto
+229.22182 182.856 lineto stroke
+newpath 229.22182 182.856 moveto
+229.80513 181.84566 lineto stroke
+newpath 229.80513 181.84566 moveto
+230.97174 181.84566 lineto stroke
+newpath 230.97174 181.84566 moveto
+231.55501 182.85591 lineto stroke
+newpath 231.55501 182.85591 moveto
+230.97171 183.86624 lineto stroke
+newpath 230.97171 183.86624 moveto
+232.13832 183.86623 lineto stroke
+newpath 232.13832 183.86623 moveto
+232.72159 184.87648 lineto stroke
+newpath 232.72159 184.87648 moveto
+232.13829 185.88678 lineto stroke
+newpath 232.13829 185.88678 moveto
+230.97162 185.88678 lineto stroke
+newpath 230.97162 185.88678 moveto
+231.55495 186.89714 lineto stroke
+newpath 231.55495 186.89714 moveto
+230.97165 187.90744 lineto stroke
+newpath 230.97165 187.90744 moveto
+232.13824 187.90744 lineto stroke
+newpath 232.13824 187.90744 moveto
+232.72157 188.9178 lineto stroke
+newpath 232.72157 188.9178 moveto
+233.3049 187.90744 lineto stroke
+newpath 233.3049 187.90744 moveto
+234.4715 187.90744 lineto stroke
+newpath 234.4715 187.90744 moveto
+235.05476 188.9177 lineto stroke
+newpath 235.05476 188.9177 moveto
+234.47147 189.92802 lineto stroke
+newpath 234.47147 189.92802 moveto
+235.63808 189.92801 lineto stroke
+newpath 235.63808 189.92801 moveto
+236.22134 190.93826 lineto stroke
+newpath 236.22134 190.93826 moveto
+236.80461 189.92801 lineto stroke
+newpath 236.80461 189.92801 moveto
+237.97122 189.92802 lineto stroke
+newpath 237.97122 189.92802 moveto
+237.38792 188.9177 lineto stroke
+newpath 237.38792 188.9177 moveto
+237.97119 187.90744 lineto stroke
+newpath 237.97119 187.90744 moveto
+239.13779 187.90744 lineto stroke
+newpath 239.13779 187.90744 moveto
+239.72113 188.91779 lineto stroke
+newpath 239.72113 188.91779 moveto
+240.30444 187.90742 lineto stroke
+newpath 240.30444 187.90742 moveto
+241.47104 187.90742 lineto stroke
+newpath 241.47104 187.90742 moveto
+240.88774 186.89713 lineto stroke
+newpath 240.88774 186.89713 moveto
+241.47105 185.88676 lineto stroke
+newpath 241.47105 185.88676 moveto
+240.3044 185.88678 lineto stroke
+newpath 240.3044 185.88678 moveto
+239.7211 184.87648 lineto stroke
+newpath 239.7211 184.87648 moveto
+240.30437 183.86623 lineto stroke
+newpath 240.30437 183.86623 moveto
+241.47098 183.86624 lineto stroke
+newpath 241.47098 183.86624 moveto
+240.88768 182.85591 lineto stroke
+newpath 240.88768 182.85591 moveto
+241.47095 181.84566 lineto stroke
+newpath 241.47095 181.84566 moveto
+242.63756 181.84566 lineto stroke
+newpath 242.63756 181.84566 moveto
+243.22089 182.856 lineto stroke
+newpath 243.22089 182.856 moveto
+243.8042 181.84566 lineto stroke
+newpath 243.8042 181.84566 moveto
+244.97081 181.84566 lineto stroke
+newpath 244.97081 181.84566 moveto
+245.55414 182.856 lineto stroke
+newpath 245.55414 182.856 moveto
+244.97078 183.86642 lineto stroke
+newpath 244.97078 183.86642 moveto
+246.13751 183.86641 lineto stroke
+newpath 246.13751 183.86641 moveto
+246.72084 184.87675 lineto stroke
+newpath 246.72084 184.87675 moveto
+247.30415 183.8664 lineto stroke
+newpath 247.30415 183.8664 moveto
+248.47087 183.8664 lineto stroke
+newpath 248.47087 183.8664 moveto
+247.88751 182.856 lineto stroke
+newpath 247.88751 182.856 moveto
+248.47083 181.84564 lineto stroke
+newpath 248.47083 181.84564 moveto
+249.63744 181.84564 lineto stroke
+newpath 249.63744 181.84564 moveto
+250.22076 182.85599 lineto stroke
+newpath 250.22076 182.85599 moveto
+250.80408 181.84564 lineto stroke
+newpath 250.80408 181.84564 moveto
+251.97069 181.84564 lineto stroke
+newpath 251.97069 181.84564 moveto
+251.38739 180.83534 lineto stroke
+newpath 251.38739 180.83534 moveto
+251.97072 179.82497 lineto stroke
+newpath 251.97072 179.82497 moveto
+250.80405 179.82498 lineto stroke
+newpath 250.80405 179.82498 moveto
+250.22075 178.81468 lineto stroke
+newpath 250.22075 178.81468 moveto
+250.80408 177.80432 lineto stroke
+newpath 250.80408 177.80432 moveto
+251.97078 177.8043 lineto stroke
+newpath 251.97078 177.8043 moveto
+251.38742 176.79393 lineto stroke
+newpath 251.38742 176.79393 moveto
+251.97075 175.78357 lineto stroke
+newpath 251.97075 175.78357 moveto
+250.8041 175.78357 lineto stroke
+newpath 250.8041 175.78357 moveto
+250.22072 174.7732 lineto stroke
+newpath 250.22072 174.7732 moveto
+249.63739 175.78358 lineto stroke
+newpath 249.63739 175.78358 moveto
+248.47073 175.78358 lineto stroke
+newpath 248.47073 175.78358 moveto
+247.88744 174.77328 lineto stroke
+newpath 247.88744 174.77328 moveto
+248.47076 173.76291 lineto stroke
+newpath 248.47076 173.76291 moveto
+247.3041 173.76292 lineto stroke
+newpath 247.3041 173.76292 moveto
+246.7208 172.75262 lineto stroke
+newpath 246.7208 172.75262 moveto
+247.30406 171.74237 lineto stroke
+newpath 247.30406 171.74237 moveto
+248.47067 171.74239 lineto stroke
+newpath 248.47067 171.74239 moveto
+247.88737 170.73206 lineto stroke
+newpath 247.88737 170.73206 moveto
+248.47064 169.7218 lineto stroke
+newpath 248.47064 169.7218 moveto
+249.63724 169.7218 lineto stroke
+newpath 249.63724 169.7218 moveto
+250.22058 170.73215 lineto stroke
+newpath 250.22058 170.73215 moveto
+250.8039 169.72179 lineto stroke
+newpath 250.8039 169.72179 moveto
+251.97049 169.72179 lineto stroke
+newpath 251.97049 169.72179 moveto
+251.38719 168.71149 lineto stroke
+newpath 251.38719 168.71149 moveto
+251.9705 167.70113 lineto stroke
+newpath 251.9705 167.70113 moveto
+250.80385 167.70114 lineto stroke
+newpath 250.80385 167.70114 moveto
+250.22055 166.69084 lineto stroke
+newpath 250.22055 166.69084 moveto
+250.80382 165.68059 lineto stroke
+newpath 250.80382 165.68059 moveto
+251.97043 165.6806 lineto stroke
+newpath 251.97043 165.6806 moveto
+251.38713 164.67027 lineto stroke
+newpath 251.38713 164.67027 moveto
+251.9704 163.66002 lineto stroke
+newpath 251.9704 163.66002 moveto
+253.13689 163.66002 lineto stroke
+newpath 253.13689 163.66002 moveto
+253.72017 164.67029 lineto stroke
+newpath 253.72017 164.67029 moveto
+254.30344 163.66002 lineto stroke
+newpath 254.30344 163.66002 moveto
+255.46992 163.66002 lineto stroke
+newpath 255.46992 163.66002 moveto
+256.05319 164.67027 lineto stroke
+newpath 256.05319 164.67027 moveto
+255.4699 165.6806 lineto stroke
+newpath 255.4699 165.6806 moveto
+256.6365 165.68059 lineto stroke
+newpath 256.6365 165.68059 moveto
+257.21977 166.69084 lineto stroke
+newpath 257.21977 166.69084 moveto
+257.80304 165.68059 lineto stroke
+newpath 257.80304 165.68059 moveto
+258.96965 165.68059 lineto stroke
+newpath 258.96965 165.68059 moveto
+258.38634 164.67027 lineto stroke
+newpath 258.38634 164.67027 moveto
+258.9696 163.66002 lineto stroke
+newpath 258.9696 163.66002 moveto
+260.1361 163.66002 lineto stroke
+newpath 260.1361 163.66002 moveto
+260.71938 164.67029 lineto stroke
+newpath 260.71938 164.67029 moveto
+261.30264 163.66002 lineto stroke
+newpath 261.30264 163.66002 moveto
+262.46913 163.66002 lineto stroke
+newpath 262.46913 163.66002 moveto
+263.0524 164.67027 lineto stroke
+newpath 263.0524 164.67027 moveto
+262.4691 165.6806 lineto stroke
+newpath 262.4691 165.6806 moveto
+263.63571 165.68059 lineto stroke
+newpath 263.63571 165.68059 moveto
+264.21898 166.69084 lineto stroke
+newpath 264.21898 166.69084 moveto
+263.63568 167.70114 lineto stroke
+newpath 263.63568 167.70114 moveto
+262.46901 167.70114 lineto stroke
+newpath 262.46901 167.70114 moveto
+263.05234 168.7115 lineto stroke
+newpath 263.05234 168.7115 moveto
+262.46904 169.7218 lineto stroke
+newpath 262.46904 169.7218 moveto
+263.63564 169.7218 lineto stroke
+newpath 263.63564 169.7218 moveto
+264.21896 170.73216 lineto stroke
+newpath 264.21896 170.73216 moveto
+264.80229 169.7218 lineto stroke
+newpath 264.80229 169.7218 moveto
+265.96889 169.7218 lineto stroke
+newpath 265.96889 169.7218 moveto
+266.55215 170.73206 lineto stroke
+newpath 266.55215 170.73206 moveto
+265.96886 171.74239 lineto stroke
+newpath 265.96886 171.74239 moveto
+267.13547 171.74237 lineto stroke
+newpath 267.13547 171.74237 moveto
+267.71873 172.75262 lineto stroke
+newpath 267.71873 172.75262 moveto
+268.302 171.74237 lineto stroke
+newpath 268.302 171.74237 moveto
+269.46861 171.74239 lineto stroke
+newpath 269.46861 171.74239 moveto
+268.88531 170.73206 lineto stroke
+newpath 268.88531 170.73206 moveto
+269.46858 169.7218 lineto stroke
+newpath 269.46858 169.7218 moveto
+270.63518 169.7218 lineto stroke
+newpath 270.63518 169.7218 moveto
+271.21852 170.73215 lineto stroke
+newpath 271.21852 170.73215 moveto
+271.80183 169.72179 lineto stroke
+newpath 271.80183 169.72179 moveto
+272.96843 169.72179 lineto stroke
+newpath 272.96843 169.72179 moveto
+272.38513 168.71149 lineto stroke
+newpath 272.38513 168.71149 moveto
+272.96844 167.70113 lineto stroke
+newpath 272.96844 167.70113 moveto
+271.80179 167.70114 lineto stroke
+newpath 271.80179 167.70114 moveto
+271.21849 166.69084 lineto stroke
+newpath 271.21849 166.69084 moveto
+271.80176 165.68059 lineto stroke
+newpath 271.80176 165.68059 moveto
+272.96837 165.6806 lineto stroke
+newpath 272.96837 165.6806 moveto
+272.38507 164.67027 lineto stroke
+newpath 272.38507 164.67027 moveto
+272.96834 163.66002 lineto stroke
+newpath 272.96834 163.66002 moveto
+274.13483 163.66002 lineto stroke
+newpath 274.13483 163.66002 moveto
+274.71811 164.67029 lineto stroke
+newpath 274.71811 164.67029 moveto
+275.30138 163.66002 lineto stroke
+newpath 275.30138 163.66002 moveto
+276.46786 163.66002 lineto stroke
+newpath 276.46786 163.66002 moveto
+277.05113 164.67027 lineto stroke
+newpath 277.05113 164.67027 moveto
+276.46783 165.6806 lineto stroke
+newpath 276.46783 165.6806 moveto
+277.63445 165.68059 lineto stroke
+newpath 277.63445 165.68059 moveto
+278.21771 166.69084 lineto stroke
+newpath 278.21771 166.69084 moveto
+278.80098 165.68059 lineto stroke
+newpath 278.80098 165.68059 moveto
+279.96759 165.68059 lineto stroke
+newpath 279.96759 165.68059 moveto
+279.38428 164.67027 lineto stroke
+newpath 279.38428 164.67027 moveto
+279.96754 163.66002 lineto stroke
+newpath 279.96754 163.66002 moveto
+281.13403 163.66002 lineto stroke
+newpath 281.13403 163.66002 moveto
+281.71732 164.67029 lineto stroke
+newpath 281.71732 164.67029 moveto
+282.30058 163.66002 lineto stroke
+newpath 282.30058 163.66002 moveto
+283.46707 163.66002 lineto stroke
+newpath 283.46707 163.66002 moveto
+282.88382 162.64981 lineto stroke
+newpath 282.88382 162.64981 moveto
+283.46709 161.63956 lineto stroke
+newpath 283.46709 161.63956 moveto
+282.30055 161.63956 lineto stroke
+newpath 282.30055 161.63956 moveto
+281.7173 160.62935 lineto stroke
+newpath 281.7173 160.62935 moveto
+282.30057 159.6191 lineto stroke
+newpath 282.30057 159.6191 moveto
+283.46718 159.61911 lineto stroke
+newpath 283.46718 159.61911 moveto
+282.88388 158.60878 lineto stroke
+newpath 282.88388 158.60878 moveto
+283.46715 157.59853 lineto stroke
+newpath 283.46715 157.59853 moveto
+282.3006 157.59853 lineto stroke
+newpath 282.3006 157.59853 moveto
+281.71729 156.58824 lineto stroke
+newpath 281.71729 156.58824 moveto
+281.134 157.59854 lineto stroke
+newpath 281.134 157.59854 moveto
+279.96745 157.59854 lineto stroke
+newpath 279.96745 157.59854 moveto
+279.3842 156.58833 lineto stroke
+newpath 279.3842 156.58833 moveto
+279.96747 155.57808 lineto stroke
+newpath 279.96747 155.57808 moveto
+278.80093 155.57808 lineto stroke
+newpath 278.80093 155.57808 moveto
+278.21768 154.56787 lineto stroke
+newpath 278.21768 154.56787 moveto
+278.80095 153.55762 lineto stroke
+newpath 278.80095 153.55762 moveto
+279.96756 153.55763 lineto stroke
+newpath 279.96756 153.55763 moveto
+279.38426 152.5473 lineto stroke
+newpath 279.38426 152.5473 moveto
+279.96753 151.53705 lineto stroke
+newpath 279.96753 151.53705 moveto
+281.13412 151.53705 lineto stroke
+newpath 281.13412 151.53705 moveto
+281.71747 152.5474 lineto stroke
+newpath 281.71747 152.5474 moveto
+282.30078 151.53703 lineto stroke
+newpath 282.30078 151.53703 moveto
+283.46738 151.53703 lineto stroke
+newpath 283.46738 151.53703 moveto
+282.88408 150.52673 lineto stroke
+newpath 282.88408 150.52673 moveto
+283.46739 149.51637 lineto stroke
+newpath 283.46739 149.51637 moveto
+282.30074 149.51639 lineto stroke
+newpath 282.30074 149.51639 moveto
+281.71744 148.50609 lineto stroke
+newpath 281.71744 148.50609 moveto
+282.3007 147.49583 lineto stroke
+newpath 282.3007 147.49583 moveto
+283.46732 147.49585 lineto stroke
+newpath 283.46732 147.49585 moveto
+282.88402 146.48552 lineto stroke
+newpath 282.88402 146.48552 moveto
+283.46729 145.47527 lineto stroke
+newpath 283.46729 145.47527 moveto
+282.30074 145.47527 lineto stroke
+newpath 282.30074 145.47527 moveto
+281.71742 144.46498 lineto stroke
+newpath 281.71742 144.46498 moveto
+281.13414 145.47528 lineto stroke
+newpath 281.13414 145.47528 moveto
+279.96759 145.47528 lineto stroke
+newpath 279.96759 145.47528 moveto
+279.3843 144.46498 lineto stroke
+newpath 279.3843 144.46498 moveto
+279.9676 143.45464 lineto stroke
+newpath 279.9676 143.45464 moveto
+278.80096 143.45464 lineto stroke
+newpath 278.80096 143.45464 moveto
+278.21767 142.44434 lineto stroke
+newpath 278.21767 142.44434 moveto
+277.63437 143.45464 lineto stroke
+newpath 277.63437 143.45464 moveto
+276.46773 143.45464 lineto stroke
+newpath 276.46773 143.45464 moveto
+277.05106 144.46498 lineto stroke
+newpath 277.05106 144.46498 moveto
+276.46776 145.47528 lineto stroke
+newpath 276.46776 145.47528 moveto
+275.30121 145.47528 lineto stroke
+newpath 275.30121 145.47528 moveto
+274.7179 144.465 lineto stroke
+newpath 274.7179 144.465 moveto
+274.13461 145.4753 lineto stroke
+newpath 274.13461 145.4753 moveto
+272.96806 145.4753 lineto stroke
+newpath 272.96806 145.4753 moveto
+272.38481 144.46509 lineto stroke
+newpath 272.38481 144.46509 moveto
+272.96808 143.45483 lineto stroke
+newpath 272.96808 143.45483 moveto
+271.80154 143.45483 lineto stroke
+newpath 271.80154 143.45483 moveto
+271.21829 142.44463 lineto stroke
+newpath 271.21829 142.44463 moveto
+271.80156 141.43437 lineto stroke
+newpath 271.80156 141.43437 moveto
+272.96817 141.43439 lineto stroke
+newpath 272.96817 141.43439 moveto
+272.38487 140.42406 lineto stroke
+newpath 272.38487 140.42406 moveto
+272.96814 139.4138 lineto stroke
+newpath 272.96814 139.4138 moveto
+271.80159 139.4138 lineto stroke
+newpath 271.80159 139.4138 moveto
+271.21828 138.40352 lineto stroke
+newpath 271.21828 138.40352 moveto
+270.635 139.41382 lineto stroke
+newpath 270.635 139.41382 moveto
+269.46844 139.41382 lineto stroke
+newpath 269.46844 139.41382 moveto
+268.8852 138.40361 lineto stroke
+newpath 268.8852 138.40361 moveto
+269.46846 137.39336 lineto stroke
+newpath 269.46846 137.39336 moveto
+268.30193 137.39336 lineto stroke
+newpath 268.30193 137.39336 moveto
+267.71867 136.38315 lineto stroke
+newpath 267.71867 136.38315 moveto
+268.30194 135.3729 lineto stroke
+newpath 268.30194 135.3729 moveto
+269.46855 135.37291 lineto stroke
+newpath 269.46855 135.37291 moveto
+268.88525 134.36258 lineto stroke
+newpath 268.88525 134.36258 moveto
+269.46852 133.35233 lineto stroke
+newpath 269.46852 133.35233 moveto
+270.63513 133.35233 lineto stroke
+newpath 270.63513 133.35233 moveto
+271.21848 134.36266 lineto stroke
+newpath 271.21848 134.36266 moveto
+271.80177 133.35231 lineto stroke
+newpath 271.80177 133.35231 moveto
+272.96838 133.35231 lineto stroke
+newpath 272.96838 133.35231 moveto
+272.38507 132.34201 lineto stroke
+newpath 272.38507 132.34201 moveto
+272.9684 131.33165 lineto stroke
+newpath 272.9684 131.33165 moveto
+271.80174 131.33165 lineto stroke
+newpath 271.80174 131.33165 moveto
+271.21843 130.32135 lineto stroke
+newpath 271.21843 130.32135 moveto
+271.8017 129.3111 lineto stroke
+newpath 271.8017 129.3111 moveto
+272.9683 129.31111 lineto stroke
+newpath 272.9683 129.31111 moveto
+272.38501 128.30078 lineto stroke
+newpath 272.38501 128.30078 moveto
+272.96828 127.29053 lineto stroke
+newpath 272.96828 127.29053 moveto
+274.13489 127.29053 lineto stroke
+newpath 274.13489 127.29053 moveto
+274.71822 128.30087 lineto stroke
+newpath 274.71822 128.30087 moveto
+275.30153 127.29053 lineto stroke
+newpath 275.30153 127.29053 moveto
+276.46814 127.29053 lineto stroke
+newpath 276.46814 127.29053 moveto
+277.05147 128.30087 lineto stroke
+newpath 277.05147 128.30087 moveto
+276.4681 129.31126 lineto stroke
+newpath 276.4681 129.31126 moveto
+277.63481 129.31128 lineto stroke
+newpath 277.63481 129.31128 moveto
+278.21814 130.32162 lineto stroke
+newpath 278.21814 130.32162 moveto
+278.80147 129.31128 lineto stroke
+newpath 278.80147 129.31128 moveto
+279.96819 129.31126 lineto stroke
+newpath 279.96819 129.31126 moveto
+279.38481 128.30087 lineto stroke
+newpath 279.38481 128.30087 moveto
+279.96814 127.29053 lineto stroke
+newpath 279.96814 127.29053 moveto
+281.13475 127.29053 lineto stroke
+newpath 281.13475 127.29053 moveto
+281.71808 128.30087 lineto stroke
+newpath 281.71808 128.30087 moveto
+282.30139 127.29053 lineto stroke
+newpath 282.30139 127.29053 moveto
+283.468 127.29053 lineto stroke
+newpath 283.468 127.29053 moveto
+282.8847 126.28023 lineto stroke
+newpath 282.8847 126.28023 moveto
+283.46803 125.26985 lineto stroke
+newpath 283.46803 125.26985 moveto
+282.30136 125.26987 lineto stroke
+newpath 282.30136 125.26987 moveto
+281.71806 124.25957 lineto stroke
+newpath 281.71806 124.25957 moveto
+282.30139 123.24922 lineto stroke
+newpath 282.30139 123.24922 moveto
+283.46812 123.24922 lineto stroke
+newpath 283.46812 123.24922 moveto
+282.88475 122.23882 lineto stroke
+newpath 282.88475 122.23882 moveto
+283.46808 121.22847 lineto stroke
+newpath 283.46808 121.22847 moveto
+282.30142 121.22847 lineto stroke
+newpath 282.30142 121.22847 moveto
+281.71806 120.21808 lineto stroke
+newpath 281.71806 120.21808 moveto
+281.13472 121.22847 lineto stroke
+newpath 281.13472 121.22847 moveto
+279.96806 121.22847 lineto stroke
+newpath 279.96806 121.22847 moveto
+279.38477 120.21817 lineto stroke
+newpath 279.38477 120.21817 moveto
+279.9681 119.2078 lineto stroke
+newpath 279.9681 119.2078 moveto
+278.80142 119.20781 lineto stroke
+newpath 278.80142 119.20781 moveto
+278.21812 118.19751 lineto stroke
+newpath 278.21812 118.19751 moveto
+278.80139 117.18726 lineto stroke
+newpath 278.80139 117.18726 moveto
+279.968 117.18727 lineto stroke
+newpath 279.968 117.18727 moveto
+279.3847 116.17694 lineto stroke
+newpath 279.3847 116.17694 moveto
+279.96797 115.16669 lineto stroke
+newpath 279.96797 115.16669 moveto
+281.13458 115.16669 lineto stroke
+newpath 281.13458 115.16669 moveto
+281.71793 116.17702 lineto stroke
+newpath 281.71793 116.17702 moveto
+282.30122 115.16667 lineto stroke
+newpath 282.30122 115.16667 moveto
+283.46783 115.16667 lineto stroke
+newpath 283.46783 115.16667 moveto
+282.88452 114.15637 lineto stroke
+newpath 282.88452 114.15637 moveto
+283.46785 113.14601 lineto stroke
+newpath 283.46785 113.14601 moveto
+282.3012 113.14601 lineto stroke
+newpath 282.3012 113.14601 moveto
+281.71788 112.13571 lineto stroke
+newpath 281.71788 112.13571 moveto
+282.30115 111.12546 lineto stroke
+newpath 282.30115 111.12546 moveto
+283.46776 111.12547 lineto stroke
+newpath 283.46776 111.12547 moveto
+282.88446 110.11514 lineto stroke
+newpath 282.88446 110.11514 moveto
+283.46773 109.10489 lineto stroke
+newpath 283.46773 109.10489 moveto
+282.30118 109.10489 lineto stroke
+newpath 282.30118 109.10489 moveto
+281.71786 108.0946 lineto stroke
+newpath 281.71786 108.0946 moveto
+281.13458 109.1049 lineto stroke
+newpath 281.13458 109.1049 moveto
+279.96803 109.1049 lineto stroke
+newpath 279.96803 109.1049 moveto
+279.38474 108.0946 lineto stroke
+newpath 279.38474 108.0946 moveto
+279.96805 107.08424 lineto stroke
+newpath 279.96805 107.08424 moveto
+278.80139 107.08426 lineto stroke
+newpath 278.80139 107.08426 moveto
+278.2181 106.07396 lineto stroke
+newpath 278.2181 106.07396 moveto
+277.6348 107.08426 lineto stroke
+newpath 277.6348 107.08426 moveto
+276.46814 107.08427 lineto stroke
+newpath 276.46814 107.08427 moveto
+277.05148 108.09462 lineto stroke
+newpath 277.05148 108.09462 moveto
+276.46819 109.10492 lineto stroke
+newpath 276.46819 109.10492 moveto
+275.30164 109.10492 lineto stroke
+newpath 275.30164 109.10492 moveto
+274.71832 108.09464 lineto stroke
+newpath 274.71832 108.09464 moveto
+274.13504 109.10493 lineto stroke
+newpath 274.13504 109.10493 moveto
+272.96849 109.10493 lineto stroke
+newpath 272.96849 109.10493 moveto
+272.3852 108.09464 lineto stroke
+newpath 272.3852 108.09464 moveto
+272.96852 107.08426 lineto stroke
+newpath 272.96852 107.08426 moveto
+271.80185 107.08427 lineto stroke
+newpath 271.80185 107.08427 moveto
+271.21855 106.07397 lineto stroke
+newpath 271.21855 106.07397 moveto
+271.80188 105.06361 lineto stroke
+newpath 271.80188 105.06361 moveto
+272.96861 105.06361 lineto stroke
+newpath 272.96861 105.06361 moveto
+272.38524 104.0532 lineto stroke
+newpath 272.38524 104.0532 moveto
+272.96857 103.04285 lineto stroke
+newpath 272.96857 103.04285 moveto
+271.80191 103.04285 lineto stroke
+newpath 271.80191 103.04285 moveto
+271.21854 102.03246 lineto stroke
+newpath 271.21854 102.03246 moveto
+270.6352 103.04286 lineto stroke
+newpath 270.6352 103.04286 moveto
+269.46854 103.04286 lineto stroke
+newpath 269.46854 103.04286 moveto
+268.88524 102.03256 lineto stroke
+newpath 268.88524 102.03256 moveto
+269.46857 101.02219 lineto stroke
+newpath 269.46857 101.02219 moveto
+268.3019 101.0222 lineto stroke
+newpath 268.3019 101.0222 moveto
+267.7186 100.0119 lineto stroke
+newpath 267.7186 100.0119 moveto
+267.1353 101.02222 lineto stroke
+newpath 267.1353 101.02222 moveto
+265.96866 101.02222 lineto stroke
+newpath 265.96866 101.02222 moveto
+266.55199 102.03256 lineto stroke
+newpath 266.55199 102.03256 moveto
+265.96869 103.04288 lineto stroke
+newpath 265.96869 103.04288 moveto
+264.80203 103.04288 lineto stroke
+newpath 264.80203 103.04288 moveto
+264.21866 102.03249 lineto stroke
+newpath 264.21866 102.03249 moveto
+263.63531 103.0429 lineto stroke
+newpath 263.63531 103.0429 moveto
+262.46866 103.0429 lineto stroke
+newpath 262.46866 103.0429 moveto
+263.05199 104.05324 lineto stroke
+newpath 263.05199 104.05324 moveto
+262.46863 105.06366 lineto stroke
+newpath 262.46863 105.06366 moveto
+263.63536 105.06364 lineto stroke
+newpath 263.63536 105.06364 moveto
+264.21869 106.07399 lineto stroke
+newpath 264.21869 106.07399 moveto
+263.63539 107.0843 lineto stroke
+newpath 263.63539 107.0843 moveto
+262.46875 107.0843 lineto stroke
+newpath 262.46875 107.0843 moveto
+263.05208 108.09465 lineto stroke
+newpath 263.05208 108.09465 moveto
+262.46878 109.10497 lineto stroke
+newpath 262.46878 109.10497 moveto
+261.30223 109.10497 lineto stroke
+newpath 261.30223 109.10497 moveto
+260.71892 108.09468 lineto stroke
+newpath 260.71892 108.09468 moveto
+260.13564 109.10498 lineto stroke
+newpath 260.13564 109.10498 moveto
+258.96909 109.10498 lineto stroke
+newpath 258.96909 109.10498 moveto
+258.38579 108.09468 lineto stroke
+newpath 258.38579 108.09468 moveto
+258.9691 107.08432 lineto stroke
+newpath 258.9691 107.08432 moveto
+257.80244 107.08434 lineto stroke
+newpath 257.80244 107.08434 moveto
+257.21915 106.07404 lineto stroke
+newpath 257.21915 106.07404 moveto
+256.63585 107.08434 lineto stroke
+newpath 256.63585 107.08434 moveto
+255.4692 107.08435 lineto stroke
+newpath 255.4692 107.08435 moveto
+256.05254 108.0947 lineto stroke
+newpath 256.05254 108.0947 moveto
+255.46924 109.105 lineto stroke
+newpath 255.46924 109.105 moveto
+254.30269 109.105 lineto stroke
+newpath 254.30269 109.105 moveto
+253.71938 108.09471 lineto stroke
+newpath 253.71938 108.09471 moveto
+253.1361 109.10501 lineto stroke
+newpath 253.1361 109.10501 moveto
+251.96954 109.10501 lineto stroke
+newpath 251.96954 109.10501 moveto
+251.38629 108.0948 lineto stroke
+newpath 251.38629 108.0948 moveto
+251.96956 107.08455 lineto stroke
+newpath 251.96956 107.08455 moveto
+250.80302 107.08455 lineto stroke
+newpath 250.80302 107.08455 moveto
+250.21977 106.07434 lineto stroke
+newpath 250.21977 106.07434 moveto
+250.80304 105.06409 lineto stroke
+newpath 250.80304 105.06409 moveto
+251.96965 105.0641 lineto stroke
+newpath 251.96965 105.0641 moveto
+251.38635 104.05377 lineto stroke
+newpath 251.38635 104.05377 moveto
+251.96962 103.04352 lineto stroke
+newpath 251.96962 103.04352 moveto
+250.80307 103.04352 lineto stroke
+newpath 250.80307 103.04352 moveto
+250.21976 102.03323 lineto stroke
+newpath 250.21976 102.03323 moveto
+249.63647 103.04353 lineto stroke
+newpath 249.63647 103.04353 moveto
+248.46992 103.04353 lineto stroke
+newpath 248.46992 103.04353 moveto
+247.88667 102.03333 lineto stroke
+newpath 247.88667 102.03333 moveto
+248.46994 101.02307 lineto stroke
+newpath 248.46994 101.02307 moveto
+247.3034 101.02307 lineto stroke
+newpath 247.3034 101.02307 moveto
+246.72015 100.01286 lineto stroke
+newpath 246.72015 100.01286 moveto
+247.30342 99.00261 lineto stroke
+newpath 247.30342 99.00261 moveto
+248.47003 99.00262 lineto stroke
+newpath 248.47003 99.00262 moveto
+247.88673 97.9923 lineto stroke
+newpath 247.88673 97.9923 moveto
+248.47 96.98204 lineto stroke
+newpath 248.47 96.98204 moveto
+249.6366 96.98204 lineto stroke
+newpath 249.6366 96.98204 moveto
+250.21994 97.99239 lineto stroke
+newpath 250.21994 97.99239 moveto
+250.80325 96.98203 lineto stroke
+newpath 250.80325 96.98203 moveto
+251.96985 96.98203 lineto stroke
+newpath 251.96985 96.98203 moveto
+251.38655 95.97173 lineto stroke
+newpath 251.38655 95.97173 moveto
+251.96986 94.96136 lineto stroke
+newpath 251.96986 94.96136 moveto
+250.8032 94.96138 lineto stroke
+newpath 250.8032 94.96138 moveto
+250.21991 93.95108 lineto stroke
+newpath 250.21991 93.95108 moveto
+250.80318 92.94083 lineto stroke
+newpath 250.80318 92.94083 moveto
+251.96979 92.94084 lineto stroke
+newpath 251.96979 92.94084 moveto
+251.38649 91.93051 lineto stroke
+newpath 251.38649 91.93051 moveto
+251.96976 90.92026 lineto stroke
+newpath 251.96976 90.92026 moveto
+250.8032 90.92026 lineto stroke
+newpath 250.8032 90.92026 moveto
+250.2199 89.90997 lineto stroke
+newpath 250.2199 89.90997 moveto
+249.63661 90.92027 lineto stroke
+newpath 249.63661 90.92027 moveto
+248.47006 90.92027 lineto stroke
+newpath 248.47006 90.92027 moveto
+247.88676 89.90997 lineto stroke
+newpath 247.88676 89.90997 moveto
+248.47008 88.89963 lineto stroke
+newpath 248.47008 88.89963 moveto
+247.30344 88.89963 lineto stroke
+newpath 247.30344 88.89963 moveto
+246.72014 87.88933 lineto stroke
+newpath 246.72014 87.88933 moveto
+246.13684 88.89963 lineto stroke
+newpath 246.13684 88.89963 moveto
+244.9702 88.89963 lineto stroke
+newpath 244.9702 88.89963 moveto
+245.55353 89.90997 lineto stroke
+newpath 245.55353 89.90997 moveto
+244.97023 90.92027 lineto stroke
+newpath 244.97023 90.92027 moveto
+243.80368 90.92027 lineto stroke
+newpath 243.80368 90.92027 moveto
+243.22037 89.90999 lineto stroke
+newpath 243.22037 89.90999 moveto
+242.63708 90.92029 lineto stroke
+newpath 242.63708 90.92029 moveto
+241.47054 90.92029 lineto stroke
+newpath 241.47054 90.92029 moveto
+240.88728 89.91008 lineto stroke
+newpath 240.88728 89.91008 moveto
+241.47055 88.89983 lineto stroke
+newpath 241.47055 88.89983 moveto
+240.30402 88.89983 lineto stroke
+newpath 240.30402 88.89983 moveto
+239.72076 87.88962 lineto stroke
+newpath 239.72076 87.88962 moveto
+240.30403 86.87936 lineto stroke
+newpath 240.30403 86.87936 moveto
+241.47064 86.87938 lineto stroke
+newpath 241.47064 86.87938 moveto
+240.88734 85.86905 lineto stroke
+newpath 240.88734 85.86905 moveto
+241.47061 84.8588 lineto stroke
+newpath 241.47061 84.8588 moveto
+240.30406 84.8588 lineto stroke
+newpath 240.30406 84.8588 moveto
+239.72075 83.84851 lineto stroke
+newpath 239.72075 83.84851 moveto
+239.13747 84.85881 lineto stroke
+newpath 239.13747 84.85881 moveto
+237.97092 84.85881 lineto stroke
+newpath 237.97092 84.85881 moveto
+237.38766 83.8486 lineto stroke
+newpath 237.38766 83.8486 moveto
+237.97093 82.83835 lineto stroke
+newpath 237.97093 82.83835 moveto
+236.8044 82.83835 lineto stroke
+newpath 236.8044 82.83835 moveto
+236.22115 81.82814 lineto stroke
+newpath 236.22115 81.82814 moveto
+236.80437 80.81798 lineto stroke
+newpath 236.80437 80.81798 moveto
+237.97086 80.81796 lineto stroke
+newpath 237.97086 80.81796 moveto
+237.3876 79.80777 lineto stroke
+newpath 237.3876 79.80777 moveto
+237.97083 78.7976 lineto stroke
+newpath 237.97083 78.7976 moveto
+239.13731 78.7976 lineto stroke
+newpath 239.13731 78.7976 moveto
+239.72061 79.80786 lineto stroke
+newpath 239.72061 79.80786 moveto
+240.30386 78.79759 lineto stroke
+newpath 240.30386 78.79759 moveto
+241.47035 78.79759 lineto stroke
+newpath 241.47035 78.79759 moveto
+240.8871 77.78738 lineto stroke
+newpath 240.8871 77.78738 moveto
+241.47035 76.77711 lineto stroke
+newpath 241.47035 76.77711 moveto
+240.30382 76.77715 lineto stroke
+newpath 240.30382 76.77715 moveto
+239.72057 75.76694 lineto stroke
+newpath 239.72057 75.76694 moveto
+240.30379 74.75677 lineto stroke
+newpath 240.30379 74.75677 moveto
+241.47028 74.75676 lineto stroke
+newpath 241.47028 74.75676 moveto
+240.88702 73.74657 lineto stroke
+newpath 240.88702 73.74657 moveto
+241.47025 72.7364 lineto stroke
+newpath 241.47025 72.7364 moveto
+242.63673 72.7364 lineto stroke
+newpath 242.63673 72.7364 moveto
+243.22002 73.74667 lineto stroke
+newpath 243.22002 73.74667 moveto
+243.80328 72.7364 lineto stroke
+newpath 243.80328 72.7364 moveto
+244.96977 72.7364 lineto stroke
+newpath 244.96977 72.7364 moveto
+245.55304 73.74667 lineto stroke
+newpath 245.55304 73.74667 moveto
+244.96974 74.757 lineto stroke
+newpath 244.96974 74.757 moveto
+246.13635 74.75697 lineto stroke
+newpath 246.13635 74.75697 moveto
+246.71962 75.76724 lineto stroke
+newpath 246.71962 75.76724 moveto
+247.30289 74.75697 lineto stroke
+newpath 247.30289 74.75697 moveto
+248.4695 74.75699 lineto stroke
+newpath 248.4695 74.75699 moveto
+247.8862 73.74667 lineto stroke
+newpath 247.8862 73.74667 moveto
+248.46947 72.7364 lineto stroke
+newpath 248.46947 72.7364 moveto
+249.63596 72.7364 lineto stroke
+newpath 249.63596 72.7364 moveto
+250.21924 73.74667 lineto stroke
+newpath 250.21924 73.74667 moveto
+250.8025 72.7364 lineto stroke
+newpath 250.8025 72.7364 moveto
+251.969 72.7364 lineto stroke
+newpath 251.969 72.7364 moveto
+251.38574 71.7262 lineto stroke
+newpath 251.38574 71.7262 moveto
+251.96901 70.71594 lineto stroke
+newpath 251.96901 70.71594 moveto
+250.80247 70.71594 lineto stroke
+newpath 250.80247 70.71594 moveto
+250.21922 69.70573 lineto stroke
+newpath 250.21922 69.70573 moveto
+250.80249 68.69547 lineto stroke
+newpath 250.80249 68.69547 moveto
+251.9691 68.69547 lineto stroke
+newpath 251.9691 68.69547 moveto
+251.38579 67.68517 lineto stroke
+newpath 251.38579 67.68517 moveto
+251.96906 66.6749 lineto stroke
+newpath 251.96906 66.6749 moveto
+250.8025 66.6749 lineto stroke
+newpath 250.8025 66.6749 moveto
+250.2192 65.66461 lineto stroke
+newpath 250.2192 65.66461 moveto
+249.63591 66.67491 lineto stroke
+newpath 249.63591 66.67491 moveto
+248.46936 66.67491 lineto stroke
+newpath 248.46936 66.67491 moveto
+247.88611 65.6647 lineto stroke
+newpath 247.88611 65.6647 moveto
+248.46938 64.65445 lineto stroke
+newpath 248.46938 64.65445 moveto
+247.30284 64.65445 lineto stroke
+newpath 247.30284 64.65445 moveto
+246.71959 63.64424 lineto stroke
+newpath 246.71959 63.64424 moveto
+247.30281 62.63408 lineto stroke
+newpath 247.30281 62.63408 moveto
+248.4693 62.63406 lineto stroke
+newpath 248.4693 62.63406 moveto
+247.88605 61.62387 lineto stroke
+newpath 247.88605 61.62387 moveto
+248.46927 60.61371 lineto stroke
+newpath 248.46927 60.61371 moveto
+249.63576 60.61371 lineto stroke
+newpath 249.63576 60.61371 moveto
+250.21906 61.62396 lineto stroke
+newpath 250.21906 61.62396 moveto
+250.8023 60.6137 lineto stroke
+newpath 250.8023 60.6137 moveto
+251.9688 60.6137 lineto stroke
+newpath 251.9688 60.6137 moveto
+251.38554 59.60349 lineto stroke
+newpath 251.38554 59.60349 moveto
+251.9688 58.59322 lineto stroke
+newpath 251.9688 58.59322 moveto
+250.80226 58.59325 lineto stroke
+newpath 250.80226 58.59325 moveto
+250.21901 57.58304 lineto stroke
+newpath 250.21901 57.58304 moveto
+250.80223 56.57288 lineto stroke
+newpath 250.80223 56.57288 moveto
+251.96872 56.57286 lineto stroke
+newpath 251.96872 56.57286 moveto
+251.38547 55.56267 lineto stroke
+newpath 251.38547 55.56267 moveto
+251.96869 54.5525 lineto stroke
+newpath 251.96869 54.5525 moveto
+253.13518 54.5525 lineto stroke
+newpath 253.13518 54.5525 moveto
+253.71846 55.56277 lineto stroke
+newpath 253.71846 55.56277 moveto
+254.30173 54.5525 lineto stroke
+newpath 254.30173 54.5525 moveto
+255.46822 54.5525 lineto stroke
+newpath 255.46822 54.5525 moveto
+256.05148 55.56276 lineto stroke
+newpath 256.05148 55.56276 moveto
+255.46819 56.57309 lineto stroke
+newpath 255.46819 56.57309 moveto
+256.6348 56.57307 lineto stroke
+newpath 256.6348 56.57307 moveto
+257.21806 57.58333 lineto stroke
+newpath 257.21806 57.58333 moveto
+257.80133 56.57307 lineto stroke
+newpath 257.80133 56.57307 moveto
+258.96794 56.57307 lineto stroke
+newpath 258.96794 56.57307 moveto
+258.38463 55.56276 lineto stroke
+newpath 258.38463 55.56276 moveto
+258.9679 54.5525 lineto stroke
+newpath 258.9679 54.5525 moveto
+260.13438 54.5525 lineto stroke
+newpath 260.13438 54.5525 moveto
+260.71767 55.56277 lineto stroke
+newpath 260.71767 55.56277 moveto
+261.30093 54.5525 lineto stroke
+newpath 261.30093 54.5525 moveto
+262.46742 54.5525 lineto stroke
+newpath 262.46742 54.5525 moveto
+263.05069 55.56276 lineto stroke
+newpath 263.05069 55.56276 moveto
+262.46739 56.57309 lineto stroke
+newpath 262.46739 56.57309 moveto
+263.634 56.57307 lineto stroke
+newpath 263.634 56.57307 moveto
+264.21727 57.58333 lineto stroke
+newpath 264.21727 57.58333 moveto
+263.63397 58.59363 lineto stroke
+newpath 263.63397 58.59363 moveto
+262.4673 58.59363 lineto stroke
+newpath 262.4673 58.59363 moveto
+263.05063 59.60399 lineto stroke
+newpath 263.05063 59.60399 moveto
+262.46733 60.61429 lineto stroke
+newpath 262.46733 60.61429 moveto
+263.63393 60.61429 lineto stroke
+newpath 263.63393 60.61429 moveto
+264.21725 61.62465 lineto stroke
+newpath 264.21725 61.62465 moveto
+264.80058 60.61429 lineto stroke
+newpath 264.80058 60.61429 moveto
+265.96718 60.61429 lineto stroke
+newpath 265.96718 60.61429 moveto
+266.55045 61.62454 lineto stroke
+newpath 266.55045 61.62454 moveto
+265.96715 62.63487 lineto stroke
+newpath 265.96715 62.63487 moveto
+267.13376 62.63486 lineto stroke
+newpath 267.13376 62.63486 moveto
+267.71703 63.64511 lineto stroke
+newpath 267.71703 63.64511 moveto
+268.3003 62.63486 lineto stroke
+newpath 268.3003 62.63486 moveto
+269.4669 62.63487 lineto stroke
+newpath 269.4669 62.63487 moveto
+268.8836 61.62454 lineto stroke
+newpath 268.8836 61.62454 moveto
+269.46687 60.61429 lineto stroke
+newpath 269.46687 60.61429 moveto
+270.63347 60.61429 lineto stroke
+newpath 270.63347 60.61429 moveto
+271.21681 61.62463 lineto stroke
+newpath 271.21681 61.62463 moveto
+271.80013 60.61427 lineto stroke
+newpath 271.80013 60.61427 moveto
+272.96672 60.61427 lineto stroke
+newpath 272.96672 60.61427 moveto
+272.38342 59.60397 lineto stroke
+newpath 272.38342 59.60397 moveto
+272.96674 58.59361 lineto stroke
+newpath 272.96674 58.59361 moveto
+271.80008 58.59363 lineto stroke
+newpath 271.80008 58.59363 moveto
+271.21678 57.58333 lineto stroke
+newpath 271.21678 57.58333 moveto
+271.80005 56.57307 lineto stroke
+newpath 271.80005 56.57307 moveto
+272.96666 56.57309 lineto stroke
+newpath 272.96666 56.57309 moveto
+272.38336 55.56276 lineto stroke
+newpath 272.38336 55.56276 moveto
+272.96663 54.5525 lineto stroke
+newpath 272.96663 54.5525 moveto
+274.13312 54.5525 lineto stroke
+newpath 274.13312 54.5525 moveto
+274.7164 55.56277 lineto stroke
+newpath 274.7164 55.56277 moveto
+275.29967 54.5525 lineto stroke
+newpath 275.29967 54.5525 moveto
+276.46616 54.5525 lineto stroke
+newpath 276.46616 54.5525 moveto
+277.04942 55.56276 lineto stroke
+newpath 277.04942 55.56276 moveto
+276.46613 56.57309 lineto stroke
+newpath 276.46613 56.57309 moveto
+277.63274 56.57307 lineto stroke
+newpath 277.63274 56.57307 moveto
+278.216 57.58333 lineto stroke
+newpath 278.216 57.58333 moveto
+278.79927 56.57307 lineto stroke
+newpath 278.79927 56.57307 moveto
+279.96588 56.57307 lineto stroke
+newpath 279.96588 56.57307 moveto
+279.38257 55.56276 lineto stroke
+newpath 279.38257 55.56276 moveto
+279.96584 54.5525 lineto stroke
+newpath 279.96584 54.5525 moveto
+281.13232 54.5525 lineto stroke
+newpath 281.13232 54.5525 moveto
+281.7156 55.56277 lineto stroke
+newpath 281.7156 55.56277 moveto
+282.29887 54.5525 lineto stroke
+newpath 282.29887 54.5525 moveto
+283.46536 54.5525 lineto stroke
+newpath 283.46536 54.5525 moveto
+282.88211 53.5423 lineto stroke
+newpath 282.88211 53.5423 moveto
+283.46538 52.53204 lineto stroke
+newpath 283.46538 52.53204 moveto
+282.29884 52.53204 lineto stroke
+newpath 282.29884 52.53204 moveto
+281.71559 51.52184 lineto stroke
+newpath 281.71559 51.52184 moveto
+282.29886 50.51158 lineto stroke
+newpath 282.29886 50.51158 moveto
+283.46547 50.5116 lineto stroke
+newpath 283.46547 50.5116 moveto
+282.88217 49.50127 lineto stroke
+newpath 282.88217 49.50127 moveto
+283.46544 48.49101 lineto stroke
+newpath 283.46544 48.49101 moveto
+282.29889 48.49101 lineto stroke
+newpath 282.29889 48.49101 moveto
+281.71558 47.48073 lineto stroke
+newpath 281.71558 47.48073 moveto
+281.1323 48.49103 lineto stroke
+newpath 281.1323 48.49103 moveto
+279.96574 48.49103 lineto stroke
+newpath 279.96574 48.49103 moveto
+279.38249 47.48082 lineto stroke
+newpath 279.38249 47.48082 moveto
+279.96576 46.47057 lineto stroke
+newpath 279.96576 46.47057 moveto
+278.79922 46.47057 lineto stroke
+newpath 278.79922 46.47057 moveto
+278.21597 45.46036 lineto stroke
+newpath 278.21597 45.46036 moveto
+278.79924 44.4501 lineto stroke
+newpath 278.79924 44.4501 moveto
+279.96585 44.45012 lineto stroke
+newpath 279.96585 44.45012 moveto
+279.38255 43.43979 lineto stroke
+newpath 279.38255 43.43979 moveto
+279.96582 42.42953 lineto stroke
+newpath 279.96582 42.42953 moveto
+281.13242 42.42953 lineto stroke
+newpath 281.13242 42.42953 moveto
+281.71576 43.43988 lineto stroke
+newpath 281.71576 43.43988 moveto
+282.29907 42.42952 lineto stroke
+newpath 282.29907 42.42952 moveto
+283.46567 42.42952 lineto stroke
+newpath 283.46567 42.42952 moveto
+282.88237 41.41922 lineto stroke
+newpath 282.88237 41.41922 moveto
+283.46568 40.40886 lineto stroke
+newpath 283.46568 40.40886 moveto
+282.29903 40.40887 lineto stroke
+newpath 282.29903 40.40887 moveto
+281.71573 39.39857 lineto stroke
+newpath 281.71573 39.39857 moveto
+282.299 38.38832 lineto stroke
+newpath 282.299 38.38832 moveto
+283.4656 38.38834 lineto stroke
+newpath 283.4656 38.38834 moveto
+282.88231 37.378 lineto stroke
+newpath 282.88231 37.378 moveto
+283.46558 36.36775 lineto stroke
+newpath 283.46558 36.36775 moveto
+282.29903 36.36775 lineto stroke
+newpath 282.29903 36.36775 moveto
+281.71571 35.35747 lineto stroke
+newpath 281.71571 35.35747 moveto
+281.13243 36.36777 lineto stroke
+newpath 281.13243 36.36777 moveto
+279.96588 36.36777 lineto stroke
+newpath 279.96588 36.36777 moveto
+279.38258 35.35747 lineto stroke
+newpath 279.38258 35.35747 moveto
+279.9659 34.34712 lineto stroke
+newpath 279.9659 34.34712 moveto
+278.79926 34.34712 lineto stroke
+newpath 278.79926 34.34712 moveto
+278.21596 33.33682 lineto stroke
+newpath 278.21596 33.33682 moveto
+277.63266 34.34712 lineto stroke
+newpath 277.63266 34.34712 moveto
+276.46602 34.34712 lineto stroke
+newpath 276.46602 34.34712 moveto
+277.04935 35.35747 lineto stroke
+newpath 277.04935 35.35747 moveto
+276.46605 36.36777 lineto stroke
+newpath 276.46605 36.36777 moveto
+275.2995 36.36777 lineto stroke
+newpath 275.2995 36.36777 moveto
+274.71619 35.35748 lineto stroke
+newpath 274.71619 35.35748 moveto
+274.1329 36.36778 lineto stroke
+newpath 274.1329 36.36778 moveto
+272.96635 36.36778 lineto stroke
+newpath 272.96635 36.36778 moveto
+272.3831 35.35757 lineto stroke
+newpath 272.3831 35.35757 moveto
+272.96637 34.34732 lineto stroke
+newpath 272.96637 34.34732 moveto
+271.79984 34.34732 lineto stroke
+newpath 271.79984 34.34732 moveto
+271.21658 33.33711 lineto stroke
+newpath 271.21658 33.33711 moveto
+271.79985 32.32686 lineto stroke
+newpath 271.79985 32.32686 moveto
+272.96646 32.32687 lineto stroke
+newpath 272.96646 32.32687 moveto
+272.38316 31.31654 lineto stroke
+newpath 272.38316 31.31654 moveto
+272.96643 30.30629 lineto stroke
+newpath 272.96643 30.30629 moveto
+271.79988 30.30629 lineto stroke
+newpath 271.79988 30.30629 moveto
+271.21657 29.296 lineto stroke
+newpath 271.21657 29.296 moveto
+270.63329 30.3063 lineto stroke
+newpath 270.63329 30.3063 moveto
+269.46674 30.3063 lineto stroke
+newpath 269.46674 30.3063 moveto
+268.88348 29.2961 lineto stroke
+newpath 268.88348 29.2961 moveto
+269.46675 28.28584 lineto stroke
+newpath 269.46675 28.28584 moveto
+268.30022 28.28584 lineto stroke
+newpath 268.30022 28.28584 moveto
+267.71696 27.27563 lineto stroke
+newpath 267.71696 27.27563 moveto
+268.30019 26.26547 lineto stroke
+newpath 268.30019 26.26547 moveto
+269.46667 26.26546 lineto stroke
+newpath 269.46667 26.26546 moveto
+268.88342 25.25526 lineto stroke
+newpath 268.88342 25.25526 moveto
+269.46664 24.2451 lineto stroke
+newpath 269.46664 24.2451 moveto
+270.63313 24.2451 lineto stroke
+newpath 270.63313 24.2451 moveto
+271.21643 25.25536 lineto stroke
+newpath 271.21643 25.25536 moveto
+271.79968 24.24509 lineto stroke
+newpath 271.79968 24.24509 moveto
+272.96617 24.24509 lineto stroke
+newpath 272.96617 24.24509 moveto
+272.38292 23.23488 lineto stroke
+newpath 272.38292 23.23488 moveto
+272.96617 22.22461 lineto stroke
+newpath 272.96617 22.22461 moveto
+271.79964 22.22464 lineto stroke
+newpath 271.79964 22.22464 moveto
+271.21638 21.21443 lineto stroke
+newpath 271.21638 21.21443 moveto
+271.7996 20.20427 lineto stroke
+newpath 271.7996 20.20427 moveto
+272.9661 20.20425 lineto stroke
+newpath 272.9661 20.20425 moveto
+272.38284 19.19406 lineto stroke
+newpath 272.38284 19.19406 moveto
+272.96606 18.1839 lineto stroke
+newpath 272.96606 18.1839 moveto
+274.13255 18.1839 lineto stroke
+newpath 274.13255 18.1839 moveto
+274.71584 19.19417 lineto stroke
+newpath 274.71584 19.19417 moveto
+275.2991 18.1839 lineto stroke
+newpath 275.2991 18.1839 moveto
+276.46559 18.1839 lineto stroke
+newpath 276.46559 18.1839 moveto
+277.04886 19.19417 lineto stroke
+newpath 277.04886 19.19417 moveto
+276.46556 20.2045 lineto stroke
+newpath 276.46556 20.2045 moveto
+277.63217 20.20447 lineto stroke
+newpath 277.63217 20.20447 moveto
+278.21544 21.21474 lineto stroke
+newpath 278.21544 21.21474 moveto
+278.7987 20.20447 lineto stroke
+newpath 278.7987 20.20447 moveto
+279.96532 20.20448 lineto stroke
+newpath 279.96532 20.20448 moveto
+279.38202 19.19417 lineto stroke
+newpath 279.38202 19.19417 moveto
+279.96529 18.1839 lineto stroke
+newpath 279.96529 18.1839 moveto
+281.13177 18.1839 lineto stroke
+newpath 281.13177 18.1839 moveto
+281.71506 19.19417 lineto stroke
+newpath 281.71506 19.19417 moveto
+282.29832 18.1839 lineto stroke
+newpath 282.29832 18.1839 moveto
+283.46481 18.1839 lineto stroke
+newpath 283.46481 18.1839 moveto
+282.88156 17.17369 lineto stroke
+newpath 282.88156 17.17369 moveto
+283.46483 16.16344 lineto stroke
+newpath 283.46483 16.16344 moveto
+282.2983 16.16344 lineto stroke
+newpath 282.2983 16.16344 moveto
+281.71504 15.15323 lineto stroke
+newpath 281.71504 15.15323 moveto
+282.29831 14.14296 lineto stroke
+newpath 282.29831 14.14296 moveto
+283.46492 14.14296 lineto stroke
+newpath 283.46492 14.14296 moveto
+282.8816 13.13266 lineto stroke
+newpath 282.8816 13.13266 moveto
+283.46487 12.12239 lineto stroke
+newpath 283.46487 12.12239 moveto
+282.29832 12.12239 lineto stroke
+newpath 282.29832 12.12239 moveto
+281.71501 11.1121 lineto stroke
+newpath 281.71501 11.1121 moveto
+281.13173 12.1224 lineto stroke
+newpath 281.13173 12.1224 moveto
+279.96518 12.1224 lineto stroke
+newpath 279.96518 12.1224 moveto
+279.38193 11.1122 lineto stroke
+newpath 279.38193 11.1122 moveto
+279.9652 10.10194 lineto stroke
+newpath 279.9652 10.10194 moveto
+278.79866 10.10194 lineto stroke
+newpath 278.79866 10.10194 moveto
+278.21541 9.09174 lineto stroke
+newpath 278.21541 9.09174 moveto
+278.79863 8.08157 lineto stroke
+newpath 278.79863 8.08157 moveto
+279.96512 8.08156 lineto stroke
+newpath 279.96512 8.08156 moveto
+279.38187 7.07137 lineto stroke
+newpath 279.38187 7.07137 moveto
+279.96509 6.0612 lineto stroke
+newpath 279.96509 6.0612 moveto
+281.13158 6.0612 lineto stroke
+newpath 281.13158 6.0612 moveto
+281.71487 7.07146 lineto stroke
+newpath 281.71487 7.07146 moveto
+282.29813 6.06119 lineto stroke
+newpath 282.29813 6.06119 moveto
+283.46461 6.06119 lineto stroke
+newpath 283.46461 6.06119 moveto
+282.88136 5.05098 lineto stroke
+newpath 282.88136 5.05098 moveto
+283.46461 4.04071 lineto stroke
+newpath 283.46461 4.04071 moveto
+282.29808 4.04074 lineto stroke
+newpath 282.29808 4.04074 moveto
+281.71483 3.03053 lineto stroke
+newpath 281.71483 3.03053 moveto
+282.29805 2.02037 lineto stroke
+newpath 282.29805 2.02037 moveto
+283.46454 2.02036 lineto stroke
+newpath 283.46454 2.02036 moveto
+282.88129 1.01016 lineto stroke
+newpath 282.88129 1.01016 moveto
+283.46451 0 lineto stroke
+newpath 283.46451 0 moveto
+282.29807 0 lineto stroke
+newpath 282.29807 0 moveto
+281.71483 -1.0102 lineto stroke
+newpath 281.71483 -1.0102 moveto
+281.13159 0 lineto stroke
+newpath 281.13159 0 moveto
+279.96515 0 lineto stroke
+newpath 279.96515 0 moveto
+279.38191 -1.01021 lineto stroke
+newpath 279.38191 -1.01021 moveto
+279.96516 -2.02048 lineto stroke
+newpath 279.96516 -2.02048 moveto
+278.79863 -2.02045 lineto stroke
+newpath 278.79863 -2.02045 moveto
+278.2154 -3.03065 lineto stroke
+newpath 278.2154 -3.03065 moveto
+277.63216 -2.02045 lineto stroke
+newpath 277.63216 -2.02045 moveto
+276.46562 -2.02045 lineto stroke
+newpath 276.46562 -2.02045 moveto
+277.04889 -1.01021 lineto stroke
+newpath 277.04889 -1.01021 moveto
+276.46565 0 lineto stroke
+newpath 276.46565 0 moveto
+275.29921 0 lineto stroke
+newpath 275.29921 0 moveto
+274.71597 -1.0102 lineto stroke
+newpath 274.71597 -1.0102 moveto
+274.13274 0 lineto stroke
+newpath 274.13274 0 moveto
+272.9663 0 lineto stroke
+newpath 272.9663 0 moveto
+272.38306 -1.01021 lineto stroke
+newpath 272.38306 -1.01021 moveto
+272.96632 -2.02048 lineto stroke
+newpath 272.96632 -2.02048 moveto
+271.79977 -2.02046 lineto stroke
+newpath 271.79977 -2.02046 moveto
+271.21654 -3.03067 lineto stroke
+newpath 271.21654 -3.03067 moveto
+271.7998 -4.04092 lineto stroke
+newpath 271.7998 -4.04092 moveto
+272.96642 -4.04091 lineto stroke
+newpath 272.96642 -4.04091 moveto
+272.38312 -5.05122 lineto stroke
+newpath 272.38312 -5.05122 moveto
+272.96638 -6.06148 lineto stroke
+newpath 272.96638 -6.06148 moveto
+271.79984 -6.06148 lineto stroke
+newpath 271.79984 -6.06148 moveto
+271.21654 -7.07176 lineto stroke
+newpath 271.21654 -7.07176 moveto
+270.63326 -6.06148 lineto stroke
+newpath 270.63326 -6.06148 moveto
+269.4667 -6.06148 lineto stroke
+newpath 269.4667 -6.06148 moveto
+268.88347 -7.07169 lineto stroke
+newpath 268.88347 -7.07169 moveto
+269.46674 -8.08195 lineto stroke
+newpath 269.46674 -8.08195 moveto
+268.30019 -8.08194 lineto stroke
+newpath 268.30019 -8.08194 moveto
+267.71695 -9.09215 lineto stroke
+newpath 267.71695 -9.09215 moveto
+267.13371 -8.08194 lineto stroke
+newpath 267.13371 -8.08194 moveto
+265.96716 -8.08195 lineto stroke
+newpath 265.96716 -8.08195 moveto
+266.55043 -7.07169 lineto stroke
+newpath 266.55043 -7.07169 moveto
+265.9672 -6.06148 lineto stroke
+newpath 265.9672 -6.06148 moveto
+264.80064 -6.06148 lineto stroke
+newpath 264.80064 -6.06148 moveto
+264.21733 -7.07175 lineto stroke
+newpath 264.21733 -7.07175 moveto
+263.63406 -6.06146 lineto stroke
+newpath 263.63406 -6.06146 moveto
+262.46751 -6.06146 lineto stroke
+newpath 262.46751 -6.06146 moveto
+263.0508 -5.05121 lineto stroke
+newpath 263.0508 -5.05121 moveto
+262.46751 -4.04091 lineto stroke
+newpath 262.46751 -4.04091 moveto
+263.6341 -4.04092 lineto stroke
+newpath 263.6341 -4.04092 moveto
+264.21738 -3.03067 lineto stroke
+newpath 264.21738 -3.03067 moveto
+263.63414 -2.02046 lineto stroke
+newpath 263.63414 -2.02046 moveto
+262.46759 -2.02048 lineto stroke
+newpath 262.46759 -2.02048 moveto
+263.05086 -1.01021 lineto stroke
+newpath 263.05086 -1.01021 moveto
+262.46762 0 lineto stroke
+newpath 262.46762 0 moveto
+261.30118 0 lineto stroke
+newpath 261.30118 0 moveto
+260.71794 -1.0102 lineto stroke
+newpath 260.71794 -1.0102 moveto
+260.1347 0 lineto stroke
+newpath 260.1347 0 moveto
+258.96826 0 lineto stroke
+newpath 258.96826 0 moveto
+258.38503 -1.01021 lineto stroke
+newpath 258.38503 -1.01021 moveto
+258.96828 -2.02048 lineto stroke
+newpath 258.96828 -2.02048 moveto
+257.80174 -2.02045 lineto stroke
+newpath 257.80174 -2.02045 moveto
+257.2185 -3.03065 lineto stroke
+newpath 257.2185 -3.03065 moveto
+256.63527 -2.02045 lineto stroke
+newpath 256.63527 -2.02045 moveto
+255.46873 -2.02045 lineto stroke
+newpath 255.46873 -2.02045 moveto
+256.052 -1.01021 lineto stroke
+newpath 256.052 -1.01021 moveto
+255.46877 0 lineto stroke
+newpath 255.46877 0 moveto
+254.30232 0 lineto stroke
+newpath 254.30232 0 moveto
+253.71909 -1.0102 lineto stroke
+newpath 253.71909 -1.0102 moveto
+253.13585 0 lineto stroke
+newpath 253.13585 0 moveto
+251.9694 0 lineto stroke
+newpath 251.9694 0 moveto
+251.38617 -1.01021 lineto stroke
+newpath 251.38617 -1.01021 moveto
+251.96944 -2.02048 lineto stroke
+newpath 251.96944 -2.02048 moveto
+250.80289 -2.02046 lineto stroke
+newpath 250.80289 -2.02046 moveto
+250.21965 -3.03067 lineto stroke
+newpath 250.21965 -3.03067 moveto
+250.80292 -4.04092 lineto stroke
+newpath 250.80292 -4.04092 moveto
+251.96953 -4.04091 lineto stroke
+newpath 251.96953 -4.04091 moveto
+251.38623 -5.05122 lineto stroke
+newpath 251.38623 -5.05122 moveto
+251.9695 -6.06148 lineto stroke
+newpath 251.9695 -6.06148 moveto
+250.80295 -6.06148 lineto stroke
+newpath 250.80295 -6.06148 moveto
+250.21965 -7.07176 lineto stroke
+newpath 250.21965 -7.07176 moveto
+249.63637 -6.06148 lineto stroke
+newpath 249.63637 -6.06148 moveto
+248.46982 -6.06148 lineto stroke
+newpath 248.46982 -6.06148 moveto
+247.88658 -7.07169 lineto stroke
+newpath 247.88658 -7.07169 moveto
+248.46985 -8.08195 lineto stroke
+newpath 248.46985 -8.08195 moveto
+247.3033 -8.08194 lineto stroke
+newpath 247.3033 -8.08194 moveto
+246.72006 -9.09215 lineto stroke
+newpath 246.72006 -9.09215 moveto
+247.30333 -10.1024 lineto stroke
+newpath 247.30333 -10.1024 moveto
+248.46994 -10.10239 lineto stroke
+newpath 248.46994 -10.10239 moveto
+247.88664 -11.1127 lineto stroke
+newpath 247.88664 -11.1127 moveto
+248.46991 -12.12296 lineto stroke
+newpath 248.46991 -12.12296 moveto
+249.63652 -12.12296 lineto stroke
+newpath 249.63652 -12.12296 moveto
+250.21983 -11.1126 lineto stroke
+newpath 250.21983 -11.1126 moveto
+250.80316 -12.12294 lineto stroke
+newpath 250.80316 -12.12294 moveto
+251.96977 -12.12294 lineto stroke
+newpath 251.96977 -12.12294 moveto
+251.38647 -13.13326 lineto stroke
+newpath 251.38647 -13.13326 moveto
+251.96979 -14.1436 lineto stroke
+newpath 251.96979 -14.1436 moveto
+250.80315 -14.1436 lineto stroke
+newpath 250.80315 -14.1436 moveto
+250.21985 -15.15392 lineto stroke
+newpath 250.21985 -15.15392 moveto
+250.80312 -16.16417 lineto stroke
+newpath 250.80312 -16.16417 moveto
+251.96973 -16.16415 lineto stroke
+newpath 251.96973 -16.16415 moveto
+251.38643 -17.17447 lineto stroke
+newpath 251.38643 -17.17447 moveto
+251.9697 -18.18472 lineto stroke
+newpath 251.9697 -18.18472 moveto
+250.80315 -18.18472 lineto stroke
+newpath 250.80315 -18.18472 moveto
+250.21985 -19.195 lineto stroke
+newpath 250.21985 -19.195 moveto
+249.63657 -18.18472 lineto stroke
+newpath 249.63657 -18.18472 moveto
+248.47002 -18.18472 lineto stroke
+newpath 248.47002 -18.18472 moveto
+247.88672 -19.19502 lineto stroke
+newpath 247.88672 -19.19502 moveto
+248.47005 -20.20538 lineto stroke
+newpath 248.47005 -20.20538 moveto
+247.30339 -20.20538 lineto stroke
+newpath 247.30339 -20.20538 moveto
+246.7201 -21.21568 lineto stroke
+newpath 246.7201 -21.21568 moveto
+246.1368 -20.20538 lineto stroke
+newpath 246.1368 -20.20538 moveto
+244.97012 -20.20537 lineto stroke
+newpath 244.97012 -20.20537 moveto
+245.55347 -19.19502 lineto stroke
+newpath 245.55347 -19.19502 moveto
+244.97017 -18.18472 lineto stroke
+newpath 244.97017 -18.18472 moveto
+243.80362 -18.18472 lineto stroke
+newpath 243.80362 -18.18472 moveto
+243.22032 -19.195 lineto stroke
+newpath 243.22032 -19.195 moveto
+242.63704 -18.18472 lineto stroke
+newpath 242.63704 -18.18472 moveto
+241.47049 -18.18472 lineto stroke
+newpath 241.47049 -18.18472 moveto
+240.88725 -19.19493 lineto stroke
+newpath 240.88725 -19.19493 moveto
+241.47052 -20.2052 lineto stroke
+newpath 241.47052 -20.2052 moveto
+240.30397 -20.20518 lineto stroke
+newpath 240.30397 -20.20518 moveto
+239.72073 -21.2154 lineto stroke
+newpath 239.72073 -21.2154 moveto
+240.304 -22.22565 lineto stroke
+newpath 240.304 -22.22565 moveto
+241.47061 -22.22563 lineto stroke
+newpath 241.47061 -22.22563 moveto
+240.88731 -23.23595 lineto stroke
+newpath 240.88731 -23.23595 moveto
+241.47058 -24.2462 lineto stroke
+newpath 241.47058 -24.2462 moveto
+240.30403 -24.2462 lineto stroke
+newpath 240.30403 -24.2462 moveto
+239.72073 -25.25648 lineto stroke
+newpath 239.72073 -25.25648 moveto
+239.13745 -24.2462 lineto stroke
+newpath 239.13745 -24.2462 moveto
+237.9709 -24.2462 lineto stroke
+newpath 237.9709 -24.2462 moveto
+237.38766 -25.25641 lineto stroke
+newpath 237.38766 -25.25641 moveto
+237.97093 -26.26668 lineto stroke
+newpath 237.97093 -26.26668 moveto
+236.80438 -26.26666 lineto stroke
+newpath 236.80438 -26.26666 moveto
+236.22115 -27.27687 lineto stroke
+newpath 236.22115 -27.27687 moveto
+235.63791 -26.26666 lineto stroke
+newpath 235.63791 -26.26666 moveto
+234.47136 -26.26668 lineto stroke
+newpath 234.47136 -26.26668 moveto
+235.05463 -25.25641 lineto stroke
+newpath 235.05463 -25.25641 moveto
+234.47139 -24.2462 lineto stroke
+newpath 234.47139 -24.2462 moveto
+233.30484 -24.2462 lineto stroke
+newpath 233.30484 -24.2462 moveto
+232.72153 -25.25648 lineto stroke
+newpath 232.72153 -25.25648 moveto
+232.13824 -24.24619 lineto stroke
+newpath 232.13824 -24.24619 moveto
+230.9717 -24.24619 lineto stroke
+newpath 230.9717 -24.24619 moveto
+231.55498 -23.23593 lineto stroke
+newpath 231.55498 -23.23593 moveto
+230.9717 -22.22563 lineto stroke
+newpath 230.9717 -22.22563 moveto
+232.13828 -22.22565 lineto stroke
+newpath 232.13828 -22.22565 moveto
+232.72156 -21.2154 lineto stroke
+newpath 232.72156 -21.2154 moveto
+232.13832 -20.20518 lineto stroke
+newpath 232.13832 -20.20518 moveto
+230.97177 -20.2052 lineto stroke
+newpath 230.97177 -20.2052 moveto
+231.55504 -19.19493 lineto stroke
+newpath 231.55504 -19.19493 moveto
+230.9718 -18.18472 lineto stroke
+newpath 230.9718 -18.18472 moveto
+229.80525 -18.18472 lineto stroke
+newpath 229.80525 -18.18472 moveto
+229.22195 -19.195 lineto stroke
+newpath 229.22195 -19.195 moveto
+228.63867 -18.18472 lineto stroke
+newpath 228.63867 -18.18472 moveto
+227.47212 -18.18472 lineto stroke
+newpath 227.47212 -18.18472 moveto
+226.88882 -19.19502 lineto stroke
+newpath 226.88882 -19.19502 moveto
+227.47214 -20.20538 lineto stroke
+newpath 227.47214 -20.20538 moveto
+226.30548 -20.20537 lineto stroke
+newpath 226.30548 -20.20537 moveto
+225.72218 -21.21567 lineto stroke
+newpath 225.72218 -21.21567 moveto
+225.13889 -20.20537 lineto stroke
+newpath 225.13889 -20.20537 moveto
+223.97223 -20.20535 lineto stroke
+newpath 223.97223 -20.20535 moveto
+224.55557 -19.195 lineto stroke
+newpath 224.55557 -19.195 moveto
+223.97227 -18.18471 lineto stroke
+newpath 223.97227 -18.18471 moveto
+222.80573 -18.18471 lineto stroke
+newpath 222.80573 -18.18471 moveto
+222.22243 -19.19499 lineto stroke
+newpath 222.22243 -19.19499 moveto
+221.63914 -18.18471 lineto stroke
+newpath 221.63914 -18.18471 moveto
+220.4726 -18.18471 lineto stroke
+newpath 220.4726 -18.18471 moveto
+221.05586 -17.17445 lineto stroke
+newpath 221.05586 -17.17445 moveto
+220.47256 -16.16412 lineto stroke
+newpath 220.47256 -16.16412 moveto
+221.63918 -16.16415 lineto stroke
+newpath 221.63918 -16.16415 moveto
+222.22244 -15.1539 lineto stroke
+newpath 222.22244 -15.1539 moveto
+221.63914 -14.14359 lineto stroke
+newpath 221.63914 -14.14359 moveto
+220.4725 -14.14359 lineto stroke
+newpath 220.4725 -14.14359 moveto
+221.05583 -13.13324 lineto stroke
+newpath 221.05583 -13.13324 moveto
+220.47253 -12.12292 lineto stroke
+newpath 220.47253 -12.12292 moveto
+221.63913 -12.12294 lineto stroke
+newpath 221.63913 -12.12294 moveto
+222.22246 -11.11258 lineto stroke
+newpath 222.22246 -11.11258 moveto
+222.80579 -12.12294 lineto stroke
+newpath 222.80579 -12.12294 moveto
+223.97238 -12.12296 lineto stroke
+newpath 223.97238 -12.12296 moveto
+224.55565 -11.1127 lineto stroke
+newpath 224.55565 -11.1127 moveto
+223.97235 -10.10237 lineto stroke
+newpath 223.97235 -10.10237 moveto
+225.13896 -10.1024 lineto stroke
+newpath 225.13896 -10.1024 moveto
+225.72223 -9.09215 lineto stroke
+newpath 225.72223 -9.09215 moveto
+225.13899 -8.08194 lineto stroke
+newpath 225.13899 -8.08194 moveto
+223.97244 -8.08195 lineto stroke
+newpath 223.97244 -8.08195 moveto
+224.55571 -7.07169 lineto stroke
+newpath 224.55571 -7.07169 moveto
+223.97247 -6.06148 lineto stroke
+newpath 223.97247 -6.06148 moveto
+222.80592 -6.06148 lineto stroke
+newpath 222.80592 -6.06148 moveto
+222.22261 -7.07176 lineto stroke
+newpath 222.22261 -7.07176 moveto
+221.63933 -6.06146 lineto stroke
+newpath 221.63933 -6.06146 moveto
+220.47278 -6.06146 lineto stroke
+newpath 220.47278 -6.06146 moveto
+221.05606 -5.05121 lineto stroke
+newpath 221.05606 -5.05121 moveto
+220.47278 -4.04091 lineto stroke
+newpath 220.47278 -4.04091 moveto
+221.63936 -4.04092 lineto stroke
+newpath 221.63936 -4.04092 moveto
+222.22264 -3.03067 lineto stroke
+newpath 222.22264 -3.03067 moveto
+221.6394 -2.02046 lineto stroke
+newpath 221.6394 -2.02046 moveto
+220.47285 -2.02048 lineto stroke
+newpath 220.47285 -2.02048 moveto
+221.05612 -1.01021 lineto stroke
+newpath 221.05612 -1.01021 moveto
+220.47289 0 lineto stroke
+newpath 220.47289 0 moveto
+219.30644 0 lineto stroke
+newpath 219.30644 0 moveto
+218.7232 -1.0102 lineto stroke
+newpath 218.7232 -1.0102 moveto
+218.13997 0 lineto stroke
+newpath 218.13997 0 moveto
+216.97353 0 lineto stroke
+newpath 216.97353 0 moveto
+216.39029 -1.01021 lineto stroke
+newpath 216.39029 -1.01021 moveto
+216.97354 -2.02048 lineto stroke
+newpath 216.97354 -2.02048 moveto
+215.807 -2.02045 lineto stroke
+newpath 215.807 -2.02045 moveto
+215.22377 -3.03065 lineto stroke
+newpath 215.22377 -3.03065 moveto
+214.64053 -2.02045 lineto stroke
+newpath 214.64053 -2.02045 moveto
+213.474 -2.02045 lineto stroke
+newpath 213.474 -2.02045 moveto
+214.05727 -1.01021 lineto stroke
+newpath 214.05727 -1.01021 moveto
+213.47403 0 lineto stroke
+newpath 213.47403 0 moveto
+212.30759 0 lineto stroke
+newpath 212.30759 0 moveto
+211.72435 -1.0102 lineto stroke
+newpath 211.72435 -1.0102 moveto
+211.14111 0 lineto stroke
+newpath 211.14111 0 moveto
+209.97467 0 lineto stroke
+newpath 209.97467 0 moveto
+209.39143 -1.01021 lineto stroke
+newpath 209.39143 -1.01021 moveto
+209.9747 -2.02048 lineto stroke
+newpath 209.9747 -2.02048 moveto
+208.80815 -2.02046 lineto stroke
+newpath 208.80815 -2.02046 moveto
+208.22491 -3.03067 lineto stroke
+newpath 208.22491 -3.03067 moveto
+208.80818 -4.04092 lineto stroke
+newpath 208.80818 -4.04092 moveto
+209.9748 -4.04091 lineto stroke
+newpath 209.9748 -4.04091 moveto
+209.3915 -5.05122 lineto stroke
+newpath 209.3915 -5.05122 moveto
+209.97476 -6.06148 lineto stroke
+newpath 209.97476 -6.06148 moveto
+208.80821 -6.06148 lineto stroke
+newpath 208.80821 -6.06148 moveto
+208.22491 -7.07176 lineto stroke
+newpath 208.22491 -7.07176 moveto
+207.64163 -6.06148 lineto stroke
+newpath 207.64163 -6.06148 moveto
+206.47508 -6.06148 lineto stroke
+newpath 206.47508 -6.06148 moveto
+205.89185 -7.07169 lineto stroke
+newpath 205.89185 -7.07169 moveto
+206.47511 -8.08195 lineto stroke
+newpath 206.47511 -8.08195 moveto
+205.30856 -8.08194 lineto stroke
+newpath 205.30856 -8.08194 moveto
+204.72533 -9.09215 lineto stroke
+newpath 204.72533 -9.09215 moveto
+204.14209 -8.08194 lineto stroke
+newpath 204.14209 -8.08194 moveto
+202.97554 -8.08195 lineto stroke
+newpath 202.97554 -8.08195 moveto
+203.5588 -7.07169 lineto stroke
+newpath 203.5588 -7.07169 moveto
+202.97557 -6.06148 lineto stroke
+newpath 202.97557 -6.06148 moveto
+201.80902 -6.06148 lineto stroke
+newpath 201.80902 -6.06148 moveto
+201.22571 -7.07175 lineto stroke
+newpath 201.22571 -7.07175 moveto
+200.64244 -6.06146 lineto stroke
+newpath 200.64244 -6.06146 moveto
+199.47589 -6.06146 lineto stroke
+newpath 199.47589 -6.06146 moveto
+200.05917 -5.05121 lineto stroke
+newpath 200.05917 -5.05121 moveto
+199.47589 -4.04091 lineto stroke
+newpath 199.47589 -4.04091 moveto
+200.64247 -4.04092 lineto stroke
+newpath 200.64247 -4.04092 moveto
+201.22575 -3.03067 lineto stroke
+newpath 201.22575 -3.03067 moveto
+200.64252 -2.02046 lineto stroke
+newpath 200.64252 -2.02046 moveto
+199.47597 -2.02048 lineto stroke
+newpath 199.47597 -2.02048 moveto
+200.05923 -1.01021 lineto stroke
+newpath 200.05923 -1.01021 moveto
+199.476 0 lineto stroke
+newpath 199.476 0 moveto
+198.30956 0 lineto stroke
+newpath 198.30956 0 moveto
+197.72632 -1.0102 lineto stroke
+newpath 197.72632 -1.0102 moveto
+197.14308 0 lineto stroke
+newpath 197.14308 0 moveto
+195.97664 0 lineto stroke
+newpath 195.97664 0 moveto
+195.3934 -1.01021 lineto stroke
+newpath 195.3934 -1.01021 moveto
+195.97665 -2.02048 lineto stroke
+newpath 195.97665 -2.02048 moveto
+194.81012 -2.02045 lineto stroke
+newpath 194.81012 -2.02045 moveto
+194.22688 -3.03065 lineto stroke
+newpath 194.22688 -3.03065 moveto
+193.64365 -2.02045 lineto stroke
+newpath 193.64365 -2.02045 moveto
+192.47711 -2.02045 lineto stroke
+newpath 192.47711 -2.02045 moveto
+193.06038 -1.01021 lineto stroke
+newpath 193.06038 -1.01021 moveto
+192.47714 0 lineto stroke
+newpath 192.47714 0 moveto
+191.3107 0 lineto stroke
+newpath 191.3107 0 moveto
+190.72746 -1.0102 lineto stroke
+newpath 190.72746 -1.0102 moveto
+190.14423 0 lineto stroke
+newpath 190.14423 0 moveto
+188.97778 0 lineto stroke
+newpath 188.97778 0 moveto
+188.39455 -1.01021 lineto stroke
+newpath 188.39455 -1.01021 moveto
+188.97781 -2.02048 lineto stroke
+newpath 188.97781 -2.02048 moveto
+187.81126 -2.02046 lineto stroke
+newpath 187.81126 -2.02046 moveto
+187.22803 -3.03067 lineto stroke
+newpath 187.22803 -3.03067 moveto
+187.8113 -4.04092 lineto stroke
+newpath 187.8113 -4.04092 moveto
+188.9779 -4.04091 lineto stroke
+newpath 188.9779 -4.04091 moveto
+188.3946 -5.05122 lineto stroke
+newpath 188.3946 -5.05122 moveto
+188.97787 -6.06148 lineto stroke
+newpath 188.97787 -6.06148 moveto
+187.81133 -6.06148 lineto stroke
+newpath 187.81133 -6.06148 moveto
+187.22804 -7.07178 lineto stroke
+newpath 187.22804 -7.07178 moveto
+186.64474 -6.0615 lineto stroke
+newpath 186.64474 -6.0615 moveto
+185.4782 -6.0615 lineto stroke
+newpath 185.4782 -6.0615 moveto
+184.89496 -7.0717 lineto stroke
+newpath 184.89496 -7.0717 moveto
+185.47823 -8.08197 lineto stroke
+newpath 185.47823 -8.08197 moveto
+184.31168 -8.08195 lineto stroke
+newpath 184.31168 -8.08195 moveto
+183.72844 -9.09216 lineto stroke
+newpath 183.72844 -9.09216 moveto
+184.3117 -10.10242 lineto stroke
+newpath 184.3117 -10.10242 moveto
+185.47832 -10.1024 lineto stroke
+newpath 185.47832 -10.1024 moveto
+184.89502 -11.11272 lineto stroke
+newpath 184.89502 -11.11272 moveto
+185.47829 -12.12297 lineto stroke
+newpath 185.47829 -12.12297 moveto
+186.64488 -12.12297 lineto stroke
+newpath 186.64488 -12.12297 moveto
+187.22823 -11.11263 lineto stroke
+newpath 187.22823 -11.11263 moveto
+187.81154 -12.12299 lineto stroke
+newpath 187.81154 -12.12299 moveto
+188.97813 -12.12299 lineto stroke
+newpath 188.97813 -12.12299 moveto
+188.39484 -13.13329 lineto stroke
+newpath 188.39484 -13.13329 moveto
+188.97815 -14.14365 lineto stroke
+newpath 188.97815 -14.14365 moveto
+187.8115 -14.14363 lineto stroke
+newpath 187.8115 -14.14363 moveto
+187.2282 -15.15393 lineto stroke
+newpath 187.2282 -15.15393 moveto
+187.81146 -16.16418 lineto stroke
+newpath 187.81146 -16.16418 moveto
+188.97807 -16.16417 lineto stroke
+newpath 188.97807 -16.16417 moveto
+188.39478 -17.17448 lineto stroke
+newpath 188.39478 -17.17448 moveto
+188.97804 -18.18474 lineto stroke
+newpath 188.97804 -18.18474 moveto
+187.8115 -18.18474 lineto stroke
+newpath 187.8115 -18.18474 moveto
+187.2282 -19.19502 lineto stroke
+newpath 187.2282 -19.19502 moveto
+186.64491 -18.18474 lineto stroke
+newpath 186.64491 -18.18474 moveto
+185.47836 -18.18474 lineto stroke
+newpath 185.47836 -18.18474 moveto
+184.89507 -19.19504 lineto stroke
+newpath 184.89507 -19.19504 moveto
+185.47836 -20.2054 lineto stroke
+newpath 185.47836 -20.2054 moveto
+184.31172 -20.20537 lineto stroke
+newpath 184.31172 -20.20537 moveto
+183.72842 -21.21567 lineto stroke
+newpath 183.72842 -21.21567 moveto
+183.14514 -20.20537 lineto stroke
+newpath 183.14514 -20.20537 moveto
+181.97849 -20.20537 lineto stroke
+newpath 181.97849 -20.20537 moveto
+182.56181 -19.19502 lineto stroke
+newpath 182.56181 -19.19502 moveto
+181.97853 -18.18472 lineto stroke
+newpath 181.97853 -18.18472 moveto
+180.81198 -18.18472 lineto stroke
+newpath 180.81198 -18.18472 moveto
+180.22868 -19.195 lineto stroke
+newpath 180.22868 -19.195 moveto
+179.6454 -18.18472 lineto stroke
+newpath 179.6454 -18.18472 moveto
+178.47885 -18.18472 lineto stroke
+newpath 178.47885 -18.18472 moveto
+177.89561 -19.19493 lineto stroke
+newpath 177.89561 -19.19493 moveto
+178.47888 -20.2052 lineto stroke
+newpath 178.47888 -20.2052 moveto
+177.31233 -20.20518 lineto stroke
+newpath 177.31233 -20.20518 moveto
+176.7291 -21.2154 lineto stroke
+newpath 176.7291 -21.2154 moveto
+177.31236 -22.22565 lineto stroke
+newpath 177.31236 -22.22565 moveto
+178.47897 -22.22563 lineto stroke
+newpath 178.47897 -22.22563 moveto
+177.89568 -23.23595 lineto stroke
+newpath 177.89568 -23.23595 moveto
+178.47894 -24.2462 lineto stroke
+newpath 178.47894 -24.2462 moveto
+177.3124 -24.2462 lineto stroke
+newpath 177.3124 -24.2462 moveto
+176.72911 -25.2565 lineto stroke
+newpath 176.72911 -25.2565 moveto
+176.14581 -24.24622 lineto stroke
+newpath 176.14581 -24.24622 moveto
+174.97926 -24.24622 lineto stroke
+newpath 174.97926 -24.24622 moveto
+174.39603 -25.25642 lineto stroke
+newpath 174.39603 -25.25642 moveto
+174.9793 -26.2667 lineto stroke
+newpath 174.9793 -26.2667 moveto
+173.81274 -26.26668 lineto stroke
+newpath 173.81274 -26.26668 moveto
+173.2295 -27.27689 lineto stroke
+newpath 173.2295 -27.27689 moveto
+173.81277 -28.28714 lineto stroke
+newpath 173.81277 -28.28714 moveto
+174.97939 -28.28712 lineto stroke
+newpath 174.97939 -28.28712 moveto
+174.39609 -29.29744 lineto stroke
+newpath 174.39609 -29.29744 moveto
+174.97935 -30.3077 lineto stroke
+newpath 174.97935 -30.3077 moveto
+176.14597 -30.3077 lineto stroke
+newpath 176.14597 -30.3077 moveto
+176.7293 -29.29735 lineto stroke
+newpath 176.7293 -29.29735 moveto
+177.3126 -30.3077 lineto stroke
+newpath 177.3126 -30.3077 moveto
+178.47922 -30.3077 lineto stroke
+newpath 178.47922 -30.3077 moveto
+177.89592 -31.318 lineto stroke
+newpath 177.89592 -31.318 moveto
+178.47925 -32.32837 lineto stroke
+newpath 178.47925 -32.32837 moveto
+177.31258 -32.32835 lineto stroke
+newpath 177.31258 -32.32835 moveto
+176.72928 -33.33865 lineto stroke
+newpath 176.72928 -33.33865 moveto
+177.31255 -34.3489 lineto stroke
+newpath 177.31255 -34.3489 moveto
+178.47916 -34.34889 lineto stroke
+newpath 178.47916 -34.34889 moveto
+177.89586 -35.3592 lineto stroke
+newpath 177.89586 -35.3592 moveto
+178.47913 -36.36946 lineto stroke
+newpath 178.47913 -36.36946 moveto
+179.64572 -36.36946 lineto stroke
+newpath 179.64572 -36.36946 moveto
+180.22903 -35.35909 lineto stroke
+newpath 180.22903 -35.35909 moveto
+180.81238 -36.36945 lineto stroke
+newpath 180.81238 -36.36945 moveto
+181.97897 -36.36945 lineto stroke
+newpath 181.97897 -36.36945 moveto
+182.5623 -35.35909 lineto stroke
+newpath 182.5623 -35.35909 moveto
+181.97893 -34.3487 lineto stroke
+newpath 181.97893 -34.3487 moveto
+183.14565 -34.34868 lineto stroke
+newpath 183.14565 -34.34868 moveto
+183.72897 -33.33832 lineto stroke
+newpath 183.72897 -33.33832 moveto
+184.3123 -34.34868 lineto stroke
+newpath 184.3123 -34.34868 moveto
+185.47902 -34.34868 lineto stroke
+newpath 185.47902 -34.34868 moveto
+184.89566 -35.35907 lineto stroke
+newpath 184.89566 -35.35907 moveto
+185.47899 -36.36943 lineto stroke
+newpath 185.47899 -36.36943 moveto
+186.64558 -36.36943 lineto stroke
+newpath 186.64558 -36.36943 moveto
+187.2289 -35.35905 lineto stroke
+newpath 187.2289 -35.35905 moveto
+187.81224 -36.36942 lineto stroke
+newpath 187.81224 -36.36942 moveto
+188.97884 -36.36942 lineto stroke
+newpath 188.97884 -36.36942 moveto
+188.39554 -37.37971 lineto stroke
+newpath 188.39554 -37.37971 moveto
+188.97887 -38.39008 lineto stroke
+newpath 188.97887 -38.39008 moveto
+187.81221 -38.39008 lineto stroke
+newpath 187.81221 -38.39008 moveto
+187.22891 -39.40038 lineto stroke
+newpath 187.22891 -39.40038 moveto
+187.81224 -40.41072 lineto stroke
+newpath 187.81224 -40.41072 moveto
+188.97896 -40.41072 lineto stroke
+newpath 188.97896 -40.41072 moveto
+188.3956 -41.42111 lineto stroke
+newpath 188.3956 -41.42111 moveto
+188.97893 -42.43146 lineto stroke
+newpath 188.97893 -42.43146 moveto
+187.81227 -42.43146 lineto stroke
+newpath 187.81227 -42.43146 moveto
+187.22893 -43.44186 lineto stroke
+newpath 187.22893 -43.44186 moveto
+186.64557 -42.43147 lineto stroke
+newpath 186.64557 -42.43147 moveto
+185.47893 -42.43147 lineto stroke
+newpath 185.47893 -42.43147 moveto
+184.89563 -43.44177 lineto stroke
+newpath 184.89563 -43.44177 moveto
+185.47896 -44.45213 lineto stroke
+newpath 185.47896 -44.45213 moveto
+184.3123 -44.45213 lineto stroke
+newpath 184.3123 -44.45213 moveto
+183.729 -45.46243 lineto stroke
+newpath 183.729 -45.46243 moveto
+184.31227 -46.47269 lineto stroke
+newpath 184.31227 -46.47269 moveto
+185.47888 -46.47267 lineto stroke
+newpath 185.47888 -46.47267 moveto
+184.89558 -47.48299 lineto stroke
+newpath 184.89558 -47.48299 moveto
+185.47885 -48.49324 lineto stroke
+newpath 185.47885 -48.49324 moveto
+186.64546 -48.49324 lineto stroke
+newpath 186.64546 -48.49324 moveto
+187.22879 -47.4829 lineto stroke
+newpath 187.22879 -47.4829 moveto
+187.8121 -48.49324 lineto stroke
+newpath 187.8121 -48.49324 moveto
+188.97871 -48.49324 lineto stroke
+newpath 188.97871 -48.49324 moveto
+188.39542 -49.50354 lineto stroke
+newpath 188.39542 -49.50354 moveto
+188.97874 -50.51392 lineto stroke
+newpath 188.97874 -50.51392 moveto
+187.81207 -50.5139 lineto stroke
+newpath 187.81207 -50.5139 moveto
+187.22878 -51.5242 lineto stroke
+newpath 187.22878 -51.5242 moveto
+187.81204 -52.53445 lineto stroke
+newpath 187.81204 -52.53445 moveto
+188.97865 -52.53444 lineto stroke
+newpath 188.97865 -52.53444 moveto
+188.39536 -53.54475 lineto stroke
+newpath 188.39536 -53.54475 moveto
+188.97862 -54.55501 lineto stroke
+newpath 188.97862 -54.55501 moveto
+187.81207 -54.55501 lineto stroke
+newpath 187.81207 -54.55501 moveto
+187.22878 -55.56529 lineto stroke
+newpath 187.22878 -55.56529 moveto
+186.6455 -54.55501 lineto stroke
+newpath 186.6455 -54.55501 moveto
+185.47894 -54.55501 lineto stroke
+newpath 185.47894 -54.55501 moveto
+184.89565 -55.5653 lineto stroke
+newpath 184.89565 -55.5653 moveto
+185.47897 -56.57567 lineto stroke
+newpath 185.47897 -56.57567 moveto
+184.31232 -56.57567 lineto stroke
+newpath 184.31232 -56.57567 moveto
+183.72902 -57.58597 lineto stroke
+newpath 183.72902 -57.58597 moveto
+183.14572 -56.57567 lineto stroke
+newpath 183.14572 -56.57567 moveto
+181.97905 -56.57565 lineto stroke
+newpath 181.97905 -56.57565 moveto
+182.5624 -55.5653 lineto stroke
+newpath 182.5624 -55.5653 moveto
+181.9791 -54.55501 lineto stroke
+newpath 181.9791 -54.55501 moveto
+180.81255 -54.55501 lineto stroke
+newpath 180.81255 -54.55501 moveto
+180.22925 -55.56529 lineto stroke
+newpath 180.22925 -55.56529 moveto
+179.64597 -54.55501 lineto stroke
+newpath 179.64597 -54.55501 moveto
+178.47942 -54.55501 lineto stroke
+newpath 178.47942 -54.55501 moveto
+177.89612 -55.5653 lineto stroke
+newpath 177.89612 -55.5653 moveto
+178.47945 -56.57567 lineto stroke
+newpath 178.47945 -56.57567 moveto
+177.31279 -56.57567 lineto stroke
+newpath 177.31279 -56.57567 moveto
+176.72949 -57.58597 lineto stroke
+newpath 176.72949 -57.58597 moveto
+177.31282 -58.59631 lineto stroke
+newpath 177.31282 -58.59631 moveto
+178.47955 -58.59631 lineto stroke
+newpath 178.47955 -58.59631 moveto
+177.89618 -59.60672 lineto stroke
+newpath 177.89618 -59.60672 moveto
+178.4795 -60.61707 lineto stroke
+newpath 178.4795 -60.61707 moveto
+177.31285 -60.61707 lineto stroke
+newpath 177.31285 -60.61707 moveto
+176.72949 -61.62746 lineto stroke
+newpath 176.72949 -61.62746 moveto
+176.14615 -60.61707 lineto stroke
+newpath 176.14615 -60.61707 moveto
+174.97949 -60.61707 lineto stroke
+newpath 174.97949 -60.61707 moveto
+174.3962 -61.62737 lineto stroke
+newpath 174.3962 -61.62737 moveto
+174.97952 -62.63773 lineto stroke
+newpath 174.97952 -62.63773 moveto
+173.81287 -62.63773 lineto stroke
+newpath 173.81287 -62.63773 moveto
+173.22957 -63.64803 lineto stroke
+newpath 173.22957 -63.64803 moveto
+172.64627 -62.63773 lineto stroke
+newpath 172.64627 -62.63773 moveto
+171.4796 -62.63771 lineto stroke
+newpath 171.4796 -62.63771 moveto
+172.06294 -61.62737 lineto stroke
+newpath 172.06294 -61.62737 moveto
+171.47964 -60.61707 lineto stroke
+newpath 171.47964 -60.61707 moveto
+170.31299 -60.61707 lineto stroke
+newpath 170.31299 -60.61707 moveto
+169.72961 -61.62744 lineto stroke
+newpath 169.72961 -61.62744 moveto
+169.14629 -60.61705 lineto stroke
+newpath 169.14629 -60.61705 moveto
+167.97963 -60.61705 lineto stroke
+newpath 167.97963 -60.61705 moveto
+168.56296 -59.6067 lineto stroke
+newpath 168.56296 -59.6067 moveto
+167.97961 -58.59628 lineto stroke
+newpath 167.97961 -58.59628 moveto
+169.14633 -58.59631 lineto stroke
+newpath 169.14633 -58.59631 moveto
+169.72966 -57.58597 lineto stroke
+newpath 169.72966 -57.58597 moveto
+169.14636 -56.57567 lineto stroke
+newpath 169.14636 -56.57567 moveto
+167.97969 -56.57565 lineto stroke
+newpath 167.97969 -56.57565 moveto
+168.56303 -55.5653 lineto stroke
+newpath 168.56303 -55.5653 moveto
+167.97974 -54.55501 lineto stroke
+newpath 167.97974 -54.55501 moveto
+166.81319 -54.55501 lineto stroke
+newpath 166.81319 -54.55501 moveto
+166.22989 -55.56529 lineto stroke
+newpath 166.22989 -55.56529 moveto
+165.6466 -54.55501 lineto stroke
+newpath 165.6466 -54.55501 moveto
+164.48006 -54.55501 lineto stroke
+newpath 164.48006 -54.55501 moveto
+163.89676 -55.5653 lineto stroke
+newpath 163.89676 -55.5653 moveto
+164.48009 -56.57567 lineto stroke
+newpath 164.48009 -56.57567 moveto
+163.31343 -56.57567 lineto stroke
+newpath 163.31343 -56.57567 moveto
+162.73013 -57.58597 lineto stroke
+newpath 162.73013 -57.58597 moveto
+162.14684 -56.57567 lineto stroke
+newpath 162.14684 -56.57567 moveto
+160.98016 -56.57565 lineto stroke
+newpath 160.98016 -56.57565 moveto
+161.5635 -55.5653 lineto stroke
+newpath 161.5635 -55.5653 moveto
+160.98021 -54.55501 lineto stroke
+newpath 160.98021 -54.55501 moveto
+159.81366 -54.55501 lineto stroke
+newpath 159.81366 -54.55501 moveto
+159.23036 -55.56529 lineto stroke
+newpath 159.23036 -55.56529 moveto
+158.64708 -54.55501 lineto stroke
+newpath 158.64708 -54.55501 moveto
+157.48053 -54.55501 lineto stroke
+newpath 157.48053 -54.55501 moveto
+156.8973 -55.56522 lineto stroke
+newpath 156.8973 -55.56522 moveto
+157.48056 -56.57549 lineto stroke
+newpath 157.48056 -56.57549 moveto
+156.31401 -56.57547 lineto stroke
+newpath 156.31401 -56.57547 moveto
+155.73077 -57.58568 lineto stroke
+newpath 155.73077 -57.58568 moveto
+156.31404 -58.59593 lineto stroke
+newpath 156.31404 -58.59593 moveto
+157.48065 -58.59592 lineto stroke
+newpath 157.48065 -58.59592 moveto
+156.89735 -59.60623 lineto stroke
+newpath 156.89735 -59.60623 moveto
+157.48062 -60.61649 lineto stroke
+newpath 157.48062 -60.61649 moveto
+156.31407 -60.61649 lineto stroke
+newpath 156.31407 -60.61649 moveto
+155.73079 -61.62679 lineto stroke
+newpath 155.73079 -61.62679 moveto
+155.14749 -60.6165 lineto stroke
+newpath 155.14749 -60.6165 moveto
+153.98094 -60.6165 lineto stroke
+newpath 153.98094 -60.6165 moveto
+153.3977 -61.62671 lineto stroke
+newpath 153.3977 -61.62671 moveto
+153.98097 -62.63698 lineto stroke
+newpath 153.98097 -62.63698 moveto
+152.81442 -62.63696 lineto stroke
+newpath 152.81442 -62.63696 moveto
+152.23119 -63.64717 lineto stroke
+newpath 152.23119 -63.64717 moveto
+152.81445 -64.65742 lineto stroke
+newpath 152.81445 -64.65742 moveto
+153.98106 -64.65741 lineto stroke
+newpath 153.98106 -64.65741 moveto
+153.39777 -65.66772 lineto stroke
+newpath 153.39777 -65.66772 moveto
+153.98103 -66.67798 lineto stroke
+newpath 153.98103 -66.67798 moveto
+155.14763 -66.67798 lineto stroke
+newpath 155.14763 -66.67798 moveto
+155.73097 -65.66763 lineto stroke
+newpath 155.73097 -65.66763 moveto
+156.31429 -66.678 lineto stroke
+newpath 156.31429 -66.678 moveto
+157.48088 -66.678 lineto stroke
+newpath 157.48088 -66.678 moveto
+156.89758 -67.6883 lineto stroke
+newpath 156.89758 -67.6883 moveto
+157.4809 -68.69865 lineto stroke
+newpath 157.4809 -68.69865 moveto
+156.31424 -68.69864 lineto stroke
+newpath 156.31424 -68.69864 moveto
+155.73094 -69.70894 lineto stroke
+newpath 155.73094 -69.70894 moveto
+156.31421 -70.7192 lineto stroke
+newpath 156.31421 -70.7192 moveto
+157.48082 -70.71918 lineto stroke
+newpath 157.48082 -70.71918 moveto
+156.89752 -71.72949 lineto stroke
+newpath 156.89752 -71.72949 moveto
+157.48079 -72.73975 lineto stroke
+newpath 157.48079 -72.73975 moveto
+156.31424 -72.73975 lineto stroke
+newpath 156.31424 -72.73975 moveto
+155.73094 -73.75003 lineto stroke
+newpath 155.73094 -73.75003 moveto
+155.14766 -72.73975 lineto stroke
+newpath 155.14766 -72.73975 moveto
+153.98111 -72.73975 lineto stroke
+newpath 153.98111 -72.73975 moveto
+153.39781 -73.75005 lineto stroke
+newpath 153.39781 -73.75005 moveto
+153.98111 -74.7604 lineto stroke
+newpath 153.98111 -74.7604 moveto
+152.81447 -74.76038 lineto stroke
+newpath 152.81447 -74.76038 moveto
+152.23117 -75.77068 lineto stroke
+newpath 152.23117 -75.77068 moveto
+151.64789 -74.76038 lineto stroke
+newpath 151.64789 -74.76038 moveto
+150.48123 -74.76038 lineto stroke
+newpath 150.48123 -74.76038 moveto
+151.06456 -73.75003 lineto stroke
+newpath 151.06456 -73.75003 moveto
+150.48128 -72.73973 lineto stroke
+newpath 150.48128 -72.73973 moveto
+149.31473 -72.73973 lineto stroke
+newpath 149.31473 -72.73973 moveto
+148.73143 -73.75002 lineto stroke
+newpath 148.73143 -73.75002 moveto
+148.14815 -72.73973 lineto stroke
+newpath 148.14815 -72.73973 moveto
+146.9816 -72.73973 lineto stroke
+newpath 146.9816 -72.73973 moveto
+146.39836 -73.74994 lineto stroke
+newpath 146.39836 -73.74994 moveto
+146.98163 -74.76021 lineto stroke
+newpath 146.98163 -74.76021 moveto
+145.81508 -74.7602 lineto stroke
+newpath 145.81508 -74.7602 moveto
+145.23184 -75.7704 lineto stroke
+newpath 145.23184 -75.7704 moveto
+145.81511 -76.78065 lineto stroke
+newpath 145.81511 -76.78065 moveto
+146.98172 -76.78064 lineto stroke
+newpath 146.98172 -76.78064 moveto
+146.39842 -77.79095 lineto stroke
+newpath 146.39842 -77.79095 moveto
+146.98169 -78.80121 lineto stroke
+newpath 146.98169 -78.80121 moveto
+145.81514 -78.80121 lineto stroke
+newpath 145.81514 -78.80121 moveto
+145.23186 -79.81151 lineto stroke
+newpath 145.23186 -79.81151 moveto
+144.64856 -78.80122 lineto stroke
+newpath 144.64856 -78.80122 moveto
+143.48201 -78.80122 lineto stroke
+newpath 143.48201 -78.80122 moveto
+142.89877 -79.81143 lineto stroke
+newpath 142.89877 -79.81143 moveto
+143.48204 -80.8217 lineto stroke
+newpath 143.48204 -80.8217 moveto
+142.31549 -80.82169 lineto stroke
+newpath 142.31549 -80.82169 moveto
+141.73225 -81.8319 lineto stroke
+newpath 141.73225 -81.8319 moveto
+141.14902 -80.82169 lineto stroke
+newpath 141.14902 -80.82169 moveto
+139.98247 -80.8217 lineto stroke
+newpath 139.98247 -80.8217 moveto
+140.56573 -79.81143 lineto stroke
+newpath 140.56573 -79.81143 moveto
+139.9825 -78.80122 lineto stroke
+newpath 139.9825 -78.80122 moveto
+138.81595 -78.80122 lineto stroke
+newpath 138.81595 -78.80122 moveto
+138.23264 -79.81151 lineto stroke
+newpath 138.23264 -79.81151 moveto
+137.64935 -78.80121 lineto stroke
+newpath 137.64935 -78.80121 moveto
+136.4828 -78.80121 lineto stroke
+newpath 136.4828 -78.80121 moveto
+137.06609 -77.79095 lineto stroke
+newpath 137.06609 -77.79095 moveto
+136.48279 -76.78064 lineto stroke
+newpath 136.48279 -76.78064 moveto
+137.64938 -76.78065 lineto stroke
+newpath 137.64938 -76.78065 moveto
+138.23267 -75.7704 lineto stroke
+newpath 138.23267 -75.7704 moveto
+137.64943 -74.7602 lineto stroke
+newpath 137.64943 -74.7602 moveto
+136.48288 -74.76021 lineto stroke
+newpath 136.48288 -74.76021 moveto
+137.06615 -73.74994 lineto stroke
+newpath 137.06615 -73.74994 moveto
+136.48291 -72.73973 lineto stroke
+newpath 136.48291 -72.73973 moveto
+135.31636 -72.73973 lineto stroke
+newpath 135.31636 -72.73973 moveto
+134.73306 -73.75002 lineto stroke
+newpath 134.73306 -73.75002 moveto
+134.14978 -72.73973 lineto stroke
+newpath 134.14978 -72.73973 moveto
+132.98323 -72.73973 lineto stroke
+newpath 132.98323 -72.73973 moveto
+132.39993 -73.75005 lineto stroke
+newpath 132.39993 -73.75005 moveto
+132.98326 -74.76039 lineto stroke
+newpath 132.98326 -74.76039 moveto
+131.81662 -74.76039 lineto stroke
+newpath 131.81662 -74.76039 moveto
+131.23332 -75.7707 lineto stroke
+newpath 131.23332 -75.7707 moveto
+130.65002 -74.7604 lineto stroke
+newpath 130.65002 -74.7604 moveto
+129.48335 -74.7604 lineto stroke
+newpath 129.48335 -74.7604 moveto
+130.06668 -73.75005 lineto stroke
+newpath 130.06668 -73.75005 moveto
+129.48338 -72.73975 lineto stroke
+newpath 129.48338 -72.73975 moveto
+128.31683 -72.73975 lineto stroke
+newpath 128.31683 -72.73975 moveto
+127.73354 -73.75003 lineto stroke
+newpath 127.73354 -73.75003 moveto
+127.15025 -72.73975 lineto stroke
+newpath 127.15025 -72.73975 moveto
+125.9837 -72.73975 lineto stroke
+newpath 125.9837 -72.73975 moveto
+126.56697 -71.72949 lineto stroke
+newpath 126.56697 -71.72949 moveto
+125.98367 -70.71916 lineto stroke
+newpath 125.98367 -70.71916 moveto
+127.15028 -70.7192 lineto stroke
+newpath 127.15028 -70.7192 moveto
+127.73355 -69.70894 lineto stroke
+newpath 127.73355 -69.70894 moveto
+127.15025 -68.69862 lineto stroke
+newpath 127.15025 -68.69862 moveto
+125.9836 -68.69862 lineto stroke
+newpath 125.9836 -68.69862 moveto
+126.56693 -67.68828 lineto stroke
+newpath 126.56693 -67.68828 moveto
+125.98363 -66.67796 lineto stroke
+newpath 125.98363 -66.67796 moveto
+127.15022 -66.67796 lineto stroke
+newpath 127.15022 -66.67796 moveto
+127.73357 -65.66762 lineto stroke
+newpath 127.73357 -65.66762 moveto
+128.31688 -66.67798 lineto stroke
+newpath 128.31688 -66.67798 moveto
+129.48347 -66.67798 lineto stroke
+newpath 129.48347 -66.67798 moveto
+130.06674 -65.66772 lineto stroke
+newpath 130.06674 -65.66772 moveto
+129.48344 -64.6574 lineto stroke
+newpath 129.48344 -64.6574 moveto
+130.65005 -64.65742 lineto stroke
+newpath 130.65005 -64.65742 moveto
+131.23332 -63.64717 lineto stroke
+newpath 131.23332 -63.64717 moveto
+130.65009 -62.63696 lineto stroke
+newpath 130.65009 -62.63696 moveto
+129.48354 -62.63698 lineto stroke
+newpath 129.48354 -62.63698 moveto
+130.0668 -61.62671 lineto stroke
+newpath 130.0668 -61.62671 moveto
+129.48357 -60.6165 lineto stroke
+newpath 129.48357 -60.6165 moveto
+128.31702 -60.6165 lineto stroke
+newpath 128.31702 -60.6165 moveto
+127.7337 -61.62679 lineto stroke
+newpath 127.7337 -61.62679 moveto
+127.15042 -60.61649 lineto stroke
+newpath 127.15042 -60.61649 moveto
+125.98387 -60.61649 lineto stroke
+newpath 125.98387 -60.61649 moveto
+126.56715 -59.60623 lineto stroke
+newpath 126.56715 -59.60623 moveto
+125.98386 -58.59592 lineto stroke
+newpath 125.98386 -58.59592 moveto
+127.15045 -58.59593 lineto stroke
+newpath 127.15045 -58.59593 moveto
+127.73373 -57.58568 lineto stroke
+newpath 127.73373 -57.58568 moveto
+127.1505 -56.57547 lineto stroke
+newpath 127.1505 -56.57547 moveto
+125.98395 -56.57549 lineto stroke
+newpath 125.98395 -56.57549 moveto
+126.56721 -55.56522 lineto stroke
+newpath 126.56721 -55.56522 moveto
+125.98398 -54.55501 lineto stroke
+newpath 125.98398 -54.55501 moveto
+124.81743 -54.55501 lineto stroke
+newpath 124.81743 -54.55501 moveto
+124.23413 -55.56529 lineto stroke
+newpath 124.23413 -55.56529 moveto
+123.65085 -54.55501 lineto stroke
+newpath 123.65085 -54.55501 moveto
+122.4843 -54.55501 lineto stroke
+newpath 122.4843 -54.55501 moveto
+121.901 -55.5653 lineto stroke
+newpath 121.901 -55.5653 moveto
+122.48433 -56.57567 lineto stroke
+newpath 122.48433 -56.57567 moveto
+121.31767 -56.57567 lineto stroke
+newpath 121.31767 -56.57567 moveto
+120.73438 -57.58597 lineto stroke
+newpath 120.73438 -57.58597 moveto
+120.15108 -56.57567 lineto stroke
+newpath 120.15108 -56.57567 moveto
+118.9844 -56.57565 lineto stroke
+newpath 118.9844 -56.57565 moveto
+119.56775 -55.5653 lineto stroke
+newpath 119.56775 -55.5653 moveto
+118.98445 -54.55501 lineto stroke
+newpath 118.98445 -54.55501 moveto
+117.8179 -54.55501 lineto stroke
+newpath 117.8179 -54.55501 moveto
+117.2346 -55.56529 lineto stroke
+newpath 117.2346 -55.56529 moveto
+116.65132 -54.55501 lineto stroke
+newpath 116.65132 -54.55501 moveto
+115.48477 -54.55501 lineto stroke
+newpath 115.48477 -54.55501 moveto
+114.90147 -55.5653 lineto stroke
+newpath 114.90147 -55.5653 moveto
+115.4848 -56.57567 lineto stroke
+newpath 115.4848 -56.57567 moveto
+114.31815 -56.57567 lineto stroke
+newpath 114.31815 -56.57567 moveto
+113.73485 -57.58597 lineto stroke
+newpath 113.73485 -57.58597 moveto
+114.31818 -58.59633 lineto stroke
+newpath 114.31818 -58.59633 moveto
+115.48488 -58.59634 lineto stroke
+newpath 115.48488 -58.59634 moveto
+114.90152 -59.60672 lineto stroke
+newpath 114.90152 -59.60672 moveto
+115.48485 -60.61708 lineto stroke
+newpath 115.48485 -60.61708 moveto
+114.31819 -60.61708 lineto stroke
+newpath 114.31819 -60.61708 moveto
+113.73482 -61.62746 lineto stroke
+newpath 113.73482 -61.62746 moveto
+113.15149 -60.61707 lineto stroke
+newpath 113.15149 -60.61707 moveto
+111.98483 -60.61707 lineto stroke
+newpath 111.98483 -60.61707 moveto
+111.40154 -61.62737 lineto stroke
+newpath 111.40154 -61.62737 moveto
+111.98486 -62.63773 lineto stroke
+newpath 111.98486 -62.63773 moveto
+110.8182 -62.63773 lineto stroke
+newpath 110.8182 -62.63773 moveto
+110.23491 -63.64803 lineto stroke
+newpath 110.23491 -63.64803 moveto
+109.65161 -62.63773 lineto stroke
+newpath 109.65161 -62.63773 moveto
+108.48494 -62.63771 lineto stroke
+newpath 108.48494 -62.63771 moveto
+109.06828 -61.62737 lineto stroke
+newpath 109.06828 -61.62737 moveto
+108.48499 -60.61707 lineto stroke
+newpath 108.48499 -60.61707 moveto
+107.31833 -60.61705 lineto stroke
+newpath 107.31833 -60.61705 moveto
+106.73497 -61.62746 lineto stroke
+newpath 106.73497 -61.62746 moveto
+106.15161 -60.61705 lineto stroke
+newpath 106.15161 -60.61705 moveto
+104.98495 -60.61703 lineto stroke
+newpath 104.98495 -60.61703 moveto
+105.5683 -59.60669 lineto stroke
+newpath 105.5683 -59.60669 moveto
+104.98495 -58.59628 lineto stroke
+newpath 104.98495 -58.59628 moveto
+106.15166 -58.5963 lineto stroke
+newpath 106.15166 -58.5963 moveto
+106.735 -57.58595 lineto stroke
+newpath 106.735 -57.58595 moveto
+106.1517 -56.57565 lineto stroke
+newpath 106.1517 -56.57565 moveto
+104.98503 -56.57564 lineto stroke
+newpath 104.98503 -56.57564 moveto
+105.56837 -55.56529 lineto stroke
+newpath 105.56837 -55.56529 moveto
+104.98508 -54.555 lineto stroke
+newpath 104.98508 -54.555 moveto
+103.81853 -54.555 lineto stroke
+newpath 103.81853 -54.555 moveto
+103.23523 -55.56528 lineto stroke
+newpath 103.23523 -55.56528 moveto
+102.65195 -54.555 lineto stroke
+newpath 102.65195 -54.555 moveto
+101.4854 -54.555 lineto stroke
+newpath 101.4854 -54.555 moveto
+100.9021 -55.56529 lineto stroke
+newpath 100.9021 -55.56529 moveto
+101.48543 -56.57565 lineto stroke
+newpath 101.48543 -56.57565 moveto
+100.31877 -56.57565 lineto stroke
+newpath 100.31877 -56.57565 moveto
+99.73547 -57.58595 lineto stroke
+newpath 99.73547 -57.58595 moveto
+99.15218 -56.57565 lineto stroke
+newpath 99.15218 -56.57565 moveto
+97.9855 -56.57564 lineto stroke
+newpath 97.9855 -56.57564 moveto
+98.56885 -55.56529 lineto stroke
+newpath 98.56885 -55.56529 moveto
+97.98555 -54.555 lineto stroke
+newpath 97.98555 -54.555 moveto
+96.819 -54.555 lineto stroke
+newpath 96.819 -54.555 moveto
+96.2357 -55.56528 lineto stroke
+newpath 96.2357 -55.56528 moveto
+95.65242 -54.555 lineto stroke
+newpath 95.65242 -54.555 moveto
+94.48587 -54.555 lineto stroke
+newpath 94.48587 -54.555 moveto
+95.06914 -53.54474 lineto stroke
+newpath 95.06914 -53.54474 moveto
+94.48584 -52.53441 lineto stroke
+newpath 94.48584 -52.53441 moveto
+95.65245 -52.53444 lineto stroke
+newpath 95.65245 -52.53444 moveto
+96.23572 -51.52419 lineto stroke
+newpath 96.23572 -51.52419 moveto
+95.65242 -50.51387 lineto stroke
+newpath 95.65242 -50.51387 moveto
+94.48578 -50.51387 lineto stroke
+newpath 94.48578 -50.51387 moveto
+95.0691 -49.50352 lineto stroke
+newpath 95.0691 -49.50352 moveto
+94.48581 -48.49321 lineto stroke
+newpath 94.48581 -48.49321 moveto
+95.6524 -48.49323 lineto stroke
+newpath 95.6524 -48.49323 moveto
+96.23573 -47.48286 lineto stroke
+newpath 96.23573 -47.48286 moveto
+96.81906 -48.49323 lineto stroke
+newpath 96.81906 -48.49323 moveto
+97.98566 -48.49324 lineto stroke
+newpath 97.98566 -48.49324 moveto
+98.56892 -47.48299 lineto stroke
+newpath 98.56892 -47.48299 moveto
+97.98563 -46.47266 lineto stroke
+newpath 97.98563 -46.47266 moveto
+99.15224 -46.47269 lineto stroke
+newpath 99.15224 -46.47269 moveto
+99.7355 -45.46243 lineto stroke
+newpath 99.7355 -45.46243 moveto
+99.1522 -44.45213 lineto stroke
+newpath 99.1522 -44.45213 moveto
+97.98553 -44.45212 lineto stroke
+newpath 97.98553 -44.45212 moveto
+98.56888 -43.44177 lineto stroke
+newpath 98.56888 -43.44177 moveto
+97.98558 -42.43147 lineto stroke
+newpath 97.98558 -42.43147 moveto
+96.81892 -42.43147 lineto stroke
+newpath 96.81892 -42.43147 moveto
+96.23557 -43.44186 lineto stroke
+newpath 96.23557 -43.44186 moveto
+95.65222 -42.43147 lineto stroke
+newpath 95.65222 -42.43147 moveto
+94.48557 -42.43147 lineto stroke
+newpath 94.48557 -42.43147 moveto
+95.0689 -41.42113 lineto stroke
+newpath 95.0689 -41.42113 moveto
+94.48553 -40.41072 lineto stroke
+newpath 94.48553 -40.41072 moveto
+95.65225 -40.41072 lineto stroke
+newpath 95.65225 -40.41072 moveto
+96.23558 -39.40038 lineto stroke
+newpath 96.23558 -39.40038 moveto
+95.65228 -38.39008 lineto stroke
+newpath 95.65228 -38.39008 moveto
+94.48561 -38.39006 lineto stroke
+newpath 94.48561 -38.39006 moveto
+95.06895 -37.37971 lineto stroke
+newpath 95.06895 -37.37971 moveto
+94.48566 -36.36942 lineto stroke
+newpath 94.48566 -36.36942 moveto
+95.65225 -36.36942 lineto stroke
+newpath 95.65225 -36.36942 moveto
+96.2356 -35.35907 lineto stroke
+newpath 96.2356 -35.35907 moveto
+96.81891 -36.36943 lineto stroke
+newpath 96.81891 -36.36943 moveto
+97.9855 -36.36943 lineto stroke
+newpath 97.9855 -36.36943 moveto
+98.56883 -35.35907 lineto stroke
+newpath 98.56883 -35.35907 moveto
+97.98549 -34.34866 lineto stroke
+newpath 97.98549 -34.34866 moveto
+99.15219 -34.34868 lineto stroke
+newpath 99.15219 -34.34868 moveto
+99.73552 -33.33832 lineto stroke
+newpath 99.73552 -33.33832 moveto
+100.31885 -34.34868 lineto stroke
+newpath 100.31885 -34.34868 moveto
+101.48555 -34.3487 lineto stroke
+newpath 101.48555 -34.3487 moveto
+100.90219 -35.35907 lineto stroke
+newpath 100.90219 -35.35907 moveto
+101.48552 -36.36943 lineto stroke
+newpath 101.48552 -36.36943 moveto
+102.65211 -36.36943 lineto stroke
+newpath 102.65211 -36.36943 moveto
+103.23546 -35.35909 lineto stroke
+newpath 103.23546 -35.35909 moveto
+103.81877 -36.36945 lineto stroke
+newpath 103.81877 -36.36945 moveto
+104.98537 -36.36945 lineto stroke
+newpath 104.98537 -36.36945 moveto
+105.56863 -35.35919 lineto stroke
+newpath 105.56863 -35.35919 moveto
+104.98534 -34.34886 lineto stroke
+newpath 104.98534 -34.34886 moveto
+106.15195 -34.34889 lineto stroke
+newpath 106.15195 -34.34889 moveto
+106.73521 -33.33864 lineto stroke
+newpath 106.73521 -33.33864 moveto
+106.15192 -32.32832 lineto stroke
+newpath 106.15192 -32.32832 moveto
+104.98528 -32.32832 lineto stroke
+newpath 104.98528 -32.32832 moveto
+105.5686 -31.31798 lineto stroke
+newpath 105.5686 -31.31798 moveto
+104.9853 -30.30766 lineto stroke
+newpath 104.9853 -30.30766 moveto
+106.1519 -30.30768 lineto stroke
+newpath 106.1519 -30.30768 moveto
+106.73523 -29.29732 lineto stroke
+newpath 106.73523 -29.29732 moveto
+107.31856 -30.30768 lineto stroke
+newpath 107.31856 -30.30768 moveto
+108.48515 -30.3077 lineto stroke
+newpath 108.48515 -30.3077 moveto
+109.06842 -29.29744 lineto stroke
+newpath 109.06842 -29.29744 moveto
+108.48512 -28.28711 lineto stroke
+newpath 108.48512 -28.28711 moveto
+109.65173 -28.28714 lineto stroke
+newpath 109.65173 -28.28714 moveto
+110.235 -27.27689 lineto stroke
+newpath 110.235 -27.27689 moveto
+109.65176 -26.26668 lineto stroke
+newpath 109.65176 -26.26668 moveto
+108.48521 -26.2667 lineto stroke
+newpath 108.48521 -26.2667 moveto
+109.06848 -25.25642 lineto stroke
+newpath 109.06848 -25.25642 moveto
+108.48524 -24.24622 lineto stroke
+newpath 108.48524 -24.24622 moveto
+107.3187 -24.24622 lineto stroke
+newpath 107.3187 -24.24622 moveto
+106.73538 -25.2565 lineto stroke
+newpath 106.73538 -25.2565 moveto
+106.1521 -24.2462 lineto stroke
+newpath 106.1521 -24.2462 moveto
+104.98555 -24.2462 lineto stroke
+newpath 104.98555 -24.2462 moveto
+105.56883 -23.23595 lineto stroke
+newpath 105.56883 -23.23595 moveto
+104.98553 -22.22563 lineto stroke
+newpath 104.98553 -22.22563 moveto
+106.15213 -22.22565 lineto stroke
+newpath 106.15213 -22.22565 moveto
+106.73541 -21.2154 lineto stroke
+newpath 106.73541 -21.2154 moveto
+106.15218 -20.20518 lineto stroke
+newpath 106.15218 -20.20518 moveto
+104.98563 -20.2052 lineto stroke
+newpath 104.98563 -20.2052 moveto
+105.5689 -19.19493 lineto stroke
+newpath 105.5689 -19.19493 moveto
+104.98566 -18.18472 lineto stroke
+newpath 104.98566 -18.18472 moveto
+103.8191 -18.18472 lineto stroke
+newpath 103.8191 -18.18472 moveto
+103.23581 -19.195 lineto stroke
+newpath 103.23581 -19.195 moveto
+102.65253 -18.18472 lineto stroke
+newpath 102.65253 -18.18472 moveto
+101.48598 -18.18472 lineto stroke
+newpath 101.48598 -18.18472 moveto
+100.90268 -19.19504 lineto stroke
+newpath 100.90268 -19.19504 moveto
+101.48601 -20.20538 lineto stroke
+newpath 101.48601 -20.20538 moveto
+100.31937 -20.20538 lineto stroke
+newpath 100.31937 -20.20538 moveto
+99.73607 -21.2157 lineto stroke
+newpath 99.73607 -21.2157 moveto
+99.15277 -20.2054 lineto stroke
+newpath 99.15277 -20.2054 moveto
+97.9861 -20.2054 lineto stroke
+newpath 97.9861 -20.2054 moveto
+98.56943 -19.19504 lineto stroke
+newpath 98.56943 -19.19504 moveto
+97.98613 -18.18474 lineto stroke
+newpath 97.98613 -18.18474 moveto
+96.81958 -18.18474 lineto stroke
+newpath 96.81958 -18.18474 moveto
+96.23628 -19.19502 lineto stroke
+newpath 96.23628 -19.19502 moveto
+95.653 -18.18474 lineto stroke
+newpath 95.653 -18.18474 moveto
+94.48645 -18.18474 lineto stroke
+newpath 94.48645 -18.18474 moveto
+95.06972 -17.17448 lineto stroke
+newpath 95.06972 -17.17448 moveto
+94.48642 -16.16415 lineto stroke
+newpath 94.48642 -16.16415 moveto
+95.65303 -16.16418 lineto stroke
+newpath 95.65303 -16.16418 moveto
+96.2363 -15.15393 lineto stroke
+newpath 96.2363 -15.15393 moveto
+95.653 -14.14362 lineto stroke
+newpath 95.653 -14.14362 moveto
+94.48634 -14.14362 lineto stroke
+newpath 94.48634 -14.14362 moveto
+95.06967 -13.13327 lineto stroke
+newpath 95.06967 -13.13327 moveto
+94.48637 -12.12296 lineto stroke
+newpath 94.48637 -12.12296 moveto
+95.65297 -12.12296 lineto stroke
+newpath 95.65297 -12.12296 moveto
+96.23631 -11.11261 lineto stroke
+newpath 96.23631 -11.11261 moveto
+96.81963 -12.12297 lineto stroke
+newpath 96.81963 -12.12297 moveto
+97.98622 -12.12297 lineto stroke
+newpath 97.98622 -12.12297 moveto
+98.56949 -11.11272 lineto stroke
+newpath 98.56949 -11.11272 moveto
+97.98619 -10.10239 lineto stroke
+newpath 97.98619 -10.10239 moveto
+99.1528 -10.10242 lineto stroke
+newpath 99.1528 -10.10242 moveto
+99.73607 -9.09216 lineto stroke
+newpath 99.73607 -9.09216 moveto
+99.15283 -8.08195 lineto stroke
+newpath 99.15283 -8.08195 moveto
+97.98628 -8.08197 lineto stroke
+newpath 97.98628 -8.08197 moveto
+98.56955 -7.0717 lineto stroke
+newpath 98.56955 -7.0717 moveto
+97.98631 -6.0615 lineto stroke
+newpath 97.98631 -6.0615 moveto
+96.81976 -6.0615 lineto stroke
+newpath 96.81976 -6.0615 moveto
+96.23645 -7.07178 lineto stroke
+newpath 96.23645 -7.07178 moveto
+95.65317 -6.06148 lineto stroke
+newpath 95.65317 -6.06148 moveto
+94.48662 -6.06148 lineto stroke
+newpath 94.48662 -6.06148 moveto
+95.0699 -5.05122 lineto stroke
+newpath 95.0699 -5.05122 moveto
+94.4866 -4.04091 lineto stroke
+newpath 94.4866 -4.04091 moveto
+95.6532 -4.04092 lineto stroke
+newpath 95.6532 -4.04092 moveto
+96.23648 -3.03067 lineto stroke
+newpath 96.23648 -3.03067 moveto
+95.65324 -2.02046 lineto stroke
+newpath 95.65324 -2.02046 moveto
+94.4867 -2.02048 lineto stroke
+newpath 94.4867 -2.02048 moveto
+95.06996 -1.01021 lineto stroke
+newpath 95.06996 -1.01021 moveto
+94.48672 0 lineto stroke
+newpath 94.48672 0 moveto
+93.32028 0 lineto stroke
+newpath 93.32028 0 moveto
+92.73705 -1.0102 lineto stroke
+newpath 92.73705 -1.0102 moveto
+92.15381 0 lineto stroke
+newpath 92.15381 0 moveto
+90.98737 0 lineto stroke
+newpath 90.98737 0 moveto
+90.40413 -1.01021 lineto stroke
+newpath 90.40413 -1.01021 moveto
+90.98738 -2.02048 lineto stroke
+newpath 90.98738 -2.02048 moveto
+89.82085 -2.02045 lineto stroke
+newpath 89.82085 -2.02045 moveto
+89.23761 -3.03065 lineto stroke
+newpath 89.23761 -3.03065 moveto
+88.65437 -2.02045 lineto stroke
+newpath 88.65437 -2.02045 moveto
+87.48784 -2.02045 lineto stroke
+newpath 87.48784 -2.02045 moveto
+88.0711 -1.01021 lineto stroke
+newpath 88.0711 -1.01021 moveto
+87.48787 0 lineto stroke
+newpath 87.48787 0 moveto
+86.32143 0 lineto stroke
+newpath 86.32143 0 moveto
+85.73819 -1.0102 lineto stroke
+newpath 85.73819 -1.0102 moveto
+85.15495 0 lineto stroke
+newpath 85.15495 0 moveto
+83.98851 0 lineto stroke
+newpath 83.98851 0 moveto
+83.40527 -1.01021 lineto stroke
+newpath 83.40527 -1.01021 moveto
+83.98854 -2.02048 lineto stroke
+newpath 83.98854 -2.02048 moveto
+82.82199 -2.02046 lineto stroke
+newpath 82.82199 -2.02046 moveto
+82.23875 -3.03067 lineto stroke
+newpath 82.23875 -3.03067 moveto
+82.82202 -4.04092 lineto stroke
+newpath 82.82202 -4.04092 moveto
+83.98863 -4.04091 lineto stroke
+newpath 83.98863 -4.04091 moveto
+83.40533 -5.05122 lineto stroke
+newpath 83.40533 -5.05122 moveto
+83.9886 -6.06148 lineto stroke
+newpath 83.9886 -6.06148 moveto
+82.82205 -6.06148 lineto stroke
+newpath 82.82205 -6.06148 moveto
+82.23875 -7.07176 lineto stroke
+newpath 82.23875 -7.07176 moveto
+81.65547 -6.06148 lineto stroke
+newpath 81.65547 -6.06148 moveto
+80.48892 -6.06148 lineto stroke
+newpath 80.48892 -6.06148 moveto
+79.90569 -7.07169 lineto stroke
+newpath 79.90569 -7.07169 moveto
+80.48895 -8.08195 lineto stroke
+newpath 80.48895 -8.08195 moveto
+79.3224 -8.08194 lineto stroke
+newpath 79.3224 -8.08194 moveto
+78.73917 -9.09215 lineto stroke
+newpath 78.73917 -9.09215 moveto
+78.15593 -8.08194 lineto stroke
+newpath 78.15593 -8.08194 moveto
+76.98938 -8.08195 lineto stroke
+newpath 76.98938 -8.08195 moveto
+77.57265 -7.07169 lineto stroke
+newpath 77.57265 -7.07169 moveto
+76.98941 -6.06148 lineto stroke
+newpath 76.98941 -6.06148 moveto
+75.82286 -6.06148 lineto stroke
+newpath 75.82286 -6.06148 moveto
+75.23955 -7.07175 lineto stroke
+newpath 75.23955 -7.07175 moveto
+74.65628 -6.06146 lineto stroke
+newpath 74.65628 -6.06146 moveto
+73.48973 -6.06146 lineto stroke
+newpath 73.48973 -6.06146 moveto
+74.07301 -5.05121 lineto stroke
+newpath 74.07301 -5.05121 moveto
+73.48973 -4.04091 lineto stroke
+newpath 73.48973 -4.04091 moveto
+74.65631 -4.04092 lineto stroke
+newpath 74.65631 -4.04092 moveto
+75.2396 -3.03067 lineto stroke
+newpath 75.2396 -3.03067 moveto
+74.65636 -2.02046 lineto stroke
+newpath 74.65636 -2.02046 moveto
+73.4898 -2.02048 lineto stroke
+newpath 73.4898 -2.02048 moveto
+74.07307 -1.01021 lineto stroke
+newpath 74.07307 -1.01021 moveto
+73.48984 0 lineto stroke
+newpath 73.48984 0 moveto
+72.3234 0 lineto stroke
+newpath 72.3234 0 moveto
+71.74016 -1.0102 lineto stroke
+newpath 71.74016 -1.0102 moveto
+71.15692 0 lineto stroke
+newpath 71.15692 0 moveto
+69.99048 0 lineto stroke
+newpath 69.99048 0 moveto
+69.40724 -1.01021 lineto stroke
+newpath 69.40724 -1.01021 moveto
+69.9905 -2.02048 lineto stroke
+newpath 69.9905 -2.02048 moveto
+68.82396 -2.02045 lineto stroke
+newpath 68.82396 -2.02045 moveto
+68.24072 -3.03065 lineto stroke
+newpath 68.24072 -3.03065 moveto
+67.65749 -2.02045 lineto stroke
+newpath 67.65749 -2.02045 moveto
+66.49095 -2.02045 lineto stroke
+newpath 66.49095 -2.02045 moveto
+67.07422 -1.01021 lineto stroke
+newpath 67.07422 -1.01021 moveto
+66.49098 0 lineto stroke
+newpath 66.49098 0 moveto
+65.32454 0 lineto stroke
+newpath 65.32454 0 moveto
+64.7413 -1.0102 lineto stroke
+newpath 64.7413 -1.0102 moveto
+64.15807 0 lineto stroke
+newpath 64.15807 0 moveto
+62.99162 0 lineto stroke
+newpath 62.99162 0 moveto
+62.40839 -1.01021 lineto stroke
+newpath 62.40839 -1.01021 moveto
+62.99165 -2.02048 lineto stroke
+newpath 62.99165 -2.02048 moveto
+61.8251 -2.02046 lineto stroke
+newpath 61.8251 -2.02046 moveto
+61.24187 -3.03067 lineto stroke
+newpath 61.24187 -3.03067 moveto
+61.82513 -4.04092 lineto stroke
+newpath 61.82513 -4.04092 moveto
+62.99174 -4.04091 lineto stroke
+newpath 62.99174 -4.04091 moveto
+62.40845 -5.05122 lineto stroke
+newpath 62.40845 -5.05122 moveto
+62.99171 -6.06148 lineto stroke
+newpath 62.99171 -6.06148 moveto
+61.82516 -6.06148 lineto stroke
+newpath 61.82516 -6.06148 moveto
+61.24187 -7.07176 lineto stroke
+newpath 61.24187 -7.07176 moveto
+60.65858 -6.06148 lineto stroke
+newpath 60.65858 -6.06148 moveto
+59.49203 -6.06148 lineto stroke
+newpath 59.49203 -6.06148 moveto
+58.9088 -7.07169 lineto stroke
+newpath 58.9088 -7.07169 moveto
+59.49207 -8.08195 lineto stroke
+newpath 59.49207 -8.08195 moveto
+58.32552 -8.08194 lineto stroke
+newpath 58.32552 -8.08194 moveto
+57.74228 -9.09215 lineto stroke
+newpath 57.74228 -9.09215 moveto
+58.32555 -10.1024 lineto stroke
+newpath 58.32555 -10.1024 moveto
+59.49216 -10.10239 lineto stroke
+newpath 59.49216 -10.10239 moveto
+58.90886 -11.1127 lineto stroke
+newpath 58.90886 -11.1127 moveto
+59.49213 -12.12296 lineto stroke
+newpath 59.49213 -12.12296 moveto
+60.65874 -12.12296 lineto stroke
+newpath 60.65874 -12.12296 moveto
+61.24205 -11.1126 lineto stroke
+newpath 61.24205 -11.1126 moveto
+61.82538 -12.12294 lineto stroke
+newpath 61.82538 -12.12294 moveto
+62.99199 -12.12294 lineto stroke
+newpath 62.99199 -12.12294 moveto
+62.40869 -13.13326 lineto stroke
+newpath 62.40869 -13.13326 moveto
+62.992 -14.1436 lineto stroke
+newpath 62.992 -14.1436 moveto
+61.82536 -14.1436 lineto stroke
+newpath 61.82536 -14.1436 moveto
+61.24207 -15.15392 lineto stroke
+newpath 61.24207 -15.15392 moveto
+61.82533 -16.16417 lineto stroke
+newpath 61.82533 -16.16417 moveto
+62.99194 -16.16415 lineto stroke
+newpath 62.99194 -16.16415 moveto
+62.40865 -17.17447 lineto stroke
+newpath 62.40865 -17.17447 moveto
+62.99191 -18.18472 lineto stroke
+newpath 62.99191 -18.18472 moveto
+61.82536 -18.18472 lineto stroke
+newpath 61.82536 -18.18472 moveto
+61.24207 -19.195 lineto stroke
+newpath 61.24207 -19.195 moveto
+60.65878 -18.18472 lineto stroke
+newpath 60.65878 -18.18472 moveto
+59.49223 -18.18472 lineto stroke
+newpath 59.49223 -18.18472 moveto
+58.90894 -19.19502 lineto stroke
+newpath 58.90894 -19.19502 moveto
+59.49226 -20.20538 lineto stroke
+newpath 59.49226 -20.20538 moveto
+58.3256 -20.20538 lineto stroke
+newpath 58.3256 -20.20538 moveto
+57.74231 -21.21568 lineto stroke
+newpath 57.74231 -21.21568 moveto
+57.15901 -20.20538 lineto stroke
+newpath 57.15901 -20.20538 moveto
+55.99234 -20.20537 lineto stroke
+newpath 55.99234 -20.20537 moveto
+56.57568 -19.19502 lineto stroke
+newpath 56.57568 -19.19502 moveto
+55.99239 -18.18472 lineto stroke
+newpath 55.99239 -18.18472 moveto
+54.82584 -18.18472 lineto stroke
+newpath 54.82584 -18.18472 moveto
+54.24254 -19.195 lineto stroke
+newpath 54.24254 -19.195 moveto
+53.65926 -18.18472 lineto stroke
+newpath 53.65926 -18.18472 moveto
+52.4927 -18.18472 lineto stroke
+newpath 52.4927 -18.18472 moveto
+51.90947 -19.19493 lineto stroke
+newpath 51.90947 -19.19493 moveto
+52.49274 -20.2052 lineto stroke
+newpath 52.49274 -20.2052 moveto
+51.32619 -20.20518 lineto stroke
+newpath 51.32619 -20.20518 moveto
+50.74295 -21.2154 lineto stroke
+newpath 50.74295 -21.2154 moveto
+51.32622 -22.22565 lineto stroke
+newpath 51.32622 -22.22565 moveto
+52.49283 -22.22563 lineto stroke
+newpath 52.49283 -22.22563 moveto
+51.90953 -23.23595 lineto stroke
+newpath 51.90953 -23.23595 moveto
+52.4928 -24.2462 lineto stroke
+newpath 52.4928 -24.2462 moveto
+51.32625 -24.2462 lineto stroke
+newpath 51.32625 -24.2462 moveto
+50.74295 -25.25648 lineto stroke
+newpath 50.74295 -25.25648 moveto
+50.15967 -24.2462 lineto stroke
+newpath 50.15967 -24.2462 moveto
+48.99312 -24.2462 lineto stroke
+newpath 48.99312 -24.2462 moveto
+48.40988 -25.25641 lineto stroke
+newpath 48.40988 -25.25641 moveto
+48.99315 -26.26668 lineto stroke
+newpath 48.99315 -26.26668 moveto
+47.8266 -26.26666 lineto stroke
+newpath 47.8266 -26.26666 moveto
+47.24336 -27.27687 lineto stroke
+newpath 47.24336 -27.27687 moveto
+46.66013 -26.26666 lineto stroke
+newpath 46.66013 -26.26666 moveto
+45.49358 -26.26668 lineto stroke
+newpath 45.49358 -26.26668 moveto
+46.07684 -25.25641 lineto stroke
+newpath 46.07684 -25.25641 moveto
+45.4936 -24.2462 lineto stroke
+newpath 45.4936 -24.2462 moveto
+44.32706 -24.2462 lineto stroke
+newpath 44.32706 -24.2462 moveto
+43.74374 -25.25648 lineto stroke
+newpath 43.74374 -25.25648 moveto
+43.16046 -24.24619 lineto stroke
+newpath 43.16046 -24.24619 moveto
+41.99391 -24.24619 lineto stroke
+newpath 41.99391 -24.24619 moveto
+42.5772 -23.23593 lineto stroke
+newpath 42.5772 -23.23593 moveto
+41.99391 -22.22563 lineto stroke
+newpath 41.99391 -22.22563 moveto
+43.16049 -22.22565 lineto stroke
+newpath 43.16049 -22.22565 moveto
+43.74377 -21.2154 lineto stroke
+newpath 43.74377 -21.2154 moveto
+43.16054 -20.20518 lineto stroke
+newpath 43.16054 -20.20518 moveto
+41.99399 -20.2052 lineto stroke
+newpath 41.99399 -20.2052 moveto
+42.57726 -19.19493 lineto stroke
+newpath 42.57726 -19.19493 moveto
+41.99402 -18.18472 lineto stroke
+newpath 41.99402 -18.18472 moveto
+40.82747 -18.18472 lineto stroke
+newpath 40.82747 -18.18472 moveto
+40.24417 -19.195 lineto stroke
+newpath 40.24417 -19.195 moveto
+39.66089 -18.18472 lineto stroke
+newpath 39.66089 -18.18472 moveto
+38.49434 -18.18472 lineto stroke
+newpath 38.49434 -18.18472 moveto
+37.91104 -19.19502 lineto stroke
+newpath 37.91104 -19.19502 moveto
+38.49435 -20.20538 lineto stroke
+newpath 38.49435 -20.20538 moveto
+37.3277 -20.20537 lineto stroke
+newpath 37.3277 -20.20537 moveto
+36.7444 -21.21567 lineto stroke
+newpath 36.7444 -21.21567 moveto
+36.1611 -20.20537 lineto stroke
+newpath 36.1611 -20.20537 moveto
+34.99445 -20.20535 lineto stroke
+newpath 34.99445 -20.20535 moveto
+35.57779 -19.195 lineto stroke
+newpath 35.57779 -19.195 moveto
+34.99449 -18.18471 lineto stroke
+newpath 34.99449 -18.18471 moveto
+33.82794 -18.18471 lineto stroke
+newpath 33.82794 -18.18471 moveto
+33.24464 -19.19499 lineto stroke
+newpath 33.24464 -19.19499 moveto
+32.66136 -18.18471 lineto stroke
+newpath 32.66136 -18.18471 moveto
+31.49481 -18.18471 lineto stroke
+newpath 31.49481 -18.18471 moveto
+32.07808 -17.17445 lineto stroke
+newpath 32.07808 -17.17445 moveto
+31.49478 -16.16412 lineto stroke
+newpath 31.49478 -16.16412 moveto
+32.66139 -16.16415 lineto stroke
+newpath 32.66139 -16.16415 moveto
+33.24466 -15.1539 lineto stroke
+newpath 33.24466 -15.1539 moveto
+32.66136 -14.14359 lineto stroke
+newpath 32.66136 -14.14359 moveto
+31.49472 -14.14359 lineto stroke
+newpath 31.49472 -14.14359 moveto
+32.07805 -13.13324 lineto stroke
+newpath 32.07805 -13.13324 moveto
+31.49475 -12.12292 lineto stroke
+newpath 31.49475 -12.12292 moveto
+32.66135 -12.12294 lineto stroke
+newpath 32.66135 -12.12294 moveto
+33.24467 -11.11258 lineto stroke
+newpath 33.24467 -11.11258 moveto
+33.828 -12.12294 lineto stroke
+newpath 33.828 -12.12294 moveto
+34.9946 -12.12296 lineto stroke
+newpath 34.9946 -12.12296 moveto
+35.57787 -11.1127 lineto stroke
+newpath 35.57787 -11.1127 moveto
+34.99457 -10.10237 lineto stroke
+newpath 34.99457 -10.10237 moveto
+36.16118 -10.1024 lineto stroke
+newpath 36.16118 -10.1024 moveto
+36.74445 -9.09215 lineto stroke
+newpath 36.74445 -9.09215 moveto
+36.16121 -8.08194 lineto stroke
+newpath 36.16121 -8.08194 moveto
+34.99466 -8.08195 lineto stroke
+newpath 34.99466 -8.08195 moveto
+35.57793 -7.07169 lineto stroke
+newpath 35.57793 -7.07169 moveto
+34.99469 -6.06148 lineto stroke
+newpath 34.99469 -6.06148 moveto
+33.82814 -6.06148 lineto stroke
+newpath 33.82814 -6.06148 moveto
+33.24483 -7.07176 lineto stroke
+newpath 33.24483 -7.07176 moveto
+32.66154 -6.06146 lineto stroke
+newpath 32.66154 -6.06146 moveto
+31.495 -6.06146 lineto stroke
+newpath 31.495 -6.06146 moveto
+32.07828 -5.05121 lineto stroke
+newpath 32.07828 -5.05121 moveto
+31.495 -4.04091 lineto stroke
+newpath 31.495 -4.04091 moveto
+32.66158 -4.04092 lineto stroke
+newpath 32.66158 -4.04092 moveto
+33.24486 -3.03067 lineto stroke
+newpath 33.24486 -3.03067 moveto
+32.66162 -2.02046 lineto stroke
+newpath 32.66162 -2.02046 moveto
+31.49507 -2.02048 lineto stroke
+newpath 31.49507 -2.02048 moveto
+32.07834 -1.01021 lineto stroke
+newpath 32.07834 -1.01021 moveto
+31.4951 0 lineto stroke
+newpath 31.4951 0 moveto
+30.32866 0 lineto stroke
+newpath 30.32866 0 moveto
+29.74542 -1.0102 lineto stroke
+newpath 29.74542 -1.0102 moveto
+29.16219 0 lineto stroke
+newpath 29.16219 0 moveto
+27.99574 0 lineto stroke
+newpath 27.99574 0 moveto
+27.4125 -1.01021 lineto stroke
+newpath 27.4125 -1.01021 moveto
+27.99576 -2.02048 lineto stroke
+newpath 27.99576 -2.02048 moveto
+26.82922 -2.02045 lineto stroke
+newpath 26.82922 -2.02045 moveto
+26.24599 -3.03065 lineto stroke
+newpath 26.24599 -3.03065 moveto
+25.66275 -2.02045 lineto stroke
+newpath 25.66275 -2.02045 moveto
+24.49622 -2.02045 lineto stroke
+newpath 24.49622 -2.02045 moveto
+25.07948 -1.01021 lineto stroke
+newpath 25.07948 -1.01021 moveto
+24.49625 0 lineto stroke
+newpath 24.49625 0 moveto
+23.3298 0 lineto stroke
+newpath 23.3298 0 moveto
+22.74657 -1.0102 lineto stroke
+newpath 22.74657 -1.0102 moveto
+22.16333 0 lineto stroke
+newpath 22.16333 0 moveto
+20.99689 0 lineto stroke
+newpath 20.99689 0 moveto
+20.41365 -1.01021 lineto stroke
+newpath 20.41365 -1.01021 moveto
+20.99692 -2.02048 lineto stroke
+newpath 20.99692 -2.02048 moveto
+19.83037 -2.02046 lineto stroke
+newpath 19.83037 -2.02046 moveto
+19.24713 -3.03067 lineto stroke
+newpath 19.24713 -3.03067 moveto
+19.8304 -4.04092 lineto stroke
+newpath 19.8304 -4.04092 moveto
+20.99701 -4.04091 lineto stroke
+newpath 20.99701 -4.04091 moveto
+20.41371 -5.05122 lineto stroke
+newpath 20.41371 -5.05122 moveto
+20.99698 -6.06148 lineto stroke
+newpath 20.99698 -6.06148 moveto
+19.83043 -6.06148 lineto stroke
+newpath 19.83043 -6.06148 moveto
+19.24713 -7.07176 lineto stroke
+newpath 19.24713 -7.07176 moveto
+18.66385 -6.06148 lineto stroke
+newpath 18.66385 -6.06148 moveto
+17.4973 -6.06148 lineto stroke
+newpath 17.4973 -6.06148 moveto
+16.91406 -7.07169 lineto stroke
+newpath 16.91406 -7.07169 moveto
+17.49733 -8.08195 lineto stroke
+newpath 17.49733 -8.08195 moveto
+16.33078 -8.08194 lineto stroke
+newpath 16.33078 -8.08194 moveto
+15.74754 -9.09215 lineto stroke
+newpath 15.74754 -9.09215 moveto
+15.1643 -8.08194 lineto stroke
+newpath 15.1643 -8.08194 moveto
+13.99776 -8.08195 lineto stroke
+newpath 13.99776 -8.08195 moveto
+14.58102 -7.07169 lineto stroke
+newpath 14.58102 -7.07169 moveto
+13.99779 -6.06148 lineto stroke
+newpath 13.99779 -6.06148 moveto
+12.83124 -6.06148 lineto stroke
+newpath 12.83124 -6.06148 moveto
+12.24792 -7.07175 lineto stroke
+newpath 12.24792 -7.07175 moveto
+11.66466 -6.06146 lineto stroke
+newpath 11.66466 -6.06146 moveto
+10.49811 -6.06146 lineto stroke
+newpath 10.49811 -6.06146 moveto
+11.08139 -5.05121 lineto stroke
+newpath 11.08139 -5.05121 moveto
+10.49811 -4.04091 lineto stroke
+newpath 10.49811 -4.04091 moveto
+11.66469 -4.04092 lineto stroke
+newpath 11.66469 -4.04092 moveto
+12.24797 -3.03067 lineto stroke
+newpath 12.24797 -3.03067 moveto
+11.66473 -2.02046 lineto stroke
+newpath 11.66473 -2.02046 moveto
+10.49818 -2.02048 lineto stroke
+newpath 10.49818 -2.02048 moveto
+11.08145 -1.01021 lineto stroke
+newpath 11.08145 -1.01021 moveto
+10.49821 0 lineto stroke
+newpath 10.49821 0 moveto
+9.33177 0 lineto stroke
+newpath 9.33177 0 moveto
+8.74854 -1.0102 lineto stroke
+newpath 8.74854 -1.0102 moveto
+8.1653 0 lineto stroke
+newpath 8.1653 0 moveto
+6.99886 0 lineto stroke
+newpath 6.99886 0 moveto
+6.41562 -1.01021 lineto stroke
+newpath 6.41562 -1.01021 moveto
+6.99887 -2.02048 lineto stroke
+newpath 6.99887 -2.02048 moveto
+5.83234 -2.02045 lineto stroke
+newpath 5.83234 -2.02045 moveto
+5.2491 -3.03065 lineto stroke
+newpath 5.2491 -3.03065 moveto
+4.66586 -2.02045 lineto stroke
+newpath 4.66586 -2.02045 moveto
+3.49933 -2.02045 lineto stroke
+newpath 3.49933 -2.02045 moveto
+4.0826 -1.01021 lineto stroke
+newpath 4.0826 -1.01021 moveto
+3.49936 0 lineto stroke
+newpath 3.49936 0 moveto
+2.33292 0 lineto stroke
+newpath 2.33292 0 moveto
+1.74968 -1.0102 lineto stroke
+newpath 1.74968 -1.0102 moveto
+1.16644 0 lineto stroke
+newpath 1.16644 0 moveto
+0 0 lineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.2 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.2
new file mode 100644
index 0000000000..34106b8e57
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.2
@@ -0,0 +1,1693 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 -1 284 246
+%%HiResBoundingBox: -0.25 -0.25 283.71451 245.73816
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2237
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+2.29616 0 lineto stroke
+newpath 2.29616 0 moveto
+3.8269 1.71147 lineto stroke
+newpath 3.8269 1.71147 moveto
+5.35762 0 lineto stroke
+newpath 5.35762 0 moveto
+7.65378 0 lineto stroke
+newpath 7.65378 0 moveto
+9.18452 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 9.18452 1.71147 moveto
+8.92935 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 8.92935 3.9934 moveto
+11.22548 3.99336 lineto stroke
+newpath 11.22548 3.99336 moveto
+12.75623 5.70483 lineto stroke
+newpath 12.75623 5.70483 moveto
+14.28694 3.99336 lineto stroke
+newpath 14.28694 3.99336 moveto
+16.58305 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 16.58305 3.99333 moveto
+16.32784 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 16.32784 1.71147 moveto
+17.85855 0 lineto stroke
+newpath 17.85855 0 moveto
+20.15471 0 lineto stroke
+newpath 20.15471 0 moveto
+21.68546 1.71147 lineto stroke
+newpath 21.68546 1.71147 moveto
+23.21617 0 lineto stroke
+newpath 23.21617 0 moveto
+25.51233 0 lineto stroke
+newpath 25.51233 0 moveto
+27.04308 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 27.04308 1.71147 moveto
+26.7879 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 26.7879 3.9934 moveto
+29.08403 3.99336 lineto stroke
+newpath 29.08403 3.99336 moveto
+30.61478 5.70483 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 30.61478 5.70483 moveto
+30.3596 7.98676 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 30.3596 7.98676 moveto
+28.48863 9.31781 lineto stroke
+newpath 28.48863 9.31781 moveto
+30.01936 11.02924 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 30.01936 11.02924 moveto
+29.76419 13.31116 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 29.76419 13.31116 moveto
+32.06032 13.31113 lineto stroke
+newpath 32.06032 13.31113 moveto
+33.59105 15.02254 lineto stroke
+newpath 33.59105 15.02254 moveto
+35.12172 13.3111 lineto stroke
+newpath 35.12172 13.3111 moveto
+37.41785 13.31107 lineto stroke
+newpath 37.41785 13.31107 moveto
+38.9486 15.02254 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 38.9486 15.02254 moveto
+38.69342 17.30446 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 38.69342 17.30446 moveto
+40.98955 17.30443 lineto stroke
+newpath 40.98955 17.30443 moveto
+42.5203 19.0159 lineto stroke
+newpath 42.5203 19.0159 moveto
+44.05101 17.30443 lineto stroke
+newpath 44.05101 17.30443 moveto
+46.34712 17.3044 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 46.34712 17.3044 moveto
+46.0919 15.02254 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 46.0919 15.02254 moveto
+47.62262 13.31107 lineto stroke
+newpath 47.62262 13.31107 moveto
+49.91875 13.31104 lineto stroke
+newpath 49.91875 13.31104 moveto
+51.44948 15.02245 lineto stroke
+newpath 51.44948 15.02245 moveto
+52.98015 13.31102 lineto stroke
+newpath 52.98015 13.31102 moveto
+55.27628 13.31099 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 55.27628 13.31099 moveto
+55.02106 11.02911 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 55.02106 11.02911 moveto
+56.55173 9.31767 lineto stroke
+newpath 56.55173 9.31767 moveto
+54.68079 7.98671 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 54.68079 7.98671 moveto
+54.42557 5.70483 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 54.42557 5.70483 moveto
+55.95628 3.99336 lineto stroke
+newpath 55.95628 3.99336 moveto
+58.2524 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 58.2524 3.99333 moveto
+57.99718 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 57.99718 1.71147 moveto
+59.5279 0 lineto stroke
+newpath 59.5279 0 moveto
+61.82405 0 lineto stroke
+newpath 61.82405 0 moveto
+63.3548 1.71147 lineto stroke
+newpath 63.3548 1.71147 moveto
+64.88551 0 lineto stroke
+newpath 64.88551 0 moveto
+67.18167 0 lineto stroke
+newpath 67.18167 0 moveto
+68.71242 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 68.71242 1.71147 moveto
+68.45724 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 68.45724 3.9934 moveto
+70.75337 3.99336 lineto stroke
+newpath 70.75337 3.99336 moveto
+72.28412 5.70483 lineto stroke
+newpath 72.28412 5.70483 moveto
+73.81483 3.99336 lineto stroke
+newpath 73.81483 3.99336 moveto
+76.11095 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 76.11095 3.99333 moveto
+75.85573 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 75.85573 1.71147 moveto
+77.38644 0 lineto stroke
+newpath 77.38644 0 moveto
+79.6826 0 lineto stroke
+newpath 79.6826 0 moveto
+81.21335 1.71147 lineto stroke
+newpath 81.21335 1.71147 moveto
+82.74406 0 lineto stroke
+newpath 82.74406 0 moveto
+85.04022 0 lineto stroke
+newpath 85.04022 0 moveto
+86.57097 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 86.57097 1.71147 moveto
+86.3158 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 86.3158 3.9934 moveto
+88.61191 3.99336 lineto stroke
+newpath 88.61191 3.99336 moveto
+90.14265 5.70483 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 90.14265 5.70483 moveto
+89.88748 7.98676 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 89.88748 7.98676 moveto
+88.01653 9.31781 lineto stroke
+newpath 88.01653 9.31781 moveto
+89.54726 11.02924 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 89.54726 11.02924 moveto
+89.29208 13.31116 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 89.29208 13.31116 moveto
+91.58821 13.31113 lineto stroke
+newpath 91.58821 13.31113 moveto
+93.11894 15.02254 lineto stroke
+newpath 93.11894 15.02254 moveto
+94.64961 13.3111 lineto stroke
+newpath 94.64961 13.3111 moveto
+96.94574 13.31107 lineto stroke
+newpath 96.94574 13.31107 moveto
+98.47649 15.02254 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 98.47649 15.02254 moveto
+98.22131 17.30446 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 98.22131 17.30446 moveto
+100.51743 17.30443 lineto stroke
+newpath 100.51743 17.30443 moveto
+102.04817 19.0159 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 102.04817 19.0159 moveto
+101.793 21.29782 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 101.793 21.29782 moveto
+99.92203 22.62888 lineto stroke
+newpath 99.92203 22.62888 moveto
+101.45276 24.3403 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 101.45276 24.3403 moveto
+101.19759 26.62222 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 101.19759 26.62222 moveto
+99.32661 27.95328 lineto stroke
+newpath 99.32661 27.95328 moveto
+97.0872 27.44609 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 97.0872 27.44609 moveto
+96.83205 29.72798 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 96.83205 29.72798 moveto
+94.96107 31.05904 lineto stroke
+newpath 94.96107 31.05904 moveto
+96.49182 32.77046 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 96.49182 32.77046 moveto
+96.23666 35.05235 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 96.23666 35.05235 moveto
+98.53276 35.0523 lineto stroke
+newpath 98.53276 35.0523 moveto
+100.0635 36.76373 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 100.0635 36.76373 moveto
+99.80833 39.04565 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 99.80833 39.04565 moveto
+97.93736 40.37671 lineto stroke
+newpath 97.93736 40.37671 moveto
+99.4681 42.08813 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 99.4681 42.08813 moveto
+99.21292 44.37006 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 99.21292 44.37006 moveto
+101.50905 44.37003 lineto stroke
+newpath 101.50905 44.37003 moveto
+103.0398 46.08145 lineto stroke
+newpath 103.0398 46.08145 moveto
+104.57047 44.37001 lineto stroke
+newpath 104.57047 44.37001 moveto
+106.8666 44.36998 lineto stroke
+newpath 106.8666 44.36998 moveto
+108.39734 46.0814 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 108.39734 46.0814 moveto
+108.1422 48.36328 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 108.1422 48.36328 moveto
+110.43826 48.36324 lineto stroke
+newpath 110.43826 48.36324 moveto
+111.96901 50.07466 lineto stroke
+newpath 111.96901 50.07466 moveto
+113.49968 48.3632 lineto stroke
+newpath 113.49968 48.3632 moveto
+115.79578 48.36316 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 115.79578 48.36316 moveto
+115.54054 46.08131 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 115.54054 46.08131 moveto
+117.07121 44.36986 lineto stroke
+newpath 117.07121 44.36986 moveto
+119.36734 44.36983 lineto stroke
+newpath 119.36734 44.36983 moveto
+120.89809 46.08125 lineto stroke
+newpath 120.89809 46.08125 moveto
+122.42876 44.36981 lineto stroke
+newpath 122.42876 44.36981 moveto
+124.72488 44.36978 lineto stroke
+newpath 124.72488 44.36978 moveto
+126.25563 46.08125 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 126.25563 46.08125 moveto
+126.00046 48.36317 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 126.00046 48.36317 moveto
+128.29657 48.36314 lineto stroke
+newpath 128.29657 48.36314 moveto
+129.82732 50.07462 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 129.82732 50.07462 moveto
+129.57214 52.35654 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 129.57214 52.35654 moveto
+127.70119 53.68759 lineto stroke
+newpath 127.70119 53.68759 moveto
+129.23192 55.39902 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 129.23192 55.39902 moveto
+128.97675 57.68094 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 128.97675 57.68094 moveto
+131.27287 57.68091 lineto stroke
+newpath 131.27287 57.68091 moveto
+132.8036 59.39232 lineto stroke
+newpath 132.8036 59.39232 moveto
+134.33427 57.68088 lineto stroke
+newpath 134.33427 57.68088 moveto
+136.6304 57.68085 lineto stroke
+newpath 136.6304 57.68085 moveto
+138.16115 59.39232 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 138.16115 59.39232 moveto
+137.90598 61.67424 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 137.90598 61.67424 moveto
+140.20209 61.67421 lineto stroke
+newpath 140.20209 61.67421 moveto
+141.73283 63.38568 lineto stroke
+newpath 141.73283 63.38568 moveto
+143.26355 61.67421 lineto stroke
+newpath 143.26355 61.67421 moveto
+145.55966 61.67418 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 145.55966 61.67418 moveto
+145.30446 59.39232 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 145.30446 59.39232 moveto
+146.83517 57.68085 lineto stroke
+newpath 146.83517 57.68085 moveto
+149.1313 57.68082 lineto stroke
+newpath 149.1313 57.68082 moveto
+150.66203 59.39223 lineto stroke
+newpath 150.66203 59.39223 moveto
+152.1927 57.68079 lineto stroke
+newpath 152.1927 57.68079 moveto
+154.48883 57.68076 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 154.48883 57.68076 moveto
+154.23361 55.3989 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 154.23361 55.3989 moveto
+155.7643 53.68744 lineto stroke
+newpath 155.7643 53.68744 moveto
+153.89333 52.35648 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 153.89333 52.35648 moveto
+153.6381 50.07462 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 153.6381 50.07462 moveto
+155.16882 48.36314 lineto stroke
+newpath 155.16882 48.36314 moveto
+157.46494 48.36311 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 157.46494 48.36311 moveto
+157.20973 46.08125 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 157.20973 46.08125 moveto
+158.74045 44.36978 lineto stroke
+newpath 158.74045 44.36978 moveto
+161.03658 44.36975 lineto stroke
+newpath 161.03658 44.36975 moveto
+162.5673 46.08116 lineto stroke
+newpath 162.5673 46.08116 moveto
+164.09798 44.36974 lineto stroke
+newpath 164.09798 44.36974 moveto
+166.3941 44.3697 lineto stroke
+newpath 166.3941 44.3697 moveto
+167.92485 46.08113 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 167.92485 46.08113 moveto
+167.6697 48.36302 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 167.6697 48.36302 moveto
+169.96579 48.36298 lineto stroke
+newpath 169.96579 48.36298 moveto
+171.49654 50.0744 lineto stroke
+newpath 171.49654 50.0744 moveto
+173.0272 48.36295 lineto stroke
+newpath 173.0272 48.36295 moveto
+175.32332 48.3629 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 175.32332 48.3629 moveto
+175.06807 46.08104 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 175.06807 46.08104 moveto
+176.59874 44.36958 lineto stroke
+newpath 176.59874 44.36958 moveto
+178.89487 44.36955 lineto stroke
+newpath 178.89487 44.36955 moveto
+180.4256 46.08096 lineto stroke
+newpath 180.4256 46.08096 moveto
+181.95627 44.36954 lineto stroke
+newpath 181.95627 44.36954 moveto
+184.2524 44.3695 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 184.2524 44.3695 moveto
+183.99718 42.08763 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 183.99718 42.08763 moveto
+185.52785 40.37619 lineto stroke
+newpath 185.52785 40.37619 moveto
+183.65689 39.04523 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 183.65689 39.04523 moveto
+183.40167 36.76335 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 183.40167 36.76335 moveto
+184.93234 35.0519 lineto stroke
+newpath 184.93234 35.0519 moveto
+187.22844 35.05185 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 187.22844 35.05185 moveto
+186.9732 32.77 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 186.9732 32.77 moveto
+188.50388 31.05855 lineto stroke
+newpath 188.50388 31.05855 moveto
+186.63292 29.72758 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 186.63292 29.72758 moveto
+186.37767 27.44574 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 186.37767 27.44574 moveto
+184.13835 27.95302 lineto stroke
+newpath 184.13835 27.95302 moveto
+182.2674 26.62206 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 182.2674 26.62206 moveto
+182.01218 24.34018 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 182.01218 24.34018 moveto
+183.54285 22.62874 lineto stroke
+newpath 183.54285 22.62874 moveto
+181.67189 21.29778 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 181.67189 21.29778 moveto
+181.41667 19.0159 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 181.41667 19.0159 moveto
+182.94739 17.30443 lineto stroke
+newpath 182.94739 17.30443 moveto
+185.2435 17.3044 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 185.2435 17.3044 moveto
+184.9883 15.02254 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 184.9883 15.02254 moveto
+186.51901 13.31107 lineto stroke
+newpath 186.51901 13.31107 moveto
+188.81514 13.31104 lineto stroke
+newpath 188.81514 13.31104 moveto
+190.34587 15.02245 lineto stroke
+newpath 190.34587 15.02245 moveto
+191.87654 13.311 lineto stroke
+newpath 191.87654 13.311 moveto
+194.17267 13.31097 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 194.17267 13.31097 moveto
+193.91745 11.02911 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 193.91745 11.02911 moveto
+195.44814 9.31766 lineto stroke
+newpath 195.44814 9.31766 moveto
+193.57716 7.9867 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 193.57716 7.9867 moveto
+193.32195 5.70483 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 193.32195 5.70483 moveto
+194.85266 3.99336 lineto stroke
+newpath 194.85266 3.99336 moveto
+197.14877 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 197.14877 3.99333 moveto
+196.89357 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 196.89357 1.71147 moveto
+198.42429 0 lineto stroke
+newpath 198.42429 0 moveto
+200.72044 0 lineto stroke
+newpath 200.72044 0 moveto
+202.25119 1.71147 lineto stroke
+newpath 202.25119 1.71147 moveto
+203.7819 0 lineto stroke
+newpath 203.7819 0 moveto
+206.07806 0 lineto stroke
+newpath 206.07806 0 moveto
+207.60881 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 207.60881 1.71147 moveto
+207.35364 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 207.35364 3.9934 moveto
+209.64977 3.99336 lineto stroke
+newpath 209.64977 3.99336 moveto
+211.18051 5.70483 lineto stroke
+newpath 211.18051 5.70483 moveto
+212.71123 3.99336 lineto stroke
+newpath 212.71123 3.99336 moveto
+215.00734 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 215.00734 3.99333 moveto
+214.75212 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 214.75212 1.71147 moveto
+216.28284 0 lineto stroke
+newpath 216.28284 0 moveto
+218.579 0 lineto stroke
+newpath 218.579 0 moveto
+220.10974 1.71147 lineto stroke
+newpath 220.10974 1.71147 moveto
+221.64046 0 lineto stroke
+newpath 221.64046 0 moveto
+223.93661 0 lineto stroke
+newpath 223.93661 0 moveto
+225.46736 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 225.46736 1.71147 moveto
+225.21219 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 225.21219 3.9934 moveto
+227.50832 3.99336 lineto stroke
+newpath 227.50832 3.99336 moveto
+229.03906 5.70483 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 229.03906 5.70483 moveto
+228.78389 7.98676 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 228.78389 7.98676 moveto
+226.91292 9.31781 lineto stroke
+newpath 226.91292 9.31781 moveto
+228.44365 11.02924 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 228.44365 11.02924 moveto
+228.18848 13.31116 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 228.18848 13.31116 moveto
+230.4846 13.31113 lineto stroke
+newpath 230.4846 13.31113 moveto
+232.01534 15.02254 lineto stroke
+newpath 232.01534 15.02254 moveto
+233.546 13.3111 lineto stroke
+newpath 233.546 13.3111 moveto
+235.84213 13.31107 lineto stroke
+newpath 235.84213 13.31107 moveto
+237.37288 15.02254 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 237.37288 15.02254 moveto
+237.1177 17.30446 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 237.1177 17.30446 moveto
+239.41383 17.30443 lineto stroke
+newpath 239.41383 17.30443 moveto
+240.94458 19.0159 lineto stroke
+newpath 240.94458 19.0159 moveto
+242.4753 17.30443 lineto stroke
+newpath 242.4753 17.30443 moveto
+244.77141 17.3044 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 244.77141 17.3044 moveto
+244.51619 15.02254 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 244.51619 15.02254 moveto
+246.0469 13.31107 lineto stroke
+newpath 246.0469 13.31107 moveto
+248.34303 13.31104 lineto stroke
+newpath 248.34303 13.31104 moveto
+249.87376 15.02245 lineto stroke
+newpath 249.87376 15.02245 moveto
+251.40443 13.31102 lineto stroke
+newpath 251.40443 13.31102 moveto
+253.70056 13.31099 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 253.70056 13.31099 moveto
+253.44534 11.02911 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 253.44534 11.02911 moveto
+254.97601 9.31767 lineto stroke
+newpath 254.97601 9.31767 moveto
+253.10507 7.98671 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 253.10507 7.98671 moveto
+252.84985 5.70483 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 252.84985 5.70483 moveto
+254.38057 3.99336 lineto stroke
+newpath 254.38057 3.99336 moveto
+256.67668 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 256.67668 3.99333 moveto
+256.42146 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 256.42146 1.71147 moveto
+257.95218 0 lineto stroke
+newpath 257.95218 0 moveto
+260.24834 0 lineto stroke
+newpath 260.24834 0 moveto
+261.77908 1.71147 lineto stroke
+newpath 261.77908 1.71147 moveto
+263.3098 0 lineto stroke
+newpath 263.3098 0 moveto
+265.60596 0 lineto stroke
+newpath 265.60596 0 moveto
+267.1367 1.71147 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 267.1367 1.71147 moveto
+266.88153 3.9934 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 266.88153 3.9934 moveto
+269.17766 3.99336 lineto stroke
+newpath 269.17766 3.99336 moveto
+270.7084 5.70483 lineto stroke
+newpath 270.7084 5.70483 moveto
+272.23912 3.99336 lineto stroke
+newpath 272.23912 3.99336 moveto
+274.53523 3.99333 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 274.53523 3.99333 moveto
+274.28001 1.71147 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 274.28001 1.71147 moveto
+275.81073 0 lineto stroke
+newpath 275.81073 0 moveto
+278.10689 0 lineto stroke
+newpath 278.10689 0 moveto
+279.63763 1.71147 lineto stroke
+newpath 279.63763 1.71147 moveto
+281.16835 0 lineto stroke
+newpath 281.16835 0 moveto
+283.46451 0 lineto stroke
+newpath 283.46451 0 moveto
+282.31644 1.98854 lineto stroke
+newpath 282.31644 1.98854 moveto
+280.0689 2.45847 lineto stroke
+newpath 280.0689 2.45847 moveto
+280.78569 4.63985 lineto stroke
+newpath 280.78569 4.63985 moveto
+279.63762 6.62839 lineto stroke
+newpath 279.63762 6.62839 moveto
+277.39008 7.09833 lineto stroke
+newpath 277.39008 7.09833 moveto
+275.54146 5.73636 lineto stroke
+newpath 275.54146 5.73636 moveto
+274.3934 7.72488 lineto stroke
+newpath 274.3934 7.72488 moveto
+272.14586 8.19482 lineto stroke
+newpath 272.14586 8.19482 moveto
+272.86267 10.3762 lineto stroke
+newpath 272.86267 10.3762 moveto
+271.71465 12.36473 lineto stroke
+newpath 271.71465 12.36473 moveto
+273.81842 13.28462 lineto stroke
+newpath 273.81842 13.28462 moveto
+274.53523 15.466 lineto stroke
+newpath 274.53523 15.466 moveto
+273.38716 17.45454 lineto stroke
+newpath 273.38716 17.45454 moveto
+271.13962 17.92447 lineto stroke
+newpath 271.13962 17.92447 moveto
+271.85641 20.10585 lineto stroke
+newpath 271.85641 20.10585 moveto
+270.70834 22.09439 lineto stroke
+newpath 270.70834 22.09439 moveto
+268.4608 22.56433 lineto stroke
+newpath 268.4608 22.56433 moveto
+266.61218 21.20236 lineto stroke
+newpath 266.61218 21.20236 moveto
+265.46413 23.19089 lineto stroke
+newpath 265.46413 23.19089 moveto
+263.21658 23.66083 lineto stroke
+newpath 263.21658 23.66083 moveto
+261.36797 22.29887 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 261.36797 22.29887 moveto
+261.15073 20.01303 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 261.15073 20.01303 moveto
+258.90321 20.48299 lineto stroke
+newpath 258.90321 20.48299 moveto
+257.0546 19.12103 lineto stroke
+newpath 257.0546 19.12103 moveto
+255.90656 21.10956 lineto stroke
+newpath 255.90656 21.10956 moveto
+253.65904 21.57951 lineto stroke
+newpath 253.65904 21.57951 moveto
+254.37587 23.76083 lineto stroke
+newpath 254.37587 23.76083 moveto
+253.22783 25.74936 lineto stroke
+newpath 253.22783 25.74936 moveto
+250.98029 26.2193 lineto stroke
+newpath 250.98029 26.2193 moveto
+249.13167 24.85733 lineto stroke
+newpath 249.13167 24.85733 moveto
+247.98361 26.84586 lineto stroke
+newpath 247.98361 26.84586 moveto
+245.73607 27.3158 lineto stroke
+newpath 245.73607 27.3158 moveto
+246.45288 29.49718 lineto stroke
+newpath 246.45288 29.49718 moveto
+245.30486 31.4857 lineto stroke
+newpath 245.30486 31.4857 moveto
+247.40863 32.4056 lineto stroke
+newpath 247.40863 32.4056 moveto
+248.12544 34.58698 lineto stroke
+newpath 248.12544 34.58698 moveto
+246.9774 36.5755 lineto stroke
+newpath 246.9774 36.5755 moveto
+244.72989 37.04546 lineto stroke
+newpath 244.72989 37.04546 moveto
+245.44672 39.22678 lineto stroke
+newpath 245.44672 39.22678 moveto
+244.29868 41.2153 lineto stroke
+newpath 244.29868 41.2153 moveto
+246.40245 42.13521 lineto stroke
+newpath 246.40245 42.13521 moveto
+247.11928 44.31654 lineto stroke
+newpath 247.11928 44.31654 moveto
+249.20741 43.36172 lineto stroke
+newpath 249.20741 43.36172 moveto
+251.31119 44.28163 lineto stroke
+newpath 251.31119 44.28163 moveto
+252.028 46.46301 lineto stroke
+newpath 252.028 46.46301 moveto
+250.87997 48.45154 lineto stroke
+newpath 250.87997 48.45154 moveto
+252.98375 49.37143 lineto stroke
+newpath 252.98375 49.37143 moveto
+253.70056 51.55281 lineto stroke
+newpath 253.70056 51.55281 moveto
+252.55249 53.54135 lineto stroke
+newpath 252.55249 53.54135 moveto
+250.30495 54.01128 lineto stroke
+newpath 250.30495 54.01128 moveto
+251.02174 56.19266 lineto stroke
+newpath 251.02174 56.19266 moveto
+249.87367 58.1812 lineto stroke
+newpath 249.87367 58.1812 moveto
+247.62613 58.65114 lineto stroke
+newpath 247.62613 58.65114 moveto
+245.77751 57.28917 lineto stroke
+newpath 245.77751 57.28917 moveto
+244.62946 59.2777 lineto stroke
+newpath 244.62946 59.2777 moveto
+242.38191 59.74763 lineto stroke
+newpath 242.38191 59.74763 moveto
+243.09872 61.92902 lineto stroke
+newpath 243.09872 61.92902 moveto
+241.9507 63.91754 lineto stroke
+newpath 241.9507 63.91754 moveto
+244.05447 64.83743 lineto stroke
+newpath 244.05447 64.83743 moveto
+244.77129 67.01881 lineto stroke
+newpath 244.77129 67.01881 moveto
+243.62321 69.00735 lineto stroke
+newpath 243.62321 69.00735 moveto
+241.37567 69.47728 lineto stroke
+newpath 241.37567 69.47728 moveto
+242.09247 71.65866 lineto stroke
+newpath 242.09247 71.65866 moveto
+240.9444 73.6472 lineto stroke
+newpath 240.9444 73.6472 moveto
+238.69685 74.11714 lineto stroke
+newpath 238.69685 74.11714 moveto
+236.84824 72.75517 lineto stroke
+newpath 236.84824 72.75517 moveto
+235.70018 74.7437 lineto stroke
+newpath 235.70018 74.7437 moveto
+233.45264 75.21364 lineto stroke
+newpath 233.45264 75.21364 moveto
+231.60402 73.85168 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 231.60402 73.85168 moveto
+231.38678 71.56584 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 231.38678 71.56584 moveto
+229.13925 72.0358 lineto stroke
+newpath 229.13925 72.0358 moveto
+227.29063 70.67384 lineto stroke
+newpath 227.29063 70.67384 moveto
+226.1426 72.66237 lineto stroke
+newpath 226.1426 72.66237 moveto
+223.89508 73.13234 lineto stroke
+newpath 223.89508 73.13234 moveto
+224.61192 75.31366 lineto stroke
+newpath 224.61192 75.31366 moveto
+223.46388 77.30219 lineto stroke
+newpath 223.46388 77.30219 moveto
+221.21634 77.77213 lineto stroke
+newpath 221.21634 77.77213 moveto
+219.36772 76.41016 lineto stroke
+newpath 219.36772 76.41016 moveto
+218.21967 78.39868 lineto stroke
+newpath 218.21967 78.39868 moveto
+215.97212 78.86862 lineto stroke
+newpath 215.97212 78.86862 moveto
+214.1235 77.50667 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 214.1235 77.50667 moveto
+213.90627 75.22083 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 213.90627 75.22083 moveto
+211.65875 75.69078 lineto stroke
+newpath 211.65875 75.69078 moveto
+209.81013 74.32883 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 209.81013 74.32883 moveto
+209.59288 72.04298 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 209.59288 72.04298 moveto
+211.15186 70.35718 lineto stroke
+newpath 211.15186 70.35718 moveto
+209.30324 68.99525 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 209.30324 68.99525 moveto
+209.08598 66.70941 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 209.08598 66.70941 moveto
+206.83847 67.17937 lineto stroke
+newpath 206.83847 67.17937 moveto
+204.98987 65.81744 lineto stroke
+newpath 204.98987 65.81744 moveto
+203.84186 67.80597 lineto stroke
+newpath 203.84186 67.80597 moveto
+201.59435 68.27592 lineto stroke
+newpath 201.59435 68.27592 moveto
+199.74573 66.91397 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 199.74573 66.91397 moveto
+199.52849 64.62813 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 199.52849 64.62813 moveto
+197.28098 65.09808 lineto stroke
+newpath 197.28098 65.09808 moveto
+195.43236 63.73613 lineto stroke
+newpath 195.43236 63.73613 moveto
+194.28432 65.72466 lineto stroke
+newpath 194.28432 65.72466 moveto
+192.0368 66.19461 lineto stroke
+newpath 192.0368 66.19461 moveto
+192.75363 68.37593 lineto stroke
+newpath 192.75363 68.37593 moveto
+191.60559 70.36446 lineto stroke
+newpath 191.60559 70.36446 moveto
+189.35808 70.83441 lineto stroke
+newpath 189.35808 70.83441 moveto
+187.50948 69.47249 lineto stroke
+newpath 187.50948 69.47249 moveto
+186.36148 71.461 lineto stroke
+newpath 186.36148 71.461 moveto
+184.11397 71.93095 lineto stroke
+newpath 184.11397 71.93095 moveto
+184.8308 74.11229 lineto stroke
+newpath 184.8308 74.11229 moveto
+183.68279 76.1008 lineto stroke
+newpath 183.68279 76.1008 moveto
+185.78653 77.02066 lineto stroke
+newpath 185.78653 77.02066 moveto
+186.50336 79.202 lineto stroke
+newpath 186.50336 79.202 moveto
+185.35532 81.19052 lineto stroke
+newpath 185.35532 81.19052 moveto
+183.1078 81.66048 lineto stroke
+newpath 183.1078 81.66048 moveto
+183.82463 83.8418 lineto stroke
+newpath 183.82463 83.8418 moveto
+182.67659 85.83032 lineto stroke
+newpath 182.67659 85.83032 moveto
+180.42905 86.30026 lineto stroke
+newpath 180.42905 86.30026 moveto
+178.58043 84.9383 lineto stroke
+newpath 178.58043 84.9383 moveto
+177.43237 86.92682 lineto stroke
+newpath 177.43237 86.92682 moveto
+175.18483 87.39676 lineto stroke
+newpath 175.18483 87.39676 moveto
+173.33621 86.0348 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 173.33621 86.0348 moveto
+173.11897 83.74896 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 173.11897 83.74896 moveto
+170.87144 84.21892 lineto stroke
+newpath 170.87144 84.21892 moveto
+169.02283 82.85696 lineto stroke
+newpath 169.02283 82.85696 moveto
+167.87479 84.84549 lineto stroke
+newpath 167.87479 84.84549 moveto
+165.62727 85.31546 lineto stroke
+newpath 165.62727 85.31546 moveto
+166.34412 87.49678 lineto stroke
+newpath 166.34412 87.49678 moveto
+165.19608 89.4853 lineto stroke
+newpath 165.19608 89.4853 moveto
+162.94853 89.95525 lineto stroke
+newpath 162.94853 89.95525 moveto
+161.09991 88.59328 lineto stroke
+newpath 161.09991 88.59328 moveto
+159.95186 90.5818 lineto stroke
+newpath 159.95186 90.5818 moveto
+157.70432 91.05174 lineto stroke
+newpath 157.70432 91.05174 moveto
+158.42113 93.23312 lineto stroke
+newpath 158.42113 93.23312 moveto
+157.2731 95.22165 lineto stroke
+newpath 157.2731 95.22165 moveto
+159.37688 96.14154 lineto stroke
+newpath 159.37688 96.14154 moveto
+160.09369 98.32292 lineto stroke
+newpath 160.09369 98.32292 moveto
+158.94565 100.31145 lineto stroke
+newpath 158.94565 100.31145 moveto
+156.69814 100.7814 lineto stroke
+newpath 156.69814 100.7814 moveto
+157.41496 102.96272 lineto stroke
+newpath 157.41496 102.96272 moveto
+156.26692 104.95125 lineto stroke
+newpath 156.26692 104.95125 moveto
+158.3707 105.87115 lineto stroke
+newpath 158.3707 105.87115 moveto
+159.08752 108.05249 lineto stroke
+newpath 159.08752 108.05249 moveto
+161.17566 107.09767 lineto stroke
+newpath 161.17566 107.09767 moveto
+163.27943 108.01758 lineto stroke
+newpath 163.27943 108.01758 moveto
+163.99625 110.19896 lineto stroke
+newpath 163.99625 110.19896 moveto
+162.84822 112.18748 lineto stroke
+newpath 162.84822 112.18748 moveto
+164.952 113.10738 lineto stroke
+newpath 164.952 113.10738 moveto
+165.66881 115.28876 lineto stroke
+newpath 165.66881 115.28876 moveto
+164.52077 117.27728 lineto stroke
+newpath 164.52077 117.27728 moveto
+162.27325 117.74724 lineto stroke
+newpath 162.27325 117.74724 moveto
+162.99008 119.92856 lineto stroke
+newpath 162.99008 119.92856 moveto
+161.84204 121.91708 lineto stroke
+newpath 161.84204 121.91708 moveto
+159.59453 122.38704 lineto stroke
+newpath 159.59453 122.38704 moveto
+157.74593 121.02512 lineto stroke
+newpath 157.74593 121.02512 moveto
+156.59793 123.01363 lineto stroke
+newpath 156.59793 123.01363 moveto
+154.35042 123.48358 lineto stroke
+newpath 154.35042 123.48358 moveto
+155.06725 125.66492 lineto stroke
+newpath 155.06725 125.66492 moveto
+153.91924 127.65343 lineto stroke
+newpath 153.91924 127.65343 moveto
+156.023 128.57329 lineto stroke
+newpath 156.023 128.57329 moveto
+156.73982 130.75462 lineto stroke
+newpath 156.73982 130.75462 moveto
+155.59178 132.74315 lineto stroke
+newpath 155.59178 132.74315 moveto
+153.34427 133.2131 lineto stroke
+newpath 153.34427 133.2131 moveto
+154.0611 135.39442 lineto stroke
+newpath 154.0611 135.39442 moveto
+152.91306 137.38295 lineto stroke
+newpath 152.91306 137.38295 moveto
+155.01683 138.30286 lineto stroke
+newpath 155.01683 138.30286 moveto
+155.73366 140.48419 lineto stroke
+newpath 155.73366 140.48419 moveto
+157.8218 139.52937 lineto stroke
+newpath 157.8218 139.52937 moveto
+159.92557 140.44928 lineto stroke
+newpath 159.92557 140.44928 moveto
+160.6424 142.63062 lineto stroke
+newpath 160.6424 142.63062 moveto
+159.49438 144.61913 lineto stroke
+newpath 159.49438 144.61913 moveto
+161.59816 145.539 lineto stroke
+newpath 161.59816 145.539 moveto
+162.31499 147.72034 lineto stroke
+newpath 162.31499 147.72034 moveto
+164.40312 146.7655 lineto stroke
+newpath 164.40312 146.7655 moveto
+166.50688 147.68538 lineto stroke
+newpath 166.50688 147.68538 moveto
+167.18723 145.49245 lineto stroke
+newpath 167.18723 145.49245 moveto
+169.27536 144.53761 lineto stroke
+newpath 169.27536 144.53761 moveto
+171.37914 145.45752 lineto stroke
+newpath 171.37914 145.45752 moveto
+172.09596 147.63885 lineto stroke
+newpath 172.09596 147.63885 moveto
+174.1841 146.68404 lineto stroke
+newpath 174.1841 146.68404 moveto
+176.28787 147.60394 lineto stroke
+newpath 176.28787 147.60394 moveto
+177.00468 149.78532 lineto stroke
+newpath 177.00468 149.78532 moveto
+175.85666 151.77385 lineto stroke
+newpath 175.85666 151.77385 moveto
+177.96043 152.69374 lineto stroke
+newpath 177.96043 152.69374 moveto
+178.67725 154.87512 lineto stroke
+newpath 178.67725 154.87512 moveto
+177.5292 156.86365 lineto stroke
+newpath 177.5292 156.86365 moveto
+175.2817 157.3336 lineto stroke
+newpath 175.2817 157.3336 moveto
+175.99852 159.51492 lineto stroke
+newpath 175.99852 159.51492 moveto
+174.85048 161.50345 lineto stroke
+newpath 174.85048 161.50345 moveto
+176.95425 162.42336 lineto stroke
+newpath 176.95425 162.42336 moveto
+177.67108 164.60469 lineto stroke
+newpath 177.67108 164.60469 moveto
+179.75922 163.64987 lineto stroke
+newpath 179.75922 163.64987 moveto
+181.86299 164.56978 lineto stroke
+newpath 181.86299 164.56978 moveto
+182.5798 166.75116 lineto stroke
+newpath 182.5798 166.75116 moveto
+181.43178 168.73969 lineto stroke
+newpath 181.43178 168.73969 moveto
+183.53555 169.65958 lineto stroke
+newpath 183.53555 169.65958 moveto
+184.25237 171.84096 lineto stroke
+newpath 184.25237 171.84096 moveto
+183.1043 173.8295 lineto stroke
+newpath 183.1043 173.8295 moveto
+180.85675 174.29942 lineto stroke
+newpath 180.85675 174.29942 moveto
+181.57355 176.4808 lineto stroke
+newpath 181.57355 176.4808 moveto
+180.42548 178.46935 lineto stroke
+newpath 180.42548 178.46935 moveto
+178.17793 178.93929 lineto stroke
+newpath 178.17793 178.93929 moveto
+176.32932 177.57732 lineto stroke
+newpath 176.32932 177.57732 moveto
+175.18126 179.56584 lineto stroke
+newpath 175.18126 179.56584 moveto
+172.93372 180.03578 lineto stroke
+newpath 172.93372 180.03578 moveto
+173.65053 182.21716 lineto stroke
+newpath 173.65053 182.21716 moveto
+172.5025 184.20569 lineto stroke
+newpath 172.5025 184.20569 moveto
+174.60628 185.12558 lineto stroke
+newpath 174.60628 185.12558 moveto
+175.32309 187.30696 lineto stroke
+newpath 175.32309 187.30696 moveto
+174.17502 189.2955 lineto stroke
+newpath 174.17502 189.2955 moveto
+171.92747 189.76543 lineto stroke
+newpath 171.92747 189.76543 moveto
+172.64427 191.94681 lineto stroke
+newpath 172.64427 191.94681 moveto
+171.4962 193.93535 lineto stroke
+newpath 171.4962 193.93535 moveto
+169.24866 194.40529 lineto stroke
+newpath 169.24866 194.40529 moveto
+167.40004 193.04332 lineto stroke
+newpath 167.40004 193.04332 moveto
+166.25198 195.03185 lineto stroke
+newpath 166.25198 195.03185 moveto
+164.00444 195.50179 lineto stroke
+newpath 164.00444 195.50179 moveto
+162.15582 194.13983 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 162.15582 194.13983 moveto
+161.93858 191.85399 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 161.93858 191.85399 moveto
+159.69107 192.32394 lineto stroke
+newpath 159.69107 192.32394 moveto
+157.84245 190.96199 lineto stroke
+newpath 157.84245 190.96199 moveto
+156.69441 192.95052 lineto stroke
+newpath 156.69441 192.95052 moveto
+154.4469 193.42047 lineto stroke
+newpath 154.4469 193.42047 moveto
+155.16373 195.60179 lineto stroke
+newpath 155.16373 195.60179 moveto
+154.01569 197.59032 lineto stroke
+newpath 154.01569 197.59032 moveto
+151.76814 198.06026 lineto stroke
+newpath 151.76814 198.06026 moveto
+149.91953 196.69829 lineto stroke
+newpath 149.91953 196.69829 moveto
+148.77147 198.68681 lineto stroke
+newpath 148.77147 198.68681 moveto
+146.52393 199.15675 lineto stroke
+newpath 146.52393 199.15675 moveto
+147.24074 201.33813 lineto stroke
+newpath 147.24074 201.33813 moveto
+146.09271 203.32666 lineto stroke
+newpath 146.09271 203.32666 moveto
+148.19649 204.24655 lineto stroke
+newpath 148.19649 204.24655 moveto
+148.9133 206.42793 lineto stroke
+newpath 148.9133 206.42793 moveto
+147.76526 208.41646 lineto stroke
+newpath 147.76526 208.41646 moveto
+145.51775 208.88641 lineto stroke
+newpath 145.51775 208.88641 moveto
+146.23457 211.06773 lineto stroke
+newpath 146.23457 211.06773 moveto
+145.08653 213.05626 lineto stroke
+newpath 145.08653 213.05626 moveto
+147.1903 213.97617 lineto stroke
+newpath 147.1903 213.97617 moveto
+147.90714 216.1575 lineto stroke
+newpath 147.90714 216.1575 moveto
+149.99527 215.20268 lineto stroke
+newpath 149.99527 215.20268 moveto
+152.09904 216.12259 lineto stroke
+newpath 152.09904 216.12259 moveto
+152.81586 218.30397 lineto stroke
+newpath 152.81586 218.30397 moveto
+151.66783 220.2925 lineto stroke
+newpath 151.66783 220.2925 moveto
+153.7716 221.21239 lineto stroke
+newpath 153.7716 221.21239 moveto
+154.48842 223.39377 lineto stroke
+newpath 154.48842 223.39377 moveto
+153.34035 225.38231 lineto stroke
+newpath 153.34035 225.38231 moveto
+151.0928 225.85223 lineto stroke
+newpath 151.0928 225.85223 moveto
+151.8096 228.03362 lineto stroke
+newpath 151.8096 228.03362 moveto
+150.66153 230.02216 lineto stroke
+newpath 150.66153 230.02216 moveto
+148.41399 230.4921 lineto stroke
+newpath 148.41399 230.4921 moveto
+146.56537 229.13013 lineto stroke
+newpath 146.56537 229.13013 moveto
+145.41731 231.11865 lineto stroke
+newpath 145.41731 231.11865 moveto
+143.16977 231.5886 lineto stroke
+newpath 143.16977 231.5886 moveto
+143.88658 233.76997 lineto stroke
+newpath 143.88658 233.76997 moveto
+142.73856 235.7585 lineto stroke
+newpath 142.73856 235.7585 moveto
+144.84233 236.67839 lineto stroke
+newpath 144.84233 236.67839 moveto
+145.55914 238.85977 lineto stroke
+newpath 145.55914 238.85977 moveto
+144.41107 240.84831 lineto stroke
+newpath 144.41107 240.84831 moveto
+142.16353 241.31824 lineto stroke
+newpath 142.16353 241.31824 moveto
+142.88033 243.49962 lineto stroke
+newpath 142.88033 243.49962 moveto
+141.73225 245.48816 lineto stroke
+newpath 141.73225 245.48816 moveto
+140.58418 243.49962 lineto stroke
+newpath 140.58418 243.49962 moveto
+141.30096 241.3182 lineto stroke
+newpath 141.30096 241.3182 moveto
+139.05344 240.84831 lineto stroke
+newpath 139.05344 240.84831 moveto
+137.90536 238.85977 lineto stroke
+newpath 137.90536 238.85977 moveto
+138.62216 236.67838 lineto stroke
+newpath 138.62216 236.67838 moveto
+140.72598 235.7584 lineto stroke
+newpath 140.72598 235.7584 moveto
+139.57788 233.7699 lineto stroke
+newpath 139.57788 233.7699 moveto
+140.29468 231.5885 lineto stroke
+newpath 140.29468 231.5885 moveto
+138.04715 231.11859 lineto stroke
+newpath 138.04715 231.11859 moveto
+136.89906 229.1301 lineto stroke
+newpath 136.89906 229.1301 moveto
+135.0505 230.49207 lineto stroke
+newpath 135.0505 230.49207 moveto
+132.80298 230.02216 lineto stroke
+newpath 132.80298 230.02216 moveto
+131.6549 228.03362 lineto stroke
+newpath 131.6549 228.03362 moveto
+132.37169 225.8522 lineto stroke
+newpath 132.37169 225.8522 moveto
+130.12416 225.38231 lineto stroke
+newpath 130.12416 225.38231 moveto
+128.97609 223.39377 lineto stroke
+newpath 128.97609 223.39377 moveto
+129.69289 221.21237 lineto stroke
+newpath 129.69289 221.21237 moveto
+131.7967 220.2924 lineto stroke
+newpath 131.7967 220.2924 moveto
+130.6486 218.3039 lineto stroke
+newpath 130.6486 218.3039 moveto
+131.3654 216.1225 lineto stroke
+newpath 131.3654 216.1225 moveto
+133.4692 215.20253 lineto stroke
+newpath 133.4692 215.20253 moveto
+135.5574 216.15732 lineto stroke
+newpath 135.5574 216.15732 moveto
+136.27419 213.97595 lineto stroke
+newpath 136.27419 213.97595 moveto
+138.37798 213.05598 lineto stroke
+newpath 138.37798 213.05598 moveto
+137.2299 211.06749 lineto stroke
+newpath 137.2299 211.06749 moveto
+137.94667 208.88611 lineto stroke
+newpath 137.94667 208.88611 moveto
+135.69916 208.41623 lineto stroke
+newpath 135.69916 208.41623 moveto
+134.55109 206.42773 lineto stroke
+newpath 134.55109 206.42773 moveto
+135.26788 204.24634 lineto stroke
+newpath 135.26788 204.24634 moveto
+137.3717 203.32637 lineto stroke
+newpath 137.3717 203.32637 moveto
+136.2236 201.33786 lineto stroke
+newpath 136.2236 201.33786 moveto
+136.9404 199.15646 lineto stroke
+newpath 136.9404 199.15646 moveto
+134.69287 198.68655 lineto stroke
+newpath 134.69287 198.68655 moveto
+133.54478 196.69806 lineto stroke
+newpath 133.54478 196.69806 moveto
+131.69623 198.06003 lineto stroke
+newpath 131.69623 198.06003 moveto
+129.4487 197.59012 lineto stroke
+newpath 129.4487 197.59012 moveto
+128.30063 195.60162 lineto stroke
+newpath 128.30063 195.60162 moveto
+129.0174 193.42024 lineto stroke
+newpath 129.0174 193.42024 moveto
+126.76988 192.95036 lineto stroke
+newpath 126.76988 192.95036 moveto
+125.62181 190.96187 lineto stroke
+newpath 125.62181 190.96187 moveto
+123.77325 192.32384 lineto stroke
+newpath 123.77325 192.32384 moveto
+121.52576 191.85396 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 121.52576 191.85396 moveto
+121.30856 194.13972 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 121.30856 194.13972 moveto
+119.46 195.5017 lineto stroke
+newpath 119.46 195.5017 moveto
+117.21248 195.03178 lineto stroke
+newpath 117.21248 195.03178 moveto
+116.06439 193.04329 lineto stroke
+newpath 116.06439 193.04329 moveto
+114.21584 194.40526 lineto stroke
+newpath 114.21584 194.40526 moveto
+111.9683 193.93535 lineto stroke
+newpath 111.9683 193.93535 moveto
+110.82024 191.94681 lineto stroke
+newpath 110.82024 191.94681 moveto
+111.53702 189.7654 lineto stroke
+newpath 111.53702 189.7654 moveto
+109.28949 189.2955 lineto stroke
+newpath 109.28949 189.2955 moveto
+108.14142 187.30696 lineto stroke
+newpath 108.14142 187.30696 moveto
+108.85822 185.12556 lineto stroke
+newpath 108.85822 185.12556 moveto
+110.96204 184.2056 lineto stroke
+newpath 110.96204 184.2056 moveto
+109.81393 182.21709 lineto stroke
+newpath 109.81393 182.21709 moveto
+110.53073 180.03569 lineto stroke
+newpath 110.53073 180.03569 moveto
+108.2832 179.56578 lineto stroke
+newpath 108.2832 179.56578 moveto
+107.13512 177.57729 lineto stroke
+newpath 107.13512 177.57729 moveto
+105.28656 178.93925 lineto stroke
+newpath 105.28656 178.93925 moveto
+103.03903 178.46935 lineto stroke
+newpath 103.03903 178.46935 moveto
+101.89096 176.4808 lineto stroke
+newpath 101.89096 176.4808 moveto
+102.60774 174.2994 lineto stroke
+newpath 102.60774 174.2994 moveto
+100.36021 173.8295 lineto stroke
+newpath 100.36021 173.8295 moveto
+99.21214 171.84096 lineto stroke
+newpath 99.21214 171.84096 moveto
+99.92896 169.65956 lineto stroke
+newpath 99.92896 169.65956 moveto
+102.03276 168.73958 lineto stroke
+newpath 102.03276 168.73958 moveto
+100.88466 166.75108 lineto stroke
+newpath 100.88466 166.75108 moveto
+101.60147 164.56969 lineto stroke
+newpath 101.60147 164.56969 moveto
+103.70526 163.64972 lineto stroke
+newpath 103.70526 163.64972 moveto
+105.79349 164.60449 lineto stroke
+newpath 105.79349 164.60449 moveto
+106.51025 162.42311 lineto stroke
+newpath 106.51025 162.42311 moveto
+108.61404 161.50314 lineto stroke
+newpath 108.61404 161.50314 moveto
+107.46596 159.51465 lineto stroke
+newpath 107.46596 159.51465 moveto
+108.18271 157.33327 lineto stroke
+newpath 108.18271 157.33327 moveto
+105.93523 156.8634 lineto stroke
+newpath 105.93523 156.8634 moveto
+104.78714 154.87491 lineto stroke
+newpath 104.78714 154.87491 moveto
+105.50395 152.69351 lineto stroke
+newpath 105.50395 152.69351 moveto
+107.60776 151.77353 lineto stroke
+newpath 107.60776 151.77353 moveto
+106.45966 149.78503 lineto stroke
+newpath 106.45966 149.78503 moveto
+107.17647 147.60364 lineto stroke
+newpath 107.17647 147.60364 moveto
+109.28026 146.68367 lineto stroke
+newpath 109.28026 146.68367 moveto
+111.36848 147.63846 lineto stroke
+newpath 111.36848 147.63846 moveto
+112.08525 145.45708 lineto stroke
+newpath 112.08525 145.45708 moveto
+114.18904 144.53711 lineto stroke
+newpath 114.18904 144.53711 moveto
+116.27725 145.4919 lineto stroke
+newpath 116.27725 145.4919 moveto
+116.95773 147.68489 lineto stroke
+newpath 116.95773 147.68489 moveto
+119.06148 146.7649 lineto stroke
+newpath 119.06148 146.7649 moveto
+121.14969 147.71968 lineto stroke
+newpath 121.14969 147.71968 moveto
+121.86646 145.5383 lineto stroke
+newpath 121.86646 145.5383 moveto
+123.9702 144.61833 lineto stroke
+newpath 123.9702 144.61833 moveto
+122.82214 142.62988 lineto stroke
+newpath 122.82214 142.62988 moveto
+123.53891 140.4485 lineto stroke
+newpath 123.53891 140.4485 moveto
+125.6427 139.52853 lineto stroke
+newpath 125.6427 139.52853 moveto
+127.73093 140.48332 lineto stroke
+newpath 127.73093 140.48332 moveto
+128.4477 138.30194 lineto stroke
+newpath 128.4477 138.30194 moveto
+130.55148 137.38197 lineto stroke
+newpath 130.55148 137.38197 moveto
+129.4034 135.39348 lineto stroke
+newpath 129.4034 135.39348 moveto
+130.12016 133.2121 lineto stroke
+newpath 130.12016 133.2121 moveto
+127.87267 132.74222 lineto stroke
+newpath 127.87267 132.74222 moveto
+126.72458 130.75372 lineto stroke
+newpath 126.72458 130.75372 moveto
+127.44135 128.57234 lineto stroke
+newpath 127.44135 128.57234 moveto
+129.5451 127.65236 lineto stroke
+newpath 129.5451 127.65236 moveto
+128.39702 125.66391 lineto stroke
+newpath 128.39702 125.66391 moveto
+129.11378 123.48253 lineto stroke
+newpath 129.11378 123.48253 moveto
+126.86629 123.01265 lineto stroke
+newpath 126.86629 123.01265 moveto
+125.71819 121.0242 lineto stroke
+newpath 125.71819 121.0242 moveto
+123.86967 122.38618 lineto stroke
+newpath 123.86967 122.38618 moveto
+121.62218 121.9163 lineto stroke
+newpath 121.62218 121.9163 moveto
+120.47409 119.92781 lineto stroke
+newpath 120.47409 119.92781 moveto
+121.19086 117.74643 lineto stroke
+newpath 121.19086 117.74643 moveto
+118.94336 117.27655 lineto stroke
+newpath 118.94336 117.27655 moveto
+117.79527 115.28806 lineto stroke
+newpath 117.79527 115.28806 moveto
+118.51208 113.10666 lineto stroke
+newpath 118.51208 113.10666 moveto
+120.61589 112.18668 lineto stroke
+newpath 120.61589 112.18668 moveto
+119.46779 110.19818 lineto stroke
+newpath 119.46779 110.19818 moveto
+120.1846 108.01678 lineto stroke
+newpath 120.1846 108.01678 moveto
+122.28839 107.09682 lineto stroke
+newpath 122.28839 107.09682 moveto
+124.37662 108.05159 lineto stroke
+newpath 124.37662 108.05159 moveto
+125.09338 105.87021 lineto stroke
+newpath 125.09338 105.87021 moveto
+127.19717 104.95024 lineto stroke
+newpath 127.19717 104.95024 moveto
+126.04909 102.96175 lineto stroke
+newpath 126.04909 102.96175 moveto
+126.76584 100.78036 lineto stroke
+newpath 126.76584 100.78036 moveto
+124.51836 100.3105 lineto stroke
+newpath 124.51836 100.3105 moveto
+123.37027 98.322 lineto stroke
+newpath 123.37027 98.322 moveto
+124.08708 96.14061 lineto stroke
+newpath 124.08708 96.14061 moveto
+126.19089 95.22063 lineto stroke
+newpath 126.19089 95.22063 moveto
+125.04279 93.23213 lineto stroke
+newpath 125.04279 93.23213 moveto
+125.7596 91.05074 lineto stroke
+newpath 125.7596 91.05074 moveto
+123.51205 90.58083 lineto stroke
+newpath 123.51205 90.58083 moveto
+122.36397 88.59235 lineto stroke
+newpath 122.36397 88.59235 moveto
+120.51543 89.9543 lineto stroke
+newpath 120.51543 89.9543 moveto
+118.26788 89.48439 lineto stroke
+newpath 118.26788 89.48439 moveto
+117.11981 87.4959 lineto stroke
+newpath 117.11981 87.4959 moveto
+117.8366 85.31453 lineto stroke
+newpath 117.8366 85.31453 moveto
+115.58908 84.84464 lineto stroke
+newpath 115.58908 84.84464 moveto
+114.44101 82.85614 lineto stroke
+newpath 114.44101 82.85614 moveto
+112.59245 84.21811 lineto stroke
+newpath 112.59245 84.21811 moveto
+110.34496 83.74823 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 110.34496 83.74823 moveto
+110.12776 86.034 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 110.12776 86.034 moveto
+108.2792 87.39597 lineto stroke
+newpath 108.2792 87.39597 moveto
+106.03166 86.92606 lineto stroke
+newpath 106.03166 86.92606 moveto
+104.88358 84.93758 lineto stroke
+newpath 104.88358 84.93758 moveto
+103.03503 86.29953 lineto stroke
+newpath 103.03503 86.29953 moveto
+100.78749 85.82962 lineto stroke
+newpath 100.78749 85.82962 moveto
+99.6394 83.84113 lineto stroke
+newpath 99.6394 83.84113 moveto
+100.35617 81.65974 lineto stroke
+newpath 100.35617 81.65974 moveto
+98.10867 81.18987 lineto stroke
+newpath 98.10867 81.18987 moveto
+96.96059 79.20137 lineto stroke
+newpath 96.96059 79.20137 moveto
+97.67735 77.01999 lineto stroke
+newpath 97.67735 77.01999 moveto
+99.7811 76.10002 lineto stroke
+newpath 99.7811 76.10002 moveto
+98.63304 74.11157 lineto stroke
+newpath 98.63304 74.11157 moveto
+99.34981 71.93019 lineto stroke
+newpath 99.34981 71.93019 moveto
+97.10231 71.46031 lineto stroke
+newpath 97.10231 71.46031 moveto
+95.95422 69.47185 lineto stroke
+newpath 95.95422 69.47185 moveto
+94.1057 70.83382 lineto stroke
+newpath 94.1057 70.83382 moveto
+91.8582 70.36394 lineto stroke
+newpath 91.8582 70.36394 moveto
+90.71011 68.37544 lineto stroke
+newpath 90.71011 68.37544 moveto
+91.42688 66.19406 lineto stroke
+newpath 91.42688 66.19406 moveto
+89.17938 65.72418 lineto stroke
+newpath 89.17938 65.72418 moveto
+88.0313 63.73569 lineto stroke
+newpath 88.0313 63.73569 moveto
+86.18274 65.09766 lineto stroke
+newpath 86.18274 65.09766 moveto
+83.93524 64.62778 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 83.93524 64.62778 moveto
+83.71806 66.91356 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 83.71806 66.91356 moveto
+81.8695 68.27553 lineto stroke
+newpath 81.8695 68.27553 moveto
+79.62201 67.80565 lineto stroke
+newpath 79.62201 67.80565 moveto
+78.47392 65.81718 lineto stroke
+newpath 78.47392 65.81718 moveto
+76.6254 67.17915 lineto stroke
+newpath 76.6254 67.17915 moveto
+74.3779 66.70927 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 74.3779 66.70927 moveto
+74.16074 68.99506 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 74.16074 68.99506 moveto
+72.31221 70.35701 lineto stroke
+newpath 72.31221 70.35701 moveto
+73.87117 72.0427 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 73.87117 72.0427 moveto
+73.654 74.32848 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 73.654 74.32848 moveto
+71.80545 75.69044 lineto stroke
+newpath 71.80545 75.69044 moveto
+69.55795 75.22057 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 69.55795 75.22057 moveto
+69.34077 77.50635 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 69.34077 77.50635 moveto
+67.49222 78.86832 lineto stroke
+newpath 67.49222 78.86832 moveto
+65.24467 78.3984 lineto stroke
+newpath 65.24467 78.3984 moveto
+64.09659 76.40993 lineto stroke
+newpath 64.09659 76.40993 moveto
+62.24805 77.77188 lineto stroke
+newpath 62.24805 77.77188 moveto
+60.0005 77.30197 lineto stroke
+newpath 60.0005 77.30197 moveto
+58.85243 75.31348 lineto stroke
+newpath 58.85243 75.31348 moveto
+59.56921 73.13211 lineto stroke
+newpath 59.56921 73.13211 moveto
+57.3217 72.66222 lineto stroke
+newpath 57.3217 72.66222 moveto
+56.17363 70.67372 lineto stroke
+newpath 56.17363 70.67372 moveto
+54.32507 72.03569 lineto stroke
+newpath 54.32507 72.03569 moveto
+52.07758 71.56581 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 52.07758 71.56581 moveto
+51.86038 73.85158 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 51.86038 73.85158 moveto
+50.01183 75.21355 lineto stroke
+newpath 50.01183 75.21355 moveto
+47.76428 74.74364 lineto stroke
+newpath 47.76428 74.74364 moveto
+46.6162 72.75516 lineto stroke
+newpath 46.6162 72.75516 moveto
+44.76765 74.11711 lineto stroke
+newpath 44.76765 74.11711 moveto
+42.52011 73.6472 lineto stroke
+newpath 42.52011 73.6472 moveto
+41.37204 71.65866 lineto stroke
+newpath 41.37204 71.65866 moveto
+42.08882 69.47725 lineto stroke
+newpath 42.08882 69.47725 moveto
+39.8413 69.00735 lineto stroke
+newpath 39.8413 69.00735 moveto
+38.69322 67.01881 lineto stroke
+newpath 38.69322 67.01881 moveto
+39.41002 64.83742 lineto stroke
+newpath 39.41002 64.83742 moveto
+41.51384 63.91745 lineto stroke
+newpath 41.51384 63.91745 moveto
+40.36574 61.92894 lineto stroke
+newpath 40.36574 61.92894 moveto
+41.08253 59.74754 lineto stroke
+newpath 41.08253 59.74754 moveto
+38.835 59.27763 lineto stroke
+newpath 38.835 59.27763 moveto
+37.68692 57.28914 lineto stroke
+newpath 37.68692 57.28914 moveto
+35.83836 58.65111 lineto stroke
+newpath 35.83836 58.65111 moveto
+33.59084 58.1812 lineto stroke
+newpath 33.59084 58.1812 moveto
+32.44276 56.19266 lineto stroke
+newpath 32.44276 56.19266 moveto
+33.15955 54.01125 lineto stroke
+newpath 33.15955 54.01125 moveto
+30.91202 53.54135 lineto stroke
+newpath 30.91202 53.54135 moveto
+29.76395 51.55281 lineto stroke
+newpath 29.76395 51.55281 moveto
+30.48074 49.37141 lineto stroke
+newpath 30.48074 49.37141 moveto
+32.58456 48.45145 lineto stroke
+newpath 32.58456 48.45145 moveto
+31.43646 46.46294 lineto stroke
+newpath 31.43646 46.46294 moveto
+32.15326 44.28154 lineto stroke
+newpath 32.15326 44.28154 moveto
+34.25705 43.36157 lineto stroke
+newpath 34.25705 43.36157 moveto
+36.34526 44.31636 lineto stroke
+newpath 36.34526 44.31636 moveto
+37.06204 42.135 lineto stroke
+newpath 37.06204 42.135 moveto
+39.16583 41.21503 lineto stroke
+newpath 39.16583 41.21503 moveto
+38.01776 39.22653 lineto stroke
+newpath 38.01776 39.22653 moveto
+38.73453 37.04515 lineto stroke
+newpath 38.73453 37.04515 moveto
+36.48701 36.57527 lineto stroke
+newpath 36.48701 36.57527 moveto
+35.33894 34.58678 lineto stroke
+newpath 35.33894 34.58678 moveto
+36.05574 32.40538 lineto stroke
+newpath 36.05574 32.40538 moveto
+38.15956 31.48541 lineto stroke
+newpath 38.15956 31.48541 moveto
+37.01146 29.4969 lineto stroke
+newpath 37.01146 29.4969 moveto
+37.72826 27.3155 lineto stroke
+newpath 37.72826 27.3155 moveto
+35.48073 26.8456 lineto stroke
+newpath 35.48073 26.8456 moveto
+34.33264 24.8571 lineto stroke
+newpath 34.33264 24.8571 moveto
+32.48409 26.21907 lineto stroke
+newpath 32.48409 26.21907 moveto
+30.23656 25.74916 lineto stroke
+newpath 30.23656 25.74916 moveto
+29.08849 23.76067 lineto stroke
+newpath 29.08849 23.76067 moveto
+29.80525 21.57928 lineto stroke
+newpath 29.80525 21.57928 moveto
+27.55774 21.1094 lineto stroke
+newpath 27.55774 21.1094 moveto
+26.40967 19.12091 lineto stroke
+newpath 26.40967 19.12091 moveto
+24.56111 20.48288 lineto stroke
+newpath 24.56111 20.48288 moveto
+22.31361 20.013 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 22.31361 20.013 moveto
+22.09642 22.29877 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 22.09642 22.29877 moveto
+20.24786 23.66074 lineto stroke
+newpath 20.24786 23.66074 moveto
+18.00034 23.19083 lineto stroke
+newpath 18.00034 23.19083 moveto
+16.85225 21.20233 lineto stroke
+newpath 16.85225 21.20233 moveto
+15.0037 22.5643 lineto stroke
+newpath 15.0037 22.5643 moveto
+12.75616 22.09439 lineto stroke
+newpath 12.75616 22.09439 moveto
+11.6081 20.10585 lineto stroke
+newpath 11.6081 20.10585 moveto
+12.32487 17.92444 lineto stroke
+newpath 12.32487 17.92444 moveto
+10.07735 17.45454 lineto stroke
+newpath 10.07735 17.45454 moveto
+8.92928 15.466 lineto stroke
+newpath 8.92928 15.466 moveto
+9.64607 13.2846 lineto stroke
+newpath 9.64607 13.2846 moveto
+11.7499 12.36464 lineto stroke
+newpath 11.7499 12.36464 moveto
+10.60179 10.37613 lineto stroke
+newpath 10.60179 10.37613 moveto
+11.31859 8.19473 lineto stroke
+newpath 11.31859 8.19473 moveto
+9.07106 7.72482 lineto stroke
+newpath 9.07106 7.72482 moveto
+7.92297 5.73633 lineto stroke
+newpath 7.92297 5.73633 moveto
+6.07442 7.0983 lineto stroke
+newpath 6.07442 7.0983 moveto
+3.82689 6.62839 lineto stroke
+newpath 3.82689 6.62839 moveto
+2.67882 4.63985 lineto stroke
+newpath 2.67882 4.63985 moveto
+3.3956 2.45844 lineto stroke
+newpath 3.3956 2.45844 moveto
+1.14807 1.98854 lineto stroke
+newpath 1.14807 1.98854 moveto
+0 0 lineto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.3 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.3
new file mode 100644
index 0000000000..6f20878171
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.3
@@ -0,0 +1,397 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 -246 284 83
+%%HiResBoundingBox: -0.25467 -245.73816 283.71707 82.0819
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2237
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+3.3906 -1.23409 7.1076 -1.23409 10.49821 0 curveto
+10.49821 0 lineto
+13.26227 2.3193 15.12077 5.53833 15.74731 9.09174 curveto
+15.74754 9.09216 lineto
+16.37408 5.53876 18.23259 2.31972 20.99664 0.00041 curveto
+20.99689 0 lineto
+24.3875 -1.23409 28.10449 -1.23409 31.4951 0 curveto
+31.4951 0 lineto
+34.25916 2.3193 36.11766 5.53835 36.7442 9.09174 curveto
+36.7442 9.09174 lineto
+36.11765 12.64514 34.25912 15.86417 31.49506 18.18347 curveto
+31.49481 18.18388 lineto
+34.88542 16.9498 38.60245 16.9498 41.99306 18.18388 curveto
+41.99355 18.18388 lineto
+44.7576 20.5032 46.6161 23.72223 47.24265 27.27563 curveto
+47.24336 27.27689 lineto
+47.8699 23.72348 49.72841 20.50444 52.49248 18.18513 curveto
+52.49248 18.18513 lineto
+55.88309 16.95105 59.6001 16.95105 62.99072 18.18513 curveto
+62.9912 18.18515 lineto
+60.22713 15.86584 58.3686 12.6468 57.74205 9.09341 curveto
+57.7418 9.09299 lineto
+58.36835 5.53958 60.22685 2.32056 62.9909 0.00125 curveto
+62.99164 0 lineto
+66.38223 -1.23409 70.09924 -1.23409 73.48984 0 curveto
+73.48984 0 lineto
+76.25389 2.3193 78.1124 5.53833 78.73894 9.09174 curveto
+78.73918 9.09216 lineto
+79.36572 5.53876 81.22423 2.31972 83.98828 0.00041 curveto
+83.98853 0 lineto
+87.37912 -1.23409 91.09613 -1.23409 94.48672 0 curveto
+94.48672 0 lineto
+97.25078 2.3193 99.10928 5.53833 99.73584 9.09175 curveto
+99.73584 9.09175 lineto
+99.10928 12.64514 97.25078 15.86418 94.48668 18.18349 curveto
+94.48643 18.1839 lineto
+97.87704 16.9498 101.59409 16.9498 104.9847 18.18388 curveto
+104.98517 18.18388 lineto
+107.74924 20.5032 109.60773 23.72223 110.23428 27.27563 curveto
+110.23428 27.27563 lineto
+109.60773 30.82904 107.7492 34.04808 104.98512 36.36737 curveto
+104.98512 36.36737 lineto
+101.5945 37.60146 97.87747 37.60144 94.48686 36.36732 curveto
+94.48637 36.36734 lineto
+97.25044 38.68665 99.10895 41.9057 99.7355 45.4591 curveto
+99.73575 45.45953 lineto
+99.10918 49.01292 97.25067 52.23196 94.48659 54.55127 curveto
+94.48587 54.5525 lineto
+97.87648 53.3184 101.59352 53.31842 104.98413 54.55252 curveto
+104.98413 54.55252 lineto
+107.74818 56.87183 109.60669 60.09087 110.23325 63.64429 curveto
+110.23349 63.6447 lineto
+110.86003 60.0913 112.71855 56.87225 115.4826 54.55293 curveto
+115.48285 54.5525 lineto
+118.87347 53.3184 122.59048 53.3184 125.9811 54.5525 curveto
+125.98254 54.5525 lineto
+128.7466 56.87181 130.6051 60.09085 131.23164 63.64424 curveto
+131.23164 63.64424 lineto
+130.6051 67.19765 128.74658 70.41667 125.9825 72.73598 curveto
+125.98225 72.7364 lineto
+129.37286 71.5023 133.0899 71.5023 136.48051 72.7364 curveto
+136.48099 72.7364 lineto
+139.24504 75.0557 141.10355 78.27473 141.73009 81.82814 curveto
+141.73225 81.8319 lineto
+142.3588 78.27849 144.2173 75.05946 146.98137 72.74014 curveto
+146.98137 72.74014 lineto
+150.37196 71.50606 154.08899 71.50604 157.47961 72.74014 curveto
+157.4801 72.74016 lineto
+154.71602 70.42085 152.8575 67.20183 152.23093 63.64844 curveto
+152.2307 63.64801 lineto
+152.85725 60.09459 154.71574 56.87556 157.47981 54.55626 curveto
+157.47981 54.55626 lineto
+160.8704 53.32216 164.58745 53.32217 167.97806 54.55626 curveto
+167.97806 54.55626 lineto
+170.74213 56.87558 172.60063 60.09462 173.22717 63.64804 curveto
+173.22742 63.64845 lineto
+173.85397 60.09505 175.71248 56.87599 178.47655 54.55669 curveto
+178.47679 54.55626 lineto
+181.8674 53.32217 185.58443 53.32216 188.97504 54.55626 curveto
+188.97649 54.55627 lineto
+186.2124 52.23697 184.35388 49.01793 183.72734 45.46452 curveto
+183.72734 45.46452 lineto
+184.35388 41.91112 186.21239 38.69208 188.97646 36.37276 curveto
+188.9767 36.37234 lineto
+185.58609 37.60645 181.86905 37.60646 178.47844 36.37238 curveto
+178.47795 36.37238 lineto
+175.71385 34.05307 173.85536 30.83405 173.22879 27.28064 curveto
+173.22807 27.27939 lineto
+173.85461 23.72598 175.71312 20.50694 178.47717 18.18765 curveto
+178.47717 18.18765 lineto
+181.86778 16.95355 185.5848 16.95355 188.97543 18.18765 curveto
+188.97592 18.18765 lineto
+186.21184 15.86835 184.35332 12.64932 183.72675 9.09592 curveto
+183.72652 9.09549 lineto
+184.35306 5.5421 186.21156 2.32306 188.97562 0.00375 curveto
+188.97778 0 lineto
+192.36838 -1.23409 196.08539 -1.23409 199.476 0 curveto
+199.476 0 lineto
+202.24005 2.3193 204.09856 5.53833 204.7251 9.09174 curveto
+204.72533 9.09216 lineto
+205.35187 5.53876 207.21037 2.31972 209.97443 0.00041 curveto
+209.97467 0 lineto
+213.36528 -1.23409 217.08228 -1.23409 220.47289 0 curveto
+220.47289 0 lineto
+223.23694 2.3193 225.09544 5.53835 225.72198 9.09174 curveto
+225.72198 9.09174 lineto
+225.09543 12.64514 223.23691 15.86417 220.47284 18.18347 curveto
+220.4726 18.18388 lineto
+223.8632 16.9498 227.58023 16.9498 230.97084 18.18388 curveto
+230.97133 18.18388 lineto
+233.73538 20.5032 235.59389 23.72223 236.22043 27.27563 curveto
+236.22115 27.27689 lineto
+236.84769 23.72348 238.70619 20.50444 241.47026 18.18513 curveto
+241.47026 18.18513 lineto
+244.86087 16.95105 248.57788 16.95105 251.9685 18.18513 curveto
+251.96898 18.18515 lineto
+249.20491 15.86584 247.34639 12.6468 246.71983 9.09341 curveto
+246.71959 9.09299 lineto
+247.34613 5.53958 249.20464 2.32056 251.96869 0.00125 curveto
+251.96942 0 lineto
+255.36002 -1.23409 259.07703 -1.23409 262.46762 0 curveto
+262.46762 0 lineto
+265.23167 2.3193 267.09018 5.53833 267.71672 9.09174 curveto
+267.71696 9.09216 lineto
+268.3435 5.53876 270.20201 2.31972 272.96606 0.00041 curveto
+272.96631 0 lineto
+276.3569 -1.23409 280.07391 -1.23409 283.46451 0 curveto
+283.46451 0 lineto
+280.70045 -2.3193 278.84195 -5.53833 278.2154 -9.09175 curveto
+278.2154 -9.09175 lineto
+278.84195 -12.64514 280.70045 -15.86418 283.46455 -18.18349 curveto
+283.4648 -18.1839 lineto
+280.07419 -16.9498 276.35715 -16.9498 272.96654 -18.18388 curveto
+272.96606 -18.18388 lineto
+270.202 -20.5032 268.3435 -23.72223 267.71695 -27.27563 curveto
+267.71695 -27.27563 lineto
+268.3435 -30.82904 270.20203 -34.04808 272.96611 -36.36737 curveto
+272.96611 -36.36737 lineto
+276.35674 -37.60146 280.07376 -37.60144 283.46437 -36.36732 curveto
+283.46486 -36.36734 lineto
+280.70079 -38.68665 278.84229 -41.9057 278.21573 -45.4591 curveto
+278.21548 -45.45953 lineto
+278.84206 -49.01292 280.70056 -52.23196 283.46465 -54.55127 curveto
+283.46536 -54.5525 lineto
+280.07475 -53.3184 276.35771 -53.31842 272.9671 -54.55252 curveto
+272.9671 -54.55252 lineto
+270.20305 -56.87183 268.34454 -60.09087 267.71799 -63.64429 curveto
+267.71774 -63.6447 lineto
+267.0912 -60.0913 265.23268 -56.87225 262.46863 -54.55293 curveto
+262.46838 -54.5525 lineto
+259.07776 -53.3184 255.36075 -53.3184 251.97014 -54.5525 curveto
+251.96869 -54.5525 lineto
+249.20464 -56.87181 247.34613 -60.09085 246.71959 -63.64424 curveto
+246.71959 -63.64424 lineto
+247.34613 -67.19765 249.20465 -70.41667 251.96873 -72.73598 curveto
+251.96898 -72.7364 lineto
+248.57837 -71.5023 244.86133 -71.5023 241.47072 -72.7364 curveto
+241.47025 -72.7364 lineto
+238.70619 -75.0557 236.84769 -78.27473 236.22115 -81.82814 curveto
+236.22115 -81.82814 lineto
+236.84769 -85.38153 238.7062 -88.60056 241.47029 -90.91989 curveto
+241.47029 -90.91989 lineto
+244.86092 -92.15396 248.57793 -92.15398 251.96857 -90.91985 curveto
+251.96904 -90.91983 lineto
+249.20499 -93.23915 247.34647 -96.4582 246.71991 -100.01161 curveto
+246.71968 -100.01202 lineto
+247.34624 -103.56544 249.20476 -106.78445 251.96883 -109.10378 curveto
+251.96883 -109.10378 lineto
+255.35945 -110.33786 259.07649 -110.33786 262.46709 -109.10373 curveto
+262.46709 -109.10373 lineto
+265.23116 -106.7844 267.08966 -103.56534 267.71619 -100.01192 curveto
+267.71645 -100.0115 lineto
+268.34299 -103.56491 270.20154 -106.78395 272.9656 -109.10327 curveto
+272.96585 -109.1037 lineto
+276.35648 -110.33777 280.0735 -110.33777 283.46413 -109.10365 curveto
+283.46556 -109.10365 lineto
+280.70148 -111.42297 278.84297 -114.64203 278.21645 -118.19543 curveto
+278.21645 -118.19543 lineto
+278.84299 -121.74884 280.70152 -124.96788 283.4656 -127.2872 curveto
+283.46585 -127.28763 lineto
+280.07521 -126.05353 276.35818 -126.05353 272.96756 -127.28763 curveto
+272.96707 -127.28763 lineto
+270.20299 -129.60695 268.34448 -132.82599 267.71794 -136.3794 curveto
+267.71722 -136.38065 lineto
+268.34378 -139.93405 270.2023 -143.15308 272.96637 -145.47238 curveto
+272.96637 -145.47238 lineto
+276.357 -146.70648 280.07402 -146.70647 283.46463 -145.47235 curveto
+283.46512 -145.47235 lineto
+280.70107 -147.79166 278.84254 -151.01073 278.21599 -154.56413 curveto
+278.21576 -154.56454 lineto
+278.8423 -158.11794 280.70084 -161.33698 283.4649 -163.65628 curveto
+283.46707 -163.66003 lineto
+280.07646 -162.42593 276.35944 -162.42593 272.96881 -163.66003 curveto
+272.96881 -163.66003 lineto
+270.20476 -165.97934 268.34624 -169.19838 267.7197 -172.7518 curveto
+267.71945 -172.75224 lineto
+267.09291 -169.1988 265.2344 -165.97977 262.47037 -163.66043 curveto
+262.4701 -163.66002 lineto
+259.07947 -162.42593 255.36246 -162.42593 251.97183 -163.66003 curveto
+251.97183 -163.66003 lineto
+249.20776 -165.97934 247.34926 -169.1984 246.72272 -172.75182 curveto
+246.72272 -172.75182 lineto
+247.34927 -176.30522 249.2078 -179.52426 251.9719 -181.84357 curveto
+251.97214 -181.844 lineto
+248.5815 -180.60991 244.86446 -180.6099 241.47383 -181.84401 curveto
+241.47334 -181.84401 lineto
+238.70929 -184.16331 236.85075 -187.38237 236.22423 -190.93578 curveto
+236.22351 -190.93703 lineto
+235.59697 -187.3836 233.73846 -184.16457 230.97437 -181.84526 curveto
+230.97437 -181.84526 lineto
+227.58376 -180.61116 223.86673 -180.61115 220.47609 -181.84526 curveto
+220.47562 -181.84526 lineto
+223.23969 -179.52594 225.09822 -176.3069 225.72478 -172.75348 curveto
+225.72502 -172.75307 lineto
+225.09848 -169.19962 223.23996 -165.9806 220.4759 -163.66127 curveto
+220.47517 -163.66003 lineto
+217.08456 -162.42592 213.36752 -162.42593 209.97693 -163.66002 curveto
+209.97693 -163.66002 lineto
+207.21286 -165.97934 205.35435 -169.19838 204.7278 -172.75182 curveto
+204.72755 -172.75223 lineto
+204.10101 -169.1988 202.24251 -165.97977 199.47845 -163.66043 curveto
+199.4782 -163.66002 lineto
+196.08759 -162.42593 192.37056 -162.42592 188.97995 -163.66002 curveto
+188.97562 -163.66002 lineto
+186.21156 -165.97932 184.35306 -169.19835 183.7265 -172.75177 curveto
+183.7265 -172.75177 lineto
+184.35306 -176.30516 186.21156 -179.5242 188.97566 -181.8435 curveto
+188.9759 -181.84392 lineto
+185.5853 -180.60982 181.86826 -180.60982 178.47765 -181.84392 curveto
+178.47717 -181.8439 lineto
+175.7131 -184.16322 173.85461 -187.38225 173.22806 -190.93565 curveto
+173.22806 -190.93565 lineto
+173.85461 -194.48906 175.71313 -197.7081 178.47722 -200.02739 curveto
+178.47722 -200.02739 lineto
+181.86784 -201.26147 185.58487 -201.26146 188.97548 -200.02734 curveto
+188.97597 -200.02736 lineto
+186.2119 -202.34666 184.3534 -205.56572 183.72684 -209.11913 curveto
+183.7266 -209.11955 lineto
+184.35316 -212.67294 186.21167 -215.89198 188.97575 -218.21129 curveto
+188.97647 -218.21252 lineto
+185.58586 -216.97842 181.86882 -216.97844 178.47821 -218.21254 curveto
+178.47821 -218.21254 lineto
+175.71416 -220.53186 173.85565 -223.75089 173.2291 -227.30432 curveto
+173.22885 -227.30472 lineto
+172.60231 -223.75131 170.74379 -220.53227 167.97974 -218.21295 curveto
+167.97949 -218.21252 lineto
+164.58887 -216.97842 160.87186 -216.97842 157.48125 -218.21252 curveto
+157.4798 -218.21252 lineto
+154.71574 -220.53183 152.85724 -223.75087 152.2307 -227.30426 curveto
+152.2307 -227.30426 lineto
+152.85724 -230.85767 154.71576 -234.07669 157.47984 -236.396 curveto
+157.48009 -236.39642 lineto
+154.08948 -235.16232 150.37244 -235.16232 146.98183 -236.39642 curveto
+146.98135 -236.39642 lineto
+144.2173 -238.71571 142.3588 -241.93475 141.73225 -245.48816 curveto
+141.73083 -245.4857 lineto
+141.1043 -241.9323 139.24579 -238.71327 136.48172 -236.39395 curveto
+136.48172 -236.39395 lineto
+133.09113 -235.15987 129.3741 -235.15985 125.98347 -236.39395 curveto
+125.98299 -236.39397 lineto
+128.74707 -234.07466 130.60559 -230.85564 131.23216 -227.30225 curveto
+131.23239 -227.30182 lineto
+130.60583 -223.7484 128.74734 -220.52937 125.98328 -218.21007 curveto
+125.98328 -218.21007 lineto
+122.59268 -216.97597 118.87564 -216.97598 115.48503 -218.21007 curveto
+115.48503 -218.21007 lineto
+112.72096 -220.52939 110.86246 -223.74843 110.23592 -227.30185 curveto
+110.23567 -227.30226 lineto
+109.60912 -223.74886 107.75061 -220.5298 104.98654 -218.2105 curveto
+104.9863 -218.21007 lineto
+101.59569 -216.97598 97.87866 -216.97597 94.48805 -218.21007 curveto
+94.4866 -218.21008 lineto
+97.25069 -215.89078 99.1092 -212.67174 99.73575 -209.11833 curveto
+99.73575 -209.11833 lineto
+99.1092 -205.56493 97.2507 -202.34589 94.48663 -200.02657 curveto
+94.48639 -200.02615 lineto
+97.877 -201.26025 101.59404 -201.26027 104.98465 -200.02618 curveto
+104.98514 -200.02618 lineto
+107.74924 -197.70688 109.60773 -194.48785 110.2343 -190.93445 curveto
+110.23502 -190.9332 lineto
+109.60847 -187.37979 107.74997 -184.16075 104.98592 -181.84146 curveto
+104.98592 -181.84146 lineto
+101.5953 -180.60736 97.8783 -180.60736 94.48766 -181.84146 curveto
+94.48717 -181.84146 lineto
+97.25125 -179.52216 99.10977 -176.30313 99.73634 -172.74973 curveto
+99.73657 -172.7493 lineto
+99.11003 -169.1959 97.25153 -165.97687 94.48747 -163.65756 curveto
+94.48747 -163.65756 lineto
+91.09686 -162.42348 87.37985 -162.42348 83.98921 -163.65758 curveto
+83.98921 -163.65758 lineto
+81.22514 -165.97688 79.36662 -169.19592 78.74008 -172.74936 curveto
+78.73985 -172.74977 lineto
+78.11331 -169.19635 76.25479 -165.9773 73.49072 -163.65799 curveto
+73.4905 -163.65758 lineto
+70.09987 -162.42346 66.38286 -162.42348 62.99223 -163.65756 curveto
+62.99223 -163.65756 lineto
+60.22816 -165.97688 58.36964 -169.19594 57.74312 -172.74934 curveto
+57.74312 -172.74934 lineto
+58.36967 -176.30278 60.22821 -179.5218 62.99228 -181.84113 curveto
+62.99251 -181.84154 lineto
+59.6019 -180.60744 55.88486 -180.60745 52.49423 -181.84154 curveto
+52.49374 -181.84154 lineto
+49.72968 -184.16087 47.87117 -187.3799 47.24461 -190.93332 curveto
+47.24391 -190.93457 lineto
+46.61737 -187.38115 44.75883 -184.1621 41.99477 -181.84279 curveto
+41.99477 -181.84279 lineto
+38.60416 -180.60869 34.88713 -180.6087 31.49649 -181.84279 curveto
+31.496 -181.84279 lineto
+34.26009 -179.52348 36.11859 -176.30443 36.74518 -172.75102 curveto
+36.74542 -172.7506 lineto
+36.11888 -169.19717 34.26038 -165.97813 31.49629 -163.65883 curveto
+31.49557 -163.65758 lineto
+28.10495 -162.42348 24.38794 -162.42348 20.99731 -163.65758 curveto
+20.99731 -163.65758 lineto
+18.23325 -165.97688 16.37474 -169.19592 15.7482 -172.74934 curveto
+15.74796 -172.74977 lineto
+15.12141 -169.19637 13.2629 -165.9773 10.49883 -163.65799 curveto
+10.4986 -163.65758 lineto
+7.10799 -162.42346 3.39096 -162.42348 0.00034 -163.65758 curveto
+-0.004 -163.65758 lineto
+2.76009 -161.33827 4.61859 -158.11925 5.24515 -154.56581 curveto
+5.24515 -154.56581 lineto
+4.6186 -151.01244 2.76012 -147.79337 -0.00397 -145.47404 curveto
+-0.00421 -145.47363 lineto
+3.3864 -146.70776 7.10342 -146.70778 10.49405 -145.47371 curveto
+10.49454 -145.4737 lineto
+13.2586 -143.15437 15.11713 -139.93535 15.74368 -136.38194 curveto
+15.74368 -136.38194 lineto
+15.11716 -132.82854 13.25862 -129.60948 10.49457 -127.29016 curveto
+10.49457 -127.29016 lineto
+7.10394 -126.05606 3.3869 -126.05608 -0.00372 -127.29018 curveto
+-0.00421 -127.29018 lineto
+2.75987 -124.97086 4.6184 -121.75182 5.24495 -118.1984 curveto
+5.2452 -118.19797 lineto
+4.61865 -114.64456 2.76015 -111.4255 -0.00392 -109.1062 curveto
+-0.00467 -109.10495 lineto
+3.38597 -110.33907 7.103 -110.33908 10.49362 -109.10498 curveto
+10.49362 -109.10498 lineto
+13.2577 -106.78568 15.11621 -103.56664 15.74278 -100.01321 curveto
+15.74301 -100.01279 lineto
+16.36957 -103.56621 18.22807 -106.78528 20.99211 -109.1046 curveto
+20.99236 -109.10501 lineto
+24.383 -110.33916 28.1 -110.33914 31.49065 -109.10507 curveto
+31.49208 -109.10506 lineto
+34.25616 -106.78577 36.11469 -103.56673 36.74124 -100.01334 curveto
+36.74124 -100.01334 lineto
+36.11469 -96.45992 34.25618 -93.24088 31.49211 -90.92154 curveto
+31.49187 -90.92113 lineto
+34.88248 -92.15524 38.5995 -92.15526 41.99014 -90.92119 curveto
+41.99062 -90.92117 lineto
+44.7547 -88.60188 46.6132 -85.38284 47.23978 -81.82944 curveto
+47.24194 -81.82568 lineto
+46.6154 -78.27228 44.7569 -75.05325 41.99283 -72.73393 curveto
+41.99283 -72.73393 lineto
+38.60223 -71.49985 34.88521 -71.49983 31.49458 -72.73393 curveto
+31.4941 -72.73395 lineto
+34.25818 -70.41464 36.1167 -67.19562 36.74327 -63.64221 curveto
+36.7435 -63.6418 lineto
+36.11694 -60.08838 34.25845 -56.86935 31.49438 -54.55005 curveto
+31.49438 -54.55005 lineto
+28.10379 -53.31595 24.38675 -53.31596 20.99614 -54.55005 curveto
+20.99614 -54.55005 lineto
+18.23207 -56.86937 16.37357 -60.08841 15.74702 -63.64183 curveto
+15.74678 -63.64224 lineto
+15.12022 -60.08884 13.26172 -56.86978 10.49765 -54.55048 curveto
+10.4974 -54.55005 lineto
+7.1068 -53.31596 3.38977 -53.31595 -0.00084 -54.55005 curveto
+-0.00229 -54.55006 lineto
+2.7618 -52.23076 4.62032 -49.01172 5.24686 -45.45831 curveto
+5.24686 -45.45831 lineto
+4.62032 -41.90489 2.76181 -38.68587 -0.00226 -36.36653 curveto
+-0.0025 -36.36613 lineto
+3.3881 -37.60023 7.10515 -37.60025 10.49576 -36.36617 curveto
+10.49625 -36.36617 lineto
+13.26035 -34.04686 15.11884 -30.82784 15.7454 -27.27443 curveto
+15.74612 -27.27318 lineto
+15.11958 -23.71977 13.26108 -20.50073 10.49702 -18.18144 curveto
+10.49702 -18.18144 lineto
+7.10641 -16.94734 3.3894 -16.94734 -0.00124 -18.18144 curveto
+-0.00172 -18.18144 lineto
+2.76236 -15.86214 4.62088 -12.64311 5.24745 -9.0897 curveto
+5.24768 -9.08928 lineto
+4.62114 -5.53589 2.76263 -2.31685 -0.00142 0.00246 curveto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.mp
new file mode 100644
index 0000000000..616d8eb674
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/recursives.mp
@@ -0,0 +1,80 @@
+% recursives.mp
+% L. Nobre G.
+% 2011
+
+prologues := 1;
+
+% coded by Martin Geisler %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def koch(expr a, b, n) =
+ begingroup
+ if n = 0:
+ draw a--b;
+ else:
+ koch(a, 1/3[a,b], n-1);
+ koch(1/3[a,b], 2/3[a,b] rotatedabout(1/3[a,b], 60), n-1);
+ koch(2/3[a,b] rotatedabout(1/3[a,b], 60), 2/3[a,b], n-1);
+ koch(2/3[a,b], b, n-1);
+ fi
+ endgroup
+enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def kochl(expr a, b, n) =
+ begingroup
+ if n = 0:
+ draw a--b;
+ else:
+ kochl(a, 3/10[a,b], n-1);
+ kochl(3/10[a,b], 3/5[a,b] rotatedabout(3/10[a,b], 48.19), n-1);
+ kochl(3/5[a,b] rotatedabout(3/10[a,b], 48.19), 7/10[a,b], n-1);
+ kochl(7/10[a,b], b, n-1);
+ fi
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u, N;
+ u = 10cm;
+ N = 5;
+ pair a, b, c;
+ a = origin;
+ b = 0.5*u*(1,sqrt(3));
+ c = (u,0);
+ koch( a, b, N );
+ koch( b, c, N );
+ koch( c, a, N );
+endfig;
+
+beginfig(2);
+ numeric u, N;
+ u = 10cm;
+ N = 4;
+ pair a, b, c;
+ a = origin;
+ b = 0.5*u*(1,sqrt(3));
+ c = (u,0);
+ kochl( a, c, N );
+ kochl( c, b, N );
+ kochl( b, a, N );
+endfig;
+
+% from Syracuse
+beginfig(3);
+ z4 = (u,0);
+ z1 = 1/3[origin,z4];
+ z3 = 2/3[origin,z4] ;
+ z2 - z1 = (z3 - z1) rotated 60 ;
+ z4 - origin = (z5 - origin) rotated 60 ;
+ def next(expr p) =
+ (p scaled 1/3)--(p scaled 1/3 rotated 60 shifted z1)
+ --(p scaled 1/3 rotated -60 shifted z2)--(p scaled 1/3 shifted z3)
+ enddef;
+ path et;
+ et = origin{dir(-20)}..{dir(20)}z4;
+ for i = 1 upto 3:
+ et := next(et) ;
+ endfor
+ draw et--(et rotated -120 shifted z4)--(et rotated 120 shifted z5);
+endfig ;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal-1.svg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal-1.svg
new file mode 100644
index 0000000000..aeb70742d1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal-1.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!-- Created by MetaPost 1.504 on 2012.01.15:2124 -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="286.45331" height="286.45331" viewBox="0 0 286.45331 286.45331">
+<!-- Original BoundingBox: -143.22665 -143.22665 143.22665 143.22665 -->
+ <path d="M284.95891 143.22665C284.95891 105.63525,270.02356 69.588,243.44444 43.00887C216.86531 16.42975,180.81805 1.4944,143.22665 1.4944C105.63525 1.4944,69.588 16.42975,43.00887 43.00887C16.42975 69.588,1.4944 105.63525,1.4944 143.22665C1.4944 180.81805,16.42975 216.86531,43.00887 243.44444C69.588 270.02356,105.63525 284.95891,143.22665 284.95891C180.81805 284.95891,216.86531 270.02356,243.44444 243.44444C270.02356 216.86531,284.95891 180.81805,284.95891 143.22665Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M278.4015 185.83748L8.0518 185.8376L143.22665 1.4944Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M272.34119 84.76926L14.11212 84.76912L143.22665 284.95891Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M215.70613 52.4968L143.22665 257.4001L70.74718 52.4968Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M186.46341 257.4001L99.9899 257.4001L143.22665 84.76918Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M92.44449 11.39024L194.00882 11.39024L143.22665 167.36629Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M143.22665 11.39024L222.96106 228.96422L63.49225 228.96422Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M175.07411 167.36574L111.3792 167.36574L143.22665 52.4968Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M143.22665 228.96422L181.02657 114.53613L105.42674 114.53613Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+ <path d="M143.22665 185.83754L165.11725 131.45305L121.33606 131.45305Z" style="stroke:rgb(0%,0%,0%); stroke-width: 2.98878;stroke-linecap: round;stroke-linejoin: round;stroke-miterlimit: 10;fill: none;"></path>
+</svg>
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal.mp
new file mode 100644
index 0000000000..4e7273d3d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/sriyantrafinal.mp
@@ -0,0 +1,102 @@
+% sriyantrafinal.mp
+% L. Nobre G.
+% 2012
+
+outputformat := "svg";
+outputtemplate := "%j-%c.svg";
+
+numeric u;
+u = 5cm;
+
+def ap( expr poia, poib ) =
+ begingroup
+ pair dirv;
+ dirv = 2*u*unitvector(poib-poia);
+ ( (poia-dirv)--(poia+dirv) )
+ endgroup
+enddef;
+
+vardef makesriyantrafinal =
+ path outercircle;
+ outercircle = fullcircle scaled (2*u);
+ draw outercircle;
+ numeric pA, pB, pC, pD, pE;
+ pA = u*0.80556;
+ pB = u*0.30064;
+ pC = -u*0.17032;
+ pD = u*0.31772;
+ pE = u*0.51138;
+ z1 = (pD,pA); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ z2 = (-pD,pA);
+ z3 = (0,pC); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ z4 = ((-u,-pB)--(u,-pB)) intersectionpoint reverse outercircle; %%%%%%%%
+ z5 = (-x4,-pB);
+ z6 = (0,u);
+ draw z4--z5--z6--cycle;
+ z7 = (z1--z3) intersectionpoint (z4--z6);
+ z8 = (-x7,y7);
+ z9 = 0.5[z7,z8];
+ z10 = 0.5[z4,z5];
+ z11 = (0,-pA); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ y12 = y7;
+ x12 = pE; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ z13 = whatever[z12,z11];
+ z13 = whatever[z4,z6];
+ z14 = ((-u,y13)--(u,y13)) intersectionpoint outercircle;
+ z15 = (-x14,y13);
+ z16 = (0,-u);
+ draw z14--z15--z16--cycle;
+ z17 = (-x12,y12);
+ draw z12--z11--z17--cycle;
+ z18 = whatever[z1,z3];
+ z18 = whatever[z14,z15];
+ z19 = whatever[z11,z12];
+ z19 = whatever[z4,z5];
+ z20 = 0.5[z14,z15];
+ y21 = y11;
+ z21 = whatever[z20,z19];
+ z22 = (-x21,y21);
+ draw z21--z22--z20--cycle;
+ z23 = whatever[z14,z16];
+ z23 = whatever[z4,z5];
+ z24 = whatever[z21,z20];
+ z24 = whatever[z14,z16];
+ x25 = 0;
+ z25 = whatever[z23,z18];
+ y26 = y25;
+ z26 = whatever[z3,z7];
+ z27 = (-x26,y26);
+ draw z27--z26--z3--cycle;
+ y28 = y24;
+ z28 = whatever[z23,z25];
+ z29 = (-x28,y28);
+ draw z25--z28--z29--cycle;
+ z30 = (z3--(u,pC)) intersectionpoint (z13--z11);
+ z31 = (-x30,y30);
+ draw z30--z31--z9--cycle;
+ z32 = 0.5[z28,z29];
+ z33 = (z3--z1) intersectionpoint (z30--z9);
+ z34 = (-x33,y33);
+ z35 = whatever[z25,z28];
+ z35 = whatever[z33,z34];
+ z36 = (-x35,y35);
+ draw z32--z35--z36--cycle;
+ z37 = (z21--z20) intersectionpoint (z1--z3);
+ z38 = (-x37,y37);
+ z39 = whatever[z37,z38];
+ z39 = whatever[z30,z9];
+ z40 = (-x39,y39);
+ draw z10--z39--z40--cycle;
+% path pe, pf, pg;
+% pe = ap(z21,z20);
+% pf = ap(z35,z32);
+% pg = ap(z31,(u,y30));
+% filldraw buildcycle( pe, pf, pg ) withcolor red;
+enddef;
+
+beginfig(1);
+ drawoptions( withpen pencircle scaled 3pt );
+ makesriyantrafinal;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/todo.jpg b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/todo.jpg
new file mode 100644
index 0000000000..34f5b2157b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/todo.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.1 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.1
new file mode 100644
index 0000000000..a0b00d6171
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.1
@@ -0,0 +1,1707 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -37 -239 237 15
+%%HiResBoundingBox: -36.25 -238.25 236.25 14.25
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%DocumentResources: procset mpost-minimal
+%%+ font EAURWX-LMMono10-Regular SRDJUK-LMRoman10-Italic ICXWUR-CMR10
+%%DocumentSuppliedResources: procset mpost-minimal
+%%+ font EAURWX-LMMono10-Regular SRDJUK-LMRoman10-Italic ICXWUR-CMR10
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset mpost-minimal
+/bd{bind def}bind def/fshow {exch findfont exch scalefont setfont show}bd
+/fcp{findfont dup length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall}bd
+/fmc{FontMatrix dup length array copy dup dup}bd/fmd{/FontMatrix exch def}bd
+/Amul{4 -1 roll exch mul 1000 div}bd/ExtendFont{fmc 0 get Amul 0 exch put fmd}bd
+/ScaleFont{dup fmc 0 get Amul 0 exch put dup dup 3 get Amul 3 exch put fmd}bd
+/SlantFont{fmc 2 get dup 0 eq{pop 1}if Amul FontMatrix 0 get mul 2 exch put fmd}bd
+%%EndResource
+%%BeginResource: font EAURWX-LMMono10-Regular
+%!PS-AdobeFont-1.0: LMMono10-Regular 2.004
+%%CreationDate: 7th October 2009
+% Generated by MetaType1 (a MetaPost-based engine)
+% Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).
+% Supported by CSTUG, DANTE eV, GUST, GUTenberg, NTG, and TUG.
+% METATYPE1/Type 1 version by B. Jackowski & J. M. Nowacki
+% from GUST (http://www.gust.org.pl).
+% This work is released under the GUST Font License.
+% For the most recent version of this license see
+% This work has the LPPL maintenance status `maintained'.
+% The Current Maintainer of this work is Bogus\l{}aw Jackowski and Janusz M. Nowacki.
+% This work consists of the files listed in the MANIFEST-Latin-Modern.txt file.
+% ADL: 778 222 0
+%%EndComments
+FontDirectory/EAURWX-LMMono10-Regular known{/EAURWX-LMMono10-Regular findfont dup/UniqueID known{dup
+/UniqueID get 0 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+17 dict begin
+/FontInfo 9 dict dup begin
+/version(2.004)readonly def
+/Notice(Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).)readonly def
+/FullName(LMMono10-Regular)readonly def
+/FamilyName(LMMono10)readonly def
+/Weight(Normal)readonly def
+/isFixedPitch true def
+/ItalicAngle 0 def
+/UnderlinePosition -167 def
+/UnderlineThickness 69 def
+end readonly def
+/FontName /IKAJAR-LMMono10-Regular def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 46 /period put
+dup 49 /one put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 105 /i put
+dup 109 /m put
+dup 111 /o put
+dup 112 /p put
+dup 115 /s put
+dup 116 /t put
+dup 118 /v put
+dup 120 /x put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/StrokeWidth 0 def
+/FontMatrix[0.001 0 0 0.001 0 0]readonly def
+%/UniqueID 0 def
+/FontBBox{-451 -316 731 1016}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0525392EECAC163E584A9104D99AD0BC
+1B1844A0E222653FA481B8809B26A46F4C483A5D7E95816EA6582584156CFEDE
+B994ADCFF4645140E3617E4D7E1B0E4541CB9F562E55829B4DD880AABE2229E9
+4A9FA259A734D29BBA91BA1E2055CBEA4339BCBFF98D32CEFF11F296225CAABA
+DCA10577A5D431B714726C1278D8101ABD1BD8D0BD0174FFF9148F8C61C241D9
+2AD360A28616CB4A0670C1BF105A2B97A25458EAC07B98B8F1ABC91ED489DF5A
+340A9C333CA5AF409E52EE1BA5629A1DA85B8B9EA3150173A28A696C6B98D060
+4CD8AE5F032FC97BAA1F5394B526DA51B5521D60F8531E0E5A437F5E00E9B683
+3F08ED5C6A216D2CA9C1806AEA6B335CD03C87CB35115D28AF52BF955F7F349A
+C9C2519FBF9D866A7CC0AB363443FFA4831A9FAF41181CC67437D2315BA0438C
+2D2387CED780B0C89728BF50FCD44E9E83FAB34746B8A91F611A7C821C73E49D
+7061B681B3A8086D36072662EABB0D12DF1A344E0E619F61E9D79E59F7F12ECD
+902103D50AAA3E5C951FBF72E96E17F3DCD91CB14D7F302FAC08DE542A661BE1
+76D75816F241E180B9EDA0DD2D77FAD91072D2CB4F9CB10A0042170ECAE66728
+4A43C5E849F8DBC4655095F039DBE7FA1DE67A9DBB1891D618FFEAFF67FE5683
+AC22D2CA7A6F772481EFE1BCC831A8A1C73DC456E8581871196DFBA4B0AD584E
+FE85A66B9E4D7621073A01B4D0E450338C9077A6808156163FA45AF5640D6443
+42DFBBF83113738F8AA0A8569EC3410F8B1504B5A572DB5855C9AB6CDD88939C
+3EA9D0DAE1E73EE83BA58587EDDE46FD34C7A4E0F5CE13AAC9D44D1C598CA95D
+B1BAF457820D26526039322E083AAAC442E04290E43ACFC73FA0D289AA732544
+37F9CE9AF092D5A976E3284F00E12B00DDDBCA7D9AD3389F03A93CD03A8ED655
+79B16B0779800ABA08EF65FD4A17CD265E56C22DF32F67764467507F67E709D5
+16B22CCD4111B7AC2A2DE413881E3770FC0753011C98A62B7A5A7855D7295C3C
+E4519841C6D9365A9B2A47408684E1F3020DC3A7B2066E895AB7271A1C10A070
+D345F88A54B61C09DAF4947002DCB9CDC539B448F25D5963F0087D9276C36566
+1850D76D0F9BA36DA698F5B60C1FBE717C3F54435B4FDD7ACFA13B5E33A6D8D1
+892127D458D2B3538B177C63AA22A28F3202D1F3DBC78DA20AF37C1021E866B1
+13B44CFDA6385152AB8E956ABF92CF26C7856F1D7172B72004530E8F72A729D1
+62FC5890998A99BF6722DE0FFC88FABA78A8C20AA9134CF23E91A22F072E0FC1
+CEA674D56637344D90E089A0BADF717AD3D206B77F42076EEE81285FBB3C4DD2
+6DC022AE6F055641C5D5055490615328AAB0231173D3D82A3D0635C98A57B5FD
+D17D8E162EB4A741E46AD79B309A83129B90C43DDD942178D25268693AE72F66
+6D681A4FA8B2477893175F3008EEF552E9465971C6B191B8D3ED752968F923AE
+CB58B21F1A30A2805ABC3BDD397F3D5B215B0698D8DCA31415EA7476356F9124
+8AB53FB92DB9DA8CCC5D4C809B07C2184C794F0DDDA42481071CF1F5F4AB3D7D
+E1DB9CE98E2B1DD10F21A0717E5E69694C514BF8D26760C6A22A08CC5EE51D63
+E06664FEBAFE8EA3EF4E135D2CD0AB55040AE154F6CA8B234FE0178E51D2EF97
+CCF679A44CB4BA96B481982C59847B9DD51F01AFA10259A9ADBDD053FFE120C4
+93DFF9FD4972DAE079DAEE29A0F626822AA8AADCD068449EABAE9C4E28C5C3BA
+A5AFF4F8032A501D346059981EBF2BBDD15216C2FB2F3A34AD00EA8287692731
+59D4123E00A6BBC4CB52DB45A2E8BB824F2E0310C59E864A74877AB5207E5286
+04FAE8139078F1738FDB78BE9E806E91506F92047BEAD7FDAEFD37AF16766D4F
+5B87C3A0F7EDD1ED312258C750110A03208A81CC2FE254863CB2898B3A819F2D
+CB453312073C7EA122F58EA7402EF6A7B0C729C31F9E8C66735C59EA38E3BCAC
+CC6F85A6E454C6BAEA53ACC2539978118B095E6A8ACB62DD34E1A0E626955F25
+BD3D4181C84D03DEE36C9F73279628034440970B0E4652883F787218F676D60F
+D5560B7E81F46BBEF386127BBDB53D25E68448A975CD56BE0A90FDECB7224FC5
+E7E4377C6E1F717DD65F6A274994CFE7FC19DEEFB52EC0E80B8F4A66179756C6
+668E1374FA9EEA082A9C50A057776D363F68E42CE70C176516CBCD978DEC483D
+4DCDDD173894CAB70B73187E5BBBA0E7A942DBE072F2BD0DCF8346DE27FA98D2
+1C0F6B1E5DF13F95F72715128053E9B14A055D9F688B1F4F0D2231D7AF3FB95A
+99A9211EFF34382498160E4B56B58D3CC0FD2749372883A262140C4E6714F5D7
+6BB6750934FFD3110CBF8F774728E4278EEC55AEB085CD040E4BAD9A9260DD5D
+895AE3276AFDECB790793CA3F291A5B9076094B5B7257141A512311094E29D5F
+BD714C4AD35CA15C50CD05B57340C520068CCE29BDE02F74CA30D6D1ADB555EB
+22BD634CAD60BB6E39C1A9F1A8DADFE8E86F1CD55938E4C906DC4685E758218C
+FA0191FC6EBCBA9042FA4AD9530EE7A9A7E11D9BD9AE3FB5A1C89898662200C6
+4E39E2DE83D6930685127D91CF72002A6BAC67DA45FAC0B1339E63A2DF0854AB
+DAD80196B01BC1A3A9396EE80A258FFA390D92CBFA4452053BBF6307EAD2720B
+D9674E2AED09E56CC6D3BF959A1AEE2880B065B9FB06C6132861062BA5099C8A
+03254537748B10A647F1CEA85D597A49335CC40D3864436CB8C374E0C45BE51C
+AFEA0A456252D1446648C11B77BAE6D06BB1AB0AEA89B6683EFB7343EA55CD31
+DDBBCA49EB4131D9796D5E9A6CCA98D3BAAA326A7FD554FD825E9053438601E8
+32AC8A3D146E3FAEDDBE8F9FD9D7A6AC1A896380F2762679E60FA6E763176FC8
+0A37B7C8F2A54DFDE78431694A6BFA5B0ABA0F493D71DD10CE126E4E5478A19B
+2ED5FBD147B0AC82510E0D274A7CB5AC380B1B2006B28BD56725C28744010753
+F3D80F49365D5006829FED63CB9571B219B385EFA247B213A287F8D31AC4AC17
+88A4E78E365F57B70789D7925003BB63C46296FE532C382FEDCF04C5607D099B
+FD6576ACF2CDF306EEE9E7630EABC9D0D92569AAF61833401353462890AF71B0
+5B84B2E8A8A3BB3C66F9F7A94394FD517973078F27D6695A95B43139334FCCA8
+483943FEFD671409BBB2769C8ABD0E1D2A285C3478C47BF8F0EDFC4ABF84F603
+0D887AC6A64E64CAF304E656F659C6948C180839F3F7A080F28CA9A709FEAD8D
+88BB59034060C90D2A1B932C5284AFF0A5AAF89F14D3B913E320F9F732DF9D07
+CDD357005E66DFDCC87145B9C3C3C5CE0F22D4B5DEC2A17886B73AE5D798A70D
+15F48C2F617CE0AD7A4007088A67B8FEC0C4FB4F8BD6C351707A524187ED4C6A
+8323B064EB78D64A49A5B1B43A8A1E463235B276E342F24431816EE5C6B153BA
+55F194E998B6EC925AC28831C6564663C89CE51D484F7E49765600A125D6DD42
+3540B96C3EEF890DB9EEFAF6FB97D6E2B7F7A38FF6BD4DB3D8CD86D9B61F20CB
+30982E6D29BDD2AEA0A6B449E823AEFA3FDB17EE7AF0E642B3F2F4DCDE913ED0
+845C31804134C677AD402B32E799CF89BE0C8DA94598691F7744071EDD34D136
+354212FEDC2C47725E078445F2CC6BA4B25B0E98968FBA2BFC0F3A2BF0E6BA1D
+E5D3B93CCFFD454B0717C5CC75BB594CFDD4F2669AF631077308D7EAB2EABFDB
+DFF58822C6C9EB8B8A0357B309DF51CA751548BE122F6184F8940714204D06B4
+D6749FC4B0B5C900A42D124B6728DF4AD90CAAF7A0B94495594710F7BB631D9C
+72C59F48E2CC80A917B83F955C00BE042DC2D87E2C0ED9EBD3D567DAC691669A
+4AAC7360F8B87013B37DF42D864506CA93A854676CAE3BDAED8DA7D7C8016D0F
+B7C2B306DD513F69FDA0502DF792581585D4AF6BEA4D8E38F525793AF97A9CE3
+BF875DC5D845C884413A489F420111821EAC567FC09B4517D9443FD0145DD758
+276C2FB8ED5906ECCFFACADD71EE0B7C7B67D8C7A3CC47E09641C53A94C45174
+899AB3A9D824CE570B0A567C1141A7903C924ABA53A4B5C7C390F436CB4C052A
+A2E8C6DC5C92D22B2474AEA49E3667EE9AEE712151387C3E66C138ED90ECD744
+6B93CCF9A39CFD45F4E0CDC599E8BF2CE72DE9FEDF547B68A41FC346A1436957
+D782416D6696AC8645E10FDD80D52109B4D00CD5932A5E64E2E417C6B64D84B1
+9F7C2D7C143E2876603C9D933255633A6EE98B2CE3B0D8C1A90D72D467A8D921
+4BC7F3D1E370B1330D811FA76A32154D39C66F9AC050E7001000B2C6848457D6
+32AF0F1DCFFB63B79FB9B4D2669757817C75CB265F8F86136A2CA71171D9C845
+0CE79E425499DBBBE0FE6F4D911B87A6E3CCFF4A45467840B0924C38AFC428BE
+A8F26ABAC1A2B9F1939CF6EEC8949C19C52F175EAF3B7101AF39500AD4E9521F
+8B8A82FE0584ABB18035737DBDA92F6F61640C72CD43718193599D9E987C1780
+2C37E47BADCC1E0EEBCE31F1D7765504E4DA6CC0CBDF15FE40AA423055761A61
+F441D62484F8949B2CE9B87D9CEE04DFF82BF14931BB6D3B5F702D2B7E4FA697
+803C1F44946F43E83836A5EE65613C6D5085D8843F74732B2B10DD809BBE0984
+741E58AF8CCD5790DBCCD67F292584BA2A471906D47C2575614062034BD09F8A
+E5C4472A1538265DFC62E5F1BA153A06D977B7C0726022D0F92FACEF0CB44DC8
+4256134A55480B519A066B8716B4C88C220295599C65393BE11269C8DD7247C9
+6D632523256F5F85ADE1BC40550DBD475801848196FF59D705A0D83B465388E9
+3AAA4F12C642D0F5B9E942A2D8F6F358A5EB2A553BDE06CD872EADAA457F6BC0
+78B85EA3793D0874E0488F77AFC2022271FE6205D65C1785F299C80FDAF6B567
+93DFF6C5C708439E4EEAE16EED2627A072AAF769FCD234578423B70ED44AC6EF
+E221ADB5E725ABE897F0EBEE4354211E3953CD7AD90239C1FFCA061A21652104
+F5440A1B6DC3005CA2757CA7ABC912D2F76B826F1DC80CEF9C35B3B2AFA2DB77
+690189F51FE955C8390E34A50EF33C1C822EFA66A75E01A68758FD97C5928BB2
+B1DF64078A64683C37CDDDA453154EF41FEA71E4E811982D820B630B0957DF2E
+49E5BB06A1F38A85CDA6516BC36D06BF6BF82584F6DA9923AB74192AF4204EC8
+E64AA8E25FD5D3BA115349CA83A68837068BD52A0F63B0B192534319E195268F
+9BAA0A377983203D5BEFDBE6A4F71E638F77311127742A5FC858ACC1FA2AFDAB
+64AAA3BA97F8D3E69F3B51C476287897BAEF9ABA623FEDCA07EB06561F1FD9A7
+C90BBB6B08AED1BB7F4B88664F82675A3DD3116E39471A49797EFAAF6CFBBA0B
+051AD3EE2DEB7829F36E191E97A39F1B1AF8E6002B331B4BABCC1D6A28B440E2
+6F0564E9C0148725808E9CA4302A1B50455C3F57AA425F81CB85910022226749
+3872C31A1AA269A71ACFCE623E4CB4442B27356698EAEB075F2548D7A7C6BD63
+48B96E2B9A86644C798549129F0F2E6255772FCAC4EC5DFE7E64E140B1B6D434
+D089639078A2935282DF5CBD3F1D0E9D0D05DF4C44D23C067C14FA4F328F720F
+A9BD9CBC1F322A39EFCAF585107BD5A5C18DAAA83C41A484CF7B7D56968E9DD3
+2ADCAC98FB5260D46C7BBF1EDDF0880B1CD099FC69F102DA10621ED249A27B13
+89BCE0C1F913CAB9E67462B1C7C6E71D9931AB1346B1F3E0A38E42C10A4C41EF
+BFE4AA5A61C2716FC80037A3D74A6B73608413B8369365B495E9EEE5FD08FD47
+B3E50784A852A32989A63805EEEA8B14A64CFECA4BE515ECB9281F63DF50E4AD
+899E67574F3EFF17D31778566831F1FCB2560AD582DB153772FA61136A0A5EF8
+DA17C9B104A3B51AB7386DEC1D1553299043885CBFBFF1887A195C69FC07CB5D
+F5093B7CDA7F1780DEF8060D7DA7EED67A23326CD8E2332276F32283CF0F7169
+EE52BD75B4EB267BE5FCB0B209B090009718A49C6D7256EBE0DC9B830B871D79
+79A52174C2BEE17D3818AAE8B6EB70CEBE5784293E7380AF786BF3954F5B5C6C
+BEBDBD569AA64B6D41353FD1495B99CBA96ABA9147ECEF29D69BD30813009F2F
+3421FF99BCAC2D5403D67B0DD5ADFC6174D6094C98E05D5313AA0122DF71AB6B
+4097497EEB38F0274C057C26DAA8165842A4DDD43FC3AB8DADBB4D53C5BF8211
+4F6CE0F36ED2F1EACB243D5BEEEC7611B1926FE306D2BF0094DE678A8E62F900
+6D5F16497CF2DE856C7CCE8400B39FB9D00B7800699CDB8334A4016CAB5BF2E6
+BC6F9CBB376B7F8A14BC0986AB380B8E781AFE2B9E872DD99B6618C2CD47C083
+0E7D9C2204A8B98424E76D01937F9CFE3CF4E3779650D7C2DC3F0549EEC0E9A6
+CC520FF3C45B5D1F4889E4A1C039D6CFA29750780932C8A88AB1CAC0C3F2BF79
+37F8E5596DD3303CF8B104C43A87080E37D1D7305E7308D2A3984290DF1EB822
+DFD34841FCB3F5AB7E1798B23757A3613D6B5BB282C7F898AF5891402BE52A4C
+0B13602E392D96D920EF9E0C7247962F244E4B3EA74280B7101D384B1B4AD049
+1AFF488EBB29B293905951355C4D4A4F65BF1A72907A00F952DBBB63C0DA21C7
+17E348E0BE63120324CB0E68ABEF71D59DC7BCCCB1BFFCC5C70B67BB5867F445
+60E7119A77341C19ECC2E78F6BA5E79950549BDCCFF228992F167258DF2BA832
+668CE0CFDE1AD430251A144F43A93610E47DC498C33F37E0080DB96070BBA2BA
+847009EA1242B2A36DB0E19710EC27BBEDDD25AFFDE220C5A256EAEF9D3EE785
+E863E59BFA94A109026D51F307DBFCB07E5424BFF39434E3F7580B36099A5F4F
+1D22D2DE739A66998BB4E92AE72C6688A5942A820EC85338788069E68A1AD269
+BD4183F18D16BEA5DE2BA1F785DA4970B62051BDA2FB7C6992B79CD83E402923
+15B0EFE711C05E7DBB45350199017B180CBA3A79B87815D8BA1CB39F04517499
+2821556F4E2234E00BC6D71965ABFFB6F13DA083022ADC8E75DD413871CAAB11
+C9262D553D7CB1365E9AAFCA2AEFD997AD21C556376D21FB706D26251A2874EF
+45A1E9807DE85363DF1E379460259D44CE01645BCBDC2CAF2834CBF79C388182
+26FE2A652AC7CAE0A87B501BCB4849B3E0E8D46A3090B42801AE7A97DBC8BA13
+E93F14395F170DDD4AA55929F95E30DF0BC6D5DC060087F45456B353EA0D2FCB
+03FD86FD6A1A1A68C4191BBCFB08B609971C26FFB4F1F8F1850FFDFE8EECB76E
+4174B7373CD68D78DB2A5DFBF469C3D02FFFD3B21DFE7CB9C91714220C12E843
+104349B3DDDE8CBDA5AFDB2464806B0D3DF59483088E0697E444F8698C55D537
+D25FB79FDB0F1B4BCA8BC0A91867D9BBE00B986837CF9A24DD34C67B0EB34D1B
+EF48C8FC4FA189D8A962AE59456EC1E7EB1AF384E27CF7F81F43138381D177F9
+3F8082CC9D5617FDD0A6298620E5154BD4372980CCC046978FB9CFF9E67FDFBA
+23B66124203536CB04FCAA433B9C6D4683C51B323695AD2F8B3922A6097DA81E
+6A3D4B3F340503E3BBDE64A6EF97AA88A1AF3326775379D3B8E694DCB2CECCB1
+7E6B7B0934D43B9A24F5A9BDEA3D6D9690B071FC02B310492714BBF952A4EF77
+13EFC7017A63899555D5D7CDDB25F5B010131BBD91387BEBE127FED3E0DAD611
+3452AC9527FF3A91D6EFF971666FDD84471D287F1C07C0FC5E889D35D6CA2122
+C046C743CE879EBFE2E5DC3A3CB888A4987CFD39CA40BE4EBE0174BA827E7DBA
+957EFE4453D785E1D0E5068ED5F42F2186618ECA4318D687549C23AF2E0879C5
+8516AC14F250F1A329FAB54F531031F28C3B2546ED4917BC8493FAA3AF7138CA
+115043C8C3E8F986BF0A45FAFB5082AD64A8C89647853487B44A56B1F47335CB
+BD7CBBF0BF03BE50B162410B0B24AC02564F49566EDF37EE388A8922ED5270A2
+E632D36C86B97D084A83A5A0AA4B9C14E7BE9D6201C7DA9C846205E522DDC3FC
+90FCCF6D6AD66BC4D13A373A18A001810E42B57078E36F74D0302897DA1DB125
+251327BDEDBA3DD64AF14E96741AA7E4BD3C652F350AB5803CB705BCFA9E5004
+B2FD887CA074CA9C0F00E87DF7760C0B265E69091135318B5BAE543C44CB3F01
+3F73831D36EDC9C25E494030DB3421C8FEE0E6B34E380E2FC058956858642FEC
+D50A88C7CF6DCC924A2E58E39AFBAA6E8E69A5E44A9ADFC78DAF0D4357078352
+B507027E6F9C6592605A206046CDABD9D54EA413DE4F2B593049701ACE4F6E8D
+02D1B86F6FB8429E2CEF1DE02FD8EF0D0D40D6063A7272A9D341BEC0C11FCE94
+80BF7FEB8409335FFE5E7239FF724E93F2A7241A7F524988FABFD939E2F05466
+6E71E5317A6E3CF532C4004E60ACD3B0A1A6ABC96302B04163FCE3091F2FF0E1
+AF77CCD6DB22647070692E6AEB04EAD823AAA6C5FFBC6DF009421C05B15CABD4
+69779E277E8E5B8730A2961663C6A1920FB4C4A67EEEBDA6F360770054987AD6
+5FA54A1BD681C19DCA0ECA3D597FBAD8C7EC31F3C1C46E5AE79F74B2A8A7E77A
+F6E525B313128359FB837C6159BDD3495954E9237170DA5BB2AAB0A433C40BBA
+DDCF27BE2841C8B99B4A6D92C536995B673E238559E26F468737E17BAD79276E
+89DE8852D903268B55D5F7EC0111D574BA4192F9392D538AC36481229891A689
+CB8855AC2016EF05B72558F2DAD1AAC6417E96A34888EB46F1175A19233DAE12
+8E41B11252AFE1C9317528BD564137FD5767DDE33F5A1653589BD32FAAAEBFEE
+0F7C1DE0499D8206BA8984933E922F167258DF2BA832668CE0CFDE1AD430251A
+144C3984A238349B82BD0EFB82FA41790431CA16082699BF3AB8591E6BF8490D
+A0C23DA2F68B499386161B4BD1F89A2D9A0D0344E6E5627D613BA2540DA3F064
+922470D63A67AA203E215E10BD1697B62E199B50193DDCA689F6BA128C1FFC17
+2AD2E5ED14C9849A1475958C8045F32236CE4D21C73BF7B55D769E02B6E09BD7
+F56D0235ED4A06993E91F069D500280528559FAF0DA930D4601BC0E3FE4D4E33
+DC86FE535B622BE278FD6D3860CBEDDC58F4421B683E65E160F7AECF21139577
+B58B735C1F44C5DB26022346CA7C8EBF4325EC599D755882E751A70A0EABDDD0
+41B2DBC25014AA98D3D0A708EEFB81A2C5F1549A3F0360C55FDEB881EF521213
+3C9FD7C7BBC8675CE5749B06EEBC53684706E5AA02982C49EA0FE82B5C3D0E0A
+00377C67CA2A599F1F4BA039BBB26179F2A72599892F0B28D84375718AA931E5
+FA13B644B884645DAF9F4EB0D883BAE6948FC4D1F6F1052FCB5BA1CBEE181912
+E3FD15D2F730416FC7940668F722EFB7E8ECCE37D4138087D826DD7C44A82B62
+2327EA30ECA42B8CB89314E8AE0A634DFB953DDC6288ADFD74FAC115C7737050
+4EEE4A8033548CAD41225BB627A6D60FF613EF2279B10F44600D5732F09EBE61
+4D4BFA8B7DAA0AEB340D42110B7CBF43F6489732C2BA6F48EF90BEEC53E88FAD
+DB38686EF45DD58BB70455187E7D3B4AF9FE320D0AEA175BE61D1F74126D9733
+36F2CE1184E77B7909FA1E1DCF959B811157EA5DCEB9D39AB195BE5776EB8D86
+4CE0BC36AE063F833E5B5E958B699A14BC349FF6B535D1F2F28A9FDBF618AF43
+8EFD7FB7442E6955E3B3610101E96B6074B8A224736ABD7AE08722DCE6A5762E
+DB87EA4AD820C35920167535F1F33B58CA6956EA86D005762C330B259F0184FF
+5B9DC4C278C920263221254213129D577BD8E0D6A70A9EBC54629AA70CEC4B9A
+451A119943E2ECB4304977DE19BA353F976C988D6CD724D33850E92381637132
+90DCD90865F7BC578D010289CAB665AEA6C2A88BFA33BE272A5D5AA731ADC5E2
+0D30F30CF0625DCA254C16904F704B73B6ACA8A5C76B0F25FF7E645584A781B9
+8E80520F4231D6A719EBB7B5AAF66866359A3E7724F400933CECAB393B1D0476
+579E56A2E963AA04CB9E7448068F514FD4B16D9040AD0DB47314E93953701521
+36FEB80F752F4EFCCC1041A6FCD1E20CAC60BA728EE459CBFB2869B4C2CC5AF6
+0AA4B210562480BA0819931393831F1DAFC010C3B1CEE17957997FFB4B64B2B3
+B6619FDC754155789437E27646825F500B2E3F12AB4EED2A969E6BC5E6D5DDCC
+6C53D90433C03F373B8956556A2AC81C1A1895193798896A60017B4E5A7B06FF
+4D1360CDDCEDD19C2E12D3B57A64135F3566FDD11403617AB2EA0965C54F38A7
+1385B10A9E09D504E360902F0680AC09575B8AD8AD4557D5ACFF0F2E068EA70E
+D2D5CCB9AF9913BBC020A41064516DDA5E76C3D5400158C27289E20C373A057C
+D51589A20E96B9FC9B3861D3CF617825F05997FC1E538796668F7F0E455510C6
+AB9398D0660C89E1685C610486622B9152EDE5612AB895CEE0901707F717AB92
+EBE58A46FA2F32DAE19CD9401354E70E1ED37284DDD65E8228EE7DCC9F6CEA62
+4002296A1EFE646E370390407746B9D3BBA34B5B078DBE76729D694396683D41
+25C68AB8F0DDF834DA7EBDF5C56C2B03F6BAB0D5AC4D24808941E5C7F9EE2EFD
+F0BDB775895C4746ECF87F40A23A8418AC90DFC9B58374934CF2F01C5EEFBE63
+A5C3B6BB37221F721829E5D8526D9F2407B7A0D14B76B58C9F90C924CE007587
+08206A64A0577ABD20656EE99E9FF5470C355EDA1C6D1AF3199A54D8D459907D
+9737C5E7929E55AF96F213BC6CDF98F13B4EA7FA22C7661638B4583C8E173DE2
+5364AEE57332E5E230434D4115962434C3792610A44FC91EB0C373870BCEE935
+70EF9F155C87445A51BA2DC6B6B57A043BBDDE19EB95FB1401E8AF43C15CCE64
+A657C543DA764A19610D5364892FD4D18B8689CF391A95DC4C962D8ECEA8E753
+C2DEA7E42A188D6FDE14047075A8E61E672A6496DA97D9674967796FE7671DA5
+8803170DB43BA10C7628A9A8A5208EBECACD6F53EC634C8BD5A7A63F99C76DA2
+3FB3E8BE62FBE079A436E102753EC158B65F81A1DCD465276FB4FB5DD43217E3
+25A483448C7FF5400BFA87EC68848C496748643449B0C321074BCF75D066D2DA
+2A30960687F2DCF03E8EC3B3355440F8790B54B28CA97B4424C9A8689014F0CC
+DBE03C107CCD13E9352F1098006F532E9227C04A548A84E8652AE73A8A9A2849
+B9CE4FA973134372970A35FBF96123FBADF96FBA9FEC0F407C2D4DA38EA432F0
+E7A6D8221F23B7C33CFF7B26069B0D6D365206D43C86F4FA49723381B62D0FCF
+8AD7FB8BC7A1AEE0A56BE8085D76D15EB463666E0800697188422B0051C282B4
+B49CAE5BEF89C4830CF8E307188DC83BBE06422D1C075D8455E3D5C3ADA2C371
+66118D609515FA33D5F39264ED660823484D9F0480126A334B9EFB37A1EB49A9
+9E4A07515606610BF2B74AB4A22A32B7E30DA2B09FB2012717AC3CCA0F72FD3D
+D6E6E247D710DF1F827CF41845BE0BF8AFAE8348F559D6AD28E29D5E0F6F21CC
+05DA1CE1392F29895BE53E4212079FB031A3DD15D431A70FC1CA00F7B9E8BF2C
+3DAB0BF069AF23963949DD3BF9F14F61C0D2C711322A8F87BF7A11883E3FF9DE
+9959CC5CDE05CA9B914F8749608248E964FE1C99016996BA53690A7BE8A031B5
+E8EDD55D22DF7FEE64EB9C31AE54D8964596F15509C0E96F32AB08B88BDFF162
+4618239067AB0D70008BB2ABCF06E283F5507F683A0486D3DC4FC1E20A83DFAE
+731EAD0363A7BBEC37D8AD02D084E7018204A466DFCDD5B2687F865B2AF89C0E
+40B201C368A9C12DF6EBF6890F9FE438356399B49BEEFA64B9D3BF598A13257E
+2415596166E303FD2376DB5889DEC6DBC1969B03B1A6869409543B20D1038C4F
+5F668A11764359705D20D906FC7C9E269DF5AD446380597FD35CA8D1E0553E0B
+E93F884A17BBB0741AC2E477F3CEF4A87FE664D88B56E6F9CEAE61FBB850C398
+377A8B39225223E725D41D2B5EE0C3F03A603A161713216AF97A202B9836B983
+024EE9541B603122C94655B5AFA1C3707592BD2EFE727F36708ECD6D4CA39743
+D90725B633A15B5A88BFE7F399175DE7D08904B7A508E489571C79B356EE1601
+3D5C0DD01B294BAB96A50CB449B6497FA6DEEF3B86043F15602A346C1667DC62
+5491A42A8BF5D93E242F821798E27E0F586CBF2D967E468B2E8E763415D4A8C4
+D77AC775F945CF1F96E80E3B5528D4D09E1B5E7E68CB689FB90EC4390C88171B
+C21574A5D8F47774DE3F7C17E686BC0E3B26CC627FEBDAB4FE37D8692A080EA8
+2D44F98992021217D666CAD26486FD8A4E1F4023DE11605C193016C4CF81249A
+F3DD504B34BEBB4632F4D7E5B82FBECBC70DF469EB036B3BFEB3C0EF048513FE
+8AF6E1C057F15121A5265A4B316901E61D0B6A13CBC0EB3C3590C31BC4831AF4
+CC744D505607053DAC9D14E753A4F2EACDA935354C7F42AD1879C36707754E85
+5326621881A420DBC872DEDA90B79F113F5A4BE581DB49C5EB8D42F1D3B08A4B
+47513E1F8CDC2763558C93AC71A4C6A74C6EEEA931F9FDD3391E0E2353DC2EA1
+71E90DE5650B3EDB32E84867FDE6F40B8EF9BE18CB89C24A65BD9579194C7D7D
+28F26A0D7691D33FB03912B1A02DE8D25906E82E12D7A68B20551C36E556EE21
+7DEE75884EF4B9C4BA62547347BB2E16A5F093E63A6A3EF9489DFB0110421C52
+E34B9DAB4671298B2512B7B9A7095203545C01B210A40E94426AEF2D5B015C51
+96CE77FA94318AC24FD12B2685F3282828E93178613843527E859F2116964291
+676BE4BA66F7844A77BAEC87EF5053D888D6C101B6CDE225D45316EA9E34A9EA
+03A6C950682BD7E72A81DC48EAB8684EEAB78BC994D6BFFD0B156FC492F6BD7B
+6E7567A2D26E316DFD05D033B7BB01DD0B9469C910B7A7DD6C1BAFBD1A7A62AA
+A2CB9F5FBCAE6AD23774342D788888F58D1155CD9CF416060DD63C0ABB648ECF
+22AE7B076F85466532AF71DBDA671CCABE69652A7A0E48CD62CFF14ED103175D
+288DA1003B76C9A185EE6A8152A3119D1E13A9D01E04A412631402BCB7953E28
+5FD626E103E45B6D3FC235888D9E3D24C7DC65F407F99A68AD7AAE86F2C2A900
+42399F46A27F8E97095273476B11F3538E808B0E7583C833AAA8AC9CA8A26B51
+FEE38518819916BC996FD74427C914F067479B3A4A7FC0E0823871776F82AC47
+3C25F8D3E3D79B6AC71A3913971C253B5A055B94A26226FC81BDA50FC3126234
+044386036954E9BE823B2E21A817DE43146AE4E04FA79AA91C814B18ABD2C55B
+DFE2E5B46E92B59FBD94B1C5CCD4204A19770A190BDFAB86195AB6AD13AB3CCF
+EC63A901A9B3B9A5C5F43471EF667D039985F2625EA0B5B6DB576B177A69483B
+2170CA6EF41970D2F3C7E76111744C5AB9164ABFA43D98F78476D6CEB362007A
+28C7FD516B1A9BE2D0D207C80CFC47F8128954373F9718877DA7599DE0AFF6AB
+B520C27C4153F7192208A4C38FE6455C11DE1D376A46466B1F0059C952DF4A9B
+CEB4DE7DF3FB85FBA15A1D1070FEA8787258A41CE071D9F7F959365E6642C9D6
+103231E07E3840EE7EE1AAB9583F2C7BBC396BBE656E4B2DB8C99A25EAFE5C0C
+1472F6404B1AA6039BCA9DCF908AB3F675F82FBF65EFC895B0BA816AC3DEDD86
+7490F168D3385ED50D79F4B50BA78292EC4A87C2AFD19F1F2B77AECBBC3A0E28
+98842822EE91CA5F54DBB4DA24D13497EBE63300753A4AE68381B4DD8789E1D3
+5D4AE06A051107EA4D9189800546BFC2E5F4E9B5E7F3E994D769E32FFAC7E82E
+1E94BBD0B8ACA80F6E7A468EFFDDA0F44FB32709CC52D35374C96A7C7E77FBFB
+92183A182F9A56C4A9F408613CD93421056677D71FBF913829720B6BA3BFD447
+65F438997A62922FC625AE3CF4A4D2C34A38B9F346E5FBC47E5E7C14C426F6F8
+4DB84A549211C1570CDDEFE0028FD6255685F1500FE9A95034D47818B8235920
+A92F4F2E5F714ECD2A909668841183ABD7EFE82B09F02939A2DC10D65068DD37
+4600A6ACF8B4FE9ED5B391A5D2DF077811B0CD10408AA78A9A1D1C8ACB7BB7DD
+F90F0B10B9772641973FB2230FB689F0DB5E1F8CF1FF405D523BD800A3394D5B
+05FA1A04F498C68D3A49078A7E2CB48A4322C101111524616DDC2B199CF790ED
+6262043A642D66A1500F3B03BB4ACFE6940A2A8ADC1CC2AE21BE2B99735CB3C5
+266096682A66E04BBDAC1D41C639AF02693C47AD743547B4FD71E602D9D0C128
+9260B0E12B51E1234E97E4241C06A7EF3CAD09AD5ADE65A51B6A915CA708D669
+90DB0B407F725096DEC84C574452605A8E2D4D83EFDCB9387C9BCC3D58D6FB6B
+D665CA0D2C509270C53B5EA393720C6574F0D402ACED2B7D63523757F6AE2927
+3EEACD9D5A654B57FD48914E72FC476A3D4019D08C25E59DB8E42975EC0DB26E
+FDA3A69D86214A71153FF97E5F7043DB10AECE1F7B9FD3B35074D85BDA9A615D
+5C3243045699E762A04652AF6CDC7F00515DA3CC0A55E3AB0799C5FC43812D17
+889A326B96D756DC5E9A9FFD534CD2D11B54D6326FE3972951ADB395041F35A5
+340BE770E44FF3161A635D75AAEA72EF98772513DCE2B6F20266F1151C17D092
+53A010AEDEACE01E30D3CB3FE2944C3A15D7B53DB9B54F8082DD9282BBCEDE24
+60DA6B95BBDE9D3E42668CDE87C535EBB201D3A169CD9DCC4C3C256A0965C026
+919650F00D4F0240AD2B6D0FF2710FF55BC9FDD6C0DDAE9AE9D984422D428200
+823D674B1893F033848F1F5CCD2B9C3F4951CACB233B591A7F2F4E6C0DCF164D
+3AD5763C4A9C6CE0611606F98D6C91C95824E00E0D4FA058CBDCAF4903835F15
+3170BAD72480247EE13CC02EC90B89A114C17D7BB7A7D771AEA61BBCCDA82A29
+7300346E3C6264FD726D9C0B7BB9FD97C0233F418BA417944655E4DFC3196732
+8CA6364D5DB8DCD4482272C24A3E9F25D3ABDBC8CD3907AD5C96F7A59C33C614
+D69D0A6D5AADE240AED6A5419A36CDE36ED173A1CDAD47578435E5BF76D29348
+9BB97B6DF215204753DE7C4A3FE2B2C353FAE6C7AC7ADB2BA6B75F4F038FF6AE
+864A2170296054F3EB29A3AA9FC93F8B84C3460DA911CBB3BD57F50C3EE02CD4
+3B910C9CC062DE49266623AF9AB4BB367E91B9C1D9EE6F0270868583290EAAD3
+445ADBDDADE18CCF7AFC9E18E64198B841D7824E03DE11101493975ECB1994F9
+D9406E4766C83F8A052743EE40BCA174B5CC902C816C9A900EA9398CFF7BF2CB
+6AB91D17C5793A8F9EDA9D3DDB5DFCE07CD6B383450430CF867408666C11C1B9
+D06C4166455D888CA8A3B820DB6BE101296BDF05D297C4B18A23FAE7826559F9
+F468E6C87F3B6D90DCC6933D9F1B1E4708AAF1FBBD8EF7B67419F29D65C2C163
+CD69C080AB9527A8B91C3820738A70AC169757D9D3424A0504659B24C73E4244
+80138614EBA261D18BB1A26E4C24E5F598094C479D4AACD3F8F6AA8017D950A7
+0713AE1E626011B2BD3632006ED6A30C011581BF9A11ED9F23334F187B7F6136
+14306871E98DA3FE94E57C84B899F1F5DD7E7B360743F0E87CF2BAE808FB25B5
+C822950233FA0402A975858A4445ED454DF0B009FEC9F8CA76F8684FACB9639D
+45D5A0ABBF1FA44FA6A5D7779A5031AB41EF083CC12E67C101B71642C2AEC05A
+CFAC43457B35DC7495DF6C3D1F7420ACB51B0096666727E6C21ED7BD158EA7FB
+847458A56C0318B909C36E876EA4A51D0B7A3A3F34E806A4B34666168BDBB207
+3CEB54C50F3E6E2CA990E56ED662B269929C431F13BDA571E3523E5AF4654280
+75331785444BA37F8C8FDC0BA91F0E9CD7FCA2DFA59AB4702B7721C7A3A8D012
+76AE06E8767ACBAA92E1751D496E8FE9E88278D6B1082E18664E2333A6BB929B
+7D21EC29E7E635744692A959C7B4919DEC77FA5012A3CB8D258F59BB8FB82226
+313CA83304435B1D0D5924AFE7510D679DC307E128A76B25716388C24A39C5E1
+B3C64C0B10F2B0E7A983AF06FCF09E37E9D83826C781804806823EECD6053AEC
+9EE2CFAD51447F0D660BF7CFF7EBC4AAE7AA7B2D9CEDC015445893B54729A788
+C762262751C754B17D7078E026DF89D3535C22C001CAE1DC020E577FA39885C6
+751EB1F9F31BDD08499CEE7A9B2A3369417D301E3C70CC0055BA8777786C48E7
+1D0A4EC6220EE0DCD6813DD09EB442AEA8A8F2F13427439971B8428AFE5EBADC
+269C55270BAE0FBB7520FE622C074734A1E2370B54A33F5133233547EEDE16EA
+AC1024DFA2E161FB636012F74D56C5A927A2E7001730D7CE823CA5968AE062DC
+31BAC31D44C06BCC58D737F7D239EBE3EEE1A4F981B6E5BE0AD280D919705472
+7BA157B2B027B791FC039843DF00BDD9AF4A69AABDD6C057C13508FFD810926D
+8B5759EF13A41D27D4E2D6E2102C7FB130B8642096B3D28D3B9088AD43A6F267
+35142CF5043B84665099AA896C800255029E92103BDE93E7DF94564A140D9824
+74F4FBA8DB1B64CAD316ED13DF03C99757CAA452FAE46DCDAF8DDC504B3BE35B
+72E214974B2B275CDC9CAE7B507C0A2451A7F8366FE6622ECEB154CE3857FB43
+14F2EFAC60FD1AF8E8FFBEB84FF65D8ADDDC0995B117009E9EA4FDDD391D19AC
+43A62DE7FC6144F14EFA0AF684D22F4AEA4D0166174D4DBF909B2858AD23360C
+680E94E8B190B1C6C412AA315E2E1C635618BBFEE940CE89127BD552B9E1AC15
+61CB5568F00CC22CC3338B8D2E8CBFB5E858FC71756F73D05E979D8392C29DD5
+D1EE9526E6C38D5C2B0E6B890A7DD9CCD7E506C19B6F8D5D91FA20CF96E4D879
+460DBB2058B6E41092F1256C0892105D3C833F5A6EC9D13C1798EEE3E80D9DA5
+1B1F5E7F7E9925E31B3424D3830079445680372EB8A34D972A13ABA38387B2D6
+B713D797C526EED1027787E23EA108C7FBC17D2C074997A96D246A020B897874
+871354ED9AEBB6A04871200746A60EC33D979FB64C1924B9A869DFD9A72C83D2
+DE423A5B94615584BEB0D0F8488FE1851E4D2218F93467C90463F8197DE56207
+EB2E7480E1207329949BFAA4259A32E90E3F99F7EB4E1D1C5ECFA2D925E13BD7
+D67620B5D4DBEE5B878800CB1EECA4A9775F8C77E6CB71AD1D4058A9DEFF2768
+0D2ACC6987BE974B04232D56DDA60AD2549F7E65624FBCB96CE67468ED160438
+641E71D673717BDC375CC5CF9AD095E0BD9530D515129F59FC510A6ED7832849
+EA0F954AD7D03474A6A82DAF5E1ABDF8CE3C652A815FEA0AC8E80A1FB8C770A1
+6ED7ECB158B90B51A9ED74ED3DCD79EB1589EB939C3632AE39F062E21A4871F4
+116AF38D5BDEFC6077D59FD0D2DD976526DD4C00C229D22B0FB0351DA8F89106
+4D24A0C8C7538BFDDE33424FADA3641E2404B8C540C034A7BCC8CB9AABA557D1
+3787E493E328887E50E31C015335D215DD7BB57B5D3F272E51B092C99FEB3435
+C76557B2D14CCD6F6EEC6B703F4300D5557019CD90C60AB245E4C03D01CF167B
+0D7BBBC53023A12C5B3581D8F53164FB0900929A29FC28C508A73216BA87955A
+D8BFAB05F6060ED56A9947DC9406DE7410672590BD7BAD05131676A806BE5556
+CA1B25F2298D1B77928B2565A93B23688C7D34169F443F0FB9FC74E637518270
+55A63BA30B99D6DC60796C96FAAD84B079C130E90CFC2B178FD11298B21DED15
+AA67AD95C55F7232A4519C6FD92721EF6565DA7B455512E01EA831BA264B166B
+4AABDA78461A155E6D4CD1F1355921B9DE8E891ACA3F3185433F13EDCFB0A148
+75F90055B99506F259CB9F20D81315879E36E90EE0A8EB36956A01A916E0234A
+5D4AE55207949358E88302BBA2A3FEA24F65FAF163D5383031D4DE942B7951DF
+18026092488BD47674FBF991C1D61861381F8C564B0681626FEED83F7858FA73
+ABB05BD003F42980FFC7D49BEF5212B54F35AD3A5788C3B5485151F4DEAB7461
+609D197940B5D6F83CE3CC63FD1CF93E8926EC03228E7EDE8D2D8150797D6AEA
+1A9D7AE2ACB5ACD2E5B15B0525D2D8E2727225B84138B959B5DD39FAF86A1DBA
+1C615E69E0CFD2F4823CFCA1AF4513558F46BCCF1FA2261A092EA678E099BE9A
+83D52A1904313BBD51C93684F7ED48ECFC5087552F5D50011181FE3E81C3B3C8
+5422694710366B8BFC38350AACC485617B53D056BCBDA1E967C1857FC755D66B
+98459E52FEF47EF96878D767A8C12D8630913886F1937F0B70C3A9A2A9559819
+B4786D194DA429E3DC9063F4DFF450CF263B5C9CC18EFB659E704B216471F166
+2AB779230049079D9DDB03E622B86656B1425221B68BFBF3F265B1D1A1146A91
+079B753C8F04FD8E082619C089CC36ED066250AA99949CA91F15452980D713DE
+0E31E5E08B89B0E3941460CCB0AA4CE5F70EEF878C6ED56E0810AE5994B981AE
+7B6F030E18F7DDF27BB7DA41EEA1A668FF1B7B51421F5E65A2A7FC13B7882077
+12738FD10561A78DC0187569098950EFC78B50511AE0343EA4EAB4D57D768391
+594AFF7153A7B5D4448EC0082E03D0E0001285CC46471BBEBD35B275F372BDB8
+991F57E7A108FE694A8C7A1FA5C03B6E07436B6560B2776A3F92A5534030BEB1
+36E2DED01B58B8684AA0C7CAB214C5BADC08A7A32948413F34D770D1202CDC5E
+5A16E1B7E94C4CD160E676E300BCB6143951019E9F254AADC47A42209AD8BFDA
+E064992A2C14B13F18D8048B24F8D93E71DC8F4229E8154DD6BDAB1DF5CCFACB
+550AD74DCCAE319FAC5C83038807C1CF9869ABAC639B076F95240BCDEB12C2BE
+A2C26F768EE4BDC1C612B31C7A4A924DA576BF4871314D5D009BEC8C5951422C
+3492BE918861F66CB5BD163E58651D2D017D0876F86FEBD25557B85C0A09C044
+DE8B99D6205FECE23D72A9F61619E09C929B837577AFF41983B1FA5937DF61E9
+CCA3BFE943C25C045CB3AC6F537AA03AB6FD0D5BF4C9BC3213A5BA19D273725E
+4077E639BFD624575BBD8F1BA49A25E227C1394E58DA90488CBDC82A51AE32A4
+1F185B68FD07C22F29F043E23C075C96C0B1D41127FA6F50761EAE86A2310537
+3CE92ED9CABC92642F5B95085864481C745B2F6CE7C5F1BE44F8E1C6C82B9D60
+4293E8685B3A83EAF5584395EF131769CE9744D9546270ECCCB8811C64F20588
+FD8922A47AD1FA0C6329F20906E6873997A3490967DCFBB99FFA480FF4A7B00B
+40D63870B38E4100D67ACF9EB4C072D3196F99F8E64450BB7006B4F65699D9E4
+5E323C65C3D953D33B603AAE00D70C6060927EC46753645F880BD138BCBADAA7
+03202B078A014AF3BB404CDF3CAADE7A8ED6135F0B18A7A1FC2D2BC8811D02A0
+A094F8A0311AFCFB69D89579A22611F08B2EEA85F5DC42F1744C73B683D32A18
+B86F499F1CDB6CA9AE9C80C2531A809B357CCCD1510DC8D995C372696B2FC66A
+1F268E6DFE5AD8F95FA114168C19998EB3E12B202BCA8AF453BF250BD90E89B5
+52881361091F0E4F77DDEB3D877B819434E200FFF0DD0E0604021508FD510804
+C3C722DFBFEE21F856681561CDC8C66D40D84535447E5902E8C03A525E467DF8
+744A8B6DB57E04C99BF7F56E3F54E551CC04883568743F501BB40ADB8DEC07D5
+975FC351E89010D89D826CB5889D4CDE0C57A35EE09E0524064CB3F46E719548
+CADB45B1C41F53D40B7C12B43B68A6581AD4528BBC3695BF0E44702CF2B97541
+8BA5532A898E2A5483BED8C1BBC7017F6913A305C14E7C73BD8E43A845AC4DBF
+17B1B56997FCDE6343BCF09C5B5F5940EF2F716BCB498964DB820841B614C43F
+5ACD9126970121B0F16859752988B08711D1C26A6F7FC2E24FD64F7B74BEE206
+69F6F85F8CC4417D0D02BF2477552010705ED42A089759574796775A09A959DD
+8EB2DA66990A10275D0131A2321AC2AE04CD5590CD3E0042091DA9CC585AF0DB
+96843FA11E75FA45E7C0806AC25DD3073B09D77F9DF706FEE9B9407E9C9CAA75
+8C3C211F663C3DAD02F2E55D29802D0977085415B913A00461E8A7539994148C
+E359F7A7E545A5B8C54EEE2C894A9771D06FE695CD93093DE3F1B0AEC7BCD035
+CA753E6C0C726E5748F11F3110F1AC6439039E4BA1342D2A8DC5DD600E315D99
+F16C4B271B54433526B5BCF13D238130AF99A43C6B630CF2DEE8B53CEF5FA897
+BB4B1B8F29D4835821CB15EFD2829E58B3F2115557F9DAB6897100E10F8F7F69
+5734D5B678F81C020C865D38FD5845AEBBE587ECC52FEAF3E373C4061E8DA4A5
+30D220BF02F36AB1113FA4A268B7642B3A1BB68FB346DC8A4070496CF2E27F2B
+D29915B373FF3FAE53532EFF248DD9CB93AFEBDCF50001F5A56EDC3630005730
+20C200C3518422CEF3C41D748B5A07A0EA50E3F6C38E017E41B806D9C695EDEC
+4479DD86672800ABC7ED728A7411B8EB6FC0255FDCCE0B208FA935D2D8A39676
+8284C66322DA9E2137BBB050747E7D512F9C67296CB735C4120E49E9287085A2
+AB71783B16A4DFA77B1E74ABF75AAD352DE5DAD7F7EE9E663DEED5CE3E94734B
+26CA503A20974814EE2CDC8F0BD084CAB30272E8F065218BA88532BF61AD80CF
+22E61904C92A4FCD68F8C5389BC7B4DDB6A5129B31AF7034155870747FCA1150
+FF64B719550BB459A76D859BD71981310F02B957C55D77B1D8DBDA6BB66CC13B
+296B5303BBD0B9E135B8FC0063D502AEF1F6F2A064CF7AA790BE70607DAED281
+098D3B9049E054532F7D0E0683F68416E49F71D0563B201D364E29610F51623E
+31ADA98518DD604EFE6715F50897F075509F64E999028B507FB9BE8940732285
+75A9E4DEB8CD7FAB42099205D5A88849C935E90D35CAFCAE2B01FF8AA8304BFB
+B6E54A5523EC18B9724732043C890248711496B906E3EF28BB7E3AB846963040
+79D28D41F52248D706E117DE4F0AD39236BDDF5936B95A2DB43452C78FB25F02
+D3C2215A3C12B33D86F9BFB8222C59284721E202AF56F307024F89FE9B32720E
+93FEE80FCA58A4A752A9B3B6C33B85933C0F0205C911131A598C65282F7B3635
+32DFE1B961523B0A25158AC6596F45656333170F697E088ACB6FAC5521A12456
+33FB7A71090207070B9EA26895B88672C2EFD2E1E4C1597DA77B79DBD87A4C7E
+777E76F039C4ED7978B0CC1D1484D908C8A61059B21A2B3771D04D150CF5C3BB
+CF8152ABA14FA9FEC5040D1B278B4D30DECADFAFB5D32E828091F08A979A57E4
+2CB409B95856713365755F2F57D49D8D3353FC7DF3726A2A533CECDE6F535E32
+7F416DFA727907DE4A92D008A8F4C76C5D597CF8B11D8BBC31344322597E9E2C
+B63522B554970233803DBDA852F111AD5D1A189D8A3587124CAB4037EC4168F8
+2EA40EA3EB3543D1BEED531A2BCFF2CB371555398C6A5F0D1FE9D86052E8BCA3
+52E3C8E24D8172145EF7B10571CE7A2B1C8CAD6C49AA65BDE63DFBCFEBBD5CA2
+346C78AF5C1DB4324935F474EDCB620ADD71ABF4845AF9915F2CA1F47356D0AD
+0FBAF257DF7639E678B2E29575DA15E999832969147FAA363C8C06EC0F4D5800
+5511B085E1EB0A67FA23F60759FECFDF1379E61C1431AC809D401C7B62F878D4
+2F5E5D7FAE81913EA57E6C7811B7A83CF8FB91E8663C31910979151A2DE3027D
+B02BB0809268335EFA4D67E59B58C6D9BAD063D247787282EC4820B66C7790D8
+3A01C80C7E195EEDF6CA42F8B32E1766E71357FAD6E14CA5398F536AED18CD8C
+9B2B1F9096DEE84674ABE2179C4CBFC016A8E893C28EF549CA3C0F7C816C50B6
+5FF475692317C3E530C6D0D45E4C2FDB684FC5A28E0F50E6BFE0396520497585
+9AAE67B67B37AF86DC4E4DCD5EE75D50C20457E6802E084BAF3910FA14A5545B
+B758812A0309F59554533FA55762A0903B56650D1C3408B2E869D3E55D11D975
+9587F283DC60A2707EA230665BAF8FCD560B3DF5EE5FFD826E4297FB433EF36C
+4D4C7762D08C1F42ABFC97E0807C576F7217728F913695F5FA00120C3B6B1BE1
+5CB055823E59A706B3E0260FFE7762428C740515971B4CE4375A1A9F1EC3D614
+8A1C850F338CB98DDD8A8691F3FE1D7B96C516DA7DFE48BF6D58869FEB212B60
+29EA99838BA511A88E25C03D370D6CBAD718E4EEAE0782026D405BA7A1D57080
+100B5EF88CAD7904C687F3D4039E456985B3183C918696090AAE9F62AF61BB2F
+8DB8234F076977B2016F185EAEB3B74487C81B2B64C794C6F19B2493E5C38C5B
+17861E28EC28D508C6E0974AB182380E87F7E8D7398211D0CE805938270E89E4
+21F2D9971412E29FBE30049247EC92CD5E35949E82F033A131FDAE4FC31181D5
+9186258888FA1CD8C3F2F2D6F54E1BD6BD08E9CA2CBE6D97A0696B84F772BC4D
+BE323D20B4F5AD02E2924BEAAC2769B296AF56DDA1FBC56DBE866239A5E68941
+93547D1B437DA59E2E6681FC2BBA58FDB42F75CBA1E91CDDA6E17562FF287B3A
+F6FA29859AB3969F518FF0C15C4187B5842159C81908B75A212B0C9D71622F39
+ECCC768AB03B0EEB8067F8B3A8D2C6AC69398DD92C08906D0D2154BB984CEE2B
+AC78CC0994D3927E7C754E92BBB0A7298CD32219A490BBEC86A7F7814278FF6B
+6096D380D8D49C8005730B909724BDD52F4D4B9DCDD3D0D976EBE8AE53D3AFDD
+BB926B54EF0C41B98D152797672D44B80ACD7848FE8E31D54776F9FFF730731A
+CAFDB4DEBECD7F1DA1FE2A0EFAC740A45FE966833B2BB1C79C3EE1D5137F787D
+92AE8801D352D3F80509D10E82703D5DB12B55DEA614613231330AE3C852F9D9
+0DB9A5368F52B884A074C4C4441015E906C4412AAB326B539F0EB43D790D3E80
+AE0EA0AEE1984C590DB7EE142C239CD5DDD3E0EA1BC88E523099196F039EB567
+BFB06BBB63E00E3C26FCE96B24DED8A0DA83D58D8413A45EB18A529831633A71
+55A83360304FD4175BBC50F3077109A012E5245DA950A72D479C48D67816F04A
+D0E3DC993DC0EB877A80FF3B4169AFE951EE366495F4E6DED831F05E7CAB8356
+85DEEB3A875061DCE8B6953A8DB701BF7A8A92230A89E7E3BB7ADEBA9C882AAE
+E60A026DA25D51A6CE41EEC698024006E446612825DAA2F91781C807A35DACEF
+41E99201F87E0F4C5C5F208770EA65282F1BDCC57DB1A932A2D6C73CAAA1E221
+AEBB54D3A7D5D8E4CAD5FB021691AB117144FFE2B54415954F79EC983D8DF843
+37C4E8B36D06B51FDFD86A22BE594113A00F62F7A57C0D67730074CEF8E44EA7
+FC0D28FF3E8AD35CF856DCBCE668BCDD68CC1860B3EAEAA564961A7F9523E1DD
+B68C2DD2AF5BADE8DEFA9BA347858D3BB8EB28A7C6F669AEF46EBA9B877B857D
+A39049F5887F6C75EA22E2C1A23B079D78E669300402E5DB75B1683103305C5A
+43ED712FCFFF8E0BD7E996BACCB15686CDC206BAEEF6E6430D2350053C9329B2
+21ACB437B465EB4CFC51C2F6AF138BFAF0846D525713A4FAE45EAF59536DF5A7
+E855ABFA3AD225F386F06FAA5E98124881CD477B308B5B7341714EB937533562
+B7402574ED20EEDBD321C2DE4B757895A22A017AF2795EC4B6E52A7491F8DE64
+1E4DA4A575AEB7D1671397A1B020389DEB8841CB34E59B660CAF50371D6B6FF5
+FAD9DE513E0D6D14A3980014FA109C9235A7D553DE395FA1F1AEE941D71BD748
+33CB42F7971264162BCE8112AA351598EF607BE11D603F92B2607D41C3029036
+81E1DF2371C091446F1DB0DE5F6D45CA8B4F0E073862569ECC46C02DD6D3D488
+52ED4B78CE7B4EF40AE1A59F8C46157D77C71A385C3A77DE10828C2AAA8D6513
+4C4C71FFB1A801AC84FFD82566D635CEE5B3FCB4D57C732A1312066CBCBA4B3F
+CF3BC8D6A3496230AAF1232518D7DF319B78D42537BAA87E0BBE78BA5B5C0BAE
+2F3534E36C5F26B49B21BD4DD5741495206082B647B69C9C0A9155B538C9FB9A
+A802F3002A29CE268FE9D75A7FC59B02F615815707D016DF2EFB584ADF8F82E2
+70D23A90373E7A939449FE10A4FAB74EC7001C7FA5C9A5623B07973D74D67FD9
+F40D12C0D6DDD6E89A3BA6468B6322EF1EDB607EFBD49CADFF1DC7AD838B897A
+D728B35D869CF7843B7341CD8C4B451A43766C89DEE2E639514CB1CF6E187F7E
+C5C0F3F1C293BBF681F43E8C4790E17923AC043D27230E4335502C2819D62657
+6715E6B577374C6F891DE3FE8A4A14DB003C5D21197F835B183FDC1269D70A08
+8D9395DD704764914593BB144BBB0F0AE0879CE4863068690DF3FC71E71DDFD7
+EB126901EF35FB6F71300BBE0DEED3E9122482F87852C2F3EF87B7F506B8CD72
+8DD72D69788EB48D83E3B14A73CEF43B6B84C45C94919235F6DCF7866486665C
+EDBCF387F67EAA68EC3C5832338A06AF5E98C99D2E5C078B5199A8AA5AC67809
+1C4C8B2CA66FC5A8A8DD70B4E5993274D316EFB016E99F1B57ECD5F25193F784
+022CE27F82B1EFD6EC75B3E5A2720EAC3116049829480D6726098092EB246BA2
+6C67659F7E46502B22D03FDDB8CA68EAAA34FAB40B479842E78FE1F2D86B9B94
+7A7261B5769595547371441309E4810092349FD643859A78D92C7CB15ED7A62A
+0D366836EE7A131C5F333881C1279247352449FF437184F4D7A5210CD859969C
+BA45FAED42F2CCF34A25C1D518C264BBCEBDBC0C99138A50E5C0F57977D929DC
+9CC64EB753BF98D2CCD6A88B0A67C909E66B76985E7B9D0612B6ADF6155C16A3
+1569DDF8C689DA7A3EC6DA1F5C2516BC684EEAB78BC994D6BFFD0B156FC492F6
+BD7B6E7070E448BF7A01BD97F34FD6BE425970F8C35D3B49240D489D8D2B234B
+816A3152E972EFEFD36B149E833866BC00D5B7D13C8F1577E599E5C7CBD0FA73
+84BB45DC7B12098DD865B2DE12D3184BD3E1A1F94AECE2622F721CE13377A9CE
+E602E9075C5E509FBABC9016E62D7D5AC2AB36F7DEA94F85AE991C1AFE483903
+A4919605795E6ECD0BEB239AD76BEED158DB3BE2DC4BA1DC216B2D085F23A1FC
+D58D4F8CBC00199B1E265B3DC015029A4189E4FA2BB74609861179AED58C2B26
+6EA36FFA425B80DCBD20210833F5289EFF0E1449019182C7C6A1D52CFA76989E
+CB6BA72BBDC61A3889CBC27A6CC70C03D0F641ADAB833E7EE17647BEF988B06C
+32690F55C38850EF8A01DBB1F04BF865AE4CA32E601B41F9CBFD4336D16C2F71
+0034FDCB2EFB6FA0A9802B8B22DAE7BC3650E52286E6F70DF2D05FA4283F9CE5
+23D03C847131EEF1D6A8C20BB05D99A0C4C7B1AD1EBF980096EC4AF841E41643
+0F8B440661263E45B305309DA145A55A2C94BE14EB7F4E002F281DBAFDE53742
+FCBB031310E4375DFD481FF62E84850E4576D99A8C29C89FC5B0067304660294
+A30F839C5FE6DB087505FCEF1F9B81B0F74665A45FA0AF245CD5FB8B15431A61
+AD9B26CD69B5D7D2B2ADA203EF38F46C0BA462BADF76E107548BA0552E4D03D2
+F128BD658812F666C09ADF8063C7B805C438ADBE8AE3408EBB6E82D4D3B982CE
+96C35277B5208AF501BE44D454886F61DA9E2B2064115FCC2C0B048E62B50BF6
+4A9A860C3B935EA63CF7CC2822A913F10B226B6B3502746636481D83C900425D
+DBDE628AE55448972C4AF114F730722C5EC664029A771A5F5B55B2F7B559162C
+D4C17A17A440688E63E4C5425A6F7ADB67E6217C2B3A02A17AF215D939FAA003
+D81925A8BA85A9363FC5924585E86456B993FF4BEEF20ACD80B40A1D1BDEB719
+2045D6581689406DE2CB86C3E8BF5DBA1C7EEE0BF66C206D543D9F4C412CB12B
+5098C3E9F704859D7495D9E1AD240C5C1E3E022AE56FA5BB473137EE9A79EC3F
+588762C66D9860B6D4FA7E38C9A3B7FBF5919A2893BAD39B99FEC7FDB24FFD72
+6EAE393CA3DA1E51A3282038BBA7F7FC70987A57EC73E5A267E4B959957A0BE4
+81889125A9F918B0D589B3F751335344791886B52275052894C39DAD40632EC9
+8DABB7DF05EB7339161683C3F4D34A8751256D9D4B1A16D4D3E6BD3D34FD5F89
+F09B25F78633F8D269EB8BF7FB2277C35D79E4A11A816466C949FCB88A21E889
+779169F0062A210CEA4E821067927EC46753645F880BD138BCBADAA5A98F131F
+91532162978DD1B835840FEA2A1D891333451AFFE12EB1E2913B766CA2BAC3FA
+555CBADAF2CBF6B2BDC0D76669DBD8FA9A0CFC2D221EE4C0BAF1C49F2B4908AB
+0AD03B93B95EDED4942299DD2D597DA586B08EA6373ABE9C77E57EFDAB737460
+3762EAAA72B0B40EAF7BCA35EE12C1D116DE33B3B49CF35879D018730FD0603A
+CC28C03FD5276C6CD7F3B16D23257DECF0974678EA5ED2F21B65DD5ACF4BD1AF
+9BD0A851B91D5A4FCD68E10641EFC185601B667A6E45E7BEC2B37FDDE4A8D8E9
+729F0E38FFBE73258845DF555F315CCEA349DB71A2FBA748D7A996664334B7AC
+FF3C578C63C2AA366CEE4CE97F5A77F9647FDB23B15A23CB69A0D45CDD151E01
+EA0EAD070C7B3E0DE2F1E100FE71212F9431889114DABA7653F2ED6D98CD1874
+66D7C1A5CC8038C6B9F507C9D053315553F3C5C3BDADCF757A916B8489770DB1
+E2869476B1DE3A60C40366E8213EDAB05A7EBD5ADDD74775D283503D108AA5A6
+DEBD8BA2EAB53160E97AA62421D6156854488354CB89499101C737E3D0CE9CFC
+16F7D048955B1E11897E08EA0F45C8387A35DF5272A9ACDA40E42629D2357C95
+B06E038DA360CA42EB44229DD8C58D500D42728C710A5E880C14F356FEF1BE1F
+A788335EF0647D47D0E9415868CEBA08135064785DB25707F42025C8B07931A1
+929FB529C8B61A2B0975D02194127BA500ED60175732483FD711C81BC1636D6B
+4D6D280B4B84778FFA7DC977146AE8B29A6202ACFBA635A73EC67F26C4A36894
+C4120C6ED2862481BCFBB63EAE33B6E7DC3B63E29661537A84CB9A7DEF9890EF
+9F0C943861FEAA6E2EE8957F58F65492571367C745F2E433CF9879B17762A428
+C78744582EEA3D446A6EA773D06645E292CED6B53805D9798A83E2D0D109B46F
+002A6EEECA27573AB03CB34BBA039100AC6754914FB62F3E2E7B16FF53BBBC00
+6E3D9B0F29434DB3C5E1A64AA094FE3697A275D68B3A674D43404E33F99B4C31
+CE58D95778987AD17F6C984EB17C8D7380386791FB03947AEAD6D9670DD996AA
+9FE4D4268A3FDBF8F1A99FF1C6B2A4B0C95CDBA6575225199CC9AD11D7A02810
+341A3A8C8B0F4C80FD9ED2073DA19649D3DC8F1508BBB0402C46C560B4DCD8A7
+C3BA37770635A6E525A1DD59A7714FD277E51AFD1865C4D67DCC65B1B80908CC
+7124F90A3D32C681D534E33B7D0E746B9E228481337DF5BD2ACFBE493F67B9AA
+F6B08F3DFE44C13336BBC3B0D62A6FE1B05F004BF806E126E8BB23BAA5A113EC
+30789CC79C83748C69E155CA3DE0B5B929DA49943BE06E64726A026123A67C23
+93DA55F5D192E986C13799EE96BC5699F428C6E152DB882E6A04AFDB01F19ED4
+CC45249551719870D8C39D753DA67080EC56EA6E8C76F347CAA464716A6EE4AF
+C8DA709CF16170C6D02EBA1FD4BFE7B842F55514273D3033AA7C51ABBE1A8512
+6BCC61FCA1F3C0C7A0C8632D335EA851A904A8843F1D7D95E8493C9A656756BA
+F7DF9FEDB9745D3C261D54E2B732EB93387B9798D38FD9B3C5BFD80913812CEA
+CF4B99B96E25C2532EAAB15A1DF19542C566E20FF7B31CA96778790BD90CE55F
+C5519485BC4D9451748C93CA037E2925366D556DCB64DFFBCC7DCDB9DCA1F364
+B962F9284B98727322FF4DE1DD7FEC0D620954282B796D5A27889AB838AD729B
+CF67B61030075F29AB64E3BE2B9C947BD4BEBD5DD757838B11D73DAEF2B09DB1
+90C7FEB04E9FCED1732B9C41FB840BA5246D09289912A16F5DEAEB32E925551D
+303CF60DA116129E093A4BD770B81687868AF69543BBF26571D598A186EF7765
+2E37D62C05112A1F38876C37FA9CD2A2E69F6FB750C5C0DD66AEACE8FAB97CDE
+2152F79150A2D35BD4972BCD3D6C5640CE675637232577CFF8DE0BBAC2E7ED6B
+6D8101E4C25F29728C915EB3B84420F930584F6CEE2F79C3A25D6078EE78CE84
+AAE3CA418C65D19B6A22F4D677553405EB0012DA605F3D89CA219E0DBA607EB6
+3DF5593F444986554D6AF89C6BE195E839DC05FEC3A7860E12C7AE7FD0437C7C
+06DE167851E08137051C93DE611CB1422C44EFC191000A24ED386432B705B75A
+6380C72551C7A486F2FB10774148D2A9897C8C739458D961A4D24C8D14E29758
+2B53D33D296C2FD8DF182555028F22F5CF354EDBF12744AD09719A72A654280D
+93493540E3BA9DBA1B5CC4585AAC55486089CBF1E7EF6064E5F49B58CDFBD745
+717CF8BF521CF4C2A5B79A056988BF0660DD7D28D31E9717FE5EC1A58835B6DC
+D722CBD4FC9A358DAFFF6A81B153D90E146B6AAA31215E9D3DD72159262C3374
+7B309F4EE257802C8B7EB292D0E4EC43DEA2D32AEC4E4B08D435FF16B052723C
+98EA707A3D4F358C72F1E6840D1861C8E68875E262A96BF089B9DBF19AC35FCF
+785FC40ED230B635C22BC4A926221BF9B4C2E48EF7C719AA23AD58CBF1C26D89
+C94BF827FC98BF21FC030D0A842ED7B831500E061394082C833D4FA8465872EC
+1B63B4D0E9FA93B4414E6374BB3D11F2E8504356A2F937CE3CB7B1596D3C5CB2
+412FF8507620618F065F7CB59372E9F2E91C8AB34CEB67C28CAD87F5EEBC9D55
+DA7F213B7805C3D1B209D427F39F0D8B48D510EEC5C243E0517261B89ED81715
+77C222CC43D334013A7F77D771E3936A179FA26B4872B21DD42E7014E6800E4F
+48F69A4193AEEFAF715ADC8233C2AD6D0AEF40011A5341F6C525EE321BC26FA1
+0A1E1A269E643E8CEF4B2A42FB8BF13D0E07EAC70A072009EF4FA704BAA0D492
+58C371159F0D61B7E1183244BC208895C215D70CA46C3C63156FC8209A98A54A
+BFF10E364491A9160BEBE391C8A272323E808C479D0BB530F995DCD9B3CA3513
+894802380DA2C8DCC82D83CCC37BAC89D31941693EA8E66FF5681E667C47051B
+7C34BCB31EBC40F0AE1180AD122C099FB4F4DA5F6E267F56686B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%BeginResource: font SRDJUK-LMRoman10-Italic
+%!PS-AdobeFont-1.0: LMRoman10-Italic 2.004
+%%CreationDate: 7th October 2009
+% Generated by MetaType1 (a MetaPost-based engine)
+% Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).
+% Supported by CSTUG, DANTE eV, GUST, GUTenberg, NTG, and TUG.
+% METATYPE1/Type 1 version by B. Jackowski & J. M. Nowacki
+% from GUST (http://www.gust.org.pl).
+% This work is released under the GUST Font License.
+% For the most recent version of this license see
+% This work has the LPPL maintenance status `maintained'.
+% The Current Maintainer of this work is Bogus\l{}aw Jackowski and Janusz M. Nowacki.
+% This work consists of the files listed in the MANIFEST-Latin-Modern.txt file.
+% ADL: 806 194 0
+%%EndComments
+FontDirectory/SRDJUK-LMRoman10-Italic known{/SRDJUK-LMRoman10-Italic findfont dup/UniqueID known{dup
+/UniqueID get 0 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+17 dict begin
+/FontInfo 9 dict dup begin
+/version(2.004)readonly def
+/Notice(Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).)readonly def
+/FullName(LMRoman10-Italic)readonly def
+/FamilyName(LMRoman10)readonly def
+/Weight(Normal)readonly def
+/isFixedPitch false def
+/ItalicAngle -14.0362 def
+/UnderlinePosition -146 def
+/UnderlineThickness 40 def
+end readonly def
+/FontName /MRZPFW-LMRoman10-Italic def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 69 /E put
+dup 77 /M put
+dup 80 /P put
+dup 84 /T put
+dup 88 /X put
+dup 97 /a put
+dup 100 /d put
+dup 101 /e put
+dup 105 /i put
+dup 111 /o put
+dup 112 /p put
+dup 115 /s put
+dup 116 /t put
+dup 118 /v put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/StrokeWidth 0 def
+/FontMatrix[0.001 0 0 0.001 0 0]readonly def
+%/UniqueID 0 def
+/FontBBox{-458 -290 1386 1125}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0525392EECAC163E584A9104D99AD0BC
+1B1844A0E222653FA481B8809B26A46F4C483A5D7E95816EA6582584156CFEDE
+B994ADCFF4645140E3617E4D7E1B0E4541CB9F562E55829B4DD880AABE2229E9
+4A9FA259A734D29BBA91BA1E2055CBEA4339BCBFF98D32CEFF11F296225CAABA
+DCA10577A5D431B714726C1278D8101ABD1BD8D0BD0174FFF9148F8C61C241D9
+2AD360A28616CB4A0670C1BF13E4018CA53FFC8B28E49B30E8002A140BB230DF
+940316C3A88DBAFEF249FA61B55B4B56C598D4266E12F7B0F006143F55F46681
+A0E76FE1183A772016AF636A2B3034E12B12BBEB3C227DCEBB83986A004EBE89
+2D913439F0E10163A557CA6657B435E52611E8404129383B1A6857EC4B4926FB
+C6A2E74782F935A3FB0FDB05CB18FD8BCF8F1AAFAB72C03340EA56DF72DB59F2
+1B103ADCC57B872E7AC079964DEDC0D0BA062E3909C7D7EA8407C5D92051EA96
+76AE0F81896E3D4085CF47415EC18153AB906BFFC46DEDFC1CDC2ECDA3D07871
+97F6B4A4B8935DAE4A24CF479E5F93A4D1C80CBF61ACAFAC97F4CB46501B7530
+44421E3D88841F613D42612F738101469C10D7D537B0D4D39296A9AB3F132DA9
+A3B459B0F850E2811A6A83947BD5840C06145EB2FB2F57809E120B983B414233
+98E4973496CBD3ADA7B5AE09498C870396FAFBF91AE0ADB8695D003366F550E5
+F5FF65E7D0109CCCCAB8C9822B2C46C3821C06EBF5FD03C11BE7C7C2DEA6D331
+1306D1F3DF31BF4BA9D145448CCD5CE52177724C3C7A1B01D39848BAFBD45097
+2F94109C077B406B8E33B274AD9FCEBEF0812AA149D3D37F02C28000206742E4
+3D4297F0974755443E95B9967D2F3E5CFEF77E1BE7FF33FD7FB8B81465057DC2
+2989D3ACF41AB2FDA0FEBAAADEC2A0730692B12652C2BB9F6E96601B1A789BE0
+415F85CB8A653CDBAB242410D8AD167644497CD90BD0962D625F267AE2F88DF5
+4D24666D0E11A19B0B169E1B130678D6AA963FDCAD53908D5B476BC8A568B56A
+A17A718F13C71D70F35947F9268EF5D89E26850F4BC9BC2AB1BF8609D3A64D1C
+43BBB187FC37B4DF600B1126F59D266F3957F3BF373448D14C24BB0AFFD92B76
+CDBE1E10B3FC037552ED74045C08871D70C0C42D4A1026001EBE0BBD0D9D3FC0
+0A5FDABCF029A45C23311338A2BF06BF5B745E117F0AE99E24AFE7490FEFC3FB
+321996E0CA919B90DDBBBC078997A0B4ADA48C0DABB0966BA0D5ABC547E4DA72
+A975945FBB64817E0999C568351230FD97AD81FE9547790DBA13B4BEB985C3FD
+CCDDA3D04CAFA2AC71B08BD3851F0CE66E21D0A300143F7D89F5A7906DF6D7CC
+D8D4664BF5BD6BFA8A80D7CD7FE113BC618D2B53E186AD5AC315BC0EC15C4B83
+3F8EE848AD295B7FDFC5CA0714E44A60CA50547C4F276566523741A743A9FE7D
+4393C65279014BDE76C22106CA436AD02255A7689A824B564B699D4851872CBC
+01CEDDD6EC46527591BFB94442A0146D8F93A35D8AA21F65591E8CAC11A84DFE
+3F09633B0FDA0643215956E92AA7E3D696B97D6C8D1A7E9F4CB2CE8882889E8C
+28FB81CDA82C8BF15896A7B18346CD1F7E80ED30D4D214356F2F45DBAEB95606
+10E8BC8794666459CE083EED6CAC66FFFA0F1795731A69860E393C9CBBCE9111
+A8912FC701E722D7FA3E8802243901F1E0386ABEC196EF729BB5BF404B88E88E
+169AA5732CD54207DA55A47B3855826396F4104A49A022808893BADF86EA6566
+40B9FD8DD7D1F131D312C2CF747D35FB85DE4C4B520EDF15AFFCA053668051E6
+05E96825738C4996CB3305D85C945732EBB9C002B79F685902D2E79B00B9EA54
+4860D688E9CDF25E98769FDA84FA98DAA559EF562670AEF2CC724BEBCE5172AC
+D5C2F51786946DE562A162AE5CFF0CDDA4763AAFF2692126B4FADF5DC921305B
+45B1B8FFDE2A09CF6301F485C8B7DC2BCF44044625B5863BB09F2D2E49EC313F
+AE1D5F0AF69B7753771F4B609B835A6293782B98DF6D6112200342B20B1E9930
+9ABDC421B136D9681EC090BF144C4B1DEA286FE90C2E836AC107BC883A335075
+60FEC3EAE1BC2591A87D0CE5AEDA30DA4F11EEEA103137618133151C8AA138B5
+9EECB77CB5BE8C9A7418389C6BDDD23781D69EEA4B6603E0887ED037B1BA381D
+130F9809FA5C843FF3AEFF7F1C8FF0ECEE676A74DD81E8E884D1C010153AFFBA
+FFDE7DCE1CD6F5E09E418B68C427B0AD7AAEC5E396514611FF3E58422F77FEDF
+4EFB65BD66F51E58627D5E2622D22B75FE01501A8E798071CA2F565D9D9C1493
+F2A9A9900487DE2D38AB7BB0D5E9A9413FDEE39EDAC35F56A3644C27673F40E0
+2DCE3037B06DD775397C844678989C902067EC814CCE9FC64AD1B5758927CDB6
+327E76A8D8C8454C7E9ABD8003091B286BC4C0FEE3F6F9B0C38F639E7A626552
+66CC6CFDEDC298DF2EC7706E9F77C8A04B529CC5FA2D271677B03D7B7109D7E2
+882951375BF8E9EC27C883D1C3166B2121ED6639F9981B91DCDA1170FE1A1018
+90D0D0B8968CA4DF727B3F95D364C838B4224618850217FF6574751744962994
+57BECACD36404D97792671A19E4D51F34A07B29F01909B7B03761FF2070CE105
+4CFFFF5DA4728BF4CE1D892052701B48B81F58F6B87FDC6F26F129B23CA3D345
+E26F3F7182BDDAA4D32BE720FCF55AEA0E7CBE23CF6D927C59A5807D2694B4B6
+E2491256DBD49728AB2F1555042E52D5BFABE9C7CAA0CD72D2269D74A4ABCBDD
+E3DD98EAB24D33CD28B2A6342E7FD23E1BFE1487D82689119BB85672D42D3C71
+B5E645C82E92F057EB5F859BEE23DAA958142EEB5128796E46CB0AF4B537987C
+2ED552B37D84A61622FD0636EA28FCDFFC002E337F0805ABEC524D1EDFEFECDF
+6B1C287FA48581CF4FB723E2238AB55C0977DF43E91706ADA1B5B7C7B719C10C
+5A1B5B3D54AE37DBD29CB89F48CA3794406CB57F20E678DF666EE153641BD62D
+DB9C5117227E44F8CC4B092D9A5274505C2D52F322CC455711C0147CB76F4723
+BB02264B103661B2D8DC640B8F2494EC316A5C574393F75492250E4CACAED592
+2B324DC34A0F3D59D88DA65F8B885ACAB516EDB843054B714A3AF82449F3E0B5
+9AB0006FC4052D3D96A3CE36F0B700EB6704E48BD3E0A0E5ED705C3F01CDDFED
+987C8BA8B72D68CA6B490E990803BCB54C2D535A0A6A48E0941628A53EF7B1AB
+A7711631B5C80138263B8E0DA1FCC4238D71517DA1634659A74C206BE178320D
+01B4DF145D6DC515C88CCA37A7DEA590E5EB0FD33434F389C1A723FC6138CFF4
+C805BB21DAF9EBF112F30C26B597E78976E8299818229EF4C058B2A02018ED03
+A84DBA6AB0884C5D19951DDC5FBB8B7C18E2A7B55A71827007D54E603D882118
+FA6FC103AB903AED90A1F74937B9894F811BC6D7D094E9EAA689EBC39EA345CD
+F83CACD2D870186012B232956C3EDD05BE74CC57E6AD93A6A8549ADEEA0BCBB0
+2A72EA85547426FB8DCA85CED8C179E8DA15A08911EF722C5D131319C2B08BEB
+451836FFA20A22DCA93D1B2E2A253AD125B82674AF983FC223A55FBF610DA527
+65CED0D79F987D963CC392365BB3DDF7350A2BA9CEDBAEFD14FB9E03BD6DCEB7
+158A8BF35603C6884C1EBE568B4DD7BD55A2512D895D3A9E698423B4FAE07995
+D78FD99C5784B2B7C7C509E9B93BCC2935C4E400942526F12590D8A239B8AC70
+E319262AF6A417E613DDD7AB84C2DDCF5DA987F328DD31A1D98F1F7053697D4E
+35670E7C5D5B06BEDA9990729C75B5BA3DFD65E2A49EAF986358B661FF1620D1
+7527EF0EC2614EFC3177E444FB336DF35BD4B32289F7FE8C66A6A82D7D756BF5
+898D787DF69C8F4A75854835F1D093326B5895864D09F4FEF9ED2417593C5106
+1309D2F9A4742DCB07FE35FCDD6169645C59195984192F994AD63C130BC8AA63
+37BF404B153605402F14B54551378F52F29CB7D04C97A8F65464577DDFC461E6
+ACEEB25CAD1B04B7CFE634517D4C7214E2BEDFE7B9965171FF22F317E195F524
+CE9ABCE9B5DFD6E935B1D43771DF39AAD3E69CFF8E3B0CE768240F0E8CE9FF93
+9E4B1A636566422B60D28A6887CEEE576D4111DBFDCFE9B3458F2727082B7236
+59BE98EE64343BBBB0B662F44D186BDDC32017391003DDCFA7A2678E64396CEC
+E7B96908E28791DA19968541E940E2965DEAD4F76711CE6B9D74B833050F0907
+E3B61B9DD252FC8B15B56D7AEE5FCC71A923A3FFE140672C6445756E4E43CA8A
+A6C934ED48D2A914A550C40C895150BD5CC4DE5927CF37D594B92B453D050C51
+BCF03328E2AF74242014DE38609AB9B1AA13583F675BA045A8D89AC58B77200A
+09C675E4537957BF196DD4A7A7C2596DCA5DF89F901B1FF3201D2A49483F92FD
+BCEF4BF28DD94C99136295744B66327E4D7554EAA3E9B6A34480102661BF79A0
+F1C27F54D9D00AEDB6857E6C48ACFF17E976B3DE3BC15BA502F6F1BC4B458B09
+01955D53D70756AFD54C0DF38C3D61071868A4CE3AA759EBCF9374A4F388507E
+B1C5911495DC5E665EDC06AC75A447631F40083B8B89D365F9217E80AB3606D0
+2E17537FF3BF07644BE345E1989F01BF6F95C6BE6CA909BB3E12B33D86F9BFB8
+222C59284721E202AF56F30706809BC2F6DAB63CD24527A0A6581D9F37822780
+D96A595A15FEF99955886C444F83365CE41BF7BDA5157CBAAB355463C613BA7B
+BF902A1912A066ABAEAAA44F81687A4BF6FD741603D1E0E18571D3DA62557A03
+76C2E71624D1F43168F9E6EF16312BB687AA3EAF0245885C5CEFC484CEAD0BAE
+965DAE012540D9DF5BDE9F4F5D02D46BE55B4D673236CD23775C4D33214EE977
+154927F97628D615556E5D82BB9E05390DEEC769C63967F79359D1B291FB830F
+466B96EA9E36FFFA2C3875C789CFA650EA7671692E617A6DC6D266439974A234
+EFCD5B6E0E95558764FE090A45B8D17CB74BDAA4BFF6DAB5380CBF6172F37CB1
+615867D0EA3446F4FA176517141B75FA51F69D54478AE9E39E618667C59EA499
+B7081A0844B6DC10555D27819C8F969FC41A37205C97F4E2DAE9A904C4B300F4
+0759A2B41843748F2D5FC69030F31EF22D4E33B72BD8ED29A7252F5D38820C69
+50A8B323B1B8648E3AFEB8276F2D1CF14B3AD58805DC0020DA959EF524B8BE47
+F16C0A12CEE2A2D16FF35C3D8F5FD37B1D57603AF1ADAD3766FCB410492714BB
+F952A4EF7713EFC7017A63899555D5DDFD6EBEF1CEA0B66A6581C8638D5F4D4A
+1CE333DEF60694FF3BD138B0559D3E5887B7EA9C9C54F8335F55CC352805A0FC
+41A267943125A76D7886A4E6E5F674F6AEC8731CC1EB7E515D7ED2B1A30A3D1B
+4C852865F417E9FDEB24F2D80EB5CC9C2D3BD64C29728FAB41BE31F50E528790
+8FAA63F7A90AC16BAD16D41CCFCB9F98E7642A1C3B4C36A1EAB57E3D94961A53
+267319F6515B36EF9E123675669B41759DF26FC036EB5DF267133BAD6D6F8A9E
+421D2BA57F515C4274980E7F675A7B7D4DED551FEE0E0E142980C851690AAEAF
+4A1EA9649BB287AC03A02AD8AD6FD71E0A16BC974D8F0867DD9FAAD38A467B4B
+AA4582969B4128A52251DB3EBDFA8F59FFCA5E7FC82E20F4BB8D82FC9AAF598C
+88CEF2A15D6B13B95692C2467EDAD66DF3B254084F007745889B9F3983211CF9
+64849979831ABDE24AABF7BF07C8C599F051F8181FA2DA8EB6CA26813E9A8F6B
+24CC94A37ED7FE37D7D03026506C28920B8F1106F98799495DBB3A05C04BD649
+053FD29380E648AEB22F4E871755911D8FAEA73E35EB7835FA1C6F1A794CF0B1
+B98E14B1CCE43D91B137EE909680E472B6ECAAD0E78C357CFE3565DAF031EE25
+D893676DE5025DF6B1B7F7435B508C0FB63B6F6E5679D2432045BCBDFC30879F
+0B71A41ED28DC1039C6B0B01352665661FBD6A27FA8F6C4F3FB28AF32DFCD79B
+8B834EF8E02A818F8F3B0835719F209F34A9B75C4A2F16CD8D8F60C0C70D08D1
+CDA3A5A5A5C06132E3F92F9A7DC0AE201544DC7A395770820686C412BFC78C42
+7E8E051B99E95D205AD9D64F1E90D3894D4E5BC8240049B266753B194C29B931
+3D319BAB76866C8A62B4D0BBBEB154A4D9849A7CE08100DD430EAC9889FBF269
+C4301C5AD39C601FB86D4090A52D80751B8E0C9251DD4C68226F267C021CA4C0
+E99CA64AC55083CF3D5E1221BA2D0ABEFD2BCEBB3ED6E586340A60AFDE81F65C
+9BB3C11F8E1406D0B11F7745CB4039684A200C2A29C34AE6255BC79B73AE14B9
+80A7C357681FFD0487AF093B263945EF22E686C5BBB2FDFB71C208FACE5EFB3B
+38138891E1078160934A07D13A3B9C6AE2846A981219D0F4E0797A9901190817
+2A4DBA01B615E343052EA7C674C35A01F2766CA8985FE356AA5752B7BBC22749
+0FB5CCBFBE146B3833AB197D8416876651F2BF722DDE38A0F5E384FA57BA0048
+8A452A3F8EFD5CF0A634CBF8E1E428A8288DBC74246B8651E514F0FA1598A1DB
+719CE1F1DFC11FDADE88531ABD125E365B0B609553F3F38191F22AB2715D0056
+754DB122A82EEBEE84BFF06FEF70BFDB76562861F63E8753A3CD6423618D6735
+7C3F24053F53700A9F883D38FD402A169DF347A47C35FC09EC8A03DD56D82B19
+96165646B77D6A534BF513B94EE106895A30162B1DACF4EE26714DBC91C78477
+FFEC9CD54921E4DDA13BEB2BA60D859A8F00B070F897023469E4161CFD43DC7A
+7B3A627BBD2A9F3B24C7B44426399A6F2F6CEC063B604056357BA399D09CC2D5
+A10179A5ECA3F81560707F6E37DD6D1B9DE5FAB1CDA68C7673B94ACC38F871B7
+DCD133019C4ADC916AA6F4F5FE8A642DA2E54F42264F99156B434F0943F7F327
+6BCE10C7F79219960A332B39B3CF9854B9D1851B39AD13DD7CDC56F451599B0A
+FF3E330FA522150499028CCD23E3B9CAF78A6F846A0D499871CDD61B59F05891
+6B38ECDF17F19FE113DC56FC33D8200487ECBC6D8D0A06B661ECF14094D73FAF
+A1A390EFDEDE332A41E7B98364A301C6634106E44557A199C549E677C69648B9
+86E9245678DE079A8D9CB1CE8B1487988AEF39D787BDACBCC76CAC31DF4AEF77
+16695FB6EBB2CDF0F8BD1CA2AEFA9449F9FCF60FA9BAA37B53635F5B7AA75EF7
+E75EBF1ACEA91566A969E4D1175082BE3437ACEC91E11C518BD2039A5C899E8F
+DF0F358158B5F1C9C914EE4855220201E2C530D85F28D8B931B6A3074BF9F40D
+59A49E3667EE9AEE7129E139F8E64FC5F6ACAB079419240001579068F1BEB921
+4E15807D06434687FE13EA3C02F9DC6DFC201FE269C7D115824F93F13C778A1A
+810DCD861D957A684042EFD30CB5D9CD8883F6AA55896C6B12A8A02DB6BB8901
+34E183EA8528DA6EF5492957F0445D9266F0609340B1D4A32A5A18EFFDBFD24A
+E2A0625E49F1892D3F59931AA3B9D20773CAEDB6104B42EC5840AE39FDBFA600
+D9500E9E9A9FB27973D2F97655B857528CF96B2CC1AD2C93CA7D6A339166FE86
+1704728101C85D8739C1357348672D987053EB26408EB29615898F88EFEFDC31
+F959D988EED4794FD94C60BA480042712464E28F39C92AB13FF3E6FD3D068C97
+4BD0DCE3F15279243B056E926604EB295695F02209A9740CA852914690149BC0
+2900C052190D02B72921E4A82A81A1574FB4312031D4DE942B7951DF1C5C60CE
+0650766E29A79AD6ACAE003485A4C21B389F41B80692FE3310E52B775E59EB24
+C3A0CD11AD8D92F7626F2F63BF87271B5DC4615D281B73F4DA92823A4FD663A6
+A7EC414E0B3A1A6C53FC6B951CE935ABC955B8194B5E28E715C6AB21674E82E6
+B49A5DCA8AEE53295494C3CF457B275CF0E38D7D0FCCB303A6AD3DDFF2F57C70
+4C417872F7DAB6811B1027FDA86CF66E032F1B0D4946157F7DA080B1C200EA36
+2277C7562AE7CF8E481AED2F42633A459A9DDCCF293B2A872B82D0878B22B609
+7C47B3408AD4111F61AFD3AA7F1E59FB78AA49CD67B4F356D4C5C2C7149C3EEA
+0B8A48DCE4D6D5D0E5D5C76C9AFA20283387FB739285CEB3A2C84363FA76D96C
+3F378A95A71378424F8DAF0790CD33564EC4A4B2460ABFB6ED4492E8FBD370BE
+832CF5FE99D2E492D4FA8CECD4026F3FAD0BF2876CB1550015611B6F612677E5
+BB1B9E7167A39835BA9778BE7249DEF191E4DE701CC9BA74B34378C71F56D414
+1203A97134DA708E53B6F7149379DDA381E0ED08495262185F5F4AECF645FD86
+EF374A90987CD149028C0193B966BAAF1879D0D7471B68EA135225157DBC4FB2
+6EF464630E2E55C20F500DCDE8D0D4050278151B4E70E57AF781BB2F85B330D0
+ECD4F969AB2868B391D31EADF8610465DF3E58C716D4CF801A88960FCE4C041E
+6ECBA0AA6B857291BCDA9B6705F0B062A78EFC65E27E58A3249B57FBC99D4568
+025D1C87A7E6E47533DB69CF652309974B99C3A0363AA5CAE125EF0F3B74E355
+60D21F8C10BBB651EDE7B5DF05C844D3978F8A4FBCC99D588B4687227BA12221
+EC01667DAF458F8C2F61D829494BF1937BF643F262AA2B647AFF0572A5B75394
+7581A87CA780D69649C22B07E4CE2F7EF36A07DE855625E24F42DFB9520DABFE
+B68B39590D23CDDA060F90972A0660FDD7078EDD55333DCED2D062DF210F18EC
+A36A75300F6069A1266A787DEE065DE8433554B787DF56BE063C65C99C944B92
+23F78671547F4726BF050E3129D1761A41F266E68AD164300C8B38D25D4EEBCA
+093C6991FB0CF76F9C62A66A397CB2F27A9C0DDFA0AC56C291ABCB768C9FC1DF
+61407916A7910535D016FAA1326EDFD9EF409D549D1C7B402236C93EAB0C2125
+D125928E58ACD04D5E83F1F1CACEBF7299500D38F49F83580D7240E7096F83E0
+D2E62F1C09E6DC9C9EA5FC93E21517EA9DD8A7757BA31CA0D97D8FA881C188C4
+A7F3D00297CC6C8EBFEA08384809CF652F1E602E7F27C2DE01206EA0A9CDE765
+E680474B9F978D9375EE8C9487DB5D3CEF127DB53383AA2FFAC31D3058E6044E
+AFD1D5F7AD07EFF1919E9BA90194E24A69649F0DFD0046D57CED6BA0612FF316
+DB41855733B0CEBAFBF72CBD3CE299634CF91C45816B9AC1146B1BB7AAA74FF9
+2F4273B368E93E3D0CB6910A4072C474AAE956C8FE085053AC0B43BC15341E42
+E6366E02817082BE6FE0B04249A48409F69566C84CF5342B479A465137BD8208
+32EE94D79A8E33ECB4733D35471A43C4AC733BB92B64091D3187C8FFB93B7E02
+1790A1443758736475A38D8E5132C5733B4A79E1ECE86CFC8D7D71D73F8FAB6D
+0BDCA8250D0E561D7ED52753AF1177739126415AF93E540BAB65FB6F4D4A3F91
+7CA5F4BECEDB9ECDCDF94C70486498B92E1BDC9410413C25F8D3E3D79B6AC71A
+3913971C253B5A055B95530F8F120A45FDE2CCCD226811D375A23B26115CFA8C
+34C1AD0A2D99517A35BC45189DE3CEAACF4F9348EA49AB7E42467B373760BC57
+A72FAA1CD068777D347A8B6503B6031AAD496FD365BAE24F737E1FD59B9F4576
+D6C3A761768DE45B737652E6A78C401B8CDB880155A326A07FEC3E9039829BD2
+EFF11D24259A85789B9883022832083BE5F8CA7A18D614B844B413F82334D419
+C45F03D945E66332673E5235920F1DDABB8A4C35DA1CE068EEB1778F197B5840
+E53757D58C0B986069C052A9211C3F85899FD20BC51480E38EB441DCE4EC7C2C
+C64DA5B9AE57FD5FE12512105D7FB891AED75457CD2189D1F64DAC875354F058
+AF4444718A3573E939B5D1D4343512ADA1B78E710A10079F211FAA5227E06F23
+861AD4EDD4FBEB504050FD0E50AF70AAB831F5C0720A884C96BC9405DA846B02
+72CF151FA2AF75FAEF2AFDCBDA947260922F22D2F2351D1147C61EBBCD7164D9
+B04CBF0BBB413EA850A2EDBFD395F2A6CF1E84500A5BAE190A26CA59DDA6D011
+F79FEF550DF52C435281D07AE188DE73CD3E463B692A4B59BA7A760DD7A81CDD
+A23D873F314FACAE006BA2064623902C8AC479EEEBB609EB693117341C8A74C4
+C04BE75CF00DFCC413B504773D9F5E277989F985FD759D74577C6FBE9535A520
+3A13070146A7B6802F52BCC2E72B7679DCDC9D959864261A9C0006193A843903
+337C4546CE4F8E6CA568889BED42A161F96FA5693372BB52702798B998C38C6C
+E38461A4B4B436DE9CA1B5EF52D0B7E251DB1F52FB00C200164AA53653E36EBC
+F83FA9637B5B0C8A4AD07CA4258EB186E2ECF0AD88CF5A4ABD9A46332E22166D
+724B171148A6FF2B27EA5243E7999F7F30BE53646550942D6D286C040E8F2A2A
+1EABD1CE95E2DFC50BAB75DD7C180C3BA9D16AC3BC19EEF59FADE7248B211FE4
+4D942C90D9FC0115D85BD7B8DDE271A0D13042DBFEF56212DBD85CA66FEEB463
+995EF7066EF0AFB220FE1C318BB984B5A680959E4F8348015D942FA7AF305C77
+E7F0246E4EA970A0461D0BF4B2F3D3D717B8926973075710D36E7B23BD99858D
+042D470BEE7851D0D561423E9807FDF75A37FC7CFEC39DF376C8CB716C053A3F
+50F47D7E89EE8F18E2F4FED0ABF078AE8CD3FFDA0F61E03BC6E9A09A41DE628E
+86E660286AA81668B1C6F41D982411DB27C619691C385D5D4B29BEDF5BD1950D
+0FCA179322EC356593582D55A655089910B4B7C4FFBEE8D95937061EB860928D
+5A31CAD2D60599E9024B649B0EDDE106038EFAC66E60C6A22A08CC5EE51D63E0
+6664FEBAFE8EA3EF4D60C002B9229BFDD8109322DF0CCE8FE0405D523BD80659
+CCE03A260F2E92C7807C74EFED2B132A2915E0454C28612D10372015A8CDA28A
+EDDE6E02E37ABF96D6709892DF9171BE3366206684D3DCBDCA5537ABC8C2B536
+D78609F41D29EA8262E689C52530CB43926685FF502BBD2918BE6C34B2553C2E
+4283818D4AD21DD19B49525A4A5F119C2886DEEBED572A5B787381CCDFF42AB3
+879F9B0DD2E397F976B4368D643CB7D82B2FD675D0249B3BD54C9A7E6DB1490A
+F0058E67A248DFD9B09190BC06C3E3568A724D9EA19A0E8D19A3470E2D5AC3F2
+73CB0234341AFBE551FAD2F6E2F5FBE4F60ADF4253BF5C6E79C95A9D754E4F9E
+9B977142ABAA4A5A7F2275D5124FAA033F368CF1EB0983B4D926B34D17EED4F2
+F0F9B6B663798CEA4A4B10ECD8EF025C05EA3F3C7E96B17E69A71D72BD2D398B
+E3C3E65BBA1AED26025FB7B374414B09CB3CD37AADC801637C7C70C38C25E3AA
+696CAE7D14B53B6E67A8F232D67743FAC455228EB9D4FE3F0D635183493BD259
+244B906D7A91B1ECD9EEC1B86D5F6ACE62F74C230B368DA61157034FE4ABA2E9
+2F04EB089DAE0E0348AAB6364C32E7B71AD4FD7BC82DCD94AAFE963D3E52E564
+8CD544FBE186AE961F3F9516375A2485683C093DC04641C864F541B4B921ED5D
+F2D45EF0E71335E83DA698A69BA804B9AE6431D0AAE9624050D4DFDA25E581FB
+2630E8840AC53673D9B7A3EEFF648FF1F57DAC9EFB5124D6E50F4BAE24AC9ECA
+ABD066BF0842D5CBED213DC1B7860994B6BA671A40A53FC266102D25E5121968
+B2D190886A31056265C84884BC5E4828584CC3A030857E04B3B87C3449BBBF4D
+7C87AE757898C65451430AB0FC1DB028A17E4C706A85961B5123B9B339BE46EA
+3906A272166438546B90A7BB6C321756215EAC98410AC2B28A52BB24A71B15D0
+9CB758C1B414B03D92674B74BD5FEB91297C8AC75E14B1FF34449F491D791F5D
+8482F2AB5E9B8256EEC2D21A8441536789E87ABC36A6AB34E4CAFCD66025CFCA
+26CA6070F3F138947E9552402C349D7183AB13762B780529E8CDD832D3F608BE
+8FB158E3CEA5C7A5865A52C5F4D31C49B716E117FFA6428294A6D30ABA9EFEF3
+77E49B7A134356A0994785F9078D1B8D7651B75924199D0B7A5547947DC1BB9D
+24782DA5E78B399BBEB3CBF0378ED83686DF36BEA9EE6DDD7C56066E5B4E4511
+7BCFC22442209592A67F5BCCB859F8A683E36E6A8756826B7786F35D21E3098D
+C9CF8BBE54D707AFC2DD5208EF1DC1009C1E9D28B71A246B043CE44E65F0C291
+A3F9B3823FA6ABB6DB6354661340033C94E7B931B849E61D8C79F8DA266F89F3
+A0DC02BC6DA849100D44D181C6E87477C9C7843343C7E9E3F40537D461EF019D
+52AEE6D74B6A4FBFAF7245D8F075ED7497FA4DC7720E60F378ECA92D58BFDC55
+7BFA114FBEBCF9B8DA5DE0122FBC4E814C13706AFDA1D383F306ED42A31C1281
+7DF7B8371E882E0974BE27060866F3E52C9F1A4E9F7C12CA9DD7F7C0200B3630
+36044E2E08AC6406067C36DC76A7A96C23ABBE8F81E2A173E7366FF9CF14B625
+853A9A3E4E432A38DA979DB29EDAD7A9A60EF320B28D63EAE41D3EACC879C4D5
+5CD64AE382038A0A4AE99012F78309E4A22AE2FCE1B1248BBE542422A5EBDA6E
+EE6BE6168D4D8626F414FDD872EC08DE1424D2420AC33425A3FE184EFED5F709
+1C9A9B200C8836B997BA06CE2A3726FE20D669E65AD7D43399461FEB76701C81
+4FC35FB995912980707299900AE4F349771B17DBE1B7FD3B7AF5D8ED5009FB80
+9985FBD9A3E99D1D6124A3B4DA19A52E983E07BFCD447294B1F96ED4AC5B1BAF
+7B8885AEBB46DDA8ED86888DDA3065C5091D99EEEAC430924659B31E06A5D7D9
+D85748FD8B81BE6AC0D179D8120F9E6B125C9B833F41DA40D17653B807304958
+03061FE195FAFF940714204D06B4D6749FC4B0B5C900A42D124B6DC63CE96513
+5C17CCEB28619A3C6781ABFCBD46714EEE53A2DEBA24AD6767E2C75279BCFBAC
+46D8224E8952D8F2391094338DABEB6D84A0136B85A552A80AE3E6451F9E4509
+F17B7ED3B19BBC746DE44065D4297B398A16DB107989757BF11E0C4E8875110E
+2FA63B47CD66DC82609997AEA3919D1AF60386478A61C1031E253AB322365842
+83BEEA04EF134D2709B24E10F6A831AAF04FE0920E4F317955F6408A0F6951FD
+ECE16DC97E99984009138C4E6A67841E1A749084C0602F13B2F4140A0A7DE082
+7FA6AC29E6A06F7E9383DDE95F51E448FF6C91B34553F11120ED516CD632F679
+E82AF866F6313DBE8E42D4B104AEFD5391674BA68E572E13028779C254BF5166
+41EF96FA1A58DB3440CE8EC1F099A653A65517C9B58FB6BDE3670A649E3ABAAE
+3472D6E8D9BDCC1CA231B5538BCC0AFFB10F5BD3651F4644CF51DAA8EBEAF818
+4C3488F42D2C430DBE724D5F2CD76AA34CB275C0AC22C1C8C030313AF207F4E3
+FF441206D76DF1F079ED6D08863DFE0FD5CD1ECCE7717F64B44AD01521B95522
+535CB38A16974A9E14FD75A07EBC833CB47B7F3F5862709650E5EC798A612BE0
+016DA6FC20C44470BA5BFECD08F2E9B0678F1C75B4349D84A1AC3617AD77C899
+FE86E54B8BDB1490AC76FF84E362568447675AB6621AFD3E68C14C591584F189
+6B5F93627899EB8C40288B69A9E79012C9C5064D6804B4B23AD7CF1154D17DA5
+BCACC3DA7E5AA1062A7C47D32240DEE4452773BA052B475D09EB09469D2BB86F
+7BC232B842C0EAE8E76815C389EB932443AB7C855B75672B3C0029C32A369FA9
+3FB926139676774399E370879B537E40FD39EBD882D4C188A20430242586F243
+EA5426022112C3EA8205F3C22E6FBA8E9B22722DD25AE3BA2DEC2A0C996E1247
+06C8DB3DC67DD1CF609CEC5C5365D06BE9AC81EF0647A4DFF91B1D7636794038
+D4BC5D6DABA9931AAEDEFF75DD0D1B7A8652B30AC3BEBBF1041466A7C86EB2D2
+AF4B2A36FA46AA5CBD3DD8C1CD5E3E5B2E3195AF5982791C708302BEF4ABA060
+4CADADFCE6247669F6392ADF1EB7347FF6E9BE216CB5DE5D367EE01C808604D0
+5EFEEE4F768148C131B26525D173F07ADFE2C2AAF32AA71C613A41A5A38F6C44
+81988A5E1102AB15CDC60F6EF1161018E734590D1F8326FAA17EAB734FD330D4
+12A44F921B7BAFF08E59FF2A6D83FE3845C1983D8258B563202C3D5BECD06D47
+F6B05A5E7A47526378D488DE30960321C24C9EEC7C566F007B48F2292FCD28A4
+516DD5636FC4DAF46A74AC94A09D60E190C548172D2E1D8F21295A2AA23AA549
+6813687BB411678EF3357786F66BE7285A2B8912210A5917CE236D356F1181E9
+D49336567AD43FAB25173DC75E79EF118D6930C73050AAA94D8CA1BAEEF73125
+D095012913031421A3D10E9CBD5D4E8869D9BE973C94A929D3FC55C12E99857D
+1CE11333FF9EC1DAE4383BA5165F1DFA12AE5B99CA89CE76DF92F2B1FCB71309
+3AE8071E3C83667441D2CC9DA8A7E239B7882556FF8EA5AF90EC2DC348618B10
+8941053DFA51F0A495337AE049B5BB958F763828B23FFB6DAD516D7133BAE9E3
+BD54AEE77EAD540B306955B576F52469452A88622F592BE669171313F92A306D
+1A7DD5FCA29CE223138B98E6C4DE796AADD16EDF3BB714C5A037F58DF43A39DF
+4F494003B77B596708B8642BB1BBDC37026546E6537F776BC6FA6C7EC9D66697
+0F39E1F01522BF2FCB6B28C527C32A17566D652AD737D670C54B521EED1D0682
+8DCE13D4FDD6039ECBBEABB9AB7AE45221207CEEE97EF66017F71ADA52CD4104
+69120CBEABAB5F1417E6B46B01E21838CBC4868D2C21604A3D4B856D8709ED4F
+B4DD697B9DD918A90354A50A66A7F0E606D1ED7577FF45529994A69621543F11
+5B4AF2D9DF46E1E5B36E223885BB7E1E8B28BAA6B20318B966EB78912997CA88
+4D714876239501D7F89715728249CD697F159D058E656E34657DB15E29B20A93
+CB3392FB562C26C291810DE035C150F276290101AE49DC6706C5B8623C587885
+1829764ECD7CEEE9FFA5CB45955F4185B55E7E81A66D846705F7C5E94EBA49FC
+934C1719D950E9BACAEFEC61BCFFCD4E2F3975C5EAFB948B8E72DE13BF536669
+48ED6D06A26DA57159B87DF038709EEE86B7D69F4D1EADF1BEAFD78A6C94B28D
+4E44AF2BBE3165BB4DE936CC3A4BF19EA1C5D6C0D79F9DB3B51A1760D3FD11B8
+1BD02950A753F3C460F00B5229B48D5A7835656B5D80A209D844242A20E04D15
+3A1E15443280BBA298B9084BBC0CB1E5DE954EE5ED85BF929E901A042AEEE41E
+AC3D35A3AAF9348E13F1671DB099C4BA17C61F344BA5CC8E4B3FB29F2DDC7EA1
+B24FF6C382ADA2F21F456871FFD26EDA54268F065ECEC16354EDF507DB053914
+38DEEB728CC5B35F801620FA2EB8E25C29B36624FBC4CAA2849E39805EFA48E9
+BC80F485B7054999E7E0DC1905A6F1F8523E200FA546107734B276D7DF579BE3
+12AE5BAE847C7D3D93177DBCAB9C0F48855D71309C0A1E8761E697057F013763
+629BE817F053F9C6A4F1859AA5A263B7324F231D9898D3B9A1687237C450949D
+F8DCB4CF38B4F4FC0803BF6176B216B0548AF522549852E8DD130ABAFB058534
+BF9B357739886C97C3459D8EC199D636DCD1515964B4D13ACDC813180560C7AD
+4A851AEC186B68B75C375DCF494DF36482B9FA386E2068818B3BBFEDEAA3693E
+CC7071FEEB02814EE5D641FCF55E67B2628909E34F824317E8766999D17EAC8B
+28132D2BCD30F27CA13C47550B39DF3DBC13329090DC59354FBA9A3FDD354BA4
+D0877645B9308173B8732C4565BDFA300638CB39A7CEF26223D6A85D67B8E945
+5FFE82B7E0A620B35139578183B066D5A65BAE4AB038087E40257C1FE413374D
+28FD5180F75EEF61BE7242619B6D005F2D6E3F68E5E8E530CCD921ACF0AFD7A9
+72250F2EA50E2A559E24142040DD3C1FA731E3F8AE2E624ADD58869960793E0C
+844398C2937AF2B1EEA58832DD7CF5C1E29104673B9382E5FA947F63826D6752
+0A9BB8687BDA378B4444C37F168AC3EE99ECBF8E6C60013B38F49C5F4D443468
+222DBFB027AAF56C7B8A44EBE67BB34BECEDFCF123E6F56CF01771072FF46EC2
+F7A7F271B49E919F88E7581064DB278FF4933A7F5E2B732F3079B890C59CDE42
+35335EB575FEB10088304351392814CC0E6159622499F26C0932BDA041849901
+838D0A12D47F8BCF5CC5768C0AB338B15012CFF265C212EFD14EC18329827759
+4958908F504D58DBEC366C096AE65B56E34A583A0288C1874BE8C6938D0B519F
+7B53237A6BF0906A6DFF38E77DCACD3AC7DB91055C9EEFC1BEDE9E9906F6A6A2
+7D431B5958314E923CBC29504830F03AEA815ED1812E2D15E5335915D354F06A
+1763D775A7AD326589828310346614F45671DEFA4B3C3E113F7F0D00B0C41F61
+7D1E75F9FFBAC63919E4AF8F7DEFFFFA76B640FC05A08046169186702A6828A7
+32B605D70D4F243943EDBC2199FC48F27F9AA276CD5D4C0C53D5BAC0B89EEEB9
+E2F9CFC6BCDFD9A438C10BDD29934B4283C233C8744FD5EC84144B2966F72FDA
+223C02D445F8F69CA4B90D34988C1C1AE72CE581E82E68CC515DB3163C5E135D
+18B4693417BC7BCBA9B9B3CAC6619E9FA454560E8DEC474EF52B65BBBED017D5
+EAED0F759C8C35CB9F5B9A26DC0342164CB04216FDDB337476B94948F0B46C30
+A3AA503426744E5DAB6A37F59EFE3FA9A6C6121734E6AD6B29C94491A94CFA9B
+4380D32A781A98E4808E6120C9A6ECDB5C9BA2B9A441DA122921ACF9245D89AC
+35C5C0CAFF832B64AC2DDCAD7C4F17AA5F08385A25DC6169B2C81A8E5D91FA35
+856A8A7D19918F1C89641178AFDAADDBCB87A95E0EB45F47522BD93ADBEA3423
+27272589C6F61D91A79C2D61038BA7A2B491D23248BE16A730E9A1E3EE6A8B54
+1D6019ABC39591932DA5AD4FE33B37FDF81BFF234B3500BBD814752D07430C71
+65E40AED9BEF61978D1C0B4418FC109D7699001936350763EADDD822C4806C99
+10021263EC419BCE1D8332542D36CC3306C5A6A7F2921367D2498DA3D214AE27
+5BA4B2A3FDDE1DA1C862C9BDC3A2B152842BF8FE45235C4B45BA8C5B968401A3
+CD81976D2140ACC6FA3F605EE9E99CB871B6B81AAF86F15D543B6F063A5F6CA7
+174C44D59D3F24272A6677F20E75A8F7FB6C1EC7E50A4654EA4404D6C6490988
+311A5C70DB60B784FC038F6DAAC438AB2D8B51C5A80C5C7238AB883E083EA599
+59A3000F62333E568776A96ACE6FCBDD69667868EF371BF4BF97B4954BBCD9B0
+66462F565ACA8FBFC73446083C4150686AB37EF63DE42402DA190130A7712BE3
+B76ED36626C938A849F7018BE8DB1EFD7ECB6A9D8CA938A79C81B5A58C1315AF
+EC6810EB222118B1E2ABED9BB47F7475D676A90215BDA42C7A82E17B8941CC10
+DE1D4A063CE605C924C9C10EF52F885E21F4CDF14F8A5BE651118D4F24365C25
+4866D8B8F9041C564626D94B23D6B63755279D438DB81FD6719AC9C2257EFE80
+25A77EE3FD66EDA1201BB1D1BC6F0CF35F09A6B82ABDC8CB1CA69C62E1DD1B32
+37EA3D0B1F24B22D4EBDDBEC18785B4B37407B8B557E08185F2ECF3E3E820C3C
+BF690D5A6D4299765578EB49D2434D57A84FC07B89EF93F9FE63A780AD54B1B1
+88A17B2820840E032D7CEA3582EA0BE0F75518A6FA1DE361ACDC0D3A4B82D050
+32E1D24CE03A6895E9A87887B7D762A7363F7A1EBC6BA9CF45EC86634670A834
+EEA20646DF3BBA2BB554234B85BAF8FC671C6369C7C2B37EA20FD525D0C06BEC
+AE7727B464BFDADA50B672B8F57974501F5CACDECDD51052C73FE0F687E850A9
+52E41814285EDEC18BDB97F5E453A7D24D2D4B9F2B4D1FE73AB99295FDAABF89
+87B4C2B2317D3C80B1653EDAE08F8EAE6CA9A4FA430487F14410EE4E66AA7AD6
+87BAFFC6C93AF8FECFD915D57342CB9DD01098714302C32B6DA0F08C5EDE73C5
+486CFC1BAC10880661C015213FC94F4C2F0520F8C27970184EB2A36DB0E19710
+ECDB1AEA84CFD58D9B2DBC4A0E86C6B739F68AB0F1D2F4BE10035A7A1A1FD3A1
+86AF45CFFF10DB5F81B43B7FFD0DC0AEDA67216FDA5E366D02BDCF7A4BBAAC2C
+D3059488731C902477623C1CA4107B07F56710B3D141A5A9F4AC8F309A73E2D0
+2CAD8CD27D540CA5CC4803C9ACE100A497A6190471AD3FFB5534960A1CA32EA0
+12F517D02B08F6E0E3076B37DD599012A97FFDB8F489581FF9BA2EC68ABBD1B0
+690B0A06BE0DAE6F7A65914F1A9DD83FB8759D7DEA6A5634D818FC26861A5534
+18D2DA4F96746585A5F13BFB740C9192C06C7B364E6040B5AB47B0ED4AD4BF01
+33437BF1E0BC9AFC5B3C09B99E466A6B52435EE004F57D41999E269E184A0D26
+7ED5EDCFC2C56FD4BF5FA64BC040F0C707E79A7EC498DBBAD164306788A8C5E4
+47B8C85276E5DBFE625DB4B3A0E8BE1698D46981EC2FE1C96E2B3BF81351561A
+9184BD76C2DBD9D8543CF8B460B6F564787D4F9B3034411FAD2513F59E2C0A83
+389228E45D0AC608E5BF176670DF12E3D4293EA037E01D30560F4D4CEEC504F1
+ADE449A31822157426EF79D9C81F8FFC80BCD3C6510B046E82B2EBD4F36803C8
+4842027E09CF71D8D25974BD747AB7402A7E4EDAF9E5C46F92A06B335BEAC86B
+1D22D4B138130FB0C2B5927919F27B189ACCFA1CB98ED85CAB29DC2274C56133
+96B2773D71996AD2C2A61E30A4B719753BA7CD2D449F4ABA8D9D575FD6C901D1
+9057A7055B33F061112ABB970157BCE4E210E7593210AF5032DE7E59E5E9E0B5
+E164002FB6DCEEBB345B11B6C8CBCDC646FC505D35EEF4A74DAED97DA3308BC8
+0857
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%BeginResource: font ICXWUR-CMR10
+%!PS-AdobeFont-1.0: CMR10 003.002
+%%Title: CMR10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/ICXWUR-CMR10 known{/ICXWUR-CMR10 findfont dup/UniqueID known{dup
+/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /OZNPKB-CMR10 def
+/FontBBox {-40 -250 1009 750 }readonly def
+/UniqueID 5000793 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR10.) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 98 /b put
+dup 100 /d put
+dup 103 /g put
+dup 105 /i put
+dup 110 /n put
+dup 111 /o put
+dup 117 /u put
+dup 120 /x put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8
+569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079
+24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A
+2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944
+8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E
+3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26
+D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24
+D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B
+03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685
+767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A
+8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B
+DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E
+94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004
+22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7
+72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C
+8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491
+344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A
+64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B
+07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC
+1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8
+78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51
+CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120
+7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782
+BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462
+4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A
+5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D
+EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE
+EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622
+4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE
+0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5
+C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904
+314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E
+DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029
+EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13
+DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E
+DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084
+7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91
+1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155
+69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE
+EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5
+7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67
+CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D
+38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3
+22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C
+0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1
+BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D
+4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F
+3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD
+B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE
+15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9
+849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3
+FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84
+4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76
+1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798
+84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF
+7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122
+CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA
+4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B
+3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394
+F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D
+F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140
+DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7
+D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886
+56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4
+8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53
+59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED
+49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86
+87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B
+8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60
+C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342
+D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64
+D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1
+F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178
+0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B
+5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448
+229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC
+17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4
+01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616
+F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662
+3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0
+689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20
+4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F
+A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03
+DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D
+364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F
+7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F
+26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1
+43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD
+8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7
+C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08
+94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5
+C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1
+B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56
+4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5
+7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01
+204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE
+B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56
+7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6
+279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB
+E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346
+CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A
+65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78
+BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285
+6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7
+B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3
+63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89
+4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A
+A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6
+67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C
+DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A
+5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9
+C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C
+9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D
+B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51
+963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0
+D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB
+B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B
+72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE
+B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358
+8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB
+3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0
+668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152
+ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5
+69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118
+C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754
+3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13
+407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01
+11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF
+2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87
+4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40
+2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF
+9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889
+CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8
+DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973
+0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362
+5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7
+9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A
+EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2
+09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A
+2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2
+AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420
+324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786
+486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A
+EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660
+52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5
+9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3
+4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D
+B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7
+BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14
+6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0
+B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359
+16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED
+E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6
+546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED
+6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507
+559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B
+C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A
+ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354
+04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B
+7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A
+8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B
+A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02
+94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB
+C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC
+41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654
+7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5
+18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76
+9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD
+E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947
+5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F
+4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F
+E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF
+9F9EC2518C77806A19730C97F54BEAD10B4729E5749A10EDBE644886443D1249
+2C8517DF8D8AE98E2882439FA81903941B363A7D885F93C6DF9E1FD89F2F8CEE
+B870C409ED13E78B4C914813B0A01DF8F876EDCC4F384055FD37C575726AD69F
+F23D50EC5BEE2FB95A44F2B2E2DD94C933D90BED2C97B53738B4B2ED56EBE617
+BEF17B9DF4F314A37F10FDE34C570D7BE76A496A58242F51E7321380CB042424
+855F4B53071DF5A0DA5A31B8AAF9FB4F4C491625FF8FD008BD4402918043BEDF
+77B840B2BE0DAAB4EF904FFEF935954AFB9BD2041241B1BC8519EB642C89E288
+479664226DBB6F1171F9EEBC7E1273D0CABCF6B1BF7F26AF21C21D9B1B916F4F
+603DDB68D3614B86566FC91D67AC3F4A4A96E256FA1A3BD35F4465AE4EC64D82
+34BEB4BBDDCEEBD9A89D932E55F14CA2776F927C4FD3E0920790A57DAEA08C5B
+169A3E2309DA6BA8684A5D1DEE81415796E13DCF906FCDADB092047831B16841
+B250CD148557D72DD7E683BF122B38E2C4F614E59B395D1D9823D7D5F126D932
+14B50A37FCA7120F8F3A8E42134F1B6B0C248D56F247AA68FB941839F600F61C
+14247EFF780BBA3E5198D37CED44DEEC3455048FC451BCDB48DC414AE5293A60
+5A59877D6DFD21EAD729CDB7B378CEDD34262B37A194EDD0BDB24AA42649375B
+491DC08F6B03DFEB517B2FC125DA9373AFAA94F4E4BC09510A73E079F4ABDD8F
+93529E898B13ABCDE7322323B3A2A02A0BF388E89B4F529A66FA22D38E3EE342
+54475A1989BFB7A119CF95750D5A18BB4FA9CDA30DB6F1AEF8AE8448BBC999C9
+FD0D74DE9A17A3153617F07CACE92977B68FB5A1CFB29FD42494D5D2B9C1ED81
+2F3CCEEC1BC079E837DDBB57C7E351F9925FB96349F8D9786D8E6FF03E9C4C1E
+67DB235577B68003BA14073E2702296B284F803259283005D97035874D2B9AFD
+4D3F29B4B1E6EDE30DDB9C68348CC174A091791FA74520C8614D4FB1125CBD6F
+B9367559D715ED057FDF6DAAC180C7FA5CCEFD0C5878A91B20D4919792C03CA9
+3AFC986C34C08358A3E85F241E3F8F815FCE7C8E07C2A4258E17D65823264049
+3803D47C96A2745580EDC957AC4291730A840A2BADA50A28342A2B7093A3F731
+4F4F656E974389E133C53F89D5DD6407BB98B211697941A927BC72A0956FA78E
+2DC624B2C253F76778698BD1510D509244AB0465D4261E3AC31D77C4F755096B
+50C9CD8103CFF51490796CF35B02E38BFB36CBF2E6D0D7304344C4523C369946
+C3BAD318835D4707E90A0340BB7B6ABEBE9EF7E7FF54D1784AB514FAC0FDC8DE
+B8DE95405811AB2F25F2391855929C2C452295D698C749DF868A962183036CEE
+800D650FE2CD2E74C038665ECA680B173A27305874D4AEC967043DBCF9275F02
+7D92A0AC4C098A5DA5939BFA435FE56060110EA1E9FF2BCC9C5E93964FD43199
+8133454CF0A83B9946D6D2235AE3F345BEFA7D935A4FD76D7A9CF080E34D1983
+6FAB58E2C907D4EC63F6431805A40EF837884510B1A8C7CF8F290F034784C81D
+9FA6ED8ACCFF15B6ADA1CD0460591326B7A7A5FE7216BCE081EF42F0846374B5
+0FF9F6FB8025D2DBEE17991FF93E7C09B55135397A77ECB0513611ED0874B55A
+2F393F513C09D57D1775AACA160D8D0F224B875C05157CD351DC708D082D9A9F
+C8033277D759BC5086CFE6D15CCC858FDF7632930C17188701154E76F4EF45D5
+D3F0FFF714C1764C31CE1B3F625FFDB0B1EEC921628511067907057619643FD9
+2F82BB11CD4A10FC32C7ECB4241699220A67EE08D56AD4741F99ED5FA1982196
+402619D4801759F7EDC36C78E30CCCCE4EEBEFA2169FA75AE50BC929B24FAA10
+868D2FC5921E7387DFD6DF582ABCD8F5550E36E9CD715B6CF87FB6CAB223B208
+068E4FE6379F43F39F52077A8589EFDFF4966D141B0B7B1AC40E7D91597416D2
+37A461DD7A3FD9373F9A710468822A04965BDC89A31CDDA832A06CCA0A3916C9
+F08BAA4051D825D512C6F5B230868A44331AC21B909B5F45484C83A1E016DF66
+9832C2F68E084AE9AC3ED7651A4E9E3B7E7B51AFFF2F2429D2D4C03304B7D0AE
+379FBADD05808CCD196D8D1B6DB30D6740173B4AA20B34B1630D55584FECE566
+2C6650BBAA8D1B20148EFF405D523BD803CF73437F35A2A07B20BF381D14D1DA
+2D580BF69355D3D73CD6DE53F24D8FE9F50D35EC6BBFC3179F42674F814BAE3B
+BD7F2C254CB7EBC17703FE62DAFC11F65204393280DDACCACAA46C73968C2409
+AAC3DD643E0EFE1857807BFA0B96349ED8E43DFC3C6C5837DE85B0278025522F
+64B547365FAD20A29EF38C14A7D31F074565A14EB60996D904A697AF52D0FD3F
+35390405D6A9D16C8682CED476EBB8605EF4DB65684D6CD4AEA41E1716124D45
+F7E9CACC6189C13BF1E9C5DC4C9888AD08487B85A0C0B12C70FFED18069101DD
+0755456F658FCA4C3EEA256A3B750675786A99B899354F9672B1A13A4823E645
+378959E3A4959132D9C8B2415323D2AA1E138960E3A2FB77CE97AC77B38AEC02
+0FAF50A76B7BEBA99F7A8167F9AFA37A73A0FB8D018A6721F1A2E86CD1994F41
+60582A6C5097EC50CBAFBA2E0D5EE35CC217BC33669A41FF19200574EBBF7284
+8D88A376515078360765E69141F72141640FDAC6306671526361ED2C379A528B
+A81DFF14211B6E517428915966BD921C486DFC3FFAA3903870ABF407D15945F8
+E1FAABFE069E371FDB3351247D604398582ACE0B6296724D7212027023944DD1
+F152A7FBC1EFB73A9DE9BF792C98F9C88CB5E9048B73167791B4AC683E7C0BA0
+10425AD428A8E2F02732CE58012FD29FE236E71AECD6A1C3551816B3A6B79CCC
+2CD8440BFCEBB85F434EEC721B168CE8545E2ADEC64176833756D1D45F68F078
+E3F2A8D4F88C8E4A9D1D680FFB5EC0D1DCF9E5D87EDE7F8333BA1A215F82B5FB
+50FE4AB8E16D0500258CA532118A9951367E736F4EC32186C11951FE43C0C44B
+7FBA9A60D1798916A6B2ABE63EEDBBA2DCDFD45065B3A34C733F771C905B7439
+EEE460FF2738CA09B628CC646123FC9C2BB8B9149CBADE77E9D3E9122482F878
+52C2F3EF87B7F506B8CD728DD8D115F1257B776B472E4C5FCDCD11B56ED314AD
+CB5C4BDF95A39C74183F41E46F2C56BCB59CE6AEF7E91EE9FC19DEEFB52EC0E8
+0B8F4A66179756C6668E137EE24BE2CA1FCBEF057DEFE3269A3251B16E5C9371
+BBFC68DF9A75ED5B78C49642E51A141C5F34F7579AA7CFF130C45CE851FD964A
+BF5A2545654BD50E75E7038E80E2FFFB6D37DF7709DAA96232FE6A9C3DA390E7
+5EB04ADB382D014132805BDEEF054CB29D1A44D2BEA949BF251ACACDB6BD17F6
+05D99F213B2A8644DAD971DA929AD0B2EBA95BC82BD607CA5F9C37AA1F2C7843
+A71AC85BF51B9AB31A8AAAAC43F38ED171C2D5FC3D9BC5E3519E37CCDCEF4DE2
+FE3AFF990FFDF40930853DA39BA8099A6D97B03D94F1678C6FE142C359F6D4E7
+EEA378FAD5308FDE9807B00BBC3C3C17F37BF46CA9EA3CAEF2707A617EF143D7
+2342F95D5181EA199E791C740407FA357EA8778CD8DE5A5AC048F65100FCAFB9
+132FC18E480C652A6016D7BB454F50F5A26A7ED450B35BE176957A029469DB7D
+AC0C742961230799C17466F4724A90F578B66098F9678BD811E866B1157EC4D2
+B859C9A7A219B67497C6C4C8CBD00E33789EA9C9A2C2CB0EC842F35C464E37CA
+338CEDED2E9C0C8898B23EAACA76E0C49C714223BCE05E44FA76C225274746A4
+1FA961BE33F1F651A7ABF5AE8C035D8E56CB292B40DA36357D6807A33321618A
+6CCCC4F97CC72880E9140C5E6D9EC0C665D13C955D6DC2C09A0F32C239EC1654
+DDFC6C8C77E6E7CA226BEA47AE139FF85F4B5BF96510F10803E09396104D63FD
+5CC1275560B20B863FD97FF0AB057913D259ACEEB54FC357D60015DFBB19B2A9
+4431476AF537BB25AC32170FC5F31A668CD0567CC48CEC337A41B09D6DF961C7
+CAB76E0CF5880A5BAF4A1DE11908F7622023BED1EC7C3B56D64E6C8C9A96C7D2
+392D9189F9DF08B81D08CE5774F999C91C8790D3BA23BF367ED8E71E847D770E
+D701F7C14A46BCDDF1A3223C708DF0E20F73CFE0E55EE41E5395AA4D3399A849
+940F8EED0BDB296E19A2E760197E95C4B8DABC9AA93BCD2E4B7F3182DA9B4BC7
+D657C2FD2A973452DBB6509BC8F2410549445EEBBE4AF5366221DF88F3061CEA
+96460873DECBAE43044D4FD5FFB08CAB19ED14FAAFDE432C6D423F1518A2A449
+800ECC909F0A0CD1F0520634A9D6A0B5D1A38335CFAFB9E1AB388DEDFEFA3CCA
+302CE3C1D8EF93C972CF9E8BD91B117C1B24D0DECD234E7FEAD184B885F7881B
+6604839203B6D28DFFC60E2A3F42D6038260F540357F7454C7F64AD3C4194097
+1313B8D19E21E91476FBCFDECE274D37EEF50339A4A36839E77E4D288348C88B
+3EF7A9B32DAF543BA7773C917ED248929467C2FB2E01FD60EAB883E9F9DD6DB7
+75405CE0FAB7960D0C8EF6A4BB92240AA72E8F841B4EB0E6C85E580D7F3010B0
+EBF48A1F4EBC745BF17C6B641C774A586DC38FBD2B082A0A12B55340D0950501
+7C935ABD7EBF204AFB042AD771D1CABA06501DBA3769263FF1115AE036BE606A
+D25A5DC358749CCB9C5825D7B96C2B0DEEDD36BF0B131E9BF944A1CA55E1D08F
+2E58E1FE9DF1799A18A3ADF963B00A1BF99B6701B77A29853A8E5CD0054A907E
+84970EADF1416D6B1CAD48D7AD07440409410B04CAF7DDA0B533C78CA759ED9C
+B16B011B9F70A0BD023E3205E15182ACDCA93613B3D53330B090DEB01D58C6F9
+E192CEEB04A6A941EC716803F9A89DF788544BC55B6955A78A24FC53DFF3D5CA
+1B105DD6D72C2F7FDF3B032CFD99BCFF2D022DE88A16EBC5F293F7B6D27C66E6
+0792392FA423FEAB5EFF4D7BF54A1A29DC16D7FC12AAF5897236A721BBA8B537
+7D8F54BEEB2A351C2766BE57F14AC46D9E9A1B553EB4EB8F7737B596659A8120
+D0EE0C498CE2426A35D47B0091659DD55F258BCE57D9CF0B021F7581C6759696
+DC55E93C1B489A278DFB68017BF2DCFFFC02ECAAB5D42AEE5DBF10FE383EDC00
+177884B017FFFF87DF63A67B3139CC026381B3B7FF54B4B37BB2CE3EF160EE12
+62AC6A9911511E020114A9EE146C3584BEDD95FF54C9FC861236D04584424ECD
+488CA6D69FBFA12E3AD1BF7B2E75A61CACDF9A5CEB54FB8C22A3EDECF138938E
+F4EAFB9FF879F645CE3A7D379ABB29BE1C6E38A4BA05AC2050597E3B2456F096
+B5982F21066E8DDF17BFC6788C915ECA3455F67A35CFBCBFC2AD72BFE558B13B
+3376E8AAFF655CD9D7C77403230F17E044F4DDB7C4BFE6ECF6C3DA2E7C6D845D
+11411B24C4D7604C6F39E12257DDD7FAE57E59D5FECC80ECA95AAC55BBB7AB30
+B9B50FBB5D61530C42FACE3B11E604F4E81893FAA39EB5F7DC2DB62D4B9ED097
+0A31B42A9BDB790593EC273A0AF8D92F57F60F6A98C23BBD673672E36D558B02
+AFE04248E7E7374DBFA08FB38E3BC2FB71908032
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+ /ec-lmtt10 /IKAJAR-LMMono10-Regular def
+ /ec-lmri10 /MRZPFW-LMRoman10-Italic def
+ /cmr10 /OZNPKB-CMR10 def
+%%EndSetup
+%%Page: 1 1
+ 0 0 0 setrgbcolor
+-15.6911 -2.49066 moveto
+(fig.mp) ec-lmtt10 9.96265 fshow
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 24 0 moveto
+24 10.21004 11.75247 14 0 14 curveto
+-11.75247 14 -24 10.21004 -24 0 curveto
+-24 -10.21004 -11.75247 -14 0 -14 curveto
+11.75247 -14 24 -10.21004 24 0 curveto closepath stroke
+-20.5758 -58.49066 moveto
+(MetaPost) ec-lmri10 9.96265 fshow
+newpath -36 -70 moveto
+36 -70 lineto
+36 -42 lineto
+-36 -42 lineto
+ closepath stroke
+-13.07596 -114.49066 moveto
+(fig.1) ec-lmtt10 9.96265 fshow
+newpath 24 -112 moveto
+24 -101.78996 11.75247 -98 0 -98 curveto
+-11.75247 -98 -24 -101.78996 -24 -112 curveto
+-24 -122.21004 -11.75247 -126 0 -126 curveto
+11.75247 -126 24 -122.21004 24 -112 curveto closepath stroke
+181.6937 -2.49066 moveto
+(doc.tex) ec-lmtt10 9.96265 fshow
+newpath 224 0 moveto
+224 10.21004 211.75247 14 200 14 curveto
+188.24753 14 176 10.21004 176 0 curveto
+176 -10.21004 188.24753 -14 200 -14 curveto
+211.75247 -14 224 -10.21004 224 0 curveto closepath stroke
+190.83899 -58.49066 moveto
+(T) ec-lmri10 9.96265 fshow
+196.2701 -60.63536 moveto
+(E) ec-lmri10 9.96265 fshow
+201.7553 -58.49066 moveto
+(X) ec-lmri10 9.96265 fshow
+newpath 164 -70 moveto
+236 -70 lineto
+236 -42 lineto
+164 -42 lineto
+ closepath stroke
+181.6937 -114.49066 moveto
+(doc.dvi) ec-lmtt10 9.96265 fshow
+newpath 224 -112 moveto
+224 -101.78996 211.75247 -98 200 -98 curveto
+188.24753 -98 176 -101.78996 176 -112 curveto
+176 -122.21004 188.24753 -126 200 -126 curveto
+211.75247 -126 224 -122.21004 224 -112 curveto closepath stroke
+89.05225 -170.49066 moveto
+(dvips) ec-lmri10 9.96265 fshow
+newpath 64 -182 moveto
+136 -182 lineto
+136 -154 lineto
+64 -154 lineto
+ closepath stroke
+84.3089 -226.49066 moveto
+(doc.ps) ec-lmtt10 9.96265 fshow
+newpath 124 -224 moveto
+124 -213.78996 111.75247 -210 100 -210 curveto
+88.24753 -210 76 -213.78996 76 -224 curveto
+76 -234.21004 88.24753 -238 100 -238 curveto
+111.75247 -238 124 -234.21004 124 -224 curveto closepath stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth 1 setlinecap
+newpath 0 -14.00002 moveto
+0 -41.49992 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath -1.03532 -37.63602 moveto
+0 -41.49992 lineto
+1.03532 -37.63602 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 -70.00002 moveto
+0 -97.49992 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath -1.03532 -93.63602 moveto
+0 -97.49992 lineto
+1.03532 -93.63602 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 200 -14.00002 moveto
+200 -41.49992 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 198.96468 -37.63602 moveto
+200 -41.49992 lineto
+201.03532 -37.63602 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 200 -70.00002 moveto
+200 -97.49992 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 198.96468 -93.63602 moveto
+200 -97.49992 lineto
+201.03532 -93.63602 lineto
+ closepath
+gsave fill grestore stroke
+newpath 2.12367 -125.9576 moveto
+9.36685 -148.25864 34.27826 -160.13411 63.50719 -165.11182 curveto stroke
+newpath 59.52014 -165.43732 moveto
+60.84354 -165.34514 62.17293 -165.23642 63.50719 -165.11182 curveto
+62.28938 -164.55258 61.08374 -163.98204 59.89154 -163.40018 curveto
+ closepath
+gsave fill grestore stroke
+newpath 197.87633 -125.9576 moveto
+190.63315 -148.25864 165.72174 -160.13411 136.49281 -165.11182 curveto stroke
+newpath 140.10846 -163.40018 moveto
+138.91626 -163.98204 137.71062 -164.55258 136.49281 -165.11182 curveto
+137.82707 -165.23642 139.15646 -165.34514 140.47986 -165.43732 curveto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 100 -182.00002 moveto
+100 -209.49992 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 98.96468 -205.63602 moveto
+100 -209.49992 lineto
+101.03532 -205.63602 lineto
+ closepath
+gsave fill grestore stroke
+77.72755 -81.21043 moveto
+(b) cmr10 7.97015 fshow
+82.37685 -81.21043 moveto
+(ounding) cmr10 7.97015 fshow
+87.6903 -90.77463 moveto
+(b) cmr10 7.97015 fshow
+92.33961 -90.77463 moveto
+(o) cmr10 7.97015 fshow
+96.10323 -90.77463 moveto
+(x) cmr10 7.97015 fshow
+ [3 3 ] 0 setdash
+newpath 24 -112 moveto
+42.00966 -112 58.06435 -105.31508 73.51495 -96.56459 curveto stroke
+newpath 114.48505 -71.43541 moveto
+129.93565 -62.68492 145.99034 -56 164 -56 curveto stroke
+ [] 0 setdash
+newpath 160.16615 -57.14084 moveto
+161.42465 -56.72858 162.70226 -56.34773 164 -56 curveto
+162.70226 -55.65227 161.4054 -55.34329 160.10936 -55.07108 curveto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.2 b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.2
new file mode 100644
index 0000000000..fa248ef221
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.2
@@ -0,0 +1,1284 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -125 -125 125 125
+%%HiResBoundingBox: -124.00102 -124.00096 124.00102 124.00096
+%%Creator: MetaPost 1.504
+%%CreationDate: 2012.07.08:2238
+%%Pages: 1
+%%DocumentResources: procset mpost-minimal
+%%+ font IKAJAR-LMMono10-Regular GTLWKI-LMRoman10-BoldItalic
+%%DocumentSuppliedResources: procset mpost-minimal
+%%+ font IKAJAR-LMMono10-Regular GTLWKI-LMRoman10-BoldItalic
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset mpost-minimal
+/bd{bind def}bind def/fshow {exch findfont exch scalefont setfont show}bd
+/fcp{findfont dup length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall}bd
+/fmc{FontMatrix dup length array copy dup dup}bd/fmd{/FontMatrix exch def}bd
+/Amul{4 -1 roll exch mul 1000 div}bd/ExtendFont{fmc 0 get Amul 0 exch put fmd}bd
+/ScaleFont{dup fmc 0 get Amul 0 exch put dup dup 3 get Amul 3 exch put fmd}bd
+/SlantFont{fmc 2 get dup 0 eq{pop 1}if Amul FontMatrix 0 get mul 2 exch put fmd}bd
+%%EndResource
+%%BeginResource: font IKAJAR-LMMono10-Regular
+%!PS-AdobeFont-1.0: LMMono10-Regular 2.004
+%%CreationDate: 7th October 2009
+% Generated by MetaType1 (a MetaPost-based engine)
+% Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).
+% Supported by CSTUG, DANTE eV, GUST, GUTenberg, NTG, and TUG.
+% METATYPE1/Type 1 version by B. Jackowski & J. M. Nowacki
+% from GUST (http://www.gust.org.pl).
+% This work is released under the GUST Font License.
+% For the most recent version of this license see
+% This work has the LPPL maintenance status `maintained'.
+% The Current Maintainer of this work is Bogus\l{}aw Jackowski and Janusz M. Nowacki.
+% This work consists of the files listed in the MANIFEST-Latin-Modern.txt file.
+% ADL: 778 222 0
+%%EndComments
+FontDirectory/IKAJAR-LMMono10-Regular known{/IKAJAR-LMMono10-Regular findfont dup/UniqueID known{dup
+/UniqueID get 0 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+17 dict begin
+/FontInfo 9 dict dup begin
+/version(2.004)readonly def
+/Notice(Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).)readonly def
+/FullName(LMMono10-Regular)readonly def
+/FamilyName(LMMono10)readonly def
+/Weight(Normal)readonly def
+/isFixedPitch true def
+/ItalicAngle 0 def
+/UnderlinePosition -167 def
+/UnderlineThickness 69 def
+end readonly def
+/FontName /GVHPQH-LMMono10-Regular def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 46 /period put
+dup 49 /one put
+dup 102 /f put
+dup 103 /g put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 111 /o put
+dup 112 /p put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/StrokeWidth 0 def
+/FontMatrix[0.001 0 0 0.001 0 0]readonly def
+%/UniqueID 0 def
+/FontBBox{-451 -316 731 1016}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0525392EECAC163E584A9104D99AD0BC
+1B1844A0E222653FA481B8809B26A46F4C483A5D7E95816EA6582584156CFEDE
+B994ADCFF4645140E3617E4D7E1B0E4541CB9F562E55829B4DD880AABE2229E9
+4A9FA259A734D29BBA91BA1E2055CBEA4339BCBFF98D32CEFF11F296225CAABA
+DCA10577A5D431B714726C1278D8101ABD1BD8D0BD0174FFF9148F8C61C241D9
+2AD360A28616CB4A0670C1BF105A2B97A25458EAC07B98B8F1ABC91ED489DF5A
+340A9C333CA5AF409E52EE1BA5629A1DA85B8B9EA3150173A28A696C6B98D060
+4CD8AE5F032FC97BAA1F5394B526DA51B5521D60F8531E0E5A437F5E00E9B683
+3F08ED5C6A216D2CA9C1806AEA6B335CD03C87CB35115D28AF52BF955F7F349A
+C9C2519FBF9D866A7CC0AB363443FFA4831A9FAF41181CC67437D2315BA0438C
+2D2387CED780B0C89728BF50FCD44E9E83FAB34746B8A91F611A7C821C73E49D
+7061B681B3A8086D36072662EABB0D12DF1A344E0E619F61E9D79E59F7F12ECD
+902103D50AAA3E5C951FBF72E96E17F3DCD91CB14D7F302FAC08DE542A661BE1
+76D75816F241E180B9EDA0DD2D77FAD91072D2CB4F9CB10A0042170ECAE66728
+4A43C5E849F8DBC4655095F039DBE7FA1DE67A9DBB1891D618FFEAFF67FE5683
+AC22D2CA7A6F772481EFE1BCC831A8A1C73DC456E8581871196DFBA4B0AD584E
+FE85A66B9E4D7621073A01B4D0E450338C9077A6808156163FA45AF5640D6443
+42DFBBF83113738F8AA0A8569EC3410F8B1504B5A572DB5855C9AB6CDD88939C
+3EA9D0DAE1E73EE83BA58587EDDE46FD34C7A4E0F5CE13AAC9D44D1C598CA95D
+B1BAF457820D26526039322E083AAAC442E04290E43ACFC73FA0D289AA732544
+37F9CE9AF092D5A976E3284F00E12B00DDDBCA7D9AD3389F03A93CD03A8ED655
+79B16B0779800ABA08EF65FD4A17CD265E56C22DF32F67764467507F67E709D5
+16B22CCD4111B7AC2A2DE413881E3770FC0753011C98A62B7A5A7855D7295C3C
+E4519841C6D9365A9B2A47408684E1F3020DC3A7B2066E895AB7271A1C10A070
+D345F88A54B61C09DAF4947002DCB9CDC539B448F25D5963F0087D9276C36566
+1850D76D0F9BA36DA698F5B60C1FBE717C3F54435B4FDD7ACFA13B5E33A6D8D1
+892127D458D2B3538B177C63AA22A28F3202D1F3DBC78DA20AF37C1021E866B1
+13B44CFDA6385152AB8E956ABF92CF26C7856F1D7172B72004530E8F72A729D1
+62FC5890998A99BF6722DE0FFC88FABA78A8C20AA9134CF23E91A22F072E0FC1
+CEA674D56637344D90E089A0BADF717AD3D206B77F42076EEE81285FBB3C4DD2
+6DC022AE6F055641C5D5055490615328AAB0231173D3D82A3D0635C98A57B5FD
+D17D8E162EB4A741E46AD79B309A83129B90C43DDD942178D25268693AE72F66
+6D681A4FA8B2477893175F3008EEF552E9465971C6B191B8D3ED752968F923AE
+CB58B21F1A30A2805ABC3BDD397F3D5B215B0698D8DCA31415EA7476356F9124
+8AB53FB92DB9DA8CCC5D4C809B07C2184C794F0DDDA42481071CF1F5F4AB3D7D
+E1DB9CE98E2B1DD10F21A0717E5E69694C514BF8D26760C6A22A08CC5EE51D63
+E06664FEBAFE8EA3EF4E135D2CD0AB55040AE154F6CA8B234FE0178E51D2EF97
+CCF679A44CB4BA96B481982C59847B9DD51F01AFA10259A9ADBDD053FFE120C4
+93DFF9FD4972DAE079DAEE29A0F626822AA8AADCD068449EABAE9C4E28C5C3BA
+A5AFF4F8032A501D346059981EBF2BBDD15216C2FB2F3A34AD00EA8287692731
+59D4123E00A6BBC4CB52DB45A2E8BB824F2E0310C59E864A74877AB5207E5286
+04FAE8139078F1738FDB78BE9E806E91506F92047BEAD7FDAEFD37AF16766D4F
+5B87C3A0F7EDD1ED312258C750110A03208A81CC2FE254863CB2898B3A819F2D
+CB453312073C7EA122F58EA7402EF6A7B0C729C31F9E8C66735C59EA38E3BCAC
+CC6F85A6E454C6BAEA53ACC2539978118B095E6A8ACB62DD34E1A0E626955F25
+BD3D4181C84D03DEE36C9F73279628034440970B0E4652883F787218F676D60F
+D5560B7E81F46BBEF386127BBDB53D25E68448A975CD56BE0A90FDECB7224FC5
+E7E4377C6E1F717DD65F6A274994CFE7FC19DEEFB52EC0E80B8F4A66179756C6
+668E1374FA9EEA082A9C50A057776D363F68E42CE70C176516CBCD978DEC483D
+4DCDDD173894CAB70B73187E5BBBA0E7A942DBE072F2BD0DCF8346DE27FA98D2
+1C0F6B1E5DF13F95F72715128053E9B14A055D9F688B1F4F0D2231D7AF3FB95A
+99A9211EFF34382498160E4B56B58D3CC0FD2749372883A262140C4E6714F5D7
+6BB6750934FFD3110CBF8F774728E4278EEC55AEB085CD040E4BAD9A9260DD5D
+895AE3276AFDECB790793CA3F291A5B9076094B5B7257141A512311094E29D5F
+BD714C4AD35CA15C50CD05B57340C520068CCE29BDE02F74CA30D6D1ADB555EB
+22BD634CAD60BB6E39C1A9F1A8DADFE8E86F1CD55938E4C906DC4685E758218C
+FA0191FC6EBCBA9042FA4AD9530EE7A9A7E11D9BD9AE3FB5A1C89898662200C6
+4E39E2DE83D6930685127D91CF72002A6BAC67DA45FAC0B1339E63A2DF0854AB
+DAD80196B01BC1A3A9396EE80A258FFA390D92CBFA4452053BBF6307EAD2720B
+D9674E2AED09E56CC6D3BF959A1AEE2880B065B9FB06C6132861062BA5099C8A
+03254537748B10A647F1CEA85D597A49335CC40D3864436CB8C374E0C45BE51C
+AFEA0A456252D1446648C11B77BAE6D06BB1AB0AEA89B6683EFB7343EA55CD31
+DDBBCA49EB4131D9796D5E9A6CCA98D3BAAA326A7FD554FD825E9053438601E8
+32AC8A3D146E3FAEDDBE8F9FD9D7A6AC1A896380F2762679E60FA6E763176FC8
+0A37B7C8F2A54DFDE78431694A6BFA5B0ABA0F493D71DD10CE126E4E5478A19B
+2ED5FBD147B0AC82510E0D274A7CB5AC380B1B2006B28BD56725C28744010753
+F3D80F49365D5006829FED63CB9571B219B385EFA247B213A287F8D31AC4AC17
+88A4E78E365F57B70789D7925003BB63C46296FE532C382FEDCF04C5607D099B
+FD6576ACF2CDF306EEE9E7630EABC9D0D92569AAF61833401353462890AF71B0
+5B84B2E8A8A3BB3C66F9F7A94394FD517973078F27D6695A95B43139334FCCA8
+483943FEFD671409BBB2769C8ABD0E1D2A285C3478C47BF8F0EDFC4ABF84F603
+0D887AC6A64E64CAF304E656F659C6948C180839F3F7A080F28CA9A709FEAD8D
+88BB59034060C90D2A1B932C5284AFF0A5AAF89F14D3B913E320F9F732DF9D07
+CDD357005E66DFDCC87145B9C3C3C5CE0F22D4B5DEC2A17886B73AE5D798A70D
+15F48C2F617CE0AD7A4007088A67B8FEC0C4FB4F8BD6C351707A524187ED4C6A
+8323B064EB78D64A49A5B1B43A8A1E463235B276E342F24431816EE5C6B153BA
+55F194E998B6EC925AC28831C6564663C89CE51D484F7E49765600A125D6DD42
+3540B96C3EE833C9BF277D9B3311204A3E300066B22D0D4F6B43021301D08375
+3323D1726E22C04895627F0057512222EFCF4530BFC8481C361522D9BEC6A0A7
+06A44DE773C04CEA127335272EE8EDF83B37DEB70C29FC013D8B7306E4DCA498
+05DD8D20731DB26C86ABBABE381CED244B3351B9191D5B4BFC8561888BACA0E8
+1D46F3FCB1C967F9E6D970F3267FA1B2F23FAF2766DE89FA764F314AC16BB174
+0C1B9A34534A154E2B040BB4CB978FA7AE5136969F149CB186E27727E2C39A22
+DA727985D1D1F0CF0362D02534F7BD45AFFEE4A23F7B7F58E41B65FC873FA6B0
+C2D90F2E3CD6E983816A8AC0A357F2BEBBB9042419A511CFB272AFD4ACCE3E37
+B6B55069644487B786A6AA482D8919918AFF871C92BAFD749F78D8C87B5DEE83
+90E323339D9456E29114C747926594AD9E1914F07F659282255057A4BD435A5B
+78A7962FCC1435C2643A529351200BF30403EB737649996DB26A6F5886A43625
+C6A60E77A37D5DF9208AA809245DE5FC9388B2DE22E4845C63809DD18DC2B0D1
+9BC1490311150931AED3497ABAA74303D3F8393B12D89F8C6558622D678050C2
+5D4318F962002875E7BDD95906C31E33AC2E1F9EA80951E4920AA685879E11A2
+D878FB2541B561AEC1AFB3BD19017BF750CC067DDB711D176644423F3253E806
+47FB4AC5E9BE4F3EA6496A486815A6150C8063B5D2D0C03EFB23DF24A1F5F4AF
+835B305DFD8099AE6295CE6452FC9847E1E2D516B08001738F1EC4FC0B848E03
+9F72977871986E0D42B5C31A3AC1A26F59C46E1B2AD9E6E250489157C6496DA7
+3D0D402F3CAFC7DD736BB0C48796247306223CF03E39BD49697D30B8BCE8B934
+1D2DAA72F7FDE356DF7A4051F9985A4C77BD0AEBAC90BB3BF0C993A465A98500
+DBBFEB56F3B9C5A52B60A36EDE79BF9451CBB3B068788EB48D83E3B14A73CEF4
+3B6B84C45C94919232539C14DF8F5DA10E7729AEFF7D3CF49ADA55F1F20E7708
+A867298C9FF511E8DE1A26089D383BDBBF27066BF3214E1B02F03C0CD7781B44
+61023CA9B728B39E500E14375331DDE304F2498F905D1D74E554B61CC07CBE50
+32742DA18A1F5E4453A41E2104508C1F0683360F2D36241B43C32AAF8918DC5A
+F8A1FFD1E491426C72519022732A4C2215D28DAFF0B369FB7E14A12FB3D4E764
+B326742DD4B3ED5A0DA71350E6329E4F082C00FBD73BC06D8745AA737A8881A9
+C92C09B14BB2D87AA395EF6E1C8A6F9DDB03C8994A078ABD9F42C5727A1DDD62
+734BC08592E82C90BF5407FBDD9646E0166601B3481A982BEE3EC939774947AA
+98663DA46206E7A75B1E7AC0247834B4577D0F854D19E01AF0301997B8F6DF9D
+A616F6D521685E1A8AD6F8AEABE62D8E1E884D749317C5CAE473811AC93C25DD
+7EBB22982B35516497D855EF8D80DEAC7F44BB1069C5A94732BE0FCB9BFF90C4
+C783DD983579A30AAEF30E01E965F2ADFE1F47E8AFB7E2430FF5C29D2907B64A
+FAA1CFBA126F0B20513119A844E6A8FB598FE53D01A15A9D6474F0070FE57D16
+CD12153DE8F3770281250D8F71DC74CDEFD3E5D7C8FE54C9A6EC3722200E4229
+54F09880FC36D1EFD0526D78F2CA20A5D2B34F6F172D1D3311F85DC40CDD2DFF
+AF93355E7719DA843D2BD5D53D6484AEBFB61CC878F62610505BFAE093559100
+311FEF8A1D1D5E62A860C77CDFC300E0ABC6DF1EC65DF7B73F39775D89C1D183
+6F68F7E43766F9396053909C6A73770F092870FB9FF6993587369755299B7EFB
+84F698B342DF1A7448E06BAFD7E5BDA7692DF6A1EEF16601424289CBAA4D271D
+039BD2977384B96D8464FD3605BB5FDB8B9B0D8D847664323BBC0ECE60CB8F08
+9E2A2A6082F3EDFFAB8C90144925C152B9BE768420D36B3978F5AAE27076A2F6
+3D6CE17BC4D8B402EA6D17F5941252D992F2ECFBEC965700730C46F4B358C289
+0599A0B8515B7EE32AFCE928FB5C86C906464C725F7EF33F3C1E501CCC588F87
+E9F4DA5880C6E7C6D85B60D3EBB8A6252847B30BF10D01299C451CE6DB3C8E9E
+ED4DDD03EF86BBF1AEE9D2A6EC2B2AF1D74131FCDEADADBF729A01424E7E3605
+DECD9D47E4669B250CCA42F8428E27DB4E06B5F53F6AD9DD8DD4705FF1F152B6
+2BC341084E1B1A906F6B5E87EC197F07C4D1914A61CC4F481013B1B34386E61E
+CF0F89A85BC37B8C10FF3F7C0A84FB8D0F4A789EF861BE07C5DCCE8CDBE1C6E1
+74AD0D12926D48FA5B17A7159A270497C44D0C5D34FC406C877AEA43141AF383
+366C54D73D83655895D321F9F0E05BCCD097059204CA7FEEA5BE7EF0EF6B0BC1
+B1E12087CA692EEB2A093A61028212ECF70C24F5811B53C23B795EE7C1065A91
+301985804871314D5D009BEC8C5951422C3492BE918865CB24A90DE4DAEE9941
+D44D8D1E3A19399F13B93D9B554E0F4B7E3BC175C3A3BB199137C3DCBAF784D7
+9C2F0D297EA7F6A67087C57B5519A98804735147BE66CDFF26667C7D02A567FB
+66A67AB2E9556E6C9AE40D3CE74A3537D77C7E9F73E4CCD51A57D7682998D349
+D4B7BF5032CD089DBAB8682DC2477EFB73DB13B45BD482CDDFA1C303DDE44344
+6E46428080D75CDAEB0FB49A63ABA348AF1127128164740938E53DCFDAD036FA
+15EAED8E5E059872CF107E8F35C40C19B99299D0375D87D1BFA9E1A01E4EF7CB
+AEBE623D32353CD7684A1B024355537C76964BCDA7C5ED1C52DC4F978BE757E7
+FF15D5AF5976B26B2363262545732285C77EBACA3D7DB5B4DA996BEEBB7E1A4F
+11954E669DE14B907CAB448E3C57CF41D4C0AF36266EDDB105695B2E4947877E
+B1F3A5E6E0965163A200CDAB98D323C10918F931D3C555B5FB94BF6CD3A85C53
+DC3E9A25C9DAB9C9167F560F297B6FD24B844F9F61FB670F5521FE1FEFC260F3
+E926AE8AEBF8E67D3EBD682120F16D0C5CD183D626883D5D0AD262569CBCC810
+A6E3532F63C155FB86CBF6A62EC2D4975A0D77338950F885151F0383F5188E09
+A9E1B8C023F7E0874A8E1D77C0C11DDA2EC873CC2BD4C28604E044677CC9E6CC
+E364DA954F895436AD8E34AB6B32B5003F5D1DFE6EFFCDF4EE3796E249E40161
+7B569C73B92684849427716433BAB933303A7D07625363424D4E83D3930C0311
+D6AF29347797F3FE7F4D056A5EB03C786F5F9808146F8BFC4C58E5B4D69921D4
+A08A8E863A71DC8C76A8F4B40419738AF9DE5EBC1C51C6B486D3750307647DCD
+9F9059E4AD3C94DEA662B7342EFDC90B3BCAB589A88641B08E797CAA35C737F3
+DF938004CA4E9EFFF243628AADD3833DD3561EBCBF76153BDFB19DA55B3F6335
+426B697E11AA84D69CE8C6203A71CB424C72AF75C1818F6A1D3242B6CE503626
+1617FB6D26FA16D8A9B9AFD9BF39032DCCD437A962DCF0CEEC7F65AB8458CB43
+9BC970F973808767152D4608394B82E83877E96D5FF7F7C34ED8E710BB2154C0
+76B263342E8A6977987E6EFB3DD2AF1E6B4901789D4FD1919A0D5E617269DE90
+37EFB267FEC47065B2675063A2B3BD3FA2B3E0E04ED9832582F5515AF7E75A24
+AF2D6CDB429757D2C24C9344CD28DA71588E53A0F8EFB65FECBDA4BB89EDFAE2
+D6A52C31C01B3AD728D9B5F6FDE3F2558FD1C5ADA269CDC8F237A292E60D07D9
+B0CAB32249871871BD55E515F7FC9F4DE75B2CC3F90C197C506EE869389888C2
+EB57F251F7FC770D1B943C66B449BF2C28599EB66F071FFCE3410C547A9B74D2
+14AFB75B542A8D06A25135505C220DD1A84EE4A8E900D490F5284E7EE1686F07
+9F72EEEE0C0E225B9E736C67753052ABBFE1FC07FAD8542975DA911C65CCAEE9
+8C1480C1F598DBEE4F369D5FDB88F12DEC919082DC237A9613EE4D46751E984F
+F2CFD2CC7BA41FD0B987963E2451C4A88F0183FA16E59C55091C22CCF313C333
+CBF22FD740F44B4AC975ABA0286FC31EBB7B819AE455CB993EFA453C966E426A
+0AB8B3F2D148CEE3190E80C659E171B0BC037B1A59B2C119DE916B29DE7054ED
+785232C74B7B97C46E806D6753D23390AF0FEF7A9FAE4339270B8C5D82706832
+C9FFD6B1B81B9E553B4A7E3C50F98DFC652FADDC9D515FAE8AB259EB719E1F85
+0331D50EF2E7C281D42BE8B34EC2E2AD193F4267384FBD38E55D7951FE1F9C33
+B31C84C0BE7180B2E3DFE45A76D10B7C0888F4FEDD5A9E478ED0DAFAD0958C9C
+7A80E665F2C00F6E192B9B668190589498DABB64FCB881681D7BFA5CA100B59B
+A60FB6294C13794C641CD7B8368BE64EB7C9538A2F8957463016D6A973432DF3
+C803F93469FE3085C228FCF1D35303FB1EF52F939E917697C5A52D3F6D51F6E9
+B7E84A5DBBAB93DD3CF197130CAC7F327ACED1EA729FBBF3D9C2829B9FA5A211
+73244968E18AE8B8511F987E96279E3AE01FFE68E34547E71B3EFAB59D0B0A01
+076C2C1F2609D1FC87AEAE92E4880F04B42229B014C1532DE7B7795242AB5472
+5732E2B44E1EFA6FC103AB903AED90A1F74937B9894F811BC6D7D59F990FF0F5
+44CE8C5C086BEC650C87AC6908D0C344FB75D39E03086E183FB95F360FED53F1
+A1E6E7CE34EEA6DEE60B8E137BD76A4E52A5A74387C9F301ED106305D53F13EF
+CC8BE299B33BBD923AFC2F0AE54C0459012F203CB424609820A4CC22072E177D
+99A35B3E8F0F4E1CA65FF340836605EDAD3970BFDD1E7200FE6F7730D33F2308
+E6EB173B2F166FDA22E38A447F7408BD9DC974B5275E25F7F1B3230E5A39C914
+1E775C84F5F08DF1178337C549334921069ED4EB4830E5E1BE4EE7195B465068
+6C129D13B5BDE71C21B0F7B7119BB0E1EAE6A7874FF05B18FFD58CCE004BCF21
+2516296D5EFE0E2EA6E2FD72EB398E44F6F225FAB6045756E1D6148F9BE2064A
+3764669F18F11973816C9D25F988B97A025C9805CEB46BE11D54F4BAB4CD7848
+CB68A5110310C59E864A74877AB523819B36E846E285C4137E63A00A3F971043
+EFD019FD28410F770F19A5292DCD4C30E8928CDB1375A67FFC9368010EA2D6EC
+68330660124E1C3258859317FB58DA0525DC3733983BE6202E89777695B9CDF0
+E3E671A8BB4EFCBD206C8B9338C33095551EE832F9CE01C9196A7B32A18571EC
+6AD482DA0DF439C56DF1724D566DB0C15641C103FEF5F1B4DE109C3E06915E34
+61C79E71BD7FE5E527B3C8B0A5C3855CECEB5F2A7F29C142AA9CBE59EB4D9333
+DBA3A326B77B817ADBF1E5A669A87C3886435AD5198A6ABB4EB0E5BC4EF204E2
+40BF65211A22EF9A20624E5AA18F7F2648E1819966BC2476D4AC4E4347E74591
+9EB11FFFD39B1742918B32AE929B96D9BD9060797845C5AF725F86A2ED82D15F
+CC3FDA97D5DB0C39392E35E65BF81B82F8E826BC7060AFA7B325E89FBCE55E6E
+D5D4DE3AFDBF36B10851B0883A211E7D47163232E7A7E0C1ADEC67B5EE5CC6ED
+DB55CFD4CD875072FF79F4ABDD8F935F0B2A4E7C290926DB52258A8EEDC66700
+FB549A928216A715C9B362B32A001779973DEAB1CFF05FE0BED47D9635F97419
+F753FF9C5850EE37E59A4A3B90EE6AD37E08E5ADBB28E969382B124072BC0D21
+A599EF056F964812F92976EFAF5381161659ACC94C2739E423290FF87FAA965C
+11372129C973CFACD535CF89A430D7C3D779DDA1A46A3E632901AE636E9402AF
+A574ECFC7ABAAB13A065F9DDB32F4F9BB812FED25639E9A8554F23A623FC9AEE
+B869A2E66242878E71BB82D5815EF4F08ED56490BCBE0C31BD32EEA61B1635C3
+E67283F73FFC302D910C003D0AA14C72D396FCDF472EA459E0D38F1B3CFA112E
+AEB3DF7D21AC8F8B1CD8B2BE97272017FC8176FB098804D8C4CB4489A057DB04
+B85024823654FD33D3C4D429D37AE8043EB10733C06CC88625A3813E3C37DDD2
+71CA821B14F1F8FAC9AAB39662E6D137560A8363F8D0B481C0B498A1C74FC929
+BAACC1D9275B3C3CC4A76F9D5C4315481E596F3A812E0C17F5C1D48FF7CACAF3
+38F46A1972471E3B18CB7C8DA45DD0F6707DC77BE488A36A54D9D95E7F9A7221
+17650C8F7ED57684A4CDF5D554B1CB65ACA71BBCE35CB6D949F4FD9B13B4C057
+ED56911268DBF6796483C2CB3E4716F48CE05507447E290E5C9AA8696D0DA427
+782BA27C44FD991761CA10FBFBE802FE062AD9F5EDF8F43667B79E809F5F3846
+8C15B44107090BF34BCAF99EEB7C1D138047E9722F77F39C29EA6F8251D45152
+7AEE7766DCCD9B30F171DDE639B45488B890196ACE90D0FE6BA179E313C19ADF
+A5503C6E201C1C415423270A581C7CF16389EABCD20AF8F100FF57033A1752FF
+05F10071CCF05245C4AE72F3998A9740C6CE8A5DDBB1D642D0441FE2F5A3B451
+290BCA5D541320D8DE866103833E4AF62C45574E546C1525E0B46008400A3BA5
+D6D7B964EC7C7A75ECD3E4BB1C50447C558FD565E8C78B0395D9E5FF2AB13218
+F2B69738A10C83C684E472DF545D2554E5AB6364E2FA747EE9A89161F93F178D
+7A24AB2C734D35081B6EA8216653BA182F7FB05BFD80CDF441BB5A7A2EC1121A
+5493374B3357EF1E884D9AE0CA20D5927493B4A1A42667DCED2DA7546D2A6052
+5DC13209A1520B8ECE299D8728B868B9FC5AB023B335EAD7599B795CC6BB0775
+84C71AFECE41946AE57589E52A9DAB9B4C1330A788832F2E6191D3F22E335FF2
+4246DB126C63979328295115D81E5170AE081644B02AEE581AB984FC189B5925
+461EECA10758CF9F5CFB1B3156064CEEC693C16B03E5872E541C1A3AFF4C57B0
+BA196BDF885DB63DEB07C06F69E3E7B8F62F15899242629F16F6D74D78150FA9
+3EC698E24B9E47DBDF449974F4BF9DA358EBCD3125FEECD891697B0FF2A4DD9A
+D740E8CE533A0528C013A3BF8117039EC8B85552135F93EA5553BCB27643E0A3
+FBA8A96357C0B476B8B54F5F249AD4F43487F61D3712FACEC073288246E7CA38
+4F311F23DC5A7F7DB374E0E3D066CD65F679C6AABD932DBC998B0E182044E467
+37AB82D182E5BF2AC655DCDFC20968F5BD12B078701E01F539C74A00BB54631B
+D38C0D833343743003D9EBF5AF03297DD128E279AAB9E3DBB196942DAFFF669F
+444AAF97BCA6FD8B3799F341D019829AFE863747C1FDC7B38BECE8BB0B252377
+B0EAC04469D32C787EEC5494B7CE670CFE23D6CBFCC24DD5A6AD833A4BA6F96F
+E67FE603F3DE0BC536C3F244112FA950228EFD70BFB209E1B9EDCF0D3DD6CED9
+43EDB3DD9AE5B2B077C4245513CE965D1C9B09EB62FFC9AE98647776122A2639
+6D984DADE28954EAA105FA8B9671F362A4BA881C2746ED44CC856FE7D20B0812
+655D2E6EAACD7DA7010ADED0D6A83F04F396CE83F0549A68DE0F04859B03FCED
+CC76505876A049DA9D644D232ED54AA8700B2D4FA4074CBD855420F4834C480A
+CB1310DBB8E693716D9FFD90CB563AFB8D80C54177E7D853363B246759EC1620
+9E86E6C5427BA56C5D9812FB9D9682B78BD2C6109E3D52508E1EA036ADCC813F
+D66FDDFC026516FDA258B0E7B32357F41490796CF35B02E38BFB36CBF2E6D0D7
+304344C3A606C6843BE0E2CCD156111331E9DAB047409E478B58C4711E4D3BA6
+0B95605DA55C67C5F6EF7AE2049EA3D7D640056CCA77FAA27A113345C9C161A2
+8C5A324D31BB443BCDC8D71DAD38C0EF448DC010FF32F01B63640A3886BA13F8
+DD625749018A1EC19C7B47A86BDA04DD10EC7355C981C23D2B9D8D0304DB1745
+BE10587DABF1A684250E204AD90CAAF7A0B94495594710F7BB631D9C72CEDF44
+7A7E2E1627BC84CBC737D30E9EA0D4849962B186F26958C9DE0CDA9071928549
+DA53556B4C8D253EDBE1B045D65414D629B139C0B3C2BF3D2905CFFAE9EAF0BC
+BF782D4980EFC41B863696FEEF72E35112E7BADE4F01C5617F52F09F53B087A3
+E5284B1C41859808C27C7DF8F7692DE791D9F3B2BAC8FBED7AE0AA0A7DED469C
+64A0CA60F7E78373DDFD3C560DC7FB06BB67D226D4263EECD5C0BC235DE87B1F
+F6DBD93F01F4F3989D8141816C3482D4E4F51FECC9351B42923E388B70E7C41B
+77DAE3DABC7D464AEAB154DFC2C08F8C1098BF71196B775C4AB138EAD246AFF3
+5AAA4298F411E56C523B561890369545087DA97CC8C165D47371FC14E56AAAB0
+1F70AD759641F8B5476C28FC1B1B3E5FEF3A3B94CD552E29288AB0A2F7A47B23
+E481E1A7294BC241E15FEDD736C018E10B32708969CE7950969557336AC8DB3B
+61E01D64D56E8C4D627AACDE838EF96D043E0EEC1B9D820CF93F5FC0BA150EBF
+5A707EF78DDD239111BC0C866683696D3E2E001BB7221D658F7D31635BC15A0D
+56BA691658ACE98DBDED712405D1CD18F7FE5FA60F8F48E2604F7775BCC1B2CF
+BD45255634DF0E134FBF59212F1F589806F5A9586A71D54C04DEF3A43B137D87
+5DBDD15F05B2612654089FB1B1F0C8892DA1D9E5D3042D125734EB53A8090EE5
+6332CEED116EEC3497D2D84B19F68EBF7125FB02920466ACEEFB251F71CF6300
+78EA2FB7E601988985862FECBC60CCD29FC8C589974C55513AE70589392CB559
+9C78917FAB3B7048A90823CE9BCAF917F4855BE88DFF74875D85DDACF0B89AE7
+54BF7F8203F0C857CFAE8A868BC658413B8DC18704FB8322977A15C8ECDD04BE
+95BF3724E4727036989F371A8F30B1B39DA9B1F203A2814A200FFD16E8137923
+33087E98A8C64083C6E51F0E0BF508297838FE0E142A7644F56B21B1EFDAA5BD
+4F7059552906D8A529397DFFEF8071B9F1BE8FA48454B62A6A1F98CF4446C08D
+78188751402F55C38E0CA06E41B1EA4D1D24096F0E22E352D18C95C6F3F033B3
+535A024461616399CBF0E4AB2DA52C7BA6298D3869752420439E590EF307E3EA
+8FDECA91E0C88FF6F0EBFAC5F9837A7EC7AE3F0134DA964D9CEA08972754E1D0
+90E3889B56BFA096258B227A42A8123F9C30FF7F2B77E767A4C9492E72CFD969
+1201B056A8DC4E816B78B9EE734118C991282B1240D3E465AADC5752ACF12F16
+A5BE9A050B0DE704CD8EE4010F3BA8AE9B18E8CA380275D93F8F6670E11E5B22
+1716F312410279F4CF492E674B2237E61AADA9E11209807CEA54DB30244D8AE9
+FFF3F592BB136F41F11AFA8CC986D7928247062B5BB10DAE3331C3E3C1B56AB3
+28435C9964D18966326D31DC3FED9625DDBBEEADB867DDB7FF0678F0A84E561A
+C3E73728A55039E4A7EA63CDDCB2C2AA2FD24A3DF39840FFB6EE0B0A7D70A27C
+36C456F678CDC304C130C361A3E43BE637B70B9966664E12EF4707F6B1021C74
+4A09769DAF0833020CA53922C211444D40AAC90316E7780071A93BC36DFBE602
+9F878FC59A654615785A06871ABE597E0B54F69AC8457AD087A193B7BA065478
+C7238823FCBE7C4750D7693E51E88F1AE53B00A20CE4FBC247E09641C53A94C4
+5174899AB3A9D824CE570B00605CDFADF923F763A8F3E79EACD5C3AE21E8E0E5
+DD1722769432C43E1101F497F5E4B884F5EA43672526783EBFCF3738D894770A
+D27F2BAA1A8AC49D55D311D7B27C86E428E36BC5BAA44BB4F42B537DE4174FD6
+8DA8D6B373EF3E53B9A042CBD9DE2B19F5F89F17A00CB10996927B39CDC8D71D
+AD38C0EF448DC010FF32F01B63640A388085F777D2C6670B93D2BBA04B489AF9
+1F30654219A5BE6465FB7C139D5F26181E5EFAF2AA379E39BFF15B37CE60867E
+F86DE95F31449EF355650C284961104DE93C34446DCE772F4B24C9343E42C3D8
+97DE532796B42E8FA09E316DE508679B11650697901D5FCF5FADC38FFCD1DCF3
+859F2B46DF97AE05915E791F1CE849154C53C441E51016A90F3B8A854B7EF90F
+A0DFA208E4C47AEE2825D122647070692E6AEB04EAD823AAA6C5FFBC6DF00943
+C47B69E8089525CECD505DC35CB17B6D8F433F9402B19B552BCDC89E406FA36D
+EC4533CD0A50EA849F3EFC984B4883682C351FF9A5635B535146BE6FAABB489B
+F46C06130EE6136379140DE5FC984C54F9302EA55BBB16EB537A5B766BE0F3D7
+F6438FA7E464BFF671439E450636382FC6CB22155A37D36FDC2843EDBD271BEC
+306E18112A4F29FB80D1A2E5CD343CDDF6652C06EE776A4C649BFF390BFB75B7
+10119768A161F8C276614552655D1035125F6122A9696CFB3A0C9B5ED57ED3EE
+4435D71ADBB80DBFEDA43DD2ECA72702A4357D241AA942314ED22A785687FCFC
+1E029E64293585DCC8F91CC8B8E94D2D8BE385F8C9B2A2F85ECF808E3F4F7341
+5A620F8F1D9563FA4A5153E1B4B548A0EC5AA55A9FACED611429DADB394C6994
+364A223F6D9A85F8982A7111DB4A7DAA696C71C03EC86DB57706DA244B8DFDC8
+661514CDE029EAA738F71A4423EBE57D3BD2407FAF55C2394EB13D8AD0FB57C6
+E4117640E0DAE8EAE60218354FBFB4894943AA2C3AE10147DFAA0539291B9B80
+04F29F21B2A9D8EA7F0DAD2236C32CA2782B418578622E6A3313CB79B6746E85
+6EDA00839338F8D6BEC3B63C5E9999C06B34A79E0D131D220FAEC4A8C7BD0E74
+E4B3142195DD8F5B2A24F02D5476609057CB16B5DF771D52B18ABD206531B6B4
+968A465DC866DBB7350D5408C621CDED6AC22293A666201A11EA39E6A0080CF4
+DFCACEE5513EAF3E903BAB38790E872C882A653878A1F10CC1C84D2B69E1136A
+43B9372388E597F33E9E95C7949061F1368E719E3A3D5C8CFAE64A30771ADDC0
+FB48077B4425BF9CFD3E5640AAA9635A1EF4AB3DA5462EA74965A151E84283C2
+FFC9FBA8B7F9D8DBB688BA172A2186B219517F331DA0D65F21839EB857847E37
+5FA375742A1B2D26366796627D7A18371F4B613DD0D61D0EDDAF6E7780F00DA6
+2502C94A10EC87F2DBA7B2BA9E46ED8A27ED6D85F54C29D524819DF6BCF9D323
+7059FB7318D42CFE278CA6866BF81718901D53F6E6B3D8B79A6383A5CDAB2CFB
+5B30B3566EB48440D16A80AFB6C4934C35E1576099082701FCE199811DD294CC
+46CF1F11167E7AB4A2C62B23E03259AD33593BFD738991C41FF02BF93ACF5E65
+1F75F1C47F2699BD0DA86F7C5E1DEE096A0BF72B68B2C84DB4416000A82B7A78
+B66DD731D76AFFC3FC67719A505F093E0BE8952AA32CA53FD08E1B8325FA4E99
+C1DB82AC245B5134E71C17177E335A1A74FFDB9965DDE13C7F0CF7EE179BBD3B
+A15C58FC473156524436F43A7A7DCB3BCDE6CEE24D8172145EF7B1044B88E096
+ECD3B8D6F6F508EC1F59EE227E4F6A352AEE6F4406F7B81B499E5B1737842382
+2893F71FB98D8F5D23A990556CD485A15DCFA2866D7CCA73C0F6FEA6D19E3594
+B87035A3444D643B1ACD115FDFB8CC64ADDCC52076F03499BBC0AAC68B23C504
+0989825428B9A87CE2964FCC42CB0B4E8D09C7061B705F415428D5B4E246EA48
+2A64DCA9515D6E911192A0772AC9CCF99167639A74B7E4A1E4C8B419499D3F6B
+356E3548C00DAB9B0BAFFAC1C63682FD226B1369975F6276B34A7453D932AE04
+BA8C1D2C658B257FABC2CF76D35FADC354CE9369D5B87FD1C4C0B22C68FD70E9
+72EE164F6BD2127F47880DC9D6FD27D6203C86D3D32879A5F548ECF75B9807C8
+A60296C74D5AEABF0EA6EC704BF556C274C0C815503DB16E32D80F6638DA50EB
+448DF2CABA8C237022C0FFBFCCF21DF86FFFC88EE84941135314135CD8FFA407
+D97F4E938B9192C87A4455E492C6839B85A90C23F82AFFB57F98048310631E16
+44C74DAC6FBAD49F35764DE6FC0B0215E25014C66F3D1EEFE8ABB3D2BCA2CD5B
+A3CD63BF413466B982EBFFE53A1FE54984DB1360E320862F2CA6E0258504B106
+1B4A49B2CC4717EACDF33AD11FEF95ADBBE87B2CDA173D8185011BE8B8BFB0A2
+70084FF6DC5290ADE2BB575D8D86C106679FADF3E2C108112B3410C6DD545F7A
+5B59A8A0DD76EAC1477D781DDF9ED17BF1BF122E0579A5244BA3DD711DCA361E
+BF3DB4F6F633CEBB85B1388EB9093F7202049F2ED6C935DCBF4EB62E1603C7E5
+2243354E0EAECFE4448F77D161F6228107C92BBA32694019163A2BB020C5A23E
+03EBEAA640CF23D89D1C2F0FFAB1453D08EC588B4CFB64BC0DCEA70D390396F1
+D3BE6F911B44C4DE465FC53E50F199A73C1B4EC66D314A9A4AFE99074EAB5317
+DAD5B6633F0A13B9872C8CA009ED9A24AF8D699D34FB28FA68B37848C14FF933
+CE48AE61ED5D235B424304BEE4FDCAFE4E203DC7EC6CE32D227A9532A3EB8AEE
+A67912F19EB02D56869F7EBC6A93EEBAC7645C28E715C6AB21674E82E6B49A5D
+CA8AEE53295494C656833437ADBE66A53BE748C4E76934D67AA367955FD47F2F
+440D7F364C4030648BC39783FD7AE189510DB574B4F69F7EC0494AE7680BC389
+A1D78C6E2E6F172BF65651821F57267142DCC4079C915A4D01807FDC883E15A7
+77BA2559F1CA6D3B3B36E991FC1F66E54A3EACEF43966C21861B5519E7CF062B
+EA3391C5E44BE01179F69EF6CF8CBF9EFB538C274E3C64685888A61CD2FE2A39
+12709F7BBF1CE631C747480C8C7504D585BC4A036D73CCD2A1E110779597A25E
+678DB4EE7B616DD99080BF7936644ABBE6B137B048F04954ABBBA8A573736866
+4950625E9BC497D47608E12E15E4A069800228BAE3E6D4040A1A4818F331C5D8
+1A4CDA1C29ED601BD069927BB266B91E364B6420233E4952E6F77BDE60B62F6B
+6B4DFBF3D68F76E1708A0F4C33015C8D417C0C33EB54B7A2B52527D63F3F61C3
+DEFD5F9A28572ACC884C98F4371C933E0BD0FAE2828C097DE4B61F61188A78DB
+AFBA196652FBBD27B5B592D5FAA6A668B2585A3D6006683222F07BB1F0756D8B
+2F1C653843A05DCE23E9D6C1339D085BF92634D7F8F9B286FAC18078C9EFE517
+926FCBB34E12E947B510A95839F71C4F0499935074B5B5A3470CA5F34361AE57
+5EF0E842E222CA480F1F22089A3807969231251939279C83C0D2196294FE173E
+A579ACDCD5CEB4EC0A94C48C7F4E20DCC87145B9C3C3C5CE0F22D4B5DEC2A178
+86B55EA99E2905B3C3A9161F68FC308ACD0814D6E10BFBC4A88CCB54A86A5456
+A0293797A1BD1FAAB9AF2BAB4803890BF934EAE9355F75676B21D53206AB65DD
+1F7D4233D4632195A2E0802FC871CA864B3ADB40C28AACA1C46B46A0BEEE09B1
+C6048724F4AD47323294281412E033B05947AFDAC96839397CAA9C23D0F483D1
+55FB93C29413CD8D2A61151013D6B8AC2EAA1986507AB035C835C8A26FD2C817
+0187CDF780CAF45A8E0C2D394A26B50F8BE7E44D56E56A9F06566377D2DE31C0
+0D90FF5DDB509F8B457F332D8273DED975BD53607ED94253CB78FFAD6ED1A49D
+7B114110F3599D8E6CB9E93D141668D361EB443AC08A22EBE619598C6FB61C68
+169211790027B87A0F02E168138C8A750A892DDAEF50284D2CEADFC997B78F9C
+5DA0DC3CD6C3C4F9785345DC3D7A5F085EF70FB8DAD44A8EBBDBE878E238A3AD
+7D54A0F8D49FFBBEEA2A08DBDE74C2C7B2486D61BED35C2AE04107B03CE274EF
+E7CDF2F9674EEB53294C36C60F1F06698D3E30BA3AE1061EBF247EBA5400A1B9
+0902EFE6792F207136E1E16B417CD36317402AB9B2A5D930CD311F25903323CB
+59496E9328FC10A74842D5158534EE24A7385A1D4CF42F407B4B6C3BCD814E5B
+F47B361477000DFAE3BB2EE755DA3BE55D85E91D72361EBD1357DC99163C0ED4
+8D9922DD04776729411CAB781E84CF62FC66E80487392E46B14AA9C67B5709DD
+99C6E4975AF4B07B70659EB87A19673A5C9C34F0C1E2DD5B30262AADC374CCF7
+6BFBA651FCF32F0F8970E90CC6E9E86B1C31459738F562EB8738D25513C8E09E
+739F6A791758689B85B65331B9E7EC901725E190598A31E0BA4C800DC242842A
+634C4E7192D8385D9396135C859A0A499FB006CEB1047D6A14598F301B6A7E97
+363ECBB7CDE475BB61587CC63A4CE668212EFB2D988624EADC18A55422AA21AF
+B3BD509A032838E66B747B3D5DBAC1EF8FC4C3E124D3A1F94728E44D62711212
+86EF517780172D12AE96F5D3F721F94E9C9CC7BD30C73E7F151C5C6505DECBAA
+D64A1A7AB718101083E94631B8295834C8C3BAF1CCD312A2ED693B2E8739D9BD
+57A4D67E09514EB3A1D2DCF4918658979AFF3F85E682ED8680F1D1F437743EE1
+C9DC89578278B4A1B2D58C58442527FD1B230401A550980BF01405B6BB94936F
+23D3C8E3378EC476B2556B6F07D6249554F347797DF580DA0E0A4F13FBF20B25
+DFF7861AC0A9C6D88BCDB45C0778BCA0D4AA7841DE13466DE9FD1981FA55E92B
+7762F9E45EDD96CC722AE02F9564E06F0219C733C0C5299769BF8A3C47EA80A3
+53B71E82D1A5307CACBF70E39BBAB45A9653B24873E7E9DEF64D7D71D04E12BA
+ABA63D0E5B55F56CA143D84E7B14FB582DDFDF923DF4F2C664871EB1A07B3A69
+46D45571FC760DFF68FB79BCEF8BAAC89772FBFE65D33E336D9595FD349D092E
+3BFE263FDD04A29FDD1974485126E0DC86B790B23B15355E4EABC1EBE99B7D69
+B3D8E190A8F5E37AE6B1B9B3F61DB3E97A1F3E9E98B047779D494D9E203D158F
+B2F6E17BE02A09ED1D6E9ED11DF0B9CEC7A329460CF59AD1133FDF77718900E4
+F5A4B84DD25FD7B650D3DCF5F5A8C96EAED3764694E07F4B4DD8CB81852F3379
+F1C703B9F8CC4E77F6BBDC352DDD6E3A3EE287FF27B773081925A51E09627186
+E9F40DF393CAF0F0AA8A81AB02413E7ED0932A5E64E2E417C6B64D84B19F7C2D
+7C143E287ABC8407CF061A6389C844A4C3429FA2BBD010E0FCA4EBAE3C816CE5
+0B05FEC276B53FDC21DE0755EEE6F50ABD54E3711D11201CC423CC64CD04FB86
+9B9C1FDB4F47DB340ACBBD8CC9983FC00EDA6DA2414F34F3F8539D22D9839B92
+C6DF48EDF14479D008ABE5E434897E2C25C96FD635FE2248F41C853E102378EC
+E5A1E3405215F6A4D7CC5A1DF41714551C2356DB2D6D0EEEF7C4406550C1E152
+D9C840D4896A183FF4E395EB7A69DCE16AF779DB5DEF0E2C83023340CFEA5037
+551AF40510CF2FA6BC441D281066DECA6E4F900B50A7D8BDBD05E7CEC7F066DD
+0FAF0853778665ADF3BEC3B9C3E6A05BDDACF25E7CF9139621A358D19CCCC224
+93433DB4004A562F7081846E142A9B2CECBD5B039DF61F93ECD2A4B570E70B8E
+E130520420D20530B7CB37DD3EF34EEF9BEA20A1287D3749AA6F98938F455BC6
+16E82855E205CAF96F92CC73B82F88B802CF5D0BACA7359AA2E1E1C2E2D2A1C2
+346C7FDDCF26D64E436B0C248D56F247AA6F401583DDD68969EFB6C828775EAE
+DA73D25296691FB44D12928BA4BD9F1C63B57E0AAE912C86CB6CD5BBDF831035
+EE13425D8A10F2F289DBEA3B9DAD21E9C431EED6D051D024D45A9A51D740B3A9
+6E7AB386AB4E11543509A58CEE3A4373691772A120BEE77098BB898BAD217497
+4B63BA86A8ADE9327E54958A52991F50800BDC90F761E398650AD3AD3FB83EED
+A6DD6D62A8602A979308224758BB3A03BB379BDFD1FDC40E678BC42FB3835475
+F09EDF4CBE46E94F31CA3C2BD454C2ED823A21CC37359E62E679B6AD90FD8AFA
+989EB8BA0C5C56FC31A783C655776454B2D1543E2A285C2E2917FC29CD5D70CD
+DBB0984963CB8351F9B8078C98DE02FB76306F13329C50DF12D0E13998F77805
+79A595678BA44BF4C0028170491F2539DECEFDA704F7E677B8717DB0EE7B2FE3
+B5533061616F0975B16DDED3B6FCF5943BF5BEEFF1F9BF99301CB61CB5FD95EB
+9B214BA25C78CB3BED5E7AD9383F870121370795822419F462CF0D04C2C97A73
+01BCA92687198B725EB5B2321A22109A78D38A8DC2061C73BD8D0274D057C066
+1FB6CBD7FC1E4CE9448CD7D00E32944D0FAA5292F033D14210D1A7C73EECCEC9
+0B036F773A35572FE436EFCFCB553C2FD8472C2387DB5D251F74A635E519763C
+2B61D2B6D3AC3B9C5F43B104DB39F02F68E3B0B603DD00B3FD7753134C1A96A2
+368125496190F40B7E6A8C381538718E622C25E049D8EA8628447982B1B1A62E
+9C3B6356B900AAE0EEECCC0B2FB7609BA4E93AF951E78F35F49CFE00627CD830
+9098C34EFF86436194093E227746DE035B33FF9862E3081AF8CE798E5041FF7A
+E67D07BFD4AD7D7C4574F0F0515710059D53DB23B29CC828ADD9B2587806BCCC
+F6F32DDDA515963AA2E97E6EBF2EF6893F381F5623812495EF120CB10ADF5A70
+C84BB752C7360FFCB13F17547C72AAF675B26611C7635E9B93182C034354025F
+5034DA698C9484AFF6873BEED3F9698D71B91903E04F1886E7F91B1730A230B9
+886D898CB6B51822E9C6092E9143C1F6769F21B3552E00BF22AE6D0C759D6FE4
+57350C23F4007D6DCB2A974E04CDD34141696BAE8F8DE783231ABC5F59DBDB97
+85489E1FA9D96C57DC4B7603038D6AC63DB7ACA789EAE744D803921A773BE8A0
+81FB687F980423C39F59B10ED7095DE02D2099FF665BEF70E76D9BA7B5B056B9
+A6339D5B4AFAE1B7D87F43426B64371270C16E63C1587C09CFB052316D4D96E5
+7440D0CC6DB888F34434AC91D29E755311AC1192802C99351299E0C9FCDE44E7
+A0979048EDAAB75DCB29EE2874EBD426E37B2EF7661CAAC1A9F7E87DD609A40C
+735DA40E068D61F2BB133B7BA6F80A3B750DB063E962E26A130BB340B62D6715
+629FFBA7CE880FD80F40C3AC18AFF7308E78F05DBC9B5220D4500F7D6E49783E
+9FC958D3954BB4737612ECE0F53F135787095ACA9E34C45BAED9D91FF93DA907
+9844EC2DCEBD8D3032A07CBB36B8FB7CA00ACD890470AE9CBAE19B2C7C3BD37B
+2B6300A083E7D1A12507FB4817C3267AE2B08EF5ADC765E59DC22D831094E398
+6C1F0781FE7B1244C10E0FB344B666D575447CEC9F275CA0873ABAC5989A39D9
+1E2C927FC0F9D411C4599D9D6FC1174AEE5A6889CBA54B96C650A14153D4FF9D
+B92D17AF766F10106C684EC5E7511AECA5B6C17D57EBCE1572CBFE26C951481E
+D7C692CF08BD1EA6C5B30BE280953FB8F8244EEF8BAAB3E33AFAD299FD002D2C
+1A74C796978472CFCCAC13D6C57D2B872C05B9540C3F5D8595958A47E71EC811
+501A2632E9DDD7EDEAC56C518175212C74E1EDE35DD5A3A254B508C25C05E1E6
+4067D6A39719AB32B45F571A46D72EC70202899C79E9AAE60D511A68A3F2E7CD
+9AC4CEA7AFF4075A15327318F6A5962CB9AE8BA6D7C7F874F914003DFAC63827
+2F8363B436C5B0F17FCD98512D47BC82CC947D4C7D771A71AC1645EEC33E4C86
+76979F98030CAA21B527A604BF1433B97814C41B3C5B767261A8B9F4BC91A9DF
+C03C3F55166FC377E829EB5FF218DB2411CCCEAF45E1ACB497CB6F88ACB8C90E
+71F6DBBC9F0074813A6BAA4F7CF2CC57A84CFBA77156ECFCF4FF8246C984CDAE
+DA86706DAB4E6ECFCB1D91887A61CE47EC07998778B4E07497DA3811243A8611
+5E451D3EDEDF57E0EAF9DE3500921A7818FB318487A712CCC0EE9956B7EB9820
+A92F8C86B98A36AB956ECE9F5C56207134A147A8A74C8B1939A6DA38FCF89EA2
+BCFC54BB19612DDAABBB009B09A4C293ECEB28980BBE80093D74FC73C33B2158
+D0C4E5F9C7B68C529D474D4703C51FCC2F27B8F7B321867AE5AF3F3B38BCAB83
+4C9E0D06A6FB148FBE8EEDE3CF25BB0C4EE70CAB7C5DA7C9BCDCFB67F1B66E86
+698EF0DC35BBAF357A32CDCE079C1047F1E55E05D8008B061B6F44475375C498
+19775F2522B9208A27D9CC966928CECDF3CBB46E284416D53C0A0FB5538245F2
+C2F83C48721B8A7520C2C08F8C1098BF71196B775C4AB44469C043DE844726A2
+22F8E7690F4294AFE8B5E7C496A94F8E1D77C0C11DDA2EC873CC2BD4C28604E0
+44677B0017A8FE9026B4F9F6FA14603226BDD342BE1666E63C04F7D4C7BEC93B
+E0F7E73E52E0829DD5C3B6B1397246FA58FF34E6AD2C296293BEEE1896F15F85
+94B13E0956A2AC5168DC1B69BBA87EDCDF6918D106959EBBD9B87709488D9B93
+0ECC63475BBB8CD1B142632FADD1D6C3D63647CEA1BD9243D7BEEC0DF6292DB1
+ED5ED621A612F10EE0A47D4C92EC61C5342099C27D93A79D9C9F278145CB860D
+0C3E8BD00B108257F92AE1869430C6DE57F025C7B818DA530B3F2D2A59FED439
+D11DED107279134EC859B464F52A516A4350D296BC19B1455B3BDF7FCBFCCDC2
+8F1514A7A46BBE25A3AF9B1D403907D76E8536F179E291991FBDBAD7481AF871
+760C4C979ACAA242D99B153AB4FD7766C9B7DE6EDD1689FD3081EFF9B99D887C
+2344393FAB3D881EC7256EE3FB416D8D4D75C7DB51C8299B1400E136AB290657
+D25871E3FF8BA39AF92CD7DAA18888C8FA063FF42DC735B1B3247719545FE88D
+186373488719EFC2CDDAC17E79B6D697D9F368D9279DF4860951277F5EF9CB55
+BA5E53124F7FC666801C182AF99D4A8A3DEAE5C52B145DBB7A0CFCECE8AA6845
+B803651CDE2B42701951E4D3D7EB4DFBCF0C6BC99FDFB74F740579C8460FA10D
+B8721D100516CB839EDAEB4DFE011D1947F0D4874A7C690ED7A97EEE66BC28B9
+DEAD2A7B39EAD4D4A4E451E7398880D5E2B1D9C87CDF16AE86047B3D6CB83D9A
+7F24E102EF14AE8BD323700B083E6FB9B54FF40B63FFEDF553A8033A3F755FBB
+8515426BB432CB6210B93F60CEF6DC31F576F64475E62FBF30074B701B39665F
+4BF4113DCEED9A168361D8DE5C06376E070C90FC7F85413A8B664ACA1BB277BE
+9F492E4D13C3295C2234F3CC6854EF991BCFDEE4231FA5F99FD38217A00AD065
+B8AC071C65D00073B6292B78A04A801592C00A3F5FCDE4C0AFC79EF458DE1E01
+D0E78EC979866E4CA2F3528521C181533DED733D5EB445C3B76095A2FD5BFC3E
+7A8A2085E55157FDD79594162682F9947E1A097E36367B9D63148312490FDF7E
+0750770213BF6188DC183302136FF6CC18ED1A45D2A6BEB040F7F20C718260B7
+F356A87A209787E6655DDB3EF7CB0CD6D034A76D32DC844CE009C6EBBF9C937E
+E120692066C49523AB41242F1D916ED69D1B7FB6EABB24795FA517BCD14F2BC5
+B745A39B9BF94363EE9662C5E8C30B2506930DFF22B41D6C75698D18ED153CF2
+C80B3D4592CEAAEE1849027B06123A1A004D39C1DD6D8E3426014D43A353D719
+B14B247A87898A960DF68C0C0C59A1FD4B57CAF14B34FCA46ABD97B5AEA02A3B
+E1064ED55EAB0DE33EDB55D958E1FE80BCA50544E5D07AEBB5864B42E49DEDC7
+ACB9E0574E1DA3778C5BAD737B2A2A8A167599270578EB83D558D01F09DEEB5B
+7798D02A7A6C79CD5D12A93FBB92703219FB30E09591D8822847C073C922DCC6
+B9CAB13BBC139E9487F338415EFA2C253ADBADDC632F59084C6076526E091281
+A026E14C5E8F4C84AB7BFC460AF16C5AB0833A996F6895C2B27804D8A107D067
+E1A06E5A4BE4DC4863C90CB52949603C0727A1BB287F99930FE769403B46E25C
+FC2041759BBC27CBA6136A6DC6C00AA4C418F45F2D92CFEA647A6508A8ED9C32
+37121D5A26A64FE348622C6CDA9FAC1A26DBF07A906E243368F8CA936A6B93DE
+729493EDC6FFEE039CDB864396ECE5E198A6C53257207EF1D6DF448C97CD7C7C
+99DC5AC592E7F48CB331B971E3B6080AEDB45B1AD95543D56C4166455D888CA8
+A3B820DB6BE101296BDF05D2956D15CD50EFE1EDDF114903155F14A3D2747738
+6B661C650D01EE2009B8B1BB2CBC48AC2F425E8150E0A2C210789B2DAC227580
+ABBCBF4E94C8B8863191F877DFBA437F9C8F959B78B813586F20758C62ACB884
+46E6C561055F0B9F200C10EE7166BD8D3E301C5761411FE04B82E3E9FC826CE4
+6FE7B2426A09D38C007F28E2F992F03836E2018DC7A4E23C0F133241F0660969
+99887AD4D12DDAEB170804D743E635733BE09CDBFDFC9B81ADB62601A04ECEF1
+2912B16B203007F4E5A56534D8FF497D5482498E291E5EDD5DEAA97BC86C9485
+70063933291D78AB5298F3C9BD8E80C4653E80F243C7469D4550235FD56FB972
+E4BC6AB5DADCB2E3143D95295E23EE37E497C4CE6320A395B893F42B5C037A98
+F21B48AB50B63BC616BA3852C3B25D2C97192E8E1F0AE8D3882052CD47181C52
+2CAA6AEC807CBE1B898832903CC74E05D7CD9D62CDB0E3BC665F9B81BB9F60DA
+FE12589D767C4A5C46A1425D45ABDC3A602F5EE639C1D493EC4F3521BCC425AC
+9484A068B80EC484A1892E79A94AF0B3C21C166DEAFC24FFCC98085DE4570C8D
+B66373ECF7838754B1355618B87069C4D6C219CDA594F3223C22C504DBC14240
+391238D6DD8CF159A156306EA1E9B79FBC7FEE203019DF119101D16CCB937564
+9288A79ACDA7FC401DD9A62024FE72EFC06538AF461467424E49952858431A3A
+B81FC61CFA1DD5E96F64A790E8A8404E0245B8A16885E34E0B842660685EF8C7
+C52F0052A6652E6CB6DCA3252162B0A68F32C67EC71D425F9409954DF1689661
+59B2A302B801CBA1EA0F694A325DFD34412EFEAF168510323ECA1B860FEBE085
+AC8E83986EB56A641FCE4DB386E16B322AAF048B8C9B41F24A479F827532A008
+C4373425A53658E3D5CDFF1A565CA5149EB72643B4AE94DF0B25AB6C9FC24421
+5690903BFF8C8003F82A76F84AEC6703D866CF9D143E3C27F9CC772D4890F050
+58B3311810C6867550C0BDF133792402E200EAD4F6F489DCD61B81CDB85804A5
+EF06E1721B1D0791B6056EA7E06D5885091CF68205E2650D726848244E65F7A5
+4E14EA3DEE4621E32EE2D2813670E868C65C70BCBADAB10AE54A0DD44C28DC47
+63D04D679A0DC4198C7AE63EE63D34A6E5E6483031F98EF3E4655BDE80BC40AA
+303BE66D798C443008E2AF1BEAEAA1AC28145AF3869BBEDFD821636CA7BF79B5
+B8C0925EC8BBD1BFCAB0DD9BF9D336F25E5799BB341C0177F10D973075AB0838
+806C965228715A35D8C7887C76374C1C424F5BA523753D39FB2685E03CE9CB18
+633B63A89B4E985F3E098A94AA7B4D9FA64FE24E480F8CAEE64A02890FEB0E20
+17681FCCEB541872EA71001C654D42DFFF1DB2A54D53A80381D93E247F05FB89
+3C4D6C9CFFCD10C676793B75B3BAEA62BAAE724C12FA89B23E8E2D88451F8BEE
+F076FE1EED46AE339EC78714A00E89C93A74BDC367D7B1F6342DCC35BEB2EB86
+AE5AB1D2CE23F322E59966997E964CA3FC7ECAE9218A915BDDDB73DCD86144CE
+4ED59E641B30C4AEB214FDB8FB2B5595BA0B6B45D99919F59A963E9F90F4A846
+85377B43F208A3F331947518C99DD11820D375EB9335D7CB6267EF13E1CFCF2B
+E2979EFF1F396331208B8544B26995F07752052A37B7028F0D0C3E8BD00B1082
+57F92AE1869430C6DE57F024173CF78FCF3F8B9ECC7D2E6345BBA065F8BFCFF8
+0F27FC2CCCDBFDF1767ACE6635BE8ADDF24026ED1D0683998AAD611EAC664000
+A4635AD1B4BB6FE307C63F7EE74FB91ED2BFFF553A539F05BFD3125B9A52934A
+C46E268ED4172A11BAA2FE592ED088AF61FBE6210FC290D98262005F4DA50EA2
+A8F3E6D5BBA1E2319C65E68A4ABBFD0B5CD19925493350028443C6EABAF73BC1
+B4BA5328595DAC75114C1C0300300B9EF15A312AFFAE9B89C5965997791607FD
+F834395B17DF67193ED3CBEC072A1A22806D1D700D5894ED92C08F17FB8B81CB
+0B3A5D62AC570F0B04EB6F966E27AEB8BD7964F3C11A2EFD5F17BFFC66907E8F
+19F95A52CE74702030A3356FBA2E66131C9991A2CE3D8C10D57DD5E2D5FE4553
+ADA5745AE8EE1F8ACD9522702C559F2B675210E8A891B2A31968694C04BAA55F
+CCC510CC3B9E512C5D4AFA34D00B7F74D8945AD99BE026388C47D478FE1788AF
+768FE9FE3A7434E53F28C04FA0320E28030F6670C4C2F1ED2F77855E1566A71B
+087DD15D9B5CCE6FFD54A41EF225416BAEC7C61A9DD8A584A0F333A69E4D26EC
+72F19AFC769272387869490FF59948FEA4A9D8A9F924028ED77937B477662CCC
+E77BADAE4BCB90ECDEA5EBC9DE866B035FFEEBA5AA77C19171B48F470005EBBB
+793A0B71577BD408C15C2152DC52D90D1EA076A789F59B3D595DD347079EA155
+4A4608FE944337CCA906707D4050015C93B8A7F9FDBAB914EE33DB11123A9C51
+93F62933B22EC8CD48635EA0E77427E7C6086294E58C5950FA03DD8C4566A26D
+0251A3799F7AC8EE6E8F41117D733A0D3E880220549437755CAA6C23D8D5EA74
+C8D348C7FDC96A1FB6D3C45809BB44D5FFB1DAD2924C24C0AAF32BA00DCE3131
+6E0BB0F62E4DA76D73409EEB96F442BD63C7D3CF3C8395F8BA54D931B5A817AA
+7EE6F843B4F7B12AF06BBEAE2D9CF29A2D73F58244779EE988980EAB84420281
+B0E1E8237753DECF6B9C1826CD0BA9770950858BE19002D253E44AE117F6277F
+FD91C8ED384662B1CEBCE890D038C519BBC0C2707BEB48FDEB3721ECE52D9C3E
+A6DE3CE70352D2ABEC8E3DD4CCF4899A052DDC7F055DDF6A6EAB9E62CBD50ABE
+89F5DA415CB6DBA7C99B203A6F69270539FF862BB27F404048CCF449F59B4564
+DA6C51C3F01A4B69B445B57A6554BD75D016CF088B4875981B3590EB6254FEE1
+52B8F789FA98C3FD8E081FBADA15B871D8EEAC0EAB134DD682DCBC9989AA00A0
+0D64680648F8DCF47A989C23AA8A00773A6D6C9258F253A769F6124346CDF970
+50E356F2216D58A6C3FF5CBC8D3BECEB718B49F2297D416D2A3401DAAE73B117
+EEE95F611616BC36801F85F5B2B4D380F11A63A8C48DD312B3C0056F607C2F36
+8DC2FBB2303E5FC195A6873DE8D51274FEA66518D8491A3B8CA20C04B5F40225
+1704453F5F150324F5348BEEBAF5BE5B3848DC05D388163C306D1AFAEF792660
+1587973A381D22D71DB4383CC9A41CE282F7CDA8076CD12882F087AFEDBCB008
+CDC48832F64728BA7E9DFFD29E5289975FF12130C8C4445597112AC74DF38C8B
+693D03350C9ACF628339FA20F55DD047408456CAB99E4B8956C361CEF424A54E
+6210FD868DE095FF7FFA27F19814811E86BAF8AFAA241DBDFCE548939692E18D
+824952EF201261F694C2734157442A161BD50AA586EF1720B8A1E6C269C723D8
+74668697CE2FF5C83909C4EB53664A53152B384E9786959A2294E1AB3ED79FAA
+B954049672E98E23C1833862D739F2F30531D0E5A3C2E077B77A7CED67E3C810
+92B5176722B19EE65CEDDFE63275050F81B0577D94C3757D2E08E529A92D3CC3
+4AEFD8B02B68123F9365E3E79ED02A76F6241585684E93498D16E6064FC3DF58
+4A1D5E6E2BE633DDA062E9154DAB0A5865A43F17B3BBD82DD5E8DC1DCB1A15B3
+A63A6CCFFC30819DF215485FAA90B75A51C90BD9A3A515504463568A902233A9
+7C857A27A296E57133DF355DD45141806B088A1B7A4A3B0FD6BEECCD0B71DFB6
+7A12B6869D327C5E548F423E0AB49286D7A3BEAC40BFC692AF45950B0559A659
+9557424BF9E8F505D5DBD7BB2DBE5FBFCF9B2A52DE54E08C08D940C3377BDBFC
+EFD1011B373B255A8B68496A5E4FAD2FC47CDDA7C44B75EDE2B5C03E9CFB9B3F
+54D110B174638DD91CC5D989C195780289B97CB18E72803939800350F7705CD5
+B3653D429DD3FEFC6CC1ABF7B624A2125133CAE6222F4BE1DD070D5118271B1C
+DE24C8DA479B5BDC8FE012A2E985A85DC2358A8F64CD0CA264366D37883CADED
+565BB8DECB2C2C4FB724DAC0A1614DE5A4FBBE5890B0B3EC012EDDFBD2A126D9
+859F19EBFE12AF63DDD4A9C1F5F5A93AF577230D4EAD25B328F66DA789ACBF23
+BC6F25487C30D336035FB3A6940FFE07FF99555E34634B52F044F4EDEB1B9C36
+A18FDB636262C188E06A93375D3A1BA9D9625D21C4EA1733EA61D047A202E502
+66E5003BA579CA1CC41B2423566D8D253BEECD76BF098ACEE5D27C893BBD8574
+1652EBF9D2485363423CFE027E16AD115C8C5DF67140A2D367C08D1722A4F7D8
+628A28D562ECFB03895F0617B095F470D331565271F3BF588805B59E1C414F0B
+9CB723E7553ADE2E34679A4A5FBB0C78
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%BeginResource: font GTLWKI-LMRoman10-BoldItalic
+%!PS-AdobeFont-1.0: LMRoman10-BoldItalic 2.004
+%%CreationDate: 7th October 2009
+% Generated by MetaType1 (a MetaPost-based engine)
+% Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).
+% Supported by CSTUG, DANTE eV, GUST, GUTenberg, NTG, and TUG.
+% METATYPE1/Type 1 version by B. Jackowski & J. M. Nowacki
+% from GUST (http://www.gust.org.pl).
+% This work is released under the GUST Font License.
+% For the most recent version of this license see
+% This work has the LPPL maintenance status `maintained'.
+% The Current Maintainer of this work is Bogus\l{}aw Jackowski and Janusz M. Nowacki.
+% This work consists of the files listed in the MANIFEST-Latin-Modern.txt file.
+% ADL: 806 194 0
+%%EndComments
+FontDirectory/GTLWKI-LMRoman10-BoldItalic known{/GTLWKI-LMRoman10-BoldItalic findfont dup/UniqueID known{dup
+/UniqueID get 0 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+17 dict begin
+/FontInfo 9 dict dup begin
+/version(2.004)readonly def
+/Notice(Copyright 2003--2009 by B. Jackowski and J.M. Nowacki (on behalf of TeX USERS GROUPS).)readonly def
+/FullName(LMRoman10-BoldItalic)readonly def
+/FamilyName(LMRoman10)readonly def
+/Weight(Bold)readonly def
+/isFixedPitch false def
+/ItalicAngle -14.0362 def
+/UnderlinePosition -146 def
+/UnderlineThickness 60 def
+end readonly def
+/FontName /XIXCAZ-LMRoman10-BoldItalic def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 69 /E put
+dup 77 /M put
+dup 80 /P put
+dup 97 /a put
+dup 100 /d put
+dup 101 /e put
+dup 105 /i put
+dup 111 /o put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 118 /v put
+dup 119 /w put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/StrokeWidth 0 def
+/FontMatrix[0.001 0 0 0.001 0 0]readonly def
+%/UniqueID 0 def
+/FontBBox{-518 -307 1565 1147}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0525392EECAC163E584A9104D99AD0BC
+1B1844A0E222653FA481B8809B26A46F4C483A5D7E95816EA6582584156CFEDE
+B994ADCFF4645140E3617E4D7E1B0E4541CB9F562E55829B4DD880AABE2229E9
+4A9FA259A734D29BBA91BA1E2055CBEA4339BCBFF98D32CEFF11F296225CAABA
+DCA10577A5D431B714726C1278D8101ABD1BD8D0BD0174FFF9148F8C61C241D9
+2AD360A28616CB4A0670C1BF105C88EA21437A3CAB2639F9122A47ED33A9530C
+41CA202CF5EBFB888853649626AA9D3EC758ED3FD73E2AF968D3959569BB7298
+73635DAEC4F764F7689BA284D575EE4175479575D5D2E915786683FA5418FEB8
+6776412FB857EA99B80ED7A41040E5A4530BDB7969C4DCFD6F5355BEF64DF9A3
+C14292C4D27F609C117D76D7255051DA43EC470C8EFF7C4F1B5DD6024539A684
+C1EC3BB0D0EDDFB5820330ED7E24AC7B0392A134DDC64D00EB29798F262638A8
+B8A275CA29B7BAF6D1DB30FF539D4E4B8698F2ECB70381C9B58DE163AB9C081F
+CBF1B61D67CA4F26CA5A231B62FE25DACBBB96030275C7CC06C1FFA2F4E74CC6
+2C708FA929A667FDF377F81E7E625EA983E367CE0DB3DE03BA5C95768E51C780
+C6F3190E85AE2328832F16FB005E28F3D703FD69FFDF857A1971BAC835B5854F
+B7C98AC0ADCDF2CCB678D84A73F12D1F1824023726E0F86CC942BA2555C3C0FA
+641C891B3EE8834323BE4E31F498F5B4EE47D3D1A8815267C71EC62029343728
+C9AA63D69E3109F3E0BB1BE1BD956861504CA1440781B009413497306154F5D7
+064611A23B5A32F13C8FE5C0449FBEABCB8D5ADFEECBDBCECA6FF7C1E35D6F76
+D0B676DB909375D53C939BF5FF78EFEBE2051065CC90C2FC7279E4DDE4D04CE5
+2C8A462EA64B8286ED62E611A2CA263CC0FD8D24DCBC49A9F851D9ECA8ED8B45
+3951A4E736C61CE6E095CA711577B8DF0A7541D652E9F0E6A3B1C93FC5DF81B9
+E03CCA6698909B26CFAC6C25C6356E42D4BE937C0DB9A2BCFB988AC33C98A6FF
+79BFD7B5919A83DA80CB6A741A391EDE80E9C1C047DA0FA6C261AD9D74309D49
+7AD0003836880DC351387668015B31C70131C8EFAA5863C6911CCC15D583A3FE
+5E184C21339AFF0E43C2EBCEAD0768A0FB5A46FB883107EDF27B10C461B3A3E1
+BCE3770DDE3365B68EE7B0D724C89BE1A50D8BBFE5E032D2524F1944704C85F4
+68B70A0CA2BEAF6BB4614971EFEECEA382D36BF6CC3A734275854B4BA3EC50CE
+0C7C1EE8A61201D625F00EEBB6FAD8807204EAB7FE1FDBED03C3242781610A7D
+9ABF83501868021E69F6DCF2329481E47F42179E60AA07B1D1AD131AD28FAA91
+548361B30AA64876B6BCF359E1537EF69FEDD853133786151FD06B447323A98E
+0481DB2B803387AF2FB3B4E057EDEC6373D45AAE69A2AF523933208269330C24
+A4E70B8E137BD76A4E52A5A74387C9F301ED106305D1F54BEAB6227878AB0014
+72B32BD540B24672F73EFF1A924BB9615DBB6786DF6522B4AFF4D46E8B5B7B3F
+0031BCD6269FCB4EECF3171B30132CB709E1DDE9B1A7A1071CCC95F1306C180E
+BAB7AD3B0F93D0578C34519695EAD030B18D2B1B928D2CB8CAF6B7D5DB369626
+DB03244237C980DFECC233D463546CF8E28408C02326B40E27E034DC75E7E797
+B53DEB549EC8822EFBD2780E3A78CC0F9EEFFF109D3B8A2E27BEDF4FD8DC2FDF
+A7CAC25FCA4B7E3D4B21F6896D964A688848DED6E8EC6A58365D7A62C2FDBD0B
+7FB6D86C3DA1539967C49407FF5E0D54358CA6C8C48F723817824D9C66FE5891
+B484C4F3ECCE8A8CDF069387E4FF48B03984A9B36906B7EE0A734C90647664B5
+63B821FE22B2AA7037F55F05E547ADB16F56669A201DA41AB841209BF77FCCB5
+ABDC05E978BFAE410EAD0B667E61F0F1C54F38D882DDE8DEE28A07A9E0A42143
+E0FD4299A1AF04E3C3F00E776079A79D9BFE19964559842EEE059687FE5220B6
+547F10E5C09F9E499346B2E0D667B35592E73C61A2DC1F13CD09369054DC5695
+3F4E2DB2163F7CADBC404D407A616D6C0517DBAFCB566FE28CFF48B79840BCB8
+8B39475A7E1C68155445826E9E570D265DE6182B00FBB0A75AC7D17C3CF29FD2
+226E97F0D816D95BDA0BD99EC4932E1CB09843818D588D679137AE1DFA9E9F19
+C49B461DA073DC1BE4AB4FC3484E54DC9B6C7B76973D37010A4C8990B3D25F7F
+3D20BE507F7E56122CF46DFFFDB6FDF9361520D2E1343E16C08B047148E29DC5
+E5EFF4711229E2CC5BD0CE81B2FF46A7BCBCCA74B6D314B33AAFF216180EAF47
+54928E228A7225094340420FCCCC8C2F3ACB00AECC20ADAAC3C0C63CFC3B7ADA
+39C0AA97CA287AA3B36114FE9DFB07B6529FD752D2FFA4E8E41BE6221AC9F0C8
+D2784D9E8AA3E3A3438942BE3BF6DF3D26F87747A25EFDB18D279D752527A0A7
+01EBA732630023D23A61622899A6CDA1B6BA77CF4525E91037F30CF56EC8ABBD
+3F4D0954D767BA87EE1CBD3BF7B3620B1C806D831ADA61B11F5EC2A7D2C1CEE1
+4D1A67BCB8C297B0F9D0B01EC6A7CF522C5D70E2B7B83253A236A4D96BC5FEEC
+5907086772F4BE1CBA7691480D037E32E771ECFB467841EDF6F53A943B0997BE
+3AE95EEFC7B0D7E017CD595009E52CCEA351BF5650FABB989565430F30F7E8F7
+7C2A44865D97EEB9EFD4AB7C41035C45CEDF664BA6DB13755321233449C37F2D
+A97E67DC8DFE3568F5F91EE275365769916EF1BF70C062A4533C634A43BE485C
+E2877000075D2B7ED4FF02B658FB2F1F05A2B5F750ED1A437DF6480BC21F9903
+195EA9789B52D651886EC83777DC4B946660818EA103F172391E89F29B1EFECA
+FF31922A16CB785948643D0590CE947527D857FD477BA50486F6864CB7AB263A
+D03F643ED70E3B8BE0ECEE39C54556A4D75D6F5145C5DD54F718A0AD08E1E301
+9BFD5218EBE79578A0724622D9D07C9A198489AA1D0FA3717BF3CD52E7FC86C8
+F8063FA18E62BA4676860D0F2CBA941C24205C9F1792B6279511CC1700DA3482
+83522B5AEC490A066D109E365572C513E842F42BFBD3511F4ADEB1E990D07CD7
+7EEAB06747625E216F8AF60EE132FECF7639ED7BFE59B384757CDC3F750A55BB
+BAC8AAEE632092CF95D856785CED7E829F5B18B621B99B494EBA7C4042809245
+0C519E5C9C7439AECB922F531C2ADF25F29002B26DFB0EAE94203BF88AFA8E32
+8CF74D77049949C2CE61AD86FD668F97C05F88DA5099D12C2940A318A5A278FC
+CDF6A6A155F451AA39165591ACB05A205779209F810F7246F2DD3777FA4061CF
+F9D9C1A82925C7E37FA36C2D80E7E32A732ECF3856D43066A459E4322FB4BA8A
+674DACBD96367DEE3D90883CB9F1DAB53B3C773EB7E92A2386B678179EE7279B
+F20CFCFC70378964F57F984176061723F228A13B7304F3254E39EC3A4E8801BA
+ACAFA7B2EB6C0DAAD46801979BF4D8469488F6B0D1B1310C75AC850FB4C642FA
+3710C2C99050CE3129CCBC9A3C3E966D3F3B431634B78DBC70A30970812C7764
+050A0F5A78522F0DBED119567EA7C799E31C42D1689A14EAF776CE450374CBF6
+9FDC1496A14F5A09910970249C242B5765DE750086910D16FD2AC0E75B6C6298
+719600992548A68772C1CAEB0A3EA446D105DC0B90C3F3C665E41C483205D81B
+59230D26B72776C9E8244C479F700980BA6F10E8B532CD0D4E6630A68D7D57EF
+ED6C07D533D00EB4386870643CA83B5ABAE16CAE17622E4A7A73B41920BA2F51
+F6627DBC1F119BA6BEF2469EF0B85800ADD0A308C5B83AEB4164DB120EA81914
+F762AAF8178718AF1AB3F871B6C390BE93C0C5D758B3A634F3FF7824578BA007
+9ADAAA937D6625C81B61998ED4A65B374EE14ABD4D9064245FD0D2079897DC81
+CF23FABAC0975AC960D4C07E4AB64B360AF676DD3CD527317F3063086D8B6746
+817FD31B267DDCB3F56D75393A665BC35F1E515F6BA570464F63E2A4C83396B2
+00AEC477909C2A7CFACF4E2DDFA16383B411CFB9D2FE13E54BC833576A95C226
+2EAE7BF2942F06011A3E283257FA60C5AFAD3B71CF6D6772E5E775D505E6A62F
+64EF5974CD8E25A6906CAC83605B88549702FC7A5CF34A17BA8BB89EC9287B37
+29137F1678D0048C2190616F793DB31310AA0A8F45140EE4FAE5C60D9FB34EDE
+DC15BE430F1B98BBE7BE6677BEE121D636D99B130E3BF1663339F4CE8710E4F3
+D62165254B673D6230D5F2776ABE58CB9B13DB857C0A6824BCC604F5426F7148
+BB8FA709AF1344271173529372ACDD2690B89747B6BFA7EA057D586AF5A8410A
+54FC2AC5C42A47BDF624179D8827CA4664F96F7003D7D0BD1460A41B6CF3B370
+647CAB18344C739046F1F08811C66BD07FD68551C9E415D2E09184C78217653E
+011F5CDE11CBA9092237C6A6CAD180902058A1295986A3DFD904A8A303A7D622
+516B67987197DD3E233670D60B90AD71DB8AD8C119ECA4A7C3C21E322AE6C2B6
+732D60633B59C2DB9EED4802C331780943D1C667EAC9A01B6176AD76F2D3ECCE
+9D106F3BC09ED496BD9A79025A9683ABE4C7E6D7DC2CCD698615EF49518B3ECB
+53EC320AAD6CECD064F9670A11F9EC62467E98ECE66B329193EB624E2D0FFB91
+D27BFBEAFF9E13E90690A80DF614F24E9D390EF7866AF1DAB167D87DCBEA2E89
+3E1D90E69E828F3C7E4B3D8D67BC4456186C469B5CAC9DA5727DBC8D5BAC9F35
+682001019B6E71FC3C112A2667AB420374B85A3C89DCB80E940BB7624E0116CD
+08A59EF79E5D7A9AF1DD9809395FABC6E1F85F85012157E885ECE99C5F294737
+5222A669371BDE88C3656A7D9095905AE89E0904AC946EFC2DA5BFC893F210B4
+95B3DE7C70854B3BFF083A22D936D631FB480DE511FD6F899938CEE7A965807E
+A75DE120EE0E813DC0557EFE61648E12A39638FB42AE591FE504A26324D7220B
+9D12A4FB00F763274628831334E1E727FEECA19AE186CC4C1D1A0777414CA0B3
+EC93B33505DF47884DC8B19956DDF207E96FCA85B085CADBF9DEDD098FA3D7A4
+F9F66D9078BABBFE2E4AF4652A04541535713973400667AE6499663C88B604B2
+A8F947700A630BFD6A534A55E2504DC6092E53F92783E0AF62957C5F79B80DA2
+B9051363EF056B5D65444578CFE08378B1DF7086315CD510C6936745358526E6
+669DEAA748A386E73F27E40E35ECD3D7EB4DFBCF0C6BC99FDFB74F740579C846
+0FA6755B1F7D24C5A0B90A66F0FFC044D1E80652D0836E0C66ABBB0D4C4560D8
+DF4183D3598FB9584A4433C9131B44B34ACFB1FE71C614310AFB51163ECE573E
+AB9DC7349B6982B9FB181DBCF8B1F5AA92379424BCF1D8FD899BB2CCB47B6822
+20859C957D0B8DD0236AFBCCF1DE77562333F9C4FF74B7425C2118FE177FD609
+4EC7065BED405800D73BDAAF6848EEACD2B66A65740087755141099917788CBA
+ABB98A5D4359E63E7B5982A26F1ABC0F78418D3B70E5B8F42D90434A48E3F499
+3DDF5FDF93C9E218C09A3520D145BE35C8758391594AFF7153A7B5D4448A8CD4
+1D0EDDAF6E7780F00DA62502C94A10EC87F2DBA24F80330F3CF3E6698EE25EF3
+C6D9BF8BC7619F7250222DC2427BA56C5D9812FB9D9682B78BD2C6109E3D5252
+6F6EE9F096EA448EEEC36752787F85EB045535E44A62B8CCD3A3F1A8787931F6
+1A705F34B65A7D17B8BE932331AA01C9A84A76F6A2812AF0DEB6AAA7984479B2
+CDD2559F276FBD020EE4F28EE492DADDE9A7DC2F40FF95BE118A13EFFC7DCD6B
+DD329EC69AF33E7FAFCC19B3590949398DD742A0BD67804B5803FB9DCCC6342F
+21C854841435CD9ACC3C44B5755DD9071DAE1E651ED94B4CDB49F61BD9ACD7B3
+63AAEF5CA4DA0F8986EB1AED17F3C26F5E30E44ED3E9908B59DB3B3506C60D3F
+766ECE69AE20ACCD020ED7EF071525CDB93880A24EAEADF171B5C0745C47040E
+D5D4B9E13A466FB2F8ECBC0C52019F55265934790BD03AF71BAE6A930CD02B6C
+4D07D6D0998EA18A8B04080ACE7A8462EA4D0A2E3CE3EDA1EC59EE43FA5C1288
+C2FBCE0E01F764EC4EDBF1A7E60ECE54CB38A7251D426B403551C0BFFAFCE6B0
+5E537144CA3F6E7E9586F1E5149E6F1BAFDAD8FBB506280343A796FDB80EEFAB
+1061D2CC8008B53D1FC99A662CFD29667E7B54F92055664C411FA55DF38ED234
+A38C9A6A564F2A3CDEB2C87739BDD18083D90B379127997417608C1D66190699
+38B6B2AEDB97B7B0232542F2EEDF018668ECE00CFB9B87537DDD52567A9EE9F3
+4E3729BFD3EFC7C1BC1BE9577180E1CE7CA1BD04F2D0D63E2533838639C9EF8B
+5304FE93F5C1536CEE1BDF64A1CBA37F097642EE83E04EA8E3CB8463E052C7F9
+ED471F08343E45B76899ABED0E26D475085B59D52440C4DDD7D6E83407EC78F1
+2ED5C8CA444B281681676440E4835A4965178C95EF0C712CD7BFAD1C0FFC1D4B
+A4983694BE44E35815822FEBC9B73680D646ED0B658B1D2EC8198E91B7D7A0D2
+586F3D71442DBEB01390CF5BD706638B1931C1061FC502B3C18CDF456E4FB5B1
+48282F1B3B8C4C4C9DC5A9B26880C2F7E15A705047EFE4C1228FD516AA9FC596
+8567C129A5C1A8FC21F794B63264093B1D3358087BA611863DA666EBAD02E690
+55A34A54DF278454646186E4B4E5B053CA4B0C3E3ABF6470E6FAFF04AB26378C
+18B7B0BBDC50C9B75C56C5FCC7AAA210CE9ED690255ECE7FA14DC335D608BB36
+002C604F2A5928A58742D1029AC84ECB219BEC750A10BE35EFEE65A53C70F5EA
+C0B7AF74995C3F141963048EF37ED12F3A2A91FE52C442F7F22BDFE1A3D92F6A
+F4F229D210E5C0DD890E0A21F59B1492B82E7449055F53EA9EBED8C10418AA68
+FBE3D77457A4AAA8C346EB436961C2AF7784A47BB023B3ECFFF539BDD6DB868A
+2B8F010172B9CB2C76FEFC4576A7638498FAF576669AA5D71AC4CB5229A82955
+3C723571D8AAE6ECCE55D88B00E1410AA59FCBC2DDFE67B17371ED611BE27DEF
+99111BABBBEDB83B50CB2D6E44036DA3DE4A6BB22D3FB92453683899ECE7EC3D
+DFF5B0B8CCBF3D9CFC3F795348D04809C49896E18909ECD6892BFD2B0D73ABDC
+220B13F44F655AD6FC40955A3EE68C16EF312027D496AF25FD03C5DE5384AEF8
+B6C7C5DAB64A0F3DBA016E931F8C19CDE0D7F03EAF49BE166BA3DB1BF765EF03
+05C91F529E5A19177BBF30C4399A266CE0B3208E7F3A8A97871ABDE24AABF7BF
+07C8C599F051F8181FA2DA8EB6C9733D5E67080D2843D44A3585E078615BEA47
+6C882096CADB381F84343DDB171D5983A2038DCF160C2BB209B2848C80432502
+135F1BD4EDF9C3BA2FA4FA09EF62ED91D9961A73D838D6F5654B31F78B7D55FD
+C4BAFF36E82B560DBEF3791794DBE14E68D4ACDB13869880C0D71523DA079E0B
+3F2316298B0FC5FD92E75DE72B8D818649B863D2107A5455FBE4A74370ADC03C
+34DE82124FF2EED6C65832666817D6976D5F8606CA7F20E519B9AC3DB5E4F6B5
+BB0B33488DA8945D9FD341D363B0A2B1011401D642776CFC6C4A3A9066361A29
+020D758471A0DF635BC2570D47929FB51E25527652C1D2C28C63222F87C31DC1
+B01B2EA3D7E648E78962B236D726E824CE2E5F47B9AB4CA9678D55D6007715DE
+3A2D4C1E7EDB62422F7CA31B3A514AE6134111BF6D56A1F0B72D203A7C5FF301
+7508DF9821E5654F7E817E23CEF2A923C8DF147D5AD2E86744AF3127D29A7752
+0327CCB89B0EB07AE1EC07FD93D19F9C0A6B2F625C8E686F3F263BC002C8884F
+38F3BB6E09768DA019B879BE1079D76A018F871EF6F8CF3DB923D549EA4BD27F
+B2EFDF96A0DA8A349322561774A46336B100F563E302FD3F1C4DD65CA0335AEE
+2E38DBE952B0C1AB783DE65B87918BE227E0C33B25E99E96B950351927A81C58
+D2821F4EED583E64FC6152C2E875F3D1CC0C194AF57A52896AB38B5F5F014594
+EC1D0484121DABFE6D26564078ED9EBD402F4F46C228C2D637C5FD5D80D79922
+75080EA1052401FE990192857A63E5EDFDFE6F056DAEDC2444FAAB977D63CE9F
+56BA69900B3F3E1F88D55223290255462D65D304E6395285F31E06D262EEF383
+19C0C68BBFD2506ED366F96269BE6E195963CFF5F2939E86EC20E128862A2637
+E90FB6E562EBF8CE21D52051FB9D13E7D7EB59D752089364FDB0D304F9ECE6A9
+1142D95593EF9FD51E984BA8779F476E455B01C64FB89E724580B4CD7ACB9E6D
+14851FA45A8E98921EEAFD82A9516D47CC0D6183D68AFF512E3CDF862EFF46EB
+7DE76BE0D3026F19A2F1C3406A9C2B280FC55EDD4315463D662B92F4A2849E78
+CAFA7DA4C33E51A6D9746AE9598A13016197435711C5703B0B03417C19413213
+BFC2E5DC6CFFCEFCA4BC439099ACB261B06F294C3E2ED6493AB6296AA43F70EB
+76DCACCDD7E39FD3176CA55B0DC7E1DAB2DC72CB986B0B114CF2DCDECE28B4AE
+DAF134EE2DA4C193A42AD0E10201D7B75F1AD5FA61878B6042ADDB1F94F6CF35
+19F98CE061F85EA4F2475121625909E5F9D557558F37FAE8EE46086BEAF1ABA0
+773203EB54A32BF1ADD578A1F95BF4FDAC4EDBD260753B64030759472D938C84
+A71C114A562371A813F22AE32E572F6642EA9543DD8F6F4034C6B656F23909A2
+30B2578118918F97C7BB8B62E532972120E7B0444F416A08BEA0FFDCF8A90638
+660039D6EAD9A62AA3862A634C4E7192D8385D9396135C859A0A499FB002FD33
+D0C5976420C76FC705B17A54E9210CECEF0F667BC582F588A061153A631D123B
+037B74F7F7116D105929032BF417E95A8E1A84BA0C4BD4A6BF0ED7AFB4A1FB56
+DF08DEFE0B9279975DC15BC1DB4D67B315C4556EA6788840A10115DEA01BA789
+0B3A1123170D993F727ACDCC08F94745740AED1FA5436E30669CDA65742ED08E
+465703DF56792BA310AFFA57355A1CD7B73DD5401ED7608BEA9D37AC8E7F6FF2
+58DFF2EBA9D5DEA90E75EBEBCAA33863A66234B04B0310308C22902DAE8CD6EE
+1B33BBF1BA49D985D552F7E5DC23352FD902BF6F5B5CCC85FE89242E8547D950
+25D9B717498EFC65F8B5D38042D86D3BDF2F2D23DB41D95C366B9580053E2500
+9486C377A60DFB1F0D805EE67C88DAE02A46ADB120A95A022C1DA291668C3184
+5DC8EA7B32DCEB16073E5209113BA2D44E58DA835E8537B732ED0C2C1FB31D3A
+FA91E12BA83E7BF7699E39EF1978075551ED0242208A9CB5408998B966C09CDB
+3CD24744C537BFC3C09C48DD1BAA236275FCEF308AE67505B69F72578F508ECC
+773A3903E49328A81609F858FE268F9E066A3A7D44FC1C8A97B4ED836B06224B
+6C2B94F6384FF7461C1636CD377EE59D480DF24E76EAF5C303395E007594456E
+44E684F5B62E98BC7CE2A7F23922C2B26EA41AC3413B86F49762D51B09412023
+F0E67608C86BF1FF8EFC2568FCC3524F6F89EC2FD07710100B556812C6BB0AEA
+2BAA23F39C7E68A731027AF1B61098EA4DBDDA6D7C1033099BB4F81CECD8C9BA
+BD283E68CB64DCCEF78097CE56081B907F7F68E2AC274E50724C21A4D9C7C534
+39BE8F324036B28CFD8CE94826FB2145D27B9F8618C6DD70A689BFC4F3543F6F
+AE5525252F381D9F7B09FB739CB51394A30B60A510CF550097A522FAB12F4C98
+63BF17ABA09227118AA77EE704F06A11F9327B17234AC27E1F671AD5DA6FCEF2
+04694A27B0CE8C9A6A03C00D4DB9497387E6B55C9B4D8E318D1623B211A2B449
+076E191A04CAADA5C99DAC0E8B0A955302C23E63B9D23E40724FA9C3DCE3C2B9
+DED6CD9D11622AFBE1E42CA7644DAE010536B0D6D72D3EBD3C54FDC1061C2C99
+409BCAB867CF2D3F12E534405BCCB859F8A683E36A1593EC8FE7F664C583B5BC
+EC28DE028DAE9464492363ADCD0651128CE2956C78B865AD834911C1A179E2C3
+36EF0D95C41FA4A5AF7A016D3C773E040312AA0240DD7339E38988F36222BBAE
+11B6FBA29AE0A974673C2862B398E6A15F7D1179D60EB17B9C4E3DF9EF2D5237
+B734EDB4A0A6F12E053777759684B13EC922710F100044AF4AC7E6826E344C7B
+DDE177F28AE37E814ACD207F6C8E3297E4A4A9F197AAC26F5C5014D1954859B1
+26AEAC528BE42FAC74F8299F296835AE2D078C0320182E30BD01FD08CF7A4105
+6144B4EE5DD31B0FEF752E017D411E386203ACC4104B5A7D63B6829EDF73D5C2
+383984FF7E994005458A1023406C62FF0DD82DC148EFD0EB462DA12B4B38DC32
+18AB9B7BC8F7037F433A0AB962F52147208D98266E8E454F25DA98C8E8D69C80
+E11ADD6DCC8B88C78202A2AA4A5EF425A6A412DBD0F20CDB4D1DA9E54AAA399A
+095627A31944C10E108665DBADEC977F6E7846D73CFA56D27D19F27B189ACCFA
+1C6C760DBEFBF5A18E58BFAFFCA478142AC751441CDAB0F96FFBFF9461ADD964
+4739AB246A025D1783618B011F86C9C1F81307E618092D3458B912D4B431F977
+7AFCB59F167B978FD5993AC8B9F75BA29DA132139B45188C771A96B82CEC3C09
+653C7CF4AE41A53DA1FCEEA139BF1F8A1777866DAE4B39205E49C138C9334269
+E824FD6A2C658868E0120EC31F8EAD5BC0DA0742A5073F7D67518A408F628794
+F3A4E9EC74A13E88C5F9E231FC2ADD860EBA65112121E1DEDF820B11C1E53844
+B2C7A227322C783EBDDCD10868090BCBAFA1507112C6D45939C9425C116B70C4
+970DF70D9811B4A8827C11AAF7B532647689F1F280446508274A8FF27CA1A6F8
+BAE825E4489B203CCD8BC7DE4B268CB48E3E7B4C5CB0A38541A3382F28D8445B
+0D4CD983C46C4E589107A75938E890436BBA14E6D7DD22C8BFD34C551EACE007
+1D3C60D689FBD5703B57683888D00F0BD6EF7363B2B4631B0B8D0C6F5A8D008D
+8F808F5B5F24C8BC1B1E3D002C33F76D5A2D0C227478217C22354B2914BCC468
+867A121D65A970206C190287537CB190E26707CDE0E1B29B2BB9C4F4716519A2
+31A2FD057F51ADDF7DC9BEC731AD6040FD9B804FA14749B8549621EA8FAEEAB5
+E745E5CAF9DD3087C4764D42A4274DF91C9B3CCA3AE3F31C1198BF3F62049435
+BBF3BF5AD2CC7FA44044CF1E14A026561FC62438E51FE64D6A40040ED5D4B9E1
+3A466FB2F8ECBC0C52019F55265AFC18F3524E5D16E65AB744B6FD25142CD4B7
+0AD68BDA9F1D42A8662C8AF1B5CDE35BC27E9EAEFDF62A37061473F061BAD39F
+FA9D62FEF73AF05C25BBF8361E8969C483BCF72FBED45536905C716015ED092B
+60487C78F11B2FB96C536FD2AF3EF5E8B8C260951DA8618F633B8D6CE15C47A0
+573CB70103B4D47A426AD3693258F19A376262F11BB267E80EDBF722D955776E
+1B6C4530838E021588938A3A5F68B5DCE64779760C14170CC7BA77F25D930B08
+0735E2D8211868BCBAC5AAC7ED3F10891B5CBF01CC178DAD3D35670F258C5D39
+2138E7847EEC34DAFC1C15B283E2959F3E1394F6212E9CD5D1200A48DB9D4E22
+BC98381243A4DA9CD095F34269A0B2804358B87FF350E769A7EB0E1B9BF5CD44
+BE1164638B6D9520ADB223BD957C4C8051FEACE2AE27DD3DCAB49534A03AD666
+F8DE9A74CA226BAD0E6EC5046011239ED7D6C47BB987D958844F545060C66680
+1C182AF99D4A8A3DEAE18965F5AE59866B856D69548FEC387CFC2D956561FB13
+DB0FED2ECFC22D86B42FF91FCE7E06435BB294023280A4FD62939B8A1306AA74
+484117CE5D847E287F626833FC6FDA5648ECE74BDA1BA604872AD6C5271FA89B
+4389DE8C2E26126498DF01A8B4E7DF01CAE49DE944C25FE3928C2D938D3CD794
+61408ED21846E10838205287C2E8143D7F6543889B0C918B4D8060946ECFBA5A
+DCBF48B9E4E19981F1AD5778B2FD0FC05CB4C628A1F09377B854A47E47ADD77D
+CB384C19539BC3B0B029FED20C07398FA5C266433EC7E4474E192590A04E1FB8
+508297F56037E3795B766BE0F3D7F6438FA7E464BFF671439E450637FA17EC9C
+4A0C28E33ED8B155CED74370BB5770529AD416D9205240166D84A2C48EBA62A6
+3C347D512DAD1E9A7F60289B557663D53DE4C578F6993FC10789AC6FA67A352E
+EAF095CFBECB0DFF2F1F05663D429209BB556DD66FABC6E0FDC9A90A49DF2C1C
+539755080AA332B33482725F8FD2082183D51A95456A761655D006138CEA62A6
+5CE41A0BE95CC782FFA77F2824E6051A7F871A464773D8DAD183E84CE1BF8F83
+F59D1920458000AA7477BE949982AEC5681EDCF7FC3990EDD9AF662CFDA9AC18
+A33D80212100FBD51A9BAE076457A0A9E830C0658485CA60FE8D64B70F307C0F
+59500B5F331E1E3EB4135A0D606A8F4C8BE46959346E148C9FC7BEC5E1E5D8EB
+7B9961FFEB40AB64D6F93D30F10CD048196F635B262C0516E75FB2516839559C
+893508B777CC855DC2BA233CB200352733BD71BE2DABDD264B71ED3FBC645252
+2096CE5B598DB4FAE595628682F02AD88EB38FD2D3CF65AA434A3D691CF854A1
+6AC3011DA8D1455C258C6A96EBFA86A669F671B2056B5206CB2889AE85817726
+6B06B756BACEB5FCD36A0F153536DAD78AFF2CAF131698FDF6B55E5B1B11C5AE
+8BD7FBDB7BA6E90FDD8E6962785E4CCB6A2039BC15B70DF7A0EEDE6E2A4779C6
+0CB94140E58C4627A127D4600DB448D32BF2E94A0316BFF3788AACA2DC8EFBF1
+825630B15574DC1FEEC467042D5A147F0A784F0C5A4E1934FBA251CA55B73D72
+8E964BFF59B4AE356D1DB3175DDC2A6AFD06EEE9950916FAD300118249B27F5F
+7BAE49AD6BCE4E68B5CE1523A791C7A8B8C4BD004547C59707D6A8480D4BEF7B
+1B5BCE4EC561A12D2BEBB44A71F76248841DE5394BBBFE6A7E4CE3EEAEF15825
+8FB01BB4D32A9CD744F53273DE687223A21A60DDB2317D3C80B1A70B71AA5375
+16A6AE946C972183036CEE800D650FE2CD2E74C038665ECA680CCC9AC4CEA7AF
+F4075A15327318F6A5962CB9AE8BA6D0616143B901F6B601D390E2DC1104F91B
+54A06D57CA50D11EE93686D71738FE955FD7C67F11323E059BCD0C4D406C422A
+49EF8453EABC2064828A2254F5568A8D9E0E1B587492B339AF758E0458C527D0
+7286045CE90BA9690165B9D23E40724FA9C3DCE3C2B9DED6CD9D11622AFBE843
+52F60F9C2FB8C376B57267EF3FCBB6E99152977557BE255870CD61C8CF7AA8DE
+567D174EC90945404C58001CFC764EA8585BF507366BD3ED3FCC2FFC35152254
+58DD2D3183B646672DFB2D45CE801DA6FCB815622C7CB6D29BA26352397C3DC5
+5A0FCD95276517788B57C33558FBD942F3293E79CD0191AE8D31094AA4A74D6E
+AE3CC10ED9760630CFFF16DBAE0E230887AEED675B468DC2D87B7EAAB64220A2
+E61C48BD2B8CFAE86EC0A4FD7D91C9EC9872706B290B8C9EA925AFED9C9A2CBE
+DBDF0241DFAD99C35791FE45F069B7946B5EB1D7A5CFCC0057DC09CB0F19E5AA
+D0C27B8608315AB055A39C48091E72115EFB1E975595338AAC667E1ACC0A3D0A
+F0B6A0995FA25B67430E43D16E0D780DA825AC347EE138DC959E22DF0977C4EC
+2DF9FF5831F242B8B5A0FB902F9B2355F42D337F20ED677569C646EA23E316AE
+E1EC29BA8D4A7B94EFEA537A7E03BD98EE97FA23D768F48EA462E9C8ADE13184
+F58B199F71C9B3616A0F7573B82A681D124DE7E4C90FE7EFE008301D60083FB7
+E8BDA75A112D1D27E9251E6968FE648FF1F57DAC9EFBDAA60B1ACC4627E104C0
+9627DACEB1FEA3B1B0764588EC4A652D1A7F8DD8C00C40D04B01FE7AF62D5659
+4BD31845DD8EF67D1D889702BF25FA56928987EB0BBAF4DC72DA6B4EBF8B9D02
+2DE963E82665CFCF412B99167152D35BC0E671E657EDD8746826ECC9E3FD1923
+C32789B45410AEC18605C490A58CBD295BD3BB0208A83E16FD4236560DA1C968
+928FCD617658F32B47D4836ECC48CCAE1FB7DBBB6ED76DBCB40AAE2880AFCD60
+F29551F39AFE3FFAD1623684285DDA87F629F33DE79BB830A2F69AAD4FEE1096
+A89B45C068EC7BE855032F07DB4C25C0D1E15E3395B062B933EB55F8FF293BB5
+67375F82C2B20D6D893060B9CB06F8F917B4076D63A0B3438B6BF9DDAD0C5CA5
+4CA9C48F2F39A20E85AC2B3F2A38B8CD430EF341FEAB2A3E1DF0C1C992AC99B6
+94F2C3C4563F802F8C21B71F0C9983A9780ACB77002188534B0E643A05643E8A
+83038029E832F016A7FF28FE5E889D35D6CA2122C046C743CE879EBFE2E5DC3B
+E8E7A9FA65A75E27349DDAEA619E52650F8D44A7B98EA87A08706A1A9F912884
+1698D39D7A6620558C0F4ACF195DCE08D9A100CC4229A4E33FA93A0FDB1AE200
+E2F1DC7E2AE2E881E755D62BF45FB7F79DC36C582C274D044FEEAC2A39A813FC
+4891B49E7775375100F55E9F16B8C0118E543AD35710EFCF4C5C6CBCEBDA84D4
+AEEA1D113DAD920CD30285E1AB7983940A58AF4444718A3573E80909305A12A4
+E70A501393786FCDCC0A5CEB3FC42CEF227D534BD65EDDA5B466A2B687F0998F
+C59BE4B93F4565E5DDE830AE5FF2FD1A26930E14FADD837552972E437178C103
+FCBDD935769AE28F1BB1EA4029C7C87BD07C10DC211451B71F926B4393A0F11A
+0191652C64236A960ACFA097C1FEB8776D7F800C040270B499862D6716DC21E1
+87B9ABBFC82C68A2D816A3DCD667B80FB1086D98C207287FE939BD9F4A12191B
+15548AE275EAE43BE62BDDB6028B70E194489B1FD064E515CD8EABBCD4488E8E
+C0BEFBAE0809EA81F96681C81E903522047C2CD466CE77C28C5F6AA9C7698A1E
+383942D0C6CE6F6240554BDC2B39852C74B1D27C25684C3B97F38034E0EB09FF
+F002A3BF742436AC513D1A305823F46D95CE210EA1EAAF36E4CDB47FDFC25574
+25963BA635204E89F80CAB3A5536FD44875BB61F8E7641F58AC11080C471FE24
+05773EFA39C88E78B6C552479B1E51C74F3BE16F39C0B59D107FF3D6211352AC
+C3AFE91F9FE082F213C45F0EF13072F0964ABF0944CFC4A423BCE1E467226AE0
+B39365CF4698726077C5A8E8AE21C2C10E9B2AC30C0624C769CACCFF0DF02394
+DF0196EA4BCB09F019123AB92002863D00FD73EBDB3D586B9579B00254884084
+7A2B333E5E409CFB2AB9A29CBE661AD52A63710E4F7D1BD8857EC3B6125F8E92
+8EEEA4F41976945501F32BB383455467D217777F1E0B2409A4459BC9CF7B2BA7
+69BCBBE17E81F552B60521EF051DF0328DB42C4E19F7190DD2C1658D75329240
+7E234925810A365A9D8E21D9FD21944D8BD1E10A52F090ECCDAB6C133AC3DB55
+A9E502D237B04DF5EC040F35195530E7907062FB3BA362B2AF6C697F818EA103
+F1749D2DBF2B86DE255EFEF62BDD954F8850BDE7D9C56999F756C23358698AB2
+A4E7319B9FF1A7480F80EC4A178CF2692EDB65FF7D35562BDD6DA3C2B41467B2
+EFE6358BBFE5054CFFFF5DA4728BF4CE1D892052701B48B81F5F5353110505BF
+29411E0A908DB4E1BCAEF75C34B1C0A67EA5C53F8545A6DC0F6E1C7B45CDA984
+18B81260A3AAE9925E3E26329C3AEB150A340CF2C6B6E847062270D5E37D144E
+9FD272CE6A23BADEFC0FC80B646A2FC08C8176E19AFBAA6E8E69A5E44A9ADFC7
+8DAF0D4357078353644B788AFC2729C73C29D2EF3B5853650EAA263A1E1A8D5F
+525FADEE1CDC8A35E72C9407AEB30F46784FAA3B2677172D290F2C5BEC8A1546
+F868E8A43D9F6F1C8B4A209BBC9B865FA98786E84DD5EEFB812AF7063F245222
+073D9BCD00049F7B93C11BE0AE28B2F7489FB39310DE2FBE7E38409DA085A292
+4AFA002FA83DD86D63E9FF50BC0C8C01B7F90577F737DE05F728DACB7AB62535
+3BD7204D7150D0967F83E13EBBAB33588541AEEC0DE8C53A3570C41218D0E9CA
+FBC8078A26AB4F29F821A0151356389F608F9FBFDF25D67799711048DD8CCE33
+9CB2A61090D17FA831F8D98B9A1E9FE0D79698ECDFCF6BEFA01D9A86ED9656B0
+74B08F2CD31FC681245C724A8E754BDF612E6160532B48948C4B25D81FF6A99A
+3BBAD79D0B460E90A9F4213D30B583E220F80BA5571A6E412839A1E7FF50C7B5
+A51D29A3AF781F1551F23E2D70CD53E72370728EA53E21DA2320F008BD50F3A7
+176453B4B7F68573366AD66CAA90EFB30BF9837AD04D995C4F9165B1EF1647C7
+9EA5D64B5FAA44144D1A6F2F8BFE9A6DDE8802BE60471017A9B4017D9A660E62
+AEC1DAB9EAB216693978F3551AF6500A26ABC849FFF0E9969FC293CBDF7584CC
+8AA35DA0713E92EDE9E4D41577EF58AC70B402A4427B23B0636289B8F3964C88
+A29A856CC209EC385D5B22692F349EAD4DF1F0DBB3869B74C2373223236E809A
+BE93FDB1C4A28780968331DEEC1A418382059D0ED70285DB6130989908E4FB3F
+DA3303E6BC7EBC8C3F90ECE5DAE23B6E99BC3B1CC6D379B05809BB83D175B1DA
+90C2478B692167D000AE87A0F2AB99689F12B25A7E3E92666F3EE2CF7B0C5E6F
+7F3C437BA65A9CA6FF7677680B4C95251B8EA640F233A0F99927AEFDB5E339D3
+15193003BCDC08123B1BD1720380BF14DE59470962F632C45DE55DA790C98940
+A65E5F0D1CD06A704E946B53768B5F92C846F34050B86A307BEA398227363F52
+9553BA75ACF5B385CAD0FDC641B105445D0714A98A7CCF155757F859BDC66ABA
+88A44B23A3F56EBCD82E0702C4A95FEE93D8A53487C9C9DD328DE62564D95BD8
+A43D3FE1E1A51AF1286A261CE2917C8DFF1A287DA34EBD4AC57F55BD24CFA4DA
+C0838C8736888C82493407221B7738CA5A266E761DC5FE3675C071DD47CBDB27
+3AA380990F4230DDDD0AEB3668547601F30C7FF2B337B41232EC7CC4F97EA379
+53551BE18F36CCB4227621D3749DFF82898E01228F3224DD567477ADBCF0EEE0
+58EC5BEC0EEC08C56D322EE6880FAA2A8210680952D8626EC38ED66F5BA40968
+213B2BC53B5ADD27C2BA8D326A49A911B309E9B408A17A6FEEA4B565AF120969
+F16D539D805F0A593C3F3C10584F7FCE7580B2888D818E90B6AE32EE778455A2
+F803A65AA550DF1DAB75E2D11B356A2E9602312B7A5783EC7DC30E9BD5126AC8
+B44FA1D81969BB7B6E75FE8CE66E73791F210ACEFBC1BB054E83339606F46705
+952DE8E841E6BCA9A72E2D9BB024674969AC413CCFAC3C94C546AD2D172C3186
+658AA6B3280AEEE28FBB0571B12E2103414EF14D796E89BBDD588CDD10DEAAB9
+08FFE90F0D5EA99F9BE1B3F8FBE4E42174738E3069E0FB33D497038A1F42F4F3
+09AE8C6A0C74EB7B0B27552350B9BC086EF93754CB3B2CA0C6A066ABEA6CDD87
+992F5875D2B46ABBB14234AE56F604EC290A46091CF9A7083494C09998068E6D
+14E492DB0473F6861B76791D4BBDAAEC2E7B20B23B1FE46D4BF402D8A49A04DB
+9F5BBE5336D37BF2560F8C549A74A8D1CECB16C5683BBEC2AF894DA4379E3B58
+717E068434E579C4CED71268866DB984BEF2447255A99CCE4EC00331E281D030
+2DAA100E10C2F75634A7C09D539C0843D69E66502FB01BB368A0B35B363F0892
+A1AC34B482E6CAE092A69C57AE7D0B9CF2700AD039169DDAB6BCC22F3137CA21
+CF795D00886F5803476EA0E0972A0A9B8079866182E58A167208EDB90C4FADB3
+F90589F3D8AB00BCC2395A0BD5878733EAB70BE9262EF8AADDBAAF948E87AA42
+FF80C6419C62E2446DB7E7E52EF64C4486E212E75452F8AC91B325BA96C1D6C0
+8ED82CDC523F2E3E95C9FADB50BFD713B8924F56DE73A033C553B8D9C7E39937
+6D8104A1CE77EEFB0971C1FC48B175021256F3966F5F834DDB07D7BDF4982CBF
+E6106400DB84CBD0CD0DD2AD9DE0C6E6C80B24CB70D06C2EEBB5A9F16EB9A3D7
+73BE772E4D9875BC44991B953C31E520FC491D8AC98B9D9AE60DAC3970FB75A4
+46245F766ED9264D40092C5141FC2075A15D937B993A363102B3FA93A0F254EE
+97DA6588D7C877F9456862B70C96FBABD4AF8676C5BD06C98D694D7C58829503
+31B2339344
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+ /ec-lmtt10 /GVHPQH-LMMono10-Regular def
+ /ec-lmbxi10 /XIXCAZ-LMRoman10-BoldItalic def
+%%EndSetup
+%%Page: 1 1
+ 0.9 0.9 0.9 setrgbcolor
+newpath 61.99951 107.3883 moveto
+57.05261 98.81897 46.5149 96.56372 37.46033 92.7185 curveto
+41.18042 83.95691 42.72156 73.99597 38.00049 65.81726 curveto
+17.73987 77.51465 -6.77795 79.22974 -28.46985 70.46509 curveto
+-32.00684 79.22058 -40.80505 84.14001 -50 86.60278 curveto
+-47.45483 96.1029 -42.74597 105.79834 -46.4508 114.97192 curveto
+-11.06262 129.26941 28.94287 126.474 61.99951 107.3883 curveto closepath fill
+newpath -62.00151 107.38745 moveto
+-57.05367 98.81863 -60.36943 88.56505 -61.56665 78.80093 curveto
+-52.1188 77.64185 -42.72179 73.99605 -37.99933 65.81812 curveto
+-58.2599 54.12054 -72.00414 33.74496 -75.25966 10.57686 curveto
+-84.61064 11.89148 -93.27013 6.73169 -100.00043 0 curveto
+-106.9552 6.95424 -112.9973 15.87997 -122.7943 17.25827 curveto
+-117.48222 55.05417 -95.05856 88.30234 -62.00151 107.38745 curveto closepath fill
+newpath -124.00102 -0.00085 moveto
+-114.10628 -0.00034 -106.88432 -7.99867 -99.02698 -13.91757 curveto
+-93.29922 -6.31506 -85.44334 0.00008 -75.99982 0.00085 curveto
+-75.99977 -23.3941 -65.22618 -45.48477 -46.78981 -59.88823 curveto
+-52.6038 -67.3291 -52.46507 -77.40833 -50.00043 -86.60278 curveto
+-59.50037 -89.14867 -70.25133 -89.91837 -76.34349 -97.71365 curveto
+-106.4196 -74.21524 -124.00143 -38.17166 -124.00102 -0.00085 curveto closepath fill
+newpath -61.99951 -107.3883 moveto
+-57.05261 -98.81897 -46.5149 -96.56372 -37.46033 -92.7185 curveto
+-41.18042 -83.95691 -42.72156 -73.99597 -38.00049 -65.81726 curveto
+-17.73987 -77.51465 6.77795 -79.22974 28.46985 -70.46509 curveto
+32.00684 -79.22058 40.80505 -84.14001 50 -86.60278 curveto
+47.45483 -96.1029 42.74597 -105.79834 46.4508 -114.97192 curveto
+11.06262 -129.26941 -28.94287 -126.474 -61.99951 -107.3883 curveto closepath fill
+newpath 62.00151 -107.38745 moveto
+57.05367 -98.81863 60.36943 -88.56505 61.56665 -78.80093 curveto
+52.1188 -77.64185 42.72179 -73.99605 37.99933 -65.81812 curveto
+58.2599 -54.12054 72.00414 -33.74496 75.25966 -10.57686 curveto
+84.61064 -11.89148 93.27013 -6.73169 100.00043 0 curveto
+106.9552 -6.95424 112.9973 -15.87997 122.7943 -17.25827 curveto
+117.48222 -55.05417 95.05856 -88.30234 62.00151 -107.38745 curveto closepath fill
+newpath 124.00102 0.00085 moveto
+114.10628 0.00034 106.88432 7.99867 99.02698 13.91757 curveto
+93.29922 6.31506 85.44334 -0.00008 75.99982 -0.00085 curveto
+75.99977 23.3941 65.22618 45.48477 46.78981 59.88823 curveto
+52.6038 67.3291 52.46507 77.40833 50.00043 86.60278 curveto
+59.50037 89.14867 70.25133 89.91837 76.34349 97.71365 curveto
+106.4196 74.21524 124.00143 38.17166 124.00102 0.00085 curveto closepath fill
+ 1 0.50197 0.50197 setrgbcolor
+newpath 0.75775 100.82382 moveto
+4.77448 100.70969 7.92511 94.13223 6.4389 91.9017 curveto
+4.95331 89.67117 -3.76526 89.67117 -5.18555 91.9017 curveto
+-6.60583 94.13223 -3.3899 100.94162 0.75775 100.82382 curveto closepath fill
+ 0.2196 setgray 0 0.46478 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 0 setlinejoin 10 setmiterlimit
+gsave newpath 0.75775 100.82382 moveto
+4.77448 100.70969 7.92511 94.13223 6.4389 91.9017 curveto
+4.95331 89.67117 -3.76526 89.67117 -5.18555 91.9017 curveto
+-6.60583 94.13223 -3.3899 100.94162 0.75775 100.82382 curveto closepath
+-1 1 scale stroke grestore
+ 1 setgray
+newpath 3.74786 99.48105 moveto
+-2.94739 99.48105 lineto
+-2.94739 99.48105 -3.0542 92.82883 -0.66803 92.82883 curveto
+1.57562 92.82883 3.74786 99.48105 3.74786 99.48105 curveto closepath fill
+ 0.2196 setgray 0 0.50201 dtransform truncate idtransform setlinewidth pop
+gsave newpath 3.74786 99.48105 moveto
+-2.94739 99.48105 lineto
+-2.94739 99.48105 -3.0542 92.82883 -0.66803 92.82883 curveto
+1.57562 92.82883 3.74786 99.48105 3.74786 99.48105 curveto closepath
+-1 1 scale stroke grestore
+ 1 0.8 0.66667 setrgbcolor
+newpath -4.60571 102.25418 moveto
+-4.60571 99.17313 -2.36908 96.67618 0.39063 96.67618 curveto
+3.14972 96.67618 5.38635 99.17313 5.38635 102.25418 curveto
+5.38635 105.33493 3.14972 107.83249 0.39063 107.83249 curveto
+-2.3526 107.83249 -4.58313 105.3624 -4.60571 102.25418 curveto closepath fill
+ 0.2196 setgray 0 0.59875 dtransform truncate idtransform setlinewidth pop
+gsave newpath -4.60571 102.25418 moveto
+-4.60571 99.17313 -2.36908 96.67618 0.39063 96.67618 curveto
+3.14972 96.67618 5.38635 99.17313 5.38635 102.25418 curveto
+5.38635 105.33493 3.14972 107.83249 0.39063 107.83249 curveto
+-2.3526 107.83249 -4.58313 105.3624 -4.60571 102.25418 curveto closepath
+-1 1 scale stroke grestore
+ 0.82745 0.55295 0.37254 setrgbcolor
+newpath 2.26196 103.8414 moveto
+2.26196 103.8414 -0.06165 101.38535 -2.44629 101.577 curveto
+-4.83551 101.76956 -6.44379 102.88193 -6.44379 102.88193 curveto
+-6.44379 102.88193 -5.2124 109.59671 0.29053 109.7078 curveto
+4.59961 109.79813 6.72089 105.66269 7.34924 102.88193 curveto
+7.98615 100.06577 7.11273 100.07645 6.18195 100.31662 curveto
+5.25055 100.55618 2.26196 103.8414 2.26196 103.8414 curveto closepath fill
+ 0.2196 setgray 0 0.58838 dtransform truncate idtransform setlinewidth pop
+gsave newpath 2.26196 103.8414 moveto
+2.26196 103.8414 -0.06165 101.38535 -2.44629 101.577 curveto
+-4.83551 101.76956 -6.44379 102.88193 -6.44379 102.88193 curveto
+-6.44379 102.88193 -5.2124 109.59671 0.29053 109.7078 curveto
+4.59961 109.79813 6.72089 105.66269 7.34924 102.88193 curveto
+7.98615 100.06577 7.11273 100.07645 6.18195 100.31662 curveto
+5.25055 100.55618 2.26196 103.8414 2.26196 103.8414 curveto closepath
+-1 1 scale stroke grestore
+ 1 0.8 0.66667 setrgbcolor
+newpath -7.32666 95.48203 moveto
+-7.93549 94.66354 -7.64526 93.41507 -6.67847 92.69577 curveto
+-5.71198 91.97647 -4.43237 92.05734 -3.82294 92.87674 curveto
+-3.81378 92.88864 lineto
+-3.45886 93.37631 -3.39478 95.4689 -4.0274 95.90561 curveto
+-4.72412 96.38596 -6.71722 96.30081 -7.32666 95.48203 curveto closepath fill
+ 0.2196 setgray 0 0.43274 dtransform truncate idtransform setlinewidth pop
+gsave newpath -7.32666 95.48203 moveto
+-7.93549 94.66354 -7.64526 93.41507 -6.67847 92.69577 curveto
+-5.71198 91.97647 -4.43237 92.05734 -3.82294 92.87674 curveto
+-3.81378 92.88864 lineto
+-3.45886 93.37631 -3.39478 95.4689 -4.0274 95.90561 curveto
+-4.72412 96.38596 -6.71722 96.30081 -7.32666 95.48203 curveto closepath
+-1 1 scale stroke grestore
+ 0.1 0.1 0.7 setrgbcolor
+-102.48225 47.44527 moveto
+(Editor) ec-lmbxi10 9.96265 fshow
+ 0 0 0 setrgbcolor
+-102.32745 -52.42656 moveto
+(fig.mp) ec-lmtt10 9.96265 fshow
+ 0.1 0.1 0.7 setrgbcolor
+-24.0665 -102.49065 moveto
+(MetaPost) ec-lmbxi10 9.96265 fshow
+ 0 0 0 setrgbcolor
+80.0057 -39.0385 moveto
+(fig.1) ec-lmtt10 9.96265 fshow
+ 0.62999 0.62999 0.62999 setrgbcolor
+59.93161 -64.76787 moveto
+(fig.log) ec-lmtt10 9.96265 fshow
+ 0.1 0.1 0.7 setrgbcolor
+61.8105 47.44527 moveto
+(Pr) ec-lmbxi10 9.96265 fshow
+74.0643 47.44527 moveto
+(eviewer) ec-lmbxi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.mp b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.mp
new file mode 100644
index 0000000000..6adefb1811
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/workflow-from-mpman-charts.mp
@@ -0,0 +1,320 @@
+verbatimtex
+ \def\appl#1{\applfontx#1\strut}
+ \def\ext#1{\extfontx#1\strut}
+ \font\applfontx=ec-lmri10
+ \font\extfontx=ec-lmtt10
+ \font\extfontvii=ec-lmtt8 at 7pt
+etex
+
+% Use the boxes package for drawing charts.
+input boxes;
+prologues := 3;
+
+def _drawNode = drawboxed enddef;
+
+%%% These paramaters determine the size of nodes and the grid distance.
+newinternal applwidth; applwidth := 30bp;
+newinternal applheight; applheight := 14bp;
+newinternal extwidth; extwidth := 30bp;
+newinternal extheight; extheight := 14bp;
+newinternal rowscale; rowscale := 100bp;
+newinternal colscale; colscale := 100bp;
+
+%%% This macro builds and draws a rectangular node at a given location
+%%% with text indicating an application.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the box node.
+def appl(suffix i)(expr coor)(text t) =
+ boxit.i(t);
+ i.c = coor;
+ i.e = i.c + .5applwidth*right;
+ i.n = i.c + .5applheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws an oval node at a given location with
+%%% text indicating a file name extension.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the oval node.
+def ext(suffix i)(expr coor)(text t) =
+ circleit.i(t);
+ i.c = coor;
+ i.e = i.c + .5extwidth*right;
+ i.n = i.c + .5extheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws a rectangular node at a given location
+%%% with text indicating an application.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the box node.
+def appl_rc(suffix i)(expr coor)(text t) =
+ boxit.i(t);
+ i.c = (colscale * ypart coor, -rowscale * xpart coor);
+ i.e = i.c + .5applwidth*right;
+ i.n = i.c + .5applheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws an oval node at a given location with
+%%% text indicating a file name extension.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the oval node.
+def ext_rc(suffix i)(expr coor)(text t) =
+ circleit.i(t);
+ i.c = (colscale * ypart coor, -rowscale * xpart coor);
+ i.e = i.c + .5extwidth*right;
+ i.n = i.c + .5extheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro draws a straight arrow between two nodes. Arrow length
+%%% is corrected for the pen width, so that the arrow doesn't sink into
+%%% the frame of the target node. If pen width is changed, the code
+%%% "0.5bp" has to be replaced by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+def line(suffix a,b) =
+ begingroup
+ save p;path p;
+ p := a.c--b.c cutbefore bpath(a) cutafter bpath(b);
+ drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
+ endgroup
+enddef;
+
+
+%%% This macro draws a curved arrow between two nodes with determined
+%%% leaving and entering angles. Arrow length is corrected for the pen
+%%% width so that the arrow doesn't sink into the frame of the target
+%%% node. If pen width is changed, the code "0.5bp" has to be replaced
+%%% by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+%% @param anga Leaving angle at (center of) node a.
+%% @param angb Entering angle at (center of) node b.
+def curve(suffix a,b)(expr anga,angb) =
+ begingroup
+ save p;path p;
+ p := a.c{dir anga}..{dir angb}b.c cutbefore bpath(a) cutafter bpath(b);
+ drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
+ endgroup
+enddef;
+
+
+%%% This macro draws a curved arrow between two nodes with determined
+%%% leaving and entering angles offset. Arrow length is corrected for
+%%% the pen width so that the arrow doesn't sink into the frame of the
+%%% target node. If pen width is changed, the code "0.5bp" has to be
+%%% replaced by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+%% @param angr Offset to entering and leaving angles at nodes a and b.
+def curve_rel(suffix a,b)(expr angr) =
+ begingroup
+ save alpha;
+ alpha = angle(b.c-a.c);
+ curve(a, b, alpha+angr, alpha-angr);
+ endgroup
+enddef;
+
+beginfig(1);
+ interim applwidth := 72bp;
+ interim applheight := 28bp;
+ interim extwidth := 48bp;
+ interim extheight := 28bp;
+ interim rowscale := 56bp;
+ interim colscale := 100bp;
+ interim ahangle := 30;
+
+% Build and draw boxes.
+ ext_rc(fig.mp, (0,0), btex \ext{fig.mp} etex);
+ appl_rc(mpost, (1,0), btex \appl{MetaPost} etex);
+ ext_rc(fig.1, (2,0), btex \ext{fig.1} etex);
+ ext_rc(doc.tex, (0,2), btex \ext{doc.tex} etex);
+ appl_rc(tex, (1,2), btex \appl{\TeX} etex);
+ ext_rc(doc.dvi, (2,2), btex \ext{doc.dvi} etex);
+ appl_rc(dvips, (3,1), btex \appl{dvips} etex);
+ ext_rc(doc.ps, (4,1), btex \ext{doc.ps} etex);
+
+% Draw connections.
+ line(fig.mp, mpost);
+ line(mpost, fig.1);
+ line(doc.tex, tex);
+ line(tex, doc.dvi);
+ curve(fig.1, dvips, -90, 0);
+ curve(doc.dvi, dvips, -90, 180);
+ line(dvips, doc.ps);
+
+% Draw bounding box link.
+ boxit.bb(btex
+ \vbox{
+ \hbox to 50bp {\hfil\strut bounding\hfil}
+ \hbox to 50bp {\hfil\strut box\hfil}
+ }
+ etex scaled .8);
+ path p;
+ p := fig.1.e{right}..{right}tex.w;
+ bb.c = point 0.5 of p;
+ drawunboxed(bb);
+ draw p cutafter bpath bb dashed evenly;
+ drawarrow p cutbefore subpath (1,3) of bpath bb dashed evenly;
+endfig;
+
+
+verbatimtex
+ \font\applfontx=ec-lmbxi10
+etex
+
+beginfig(2);
+% Pre-define workflow segment parameters.
+ wfsegments := 6;% counter
+ wfsegangle = 360/wfsegments;% angle
+ wfstart := 90;% angle
+ wfdiam := 200bp;% dimension
+ wfthick := 48bp;% dimension
+ wfgap := 8;% angle
+ wfinset := 8;% angle
+
+% Pre-define colors of some graphic elements.
+ color wf_col, appl_col, ext_col;
+ wf_col = .9white;
+ appl_col = (.1, .1, .7);
+ ext_col = 0white;
+
+% The size of the user icon.
+ usersize := 20bp;
+
+% Construct a workflow segment.
+%
+% * The anchor point of a workflow segment is at its center.
+%
+% * Array wfang[] stores the angle on a circle corresponding
+% to a vertex of a workflow segment. The mapping of indices
+% to vertices is:
+%
+% 2---------0
+% / /
+% 3 1
+% \ \
+% 2---------0
+%
+% * For array wfscale[] the mapping is:
+%
+% 3---------0
+% / /
+% < <
+% \ \
+% 2---------1
+%
+ numeric wfang[], wfscale[];
+ path wfseg;
+ wfang0 = .5(-wfsegangle + wfgap - wfinset);
+ wfang1 = .5(-wfsegangle + wfgap + wfinset);
+ wfang2 = .5( wfsegangle - wfgap - wfinset);
+ wfang3 = .5( wfsegangle - wfgap + wfinset);
+ wfscale[0] = 1 + wfthick/wfdiam;
+ wfscale[1] = 1 - wfthick/wfdiam;
+ wfscale[2] = 1 - 1.0*wfthick/wfdiam;
+ wfscale[3] = 1 + 1.0*wfthick/wfdiam;
+ wfseg := 0.5dir(wfang0)*wfscale0 {dir(wfang0-180)}
+ ..{dir(wfang1+135)} 0.5dir(wfang1) {dir(wfang1-135)}
+ ..{dir(wfang0+180)} 0.5dir(wfang0)*wfscale1 {dir(wfang0+90)}
+ ..{dir(wfang2+90)} 0.5dir(wfang2)*wfscale2 {dir(wfang2)}
+ ..{dir(wfang3+45)} 0.5dir(wfang3) {dir(wfang3-45)}
+ ..{dir(wfang2)} 0.5dir(wfang2)*wfscale3 {dir(wfang2-90)}
+ ..{dir(wfang0-90)} cycle;
+
+% Store user icon in picture variable.
+ picture unituserLeft, unituserRight;
+ unituserRight := image(
+% This clip-art has been taken from the Open Clip-Art Library at
+% <URL:http://www.openclipart.org/about>. The original SVG file by
+% 'yyycatch' is licensed as Public Domain and can be found at
+% <URL:http://www.openclipart.org/detail/18601>. It has been
+% converted to MetaPost by exporting the SVG file to EPS in Inkscape
+% and then coordinates, colours and pens have been manually translated
+% to the corresponding MetaPost commands.
+ path p[];
+ p1 =
+ (39.387, 60.034) .. controls (17.117, 59.401) and (-0.352, 22.932)
+ .. (7.887, 10.565) .. controls (16.125, -1.802) and (64.465, -1.802)
+ .. (72.34, 10.565) .. controls (80.215, 22.932) and (62.383, 60.686)
+ .. cycle;
+ p2 =
+ (22.809, 52.588)
+ -- (59.93, 52.588) .. controls (59.93, 52.588) and (60.523, 15.705)
+ .. (47.293, 15.705) .. controls (34.852, 15.705) and (22.809, 52.588)
+ .. cycle;
+ p3 =
+ (69.125, 67.963) .. controls (69.125, 50.881) and (56.723, 37.037)
+ .. (41.422, 37.037) .. controls (26.125, 37.037) and (13.723, 50.881)
+ .. (13.723, 67.963) .. controls (13.723, 85.045) and (26.125, 98.893)
+ .. (41.422, 98.893) .. controls (56.633, 98.893) and (69, 85.198)
+ .. cycle;
+ p4 =
+ (31.047, 76.764) .. controls (31.047, 76.764) and (43.93, 63.147)
+ .. (57.152, 64.209) .. controls (70.398, 65.276) and (79.316, 71.444)
+ .. (79.316, 71.444) .. controls (79.316, 71.444) and (72.488, 108.674)
+ .. (41.977, 109.291) .. controls (18.086, 109.791) and (6.324, 86.862)
+ .. (2.84, 71.444) .. controls (-0.691, 55.83) and (4.152, 55.889)
+ .. (9.313, 57.221) .. controls (14.477, 58.549) and (31.047, 76.764)
+ .. cycle;
+ p5 =
+ (84.211, 30.416) .. controls (87.586, 25.877) and (85.977, 18.955)
+ .. (80.617, 14.967) .. controls (75.258, 10.979) and (68.164, 11.428)
+ .. (64.785, 15.971)
+ -- (64.734, 16.037) .. controls (62.766, 18.741) and (62.41, 30.342)
+ .. (65.918, 32.764) .. controls (69.781, 35.428) and (80.832, 34.955)
+ .. cycle;
+ interim linecap := butt;
+ interim linejoin := mitered;
+ fill p1 withcolor (1, 0.501961, 0.501961);
+ draw p1 withcolor 0.219608 withpen pencircle scaled 2.577288;
+ fill p2 withcolor 1;
+ draw p2 withcolor 0.219608 withpen pencircle scaled 2.782928;
+ fill p3 withcolor (1, 0.8, 0.666667);
+ draw p3 withcolor 0.219608 withpen pencircle scaled 3.31912;
+ fill p4 withcolor (0.827451, 0.552941, 0.372549);
+ draw p4 withcolor 0.219608 withpen pencircle scaled 3.262816;
+ fill p5 withcolor (1, 0.8, 0.666667);
+ draw p5 withcolor 0.219608 withpen pencircle scaled 2.4;
+ );
+% Normalize user icon.
+ unituserRight := unituserRight shifted (-llcorner unituserRight -.5urcorner unituserRight);
+ unituserRight := unituserRight scaled (.5/ypart urcorner unituserRight);
+ unituserLeft := unituserRight reflectedabout ((0,0), (0,1));
+
+% Helper function: transform location on workflow circle in
+% degrees into cartesian coordinates.
+ def degtoxy(expr deg) =
+ (point deg/45 of fullcircle scaled wfdiam)
+ enddef;
+
+% Draw workflow segments.
+ for i=0 upto wfsegments-1:
+ fill wfseg scaled wfdiam rotated (wfstart+i*wfsegangle) withcolor wf_col;
+ endfor
+
+% Fill-in workflow segment descriptions.
+ label(unituserLeft scaled usersize, degtoxy(wfstart+wfsegangle*0));
+ label(btex \appl{Editor} etex, degtoxy(wfstart+wfsegangle*1)) withcolor appl_col;
+ label(btex \ext{fig.mp} etex, degtoxy(wfstart+wfsegangle*2)) withcolor ext_col;
+ label(btex \appl{MetaPost} etex, degtoxy(wfstart+wfsegangle*3)) withcolor appl_col;
+ label(btex \ext{fig.1} etex, degtoxy(wfstart+wfsegangle*4+wfsegangle/7)) withcolor ext_col;
+ label(btex \ext{fig.log} etex, degtoxy(wfstart+wfsegangle*4-wfsegangle/7)) withcolor .7[ext_col, wf_col];
+ label(btex \appl{Previewer} etex, degtoxy(wfstart+wfsegangle*5)) withcolor appl_col;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/xfig.png b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/xfig.png
new file mode 100644
index 0000000000..ff9fd518b7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/metapostpropagandafiles/xfig.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/otherinfo/BezierApprox.pdf b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/BezierApprox.pdf
new file mode 100644
index 0000000000..95060aab6a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/BezierApprox.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/otherinfo/CHANGESv1.803.txt b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/CHANGESv1.803.txt
new file mode 100644
index 0000000000..36b1b8d98f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/CHANGESv1.803.txt
@@ -0,0 +1,1504 @@
+
+This file is public domain.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.803:
+----------------------------------------------------------------------
+
+* Fixed a bug in the path tension handling that sometimes caused
+ distorted output.
+
+* A number of small alterations to the build system making it easier
+ to integrate metapost with W32TEX.
+
+* Fix the internal rounding functions in --numbersystem=double so that
+ they round exactly like in --numbersystem=scaled mode.
+
+* From Elie Roux: a fix to graph.mp to prevent log-scaled graphs with
+ large ranges from causing the "Value is too large" error.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.802:
+----------------------------------------------------------------------
+
+* Fixed a bug causing overly large characters in SVG output mode when
+ prologues != 3.
+
+* Removed a crash during free-ing of TFM metric data at the end of the
+ run.
+
+* Fixed a problem with colors in SVG output mode.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.801:
+----------------------------------------------------------------------
+
+* fixed an off-by-one error in the SVG output that prevented the last
+ font's glyphs from actually being output to the svg file under
+ prologues:=3;
+
+* fixed a bug in bbox calculations in that caused the max y to be set
+ based on the maximum x coordinate internal value instead of the
+ maximum y coordinate.
+
+* fixed a bug where metapost incorrectly produced a 'degenerate spec'
+ error.
+
+* build fixes for various platforms imported from TeXLive 2013, as
+ well as the latest kpathsea development etc.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.800:
+----------------------------------------------------------------------
+
+* A new string valued internal "outputformatoptions" is used by PNG
+ output mode to control the png file format. In the future, this
+ internal may also be used for options to the other output formats.
+
+ The syntax for "outputformatoptions" is a space-separated list of
+ settings. Individual settings are keyword+'='+value. The only
+ currently allowed ones are:
+ format=[rgba|rgb|graya|gray]
+ antialias=[none|fast|good|best]
+ No spaces are allowed on the left, nor on the right, of the equals
+ sign inside a setting.
+
+ The assignment that would match the compiled-in default setup is:
+ outputformatoptions := "format=rgba antialias=fast";
+ however, "outputformatoptions" is initially the empty string.
+
+ Some notes on the (new) PNG output formats:
+ - The 'rgb' and 'gray' subformats have a white background. The
+ 'rgba' and 'graya' subformats have a transparent background.
+ - Bitdepth is always 8.
+ - In all cases, the image is initially created in 8-bit RGB
+ mode. For 'gray' and 'graya', the RGB colors are reduced just
+ before the actual PNG file is written, using a standard rule:
+ g = 0.2126*r + 0.7152*g + 0.0722*b
+ - CMYK colors are always converted to RGB during generation of
+ the output image using:
+ r = 1 - (c+k>1 ? 1 : c+k);
+ g = 1 - (m+k>1 ? 1 : m+k);
+ b = 1 - (y+k>1 ? 1 : y+k);
+ - If you care about color conversions, you should be doing a
+ "within <pic>" loop inside "extra_endfig". The built-in
+ conversions are more of a fallback.
+
+* A new string-valued internal "outputfilename", which is set by
+ "shipout" to the value of the just created file name. Until the
+ first shipout has occurred, it is the empty string.
+
+
+* Fixed a number of bugs where Metapost loaded the default font map
+ file multiple times, resulting in lots of "fontmap entry for
+ `<fontname>' already exists, duplicates ignored" warnings.
+
+* The "glyph <> of <>" operation could crash on fonts with empty
+ subpaths in the charstrings.
+
+* Fixed a bug in the postscript encoding reader that caused a buffer
+ overflow (fatal error) for encoding files that do not end with a
+ newline.
+
+* Sped up png creation a bit by using smarter libpng options.
+
+* In the 'double' numbersystem, lots of precision was lost due to a bad
+ internal conversion of fractions to scaled values. This affected the
+ "rotated by", "directiontime", "sind" and "cosd" primitives, as well
+ as internal dependency calculations.
+
+* In the 'double' numbersystem, an internal rounding error caused
+ "directiontime" to return bad results for requests near zero.
+
+* There was a big scaling miscalculation while outputting glyphs in SVG
+ mode with "prologues:=3". The output labels were so big that they
+ fell completely outside of the generated image.
+
+* A problem resulting in 'This can't happen (endinput)' caused by a
+ missing "end" at the end of the run was fixed.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.790:
+----------------------------------------------------------------------
+
+* Lots of speedups.
+
+* Fixed bug in division expressions that started with a literal number.
+
+* A few problems with bad deallocations were solved.
+
+* A bug where after saving and redefinition of primitives, they later
+ were restored to 'undefined' instead of to their primitive meaning.
+
+* The "double" literal number parser now only accepts scientific
+ notation if the character following 'E' or 'e' is '+', '-', or
+ a digit.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.780:
+----------------------------------------------------------------------
+
+* The turningnumber calculation in 1.770 was bugged.
+
+* The picture export in 1.770 forgot to add trailing zeroes to the
+ log and term output channel resulting in rubbish output.
+
+* The arguments of the PS "dtransform" operator have been fixed
+ (was wrong since 1.750).
+
+* The warning limit in numbersystem=double mode is now exactly 2**52.
+
+* A bunch of obvious memory leaks fixed. Not all yet, but now the
+ MPlib seems to be usable even with many graphics.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.770:
+----------------------------------------------------------------------
+
+This is an alpha release for testing & debugging only!
+
+* The command line switch --numbersystem replaces --math.
+
+* Two new internals: numbersystem (string, read-only, either "scaled"
+ or "double" at the moment) and numberprecision (numeric, currently
+ a no-op).
+
+* There is a new bitmap backend:
+
+ outputformat:="png";
+
+ This backend uses cairo and libpng to generate PNG bitmap data.
+ The created PNG used RGB + Alpha, with anti-aliasing, at 72dpi,
+ and with a transparent background.
+
+* Associated with this, there are new internals "hppp" and "vppp",
+ that are used by the bitmap backend to decide on the scale of
+ the generated bitmap. Default value for both new internals is
+ "1.0", i.e. one pixel per Metapost point.
+
+ The internal names come from metafont.
+
+* There are two new primitives for use with picture item objects:
+
+ prescriptpart
+ postscriptpart
+
+* The C API has been extended to allow path control point resolution
+ without going through the Metapost input language, see
+ manual/mplibapi.tex for details.
+
+* The C API has been extended with a "math_mode" switch in the options
+ structure, and the memory size options as well as "ini_mode" have
+ been removed (the MPlib instance now always starts up in inimp mode)
+
+* The code for picture shipout now uses "double" for all floating point
+ values. This can give small differences in the actual output files in
+ traditional mode due to the required scaled -> double conversion, but
+ was necessary to support the new numerical backend code.
+
+* The Lua API internals have been updated to reflect the C API changes.
+
+* All known crashes in earlier versions of Metapost have been fixed.
+
+Known issues:
+
+* The manual is not up-to-date yet on the metapost input language
+ changes.
+
+* There are various memory leaks.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.750:
+----------------------------------------------------------------------
+
+This is an alpha release for testing & debugging only!
+
+* mpost now accepts --math=double as an argument. This switches the
+ internal arithmetic functions from using a scaled 32-bit data type
+ to 64-bit floating point.
+
+* With --math=double, the input scanner has been changed to allow
+ a := 1.0E20
+ as valid input format for a numerical value
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.504:
+----------------------------------------------------------------------
+
+* Small build system tweaks from TeXLive 2012.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.503:
+----------------------------------------------------------------------
+
+* String comparisons have been fixed, these were broken in previous
+ 1.50x versions.
+
+* verbatimtex ... etex processing had a horrible bug that is now
+ fixed.
+
+* A fix has been applied for a bug that made redeclared variable
+ subscript tags disappear.
+
+* The behavior of the %{<internal>} escape sequence in 'outputtemplate'
+ changed (but not that of the single-letter shortcuts). Internal
+ variables within %{...} are neither rounded nor zero-padded.
+
+* A very long list of improvements to the manual.
+
+* MetaPost now adheres to the openin_any / openout_any settings in
+ texmf.cnf
+
+* The 'prologues:=3 output' with embedded labels was unreliable,
+ especially when the resulting eps was included into a TeX document
+ via dvips.
+
+* 'newinternal numeric' has been fixed, it generated an error in
+ metapost 1.211 and earlier 1.50x versions.
+
+* Label regeneration sometimes failed to run when the file time stamps
+ were close together.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.502:
+----------------------------------------------------------------------
+
+* New build system and kpathsea imported from TeX Live.
+
+* Various bugfixes.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.501:
+----------------------------------------------------------------------
+
+* The maximum number of variable instances has increased from approx.
+ 33 million (2^25-1) to 2 billion (2^31-1).
+
+* New build system and kpathsea imported from TeX Live.
+
+* Many small bugfixes to 1.500.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.500:
+----------------------------------------------------------------------
+
+* Actual memory dump files do not exist any more. --mem=<MEM> and
+ all other methods of supplying a MEM file are now interpreted
+ somewhat like this pseudo-metapost-code:
+
+ begingroup;
+ let dump = end;
+ input MEM[.mp];
+ endgroup;
+
+ this process is supposed to be transparent besides the facto that
+ there is some extra terminal output and logging.
+
+* All memory is now allocated and freed dynamically. There are only
+ two remaining overflow errors(1):
+
+ "expansion depth" : this is a guard against infinite recursion,
+ the value is 10000.
+ "sizes per font" : this is maxed out for data-structure reasons,
+ the value is 32767.
+
+ from texmf.cnf, now only the "error_line", "half_error_line" and
+ "print_line settings" are used.
+
+ (1) but now you can reach the operating system limits, of course.
+
+* As this is an alpha release containing lots and lots of new code,
+ MetaPost starts up with the internal equivalent of 'loggingall;'
+ in effect. This results in log files that can help in debugging.
+
+* Expect bugs and (minor) memory leaks.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.212:
+----------------------------------------------------------------------
+
+* Small build system tweaks from TeXLive 2011.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.211:
+----------------------------------------------------------------------
+
+* In previous 1.20X versions, the 'glyph infont' operator did not handle
+ fonts with seac (old-style composite characters) properly.
+
+* Incorporated the latest versions of kpathsea and the build system
+ from TeXLive.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.210:
+----------------------------------------------------------------------
+
+* In previous 1.20X versions, btex ... etex handling forgot to take
+ the passed directory location of input-ed files into account.
+
+* verbatimtex ... etex is now copied as is. Whitespace stripping
+ and appending of % no longer happen.
+
+* The mpost executable now always strips exactly one extension from
+ the jobname (unless explicit --jobname was given)
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.209:
+----------------------------------------------------------------------
+
+* Previous 1.20X mem files were architecture-dependent.
+
+* Metapost now uses getopt once again, which makes the commandline
+ handling compatible with pre-1.20X versions. However, the syntax
+ -sprologues=1 is now no longer supported (the space between -s
+ prologues is now mandatory).
+
+* On some systems, metapost would crash inside the function that prints
+ the 'fatal error' message.
+
+* The 'glyph infont' operator would sometimes cause crashes, and in
+ other cases it generated bad output.
+
+* There was a space missing in the generated output when mpprocset
+ was set. This was still legal PostScript, but it confused mptopdf.
+
+* In previous 1.20X versions, the font map file was read for each
+ figure that contained a label, resulting in lots of harmless
+ but scary warnings being reported.
+
+* The --debug switch is now documented in the command-line help.
+
+* The help text now mentions the metapost version.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.208:
+----------------------------------------------------------------------
+
+* Previous versions of MetaPost 1.20x were overeager to remove file
+ extensions from the end of the jobname.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.207:
+----------------------------------------------------------------------
+
+* With the -file-line-error commandline option, MetaPost 1.20x always
+ reported the name of the most recently 'input' file instead of the
+ name of the actual current file.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.206:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Many of the commands in the MP language cause strings in the string
+ pool to be printed to new strings that are also built up in the
+ string pool. This could cause crashes when the new string wouldn't
+ fit in the memory allocated.
+
+* Failure to initialize the jobname in the MP_options struct could
+ cause crashes in library mode.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.205:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Metapost did not handle well files with extensions other than .mp.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.204:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Metapost could go into an endless output loop when characters in
+ bitmap fonts where used, because it tried to limit the %*Font output
+ line to a specific number of bytes.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.203:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Building version 1.202 for source required X11 headers to be installed.
+
+* Another infinite recursion trap added, now for erroneous vardefs
+ with suffixes (reported by Nicola Vitacolonna).
+
+* Fix infinite loop recursion on integer overflow (reported by Nicola
+ Vitacolonna, fix based on a hint from Dan Luecking).
+
+* In version 1.202, setting "job_name" from lua code caused a crash.
+
+* The "filename" field on the lua figure object in 1.202 was just the
+ extension, instead of the whole file name.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.202:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Fix greypart <numeric> (always returned 0).
+
+* Make 'withcolor true' explicitly reset the color model to uninitialized.
+
+* Report which mem file can't be found, and use 'plain' instead of PLAIN
+ in the mem search warning messages.
+
+* Fix a crash on subsetting of some Type1 fonts because of a temporary
+ buffer overrun.
+
+* Correct a crash on SVG text output when the 8th bit is set.
+
+* Fix the use (reference) of 8-bit glyphs in SVG mode when prologues:=3.
+
+* Fix the output of text strings that reference the character at index 0.
+
+* Use ".ps" as file extension for negative charcodes (backward compatility).
+
+* Metapost sometimes printed "mp_vacuous" instead of "vacuous".
+
+* Fix rounding of negative scaled and fraction values.
+
+* Restore the error for 'arctime' out-of-bounds.
+
+* Moved the "turningnumber algorithms do not agree" message out of reach
+ (now only printed if tracingchoices>2 )
+
+* Fix a problem with dash scaling during picture copying.
+
+* TFM header bytes were written out with an offset of one.
+
+* Updated the mptrap files.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.201:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* There was a bug where sometimes the outer contour of a glyph that was
+ asked for via 'glyph X of' was missing from te output, depending on
+ the path drawing order inside the Type1 font.
+
+* Handling of MPTEXPRE label prefix files was broken.
+
+* Font subsetting for 8-bit characters in Type1 fonts was broken.
+
+* The use of "%{outputtemplate}" inside "outputtemplate" now generates
+ an error.
+
+* The first letter of the input file name was swallowed in the log file.
+
+* There is some rudimentary support for infinite recursion trapping now,
+ to help prevent segfaults&crashes due to C call stack exhaustion.
+
+* An unlucky change in glibc made compilation fail on new GNU/Linux
+ systems due to multiple incompatible definitions of 'getline()'.
+
+* There was a bug in the handling of quoted external commands for
+ MPXCOMMAND | MPXMAINCMD | TEX.
+
+* The main input file's opening brace and filename were not shown in
+ the log file output.
+
+* Non-colored picture objects (clipping and setbounds paths) are now
+ ignored when the color part is asked from within "within", for
+ backward compatibility reasons.
+
+* The trip and trap files are now part of the distribution and the
+ mptrap files have been updated.
+
+* The standard web2c argv[0] mem file mimicri was broken: 1.200 was
+ always looking for "mpost.mem" even when called under another name.
+
+* The manual pages for "mpost" and "dvitomp" have been updated, and the
+ old "mp" manual page has been removed.
+
+* The first letter of any missing input file name was not shown in the
+ terminal error message.
+
+* Output files are now once again written in the current directory even
+ if an explicit source directory is given. This includes the creation
+ of mpx files, but some trickery is used so that up-to-date existing
+ mpx files from the source directory take precedence.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.200:
+----------------------------------------------------------------------
+
+New features:
+
+* It is now possible to get the actual path drawing routines from a
+ font glyph. The syntax is :
+
+ q := glyph 113 of "cmr10";
+ q := glyph "one.oldstyle" of "lmr10";
+
+ "glyph" is a primary binary operator (like "subpath") that accepts
+ a string or number and a string, and the result is a picture.
+
+ The second argument is a tfm name. This will be combined with
+ a fontmap entry to find the font's PostScript source file.
+
+ If the first argument is a string, then it should be a Charstring
+ name in the postscript font source. If the first argument is
+ an integer, it is an index into the encoding of the font, and
+ the Charstring that is mapped to that index is taken (it follows
+ that numeric values have to be integers between 0 and 255).
+
+ The returned picture can be empty (if the tfm or the pfb or the
+ encoding or the Charstring was not found), otherwise it consists
+ of a list of 'fill' objects that use the the 'grey' color model.
+ Counterclockwise paths receive the grey value matching 'white',
+ clockwise paths 'black'.
+
+* MetaPost now supports string valued internal variables. Three of
+ these are predefined ("jobname", "outputformat", "outputtemplate"),
+ you can add more of them via "newinternal".
+
+ newinternal string s;
+ s := "hello";
+
+ The type of a new internal is either 'string' or 'numeric',
+ and defaults to numeric (this is for backward compatibility with
+ older versions of MetaPost). String internals are initialized to
+ the empty string, numeric internals are initialized to zero.
+
+* MetaPost now has a second backend that generates Scalable Vector
+ Graphics output. This new backend was requested by Dave Crossland, who
+ also provided the funding to make it possible. Dave, thank you again!
+
+ The default value of "outputformat" is "eps"; when you assign "svg"
+ you will get SVG output.
+
+ If you use text labels with SVG, you will probably also want to set
+
+ prologues:=3;
+
+ With this setting, MetaPost will convert the font into curves
+ (of course you also need a correct font map line, just as for
+ PostScript output).
+
+ With any other value of "prologues" you will simply get the SVG
+ default text font in a system-dependant encoding. This is unlikely
+ to be what you want!
+
+ A simple example:
+
+ outputformat := "svg";
+ outputtemplate := "%j-%c.svg";
+ beginfig(1);
+ fill fullcircle scaled 100 withcolor .4red;
+ endfig;
+ end.
+
+ In the lua bindings, there is the new figure method "svg()", that
+ gives back the SVG output string. This is subtly different from the
+ direct file output: the lua method does not prepend an XML declaration
+ (this makes embedded use of the generated XML easier).
+
+* The new internal string variable "outputtemplate" replaces
+ "filenametemplate". The big difference is that "outputtemplate"
+ is a true 'internal', so that you need a proper assignment.
+ On the positive side, this means that you can use its current
+ value with e.g. show and message.
+
+* "outputtemplate" has a new type of replacement: internal variable
+ names. Instead of the short "%j.%c", you could write:
+
+ outputtemplate := "%{jobname}.%{charcode}" ;
+
+ this type of replacement works for all internal variables,
+ including those defined via "newinternal".
+
+* There are two new numeric internals: "hour" and "minute".
+ (these are a consequence of the outputtemplate change)
+
+* The primitive "jobname" is now a string internal instead of a
+ special case. This implies you can assign to "jobname", but
+ such an assignment will only affect the picture output. The
+ job name for the purposes of log and mem file names is fixed
+ permanently at startup time and cannot be altered.
+
+* "mpost" can now pretend to be dvitomp. Either copy the executable
+ to the name "dvitomp", or pass the switch --dvitomp on the command
+ line.
+
+* The command line option --halt-on-error has been reinstated.
+
+* There is a new -s<internal>=<value> command line switch that can
+ be used to setup run time values. Such assignment will be executed
+ after initialization is complete (i.e. after mem file loading) but
+ before any other code is executed.
+
+ This works for all internal variables, including one defined
+ that may have been defined in the mem file via "newinternal".
+
+* "tracingstats:=1;" now prints the highest and total input levels.
+
+Bug fixes:
+
+* The turningnumber calculation had a rounding error in the internal
+ arithmetic that could cause incorrect numbers to be calculated
+ (typically resulting in a 'turning numbers do not match' error).
+
+* The parsing of command line arguments with options was broken.
+
+* Reading of files with 8-bit names has been fixed.
+
+* A patch by Melissa O'Neill fixes inclusion of some special Type1
+ formats.
+
+* There was a bug where, when "prologues:=3;", the lists of the
+ DocumentResources/DocumentSuppliedResources could appear in the eps
+ output partially uncommented.
+
+* Troff labels were completely broken in all MPlib-based versions.
+
+Other changes:
+
+* Many, many improvements to the manual and the tutorial. Sorry
+ Stephan, I don't know enough to list them all!
+
+* The old executable build system has been replaced by the new build
+ system from the TeXLive 2009 repository.
+
+* The MetaPost (and mplib) source code is now released under LGPL
+ instead of GPL, and uses a derivative of PyAvl instead of GNU libavl.
+
+* The web2c 'mktexfmt' feature is enabled for the program "mpost" once
+ again.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.102:
+----------------------------------------------------------------------
+
+* Printing of 8-bit string characters has been fixed.
+
+* In previous versions, TFM files and PFB fonts would not be read
+ properly on big-endian machines (e.g. powerpc)
+
+* The MetaPost distribution now contains "A Beginner's Guide to
+ MetaPost for Creating High-Quality Graphics" by Troy Henderson
+ and Stephan Hennig. This tutorial replaces Hobby's mpintro.tex.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.101:
+----------------------------------------------------------------------
+
+This is just a bugfix release. The following bugs / problem areas in
+MetaPost 1.100 have been fixed / improved:
+
+* TFM file generation was completely broken.
+
+* The job name discovery on the commandline has been improved.
+
+* Under some (rare) conditions MetaPost forgot to create a log file.
+
+* Labels containing char0 were exported to PostScript incorrectly.
+
+* On Windows, the DVI file that is the result from the internal call
+ to TeX for btex .. etex lables was not deleted automatically.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.100:
+----------------------------------------------------------------------
+
+CHANGES compared to the previous release, 1.005:
+
+* This version is based on MPlib, the C conversion of MetaPost.
+
+ The one user-visible change is that the btex ... etex
+ label conversion is now handled internally instead of via
+ the external "mpware" programs. These programs are therefore
+ no longer distributed.
+
+* There is a new manual, mplibapi.pdf, that describes the internal
+ interface to MPlib.
+
+* The file 'mpintro' is no longer distributed because it is
+ obsolete (it has been that way for some time).
+
+* The distribution now includes Dan Luecking's mpsproof.tex.
+
+
+CHANGES compared to the previous beta, 1.091:
+
+* The DVI -> mpx converter was bugged when virtual fonts were used.
+
+* MP could crash when a string was added to the string pool that
+ was too large to fit.
+
+* The string pool compaction routine was called much too often, thus
+ preventing unnecessary slowdowns.
+
+* Various problems with uninitialized option settings and missing mem
+ files or pfb files have been fixed.
+
+* There was a line buffer overrun possible in the file reader.
+
+* mpost now honours --recorder and --file-line-error.
+
+* MP now accepts file names with paths (separator is /) and with
+ embedded spaces (using " for quoting)
+
+* There could be empty lines in the PS output.
+
+* Full 8-bit fonts (i.e. font using character slot 255) could create
+ an eternal loop.
+
+* The handling of equations with addition or substractions between two
+ unknowns in the right hand side was wrong.
+
+* The first line of the PS font encoding output could be broken
+ inbetween a glyph name and its preceding slash.
+
+* Font inclusion in the PS backend would fail for all fonts that had
+ glyph ids using the 8th bit.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost beta version 1.091:
+----------------------------------------------------------------------
+
+* Dash lists were interfaced incorrectly by the lua bindings.
+
+* The Type 1 Font inclusion in the previous version produced invalid
+ subsets.
+
+* The configure script now also checks for sys/time.h
+
+* The error message you get for invalid mem files now mentions the
+ name of the file as well as the nature of the problem.
+
+----------------------------------------------------------------------
+What is new in MetaPost beta version 1.090:
+----------------------------------------------------------------------
+
+This MetaPost release is based on MPlib. For those of you who are not
+aware of the MPlib project yet:
+
+MPlib is the name of the new, revamped version of the MetaPost
+interpreter. It is implemented in Cweb, and internally consists
+of a core library, an mpx generation library, and a frontend
+driver program (mpost).
+
+There are no changes to the MetaPost language, but nevertheless there
+are some minor differences with the last pascal-web based version of
+MetaPost (1.005):
+
+* The MPlib distribution is released under the GPL version 2 or,
+ at your option, any later version.
+
+* The commandline is slightly different, run mpost --help for details.
+
+* The mem file format is changed, you have to regenerate any
+ existing ones.
+
+* The new mpx generation library includes the label generation
+ functionality that was previously provided by 'makempx', and
+ this internal code will be used instead of an external program.
+ That is, unless the MPXCOMMAND variable is set in the environment
+ or texmf.cnf. The 'mpware' programs became obsolete and are no
+ longer included in the distribution.
+
+* Most of the memory configuration variables from texmf.cnf
+ have become obsolete due to dynamic reallocation. The four remaining
+ ones are 'main_memory', 'hash_size', 'max_in_open', 'param_size'.
+ These are only taken into account at mem generation time, the
+ values are stored in and reloaded from the mem file.
+
+* The core MPlib library does not interpret an initial '&' as anything
+ special and it does not support re-initialization using a different
+ mem file either. The command line program mpost _does_ interpret '&'
+ as an alias for the -mem switch to preserve (some) compatility.
+
+* The MPlib distribution includes lua script language bindings.
+
+Following are the NEWS items for the previous beta releases of MPlib.
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.090:
+----------------------------------------------------------------------
+
+* The lua bindings to MPlib are added to the distribution, and
+ build.sh can now build an mplib.so loadable module for lua
+ (this needs an installed lua 5.1 distribution)
+
+* Some internal macros are renamed so that the exported C structure
+ fields could have better names, and a new document (mplibapi.tex)
+ provides the documentation of the C api and Lua bindings.
+
+* The texmf and manual trees are now included again.
+
+* (un)dumping mem files is delegated to a separate cweb source file.
+
+* All gcc-isms in the build and configure scripts have been removed.
+
+* The kpathsea library is updated.
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.085:
+----------------------------------------------------------------------
+
+* Determination of the mem name to use in non-ini mode is now much
+ closer to the web2c approach.
+
+* There is now a magic word in the beginning of the mem file to make
+ sure it is written by the correct version of MPlib.
+
+* Fixed the disappearing comment sign in the to-be-typeset document
+ created by the mpx generation subsystem.
+
+* Various identifiers have been renamed to avoid clashes (that prevented
+ the source from building correctly on many platforms)
+
+* A great many small changes and fixes have been added after running
+ splint on the generated C source.
+
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.080:
+----------------------------------------------------------------------
+
+* The MPlib distribution is released under the GPL version 2 or, at
+ your option, any later version. The copyright statements in the source
+ files have been updated to reflect this.
+
+* The mpost program banner now contains the kpathsea version, and no
+ longer mentions the fact that the source is now cweb at all.
+
+* The mpost program once again supports 'E' error responses.
+
+* There are some minor internal API changes, but there is still no
+ documentation for the API, so that is not very interesting yet.
+
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.060:
+----------------------------------------------------------------------
+
+* The MPlib distribution is released under the GPL version 2.
+
+* This release is the first that replaces the old metapost distribution
+ completely. The executable is now named 'mpost' with engine name
+ 'metapost'.
+
+* The release now includes a cweb implementation of the makempx
+ functionality that is linked into the mpost executable.
+ This internal code will be used unless the MPXCOMMAND variable is set.
+ Because of this functionality, the mpware directory is no longer
+ included and the standalone programs 'makempx', 'newer', 'mpto',
+ 'dvitomp' and 'dmp'. are no longer maintained.
+
+* This is the first development release of the new cycle, and contains
+ all of the functionality of Metapost 1.005. The mpost version is now
+ 1.060, and the special version number for the cweb version has been
+ removed from the banner.
+
+----------------------------------------------------------------------
+What is new in the alpha release of MPlib (0.20.0):
+----------------------------------------------------------------------
+
+* Two bugs in MP 1.002 were fixed by Giuseppe Bilotta, both fixes
+ are about polygonals pens and will be included in the upcoming
+ MP 1.003 release also.
+
+* It is now possible to ask for the envelope of a path drawn as
+ traced by a (non-elliptical) pen:
+
+ path p,q;
+ p = fullcircle scaled 30;
+ q = envelope pensquare of p;
+
+* There is a lua interface now, and it is already used by luatex.
+
+ To play with this, currently the best solution is to fetch the
+ 0.25.0 beta of luatex: http://foundry.supelec.fr/projects/luatex
+ This embeds MPlib 0.25.0 as well as its documentation.
+
+* Many bugs were fixed.
+
+----------------------------------------------------------------------
+What is new in the alpha release of MPlib (0.10.0):
+----------------------------------------------------------------------
+
+* The source is converted to cweb, and split into a library part
+ (mpdir/lib/*.w) and a frontend executable (mpdir/mpost.w).
+
+* The front end executable is named "newmpost", this takes
+ care of configuring the MPlib library via C code, and uses
+ kpathsea for file searching. There is no change file involved,
+ and the web2c runtime library is not used.
+
+* Some of the internal arrays now grow dynamically when needed:
+
+ * the input buffer
+ * the string pool and number of strings
+ * the font memory and number of fonts
+ * the number of "readfrom" and "write" files
+ * the path segment size
+ * the input nesting stack
+ * the number of new internals
+ * the TFM writing arrays (but these are limited by TFM format)
+
+ Still not doing that (so these can only be changed in --ini mode):
+
+ * the main memory
+ * the hash size
+ * the number of simultaneous macro parameters
+ * the level of "input" file nesting
+
+* The following command-line options are ignored by the front-end
+ command (for now):
+
+ -[no-]file-line-error
+ -halt-on-error
+ -output-directory=
+ -[no-]parse-first-line
+ -recorder
+ -translate-file=
+ -8bit
+ -T
+
+ The other web2c command-line options should work as normal.
+
+* the mpware tools are not in this distribution, their functionality
+ will eventually be assimilated into the frontend application.
+
+* the build process depends on a local "ctangle" command being in the
+ path, for now. The confiration and building system is not yet complete.
+
+* API documentation is still missing, but the MetaPost input language
+ has not changed.
+
+
+----------------------------------------------------------------------
+What is new in version 1.005:
+----------------------------------------------------------------------
+
+* In MetaPost 1.004, mpost --version still incorrectly reported 1.003
+
+* C Compilation of MetaPost 1.004 was broken on MacOS X 10.5
+
+* The sources package did not contain mpboxes.pdf
+
+* Some last-minute fixes to the manual
+
+
+----------------------------------------------------------------------
+What is new in version 1.004:
+----------------------------------------------------------------------
+
+* The picture color component commands misbehaved in 1.003:
+ the current (default) colormodel was not taken into consideration,
+ so all colors had to be explicit for "redpart" etc. to work.
+ (this bug is the one broke the graph.mp package)
+
+ In 1.004 for "defaulted" colors, the suitable value in the current
+ (default) colormodel is returned without any errors. This change
+ also reverts to silently defaulting a 'black' color when asking
+ for the redpart etc. of an object that cannot be colored at all.
+
+* The picture color component commands misbehaved in 1.003 in
+ a different manner also: the defaults for uninitialized CMYK
+ color picture parts were still assuming 'black' was defined as
+ (1,1,1,1) instead of as (0,0,0,1).
+
+* The macro Gwithpc_ in the graph.mp package did not work properly
+ with non-rgb colormodel objects.
+
+* plain.mp has a new macro, 'colorpart', that returns the color
+ parts of a graphical object within a picture in a form suitable
+ for feeding it back to 'withcolor'.
+
+* The latest kpathsea library from TeXLive is included.
+
+* There is now a separate manual for the boxes package (mpboxes.pdf).
+
+
+----------------------------------------------------------------------
+What is new in version 1.003:
+----------------------------------------------------------------------
+
+* Polygonal pens now work better (bug #3 and #7 at supelec.fr).
+
+* When asking for a color part in a picture object, the color models
+ now have to match each other, otherwise an error will be reported
+ and the return value will be set to a 'black' part.
+
+* The Makefile fragment (metapost.mk) now defines a separate mpost
+ target for better integration in TeXLive.
+
+* There was a bug in the internal handling of withprescript and
+ withpostscript, resulting in incorrect output when paths using
+ such scripts were stored in picture variables.
+
+* A newline was missing from the PostScript output when the
+ procset internal variable was set, so the first line of that
+ accidentally became a PostScript comment.
+
+* Applicable changes from Knuth's updates for MetaFont 2.718281
+ are incorporated.
+
+* Mpto did not play nice with %&<format> verbatimtex lines, it now
+ automatically tries to detect comment-lines.
+
+* Dvitomp 1.003 has higher limits for some internal constants like
+ the number of allowed fonts in DVI files.
+
+* The manual is improved.
+
+
+
+----------------------------------------------------------------------
+What is new in version 1.002:
+----------------------------------------------------------------------
+
+* Version 1.001 introduced a memory allocation error in mpto that could
+ result in the program looping endlessly
+
+----------------------------------------------------------------------
+What is new in version 1.001:
+----------------------------------------------------------------------
+
+* The default cmyk 'black' color now uses only black, not all four
+ ink colors (after a discussion on the mailing list).
+
+* Some issues were reported with the new turningnumber algorithm,
+ all known problems are now fixed.
+
+* Gábor Braun discovered that mpost did not always download the font
+ encodings into all the created output files.
+
+* Akira Kakuto and Hartmut Henkel found some small issues in mpto
+ regarding trailing and leading whitespace.
+
+* A fix for the 'Helvetica' entries in trfonts.map was provided by
+ Werner Lemberg, and Michail Vidiassov supplied two extra font
+ entries for troff.map (Symbol and ZapfDingbats). Karl Berry
+ provided the new file troff-updmap.map, to be used by the updmap
+ tool in texlive.
+
+* Mpost now supports web2c's --output-directory option.
+
+* Any warnings about missing fonts and characters are now always
+ written to the terminal as well as to the log.
+
+* Now that makempx is a C program, it needed a different install line
+ in build.sh. Also, Olaf Mersmann contributed a patch to recognize
+ 'gmake' in build.sh
+
+* Luigi Scarso found some typing errors in the web source that prevented
+ clean weaving of the source.
+
+* Stephan Hennig fixed a number of problems in the manual (mpman.tex)
+ and the introduction paper (mpintro.tex). He also wrote new sections on
+ how to preview metapost graphics and on how to use metapost graphics
+ inside other documents. On top of that, the manual is now hypertext-aware,
+ and fixes for a whole series of small problems have been applied.
+
+----------------------------------------------------------------------
+What is new in version 1.000:
+----------------------------------------------------------------------
+
+* The use of DSC (document structuring) comments has been
+ been cleaned up, thanks to comments by Michail Vidiassov.
+
+* By setting prologues to 2 or 3, you can ask MetaPost to
+ reencode and include the used labels fonts in the output,
+ thus creating proper Encapsulated PostScript files even
+ if labels are present.
+
+* Support for greyscale and cmykcolor models is added.
+
+* The new drawing options "withprescript" and withpostscript"
+ allow the user to attach PostSCript special text to a specific
+ drawing object.
+
+* Setting the new internal "mpprocset" to 1 will make MetaPost
+ create a somewhat extended preamble that defines shortcuts
+ for the postscript commands (e..g "l" instead of "lineto").
+ For big images, this can help shrink the output a bit.
+
+* The pool file is now integrated in the executable, so there
+ is not separate 'mp.pool' anymore, except at build time.
+
+* Groff support is redone, and dmp now uses kpathsea searching.
+ Groff related changes are thanks to the efforts of Werner
+ Lemberg and Michail Vidiassov
+
+* makempx is now a compiled executable on all systems,
+ thank you Akira Kakuto
+
+* The error for 'special's longer then 255 characters
+ is removed, so specials can now be of any length.
+
+* There is new turningnumber implementation that attempts
+ to find the mathematically correct "turningnumber" of a
+ path. The formulae are derived from a mailinglist discussion
+ between (especially) Dan Luecking and Giuseppe Bilotta.
+
+* The manual is updated and modernized. It is currently
+ maintained by Stephan Hennig and Troy Henderson.
+
+------------------------------------------------------------------
+Changes in version 0.920:
+----------------------------------------------------------------------
+
+* Fixed a long-standing bug in web2c where changing values of the
+ memory_size setting in web2c could cause crashes and other random
+ problems. The memory array size is now written to the dump file
+ and loading is aborted if the values do not match.
+* Implement configurable figure output filename templates.
+* Implement cmyk, greyscale, and marking only color models.
+* The mpost executable is now version 0.920
+* mpost no longer autoconverts r==g==b colors to grayscale in the
+ postscript output.
+
+----------------------------------------------------------------------
+Changes in version 0.902:
+----------------------------------------------------------------------
+* Fix a bug in mpto resulting in correctly placed labels (with
+ thanks to Dan Luecking)
+* Fix a bug blocking compilation of dmp on MacOSX
+* The mpost,dmp,mpto executables are now version 0.902
+
+
+----------------------------------------------------------------------
+Changes in version 0.901:
+----------------------------------------------------------------------
+* A corrected bugfix for bug item 3 from version 0.9 (the old fix
+ made metapost fail the trap test)
+* Included mpost.mp for mem generation
+* Updated the trap test output.
+* The mpost executable is now version 0.901
+
+----------------------------------------------------------------------
+What is new in version 0.9:
+----------------------------------------------------------------------
+1. There is a new internal quantity called mpversion that reports the
+ current metapost version, and the version information is also written
+ to the PostScript file.
+2. The LaTeX sources of the mpman, mpintro, and mpgraph manuals have
+ become part of the distribution package.
+3. TEX.mp now has TeX format support through a pair of macros called
+ TEXPRE() and TEXPOST(). This llows you to process the contents of
+ the TEX() macro with, for example, LaTeX (instead of plain TeX).
+ An example is given in the manual.
+4. metapost now writes a %%HiReSBoundingBox comment
+5. The EPS output no longer contains actual spaces within PostScript
+ strings as for example output by label("a space"), but their
+ octal escape (\040) instead.
+6. The EPS output now also has a %%BeginProlog DSC comment
+ as well as %%EndProlog
+7. The comments in the Web source have been changed to point out
+ that on modern machines, acquiring the random seed has actually
+ become a system-dependant operation (a granularity of whole seconds
+ is not small enough on new machines).
+8. The 'newer' command now accepts more than 2 arguments, testing
+ each of the files in turn.
+
+----------------------------------------------------------------------
+Bugfixes in version 0.9:
+----------------------------------------------------------------------
+1. Documentation improvements: all known errata and typos have been
+ removed, better explanations of e.g. dash patterns and dotlabel have
+ been provided, and a number of omissions has been rectified.
+2. The BoundingBox was not computed correctly when a filldraw command
+ with a noticeable pen size was used at the edge of the picture.
+3. Paths starting with degenerate constructions like (0,0)--(0,0)--(0,0)
+ could overflow memory.
+4. The PostScript output could accidentally contain 8-bit characters
+ within PostScript strings in previous versions because a test was
+ shared between terminal printing and PostScript printing.
+5. A bug has been found in the assignment of serial numbers to independant
+ variables in metafont 2.71828. This bug affected MP as well, and the
+ same patch has been applied.
+6. The turningnumber was sometimes wrong in unexpected ways. The new
+ implementation is still sometimes wrong (when there are strange path
+ segments involved), but in a much more predictable way: the new code
+ always draws straight lines between the actual points, and calculates
+ the turningnumber based on that path instead of the actual path. The
+ effect is that cusps and loops within segments are now completely
+ ignored. A more thorough fix of turningnumber is planned for the
+ next release.
+7. There was an 'off by one' error in dvitomp wrt. the interpretation
+ of virtual fonts.
+8. mpto uses a new TeX macro for the generation of labels, making it
+ more robust wrt. strange user code within the actual label text.
+9. A missing colon in boxes.mp has been added
+10. A missing save in mfplain.mp has been added
+11. The generisize in boxes.mp has been fixed so that it now accepts [[ as
+ a valid variable name
+
+----------------------------------------------------------------------
+Version 0.641:
+----------------------------------------------------------------------
+The only change was to fix the code for transforming a picture that
+contains a filldraw. Version 0.64 introduced a bug that caused an
+inappropriate memory reference in that case.
+
+----------------------------------------------------------------------
+What is new in Version 0.64:
+----------------------------------------------------------------------
+1. A new primitive command closefrom filename closes a readfrom file
+ so that subsequent calls to readfrom with that file name will go back
+ to the beginning of the file.
+2. The ^^ notation for unprintable characters is now used only when printing
+ on the terminal or the log file. Internal computations and the write
+ command are all 8-bit clean. (This is partly due to material in mp.ch
+ that changes the initialization of the xchr array. Without these
+ system-dependent changes, the write command would map all non-ascii
+ characters to spaces.)
+3. Arithmetic overflow during a comparison such as 20000>-20000 is now
+ ignored. This avoids extraneous error message when using the graph.mp
+ macro package.
+4. Transformations with negative determinants now work properly on pictures
+ drawn with polygonal pens.
+5. When the readfrom operator is applied to a file that does not exist,
+ an attempt to close a non-open file could cause problems in some
+ implementations. This has now been fixed.
+6. Using draw picture_expression withpen where the picture_expression
+ was a scaled picture containing dashed lines, the dash lengths would
+ change. This bug has been fixed.
+7. The dashpart operator could return an invalid picture or a picture that
+ is not properly scaled. This has also been fixed.
+8. The |char_base| variable could become negative when using fonts that
+ do not start at character 0. There was also bad Pascal code in function
+ b_open_in. This has all been fixed.
+9. Dvitomp has been fixed to avoid a font data structure problem that
+ could cause some characters to come out in the wrong font when you
+ mix virtual and non-virtual fonts.
+10. Dvitomp now correctly prints font names when there is a checksum
+ mismatch, and it aborts instead of just printing an error if a tfm
+ or vf file is bad.
+11. In plain.mp, the drawdblarrow macro now uses filldraw so that it works
+ better with large pen sizes.
+
+----------------------------------------------------------------------
+Version 0.632:
+----------------------------------------------------------------------
+When prologues is negative, the output files use full precision for
+coordinates in "%%BoundingBox" comments. In btex..etex blocks,
+"number too large" and "invalid character" errors are suppressed.
+The result of btex..etex is now guaranteed to be in a setbounds path
+so that a for...within iteration will always treat it as a unit.
+
+There are also some obscure bug fixes involving string compaction when
+scanning a file name or when mp is compiled in debug mode. Some possible
+identifier name conflicts and range check errors have also been fixed.
+
+
+----------------------------------------------------------------------
+Version 0.631:
+----------------------------------------------------------------------
+This version fixes an obscure bug that could cause certain perfectly valid
+strings to be printed as "???" or " NONEXISTENT". It also includes a minor
+fix to the PATHEXPAND code that prevents running out of file descriptors.
+
+
+----------------------------------------------------------------------
+What is new in Version 0.63:
+----------------------------------------------------------------------
+1. Backslashes in the PostScript output are rendered correctly. They used
+ to come out as (\) instead of (\\).
+2. Recycling an independent variable should no longer cause spurious overflows.
+ (This bug was recently found in mf.web.)
+3. Pythagorean addition should now be faster in certain trivial cases.
+4. Rotating text by arbitrary angles should no longer cause bad PostScript
+ output. The problem was that arguments to "fshow" could be inaccurate.
+5. Obscure bugs inherited from mf.web are now fixed. These involve
+ balancing parentheses showing on the terminal, reporting the correct
+ line number in case of buffer overflow, and removing spurious reference
+ counts that could effect end-of-job statistics.
+6. Fonts with ec=255 should no longer cause mp's PostScript output routines
+ to go into a loop.
+7. When mp's string mechanism was heavily used, file names could occaisonally
+ be printed on the terminal and log file as "(?)". This has been fixed.
+8. Setting PATHEXPAND in site.h causes mp, dvitomp and dmp to understand "//"
+ in path variables as "search multiple levels of subdirectories". This is
+ for compatibility with recent versions of the Web2c TeX distribution.
+9. A typo in mpware/makempx and mpware/troffmpx has been fixed. Previous
+ versions of these scripts would not run on some systems.
+10. Data files *.d have been added to the doc directory. These are used by
+ doc/mpgraph.mp which generates figures for "Drawing Graphs with MetaPost".
+11. Typos in mpintro.tex and mp.web's TeX material have been fixed.
+12. Files examples.mp, mpintro.tex and mpintro.bib have moved from mplib to
+ the doc directory.
+13. The author's email address now appears in the README file.
+
+
+----------------------------------------------------------------------
+Macros added to the mplib directory between Versions 0.50 and 0.62:
+----------------------------------------------------------------------
+rboxes.mp is a slightly more general version of boxes.mp
+TEX.mp provides a way of running tex dynamically instead of as a pre-processor
+graph.mp, format.mp, and sarith.mp are documented in doc/mpgraph.ps
+(This is the same as ftp://netlib.att.com/netlib/att/cs/cstr/164.ps.Z)
+marith.mp, string.mp, texnum.mp, and troffnum.mp are low-level packages
+used by graph.mp, format.mp, and sarith.mp.
+
+
+----------------------------------------------------------------------
+Other minor bug fixes subsequent to Version 0.60
+----------------------------------------------------------------------
+1. plain.mp has been fixed so that the x**y works properly when x<0 and y is
+ a negative integer.
+2. Programs mptotex.c and mptotr.c which extract btex..etex material have been
+ fixed so they work properly with input files that do not end with a newline
+ character.
+3. Program dmp.c which handles troff output from btex..etex blocks has been
+ modified to avoid outputting any non-ASCII characters that the C function
+ isprint() accepts.
+4. Program dmp.c no longer gets troff graphics specials confused with text.
+ This seldom matters because btex..etex blocks are unlikely to contain
+ troff graphics.
+5. Pictures containing clipped subpictures could come out with some colors
+ in the subpicture wrong.
+6. Colors in PostSript output were not being restricted to the standard 0..1
+ range.
+7. Transforming a path or a pen should no longer generate extraneous overflow
+ errors in certain unusual situations.
+8. Drawing with a degenerate 2-vertex polygonal pen such as penrazor should
+ no longer cause an infinite loop in certain unusual situations.
+9. There were some bugs in the mfplain macros. (These macros are designed
+ to similate plain METAFONT.) The drawing and filling macros now apply
+ currenttransform to the path but not the pen rather than vice versa.
+ The predefined modes now set o_correction to 1.0.
+10. For security reasons, mp can no longer read or write files whose names
+ begin with '.'
+
+
+----------------------------------------------------------------------
+Changes to the MetaPost language between Version 0.50 and Version 0.60
+----------------------------------------------------------------------
+1. New operator `readfrom <filename>' and new command
+ `write <string expression> to <filename>' do file I/O. Plain defines
+ a special string EOF that readfrom returns to indicate end-of-file
+ and write..to understands as well.
+2. New iteration type `for p within <picture expression>: <loop text> endfor'
+ iterates through the interior components of the picture. An `interior
+ component' is a single pen stroke, filled outline, or piece of typeset
+ text. A part of the picture enclosed in a clipping or setbounds path
+ also counts as an interior component. If the whole picture is enclosed
+ in such a path, the for..within iteration looks inside. Note that a
+ picture generated by btex..etex is enclosed in a setbounds path.
+3. The length operator now applies to pictures. It returns the number of
+ interior components.
+4. New boolean operators stroked, filled, textual, clipped, bounded test
+ the first component of a picture. A picture enclosed in a clipping or
+ setbounds path counts as a single component.
+5. Part extraction operators now work for pictures. Standard operators
+ redpart, greenpart, bluepart apply to the color of the first component
+ and xpart, ypart, xxpart, xypart, yxpart, yypart extract parts of the
+ tranformation that has been applied to a text component. If `textual p'
+ is false, the transform components are all zero; if `clipped p' or
+ `bounded p' is true, the color parts are all zero. Additional operators
+ fontpart, textpart, pathpart, penpart, dashpart extract other information
+ from the first component of a picture. They all return null values when
+ the first component has the wrong type: fontpart and textpart return
+ null strings; pathpart returns the path (0,0); penpart returns nullpen;
+ and dashpart returns nullpicture.
+6. The construction `dashed nullpicture' is now a no-op. It used to be
+ an error.
+7. The clip and setbounds statements used to ignore operations on empty
+ pictures. Now they do not.
+8. Structuring comments in the PostScript output are now based on EPSF-3.0
+ as described in the 2nd Edition of the PostScript Reference Manual.
+ When prologues is 0, some structuring comments are included but the
+ output is not flagged a `conforming document'. Previous versions of
+ MetaPost behaved similarly but used slightly different structuring
+ comments.
+9. When warningcheck is 0, numeric tokens and results from the hex and
+ oct operators can be as large as 32767.99998. The old limit of about
+ 4096 applies only when warningcheck is positive.
+10. Various optimizations should make the output a little more compact.
+11. For PostScript engines that obey the scan-conversion rules documented
+ in the 2nd edition PostScript Language Reference Manual, hrules and
+ vrules in btex..etex blocks should now come out to exactly the right
+ number of pixels. The change affects all pen strokes drawn in MetaPost
+ It is implemented via PostScripts dtransform and idtransform operators.
+12. A bug involving setbounds and MetaPost's corner operators has been fixed.
+13. Degenerate elliptical pens no longer cause PostScript to divide by zero.
+14. Fixed a very obscure bug involving readstring and end-of-file.
+15. String compaction statistics are now printed correctly when the job
+ terminates with tracingstats positive.
+
+
+
+----------------------------------------------------------------------
+Changes to the source files between Version 0.50 and Version 0.60
+----------------------------------------------------------------------
+
+CHANGES to ./README.MP
+The installation instructions should now be clearer. They also explain
+how to cope with verious versions of WEB2C.
+
+CHANGES to ./site.h
+I removed unused entries and clarified instructions in commentary material.
+Confusing comments about possibly merging it with the WEB2C version of site.h
+were removed--I think such merging is a bad idea.
+
+CHANGES TO ./Makefile, mp/Makefile, mpware/Makefile:
+Improved default settings, simplified the `install' recipe,
+fixed a few missing depencies, portability problems, etc.
+
+RENAMED FILES
+ mp/mp.defines, mpware/mpware.defines, mpware/dvitompext.c
+TO mp/mp.def, mpware/mpware.def, mpware/dvimpext.c
+(The names also changed in the Makefiles and convert scripts)
+
+CHANGES TO mp/mp.web, mp/mp.ch, mp/mp.def, mp/mpext.c:
+Lots of new features were added as noted above. The only new system-
+dependencies are for `readfrom' and `write...to'.
+The change file now increases max_read_files; it doesn't bother with
+max_write_files, but perhaps it should. There is a new change entitled
+"Path selector for..readfrom file". From the web2C sources I borrowed
+a change "`logname' is declared in <unistd.h> in some systems". I also
+added a PASCAL-like eof() routine to mpext, removed a change entitled
+"avoid using eof() in read_psname_table" and added a new change
+"[48.1199] `eof'...[in read_mem_file]".
+
+Reorganization of math routines in the mp directory:
+I moved the floating-point math routines from mpext.c to mpath.c. A
+C-language version of the standard math routines was moved from mpmath.c
+to a new file pmath.c for use in mathtest only. This required chages to
+mathtest.c and time.c (also used only for mathtest). The point of all
+this is that there is now just one copy of the floating-point math routines
+and it is used for mathtest and (optionally) for mp itself.
+
+Routines in doc and mp/trapdir:
+The output was updated to Version 0.60. Another test file mptrap.mp
+tests new features. There have also been minor updates to the manual,
+although the new features for Version 0.60 are not included yet.
+
+CHANGES to macros in mplib:
+A minor change to boxes.mp should make it more robust. Changed default
+setting of tracinglostchars in mfplain.mp and plain.mp. Added a string
+constant EOF to plain.mp for use with readfrom and write..to.
+Changed mproof.tex to make it more portable as suggested by Knuth.
+
+CHANGES to mpware/dvitomp.web, mpware/dvitomp.ch:
+The web file was changed to output rules as horizontal or vertical
+penstrokes with butt endcaps. This also affected dvitomp.ch. Also in
+dvitomp.ch, put terminal output on stdout instead of stderr and require
+the output file to be given on the command line.
+
+CHANGES to mpware/makempx, mpware/troffmpx:
+Added comments explaining what path names need fixing. Portability improvements
+and dvitomp's output change affect makempx only.
+
+CHANGES to mpware/mptotex.c mpware/mptotr.c mpware/testex.err mpware/testex.mp:
+Ignore an initial newline in the TeX (or troff) material to avoid generating
+a blank line in the output file. The test file now covers this case.
+
+CHANGE to mpware/newer.c
+Minor changes to make it compile in strict ANSI/POSIX environments.
diff --git a/graphics/metapost/contrib/macros/featpost/doc/otherinfo/Zpravodaj2009-4.pdf b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/Zpravodaj2009-4.pdf
new file mode 100644
index 0000000000..148708f1e4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/Zpravodaj2009-4.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/otherinfo/jdbug.png b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/jdbug.png
new file mode 100644
index 0000000000..a1dbfe412a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/jdbug.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/doc/otherinfo/tb88henderson.pdf b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/tb88henderson.pdf
new file mode 100644
index 0000000000..e012ed259e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/doc/otherinfo/tb88henderson.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/example/38.mp b/graphics/metapost/contrib/macros/featpost/example/38.mp
new file mode 100644
index 0000000000..c4501db2c7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/38.mp
@@ -0,0 +1,54 @@
+% 38.mp
+% J. Dinis
+% 2004
+
+def rp(expr p, r)=
+ (p + (r * (.5+uniformdeviate 0.5),0) rotated (uniformdeviate 360))
+enddef;
+
+vardef eight(expr r) =
+ save a;
+ pair a;
+ a = rp(origin, r);
+ (a{dir 15}
+ .. rp((0.6,0.5),r){up}
+ .. rp((0,1),r){left}
+ .. rp((-0.6,0.5),r){down}
+ .. rp(origin,r){dir -15}
+ .. rp((0.6,-0.6),r){down}
+ .. rp((0,-1.2),r){left}
+ .. rp((-0.6,-0.6),r){up}
+ .. a{dir 15})
+enddef;
+
+vardef three(expr r) =
+ save a;
+ path a;
+ a = eight(r);
+ ((reverse (subpath (0,2.35) of a)) -- (subpath (4,6.5) of a))
+enddef;
+
+def scaledto(expr p, wd)=
+ p shifted (-center p) scaled (wd / (xpart (urcorner p - llcorner p)))
+ shifted (105mm,148.5mm)
+enddef;
+
+
+beginfig(1);
+ color c;
+ numeric n,e;
+ pickup pencircle scaled 1pt;
+ n := 33;
+ for i=n step -2 until 0:
+ e := 1 / (i+1);
+ pickup pencircle scaled (e * pt);
+ for j=1 upto (i+1):
+ c := (i/n)[.75blue,white];
+ draw eight(i/n) scaled 100 shifted (140,0) withcolor c;
+ draw three(i/n) scaled 100 shifted (0,0) withcolor c;
+ endfor;
+ endfor;
+ currentpicture := scaledto(currentpicture, 24cm);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/A131.mp b/graphics/metapost/contrib/macros/featpost/example/A131.mp
new file mode 100644
index 0000000000..fd803cc472
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/A131.mp
@@ -0,0 +1,222 @@
+% A131.mp
+% P. J. Sebastiao
+% 2012
+
+input featpost3Dplus2D;
+
+prologues:=3;
+
+verbatimtex
+ \documentclass{article}
+ \usepackage{amsmath,amssymb}
+ \begin{document}
+etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc,ngorig, ngorigb;
+ color field, nalfa, ngamma[], alfacnt, gammacnt, nazy, nax,nalfaz, alfacntb, gammacntb,ngammab[],nazyb, naxb;
+ path alfa, gamma, alfab, gammab;
+ numeric nalfad, theta, radius, gradius, gammang, xxsize, yysize, zzsize, thetb, radiusb;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos;
+ numeric thetarad, thetapos, nalfapos, ngammapos,veccpos;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, deltalabel, xxcalabel,yycalabel, phimlabel, phiMlabel;
+ picture nalfalabel, ngammalabel, etalphalabel, alphalabel;
+ picture gammalabel, thetalabel,vecclabel, thetalabelb, corelabel;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%ShiftV := origin;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize := 0.8;
+ xxpos := 6;
+ yysize := 0.8;
+ yypos := 6;
+ zzsize := 1.3;
+ zzpos := 4;
+ field := (0.56,0.3,0.5);
+ fieldpos := 2;
+ deltarad := 0.45;
+ deltapos := 3;
+ nalfad := 0.8;
+ theta := 25;
+ thetb := 18;
+ thetarad := 0.3;
+ thetapos := 2;
+ nalfapos := 7;
+ gammang := -20;
+ ngammapos := 4;
+ etalpharad := 0.4;
+ etalphapos := 4;
+ alphapos := 6;
+ gammapos := 6;
+ veccpos := 3;
+
+ xxcalabel = btex $x_{\mbox{\protect \scriptsize layer}}$ etex;
+ yycalabel = btex $y_{\mbox{\protect \scriptsize layer}}$ etex;
+ xxlabel = btex $x_{\mbox{\protect \scriptsize} M}$ etex;
+ yylabel = btex $y_{\mbox{\protect \scriptsize M}}$ etex;
+ zzlabel = btex $z_{\mbox{\protect \scriptsize M}}$ etex;
+ corelabel = btex $\mbox{core}$ etex;
+ deltalabel = btex $\beta$ etex;
+ fieldlabel = btex $\mathbf{n}$ etex;
+ thetalabel = btex $\theta_1$ etex;
+ thetalabelb = btex $\theta_2$ etex;
+ nalfalabel = btex $\mathbf{n}_\alpha$ etex;
+ ngammalabel = btex $\mathbf{ch}$ etex;
+ etalphalabel= btex $\eta_\alpha$ etex;
+ alphalabel = btex $\alpha$ etex;
+ phimlabel = btex $-\phi_{\mbox{\protect \scriptsize 0}}/2$ etex;
+ phiMlabel = btex $\phi_{\mbox{\protect \scriptsize 0}}/2$ etex;
+ gammalabel = btex $\gamma$ etex;
+ vecclabel = btex $\mathbf{c}$ etex;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (-nalfad*sind(theta)*cosd(90),nalfad*sind(theta)*sind(90),nalfad*cosd(theta));
+ nalfaz = (-nalfad*sind(thetb)*cosd(90),nalfad*sind(thetb)*sind(90),-nalfad*cosd(thetb));
+ alfacnt = (0,0,nalfad*cosd(theta));
+ alfacntb = (0,0,-nalfad*cosd(thetb));
+ radius = nalfad*sind(theta);
+ radiusb = nalfad*sind(thetb);
+ gradius = 0.5*radius;
+ alfa = rigorouscircle( alfacnt, (0,0,1), radius );
+ alfab = rigorouscircle( alfacntb, (0,0,1), radiusb );
+ ngorig = orig+nalfa;
+ ngorigb = orig+nalfaz;
+ gammacnt = cosd(theta)*cosd(theta)*nalfa+0.75*nalfa;
+ gammacntb = cosd(theta)*cosd(theta)*nalfaz+0.75*nalfaz;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, gradius );
+ gammab = rigorouscircle( gammacntb, nalfaz, gradius );
+
+ pickup pencircle scaled 1;
+
+ for i=0 step 40 until 0:
+ nazy := gradius*sind(gammang+i)*ncrossprod( nalfa, axxc );
+ nax := gradius*cosd(gammang+i)*ncrossprod( ayyc, nalfa );
+ ngamma[i] := gammacnt+nax+nazy;
+ draw rp(ngorig)..rp(ngamma[i]);
+ nazyb := gradius*sind(gammang+i)*ncrossprod( nalfaz, axxc );
+ naxb := gradius*cosd(gammang+i)*ncrossprod( ayyc, nalfaz );
+ ngammab[i] := gammacntb+naxb+nazyb;
+ draw rp(ngorigb)..rp(ngammab[i]);
+ endfor;
+
+ pickup pencircle scaled 0.5;
+
+ draw alfa dashed evenly;
+ draw alfab dashed evenly;
+
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(-azzc)..rp(azzc);
+ drawarrow rp(orig)..rp(2*field);
+ pickup pencircle scaled 2;
+ draw rp(orig)..rp(nalfa);
+ draw rp(orig)..rp(nalfa);
+ draw rp(orig)..rp(nalfaz);
+ pickup pencircle scaled 0.5;
+ draw rp(nalfa)..rp(gammacnt) dashed evenly;
+ draw rp(nalfaz)..rp(gammacntb) dashed evenly;
+% draw subpath (3.05,1.05) of alfa;
+% drawarrow subpath (4,3) of alfa;
+% draw subpath (0,1.3) of gamma;
+% draw subpath (7.5,8) of gamma;
+% drawarrow subpath (1,2) of gamma;
+ anglinen( field, azzc, orig, deltarad, deltalabel, deltapos );
+ anglinen( azzc, nalfa, orig, thetarad*1.5, thetalabel, thetapos );
+ anglinen( nalfaz, -azzc, orig, thetarad*2, thetalabelb, thetapos );
+% anglinen( nalfa, nalfaz, orig, thetarad*1.25, btex $\Delta$ etex, 5 );
+% anglinen( ngamma0, field, orig, etalpharad, etalphalabel, etalphapos );
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+ labeln( corelabel, rp(orig+(0.2,-0.1,-0.2)), 1 );
+ labeln( fieldlabel, rp(2*field), fieldpos );
+% labeln( nalfalabel, rp(nalfa), nalfapos );
+ labeln( ngammalabel, rp(ngamma0), ngammapos );
+ labeln( ngammalabel, rp(ngammab0), 1 );
+ labeln( phiMlabel, point 1 of alfa, 7 );
+ labeln( phimlabel, point 4 of alfa, 5 );
+ labeln( phiMlabel, point 0.4 of alfab, 7 );
+ labeln( phimlabel, point 3.5 of alfab,4 );
+% labeln( gammalabel, point 8 of gamma, gammapos );
+% labeln( yycalabel, rp(gammacnt+1.3*radius*(-1,0,0)), 0);
+% labeln( xxcalabel, rp(gammacnt+1.3*radius*(0,1,-sind(theta))), 0);
+ pickup pencircle scaled 1.5;
+% draw rp(alfacnt);
+% draw rp(gammacnt);
+ pickup pencircle scaled 0.5;
+
+ path arco, recta_um, recta_dois, recta_xlayer, path_ngamma;
+ path arcob, recta_umb, recta_doisb ;
+ pickup pencircle scaled 0.5;
+ recta_um = rp(alfacnt)--rp(alfacnt+nalfad*1.4*radius*(1,0,0));
+ recta_dois = rp(alfacnt)--rp(alfacnt+nalfad*1.4*radius*(0,1,0));
+ draw recta_um;
+ draw recta_dois;
+ draw rp(nalfa)..rp((0,nalfad*sind(theta)*sind(90),-nalfad*cosd(thetb))) dashed evenly;
+
+ recta_umb = rp(alfacntb)--rp(alfacntb+nalfad*1.4*radius*(1,0,0));
+ recta_doisb = rp(alfacntb)--rp(alfacntb+nalfad*1.4*radius*(0,1,0));
+ draw recta_umb;
+ draw recta_doisb;
+
+ pickup pencircle scaled 1;
+ arco = (alfa cutbefore recta_dois) cutafter recta_um;
+ draw arco;
+ arcob = (alfab cutbefore recta_doisb) cutafter recta_umb;
+ draw arcob;
+
+
+ pickup pencircle scaled 0.5;
+ % drawarrow rp(gammacnt)--rp(gammacnt+1.3*radius*(-1,0,0));
+
+ path_ngamma = rp(gammacnt)--rp(ngamma0)--rp((0,0,0));
+% draw path_ngamma;
+%%% c vector
+ draw rp(gammacnt)--rp(ngamma0) dashed evenly;
+ draw rp(gammacntb)--rp(ngammab0) dashed evenly;
+
+ recta_xlayer = rp(gammacnt)--rp(gammacnt+1.3*radius*(0,1,-sind(theta)));
+% drawarrow recta_xlayer;
+
+ pickup pencircle scaled 0.5;
+
+ arco := (gamma cutbefore recta_xlayer) cutafter path_ngamma;
+ draw gamma dashed evenly;
+ draw gammab dashed evenly;
+ undraw arco;
+
+ pickup pencircle scaled 0.5;
+ draw gamma dashed evenly;
+
+% draw subpath (0,0.9) of gamma;
+% draw subpath (7.6,8) of gamma;
+% draw subpath (1.5,8) of gamma;
+ draw subpath (3.2,1.2) of alfa;
+% labeln( vecclabel, rp(ngamma0), veccpos);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ picture schemepic;
+ schemepic = currentpicture;
+ numeric initang, stampnum, stepang, stampoffset;
+ stampnum = 15;
+ stampoffset = 0.2mm;
+ initang = 180/stampnum;
+ stepang = 2*initang;
+ drawoptions();
+ for i=0 upto (stampnum-1):
+ draw schemepic
+ shifted (stampoffset*dir(initang+i*stepang))
+ withcolor (blue+green);
+ endfor;
+ draw schemepic;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/CAT.mp b/graphics/metapost/contrib/macros/featpost/example/CAT.mp
new file mode 100644
index 0000000000..2afe9da095
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/CAT.mp
@@ -0,0 +1,45 @@
+beginfig(1);
+ path pat[];
+ numeric i, a, sidel;
+ sidel = 2cm;
+ pickup pencircle scaled 3pt;
+ pair pa, pb, pc, pd;
+ for i=4 upto 10:
+ a := 360/i;
+ pa := origin+(i-4)*right*1.5*sidel;
+ pb := pa+right*sidel;
+ pd := pa+dir(a)*sidel;
+ pc := pb+dir(a)*sidel;
+ pat[i] = pa--pb--pc--pd--cycle;
+ endfor;
+ z0 = (0,2.5*sidel);
+ z1 = z0+2*right*sidel;
+ z2 = z0+2*dir(60)*sidel;
+ pat0 = z0--z1--z2--cycle;
+ z3 = z1+1.5*right*sidel;
+ z4 = z3+right*sidel;
+ z5 = z4+dir(60)*sidel;
+ z6 = z5+dir(120)*sidel;
+ z8 = z3+dir(120)*sidel;
+ z7 = z8+dir(60)*sidel;
+ pat1 = z3--z4--z5--z6--z7--z8--cycle;
+ z9 = z4+1.5*right*sidel;
+ z10= z9+right*sidel;
+ z11= z10+dir(60)*sidel;
+ z12= z11+dir(120)*sidel;
+ z14= z9+dir(60)*sidel;
+ z13= z14+dir(120)*sidel;
+ pat2 = z9--z10--z11--z12--z13--z14--cycle;
+ z15= z10+1.5*right*sidel;
+ z16= z15+right*sidel;
+ z17= z16+dir(60)*sidel;
+ z18= z15+2*dir(60)*sidel;
+ pat3 = z15--z16--z17--z18--cycle;
+ background := 0.85white;
+ for i = 0 upto 10:
+ unfill pat[i];
+ draw pat[i];
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/DebianSwirlsmallEdited.mp b/graphics/metapost/contrib/macros/featpost/example/DebianSwirlsmallEdited.mp
new file mode 100644
index 0000000000..9f239a5478
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/DebianSwirlsmallEdited.mp
@@ -0,0 +1,55 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% Edited by L. Nobre G.
+% DebianSwirlsmallEdited.mp
+
+beginfig(1);
+ color cristhine;
+ path pri, seg;
+ cristhine = (0.7,0.2,0.1);
+ pri = (190.745,542.894)
+ ..controls (-21.9817,469.739) and (-35.7288,149.215)..(169.473,46.9001)
+ ..controls (203.509,29.9294) and (261.751,14.9561)..(241.091,28.488)
+ ..controls (235.013,32.4688) and (225.136,35.4543)..(218.045,35.4543)
+ ..controls (210.954,35.4543) and (205.636,38.3416)..(205.636,42.1907)
+ ..controls (205.636,45.9331) and (199.964,50.7207)..(192.873,52.9626)
+ ..controls (157.73,64.074) and (97.0095,141.109)..(88.1819,185.782)
+ ..controls (86.8718,192.412) and (79.418,204.218)..(71.6182,212.018)
+ ..controls (30.533,253.103) and (52.4727,390.784)..(107.073,434.51)
+ ..controls (120.545,445.3) and (134.623,456.592)..(138.982,460.106)
+ ..controls (249.847,549.474) and (392.385,487.146)..(396.601,347.455)
+ ..controls (399.211,260.945) and (310.803,199.291)..(243.218,240.488)
+ ..controls (169.171,285.624) and (192.873,397.589)..(275.836,394.576)
+ ..controls (292.854,393.958) and (301.647,396.098)..(297.818,399.927)
+ ..controls (277.624,420.121) and (219.781,399.927)..(198.293,365.182)
+ ..controls (176.806,330.436) and (180.511,267.381)..(204.927,252.293)
+ ..controls (209.182,249.664) and (210.954,244.411)..(208.827,240.736)
+ ..controls (206.643,236.964) and (208.827,234.78)..(213.791,235.773)
+ ..controls (218.754,236.765) and (222.811,233.645)..(223.009,228.682)
+ ..controls (223.205,223.792) and (232.582,215.05)..(243.927,209.182)
+ ..controls (257.4,202.213) and (261.923,201.602)..(257.045,207.409)
+ ..controls (251.161,214.414) and (258.818,216.273)..(293.563,216.273)
+ ..controls (331.854,216.273) and (428.556,261.651)..(392.836,262.857)
+ ..controls (389.247,262.978) and (391.418,266.928)..(397.8,271.885)
+ ..controls (425.167,293.14) and (438.433,372.273)..(421.643,414.109)
+ ..controls (417.375,424.745) and (418.774,426.598)..(428.291,422.907)
+ ..controls (445.229,416.34) and (442.224,426.873)..(416.436,464.455)
+ ..controls (386.156,508.584) and (312.709,544.39)..(259.527,540.949)
+ ..controls (248.182,540.215) and (233.878,542.32)..(227.618,545.646)
+ ..controls (221,549.161) and (205.636,548.015)..(190.745,542.894)
+ --cycle;
+ seg = (274.773,200.673)
+ ..controls (279.736,198.687) and (287.536,198.687)..(292.5,200.673)
+ ..controls (297.464,202.658) and (293.563,204.218)..(283.636,204.218)
+ ..controls (273.709,204.218) and (269.809,202.658)..(274.773,200.673)
+ --cycle;
+ drawoptions( withcolor cristhine );
+ fill pri;
+ fill seg;
+ drawoptions( withpen pencircle scaled 1mm );
+ draw pri;
+ draw seg;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/EBcrossed.mp b/graphics/metapost/contrib/macros/featpost/example/EBcrossed.mp
new file mode 100644
index 0000000000..2bd1a0b0de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/EBcrossed.mp
@@ -0,0 +1,57 @@
+% Crossed Electric and Magnetic fields
+% L. Nobre G.
+% 2002
+
+% defaultfont := "putr8r";
+% defaultscale := 6.5;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric inc, ind, tep, larg, altr, lene;
+ path efld, velv, arch, auxi;
+ picture bfld;
+ pair vpos, cent;
+ tep = 1cm;
+ larg = 4;
+ altr = 3;
+ lene = larg*tep;
+ bfld = btex $\times$ etex;
+% bfld = thelabel("x",origin);
+ bfld := bfld shifted -(center bfld);
+ efld = origin--(lene,0);
+ for ind = 0 upto altr:
+ drawarrow efld shifted (0,ind*tep);
+ endfor;
+ auxi = efld shifted (0,tep);
+ for ind = 1 upto altr:
+ for inc = 1 step 2 until 2*larg:
+ label( bfld, (0.5*inc*tep,(ind-0.5)*tep) );
+ endfor;
+ endfor;
+ vpos = (tep,0.5tep);
+ label.lft( btex $\vec{B}$ etex, (0.5tep,(altr-0.5)*tep) );
+ label.lft( btex $\vec{E}$ etex, origin );
+ label.top( btex $\vec{v}$ etex, vpos );
+% label.lft( "B", (0.5tep,(altr-0.5)*tep) );
+% label.lft( "E", origin );
+% label.top( "v", vpos );
+ velv = vpos--((larg-1)*tep,(altr-0.5)*tep);
+ drawarrow velv;
+ cent = auxi intersectionpoint velv;
+ arch = ((fullcircle scaled (altr*tep*0.87)) shifted cent) cutafter velv;
+ draw arch;
+ label.rt( btex $\theta$ etex, point 0.5*length arch of arch );
+% label.rt( "T", point 0.5*length arch of arch );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/LED.mp b/graphics/metapost/contrib/macros/featpost/example/LED.mp
new file mode 100644
index 0000000000..ef934bf3f1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/LED.mp
@@ -0,0 +1,76 @@
+% LED.mp
+% L. Nobre G.
+% 2009
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, hthick, vthick, lspace, espace, dspace, h, lbase, dbase;
+ numeric dinray, halfh, tp, scal, marg, dcorrection;
+ u = 1.5mm;
+ hthick = 20u;
+ vthick = 10u;
+% lspace = 15u;
+ lspace = 8u;
+ espace = 8u;
+ dspace = 8u;
+ h = 3*vthick+2*espace;
+% lbase = 38u;
+ lbase = 45u;
+% dbase = 16u;
+ dbase = 19u;
+ halfh = h/2;
+ dinray = halfh-vthick;
+ tp = 1.15;
+ dcorrection = 1.3u;
+ scal = (h-vthick-espace)/h;
+ marg = 4u;
+ z200 = (marg,vthick+espace-marg);
+ path pathl, pathe, pathd, pathu;
+ z0 = (0,0);
+ z1 = (lbase,0);
+ z2 = (lbase,vthick);
+ z3 = (hthick,vthick);
+ z4 = (hthick,h);
+ z5 = (0,h);
+ pathl = z0--z1--z2--z3--z4--z5--cycle;
+ z6 = (lbase+lspace,0);
+ z7 = z6 + (h,0);
+ z8 = z7 + (0,vthick);
+ z9 = z6 + (vthick,vthick);
+ z10= z9 + (0,espace);
+ z11= z10+ (vthick,0);
+ z12= z10+ (vthick,vthick);
+ z13= z6 + (0,2*vthick+espace);
+ pathe = z6--z7--z8--z9--z10--z11--z12--z13--cycle;
+ z14= z7 + (dspace,0);
+ z15= z14+ (dbase,0);
+ z16= z15+ (halfh,halfh+dcorrection);
+ z17= z15+ (dcorrection,h);
+ z18= z14+ (0,h);
+ z19= z18- (0,vthick);
+ z20= z19+ (dbase,0);
+ z21= z20+ (dinray,-dinray);
+ z22= z15+ (0,vthick);
+ z23= z14+ (0,vthick);
+ pathd = z14---z15..z16..tension tp..z17---z18--z19---z20..tension tp..z21..z22---z23--cycle;
+ z24= z6 + (0,h);
+ z25= z24+ (h,0);
+ z26= z25- (0,vthick);
+ z27= z24- (0,vthick);
+ pathu = z24--z25--z26--z27--cycle;
+% fill pathl withcolor 0.78red;
+% fill pathe;
+% fill pathd;
+% fill pathu;
+% dotlabels( 14,15,16,17,18,19,20,21,22,23 );
+ z100 = (0,-2h);
+ drawoptions( shifted z100 );
+ fill pathl withcolor 0.78red;
+ fill pathe shifted (-z6) scaled scal shifted z200;
+ fill pathd shifted (-z6) scaled scal shifted z200;
+ fill pathu shifted (-z6) scaled scal shifted z200;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/SlowDownNowBitmapScanned.mp b/graphics/metapost/contrib/macros/featpost/example/SlowDownNowBitmapScanned.mp
new file mode 100644
index 0000000000..97659a2a3d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/SlowDownNowBitmapScanned.mp
@@ -0,0 +1,172 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <scott+ps2ed_AT_pakin.org>
+% pstoedit is Copyright (C) 1993 - 2009 Wolfgang Glunz <wglunz35_AT_pstoedit.net>
+% And edited by L. Nobre G.
+% 2012
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+randomseed := 1010;
+vardef renewcolore =
+ color tmpcolo;
+ tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+ drawoptions( withcolor tmpcolo withpen pencircle scaled 1mm );
+enddef;
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+ PreeditedPath1 = hide(z1=(57.601601,292.527008))z1..controls hide(z2=(45.687500,288.269989))z2 and hide(z3=(40.769501,273.300995))z3..hide(z4=(46.820301,259.699005))z4
+ ..controls hide(z5=(49.562500,253.535004))z5 and hide(z6=(54.800800,248.065994))z6..hide(z7=(65.898399,239.789001))z7
+ ..controls hide(z8=(84.398399,225.996002))z8 and hide(z9=(85.773399,224.839996))z9..hide(z10=(88.460899,220.800995))z10
+ ..controls hide(z11=(94.179703,212.199005))z11 and hide(z12=(92.484398,201.375000))z12..hide(z13=(84.800797,197.395004))z13
+ ..controls hide(z14=(78.722702,194.250000))z14 and hide(z15=(62.398399,197.897995))z15..hide(z16=(55.800800,203.875000))z16
+ ..controls hide(z17=(53.179699,206.246002))z17 and hide(z18=(52.839802,207.300995))z18..hide(z19=(52.292999,214.800995))z19
+ ..controls hide(z20=(51.601601,224.199005))z20 and hide(z21=(50.812500,225.738007))z21..hide(z22=(46.199200,226.660004))z22
+ ..controls hide(z23=(43.000000,227.300995))z23 and hide(z24=(43.000000,227.300995))z24..hide(z25=(43.000000,220.300995))z25
+ ..controls hide(z26=(43.000000,216.397995))z26 and hide(z27=(42.710899,210.598007))z27..hide(z28=(42.351601,207.199005))z28
+ ..controls hide(z29=(41.699200,201.102005))z29 and hide(z30=(41.699200,201.102005))z30..hide(z31=(46.500000,198.061996))z31
+ ..controls hide(z32=(58.601601,190.401993))z32 and hide(z33=(78.457001,185.854996))z33..hide(z34=(88.398399,188.468994))z34
+ ..controls hide(z35=(100.519997,191.651993))z35 and hide(z36=(104.500000,197.102005))z36..hide(z37=(104.500000,210.500000))z37
+ ..controls hide(z38=(104.500000,224.554993))z38 and hide(z39=(99.300797,231.945007))z39..hide(z40=(80.300797,244.897995))z40
+ ..controls hide(z41=(62.800800,256.828003))z41 and hide(z42=(58.000000,262.554993))z42..hide(z43=(58.000000,271.500000))z43
+ ..controls hide(z44=(58.000000,284.375000))z44 and hide(z45=(69.500000,289.085999))z45..hide(z46=(83.699203,282.027008))z46
+ ..controls hide(z47=(90.601601,278.597992))z47 and hide(z48=(91.558601,277.101990))z48..hide(z49=(92.914101,267.601990))z49
+ ..controls hide(z50=(94.042999,259.699005))z50 and hide(z51=(93.828102,260.027008))z51..hide(z52=(98.398399,259.285004))z52
+ ..controls hide(z53=(102.000000,258.699005))z53 and hide(z54=(102.000000,258.699005))z54..hide(z55=(102.000000,270.398010))z55
+ ..controls hide(z56=(102.000000,282.101990))z56 and hide(z57=(102.000000,282.101990))z57..hide(z58=(92.699203,286.515991))z58
+ ..controls hide(z59=(78.000000,293.492004))z59 and hide(z60=(66.039101,295.542999))z60..cycle;
+ renewcolore;
+ draw PreeditedPath1;
+ % dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60);
+ PreeditedPath2 = hide(z61=(117.000000,277.101990))z61..controls hide(z62=(117.000000,274.656006))z62 and hide(z63=(117.601997,274.007996))z63..hide(z64=(120.801003,272.992004))z64
+ ..controls hide(z65=(130.210999,270.003998))z65 and hide(z66=(129.688004,274.101990))z66..hide(z67=(128.367004,214.102005))z67
+ ..controls hide(z68=(127.698997,183.800995))z68 and hide(z69=(127.698997,183.800995))z69..hide(z70=(122.301003,184.397995))z70
+ ..controls hide(z71=(116.898003,185.000000))z71 and hide(z72=(116.898003,185.000000))z72..hide(z73=(117.198997,181.800995))z73
+ ..controls hide(z74=(117.500000,178.602005))z74 and hide(z75=(117.500000,178.602005))z75..hide(z76=(132.500000,174.699005))z76
+ ..controls hide(z77=(147.500000,170.800995))z77 and hide(z78=(147.500000,170.800995))z78..hide(z79=(147.550995,160.147995))z79
+ ..controls hide(z80=(147.578003,154.250000))z80 and hide(z81=(147.914001,148.315994))z81..hide(z82=(148.300995,146.852005))z82
+ ..controls hide(z83=(149.000000,144.199005))z83 and hide(z84=(149.000000,144.199005))z84..hide(z85=(133.699005,148.098007))z85
+ ..controls hide(z86=(115.398003,152.757996))z86 and hide(z87=(116.769997,152.690994))z87..hide(z88=(117.164001,148.897995))z88
+ ..controls hide(z89=(117.448997,146.190994))z89 and hide(z90=(118.101997,145.496002))z90..hide(z91=(121.398003,144.363007))z91
+ ..controls hide(z92=(128.429993,141.953003))z92 and hide(z93=(128.000000,144.897995))z93..hide(z94=(128.000000,99.101601))z94
+ ..controls hide(z95=(128.000000,71.199203))z95 and hide(z96=(127.652000,57.050800))z96..hide(z97=(126.948997,56.351601))z97
+ ..controls hide(z98=(126.305000,55.703098))z98 and hide(z99=(124.398003,55.570301))z99..hide(z100=(122.000000,56.000000))z100
+ ..controls hide(z101=(117.500000,56.808601))z101 and hide(z102=(117.000000,56.539101))z102..hide(z103=(117.000000,53.300800))z103
+ ..controls hide(z104=(117.000000,50.203098))z104 and hide(z105=(117.801003,49.906200))z105..hide(z106=(141.800995,44.039101))z106
+ ..controls hide(z107=(166.199005,38.074200))z107 and hide(z108=(172.479996,37.285198))z108..hide(z109=(180.000000,39.253899))z109
+ ..controls hide(z110=(196.117004,43.468800))z110 and hide(z111=(203.895004,55.199200))z111..hide(z112=(204.757996,76.601601))z112
+ ..controls hide(z113=(205.199005,87.601601))z113 and hide(z114=(205.199005,87.601601))z114..hide(z115=(210.397995,87.675797))z115
+ ..controls hide(z116=(248.628998,88.222702))z116 and hide(z117=(261.343994,143.602005))z117..hide(z118=(232.104996,182.199005))z118
+ ..controls hide(z119=(212.792999,207.699005))z119 and hide(z120=(179.664001,214.824005))z120..hide(z121=(161.102005,197.473007))z121
+ ..controls hide(z122=(156.397995,193.082001))z122 and hide(z123=(150.000000,182.602005))z123..hide(z124=(150.000000,179.300995))z124
+ ..controls hide(z125=(150.000000,178.156006))z125 and hide(z126=(149.250000,177.940994))z126..hide(z127=(146.852005,178.397995))z127
+ ..controls hide(z128=(145.147995,178.723007))z128 and hide(z129=(143.309006,179.000000))z129..hide(z130=(142.852005,179.000000))z130
+ ..controls hide(z131=(142.378998,179.000000))z131 and hide(z132=(142.000000,198.397995))z132..hide(z133=(142.000000,222.602005))z133
+ ..controls hide(z134=(142.000000,266.199005))z134 and hide(z135=(142.000000,266.199005))z135..hide(z136=(147.000000,265.851990))z136
+ ..controls hide(z137=(152.000000,265.500000))z137 and hide(z138=(152.000000,265.500000))z138..hide(z139=(152.000000,268.648010))z139
+ ..controls hide(z140=(152.000000,271.800995))z140 and hide(z141=(152.000000,271.800995))z141..hide(z142=(135.500000,275.902008))z142
+ ..controls hide(z143=(116.000000,280.750000))z143 and hide(z144=(117.000000,280.683990))z144..cycle;
+ % renewcolore;
+ draw PreeditedPath2;
+ % dotlabels.rt(61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144);
+ PreeditedPath3 = hide(z145=(204.102005,194.261993))z145..controls hide(z146=(214.804993,189.000000))z146 and hide(z147=(222.988007,178.699005))z147..hide(z148=(227.667999,164.602005))z148
+ ..controls hide(z149=(231.121002,154.199005))z149 and hide(z150=(231.766006,127.625000))z150..hide(z151=(228.800995,118.000000))z151
+ ..controls hide(z152=(225.195007,106.301003))z152 and hide(z153=(217.477005,98.738297))z153..hide(z154=(207.800995,97.425797))z154
+ ..controls hide(z155=(203.199005,96.800797))z155 and hide(z156=(203.199005,96.800797))z156..hide(z157=(201.953003,100.698997))z157
+ ..controls hide(z158=(197.054993,116.000000))z158 and hide(z159=(182.945007,131.500000))z159..hide(z160=(168.397995,137.565994))z160
+ ..controls hide(z161=(164.628998,139.136993))z161 and hide(z162=(164.000000,141.800995))z162..hide(z163=(164.000000,156.199005))z163
+ ..controls hide(z164=(164.000000,167.483994))z164 and hide(z165=(163.397995,167.059006))z165..hide(z166=(175.000000,164.000000))z166
+ ..controls hide(z167=(186.848007,160.875000))z167 and hide(z168=(186.000000,160.000000))z168..hide(z169=(186.000000,175.397995))z169
+ ..controls hide(z170=(186.000000,188.897995))z170 and hide(z171=(186.000000,188.897995))z171..hide(z172=(182.300995,189.917999))z172
+ ..controls hide(z173=(177.727005,191.175995))z173 and hide(z174=(178.089996,191.699005))z174..hide(z175=(176.585999,181.602005))z175
+ ..controls hide(z176=(175.085999,171.500000))z176 and hide(z177=(175.151993,171.589996))z177..hide(z178=(170.000000,172.464996))z178
+ ..controls hide(z179=(165.104996,173.296997))z179 and hide(z180=(164.977005,174.397995))z180..hide(z181=(168.848007,182.500000))z181
+ ..controls hide(z182=(171.809006,188.699005))z182 and hide(z183=(175.343994,192.617004))z183..hide(z184=(180.500000,195.417999))z184
+ ..controls hide(z185=(184.988007,197.854996))z185 and hide(z186=(198.102005,197.210999))z186..cycle;
+ % renewcolore;
+ draw PreeditedPath3;
+ % dotlabels.rt(145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186);
+ PreeditedPath4 = hide(z187=(148.602005,136.957001))z187..controls hide(z188=(149.867004,136.500000))z188 and hide(z189=(151.401993,134.300995))z189..hide(z190=(152.468994,131.397995))z190
+ ..controls hide(z191=(157.781006,117.000000))z191 and hide(z192=(171.020004,101.311996))z192..hide(z193=(183.199005,94.984398))z193
+ ..controls hide(z194=(191.574005,90.636703))z194 and hide(z195=(192.438004,87.699203))z195..hide(z196=(189.960999,72.000000))z196
+ ..controls hide(z197=(186.473007,49.898399))z197 and hide(z198=(175.300995,43.445301))z198..hide(z199=(150.397995,49.148399))z199
+ ..controls hide(z200=(141.000000,51.300800))z200 and hide(z201=(141.000000,51.300800))z201..hide(z202=(141.000000,95.199203))z202
+ ..controls hide(z203=(141.000000,143.699005))z203 and hide(z204=(140.315994,139.945007))z204..cycle;
+ % renewcolore;
+ draw PreeditedPath4;
+ % dotlabels.rt(187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204);
+ PreeditedPath5 = hide(z205=(175.897995,123.491997))z205..controls hide(z206=(181.897995,117.765999))z206 and hide(z207=(188.440994,106.558998))z207..hide(z208=(187.746002,103.198997))z208
+ ..controls hide(z209=(187.125000,100.219002))z209 and hide(z210=(174.957001,113.398003))z210..hide(z211=(171.218994,121.101997))z211
+ ..controls hide(z212=(166.311996,131.199005))z212 and hide(z213=(167.300995,131.703003))z213..cycle;
+ % renewcolore;
+ draw PreeditedPath5;
+ % dotlabels.rt(205,206,207,208,209,210,211,212,213);
+ PreeditedPath6 = hide(z214=(343.000000,246.199005))z214..controls hide(z215=(343.000000,243.886993))z215 and hide(z216=(343.750000,243.145004))z216..hide(z217=(348.250000,241.000000))z217
+ ..controls hide(z218=(353.500000,238.500000))z218 and hide(z219=(353.500000,238.500000))z219..hide(z220=(353.500000,196.000000))z220
+ ..controls hide(z221=(353.500000,153.500000))z221 and hide(z222=(353.500000,153.500000))z222..hide(z223=(348.250000,153.699005))z223
+ ..controls hide(z224=(343.050995,153.897995))z224 and hide(z225=(343.000000,153.867004))z225..hide(z226=(343.000000,150.647995))z226
+ ..controls hide(z227=(343.000000,147.410004))z227 and hide(z228=(343.050995,147.386993))z228..hide(z229=(356.750000,144.050995))z229
+ ..controls hide(z230=(364.351990,142.199005))z230 and hide(z231=(371.058990,140.500000))z231..hide(z232=(371.750000,140.250000))z232
+ ..controls hide(z233=(372.582001,139.949005))z233 and hide(z234=(373.000000,140.949005))z234..hide(z235=(373.000000,143.250000))z235
+ ..controls hide(z236=(373.000000,146.363007))z236 and hide(z237=(372.601990,146.832001))z237..hide(z238=(368.898010,148.042999))z238
+ ..controls hide(z239=(361.847992,150.352005))z239 and hide(z240=(361.996002,149.397995))z240..hide(z241=(362.261993,190.897995))z241
+ ..controls hide(z242=(362.500000,228.102005))z242 and hide(z243=(362.500000,228.102005))z243..hide(z244=(389.332001,178.602005))z244
+ ..controls hide(z245=(418.277008,125.198997))z245 and hide(z246=(417.039001,127.000000))z246..hide(z247=(424.800995,127.000000))z247
+ ..controls hide(z248=(425.742004,127.000000))z248 and hide(z249=(426.000000,136.699005))z249..hide(z250=(426.000000,172.397995))z250
+ ..controls hide(z251=(426.000000,223.000000))z251 and hide(z252=(425.667999,220.750000))z252..hide(z253=(433.000000,219.617004))z253
+ ..controls hide(z254=(437.000000,219.000000))z254 and hide(z255=(437.000000,219.000000))z255..hide(z256=(437.000000,222.300995))z256
+ ..controls hide(z257=(437.000000,225.602005))z257 and hide(z258=(437.000000,225.602005))z258..hide(z259=(422.601990,229.296997))z259
+ ..controls hide(z260=(405.500000,233.684006))z260 and hide(z261=(407.000000,233.625000))z261..hide(z262=(407.000000,229.897995))z262
+ ..controls hide(z263=(407.000000,227.328003))z263 and hide(z264=(407.601990,226.645004))z264..hide(z265=(411.199005,225.104996))z265
+ ..controls hide(z266=(418.312012,222.065994))z266 and hide(z267=(418.011993,223.897995))z267..hide(z268=(417.742004,185.300995))z268
+ ..controls hide(z269=(417.500000,150.300995))z269 and hide(z270=(417.500000,150.300995))z270..hide(z271=(393.750000,194.397995))z271
+ ..controls hide(z272=(380.664001,218.699005))z272 and hide(z273=(370.000000,239.397995))z273..hide(z274=(370.000000,240.500000))z274
+ ..controls hide(z275=(370.000000,242.214996))z275 and hide(z276=(368.199005,242.960999))z276..hide(z277=(357.300995,245.746002))z277
+ ..controls hide(z278=(342.101990,249.628998))z278 and hide(z279=(343.000000,249.602005))z279..cycle;
+ % renewcolore;
+ draw PreeditedPath6;
+ % dotlabels.rt(214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279);
+ PreeditedPath7 = hide(z280=(254.000000,185.000000))z280..controls hide(z281=(254.000000,182.395004))z281 and hide(z282=(254.647995,181.671997))z282..hide(z283=(258.949005,179.500000))z283
+ ..controls hide(z284=(263.050995,177.429993))z284 and hide(z285=(264.074005,176.348007))z285..hide(z286=(264.921997,173.199005))z286
+ ..controls hide(z287=(265.996002,169.199005))z287 and hide(z288=(290.000000,68.988297))z288..hide(z289=(290.000000,68.500000))z289
+ ..controls hide(z290=(290.000000,67.898399))z290 and hide(z291=(300.101990,65.804703))z291..hide(z292=(300.601990,66.300797))z292
+ ..controls hide(z293=(300.875000,66.574203))z293 and hide(z294=(306.707001,84.898399))z294..hide(z295=(313.582001,107.101997))z295
+ ..controls hide(z296=(324.546997,142.500000))z296 and hide(z297=(326.929993,149.710999))z297..hide(z298=(327.070007,147.897995))z298
+ ..controls hide(z299=(327.085999,147.679993))z299 and hide(z300=(332.843994,126.101997))z300..hide(z301=(339.851990,100.000000))z301
+ ..controls hide(z302=(352.601990,52.500000))z302 and hide(z303=(352.601990,52.500000))z303..hide(z304=(357.800995,51.101601))z304
+ ..controls hide(z305=(360.699005,50.320301))z305 and hide(z306=(363.156006,49.875000))z306..hide(z307=(363.351990,50.101601))z307
+ ..controls hide(z308=(363.687988,50.476601))z308 and hide(z309=(388.000000,143.602005))z309..hide(z310=(388.000000,144.500000))z310
+ ..controls hide(z311=(388.000000,144.772995))z311 and hide(z312=(390.500000,145.000000))z312..hide(z313=(393.500000,145.000000))z313
+ ..controls hide(z314=(399.000000,145.000000))z314 and hide(z315=(399.000000,145.000000))z315..hide(z316=(399.000000,148.500000))z316
+ ..controls hide(z317=(399.000000,152.335999))z317 and hide(z318=(400.898010,151.522995))z318..hide(z319=(379.300995,156.940994))z319
+ ..controls hide(z320=(372.601990,158.621002))z320 and hide(z321=(366.828003,160.000000))z321..hide(z322=(366.500000,160.000000))z322
+ ..controls hide(z323=(366.167999,160.000000))z323 and hide(z324=(366.035004,158.550995))z324..hide(z325=(366.199005,156.750000))z325
+ ..controls hide(z326=(366.464996,153.867004))z326 and hide(z327=(367.148010,153.188004))z327..hide(z328=(372.250000,150.750000))z328
+ ..controls hide(z329=(376.351990,148.789001))z329 and hide(z330=(378.000000,147.425995))z330..hide(z331=(378.000000,146.000000))z331
+ ..controls hide(z332=(378.000000,143.897995))z332 and hide(z333=(361.582001,79.898399))z333..hide(z334=(360.199005,76.601601))z334
+ ..controls hide(z335=(359.449005,74.816399))z335 and hide(z336=(358.167999,79.300797))z336..hide(z337=(339.093994,150.500000))z337
+ ..controls hide(z338=(334.300995,168.397995))z338 and hide(z339=(334.300995,168.397995))z339..hide(z340=(329.398010,169.699005))z340
+ ..controls hide(z341=(326.699005,170.417999))z341 and hide(z342=(324.230011,171.000000))z342..hide(z343=(323.898010,171.000000))z343
+ ..controls hide(z344=(323.570007,171.000000))z344 and hide(z345=(317.734009,153.250000))z345..hide(z346=(310.898010,131.449005))z346
+ ..controls hide(z347=(302.433990,104.448997))z347 and hide(z348=(298.261993,92.472702))z348..hide(z349=(297.750000,93.699203))z349
+ ..controls hide(z350=(296.457001,96.800797))z350 and hide(z351=(279.000000,169.613007))z351..hide(z352=(279.000000,171.897995))z352
+ ..controls hide(z353=(279.000000,174.000000))z353 and hide(z354=(279.250000,174.070007))z354..hide(z355=(284.550995,173.449005))z355
+ ..controls hide(z356=(290.050995,172.804993))z356 and hide(z357=(290.097992,172.832001))z357..hide(z358=(289.800995,176.147995))z358
+ ..controls hide(z359=(289.500000,179.500000))z359 and hide(z360=(289.500000,179.500000))z360..hide(z361=(273.500000,183.738007))z361
+ ..controls hide(z362=(254.000000,188.897995))z362 and hide(z363=(254.000000,188.897995))z363..cycle;
+ % renewcolore;
+ draw PreeditedPath7;
+ % dotlabels.rt(280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363);
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/acmaglev.mp b/graphics/metapost/contrib/macros/featpost/example/acmaglev.mp
new file mode 100644
index 0000000000..37cad98514
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/acmaglev.mp
@@ -0,0 +1,38 @@
+% acmaglev.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+Spread := 25;
+f := (0,-2,0);
+ParallelProj := true;
+ShiftV := ( 0, 1 );
+
+def vecfunc( expr posit )=
+ begingroup
+ save a, c, field;
+ color field;
+ numeric a, c;
+ a = (sind(X(posit))-Z(posit)*0.95)/40;
+ c = -Y( posit ) ;
+ field = ( 1, c, a );
+ ( field )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, tot;
+ path dephased, sinusoid, zeroaxis;
+ transform T;
+ tot = 900;
+ T = identity yscaled 2 xscaled 1/36 shifted (0,Shifts);
+ zeroaxis = rp( black )--rp( (tot,0,0) );
+ draw zeroaxis transformed T withcolor green;
+ sinusoid = rp( black ) for i=1 upto tot: ...rp( (i,0,sind(i)) ) endfor;
+ draw sinusoid transformed T;
+ dephased = fieldlinepath(tot,(0,0,1),1,vecfunc);
+ draw dephased transformed T withcolor red;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/acoplanv.mp b/graphics/metapost/contrib/macros/featpost/example/acoplanv.mp
new file mode 100644
index 0000000000..d29cc15682
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/acoplanv.mp
@@ -0,0 +1,81 @@
+% acoplanv.mp
+% L. Nobre G.
+% 2003
+
+verbatimtex
+\documentclass{article}
+\usepackage{mathpazo}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric overallang, torsionang, u, curvfact;
+ u = 1mm;
+ overallang = -22;
+ torsionang = 40;
+ curvfact = 0.6;
+ numeric armsize, roundray, direcstep;
+ armsize = 25u;
+ roundray = 10u;
+ direcstep = 2.8u;
+ pair restaxedir, restdir, torsaxedir, torsdir;
+ restaxedir = dir( 90+overallang );
+ restdir = dir( overallang );
+ torsaxedir = dir( 90+overallang+torsionang );
+ torsdir = dir( overallang+torsionang );
+ numeric leng;
+ pair midpos;
+ pickup pencircle scaled 0.5u;
+
+ drawoptions( withcolor 0.52white );
+ for i=1.5*direcstep step direcstep until roundray:
+ leng := roundray +-+ i;
+ midpos := i*restaxedir;
+ draw (midpos-leng*restdir)--(midpos+leng*restdir);
+ midpos := -i*restaxedir;
+ draw (midpos-leng*restdir)--(midpos+leng*restdir);
+ endfor;
+ path minuslin, plusline;
+ plusline = (0.5*direcstep*restaxedir-armsize*restdir)--
+ (0.5*direcstep*restaxedir+armsize*restdir);
+ minuslin = (-0.5*direcstep*restaxedir-armsize*restdir)--
+ (-0.5*direcstep*restaxedir+armsize*restdir);
+ draw plusline;
+ draw minuslin;
+
+ drawoptions( withcolor black );
+ for i=1.5*direcstep step direcstep until roundray:
+ leng := roundray +-+ i;
+ midpos := i*torsaxedir;
+ draw (midpos-leng*torsdir)--(midpos+leng*torsdir);
+ midpos := -i*torsaxedir;
+ draw (midpos-leng*torsdir)--(midpos+leng*torsdir);
+ endfor;
+ path minuscur, pluscurv;
+ numeric curvheig;
+ curvheig = curvfact*armsize*sind( torsionang )/cosd( torsionang );
+ leng := roundray +-+ (0.5*direcstep);
+ minuscur = ((-curvheig-0.5*direcstep)*restaxedir-armsize*restdir){restdir}..
+ (-0.5*direcstep*torsaxedir-leng*torsdir)--
+ (-0.5*direcstep*torsaxedir+leng*torsdir)..
+ {restdir}((curvheig-0.5*direcstep)*restaxedir+armsize*restdir);
+ pluscurv = ((-curvheig+0.5*direcstep)*restaxedir-armsize*restdir){restdir}..
+ (0.5*direcstep*torsaxedir-leng*torsdir)--
+ (0.5*direcstep*torsaxedir+leng*torsdir)..
+ {restdir}((curvheig+0.5*direcstep)*restaxedir+armsize*restdir);
+ draw minuscur;
+ draw pluscurv;
+
+ drawoptions( withcolor red );
+ path velbase;
+ for i=roundray+direcstep step direcstep until armsize:
+ velbase := (i*restdir)--(i*restdir+curvheig*restaxedir);
+ drawarrow velbase cutbefore plusline cutafter minuscur;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+bye;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ahoraesglobal.mp b/graphics/metapost/contrib/macros/featpost/example/ahoraesglobal.mp
new file mode 100644
index 0000000000..52f684050d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ahoraesglobal.mp
@@ -0,0 +1,277 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+input featpost3Dplus2D;
+
+% Generate structured PostScript
+%prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+%vardef showtext(expr origin)(expr angle)(expr string) =
+% draw string infont defaultfont scaled defaultscale
+% rotated angle shifted origin;
+%enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+%randomseed := 1010;
+%vardef renewcolore =
+% color tmpcolo;
+% tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+% drawoptions( withcolor tmpcolo );
+%enddef;
+%defaultscale := 0.16;
+
+numeric sray;
+sray = 1;
+
+def converterfunc( expr Pair ) =
+ begingroup
+ save xc, yc, xa, ya;
+ numeric xc, yc, xa, ya;
+ xc = xpart Pair;
+ yc = ypart Pair;
+ xa = 0.35*(xc-140);
+ ya = 0.35*(yc-665);
+ ( rp( sray*( cosd(ya)*cosd(xa), cosd(ya)*sind(xa), sind(ya) ) ) )
+ endgroup
+enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end of first featpost part
+
+
+f := 2.5*(4,-0.5,-0.75);
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+ PreeditedPath1 = hide(z1=(43,727.591))z1--hide(z2=(42.4417,719.122))z2..controls hide(z3=(48.9175,719.421))z3 and hide(z4=(48.9175,719))z4..hide(z5=(50.2126,719))z5
+ ..controls hide(z6=(50.7107,719))z6 and hide(z7=(53.2014,719.041))z7..hide(z8=(57.5852,719.122))z8
+ --hide(z9=(57.5852,722))z9--hide(z10=(53.6997,722.311))z10..controls hide(z11=(51.3086,722.41))z11 and hide(z12=(50.9998,723.207))z12..hide(z13=(50.9998,728.089))z13
+ --hide(z14=(50.9998,746.321))z14..controls hide(z15=(50.9998,760.867))z15 and hide(z16=(46.7913,766))z16..hide(z17=(35.1685,766))z17
+ ..controls hide(z18=(30.8843,766))z18 and hide(z19=(26.8992,764.952))z19..hide(z20=(23.1133,762.76))z20
+ --hide(z21=(17.9851,759.572))z21--hide(z22=(17.9851,753.096))z22--hide(z23=(20.4233,752.398))z23
+ --hide(z24=(21.7185,755.487))z24..controls hide(z25=(23.8108,760.17))z25 and hide(z26=(24.8071,761))z26..hide(z27=(29.3901,761))z27
+ ..controls hide(z28=(38.7554,761))z28 and hide(z29=(42.6409,757.275))z29..hide(z30=(42.9397,748.114))z30
+ --hide(z31=(43.0007,744.926))z31--hide(z32=(43.0002,731.775))z32..controls hide(z33=(40.0977,727.69))z33 and hide(z34=(33.792,723.804))z34..hide(z35=(29.8887,723.804))z35
+ ..controls hide(z36=(25.9036,723.804))z36 and hide(z37=(22.0002,727.537))z37..hide(z38=(22.0002,731.875))z38
+ ..controls hide(z39=(22.0002,735.561))z39 and hide(z40=(24.1594,739.048))z40..hide(z41=(27.3982,740.941))z41
+ ..controls hide(z42=(29.8984,742.436))z42 and hide(z43=(35.3994,743.83))z43..hide(z44=(43.0007,744.926))z44
+ --hide(z45=(42.9397,748.114))z45--hide(z46=(33.0764,746.321))z46..controls hide(z47=(19.5269,743.83))z47 and hide(z48=(14,739.148))z48..hide(z49=(14,730.48))z49
+ ..controls hide(z50=(14,722.709))z50 and hide(z51=(18.6257,717.804))z51..hide(z52=(26.4014,717.804))z52
+ ..controls hide(z53=(28.1948,717.804))z53 and hide(z54=(29.8884,718.261))z54..cycle;
+ %renewcolore;
+ %draw PreeditedPath1;
+ %dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54);
+ PreeditedPath2 = hide(z55=(61.1724,785.277))z55--hide(z56=(66.7517,785.277))z56..controls hide(z57=(68.5452,785.277))z57 and hide(z58=(69.0005,784.181))z58..hide(z59=(69.0005,781.192))z59
+ --hide(z60=(69.0005,729.583))z60..controls hide(z61=(69.0005,723.307))z61 and hide(z62=(68.7212,722.609))z62..hide(z63=(65.5564,722.41))z63
+ --hide(z64=(61.073,722.111))z64--hide(z65=(61.073,719.122))z65..controls hide(z66=(67.8479,719.321))z66 and hide(z67=(70.5378,719))z67..hide(z68=(73.427,719))z68
+ ..controls hide(z69=(76.3162,719))z69 and hide(z70=(79.0061,719.041))z70..hide(z71=(85.781,719.122))z71
+ --hide(z72=(85.781,722.111))z72--hide(z73=(81.2976,722.41))z73..controls hide(z74=(77.9102,722.609))z74 and hide(z75=(77,723.307))z75..hide(z76=(77,729.583))z76
+ --hide(z77=(77,750.705))z77..controls hide(z78=(77,755.188))z78 and hide(z79=(83.8933,760))z79..hide(z80=(90.2644,760))z80
+ ..controls hide(z81=(96.9397,760))z81 and hide(z82=(102,755.046))z82..hide(z83=(102,747.417))z83
+ --hide(z84=(102,719.122))z84..controls hide(z85=(107.555,719.421))z85 and hide(z86=(107.646,719))z86..hide(z87=(109.194,719))z87
+ ..controls hide(z88=(110.589,719))z88 and hide(z89=(110.589,719.299))z89..hide(z90=(117.463,719))z90
+ --hide(z91=(117.463,722.111))z91--hide(z92=(113.379,722.41))z92..controls hide(z93=(109.991,722.609))z93 and hide(z94=(110,723.207))z94..hide(z95=(110,729.583))z95
+ --hide(z96=(110,748.812))z96..controls hide(z97=(110,760.469))z97 and hide(z98=(104.419,766))z98..hide(z99=(93.0542,766))z99
+ ..controls hide(z100=(89.3679,766))z100 and hide(z101=(87.2756,765.344))z101..hide(z102=(85.1833,763.657))z102
+ --hide(z103=(77.0002,757.081))z103--hide(z104=(77.0002,790.955))z104--hide(z105=(76.7148,791.752))z105
+ ..controls hide(z106=(72.3311,790.059))z106 and hide(z107=(69.0432,789.262))z107..cycle;
+ %renewcolore;
+ %draw PreeditedPath2;
+ %dotlabels.rt(55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107);
+ PreeditedPath3 = hide(z108=(146.256,766))z108--hide(z109=(144.463,763))z109..controls hide(z110=(153.629,763))z110 and hide(z111=(161,752.978))z111..hide(z112=(161,739.347))z112
+ ..controls hide(z113=(161,727.889))z113 and hide(z114=(155.688,720.007))z114..hide(z115=(147.252,720.007))z115
+ ..controls hide(z116=(137.489,720.007))z116 and hide(z117=(131,729.858))z117..hide(z118=(131,744.428))z118
+ ..controls hide(z119=(131,756.383))z119 and hide(z120=(135.751,763))z120..hide(z121=(144.463,763))z121
+ --hide(z122=(144.463,763))z122--hide(z123=(146.256,766))z123..controls hide(z124=(131.71,766))z124 and hide(z125=(122,755.798))z125..hide(z126=(122,741.04))z126
+ ..controls hide(z127=(122,726.993))z127 and hide(z128=(130.723,717.007))z128..hide(z129=(143.367,717.007))z129
+ ..controls hide(z130=(158.71,717.007))z130 and hide(z131=(170,727.843))z131..hide(z132=(170,743.033))z132
+ ..controls hide(z133=(170,756.483))z133 and hide(z134=(160.098,766))z134..cycle;
+ %renewcolore;
+ %draw PreeditedPath3;
+ %dotlabels.rt(108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134);
+ PreeditedPath4 = hide(z135=(175.149,759.273))z135--hide(z136=(178.836,759.273))z136..controls hide(z137=(182.821,759.273))z137 and hide(z138=(183,758.576))z138..hide(z139=(183,752))z139
+ --hide(z140=(183,729.583))z140..controls hide(z141=(183,723.307))z141 and hide(z142=(182.719,722.609))z142..hide(z143=(179.533,722.41))z143
+ --hide(z144=(174.95,722.111))z144--hide(z145=(174.95,719.122))z145..controls hide(z146=(182.123,719.321))z146 and hide(z147=(184.714,719))z147..hide(z148=(187.204,719))z148
+ ..controls hide(z149=(189.197,719))z149 and hide(z150=(189.197,719.298))z150..hide(z151=(201.451,719))z151
+ --hide(z152=(201.451,722))z152--hide(z153=(196.271,722.41))z153..controls hide(z154=(191.787,722.709))z154 and hide(z155=(191,723.008))z155..hide(z156=(191,729.583))z156
+ --hide(z157=(191,746.719))z157..controls hide(z158=(191,752.697))z158 and hide(z159=(195.249,758))z159..hide(z160=(200.455,758))z160
+ ..controls hide(z161=(203.444,758))z161 and hide(z162=(205.536,756.508))z162..hide(z163=(207.13,753.096))z163
+ --hide(z164=(209.223,753.096))z164--hide(z165=(210.119,765.051))z165..controls hide(z166=(209.023,765.749))z166 and hide(z167=(207.23,766))z167..hide(z168=(205.437,766))z168
+ ..controls hide(z169=(202.448,766))z169 and hide(z170=(199.259,764.463))z170..hide(z171=(197.167,762.062))z171
+ --hide(z172=(190.999,755.487))z172--hide(z173=(190.999,765.749))z173--hide(z174=(190.691,766.147))z174
+ ..controls hide(z175=(185.61,764.055))z175 and hide(z176=(180.429,762.66))z176..cycle;
+ %renewcolore;
+ %draw PreeditedPath4;
+ %dotlabels.rt(135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176);
+ PreeditedPath5 = hide(z177=(244,727.591))z177--hide(z178=(243.994,719.122))z178..controls hide(z179=(250.47,719.421))z179 and hide(z180=(250.47,719))z180..hide(z181=(251.765,719))z181
+ ..controls hide(z182=(252.263,719))z182 and hide(z183=(254.754,719.041))z183..hide(z184=(259.138,719.122))z184
+ --hide(z185=(259.138,722))z185--hide(z186=(255.252,722.311))z186..controls hide(z187=(252.861,722.41))z187 and hide(z188=(252,723.207))z188..hide(z189=(252,728.089))z189
+ --hide(z190=(252,746.321))z190..controls hide(z191=(252,760.867))z191 and hide(z192=(247.938,766))z192..hide(z193=(236.721,766))z193
+ ..controls hide(z194=(232.437,766))z194 and hide(z195=(228.452,764.952))z195..hide(z196=(224.666,762.76))z196
+ --hide(z197=(219.985,759.572))z197--hide(z198=(219.985,753.096))z198--hide(z199=(221.976,752.398))z199
+ --hide(z200=(223.271,755.487))z200..controls hide(z201=(225.363,760.17))z201 and hide(z202=(226.36,761))z202..hide(z203=(230.943,761))z203
+ ..controls hide(z204=(240.308,761))z204 and hide(z205=(244.193,757.275))z205..hide(z206=(244.492,748.114))z206
+ --hide(z207=(244.001,744.926))z207--hide(z208=(244,731.775))z208..controls hide(z209=(241.22,727.69))z209 and hide(z210=(235.18,723.804))z210..hide(z211=(231.441,723.804))z211
+ ..controls hide(z212=(227.456,723.804))z212 and hide(z213=(224,727.537))z213..hide(z214=(224,731.875))z214
+ ..controls hide(z215=(224,735.561))z215 and hide(z216=(225.98,739.048))z216..hide(z217=(228.951,740.941))z217
+ ..controls hide(z218=(231.362,742.436))z218 and hide(z219=(236.669,743.83))z219..hide(z220=(244.001,744.926))z220
+ --hide(z221=(244.492,748.114))z221--hide(z222=(234.629,746.321))z222..controls hide(z223=(221.079,743.83))z223 and hide(z224=(216,739.148))z224..hide(z225=(216,730.48))z225
+ ..controls hide(z226=(216,722.709))z226 and hide(z227=(220.459,717.804))z227..hide(z228=(227.954,717.804))z228
+ ..controls hide(z229=(229.747,717.804))z229 and hide(z230=(231.441,718.261))z230..cycle;
+ %renewcolore;
+ %draw PreeditedPath5;
+ %dotlabels.rt(177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230);
+ PreeditedPath6 = hide(z231=(134.898,647.945))z231--hide(z232=(133.603,648.941))z232..controls hide(z233=(127.227,645.155))z233 and hide(z234=(124.935,644.008))z234..hide(z235=(120.651,644.008))z235
+ ..controls hide(z236=(114.175,644.008))z236 and hide(z237=(108.795,646.99))z237..hide(z238=(106.006,652.029))z238
+ ..controls hide(z239=(104.113,655.349))z239 and hide(z240=(103.415,658.166))z240..hide(z241=(103.216,664))z241
+ --hide(z242=(117.762,664))z242..controls hide(z243=(124.636,664))z243 and hide(z244=(128.92,664.275))z244..hide(z245=(135.795,665.28))z245
+ ..controls hide(z246=(135.895,666.675))z246 and hide(z247=(135.994,667.572))z247..hide(z248=(135.994,668.767))z248
+ ..controls hide(z249=(135.994,680.225))z249 and hide(z250=(128.622,688))z250..hide(z251=(117.463,688))z251
+ --hide(z252=(116.267,685))z252..controls hide(z253=(119.555,685))z253 and hide(z254=(122.145,683.513))z254..hide(z255=(123.939,680.424))z255
+ ..controls hide(z256=(126.131,677.137))z256 and hide(z257=(126.828,674.247))z257..hide(z258=(127.127,667.572))z258
+ --hide(z259=(127.127,667.572))z259..controls hide(z260=(121.946,667.373))z260 and hide(z261=(119.555,667))z261..hide(z262=(115.968,667))z262
+ ..controls hide(z263=(111.385,667))z263 and hide(z264=(108.795,667.145))z264..hide(z265=(103.415,667.871))z265
+ ..controls hide(z266=(103.415,672.553))z266 and hide(z267=(103.813,674.745))z267..hide(z268=(105.108,677.336))z268
+ ..controls hide(z269=(107.201,681.719))z269 and hide(z270=(111.485,685))z270..hide(z271=(116.267,685))z271
+ --hide(z272=(117.463,688))z272..controls hide(z273=(113.777,688))z273 and hide(z274=(109.493,686.598))z274..hide(z275=(105.408,684.011))z275
+ ..controls hide(z276=(97.2383,679.328))z276 and hide(z277=(93.9504,673.151))z277..hide(z278=(93.9504,662.79))z278
+ ..controls hide(z279=(93.9504,656.513))z279 and hide(z280=(95.4448,651.133))z280..hide(z281=(98.1348,647.347))z281
+ ..controls hide(z282=(102.12,642.067))z282 and hide(z283=(108.795,639.007))z283..hide(z284=(116.267,639.007))z284
+ ..controls hide(z285=(119.954,639.007))z285 and hide(z286=(123.64,639.796))z286..hide(z287=(127.725,641.569))z287
+ ..controls hide(z288=(130.415,642.665))z288 and hide(z289=(132.507,643.96))z289..cycle;
+ %renewcolore;
+ %draw PreeditedPath6;
+ %dotlabels.rt(231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289);
+ PreeditedPath7 = hide(z290=(143.398,655.218))z290..controls hide(z291=(143.398,648.343))z291 and hide(z292=(143.037,645.354))z292..hide(z293=(142.072,641.369))z293
+ ..controls hide(z294=(147.252,639.676))z294 and hide(z295=(151.138,639.007))z295..hide(z296=(155.721,639.007))z296
+ ..controls hide(z297=(168.772,639.007))z297 and hide(z298=(178,645.969))z298..hide(z299=(178,655.716))z299
+ ..controls hide(z300=(178,658.804))z300 and hide(z301=(177.115,661.096))z301..hide(z302=(175.248,663.089))z302
+ ..controls hide(z303=(172.658,665.579))z303 and hide(z304=(169.37,666.775))z304..hide(z305=(160.603,668.468))z305
+ ..controls hide(z306=(152.433,670.063))z306 and hide(z307=(150,672.055))z307..hide(z308=(150,676.638))z308
+ ..controls hide(z309=(150,681.62))z309 and hide(z310=(153.393,685))z310..hide(z311=(159.307,685))z311
+ ..controls hide(z312=(165.983,685))z312 and hide(z313=(170.907,681.261))z313..hide(z314=(170.907,676.239))z314
+ --hide(z315=(170.907,673.948))z315--hide(z316=(173.853,673.948))z316..controls hide(z317=(173.953,679.727))z317 and hide(z318=(174.052,682.118))z318..hide(z319=(174.351,685.206))z319
+ ..controls hide(z320=(169.071,687))z320 and hide(z321=(165.484,688))z321..hide(z322=(161.4,688))z322
+ ..controls hide(z323=(149.843,688))z323 and hide(z324=(143,682.405))z324..hide(z325=(143,673.251))z325
+ ..controls hide(z326=(143,668.468))z326 and hide(z327=(145.117,665.081))z327..hide(z328=(149.544,662.989))z328
+ ..controls hide(z329=(152.234,661.793))z329 and hide(z330=(157.514,660.199))z330..hide(z331=(164.289,658.705))z331
+ ..controls hide(z332=(168.772,657.708))z332 and hide(z333=(171,655.616))z333..hide(z334=(171,651.83))z334
+ ..controls hide(z335=(171,646.45))z335 and hide(z336=(165.88,642.007))z336..hide(z337=(158.61,642.007))z337
+ ..controls hide(z338=(151.337,642.007))z338 and hide(z339=(146.092,645.765))z339..hide(z340=(146.092,651.133))z340
+ --hide(z341=(146.092,655.218))z341--cycle;
+ %renewcolore;
+ %draw PreeditedPath7;
+ %dotlabels.rt(290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341);
+ PreeditedPath8 = hide(z342=(51.708,574.571))z342--hide(z343=(54.1987,578.655))z343--hide(z344=(53.8003,579.851))z344
+ --hide(z345=(39.6528,579.453))z345..controls hide(z346=(35.9666,582.442))z346 and hide(z347=(32.3799,583))z347..hide(z348=(27.498,583))z348
+ ..controls hide(z349=(23.1143,583))z349 and hide(z350=(18.0332,581.84))z350..hide(z351=(13.9485,579.851))z351
+ ..controls hide(z352=(8.36914,576.663))z352 and hide(z353=(6.00024,571.781))z353..hide(z354=(6.00024,565.704))z354
+ ..controls hide(z355=(6.00024,558.331))z355 and hide(z356=(10.3838,553.25))z356..hide(z357=(17.4355,552.453))z357
+ --hide(z358=(9.5647,546.376))z358..controls hide(z359=(8.56836,544.881))z359 and hide(z360=(8.59058,543.586))z360..hide(z361=(8.59058,542.092))z361
+ ..controls hide(z362=(8.59058,539.302))z362 and hide(z363=(10.2419,537.708))z363..hide(z364=(14.646,536.314))z364
+ --hide(z365=(5.97827,531.631))z365..controls hide(z366=(4.5835,530.834))z366 and hide(z367=(3.00049,527.148))z367..hide(z368=(3.00049,524.059))z368
+ ..controls hide(z369=(3.00049,514.992))z369 and hide(z370=(11.9448,509.001))z370..hide(z371=(24.7087,509.001))z371
+ --hide(z372=(25.406,512))z372..controls hide(z373=(16.7383,512))z373 and hide(z374=(11.0005,517.001))z374..hide(z375=(11.0005,524.258))z375
+ ..controls hide(z376=(11.0005,528.741))z376 and hide(z377=(13.4961,532.826))z377..hide(z378=(17.3359,534.519))z378
+ ..controls hide(z379=(18.9299,535.317))z379 and hide(z380=(21.72,535.694))z380..hide(z381=(28.5945,535.694))z381
+ --hide(z382=(28.5945,535.605))z382..controls hide(z383=(39.8525,535.605))z383 and hide(z384=(44.0005,533.29))z384..hide(z385=(44.0005,526.748))z385
+ ..controls hide(z386=(44.0005,518.18))z386 and hide(z387=(36.0168,512))z387..hide(z388=(25.406,512))z388
+ --hide(z389=(24.7087,509.001))z389..controls hide(z390=(39.7529,509.001))z390 and hide(z391=(52.0002,518.341))z391..hide(z392=(52.0002,530.335))z392
+ ..controls hide(z393=(52.0002,537.509))z393 and hide(z394=(47.0586,541.606))z394..hide(z395=(39.8525,541.606))z395
+ --hide(z396=(23.9119,541.606))z396..controls hide(z397=(18.7312,541.606))z397 and hide(z398=(16.3401,543.073))z398..hide(z399=(16.3401,546.376))z399
+ ..controls hide(z400=(16.3401,547.671))z400 and hide(z401=(17.1372,548.767))z401..hide(z402=(19.7275,550.959))z402
+ ..controls hide(z403=(20.3254,551.457))z403 and hide(z404=(20.5247,551.656))z404..hide(z405=(20.9231,552.055))z405
+ ..controls hide(z406=(21.9194,551.955))z406 and hide(z407=(22.5173,552))z407..hide(z408=(23.3145,552))z408
+ --hide(z409=(25.0081,555))z409..controls hide(z410=(18.3328,555))z410 and hide(z411=(14.0005,560.279))z411..hide(z412=(14.0005,568.095))z412
+ ..controls hide(z413=(14.0005,575.766))z413 and hide(z414=(17.6313,580))z414..hide(z415=(23.9119,580))z415
+ --hide(z416=(23.9121,580))z416..controls hide(z417=(30.687,580))z417 and hide(z418=(35.001,574.52))z418..hide(z419=(35.001,566.202))z419
+ ..controls hide(z420=(35.001,559.726))z420 and hide(z421=(30.926,555))z421..hide(z422=(25.0081,555))z422
+ --hide(z423=(23.3145,552))z423..controls hide(z424=(27.5986,552))z424 and hide(z425=(32.8789,553.836))z425..hide(z426=(36.9636,556.637))z426
+ ..controls hide(z427=(41.447,559.925))z427 and hide(z428=(43.0007,563.91))z428..hide(z429=(43.0007,569.191))z429
+ ..controls hide(z430=(43.0007,571.183))z430 and hide(z431=(42.8757,572.478))z431..cycle;
+ %renewcolore;
+ %draw PreeditedPath8;
+ %dotlabels.rt(342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431);
+ PreeditedPath9 = hide(z432=(57.6858,602.766))z432--hide(z433=(63.2651,602.766))z433..controls hide(z434=(65.0586,602.766))z434 and hide(z435=(66.0002,601.67))z435..hide(z436=(66.0002,598.681))z436
+ --hide(z437=(66.0002,547.073))z437..controls hide(z438=(66.0002,540.796))z438 and hide(z439=(65.6814,540.099))z439..hide(z440=(62.0698,539.899))z440
+ --hide(z441=(57.4868,539.601))z441--hide(z442=(57.4868,536.612))z442..controls hide(z443=(67.4497,536.91))z443 and hide(z444=(67.4497,537))z444..hide(z445=(69.9404,537))z445
+ ..controls hide(z446=(72.4312,537))z446 and hide(z447=(72.4312,537.299))z447..hide(z448=(82.394,537))z448
+ --hide(z449=(82.394,539.601))z449--hide(z450=(77.811,539.899))z450..controls hide(z451=(74.4236,540.099))z451 and hide(z452=(73.9998,540.796))z452..hide(z453=(73.9998,547.073))z453
+ --hide(z454=(73.9998,608.445))z454--hide(z455=(73.228,609.242))z455..controls hide(z456=(68.8442,607.548))z456 and hide(z457=(65.5564,606.751))z457..cycle;
+ %renewcolore;
+ %draw PreeditedPath9;
+ %dotlabels.rt(432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457);
+ PreeditedPath10 = hide(z458=(112.183,583))z458--hide(z459=(110.389,580))z459..controls hide(z460=(119.555,580))z460 and hide(z461=(126,570.185))z461..hide(z462=(126,556.836))z462
+ ..controls hide(z463=(126,545.379))z463 and hide(z464=(121.046,538.007))z464..hide(z465=(113.179,538.007))z465
+ ..controls hide(z466=(103.416,538.007))z466 and hide(z467=(96.9998,547.652))z467..hide(z468=(96.9998,561.917))z468
+ ..controls hide(z469=(96.9998,573.873))z469 and hide(z470=(101.725,580))z470..hide(z471=(110.389,580))z471
+ --hide(z472=(110.389,580))z472--hide(z473=(112.183,583))z473..controls hide(z474=(97.637,583))z474 and hide(z475=(88,572.998))z475..hide(z476=(88,558.53))z476
+ ..controls hide(z477=(88,544.482))z477 and hide(z478=(96.6931,535.007))z478..hide(z479=(109.294,535.007))z479
+ ..controls hide(z480=(124.637,535.007))z480 and hide(z481=(135,545.63))z481..hide(z482=(135,560.523))z482
+ ..controls hide(z483=(135,573.973))z483 and hide(z484=(125.485,583))z484..cycle;
+ %renewcolore;
+ %draw PreeditedPath10;
+ %dotlabels.rt(458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484);
+ PreeditedPath11 = hide(z485=(154,608.445))z485--hide(z486=(152.833,609.242))z486..controls hide(z487=(148.449,607.548))z487 and hide(z488=(145.161,606.751))z488..hide(z489=(137.29,605.556))z489
+ --hide(z490=(137.29,602.766))z490--hide(z491=(142.87,602.766))z491..controls hide(z492=(144.663,602.766))z492 and hide(z493=(146,601.67))z493..hide(z494=(146,598.681))z494
+ --hide(z495=(146,552.154))z495..controls hide(z496=(146,545.977))z496 and hide(z497=(145.82,543.287))z497..hide(z498=(144.563,536.313))z498
+ --hide(z499=(146.157,535.715))z499--hide(z500=(150.143,539.302))z500..controls hide(z501=(154.128,536.711))z501 and hide(z502=(157.714,535.805))z502..hide(z503=(162.995,535.805))z503
+ ..controls hide(z504=(166.88,535.805))z504 and hide(z505=(169.47,536.474))z505..hide(z506=(171.563,537.907))z506
+ --hide(z507=(181.526,545.08))z507..controls hide(z508=(185.909,548.268))z508 and hide(z509=(190,556.538))z509..hide(z510=(190,563.811))z510
+ ..controls hide(z511=(190,575.368))z511 and hide(z512=(182.277,583))z512..hide(z513=(171.364,583))z513
+ ..controls hide(z514=(166.681,583))z514 and hide(z515=(161.799,581.468))z515..hide(z516=(159.209,579.253))z516
+ --hide(z517=(153.999,573.674))z517--hide(z518=(156.319,572.578))z518..controls hide(z519=(159.109,575.468))z519 and hide(z520=(162.994,577))z520..hide(z521=(167.079,577))z521
+ ..controls hide(z522=(175.448,577))z522 and hide(z523=(180.999,570.288))z523..hide(z524=(180.999,559.726))z524
+ ..controls hide(z525=(180.999,548.567))z525 and hide(z526=(174.909,540.805))z526..hide(z527=(166.282,540.805))z527
+ ..controls hide(z528=(161.101,540.805))z528 and hide(z529=(153.999,543.988))z529..hide(z530=(153.999,546.176))z530
+ --hide(z531=(153.999,567.597))z531..controls hide(z532=(153.999,568.991))z532 and hide(z533=(154.892,570.785))z533..hide(z534=(156.319,572.578))z534
+ --hide(z535=(153.999,573.674))z535--cycle;
+ %renewcolore;
+ %draw PreeditedPath11;
+ %dotlabels.rt(485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535);
+ PreeditedPath12 = hide(z536=(226,545.08))z536--hide(z537=(225.662,536.612))z537..controls hide(z538=(232.137,536.911))z538 and hide(z539=(232.137,537))z539..hide(z540=(233.433,537))z540
+ ..controls hide(z541=(233.931,537))z541 and hide(z542=(236.421,537.259))z542..hide(z543=(240.805,537))z543
+ --hide(z544=(240.805,540))z544--hide(z545=(236.92,539.8))z545..controls hide(z546=(234.529,539.9))z546 and hide(z547=(234,540.697))z547..hide(z548=(234,545.579))z548
+ --hide(z549=(234,563.811))z549..controls hide(z550=(234,578.357))z550 and hide(z551=(229.85,583))z551..hide(z552=(218.388,583))z552
+ ..controls hide(z553=(214.104,583))z553 and hide(z554=(210.119,582.11))z554..hide(z555=(206.333,580.249))z555
+ --hide(z556=(200.985,577.061))z556--hide(z557=(200.985,570.585))z557--hide(z558=(203.643,569.888))z558
+ --hide(z559=(204.938,572.976))z559..controls hide(z560=(207.031,577.659))z560 and hide(z561=(208.027,578))z561..hide(z562=(212.61,578))z562
+ ..controls hide(z563=(221.975,578))z563 and hide(z564=(225.861,574.417))z564..hide(z565=(226.16,565.604))z565
+ --hide(z566=(226.001,562.416))z566--hide(z567=(226,549.264))z567..controls hide(z568=(223.146,545.18))z568 and hide(z569=(216.947,541.804))z569..hide(z570=(213.109,541.804))z570
+ ..controls hide(z571=(209.124,541.804))z571 and hide(z572=(205,545.301))z572..hide(z573=(205,549.364))z573
+ ..controls hide(z574=(205,553.051))z574 and hide(z575=(207.247,556.538))z575..hide(z576=(210.618,558.431))z576
+ ..controls hide(z577=(213.083,559.925))z577 and hide(z578=(218.507,561.32))z578..hide(z579=(226.001,562.416))z579
+ --hide(z580=(226.16,565.604))z580--hide(z581=(216.296,563.81))z581..controls hide(z582=(202.747,561.32))z582 and hide(z583=(197,556.637))z583..hide(z584=(197,547.969))z584
+ ..controls hide(z585=(197,540.198))z585 and hide(z586=(201.708,535.804))z586..hide(z587=(209.621,535.804))z587
+ ..controls hide(z588=(211.415,535.804))z588 and hide(z589=(213.108,536.07))z589..cycle;
+ %renewcolore;
+ %draw PreeditedPath12;
+ %dotlabels.rt(536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589);
+ PreeditedPath13 = hide(z590=(245.986,602.766))z590--hide(z591=(251.565,602.766))z591..controls hide(z592=(253.359,602.766))z592 and hide(z593=(254,601.67))z593..hide(z594=(254,598.681))z594
+ --hide(z595=(254,547.073))z595..controls hide(z596=(254,540.796))z596 and hide(z597=(253.706,540.099))z597..hide(z598=(250.37,539.899))z598
+ --hide(z599=(245.787,539.601))z599--hide(z600=(245.787,536.612))z600..controls hide(z601=(255.75,536.91))z601 and hide(z602=(255.75,537))z602..hide(z603=(258.24,537))z603
+ ..controls hide(z604=(260.731,537))z604 and hide(z605=(260.731,537.299))z605..hide(z606=(270.694,537))z606
+ --hide(z607=(270.694,539.601))z607--hide(z608=(266.111,539.899))z608..controls hide(z609=(262.724,540.099))z609 and hide(z610=(262,540.796))z610..hide(z611=(262,547.073))z611
+ --hide(z612=(262,608.445))z612--hide(z613=(261.528,609.242))z613..controls hide(z614=(257.144,607.548))z614 and hide(z615=(253.856,606.751))z615..cycle;
+ %renewcolore;
+ %draw PreeditedPath13;
+ %dotlabels.rt(590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% second featpost part
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ fill rigorousfearpath( black, sray );
+ numeric k;
+ for k = 1 upto 13:
+ unfill closedpathinspace( PreeditedPath[k], 8, converterfunc );
+ endfor;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% That's it!
+
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/aledlogo.mp b/graphics/metapost/contrib/macros/featpost/example/aledlogo.mp
new file mode 100644
index 0000000000..15844686c0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/aledlogo.mp
@@ -0,0 +1,183 @@
+% aledlogo.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+verbatimtex
+\documentclass{article}
+\usepackage{marvosym}
+\begin{document}
+etex
+
+vardef calxtep( expr Beglim, Endlim, Instep ) =
+ ((Endlim-Beglim)/floor((Endlim-Beglim)/Instep))
+enddef;
+
+def drawfila( expr H, Ray, Astart, Afinis, Astep, Sray ) =
+ begingroup
+ save a, c, p, n, i, s, l, r, u, d, inc, rad, ba, bb, vertex;
+ numeric a, n, i, s, inc, sa, sb;
+ color c, p, l, r, u, d, rad, vertex;
+ path shape;
+ boolean ba, bb;
+ picture aux;
+ inc = -5;
+ sa = 2;
+ sb = 0.27;
+ vertex = (-0.7,0.9,0.15);
+ n = floor((Afinis-Astart)/Astep);
+ s = (Afinis-Astart)/n;
+ for i=0 upto n:
+ a := Astart+i*s;
+ p := (Ray*cosd(a),Ray*sind(a),H);
+ rad := (cosd(a),sind(a),0);
+ u := Sray*(blue*cosd(inc)+rad*sind(inc));
+ r := Sray*ncrossprod( p-f, u );
+ l := -r;
+ d := -u;
+ ba := (ypart rp(p)) < (ypart rp(vertex))
+ + sa*((xpart rp(p))-(xpart rp(vertex)));
+ bb := (ypart rp(p)) > (ypart rp(vertex))
+ + sb*((xpart rp(p))-(xpart rp(vertex)));
+ shape := rp(p+r+d)--rp(p+r+u)--rp(p+l+u)--rp(p+l+d)--cycle;
+ if ( uniformdeviate(1) < 0.5 ):
+%% if ( uniformdeviate(1) < 0.7 ): %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% if ( ba and bb ):
+ c := black;
+ unfill shape;
+ draw shape withcolor c;
+ aux := thelabel( btex \EyesDollar etex scaled (ps( p, 7 )), rp(p) );
+ draw aux withcolor c;
+%%%% fill rp(p+r+d)--rp(p+r+u)--rp(p+l)--cycle withcolor c;
+ else:
+%%%% c := 0.5white;
+%% c := 0.5red;
+ c := black;
+ unfill shape;
+ draw shape withcolor c;
+ aux := thelabel( btex \EURhv etex scaled (ps( p, 9 )), rp(p) );
+ draw aux withcolor c;
+%%%% fill rp(p+l+d)--rp(p+l+u)--rp(p+r)--cycle withcolor c;
+ fi;
+%% fill rp(p+r+u)--rp(p+l+u)--rp(p+d)--cycle withcolor c;
+%%%% fill rp(p+r)--rp(p+u)--rp(p+l)--rp(p+d)--cycle withcolor c;
+%%%% fill shape withcolor c;
+%%%% draw shape withcolor white withpen pensquare scaled 3pt;
+%%%% fill rigorousfearpath( p, Sray ) withcolor c;
+ endfor
+ endgroup
+enddef;
+
+%SphericalDistortion := true;
+
+beginfig(1);
+ numeric heig, bray, tray, vang, sray, ldis, fdis, cwid, cnum, ylen;
+ heig = 0.35;
+ bray = 0.95;
+ tray = 2.25;
+ vang = 95;
+ sray = 0.029;
+ ldis = 0.02;
+ fdis = 0.075;
+ cwid = 0.15;
+ cnum = 2;
+ ylen = -0.16;
+ f := (0,ylen,heig);
+ viewcentr := (0,tray,heig);
+ color thered;
+ thered = 0.66red;
+ numeric degperrad, asector, s;
+ degperrad = 180.0/3.14159;
+ numeric a, h, astep, ray, raystep, hstep, abeg, aend, astart, afinis, awid;
+ raystep = calxtep( bray, tray, fdis );
+ hstep = raystep/(tray-bray);
+ h = 1;
+ abeg = 0.5*(180-vang);
+ aend = 180-abeg;
+ for ray=tray step -raystep until bray:
+ awid := degperrad*cwid/ray;
+ asector := (vang-cnum*awid)/(cnum+1);
+ astep := degperrad*(ldis+2*sray)/ray;
+ for s=0 upto cnum:
+ astart := abeg+s*(asector+awid);
+ afinis := astart+asector;
+ drawfila( h, ray, astart, afinis, astep, sray );
+ endfor;
+ h := h - hstep;
+ endfor;
+ picture stor;
+ stor = currentpicture;
+ bboxmargin := 2cm;
+ fill bbox stor withcolor thered;
+ draw stor;
+endfig;
+
+beginfig(2);
+ numeric angout, anglow, rayout, distra, lifactor, lidist, madist;
+ numeric maleng, numstp, madstp, malstp, mafrac, i, j, begy, endy, xcoord;
+ color cenpos, vechor, vecver, yela, yelb, dblu, mgre;
+ pair ulc, llc, urc;
+ picture block;
+ angout=30;
+ anglow=-6;
+ lifactor=2;
+ lidist=3.5;
+ mafrac=0.6;
+ numstp=25;
+ f:=(7,6,5);
+ viewcentr:=(0,-1.4,0);
+ Spread:=35;
+ yela=(1,1,0.7);
+ yelb=(1,1,0.45);
+ background:=yelb;
+ dblu=0.4blue;
+ mgre=0.6green;
+ rayout=sind(angout);
+ distra=cosd(angout);
+ llc = point 0 of VGAborder;
+ ulc = point 3 of VGAborder;
+ urc = point 2 of VGAborder;
+ madist = abs( ulc-llc );
+ maleng = abs( urc-ulc );
+ malstp = maleng/numstp;
+ madstp = 5*malstp/3;
+ z2 = mafrac*(malstp,madstp);
+ z1 = mafrac*(0,madstp);
+ z3 = mafrac*(malstp,0);
+ fill origin--z1--z2--z3--cycle shifted (0.5*(1-mafrac)*(malstp,madstp))
+ withcolor mgre;
+ block = currentpicture;
+ currentpicture := nullpicture;
+ fill VGAborder withcolor dblu;
+ for i=0 upto numstp-1:
+ begy:= (ypart ulc) + madstp*(1+normaldeviate);
+ endy:= (ypart 0.5[llc,ulc]) + 4*madstp*normaldeviate;
+ xcoord:= (xpart llc) + i*malstp;
+ for j=begy step -madstp until endy:
+ draw block shifted (xcoord,j);
+ endfor;
+ endfor;
+ clip currentpicture to VGAborder;
+ cenpos:=distra*(-cosd(30)*cosd(anglow),-sind(30)*cosd(anglow),sind(anglow));
+ vechor:=rayout*(sind(30),-cosd(30),0);
+ vecver:=rayout*(cosd(30)*sind(anglow),sind(30)*sind(anglow),cosd(anglow));
+ drawoptions( withcolor yelb );
+ whatisthis(cenpos,vechor,vecver,3lidist,1+3*(lifactor-1));
+ fill rigorousfearpath( black, 1 ) withcolor yela;
+ cenpos:=distra*(cosd(30)*cosd(anglow),-sind(30)*cosd(anglow),sind(anglow));
+ vechor:=rayout*(sind(30),cosd(30),0);
+ vecver:=rayout*(-cosd(30)*sind(anglow),sind(30)*sind(anglow),cosd(anglow));
+ drawoptions( withcolor yelb );
+ whatisthis(cenpos,vechor,vecver,lidist,lifactor);
+ cenpos:=distra*(0,cosd(anglow),sind(anglow));
+ vechor:=rayout*(-1,0,0);
+ vecver:=rayout*(0,-sind(anglow),cosd(anglow));
+ whatisthis(cenpos,vechor,vecver,lidist,lifactor);
+ drawoptions();
+ produce_auto_scale;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/allgreatideas.mp b/graphics/metapost/contrib/macros/featpost/example/allgreatideas.mp
new file mode 100644
index 0000000000..1a0cb08319
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/allgreatideas.mp
@@ -0,0 +1,166 @@
+% allgreatideas.mp
+% L. Nobre G.
+% 2007
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,marvosym}
+\begin{document}
+etex
+
+path evilcrown;
+evilcrown =
+(153.18465,-56.69263)..controls (190.86575,-56.57867) and (190.82774,0)
+ ..(153.07059,0)..controls (152.44896,3.93404) and (151.82733,7.86807)
+ ..(151.2057,11.80211)..controls (151.18675,11.92209) and (151.1577,12.10594)
+ ..(151.1842,12.11972)..controls (154.27016,13.72318) and (157.32425,15.3877)
+ ..(160.34335,17.11494)..controls (165.81866,20.24739) and (171.17494,23.58395)
+ ..(176.38683,27.13756)..controls (181.43541,30.5798) and (186.34438,34.22295)
+ ..(191.08667,38.0763)..controls (195.67404,41.80377) and (200.1013,45.72461)
+ ..(204.33633,49.84808)..controls (208.429,53.83293) and (212.33783,58.00284)
+ ..(216.02922,62.36209)..controls (219.59828,66.57689) and (222.95978,70.96365)
+ ..(226.0778,75.52231)..controls (229.09842,79.93854) and (231.8863,84.51001)
+ ..(234.40594,89.2301)..controls (236.85533,93.81862) and (239.0473,98.54037)
+ ..(240.94894,103.38168)..controls (242.80696,108.11192) and (244.38446,112.94789)
+ ..(245.6573,117.86803)..controls (246.90929,122.70755) and (247.86414,127.61938)
+ ..(248.5006,132.57758)..controls (249.13164,137.49362) and (249.44836,142.44493)
+ ..(249.44836,147.4013)..controls (249.44836,152.35768) and (249.13164,157.30899)
+ ..(248.5006,162.22504)..controls (247.86414,167.18323) and (246.9093,172.09506)
+ ..(245.6573,176.93459)..controls (244.38446,181.85472) and (242.80696,186.69069)
+ ..(240.94894,191.42093)..controls (239.0473,196.26224) and (236.85533,200.984)
+ ..(234.40594,205.57251)..controls (231.8863,210.2926) and (229.09842,214.86407)
+ ..(226.0778,219.2803)..controls (222.95978,223.83896) and (219.59828,228.22572)
+ ..(216.02922,232.44052)..controls (212.33783,236.79977) and (208.429,240.96968)
+ ..(204.33633,244.95453)..controls (200.10129,249.078) and (195.67404,252.99884)
+ ..(191.08667,256.72632)..controls (221.70206,191.55792) and (196.61552,121.88226)
+ ..(141.23656,76.86674)..controls (141.1039,76.75891) and (140.91652,76.91801)
+ ..(140.87842,77.15913)..controls (129.05978,151.95451) and (117.24117,226.74988)
+ ..(105.42253,301.54526)..controls (89.43553,212.92584) and (73.44852,124.30644)
+ ..(57.46152,35.68703)..controls (57.4327,35.52724) and (57.35529,35.3694)
+ ..(57.2022,35.33107)..controls (53.45178,34.39197) and (49.65408,33.54193)
+ ..(45.81209,32.78442)..controls (45.75635,32.77344) and (45.69954,33.12679)
+ ..(45.65913,33.3782)..controls (30.43942,128.07872) and (15.21971,222.77922)
+ ..(0,317.47974)..controls (-15.23506,222.68375) and (-30.47012,127.88777)
+ ..(-45.70518,33.09178)..controls (-45.75298,32.79448) and (-46.14847,32.85071)
+ ..(-46.49614,32.92035)..controls (-50.0591,33.634) and (-53.58371,34.42728)
+ ..(-57.06757,35.2974)..controls (-57.34285,35.36615) and (-57.45767,35.66574)
+ ..(-57.50981,35.95477)..controls (-73.48071,124.48494) and (-89.45163,213.01509)
+ ..(-105.42253,301.54526)..controls (-117.2524,226.67888) and (-129.08224,151.81252)
+ ..(-140.91211,76.94614)..controls (-140.93776,76.78383) and (-141.17343,76.81525)
+ ..(-141.36346,76.96997)..controls (-196.57445,121.92412) and (-221.60674,191.40785)
+ ..(-191.21811,256.4458)..controls (-191.15338,256.58432) and (-191.08727,256.72585)
+ ..(-191.10054,256.71506)..controls (-195.68295,252.99094) and (-200.10558,249.07385)
+ ..(-204.33633,244.95453)..controls (-208.429,240.96968) and (-212.33783,236.79977)
+ ..(-216.02922,232.44052)..controls (-219.59828,228.22572) and (-222.95978,223.83896)
+ ..(-226.0778,219.2803)..controls (-229.09842,214.86407) and (-231.8863,210.2926)
+ ..(-234.40594,205.57251)..controls (-236.85533,200.984) and (-239.0473,196.26224)
+ ..(-240.94894,191.42093)..controls (-242.80696,186.69069) and (-244.38446,181.85472)
+ ..(-245.6573,176.93459)..controls (-246.90929,172.09506) and (-247.86414,167.18323)
+ ..(-248.5006,162.22504)..controls (-249.13164,157.30899) and (-249.44836,152.35768)
+ ..(-249.44836,147.4013)..controls (-249.44836,142.44493) and (-249.13164,137.49362)
+ ..(-248.5006,132.57758)..controls (-247.86414,127.61938) and (-246.9093,122.70755)
+ ..(-245.6573,117.86803)..controls (-244.38446,112.94789) and (-242.80696,108.11192)
+ ..(-240.94894,103.38168)..controls (-239.0473,98.54037) and (-236.85533,93.81862)
+ ..(-234.40594,89.2301)..controls (-231.8863,84.51001) and (-229.09842,79.93854)
+ ..(-226.0778,75.52231)..controls (-222.95978,70.96365) and (-219.59828,66.57689)
+ ..(-216.02922,62.36209)..controls (-212.33783,58.00284) and (-208.429,53.83293)
+ ..(-204.33633,49.84808)..controls (-200.10129,45.72461) and (-195.67404,41.80377)
+ ..(-191.08667,38.0763)..controls (-186.34438,34.22295) and (-181.43541,30.5798)
+ ..(-176.38683,27.13756)..controls (-171.17494,23.58395) and (-165.81866,20.2474)
+ ..(-160.34335,17.11494)..controls (-157.3213,15.386) and (-154.26416,13.71991)
+ ..(-151.17513,12.115)..controls (-151.1577,12.10596) and (-151.16463,12.06212)
+ ..(-151.16982,12.0293)..controls (-151.8034,8.01953) and (-152.437,4.00977)
+ ..(-153.07059,0)..controls (-190.8658,0) and (-190.8658,-56.69281)
+ ..(-153.07059,-56.69281)..controls (-51.1263,-56.69281) and (50.818,-56.69281)
+ ..(152.76228,-56.69281)..controls (152.90308,-56.69281) and (153.12411,-56.69281)
+ ..cycle;
+
+path foimar, monitor, ecran;
+foimar=
+(-0.00192,-12.55074)..controls (-0.64168,-11.78833) and (-1.28142,-11.02591)
+ ..(-1.92117,-10.2635)..controls (-7.51778,-14.95969) and (-13.11438,-19.65587)
+ ..(-18.71098,-24.35205)..controls (-17.00328,-26.38718) and (-15.29556,-28.42232)
+ ..(-13.58786,-30.45744)..controls (-12.30708,-31.98378) and (-12.30708,-31.98378)
+ ..(-2.1138,-28.6326)..controls (-3.95111,-27.57187) and (-6.11067,-26.96915)
+ ..(-7.48247,-25.33434)..controls (-3.921,-22.34586) and (-0.35953,-19.35738)
+ ..(3.20195,-16.3689)..controls (11.91702,-25.94652) and (23.26077,-25.99902)
+ ..(31.85223,-20.78899)..controls (31.89467,-20.76324) and (31.94853,-20.76074)
+ ..(31.98587,-20.79207)..controls (36.66202,-24.71588) and (41.33817,-28.6397)
+ ..(46.01431,-32.5635)..controls (47.72202,-30.52838) and (49.42972,-28.49324)
+ ..(51.13742,-26.45813)..controls (46.8044,-22.82224) and (42.47137,-19.18634)
+ ..(38.13835,-15.55045)..controls (38.10356,-15.52124) and (38.13104,-15.47006)
+ ..(38.16563,-15.42989)..controls (49.17552,-2.64243) and (48.7403,21.25578)
+ ..(12.84161,37.23851)..controls (42.09344,20.35042) and (41.44891,0.09486)
+ ..(31.70877,-10.05847)..controls (31.67998,-10.08849) and (31.63301,-10.09172)
+ ..(31.60129,-10.06511)..controls (23.35864,-3.1486) and (15.11601,3.7679)
+ ..(6.87337,10.68442)..controls (8.36761,12.46516) and (9.86185,14.2459)
+ ..(11.3561,16.02664)..controls (1.80319,20.141) and (1.80319,20.141)
+ ..(-0.75836,17.0883)..controls (-1.26715,17.51523) and (-1.77594,17.94215)
+ ..(-2.28471,18.36908)..controls (-3.99242,16.33397) and (-5.70012,14.29883)
+ ..(-7.40782,12.2637)..controls (-6.89905,11.83678) and (-6.39026,11.40985)
+ ..(-5.88147,10.98293)..controls (-7.16225,9.45657) and (-8.44302,7.93024)
+ ..(-9.7238,6.40388)..controls (-7.18245,4.27141) and (-4.64111,2.13893)
+ ..(-2.09976,0.00645)..controls (-2.09598,0.00328) and (-2.09096,0.00133)
+ ..(-2.08818,0.00462)..controls (-0.8087,1.52943) and (0.47078,3.05423)
+ ..(1.75026,4.57904)..controls (9.45714,-1.88791) and (17.16402,-8.35486)
+ ..(24.8709,-14.82181)..controls (24.88516,-14.83379) and (24.88658,-14.85393)
+ ..(24.87306,-14.85988)..controls (17.92508,-17.91718) and (9.47896,-17.05374)
+ ..(3.05269,-9.99147)..controls (2.03615,-10.84447) and (1.0196,-11.69746)
+ ..(0.00307,-12.55046)..controls (0.0015,-12.55177) and (-0.00072,-12.55217)
+ ..cycle;
+monitor =
+(24.90654,-57.06877)..controls (37.60521,-57.06877) and (50.3039,-57.06877)
+ ..(63.00256,-57.06877)..controls (68.00955,-57.06877) and (72.06851,-53.00981)
+ ..(72.06851,-48.00282)..controls (72.06851,-16.00095) and (72.06851,16.00095)
+ ..(72.06851,48.00282)..controls (72.06851,53.00981) and (68.00955,57.06877)
+ ..(63.00256,57.06877)..controls (21.00085,57.06877) and (-21.00085,57.06877)
+ ..(-63.00256,57.06877)..controls (-68.00955,57.06877) and (-72.06851,53.00981)
+ ..(-72.06851,48.00282)..controls (-72.06851,16.00095) and (-72.06851,-16.00095)
+ ..(-72.06851,-48.00282)..controls (-72.06851,-53.00981) and (-68.00955,-57.06877)
+ ..(-63.00256,-57.06877)..controls (-50.3039,-57.06877) and (-37.60521,-57.06877)
+ ..(-24.90654,-57.06877)..controls (-24.90654,-62.05008) and (-24.90654,-67.03139)
+ ..(-24.90654,-72.0127)..controls (-75.71588,-74.00522) and (-75.71588,-74.00522)
+ ..(-77.7084,-90.89185)..controls (-61.76822,-90.89185) and (-45.82803,-90.89185)
+ ..(-29.88785,-90.89185)..controls (-29.59856,-89.94563) and (-11.30861,-89.9454)
+ ..(0,-89.9454)..controls (11.30861,-89.9454) and (29.59856,-89.94563)
+ ..(29.88785,-90.89185)..controls (45.82803,-90.89185) and (61.76822,-90.89185)
+ ..(77.7084,-90.89185)..controls (75.71588,-74.00522) and (75.71588,-74.00522)
+ ..(24.90654,-72.0127)..controls (24.90654,-67.03139) and (24.90654,-62.05008)
+ ..cycle;
+ecran =
+(-59.11711,-44.11737)..controls (-19.7057,-44.11737) and (19.7057,-44.11737)
+ ..(59.11711,-44.11737)..controls (59.11711,-14.7058) and (59.11711,14.7058)
+ ..(59.11711,44.11737)..controls (19.7057,44.11737) and (-19.7057,44.11737)
+ ..(-59.11711,44.11737)..controls (-59.11711,14.7058) and (-59.11711,-14.7058)
+ ..cycle;
+
+
+beginfig(1);
+ picture topl, botl, rtil, aux;
+ numeric margbo, lscale, escale, fscale, dscale, i;
+ margbo = 80mm;
+ lscale = 8.5;
+ escale = lscale*0.05;
+ dscale = lscale*2;
+ topl = thelabel(btex All great ideas end--up being etex, origin)
+ scaled lscale;
+ botl = thelabel(btex distorted by Human Nature etex, origin) scaled lscale;
+ rtil = thelabel(btex \EyesDollar etex, origin ) scaled dscale;
+ draw (evilcrown shifted -center evilcrown) scaled escale
+ shifted ((-1.02,-0.05)*margbo);
+ draw foimar shifted (-4mm,0);
+ draw monitor;
+ draw ecran;
+ draw rtil shifted ((0.8,-0.05)*margbo);
+ aux = currentpicture;
+ currentpicture:=nullpicture;
+ draw aux scaled 1.93 shifted (0.45*margbo,0);
+ draw topl shifted (0,0.85*margbo);
+ draw botl shifted (0,-1.08margbo);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/anglinerigorouscircle.mp b/graphics/metapost/contrib/macros/featpost/example/anglinerigorouscircle.mp
new file mode 100644
index 0000000000..60eec4dc2f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/anglinerigorouscircle.mp
@@ -0,0 +1,111 @@
+% anglinerigorouscircle.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+%prologues := 3;
+prologues := 0;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color field, nalfa, ngamma, alfacnt, gammacnt, nazy, nax;
+ path alfa, gamma;
+ numeric nalfad, theta, radius, gammang, xxsize, yysize, zzsize;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos;
+ numeric thetarad, thetapos, nalfapos, ngammapos;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, deltalabel;
+ picture nalfalabel, ngammalabel, etalphalabel, alphalabel;
+ picture gammalabel, thetalabel;
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize = 0.8;
+ xxpos = 6;
+ yysize = 0.8;
+ yypos = 6;
+ zzsize = 1.3;
+ zzpos = 4;
+ field = (0.7,0,0.3);
+ fieldpos = 2;
+ deltarad = 0.45;
+ deltapos = 3;
+ nalfad = 1.0;
+ theta = 25;
+ thetarad = 0.3;
+ thetapos = 2;
+ nalfapos = 7;
+ gammang = 65;
+ ngammapos = 7;
+ etalpharad = 0.4;
+ etalphapos = 2;
+ alphapos = 6;
+ gammapos = 0;
+
+ xxlabel = btex $x_c$ etex;
+ yylabel = btex $y_c$ etex;
+ zzlabel = btex $z_c$ etex;
+ deltalabel = btex $\Delta$ etex;
+ fieldlabel = btex $\mathbf{B}$ etex;
+ thetalabel = btex $\theta$ etex;
+ nalfalabel = btex $\vec{n}_\alpha$ etex;
+ ngammalabel = btex $\vec{n}_\gamma$ etex;
+ etalphalabel= btex $\eta_\alpha$ etex;
+ alphalabel = btex $\alpha$ etex;
+ gammalabel = btex $\gamma$ etex;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,sind(theta),cosd(theta));
+ alfacnt = (0,0,nalfad*cosd(theta));
+ radius = nalfad*sind(theta);
+ alfa = rigorouscircle( alfacnt, (0,0,1), radius );
+ gammacnt = cosd(theta)*cosd(theta)*nalfa;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+ nazy = radius*sind(gammang)*ncrossprod( nalfa, axxc );
+ nax = radius*cosd(gammang)*ncrossprod( ayyc, nalfa );
+ ngamma = gammacnt+nax+nazy;
+ draw alfa dashed evenly;
+ draw gamma dashed evenly;
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+ drawarrow rp(orig)..rp(field);
+ drawarrow rp(orig)..rp(nalfa);
+ drawarrow rp(orig)..rp(ngamma);
+ drawarrow subpath (4,3) of alfa;
+ drawarrow subpath (8,7) of gamma;
+ anglinen( field, azzc, orig, deltarad, deltalabel, deltapos );
+ anglinen( azzc, nalfa, orig, thetarad, thetalabel, thetapos );
+ anglinen( ngamma, field, orig, etalpharad, etalphalabel, etalphapos );
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+ labeln( fieldlabel, rp(field), fieldpos );
+ labeln( nalfalabel, rp(nalfa), nalfapos );
+ labeln( ngammalabel, rp(ngamma), ngammapos );
+ labeln( alphalabel, point 3 of alfa, alphapos );
+ labeln( gammalabel, point 7 of gamma, gammapos );
+ pickup pencircle scaled 1.5;
+ draw rp(alfacnt);
+ draw rp(gammacnt);
+% produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/antimattermeteor.mp b/graphics/metapost/contrib/macros/featpost/example/antimattermeteor.mp
new file mode 100644
index 0000000000..473ab499a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/antimattermeteor.mp
@@ -0,0 +1,70 @@
+% antimattermeteor.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+f := (30,0,0);
+Spread := 100;
+
+numeric initdist, timestep, Gfactor, vprobe;
+inidist = 10;
+timestep = 0.1;
+Gfactor = 2;
+vprobe = 2.2;
+numeric numsteps, numtries, diststep, i, sigma, sigmang, angl;
+color inipos, inivel, dstp, veloc;
+path traject;
+pen bluepen, redpen;
+bluepen = pencircle scaled 0.9mm;
+redpen = pencircle scaled 0.55mm;
+
+def gravitfield( expr relatposprobe ) =
+ ( Gfactor*relatposprobe/((conorm( relatposprobe ))**3) )
+enddef;
+
+vardef parabol( expr index ) =
+ traject:=trajectorypath(
+ numsteps,
+ inipos+index*dstp,
+ inivel,
+ timestep)(gravitfield);
+ draw traject;
+enddef;
+
+vardef hiperbo( expr veloc ) =
+ traject:=trajectorypath(
+ numsteps,
+ inipos,
+ veloc,
+ timestep)(gravitfield);
+ draw traject;
+enddef;
+
+beginfig(1);
+ numtries = 36;
+ numsteps = 95;
+ sigma = 3.15;
+ sigmang = 16;
+ diststep = sigma/numtries;
+ dstp = (0,0,diststep);
+ inipos = (0,-inidist,0);
+ inivel = (0,vprobe,0);
+ drawoptions( withpen bluepen withcolor blue );
+ for i=-numtries upto numtries:
+ parabol( i );
+ endfor;
+ drawoptions( withpen redpen withcolor red );
+ for i=-numtries upto numtries:
+ angl := i*sigmang/numtries;
+ veloc := vprobe*(0,cosd(angl), sind(angl));
+ hiperbo( veloc );
+ endfor;
+ drawoptions();
+ fill fullcircle scaled (4cm) shifted (rp(black));
+ produce_auto_scale;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/avalzero.mp b/graphics/metapost/contrib/macros/featpost/example/avalzero.mp
new file mode 100644
index 0000000000..28ff275391
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/avalzero.mp
@@ -0,0 +1,85 @@
+% avalzero.mp
+% L. Nobre G.
+% 1999
+
+verbatimtex \documentclass{article} \usepackage{palatino} \usepackage{concmath} \usepackage{ccfonts} \begin{document} etex
+
+beginfig(1); % crescente
+ numeric u;
+ u = 1in;
+ draw fullcircle scaled 2u;
+ draw (left--right) scaled u;
+ draw (down--up) scaled u;
+ draw (left--up) scaled u;
+ draw (left--down) scaled u;
+ path int, cresc, out;
+ int = halfcircle rotated -90 scaled (2*1.414u) shifted ((-0.999,0)*u);
+ out = halfcircle rotated -90 scaled 2u;
+ cresc = buildcycle( int, reverse out );
+ fill cresc withcolor 0.5white;
+ draw cresc withpen pencircle scaled 1pt;
+endfig;
+
+beginfig(2); % trapezio
+ numeric u, ind, esq[], rig[], h[], ch;
+ pair hlab[];
+ u = 0.55in;
+ ch = 0;
+ for ind=0 upto 4:
+ esq[ind] = -abs(((normaldeviate)-1.5)*u);
+ rig[ind] = abs(((normaldeviate)+1.5)*u);
+ h[ind] = (abs((normaldeviate)+0.25)*u/4)+2mm+ch;
+ ch := ch+h[ind];
+ endfor;
+ draw (esq0,h0)--(rig0,h0);
+ for ind=1 upto 4:
+ draw (esq[ind-1],h[ind-1])--(esq[ind],h[ind]);
+ draw (rig[ind-1],h[ind-1])--(rig[ind],h[ind]);
+ draw ((esq[ind],h[ind])--(rig[ind],h[ind])) dashed evenly;
+ hlab[ind] = (0,(h[ind]+h[ind-1])/2);
+ endfor;
+ draw (esq4,h4)--(rig4,h4);
+ draw ((0,h0)--(0,h4)) dashed evenly;
+ label.rt( btex $h_1$ etex, hlab1 );
+ label.rt( btex $h_2$ etex, hlab2 );
+ label.rt( btex $h_3$ etex, hlab3 );
+ label.rt( btex $h_4$ etex, hlab4 );
+ label.top( btex $l_0$ etex, ((rig0+esq0)/2,h0) );
+ label.top( btex $l_1$ etex, ((rig1+esq1)/2,h1) );
+ label.top( btex $l_2$ etex, ((rig2+esq2)/2,h2) );
+ label.top( btex $l_3$ etex, ((rig3+esq3)/2,h3) );
+ label.top( btex $l_4$ etex, ((rig4+esq4)/2,h4) );
+endfig;
+
+beginfig(3); % olimpiad
+ numeric u;
+ u=1in;
+ path squr, arcir, vert, horiz, area;
+ squr = unitsquare scaled u;
+ arcir = halfcircle scaled 2u;
+ vert = (origin--up) scaled u shifted (u/2,0);
+ horiz = (origin--right) scaled u shifted (0,u/2);\
+ area = buildcycle( vert, arcir, horiz );
+ fill area withcolor 0.5white;
+ draw area withpen pencircle scaled 1pt;
+ draw squr;
+ draw arcir cutafter squr;
+ draw vert;
+ draw horiz;
+endfig;
+
+beginfig(4); % ortoproj
+ numeric u;
+ u=1in;
+ draw unitsquare scaled u;
+ path one, two;
+ one = (0.5,0)--(0.5,0.5)--(1,1);
+ two = (0,1)--(0.5,0.5);
+ draw one scaled u;
+ draw two scaled u;
+ draw currentpicture shifted (0,1.5u);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/badshreeyantra.mp b/graphics/metapost/contrib/macros/featpost/example/badshreeyantra.mp
new file mode 100644
index 0000000000..38e3f38432
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/badshreeyantra.mp
@@ -0,0 +1,73 @@
+% badshreeyantra.mp
+% L. Nobre G.
+% 2009
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, pA, pB, pC, pD;
+ u = 5cm;
+ path outercircle;
+ outercircle = fullcircle scaled (2*u);
+ draw outercircle;
+ pA = 0.8;
+ pB = 0.3;
+ pC = -0.2;
+ pD = 0.37;
+% message "pA: " & decimal(pA);
+% message "pB: " & decimal(pB);
+% message "pC: " & decimal(pC);
+% message "pD: " & decimal(pD);
+ pA := pA*u;
+ pB := pB*u;
+ pC := pC*u;
+ pD := pD*u;
+ z1 = (pD,pA);
+ z2 = (-pD,pA);
+ z3 = (0,pC);
+ draw z1--z2--z3--cycle;
+ z4 = ((-u,pB)--(u,pB)) intersectionpoint outercircle;
+ z5 = (-x4,pB);
+ z6 = (0,-u);
+ draw z4--z5--z6--cycle;
+ z7 = (pD,-pA);
+ z8 = (-pD,-pA);
+ z9 = (0,pB);
+ draw z7--z8--z9--cycle;
+ z10 = (x4,-pB);
+ z11 = (-x4,-pB);
+ z12 = (0,u);
+ draw z10--z11--z12--cycle;
+ z13 = (z10--z12) intersectionpoint (z1--z3);
+ z14 = (z10--z12) intersectionpoint (z4--z5);
+ z16 = (0,-pA);
+ z17 = (-x13,y13);
+ z15 = whatever[z17,z13];
+ z15 = whatever[z16,z14];
+ z18 = (-x15,y15);
+ draw z15--z16--z18--cycle;
+ z19 = (0,pA);
+ z20 = (x15,-y15);
+ z21 = (-x15,-y15);
+ draw z19--z20--z21--cycle;
+ z22 = (z3--(u,pC)) intersectionpoint (z14--z16);
+ z23 = (-x22,y22);
+ z24 = (0,y13);
+ draw z22--z23--z24--cycle;
+ z25 = (0,-y15);
+ z26 = (z3--z1) intersectionpoint (z22--z24);
+ z27 = (-x26,y26);
+ z28 = whatever[z19,z20];
+ z28 = whatever[z26,z27];
+ z29 = (-x28,y28);
+ draw z25--z28--z29--cycle;
+ z30 = (0,y10);
+ z31 = (z7--z9) intersectionpoint (z1--z3);
+ z32 = (-x31,y31);
+ z33 = whatever[z31,z32];
+ z33 = whatever[z22,z24];
+ z34 = (-x33,y33);
+ draw z30--z33--z34--cycle;
+% dotlabels.top(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34);
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/balllauncher.mp b/graphics/metapost/contrib/macros/featpost/example/balllauncher.mp
new file mode 100644
index 0000000000..aa945d745d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/balllauncher.mp
@@ -0,0 +1,115 @@
+% balllauncher.mp
+% L. Nobre G.
+% 2014
+
+prologues := 1;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(9);
+ ahlength := 8mm;
+ ahangle := 24;
+ numeric tlen, thig, plen, phig, llen, lhig, pray, sray, wray, tang;
+ numeric u, gmar, lang, hlen, rlen, pmal, pmah, aray, alim, aste, alen;
+ pen basepen, outerpen;
+ picture mydash, currpic[];
+ u = 2.5mm;
+ basepen = pencircle scaled 0.35u;
+ outerpen = pencircle scaled 1.1u;
+ mydash = dashpattern( off 1.5u on 1.2u off 1.5u);
+ pickup basepen;
+ gmar = 0.65u; % margem de bordadura
+ lang = 45; % angulo do lancador
+ tang = 45; % angulo da tabua (10)
+ hlen = 70u; % comprimento da linha horizontal
+ tlen = 120u; % comprimento da tabua
+ thig = 6u; % altura da tabua
+ plen = 60u; % comprimento da placa
+ phig = 35u; % altura da placa
+ pmal = 20u; % parte da placa que fica em cima da tabua
+ pmah = 15u; % parte da placa que fica abaixo da horizontal
+ llen = 60u; % comprimento da lancador (na inclinacao zero)
+ lhig = 15u; % altura do lancador (na inclinacao zero)
+ pray = 2u; % raio dos cantos arredondados da placa
+ sray = 5.7u; % raio da marca da esfera no lancador
+ wray = 1u; % raio do peso de marcacao do angulo
+ rlen = 20u; % comprimento da cordinha que segura o peso de marcacao
+ alim = 45; % angulo limite do tansferidor
+ aste = 5; % divisao da escala do transferidor
+ alen = 0.9u; % comprimento das marcas da escala do transferidor
+ aray = lhig-4*gmar; % raio do transferidor
+ path t, p, a, lo, li, sp;
+ li = (aray+3*gmar-llen,-gmar)--(aray+gmar,-gmar)--
+ (aray+gmar,lhig-3*gmar)--(aray+3*gmar-llen,lhig-3*gmar)--cycle;
+ lo = (aray+2*gmar-llen,-2*gmar)--(aray+2*gmar,-2*gmar)--
+ (aray+2*gmar,lhig-2*gmar)--(aray+2*gmar-llen,lhig-2*gmar)--cycle;
+ t = origin--(tlen,0)--(tlen,-thig)--(0,-thig)--cycle;
+ p = origin--(pmal,0)---(pmal,phig-pmah-pray)...(pmal-pray,phig-pmah)---
+ (pmal-plen+pray,phig-pmah)...(pmal-plen,phig-pmah-pray)---
+ (pmal-plen,pray-pmah)...(pmal-plen+pray,-pmah)---
+ (-pray,-pmah)...(0,pray-pmah)---cycle;
+ a = buildcycle( fullcircle rotated (-10), dir(90+alim)--origin--right );
+ numeric auxa, auxb, aucc;
+ auxa = aray+3*gmar-llen+sray;
+ auxb = 0.5*lhig-2*gmar;
+ z0 = (auxa,auxb);
+ sp = fullcircle scaled (2*sray) shifted z0;
+ unfill lo;
+ draw lo;
+ fill li;
+ unfill sp;
+ unfill a scaled (2*aray);
+ numeric i;
+ for i=aste step aste until alim-aste+90:
+ draw (aray-gmar)*dir(i)--(aray-gmar-alen)*dir(i);
+ endfor;
+ z1 = rlen*dir(90-lang+tang);
+ draw origin--z1;
+ fill fullcircle scaled (2*wray) shifted z1;
+ currpic0 = currentpicture shifted -z0 rotated 180;
+ pair haxis, vaxis, pos;
+ numeric velh, velv, halfaccel, maxtime;
+ halfaccel = -1.866; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ maxtime = 20; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ haxis = dir(180+tang-lang);
+ vaxis = dir(270+tang-lang);
+ velh = tlen/maxtime;
+ velv = velh*sind(lang-tang)/cosd(lang-tang);
+ for i=1 upto maxtime:
+ pos := haxis*velh*i+vaxis*(velv+halfaccel*i)*i;
+ fill fullcircle scaled (2*sray) shifted (z0+pos);
+ endfor;
+ drawdblarrow z0--(z0+pos) withcolor white withpen outerpen;
+ drawdblarrow z0--(z0+pos) withcolor blue withpen basepen;
+ picture tmppicture;
+ tmppicture = currentpicture;
+ currentpicture := nullpicture;
+ draw t;
+ draw p;
+ z999 = (-0.5*(plen-pmal),sray)-z0;
+ draw tmppicture rotatedaround (z0,180+lang) shifted (z999);
+ undraw origin--(-hlen,0) dashed mydash withpen outerpen;
+ draw origin--(-hlen,0) dashed mydash withpen basepen;
+ tmppicture := currentpicture;
+ currentpicture := nullpicture;
+ draw tmppicture rotated (-tang);
+endfig;
+
+beginfig(0);
+ draw currpic0;
+ for i=0 step 90 until 270:
+ draw origin--(u*dir(i));
+ endfor;
+ label(btex Launch etex,(0,0.5sray));
+ label(btex \begin{tabular}{c} Position \\ of Ball \end{tabular} etex,
+ (0,-0.5sray));
+ basepen := pencircle scaled 0.35u;
+ outerpen := pencircle scaled 1.1u;
+ ahlength := 4mm;
+ drawdblarrow origin--(gmar+sray,0) withcolor white withpen outerpen;
+ drawdblarrow origin--(gmar+sray,0) withcolor blue withpen basepen;
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/bananadimmer.mp b/graphics/metapost/contrib/macros/featpost/example/bananadimmer.mp
new file mode 100644
index 0000000000..3f9bc75623
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/bananadimmer.mp
@@ -0,0 +1,78 @@
+% bananadimmer.mp
+% Pedro J. Sebastiao.
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color axxc, ayyc, azzc;
+ color nalfa, ngamma;
+ numeric radius, gammang, xxsize, yysize, zzsize;
+ numeric xxpos, yypos, zzpos;
+ numeric angulo;
+ numeric nalfapos;
+ picture xxlabel, yylabel, zzlabel, nalfalabel;
+
+ f := (3,4,2);
+ Spread := 60;
+
+ gammang = 0;
+ angulo = -90;
+ beta = 11.8;
+ nbeta = 1.3;
+ delta = 35;
+ nalfapos = 1;
+ xxsize = 0.8;
+ xxpos = 6;
+ yysize = 1.3;
+ yypos = 6;
+ zzsize = 1.3;
+ zzpos = 4;
+
+ xxlabel = btex $\mbox{\protect \scriptsize light}$ etex;
+ yylabel = btex $\mbox{\protect \scriptsize analyser}$ etex;
+ zzlabel = btex $\mbox{\protect \scriptsize polariser}$ etex;
+ nalfalabel = btex $\mathbf{n}_a$ etex;
+
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,nbeta*cosd(beta)*sind(delta),nbeta*cosd(beta)*cosd(delta));
+ radius = nbeta*sind(beta);
+
+ ngamma := 0.5*(nalfa+(radius*cosd(angulo),radius*sind(angulo),0));
+ drawarrow rp(black)..rp(axxc);
+ drawarrow rp(black)..rp(ayyc);
+ drawarrow rp(black)..rp(azzc);
+ drawarrow rp(black)..rp(nalfa);
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+ labeln( nalfalabel, rp(nalfa), nalfapos );
+
+ banana(
+ ngamma,
+ conorm(ngamma),
+ ( 90, -26, 90 ),
+ 0.2,
+ 150);
+ banana(
+ ngamma,
+ conorm(ngamma),
+ ( 0, 0, 66 ),
+ 0.2,
+ 135);
+endfig;
+
+verbatimtex \end{document} etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/beautiful00.mp b/graphics/metapost/contrib/macros/featpost/example/beautiful00.mp
new file mode 100644
index 0000000000..d5204a4b5e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/beautiful00.mp
@@ -0,0 +1,40 @@
+% beautiful00.mp
+% L. Nobre G.
+% 2014
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, firstep, cylray, plangle, i, a, as, speed, dist, accel, li, aux;
+ pair poi, tip, ref;
+ pen one;
+ accel = 0.27;
+ u = 1.2cm;
+ firstep = 6u;
+ cylray = 2u;
+ plangle = 12;
+ as = 5;
+ ahangle := 30;
+ ahlength := 0.035cylray;
+ one = pencircle scaled 0.015cylray;
+ drawoptions( withpen one );
+ li = 3;
+ aux = li*accel*firstep*(li+1);
+ fill (-cylray,0)--(aux,0)--(aux,-ahlength)--(-cylray,-ahlength)--cycle withcolor 0.5white;
+ for i=0 upto li:
+ speed := i*accel;
+ ref := (speed*firstep*i,0);
+ for a=as-90 step as until 270-as:
+ poi := ref+cylray*(dir(a)+up);
+ dist := abs( poi-ref );
+ tip := poi+speed*dist*dir(0.5*a-45);
+ drawarrow poi--tip;
+ endfor;
+ endfor;
+ picture tmpicture;
+ tmpicture = currentpicture;
+ currentpicture := nullpicture;
+ draw tmpicture rotated -plangle;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/bichaepolicia.mp b/graphics/metapost/contrib/macros/featpost/example/bichaepolicia.mp
new file mode 100644
index 0000000000..f74572c7f3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/bichaepolicia.mp
@@ -0,0 +1,370 @@
+%GNUPLOT Metapost output: Sat Jun 25 13:20:45 2005
+
+
+%% Add \documentclass and \begin{dcoument} for latex
+%% NB you should set the environment variable TEX to the name of your
+%% latex executable (normally latex) inorder for metapost to work
+%% or run
+%% mpost --tex=latex ...
+
+% BEGPRE
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+% ENDPRE
+
+warningcheck:=0;
+defaultmpt:=mpt:=4;
+th:=.6;
+%% Have nice sharp joins on our lines
+linecap:=butt;
+linejoin:=mitered;
+
+def scalepen expr n = pickup pencircle scaled (n*th) enddef;
+def ptsize expr n = mpt:=n*defaultmpt enddef;
+
+
+textmag:= 1.000;
+vardef makepic(expr str) =
+ if picture str : str scaled textmag
+ % otherwise a string
+ else: str infont defaultfont scaled (defaultscale*textmag)
+ fi
+enddef;
+
+def infontsize(expr str, size) =
+ infont str scaled (size / fontsize str)
+enddef;
+
+color currentcolor; currentcolor:=black;
+boolean colorlines,dashedlines;
+colorlines:=true;
+dashedlines:=false;
+
+def _wc = withpen currentpen withcolor currentcolor enddef;
+def _ac = addto currentpicture enddef;
+def _sms = scaled mpt shifted enddef;
+% drawing point-types
+def gpdraw (expr n, x, y) =
+ if n<0: _ac contour fullcircle _sms (x,y)
+ elseif (n=1) or (n=3):
+ _ac doublepath ptpath[n] _sms (x,y) _wc;
+ _ac doublepath ptpath[n] rotated 90 _sms (x,y) _wc
+ elseif n<6: _ac doublepath ptpath[n] _sms (x,y) _wc
+ else: _ac contour ptpath[n] _sms (x,y) _wc
+ fi
+enddef;
+
+% the point shapes
+path ptpath[];
+%diamond
+ptpath0 = ptpath6 = (-1/2,0)--(0,-1/2)--(1/2,0)--(0,1/2)--cycle;
+% plus sign
+ptpath1 = (-1/2,0)--(1/2,0);
+% square
+ptpath2 = ptpath7 = (-1/2,-1/2)--(1/2,-1/2)--(1/2,1/2)--(-1/2,1/2)--cycle;
+% cross
+ptpath3 := (-1/2,-1/2)--(1/2,1/2);
+% circle:
+ptpath4 = ptpath8:= fullcircle;
+% triangle
+ptpath5 = ptpath9 := (0,1/2)--(-1/2,-1/2)--(1/2,-1/2)--cycle;
+
+def linetype expr n =
+ currentcolor:= if colorlines : col[n] else: black fi;
+ if n = -1 :
+ drawoptions(withcolor currentcolor withpen (currentpen scaled .5));
+ elseif n < 1 :
+ drawoptions(_wc);
+ else :
+ drawoptions( if dashedlines: dashed lt[n] fi _wc);
+ fi
+enddef;
+
+% dash patterns
+picture lt[];
+lt1=dashpattern(on 2 off 2); % dashes
+lt2=dashpattern(on 2 off 2 on 0.2 off 2); %dash-dot
+lt3=lt1 scaled 1.414;
+lt4=lt2 scaled 1.414;
+lt5=lt1 scaled 2;
+lt6:=lt2 scaled 2;
+lt7=dashpattern(on 0.2 off 2); %dots
+
+color col[],cyan, magenta, yellow;
+cyan=blue+green; magenta=red+blue;yellow=green+red;
+col[-2]:=col[-1]:=col0:=black;
+col1:=red;
+col2:=(.2,.2,1); %blue
+col3:=(1,.66,0); %orange
+col4:=.85*green;
+col5:=.9*magenta;
+col6:=0.85*cyan;
+col7:=.85*yellow;
+
+%placing text
+picture GPtext;
+def put_text(expr pic, x, y, r, j) =
+ GPtext:=makepic(pic);
+ GPtext:=GPtext shifted
+ if j = 1: (-(ulcorner GPtext + llcorner GPtext)/2)
+ elseif j = 2: (-center GPtext)
+ else: (-(urcorner GPtext + lrcorner GPtext)/2)
+ fi
+ rotated if r > 0: 90 else: 0 fi;
+ draw GPtext shifted (x,y)
+enddef;
+
+beginfig(0);
+w:=5.000in;h:=3.000in;
+a:=w/1200.0;b:=h/720.0;
+scalepen 1; ptsize 1.000;linetype -2;
+draw (143.4a,109.8b)--(160.0a,109.8b);
+draw (1146.3a,109.8b)--(1129.7a,109.8b);
+put_text( btex 0 etex, 125.7a, 109.8b, 0, 3);
+draw (143.4a,126.2b)--(151.7a,126.2b);
+draw (1146.3a,126.2b)--(1138.0a,126.2b);
+draw (143.4a,142.6b)--(151.7a,142.6b);
+draw (1146.3a,142.6b)--(1138.0a,142.6b);
+draw (143.4a,159.1b)--(151.7a,159.1b);
+draw (1146.3a,159.1b)--(1138.0a,159.1b);
+draw (143.4a,175.5b)--(151.7a,175.5b);
+draw (1146.3a,175.5b)--(1138.0a,175.5b);
+draw (143.4a,191.9b)--(160.0a,191.9b);
+draw (1146.3a,191.9b)--(1129.7a,191.9b);
+put_text( btex 5 etex, 125.7a, 191.9b, 0, 3);
+draw (143.4a,208.3b)--(151.7a,208.3b);
+draw (1146.3a,208.3b)--(1138.0a,208.3b);
+draw (143.4a,224.8b)--(151.7a,224.8b);
+draw (1146.3a,224.8b)--(1138.0a,224.8b);
+draw (143.4a,241.2b)--(151.7a,241.2b);
+draw (1146.3a,241.2b)--(1138.0a,241.2b);
+draw (143.4a,257.6b)--(151.7a,257.6b);
+draw (1146.3a,257.6b)--(1138.0a,257.6b);
+draw (143.4a,274.0b)--(160.0a,274.0b);
+draw (1146.3a,274.0b)--(1129.7a,274.0b);
+put_text( btex 10 etex, 125.7a, 274.0b, 0, 3);
+draw (143.4a,290.5b)--(151.7a,290.5b);
+draw (1146.3a,290.5b)--(1138.0a,290.5b);
+draw (143.4a,306.9b)--(151.7a,306.9b);
+draw (1146.3a,306.9b)--(1138.0a,306.9b);
+draw (143.4a,323.3b)--(151.7a,323.3b);
+draw (1146.3a,323.3b)--(1138.0a,323.3b);
+draw (143.4a,339.7b)--(151.7a,339.7b);
+draw (1146.3a,339.7b)--(1138.0a,339.7b);
+draw (143.4a,356.1b)--(160.0a,356.1b);
+draw (1146.3a,356.1b)--(1129.7a,356.1b);
+put_text( btex 15 etex, 125.7a, 356.1b, 0, 3);
+draw (143.4a,372.6b)--(151.7a,372.6b);
+draw (1146.3a,372.6b)--(1138.0a,372.6b);
+draw (143.4a,389.0b)--(151.7a,389.0b);
+draw (1146.3a,389.0b)--(1138.0a,389.0b);
+draw (143.4a,405.4b)--(151.7a,405.4b);
+draw (1146.3a,405.4b)--(1138.0a,405.4b);
+draw (143.4a,421.8b)--(151.7a,421.8b);
+draw (1146.3a,421.8b)--(1138.0a,421.8b);
+draw (143.4a,438.3b)--(160.0a,438.3b);
+draw (1146.3a,438.3b)--(1129.7a,438.3b);
+put_text( btex 20 etex, 125.7a, 438.3b, 0, 3);
+draw (143.4a,454.7b)--(151.7a,454.7b);
+draw (1146.3a,454.7b)--(1138.0a,454.7b);
+draw (143.4a,471.1b)--(151.7a,471.1b);
+draw (1146.3a,471.1b)--(1138.0a,471.1b);
+draw (143.4a,487.5b)--(151.7a,487.5b);
+draw (1146.3a,487.5b)--(1138.0a,487.5b);
+draw (143.4a,503.9b)--(151.7a,503.9b);
+draw (1146.3a,503.9b)--(1138.0a,503.9b);
+draw (143.4a,520.4b)--(160.0a,520.4b);
+draw (1146.3a,520.4b)--(1129.7a,520.4b);
+put_text( btex 25 etex, 125.7a, 520.4b, 0, 3);
+draw (143.4a,536.8b)--(151.7a,536.8b);
+draw (1146.3a,536.8b)--(1138.0a,536.8b);
+draw (143.4a,553.2b)--(151.7a,553.2b);
+draw (1146.3a,553.2b)--(1138.0a,553.2b);
+draw (143.4a,569.6b)--(151.7a,569.6b);
+draw (1146.3a,569.6b)--(1138.0a,569.6b);
+draw (143.4a,586.1b)--(151.7a,586.1b);
+draw (1146.3a,586.1b)--(1138.0a,586.1b);
+draw (143.4a,602.5b)--(160.0a,602.5b);
+draw (1146.3a,602.5b)--(1129.7a,602.5b);
+put_text( btex 30 etex, 125.7a, 602.5b, 0, 3);
+draw (143.4a,618.9b)--(151.7a,618.9b);
+draw (1146.3a,618.9b)--(1138.0a,618.9b);
+draw (143.4a,635.3b)--(151.7a,635.3b);
+draw (1146.3a,635.3b)--(1138.0a,635.3b);
+draw (143.4a,651.8b)--(151.7a,651.8b);
+draw (1146.3a,651.8b)--(1138.0a,651.8b);
+draw (143.4a,668.2b)--(151.7a,668.2b);
+draw (1146.3a,668.2b)--(1138.0a,668.2b);
+draw (143.4a,684.6b)--(160.0a,684.6b);
+draw (1146.3a,684.6b)--(1129.7a,684.6b);
+put_text( btex 35 etex, 125.7a, 684.6b, 0, 3);
+draw (143.4a,109.8b)--(143.4a,126.4b);
+draw (143.4a,684.6b)--(143.4a,668.0b);
+put_text( btex 0 etex, 143.4a, 73.2b, 0, 2);
+draw (310.6a,109.8b)--(310.6a,126.4b);
+draw (310.6a,684.6b)--(310.6a,668.0b);
+put_text( btex 0.2 etex, 310.6a, 73.2b, 0, 2);
+draw (477.7a,109.8b)--(477.7a,126.4b);
+draw (477.7a,684.6b)--(477.7a,668.0b);
+put_text( btex 0.4 etex, 477.7a, 73.2b, 0, 2);
+draw (644.9a,109.8b)--(644.9a,126.4b);
+draw (644.9a,684.6b)--(644.9a,668.0b);
+put_text( btex 0.6 etex, 644.9a, 73.2b, 0, 2);
+draw (812.0a,109.8b)--(812.0a,126.4b);
+draw (812.0a,684.6b)--(812.0a,668.0b);
+put_text( btex 0.8 etex, 812.0a, 73.2b, 0, 2);
+draw (979.2a,109.8b)--(979.2a,126.4b);
+draw (979.2a,684.6b)--(979.2a,668.0b);
+put_text( btex 1 etex, 979.2a, 73.2b, 0, 2);
+draw (1146.3a,109.8b)--(1146.3a,126.4b);
+draw (1146.3a,684.6b)--(1146.3a,668.0b);
+put_text( btex 1.2 etex, 1146.3a, 73.2b, 0, 2);
+draw (143.4a,109.8b)--(1146.3a,109.8b)--(1146.3a,684.6b)--(143.4a,684.6b)--(143.4a,109.8b);
+put_text( btex $l$ (km) etex, 36.6a, 397.2b, 1, 2);
+put_text( btex $t/t_V$ etex, 644.8a, 18.3b, 0, 2);
+linetype 0;
+linetype -2;
+put_text( btex frente da bicha etex, 1005.8a, 217.9b, 0, 3);
+linetype 0;
+draw (1023.5a,217.9b)--(1110.9a,217.9b);
+draw (143.4a,274.0b)--(148.4a,276.0b)--(153.5a,278.0b)--(158.5a,280.0b)--(163.6a,282.0b)
+--(168.6a,283.9b)--(173.6a,285.9b)--(178.7a,287.9b)--(183.7a,289.9b)--(188.8a,291.9b)
+--(193.8a,293.8b)--(198.8a,295.8b)--(203.9a,297.8b)--(208.9a,299.8b)--(214.0a,301.8b)
+--(219.0a,303.7b)--(224.0a,305.7b)--(229.1a,307.7b)--(234.1a,309.7b)--(239.2a,311.7b)
+--(244.2a,313.6b)--(249.2a,315.6b)--(254.3a,317.6b)--(259.3a,319.6b)--(264.4a,321.6b)
+--(269.4a,323.5b)--(274.4a,325.5b)--(279.5a,327.5b)--(284.5a,329.5b)--(289.6a,331.5b)
+--(294.6a,333.4b)--(299.6a,335.4b)--(304.7a,337.4b)--(309.7a,339.4b)--(314.7a,341.4b)
+--(319.8a,343.4b)--(324.8a,345.3b)--(329.9a,347.3b)--(334.9a,349.3b)--(339.9a,351.3b)
+--(345.0a,353.3b)--(350.0a,355.2b)--(355.1a,357.2b)--(360.1a,359.2b)--(365.1a,361.2b)
+--(370.2a,363.2b)--(375.2a,365.1b)--(380.3a,367.1b)--(385.3a,369.1b)--(390.3a,371.1b)
+--(395.4a,373.1b)--(400.4a,375.0b)--(405.5a,377.0b)--(410.5a,379.0b)--(415.5a,381.0b)
+--(420.6a,383.0b)--(425.6a,384.9b)--(430.7a,386.9b)--(435.7a,388.9b)--(440.7a,390.9b)
+--(445.8a,392.9b)--(450.8a,394.8b)--(455.9a,396.8b)--(460.9a,398.8b)--(465.9a,400.8b)
+--(471.0a,402.8b)--(476.0a,404.8b)--(481.1a,406.7b)--(486.1a,408.7b)--(491.1a,410.7b)
+--(496.2a,412.7b)--(501.2a,414.7b)--(506.3a,416.6b)--(511.3a,418.6b)--(516.3a,420.6b)
+--(521.4a,422.6b)--(526.4a,424.6b)--(531.5a,426.5b)--(536.5a,428.5b)--(541.5a,430.5b)
+--(546.6a,432.5b)--(551.6a,434.5b)--(556.7a,436.4b)--(561.7a,438.4b)--(566.7a,440.4b)
+--(571.8a,442.4b)--(576.8a,444.4b)--(581.9a,446.3b)--(586.9a,448.3b)--(591.9a,450.3b)
+--(597.0a,452.3b)--(602.0a,454.3b)--(607.1a,456.2b)--(612.1a,458.2b)--(617.1a,460.2b)
+--(622.2a,462.2b)--(627.2a,464.2b)--(632.3a,466.2b)--(637.3a,468.1b)--(642.3a,470.1b)
+--(647.4a,472.1b)--(652.4a,474.1b)--(657.4a,476.1b)--(662.5a,478.0b)--(667.5a,480.0b)
+--(672.6a,482.0b)--(677.6a,484.0b)--(682.6a,486.0b)--(687.7a,487.9b)--(692.7a,489.9b)
+--(697.8a,491.9b)--(702.8a,493.9b)--(707.8a,495.9b)--(712.9a,497.8b)--(717.9a,499.8b)
+--(723.0a,501.8b)--(728.0a,503.8b)--(733.0a,505.8b)--(738.1a,507.7b)--(743.1a,509.7b)
+--(748.2a,511.7b)--(753.2a,513.7b)--(758.2a,515.7b)--(763.3a,517.6b)--(768.3a,519.6b)
+--(773.4a,521.6b)--(778.4a,523.6b)--(783.4a,525.6b)--(788.5a,527.6b)--(793.5a,529.5b)
+--(798.6a,531.5b)--(803.6a,533.5b)--(808.6a,535.5b)--(813.7a,537.5b)--(818.7a,539.4b)
+--(823.8a,541.4b)--(828.8a,543.4b)--(833.8a,545.4b)--(838.9a,547.4b)--(843.9a,549.3b)
+--(849.0a,551.3b)--(854.0a,553.3b)--(859.0a,555.3b)--(864.1a,557.3b)--(869.1a,559.2b)
+--(874.2a,561.2b)--(879.2a,563.2b)--(884.2a,565.2b)--(889.3a,567.2b)--(894.3a,569.1b)
+--(899.4a,571.1b)--(904.4a,573.1b)--(909.4a,575.1b)--(914.5a,577.1b)--(919.5a,579.0b)
+--(924.6a,581.0b)--(929.6a,583.0b)--(934.6a,585.0b)--(939.7a,587.0b)--(944.7a,589.0b)
+--(949.8a,590.9b)--(954.8a,592.9b)--(959.8a,594.9b)--(964.9a,596.9b)--(969.9a,598.9b)
+--(975.0a,600.8b)--(980.0a,602.8b)--(985.0a,604.8b)--(990.1a,606.8b)--(995.1a,608.8b)
+--(1000.1a,610.7b)--(1005.2a,612.7b)--(1010.2a,614.7b)--(1015.3a,616.7b)--(1020.3a,618.7b)
+--(1025.3a,620.6b)--(1030.4a,622.6b)--(1035.4a,624.6b)--(1040.5a,626.6b)--(1045.5a,628.6b)
+--(1050.5a,630.5b)--(1055.6a,632.5b)--(1060.6a,634.5b)--(1065.7a,636.5b)--(1070.7a,638.5b)
+--(1075.7a,640.4b)--(1080.8a,642.4b)--(1085.8a,644.4b)--(1090.9a,646.4b)--(1095.9a,648.4b)
+--(1100.9a,650.4b)--(1106.0a,652.3b)--(1111.0a,654.3b)--(1116.1a,656.3b)--(1121.1a,658.3b)
+--(1126.1a,660.3b)--(1131.2a,662.2b)--(1136.2a,664.2b)--(1141.3a,666.2b)--(1146.3a,668.2b);
+linetype 1;
+linetype -2;
+put_text( btex fim da bicha etex, 1005.8a, 181.3b, 0, 3);
+linetype 1;
+draw (1023.5a,181.3b)--(1110.9a,181.3b);
+draw (143.4a,109.8b)--(148.4a,111.8b)--(153.5a,113.8b)--(158.5a,115.7b)--(163.6a,117.7b)
+--(168.6a,119.7b)--(173.6a,121.7b)--(178.7a,123.7b)--(183.7a,125.6b)--(188.8a,127.6b)
+--(193.8a,129.6b)--(198.8a,131.6b)--(203.9a,133.6b)--(208.9a,135.5b)--(214.0a,137.5b)
+--(219.0a,139.5b)--(224.0a,141.5b)--(229.1a,143.5b)--(234.1a,145.5b)--(239.2a,147.4b)
+--(244.2a,149.4b)--(249.2a,151.4b)--(254.3a,153.4b)--(259.3a,155.4b)--(264.4a,157.3b)
+--(269.4a,159.3b)--(274.4a,161.3b)--(279.5a,163.3b)--(284.5a,165.3b)--(289.6a,167.2b)
+--(294.6a,169.2b)--(299.6a,171.2b)--(304.7a,173.2b)--(309.7a,175.2b)--(314.7a,177.1b)
+--(319.8a,179.1b)--(324.8a,181.1b)--(329.9a,183.1b)--(334.9a,185.1b)--(339.9a,187.0b)
+--(345.0a,189.0b)--(350.0a,191.0b)--(355.1a,193.0b)--(360.1a,195.0b)--(365.1a,196.9b)
+--(370.2a,198.9b)--(375.2a,200.9b)--(380.3a,202.9b)--(385.3a,204.9b)--(390.3a,206.9b)
+--(395.4a,208.8b)--(400.4a,210.8b)--(405.5a,212.8b)--(410.5a,214.8b)--(415.5a,216.8b)
+--(420.6a,218.7b)--(425.6a,220.7b)--(430.7a,222.7b)--(435.7a,224.7b)--(440.7a,226.7b)
+--(445.8a,228.6b)--(450.8a,230.6b)--(455.9a,232.6b)--(460.9a,234.6b)--(465.9a,236.6b)
+--(471.0a,238.5b)--(476.0a,240.5b)--(481.1a,242.5b)--(486.1a,244.5b)--(491.1a,246.5b)
+--(496.2a,248.4b)--(501.2a,250.4b)--(506.3a,252.4b)--(511.3a,254.4b)--(516.3a,256.4b)
+--(521.4a,258.3b)--(526.4a,260.3b)--(531.5a,262.3b)--(536.5a,264.3b)--(541.5a,266.3b)
+--(546.6a,268.3b)--(551.6a,270.2b)--(556.7a,272.2b)--(561.7a,274.2b)--(566.7a,276.2b)
+--(571.8a,278.2b)--(576.8a,280.1b)--(581.9a,282.1b)--(586.9a,284.1b)--(591.9a,286.1b)
+--(597.0a,288.1b)--(602.0a,290.0b)--(607.1a,292.0b)--(612.1a,294.0b)--(617.1a,296.0b)
+--(622.2a,298.0b)--(627.2a,299.9b)--(632.3a,301.9b)--(637.3a,303.9b)--(642.3a,305.9b)
+--(647.4a,307.9b)--(652.4a,309.8b)--(657.4a,311.8b)--(662.5a,313.8b)--(667.5a,315.8b)
+--(672.6a,317.8b)--(677.6a,319.7b)--(682.6a,321.7b)--(687.7a,323.7b)--(692.7a,325.7b)
+--(697.8a,327.7b)--(702.8a,329.7b)--(707.8a,331.6b)--(712.9a,333.6b)--(717.9a,335.6b)
+--(723.0a,337.6b)--(728.0a,339.6b)--(733.0a,341.5b)--(738.1a,343.5b)--(743.1a,345.5b)
+--(748.2a,347.5b)--(753.2a,349.5b)--(758.2a,351.4b)--(763.3a,353.4b)--(768.3a,355.4b)
+--(773.4a,357.4b)--(778.4a,359.4b)--(783.4a,361.3b)--(788.5a,363.3b)--(793.5a,365.3b)
+--(798.6a,367.3b)--(803.6a,369.3b)--(808.6a,371.2b)--(813.7a,373.2b)--(818.7a,375.2b)
+--(823.8a,377.2b)--(828.8a,379.2b)--(833.8a,381.1b)--(838.9a,383.1b)--(843.9a,385.1b)
+--(849.0a,387.1b)--(854.0a,389.1b)--(859.0a,391.1b)--(864.1a,393.0b)--(869.1a,395.0b)
+--(874.2a,397.0b)--(879.2a,399.0b)--(884.2a,401.0b)--(889.3a,402.9b)--(894.3a,404.9b)
+--(899.4a,406.9b)--(904.4a,408.9b)--(909.4a,410.9b)--(914.5a,412.8b)--(919.5a,414.8b)
+--(924.6a,416.8b)--(929.6a,418.8b)--(934.6a,420.8b)--(939.7a,422.7b)--(944.7a,424.7b)
+--(949.8a,426.7b)--(954.8a,428.7b)--(959.8a,430.7b)--(964.9a,432.6b)--(969.9a,434.6b)
+--(975.0a,436.6b)--(980.0a,438.6b)--(985.0a,440.6b)--(990.1a,442.5b)--(995.1a,444.5b)
+--(1000.1a,446.5b)--(1005.2a,448.5b)--(1010.2a,450.5b)--(1015.3a,452.5b)--(1020.3a,454.4b)
+--(1025.3a,456.4b)--(1030.4a,458.4b)--(1035.4a,460.4b)--(1040.5a,462.4b)--(1045.5a,464.3b)
+--(1050.5a,466.3b)--(1055.6a,468.3b)--(1060.6a,470.3b)--(1065.7a,472.3b)--(1070.7a,474.2b)
+--(1075.7a,476.2b)--(1080.8a,478.2b)--(1085.8a,480.2b)--(1090.9a,482.2b)--(1095.9a,484.1b)
+--(1100.9a,486.1b)--(1106.0a,488.1b)--(1111.0a,490.1b)--(1116.1a,492.1b)--(1121.1a,494.0b)
+--(1126.1a,496.0b)--(1131.2a,498.0b)--(1136.2a,500.0b)--(1141.3a,502.0b)--(1146.3a,503.9b);
+linetype 2;
+linetype -2;
+put_text( btex pol\'{\i}cia etex, 1005.8a, 144.7b, 0, 3);
+linetype 2;
+draw (1023.5a,144.7b)--(1110.9a,144.7b);
+draw (143.4a,109.8b)--(148.4a,112.8b)--(153.5a,115.7b)--(158.5a,118.7b)--(163.6a,121.7b)
+--(168.6a,124.7b)--(173.6a,127.6b)--(178.7a,130.6b)--(183.7a,133.6b)--(188.8a,136.5b)
+--(193.8a,139.5b)--(198.8a,142.5b)--(203.9a,145.5b)--(208.9a,148.4b)--(214.0a,151.4b)
+--(219.0a,154.4b)--(224.0a,157.3b)--(229.1a,160.3b)--(234.1a,163.3b)--(239.2a,166.2b)
+--(244.2a,169.2b)--(249.2a,172.2b)--(254.3a,175.2b)--(259.3a,178.1b)--(264.4a,181.1b)
+--(269.4a,184.1b)--(274.4a,187.0b)--(279.5a,190.0b)--(284.5a,193.0b)--(289.6a,196.0b)
+--(294.6a,198.9b)--(299.6a,201.9b)--(304.7a,204.9b)--(309.7a,207.8b)--(314.7a,210.8b)
+--(319.8a,213.8b)--(324.8a,216.8b)--(329.9a,219.7b)--(334.9a,222.7b)--(339.9a,225.7b)
+--(345.0a,228.6b)--(350.0a,231.6b)--(355.1a,234.6b)--(360.1a,237.6b)--(365.1a,240.5b)
+--(370.2a,243.5b)--(375.2a,246.5b)--(380.3a,249.4b)--(385.3a,252.4b)--(390.3a,255.4b)
+--(395.4a,258.3b)--(400.4a,261.3b)--(405.5a,264.3b)--(410.5a,267.3b)--(415.5a,270.2b)
+--(420.6a,273.2b)--(425.6a,276.2b)--(430.7a,279.1b)--(435.7a,282.1b)--(440.7a,285.1b)
+--(445.8a,288.1b)--(450.8a,291.0b)--(455.9a,294.0b)--(460.9a,297.0b)--(465.9a,299.9b)
+--(471.0a,302.9b)--(476.0a,305.9b)--(481.1a,308.9b)--(486.1a,311.8b)--(491.1a,314.8b)
+--(496.2a,317.8b)--(501.2a,320.7b)--(506.3a,323.7b)--(511.3a,326.7b)--(516.3a,329.7b)
+--(521.4a,332.6b)--(526.4a,335.6b)--(531.5a,338.6b)--(536.5a,341.5b)--(541.5a,344.5b)
+--(546.6a,347.5b)--(551.6a,350.4b)--(556.7a,353.4b)--(561.7a,356.4b)--(566.7a,359.4b)
+--(571.8a,362.3b)--(576.8a,365.3b)--(581.9a,368.3b)--(586.9a,371.2b)--(591.9a,374.2b)
+--(597.0a,377.2b)--(602.0a,380.2b)--(607.1a,383.1b)--(612.1a,386.1b)--(617.1a,389.1b)
+--(622.2a,392.0b)--(627.2a,395.0b)--(632.3a,398.0b)--(637.3a,401.0b)--(642.3a,403.9b)
+--(647.4a,406.9b)--(652.4a,409.9b)--(657.4a,412.8b)--(662.5a,415.8b)--(667.5a,418.8b)
+--(672.6a,421.8b)--(677.6a,424.7b)--(682.6a,427.7b)--(687.7a,430.7b)--(692.7a,433.6b)
+--(697.8a,436.6b)--(702.8a,439.6b)--(707.8a,442.5b)--(712.9a,445.5b)--(717.9a,448.5b)
+--(723.0a,451.5b)--(728.0a,454.4b)--(733.0a,457.4b)--(738.1a,460.4b)--(743.1a,463.3b)
+--(748.2a,466.3b)--(753.2a,469.3b)--(758.2a,472.3b)--(763.3a,475.2b)--(768.3a,478.2b)
+--(773.4a,481.2b)--(778.4a,484.1b)--(783.4a,487.1b)--(788.5a,490.1b)--(793.5a,493.1b)
+--(798.6a,496.0b)--(803.6a,499.0b)--(808.6a,502.0b)--(813.7a,504.9b)--(818.7a,507.9b)
+--(823.8a,510.9b)--(828.8a,513.9b)--(833.8a,516.8b)--(838.9a,519.8b)--(843.9a,522.8b)
+--(849.0a,525.7b)--(854.0a,528.7b)--(859.0a,531.7b)--(864.1a,534.6b)--(869.1a,537.6b)
+--(874.2a,540.6b)--(879.2a,543.6b)--(884.2a,546.5b)--(889.3a,549.5b)--(894.3a,552.5b)
+--(899.4a,555.4b)--(904.4a,558.4b)--(909.4a,561.4b)--(914.5a,564.4b)--(919.5a,567.3b)
+--(924.6a,570.3b)--(929.6a,573.3b)--(934.6a,576.2b)--(939.7a,579.2b)--(944.7a,582.2b)
+--(949.8a,585.2b)--(954.8a,588.1b)--(959.8a,591.1b)--(964.9a,594.1b)--(969.9a,597.0b)
+--(975.0a,600.0b)--(980.0a,602.0b)--(985.0a,599.0b)--(990.1a,596.0b)--(995.1a,593.1b)
+--(1000.1a,590.1b)--(1005.2a,587.1b)--(1010.2a,584.2b)--(1015.3a,581.2b)--(1020.3a,578.2b)
+--(1025.3a,575.3b)--(1030.4a,572.3b)--(1035.4a,569.3b)--(1040.5a,566.3b)--(1045.5a,563.4b)
+--(1050.5a,560.4b)--(1055.6a,557.4b)--(1060.6a,554.5b)--(1065.7a,551.5b)--(1070.7a,548.5b)
+--(1075.7a,545.5b)--(1080.8a,542.6b)--(1085.8a,539.6b)--(1090.9a,536.6b)--(1095.9a,533.7b)
+--(1100.9a,530.7b)--(1106.0a,527.7b)--(1111.0a,524.7b)--(1116.1a,521.8b)--(1121.1a,518.8b)
+--(1126.1a,515.8b)--(1131.2a,512.9b)--(1136.2a,509.9b)--(1141.3a,506.9b)--(1146.3a,503.9b);
+linetype -2;
+draw (143.4a,109.8b)--(1146.3a,109.8b)--(1146.3a,684.6b)--(143.4a,684.6b)--(143.4a,109.8b);
+endfig;
+% BEGPOST
+verbatimtex
+ \end{document}
+etex
+% ENDPOST
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/brownellips.mp b/graphics/metapost/contrib/macros/featpost/example/brownellips.mp
new file mode 100644
index 0000000000..5ce5e32530
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/brownellips.mp
@@ -0,0 +1,128 @@
+% brownellips.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+numeric ParameterA, ParameterB, ParameterC;
+ParameterA = 0.5; % f
+ParameterB = 0.5; % viewcentr
+ParameterC = 405; % main arm angle
+
+f := ParameterA[6*(3,4,2),4*(2,-3,1)];
+viewcentr := ParameterB[black,(-2,-3,1)];
+Spread := 16;
+
+beginfig(0);
+ numeric sray, armb, mara, flen, pif, pers, perb, rads, radb, pert, j;
+ numeric nums, lens, i, bray, unan, stan, acta, arms, mang, actl, coun;
+ numeric rrat, auxd, anga, sqsd, k;
+ color c[][], vr, vt, vi, vb, auxc;
+ path elo[];
+ string inde, comm;
+ stan = 0;
+ nums = 30;
+ sray = 0.95;
+ bray = 2; % bray must be 2*sray if you want ellipses
+ armb = 5;
+ arms = 2.5;
+ sqsd = 0.3;
+ pif = 3.14159/180;
+ rrat = 1-bray/sray;
+ flen = armb +-+ (bray-sray);
+ mara = angle( bray-sray, flen );
+ rads = pif*2*mara;
+ radb = pif*(360-2*mara);
+ pers = rads*sray;
+ perb = radb*bray;
+ pert = pers + perb + 2*flen;
+ lens = pert/nums;
+ unan = lens/bray/pif;
+ acta = stan + ParameterC;
+ mang = acta mod unan;
+ drawoptions( withcolor 0.7white );
+ setthestage( 20, 2*(armb+2*arms) );
+ drawoptions();
+ draw
+ rp((armb*cosd(stan)+arms*cosd(rrat*stan),
+ armb*sind(stan)+arms*sind(rrat*stan),
+ 0))
+ for i=stan+2 step 2 until acta:
+ ...rp((armb*cosd(i)+arms*cosd(rrat*i),armb*sind(i)+arms*sind(rrat*i),0))
+ endfor;
+ auxc:=(armb*cosd(acta)+arms*cosd(rrat*acta),
+ armb*sind(acta)+arms*sind(rrat*acta),
+ 0);
+ verygoodcone(false,auxc+2*sqsd*blue,-blue,sqsd,auxc);
+ vb := (armb*cosd(acta),armb*sind(acta),2*sqsd);
+ vi := 0.5*sqsd*(sind(rrat*acta),-cosd(rrat*acta),0);
+ kindofcube(false,true,vb+vi,rrat*acta,0,0,arms,sqsd,sqsd);
+ coun = 0;
+ for i=unan-mang+mara-180 step unan until 180-mara:
+ coun := incr( coun );
+ vr := (-bray*cosd(i),-bray*sind(i),3*sqsd);
+ vt := 0.25*lens*(-sind(i),cosd(i),0);
+ c[coun]1 = vt+vr;
+ c[coun]2 = vt+vr+lens*blue;
+ c[coun]3 = vr-vt+lens*blue;
+ c[coun]4 = vr-vt;
+ c[coun]5 = 0.25*(c[coun]1+c[coun]2+c[coun]3+c[coun]4);
+ j := i;
+ endfor;
+ auxd = lens-pif*(180-mara-j)*bray;
+ vi := (-bray*cosd(180-mara),-bray*sind(180-mara),3*sqsd);
+ for i=auxd step lens until flen:
+ coun := incr( coun );
+ vr := vi + (i*sind(mara),i*cosd(mara),0);
+ vt := 0.25*lens*(sind(mara),cosd(mara),0);
+ c[coun]1 = vt+vr;
+ c[coun]2 = vt+vr+lens*blue;
+ c[coun]3 = vr-vt+lens*blue;
+ c[coun]4 = vr-vt;
+ c[coun]5 = 0.25*(c[coun]1+c[coun]2+c[coun]3+c[coun]4);
+ j := i;
+ endfor;
+ anga := (lens-flen+j)/sray/pif;
+ for i=anga-mara step lens/sray/pif until mara:
+ coun := incr( coun );
+ vr := armb*red + (sray*cosd(i),sray*sind(i),3*sqsd);
+ vt := 0.25*lens*(-sind(i),cosd(i),0);
+ c[coun]1 = vt+vr;
+ c[coun]2 = vt+vr+lens*blue;
+ c[coun]3 = vr-vt+lens*blue;
+ c[coun]4 = vr-vt;
+ c[coun]5 = 0.25*(c[coun]1+c[coun]2+c[coun]3+c[coun]4);
+ j := i;
+ endfor;
+ auxd := lens-pif*(mara-j)*sray;
+ vi := armb*red + (sray*cosd(mara),sray*sind(mara),3*sqsd);
+ for i=auxd step lens until flen:
+ coun := incr( coun );
+ vr := vi + (-i*sind(mara),i*cosd(mara),0);
+ vt := 0.25*lens*(-sind(mara),cosd(mara),0);
+ c[coun]1 = vt+vr;
+ c[coun]2 = vt+vr+lens*blue;
+ c[coun]3 = vr-vt+lens*blue;
+ c[coun]4 = vr-vt;
+ c[coun]5 = 0.25*(c[coun]1+c[coun]2+c[coun]3+c[coun]4);
+ endfor;
+ for i=1 upto coun:
+ for j=1 upto 4:
+ c[i][j] := eulerrotation( acta, 0, 0, c[i][j] );
+ endfor;
+ elo[i] = for k=1 upto 4: rp(c[i][k])-- endfor cycle;
+ inde := decimal( i );
+ comm := "unfill elo[" & inde & "]; draw elo[" & inde & "];";
+ getready( comm, c[i]5 );
+ endfor;
+ doitnow;
+ produce_vga_border
+endfig;
+end;
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/bstr.mp b/graphics/metapost/contrib/macros/featpost/example/bstr.mp
new file mode 100644
index 0000000000..7a4a46e26c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/bstr.mp
@@ -0,0 +1,15 @@
+% bstr.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ boolean tb;
+ tb = true;
+ draw origin;
+ label( bstr( tb ) & cstr((1,2,3)), origin );
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/bughunt.mp b/graphics/metapost/contrib/macros/featpost/example/bughunt.mp
new file mode 100644
index 0000000000..11a153fa30
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/bughunt.mp
@@ -0,0 +1,57 @@
+% bughunt.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+%SphericalDistortion := true;
+%f := 0.3*(5,4,2);
+%Spread := 40;
+%ShiftV := (200,200);
+
+SphericalDistortion := false;
+f := 3.3*(5,4,2);
+Spread := 70;
+ShiftV := (250,250);
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, aux, i, numc, slope;
+
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 8;
+ slope = 15;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := gammacnt+0.1*(f-gammacnt)+(0,0,aux/slope);
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+endfig;
+
+beginfig(2);
+ path cpath;
+ color vert;
+ numeric i;
+ f := (4,0,0.5);
+ vert = 0.5*(0,1,1);
+ cpath = rigorouscone(true, black, blue, 1, vert);
+% draw rp(vert);
+ draw cpath; show length cpath;
+ for i=0 upto length cpath:
+ dotlabel.top( decimal(i),point i of cpath);
+ endfor;
+% cpath := rigorouscircle( black, blue, 1);
+% draw cpath;
+% for i=0 upto length cpath:
+% dotlabel.bot( decimal(i),point i of cpath);
+% endfor;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/buildcyclebug.mp b/graphics/metapost/contrib/macros/featpost/example/buildcyclebug.mp
new file mode 100644
index 0000000000..4f2a2cfe9d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/buildcyclebug.mp
@@ -0,0 +1,203 @@
+% buildcyclebug.mp
+% L. Nobre G.
+% 2006
+
+beginfig(1);
+ numeric squaregridstep, i, j, rotationanglestep, u, nx, ny;
+ numeric rotationangle, horishift;
+ path leftcirc, righcirc, basecirc;
+ pen markpen;
+ pair shiftvect;
+ markpen = pencircle scaled 3pt;
+ u = 10mm;
+ squaregridstep = 2.1u;
+ rotationanglestep = 5.5;
+
+ nx = floor( 21cm / ( squaregridstep+1 ) );
+ ny = 2*floor( 29cm / ( squaregridstep+1 ) );
+ basecirc = fullcircle scaled u;
+ for i=1 upto nx:
+ horishift := (i/nx)*0.45u;
+ for j=1 upto ny:
+ rotationangle := j*rotationanglestep;
+ shiftvect := squaregridstep*(i,0.5*j);
+ leftcirc := basecirc rotated (2*rotationangle)
+ shifted ( shiftvect+horishift*left );
+ righcirc := basecirc rotated rotationangle
+ shifted ( shiftvect+horishift*right );
+ draw leftcirc withcolor 0.3white;
+ draw righcirc withcolor 0.3white;
+ draw buildcycle( leftcirc, reverse righcirc ) withcolor blue;
+ draw point 0 of leftcirc withpen markpen;
+ draw point 0 of righcirc withpen markpen;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2);
+ path a, b, c;
+ a = (159.49368,290.7048)..controls (159.29092,291.94003)
+ and (158.9775,293.15451)
+ ..(158.55756,294.33372)..controls (158.13393,295.5233)
+ and (157.60364,296.6721)
+ ..(156.97446,297.76695)..controls (156.33871,298.87321)
+ and (155.6046,299.9199)
+ ..(154.78215,300.89539)..controls (153.9502,301.88214)
+ and (153.03125,302.79204)
+ ..(152.03786,303.61603)..controls (151.0325,304.44995)
+ and (149.95486,305.19261)
+ ..(148.81863,305.83694)..controls (147.66982,306.48843)
+ and (146.46558,307.03687)
+ ..(145.22061,307.47765)..controls (143.96362,307.92268)
+ and (142.66995,308.25626)
+ ..(141.3548,308.47633)..controls (140.03023,308.698)
+ and (138.68887,308.8037)
+ ..(137.34593,308.79295)..controls (135.99751,308.78217)
+ and (134.65259,308.65404)
+ ..(133.32639,308.40996)..controls (131.99881,308.16563)
+ and (130.69505,307.80605)
+ ..(129.43005,307.33498)..controls (128.16791,306.86497)
+ and (126.94911,306.28574)
+ ..(125.78854,305.60234)..controls (124.63374,304.92235)
+ and (123.5411,304.14188)
+ ..(122.5243,303.26889)..controls (121.51508,302.4024)
+ and (120.58455,301.44818)
+ ..(119.74568,300.41588)..controls (118.91405,299.39249)
+ and (118.17587,298.29651)
+ ..(117.54193,297.1402)..controls (116.91396,295.99477)
+ and (116.39084,294.79483)
+ ..(115.98134,293.55438)..controls (115.57558,292.32524)
+ and (115.28311,291.06154)
+ ..(115.10854,289.77898)..controls (114.93536,288.5067)
+ and (114.87895,287.22122)
+ ..(114.94107,285.93872)..controls (115.0028,284.66422)
+ and (115.18134,283.39806)
+ ..(115.47398,282.15607)..controls (115.76532,280.91968)
+ and (116.16852,279.71237)
+ ..(116.67828,278.54889)..controls (117.18674,277.38843)
+ and (117.79907,276.27635)
+ ..(118.50629,275.22514)..controls (119.21288,274.17487)
+ and (120.01135,273.18947)
+ ..(120.89124,272.27943)..controls (121.77103,271.3695)
+ and (122.72879,270.53844)
+ ..(123.75226,269.79378)..controls (124.77632,269.04868)
+ and (125.86238,268.39284)
+ ..(126.9978,267.83188)..controls (128.13411,267.27048)
+ and (129.3158,266.80612)
+ ..(130.52983,266.44218)..controls (131.74399,266.07822)
+ and (132.98631,265.81592)
+ ..(134.24382,265.65674)..controls (135.50044,265.49768)
+ and (136.76797,265.44212)
+ ..(138.03372,265.49004)..controls (139.29755,265.53787)
+ and (140.55539,265.68869)
+ ..(141.79463,265.94131)..controls (143.03053,266.19325)
+ and (144.24384,266.54561)
+ ..(145.42241,266.99493)..controls (146.59683,267.44267)
+ and (147.73291,267.98524)
+ ..(148.81863,268.61847)..controls (149.90009,269.24919)
+ and (150.9279,269.96771)
+ ..(151.89061,270.76805)..controls (152.8493,271.56505)
+ and (153.74008,272.44041)
+ ..(154.5525,273.38608)..controls (155.36205,274.32838)
+ and (156.09094,275.33714)
+ ..(156.72955,276.40274)..controls (157.36655,277.46562)
+ and (157.91138,278.58112)
+ ..(158.35652,279.73755)..controls (158.8012,280.89273)
+ and (159.14471,282.08438)
+ ..(159.38153,283.29933)..controls (159.6187,284.51605)
+ and (159.74791,285.75134)
+ ..(159.7672,286.99081)..controls (159.78654,288.23448)
+ and (159.69516,289.47742)
+ ..cycle;
+ b = (164.69388,283.76816)..controls (164.45602,285.2755)
+ and (164.0816,286.75807)
+ ..(163.57579,288.19778)..controls (163.06467,289.6526)
+ and (162.42154,291.05757)
+ ..(161.65623,292.39624)..controls (160.8809,293.75246)
+ and (159.9834,295.03499)
+ ..(158.97679,296.22963)..controls (157.95538,297.44182)
+ and (156.82588,298.55852)
+ ..(155.6046,299.56902)..controls (154.36432,300.59523)
+ and (153.03438,301.50781)
+ ..(151.63235,302.29881)..controls (150.2098,303.1014)
+ and (148.71864,303.77567)
+ ..(147.17755,304.31679)..controls (145.61667,304.86487)
+ and (144.01057,305.27425)
+ ..(142.37828,305.54321)..controls (140.73018,305.81479)
+ and (139.06157,305.9422)
+ ..(137.39133,305.92545)..controls (135.71124,305.9086)
+ and (134.03581,305.74596)
+ ..(132.38377,305.43983)..controls (130.7291,305.13322)
+ and (129.1041,304.68382)
+ ..(127.52728,304.09592)..controls (125.95447,303.5095)
+ and (124.43553,302.7875)
+ ..(122.98894,301.93604)..controls (121.55147,301.08994)
+ and (120.191,300.11926)
+ ..(118.92514,299.03305)..controls (117.6715,297.95732)
+ and (116.51561,296.77249)
+ ..(115.47398,295.49034)..controls (114.44432,294.22292)
+ and (113.53049,292.86551)
+ ..(112.74724,291.43265)..controls (111.97365,290.01747)
+ and (111.3307,288.5346)
+ ..(110.82997,287.0015)..controls (110.33537,285.48715)
+ and (109.98169,283.9303)
+ ..(109.77559,282.35062)..controls (109.5717,280.78786)
+ and (109.51315,279.20952)
+ ..(109.6024,277.63603)..controls (109.69093,276.07535)
+ and (109.9245,274.52629)
+ ..(110.29973,273.0088)..controls (110.67278,271.50015)
+ and (111.18423,270.02914)
+ ..(111.82713,268.61427)..controls (112.46806,267.20374)
+ and (113.23691,265.855)
+ ..(114.12129,264.5829)..controls (115.0049,263.31194)
+ and (116.0003,262.12254)
+ ..(117.09409,261.02722)..controls (118.18842,259.93134)
+ and (119.37697,258.93388)
+ ..(120.64404,258.04337)..controls (121.91309,257.15147)
+ and (123.25624,256.37012)
+ ..(124.65749,255.70496)..controls (126.06084,255.03879)
+ and (127.51752,254.49147)
+ ..(129.01158,254.06616)..controls (130.50682,253.64052)
+ and (132.03445,253.3385)
+ ..(133.57892,253.16093)..controls (135.1232,252.9834)
+ and (136.6793,252.93085)
+ ..(138.23209,253.003)..controls (139.78247,253.07506)
+ and (141.32457,253.27116)
+ ..(142.84367,253.58932)..controls (144.35844,253.90657)
+ and (145.84552,254.34416)
+ ..(147.29047,254.89853)..controls (148.72931,255.45056)
+ and (150.1218,256.11664)
+ ..(151.45383,256.89171)..controls (152.77919,257.66292)
+ and (154.0404,258.53955)
+ ..(155.22351,259.51508)..controls (156.4003,260.4854)
+ and (157.49585,261.55034)
+ ..(158.4969,262.70111)..controls (159.49316,263.84637)
+ and (160.39235,265.07266)
+ ..(161.18283,266.36856)..controls (161.97006,267.65913)
+ and (162.64664,269.01411)
+ ..(163.20195,270.42015)..controls (163.75612,271.82329)
+ and (164.18744,273.27196)
+ ..(164.48865,274.75021)..controls (164.7901,276.22968)
+ and (164.96005,277.73294)
+ ..(164.99524,279.2424)..controls (165.03055,280.75697)
+ and (164.93001,282.27168)
+ ..cycle;
+ draw a;
+ draw b;
+ c = buildcycle( b, a );
+ show c;
+ draw c withcolor green;
+
+ pair sh, si;
+ numeric sc;
+ sh = (-150,-285);
+ si = (-150,-290);
+ sc = 10;
+ draw a shifted sh scaled sc;
+ draw b shifted si scaled sc;
+ c := buildcycle( a shifted sh scaled sc, b shifted si scaled sc );
+ draw c withcolor green;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/canschemes.mp b/graphics/metapost/contrib/macros/featpost/example/canschemes.mp
new file mode 100644
index 0000000000..1a963311da
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/canschemes.mp
@@ -0,0 +1,159 @@
+input boxes;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+defaultfont:="cmssu30";
+
+beginfig(1);
+ numeric ymax, xmax, ymed,ylow;
+ ymax = 2in;
+ xmax = 3in;
+ ymed = 1.25in;
+ ylow = 0.2in;
+ z1 = (xmax,0);
+ z2 = (xmax,ymed);
+ z5 = (xmax,ymax);
+ z3 = z2+0.4*(z5-z2);
+ z4 = z2+0.7*(z5-z2);
+ z7 = (0,ymax);
+ z6 = z5+0.7*(z7-z5);
+ z9 = (0,ymed);
+ z8 = z7+0.8*(z9-z7);
+ z10= z9+0.5*(origin-z9);
+ z11= (xmax/12,ymed);
+ z13= (xmax/3,ymed);
+ z14= (5*xmax/12,ymed);
+ z15= (7*xmax/12,0.8*ymed);
+ z16= (7*xmax/12,0.6*ymed);
+ z17= (3*xmax/4,ymed);
+ z18= (5*xmax/6,ymed);
+ path a,b,c,d;
+ a = z6{down}..z14..z15..z17..z4;
+ b = z9--z2;
+ c = z10..{right}z13..z2;
+ d = z8..z11..z16..z18..z3;
+ z12 = c intersectionpoint d;
+ pickup pencircle scaled 2pt;
+ draw origin--z1--z5--z7--cycle;
+ draw a;
+ draw b;
+ draw c;
+ draw d;
+% dotlabels.urt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
+ label.top(btex $h^-_{I\! I}$ etex,z15);
+ label.bot(btex $h^+_{I\! I}$ etex,z16);
+ label.lrt(btex $h_{I}$ etex,z10);
+ label.urt(btex $h_0$ etex,(x12,ymed));
+ label.bot(btex $K_3/K_1$ etex,0.5*(z1-origin));
+ label.lft(btex $h$ etex,0.5*(z7-origin));
+ pickup pencircle scaled 0pt;
+ draw (x11,0)--(x11,ymax);
+ draw (x12,0)--(x12,ymax);
+ draw (x13,0)--(x13,ymax);
+ draw (x14,0)--(x14,ymax);
+ draw (x17,0)--(x17,ymax);
+ draw (x18,0)--(x18,ymax);
+ label(btex $C_1$ etex,((x7+x11)/2,ylow));
+ label(btex $C_3$ etex,((x12+x11)/2,ylow));
+ label(btex $C_2$ etex,((x13+x12)/2,ylow));
+ label(btex $B$ etex,((x14+x13)/2,ylow));
+ label(btex $A_1$ etex,((x17+x14)/2,ylow));
+ label(btex $B$ etex,((x18+x17)/2,ylow));
+ label(btex $A_2$ etex,((x1+x18)/2,ylow));
+endfig;
+
+beginfig(2);
+ numeric ymax, xmax, i, j, noise, twist, grid, size, u, actsize;
+ pair actpos, direct, one, two;
+ u = 0.5mm;
+ xmax = 9;
+ ymax = 9;
+ noise = 1u;
+ size = 5u;
+ pickup pencircle scaled u;
+ grid = size + 3*noise;
+ twist = 70/(grid*(xmax++ymax));
+ label.lft( btex tor\c{c}\~{a}o etex, grid*(-xmax-1,ymax) );
+ for i=-xmax upto -1: % twist
+ for j=1 upto ymax:
+ actpos:=(grid*i+noise*normaldeviate,grid*j+noise*normaldeviate);
+ direct:=dir(90);
+ actsize:=size*sind(3*(xpart actpos)*twist)/2;
+% direct:=dir(angle(actpos)+90);
+% actsize:=size*sind(abs(actpos)*twist)/2;
+ one:=actpos-actsize*direct;
+ two:=actpos+actsize*direct;
+ draw one--two;
+ endfor;
+ endfor;
+ label.rt( btex flex\~{a}o etex, grid*(xmax+1,ymax) );
+ for i=1 upto xmax: % bend
+ for j=1 upto ymax:
+ actpos:=(grid*i+noise*normaldeviate,grid*j+noise*normaldeviate);
+ direct:=dir(angle(actpos)+90);
+ actsize:=size/2;
+ one:=actpos-actsize*direct;
+ two:=actpos+actsize*direct;
+ draw one--two;
+ endfor;
+ endfor;
+ label.rt( btex sela etex, grid*(xmax+1,-ymax) );
+ for i=1 upto xmax: % saddle-splay
+ for j=-ymax upto -1:
+ actpos:=(grid*i+noise*normaldeviate,grid*j+noise*normaldeviate);
+ direct:=dir(-angle(actpos));
+ actsize:=size*sind(abs(actpos)*twist)/2;
+ one:=actpos-actsize*direct;
+ two:=actpos+actsize*direct;
+ draw one--two;
+ endfor;
+ endfor;
+ label.lft( btex afunilamento etex, grid*(-xmax-1,-ymax) );
+ for i=-xmax upto -1: % splay
+ for j=-ymax upto -1:
+ actpos:=(grid*i+noise*normaldeviate,grid*j+noise*normaldeviate);
+ direct:=unitvector(actpos);
+% actsize:=size/2;
+ actsize:=size*sind(abs(actpos)*twist)/2;
+ one:=actpos-actsize*direct;
+ two:=actpos+actsize*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(3);
+ numeric vertj;
+ path ab, at, tb;
+ vertj = 1cm;
+ boxit.afun( btex afunilamento etex );
+ boxit.bend( btex flex\~{a}o etex );
+ boxit.torc( btex tor\c{c}\~{a}o etex );
+ afun.se=bend.sw-vertj*up;
+ afun.ne=bend.nw-vertj*up;
+ bend.se=torc.sw+2*vertj*up;
+ bend.ne=torc.nw+2*vertj*up;
+ drawunboxed( afun, bend, torc );
+ ab = afun.n{up}..{right}bend.w;
+ at = afun.s{down}..{right}torc.w;
+ tb = torc.n{up}..{left}bend.e;
+ pickup pencircle scaled 1pt;
+ drawarrow ab;
+ drawarrow at;
+ drawarrow tb;
+ label.top( btex $\beta$ etex, point 0.5*length ab of ab );
+ label.bot( btex $\psi$ etex, point 0.5*length at of at );
+ label.rt( btex $\beta$ etex, point 0.5*length tb of tb );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/cap29res.mp b/graphics/metapost/contrib/macros/featpost/example/cap29res.mp
new file mode 100644
index 0000000000..604e5911f8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cap29res.mp
@@ -0,0 +1,380 @@
+verbatimtex
+\documentclass[11pt]{article}
+\usepackage{palatino,mathpazo,amsmath,amssymb}
+\usepackage[squaren]{SIunits}
+\usepackage[latin1]{inputenc}
+\usepackage[portuges]{babel}
+\newcommand{\veri}{\ensuremath{\hat{\text{i}}}}
+\newcommand{\verj}{\ensuremath{\hat{\text{j}}}}
+\newcommand{\verk}{\ensuremath{\hat{\text{k}}}}
+\newcommand{\emf}{\ensuremath{\mathcal{E}}}
+\newcommand{\startprob}[1]{\vspace{3mm}\noindent\framebox{#1}}
+\begin{document}
+etex
+
+numeric un;
+un = 1mm;
+picture bigotimesp, bigodotp, efieldp, bfieldp, eforcep, bforcep, velocp, ip;
+bigotimesp = btex $\bigotimes $ etex;
+bigodotp = btex $\bigodot $ etex;
+efieldp = btex $\vec{E} $ etex;
+bfieldp = btex $\vec{B} $ etex;
+eforcep = btex $\vec{F}_E $ etex;
+bforcep = btex $\vec{F}_B $ etex;
+velocp = btex $\vec{v} $ etex;
+ip = btex $I$ etex;
+picture amperp, voltip, maiscarga, menoscarg;
+amperp = btex A etex;
+voltip = btex V etex;
+maiscarga = btex $+$ etex;
+menoscarg = btex \rule{0pt}{9pt}$-$ etex;
+
+
+drawoptions( withpen pencircle scaled 0.47un );
+ahlength := 2un;
+ahangle := 25;
+labeloffset := 2un;
+bboxmargin := 0un;
+
+def drawcircledstring( expr Pos )( text TheString ) =
+ begingroup
+ picture strpic;
+ path cirpath;
+ pair llp, urp;
+ numeric diametr;
+ strpic = thelabel( TheString, origin );
+ llp = llcorner strpic;
+ urp = urcorner strpic;
+ diametr = abs( urp - llp );
+ cirpath = fullcircle scaled diametr shifted Pos;
+ unfill cirpath;
+ draw strpic shifted Pos;
+ draw cirpath
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric elen, forcelen, vlen, marginlen;
+ elen = 30un;
+ forcelen = 15un;
+ vlen = 30un;
+ marginlen = 10un;
+ z1 = (-marginlen,forcelen);
+ z2 = (-marginlen,-forcelen);
+ z3 = (0,forcelen);
+ z4 = (0,-forcelen);
+ z5 = (vlen,0);
+ drawarrow z1--z2;
+ drawarrow origin--z3;
+ drawarrow origin--z4;
+ drawarrow origin--z5;
+ label( bigotimesp, origin );
+ label.ulft( efieldp, z2 );
+ label.lft( bfieldp, origin );
+ label.rt( eforcep, z3 );
+ label.rt( bforcep, z4 );
+ label.top( velocp, z5 );
+endfig;
+
+beginfig(2);
+ numeric dlen, altur, vlen, forcelen, marginlen;
+ marginlen = 7un;
+ dlen = 25un;
+ forcelen = 27.5un;
+ altur = 40un;
+ vlen = 15un;
+ z1 = -0.5*(dlen,altur);
+ z2 = 0.5*(dlen,-altur);
+ z5 = 0.5*(-dlen,altur);
+ z6 = 0.5*(dlen,altur);
+ z3 = z1 - (0,marginlen);
+ z4 = z2 - (0,marginlen);
+ z7 = 0.5[z5,z6];
+ z9 = (0,vlen);
+ z8 = z7 + z9;
+ z10= (forcelen,0);
+ z11= (0.5*dlen+marginlen,marginlen);
+ z12= 0.5[z3,z4];
+ draw z1--z2--z6--z5--cycle;
+ drawdblarrow z3--z4;
+ drawarrow origin--z9;
+ drawarrow origin--z10;
+ drawarrow z7--z8;
+ drawcircledstring( origin, menoscarg );
+ label( bigotimesp, z11 );
+ label.lft( velocp, z8 );
+ label.lft( velocp, z9 );
+ label.bot( bforcep, z10 );
+ label.lft( bfieldp, z11 );
+ label.top( btex $d$ etex, z12 );
+endfig;
+
+beginfig(3);
+ numeric dlen, altur, vlen, forcelen, marginlen;
+ numeric marginchar, marginvolt, marginfield, marginforce;
+ numeric ycoo, xcoo, llim, hlim;
+ marginchar = 3un;
+ marginvolt = 10un;
+ marginfield = 5un;
+ marginforce = 6un;
+ marginlen = 7un;
+ dlen = 25un;
+ forcelen = 27.5un;
+ altur = 40un;
+ vlen = 15un;
+ z1 = -0.5*(dlen,altur);
+ z2 = 0.5*(dlen,-altur);
+ z5 = 0.5*(-dlen,altur);
+ z6 = 0.5*(dlen,altur);
+ z3 = z1 - (0,marginlen);
+ z4 = z2 - (0,marginlen);
+ z12= 0.5[z3,z4];
+ z7 = 0.5[z5,z6];
+ z9 = (0,vlen);
+ z8 = z7 + z9;
+ z10= (marginforce-0.5*dlen,0);
+ z11= -z10;
+ z13= (-0.5*dlen+marginfield,0.25*altur);
+ z15= (-0.5*dlen+marginforce,-0.25*altur);
+ z14= (0.5*dlen-marginfield,0.25*altur);
+ z16= (0.5*dlen-marginforce,-0.25*altur);
+ z17= (-0.5*dlen-marginvolt,0);
+ z18= -z17;
+ z19= (-0.5*dlen-marginvolt,-0.5*altur-marginlen-marginvolt);
+ z20= (0.5*dlen+marginvolt,-0.5*altur-marginlen-marginvolt);
+ z21= 0.5[z19,z20];
+ z22= (-0.5*dlen,0);
+ z23= -z22;
+ draw z1--z2--z6--z5--cycle;
+ draw z22--z17--z19--z20--z18--z23;
+ drawdblarrow z3--z4;
+ drawarrow z11--z10;
+ drawarrow z13--z14;
+ drawarrow z15--z16;
+ drawarrow z7--z8;
+ drawcircledstring( z21, btex \rule[-1mm]{0pt}{12pt}V etex );
+ label.lft( velocp, z8 );
+ label.llft( bforcep, z16 );
+ label.llft( efieldp, z14 );
+ label.lrt( eforcep, z10 );
+ label.top( btex $d$ etex, z12 );
+ xcoo = 0.5*dlen-marginchar;
+ llim = -0.5*altur+marginchar;
+ hlim = 0.5*altur-marginchar;
+ for ycoo=llim step marginchar until hlim:
+ label( maiscarga, (-xcoo,ycoo) );
+ label( menoscarg, (xcoo,ycoo) );
+ endfor;
+endfig;
+
+beginfig(4);
+ numeric alen, blen, marginfield, margincurrent, ilen;
+ blen = 40un;
+ alen = 5*blen/12;
+ ilen = 8un;
+ marginfield = 5un;
+ margincurrent = 1.6un;
+ z17 = unitvector( (alen,blen) );
+ z18 = (blen-2*marginfield,0);
+ z1 = origin;
+ z2 = (blen,0);
+ z3 = (0,alen);
+ z4 = 0.25[z1,z2];
+ z5 = 0.45[z2,z3];
+ z6 = 0.35[z3,z1];
+ z7 = 0.5[z1,z2]+margincurrent*down;
+ z8 = z7+ilen*right;
+ z9 = 0.65[z2,z3]+margincurrent*z17;
+ z10= z9+ilen*unitvector((-blen,alen));
+ z11= 0.5[z3,z1]+margincurrent*left;
+ z12= z11+ilen*down;
+ z13= marginfield*(1,-1);
+ z14= z13+z18;
+ z15= z3+marginfield*(1,1);
+ z16= z15+z18;
+ draw z1--z2--z3--cycle;
+ drawarrow z7--z8;
+ drawarrow z9--z10;
+ drawarrow z11--z12;
+ drawarrow z13--z14;
+ drawarrow z15--z16;
+ label.llft( bfieldp, z14 );
+ label.llft( bfieldp, z16 );
+ label.rt( ip, z8 );
+ label.ulft( ip, z10 );
+ label.bot( ip, z12 );
+ label.top( btex $b$ etex, z4 );
+ label.bot( btex $c$ etex, z5 );
+ label.rt( btex $a$ etex, z6 );
+endfig;
+
+beginfig(5);
+ numeric alen, blen, marginfield, margincurrent, ilen;
+ blen = 40un;
+ alen = 5*blen/12;
+ ilen = 8un;
+ marginfield = 5un;
+ margincurrent = 1.6un;
+ z17 = unitvector( (alen,blen) );
+ z18 = (blen-2*marginfield,0);
+ z1 = origin;
+ z2 = (blen,0);
+ z3 = (0,alen);
+ z4 = 0.25[z1,z2];
+ z5 = 0.45[z2,z3];
+ z6 = 0.35[z3,z1];
+ z7 = 0.5[z1,z2]+margincurrent*down;
+ z8 = z7+ilen*right;
+ z9 = 0.5[z2,z3]+margincurrent*z17;
+ z10= z9+ilen*unitvector((-blen,alen));
+ z11= 0.5[z3,z1]+margincurrent*left;
+ z12= z11+ilen*down;
+ z13= 0.65[z3,z1];
+ z14= z13+z18;
+ z15= z3+marginfield*(1,1);
+ z16= z15+z18;
+ drawarrow z11--z12;
+ drawarrow z13--z14;
+ drawarrow z3--z1;
+ label.llft( bfieldp, z14 );
+ label.bot( ip, z12 );
+ label.rt( btex $\vec{a}$ etex, z6 );
+ label.lrt( bigodotp, z13 );
+ label.lrt( btex $\vec{F}_a$ etex, 0.13[z13,z14] );
+endfig;
+
+beginfig(6);
+ numeric alen, blen, marginfield, margincurrent, ilen;
+ blen = 40un;
+ alen = 5*blen/12;
+ ilen = 8un;
+ marginfield = 5un;
+ margincurrent = 1.6un;
+ z17 = unitvector( (alen,blen) );
+ z18 = (blen-2*marginfield,0);
+ z1 = origin;
+ z2 = (blen,0);
+ z3 = (0,alen);
+ z4 = 0.25[z1,z2];
+ z5 = 0.45[z2,z3];
+ z6 = 0.35[z3,z1];
+ z7 = 0.5[z1,z2]+margincurrent*down;
+ z8 = z7+ilen*right;
+ z9 = 0.5[z2,z3]+margincurrent*z17;
+ z10= z9+ilen*unitvector((-blen,alen));
+ z11= 0.5[z3,z1]+margincurrent*left;
+ z12= z11+ilen*down;
+ z13= marginfield*(1,-1);
+ z14= z13+z18;
+ z15= z3+marginfield*(1,1);
+ z16= z15+z18;
+% drawarrow z11--z12;
+ drawarrow z13--z14;
+ drawarrow z1--z2;
+ label.llft( bfieldp, z14 );
+% label.bot( ip, z12 );
+ label.top( btex $\vec{b}$ etex, z4 );
+% label.lrt( bigodotp, z13 );
+% label.lrt( btex $\vec{F}_a$ etex, 0.13[z13,z14] );
+endfig;
+
+beginfig(7);
+ numeric alen, blen, marginfield, margincurrent, ilen, ralpha, rphi;
+ path pc, pb, palpha, pphi;
+ ralpha = 6un;
+ rphi = 4un;
+ blen = 40un;
+ alen = 5*blen/12;
+ ilen = 8un;
+ marginfield = 5un;
+ margincurrent = 1.6un;
+ z17 = unitvector( (alen,blen) );
+ z18 = (blen-2*marginfield,0);
+ z1 = origin;
+ z2 = (blen,0);
+ z3 = (0,alen);
+ z4 = 0.25[z1,z2];
+ z5 = 0.45[z2,z3];
+ z6 = 0.35[z3,z1];
+ z7 = 0.5[z1,z2]+margincurrent*down;
+ z8 = z7+ilen*right;
+ z9 = 0.65[z2,z3]+margincurrent*z17;
+ z10= z9+ilen*unitvector((-blen,alen));
+ z11= 0.5[z3,z1]+margincurrent*left;
+ z12= z11+ilen*down;
+ z14= z2+ilen*up;
+ z13= z14-z18;
+ pb = z13--z14;
+ pc = z2--z3;
+ z19 = pb intersectionpoint pc;
+ pphi = halfcircle scaled 2rphi shifted z19 cutafter pc;
+ palpha = halfcircle scaled 2ralpha shifted z19 cutbefore pc;
+ z20 = pphi intersectionpoint (z19--(z19+1.1*rphi*dir(0.5*angle((-blen,alen)))));
+ z21 = palpha intersectionpoint (z19--(z19+1.1*ralpha*dir(180-0.5*angle((blen,alen)))));
+ label.lft( btex $\alpha$ etex, z21 );
+ label.top( btex $\phi$ etex, z20 );
+ draw pphi;
+ draw palpha;
+ drawarrow pc;
+ drawarrow z9--z10;
+ drawarrow pb;
+ label.llft( bfieldp, z14 );
+ label.ulft( ip, z10 );
+ label.bot( btex $\vec{c}$ etex, z5 );
+endfig;
+
+beginfig(8);
+ numeric raya, rayb, angs, angf, angr;
+ path pc, pd, ps, pf, pr, pI;
+ raya = 9un;
+ rayb = 11un;
+ angs = 15;
+ angf = 64;
+ angr = 240;
+ pc = fullcircle scaled 2raya;
+ pd = fullcircle scaled 2rayb;
+ ps = origin--1.1*rayb*dir(angs);
+ pf = origin--1.1*rayb*dir(angf);
+ pr = origin--raya*dir(angr);
+ pI = pd cutbefore ps cutafter pf;
+ draw pc;
+ draw pr;
+ drawarrow pI;
+ label.top( btex $R$ etex, 0.5*raya*dir(angr) );
+ label.rt( btex $A$ etex, origin );
+ label.top( btex $I$ etex, point 0.5 of pI );
+endfig;
+
+beginfig(9);
+ numeric raya, rayb, ang, lenf, lenb, lenm;
+ path pc, pm;
+ raya = 11un;
+ rayb = 0.5raya;
+ ang = 41;
+ lenm = 1.35raya;
+ lenf = 1.25lenm;
+ lenb = 0.4lenm;
+ z1 = (lenf,0);
+ z2 = lenm*dir(ang);
+ pm = origin--z2;
+ z3 = raya*dir(ang+90);
+ z4 = (-lenb,0);
+ z5 = raya*dir(ang+270);
+ z6 = rayb*dir(0.5*ang);
+ pc = halfcircle scaled 2rayb cutafter pm;
+ drawarrow z4--z1;
+ drawarrow pm;
+ draw z3--z5;
+ draw pc;
+ label.rt( btex $41\degree$ etex, z6 );
+ label.rt( btex $\vec{\mu}$ etex, z2 );
+ label.llft( bfieldp, z1 );
+ label( bigotimesp, origin );
+ label.llft( btex $\vec{\tau}$ etex, origin );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/caratk3edit.mp b/graphics/metapost/contrib/macros/featpost/example/caratk3edit.mp
new file mode 100644
index 0000000000..556445497a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/caratk3edit.mp
@@ -0,0 +1,339 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin_AT_uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2007 Wolfgang Glunz <wglunz34_AT_pstoedit.net>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+randomseed := 1010;
+vardef renewcolore =
+ color tmpcolo;
+ tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+ drawoptions( withcolor tmpcolo );
+enddef;
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+ PreeditedPath1 = hide(z1=(136.781,601.332))z1..controls hide(z2=(136.207,600.809))z2 and hide(z3=(125.922,599.672))z3..hide(z4=(113.77,598.793))z4
+ ..controls hide(z5=(93.6016,597.332))z5 and hide(z6=(75.6953,595.555))z6..hide(z7=(64.125,593.867))z7
+ ..controls hide(z8=(57.7227,592.934))z8 and hide(z9=(57.3164,592.113))z9..hide(z10=(55.6055,576.598))z10
+ ..controls hide(z11=(54.7539,568.84))z11 and hide(z12=(53.5117,560.848))z12..hide(z13=(52.8789,559.016))z13
+ ..controls hide(z14=(51.4531,554.879))z14 and hide(z15=(51.4531,554.879))z15..hide(z16=(71.1055,563.672))z16
+ ..controls hide(z17=(80.6719,567.953))z17 and hide(z18=(90.2812,571.426))z18..hide(z19=(92.5664,571.426))z19
+ ..controls hide(z20=(97.2188,571.426))z20 and hide(z21=(118.938,558.223))z21..hide(z22=(118.938,555.395))z22
+ ..controls hide(z23=(118.938,549.949))z23 and hide(z24=(131.609,554.68))z24..hide(z25=(143.246,564.469))z25
+ ..controls hide(z26=(150.484,570.559))z26 and hide(z27=(158.238,576.262))z27..hide(z28=(160.438,577.113))z28
+ ..controls hide(z29=(162.883,578.062))z29 and hide(z30=(172.723,572.715))z30..hide(z31=(185.648,563.41))z31
+ ..controls hide(z32=(197.285,555.039))z32 and hide(z33=(207.551,548.156))z33..hide(z34=(208.402,548.156))z34
+ ..controls hide(z35=(209.254,548.156))z35 and hide(z36=(213.574,551.191))z36..hide(z37=(217.969,554.879))z37
+ ..controls hide(z38=(225.984,561.602))z38 and hide(z39=(225.984,561.602))z39..hide(z40=(228.266,555.652))z40
+ ..controls hide(z41=(230.461,549.926))z41 and hide(z42=(230.965,528.246))z42..hide(z43=(229.516,501.613))z43
+ ..controls hide(z44=(228.816,488.703))z44 and hide(z45=(229.348,488.883))z45..hide(z46=(201.68,492.254))z46
+ ..controls hide(z47=(178.668,495.055))z47 and hide(z48=(168.094,498.582))z48..hide(z49=(169.715,502.906))z49
+ ..controls hide(z50=(170.492,504.977))z50 and hide(z51=(172.254,506.785))z51..hide(z52=(173.496,506.785))z52
+ ..controls hide(z53=(178.238,506.785))z53 and hide(z54=(175.566,513.844))z54..hide(z55=(169.617,517.027))z55
+ ..controls hide(z56=(164.188,519.938))z56 and hide(z57=(162.41,519.91))z57..hide(z58=(158.5,516.871))z58
+ ..controls hide(z59=(155.914,514.859))z59 and hide(z60=(152.695,512.387))z60..hide(z61=(151.262,511.309))z61
+ ..controls hide(z62=(149.855,510.258))z62 and hide(z63=(144.539,505.879))z63..hide(z64=(139.625,501.73))z64
+ ..controls hide(z65=(129.418,493.113))z65 and hide(z66=(127.215,493.512))z66..hide(z67=(102.91,508.375))z67
+ --hide(z68=(88.1719,517.387))z68--hide(z69=(72.3984,508.961))z69..controls hide(z70=(50.4219,497.223))z70 and hide(z71=(46.543,493.016))z71..hide(z72=(46.543,480.93))z72
+ ..controls hide(z73=(46.543,475.242))z73 and hide(z74=(47.2969,470.586))z74..hide(z75=(48.2227,470.586))z75
+ ..controls hide(z76=(49.1367,470.586))z76 and hide(z77=(57.918,473.5))z77..hide(z78=(67.4844,476.98))z78
+ ..controls hide(z79=(85.5859,483.562))z79 and hide(z80=(113.27,488.316))z80..hide(z81=(127.473,487.281))z81
+ ..controls hide(z82=(139.109,486.434))z82 and hide(z83=(167.711,483.555))z83..hide(z84=(177.891,482.203))z84
+ ..controls hide(z85=(188.75,480.762))z85 and hide(z86=(219.004,468.781))z86..hide(z87=(228.312,462.234))z87
+ ..controls hide(z88=(234.777,457.688))z88 and hide(z89=(236.023,457.551))z89..hide(z90=(239.949,460.98))z90
+ ..controls hide(z91=(244.086,464.594))z91 and hide(z92=(260.199,473.633))z92..hide(z93=(261.668,473.16))z93
+ ..controls hide(z94=(262.086,473.027))z94 and hide(z95=(265.547,474.047))z95..hide(z96=(269.164,475.371))z96
+ ..controls hide(z97=(272.922,476.742))z97 and hide(z98=(279.766,478.512))z98..hide(z99=(284.68,479.379))z99
+ ..controls hide(z100=(289.59,480.246))z100 and hide(z101=(296.891,481.555))z101..hide(z102=(301.227,482.352))z102
+ ..controls hide(z103=(305.492,483.133))z103 and hide(z104=(320.621,484.117))z104..hide(z105=(334.84,484.535))z105
+ ..controls hide(z106=(361.473,485.324))z106 and hide(z107=(378.926,482.516))z107..hide(z108=(405.168,473.219))z108
+ ..controls hide(z109=(413.184,470.383))z109 and hide(z110=(420.262,468))z110..hide(z111=(420.684,468))z111
+ ..controls hide(z112=(421.105,468))z112 and hide(z113=(421.461,473.688))z113..hide(z114=(421.461,480.41))z114
+ ..controls hide(z115=(421.461,493.637))z115 and hide(z116=(422.754,492.359))z116..hide(z117=(391.984,509.539))z117
+ --hide(z118=(379.312,516.609))z118--hide(z119=(362.25,505.234))z119..controls hide(z120=(352.941,499.027))z120 and hide(z121=(343.715,493.855))z121..hide(z122=(341.949,493.855))z122
+ ..controls hide(z123=(340.156,493.855))z123 and hide(z124=(332.512,499.512))z124..hide(z125=(324.758,506.586))z125
+ ..controls hide(z126=(311.051,519.074))z126 and hide(z127=(308.449,520.031))z127..hide(z128=(299.16,515.973))z128
+ ..controls hide(z129=(293.5,513.504))z129 and hide(z130=(293.477,509.887))z130..hide(z131=(299.082,503.684))z131
+ ..controls hide(z132=(304.156,498.066))z132 and hide(z133=(302.777,496.148))z133..hide(z134=(292.953,495.125))z134
+ ..controls hide(z135=(288.93,494.707))z135 and hide(z136=(280.543,493.559))z136..hide(z137=(274.078,492.539))z137
+ ..controls hide(z138=(250.547,488.832))z138 and hide(z139=(242.957,489.09))z139..hide(z140=(242.66,493.598))z140
+ ..controls hide(z141=(241.953,504.457))z141 and hide(z142=(242.695,558.922))z142..hide(z143=(243.566,559.793))z143
+ ..controls hide(z144=(244.141,560.363))z144 and hide(z145=(248.352,557.422))z145..hide(z146=(253.004,553.199))z146
+ ..controls hide(z147=(261.41,545.57))z147 and hide(z148=(261.41,545.57))z148..hide(z149=(272.27,552.422))z149
+ ..controls hide(z150=(278.215,556.176))z150 and hide(z151=(287.223,562.418))z151..hide(z152=(292.176,566.227))z152
+ ..controls hide(z153=(308.059,578.43))z153 and hide(z154=(306.914,578.707))z154..hide(z155=(340.527,554.566))z155
+ ..controls hide(z156=(345.895,550.715))z156 and hide(z157=(346.992,551.004))z157..hide(z158=(359.922,559.66))z158
+ ..controls hide(z159=(367.418,564.684))z159 and hide(z160=(376.375,568.84))z160..hide(z161=(379.703,568.84))z161
+ ..controls hide(z162=(383.016,568.84))z162 and hide(z163=(392.242,565.309))z163..hide(z164=(400,561.074))z164
+ ..controls hide(z165=(417.324,551.613))z165 and hide(z166=(419.172,551.559))z166..hide(z167=(417.348,560.566))z167
+ ..controls hide(z168=(416.086,566.789))z168 and hide(z169=(415.027,574.789))z169..hide(z170=(413.953,586.164))z170
+ ..controls hide(z171=(413.59,590.059))z171 and hide(z172=(400,592.863))z172..hide(z173=(365.867,596.09))z173
+ ..controls hide(z174=(355.785,597.043))z174 and hide(z175=(343.188,598.32))z175..hide(z176=(337.426,598.977))z176
+ ..controls hide(z177=(324.758,600.414))z177 and hide(z178=(138.176,602.605))z178..cycle;
+ renewcolore;
+ %%%draw PreeditedPath1;
+ %%%dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178);
+ PreeditedPath2 = hide(z179=(157.293,559.016))z179..controls hide(z180=(155.93,555.562))z180 and hide(z181=(130.316,537.812))z181..hide(z182=(126.695,537.812))z182
+ ..controls hide(z183=(123.594,537.812))z183 and hide(z184=(108.777,545.199))z184..hide(z185=(105.953,548.156))z185
+ ..controls hide(z186=(105.266,548.875))z186 and hide(z187=(101.617,551.461))z187..hide(z188=(97.7383,553.973))z188
+ ..controls hide(z189=(90.8516,558.438))z189 and hide(z190=(90.4961,558.363))z190..hide(z191=(71.8789,548.543))z191
+ ..controls hide(z192=(61.5391,543.09))z192 and hide(z193=(49.6758,537.77))z193..hide(z194=(45.6367,536.777))z194
+ ..controls hide(z195=(38.4258,535.008))z195 and hide(z196=(38.3047,534.711))z196..hide(z197=(40.0781,522.816))z197
+ ..controls hide(z198=(41.0781,516.094))z198 and hide(z199=(42.4062,510.145))z199..hide(z200=(43.0508,509.5))z200
+ ..controls hide(z201=(43.6914,508.859))z201 and hide(z202=(54.2969,513.68))z202..hide(z203=(66.7109,520.254))z203
+ ..controls hide(z204=(91.7891,533.539))z204 and hide(z205=(92.2734,533.531))z205..hide(z206=(114.027,519.523))z206
+ --hide(z207=(126.18,511.699))z207--hide(z208=(143.504,523.516))z208..controls hide(z209=(162.379,536.391))z209 and hide(z210=(166.609,537.348))z210..hide(z211=(175.824,530.824))z211
+ ..controls hide(z212=(189.527,521.125))z212 and hide(z213=(193.934,516.008))z213..hide(z214=(192.52,511.441))z214
+ ..controls hide(z215=(191.719,508.855))z215 and hide(z216=(191.422,506.715))z216..hide(z217=(191.855,506.629))z217
+ ..controls hide(z218=(201.68,504.664))z218 and hide(z219=(217.156,504.129))z219..hide(z220=(217.301,505.75))z220
+ ..controls hide(z221=(219.555,531.348))z221 and hide(z222=(217.371,539.543))z222..hide(z223=(210.211,532.383))z223
+ ..controls hide(z224=(208.156,530.328))z224 and hide(z225=(201.422,533.91))z225..hide(z226=(185.906,545.316))z226
+ ..controls hide(z227=(164.965,560.711))z227 and hide(z228=(159.074,563.531))z228..cycle;
+ renewcolore;
+ %%%draw PreeditedPath2;
+ %%%dotlabels.rt(179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228);
+ PreeditedPath3 = hide(z229=(287.266,545.551))z229..controls hide(z230=(264.77,529.469))z230 and hide(z231=(262.457,528.379))z231..hide(z232=(259.805,532.641))z232
+ ..controls hide(z233=(256.047,538.676))z233 and hide(z234=(254.02,533.934))z234..hide(z235=(253.719,518.422))z235
+ ..controls hide(z236=(253.395,501.613))z236 and hide(z237=(253.395,501.613))z237..hide(z238=(263.219,503.09))z238
+ ..controls hide(z239=(277.438,505.223))z239 and hide(z240=(279.07,506.164))z240..hide(z241=(277.652,511.441))z241
+ ..controls hide(z242=(276.738,514.844))z242 and hide(z243=(279.25,517.988))z243..hide(z244=(287.008,523.16))z244
+ ..controls hide(z245=(306.656,536.262))z245 and hide(z246=(308.102,536.277))z246..hide(z247=(325.016,523.523))z247
+ ..controls hide(z248=(333.289,517.285))z248 and hide(z249=(341.578,512.156))z249..hide(z250=(343.504,512.086))z250
+ ..controls hide(z251=(345.395,512.016))z251 and hide(z252=(353.973,516.176))z252..hide(z253=(362.25,521.18))z253
+ ..controls hide(z254=(379.656,531.703))z254 and hide(z255=(383.969,531.332))z255..hide(z256=(404.395,517.547))z256
+ ..controls hide(z257=(417.062,509))z257 and hide(z258=(425.559,505.672))z258..hide(z259=(427.246,508.594))z259
+ ..controls hide(z260=(427.902,509.73))z260 and hide(z261=(429.258,514.93))z261..hide(z262=(430.25,520.102))z262
+ ..controls hide(z263=(431.789,528.117))z263 and hide(z264=(431.281,529.793))z264..hide(z265=(426.891,531.219))z265
+ ..controls hide(z266=(424.043,532.145))z266 and hide(z267=(413.703,537.293))z267..hide(z268=(403.879,542.68))z268
+ ..controls hide(z269=(378.277,556.715))z269 and hide(z270=(379.137,556.656))z270..hide(z271=(362.25,545.398))z271
+ ..controls hide(z272=(353.973,539.883))z272 and hide(z273=(345.809,535.227))z273..hide(z274=(344.406,535.227))z274
+ ..controls hide(z275=(341.977,535.227))z275 and hide(z276=(320.359,550.945))z276..hide(z277=(313.379,557.789))z277
+ ..controls hide(z278=(311.57,559.562))z278 and hide(z279=(309.781,561.082))z279..hide(z280=(309.5,561.082))z280
+ ..controls hide(z281=(309.219,561.082))z281 and hide(z282=(299.16,554.059))z282..cycle;
+ renewcolore;
+ %%%draw PreeditedPath3;
+ %%%dotlabels.rt(229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282);
+ PreeditedPath4 = hide(z283=(115.836,474.383))z283..controls hide(z284=(115.414,474.004))z284 and hide(z285=(108.855,472.969))z285..hide(z286=(101.355,472.098))z286
+ ..controls hide(z287=(83.2578,470))z287 and hide(z288=(58.0664,461.602))z288..hide(z289=(45.7656,453.566))z289
+ ..controls hide(z290=(37.75,448.328))z290 and hide(z291=(36.1445,445.766))z291..hide(z292=(35.8633,437.75))z292
+ ..controls hide(z293=(34.9023,410.34))z293 and hide(z294=(36.957,405.855))z294..hide(z295=(45.6914,416.289))z295
+ ..controls hide(z296=(67.9297,442.84))z296 and hide(z297=(126.18,452.973))z297..hide(z298=(178.41,439.375))z298
+ ..controls hide(z299=(190.305,436.281))z299 and hide(z300=(210.652,423.285))z300..hide(z301=(215.777,415.512))z301
+ ..controls hide(z302=(220.012,409.086))z302 and hide(z303=(220.012,408.531))z303..hide(z304=(215.859,321.137))z304
+ ..controls hide(z305=(215.172,306.656))z305 and hide(z306=(214.898,294.762))z306..hide(z307=(215.254,294.762))z307
+ ..controls hide(z308=(215.605,294.762))z308 and hide(z309=(223.656,294.059))z309..hide(z310=(232.965,293.211))z310
+ ..controls hide(z311=(243.824,292.223))z311 and hide(z312=(250.699,292.695))z312..hide(z313=(251.867,294.504))z313
+ ..controls hide(z314=(254.336,298.336))z314 and hide(z315=(254.438,314.156))z315..hide(z316=(252.25,355.527))z316
+ ..controls hide(z317=(249.855,400.773))z317 and hide(z318=(250.184,408.273))z318..hide(z319=(254.859,415.512))z319
+ ..controls hide(z320=(259.375,422.504))z320 and hide(z321=(276.145,434.113))z321..hide(z322=(283.902,435.613))z322
+ ..controls hide(z323=(287.008,436.215))z323 and hide(z324=(290.531,437.273))z324..hide(z325=(291.66,437.945))z325
+ ..controls hide(z326=(295.078,439.977))z326 and hide(z327=(321.395,442.863))z327..hide(z328=(340.012,443.246))z328
+ ..controls hide(z329=(360.438,443.668))z329 and hide(z330=(383.953,439.043))z330..hide(z331=(397.93,431.859))z331
+ ..controls hide(z332=(410.34,425.48))z332 and hide(z333=(426.988,411.098))z333..hide(z334=(425.234,408.273))z334
+ ..controls hide(z335=(424.363,406.875))z335 and hide(z336=(424.719,405.945))z336..hide(z337=(426.113,405.945))z337
+ ..controls hide(z338=(431.809,405.945))z338 and hide(z339=(434.047,430.77))z339..hide(z340=(429.445,442.922))z340
+ ..controls hide(z341=(425.523,453.285))z341 and hide(z342=(396.121,466.371))z342..hide(z343=(369.746,469.484))z343
+ ..controls hide(z344=(321.137,475.227))z344 and hide(z345=(278.848,468.273))z345..hide(z346=(249.516,449.711))z346
+ ..controls hide(z347=(235.895,441.094))z347 and hide(z348=(237.102,440.926))z348..hide(z349=(212.797,454.836))z349
+ ..controls hide(z350=(201.375,461.375))z350 and hide(z351=(190.82,465.438))z351..hide(z352=(174.531,469.566))z352
+ ..controls hide(z353=(162.121,472.715))z353 and hide(z354=(118.023,476.332))z354..cycle;
+ renewcolore;
+ %%%draw PreeditedPath4;
+ %%%dotlabels.rt(283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354);
+ PreeditedPath5 = hide(z355=(92.8242,426.75))z355..controls hide(z356=(76.793,421.73))z356 and hide(z357=(55.9102,408.535))z357..hide(z358=(51.7109,400.773))z358
+ ..controls hide(z359=(49.1953,396.129))z359 and hide(z360=(49.5352,381.125))z360..hide(z361=(53.0586,341.047))z361
+ ..controls hide(z362=(53.875,331.738))z362 and hide(z363=(55.0859,321.16))z363..hide(z364=(55.7188,317.773))z364
+ ..controls hide(z365=(56.3516,314.406))z365 and hide(z366=(57.5898,307.434))z366..hide(z367=(58.4336,302.52))z367
+ ..controls hide(z368=(60.5547,290.109))z368 and hide(z369=(69.25,267.414))z369..hide(z370=(73.1719,264.039))z370
+ ..controls hide(z371=(75.7539,261.82))z371 and hide(z372=(78.3516,263.734))z372..hide(z373=(84.3516,272.27))z373
+ ..controls hide(z374=(101.293,296.363))z374 and hide(z375=(138.848,313.016))z375..hide(z376=(184.613,316.723))z376
+ ..controls hide(z377=(190.043,317.16))z377 and hide(z378=(194.754,317.863))z378..hide(z379=(195.145,318.293))z379
+ ..controls hide(z380=(196.121,319.367))z380 and hide(z381=(198.75,349.062))z381..hide(z382=(200.617,380.09))z382
+ ..controls hide(z383=(201.766,399.223))z383 and hide(z384=(201.25,403.172))z384..hide(z385=(196.605,410.598))z385
+ ..controls hide(z386=(191.781,418.32))z386 and hide(z387=(180.996,424.793))z387..hide(z388=(167.031,428.352))z388
+ ..controls hide(z389=(164.031,429.113))z389 and hide(z390=(149.449,430.082))z390..hide(z391=(134.453,430.508))z391
+ ..controls hide(z392=(114.285,431.086))z392 and hide(z393=(103.582,430.117))z393..cycle;
+ renewcolore;
+ %%%draw PreeditedPath5;
+ %%%dotlabels.rt(355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393);
+ PreeditedPath6 = hide(z394=(166.773,417.551))z394..controls hide(z395=(178.926,409.805))z395 and hide(z396=(183.246,404.352))z396..hide(z397=(185.59,393.793))z397
+ ..controls hide(z398=(189.672,375.434))z398 and hide(z399=(182.383,357.863))z399..hide(z400=(167.289,349.672))z400
+ ..controls hide(z401=(160.973,346.242))z401 and hide(z402=(152.293,345.09))z402..hide(z403=(130.574,344.797))z403
+ ..controls hide(z404=(104.461,344.438))z404 and hide(z405=(101.137,344.945))z405..hide(z406=(89.9805,350.973))z406
+ ..controls hide(z407=(73.0039,360.145))z407 and hide(z408=(70.1602,365.352))z408..hide(z409=(70.6719,386.293))z409
+ ..controls hide(z410=(71.0781,402.844))z410 and hide(z411=(71.6211,404.305))z411..hide(z412=(79.8945,411.172))z412
+ ..controls hide(z413=(92.1172,421.312))z413 and hide(z414=(103.426,423.848))z414..hide(z415=(133.16,423.125))z415
+ ..controls hide(z416=(153.07,422.637))z416 and hide(z417=(160.801,421.355))z417..cycle;
+ renewcolore;
+ %%%draw PreeditedPath6;
+ %%%dotlabels.rt(394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417);
+ PreeditedPath7 = hide(z418=(319.328,429.711))z418..controls hide(z419=(304.328,428.168))z419 and hide(z420=(285.598,421.395))z420..hide(z421=(277.957,414.754))z421
+ ..controls hide(z422=(270.199,408.016))z422 and hide(z423=(270.199,408.016))z423..hide(z424=(270.848,363.801))z424
+ ..controls hide(z425=(271.199,339.496))z425 and hide(z426=(272.367,318.77))z426..hide(z427=(273.43,317.773))z427
+ ..controls hide(z428=(274.504,316.773))z428 and hide(z429=(282.867,315.352))z429..hide(z430=(292.176,314.586))z430
+ ..controls hide(z431=(322.43,312.109))z431 and hide(z432=(349.387,301.004))z432..hide(z433=(370.004,282.531))z433
+ ..controls hide(z434=(377.246,276.043))z434 and hide(z435=(384.23,267.918))z435..hide(z436=(385.496,264.512))z436
+ ..controls hide(z437=(388.723,255.828))z437 and hide(z438=(392.137,257.012))z438..hide(z439=(398.156,268.906))z439
+ ..controls hide(z440=(406.961,286.309))z440 and hide(z441=(412.965,314.156))z441..hide(z442=(414.879,346.477))z442
+ ..controls hide(z443=(415.508,357.078))z443 and hide(z444=(416.734,372.727))z444..hide(z445=(417.582,380.992))z445
+ ..controls hide(z446=(419.117,395.992))z446 and hide(z447=(419.047,396.199))z447..hide(z448=(409.309,405.184))z448
+ ..controls hide(z449=(400.258,413.527))z449 and hide(z450=(387.367,421.762))z450..hide(z451=(381.383,423.016))z451
+ ..controls hide(z452=(361.473,427.191))z452 and hide(z453=(351.066,428.766))z453..hide(z454=(336.133,429.852))z454
+ ..controls hide(z455=(331.219,430.207))z455 and hide(z456=(323.539,430.145))z456..cycle;
+ renewcolore;
+ %%%draw PreeditedPath7;
+ %%%dotlabels.rt(418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456);
+ PreeditedPath8 = hide(z457=(365.867,420.535))z457..controls hide(z458=(386.812,415.41))z458 and hide(z459=(394.578,407.562))z459..hide(z460=(396.934,389.141))z460
+ ..controls hide(z461=(398.883,373.883))z461 and hide(z462=(395.469,363.449))z462..hide(z463=(385.777,355.023))z463
+ ..controls hide(z464=(375.578,346.16))z464 and hide(z465=(363.539,343.035))z465..hide(z466=(338.719,342.801))z466
+ ..controls hide(z467=(320.359,342.633))z467 and hide(z468=(314.613,343.66))z468..hide(z469=(303.812,349.062))z469
+ ..controls hide(z470=(295.797,353.07))z470 and hide(z471=(289.52,358.375))z471..hide(z472=(287.289,363.023))z472
+ ..controls hide(z473=(283.066,371.828))z473 and hide(z474=(282.941,390.949))z474..hide(z475=(287.039,400.773))z475
+ ..controls hide(z476=(290.32,408.637))z476 and hide(z477=(307.434,419.148))z477..hide(z478=(320.621,421.398))z478
+ ..controls hide(z479=(330.445,423.078))z479 and hide(z480=(357.594,422.559))z480..cycle;
+ renewcolore;
+ %%%draw PreeditedPath8;
+ %%%dotlabels.rt(457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480);
+ PreeditedPath9 = hide(z481=(183.32,304.07))z481..controls hide(z482=(182.762,303.512))z482 and hide(z483=(178.152,302.418))z483..hide(z484=(173.238,301.684))z484
+ ..controls hide(z485=(157.07,299.266))z485 and hide(z486=(152.035,297.691))z486..hide(z487=(134.969,289.703))z487
+ ..controls hide(z488=(75.7578,261.984))z488 and hide(z489=(65.9453,218.688))z489..hide(z490=(106.113,162.379))z490
+ ..controls hide(z491=(127.324,132.645))z491 and hide(z492=(129.184,130.402))z492..hide(z493=(150.711,108.598))z493
+ ..controls hide(z494=(201.766,56.8828))z494 and hide(z495=(234.418,36.8555))z495..hide(z496=(245.555,50.4219))z496
+ ..controls hide(z497=(247.254,52.4883))z497 and hide(z498=(249.824,54.2969))z498..hide(z499=(251.066,54.2969))z499
+ ..controls hide(z500=(260.082,54.2969))z500 and hide(z501=(322.727,110.148))z501..hide(z502=(340.977,134.453))z502
+ ..controls hide(z503=(344.664,139.367))z503 and hide(z504=(348.984,144.805))z504..hide(z505=(350.43,146.348))z505
+ ..controls hide(z506=(358.02,154.461))z506 and hide(z507=(376.469,185.906))z507..hide(z508=(380.312,197.285))z508
+ ..controls hide(z509=(385.555,212.797))z509 and hide(z510=(384.996,233.473))z510..hide(z511=(378.996,246.152))z511
+ ..controls hide(z512=(366.691,272.152))z512 and hide(z513=(328.637,296.117))z513..hide(z514=(290.883,301.645))z514
+ ..controls hide(z515=(286.488,302.285))z515 and hide(z516=(280.605,303.227))z516..hide(z517=(277.309,303.812))z517
+ ..controls hide(z518=(272.703,304.633))z518 and hide(z519=(271.492,303.555))z519..hide(z520=(271.492,298.641))z520
+ ..controls hide(z521=(271.492,291.242))z521 and hide(z522=(272.527,290.469))z522..hide(z523=(284.938,288.574))z523
+ ..controls hide(z524=(297.043,286.727))z524 and hide(z525=(313.898,280.137))z525..hide(z526=(326.309,272.398))z526
+ ..controls hide(z527=(339.352,264.266))z527 and hide(z528=(347.293,248.223))z528..hide(z529=(347.363,229.863))z529
+ ..controls hide(z530=(347.465,203.504))z530 and hide(z531=(331.738,187.492))z531..hide(z532=(296.832,178.406))z532
+ ..controls hide(z533=(281.016,174.293))z533 and hide(z534=(270.199,173.602))z534..hide(z535=(230.121,174.141))z535
+ ..controls hide(z536=(175.566,174.875))z536 and hide(z537=(157.633,178.863))z537..hide(z538=(136.523,194.965))z538
+ ..controls hide(z539=(108.207,216.559))z539 and hide(z540=(114.027,260.922))z540..hide(z541=(147.383,277.742))z541
+ ..controls hide(z542=(156.949,282.566))z542 and hide(z543=(178.668,289.215))z543..hide(z544=(188.234,290.25))z544
+ ..controls hide(z545=(192.891,290.75))z545 and hide(z546=(196.508,291.934))z546..hide(z547=(196.508,292.953))z547
+ ..controls hide(z548=(196.508,293.949))z548 and hide(z549=(196.508,297.09))z549..hide(z550=(196.508,299.934))z550
+ ..controls hide(z551=(196.508,303.676))z551 and hide(z552=(194.828,305.105))z552..hide(z553=(190.434,305.105))z553
+ ..controls hide(z554=(187.07,305.105))z554 and hide(z555=(183.895,304.645))z555..cycle;
+ renewcolore;
+ %%%draw PreeditedPath9;
+ %%%dotlabels.rt(481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555);
+ PreeditedPath10 = hide(z556=(214.348,278.086))z556..controls hide(z557=(213.785,277.594))z557 and hide(z558=(206.594,276.473))z558..hide(z559=(198.578,275.629))z559
+ ..controls hide(z560=(167.289,272.336))z560 and hide(z561=(138.164,257.289))z561..hide(z562=(136.512,243.566))z562
+ ..controls hide(z563=(135.078,231.672))z563 and hide(z564=(139.324,214.027))z564..hide(z565=(145.094,207.887))z565
+ ..controls hide(z566=(151.16,201.426))z566 and hide(z567=(171.43,192.082))z567..hide(z568=(184.098,189.906))z568
+ ..controls hide(z569=(202.457,186.746))z569 and hide(z570=(270.727,187))z570..hide(z571=(286.746,190.281))z571
+ ..controls hide(z572=(318.293,196.75))z572 and hide(z573=(331.578,210.402))z573..hide(z574=(330.047,234.777))z574
+ ..controls hide(z575=(329.25,247.445))z575 and hide(z576=(328.191,249.797))z576..hide(z577=(320.359,256.324))z577
+ ..controls hide(z578=(306.219,268.109))z578 and hide(z579=(288.816,273.094))z579..hide(z580=(253.652,275.441))z580
+ ..controls hide(z581=(241.5,276.25))z581 and hide(z582=(227.781,277.391))z582..hide(z583=(223.398,277.957))z583
+ ..controls hide(z584=(219.004,278.523))z584 and hide(z585=(214.918,278.582))z585..cycle;
+ renewcolore;
+ %%%draw PreeditedPath10;
+ %%%dotlabels.rt(556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585);
+ PreeditedPath11 = hide(z586=(255.977,265.277))z586..controls hide(z587=(283.645,263.309))z587 and hide(z588=(285.629,262.883))z588..hide(z589=(300.453,255.688))z589
+ ..controls hide(z590=(314.672,248.781))z590 and hide(z591=(319.508,239.949))z591..hide(z592=(316.844,225.727))z592
+ ..controls hide(z593=(312.848,204.367))z593 and hide(z594=(293.73,197.211))z594..hide(z595=(237.879,196.168))z595
+ ..controls hide(z596=(175.566,195.008))z596 and hide(z597=(146.289,207.188))z597..hide(z598=(148.812,233.227))z598
+ ..controls hide(z599=(150.801,253.754))z599 and hide(z600=(166.516,262.293))z600..hide(z601=(208.145,265.461))z601
+ ..controls hide(z602=(218.227,266.227))z602 and hide(z603=(226.645,267.238))z603..hide(z604=(227.148,267.742))z604
+ ..controls hide(z605=(227.621,268.215))z605 and hide(z606=(229.477,268.215))z606..hide(z607=(231.027,267.742))z607
+ ..controls hide(z608=(232.672,267.242))z608 and hide(z609=(243.824,266.141))z609..cycle;
+ renewcolore;
+ %%%draw PreeditedPath11;
+ %%%dotlabels.rt(586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609);
+ PreeditedPath12 = hide(z610=(104.719,410.492))z610..controls hide(z611=(91.6758,403.551))z611 and hide(z612=(87.9102,397.672))z612..hide(z613=(87.9102,384.227))z613
+ ..controls hide(z614=(87.9102,372.332))z614 and hide(z615=(88.75,370.477))z615..hide(z616=(96.4453,365.305))z616
+ ..controls hide(z617=(111.211,355.375))z617 and hide(z618=(129.801,353.32))z618..hide(z619=(151.777,359.18))z619
+ ..controls hide(z620=(165.77,362.91))z620 and hide(z621=(169.102,367.68))z621..hide(z622=(169.102,383.969))z622
+ ..controls hide(z623=(169.102,398.188))z623 and hide(z624=(166.773,402.285))z624..hide(z625=(155.137,408.543))z625
+ ..controls hide(z626=(147.383,412.719))z626 and hide(z627=(111.504,414.102))z627..cycle;
+ renewcolore;
+ %%%draw PreeditedPath12;
+ %%%dotlabels.rt(610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627);
+ PreeditedPath13 = hide(z628=(151.777,402.477))z628..controls hide(z629=(164.445,395.879))z629 and hide(z630=(167.375,379.109))z630..hide(z631=(157.465,369.902))z631
+ ..controls hide(z632=(151.43,364.293))z632 and hide(z633=(130.574,360.691))z633..hide(z634=(116.871,362.891))z634
+ ..controls hide(z635=(108.34,364.262))z635 and hide(z636=(95.9492,370.898))z636..hide(z637=(95.3984,374.402))z637
+ ..controls hide(z638=(93.8047,384.484))z638 and hide(z639=(94.4102,392.855))z639..hide(z640=(96.9844,396.379))z640
+ ..controls hide(z641=(104.785,407.051))z641 and hide(z642=(136.262,410.555))z642..cycle;
+ renewcolore;
+ %%%draw PreeditedPath13;
+ %%%dotlabels.rt(628,629,630,631,632,633,634,635,636,637,638,639,640,641,642);
+ PreeditedPath14 = hide(z643=(316.613,408.273))z643..controls hide(z644=(312.215,406.977))z644 and hide(z645=(307.352,403.312))z645..hide(z646=(305.621,400))z646
+ ..controls hide(z647=(301.164,391.465))z647 and hide(z648=(299.918,375.328))z648..hide(z649=(303.168,368.195))z649
+ ..controls hide(z650=(306.895,360.008))z650 and hide(z651=(326.051,354.375))z651..hide(z652=(347.25,355.238))z652
+ ..controls hide(z653=(372.074,356.246))z653 and hide(z654=(380.23,362.348))z654..hide(z655=(381.52,380.863))z655
+ ..controls hide(z656=(382.379,393.277))z656 and hide(z657=(381.992,394.16))z657..hide(z658=(371.816,403.012))z658
+ ..controls hide(z659=(365.648,408.371))z659 and hide(z660=(361.602,409.402))z660..hide(z661=(344.535,409.953))z661
+ ..controls hide(z662=(333.418,410.312))z662 and hide(z663=(320.988,409.562))z663..cycle;
+ renewcolore;
+ %%%draw PreeditedPath14;
+ %%%dotlabels.rt(643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663);
+ PreeditedPath15 = hide(z664=(359.664,402.125))z664..controls hide(z665=(373.309,398.008))z665 and hide(z666=(377.633,388.879))z666..hide(z667=(373.41,373.109))z667
+ ..controls hide(z668=(370.441,362.023))z668 and hide(z669=(341.305,357.23))z669..hide(z670=(319.844,364.293))z670
+ ..controls hide(z671=(309.996,367.535))z671 and hide(z672=(305.723,375.176))z672..hide(z673=(307.402,386.555))z673
+ ..controls hide(z674=(309.699,402.117))z674 and hide(z675=(334.84,409.609))z675..cycle;
+ renewcolore;
+ %%%draw PreeditedPath15;
+ %%%dotlabels.rt(664,665,666,667,668,669,670,671,672,673,674,675);
+ PreeditedPath16 = hide(z676=(198.836,254.906))z676..controls hide(z677=(198.25,254.34))z677 and hide(z678=(194.441,253.359))z678..hide(z679=(190.043,252.641))z679
+ ..controls hide(z680=(165.223,248.582))z680 and hide(z681=(155.082,233.176))z681..hide(z682=(168.844,220.43))z682
+ ..controls hide(z683=(180.852,209.305))z683 and hide(z684=(195.473,205.852))z684..hide(z685=(230.121,205.969))z685
+ ..controls hide(z686=(247.961,206.027))z686 and hide(z687=(265.688,206.766))z687..hide(z688=(269.684,207.613))z688
+ ..controls hide(z689=(295.023,213.004))z689 and hide(z690=(306.207,221.254))z690..hide(z691=(303.703,232.707))z691
+ ..controls hide(z692=(301.492,242.828))z692 and hide(z693=(294.762,247.789))z693..hide(z694=(277.957,251.688))z694
+ ..controls hide(z695=(264.254,254.867))z695 and hide(z696=(201.449,257.418))z696..cycle;
+ renewcolore;
+ %%%draw PreeditedPath16;
+ %%%dotlabels.rt(676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696);
+ PreeditedPath17 = hide(z697=(261.148,244.574))z697..controls hide(z698=(294.246,241.137))z698 and hide(z699=(301.031,226.125))z699..hide(z700=(272.785,218.828))z700
+ ..controls hide(z701=(259.723,215.453))z701 and hide(z702=(213.316,215.203))z702..hide(z703=(196.508,218.414))z703
+ ..controls hide(z704=(186.426,220.34))z704 and hide(z705=(175.824,226.34))z705..hide(z706=(175.824,230.121))z706
+ ..controls hide(z707=(175.824,234.188))z707 and hide(z708=(185.906,242.977))z708..hide(z709=(190.82,243.191))z709
+ ..controls hide(z710=(199.352,243.57))z710 and hide(z711=(218.574,246.082))z711..hide(z712=(219.367,246.93))z712
+ ..controls hide(z713=(220.137,247.746))z713 and hide(z714=(243.051,246.457))z714..cycle;
+ renewcolore;
+ %%%draw PreeditedPath17;
+ %%%dotlabels.rt(697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714);
+ PreeditedPath18 = hide(z715=(113.508,390.867))z715..controls hide(z716=(108.598,386.918))z716 and hide(z717=(108.246,385.52))z717..hide(z718=(110.926,380.605))z718
+ ..controls hide(z719=(112.617,377.504))z719 and hide(z720=(114.848,374.797))z720..hide(z721=(115.836,374.652))z721
+ ..controls hide(z722=(134.711,371.871))z722 and hide(z723=(147.383,376.133))z723..hide(z724=(147.383,385.262))z724
+ ..controls hide(z725=(147.383,394.285))z725 and hide(z726=(122.816,398.352))z726..cycle;
+ renewcolore;
+ %%%draw PreeditedPath18;
+ %%%dotlabels.rt(715,716,717,718,719,720,721,722,723,724,725,726);
+ PreeditedPath19 = hide(z727=(325.789,388.312))z727..controls hide(z728=(320.102,383.707))z728 and hide(z729=(320.102,383.707))z729..hide(z730=(325.145,377.504))z730
+ ..controls hide(z731=(334.082,366.508))z731 and hide(z732=(359.402,370.523))z732..hide(z733=(359.402,382.934))z733
+ ..controls hide(z734=(359.402,392.957))z734 and hide(z735=(336.133,396.68))z735..cycle;
+ renewcolore;
+ %%%draw PreeditedPath19;
+ %%%dotlabels.rt(727,728,729,730,731,732,733,734,735);
+ PreeditedPath20 = hide(z736=(209.438,235.988))z736..controls hide(z737=(196.766,234.27))z737 and hide(z738=(194.645,232.738))z738..hide(z739=(200.387,229.457))z739
+ ..controls hide(z740=(203.5,227.68))z740 and hide(z741=(218.227,226.645))z741..hide(z742=(237.363,226.855))z742
+ ..controls hide(z743=(267.098,227.188))z743 and hide(z744=(274.234,228.156))z744..hide(z745=(270.977,231.414))z745
+ ..controls hide(z746=(268.219,234.172))z746 and hide(z747=(221.59,237.637))z747..cycle;
+ renewcolore;
+ %%%draw PreeditedPath20;
+%%%dotlabels.rt(736,737,738,739,740,741,742,743,744,745,746,747);
+ numeric integerindex;
+ for integerindex=1 upto 20:
+ draw PreeditedPath[integerindex] withpen pencircle scaled 1.5mm;
+ endfor;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/cartaxes.mp b/graphics/metapost/contrib/macros/featpost/example/cartaxes.mp
new file mode 100644
index 0000000000..6d01feda62
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cartaxes.mp
@@ -0,0 +1,31 @@
+% cartaxes.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ cartaxes(1,1,1);
+endfig;
+
+f := (5,3.5,1);
+beginfig(2);
+ cartaxes(1,1,1);
+ color va, vb, vc, vd;
+ va = (0.29,0.7,1.0);
+ vb = (X(va),Y(va),0);
+ vc = N((-Y(va),X(va),0));
+ vd = (0,Y(vc),0);
+ drawarrow rp(black)--rp(va);
+ draw rp(black)--rp(vb)--rp(va) dashed evenly;
+ draw rp(vc)--rp(vd) dashed evenly;
+ drawarrow rp(black)--rp(vc);
+ squareangline( va, vc, black, 0.15 );
+ angline( va, red, black, 0.75, decimal getangle( va, red ), lft );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/casadopessoal.mp b/graphics/metapost/contrib/macros/featpost/example/casadopessoal.mp
new file mode 100644
index 0000000000..f6b9242077
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/casadopessoal.mp
@@ -0,0 +1,63 @@
+% casadopessoal.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+numeric u, raio, cc, cp, espa, cpc;
+u = 50mm;
+raio = 0.4u;
+espa = u-2*raio;
+cpc = u;
+cc = 2.16u;
+cp = 1.6u;
+
+color pgreen, cblue, fgreen;
+pgreen = (139,194,52)/255;
+cblue = (12,84,130)/255;
+fgreen = (150,200,50)/255;
+picture C, P;
+
+def boxpath( expr w, h, r ) =
+ ((w,h-r)...(w-r,h)---(r-w,h)...(-w,h-r)---(-w,r-h)...(r-w,-h)---(w-r,-h)...(w,r-h)---cycle)
+enddef;
+
+def boxdraw( expr W, H, R, coox, cooy, col ) =
+ fill boxpath( W/2, H/2, R ) shifted (coox,cooy) withcolor col
+enddef;
+
+beginfig(2);
+ numeric altur;
+ altur = 2*(cp+espa)+raio;
+ boxdraw(u,cp,raio,-0.5*(cc+espa),0.5*(cp-altur),pgreen);
+ boxdraw(cc,u,raio,0,cp+0.5*(espa-altur),pgreen);
+ boxdraw(u,cp,raio,-0.5*(cc+espa),0.5*(altur-cp)-espa-raio,pgreen);
+ boxdraw(cc,u,raio,0,0.5*(altur-u),pgreen);
+ boxdraw(u,cp,raio,0.5*(cc+espa),0.5*(altur-cp)-espa-raio,pgreen);
+ P = currentpicture;
+endfig;
+
+beginfig(1);
+ boxdraw(u,altur-2*(raio+espa),raio,-0.5*(cc+espa),0,cblue);
+ boxdraw(cc,u,raio,0,0.5*(u-altur),cblue);
+ boxdraw(u,cpc,raio,0.5*(cc+espa),0.5*(altur-cpc)-espa-raio,cblue);
+ boxdraw(cc,u,raio,0,0.5*(altur-u),cblue);
+ boxdraw(u,cpc,raio,0.5*(cc+espa),0.5*(cpc-altur)+espa+raio,cblue);
+ C = currentpicture;
+endfig;
+
+beginfig(3);
+ draw C shifted (-raio-0.5*(cc+3*espa),0);
+ draw P shifted (raio+0.5*(cc+3*espa),0);
+endfig;
+
+beginfig(4);
+ numeric altur;
+ altur = 2*(cp+espa)+raio;
+ boxdraw(u,cp,raio,-0.5*(cc+espa),0.5*(cp-altur),fgreen);
+ boxdraw(cp,u,raio,0.5*(cp-cc),cp+0.5*(espa-altur),fgreen);
+ boxdraw(u,cp,raio,-0.5*(cc+espa),0.5*(altur-cp)-espa-raio,fgreen);
+ boxdraw(cc,u,raio,0,0.5*(altur-u),fgreen);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/cellevolve.mp b/graphics/metapost/contrib/macros/featpost/example/cellevolve.mp
new file mode 100644
index 0000000000..d4988a2942
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cellevolve.mp
@@ -0,0 +1,72 @@
+% cellevolve.mp
+% L. Nobre G.
+% IYP (2005)
+
+def projectyz( expr theta, phi ) =
+ (cosd(theta)*sind(phi),sind(theta))
+enddef;
+
+def rotatangl( expr ori, rang ) =
+ ( (xpart ori)*cosd(rang)-(ypart ori)*sind(rang),
+ (xpart ori)*sind(rang)+(ypart ori)*cosd(rang))
+enddef;
+
+numeric vertn, horin, grids, thex, they, varx, xcomp;
+numeric ymax, xmax, i, j, size, u, ycomp, theta, phi;
+numeric power, xlim, ylim, frac, vary, allang, shift;
+numeric perang, ampper, npers, velang, displamp, hdk;
+pair actpos, direct, one, two, displvec;
+path cirma, VGAborder;
+color thedark;
+
+u := 0.5mm;
+allang := 15;
+ampper := 20;
+npers := 4;
+velang := 5;
+hdk := 0.6;
+displamp := 8u;
+frac := 1.5;
+power := 0.8;
+vertn := 20;
+horin := 41;
+size := 3u;
+grids := 8u;
+ymax := floor(0.5*(vertn*frac-1));
+xmax := floor(0.5*(horin*frac-1));
+xlim := grids*0.5*horin;
+ylim := grids*0.5*vertn;
+varx := 180/(0.5*(horin-1));
+vary := 90/(0.5*(vertn-1));
+cirma := fullcircle scaled (grids);
+
+ VGAborder := (-xlim,-ylim)-- %
+ ( xlim,-ylim)-- %
+ ( xlim, ylim)-- %
+ (-xlim, ylim)--cycle; %
+
+beginfig(0);
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*rotatangl((i,j),allang);
+ thex:=i*varx;
+ they:=j*vary;
+ theta:=90*cosd(they)*cosd(thex);
+ phi:=60*sind(2*they)*sind(thex);
+ perang := allang+ampper*sind(npers*they);
+ direct:=rotatangl(projectyz(theta,phi),perang);
+ displvec:=dir(velang)*displamp*cosd(npers*they);
+ actpos := actpos+displvec;
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ thedark := (1-hdk*(ypart direct))*white;
+ fill cirma shifted actpos withcolor thedark;
+ draw one--two;
+ endfor;
+ endfor;
+ clip currentpicture to VGAborder;
+ undraw VGAborder;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/cinemwork.mp b/graphics/metapost/contrib/macros/featpost/example/cinemwork.mp
new file mode 100644
index 0000000000..7ff440223c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cinemwork.mp
@@ -0,0 +1,322 @@
+% cinemwork.mp
+% L. Nobre G.
+% 2013
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+def wmg = withcolor mygray enddef;
+
+def resetpic =
+ begingroup
+ tmpicture := currentpicture;
+ currentpicture := nullpicture
+ endgroup
+enddef;
+
+def roundedcornersbox( expr swc, nec, cornerrad ) =
+ begingroup
+ pair swe, swn, nes, new, nwe, nws, sen, sew;
+ numeric lowx, higx, lowy, higy;
+ path returnpath;
+ lowx = xpart swc;
+ higx = xpart nec;
+ lowy = ypart swc;
+ higy = ypart nec;
+ swe = ( lowx+cornerrad, lowy );
+ nwe = ( lowx+cornerrad, higy );
+ new = ( higx-cornerrad, higy );
+ sew = ( higx-cornerrad, lowy );
+ swn = ( lowx, lowy+cornerrad );
+ nws = ( lowx, higy-cornerrad );
+ nes = ( higx, higy-cornerrad );
+ sen = ( higx, lowy+cornerrad );
+ returnpath = nws{up}..{right}nwe--
+ new{right}..{down}nes--
+ sen{down}..{left}sew--
+ swe{left}..{up}swn--cycle;
+ ( returnpath )
+ endgroup
+enddef;
+
+def rectracarea( expr unit, largnumtracs, espesfrac, tangle )=
+ begingroup
+ picture tmpicture, returnpicture;
+ numeric largarea, espesarea, i;
+ pair esquarea, direarea, espessvec;
+ path boxarea, traco;
+ tmpicture = currentpicture;
+ currentpicture := nullpicture;
+ largarea = largnumtracs*unit;
+ espesarea = espesfrac*largarea;
+ esquarea = (-largarea/2,0);
+ direarea = (largarea/2,0);
+ espessvec = (0,espesarea);
+ boxarea = esquarea--direarea--
+ (direarea+espessvec)--(esquarea+espessvec)--cycle;
+ traco = ( origin--( dir( tangle ) ) ) scaled 6in;
+ for i=-largnumtracs upto largnumtracs:
+ draw traco shifted (2*i*unit,0);
+ endfor;
+ clip currentpicture to boxarea;
+ returnpicture = currentpicture;
+ currentpicture := nullpicture;
+ draw tmpicture;
+ ( returnpicture )
+ endgroup
+enddef;
+
+def picketfence =
+ begingroup
+ picture storepicture, returnpicture, minor, major, mtics;
+ path borderbox;
+ numeric rule;
+ storepicture := currentpicture;
+ currentpicture := nullpicture;
+ pickup pencircle scaled 0;
+ borderbox = origin--(136mm,0)--(136mm,45mm)--(0,45mm)--cycle;
+ linecap := butt;
+ pickup pencircle scaled 5mm;
+ draw origin--(0,1cm);
+ resetpic;
+ minor = tmpicture;
+ draw origin--(0,1.5cm);
+ resetpic;
+ mtics = tmpicture;
+ draw origin--(0,3cm);
+ resetpic;
+ major = tmpicture;
+ for rule = -5cm step 1cm until 5cm:
+ draw minor shifted (rule+68mm,0);
+ endfor;
+ for rule = -5cm step 5cm until 5cm:
+ draw major shifted (rule+68mm,0);
+ endfor;
+ for rule = -1 step 2 until 1:
+ draw mtics shifted (rule*5mm+68mm,3cm);
+ endfor;
+ linecap := rounded;
+ pickup pencircle scaled 0;
+ clip currentpicture to borderbox;
+ draw borderbox;
+ returnpicture := currentpicture rotated 180 shifted (136mm,45mm);
+ currentpicture := storepicture;
+ ( returnpicture scaled (1/(136mm)) )
+ endgroup
+enddef;
+
+def woodblock =
+ begingroup
+ picture storepicture, returnpicture;
+ path borderbox;
+ storepicture := currentpicture;
+ currentpicture := nullpicture;
+ borderbox = origin--(136mm,0)--(136mm,45mm)--(0,45mm)--cycle;
+ fill borderbox wmg;
+ returnpicture := currentpicture;
+ currentpicture := storepicture;
+ ( returnpicture scaled (1/(136mm)) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u, ma, mb, mc, md, me, mf, mg, mh, mi, mj, mk, ml, mq;
+ numeric mn, mo, mp, rangle, xzero, ystart, yzero, yend, mr;
+ numeric magn, xthree, ymed;
+ picture bancada, tmpicture, storepicture;
+ path carro, lwheel, rwheel, zoom;
+ color mygray;
+ ahangle := 30;
+ ahlength := 10pt;
+ u := 1mm;
+ ma := 2u;
+ mb := 150u;
+ mc := 0.25mb;
+ md := mb-mc;
+ me := 8u;
+ mf := 16u;
+ rangle := -angle(md-mc,mf-me);
+ mg := 3u;
+ mh := 7u;
+ mi := 1.2u;
+ mj := 4mi;
+ mk := 0.7mh;
+ ml := 0.16mb;
+ mn := mi+mj;
+ mo := (0.5*mg)+(1.5*ma);
+ mq := 7u;
+ mr := (mf*md-me*mc)/(mf-me);
+ mygray := 0.8white;
+ magn := 2.5;
+
+% draw picketfence scaled 0.8ml shifted (mn+0.1ml,mo+mk);
+ draw woodblock scaled 0.8ml shifted (mn+0.1ml,mo+mk);
+
+ linecap := butt;
+ pickup pencircle scaled ma;
+ draw (0,0)--(mb,0) wmg;
+ draw (0,0.5mg)--(mb,0.5mg);
+ draw (0,-0.5mg)--(mb,-0.5mg);
+ draw (mi,0)--(mi,mh);
+ draw (mb-mi,0)--(mb-mi,mh);
+ draw (mc,0)--(mc,-mf);
+ draw (md,0)--(md,-me);
+ linecap := rounded;
+ draw (-0.5mg,0)--(-mq-2u,0) dashed evenly withpen pencircle scaled 0pt;
+ path angarc;
+ angarc = fullcircle cutafter (origin--1.1*dir(-rangle));
+ angarc := (angarc rotated 180) scaled (2*(mq+mr)) shifted (mr,0);
+ draw angarc dashed evenly withpen pencircle scaled 0pt;
+ label.rt( btex $\theta$ etex scaled magn, point 0.5 of angarc );
+ pickup pencircle scaled 0.67ma;
+ carro := roundedcornersbox( (mn,mo),(mn+ml,mo+mk), 2u );
+ draw carro;
+ lwheel := fullcircle rotated 90 scaled mk shifted (mn+0.2ml,0.5*(mk+mg));
+ rwheel := fullcircle rotated 90 scaled mk shifted (mn+0.8ml,0.5*(mk+mg));
+ pickup pencircle scaled 0.3ma;
+ draw lwheel cutafter carro cutbefore carro;
+ draw rwheel cutbefore carro cutafter carro;
+
+% xzero := (0.8ml)*52.5/136+mn+(0.5ml);
+ xzero := (1.0ml)*52.5/136+mn+(0.5ml);
+ ystart := 3.5*(mo+mk);
+ yzero := 1.05*(mo+mk)+(0.8ml)*45/136;
+ pickup pencircle scaled 0.3ma;
+ drawarrow (xzero,ystart)--(xzero,yzero);
+ label.top( btex $x_0$ etex scaled magn, (xzero,ystart) );
+ %zoom := fullcircle scaled (0.5ml) shifted (xzero,mo+mk+(0.8ml)*45/136);
+ %storepicture := currentpicture;
+ %clip currentpicture to zoom;
+ %draw zoom;
+ %resetpic;
+ %draw storepicture;
+ %draw tmpicture scaled 2 shifted (-5cm,5mm);
+
+ xthree := 0.5*(mb+mn+ml);
+ yend := 2mo;
+ drawarrow (xthree,ystart)--(xthree,yend);
+ label.top( btex $x_3$ etex scaled magn, (xthree,ystart) );
+ mp := 0.8*(mb-0.5*(mb+mn+ml));
+ drawarrow (xthree-mp,ystart)--(xthree-mp,yend);
+ label.top( btex $x_1$ etex scaled magn, (xthree-mp,ystart) );
+ drawarrow (xthree+mp,ystart)--(xthree+mp,yend);
+ label.top( btex $x_2$ etex scaled magn, (xthree+mp,ystart) );
+ ymed := 0.5*(ystart+yend);
+ drawdblarrow (xthree-mp,ymed)--(xthree,ymed);
+ drawdblarrow (xthree,ymed)--(xthree+mp,ymed);
+ label.top( btex $D/2$ etex scaled magn, (xthree-(0.5*mp),ymed) );
+ label.top( btex $D/2$ etex scaled magn, (xthree+(0.5*mp),ymed) );
+ resetpic;
+ draw tmpicture shifted (-md,me) rotated rangle shifted (0.25mb,0);
+ bancada := rectracarea( u, 1.2*mb/u, 0.06, 45 ) rotated 180;
+ draw (-0.6mb,0)--(0.6mb,0);
+ draw bancada;
+ resetpic;
+ draw tmpicture shifted (10.5cm, 3cm );
+endfig;
+
+beginfig(2);
+ numeric u, ma, mb, mc, md, me, mf, mg, mh, mi, mj, mk, ml;
+ numeric mn, mo, rangle, xzero, ystart, yzero, yend;
+ numeric magn, xthree, ymed, xphot;
+ picture bancada, tmpicture, storepicture;
+ path carro, lwheel, rwheel, zoom;
+ color mygray;
+ ahangle := 30;
+ ahlength := 10pt;
+ u := 1mm;
+ ma := 2u;
+ mb := 150u;
+ mc := 0.25mb;
+ md := 3mc;
+ me := 8u;
+ mf := 11u;
+ rangle := -angle(md-mc,mf-me);
+ mg := 3u;
+ mh := 7u;
+ mi := 1.2u;
+ mj := 4mi;
+ mk := 0.7mh;
+ ml := 0.16mb;
+ mn := mi+mj;
+ mo := (0.5*mg)+(1.5*ma);
+ drawoptions( withcolor 0.6white );
+ linecap := rounded;
+ pickup pencircle scaled 0.67ma;
+ carro := roundedcornersbox( (mn,mo),(mn+ml,mo+mk), 2u );
+ draw carro;
+ lwheel := fullcircle rotated 90 scaled mk shifted (mn+0.2ml,0.5*(mk+mg));
+ rwheel := fullcircle rotated 90 scaled mk shifted (mn+0.8ml,0.5*(mk+mg));
+ pickup pencircle scaled 0.3ma;
+ draw lwheel cutafter carro cutbefore carro;
+ draw rwheel cutbefore carro cutafter carro;
+ draw picketfence scaled 0.8ml shifted (mn+0.1ml,mo+mk);
+ drawoptions();
+ mygray := 0.8white;
+ linecap := butt;
+ pickup pencircle scaled ma;
+ draw (0,0)--(mb,0) wmg;
+ draw (0,0.5mg)--(mb,0.5mg);
+ draw (0,-0.5mg)--(mb,-0.5mg);
+ draw (mi,0)--(mi,mh);
+ draw (mb-mi,0)--(mb-mi,mh);
+ draw (mc,0)--(mc,-mf);
+ draw (md,0)--(md,-me);
+
+ xzero := (0.8ml)*52.5/136+mn+(0.5ml);
+ ystart := 3.5*(mo+mk);
+ yzero := 1.05*(mo+mk)+(0.8ml)*45/136;
+ yend := 2mo;
+ ymed := 0.5*(ystart+yend);
+ magn := 2.5;
+ pickup pencircle scaled 0.3ma;
+ drawarrow (xzero,ystart)--(xzero,yzero);
+ label.top( btex $x_0$ etex scaled magn, (xzero,ystart) );
+
+ pickup pencircle scaled 0.67ma;
+ carro := roundedcornersbox( (mn+0.5*mb,mo),(mn+ml+0.5*mb,mo+mk), 2u );
+ draw carro;
+ lwheel := fullcircle rotated 90 scaled mk;
+ lwheel := lwheel shifted (mn+0.2ml+0.5*mb,0.5*(mk+mg));
+ rwheel := fullcircle rotated 90 scaled mk;
+ rwheel := rwheel shifted (mn+0.8ml+0.5*mb,0.5*(mk+mg));
+ pickup pencircle scaled 0.3ma;
+ draw lwheel cutafter carro cutbefore carro;
+ draw rwheel cutbefore carro cutafter carro;
+ draw picketfence scaled 0.8ml shifted (mn+0.1ml+0.5*mb,mo+mk);
+
+ pickup pencircle scaled 0;
+ ahlength := 2pt;
+ xzero := (0.8ml)*47.5/136+mn+(0.5ml)+0.5*mb;
+ xphot := (0.8ml)*42.5/136+mn+(0.5ml)+0.5*mb;
+ magn := 0.625;
+ drawarrow (xzero,ymed)--(xzero,yzero);
+ label.rt( btex $x$ etex scaled magn, (xzero,ymed) );
+ drawarrow (xphot,ymed)--(xphot,yzero);
+ label.lft( btex $x_1$ etex scaled magn, (xphot,ymed) );
+ drawarrow (xphot-0.1ml,0.5[ymed,yzero])--(xphot,0.5[ymed,yzero]);
+ draw (xphot,0.5[ymed,yzero])--(xzero,0.5[ymed,yzero]);
+ drawarrow (xzero+0.1ml,0.5[ymed,yzero])--(xzero,0.5[ymed,yzero]);
+ label.rt( btex $D/2$ etex scaled magn, (xzero+0.1ml,0.5[ymed,yzero]) );
+
+ zoom := fullcircle scaled (0.7ml);
+ zoom := zoom shifted (xzero,mo+mk+(0.8ml)*45/136);
+ storepicture := currentpicture;
+ clip currentpicture to zoom;
+ draw zoom;
+ resetpic;
+ draw storepicture;
+ draw tmpicture scaled 4 shifted (-31cm,5mm);
+
+ resetpic;
+ draw tmpicture shifted (-md,me) rotated rangle shifted (0.25mb,0);
+ pickup pencircle scaled 0.3ma;
+ bancada := rectracarea( u, 1.2*mb/u, 0.06, 45 ) rotated 180;
+ draw (-0.6mb,0)--(0.6mb,0);
+ draw bancada;
+ resetpic;
+ draw tmpicture shifted (10.5cm, 3cm );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/circlespeedprofile.mp b/graphics/metapost/contrib/macros/featpost/example/circlespeedprofile.mp
new file mode 100644
index 0000000000..6c2bc9d78c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/circlespeedprofile.mp
@@ -0,0 +1,43 @@
+% circlespeedprofile.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, s, a, ai, as, af, dist, b, ray;
+ pen one;
+ pair poi, ref, tip, cen, contactpoi, toppoi;
+ u = 10cm;
+ s = 0.5;
+ ai = 270;
+ as = -8;
+ af = -90-as;
+ one = pencircle scaled 0.015u;
+ draw (-0.5u*(1+s,1))--(u,-0.5u) withpen one withcolor 0.5white;
+ draw fullcircle scaled u withpen one;
+ contactpoi = (0,-0.5u);
+ toppoi = (0,0.5u);
+ cen = 0.5*(contactpoi+toppoi+(s*u,0));
+ ray = abs( cen-toppoi );
+ draw fullcircle scaled 2ray shifted cen withpen one withcolor red;
+ ref = (0,-0.5u);
+ ahangle := 30;
+ ahlength := 0.03u;
+ for a=ai step as until af:
+ poi := 0.5u*dir(a);
+ dist := abs( poi-ref );
+ tip := poi+s*dist*dir(0.5*a-45);
+ drawarrow poi--tip;
+ endfor;
+ % path prof;
+ % prof = for a=ai step as until af:
+ % hide( poi := 0.5u*dir(a);
+ % dist := abs( poi-ref);
+ % tip := (poi+s*dist*dir(0.5*a-45));
+ % drawarrow poi--tip;)
+ % tip.. endfor cycle;
+ % draw prof withpen one withcolor red;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/closingbox.mp b/graphics/metapost/contrib/macros/featpost/example/closingbox.mp
new file mode 100644
index 0000000000..98b2e0b986
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/closingbox.mp
@@ -0,0 +1,59 @@
+% closingbox.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ f := 1.5*(5,-6,2);
+ Spread := 80;
+ numeric ang;
+ color auxa, auxb, auxc, auxd;
+ ang = 48;
+ V1 := (-1,1,0);
+ V3 := (-1,-1,0);
+ V2 := (-3,1,0);
+ V2 := V1 + rotvecaroundanother( ang, V2-V1, V1-V3 );
+ V4 := (-3,-1,0);
+ V4 := V3 + rotvecaroundanother( ang, V4-V3, V1-V3 );
+ V6 := (-1,-3,0);
+ V6 := V3 + rotvecaroundanother( ang, V6-V3, V4-V3 );
+ V7 := V4 + V3 - V1;
+ V7 := V4 + rotvecaroundanother( ang, V7-V4, V4-V3 );
+ auxa = N( V4-V3 );
+ V5 := V4 + auxa;
+ V5 := V4 + rotvecaroundanother( ang, auxa, V4-V7 );
+ auxb = N( V7-V6 );
+ V8 := V7 + auxb;
+ V8 := V7 + rotvecaroundanother( ang, auxb, V4-V7 );
+
+ V11:= (1,-1,0);
+ V13:= (1,1,0);
+ V12 := (3,-1,0);
+ V12 := V11 + rotvecaroundanother( ang, V12-V11, V11-V13 );
+ V14 := (3,1,0);
+ V14 := V13 + rotvecaroundanother( ang, V14-V13, V11-V13 );
+ V16 := (1,3,0);
+ V16 := V13 + rotvecaroundanother( ang, V16-V13, V14-V13 );
+ V17 := V14 + V13 - V11;
+ V17 := V14 + rotvecaroundanother( ang, V17-V14, V14-V13 );
+ auxc = N( V14-V13 );
+ V15 := V14 + auxc;
+ V15 := V14 + rotvecaroundanother( ang, auxc, V14-V17 );
+ auxd = N( V17-V16 );
+ V18 := V17 + auxd;
+ V18 := V17 + rotvecaroundanother( ang, auxd, V14-V17 );
+
+ makeface1(1,3,11,13);
+ makeface2(1,2,4,3);
+ makeface3(3,4,7,6);
+ makeface4(4,5,8,7);
+ makeface5(11,12,14,13);
+ makeface6(13,14,17,16);
+ makeface7(14,15,18,17);
+
+ draw_invisible( false, false, TableC3, black );
+
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/cmykropes.mp b/graphics/metapost/contrib/macros/featpost/example/cmykropes.mp
new file mode 100644
index 0000000000..ee99d87456
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cmykropes.mp
@@ -0,0 +1,287 @@
+% cmykropes.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+Spread := 39;
+f := 3*(3,5,4);
+
+color ki[]t[];
+numeric inum, icen, bnum, knum, frame, keytime, maxtetradimstep, atime;
+inum = 18;
+icen = 9;
+bnum = inum*8;
+knum = 5;
+maxtetradimstep = 0.2;
+atime = 4.5;
+
+ki0t0 = (-6.6,2.0,0.3);
+ki1t0 = (-5.3,1.5,0.0);
+ki2t0 = (-2.3,1.0,-0.4);
+ki3t0 = (-0.5,0.6,0.8);
+ki4t0 = (0.3,-0.2,-0.4);
+ki5t0 = (0.9,-0.2,-1.1);
+ki6t0 = (0.9,1.8,-0.6);
+ki7t0 = (-0.4,1.8,0.4);
+ki8t0 = (-0.4,0.3,-0.2);
+ki9t0 = (0.3,-6.0,0.1);
+ki10t0 = (5.7,-5.5,0.6);
+ki11t0 = (5.8,0.9,0.6);
+ki12t0 = (1.6,1.2,0.4);
+ki13t0 = (0.1,1.1,-0.6);
+ki14t0 = (-2.4,1.4,0.3);
+ki15t0 = (-2.4,0.0,0.1);
+ki16t0 = (0.2,0.3,-0.9);
+ki17t0 = (1.6,0.3,0.3);
+ki18t0 = (3.9,0.4,0.4);
+
+ki0t1 = (-6.6,2.0,0.3);
+ki1t1 = (-5.3,1.5,0.0);
+ki2t1 = (-2.3,1,-0.4);
+ki3t1 = (-0.5,0.6,0.8);
+ki4t1 = (0.3,-0.2,-0.4);
+ki5t1 = (0.9,-0.2,-1.1);
+ki6t1 = (0.9,1.8,-0.6);
+ki7t1 = (-0.4,1.8,0.4);
+ki8t1 = (-0.4,0.3,-0.2);
+ki9t1 = (0.3,-6.0,0.1);
+ki10t1 = (5.7,-5.5,0.6);
+ki11t1 = (5.8,0.9,0.6);
+ki12t1 = (1.6,1.2,0.4);
+ki13t1 = (0.1,1.1,-0.6);
+ki14t1 = (-2.4,1.8,0.3);
+ki15t1 = (-5.4,2.0,0.3);
+ki16t1 = (-7.2,2.2,0.3);
+ki17t1 = (-8.6,2.4,0.3);
+ki18t1 = (-9.9,2.8,0.4);
+
+ki0t2 = (-6.6,2,0.3);
+ki1t2 = (-5.3,1.5,0.0);
+ki2t2 = (-2.3,1.0,-0.4);
+ki3t2 = (-0.5,0.6,0.8);
+ki4t2 = (0.3,-0.2,-0.4);
+ki5t2 = (0.9,-0.2,-1.1);
+ki6t2 = (0.9,1.8,-0.6);
+ki7t2 = (-0.4,1.8,0.4);
+ki8t2 = (-0.4,0.3,-0.2);
+ki9t2 = (0.3,-6.0,0.1);
+ki10t2 = (5.7,-5.5,0.6);
+ki11t2 = (5.8,0.9,0.6);
+ki12t2 = (1.6,1.2,0.4);
+ki13t2 = (0.1,1.1,-0.6);
+ki14t2 = (-2.4,1.8,0.3);
+ki15t2 = (-5.4,1.4,0.3);
+ki16t2 = (-5.2,1,0.4);
+ki17t2 = (-3.6,0.8,0.4);
+ki18t2 = (-2.4,0.8,0.4);
+
+ki0t3 = (-6.6,2,0.3);
+ki1t3 = (-5.3,1.5,0.0);
+ki2t3 = (-2.3,1.0,-0.4);
+ki3t3 = (-0.5,0.6,0.8);
+ki4t3 = (0.3,-0.2,-0.4);
+ki5t3 = (0.9,-0.2,-1.1);
+ki6t3 = (0.9,1.8,-0.6);
+ki7t3 = (-0.4,1.8,0.4);
+ki8t3 = (-0.4,0.3,-0.2);
+ki9t3 = (0.3,-6.0,0.1);
+ki10t3 = (5.7,-5.5,0.6);
+ki11t3 = (5.8,0.9,0.6);
+ki12t3 = (1.6,1.2,0.4);
+ki13t3 = (0.1,1.1,-0.6);
+ki14t3 = (-2.4,1.8,0.3);
+ki15t3 = (-3.4,1.4,0.3);
+ki16t3 = (-2.4,0.8,0.3);
+ki17t3 = (0.1,0.8,-0.6);
+ki18t3 = (1.6,0.8,0.4);
+
+ki0t4 = (-6.6,2,0.3);
+ki1t4 = (-5.3,1.5,0.0);
+ki2t4 = (-2.3,1.0,-0.4);
+ki3t4 = (-0.5,0.6,0.8);
+ki4t4 = (0.3,-0.2,-0.4);
+ki5t4 = (0.9,-0.2,-1.1);
+ki6t4 = (0.9,1.8,-0.6);
+ki7t4 = (-0.4,1.8,0.4);
+ki8t4 = (-0.4,0.3,-0.2);
+ki9t4 = (0.3,-6.0,0.1);
+ki10t4 = (5.7,-5.5,0.6);
+ki11t4 = (5.8,0.9,0.6);
+ki12t4 = (1.6,1.2,0.4);
+ki13t4 = (0.1,1.1,-0.6);
+ki14t4 = (-2.4,1.8,0.3);
+ki15t4 = (-2.4,0.8,0.3);
+ki16t4 = (0.1,0.8,-0.6);
+ki17t4 = (1.6,0.8,0.4);
+ki18t4 = (5.0,0.8,0.4);
+
+ki0t5 = (-6.6,2,0.3);
+ki1t5 = (-5.3,1.5,0.0);
+ki2t5 = (-2.3,1.0,-0.4);
+ki3t5 = (-0.5,0.6,0.8);
+ki4t5 = (0.3,-0.2,-0.4);
+ki5t5 = (0.9,-0.2,-1.1);
+ki6t5 = (0.9,1.8,-0.6);
+ki7t5 = (-0.4,1.8,0.4);
+ki8t5 = (-0.4,0.3,-0.2);
+ki9t5 = (0.3,-6.0,0.1);
+ki10t5 = (5.7,-5.5,0.6);
+ki11t5 = (5.8,0.9,0.6);
+ki12t5 = (1.6,1.2,0.4);
+ki13t5 = (0.1,1.1,-0.6);
+ki14t5 = (-2.4,1.3,0.3);
+ki15t5 = (-2.4,0.8,0.3);
+ki16t5 = (0.1,0.8,-0.6);
+ki17t5 = (1.6,0.8,0.4);
+ki18t5 = (5.0,0.8,0.4);
+
+
+% Hermite polynomials
+
+vardef Pne( expr pr ) = ( (2*pr-3)*(pr**2)+1 ) enddef;
+vardef Pwo( expr pr ) = ( (3-2*pr)*(pr**2) ) enddef;
+vardef Tne( expr pr ) = ( pr*(pr*(pr-2)+1) ) enddef;
+vardef Two( expr pr ) = ( (pr-1)*(pr**2) ) enddef;
+
+% Derivatives
+
+vardef Pone( expr pr ) = ( 6*pr*(pr-1) ) enddef;
+vardef Ptwo( expr pr ) = ( 6*pr*(1-pr) ) enddef;
+vardef Tone( expr pr ) = ( pr*(3*pr-4)+1 ) enddef;
+vardef Ttwo( expr pr ) = ( pr*(3*pr-2) ) enddef;
+
+vardef Wei( expr pre, nex ) =
+ ( 0.5*( nex - pre ) )
+enddef;
+
+vardef Hermite( expr pr, zer, one, two, thr ) =
+ ( Pne(pr)*one+Pwo(pr)*two+Tne(pr)*Wei(zer,two)+Two(pr)*Wei(one,thr) )
+enddef;
+
+vardef HermiteRate( expr pr, zer, one, two, thr ) =
+ ( Pone(pr)*one+Ptwo(pr)*two+Tone(pr)*Wei(zer,two)+Ttwo(pr)*Wei(one,thr) )
+enddef;
+
+vardef RopeThisWay( expr Sens, Istart, Bnum )( text KP ) =
+ numeric pstep, p, ap, bray;
+ numeric istart, ifinis, thfac, vhfac, sf;
+ color actp, newpoi;
+ pstep = 0.002;
+ bray = 0.12;
+ thfac = 15.5;
+ vhfac = 0.8;
+ if Sens: sf = 1; else: sf = -1; fi;
+ istart = Istart;
+ ifinis = Istart+sf;
+ ap := 0;
+ forever:
+ ap := ap+pstep;
+ actp := Hermite(ap,KP[istart-sf],KP[istart],KP[ifinis],KP[ifinis+sf]);
+ exitif conorm(actp-KP[istart])>bray;
+ endfor;
+ getready("signalvertex("
+ & cstr(actp)
+ & "," & decimal(thfac)
+ & ",(0,0,0));signalvertex("
+ & cstr(actp)
+ & "," & decimal(thfac*vhfac)
+ & ",(1,1,1));", actp);
+ p = 1;
+ forever:
+ ap := ap+pstep;
+ if ap>1:
+ ap := ap-1;
+ istart := ifinis;
+ ifinis := istart+sf;
+ fi;
+ exitif (ifinis>inum-1) or (p>Bnum) or (ifinis<1);
+ newpoi := Hermite(ap,KP[istart-sf],KP[istart],KP[ifinis],KP[ifinis+sf]);
+ if conorm(newpoi-actp)>2*bray:
+ actp := newpoi;
+ getready("signalvertex("
+ & cstr(actp)
+ & "," & decimal(thfac)
+ & ",(0,0,0));signalvertex("
+ & cstr(actp)
+ & "," & decimal(thfac*vhfac)
+ & ",(1,1,1));", actp);
+ p := incr( p );
+ fi;
+ endfor;
+enddef;
+
+def RopeBothWays( expr Icen, Tnum )( text VKP ) =
+ begingroup
+ save bnumpos, bnumneg;
+ numeric bnumpos, bnumneg;
+ bnumpos = floor(Tnum*(inum-Icen)/inum);
+ bnumneg = Tnum-bnumpos;
+ RopeThisWay( true, Icen, bnumpos, VKP );
+ RopeThisWay( false, Icen, bnumneg, VKP )
+ endgroup
+enddef;
+
+beginfig(1);
+ MalcomX := false;
+ numeric i, a, b, c, d, rate, ratenorm, counter;
+ cmykcolor ca, cb, cc, cd, aux;
+ color kp[];
+ frame = 0;
+ keytime = 0;
+ counter = 0;
+ forever:
+ a := keytime-1;
+ if a<0: a := 0; fi;
+ b := keytime;
+ c := keytime+1;
+ d := keytime+2;
+ if d>knum: d := knum; fi;
+ ratenorm := 0;
+ for i=0 upto inum:
+ ca := makecmyk( ki[i]t[a], a );
+ cb := makecmyk( ki[i]t[b], b );
+ cc := makecmyk( ki[i]t[c], c );
+ cd := makecmyk( ki[i]t[d], d );
+ aux := HermiteRate( frame, ca, cb, cc, cd );
+ rate := cmyknorm( aux );
+ if rate>ratenorm: ratenorm := rate; fi;
+ endfor;
+ frame := frame + W( aux )*maxtetradimstep/ratenorm;
+ if frame>1:
+ frame := frame-1;
+ keytime := keytime+1;
+ fi;
+ exitif (keytime>knum-1) or (keytime+frame>atime);
+ endfor;
+ a := keytime-1;
+ if a<0: a := 0; fi;
+ b := keytime;
+ c := keytime+1;
+ d := keytime+2;
+ if d>knum: d := knum; fi;
+ for i=0 upto inum:
+ kp[i] := Hermite( frame, ki[i]t[a], ki[i]t[b], ki[i]t[c], ki[i]t[d] );
+ endfor;
+% counter := incr( counter );
+% beginfig(counter);
+ setthearena( 15, 14 );
+ RopeBothWays( icen, bnum, kp );
+ doitnow;
+% endfig;
+ endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/cone.mp b/graphics/metapost/contrib/macros/featpost/example/cone.mp
new file mode 100644
index 0000000000..96722d0c00
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cone.mp
@@ -0,0 +1,39 @@
+% cone.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (5,3,4);
+ numeric labscal;
+ picture labr, labc, laba, labv;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ labv = btex $\vec{v}$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ verygoodcone(true,black,blue,0.8,blue+green);
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw rp(black)--rp(green)--rp(blue+green) dashed evenly;
+ drawdblarrow rp(black)--rp(0.8green);
+ label.urt( labr, rp(0.4green) );
+ drawarrow rp(black)--rp(0.45*blue);
+ label.rt( laba, rp((0,0,0.25)) );
+ dotlabel.llft( labc, rp(black) );
+ dotlabel.rt( labv, rp(blue+green) );
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/conegetready.mp b/graphics/metapost/contrib/macros/featpost/example/conegetready.mp
new file mode 100644
index 0000000000..f066963331
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/conegetready.mp
@@ -0,0 +1,36 @@
+% conegetready.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric radiusin, fac, i, xcoor, ycoor, radc, numc, baz;
+ color refvec;
+ string rv, mrv, vgc, stra, strb, lrv;
+
+ f := (5,0.3,1.5);
+ Spread := 70;
+ radiusin = 0.3;
+ baz = 0.08;
+ fac = 3;
+ numc = 9;
+ radc = (fac-1)*radiusin*sind(180/numc);
+
+ i = 155;
+ xcoor := -radiusin*cosd(i);
+ ycoor := radiusin*sind(i);
+ refvec := (xcoor,-ycoor,baz);
+ rv := cstr( refvec );
+ mrv := cstr( -refvec );
+ lrv := cstr( (2*fac-1)*refvec );
+ vgc :="verygoodcone(true,fac*";
+ stra := vgc & rv & "," & mrv & "," & decimal(radc) & "," & rv & ")";
+ getready( stra, 0.5*(fac+1)*refvec );
+ strb := vgc & rv & "," & rv & "," & decimal(radc) & "," & lrv & ")";
+ getready( strb, 0.5*(3*fac-1)*refvec );
+ doitnow;
+ produce_vga_border;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/conicurv.mp b/graphics/metapost/contrib/macros/featpost/example/conicurv.mp
new file mode 100644
index 0000000000..937226a702
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/conicurv.mp
@@ -0,0 +1,103 @@
+% conicurv.mp
+% L. Nobre G.
+% Y2K, 2008
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (10,-5,5.44);
+ Spread := 30;
+ numeric shortradius, longradius, theta, width, height;
+ numeric updiff, refsize, vecsize, anglar, bord, totup;
+ color rn, fa, fc, pg, centre, speed, refx, refy, refz, refY, refX;
+ color iplow, iphig, oplow,ophig, anglebase, central, refo;
+ color eplow, ephig, aplow,aphig, anglebase, central, refo;
+ theta = 30;
+ width = 3;
+ shortradius = 2;
+ bord = 2;
+ refsize = 1;
+ vecsize = 2;
+ height = 0.3;
+ anglar = 1.75;
+ totup = 3;
+ longradius = shortradius + width*cosd(theta);
+ updiff = width*sind(theta);
+ iplow = (0,shortradius,0);
+ iphig = (0,longradius,updiff);
+ oplow = (-shortradius,0,0);
+ ophig = (-longradius,0,updiff);
+ aplow = -iplow;
+ aphig = (0,-longradius,updiff);
+ eplow = -oplow;
+ ephig = (longradius,0,updiff);
+ anglebase = (0,longradius,0);
+ centre = 0.5[iplow,iphig]+(0,0,height);
+ central = (0,0,Z(centre));
+% refo = (0,0,-shortradius*sind(theta)/cosd(theta));
+ refo = (0,0.5*Y(centre),Z(centre));
+ refx = refsize*(0,cosd(theta),sind(theta));
+ refy = refsize*(0,-sind(theta),cosd(theta));
+ refz = refsize*(1,0,0);
+ refX = refsize*green;
+ refY = refsize*blue;
+% anglinen( iplow, oplow, (0,0,0), shortradius, "", 0 );
+% anglinen( iphig, ophig, (0,0,updiff), longradius, "", 0 );
+ angline(iphig,anglebase,iplow,width/anglar,btex $\theta$ etex,rt);
+ draw rp(central) withpen pencircle scaled 2pt;
+ draw rp(iplow)--rp(iphig);
+ draw rp(oplow)--rp(ophig);
+ draw rp(aplow)--rp(aphig);
+ draw rp(eplow)--rp(ephig);
+ draw rp(iphig)--rp(anglebase)--rp(aplow) dashed evenly;
+ draw rp(oplow)--rp(eplow) dashed evenly;
+ draw rp(central)--rp(centre) dashed evenly;
+% draw rp((0,-bord,-bord))--rp((0,longradius+bord,-bord))
+% --rp((0,longradius+bord,totup))--rp((0,-bord,totup))--cycle
+% withpen pencircle scaled 2pt;
+ draw rp((0,0,-bord))--rp((0,longradius+bord,-bord))
+ --rp((0,longradius+bord,totup))--rp((0,0,totup))--cycle;
+ drawarrow rp(refo)..rp(refo+refy);
+ drawarrow rp(refo)..rp(refo+refx);
+ drawarrow rp(black)..rp(refX);
+ drawarrow rp(black)..rp(refY);
+ drawarrow rp(refo)..rp(refo+refz);
+ label.llft(btex $y$ etex, rp(refo+refy));
+ label.lrt(btex $x$ etex, rp(refo+refx));
+ label.lft(btex $Y$ etex, rp(refY));
+ label.bot(btex $X$ etex, rp(refX));
+ label.llft(btex $z$ etex, rp(refo+refz));
+ rn = centre+vecsize*refy;
+ fa = centre+vecsize*refx;
+ fc = centre+vecsize*(0,1,0);
+ pg = centre+vecsize*(0,0,-1);
+ speed = centre+vecsize*(1,0,0);
+ drawarrow rp(centre)..rp(rn);
+ drawarrow rp(centre)..rp(fa);
+ drawarrow rp(centre)..rp(fc);
+ drawarrow rp(centre)..rp(pg);
+ drawarrow rp(centre)..rp(speed);
+ label.rt(btex $\vec{R}_N$ etex, rp(rn));
+ label.top(btex $\vec{F}_a$ etex, rp(fa));
+ label.urt(btex $\vec{F}_c$ etex, rp(fc));
+ label.rt(btex $\vec{P}$ etex, rp(pg));
+ label.rt(btex $\vec{v}$ etex, rp(speed));
+ draw rp(centre) withpen pencircle scaled 10pt withcolor blue;
+ pickup pencircle scaled 2pt;
+ draw rigorouscircle( (0,0,updiff), (0,0,1), longradius );
+ draw rigorouscircle( (0,0,0), (0,0,1), shortradius );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/conoscopy.mp b/graphics/metapost/contrib/macros/featpost/example/conoscopy.mp
new file mode 100644
index 0000000000..880c9a0bc4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/conoscopy.mp
@@ -0,0 +1,224 @@
+% conoscopy.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ f := (6,5,5);
+ Spread := 125;
+ numeric maja, raya, angphi, angthe, decl, valy, valz, rectsiz;
+ color majav, aphiv, aphip, majbv, perpv, perpvl;
+ maja = 0.72;
+ raya = 0.5;
+ angphi = 15;
+ angthe = 30;
+ rectsiz = 0.06;
+ majav = (0,0,maja);
+ aphiv = raya*(cosd(angphi),sind(angphi),0);
+ aphip = raya*(sind(angphi),-cosd(angphi),0);
+ majbv = planarrotation( majav, aphip, angthe );
+ perpv = ncrossprod(majbv,aphiv);
+ decl = Z(perpv)/(Y(perpv)++X(perpv));
+ valy = maja*raya/((decl*raya)++maja);
+ valz = valy*decl;
+ if angthe>90: valy:=-valy; fi;
+ perpv := blue*valz-N(aphip)*valy;
+ perpvl = maja*N(perpv);
+ spheroid( black, majav, raya );
+ drawoptions( dashed (withdots scaled 0.25) );
+ cartaxes( 1, 1, 1 );
+ draw rigorouscircle( black, blue, raya );
+ draw rp(black)--rp(-aphiv);
+ draw rp(black)--rp(-majbv);
+ %draw rp(black)--rp(-majav);
+ %draw rp(black)--rp(-aphip);
+ %draw rp(black)--rp(-perpv);
+ draw ellipticpath( black, majbv, aphiv );
+ drawoptions();
+ drawarrow rp((raya,0,0))--rp((1,0,0));
+ drawarrow rp((0,raya,0))--rp((0,1,0));
+ drawarrow rp(majav)--rp((0,0,1));
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ drawarrow rp(black)--rp(aphiv);
+ drawarrow rp(black)--rp(majbv);
+ %draw rp(black)--rp(majav);
+ %drawarrow rp(black)--rp(aphip);
+ drawarrow rp(black)--rp(perpvl);
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw subpath (-1,15) of ellipticpath( black, majbv, aphiv ) dashed evenly;
+ %draw ellipticpath( black, aphip, majav ) dashed evenly;
+ % draw ellipticpath( black, green, 2*blue ) dashed evenly;
+ drawoptions();
+ squareangline( perpv, aphiv, black, rectsiz);
+ squareangline( perpv, majbv, black, rectsiz);
+ squareangline( majbv, aphiv, black, rectsiz);
+ angline(majav, perpv, black, maja-raya, btex $\theta$ etex)(rt);
+ pickup pencircle scaled 3.6pt;
+ draw rp(-aphiv); %label.bot("aphiv",rp(aphiv));
+ draw rp(-majbv); %label.lft("majbv",rp(majbv));
+ %draw rp(majav); label.rt("majav",rp(majav));
+ %draw rp(-aphip); label.rt("aphip",rp(aphip));
+ draw rp(perpv); %label.rt("perpv",rp(perpvl));
+ label.llft(btex $\vec{n}^{\prime\prime}$ etex,rp(aphiv));
+ label.ulft(btex $\vec{n}^{\prime}$ etex,rp(majbv));
+ label.top(btex $\vec{p}$ etex,rp(perpvl));
+endfig;
+
+beginfig(2);
+ f := (6,4,3);
+ Spread := 125;
+ numeric maja, raya, angphi, angthe, pes;
+ color majav, aphiv, aphip, majbv;
+ path ell;
+ maja = 0.82;
+ raya = 0.5;
+ angphi = -15;
+ angthe = 55;
+ pes = 1.3pt;
+ drawoptions( withpen pencircle scaled pes );
+ majav = (0,0,maja);
+ aphiv = raya*(cosd(angphi),sind(angphi),0);
+ aphip = raya*(sind(angphi),-cosd(angphi),0);
+ majbv = planarrotation( majav, aphip, angthe );
+ spheroid( black, majav, raya );
+ ell = ellipticpath( black, majbv, aphiv );
+ draw subpath (3,20) of ell;
+ drawoptions( withpen pencircle scaled pes dashed (withdots scaled 0.42) );
+ draw rigorouscircle( black, blue, raya );
+ draw rp(aphip)--rp(-aphip);
+ draw rp(aphiv)--rp(-aphiv);
+ draw rp(majbv)--rp(-majbv);
+ draw ell;
+endfig;
+
+beginfig(3); %%%%%%%%%%%%%%%% don't change the parameters... %%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%% and forget this (it is wrong). %%%%%%%%%%%%
+ f := (6,4,7);
+ Spread := 125;
+ numeric maja, raya, angphi, angthe, pes, decl;
+ numeric valy, valz, begp, endp, rectsiz;
+ color majav, aphiv, aphip, majbv, majcv, perpv, perqv;
+ path ell, fll, cir;
+ maja = 0.82;
+ raya = 0.5;
+ angphi = 17;
+ angthe = 82;
+ pes = 1.3pt;
+ begp = 14;
+ endp = 18;
+ rectsiz = 0.08;
+ drawoptions( withpen pencircle scaled pes );
+ majav = (0,0,maja);
+ aphiv = raya*(cosd(angphi),sind(angphi),0);
+ aphip = raya*(sind(angphi),-cosd(angphi),0);
+ majbv = planarrotation( majav, aphip, angthe );
+ majcv = planarrotation( majav, -aphip, angthe );
+ perpv = ncrossprod(majbv,aphiv);
+ decl = Z(perpv)/(Y(perpv)++X(perpv));
+ valy = maja*raya/((decl*raya)++maja);
+ valz = valy*decl;
+ if angthe>90: valy:=-valy; fi;
+ perpv := blue*valz-N(aphip)*valy;
+ perqv = (-X(perpv),-Y(perpv),Z(perpv));
+ spheroid( black, majav, raya );
+ squareangline( -majbv, perpv, black, rectsiz);
+ squareangline( -majcv, perqv, black, rectsiz);
+ drawoptions( withpen pencircle scaled 1.095pes );
+ cir = spatialhalfcircle(black, majav, raya, true );
+ undraw subpath (0,0.9*(length cir)) of cir;
+ ell = ellipticpath( black, majbv, aphiv );
+ fll = ellipticpath( black, majcv, aphiv );
+ drawoptions( withpen pencircle scaled pes dashed (withdots scaled 0.42) );
+ draw ellipticpath( black, majav, aphip );
+ draw rp(aphiv)--rp(-aphiv);
+ draw rp(majbv)--rp(-majbv);
+ draw rp(majcv)--rp(-majcv);
+ drawoptions( withpen pencircle scaled 2pes );
+ draw subpath (begp,endp) of fll withcolor blue;
+ draw ell withcolor red;
+ draw subpath (endp-36, begp) of fll withcolor blue;
+ drawarrow rp(black)--rp(perpv) withcolor red;
+ drawarrow rp(black)--rp(perqv) withcolor blue;
+endfig;
+
+beginfig(4);
+ f := (6,4,7);
+ Spread := 40;
+ numeric axa, axb, axc;
+ color d[];
+ axa = 2.618;
+ axb = 1.618;
+ axc = 1.0;
+ d1 = (axa,0,0);
+ d2 = (0,axb,0);
+ d3 = (0,0,axc);
+ draw ellipticpath(black,d1,d2);
+ draw ellipticpath(black,d1,d3);
+ draw ellipticpath(black,d2,d3);
+ drawarrow rp(black)--rp(d1);
+ drawarrow rp(black)--rp(d2);
+ drawarrow rp(black)--rp(d3);
+ draw ellipsoid(black,d1,d2,d3) withpen pencircle scaled 2.5pt withcolor blue;
+endfig;
+
+beginfig(5);
+ f := (4,3,6.5);
+ Spread := 100;
+ numeric axa, axb, axc, vz, vy;
+ color va, vb, d[];
+ axa = 0.505;
+ axb = 0.495;
+ axc = 0.82;
+ d1 = (axa,0,0);
+ d2 = (0,axb,0);
+ d3 = (0,0,axc);
+ vy = axb*(axc+-+axa)/(axc+-+axb);
+ vz = axa+-+vy;
+ va = (0,vy,vz);
+ vb = (0,-vy,vz);
+ drawarrow rp(black)--rp(d2);
+ draw ellipticpath(black,d1,va) withcolor red;
+ draw ellipticpath(black,d1,vb) withcolor green;
+ draw ellipticpath(black,d2,d3) dashed withdots scaled 0.333;
+ draw rp(black)--rp(-d1) dashed withdots scaled 0.333;
+ drawarrow rp(black)--rp(va) withcolor red;
+ drawarrow rp(black)--rp(vb) withcolor green;
+ draw rp(black)--rp(-va) dashed withdots scaled 0.333 withcolor red;
+ draw rp(black)--rp(-vb) dashed withdots scaled 0.333 withcolor green;
+ draw ellipsoid(black,d1,d2,d3) withpen pencircle scaled 2pt withcolor blue;
+ drawarrow rp(black)--rp(d3);
+ drawarrow rp(black)--rp(d1);
+ draw subpath (0,9) of ellipticpath(black,d1,d2);
+ draw subpath (0,9) of ellipticpath(black,d1,d3);
+ draw subpath (0,9) of ellipticpath(black,d2,d3);
+ labeloffset := 1pt;
+ label.lrt(btex $n_\alpha$ etex,rp(d2));
+ label.bot(btex $n_\beta$ etex,rp(d1));
+ label.top(btex $n_\gamma$ etex,rp(d3));
+ label.rt(btex $n_\beta$ etex,rp(va));
+ label.bot(btex $n_\beta$ etex,rp(vb));
+ color perpv, perqv;
+ numeric decl, valy, valz, fact;
+ fact = 1.55;
+ perpv = ncrossprod(d1,va);
+ decl = Z(perpv)/Y(perpv);
+ valy = axc*axb/((decl*axb)++axc);
+ valz = -valy*decl;
+ perpv := blue*valz-green*valy;
+ perqv := blue*valz+green*valy;
+ drawarrow rp(black)--rp(fact*perpv) withcolor red;
+ drawarrow rp(black)--rp(fact*perqv) withcolor green;
+ draw rp(perpv) withpen pencircle scaled 2pt withcolor red;
+ draw rp(perqv) withpen pencircle scaled 2pt withcolor green;
+ label.lft(btex OA etex,rp(fact*perpv));
+ label.rt(btex OA etex,rp(fact*perqv));
+endfig;
+
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/convergingspirals.mp b/graphics/metapost/contrib/macros/featpost/example/convergingspirals.mp
new file mode 100644
index 0000000000..f349872041
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/convergingspirals.mp
@@ -0,0 +1,361 @@
+% convergingspirals.mp
+% L. Nobre G. - a twisted mind...
+% 2007
+
+prologues := 1;
+
+vardef oper( expr Valu, Slop ) =
+ (Valu*Slop)
+enddef;
+
+vardef hiperspiral( expr Val, Phi, Pitch ) =
+ dir(57.29578*Val*(Pitch**2)+Phi)/oper(Val,Pitch)
+enddef;
+
+beginfig(5); %%%%%%%%%%%%%% This figure has one very small bug... %%%%%%%
+ boolean adddepth;
+ adddepth = true;
+ pi = 3.14159;
+ co = 180/pi;
+ mar = 0.20cm;
+ prmax = 6cm;
+ prmin = 0.85cm;
+ hrmax = 7cm;
+ ptmax = 1.699*pi;
+ pstpnum = 100;
+ numarquid = 5;
+ multipl = 5; %%%%%%%%%%%%%%% must be odd for checkerboard %%%%%%%%%%%%%%
+ checkerdepth = multipl+3;
+ fac = hrmax/prmax;
+ alfa = 2*pi/numarquid;
+ pitcha = prmax/ptmax;
+ pitchb = prmax/(ptmax-alfa);
+ numhiperb = numarquid*multipl;
+ ptstp = ptmax/pstpnum;
+ ptstb = (ptmax-alfa)/pstpnum;
+ umin = prmax/10;
+ vmin = prmax/20;
+ ustp = (hrmax-umin)/pstpnum;
+ vstp = (hrmax-vmin)/pstpnum;
+
+ path n[]m[], c[], cutter;
+ cutter = fullcircle rotated 180 scaled (2prmin);
+ for i=1 upto 8:
+ n0m[i] = origin;
+ endfor;
+ for i=1 upto pstpnum:
+ tp := i*ptstp;
+ tb := i*ptstb;
+ pu := umin+i*ustp;
+ vu := vmin+i*vstp;
+ n0m1 := n0m1--dir(co*tp)*(pitcha*tp+mar);
+ n0m2 := n0m2--dir(co*tp)*pitcha*tp;
+ n0m3 := n0m3--dir(co*(tb+alfa))*pitchb*tb;
+ n0m4 := n0m4--dir(co*(tb+alfa))*(pitchb*tb-mar);
+ n0m5 := n0m5--dir(co*pitcha/pu)*(pu-fac*mar);
+ n0m6 := n0m6--dir(co*pitcha/pu)*pu;
+ n0m7 := n0m7--dir(co*pitchb/vu)*vu;
+ n0m8 := n0m8--dir(co*pitchb/vu)*(vu+fac*mar);
+ endfor;
+ pair flast, hlast;
+ flast = point pstpnum of n0m6;
+ hlast = point pstpnum of n0m8;
+ adif = angle( hlast ) - angle( flast );
+ n0m5 := n0m5 rotated adif;
+ n0m6 := n0m6 rotated adif;
+ for i=1 upto 8:
+ n0m[i] := (reverse n0m[i]) cutafter cutter ;
+ endfor;
+ for j=1 upto numarquid:
+ for i=1 upto 4:
+ n[j]m[i] := n0m[i] rotated (j*alfa*co);
+% draw n[j]m[i];
+ endfor;
+ endfor;
+ for j=1 upto numhiperb:
+ for i=5 upto 8:
+ n[j]m[i] := n0m[i] rotated (j*360/numhiperb);
+% draw n[j]m[i];
+ endfor;
+ endfor;
+ distance = pstpnum;
+ actualspik = 0;
+ boolean intersectexists;
+ pair itstm;
+ for i=1 upto numhiperb:
+ itstm := n1m2 intersectiontimes n[i]m6;
+ intersectexists := ( itstm dotprod (-1,1) ) <> 0;
+ if intersectexists:
+ if ( (xpart itstm) < distance ):
+ distance := xpart itstm;
+ actualspik := i;
+ fi;
+ fi;
+ endfor;
+ numeric seq[];
+ seq0 = actualspik;
+ for i=1 upto 2checkerdepth:
+ if (seq[i-1]-1<1):
+ seq[i] := numhiperb;
+ else:
+ seq[i]=seq[i-1]-1;
+ fi;
+ endfor;
+ path ca, cb;
+ ca = (reverse n1m3)--n1m2;
+ cb = (reverse n[seq1]m7)--n[seq1]m6;
+ c0 = buildcycle( cb, reverse n1m1 ); %%%%% may reverse
+ c1 = buildcycle( ca, n[seq0]m8 );
+ for i=2 step 2 until 2checkerdepth:
+ if i < 2*multipl-1 :
+ ca := (reverse n[seq[i-2]]m6)--n[seq[i-2]]m7;
+ c[i] := buildcycle( ca, n2m1 );
+ else:
+ c[i]:=buildcycle(n[seq[i-2]]m7,n2m1,reverse n[seq[i-2]]m6,reverse n0m4);
+ fi;
+ c[i+1]:=buildcycle(n[seq[i-2]]m5,n1m3,reverse n[seq[i]]m8,reverse n1m2);
+ endfor;
+ if adddepth:
+ depthadded = 1;
+ else:
+ depthadded = 0;
+ fi;
+ for i=1 step 2 until 2*checkerdepth+depthadded:
+ for j=1 upto numarquid:
+ fill c[i-1] rotated (j*alfa*co) withcolor 0.85*(red+green);
+ fill c[i] rotated (j*alfa*co) withcolor 0.7*green;
+ endfor;
+ endfor;
+ if not (multipl <> 5):
+ cb := (reverse n[seq3]m7)--n[seq3]m6;
+ ca := buildcycle( cb, reverse n1m1 ); %%%%% may reverse
+ for j=1 upto numarquid:
+ fill ca rotated (j*alfa*co) withcolor 0.85*(red+green);
+ endfor;
+ fi;
+endfig;
+
+beginfig(4);
+ numeric pstpnum, prmax, i, j, pi, ptmax, ptstp, th, co, mar;
+ numeric numarquid, numhiperb, multipl, pitcha, pitchb, alfa;
+ path a, b, c, d, e, f, g, h;
+ numeric ptstb, hrmax, fac, sn, sm, rn, rm;
+ pi = 3.14159;
+ co = 180/pi;
+ mar = 0.16mm;
+ prmax = 5mm;
+ hrmax = 7mm;
+ ptmax = 1.05*pi;
+ pstpnum = 100;
+ numarquid = 5;
+ multipl = 1;
+ rn = 4;
+ rm = 2;
+ sn = 8;
+ sm = 6;
+ fac = hrmax/prmax;
+ alfa = 2*pi/numarquid;
+ pitcha = prmax/ptmax;
+ pitchb = prmax/(ptmax-alfa);
+ numhiperb = numarquid*multipl;
+ ptstp = ptmax/pstpnum;
+ ptstb = (ptmax-alfa)/pstpnum;
+ a = origin;
+ b = origin;
+ c = origin;
+ d = origin;
+ for i=1 upto pstpnum:
+ th := i*ptstp;
+ a := a--dir(co*th)*pitcha*th;
+ b := b--dir(co*th)*(pitcha*th+mar);
+ endfor;
+ for i=1 upto pstpnum:
+ th := i*ptstb;
+ c := c--dir(co*(th+alfa))*pitchb*th;
+ d := d--dir(co*(th+alfa))*(pitchb*th-mar);
+ endfor;
+ for i=1 upto numarquid:
+% unfill buildcycle( b , reverse d ) rotated (i*alfa*co);
+ fill a--reverse c--cycle rotated (i*alfa*co);
+% draw a rotated (i*alfa*co) withcolor red+green;
+% draw b rotated (i*alfa*co) withcolor red;
+% draw c rotated (i*alfa*co) withcolor green;
+% draw d rotated (i*alfa*co) withcolor blue;
+ endfor;
+ numeric umin, vmin, ustp, vstp, pu, pv;
+ umin = prmax/20;
+ vmin = prmax/20;
+ ustp = (hrmax-umin)/pstpnum;
+ vstp = (hrmax-vmin)/pstpnum;
+ e = origin;
+ f = origin;
+ g = origin;
+ h = origin;
+ for i=1 upto pstpnum:
+ pu := umin+i*ustp;
+ e := e--dir(co*pitcha/pu)*(pu-((fac*mar)**2));
+ f := f--dir(co*pitcha/pu)*pu;
+ vu := vmin+i*vstp;
+ g := g--dir(co*pitchb/vu)*(vu+sqrt(fac*mar));
+ h := h--dir(co*pitchb/vu)*vu;
+ endfor;
+ pair flast, hlast;
+ numeric adif;
+ path hiperbolio, hiperbolic;
+ flast = point pstpnum of f;
+ hlast = point pstpnum of h;
+ adif = angle( hlast ) - angle( flast );
+% draw e withcolor red+blue;
+% draw f withcolor red+blue;
+% draw g rotated (-adif) withcolor green+blue;
+% draw h rotated (-adif) withcolor green+blue;
+ hiperbolio = (subpath (rn,pstpnum) of g rotated (-adif))...
+ (subpath (pstpnum,rm) of e)..cycle;
+ hiperbolic = (subpath (sn,pstpnum) of h rotated (-adif))...
+ (subpath (pstpnum,sm) of f)..cycle;
+ for i=1 upto numhiperb:
+ unfill hiperbolio rotated (i*360/numhiperb);
+ endfor;
+ for i=1 upto numhiperb:
+ fill hiperbolic rotated (i*360/numhiperb) withcolor 0.4*red+0.2*blue;
+ endfor;
+ picture storepic;
+ storepic = currentpicture;
+ currentpicture := nullpicture;
+ draw storepic scaled 12;
+endfig;
+
+beginfig(3);
+ numeric pstpnum, prmax, i, j, pi, ptmax, ptstp, th, co, mar;
+ numeric numarquid, numhiperb, multipl, pitcha, pitchb, alfa;
+ path a, b, c, d;
+ pi = 3.14159;
+ co = 180/pi;
+ mar = 0.32;
+ prmax = 5;
+ ptmax = 4*pi;
+ pstpnum = 100;
+ multipl = 3;
+ numarquid = 3;
+ alfa = 2*pi/numarquid;
+ pitcha = prmax/ptmax;
+ pitchb = prmax/(ptmax-alfa);
+ numhiperb = numarquid*multipl;
+ ptstp = ptmax/pstpnum;
+ a = origin;
+ b = origin;
+ c = origin;
+ d = origin;
+ for i=1 upto pstpnum:
+ th := i*ptstp;
+ a := a...dir(co*th)*pitcha*th;
+ b := b...dir(co*th)*(pitcha*th-mar);
+ c := c...dir(co*(th+alfa))*pitchb*th;
+ d := d...dir(co*(th+alfa))*(pitchb*th+mar);
+ endfor;
+ for i=1 upto numarquid:
+ drawoptions( rotated (i*alfa*co) scaled 1000 withpen pencircle scaled 0pt);
+ draw a;
+ draw b;
+ draw c;
+ draw d;
+ endfor;
+ %%%%%%%%%%%%%%%%%%%%%%%% A very nice case of knitting Bezier splines...
+endfig;
+
+beginfig(2);
+ numeric u, numb, faca, numa, numc, rmin, rmax, i, j, pitch, phi;
+ numeric petch, startang, angstep, ampi, ampe, arcstep, paperfactor;
+ path b[], base, a[], alto;
+ numeric valmax, valmin, valstep, valhmin, valhmax;
+ u = 15mm;
+ numb = 2; % start at one
+ faca = 7;
+ numc = 9;
+ rmin = 0.3;
+ rmax = 1.5;
+ paperfactor = 0.25*u/rmin;
+ angstep = 1/30;
+ valstep = 0.017;
+ numa = numb*faca;
+ startang = 1/numb;
+ arcstep = 1/numa;
+ ampi = numc/faca;
+ ampe = ampi-startang;
+ pitch = (rmax-rmin)/ampi; %show pitch;
+ petch = (rmax-rmin)/ampe; %show petch;
+ valmin = 1/oper(rmax,pitch);
+ valmax = 1/oper(rmin,pitch);
+ valhmin = 1/oper(rmax,petch);
+ valhmax = 1/oper(rmin,petch);
+ for i=1 step 2 until 2*numb:
+ phi := 0.5*i/numb;
+ b[i-1] = dir(phi*360)*rmin for j=angstep step angstep until ampi:
+ ...dir((phi+j)*360)*(rmin+pitch*j)
+ endfor;
+ b[i] = dir((phi+startang)*360)*rmin for j=angstep step angstep until ampe:
+ ...dir((phi+startang+j)*360)*(rmin+petch*j)
+ endfor;
+ endfor;
+ base = for i=1 step 2 until 2*numb: b[i-1]...reverse b[i]-- endfor cycle;
+ fill base scaled paperfactor;
+ for i=1 step 2 until 2*numa:
+ phi := 0.5*(i-1)*arcstep*360;
+ a[i-1] = hiperspiral(valmin,phi,pitch)
+ for j=valmin+valstep step valstep until valmax:
+ ...hiperspiral(j,phi,pitch)
+ endfor;
+ draw a[i-1] scaled paperfactor withcolor red+green;
+ phi := 0.5*i*arcstep*360;
+ a[i] = hiperspiral(valhmin,phi,petch)
+ for j=valhmin+valstep step valstep until valhmax:
+ ...hiperspiral(j,phi,petch)
+ endfor;
+ draw a[i] scaled paperfactor withcolor red;
+ endfor;
+endfig;
+
+beginfig(1);
+ numeric u, numb, faca, numa, numc, rmin, rmax, i, j, pitch, phi;
+ numeric petch, startang, angstep, ampi, ampe, arcstep;
+ path b[], base, a[], alto;
+ u = 15mm;
+ numb = 3; % start at one
+ faca = 3;
+ numc = 5;
+ rmin = 2u;
+ rmax = 10u;
+ angstep = 1/90; % If too big, the figure may be broken...
+ numa = numb*faca;
+ ampi = numc/faca;
+ pitch = (rmax-rmin)/ampi;
+ startang = 1/numb;
+ arcstep = 1/numa;
+ ampe = numc/faca-startang;
+ petch = (rmax-rmin)/ampe;
+ for i=1 step 2 until 2*numb:
+ phi := 0.5*i/numb;
+ b[i-1] = dir(phi*360)*rmin for j=angstep step angstep until ampi:
+ ...dir((phi+j)*360)*(rmin+pitch*j)
+ endfor;
+ b[i] = dir((phi+startang)*360)*rmin for j=angstep step angstep until ampe:
+ ...dir((phi+startang+j)*360)*(rmin+petch*j)
+ endfor;
+ endfor;
+ base = for i=1 step 2 until 2*numb: b[i-1]...reverse b[i]-- endfor cycle;
+ fill base withcolor red;
+ for i=1 step 2 until 2*numa:
+ phi := 0.5*i/numa;
+ a[i-1] = dir(phi*360)*rmin for j=angstep step angstep until 0.5:
+ ...dir(-(phi+j)*360)*(rmin+2*(rmax-rmin)*j)
+ endfor;
+ a[i] = dir((phi+arcstep)*360)*rmin
+ for j=angstep step angstep until 0.5-arcstep:
+ ...dir(-(phi+arcstep+j)*360)*(rmin+(rmax-rmin)/(0.5-arcstep)*j)
+ endfor;
+ endfor;
+ alto = for i=1 step 2 until 2*numa: a[i-1]...reverse a[i]-- endfor cycle;
+ fill alto withcolor green+blue;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/crossingline.mp b/graphics/metapost/contrib/macros/featpost/example/crossingline.mp
new file mode 100644
index 0000000000..422422c277
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/crossingline.mp
@@ -0,0 +1,112 @@
+% crossingline.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+beginfig(3);
+path foi, mar, foimar;
+foi=
+(-2.09207,0)..controls (-0.8113,1.52635) and (0.46948,3.05269)
+ ..(1.75026,4.57904)..controls (16.50494,-7.80182) and (31.25961,-20.18265)
+ ..(46.01431,-32.5635)..controls (47.72202,-30.52838) and (49.42972,-28.49324)
+ ..(51.13742,-26.45813)..controls (36.38272,-14.07727) and (21.62805,-1.69644)
+ ..(6.87337,10.68442)..controls (8.36761,12.46516) and (9.86185,14.2459)
+ ..(11.3561,16.02664)..controls (1.80319,20.141) and (1.80319,20.141)
+ ..(-0.75836,17.0883)..controls (-1.26715,17.51523) and (-1.77594,17.94215)
+ ..(-2.28471,18.36908)..controls (-3.99242,16.33397) and (-5.70012,14.29883)
+ ..(-7.40782,12.2637)..controls (-6.89905,11.83678) and (-6.39026,11.40985)
+ ..(-5.88147,10.98293)..controls (-7.16225,9.45657) and (-8.44302,7.93024)
+ ..(-9.7238,6.40388)..controls (-7.17989,4.26926) and (-4.63599,2.13463)
+ ..cycle;
+mar =
+(0,-12.55302)..controls (-0.6404,-11.78986) and (-1.28078,-11.02667)
+ ..(-1.92117,-10.2635)..controls (-7.51778,-14.95969) and (-13.11438,-19.65587)
+ ..(-18.71098,-24.35205)..controls (-17.00328,-26.38718) and (-15.29556,-28.42232)
+ ..(-13.58786,-30.45744)..controls (-12.30708,-31.98378) and (-12.30708,-31.98378)
+ ..(-2.1138,-28.6326)..controls (-3.95111,-27.57187) and (-6.11067,-26.96915)
+ ..(-7.48247,-25.33434)..controls (-3.921,-22.34586) and (-0.35953,-19.35738)
+ ..(3.20195,-16.3689)..controls (28.64638,-44.3316) and (76.49767,8.8977)
+ ..(12.84161,37.23851)..controls (64.17233,7.60352) and (23.4439,-32.40083)
+ ..(3.05269,-9.99147)..controls (2.03513,-10.84532) and (1.01756,-11.69917)
+ ..cycle;
+foimar = crossingline( mar, foi, 0.001 );
+draw foimar;
+show foimar;
+endfig;
+
+beginfig(2);
+ numeric u, elhei, elwid, elpos, bawid, bahei, thstp, thdel, i;
+ numeric refang, reft, tfin, tini, spikang;
+ path el, ba, aux, cutel, horns;
+ pair reftpair;
+ color yellow, thered;
+ pen penpoint, pendot;
+ path togetp;
+ yellow = 0.87*(0.95*red+0.7*green);
+ thered = 0.66red;
+ u = 2mm;
+ thdel = 25;
+ thstp = 5;
+ elhei = 30u;
+ elwid = 44u;
+ elpos = 26u;
+ bawid = 27u;
+ bahei = 10u;
+ penpoint = pencircle scaled 0.5u;
+ pendot = pencircle scaled u;
+ el = (elwid,elpos)..for i=thstp step thstp until 360-thstp:
+ (elwid*cosd(i),elpos+elhei*sind(i)).. endfor cycle;
+ ba = (bawid,-bahei){right}..{left}(bawid,0)--
+ (elwid*cosd(90-thdel),elpos+elhei*sind(90-thdel))--
+ (bawid/3.0,0)--(0,elpos+elhei)--(-bawid/3.0,0)--
+ (elwid*cosd(90+thdel),elpos+elhei*sind(90+thdel))--
+ (-bawid,0){left}..{right}(-bawid,-bahei)--cycle;
+ aux = (0,elpos)--
+ 1.1[(0,elpos),(elwid*cosd(270+2thdel),elpos+elhei*sind(270+2thdel))];
+ reftpair = el intersectiontimes aux;
+ reft = xpart reftpair;
+ refang = angle( direction reft of el );
+ tfin = directiontime dir(180-refang) of el;
+ tini = directiontime dir(180+refang) of el - length el;
+ cutel = subpath (tini,tfin) of el;
+ spikang = (90-angle((0,elpos+elhei)-(-bawid,0)));
+ horns = cutel{dir(-refang-spikang)}..
+ {left}(0,elpos-elhei+bawid/3.0)..
+ {dir(refang+spikang)}cycle;
+ draw ba;
+ draw horns;
+ drawarrow subpath (0,1) of ba withpen pendot withcolor red;
+ drawarrow subpath (0,1) of horns withpen pendot withcolor red;
+ togetp = crossingline( ba, horns, 0.001 );
+ draw togetp withpen penpoint;
+ show togetp;
+endfig;
+
+beginfig(1);
+ numeric u, oray, odev, nl, circrot, i;
+ pair vect;
+ u = 1cm;
+ oray = 1.1u;
+ odev = 0.4*oray;
+ nl = 5;
+ vect = (oray,0);
+ circrot = -90;
+% circrot = -180/nl;
+ path outerp, innerp, togetp;
+ innerp = fullcircle scaled 2u rotated circrot shifted vect;
+ outerp = for i=0 upto nl-1:
+ (oray-odev)*dir(i*360/nl){dir(i*360/nl+90)}...
+ (oray+odev)*dir((i+0.5)*360/nl){dir((i+0.5)*360/nl+90)}...
+ endfor cycle;
+ togetp = crossingline( outerp, innerp, 0.001 );
+ fill togetp;
+ draw outerp withcolor red withpen pencircle scaled 1.2pt;
+ drawarrow subpath (0,1) of outerp
+ withcolor green withpen pencircle scaled 0.7pt;
+ draw innerp withcolor blue;
+ draw point 0 of innerp withcolor green withpen pencircle scaled 1pt;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/cruztuga.mp b/graphics/metapost/contrib/macros/featpost/example/cruztuga.mp
new file mode 100644
index 0000000000..2cf8513d4e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cruztuga.mp
@@ -0,0 +1,37 @@
+% cruztuga.mp
+% L. Nobre G.
+% 2007
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, da, db;
+ u = 1cm;
+ da = 1-1/sqrt(2);
+ db = 3/sqrt(2)-2;
+ z1 = u*(1.5,0.5);
+ z2 = u*(1.5,2.5-da);
+ z3 = u*(3.5+da,4.5);
+ z4 = u*(-3.5-da,4.5);
+ z5 = u*(db-1.5,3.5);
+ z6 = u*(1.5-db,3.5);
+ z7 = u*(0.5,2.5+db);
+ z8 = 0.5u*(1,1);
+ z10= 6u*(1,1);
+ z11= 6u*(-1,1);
+ z12= 6u*(-1,-1);
+ z13= 6u*(1,-1);
+ path octave;
+ picture tmppic;
+ octave = z1--z2--z3--z4--z5--z6--z7--z8--cycle;
+ fill octave withcolor red;
+ draw currentpicture xscaled -1;
+ draw currentpicture rotated 90;
+ draw currentpicture rotated 180;
+ tmppic = currentpicture;
+ currentpicture := nullpicture;
+ fill z10--z11--z12--z13--cycle;
+ draw tmppic;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/cubicfacecentered.mp b/graphics/metapost/contrib/macros/featpost/example/cubicfacecentered.mp
new file mode 100644
index 0000000000..cd252c4f02
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cubicfacecentered.mp
@@ -0,0 +1,112 @@
+% cubicfacecentered.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+% verbatimtex
+% \documentclass{article}
+% \usepackage{beton}
+% \usepackage{concmath}
+% \usepackage{ccfonts}
+% \begin{document}
+% etex
+
+beginfig(1);
+ numeric tro;
+ pen fina, media, grossa;
+ color mygray;
+ tro = 2;
+ V1 := (tro,0,0);
+ V2 := (0,tro,0);
+ V3 := (-tro,0,0);
+ V4 := (0,-tro,0);
+ V5 := (1,1,1);
+ V6 := (-1,1,1);
+ V7 := (-1,-1,1);
+ V8 := (1,-1,1);
+ V9 := (1,1,-1);
+ V10 := (-1,1,-1);
+ V11 := (-1,-1,-1);
+ V12 := (1,-1,-1);
+ V13 := (0,0,tro);
+ V14 := (0,0,-tro);
+ V15 := (tro,0,tro);
+ V16 := (0,tro,tro);
+ V17 := (tro,tro,0);
+ V18 := (tro,0,-tro);
+ V19 := (tro,-tro,0);
+ V20 := (0,-tro,tro);
+ V21 := (-tro,0,tro);
+ V22 := (-tro,tro,0);
+ V23 := (0,tro,-tro);
+ V24 := (-tro,0,-tro);
+ V25 := (0,-tro,-tro);
+ V26 := (-tro,-tro,0);
+ V27 := (-2*tro,-tro,-tro);
+ V28 := (-2*tro,-tro,tro);
+ V29 := (-2*tro,tro,tro);
+ V30 := (-2*tro,tro,-tro);
+ makeface1(1,5,13,8);
+ makeface2(2,6,13,5);
+ makeface3(3,7,13,6);
+ makeface4(4,8,13,7);
+ makeface5(1,5,2,9);
+ makeface6(2,6,3,10);
+ makeface7(3,7,4,11);
+ makeface8(4,8,1,12);
+ makeface9(1,9,14,12);
+ makeface10(2,10,14,9);
+ makeface11(3,11,14,10);
+ makeface12(4,12,14,11);
+
+ makeface13(27,28,29,30);
+ makeface14(20,21,16,29,28);
+ makeface15(23,24,25,27,30);
+ makeface16(16,22,23,30,29);
+ makeface17(25,27,28,20,26);
+ makeface18(21,22,24,26);
+ makeface19(20,21,26);
+ makeface20(16,21,22);
+ makeface21(22,23,24);
+ makeface22(24,25,26);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% f := 2*(5,3,1.5);
+% f := 2*(5,3,4);
+ f := 2.34*(15,2.4,5.05);
+ Spread := 50;
+ fina = pencircle scaled 1pt;
+ media = pencircle scaled 1.2pt;
+ grossa= pencircle scaled 3pt;
+ mygray = 0.3background;
+% pickup fina;
+% draw rp(V25)--rp(V27)--rp(V28)--rp(V20)--
+% rp(V25)--rp(V23)--rp(V30)--rp(V27);
+ pickup media;
+ draw rp(V24)--rp(V25)--rp(V19)--rp(V20)--
+ rp(V26)--rp(V25)--rp(V18)--rp(V23)--
+ rp(V24)--rp(V26)--rp(V21)--rp(V22)--cycle withcolor mygray;
+ drawoptions( withpen grossa );
+ draw_invisible( false, false, TableC3, black );
+ fillfacewithlight( 14 );
+ fillfacewithlight( 16 );
+ drawoptions();
+ pickup media;
+ draw rp(V15)--rp(V16)--rp(V22)--rp(V23)--
+ rp(V17)--rp(V16)--rp(V21)--rp(V20)--
+ rp(V15)--rp(V17)--rp(V18)--rp(V19)--cycle withcolor mygray;
+% pickup fina;
+% draw rp(V28)--rp(V29)--rp(V30);
+% draw rp(V20)--rp(V16)--rp(V23);
+% draw rp(V16)--rp(V29);
+
+endfig;
+
+% verbatimtex \end{document} etex
+
+end;
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/cubicfigures.mp b/graphics/metapost/contrib/macros/featpost/example/cubicfigures.mp
new file mode 100644
index 0000000000..b39088c183
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cubicfigures.mp
@@ -0,0 +1,44 @@
+% cubicfigures.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := ( 1.2 , 2.0 , 1.6 );
+Spread := 75;
+
+V1 := (1,1,1);
+V2 := (-1,1,1);
+V3 := (-1,-1,1);
+V4 := (1,-1,1);
+V5 := (1,1,-1);
+V6 := (-1,1,-1);
+V7 := (-1,-1,-1);
+V8 := (1,-1,-1);
+makeface1(1,2,3,4);makeface2(5,6,7,8);
+makeface3(1,2,6,5);makeface4(2,3,7,6);
+makeface5(3,4,8,7);makeface6(4,1,5,8);
+makeline1(1,7);makeline2(2,8);
+makeline3(3,5);makeline4(4,6);
+
+beginfig(1);
+ ParallelProj := true;
+ SphericalDistortion := false;
+ pickup pencircle scaled 1pt;
+ draw_all_test(true);
+endfig;
+
+beginfig(2);
+ ParallelProj := false;
+ SphericalDistortion := false;
+ draw_all_test(true);
+endfig;
+
+beginfig(3);
+ ParallelProj := false;
+ SphericalDistortion := true;
+ PrintStep := 5;
+ draw_all_test(true);
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/cubicstructurefcc.mp b/graphics/metapost/contrib/macros/featpost/example/cubicstructurefcc.mp
new file mode 100644
index 0000000000..28cabe25f0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cubicstructurefcc.mp
@@ -0,0 +1,64 @@
+% cubicstructurefcc.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+f := 2*(5,3,3.5);
+Spread := 20;
+
+beginfig(1);
+ color Ve[], va, vb, vc, vu;
+ numeric i, j, k, e[]p[];
+ string comm, comn, como, a, b;
+ Ve1 = (2,1,-1);
+ Ve2 = (0,1,-1);
+ Ve3 = (-2,1,-1);
+ Ve4 = (-2,-1,-1);
+ Ve5 = (0,-1,-1);
+ Ve6 = (2,-1,-1);
+ Ve7 = (1,1,0);
+ Ve8 = (-1,1,0);
+ Ve9 = (-2,0,0);
+ Ve10 = (-1,-1,0);
+ Ve11 = (1,-1,0);
+ Ve12 = (2,0,0);
+ Ve13 = (2,1,1);
+ Ve14 = (0,1,1);
+ Ve15 = (-2,1,1);
+ Ve16 = (-2,-1,1);
+ Ve17 = (0,-1,1);
+ Ve18 = (2,-1,1);
+ Ve19 = (1,0,1);
+ Ve20 = (0,0,0);
+ Ve21 = (-1,0,1);
+ Ve22 = (1,0,-1);
+ Ve23 = (-1,0,-1);
+ for i=1 upto 23:
+ comm := "unfill rigorousfearpath(" & cstr(Ve[i]) & ",0.08);";
+ comn := "draw rigorousfearpath(" & cstr(Ve[i]) & ",0.08);";
+ getready( comm & comn, Ve[i] );
+ endfor;
+ e1p1 = 1; e2p1 = 2; e3p1 = 3; e4p1 = 4; e5p1 = 5; e6p1 = 6;
+ e1p2 = 2; e2p2 = 3; e3p2 = 4; e4p2 = 5; e5p2 = 6; e6p2 = 1;
+ e7p1 = 13; e8p1 = 14; e9p1 = 15; e10p1 = 16; e11p1 = 17; e12p1 = 18;
+ e7p2 = 14; e8p2 = 15; e9p2 = 16; e10p2 = 17; e11p2 = 18; e12p2 = 13;
+ e13p1 = 1; e14p1 = 2; e15p1 = 3; e16p1 = 4; e17p1 = 5; e18p1 = 6;
+ e13p2 = 13; e14p2 = 14; e15p2 = 15; e16p2 = 16; e17p2 = 17; e18p2 = 18;
+ e19p1 = 2; e19p2 = 5; e20p1 = 14; e20p2 = 17;
+ for i=1 upto 20:
+ vc := Ve[e[i]p2]-Ve[e[i]p1];
+ vu := N(vc);
+ va := Ve[e[i]p1]+0.2*vu;
+ vb := Ve[e[i]p2]-0.2*vu;
+ a := cstr( va );
+ b := cstr( vb-va );
+ comm := "rigorousdisc( 0, true," & a & ",0.08," & b & ");";
+ getready( comm, 0.5[va,vb] );
+ endfor;
+ doitnow;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/cubicstructures.mp b/graphics/metapost/contrib/macros/featpost/example/cubicstructures.mp
new file mode 100644
index 0000000000..86cc649f57
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cubicstructures.mp
@@ -0,0 +1,410 @@
+% cubicstructures.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+f := 2*(5,3,3.5);
+Spread := 20;
+
+beginfig(1);
+ numeric csr, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ csr := sqrt(3)*0.5;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ Ve9 := (0,0,0);
+ for ind=1 upto 9:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ unfill p5;
+ draw p5;
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p9;
+ draw p9;
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ unfill p8;
+ draw p8;
+endfig;
+
+beginfig(2);
+ numeric csr, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ csr := 1;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ for ind=1 upto 8:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ unfill p5;
+ draw p5;
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ unfill p8;
+ draw p8;
+endfig;
+
+beginfig(3);
+ numeric csr, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ csr := sqrt(2)*0.5;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ Ve9 := (-1,0,0);
+ Ve10 := (0,0,-1);
+ Ve11 := (0,0,1);
+ Ve12 := (0,1,0);
+ Ve13 := (0,-1,0);
+ Ve14 := (1,0,0);
+ for ind=1 upto 14:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ unfill p9;
+ draw p9;
+ unfill p5;
+ draw p5;
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ unfill p6;
+ draw p6;
+ unfill p10;
+ draw p10;
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p13;
+ draw p13;
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ unfill p11;
+ draw p11;
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ unfill p12;
+ draw p12;
+ unfill p14;
+ draw p14;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p8;
+ draw p8;
+endfig;
+
+beginfig(4);
+ numeric csr, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ csr := 0.21;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ Ve21:= (0,0,0);
+ Ve9 := (-1,-0.5,0); Ve15 := (-1,0.5,0);
+ Ve10 := (-0.5,0,-1);Ve16 := (0.5,0,-1);
+ Ve11 := (-0.5,0,1); Ve17 := (0.5,0,1);
+ Ve12 := (0,1,-0.5); Ve18 := (0,1,0.5);
+ Ve13 := (0,-1,-0.5);Ve19 := (0,-1,0.5);
+ Ve14 := (1,-0.5,0); Ve20 := (1,0.5,0);
+ for ind=1 upto 21:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ unfill p9;
+ draw p9;
+ draw rp(Ve9+yv)--rp(Ve15-yv);
+ unfill p15;
+ draw p15;
+ unfill p5;
+ draw p5;
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ unfill p6;
+ draw p6;
+ unfill p10;
+ draw p10;
+ draw rp(Ve10+xv)--rp(Ve16-xv);
+ unfill p16;
+ draw p16;
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p13;
+ draw p13;
+ draw rp(Ve13+zv)--rp(Ve19-zv);
+ unfill p19;
+ draw p19;
+ unfill p21;
+ draw p21;
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ unfill p11;
+ draw p11;
+ draw rp(Ve11+xv)--rp(Ve17-xv);
+ unfill p17;
+ draw p17;
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ unfill p12;
+ draw p12;
+ draw rp(Ve12+zv)--rp(Ve18-zv);
+ unfill p18;
+ draw p18;
+ unfill p14;
+ draw p14;
+ draw rp(Ve14+yv)--rp(Ve20-yv);
+ unfill p20;
+ draw p20;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p8;
+ draw p8;
+endfig;
+
+beginfig(5);
+ color Ve[], violet, va, vb, vc, vu;
+ numeric i, j, k, e[]p[];
+ string comm, comn, como, a, b, col[];
+ violet = red+blue;
+ col1 = "violet";
+ col2 = "red";
+ col3 = "green";
+ col4 = "blue";
+ Ve1 = (2,1,-1);
+ Ve2 = (0,1,-1);
+ Ve3 = (-2,1,-1);
+ Ve4 = (-2,-1,-1);
+ Ve5 = (0,-1,-1);
+ Ve6 = (2,-1,-1);
+ Ve7 = (1,1,0);
+ Ve8 = (-1,1,0);
+ Ve9 = (-2,0,0);
+ Ve10 = (-1,-1,0);
+ Ve11 = (1,-1,0);
+ Ve12 = (2,0,0);
+ Ve13 = (2,1,1);
+ Ve14 = (0,1,1);
+ Ve15 = (-2,1,1);
+ Ve16 = (-2,-1,1);
+ Ve17 = (0,-1,1);
+ Ve18 = (2,-1,1);
+ Ve19 = (1,0,1);
+ Ve20 = (0,0,0);
+ Ve21 = (-1,0,1);
+ Ve22 = (1,0,-1);
+ Ve23 = (-1,0,-1);
+ for i=1 upto 23:
+ comm := "unfill rigorousfearpath(" & cstr(Ve[i]) & ",0.08);";
+ comn := "draw rigorousfearpath(" & cstr(Ve[i]) & ",0.08);";
+ getready( comm & comn, Ve[i] );
+ endfor;
+ e1p1 = 1; e2p1 = 2; e3p1 = 3; e4p1 = 4; e5p1 = 5; e6p1 = 6;
+ e1p2 = 2; e2p2 = 3; e3p2 = 4; e4p2 = 5; e5p2 = 6; e6p2 = 1;
+ e7p1 = 13; e8p1 = 14; e9p1 = 15; e10p1 = 16; e11p1 = 17; e12p1 = 18;
+ e7p2 = 14; e8p2 = 15; e9p2 = 16; e10p2 = 17; e11p2 = 18; e12p2 = 13;
+ e13p1 = 1; e14p1 = 2; e15p1 = 3; e16p1 = 4; e17p1 = 5; e18p1 = 6;
+ e13p2 = 13; e14p2 = 14; e15p2 = 15; e16p2 = 16; e17p2 = 17; e18p2 = 18;
+ e19p1 = 2; e19p2 = 5; e20p1 = 14; e20p2 = 17;
+ e101p1 = 22; e201p1 = 10; e301p1 = 5; e401p1 = 5;
+ e101p2 = 2; e201p2 = 17; e301p2 = 23; e401p2 = 22;
+ e102p1 = 2; e202p1 = 17; e302p1 = 23; e402p1 = 22;
+ e102p2 = 8; e202p2 = 19; e302p2 = 8; e402p2 = 7;
+ e103p1 = 8; e203p1 = 19; e303p1 = 8; e403p1 = 7;
+ e103p2 = 21; e203p2 = 7; e303p2 = 14; e403p2 = 14;
+ e104p1 = 21; e204p1 = 7; e304p1 = 14; e404p1 = 14;
+ e104p2 = 17; e204p2 = 2; e304p2 = 19; e404p2 = 21;
+ e105p1 = 17; e205p1 = 2; e305p1 = 19; e405p1 = 21;
+ e105p2 = 11; e205p2 = 23; e305p2 = 11; e405p2 = 10;
+ e106p1 = 11; e206p1 = 23; e306p1 = 11; e406p1 = 10;
+ e106p2 = 22; e206p2 = 10; e306p2 = 5; e406p2 = 5;
+ for i=1 upto 20:
+ vc := Ve[e[i]p2]-Ve[e[i]p1];
+ vu := N(vc);
+ va := Ve[e[i]p1]+0.2*vu;
+ vb := Ve[e[i]p2]-0.2*vu;
+ a := cstr( va );
+ b := cstr( vb-va );
+ comm := "rigorousdisc( 0, true," & a & ",0.08," & b & ");";
+ getready( comm, 0.5[va,vb] );
+ endfor;
+ for j=1 upto 4:
+ for i=1 upto 6:
+ k := 100*j+i;
+ vc := Ve[e[k]p2]-Ve[e[k]p1];
+ vu := N(vc);
+ va := Ve[e[k]p1]+0.2*vu;
+ vb := Ve[e[k]p2]-0.2*vu;
+ a := cstr( va );
+ b := cstr( vb-va );
+ comm := "rigorousdisc( 0, true," & a & ",0.08," & b & ");";
+ comn := "drawoptions( withcolor " & col[j] & " );";
+ como := "drawoptions();";
+ getready( comn & comm & como, 0.5[va,vb] );
+ endfor;
+ endfor;
+ doitnow;
+endfig;
+
+Nobjects := 0;
+
+beginfig(6);
+ numeric i, j, k, c, Mx, My, Mz, is;
+ string comm, comn, this;
+ boolean jisodd, kisodd;
+ color there, ref, aux, Ve[];
+ path pa, pb, pc, pd;
+ Mx = 3;
+ My = 3;
+ Mz = 3;
+ kisodd = false;
+ c = 0.5*sqrt(2);
+ ref = -0.5*c*(Mx,My,Mz);
+ aux = ref-0.5*(1,1,1);
+ Ve0 = aux;
+ Ve1 = (-X(aux),Y(aux),Z(aux));
+ Ve2 = (X(aux),-Y(aux),Z(aux));
+ Ve3 = (X(aux),Y(aux),-Z(aux));
+ Ve4 = (X(aux),-Y(aux),-Z(aux));
+ Ve5 = (-X(aux),Y(aux),-Z(aux));
+ Ve6 = (-X(aux),-Y(aux),Z(aux));
+ Ve7 = (-X(aux),-Y(aux),-Z(aux));
+ pa = rp(Ve0)--rp(Ve1)--rp(Ve6)--rp(Ve2)--cycle;
+ pb = rp(Ve0)--rp(Ve2)--rp(Ve4)--rp(Ve3)--cycle;
+ pc = rp(Ve0)--rp(Ve3)--rp(Ve5)--rp(Ve1)--cycle;
+ pd = rp(Ve7)--rp(Ve4)--rp(Ve2)--rp(Ve6)--cycle;
+ unfill pa; draw pa;
+ unfill pb; draw pb;
+ unfill pc; draw pc;
+ for k=0 upto Mz:
+ if kisodd:
+ jisodd := true;
+ else:
+ jisodd := false;
+ fi;
+ for j=0 upto My:
+ if jisodd:
+ is := 1;
+ else:
+ is := 0;
+ fi;
+ for i=is step 2 until Mx:
+ there := c*(i,j,k)+ref;
+ this := "rigorousfearpath(" & cstr(there);
+ comm := "unfill " & this & ",0.5);";
+ comn := "draw " & this & ",0.5);";
+ getready( comm & comn, there );
+ endfor;
+ jisodd := not jisodd;
+ endfor;
+ kisodd := not kisodd;
+ endfor;
+ doitnow;
+ unfill pd; draw pd;
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/cylimple.mp b/graphics/metapost/contrib/macros/featpost/example/cylimple.mp
new file mode 100644
index 0000000000..973b5f32aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cylimple.mp
@@ -0,0 +1,50 @@
+% cylimple.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+SphericalDistortion := true;
+f := 0.3*(5,4,2);
+Spread := 40;
+ShiftV := (200,200);
+
+%SphericalDistortion := false;
+%f := 3.3*(5,4,2);
+%Spread := 70;
+%Shifts := (250,250);
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, xxsize, aux,
+ yysize, zzsize, i, numc, slope;
+
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+ xxsize = radius;
+ yysize = 0.5*(numc-1)*grids;
+ zzsize = altura;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+% drawarrow rp(orig)..rp(axxc);
+% drawarrow rp(orig)..rp(ayyc);
+% drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/cylinderborders.mp b/graphics/metapost/contrib/macros/featpost/example/cylinderborders.mp
new file mode 100644
index 0000000000..bd4968d92f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/cylinderborders.mp
@@ -0,0 +1,50 @@
+% cylinderborders.mp
+% L. Nobre G.
+% 2014
+
+prologues := 1;
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ f := (3,5,2);
+ numeric margi, ray, dist, len, marj;
+ margi = 0.15;
+ marj = 0.37;
+ ray = 0.2;
+ dist = 0.6;
+ len = 0.25;
+ color pos, pa, pb, pc, pd, qa, qb, qc, qd, ra, P, Q;
+ pos = (marj,dist,0);
+ numeric pqwid, pqlen, theta;
+ pqwid = (dist ++ ray) + 2*margi;
+ pqlen = len + 4*margi;
+ theta = 2*angle(dist,ray);
+ pa = (2margi+marj,dist+margi,0);
+ pb = (2margi+marj,-margi,0);
+ pc = (-len-margi,-margi,0);
+ pd = (-len-margi,dist+margi,0);
+ qa = (margi+marj,dist+margi*cosd(theta),-margi*sind(theta));
+ qb = (margi+marj,dist-(dist+margi)*cosd(theta),(dist+margi)*sind(theta));
+ qc = (-len-2margi,dist-(dist+margi)*cosd(theta),(dist+margi)*sind(theta));
+ qd = (-len-2margi,dist+margi*cosd(theta),-margi*sind(theta));
+ ra = (margi+marj,dist,0);
+ path lowplan, higplan;
+ lowplan = rp(pa)--rp(pb)--rp(pc)--rp(pd)--cycle;
+ higplan = rp(qa)--rp(qb)--rp(qc)--rp(qd)--cycle;
+ unfill higplan;
+ draw higplan;
+ unfill lowplan;
+ draw lowplan;
+ draw rp(pos)--rp(-len*red);
+ rigorousdisc( 0, true, (0,0,ray), ray, -len*red );
+ draw rp(ra)--rp(qb);
+ draw rp(pos) withpen pencircle scaled 3pt;
+ P = (0,ray*sind(theta),ray*(1+cosd(theta)));
+ Q = P-len*red;
+ draw rp(black)--rp(pos)--rp(P)--rp(Q)--rp(pos);
+ draw rp(ra)--rp((-margi-len,dist,0)) dashed withdots withcolor 0.5white;
+ draw rp(P)--rp(Q) withcolor blue withpen pencircle scaled 2pt;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/daliasensor.mp b/graphics/metapost/contrib/macros/featpost/example/daliasensor.mp
new file mode 100644
index 0000000000..ef7a790083
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/daliasensor.mp
@@ -0,0 +1,70 @@
+%jose samuel perez huerta
+%mayo 2007
+%paladium lattice in hydrogen
+
+input featpost3Dplus2D;
+
+% Under the adsorption process,
+% the hydrogen molecules are retained in the surface of the
+% metal forming a gaseous layer. Nevertheless, the hydrogen molecule is
+% too great to get up in the structure of a solid. When the amount of
+% hydrogen is increased, the palladium dissociates molecules of the gas
+% so that now in its atomic form, they are diffused between the
+% interstitial sites of lattice formation of palladium hydrides In this
+% process, the lattice undergoes to isotropic expansion, lattice
+% constant is increased until a 3\% in each space direction, increasing
+% the total volume until in a 10\%
+
+beginfig(1);
+ numeric sph, sphc, ind, indos, suma, intres, i, j, coos, size, num;
+ color xdelta, ydelta, zdelta, W[], fro, pro;
+ path p[], pp[], ppp, pppp;
+ f := 1.5*(10,5,3);
+% ParallelProj := true;
+ Spread := 50;
+ sph := 0.15;
+ sphc := 0.07;
+ size = 6;
+ num=200;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ xdelta := (sph,0,0);
+ ydelta := (0,sph,0);
+ zdelta := (0,0,sph);
+ suma:=0;
+ for ind=1 upto 3:
+ for indos=1 upto 10:
+ for intres=1 upto 10:
+ suma:=suma+1;
+ V[suma] :=0.5*(indos,intres,ind);
+ W[suma] :=0.5*((indos-1,intres-1,ind-1)+0.5*(1,1,1));
+ endfor;
+ endfor;
+ endfor;
+
+ for ind=1 upto suma:
+ p[ind] := rigorousfearpath( V[ind], sph );
+ pp[ind] := rigorousfearpath( W[ind], sphc );
+ endfor;
+
+ for ind=1 upto suma:
+ fill pp[ind] withcolor red;
+ draw pp[ind] withcolor black;
+ fill p[ind] withcolor .75white;
+ draw p[ind] withcolor blue;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%
+ for i=1 upto num:
+ for j=1 upto 2:
+ coos[j] := 1.7*uniformdeviate(size*.5);
+ endfor;
+ fro := (coos1,coos2, 4*(.5)+(.3)*normaldeviate);
+ pro := fro+(0,sph,0);
+ ppp := rigorousfearpath( fro, sphc);
+ pppp := rigorousfearpath( pro, sphc);
+ fill ppp withcolor red;
+ draw ppp withcolor (.5,.4,0);
+ fill pppp withcolor red;
+ draw pppp withcolor black;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%
+endfig;
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/decorstatement.mp b/graphics/metapost/contrib/macros/featpost/example/decorstatement.mp
new file mode 100644
index 0000000000..099c11d329
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/decorstatement.mp
@@ -0,0 +1,29 @@
+verbatimtex
+\documentclass{article}
+\usepackage{bookman}
+\pagestyle{empty}
+\begin{document}
+etex
+
+input boxes;
+
+beginfig(0);
+ picture thestatement;
+ thestatement = thelabel( btex
+ \begin{tabular}{c}
+ Pictures \\
+ from \\
+ Out There
+ \end{tabular}
+ etex, origin);
+ circleit.state( thestatement );
+ state.dx = state.dy;
+ pickup pencircle scaled 1pt;
+ fill bpath.state withcolor (0.25,0.33,0.75);
+ draw bpath.state;
+ draw thestatement;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/defaultcmr.mp b/graphics/metapost/contrib/macros/featpost/example/defaultcmr.mp
new file mode 100644
index 0000000000..01371bc925
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/defaultcmr.mp
@@ -0,0 +1,32 @@
+% defaultcmr.mp
+% use dvips -Pcmz
+
+beginfig(0);
+ picture sent[];
+ numeric xCoord, i;
+ color one, two, thr, fur;
+ one = (0.13333,0.54510,0.13334);
+ two = (0.74118,0.71764,0.41961);
+ thr = (0.80000,0.20000,0.20000);
+ fur = (0.00000,0.85000,1.00000);
+ xCoord = 3in;
+
+ defaultfont := "cmbx12";
+ defaultscale := 6.5;
+
+ sent1 = thelabel( " ", (xCoord, 6in) );
+ sent2 = thelabel( "Be", (xCoord, 5in) );
+ sent3 = thelabel( "Aware", (xCoord, 4in) );
+ sent4 = thelabel( "of", (xCoord, 3in) );
+ sent5 = thelabel( "Technical", (xCoord, 2in) );
+ sent6 = thelabel( "Arrogance.", (xCoord, 1in) );
+ for i = 1 upto 4:
+ draw sent[i] withcolor two;
+ endfor;
+ for i = 5 upto 6:
+ draw sent[i] withcolor thr;
+ endfor;
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/deperspective.mp b/graphics/metapost/contrib/macros/featpost/example/deperspective.mp
new file mode 100644
index 0000000000..aaf486f9fd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/deperspective.mp
@@ -0,0 +1,94 @@
+% deperspective.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+defaultscale := 1.5;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+numeric cont, cmax;
+cmax = 4;
+color focus[];
+focus1 = (5, 3.5,1);
+focus2 = 0.4*(5, 3.5,3);
+focus3 = 0.4*(5, 1.5,1.5);
+focus4 = 0.4*(2.5,5, 1.5);
+for cont= 1 upto cmax:
+ f := focus[cont];
+ beginfig(cont);
+ numeric gridnum, axesmarg, xlen, ylen;
+ gridnum = 15;
+ axesmarg = 0.5;
+ xlen = 1.0;
+ ylen = 1.5;
+ cartaxes(xlen+axesmarg,ylen+axesmarg,1);
+ color va, vb, vc, vd;
+
+ va = ( 0, 0,0);
+ vb = ( 0,ylen,0);
+ vc = (xlen,ylen,0);
+ vd = (xlen, 0,0);
+
+ z3 = rp(va);
+ z4 = rp(vb);
+ z5 = rp(vc);
+ z6 = rp(vd);
+
+ draw z3--z4--z5--z6--cycle dashed evenly;
+ z1 = whatever[z3,z4];
+ z1 = whatever[z6,z5];
+ z2 = whatever[z6,z3];
+ z2 = whatever[z5,z4];
+ draw z1--z3 dashed evenly;
+ draw z1--z6 dashed evenly;
+ draw z2--z3 dashed evenly;
+ draw z2--z4 dashed evenly;
+
+ numeric aonei, atwoi, bonei, btwoi, conei, ctwoi, donei, dtwoi;
+ aonei = 1/abs(z3-z1);
+ atwoi = 1/abs(z3-z2);
+ bonei = 1/abs(z4-z1);
+ btwoi = 1/abs(z4-z2);
+ conei = 1/abs(z5-z1);
+ ctwoi = 1/abs(z5-z2);
+ donei = 1/abs(z6-z1);
+ dtwoi = 1/abs(z6-z2);
+
+ numeric aone, atwo, bone, btwo, cone, ctwo, done, dtwo;
+ aone = abs(z3-z1);
+ atwo = abs(z3-z2);
+ bone = abs(z4-z1);
+ btwo = abs(z4-z2);
+ cone = abs(z5-z1);
+ ctwo = abs(z5-z2);
+ done = abs(z6-z1);
+ dtwo = abs(z6-z2);
+
+ numeric i, wei, aux, good;
+ for i=0 upto gridnum-1:
+ wei := (0.5+i)/gridnum;
+ draw z1--rp(wei[vb,vc]) withcolor red;
+ draw z2--rp(wei[vd,vc]) withcolor red;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The following lines
+%%%%%%%%%%%%%%%%%%%%%% show how rounding error can destroy accuracy!
+% aux := dtwoi/((1-wei)*atwoi+wei*dtwoi);
+% good := dtwoi/(atwoi+wei*(dtwoi-atwoi));
+% show (aux,good);
+% draw z1--(good[z2,z6]);
+% draw z2--((bonei/((1-wei)*aonei+wei*bonei))[z1,z4]);
+ draw z1--((1/((1-wei)*abs(z6-z2)/abs(z3-z2)+wei))[z2,z6]) withcolor blue;
+ draw z2--((1/((1-wei)*abs(z4-z1)/abs(z3-z1)+wei))[z1,z4]) withcolor blue;
+ endfor;
+ labels.top(1,2,3,4,5,6);
+ show ((atwo/dtwo)*(ctwo/btwo),(aone/bone)*(cone/done));
+%show ylen/xlen-(bonei-aonei)/(dtwoi-atwoi);
+%show (abs(z2-z6)/abs(z1-z4))*(abs(z1-z4)-abs(z1-z3))/(abs(z2-z6)-abs(z2-z3));
+%show sqrt(abs(z3-z4))*sqrt(abs(z5-z6))/(sqrt(abs(z6-z3))*sqrt(abs(z5-z4)));
+ endfig;
+endfor;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/derivondatriang.mp b/graphics/metapost/contrib/macros/featpost/example/derivondatriang.mp
new file mode 100644
index 0000000000..7081d59043
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/derivondatriang.mp
@@ -0,0 +1,82 @@
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def marktic( expr Where, IsVertical, Size ) =
+ begingroup
+ pair low, hig;
+ if IsVertical:
+ low = ( xpart Where, (ypart Where) - 0.5*Size );
+ hig = ( xpart Where, (ypart Where) + 0.5*Size );
+ else:
+ low = ( (xpart Where) - 0.5*Size, ypart Where );
+ hig = ( (xpart Where) + 0.5*Size, ypart Where );
+ fi;
+ draw low--hig
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u, xsize, ysize, ticlen, xstep, yamp, yshift;
+ path o.dtriang, xax, yax;
+ picture previouspic;
+ u = 8mm;
+ xsize = 9u;
+ ysize = 2.7u;
+ ticlen = 0.2u;
+ yamp = 1.8u;
+ xstep = 1.6u;
+ yshift = 6.0u;
+ z0 = origin;
+ z1 = ( xsize, 0 );
+ xax = z0--z1;
+ z2 = ( 0, -ysize );
+ z3 = ( 0, ysize );
+ yax = z2--z3;
+ z4 = ( 0, -yamp );
+ z40 = ( 0, yamp );
+ z5 = ( xstep, yamp );
+ z50 = ( xstep, 0 );
+ z6 = ( 2*xstep, -yamp );
+ z60 = ( 2*xstep, 0 );
+ z7 = ( 3*xstep, yamp );
+ z70 = ( 3*xstep, 0 );
+ z8 = ( 4*xstep, -yamp );
+ z80 = ( 4*xstep, 0 );
+ z9 = ( 5*xstep, yamp );
+ z90 = ( 5*xstep, 0 );
+ o.dtriang = z4--z5--z6--z7--z8--z9;
+ drawarrow xax;
+ drawarrow yax;
+ marktic( z4, false, ticlen );
+ marktic( z40, false, ticlen );
+ marktic( z50, true, ticlen );
+ marktic( z60, true, ticlen );
+ marktic( z70, true, ticlen );
+ marktic( z80, true, ticlen );
+ marktic( z90, true, ticlen );
+ label.bot( btex $x$ etex, z1 );
+ label.bot( btex 1 etex, z50 );
+ label.bot( btex 2 etex, z60 );
+ label.bot( btex 3 etex, z70 );
+ label.bot( btex 4 etex, z80 );
+ label.bot( btex 5 etex, z90 );
+ previouspic = currentpicture;
+ draw previouspic shifted (0,-yshift);
+ label.lft( btex $\frac{d\, f}{d\, x}$ etex scaled 1.35, (0,ysize-yshift) );
+ label.lft( btex $f$ etex, z3 );
+ draw o.dtriang withpen pencircle scaled 2pt;
+ label.lft( btex 2 etex, z40 );
+ label.lft( btex -2 etex, z4 );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/diameters.mp b/graphics/metapost/contrib/macros/featpost/example/diameters.mp
new file mode 100644
index 0000000000..82bae32976
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/diameters.mp
@@ -0,0 +1,36 @@
+
+beginfig(1);
+ pair po, pa, pb, pc, pd, pe, pf, pg;
+ numeric u, ang, bigray, smaray, i;
+ path smacirc, heigray;
+ u = 0.2mm;
+ ang = 40;
+ bigray = 250u;
+ smaray = 205u;
+ po = (105mm,145mm);
+ pa = po - bigray*dir( ang );
+ pb = po + (2*smaray-bigray)*dir( ang );
+ pc = po + bigray*dir( ang );
+ pe = po + bigray*dir( ang + 90 );
+ pf = po + (smaray-bigray)*dir( ang );
+ pg = po - bigray*dir( ang + 90 );
+ heigray = po--pe;
+ smacirc = (fullcircle scaled (2*smaray)) shifted pf;
+ pd = heigray intersectionpoint smacirc;
+ draw pg--pe;
+ draw smacirc;
+ draw (fullcircle scaled (2*bigray)) shifted po;
+ draw pc--pa--pd--pb;
+ draw pd--pe withcolor red;
+ draw pb--pc withcolor red;
+ dotlabel.bot( "O", po );
+ dotlabel.llft( "A", pa );
+ dotlabel.bot( "B", pb );
+ dotlabel.urt( "C", pc );
+ dotlabel.top( "D", pd );
+ dotlabel.ulft( "E", pe );
+ dotlabel.top( "F", pf );
+endfig;
+
+end.
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/directfonts.mp b/graphics/metapost/contrib/macros/featpost/example/directfonts.mp
new file mode 100644
index 0000000000..975aa905e5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/directfonts.mp
@@ -0,0 +1,20 @@
+% directfonts.mp
+% Check out /usr/share/texmf/fonts/tfm/public/
+% or /usr/TeX/texmf/fonts/tfm/public
+
+prologues := 3;
+
+beginfig(0);
+ numeric xCoord;
+ xCoord = 3in;
+ defaultfont := "bchr8r";
+ label( "QWERTYUIOPasdfghjklZXCVBNM", (xCoord, 4cm) );
+ label( "What gives?", (xCoord, 3cm) );
+ defaultfont := "cmss17";
+ label( "0.123,456,789", (xCoord, 2cm) );
+% defaultfont := "fplmr";
+% label( "áéíóúàèìòùãõçÁÉÍÓÚÀÈÌÒÙÃÕÇ°", (xCoord, 0) );
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/doitnow.mp b/graphics/metapost/contrib/macros/featpost/example/doitnow.mp
new file mode 100644
index 0000000000..1fe1a420bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/doitnow.mp
@@ -0,0 +1,33 @@
+% doitnow.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+f := 1.5*(1.5,0,1);
+Spread := 100;
+
+beginfig(1);
+ numeric stagelevel, holediam, outerdiam, stagemargin;
+ numeric numberofstagesidesquares, stagesidesize;
+ numeric centercoord;
+ color centerposdisc, centerpostorus, centerstage;
+ pickup pencircle scaled 3pt;
+ stagelevel = 0.2;
+ holediam = 0.6;
+ stagemargin = 0.2;
+ numberofstagesidesquares = 10;
+ centerstage = (-X(f),-Y(f),-stagelevel);
+ outerdiam = holediam+4*stagelevel;
+ stagesidesize = 2*( outerdiam + stagemargin );
+ centercoord = 0.3535*outerdiam;
+ HoriZon := -stagelevel;
+ centerpostorus = ( centercoord, -centercoord, 0 );
+ centerposdisc = ( -centercoord, centercoord, HoriZon );
+ getready("setthestage( numberofstagesidesquares, stagesidesize );",
+ centerstage);
+ getready("smoothtorus( centerpostorus, blue,0.5*holediam+stagelevel, stagelevel );",centerpostorus);
+ getready("rigorousdisc( 0.5*holediam, true, centerposdisc,0.5*outerdiam, 1.5*stagelevel*blue );",centerposdisc);
+ doitnow;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/downloadicon.mp b/graphics/metapost/contrib/macros/featpost/example/downloadicon.mp
new file mode 100644
index 0000000000..d4fa559c68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/downloadicon.mp
@@ -0,0 +1,66 @@
+% downloadicon.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+f := 0.4[(12,3,2),(2,5,6)]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Max: 0.8
+Spread := 30;
+TDAtiplen := 0.65;
+TDAhalftipbase := 0.35;
+TDAhalfthick := 0.15;
+
+beginfig(1);
+ color tracecol, lockcol, arrowcol;
+ numeric altura, compri, radius, altfrac, comfrac, radang;
+ path theside, thefront, thelocka, thelockb, thelock;
+ color poi[], startarrow, endarrow;
+ numeric numpl, aux, i;
+ altura = 1;
+ compri = 2;
+ radius = 0.8;
+ altfrac = 0.2;
+ comfrac = 0.15;
+ radang = 37;
+ numpl = 9;
+ tracecol = blue;
+ lockcol = black;
+ arrowcol = (0.7,0.2,0.1);
+ startarrow = (0,-radius,2);
+ endarrow = (0,0,radius);
+ currentpen := pencircle scaled 2.4mm;
+ drawoptions( withcolor tracecol );
+ rigorousdisc( 0, true, (-0.5compri,0,0), radius, (compri,0,0) );
+ poi1 = (0.5compri,-radius,0);
+ poi2 = (0.5compri,radius,0);
+ poi3 = (-0.5compri,radius,0);
+ poi4 = (0.5compri,-radius,-altura);
+ poi5 = (0.5compri,radius,-altura);
+ poi6 = (-0.5compri,radius,-altura);
+ theside = rp(poi1)--rp(poi2)--rp(poi5)--rp(poi4)--cycle;
+ thefront= rp(poi2)--rp(poi3)--rp(poi6)--rp(poi5)--cycle;
+ drawoptions( withcolor white );
+ fill theside;
+ fill thefront;
+ thelocka = rp((comfrac*compri,radius,-altfrac*altura))
+ --rp((comfrac*compri,radius,0));
+ thelockb = rp((-comfrac*compri,radius,-altfrac*altura))
+ --rp((-comfrac*compri,radius,0));
+ for i=1 upto numpl:
+ aux := i*radang/numpl;
+ poi7 := (comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ poi8 := (-comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ thelocka := thelocka...rp(poi7);
+ thelockb := thelockb...rp(poi8);
+ endfor;
+ thelock = thelocka--reverse thelockb--cycle;
+ drawoptions( withcolor lockcol );
+ filldraw thelock;
+ drawoptions( withcolor tracecol );
+ draw theside;
+ draw thefront;
+ drawoptions( withcolor arrowcol );
+ tdarrow( startarrow, endarrow );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/dreamhouse.mp b/graphics/metapost/contrib/macros/featpost/example/dreamhouse.mp
new file mode 100644
index 0000000000..dba8b80a49
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/dreamhouse.mp
@@ -0,0 +1,212 @@
+% dreamhouse.mp
+% L. Nobre G.
+% 2011
+
+prologues := 2;
+
+beginfig(1);
+ numeric u;
+ u = 5mm; % deve corresponder a um metro
+ numeric theta, gamma;
+ theta = 8.7;
+ gamma = 25;
+ numeric lqua, lwca, lqub, lcor, lpor, lwcb, cqua, cqub, lwcc, cwcc, lesc;
+ lqua = 3.8u;
+ lwca = 1.5u;
+ lqub = 3.0u;
+ lcor = 1.2u;
+ lpor = 0.9u;
+ lwcb = 2.0u;
+ cqua = 4.0u;
+ cqub = 5.0u;
+ lwcc = 1.5u;
+ cwcc = 1.5u;
+ lesc = 3.0u;
+ numeric lcas, cdoj, cfaf, cfat, csal, cesc, cwca, dcor, ldoj, extr;
+ lcas = lqua+lwca+lqub;
+ cdoj = cqub+lcor+lwcb;
+ extr = cqua*sind(theta)/cosd(theta);
+ csal = lwca+lqua+extr;
+ ldoj = csal+lqub;
+ cesc = csal+lqub-2*lpor-lqub;
+ cwca = cqua-lcor;
+ dcor = lcor/cosd(gamma);
+ z1 = left*lpor;
+ z2 = z1+cesc*dir(-90-gamma);
+ z3 = z1+lesc*dir(180-gamma);
+ z4 = z2+lesc*dir(180-gamma);
+ z5 = z3+2*lpor*dir(90-gamma);
+ z6 = z5+lqub*dir(90-gamma);
+ z7 = z6+lwcb*dir(180-gamma);
+ z8 = z5+lwcb*dir(180-gamma);
+ z9 = z7+lcor*dir(180-gamma);
+ z10= z9+lqub*dir(-90-gamma);
+ z11= z9+cqub*dir(180-gamma)+extr*dir(-90-gamma);
+ z12=z11+(lqub-extr)*dir(-90-gamma);
+ z13=z12+cwca*dir(-gamma);
+ z14=z12+cqua*dir(-gamma);
+ z15=z12+lwca*dir(-90-gamma);
+ z16=z15+cwca*dir(-gamma);
+ z17=z11+(lcas-extr)*dir(-90-gamma);
+ z18=z14+csal*dir(-90-gamma);
+ z19=whatever[z17,z18];
+ x19= 0;
+ z20=z11+whatever*dir(theta-gamma);
+ x20= 0;
+ z21=whatever[z11,z6];
+ x21= 0;
+ z22=whatever[z4,z2];
+ x22= 0;
+ z23= right*lpor;
+ z24=z22+whatever*dir(gamma);
+ x24=x23;
+ z25=z23+dcor*down;
+ z26=z24+dcor*up;
+ z27=z26+lcor*right;
+ z28=z27+whatever*up;
+ z28=z25+whatever*right;
+ z33= (-x18,y18);
+ z30= (-x6,y6);
+ z29=z30+whatever*dir(gamma);
+ z29=z33+whatever*dir(90+gamma);
+ z31=z18+ldoj*dir(90-gamma);
+ z32= (-x4,y4);
+ z34= (-x3,y3);
+ z35=z24+whatever*dir(gamma);
+ z35=z27+whatever*down;
+ z36=z35+lwcc*dir(gamma);
+ z37=z36+cwcc*dir(90+gamma);
+ z38=z37+whatever*left;
+ z38=whatever[z28,z35];
+ draw origin--z1--z2;
+ draw z34--z23--z1--z3;
+ draw z4--z6;
+ draw z5--z8--z7;
+ draw z9--z10--z12;
+ draw z14--z18--z22--z33;
+ draw z13--z16--z15;
+ draw z18--z17--z11--z31--z21--z29--z33;
+ draw z30--z32;
+ draw z23--z24;
+ draw z25--z28--z35;
+ draw z36--z37--z38;
+ pen outpen;
+ outpen = pencircle scaled (0.2u);
+ draw z11--z17--z18--z22--z33--z29--z21--z31--cycle withpen outpen;
+endfig;
+
+beginfig(2);
+ numeric u;
+ u = 5mm; % deve corresponder a um metro
+ numeric theta, gamma;
+ theta = 8.7;
+ gamma = 25;
+ numeric lqua, lwca, lqub, lcor, lpor, lwcb, cqua, cqub, lwcc, cwcc, lesc;
+ numeric lcas, cdoj, cfaf, cfat, csal, cesc, cwca, dcor, ldoj, cwcb;
+ numeric cmed, lare, mroo;
+ lqua = 3.25u;
+ lcor = 1.2u;
+ lpor = 0.9u;
+ cqua = 4.5u;
+ lwcc = 2.0u;
+ cwcc = 1.5u;
+ lesc = 2.5u;
+ csal = 5.8u;
+ cwca = 2.0u;
+ lare = 2.0u;
+ mroo = 0.6u;
+ cdoj = 5.5u;
+ cwcb = 2*lcor;
+ cqub = cqua+cwca-lcor;
+ lwca = lqua-lcor;
+ lqub = lqua;
+ lwcb = lwca;
+ lcas = lqua+lqub;
+ ldoj = lcas;
+ cesc = lqua;
+ dcor = lcor/cosd(gamma);
+ cmed = csal+lwca+cqua;
+ z1 = left*lpor;
+ z2 = z1+cesc*dir(-90-gamma);
+ z3 = z34;
+ z4 = z32+ldoj*dir(90+gamma);
+ z5 = z1+2*lcor*dir(180-gamma);
+ z6 = z7+lqub*dir(-90-gamma);
+ z7 = z8+cwcb*dir(-gamma);
+ z8 =z11+cqub*dir(-gamma);
+ z9 = z8+lqub*dir(-90-gamma);
+ z10=z12+(cqua+lwca)*dir(-gamma);
+ z11=z12+lqub*dir(90-gamma);
+ z12= z1+cmed*dir(180-gamma);
+ z13=z10+lcor*dir(-90-gamma);
+ z14= z7+lwcb*dir(-90-gamma);
+ z15= z8+lwcb*dir(-90-gamma);
+ z16=z13+cwca*dir(180-gamma);
+ z17=z11+lcas*dir(-90-gamma);
+ z18=z13+lwca*dir(-90-gamma);
+ z19=z16+lwca*dir(-90-gamma);
+ z20= z22+up*lcor/cosd(gamma);
+ z21=whatever[z11,z7];
+ x21= 0;
+ z22=whatever[z18,z17];
+ x22= 0;
+ z23= right*lpor;
+ z24=z20+whatever*dir(-90-gamma);
+ z24=whatever[z2,z22];
+ z25=z23+cesc*dir(-90+gamma);
+ z26=z25+lcor*dir(90+gamma);
+ z27=z25+cwcc*dir(90+gamma);
+ z28=z27+lwcc*dir(gamma);
+ z29=z30+lqub*dir(-90+gamma);
+ z30= z4+lesc*dir(180+gamma);
+ z31=z25+lwcc*dir(gamma);
+ z32=z31+lare*dir(gamma);
+ z33=z32+cdoj*dir(gamma);
+ z34=z32+cesc*dir(90+gamma);
+ z35=z33+ldoj*dir(90+gamma);
+ z36=z35+sqrt(2)*mroo*dir(45+gamma);
+ z37=z36+whatever*dir(180+gamma-theta);
+ x37= 0;
+ z38=z11+sqrt(2)*mroo*dir(135-gamma);
+ z39=z38+(lcas+2*mroo)*dir(-90-gamma);
+ z40=z41+whatever*dir(180+gamma+theta);
+ x40= 0;
+ z41=z36+(ldoj+2*mroo)*dir(-90+gamma);
+ z42=z30+lcor*dir(-90+gamma);
+ draw z32--z34--z23--z1;
+ draw z5--z6--z7;
+ draw z14--z15;
+ draw z8--z9;
+ draw z27--z28--z31;
+ draw z18--z10--z12;
+ draw z13--z16--z19;
+ draw z1--z2;
+ draw z3--z4;
+ draw z23--z25;
+ draw z26--z20--z24;
+ draw z29--z42;
+ pen outpen;
+ outpen = pencircle scaled (0.2u);
+ draw z11--z17--z22--z33--z35--z21--cycle withpen outpen;
+ draw z36--z37--z38--z39--z40--z41--cycle withpen outpen withcolor 0.5white;
+ drawoptions( withcolor 0.75white);
+% dotlabels.bot(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
+% dotlabels.bot(21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40);
+% dotlabels.bot(41,42);
+ numeric aux;
+ aux = abs(z35-z21)+abs(z33-z22)+abs(z21-z11)+abs(z22-z17);
+ show aux*lqua/(u**2);
+ label("QUA",(z12+z10+z17+z18)/4);
+ label("QUB",(z11+z12+z8+z9)/4);
+ label("WCA",(z19+z18+z16+z13)/4);
+ label("WCB",(z14+z15+z8+z7)/4);
+ label("SAL",(z2+z1+z10+z18)/4);
+ label("COZ",(z21+z5+z29)/3);
+ label("HAL",(z1+z2+z23+z25)/4);
+ label("ESC",(z30+z29+z4+z3)/4);
+ label("ARE",(z23+z34+z32)/3);
+ label("DOJ",(z4+z32+z33+z35)/4);
+ label("WCC",(z25+z27+z28+z31)/4);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/durgayantra.mp b/graphics/metapost/contrib/macros/featpost/example/durgayantra.mp
new file mode 100644
index 0000000000..8c729149e6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/durgayantra.mp
@@ -0,0 +1,174 @@
+% durgayantra.mp
+% L. Nobre G.
+% 2010
+
+prologues := 1;
+
+numeric u, numthings, bang, tang, hei, rb, rt, ro;
+numthings = 8;
+bang = 75;
+tang = 75;
+rb = u+hei;
+rt = rb+hei;
+ro = rt+2.5mm;
+numeric adang, reflen, marlen, sqrlen;
+adang = 19.896;
+reflen = 0.4*ro;
+marlen = ro*sqrt(2)*(sind(45+adang)-0.5*sqrt(2));
+hei = marlen/6;
+ro+marlen+hei = 18mm; % defines u and hei
+color fundo, risco;
+fundo = (15*16+15,14*16+11,12*16+13)/255;
+risco = (11*16-15,3*16-14,15*16-15)/255;
+
+vardef makedurgayantra =
+ path outercircle, firstcircle, seconcircle;
+ draw fullcircle scaled (2*u);
+ draw fullcircle scaled (2*rb);
+ draw fullcircle scaled (2*rt);
+ path pthingb, pthingbr;
+ pthingb = (rt,0){dir(90-bang)}..
+ {dir(180/numthings+90-tang)}(ro*dir(180/numthings));
+ pthingbr = pthingb yscaled (-1);
+ numeric i;
+ for i=1 upto numthings:
+ draw (reverse pthingbr) rotated ((i+0.5)*360/numthings);
+ draw pthingb rotated ((i+0.5)*360/numthings);
+ endfor;
+ z200 = (ro+marlen,0);
+ z201 = (ro+marlen,1.5*reflen);
+ z202 = (ro+0.5*marlen,1.5*reflen);
+ z203 = (ro+0.5*marlen,0.5*reflen);
+ z204 = (ro,0.5*reflen);
+ z205 = (ro,ro);
+ z100 = z200-(hei,0);
+ z101 = z201-(hei,hei);
+ z102 = z202+(hei,-hei);
+ z103 = z203+(hei,-hei);
+ z104 = z204-(hei,hei);
+ z105 = z205-(hei,hei);
+ z300 = z200+(hei,0);
+ z301 = z201+(hei,hei);
+ z302 = z202-(hei,-hei);
+ z303 = z203-(hei,-hei);
+ z304 = z204+(hei,hei);
+ z305 = z205+(hei,hei);
+ path octp[], octpr[];
+ numeric j;
+ octp[1] = z200--z201--z202--z203--z204--z205;
+ octp[0] = z100--z101--z102--z103--z104--z105;
+ octp[2] = z300--z301--z302--z303--z304--z305;
+ for j=0 upto 2:
+ octpr[j] = (reverse octp[j]) yscaled (-1) ;
+ for i=1 upto 4:
+ draw octpr[j] rotated (i*90);
+ draw octp[j] rotated (i*90);
+ endfor;
+ endfor;
+ z1 = (0,-u);
+ z2 = u*0.5*(sqrt(3),1);
+ z3 = u*0.5*(-sqrt(3),1);
+ draw z1--z2--z3--cycle;
+ numeric refang, xr, dr;
+ xr = sqrt(15);
+ dr = (xr-sqrt(3))*u*0.25;
+ refang = angle(xr,1); show refang;
+ z11 = u*0.25*(xr,-1);
+ z12 = 0.5[z2,z3]+dr*dir(60);
+ z13 = 0.5[z2,z3]+dr*dir(120);
+ z14 = u*0.25*(-xr,-1);
+ z15 = 0.5[z1,z3]+dr*dir(-120);
+ z16 = 0.5[z2,z1]+dr*dir(-60);
+% z11 = u*dir(-refang);
+% z12 = u*dir(90-refang);
+% z13 = u*dir(90+refang);
+% z14 = u*dir(refang-180);
+% z15 = u*dir(3*refang-180);
+% z16 = u*dir(-3*refang);
+ draw z11--z12--z15--z16--z13--z14--cycle;
+enddef;
+
+beginfig(1);
+ numeric hs, al, do, m, diamfur, mfur;
+ hs = 20mm;
+ al = 16cm;
+% do = 3mm;
+ do = 0;
+ m = 3.8mm;
+% diamfur = 3mm;
+ mfur = 6mm;
+ z21 = (hs,m-hs);
+ z22 = (hs,al-hs+do-m);
+ z23 = (hs-m,al-hs+do);
+ z24 = (m-hs,al-hs+do);
+ z25 = (-hs,al-hs+do-m);
+ z26 = (-hs,m-hs);
+ z27 = (m-hs,-hs);
+ z28 = (hs-m,-hs);
+ fill z21---z22...z23---z24...z25---z26...z27---z28...cycle withcolor fundo;
+% draw (hs,al-hs)--(-hs,al-hs) dashed evenly;
+% draw fullcircle scaled diamfur shifted (mfur-hs,al-hs-mfur);
+% draw fullcircle scaled diamfur shifted (hs-mfur,al-hs-mfur);
+
+ drawoptions( withpen pencircle scaled 0.3mm withcolor risco );
+ makedurgayantra;
+ drawoptions( withpen pencircle scaled 0.1mm withcolor risco );
+ numeric lettersiz, lr, ls, lh;
+ lettersiz = 1.1mm;
+ lr = 1+0.5*sqrt(2);
+ ls = 0.9mm;
+ lh = lettersiz*lr;
+ path lepa[];
+ pair av, auxa, lc, auxd;
+ numeric lph[], auxb, auxc;
+ auxc = 0.5*lettersiz;
+ lc = (hs-m,0.5*al-hs);
+ av = (auxc,lh);
+ lepa0 = origin--av--(lettersiz,0);
+ lph0 = 0;
+ auxa = (lh-lettersiz)*unitvector(av);
+ lepa7 = auxa--(lettersiz-xpart auxa, ypart auxa);
+ lph7 = 0;
+ lepa1 = origin--(0,lh)---av...(auxc,lh-lettersiz)---(0,lh-lettersiz);
+ lph1 := lettersiz+ls;
+ lepa2 = origin--(0,lh)--(auxc,lh-auxc)--(lettersiz,lh)--(lettersiz,0);
+ lph2 = 2*(lettersiz+ls);
+ auxb = 0.25*lettersiz*sqrt(2);
+ lepa3 = (auxc-auxb,0.5*lh+auxb)--(auxc+auxb,0.5*lh-auxb);
+ lepa13 = (auxc-auxb,0.5*lh-auxb)--(auxc+auxb,0.5*lh+auxb);
+ lph3 = 3*(lettersiz+ls);
+ lph13 = lph3;
+ lepa4 = (0,lh)--origin--(lettersiz,0);
+ lph4 = 4*(lettersiz+ls);
+ lepa5 = origin--(0,lh)--(lettersiz,0)--(lettersiz,lh);
+ lph5 = 5*(lettersiz+ls);
+ lepa6 = (lettersiz,lh-auxc){up}...av...(0,lh-auxc)---(0,auxc)...(auxc,0)...(lettersiz,auxc)--(auxc,auxc);
+ lph6 = 6*(lettersiz+ls);
+ lepa8 = (lettersiz,auxc)--(lettersiz,0);
+ lph8 = lph6;
+ auxd = sqrt(2)*auxc*(1,1);
+ lepa9 = (0,lh-auxc){up}...av...(lettersiz,lh-auxc)...auxd---origin--(lettersiz,0);
+ lph9 = 8*(lettersiz+ls);
+ lepa10 = (0,auxc)---(0,lh-auxc)...av...(lettersiz,lh-auxc)---(lettersiz,auxc)...(auxc,0)...cycle;
+ lph10 = lph9 + lettersiz + ls;
+ lepa11 = (0,lh-ypart auxd)--(xpart auxd,lh)--(xpart auxd,0);
+ lph11 = lph10 + lettersiz + ls;
+ lepa12 = lepa10;
+ lph12 = lph11 + ls + xpart auxd;
+ numeric i;
+ for i=0 upto 13:
+ draw lepa[i] rotated 90 shifted (lc+(0,lph[i]));
+ endfor;
+ picture finalpicture;
+ finalpicture = currentpicture;
+ currentpicture := nullpicture;
+ drawoptions();
+ draw finalpicture rotated (-45);
+endfig;
+
+beginfig(2);
+% drawoptions( withcolor risco );
+ makedurgayantra;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/eemcsblabla.mp b/graphics/metapost/contrib/macros/featpost/example/eemcsblabla.mp
new file mode 100644
index 0000000000..2641f7bf30
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/eemcsblabla.mp
@@ -0,0 +1,294 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% eemcsblabla.mp %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hacked by L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+numeric zmax, rmax;
+zmax = 1;
+rmax = 1;
+
+def converterfunc( expr Pair ) =
+ begingroup
+ save xucf, yucf, astart, rr, xaux, yaux, raux, aaux, zaux;
+ numeric xucf, yucf, astart, rr, xaux, yaux, raux, aaux, zaux;
+ xucf = 0.21;
+ yucf = 0.002;
+ astart = 120;
+ rr = 0.0004;
+ aaux = astart + xucf*( ypart Pair );
+ raux = rr*aaux + yucf*( xpart Pair );
+ xaux = raux*cosd( aaux );
+ yaux = raux*sind( aaux );
+ zaux = zmax*(1-raux/rmax);
+ ( rp( ( xaux, yaux, zaux ) ) )
+ endgroup
+enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end of first featpost part
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+PreeditedPath1 = hide(z1=(309,-996.562))z1--hide(z2=(309,-984.905))z2..controls hide(z3=(309,-982.215))z3 and hide(z4=(309.097,-979.126))z4..hide(z5=(309.292,-974.344))z5
+ --hide(z6=(309.392,-971.754))z6--hide(z7=(304.908,-969.861))z7--hide(z8=(304.211,-970.259))z8
+ ..controls hide(z9=(304.609,-978.329))z9 and hide(z10=(305,-984.307))z10..hide(z11=(305,-992.078))z11
+ --hide(z12=(305,-995.764))z12--hide(z13=(281.097,-991.58))z13..controls hide(z14=(279.503,-991.281))z14 and hide(z15=(278.706,-991.082))z15..hide(z16=(277.908,-990.683))z16
+ --hide(z17=(277.709,-986.001))z17..controls hide(z18=(277.61,-982.812))z18 and hide(z19=(277,-979.624))z19..hide(z20=(277,-977.432))z20
+ ..controls hide(z21=(277,-971.255))z21 and hide(z22=(278.088,-967.171))z22..hide(z23=(279.901,-967.071))z23
+ --hide(z24=(288.768,-966.274))z24--hide(z25=(288.768,-963.883))z25..controls hide(z26=(282.392,-963.584))z26 and hide(z27=(277.41,-962.886))z27..hide(z28=(273.625,-961.791))z28
+ ..controls hide(z29=(273.425,-963.883))z29 and hide(z30=(273,-966.872))z30..hide(z31=(273,-968.665))z31
+ ..controls hide(z32=(273,-968.964))z32 and hide(z33=(273,-970.06))z33..hide(z34=(273.1,-972.451))z34
+ --hide(z35=(273.199,-984.407))z35..controls hide(z36=(273.625,-985.303))z36 and hide(z37=(273.299,-991.182))z37..hide(z38=(273.299,-992.178))z38
+ ..controls hide(z39=(273.299,-995.864))z39 and hide(z40=(273.299,-998.554))z40..hide(z41=(273.1,-1003.64))z41
+ --hide(z42=(273,-1008.12))z42--hide(z43=(276.115,-1008.42))z43--hide(z44=(276.314,-1003.04))z44
+ ..controls hide(z45=(276.414,-1000.65))z45 and hide(z46=(277.211,-999.55))z46..hide(z47=(279.005,-999.55))z47
+ ..controls hide(z48=(280.399,-999.55))z48 and hide(z49=(283.588,-999.949))z49..hide(z50=(286.577,-1000.45))z50
+ --hide(z51=(336.79,-1009.11))z51..controls hide(z52=(338.583,-1009.51))z52 and hide(z53=(339.281,-1010.71))z53..hide(z54=(339.979,-1015.09))z54
+ --hide(z55=(342,-1015.59))z55--hide(z56=(341.901,-1011.51))z56..controls hide(z57=(342.085,-1008.42))z57 and hide(z58=(341.701,-1002.24))z58..hide(z59=(341.701,-1000.25))z59
+ --hide(z60=(342,-978.827))z60--hide(z61=(342,-977.831))z61..controls hide(z62=(342,-976.436))z62 and hide(z63=(341.616,-973.945))z63..hide(z64=(341.801,-970.657))z64
+ --hide(z65=(341.701,-967.369))z65--hide(z66=(338.683,-966.971))z66..controls hide(z67=(336.691,-966.772))z67 and hide(z68=(333.702,-966.274))z68..hide(z69=(328.82,-965.377))z69
+ --hide(z70=(326.229,-964.879))z70--hide(z71=(326.229,-967.569))z71--hide(z72=(332.207,-969.163))z72
+ ..controls hide(z73=(335.794,-970.159))z73 and hide(z74=(336.99,-971.056))z74..hide(z75=(337.488,-973.248))z75
+ ..controls hide(z76=(337.886,-975.24))z76 and hide(z77=(338.384,-982.513))z77..hide(z78=(338.384,-987.894))z78
+ ..controls hide(z79=(338.384,-991.978))z79 and hide(z80=(338.284,-994.17))z80..hide(z81=(337.687,-1001.04))z81
+ --hide(z82=(337.288,-1001.04))z82..controls hide(z83=(335.893,-1001.04))z83 and hide(z84=(335.096,-1000.95))z84..cycle;
+ %draw PreeditedPath1;
+%drawoptions( withcolor black );
+ %dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84);
+PreeditedPath2 = hide(z85=(310,-859.104))z85..controls hide(z86=(310,-857.61))z86 and hide(z87=(309.691,-856))z87..hide(z88=(307.698,-856))z88
+ ..controls hide(z89=(305.706,-856))z89 and hide(z90=(306,-857.73))z90..hide(z91=(306,-859.005))z91
+ --hide(z92=(306,-918.683))z92..controls hide(z93=(306,-920.078))z93 and hide(z94=(305.706,-922))z94..hide(z95=(307.698,-922))z95
+ ..controls hide(z96=(309.691,-922))z96 and hide(z97=(310,-920.09))z97..cycle;
+ %draw PreeditedPath2;
+%drawoptions( withcolor black );
+ %dotlabels.rt(85,86,87,88,89,90,91,92,93,94,95,96,97);
+PreeditedPath3 = hide(z98=(329,-859.005))z98..controls hide(z99=(329,-857.61))z99 and hide(z100=(329.019,-856))z100..hide(z101=(327.026,-856))z101
+ ..controls hide(z102=(325.034,-856))z102 and hide(z103=(325,-857.735))z103..hide(z104=(325,-859.104))z104
+ --hide(z105=(325,-918.583))z105..controls hide(z106=(325,-920.078))z106 and hide(z107=(325.034,-922))z107..hide(z108=(327.026,-922))z108
+ ..controls hide(z109=(329.019,-922))z109 and hide(z110=(329,-920.09))z110..cycle;
+ %draw PreeditedPath3;
+%drawoptions( withcolor black );
+ %dotlabels.rt(98,99,100,101,102,103,104,105,106,107,108,109,110);
+PreeditedPath4 = hide(z111=(332.008,-747.24))z111--hide(z112=(333.701,-749.831))z112..controls hide(z113=(335.594,-752.72))z113 and hide(z114=(336.69,-754.912))z114..hide(z115=(336.69,-755.908))z115
+ ..controls hide(z116=(336.69,-756.605))z116 and hide(z117=(335.794,-757.203))z117..hide(z118=(334.698,-757.203))z118
+ ..controls hide(z119=(333.701,-757.203))z119 and hide(z120=(332.805,-757.004))z120..hide(z121=(330.712,-756.506))z121
+ --hide(z122=(301.122,-749.034))z122..controls hide(z123=(299.429,-748.635))z123 and hide(z124=(297.835,-748.337))z124..hide(z125=(297.038,-748.337))z125
+ ..controls hide(z126=(295.344,-748.337))z126 and hide(z127=(293.904,-749.333))z127..hide(z128=(293.904,-750.927))z128
+ ..controls hide(z129=(293.904,-753.816))z129 and hide(z130=(295.799,-757.602))z130..hide(z131=(300.326,-763.679))z131
+ ..controls hide(z132=(304.809,-769.956))z132 and hide(z133=(308.296,-773.443))z133..hide(z134=(315.171,-778.325))z134
+ --hide(z135=(301.521,-775.336))z135..controls hide(z136=(299.529,-774.938))z136 and hide(z137=(298.034,-774.639))z137..hide(z138=(297.337,-774.639))z138
+ ..controls hide(z139=(295.444,-774.639))z139 and hide(z140=(293.904,-775.635))z140..hide(z141=(293.904,-777.229))z141
+ ..controls hide(z142=(293.904,-780.218))z142 and hide(z143=(296.214,-784.801))z143..hide(z144=(300.625,-790.281))z144
+ ..controls hide(z145=(304.012,-794.665))z145 and hide(z146=(306.104,-796.657))z146..hide(z147=(314.872,-803.133))z147
+ --hide(z148=(301.621,-799.845))z148..controls hide(z149=(300.027,-799.447))z149 and hide(z150=(298.532,-799.248))z150..hide(z151=(297.337,-799.248))z151
+ ..controls hide(z152=(295.444,-799.248))z152 and hide(z153=(293.904,-800.144))z153..hide(z154=(293.904,-801.539))z154
+ ..controls hide(z155=(293.904,-803.631))z155 and hide(z156=(296.094,-807.417))z156..hide(z157=(301.621,-814.79))z157
+ --hide(z158=(303.614,-817.579))z158--hide(z159=(305.606,-816.882))z159--hide(z160=(303.514,-813.694))z160
+ ..controls hide(z161=(301.222,-810.007))z161 and hide(z162=(301.023,-809.708))z162..hide(z163=(301.023,-809.011))z163
+ ..controls hide(z164=(301.023,-807.915))z164 and hide(z165=(302.02,-807.218))z165..hide(z166=(303.514,-807.218))z166
+ ..controls hide(z167=(308.595,-807.218))z167 and hide(z168=(327.823,-811.302))z168..hide(z169=(342.071,-815.387))z169
+ --hide(z170=(343.167,-815.088))z170--hide(z171=(341.672,-808.313))z171--hide(z172=(331.51,-806.121))z172
+ ..controls hide(z173=(320.451,-803.73))z173 and hide(z174=(314.573,-801.04))z174..hide(z175=(308.595,-795.561))z175
+ ..controls hide(z176=(304.012,-791.376))z176 and hide(z177=(301.023,-786.893))z177..hide(z178=(301.023,-784.103))z178
+ ..controls hide(z179=(301.023,-783.406))z179 and hide(z180=(301.82,-783.007))z180..hide(z181=(303.115,-783.007))z181
+ ..controls hide(z182=(306.602,-783.007))z182 and hide(z183=(317.96,-785.199))z183..hide(z184=(335.396,-789.284))z184
+ --hide(z185=(342.071,-790.878))z185--hide(z186=(343.167,-790.38))z186--hide(z187=(341.672,-783.505))z187
+ --hide(z188=(331.012,-781.413))z188..controls hide(z189=(322.942,-779.819))z189 and hide(z190=(315.47,-776.431))z190..hide(z191=(310.588,-772.048))z191
+ ..controls hide(z192=(304.51,-766.568))z192 and hide(z193=(301.023,-761.586))z193..hide(z194=(301.023,-758.398))z194
+ ..controls hide(z195=(301.023,-757.601))z195 and hide(z196=(301.92,-757.103))z196..hide(z197=(303.514,-757.103))z197
+ ..controls hide(z198=(305.905,-757.103))z198 and hide(z199=(307.3,-757.402))z199..hide(z200=(315.968,-759.594))z200
+ ..controls hide(z201=(322.244,-761.188))z201 and hide(z202=(328.222,-762.881))z202..hide(z203=(331.61,-763.878))z203
+ ..controls hide(z204=(334.399,-764.774))z204 and hide(z205=(336.99,-765.173))z205..hide(z206=(339.181,-765.173))z206
+ ..controls hide(z207=(341.672,-765.173))z207 and hide(z208=(343,-764.077))z208..hide(z209=(343,-762.184))z209
+ ..controls hide(z210=(343,-759.594))z210 and hide(z211=(340.945,-756.007))z211..cycle;
+ %draw PreeditedPath4;
+%drawoptions( withcolor black );
+ %dotlabels.rt(111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211);
+PreeditedPath5 = hide(z212=(309.392,-705.894))z212--hide(z213=(309.392,-703.602))z213..controls hide(z214=(302.916,-702.805))z214 and hide(z215=(299.23,-702.107))z215..hide(z216=(296.639,-701.211))z216
+ ..controls hide(z217=(295.145,-703.602))z217 and hide(z218=(293.904,-707.089))z218..hide(z219=(293.904,-710.775))z219
+ ..controls hide(z220=(293.904,-715.259))z220 and hide(z221=(297.633,-722.631))z221..hide(z222=(302.916,-728.21))z222
+ ..controls hide(z223=(307.798,-733.69))z223 and hide(z224=(318.259,-738))z224..hide(z225=(328.72,-738))z225
+ ..controls hide(z226=(338.285,-738))z226 and hide(z227=(343.096,-733.635))z227..hide(z228=(343.096,-725.321))z228
+ ..controls hide(z229=(343.096,-719.941))z229 and hide(z230=(341.186,-715.159))z230..hide(z231=(336.89,-709.679))z231
+ --hide(z232=(332.805,-704.698))z232--hide(z233=(330.812,-705.495))z233--hide(z234=(331.809,-706.989))z234
+ ..controls hide(z235=(336.591,-714.162))z235 and hide(z236=(338.096,-717.948))z236..hide(z237=(338.096,-721.435))z237
+ ..controls hide(z238=(338.096,-727.015))z238 and hide(z239=(334.174,-729.999))z239..hide(z240=(326.428,-729.999))z240
+ ..controls hide(z241=(315.668,-729.999))z241 and hide(z242=(305.307,-726.472))z242..hide(z243=(301.521,-721.535))z243
+ ..controls hide(z244=(299.927,-719.443))z244 and hide(z245=(298.904,-717.052))z245..hide(z246=(298.904,-713.963))z246
+ ..controls hide(z247=(298.904,-709.479))z247 and hide(z248=(300.897,-705.893))z248..cycle;
+ %draw PreeditedPath5;
+%drawoptions( withcolor black );
+ %dotlabels.rt(212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248);
+PreeditedPath6 = hide(z249=(304.359,-696.969))z249--hide(z250=(306.328,-696.969))z250..controls hide(z251=(306.101,-682.809))z251 and hide(z252=(306,-682.809))z252..hide(z253=(306,-680.083))z253
+ ..controls hide(z254=(306,-677.357))z254 and hide(z255=(305.773,-677.357))z255..hide(z256=(306,-662.743))z256
+ ..controls hide(z257=(304.563,-662.895))z257 and hide(z258=(303.878,-662.895))z258..hide(z259=(302.92,-662.895))z259
+ ..controls hide(z260=(301.936,-662.895))z260 and hide(z261=(301.179,-662.895))z261..hide(z262=(299.513,-662.743))z262
+ ..controls hide(z263=(299.892,-671.451))z263 and hide(z264=(299.968,-674.934))z264..hide(z265=(300.271,-688.942))z265
+ --hide(z266=(285.656,-675.161))z266..controls hide(z267=(277.857,-667.816))z267 and hide(z268=(273.693,-666))z268..hide(z269=(268.014,-666))z269
+ ..controls hide(z270=(259.306,-666))z270 and hide(z271=(254,-671.733))z271..hide(z272=(254,-681.068))z272
+ ..controls hide(z273=(254,-686.52))z273 and hide(z274=(255.495,-690.23))z274..hide(z275=(259.23,-693.94))z275
+ --hide(z276=(269.528,-695.227))z276--hide(z277=(269.528,-693.031))z277--hide(z278=(266.045,-692.047))z278
+ ..controls hide(z279=(261.653,-690.836))z279 and hide(z280=(260,-688.11))z280..hide(z281=(260,-683.037))z281
+ ..controls hide(z282=(260,-676.525))z282 and hide(z283=(263.996,-672))z283..hide(z284=(270.285,-672))z284
+ ..controls hide(z285=(275.964,-672))z285 and hide(z286=(281.567,-675.278))z286..cycle;
+ %draw PreeditedPath6;
+%drawoptions( withcolor black );
+ %dotlabels.rt(249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286);
+PreeditedPath7 = hide(z287=(330.015,-635.015))z287..controls hide(z288=(330.912,-637.705))z288 and hide(z289=(331.51,-639.499))z289..hide(z290=(333.004,-644.779))z290
+ ..controls hide(z291=(340.576,-645.477))z291 and hide(z292=(347.052,-647.967))z292..hide(z293=(356.616,-653.746))z293
+ --hide(z294=(357.712,-652.351))z294--hide(z295=(355.819,-648.266))z295..controls hide(z296=(345.358,-640.196))z296 and hide(z297=(339.082,-636.41))z297..cycle;
+ %draw PreeditedPath7;
+%drawoptions( withcolor black );
+ %dotlabels.rt(287,288,289,290,291,292,293,294,295,296,297);
+PreeditedPath8 = hide(z298=(270.736,-591))z298--hide(z299=(269.938,-591.477))z299..controls hide(z300=(271.632,-595.861))z300 and hide(z301=(272.429,-599.149))z301..hide(z302=(273.625,-607.02))z302
+ --hide(z303=(276.414,-607.02))z303--hide(z304=(276.414,-601.44))z304..controls hide(z305=(276.414,-599.647))z305 and hide(z306=(277.51,-599))z306..hide(z307=(280.499,-599))z307
+ --hide(z308=(327.026,-599))z308..controls hide(z309=(333.203,-599))z309 and hide(z310=(335.893,-599.093))z310..hide(z311=(342.867,-599.746))z311
+ --hide(z312=(343.465,-598.152))z312--hide(z313=(339.879,-594.167))z313..controls hide(z314=(342.469,-590.182))z314 and hide(z315=(343.196,-586.595))z315..hide(z316=(343.196,-581.315))z316
+ ..controls hide(z317=(343.196,-577.43))z317 and hide(z318=(342.584,-574.839))z318..hide(z319=(341.273,-572.747))z319
+ --hide(z320=(334.1,-562.784))z320..controls hide(z321=(330.912,-558.4))z321 and hide(z322=(322.643,-555))z322..hide(z323=(315.37,-555))z323
+ ..controls hide(z324=(303.812,-555))z324 and hide(z325=(296,-562.436))z325..hide(z326=(296,-572.946))z326
+ ..controls hide(z327=(296,-577.629))z327 and hide(z328=(297.606,-582.511))z328..hide(z329=(299.927,-585.101))z329
+ --hide(z330=(305.506,-591))z330--hide(z331=(306.602,-587.99))z331..controls hide(z332=(303.713,-585.201))z332 and hide(z333=(302,-581.315))z333..hide(z334=(302,-577.231))z334
+ ..controls hide(z335=(302,-568.862))z335 and hide(z336=(308.782,-563))z336..hide(z337=(319.455,-563))z337
+ ..controls hide(z338=(330.613,-563))z338 and hide(z339=(338.196,-569.219))z339..hide(z340=(338.196,-578.028))z340
+ ..controls hide(z341=(338.196,-583.208))z341 and hide(z342=(335.119,-591.001))z342..hide(z343=(333.004,-591.001))z343
+ --hide(z344=(311.584,-591))z344..controls hide(z345=(310.189,-591))z345 and hide(z346=(308.396,-589.843))z346..hide(z347=(306.602,-587.99))z347
+ --hide(z348=(305.506,-591))z348--cycle;
+PreeditedPath9 = hide(z349=(276.414,-548.138))z349--hide(z350=(276.414,-542.559))z350..controls hide(z351=(276.414,-540.765))z351 and hide(z352=(277.51,-540))z352..hide(z353=(280.499,-540))z353
+ --hide(z354=(332.108,-540))z354..controls hide(z355=(338.384,-540))z355 and hide(z356=(339.082,-540.304))z356..hide(z357=(339.281,-543.754))z357
+ --hide(z358=(339.58,-548.337))z358--hide(z359=(342.569,-548.337))z359..controls hide(z360=(342.27,-538.374))z360 and hide(z361=(342,-538.374))z361..hide(z362=(342,-535.884))z362
+ ..controls hide(z363=(342,-533.393))z363 and hide(z364=(341.701,-533.393))z364..hide(z365=(342,-523.43))z365
+ --hide(z366=(339.58,-523.43))z366--hide(z367=(339.281,-528.013))z367..controls hide(z368=(339.082,-531.4))z368 and hide(z369=(338.384,-532))z369..hide(z370=(332.108,-532))z370
+ --hide(z371=(270.736,-532))z371--hide(z372=(269.938,-532.596))z372..controls hide(z373=(271.632,-536.98))z373 and hide(z374=(272.429,-540.268))z374..cycle;
+ %draw PreeditedPath9;
+%drawoptions( withcolor black );
+ %dotlabels.rt(349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374);
+PreeditedPath10 = hide(z375=(291.607,-505.359))z375--hide(z376=(291.607,-501.374))z376--hide(z377=(282.641,-487.027))z377
+ ..controls hide(z378=(280.548,-483.739))z378 and hide(z379=(279.751,-483.042))z379..hide(z380=(277.958,-483.042))z380
+ ..controls hide(z381=(276.065,-483.042))z381 and hide(z382=(274.57,-484.436))z382..hide(z383=(274.57,-486.13))z383
+ ..controls hide(z384=(274.57,-487.624))z384 and hide(z385=(275.666,-489.418))z385..cycle;
+ %draw PreeditedPath10;
+%drawoptions( withcolor black );
+ %dotlabels.rt(375,376,377,378,379,380,381,382,383,384,385);
+PreeditedPath11 = hide(z386=(334.1,-489))z386--hide(z387=(342.569,-489.668))z387..controls hide(z388=(342.27,-483.192))z388 and hide(z389=(342,-483.192))z389..hide(z390=(342,-481.897))z390
+ ..controls hide(z391=(342,-481.399))z391 and hide(z392=(341.621,-478.908))z392..hide(z393=(342,-474.524))z393
+ --hide(z394=(339,-474.524))z394--hide(z395=(339.38,-478.41))z395..controls hide(z396=(339.281,-480.801))z396 and hide(z397=(338.484,-481))z397..hide(z398=(333.602,-481))z398
+ --hide(z399=(315.37,-481))z399..controls hide(z400=(300.824,-481))z400 and hide(z401=(296,-485.238))z401..hide(z402=(296,-496.941))z402
+ ..controls hide(z403=(296,-501.225))z403 and hide(z404=(296.948,-505.21))z404..hide(z405=(298.931,-508.996))z405
+ --hide(z406=(302.119,-514.015))z406--hide(z407=(308.595,-514.015))z407--hide(z408=(309.292,-511.686))z408
+ --hide(z409=(306.204,-510.391))z409..controls hide(z410=(301.521,-508.299))z410 and hide(z411=(301,-507.302))z411..hide(z412=(301,-502.719))z412
+ ..controls hide(z413=(301,-493.354))z413 and hide(z414=(304.635,-489.469))z414..hide(z415=(313.576,-489.17))z415
+ --hide(z416=(316.765,-488.999))z416--hide(z417=(329.916,-489))z417..controls hide(z418=(334.001,-491.926))z418 and hide(z419=(337.196,-498.285))z419..hide(z420=(337.196,-502.221))z420
+ ..controls hide(z421=(337.196,-506.206))z421 and hide(z422=(333.783,-510))z422..hide(z423=(329.816,-510))z423
+ ..controls hide(z424=(326.13,-510))z424 and hide(z425=(322.643,-507.884))z425..hide(z426=(320.75,-504.711))z426
+ ..controls hide(z427=(319.255,-502.193))z427 and hide(z428=(317.861,-496.654))z428..hide(z429=(316.765,-488.999))z429
+ --hide(z430=(313.576,-489.17))z430--hide(z431=(315.37,-499.033))z431..controls hide(z432=(317.861,-512.583))z432 and hide(z433=(322.543,-518))z433..hide(z434=(331.211,-518))z434
+ ..controls hide(z435=(338.982,-518))z435 and hide(z436=(343.196,-513.415))z436..hide(z437=(343.196,-505.708))z437
+ ..controls hide(z438=(343.196,-503.915))z438 and hide(z439=(342.998,-502.221))z439..cycle;
+ %draw PreeditedPath11;
+%drawoptions( withcolor black );
+ %dotlabels.rt(386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439);
+PreeditedPath12 = hide(z440=(321,-443.539))z440--hide(z441=(314.174,-440.55))z441--hide(z442=(314,-441.048))z442
+ --hide(z443=(314,-467.251))z443--hide(z444=(320.351,-469.941))z444--cycle;
+ %draw PreeditedPath12;
+%drawoptions( withcolor black );
+ %dotlabels.rt(440,441,442,443,444);
+PreeditedPath13 = hide(z445=(270.736,-424))z445--hide(z446=(269.938,-424.41))z446..controls hide(z447=(271.632,-428.794))z447 and hide(z448=(272.429,-432.082))z448..hide(z449=(273.625,-439.953))z449
+ --hide(z450=(276.414,-439.953))z450--hide(z451=(276.414,-434.374))z451..controls hide(z452=(276.414,-432.58))z452 and hide(z453=(277.51,-432))z453..hide(z454=(280.499,-432))z454
+ --hide(z455=(327.026,-432))z455..controls hide(z456=(333.203,-432))z456 and hide(z457=(335.893,-432.085))z457..hide(z458=(342.867,-432.68))z458
+ --hide(z459=(343.465,-431.086))z459--hide(z460=(339.879,-427.101))z460..controls hide(z461=(342.469,-423.115))z461 and hide(z462=(343.196,-419.529))z462..hide(z463=(343.196,-414.249))z463
+ ..controls hide(z464=(343.196,-410.363))z464 and hide(z465=(342.584,-407.773))z465..hide(z466=(341.273,-405.68))z466
+ --hide(z467=(334.1,-395.718))z467..controls hide(z468=(330.912,-391.334))z468 and hide(z469=(322.643,-388))z469..hide(z470=(315.37,-388))z470
+ ..controls hide(z471=(303.812,-388))z471 and hide(z472=(296,-395.409))z472..hide(z473=(296,-405.88))z473
+ ..controls hide(z474=(296,-410.562))z474 and hide(z475=(297.606,-415.444))z475..hide(z476=(299.927,-418.034))z476
+ --hide(z477=(305.506,-424))z477--hide(z478=(306.602,-420.924))z478..controls hide(z479=(303.713,-418.134))z479 and hide(z480=(302,-414.249))z480..hide(z481=(302,-410.164))z481
+ ..controls hide(z482=(302,-401.795))z482 and hide(z483=(308.782,-396))z483..hide(z484=(319.455,-396))z484
+ ..controls hide(z485=(330.613,-396))z485 and hide(z486=(338.196,-402.191))z486..hide(z487=(338.196,-410.961))z487
+ ..controls hide(z488=(338.196,-416.142))z488 and hide(z489=(335.119,-424.001))z489..hide(z490=(333.004,-424.001))z490
+ --hide(z491=(311.584,-424))z491..controls hide(z492=(310.189,-424))z492 and hide(z493=(308.396,-422.817))z493..hide(z494=(306.602,-420.924))z494
+ --hide(z495=(305.506,-424))z495--cycle;
+PreeditedPath14 = hide(z496=(276.414,-381.072))z496--hide(z497=(276.414,-375.492))z497..controls hide(z498=(276.414,-373.699))z498 and hide(z499=(277.51,-373))z499..hide(z500=(280.499,-373))z500
+ --hide(z501=(332.108,-373))z501..controls hide(z502=(338.384,-373))z502 and hide(z503=(339.082,-373.298))z503..hide(z504=(339.281,-376.688))z504
+ --hide(z505=(339.58,-381.271))z505--hide(z506=(342.569,-381.271))z506..controls hide(z507=(342.27,-371.308))z507 and hide(z508=(342,-371.308))z508..hide(z509=(342,-368.817))z509
+ ..controls hide(z510=(342,-366.326))z510 and hide(z511=(341.701,-366.326))z511..hide(z512=(342,-356.363))z512
+ --hide(z513=(339.58,-356.363))z513--hide(z514=(339.281,-360.946))z514..controls hide(z515=(339.082,-364.334))z515 and hide(z516=(338.384,-365))z516..hide(z517=(332.108,-365))z517
+ --hide(z518=(270.736,-365))z518--hide(z519=(269.938,-365.529))z519..controls hide(z520=(271.632,-369.913))z520 and hide(z521=(272.429,-373.201))z521..cycle;
+ %draw PreeditedPath14;
+%drawoptions( withcolor black );
+ %dotlabels.rt(496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521);
+PreeditedPath15 = hide(z522=(291.607,-338.289))z522--hide(z523=(291.607,-334.304))z523--hide(z524=(282.641,-319.957))z524
+ ..controls hide(z525=(280.548,-316.669))z525 and hide(z526=(279.751,-315.972))z526..hide(z527=(277.958,-315.972))z527
+ ..controls hide(z528=(276.065,-315.972))z528 and hide(z529=(274.57,-317.366))z529..hide(z530=(274.57,-319.06))z530
+ ..controls hide(z531=(274.57,-320.554))z531 and hide(z532=(275.666,-322.348))z532..cycle;
+ %draw PreeditedPath15;
+%drawoptions( withcolor black );
+ %dotlabels.rt(522,523,524,525,526,527,528,529,530,531,532);
+PreeditedPath16 = hide(z533=(334.1,-322))z533--hide(z534=(342.569,-322.598))z534..controls hide(z535=(342.27,-316.122))z535 and hide(z536=(342,-316.122))z536..hide(z537=(342,-314.827))z537
+ ..controls hide(z538=(342,-314.329))z538 and hide(z539=(341.621,-311.838))z539..hide(z540=(342,-307.454))z540
+ --hide(z541=(339,-307.454))z541--hide(z542=(339.38,-311.34))z542..controls hide(z543=(339.281,-313.731))z543 and hide(z544=(338.484,-314))z544..hide(z545=(333.602,-314))z545
+ --hide(z546=(315.37,-314))z546..controls hide(z547=(300.824,-314))z547 and hide(z548=(296,-318.219))z548..hide(z549=(296,-329.871))z549
+ ..controls hide(z550=(296,-334.155))z550 and hide(z551=(296.948,-338.14))z551..hide(z552=(298.931,-341.926))z552
+ --hide(z553=(302.119,-347.015))z553--hide(z554=(308.595,-347.015))z554--hide(z555=(309.292,-344.616))z555
+ --hide(z556=(306.204,-343.321))z556..controls hide(z557=(301.521,-341.229))z557 and hide(z558=(301,-340.232))z558..hide(z559=(301,-335.649))z559
+ ..controls hide(z560=(301,-326.284))z560 and hide(z561=(304.635,-322.399))z561..hide(z562=(313.576,-322.1))z562
+ --hide(z563=(316.765,-321.999))z563--hide(z564=(329.916,-322))z564..controls hide(z565=(334.001,-324.911))z565 and hide(z566=(337.196,-331.235))z566..hide(z567=(337.196,-335.151))z567
+ ..controls hide(z568=(337.196,-339.136))z568 and hide(z569=(333.783,-343))z569..hide(z570=(329.816,-343))z570
+ ..controls hide(z571=(326.13,-343))z571 and hide(z572=(322.643,-340.856))z572..hide(z573=(320.75,-337.641))z573
+ ..controls hide(z574=(319.255,-335.135))z574 and hide(z575=(317.861,-329.619))z575..hide(z576=(316.765,-321.999))z576
+ --hide(z577=(313.576,-322.1))z577--hide(z578=(315.37,-331.963))z578..controls hide(z579=(317.861,-345.513))z579 and hide(z580=(322.543,-351))z580..hide(z581=(331.211,-351))z581
+ ..controls hide(z582=(338.982,-351))z582 and hide(z583=(343.196,-346.389))z583..hide(z584=(343.196,-338.638))z584
+ ..controls hide(z585=(343.196,-336.845))z585 and hide(z586=(342.998,-335.151))z586..cycle;
+ %draw PreeditedPath16;
+%drawoptions( withcolor black );
+ %dotlabels.rt(533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586);
+PreeditedPath17 = hide(z587=(331.211,-292.211))z587..controls hide(z588=(331.211,-295.2))z588 and hide(z589=(334,-297.89))z589..hide(z590=(336.99,-297.89))z590
+ ..controls hide(z591=(339.979,-297.89))z591 and hide(z592=(342,-295.2))z592..hide(z593=(342,-292.311))z593
+ ..controls hide(z594=(342,-289.123))z594 and hide(z595=(339.668,-286.333))z595..hide(z596=(336.99,-286.333))z596
+ ..controls hide(z597=(334,-286.333))z597 and hide(z598=(331.211,-289.122))z598..cycle;
+ %draw PreeditedPath17;
+%drawoptions( withcolor black );
+ %dotlabels.rt(587,588,589,590,591,592,593,594,595,596,597,598);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% second featpost part
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ verygoodcone(true, black, blue, rmax, (0,0,zmax) );
+ numeric k;
+ drawoptions( withcolor blue );
+ for k = 1 upto 17:
+ fill closedpathinspace( PreeditedPath[k], 4, converterfunc );
+ endfor;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% That's it!
+
+endfig;
+end
+
+
+
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/electricpotential.mp b/graphics/metapost/contrib/macros/featpost/example/electricpotential.mp
new file mode 100644
index 0000000000..1bf47c2e01
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/electricpotential.mp
@@ -0,0 +1,153 @@
+% electricpotential.mp
+% L. Nobre G.
+% 2004
+% PAY ATTENTION: THESE FIGURES ARE INDEPENDANT. CONDUCTOR SURFACE POTENTIAL
+% CHANGES UNDER THE INFLUENCE OF EXTERNAL CHARGES.
+
+input featpost3Dplus2D;
+
+f := 16*(4,1,1);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+ActuC := 2;
+
+numeric potlim, cac, cbc, ccc, cdc;
+potlim = 2;
+cac = 2;
+cbc = -2;
+ccc = 4;
+cdc = 1.5;
+pair cap, cbp, ccp;
+cap = (-2,-4);
+ccp = (-2,4);
+cbp = (2,0);
+numeric np, ssize;
+np = 56;
+ssize = 18;
+
+def zi( expr xc, yc ) =
+ 0
+enddef;
+
+def za( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-cap );
+ if abs(dist) < 0.005:
+ if cac<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = cac/dist;
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zb( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-cbp );
+ if abs(dist) < 0.005:
+ if cbc<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = cbc/dist + za( xc, yc );
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zc( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out;
+ dist = abs( (xc,yc)-ccp );
+ if abs(dist) < 0.005:
+ if ccc<0:
+ out = -potlim;
+ else:
+ out = potlim;
+ fi;
+ else:
+ out = ccc/dist + zb( xc, yc );
+ fi;
+ if out > potlim:
+ out := potlim;
+ elseif out < -potlim:
+ out := -potlim;
+ fi;
+ (out)
+ endgroup
+enddef;
+
+def zd( expr xc, yc ) =
+ begingroup
+ save out;
+ numeric dist, out, i, tmp;
+ pair poi;
+ tmp = 0;
+ for i=0 upto np:
+ poi := (i/np)[cap,ccp];
+ dist := abs( (xc,yc)-poi );
+ if abs(dist) < 0.005:
+ if cdc<0:
+ out := -potlim;
+ else:
+ out := potlim;
+ fi;
+ else:
+ out := cdc/dist/np;
+ fi;
+ tmp := tmp+out;
+ endfor;
+ tmp := tmp + zc( xc, yc );
+ if tmp > potlim:
+ tmp := potlim;
+ elseif tmp < -potlim:
+ tmp := -potlim;
+ fi;
+ (tmp)
+ endgroup
+enddef;
+
+beginfig(0);
+ hexagonaltrimesh( false, np, ssize, zi );
+endfig;
+
+beginfig(1);
+ hexagonaltrimesh( false, np, ssize, za );
+endfig;
+
+beginfig(2);
+ hexagonaltrimesh( false, np, ssize, zb );
+endfig;
+
+beginfig(3);
+ hexagonaltrimesh( false, np, ssize, zc );
+endfig;
+
+% Going into "MetaPost capacity exceeded!"
+%
+%beginfig(4);
+% hexagonaltrimesh( false, np, ssize, zd );
+%endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/electrospiral.mp b/graphics/metapost/contrib/macros/featpost/example/electrospiral.mp
new file mode 100644
index 0000000000..7ed2200e9f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/electrospiral.mp
@@ -0,0 +1,50 @@
+% electrospiral.mp
+% L. Nobre G.
+% 2004
+
+numeric turnstep;
+turnstep = 1cm;
+
+def spiral( expr Ang ) =
+ begingroup
+ numeric k, r;
+ k = turnstep/360.0;
+ r = k*Ang;
+ ( r*dir(Ang) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, angstep, actx, ray, corner, sider;
+ path spir, cutter;
+ pair thispos, sw, nw, ne, se, actpos;
+ angstep = 30;
+ ray = 0.7mm;
+ corner = 4.2;
+ sider = 10.5;
+ spir = origin..
+ for i=angstep step angstep until 4000-1:
+ spiral(i)..
+ endfor
+ spiral(4000);
+ draw spir;
+ actx = 1;
+ forever:
+ thispos := (turnstep*actx,0);
+ for i=1 upto actx:
+ actpos := thispos+ray*normaldeviate*dir(uniformdeviate(359));
+ draw actpos withpen pencircle scaled 1.5mm;
+ endfor;
+ actx := 2*actx;
+ exitif actx > 9;
+ endfor;
+ sw = turnstep*(-corner,-corner);
+ nw = turnstep*(-corner,corner);
+ ne = turnstep*(sider,corner);
+ se = turnstep*(sider,-corner);
+ cutter = sw--nw--ne--se--cycle;
+ clip currentpicture to cutter;
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/ellipticextrusionpress.mp b/graphics/metapost/contrib/macros/featpost/example/ellipticextrusionpress.mp
new file mode 100644
index 0000000000..ed2b4cbfdb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ellipticextrusionpress.mp
@@ -0,0 +1,31 @@
+% ellipticextrusionpress.mp
+% L. Nobre G.
+% 2011
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, a, b, i, j, n, angstep, halflen;
+ pair vec[];
+ u = 1cm;
+ a = 8u;
+ b = 2u;
+ n = 40;
+ angstep = 180/n;
+ halflen = a*0.5*3.14159;
+ draw (-halflen,u)--(halflen,u);
+ draw (-u,u)--(-u,0)--(u,0)--(u,u);
+ for i=0 upto n:
+ vec[i] = (a*sind(i*angstep),-b*cosd(i*angstep));
+ draw ((-halflen,a)+vec[i])
+ for j=1 upto n:
+ --((a*j*3.14159/n-halflen,a)+(vec[i] rotated (-j*angstep)))
+ endfor;
+ endfor;
+ draw ((0,a)+(vec[0] rotated (-90)))
+ for j=1 upto n:
+ ..((0,a)+(vec[j] rotated (-90)))
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/ellipticprism.mp b/graphics/metapost/contrib/macros/featpost/example/ellipticprism.mp
new file mode 100644
index 0000000000..cd24128e02
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ellipticprism.mp
@@ -0,0 +1,41 @@
+% ellipticprism.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (5,3,4);
+ numeric labscal;
+ picture labsa, labba, labsb, labd, labc;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labsa = btex $\vec{S}_1$ etex scaled labscal;
+ labsb = btex $\vec{S}_2$ etex scaled labscal;
+ labba = btex $\vec{B}_1$ etex scaled labscal;
+ labd= btex $D$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ whatisthis( black, 0.5red, green, 0.85, 0.8 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(0.85blue);
+ label.rt( labd, rp(0.4blue) );
+ drawarrow rp(black)--rp(0.5red);
+ label.ulft( labsa, rp(0.25red) );
+ drawarrow rp(black)--rp(green);
+ label.top( labba, rp((0,0.5,0)) );
+ drawarrow rp(0.85blue)--rp(0.8*0.5*red+0.85blue);
+ label.ulft( labsb, rp(0.2red+0.85blue) );
+ dotlabel.bot( labc, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/ellipticproperties.mp b/graphics/metapost/contrib/macros/featpost/example/ellipticproperties.mp
new file mode 100644
index 0000000000..48ee6905a2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ellipticproperties.mp
@@ -0,0 +1,45 @@
+% ellipticproperties.mp
+% L. Nobre G.
+% 2011
+
+prologues := 1;
+
+beginfig(1);
+ numeric b, k, kt, theta, i, ste, N, aux, cp, cm;
+ numeric gamma, gammb, alpha, rhoa, alphb, rhob, fx, fy;
+ pair X, Y, A, B, U, L;
+ path ell;
+ b = 35;
+ k = 0.85;
+ theta = 30;
+ ste = 10;
+ N = 5;
+ X = k*b*right;
+ Y = b*dir(90-theta);
+ ell = for i=ste step ste until 360: (X*cosd(i)+Y*sind(i)).. endfor cycle;
+ draw ell;
+ draw Y--origin--X;
+ alpha = 0.5*angle((k**2)-1,2*k*sind(theta));
+ alphb = 0.5*angle(1-(k**2),2*k*sind(-theta));
+ A = X*cosd(alpha)+Y*sind(alpha);
+ B = X*cosd(alphb)+Y*sind(alphb);
+ draw B--origin--A;
+ rhoa = abs(A);
+ gamma = angle(A);
+ rhob = abs(B);
+ gammb = angle(B);
+ kt = rhoa/rhob;
+ for i=1 upto N:
+ aux := rhoa+(i-0.5)*k*b;
+ fx := aux*cosd(gamma);
+ fy := aux*sind(-gamma);
+ cp := (rhob*fx/kt+fy*((fx/kt)++fy+-+rhob))/(((fx/kt)**2)+(fy**2));
+ cm := (rhob*fx/kt-fy*((fx/kt)++fy+-+rhob))/(((fx/kt)**2)+(fy**2));
+ U := A*cm-B*(1+-+cm);
+ L := A*cp+B*(1+-+cp);
+ draw U--L--(aux,0)--cycle withcolor blue;
+ draw 0.5[U,L];
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/elliptictable.mp b/graphics/metapost/contrib/macros/featpost/example/elliptictable.mp
new file mode 100644
index 0000000000..f1ac37c58d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/elliptictable.mp
@@ -0,0 +1,83 @@
+% elliptictable.mp
+% L. Nobre G.
+% 2006
+
+verbatimtex \documentclass{article} \begin{document} etex
+
+beginfig(1);
+ numeric u, l, mar, h, i, s, ai, bi, ao, bo, d;
+ u = 0.85mm;
+ l = 125u;
+ d = 0.5l;
+ mar = 12.0u;
+ h = 70u;
+ s = 5;
+ z1 = (l-2mar,0);
+ z2 = (l-mar,0);
+ z3 = (l,0);
+ z5 = (l-2mar,d-mar);
+ z6 = (l-2mar,d);
+ z7 = (l-mar,d);
+ z8 = (l,d);
+ z10= (l-2mar-h,d-mar);
+ z11= (l-2mar-h,d);
+ z12= (0,d);
+ z13= (0,d-mar);
+ ai = l-2mar;
+ bi = (d-mar)/(1+-+((l-2mar-h)/ai));
+ z14= (ai+-+bi,0);
+ ao = l-mar;
+ bo = d/(1+-+((l-2mar-h)/ao));
+ z15= (ao+-+bo,0);
+ path ellin, elout, cutpe, cutpb, bordo;
+ ellin = z1 for i=s step s until 90: ..(ai*cosd(i),bi*sind(i)) endfor;
+ elout = z2 for i=s step s until 90: ..(ao*cosd(i),bo*sind(i)) endfor;
+ cutpe = (1.1[z11,z10])--(1.1[z10,z11]);
+ cutpb = z1--z6;
+ bordo = elout cutafter cutpe cutbefore cutpb;
+ z4 = point 0 of bordo;
+ z9 = bordo intersectionpoint (z5--z13);
+ draw z3--z8--z6--z4;
+ draw z5--z9;
+ draw z2--z7;
+ draw ellin--z12--z11--(reverse bordo)--z1;
+ draw z6--z11--z10;
+ draw currentpicture xscaled -1;
+ pen pendot;
+ pendot = pencircle scaled 2u;
+ z22= (l,d-mar*ai/bi);
+ z23= (l-2mar,d-mar*ai/bi);
+% draw z22{up}..z7{left}..{down}z23;
+ z24= z7+down*mar;
+ draw z22--z24--z23;
+ drawoptions( dashed evenly );
+ z17 = (ai,bi)*sqrt(2.0)*0.5;
+ z18 = z17 - h*unitvector((bi,ai));
+ draw z17--z18;
+ z19 = (0,-y18-x18*bi/ai);
+ z20 = z19+whatever*(ai,-bi);
+ z20 = z17-whatever*(bi,ai);
+ z21 = z20-l*unitvector((ai,-bi));
+ draw z20--z21;
+ drawoptions();
+ draw z14 withpen pendot;
+ draw z15 withpen pendot;
+ draw z17 withpen pendot;
+% dotlabels.bot( 17, 18, 20, 21 );
+ picture tmppic;
+ tmppic = currentpicture;
+ currentpicture := nullpicture;
+ z16= (105mm,145mm);
+ draw tmppic rotated 90 shifted z16;
+ draw tmppic rotated -90 shifted z16;
+ label.rt( decimal((x14)/u), z14 rotated 90 shifted z16 );
+ label.lft( decimal((x15)/u), z15 rotated 90 shifted z16 );
+ label.rt( decimal((x17)/u), z17 rotated 90 shifted z16 );
+ tmppic := currentpicture;
+ currentpicture := nullpicture;
+ draw tmppic shifted (-z16) rotated (-90) shifted z16;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ellipticthing.mp b/graphics/metapost/contrib/macros/featpost/example/ellipticthing.mp
new file mode 100644
index 0000000000..d681c99fe4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ellipticthing.mp
@@ -0,0 +1,47 @@
+% ellipticthing.mp
+% L. Nobre G.
+% 2011
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, a, b, i, n, astep;
+ u = 1cm;
+ a = 5u;
+ b = 3u;
+ n = 24;
+ astep = 360/n;
+ path elli, arcb;
+ elli = (a,0) for i=1 upto (n-1):
+ ..(a*cosd(i*astep),b*sind(i*astep))
+ endfor ..cycle;
+ draw elli;
+ draw fullcircle scaled (2*b);
+ draw fullcircle scaled (a-b) shifted (0.5*(a+b),0);
+ draw fullcircle scaled (a-b) shifted (-0.5*(a+b),0);
+ pair refpoint, refslope, centerpo, focus;
+ refpoint = (a,b)/sqrt(2);
+ refslope = unitvector(b,a);
+ centerpo = refpoint + whatever*refslope;
+ xpart centerpo = 0;
+ draw centerpo--refpoint;
+ draw centerpo--(-xpart refpoint,ypart refpoint);
+ numeric len, ang, lenb, angb;
+ len = abs(refpoint-centerpo);
+ ang = angle(refpoint-centerpo);
+ draw refpoint for i=1 upto n:
+ ..(centerpo+len*dir(2*i*(90-ang)/n+ang))
+ endfor;
+ focus = (4u,0);
+ lenb = abs(focus-centerpo);
+ angb = angle(focus-centerpo);
+ arcb = focus for i=1 upto n:
+ ..(centerpo+lenb*dir(2*i*(90-angb)/n+angb))
+ endfor;
+ draw arcb;
+ draw arcb rotated 180;
+ draw centerpo--focus;
+ draw centerpo--(-xpart focus,ypart focus);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/embroncordada.mp b/graphics/metapost/contrib/macros/featpost/example/embroncordada.mp
new file mode 100644
index 0000000000..f154cf605e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/embroncordada.mp
@@ -0,0 +1,57 @@
+% embroncordada.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+%\usepackage{pandora}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture embroncordada;
+ numeric u, v;
+ path pa;
+ u = 1mm;
+ v = 1.1mm;
+ z1 = (105u,250v);
+ z2 = (105u,220v);
+ z3 = (125u,200v);
+ z4 = (85u,180v);
+ z5 = (25u,150v);
+ z6 = (105u,120v);
+ z7 = (185u,150v);
+ z8 = (110u,170v);
+ z9 = (45u,150v);
+ z10= (100u,105v);
+ z11= (170u,150v);
+ z12= (90u,195v);
+ z13= (35u,150v);
+ z14= (120u,135v);
+ z15= (80u,100v);
+ z16= (115u,75v);
+ z17= (105u,50v);
+ pa = z1{down}..z2..z3..z4..z5..z6..z7..z8..z9..z10..
+ z11..z12..z13..z14..z15..z16..{down}z17;
+ ropepattern( pa, 8u, 35 );
+ embroncordada = thelabel( btex
+ \begin{tabular}{c}
+ \textsf{EMBRON} \\
+ \textsf{CORDADA}
+ \end{tabular}
+ etex scaled 8, (105u,150v) );
+ draw embroncordada;
+% dotlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/emptylines.mp b/graphics/metapost/contrib/macros/featpost/example/emptylines.mp
new file mode 100644
index 0000000000..08154ad560
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/emptylines.mp
@@ -0,0 +1,28 @@
+% emptylines.mp
+% L. Nobre G.
+% 2001
+
+input featpost3Dplus2D;
+
+
+def closec( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 360;
+ par2 = 0.3;
+ param = 360*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred,cblu,1) )
+ endgroup
+enddef;
+
+f := (4,3,2);
+Spread := 170;
+ShadowOn := true;
+
+beginfig(1);
+ emptyline( true, 1, black, 0.5background, 360, 0.88, 2, closec );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/equilatrianglelines.mp b/graphics/metapost/contrib/macros/featpost/example/equilatrianglelines.mp
new file mode 100644
index 0000000000..c77731e971
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/equilatrianglelines.mp
@@ -0,0 +1,40 @@
+% equilatrianglelines.mp
+% L. Nobre G.
+% 2009
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, factordown, ang, angl, angh, ydown, xl, xh, astep;
+ pen pendot;
+ path uline, rline, dline;
+ pair auxp;
+ u = 2cm;
+ factordown = 2.34;
+ astep = 2.75;
+ xl = -2u;
+ xh = 10u;
+ angl = 7;
+ angh = 38;
+ pendot = pencircle scaled (2.5mm);
+ ydown = -u*factordown;
+ uline = (xl,u)--(xh,u);
+ rline = uline rotated (-60);
+ dline = (xl,ydown)--(xh,ydown);
+ draw uline;
+ draw (xl,0)--(xh,0);
+ draw dline;
+ draw rline;
+ z1 = rline intersectionpoint dline;
+ draw z1 withpen pendot;
+ draw origin withpen pendot;
+ for ang=angl step astep until angh:
+ pair uapex;
+ ypart uapex = u;
+ uapex = whatever*dir(ang);
+ auxp := uapex+abs(uapex)*dir(ang-120);
+ draw origin--uapex--auxp--cycle;
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/equilibriodetorques.mp b/graphics/metapost/contrib/macros/featpost/example/equilibriodetorques.mp
new file mode 100644
index 0000000000..84530ba329
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/equilibriodetorques.mp
@@ -0,0 +1,47 @@
+% equilibriodetorques.mp
+% L. Nobre G.
+% 2012
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ numeric u, longarm, smallarm, senodenom, senonumer, seno, ang, aux;
+ u = 5mm;
+ smallarm = 3u;
+ longarm = 5u;
+ senodenom = 10;
+ senonumer = 8;
+ seno = senonumer/senodenom;
+ ang = angle(1+-+seno,seno);
+ pen mainpen;
+ mainpen = pencircle scaled (0.15u);
+ path barpath, angpath, lenpath;
+ barpath = (longarm,0.25u)--(-smallarm,0.25u)--
+ (-smallarm,-0.25u)--(longarm,-0.25u)--cycle;
+ filldraw barpath withpen mainpen withcolor (0.5white);
+ drawarrow (-smallarm-u,0)--(longarm+u,0) dashed evenly;
+ drawarrow (0,-2u)--(0,3u) dashed evenly;
+ draw origin withpen mainpen;
+ pair a, b, fa, fb;
+ a = (-smallarm,0);
+ b = (longarm,0);
+ angpath = (halfcircle cutafter (origin--dir(ang))) scaled (2.5u) shifted a;
+ draw angpath;
+ fa = a+2.5u*dir(ang);
+ fb = b+up*abs(fa)*seno*smallarm/longarm;
+ drawarrow a--fa withpen mainpen;
+ drawarrow b--fb withpen mainpen;
+ aux = 0.45*(ypart fb);
+ lenpath = (0,aux)--(longarm,aux);
+ drawdblarrow lenpath;
+ label.rt(btex $\theta$ etex, point (0.5*(length angpath)) of angpath );
+ label.lft(btex $\vec{F}_1$ etex, fa);
+ label.rt(btex $\vec{F}_2$ etex, fb);
+ label.llft(btex $Y$ etex, (0,3u));
+ label.llft(btex $X$ etex, (longarm+u,0));
+ label.top(btex $r_2$ etex, point 0.5 of lenpath );
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/esteveslogo.mp b/graphics/metapost/contrib/macros/featpost/example/esteveslogo.mp
new file mode 100644
index 0000000000..3525e4fc05
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/esteveslogo.mp
@@ -0,0 +1,52 @@
+
+prologues:=1;
+
+numeric u;
+1u = 1mm;
+
+
+beginfig (1);
+
+ a = 40u;
+ g = 90;
+
+ z1 = right rotated g scaled a;
+ z2 = z1 rotated 120;
+ z3 = z1 rotated 240;
+
+ path c[];
+ c1 = fullcircle rotated g scaled 1/2a;
+ for k = 2 upto 4:
+ c[k] = c1 scaled k;
+ endfor
+
+ p = 2q;
+ p + q = 1/4a;
+ d = 2q;
+
+ path r[], s[], s[]';
+ for k = 1 upto 3:
+ r[k] = (0,0)--z[k];
+ s[k] = r[k] shifted (down scaled (p/2+d) rotated angle z[k]);
+ s[k]' = r[k] shifted (up scaled (p/2+d) rotated angle z[k]);
+ endfor
+
+ pen rpen, cpen;
+ cpen := pencircle scaled p;
+ rpen := pencircle scaled p;
+
+ pickup cpen;
+ filldraw c1 withcolor 0.75 red;
+
+ linecap := rounded;
+ draw c2 cutbefore s1' cutafter s1;
+ draw c3 cutbefore s1' cutafter s2;
+ draw c3 cutbefore s2' cutafter s1;
+ draw c4 cutbefore s1' cutafter s2;
+ draw c4 cutbefore s2' cutafter s3;
+ draw c4 cutbefore s3' cutafter s1;
+
+endfig;
+
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/experimental.mp b/graphics/metapost/contrib/macros/featpost/example/experimental.mp
new file mode 100644
index 0000000000..66bb9ad350
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/experimental.mp
@@ -0,0 +1,177 @@
+% experimental.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+%verbatimtex
+%\documentclass{article}
+%\usepackage{beton}
+%\usepackage{concmath}
+%\usepackage{ccfonts}
+%\begin{document}
+%etex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+f := (4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[];
+ color reflabpos, reflabpoi, lincolor;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang, stepang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ inclang = 150;
+ aberang = 17;
+ sampang = 30;
+ stepang = 20;
+ ul = 0.1;
+ labelscale = 5;
+ outermagpos = 30ul;
+ squside = outermagpos;
+ sqlevel = -20ul;
+ polesep = 15ul;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len4 = 20ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+ lincolor = 0.5background;
+
+ reflabpos = ( -squside, 0, -sqlevel );
+ reflabpoi = ( -squside, squside, -sqlevel );
+ V1 := (squside,squside,sqlevel);
+ V2 := (-squside,squside,sqlevel);
+ V3 := (-squside,-squside,sqlevel);
+ V4 := (squside,-squside,sqlevel);
+% makeface1(1,2,3,4);
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) );
+
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ tmpath := goodcirclepath( pos2, (1,0,0), ray1 );
+ aupath := goodcirclepath( (-ray5-polesep,0,0), (1,0,0), ray2 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+ lab2 = reflabpos;
+ txt2 = thelabel.top( btex magneto etex scaled labelscale, rp( lab2 ) );
+ draw txt2;
+ fix2 = (-outermagpos+0.5len1,0,ray1);
+ draw llcorner txt2--lrcorner txt2--rp(fix2) withcolor lincolor;
+
+ axe3 = ( 0, cosd( inclang ), sind( inclang ) );
+ pos3 = -( len3 + len4 + len5 )*axe3;
+ rigorousdisc( 0, true, pos3, ray3, len3*axe3 );
+ lab3 = (1-fracone)*reflabpoi+fracone*V1;
+ txt3 = thelabel.rt( btex rotor etex scaled labelscale, rp( lab3 ) );
+ draw txt3;
+
+ axe4 = axe3;
+ pos4 = -( len4 + len5 )*axe4;
+ rigorousdisc( 0, true, pos4, ray4, len4*axe4 );
+
+ fix3 = pos4+fracsam*ray3*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ draw lrcorner txt3--llcorner txt3--rp(fix3) withcolor lincolor;
+
+ axe5 = axe3;
+ pos5 = -( len5 )*axe5;
+ rigorousdisc( 0, true, pos5, ray5, len5*axe5 );
+ lab5 = (1-fracone)*reflabpoi+fracone*V2;
+ txt5 = thelabel.rt( btex porta-amostras etex scaled labelscale, rp( lab5 ) );
+ draw txt5;
+ fix5 = fracsam*ray5*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ draw lrcorner txt5--llcorner txt5--rp(fix5) withcolor lincolor;
+
+ V5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ V7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ draw rp(V5)--rp(V6)--rp(V7)--rp(V8)--cycle;
+
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt;
+ rigorousdisc( 0, true, pos6, ray6, len6*axe6 );
+ lab6 = fracone*reflabpos+(1-fracone)*V3;
+ txt6 = thelabel.lft( btex telemicrosc\'{o}pio etex scaled labelscale, rp( lab6 ) );
+ draw txt6;
+ fix6 = pos6+len6*axe6;
+ draw llcorner txt6--lrcorner txt6--rp(fix6) withcolor lincolor;
+
+ pos8 = pos7+len7*axe7;
+ tmpath := goodcirclepath( pos7, axe7, ray7 );
+ aupath := goodcirclepath( pos8, axe7, ray8 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ axe8 = axe7;
+ rigorousdisc( 0, true, pos8, ray8, len8*axe8 );
+ lab8 = (1-fracone)*reflabpos+fracone*V3;
+ txt8 = thelabel.lft( btex l\^{a}mpada etex scaled labelscale, rp( lab8 ) );
+ draw txt8;
+ fix8 = pos8+len8*axe8;
+ draw llcorner txt8--lrcorner txt8--rp(fix8) withcolor lincolor;
+
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ tmpath := goodcirclepath( pos9, (1,0,0), ray9 );
+ pos10 = pos9+len9*(1,0,0);
+ aupath := goodcirclepath( pos10, (1,0,0), ray10 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ len10 = len1;
+ rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) );
+
+ produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/experimental2Dsetup.mp b/graphics/metapost/contrib/macros/featpost/example/experimental2Dsetup.mp
new file mode 100644
index 0000000000..d922453286
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/experimental2Dsetup.mp
@@ -0,0 +1,175 @@
+% experimental2Dsetup.mp
+% L. Nobre G.
+% 2002
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+% linecap := squared;
+
+ numeric salto, shif, rotang, cfac, posang;
+ numeric innerray, outerray, midleray, thebiray, otherray;
+ numeric midmidcir, midotharc, lblfac, wavecray, midwavarc;
+ path loricir, roricir, baserec, sampleh, wavecarc;
+ path innercirc, outercirc, midlecirc, otherarch;
+ path oridirh, oridirn, oridirp, oridirv, oridire;
+ path dirhoriz, dirnegat, dirposit, dirverti, direff;
+ path lowcut, higcut, glassre, wavecarch, field;
+ pair midmidcirpos, midotharcpos, midwavarcpos, mideffcirpos;
+ pen thickpen;
+ color samplecolor, magnetcolor, samplebordercolor;
+ picture lblpiplu, lblalpha, lblwavec, lblqu, lblno, lblfield;
+ numeric hei, wid, thi, pro, pol, mar;
+ path themagnet, effcirc, diry, oridiry;
+ numeric circleray, squareray, glasssize, effang, effraya, effrayb;
+ picture lblx, lbly, lbleff;
+ numeric mideffcir, yray;
+ pair lastoridire;
+
+ pickup pencircle scaled 0.15mm;
+ thickpen = pencircle scaled 1.7bp;
+
+ samplecolor = 0.88white;
+ magnetcolor = 0.37white;
+ samplebordercolor = 0.1white;
+% samplecolor = (0.85,0.9,0.8);
+% magnetcolor = (0.2,0.27,0.58);
+% samplebordercolor = blue;
+ salto = 1mm;
+ rotang = 7;
+ posang = -28;
+ effang = -20;
+ shif = 50salto;
+ thi = 5salto;
+ pol = 25salto;
+ pro = 8salto;
+ wid = 58salto;
+ cfac = 0.5;
+ lblfac = 1.5;
+ innerray = 27salto;
+ circleray = 0.93innerray;
+ squareray = 0.93circleray;
+ glasssize = 0.42squareray;
+ outerray = 60salto;
+ midleray = 55salto;
+ yray = 53salto;
+ thebiray = 145salto;
+ otherray = 115salto;
+ wavecray = 0.5*(thebiray+otherray);
+ effraya = 0.45*(midleray+otherray);
+ effrayb = 0.56*(midleray+otherray);
+ innercirc = fullcircle scaled innerray;
+ outercirc = fullcircle scaled outerray;
+ midlecirc = (halfcircle cutbefore (origin--dir(90+posang)))
+ scaled midleray;
+ midmidcir = 0.5*length midlecirc;
+ midmidcirpos = point midmidcir of midlecirc;
+ effcirc = ((halfcircle cutbefore (origin--dir(90+effang)))
+ cutafter (origin--up))
+ scaled effraya;
+ mideffcir = 0.5*length effcirc;
+ mideffcirpos = point mideffcir of effcirc;
+ otherarch = ((halfcircle cutbefore (origin--dir(90+posang)))
+ cutafter (origin--up))
+ scaled otherray;
+ midotharc = 0.5*length otherarch;
+ midotharcpos = point midotharc of otherarch;
+ wavecarch = ((halfcircle cutafter (origin--dir(90+rotang)))
+ cutbefore (origin--up))
+ scaled wavecray;
+ midwavarc = 0.5*length wavecarch;
+ midwavarcpos = point midwavarc of wavecarch;
+ oridirh = origin--0.5*outerray*left;
+ oridirv = origin--0.5*thebiray*up;
+ oridirn = origin--0.5*thebiray*dir(90+rotang);
+ oridirp = origin--0.5*wavecray*dir(90+posang);
+ oridiry = origin--0.5*yray*dir(180+posang);
+ lastoridire = 0.5*effrayb*dir(90+effang);
+ oridire = origin--lastoridire;
+ dirhoriz = oridirh cutbefore innercirc;
+ dirverti = oridirv cutbefore innercirc;
+ dirnegat = oridirn cutbefore innercirc;
+ dirposit = oridirp cutbefore innercirc;
+ direff = oridire cutbefore innercirc;
+ diry = oridiry cutbefore innercirc;
+ field = (0.5innerray,0)--(0.5wid-salto,0);
+ loricir = halfcircle scaled circleray rotated 90;
+ roricir = halfcircle scaled circleray rotated 270;
+ baserec = (unitsquare shifted (-0.5*(1,1)))
+ xscaled 2
+ scaled squareray;
+ glassre = (unitsquare shifted (-0.5*(1,1)))
+ yscaled (13.0/6.0)
+ scaled glasssize;
+ lowcut = subpath (0,1) of baserec;
+ higcut = subpath (2,3) of baserec;
+ sampleh = buildcycle( higcut, loricir, reverse lowcut, roricir );
+ draw glassre rotated 90 dashed evenly withcolor (cfac*white);
+% draw glassre rotated rotang dashed evenly withcolor (cfac*(white-blue));
+ fill glassre rotated posang withcolor samplecolor;
+ draw glassre rotated posang withcolor samplebordercolor;
+ draw sampleh rotated posang withpen thickpen withcolor blue;
+ drawarrow reverse midlecirc;
+ drawarrow reverse otherarch;
+ drawarrow wavecarch;
+ drawarrow reverse effcirc;
+ draw dirhoriz dashed evenly scaled 2;
+ draw dirverti dashed evenly scaled 2;
+ drawarrow dirnegat withpen thickpen;
+ drawarrow dirposit withpen thickpen;
+ drawarrow direff withpen thickpen;
+ drawarrow reverse field withpen thickpen;
+ drawarrow direff withpen thickpen;
+ drawarrow diry withpen thickpen;
+ lblpiplu = btex $\alpha = \frac{\pi}{2}+\beta$ etex scaled lblfac;
+ lblalpha = btex $\beta$ etex scaled lblfac;
+ lblwavec = btex $\Psi$ etex scaled lblfac;
+ lblqu = btex $\vec{q}\,$ etex scaled lblfac;
+ lblno = btex $\vec{n}_0$ etex scaled lblfac;
+ lblfield = btex $\vec{B}$ etex scaled lblfac;
+ lblx = btex $x$ etex scaled lblfac;
+ lbly = btex $y$ etex scaled lblfac;
+ lbleff = btex $\beta_{\mbox{\small eff}}$ etex scaled lblfac;
+ label.ulft( lblpiplu, midmidcirpos );
+ label.top( lblalpha, midotharcpos );
+ label.top( lblwavec, midwavarcpos );
+ label.llft( lblqu, point 0.7 of dirnegat );
+ label.lrt( lblx, point 0.7 of dirposit );
+ label.top( lblfield, point 0.5 of field );
+ label.llft( lbly, point 0.5 of diry );
+ label.top( lbleff, mideffcirpos );
+ label.top( lblno, lastoridire );
+ hei = pol+4thi;
+ mar = (hei-2*thi-pol)*0.5;
+ z100 = (pro,mar);
+ z0 = (wid,pol)*0.5;
+ z1 = z0 + z100;
+ z2 = z1 + (thi,0);
+ z3 = (xpart z2, pol*0.5+mar-hei);
+ z4 = (-xpart z2, ypart z3);
+ z5 = (-xpart z2, ypart z2);
+ z6 = (-xpart z1, ypart z1);
+ z7 = (-xpart z0, ypart z0);
+ z8 = (xpart z7, -pol*0.5);
+ z9 = z8 - z100;
+ z10 = z9 - (0,thi);
+ z11= (xpart z1, ypart z10);
+ z12= z11+ (0,thi);
+ z13= (xpart z0, -ypart z0);
+ themagnet = z0--z1--z2--z3--z4--z5--z6--z7--
+ z8--z9--z10--z11--z12--z13--cycle;
+ fill themagnet withcolor magnetcolor;
+ draw themagnet withpen thickpen;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/f1aula03.mp b/graphics/metapost/contrib/macros/featpost/example/f1aula03.mp
new file mode 100644
index 0000000000..2b82f4af23
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/f1aula03.mp
@@ -0,0 +1,104 @@
+% f1aula03.mp
+% L. Nobre G.
+% 2010 removed package icomma
+
+verbatimtex
+\documentclass{beamer}
+\usepackage{amsmath,amssymb}
+\usepackage[squaren]{SIunits}
+\usepackage[latin1]{inputenc}
+\usepackage[portuges]{babel}
+\newcommand{\veri}{\ensuremath{\hat{\text{i}}}}
+\newcommand{\verj}{\ensuremath{\hat{\text{j}}}}
+\newcommand{\verk}{\ensuremath{\hat{\text{k}}}}
+\newcommand{\veru}{\ensuremath{\hat{\text{u}}}}
+\newcommand{\emf}{\ensuremath{\mathcal{E}}}
+\newcommand{\vecnorm}[1]{\left|\left|\vec{#1}\right|\right|}
+\renewcommand{\arraystretch}{1.45}
+\begin{document}
+\frame{
+etex
+
+ahangle := 36;
+ahlength := 3.5mm;
+labeloffset := 3.5mm;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {} []
+beginfig(1);
+ pen basepen, vecpen;
+ basepen = pencircle scaled 0.5mm;
+ vecpen = pencircle scaled 1.15mm;
+ path mainaxe;
+ numeric malen, mastep, matic, lscale;
+ malen = 10cm;
+ mastep = 5mm;
+ matic = 2mm;
+ lscale = 2.5;
+ mainaxe = origin--(malen,0);
+ drawarrow mainaxe withpen basepen;
+ label.bot( btex $x$ etex scaled lscale, (malen,0) );
+ pair refpa, refpb, refpc;
+ refpa = (6mastep,0);
+ refpb = (12mastep,0);
+ refpc = (14mastep,0);
+ drawarrow refpb--refpa withpen vecpen withcolor red;
+ label.top( btex $\vec{v}$ etex scaled lscale, 0.5[refpa,refpb] );
+ drawarrow refpb--refpc withpen vecpen withcolor blue;
+ label.top( btex \veri etex scaled lscale, 0.5[refpc,refpb] );
+ numeric i;
+ for i=mastep step 2mastep until malen-2mastep:
+ draw (i,-0.5matic)--(i,0.5matic) withpen basepen;
+ draw (i+mastep,-matic)--(i+mastep,matic) withpen basepen;
+ endfor;
+ label.bot( btex -3 etex scaled lscale, refpa );
+ label.bot( btex 0 etex scaled lscale, refpb );
+ label.bot( btex 1 etex scaled lscale, refpc );
+endfig;
+
+beginfig(2);
+ drawarrow mainaxe withpen basepen;
+ label.bot( btex $x$ etex scaled lscale, (malen,0) );
+ drawarrow refpb--refpa withpen vecpen withcolor red;
+ label.top( btex $\Delta x$ etex scaled lscale, 0.5[refpa,refpb] );
+ draw (6mastep,-matic)--(6mastep,matic) withpen basepen;
+ draw (12mastep,-matic)--(12mastep,matic) withpen basepen;
+ label.bot( btex fim etex scaled lscale, refpa );
+ label.bot( btex início etex scaled lscale, refpb );
+endfig;
+
+beginfig(3);
+ pair refpd;
+ refpd = (malen,-6mastep);
+ drawarrow refpb--refpa withpen vecpen withcolor red;
+ drawarrow refpd--refpa withpen basepen;
+ drawarrow refpd--refpb withpen basepen;
+ label.top( btex $\Delta \vec{x}$ etex scaled lscale, 0.5[refpa,refpb] );
+ label.llft( btex $\vec{x}_2$ etex scaled lscale, 0.5[refpd,refpa] );
+ label.urt( btex $\vec{x}_1$ etex scaled lscale, 0.5[refpd,refpb] );
+endfig;
+
+beginfig(4)
+ numeric an;
+ an = angle(refpd);
+ path angpa, cutp, calfa, cbeta;
+ angpa = refpd--origin--(malen,0);
+ cutp = origin--(28*mastep*dir(-an));
+ calfa = halfcircle scaled (24mastep);
+ calfa := calfa cutafter cutp;
+ cbeta = halfcircle scaled (28mastep);
+ cbeta := cbeta cutafter cutp;
+ drawoptions( withpen basepen );
+ drawarrow angpa;
+ drawarrow fullcircle scaled (12mastep) cutafter angpa;
+ drawarrow calfa rotated an;
+ drawarrow reverse (cbeta rotated an);
+ label.bot( btex $\theta$ etex scaled lscale, (0,-6mastep) );
+ label.llft( btex $\alpha$ etex scaled lscale, refpb );
+ label.lrt( btex $\beta$ etex scaled lscale, refpc );
+endfig;
+
+verbatimtex
+}
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/f1aula05.mp b/graphics/metapost/contrib/macros/featpost/example/f1aula05.mp
new file mode 100644
index 0000000000..00b14ba67c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/f1aula05.mp
@@ -0,0 +1,98 @@
+% f1aula05.mp
+% L. Nobre G.
+% 2007
+
+verbatimtex
+\documentclass{beamer}
+\usepackage{amsmath,amssymb}
+\usepackage[squaren]{SIunits}
+\usepackage[latin1]{inputenc}
+\usepackage[portuges]{babel}
+\newcommand{\veri}{\ensuremath{\hat{\text{i}}}}
+\newcommand{\verj}{\ensuremath{\hat{\text{j}}}}
+\newcommand{\verk}{\ensuremath{\hat{\text{k}}}}
+\newcommand{\veru}{\ensuremath{\hat{\text{u}}}}
+\newcommand{\emf}{\ensuremath{\mathcal{E}}}
+\newcommand{\vecnorm}[1]{\left|\left|\vec{#1}\right|\right|}
+\renewcommand{\arraystretch}{1.45}
+\begin{document}
+\frame{
+etex
+
+ahangle := 29;
+ahlength := 4.7mm;
+labeloffset := 3.5mm;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {} []
+beginfig(1);
+ pen basepen, vecpen;
+ basepen = pencircle scaled 0.5mm;
+ vecpen = pencircle scaled 1.15mm;
+ numeric ray, lscale, ang, stepang, rang, actang;
+ ray = 5cm;
+ lscale = 2.5;
+ rang = -9;
+ stepang = 18;
+ path thearc;
+ thearc = halfcircle scaled 2ray rotated rang;
+ for ang=0 step stepang until 180+rang:
+ drawarrow origin--(ray*dir(ang)) withpen vecpen;
+ actang := ang;
+ endfor;
+ draw thearc withpen basepen withcolor red;
+ label.llft( btex $\vec{r}$ etex scaled lscale, 0.5*ray*dir(actang) );
+ for ang=0 step stepang until 180+rang:
+ drawarrow (ray,0)--(ray*dir(ang)) withpen vecpen withcolor blue;
+ endfor;
+ label.bot( btex $\vec{r}_0$ etex scaled lscale, (0.5ray,0) );
+ picture colabel;
+ colabel = thelabel.urt(
+ btex $\Delta\vec{r}\rightarrow d\vec{r}\parallel\vec{v}\perp\vec{r}_0$ etex
+ scaled lscale, (ray,0) );
+ draw colabel withcolor blue;
+endfig;
+
+beginfig(2);
+ pen basepen, vecpen;
+ basepen = pencircle scaled 0.5mm;
+ vecpen = pencircle scaled 1.15mm;
+ numeric ray, lscale, ang, stepang, rang, actang, fac;
+ ray = 5cm;
+ lscale = 2.5;
+ rang = -9;
+ stepang = 18;
+ fac = 0.7;
+ path thearc, actv;
+ thearc = halfcircle scaled 2ray rotated rang;
+ for ang=0 step stepang until 180+rang:
+ drawarrow (ray,0)--((ray,0)+fac*ray*dir(ang+90)) withpen vecpen
+ withcolor green;
+ actv := ((ray*dir(ang))--(ray*(dir(ang)+fac*dir(ang+90))));
+ drawarrow actv withpen basepen;
+ actang := ang;
+ endfor;
+ draw thearc withpen basepen withcolor red;
+ label.lrt( btex $\vec{v}$ etex scaled lscale, point 0.5 of actv );
+ for ang=0 step stepang until 180+rang:
+ drawarrow (ray,fac*ray)--((ray,0)+fac*ray*dir(ang+90)) withpen vecpen
+ withcolor blue;
+ endfor;
+ label.rt( btex $\vec{v}_0$ etex scaled lscale, (ray,0.5*fac*ray) );
+ picture colabel, relabel;
+ colabel = thelabel.rt(
+ btex $\Delta\vec{v}\rightarrow d\vec{v}\parallel\vec{a}\perp\vec{v}_0$ etex
+ scaled lscale, (ray,fac*ray) );
+ draw colabel withcolor blue;
+% drawarrow ((0,fac*ray)--(fac*ray*dir(stepang+90))) shifted (ray,-fac*ray)
+% withpen vecpen withcolor blue+green;
+% relabel = thelabel.rt(
+% btex $\Delta\vec{v}\parallel\vec{a}$ etex scaled lscale, (ray,0) );
+% draw relabel withcolor blue+green;
+endfig;
+
+
+verbatimtex
+}
+\end{document}
+etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/fakehole.mp b/graphics/metapost/contrib/macros/featpost/example/fakehole.mp
new file mode 100644
index 0000000000..cd4365d3ab
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fakehole.mp
@@ -0,0 +1,59 @@
+% fakehole.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+Spread := 23;
+f := (13,6,4.5);
+ShadowOn := true;
+LightSource := 10*(4,-1.7,2);
+beginfig(1);
+ numeric bigray, smaray, posray, posang, disang, aresiz, dislen;
+ numeric numl, numr, holang, i;
+ color pos, disaxe, holaxe;
+ aresiz := 13;
+ bigray := 2;
+ smaray := 0.25;
+ posray := 4;
+ posang := -10;
+ disang := 15;
+ dislen := 0.4;
+ holang := 115;
+ numl := 45;
+ disaxe := dislen*(cosd(disang),sind(disang),0);
+ pos := posray*(cosd(posang),sind(posang),0);
+ holaxe := (cosd(disang+90)*cosd(holang),
+ sind(disang+90)*cosd(holang),
+ sind(holang));
+ HoriZon := -bigray;
+ setthestage( 0.5*numl, aresiz );
+ rigorousdisc( smaray, true, pos, bigray, disaxe );
+ numr := floor(bigray/smaray);
+ for i=2-numr step 3 until -3:
+ fakehole( pos+i*smaray*holaxe, disaxe, smaray );
+ fakehole( pos-i*smaray*holaxe, disaxe, smaray );
+ endfor;
+endfig;
+
+ShadowOn := false;
+Spread := 25;
+ShiftV := 105.00mm*(0.5,1);
+beginfig(2);
+ numeric len, ray;
+ len = 10;
+ ray = 0.9;
+ f := (5,2*ray,1+1.5*ray);
+ viewcentr := (0,2.5*ray,1+0.5*ray);
+ drawoptions( withpen pencircle scaled 2.3pt );
+ kindofcube(false,true,black,0,0,0,1,len*ray,2);
+ numeric i;
+ for i=2 step 2 until len-1:
+ fakehole( (0,i*ray,1), red, ray );
+ endfor;
+endfig;
+
+end.
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/fallinthewind.mp b/graphics/metapost/contrib/macros/featpost/example/fallinthewind.mp
new file mode 100644
index 0000000000..f4984971b6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fallinthewind.mp
@@ -0,0 +1,106 @@
+% fallinthewind.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+Spread := 9;
+f := 4.5*(2.5,-1.3,1.7);
+viewcentr := (0,0,2);
+background := 0.9white;
+
+color referencewind;
+numeric dragcoef, dragcoeg, horangle, quadcoef;
+horangle = 90;
+referencewind = red*cosd( horangle ) + green*sind( horangle );
+dragcoef = 0.065;
+dragcoeg = 0.009;
+quadcoef = 0.99;
+
+def vecfunc( expr posit, veloc )=
+ begingroup
+ save heig, wind, field, wint, blow;
+ color wind, field, blow;
+ numeric heig, wint;
+ heig = Z( posit );
+ wind = referencewind*quadcoef*sqrt( heig+0.05 );
+ wind := wind-veloc;
+ wint = conorm( wind );
+ blow = N( wind );
+ field = (dragcoef+dragcoeg*wint)*wind-blue;
+ ( field )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, j, k, numa, sa, ea, diffstep, ray;
+ color stp, svl, arrbe, arren;
+ path oneline[];
+ pen grossa, fina;
+ arrbe = (0,-8,5);
+ arren = (0,-5.5,5);
+ setthestage( 18, 20 );
+ TDAtiplen := 0.75;
+ TDAhalftipbase := 0.3;
+ TDAhalfthick := 0.15;
+ grossa = pencircle scaled 1.8pt;
+ fina = pencircle scaled 1.2pt;
+ diffstep = 0.015;
+ ray = 3.95;
+ numa = 3.45;
+ sa = 38;
+ ea = 142;
+ j = 0;
+ for i=sa step numa until ea:
+ j := j+1;
+ stp := black;
+ svl := ray*(green*cosd(i)+blue*sind(i));
+ oneline[j] := dragtrajectorypath( stp, svl, diffstep, vecfunc );
+ draw oneline[j] withpen grossa withcolor white;
+ endfor;
+ for k=1 upto j:
+ draw oneline[k] withpen fina withcolor red;
+ endfor;
+ tdarrow( arrbe, arren );
+ draw rp(black)--rp((0,0,4.5)) dashed withdots withpen fina withcolor blue;
+ produce_vga_border;
+endfig;
+
+end.
+
+ray := 3.25;
+numeric min, rst;
+min = 0.5;
+rst = 0.1;
+for i=min step rst until ray:
+ %show i;
+ numeric xa, xb, xc, fa, fb, fc;
+ xa = 85;
+ svl := i*(green*cosd(xa)+blue*sind(xa));
+ oneline := dragtrajectorypath( black, svl, diffstep, vecfunc );
+ fa = PrintStep;
+ xb = 89;
+ svl := i*(green*cosd(xb)+blue*sind(xb));
+ oneline := dragtrajectorypath( black, svl, diffstep, vecfunc );
+ fb = PrintStep;
+ xc = 0;
+ forever:
+ exitif ( abs( fb - fa ) < 0.005 );
+ xc := xb - fb*(xb-xa)/(fb-fa);
+ svl := i*(green*cosd(xc)+blue*sind(xc));
+ oneline := dragtrajectorypath( black, svl, diffstep, vecfunc );
+ fc := PrintStep;
+ exitif ( abs( fc - fa ) < 0.0005 );
+ xa := xb;
+ fa := fb;
+ xb := xc;
+ fb := fc;
+ endfor;
+ message decimal( i ) & " " & decimal( xc );
+endfor;
+message " ";
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/featpostlogo.mp b/graphics/metapost/contrib/macros/featpost/example/featpostlogo.mp
new file mode 100644
index 0000000000..b5304e100d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/featpostlogo.mp
@@ -0,0 +1,29 @@
+% featpostlogo.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\newfont{\normald}{logod10 scaled 5000}
+\pagestyle{empty}
+\begin{document}
+etex
+
+input boxes;
+
+beginfig(1);
+ picture logo;
+ defaultdx := 3mm;
+ defaultdy := 2mm;
+ logo = thelabel.urt( btex {\normald FEATPOST} etex, origin );
+ boxit.thelogo( logo );
+ drawboxed( thelogo );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ffcbob.mp b/graphics/metapost/contrib/macros/featpost/example/ffcbob.mp
new file mode 100644
index 0000000000..36a9573430
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ffcbob.mp
@@ -0,0 +1,84 @@
+% ffcbob.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := 2*(15,0,2);
+Spread := 20;
+
+beginfig(1);
+ numeric phi, theta, back, numbacks, minnum, maxnum;
+ phi = 30;
+ theta = 80;
+ back = 7;
+ numbacks = 30;
+ minnum = 3;
+ maxnum = 15;
+ numeric upl[], dol[], pos[], len[], rai[] rao[];
+ upl1=1; dol1=17;pos1=-5.0; len1=2.0; rai1=1.5; rao1=6.5;
+ upl2=2; dol2=16;pos2=-3.0; len2=0.8; rai2=1.5; rao2=6.3;
+ upl3=3; dol3=15;pos3=-2.2; len3=0.4; rai3=1.5; rao3=4.8;
+ upl4=4; dol4=14;pos4=-1.8; len4=0.4; rai4=1.5; rao4=4.4;
+ upl5=5; dol5=13;pos5=-1.4; len5=0.4; rai5=1.5; rao5=4.2;
+ upl6=6; dol6=11;pos6=-1.0; len6=0.2; rai6=1.5; rao6=3.2;
+ upl7=7; dol7=12;pos7=-1.0; len7=0.2; rai7=4.0; rao7=4.6;
+ upl8=8; dol8=10;pos8=-0.8; len8=0.6; rai8=1.5; rao8=3.2;
+ upl9=9; dol9=7; pos9=-0.2; len9=0.4; rai9=1.5; rao9=3.2;
+ upl10=10;dol10=9;pos10=-0.2;len10=0.2;rai10=4.0;rao10=4.4;
+ upl11=11;dol11=8;pos11=0.0; len11=0.2;rai11=4.0;rao11=4.6;
+ upl12=12;dol12=6;pos12=0.2; len12=0.8;rai12=1.5;rao12=4.8;
+ upl13=13;dol13=5;pos13=1.0; len13=0.4;rai13=1.5;rao13=4.4;
+ upl14=14;dol14=3;pos14=1.4; len14=0.2;rai14=1.5;rao14=4.4;
+ upl15=15;dol15=4;pos15=1.4; len15=0.2;rai15=4.8;rao15=6.3;
+ upl16=16;dol16=2;pos16=1.6; len16=0.6;rai16=1.5;rao16=6.3;
+ upl17=17;dol17=1;pos17=2.2; len17=2.0;rai17=1.5;rao17=6.5;
+ color axe;
+ axe = (cosd(phi)*cosd(theta),sind(phi)*cosd(theta),sind(theta));
+ numeric i;
+ for i=0 upto numbacks:
+ draw rp(back*(1,2*i/numbacks-1,-1))--
+ rp(back*(-1,2*i/numbacks-1,-1))--
+ rp(back*(-1,2*i/numbacks-1,1)) withcolor 0.7background;
+ endfor;
+ numeric crux;
+ crux = cdotprod( f, axe );
+ numeric j, k;
+ if crux <= pos[minnum+1]:
+ for i=minnum upto maxnum:
+ j := maxnum;
+ forever:
+ exitunless dol[j] <> i;
+ j := decr( j );
+ endfor;
+% rigorousdisc(rai[j],true,axe*pos[j],rao[j],axe*len[j]);
+ rigorousdisc(0,true,axe*pos[j],rao[j],axe*len[j]);
+ endfor;
+ elseif crux > pos[maxnum]:
+ for i=minnum upto maxnum:
+% rigorousdisc(rai[i],true,axe*pos[i],rao[i],axe*len[i]);
+ rigorousdisc(0,true,axe*pos[i],rao[i],axe*len[i]);
+ endfor;
+ else:
+ k := minnum+2;
+ forever:
+ exitif crux <= pos[k];
+ k := incr( k );
+ endfor;
+ for i=minnum upto k-1:
+% rigorousdisc(rai[i],true,axe*pos[i],rao[i],axe*len[i]);
+ rigorousdisc(0,true,axe*pos[i],rao[i],axe*len[i]);
+ endfor;
+ for i=k upto maxnum:
+ j := maxnum;
+ forever:
+ exitunless dol[j] <> i;
+ j := decr( j );
+ endfor;
+% rigorousdisc(rai[j],true,axe*pos[j],rao[j],axe*len[j]);
+ rigorousdisc(0,true,axe*pos[j],rao[j],axe*len[j]);
+ endfor;
+ fi;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/fieldlines.mp b/graphics/metapost/contrib/macros/featpost/example/fieldlines.mp
new file mode 100644
index 0000000000..ca33c92a9a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fieldlines.mp
@@ -0,0 +1,59 @@
+% fieldlines.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 30;
+f := (10,0,0);
+
+color posa, posb;
+numeric kfac;
+posa = -5*green;
+posb = 5*green;
+kfac = 2.5;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( field )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 105;
+ lenb = 145;
+ numa = 72;
+ numb = 30;
+ diffstep = 1;
+ ray = 0.5;
+ sa = 36;
+ sb = 75;
+ for i=sa step numa until (360+sa):
+ stp := posa+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360+sb):
+ stp := posb+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lenb, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/fieldlinesnorma.mp b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnorma.mp
new file mode 100644
index 0000000000..8f6acc8eaa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnorma.mp
@@ -0,0 +1,104 @@
+% fieldlinesnorma.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 25;
+f := (10,-2,7);
+
+color posa, posb, perpd;
+numeric kfac;
+posa = -5*green;
+posb = 5*green;
+perpd = (1,0,1);
+kfac = -10;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( N(field) )
+ endgroup
+enddef;
+
+def potfunc( expr posit )=
+ begingroup
+ save field;
+ color field;
+ field = vecfunc( posit );
+ ( ncrossprod( field, perpd ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ lenb = 20;
+ numa = 30;
+ numb = 18;
+ diffstep = 0.1;
+ ray = 0.5;
+ sa = 75;
+ sb = 90;
+ for i=sa step numa until (360+sa):
+ stp := posa+( ray*cosd(i), ray*sind(i), 0 );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360+sb):
+ stp := posb+( ray*cosd(i), ray*sind(i), 0 );
+ oneline := fieldlinepath( lenb, stp, -diffstep, vecfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+Spread := 17;
+f:= (10,-6,7);
+
+beginfig(2);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ang;
+ color stp;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ lenb = 125;
+ numa = 0.03;
+ numb = 0.30;
+ diffstep = 0.2;
+ ang = -90;
+ sa = 1.5;
+ sb = 4.5;
+ for i=sa step numa until (1.5+sa):
+ stp := posa+i*cosd(ang)*green+i*sind(ang)*ncrossprod(perpd,green);
+ oneline := fieldlinepath( lena, stp, diffstep, potfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ ang := 180;
+ for i=sb step numb until (3.7+sb):
+ stp := posb+i*cosd(ang)*green+i*sind(ang)*ncrossprod(perpd,green);
+ oneline := fieldlinepath( lenb, stp, diffstep, potfunc );
+ draw oneline withpen grossa;
+% draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaper.mp b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaper.mp
new file mode 100644
index 0000000000..85fab7de40
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaper.mp
@@ -0,0 +1,183 @@
+% fieldlinesnormapaper.mp
+% L. Nobre G.
+% 2009
+
+input featpost3Dplus2D;
+
+Spread := 25;
+f := (20,0,0);
+
+color posa, posb, perpd;
+numeric limy, limz, bord;
+posa = (0,-3,3); %%%%%%%% allways make Y(posa) < Y(posb) %%%%%%%%%%%
+posb = (0,3,-2); %%%%%%%%%%%% never make Y(posa) = Y(posb) %%%%%%%%%
+perpd = (1,0,0);
+limy = 7;
+limz = 5;
+bord = 2.5;
+
+def vecfunc( expr posit )=
+ begingroup
+ save field;
+ color field, horiz, verti, vech, vecv;
+ numeric modula, modulb, ypos, zpos, hd, hf, vd, vf, zref, yref;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = N( ( posit-posa )/(modula**3)-( posit-posb )/(modulb**3) );
+ ypos = Y( posit );
+ zpos = Z( posit );
+ if Z(posa) <> Z(posb):
+ (ypos,zref) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ (yref,zpos) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ if ypos < yref:
+ if zpos > 0:
+ vech = -green;
+ else:
+ vech = green;
+ fi;
+ else:
+ if zpos > 0:
+ vech = green;
+ else:
+ vech = -green;
+ fi;
+ fi;
+ else:
+ hd = 0;
+ vech = black;
+ fi;
+ else:
+ zref = Z(posa);
+ vech = green;
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ else:
+ hd = 0;
+ fi;
+ fi;
+ if ( abs(ypos) > limy-bord ):
+ vd = abs(ypos)-limy+bord;
+ if zpos > zref:
+ if ypos < 0:
+ vecv = blue;
+ else:
+ vecv = -blue;
+ fi;
+ else:
+ if ypos < 0:
+ vecv = -blue;
+ else:
+ vecv = blue;
+ fi;
+ fi;
+ else:
+ vd = 0;
+ vecv = black;
+ fi;
+ hf = (hd/bord)**2;
+ vf = (vd/bord)**2;
+ ( N(field*(0.975-hf)*(0.975-vf)+hf*vech+vf*vecv) )
+ endgroup
+enddef;
+
+def potfunc( expr posit )=
+ begingroup
+ color field;
+ field = vecfunc( posit );
+ ( ncrossprod( field, perpd ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ numeric j, gridstep, fac;
+ color stp, grdp, locv;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 60;
+ lenb = 40;
+ numa = 15;
+ numb = 30;
+ diffstep = 0.1;
+ ray = 0.5;
+ sa = 40;
+ sb = 5;
+ fac = 0.275;
+ gridstep = 0.3;
+ for i=-limy+0.5*gridstep step gridstep until limy-0.5*gridstep:
+ for j=-limz+0.5*gridstep step gridstep until limz-0.5*gridstep:
+ grdp := (0,i,j);
+ locv := 0.5*fac*vecfunc( grdp );
+ drawarrow rp(grdp-locv)--rp(grdp+locv);
+ endfor;
+ endfor;
+ for i=sa step numa until (360-sa):
+ stp := posa+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360-sb):
+ stp := posb+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lenb, stp, -diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ drawoptions(withpen grossa);
+ draw rp(posa);
+ draw rp(posb);
+ draw rp((0,-limy,-limz))--rp((0, limy,-limz))--
+ rp((0, limy, limz))--rp((0,-limy, limz))--cycle;
+ drawoptions();
+endfig;
+
+beginfig(2);
+ numeric i, lena, numa, diffstep, fac, gridstep, margnum;
+ color stp, grdp, locv;
+ path oneline, twoline, bordeline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ numa = 13;
+ margnum = 2;
+ diffstep = 0.2;
+ fac = 0.275;
+ gridstep = 0.3;
+ for i=-limy+0.5*gridstep step gridstep until limy-0.5*gridstep:
+ for j=-limz+0.5*gridstep step gridstep until limz-0.5*gridstep:
+ grdp := (0,i,j);
+ locv := 0.5*fac*potfunc( grdp );
+ drawarrow rp(grdp-locv)--rp(grdp+locv);
+ endfor;
+ endfor;
+ for i=margnum upto numa-margnum:
+ stp := (i/numa)[posa,posb];
+ oneline := fieldlinepath( lena, stp, diffstep, potfunc );
+ twoline := fieldlinepath( lena, stp, -diffstep, potfunc );
+ draw oneline withpen grossa;
+ draw twoline withpen grossa;
+ endfor;
+ drawoptions(withpen grossa);
+ draw rp(posa);
+ draw rp(posb);
+ bordeline = rp((0,-limy,-limz))--rp((0, limy,-limz))--
+ rp((0, limy, limz))--rp((0,-limy, limz))--cycle;
+ clip currentpicture to bordeline;
+ draw bordeline;
+ drawoptions(withpen fina);
+ numeric side;
+ path aux, electri;
+ side = 10mm;
+ aux = origin--(side,0)--(side,side)--cycle;
+ z0 = 0.667[origin,(side,0.5*side)];
+ electri = aux shifted (-z0) rotated (45+angle(rp(posb)-rp(posa)));
+ fill electri shifted rp(posb);
+ fill electri rotated 180 shifted rp(posa);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaperwork.mp b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaperwork.mp
new file mode 100644
index 0000000000..fb44cf15e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fieldlinesnormapaperwork.mp
@@ -0,0 +1,139 @@
+% fieldlinesnormapaperwork.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+Spread := 25;
+f := (20,0,0);
+
+color posa, posb, perpd;
+numeric limy, limz, bord, reduct;
+posa = (0,-4,0); %%%%%%%% allways make Y(posa) < Y(posb) %%%%%%%%%%%
+posb = (0,4,0); %%%%%%%%%%%% never make Y(posa) = Y(posb) %%%%%%%%%
+perpd = (1,0,0);
+limy = 7;
+limz = 5;
+bord = 2.5;
+reduct = 0.18;
+
+def vecfunc( expr posit )=
+ begingroup
+ save field;
+ color field, horiz, verti, vech, vecv;
+ numeric modula, modulb, ypos, zpos, hd, hf, vd, vf, zref, yref;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = N( ( posit-posa )/(modula**3)-( posit-posb )/(modulb**3) );
+ ypos = Y( posit );
+ zpos = Z( posit );
+ if Z(posa) <> Z(posb):
+ (ypos,zref) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ (yref,zpos) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ if ypos < yref:
+ if zpos > 0:
+ vech = -green;
+ else:
+ vech = green;
+ fi;
+ else:
+ if zpos > 0:
+ vech = green;
+ else:
+ vech = -green;
+ fi;
+ fi;
+ else:
+ hd = 0;
+ vech = black;
+ fi;
+ else:
+ zref = Z(posa);
+ vech = green;
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ else:
+ hd = 0;
+ fi;
+ fi;
+ if ( abs(ypos) > limy-bord ):
+ vd = abs(ypos)-limy+bord;
+ if zpos > zref:
+ if ypos < 0:
+ vecv = blue;
+ else:
+ vecv = -blue;
+ fi;
+ else:
+ if ypos < 0:
+ vecv = -blue;
+ else:
+ vecv = blue;
+ fi;
+ fi;
+ else:
+ vd = 0;
+ vecv = black;
+ fi;
+ hf = (hd/bord)**2;
+ vf = (vd/bord)**2;
+ ( N(field*(0.975-hf)*(0.975-vf)+(hf*vech+vf*vecv)*reduct) )
+ endgroup
+enddef;
+
+def potfunc( expr posit )=
+ begingroup
+ color field;
+ field = vecfunc( posit );
+ ( ncrossprod( field, perpd ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, numa, diffstep, ray;
+ color stp;
+ path bordeline;
+ pen grossa, fina;
+ pair auxp;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 1pt;
+ lena = 80;
+ numa = 13;
+ diffstep = 0.12;
+ ray = 0.05;
+ % drawoptions(withpen grossa);
+ % for i=1 upto numa-1:
+ % auxp := (i/numa)[rp(posa),rp(posb)];
+ % draw auxp;
+ % endfor;
+ drawoptions(withpen fina);
+ for i=2 step 2 until numa-2:
+ stp := (i/numa)[posa,posb];
+ draw fieldlinepath( lena, stp, diffstep, potfunc );
+ draw fieldlinepath( lena, stp, -diffstep, potfunc );
+ endfor;
+% draw fieldlinepath( lena, (0,Y(posa),Z(posa)+ray), diffstep, vecfunc );
+ bordeline = rp((0,-limy,-limz))--rp((0, limy,-limz))--
+ rp((0, limy, limz))--rp((0,-limy, limz))--cycle;
+ clip currentpicture to bordeline;
+ draw bordeline;
+ drawoptions(withpen fina);
+ % numeric side;
+ % path aux, electri;
+ % side = 10mm;
+ % aux = origin--(side,0)--(side,side)--cycle;
+ % z0 = 0.667[origin,(side,0.5*side)];
+ % electri = aux shifted (-z0) rotated (45+angle(rp(posb)-rp(posa)));
+ % draw electri shifted rp(posb);
+ % draw electri rotated 180 shifted rp(posa);
+ path electri;
+ electri = fullcircle scaled 7mm;
+ fill electri shifted rp(posb) withcolor 0.5white;
+ fill electri shifted rp(posa) withcolor 0.5white;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/fis1prex.mp b/graphics/metapost/contrib/macros/featpost/example/fis1prex.mp
new file mode 100644
index 0000000000..61c23b56e9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fis1prex.mp
@@ -0,0 +1,198 @@
+% fis1prex.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric largtecto, molasfrac, altutecto, compcorda, espetecto;
+ numeric largmolas, largnum, cordafrac, espesfrac, largmolfr;
+ numeric u, alpha, i, numturns, alphafrac, alpharadi, rcf, rcd;
+ pen mainp, auxip;
+ path leftspr, rightsp, corda, boxtecto, traco, linhalpha, rcp;
+ pair esqutecto, diretecto, esquemola, direimola, espessvec;
+ largnum = 100;
+ u = 1mm;
+ molasfrac = 0.8;
+ espesfrac = 0.1;
+ cordafrac = 0.3;
+ alphafrac = 0.3;
+ largmolfr = 0.12;
+ rcf = 0.1;
+ numturns = 11;
+ alpha = 120;
+ mainp = pencircle scaled 0.4u;
+ auxip = pencircle scaled 0.2u;
+ largtecto = largnum*u;
+ rcd = rcf*largtecto;
+ largmolas = largmolfr*molasfrac*largtecto;
+ compcorda = cordafrac*largtecto;
+ espetecto = espesfrac*largtecto;
+ altutecto = 0.5*largtecto*molasfrac*cosd(alpha/2)/sind(alpha/2);
+ alpharadi = 2*alphafrac*altutecto;
+ esqutecto = (-largtecto/2,altutecto);
+ diretecto = (largtecto/2,altutecto);
+ esquemola = (-largtecto*molasfrac/2,altutecto);
+ direimola = (largtecto*molasfrac/2,altutecto);
+ espessvec = (0,espetecto);
+ boxtecto = esqutecto--
+ diretecto--
+ (diretecto+espessvec)--
+ (esqutecto+espessvec)--cycle;
+ traco = (origin--(dir(45))) scaled 6in;
+ for i=-largnum upto largnum:
+ draw traco shifted (2*i*u,0) withpen auxip;
+ endfor;
+ clip currentpicture to boxtecto;
+ pickup mainp;
+ draw esqutecto--diretecto;
+ leftspr = springpath(direimola,origin,numturns,largmolas,0.55);
+ rightsp = springpath(origin,esquemola,numturns,largmolas,0.55);
+ draw leftspr;
+ draw rightsp;
+ rcp = randomcirc( rcd, 0.1*rcd, 180 ) shifted (0,-compcorda);
+ draw rcp;
+ draw origin--(0,-compcorda) cutafter rcp;
+ linhalpha = fullcircle scaled alpharadi;
+ linhalpha := linhalpha cutafter rightsp;
+ linhalpha := linhalpha cutbefore leftspr;
+ draw linhalpha withpen auxip;
+ label(btex m etex scaled 3, (0,-compcorda) );
+ label.urt(btex $\alpha$ etex scaled 3, (0,alpharadi/2) );
+endfig;
+
+beginfig(3);
+ numeric u, largtecto, altutecto, espetecto, largmolas, rcd, largnum;
+ numeric spfraca, spfracb, angex, lenfactor, lenspringb, largfac;
+ numeric lenfel, lenwei;
+ pen mainp, auxip;
+ path molapatha, molapathb, rcpa, rcpb, boxtecto, traco;
+ pair esqutecto, diretecto, espessvec, fixpoi, springbextreme, fel, wei, res;
+ color graycol;
+ mainp = pencircle scaled 0.4mm;
+ auxip = pencircle scaled 0.2mm;
+ angex = 36;
+ lenfactor = 1.35;
+ largtecto = 100mm;
+ espetecto = 10mm;
+ altutecto = 50mm;
+ largmolas = 7mm;
+ rcd = 6mm;
+ lenfel = 34.5mm;
+ lenwei = 20mm;
+ largnum = 100;
+ spfraca = 0.65;
+ graycol = 0.67white;
+ largfac = 0.5*(1+lenfactor);
+ fel = lenfel*dir(90+angex);
+ wei = lenwei*down;
+ res = fel+wei;
+ lenspringb = altutecto*lenfactor;
+ spfracb = 1-altutecto*(1-spfraca)/lenspringb;
+ randomseed := 3976;
+ esqutecto = (-largtecto/2,altutecto);
+ diretecto = (largtecto/2,altutecto);
+ espessvec = (0,espetecto);
+ fixpoi = (0,altutecto);
+ springbextreme = fixpoi+lenspringb*dir(angex-90);
+ fel := springbextreme+fel;
+ wei := springbextreme+wei;
+ res := springbextreme+res;
+ boxtecto = esqutecto--
+ diretecto--
+ (diretecto+espessvec)--
+ (esqutecto+espessvec)--cycle;
+ traco = (origin--(dir(45))) scaled 6in;
+ for i=-largnum upto largnum:
+ draw traco shifted (2*i*mm,0) withpen auxip;
+ endfor;
+ clip currentpicture to boxtecto;
+ pickup mainp;
+ draw esqutecto--diretecto;
+ molapatha = springpath(fixpoi,origin,11,largmolas,spfraca);
+ draw molapatha withcolor graycol;
+ rcpa = randomcirc( rcd, 0.1*rcd, 24 );
+ unfill rcpa;
+ draw rcpa withcolor graycol;
+ molapathb = springpath(fixpoi,springbextreme,11,largmolas/largfac,spfracb);
+ draw molapathb;
+ rcpb = rcpa rotated angex shifted springbextreme;
+ unfill rcpb;
+ draw rcpb;
+ drawoptions( withcolor blue );
+ drawarrow springbextreme--fel;
+ drawarrow springbextreme--wei;
+ drawarrow springbextreme--res;
+ label.urt( btex $\vec{F}_{el}$ etex, fel );
+ label.llft( btex $\vec{F}_{R}$ etex, res );
+ label.ulft( btex $\vec{F}_{g}$ etex, wei );
+endfig;
+
+beginfig(2);
+ numeric u, basesize, baseheight, alphang, thetang, sfearsize;
+ numeric armsize, marginraise, totalraise, axeray, cardansize;
+ color basepos, tdorigin, oneaxe, otheraxe, rotaxbascenter, axedir;
+ color gluaxbascenter, rotrajcenter, cardanpos, refpoint, anotheraxe;
+ color armdir, armbasonepos, armbastwopos, sfearpos;
+ path glueaxebase, rotataxebase, rotrajector, axepath, sfearpath;
+ numeric armray;
+ u = 0.0125mm;
+ basesize = 30u;
+ baseheight = 3u;
+ alphang = 20;
+ thetang = -18;
+ armsize = 25u;
+ marginraise = 6u;
+ axeray = 3u;
+ cardansize = 3u;
+ sfearsize = 4u;
+ armray = 1.5u;
+ totalraise = armsize*sind(alphang)+marginraise+cardansize*cosd(alphang);
+ basepos = (0,0,-0.5baseheight);
+ f := -2*(-2basesize,-basesize,-5baseheight);
+ kindofcube(false, false, basepos, 0, 0, 0, 2basesize, 2basesize, baseheight );
+ tdorigin = (0,0,0);
+ oneaxe = (0,axeray/cosd(alphang),0);
+ otheraxe = (1,0,0);
+ anotheraxe = (0,cosd(alphang),-sind(alphang));
+ gluaxbascenter = tdorigin - (0,totalraise*sind(alphang),0);
+ glueaxebase = ellipticpath( gluaxbascenter, oneaxe, axeray*otheraxe );
+ axedir = (0,sind(alphang),cosd(alphang));
+ rotrajcenter = (0,0,totalraise);
+ rotaxbascenter = rotrajcenter-axedir*cardansize;
+ refpoint = rotrajcenter+axedir*cardansize;
+ rotataxebase = rigorouscircle( rotaxbascenter, axedir, axeray );
+ rotrajector = rigorouscircle( rotrajcenter, axedir, armsize );
+ axepath = twocyclestogether( glueaxebase, rotataxebase );
+ fill axepath withcolor background;
+ draw axepath;
+ draw rotataxebase;
+ drawarrow subpath (3,10.5) of rotrajector dashed evenly;
+% dotlabel.top( btex 1 etex, point 1 of rotrajector );
+% dotlabel.top( btex 5 etex, point 5 of rotrajector );
+% dotlabel.top( btex 3 etex, point 3 of rotrajector );
+ kindofcube(false,false,rotrajcenter,90,90-alphang,thetang,2cardansize,2cardansize,2cardansize);
+ draw rp(refpoint);
+ armdir := otheraxe*cosd(thetang)+anotheraxe*sind(thetang);
+ armbasonepos = rotrajcenter + cardansize*armdir;
+ armbastwopos = rotrajcenter + (armsize-sfearsize)*armdir; % NOT RIGOROUS
+ sfearpos = rotrajcenter + armsize*armdir;
+ rigorousdisc( 0, true, armbasonepos, armray, armbastwopos-armbasonepos );
+ sfearpath = rigorousfearpath( sfearpos, sfearsize );
+ fill sfearpath withcolor background;
+ draw sfearpath;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/fis3prex.mp b/graphics/metapost/contrib/macros/featpost/example/fis3prex.mp
new file mode 100644
index 0000000000..f1381b10d5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fis3prex.mp
@@ -0,0 +1,481 @@
+% fis3prex.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def platecap( expr Xpos, Shade, Angle, Oray, Iray, NumPoints ) =
+ begingroup
+ path perim, op, ip;
+ numeric i;
+ color axey, axmz, tp;
+ axey = cosd( Angle )*green + sind( Angle )*blue;
+ axmz = -cosd( Angle )*blue + sind( Angle )*green;
+ tp = Xpos*red;
+ op = rp( tp+Oray*axey )
+ for i=1 upto NumPoints:
+ ..rp(tp+Oray*(cosd(i*180/NumPoints)*axey+sind(i*180/NumPoints)*axmz))
+ endfor;
+ ip = rp( tp+Iray*axey )
+ for i=1 upto NumPoints:
+ ..rp(tp+Iray*(cosd(i*180/NumPoints)*axey+sind(i*180/NumPoints)*axmz))
+ endfor;
+ perim = op--reverse ip--cycle;
+ fill perim withcolor Shade;
+ draw perim
+ endgroup
+enddef;
+
+beginfig(1);
+ f := ( 4, 1, 2 );
+ numeric i, j, xsiz, ysiz, gstep, angl, vlen, fact, xa, xb, yb;
+ color vdir, bpos, ap, bp, cp, dp;
+ path base;
+ xsiz = 2;
+ ysiz = 3;
+ gstep = 0.23;
+ angl = 33;
+ vlen = 0.45;
+ fact = 1.3;
+ vdir = vlen*( 0, cosd(angl), sind(angl) );
+ xa = 0.5*gstep;
+ xb = (xsiz+0.5)*gstep;
+ yb = (ysiz+0.5)*gstep;
+ ap = (-xa,-xa,0);
+ bp = (-xa,yb,0);
+ cp = (xb,yb,0);
+ dp = (xb,-xa,0);
+ for i=0 upto xsiz:
+ for j=0 upto ysiz:
+ bpos := gstep*(i,j,0);
+ draw rp(bpos-fact*vdir)--rp(bpos);
+ drawarrow rp(bpos-fact*vdir)--rp(bpos-vdir);
+ endfor;
+ endfor;
+ base = rp(ap)--rp(bp)--rp(cp)--rp(dp)--cycle;
+ fill base withcolor 0.7background;
+ draw base;
+ for i=0 upto xsiz:
+ for j=0 upto ysiz:
+ bpos := gstep*(i,j,0);
+ draw rp(bpos+fact*vdir)--rp(bpos);
+ drawarrow rp(bpos)--rp(bpos+vdir);
+ endfor;
+ endfor;
+ draw rp(black)--rp( (0,0,vlen) ) dashed evenly;
+ angline( fact*vdir, (0,0,vlen), black, 0.7*vlen, btex 57$^\circ$ etex, urt );
+ label.top( btex $\vec{B}$ etex, rp(vdir) );
+endfig;
+
+beginfig(2);
+ f := ( 4, 3, 2 );
+ numeric i, numplates, xdelta, iangle, ang, oray, iray, numpois;
+ numeric aang, imray, omray, mmray, axray, numouts;
+ color shade, shadea, shadeb, p[];
+ path fucir, outerarrow, theknob;
+ numplates = 11;
+ numouts = 2;
+ xdelta = 0.1;
+ iangle = 53;
+ oray = 0.5;
+ iray = 0.07;
+ imray = 0.52;
+ omray = 0.67;
+ mmray = 0.64;
+ axray = 0.04;
+ numpois = 10;
+ shadea = 0.8background;
+ shadeb = 0.6background;
+ fucir = rigorouscircle( (-(numplates-1)*xdelta,0,0), red, imray );
+ outerarrow = subpath (1.7,2.3) of fucir;
+ p1 = ( -(numplates-1)*xdelta, imray, 0 );
+ p2 = ( -(numplates-1)*xdelta, omray, 0 );
+ p3 = ( -(numplates-2)*xdelta, imray, 0 );
+ p4 = ( -(numplates-2)*xdelta, omray, 0 );
+ p5 = ( -(numplates-4)*xdelta, mmray, 0 );
+ p6 = ( -(numplates-2)*xdelta, mmray, 0 );
+ p7 = ( -(numplates+1)*xdelta, mmray, 0 );
+ p8 = ( -(numplates-1)*xdelta, mmray, 0 );
+ p9 = ( -xdelta, cosd( 0.5*iangle )*0.5*oray, sind( 0.5*iangle )*0.5*oray );
+ p0 = ( 0, cosd( 0.5*iangle )*0.5*oray, -sind( 0.5*iangle )*0.5*oray );
+ for i=1-numplates upto 0:
+ if odd(i):
+ shade := shadea;
+ ang := iangle;
+ else:
+ shade := shadeb;
+ ang := 0;
+ fi;
+ platecap( i*xdelta, shade, ang, oray, iray, numpois );
+ background := shadea;
+ rigorousdisc( 0, true, (i*xdelta,0,0), axray, xdelta*red );
+ background := shadeb;
+ rigorousdisc( 0, true, (i*xdelta,-oray,0), axray, xdelta*red );
+ background := background;
+ endfor;
+ for i=1 upto numouts:
+ background := shadea;
+ rigorousdisc( 0, true, (i*xdelta,0,0), axray, xdelta*red );
+% background := shadeb;
+% rigorousdisc( 0, true, (i*xdelta,-oray,0), axray, xdelta*red );
+ endfor;
+ theknob = rigorousfearpath( ((numouts+1)*xdelta,0,0), 2*axray );
+ fill theknob;
+ draw theknob;
+ background := background;
+ draw rp(p1)--rp(p2);
+ draw rp(p3)--rp(p4);
+ drawarrow rp(p5)--rp(p6);
+ drawarrow rp(p7)--rp(p8);
+ drawarrow outerarrow;
+ label.ulft( btex $d$ etex, rp(p7) );
+ label( btex $A$ etex, rp(p9) );
+ label( btex $A$ etex, rp(p0) );
+endfig;
+
+beginfig(3);
+ f := ( 3, 2, 1 );
+ numeric oray, iray;
+ path opath, ipath;
+ color lRpos, Rpos, Ppos, zpos, rpos, spos;
+ oray = 0.5;
+ iray = 0.2oray;
+ opath = rigorouscircle( black, blue, oray );
+ ipath = rigorouscircle( black, blue, 0.2oray );
+ fill opath withcolor 0.7background;
+ fill ipath withcolor background;
+ draw opath;
+ draw ipath;
+ lRpos = ( oray, 0, 0 );
+ Rpos = 0.5lRpos;
+ Ppos = ( 0, 0, 2oray );
+ zpos = 0.5Ppos;
+ rpos = ( 0, iray, 0 );
+ spos = -Rpos;
+ drawarrow rp(black)--rp(lRpos);
+ drawarrow rp(black)--rp(Ppos);
+ drawarrow rp(black)--rp(rpos);
+ dotlabel.lft( btex $P$ etex, rp(Ppos) );
+ label.rt( btex $z$ etex, rp(zpos) );
+ label.ulft( btex $R$ etex, rp(Rpos) );
+ label.lrt( btex $r$ etex, rp(rpos) );
+ label( btex $\sigma$ etex, rp(spos) );
+endfig;
+
+beginfig(4);
+ f := ( 3, 4, 2 );
+ numeric raya, rayb, rayc, lena, lenb;
+ color baseac, baseav, basebc, basebv, rayabbeg, rayabend, lambdapos;
+ raya = 0.017;
+ rayb = 0.1;
+ rayc = 0.2;
+ lena = 1.4;
+ lenb = 0.6;
+ baseac = 0.5*lena*red;
+ baseav = -lena*red;
+ basebc = 0.5*lenb*red;
+ basebv = -lenb*red;
+ rayabbeg = ( 0.5*lenb, raya, 0 );
+ rayabend = ( 0.5*lenb, rayc, 0 );
+ lambdapos = ( 0, rayc, 0 );
+ rigorousdisc( 0, true, basebc, rayc, basebv );
+ rigorousdisc( 0, true, baseac, raya, baseav );
+ rigorousdisc( 0, false, basebc, rayc, basebv );
+ drawarrow rp( rayabbeg )--rp( rayabend );
+ label.bot( btex $R$ etex, rp( 0.5[rayabbeg,rayabend] ) );
+ label( btex $\lambda_t$ etex, rp ( lambdapos ) );
+ label.lrt( btex $\lambda_f$ etex, rp( 0.3[baseac,basebc] ) );
+endfig;
+
+beginfig(5);
+ f := ( 5, 5, 3 );
+ numeric i, numpoints, ray, aux, blen, bang, fa, fb, fc, fd;
+ path wirea, wireb, wirec, wired, wirepath;
+ color wa[], wb[], btip, xpos;
+ pen bigpen, smallpen;
+ numpoints = 36;
+ ray = 0.5;
+ blen = 0.8;
+ fa = -1.1;
+ fb = -0.8;
+ fc = -fb;
+ fd = -fa;
+ bang = -45;
+ btip = blen*(0,cosd( bang ), sind( bang ) );
+ for i=1 upto numpoints:
+ aux := i*180/numpoints;
+ wa[i] = ray*(red*cosd(aux)+green*sind(aux));
+% drawarrow rp( wa[i] )--rp( wa[i]+btip );
+ wb[i] = ray*(-red*cosd(aux)-blue*sind(aux));
+% drawarrow rp( wb[i] )--rp( wb[i]+btip );
+ endfor;
+ wirepath = for i=1 upto numpoints:
+ rp( wa[i] )-- endfor for i=1 upto numpoints:
+ rp( wb[i] )-- endfor cycle;
+ bigpen = pencircle scaled 3pt;
+ smallpen = pencircle scaled 2.2pt;
+ draw wirepath withpen bigpen;
+ wirea = rp( wb[numpoints] ) for i=1 upto numpoints:
+ --rp( wa[i] ) endfor;
+ wireb = rp( wa[numpoints] ) for i=1 upto numpoints:
+ --rp( wb[i] ) endfor;
+ wirec = rp( wb[numpoints-1] )--wirea--rp( wb[1] );
+% wired = rp( wa[numpoints-1] )--wireb--rp( wa[1] );
+ draw wireb withpen smallpen withcolor background;
+% cartaxes( 2ray, 2ray, 1.2ray );
+ draw rp( 2*ray*red )--rp( -2*ray*red ) dashed evenly;
+ draw rp( black )--rp( -ray*blue );
+ draw rp( black )--rp( ray*green );
+ for i=-1 upto 1:
+ xpos := (i*ray,0,0);
+ drawarrow rp( xpos+fa*btip )--rp( xpos+fb*btip );
+ drawarrow rp( xpos+fb*btip )--rp( xpos+fc*btip );
+ draw rp( xpos+fc*btip )--rp( xpos+fd*btip );
+ endfor;
+ squareangline( -ray*blue, ray*green, black, 0.1*ray);
+ draw wirea withpen bigpen;
+ draw wirec withpen smallpen withcolor background;
+ label.urt( btex $\vec{B}$ etex, rp( btip ) );
+endfig;
+
+beginfig(6);
+ path baset, sphere;
+ color va, vb, vc, qpos;
+ va = (0,0,0);
+ vb = (0.5,0.5*sqrt(3),0);
+ vc = (-0.5,0.5*sqrt(3),0);
+ baset = rp( va )--rp( vb )--rp( vc )--cycle;
+ draw baset;
+ qpos = (0,0.333*sqrt(3),0.333*sqrt(1-0.333*sqrt(3)) );
+ sphere = rigorousfearpath( qpos, 0.1 );
+ fill sphere withcolor background;
+ draw sphere;
+ label( btex +$q$ etex, rp( qpos ) );
+endfig;
+
+beginfig(7);
+ Spread := 50;
+ f := (4,6,3.5);
+ path fiodecima, fioabaixo, malhacub, rama, ramb, ramc;
+ path malhatet, ramd, rame;
+ pen grossa, nuclear, negat;
+ color p[];
+ numeric altura, margem, largneg, largpos, afast, lengax, lscal;
+ pair topo, base, decima, abaixo, centerfont, centerneg, centerpos;
+ pair a, b, c, d, tx, ty, tz;
+ altura = 2cm;
+ margem = 3mm;
+ largneg = 9mm;
+ largpos = 18mm;
+ afast = 5cm;
+ lengax = 0.7;
+ lscal = 2;
+ grossa = pencircle scaled 2.7pt;
+ nuclear = pencircle scaled 2.1pt;
+ negat = pencircle scaled 1.8pt;
+ p1 = (1,1,-1);
+ p2 = (-1,1,-1);
+ p3 = (-1,-1,-1);
+ p4 = (1,-1,-1);
+ p5 = (1,1,1);
+ p6 = (-1,1,1);
+ p7 = (-1,-1,1);
+ p8 = (1,-1,1);
+ p0 = (0,0,1);
+ p9 = (0,0,-1);
+ z1 = rp(p1);
+ z2 = rp(p2);
+ z3 = rp(p3);
+ z4 = rp(p4);
+ z5 = rp(p5);
+ z6 = rp(p6);
+ z7 = rp(p7);
+ z8 = rp(p8);
+ z0 = rp(p0);
+ z9 = rp(p9);
+ tx = rp( p1 - (lengax,0,0) );
+ ty = rp( p1 - (0,lengax,0) );
+ tz = rp( p1 + (0,0,lengax) );
+ topo = (xpart z0, altura + ypart z0);
+ base = (xpart z9, -altura + ypart z9);
+ decima = (afast + xpart topo, ypart topo);
+ abaixo = (afast + xpart base, ypart base);
+ centerfont = 0.5*(decima+abaixo);
+ centerpos = (xpart centerfont, 0.5*margem + ypart centerfont);
+ centerneg = (xpart centerfont, -0.5*margem + ypart centerfont);
+ fiodecima = z0--topo--decima--centerpos;
+ fioabaixo = z9--base--abaixo--centerneg;
+ a = ( -0.5*largpos + xpart centerfont, ypart centerpos);
+ b = ( 0.5*largpos + xpart centerfont, ypart centerpos);
+ c = ( -0.5*largneg + xpart centerfont, ypart centerneg);
+ d = ( 0.5*largneg + xpart centerfont, ypart centerneg);
+ malhacub = z1--z2--z3--z4--z1--z5--z6--z7--z8--z5;
+ malhatet = z2--z7--z4--z5--cycle;
+ rama = z2--z6;
+ ramb = z3--z7;
+ ramc = z4--z8;
+ ramd = z5--z7;
+ rame = z2--z4;
+ drawoptions( dashed evenly );
+ draw malhacub;
+ draw rama;
+ draw ramb;
+ draw ramc;
+ drawoptions( withpen grossa );
+ draw malhatet;
+ draw ramd;
+ draw rame;
+% drawoptions( withpen nuclear withcolor background );
+% draw malhatet;
+% draw ramd;
+% draw rame;
+ drawoptions();
+ draw fiodecima;
+ draw fioabaixo;
+ draw a--b;
+ drawarrow z1--tx withpen negat;
+ drawarrow z1--ty withpen negat;
+ drawarrow z1--tz withpen negat;
+ label.lrt(btex $x$ etex scaled lscal, tx);
+ label.llft(btex $y$ etex scaled lscal, ty);
+ label.lft(btex $z$ etex scaled lscal, tz);
+ linecap := butt;
+ draw c--d withpen negat;
+endfig;
+
+beginfig(8);
+ Spread := 50;
+ f := (6,6,3.5);
+ numeric squareside, sray, cdiameter, cray, distmargin, linemargin, eloing;
+ squareside = 1;
+ cdiameter = squareside/0.88623;
+ cray = cdiameter/2.0;
+ sray = squareside/2.0;
+ distmargin = 0.5;
+ linemargin = 0.15;
+ eloing = 0.4;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color tracecol, outcol, incol;
+ tracecol = 0.5white;
+ outcol = black;
+ incol = 0.876white;
+ color va, vb, vc, vd, cen, bs, bc, fs, fc, ds, dc;
+ va = (0,-sray,-sray);
+ vb = (0,sray,-sray);
+ vc = (0,sray,sray);
+ vd = (0,-sray,sray);
+ cen = (-distmargin,0,0);
+ bs = (0,-sray-linemargin,0);
+ bc = bs+cen;
+ fs = (0,sray+eloing,0);
+ ds = (0,sray+eloing-linemargin,0);
+ fc = fs+cen;
+ dc = ds+cen;
+ path rigcirc, carrpath, square, circ, sline, cline, dline;
+ square = rp(va)--rp(vb)--rp(vc)--rp(vd)--cycle;
+ circ = goodcirclepath( cen, red, cray );
+ rigcirc = rigorouscircle( cen, red, cray+linemargin );
+ carrpath = subpath (1,2) of rigcirc;
+ sline = rp(bs)--rp(fs);
+ cline = rp(bc)--rp(fc);
+ dline = rp(ds)--rp(dc);
+
+ draw cline withpen penc withcolor tracecol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw sline withpen penc withcolor tracecol;
+ draw square withpen pena withcolor outcol;
+ draw square withpen penb withcolor incol;
+ drawdblarrow dline withpen penc withcolor tracecol;
+
+ pair begsarr, endsarr;
+ begsarr = rp((0,-sray-linemargin,linemargin));
+ endsarr = rp((0,-sray-linemargin,sray));
+ drawarrow begsarr--endsarr withpen penc withcolor tracecol;
+ drawarrow carrpath withpen penc withcolor tracecol;
+
+ label.lft( btex $I$ etex, rp((0,-sray-linemargin,sray-linemargin)) );
+ label.top( btex $+$ etex, point 1.5 of rigcirc );
+ label.top( btex $d$ etex, rp(dc) );
+endfig;
+
+beginfig(9);
+ Spread := 50;
+ f := (6,6,3.5);
+ numeric squareside, sray, cdiameter, cray, distmargin, linemargin, eloing;
+ squareside = 1;
+ cdiameter = squareside/0.88623;
+ cray = cdiameter/2.0;
+ sray = squareside/2.0;
+ distmargin = 0.5;
+ linemargin = 0.15;
+ eloing = 0.4;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color tracecol, outcol, incol;
+ tracecol = 0.5white;
+ outcol = black;
+ incol = 0.876white;
+ color va, vb, vc, vd, cen, bs, bc, fs, fc, ds, dc, os, oc, ncc;
+ va = (0,-sray,-sray);
+ vb = (0,sray,-sray);
+ vc = (0,sray,sray);
+ vd = (0,-sray,sray);
+ cen = (-distmargin,0,0);
+ bs = (0,-sray-linemargin,0);
+ bc = bs+cen;
+ fs = (0,sray+eloing,0);
+ ds = (0,sray+eloing-linemargin,0);
+ fc = fs+cen;
+ dc = ds+cen;
+ os = (linemargin,sray,0);
+ oc = (-distmargin-cdiameter-linemargin,sray,0);
+ ncc = (-distmargin-cray,sray,0);
+ path rigcirc, carrpath, square, circ, sline, cline, dline, oline;
+ square = rp(va)--rp(vb)--rp(vc)--rp(vd)--cycle;
+ circ = goodcirclepath( ncc, green, cray );
+ rigcirc = rigorouscircle( ncc, green, cray+linemargin );
+ carrpath = subpath (3,4) of rigcirc;
+ sline = rp(bs)--rp(fs);
+ cline = rp(bc)--rp(fc);
+ dline = rp(ds)--rp(dc);
+ oline = rp(os)--rp(oc);
+
+ draw oline withpen penc withcolor tracecol;
+ draw cline withpen penc withcolor tracecol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw sline withpen penc withcolor tracecol;
+ draw square withpen pena withcolor outcol;
+ draw square withpen penb withcolor incol;
+ drawdblarrow dline withpen penc withcolor tracecol;
+
+ pair begsarr, endsarr;
+ begsarr = rp((0,-sray-linemargin,linemargin));
+ endsarr = rp((0,-sray-linemargin,sray));
+ drawarrow begsarr--endsarr withpen penc withcolor tracecol;
+ drawarrow carrpath withpen penc withcolor tracecol;
+
+ label.lft( btex $I$ etex, rp((0,-sray-linemargin,sray-linemargin)) );
+ label.top( btex $+$ etex, point 3.5 of rigcirc );
+ label.bot( btex $d$ etex, rp(dc) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/fis3prex7.mp b/graphics/metapost/contrib/macros/featpost/example/fis3prex7.mp
new file mode 100644
index 0000000000..09a6521992
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fis3prex7.mp
@@ -0,0 +1,165 @@
+% fis3prex7.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\usepackage{mathpazo}\begin{document} etex;
+
+beginfig(7);
+ path bobine, bobina, Right, Up, Left, Down;
+ numeric scal, outeray, inneray, rotange, rotanga, tens, dist;
+ pen grossa;
+ scal = 15;
+ inneray = 0.5;
+ outeray = 2.1;
+ rotange = 0;
+ rotanga = 12;
+ tens = 3.6;
+ grossa = pencircle scaled 1pt;
+ dist = scal*0.35*(inneray+outeray);
+ Right = (inneray*scal*right)--(outeray*scal*right);
+ Up = (outeray*scal*up)--(inneray*scal*up);
+ Left = (inneray*scal*left)--(outeray*scal*left);
+ Down = (outeray*scal*down)--(inneray*scal*down);
+ bobine = (Right..tension tens..Up..Left..tension tens..Down..cycle)
+ rotated rotange;
+ bobina = bobine rotated rotanga;
+ draw Right;
+ draw Up;
+ draw Left;
+ draw Down;
+ draw fullcircle scaled (2*inneray*scal);
+ draw fullcircle scaled (2*outeray*scal);
+% draw bobine dashed evenly withpen grossa;
+ draw bobina withpen grossa;
+ z1 = dist*(right+up);
+ z2 = z1 rotated 90;
+ z3 = z1 rotated 180;
+ z4 = z1 rotated -90;
+ label( btex N etex, z1 );
+ label( btex S etex, z2 );
+ label( btex N etex, z3 );
+ label( btex S etex, z4 );
+endfig;
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, m, d;
+ u = 7.5pt;
+ m = 0.09;
+ d = 0.25;
+ f := (3,5,4);
+ Spread := 105;
+ TDAtiplen := 0.1;
+ TDAhalftipbase := 0.04;
+ TDAhalfthick := 0.02;
+ color v[];
+ v1 := (0,0,0);
+ v2 := (1,0,0);
+ v3 := (1,0,1);
+ v4 := (1,1,1);
+ v5 := (1,1,0);
+ v6 := (0,1,0);
+ v7 := (0,1,1);
+ v8 := (0,0,1);
+ v22 := (1+m,-m,d);
+ v23 := (1+m,-m,1-d);
+ v25 := (1-d,1+m,-m);
+ v26 := (d,1+m,-m);
+ v27 := (-m,1-d,1+m);
+ v28 := (-m,d,1+m);
+ path espiracubica;
+ espiracubica = rp(v1)--rp(v2)--rp(v3)--rp(v4)--
+ rp(v5)--rp(v6)--rp(v7)--rp(v8)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ undraw rp(v4)--rp(v5) withpen pencircle scaled 1.9u;
+ draw rp(v3)--rp(v4)--rp(v5)--rp(v6) withpen pencircle scaled u;
+ draw rp(v2)--rp(v5) dashed evenly;
+ draw rp(v4)--rp(v7) dashed evenly;
+ draw rp(v8)--rp(v3) dashed evenly;
+ draw rp(v6)--rp(v1) dashed evenly;
+ tdarrow(v22,v23);
+ tdarrow(v25,v26);
+ tdarrow(v27,v28);
+endfig;
+
+beginfig(2);
+ espiracubica := rp(v1)--rp(v2)--rp(v3)--rp(v4)--rp(v7)--rp(v6)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ draw rp(v8)--rp(v1) dashed evenly;
+ draw rp(v8)--rp(v3) dashed evenly;
+ draw rp(v8)--rp(v7) dashed evenly;
+ draw rp(v5)--rp(v2) dashed evenly;
+ draw rp(v5)--rp(v4) dashed evenly;
+ draw rp(v5)--rp(v6) dashed evenly;
+ tdarrow(v22,v23);
+endfig;
+
+beginfig(3);
+ espiracubica := rp(v1)--rp(v3)--rp(v5)--rp(v7)--cycle;
+ v31 := (d-m,0,d+m);
+ v33 := (1-d-m,0,1-d+m);
+ draw espiracubica withpen pencircle scaled u;
+ draw rp(v8)--rp(v1) dashed evenly;
+ draw rp(v8)--rp(v3) dashed evenly;
+ draw rp(v8)--rp(v7) dashed evenly;
+ draw rp(v5)--rp(v2) dashed evenly;
+ draw rp(v5)--rp(v4) dashed evenly;
+ draw rp(v5)--rp(v6) dashed evenly;
+ draw rp(v1)--rp(v2)--rp(v3)--rp(v4)--rp(v7)--rp(v6)--cycle dashed evenly;
+ tdarrow(v31,v33);
+endfig;
+
+beginfig(4);
+ espiracubica := rp(v1)--rp(v8)--rp(v3)--rp(v2)--rp(v5)--rp(v6)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ draw rp(v8)--rp(v1) dashed evenly;
+ draw rp(v8)--rp(v3) dashed evenly;
+ draw rp(v8)--rp(v7) dashed evenly;
+ draw rp(v5)--rp(v2) dashed evenly;
+ draw rp(v5)--rp(v4) dashed evenly;
+ draw rp(v5)--rp(v6) dashed evenly;
+ draw rp(v1)--rp(v2)--rp(v3)--rp(v4)--rp(v7)--rp(v6)--cycle dashed evenly;
+ tdarrow(v22,v23);
+ tdarrow(v26,v25);
+endfig;
+
+beginfig(5);
+ f := (5,3,4);
+ espiracubica := rp(v1)--rp(v2)--rp(v5)--rp(v3)--
+ rp(v8)--rp(v7)--rp(v4)--rp(v6)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ undraw rp(v3)--rp(v5) withpen pencircle scaled 1.9u;
+ draw rp(v2)--rp(v5)--rp(v3)--rp(v8) withpen pencircle scaled u;
+ draw rp(v2)--rp(v3)--rp(v4)--rp(v5)--rp(v6)--rp(v7) dashed evenly;
+ draw rp(v1)--rp(v8) dashed evenly;
+ tdarrow(v27,v28);
+endfig;
+
+beginfig(6);
+ espiracubica := rp(v1)--rp(v8)--rp(v2)--rp(v3)--
+ rp(v5)--rp(v4)--rp(v6)--rp(v7)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ undraw rp(v3)--rp(v5) withpen pencircle scaled 1.9u;
+ draw rp(v2)--rp(v3)--rp(v5)--rp(v4) withpen pencircle scaled u;
+ draw rp(v1)--rp(v2)--rp(v5)--rp(v6)--cycle dashed evenly;
+ draw rp(v3)--rp(v4)--rp(v7)--rp(v8)--cycle dashed evenly;
+ tdarrow(v22,v23);
+endfig;
+
+beginfig(8);
+ espiracubica := rp(v2)--rp(v3)--rp(v8)--rp(v7)--
+ rp(v5)--cycle;
+ draw espiracubica withpen pencircle scaled u;
+ draw rp(v3)--rp(v4)--rp(v7)--rp(v6)--rp(v1)--rp(v8) dashed evenly;
+ draw rp(v1)--rp(v2) dashed evenly;
+ draw rp(v4)--rp(v5)--rp(v6) dashed evenly;
+ tdarrow(v23,v22);
+ tdarrow(v27,v28);
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/fis3prey.mp b/graphics/metapost/contrib/macros/featpost/example/fis3prey.mp
new file mode 100644
index 0000000000..c7e1ebea16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/fis3prey.mp
@@ -0,0 +1,158 @@
+% fis3prey.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+beginfig(1);
+ Spread := 50;
+ f := (4,6,3.5);
+ path malhacub, rama, ramb, ramc, malhatet;
+ pen grossa, nuclear, negat;
+ color p[];
+ numeric lengax, lscal, arrowmarg, arrowshift;
+ pair tx, ty, tz;
+ lengax = 0.7;
+ lscal = 2;
+ arrowshift = 0.85;
+ arrowmarg = 0.13;
+ grossa = pencircle scaled 2.7pt;
+ nuclear = pencircle scaled 2.1pt;
+ negat = pencircle scaled 1.8pt;
+ p1 = (1,1,-1);
+ p2 = (-1,1,-1);
+ p3 = (-1,-1,-1);
+ p4 = (1,-1,-1);
+ p5 = (1,1,1);
+ p6 = (-1,1,1);
+ p7 = (-1,-1,1);
+ p8 = (1,-1,1);
+
+ p0 = p2 + arrowshift*N((1,0,1)) + arrowmarg*N((-1,0,1));
+ p9 = p5 - arrowshift*N((1,0,1)) + arrowmarg*N((-1,0,1));
+
+ z1 = rp(p1);
+ z2 = rp(p2);
+ z3 = rp(p3);
+ z4 = rp(p4);
+ z5 = rp(p5);
+ z6 = rp(p6);
+ z7 = rp(p7);
+ z8 = rp(p8);
+
+ z0 = rp(p0);
+ z9 = rp(p9);
+
+ tx = rp( p1 - (lengax,0,0) );
+ ty = rp( p1 - (0,lengax,0) );
+ tz = rp( p1 + (0,0,lengax) );
+
+ malhacub = z1--z2--z3--z4--z1--z5--z6--z7--z8--z5;
+ malhatet = z2--z7--z4--z5--cycle;
+ rama = z2--z6;
+ ramb = z3--z7;
+ ramc = z4--z8;
+ drawoptions( dashed evenly );
+ draw malhacub;
+ draw rama;
+ draw ramb;
+ draw ramc;
+ drawoptions( withpen grossa );
+ draw malhatet;
+
+ drawarrow z1--tx withpen negat;
+ drawarrow z1--ty withpen negat;
+ drawarrow z1--tz withpen negat;
+ %show "alert for fis3prey.mp";
+ label.lrt(btex $x$ etex scaled lscal, tx);
+ label.llft(btex $y$ etex scaled lscal, ty);
+ label.lft(btex $z$ etex scaled lscal, tz);
+ drawarrow z0--z9 withpen negat;
+endfig;
+
+beginfig(2);
+ Spread := 50;
+ f := 2.3*(6,2,3.5);
+ numeric lang, cray, lpos, llen, smar;
+ path circ, rigcirc, lone, ltwo, carrpath;
+ pen pena, penb, penc;
+ pena = pencircle scaled 1.3mm;
+ penb = pencircle scaled 0.95mm;
+ penc = pencircle scaled 0.4mm;
+ color outcol, incol;
+ outcol = black;
+ incol = 0.876white;
+ lang = 30;
+ cray = 1;
+ lpos = 0.57;
+ llen = 2.2;
+ smar = 0.15;
+ circ = goodcirclepath( black, green, cray );
+ rigcirc = rigorouscircle( black, green, cray+smar );
+ carrpath = subpath (3.2,4.5) of rigcirc;
+ lone = rp((-lpos,llen*cosd(lang),llen*sind(lang)))
+ --rp(-(lpos,llen*cosd(lang),llen*sind(lang)));
+ ltwo = rp((lpos,-llen*cosd(lang),llen*sind(lang)))
+ --rp((lpos,llen*cosd(lang),-llen*sind(lang)));
+ drawarrow carrpath withpen penc withcolor outcol;
+ draw circ withpen pena withcolor outcol;
+ draw circ withpen penb withcolor incol;
+ draw rp((-cray,0,0))--rp((-lpos,0,0)) dashed evenly;
+ draw lone withpen pena withcolor outcol;
+ draw lone withpen penb withcolor incol;
+ draw rp((lpos,0,0))--rp((-lpos,0,0)) dashed evenly;
+ draw rp((0,0,-cray))--rp((0,0,cray)) dashed evenly;
+ draw ltwo withpen pena withcolor outcol;
+ draw ltwo withpen penb withcolor incol;
+ draw rp((cray,0,0))--rp((lpos,0,0)) dashed evenly;
+ draw subpath (1,15) of circ withpen pena withcolor outcol;
+ draw subpath (0,16) of circ withpen penb withcolor incol;
+% label.top( btex $+$ etex, point 3 of rigcirc );
+endfig;
+
+beginfig(3);
+ TDAtiplen := 0.26; % tdarrow
+ TDAhalftipbase := 0.12; % Three-Dimensional
+ TDAhalfthick := 0.05; % Arrow
+ Spread := 23;
+ numeric len, rad, tle, tcr, tof;
+ len = 10;
+ rad = 0.15;
+ tle = 1.5;
+ tcr = 4;
+ tof = 0.35;
+ f := 10*(1.7,0.8,1.05);
+ tdarrow( (tcr,-1-tof,-1), (tcr-tle,-1-tof,-1) );
+ rigorousdisc( 0, true, (-2*len,-1,-1), rad, 3*len*red );
+ tdarrow( (tcr,1-tof,-1), (tcr-tle,1-tof,-1) );
+ draw rp((-1,-1+rad,-1))--rp((-1,1-rad,-1)) dashed evenly;
+ draw rp((1,-1+rad,-1))--rp((1,1-rad,-1)) dashed evenly;
+ rigorousdisc( 0, true, (-2*len,1,-1), rad, 3*len*red );
+ tdarrow( (-1,-tcr,1+tof), (-1,-tcr+tle,1+tof) );
+ draw rp((-1,-1,-1+rad))--rp((-1,-1,1-rad)) dashed evenly;
+ draw rp((-1,1,-1+rad))--rp((-1,1,1-rad)) dashed evenly;
+ draw rp((1,-1,-1+rad))--rp((1,-1,1-rad)) dashed evenly;
+ draw rp((1,1,-1+rad))--rp((1,1,1-rad)) dashed evenly;
+ rigorousdisc( 0, true, (-1,-len,1), rad, 2*len*green );
+ draw rp((-1+rad,-1,1))--rp((1-rad,-1,1)) dashed evenly;
+ draw rp((-1+rad,1,1))--rp((1-rad,1,1)) dashed evenly;
+ rigorousdisc( 0, true, (1,-len,1), rad, 2*len*green );
+ tdarrow( (1,-tcr,1-tof), (1,-tcr+tle,1-tof) );
+ label( btex $I_A$ etex, rp((tcr-0.5*tle,-1-2*tof,-1)) );
+ label( btex $I_B$ etex, rp((tcr-0.5*tle,1-2*tof,-1)) );
+ label( btex $I_C$ etex, rp((-1,-tcr+0.5*tle,1+2*tof)) );
+ label( btex $I_D$ etex, rp((1,-tcr+0.5*tle,1-2*tof)) );
+ produce_vga_border;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/frustum.mp b/graphics/metapost/contrib/macros/featpost/example/frustum.mp
new file mode 100644
index 0000000000..e48dd809ed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/frustum.mp
@@ -0,0 +1,48 @@
+% frustum.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+{\sffamily
+etex
+
+beginfig(1);
+% f := (5,3,4);
+ f := (5,3,0.4);
+% f := (5,3,-0.4);
+ numeric labscal;
+ picture labsa, labba, labsb, labd, labc;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labsa = btex $\vec{S}_1$ etex scaled labscal;
+ labsb = btex $\vec{S}_2$ etex scaled labscal;
+ labba = btex $\vec{B}_1$ etex scaled labscal;
+ labd= btex $D$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ whatisthis( black, 0.5red, green, 0.85, 0.8 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(0.85blue);
+ label.rt( labd, rp(0.4blue) );
+ drawarrow rp(black)--rp(0.5red);
+ label.ulft( labsa, rp(0.25red) );
+ drawarrow rp(black)--rp(green);
+ label.top( labba, rp((0,0.5,0)) );
+ drawarrow rp(0.85blue)--rp(0.8*0.5*red+0.85blue);
+ label.ulft( labsb, rp(0.2red+0.85blue) );
+ dotlabel.bot( labc, rp(black) );
+endfig;
+
+verbatimtex
+}
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/galvanometro-inducao.mp b/graphics/metapost/contrib/macros/featpost/example/galvanometro-inducao.mp
new file mode 100644
index 0000000000..f47ca02d4d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/galvanometro-inducao.mp
@@ -0,0 +1,245 @@
+% galvanometro-inducao.mp
+% Pedro Sebastiao
+% 2008
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc,hum,hdois,pnove,pdez;
+ color field, nalfa, ngamma, alfacnt, gammacnt, nazy, nax,pum,pdois,ptres,pquatro,pcinco,pseis,psete,poito,zpos,zppos,gammacnt;
+ path alfa, gamma, circ;
+ numeric nalfad, theta, radius, gammang, xxsize, yysize, zzsize, phi,teta;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos,inc,resize,sum,sdois;
+ numeric thetarad, thetapos, nalfapos, ngammapos,aux,alpha,ia,iz;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, alphalabel;
+ picture rlabel, ngammalabel, etalphalabel, philabel;
+ picture gammalabel, thetalabel;
+
+ f := (2,2.5,2.0);
+ % f := (2,2,20.0);
+ Spread := 100;
+ xxsize = 1.1;
+ xxpos = 6;
+ yysize = 1.1;
+ yypos = 6;
+ zzsize = 1;
+ zzpos = 4;
+ field = (0.7,0,0.3);
+ fieldpos = 2;
+ deltarad = 0.45;
+ deltapos = 3;
+ nalfad = 1.0;
+ theta = 25;
+ thetarad = 0.3;
+ thetapos = 2;
+ nalfapos = 7;
+ gammang = 65;
+ ngammapos = 7;
+ etalpharad = 0.4;
+ etalphapos = 2;
+ alphapos = 6;
+ gammapos = 0;
+ radius =0.5;
+ alpha := 60;
+
+ xxlabel = btex $x$ etex;
+ yylabel = btex $y$ etex;
+ zzlabel = btex $z$ etex;
+ alphalabel = btex $2\alpha$ etex;
+ fieldlabel = btex $\mathbf{B}$ etex;
+ thetalabel = btex $\theta$ etex;
+ rlabel = btex $r$ etex;
+ ngammalabel = btex $\vec{n}_\gamma$ etex;
+ etalphalabel= btex $\eta_\alpha$ etex;
+ philabel = btex $\phi$ etex;
+ gammalabel = btex $\gamma$ etex;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ hum = 0.9*azzc;
+ hdois = -0.9*azzc;
+ resize:=0.85;
+
+
+ pum := (resize*cosd(alpha),resize*sind(alpha),0.9);
+ pdois := (-resize*cosd(alpha),resize*sind(alpha),0.9);
+ ptres :=(resize*cosd(alpha),resize*sind(alpha),-0.9);
+ pquatro :=(-resize*cosd(alpha),resize*sind(alpha),-0.9);
+ draw rp(pum)..rp(ptres);
+ draw rp(pdois)..rp(pquatro);
+ pcinco := (resize*cosd(alpha),resize*sind(-alpha),0.9);
+ pseis := (-resize*cosd(alpha),resize*sind(-alpha),0.9);
+ psete :=(resize*cosd(alpha),resize*sind(-alpha),-0.9);
+ poito :=(-resize*cosd(alpha),resize*sind(-alpha),-0.9);
+ draw rp(pcinco)..rp(psete);
+ draw rp(pseis)..rp(poito);
+
+ anglinen( pum, pdois, hum, resize, alphalabel, 4 );
+ anglinen( ptres, pquatro, -hum, resize, "", deltapos );
+ anglinen( pcinco, pseis, hum, resize, "", deltapos );
+ anglinen( psete, poito, -hum, resize, "", deltapos );
+
+ draw rp(hum)..rp(pdois) dashed evenly;
+ draw rp(hum)..rp(pcinco) dashed evenly;
+
+ alpha:=60;
+ resize:=0.80;
+
+ pickup pencircle scaled 3;
+
+ pum := (resize*cosd(alpha),resize*sind(alpha),0.9);
+ pdois := (-resize*cosd(alpha),-resize*sind(alpha),0.9);
+ ptres :=(resize*cosd(alpha+180),-resize*sind(alpha),-0.9);
+ pquatro :=(resize*cosd(alpha),resize*sind(alpha),-0.9);
+ draw rp(pum)..rp(pdois);
+ draw rp(pdois)..rp(ptres);
+ draw rp(ptres)..rp(pquatro);
+ draw rp(pquatro)..rp(pum);
+
+ pickup pencircle scaled 1.5;
+ resize:=0.85;
+
+ for ia=60 step 10 until (120):
+ for iz=-0.0 step 1.4 until (0.71):
+ pum := (resize*cosd(ia),resize*sind(ia),iz);
+ pdois := (cosd(ia),sind(ia), iz);
+ ptres := (resize*cosd(ia+180),resize*sind(ia+180),iz);
+ pquatro := (cosd(ia+180),sind(ia+180), iz);
+ drawarrow rp(pum)..rp(pdois) withcolor red;
+ draw rp(pdois)..rp(pdois+(0,yysize,0)) withcolor red;
+ drawarrow rp(pquatro)..rp(ptres) withcolor red;
+ draw rp(pquatro-(0,yysize,0))..rp(pquatro) withcolor red;
+ hdois:=pum;
+ pcinco := (0.5*resize*cosd(ia),0.5*resize*sind(ia),iz);
+ pseis := (0.5*resize*cosd(360-ia),0.5*resize*sind(360-ia),iz);
+ pdez := (resize*cosd(360-ia),resize*sind(360-ia),iz);
+ for i=0 step 0.01 until 1:
+ poito := ((1-i)**3)*pum+3*i*((1-i)**2)*pcinco+3*(i**2)*(1-i)*pseis+(i**3)*pdez;
+ draw rp(hdois)..rp(poito) withcolor red;
+ hdois:=poito;
+ endfor
+ endfor
+ endfor
+
+ for ia=40 step 10 until (50):
+ for iz=-0.0 step 1.4 until (0.71):
+ pum := (resize*cosd(ia),resize*sind(ia),iz);
+ pdois := (cosd(ia),sind(ia), iz);
+ ptres := (resize*cosd(ia+180),resize*sind(ia+180),iz);
+ pquatro := (cosd(ia+180),sind(ia+180), iz);
+ drawarrow rp(pum)..rp(pdois) withcolor black;
+ draw rp(pdois)..rp(pdois+(0,yysize,0)) withcolor black;
+ drawarrow rp(pquatro)..rp(ptres) withcolor black;
+ draw rp(pquatro-(0,yysize,0))..rp(pquatro) withcolor black;
+ hdois:=pum;
+ pcinco := (0.5*resize*cosd(ia),0.5*resize*sind(ia),iz);
+ pseis := (0.5*resize*cosd(360-ia),0.5*resize*sind(360-ia),iz);
+ pdez := (resize*cosd(360-ia),resize*sind(360-ia),iz);
+ for i=0 step 0.01 until 1:
+ poito := ((1-i)**3)*pum+3*i*((1-i)**2)*pcinco+3*(i**2)*(1-i)*pseis+(i**3)*pdez;
+ draw rp(hdois)..rp(poito) withcolor black;
+ hdois:=poito;
+ endfor
+ endfor
+ endfor
+ for ia=130 step 10 until (140):
+ for iz=-0.0 step 1.4 until (0.71):
+ pum := (resize*cosd(ia),resize*sind(ia),iz);
+ pdois := (cosd(ia),sind(ia), iz);
+ ptres := (resize*cosd(ia+180),resize*sind(ia+180),iz);
+ pquatro := (cosd(ia+180),sind(ia+180), iz);
+ drawarrow rp(pum)..rp(pdois) withcolor black;
+ draw rp(pdois)..rp(pdois+(0,yysize,0)) withcolor black;
+ drawarrow rp(pquatro)..rp(ptres) withcolor black;
+ draw rp(pquatro-(0,yysize,0))..rp(pquatro) withcolor black;
+ hdois:=pum;
+ pcinco := (0.5*resize*cosd(ia),0.5*resize*sind(ia),iz);
+ pseis := (0.5*resize*cosd(360-ia),0.5*resize*sind(360-ia),iz);
+ pdez := (resize*cosd(360-ia),resize*sind(360-ia),iz);
+ for i=0 step 0.01 until 1:
+ poito := ((1-i)**3)*pum+3*i*((1-i)**2)*pcinco+3*(i**2)*(1-i)*pseis+(i**3)*pdez;
+ draw rp(hdois)..rp(poito) withcolor black;
+ hdois:=poito;
+ endfor
+ endfor
+ endfor
+
+
+ ia=60;
+ iz = 0.7;
+ pnove := (resize*cosd(ia),resize*sind(ia),iz);
+ pdez := (resize*cosd(360-ia),resize*sind(360-ia),iz);
+ pcinco := (0.5*resize*cosd(ia),0.5*resize*sind(ia),iz);
+ pseis := (0.5*resize*cosd(360-ia),0.5*resize*sind(360-ia),iz);
+ pickup pencircle scaled 5.5;
+% draw rp(pdois);
+% draw rp(pquatro);
+% draw rp(pnove);
+% draw rp(pdez);
+
+ pickup pencircle scaled 0.5;
+
+ draw rigorouscircle( (0,0,0), (0,0,1), 1) dashed evenly;
+ resize:=1;
+ alpha := 60;
+
+ iz:=0.0;
+ pum := (resize*cosd(alpha),resize*sind(alpha),iz);
+ pdois := (-resize*cosd(alpha),resize*sind(alpha),iz);
+ ptres :=(resize*cosd(alpha),resize*sind(alpha),-iz);
+ pquatro :=(-resize*cosd(alpha),resize*sind(alpha),-iz);
+ pcinco := (resize*cosd(alpha),resize*sind(-alpha),iz);
+ pseis := (-resize*cosd(alpha),resize*sind(-alpha),iz);
+ psete :=(resize*cosd(alpha),resize*sind(-alpha),-iz);
+ poito :=(-resize*cosd(alpha),resize*sind(-alpha),-iz);
+
+ anglinen( pum, pdois, hum-(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( ptres, pquatro, -hum+(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( pcinco, pseis, hum-(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( psete, poito, -hum+(0.9-iz)*azzc, resize, "", deltapos );
+
+ resize:=0.85;
+ alpha := 60;
+ pickup pencircle scaled 0.5;
+ iz:=0.0;
+ pum := (resize*cosd(alpha),resize*sind(alpha),iz);
+ pdois := (-resize*cosd(alpha),resize*sind(alpha),iz);
+ ptres :=(resize*cosd(alpha),resize*sind(alpha),-iz);
+ pquatro :=(-resize*cosd(alpha),resize*sind(alpha),-iz);
+ pcinco := (resize*cosd(alpha),resize*sind(-alpha),iz);
+ pseis := (-resize*cosd(alpha),resize*sind(-alpha),iz);
+ psete :=(resize*cosd(alpha),resize*sind(-alpha),-iz);
+ poito :=(-resize*cosd(alpha),resize*sind(-alpha),-iz);
+
+ anglinen( pum, pdois, hum-(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( ptres, pquatro, -hum+(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( pcinco, pseis, hum-(0.9-iz)*azzc, resize, "", deltapos );
+ anglinen( psete, poito, -hum+(0.9-iz)*azzc, resize, "", deltapos );
+
+
+ pickup pencircle scaled 1;
+ drawarrow rp(-azzc)..rp(1.3*azzc);
+% drawarrow rp(-axxc)..rp(axxc);
+% drawarrow rp(-ayyc)..rp(ayyc);
+ pickup pencircle scaled 1.5;
+% draw rp(alfacnt);
+% draw rp(gammacnt);
+% produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/gausslawframe.mp b/graphics/metapost/contrib/macros/featpost/example/gausslawframe.mp
new file mode 100644
index 0000000000..37b0c83794
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/gausslawframe.mp
@@ -0,0 +1,145 @@
+% gausslawframe.mp
+% adapted from an ANEEMATE example
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+numeric ParameterA, ParameterB, ParameterC, ParameterD, ParameterE;
+ParameterA = 0; %
+ParameterB = 0.02; % escala geral
+ParameterC = 0.8; % avanco da superficie
+ParameterD = 1; % deslocamento do viewcentr
+ParameterE = 3.1; % capitulo
+
+verbatimtex
+\documentclass{article}
+\usepackage{mathpazo}
+\newfont{\featfont}{logod10 scaled 500}
+\begin{document}
+etex
+
+def sfsur( expr H, V ) =
+ ( (cosd(H)*cosd(V),sind(H)*cosd(V),sind(V)) )
+enddef;
+
+primarydef a joi b = a & "," & b enddef;
+primarydef a empstr b = a & ditto & ditto & b enddef;
+
+beginfig(1);
+ color auxb, auxc, pa, pb, pc, pd;
+ numeric aux, i, j, cou, lim, max, numc, numofdiarr, radratio;
+ numeric astepv, asteph, radiub, arch, starter, coverlim, fieldlen;
+ numeric refav, refah, actad, minad, actav, actah, cop, lscale, maxlscale;
+ pen thickp;
+ string a, b, auxs;
+ picture AM, DPHI;
+ path p[];
+ pair auxp, lasp, lpoi, lvec;;
+ f := (2,3.5,4.6);
+ Spread := ParameterB[9,880];
+ fieldlen = 0.95;
+ radius = 1;
+ radratio = 3.5;
+ numc = 9;
+ numofdiarr = 120;
+ refah = 50;
+ refav = 30;
+ actad = ((refav+90)/180) ++ (refah/180);
+ minad = actad;
+ actah = refah;
+ actav = refav;
+ cop = 0;
+ thickp = pencircle scaled (ParameterB[0.2mm,1.2mm]);
+ maxlscale = 3;
+ lscale = ParameterB[1,maxlscale];
+ max = ceiling( radratio*numc*0.5 );
+ astepv = 180/max;
+ radiub = radius*radratio;
+ arch = radiub*astepv;
+ coverlim = ParameterC[3*astepv-90,89];
+ viewcentr := ParameterD[black,0.5*(radiub+fieldlen)*sfsur(actah,actav)];
+ pickup thickp;
+ getready( "tropicalglobe( numc, black, radius, blue );", black );
+ TDAtiplen := 0.15;
+ TDAhalftipbase := 0.06;
+ TDAhalfthick := 0.03;
+ cou = 0;
+ for j=1.5*astepv-90 step astepv until coverlim:
+ asteph := arch/(radiub*cosd(j-0.5*astepv));
+ lim := ceiling(360/asteph);
+ asteph := 360/lim;
+ starter := uniformdeviate( asteph );
+ for i=starter-180 step asteph until 180:
+ cou := incr( cou );
+ pa := radiub*sfsur(i-asteph,j-astepv);
+ pb := radiub*sfsur(i,j-astepv);
+ pc := radiub*sfsur(i,j);
+ pd := radiub*sfsur(i-asteph,j);
+ actad := ((i-0.5*asteph-refah)/180) ++ ((j-0.5*astepv-refav)/180);
+ if actad < minad:
+ minad := actad;
+ actav := j-0.5*astepv;
+ actah := i-0.5*asteph;
+ cop := cou;
+ fi;
+ auxc := radiub*sfsur( i-0.5*asteph, j-0.5*astepv );
+ p[cou] = rp(pa)--rp(pb)--rp(pc)--rp(pd)--cycle;
+ auxs := decimal( cou );
+ getready( "unfill p" & auxs & "; draw p" & auxs & ";", auxc );
+ a := cstr( auxc );
+ b := cstr( auxc+fieldlen*N(auxc) );
+ getready( "tdarrow(" & a joi b & ");", 1.1*auxc );
+ endfor;
+ endfor;
+ doitnow;
+ draw VGAborder;
+ AM = btex {\featfont ANEEMATE} etex;
+ label.ulft( AM rotated 90, point 1 of VGAborder);
+ unfill p[cop];
+ draw p[cop];
+ auxb := radiub*sfsur(actah,actav);
+ auxc := (radiub+fieldlen)*sfsur(actah,actav);
+ tdarrow( auxb, auxc );
+ drawoptions( withcolor blue );
+ label.lft( btex $\vec{E}$ etex scaled lscale, rp( auxc ) );
+ drawoptions( withpen thickp withcolor red );
+ auxc := (radiub+0.5*fieldlen)*sfsur(actah,actav);
+ drawarrow rp(auxb)--rp(auxc);
+ label.rt( btex $d\vec{A}$ etex scaled lscale, rp( auxc ) );
+ drawoptions( withcolor blue );
+ if (ParameterE>0.5) and (ParameterE<1.5):
+ DPHI = btex $d\Phi=\vec{E}\cdot d\vec{A} = E\,dA$ etex scaled maxlscale;
+ label.lrt( DPHI, point 3 of VGAborder);
+ fi;
+ if (ParameterE>1.5) and (ParameterE<3.5):
+ DPHI = btex $\Phi=\int d\Phi
+ =\int \vec{E}\cdot d\vec{A}
+ =\int E\,dA
+ =E\int dA
+ =4\pi R^2 E
+ =\frac{Q}{\mathcal{E}_0}
+ \Leftrightarrow
+ E= \frac{Q}{4\pi R^2\mathcal{E}_0}$ etex scaled maxlscale;
+ auxp = ( lrcorner DPHI ) - ( llcorner DPHI );
+ lasp = ( point 3 of VGAborder ) + auxp;
+ lvec = lasp - ( point 2 of VGAborder );
+ lpoi = ( point 3 of VGAborder ) - (ParameterE-2)*lvec;
+ label.lrt( DPHI, lpoi );
+ fi;
+
+ produce_vga_border;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/geombasic.mp b/graphics/metapost/contrib/macros/featpost/example/geombasic.mp
new file mode 100644
index 0000000000..413714c21e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geombasic.mp
@@ -0,0 +1,82 @@
+% geombasic.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+% Kind of graph that physicists do a lot. Play with the angles
+% and h a little to see what happens. Change the point of view f.
+% Change the position of symbols using the last argument of angline.
+
+beginfig(1);
+
+ f := (3,5,2);
+
+ Spread := 155;
+
+ ShiftV := origin;
+
+ gamma := 30;
+ theta := 15;
+ phi := 40;
+ h := 1.2;
+
+ p := 0.75;
+ ppp := 0.8;
+
+ mythick := 0.9pt;
+
+ color c[], n[], H;
+ c0 := (0,0,0);
+ n0 := (cosd(gamma),0,sind(gamma));
+ n1 := (cosd(gamma+theta),0,sind(gamma+theta));
+ n2 := (cosd(gamma)*cosd(phi),cosd(gamma)*sind(phi),sind(gamma));
+ n3 := (cosd(gamma+theta)*cosd(phi),
+ cosd(gamma+theta)*sind(phi),sind(gamma+theta));
+ n4 := (cosd(phi),sind(phi),0);
+ H := h*(-sind(gamma),0,cosd(gamma));
+ c1 := (0,0,Z(p*n1));
+ c2 := (0,0,Z(p*n2));
+ c3 := (1,0,0);
+ c4 := (0,0,1);
+ c5 := (X(H),0,0);
+ pickup pencircle scaled 1.25pt;
+ drawarrow rp(c0)..rp(n0);
+ drawarrow rp(c0)..rp(n3);
+ drawarrow rp(c0)..rp(H);
+ label.urt(btex $\vec{n}_0$ etex,rp(n0));
+ label.urt(btex $\vec{n}$ etex,rp(n3));
+ label.lft(btex $\vec{H}$ etex,rp(H));
+ pickup pencircle scaled mythick;
+ cartaxes(1,1,1);
+% draw rp(c0)--rp(p*n1) dashed evenly scaled 2;
+% draw rp(c0)--rp(p*n2) dashed evenly scaled 2;
+ draw rp(c0)--rp(c5)--rp(H) dashed evenly scaled 1.5;
+% draw rp(c1)..rp(p*n1) dashed evenly scaled 2;
+ draw rp(c1)..rp(p*n3) dashed evenly scaled 1.5;
+% draw rp(c2)..rp(p*n0) dashed evenly scaled 2;
+% draw rp(c2)..rp(p*n2) dashed evenly scaled 2;
+ draw rp(c0)..rp(n4) dashed evenly scaled 1.5;
+ angline(c3,n0,c0,ppp,btex $\gamma$ etex,lft);
+% angline(n0,n1,c0,p,btex $\theta$ etex,rt);
+% angline(p*n0,p*n2,c2,X(p*n0),btex $\phi$ etex,lrt);
+% angline(p*n1,p*n3,c1,X(p*n1),btex $\phi$ etex,ulft);
+% angline(n2,n3,c0,p,btex $\theta $ etex,urt);
+ angline(c4,H,c0,ppp,btex $\gamma$ etex,top);
+ angline(n4,n3,c0,p,btex $\gamma+\theta$ etex,lft);
+ angline(n4,c3,c0,p,btex $\phi$ etex,llft);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/geomcasq.mp b/graphics/metapost/contrib/macros/featpost/example/geomcasq.mp
new file mode 100644
index 0000000000..c02416b6f9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geomcasq.mp
@@ -0,0 +1,84 @@
+% geom_casq.mp
+% L. Nobre G.
+% 1999
+
+input featpost3Dplus2D;
+
+%input la3Dmacros;
+%input hlr3Dmacros;
+%input plan2Dmacros;
+%
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+
+ f := (1.7,1.2,1);
+
+ Spread := 150;
+
+ color gridvec, sizevec, currpos, starpos, bordpos, orig, axxc, ayyc, azzc;
+ numeric alphamax, long, base, thetamax;
+ axxc = (0.8,0,0);
+ ayyc = (0,0.7,0);
+ azzc = (0,0,0.4);
+ sizevec := (11,9,9);
+ gridvec := (0.1,0.1,0.1);
+ thetamax := 50;
+ alphamax := 70;
+ long := 0.65;
+ base := 0.3;
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ orig := starpos + 0.5*gridvec + (0.05,0,-0.1);
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ npf2 := 4;
+ F2p1 := (X(bordpos),Y(bordpos), -Z(bordpos));
+ F2p2 := (X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p3 := (-X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p4 := (-X(bordpos),Y(bordpos), -Z(bordpos));
+ NF := 2;
+
+ pickup pencircle scaled 1pt;
+ drawarrow rp(orig)..rp(orig+axxc);
+ drawarrow rp(orig)..rp(orig+ayyc);
+ drawarrow rp(orig)..rp(orig+azzc);
+ label.bot(btex z etex,rp(orig+axxc));
+ label.bot(btex x etex,rp(orig+ayyc));
+ label.lft(btex y etex,rp(orig+azzc));
+ pickup pencircle scaled 1.5pt;
+
+ starpos := (base,0,0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{n}_0$ etex,rp(starpos));
+
+ currpos := starpos;
+ starpos := long*(cosd(alphamax),sind(alphamax),0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{H}$ etex,rp(starpos));
+ angline(starpos,currpos,orig,0.55,btex $\alpha$ etex,bot);
+
+ starpos := base*(cosd(thetamax),sind(thetamax),0)+orig;
+ drawarrow rp(orig)..rp(starpos);
+ label.bot(btex $\vec{n}$ etex,rp(starpos));
+ angline(starpos,currpos,orig,0.2,btex $\theta$ etex,bot);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/geometricaverage.mp b/graphics/metapost/contrib/macros/featpost/example/geometricaverage.mp
new file mode 100644
index 0000000000..655d83dc9a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geometricaverage.mp
@@ -0,0 +1,60 @@
+% geometricaverage.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+%f := (5,3.5,1);
+%f := 0.4*(5,3.5,3);
+%f := 0.4*(5,1.5,1.5);
+f := 0.4*(2.5,5,1.5);
+beginfig(1);
+ cartaxes(1.5,2,1);
+ color va, vb, vc, vd, ve, vf;
+ va = black;
+ vb = (0,1.5,0);
+ vc = (1,1.5,0);
+ vd = red;
+ ve = (1,0.75,0);
+ vf = (0.5,1.5,0);
+ z3 = rp(va);
+ z4 = rp(vb);
+ z5 = rp(vc);
+ z6 = rp(vd);
+ z7 = rp(ve);
+ z9 = rp(vf);
+ draw z3--z4--z5--z6--cycle dashed evenly;
+ z1 = whatever[z3,z4];
+ z1 = whatever[z6,z5];
+ z2 = whatever[z6,z3];
+ z2 = whatever[z5,z4];
+ draw z1--z3 dashed evenly;
+ draw z1--z6 dashed evenly;
+ draw z2--z3 dashed evenly;
+ draw z2--z4 dashed evenly;
+ draw z2--z7 withcolor red;
+ draw z1--z9 withcolor red;
+ numeric laa, lba, lca;
+ laa = abs(z3-z1);
+ lba = abs(z4-z1);
+ lca = sqrt( laa )*sqrt( lba );
+ z8 = (lca/lba)[z1,z4];
+ draw z2--z8;
+
+ laa := 1/abs(z3-z2);
+ lba := 1/abs(z6-z2);
+ lca := 0.5*( laa + lba ); % What works is the arithmetic average of
+ % reciprocal distances!!
+ z10 = (lba/lca)[z2,z6];
+ draw z1--z10;
+ labels.top(1,2,3,4,5,6,7,8,9,10);
+
+ z11 = vp( vf-vd );
+ drawarrow z9--z11;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/geomfiguei.mp b/graphics/metapost/contrib/macros/featpost/example/geomfiguei.mp
new file mode 100644
index 0000000000..5bc1c58a34
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geomfiguei.mp
@@ -0,0 +1,71 @@
+% geomfiguei.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+
+ f := 3*(1.2,1.7,0.8);
+
+ Spread := 125;
+
+ color origr, nzero, nothr, ndxyl, vmagf, mfxzp, mfxyp, mfxxp;
+ numeric alphan, gamman, thetan, phiang, mfsize, axxc, ayyc, azzc;
+ numeric phiarmlen, alphafac;
+ axxc = 0.99;
+ ayyc = 0.87; % make this 1.28 when in twist-bend geometry
+ azzc = 0.82;
+ alphan = 170; % make this 90 to get the twist-bend geometry
+ gamman = 25;
+ thetan = 10;
+ phiang = 30;
+ mfsize = 1.25;
+ phiarmlen = 0.75;
+ alphafac = 1.4;
+ origr = (0,0,0);
+ nzero = (cosd(gamman),0,sind(gamman));
+ ndxyl = phiarmlen*(cosd(phiang),sind(phiang),0);
+ nothr = (cosd(phiang)*cosd(gamman+thetan),
+ sind(phiang)*cosd(gamman+thetan),sind(gamman+thetan));
+ vmagf = mfsize*(cosd(alphan)*sind(gamman),sind(alphan),
+ -cosd(alphan)*cosd(gamman));
+ mfxzp = (X(vmagf),0,Z(vmagf));
+ mfxyp = (X(vmagf),Y(vmagf),0);
+ mfxxp = (X(vmagf),0,0);
+ cartaxes( axxc, ayyc, azzc );
+ draw rp(origr)--rp(ndxyl) dashed evenly;
+ draw rp(origr)--rp(mfxzp)--rp(vmagf) dashed evenly;
+ draw rp(origr)--rp(mfxyp)--rp(vmagf) dashed evenly;
+ draw rp(origr)--rp(alphafac*mfxyp) dashed evenly;
+ draw rp(mfxzp)--rp(mfxxp)--rp(origr) dashed evenly;
+ draw rp(mfxyp)--rp(mfxxp) dashed evenly;
+ draw rp((0,0,Z(nothr)))--rp(nothr) dashed evenly;
+ angline(nzero,(1,0,0),origr,0.65,btex $\gamma$ etex,lft);
+ angline(ndxyl,(1,0,0),origr,0.5,btex $\phi$ etex,llft);
+ angline(ndxyl,nothr,origr,0.5,btex $\gamma+\theta$ etex,lft);
+ angline(vmagf,(0,0,1),origr,0.5,btex $\beta$ etex,top); % twist-bend
+ angline(mfxyp,(1,0,0),origr,0.8,btex $\alpha$ etex,bot);
+ pickup pencircle scaled 1.15pt;
+ drawarrow rp(origr)..rp(nzero);
+ drawarrow rp(origr)..rp(nothr);
+ drawarrow rp(origr)..rp(vmagf);
+ label.ulft(btex $\vec{n}_0$ etex,rp(nzero));
+ label.ulft(btex $\vec{n}$ etex,rp(nothr));
+ label.urt(btex $\vec{H}$ etex,rp(vmagf));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/geomfreder.mp b/graphics/metapost/contrib/macros/featpost/example/geomfreder.mp
new file mode 100644
index 0000000000..3fb9f616a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geomfreder.mp
@@ -0,0 +1,94 @@
+% geom_freder.mp
+% L. Nobre G.
+% 2000
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article} \usepackage{beton} \usepackage{concmath} \usepackage{ccfonts} \begin{document} etex
+
+beginfig(1);
+
+ f := (1.7,1.2,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, long, base, thetamax;
+ path closingface;
+ sizevec := (11,9,7);
+ gridvec := (0.1,0.1,0.1);
+ thetamax := 50;
+ long := 0.08;
+ base := 0.1;
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ npf2 := 4;
+ F2p1 := (X(bordpos),Y(bordpos), -Z(bordpos));
+ F2p2 := (X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p3 := (-X(bordpos),-Y(bordpos), -Z(bordpos));
+ F2p4 := (-X(bordpos),Y(bordpos), -Z(bordpos));
+ NF := 2;
+ draw facepath(1);
+ counter := 1;
+ for i= X(sizevec) upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 0;
+ theta := 0;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ phi := thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ theta := 90+thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ for i=1 upto X(sizevec)-1:
+ for j=Y(sizevec) upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 0;
+ theta := 0;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ phi := thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ theta := 90+thetamax*cosd(90*Z(currpos)/abs(Z(starpos)));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, base, false );
+ closingface = facepath(2);
+ fill closingface withcolor background;
+ draw closingface;
+ pickup pencircle scaled 1pt;
+ currpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos));
+ starpos := (-X(bordpos)+X(gridvec),Y(bordpos)+4*Y(gridvec), Z(bordpos));
+ drawarrow rp(currpos)..rp(starpos);
+ label.bot(btex $y$ etex,rp(starpos));
+ currpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos));
+ starpos := (-X(bordpos)+X(gridvec),Y(bordpos), Z(bordpos)+4*Z(gridvec));
+ drawarrow rp(currpos)..rp(starpos);
+ label.lft(btex $z$ etex,rp(starpos));
+ currpos := (X(bordpos),-Y(bordpos)+Y(gridvec), Z(bordpos));
+ starpos := (X(bordpos)+4*X(gridvec),-Y(bordpos)+Y(gridvec), Z(bordpos));
+ drawarrow rp(currpos)..rp(starpos);
+ label.bot(btex $x$ etex,rp(starpos));
+
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/geommine.mp b/graphics/metapost/contrib/macros/featpost/example/geommine.mp
new file mode 100644
index 0000000000..99aea8fa67
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geommine.mp
@@ -0,0 +1,106 @@
+% geommine.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+%\usepackage{beton}
+%\usepackage{concmath}
+%\usepackage{ccfonts}
+%\usepackage{bbold}
+\begin{document}
+etex
+
+prologues := 3;
+
+beginfig(1);
+
+ beta := 15;
+ alpha := 40;
+ psi := 26;
+ theta := 32;
+ phi := -33;
+ h := 1.35;
+ v := 0.4;
+ xlen := 1.2;
+ ylen := 0.65;
+ phirad := 0.67;
+
+ f := (3,5,3);
+ Spread := 100;
+
+ color c[], n[], H, h[], Vel, xloc, yloc, vx, vy;
+ c0 := (0,0,0);
+ cartaxes(xlen,ylen,1.0);
+ n0 := (cosd(beta),0,sind(beta));
+ n3 := (0,sind(phi),0);
+ n2 := n0 + n3;
+ n5 := n3 + cosd(phi)*n0;
+ n4 := cosd(theta)*n5;
+ Fx:=sind(alpha)*cosd(beta)-cosd(alpha)*cosd(psi)*sind(beta);
+ Fy:=cosd(alpha)*sind(psi);
+ Fz:=sind(alpha)*sind(beta)+cosd(alpha)*cosd(psi)*cosd(beta);
+ nx:=cosd(theta)*cosd(phi)*cosd(beta)-sind(theta)*sind(beta);
+ ny:=cosd(theta)*sind(phi);
+ nz:=cosd(theta)*cosd(phi)*sind(beta)+sind(theta)*cosd(beta);
+ n1 := (nx,ny,nz);
+ xloc := xlen*n1;
+ yloc := ylen*(-greenpart n1,redpart n1,0);
+ H := h*(Fx,Fy,Fz);
+ Vel := v*(Fx,Fy,Fz);
+ vx := v*sind(phi)*n1;
+ vy := v*cosd(phi)*N(yloc);
+ h4 := h*sind(phi)*n1;
+ h5 := h*cosd(phi)*N(yloc);
+ h2 := (-h*sind(beta)*cosd(alpha)*cosd(psi),
+ 0,
+ h*cosd(beta)*cosd(alpha)*cosd(psi));
+ h3 := (0,h*cosd(alpha)*sind(psi),0);
+ h1 := h2 + h3;
+ draw rp(n0)--rp(n2)--rp(n3)--rp(c0);
+ draw rp(c0)--rp(n4)--rp(n1);
+ draw rp(n5)--rp(n4);
+ draw rp(c0)--rp(h2)--rp(h1)--rp(h3)--cycle;
+ draw rp(c0)--rp(h1)--rp(H);
+% draw rp(h4)--rp(H)--rp(h5);
+ label.llft(btex $\vec{n}_0$ etex,rp(n0));
+ label.urt(btex $\vec{n}$ etex,rp(n1));
+ label.llft(btex $\vec{H}$ etex,rp(H));
+% label.urt(btex $\vec{v}$ etex,rp(Vel));
+% label.bot(btex $\mathbb{x}$ etex,rp(xloc));
+% label.bot(btex $\mathbb{y}$ etex,rp(yloc));
+% label.lrt(btex $\vec{v}_\mathbb{x}$ etex,rp(vx));
+% label.urt(btex $\vec{v}_\mathbb{y}$ etex,rp(vy));
+% label.lft(btex $\vec{H}_\mathbb{x}$ etex,rp(h4));
+% label.urt(btex $\vec{H}_\mathbb{y}$ etex,rp(h5));
+% pickup pencircle scaled 1pt;
+ angline(n0,n5,c0,phirad,btex $\phi$ etex,lft);
+% angline((0,1,0),yloc,c0,phirad,btex $\phi$ etex,rt);
+ angline(h2,h1,c0,0.5,btex $\psi$ etex,urt);
+ angline(H,h1,c0,0.9,btex $\alpha$ etex,top);
+ angline(n5,n1,c0,0.6,btex $\theta$ etex,ulft);
+ angline((0,0,1),h2,c0,0.5,btex $\beta$ etex,top);
+ angline((1,0,0),n0,c0,0.6,btex $\beta$ etex,rt);
+% drawarrow rp(c0)..rp(xloc);
+% drawarrow rp(c0)..rp(yloc);
+ pickup pencircle scaled 1.3pt;
+ drawarrow rp(c0)..rp(n0);
+ drawarrow rp(c0)..rp(n1);
+ drawarrow rp(c0)..rp(H);
+% drawarrow rp(c0)..rp(Vel);
+% drawarrow rp(c0)..rp(vx);
+% drawarrow rp(c0)..rp(vy);
+% drawarrow rp(c0)..rp(h4);
+% drawarrow rp(c0)..rp(h5);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/geomsrinath.mp b/graphics/metapost/contrib/macros/featpost/example/geomsrinath.mp
new file mode 100644
index 0000000000..9e34bbd42b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/geomsrinath.mp
@@ -0,0 +1,57 @@
+% geomsrinath.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+verbatimtex
+ \documentclass{article}
+ \usepackage{palatino,mathpazo}
+ \begin{document}
+etex
+
+beginfig(1);
+ f := 3*(1.7,1.2,0.8);
+ Spread := 125;
+ numeric thetan, phiang, faca, phiray, cray, mar;
+ color origr, nothr, mfxxp, mfxyp, mfyyp, mfzzp, vmagf, mfxyext, ac, bc;
+ thetan = 55;
+ phiang = 65;
+ faca = 1.15;
+ phiray = 0.485;
+ cray = 0.067;
+ origr = (0,0,0);
+ mar = 0.15;
+ vmagf = faca*(cosd(phiang)*cosd(thetan),sind(phiang)*cosd(thetan),sind(thetan));
+ nothr = (0,0,1);
+ bc = (faca-2*mar)*N(vmagf);
+ ac = mar*N(vmagf);
+ mfxxp = (X(vmagf),0,0);
+ mfxyp = (X(vmagf),Y(vmagf),0);
+ mfyyp = (0,Y(vmagf),0);
+ mfzzp = (0,0,Z(vmagf));
+ cartaxes( 0.8, 0.8, 1 );
+ rigorousdisc(0,true,ac,cray,bc);
+ draw rp(origr)--rp(mfxyp)--rp(vmagf)--rp(mfzzp) dashed evenly;
+ draw rp(mfxxp)--rp(mfxyp)--rp(mfyyp) dashed evenly;
+ if conorm(mfxyp)<phiray:
+ mfxyext = phiray*N(mfxyp);
+ draw rp(mfxyext)--rp(mfxyp) dashed evenly;
+ fi;
+ angline(mfxxp,mfxyp,origr,phiray,btex $\phi$ etex,bot);
+ angline(vmagf,nothr,origr,0.5,btex $\theta$ etex,top);
+ pickup pencircle scaled 1.15pt;
+ drawarrow rp(origr)..rp(vmagf);
+ label.rt(btex $\vec{n}$ etex,rp(nothr));
+ label.rt(btex $\hat{a}$ etex,rp(vmagf));
+ pickup pencircle scaled 2.6pt;
+ draw rp(ac);
+ draw rp(ac+bc);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/gnupost.mp b/graphics/metapost/contrib/macros/featpost/example/gnupost.mp
new file mode 100644
index 0000000000..9ee7d1d432
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/gnupost.mp
@@ -0,0 +1,110 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+
+beginfig(1);
+ path PreeditedPath[];
+ color bluecolor;
+ bluecolor = (0.607845,0.61569,0.823535);
+
+ linecap := butt;
+ linejoin := mitered;
+
+ PreeditedPath1 = hide(z1=(26.4846,113.11))z1..controls hide(z2=(47.8035,130.71))z2 and hide(z3=(67.1843,138.71))z3..hide(z4=(82.689,138.71))z4
+ ..controls hide(z5=(98.1936,138.71))z5 and hide(z6=(123.389,117.91))z6..hide(z7=(144.708,117.91))z7
+ ..controls hide(z8=(164.088,117.91))z8 and hide(z9=(173.719,138.71))z9..hide(z10=(204.788,138.71))z10
+ ..controls hide(z11=(233.859,138.71))z11 and hide(z12=(241.615,116.244))z12..hide(z13=(290.064,117.91))z13
+ ..controls hide(z14=(336.578,119.51))z14 and hide(z15=(342.304,140.311))z15..hide(z16=(363.711,140.311))z16
+ ..controls hide(z17=(385.03,140.311))z17 and hide(z18=(408.181,129.21))z18..hide(z19=(419.916,111.51))z19
+ ..controls hide(z20=(400.535,125.91))z20 and hide(z21=(376.046,119.227))z21..hide(z22=(354.021,109.91))z22
+ ..controls hide(z23=(328.981,99.3196))z23 and hide(z24=(295.878,85.9104))z24..hide(z25=(268.745,95.5105))z25
+ ..controls hide(z26=(241.612,105.11))z26 and hide(z27=(214.479,109.91))z27..hide(z28=(191.222,101.91))z28
+ ..controls hide(z29=(167.965,93.9104))z29 and hide(z30=(127.265,85.9104))z30..hide(z31=(100.132,101.91))z31
+ ..controls hide(z32=(72.9985,117.91))z32 and hide(z33=(55.5559,121.11))z33..cycle;
+
+ filldraw PreeditedPath1 withcolor bluecolor;
+
+ PreeditedPath3 = hide(z67=(101.492,205.833))z67..controls hide(z68=(114.075,219.402))z68 and hide(z69=(125.514,225.569))z69..hide(z70=(134.666,225.569))z70
+ ..controls hide(z71=(143.817,225.569))z71 and hide(z72=(158.688,209.533))z72..hide(z73=(171.271,209.533))z73
+ ..controls hide(z74=(182.71,209.533))z74 and hide(z75=(188.394,225.569))z75..hide(z76=(206.733,225.569))z76
+ ..controls hide(z77=(223.892,225.569))z77 and hide(z78=(228.469,208.249))z78..hide(z79=(257.065,209.533))z79
+ ..controls hide(z80=(284.52,210.767))z80 and hide(z81=(287.899,226.803))z81..hide(z82=(300.535,226.803))z82
+ ..controls hide(z83=(313.118,226.803))z83 and hide(z84=(326.782,218.245))z84..hide(z85=(333.708,204.599))z85
+ ..controls hide(z86=(322.269,215.701))z86 and hide(z87=(307.815,210.548))z87..hide(z88=(294.815,203.366))z88
+ ..controls hide(z89=(280.036,195.201))z89 and hide(z90=(260.497,184.863))z90..hide(z91=(244.482,192.264))z91
+ ..controls hide(z92=(228.467,199.665))z92 and hide(z93=(212.452,203.366))z93..hide(z94=(198.725,197.198))z94
+ ..controls hide(z95=(184.998,191.031))z95 and hide(z96=(160.976,184.863))z96..hide(z97=(144.961,197.198))z97
+ ..controls hide(z98=(128.946,209.533))z98 and hide(z99=(118.651,212))z99..cycle;
+
+ filldraw PreeditedPath3 withcolor bluecolor;
+
+ PreeditedPath4 = hide(z166=(217.85,207.797))z166
+ ..controls hide(z167=(236.119,207.797))z167 and hide(z168=(249.691,188.745))z168..hide(z169=(249.691,162.646))z169
+ ..controls hide(z170=(249.691,137.069))z170 and hide(z171=(236.38,119.583))z171..hide(z172=(217.328,119.583))z172
+ ..controls hide(z173=(200.103,119.583))z173 and hide(z174=(188.097,137.069))z174..hide(z175=(188.097,162.646))z175
+ ..controls hide(z176=(188.097,189.267))z176 and hide(z177=(200.103,207.797))z177..cycle;
+
+ clip currentpicture to PreeditedPath4;
+ picture gthrough;
+ gthrough = currentpicture;
+ filldraw PreeditedPath1 withcolor bluecolor;
+ filldraw PreeditedPath3 withcolor bluecolor;
+
+ PreeditedPath5 = hide(z133=(249.169,235.984))z133--hide(z134=(249.169,214.322))z134..controls hide(z135=(238.207,231.025))z135 and hide(z136=(226.201,238.333))z136..hide(z137=(210.02,238.333))z137
+ ..controls hide(z138=(176.614,238.333))z138 and hide(z139=(151.558,205.709))z139..hide(z140=(151.558,162.124))z140
+ ..controls hide(z141=(151.558,118.278))z141 and hide(z142=(174.526,89.0466))z142..hide(z143=(209.237,89.0466))z143
+ ..controls hide(z144=(225.679,89.0466))z144 and hide(z145=(235.597,94.0056))z145..hide(z146=(249.169,109.404))z146
+ --hide(z147=(249.169,90.3516))z147..controls hide(z148=(249.169,73.3872))z148 and hide(z149=(236.38,61.6428))z149..hide(z150=(218.111,61.6428))z150
+ ..controls hide(z151=(204.278,61.6428))z151 and hide(z152=(195.144,67.3845))z152..hide(z153=(192.273,78.0852))z153
+ --hide(z154=(154.429,78.0852))z154..controls hide(z155=(154.69,67.1235))z155 and hide(z156=(158.866,59.5549))z156..hide(z157=(168.262,51.7251))z157
+ ..controls hide(z158=(179.484,42.5906))z158 and hide(z159=(195.144,38.1536))z159..hide(z160=(216.806,38.1536))z160
+ ..controls hide(z161=(259.347,38.1536))z161 and hide(z162=(283.88,57.2061))z162..hide(z163=(283.88,90.3516))z163
+ --hide(z164=(283.88,235.984))z164--hide(z165=(249.169,235.984))z165--cycle;
+
+ filldraw PreeditedPath5;
+
+ unfill PreeditedPath4;
+ draw gthrough;
+
+ PreeditedPath6 = hide(z178=(58.4002,162.71))z178..controls hide(z179=(76,180.311))z179 and hide(z180=(92,188.311))z180..hide(z181=(104.8,188.311))z181
+ ..controls hide(z182=(117.6,188.311))z182 and hide(z183=(138.4,167.51))z183..hide(z184=(156,167.51))z184
+ ..controls hide(z185=(172,167.51))z185 and hide(z186=(179.95,188.311))z186..hide(z187=(205.6,188.311))z187
+ ..controls hide(z188=(229.6,188.311))z188 and hide(z189=(236.003,165.844))z189..hide(z190=(276,167.51))z190
+ ..controls hide(z191=(314.4,169.11))z191 and hide(z192=(319.127,189.91))z192..hide(z193=(336.8,189.91))z193
+ ..controls hide(z194=(354.4,189.91))z194 and hide(z195=(373.512,178.81))z195..hide(z196=(383.2,161.11))z196
+ ..controls hide(z197=(367.2,175.51))z197 and hide(z198=(346.983,168.826))z198..hide(z199=(328.8,159.51))z199
+ ..controls hide(z200=(308.128,148.92))z200 and hide(z201=(280.8,135.51))z201..hide(z202=(258.4,145.11))z202
+ ..controls hide(z203=(236,154.71))z203 and hide(z204=(213.6,159.51))z204..hide(z205=(194.4,151.51))z205
+ ..controls hide(z206=(175.2,143.51))z206 and hide(z207=(141.6,135.51))z207..hide(z208=(119.2,151.51))z208
+ ..controls hide(z209=(96.8001,167.51))z209 and hide(z210=(82.4002,170.71))z210..cycle;
+
+ filldraw PreeditedPath6 withcolor bluecolor;
+
+ PreeditedPath8 = hide(z244=(76,61.8328))z244..controls hide(z245=(93.6001,75.4011))z245 and hide(z246=(109.6,81.5686))z246..hide(z247=(122.4,81.5686))z247
+ ..controls hide(z248=(135.2,81.5686))z248 and hide(z249=(156,65.5332))z249..hide(z250=(173.6,65.5332))z250
+ ..controls hide(z251=(189.6,65.5332))z251 and hide(z252=(197.55,81.5686))z252..hide(z253=(223.2,81.5686))z253
+ ..controls hide(z254=(247.2,81.5686))z254 and hide(z255=(253.603,64.2485))z255..hide(z256=(293.6,65.5332))z256
+ ..controls hide(z257=(332,66.7668))z257 and hide(z258=(336.728,82.802))z258..hide(z259=(354.4,82.802))z259
+ ..controls hide(z260=(372,82.802))z260 and hide(z261=(391.112,74.2446))z261..hide(z262=(400.8,60.5994))z262
+ ..controls hide(z263=(384.8,71.7007))z263 and hide(z264=(364.583,66.5479))z264..hide(z265=(346.4,59.366))z265
+ ..controls hide(z266=(325.728,51.2012))z266 and hide(z267=(298.4,40.8635))z267..hide(z268=(276,48.2644))z268
+ ..controls hide(z269=(253.6,55.6653))z269 and hide(z270=(231.2,59.366))z270..hide(z271=(212,53.1985))z271
+ ..controls hide(z272=(192.8,47.031))z272 and hide(z273=(159.2,40.8635))z273..hide(z274=(136.8,53.1985))z274
+ ..controls hide(z275=(114.4,65.5332))z275 and hide(z276=(100,68.0002))z276..cycle;
+
+ filldraw PreeditedPath8 withcolor bluecolor;
+
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/gnupost3Dlogo.mp b/graphics/metapost/contrib/macros/featpost/example/gnupost3Dlogo.mp
new file mode 100644
index 0000000000..aca279ef0e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/gnupost3Dlogo.mp
@@ -0,0 +1,125 @@
+% gnupost3Dlogo.mp
+% 2006
+% L. Nobre G.
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+prologues := 1;
+
+def converterfunc( expr Pair ) =
+ begingroup
+ save factconv, angstart, ystart, cx, cy, raux, aaux, xaux, yaux, zaux;
+ numeric factconv, angstart, ystart, cx, cy, raux, aaux, xaux, yaux, zaux;
+ save overtang, factang;
+ numeric overtang, factang;
+ ystart = 2;
+ factconv = 0.0046;
+ angstart = 70;
+ overtang = 55;
+ factang = 12;
+ cx = factconv*(ypart Pair);
+ cy = ystart+factconv*(xpart Pair);
+ raux = cy*sind(overtang);
+ aaux = angstart-factang*factconv*(xpart Pair)-(180/3.14159)*cx/raux;
+ zaux = cy*cosd(overtang);
+ yaux = raux*sind(aaux);
+ xaux = raux*cosd(aaux);
+ ( rp( ( xaux, yaux, zaux ) ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u, nstripes, aspecratio, minskip, maxskip, shiftlim, shiftmin;
+ numeric nbreaks, i, j, ymax, shiftx, lefh, righ, actualx, newx;
+ numeric prevlefh, prevrigh, xmax, auxan, auxr, cdiam;
+ path lefp[], rigp[], strp[], backpath;
+ pair shif, reflef, refrig, auxa, auxb;
+ boolean exitcondition;
+ u = 1cm;
+ nstripes = 7;
+ aspecratio = 1.7;
+ minskip = 0.5u; % must not be too small
+ maxskip = 4u;
+ shiftlim = 0.7u;
+ shiftmin = 0.25u;
+ cdiam = 0.65u;
+ xmax = (2*nstripes-1)*u;
+ ymax = aspecratio*xmax;
+ backpath = origin--(0,xmax)--(ymax,xmax)--(ymax,0)--cycle;
+ prevlefh = ymax;
+ prevrigh = ymax;
+ actualx = u;
+ for i=1 upto nstripes:
+ lefp[i] = ((2*i-1)*u,ymax);
+ rigp[i] = ((2*i-1)*u,ymax)--(2*i*u,ymax);
+ endfor;
+ exitcondition = false;
+ forever:
+ auxr := uniformdeviate(2)-1;
+ if auxr > 0:
+ newx := actualx + shiftmin + (shiftlim-shiftmin)*auxr;
+ else:
+ newx := actualx - shiftmin + (shiftlim-shiftmin)*auxr;
+ fi;
+ lefh := prevlefh - minskip - uniformdeviate(maxskip-minskip);
+ righ := prevrigh - minskip - uniformdeviate(maxskip-minskip);
+ if lefh < minskip:
+ lefh := minskip;
+ exitcondition := true;
+ fi;
+ if righ < minskip:
+ righ := minskip;
+ exitcondition := true;
+ fi;
+ reflef := (newx,lefh);
+ refrig := (newx+xmax,righ);
+ auxan := angle(refrig-reflef);
+ shif := (newx-actualx)*(1,sind(auxan)/cosd(auxan));
+ for i=1 upto nstripes:
+ auxa := point (length lefp[i]) of lefp[i];
+ auxb := point (length rigp[i]) of rigp[i];
+ pair poil, poir;
+ poil = auxa+whatever*down;
+ poil = whatever[reflef,refrig];
+ poir = auxb+whatever*down;
+ poir = whatever[reflef,refrig];
+ lefp[i] := lefp[i]--poil--(poil+shif);
+ rigp[i] := rigp[i]--poir--(poir+shif);
+ endfor;
+ actualx := newx;
+ prevlefh := lefh;
+ prevrigh := righ;
+ exitif exitcondition;
+ endfor;
+ for i=1 upto nstripes:
+ auxa := point (length lefp[i]) of lefp[i];
+ auxb := point (length rigp[i]) of rigp[i];
+ pair poil, poir;
+ poil = auxa+whatever*down;
+ poil = whatever[origin,right];
+ poir = auxb+whatever*down;
+ poir = whatever[origin,right];
+ lefp[i] := lefp[i]--poil--poir;
+ rigp[i] := rigp[i]--poir;
+ strp[i] = buildcycle( lefp[i], reverse rigp[i] );
+ endfor;
+ fill backpath withcolor (0.55blue);
+ for i=nstripes+1 upto nstripes+50:
+ strp[i] = fullcircle scaled cdiam shifted
+ (u+uniformdeviate(ymax-2u),u+uniformdeviate(xmax-2u));
+ fill strp[i];
+ endfor;
+ ShiftV := (0.3*ymax,0);
+ viewcentr := (0,0.7,1);
+ f := (3,0,0);
+ Spread := 70;
+ for i=1 upto nstripes:
+ fill closedpathinspace( strp[i], 8, converterfunc ) withcolor red;
+ endfor;
+ clip currentpicture to backpath;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/goldenellipse.mp b/graphics/metapost/contrib/macros/featpost/example/goldenellipse.mp
new file mode 100644
index 0000000000..84bf24fc5f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/goldenellipse.mp
@@ -0,0 +1,57 @@
+% goldenellipse.mp
+% L. Nobre G.
+% 2012
+
+beginfig(1);
+ numeric u, phi, i, dstep, goldang;
+ pen thepen;
+ path ellia, ellib, ellic, ellid, ellip;
+ path evola, evolb, evolc, evold, evolu;
+ path squar;
+ pair paira, pairb, pairc, paird;
+ pair ellfa, squab, ellfc, squad;
+ pair goldp;
+ u = 5cm;
+ phi = 0.5*(1+sqrt(5));
+ dstep = 5;
+ goldang = angle(1,1/phi);
+ thepen = pencircle scaled 0.05u;
+ paira = (phi,0);
+ pairb = (0,1);
+ pairc = (-phi,0);
+ paird = (0,-1);
+ ellfa = (1,0);
+ squab = (0,-phi);
+ ellfc = (-1,0);
+ squad = (0,phi);
+ goldp = (phi*cosd(goldang),sind(goldang));
+ ellia = (phi*cosd(dstep),sind(dstep))
+ for i=2dstep step dstep until 90-dstep:
+ ..(phi*cosd(i),sind(i))
+ endfor;
+ ellib = reverse ellia xscaled -1;
+ ellic = ellia scaled -1;
+ ellid = reverse ellia yscaled -1;
+ ellip = paira--ellia--pairb--ellib--pairc--ellic--paird--ellid--cycle;
+ evola = (cosd(dstep)**3,-phi*(sind(dstep)**3))
+ for i=2dstep step dstep until 90-dstep:
+ ..(cosd(i)**3,-phi*(sind(i)**3))
+ endfor;
+ evolb = reverse evola xscaled -1;
+ evolc = evola scaled -1;
+ evold = reverse evola yscaled -1;
+ evolu = ellfa--evola--squab--evolb--ellfc--evolc--squad--evold--cycle;
+ squar = paira--squab--pairc--squad--cycle;
+ z1 = goldp+whatever*(1,-1);
+ y1 = 0;
+ fill (x1,0)--(0,x1)--(-x1,0)--(0,-x1)--cycle withcolor blue;
+ fill squar withcolor red;
+ fill ellip;
+ fill ellfa--pairb--ellfc--paird--cycle withcolor red;
+ draw evolu withcolor blue;
+ picture tmp;
+ tmp = currentpicture;
+ currentpicture := nullpicture;
+ draw tmp rotated 45 scaled u shifted (10.5cm,14cm) withpen thepen;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/graphene.mp b/graphics/metapost/contrib/macros/featpost/example/graphene.mp
new file mode 100644
index 0000000000..fbd5f34381
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/graphene.mp
@@ -0,0 +1,81 @@
+% graphene.mp
+% L. Nobre G.
+% 2011
+
+prologues := 1;
+
+input featpost3Dplus2D;
+
+f := (9,13,7);
+Spread := 15;
+
+beginfig(1);
+ numeric s, c, rs, rc, i, j;
+ boolean isodd;
+ color ua, ub, uc, ta, tb;
+ path t;
+ s = 0.5;
+ c = sqrt(3)/2;
+ rs = 0.23;
+ rc = 0.15;
+ ua = (-s,c,0);
+ ub = (s,c,0);
+ uc = (1,0,0);
+ fill VGAborder withcolor 0.65white;
+ isodd = true;
+ j = 1;
+ ta = (-4.5,-5,0);
+ t = rigorousfearpath( ta, rs );
+ unfill t; draw t;
+ forever:
+ if isodd:
+ tb := ta + ua;
+ rigorousdisc( 0, true, ta+rs*ua, rc, ua*(1-2*rs));
+ else:
+ tb := ta + ub;
+ rigorousdisc( 0, true, ta+rs*ub, rc, ub*(1-2*rs));
+ fi;
+ t := rigorousfearpath( tb, rs );
+ unfill t; draw t;
+ isodd := not isodd;
+ ta := tb;
+ j := incr( j );
+ exitif j>11;
+ endfor;
+ for i=1 upto 6:
+ for j=1 upto 6:
+ if isodd:
+ ta := ((i-1)*1.5-4.5,(j-1)*2*c-5+c,0);
+ else:
+ ta := ((i-1)*1.5-4.5,(j-1)*2*c-5,0);
+ fi;
+ tb := ta + uc;
+ rigorousdisc( 0, true, ta+rs*uc, rc, uc*(1-2*rs));
+ endfor;
+ j := 1;
+ if isodd:
+ ta := ((i-1)*1.5-3,j-6,0);
+ else:
+ ta := ((i-1)*1.5-3.5,j-6,0);
+ fi;
+ t := rigorousfearpath( ta, rs );
+ unfill t; draw t;
+ forever:
+ if isodd:
+ tb := ta + ua;
+ rigorousdisc( 0, true, ta+rs*ua, rc, ua*(1-2*rs));
+ else:
+ tb := ta + ub;
+ rigorousdisc( 0, true, ta+rs*ub, rc, ub*(1-2*rs));
+ fi;
+ t := rigorousfearpath( tb, rs );
+ unfill t; draw t;
+ isodd := not isodd;
+ ta := tb;
+ j := incr( j );
+ exitif j>11;
+ endfor;
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/graphexample.mp b/graphics/metapost/contrib/macros/featpost/example/graphexample.mp
new file mode 100644
index 0000000000..2dd9b2b973
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/graphexample.mp
@@ -0,0 +1,16 @@
+% graphexample.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+%input mp-tool;
+
+beginfig(1);
+ path thezigzag;
+ thezigzag = zigzagfrontier( origin, (200,200), 17,
+ 4, 20, 16, 12, blue, background );
+ draw thezigzag;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/graphs.mp b/graphics/metapost/contrib/macros/featpost/example/graphs.mp
new file mode 100644
index 0000000000..b5c4dbb981
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/graphs.mp
@@ -0,0 +1,65 @@
+% graphs.mp
+% L. Nobre G.
+% 2007
+
+verbatimtex
+\documentclass{article}
+\usepackage{color,SIunits}
+\begin{document}
+etex
+
+input graph;
+
+beginfig(1);
+ picture thegraph, thedash, thestar;
+ path thecurve;
+ pen thepen;
+ numeric theu;
+ theu = 1.7cm;
+ z1 = (1,2);
+ z2 = (3,8);
+ z3 = (4,8);
+ z4 = (2,8);
+ z5 = (5,1);
+ z6 = (9,1);
+ z7 = (8,2);
+ z8 = (7,3);
+ z9 = (6,4);
+ thestar = btex $\star$ etex scaled (3.5theu/in);
+ thestar := thestar shifted -(center thestar);
+ thepen = pencircle scaled 2mm;
+ thedash = dashpattern( off 3mm on 1mm off 4mm on 2mm );
+ thecurve = z1..z2..z3..z4..z5..z6..z7..z8..z9;
+ thegraph = begingraph(6theu,4theu);
+ glabel.bot( btex $\unit{t}{/\;\second}$ etex, OUT );
+ glabel.lft( btex $\unit{v}{/\;\metre\per\second}$ etex, OUT );
+ gdraw thecurve withpen thepen withcolor blue dashed thedash;
+ gdraw thecurve plot thestar;
+ autogrid(grid.bot,grid.lft) withcolor red dashed evenly;
+ endgraph;
+ draw thegraph;
+endfig;
+
+beginfig(2);
+ draw begingraph(7cm,5cm);
+ pickup pencircle scaled 1pt;
+ path p;
+ for x = -20 step 0.2 until -0.2:
+ augment.p (x, sind(x*180/3.14159)/x);
+ endfor
+ augment.p (0, 1);
+ for x = 0.2 step 0.2 until 20:
+ augment.p (x, sind(x*180/3.14159)/x);
+ endfor
+ glabel.lrt (btex $\frac{\sin(x)}{x}$ etex, (-20,1));
+ gdraw p;
+ endgraph;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/halfcirclesfear.mp b/graphics/metapost/contrib/macros/featpost/example/halfcirclesfear.mp
new file mode 100644
index 0000000000..7194d79336
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/halfcirclesfear.mp
@@ -0,0 +1,43 @@
+% halfcirclesfear
+% L. Nobre G.
+% 2001
+
+input featpost3Dplus2D;
+
+% input la3Dmacros;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ color centre, axpin, axpon, axpun;
+ numeric size, radii;
+ f := (4,1.5,3.5);
+ size = 0.5;
+ radii = 1;
+ centre = (0,0,0);
+ axpin = (0,0,1);
+ axpon = (0,1,0);
+ axpun = (1,0,0);
+ cartaxes( 1.2,1.2,0.8 );
+ pickup pencircle scaled 2;
+ draw rigorouscircle( centre, axpin, radii ) withcolor red;
+ draw goodcirclepath( centre, axpin, radii );
+ draw spatialhalfcircle( centre, axpon, size, true );
+ draw spatialhalfcircle( centre, axpon, size, false ) dashed evenly;
+ draw spatialhalfcircle( centre, axpun, size, true );
+ draw spatialhalfcircle( centre, axpun, size, false ) dashed evenly;
+ draw rigorousfearpath( centre, size );
+endfig;
+
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/hap.mp b/graphics/metapost/contrib/macros/featpost/example/hap.mp
new file mode 100644
index 0000000000..269cc6ab68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hap.mp
@@ -0,0 +1,137 @@
+% hap.mp
+% L. Nobre G.
+% IYP (2005)
+
+numeric HalfSideLength;
+numeric ThicknesFactor, BorderThFactor;
+
+HalfSideLength = 6mm;
+ThicknesFactor = 0.5;
+BorderThFactor = 1.85; % Borders over TraceThickness
+
+def PickInteger( expr MaxNum ) = floor( uniformdeviate( MaxNum+1 ) ) enddef;
+
+def PickColor =
+ begingroup
+ numeric c[], i, min, max, ref;
+ ref = 0.76;
+ for i=1 upto 3:
+ c[i] = uniformdeviate(1);
+ endfor;
+ min = c1;
+ max = c1;
+ for i=2 upto 3:
+ if c[i] < min: min := c[i]; fi;
+ if c[i] > max: max := c[i]; fi;
+ endfor;
+ for i=1 upto 3:
+ c[i] := ref+(0.94-ref)*(c[i]-min)/(max-min);
+ endfor;
+ ( ( c1 , c2, c3 ) )
+ endgroup
+enddef;
+
+vardef LocateIndex[] =
+ dotlabel.urt( str @, z@ )
+enddef;
+
+beginfig(1);
+ numeric tracethickness, i, j, hexconst, angaux, cou, nupersi;
+ numeric ThisInd, ThatInd, dist[], ang[];
+ color TheColor;
+ pen tracepen, bordepen;
+ path hexpath, ActualPath, FinalCut;
+ pair corn[], nco, aco, vec, Dir[], urCorner, ulCorner, llCorner, lrCorner;
+ boolean Filled[];
+ picture Tile[];
+ hexconst = sqrt(3)/2;
+ nupersi = PickInteger( 2 );
+ tracethickness = ThicknesFactor*
+ (0.5+uniformdeviate(0.5))*
+ HalfSideLength/(nupersi+1);
+ TheColor = PickColor;
+ tracepen = pencircle scaled tracethickness;
+ bordepen = tracepen scaled BorderThFactor;
+ for i=0 upto 6:
+ corn[i] = 2*HalfSideLength*dir(i*60);
+ endfor;
+ hexpath = corn0--corn1--corn2--corn3--corn4--corn5--cycle;
+ dist0 = 0;
+ ang0 = 40+uniformdeviate( 100 );
+ for i=1 upto nupersi:
+ dist[i] = dist[i-1]+(0.7+uniformdeviate(0.45))*HalfSideLength/(nupersi+1);
+ angaux := 40+20*i/nupersi;
+ ang[i] = angaux + uniformdeviate( 180-2*angaux );
+ endfor;
+ for i=0 upto 5:
+ aco := corn[i];
+ nco := corn[1+i];
+ vec := nco-aco;
+ z[i] = aco+0.5*vec;
+ Dir[i] = dir(angle(vec)+ang0);
+ Filled[i] = false;
+ endfor;
+ cou = 5;
+ for i=0 upto 5:
+ aco := corn[i];
+ nco := corn[i+1];
+ vec := unitvector(nco-aco);
+ for j=1 upto nupersi:
+ cou := incr( cou );
+ z[cou] = 0.5[aco,nco]+dist[j]*vec;
+ Dir[cou] = dir(angle(vec)+ang[j]);
+ Filled[cou] = false;
+ cou := incr( cou );
+ z[cou] = 0.5[aco,nco]-dist[j]*vec;
+ Dir[cou] = dir(angle(vec)+ang[j]);
+ Filled[cou] = false;
+ endfor;
+ endfor;
+% for i=0 upto cou:
+% LocateIndex[i];
+% endfor;
+ for i=1 step 2 until cou:
+ forever:
+ ThisInd := PickInteger( cou );
+ exitunless Filled[ThisInd];
+ endfor;
+ Filled[ThisInd] := true;
+ forever:
+ ThatInd := PickInteger( cou );
+ exitunless Filled[ThatInd];
+ endfor;
+ Filled[ThatInd] := true;
+ ActualPath := z[ThisInd]{Dir[ThisInd]}
+ ...z[ThatInd]{-Dir[ThatInd]};
+ draw ActualPath withcolor background withpen bordepen;
+ draw ActualPath withcolor TheColor withpen tracepen;
+ endfor;
+ clip currentpicture to hexpath;
+ urCorner = ( 8.13in, 11.533in );
+ llCorner = ( 0.118in, 35.5bp );
+ ulCorner = ( xpart llCorner, ypart urCorner );
+ lrCorner = ( xpart urCorner, ypart llCorner );
+ FinalCut = urCorner--ulCorner--llCorner--lrCorner--cycle;
+ for i=0 upto 5:
+ Tile[i] = currentpicture rotated (i*60);
+ endfor;
+ currentpicture := nullpicture;
+ numeric j, horizo, vertic, vertigo;
+ horizo = ( xpart urCorner ) + 2HalfSideLength;
+ vertic = ( ypart urCorner ) + 2HalfSideLength;
+ vertigo = 0.5*horizo;
+ pair paird, pairv;
+ pairv = up*4*HalfSideLength*hexconst;
+ paird = dir(30)*4*HalfSideLength*hexconst;
+ numeric numd, numv;
+ numv = (vertic+2*vertigo)/(4*HalfSideLength*hexconst);
+ numd = horizo/(3*HalfSideLength);
+ for i = 0 upto numd:
+ for j = 0 upto numv:
+ draw Tile[PickInteger( 5 )] shifted ( (0,-vertigo) + i*paird + j*pairv );
+ endfor;
+ endfor;
+ clip currentpicture to FinalCut;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/heatfromroom.mp b/graphics/metapost/contrib/macros/featpost/example/heatfromroom.mp
new file mode 100644
index 0000000000..a2ba917dc8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/heatfromroom.mp
@@ -0,0 +1,90 @@
+% heatfromroom.mp
+% L. Nobre G.
+% 2006
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric l, gang;
+ path longp, shorp, roomp;
+ picture sp[];
+ pen isol;
+ color mygrey;
+ mygrey = 0.75white;
+ gang = -angle( (3.5,1) );
+ l = 1cm;
+ isol = pensquare scaled 2.2pt rotated gang;
+ z1 = (0,-l) rotated gang;
+ z2 = (l,-l) rotated gang;
+ z3 = (l,2*l) rotated gang;
+ z4 = (0,2*l) rotated gang;
+ z5 = (-3*l,l) rotated gang;
+ z6 = (-3*l,0) rotated gang;
+ z7 = (3*l,0) rotated gang;
+ z8 = (3*l,l) rotated gang;
+ z9 = (l,l) rotated gang;
+ z10 = (0,l) rotated gang;
+ z11 = (l,0) rotated gang;
+ z12 = (2*l,0.5*l) rotated gang;
+ z13 = (0.5*l,1.5*l) rotated gang;
+ z14 = (-1.5*l,0.5*l) rotated gang;
+ z15 = (0.5*l,-0.5*l) rotated gang;
+ z16 = (l,-0.5*l) rotated gang;
+ z17 = (2*l,l) rotated gang;
+ z18 = (0,1.5*l) rotated gang;
+ z19 = (-1.5*l,0) rotated gang;
+ z20 = (0.5*l,-l) rotated gang;
+ z21 = (3*l,0.5*l) rotated gang;
+ z22 = (0.5*l,2*l) rotated gang;
+ z23 = (-3*l,0.5*l) rotated gang;
+ z24 = (0.5*l,0.5*l) rotated gang;
+ longp = z5--z6--z7--z8--cycle;
+ shorp = z1--z2--z3--z4--cycle;
+ roomp = origin--z11--z9--z10--cycle;
+ fill longp withcolor mygrey;
+ fill shorp withcolor mygrey;
+ unfill roomp;
+ draw longp;
+ draw shorp;
+ drawoptions( withpen isol );
+ draw z1--origin--z6;
+ draw z5--z10--z4;
+ draw z3--z9--z8;
+ draw z7--z11--z2;
+ drawoptions();
+ sp12 = btex C etex;
+ label( sp12, z12 );
+ sp13 = btex B etex;
+ label( sp13, z13 );
+ sp14 = btex A etex;
+ label( sp14, z14 );
+ sp15 = btex D etex;
+ label( sp15, z15 );
+ sp16 = btex $L$ etex;
+ label.rt( sp16, z16 );
+ sp17 = btex $2L$ etex;
+ label.top( sp17, z17 );
+ sp18 = btex $L$ etex;
+ label.lft( sp18, z18 );
+ sp19 = btex $3L$ etex;
+ label.bot( sp19, z19 );
+ sp20 = btex $5^\circ$C etex;
+ label.bot( sp20, z20 );
+ sp21 = btex -$25^\circ$C etex;
+ label.rt( sp21, z21 );
+ sp22 = btex -$5^\circ$C etex;
+ label.top( sp22, z22 );
+ sp23 = btex -$10^\circ$C etex;
+ label.lft( sp23, z23 );
+ sp24 = btex $5^\circ$C etex;
+ label( sp24, z24 );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/helix.mp b/graphics/metapost/contrib/macros/featpost/example/helix.mp
new file mode 100644
index 0000000000..bca2e215a8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/helix.mp
@@ -0,0 +1,27 @@
+% helix.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, w, i, r, s, lim;
+ u = 2in;
+ w = 150;
+ r = 0.5u;
+ s = 1/20;
+ lim = 4;
+ for i=0 step s until lim:
+ draw fullcircle scaled 2r shifted (u*(i,sind(i*w)));
+ endfor;
+ %draw origin--(u*(90/w,1));
+ pair d, p;
+ path slope, decli;
+ d = (-90/w,3.14159/2);
+ p = unitvector((-ypart d,xpart d));
+ slope = ((-u*d)--(u*d)) shifted (-r*p);
+ decli = reverse slope shifted (2*r*p);
+ draw (slope--decli--cycle) shifted (u*180/w,0);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/hermitespliknot.mp b/graphics/metapost/contrib/macros/featpost/example/hermitespliknot.mp
new file mode 100644
index 0000000000..dd9f4f47a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hermitespliknot.mp
@@ -0,0 +1,117 @@
+% hermitespliknot.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+numeric param;
+param = 0.7;
+
+Spread := 39;
+f := 1.1*(3,5,4);
+
+vardef Pne( expr pr ) = ( (2*pr-3)*(pr**2)+1 ) enddef;
+vardef Pwo( expr pr ) = ( (3-2*pr)*(pr**2) ) enddef;
+vardef Tne( expr pr ) = ( pr*(pr*(pr-2)+1) ) enddef;
+vardef Two( expr pr ) = ( (pr-1)*(pr**2) ) enddef;
+
+vardef Wei( expr pre, thi, nex ) =
+ ( 0.5*( nex - pre ) )
+enddef;
+
+vardef Hermite( expr pr, zer, one, two, thr ) =
+ ( Pne(pr)*one+Pwo(pr)*two+Tne(pr)*Wei(zer,one,two)+Two(pr)*Wei(one,two,thr) )
+enddef;
+
+beginfig(1);
+ color ki[], actpoi, newpoi;
+ numeric inum, bnum, del, halz, totz, pstep, p, bray;
+ numeric icen, ap, istart, ifinis, thfac, vhfac;
+ inum = 12;
+ bnum = 500;
+ del = 8;
+ halz = 1.5;
+ totz = 3.0;
+ pstep = 0.002;
+ bray = 0.05;
+ icen = 1;
+ thfac = 3.5;
+ vhfac = 0.8;
+ ki0 = (-6,0,0);
+ ki1 = (-5,0,0);
+ ki2 = (-1.5-1.5*cosd((180-del)*param)-cosd((180+del)*param),
+ -sind((180+del)*param)+1.5*sind((180-del)*param),halz);
+ ki3 = (-1.5-1.5*cosd((180-del)*param),
+ 1.5*sind((180-del)*param),totz);
+ ki4 = (-1.5-1.5*cosd((180-del)*param)+cosd((180+del)*param),
+ sind((180+del)*param)+1.5*sind((180-del)*param),halz);
+ ki5 = (cosd((180-del)*param),sind((180-del)*param),0);
+ ki6 = (0,0,0);
+ ki7 = (-cosd((180-del)*param),-sind((180-del)*param),0);
+ ki8 = (1.5+1.5*cosd((180-del)*param)-cosd((180+del)*param),
+ -sind((180+del)*param)+1.5*sind((180-del)*param),halz);
+ ki9 = (1.5+1.5*cosd((180-del)*param),
+ 1.5*sind((180-del)*param),totz);
+ ki10= (1.5+1.5*cosd((180-del)*param)+cosd((180+del)*param),
+ sind((180+del)*param)+1.5*sind((180-del)*param),halz);
+ ki11= (5,0,0);
+ ki12= (6,0,0);
+
+ istart = icen;
+ ifinis = icen+1;
+ ap := 0;
+ forever:
+ ap := ap+pstep;
+ actpoi := Hermite(ap,ki[istart-1],ki[istart],ki[ifinis],ki[ifinis+1]);
+ exitif conorm(actpoi-ki[istart])>bray;
+ endfor;
+ getready("signalvertex("
+ & cstr(actpoi)
+ & "," & decimal(thfac)
+ & ",(0,0,0));signalvertex("
+ & cstr(actpoi)
+ & "," & decimal(thfac*vhfac)
+ & ",(1,1,1));", actpoi);
+ p = 1;
+ forever:
+ ap := ap+pstep;
+ if ap>1:
+ ap := ap-1;
+ istart := ifinis;
+ ifinis := istart+1;
+ fi;
+ exitif (ifinis>inum-1) or (p>bnum);
+ newpoi := Hermite(ap,ki[istart-1],ki[istart],ki[ifinis],ki[ifinis+1]);
+ if conorm(newpoi-actpoi)>2*bray:
+ actpoi := newpoi;
+ getready("signalvertex("
+ & cstr(actpoi)
+ & "," & decimal(thfac)
+ & ",(0,0,0));signalvertex("
+ & cstr(actpoi)
+ & "," & decimal(thfac*vhfac)
+ & ",(1,1,1));", actpoi);
+ p := incr( p );
+ fi;
+ endfor;
+ doitnow;
+% for p=0 upto inum:
+% dotlabel.top( decimal(p), rp(ki[p]) );
+% endfor;
+% produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/hexacylon.mp b/graphics/metapost/contrib/macros/featpost/example/hexacylon.mp
new file mode 100644
index 0000000000..ed388b938b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hexacylon.mp
@@ -0,0 +1,23 @@
+% hexacylon.mp
+% L. Nobre G.
+% 2006
+
+beginfig(1);
+ numeric i, actang, hexdiam, curvray, myang;
+ path outerp, innerp;
+ hexdiam = 15cm;
+ curvray = 8.5mm;
+ myang = 36;
+ for i=1 upto 6:
+ actang := (i-1)*60-90;
+ z[2*i-1] = 0.5*hexdiam*dir( actang ) + curvray*dir( actang - 120 );
+ z[2*i] = 0.5*hexdiam*dir( actang ) + curvray*dir( actang + 120 );
+ z[20+i] = 0.5[z[2*i-1],z[2*i]] - curvray*dir( actang );
+ endfor;
+ outerp = for i=1 upto 6: z[2*i-1]...z[2*i]--- endfor cycle;
+ innerp = z22---z23{dir(myang+180)}..{dir(myang+180)}z25---
+ z26{dir(myang)}..{dir(myang)}cycle;
+ fill outerp withcolor (0.87,0.12,0.08);
+ fill innerp withcolor (0.08,0.12,0.87);
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/hexagonalgrid.mp b/graphics/metapost/contrib/macros/featpost/example/hexagonalgrid.mp
new file mode 100644
index 0000000000..5a4b0b04dc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hexagonalgrid.mp
@@ -0,0 +1,132 @@
+% hexagonalgrid.mp
+% L. Nobre G.
+% 2014
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+prologues := 3;
+
+input graph;
+
+beginfig(1);
+ numeric u, vertlim, horilim, dotsiz, inistep, mininistep, maxinistep;
+ numeric securitymargin;
+ u = 1.01cm;
+ vertlim = 30u;
+ horilim = vertlim/sqrt(2);
+ dotsiz = 0.3u;
+ mininistep = 4.867u;
+ maxinistep = 4.868u;
+ inistep = 0.5*(mininistep+maxinistep);
+ securitymargin = 4u;
+ pair upperleft, horizrigh;
+ upperleft = (-15u,45u)+45u*dir(135);
+ horizrigh = (35u,vertlim);
+ pen defpen;
+ defpen = pencircle scaled dotsiz;
+ numeric i, j, Num;
+ Num = 150;
+ j = 0;
+ for i=mininistep step (maxinistep-mininistep)/Num until maxinistep:
+ pair Dh[]v[];
+ Dh0v0 = (0,vertlim);
+ Dh0v1 = (0,vertlim-i);
+ numeric indh;
+ indh = 0;
+ forever:
+ Dh[indh+1]v1 = whatever[upperleft,Dh[indh]v0];
+ Dh[indh+1]v1 = whatever[horizrigh,Dh[indh]v1];
+ xpart Dh[indh+1]v0 = xpart Dh[indh+1]v1;
+ Dh[indh+1]v0 = whatever[horizrigh,Dh[indh]v0];
+ exitif xpart Dh[indh+1]v0 > horilim;
+ indh := indh + 1;
+ endfor;
+ z[j] = (i,xpart Dh[indh+1]v0 - horilim)/u;
+ j := j + 1;
+ endfor;
+ path thecurve;
+ picture theplus;
+ theplus = btex $+$ etex;
+ theplus := theplus shifted -(center theplus);
+ thecurve = z0 for i=1 upto j-1: --z[i] endfor;
+ picture thegraph;
+ thegraph = begingraph(9u,6u);
+ glabel.bot( btex inistep/u etex, OUT );
+ glabel.lft( btex deviation/u etex, OUT );
+ gdraw thecurve withpen defpen withcolor blue;
+ gdraw thecurve plot theplus;
+ autogrid(grid.bot,grid.lft) withcolor red dashed evenly;
+ endgraph;
+ draw thegraph;
+endfig;
+
+beginfig(2);
+ pair Dh[]v[];
+ Dh0v0 = (0,vertlim);
+ Dh0v1 = (0,vertlim-inistep);
+ drawoptions( withpen defpen );
+ draw Dh0v0;
+ draw Dh0v1;
+ numeric indh, indv, maxindv[];
+ indh = 0;
+ indv = 2;
+ forever:
+ Dh[indh+1]v[indv-1] = whatever[upperleft,Dh[indh]v[indv-2]];
+ Dh[indh+1]v[indv-1] = whatever[horizrigh,Dh[indh]v[indv-1]];
+ draw Dh[indh+1]v[indv-1];
+ forever:
+ xpart Dh[indh+1]v[indv-1] = xpart Dh[indh+1]v[indv];
+ Dh[indh+1]v[indv] = whatever[upperleft,Dh[indh]v[indv-1]];
+ draw Dh[indh+1]v[indv];
+ xpart Dh[indh]v[indv] = xpart Dh[indh]v[indv-1];
+ Dh[indh]v[indv] = whatever[horizrigh,Dh[indh+1]v[indv]];
+ draw Dh[indh]v[indv];
+ exitif ypart Dh[indh]v[indv] < -securitymargin;
+ indv := indv + 1;
+ endfor;
+ maxindv[indh] = indv;
+ xpart Dh[indh+1]v0 = xpart Dh[indh+1]v1;
+ Dh[indh+1]v0 = whatever[horizrigh,Dh[indh]v0];
+ draw Dh[indh+1]v0;
+ show xpart Dh[indh+1]v0 - xpart Dh[indh]v0;
+ exitif xpart Dh[indh+1]v0 > horilim+securitymargin;
+ indh := indh + 1;
+ indv := 2;
+ Dh[indh+1]v[indv-1] = whatever[upperleft,Dh[indh]v[indv-2]];
+ Dh[indh+1]v[indv-1] = whatever[horizrigh,Dh[indh]v[indv-1]];
+ draw Dh[indh+1]v[indv-1];
+ xpart Dh[indh+1]v0 = xpart Dh[indh+1]v1;
+ show xpart Dh[indh+1]v0 - xpart Dh[indh]v0;
+ Dh[indh+1]v0 = whatever[horizrigh,Dh[indh]v0];
+ draw Dh[indh+1]v0;
+ indh := indh + 1;
+ endfor;
+ drawoptions();
+ for i=2 step 2 until indh+1:
+ for j=0 upto maxindv[i-2]-1:
+ draw Dh[i]v[j+1]--Dh[i-1]v[j]--Dh[i]v[j]--cycle;
+ draw Dh[i-1]v[j+1]--Dh[i-2]v[j]--Dh[i-1]v[j]--cycle;
+ endfor;
+ endfor;
+ path borde, bordf;
+ borde = (-dotsiz,-dotsiz)
+ --(-dotsiz,vertlim+dotsiz)
+ --(horilim+dotsiz,vertlim+dotsiz)
+ --(horilim+dotsiz,-dotsiz)--cycle;
+ bordf = origin--(0,vertlim)--(horilim,vertlim)--(horilim,0)--cycle;
+ clip currentpicture to bordf;
+ draw bordf;
+ picture lasercutprofile;
+ lasercutprofile = currentpicture;
+ draw borde;
+ %draw upperleft withpen defpen;
+ %draw horizrigh withpen defpen;
+endfig;
+
+beginfig(3);
+ draw lasercutprofile withpen pencircle scaled 0 withcolor red;
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/hexagonaltrimesh.mp b/graphics/metapost/contrib/macros/featpost/example/hexagonaltrimesh.mp
new file mode 100644
index 0000000000..f51ed83c13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hexagonaltrimesh.mp
@@ -0,0 +1,25 @@
+% hexagonaltrimesh.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4)
+enddef;
+
+f := 7*(4,1,5);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+SubColor := 0.4background;
+
+beginfig(1);
+ numeric np, ssize;
+ path chair;
+ np = 40;
+ ssize = 15;
+
+ hexagonaltrimesh( true,np,ssize,zsurface);
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/hiddenlinegraph.mp b/graphics/metapost/contrib/macros/featpost/example/hiddenlinegraph.mp
new file mode 100644
index 0000000000..8c0823c3ef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hiddenlinegraph.mp
@@ -0,0 +1,74 @@
+% hiddenlinegraph.mp
+% L. Nobre G.
+% 2003
+% The application of the big nice trick to draw 3D hidden line surfaces
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def zsurfaci( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4-xc*yc*(1-yc**2);
+ ( ( xc, yc, zout ) )
+ endgroup
+enddef;
+
+def zsurface( expr xc, yc ) =
+ ( xc, yc, cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4) )
+enddef;
+
+def zsurfaca( expr xc, yc ) =
+ ( xc, yc, 1.5-0.2*xc )
+enddef;
+
+%f := (6,1,0);
+f := (5,1.5,3);
+Spread := 147;
+NF := 0;
+LightSource := (1,-1,2);
+
+beginfig(1);
+ numeric nx, ny, lowx, higx, lowy, higy,
+ facz, lowz, higz, base, topo;
+ path chair;
+ nx = 22;
+ ny = 22;
+ lowy = -7;
+ higy = 7;
+ lowx = -7;
+ higx = 7;
+ facz = 2;
+ lowz = -1;
+ higz = 5;
+% lowy = -2.5;
+% higy = 1;
+% lowx = 1.5;
+% higx = 3;
+% facz = 3;
+% lowz = -1.5;
+% higz = 1.5;
+ partrimesh( nx,ny,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurface);
+ partrimesh( nx,ny,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurfaca);
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ draw chair;
+% fill_faces( withcolor blue );
+ draw_invisible( false, false, green, blue );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/hiddensurface.mp b/graphics/metapost/contrib/macros/featpost/example/hiddensurface.mp
new file mode 100644
index 0000000000..de52af3dcf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hiddensurface.mp
@@ -0,0 +1,153 @@
+% hiddensurface.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+% The big nice trick to draw 3D hidden line surfaces
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+numeric toplevel;
+toplevel = 2.2;
+
+def zsurface( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4 -xc*yc*(1-yc**2);
+ if zout > toplevel:
+ zout := toplevel;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+def zline( expr yc ) =
+ begingroup
+ numeric zout;
+ zout = 4*yc*yc*yc/(1-3*yc*yc); %% I don't get it...
+ if zout > 3:
+ zout := 3;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+f := (6,1,2);
+Spread := 67;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy, refz;
+ numeric posx, posy, posz, facz, lowl, higl, pensize;
+ color gridx[], pos, begcont, endcont, begconf, endconf;
+ path facex, descontjump;
+ pensize = 3pt;
+ nx = 20;
+ ny = 50;
+ lowy = -2.5;
+ higy = 1;
+ lowx = 1.5;
+ higx = 3;
+ refz = -2.5;
+ facz = 5;
+ for i=0 upto nx:
+ for j=0 upto ny:
+ posx := lowx + i*( higx - lowx )/nx;
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ pos := ( posx, -1, refz/facz );
+ facex := rp( pos )--rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ facex:=facex--rp((posx,1,refz/facz))--cycle;
+ unfill facex;
+ draw facex;
+ endfor;
+ lowl = -2.0;
+% higl = -0.7;
+ higl = -1.0;
+ for j=0 upto ny:
+ posy := lowl + j*( higl - lowl )/ny;
+ posx := zline( posy );
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ facex := rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ draw facex withcolor red; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ lowl := -1.4;
+ higl := -0.8;
+ for j=0 upto ny:
+ posy := lowl + j*( higl - lowl )/ny;
+ posx := -2*posy;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+ facex := rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ draw facex withcolor green;
+ lowl := -1.0;
+ higl := 0.5;
+ for j=0 upto 1:
+ posy := lowl + j*( higl - lowl );
+ posx := 2;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ gridx[j] := ( posx, posy, posz );
+ endfor;
+% facex := rp( gridx0 );
+% for j=1 upto ny:
+% facex := facex--rp( gridx[j] );
+% endfor;
+% draw facex withcolor blue;
+ pickup pencircle scaled pensize;
+ draw rp(gridx0) withcolor red;
+ draw rp(gridx1) withcolor red;
+ posx := 2.83;
+ posy := -1.933;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz;
+ draw rp((posx,posy,posz)) withcolor blue;
+ posy := 0.517;
+ posy := bracket(lowy,posy,higy);
+ draw rp((posx,posy,posz)) withcolor blue;
+ begconf = (1.15,-1,refz/facz);
+ endconf = (1.15, 1,refz/facz);
+ begcont = ( 1,-1,1.15*toplevel/facz);
+ endcont = (-1,-1,1.15*toplevel/facz);
+ pickup pencircle scaled 0.5pensize;
+ drawarrow rp(begconf)--rp(endconf);
+ drawarrow rp(begcont)--rp(endcont);
+ label.ulft( btex $\Lambda$ etex, rp(0.5*(begcont+endcont)) );
+ label.bot( btex $\Upsilon$ etex, rp(0.5*(begconf+endconf)) );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/hiddensurfaces.mp b/graphics/metapost/contrib/macros/featpost/example/hiddensurfaces.mp
new file mode 100644
index 0000000000..d57526c534
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/hiddensurfaces.mp
@@ -0,0 +1,65 @@
+% hiddensurfaces.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ begingroup
+ numeric zout;
+ zout = yc**4-xc*yc*(1-yc**2);
+ if zout > 1.5:
+ zout := 1.5;
+ fi;
+ ( zout )
+ endgroup
+enddef;
+
+f := (2.5,2,1.25);
+Spread := 127;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy, refz
+ posx, posy, posz, facz, counter;
+ color poi[][];
+ nx = 30;
+ ny = 30;
+ lowy = -2.5;
+ higy = 1;
+ lowx = 1.5;
+ higx = 3;
+ refz = 0;
+ facz = 5;
+ counter = 0;
+ for i=0 upto nx:
+ for j=0 upto ny:
+ posx := lowx + i*( higx - lowx )/nx;
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy );
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := posz/facz + refz;
+ poi[i][j] := ( posx, posy, posz );
+ endfor;
+ endfor;
+ for i=1 upto nx:
+ for j=1 upto ny:
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i][j-1];
+ F[counter]p3 := poi[i][j];
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i-1][j];
+ F[counter]p3 := poi[i][j];
+ endfor;
+ endfor;
+ NF := counter;
+ drawarrow rp((-1,-1,refz))--rp((1,-1,refz));
+ drawarrow rp((-1,-1,refz))--rp((-1,1,refz));
+ fill_faces( withcolor blue );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/iamsorrykarl.mp b/graphics/metapost/contrib/macros/featpost/example/iamsorrykarl.mp
new file mode 100644
index 0000000000..7e233047c4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/iamsorrykarl.mp
@@ -0,0 +1,94 @@
+% iamsorrykarl.mp
+% 2006
+% L. Nobre G.
+
+%input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, nstripes, aspecratio, minskip, maxskip, shiftlim, shiftmin;
+ numeric nbreaks, i, j, ymax, shiftx, lefh, righ, actualx, newx;
+ numeric prevlefh, prevrigh, xmax, auxan, auxr, cdiam;
+ path lefp[], rigp[], strp[];
+ pair shif, reflef, refrig, auxa, auxb;
+ boolean exitcondition;
+ u = 1cm;
+ nstripes = 7;
+ aspecratio = 1.7;
+ minskip = 0.5u; % must not be too small
+ maxskip = 4u;
+ shiftlim = 0.7u;
+ shiftmin = 0.25u;
+ cdiam = 0.65u;
+ xmax = (2*nstripes-1)*u;
+ ymax = aspecratio*xmax;
+ prevlefh = ymax;
+ prevrigh = ymax;
+ actualx = u;
+ for i=1 upto nstripes:
+ lefp[i] = ((2*i-1)*u,ymax);
+ rigp[i] = ((2*i-1)*u,ymax)--(2*i*u,ymax);
+ endfor;
+ exitcondition = false;
+ forever:
+ auxr := uniformdeviate(2)-1;
+ if auxr > 0:
+ newx := actualx + shiftmin + (shiftlim-shiftmin)*auxr;
+ else:
+ newx := actualx - shiftmin + (shiftlim-shiftmin)*auxr;
+ fi;
+ lefh := prevlefh - minskip - uniformdeviate(maxskip-minskip);
+ righ := prevrigh - minskip - uniformdeviate(maxskip-minskip);
+ if lefh < minskip:
+ lefh := minskip;
+ exitcondition := true;
+ fi;
+ if righ < minskip:
+ righ := minskip;
+ exitcondition := true;
+ fi;
+ reflef := (newx,lefh);
+ refrig := (newx+xmax,righ);
+ auxan := angle(refrig-reflef);
+ shif := (newx-actualx)*(1,sind(auxan)/cosd(auxan));
+ for i=1 upto nstripes:
+ auxa := point (length lefp[i]) of lefp[i];
+ auxb := point (length rigp[i]) of rigp[i];
+ pair poil, poir;
+ poil = auxa+whatever*down;
+ poil = whatever[reflef,refrig];
+ poir = auxb+whatever*down;
+ poir = whatever[reflef,refrig];
+ lefp[i] := lefp[i]--poil--(poil+shif);
+ rigp[i] := rigp[i]--poir--(poir+shif);
+ endfor;
+ actualx := newx;
+ prevlefh := lefh;
+ prevrigh := righ;
+ exitif exitcondition;
+ endfor;
+ for i=1 upto nstripes:
+ auxa := point (length lefp[i]) of lefp[i];
+ auxb := point (length rigp[i]) of rigp[i];
+ pair poil, poir;
+ poil = auxa+whatever*down;
+ poil = whatever[origin,right];
+ poir = auxb+whatever*down;
+ poir = whatever[origin,right];
+ lefp[i] := lefp[i]--poil--poir;
+ rigp[i] := rigp[i]--poir;
+ strp[i] = buildcycle( lefp[i], reverse rigp[i] );
+ fill strp[i] withcolor red;
+ endfor;
+% for i=nstripes+1 upto nstripes+50:
+% strp[i] = fullcircle scaled cdiam shifted
+% (uniformdeviate(xmax),uniformdeviate(ymax));
+% fill strp[i];
+% endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/inductionbob.mp b/graphics/metapost/contrib/macros/featpost/example/inductionbob.mp
new file mode 100644
index 0000000000..b482373072
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/inductionbob.mp
@@ -0,0 +1,116 @@
+% inductionbob.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+numeric altura;
+altura = 0.35;
+
+f := (4,6,1);
+Spread := 200;
+LightSource := f+blue;
+ShadowOn := false;
+
+def spirala( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 4.5;
+ par2 = 0.3;
+ par3 = 0.2*par1;
+ param1 = par1*360*TheVal;
+ cred = -par2*sind( param1 );
+ cgre = ( TheVal - 1.0 )*par3;
+ cblu = par2*cosd( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+def spiralb( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 4.0;
+ par2 = 0.3;
+ par3 = 0.2*par1;
+ param1 = par1*360*TheVal;
+ cred = par2*sind( param1 );
+ cgre = TheVal*par3;
+ cblu = -par2*cosd( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+def innerloop( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param[];
+ par1 = 8;
+ par2 = 0.2;
+ param1 = par1+(360-2*par1)*TheVal;
+ cred = par2*cosd( param1 );
+ cgre = 0;
+ cblu = par2*sind( param1 );
+ ( (cred,cgre,cblu+altura) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric xouterdev, xinnerdev, scalecir, scalelab;
+ color startp, begp, endp, finisp, ap, bp, cp, dp, ep, fp, gp;
+ pair startz, begz, endz, finisz, az, bz, cz, dz, ez, fz, gz;
+ path innerpath, outerpath, primarcir, secondcir;
+ pen mypen;
+ scalecir = 3cm;
+ scalelab = 4;
+ xouterdev = 1.4;
+ xinnerdev = 1.0;
+ mypen = pencircle scaled 4pt;
+ startp = spirala( 0 );
+ finisp = spiralb( 1 );
+ begp = innerloop( 0 );
+ endp = innerloop( 1 );
+ ap = ( xouterdev, Y(startp), Z(startp) );
+ bp = ( xouterdev, Y(startp), Z(finisp) );
+ dp = ( xouterdev, Y(finisp), Z(finisp) );
+ cp = 0.5[bp,dp];
+ ep = ( xinnerdev, Y(begp), Z(begp) );
+ fp = ( xinnerdev, Y(endp), Z(endp) );
+ gp = 0.5[ep,fp];
+ startz = rp( startp );
+ finisz = rp( finisp );
+ begz = rp( begp );
+ endz = rp( endp );
+ az = rp( ap );
+ bz = rp( bp );
+ cz = rp( cp );
+ dz = rp( dp );
+ ez = rp( ep );
+ fz = rp( fp );
+ gz = rp( gp );
+ emptyline( false, 1, black, 0.7background, 700, 0.8, 2, spirala );
+ outerpath = startz--az--bz--dz--finisz;
+ primarcir = fullcircle scaled scalecir shifted cz;
+ emptyline( false, 0.8, black, 0.4*(red+background), 150, 0.8, 2, innerloop );
+ innerpath = begz--ez--fz--endz;
+ secondcir = fullcircle scaled scalecir shifted gz;
+ draw innerpath withpen mypen;
+ unfill secondcir;
+ draw secondcir withpen mypen;
+ label( btex $V_S$ etex scaled scalelab, gz);
+ emptyline( true, 1, black, 0.7background, 700, 0.8, 2, spiralb );
+ draw outerpath withpen mypen;
+ unfill primarcir;
+ draw primarcir withpen mypen;
+ label( btex $V_P$ etex scaled scalelab, cz );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/integerbars.mp b/graphics/metapost/contrib/macros/featpost/example/integerbars.mp
new file mode 100644
index 0000000000..a8475fba75
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/integerbars.mp
@@ -0,0 +1,58 @@
+% integerbars.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+def randcolor =
+ (0.1+uniformdeviate(0.8),0.1+uniformdeviate(0.8),0.1+uniformdeviate(0.8))
+enddef;
+
+beginfig(1);
+ numeric u, ltl, ltr, lsl, lsr, lbmin, lbmax, lbtop, i, j, k, a;
+ numeric hist[], hclass, aaux, r;
+ color pickc;
+ pair tcross;
+ pickup pencircle scaled 1.5pt;
+ u = 5mm;
+ r = 5mm;
+ ltl = 9;
+ ltr = 9;
+ lsl = 4;
+ lsr = 1;
+ lbmin = 4;
+ lbtop = 7;
+ lbmax = ltl+ltr-1;
+ hclass = 2;
+ if lbtop > lbmax: lbtop := lbmax; fi;
+ draw origin;
+ for a=0 step hclass until 180-hclass:
+ hist[a] = 0;
+ endfor;
+ for i=lbmin upto lbtop:
+ pickc := randcolor;
+ drawoptions( withcolor pickc );
+ draw (i*u,0);
+ for j=lsl upto ltl:
+ for k=lsr upto ltr:
+ if (j+k > i) and (j < i+k) and (k < i+j):
+ tcross := radialcross( origin, j*u, (i*u,0), k*u, true );
+ draw tcross;
+ aaux := angle( tcross );
+ a := 0;
+ forever:
+ a := a + hclass;
+ exitif aaux < a;
+ endfor;
+ hist[a] := incr( hist[a] );
+ fi;
+ endfor;
+ endfor;
+ endfor;
+ fill origin-- for a=hclass step hclass until 180-hclass:
+ (r*dir(a)*hist[a-hclass])--(r*dir(a)*hist[a])-- endfor cycle;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/integratorfigures.mp b/graphics/metapost/contrib/macros/featpost/example/integratorfigures.mp
new file mode 100644
index 0000000000..0ce13609e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/integratorfigures.mp
@@ -0,0 +1,112 @@
+% integratorfigures.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+verbatimtex
+ \documentclass{article}
+ \begin{document}
+etex
+
+beginfig(1);
+ f := (5,3,2);
+ Spread := 90;
+ numeric axlen, disclen, discpos, dradius, dxo, dy;
+ color dcenter, xlim, dxr, dxco, dxro, vdy, dxa, dxb;
+ path xtip, neadx, fardx, dx;
+ axlen = 1.65;
+ disclen = 0.15;
+ discpos = 0.85;
+ dy = 0.02;
+ vdy = -dy*green;
+ dradius = 1 +-+ discpos;
+ dxo = dradius + 0.5;
+ cartaxes( axlen, axlen, axlen );
+ dcenter = discpos*red;
+ xlim = axlen*red;
+ xtip = rp(dcenter)--rp(xlim);
+ drawoptions( withpen pencircle scaled 1.2pt );
+ rigorousdisc( 0, true, discpos*red, dradius, -disclen*red );
+ drawoptions();
+% draw goodcirclepath( black, blue, 1 ) dashed evenly;
+% draw goodcirclepath( black, red, 1 ) dashed evenly;
+% draw goodcirclepath( black, green, 1 ) dashed evenly;
+% drawoptions( withpen pencircle scaled 1.2pt );
+ draw spatialhalfcircle( black, blue, 1, true );
+ draw spatialhalfcircle( black, red, 1, true );
+ draw spatialhalfcircle( black, green, 1, true );
+ drawoptions();
+ drawarrow xtip;
+% draw rp(black)--rp(dcenter) dashed evenly;
+ draw rigorousfearpath( black, 1 );
+ dxco = (discpos,dxo,0);
+ dxr = (discpos-disclen,dradius,0);
+ dxro = (discpos-disclen,dxo,0);
+ neadx = rp(dcenter)--rp(dxco);
+ fardx = rp(dxr)--rp(dxro);
+ dxa = dxco+vdy;
+ dxb = dxro+vdy;
+ draw fardx;
+ draw neadx;
+ dx = rp(dxa)--rp(dxb);
+ drawdblarrow dx;
+% label.rt( btex $dx$ etex, rp(0.5[dxa,dxb]) );
+ label.rt( "dx", rp(0.5[dxa,dxb]) );
+ label.bot( "x" ,rp(xlim));
+endfig;
+
+input boxes;
+
+beginfig(2);
+ f := (3,2.05,2.35);
+ Spread := 140;
+ numeric labscal, bray, sray, angb, phi, phib;
+ picture labrb, labrs, plb, pls;
+ color cenb, momb, lpos, hpos;
+ path vaa, vb, ha, hb, hapart;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ bray = 0.95;
+ sray = 0.4;
+ angb = 9;
+ phi = 55;
+ phib = 83;
+ labrb= btex $(b+r\cos\phi)d\theta$ etex scaled labscal;
+ labrs= btex $r\,d\phi$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ smoothtorus( black, blue, bray, sray );
+% drawoptions( withpen pencircle scaled 1.3pt dashed evenly );
+ drawoptions( );
+ vaa = goodcirclepath( bray*red, green, sray );
+ draw vaa withcolor red;
+ cenb = bray*(red*cosd(angb)+green*sind(angb));
+ momb = green*cosd(angb)-red*sind(angb);
+ lpos = cenb*(1+sray*cosd(phi)/bray)+blue*sray*sind(phi);
+ hpos = cenb*(1+sray*cosd(phib)/bray)+blue*sray*sind(phib);
+ vb = goodcirclepath( cenb, momb, sray );
+ draw vb withcolor (blue+green);
+ ha = goodcirclepath( blue*sray*sind(phi), blue, bray+sray*cosd(phi) );
+ draw ha;
+ hb = goodcirclepath( blue*sray*sind(phib), blue, bray+sray*cosd(phib) );
+ draw hb withcolor green;
+% show length ha;
+ hapart = subpath (3,6) of ha;
+ drawarrow hapart withpen pencircle scaled 1.3pt;
+ fill buildcycle( vaa, hb, vb, reverse hapart ) withcolor 0.5white;
+ plb = thelabel.llft( labrb, rp(lpos) );
+ pls = thelabel.lrt( labrs, rp(hpos) );
+ boxit.bb( plb );
+ boxit.bs( pls );
+ unfill bpath bb;
+ unfill bpath bs;
+ drawboxed( bb, bs );
+endfig;
+
+verbatimtex
+ \end{document}
+etex
+
+end;
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/interdigitrodes.mp b/graphics/metapost/contrib/macros/featpost/example/interdigitrodes.mp
new file mode 100644
index 0000000000..8b4488ba77
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/interdigitrodes.mp
@@ -0,0 +1,24 @@
+% interdigitrodes.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, t, i, j, len;
+ u = 1mm;
+ t = 4u;
+ i = 1u;
+ len = 2*(t+i);
+ path basepath;
+ basepath = ((0,0.5t)---(3len,0.5t)--(3len,-0.5t)---(0,-0.5t)..cycle)
+ shifted (-len,0.5*(t+i));
+ fill basepath;
+ fill basepath shifted (0,len);
+ fill basepath shifted (0,-len);
+ fill basepath shifted (0,-2len);
+ fill (2len,-2len)--(3len,-2len)--(3len,2len)--(2len,2len)--cycle;
+ draw currentpicture rotated 180 withcolor 0.333white;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/intersectorus.mp b/graphics/metapost/contrib/macros/featpost/example/intersectorus.mp
new file mode 100644
index 0000000000..04e9ff2fd7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/intersectorus.mp
@@ -0,0 +1,30 @@
+% intersectorus.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+f := (1,-5,2);
+
+beginfig(1);
+ numeric ray, i, Num, zcoord;
+ color startpoi, lindir, outpoi, auxpoi;
+ ray = 0.4;
+ zcoord = 0.5*ray;
+ startpoi = (-1-0.5*ray,-1,zcoord);
+ lindir = (0,3,-2.5);
+ Num = 50;
+ smoothtorus( black, blue, 1, ray );
+ for i=0 upto Num:
+ auxpoi := startpoi+2*(1+0.5*ray)*red*i/Num;
+ outpoi := intersectorus( black, blue, 1, ray, auxpoi, lindir );
+ if pointinsidetorus( auxpoi, black, blue, 1, ray ):
+ draw rp(auxpoi)--rp(outpoi) withpen pencircle scaled 2pt withcolor red;
+ else:
+ draw rp(auxpoi)--rp(outpoi) withpen pencircle scaled 2pt;
+ fi;
+ endfor;
+ draw rp(startpoi)--rp(auxpoi);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/intersectprolatespheroid.mp b/graphics/metapost/contrib/macros/featpost/example/intersectprolatespheroid.mp
new file mode 100644
index 0000000000..16b1b632f8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/intersectprolatespheroid.mp
@@ -0,0 +1,27 @@
+% intersectprolatespheroid.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric ray, i, Num, zcoord;
+ color startpoi, lindir, outpoi, auxpoi;
+ ray = 0.6;
+ zcoord = 0.75;
+ startpoi = (1.5,1.5,zcoord);
+ lindir = (4,3,0);
+ Num = 12;
+ spheroid( black, blue, ray );
+ drawoptions( dashed (withdots scaled 0.25) );
+ draw rigorouscircle( black, blue, ray );
+ draw rigorouscircle( (0,0,zcoord), blue, ray*(1 +-+ zcoord) );
+ drawoptions();
+ for i=0 upto Num:
+ auxpoi := startpoi+red*i/Num;
+ outpoi := intersectprolatespheroid( black, blue, ray, auxpoi, lindir );
+ draw rp(auxpoi)--rp(outpoi) withpen pencircle scaled 1pt;
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/iplaca.mp b/graphics/metapost/contrib/macros/featpost/example/iplaca.mp
new file mode 100644
index 0000000000..1b8148d011
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/iplaca.mp
@@ -0,0 +1,45 @@
+% iplaca.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+numeric u;
+u = 52mm;
+
+def placaminho( expr yv ) =
+ begingroup
+ pair p[];
+ numeric xh;
+ xh = u-yv;
+ p1 = (xh,yv);
+ p2 = (-xh,yv);
+ p3 = (-xh,-yv);
+ p4 = (0,-yv);
+ p5 = (-yv,0);
+ p6 = (0,yv);
+ p7 = (yv,0);
+ p8 = (xh,-yv);
+ ( p1--p2--p3--p4--p5--p6--p7--p4--p8--cycle )
+ endgroup
+enddef;
+
+beginfig(1);
+ path a, b, c;
+ color g;
+ pen j;
+ j = pencircle scaled 0.02u;
+ g = 0.5white;
+ a = placaminho( 0.15u ) shifted (left*u*1.9);
+ fill a withcolor g;
+ draw a withpen j;
+ b = placaminho( 0.3u );
+ fill b withcolor g;
+ draw b withpen j;
+ c = placaminho( 0.45u ) shifted (right*u*1.7);
+ fill c withcolor g;
+ draw c withpen j;
+endfig;
+
+end.
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/jd44.mp b/graphics/metapost/contrib/macros/featpost/example/jd44.mp
new file mode 100644
index 0000000000..0ad532a374
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/jd44.mp
@@ -0,0 +1,172 @@
+% jd44.mp
+% J. Dinis
+% long ago
+% BUG: With MetaPost, version 1.208 (kpathsea version 5.0.0) points z5 and z7
+% (the "elbows") produce wrong figures !!!!
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+% prologues := 2;
+
+
+def drawpoints(expr a, b)=
+ for i=a upto b:
+ label(decimal i, z[i]);
+ endfor
+enddef;
+
+
+def drawtopic expr p = addto pic doublepath p withpen currentpen enddef;
+
+
+vardef climber(expr sc) =
+ clearxy;
+ save a,b,c,d,e,f, pic;
+ picture pic;
+ pic := nullpicture;
+
+ a := .8 sc;
+ b := 1 sc;
+ c := 1.2 sc;
+ d := .8 sc;
+ e := .3 sc;
+ f := .6 sc;
+
+ z4 = z3 + (e,0) rotated 45;
+ z1 = z4 + (c,0) rotated 150;
+ z1 - z2 = z3 - z4;
+ z13 = .5[z1,z2];
+ z5 = z13 + (0,a);
+ z6 = z5 + (0,a);
+ z7 = z2 + (f,0) rotated 45;
+ z8 = z7 + (a,0) rotated 45;
+ z9 = z3 + (b,0);
+ z10 = z9 + (b,0) rotated -45;
+ z11 = z4 + (a,0) rotated 70;
+ z12 = z11 + (b,0) rotated -30;
+ z0 = z1 + (d,0) rotated (100+angle(z2-z1));
+
+ x4-(.25pt*sc) = 0;
+ y4-(.25pt*sc) = 0;
+
+ pickup pencircle scaled (.5pt*sc);
+ drawtopic z13--z6;
+ drawtopic z3--z9--z10;
+
+ pickup pencircle scaled (.6pt*sc);
+ drawtopic z2--z8 withcolor white;
+ drawtopic z4--z11--z12 withcolor white;
+ drawtopic z1--z2--z4--z3--cycle withcolor white;
+
+ pickup pencircle scaled (.5pt*sc);
+ drawtopic z1--z2--z4--z3--cycle;
+ drawtopic z2--z7--z8;
+ drawtopic z4--z11--z12;
+
+ pickup pencircle scaled (1pt*sc);
+ drawtopic z0;
+
+% drawpoints(0,12);
+ pic
+enddef;
+
+
+vardef windsurfer(expr sc) =
+ clearxy;
+ save a,b,c,d,e,f, pic;
+ picture pic;
+ pic := nullpicture;
+
+ a := .9 sc;
+ b := .6 sc;
+ c := 1.2 sc;
+ d := .8 sc;
+ e := .3 sc;
+ f := .6 sc;
+
+ z3 = z4 + (e,0) rotated 170;
+ z2 = z4 + (c,0) rotated 80;
+ z1-z2 = z3-z4;
+
+ z7 = z2 + (b,0) rotated 200;
+ z8 = z7 + (a,0) rotated 200;
+ z5 = z1 + (b,0) rotated 200;
+ z6 = z5 + (a,0) rotated 200;
+
+ z9 = z3 + (d,0) rotated 195;
+ z10 = z9 + (a,0) rotated 240;
+ z11 = z4 + (d,0) rotated 195;
+ z12 = z11 + (a,0) rotated 240;
+
+ z0 = z2 + (d,0) rotated 90;
+
+ x10-(.25pt*sc) = 0;
+ y12-(.25pt*sc) = 0;
+
+ pickup pencircle scaled (.5pt*sc);
+ drawtopic z1--z5--z6;
+ drawtopic z3--z9--z10;
+
+ pickup pencircle scaled (.6pt*sc);
+ drawtopic z2--z7--z8 withcolor white;
+ drawtopic z4--z11--z12 withcolor white;
+ drawtopic z1--z2--z4--z3--cycle withcolor white;
+
+ pickup pencircle scaled (.5pt*sc);
+ drawtopic z2--z7--z8;
+ drawtopic z4--z11--z12;
+ drawtopic z1--z2--z4--z3--cycle;
+
+ pickup pencircle scaled (1pt*sc);
+ drawtopic z0;
+
+ % drawpoints(0,12);
+ pic
+enddef;
+
+
+vardef fourtyfour(expr sc)=
+ save f, p;
+ picture f, p;
+ f := btex 4 etex scaled sc;
+ f := f yscaled 1.5 rotated 35 yscaled .85 rotated -39.4803;
+ p := nullpicture;
+ addto p also (f shifted -.44(lrcorner f - llcorner f));
+ addto p also (f shifted .44(lrcorner f - llcorner f));
+ p
+enddef;
+
+
+beginfig(1);
+ draw climber(100) shifted (288,144);
+endfig;
+
+
+beginfig(2);
+ draw windsurfer(100) shifted (72,72);
+endfig;
+
+
+beginfig(3);
+ draw fourtyfour(40) shifted (144,144);
+endfig;
+
+
+% e à quarta é de vez.
+%
+beginfig(4);
+ draw fourtyfour(40);
+ draw climber(50) shifted llcorner currentpicture;
+ draw windsurfer(50) shifted (0.8*(lrcorner currentpicture));
+% currentpicture := currentpicture shifted (80mm,120mm);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/jdbug.mp b/graphics/metapost/contrib/macros/featpost/example/jdbug.mp
new file mode 100644
index 0000000000..033fe0248e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/jdbug.mp
@@ -0,0 +1,26 @@
+% jdbug.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric N, i, u, c, s;
+ pen thepen;
+ picture lastpic;
+ u = 5mm;
+ thepen = pencircle scaled 0.2u;
+ N = 5;
+ s = 180/N;
+ c = u*cosd(s);
+ draw for i=0 step 2s until 360-2s:
+ (u*dir(i))--(c*dir(i+s))--
+ endfor cycle withpen thepen;
+ lastpic = currentpicture;
+endfig;
+
+beginfig(2);
+ draw lastpic rotated s;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/joinedemptylines.mp b/graphics/metapost/contrib/macros/featpost/example/joinedemptylines.mp
new file mode 100644
index 0000000000..970f862c5a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/joinedemptylines.mp
@@ -0,0 +1,47 @@
+% joinedemptylines.mp
+% L. Nobre G.
+% 2001
+
+input featpost3Dplus2D;
+
+numeric altura;
+altura = 1;
+
+f := (2,3,1.8+altura);
+Spread := 125;
+LightSource := 0.7*(4,-1,4);
+ShadowOn := true;
+
+def helixone( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 3*360;
+ par2 = 0.3;
+ par3 = 0.8;
+ param = par1*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred,cblu,par3*(-1+TheVal)+altura) )
+ endgroup
+enddef;
+
+def helixtwo( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cblu, param;
+ par1 = 3*360;
+ par2 = 0.1;
+ par3 = 0.8/3;
+ param = par1*TheVal;
+ cred = par2*cosd( param );
+ cblu = par2*sind( param );
+ ( (cred+0.2,cblu,par3*TheVal+altura) )
+ endgroup
+enddef;
+
+beginfig(1);
+ emptyline( false, 0.91, black, 0.5background, 360, 0.88, 2, helixone );
+ emptyline( true, 0.91, black, 0.5background, 120, 0.88, 2, helixtwo );
+ drawarrow rp((0.5,0,altura))--rp((0.32,0,altura));
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/keplernewtonfeynman.mp b/graphics/metapost/contrib/macros/featpost/example/keplernewtonfeynman.mp
new file mode 100644
index 0000000000..b30e6b0437
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/keplernewtonfeynman.mp
@@ -0,0 +1,80 @@
+% keplernewtonfeynman.mp
+% L. Nobre G.
+% 2014
+
+%input featpost3Dplus2D;
+
+prologues := 0;
+
+%verbatimtex \documentclass{article}\usepackage{mathpazo}\begin{document} etex
+
+ahangle := 30;
+
+beginfig(1);
+ numeric u, abratio, foc, pang, auxang, refdist, stepang, factor, thang;
+ pair secofod, ocirpoi, midpoi, tpoi, dirplu, dirmin;
+ pen poipen;
+ color mygrey;
+ path thecircle;
+ thang = -45;
+ stepang = 4;
+ poipen = pencircle scaled 1mm;
+ mygrey = 0.5*(red+green);
+ u = 1cm;
+ %abratio = 0.5*(1+sqrt(5));
+ abratio = 1.2;
+ foc = u*(abratio +-+ 1);
+ refdist = 2*u*abratio;
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ factor = 1.02;
+ secofod := 2*foc*dir(thang);
+ thecircle = fullcircle scaled 2refdist;
+ pickup pencircle scaled 0;
+ %draw fullcircle scaled 2u xscaled abratio shifted (foc,0);
+ %draw thecircle;
+ draw secofod withpen poipen withcolor blue;
+ for pang = stepang step stepang until 360:
+ ocirpoi := refdist*dir(pang);
+ midpoi := 0.5[secofod,ocirpoi];
+ auxang := angle(ocirpoi-secofod);
+ dirplu := dir(auxang+90);
+ dirmin := dir(auxang-90);
+ pair tpoi;
+ tpoi = whatever*dir(pang);
+ tpoi = whatever[midpoi,midpoi+dirplu];
+ %draw ocirpoi--secofod withcolor mygrey;
+ %draw tpoi withpen poipen withcolor red;
+ drawarrow tpoi--(tpoi+abs(midpoi-secofod)*dirplu/factor);
+ endfor;
+ clip currentpicture to (thecircle scaled (factor**2));
+ draw origin withpen poipen withcolor green;
+endfig;
+
+verbatimtex \end{document} etex
+
+end.
+
+Newton showed this construction in Book 1, Section 4, Lemma 15, of
+Principia. On March 13, 1964, Feynman resurrected the construction and
+used it in a lecture, "The Motion of Planets Around the Sun". The
+lecture is detailed in a book with audio CD, Feynman's Lost Lecture,
+by David and Judith Goodstein. In the lecture, Feynman used the
+diagram and differential geometry to prove the planetary laws of
+motion.
+In the construction, the green dot is the primary focus of the ellipse
+about which the planet orbits; the blue dot is the secondary
+focus. The black dot is on a circle at a distance in radius equal in
+length to the major axis of an ellipse. A line is drawn from the blue
+dot to the black dot and its perpendicular bisector is
+constructed. The point where this perpendicular bisector intersects
+the line from the green dot (primary focus) to the black dot (circle)
+is a point on the ellipse. The perpendicular bisector is tangent to
+the ellipse at this point. A further interesting point of the
+construction is that the length of the line from the blue dot
+(secondary focus) to the black dot (circle) is proportional to the
+velocity of the orbiting planet at this point. In the Demonstration,
+half this length is represented by the black vector traveling in the
+direction of the planet.
+All of the possible ellipses with the given major axis are contained
+in the circle. You can adjust the eccentricity and rotation of the
+ellipse. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/kindofcube.mp b/graphics/metapost/contrib/macros/featpost/example/kindofcube.mp
new file mode 100644
index 0000000000..3fdb607827
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/kindofcube.mp
@@ -0,0 +1,81 @@
+% kindofcube.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+Spread := 30;
+f := 5.4*(1.5,0.5,1);
+
+beginfig(1);
+ numeric gridstep, sidenumber, i, j, coord, aa, ab, ac;
+ color pa;
+ gridstep = 0.9;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ for j=0 upto sidenumber:
+ pa := (-coord+j*gridstep,-coord+i*gridstep,0);
+ aa := uniformdeviate(360);
+ ab := uniformdeviate(180);
+ ac := uniformdeviate(90);
+ kindofcube( false, false, pa, aa, ab, ac, 0.4, 0.4, 0.9 );
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2);
+ f := (4,1.0,0.5);
+ Spread := 120;
+ numeric lena, lenb, lenc, aa, ab, ac, angray, micr;
+ pair zeror;
+ color axa, axb, axc, returnedcorner, dummyc, auxx, auxy;
+ lena=0.3;
+ lenb=0.6;
+ lenc=0.9;
+ aa=130;
+ ab=20;
+ ac=70;
+ angray=0.7;
+ micr=0.01;
+ zeror=rp(black);
+ cartaxes(1,1,1);
+ axa = ( cosd(aa), sind(aa), 0 );
+ axb = axa*cosd(ab)+blue*sind(ab);
+ auxx= ( cosd(aa+90), sind(aa+90), 0);
+ auxy = ncrossprod( axb, auxx );
+ axc = auxx*cosd(ac)+auxy*sind(ac);
+ draw zeror--rp(axa);
+ draw zeror--rp(axb);
+ draw zeror--rp(-axa);
+ draw zeror--rp(axc);
+ draw zeror--rp(auxx);
+ label.rt( btex $a$ etex, rp(axa) );
+ label.rt( btex $b$ etex, rp(axb) );
+ label.lft( btex $c$ etex, rp(auxx) );
+ label.lft( btex $d$ etex, rp(axc) );
+ label.bot( btex $o$ etex, zeror );
+ angline( axa,red,black,angray,btex $\alpha_1$ etex,bot );
+ angline( axb,axa,black,angray,btex $\alpha_2$ etex,rt );
+ angline( axc,auxx,black,angray,btex $\alpha_3$ etex,lft );
+ squareangline( -axa,auxx,black,0.2);
+ kindofcube( true, true, black, aa, ab, ac, lena, lenb, lenc );
+ draw zeror--rp(blue) dashed evenly;
+ dotlabel.bot( btex $l_1$ etex, rp(lena*axb) );
+ dotlabel.rt( btex $l_2$ etex, rp(lenb*axc) );
+ dotlabel.top( btex $l_3$ etex, rp(lenc*ncrossprod(axb,axc) ) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/kindofcuber.mp b/graphics/metapost/contrib/macros/featpost/example/kindofcuber.mp
new file mode 100644
index 0000000000..c6b066a28d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/kindofcuber.mp
@@ -0,0 +1,59 @@
+% kindofcube.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := (4,1.2,0.5);
+ Spread := 120;
+ numeric lena, lenb, lenc, aa, ab, ac, angray, micr, labscal;
+ pair zeror;
+ color axa, axb, axc, returnedcorner, dummyc, auxx, auxy;
+ lena=0.3;
+ lenb=0.6;
+ lenc=0.9;
+ aa=130;
+ ab=32;
+ ac=67;
+ labscal=1.6;
+ angray=0.85;
+ micr=0.01;
+ zeror=rp(black);
+ cartaxes(1.2,1,1.15);
+ axa = ( cosd(aa), sind(aa), 0 );
+ axb = axa*cosd(ab)+blue*sind(ab);
+ auxx= ( cosd(aa+90), sind(aa+90), 0);
+ auxy = ncrossprod( axb, auxx );
+ axc = auxx*cosd(ac)+auxy*sind(ac);
+ draw zeror--rp(axa);
+ draw zeror--rp(axb);
+ draw zeror--rp(-0.6*axa);
+ draw zeror--rp(axc);
+ draw zeror--rp(auxx);
+ label.rt( btex $a$ etex scaled labscal, rp(axa) );
+ label.rt( btex $b$ etex scaled labscal, rp(axb) );
+ label.lft( btex $c$ etex scaled labscal, rp(auxx) );
+ label.lft( btex $d$ etex scaled labscal, rp(axc) );
+ angline( axa,red,black,angray,btex $\alpha_1$ etex scaled labscal,bot );
+ angline( axb,axa,black,angray,btex $\alpha_2$ etex scaled labscal,rt );
+ angline( axc,auxx,black,angray,btex $\alpha_3$ etex scaled labscal,lft );
+ squareangline( -axa,auxx,black,0.2);
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ kindofcube( false, true, black, aa, ab, ac, lena, lenb, lenc );
+ drawoptions();
+ dotlabel.bot( btex $\vec{o}$ etex scaled labscal, zeror );
+ label.bot( btex $l_1$ etex scaled labscal, rp(lena*axb) );
+ label.bot( btex $l_2$ etex scaled labscal, rp(0.5*lenb*axc) );
+ label.ulft( btex $l_3$ etex scaled labscal,rp(0.5*lenc*ncrossprod(axb,axc)));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/kopptrammel.mp b/graphics/metapost/contrib/macros/featpost/example/kopptrammel.mp
new file mode 100644
index 0000000000..8a22defba2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/kopptrammel.mp
@@ -0,0 +1,39 @@
+% kopptrammel.mp
+% L. Nobre G.
+% IYP (2005)
+
+beginfig(1);
+ numeric i, u, astep, pfrac, ra, rb, totray, adiff, astart;
+ pair ca, cb, pa, pb, pc;
+ path cir;
+ ra = 0.3;
+ rb = 0.9;
+ astep = 10;
+ adiff = -20;
+ pfrac = 3;
+ astart = 20;
+ u = 2cm;
+ ca = (2u,4u);
+ cb = (4u,4u);
+ totray = 0.5*abs(cb-ca);
+ cir = fullcircle scaled (2*totray);
+ draw cir shifted ca;
+ draw cir shifted cb;
+ pickup pencircle scaled (u/20);
+ for i=0 step astep until 360:
+ pa := ca + ra*totray*dir( astart+i );
+ pb := cb + rb*totray*dir( astart-i-adiff );
+ pc := pfrac[pa,pb];
+ draw pa;
+ draw pb;
+ draw pc withcolor red;
+ endfor;
+ pickup pencircle scaled (u/40);
+ draw pa--pc withcolor blue;
+ draw pb--pc;
+ draw ca;
+ draw cb;
+ draw pfrac[ca,cb];
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/labelconstruct.mp b/graphics/metapost/contrib/macros/featpost/example/labelconstruct.mp
new file mode 100644
index 0000000000..4233d40bae
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/labelconstruct.mp
@@ -0,0 +1,30 @@
+% labelconstruct.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := 1.1*(2,1,0.5);
+ParallelProj := true;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ kindofcube(false,true,(0,-0.5,0),90,0,0,1.2,0.1,0.4);
+ kindofcube(false,true,(0,0,0),0,0,0,0.5,0.1,0.8);
+ labelinspace(false,(0.45,0.1,0.65),(-0.4,0,0),(0,0,0.1),
+ btex \framebox{\textsc{Label}} etex);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/labelinspace.mp b/graphics/metapost/contrib/macros/featpost/example/labelinspace.mp
new file mode 100644
index 0000000000..b1ab6c6b2a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/labelinspace.mp
@@ -0,0 +1,33 @@
+% labelinspace.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (2,3,0.5);
+ParallelProj := true;
+
+verbatimtex
+\documentclass{article}
+%\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ cartaxes( 1, 1.3, 1 );
+ labelinspace( false, black, 0.8*blue, 0.7*red,
+ btex \framebox{$\frac{\sqrt{5}-1}{2}$} etex);
+ labelinspace( false, 0.8*blue, -0.8*blue, 0.6*green,
+ btex \framebox{$\phi$} etex);
+ labelinspace( true, 0.7*red, 0.6*green, -0.7*red,
+ btex \framebox{$\frac{1+\sqrt{5}}{2}$} etex);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/lamarquejaune.mp b/graphics/metapost/contrib/macros/featpost/example/lamarquejaune.mp
new file mode 100644
index 0000000000..d95a72e163
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lamarquejaune.mp
@@ -0,0 +1,100 @@
+
+beginfig(1);
+ numeric ulimi,rlimi;
+ path p[];
+ color jaune;
+ pen brushpen;
+ bboxmargin := 2cm;
+ jaune = 0.87*(0.97,0.84,0.01);
+ brushpen = pencircle scaled 3mm;
+ ulimi = 687;
+ rlimi = 784;
+ drawoptions( withcolor jaune withpen brushpen );
+ z1 = (671,ulimi-34);
+ z2 = (644,ulimi-61);
+ z3 = (472,ulimi-79);
+ z4 = (484,ulimi-98);
+ z5 = (417,ulimi-108);
+ z6 = (460,ulimi-117);
+ z7 = (186,ulimi-517);
+ z8 = (358,ulimi-368);
+ z9 = (301,ulimi-427);
+ z10 = (598,ulimi-80);
+ z11 = (526,ulimi-150);
+ z12 = (557,ulimi-192);
+ z13 = (581,ulimi-194);
+ z14 = (556,ulimi-215);
+ z15 = (532,ulimi-253);
+ z50 = (310,ulimi-280);
+ z51 = (365,ulimi-280);
+ z52 = (452,ulimi-312);
+ z53 = (472,ulimi-334);
+ z16 = (603,ulimi-233);
+ z17 = (578,ulimi-273);
+ z18 = (579,ulimi-239);
+ z19 = (604,ulimi-257);
+ z20 = (423,ulimi-420);
+ z21 = (515,ulimi-402);
+ z22 = (544,ulimi-420);
+ z23 = (532,ulimi-433);
+ z24 = (570,ulimi-454);
+ z25 = (528,ulimi-497);
+ z26 = (595,ulimi-3);
+ z27 = (266,ulimi-7);
+ z28 = (102,ulimi-115);
+ z29 = (7,ulimi-352);
+ z30 = (51,ulimi-532);
+ z54 = (509,ulimi-331);
+ z55 = (554,ulimi-347);
+ z31 = (178,ulimi-642);
+ z32 = (414,ulimi-668);
+ z33 = (601,ulimi-602);
+ z34 = (772,ulimi-301);
+ z35 = (730,ulimi-174);
+ z36 = (658,ulimi-219);
+ z37 = (699,ulimi-321);
+ z38 = (590,ulimi-536);
+ z39 = (406,ulimi-626);
+ z40 = (203,ulimi-594);
+ z41 = (108,ulimi-482);
+ z42 = (84,ulimi-339);
+ z43 = (131,ulimi-191);
+ z44 = (309,ulimi-45);
+ z45 = (539,ulimi-27);
+ z46 = (314,ulimi-152);
+ z47 = (171,ulimi-364);
+ z48 = (205,ulimi-368);
+ z49 = (345,ulimi-187);
+ p1 = z2--z1;
+ p2 = z1...z26...z27...z28...z29...z30...z31...z32...z34...z35...z10;
+ p3 = z10--z11;
+ p4 = z11...z36...z37...z38...z39...z40...z41...z42...z43...z44...z45...z2;
+ p5 = buildcycle( p1, p2, p3, p4 );
+ filldraw p5;
+ p6 = z3--z4;
+ p7 = z4...z49...z48...z7;
+ p8 = z7...z47...z46...z3;
+ p9 = buildcycle( p6, p7, p8 );
+ filldraw p9;
+ p10 = z5--z6;
+ p11 = z6...z51...z8;
+ p12 = z8...z52...z12;
+ p13 = z12--z13;
+ p14 = z13...z53...z9;
+ p15 = z9...z50...z5;
+ p16 = buildcycle( p10, p11, p12, p13, p14, p15 );
+ filldraw p16;
+ p17 = z14--z16--z17--z15--cycle;
+ filldraw p17;
+ p18 = z18--z19;
+ p19 = z19...z55...z21;
+ p20 = z21--z22--z23--z24--z25--z20;
+ p21 = z20..z54..z18;
+ p22 = buildcycle( p18, p19, p20, p21 );
+ filldraw p22;
+ drawoptions( withcolor white );
+ draw bbox currentpicture;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/lasermachine.mp b/graphics/metapost/contrib/macros/featpost/example/lasermachine.mp
new file mode 100644
index 0000000000..b529635475
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lasermachine.mp
@@ -0,0 +1,29 @@
+% lasermachine.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+beginfig(1);
+ numeric devi;
+ devi = 0.1;
+ path hart, it;
+ numeric u, abot, atop, delta, i;
+ u = 1in;
+ abot = 60;
+ atop = 145;
+ delta = 23;
+ z1 = ( 0, 2u);
+ z2 = ( -1u, 1.25u );
+ z3 = ( 1u, 1.25u );
+ hart = origin{dir(abot-delta)}
+ ...z3...{dir(-atop)}z1{dir(atop)}
+ ...z2...{dir(-abot)}cycle;
+ it = hart yscaled 0.85;
+ for i=2 downto -3:
+ draw lasermachine( it, devi*u*i, 0.95 ) withcolor uniformdeviate(1)*red;
+ endfor;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/latexboxes.mp b/graphics/metapost/contrib/macros/featpost/example/latexboxes.mp
new file mode 100644
index 0000000000..bbfdc0487f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/latexboxes.mp
@@ -0,0 +1,25 @@
+% used many times in LaTeX documents (\usebox{})
+% L. Nobre G.
+% 2001
+
+beginfig(0); % grayrectanglebox
+ numeric u, Nu;
+ u = 0.5mm;
+ Nu = 20;
+ transform T;
+ T = identity scaled (Nu*u) xscaled 1.33;
+ pickup pensquare scaled u;
+ draw (unitsquare transformed T) withcolor 0.7white;
+endfig;
+
+beginfig(1); % bigrectanglebox
+ numeric u, Nu;
+ u = 0.5mm;
+ Nu = 70;
+ transform T;
+ T = identity scaled (Nu*u) xscaled 1.33;
+ pickup pensquare scaled u;
+ draw (unitsquare transformed T) withcolor 0.7white;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/lawofcosines.mp b/graphics/metapost/contrib/macros/featpost/example/lawofcosines.mp
new file mode 100644
index 0000000000..5d49e0adcd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lawofcosines.mp
@@ -0,0 +1,167 @@
+% lawofcosines.mp
+% L. Nobre G.
+% 2007
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, limit, major, minor, abvcos, blwcos;
+ color gridc;
+ pen gridpmaj, gridpmin, dotp;
+ u=0.7mm;
+ limit=64;
+ major=20;
+ minor=2;
+ abvcos=0.5;
+ blwcos=1/3;
+ gridc=0.5white;
+ gridpmaj=pencircle scaled 2pt;
+ gridpmin=pencircle scaled 1.3pt;
+ dotp=pencircle scaled 2.7pt;
+% labeloffset := 3u;
+ numeric i,j, abvsin, blwsin, stpmaj, stpmin;
+ abvsin=1 +-+ abvcos;
+ blwsin=1 +-+ blwcos;
+ stpmaj=major*u;
+ stpmin=minor*u;
+ pair abvdir, blwdir, thedir;
+ abvdir=(abvcos,abvsin);
+ blwdir=(blwcos,-blwsin);
+ boolean ismajor, isaxe;
+ drawoptions( withpen gridpmin withcolor gridc );
+ for i=-limit step minor until limit:
+ ismajor := not ((i mod major)<>0);
+ if ismajor:
+ isaxe := not (i <> 0);
+ if isaxe:
+ drawoptions( withpen gridpmaj );
+ else:
+ drawoptions( withpen gridpmaj withcolor gridc );
+ fi;
+ fi;
+ draw ((i*u,0)+limit*u*blwdir)--(i*u,0)--((i*u,0)+limit*u*abvdir);
+ if i<0:
+ thedir := -blwdir;
+ else:
+ thedir := abvdir;
+ fi;
+ draw ((-limit*u,0)+i*u*thedir)--((limit*u,0)+i*u*thedir);
+ if ismajor:
+ drawoptions( );
+ label.bot( decimal( abs( i ) ), (i*u,0)+limit*u*blwdir );
+ if i<0:
+ label.llft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ elseif not (i<>0):
+ label.lft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ else:
+ label.ulft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ fi;
+ label.top( decimal( abs( i ) ), (i*u,0)+limit*u*abvdir );
+ drawoptions( withpen gridpmin withcolor gridc );
+ fi;
+ endfor;
+ drawoptions( withpen dotp withcolor red );
+ numeric signal;
+ for i=-limit upto limit:
+ if i <> 0:
+ if i<0:
+ signal := -1;
+ else:
+ signal := 1;
+ fi;
+ for j=-limit upto -2:
+ if not ( ( sqrt((i**2)+(j**2)+signal*2*abs(i*j)/3) mod 1 ) <> 0 ):
+ draw (i*u,0)-j*u*blwdir;
+ fi;
+ endfor;
+ for j=limit downto 2:
+ if not ( ( sqrt((i**2)+(j**2)+signal*2*abs(i*j)*abvcos) mod 1 ) <> 0 ):
+ draw (i*u,0)+j*u*abvdir;
+ fi;
+ endfor;
+ fi;
+ endfor;
+
+endfig;
+
+beginfig(2);
+ numeric u, limit, major, minor, abvcos, blwcos;
+ color gridc;
+ pen gridpmaj, gridpmin, dotp;
+ u=0.7mm;
+ limit=24;
+ major=20;
+ minor=2;
+ abvcos=0.8;
+ blwcos=0.9;
+ gridc=0.5white;
+ gridpmaj=pencircle scaled 1.3pt;
+ gridpmin=pencircle scaled 0.7pt;
+ dotp=pencircle scaled 1.4pt;
+% labeloffset := 3u;
+ numeric i,j, abvsin, blwsin, stpmaj, stpmin;
+ abvsin=1 +-+ abvcos;
+ blwsin=1 +-+ blwcos;
+ stpmaj=major*u;
+ stpmin=minor*u;
+ pair abvdir, blwdir, thedir;
+ abvdir=(abvcos,abvsin);
+ blwdir=(blwcos,-blwsin);
+ boolean ismajor, isaxe;
+ drawoptions( withpen gridpmin withcolor gridc );
+ for i=-limit step minor until limit:
+ ismajor := not ((i mod major)<>0);
+ if ismajor:
+ isaxe := not (i <> 0);
+ if isaxe:
+ drawoptions( withpen gridpmaj );
+ else:
+ drawoptions( withpen gridpmaj withcolor gridc );
+ fi;
+ fi;
+ draw ((i*u,0)+limit*u*blwdir)--(i*u,0)--((i*u,0)+limit*u*abvdir);
+ if i<0:
+ thedir := -blwdir;
+ else:
+ thedir := abvdir;
+ fi;
+ draw ((-limit*u,0)+i*u*thedir)--((limit*u,0)+i*u*thedir);
+ if ismajor:
+ drawoptions( );
+ label.bot( decimal( abs( i ) ), (i*u,0)+limit*u*blwdir );
+ if i<0:
+ label.llft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ elseif not (i<>0):
+ label.lft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ else:
+ label.ulft( decimal( abs( i ) ), (-limit*u,0)+i*u*thedir );
+ fi;
+ label.top( decimal( abs( i ) ), (i*u,0)+limit*u*abvdir );
+ drawoptions( withpen gridpmin withcolor gridc );
+ fi;
+ endfor;
+ drawoptions( withpen dotp withcolor red );
+ numeric signal;
+ for i=-limit upto limit:
+ if i <> 0:
+ if i<0:
+ signal := -1;
+ else:
+ signal := 1;
+ fi;
+ for j=-limit upto -2:
+ if not ( ( sqrt((i**2)+(j**2)+signal*18*abs(i*j)/10) mod 1 ) <> 0 ):
+ draw (i*u,0)-j*u*blwdir;
+ fi;
+ endfor;
+ for j=limit downto 2:
+ if not ( ( sqrt((i**2)+(j**2)+signal*8*abs(i*j)/5) mod 1 ) <> 0 ):
+ draw (i*u,0)+j*u*abvdir;
+ fi;
+ endfor;
+ fi;
+ endfor;
+ draw origin withcolor blue withpen dotp;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/lcurvature.mp b/graphics/metapost/contrib/macros/featpost/example/lcurvature.mp
new file mode 100644
index 0000000000..14fc30e775
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lcurvature.mp
@@ -0,0 +1,114 @@
+% lcurvature.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (5,3,4);
+ Spread := 70;
+ numeric gridstep, anglstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, vcx, vcy, vcz, curangle, curnorma;
+ numeric major, othcoord, othangle;
+ color base, lenvec;
+ cylength := 0.1;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ anglstep := 10;
+ numcylis := 5;
+ major := 0.35*gridstep*numcylis;
+ for i=1 upto numcylis: % bend
+ curnorma := i-0.5*(numcylis+1);
+ curangle := curnorma*anglstep;
+ vcx := cylength*cosd(curangle);
+ vcy := 0;
+ vcz := cylength*sind(curangle);
+ base := major*(sind(curangle),-1,-cosd(curangle));
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ for i=1 upto numcylis: % twist
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := 0;
+ vcy := cylength*sind(curangle);
+ vcz := cylength*cosd(curangle);
+ base := (curcoord,-vcy/2-major,-vcz/2+major);
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ for i=1 upto numcylis: % splay
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := cylength*sind(curangle);
+ vcy := 0;
+ vcz := -cylength*cosd(curangle);
+ lenvec := (vcx,vcy,vcz);
+ for j=1 upto numcylis:
+ othcoord := (j-0.5*(numcylis+1))*gridstep;
+ base := major*(0,1,-cosd(curangle));
+ base := base +(curcoord,othcoord,0);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+ for i=1 upto numcylis: % saddle
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := curnorma*anglstep;
+ vcx := cylength*sind(curangle);
+ for j=1 upto numcylis:
+ othcoord := (j-0.5*(numcylis+1))*gridstep;
+ othangle := (j-0.5*(numcylis+1))*anglstep;
+ vcy := -cylength*sind(othangle);
+ vcz := -cylength*cosd(curangle)*cosd(othangle);
+ base := major*(0,1,1-cosd(curangle)+cosd(othangle));
+ base := base + (curcoord,othcoord,0);
+ lenvec := (vcx,vcy,vcz);
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2);
+ f := (5,3,4);
+ Spread := 70;
+ numeric gridstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, curangle, curnorma;
+ numeric othcoord, othangle, zcoord, coef, othnorma;
+ color base, lenvec;
+ cylength := 0.1;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ numcylis := 5;
+ coef := 0.32;
+ for i=1 upto numcylis: % splay
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := -curcoord*2*coef;
+ for j=1 upto numcylis:
+ othnorma := j-0.5*(numcylis+1);
+ othcoord := othnorma*gridstep;
+ othangle := -othcoord*2*coef;
+ zcoord := -coef*(othcoord**2+curcoord**2);
+ base := (curcoord,othcoord,zcoord);
+ lenvec := cylength*N((-curangle,-othangle,1));
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ledlogo.mp b/graphics/metapost/contrib/macros/featpost/example/ledlogo.mp
new file mode 100644
index 0000000000..7a00407d60
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ledlogo.mp
@@ -0,0 +1,202 @@
+% ledlogo.mp
+% L. Nobre G.
+% 2007
+
+beginfig(1);
+ numeric u, penangle, peneccen, penminor, letterheig, letterwid, letterang;
+ u=2mm;
+ penangle=112;
+ peneccen=2.1;
+ penminor=2u;
+ letterheig=15u;
+ letterwid=12u;
+ letterang=-25;
+ numeric hdist, vdist, letterslantang, margindist, humanang, humanfactor;
+ hdist=7u;
+ vdist=7u;
+ letterslantang=20;
+ margindist=4.7u;
+ humanang=7;
+ humanfactor=0.2;
+ pen paintpen;
+ paintpen = pencircle scaled penminor xscaled peneccen rotated penangle;
+ pickup paintpen;
+ pair letterup, letterig, dirabove, dirbelow;
+ letterup=dir(90+letterang-letterslantang);
+ letterig=dir(letterang);
+ dirabove=dir(90+letterang-letterslantang+humanang);
+ dirbelow=dir(90+letterang-letterslantang-humanang);
+ z0=origin;
+ z1=z0-letterheig*letterup;
+ z2=z1+letterwid*letterig;
+ z3=z0+hdist*letterig+0.5*letterheig*letterup;
+ z4=z3-letterheig*letterup;
+ z5=z4+letterwid*letterig;
+ z6=z3+hdist*letterig+0.5*letterheig*letterup;
+ z7=z6-letterheig*letterup;
+ z8=z6-(letterheig-margindist)*letterup;
+ z9=z3+letterwid*letterig;
+ z10=z9+margindist*letterig;
+ z11=z0-(letterheig-humanfactor*margindist)*letterup;
+ z12=z1+humanfactor*margindist*letterig;
+ z13=z3-(letterheig-humanfactor*margindist)*letterup;
+ z14=z4+humanfactor*margindist*letterig;
+ z15=z7-2*humanfactor*hdist*letterig;
+ drawoptions( withcolor 0.876*red+0.7*green );
+% draw z0--z1--z2;
+% draw z9--z3--z4--z5;
+% draw z8---z6{letterig}..{unitvector(z2-z5)}z10..z7;
+ draw z0{-dirabove}..z11...z12..{letterig}z2;
+ draw z9--z3{-dirabove}..z13...z14..{letterig}z5;
+ draw z8{dirbelow}..z6{letterig}..{unitvector(z2-z5)}z10..z15;
+endfig;
+
+verbatimtex
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\renewcommand*\rmdefault{cmdh}
+\begin{document}
+etex
+
+beginfig(2);
+ picture led;
+ led = thelabel( btex led etex, origin );
+ pair ledshift;
+ ledshift = (0.3pt,-4.4pt);
+ numeric dc, db, da;
+ dc = 24pt;
+ db = 6.9pt;
+ da = 4.98pt;
+ fill fullcircle scaled dc withcolor red;
+% fill fullcircle scaled db withcolor (red+green);
+ fill fullcircle scaled db withcolor 0.5green;
+ draw led shifted ledshift withcolor (red+green);
+endfig;
+
+prologues := 1;
+
+beginfig(3);
+ numeric u, altur, diam, espessum, margem, distdisp, separ, frac;
+ color vermel, amarel;
+ vermel = 0.75red;
+ amarel = 0.876*red+0.7*green;
+ u = 5cm;
+ diam = 0.23u;
+ margem = 0.85diam;
+ altur = u-margem;
+ frac = 0.7;
+ numeric auxdist, lencirc, orientang, limitshift, i;
+ limitshift = 1.6u;
+ auxdist = (1u-2margem)*0.5;
+ distdisp = auxdist*sqrt(2) - diam;
+ 3*separ+2*espessum = distdisp;
+ separ = frac*espessum;
+ lencirc = length fullcircle;
+ path uma, umb;
+ uma = (0.5separ,-0.5diam)--(0.5separ+espessum,-0.5diam)
+ --(0.5separ+espessum,0.5diam)--(0.5separ,0.5diam)--cycle;
+ umb = uma rotated 180;
+ fill uma withcolor amarel;
+ fill umb withcolor amarel;
+ picture parduns;
+ parduns = currentpicture;
+ currentpicture := nullpicture;
+ path botcirc, caminhescudo, circulbase;
+ circulbase = fullcircle scaled diam;
+ botcirc = subpath (0.5*lencirc,lencirc) of fullcircle scaled u;
+ caminhescudo = botcirc--(0.5u,altur)--(-0.5u,altur)--cycle;
+ fill caminhescudo withcolor vermel;
+ z1 = ( auxdist, altur-margem );
+ z2 = ( -auxdist, altur-margem );
+ z3 = ( auxdist, 0 );
+ z4 = ( -auxdist, 0 );
+ z5 = ( 0, auxdist );
+ fill circulbase shifted z1 withcolor amarel;
+ fill circulbase shifted z2 withcolor amarel;
+ fill circulbase shifted z3 withcolor amarel;
+ fill circulbase shifted z4 withcolor amarel;
+ fill circulbase shifted z5 withcolor amarel;
+ z6 = 0.5[z5,z1];
+ z7 = 0.5[z5,z2];
+ z8 = 0.5[z5,z3];
+ z9 = 0.5[z5,z4];
+ draw parduns rotated 45 shifted z6;
+ draw parduns rotated -45 shifted z7;
+ draw parduns rotated -45 shifted z8;
+ draw parduns rotated 45 shifted z9;
+ numeric actshift;
+ for orientang=45 step 90 until 360:
+ actshift := auxdist*sqrt(2) + 0.5diam + separ;
+ forever:
+ if uniformdeviate(1)<0.5:
+ actshift := actshift + espessum + 0.5separ;
+ draw parduns shifted (actshift,0) rotated orientang shifted z5;
+ exitif actshift>limitshift;
+ actshift := actshift + espessum + 0.5separ;
+ else:
+ actshift := actshift + 0.5diam;
+ fill circulbase shifted (actshift,0) rotated orientang shifted z5
+ withcolor amarel;
+ exitif actshift>limitshift;
+ actshift := actshift + 0.5diam;
+ fi;
+ actshift := actshift + separ;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(4);
+ numeric u, hthick, vthick, lspace, espace, dspace, h, lbase, dbase;
+ numeric dinray, halfh, diffe;
+ u = 0.5mm;
+ hthick = 20u;
+ vthick = 10u;
+ lspace = 15u;
+ espace = 8u;
+ dspace = 8u;
+ h = 3*vthick+2*espace;
+ lbase = 38u;
+ dbase = 16u;
+ halfh = h/2;
+ dinray = halfh-vthick;
+ diffe = 2*vthick+espace-halfh;
+ path pathl, pathe, pathd, pathu;
+ z0 = (0,0);
+ z1 = (lbase,0);
+ z2 = (lbase,vthick);
+ z3 = (hthick,vthick);
+ z4 = (hthick,h);
+ z5 = (0,h);
+ pathl = z0--z1--z2--z3--z4--z5--cycle;
+ z6 = (lbase+lspace,0);
+ z7 = z6 + (h,0);
+ z8 = z7 + (0,vthick);
+ z9 = z6 + (vthick,vthick);
+ z10= z9 + (0,espace);
+ z11= z10+ (vthick,0);
+ z12= z11+ (-vthick,vthick);
+ z13= z6 + (-diffe,2*vthick+espace);
+ z14=z13+(diffe,-diffe);
+ pathe = z6--z7--z8--z9--z10--z11--z12--z13--z14--cycle;
+ z15= z7 + (dspace,0);
+ z16= z15+ (halfh,halfh);
+ z17= z15+ (0,h);
+ z18= z17- (halfh,0);
+ z19= z18+ (halfh,-halfh);
+ z20= z15+ (0,h-vthick);
+ z21= z20+ (dinray,-dinray);
+ z22= z15+ (0,vthick);
+ pathd = z15..z16..z17---z18--z19--z20..z21..z22--cycle;
+ z24= z6 + (-halfh,h);
+ z25= z24+ (h,0);
+ z26= z25+ (vthick,-vthick);
+ z27= z26- (h,0);
+ pathu = z24--z25--z26--z27--cycle;
+ fill pathl withcolor 0.78red;
+ fill pathe;
+ fill pathd;
+ fill pathu;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/lgc2refractionEdited.mp b/graphics/metapost/contrib/macros/featpost/example/lgc2refractionEdited.mp
new file mode 100644
index 0000000000..b62491b74a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lgc2refractionEdited.mp
@@ -0,0 +1,126 @@
+% lgc2refractionEdited.mp
+% lgc means LaTeX Graphics Companion
+% 2014
+
+prologues := 1;
+
+vardef refractray(expr s,a,p,rir)=
+ save tI,tn,ia,ib,I,J,sib;
+ pair I,J;
+ tI = xpart(p intersectiontimes (s--(s+30cm*dir(a))));
+ if tI>=0:
+ I=point tI of p;
+ draw s--I;
+ tn=angle(direction tI of p)+90;
+ ia=tn-angle(s-I);
+ sib=sind(ia)/rir;
+ ib=-angle(1+-+sib,sib);
+ J=I+dir(tn+180+ib)*2cm;
+ draw I--J withcolor blue;
+ fi;
+enddef;
+
+beginfig(1);
+ numeric u;
+ u=3mm;
+ path p;
+ p=((5u,-6u)..(4u,-2u)..(4.5u,0)..(5u,5u)) rotated 90;
+ for a=40 step 5 until 140: refractray(origin,a,p,1.5); endfor;
+ draw p withcolor red;
+endfig;
+
+vardef lensrefractray(expr s,a,p,q,rir)=
+ save tI,tn,ia,ib,I,J,K,sib;
+ pair I,J,K;
+ tI = xpart(p intersectiontimes (s--(s+30cm*dir(a))));
+ if tI>=0:
+ I=point tI of p;
+ draw s--I;
+ tn=angle(direction tI of p)+90;
+ ia=tn-angle(s-I);
+ sib=sind(ia)/rir;
+ ib=-angle(1+-+sib,sib);
+ J=I+dir(tn+180+ib)*2cm;
+ tI := xpart(q intersectiontimes (I--J));
+ if tI>=0:
+ K:=point tI of q;
+ draw I--K withcolor blue;
+ tn:=angle(direction tI of q)+90;
+ ia:=tn-angle(I-K);
+ sib:=rir*sind(ia);
+ ib:=angle(1+-+sib,sib);
+ J:=K+dir(tn+ib)*2cm;
+ draw K--J;
+ fi;
+ fi;
+enddef;
+
+beginfig(2);
+ path q;
+ q = reverse (p yscaled (-1)) shifted (up*10.5u);
+ fill (p--q--cycle) withcolor red;
+ for a=46 step 3 until 120:
+ lensrefractray(origin,a,p,q,1.4);
+ endfor;
+endfig;
+
+vardef reflectray(expr s,a,p,l)=
+ save tI,tn,ia,I,J;
+ pair I,J;
+ tI=xpart(p intersectiontimes (s--(s+30cm*dir(a))));
+ if tI>=0:
+ I=point tI of p;
+ draw s--I;
+ tn=angle(direction tI of p)+90;
+ ia=tn-angle(s-I);
+ J=I+dir(tn+ia)*l;
+ draw I--J withcolor blue;
+ fi;
+enddef;
+
+beginfig(3);
+ for a=40 step 5 until 140: reflectray(origin,a,p,2cm); endfor;
+ draw p withcolor red;
+endfig;
+
+vardef doublereflection(expr s,a,p,q,l,m)=
+ save tI,tn,ia,I,J,K;
+ pair I,J,K;
+ tI=xpart(p intersectiontimes (s--(s+30cm*dir(a))));
+ if tI>=0:
+ I=point tI of p;
+ draw s--I;
+ tn=angle(direction tI of p)+90;
+ ia=tn-angle(s-I);
+ J=I+dir(tn+ia)*l;
+ tI := xpart(q intersectiontimes (I--J));
+ if tI>=0:
+ K:=point tI of q;
+ draw I--K withcolor blue;
+ tn:=angle(direction tI of q)+90;
+ ia:=tn-angle(I-K);
+ J:=K+dir(tn+ia)*m;
+ draw K--J;
+ fi;
+ fi;
+enddef;
+
+beginfig(4);
+ numeric u, ad, len;
+ u=3mm;
+ ad=83;
+ len = 5cm;
+ path p,q;
+ pair sourc;
+ sourc = (-2u,0);
+ p=(-5u,0){up}..{right}(3u,9u);
+ q=(6u,0)..{dir(ad)}(10u,11u);
+ for a=60 step 3 until 120:
+ %reflectray(sourc,a,p,len);
+ doublereflection(sourc,a,p,q,len,0.3*len);
+ endfor;
+ draw p withcolor red;
+ draw q withcolor red;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/loglogpaper.mp b/graphics/metapost/contrib/macros/featpost/example/loglogpaper.mp
new file mode 100644
index 0000000000..24e04e9e19
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/loglogpaper.mp
@@ -0,0 +1,71 @@
+% loglogpaper.mp
+% L. Nobre G.
+% 2012
+
+prologues := 3;
+
+vardef logten( expr Arg )=
+ (1.696463*mlog( Arg )/1000)
+enddef;
+
+message "log(100) = " & decimal( logten( 100.00 ) );
+message "log(300) = " & decimal( logten( 300.00 ) );
+message "log(0.01)= " & decimal( logten( 0.01 ) );
+message "log(0.03)= " & decimal( logten( 0.03 ) );
+
+beginfig(1);
+ numeric xdecs, ydecs, xdecsiz, ydecsiz, llcornx, llcorny, i, j;
+ numeric tmpvalx, tmpvaly;
+ color colormain, coloraux;
+ picture singledec;
+ pen penmain, penaux;
+ xdecs = 7;
+ ydecs = 5;
+ xdecsiz = 22mm;
+ ydecsiz = 22mm;
+ llcornx = 20mm;
+ llcorny = 10mm;
+ colormain = 0.05white;
+ coloraux = blue+green;
+ penmain = pencircle scaled 0.26mm;
+ penaux = pencircle scaled 0.111mm;
+ drawoptions( withpen penaux withcolor coloraux );
+ for i=0 upto 10:
+ tmpvalx := xdecsiz*(logten(10+i*2)-1);
+ draw (tmpvalx,0)--(tmpvalx,ydecsiz);
+ tmpvaly := ydecsiz*(logten(10+i*2)-1);
+ draw (0,tmpvaly)--(xdecsiz,tmpvaly);
+ endfor;
+ drawoptions( withpen penmain withcolor colormain );
+ for i=1 upto 10:
+ tmpvalx := xdecsiz*(logten(10*i)-1);
+ draw (tmpvalx,0)--(tmpvalx,ydecsiz);
+ tmpvaly := ydecsiz*(logten(10*i)-1);
+ draw (0,tmpvaly)--(xdecsiz,tmpvaly);
+ endfor;
+ singledec = currentpicture;
+ currentpicture := nullpicture;
+ drawoptions();
+ for i=1 upto xdecs:
+ for j=1 upto ydecs:
+ draw singledec shifted (llcornx+(i-1)*xdecsiz,llcorny+(j-1)*ydecsiz);
+ endfor;
+ endfor;
+ label.bot("0.1",(llcornx,llcorny));
+ label.bot("1",(llcornx+xdecsiz,llcorny));
+ label.bot("10",(llcornx+2*xdecsiz,llcorny));
+ label.bot("100",(llcornx+3*xdecsiz,llcorny));
+ label.bot("1000",(llcornx+4*xdecsiz,llcorny));
+ label.bot("10000",(llcornx+5*xdecsiz,llcorny));
+ label.bot("100000",(llcornx+6*xdecsiz,llcorny));
+ label.bot("1000000",(llcornx+7*xdecsiz,llcorny));
+ label.lft("0.0001",(llcornx,llcorny));
+ label.lft("0.001",(llcornx,llcorny+ydecsiz));
+ label.lft("0.01",(llcornx,llcorny+2*ydecsiz));
+ label.lft("0.1",(llcornx,llcorny+3*ydecsiz));
+ label.lft("1",(llcornx,llcorny+4*ydecsiz));
+ label.lft("10",(llcornx,llcorny+5*ydecsiz));
+endfig;
+
+end.
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/logofontest.mp b/graphics/metapost/contrib/macros/featpost/example/logofontest.mp
new file mode 100644
index 0000000000..ddccb82f27
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/logofontest.mp
@@ -0,0 +1,35 @@
+% logofontest.mp
+% L. Nobre G.
+% 2004
+
+input boxes;
+
+verbatimtex
+\documentclass{article}
+%\usepackage{charter}% no bold
+\usepackage{newcent}
+%\usepackage{palatino}
+\pagestyle{empty}
+\begin{document}
+etex
+
+beginfig(0);
+ picture thestatement;
+ thestatement = thelabel( btex
+ \begin{tabular}{c}
+ \textbf{\texttt{{\Large T}$\!$ecnumbria}} \\
+ \texttt{\scriptsize a sombra da tecnologia}
+ \end{tabular}
+ etex, origin);
+ circleit.state( thestatement );
+ state.dx = state.dy;
+ pickup pencircle scaled 1pt;
+ fill bpath.state withcolor (0.25,0.33,0.75);
+ draw bpath.state;
+ draw thestatement;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/lowcostgreenhouse.mp b/graphics/metapost/contrib/macros/featpost/example/lowcostgreenhouse.mp
new file mode 100644
index 0000000000..92c09ff7d3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/lowcostgreenhouse.mp
@@ -0,0 +1,71 @@
+% lowcostgreenhouse.mp
+% L. Nobre G.
+% 2014
+
+prologues := 3;
+
+verbatimtex \documentclass{article}\begin{document} etex;
+
+beginfig(1);
+ numeric u;
+ u = 7mm;
+ numeric numcenhexagons, marg;
+ numcenhexagons = 2;
+ marg = 0.2u;
+ numeric wid, len, ray, basewid;
+ basewid = 11*sqrt(3)/3;
+ wid = basewid*u;
+ len = 2*u*(3*numcenhexagons+basewid);
+ draw (-marg,-marg)--(marg+wid,-marg)--
+ (marg+wid,marg+len)--(-marg,marg+len)--cycle;
+ path botcircle, topcircle;
+ z1 = (wid/2,0);
+ botcircle = halfcircle scaled wid shifted z1;
+ z2 = (0,len);
+ topcircle = botcircle yscaled -1 shifted z2;
+ draw botcircle;
+ draw topcircle;
+ z3 = (0,len-wid/2);
+ z4 = (wid,len-wid/2);
+ draw z3--z4 withcolor red;
+ z5 = (0,wid/2);
+ z6 = (wid,wid/2);
+ draw z5--z6 withcolor red;
+ z7 = (0,-2marg);
+ z8 = (wid,-2marg);
+ drawdblarrow z7--z8;
+ label.bot(btex $w$ etex, 0.5[z7,z8]);
+ z9 = (-2marg, wid);
+ z10 = (-2marg, 0);
+ drawdblarrow z9--z10;
+ label.lft(btex $w=\frac{11}{3}\sqrt{3}$ etex, 0.5[z9,z10]);
+ numeric j, k;
+ k = 11;
+ for j=wid*(1-0.5*sqrt(3)) step 6u until len-sqrt(3)*wid:
+ z[k] = (0,j);
+ z[k+1] = (wid,j+sqrt(3)*wid);
+ draw z[k]--z[k+1];
+ z[k+2] = (wid,j);
+ z[k+3] = (0,j+sqrt(3)*wid);
+ draw z[k+2]--z[k+3];
+ z[k+4] = (0,j+0.5*sqrt(3)*wid-1.5u);
+ z[k+5] = (wid,j+0.5*sqrt(3)*wid-1.5u);
+ draw z[k+4]--z[k+5] withcolor (red+blue);
+ z[k+6] = (0,j+0.5*sqrt(3)*wid+1.5u);
+ z[k+7] = (wid,j+0.5*sqrt(3)*wid+1.5u);
+ draw z[k+6]--z[k+7] withcolor (red+blue);
+ k := k+8;
+ endfor;
+ z100 = z16+2*marg*right;
+ z101 = z18+2*marg*right;
+ drawdblarrow z101--z100;
+ label.rt(btex $3$ etex, 0.5[z100,z101]);
+ z200 = z19-2*marg*right;
+ z201 = z17-2*marg*right;
+ drawdblarrow z201--z200;
+ label.lft(btex $1$ etex, 0.5[z200,z201]);
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/magneticflux.mp b/graphics/metapost/contrib/macros/featpost/example/magneticflux.mp
new file mode 100644
index 0000000000..2266ed50cb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/magneticflux.mp
@@ -0,0 +1,105 @@
+% magneticflux.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+TDAtiplen := 0.1; % tdarrow
+TDAhalftipbase := 0.04; % Three-Dimensional
+TDAhalfthick := 0.02; % Arrow
+ForePen := pencircle scaled 10pt;
+BackPen := pencircle scaled 6pt;
+
+numeric ranga;
+ranga = 30+uniformdeviate(120);
+
+def ellip( expr TheVal ) =
+ ( (cosd(360*TheVal),sind(360*TheVal)/sind(ranga),0) )
+enddef;
+
+beginfig(2);
+ f := ( 4, 1, 2 );
+ Spread := 90;
+ pen blackpen, whitepen;
+ numeric majoraxe, i, j, gridstepn, gridstep, gridstart, halen, rang;
+ numeric ellfocus, totdist, marginl;
+ path espira, partes, covere;
+ color avec, midvec;
+ halen = 1;
+ marginl = 0.14;
+ rang = 45+30*floor(uniformdeviate(3.9));
+ show rang;
+ avec = (0,cosd(rang),sind(rang))*halen;
+ blackpen = pencircle scaled 5pt;
+ whitepen = pencircle scaled 3pt;
+ majoraxe = 1.2 + uniformdeviate(0.8);
+ ellfocus = majoraxe +-+ 1;
+ gridstepn= 15;
+ gridstep = 2*majoraxe/(gridstepn-1);
+ gridstart= 0.5*gridstepn*gridstep;
+ espira = ellipticpath( black, -red, -green*majoraxe );
+ draw espira withpen blackpen;
+ undraw espira withpen whitepen;
+ for j=-1 step gridstep until 1:
+ for i=-gridstart step gridstep until gridstart:
+ midvec := (j,i,0);
+ totdist := conorm(midvec-(0,-ellfocus,0))+conorm(midvec-(0,ellfocus,0));
+ if 2*majoraxe-marginl > totdist:
+ tdarrow( midvec, midvec+avec );
+% draw rp(midvec) withpen whitepen;
+ fi;
+ endfor;
+ endfor;
+ partes = subpath (10.3,25.6) of espira;
+ covere = subpath (10,26) of espira;
+ draw partes withpen blackpen;
+ undraw covere withpen whitepen;
+endfig;
+
+beginfig(1);
+ f := ( 4, 1.9, 1.22 );
+ Spread := 90;
+ numeric nodc, lsc;
+ nodc = 10;
+ lsc = 2.4;
+ closedline( true, 200, 0.5, 1.75 )( ellip );
+ numeric i, j, circlesize, polar, phi;
+ color currpos, ini, fin, avec;
+ string comm;
+ avec = (0,cosd(ranga),sind(ranga));
+ circlesize = 1.86/nodc;
+ for i=0.93 step -circlesize until 0.4*circlesize:
+ polar := floor(6.28318*i/circlesize);
+ for j=1 upto polar:
+ phi := 360*j/polar;
+ currpos := i*(cosd(phi),sind(phi)/sind(ranga),0);
+ comm:="tdarrow("
+ & cstr( currpos )
+ & ","
+ & cstr( currpos + avec )
+ & ");";
+ getready( comm, currpos );
+ endfor;
+ endfor;
+ doitnow;
+ pickup pencircle scaled 2pt;
+ drawarrow rp((0,1.07/sind(ranga),0))--rp((0,2.47,0));
+ drawarrow rp((1.07,0,0))--rp((1.67,0,0));
+ angline((0,2.37,0),(0,0.93/sind(ranga),0)+avec,(0,0.93/sind(ranga),0),
+ 0.3, btex $\alpha$ etex scaled lsc, urt);
+ label.bot( btex $x$ etex scaled lsc, rp((1.67,0,0)) );
+ label.bot( btex $y$ etex scaled lsc, rp((0,2.47,0)) );
+endfig;
+
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/mainmemtest.mp b/graphics/metapost/contrib/macros/featpost/example/mainmemtest.mp
new file mode 100644
index 0000000000..c6ec246faf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mainmemtest.mp
@@ -0,0 +1,59 @@
+% mainmemtest.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 500;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base;
+% It should work with sizevec := (8,6,1);
+% with (9,6,1) and sharpraytrace it says
+% ! MetaPost capacity exceeded, sorry [main memory size=2199001].
+% sizevec := (7,6,1);
+% This has been degrading all along the growth of FeatPost.
+% Now the message is
+% ! MetaPost capacity exceeded, sorry [independent variables=33554431].
+% sizevec := (6,6,1);
+ sizevec := (4,4,1);
+ gridvec := (0.05,0.1,0.1);
+ thetamin := 55;
+ thetamax := 125;
+ long := 0.08;
+ base := 0.01;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ counter := 2;
+ for i=1 upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 90;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ generatedirface( counter, phi, theta, long, base, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NF := decr(counter);
+ sharpraytrace;
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/manjusha.mp b/graphics/metapost/contrib/macros/featpost/example/manjusha.mp
new file mode 100644
index 0000000000..0fa9d55608
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/manjusha.mp
@@ -0,0 +1,76 @@
+
+numeric u;
+u = 1cm;
+pen thin, thick;
+thin = pencircle scaled 1pt;
+thick= pencircle scaled 3pt;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ pair a, b, c, d;
+ a = origin;
+ b = (1u,2u);
+ c = (4u,2u);
+ d = (6u,0);
+ path lines, curve;
+ lines = a--b--c--d;
+ curve = a..controls b and c..d; %%%%%%%%%%% This is quite powerfull.
+ draw lines withpen thin withcolor red+blue;
+ draw curve withpen thin withcolor blue;
+ drawoptions( withpen thick );
+ draw a;
+ draw b;
+ draw c;
+ draw d;
+endfig;
+
+beginfig(4);
+ pair a, b, c, d, e;
+ a = origin;
+ b = (2.5u,0.5u);
+ c = (4u,2u);
+ d = (6u,0);
+ e = (4u,-0.5u);
+ drawoptions( withcolor blue );
+ picture thecaption;
+ thecaption = btex Degree 3 etex;
+ label( thecaption, e );
+ path lines, curve;
+ lines = a--b--c--d;
+ curve = a..controls b and c..d;
+ draw lines withpen thin withcolor red+blue;
+ draw curve withpen thin withcolor blue;
+ drawoptions( withpen thick withcolor red+green );
+ draw a;
+ draw b;
+ draw c;
+ draw d;
+endfig;
+
+beginfig(6);
+ numeric n, i;
+ n = 100;
+ pair p[];
+ for i=1 upto n:
+ p[i] = (uniformdeviate(4u),uniformdeviate(3u));
+ draw p[i] withpen thick withcolor green;
+ endfor;
+ path everywhere, convexhull;
+ everywhere = p1 for i=2 upto n: --p[i] endfor --cycle;
+ convexhull = makepath makepen everywhere; %%%%%%%%%%%%%% Wow!
+ draw convexhull withpen thin withcolor red+green;
+ for i=1 upto length convexhull:
+ draw point i of convexhull withpen thick withcolor blue;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/matricskoc.mp b/graphics/metapost/contrib/macros/featpost/example/matricskoc.mp
new file mode 100644
index 0000000000..d4bb386717
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/matricskoc.mp
@@ -0,0 +1,22 @@
+% matricskoc.mp
+% Pedro Mendonca
+% 2006
+
+input featpost3Dplus2D;
+
+prologues:=2;
+
+beginfig(1);
+ ParallelProj := false;
+ SphericalDistortion := false;
+ Spread:=256;
+ f:=(5,-2,2);
+ cartaxes(-.5,.5,.5);
+ for $=-8 step 1 until 0:
+ kindofcube(true,true,($,0,0),90,0,0,.3,.05,0.1);
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/mce-lng.mp b/graphics/metapost/contrib/macros/featpost/example/mce-lng.mp
new file mode 100644
index 0000000000..0dc5891171
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mce-lng.mp
@@ -0,0 +1,89 @@
+% mce-lng.mp
+% L. Nobre G.
+% 2009
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, anga, angb, posa, posb, thic, marg, angm, stwo, rest;
+ numeric plac, n;
+ path pta, ptb, ptc, ptd, pte, ptf, ptfa, ptfb, pa, pb;
+ picture trib, half, unib;
+ transform ta, tb;
+ u = 10cm;
+ anga = 120;
+ angb = 135;
+ posa = 0.8;
+ posb = 0.23;
+ thic = 0.15;
+ marg = 0.07;
+ angm = 10;
+ plac = 0.5;
+ stwo = u*sqrt(2);
+ rest = u/sqrt(2);
+ z1 = u*(0,posa+marg);
+ z2 = u*(0,posa);
+ z3 = u*(0,posa-thic);
+ z4 = u*(0,posa-thic-marg);
+ z6 = u*(0,-posb+0.5*thic);
+ z7 = u*(0,-posb-0.5*thic);
+ z8 = (posb-0.5*thic)[(0,u),(u,0)];
+ z9 = (posb+0.5*thic)[(0,u),(u,0)];
+ z12 = posb[(0,u),(u,0)];
+ z11 = z12+rest*(marg,marg);
+ z13 = z12-rest*(thic,thic);
+ z14 = z12-rest*(marg+thic,marg+thic);
+ z22 = posa[(0,-u),(u,0)];
+ z21 = z22+rest*(marg,-marg);
+ z23 = z22-rest*(thic,-thic);
+ z24 = z22-rest*(marg+thic,-marg-thic);
+ z33 = (plac*x43,y43);
+ z34 = (plac*x43+stwo*marg,y43);
+ z32 = (plac*x43-stwo*thic,y43);
+ z31 = (plac*x43-stwo*(thic+marg),y43);
+ z43 = (posa-thic)[(0,-u),(u,0)];
+ pta = z6{dir(angb+0.5*angm-90)}..{dir(angb+0.5*angm-45)}z8;
+ ptb = z7{dir(angb-0.5*angm-90)}..{dir(angb-0.5*angm-45)}z9;
+ ptc = z4{dir(anga-angm-90)}..{dir(-45)}z14..{dir(-135)}z24..z34;
+ ptd = z3{dir(anga-angm-90)}..{dir(-45)}z13..{dir(-135)}z23..{up}z33
+ ..{dir(anga-angm-135)}z43;
+ pte = z2{dir(anga-90)}..{dir(-45)}z12..{dir(-135)}z22..{up}z32
+ ..{dir(anga-135)}z22;
+ ptf = z1{dir(anga-90)}..{dir(-45)}z11..{dir(-135)}z21..{up}z31;
+ ta = identity scaled (1/sqrt(2)) shifted (0,rest) rotated 45;
+ tb = identity scaled (1/sqrt(2)) shifted (0,-rest) rotated -45;
+ ptfa = ptf transformed ta;
+ ptfb = ptf transformed tb;
+ pa = buildcycle( pte, ptc, reverse ptd, reverse ptfa );
+% draw pta;
+% draw ptb;
+% draw ptc;
+% draw ptd;
+% draw pte;
+% draw ptf;
+% draw ptfb;
+ pb = buildcycle( pta, ptc, reverse ptb, reverse ptfb );
+ fill pa;
+ fill pb;
+% draw (0,-u)--(u,0)--(0,u)--cycle;
+ trib = currentpicture;
+ currentpicture := nullpicture;
+ drawoptions( shifted (u,0) );
+ draw trib;
+ draw trib transformed ta;
+ draw trib transformed tb;
+ drawoptions();
+ draw trib scaled 0.5 shifted (0.5u,0) rotated 90;
+ draw trib scaled 0.5 shifted (0.5u,0) rotated (-90);
+ half = currentpicture;
+ draw half rotated 180;
+ unib := currentpicture;
+ draw currentpicture scaled 0.5;
+ draw unib scaled 0.25;
+% draw currentpicture scaled 0.25;
+% draw unib scaled 0.0625 withcolor blue;
+% dotlabels.urt( 1,2,3,4,6,7,8,9,11,12,13,14,21,22,23,24,31,32,33,34,43);
+% dotlabels.urt(31,32,33,34,43);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/metalcharge.mp b/graphics/metapost/contrib/macros/featpost/example/metalcharge.mp
new file mode 100644
index 0000000000..a02ad4a50c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/metalcharge.mp
@@ -0,0 +1,98 @@
+% metalcharge.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+def parabolline( expr ParC, FracofLen ) =
+ begingroup
+ numeric Xlengh, Xcontx, Xconty, Xpos, Xa, Xb, Xyfin;
+ Xlengh = X( ParC );
+ Xcontx = Y( ParC );
+ Xconty = Z( ParC );
+ Xpos = Xlengh*FracofLen;
+ if FracofLen < Xcontx/Xlengh :
+ Xa = Xconty*(2/Xcontx - 1/(Xcontx-Xlengh));
+ Xb = Xconty*(Xcontx/(Xcontx-Xlengh)-1)/(Xcontx**2);
+ Xyfin = Xa*Xpos+Xb*(Xpos**2);
+ else:
+ Xyfin = Xconty*((Xpos-Xcontx)/(Xcontx-Xlengh)+1);
+ fi;
+ ( Xyfin )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, j, k, ang, lengh, contx, conty, resol, pot[], lim, resola, u;
+ numeric ringcharg[], rinray[], lstep, coun, sumc, dist, sump, fact, sca;
+ color actpoi, scanpoi, dirv;
+ pair shiv;
+ path form, chargedensity, simetr, revolenvel;
+ lengh = 1.6;
+ contx = 0.5;
+% contx = 0.9;
+ conty = 0.75;
+ fact = 0.3;
+ lim = 30;
+ resol = 30;
+ sca = 0.17;
+ u = 6cm;
+ shiv = (4cm, 12cm);
+ resola = 12; %make it even
+ viewcentr := (0,contx,0);
+ lstep = lengh/resol;
+ coun = 0;
+ for i = 1 upto resol:
+ rinray[i] = parabolline( (lengh, contx, conty), (i-0.5)/resol );
+ ringcharg[i] = 1;
+ endfor;
+ forever:
+ coun := incr( coun );
+ sump := 0;
+ for k=1 upto resol:
+ actpoi := green*lengh*(k-0.5)/resol + blue*rinray[k];
+ pot[k] := 0;
+ for i=1 upto resol:
+ for j=1 upto resola:
+ ang := 360*(j-0.5)/resola-180;
+ scanpoi:=green*lengh*(i-0.5)/resol+rinray[i]*(sind(ang),0,cosd(ang));
+ dirv := actpoi - scanpoi;
+ dist := 50*conorm( dirv );
+ pot[k] := pot[k] + ringcharg[i]/dist;
+ endfor;
+ endfor;
+ sump := sump + pot[k];
+ endfor;
+ sump := sump/resol;
+ sumc := 0;
+ for k=1 upto resol:
+ ringcharg[k] := ringcharg[k]*(1+fact*(sump-pot[k])/sump);
+ sumc := sumc + ringcharg[k];
+ endfor;
+ for k=1 upto resol:
+ ringcharg[k] := ringcharg[k]*resol/sumc;
+ endfor;
+ exitif coun>lim;
+ show ringcharg[resol];
+ endfor;
+ for i=1 upto resol:
+ ringcharg[i] := ringcharg[i]/rinray[i];
+ endfor;
+ chargedensity = ((lstep*u,sca*ringcharg1*u)
+ for i=2 upto resol:
+ --(i*lstep*u,sca*ringcharg[i]*u)
+ endfor) shifted shiv;
+ draw chargedensity;
+ form = ((lstep*u,rinray1*u)
+ for i=2 upto resol:
+ ..(i*lstep*u,rinray[i]*u)
+ endfor) shifted shiv;
+ simetr = ((lstep*u,-rinray1*u)
+ for i=2 upto resol:
+ ..(i*lstep*u,-rinray[i]*u)
+ endfor) shifted shiv;
+ revolenvel = form...(reverse simetr)...cycle;
+ draw revolenvel withcolor red;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/micostufas.mp b/graphics/metapost/contrib/macros/featpost/example/micostufas.mp
new file mode 100644
index 0000000000..1ac2ca3734
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/micostufas.mp
@@ -0,0 +1,41 @@
+% micostufas.mp
+% L. Nobre G.
+% 2013
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, basecant, altucnat, diagcant, baseestu, altuestu, diagestu;
+ numeric aux, rayestu;
+ u = 1cm;
+ basecant = 0.5u;
+ diagcant = 2.6u;
+ altucant = diagcant +-+ 0.5basecant;
+ baseestu = 6u;
+ altuestu = 4u;
+ diagestu = altuestu ++ 0.5baseestu;
+ numeric angalpha, scalefac, cantdesv;
+ angalpha = 180-2*angle(0.5baseestu,altuestu); %show angalpha;
+ rayestu = altuestu/sind(angalpha);
+ message "Raio de curvatura: " & decimal(rayestu/u);
+ cantdesv = 0.25*(baseestu+basecant);
+ path auxpa, cant, goticarch;
+ cant = (-0.5basecant,0)--(0,altucant)--(0.5basecant,0);
+ draw cant;
+ draw cant shifted (-cantdesv,0);
+ draw cant shifted (cantdesv,0);
+ z1 = (-0.5*cosd(angalpha),0);
+ auxpa = (halfcircle cutafter (origin--dir(angalpha))) shifted z1;
+ aux = xpart point 0 of auxpa;
+ scalefac = 0.5*baseestu/aux;
+ goticarch = auxpa scaled scalefac;
+ draw goticarch;
+ draw goticarch xscaled -1;
+ z0 = z1 scaled scalefac;
+ drawarrow z0--(z0+rayestu*dir(angalpha/2));
+ numeric comprimarco;
+ comprimarco = rayestu*3.14159*angalpha/(180*u);
+ message "Comprimento de cada arco: " & decimal(comprimarco);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/micromu.mp b/graphics/metapost/contrib/macros/featpost/example/micromu.mp
new file mode 100644
index 0000000000..01b10e8c64
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/micromu.mp
@@ -0,0 +1,34 @@
+% micromu.mp
+% L. Nobre G., Ryan Van Wagoner, Jens-Uwe Morawski
+% 2006
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
+\usepackage{textcomp}
+\usepackage{pifont}
+\newcommand{\upmu}{\Pisymbol{psy}{109}}
+\begin{document}
+etex
+
+beginfig(1);
+ transform T;
+ numeric referenceangle, tangentd, shiftlen;
+ picture micromu;
+ referenceangle = 14;
+ shiftlen = 5mm;
+ tangentd = sind(referenceangle)/cosd(referenceangle);
+ T = identity slanted (-tangentd);
+ micromu = thelabel( btex \framebox{\upmu\ \textmu\ $\mu$.} etex, origin );
+ draw micromu shifted (0,shiftlen);
+ draw micromu transformed T;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/milimetricpaper.mp b/graphics/metapost/contrib/macros/featpost/example/milimetricpaper.mp
new file mode 100644
index 0000000000..da10139242
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/milimetricpaper.mp
@@ -0,0 +1,52 @@
+% milimetricpaper.mp
+% L. Nobre G.
+% 2014
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, xsize, ysize, i, ticsize;
+ numeric minstep, majstep, bigstep;
+ pen minpen, majpen, bigpen;
+ color mincolor, majcolor, bigcolor;
+ u = 1mm;
+ xsize = 15cm;
+ ysize = 11cm;
+ ticsize = 3u;
+ minstep = 2u;
+ majstep = 10u;
+ bigstep = 20u;
+ minpen = pencircle scaled 0pt;
+ majpen = pencircle scaled 0.4pt;
+ bigpen = pencircle scaled 0.99pt;
+ mincolor = 0.65white;
+ majcolor = 0.35white;
+ bigcolor = 0.15white;
+ for i=0 step minstep until xsize:
+ draw (i,0)--(i,ysize) withpen minpen withcolor mincolor;
+ endfor;
+ for i=0 step minstep until ysize:
+ draw (0,i)--(xsize,i) withpen minpen withcolor mincolor;
+ endfor;
+ for i=0 step bigstep until xsize:
+ draw (i,-ticsize)--(i,ysize) withpen bigpen withcolor bigcolor;
+ endfor;
+ for i=0 step bigstep until ysize:
+ draw (-ticsize,i)--(xsize,i) withpen bigpen withcolor bigcolor;
+ endfor;
+ for i=0 step majstep until xsize:
+ draw (i,0)--(i,ysize) withpen majpen withcolor majcolor;
+ endfor;
+ for i=0 step majstep until ysize:
+ draw (0,i)--(xsize,i) withpen majpen withcolor majcolor;
+ endfor;
+endfig;
+
+beginfig(2);
+ drawarrow origin--(xsize,0) withpen bigpen;
+ for i=majstep step majstep until xsize-2majstep:
+ draw (i,-minstep)--(i,minstep) withpen majpen;
+ endfor;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/mpfields.mp b/graphics/metapost/contrib/macros/featpost/example/mpfields.mp
new file mode 100644
index 0000000000..6b877da5b1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mpfields.mp
@@ -0,0 +1,160 @@
+%input mp-tool;
+
+def projectyz( expr theta, phi ) =
+ (cosd(theta)*sind(phi),sind(theta))
+enddef;
+
+numeric vertn, horin, grids, thex, they, varc, xcomp;
+numeric ymax, xmax, i, j, size, u, ycomp, theta, phi;
+numeric power;
+pair actpos, direct, one, two;
+
+u := 0.5mm;
+power := 0.8;
+vertn := 20;
+horin := 41;
+size := 3u;
+grids := 8u;
+ymax := 0.5*(vertn-1);
+xmax := 0.5*(horin-1);
+varc := 90/ymax;
+
+beginfig(0); % splay
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=90*(cosd(they)**power);
+ phi:=0;
+ direct:=projectyz(theta,phi);
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(2); % bend
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=90*((1-cosd(they))**(1/power));
+ phi:=0;
+ direct:=projectyz(theta,phi);
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(4); % twist
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=0;
+ phi:=90*(cosd(they)**power);
+ direct:=projectyz(theta,phi);
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(3); % splaytwist in splay
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=90*cosd(they)*cosd(thex);
+ phi:=60*sind(2*they)*sind(thex);
+ direct:=projectyz(theta,phi);
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(5); % splaytwist in twist
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=30*sind(2*they)*sind(thex);
+ phi:=-90*cosd(they)*cosd(thex);
+ direct:=projectyz(theta,phi);
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(7); % splaytwist in bend
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=90*cosd(they)*sind(thex);
+ phi:=30*sind(2*they)*cosd(thex);
+ direct:=(cosd(theta)*sind(phi),cosd(theta)*cosd(phi));
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+beginfig(1); % splay-bend wall
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*varc;
+ they:=j*varc;
+ theta:=0;
+ phi:=2*angle(1,mexp(thex*9));
+ direct:=(cosd(theta)*sind(phi),cosd(theta)*cosd(phi));
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+prologues := 1;
+
+beginfig(6);
+ pickup pencircle scaled u;
+ numeric rescal;
+ rescal = 0.15;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*rescal;
+ they:=j*rescal;
+ direct:=unitvector((1,they-thex));
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/mptoolcone.mp b/graphics/metapost/contrib/macros/featpost/example/mptoolcone.mp
new file mode 100644
index 0000000000..2ddf4bf4f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mptoolcone.mp
@@ -0,0 +1,49 @@
+% mptoolcone.mp
+% L. Nobre G.
+% Y2K
+
+input featpost3Dplus2D;
+
+%input mp-tool;
+
+ defaultscale := 1.1;
+% defaultfont := "putr8r";
+% defaultfont := "bchr8r";
+
+beginfig(0);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt;
+ path gamma, cone, mybox;
+ numeric theta, radius, xxsize, yysize, zzsize;
+ picture mypict;
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize = 0.8;
+ yysize = 0.8;
+ zzsize = 1.0;
+ theta = 25;
+
+ orig = (0,0,0);
+ mypict = thelabel("Texto com acentuação.",rp(orig));
+ mybox = bbox mypict;
+ draw mypict;
+ draw mybox;
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,sind(theta),cosd(theta));
+ gammacnt = cosd(theta)*cosd(theta)*nalfa;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+ cone = rigorouscone(true, gammacnt, nalfa, radius, (xxsize,yysize,0) );
+ draw gamma dashed evenly;
+ draw cone;
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/muslimpattern.mp b/graphics/metapost/contrib/macros/featpost/example/muslimpattern.mp
new file mode 100644
index 0000000000..6c40859b74
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/muslimpattern.mp
@@ -0,0 +1,73 @@
+% muslimpattern.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+background := 0.9white;
+
+numeric u, pa, pb, hexf;
+u = 35mm;
+pa = 0.12u;
+pb = 0.05u;
+hexf = sqrt(3)/2;
+
+vardef markpath( expr Pat ) =
+ draw Pat withpen pencircle scaled pa;
+ undraw Pat withpen pencircle scaled pb;
+enddef;
+
+vardef hc( expr Xindex, Yindex ) =
+ 2*u*hexf*(Xindex*right+Yindex*dir(60))
+enddef;
+
+beginfig(1);
+ numeric i, ang;
+ pair c, b, a, d;
+ a = (hexf,0);
+ b = (0.33hexf,-0.4); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CHANGE only this.
+ c = (0,1.5);
+ d = 1.1[b,a];
+ path seg[], aux, hex, auxa, auxb;
+ for i=0 upto 5:
+ seg[i] = (d--b--c) rotated (i*60) scaled u;
+ endfor;
+ seg6 = seg0;
+ ang = angle(c-b);
+ aux = ((a-dir(ang))--(a+dir(ang))) scaled u;
+ z1 = seg0 intersectionpoint seg5;
+ z2 = seg0 intersectiontimes seg5;
+ z3 = unitvector( direction xpart z2 of seg0 );
+ for i=1 upto 6:
+ markpath( aux rotated (i*60) );
+ markpath( seg[i-1] );
+ endfor;
+ auxa = ((a-pb*dir(ang)/u)--(a+pb*dir(ang)/u)) scaled u;
+ auxb = ((a-pa*dir(ang)/u)--(a+pa*dir(ang)/u)) scaled u;
+ for i=1 upto 6:
+ draw auxa rotated ((i-1)*60) withpen pencircle scaled pa;
+ undraw auxb rotated ((i-1)*60) withpen pencircle scaled pb;
+ endfor;
+ auxa := ((z1-pb*z3)--(z1+pb*z3));
+ auxb := ((z1-pa*z3)--(z1+pa*z3));
+ draw auxa withpen pencircle scaled pa;
+ undraw auxb withpen pencircle scaled pb;
+ hex = for i=30 step 60 until 360: u*dir(i)-- endfor cycle;
+ clip currentpicture to hex;
+ picture tile;
+ tile = currentpicture;
+endfig;
+
+beginfig(2);
+ numeric i, j;
+ path rect;
+ rect = hc(0,-1)--hc(1,-1)--hc(0,1)--hc(-1,1)--cycle;
+ fill rect withcolor (1,0.986,0.993);
+ for i=-1 upto 1:
+ for j=-1 upto 1:
+ draw tile shifted hc(i,j);
+ endfor;
+ endfor;
+ clip currentpicture to rect;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/mypatent.mp b/graphics/metapost/contrib/macros/featpost/example/mypatent.mp
new file mode 100644
index 0000000000..703d172acc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mypatent.mp
@@ -0,0 +1,319 @@
+% mypatent.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass[12pt]{article}
+\usepackage{courier}
+\begin{document}
+{\ttfamily
+etex
+
+vardef P@# = rp(V@#) enddef;
+
+picture pecaa, pecab, pecabe;
+
+f := 2*(14,5,10);
+Spread := 36;
+ahangle := 30;
+ahlength := 1.8mm;
+
+pen pendot, penedge, pendist;
+penedge= pencircle scaled 1pt;
+pendot = pencircle scaled 1.7pt;
+pendist= pencircle scaled 0.4pt;
+
+numeric u, marg, leves, elast;
+u = 0.1;
+marg = 16u;
+%leves = 410;
+leves = 22u;
+elast = 1u;
+
+vardef elastf( expr Ca, Cb ) = Cb + N( Cb-Ca )*elast enddef;
+
+V1 := (0,0,0);
+V2 := (0,0,4u);
+V3 := (0,16u,4u);
+V4 := (4u,16u,4u);
+V5 := (4u,16u,8u);
+V6 := (0,16u,8u);
+V7 := (0,24u,16u);
+V8 := (4u,24u,16u);
+V9 := (4u,35u,4u);
+V10:= (4u,35u,0);
+V11:= (16u,23u,0);
+V12:= (16u,23u,4u);
+V13:= (16u,0,4u);
+V14:= (16u,0,0);
+V15:= (0,43u,8u);
+V16:= (4u,43u,8u);
+V17:= (8u,8u,0);
+V18:= (4u,43u,16u);
+V19:= (0,43u,16u);
+
+beginfig(1);
+ path pat[];
+ pat1 = P3--P2--P13--P14--P11--P10--P9--P12--P13;
+ pat2 = P11--P12;
+ pat3 = P9--P4--P5--P6--P7--P8--P5;
+ numeric i;
+ pat8 = P1-- for i=-90 step 5 until 85:
+ rp(V15+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P19--P7;
+ pat5 = P10-- for i=-90 step 5 until 85:
+ rp(V16+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P18--P8;
+ pat6 = pat1 cutbefore pat3;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V15,red,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V16,red,8.05u,true);
+ pat9 = rp(V15)--auxp;
+ pat4 = pat8 cutbefore pat9;
+ pat7 = auxp--auxP;
+ drawoptions( withpen penedge );
+ for i=2 upto 7:
+ draw pat[i];
+ endfor;
+ fakehole(V15,red*4u, 2u );
+ fakehole(V17,blue*4u, 2u );
+ pecab = currentpicture;
+endfig;
+
+beginfig(2);
+ numeric i;
+ for i=1 upto 19:
+ V[i+100] := (X(V[i]),-Y(V[i]),Z(V[i]))-(0,marg,0);
+ endfor;
+ path pat[];
+ pat1 = P109--P112--P113--P102--P101--P114--P111--P110--P109--P104--P103
+ --P106--P107--P108--P105--P104;
+ pat2 = P105--P106;
+ pat3 = P113--P114;
+ pat4 = P111--P112;
+ pat5 = P102--P103;
+ pat10 = P101-- for i=-90 step 5 until 85:
+ rp(V115+(0,-8u*cosd(i),8u*sind(i)))..
+ endfor P119--P107;
+ pat6 = P110-- for i=-90 step 5 until 85:
+ rp(V116+(0,-8u*cosd(i),8u*sind(i)))..
+ endfor P118--P108;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V115,red,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V116,red,8.05u,false);
+ pat9 = P115--auxp;
+ pat8 = pat10 cutbefore pat9;
+ pat7 = auxp--auxP;
+ drawoptions( withpen penedge );
+ for i=1 upto 8:
+ draw pat[i];
+ endfor;
+ fakehole(V115,red*4u, 2u );
+ fakehole(V117,blue*4u, 2u );
+ pecabe = currentpicture;
+% draw pecab;
+endfig;
+
+beginfig(3);
+ V21:= (24u+marg,0,0);
+ V22:= (X(V21),Y(V115)+16u,0);
+ V23:= (X(V21),Y(V15)-16u,0);
+ V24:= (X(V21),Y(V115),0);
+ V25:= (X(V21),Y(V15),0);
+ V26:= (X(V21),Y(V115),4u);
+ V27:= (X(V21),Y(V15),4u);
+ V28:= (X(V21),Y(V115)+16u,4u);
+ V29:= (X(V21),Y(V15)-16u,4u);
+ path pat[];
+ pat1 = for i=-90 step 2 until 90:
+ rp(V22+(2u*sind(i),-2u*cosd(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V23+(2u*sind(-i),2u*cosd(i),0))...
+ endfor
+ cycle;
+ pat2 = for i=-90 step 2 until 90:
+ rp(V28+(2u*sind(i),-2u*cosd(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V29+(2u*sind(-i),2u*cosd(i),0))...
+ endfor
+ cycle;
+ pat3 = for i=-90 step 2 until 90:
+ rp(V24+(8u*sind(i),-8u*cosd(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V25+(8u*sind(-i),8u*cosd(i),0))...
+ endfor
+ cycle;
+ pat4 = for i=-90 step 2 until 90:
+ rp(V26+(8u*sind(i),-8u*cosd(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V27+(8u*sind(-i),8u*cosd(i),0))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V24,blue,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V26,blue,8.05u,true);
+ auxm = point 0 of spatialhalfcircle(V25,blue,8.05u,false);
+ auxM = point 0 of spatialhalfcircle(V27,blue,8.05u,false);
+ pat5 = P24--auxp;
+ pat6 = P25--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ drawoptions( withpen penedge );
+% draw pat1;
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V24,blue*4u, 2u );
+ fakehole(V25,blue*4u, 2u );
+ pecaa = currentpicture;
+% draw pecab;
+% draw pecabe;
+endfig;
+
+beginfig(4);
+ V31:= V26-(5u,0,0);
+ V32:= 0.25*(V105+V106+V107+V108);
+ V33:= 0.25*(V5+V6+V7+V8);
+ pair paa, pab, pabe, angs, pn[];
+ numeric anxy, angz;
+ color veca, vecb, auxc, vecc;
+ angs = getanglepair( f-viewcentr );
+ anxy = xpart angs;
+ angz = ypart angs;
+ vecb = eulerrotation( anxy, angz+85.5, 0, red );
+ veca = eulerrotation( anxy, angz+83.5, 0, red );
+ vecc = eulerrotation( anxy, angz+93, 0, red );
+ drawoptions( withpen pendist );
+ pn2 = rp( lineintersectplan( V26, blue, f, vecb ) );
+ draw P26--pn2;
+ label.top( btex 3 etex, pn2 );
+ pn3 = rp( lineintersectplan( V27, blue, f, vecc ) );
+ draw P27--pn3;
+ label.top( btex 3' etex, pn3 );
+ auxc = 0.65[V26,V27];
+ pn4 = rp( lineintersectplan( auxc, blue, f, vecb ) );
+ draw rp(auxc)--pn4;
+ label.top( btex 4 etex, pn4 );
+ pn5 = rp( lineintersectplan( V116, blue, f, vecb ) );
+ draw P116--pn5;
+ label.top( btex 5 etex, pn5 );
+ pn6 = rp( lineintersectplan( V117+(0,0,4u), blue, f, vecb ) );
+ draw rp(V117+(0,0,4u))--pn6;
+ label.top( btex 6 etex, pn6 );
+ pn7 = rp( lineintersectplan( 0.25*(V103+V104+V105+V106), blue, f, vecb ) );
+ draw rp(0.25*(V103+V104+V105+V106))--pn7;
+ label.top( btex 7 etex, pn7 );
+ pn8 = rp( lineintersectplan( 0.5*(V102+V117+(0,0,4u)), blue, f, vecb ) );
+ draw rp(0.5*(V102+V117+(0,0,4u)))--pn8;
+ label.top( btex 8 etex, pn8 );
+
+
+% paa = rp((X(V31),Y(V31),leves));
+% pab = rp((X(V33),Y(V33),leves));
+% pabe= rp((X(V32),Y(V32),leves));
+ paa = rp( lineintersectplan( V31, blue, f, veca ) );
+ pab = rp( lineintersectplan( V33, blue, f, veca ) );
+ pabe= rp( lineintersectplan( V32, blue, f, veca ) );
+ drawoptions( withpen pendot );
+ draw P31;
+ draw P32;
+ draw P33;
+ draw paa;
+ draw pab;
+ draw pabe;
+ drawoptions( withpen pendist );
+ draw P31--paa;
+ draw P32--pabe;
+ draw P33--pab;
+ label.top( btex 1 etex, paa );
+ label.top( btex 2 etex, pabe );
+ label.top( btex 2' etex, pab );
+% draw pecaa;
+% draw pecab;
+% draw pecabe;
+ V34:= V26+(marg,0,0);
+ V35:= V27+(marg,0,0);
+ V36:= elastf(V26,V34 );
+ V37:= elastf( V27,V35 );
+ V38:= V27+(8u,0,0);
+ V39:= V25+(8u,0,0);
+ V40:= V27-(8u,0,0);
+ V41:= V38+(0,marg,0);
+ V42:= V39+(0,marg,0);
+ V43:= V40+(0,marg,0);
+ V44:= elastf( V38,V41 );
+ V45:= elastf( V39,V42 );
+ V46:= elastf( V40,V43 );
+ V47:= 0.5[V34,V35];
+ V48:= 0.5[V41,V42];
+ V49:= 0.5[V41,V43];
+ draw P26--P36;
+ draw P27--P37;
+ draw P38--P44;
+ draw P39--P45;
+ draw P40--P46;
+ drawdblarrow P34--P35;
+ drawdblarrow P41--P42;
+ drawdblarrow P41--P43;
+ label.bot( btex C etex, P47 );
+ label.rt( btex E etex, P48 );
+ label.rt( btex L etex, P49 );
+ V50:= V109 - (0,4u,0);
+ V51:= V115 + (4u,0,0);
+ V52:= V51 + (0,4u,0);
+ V53:= elastf( V109,V50 );
+ V54:= elastf( V51,V52 );
+ V55:= (8u,8u,4u);
+ V56:= (8u,8u,8u);
+ V57:= elastf( V55,V56 );
+ V58:= V15+(4u,0,0);
+ V59:= V58+(4u,0,0);
+ V60:= elastf( V58,V59 );
+
+
+ drawoptions( withpen penedge );
+ draw pecaa;
+ draw pecab;
+ draw pecabe;
+ drawoptions( withpen pendist );
+ draw P109--P53;
+ draw P51--P54;
+ drawdblarrow P50--P52;
+ label.rt( btex E etex, 0.5[P52,P50] );
+ draw P55--P57;
+ draw P58--P60;
+ drawdblarrow P56--P59;
+ label.top( btex D etex, 0.5[P56,P59] );
+
+endfig;
+
+verbatimtex
+}
+\end{document}
+etex
+
+end;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/mypatentpieces.mp b/graphics/metapost/contrib/macros/featpost/example/mypatentpieces.mp
new file mode 100644
index 0000000000..c2af24f77c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mypatentpieces.mp
@@ -0,0 +1,634 @@
+% mypatentpieces.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+vardef P@# = rp(V@#) enddef;
+
+%f := 2*(17,7,9);
+f := 2*(21,5,8);
+Spread := 36;
+background := white;
+
+numeric u, i;
+u = 0.1;
+V1 := (0,0,0);
+V2 := (0,0,4u);
+V3 := (0,16u,4u);
+V4 := (4u,16u,4u);
+V5 := (4u,16u,8u);
+V6 := (0,16u,8u);
+V7 := (0,24u,16u);
+V8 := (4u,24u,16u);
+V9 := (4u,35u,4u);
+V10:= (4u,35u,0);
+V11:= (16u,23u,0);
+V12:= (16u,23u,4u);
+V13:= (16u,0,4u);
+V14:= (16u,0,0);
+V15:= (0,43u,8u);
+V16:= (4u,43u,8u);
+V17:= (8u,8u,0);
+V18:= (4u,43u,16u);
+V19:= (0,43u,16u);
+
+V22:= (-62.5u+16u,0,0);
+V23:= (62.5u-16u,0,0);
+V24:= (-62.5u,0,0);
+V25:= (62.5u,0,0);
+V26:= (-62.5u,0,4u);
+V27:= (62.5u,0,4u);
+V28:= (-62.5u+16u,0,4u);
+V29:= (62.5u-16u,0,4u);
+
+V40:= (95.5u,-43u,-8u); % zero
+V42:= (-62.5u+21u,-43u,8u); % 200
+V43:= (-62.5u+17u,-8u,-43u); %300
+V44:= (95.5u,8u,-43u); % 400
+V55:= (-32u,-4u,-35u); % 500
+V56:= (82u,-35.25u,-4u); % 600 %%%
+V57:= (50u,0,-35u); % 700
+V58:= (0,-35.13u,0); % 800 %%%
+
+def indicp( expr Ind ) =
+ ( rp(V[Ind])--rp( (X(V[Ind]),Y(V[Ind]),40u) ) )
+enddef;
+
+def indicl( expr Ind ) =
+ ( rp((X(V[Ind]),Y(V[Ind]),40u)) )
+enddef;
+
+% 100
+for i=1 upto 19:
+ V[i+100] := (X(V[i]),-Y(V[i]),Z(V[i]));
+endfor;
+
+% 200
+for i=101 upto 119:
+ V[i+100] := (X(V[i]),-Y(V[i]),-Z(V[i]));
+endfor;
+
+% 300
+for i=101 upto 119:
+ V[i+200] := (X(V[i]),Z(V[i]),-Y(V[i]));
+endfor;
+
+% 400
+for i=301 upto 319:
+ V[i+100] := (-X(V[i]),-Y(V[i]),Z(V[i]));
+endfor;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% zero
+for i=1 upto 19:
+ V[i] := V[i]+V40;
+endfor;
+
+% 200
+for i=201 upto 219:
+ V[i] := V[i]+V42;
+endfor;
+
+% 300
+for i=301 upto 319:
+ V[i] := V[i]+V43;
+endfor;
+
+% 400
+for i=401 upto 419:
+ V[i] := V[i]+V44;
+endfor;
+
+% 500
+for i=22 upto 29:
+ V[i+500] := (X(V[i]),Z(V[i]),-Y(V[i]))+V55;
+endfor;
+
+% 600
+for i=22 upto 29:
+ V[i+600] := V[i]+V56;
+endfor;
+
+% 700
+for i=22 upto 29:
+ V[i+700] := (X(V[i]),Z(V[i]),-Y(V[i]))+V57;
+endfor;
+
+% 800
+for i=22 upto 29:
+ V[i+800] := V[i]+V58;
+endfor;
+
+numeric dhip, dcat, dhei, dang;
+dhip = X(V627)-X(V824);
+dcat = X(V25)-X(V24);
+dhei = dcat +-+ (0.5*dhip);
+dang = angle(0.5*dhip,dhei);
+
+% 1000
+for i=822 upto 829:
+ V[i+100] := (X(V[i])*cosd(dang)-Y(V[i])*sind(dang),
+ X(V[i])*sind(dang)+Y(V[i])*cosd(dang),Z(V[i]));
+endfor;
+for i=922 upto 929:
+ V[i+100] := V[i]+V627-V925;
+endfor;
+
+% 900
+for i=622 upto 629:
+ V[i-500] := (X(V[i])*cosd(dang)+Y(V[i])*sind(dang),
+ -X(V[i])*sind(dang)+Y(V[i])*cosd(dang),Z(V[i]));
+endfor;
+for i=122 upto 129:
+ V[i+800] := V[i]+V824-V126;
+endfor;
+
+beginfig(1);
+ pen penedge;
+ penedge= pencircle scaled 1.5pt;
+ pickup penedge;
+ path refillpat[], retouchpat[];
+
+ path pat[];
+ pat1 = P309--P312--P313--P314--P311--P310--P309--P304--P305
+ --P308--P307;
+ pat2 = P311--P312;
+ pat11 = P313--P302--P303;
+ pat3 = pat11 cutafter pat1;
+ pat10 = P301-- for i=-90 step 5 until 85:
+ rp(V315+(0,8u*sind(i),8u*cosd(i)))..
+ endfor P319--P307;
+ pat4 = P310-- for i=-90 step 5 until 85:
+ rp(V316+(0,8u*sind(i),8u*cosd(i)))..
+ endfor P318--P308;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V315,red,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V316,red,8.05u,false);
+ pat9 = P315--auxp;
+ pat5 = pat10 cutbefore pat9;
+ pat6 = auxp--auxP;
+ for i=1 upto 6:
+ draw pat[i];
+ endfor;
+ fakehole(V315,red*4u, 2u );
+ fakehole(V317,green*4u, 2u );
+ V388 := 0.7[V308,V318];
+ V379 := 0.7[V307,V319];
+ refillpat2 = P309--P304--P305--P308--P307--P379--P388--cycle;
+ retouchpat3 = P309--P304--P305--P308--P307--P379;
+ retouchpat4 = P388--P308;
+
+
+ path pat[];
+ pat1 = for i=-90 step 2 until 90:
+ rp(V522+(-2u*cosd(i),0,2u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V523+(2u*cosd(i),0,2u*sind(-i)))...
+ endfor
+ cycle;
+ pat2 = for i=-90 step 2 until 90:
+ rp(V528+(-2u*cosd(i),0,2u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V529+(2u*cosd(i),0,2u*sind(-i)))...
+ endfor
+ cycle;
+ pat3 = for i=-90 step 2 until 90:
+ rp(V524+(-8u*cosd(i),0,8u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V525+(8u*cosd(i),0,8u*sind(-i)))...
+ endfor
+ cycle;
+ pat4 = for i=-90 step 2 until 90:
+ rp(V526+(-8u*cosd(i),0,8u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V527+(8u*cosd(i),0,8u*sind(-i)))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V524,green,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V526,green,8.05u,true);
+ auxm = point 0 of spatialhalfcircle(V525,green,8.05u,false);
+ auxM = point 0 of spatialhalfcircle(V527,green,8.05u,false);
+ pat5 = P524--auxp;
+ pat6 = P525--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+
+ unfill pat3;
+% draw pat1;
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V524,green*4u, 2u );
+ fakehole(V525,green*4u, 2u );
+
+
+ path pat[];
+ pat1 = for i=-90 step 2 until 90:
+ rp(V722+(-2u*cosd(i),0,2u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V723+(2u*cosd(i),0,2u*sind(-i)))...
+ endfor
+ cycle;
+ pat2 = for i=-90 step 2 until 90:
+ rp(V728+(-2u*cosd(i),0,2u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V729+(2u*cosd(i),0,2u*sind(-i)))...
+ endfor
+ cycle;
+ pat3 = for i=-90 step 2 until 90:
+ rp(V724+(-8u*cosd(i),0,8u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V725+(8u*cosd(i),0,8u*sind(-i)))...
+ endfor
+ cycle;
+ pat4 = for i=-90 step 2 until 90:
+ rp(V726+(-8u*cosd(i),0,8u*sind(i)))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V727+(8u*cosd(i),0,8u*sind(-i)))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V724,green,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V726,green,8.05u,true);
+ auxm = point 0 of spatialhalfcircle(V725,green,8.05u,false);
+ auxM = point 0 of spatialhalfcircle(V727,green,8.05u,false);
+ pat5 = P724--auxp;
+ pat6 = P725--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ pat10= pat4 cutbefore P727--auxM cutafter P726--auxP;
+ unfill pat7--pat9--pat10--(reverse pat8)--cycle;
+% draw pat1;
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V724,green*4u, 2u );
+ fakehole(V725,green*4u, 2u );
+
+ path pat[];
+ pat1 = P401-- for i=90 step -5 until -85:
+ rp(V415+(0,8u*sind(i),8u*cosd(i)))..
+ endfor P419--P407--P406--P403--P402--cycle;
+ pat10 = P401--P414--P411--P410-- for i=90 step -5 until -85:
+ rp(V416+(0,8u*sind(i),8u*cosd(i)))..
+ endfor P418;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V415,red,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V416,red,8.05u,false);
+ pat9 = P416--auxP;
+ pat2 = pat10 cutafter pat9;
+ pat3 = auxp--auxP;
+ unfill pat1;
+ unfill pat10--P403--cycle;
+ for i=1 upto 3:
+ draw pat[i];
+ endfor;
+ fakehole(V415,-red*4u, 2u );
+ fakehole(V417,-green*4u, 2u );
+
+
+ path pat[];
+ pat1 = P3--P2--P13--P14--P11--P10--P9--P12--P13;
+ pat2 = P11--P12;
+ pat3 = P9--P4--P5--P6--P7--P8--P5;
+ numeric i;
+ pat8 = P1-- for i=-90 step 5 until 85:
+ rp(V15+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P19--P7;
+ pat5 = P10-- for i=-90 step 5 until 85:
+ rp(V16+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P18--P8;
+ pat6 = pat1 cutbefore pat3;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V15,red,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V16,red,8.05u,true);
+ pat9 = rp(V15)--auxp;
+ pat4 = pat8 cutbefore pat9;
+ pat7 = auxp--auxP;
+ unfill buildcycle( pat1, pat5, pat8, reverse pat3 );
+ for i=2 upto 7:
+ draw pat[i];
+ endfor;
+ fakehole(V15,red*4u, 2u );
+ fakehole(V17,blue*4u, 2u );
+ refillpat1 = P9--P4--P5--P6--P7--P19--P18--cycle;
+ retouchpat1 = P9--P4--P5--P6--P7--P19;
+ retouchpat2 = P18--P8--P5;
+ retouchpat5 = P8--P7;
+
+ path pat[];
+ pat2 = for i=-90+dang step 2 until 90+dang:
+ rp(V928+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90+dang step 2 until 90+dang:
+ rp(V929+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat3 = for i=-90+dang step 2 until 90+dang:
+ rp(V924+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90+dang step 2 until 90+dang:
+ rp(V925+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pat4 = for i=-90+dang step 2 until 90+dang:
+ rp(V926+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90+dang step 2 until 90+dang:
+ rp(V927+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V924,blue,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V926,blue,8.05u,false);
+ auxm = point 0 of spatialhalfcircle(V925,blue,8.05u,true);
+ auxM = point 0 of spatialhalfcircle(V927,blue,8.05u,true);
+ pat5 = P924--auxp;
+ pat6 = P925--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ pat10= pat4 cutbefore P927--auxM cutafter P926--auxP;
+ unfill pat7--pat8--pat10--(reverse pat9)--cycle;
+
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V924,blue*4u, 2u );
+ fakehole(V925,blue*4u, 2u );
+
+ path pat[];
+ pat1 = for i=-90 step 2 until 90:
+ rp(V622+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V623+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat2 = for i=-90 step 2 until 90:
+ rp(V628+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V629+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat3 = for i=-90 step 2 until 90:
+ rp(V624+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V625+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pat4 = for i=-90 step 2 until 90:
+ rp(V626+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V627+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V624,blue,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V626,blue,8.05u,false);
+ auxm = point 0 of spatialhalfcircle(V625,blue,8.05u,true);
+ auxM = point 0 of spatialhalfcircle(V627,blue,8.05u,true);
+ pat5 = P624--auxp;
+ pat6 = P625--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ unfill pat3;
+
+%% pat10 = buildcycle( pat1, pat2 );
+%% draw pat10;
+%% draw pat1 cutbefore pat2;
+%% THIS IS BAD, VERY BAD!!!! BUILDCYCLE DOES NOT WORK!!!!
+% show length pat1;
+% show pat1 intersectiontimes pat2;
+% show reverse pat1 intersectiontimes pat2;
+ numeric auxta, auxtb;
+ auxta = xpart (reverse pat1 intersectiontimes pat2);
+ auxtb = xpart (pat1 intersectiontimes pat2);
+ draw subpath (-auxta,auxtb) of pat1;
+
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V624,blue*4u, 2u );
+ fakehole(V625,blue*4u, 2u );
+
+
+ path pat[];
+ pat1 = for i=-90 step 2 until 90:
+ rp(V822+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V823+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat2 = for i=-90 step 2 until 90:
+ rp(V828+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V829+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat3 = for i=-90 step 2 until 90:
+ rp(V824+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V825+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pat4 = for i=-90 step 2 until 90:
+ rp(V826+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90 step 2 until 90:
+ rp(V827+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V824,blue,8.05u,false);
+ auxP = point 0 of spatialhalfcircle(V826,blue,8.05u,false);
+ auxm = point 0 of spatialhalfcircle(V825,blue,8.05u,true);
+ auxM = point 0 of spatialhalfcircle(V827,blue,8.05u,true);
+ pat5 = P824--auxp;
+ pat6 = P825--auxm;
+ pat7 = pat3 cutbefore pat5 cutafter pat6;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ pat10= pat4 cutbefore P827--auxM cutafter P826--auxP;
+ unfill pat7--pat9--pat10--(reverse pat8)--cycle;
+
+ %% pat10 = buildcycle( pat1, pat2 );
+ %% draw pat10;
+ %% draw pat1 cutbefore pat2;
+ %% THIS IS BAD, VERY BAD!!!! BUILDCYCLE DOES NOT WORK!!!!
+ % show length pat1;
+ % show pat1 intersectiontimes pat2;
+ % show reverse pat1 intersectiontimes pat2;
+ numeric auxta, auxtb;
+ auxta = xpart (reverse pat1 intersectiontimes pat2);
+ auxtb = xpart (pat1 intersectiontimes pat2);
+ draw subpath (-auxta,auxtb) of pat1;
+
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V824,blue*4u, 2u );
+ fakehole(V825,blue*4u, 2u );
+
+
+ path pat[];
+ pat1 = P209--P212--P213--P214--P211;
+ pat10 = P211--P210-- for i=90 step -5 until -85:
+ rp(V216+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P218--P208--P205;
+ pat2 = pat10 cutafter pat1;
+ pat11 = P214--P201-- for i=90 step -5 until -85:
+ rp(V215+(0,8u*cosd(i),8u*sind(i)))..
+ endfor P219--P207;
+ pair auxp,auxP;
+ auxp = point 0 of spatialhalfcircle(V215,red,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V216,red,8.05u,true);
+ pat9 = P215--auxp;
+ pat3 = pat11 cutafter pat9;
+ pat4 = auxp--auxP;
+ pat6 = P211--P212;
+ pat5 = P210--P209;
+ unfill buildcycle(pat1,pat11,pat10);
+ for i=1 upto 6:
+ draw pat[i];
+ endfor;
+ fakehole(V215,red*4u, 2u );
+ fakehole(V217,-blue*4u, 2u );
+
+ unfill refillpat1;
+ draw retouchpat1;
+ draw retouchpat2;
+ unfill refillpat2;
+ draw retouchpat3;
+ draw retouchpat4;
+ draw retouchpat5;
+
+ unfill buildcycle(pat1,pat11,pat10);
+ for i=1 upto 6:
+ draw pat[i];
+ endfor;
+ fakehole(V215,red*4u, 2u );
+ fakehole(V217,-blue*4u, 2u );
+
+ % label.top( "40", indicl(40) );
+ % label.top( "42", indicl(42) );
+ % label.top( "43", indicl(43) );
+ % label.top( "44", indicl(44) );
+ % label.top( "55", indicl(55) );
+ % label.top( "56", indicl(56) );
+ % label.top( "57", indicl(57) );
+ % label.top( "58", indicl(58) );
+
+ % draw indicp(40);
+ % draw indicp(42);
+ % draw indicp(43);
+ % draw indicp(44);
+ % draw indicp(55);
+ % draw indicp(56);
+ % draw indicp(57);
+ % draw indicp(58);
+
+ path pat[];
+ pat1 = for i=-90-dang step 2 until 90-dang-2:
+ rp(V1022+(-2u*cosd(i),2u*sind(i),0))...
+ endfor rp(V1022+(-2u*cosd(90-dang),2u*sind(90-dang),0));
+ pat11 = for i=-90-dang step 2 until 90-dang-2:
+ rp(V1023+(2u*cosd(i),2u*sind(-i),0))...
+ endfor rp(V1023+(2u*cosd(90-dang),2u*sind(-90+dang),0));
+ pat2 = for i=-90-dang step 2 until 90-dang:
+ rp(V1028+(-2u*cosd(i),2u*sind(i),0))...
+ endfor
+ for i=-90-dang step 2 until 90-dang:
+ rp(V1029+(2u*cosd(i),2u*sind(-i),0))...
+ endfor
+ cycle;
+ pat3 = for i=-90-dang step 2 until 90-dang:
+ rp(V1024+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90-dang step 2 until 90-dang:
+ rp(V1025+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pat4 = for i=-90-dang step 2 until 90-dang:
+ rp(V1026+(-8u*cosd(i),8u*sind(i),0))...
+ endfor
+ for i=-90-dang step 2 until 90-dang:
+ rp(V1027+(8u*cosd(i),8u*sind(-i),0))...
+ endfor
+ cycle;
+ pair auxp, auxP, auxm, auxM;
+ auxp = point 0 of spatialhalfcircle(V1024,blue,8.05u,true);
+ auxP = point 0 of spatialhalfcircle(V1026,blue,8.05u,true);
+ auxm = point 0 of spatialhalfcircle(V1025,blue,8.05u,false);
+ auxM = point 0 of spatialhalfcircle(V1027,blue,8.05u,false);
+ pat5 = P1024--auxp;
+ pat6 = P1025--auxm;
+ pat7 = pat3 cutbefore pat6 cutafter pat5;
+ pat8 = auxp--auxP;
+ pat9 = auxm--auxM;
+ pat10= pat4 cutbefore P1027--auxM cutafter P1026--auxP;
+ unfill pat7--pat8--pat10--(reverse pat9)--cycle;
+
+ draw (point (length pat1) of pat1 -- point 0 of pat11) cutafter pat2;
+ draw pat1 cutbefore pat2;
+ draw pat2;
+ draw pat7;
+ draw pat4;
+ draw pat8;
+ draw pat9;
+ fakehole(V1024,blue*4u, 2u );
+ fakehole(V1025,blue*4u, 2u );
+
+
+
+
+endfig;
+
+end.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/mysquaresectionbar.mp b/graphics/metapost/contrib/macros/featpost/example/mysquaresectionbar.mp
new file mode 100644
index 0000000000..0eeec52ecf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/mysquaresectionbar.mp
@@ -0,0 +1,33 @@
+% mysquaresectionbar.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+prologues := 1;
+
+f := (3.5,3,2.5);
+Spread := 175;
+beginfig(1);
+ numeric alfa, beta;
+ alfa = 22.62;
+ kindofcube(false,false,(-0.65,0,-0.6), 90,0,0,1.35,0.05,0.05);
+ kindofcube(false,false,(-0.65,0,0.6), 90,0,0,0.35,0.05,0.05);
+ kindofcube(false,false,(-0.6,-0.4,0), 90,90-alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(-0.6,0.4,0), 90,90+alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(-0.6,-0.05,0.05),0,90,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0.6,-0.05,0.05), 0,90,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0,0,-0.3), 0,alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0,0,0.3), 0,-alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0.6,-0.4,0), 90,90-alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0.6,0.4,0), 90,90+alfa,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0.65,0,-0.6), 90,0,0,1.35,0.05,0.05);
+ kindofcube(false,false,(0.65,0,0.6), 90,0,0,0.35,0.05,0.05);
+ kindofcube(false,false,(0,0,0.65), 0,0,0,1.35,0.05,0.05);
+endfig;
+
+end;
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/naoestacionar.mp b/graphics/metapost/contrib/macros/featpost/example/naoestacionar.mp
new file mode 100644
index 0000000000..e811368c41
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/naoestacionar.mp
@@ -0,0 +1,39 @@
+% naoestacionar.mp
+% L. Nobre G.
+% 2008
+
+prologues := 3;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric stampnum, initang, i, stepang, stampoffset, amplfactor;
+ picture stamp;
+ bboxmargin := 9mm;
+ stampnum = 36;
+ stampoffset = 0.92mm;
+ amplfactor = 20;
+ label.urt( btex \begin{tabular}{c}
+ N\~{A}O \\
+ estacionar
+ \end{tabular} etex scaled amplfactor, origin );
+ stamp = currentpicture;
+ unfill bbox stamp;
+ initang = 180/stampnum;
+ stepang = 2*initang;
+ drawoptions();
+ for i=0 upto (stampnum-1):
+ draw stamp shifted (stampoffset*dir(initang+i*stepang));
+ endfor;
+ undraw stamp;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/naotocanacalote.mp b/graphics/metapost/contrib/macros/featpost/example/naotocanacalote.mp
new file mode 100644
index 0000000000..2e45276347
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/naotocanacalote.mp
@@ -0,0 +1,58 @@
+% naotocanacalote.mp
+% L. Nobre G.
+% 2012
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ numeric N, h, R, m, i, l, d, X, angl;
+ N = 2;
+ R = 13mm;
+ h = N*R;
+ m = 8;
+ l = 2R;
+ d = 4mm;
+ angl = 50;
+ path calotes, queda;
+ if N=1:
+ calotes = (0,h)... for i=1 upto m-1:
+ (R*(sind(i*90/m),cosd(i*90/m)))...
+ endfor {down}(R,0);
+ X = sqrt(2)*R;
+ queda = (-R,h+d)---(0,h+d){right}...{unitvector(1,-sqrt(2))}(X,d);
+ elseif N=2:
+ calotes = (0,h)... for i=1 upto 2*m-1:
+ (R*(sind(i*90/m),1+cosd(i*90/m)))...
+ endfor {left}origin;
+ X = 2R;
+ queda = (-R,h+d)---(0,h+d){right}...{unitvector(1,-2)}(X,d);
+ else:
+ calotes = (0,h)... for i=1 upto 2*m-1:
+ (R*(sind(i*90/m),2+cosd(i*90/m)))...
+ endfor for i=1 upto m-1:
+ (R*(sind(-i*90/m),cosd(i*90/m)))...
+ endfor {down}(-R,0);
+ X = sqrt(6)*R;
+ queda = (-R,h+d)---(0,h+d){right}...{unitvector(1,-sqrt(6))}(X,d);
+ fi;
+ drawoptions( withpen pencircle scaled (0.75mm) );
+ draw (-l,h)--calotes;
+ draw (-R,0)--(X+R,0);
+ drawoptions();
+ draw fullcircle scaled (2d) shifted (0,h+d);
+ draw fullcircle scaled (2d) shifted (X,d);
+ drawarrow (0,h+d)--(R,h+d);
+ label.top( btex $\vec{v}_{\mathrm{min}}$ etex, (0.6R,h+d) );
+ drawdblarrow origin--(0,h);
+ label.lft( btex $h$ etex, (0,h-0.5R) );
+ drawdblarrow (0,d)--(X,d);
+ label.top( btex $x$ etex, (0.5X,d) );
+ drawarrow (0,h-R)--(R*cosd(angl),h+R*(sind(angl)-1));
+ label.ulft( btex $R$ etex, (0.5*R*cosd(angl),h-R+0.5*R*sind(angl)) );
+ drawoptions( dashed evenly );
+ draw queda;
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/nembends.mp b/graphics/metapost/contrib/macros/featpost/example/nembends.mp
new file mode 100644
index 0000000000..62a3dad9ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nembends.mp
@@ -0,0 +1,48 @@
+% nembends.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+%input mp-tool;
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hsdev, basestep, basxstep, basesdev;
+ numeric i, j, k, coesdev, cylength, cyradius, basen;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, aone;
+ numeric atwo, zcurr, coestep, angsdev, basxsdev;
+ color lenvec, currpos;
+
+
+ coestep := -0.15;
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 3;
+ basestep := cylength*1.6;
+ basxstep := cyradius*4;
+ basesdev := basestep*0.001;
+ basxsdev := basxstep*0.001;
+ hsdev := 0.005;
+ coesdev := 0.001;
+ angsdev := 0.02;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ xcurr := i*basxstep + basxsdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ zcurr := ycurr**2*coestep + coesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo :=angle(1,ycurr*2*coestep)+angsdev*normaldeviate;
+ vcz := cosd( aone )*sind( atwo );
+ vcy := cosd( aone )*cosd( atwo );
+ vcx := sind( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ rigorousdisc(0,true,currpos-0.5*lenvec,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nembiaxi.mp b/graphics/metapost/contrib/macros/featpost/example/nembiaxi.mp
new file mode 100644
index 0000000000..2a239e8aa2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nembiaxi.mp
@@ -0,0 +1,64 @@
+% nembiaxi.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 1.3*(4,5,3);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos, xnoise, tmpcol;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Nb
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 5;
+ hn := 3;
+ basestep := cylength*1.65;
+ hstep := cylength;
+ basesdev := basestep*0.1;
+ hsdev := hstep*0.1;
+ hbase := -0.8;
+ angsdev := 12;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := uniformdeviate( 10 )-5;
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ xnoise := ( sind( angsdev*normaldeviate ), 0, 0 );
+ xnoise := green + xnoise;
+ tmpcol := ncrossprod( ( vcx, vcy, vcz ), xnoise );
+ lenvec := cylength*tmpcol;
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr( counter );
+ generateonebiax( counter, aone, atwo, cylength,
+ 90, 0.35*cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( false, 7, true );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nemdirector.mp b/graphics/metapost/contrib/macros/featpost/example/nemdirector.mp
new file mode 100644
index 0000000000..8b26ba4f44
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nemdirector.mp
@@ -0,0 +1,82 @@
+% nemdirector.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{lucidabr}
+\begin{document}
+etex
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric cylength, cyradius, zoneradi, zoneleng;
+ numeric i, angsdev, halfnum, directlen, arrthick;
+ numeric vcx, vcy, vcz, xcurr, ycurr, thickfact;
+ numeric atwo, zcurr, aone, apos, anul;
+ color lenvec, currpos, tippos;
+ path arrpath;
+ picture tmppict;
+ anul := 0;
+ angsdev := 7;
+ cylength := 0.45;
+ cyradius := 0.1;
+ zoneradi := 2;
+ zoneleng := 4;
+ directlen := 5.6;
+ halfnum := 130;
+ thickfact := 5;
+ arrthick := Spread*ps( (0,0,0), thickfact );
+ tippos := (0,0,0.5*directlen);
+ arrpath := rp(-tippos)--rp(tippos);
+ ahlength := 3*arrthick;
+ ahangle := 40;
+ for i=1 upto halfnum:
+ zcurr := -0.5*zoneleng+uniformdeviate( zoneleng );
+ apos := uniformdeviate( 180 );
+ xcurr := -zoneradi*cosd( apos )*uniformdeviate( 1 );
+ ycurr := zoneradi*sind( apos )*uniformdeviate( 1 );
+ aone := uniformdeviate( 360 );
+ atwo := anul+angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ generatedirline( i, aone, 90-atwo, cylength, currpos );
+ endfor;
+ NL:= halfnum;
+ director_invisible( true, thickfact, false );
+ drawarrow arrpath withpen pencircle scaled arrthick;
+ for i=1 upto halfnum:
+ zcurr := -0.5*zoneleng+uniformdeviate( zoneleng );
+ apos := uniformdeviate( 180 );
+ xcurr := zoneradi*cosd( apos )*uniformdeviate( 1 );
+ ycurr := zoneradi*sind( apos )*uniformdeviate( 1 );
+ aone := uniformdeviate( 360 );
+ atwo := anul+angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ generatedirline( i, aone, 90-atwo, cylength, currpos );
+ endfor;
+ NL:= halfnum;
+ director_invisible( true, thickfact, false );
+ label.urt(btex $\vec{n}$ etex scaled 8.5, rp(tippos) );
+% label.ulft(btex $\vec{n}$ etex scaled 8.5 rotated 90, rp(tippos) );
+% tmppict := currentpicture rotated -90;
+% currentpicture := nullpicture;
+% draw tmppict;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nemquira.mp b/graphics/metapost/contrib/macros/featpost/example/nemquira.mp
new file mode 100644
index 0000000000..b0301a0196
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nemquira.mp
@@ -0,0 +1,60 @@
+% nemquira.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 7*(1,2,1);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, angstep, counter;
+ color lenvec, currpos;
+
+ angstep := 20;
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 4.5;
+ hn := 1;
+ basestep := cylength*1.37;
+ hstep := basestep;
+ basesdev := basestep*0.05;
+ hsdev := basesdev;
+ hbase := -0.8;
+ angsdev := 4;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo := j*angstep + angsdev*normaldeviate;
+ vcz := sind( atwo+90 );
+ vcy := cosd( atwo+90 )*sind( aone );
+ vcx := cosd( atwo+90 )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr(counter);
+ generatedirline( counter, aone, 90+atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nemquirapitch.mp b/graphics/metapost/contrib/macros/featpost/example/nemquirapitch.mp
new file mode 100644
index 0000000000..0c60c13705
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nemquirapitch.mp
@@ -0,0 +1,69 @@
+% nemquirapitch.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := 7*(1,2,1);
+ Spread := 70;
+ ahlength := 3mm;
+ ahangle := 48;
+
+ numeric hsdev, basestep, basemax, basesdev, xpos;
+ numeric i, j, angsdev, cylength, cyradius, basen;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, aone;
+ numeric atwo, zcurr, angstep, counter, linelen;
+ color lenvec, currpos;
+
+ angstep := 20;
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 4.5;
+ basestep := cylength*1.37;
+ basesdev := basestep*0.05;
+ hsdev := basesdev;
+ angsdev := 4;
+ linelen := cylength;
+
+ basemax := basen*basestep;
+ xpos := -(basen+1)*basestep;
+ draw rp((-xpos-0.5*cylength,-basemax,0))--rp((-xpos+0.5*cylength,-basemax,0));
+ draw rp((-xpos-0.5*cylength,basemax,0))--rp((-xpos+0.5*cylength,basemax,0));
+ drawdblarrow rp((-xpos,-basemax,0))--rp((-xpos,basemax,0));
+ label.urt( btex $\frac{p}{2}$ etex scaled 2.5, rp((-xpos,0,0)) );
+ counter := 0;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ zcurr := hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angsdev*normaldeviate;
+ atwo := j*angstep + angsdev*normaldeviate;
+ vcz := sind( atwo+90 );
+ vcy := cosd( atwo+90 )*sind( aone );
+ vcx := cosd( atwo+90 )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr(counter);
+ generatedirline( counter, aone, 90+atwo, cylength, currpos );
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nemsaddl.mp b/graphics/metapost/contrib/macros/featpost/example/nemsaddl.mp
new file mode 100644
index 0000000000..fcf1e2f8a7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nemsaddl.mp
@@ -0,0 +1,86 @@
+% nemsaddl.mp and nemsplay.mp and nemtwist.mp and nembends.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, angstep;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% splay, sddle and twist
+ angstep := 10;
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 3;
+ hn := 1;
+ basestep := cyradius*4.2;
+ hstep := cylength*1.4;
+ basesdev := cyradius*0.003;
+ hsdev := hstep*0.005;
+ hbase := -0.8;
+ angsdev := 3;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bend
+% angstep := 15;
+% cylength := 0.6;
+% cyradius := 0.1;
+% basen := 3;
+% hn := 1;
+% basestep := cylength*1.6;
+% hstep := cyradius*3.4;
+% basesdev := basestep*0.01;
+% hsdev := hstep*0.005;
+% hbase := -0.8;
+% angsdev := 3;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ for i=-basen upto basen:
+ for j=-basen upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := angle((xcurr,ycurr))+angsdev*normaldeviate;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+% vcz := cosd( atwo );
+% vcy := sind( atwo )*sind( aone ); % pure-splay
+% vcx := sind( atwo )*cosd( aone ); % pure-splay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+% vcz := cosd( atwo );
+% vcy := sind( atwo )*sind( aone ); % saddle-splay
+% vcx := -sind( atwo )*cosd( aone ); % saddle-splay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ atwo := ( i ++ j )*angstep + angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone+90 );% pure-twist
+ vcx := sind( atwo )*cosd( aone+90 );% pure-twist
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atwo := j *angstep + angsdev*normaldeviate;
+% vcz := sind( atwo );
+% vcy := cosd( atwo ); % pure-bend
+% vcx := 0; % pure-bend
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ endfor;
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nemuniax.mp b/graphics/metapost/contrib/macros/featpost/example/nemuniax.mp
new file mode 100644
index 0000000000..93d2a8b2f3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nemuniax.mp
@@ -0,0 +1,61 @@
+% nemuniax.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ f := 2*(5,3,4);
+ Spread := 70;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Nu
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 12;
+ hn := 5;
+ basestep := cyradius*3.1;
+ hstep := cylength*1.5;
+ basesdev := cyradius*0.1;
+ hsdev := hstep*0.2;
+ hbase := -0.8;
+ angsdev := 12;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+% generateonebiax( counter, aone, 90-atwo, cylength,
+% -60, 0.25*cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+% director_invisible( false, 5, true );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/newcommunism.mp b/graphics/metapost/contrib/macros/featpost/example/newcommunism.mp
new file mode 100644
index 0000000000..3887cdc280
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/newcommunism.mp
@@ -0,0 +1,237 @@
+% newcommunism.mp
+% L. Nobre G.
+% 2007
+
+prologues := 2;
+
+beginfig(1);
+ numeric u, elhei, elwid, elpos, bawid, bahei, thstp, thdel, i;
+ numeric refang, reft, tfin, tini, spikang;
+ path el, ba, aux, cutel, horns;
+ pair reftpair;
+ color yellow, thered;
+ yellow = 0.87*(0.95*red+0.7*green);
+ thered = 0.66red;
+ u = 2mm;
+ thdel = 25;
+ thstp = 5;
+ elhei = 30u;
+ elwid = 44u;
+ elpos = 26u;
+ bawid = 27u;
+ bahei = 10u;
+ el = (elwid,elpos)..for i=thstp step thstp until 360-thstp:
+ (elwid*cosd(i),elpos+elhei*sind(i)).. endfor cycle;
+ ba = (bawid,-bahei){right}..{left}(bawid,0)--
+ (elwid*cosd(90-thdel),elpos+elhei*sind(90-thdel))--
+ (bawid/3.0,0)--(0,elpos+elhei)--(-bawid/3.0,0)--
+ (elwid*cosd(90+thdel),elpos+elhei*sind(90+thdel))--
+ (-bawid,0){left}..{right}(-bawid,-bahei)--cycle;
+ aux = (0,elpos)--
+ 1.1[(0,elpos),(elwid*cosd(270+2thdel),elpos+elhei*sind(270+2thdel))];
+ reftpair = el intersectiontimes aux;
+ reft = xpart reftpair;
+ refang = angle( direction reft of el );
+ tfin = directiontime dir(180-refang) of el;
+ tini = directiontime dir(180+refang) of el - length el;
+ cutel = subpath (tini,tfin) of el;
+ spikang = (90-angle((0,elpos+elhei)-(-bawid,0)));
+ horns = cutel{dir(-refang-spikang)}..
+ {left}(0,elpos-elhei+bawid/3.0)..
+ {dir(refang+spikang)}cycle;
+ fill ba withcolor yellow;
+ fill horns withcolor yellow;
+ picture storepic;
+ storepic = currentpicture;
+ currentpicture := nullpicture;
+ bboxmargin := bahei;
+ fill bbox storepic withcolor thered;
+ draw storepic;
+endfig;
+
+beginfig(2);
+ numeric u;
+ color yellow, thered;
+ path martelo, foice, monitor, ecran, mar, foi;
+ u = 1pt;
+% yellow = 0.87*(0.95*red+0.7*green);
+ thered = 0.66red;
+ yellow = 0.7blue;
+ picture storemf;
+
+ numeric cabosal, cabesal, cabolar, cabelar;
+ numeric cabolen, cabeclen, cabecontrol, martelrot;
+ pair martelpos;
+ cabosal = 2u;
+ cabesal = 6u;
+ cabolar = 8u;
+ cabelar = 10u;
+ cabolen = 70u;
+ cabeclen = 7u;
+ cabecontrol = 4u;
+ martelrot = 50;
+ martelpos = dir(180)*0.03*cabolen;
+ z100 = origin;
+ z101 = ( cabesal, 0 );
+ z102 = ( cabesal, cabosal+cabelar-cabolen );
+ z103 = ( cabesal+cabolar, cabosal+cabelar-cabolen );
+ z104 = ( cabesal+cabolar, 0 );
+ z105 = ( cabesal+cabolar+cabeclen, 0 );
+ z106 = ( cabesal+cabolar+cabecontrol, cabelar );
+ z107 = ( cabesal+cabolar, cabelar );
+ z108 = ( cabesal+cabolar, cabelar+cabosal );
+ z109 = ( cabesal, cabelar+cabosal );
+ z110 = ( cabesal, cabelar );
+ z111 = ( 0, cabelar );
+ martelo = z100--
+ z101--
+ z102--
+ z103--
+ z104--
+ z105..controls z106..
+ z107--
+ z108--
+ z109--
+ z110--
+ z111--cycle;
+ mar = martelo
+ rotated martelrot
+ shifted martelpos;
+
+ filldraw mar withcolor yellow;
+ show mar;
+ numeric fcabolen, fcabolar, foicecontrol, laminang;
+ numeric foicerot, foicaber, flamilar, fcabomar, refang;
+ numeric fmaomarg, fmaorais, fmaospac, fprotrud, basangul;
+ pair foicepos;
+ laminang = 3;
+ refang = 10
+ basangul = 23;
+ fcabomar = 3u;
+ fcabolar = 8u - fcabomar;
+ flamilar = 4u;
+ fcabolen = 22u;
+ foicecontrol = 2u;
+ fmaomarg = 6u;
+ fmaorais = 2u;
+ fmaospac = 14u;
+ fprotrud = 30u;
+ foicaber = 42u;
+ foicerot = -50;
+ foicepos = dir(270)*0.3*foicaber;
+ z200 = origin;
+ z201 = ( -fcabomar, 0 );
+ z202 = ( -fcabomar, -fcabolen );
+ z203 = ( fcabolar, -fcabolen );
+ z204 = ( fcabolar+foicecontrol, -fcabolen );
+ z205 = ( fcabolar+fmaomarg, fmaorais-fmaospac );
+ z206 = ( fcabolar, -fmaospac );
+ z207 = ( fcabolar, 0 );
+ z208 = ( -fprotrud, foicaber );
+ z209 = ( 0, flamilar );
+ foice = z200--
+ z201--
+ z202--
+ z203..controls z204..
+ z205{dir(-160)}..{left}
+ z206--
+ z207{dir(basangul)}..tension 0.8..{dir(180+refang+laminang)}
+ z208{dir(refang-laminang)}..tension 0.8..{dir(180+basangul)}
+ z209--cycle;
+ foi = foice
+ rotated foicerot
+ shifted foicepos;
+
+ filldraw foi withcolor yellow;
+ show foi;
+ storemf = currentpicture shifted -(center currentpicture);
+ currentpicture := nullpicture;
+
+
+
+
+
+
+ numeric monith, monitw;
+ pair mll, mlr, mur, mul;
+ monith = 18u + ypart ((urcorner storemf)-(llcorner storemf));
+ monitw = 1.34monith;
+ mll = (-0.5monitw, -0.5monith);
+ mlr = (0.5monitw, -0.5monith);
+ mur = (0.5monitw, 0.5monith);
+ mul = (-0.5monitw, 0.5monith);
+ ecran = mll--
+ mlr--
+ mur--
+ mul--cycle;
+
+ numeric bordthick, roundfrac, alturpe, borraspac, largupe;
+ numeric borralarg, apoiolarg, cornermarg, apoiothick;
+ bordthick = 13u;
+ roundfrac = 0.3;
+ alturpe = 15u;
+ borraspac = 0.95u;
+ largupe = 50u;
+ borralarg = 60u;
+ apoiolarg = 156u;
+ cornermarg = 2u;
+ apoiothick = 18u;
+ z301 = (0.5largupe,-0.5monith-bordthick);
+ z302 = (0.5monitw+roundfrac*bordthick,-0.5monith-bordthick);
+ z303 = (0.5monitw+bordthick,-0.5monith-roundfrac*bordthick);
+ z304 = (0.5monitw+bordthick,0.5monith+roundfrac*bordthick);
+ z305 = (0.5monitw+roundfrac*bordthick,0.5monith+bordthick);
+ z306 = (-0.5monitw-roundfrac*bordthick,0.5monith+bordthick);
+ z307 = (-0.5monitw-bordthick,0.5monith+roundfrac*bordthick);
+ z308 = (-0.5monitw-bordthick,-0.5monith-roundfrac*bordthick);
+ z309 = (-0.5monitw-roundfrac*bordthick,-0.5monith-bordthick);
+ z310 = (-0.5largupe,-0.5monith-bordthick);
+ z311 = (-0.5largupe,-0.5monith-bordthick-alturpe);
+ z312 = (-0.5apoiolarg+cornermarg,
+ -0.5monith-bordthick-alturpe-cornermarg);
+ z313 = (-0.5apoiolarg,
+ -0.5monith-bordthick-alturpe-apoiothick-borraspac);
+ z314 = (-0.5borralarg,
+ -0.5monith-bordthick-alturpe-apoiothick-borraspac);
+ z315 = (0,-0.5monith-bordthick-alturpe-apoiothick);
+ z316 = (0.5borralarg,
+ -0.5monith-bordthick-alturpe-apoiothick-borraspac);
+ z317 = (0.5apoiolarg,
+ -0.5monith-bordthick-alturpe-apoiothick-borraspac);
+ z318 = (0.5apoiolarg-cornermarg,
+ -0.5monith-bordthick-alturpe-cornermarg);
+ z319 = (0.5largupe,-0.5monith-bordthick-alturpe);
+ monitor = z301--
+ z302{right}..{up}
+ z303--
+ z304{up}..{left}
+ z305--
+ z306{left}..{down}
+ z307--
+ z308{down}..{right}
+ z309--
+ z310--
+ z311..controls z312..
+ z313--
+ z314{dir(73)}...{right}
+ z315{right}...{dir(-73)}
+ z316--
+ z317..controls z318..
+ z319--cycle;
+ draw monitor withcolor thered;
+ bboxmargin := monitw;
+ fill bbox monitor withcolor thered;
+ filldraw monitor withcolor yellow;
+ filldraw ecran withcolor thered;
+ show monitor;
+ show ecran;
+% label.urt("New Communism", llcorner monitor);
+ draw storemf;
+
+
+ endfig;
+
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/newexperimental.mp b/graphics/metapost/contrib/macros/featpost/example/newexperimental.mp
new file mode 100644
index 0000000000..50e8363702
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/newexperimental.mp
@@ -0,0 +1,156 @@
+% newexperimental.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+%verbatimtex
+%\documentclass{article}
+%\usepackage{beton}
+%\usepackage{concmath}
+%\usepackage{ccfonts}
+%\begin{document}
+%etex
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+f := (4.5,-6,5);
+%f := (-4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[];
+ color reflabpos, reflabpoi, lincolor;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang, stepang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ inclang = 150;
+ aberang = 17;
+ sampang = 30;
+ stepang = 20;
+ ul = 0.1;
+ labelscale = 5;
+ outermagpos = 30ul;
+ squside = outermagpos;
+ sqlevel = -20ul;
+ polesep = 15ul;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len4 = 20ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+ lincolor = 0.5background;
+
+ reflabpos = ( -squside, 0, -sqlevel );
+ reflabpoi = ( -squside, squside, -sqlevel );
+ V1 := (squside,squside,-sqlevel);
+ V2 := (-squside,squside,-sqlevel);
+ V3 := (-squside,-squside,-sqlevel);
+ V4 := (squside,-squside,-sqlevel);
+% makeface1(1,2,3,4);
+% draw_all_test( false );
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ lab2 = reflabpos;
+ txt2 = thelabel.top( btex magnet etex scaled labelscale, rp( lab2 ) );
+ fix2 = (-outermagpos+0.5len1,0,ray1);
+ axe3 = ( 0, cosd( inclang ), sind( inclang ) );
+ pos3 = -( len3 + len4 + len5 )*axe3;
+ lab3 = (1-fracone)*reflabpoi+fracone*V1;
+ txt3 = thelabel.rt( btex rotor etex scaled labelscale, rp( lab3 ) );
+ axe4 = axe3;
+ pos4 = -( len4 + len5 )*axe4;
+ fix3 = pos4+fracsam*ray3*(0,cosd( inclang -90 ),sind( inclang -90 ));
+ axe5 = axe3;
+ pos5 = -( len5 )*axe5;
+ lab5 = (1-fracone)*reflabpoi+fracone*V2;
+ txt5 = thelabel.rt( btex sample etex scaled labelscale, rp(lab5) );
+ fix5 = fracsam*ray5*(0,cosd( inclang -90 ),sind( inclang -90 ));
+
+ V5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ V8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ V7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ lab6 = fracone*reflabpos+(1-fracone)*V3;
+ txt6=thelabel.lft(btex camera etex scaled labelscale,rp(lab6));
+ fix6 = pos6+len6*axe6;
+ pos8 = pos7+len7*axe7;
+ axe8 = axe7;
+ lab8 = (1-fracone)*reflabpos+fracone*V3;
+ txt8 = thelabel.lft( btex lamp etex scaled labelscale, rp( lab8 ) );
+ fix8 = pos8+len8*axe8;
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ pos10 = pos9+len9*(1,0,0);
+ len10 = len1;
+
+ getready( "rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) )", pos1 );
+ getready( "whatisthis(pos2,ray1*green,ray1*blue,conorm((-ray5-polesep,0,0)-pos2),ray2/ray1)", pos2 );
+ getready( "rigorousdisc( 0, true, pos3, ray3, len3*axe3 )", pos3 );
+ getready( "rigorousdisc( 0, true, pos4, ray4, len4*axe4 )", pos4 );
+ getready( "rigorousdisc( 0, true, pos5, ray5, len5*axe5 )", pos5 );
+ getready( "draw rp(V5)--rp(V6)--rp(V7)--rp(V8)--cycle", black );
+ getready( "draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt",0.5*pos6);
+ getready( "rigorousdisc( 0, true, pos6, ray6, len6*axe6 )", pos6 );
+ getready( "whatisthis(pos7,ray7*red,-ray7*ncrossprod(red,axe7),conorm(pos8-pos7),ray8/ray7)", pos7 );
+ getready( "rigorousdisc( 0, true, pos8, ray8, len8*axe8 );", pos8 );
+ getready( "whatisthis(pos9,ray9*green,ray9*blue,conorm(pos10-pos9),ray10/ray9)", pos9 );
+ getready( "rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) )", pos10 );
+ doitnow;
+ draw llcorner txt2--lrcorner txt2--rp(fix2) withcolor lincolor;
+ draw lrcorner txt3--llcorner txt3--rp(fix3) withcolor lincolor;
+ draw lrcorner txt5--llcorner txt5--rp(fix5) withcolor lincolor;
+ draw llcorner txt6--lrcorner txt6--rp(fix6) withcolor lincolor;
+ draw llcorner txt8--lrcorner txt8--rp(fix8) withcolor lincolor;
+ draw txt2;
+ draw txt3;
+ draw txt5;
+ draw txt6;
+ draw txt8;
+
+ produce_auto_scale;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/nosimples.mp b/graphics/metapost/contrib/macros/featpost/example/nosimples.mp
new file mode 100644
index 0000000000..84fb96093f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nosimples.mp
@@ -0,0 +1,61 @@
+% nosimples.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, ray, side, i, pensize, ang, fac, mar;
+ u = 2mm;
+ ray = 2.9u;
+ size = 10u;
+ pensize = 0.45u;
+ fac = 2.5;
+ mar = 1.0;
+ pickup pencircle scaled pensize;
+ for i=1 upto 5:
+ ang := i*72+18;
+ z[i] = size*dir(ang);
+ endfor;
+ z6 = z1+ray*(dir(-36)+dir(54));
+ z61 = z1+ray*(dir(-36)+dir(-18));
+ z11 = z1+ray*(dir(216)+dir(126));
+ z7 = z2+ray*(dir(216)+dir(126));
+ z8 = z3+ray*(dir(216)+dir(198));
+ z12 = z2+ray*(dir(216)+dir(198));
+ z21 = z1+ray*(dir(216)+dir(198));
+ z24 = z4+ray*(dir(216)+dir(198));
+ z13 = z3+2*ray*down;
+ z9 = z4+2*ray*down;
+ z15 = z5+ray*(dir(-36)+dir(54));
+ z10 = z5+ray*(dir(-36)+dir(-18));
+ z14 = z4+ray*(dir(-36)+dir(-18));
+ z63 = z3+ray*(dir(-36)+dir(-18));
+ z16 = fac[z1,z2];
+ z17 = (fac-mar)[z5,z3];
+ z18 = (fac-mar)[z2,z4];
+ z19 = fac[z1,z5];
+ z35 = (z10--z14) intersectionpoint (z5--z19);
+ z34 = (z13---z9..z14---z10) intersectionpoint (z4--z18);
+ z33 = (z9---z13..z8---z12) intersectionpoint (z3--z17);
+ z32 = (z2--z16) intersectionpoint (z8--z12);
+ z31 = (z1--z2) intersectionpoint (z21--z24);
+ z50 = (z21--z24) intersectionpoint (z3--z5);
+ z55 = (z3--z5) intersectionpoint (z2--z4);
+ z70 = (z61--z63) intersectionpoint (z2--z4);
+ z75 = (z61--z63) intersectionpoint (z21--z24);
+ draw z9---z13..z8---z12..z7;
+ draw z55--z18--z19--z5;
+ draw (z1{dir(144)}..z11..z21---z24..z9..{dir(54)}z14) cutafter (z2--z18);
+ draw z35---z10..z15..z5---z50;
+ draw z33..z17--z16--z32;
+ draw z31---z1..z6--z15;
+ draw z7--z11;
+% draw z1..z6..z61---z63..z13..z8;
+ draw z70--z75;
+% dotlabels.top(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,55);
+% dotlabels.lft(21,24,31,32,33,34,35,50);
+% dotlabels.bot(61,63,70,75);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/nosuspension.mp b/graphics/metapost/contrib/macros/featpost/example/nosuspension.mp
new file mode 100644
index 0000000000..2be03e82d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nosuspension.mp
@@ -0,0 +1,131 @@
+% nosuspension.mp
+% the hard way to write
+
+beginfig(0);
+ picture l[], auxpic;
+ numeric gridsp, u, pensz, yprop,
+ altura, largura, small, big, thisjump, thatjump;
+ pen thispen, thatpen;
+ path auxpat, thispat, thatpat;
+ pair currpos, reforigin;
+ u = 1mm;
+ pensz = 0.5u;
+ yprop = 1.5;
+ gridsp = 6u;
+ altura = 3gridsp;
+ largura = 2gridsp;
+ small = 0.5gridsp;
+ big = 0.6667gridsp;
+ thisjump = 3gridsp;
+ thatjump = 4gridsp;
+ reforigin = (10cm,15cm) + left*9.5cm;
+ auxpat = (0,yprop*u)--(0.4u,yprop*u){right}..{down}(1u,0.9u)--(1u,0);
+ auxpat := auxpat--(auxpat reflectedabout(origin,right));
+ thispat = auxpat--(auxpat reflectedabout(origin,up));
+ thatpat = thispat rotated 90;
+ thispen = makepen(thispat) scaled pensz;
+ thatpen = makepen(thatpat) scaled pensz;
+ draw (big,0)--origin
+ --(0,altura)
+ --(largura,0)
+ --(largura,altura)
+ --(largura-big,altura) withpen thatpen;
+ l1 = currentpicture;
+ currentpicture := nullpicture;
+ draw (largura,largura)--(0,largura)
+ --origin
+ --(altura,largura)
+ --(altura,0)
+ --(altura-largura,0) withpen thatpen;
+ l2 = currentpicture;
+ currentpicture := nullpicture;
+ draw (altura,largura-small)--(altura,largura)
+ --(0,largura)
+ --(altura,0)
+ --origin
+ --(0,small) withpen thispen;
+ l3 = currentpicture;
+ currentpicture := nullpicture;
+ draw (small,altura)--(0,altura)
+ --origin
+ --(largura,0)
+ --(largura,altura)
+ --(largura-small,altura) withpen thispen;
+ l4 = currentpicture;
+ currentpicture := nullpicture;
+ draw (small,0)--origin
+ --(0,altura)
+ --(largura,altura)
+ --(largura,altura-gridsp)
+ --(0,altura-gridsp) withpen thispen;
+ l5 = currentpicture;
+ currentpicture := nullpicture;
+ draw (largura,small)--(largura,0)
+ --origin
+ --(0,altura)
+ --(largura,altura)
+ --(largura,altura-small) withpen thispen;
+ draw (0,largura)--(largura-small,largura) withpen thispen;
+ l6 = currentpicture;
+ currentpicture := nullpicture;
+ draw (-small,0)--origin
+ --(0,altura)
+ --(-small,altura) withpen thispen;
+ l7 = currentpicture;
+ currentpicture := nullpicture;
+ draw (largura-small,largura)--(largura-small,altura)
+ --(0,altura)
+ --origin
+ --(largura,0)
+ --(largura,largura)
+ --(0,largura) withpen thispen;
+ l8 = currentpicture;
+ currentpicture := nullpicture;
+ draw origin--(small,0)
+ --(small,largura)
+ --(0,largura) withpen thatpen;
+ draw (small,largura-big)--(largura,largura)
+ --(largura,largura-small) withpen thatpen;
+ draw (altura,small)--(altura,0)
+ --(largura-big,largura-small) withpen thatpen;
+ l9 = currentpicture;
+ currentpicture := nullpicture;
+ currpos = (thisjump,thatjump+gridsp)+reforigin;
+ draw l1 scaled 2 shifted currpos;
+ currpos := currpos+(2thisjump,0);
+ draw l2 scaled 2 shifted currpos withcolor 0.875red;
+ currpos := reforigin;
+ draw l3 shifted currpos;
+ currpos := currpos+(thatjump,0);
+ draw l4 shifted currpos;
+ currpos := currpos+(thisjump,gridsp);
+ draw l3 shifted currpos;
+ currpos := currpos+(thatjump,-gridsp);
+ draw l5 shifted currpos;
+ currpos := currpos+(thisjump,0);
+ draw l6 shifted currpos;
+ currpos := currpos+(thisjump,gridsp);
+ draw l1 shifted currpos;
+ currpos := currpos+(thisjump,-gridsp);
+ draw l3 shifted currpos;
+ currpos := currpos+(thatjump+small,0);
+ draw l7 shifted currpos;
+ currpos := currpos+(gridsp,gridsp);
+ draw l2 shifted currpos;
+ currpos := currpos+(thatjump,-gridsp);
+ draw l1 shifted currpos;
+ currpos := reforigin+(2thatjump,-thatjump);
+ draw l8 shifted currpos;
+ currpos := currpos+(thisjump+small,-gridsp);
+ draw l7 shifted currpos;
+ currpos := currpos+(gridsp,gridsp);
+ draw l9 shifted currpos;
+ currpos := currpos+(thatjump,-gridsp);
+ draw l6 shifted currpos;
+ currpos := currpos+(thisjump,gridsp);
+ draw l3 shifted currpos;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/nsmetica.mp b/graphics/metapost/contrib/macros/featpost/example/nsmetica.mp
new file mode 100644
index 0000000000..e9d82e9c93
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nsmetica.mp
@@ -0,0 +1,60 @@
+% nsmetica.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+ f := 2*(5,3,2);
+ Spread := 70;
+ NF := 0;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter;
+ color lenvec, currpos;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sma
+ cylength := 0.45;
+ cyradius := 0.1;
+ basen := 11;
+ hn := 3;
+ basestep := cyradius*2.4;
+ hstep := cylength*2.1;
+ basesdev := cyradius*0.3;
+ hsdev := hstep*0.04;
+ hbase := -0.8;
+ angsdev := 7;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ hcurr := hbase;
+ counter := 0;
+ for k=1 upto hn:
+ hcurr := hcurr + hstep;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := (i-1)*basestep + uniformdeviate( basestep );
+ ycurr := (j-1)*basestep + uniformdeviate( basestep );
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+% rigorousdisc( 0, true, currpos-0.5*lenvec, cyradius, lenvec);
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, 5, false );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/nulldefectanglexample.mp b/graphics/metapost/contrib/macros/featpost/example/nulldefectanglexample.mp
new file mode 100644
index 0000000000..182c6e4120
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nulldefectanglexample.mp
@@ -0,0 +1,134 @@
+% nulldefectanglexample.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+beginfig(1);
+ color po[];
+ numeric ta, tb;
+ pen stroke;
+ stroke = pencircle scaled 3pt;
+ ta = sind(36)/cosd(36);
+ tb = sind(18)/cosd(18);
+ po1 = (1,ta,0);
+ po2 = (-1,ta,0);
+ po3 = (-1,tb,0);
+ po4 = (-1,-ta,0);
+ po5 = (0,-ta,0);
+ po6 = (1,-ta,0);
+ po7 = (1,0,0);
+ path frame;
+ frame = rp(po1)--rp(po2)--rp(po4)--rp(po6)--cycle;
+ unfill frame;
+ drawoptions( withpen stroke );
+ draw frame;
+ drawoptions( dashed evenly );
+ draw rp(black)--rp(po1);
+ draw rp(black)--rp(po3);
+ draw rp(black)--rp(po5);
+ draw rp(black)--rp(po7);
+endfig;
+
+beginfig(2);
+ numeric parang, refdista, refdistb, auxa, auxb;
+ parang = 55;
+ refdista = conorm(po1-po3);
+ refdistb = 1 ++ ta;
+ auxa = (ta-tb)*sind(18);
+ auxb = (ta-tb)*cosd(18);
+ po7 := (cosd(parang),0,-sind(parang));
+ po6 := po7+po5;
+ po1 := improvertex( black, refdistb, po7, ta, po3, refdista, po1 );
+ po8 = po3+N(po3)*auxa;
+ po2 := po8+auxb*ncrossprod(po3,ccrossprod(po1,po3));
+ drawoptions( withpen stroke );
+ path a, b, c, d;
+ a = rp(black)--rp(po3)--rp(po4)--rp(po5)--cycle;
+ b = rp(black)--rp(po5)--rp(po6)--rp(po7)--cycle;
+ c = rp(black)--rp(po7)--rp(po1)--cycle;
+ d = rp(black)--rp(po1)--rp(po2)--rp(po3)--cycle;
+ unfill a; draw a;
+ unfill b; draw b;
+ unfill c; draw c;
+ unfill d; draw d;
+endfig;
+
+beginfig(3);
+ numeric a, b, c, i, j;
+ a = 0.5;
+ b = 0.5*sqrt(3);
+ V1 := (b,-a,a);
+ V2 := (2*b,-a,0);
+ V3 := (b,a,a);
+ V4 := (2*b,a,0);
+ V5 := (b,a,0);
+ V6 := (0,1,0);
+ c = 6;
+ for j=1 upto 2:
+ for i=1 upto 6:
+ c := incr(c);
+ V[c] := rotvecaroundanother( j*120, V[i], blue );
+ endfor;
+ endfor;
+ makeface1(1,3,7,9,13,15);
+ makeface2(1,2,4,3);
+ makeface3(3,4,5);
+ makeface4(3,5,6,7);
+ makeface5(7,6,8);
+ makeface6(7,8,10,9);
+ makeface7(9,10,11);
+ makeface8(9,11,12,13);
+ makeface9(13,12,14);
+ makeface10(13,14,16,15);
+ makeface11(15,16,17);
+ makeface12(15,17,18,1);
+ makeface13(1,18,2);
+ f := (5,0.9,9);
+ draw_invisible( false, false, white, black );
+endfig;
+
+beginfig(4);
+ numeric bsang, dista, distb, distc, distd, verdi, hordi, si, co;
+ color cauxa, cauxb, cauxd;
+ bsang = 15;
+ cauxa = (-1-sind(22),-1-cosd(22),1);
+ cauxb = (-1-cosd(22),-1-sind(22),1);
+ cauxd = (1+cosd(15),sind(15)-1,1);
+ V1 := (-1,1,1);
+ V2 := (-1,-1,1);
+ distc = conorm(V2-cauxb);
+ V3 := (1,-1,1);
+ dista = conorm(cauxa-V3);
+ V4 := (1,1,1);
+ distd = conorm(V4-cauxd);
+ V6 := (-1-cosd(bsang)*cosd(22),1+sind(22),1-sind(bsang)*cosd(22));
+ V7 := (-1-cosd(bsang)*cosd(22),-1-sind(22),1-sind(bsang)*cosd(22));
+ distb = conorm(cauxa-cauxb);
+ V8 := improvertex( V3, dista, V7, distb, V2, distc, cauxb-(0,0,0.5) );
+ V5 := (X(V8),-Y(V8),Z(V8));
+ verdi = 1-Z(V8);
+ hordi = Y(V8)+1;
+ si = verdi/(verdi++hordi);
+ co = hordi/(verdi++hordi);
+ V9 := (1+0.5*sqrt(2),-1+0.5*sqrt(2)*co,1-0.5*sqrt(2)*si);
+ V10 := improvertex( V9, 1, V3, 1, V4, distd, (1,-1,0) );
+ V11 := (X(V10),-Y(V10),Z(V10));
+ V12 := (X(V9),-Y(V9),Z(V9));
+ NF := 0;
+ makeface1(1,2,3,4);
+ makeface2(1,5,6);
+ makeface3(1,2,7,6);
+ makeface4(2,7,8);
+ makeface5(2,3,9,8);
+ makeface6(3,9,10);
+ makeface7(3,4,11,10);
+ makeface8(4,11,12);
+ makeface9(1,5,12,4);
+ f := (9,2,5);
+ draw_invisible( false, false, white, black );
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/nurbstobeziern.mp b/graphics/metapost/contrib/macros/featpost/example/nurbstobeziern.mp
new file mode 100644
index 0000000000..504ec4c682
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/nurbstobeziern.mp
@@ -0,0 +1,205 @@
+% nurbstobezier.mp
+% Troy Henderson
+% 2007
+
+prologues := 1;
+
+% Evaluate a cubic polynomial of the "standard" Bezier form at t
+vardef evalbezier(expr p,t) =
+ save _a,_b,_c,_d;
+ numeric _a,_b,_c,_d;
+ _a:=(1-t)**3;
+ _b:=3*((1-t)**2)*t;
+ _c:=3*(1-t)*(t**2);
+ _d:=t**3;
+ (point 0 of p)*_a + (postcontrol 0 of p)*_b + (precontrol 1 of p)*_c + (point 1 of p)*_d
+enddef;
+
+% Evaluate the derivative of a cubic polynomial of the "standard"
+% Bezier form at t
+vardef evalbezierderivative(expr p,t) =
+ save _a,_b,_c;
+ pair _a,_b,_c;
+ _a:=3*((point 1 of p) - 3*(precontrol 1 of p) + 3*(postcontrol 0 of p) -(point 0 of p));
+ _b:=6*((precontrol 1 of p) - 2*(postcontrol 0 of p) + (point 0 of p));
+ _c:=3*((postcontrol 0 of p) - (point 0 of p));
+ _a*(t**2) + _b*t + _c
+enddef;
+
+% Evaluate a rational function of the "standard" cubic NURBS form at t
+vardef evalnurbs(expr p,w,t) =
+ save _q,_r;
+ path _q,_r;
+ _q:=((cyanpart w)*(point 0 of p)).. controls ((magentapart w)*(postcontrol 0 of p)) and ((yellowpart w)*(precontrol 1 of p)) .. ((blackpart w)*(point 1 of p));
+ _r:=(cyanpart w,0) .. controls (magentapart w,0) and (yellowpart w,0) .. (blackpart w,0);
+ evalbezier(_q,t)/(xpart evalbezier(_r,t))
+enddef;
+
+% Evaluate the derivative of a rational function of the "standard"
+% cubic NURBS form at t
+vardef evalnurbsderivative(expr p,w,t) =
+ save _a,_b,_c,_d,_q,_r;
+ pair _a,_b;
+ numeric _c,_d;
+ path _q,_r;
+ _q:=((cyanpart w)*(point 0 of p)) .. controls ((magentapart w)*(postcontrol 0 of p)) and ((yellowpart w)*(precontrol 1 of p)) .. ((blackpart w)*(point 1 of p));
+ _r:=(cyanpart w,0) .. controls (magentapart w,0) and (yellowpart w,0) .. (blackpart w,0);
+ _a:=evalbezier(_q,t);
+ _b:=evalbezierderivative(_q,t);
+ _c:=xpart evalbezier(_r,t);
+ _d:=xpart evalbezierderivative(_r,t);
+ (_b*_c-_a*_d)/(_c**2)
+enddef;
+
+% Fit a cubic polynomial of the "standard" Bezier form to a
+% rational function of the
+% "standard" cubic NURBS form with function and derivative agreement
+% at tmin and tmax
+vardef nurbstobezier(expr p,w,tmin,tmax) =
+ save _a,_b,_c,_d,_e;
+ pair _a,_b,_c,_d;
+ numeric _e;
+ _e:=(tmax-tmin)/3;
+ _a:=evalnurbs(p,w,tmin);
+ _b:=_a + _e*evalnurbsderivative(p,w,tmin);
+ _d:=evalnurbs(p,w,tmax);
+ _c:=_d - _e*evalnurbsderivative(p,w,tmax);
+ _a .. controls _b and _c .. _d
+enddef;
+
+% Reparameterize a cubic polynomial of the "standard" Bezier form by mapping
+% the interval [tmin,tmax] to [0,1]
+vardef beziertobezier(expr p,tmin,tmax) =
+ nurbstobezier(p,(1,1,1,1),tmin,tmax)
+enddef;
+
+% Evalute the L^2[0,1] norm of a cubic polynomial of the "standard"
+% Bezier form
+vardef beziernorm(expr p) =
+ save _a,_b,_c,_d,_i,_xabs,_yabs,_A,_B,_C,_D,_I;
+ numeric _a,_b,_c,_d,_i,_xabs,_yabs,_A,_B,_C,_D,_I;
+ _xabs:=max(abs(xpart point 0 of p),abs(xpart postcontrol 0 of p),abs(xpart precontrol 1 of p),abs(xpart point 1 of p));
+ _yabs:=max(abs(ypart point 0 of p),abs(ypart postcontrol 0 of p),abs(ypart precontrol 1 of p),abs(ypart point 1 of p));
+ if (_xabs > 0):
+ _a:=xpart((point 1 of p) - 3*(precontrol 1 of p) + 3*(postcontrol 0 of p) - (point 0 of p))/_xabs;
+ _b:=3*xpart((precontrol 1 of p) - 2*(postcontrol 0 of p) + (point 0 of p))/_xabs;
+ _c:=3*xpart((postcontrol 0 of p) - (point 0 of p))/_xabs;
+ _d:=xpart(point 0 of p)/_xabs;
+ _i:=(_a**2)/7 + ((_b)**2 + 2*_a*_c)/5 + (_a*_b + 2*_b*_d + (_c**2))/3 + (_a*_d + _b*_c)/2 + (_c*_d + (_d**2));
+ else:
+ _i:=0;
+ fi;
+ if (_yabs > 0):
+ _A:=ypart((point 1 of p) - 3*(precontrol 1 of p) + 3*(postcontrol 0 of p) - (point 0 of p))/_yabs;
+ _B:=3*ypart((precontrol 1 of p) - 2*(postcontrol 0 of p) + (point 0 of p))/_yabs;
+ _C:=3*ypart((postcontrol 0 of p) - (point 0 of p))/_yabs;
+ _D:=ypart(point 0 of p)/_yabs;
+ _I:=(_A**2)/7 + ((_B)**2 + 2*_A*_C)/5 + (_A*_B + 2*_B*_D + (_C**2))/3 + (_A*_D + _B*_C)/2 + (_C*_D + (_D**2));
+ else:
+ _I:=0;
+ fi;
+ (_xabs*sqrt(_i)) ++ (_yabs*sqrt(_I))
+enddef;
+
+% Fit a cubic Bezier spline to a rational function of the "standard"
+% cubic NURBS form by iteratively refining the Bezier curve.
+% p is a 4 point path containing the 4 cubic NURBS (2D) control points
+% w is a cmykcolor containing the 4 cubic NURBS weights
+% EPS is the tolerance to stop refining each branch of the Bezier spline
+vardef fitnurbswithbezier(expr p,w,EPS) =
+ save _a,_b,_c,_e,_error,_k,_q;
+ numeric _a,_b,_c,_error,_k;
+ path _q,_q[],_e;
+ _a:=0;
+ _b:=1;
+ _k:=1/sqrt(2);
+ _q:=(point 0 of p);
+ _q[4]:=nurbstobezier(p,w,_a,_b);
+ forever:
+ exitunless(_a<1);
+ _q[1]:=_q[4];
+ _c:=_b-_k*((_b-_a)**2);
+ _q[2]:=beziertobezier(_q[1],_a,_c);
+ _q[3]:=nurbstobezier(p,w,_a,_c);
+ _q[4]:=_q[3];
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) .. controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3])) and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) .. ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+ show _error;
+ if (_error > EPS):
+ _b:=_c;
+ else:
+ _q[2]:=beziertobezier(_q[1],_c,_b);
+ _q[3]:=nurbstobezier(p,w,_c,_b);
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) .. controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3])) and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) .. ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+ if (_error > EPS):
+ _q:=_q .. controls (postcontrol 0 of _q[4]) and (precontrol 1 of _q[4]) .. (point 1 of _q[4]);
+ _a:=_c;
+ _q[4]:=_q[3];
+ else:
+ _q:=_q .. controls (postcontrol 0 of _q[1]) and (precontrol 1 of _q[1]) .. (point 1 of _q[1]);
+ _a:=_b;
+ _q[4]:=nurbstobezier(p,w,_a,1);
+ fi;
+ _b:=1;
+ fi;
+ endfor;
+ _q
+enddef;
+
+% This macro is used to provide a path to draw the NURBS
+% It returns a path of length N passing through N+1 equally spaced
+% (in time) points along the NURBS connected by line segments
+vardef samplednurbs(expr p,w,N) =
+ save _a,_b,_c,_d,_n,_t,_q;
+ numeric _a,_b,_c,_d,_n,_t;
+ path _q;
+ _q:=(point 0 of p);
+ for _n=1 upto N:
+ _t:=_n/N;
+ _a:=(cyanpart w)*((1-_t)**3);
+ _b:=3*(magentapart w)*((1-_t)**2)*_t;
+ _c:=3*(yellowpart w)*(1-_t)*(_t**2);
+ _d:=(blackpart w)*(_t**3);
+ _q:=_q .. ((_a*(point 0 of p)+_b*(postcontrol 0 of p)+_c*(precontrol 1 of p)+_d*(point 1 of p))/(_a+_b+_c+_d));
+ endfor;
+ ( _q )
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Here's where the fun begins %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+beginfig(0);
+% p contains the 4 control points of the rational function of the
+% "standard" cubic NURBS form
+ path p;
+ p:=(297.63725,297.63725) .. controls (132.98871,286.67885) and (180.62535,152.16249) .. (429.54399,226.31157);
+
+% w contains the 4 weights for the rational function of the
+% "standard" cubic NURBS form
+ cmykcolor w;
+ w:=(2.15756,1.6709,0.8598,1.34647);
+
+% EPS represents the minimum "acceptable error" to stop refining any
+% given branch of the Bezier
+ Err:=0.040;
+
+% q represents the Bezier spline fit to the rational function of the
+% "standard" cubic NURBS form
+ path q;
+ q:=fitnurbswithbezier(p,w,Err);
+% q:=fitnurbswithbezier(reverse p,(blackpart w,yellowpart w,magentapart w,cyanpart w),Err);
+
+% draw the NURBS by sampling it at many points and connecting the
+% samples via line segments
+ draw samplednurbs(p,w,20) withcolor red withpen pencircle scaled 2bp;
+
+% draw the Bezier spline and its knots
+ draw q;
+ for n=0 upto length q:
+ draw fullcircle scaled 2 shifted point n of q withcolor blue;
+ endfor;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/onebigword.mp b/graphics/metapost/contrib/macros/featpost/example/onebigword.mp
new file mode 100644
index 0000000000..c8621e7adb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/onebigword.mp
@@ -0,0 +1,17 @@
+
+beginfig(1);
+ picture topl;
+ color one, two, thr, fur;
+ string drawcommand;
+ drawcommand = "draw topl withcolor one;";
+% defaultfont := "putr8r";
+% defaultfont := "bchr8r";
+ one = (0.13333,0.54510,0.13334);
+ two = (0.74118,0.71764,0.41961);
+ thr = (0.80000,0.20000,0.20000);
+ fur = (0.00000,0.85000,1.00000);
+ topl = thelabel( "40", origin) scaled 7;
+ scantokens( drawcommand );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/optest.mp b/graphics/metapost/contrib/macros/featpost/example/optest.mp
new file mode 100644
index 0000000000..67a2099bf5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/optest.mp
@@ -0,0 +1,51 @@
+% optest.mp
+% L. Nobre G.
+% 2000
+
+beginfig(1);
+% linecap := squared;
+ pickup pencircle scaled 0.1mm;
+ numeric salto, i, shif;
+ pair cen;
+ shif = 2cm;
+ cen = (10.5cm,14.845cm);
+ draw ((-shif,0)--(shif,0)) shifted cen;
+ draw ((0,-shif)--(0,shif)) shifted cen;
+ pickup pencircle scaled 0.05mm;
+ salto = 1mm;
+ for i = 20 upto 22:
+ draw fullcircle scaled (i*salto) shifted cen;
+ endfor;
+ for i = 27 upto 28:
+ draw unitsquare shifted (-0.5,-0.5)
+ scaled (i*salto)
+ rotated 45 shifted cen;
+ endfor;
+ for i = 29 upto 31:
+ draw fullcircle scaled (i*salto) shifted cen;
+ endfor;
+ for i = -10 step 2 until 10:
+ draw (origin--shif*(1-0.0125*abs(i))*dir(i)) shifted cen;
+ endfor;
+endfig;
+
+beginfig(2);
+ linecap := squared;
+ pickup pensquare scaled 0.15mm;
+ numeric salto, ix, iy;
+ path face;
+ picture descrit;
+ salto = 0.3in;
+ face = unitsquare xscaled 1.33 scaled 2;
+ fill face withcolor red;
+ draw face;
+ descrit = currentpicture;
+ currentpicture := nullpicture;
+ for iy = 1 upto 5:
+ for ix = 1 upto 5:
+ draw descrit shifted ( ix*salto, iy*salto );
+ endfor;
+ endfor;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/optica.mp b/graphics/metapost/contrib/macros/featpost/example/optica.mp
new file mode 100644
index 0000000000..1da10517f8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/optica.mp
@@ -0,0 +1,206 @@
+% optica.mp
+% P. J. Sebastiao
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex \documentclass{article} \usepackage{beton} \usepackage{concmath} \usepackage{ccfonts} \begin{document} etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color field, nalfa, ngamma[], alfacnt, gammacnt, nazy, nax, proj, align;
+ path alfa, gamma;
+ numeric nalfad, theta, radius, gammang, xxsize, yysize, zzsize;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos,angrecto;
+ numeric thetarad, thetapos, nalfapos, ngammapos,veccpos,betarad,betapos;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, deltalabel, xxcalabel,yycalabel,aMlabel;
+ picture nalfalabel, ngammalabel, etalphalabel, alphalabel;
+ picture gammalabel, thetalabel,vecclabel,betalabel;
+
+ f := (3,4,2);
+ nbeta := 1.3;
+ beta := 12;
+ betarad := 0.6;
+ betapos := 1;
+ deltarad := 0.8;
+ deltapos := 2;
+ nalfad := 1.0;
+ theta := 15;
+ delta := 35;
+ thetarad := 0.3;
+ thetapos := 2;
+ nalfapos := 1;
+ gammang := 60;
+ ngammapos := 7;
+ etalpharad := 0.6;
+ etalphapos := 2;
+ alphapos := 2;
+ alpharad := 0.9;
+ gammapos := 4;
+ Spread := 100;
+ xxsize := 0.8;
+ xxpos := 6;
+ yysize := 1.3;
+ yypos := 6;
+ zzsize := 1.3;
+ zzpos := 4;
+% angrecto := 0.2;
+
+ xxcalabel = btex $x_{\mbox{\protect \scriptsize }}$ etex;
+ yycalabel = btex $y_{\mbox{\protect \scriptsize }}$ etex;
+ xxlabel = btex $\mbox{\protect \scriptsize ligth}$ etex;
+ yylabel = btex $\mbox{\protect \scriptsize analyser}$ etex;
+ zzlabel = btex $\mbox{\protect \scriptsize polariser}$ etex;
+ deltalabel = btex $\Delta$ etex;
+ aMlabel = btex $\bar{\alpha}$ etex;
+ fieldlabel = btex $\mathbf{B}$ etex;
+ thetalabel = btex $\Delta$ etex;
+ betalabel = btex $\xi$ etex;
+ nalfalabel = btex $\mathbf{n}_a$ etex;
+ ngammalabel = btex $\mathbf{n}_\gamma$ etex;
+ etalphalabel= btex $\theta$ etex;
+ alphalabel = btex $\alpha$ etex;
+ gammalabel = btex $\gamma$ etex;
+ vecclabel = btex $\mathbf{c}$ etex;
+ veccpos = 3;
+ field = (0.7,0,0);
+ fieldpos = 2;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,nbeta*cosd(beta)*sind(delta),nbeta*cosd(beta)*cosd(delta));
+ alfacnt = nalfa;
+ radius = nbeta*sind(beta);
+ alfa = rigorouscircle( alfacnt, (0,0,1), radius );
+ gammacnt = nalfa;
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+
+ for i=0 step 40 until 0:
+ nazy := radius*sind(gammang+i)*ncrossprod( nalfa, axxc );
+ nax := radius*cosd(gammang+i)*ncrossprod( ayyc, nalfa );
+ ngamma[i] := gammacnt+nax+nazy;
+ pickup pencircle scaled 1.5;
+ drawarrow rp(orig)..rp(ngamma[i]);
+ endfor;
+ pickup pencircle scaled 0.5;
+
+% draw alfa dashed evenly;
+ align = 1*(0,+sind(10),cosd(10));
+ draw rp(orig)..rp(align);
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+% draw rp(orig)..rp(-axxc);
+ drawarrow rp(orig)..rp(azzc);
+% drawarrow rp(orig)..rp(field);
+ draw rp(orig)..rp(nalfa);
+% draw subpath (3.05,1.05) of alfa;
+% drawarrow subpath (4,3) of alfa;
+% draw subpath (0,1.3) of gamma;
+% draw subpath (7.5,8) of gamma;
+% drawarrow subpath (1,2) of gamma;
+% anglinen( field, azzc, orig, deltarad, deltalabel, deltapos );
+ anglinen( ngamma0, nalfa, orig, betarad, betalabel, betapos );
+ anglinen( azzc, align, orig, deltarad, deltalabel, deltapos );
+ anglinen( align, nalfa, orig, deltarad, aMlabel, deltapos );
+% anglinen( ngamma0, field, orig, etalpharad, etalphalabel, etalphapos );
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+% labeln( fieldlabel, rp(field), fieldpos );
+% labeln( nalfalabel, rp(nalfa), nalfapos );
+ labeln( ngammalabel, rp(ngamma0), ngammapos );
+% labeln( alphalabel, point 1.8 of alfa, alphapos );
+ labeln( gammalabel, point 2.1 of gamma, gammapos );
+% labeln( xxcalabel, rp(gammacnt+1.3*radius*(1,0,0)), 1);
+% labeln( yycalabel, rp(gammacnt+1.3*radius*(0,1,-sind(theta))), 2);
+ pickup pencircle scaled 0.5;
+ draw rp((0,0,0))..rp(alfacnt);
+ draw rp(gammacnt);
+ pickup pencircle scaled 0.5;
+
+ path arco, recta_um, recta_quatro, recta_dois, recta_ylayer, recta_xlayer, path_ngamma, recta_tres;
+ color tmp, tmpo;
+ pickup pencircle scaled 0.5;
+ tmp = gammacnt+radius*(0,-cosd(delta),sind(delta));
+ tmpo = gammacnt+radius*(0,cosd(delta),-sind(delta));
+ recta_um = rp(tmpo)--rp(gammacnt)--rp(tmp)--rp((0,0,Z(tmp)));
+ draw recta_um;
+
+% align = (0,Z(tmp)*sind(10),Z(tmp));
+ drawarrow rp(orig)--rp((0,Z(tmp)*sind(10),Z(tmp)));
+ labeln( btex $\mbox{\protect \scriptsize rubbing}$ etex, rp((0,Z(tmp)*sind(10),Z(tmp))), 1 );
+
+
+ angrecto=nbeta*cosd(beta);
+ recta_quatro = rp((0,angrecto*sind(delta),angrecto*cosd(delta)))--rp((0,angrecto*sind(delta),0));
+% recta_tres = rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),angrecto*cosd(delta)))--rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),0));
+ recta_tres = rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),angrecto*cosd(delta)-radius*sind(gammang)*sind(delta)))--rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),0));
+
+% recta_dois = rp(angrecto*cosd(delta)*(0,0,1))--rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),angrecto*cosd(delta)));
+% recta_dois = rp(gammacnt)--rp((0,angrecto*sind(delta)+radius*sind(gammang)*cosd(delta),angrecto*cosd(delta)));
+ recta_dois = rp(gammacnt)--rp((0,nbeta*cosd(beta)*sind(delta),0));
+% draw recta_dois;
+ draw recta_tres;
+% draw recta_quatro;
+
+ pickup pencircle scaled 1;
+ arco = (alfa cutbefore recta_dois) cutafter recta_um;
+% draw arco;
+
+
+ pickup pencircle scaled 0.5;
+ drawarrow rp(gammacnt)--rp(gammacnt+1.3*radius*(1,0,0));
+
+% path_ngamma = rp(gammacnt)--rp(ngamma0);
+ path_ngamma = rp(gammacnt)--rp(ngamma0)--rp((0,0,0));
+ draw path_ngamma;
+%%% c vector
+% drawarrow rp(gammacnt)--rp(ngamma0);
+
+ recta_xlayer = rp(gammacnt)--rp(gammacnt+1.3*radius*(1,0,0));
+% recta_xlayer = rp(gammacnt)--rp(gammacnt+1.3*radius*(0,1,-sind(theta)));
+ drawarrow recta_xlayer;
+
+
+% recta_ylayer = rp(gammacnt)--rp(gammacnt+1.3*radius*(0,1,-sind(theta)));
+% drawarrow recta_ylayer;
+
+ proj = gammacnt+radius*sind(gammang)*(0,cosd(delta),-sind(delta));
+ recta_ylayer = rp(gammacnt)--rp(proj);
+ draw recta_ylayer;
+ draw rp(ngamma0)..rp(proj);
+ draw rp(orig)..rp(proj);
+ draw rp(ngamma0)..rp(1.1*etalpharad*(1,0,0)+proj);
+ draw rp(1.1*etalpharad*(1,0,0)+proj)..rp(1.1*etalpharad*(1,0,0));
+% draw rp(radius*cosd(gammang)*(1,0,0))..rp(ngamma0);
+ anglinen( proj, nalfa, orig, alpharad, alphalabel, alphapos );
+
+ pickup pencircle scaled 1;
+
+ arco := (gamma cutbefore recta_xlayer) cutafter path_ngamma;
+ draw gamma;
+% draw arco;
+ undraw arco;
+ arco := (gamma cutbefore recta_ylayer) cutafter path_ngamma;
+% draw gamma;
+% draw arco;
+ undraw arco;
+
+ pickup pencircle scaled 0.5;
+ draw gamma dashed evenly;
+
+% draw subpath (0,0.9) of gamma;
+% draw subpath (7.6,8) of gamma;
+% draw subpath (1.5,8) of gamma;
+% draw subpath (3.2,1.2) of alfa;
+% labeln( vecclabel, rp(ngamma0), veccpos);
+ anglinen( ngamma0, field, orig, etalpharad, etalphalabel, etalphapos );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/par3Dplotexamples.mp b/graphics/metapost/contrib/macros/featpost/example/par3Dplotexamples.mp
new file mode 100644
index 0000000000..2b19101896
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/par3Dplotexamples.mp
@@ -0,0 +1,151 @@
+% J. Schwaiger with help of
+% FEATPOST and the macropackages
+% la3Dmacros.mp and hlr3Dmacros.mp
+% by L. Nobre G.
+% 2003
+
+% Figure (2) retouched in 2004 by L. Nobre G.
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass[a4paper,12pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
+\usepackage{euler}
+\usepackage{graphicx}
+\begin{document}
+etex
+
+% for trigonometric functions when angles are measured in rad
+%
+ def sinrad( expr t)=sind(t/3.145*180) enddef;
+ def cosrad( expr t)=cosd(t/3.145*180) enddef;
+
+ def parsurface( expr tc,sc )=
+ (%
+ (4 cosrad(tc) - sinrad(sc)*cosrad(tc),%
+ 4 sinrad(tc) - sinrad(sc)*sinrad(tc),%
+ cosrad(sc))%
+ )% A torus
+ enddef;
+
+ def parsurfacetwo( expr tc,sc )=
+ (%
+ (4+4cosrad(tc) - sinrad(sc)*cosrad(tc),%
+ cosrad(sc),
+ 4sinrad(tc) - sinrad(sc)*sinrad(tc)%
+ )%
+ )% Another torus
+ enddef;
+
+ def parsurfacethree( expr tc,sc )=
+% 0<=sc<=2pi,-2<=tc<=2
+%xmin=-1.4, xmax=1.4
+%ymin=-0.7, ymax=2
+%zmin=-2.5,zmax=2.5
+ (%
+ (1.414213562*cosrad(sc)*cosrad(tc)
+ -2*sinrad(sc)*sinrad(tc))/(2*(abs(tc) + 1)) + sinrad(tc),%
+ cosrad(tc) - (1.414213562*cosrad(sc)*sinrad(tc)
+ + 2*sinrad(sc)*cosrad(tc))/(2*(abs(tc) + 1)),%
+ tc - 2*cosrad(sc)/(2*(abs(tc) + 1))
+ )%
+% A space tube governed by a helix
+ enddef;
+
+def zsurface( expr xc, yc ) =
+ ( xc, yc, cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4) )
+enddef;
+
+f:=(8,1.5,1.5);
+Spread := 127;
+
+
+beginfig(1);
+ numeric Ns, Nt, lows, higs, lowt, higt, lowx, highx, lowy, highy,
+ facz, lowz, higz, base, topo;
+ path chair;
+ % for torus
+ f:=(4,1.5,1.5);
+ Spread:=150;
+ Ns = 16;
+ Nt= 16;
+ lows := 3.145*0.25;
+ higs := 3.145*1.75;
+ lowt = -3.145;
+ higt = 3.145;
+ facz=1;
+ lowz = -5;
+ higz = 5;
+ lowx:=-5;
+ lowy:=-5;
+ higx:=10;
+ higy:=7;
+%
+ NF:=0; %Initialize number of faces;
+%
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurfacetwo );
+ lows := 3.145*0.5;
+ higs := 2.25*3.145; % new parameters and new surface
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurface );
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ draw_invisible( false,true,(blue+0.5green),0.6white);
+ draw bbox currentpicture;
+endfig;
+
+beginfig(2);
+ numeric Ns, Nt, lows, higs, lowt, higt, lowx, highx, lowy, highy,
+ facz, lowz, higz, base, topo;
+ path chair;
+
+ f := (6,0.5,3);
+ Spread:=150;
+
+ Ns = 19;
+ Nt= 19;
+ lows := -3.145;
+ higs := 3.145;
+ lowt = -3.145;
+ higt = 3.145;
+ facz = 2;
+ lowz = -2;
+ higz = 2;
+ lowx:=-5;
+ lowy:=-5;
+ higx:=5;
+ higy:=5;
+ NF:=0; %Initialize number of faces;
+%
+ partrimesh( Ns,Nt,lowt,higt,lows,higs,
+ lowx,higx,lowy,higy,lowz,higz,facz,parsurface );
+
+ nx := 27;
+ lowy := -7;
+ higy := 7;
+ lowx := -7;
+ higx := 7;
+ facz := 2;
+ lowz := -1;
+ higz := 5;
+ partrimesh( nx,nx,lowx,higx,lowy,higy,
+ lowx,higx,lowy,higy,lowz,higz,facz,zsurface);
+ base = -1/facz;
+ topo = 1/facz;
+ chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
+ --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
+ --rp((-1,1,topo))--rp((-1,1,base))--cycle;
+ fill chair withcolor 0.9 blue+0.6white;
+ draw chair withcolor 0.1white ;
+ draw_invisible( false,false,(red+0.32blue),0.6white);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/parabolaonthestage.mp b/graphics/metapost/contrib/macros/featpost/example/parabolaonthestage.mp
new file mode 100644
index 0000000000..3b81e58777
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/parabolaonthestage.mp
@@ -0,0 +1,17 @@
+% parabolaonthestage.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+Spread := 30;
+f := (5,3,2);
+beginfig(1);
+ numeric i, li;
+ li = 50;
+ setthestage( 18, 10 );
+ draw for i=-li step 0.25 until li-0.25:
+ rp((5-(i**2),i,0))...
+ endfor rp((5-(li**2),li,0)) withcolor blue withpen pencircle scaled 3pt;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/parafuso.mp b/graphics/metapost/contrib/macros/featpost/example/parafuso.mp
new file mode 100644
index 0000000000..25030d3340
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/parafuso.mp
@@ -0,0 +1,140 @@
+% parafuso.mp
+% L. Nobre G.
+% 2005
+
+input featpost3Dplus2D;
+
+def theline( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param;
+ par0 = 0;
+ par1 = 6*360;
+ par2 = 0.3;
+ par3 = 850;
+ param = par0+TheVal*(par1-par0);
+ cred = -par2*cosd( param );
+ cblu = par2*sind( param );
+ cgre = param/par3;
+ ( (cred,cgre,cblu) )
+ endgroup
+enddef;
+
+def thexyline( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, param;
+ par0 = 0;
+ par1 = 6*360;
+ par2 = 0.3;
+ par3 = 850;
+ param = par0+TheVal*(par1-par0);
+ cred = -par2*cosd( param );
+ cgre = param/par3;
+ ( (cred,cgre,0) )
+ endgroup
+enddef;
+
+def loxodrome( expr TheVal ) =
+ begingroup
+ numeric cred, cgre, cblu, alpha, theta, ratio, radio;
+ ratio = 22;
+ radio = 2;
+ theta = ratio*180*TheVal;
+ alpha = 170*TheVal-85;
+ cred = radio*cosd(theta)*cosd(alpha);
+ cgre = radio*sind(theta)*cosd(alpha);
+ cblu = radio*sind(alpha);
+ ( (cred,cgre,cblu) )
+ endgroup
+enddef;
+
+f := (2,4,1.8);
+Spread := 77;
+ShadowOn := false;
+
+beginfig(1);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 1.95;
+ label.rt( "A", rp( xend ) );
+ label.lft( "B", rp( yend ) );
+ emptyline( false, 1, black, 0.5background, 1000, 0.82, 2, theline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "C", rp( zend ) );
+endfig;
+
+beginfig(2);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 0.65;
+ label.rt( "X", rp( xend ) );
+ label.lft( "Y", rp( yend ) );
+ closedline( false, 70, 0.5, 0.95, theline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "Z", rp( zend ) );
+ doitnow;
+endfig;
+
+f := (2,4,2.8);
+beginfig(3);
+ NCL := 0;
+ Nobjects := 0;
+ closedline( false, 270, 0.5, 0.85, loxodrome );
+ doitnow;
+endfig;
+
+beginfig(4);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 0.65;
+ label.rt( "X", rp( xend ) );
+ label.lft( "Y", rp( yend ) );
+ closedline( false, 70, 0.5, 0.95, thexyline );
+ closedline( false, 70, 0.5, 0.95, theline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "Z", rp( zend ) );
+ doitnow;
+endfig;
+
+end;
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/parafusoprojxy.mp b/graphics/metapost/contrib/macros/featpost/example/parafusoprojxy.mp
new file mode 100644
index 0000000000..e43c296667
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/parafusoprojxy.mp
@@ -0,0 +1,64 @@
+% parafusoprojxy.mp
+% L. Nobre G.
+% 2009
+
+input featpost3Dplus2D;
+
+def theline( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, cblu, param;
+ par0 = 0;
+ par1 = 6*360;
+ par2 = 0.3;
+ par3 = 850;
+ param = par0+TheVal*(par1-par0);
+ cred = -par2*cosd( param );
+ cblu = par2*sind( param );
+ cgre = param/par3;
+ ( (cred,cgre,cblu) )
+ endgroup
+enddef;
+
+def thexyline( expr TheVal ) =
+ begingroup
+ numeric par[], cred, cgre, param;
+ par0 = 0;
+ par1 = 6*360;
+ par2 = 0.3;
+ par3 = 850;
+ param = par0+TheVal*(par1-par0);
+ cred = -par2*cosd( param );
+ cgre = param/par3;
+ ( (cred,cgre,0) )
+ endgroup
+enddef;
+
+f := (3,5,15);
+beginfig(1);
+ numeric axsize, zaxpos, zaxlen;
+ color xbeg, xend, ybeg, yend, zbeg, zend;
+ axsize = 0.85;
+ zaxpos = 0.55;
+ zaxlen = 2.1;
+ pickup pencircle scaled 1.5pt;
+ xbeg = (axsize,0,0);
+ xend = (-axsize,0,0);
+ ybeg = (0,0,-axsize);
+ yend = (0,0,axsize);
+ zbeg = (zaxpos,-zaxpos,0);
+ zend = (zaxpos,zaxlen,0);
+ drawarrow rp( xbeg )--rp( xend );
+ drawarrow rp( ybeg )--rp( yend );
+% defaultfont := "putr8r";
+ defaultscale := 0.65;
+ label.rt( "X", rp( xend ) );
+ label.lft( "Y", rp( yend ) );
+ emptyline( false, 1, black, 0.7background, 700, 0.8, 2, thexyline );
+ drawarrow rp( zbeg )--rp( zend );
+ label.bot( "Z", rp( zend ) );
+endfig;
+
+end;
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/pathernon.mp b/graphics/metapost/contrib/macros/featpost/example/pathernon.mp
new file mode 100644
index 0000000000..002adab6e7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/pathernon.mp
@@ -0,0 +1,67 @@
+% pathernon.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+beginfig(0);
+ f := (4.8,3,3.65);
+ viewcentr := black;
+ Spread := 50;
+ horiZon := 0;
+ ShadowOn := false;
+ LightSource := (1,-1,7);
+ SphericalDistortion := true;
+ OverRidePolyhedricColor := true;
+ numeric side, coluheight, blocheight, roofheight, coluray, fact;
+ numeric acroside, acronum, auxa, raya, rayb , poshemi, lena, lenb;
+ color roofcenter, ba, bb, bc, bd, coluvec, colucen, auxb, auxc, auxd;
+ side = 1;
+ roofheight = 0.1;
+ coluheight = 0.7;
+ acroside = 4;
+ acronum = 20;
+ coluray = 0.06;
+ blocheight = 0.1;
+ poshemi = 0.25*side;
+ raya = 0.08;
+ rayb = 0.12;
+ lena = 0.13;
+ lenb = 0.26;
+ fact = 1.3;
+ auxa = 0.5*side-coluray;
+ coluvec = blue*coluheight;
+ colucen = 0.5*coluvec;
+ auxc = (0,-poshemi,0);
+ auxd = (0,-poshemi,raya+rayb);
+ setthestage( acronum, acroside );
+ V1 := (0.5*side,-0.5*side,coluheight+blocheight);
+ V2 := (0.5*side,0.5*side,coluheight+blocheight);
+ V3 := (-0.5*side,0.5*side,coluheight+blocheight);
+ V4 := (-0.5*side,-0.5*side,coluheight+blocheight);
+ V5 := (0,-0.5*side,coluheight+roofheight+blocheight);
+ V6 := (0,0.5*side,coluheight+roofheight+blocheight);
+ makeface1(1,4,5);
+ makeface2(1,2,6,5);
+ makeface3(2,3,6);
+ makeface4(3,4,5,6);
+ ba = (auxa,-auxa,0);
+ bb = (auxa,auxa,0);
+ bc = (-auxa,auxa,0);
+ bd = (-auxa,-auxa,0);
+ roofcenter = (V1+V2+V3+V4+V5+V6)/6;
+ auxb = roofcenter-blue*blocheight;
+ V7 := (-0.5*side,-0.5*side,coluheight);
+ getready( "draw_invisible( false, false, white, black )", roofcenter );
+ getready( "rigorousdisc( 0, true, ba, coluray, coluvec )", ba+colucen);
+ getready( "rigorousdisc( 0, true, bb, coluray, coluvec )", bb+colucen);
+ getready( "rigorousdisc( 0, true, bc, coluray, coluvec )", bc+colucen);
+ getready( "rigorousdisc( 0, true, bd, coluray, coluvec )", bd+colucen);
+ getready("kindofcube(false,true,V7,0,0,0,side,side,blocheight)",auxb);
+ getready( "whatisthis(auxc,lenb*red,lena*green,raya,fact)", auxc );
+ getready( "spatialhalfsfear( auxd, blue, rayb )", auxd );
+ doitnow;
+ produce_vga_border;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/pathofstraightline.mp b/graphics/metapost/contrib/macros/featpost/example/pathofstraightline.mp
new file mode 100644
index 0000000000..a921fd06f4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/pathofstraightline.mp
@@ -0,0 +1,29 @@
+% pathofstraightline.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+SphericalDistortion := true;
+Spread := 100;
+f := 0.4*(1.5,0.5,1);
+
+beginfig(1);
+ numeric gridstep, sidenumber, i, coord;
+ color pa, pb, pc, pd;
+ gridstep = 0.1;
+ sidenumber = 10;
+ coord = 0.5*sidenumber*gridstep;
+ for i=0 upto sidenumber:
+ pa := (-coord,-coord+i*gridstep,0);
+ pb := (coord,-coord+i*gridstep,0);
+ pc := (-coord+i*gridstep,-coord,0);
+ pd := (-coord+i*gridstep,coord,0);
+ draw pathofstraightline( pa, pb );
+ draw pathofstraightline( pc, pd );
+ endfor;
+endfig;
+
+end.
+
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/perspec.mp b/graphics/metapost/contrib/macros/featpost/example/perspec.mp
new file mode 100644
index 0000000000..be1402884b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/perspec.mp
@@ -0,0 +1,76 @@
+% perspec.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (4,2,2.5);
+Spread := 45;
+
+verbatimtex \documentclass{article} \begin{document} etex
+
+color psdf, psdu, psdv, rll, rlr, rur, rul, pll, plr, pur, pul;
+color pc;
+numeric projecplanesize, sizefraction, positfraction, aspectratio, rectsize;
+pen realpen, lightpen, projpen, dotpen;
+path projecplanepath, realpath;
+psdf = 3.1*(0,1,0.37);
+projecplanesize = 1.7;
+sizefraction = 0.19;
+positfraction = 0.65;
+aspectratio = 1.0;
+rectsize = 0.15;
+realpen = pencircle scaled 2.6pt;
+lightpen = pencircle scaled 0.55pt;
+projpen = pencircle scaled 1.8pt;
+dotpen = pencircle scaled 3.8pt;
+psdv = N( (-Y(psdf), X(psdf), 0) );
+psdu = ncrossprod( psdf, psdv );
+pll = projecplanesize*(-aspectratio*psdv-psdu);
+plr = projecplanesize*(+aspectratio*psdv-psdu);
+pur = projecplanesize*(+aspectratio*psdv+psdu);
+pul = projecplanesize*(-aspectratio*psdv+psdu);
+projecplanepath = rp(pll)--rp(plr)--rp(pur)--rp(pul)--cycle;
+pc = positfraction*psdf;
+rll = pc+sizefraction*projecplanesize*(-psdv-psdu);
+rlr = pc+sizefraction*projecplanesize*(+psdv-psdu);
+rur = pc+sizefraction*projecplanesize*(+psdv+psdu);
+rul = pc+sizefraction*projecplanesize*(-psdv+psdu);
+realpath = rp(rll)--rp(rlr)--rp(rur)--rp(rul)--cycle;
+
+beginfig(1);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ LightSource:=psdf;
+ prll = rp(projectpoint(black,rll));
+ prlr = rp(projectpoint(black,rlr));
+ prur = rp(projectpoint(black,rur));
+ prul = rp(projectpoint(black,rul));
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(psdf) withpen lightpen;
+ draw prlr--rp(psdf) withpen lightpen;
+ draw prur--rp(psdf) withpen lightpen;
+ draw prul--rp(psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex \texttt{f} etex, rp(psdf) );
+ label.bot( btex \texttt{viewcentr} etex, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/photorefer.mp b/graphics/metapost/contrib/macros/featpost/example/photorefer.mp
new file mode 100644
index 0000000000..9a96b24c41
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/photorefer.mp
@@ -0,0 +1,198 @@
+% photorefer.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+%\usepackage{beton,concmath,ccfonts}
+
+verbatimtex \documentclass{article} \begin{document} etex
+
+f := ( 6, 5, 2.5 );
+Spread := 160;
+
+beginfig(2);
+ color a, x, b, c, D, y, w, g, h;
+ color auxa, auxb, auxc, auxd, auxe, auxf, azz, azy, bzz, bzy;
+ pair appear, rpc, rpch, rpcv;
+ numeric wid, hei, alfa, beta, forw, back, labscal, framang, lx, ly, verscal;
+ pen thedotpen, borderpen, normalpen;
+ picture dasha, dashb, labx, laba, labb, labc, labD, labh, labv;
+ path outerb, innerb, apath, bpath;
+ framang = 0;
+ alfa = 0;
+ beta = 0;
+% framang = -15;
+% alfa = -20;
+% beta = -15;
+
+ wid = 1.5;
+ hei = 1;
+ forw = 1.5;
+ back = 1.5;
+ lx = 1.15;
+ ly = 0.4;
+ verscal = 0.47;
+ labscal = 2.8;
+ labeloffset := 8pt;
+ ahangle := 30;
+ ahlength := 10pt;
+ b = ( -0.8*back, 0.25*wid, 0.9*hei );
+ c = ( 0, 0.85*wid, 0.35*hei );
+ D = ( cosd( alfa )*cosd( beta ), sind( alfa )*cosd( beta ), sind( beta ) );
+ a = c+0.95*D;
+% a = c+0.7*D;
+ labx = btex $\vec{p}$ etex scaled labscal;
+ laba = btex $\vec{f}$ etex scaled labscal;
+ labb = btex $\vec{R}$ etex scaled labscal;
+ labc = btex $\vec{o}$ etex scaled labscal;
+ labh = btex $\hat{h}$ etex scaled labscal;
+ labv = btex $\hat{v}$ etex scaled labscal;
+ thedotpen = pencircle scaled 4pt;
+ borderpen = pencircle scaled 2pt;
+ normalpen = pencircle scaled 1.5pt;
+ dasha = evenly scaled 2;
+% dashb = dashpattern( on 7pt off 5pt on 7pt );
+ dashb = withdots;
+ azz = (X(a),Y(a),0);
+ azy = (X(a),0,Z(a));
+ bzz = (X(b),Y(b),0);
+ bzy = (X(b),0,Z(b));
+ apath = rp(azz)--rp(a)--rp(azy);
+ bpath = rp(bzz)--rp(b)--rp(bzy);
+ auxa = ( forw, 0, 0 );
+ auxb = ( forw, 0, hei );
+ auxc = ( -back, 0, hei );
+ auxd = ( -back, 0, 0 );
+ auxe = ( -back, wid, 0 );
+ auxf = ( forw, wid, 0 );
+ outerb = rp(auxa)--rp(auxb)--rp(auxc)--rp(auxd)--rp(auxe)--rp(auxf)--cycle;
+ draw outerb withpen borderpen;
+ draw rp(auxa)--rp(auxd) withpen borderpen;
+
+ draw bpath dashed dasha withpen normalpen;
+ draw rp(b) withpen thedotpen;
+ label.rt( labb, rp(b) );
+
+ draw rp(a)--rp(b) withpen normalpen;
+
+ cdotprod( y-c, D ) = 0;
+ cdotprod( y-black, green ) = 0;
+ cdotprod( y-black, blue ) = 0;
+
+ cdotprod( w-c, D ) = 0;
+ cdotprod( w-black, green ) = 0;
+ cdotprod( w-hei*blue, blue ) = 0;
+
+ cdotprod( g-c, D ) = 0;
+ cdotprod( g-wid*green, green ) = 0;
+ cdotprod( g-hei*blue, blue ) = 0;
+
+ cdotprod( h-c, D ) = 0;
+ cdotprod( h-wid*green, green ) = 0;
+ cdotprod( h-black, blue ) = 0;
+
+ innerb = rp(y)--rp(w)--rp(g)--rp(h)--cycle;
+ unfill innerb;
+ draw innerb withpen borderpen;
+
+ draw apath dashed dasha withpen normalpen;
+ draw rp(a) withpen thedotpen;
+ label.llft( laba, rp(a) );
+
+ x = whatever[a,b];
+ cdotprod( x-c, D ) = 0;
+ draw rp(x) withpen thedotpen;
+ label.lft( labx, rp(x) );
+
+ draw rp(a)--rp(x) withpen normalpen;
+ draw rp(x)--rp(b) withpen normalpen dashed dashb;
+
+ draw rp(c) withpen thedotpen;
+ draw rp(a)--rp(c) withpen borderpen;
+ label.bot( labc, rp(c) );
+
+ numeric theang;
+ color perpo, perpa, perph, perpv;
+ perpo = N( x-c );
+ perpa = ncrossprod( D, c-x );
+ theang = -getangle( w-y, perpa );
+ perph = perpo*cosd( framang+theang ) + perpa*sind( framang+theang );
+ perpv =-perpo*sind( framang+theang ) + perpa*cosd( framang+theang );
+ color corn, corm;
+ numeric coox, cooy;
+ coox = cdotprod( x-c, perph );
+ cooy = cdotprod( x-c, perpv );
+ draw rp(c)--rp(c+lx*perph)--rp(c+lx*perph+ly*perpv)
+ --rp(c+ly*perpv)--cycle dashed evenly;
+ draw rp(c)--rp(c+coox*perph)--rp(c+coox*perph+cooy*perpv)
+ --rp(c+cooy*perpv)--cycle dashed evenly;
+ rpc = rp(c);
+ rpch = rp(c+verscal*perph);
+ rpcv = rp(c+verscal*perpv);
+ drawarrow rpc--rpch withpen normalpen;
+ drawarrow rpc--rpcv withpen normalpen;
+ label.rt( labv, rpcv );
+% label.top( labh, rpch );
+ label.lrt( labh, rpch );
+endfig;
+
+f := ( 5, 3, 1 );
+Spread := 70;
+
+beginfig(1);
+ labeloffset := 3pt;
+ ahangle := 30;
+ ahlength := 5pt;
+ numeric alpha, beta, gamma, axeslen, blen, angray;
+ alpha = 65;
+ beta = 70;
+ gamma = 75;
+ blen = 1.4;
+ axeslen = 1.2;
+ angray = 0.4;
+ orthaxes( axeslen, btex $E$ etex, axeslen, btex $N$ etex, axeslen, btex $Z$ etex );
+ path vo, vh, vv, vhp, vop;
+ z0 = rp( black );
+ color po, ph, pv, php, pop;
+ pop = ( cosd(alpha), sind(alpha), 0 );
+ po = blen*( cosd(beta)*pop + sind(beta)*blue );
+ php = ( sind(alpha), -cosd(alpha), 0 );
+ numeric hx, hy, hv, vx, vy, vz;
+ hx = sind(alpha)*cosd(gamma)-sind(beta)*cosd(alpha)*sind(gamma);
+ hy =-cosd(alpha)*cosd(gamma)-sind(beta)*sind(alpha)*sind(gamma);
+ hz = cosd(beta)*sind(gamma);
+ vx =-sind(alpha)*sind(gamma)-sind(beta)*cosd(alpha)*cosd(gamma);
+ vy = cosd(alpha)*sind(gamma)-sind(beta)*sind(alpha)*cosd(gamma);
+ vz = cosd(beta)*cosd(gamma);
+ ph = ( hx, hy, hz );
+ pv = ( vx, vy, vz );
+ z1 = rp( po );
+ z2 = rp( ph );
+ z3 = rp( pv );
+ z4 = rp( php );
+ z5 = rp( pop );
+ vo = z0--z1;
+ vh = z0--z2;
+ vv = z0--z3;
+ vhp = z0--z4;
+ vop = z0--z5;
+ drawarrow vo;
+ drawarrow vh;
+ drawarrow vv;
+ draw vhp dashed evenly;
+ draw vop dashed evenly;
+ squareangline( ph, pv, black, 0.1 );
+ angline( pop, po, black, angray, btex $\beta$ etex, rt );
+ angline( php, ph, black, angray, btex $\gamma$ etex, lft );
+ angline( red, pop, black, angray, btex $\alpha$ etex, bot );
+ label.top( btex $\vec{f}-\vec{o}$ etex, z1 );
+ label.top( btex $\hat{h}$ etex, z2 );
+ label.top( btex $\hat{v}$ etex, z3 );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/photoreverse.mp b/graphics/metapost/contrib/macros/featpost/example/photoreverse.mp
new file mode 100644
index 0000000000..60819ecbcc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/photoreverse.mp
@@ -0,0 +1,242 @@
+% photoreverse.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% MetaPost source tuned by PstoeditMpostPreeditor (lex scanner)
+% and edited by L. Nobre G. <nobre@lince.cii.fc.ul.pt>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+beginfig(1);
+ path PreeditedPath[];
+ linecap := butt;
+ linejoin := mitered;
+ PreeditedPath1 = hide(z1=(267.637,309.195))z1..controls hide(z2=(265.005,308.373))z2 and hide(z3=(262.069,307.351))z3..hide(z4=(261.056,306.906))z4
+ ..controls hide(z5=(260.051,306.463))z5 and hide(z6=(257.254,305.728))z6..hide(z7=(254.841,305.272))z7
+ ..controls hide(z8=(250.692,304.488))z8 and hide(z9=(204.457,292.788))z9..hide(z10=(182.447,286.951))z10
+ ..controls hide(z11=(176.816,285.458))z11 and hide(z12=(168.096,283.167))z12..hide(z13=(163.069,281.859))z13
+ ..controls hide(z14=(151.222,278.777))z14 and hide(z15=(141.515,276.205))z15..hide(z16=(134.184,274.205))z16
+ ..controls hide(z17=(130.967,273.328))z17 and hide(z18=(125.044,271.795))z18..hide(z19=(121.022,270.8))z19
+ ..controls hide(z20=(112.027,268.574))z20 and hide(z21=(85.2788,261.351))z21..hide(z22=(82.2654,260.334))z22
+ ..controls hide(z23=(81.0576,259.926))z23 and hide(z24=(74.8799,258.292))z24..hide(z25=(68.5181,256.697))z25
+ ..controls hide(z26=(53.8198,253.011))z26 and hide(z27=(54.844,253.994))z27..hide(z28=(56.676,245.334))z28
+ ..controls hide(z29=(57.3293,242.246))z29 and hide(z30=(56.3792,241.622))z30..hide(z31=(47.3118,239.178))z31
+ ..controls hide(z32=(35.9773,236.124))z32 and hide(z33=(35.1968,235.536))z33..hide(z34=(38.4636,232.521))z34
+ ..controls hide(z35=(40.325,230.802))z35 and hide(z36=(46.4053,219.375))z36..hide(z37=(48.1816,214.256))z37
+ ..controls hide(z38=(50.9392,206.31))z38 and hide(z39=(75.4822,148.371))z39..hide(z40=(81.2634,136.159))z40
+ ..controls hide(z41=(83.6174,131.186))z41 and hide(z42=(85.5562,126.827))z42..hide(z43=(85.5562,126.506))z43
+ ..controls hide(z44=(85.5562,124.811))z44 and hide(z45=(87.6768,124.222))z45..hide(z46=(90.6018,125.105))z46
+ ..controls hide(z47=(94.1848,126.187))z47 and hide(z48=(94.4399,127.076))z48..hide(z49=(91.2598,127.398))z49
+ ..controls hide(z50=(86.803,127.85))z50 and hide(z51=(81.7302,144.202))z51..hide(z52=(66.9248,205.847))z52
+ ..controls hide(z53=(57.2651,246.065))z53 and hide(z54=(57.3979,243.248))z54..hide(z55=(65.0811,244.906))z55
+ ..controls hide(z56=(67.3086,245.386))z56 and hide(z57=(71.2236,246.393))z57..hide(z58=(73.8562,247.162))z58
+ ..controls hide(z59=(76.4578,247.923))z59 and hide(z60=(81.7537,249.412))z60..hide(z61=(85.5562,250.453))z61
+ ..controls hide(z62=(89.3586,251.494))z62 and hide(z63=(93.6614,252.702))z63..hide(z64=(95.0623,253.122))z64
+ ..controls hide(z65=(96.4841,253.549))z65 and hide(z66=(99.0842,254.15))z66..hide(z67=(100.912,254.475))z67
+ ..controls hide(z68=(102.711,254.795))z68 and hide(z69=(106.689,255.777))z69..hide(z70=(109.687,256.642))z70
+ ..controls hide(z71=(115.705,258.378))z71 and hide(z72=(115.391,258.29))z72..hide(z73=(129.431,262.147))z73
+ ..controls hide(z74=(134.842,263.633))z74 and hide(z75=(139.964,265.139))z75..hide(z76=(140.765,265.48))z76
+ ..controls hide(z77=(141.57,265.822))z77 and hide(z78=(145.519,266.957))z78..hide(z79=(149.541,268.003))z79
+ ..controls hide(z80=(153.562,269.049))z80 and hide(z81=(158.005,270.236))z81..hide(z82=(159.412,270.641))z82
+ ..controls hide(z83=(164.668,272.153))z83 and hide(z84=(171.332,273.79))z84..hide(z85=(180.984,275.938))z85
+ ..controls hide(z86=(185.445,276.931))z86 and hide(z87=(190.982,278.282))z87..hide(z88=(193.416,278.972))z88
+ ..controls hide(z89=(195.835,279.657))z89 and hide(z90=(203.214,281.625))z90..hide(z91=(209.869,283.359))z91
+ ..controls hide(z92=(216.523,285.094))z92 and hide(z93=(224.23,287.209))z93..hide(z94=(227.053,288.076))z94
+ ..controls hide(z95=(229.905,288.952))z95 and hide(z96=(233.467,289.972))z96..hide(z97=(235.097,290.379))z97
+ ..controls hide(z98=(236.722,290.785))z98 and hide(z99=(239.484,291.549))z99..hide(z100=(241.312,292.098))z100
+ ..controls hide(z101=(243.136,292.645))z101 and hide(z102=(247.309,293.664))z102..hide(z103=(250.672,294.384))z103
+ ..controls hide(z104=(255.718,295.463))z104 and hide(z105=(258.712,296.887))z105..hide(z106=(255.937,296.887))z106
+ ..controls hide(z107=(255.547,296.887))z107 and hide(z108=(255.206,297.399))z108..hide(z109=(255.206,297.984))z109
+ ..controls hide(z110=(255.206,298.587))z110 and hide(z111=(255.864,299.081))z111..hide(z112=(256.669,299.081))z112
+ ..controls hide(z113=(257.546,299.081))z113 and hide(z114=(258.131,298.613))z114..hide(z115=(258.131,297.911))z115
+ ..controls hide(z116=(258.131,296.975))z116 and hide(z117=(258.643,296.837))z117..hide(z118=(260.69,297.219))z118
+ ..controls hide(z119=(265.886,298.191))z119 and hide(z120=(265.944,297.765))z120..hide(z121=(265.075,264.932))z121
+ ..controls hide(z122=(264.736,252.135))z122 and hide(z123=(264.811,245.7))z123..hide(z124=(265.297,245.7))z124
+ ..controls hide(z125=(266.883,245.7))z125 and hide(z126=(267.399,252.793))z126..hide(z127=(267.917,281.75))z127
+ ..controls hide(z128=(268.149,294.694))z128 and hide(z129=(268.149,294.694))z129..hide(z130=(265.364,299.227))z130
+ ..controls hide(z131=(262.174,304.419))z131 and hide(z132=(261.87,306.04))z132..hide(z133=(263.981,306.6))z133
+ ..controls hide(z134=(268.294,307.744))z134 and hide(z135=(275.854,303.103))z135..hide(z136=(280.281,296.595))z136
+ ..controls hide(z137=(283.962,291.184))z137 and hide(z138=(284.721,290.268))z138..hide(z139=(289.063,286.003))z139
+ ..controls hide(z140=(291.403,283.705))z140 and hide(z141=(292.5,282.033))z141..hide(z142=(292.5,280.763))z142
+ ..controls hide(z143=(292.5,279.62))z143 and hide(z144=(293.377,278.063))z144..hide(z145=(294.767,276.741))z145
+ ..controls hide(z146=(296.017,275.551))z146 and hide(z147=(298.525,272.208))z147..hide(z148=(300.361,269.283))z148
+ ..controls hide(z149=(302.197,266.358))z149 and hide(z150=(303.934,263.981))z150..hide(z151=(304.236,263.981))z151
+ ..controls hide(z152=(304.545,263.981))z152 and hide(z153=(305.201,262.957))z153..hide(z154=(305.736,261.641))z154
+ ..controls hide(z155=(306.263,260.343))z155 and hide(z156=(308.249,257.363))z156..hide(z157=(310.196,254.95))z157
+ ..controls hide(z158=(312.143,252.537))z158 and hide(z159=(313.706,250.225))z159..hide(z160=(313.706,249.758))z160
+ ..controls hide(z161=(313.706,249.294))z161 and hide(z162=(314.657,248))z162..hide(z163=(315.827,246.87))z163
+ ..controls hide(z164=(316.997,245.74))z164 and hide(z165=(318.128,243.888))z165..hide(z166=(318.35,242.738))z166
+ ..controls hide(z167=(318.613,241.372))z167 and hide(z168=(319.52,240.264))z168..hide(z169=(320.982,239.521))z169
+ ..controls hide(z170=(322.225,238.889))z170 and hide(z171=(323.698,237.449))z171..hide(z172=(324.309,236.267))z172
+ ..controls hide(z173=(324.914,235.097))z173 and hide(z174=(325.652,234.031))z174..hide(z175=(325.955,233.89))z175
+ ..controls hide(z176=(326.254,233.75))z176 and hide(z177=(327.334,231.989))z177..hide(z178=(328.331,230.015))z178
+ ..controls hide(z179=(329.365,227.967))z179 and hide(z180=(331.096,225.887))z180..hide(z181=(332.316,225.225))z181
+ ..controls hide(z182=(333.504,224.581))z182 and hide(z183=(335.098,222.921))z183..hide(z184=(335.863,221.532))z184
+ ..controls hide(z185=(336.635,220.13))z185 and hide(z186=(338.471,217.547))z186..hide(z187=(339.995,215.719))z187
+ ..controls hide(z188=(341.518,213.89))z188 and hide(z189=(343.403,211.128))z189..hide(z190=(344.236,209.503))z190
+ ..controls hide(z191=(345.069,207.878))z191 and hide(z192=(347.734,204.531))z192..hide(z193=(350.232,201.971))z193
+ ..controls hide(z194=(352.945,199.192))z194 and hide(z195=(354.903,196.494))z195..hide(z196=(355.168,195.17))z196
+ ..controls hide(z197=(355.411,193.957))z197 and hide(z198=(356.943,191.441))z198..hide(z199=(358.596,189.54))z199
+ ..controls hide(z200=(361.841,185.811))z200 and hide(z201=(364.128,182.683))z201..hide(z202=(365.551,180.034))z202
+ ..controls hide(z203=(366.846,177.621))z203 and hide(z204=(365.23,174.037))z204..hide(z205=(362.846,174.037))z205
+ ..controls hide(z206=(361.091,174.037))z206 and hide(z207=(358.527,172.096))z207..hide(z208=(359.273,171.332))z208
+ ..controls hide(z209=(359.507,171.093))z209 and hide(z210=(360.799,171.399))z210..hide(z211=(362.115,172.005))z211
+ ..controls hide(z212=(368.257,174.837))z212 and hide(z213=(375.377,173.789))z213..hide(z214=(371.109,170.681))z214
+ ..controls hide(z215=(370.133,169.97))z215 and hide(z216=(369.915,169.138))z216..hide(z217=(370.268,167.456))z217
+ ..controls hide(z218=(370.58,165.969))z218 and hide(z219=(370.316,164.385))z219..hide(z220=(369.501,162.849))z220
+ ..controls hide(z221=(368.801,161.533))z221 and hide(z222=(368.321,159.646))z222..hide(z223=(368.404,158.535))z223
+ ..controls hide(z224=(368.485,157.438))z224 and hide(z225=(368.095,156.301))z225..hide(z226=(367.526,155.976))z226
+ ..controls hide(z227=(366.853,155.591))z227 and hide(z228=(366.377,153.635))z228..hide(z229=(366.137,150.272))z229
+ ..controls hide(z230=(365.933,147.42))z230 and hide(z231=(365.431,143.858))z231..hide(z232=(365.003,142.228))z232
+ ..controls hide(z233=(364.584,140.633))z233 and hide(z234=(363.853,137.475))z234..hide(z235=(363.395,135.281))z235
+ ..controls hide(z236=(362.936,133.087))z236 and hide(z237=(362.088,130.162))z237..hide(z238=(361.53,128.846))z238
+ ..controls hide(z239=(360.967,127.519))z239 and hide(z240=(360.506,125.117))z240..hide(z241=(360.506,123.508))z241
+ ..controls hide(z242=(360.506,121.899))z242 and hide(z243=(360.111,119.859))z243..hide(z244=(359.629,118.974))z244
+ ..controls hide(z245=(359.15,118.097))z245 and hide(z246=(358.834,116.269))z246..hide(z247=(358.934,114.952))z247
+ ..controls hide(z248=(359.034,113.636))z248 and hide(z249=(358.602,111.825))z249..hide(z250=(357.983,110.967))z250
+ ..controls hide(z251=(357.35,110.088))z251 and hide(z252=(356.85,108.298))z252..hide(z253=(356.85,106.909))z253
+ ..controls hide(z254=(356.85,105.519))z254 and hide(z255=(356.382,103.567))z255..hide(z256=(355.79,102.485))z256
+ ..controls hide(z257=(355.209,101.424))z257 and hide(z258=(354.401,97.4023))z258..hide(z259=(354.005,93.5999))z259
+ ..controls hide(z260=(352.968,83.6548))z260 and hide(z261=(352.529,81.2454))z261..hide(z262=(351.429,79.4868))z262
+ ..controls hide(z263=(350.069,77.3098))z263 and hide(z264=(348.615,69.103))z264..hide(z265=(349.163,66.6899))z265
+ ..controls hide(z266=(349.581,64.8442))z266 and hide(z267=(349.391,64.6501))z267..hide(z268=(346.247,63.7119))z268
+ ..controls hide(z269=(341.811,62.3882))z269 and hide(z270=(340.625,63.3262))z270..hide(z271=(340.914,67.9331))z271
+ ..controls hide(z272=(341.263,73.5166))z272 and hide(z273=(339.121,72.5398))z273..hide(z274=(338.347,66.7629))z274
+ ..controls hide(z275=(337.642,61.498))z275 and hide(z276=(335.318,60.0554))z276..hide(z277=(334.459,64.3499))z277
+ ..controls hide(z278=(334.225,65.5198))z278 and hide(z279=(333.412,67.0278))z279..hide(z280=(332.646,67.7136))z280
+ ..controls hide(z281=(331.914,68.3679))z281 and hide(z282=(331.256,69.5457))z282..hide(z283=(331.256,70.2))z283
+ ..controls hide(z284=(331.256,70.8691))z284 and hide(z285=(330.353,72.7593))z285..hide(z286=(329.3,74.2949))z286
+ ..controls hide(z287=(325.789,79.4136))z287 and hide(z288=(320.082,90.9722))z288..hide(z289=(318.72,95.7205))z289
+ ..controls hide(z290=(317.42,100.254))z290 and hide(z291=(314.317,105.3))z291..hide(z292=(312.829,105.3))z292
+ ..controls hide(z293=(308.461,105.3))z293 and hide(z294=(294.694,129.504))z294..hide(z295=(294.694,137.182))z295
+ ..controls hide(z296=(294.694,141.643))z296 and hide(z297=(291.904,145.559))z297..hide(z298=(290.891,142.521))z298
+ ..controls hide(z299=(290.542,141.474))z299 and hide(z300=(287.381,143.252))z300..hide(z301=(287.381,144.495))z301
+ ..controls hide(z302=(287.381,144.918))z302 and hide(z303=(286.723,145.888))z303..hide(z304=(285.992,146.542))z304
+ ..controls hide(z305=(285.21,147.242))z305 and hide(z306=(284.219,148.809))z306..hide(z307=(283.725,150.125))z307
+ ..controls hide(z308=(283.246,151.402))z308 and hide(z309=(282.133,154.294))z309..hide(z310=(281.275,156.487))z310
+ ..controls hide(z311=(280.406,158.711))z311 and hide(z312=(278.15,162.52))z312..hide(z313=(276.229,165.006))z313
+ ..controls hide(z314=(274.309,167.493))z314 and hide(z315=(272.756,170.223))z315..hide(z316=(272.756,171.112))z316
+ ..controls hide(z317=(272.756,172))z317 and hide(z318=(271.953,173.672))z318..hide(z319=(270.965,174.842))z319
+ ..controls hide(z320=(269.404,176.689))z320 and hide(z321=(269.276,177.255))z321..hide(z322=(269.969,179.229))z322
+ ..controls hide(z323=(270.893,181.862))z323 and hide(z324=(269.866,185.685))z324..hide(z325=(267.573,188.15))z325
+ ..controls hide(z326=(266.139,189.692))z326 and hide(z327=(265.841,220.618))z327..hide(z328=(267.229,223.909))z328
+ ..controls hide(z329=(267.537,224.64))z329 and hide(z330=(267.426,225.664))z330..hide(z331=(266.979,226.212))z331
+ ..controls hide(z332=(266.536,226.755))z332 and hide(z333=(265.939,230.782))z333..hide(z334=(265.65,235.17))z334
+ ..controls hide(z335=(264.577,251.473))z335 and hide(z336=(263.579,226.029))z336..hide(z337=(264.07,194.878))z337
+ ..controls hide(z338=(264.101,192.884))z338 and hide(z339=(263.729,188.479))z339..hide(z340=(263.25,185.189))z340
+ ..controls hide(z341=(262.42,179.485))z341 and hide(z342=(262.452,179.086))z342..hide(z343=(263.835,177.876))z343
+ ..controls hide(z344=(264.65,177.164))z344 and hide(z345=(266.512,174.33))z345..hide(z346=(268.04,171.478))z346
+ ..controls hide(z347=(269.567,168.626))z347 and hide(z348=(271.381,165.501))z348..hide(z349=(272.135,164.421))z349
+ ..controls hide(z350=(272.9,163.324))z350 and hide(z351=(273.487,162.293))z351..hide(z352=(273.487,162.045))z352
+ ..controls hide(z353=(273.487,161.804))z353 and hide(z354=(275.511,158.242))z354..hide(z355=(277.976,154.147))z355
+ ..controls hide(z356=(282.728,146.25))z356 and hide(z357=(284.237,143.655))z357..hide(z358=(287.245,138.206))z358
+ ..controls hide(z359=(289.99,133.234))z359 and hide(z360=(299.06,117.685))z360..hide(z361=(301.023,114.587))z361
+ ..controls hide(z362=(301.95,113.124))z362 and hide(z363=(302.737,111.747))z363..hide(z364=(302.737,111.589))z364
+ ..controls hide(z365=(302.737,111.183))z365 and hide(z366=(314.213,91.2598))z366..hide(z367=(321.733,78.6091))z367
+ ..controls hide(z368=(325.081,72.9785))z368 and hide(z369=(329.837,64.9495))z369..hide(z370=(332.304,60.7668))z370
+ ..controls hide(z371=(338.083,50.968))z371 and hide(z372=(337.658,51.1626))z372..hide(z373=(346.101,54.4392))z373
+ ..controls hide(z374=(354.37,57.6489))z374 and hide(z375=(353.838,56.9644))z375..hide(z376=(355.457,66.4705))z376
+ ..controls hide(z377=(356.179,70.7117))z377 and hide(z378=(357.29,77.0364))z378..hide(z379=(357.91,80.4373))z379
+ ..controls hide(z380=(358.537,83.8743))z380 and hide(z381=(359.518,89.2683))z381..hide(z382=(360.104,92.5029))z382
+ ..controls hide(z383=(360.686,95.7136))z383 and hide(z384=(362.512,105.446))z384..hide(z385=(364.153,114.075))z385
+ ..controls hide(z386=(367.6,132.21))z386 and hide(z387=(370.829,149.516))z387..hide(z388=(373.021,161.606))z388
+ ..controls hide(z389=(373.857,166.213))z389 and hide(z390=(374.711,170.875))z390..hide(z391=(374.912,171.917))z391
+ ..controls hide(z392=(375.191,173.367))z392 and hide(z393=(374.51,174.842))z393..hide(z394=(372.046,178.132))z394
+ ..controls hide(z395=(364.981,187.565))z395 and hide(z396=(360.559,193.664))z396..hide(z397=(357.253,198.534))z397
+ ..controls hide(z398=(355.351,201.336))z398 and hide(z399=(351.495,206.797))z399..hide(z400=(348.733,210.6))z400
+ ..controls hide(z401=(345.967,214.408))z401 and hide(z402=(340.482,222.007))z402..hide(z403=(336.594,227.419))z403
+ ..controls hide(z404=(332.706,232.83))z404 and hide(z405=(327.32,240.264))z405..hide(z406=(324.675,243.872))z406
+ ..controls hide(z407=(321.994,247.528))z407 and hide(z408=(318.404,252.436))z408..hide(z409=(316.598,254.914))z409
+ ..controls hide(z410=(307.005,268.076))z410 and hide(z411=(302.032,274.894))z411..hide(z412=(295.05,284.456))z412
+ ..controls hide(z413=(290.779,290.306))z413 and hide(z414=(285.377,297.845))z414..hide(z415=(283.001,301.275))z415
+ ..controls hide(z416=(275.704,311.805))z416 and hide(z417=(275.811,311.75))z417..cycle;
+ PreeditedPath2 = hide(z418=(254.987,177.913))z418..controls hide(z419=(254.744,177.67))z419 and hide(z420=(253.305,177.229))z420..hide(z421=(251.769,176.926))z421
+ ..controls hide(z422=(250.239,176.624))z422 and hide(z423=(246.065,175.346))z423..hide(z424=(242.482,174.084))z424
+ ..controls hide(z425=(235.17,171.507))z425 and hide(z426=(231.263,171.562))z426..hide(z427=(228.296,174.285))z427
+ ..controls hide(z428=(226.59,175.85))z428 and hide(z429=(225.265,175.207))z429..hide(z430=(225.222,172.794))z430
+ ..controls hide(z431=(225.181,170.533))z431 and hide(z432=(221.496,168.977))z432..hide(z433=(216.377,169.058))z433
+ ..controls hide(z434=(212.647,169.117))z434 and hide(z435=(210.978,168.823))z435..hide(z436=(209.978,167.931))z436
+ ..controls hide(z437=(209.247,167.279))z437 and hide(z438=(208.138,166.725))z438..hide(z439=(207.565,166.725))z439
+ ..controls hide(z440=(206.982,166.725))z440 and hide(z441=(205.847,166.11))z441..hide(z442=(205.042,165.359))z442
+ ..controls hide(z443=(202.136,162.644))z443 and hide(z444=(198.973,161.521))z444..hide(z445=(194.147,161.49))z445
+ ..controls hide(z446=(190.929,161.469))z446 and hide(z447=(188.598,161.014))z447..hide(z448=(186.688,160.034))z448
+ ..controls hide(z449=(185.149,159.244))z449 and hide(z450=(181.789,157.939))z450..hide(z451=(179.156,157.109))z451
+ ..controls hide(z452=(176.524,156.279))z452 and hide(z453=(173.783,155.284))z453..hide(z454=(173.014,154.879))z454
+ ..controls hide(z455=(172.251,154.477))z455 and hide(z456=(169.942,153.653))z456..hide(z457=(167.895,153.051))z457
+ ..controls hide(z458=(165.847,152.448))z458 and hide(z459=(163.522,151.492))z459..hide(z460=(162.74,150.93))z460
+ ..controls hide(z461=(161.973,150.38))z461 and hide(z462=(160.18,149.906))z462..hide(z463=(158.864,149.906))z463
+ ..controls hide(z464=(157.548,149.906))z464 and hide(z465=(155.467,149.416))z465..hide(z466=(154.367,148.846))z466
+ ..controls hide(z467=(153.27,148.278))z467 and hide(z468=(152.149,147.955))z468..hide(z469=(151.954,148.151))z469
+ ..controls hide(z470=(151.753,148.351))z470 and hide(z471=(150.016,147.838))z471..hide(z472=(148.115,147.018))z472
+ ..controls hide(z473=(146.213,146.197))z473 and hide(z474=(143.748,145.515))z474..hide(z475=(142.667,145.51))z475
+ ..controls hide(z476=(128.554,145.452))z476 and hide(z477=(126.589,144.869))z477..hide(z478=(124.219,140.034))z478
+ ..controls hide(z479=(123.528,138.624))z479 and hide(z480=(122.192,137.646))z480..hide(z481=(119.925,136.89))z481
+ ..controls hide(z482=(118.097,136.281))z482 and hide(z483=(115.887,135.452))z483..hide(z484=(114.952,135.025))z484
+ ..controls hide(z485=(114.015,134.597))z485 and hide(z486=(112.283,134.322))z486..hide(z487=(111.04,134.404))z487
+ ..controls hide(z488=(109.836,134.483))z488 and hide(z489=(107.75,133.91))z489..hide(z490=(106.506,133.16))z490
+ ..controls hide(z491=(105.256,132.406))z491 and hide(z492=(103.033,131.403))z492..hide(z493=(101.644,130.967))z493
+ ..controls hide(z494=(100.254,130.53))z494 and hide(z495=(98.2485,129.46))z495..hide(z496=(97.2561,128.627))z496
+ ..controls hide(z497=(95.428,127.091))z497 and hide(z498=(95.428,127.091))z498..hide(z499=(98.426,127.436))z499
+ ..controls hide(z500=(101.129,127.747))z500 and hide(z501=(115.684,132.079))z501..hide(z502=(128.334,136.337))z502
+ ..controls hide(z503=(131.163,137.289))z503 and hide(z504=(139.669,139.925))z504..hide(z505=(147.347,142.228))z505
+ ..controls hide(z506=(155.025,144.531))z506 and hide(z507=(164.185,147.312))z507..hide(z508=(167.822,148.444))z508
+ ..controls hide(z509=(171.478,149.581))z509 and hide(z510=(176.841,151.206))z510..hide(z511=(179.887,152.1))z511
+ ..controls hide(z512=(182.911,152.987))z512 and hide(z513=(191.441,155.611))z513..hide(z514=(198.9,157.95))z514
+ ..controls hide(z515=(206.359,160.288))z515 and hide(z516=(215.873,163.225))z516..hide(z517=(220.106,164.495))z517
+ ..controls hide(z518=(224.347,165.767))z518 and hide(z519=(230.894,167.764))z519..hide(z520=(234.731,168.955))z520
+ ..controls hide(z521=(238.534,170.136))z521 and hide(z522=(244.657,171.975))z522..hide(z523=(248.259,173.019))z523
+ ..controls hide(z524=(255.864,175.222))z524 and hide(z525=(259.346,176.934))z525..hide(z526=(257.985,177.8))z526
+ ..controls hide(z527=(256.888,178.498))z527 and hide(z528=(255.62,178.546))z528..cycle;
+ dotlabels.rt(371,375,416,44,26);
+ draw PreeditedPath1 withcolor green;
+ draw PreeditedPath2 withcolor red;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FEATPOST specific %%
+ PhotoMarks := 5;
+ PhotoPair1 := z26; PhotoPoint1 := (7.0,-0.6,5.6);
+ PhotoPair2 := z44; PhotoPoint2 := (7.0,0,0);
+ PhotoPair3 := z371; PhotoPoint3:= (0,6.4,0);
+ PhotoPair4 := z375; PhotoPoint4:= (-0.6,6.4,0);
+ PhotoPair5 := z416; PhotoPoint5:= (-0.6,-0.6,5.6);
+ color pp[];
+ pp1 = (7.0,-0.6,7.0);
+ pp5 = (-0.6,-0.6,7.0);
+ pp2 = (8.4,0,0);
+ pp3 = (8.4,6.4,0);
+ path pt[];
+ f := (15,20,15); %%%%%%%%%%%%%%%%%%%%%%%
+ viewcentr := black; %%
+ Spread := 30; %% Parameters
+ ShiftV := (250,100); %%
+% SphericalDistortion := true; %%%%%%%%%%%%%%%%%%%%%%%
+
+ pt1 = rp(PhotoPoint1)--rp(pp1)--rp(pp5)--rp(PhotoPoint5);
+ pt2 = rp(PhotoPoint2)--rp(pp2)--rp(pp3)--rp(PhotoPoint3);
+ draw pt1 withpen pencircle scaled 3pt withcolor blue;
+ draw pt2 withpen pencircle scaled 3pt withcolor blue;
+
+ photoreverse(400,5.5,2.5); %% Changes parameters
+
+ pt3 = rp(PhotoPoint1)--rp(pp1)--rp(pp5)--rp(PhotoPoint5);
+ pt4 = rp(PhotoPoint2)--rp(pp2)--rp(pp3)--rp(PhotoPoint3);
+ draw pt3 withpen pencircle scaled 1pt;
+ draw pt4 withpen pencircle scaled 1pt;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/pifpaf.mp b/graphics/metapost/contrib/macros/featpost/example/pifpaf.mp
new file mode 100644
index 0000000000..f17d2852d0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/pifpaf.mp
@@ -0,0 +1,56 @@
+% pifpaf.mp
+% L. Nobre G.
+% 2010
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, siz, lena, lenb, lenc, anga, angb, angc, astep;
+ u = 7mm;
+ siz = 12u;
+ lena = 9u;
+ lenb = 8u;
+ lenc = 4u;
+ astep = 1.7;
+ z1 = (-lenb,siz-lena);
+ z2 = (lenb,siz-lena);
+ path circa, circb;
+ numeric auxa, auxb, auxc, lend;
+ auxa = 2*(lena+2*lenc);
+ auxb = 2*lena;
+ circa = fullcircle scaled auxa shifted z1;
+ circb = fullcircle scaled auxb shifted z2;
+ z3 = circa intersectionpoint circb;
+ anga = angle(z3-z1);
+ angb = 180-angle(z3-z2);
+ auxc = lena +-+ (lenb-lenc);
+ angc = angle(lenb-lenc,auxc);
+ show (anga,angc,angb);
+ z4 = z2+(lenc-lenb,auxc);
+ z5 = z1+(lenb-lenc,auxc);
+ draw z1--z2--z4--z5--cycle;
+ draw z1--z2--z3--cycle;
+ z6 = z1+lena*dir(anga);
+ z7 = z2+lena*dir(180-angb);
+ z8 = 0.5[z6,z7];
+ lend = siz-lena+auxc;
+ z9 = z8+lend*dir(anga-90);
+ draw z8--z9;
+ draw origin withpen pencircle scaled 3pt;
+ numeric i, diamc;
+ pair parp, intp, pa, pb;
+ diamc = 4*lenc;
+ for i=anga step astep until angc:
+ parp := z1+lena*dir(i);
+ circa := fullcircle scaled diamc shifted parp;
+ intp := circa intersectionpoint circb;
+ pa := 0.5[parp,intp];
+ pb := lend*unitvector((ypart (intp-parp),-xpart (intp-parp)));
+ draw pa--(pa+pb);
+ draw (-xpart (pa+pb),ypart (pa+pb)) withpen pencircle scaled 2pt;
+ draw (pa+pb) withpen pencircle scaled 2pt;
+ endfor;
+
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/pixelgrid.mp b/graphics/metapost/contrib/macros/featpost/example/pixelgrid.mp
new file mode 100644
index 0000000000..e6a1418485
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/pixelgrid.mp
@@ -0,0 +1,45 @@
+% pixelgrid.mp
+% L. Nobre G.
+% 2001
+
+%input mp-tool;
+path fullsquare;
+fullsquare := unitsquare shifted - center unitsquare ;
+
+beginfig(1);
+ numeric u, ix, iy, s, h, v, i, j, n, f, r, l;
+ numeric last, angl, hori;
+ path frame;
+ pair cpos;
+ u = 2mm;
+ s = 1.2u;
+ n = 1; % 6
+ f = 30; % 5
+ h = f*n;
+ v = ceiling(h/sqrt(2));
+ frame = fullsquare scaled 1u;
+% for ix=0 upto h:
+% for iy=-v upto v:
+% draw frame shifted (ix*s,iy*s);
+% endfor;
+% endfor;
+ filldraw frame;
+ for i=1 upto n:
+ r := i*f;
+ l := round(r/sqrt(2));
+ last := 0;
+ for j=0 upto l:
+ hori := round(sqrt(r*r-j*j));
+ cpos := (hori*s,j*s);
+ angl := angle(cpos);
+ filldraw frame shifted cpos;
+ show angl-last;
+ last := angl;
+% draw origin--cpos;
+ endfor;
+ endfor;
+% draw fullcircle scaled (2*r*s) withcolor red;
+% draw boundingbox currentpicture;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/plaintangency.mp b/graphics/metapost/contrib/macros/featpost/example/plaintangency.mp
new file mode 100644
index 0000000000..6926ddb225
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/plaintangency.mp
@@ -0,0 +1,106 @@
+% plaintangency.mp
+% L. Nobre G.
+% IYP (2005)
+
+%input mp-tool;
+
+def paircrossprod(expr A, B) =
+ ( (xpart A)*(ypart B) - (xpart B)*(ypart A) )
+enddef;
+
+def firsttangencypoint( expr Path, Point, ResolvN ) =
+ begingroup
+ save auxp, i, cutp, va, vb;
+ path auxp;
+ numeric i;
+ pair cutp, va, vb;
+ auxp =
+ hide( va := unitvector( point 0 of Path - Point );
+ vb := unitvector( direction 0 of Path ); )
+ ( paircrossprod( va, vb ), 0 )
+ for i=1/ResolvN step 1/ResolvN until length Path:
+ hide( va := unitvector( point i of Path - Point );
+ vb := unitvector( direction i of Path ); )
+ ...( paircrossprod( va, vb ), i )
+ endfor;
+ cutp = auxp intersectionpoint ( origin--( 0, length Path ) );
+ ( point ( ypart cutp ) of Path )
+ endgroup
+enddef;
+
+beginfig(0);
+ numeric u, i;
+ u = 5mm;
+ pen a, b, c;
+ a = pencircle scaled 3pt;
+ b = pencircle scaled 5pt;
+ c = pencircle scaled 1pt;
+ z1 = (1u,1u);
+ z2 = (4u,4u);
+ z3 = (4u,5u);
+ z4 = (3u,5u);
+ z5 = (3u,6u);
+ z6 = (4u,7u);
+ z7 = (6u,1u);
+ path cp;
+ cp = z1{up}..z2..z3..z4..z5..{up}z6;
+ draw cp withpen c;
+ for i=1 upto 6:
+ draw z[i] withpen a withcolor 0.5*(red+green);
+ endfor;
+ z8 = firsttangencypoint( cp, z7, 5 );
+ draw z7 withpen b withcolor green;
+ draw z7--z8 withpen c withcolor blue;
+endfig;
+
+beginfig(1);
+ numeric u;
+ u = 5mm;
+ pen a, b, c;
+ path auxp;
+ numeric i, auxn, yfact, sinfact, res;
+ pair cutp, vA, vB;
+ yfact = 30;
+ sinfact = 40;
+ res = 15;
+ a = pencircle scaled 3pt;
+ b = pencircle scaled 5pt;
+ c = pencircle scaled 1pt;
+ z1 = (1u,1u);
+ z2 = (4u,4u);
+ z3 = (4u,5u);
+ z4 = (3u,5u);
+ z5 = (3u,6u);
+ z6 = (4u,7u);
+ z7 = (6u,2.8u);
+ path cp;
+ cp = z1{up}..z2..z3..z4..z5..{up}z6;
+ draw z7 withpen b withcolor green;
+ draw cp withpen a;
+ auxp = hide( vA := unitvector(point 0 of cp - z7);
+ vB := unitvector(direction 0 of cp); )
+ ( sinfact*((xpart vA)*(ypart vB) - (xpart vB)*(ypart vA)), 0 )
+ for i=1/res step 1/res until length cp:
+ hide( vA := unitvector(point i of cp - z7);
+ vB := unitvector(direction i of cp); )
+ ...(sinfact*((xpart vA)*(ypart vB)-(xpart vB)*(ypart vA)),i*yfact)
+ endfor;
+ draw auxp withcolor blue+green;
+ draw origin--(sinfact,0) withcolor red;
+ draw origin--( 0, yfact*length cp ) withcolor red+green;
+ cutp = auxp intersectionpoint ( origin--( 0, yfact*length cp ) );
+ draw cutp withpen a;
+ auxn = ( ypart cutp )/yfact;
+ show auxn;
+ z8 = point auxn of cp;
+ draw z8 withpen b withcolor green;
+ draw z7--1.8[z7,z8] withpen c withcolor blue;
+endfig;
+
+end.
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/planintersection.mp b/graphics/metapost/contrib/macros/featpost/example/planintersection.mp
new file mode 100644
index 0000000000..f7046facc5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/planintersection.mp
@@ -0,0 +1,107 @@
+% planintersection.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ f := 0.5*(10,14,5.5);
+ color a, x, b, c, D, y, w, g, h;
+ color auxa, auxb, auxc, auxd, auxe, auxf;
+ pair appear;
+ numeric wid, hei, alfa, beta, forw, back, labscal;
+ pen thedotpen, borderpen, normalpen;
+ picture dasha, dashb, labx, laba, labb, labc, labD;
+ path outerb, innerb, apath, bpath;
+ wid = 1.5;
+ hei = 1;
+ forw = 1.5;
+ back = 1.5;
+ alfa = -10;
+ beta = -30;
+ labscal = 2.8;
+ labeloffset := 8pt;
+ ahangle := 30;
+ ahlength := 10pt;
+ a = ( 0.7*forw, 0.15*wid, 0.3*hei );
+ b = ( -0.7*back, 0.5*wid, 0.8*hei );
+ c = ( 0, 0.7*wid, 0.5*hei );
+ D = ( cosd( alfa )*cosd( beta ), sind( alfa )*cosd( beta ), sind( beta ) );
+ labx = btex $\vec{x}$ etex scaled labscal;
+ laba = btex $\vec{a}$ etex scaled labscal;
+ labb = btex $\vec{b}$ etex scaled labscal;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labD = btex $\vec{D}$ etex scaled labscal;
+ thedotpen = pencircle scaled 4pt;
+ borderpen = pencircle scaled 2pt;
+ normalpen = pencircle scaled 1.5pt;
+ dasha = evenly scaled 2;
+% dashb = dashpattern( on 7pt off 5pt on 7pt );
+ dashb = withdots;
+ apath = rp((X(a),Y(a),0))--rp(a)--rp((X(a),0,Z(a)));
+ bpath = rp((X(b),Y(b),0))--rp(b)--rp((X(b),0,Z(b)));
+ auxa = ( forw, 0, 0 );
+ auxb = ( forw, 0, hei );
+ auxc = ( -back, 0, hei );
+ auxd = ( -back, 0, 0 );
+ auxe = ( -back, wid, 0 );
+ auxf = ( forw, wid, 0 );
+ outerb = rp(auxa)--rp(auxb)--rp(auxc)--rp(auxd)--rp(auxe)--rp(auxf)--cycle;
+ draw outerb withpen borderpen;
+ draw rp(auxa)--rp(auxd) withpen borderpen;
+
+ draw bpath dashed dasha withpen normalpen;
+ draw rp(b) withpen thedotpen;
+ label.top( labb, rp(b) );
+
+ draw rp(a)--rp(b) withpen normalpen;
+
+ cdotprod( y-c, D ) = 0;
+ cdotprod( y-black, green ) = 0;
+ cdotprod( y-black, blue ) = 0;
+
+ cdotprod( w-c, D ) = 0;
+ cdotprod( w-black, green ) = 0;
+ cdotprod( w-hei*blue, blue ) = 0;
+
+ cdotprod( g-c, D ) = 0;
+ cdotprod( g-wid*green, green ) = 0;
+ cdotprod( g-hei*blue, blue ) = 0;
+
+ cdotprod( h-c, D ) = 0;
+ cdotprod( h-wid*green, green ) = 0;
+ cdotprod( h-black, blue ) = 0;
+
+ innerb = rp(y)--rp(w)--rp(g)--rp(h)--cycle;
+ unfill innerb;
+ draw innerb withpen borderpen;
+
+ draw apath dashed dasha withpen normalpen;
+ draw rp(a) withpen thedotpen;
+ label.top( laba, rp(a) );
+
+ x = whatever[a,b];
+ cdotprod( x-c, D ) = 0;
+ draw rp(x) withpen thedotpen;
+ label.top( labx, rp(x) );
+
+ draw rp(a)--rp(x) withpen normalpen;
+ draw rp(x)--rp(b) withpen normalpen dashed dashb;
+
+ draw rp(c) withpen thedotpen;
+ drawarrow rp(c)--rp(c+0.7*D) withpen borderpen;
+ label.top( labc, rp(c) );
+
+ label.bot( labD, rp(c+0.5*D) );
+
+ draw rp(x)--rp(c) dashed dasha withpen normalpen;
+ drawoptions( withpen normalpen );
+ squareangline( x, c+D, c, 0.08*wid );
+
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/planpht.mp b/graphics/metapost/contrib/macros/featpost/example/planpht.mp
new file mode 100644
index 0000000000..cef4722f33
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/planpht.mp
@@ -0,0 +1,291 @@
+% planpht.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+% Planification wise 3D figures
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1); % phtpbq
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (1,0,0);
+ V2 := (0,1,0);
+ V5 := (0,0,1);
+ V3 := (-1,0,0);
+ V4 := (0,-1,0);
+ makeface1(1,2,3,4);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(3,4,5);
+ makeface5(4,1,5);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,4);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(2); % phtdpbp
+ numeric altura, raio, xp, xs, yp, ys;
+ altura = 0.5257311;
+ raio = 0.8506508;
+ yp = 0.80901699;
+ ys = 0.5;
+ xp = 0.2628655;
+ xs = -0.6881909;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (raio,0,0);
+ V2 := (xp,yp,0);
+ V3 := (xs,ys,0);
+ V4 := (xs,-ys,0);
+ V5 := (xp,-yp,0);
+ V6 := (0,0,altura);
+ V7 := (0,0,-altura);
+ makeface1(1,2,6);
+ makeface2(5,1,6);
+ makeface3(2,3,6);
+ makeface4(3,4,6);
+ makeface5(4,5,6);
+ makeface6(1,2,7);
+ makeface7(5,1,7);
+ makeface8(2,3,7);
+ makeface9(3,4,7);
+ makeface10(4,5,7);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,1.8);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(3); % phtcubo eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ V1 := (1,1,1);
+ V2 := (-1,1,1);
+ V3 := (-1,-1,1);
+ V4 := (1,-1,1);
+ V5 := (1,1,-1);
+ V6 := (-1,1,-1);
+ V7 := (-1,-1,-1);
+ V8 := (1,-1,-1);
+ makeface1(1,2,3,4);
+ makeface2(5,6,7,8);
+ makeface3(1,2,6,5);
+ makeface4(2,3,7,6);
+ makeface5(3,4,8,7);
+ makeface6(4,1,5,8);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (3,5,3);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ label.lft("A", rp(V8) );
+ label.top("B", rp(V1) );
+ label.top("C", rp(V3) );
+ label.lft("D", rp(V4) );
+ label.rt("E", rp(V2) );
+ label.rt("F", rp(V6) );
+endfig;
+
+beginfig(4); % phtptq
+ numeric high, low;
+ high = sqrt(2);
+ low = sqrt(2)-1.6818;
+ V1 := (1,1,high);
+ V2 := (-1,1,high);
+ V3 := (-1,-1,high);
+ V4 := (1,-1,high);
+ V5 := (high,0,low);
+ V6 := (0,high,low);
+ V7 := (-high,0,low);
+ V8 := (0,-high,low);
+ V9 := (0,0,0);
+ makeface1(5,6,7,8);
+ makeface2(6,1,2);
+ makeface3(7,2,3);
+ makeface4(8,3,4);
+ makeface5(5,4,1);
+ makeface6(5,6,1);
+ makeface7(6,7,2);
+ makeface8(7,8,3);
+ makeface9(8,5,4);
+ makeface10(9,1,2);
+ makeface11(9,2,3);
+ makeface12(9,3,4);
+ makeface13(9,4,1);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := (2,6,5);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(5); % phtnonrec
+ numeric tro;
+ tro = 2;
+ V1 := (tro,0,0);
+ V2 := (0,tro,0);
+ V3 := (-tro,0,0);
+ V4 := (0,-tro,0);
+ V5 := (1,1,1);
+ V6 := (-1,1,1);
+ V7 := (-1,-1,1);
+ V8 := (1,-1,1);
+ V9 := (1,1,-1);
+ V10 := (-1,1,-1);
+ V11 := (-1,-1,-1);
+ V12 := (1,-1,-1);
+ V13 := (0,0,tro);
+ V14 := (0,0,-tro);
+ makeface1(1,5,13,8);
+ makeface2(2,6,13,5);
+ makeface3(3,7,13,6);
+ makeface4(4,8,13,7);
+ makeface5(1,5,2,9);
+ makeface6(2,6,3,10);
+ makeface7(3,7,4,11);
+ makeface8(4,8,1,12);
+ makeface9(1,9,14,12);
+ makeface10(2,10,14,9);
+ makeface11(3,11,14,10);
+ makeface12(4,12,14,11);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := 2*(5,3,1.5);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+beginfig(6); % pauphtflex eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ color A, B, C, D, E, F, G;
+ numeric tro, Adist;
+ tro = sqrt(3)/2;
+ Adist = 0.88854;
+ V1 := (-1.8,0,0);
+ V2 := (-1.8,0.6,1.2*tro);
+ V3 := (1,0.6,1.2*tro);
+ V4 := (1,0,0);
+ V5 := (1,2.5,0);
+ V6 := (-1.8,2.5,0);
+ V7 := (0,0,0);
+ V8 := (0,0.707,0);
+ V9 := (0,0.707/4,0.707*tro/2);
+ V10:= (0.21928,Adist/2,tro*Adist);
+ V11:= (-0.37392,0.39638,0);
+ V12:= (-1.2125,Adist,0);
+ makeface1(1,2,3,4);
+ makeface2(4,5,6,1);
+ makeface3(7,8,9);
+ makeface4(8,9,10);
+ makeface5(8,10,11);
+ makeface6(10,11,12);
+ A = (0,1.3,0);
+ B = (0,1.3+sqrt(0.75),0);
+ C = (-0.5,1.3+sqrt(0.75),0);
+ D = (E+B)/2;
+ E = (sqrt(0.75),1.3,0);
+ F = ((1+sqrt(3))/4,1.3+(1+sqrt(3))/4,0);
+ G = (-1.5,1.3+sqrt(0.75),0);
+ f := 3*(2,5,2);
+ Spread := 100;
+ draw rp(A)--rp(B)--rp(E)--cycle;
+ draw rp(F)--rp(B)--rp(E)--cycle;
+ draw rp(A)--rp(B)--rp(C)--cycle;
+ draw rp(A)--rp(C)--rp(G)--cycle;
+ draw rp(A)--rp(F) dashed evenly;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ draw rp(V7)--rp(V9);
+ draw rp(V10)--rp(V9);
+ draw rp(V12)--rp((-1.2125,0,0)) dashed evenly;
+ label.urt("Adist", rp((V12+(-1.2125,0,0))/2) );
+ label.lft("A", rp(V10) );
+ label.bot("B", rp(V8) );
+ label.bot("B", rp(B) );
+ label.lrt("C", rp(V11) );
+ label.lft("D", rp(V9) );
+ label.bot("D", rp(D) );
+ label.llft("F", rp(V7) );
+ label.bot("F", rp(F) );
+ label.rt("G", rp(V12) );
+ angline(V6, V2, V1, 0.6, btex $\alpha$ etex, rt);
+ angline(V10, 2*V9, V9, 0.7, btex $\theta$ etex, bot);
+ draw rp(V9+N(V10-V9)*0.65)--rp(V9+N(V10-V9)*0.8);
+ draw rp(V9+N(V9)*0.5)--rp(V9+N(V9)*0.8);
+ label.bot(btex $p$ etex, rp((F+B)/2) );
+ label.ulft(btex $q$ etex, rp((D+B)/2) );
+ label.lft(btex $r$ etex, rp((D+A)/2) );
+ label.llft(btex $s$ etex, rp((A+B)/2) );
+ label.llft(btex $t$ etex, rp((A+C)/2) );
+ label.bot(btex $t$ etex, rp((G+C)/2) );
+ label.bot(btex $u$ etex, rp((C+B)/2) );
+ label.top(btex $v$ etex, rp((A+G)/2) );
+endfig;
+
+beginfig(7); % pauphttoro eps
+ defaultscale := 1;
+ defaultfont := "ccr10";
+ numeric sinthe, costhe, ux, uz, lx, lz, co;
+ costhe = (4*sqrt(5)-sqrt(3))/11;
+ sinthe = sqrt(1-costhe**2);
+ ux = costhe*sqrt(2)/2;
+ uz = sinthe/2;
+ lx = sqrt(4/3)*sinthe;
+ lz = -sqrt(2/3)*costhe;
+ co = sqrt(2)*(2*sqrt(5)+5*sqrt(3))/22;
+ V1 := (ux,0,-uz);
+ V2 := (lx,0,-lz);
+ V3 := (0,ux,uz);
+ V4 := (0,lx,lz);
+ V5 := (co,co,0);
+ V6 := (-ux,0,-uz);
+ V7 := (-lx,0,-lz);
+ V8 := (-co,co,0);
+ makeface1(1,2,3);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(3,4,5);
+ makeface5(3,4,1);
+ makeface6(1,4,5);
+ makeface7(3,6,7);
+ makeface8(3,7,8);
+ makeface9(6,7,8);
+ makeface10(3,8,4);
+ makeface11(4,6,8);
+ makeface12(3,4,6);
+ Spread := 100;
+% f := (1,-0.4,3);
+ f := 2*(2,1,2.8);
+ draw_invisible( false, false, TableC6, black );
+% cartaxes(0.2,0.2,0.2);
+ draw rp(V2)--rp(V1)--rp(V4) dashed evenly;
+ draw rp(V3)--rp(V1)--rp(V5) dashed evenly;
+ draw rp(V6)--rp(V4) dashed evenly;
+ draw rp(V6)--rp(V8) dashed evenly;
+% pickup pencircle scaled 1pt;
+% sharpraytrace;
+ label.rt("A", rp(V5) );
+ label.rt("C", rp(V3+(0,0.05,0)) );
+ label.rt("B", rp(V4) );
+ label.rt("D", rp(V8) );
+ label.lft("E", rp(V2) );
+ label.llft("F", rp(V1) );
+ label.lft("G", rp(V7) );
+ label.lft("H", rp(V6) );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/polyhedr.mp b/graphics/metapost/contrib/macros/featpost/example/polyhedr.mp
new file mode 100644
index 0000000000..03a7a4e48f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/polyhedr.mp
@@ -0,0 +1,191 @@
+% polyhedr.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{newcent}
+\pagestyle{empty}
+\begin{document}
+etex
+
+% This exemplifies hidden line removal.
+
+f := (2,5,3);
+
+beginfig(1);
+ Print_Step := 1;
+ faceraytrace( 0.4, red );
+ lineraytrace( 0.4, black );
+% pickup pencircle scaled 2pt;
+% draw_all_test( false );
+% pickup pencircle scaled 1pt;
+% sharpraytrace;
+endfig;
+
+f := 2*(2,5,3.5);
+Print_step := 10;
+Spread := 156;
+LightSource := 2.5*(4,-3,17);
+
+beginfig(2);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of the 3D-figure
+ V1 := (1.4,0,0);
+ V2 := (1,1,0);
+ V3 := (0,1.4,0);
+ V4 := (-1,1,0);
+ V5 := (-1.4,0,0);
+ V6 := (-1,-1,0);
+ V7 := (0, -1.4,0);
+ V8 := (1,-1,0);
+ V9 := (1.4,0,1);
+ V10:= (1,1,1);
+ V11:= (0,1.4,1);
+ V12:= (-1,1,1);
+ V13:= (-1.4,0,1);
+ V14:= (-1,-1,1);
+ V15:= (0,-1.4,1);
+ V16:= (1,-1,1);
+
+ V17:= (1.4,0,-1);
+ V18:= (1,1,-1);
+ V19:= (0,1.4,-1);
+ V20:= (-1,1,-1);
+ V21:= (-1.4,0,-1);
+ V22:= (-1,-1,-1);
+ V23:= (0,-1.4,-1);
+ V24:= (1,-1,-1);
+
+ V25:= (0.7,0,0);
+ V26:= (0,0.7,0);
+ V27:= (0.7,-0.7,0.7);
+ V28:= (0.7,0,0.7);
+ V29:= (0,0.7,0.7);
+ V30:= (-0.7,0.7,0.7);
+ V31:= (0.35,0.35,1.05);
+ V32:= (0,-0.7,1.4);
+ V34:= (0,0,1.4);
+ V33:= (-0.7,0,1.4);
+ NL := 1;
+ npl1 := 9;
+ L1p1 := V17;
+ L1p2 := V18;
+ L1p3 := V19;
+ L1p4 := V20;
+ L1p5 := V21;
+ L1p6 := V22;
+ L1p7 := V23;
+ L1p8 := V24;
+ L1p9 := V17;
+ NF := 8;
+ npf1 := 4;
+ F1p1 := V1;
+ F1p2 := V2;
+ F1p3 := V10;
+ F1p4 := V9;
+ npf2 := 4;
+ F2p1 := V2;
+ F2p2 := V3;
+ F2p3 := V11;
+ F2p4 := V10;
+ npf3 := 4;
+ F3p1 := V3;
+ F3p2 := V4;
+ F3p3 := V12;
+ F3p4 := V11;
+ npf4 := 4;
+ F4p1 := V4;
+ F4p2 := V5;
+ F4p3 := V13;
+ F4p4 := V12;
+ npf5 := 4;
+ F5p1 := V5;
+ F5p2 := V6;
+ F5p3 := V14;
+ F5p4 := V13;
+ npf6 := 4;
+ F6p1 := V6;
+ F6p2 := V7;
+ F6p3 := V15;
+ F6p4 := V14;
+ npf7 := 4;
+ F7p1 := V7;
+ F7p2 := V8;
+ F7p3 := V16;
+ F7p4 := V15;
+ npf8 := 4;
+ F8p1 := V8;
+ F8p2 := V1;
+ F8p3 := V9;
+ F8p4 := V16;
+ makeface9(25,26,29,31,28);
+ makeface10(25,27,28);
+ makeface11(26,29,30);
+ makeface12(27,28,31,34,32);
+ makeface13(31,29,30,33,34);
+ makeface14(32,33,34);
+ makeface15(25,26,30,33,32,27);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% draw_all_test(true);
+ ShadowOn := true;
+ fill_faces();
+ draw_invisible( true, true, TableC3, TableC0 );
+% lineraytrace(0.3, black);
+% faceraytrace(0.4, green); % This my take very long.
+% sharpraytrace;
+
+endfig;
+
+f := 2*(-2,-0.5,2.5);
+Spread := 56;
+LightSource := 1.5*(-4,5,2.7);
+
+beginfig(3);
+ numeric i, aux;
+ pair anglepar;
+ V1 := ( 0.7, 0, 0 );
+ V2 := ( 0, 0.7, 0 );
+ V3 := ( 0.7,-0.7, 0.7 );
+ V4 := ( 0.7, 0, 0.7 );
+ V5 := ( 0, 0.7, 0.7 );
+ V6 := (-0.7, 0.7, 0.7 );
+ V7 := ( 0.35,0.35,1.05);
+ V8 := ( 0, -0.7, 1.4 );
+ V9 := ( 0, 0, 1.4 );
+ V10:= (-0.7, 0, 1.4 );
+ anglepar = getanglepair( (1,1,1) );
+ for i=11 upto 20:
+ V[i]:=eulerrotation( -45, 0, 0, V[i-10] );
+ V[i]:=eulerrotation( 0, 90-ypart anglepar, 0, V[i] );
+ endfor;
+ aux = Z( V11 );
+ for i=25 upto 34:
+ V[i]:=( X(V[i-14]),Y(V[i-14]),1.35*(Z(V[i-14])-aux));
+ endfor;
+ makeface1(25,26,29,31,28);
+ makeface2(25,27,28);
+ makeface3(26,29,30);
+ makeface4(32,33,34);
+ makeface5(25,26,30,34,32,27);
+ makeface6(27,28,31,33,32);
+ makeface7(31,29,30,34,33);
+ for i=1 upto 7:
+ FC[i] := 4;
+ FCD[i]:= true;
+ endfor;
+ ShadowOn := true;
+ setthearena( 10, 5 );
+ fill_faces();
+ draw_invisible( false, false, TableC4, TableC0 );
+% for i=25 upto 34:
+% label.top( decimal(i), rp(V[i]) );
+% endfor;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/positivecharge.mp b/graphics/metapost/contrib/macros/featpost/example/positivecharge.mp
new file mode 100644
index 0000000000..b396f92889
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/positivecharge.mp
@@ -0,0 +1,28 @@
+% positivecharge.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric size, num, i, j, coos[];
+ string comm, bray;
+ color fro, tip;;
+ size = 1.5;
+ num = 70;
+ bray = "0.05";
+ draw rp(black)--rp((size,0,0))--rp((size,size,0))--rp((0,size,0))--cycle;
+ for i=1 upto num:
+ for j=1 upto 6:
+ coos[j] := uniformdeviate(size);
+ endfor;
+ fro := (coos1,coos2,coos3);
+ tip := (coos4,coos5,coos6);
+ comm := "positivecharge(true," & cstr(fro) & "," & bray & ");";
+ getready( comm, fro );
+ comm := "positivecharge(false," & cstr(tip) & "," & bray & ");";
+ getready( comm, tip );
+ endfor;
+ doitnow;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/potenciadecicloeliptico.mp b/graphics/metapost/contrib/macros/featpost/example/potenciadecicloeliptico.mp
new file mode 100644
index 0000000000..ed7ca2c7ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/potenciadecicloeliptico.mp
@@ -0,0 +1,46 @@
+% potenciadecicloeliptico.mp
+% L. Nobre G.
+% 2008
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric u,w,h;
+ u = 5mm;
+ w = 11u;
+ h = 6u;
+ drawarrow origin--(0,h);
+ drawarrow origin--(w,0);
+ label.lft( btex $p$ etex, (0,h) );
+ label.bot( btex $V$ etex, (w,0) );
+ numeric wm, hm, tl;
+ tl = 0.05*h;
+ wm = 0.1+uniformdeviate(0.07);
+ hm = 0.1+uniformdeviate(0.07);
+ path elipse;
+ elipse = fullcircle xscaled (w-2*w*wm) yscaled (h-2*h*hm)
+ shifted (w/2,h/2);
+ draw elipse;
+ z1 = (w*wm,0);
+ z3 = (w*(1-wm),0);
+ z2 = (0,h*(1-hm));
+ z4 = (0,h*hm);
+ draw z1--(z1+tl*up);
+ draw z3--(z3+tl*up);
+ draw z2--(z2+tl*right);
+ draw z4--(z4+tl*right);
+ label.lft( btex $p_b$ etex, z2 );
+ label.bot( btex $V_a$ etex, z1 );
+ label.lft( btex $p_d$ etex, z4 );
+ label.bot( btex $V_c$ etex, z3 );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/probtodooterr.mp b/graphics/metapost/contrib/macros/featpost/example/probtodooterr.mp
new file mode 100644
index 0000000000..bd37e273b6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/probtodooterr.mp
@@ -0,0 +1,75 @@
+% probtodooterr.mp
+% L. Nobre G.
+% 2003
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+
+beginfig(1);
+ ahangle := 30;
+ ahlength := 5mm;
+ currentpen := pencircle scaled 1mm;
+ numeric u, ray, delta, theta, tray, vlen;
+ numeric cray, clen, chig, cfra, cang;
+ path cpat, fall, vpat, tpat, apat, rpat;
+ picture cpic;
+ u = 1mm;
+ cray = 4u;
+ clen = 27u;
+ chig = 12u;
+ cfra = 1.3;
+ cang = 15;
+ theta = 38;
+ ray = 65u;
+ delta = 12u;
+ vlen = 39u;
+ tray = 0.3ray;
+ z1 = (-clen/2,0);
+ z2 = (-clen/2+cray,chig);
+ z3 = (cray,chig);
+ z4 = (clen/2,1.5*cray);
+ z5 = (clen/2,0);
+ z6 = (-clen/2+cfra*cray,0);
+ z7 = (clen/2-cfra*cray,0);
+ z8 = (ray,0);
+ z9 = (ray+delta,0);
+ z10 = (0,ray);
+ z11 = ray*(sind(theta),cosd(theta));
+ z12 = z11+vlen*(cosd(theta),-sind(theta));
+ cpat = z1{up}..{right}z2--z3{right}..z4..{down}z5{left}...{left}z1;
+% dotlabels( 1,2,3,4,5);
+ fall = z11{dir(-theta)}..{dir(-85)}z9;
+ vpat = z11--z12;
+ rpat = origin--z11;
+ tpat = (halfcircle cutafter (origin--up)) scaled (2ray);
+ apat = ((halfcircle cutafter (origin--up))
+ cutbefore rpat) scaled (2tray);
+ draw cpat;
+ filldraw fullcircle scaled cray shifted z6;
+ filldraw fullcircle scaled cray shifted z7;
+ cpic = currentpicture;
+ currentpicture := nullpicture;
+ draw z9--tpat;
+ draw fall dashed evenly;
+ drawarrow vpat;
+ drawarrow rpat;
+ draw apat;
+ draw cpic rotated (-cang)
+ shifted ((ray+0.5cray)*(sind(cang),cosd(cang)));
+ draw origin--z10 dashed evenly;
+ label.top(btex $\theta$ etex scaled 2, point 0.5 of apat );
+ label.top(btex $l$ etex scaled 2, 0.5[z8,z9] );
+ label.lrt(btex $R$ etex scaled 2, point 0.5 of rpat );
+ label.urt(btex $\vec{v}_0$ etex scaled 2, point 0.5 of vpat );
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/profaux.mp b/graphics/metapost/contrib/macros/featpost/example/profaux.mp
new file mode 100644
index 0000000000..d9f8b5fbf9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/profaux.mp
@@ -0,0 +1,70 @@
+% profaux.mp
+% L. Nobre G.
+% 2005
+
+beginfig(1);
+ numeric u, penbig, pensma, aangle, barhei, cirray, ularg, umarg, xhei, xcen;
+ numeric atray;
+ u = 1cm;
+ cirray = 5u;
+ atray = 6.7u;
+ aangle = 33;
+ penbig = 1.85u;
+ pensma = 0.75u;
+ barhei = -1u;
+ ularg = penbig-pensma;
+ umarg = 0.5*pensma;
+ color cux, coa;
+ cux = 0.78red;
+ coa = 0.78green;
+ pen bigpen, smapen;
+ bigpen = pencircle scaled penbig;
+ smapen = pencircle scaled pensma;
+ path theu;
+ z11 = (-0.5*ularg,0.5*ularg+umarg);
+ z12 = ( 0.5*ularg,0.5*ularg+umarg);
+ theu = (z11--(halfcircle scaled ularg rotated 180)--z12);
+ draw theu;
+ xhei = ularg+umarg;
+ xcen = 0.5*umarg;
+ z13 = (ularg+1.5*pensma)*right + xcen*up;
+ z14 = z13 + 0.5*(ularg,xhei);
+ z15 = z13 - 0.5*(ularg,xhei);
+ z16 = z13 + 0.5*(-ularg,xhei);
+ z17 = z13 - 0.5*(-ularg,xhei);
+ draw (z14--z15);
+ draw (z16--z17);
+ picture tmpic;
+ tmpic = currentpicture;
+ currentpicture := nullpicture;
+ path horba, theci, lsid, rsid;
+ theci = fullcircle scaled (2*cirray);
+ z2 = atray*up;
+ z1 = z2 - 2*atray*dir(90-0.5*aangle);
+ z3 = z2 + 2*atray*dir(0.5*aangle-90);
+ z5 = barhei*up;
+ z4 = z5 + cirray*left;
+ z6 = z5 + cirray*right;
+ z18= (z2--z1) intersectionpoint theci;
+ z19= (z2--z3) intersectionpoint theci;
+ lsid = z18--z1;
+ rsid = z19--z3;
+ z7 = (z4--z5) intersectionpoint lsid;
+ z8 = (z5--z6) intersectionpoint rsid;
+ horba = z7--z8;
+ z9 = (z7--z1) intersectionpoint theci;
+ z10= (z8--z3) intersectionpoint theci;
+ drawoptions( withpen bigpen withcolor coa );
+ draw theci;
+ draw z18--z9;
+ draw z19--z10;
+ draw horba;
+ draw tmpic shifted (z10+umarg*(right+down)) withpen smapen withcolor cux;
+% drawoptions( withcolor blue );
+% dotlabels.top(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
+endfig;
+end.
+
+
+
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/project.mp b/graphics/metapost/contrib/macros/featpost/example/project.mp
new file mode 100644
index 0000000000..34d4e7e4b1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/project.mp
@@ -0,0 +1,74 @@
+% project.mp
+% L. Nobre G.
+% 2013
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ ahangle := 30;
+ numeric angthe, angalf, angpsi, xtopo, ytopo, xpoin;
+ numeric radthe, radalf, radpsi, extenfac;
+ numeric ysize, xsize, margs, units, parac, i, dim;
+ pair vzer, incl, hori, topo;
+ path parab, plani, veloc, xaxis, yaxis, auxil;
+ pen thick, usual, vthin;
+angpsi = -13;
+extenfac = 1.2;
+ dim = 50;
+ units = 1mm;
+ margs = 8units;
+ xsize = 70units;
+ ysize = 40units;
+ radthe = 34units;
+ radalf = 46units;
+ radpsi = 22units;
+ thick = pencircle scaled 0.5units;
+ usual = pencircle scaled 0.2units;
+ vthin = pencircle scaled 0.1units;
+ xtopo = xsize/2-margs;
+ ytopo = ysize-2*margs;
+ parac = ytopo/(xtopo*xtopo);
+ yaxis = ( 0, -margs/2 )--( 0, ysize-margs );
+ xaxis = ( -margs, 0 )--( xsize-margs, 0 );
+ plani = (margs*( -cosd( angpsi ), -sind( angpsi ) ) )
+ --(extenfac*( 2*xtopo, 2*xtopo*sind( angpsi )/cosd( angpsi ) ) );
+ topo = ( xtopo, ytopo );
+ parab = origin;
+ for i = 1 upto extenfac*dim:
+ xpoin := 2*i*xtopo/dim;
+ parab := parab..(xpoin,ytopo-parac*(xpoin-xtopo)*(xpoin-xtopo));
+ endfor;
+ ypart( vzer ) = ytopo;
+ vzer = whatever*( direction 0 of parab );
+ veloc = origin--vzer;
+ hori = ( 2*xtopo, 0 );
+ incl = plani intersectionpoint reverse parab;
+ auxil = origin--topo;
+ pickup thick;
+ draw parab cutafter reverse plani;
+ drawarrow veloc;
+ pickup usual;
+ drawarrow xaxis;
+ drawarrow yaxis;
+ draw plani;
+ draw parab cutbefore reverse plani dashed evenly;
+% draw auxil dashed evenly;
+ pickup vthin;
+ draw fullcircle scaled radthe cutafter veloc;
+% draw fullcircle scaled radalf cutafter auxil;
+ draw fullcircle scaled radpsi cutafter plani;
+
+ dotlabel.urt( btex $H$ etex, hori );
+ dotlabel.urt( btex $I$ etex, incl );
+% dotlabel.top( btex $T$ etex, topo );
+ label.bot( btex $x$ etex, point 1 of xaxis );
+ label.lft( btex $y$ etex, point 1 of yaxis );
+ label.lft( btex $\vec{v}_0$ etex, vzer );
+ label.urt( btex $\Theta$ etex, ( radthe/2, 0 ) );
+% label.urt( btex $\alpha$ etex, ( radalf/2, 0 ) );
+ label.urt( btex $\Psi$ etex, ( radpsi/2, 0 ) );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/qap.mp b/graphics/metapost/contrib/macros/featpost/example/qap.mp
new file mode 100644
index 0000000000..c44419afd9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/qap.mp
@@ -0,0 +1,117 @@
+% qap.mp
+% L. Nobre G.
+% IYP (2005)
+
+def PickColor =
+ ( uniformdeviate(1) , uniformdeviate(1), uniformdeviate(1) )
+enddef;
+
+numeric HalfSideLength, ThinnessFactor;
+numeric ThicknesFactor, BorderThFactor;
+
+HalfSideLength = 10mm;
+ThicknesFactor = 0.17; % Maximum TraceThickness over Half Side
+ThinnessFactor = 0.12; % Minimum TraceThickness over Half Side
+BorderThFactor = 1.35; % Borders over TraceThickness
+
+def RandomStep =
+ begingroup
+ numeric margin;
+ margin = ThicknesFactor-ThinnessFactor;
+ ThinnessFactor*HalfSideLength + uniformdeviate( margin*HalfSideLength )
+ endgroup
+enddef;
+
+def PickInteger( expr MaxNum ) =
+ begingroup
+ save aux;
+ numeric aux;
+ aux = floor( uniformdeviate( MaxNum+0.995 ) );
+ ( aux )
+ endgroup
+enddef;
+
+vardef LocateIndex[] =
+ dotlabel.urt( str @, z@ )
+enddef;
+
+beginfig(1);
+ numeric QNum;
+ QNum = 5 + PickInteger( 5 );
+ numeric tracethickness, i, j, k, angadd, aa, ax, ay;
+ tracethickness = RandomStep;
+ pen tracepen, bordepen;
+ color TheColor;
+ tracepen = pencircle scaled tracethickness;
+ bordepen = tracepen scaled BorderThFactor;
+ path qpath;
+ aa = 360/QNum;
+ ax = HalfSideLength*2*cosd(0.5*aa);
+ ay = HalfSideLength*2*sind(0.5*aa);
+ z0 = (ax,0);
+ z1 = (0,ay);
+ z2 = (-ax,0);
+ z3 = (0,-ay);
+ z4 = z0;
+ qpath = z0--z1--z2--z3--cycle;
+ angadd = uniformdeviate( 20 );
+ TheColor = PickColor;
+ pair Dir[], pos[];
+ boolean Filled[];
+ for i = 0 upto 11:
+ j := floor( i/3 );
+ Dir[i] = dir(angle(z[j+1]-z[j])+80+angadd);
+ Filled[i] = false;
+ pos[i] = (0.25*(i-3*j+1))[z[j],z[j+1]];
+ endfor;
+% for i=0 upto 5:
+% LocateIndex[i];
+% endfor;
+ numeric ThisInd, ThatInd;
+ path ActualPath;
+ for i=1 step 2 until 11:
+ forever:
+ ThisInd := PickInteger( 11 );
+ exitunless Filled[ThisInd];
+ endfor;
+ Filled[ThisInd] := true;
+ forever:
+ ThatInd := PickInteger( 11 );
+ exitunless Filled[ThatInd];
+ endfor;
+ Filled[ThatInd] := true;
+ ActualPath := pos[ThisInd]{Dir[ThisInd]}...pos[ThatInd]{-Dir[ThatInd]};
+% draw ActualPath withcolor background withpen bordepen;
+ draw ActualPath withcolor TheColor withpen tracepen;
+ endfor;
+% draw qpath;
+% clip currentpicture to qpath;
+ pair urCorner, ulCorner, llCorner, lrCorner, cent;
+ path FinalCut;
+ urCorner = ( 8.13in, 11.533in );
+ llCorner = ( 0.118in, 35.5bp );
+ ulCorner = ( xpart llCorner, ypart urCorner );
+ lrCorner = ( xpart urCorner, ypart llCorner );
+ FinalCut = urCorner--ulCorner--llCorner--lrCorner--cycle;
+ cent = 0.25*(urCorner+ulCorner+llCorner+lrCorner);
+ picture Tile[];
+ for i=0 upto 1:
+ Tile[i] = currentpicture rotated (i*180);
+ endfor;
+ currentpicture := nullpicture;
+ pair pairh, pairv;
+ for k = 1 upto QNum:
+ pairh := HalfSideLength*2*dir((k-1)*aa);
+ pairv := HalfSideLength*2*dir(k*aa);
+ for i = 0 upto 11:
+ for j = 0 upto 11:
+ draw Tile[PickInteger( 1 )]
+ rotated ((k-0.5)*aa)
+ shifted ( cent + ax*dir((k-0.5)*aa) + i*pairh + j*pairv );
+ endfor;
+ endfor;
+ endfor;
+ clip currentpicture to FinalCut;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/quartertorus.mp b/graphics/metapost/contrib/macros/featpost/example/quartertorus.mp
new file mode 100644
index 0000000000..0d2ca4da09
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/quartertorus.mp
@@ -0,0 +1,77 @@
+% quartertorus.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+prologues := 3;
+
+verbatimtex
+\documentclass{article}
+\usepackage{mathpazo}
+\begin{document}
+etex
+
+f := (3,5,2.5);
+
+beginfig(1);
+ color a, b, c, g, h, i, j, l, m, n;
+ numeric fac, siz, s;
+ fac = 0.05;
+ siz = 0.3;
+ s = 2;
+ a = blue-red;
+ b = g-fac*a;
+ c = -a-fac*g;
+ g = -green;
+ h = 2*g;
+ i = red+g;
+ j= -red;
+ l = blue;
+ m = 0.6red-g;
+ n = -0.7*blue;
+ drawoptions( withpen pencircle scaled 2.5pt );
+ quartertorus( black, h, i, siz );
+ quartertorus( black, g, a, siz );
+ quartertorus( black, b, c, siz );
+ quartertorus( black, -g, j, siz );
+ quartertorus( n, l, m, siz );
+ label( btex $a$ etex scaled s, rp( a ) );
+ label.llft( btex $b$ etex scaled s, rp( b ) );
+ label( btex $c$ etex scaled s, rp( c ) );
+ label.urt( btex $g$ etex scaled s, rp( g ) );
+ label( btex $-g$ etex scaled s, rp( -g ) );
+ label( btex $h$ etex scaled s, rp( h ) );
+ %label( btex $i$ etex scaled s, rp( i ) );
+ label( btex $j$ etex scaled s, rp( j ) );
+ label( btex $l$ etex scaled s, rp( l+n ) );
+ label( btex $m$ etex scaled s, rp( m+n ) );
+endfig;
+
+beginfig(2);
+ color col[];
+ numeric ray, ang, len, bigray;
+ ray = 0.15;
+ bigray = 0.4;
+ ang = 60;
+ len = 0.7;
+ col1 = (-(ray+bigray)/cosd(ang),0,0);
+ col2 = (bigray*cosd(ang),0,bigray*sind(ang));
+ col3 = (bigray*cosd(ang),0,-bigray*sind(ang));
+ col4 = ((ray+bigray)*cosd(ang),0,(ray+bigray)*sind(ang));
+ col5 = ((ray+bigray)*cosd(ang),0,-(ray+bigray)*sind(ang));
+ col6 = (-len*sind(ang),0,len*cosd(ang));
+ col7 = (-len*sind(ang),0,-len*cosd(ang));
+ col8 = col1+col4+col6;
+ col9 = col1+col5+col7;
+ rigorousdisc( 0, true, col1+col3, ray, col7 );
+ rigorousdisc( 0, true, col1+col2, ray, col6 );
+ quartertorus( col1, col3, col2, ray );
+ draw rp(col9)--rp(black)--rp(col8);
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/radiativeforcing.mp b/graphics/metapost/contrib/macros/featpost/example/radiativeforcing.mp
new file mode 100644
index 0000000000..8fd32ca3b0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/radiativeforcing.mp
@@ -0,0 +1,243 @@
+%
+% fig2dev (version 3.2.5-alpha7) -L (m)mp version 0.05 --- Preamble
+%
+
+%
+% mp output driver options:
+% -L mp
+%
+
+% +MP-ADDITIONAL-HEADER
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+% -MP-ADDITIONAL-HEADER
+
+
+%SetFigFont macros for latex
+verbatimtex
+%
+\begingroup\makeatletter\ifx\SetFigFontNFSS\undefined%
+\gdef\SetFigFontNFSS#1#2#3#4#5{%
+ \reset@font\fontsize{#1}{#2pt}%
+ \fontfamily{#3}\fontseries{#4}\fontshape{#5}%
+ \selectfont}%
+\fi\endgroup%
+\ifx\SetFigFontSize\undefined%
+\gdef\SetFigFontSize#1#2{%
+ \fontsize{#1}{#2pt}%
+ \selectfont}%
+\fi%
+etex
+
+% Now draw the figure
+beginfig(0)
+% Some reasonable defaults
+ labeloffset:=0;
+ truecorners:=1;
+ bboxmargin:=0;
+% Begin ellipse object
+ pickup pencircle scaled 0.94;
+ path c;
+ c = fullcircle scaled 1638.80 yscaled 1.00
+ rotated 0.00 shifted (428.03,-242.65);
+ fill c withcolor ((0.53,0.81,1.00) + 0.00white);
+ draw c withcolor (0.53,0.81,1.00);
+% End ellipse object
+% Begin ellipse object
+ pickup pencircle scaled 0.94;
+ path c;
+ c = fullcircle scaled 1126.68 yscaled 1.00
+ rotated 0.00 shifted (428.03,-242.65);
+ fill c withcolor ((0.00,0.69,0.00) + 0.00white);
+ draw c withcolor (0.00,0.69,0.00);
+% End ellipse object
+% Begin ellipse object
+ pickup pencircle scaled 0.94;
+ path c;
+ c = fullcircle scaled 141.73 yscaled 1.00
+ rotated 0.00 shifted (147.40,650.27);
+ fill c withcolor ((1.00,1.00,0.00) + 0.00white);
+ draw c withcolor (1.00,1.00,0.00);
+% End ellipse object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (155.91, 568.06)
+ --(238.11, 301.61);
+ draw p withcolor (1.00,1.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (231.94, 311.87)
+ --(237.17, 304.57)
+ --(237.35, 313.57)
+ --(231.94, 311.87) -- cycle;
+ fill arr withcolor (1.00,1.00,0.00);
+ draw arr withcolor (1.00,1.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (184.25, 573.73)
+ --(260.79, 315.78);
+ draw p withcolor (1.00,1.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (254.74, 326.17)
+ --(259.91, 318.80)
+ --(260.16, 327.81)
+ --(254.74, 326.17) -- cycle;
+ fill arr withcolor (1.00,1.00,0.00);
+ draw arr withcolor (1.00,1.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (212.60, 596.41)
+ --(286.30, 321.45);
+ draw p withcolor (1.00,1.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (280.50, 331.97)
+ --(285.48, 324.47)
+ --(285.98, 333.48)
+ --(280.50, 331.97) -- cycle;
+ fill arr withcolor (1.00,1.00,0.00);
+ draw arr withcolor (1.00,1.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (121.89, 562.39)
+ --(204.09, 293.10);
+ draw p withcolor (1.00,1.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (197.98, 303.37)
+ --(203.21, 296.06)
+ --(203.40, 305.07)
+ --(197.98, 303.37) -- cycle;
+ fill arr withcolor (1.00,1.00,0.00);
+ draw arr withcolor (1.00,1.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (351.50, 344.13)
+ --(606.61, 774.99);
+ draw p withcolor (1.00,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (603.09, 763.53)
+ --(605.04, 772.28)
+ --(598.24, 766.43)
+ --(603.09, 763.53) -- cycle;
+ fill arr withcolor (1.00,0.00,0.00);
+ draw arr withcolor (1.00,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (311.81, 332.79)
+ --(572.60, 766.49);
+ draw p withcolor (1.00,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (568.94, 755.15)
+ --(570.96, 763.84)
+ --(564.09, 758.05)
+ --(568.94, 755.15) -- cycle;
+ fill arr withcolor (1.00,0.00,0.00);
+ draw arr withcolor (1.00,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (391.18, 346.96)
+ --(513.07, 545.39)
+ --(632.13, 352.63);
+ draw p withcolor (1.00,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (623.56, 361.07)
+ --(630.49, 355.28)
+ --(628.41, 364.03)
+ --(623.56, 361.07) -- cycle;
+ fill arr withcolor (1.00,0.00,0.00);
+ draw arr withcolor (1.00,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (428.03, 349.80)
+ --(549.92, 536.88)
+ --(615.12, 434.83);
+ draw p withcolor (1.00,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path arr;
+ arr = (606.43, 443.15)
+ --(613.42, 437.48)
+ --(611.21, 446.17)
+ --(606.43, 443.15) -- cycle;
+ fill arr withcolor (1.00,0.00,0.00);
+ draw arr withcolor (1.00,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 2.83;
+ path p;
+ p = (2.83, 789.17)
+ --(839.06, 789.17)
+ --(839.06, 202.39)
+ --(2.83, 202.39)--cycle;
+ picture tmppic;
+ tmppic = currentpicture;
+ currentpicture := nullpicture;
+ clip tmppic to p;
+ draw tmppic;
+% End polyline object
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/raiodoscirculos.mp b/graphics/metapost/contrib/macros/featpost/example/raiodoscirculos.mp
new file mode 100644
index 0000000000..27974ecb0e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/raiodoscirculos.mp
@@ -0,0 +1,97 @@
+% raiodoscirculos.mp
+% L. Nobre G.
+% 2014
+
+beginfig(1);
+ numeric u, r, p;
+ u = 2cm;
+ r = 2/(3+sqrt(7));
+ p = u/40;
+ pen mypen;
+ mypen = pencircle scaled p;
+ drawoptions( withpen mypen );
+ path mysquare, halcir, fulcir;
+ mysquare = origin--right--(right+up)--up--cycle;
+ halcir = halfcircle scaled 2r shifted (r*right);
+ fulcir = fullcircle scaled 2r shifted ((1-r)*(right+up));
+ draw mysquare scaled u;
+ draw halcir scaled u;
+ draw fulcir scaled u;
+endfig;
+
+beginfig(2);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ r := (sqrt(5)-1)/2;
+ halcir := halfcircle shifted (right/2);
+ draw halcir scaled u;
+ path quarcirc;
+ quarcirc = (halfcircle cutafter (origin--up)) rotated 180;
+ draw quarcirc scaled 2r shifted (right+up) scaled u;
+endfig;
+
+beginfig(3);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ draw halcir scaled u;
+ r := 2-sqrt(3);
+ draw fullcircle scaled 2r shifted ((1-r)*(right+up)) scaled u;
+endfig;
+
+beginfig(4);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ draw halcir scaled u;
+ r := 1/3;
+ path secondhalfcircle;
+ secondhalfcircle = halfcircle scaled 2r rotated 90 shifted (1,1-r);
+ draw secondhalfcircle scaled u;
+endfig;
+
+beginfig(5);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ r := sqrt(2)-1;
+ draw quarcirc scaled 2 shifted (right+up) scaled u;
+ draw quarcirc rotated 180 scaled (2r*u);
+endfig;
+
+beginfig(6);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ r := 1/4;
+ halcir := halfcircle scaled 0.5 shifted (r*right);
+ draw halcir scaled u;
+ draw quarcirc scaled 2 shifted (right+up) scaled u;
+endfig;
+
+beginfig(7);
+ drawoptions( withpen mypen );
+ path thisquare;
+ thisquare = mysquare scaled u;
+ draw thisquare;
+ r := (sqrt(7)-1)/3;
+ halcir := (halfcircle scaled 2r shifted (r*right)) cutbefore mysquare;
+ draw halcir scaled u;
+ draw quarcirc scaled 2r shifted (right+up) scaled u;
+endfig;
+
+beginfig(8);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ r := 1/(1+sqrt(2));
+ draw quarcirc rotated 180 scaled (2r*u);
+ draw fullcircle scaled 2r shifted ((1-r)*(right+up)) scaled u;
+endfig;
+
+beginfig(9);
+ drawoptions( withpen mypen );
+ draw mysquare scaled u;
+ r := 1/(1+sqrt(2));
+ halcir := halfcircle scaled 2r shifted (r*right);
+ draw halcir scaled u;
+ secondhalfcircle := halfcircle scaled 2r rotated 90 shifted (1,1-r);
+ draw secondhalfcircle scaled u;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/redplanet.mp b/graphics/metapost/contrib/macros/featpost/example/redplanet.mp
new file mode 100644
index 0000000000..934573851b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/redplanet.mp
@@ -0,0 +1,137 @@
+% redplanet.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+f := (4,0,-1);
+def cf( expr Pair ) =
+ begingroup
+ save xc, yc, xa, ya;
+ numeric xc, yc, xa, ya;
+ xc = xpart Pair;
+ yc = ypart Pair;
+ xa = 1.25*(xc+1);
+ ya = 1.25*(yc+1);
+ ( rp( ( cosd(ya)*cosd(xa), cosd(ya)*sind(xa), sind(ya) ) ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u;
+ color yellow, thered, theblue;
+ path martelo, foice, monitor, ecran, mar, foi, rotfoi, rotmar, pa, pb, pc;
+ u = 1pt;
+ yellow = 0.87*(0.95*red+0.7*green);
+ thered = 0.66red;
+ theblue= 0.87*(0.95*blue+0.27*red);
+
+ numeric cabosal, cabesal, cabolar, cabelar;
+ numeric cabolen, cabeclen, cabecontrol, martelrot;
+ pair martelpos;
+ cabosal = 2u;
+ cabesal = 6u;
+ cabolar = 8u;
+ cabelar = 10u;
+ cabolen = 70u;
+ cabeclen = 7u;
+ cabecontrol = 4u;
+ martelrot = 50;
+ martelpos = dir(180)*0.03*cabolen;
+ z100 = origin;
+ z101 = ( cabesal, 0 );
+ z102 = ( cabesal, cabosal+cabelar-cabolen );
+ z103 = ( cabesal+cabolar, cabosal+cabelar-cabolen );
+ z104 = ( cabesal+cabolar, 0 );
+ z105 = ( cabesal+cabolar+cabeclen, 0 );
+ z106 = ( cabesal+cabolar+cabecontrol, cabelar );
+ z107 = ( cabesal+cabolar, cabelar );
+ z108 = ( cabesal+cabolar, cabelar+cabosal );
+ z109 = ( cabesal, cabelar+cabosal );
+ z110 = ( cabesal, cabelar );
+ z111 = ( 0, cabelar );
+ martelo = z100--
+ z101--
+ z102--
+ z103--
+ z104--
+ z105..controls z106 and 0.5[z106,z107]..
+ z107--
+ z108--
+ z109--
+ z110--
+ z111--cycle;
+ mar = martelo rotated martelrot shifted martelpos;
+
+ numeric fcabolen, fcabolar, foicecontrol, laminang;
+ numeric foicerot, foicaber, flamilar, fcabomar, refang;
+ numeric fmaomarg, fmaorais, fmaospac, fprotrud, basangul;
+ pair foicepos;
+ laminang = 9;
+ refang = 10;
+ basangul = 23;
+ fcabomar = 3u;
+ fcabolar = 8u - fcabomar;
+ flamilar = 4u;
+ fcabolen = 22u;
+ foicecontrol = 2u;
+ fmaomarg = 6u;
+ fmaorais = 2u;
+ fmaospac = 14u;
+ fprotrud = 25u;
+ foicaber = 42u;
+ foicerot = -50;
+ foicepos = dir(270)*0.325*foicaber;
+ z200 = origin;
+ z201 = ( -fcabomar, 0 );
+ z202 = ( -fcabomar, -fcabolen );
+ z203 = ( fcabolar, -fcabolen );
+ z204 = ( fcabolar+foicecontrol, -fcabolen );
+ z205 = ( fcabolar+fmaomarg, fmaorais-fmaospac );
+ z206 = ( fcabolar, -fmaospac );
+ z207 = ( fcabolar, 0 );
+ z208 = ( -fprotrud, foicaber );
+ z209 = ( 0, flamilar );
+ foice = z200--
+ z201--
+ z202--
+ z203..controls z204 and 0.5[z204,z205]..
+ z205{dir(-160)}..{left}
+ z206--
+ z207{dir(basangul)}..tension 0.8..{dir(180+refang+laminang)}
+ z208{dir(refang-laminang)}..tension 0.8..{dir(180+basangul)}
+ z209--cycle;
+% draw foice;
+% dotlabels.top(203,204,205);
+ foi = foice rotated foicerot shifted foicepos;
+
+ numeric l, k;
+% k = length foi;
+% l = length mar;
+% show (k,l);
+ rotfoi = startahead( foi, 6 );
+ rotmar = startahead( mar, 1 );
+% drawarrow subpath (0,1) of rotfoi withpen pencircle scaled 1pt withcolor red;
+% drawarrow subpath (0,1) of rotmar withpen pencircle scaled 1pt withcolor red;
+
+ fill rigorousfearpath( black, 1 ) withcolor thered;
+ pa = crossingline(rotfoi,rotmar,0.001);
+ pb = closedpathinspace( pa, 16, cf );
+ pc = closedpathinspace( lasermachine(pa,3pt,0.3), 16, cf );
+ fill pc withcolor theblue;
+ fill pb withcolor yellow;
+
+% fill rotfoi withcolor yellow+thered;
+% fill rotmar withcolor 0.7blue;
+
+ produce_auto_scale;
+
+% for l=0 step 15 until 360:
+% show angle(dir(l));
+% endfor;
+endfig;
+
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/reeditedgoodquestionmark.mp b/graphics/metapost/contrib/macros/featpost/example/reeditedgoodquestionmark.mp
new file mode 100644
index 0000000000..335edcb713
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/reeditedgoodquestionmark.mp
@@ -0,0 +1,102 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+beginfig(1);
+linecap := butt;
+linejoin := mitered;
+color thisone;
+thisone = 0.89(red+blue);
+pickup pencircle scaled 5pt;
+drawoptions( withcolor thisone );
+filldraw (195,530.844)..controls (194,530.601) and (189.028,529.735)..(184.031,528.933)
+ ..controls (160.022,525.082) and (142.601,518.642)..(132.966,510.056)
+ ..controls (130.528,507.884) and (126.845,505.26)..(124.678,504.152)
+ ..controls (115.044,499.224) and (91.4084,469.097)..(83.408,451.547)
+ ..controls (66.5737,414.619) and (66.9285,381.467)..(84.3374,364.679)
+ ..controls (92.625,356.687) and (97.4766,357.767)..(90.2266,365.99)
+ ..controls (73.2048,385.297) and (71.7183,405.6)..(84.7207,441.188)
+ ..controls (99.7271,482.259) and (141.832,518.625)..(180.984,524.329)
+ ..controls (244.987,523.896) and (256.669,521.674)..(268.734,519.947)
+ ..controls (292.744,516.51) and (334.881,498.66)..(338.69,496.672)
+ ..controls (376.837,476.77) and (405.55,442.959)..(406.819,416.447)
+ ..controls (408.823,374.609) and (371.353,343.266)..(297.375,324.9)
+ ..controls (263.494,316.488) and (250.776,311.818)..(249.303,307.247)
+ ..controls (248.367,304.34) and (255.869,279.337)..(268.611,242.897)
+ ..controls (271.04,235.95) and (274.116,225.037)..(275.498,218.461)
+ ..controls (276.882,211.88) and (278.513,204.947)..(279.155,202.922)
+ ..controls (279.795,200.9) and (281.1,194.634)..(282.074,188.906)
+ ..controls (284.296,175.845) and (284.091,175.611)..(269.831,174.957)
+ ..controls (247.097,173.915) and (235.95,171.325)..(210.844,161.254)
+ ..controls (203.166,158.174) and (199.133,155.911)..(198.871,154.537)
+ ..controls (198.311,151.595) and (203.653,151.668)..(210.112,154.689)
+ ..controls (234.244,165.977) and (259.768,171.819)..(277.753,170.169)
+ ..controls (288.844,169.152) and (290.062,169.692)..(290.062,175.622)
+ ..controls (290.062,183.808) and (277.33,239.484)..(273.368,248.625)
+ ..controls (270.621,254.962) and (254.719,302.351)..(254.719,304.2)
+ ..controls (254.719,308) and (275.559,315.337)..(308.344,323.08)
+ ..controls (398.409,344.349) and (437.595,404.251)..(396.529,457.884)
+ ..controls (389.064,467.634) and (373.547,482.865)..(366.234,487.62)
+ ..controls (363.553,489.364) and (358.069,492.902)..(354.047,495.483)
+ ..controls (350.025,498.063) and (345.089,501.08)..(343.078,502.186)
+ ..controls (341.006,503.325) and (337.837,505.05)..(335.766,506.167)
+ ..controls (318.953,515.225) and (290.794,523.811)..(264.469,527.906)
+ ..controls (250.575,530.067) and (200.517,532.184)..(195,530.844)
+ --cycle;
+filldraw (207.919,482.644)
+ ..controls (190.49,480.417) and (174.226,468.547)..(166.644,452.522)
+ ..controls (158.769,435.876) and (162.565,402.675)..(176.05,370.256)
+ ..controls (176.557,369.037) and (176.421,368.062)..(175.744,368.062)
+ ..controls (155.391,368.062) and (107.786,376.341)..(104.962,380.372)
+ ..controls (103.031,383.127) and (97.9873,383.353)..(91.4062,380.979)
+ ..controls (85.0771,378.697) and (85.1904,375.807)..(91.6499,374.761)
+ ..controls (94.5247,374.296) and (106.519,372.042)..(118.219,369.769)
+ ..controls (129.919,367.496) and (145.874,365.09)..(153.562,364.439)
+ ..controls (169.65,363.078) and (183.916,360.511)..(190.247,357.837)
+ ..controls (195.853,355.469) and (201.463,358.246)..(196.95,361.155)
+ ..controls (180.512,371.751) and (173.322,386.587)..(168.735,419.372)
+ ..controls (159.784,483.356) and (238.737,502.071)..(302.372,451.048)
+ ..controls (337.594,422.807) and (344.183,400.627)..(327.098,367.819)
+ ...(309.562,351.174)
+ ...(245.578,316.83)
+ ..controls (184.519,293.169) and (164.516,279.869)..(166.279,264.103)
+ ..controls (167.475,253.397) and (174.636,230.831)..(182.406,213.281)
+ ..controls (186.11,204.913) and (192.253,190.247)..(196.036,180.74)
+ ..controls (200.934,168.431) and (203.485,163.419)..(204.872,163.382)
+ ..controls (210.979,163.217) and (208.414,171.112)..(186.009,221.447)
+ ..controls (176.46,242.897) and (170,265.054)..(171.867,269.953)
+ ..controls (175.621,279.807) and (203.287,295.989)..(240.094,309.859)
+ ..controls (247.162,312.523) and (254.8,315.411)..(257.156,316.313)
+ ..controls (266.722,319.972) and (293.962,335.564)..(305.053,343.729)
+ ..controls (323.095,360.133) and (325.242,360.506)..(330.599,368.428)
+ ..controls (344.446,388.903) and (345.294,408.567)..(333.207,428.878)
+ ..controls (328.783,436.312) and (317.602,448.621)..(310.659,453.7)
+ ..controls (308.208,455.492) and (303.286,459.626)..(299.508,463.064)
+ ..controls (295.364,466.834) and (285.776,470.003)..(284.456,470.93)
+ ..controls (273.975,478.287) and (222.257,488.798)..cycle;
+filldraw (245.578,139.528)..controls (197.072,122.423) and (188.173,72.8887)..(232.537,66.9353)
+ ..controls (260.447,63.1902) and (291.088,75.9546)..(303.276,96.4031)
+ ..controls (307.416,103.35) and (305.387,112.123)..(298.837,115.594)
+ ..controls (297.619,116.24) and (295.869,118.219)..(294.9,120.047)
+ ..controls (292.05,125.425) and (276.291,130.802)..(263.981,130.596)
+ ..controls (255.572,130.456) and (254.418,128.462)..(262.275,127.647)
+ ..controls (282.75,125.524) and (301.914,109.731)..(297.378,98.7188)
+ ..controls (294.129,90.8328) and (276.047,78.313)..(262.884,74.8367)
+ ..controls (221.081,63.7959) and (195.092,89.2812)..(220.011,116.878)
+ ..controls (235.529,134.062) and (261.064,142.538)..(275.803,135.397)
+ ..controls (281.653,132.562) and (284.6,132.206)..(285.824,134.184)
+ ..controls (289.847,140.69) and (260.081,144.642)..(245.578,139.528)
+ --cycle;
+draw origin--(480,0)--(480,600)--(0,600) withcolor white;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/resistcircuit.mp b/graphics/metapost/contrib/macros/featpost/example/resistcircuit.mp
new file mode 100644
index 0000000000..8b44ffd25f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/resistcircuit.mp
@@ -0,0 +1,66 @@
+% resistcircuit.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+beginfig(1);
+ boolean kind[];
+ numeric largmolas, lengmolas, numolas, numturns, u, i, fraction, stepx;
+ numeric totalx, totaly, actuax, actuay, numparal, numserie, stepy;
+ path refpath;
+ pair refpoint, startpoint, ini, fin;
+ pickup pencircle scaled 2pt;
+ fraction = 0.6;
+ numolas = 9;
+ u = 2mm;
+ largmolas = 2u;
+ lengmolas = 12u;
+ numturns = 10;
+ actuax = 1;
+ actuay = 1;
+ numparal = 0;
+ numserie = 1;
+ stepy = largmolas/fraction;
+ stepx = 0.5*(1-fraction)*lengmolas;
+ draw (left*stepx)--origin;
+ for i=2 upto numolas:
+ if uniformdeviate(2) > 1:
+ kind[i] = false;
+ numserie := incr( numserie );
+ else:
+ kind[i] = true;
+ numparal := incr( numparal );
+ fi;
+ endfor;
+ totalx = numserie*lengmolas;
+ totaly = numparal*stepy;
+ draw (right*totalx)--(right*(totalx+stepx));
+ startpoint = (up*0.5*totaly);
+ refpoint = startpoint;
+ draw (down*0.5*totaly)--refpoint;
+ refpath = springpath(origin,right*lengmolas,numturns,largmolas,fraction);
+ draw refpath shifted refpoint;
+ refpoint := refpoint + right*lengmolas;
+ for i=2 upto numolas:
+ if kind[i]:
+ ini := startpoint+down*stepy*actuay;
+ fin := ini + 0.5*(actuax-1)*lengmolas*right;
+ draw ini--fin;
+ draw refpath shifted fin;
+ ini := fin + lengmolas*right;
+ fin := ini + 0.5*(actuax-1)*lengmolas*right;
+ draw ini--fin--refpoint;
+ refpoint := refpoint + down*stepy*0.5;
+ actuay := incr( actuay );
+ else:
+ draw refpath shifted refpoint;
+ refpoint := refpoint + right*lengmolas;
+ actuax := incr( actuax );
+ fi;
+ endfor;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/reuleaux.mp b/graphics/metapost/contrib/macros/featpost/example/reuleaux.mp
new file mode 100644
index 0000000000..2bc0763ace
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/reuleaux.mp
@@ -0,0 +1,34 @@
+% reuleaux.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, desv, ray;
+ path rouletri, pathpart, pa, pb, pc, border;
+ u = 150mm;
+ desv = u*sqrt(3)/3;
+ ray = (sqrt(3)/3-0.5)*u/2;
+ pathpart = halfcircle scaled u cutafter (origin--u*dir(60));
+ pathpart := pathpart shifted (desv*dir(-150)/2);
+ pa = pathpart;
+ pb = pathpart rotated 120;
+ pc = pathpart rotated -120;
+ rouletri = pa--pb--pc--cycle;
+ draw rouletri;
+ border=(u/4,u/4)--(-u/4,u/4)--(-u/4,-u/4)--(u/4,-u/4)--cycle;
+ draw border shifted (ray*up);
+endfig;
+
+beginfig(2);
+ draw border withcolor red;
+ numeric i, N, astep;
+ N = 4;
+ astep = 3*N;
+ for i=astep step astep until 360:
+ draw rouletri rotated (-i/3) shifted (ray*dir(i-90));
+ endfor;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/revolipsoid.mp b/graphics/metapost/contrib/macros/featpost/example/revolipsoid.mp
new file mode 100644
index 0000000000..62390d9b93
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/revolipsoid.mp
@@ -0,0 +1,50 @@
+% revolipsoid.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+Spread := 20;
+f := 7.1*(3,5,4);
+ShadowOn := true;
+HoriZon := -5;
+LightSource := 10*(4,-2,4);
+
+beginfig(1);
+ setthestage(30,45);
+ drawoptions( withpen pencircle scaled 1mm );
+ numeric num, r, ste, i, j, aux;
+ r = 1.6;
+ num = 5;
+ aux = 0.5*(num-1);
+ ste = 90/aux;
+ for i=-aux upto aux:
+ for j=-aux upto aux:
+ spheroid((red*j+green*i)*2*(r**aux),(cosd(i*ste),0,sind(i*ste)),r**(-j));
+ endfor;
+ endfor;
+endfig;
+
+ShadowOn := false;
+
+beginfig(2);
+ drawoptions( withpen pencircle scaled 1mm );
+ numeric num, r, ste, i, j, aux, fac;
+ color aim;
+ r = 0.55;
+ fac = 0.6;
+ num = 6;
+ aux = 0.5*(num-1);
+ ste = 90/aux;
+ for i=-aux upto aux:
+ for j=-aux upto aux:
+ aim := N(f-viewcentr)+fac*(i*red+j*green)/aux;
+ spheroid((red*j+green*i)*3*r,aim,r);
+ endfor;
+ endfor;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/revolutionparaboloid.mp b/graphics/metapost/contrib/macros/featpost/example/revolutionparaboloid.mp
new file mode 100644
index 0000000000..a0a29ac22e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/revolutionparaboloid.mp
@@ -0,0 +1,167 @@
+% revolutionparaboloid.mp
+% L. Nobre G.
+% 2014
+
+%outputformat := "png";
+%outputformatoptions := "format=rgb antialias=best";
+%hppp := 0.5;
+%vppp := 0.5;
+
+input featpost3Dplus2D;
+
+%prologues := 1;
+
+f := 0.7*(3,3,-5);
+
+beginfig(1);
+ numeric u, r;
+ color b, t;
+ u = 2mm;
+ b = (-1.0,0.0,0.0);
+ t = (-0.4,0.3,0.9);
+ r = 0.6;
+ drawoptions(withpen pencircle scaled u);
+ revolparab( b, t, r );
+endfig;
+
+def parab( expr xis ) = (0.25*(xis**2)) enddef;
+def oloid( expr xis ) = (1-(xis/2)**2) enddef;
+def deriv( expr xis ) = (0.5*xis) enddef;
+
+beginfig(2);
+ pair pzero, pone;
+ pzero = (-0.5,-5.5);
+ numeric u, delta, n, ste, minx, maxx, itex, tanx, marg, slope, sa, aux;
+ n = 50;
+ marg = 1;
+ u = 5mm;
+ delta = sqrt((xpart pzero)**2-4*(ypart pzero));
+ minx = (xpart pzero)-delta-marg;
+ tanx = (xpart pzero)+delta;
+ maxx = -minx;
+ ste = (maxx-minx)/(n+1);
+ z0 = (minx,parab(minx));
+ z1 = ((xpart pzero)-delta,parab((xpart pzero)-delta));
+ z2 = (tanx,parab(tanx));
+ z3 = 0.5[z1,z2];
+ draw z0 for itex=minx+ste step ste until maxx:
+ --(itex,parab(itex)) endfor withcolor blue;
+ draw pzero--z1--z2--cycle;
+ draw pzero--z3;
+ sa = -angle(z1-z2);
+ slope = sind(sa)/cosd(sa);
+ aux = 2*(-slope+(slope++1));
+ z4 = (aux,parab(aux));
+ z6 = z4+whatever*dir(angle(1,deriv(aux)));
+ aux := 2*(-slope-(slope++1));
+ z5 = (aux,parab(aux));
+ z6 = z5+whatever*dir(angle(1,deriv(aux)));
+ draw z6--z4--z5--cycle withcolor red;
+ %draw up withcolor blue;
+ picture scalpic;
+ scalpic = currentpicture;
+ currentpicture := nullpicture;
+ draw scalpic scaled u withpen pencircle scaled 0;
+endfig;
+
+beginfig(3);
+% ParallelProj := true;
+ f := (7, 6, 5);
+% f := (2, 1, 8);
+% f := (7,6,8);
+% f := (0.05,0,9.5);
+% f := (0,9,0);
+ numeric ray, coneray, angrotparab, angrotfoc, steprotfoc, itex, xzer, yzer;
+ numeric tmpxzero, tmpdelta, tmpxtplu, tmpxtmin, stepx;
+ color focus, tmpxaxis, auxca, auxcb, auxcc, auxcd;
+ pen penone;
+ pair auxa, auxb;
+ penone = pencircle scaled 3mm;
+ xzer = 1;
+ yzer = -0.5;
+ stepx = 0.05;
+ ray = 3;
+ revolparab(blue*parab(ray),black,ray);
+ coneray = 4;
+ steprotfoc = 15;
+ focus = (xzer,0,yzer);
+ for angrotfoc=0 step steprotfoc until 360-steprotfoc:
+ angrotparab := 0.5*angrotfoc;
+ tmpxzero := xzer*cosd(angrotparab);
+ tmpxaxis := (cosd(angrotparab),sind(angrotparab),0);
+ z0 = (minx,parab(minx));
+ draw rp(-ray*tmpxaxis+blue*parab(-ray))
+ for itex=-ray+stepx step stepx until ray:
+ --rp(itex*tmpxaxis+blue*parab(itex)) endfor withcolor blue;
+ tmpdelta := sqrt(tmpxzero**2-4*yzer);
+ tmpxtplu := tmpxzero+tmpdelta;
+ tmpxtmin := tmpxzero-tmpdelta;
+ auxca := tmpxtplu*tmpxaxis+blue*parab(tmpxtplu);
+ auxcb := tmpxtmin*tmpxaxis+blue*parab(tmpxtmin);
+ auxa := rp(auxca);
+ auxb := rp(auxcb);
+ auxcc := auxca-focus;
+ auxcd := auxcb-focus;
+ draw auxa withpen penone;
+ draw auxb withpen penone;
+ endfor;
+ draw rp(focus) withpen penone withcolor green;
+ produce_auto_scale;
+endfig;
+
+beginfig(4);
+ numeric major, minor, focdi, rotaroun, steparoun, ra;
+ color majorc, minorc, focdic, garbac, vertec;
+ major = 4;
+ minor = 2.5;
+ f := (-5,0.5,0.4);
+ steparoun = 20;
+ ra = 0.35;
+ focdi = major +-+ minor;
+ majorc = major*red;
+ minorc = minor*green;
+ focdic = -focdi*red;
+ for rotaroun=0.5*steparoun step steparoun until 180-0.5*steparoun:
+ garbac := planarrotation(majorc,minorc,rotaroun);
+ vertec :=0.5[garbac,focdic];
+ revolparab( garbac, vertec, ra );
+ revolparab( (X(garbac),-Y(garbac),0), (X(vertec),-Y(vertec),0), ra );
+ endfor;
+endfig;
+
+beginfig(5);
+ f := (9,6,3);
+ numeric u, slo, delt, higx, lowx, cenx, rai, focz;
+ color cen, foc, low, base;
+ path ell, cir, both;
+ u = 2mm;
+ slo = 0.35;
+ delt = slo ++ 1;
+ lowx = 2*(slo-delt);
+ higx = 2*(slo+delt);
+ rai = 2*delt;
+ drawoptions(withpen pencircle scaled u withcolor blue);
+ revolparab( (0,0,-3), blue, 4 );
+ drawoptions(withpen pencircle scaled u);
+ z4 = (lowx,oloid(lowx));
+ z6 = z4+whatever*dir(angle(1,-deriv(lowx)));
+ z5 = (higx,oloid(higx));
+ z6 = z5+whatever*dir(angle(1,-deriv(higx)));
+ focz = ypart z6;
+ cen = (2*slo,0,ypart 0.5[z4,z5]);
+ foc = (2*slo,0,focz);
+ low = (lowx,0,ypart z4);
+ ell = ellipticpath( cen, low-cen, rai*green );
+ cir = fullcircle scaled u;
+ both = twocyclestogether( ell, cir shifted rp(foc) );
+ draw both;
+ draw ell;
+ draw rp(2*cen-low)--rp(low)--rp(foc)--cycle;
+ %draw rp(cen+rai*green)--rp(cen-rai*green);
+ fill cir shifted rp(black);
+ base = (2*slo,0,-3);
+ draw rigorouscircle( base, blue, rai );
+ draw rp(base)--rp(foc) dashed withdots withcolor red;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/revolvers.mp b/graphics/metapost/contrib/macros/featpost/example/revolvers.mp
new file mode 100644
index 0000000000..e83d1fb971
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/revolvers.mp
@@ -0,0 +1,184 @@
+% revolvers.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+def posang( expr Angul ) =
+ rp( green*cosd( Angul ) + blue*sind( Angul ) )
+enddef;
+
+beginfig(1);
+ f := (3,5,4);
+ numeric labscal;
+ picture labr, labc, laba, labum, labdo, labtr, labqu, labci;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ labum= btex 1 etex scaled labscal;
+ labdo= btex 2 etex scaled labscal;
+ labtr= btex 3 etex scaled labscal;
+ labqu= btex 4 etex scaled labscal;
+ labci= btex 5 etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ tropicalglobe( 5, black, 1, blue );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.top( labr, rp((0.5,0,0)) );
+ drawarrow rp(black)--rp(blue);
+ label.rt( laba, rp((0,0,0.5)) );
+ dotlabel.lrt( labc, rp(black) );
+ dotlabel.rt( labum, posang(-72) );
+ dotlabel.top( labdo, posang(-36) );
+ dotlabel.top( labtr, posang(0) );
+ dotlabel.top( labqu, posang(36) );
+ dotlabel.top( labci, posang(72) );
+endfig;
+
+beginfig(2);
+ f := (3,5,5.7);
+ numeric labscal;
+ picture labri, labc, laba, labro;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labri= btex $R_i$ etex scaled labscal;
+ labro= btex $R_o$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ rigorousdisc( 0.5, true, black, 1, 0.85*blue );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.lrt( labro, rp(0.5*red) );
+ drawdblarrow rp(black+0.85*blue)--rp(0.5*green+0.85*blue);
+ label.urt( labri, rp(0.25*green+0.85*blue) );
+ drawarrow rp(black)--rp(0.85*blue);
+ label.ulft( laba, rp((0,0,0.5)) );
+ dotlabel.rt( labc, rp(black) );
+endfig;
+
+beginfig(3);
+ f := (3,2.05,2.65);
+ numeric labscal, bray, sray;
+ picture labrb, labc, laba, labrs;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ bray = 0.7;
+ sray = 0.4;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labrb= btex $R_b$ etex scaled labscal;
+ labrs= btex $R_s$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ smoothtorus( black, blue, bray, sray );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw goodcirclepath( bray*red, green, sray ) dashed evenly;
+ drawdblarrow rp(black)--rp(bray*red);
+ label.ulft( labrb, rp(0.5*bray*red) );
+ drawdblarrow rp(bray*red+sray*blue)--rp(bray*red);
+ label.llft( labrs, rp(bray*red+0.5*sray*blue) );
+ drawarrow rp(black)--rp(sray*blue);
+ label.rt( laba, rp((0,0,0.5*sray)) );
+ dotlabel.lrt( labc, rp(black) );
+endfig;
+
+beginfig(4);
+ f := (3,5,4);
+ numeric labscal;
+ picture labr, labc, laba;
+ labscal = 2;
+ ahlength := 8pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ spatialhalfsfear( black, blue, 1 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(red);
+ label.ulft( labr, rp(0.5*red) );
+ drawarrow rp(black)--rp(0.4*blue);
+ label.rt( laba, rp((0,0,0.2)) );
+ dotlabel.lrt( labc, rp(black) );
+endfig;
+
+beginfig(5);
+ f := (3,5,7);
+ numeric labscal;
+ picture labr, labc, laba;
+ labscal = 2;
+ ahlength := 10pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{S}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ spheroid( black, 2*blue, 1 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw ellipticpath( black, red, 2*blue ) dashed evenly;
+ draw ellipticpath( black, green, 2*blue ) dashed evenly;
+ drawdblarrow rp(black)--rp(red);
+ label.ulft( labr, rp((0.5,0,0)) );
+ drawarrow rp(black)--rp(2*blue);
+ label.rt( laba, rp((0,0,1)) );
+ dotlabel.lrt( labc, rp(black) );
+endfig;
+
+beginfig(6);
+ f := (3,5,4);
+ numeric labscal;
+ picture labl, labm, labr, labc;
+ labscal = 2;
+ ahlength := 10pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ labm = btex $\vec{M}$ etex scaled labscal;
+ labl = btex $L$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ draw rp((cosd(145),sind(-145),0))--rp(black)--rp((cosd(145),sind(145),0));
+ drawarrow rp(black)--rp(red) withpen pencircle scaled 1.3pt;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ banana( black, 1, black, 0.3, 145 );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawdblarrow rp(black)--rp(0.3*blue);
+ label.lft( labl, rp((0,0,0.15)) );
+ drawdblarrow rp(0.3*blue)--rp(0.3*blue-green);
+ label.llft( labr, rp(0.3*blue-0.5*green) );
+ label.ulft( labm, rp(0.5*red) );
+ dotlabel.bot( labc, rp(black) );
+endfig;
+
+beginfig(7);
+ numeric labscal, ray;
+ picture laba, labb, labr, labc;
+ labscal = 2;
+ ray = 0.25;
+ ahlength := 10pt;
+ ahangle := 30;
+ labc = btex $\vec{c}$ etex scaled labscal;
+ laba = btex $\vec{A}$ etex scaled labscal;
+ labb = btex $\vec{B}$ etex scaled labscal;
+ labr = btex $R$ etex scaled labscal;
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ quartertorus( black, -red, red-green, ray );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ drawarrow rp(black)--rp(red-green) withpen pencircle scaled 1.3pt;
+ label.bot( labb, rp((red-green)/sqrt(2)) );
+ drawarrow rp(black)--rp(-red) withpen pencircle scaled 1.3pt;
+ label.bot( laba, rp(-0.5*red) );
+ drawdblarrow rp(-red)--rp(ray*blue-red);
+ label.rt( labr, rp(0.5*ray*blue-red) );
+ dotlabel.bot( labc, rp(black) );
+
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorcubo.mp b/graphics/metapost/contrib/macros/featpost/example/rigorcubo.mp
new file mode 100644
index 0000000000..d63dac87df
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorcubo.mp
@@ -0,0 +1,36 @@
+% rigorcubo.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(0);
+ defaultscale := 3;
+ defaultfont := "ccr10";
+ Spread := 50;
+ V1 := (1,1,1);
+ V2 := (-1,1,1);
+ V3 := (-1,-1,1);
+ V4 := (1,-1,1);
+ V5 := (1,1,-1);
+ V6 := (-1,1,-1);
+ V7 := (-1,-1,-1);
+ V8 := (1,-1,-1);
+ makeface1(1,2,3,4);
+ makeface2(5,6,7,8);
+ makeface3(1,2,6,5);
+ makeface4(2,3,7,6);
+ makeface5(3,4,8,7);
+ makeface6(4,1,5,8);
+ f := (3,5,3);
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+ label.lft("A", rp(V8) );
+ label.top("B", rp(V1) );
+ label.top("C", rp(V3) );
+ label.lft("D", rp(V4) );
+ label.rt("E", rp(V2) );
+ label.rt("F", rp(V6) );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorouscircle.mp b/graphics/metapost/contrib/macros/featpost/example/rigorouscircle.mp
new file mode 100644
index 0000000000..cfc0db3c30
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorouscircle.mp
@@ -0,0 +1,49 @@
+% rigorouscircle.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := (2,0.2,0.1);
+
+
+beginfig(1);
+ numeric ind, cray, sray, cnum, ang, aux, auxs;
+ color sidevec, rayvec, angulmomv, vecaux;
+ path paux;
+ pen pendot;
+ pendot = pencircle scaled 2pt;
+ sray = 1;
+ cnum = 8;
+ ang = 45;
+ auxs = 0.15;
+ ray = 3*cosd(ang)*sray/cnum;
+ sidevec = ( sray*sind(ang), 0, 0 );
+ for ind=1 upto cnum:
+ aux := ind*360/cnum;
+% draw rigorouscircle( black, (0,sind(aux),cosd(aux)), sray ) dashed evenly;
+ rayvec := sray*cosd(ang)*(0,cosd(aux),sind(aux));
+
+ vecaux := rayvec+sidevec;
+ drawarrow rp(black)--rp(vecaux+auxs*N(vecaux));
+ paux := rigorouscircle( vecaux, vecaux, ray );
+ draw paux;
+ drawoptions( withpen pendot );
+ drawarrow (subpath (0,1) of paux);
+ draw rp(vecaux);
+ drawoptions();
+
+ vecaux := rayvec-sidevec;
+ drawarrow rp(black)--rp(vecaux+auxs*N(vecaux));
+ paux := rigorouscircle( vecaux, vecaux, ray );
+ draw paux;
+ drawoptions( withpen pendot );
+ drawarrow (subpath (0,1) of paux);
+ draw rp(vecaux);
+ drawoptions();
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorouscone.mp b/graphics/metapost/contrib/macros/featpost/example/rigorouscone.mp
new file mode 100644
index 0000000000..8ee9f9ccfd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorouscone.mp
@@ -0,0 +1,36 @@
+% rigorouscone.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ path gamma, cone;
+ numeric altura, grids, radius, aux, i, numc, slope;
+
+ f := (5,4,2);
+ Spread := 60;
+ ShiftV := (200,200);
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+ nalfa = (0,0,1);
+
+ for i=1 upto numc:
+ aux := (i-0.5*(numc+1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ gamma := rigorouscircle( gammacnt, nalfa, radius );
+ cone := rigorouscone(true, gammacnt, nalfa, radius, vertex );
+ unfill cone;
+ draw gamma dashed evenly;
+ draw cone;
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorousdiscSD.mp b/graphics/metapost/contrib/macros/featpost/example/rigorousdiscSD.mp
new file mode 100644
index 0000000000..3c664e582d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorousdiscSD.mp
@@ -0,0 +1,49 @@
+% rigorousdiscSD.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+SphericalDistortion := true;
+%%%%%Spread := 6;
+
+%SphericalDistortion := false;
+%%%%%%Spread := 20;
+
+beginfig(1);
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, aux, auy, i, j, numc;
+
+ altura = 1;
+ radius = 0.5;
+ grids = 1.4;
+ numc = 7;
+
+ for i=1 upto numc:
+ aux := (i-0.5*(numc+1))*grids;
+ for j=1 upto numc:
+ auy := (j-0.5*(numc+1))*grids;
+ if normaldeviate > 0:
+ gammacnt := (aux,auy,0);
+ vertex := (aux,auy,altura);
+ else:
+ if normaldeviate > 0:
+ gammacnt := (aux-altura/2,auy,radius);
+ vertex := (aux+altura/2,auy,radius);
+ else:
+ gammacnt := (aux,auy-altura/2,radius);
+ vertex := (aux,auy+altura/2,radius);
+ fi;
+ fi;
+ nalfa := vertex - gammacnt;
+ rigorousdisc( 0, true, gammacnt, radius, nalfa );
+ endfor;
+ endfor;
+ produce_auto_scale;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorousdiscoptions.mp b/graphics/metapost/contrib/macros/featpost/example/rigorousdiscoptions.mp
new file mode 100644
index 0000000000..e926a87284
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorousdiscoptions.mp
@@ -0,0 +1,31 @@
+% rigorousdiscoptions.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+beginfig(1);
+ color axe, cstep, colen;
+ numeric nstep, sfrac, ouray, inray;
+
+ nstep = 0.65;
+ sfrac = 0.1;
+ ouray = 0.7;
+ inray = 0.5;
+
+ axe = red;
+ cstep = ( nstep, 0, 0 );
+ colen = ( nstep*sfrac, 0, 0 );
+
+ pickup pencircle scaled 2pt;
+ rigorousdisc( 0, true, -cstep, ouray, colen );
+ rigorousdisc( 0, false, black, ouray, colen );
+ rigorousdisc( inray, true, cstep, ouray, colen );
+ rigorousdisc( inray, false, 2*cstep, ouray, colen );
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rigorousfearpath.mp b/graphics/metapost/contrib/macros/featpost/example/rigorousfearpath.mp
new file mode 100644
index 0000000000..a91913fc74
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rigorousfearpath.mp
@@ -0,0 +1,66 @@
+% rigorousfearpath.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric sfr, radfac, ind;
+ color xv, yv, zv, Ve[];
+ path p[];
+ f := 2*(5,2,3);
+ Spread := 50;
+ csr := 0.47;
+ clr := 0.57;
+ xv := (csr,0,0);
+ yv := (0,csr,0);
+ zv := (0,0,csr);
+ Ve1 := (-1,-1,-1);
+ Ve2 := (-1,1,-1);
+ Ve3 := (1,-1,-1);
+ Ve4 := (1,1,-1);
+ Ve5 := (-1,-1,1);
+ Ve6 := (-1,1,1);
+ Ve7 := (1,-1,1);
+ Ve8 := (1,1,1);
+ Ve9 := (0,0,0);
+ for ind=1 upto 8:
+ p[ind] := rigorousfearpath( Ve[ind], csr );
+ endfor;
+ p9 := rigorousfearpath( Ve9, clr );
+ unfill p1;
+ draw p1;
+ draw rp(Ve1+yv)--rp(Ve2-yv);
+ draw rp(Ve1+xv)--rp(Ve3-xv);
+ unfill p2;
+ draw p2;
+ unfill p3;
+ draw p3;
+ draw rp(Ve4-yv)--rp(Ve3+yv);
+ draw rp(Ve4-xv)--rp(Ve2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(Ve1+zv)--rp(Ve5-zv);
+ draw rp(Ve2+zv)--rp(Ve6-zv);
+ unfill p9;
+ draw p9;
+ draw rp(Ve3+zv)--rp(Ve7-zv);
+ draw rp(Ve4+zv)--rp(Ve8-zv);
+ unfill p5;
+ draw p5;
+ draw rp(Ve5+yv)--rp(Ve6-yv);
+ draw rp(Ve5+xv)--rp(Ve7-xv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(Ve8-yv)--rp(Ve7+yv);
+ draw rp(Ve8-xv)--rp(Ve6+xv);
+ unfill p8;
+ draw p8;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rmnbob.mp b/graphics/metapost/contrib/macros/featpost/example/rmnbob.mp
new file mode 100644
index 0000000000..88e95ec7b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rmnbob.mp
@@ -0,0 +1,48 @@
+% rmnbob.mp
+% L. Nobre G.
+% probably before 2004
+
+input featpost3Dplus2D;
+
+Spread := 70;
+f := (5,7,10);
+
+beginfig(1);
+ numeric i, r[], stepr, len, Numr, Minn, Maxn;
+ numeric fws, NumLines, linex;
+ path aro[], oneline;
+ color centre, axe, baseone, basetwo;
+
+ stepr := 0.1;
+ len := 3;
+ Numr := 5;
+ Minn := 5;
+ centre := (0,0,0);
+ axe := (1,0,0);
+ fws := 2;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ baseone := centre+0.5*len*axe;
+ basetwo := centre-0.5*len*axe;
+ Maxn := Minn+Numr;
+ for i=Minn upto Maxn:
+ r[i] := i*stepr;
+ aro[i] := rigorouscircle(baseone,axe,r[i]);
+ endfor;
+ rigorousdisc( 0, true, baseone, r[Maxn], -len*axe );
+ drawoptions( dashed evenly );
+ rigorousdisc( 0, true, baseone, r[Minn], -len*axe );
+ for i=Maxn downto Minn:
+ filldraw aro[i] withcolor ((0.5+0.3*normaldeviate)*background);
+ endfor;
+ drawoptions( );
+ draw aro[Maxn];
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/roadincline.mp b/graphics/metapost/contrib/macros/featpost/example/roadincline.mp
new file mode 100644
index 0000000000..5c4cdd1f4e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/roadincline.mp
@@ -0,0 +1,67 @@
+% roadincline.mp
+% L. Nobre G.
+% 2004
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+beginfig(1);
+ numeric u, size, halfs, parcel, bordlarg, bordtotal, backdiaglen, backang;
+ numeric backdown, labelmarg, backauxil, backauyil, angray;
+ path triborder, backtri, angline;
+ picture labelalfa, labelv, labelh, labeld;
+
+ u = 1mm;
+ size = 25u;
+ bordlarg = 3u;
+ bordtotal = 4u;
+ backdiaglen = 55u;
+ backang = 29;
+ backdown = 2u;
+ labelmarg = -1u;
+ angray = 5u;
+
+ parcel = 0.16667*sqrt(3)*size;
+ halfs = 0.5size;
+ z1 = (-halfs,-parcel);
+ z2 = ( halfs,-parcel);
+ z3 = ( 0, 2*parcel );
+ triborder = z1--z2--z3--cycle;
+
+ backauxil = backdiaglen*cosd(backang)*0.5;
+ backauyil = backdiaglen*sind(backang)*0.5;
+ z4 = (-backauxil,-backauyil);
+ z5 = ( backauxil,-backauyil);
+ z6 = ( backauxil, backauyil);
+ backtri = z4--z5--z6--cycle;
+
+ angline = halfcircle scaled 2angray shifted z4 cutafter (z4--z6);
+ z7 = z4+(angray,0);
+ z8 = 0.5[z5,z6];
+ z9 = z5-(angray,0);
+ z0 = z6-angray*(cosd(backang),sind(backang));
+
+ labelalfa = thelabel.urt( btex $\alpha$ etex, z7 );
+ labelv = thelabel.lft( btex $v$ etex, z8 );
+ labelh = thelabel.top( btex $h$ etex, z9 );
+ labeld = thelabel.bot( btex $d$ etex, z0 );
+
+ filldraw backtri;
+ draw angline withcolor background;
+ draw labelalfa withcolor background;
+ draw labelv withcolor background;
+ draw labelh withcolor background;
+ draw labeld withcolor background;
+
+ draw triborder withcolor background withpen pencircle scaled bordtotal;
+ draw triborder withcolor red withpen pencircle scaled bordlarg;
+
+ label.top( btex X\% etex rotated backang, labelmarg*up );
+endfig;
+verbatimtex
+\end{document}
+etex
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/rodarolaremplaninc.mp b/graphics/metapost/contrib/macros/featpost/example/rodarolaremplaninc.mp
new file mode 100644
index 0000000000..c90b888869
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rodarolaremplaninc.mp
@@ -0,0 +1,52 @@
+% rodarolaremplaninc.mp
+% L. Nobre G.
+% 2008
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric Anginc;
+ Anginc = 10+uniformdeviate(30);
+ numeric ray; ray = 7mm;
+ pickup pencircle scaled 1pt;
+ numeric dh; dh = ray/sind( Anginc );
+ numeric roll; roll = ray*(270-Anginc)*1.74533/100.0;
+ numeric i, N;
+ N = 10+floor(uniformdeviate(10));
+ z0 = dir(-Anginc);
+ z1 = (-dh,0);
+ z2 = z1+z0*(dh*cosd(Anginc)+roll+ray);
+ z3 = z1+z0*dh*cosd(Anginc);
+ z4 = z0*roll+(ray,0);
+ path circ, arcangi, arca, spoke;
+ spoke = (0.07[origin,z3])--z3;
+ draw spoke;
+ picture roda;
+ circ = fullcircle scaled (2*ray);
+ draw circ;
+ roda = currentpicture;
+ for i = 1 upto N-1:
+ draw spoke rotated ((Anginc-270)*i/N) shifted (z0*i*roll/N) withcolor
+ 0.5white;
+ endfor;
+ draw z1--z2--(-dh, ypart z2)--cycle;
+ draw roda rotated (Anginc-270) shifted (z0*roll);
+ arcangi = halfcircle scaled roll cutbefore (origin--roll*dir(180-Anginc));
+ arca = arcangi shifted z2;
+ z5 = point (0.5*(length arca)) of arca;
+ pickup pencircle scaled 0.7pt;
+ draw arca;
+ label.lft( btex $\alpha$ etex, z5 );
+ label.llft( btex $P_1$ etex, z3 );
+ label.rt( btex $P_2$ etex, z4 );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/ropepatterns.mp b/graphics/metapost/contrib/macros/featpost/example/ropepatterns.mp
new file mode 100644
index 0000000000..a876500185
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ropepatterns.mp
@@ -0,0 +1,30 @@
+% ropepatterns.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+prologues := 2;
+
+RopeColors := TableColors;
+
+beginfig(1);
+ numeric i, u;
+ u = 1cm;
+ path auxpath, ropath;
+ pair auxpair;
+ for i=0 upto TableColors:
+ RopeColorSeq[i] := i;
+ auxpair := u*(i,TableColors);
+ auxpath := fullcircle scaled u shifted auxpair;
+ fill auxpath withcolor TableC[i];
+ draw auxpath;
+ label( decimal(i), auxpair );
+ endfor;
+ ropath = origin...(u*(0.5*TableColors,TableColors-2))...(u*TableColors*(1,0));
+ ropepattern(ropath, u, 10);
+ RopeColors := floor(0.5*TableColors);
+ ropepattern(ropath yscaled (-1) shifted (u*up*(TableColors-2)), u, 7);
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/rosadosventos.mp b/graphics/metapost/contrib/macros/featpost/example/rosadosventos.mp
new file mode 100644
index 0000000000..a709d29399
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rosadosventos.mp
@@ -0,0 +1,52 @@
+% rosadosventos.mp
+% L. Nobre G.
+% 2013
+
+prologues := 1;
+
+def getcrossingscale( expr Ang, Lev ) =
+ begingroup
+ numeric angoflevel;
+ pair tmpair, northpoi, levelpoi;
+ angoflevel = 90-180/(2**Lev);
+ northpoi = (0,1);
+ levelpoi = dir(angoflevel);
+ tmpair = northpoi+whatever*dir(Ang-90);
+ tmpair = levelpoi+whatever*dir(angoflevel-Ang);
+ ( cosd(Ang)*abs(levelpoi-tmpair) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric level, i, j, ang, u, scal, penscal, startang;
+ path basetriang, worktriang;
+ color fillcol;
+ pen pathpen;
+ pair shiftvec;
+ level = 4;
+ ang = 18;
+ u = 7cm;
+ fillcol = (0.77,0.88,0.99);
+ penscal = 50;
+ pathpen = pencircle scaled (u/penscal);
+ basetriang = (0,1)--(-sind(ang)/cosd(ang),0)--(sind(ang)/cosd(ang),0)--cycle;
+ basetriang := basetriang scaled u;
+ fill basetriang withcolor fillcol;
+ fill basetriang rotated 180 withcolor fillcol;
+ draw basetriang withpen pathpen;
+ draw basetriang rotated 180 withpen pathpen;
+ for i=1 upto level:
+ scal := getcrossingscale( ang, i );
+ shiftvec := (0,u*(1-scal));
+ worktriang := basetriang scaled scal shifted shiftvec rotated -90;
+ startang := -90+360/(2**(i+1));
+ for j=startang step 360/(2**i) until 270:
+ fill worktriang rotated j withcolor (fillcol/(2**i));
+ draw worktriang rotated j withpen pathpen;
+ endfor;
+ endfor;
+endfig;
+
+end.
+
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/rotatnlc.mp b/graphics/metapost/contrib/macros/featpost/example/rotatnlc.mp
new file mode 100644
index 0000000000..42f47a543f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rotatnlc.mp
@@ -0,0 +1,49 @@
+% rotatnlc.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(1);
+
+ f := 2*(2,1,0.55);
+
+ Spread := 450;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin;
+ numeric thetamax, thetastp, long, radius, polar;
+ sizevec := (7,42,1); % (number of circles,
+ % number of vectors in outer circle,
+ % number of levels )
+ gridvec := (0.08,0.23,0.3);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ counter := 1;
+ for i=1 upto X(sizevec):
+ radius := (i-1)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, Y(gridvec), false );
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/rothexagrid.mp b/graphics/metapost/contrib/macros/featpost/example/rothexagrid.mp
new file mode 100644
index 0000000000..41ab83d61a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rothexagrid.mp
@@ -0,0 +1,45 @@
+% rothexagrid.mp
+% L. Nobre G.
+% IYP (2005)
+
+vardef locator( expr Indi, Indj ) =
+ ((Indi+0.5*Indj)*5mm,0.5*sqrt(3)*Indj*5mm)
+enddef;
+
+vardef gridmark( expr Loc ) =
+ draw Loc--(Loc+sqrt(3)*down*5mm/3);
+ draw Loc--(Loc+( 0.5,sqrt(3)/6)*5mm);
+ draw Loc--(Loc+(-0.5,sqrt(3)/6)*5mm);
+enddef;
+
+beginfig(1);
+ numeric i, j, fdist;
+ picture tmppic;
+ path clipper;
+ color forec, backc;
+ transform T;
+ fdist = 10cm;
+ forec = (0.8,1,0.8);
+ backc = (0.8,0.8,0.8);
+ z1 = locator( 0, 11 );
+ z2 = locator( 4, 22 );
+ z3 = locator( 19, 11 );
+ z4 = locator( 15, 0 );
+ origin = z1 transformed T;
+ (0,fdist) = z2 transformed T;
+ (fdist,fdist) = z3 transformed T;
+ clipper = (z1--z2--z3--z4--cycle) transformed T ;
+ drawoptions( withpen pencircle scaled 1pt );
+ for i = 0 upto 19:
+ for j = 0 upto 22:
+ gridmark( locator( i, j ) );
+ endfor;
+ endfor;
+ tmppic = currentpicture;
+ currentpicture := nullpicture;
+ fill clipper withcolor backc;
+ draw tmppic transformed T withcolor forec;
+ clip currentpicture to clipper;
+% dotlabels.top( 1,2,3,4 );
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/rungekuttasecond.mp b/graphics/metapost/contrib/macros/featpost/example/rungekuttasecond.mp
new file mode 100644
index 0000000000..92086810ab
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/rungekuttasecond.mp
@@ -0,0 +1,103 @@
+% rungekuttasecond.mp
+% L. Nobre G.
+% 2008
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+Spread := 30;
+f := (10,0,0);
+
+def vecfunc( expr posit )=
+ ( (0,1,Z(posit)-Y(posit)) )
+enddef;
+
+beginfig(2);
+% cartaxes( 2.4, 2.4, 2.4 );
+ numeric grids, size, i, j, ijmax, diffstep, len, h;
+ color actpos, one, two, aux, graycol, stap, midp, finp ;
+ pair yaxp, oaxp, xaxp;
+ graycol = 0.67white;
+ h = 3;
+ grids = 0.15;
+ size = 0.14;
+ diffstep = 0.0125;
+% len = 320;
+ len = 240;
+ ijmax = floor( 2.0/grids );
+ for j=-ijmax upto ijmax:
+ for i=-ijmax upto ijmax:
+ actpos := grids*(0,i,j);
+ aux := 0.5*size*N( vecfunc( actpos ) );
+ one := actpos-aux;
+ two := actpos+aux;
+ draw rp(one)--rp(two) withcolor graycol;
+ endfor;
+ endfor;
+% stap = (0,-2,-1.05);
+% draw fieldlinepath( len, stap, diffstep, vecfunc ) withcolor blue;
+ stap = (0,-1.5,-0.65);
+ draw fieldlinepath( len, stap, diffstep, vecfunc ) withcolor blue;
+ midp = stap + 0.5*h*vecfunc( stap );
+ finp = stap + h*vecfunc( midp );
+ draw rp(stap)--rp(midp);
+ draw rp(stap)--rp(finp);
+% drawoptions( withcolor blue );
+% draw fieldlinepath( len, (0,-2,-1.25), diffstep, vecfunc );
+% draw fieldlinepath( len, (0,-2,-1.2), diffstep, vecfunc );
+% draw fieldlinepath( len, (0,-2,-1.15), diffstep, vecfunc );
+% draw fieldlinepath( len, (0,-2,-1.1), diffstep, vecfunc );
+% draw fieldlinepath( len, (0,-2,-1.05), diffstep, vecfunc );
+ yaxp = rp((0,-2-grids,2+grids));
+ oaxp = rp((0,-2-grids,-2-grids));
+ xaxp = rp((0,2+grids,-2-grids));
+ drawdblarrow yaxp--oaxp--xaxp;
+ label.bot(btex $x$ etex, xaxp );
+ label.lft(btex $y$ etex, yaxp );
+ dotlabel.bot(btex $x_0$ etex, rp((0,Y(stap),-2-grids)) );
+ dotlabel.lft(btex $y_0$ etex, rp((0,-2-grids,Z(stap))) );
+ dotlabel.bot(btex $x_0+\frac{h}{2}$ etex, rp((0,Y(midp),-2-grids)) );
+ dotlabel.lft(btex $y_0+\frac{h}{2}f_0$ etex, rp((0,-2-grids,Z(midp))) );
+ dotlabel.bot(btex $x_0+h$ etex, rp((0,Y(finp),-2-grids)) );
+ dotlabel.lft(btex $y_0+hf_{1/2}$ etex, rp((0,-2-grids,Z(finp))) );
+endfig;
+
+numeric u, grids, i, j, thex, they, xmax, ymax, vertn, horin, rescal, size;
+pair actpos, direct, one, two;
+
+u := 0.5mm;
+vertn := 20;
+horin := 41;
+size := 3u;
+grids := 8u;
+ymax := 0.5*(vertn-1);
+xmax := 0.5*(horin-1);
+rescal := 0.15;
+
+beginfig(1);
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=grids*(i,j);
+ thex:=i*rescal;
+ they:=j*rescal;
+ direct:=unitvector((1,they-thex));
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/sal.mp b/graphics/metapost/contrib/macros/featpost/example/sal.mp
new file mode 100644
index 0000000000..9646ead838
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sal.mp
@@ -0,0 +1,106 @@
+% Cesium Cloride Crystal Structure and EBG fields together
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric sfr, radfac, ind;
+ color xv, yv, zv;
+ path p[];
+ f := 3*(5,2,3);
+ Spread := 50;
+ sfr := 0.2;
+ radfac := 2.0;
+ xv := (sfr,0,0);
+ yv := (0,sfr,0);
+ zv := (0,0,sfr);
+ V1 := (-1,-1,-1);
+ V2 := (-1,1,-1);
+ V3 := (1,-1,-1);
+ V4 := (1,1,-1);
+ V5 := (-1,-1,1);
+ V6 := (-1,1,1);
+ V7 := (1,-1,1);
+ V8 := (1,1,1);
+ V9 := (0,0,0);
+ for ind=1 upto 8:
+ p[ind] := rigorousfearpath( V[ind], sfr );
+ endfor;
+ p9 := rigorousfearpath( V9, sfr*radfac );
+ unfill p1;
+ draw p1;
+ draw rp(V1+yv)--rp(V2-yv);
+ draw rp(V1+xv)--rp(V3-xv);
+ unfill p2;
+ draw p2;
+ unfill p3;
+ draw p3;
+ draw rp(V4-yv)--rp(V3+yv);
+ draw rp(V4-xv)--rp(V2+xv);
+ unfill p4;
+ draw p4;
+ draw rp(V1+zv)--rp(V5-zv);
+ draw rp(V2+zv)--rp(V6-zv);
+ unfill p9;
+ draw p9;
+ draw rp(V3+zv)--rp(V7-zv);
+ draw rp(V4+zv)--rp(V8-zv);
+ unfill p5;
+ draw p5;
+ draw rp(V5+yv)--rp(V6-yv);
+ draw rp(V5+xv)--rp(V7-xv);
+ unfill p6;
+ draw p6;
+ unfill p7;
+ draw p7;
+ draw rp(V8-yv)--rp(V7+yv);
+ draw rp(V8-xv)--rp(V6+xv);
+ unfill p8;
+ draw p8;
+ label( btex Cs${}^{+}$ etex, rp( V8 ) );
+ label( btex Cl${}^{-}$ etex, rp( V9 ) );
+endfig;
+
+beginfig(2);
+ numeric inc, ind, tep, larg, altr, lene;
+ path efld, velv, arch, auxi;
+ picture bfld;
+ pair vpos, cent;
+ tep = 1cm;
+ larg = 4;
+ altr = 3;
+ lene = larg*tep;
+ bfld = btex $\times$ etex;
+% bfld := bfld shifted -(center bfld);
+ efld = origin--(lene,0);
+ for ind = 0 upto altr:
+ drawarrow efld shifted (0,ind*tep);
+ endfor;
+ auxi = efld shifted (0,tep);
+ for ind = 1 upto altr:
+ for inc = 1 step 2 until 2*larg:
+ label( bfld, (0.5*inc*tep,(ind-0.5)*tep) );
+ endfor;
+ endfor;
+ vpos = (tep,0.5tep);
+ label.lft( btex $\vec{B}$ etex, (0.5tep,(altr-0.5)*tep) );
+ label.lft( btex $\vec{E}$ etex, origin );
+ label.top( btex $\vec{v}$ etex, vpos );
+ velv = vpos--((larg-1)*tep,(altr-0.5)*tep);
+ drawarrow velv;
+ cent = auxi intersectionpoint velv;
+ arch = ((fullcircle scaled (altr*tep*0.87)) shifted cent) cutafter velv;
+ draw arch;
+ label.rt( btex $\theta$ etex, point 0.5*length arch of arch );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/sap.mp b/graphics/metapost/contrib/macros/featpost/example/sap.mp
new file mode 100644
index 0000000000..003abcd59c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sap.mp
@@ -0,0 +1,179 @@
+% sap.mp
+% L. Nobre G.
+% 2002
+
+numeric NumberOfColors, HalfSideLength;
+numeric ThicknesFactor, TolerancFactor;
+NumberOfColors = 7;
+HalfSideLength = 15mm;
+ThicknesFactor = 0.2; % Maximum TraceThickness over Half Side
+ThinnessFactor = 0.1; % Minimum TraceThickness over Half Side
+TolerancFactor = 0.5 + 0.02; % Side Gaps over Thickness
+
+def RandomStep =
+ begingroup
+ numeric margin;
+ margin = ThicknesFactor-ThinnessFactor;
+ ThinnessFactor*HalfSideLength + uniformdeviate( margin*HalfSideLength )
+ endgroup
+enddef;
+
+def PickInteger( expr MaxNum ) =
+ begingroup
+ save aux;
+ numeric aux;
+ aux = ceiling( uniformdeviate( MaxNum ) );
+ if aux = 0:
+ aux := 1;
+ fi;
+ ( aux )
+ endgroup
+enddef;
+
+def PickColor =
+ ( uniformdeviate(1) , uniformdeviate(1), uniformdeviate(1) )
+enddef;
+
+vardef LocateIndex[] =
+ dotlabel.urt( str @, z@ )
+enddef;
+
+def SpreadAllOver =
+ begingroup
+ pair urCorner, ulCorner, llCorner, lrCorner;
+ path FinalCut;
+ urCorner = ( 8.13in, 11.533in );
+ llCorner = ( 0.118in, 35.5bp );
+ ulCorner = ( xpart llCorner, ypart urCorner );
+ lrCorner = ( xpart urCorner, ypart llCorner );
+ FinalCut = urCorner--ulCorner--llCorner--lrCorner--cycle;
+
+ picture Tile[];
+ Tile[1] = currentpicture;
+ Tile[2] = currentpicture rotated 90;
+ Tile[3] = currentpicture rotated 180;
+ Tile[4] = currentpicture rotated 270;
+ currentpicture := nullpicture;
+ numeric i, j, horizo, vertic;
+ horizo = ( xpart urCorner ) + HalfSideLength;
+ vertic = ( ypart urCorner ) + HalfSideLength;
+ for i = 0 step 2HalfSideLength until horizo:
+ for j = 0 step 2HalfSideLength until vertic:
+ draw Tile[PickInteger( 4 )] shifted ( i, j );
+ endfor;
+ endfor;
+ clip currentpicture to FinalCut
+ endgroup
+enddef;
+
+beginfig(1);
+ linecap := butt;
+
+ numeric tracethickness;
+ tracethickness = RandomStep;
+ currentpen := pensquare rotated 45 scaled tracethickness;
+
+ numeric i, currentcoord, maincoords[], numaincoords, toleranc;
+ i = 0;
+ currentcoord = 2TolerancFactor*tracethickness;
+ toleranc = HalfSideLength - currentcoord;
+ forever:
+ i := incr( i );
+ maincoords[i] = currentcoord;
+ currentcoord := currentcoord + 4TolerancFactor*tracethickness;
+ currentcoord := currentcoord +
+ uniformdeviate( ThicknesFactor*HalfSideLength );
+ exitif currentcoord > toleranc;
+ endfor;
+ numaincoords = i;
+
+ numeric j;
+ pair Dir[];
+ for i = 1 upto numaincoords:
+ j := i;
+ z[j] = ( HalfSideLength, maincoords[i] );
+ Dir[j] = left;
+ j := i + numaincoords;
+ z[j] = ( maincoords[i], HalfSideLength );
+ Dir[j] = down;
+ j := i + 2numaincoords;
+ z[j] = ( -maincoords[i], HalfSideLength );
+ Dir[j] = down;
+ j := i + 3numaincoords;
+ z[j] = ( -HalfSideLength, maincoords[i] );
+ Dir[j] = right;
+ j := i + 4numaincoords;
+ z[j] = ( -HalfSideLength, -maincoords[i] );
+ Dir[j] = right;
+ j := i + 5numaincoords;
+ z[j] = ( -maincoords[i], -HalfSideLength );
+ Dir[j] = up;
+ j := i + 6numaincoords;
+ z[j] = ( maincoords[i], -HalfSideLength );
+ Dir[j] = up;
+ j := i + 7numaincoords;
+ z[j] = ( HalfSideLength, -maincoords[i] );
+ Dir[j] = left;
+ endfor;
+
+% for i=1 upto 8numaincoords:
+% LocateIndex[i];
+% endfor;
+
+ boolean Filled[];
+ for i=1 upto 8numaincoords:
+ Filled[i] = false;
+ endfor;
+ numeric Chosen[];
+ for i=0 upto numaincoords-1:
+ Chosen[i] = 0;
+ endfor;
+ color LookUpColor[];
+ for i=1 upto NumberOfColors:
+ LookUpColor[i] = PickColor;
+ endfor;
+
+ numeric ThisInd, ThatInd, ThisCoo, ThatCoo;
+ color ThisColor, ThatColor;
+ path ActualPath;
+ for j=2 step 2 until 8numaincoords:
+
+ forever:
+ ThisInd := PickInteger( 8numaincoords );
+ exitunless Filled[ThisInd];
+ endfor;
+ Filled[ThisInd] := true;
+ ThisCoo := ThisInd mod numaincoords;
+ if Chosen[ThisCoo] = 0:
+ i := PickInteger( NumberOfColors );
+ ThisColor := LookUpColor[i];
+ Chosen[ThisCoo] := i;
+ else:
+ ThisColor := LookUpColor[Chosen[ThisCoo]];
+ fi;
+
+ forever:
+ ThatInd := PickInteger( 8numaincoords );
+ exitunless Filled[ThatInd];
+ endfor;
+ Filled[ThatInd] := true;
+ ThatCoo := ThatInd mod numaincoords;
+ if Chosen[ThatCoo] = 0:
+ i := PickInteger( NumberOfColors );
+ ThatColor := LookUpColor[i];
+ Chosen[ThatCoo] := i;
+ else:
+ ThatColor := LookUpColor[Chosen[ThatCoo]];
+ fi;
+
+ ActualPath := z[ThisInd]{Dir[ThisInd]}
+ ...z[ThatInd]{-Dir[ThatInd]};
+ draw subpath (0,0.6) of ActualPath withcolor ThisColor;
+ draw subpath (0.4,1) of ActualPath withcolor ThatColor;
+
+ endfor;
+
+ SpreadAllOver;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/saturn.mp b/graphics/metapost/contrib/macros/featpost/example/saturn.mp
new file mode 100644
index 0000000000..372866401f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/saturn.mp
@@ -0,0 +1,130 @@
+% saturn.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{newcent}
+\pagestyle{empty}
+\begin{document}
+etex
+
+f := 2.5*(5,0,-1);
+Spread := 100;
+
+beginfig(1);
+ path planet, twilight, darkness, ringins, ringout, shadein, shadout;
+ path fullplanet, fullring, backdark, sunplanet, backring;
+ path nearringout, nearringins, hdtv, darkplanet;
+ numeric planetray, ringinsray, ringoutray, cutmargin, athmosray;
+ color sunposition, axedirection, labelpos, darknesstart, darknessend;
+ numeric inclinangle, labelray, begintime, endtime, colorfactor;
+ color planetcolor, ringcolor, toptextcolor, deepskycolor, bottextcolor;
+ picture storepicture;
+ planetray = 1;
+ ringinsray = 1.6;
+ ringoutray = 2.3;
+ labelray = 2.1;
+ cutmargin = 0.01;
+ inclinangle = 15;
+ sunposition = (-7,15,4);
+ colorfactor = 1.3;
+ bboxmargin := 10mm;
+ planetcolor = colorfactor*(255,152,55)/255;
+ ringcolor = colorfactor*(221,57,199)/255;
+ toptextcolor = colorfactor*(187,164,109)/255;
+ deepskycolor = colorfactor*(11,18,84)/255;
+ bottextcolor = colorfactor*(15,103,23)/255;
+ viewcentr := (0,0.5[planetray,ringinsray],0);
+ labelpos = (0,labelray,0);
+ athmosray = planetray+cutmargin;
+ axedirection = (0,-sind(inclinangle),cosd(inclinangle));
+ planet = rigorousfearpath( black, planetray );
+ twilight = spatialhalfcircle( black, sunposition, athmosray, true );
+ darknesstart = athmosray*ncrossprod( sunposition, axedirection );
+ darknessend = darknesstart - labelray*N( sunposition );
+ darkness = pathofstraightline( darknesstart, darknessend );
+ darknesstart := -darknesstart;
+ darknessend := darknesstart - labelray*N( sunposition );
+ backdark = pathofstraightline( darknesstart, darknessend );
+ ringins = goodcirclepath( black, axedirection, ringinsray );
+ ringout = goodcirclepath( black, axedirection, ringoutray );
+ endtime = xpart ( planet intersectiontimes twilight );
+ begintime = xpart ( reverse planet intersectiontimes twilight );
+ sunplanet = subpath (-begintime-cutmargin,endtime+cutmargin) of planet;
+ darkplanet = planet cutbefore twilight cutafter twilight;
+ fullplanet = buildcycle( sunplanet, reverse twilight );
+ fill fullplanet withcolor planetcolor;
+ endtime := xpart ( ringins intersectiontimes darkness );
+ begintime := xpart ( reverse ringins intersectiontimes sunplanet );
+ nearringins = subpath (-begintime-cutmargin,endtime+cutmargin) of ringins;
+ endtime := xpart ( ringout intersectiontimes darkness );
+ begintime := xpart ( reverse ringout intersectiontimes sunplanet );
+ nearringout = subpath (-begintime-cutmargin,endtime+cutmargin) of ringout;
+ backring = buildcycle( backdark, ringout, reverse darkplanet, reverse ringins );
+ fullring = buildcycle( nearringout, reverse darkness, reverse nearringins, sunplanet );
+ fill backring withcolor ringcolor;
+ fill fullring withcolor ringcolor;
+ picture thestatement;
+ thestatement = thelabel(
+ btex
+ \begin{tabular}{c}
+ \textbf{\textsf{{\Large T}$\!$ecnumbria}} \\
+ \textsf{\scriptsize a sombra da tecnologia}
+ \end{tabular}
+ etex,
+ origin);
+ pickup pencircle scaled 1pt;
+ draw thestatement scaled 2 shifted rp(labelpos) withcolor toptextcolor;
+ storepicture = currentpicture;
+ z1 = lrcorner currentpicture;
+ z2 = urcorner currentpicture;
+ z3 = ulcorner currentpicture;
+ z4 = llcorner currentpicture;
+ z5 = z1+down*bboxmargin;
+ z6 = z1+right*bboxmargin;
+ z7 = z2+right*bboxmargin;
+ z8 = z2+up*bboxmargin;
+ z9 = z3+up*bboxmargin;
+ z10= z3+left*bboxmargin;
+ z11= z4+left*bboxmargin;
+ z12= z4+down*bboxmargin;
+ z13= 0.5[z5,z12]+down*3*bboxmargin;
+ hdtv = z5..z6---z7..z8---z9..z10---z11..z12---cycle;
+ message "Aspect ratio: " & decimal( (xpart (z7-z10))/(ypart (z8-z5)) );
+ numeric wid;
+ wid = (xpart (z7-z10))/(1mm);
+ message "Width: " & decimal( wid ) & "mm";
+ message "Resolution for MooMiniCard: " & decimal(1.9083*222/wid) & "*100dpi";
+ %% I don't know why there is need for the 1.9083 factor...
+ fill hdtv withcolor deepskycolor;
+ draw storepicture;
+% label(btex \texttt{\LARGE http://tecnumbria.com} etex, z13 );
+endfig;
+
+% beginfig(2);
+% prologues := 1;
+% pickup pencircle scaled 9pt;
+% fill hdtv;
+% unfill fullplanet;
+% draw fullplanet;
+% unfill fullring;
+% draw fullring;
+% unfill backring;
+% draw backring;
+% endfig;
+
+% beginfig(3);
+% prologues := 1;
+% pickup pencircle scaled 0pt;
+% draw fullplanet withcolor red;
+% draw fullring withcolor green;
+% draw backring withcolor blue;
+% endfig;
+
+verbatimtex \end{document} etex
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/sfearschem.mp b/graphics/metapost/contrib/macros/featpost/example/sfearschem.mp
new file mode 100644
index 0000000000..d9401ae0b1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sfearschem.mp
@@ -0,0 +1,34 @@
+% sfearchem.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+defaultfont:="cmssu30";
+
+beginfig(1);
+ f := (4,2,1.5);
+ cartaxes( 1.5,1.5,0.75 );
+ drawoptions( withcolor red withpen pencircle scaled 1.3pt );
+ draw goodcirclepath( (0,0,0), (0,0,1), 1 );
+ drawoptions();
+ draw rigorouscircle( (0,0,0), (0,0,1), 1 );
+ draw spatialhalfcircle( (0,0,0), (0,0,1), 0.5, true );
+ draw spatialhalfcircle( (0,0,0), (0,0,1), 0.5, false ) dashed evenly;
+ draw rigorousfearpath( (0,0,0), 0.5 );
+ draw rp((0,0,0.5)) withpen pencircle scaled 1.3pt;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/sharpraytrace.mp b/graphics/metapost/contrib/macros/featpost/example/sharpraytrace.mp
new file mode 100644
index 0000000000..61a8f75fb5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sharpraytrace.mp
@@ -0,0 +1,133 @@
+% sharpraytrace.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+f := (5,1.5,4.5);
+Spread := 60;
+PrintStep := 5;
+
+numeric phi;
+phi = 0.5*(1+sqrt(5));
+
+V1 := ( 1, phi,0);
+V2 := (-1, phi,0);
+V3 := (-1,-phi,0);
+V4 := ( 1,-phi,0);
+V5 := (0, 1, phi);
+V6 := (0,-1, phi);
+V7 := (0,-1,-phi);
+V8 := (0, 1,-phi);
+V9 := ( phi,0, 1);
+V10:= ( phi,0,-1);
+V11:= (-phi,0,-1);
+V12:= (-phi,0, 1);
+makeface1(1,2,3,4);
+makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+
+beginfig(1);
+ pickup pencircle scaled 2pt;
+% numeric asize;
+% asize = 0.5*(phi+1);
+% cartaxes(asize,asize,asize);
+ sharpraytrace;
+endfig;
+
+Spread := 120;
+f:=3*(1,0.5,0.75);
+PrintStep := 0.15;
+
+numeric a, b, c, d, e;
+a = 0.1;
+b = 0.3;
+c = 1.1;
+d = 2.9;
+e = 0.5;
+
+V1 := ( a , b , c);
+V2 := ( a-1, b , 0);
+V3 := ( a-1-e, b-d,0);
+V4 := (-b , a , c);
+V5 := (-b , a-1, 0);
+V6 := (-b+d,a-1-e, 0);
+V7 := (-a , -b , c);
+V8 := (-a+1,-b , 0);
+V9 := (-a+1+e,-b+d,0);
+V10:= ( b , -a , c);
+V11:= ( b ,-a+1, 0);
+V12:= (b-d,-a+1+e, 0);
+makeface1(1,2,3);
+makeface2(4,5,6);
+makeface3(7,8,9);
+makeface4(10,11,12);
+
+beginfig(2);
+ pickup pencircle scaled 2pt;
+ sharpraytrace;
+endfig;
+
+Spread := 120;
+f:=(3,5,-0.6);
+PrintStep := 5;
+
+numeric a, b, c, d;
+a = 0.2;
+b = 0.3;
+c = 1.3;
+d = 1.4;
+
+V1 := ( b, 2.5*a, b);
+V2 := ( b,-2.5*a, b);
+V3 := (-c,-2.5*a,-3*b);
+V4 := (-c, 2.5*a,-3*b);
+V5 := (-b, 4*a, b);
+V6 := (-b,-4*a, b);
+V7 := ( c,-4*a,-3*b);
+V8 := ( c, 4*a,-3*b);
+V9 := ( d, 2*a,-b);
+V10:= ( d,-2*a,-b);
+V11:= (-d,-2*a,-b);
+V12:= (-d, 2*a,-b);
+makeface1(1,2,3,4);
+makeface2(5,6,7,8);
+makeface3(9,10,11,12);
+
+beginfig(3);
+ pickup pencircle scaled 2pt;
+ sharpraytrace;
+endfig;
+
+Spread := 60;
+f:=7*(1,0.45,0.95);
+PrintStep := 0.25;
+
+numeric a, b, c;
+a = 0.0;
+b = 0.6;
+c = 2.0;
+
+V1 := ( 3,-1, a);
+V2 := (-3,-1, b);
+V3 := (-3,-1, c);
+V4 := ( 1, 3, a);
+V5 := ( 1,-3, b);
+V6 := ( 1,-3, c);
+V7 := (-3, 1, a);
+V8 := ( 3, 1, b);
+V9 := ( 3, 1, c);
+V10:= (-1,-3, a);
+V11:= (-1, 3, b);
+V12:= (-1, 3, c);
+makeface1(1,2,3);
+makeface2(4,5,6);
+makeface3(7,8,9);
+makeface4(10,11,12);
+
+beginfig(4);
+ pickup pencircle scaled 2pt;
+ sharpraytrace;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/signalvertexSD.mp b/graphics/metapost/contrib/macros/featpost/example/signalvertexSD.mp
new file mode 100644
index 0000000000..bbf8cb3ecb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/signalvertexSD.mp
@@ -0,0 +1,40 @@
+% signalvertexSD.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+% Draw a torus with NP dots, a section of 3.14*RS^2
+% and a total diameter of 2*(RB+RS). The dots are placed
+% on a single closed line that turns around the $z$ axis
+% NB times and around the section NS times.
+
+f := 0.45f;
+
+%SphericalDistortion := true; Spread := 11;
+
+beginfig(1);
+ NP:=2000;
+ RB:=1;
+ RS:=0.2;
+ R3:=0.0;
+ NB:=8;
+ NS:=5;
+ jB:=360*NB/NP;
+ jS:=360*NS/NP;
+ for i=1 upto NP:
+ phi :=i*jS;
+ theta :=i*jB;
+ first :=(RB+(RS+R3*sind(4*theta))*cosd(phi))*cosd(theta);
+ second:=(RB+(RS+R3*sind(4*theta))*cosd(phi))*sind(theta);
+ third := (RS+R3*sind(4*theta))*sind(phi);
+ signalvertex( (first,second,third), 1, black );
+ endfor;
+endfig;
+
+end;
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplecar.mp b/graphics/metapost/contrib/macros/featpost/example/simplecar.mp
new file mode 100644
index 0000000000..e237e1879a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplecar.mp
@@ -0,0 +1,25 @@
+% simplecar.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+%f := 0.25*(2,2.15,15.3);
+f := (2,0.15,1.1);
+Spread := 320;
+HoriZon := -0.2;
+
+beginfig(1);
+ color refpos, angcol, lencol, froncol, rearcol;
+ refpos = black;
+ angcol = black;
+ lencol = (0.6, 0.35, 0.28);
+ froncol = (0.026, 0.12, 0.06);
+ rearcol = froncol;
+ setthearena( 12, 1.3 );
+ simplecar( refpos, angcol, lencol, froncol, rearcol );
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplecarparam.mp b/graphics/metapost/contrib/macros/featpost/example/simplecarparam.mp
new file mode 100644
index 0000000000..55b92fa008
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplecarparam.mp
@@ -0,0 +1,70 @@
+% simplecarparam.mp
+% L. Nobre G.
+% 2011
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+
+%f := 0.25*(2,2.15,15.3);
+f := (3.5,8,1.1);
+Spread := 220;
+
+beginfig(1);
+ color lencol, froncol, rearcol;
+ color a, b, c, d, ca, cb, cc, cd;
+ numeric lx, ly, lz, fx, fy, fz, hei;
+ lx = 0.8;
+ ly = 0.35;
+ lz = 0.18;
+ fx = 0.1;
+ fy = 0.2;
+ fz = 0.132;
+ hei = 0.035;
+ lencol = (lx, ly, lz);
+ show lencol;
+ froncol = (fx, fy, fz);
+ show froncol;
+ rearcol = (0.6*fx, 0.3*fy, 0.76*fz );
+ show rearcol;
+ a = (0.5*lx,0.5*ly,-0.5*lz);
+ b = (0.5*lx-fx,0.5*ly,-0.5*lz);
+ c = (0.5*lx-fx,0.5*ly+fy,-0.5*lz);
+ d = (0.5*lx-fx-fz,0.5*ly+fy,-0.5*lz);
+ ca= 0.5*(lx,ly,-lz);
+ cb= 0.5*(lx,-ly,-lz);
+ cc= 0.5*(-lx,ly,-lz);
+ cd= 0.5*(-lx,-ly,-lz);
+ drawoptions( withpen pencircle scaled 1.7pt withcolor 0.65blue );
+ simplecar( black, black, lencol, froncol, rearcol );
+ drawoptions( withpen pencircle scaled 1.3pt );
+ draw rp(cd)--rp(cb) dashed evenly;
+ draw rp(cd)--rp(cc) dashed evenly;
+ draw rp(cd)--rp(-ca) dashed evenly;
+ draw rp(ca)--rp(-ca) dashed evenly;
+ draw rp(cb)--rp(-cb) dashed evenly;
+ draw rp(cc)--rp(-cc) dashed evenly;
+ draw rp(cd)--rp(-cd) dashed evenly;
+ drawdblarrow rp(a)--rp(b);
+ drawdblarrow rp(b)--rp(c);
+ drawdblarrow rp(c)--rp(d);
+ label.top( btex $\vec{o}$ etex, rp(black));
+ drawoptions( withcolor 0.87red );
+ labelinspace( true, 0.3[a,b], -red, hei*blue, btex Xf etex );
+ labelinspace( true, 0.3[b,c], green, hei*blue, btex Yf etex );
+ labelinspace( true, 0.3[c,d], -red, hei*blue, btex Zf etex );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplecenterofmass.mp b/graphics/metapost/contrib/macros/featpost/example/simplecenterofmass.mp
new file mode 100644
index 0000000000..6f7030ffbb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplecenterofmass.mp
@@ -0,0 +1,127 @@
+% simplecenterofmass.mp
+% L. Nobre G.
+% 2012
+
+verbatimtex \documentclass{article}\begin{document} etex;
+
+beginfig(0);
+ numeric u, i, j, s, as, bs, cs, ds;
+ pen pena, penb, penc, pend;
+ u = 1.5mm;
+ s = 7.1u;
+ as = 2u;
+ bs = 3u;
+ cs = 5u;
+ ds = 0.8u;
+ pena = pencircle scaled as;
+ penb = pencircle scaled bs;
+ penc = pencircle scaled cs;
+ pend = pencircle scaled ds;
+ linecap := squared;
+ for i=1 upto 4:
+ for j=1 upto 3:
+ draw ((i-1)*s,(j-1)*s)--
+ ((i-1)*s,j*s)--
+ (i*s,j*s)--
+ (i*s,(j-1)*s)--cycle withcolor 0.7white;
+ endfor;
+ endfor;
+ z1 = (s,3s);
+ z2 = (3s,3s);
+ z3 = (4s,3s);
+ z4 = (0,0);
+ z5 = (1s,2s);
+ z6 = (2s,2s);
+ z7 = (3s,2s);
+ z8 = (1s,1s);
+ z9 = (2s,1s);
+ linecap := rounded;
+ pickup pena;
+ draw z1;
+ draw z2;
+ pickup penb;
+ draw z3;
+ pickup penc;
+ draw z4;
+ pickup pend;
+ for i=5 upto 9:
+ draw z[i];
+ endfor;
+ label.urt(btex 1 kg etex, z1);
+ label.urt(btex 1 kg etex, z2);
+ label.rt(btex 2 kg etex, z3+(bs/2,0));
+ label.urt(btex 8 kg etex, z4+(0,cs/2));
+ label.urt(btex A etex, z5);
+ label.urt(btex B etex, z6);
+ label.urt(btex C etex, z7);
+ label.urt(btex D etex, z8);
+ label.urt(btex E etex, z9);
+endfig;
+
+beginfig(1);
+ numeric u, i, j, s, opt;
+ pen pena, penb;
+ pair PO[];
+ u = 1.5mm;
+ s = 7.1u;
+ pena = pencircle scaled 1.6u;
+ penb = pencircle scaled 0.6u;
+ linecap := squared;
+ for i=1 upto 4:
+ for j=1 upto 3:
+ draw ((i-1)*s,(j-1)*s)--
+ ((i-1)*s,j*s)--
+ (i*s,j*s)--
+ (i*s,(j-1)*s)--cycle withcolor 0.7white;
+ endfor;
+ endfor;
+ z1 = (0,0);
+ z2 = (4,3);
+ z4 = (1,2);
+ z5 = (2,2);
+ z6 = (3,2);
+ z7 = (1,1);
+ z8 = (2,1);
+ forever:
+ opt := uniformdeviate(1);
+ if opt<0.3333:
+ PO3 := (1,3);
+ elseif opt<0.6667:
+ PO3 := (0,3);
+ else:
+ PO3 := (0,2);
+ fi;
+ opt := uniformdeviate(1);
+ if opt<0.3333:
+ PO9 := z4;
+ elseif opt<0.6667:
+ PO9 := z5;
+ else:
+ PO9 := z7;
+ fi;
+ numeric massadois, massatres;
+ PO9 = massadois*(z2-PO9)+massatres*(PO3-PO9);
+ exitif (massadois>0) and (massatres>0);
+ endfor;
+ linecap := rounded;
+ z3 = PO3;
+ for i=1 upto 3:
+ draw z[i] scaled s withpen pena;
+ endfor;
+ for i=4 upto 8:
+ draw z[i] scaled s withpen penb;
+ endfor;
+ label.urt(decimal(round(massatres*24)) & "kg", z3 scaled s);
+ label.urt(decimal(round(massadois*24)) & "kg", z2 scaled s);
+ label.urt("24kg", z1 scaled s);
+ label.urt(btex A etex, z4 scaled s);
+ label.urt(btex B etex, z5 scaled s);
+ label.urt(btex C etex, z6 scaled s);
+ label.urt(btex D etex, z7 scaled s);
+ label.urt(btex E etex, z8 scaled s);
+ draw fullcircle scaled 1.6u shifted (PO9 scaled s) withcolor red;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplelens.mp b/graphics/metapost/contrib/macros/featpost/example/simplelens.mp
new file mode 100644
index 0000000000..d32f30d02d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplelens.mp
@@ -0,0 +1,114 @@
+% simplelens.mp
+% L. Nobre G.
+% 2013
+
+prologues := 1;
+
+numeric specialdist, otherdist;
+specialdist = 2.5cm;
+color TableC[];
+TableC0 := (0.65,0.61,0.49); % grey %% G N U P L O T
+TableC1 := 0.77red; % red %%
+TableC2 := ( 0.2, 0.2, 1.0 ); % blue %% colors
+TableC3 := ( 1.0, 0.7, 0.0 ); % orange %%
+TableC4 := 0.85green; % pale green %%
+TableC5 := 0.90*(red+blue); % magenta %%
+TableC6 := 0.85*(green+blue); % cyan %%
+TableC7 := 0.85*(red+green); % yellow %%
+
+vardef lensrefractray(expr s,a,p,q,rir,c)=
+ save tI,tn,ia,ib,I,J,K,sib;
+ pair I,J,K;
+ draw s--(s-2cm*dir(a)) withcolor TableC[c];
+ tI = xpart(p intersectiontimes (s--(s+15cm*dir(a))));
+ if tI>=0:
+ I=point tI of p;
+ draw s--I withcolor TableC[c];
+ tn=angle(direction tI of p)+90;
+ ia=tn-angle(s-I);
+ sib=sind(ia)/rir;
+ ib=-angle(1+-+sib,sib);
+ J=I+dir(tn+180+ib)*2cm;
+ tI := xpart(q intersectiontimes (I--J));
+ if tI>=0:
+ K:=point tI of q;
+ draw I--K withcolor TableC0;
+ tn:=angle(direction tI of q)+90;
+ ia:=tn-angle(I-K);
+ if sind(ia)<1/rir:
+ sib:=rir*sind(ia);
+ ib:=angle(1+-+sib,sib);
+ J:=K-dir(tn-ib)*specialdist;
+ draw K--J withcolor TableC[c];
+ fi;
+ fi;
+ fi;
+enddef;
+
+beginfig(1);
+ numeric rir, ray, wid, dist, ha, dx, dy, bord, cx, cy, cent, a, sa, nr, m;
+ numeric refang, colorcounter;
+ path vseg, cseg, lens, cell;
+ pen fordot;
+ color lenscolor, cellcolor;
+ refang = 41;
+ m = 1.2mm;
+ nr = 9;
+ rir = 1.2;
+ ray = 2.3cm;
+ wid = 3.9cm;
+ dist = 1.1cm;
+ bord = 1mm;
+ fordot = pencircle scaled 1mm;
+ lenscolor = 0.6white;
+ cellcolor = 0.4white;
+ dy = 0.5*wid;
+ dx = ray+-+dy;
+ cx = 0.5*bord;
+ cy = dy-bord;
+ cent = dx-dist;
+ ha = angle(dist,cy);
+ sa = 2ha/nr;
+ z1 = (dx,ray);
+ z2 = (dx,-ray);
+ z3 = (cent,0);
+ z4 = (dx,cy);
+ z5 = (dx,-cy);
+ z6 = (0,cy);
+ z7 = (0,-cy);
+ z8 = (ray,cy);
+ z9 = (ray,-cy);
+ vseg = z2--z1;
+ %cseg = halfcircle rotated -90 scaled 2ray;
+ cseg = (dx,-dy){dir(refang)}..(ray,0)..{dir(180-refang)}(dx,dy);
+ lens = buildcycle(reverse vseg,z7--z9,cseg,z8--z6);
+ fill lens withcolor lenscolor;
+ cell = ((cx,cy)--(-cx,cy)--(-cx,-cy)--(cx,-cy)--cycle) shifted z3;
+ fill cell withcolor cellcolor;
+ %draw z3 withpen fordot;
+ colorcounter = 1;
+ for a=0.5*sa step sa until ha-sa:
+ if not (colorcounter<>7):
+ colorcounter:= 1;
+ else:
+ colorcounter := incr(colorcounter);
+ fi;
+ lensrefractray(z3,a,vseg,cseg,1.9,colorcounter);
+ lensrefractray(z3+up*m,a,vseg,cseg,1.9,colorcounter);
+ lensrefractray(z3+down*m,a,vseg,cseg,1.9,colorcounter);
+ if not (colorcounter<>7):
+ colorcounter:= 0;
+ else:
+ colorcounter := incr(colorcounter);
+ fi;
+ lensrefractray(z3,-a,vseg,cseg,1.9,colorcounter);
+ lensrefractray(z3+up*m,-a,vseg,cseg,1.9,colorcounter);
+ lensrefractray(z3+down*m,-a,vseg,cseg,1.9,colorcounter);
+ endfor;
+ otherdist = ray+specialdist-0.5cm;
+ clip currentpicture to (-otherdist,-cy)--(-otherdist,cy)--(otherdist,cy)--(otherdist,-cy)--cycle;
+endfig;
+
+end.
+
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplependulum.mp b/graphics/metapost/contrib/macros/featpost/example/simplependulum.mp
new file mode 100644
index 0000000000..8b097105fb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplependulum.mp
@@ -0,0 +1,51 @@
+% simplependulum.mp
+% L. Nobre G.
+% 2012
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+prologues := 3;
+
+beginfig(1);
+ numeric u, len, hei, ang, maxa, hala, num, signa, marga, margb, ste;
+ u = 2.2mm;
+ len = 15u;
+ hei = 4u;
+ maxa = angle( len-hei, len +-+ (len-hei) );
+ num = 8;
+ hala = 0.7*maxa;
+ signa = -1;
+ marga = 2u;
+ margb = 1u;
+ ste = maxa/num;
+ z1 = len*(signa*sind(maxa),-cosd(maxa));
+ z7 = len*(-signa*sind(hala),-cosd(hala));
+ z2 = (0,-len);
+ z6 = z1 + (signa*marga,0);
+ z5 = z6 + (signa*margb,0);
+ z3 = (x6,y2);
+ z4 = (x5,y2);
+ draw origin--z1;
+ draw origin--z2 dashed evenly;
+ draw z2--z4 dashed evenly;
+ draw z1--z5 dashed evenly;
+ path mov, penda, pendb;
+ mov = z1 for ang=signa*(maxa-ste) step -signa*ste until -signa*hala:
+ ..len*(sind(ang),-cosd(ang)) endfor;
+ penda = fullcircle scaled 2u shifted z1;
+ pendb = fullcircle scaled 2u shifted z2;
+ fill penda withcolor 0.5white;
+ draw penda;
+ unfill pendb;
+ draw pendb dashed evenly;
+ drawarrow mov dashed evenly;
+ drawdblarrow z3--z6;
+ label( btex $h$ etex, 0.5[z4,z5] );
+ label( btex $A$ etex, z1+down*(u+margb) );
+ label( btex $B$ etex, z2+down*(u+margb) );
+ label.top( btex $O$ etex, origin );
+endfig;
+
+verbatimtex \end{document} etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/simplexperiment.mp b/graphics/metapost/contrib/macros/featpost/example/simplexperiment.mp
new file mode 100644
index 0000000000..2d75752bbe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/simplexperiment.mp
@@ -0,0 +1,72 @@
+% simplexperiment.mp
+% L. Nobre G.
+% 2007
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{mathpazo}
+\begin{document}
+etex
+
+beginfig(1);
+ Spread := 45;
+ numeric barh, barl, bart, bardist, bardept, sphr, numlats, i, ie, is;
+ numeric cicon, alpha, fhd, conr, conh, linel;
+ color centerb, linpa, linpb, linpc;
+ path tmp, lina, cicloi;
+ pen thin, thick, aver;
+ sphr = 1;
+ conr = 0.3;
+ barh = 1;
+ barl = 7;
+ bart = 0.2;
+ numlats = 2;
+ linel = 5;
+ ie = 630;
+ is = 5;
+ alpha = 40;
+ fhd = 9;
+ f := 3*(fhd*cosd(alpha)-sphr*sind(alpha),fhd*sind(alpha)+sphr*cosd(alpha),2);
+ bardist = sphr*sind(90/numlats);
+ bardept = sphr*cosd(90/numlats);
+ conh = barh+bardept-sphr;
+ cicon = bardept*3.14159/180.0;
+ thin = pencircle scaled 0.5pt;
+ thick= pencircle scaled 1.5pt;
+ aver = pencircle scaled 1.0pt;
+ ahlength:=2mm;
+ ahangle:=30;
+% kindofcube( WithDash, IsVertex, RefP, AngA, AngB, AngC, LenA, LenB, LenC )
+ kindofcube(false,true,(-bardist-bart,0,-bardept),0,0,180,bart,barl,barh );
+% tropicalglobe( expr NumLats, TheCenter, Radius, AngulMom );
+ tropicalglobe( numlats, black, sphr, red );
+ cicloi = rp((0,0,sphr)) for i=is step is until ie:
+ ..rp((0,-sphr*sind(i)-cicon*i,sphr*cosd(i))) endfor;
+ draw cicloi;
+ kindofcube( false, true, (bardist,0,-bardept), 0,0,180, bart, barl, barh );
+ centerb = 2*sphr*(-sind(alpha),cosd(alpha),0);
+ linpb = -blue*(bardept+barh);
+ linpa = linpb+green*linel;
+ linpc = linpb+linel*(green*cosd(alpha)-red*sind(alpha));
+ draw rp(linpa)--rp(linpb)--rp(linpc);
+ angline( linpa, linpc, linpb, 0.7*linel, btex $\alpha$ etex scaled 3)(rt);
+ verygoodcone(false,centerb-(sphr+conh)*blue,blue,conr,centerb-sphr*blue);
+ tmp = rigorousfearpath( centerb, sphr );
+ unfill tmp;
+ draw tmp;
+ drawoptions( dashed evenly );
+ draw goodcirclepath( black, blue, sphr );
+ draw goodcirclepath( centerb, blue, sphr );
+
+
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/sincityredesigned.mp b/graphics/metapost/contrib/macros/featpost/example/sincityredesigned.mp
new file mode 100644
index 0000000000..83adbd0f03
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sincityredesigned.mp
@@ -0,0 +1,264 @@
+
+prologues := 1;
+
+beginfig(1);
+ linejoin := mitered;
+ numeric controlparam;
+ controlparam = 5mm;
+ path PreeditedPath[];
+ PreeditedPath1 = hide(z1=(304.883,266.453))z1..controls
+ hide(z2=(303.009,265.609))z2 and
+ hide(z3=(297.112,264.877))z3..hide(z4=(291.817,264.83))z4
+ --hide(z5=(282.167,264.745))z5--hide(z6=(280.885,249.372))z6..controls
+ hide(z7=(280.174,240.832))z7 and
+ hide(z8=(279.111,234))z8..hide(z9=(278.494,234))z9
+ ..controls hide(z10=(277.871,234))z10 and
+ hide(z11=(274.31,236.621))z11..hide(z12=(270.381,239.971))z12
+ ..controls hide(z13=(262.387,246.786))z13 and
+ hide(z14=(259.108,247.209))z14..hide(z15=(245.785,243.138))z15
+ ..controls hide(z16=(240.661,241.572))z16 and
+ hide(z17=(234.133,240.4))z17..hide(z18=(231.096,240.5))z18
+ ..controls hide(z19=(221.716,240.809))z19 and
+ hide(z20=(220.916,238.612))z20..hide(z21=(219.534,208.721))z21
+ ..controls hide(z22=(218.847,193.861))z22 and
+ hide(z23=(218.823,178.971))z23..hide(z24=(219.482,175.585))z24
+ ..controls hide(z25=(220.592,169.876))z25 and
+ hide(z26=(221.19,169.381))z26..hide(z27=(227.851,168.665))z27
+ ..controls hide(z28=(235.366,167.856))z28 and
+ hide(z29=(247.664,172.576))z29..hide(z30=(247.664,176.269))z30
+ ..controls hide(z31=(247.664,180.709))z31 and
+ hide(z32=(255.027,204.963))z32..hide(z33=(256.375,204.963))z33
+ ..controls hide(z34=(257.214,204.963))z34 and
+ hide(z35=(262.182,202.207))z35..hide(z36=(267.307,198.899))z36
+ ..controls hide(z37=(280.629,190.298))z37 and
+ hide(z38=(287.926,188.002))z38..hide(z39=(297.368,189.437))z39
+ ..controls hide(z40=(310.542,191.44))z40 and
+ hide(z41=(314.953,195.911))z41..hide(z42=(318.083,210.429))z42
+ ..controls hide(z43=(323.752,236.733))z43 and
+ hide(z44=(324.666,242.082))z44..hide(z45=(325.697,255.009))z45
+ --hide(z46=(326.746,268.161))z46
+ --hide(z47=(317.523,268.075))z47..controls hide(z48=(312.398,268.028))z48
+ and hide(z49=(306.781,267.307))z49..cycle;
+ PreeditedPath2 = hide(z50=(182.759,231.97))z50..controls
+ hide(z51=(174.744,229.708))z51 and
+ hide(z52=(174.156,228.876))z52..hide(z53=(173.193,218.457))z53
+ ..controls hide(z54=(172.721,213.357))z54 and
+ hide(z55=(171.267,202.743))z55..hide(z56=(169.941,194.715))z56
+ ..controls hide(z57=(163.9,158.163))z57 and
+ hide(z58=(164.703,149.053))z58..hide(z59=(173.707,151.991))z59
+ ..controls hide(z60=(176.323,152.845))z60 and
+ hide(z61=(182.588,153.88))z61..hide(z62=(187.542,154.276))z62
+ ..controls hide(z63=(201.233,155.371))z63 and
+ hide(z64=(204.848,159.872))z64..hide(z65=(208.362,180.197))z65
+ ..controls hide(z66=(209.514,186.858))z66 and
+ hide(z67=(211.473,197.07))z67..hide(z68=(212.786,203.255))z68
+ ..controls hide(z69=(219.311,234))z69 and
+ hide(z70=(219.311,234))z70..hide(z71=(201.889,233.805))z71
+ ..controls hide(z72=(194.715,233.725))z72 and
+ hide(z73=(186.02,232.891))z73..cycle;
+ PreeditedPath3 = hide(z74=(127.248,220.173))z74..controls
+ hide(z75=(107.435,213.404))z75 and
+ hide(z76=(79.562,199.048))z76..hide(z77=(74.5039,193.007))z77
+ ..controls hide(z78=(68.4971,185.833))z78 and
+ hide(z79=(61.489,170.106))z79..hide(z80=(61.489,163.8))z80
+ ..controls hide(z81=(61.489,159.558))z81 and
+ hide(z82=(62.5991,158.602))z82..hide(z83=(71.3101,155.345))z83
+ ..controls hide(z84=(76.7759,153.302))z84 and
+ hide(z85=(85.1082,150.878))z85..hide(z86=(90.0984,149.879))z86
+ ..controls hide(z87=(95.0518,148.889))z87 and
+ hide(z88=(99.0657,147.551))z88..hide(z89=(99.0657,146.89))z89
+ ..controls hide(z90=(99.0657,146.226))z90 and
+ hide(z91=(94.2832,143.342))z91..hide(z92=(88.3049,140.401))z92
+ ..controls hide(z93=(76.178,134.435))z93 and
+ hide(z94=(63.4753,131.962))z94..hide(z95=(58.5852,134.617))z95
+ ..controls hide(z96=(56.0232,136.008))z96 and
+ hide(z97=(54.4861,135.947))z97..hide(z98=(52.4363,134.375))z98
+ ..controls hide(z99=(49.1121,131.825))z99 and
+ hide(z100=(51.0422,117.683))z100..hide(z101=(55.3677,112.901))z101
+ ..controls hide(z102=(59.9397,107.845))z102 and
+ hide(z103=(71.7371,105.477))z103..hide(z104=(81.4729,107.659))z104
+ ..controls hide(z105=(100.944,112.023))z105 and
+ hide(z106=(124.681,122.025))z106..hide(z107=(142.791,133.498))z107
+ ..controls hide(z108=(155.26,141.396))z108 and
+ hide(z109=(156.223,142.747))z109..hide(z110=(157.815,154.577))z110
+ ..controls hide(z111=(159.443,166.668))z111 and
+ hide(z112=(156.455,169.328))z112..hide(z113=(135.959,174.038))z113
+ ..controls hide(z114=(126.906,176.118))z114 and
+ hide(z115=(119.187,178.418))z115..hide(z116=(118.724,179.172))z116
+ ..controls hide(z117=(117.77,180.728))z117 and
+ hide(z118=(147.232,198.131))z118..hide(z119=(150.819,198.131))z119
+ ..controls hide(z120=(152.271,198.131))z120 and
+ hide(z121=(154.38,195.911))z121..hide(z122=(155.687,193.007))z122
+ ..controls hide(z123=(156.993,190.104))z123 and
+ hide(z124=(158.437,187.883))z124..hide(z125=(159.018,187.883))z125
+ ..controls hide(z126=(159.582,187.883))z126 and
+ hide(z127=(162.09,191.641))z127..hide(z128=(164.603,196.252))z128
+ ..controls hide(z129=(170.373,206.842))z129 and
+ hide(z130=(170.682,217.263))z130..hide(z131=(165.337,221.03))z131
+ ..controls hide(z132=(159.717,224.992))z132 and
+ hide(z133=(140.058,224.549))z133..cycle;
+ PreeditedPath4 = hide(z134=(373.29,181.905))z134..controls
+ hide(z135=(367.765,173.877))z135 and
+ hide(z136=(363.069,167.387))z136..hide(z137=(362.785,167.387))z137
+ ..controls hide(z138=(361.491,167.387))z138 and
+ hide(z139=(348.78,175.029))z139..hide(z140=(343.826,178.785))z140
+ --hide(z141=(338.361,182.93))z141
+ --hide(z142=(331.529,176.098))z142..controls
+ hide(z143=(327.771,172.34))z143 and
+ hide(z144=(323.39,167.267))z144..hide(z145=(321.793,164.825))z145
+ ..controls hide(z146=(318.889,160.384))z146 and
+ hide(z147=(318.889,160.384))z147..hide(z148=(327.429,151.909))z148
+ ..controls hide(z149=(340.46,138.978))z149 and
+ hide(z150=(341.004,137.325))z150..hide(z151=(336.781,123.49))z151
+ ..controls hide(z152=(334.853,117.171))z152 and
+ hide(z153=(333.626,109.929))z153..hide(z154=(334.091,107.606))z154
+ ..controls hide(z155=(334.924,103.437))z155 and
+ hide(z156=(335.286,103.338))z156..hide(z157=(349.292,103.421))z157
+ ..controls hide(z158=(357.149,103.468))z158 and
+ hide(z159=(363.91,103.854))z159..hide(z160=(364.237,104.275))z160
+ ..controls hide(z161=(364.569,104.701))z161 and
+ hide(z162=(368.408,113.413))z162..hide(z163=(372.856,123.832))z163
+ ..controls hide(z164=(380.732,142.279))z164 and
+ hide(z165=(388.471,155.431))z165..hide(z166=(400.498,170.803))z166
+ ..controls hide(z167=(403.838,175.073))z167 and
+ hide(z168=(406.511,179.628))z168..hide(z169=(406.511,181.051))z169
+ ..controls hide(z170=(406.511,183.073))z170 and
+ hide(z171=(394.042,191.439))z171..hide(z172=(384.307,195.948))z172
+ ..controls hide(z173=(383.74,196.211))z173 and
+ hide(z174=(378.815,189.933))z174..cycle;
+ PreeditedPath5 = hide(z175=(306.591,170.416))z175..controls
+ hide(z176=(284.045,163.442))z176 and
+ hide(z177=(261.654,155.676))z177..hide(z178=(250.226,150.864))z178
+ ..controls hide(z179=(242.882,147.771))z179 and
+ hide(z180=(235.916,145.182))z180..hide(z181=(234.939,145.182))z181
+ ..controls hide(z182=(233.842,145.182))z182 and
+ hide(z183=(232.98,137.496))z183..hide(z184=(232.719,125.369))z184
+ --hide(z185=(232.292,105.556))z185
+ --hide(z186=(238.697,106.666))z186..controls
+ hide(z187=(242.284,107.288))z187 and
+ hide(z188=(246.53,108.19))z188..hide(z189=(248.347,108.716))z189
+ ..controls hide(z190=(251.392,109.597))z190 and
+ hide(z191=(251.532,108.801))z191..hide(z192=(250.615,95.8203))z192
+ ..controls hide(z193=(249.493,79.9358))z193 and
+ hide(z194=(250.483,78.3792))z194..hide(z195=(260.816,79.7881))z195
+ ..controls hide(z196=(270.245,81.074))z196 and
+ hide(z197=(273.79,85.0598))z197..hide(z198=(284.336,106.239))z198
+ ..controls hide(z199=(292.162,121.953))z199 and
+ hide(z200=(293.65,123.879))z200..hide(z201=(301.04,127.846))z201
+ ..controls hide(z202=(308.217,131.699))z202 and
+ hide(z203=(309.449,133.226))z203..hide(z204=(311.715,141.083))z204
+ ..controls hide(z205=(313.144,146.036))z205 and
+ hide(z206=(314.277,151.74))z206..hide(z207=(314.277,153.979))z207
+ ..controls hide(z208=(314.277,156.237))z208 and
+ hide(z209=(314.957,160.384))z209..hide(z210=(315.831,163.458))z210
+ ..controls hide(z211=(317.785,170.333))z211 and
+ hide(z212=(314.448,172.845))z212..cycle;
+ PreeditedPath6 = hide(z213=(200.352,136.887))z213..controls
+ hide(z214=(194.544,135.348))z214 and
+ hide(z215=(189.243,133.54))z215..hide(z216=(188.612,132.885))z216
+ ..controls hide(z217=(187.443,131.669))z217 and
+ hide(z218=(185.57,95.9912))z218..hide(z219=(185.617,75.8364))z219
+ ..controls hide(z220=(185.647,63.0261))z220 and
+ hide(z221=(188.351,57.2344))z221..hide(z222=(193.52,58.9067))z222
+ ..controls hide(z223=(195.607,59.5823))z223 and
+ hide(z224=(199.327,60.5022))z224..hide(z225=(201.889,60.9766))z225
+ ..controls hide(z226=(204.405,61.4424))z226 and
+ hide(z227=(208.467,64.3926))z227..hide(z228=(210.827,67.467))z228
+ ..controls hide(z229=(218.335,77.2478))z229 and
+ hide(z230=(226.481,103.677))z230..hide(z231=(227.989,123.149))z231
+ ..controls hide(z232=(228.823,133.909))z232 and
+ hide(z233=(228.631,134.752))z233..hide(z234=(224.777,137.26))z234
+ ..controls hide(z235=(219.588,140.637))z235 and
+ hide(z236=(214.187,140.554))z236..cycle;
+ PreeditedPath7 = hide(z237=(147.232,125.456))z237..controls
+ hide(z238=(124.174,119.222))z238 and
+ hide(z239=(97.5039,98.374))z239..hide(z240=(88.1265,79.2524))z240
+ --hide(z241=(83.3518,69.5166))z241
+ --hide(z242=(88.6506,59.0977))z242..controls
+ hide(z243=(97.6846,41.3342))z243 and
+ hide(z244=(99.9316,39.4353))z244..hide(z245=(114.267,37.449))z245
+ ..controls hide(z246=(125.814,35.8491))z246 and
+ hide(z247=(128.102,36.0742))z247..hide(z248=(140.741,40.0542))z248
+ ..controls hide(z249=(160.896,46.4009))z249 and
+ hide(z250=(167.846,50.8127))z250..hide(z251=(170.471,58.927))z251
+ ..controls hide(z252=(171.687,62.6846))z252 and
+ hide(z253=(174.603,67.5432))z253..hide(z254=(176.952,69.7241))z254
+ ..controls hide(z255=(181.734,74.165))z255 and
+ hide(z256=(181.908,75.1035))z256..hide(z257=(178.752,79.4233))z257
+ ..controls hide(z258=(176.002,83.186))z258 and
+ hide(z259=(173.877,82.7844))z259..hide(z260=(152.869,74.531))z260
+ ..controls hide(z261=(142.108,70.3037))z261 and
+ hide(z262=(134.704,68.4663))z262..hide(z263=(128.188,68.4065))z263
+ --hide(z264=(118.879,68.321))z264
+ --hide(z265=(123.902,73.616))z265..controls
+ hide(z266=(135.407,85.7429))z266 and
+ hide(z267=(158.517,97.1145))z267..hide(z268=(164.654,93.6689))z268
+ ..controls hide(z269=(168.903,91.2834))z269 and
+ hide(z270=(170.716,93.4292))z270..hide(z271=(173.831,104.531))z271
+ ..controls hide(z272=(178.624,121.612))z272 and
+ hide(z273=(178.563,124.468))z273..hide(z274=(173.365,126.432))z274
+ ..controls hide(z275=(167.23,128.75))z275 and
+ hide(z276=(158.163,128.411))z276..cycle;
+ numeric i, j;
+ for i=1 upto 7:
+ PreeditedPath[7+i] = point 0 of PreeditedPath[i]
+ for j=controlparam step controlparam until arclength PreeditedPath[i]:
+ --point (arctime j of PreeditedPath[i]) of PreeditedPath[i]
+ endfor --cycle;
+ fill PreeditedPath[7+i];
+ endfor;
+ picture sincitytext;
+ sincitytext = currentpicture;
+ currentpicture := nullpicture;
+ bboxmargin := 1cm;
+ fill bbox sincitytext;
+ draw sincitytext withcolor (0.99,0.05,0.05);
+endfig;
+
+beginfig(2);
+ pair shif;
+ shif = (87mm,61.5mm);
+ color madred;
+ madred = (0.99,0.05,0.05);
+ linejoin := mitered;
+ numeric controlparam, devparam, ranparam;
+ controlparam = 0.95mm;
+ devparam = 1mm;
+ ranparam = 1.5mm;
+ pickup pencircle scaled 2mm;
+ numeric i, j, t;
+ pair aux, dev, tdr;
+ for i=1 upto 7:
+ aux := point 0 of PreeditedPath[i];
+ tdr := unitvector( direction 0 of PreeditedPath[i] );
+ dev := normaldeviate*ranparam*(ypart tdr,-xpart tdr);
+ dev := dev+devparam*(ypart tdr,-xpart tdr);
+ PreeditedPath[14+i] = (dev+aux)
+ for j=controlparam step controlparam until arclength PreeditedPath[i]:
+ hide( t := arctime j of PreeditedPath[i];
+ aux := point t of PreeditedPath[i];
+ tdr := unitvector( direction t of PreeditedPath[i] );
+ dev := normaldeviate*ranparam*(ypart tdr,-xpart tdr) ;
+ dev := dev+devparam*(ypart tdr,-xpart tdr) )
+ --(dev+aux)
+ endfor --cycle;
+ endfor;
+ for i=1 upto 3:
+ fill PreeditedPath[14+i] withcolor madred;
+ fill PreeditedPath[i] withcolor black;
+ draw PreeditedPath[i] withcolor madred;
+ endfor;
+ for i=4 upto 7:
+ fill PreeditedPath[14+i] shifted shif withcolor madred;
+ fill PreeditedPath[i] shifted shif withcolor black;
+ draw PreeditedPath[i] shifted shif withcolor madred;
+ endfor;
+ picture sincitytext;
+ sincitytext = currentpicture rotated -14.5;
+ currentpicture := nullpicture;
+ bboxmargin := 1cm;
+ fill bbox sincitytext;
+ draw sincitytext;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/slingshot.mp b/graphics/metapost/contrib/macros/featpost/example/slingshot.mp
new file mode 100644
index 0000000000..b8c26d9af5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/slingshot.mp
@@ -0,0 +1,87 @@
+% slingshot.mp
+% L. Nobre G.
+% 2008
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+%prologues := 0;
+
+% verbatimtex
+% \documentclass{article}
+% \usepackage{beton,concmath,ccfonts}
+% \begin{document}
+% etex
+
+f := (30,0,0);
+Spread := 100;
+MaxFearLimit := 50;
+
+numeric initdist, timestep, Gfactor, vplanet, vprobe;
+numeric targetangle, cutlinangle;
+inidist = 10;
+timestep = 0.1;
+Gfactor = 7;
+vplanet = 1.3;
+vprobe = 1.2;
+numeric numsteps, cutlinelen, distfraction, numtries, diststep, i, ip;
+numeric a, aa, ab, ac;
+color inipos, inivel, dstp, iter;
+path cutlinepath, traject;
+
+def gravitfield( expr relatposprobe ) =
+ ( -Gfactor*relatposprobe/((conorm( relatposprobe ))**3) )
+enddef;
+
+def costfu( expr actang ) =
+ (((cutlinangle-actang-targetangle)/targetangle)**2)
+enddef;
+
+vardef scalarfu( expr index ) =
+ traject:=trajectorypath(
+ numsteps,
+ inipos+index*dstp,
+ inivel,
+ timestep)(gravitfield);
+ draw traject;
+ ip := xpart( traject intersectiontimes cutlinepath );
+ a := costfu( angle(direction ip of traject) );
+ ( a )
+enddef;
+
+beginfig(1);
+ targetangle = 50;
+ cutlinelen = 15;
+ distfraction = 0.74;
+ numtries = 36;
+ numsteps = 135;
+ diststep = distfraction*inidist/numtries;
+ dstp = (0,0,diststep);
+ inipos = (0,0,-inidist);
+ inivel = (0,-vplanet,vprobe);
+ cutlinangle = angle( (-vplanet,vprobe) );
+ %cartaxes( 1, 1, 1 );
+ cutlinepath = rp(black)--rp(cutlinelen*N(inivel));
+ draw cutlinepath withcolor red;
+ drawoptions( withcolor blue );
+ for i=0 upto numtries:
+ show (i,scalarfu( i ));
+ endfor;
+ drawoptions();
+ iter = (0,0.5*numtries,numtries);
+ message "--------------------------------------------------------";
+ forever:
+ iter := minimizestep( iter )( scalarfu );
+ exitif (Z(iter)-X(iter)<0.5) or (Y(iter)<0.005);
+ endfor;
+ draw traject withcolor green withpen (pencircle scaled (2.5mm)) ;
+ produce_auto_scale;
+endfig;
+
+% verbatimtex
+% \end{document}
+% etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/smC.mp b/graphics/metapost/contrib/macros/featpost/example/smC.mp
new file mode 100644
index 0000000000..f82b120c17
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/smC.mp
@@ -0,0 +1,153 @@
+% smC.mp
+% P. J. Sebastiao
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+verbatimtex \documentclass{article} \usepackage{beton} \usepackage{concmath} \usepackage{ccfonts} \begin{document} etex
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color field, nalfa, ngamma[], alfacnt, gammacnt, nazy, nax;
+ path alfa, gamma;
+ numeric nalfad, theta, radius, gammang, xxsize, yysize, zzsize;
+ numeric xxpos, yypos, zzpos, fieldpos, deltarad, deltapos;
+ numeric thetarad, thetapos, nalfapos, ngammapos,veccpos;
+ numeric etalpharad, etalphapos, alphapos, gammapos;
+ picture xxlabel, yylabel, zzlabel, fieldlabel, deltalabel, xxcalabel,yycalabel;
+ picture nalfalabel, ngammalabel, etalphalabel, alphalabel;
+ picture gammalabel, thetalabel,vecclabel;
+
+ f := (3,4,2);
+ Spread := 100;
+ xxsize := 0.8;
+ xxpos := 6;
+ yysize := 0.8;
+ yypos := 6;
+ zzsize := 1.3;
+ zzpos := 4;
+ field := (0.7,0.3,0.3);
+ fieldpos := 2;
+ deltarad := 0.45;
+ deltapos := 3;
+ nalfad := 1.0;
+ theta := 25;
+ thetarad := 0.3;
+ thetapos := 2;
+ nalfapos := 7;
+ gammang := 160;
+ ngammapos := 7;
+ etalpharad := 0.4;
+ etalphapos := 4;
+ alphapos := 6;
+ gammapos := 6;
+ veccpos := 3;
+
+ xxcalabel = btex $x_{\mbox{\protect \scriptsize layer}}$ etex;
+ yycalabel = btex $y_{\mbox{\protect \scriptsize layer}}$ etex;
+ xxlabel = btex $x_{\mbox{\protect \scriptsize cone}}$ etex;
+ yylabel = btex $y_{\mbox{\protect \scriptsize cone}}$ etex;
+ zzlabel = btex $z_{\mbox{\protect \scriptsize cone}}$ etex;
+ deltalabel = btex $\Delta$ etex;
+ fieldlabel = btex $\mathbf{B}$ etex;
+ thetalabel = btex $\theta$ etex;
+ nalfalabel = btex $\mathbf{n}_\alpha$ etex;
+ ngammalabel = btex $\mathbf{n}_\gamma$ etex;
+ etalphalabel= btex $\eta_\alpha$ etex;
+ alphalabel = btex $\alpha$ etex;
+ gammalabel = btex $\gamma$ etex;
+ vecclabel = btex $\mathbf{c}$ etex;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+ nalfa = (0,sind(theta),cosd(theta));
+ alfacnt = (0,0,nalfad*cosd(theta));
+ radius = nalfad*sind(theta);
+ alfa = rigorouscircle( alfacnt, (0,0,1), radius );
+ gammacnt = cosd(theta)*cosd(theta)*nalfa;
+ radius := cosd(theta)*sind(theta);
+ gamma = rigorouscircle( gammacnt, nalfa, radius );
+
+ for i=0 step 40 until 0:
+ nazy := radius*sind(gammang+i)*ncrossprod( nalfa, axxc );
+ nax := radius*cosd(gammang+i)*ncrossprod( ayyc, nalfa );
+ ngamma[i] := gammacnt+nax+nazy;
+ drawarrow rp(orig)..rp(ngamma[i]);
+ endfor;
+
+ draw alfa dashed evenly;
+
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+ drawarrow rp(orig)..rp(field);
+ drawarrow rp(orig)..rp(nalfa);
+% draw subpath (3.05,1.05) of alfa;
+% drawarrow subpath (4,3) of alfa;
+% draw subpath (0,1.3) of gamma;
+% draw subpath (7.5,8) of gamma;
+% drawarrow subpath (1,2) of gamma;
+ anglinen( field, azzc, orig, deltarad, deltalabel, deltapos );
+ anglinen( azzc, nalfa, orig, thetarad, thetalabel, thetapos );
+ anglinen( ngamma0, field, orig, etalpharad, etalphalabel, etalphapos );
+ labeln( xxlabel, rp(axxc), xxpos );
+ labeln( yylabel, rp(ayyc), yypos );
+ labeln( zzlabel, rp(azzc), zzpos );
+ labeln( fieldlabel, rp(field), fieldpos );
+ labeln( nalfalabel, rp(nalfa), nalfapos );
+ labeln( ngammalabel, rp(ngamma0), ngammapos );
+ labeln( alphalabel, point 1.8 of alfa, alphapos );
+ labeln( gammalabel, point 8 of gamma, gammapos );
+ labeln( yycalabel, rp(gammacnt+1.3*radius*(-1,0,0)), 0);
+ labeln( xxcalabel, rp(gammacnt+1.3*radius*(0,1,-sind(theta))), 0);
+ pickup pencircle scaled 1.5;
+ draw rp(alfacnt);
+ draw rp(gammacnt);
+ pickup pencircle scaled 0.5;
+
+ path arco, recta_um, recta_dois, recta_xlayer, path_ngamma;
+ pickup pencircle scaled 0.5;
+ recta_um = rp(alfacnt)--rp(alfacnt+1.11*radius*(1,0,0));
+ recta_dois = rp(alfacnt)--rp(alfacnt+1.11*radius*(0,1,0));
+ draw recta_um;
+ draw recta_dois;
+
+ pickup pencircle scaled 1;
+ arco = (alfa cutbefore recta_dois) cutafter recta_um;
+ draw arco;
+
+
+ pickup pencircle scaled 0.5;
+ drawarrow rp(gammacnt)--rp(gammacnt+1.3*radius*(-1,0,0));
+
+ path_ngamma = rp(gammacnt)--rp(ngamma0)--rp((0,0,0));
+ draw path_ngamma;
+%%% c vector
+ drawarrow rp(gammacnt)--rp(ngamma0);
+
+ recta_xlayer = rp(gammacnt)--rp(gammacnt+1.3*radius*(0,1,-sind(theta)));
+ drawarrow recta_xlayer;
+
+ pickup pencircle scaled 1;
+
+ arco := (gamma cutbefore recta_xlayer) cutafter path_ngamma;
+ draw gamma;
+ undraw arco;
+
+ pickup pencircle scaled 0.5;
+ draw gamma dashed evenly;
+
+
+% draw subpath (0,0.9) of gamma;
+% draw subpath (7.6,8) of gamma;
+% draw subpath (1.5,8) of gamma;
+ draw subpath (3.2,1.2) of alfa;
+ labeln( vecclabel, rp(ngamma0), veccpos);
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/sniperlogo.mp b/graphics/metapost/contrib/macros/featpost/example/sniperlogo.mp
new file mode 100644
index 0000000000..d8ac0fb728
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/sniperlogo.mp
@@ -0,0 +1,38 @@
+% sniperlogo.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+beginfig(1);
+ numeric u, ray, siz, xdis, ang, mar, i;
+ u = 1cm;
+ siz = 5u;
+ ray = siz/6;
+ fill fullcircle scaled (2*(siz+ray));
+ xdis = (siz-2*ray) +-+ (2*ray);
+ ang = angle(xdis,2*ray);
+ z1 = (siz-ray)*dir(ang);
+ z2 = (siz-ray)*dir(90-ang);
+ z3 = (ray,(siz-2*ray)*cosd(ang));
+ z4 = z3 xscaled -1;
+ z5 = z2 xscaled -1;
+ z6 = z1 xscaled -1;
+ for i=7 upto 16:
+ z[i] = z[i-4] rotated 90;
+ endfor;
+ for i=0 upto 3:
+ z[21+i] = (siz-ray)*dir(45+90*i);
+ endfor;
+ path sniperpath;
+ sniperpath = z1{dir(ang+90)}..z21..{dir(180-ang)}z2..z3{down}..{up}z4..
+ z5{dir(180+ang)}..z22..{dir(270-ang)}z6..z7{right}..{left}z8..
+ z9{dir(270+ang)}..z23..{dir(-ang)}z10..z11{up}..{down}z12..
+ z13{dir(ang)}..z24..{dir(90-ang)}z14..z15{left}..{right}z16..cycle;
+ unfill sniperpath rotated 45;
+% draw sniperpath;
+% drawoptions( withcolor red );
+% dotlabels(1,2,3,4,5,6,7,8,9,21,22)
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/solarconcentrator.mp b/graphics/metapost/contrib/macros/featpost/example/solarconcentrator.mp
new file mode 100644
index 0000000000..af05771602
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/solarconcentrator.mp
@@ -0,0 +1,64 @@
+% solarconcentrator.mp
+% L. Nobre G.
+% 2013
+
+prologues := 1;
+
+input featpost3Dplus2D;
+
+color actpoi, actdir, actperp;
+boolean finish;
+
+%def findintersection( expr SourcePoi, RayDir ) =
+% begingroup
+%
+% endgroup
+%enddef;
+
+vardef reflectrayr(expr sourcepoi, raydir )=
+ save J, Perp, newdir, cropro, tandir, theangle;
+ color J, Perp, newdir, cropro, tandir;
+ numeric theangle;
+ findintersection( sourcepoi, raydir );
+ if not finish:
+ draw rp(sourcepoi)--rp(actpoi);
+ theangle = 180-getangle( raydir, actperp );
+ if theangle<0.5: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER!
+ cropro = ncrossprod( raydir, actperp );
+ tandir = ncrossprod( actperp, cropro );
+ newdir = planarrotation( actperp, tandir, theangle );
+ else:
+ newdir = actperp;
+ fi;
+ reflectrayr( actpoi, newdir );
+ else:
+ J=sourcepoi+raydir;
+ drawarrow rp(sourcepoi)--rp(J);
+ finish := false;
+ fi;
+enddef;
+
+beginfig(1);
+ f := (6,4,5);
+ numeric iz, jang, numcircs, zcoord;
+ numcircs = 10;
+ draw rp((1,0,1))--rp(red)--rp(-red)--rp((-1,0,1));
+ for iz=1 upto numcircs:
+ zcoord := iz/numcircs;
+ draw
+ rp((1-zcoord,zcoord,zcoord))--rp((zcoord-1,zcoord,zcoord))..
+ for jang=5 step 5 until 175:
+ rp((zcoord-1-zcoord*sind(jang),zcoord*cosd(jang),zcoord))..
+ endfor
+ rp((zcoord-1,-zcoord,zcoord))--rp((1-zcoord,-zcoord,zcoord))..
+ for jang=5 step 5 until 175:
+ rp((1-zcoord+zcoord*sind(jang),-zcoord*cosd(jang),zcoord))..
+ endfor
+ cycle;
+ endfor;
+ draw rp(red)--rp((0,1,1))--rp(-red)--rp((0,-1,1))--cycle;
+endfig;
+
+
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/solardish.mp b/graphics/metapost/contrib/macros/featpost/example/solardish.mp
new file mode 100644
index 0000000000..2d5bbf5f7d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/solardish.mp
@@ -0,0 +1,112 @@
+% solardish.mp
+% L. Nobre G.
+% 2013
+
+prologues := 1;
+
+vardef reflectrayr(expr s,a,p,l)=
+ save tI,tn,ia,I,J;
+ pair I,J;
+ tI=xpart(p intersectiontimes ((s+1mm*dir(a))--(s+30cm*dir(a))));
+ if tI>0:
+ I=point tI of p;
+ draw s--I;
+ tn=angle(direction tI of p)+90;
+ ia:=tn-angle(s-I);
+ reflectrayr(I,tn+ia,p,l);
+ else:
+ J=s+dir(a)*l;
+ drawarrow s--J;
+ fi;
+enddef;
+
+beginfig(1); % parabolic dish
+ numeric u, i, num, calx, incidang;
+ pair sunpoi;
+ u = 8cm;
+ num = 12;
+ incidang = -60;
+ path p;
+ p=(-2u,u) for i=1 upto 2num:
+ hide( calx:=-2+2*i/num; )
+ ..(calx*u,u*(calx**2)/4)
+ endfor;
+ for i=1 upto 2num-1:
+ sunpoi := ((-2+2*i/num,1)*u)-u*dir(incidang);
+ reflectrayr(sunpoi,incidang,p,14cm);
+ endfor;
+ draw p withcolor red;
+endfig;
+
+beginfig(2); % circle evolute dish
+ numeric u, i, num, calc, incidang, panray;
+ pair sunpoi, crosa, crosb;
+ u = 8cm; % this value is related with "14cm" inside reflectray
+ num = 12;
+ incidang = -60;
+ panray = 2cm;
+ path p, q, w;
+ w = fullcircle scaled 2panray shifted (0,u-panray);
+ p=(0,u-2panray) for i=1 upto num:
+ hide(
+ calc:=(i/num)*panray*3.14159;
+ sunpoi := (0,u-panray)+dir(i*180/num-90)*panray-calc*dir(i*180/num);
+ )
+ ..sunpoi
+ endfor;
+ q = reverse (p xscaled -1) & p;
+ sunpoi := (xpart point 2 of q,u)-u*dir(incidang);
+ crosa = sunpoi+whatever*dir(incidang);
+ crosa = (0,u-panray)-whatever*dir(incidang+90);
+ crosb = ((0,u-panray)--crosa) intersectionpoint w;
+ for i=0 upto num:
+ sunpoi := (i/num)[crosa,crosb]-u*dir(incidang);
+ reflectrayr(sunpoi,incidang,q,5cm);
+ endfor;
+ pair crosa;
+ sunpoi := (xpart point ((length q)-2) of q,u)-u*dir(incidang);
+ crosa = sunpoi+whatever*dir(incidang);
+ crosa = (0,u-panray)-whatever*dir(incidang+90);
+ crosb := ((0,u-panray)--crosa) intersectionpoint w;
+ for i=0 upto num:
+ sunpoi := (i/num)[crosa,crosb]-u*dir(incidang);
+ reflectrayr(sunpoi,incidang,q,5cm);
+ endfor;
+ draw q withcolor red;
+ fill w withcolor 0.5white;
+endfig;
+
+beginfig(3); % spheric dish
+ numeric u, i, num, incidang;
+ pair sunpoi;
+ u = 8cm;
+ num = 12;
+ incidang = -60;
+ path p;
+ p = halfcircle scaled 4u rotated 180 shifted (0,u);
+ for i=1 upto 2num-1:
+ sunpoi := ((-2+2*i/num,1)*u)-u*dir(incidang);
+ reflectrayr(sunpoi,incidang,p,14cm);
+ endfor;
+ draw p withcolor red;
+endfig;
+
+beginfig(4); % elliptic dish
+ numeric u, i, num, cal, incidang;
+ pair sunpoi;
+ u = 8cm;
+ num = 12;
+ incidang = -55;
+ path p;
+ p=(-2u,u) for i=1 upto 2num:
+ hide( cal:=90*i/num; )
+ ..(-2*cosd(cal)*u,u-u*sind(cal))
+ endfor;
+ for i=1 upto 2num-1:
+ sunpoi := ((-2+2*i/num,1)*u)-u*dir(incidang);
+ reflectrayr(sunpoi,incidang,p,14cm);
+ endfor;
+ draw p withcolor red;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/some2Dvecs.mp b/graphics/metapost/contrib/macros/featpost/example/some2Dvecs.mp
new file mode 100644
index 0000000000..138a94293a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/some2Dvecs.mp
@@ -0,0 +1,77 @@
+% some2Dvecs.mp
+% L. Nobre G.
+% 2002
+
+verbatimtex
+\documentclass{article}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric hsize, qsize, nsize, ldist;
+ numeric alray, beray, alang, beang;
+ numeric stampnum, initang, i, stepang, stampoffset;
+ pair hvec, qvec, nvec;
+ path Hvec, Qvec, Nvec, alarc, bearc, vertic;
+ picture labelstr, labelpic;
+ color mycolor;
+ picture stamp;
+ bboxmargin := 4mm;
+ stampnum = 36;
+ stampoffset = 0.42mm;
+ alang = 6;
+ beang = 17;
+ hsize = 6mm;
+ qsize = 3*hsize;
+ nsize = 4*hsize;
+ ldist = 3.17*hsize;
+ alray = 2*0.735*nsize;
+ beray = 2*0.6*qsize;
+ mycolor = (0.8,0.7,1);
+% drawoptions( withcolor mycolor );
+ hvec = hsize*left;
+ qvec = qsize*(-sind(beang),cosd(beang));
+ nvec = nsize*(-sind(alang),cosd(alang));
+ Hvec = origin--hvec;
+ Qvec = origin--qvec;
+ Nvec = origin--nvec;
+ vertic = origin--ldist*up;
+ alarc = fullcircle scaled alray
+ cutbefore vertic cutafter Nvec;
+ bearc = fullcircle scaled beray
+ cutbefore vertic cutafter Qvec;
+ drawarrow Hvec;
+ drawarrow Qvec;
+ drawarrow Nvec;
+ draw alarc;
+ draw bearc;
+ draw vertic dashed evenly;
+ draw unitsquare scaled (0.2*hsize);
+ labelstr = btex
+ $2,\!4\times 1,\!8\,\mbox{mm}^2$
+ etex;
+ label.rt( labelstr, ldist*right );
+% label.lft( btex $\vec{n}_0$ etex, nvec );
+ label.lft( btex $x$ etex, nvec );
+ label.lft( btex $\vec{q}$ etex, qvec );
+ label.top( btex $\vec{B}$ etex, hvec );
+ label.urt( btex $-0.48^\circ$ etex, point 1 of alarc );
+ label.lft( btex $6^\circ$ etex, point 1 of bearc );
+ stamp = currentpicture;
+ fill bbox stamp withcolor (0.85,0.85,0);
+ initang = 180/stampnum;
+ stepang = 2*initang;
+ drawoptions();
+ for i=0 upto (stampnum-1):
+ draw stamp
+ shifted (stampoffset*dir(initang+i*stepang))
+ withcolor white;
+ endfor;
+ draw stamp;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/spaceinvader.mp b/graphics/metapost/contrib/macros/featpost/example/spaceinvader.mp
new file mode 100644
index 0000000000..1a8eb9dbf7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/spaceinvader.mp
@@ -0,0 +1,210 @@
+% spaceinvader.mp
+% L. Nobre G.
+% 2012
+
+prologues := 1;
+
+vardef renewcolore =
+ color tmpcolo;
+ tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+ drawoptions( withcolor tmpcolo );
+enddef;
+
+primarydef A xor B = ((not A) and B) or (A and not B) enddef;
+
+def strai( expr FlagVer, FlagForward, IndI, IndJ ) =
+ begingroup
+ path tmppath;
+ if FlagVer:
+ tmppath = (IndI*u,(IndJ-1)*u+mar)---(IndI*u,IndJ*u-mar);
+ else:
+ tmppath = ((IndI-1)*u+mar,IndJ*u)---(IndI*u-mar,IndJ*u);
+ fi;
+ if not FlagForward:
+ tmppath := reverse tmppath;
+ fi;
+ ( tmppath )
+ endgroup
+enddef;
+
+beginfig(1);
+ string st[];
+ st16 = "..............M.";
+ st15 = ".............M..";
+ st14 = "MM..........M...";
+ st13 = "..MMM......M....";
+ st12 = ".....M....M.....";
+ st11 = "MMM...M..M...MMM";
+ st10 = "..MMM.MMMM.MMM..";
+ st9 = "....MMMMMMMM....";
+ st8 = "....M..MM..M....";
+ st7 = "....MMMMMMMM....";
+ st6 = "....MMM..MMM....";
+ st5 = "...MMMMMM.MMMMM.";
+ st4 = "..MM..MMMM..M.MM";
+ st3 = "MMM..MM..MMM...M";
+ st2 = "M...MM.....MMM.M";
+ st1 = "...MM........M..";
+ numeric i, j, hv[][][];
+ boolean b[][];
+ numeric refi, refj, pn, u, mar, numa, numb, numc;
+ boolean startfound, forward, statever, pathfinished;
+ path frontier[];
+ picture borderpic;
+ color cola, colb, colc;
+ pen thepen;
+ u = 6mm;
+ thepen = pencircle scaled 0.2u;
+ mar = 0.3u;
+ startfound = false;
+ pn = 0;
+ for j=1 upto 16:
+ for i=1 upto 16:
+ if substring (i-1,i) of st[j] = ".":
+ b[i][j] = false;
+ else:
+ b[i][j] = true;
+ fi;
+ endfor;
+ endfor;
+ for i=0 upto 17:
+ b[i][0] := false;
+ b[i][17] := false;
+ b[0][i] := false;
+ b[17][i] := false;
+ endfor;
+ for j=0 upto 16:
+ for i=0 upto 16:
+ if b[i][j] xor b[i+1][j]:
+ hv[1][i][j] = 1;
+ draw strai( true, true, i, j );
+ else:
+ hv[1][i][j] = 0;
+ fi;
+ if b[i][j] xor b[i][j+1]:
+ hv[0][i][j] = 1;
+ draw strai( false, true, i, j );
+ else:
+ hv[0][i][j] = 0;
+ fi;
+ endfor;
+ endfor;
+ for i=0 upto 17:
+ hv[0][17][i] := 0;
+ hv[1][i][17] := 0;
+ endfor;
+ borderpic = currentpicture;
+endfig;
+
+def trioone( expr flstat, flforw ) =
+ begingroup
+ color tmpcolor;
+ if flstat and flforw:
+ tmpcolor = (0,0,0);
+ elseif flstat and (not flforw):
+ tmpcolor = (0,1,-1);
+ elseif (not flstat) and flforw:
+ tmpcolor = (1,0,1);
+ else:
+ tmpcolor = (1,-1,0);
+ fi;
+ ( tmpcolor )
+ endgroup
+enddef;
+
+def triotwo( expr flstat, flforw ) =
+ begingroup
+ color tmpcolor;
+ if flstat and flforw:
+ tmpcolor = (1,0,1);
+ elseif flstat and (not flforw):
+ tmpcolor = (1,0,-1);
+ elseif (not flstat) and flforw:
+ tmpcolor = (0,1,0);
+ else:
+ tmpcolor = (0,-1,0);
+ fi;
+ ( tmpcolor )
+ endgroup
+enddef;
+
+def triothr( expr flstat, flforw ) =
+ begingroup
+ color tmpcolor;
+ if flstat and flforw:
+ tmpcolor = (0,1,0);
+ elseif flstat and (not flforw):
+ tmpcolor = (0,0,-1);
+ elseif (not flstat) and flforw:
+ tmpcolor = (1,0,0);
+ else:
+ tmpcolor = (1,-1,1);
+ fi;
+ ( tmpcolor )
+ endgroup
+enddef;
+
+beginfig(2);
+ % draw borderpic;
+ forever:
+ startfound := false;
+ for j=0 upto 16:
+ for i=1 upto 16:
+ if (not startfound) and (hv[0][i][j] = 1):
+ startfound := true;
+ refi := i;
+ refj := j;
+ fi;
+ endfor;
+ endfor;
+ exitunless startfound;
+ statever := false;
+ forward := true;
+ frontier[incr(pn)] = strai( statever, forward, refi, refj );
+ hv[0][refi][refj] := 2;
+ pathfinished := false;
+ forever:
+ cola := trioone(statever,forward);
+ colb := triotwo(statever,forward);
+ colc := triothr(statever,forward);
+ numa := hv[redpart cola][refi+greenpart cola][refj+bluepart cola];
+ numb := hv[redpart colb][refi+greenpart colb][refj+bluepart colb];
+ numc := hv[redpart colc][refi+greenpart colc][refj+bluepart colc];
+ if numa = 1:
+ refi := refi+greenpart cola;
+ refj := refj+bluepart cola;
+ forward := statever xor forward;
+ statever := not statever;
+ frontier[pn] := frontier[pn]..strai( statever, forward, refi, refj );
+ hv[redpart cola][refi][refj] := 2;
+ elseif numa = 2:
+ frontier[pn] := frontier[pn]..cycle;
+ pathfinished := true;
+ elseif numb = 1:
+ refi := refi+greenpart colb;
+ refj := refj+bluepart colb;
+ frontier[pn] := frontier[pn]..strai(statever,forward,refi,refj);
+ hv[redpart colb][refi][refj] := 2;
+ elseif numb = 2:
+ frontier[pn] := frontier[pn]..cycle;
+ pathfinished := true;
+ elseif numc = 1:
+ refi := refi+greenpart colc;
+ refj := refj+bluepart colc;
+ forward := not (statever xor forward);
+ statever := not statever;
+ frontier[pn] := frontier[pn]..strai( statever, forward, refi, refj );
+ hv[redpart colc][refi][refj] := 2;
+ elseif numc = 2:
+ frontier[pn] := frontier[pn]..cycle;
+ pathfinished := true;
+ fi;
+ exitif pathfinished;
+ endfor;
+ renewcolore;
+ fill frontier[pn] withpen thepen;
+ endfor;
+ show pn;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/spatialhalfsfear.mp b/graphics/metapost/contrib/macros/featpost/example/spatialhalfsfear.mp
new file mode 100644
index 0000000000..00890f62be
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/spatialhalfsfear.mp
@@ -0,0 +1,17 @@
+% spatialhalfsfear.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+f := (3,-0.2,3);
+beginfig(1);
+ spatialhalfsfear( black, blue, 1 );
+ drawoptions( withpen pencircle scaled 3pt withcolor (blue+green) );
+ spatialhalfsfear( black, blue+green, 0.8 );
+ drawoptions( withpen pencircle scaled 3pt withcolor red );
+ spatialhalfsfear( black, red, 0.6 );
+ drawoptions( withpen pencircle scaled 3pt withcolor green );
+ spatialhalfsfear( black, green, 0.7 );
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/spherample.mp b/graphics/metapost/contrib/macros/featpost/example/spherample.mp
new file mode 100644
index 0000000000..b1f3bd4540
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/spherample.mp
@@ -0,0 +1,49 @@
+% spherample.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+SphericalDistortion := true;
+
+beginfig(1);
+ color orig, axxc, ayyc, azzc;
+ color nalfa, gammacnt, vertex;
+ numeric altura, grids, radius, xxsize, aux,
+ yysize, zzsize, i, numc, slope;
+ path sfear;
+
+ f := (5,4,2);
+ Spread := 120;
+ ShiftV := (200,200);
+ altura = 1;
+ radius = 0.3;
+ grids = 1;
+ numc = 9;
+ slope = 3;
+
+ for i=1 upto numc:
+ aux := (i-1-0.5*(numc-1))*grids;
+ gammacnt := (0,aux,0);
+ vertex := (aux/slope,aux,altura);
+ nalfa := vertex - gammacnt;
+ sfear := rigorousfearpath(gammacnt,radius);
+ unfill sfear;
+ draw sfear;
+ draw spatialhalfcircle(gammacnt,nalfa,radius,true);
+ endfor;
+ xxsize = radius;
+ yysize = 0.5*(numc-1)*grids;
+ zzsize = altura;
+ orig = (0,0,0);
+ axxc = (xxsize,0,0);
+ ayyc = (0,yysize,0);
+ azzc = (0,0,zzsize);
+% drawarrow rp(orig)..rp(axxc);
+% drawarrow rp(orig)..rp(ayyc);
+% drawarrow rp(orig)..rp(azzc);
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/splineperspective.mp b/graphics/metapost/contrib/macros/featpost/example/splineperspective.mp
new file mode 100644
index 0000000000..8bcc4f8752
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/splineperspective.mp
@@ -0,0 +1,719 @@
+% splineperspective.mp
+% L. Nobre G. and Troy Henderson
+% 2007 -- 2012
+
+prologues := 1;
+defaultfont := "cmss17";
+color f, viewcentr;
+boolean ParallelProj;
+
+ f := (3,5,4); % This f is the point of view in 3D
+
+ viewcentr := black; % This is the aim of the view
+
+ ParallelProj := false; % Kind of perspective %
+
+ def X(expr A) =
+ if color A: redpart A else: cyanpart A fi
+ enddef;
+
+ def Y(expr A) =
+ if color A: greenpart A else: magentapart A fi
+ enddef;
+
+ def Z(expr A) =
+ if color A: bluepart A else: yellowpart A fi
+ enddef;
+
+ def conorm(expr A) =
+ ( X(A) ++ Y(A) ++ Z(A) )
+ enddef;
+
+ def N(expr A) =
+ begingroup
+ save M, exitcolor;
+ numeric M;
+ color exitcolor;
+ M = conorm( A );
+ if M > 0:
+ exitcolor = ( X(A)/M, Y(A)/M, Z(A)/M );
+ else:
+ exitcolor := black;
+ fi;
+ ( exitcolor )
+ endgroup
+ enddef;
+
+ def cdotprod(expr A, B) =
+ ( X(A)*X(B) + Y(A)*Y(B) + Z(A)*Z(B) )
+ enddef;
+
+ def ccrossprod(expr A, B) =
+ ( Y(A)*Z(B) - Z(A)*Y(B),
+ Z(A)*X(B) - X(A)*Z(B),
+ X(A)*Y(B) - Y(A)*X(B) )
+ enddef;
+
+% The dotproduct of two normalized vectors is the cosine of the angle
+% they form.
+
+ def ndotprod(expr A, B) =
+ begingroup
+ save a, b;
+ color a, b;
+ a = N(A);
+ b = N(B);
+ ( ( X(a)*X(b) + Y(a)*Y(b) + Z(a)*Z(b) ) )
+ endgroup
+ enddef;
+
+% The normalized crossproduct of two vectors.
+% Also check getangle below.
+
+ def ncrossprod(expr A, B) =
+ N( ccrossprod( A, B ) )
+ enddef;
+
+% Haahaa! Trigonometry.
+
+ def getangle(expr A, B) =
+ begingroup
+ save coss, sine;
+ numeric coss, sine;
+ coss := cdotprod( A, B );
+ sine := conorm( ccrossprod( A, B ) );
+ ( angle( coss, sine ) )
+ endgroup
+ enddef;
+
+ def rp(expr R) =
+ begingroup
+
+ save v, u;
+ save verti, horiz, eta, squarf, radio;
+ color v, u;
+ numeric verti, horiz, eta, squarf, radio;
+
+ v = N( (-Y(f-viewcentr), X(f-viewcentr), 0) );
+ u = ncrossprod( f-viewcentr, v );
+
+ horiz = cdotprod( R-viewcentr, v );
+ verti = cdotprod( R-viewcentr, u );
+
+ if ParallelProj:
+ eta = 1;
+ else:
+ squarf = cdotprod( f-viewcentr, f-viewcentr );
+ radio = cdotprod( R-viewcentr, f-viewcentr );
+ eta = 1 - radio/squarf;
+ fi;
+ ( 150*(horiz,verti)/eta )
+
+ endgroup
+ enddef;
+
+ def cartaxes(expr axex, axey, axez) =
+ begingroup
+ save orig, axxc, ayyc, azzc;
+ color orig, axxc, ayyc, azzc;
+ orig = (0,0,0);
+ axxc = (axex,0,0);
+ ayyc = (0,axey,0);
+ azzc = (0,0,axez);
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+ label.bot( "x" ,rp(axxc)); %%%%%%%%%%%%%%%%%%%%%%%%%
+ label.bot( "y" ,rp(ayyc)); %% Some Labels... %%
+ label.lft( "z" ,rp(azzc)); %%%%%%%%%%%%%%%%%%%%%%%%%
+ endgroup
+ enddef;
+
+ def line( expr Ang ) =
+ begingroup
+ numeric a, b, c;
+ a = (2-(1 ++ cosd(Ang))*cosd(3*Ang))*cosd(Ang);
+ b = (2-(1 ++ cosd(Ang))*cosd(3*Ang))*sind(Ang);
+ c =1.5+(1 ++ cosd(Ang))*sind(3*Ang);
+ ( (a,b,c) )
+ endgroup
+ enddef;
+
+% Evaluate a cubic polynomial of the "standard" Bezier form at t
+vardef evalbezier(expr p,t) =
+ save _a,_b,_c,_d;
+ numeric _a,_b,_c,_d;
+ _a:=(1-t)**3;
+ _b:=3*((1-t)**2)*t;
+ _c:=3*(1-t)*(t**2);
+ _d:=t**3;
+ (point 0 of p)*_a + (postcontrol 0 of p)*_b + (precontrol 1 of p)*_c +
+ (point 1 of p)*_d
+enddef;
+
+% Evaluate the derivative of a cubic polynomial of the "standard"
+% Bezier form at t
+vardef evalbezierderivative(expr p,t) =
+ save _a,_b,_c;
+ pair _a,_b,_c;
+ _a:=3*((point 1 of p) - 3*(precontrol 1 of p) + 3*(postcontrol 0 of p)
+ -(point 0 of p));
+ _b:=6*((precontrol 1 of p) - 2*(postcontrol 0 of p) + (point 0 of p));
+ _c:=3*((postcontrol 0 of p) - (point 0 of p));
+ _a*(t**2) + _b*t + _c
+enddef;
+
+% Evaluate a rational function of the "standard" cubic NURBS form at t
+vardef evalnurbs(expr p,w,t) =
+ save _q,_r;
+ path _q,_r;
+ _q:=((cyanpart w)*(point 0 of p))..
+ controls ((magentapart w)*(postcontrol 0 of p))
+ and ((yellowpart w)*(precontrol 1 of p)) .. ((blackpart w)*(point 1 of p));
+ _r:=(cyanpart w,0) ..
+ controls (magentapart w,0) and (yellowpart w,0) .. (blackpart w,0);
+ evalbezier(_q,t)/(xpart evalbezier(_r,t))
+enddef;
+
+% Evaluate the derivative of a rational function of the "standard"
+% cubic NURBS form at t
+vardef evalnurbsderivative(expr p,w,t) =
+ save _a,_b,_c,_d,_q,_r;
+ pair _a,_b;
+ numeric _c,_d;
+ path _q,_r;
+ _q:=((cyanpart w)*(point 0 of p)) ..
+ controls ((magentapart w)*(postcontrol 0 of p))
+ and ((yellowpart w)*(precontrol 1 of p)) .. ((blackpart w)*(point 1 of p));
+ _r:=(cyanpart w,0) ..
+ controls (magentapart w,0) and (yellowpart w,0) .. (blackpart w,0);
+ _a:=evalbezier(_q,t);
+ _b:=evalbezierderivative(_q,t);
+ _c:=xpart evalbezier(_r,t);
+ _d:=xpart evalbezierderivative(_r,t);
+ (_b*_c-_a*_d)/(_c**2)
+enddef;
+
+% Fit a cubic polynomial of the "standard" Bezier form to a
+% rational function of the
+% "standard" cubic NURBS form with function and derivative agreement
+% at tmin and tmax
+vardef nurbstobezier(expr p,w,tmin,tmax) =
+ save _a,_b,_c,_d,_e;
+ pair _a,_b,_c,_d;
+ numeric _e;
+ _e:=(tmax-tmin)/3;
+ _a:=evalnurbs(p,w,tmin);
+ _b:=_a + _e*evalnurbsderivative(p,w,tmin);
+ _d:=evalnurbs(p,w,tmax);
+ _c:=_d - _e*evalnurbsderivative(p,w,tmax);
+ _a .. controls _b and _c .. _d
+enddef;
+
+% Reparameterize a cubic polynomial of the "standard" Bezier form by mapping
+% the interval [tmin,tmax] to [0,1]
+vardef beziertobezier(expr p,tmin,tmax) =
+ nurbstobezier(p,(1,1,1,1),tmin,tmax)
+enddef;
+
+% Evalute the L^2[0,1] norm of a cubic polynomial of the "standard"
+% Bezier form
+vardef beziernorm(expr p) =
+ save _a,_b,_c,_d,_i,_xabs,_yabs,_A,_B,_C,_D,_I;
+ numeric _a,_b,_c,_d,_i,_xabs,_yabs,_A,_B,_C,_D,_I;
+ _xabs:=max(
+ abs(xpart point 0 of p),
+ abs(xpart postcontrol 0 of p),
+ abs(xpart precontrol 1 of p),
+ abs(xpart point 1 of p));
+ _yabs:=max(
+ abs(ypart point 0 of p),
+ abs(ypart postcontrol 0 of p),
+ abs(ypart precontrol 1 of p),
+ abs(ypart point 1 of p));
+ if (_xabs > 0):
+ _a:=xpart((point 1 of p) - 3*(precontrol 1 of p)
+ + 3*(postcontrol 0 of p) - (point 0 of p))/_xabs;
+ _b:=3*xpart((precontrol 1 of p) - 2*(postcontrol 0 of p)
+ + (point 0 of p))/_xabs;
+ _c:=3*xpart((postcontrol 0 of p) - (point 0 of p))/_xabs;
+ _d:=xpart(point 0 of p)/_xabs;
+ _i:=(_a**2)/7 + ((_b)**2 + 2*_a*_c)/5 + (_a*_b + 2*_b*_d + (_c**2))/3 + (_a*_d + _b*_c)/2 + (_c*_d + (_d**2));
+ else:
+ _i:=0;
+ fi;
+ if (_yabs > 0):
+ _A:=ypart((point 1 of p) - 3*(precontrol 1 of p)
+ + 3*(postcontrol 0 of p) - (point 0 of p))/_yabs;
+ _B:=3*ypart((precontrol 1 of p) - 2*(postcontrol 0 of p)
+ + (point 0 of p))/_yabs;
+ _C:=3*ypart((postcontrol 0 of p) - (point 0 of p))/_yabs;
+ _D:=ypart(point 0 of p)/_yabs;
+ _I:=(_A**2)/7 + ((_B)**2 + 2*_A*_C)/5
+ + (_A*_B + 2*_B*_D + (_C**2))/3 + (_A*_D + _B*_C)/2 + (_C*_D + (_D**2));
+ else:
+ _I:=0;
+ fi;
+ (_xabs*sqrt(_i)) ++ (_yabs*sqrt(_I))
+enddef;
+
+% Fit a cubic Bezier spline to a rational function of the "standard"
+% cubic NURBS form by iteratively refining the Bezier curve.
+% p is a 4 point path containing the 4 cubic NURBS (2D) control points
+% w is a cmykcolor containing the 4 cubic NURBS weights
+% EPS is the tolerance to stop refining each branch of the Bezier spline
+vardef fitnurbswithbezier(expr p,w,EPS) =
+ save _a,_b,_c,_e,_error,_k,_q;
+ numeric _a,_b,_c,_error,_k;
+ path _q,_q[],_e;
+ _a:=0;
+ _b:=1;
+ _k:=1/sqrt(2);
+ _q:=(point 0 of p);
+ _q[4]:=nurbstobezier(p,w,_a,_b);
+ forever:
+ exitunless(_a<1);
+ _q[1]:=_q[4];
+ _c:=_b-_k*((_b-_a)**2);
+ _q[2]:=beziertobezier(_q[1],_a,_c);
+ _q[3]:=nurbstobezier(p,w,_a,_c);
+ _q[4]:=_q[3];
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) ..
+ controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3]))
+ and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) ..
+ ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+% show _error;
+ if (_error > EPS):
+ _b:=_c;
+ else:
+ _q[2]:=beziertobezier(_q[1],_c,_b);
+ _q[3]:=nurbstobezier(p,w,_c,_b);
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) ..
+ controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3]))
+ and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) ..
+ ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+ if (_error > EPS):
+ _q:=_q .. controls (postcontrol 0 of _q[4])
+ and (precontrol 1 of _q[4]) .. (point 1 of _q[4]);
+ _a:=_c;
+ _q[4]:=_q[3];
+ else:
+ _q:=_q .. controls (postcontrol 0 of _q[1])
+ and (precontrol 1 of _q[1]) .. (point 1 of _q[1]);
+ _a:=_b;
+ _q[4]:=nurbstobezier(p,w,_a,1);
+ fi;
+ _b:=1;
+ fi;
+ endfor;
+ _q
+enddef;
+
+% This macro is used to provide a path to draw the NURBS
+% It returns a path of length N passing through N+1 equally spaced
+% (in time) points along the NURBS connected by line segments
+vardef samplednurbs(expr p,w,N) =
+ save _a,_b,_c,_d,_n,_t,_q;
+ numeric _a,_b,_c,_d,_n,_t;
+ path _q;
+ _q:=(point 0 of p);
+ for _n=1 upto N:
+ _t:=_n/N;
+ _a:=(cyanpart w)*((1-_t)**3);
+ _b:=3*(magentapart w)*((1-_t)**2)*_t;
+ _c:=3*(yellowpart w)*(1-_t)*(_t**2);
+ _d:=(blackpart w)*(_t**3);
+ _q:=_q .. ((_a*(point 0 of p)+_b*(postcontrol 0 of p)
+ +_c*(precontrol 1 of p)+_d*(point 1 of p))/(_a+_b+_c+_d));
+ endfor;
+ ( _q )
+enddef;
+
+% The code below is a development by Troy from an original by Przemek Koprowski
+
+vardef rationalbezier(expr A,B,C,D) =
+ begingroup
+ save P,Q,E,a,b,c,d,r,EPS;
+ color P[],Q[],E;
+ pair a,b,c,d;
+ EPS:=1/10;
+ a:=(redpart A,greenpart A)/(bluepart A);
+ b:=(redpart B,greenpart B)/(bluepart B);
+ c:=(redpart C,greenpart C)/(bluepart C);
+ d:=(redpart D,greenpart D)/(bluepart D);
+ r:=max(abs(a-b),abs(a-c),abs(a-d),abs(b-c),abs(b-d),abs(c-d));
+ if (max(abs(b-1/2[a,c]),abs(c-1/2[b,d])) > EPS*r):
+ P[0]:=A;
+ P[1]:=1/2[A,B];
+ E:=1/2[B,C];
+ Q[2]:=1/2[C,D];
+ Q[3]:=D;
+ P[2]:=1/2[P[1],E];
+ Q[1]:=1/2[E,Q[2]];
+ P[3]:=1/2[P[2],Q[1]];
+ Q[0]:=P[3];
+ rationalbezier(P[0],P[1],P[2],P[3]) & rationalbezier(Q[0],Q[1],Q[2],Q[3])
+ else:
+ a .. controls b and c .. d
+ fi
+ endgroup
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Here's where the fun begins %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def casteljau( expr Za, Zb, Zc, Zd, Pt ) = %%%%%%%%%%%%%%%%%%% 2D or 3D
+ begingroup
+ save A, B, C, D;
+ numeric A, B, C, D;
+ A = (1-Pt)**3;
+ B = 3*((1-Pt)**2)*Pt;
+ C = 3*(1-Pt)*(Pt**2);
+ D = Pt**3;
+ ( (A*Za+B*Zb+C*Zc+D*Zd) )
+ endgroup
+enddef;
+
+def twothr( expr Z ) = ( xpart Z, ypart Z, 0 ) enddef;
+
+def twotwo( expr Z ) = rp( twothr( Z ) ) enddef;
+
+def xoy( expr Z ) = rp( ( X(Z), Y(Z), 0 ) ) enddef;
+
+def yoz( expr W ) = rp( ( 0, Y(W), Z(W) ) ) enddef;
+
+def xoz( expr W ) = rp( ( X(W), 0, Z(W) ) ) enddef;
+
+def nextthirty( expr Za, Zb, Zc, Zd, Pt ) = %%% input 3D and return 2D
+ begingroup
+ save A, B, C, D, Tot, P;
+ numeric A, B, C, D, Tot;
+ color P;
+ P = N( f - viewcentr );
+ A = ((1-Pt)**3)*cdotprod( P, f-Za );
+ B = 3*((1-Pt)**2)*Pt*cdotprod( P, f-Zb );
+ C = 3*(1-Pt)*(Pt**2)*cdotprod( P, f-Zc );
+ D = (Pt**3)*cdotprod( P, f-Zd );
+ Tot = A+B+C+D;
+ ( (A*rp(Za)+B*rp(Zb)+C*rp(Zc)+D*rp(Zd))/Tot )
+ endgroup
+enddef;
+
+vardef nurbstobezierold (expr p,w) =
+ save _a,_b,_c,_d,_j,_n,_r,_s,_t,_A,_B,_Aold,_Bold,_C,_D,_EPS,_J,_N;
+ _EPS:=0.00001;
+ _J:=10;
+
+ _Aold:=0;
+ _Bold:=0;
+ _A:=1;
+ _B:=1;
+ _s:=((_A-_Aold)++(_B-_Bold))/(_A++_B);
+ _j:=1; _r:=0;
+ forever:
+ exitunless((_s>_EPS) and (_j<_J));
+ _j:=_j+1;
+ _N:=2**_j;
+ _Aold:=_A;
+ _Bold:=_B;
+ _D:=_N+1/_N-21/_N/_N/_N-1/_N/_N/_N/_N/_N+20/_N/_N/_N/_N/_N/_N/_N;
+ _C:=120*(2+2/_N/_N-5/_N/_N/_N/_N)/_D;
+ _D:=60*(3+3/_N/_N+10/_N/_N/_N/_N)/_D;
+ _c:=5/_N/_N/_N/_N;
+ _a:=2+2/_N/_N-_c;
+ _b:=2-3/_N/_N+_c;
+ _c:=1+6/_N/_N+_c;
+ _A:=(-2*(cyanpart p)*_a+(blackpart p)*_b)/_c;
+ _B:=((cyanpart p)*_b-2*(blackpart p)*_a)/_c;
+ for _n=0 upto _N:
+ _t:=_n/_N;
+ _a:=(1-_t)**3;
+ _b:=((1-_t)**2)*_t;
+ _c:=(1-_t)*(_t**2);
+ _d:=_t**3;
+ _r:=((cyanpart w)*(cyanpart p)*_a + 3*(magentapart
+ w)*(magentapart p)*_b + 3*(yellowpart w)*(yellowpart p)*_c +
+ (blackpart w)*(blackpart p)*_d)/((cyanpart w)*_a + 3*(magentapart
+ w)*_b + 3*(yellowpart w)*_c + (blackpart w)*_d);
+ _A:=_A+(_C*_b-_D*_c)*_r;
+ _B:=_B+(_C*_c-_D*_b)*_r;
+ endfor;
+ _s:=((_A-_Aold)++(_B-_Bold))/(_A++_B);
+ endfor;
+ (_A,_B)/3
+enddef;
+
+def nurbsapprox( expr Pa, Pb, Pc, Pd ) =
+ begingroup
+ color Pn;
+ numeric wa, wb, wc, wd;
+ path returnpath;
+ pair xpair, ypair, ba, bb, bc, bd;
+ cmykcolor xcontrols, ycontrols;
+ Pn = N( f - viewcentr );
+ wa = cdotprod( Pn, f-Pa );
+ wb = cdotprod( Pn, f-Pb );
+ wc = cdotprod( Pn, f-Pc );
+ wd = cdotprod( Pn, f-Pd );
+ xcontrols = (xpart rp(Pa),xpart rp(Pb),xpart rp(Pc),xpart rp(Pd));
+ ycontrols = (ypart rp(Pa),ypart rp(Pb),ypart rp(Pc),ypart rp(Pd));
+ xpair = nurbstobezierold( xcontrols, (wa,wb,wc,wd) );
+ ypair = nurbstobezierold( ycontrols, (wa,wb,wc,wd) );
+ ba = rp( Pa );
+ bb = (xpart xpair, xpart ypair);
+ bc = (ypart xpair, ypart ypair);
+ bd = rp( Pd );
+ %show ba;
+ %show bb;
+ %show bc;
+ %show bd;
+ %show wa;
+ %show wb;
+ %show wc;
+ %show wd;
+ returnpath = ba..controls bb and bc..bd;
+ (returnpath)
+ endgroup
+enddef;
+
+def fitthreednurbswithtwodbezier( expr pa, pb, pc, pd, EPS ) =
+ begingroup
+ save _a,_b,_c,_e,_error,_k,_q,w,wa,wb,wc,wd,pn,za, zb, zc, zd;
+ numeric _a,_b,_c,_error,_k,wa,wb,wc,wd;
+ path p,_q,_q[],_e;
+ color pn;
+ pair za, zb, zc, zd;
+ cmykcolor w;
+ za = rp(pa); show za;
+ zb = rp(pb); show zb;
+ zc = rp(pc); show zc;
+ zd = rp(pd); show zd;
+ p = za .. controls zb and zc .. zd;
+ pn = N( f - viewcentr );
+ wa = cdotprod( pn, f-pa ); show wa;
+ wb = cdotprod( pn, f-pb ); show wb;
+ wc = cdotprod( pn, f-pc ); show wc;
+ wd = cdotprod( pn, f-pd ); show wd;
+ w = ( wa, wb, wc, wd );
+ _a:=0;
+ _b:=1;
+ _k:=1/sqrt(2);
+ _q:=(point 0 of p);
+ _q[4]:=nurbstobezier(p,w,_a,_b);
+ forever:
+ exitunless(_a<1);
+ _q[1]:=_q[4];
+ _c:=_b-_k*((_b-_a)**2);
+ _q[2]:=beziertobezier(_q[1],_a,_c);
+ _q[3]:=nurbstobezier(p,w,_a,_c);
+ _q[4]:=_q[3];
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) ..
+ controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3]))
+ and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) ..
+ ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+ if (_error > EPS):
+ _b:=_c;
+ else:
+ _q[2]:=beziertobezier(_q[1],_c,_b);
+ _q[3]:=nurbstobezier(p,w,_c,_b);
+ _e:=((point 0 of _q[2])-(point 0 of _q[3])) ..
+ controls ((postcontrol 0 of _q[2])-(postcontrol 0 of _q[3]))
+ and ((precontrol 1 of _q[2])-(precontrol 1 of _q[3])) ..
+ ((point 1 of _q[2])-(point 1 of _q[3]));
+ _error:=beziernorm(_e)/beziernorm(_q[3]);
+ if (_error > EPS):
+ _q:=_q .. controls (postcontrol 0 of _q[4])
+ and (precontrol 1 of _q[4]) .. (point 1 of _q[4]);
+ _a:=_c;
+ _q[4]:=_q[3];
+ else:
+ _q:=_q .. controls (postcontrol 0 of _q[1])
+ and (precontrol 1 of _q[1]) .. (point 1 of _q[1]);
+ _a:=_b;
+ _q[4]:=nurbstobezier(p,w,_a,1);
+ fi;
+ _b:=1;
+ fi;
+ endfor;
+ ( _q )
+ endgroup
+enddef;
+
+beginfig(0);
+ draw for i=1 step 6 until 360: xoy(line(i)).. endfor cycle;
+ draw for i=1 step 6 until 360: rp(line(i)).. endfor cycle;
+ for i=1 step 15 until 360:
+ draw rp(line(i)) withpen pencircle scaled 2mm;
+ endfor;
+endfig;
+
+beginfig(4);
+% p contains the 4 control points of the rational function of the
+% "standard" cubic NURBS form
+ path p;
+ p:=(297.63725,297.63725) .. controls (132.98871,286.67885) and (180.62535,152.16249) .. (429.54399,226.31157);
+
+% w contains the 4 weights for the rational function of the
+% "standard" cubic NURBS form
+ cmykcolor w;
+ w:=(2.15756,1.6709,0.8598,1.34647);
+
+% EPS represents the minimum "acceptable error" to stop refining any
+% given branch of the Bezier
+ Err:=0.067;
+
+% q represents the Bezier spline fit to the rational function of the
+% "standard" cubic NURBS form
+ path q;
+ q:=fitnurbswithbezier(p,w,Err);
+% q:=fitnurbswithbezier(reverse p,(blackpart w,yellowpart w,magentapart w,cyanpart w),Err);
+
+% draw the NURBS by sampling it at many points and connecting the
+% samples via line segments
+ draw samplednurbs(p,w,20) withcolor red withpen pencircle scaled 2bp;
+
+% draw the Bezier spline and its knots
+ draw q;
+ for n=0 upto length q:
+ draw fullcircle scaled 2 shifted point n of q withcolor blue;
+ endfor;
+endfig;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+f := 0.35*(3,5,2);
+beginfig(1);
+ numeric tu, num, i, fac;
+ pen pencontrol, penspline, penalytic;
+ color colcontrol, colspline, colorytic, colormark;
+ color w[];
+ pencontrol = pencircle scaled 4pt;
+ penspline = pencircle scaled 2pt;
+ penalytic = pencircle scaled 1pt;
+ colcontrol = black;
+ colspline = red;
+ colorytic = blue+green;
+ colormark = (0.8,0.8,0.1);
+ tu = 6cm;
+ num = 50;
+ fac = 1.2;
+ transform T;
+ T = identity scaled tu;
+ z21 = origin;
+ z22 = (1,0);
+ z23 = (1,1);
+ z24 = (0,1);
+ z1 = z21 transformed T;
+ z2 = z22 transformed T;
+ z3 = z23 transformed T;
+ z4 = z24 transformed T;
+ z6 = (fac,0) transformed T;
+ z8 = (0,fac) transformed T;
+ drawarrow z1--z6;
+ drawarrow z1--z8;
+ label.lrt( "x", z6 );
+ label.ulft( "y", z8 );
+ dotlabels.urt(1,2,3,4);
+ z11 = twotwo( z21 );
+ z12 = twotwo( z22 );
+ z13 = twotwo( z23 );
+ z14 = twotwo( z24 );
+ w1 = twothr( z21 );
+ w2 = twothr( z22 );
+ w3 = twothr( z23 );
+ w4 = twothr( z24 );
+ cartaxes( fac, fac, 0.3*fac );
+ draw z12--z13--z14 dashed evenly;
+ draw z2--z3--z4 dashed evenly;
+ % 1) Next line: MetaPost intrinsic path.
+ draw z1..controls z2 and z3..z4 withpen penspline withcolor colspline;
+ % 2) Next line: my implementation of the MetaPost intrinsic path.
+ draw z1 for i=1 upto num: ..casteljau(z1,z2,z3,z4,i/num) endfor
+ withpen penalytic withcolor colorytic;
+ % 5) Next line: hopefully, how it should be done. Yeah! Way to go!
+ draw z11 for i=1 upto num: ..nextthirty(w1,w2,w3,w4,i/num) endfor
+ withpen pencontrol withcolor colcontrol;
+ % 4) Next line: MetaPost intrinsic path of perspectived control points.
+ draw z11..controls z12 and z13..z14
+ withpen penspline withcolor colspline;
+ % 3) Next line: what should be drawn in perspective.
+ draw z11 for i=1 upto num: ..rp(casteljau(w1,w2,w3,w4,i/num)) endfor
+ withpen penalytic withcolor colorytic;
+ % 6) Next line: Troy's approximation
+ draw nurbsapprox(w1,w2,w3,w4) withcolor colormark;
+
+
+endfig;
+
+f := 1.05*(3,5,2);
+
+beginfig(2);
+ color w[];
+ w1 = (1,0,0);
+ w2 = (0,0,1);
+ w3 = (0,1,0);
+ w4 = (1,1,1);
+ w5 = (1,1,0);
+ w6 = (1,0,1);
+ w7 = (0,1,1);
+ cartaxes( fac, fac, fac );
+ draw rp(w1)--rp(w2)--rp(w3)--rp(w4)--rp(w5)--rp(w1)--rp(w6)--
+ rp(w2)--rp(w7)--rp(w3)--rp(w5) dashed withdots;
+ draw rp(w6)--rp(w4)--rp(w7) dashed withdots;
+ draw xoy(w1) for i=1 upto num:
+ ..xoy(casteljau(w1,w3,black,w5,i/num))
+ endfor withcolor colormark;
+ draw xoy(w1) for i=1 upto num: ..xoy(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw xoz(w1) for i=1 upto num: ..xoz(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw rp(w1) for i=1 upto num: ..nextthirty(w1,w2,w3,w4,i/num) endfor
+ withpen pencontrol withcolor colcontrol;
+ draw rp(w1) for i=1 upto num: ..rp(casteljau(w1,w2,w3,w4,i/num)) endfor
+ withpen penalytic withcolor colorytic;
+ draw nextthirty(w1,w2,w3,w4,0.5) withpen pencontrol withcolor red;
+endfig;
+
+beginfig(5);
+ color w[];
+ for i=1 upto 4:
+ w[i]=(uniformdeviate(1),uniformdeviate(1),uniformdeviate(1));
+ draw rp(w[i]) withpen pencontrol;
+ draw xoy(w[i]) withpen penspline;
+ draw xoz(w[i]) withpen penspline;
+ draw yoz(w[i]) withpen penspline;
+ endfor;
+ cartaxes( fac, fac, fac );
+ draw rp(w1)--rp(w2)--rp(w3)--rp(w4) withpen penspline dashed evenly;
+ draw xoy(w1)--xoy(w2)--xoy(w3)--xoy(w4) withpen penalytic dashed evenly;
+ draw xoz(w1)--xoz(w2)--xoz(w3)--xoz(w4) withpen penalytic dashed evenly;
+ draw yoz(w1)--yoz(w2)--yoz(w3)--yoz(w4) withpen penalytic dashed evenly;
+ draw xoy(w1) for i=1 upto num: ..xoy(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw xoz(w1) for i=1 upto num: ..xoz(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw yoz(w1) for i=1 upto num: ..yoz(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw rp(w1) for i=1 upto num: ..nextthirty(w1,w2,w3,w4,i/num) endfor
+ withpen pencontrol withcolor colcontrol;
+%%%%%%%%%%%%% the following line may crash;
+%% draw fitthreednurbswithtwodbezier(w1,w2,w3,w4,0.2)
+%% withpen penalytic withcolor red;
+endfig;
+
+beginfig(3);
+ path xyp, xzp;
+ xyp = origin..tension 2 and 0.75..right...(right+up+right+up);
+ xzp = origin..tension 2 and 0.75..(right+up)...(right+up+right);
+ z1 = postcontrol 0 of xyp;
+ z2 = postcontrol 0 of xzp;
+ z3 = precontrol 1 of xyp;
+ z4 = precontrol 1 of xzp;
+% show (xpart z1);
+% show (xpart z2);
+% show (xpart z3);
+% show (xpart z4);
+ draw xyp;
+ draw xzp;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/splineperspectives.mp b/graphics/metapost/contrib/macros/featpost/example/splineperspectives.mp
new file mode 100644
index 0000000000..7637106f61
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/splineperspectives.mp
@@ -0,0 +1,272 @@
+% splineperspectives.mp
+% L. Nobre G.
+% Troy Henderson
+% Przemek Koprowski
+% Manjusha Joshi
+% 2012
+
+prologues := 1;
+color f, vecU, vecV, Perp;
+numeric EPS, iterations;
+EPS:=1/25;
+iterations = 0;
+
+ vardef initializeperspective( expr Focus ) =
+ f := Focus;
+ vecV := N( (-Y(f), X(f), 0) );
+ vecU := ncrossprod( f, vecV );
+ Perp := N( f )
+ enddef;
+
+ def X(expr A) = redpart A enddef;
+
+ def Y(expr A) = greenpart A enddef;
+
+ def Z(expr A) = bluepart A enddef;
+
+ def conorm(expr A) = ( X(A) ++ Y(A) ++ Z(A) ) enddef;
+
+ def N(expr A) =
+ begingroup
+ save M, exitcolor;
+ numeric M;
+ color exitcolor;
+ M = conorm( A );
+ if M > 0:
+ exitcolor = ( X(A)/M, Y(A)/M, Z(A)/M );
+ else:
+ exitcolor := black;
+ fi;
+ ( exitcolor )
+ endgroup
+ enddef;
+
+ def cdotprod(expr A, B) =
+ ( X(A)*X(B) + Y(A)*Y(B) + Z(A)*Z(B) )
+ enddef;
+
+ def ccrossprod(expr A, B) =
+ ( Y(A)*Z(B) - Z(A)*Y(B),
+ Z(A)*X(B) - X(A)*Z(B),
+ X(A)*Y(B) - Y(A)*X(B) )
+ enddef;
+
+% The dotproduct of two normalized vectors is the cosine of the angle
+% they form.
+
+ def ndotprod(expr A, B) =
+ begingroup
+ save a, b;
+ color a, b;
+ a = N(A);
+ b = N(B);
+ ( ( X(a)*X(b) + Y(a)*Y(b) + Z(a)*Z(b) ) )
+ endgroup
+ enddef;
+
+% The normalized crossproduct of two vectors.
+% Also check getangle below.
+
+ def ncrossprod(expr A, B) =
+ N( ccrossprod( A, B ) )
+ enddef;
+
+ def rp(expr R) =
+ begingroup
+ numeric verticalcoordinate, horizontalcoordina;
+ f-vecV*horizontalcoordina-vecU*verticalcoordinate=whatever*(f-R);
+ ( 150*(horizontalcoordina,verticalcoordinate) )
+ endgroup
+ enddef;
+
+ def line( expr Ang ) =
+ begingroup
+ save a, b, c;
+ numeric a, b, c;
+ a = (2-(1 ++ cosd(Ang))*cosd(3*Ang))*cosd(Ang);
+ b = (2-(1 ++ cosd(Ang))*cosd(3*Ang))*sind(Ang);
+ c =1.5+(1 ++ cosd(Ang))*sind(3*Ang);
+ ( (a,b,c) )
+ endgroup
+ enddef;
+
+ vardef rationalnobreg(expr A,B,C,D) =
+ save P,Q,E,wmin,wMax,we;
+ color P[],Q[],E;
+ numeric we[];
+ we[0]:=cdotprod( Perp, f-A );
+ we[1]:=cdotprod( Perp, f-B );
+ we[2]:=cdotprod( Perp, f-C );
+ we[3]:=cdotprod( Perp, f-D );
+ wmin:=min(we[0],we[1],we[2],we[3]);
+ wMax:=max(we[0],we[1],we[2],we[3]);
+ if ((1-wmin/wMax) > EPS):
+ P[0]:=A;
+ P[1]:=1/2[A,B];
+ E:=1/2[B,C];
+ Q[2]:=1/2[C,D];
+ Q[3]:=D;
+ P[2]:=1/2[P[1],E];
+ Q[1]:=1/2[E,Q[2]];
+ P[3]:=1/2[P[2],Q[1]];
+ Q[0]:=P[3];
+ iterations := incr( iterations );
+ rationalnobreg(P[0],P[1],P[2],P[3]) & rationalnobreg(Q[0],Q[1],Q[2],Q[3])
+ else:
+ rp(A) .. controls rp(B) and rp(C) .. rp(D)
+ fi
+ enddef;
+
+ def casteljau( expr Za, Zb, Zc, Zd, Pt ) = %%%%%%%%%%%%%%%%%%% 2D or 3D
+ begingroup
+ save A, B, C, D;
+ numeric A, B, C, D;
+ A = (1-Pt)**3;
+ B = 3*((1-Pt)**2)*Pt;
+ C = 3*(1-Pt)*(Pt**2);
+ D = Pt**3;
+ ( (A*Za+B*Zb+C*Zc+D*Zd) )
+ endgroup
+ enddef;
+
+ def twothr( expr Z ) = ( xpart Z, ypart Z, 0 ) enddef;
+
+ def twotwo( expr Z ) = rp( twothr( Z ) ) enddef;
+
+ def xoy( expr Z ) = rp( ( X(Z), Y(Z), 0 ) ) enddef;
+
+ def yoz( expr W ) = rp( ( 0, Y(W), Z(W) ) ) enddef;
+
+ def xoz( expr W ) = rp( ( X(W), 0, Z(W) ) ) enddef;
+
+ def nextthirty( expr Za, Zb, Zc, Zd, Pt ) = %%% input 3D and return 2D
+ begingroup
+ save A, B, C, D, Tot, P;
+ numeric A, B, C, D, Tot;
+ A = ((1-Pt)**3)*cdotprod( Perp, f-Za );
+ B = 3*((1-Pt)**2)*Pt*cdotprod( Perp, f-Zb );
+ C = 3*(1-Pt)*(Pt**2)*cdotprod( Perp, f-Zc );
+ D = (Pt**3)*cdotprod( Perp, f-Zd );
+ Tot = A+B+C+D;
+ ( (A*rp(Za)+B*rp(Zb)+C*rp(Zc)+D*rp(Zd))/Tot )
+ endgroup
+ enddef;
+
+beginfig(1);
+% initializeperspective(0.35*(3,5,2));
+ initializeperspective((1.3,1.31,1.32));
+ color w[];
+ numeric num, i;
+ pen pencontrol, penalytic;
+ color colcontrol, colorytic;
+ pencontrol = pencircle scaled 4pt;
+ penalytic = pencircle scaled 2pt;
+ colcontrol = black;
+ colorytic = blue+green;
+ num = 50;
+ w1 = (1,0,0);
+ w2 = (0,0,1);
+ w3 = (0,1,0);
+ w4 = (1,1,1);
+ w5 = (1,1,0);
+ w6 = (1,0,1);
+ w7 = (0,1,1);
+ for i=1 upto 3: draw rp(black)--rp(w[i]); endfor;
+ draw rp(w1)--rp(w2)--rp(w3)--rp(w4)--rp(w5)--rp(w1)--rp(w6)--
+ rp(w2)--rp(w7)--rp(w3)--rp(w5) dashed withdots;
+ draw rp(w6)--rp(w4)--rp(w7) dashed withdots;
+ draw xoy(w1) for i=1 upto num: ..xoy(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw xoz(w1) for i=1 upto num: ..xoz(casteljau(w1,w2,w3,w4,i/num)) endfor;
+ draw rp(w1) for i=1 upto num: ..nextthirty(w1,w2,w3,w4,i/num) endfor
+ withpen pencontrol withcolor colcontrol;
+ draw rp(w1) for i=1 upto num: ..rp(casteljau(w1,w2,w3,w4,i/num)) endfor
+ withpen penalytic withcolor colorytic;
+ draw rationalnobreg(w1,w2,w3,w4);
+ show iterations;
+ draw nextthirty(w1,w2,w3,w4,0.5) withpen pencontrol withcolor red;
+endfig;
+
+beginfig(2);
+ initializeperspective((3,5,4));
+ color node[], pre[], pos[], a, b, c;
+ numeric i, j, k, l;
+ path td[];
+ pen penmark;
+ pair aux[];
+ penmark = pencircle scaled 2mm;
+ j = 0;
+ draw for i=1 step 3 until 360: xoy(line(i)).. endfor cycle;
+ draw for i=1 step 3 until 360: rp(line(i)).. endfor cycle;
+ for i=10 step 23 until 360:
+ j := incr( j );
+ node[j] = line( i );
+ draw rp(node[j]) withpen penmark;
+ endfor;
+ td1 = for i=1 upto j: (X(node[i]),Y(node[i])).. endfor cycle;
+ td2 = for i=1 upto j: (X(node[i]),Z(node[i])).. endfor cycle;
+ td3 = for i=1 upto j: (Y(node[i]),Z(node[i])).. endfor cycle;
+ for i=1 upto j:
+ l := i-1;
+ for k=1 upto 3:
+ aux[k] := precontrol l of td[k];
+ endfor;
+ a := (xpart (aux1 - point l of td1),ypart (aux1 - point l of td1),0);
+ b := (xpart (aux2 - point l of td2),0,ypart (aux2 - point l of td2));
+ c := (0,xpart (aux3 - point l of td3),ypart (aux3 - point l of td3));
+ pre[i] = node[i]+0.5*(a+b+c);
+ draw rp(pre[i]) withpen penmark withcolor blue;
+ for k=1 upto 3:
+ aux[k] := postcontrol l of td[k];
+ endfor;
+ a := (xpart (aux1 - point l of td1),ypart (aux1 - point l of td1),0);
+ b := (xpart (aux2 - point l of td2),0,ypart (aux2 - point l of td2));
+ c := (0,xpart (aux3 - point l of td3),ypart (aux3 - point l of td3));
+ pos[i] = node[i]+0.5*(a+b+c);
+ draw rp(pos[i]) withpen penmark withcolor red;
+ draw rp(pre[i])--rp(pos[i]) withcolor green;
+ endfor;
+endfig;
+
+beginfig(3);
+ initializeperspective((7,11,9));
+ color node[], pre[], pos[];
+ numeric i, j, param, k, num;
+ pen penmark;
+ param = 0.333;
+ num = 12;
+ penmark = pencircle scaled 2mm;
+ j = 1;
+ draw for i=1 step 3 until 360: xoy(line(i)).. endfor cycle;
+ draw for i=1 step 3 until 360: rp(line(i)).. endfor cycle;
+ for i=10 step 23 until 360:
+ j := incr( j );
+ node[j] = line( i );
+ draw rp(node[j]) withpen penmark;
+ endfor;
+ node[1] = node[j];
+ node[0] = node[j-1];
+ node[j+1] = node[2];
+ for i=2 upto j:
+ %
+ pre[i] = node[i]-param*conorm(node[i]-node[i-1])*N(node[i+1]-node[i-1]);
+ %
+ endfor;
+ pre[1] = pre[j];
+ for i=1 upto j-1:
+ %
+ pos[i] = node[i]+param*conorm(node[i+1]-node[i])*N(node[i+1]-node[i-1]);
+ %
+ endfor;
+ pos[j] = pos[1];
+ for i=1 upto j-1:
+ draw rp(pre[i]) withpen penmark withcolor blue;
+ draw rp(pos[i]) withpen penmark withcolor red;
+ draw rp(pre[i])--rp(pos[i]) withcolor green;
+ draw
+ for k=0 upto num-1:
+ rp(casteljau(node[i],pos[i],pre[i+1],node[i+1],k/num))..
+ endfor rp(node[i+1]) withcolor (red+blue);
+ endfor;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/spltwiben.mp b/graphics/metapost/contrib/macros/featpost/example/spltwiben.mp
new file mode 100644
index 0000000000..4f24df9a24
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/spltwiben.mp
@@ -0,0 +1,81 @@
+% spltwiben.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def zsurface( expr xc, yc ) =
+ ((3*xc-5)*(3*xc+5)/(3*sqrt(3)*yc-5))
+enddef;
+
+f := (4,-5,3);
+Spread := 120;
+
+beginfig(1);
+ numeric i, j, nx, ny, lowx, higx, lowy, higy;
+ numeric posx, posy, posz, facz;
+ color gridx[], pos, reforig, endbeta, endpsip;
+ color endfiel, kdiv, krot, kben, akdiv, akrot, akben;
+ path facex;
+ facz = 7;
+ nx = 15;
+ ny = 50;
+ lowx = 0;
+ higx = 0.5*sqrt(3);
+ reforig = (0,-0.5,0);
+ endpsip = (0.3,-0.5,0);
+ endbeta = (0,-0.2,0);
+ endfiel = (0,-0.5,9/facz);
+ kdiv = (0,-0.5,8/facz);
+ krot = (0,-0.5,2/facz);
+ kben = (0,-0.5,5/facz);
+ akdiv = (higx,0.5,8/facz);
+ akrot = (higx,-0.5,2/facz);
+ akben = (0,0,5/facz);
+ draw rp((0,0,0))--rp((0,0,5/facz));
+ for i=1 upto nx:
+ posx := lowx + i*( higx - lowx )/nx;
+ lowy := -sqrt(3)*posx/3;
+ higy := -lowy;
+ for j=0 upto ny:
+ posy := lowy + j*( higy - lowy )/ny;
+ posz := zsurface( posx, posy )/facz;
+ gridx[j] := ( posx, posy, posz );
+ % show gridx[j];
+ endfor;
+ pos := ( posx, lowy, 0 );
+ facex := rp( pos )--rp( gridx0 );
+ for j=1 upto ny:
+ facex := facex--rp( gridx[j] );
+ endfor;
+ facex:=facex--rp((posx,higy,0))--cycle;
+ unfill facex;
+ draw facex;
+ endfor;
+ drawarrow rp(reforig)--rp(endpsip);
+ drawarrow rp(reforig)--rp(endbeta);
+ drawarrow rp(reforig)--rp(endfiel);
+ label.ulft(btex $\mathcal{X}$ etex, rp(endbeta) );
+ label.llft(btex $\mathcal{Z}$ etex, rp(endpsip) );
+ label.llft(btex $\mathcal{H}$ etex, rp(endfiel) );
+ dotlabel("",rp(reforig+(0,0,Z(gridx[ny]))));
+ dotlabel("",rp(reforig+(0,0,Z(gridx0))));
+ dotlabel("",rp(kben));
+ dotlabel.rt(btex $\mathcal{K}_1$ etex,rp(gridx[ny]));
+ dotlabel.lrt(btex $\mathcal{K}_2$ etex,rp(gridx0));
+ dotlabel.lft(btex $\mathcal{K}_3$ etex,rp(akben));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/squareanglines.mp b/graphics/metapost/contrib/macros/featpost/example/squareanglines.mp
new file mode 100644
index 0000000000..37df82e02a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/squareanglines.mp
@@ -0,0 +1,14 @@
+% squareanglines.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ cartaxes(1,1,1);
+ squareangline( red, green, black, 0.4);
+ squareangline( green, blue, black, 0.6);
+ squareangline( blue, red, black, 0.8);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/srinathpolineni.mp b/graphics/metapost/contrib/macros/featpost/example/srinathpolineni.mp
new file mode 100644
index 0000000000..2fd9ae49bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/srinathpolineni.mp
@@ -0,0 +1,223 @@
+% srinathpolineni.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+numeric thickn;
+thickn = 7;
+
+beginfig(8);
+ f := 3*(5,3,4);
+ Spread := 60;
+
+ numeric hstep, hmax, hsdev, basestep, basemax, basesdev;
+ numeric i, j, k, angsdev, cylength, cyradius, basen, hn;
+ numeric vcx, vcy, vcz, hcurr, xcurr, ycurr, hbase, aone;
+ numeric atwo, zcurr, counter, aonebase, atwobase;
+ color lenvec, currpos;
+
+ cylength := 0.6;
+ cyradius := 0.1;
+ basen := 12;
+ hn := 4;
+ basestep := cyradius*3.1;
+ hstep := cylength*1.5;
+ basesdev := cyradius*0.1;
+ hsdev := hstep*0.2;
+ hbase := -0.8;
+ angsdev := 7;
+ aonebase := 170;
+ atwobase := 12;
+
+ basemax := basen*basestep;
+ hmax := hn*hstep;
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ hcurr := hbase;
+ forever:
+ exitunless hcurr < hmax+hbase;
+ hcurr := hcurr + hstep;
+ zcurr := hcurr + hsdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := uniformdeviate( 360 );
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(5);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ for hcurr=hbase step hstep until hmax:
+ zcurr := hcurr;
+ xcurr := i*basestep;
+ ycurr := j*basestep;
+ aone := aonebase;
+ atwo := atwobase;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(6);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ for hcurr=hbase step hstep until hmax:
+ zcurr := hcurr + basesdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := aonebase + angsdev*(normaldeviate-0.5);
+ atwo := atwobase + angsdev*(normaldeviate-0.5);
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(7);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ for hcurr=hbase step hstep until hmax:
+ zcurr := hcurr + basesdev*normaldeviate;
+ xcurr := i*basestep + basesdev*normaldeviate;
+ ycurr := j*basestep + basesdev*normaldeviate;
+ aone := aonebase + angsdev*(normaldeviate-0.5);
+ atwo := angsdev*(normaldeviate-0.5);
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(9);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ for hcurr=hbase step hstep until hmax:
+ zcurr := hbase + uniformdeviate(hmax-hbase);
+ xcurr := uniformdeviate(basen*basestep);
+ ycurr := uniformdeviate(basen*basestep);
+ aone := uniformdeviate(180);
+ atwo := uniformdeviate(180)-90;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(1);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ zcurr := basesdev*normaldeviate;
+ xcurr := uniformdeviate(basen*basestep);
+ ycurr := uniformdeviate(basen*basestep);
+ aone := uniformdeviate(180);
+ atwo := 90;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(3);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ zcurr := basesdev*normaldeviate;
+ xcurr := uniformdeviate(basen*basestep);
+ ycurr := uniformdeviate(basen*basestep);
+ aone := uniformdeviate(180);
+ atwo := 0;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+beginfig(2);
+ counter := 0;
+ for i=1 upto basen:
+ for j=1 upto basen:
+ zcurr := basesdev*normaldeviate;
+ xcurr := uniformdeviate(basen*basestep);
+ ycurr := uniformdeviate(basen*basestep);
+ aone := uniformdeviate(180);
+ atwo := angsdev*normaldeviate;
+ vcz := cosd( atwo );
+ vcy := sind( atwo )*sind( aone );
+ vcx := sind( atwo )*cosd( aone );
+ currpos := ( xcurr, ycurr, zcurr );
+ lenvec := cylength*( vcx, vcy, vcz );
+ counter := incr( counter );
+ generatedirline( counter, aone, 90-atwo, cylength, currpos );
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, thickn, false );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/stageforthree.mp b/graphics/metapost/contrib/macros/featpost/example/stageforthree.mp
new file mode 100644
index 0000000000..85a7b0d426
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/stageforthree.mp
@@ -0,0 +1,115 @@
+% stageforthree.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 35;
+f := (13,7,3.5);
+
+beginfig(1);
+ numeric i, len, wang, reflen, frac, coordg;
+ numeric fws, NumLines, inray, outay;
+ path conepath, cira, cirb, ella, ellb, tuba, tubb, tubc;
+ color axe, aroc, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, ellbaxe, pca, pea, pcb, peb;
+ frac := 0.5;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.2*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ coordg := frac*fws;
+ NumLines := 30;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 2*fws );
+ cubevertex = (0.12*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.65*fws,0.2*fws,fws);
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.707, -0.707, 1.0 );
+ ellbaxe := reflen*( -0.707, 0.707, 1.0 );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ pca := ( coordg, -coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+ pea := ( coordg, -coordg, 0.9*fws );
+ peb := ( -coordg, coordg, 0.9*fws );
+ cira := goodcirclepath( pca, blue, reflen );
+ cirb := goodcirclepath( pcb, blue, reflen );
+ ella := ellipticpath( pea, allellaxe, ellaaxe );
+ ellb := ellipticpath( peb, allellaxe, ellbaxe );
+ tuba := twocyclestogether( cira, ella );
+ tubb := twocyclestogether( cirb, ellb );
+ tubc := twocyclestogether( ella, ellb );
+ unfill tubb; draw tubb;
+ unfill tubc; draw tubc;
+ unfill tuba; draw tuba;
+ conevertex = conecenter + ( -3.5*reflen, 0, 0.8*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+
+Spread := 23;
+f := (6,13,3);
+ShadowOn := true;
+
+beginfig(2);
+ numeric reflen, frac, coordg;
+ numeric fws, NumLines;
+ path ella, ellb;
+ color axe, cubevertex;
+ color allellaxe, ellaaxe, pca, pcb;
+ frac := 0.5;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.35*fws;
+ coordg := frac*fws;
+ NumLines := 52;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 3.6*fws );
+ cubevertex = (0.3*fws,-0.5*fws,-0.5*fws);
+ kindofcube(false,true,cubevertex,180,0,0,0.6*fws,0.2*fws,fws);
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.5, -0.5, 0 );
+ pca := ( coordg, coordg, -0.5*fws );
+ pcb := ( -coordg, coordg, -0.5*fws );
+
+ whatisthis( pca, 0.5*ellaaxe, allellaxe, reflen, 0.3 );
+ whatisthis( pcb, ellaaxe*sqrt(2), allellaxe/sqrt(2), 2*reflen, 0.6 );
+
+endfig;
+
+Spread := 23;
+f := (13,6,4.5);
+ShadowOn := true;
+LightSource := 10*(4,-3,6);
+beginfig(3);
+ numeric reflen, frac, coordg;
+ numeric fws, NumLines;
+ path ella, ellb;
+ color axe, cubevertex, conecenter, conevertex;
+ color allellaxe, ellaaxe, pca, pcb;
+ frac := 0.5;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ reflen := 0.35*fws;
+ coordg := frac*fws;
+ NumLines := 45;
+ HoriZon := -0.5*fws;
+ setthestage( 0.5*NumLines, 3.3*fws );
+ cubevertex = (0.3*fws,-0.5*fws,0);
+ tropicalglobe( 7, cubevertex, 0.5*fws, axe );
+ allellaxe := reflen*( 0.707, 0.707, 0 );
+ ellaaxe := reflen*( 0.5, -0.5, 0 );
+ pcb := ( -coordg, coordg, 0 );
+ rigorousdisc( 0, true, pcb, 0.5*fws, -ellaaxe );
+ conecenter = ( coordg, coordg, -0.5*fws );
+ conevertex = conecenter + ( 0, 0, 0.9*fws );
+ verygoodcone(false,conecenter,blue,reflen,conevertex);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/statement.mp b/graphics/metapost/contrib/macros/featpost/example/statement.mp
new file mode 100644
index 0000000000..f04781583b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/statement.mp
@@ -0,0 +1,51 @@
+% statement.mp
+% L. Nobre G.
+% 2007
+
+% prologues := 3;
+
+input boxes;
+
+verbatimtex \documentclass{article}\usepackage{palatino}\begin{document} etex
+
+beginfig(1);
+ picture topl, midd, botl;
+ numeric tl, ml, bl;
+% topl = thelabel(btex \mbox{G E T T ' N ' R E A D Y} etex, origin);
+% midd = thelabel(btex \mbox{4D} etex, origin);
+% botl = thelabel(btex \mbox{c l i m b} etex, origin);
+% defaultfont := "putr8r";
+% defaultfont := "bchr8r";
+ topl = thelabel( "G E T T ' N ' R E A D Y", origin) yscaled 0.3;
+ midd = thelabel( "4D", origin) scaled 1;
+ botl = thelabel( "C L I M B", origin) yscaled 0.6;
+ tl = abs( urcorner topl - ulcorner topl );
+ ml = abs( urcorner midd - ulcorner midd );
+ bl = abs( urcorner botl - ulcorner botl );
+ boxjoin( a.se=b.ne; a.sw=b.nw );
+ boxit.topli(topl);
+ boxit.middl(midd scaled (tl/ml) );
+ boxit.botli(botl xscaled (tl/bl) );
+ drawunboxed( topli, middl, botli );
+endfig;
+
+beginfig(2);
+ picture topl, midd, botl;
+ numeric tl, ml, bl, sc;
+ sc = 10;
+ topl = thelabel( btex o\ n\ e\ \ l\ i\ f\ e etex scaled sc, origin) yscaled 0.3;
+ midd = thelabel( btex {\huge 40} etex scaled sc, origin) scaled 1;
+ botl = thelabel( btex D\ R\ I\ L\ L\ S etex scaled sc, origin) yscaled 0.6;
+ tl = abs( urcorner topl - ulcorner topl );
+ ml = abs( urcorner midd - ulcorner midd );
+ bl = abs( urcorner botl - ulcorner botl );
+ boxjoin( a.se=b.ne; a.sw=b.nw );
+ boxit.topli(topl);
+ boxit.middl(midd scaled (tl/ml) );
+ boxit.botli(botl xscaled (tl/bl) );
+ drawunboxed( topli, middl, botli );
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/statethreelines.mp b/graphics/metapost/contrib/macros/featpost/example/statethreelines.mp
new file mode 100644
index 0000000000..c2221d20e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/statethreelines.mp
@@ -0,0 +1,21 @@
+input boxes;
+
+beginfig(0);
+ picture topl, midd, botl;
+ numeric tl, ml, bl;
+ defaultfont := "bchbo8r";
+% defaultfont := "putro8r";
+ topl = thelabel( "Eu Vivo", origin) yscaled 1;
+ midd = thelabel( "na", origin) scaled 1;
+ botl = thelabel( "Cauda da Europa", origin) yscaled 1;
+ tl = abs( urcorner topl - ulcorner topl );
+ ml = abs( urcorner midd - ulcorner midd );
+ bl = abs( urcorner botl - ulcorner botl );
+ boxjoin( a.se=b.ne; a.sw=b.nw );
+ boxit.topli(topl);
+ boxit.middl(midd);
+ boxit.botli(botl);
+ drawunboxed( topli, middl, botli );
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/steamcamera.mp b/graphics/metapost/contrib/macros/featpost/example/steamcamera.mp
new file mode 100644
index 0000000000..6fd1d73d47
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/steamcamera.mp
@@ -0,0 +1,58 @@
+% steamcamera.mp
+% L. Nobre G.
+% 2006
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,mathpazo}
+\begin{document}
+etex
+
+Spread := 50;
+f := (3,5,2);
+
+beginfig(0);
+ numeric slabthick, camethick, blocthick, blochange;
+ numeric slabside, cameside, blocside;
+ color slabpos, camepos, blocpos;
+ numeric markmargin;
+ color lowonbloc, lowonmark, lowonextr;
+ color higonbloc, higonmark, higonextr;
+ color newlevelcenter;
+ slabthick = 0.07;
+ camethick = 0.7;
+ blocthick = 0.6;
+ slabside = 1.2;
+ cameside = 0.9;
+ blocside = 0.7;
+ blochange = 0.25;
+ markmargin = 0.04;
+ slabpos = black;
+ camepos = -0.5*(slabthick+camethick)*blue;
+ blocpos = 0.5*slabthick*blue;
+ lowonbloc = blocpos+(0,0.5*blocside,blocthick-blochange);
+ higonbloc = blocpos+(0,0.5*blocside,blocthick);
+ lowonmark = blocpos+(-0.5*slabside,0.5*blocside,blocthick-blochange);
+ higonmark = blocpos+(-0.5*slabside,0.5*blocside,blocthick);
+ lowonextr = lowonmark - markmargin*red;
+ higonextr = higonmark - markmargin*red;
+ kindofcube( false, false, camepos, 0, 0, 0, cameside, cameside, camethick );
+ kindofcube( false, false, slabpos, 0, 0, 0, slabside, slabside, slabthick );
+ rigorousdisc( 0, true, blocpos, 0.5*blocside, blocthick*blue );
+ newlevelcenter = (blocthick-blochange+0.5*slabthick)*blue;
+ draw
+ spatialhalfcircle( newlevelcenter, blue, 0.5*blocside, true )
+ dashed evenly;
+ draw rp(lowonbloc)--rp(lowonextr);
+ draw rp(higonbloc)--rp(higonextr);
+ drawdblarrow rp(lowonmark)--rp(higonmark);
+ label.rt( btex $\Delta y$ etex, rp(0.5[lowonmark,higonmark]) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/strength1defect.mp b/graphics/metapost/contrib/macros/featpost/example/strength1defect.mp
new file mode 100644
index 0000000000..fe0bee08e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/strength1defect.mp
@@ -0,0 +1,85 @@
+% strength1defect.mp
+% L. Nobre G.
+% 2002
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+color col[],cyan, magenta, yellow;
+cyan=blue+green; magenta=red+blue;yellow=green+red;
+col[-2]:=col[-1]:=col0:=black;
+col1:=red;
+col2:=(.2,.2,1); %blue
+col3:=(1,.66,0); %orange
+col4:=.85*green;
+col5:=.9*magenta;
+col6:=0.85*cyan;
+col7:=.85*yellow;
+
+beginfig(1);
+ numeric ymax, xmax, i, j, noise, twist, grid, size, u, actsize;
+ numeric extral, yposa, yposb, yposc;
+ pair actpos, direct, one, two;
+ path linea, lineb, linec, linex, liney;
+ color cola, colb, colc, colx;
+ picture pica, picb, picc;
+ u = 0.3mm;
+ xmax = 9;
+ ymax = 9;
+ noise = 1u;
+ extral = 1;
+ size = 5u;
+ yposa = 8;
+ yposb = 5;
+ yposc = 2;
+% cola = (0.78,0.32,0.12);
+% colb = (0.18,0.82,0.12);
+% colc = (0.18,0.22,0.92);
+ colx = (0.78,0.75,0.72);
+ cola = col5;
+ colb = col4;
+ colc = col3;
+ grid = size + 3*noise;
+ linea = (grid*(-xmax-extral,yposa))--(grid*(xmax+extral,yposa));
+ lineb = (grid*(-xmax-extral,yposb))--(grid*(xmax+extral,yposb));
+ linec = (grid*(-xmax-extral,yposc))--(grid*(xmax+extral,yposc));
+ linex = (grid*(-xmax-2*extral,0))--(grid*(xmax+2*extral,0));
+ liney = (grid*(0,-ymax-2*extral))--(grid*(0,ymax+2*extral));
+ pica = thelabel.rt( btex A etex, grid*(xmax+extral,yposa) );
+ picb = thelabel.rt( btex B etex, grid*(xmax+extral,yposb) );
+ picc = thelabel.rt( btex C etex, grid*(xmax+extral,yposc) );
+ draw pica withcolor cola;
+ draw picb withcolor colb;
+ draw picc withcolor colc;
+ label.llft( btex $x$ etex, grid*(xmax+2*extral,0) );
+ label.llft( btex $y$ etex, grid*(0,ymax+2*extral) );
+ pickup pencircle scaled 2u;
+ draw linea withcolor cola;
+ draw lineb withcolor colb;
+ draw linec withcolor colc;
+ pickup pencircle scaled 0.5u;
+ drawarrow linex withcolor colx;
+ drawarrow liney withcolor colx;
+ pickup pencircle scaled u;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=(grid*i+noise*normaldeviate,grid*j+noise*normaldeviate);
+ direct:=unitvector(actpos);
+ actsize:=size/2;
+ one:=actpos-actsize*direct;
+ two:=actpos+actsize*direct;
+ draw one--two;
+ endfor;
+ endfor;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/symbol.mp b/graphics/metapost/contrib/macros/featpost/example/symbol.mp
new file mode 100644
index 0000000000..1389b89d1c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/symbol.mp
@@ -0,0 +1,97 @@
+% symbol.mp
+% G. Morais
+% 2008
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+prologues := 3;
+
+beginfig(1)
+
+ numeric u ; u = 110 ;
+ numeric int ; int = .053u ;
+ numeric ext ; ext = .1u ;
+
+ color mycolor ;
+ mycolor := (.45 , .45 , .45 ) ;
+
+ color intcontorno ;
+ intcontorno := (.23 ,.23 ,.23 ) ;
+
+ color ground ;
+ ground := ( .09 , .19 , .25 ) ;
+
+ color sky ;
+ sky := ( .24 , .30 , .86 ) ;
+
+ path contorno[] ;
+ contorno[1] := (-2,2)*u..(0,-1)*u..(2,3)*u ;
+
+ z0 = point 0 of contorno[1] ;
+ z1 = point 1.8 of contorno[1] ;
+ z2 = point 0.5 of contorno[1] ;
+ z3 = point 2 of contorno[1] ;
+
+ contorno[2] := z0{(1,2)}..z3 ;
+
+ path interior[] ;
+ interior[1] := z1..(1,0)*u..z2 ;
+ z4 = point 1.5 of interior[1] ;
+
+ interior[2] := z4{right}..{right}z3 ;
+ z5 = point 0.4 of interior[2] ;
+
+ interior[3] := z0{(1,2)}..(.5,.35)*u..{(1,2)}z5 ;
+
+ path auxiliar[] ;
+ auxiliar[1] := (2,3)*u .. (0,-1)*u .. (-2,2)*u ;
+
+ auxiliar[2] := interior[2] .. subpath(2,1.8) of contorno[1] ..
+ interior[1] cutafter z4 .. cycle ;
+
+ path ciclo[] ;
+
+ ciclo[1] := interior[1] .. ( contorno[1] cutbefore z2 ) cutafter z1 ..cycle ;
+ ciclo[2] := interior[2] .. subpath(2,1.8) of contorno[1] ..
+ interior[1] cutafter z4 .. cycle ;
+ ciclo[3] := buildcycle ( interior[3] , interior[2] , interior[1] , contorno[1] ) ;
+ ciclo[4] := buildcycle ( interior[3] , interior[2] , contorno[2] ) ;
+
+ fill ciclo[1] withcolor ground ;
+ fill ciclo[2] withcolor .2blue ;
+ fill ciclo[3] withcolor .3red ;
+ fill ciclo[4] withcolor sky ;
+
+ pickup pencircle scaled int ;
+ draw interior[1] withcolor intcontorno ;
+ draw interior[2] withcolor intcontorno ;
+ draw interior[3] withcolor intcontorno ;
+
+ pickup pencircle scaled ext ;
+ draw contorno[1] withcolor mycolor ;
+ draw contorno[2] withcolor mycolor ;
+
+ color letras[] ;
+ letras[1] := ( .59 , .11 , .06 ) ;
+ letras[2] := ( .07 , .02 , .43 ) ;
+ draw btex GNUPOST etex
+ xscaled .112u yscaled .06u
+ shifted ( -2.8u , -1.6u )
+ withcolor letras[1] ;
+ draw btex WE SHARE OUR VISION etex scaled .052u
+ shifted ( -2.75u , -2.05u )
+ withcolor letras[2] ;
+
+% setbounds currentpicture to boundingbox currentpicture enlarged .05u ;
+
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end ; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/tangency2D.mp b/graphics/metapost/contrib/macros/featpost/example/tangency2D.mp
new file mode 100644
index 0000000000..08edd76355
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tangency2D.mp
@@ -0,0 +1,58 @@
+% intersection2D.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document}{\sffamily etex
+
+beginfig(1);
+ numeric u, r, d;
+ pair Aa, Ab, Ba, Bb, Ca, Cb, Da, Db, Ea, Eb, Or, Kn;
+ pen dotpen, penpen;
+ color knowncolour, notknowncol;
+ picture kn, un, rl;
+ u = 4mm;
+ Aa = (5u,4u);
+ Ab = (3u,2u);
+ Ba = (13u,5u);
+ Bb = 0.5[Aa,Ab];
+ r = abs( Aa - Ab );
+ d = abs( Aa - Ba ) +-+ r;
+ Ea = radialcross( Aa, r, Ba, d, true );
+ Eb = radialcross( Aa, r, Ba, d, false );
+ Ca = 1.4[Ba,Ea];
+ Cb = 1.15[Ea,Ba];
+ Da = 1.5[Ba,Eb];
+ Db = 1.1[Eb,Ba];
+ Kn = (0,1u);
+ Or = (10u,1u);
+ dotpen = pencircle scaled 0.5u;
+ penpen = pencircle scaled 0.2u;
+ knowncolour = blue;
+ notknowncol = red;
+ kn = btex given etex;
+ un = btex unknown etex;
+ rl = btex $R$ etex;
+ draw fullcircle scaled 2r shifted Aa;
+ draw Ca--Cb;
+ draw Da--Db dashed evenly;
+ drawarrow Aa--Ab;
+ drawoptions( withpen dotpen withcolor knowncolour );
+ draw Aa;
+ draw Ba;
+ draw Kn+Or;
+ drawoptions( withcolor knowncolour );
+ label.ulft( rl, Bb );
+ drawoptions( withpen dotpen withcolor notknowncol );
+ draw Ea;
+ draw Eb;
+ draw Or;
+ drawoptions();
+ label.rt( kn, Kn+Or );
+ label.rt( un, Or );
+endfig;
+
+verbatimtex }\end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/tangencypoint.mp b/graphics/metapost/contrib/macros/featpost/example/tangencypoint.mp
new file mode 100644
index 0000000000..87bdb22d07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tangencypoint.mp
@@ -0,0 +1,38 @@
+% tangencypoint.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric u, i;
+ u = 5mm;
+ pen a, b, c;
+ a = pencircle scaled 3pt;
+ b = pencircle scaled 5pt;
+ c = pencircle scaled 1pt;
+ z1 = (1u,1u);
+ z2 = (4u,4u);
+ z3 = (4u,5u);
+ z4 = (3u,5u);
+ z5 = (3u,6u);
+ z6 = (4u,7u);
+ z7 = (6u,1u);
+ path cp;
+ cp = z1{up}..z2..z3..z4..z5..{up}z6;
+ draw cp withpen c;
+ for i=1 upto 6:
+ draw z[i] withpen a withcolor 0.5*(red+green);
+ endfor;
+ z8 = firsttangencypoint( cp, z7, 5 );
+ draw z7 withpen b withcolor green;
+ draw z7--z8 withpen c withcolor blue;
+endfig;
+
+end.
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/tdarrow.mp b/graphics/metapost/contrib/macros/featpost/example/tdarrow.mp
new file mode 100644
index 0000000000..3433679a13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tdarrow.mp
@@ -0,0 +1,26 @@
+% tdarrow.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric size, num, i, j, coos[];
+ string comm;
+ color tmpc, fro, tip;;
+ size = 1.5;
+ num = 250;
+ draw rp(black)--rp((size,0,0))--rp((size,size,0))--rp((0,size,0))--cycle;
+ for i=1 upto num:
+ for j=1 upto 6:
+ coos[j] := uniformdeviate(size);
+ endfor;
+ fro := (coos1,coos2,coos3);
+ tip := (coos4,coos5,coos6);
+ comm := "tdarrow(" & cstr(fro) & "," & cstr(tip) & ");";
+ tmpc := 0.5[fro,tip];
+ getready( comm, tmpc );
+ endfor;
+ doitnow;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/tdcircarrow.mp b/graphics/metapost/contrib/macros/featpost/example/tdcircarrow.mp
new file mode 100644
index 0000000000..41e35a9dc8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tdcircarrow.mp
@@ -0,0 +1,29 @@
+% tdcircarrow.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+f := (3,5,2);
+Spread := 200;
+TDAtiplen := 0.06;
+TDAhalftipbase := 0.04;
+TDAhalfthick := 0.025;
+
+beginfig(1);
+ setthearena(11,1);
+ numeric i, begsum, amp, margi;
+ margi = 6;
+ begsum = 0;
+ amp = 36;
+ for i=1 upto 4:
+ tdcircarrow( black, blue, 0.6, begsum, amp-margi );
+ begsum := begsum+amp;
+ amp := 36*(i+1);
+ endfor;
+ tdarrow(black,0.6*ncrossprod( -f, blue ));
+ tdarrow(black,0.6*ncrossprod( ccrossprod( -f, blue ), blue ));
+endfig;
+
+end.
+ \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/telemira.mp b/graphics/metapost/contrib/macros/featpost/example/telemira.mp
new file mode 100644
index 0000000000..9f37b8dc6d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/telemira.mp
@@ -0,0 +1,22 @@
+pair thecenter;
+thecenter = (105mm,150mm);
+
+vardef instructio( expr rayc ) =
+ draw fullcircle scaled rayc shifted thecenter
+enddef;
+
+beginfig(1);
+ numeric i, u, maxray;
+ u = 1mm;
+ maxray = 85u;
+ for i=30u step 1u until 40u:
+ instructio( i );
+ endfor;
+ for i=153u step 1u until 165u:
+ instructio( i );
+ endfor;
+ for i=0 step 90 until 270:
+ draw thecenter--(thecenter+maxray*dir(i));
+ endfor;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/telheiro.mp b/graphics/metapost/contrib/macros/featpost/example/telheiro.mp
new file mode 100644
index 0000000000..dcd00413a7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/telheiro.mp
@@ -0,0 +1,96 @@
+% telheiro.mp
+% L. Nobre G.
+% 2013
+
+input featpost3Dplus2D;
+
+prologues := 1;
+
+f := (6,1,3);
+
+vardef drawpat( expr Ind )( text Nam ) =
+ draw rp(Nam[Ind]) for i=Ind-1 downto 1: --rp(Nam[i]) endfor
+ for i=1 upto Ind: --rp((-X(Nam[i]),Y(Nam[i]),Z(Nam[i]))) endfor
+enddef;
+
+vardef xz( expr C )= (X(C),Z(C)) enddef;
+
+vardef xy( expr C )= (X(C),Y(C)) enddef;
+
+vardef recter( expr Pic ) = 0.5*((llcorner Pic)+(urcorner Pic)) enddef;
+
+beginfig(1);
+ numeric semimajor, semiminor, vertez, vertey, centery;
+ color verte, cente, maj, min, ver[], dia[], hor[], el;
+ numeric i, cou, ste, axe, maxang;
+ semimajor = 1.4;
+ semiminor = 1;
+ vertez = 1.1;
+ vertey = 0.25;
+ centery = 0.35;
+ ste = 2;
+ axe =1.5;
+ verte = (0,-vertey,vertez);
+ cente = (0,centery,0);
+ maj = (0,semimajor,0);
+ min = (semiminor,0,0);
+ color cen;
+ cen = (0,vertey+centery+semimajor,-vertez);
+ draw rp(verte)--rp(verte+cen);
+ cou = 1;
+ i = 1;
+ forever:
+ el := cente+planarrotation( maj, min, i );
+ ver[cou] = whatever[verte,el];
+ Y(ver[cou]) = 0;
+ dia[cou] = whatever[verte,el];
+ Z(dia[cou]) = Y(dia[cou]);
+ hor[cou] = whatever[verte,el];
+ Z(hor[cou]) = 0;
+ exitif (Z(ver[cou])>=vertez) or (Z(ver[cou])<0) or (Y(hor[cou])<0);
+ cou := cou+1;
+ i := i+ste;
+ endfor;
+ maxang = i;
+ cartaxes(axe,axe,axe);
+ draw rp(black)--rp((-axe,0,0));
+ drawpat(cou)(ver);
+ drawpat(cou)(hor);
+ drawoptions( withcolor blue );
+ drawpat(cou)(dia);
+endfig;
+
+beginfig(2);
+ numeric u;
+ u = 5cm;
+ draw (xz(ver[cou]) for i=cou-1 downto 1: --xz(ver[i]) endfor
+ for i=1 upto cou: --(-X(ver[i]),Z(ver[i])) endfor
+ for i=cou downto 1: --(-X(hor[i]),Y(hor[i])) endfor
+ for i=1 upto cou: --xy(hor[i]) endfor --cycle) scaled u;
+ picture surface;
+ surface = currentpicture;
+ currentpicture := nullpicture;
+ numeric ang, v, d, h;
+ pair ve[], di[], ho[], vec, possurf, posbase;
+ possurf = recter( surface );
+ ang = 0;
+ for i=1 upto cou:
+ ang:= ang+getangle( cen, hor[i]-verte );
+ cen:= hor[i]-verte;
+ v := conorm(verte-ver[i]);
+ d := conorm(verte-dia[i]);
+ h := conorm(cen);
+ vec := dir(90-ang);
+ ve[i] = u*v*vec;
+ di[i] = u*d*vec;
+ ho[i] = u*h*vec;
+ endfor;
+ draw di1 for i=2 upto cou: --di[i] endfor withcolor blue;
+ draw for i=cou downto 1: ve[i]-- endfor for i=1 upto cou: ho[i]-- endfor cycle;
+ draw currentpicture xscaled -1;
+ posbase = recter( currentpicture );
+ draw surface shifted (posbase-possurf);
+ produce_auto_scale;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/tete.mp b/graphics/metapost/contrib/macros/featpost/example/tete.mp
new file mode 100644
index 0000000000..e669065eb3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tete.mp
@@ -0,0 +1,24 @@
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture embroncordada;
+ embroncordada = thelabel( btex
+ \begin{tabular}{c}
+ \TeX \\
+ \& \\
+ \LaTeX
+ \end{tabular}
+ etex scaled 8, (105mm,150mm) );
+ draw embroncordada;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/tetrapodes.mp b/graphics/metapost/contrib/macros/featpost/example/tetrapodes.mp
new file mode 100644
index 0000000000..440c344e00
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tetrapodes.mp
@@ -0,0 +1,140 @@
+% tetrapodes.mp
+% L. Nobre G.
+% 2009
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{mathpazo}
+\begin{document}
+etex
+
+f := (10,2,3);
+Spread := 50;
+
+def rotatearoundZ( expr P, A ) =
+ ((X(P)*cosd(A)-Y(P)*sind(A),X(P)*sind(A)+Y(P)*cosd(A),Z(P)))
+enddef;
+
+beginfig(1);
+ numeric margia, margib, margic, raycil, raysph, angul;
+ color ca, cb;
+ path sph;
+ margia = 0.10;
+ margib = 1.52;
+ margic = 0.05;
+ raycil = 0.55;
+ raysph = 1.00;
+ angul = 30;
+ ca := (0,-raysph-margia-raycil,0);
+ cb := (-raycil-margic,0,raysph+margib);
+ rigorousdisc(0,true,ca,raycil,cb-ca);
+ ca := rotatearoundZ((-raysph-margia-raycil,0,0),angul);
+ cb := rotatearoundZ((0,raycil+margic,-raysph-margib),angul);
+ rigorousdisc(0,true,ca,raycil,cb-ca);
+ sph = rigorousfearpath(black,raysph);
+ unfill sph;
+ draw sph;
+ ca := rotatearoundZ((raysph+margia+raycil,0,0),angul);
+ cb := rotatearoundZ((0,-raycil-margic,-raysph-margib),angul);
+ rigorousdisc(0,true,ca,raycil,cb-ca);
+ ca := (0,raysph+margia+raycil,0);
+ cb := (raycil+margic,0,raysph+margib);
+ rigorousdisc(0,true,ca,raycil,cb-ca);
+endfig;
+
+beginfig(2);
+ numeric tro;
+ tro = 2;
+ V1 := (tro,0,0);
+ V2 := (0,tro,0);
+ V3 := (-tro,0,0);
+ V4 := (0,-tro,0);
+ V5 := (1,1,1);
+ V6 := (-1,1,1);
+ V7 := (-1,-1,1);
+ V8 := (1,-1,1);
+ V9 := (1,1,-1);
+ V10 := (-1,1,-1);
+ V11 := (-1,-1,-1);
+ V12 := (1,-1,-1);
+ V13 := (0,0,tro);
+ V14 := (0,0,-tro);
+ for i=1 upto 14:
+ V[i] := rotatearoundZ(V[i],45);
+ V[i] := (0.4*X(V[i]),Y(V[i]),1.5*Z(V[i]));
+ endfor;
+ makeface1(1,5,13,8);
+ makeface2(2,6,13,5);
+ makeface3(3,7,13,6);
+ makeface4(4,8,13,7);
+ makeface5(1,5,2,9);
+ makeface6(2,6,3,10);
+ makeface7(3,7,4,11);
+ makeface8(4,8,1,12);
+ makeface9(1,9,14,12);
+ makeface10(2,10,14,9);
+ makeface11(3,11,14,10);
+ makeface12(4,12,14,11);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ f := 2*(5,5,1.5);
+ Spread := 50;
+ pickup pencircle scaled 1pt;
+ sharpraytrace;
+endfig;
+
+def spacedistort( expr Pos, Ref, Fac ) =
+ ( Pos + cdotprod( Pos, Ref )*Fac*Ref )
+enddef;
+
+beginfig(3);
+ f := (15,10,5);
+ Spread := 50;
+ numeric numsidecells, numlimcorner, i, j, k, cx, cy, cz, faca, facb;
+ numeric ar, scal;
+ color posa, posb, posc, posd, thisoria, thisorib, thisoric,thatori;
+ path ball;
+ numsidecells = 7;
+ numlimcorner = 2*numsidecells+2;
+ faca = 0.0;
+ facb = 0.0;
+ ar = 1.0;
+ scal = 0.14;
+ thisoria = N(( 1, 1, 1));
+ thisorib = N(( 1,-2, 1));
+ thisoric = 0.5*sqrt(3)*(1,1,1);
+ thatori = ncrossprod(thisoric,thisorib);
+ for i=1 upto numsidecells:
+ cx := i-0.5*numsidecells-1;
+ for j=1 upto numsidecells:
+ cy := j-0.5*numsidecells-1;
+ for k=1 upto numsidecells:
+ cz := k-0.5*numsidecells-1;
+ if i+j+k < numlimcorner+1:
+ posa := spacedistort( (cx,cy,cz), thisoria, faca );
+ posa := spacedistort( posa, thisorib, facb );
+ posb := spacedistort( (cx-0.5,cy+0.5,cz), thisoria, faca );
+ posb := spacedistort( posb, thisorib, facb );
+ posc := spacedistort( (cx-0.5,cy,cz+0.5), thisoria, faca );
+ posc := spacedistort( posc, thisorib, facb );
+ posd := spacedistort( (cx,cy+0.5,cz+0.5), thisoria, faca );
+ posd := spacedistort( posd, thisorib, facb );
+% whatisthis(posa,scal*ar*thatori,scal*thisorib,1,1);
+% whatisthis(posb,scal*ar*thatori,scal*thisorib,1,1);
+% whatisthis(posc,scal*ar*thatori,scal*thisorib,1,1);
+% whatisthis(posd,scal*ar*thatori,scal*thisorib,1,1);
+ ball := rigorousfearpath( posa, scal ); unfill ball; draw ball;
+ ball := rigorousfearpath( posb, scal ); unfill ball; draw ball;
+ ball := rigorousfearpath( posc, scal ); unfill ball; draw ball;
+ ball := rigorousfearpath( posd, scal ); unfill ball; draw ball;
+ fi;
+ endfor;
+ endfor;
+ endfor;
+
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/theHURD.mp b/graphics/metapost/contrib/macros/featpost/example/theHURD.mp
new file mode 100644
index 0000000000..e59e686214
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/theHURD.mp
@@ -0,0 +1,102 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin_AT_uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2006 Wolfgang Glunz <wglunz34_AT_pstoedit.net>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+randomseed := 1010;
+vardef renewcolore =
+ color tmpcolo;
+ tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+ drawoptions( withcolor tmpcolo );
+enddef;
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+ PreeditedPath1 = hide(z1=(9.82422,68.9492))z1--hide(z2=(9.82422,12.8594))z2--hide(z3=(17.6836,11.7891))z3
+ ..controls hide(z4=(21.9688,11.2031))z4 and hide(z5=(26.6367,10.7148))z5..hide(z6=(27.9531,10.7148))z6
+ ..controls hide(z7=(29.8477,10.7148))z7 and hide(z8=(30.3633,15.4492))z8..hide(z9=(30.3633,32.7773))z9
+ --hide(z10=(30.3633,54.8359))z10--hide(z11=(55.8203,54.6562))z11..controls hide(z12=(69.75,54.5586))z12 and hide(z13=(83.5781,55.125))z13..hide(z14=(86.3633,55.9062))z14
+ --hide(z15=(91.4531,57.3359))z15--hide(z16=(90.2031,38.0469))z16..controls hide(z17=(89.5195,27.5078))z17 and hide(z18=(88.6602,18.2656))z18..hide(z19=(88.3125,17.6836))z19
+ ..controls hide(z20=(86.7109,15.0156))z20 and hide(z21=(91.2773,12.7227))z21..hide(z22=(100.387,11.6172))z22
+ --hide(z23=(110.746,10.3594))z23--hide(z24=(110.477,65.0195))z24--hide(z25=(110.211,119.676))z25
+ --hide(z26=(101.191,122.355))z26..controls hide(z27=(96.1875,123.844))z27 and hide(z28=(91.4531,125.035))z28..hide(z29=(90.5625,125.035))z29
+ ..controls hide(z30=(89.625,125.035))z30 and hide(z31=(89.4766,115.391))z31..hide(z32=(90.2031,101.992))z32
+ --hide(z33=(91.4531,78.9492))z33--hide(z34=(82.7031,77.5547))z34..controls hide(z35=(71.9844,75.8438))z35 and hide(z36=(45.9961,75.8281))z36..hide(z37=(36.9727,77.5273))z37
+ --hide(z38=(30.3633,78.7734))z38--hide(z39=(30.3633,99.1367))z39--hide(z40=(30.3633,119.5))z40
+ --hide(z41=(21.0742,122.266))z41..controls hide(z42=(15.8945,123.812))z42 and hide(z43=(11.3516,125.035))z43..hide(z44=(10.8047,125.035))z44
+ ..controls hide(z45=(10.2617,125.035))z45 and hide(z46=(9.82422,99.8516))z46..cycle;
+% renewcolore;
+ fill PreeditedPath1;
+% dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46);
+ PreeditedPath2 = hide(z47=(126.375,82.7031))z47..controls hide(z48=(126.719,59.3008))z48 and hide(z49=(127.871,37.457))z49..hide(z50=(128.941,34.1172))z50
+ ..controls hide(z51=(131.738,25.3555))z51 and hide(z52=(141.648,15.3555))z52..hide(z53=(152.367,10.4766))z53
+ ..controls hide(z54=(159.797,7.09375))z54 and hide(z55=(164.691,6.26562))z55..hide(z56=(176.836,6.32031))z56
+ ..controls hide(z57=(194.344,6.39844))z57 and hide(z58=(204.965,10.4414))z58..hide(z59=(215.602,21.0742))z59
+ ..controls hide(z60=(226.223,31.6953))z60 and hide(z61=(226.871,35.0078))z61..hide(z62=(227.145,80.0234))z62
+ --hide(z63=(227.391,120.57))z63--hide(z64=(220.422,121.91))z64..controls hide(z65=(216.672,122.633))z65 and hide(z66=(211.602,123.664))z66..hide(z67=(209.438,124.145))z67
+ --hide(z68=(205.418,125.035))z68--hide(z69=(205.418,84.668))z69..controls hide(z70=(205.418,37.1523))z70 and hide(z71=(204.617,33.9414))z71..hide(z72=(191.305,28.043))z72
+ ..controls hide(z73=(175.586,21.0781))z73 and hide(z74=(156.254,24.7109))z74..hide(z75=(150.438,35.7227))z75
+ ..controls hide(z76=(148.648,39.1133))z76 and hide(z77=(148.25,49.9258))z77..hide(z78=(148.793,80.6484))z78
+ --hide(z79=(149.508,121.105))z79--hide(z80=(139.684,122.355))z80..controls hide(z81=(134.324,123.039))z81 and hide(z82=(128.926,123.973))z82..hide(z83=(127.805,124.41))z83
+ ..controls hide(z84=(126.285,125.004))z84 and hide(z85=(125.914,114.141))z85..cycle;
+% renewcolore;
+ fill PreeditedPath2;
+% dotlabels.rt(47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85);
+ PreeditedPath3 = hide(z86=(241.305,122.18))z86..controls hide(z87=(243.297,119.777))z87 and hide(z88=(243.898,107.887))z88..hide(z89=(244.18,65.375))z89
+ ..controls hide(z90=(244.375,35.7227))z90 and hide(z91=(244.578,11.0898))z91..hide(z92=(244.625,10.4492))z92
+ ..controls hide(z93=(244.676,9.78906))z93 and hide(z94=(247.039,8.82031))z94..hide(z95=(250.074,8.21484))z95
+ ..controls hide(z96=(253.109,7.60938))z96 and hide(z97=(257.754,6.67969))z97..hide(z98=(260.793,6.07031))z98
+ --hide(z99=(266.152,5))z99--hide(z100=(266.152,26.6133))z100..controls hide(z101=(266.152,38.582))z101 and hide(z102=(266.707,48.2188))z102..hide(z103=(267.402,48.207))z103
+ ..controls hide(z104=(275.438,48.0781))z104 and hide(z105=(299.418,38.2695))z105..hide(z106=(306.164,32.3555))z106
+ ..controls hide(z107=(310.332,28.6953))z107 and hide(z108=(316.168,17.3242))z108..hide(z109=(316.168,12.8594))z109
+ ..controls hide(z110=(316.168,10.3594))z110 and hide(z111=(317.773,8.96484))z111..hide(z112=(321.523,8.21484))z112
+ ..controls hide(z113=(324.418,7.63672))z113 and hide(z114=(329.473,6.64844))z114..hide(z115=(332.512,6.07031))z115
+ --hide(z116=(338.137,5))z116--hide(z117=(337.016,13.2148))z117..controls hide(z118=(335.402,25.0039))z118 and hide(z119=(330.18,34.0078))z119..hide(z120=(319.023,44.2305))z120
+ --hide(z121=(309.199,53.2305))z121--hide(z122=(314.379,55.3711))z122..controls hide(z123=(321.926,58.4883))z123 and hide(z124=(333.449,71.6289))z124..hide(z125=(335.691,79.6641))z125
+ ..controls hide(z126=(339.273,92.5273))z126 and hide(z127=(338.176,101.074))z127..hide(z128=(332.043,108.066))z128
+ ..controls hide(z129=(324.508,116.656))z129 and hide(z130=(312.594,119.887))z130..hide(z131=(288.121,119.969))z131
+ ..controls hide(z132=(277.582,120.004))z132 and hide(z133=(263.32,121.176))z133..hide(z134=(256.684,122.547))z134
+ ..controls hide(z135=(240.07,125.984))z135 and hide(z136=(238.184,125.941))z136..cycle;
+% renewcolore;
+ fill PreeditedPath3;
+% dotlabels.rt(86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136);
+ PreeditedPath4 = hide(z137=(308.305,101.707))z137..controls hide(z138=(316.125,99.1367))z138 and hide(z139=(317.668,93.5977))z139..hide(z140=(313.555,82.8789))z140
+ ..controls hide(z141=(307.645,67.4766))z141 and hide(z142=(288.836,60.0312))z142..hide(z143=(272.762,66.7305))z143
+ --hide(z144=(266.152,69.4844))z144--hide(z145=(266.152,85.3828))z145..controls hide(z146=(266.152,94.1328))z146 and hide(z147=(266.551,101.672))z147..hide(z148=(267.043,102.156))z148
+ ..controls hide(z149=(268.93,104.012))z149 and hide(z150=(302.41,103.648))z150..cycle;
+% renewcolore;
+unfill PreeditedPath4;
+% dotlabels.rt(137,138,139,140,141,142,143,144,145,146,147,148,149,150);
+ PreeditedPath5 = hide(z151=(354.57,65.6445))z151--hide(z152=(354.57,7.14453))z152--hide(z153=(376.898,7.14453))z153
+ ..controls hide(z154=(401.727,7.14453))z154 and hide(z155=(412.688,9.31641))z155..hide(z156=(426.914,17.0547))z156
+ ..controls hide(z157=(438.168,23.1797))z157 and hide(z158=(445.777,31.6133))z158..hide(z159=(451.641,44.4766))z159
+ ..controls hide(z160=(466.125,76.2461))z160 and hide(z161=(444.777,112.316))z161..hide(z162=(406.73,120.355))z162
+ ..controls hide(z163=(399.598,121.859))z163 and hide(z164=(385.117,123.309))z164..hide(z165=(374.219,123.605))z165
+ --hide(z166=(354.57,124.145))z166--cycle;
+% renewcolore;
+fill PreeditedPath5;
+% dotlabels.rt(151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166);
+ PreeditedPath6 = hide(z167=(413.695,95.0625))z167..controls hide(z168=(428.523,87.418))z168 and hide(z169=(436.469,71.9844))z169..hide(z170=(433.215,57.1602))z170
+ ..controls hide(z171=(431.301,48.418))z171 and hide(z172=(419.41,36.4961))z172..hide(z173=(409.23,33.1016))z173
+ ..controls hide(z174=(399.941,30.0078))z174 and hide(z175=(383.602,28.1562))z175..hide(z176=(379.398,29.7227))z176
+ ..controls hide(z177=(377.191,30.5469))z177 and hide(z178=(376.766,36.6172))z178..hide(z179=(376.988,64.3047))z179
+ ..controls hide(z180=(377.137,82.7031))z180 and hide(z181=(377.793,98.4492))z181..hide(z182=(378.445,99.1367))z182
+ ..controls hide(z183=(381.016,101.84))z183 and hide(z184=(406.195,98.9297))z184..cycle;
+% renewcolore;
+unfill PreeditedPath6;
+% dotlabels.rt(167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184);
+
+ endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/thearchicon.mp b/graphics/metapost/contrib/macros/featpost/example/thearchicon.mp
new file mode 100644
index 0000000000..de262f7ddb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/thearchicon.mp
@@ -0,0 +1,59 @@
+% thearchicon.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+f := 0.8*(6,3,4);
+
+beginfig(1);
+ color tracecol, lockcol;
+ numeric altura, compri, radius, altfrac, comfrac, radang;
+ path theside, thefront, thelocka, thelockb, thelock;
+ color poi[];
+ numeric numpl, aux, i;
+ altura = 1;
+ compri = 2;
+ radius = 0.8;
+ altfrac = 0.2;
+ comfrac = 0.15;
+ radang = 37;
+ numpl = 9;
+ tracecol = blue;
+ lockcol = black;
+ currentpen := pencircle scaled 3mm;
+ drawoptions( withcolor tracecol );
+ rigorousdisc( 0, true, (-0.5compri,0,0), radius, (compri,0,0) );
+ poi1 = (0.5compri,-radius,0);
+ poi2 = (0.5compri,radius,0);
+ poi3 = (-0.5compri,radius,0);
+ poi4 = (0.5compri,-radius,-altura);
+ poi5 = (0.5compri,radius,-altura);
+ poi6 = (-0.5compri,radius,-altura);
+ theside = rp(poi1)--rp(poi2)--rp(poi5)--rp(poi4)--cycle;
+ thefront= rp(poi2)--rp(poi3)--rp(poi6)--rp(poi5)--cycle;
+ drawoptions( withcolor background );
+ fill theside;
+ fill thefront;
+ thelocka = rp((comfrac*compri,radius,-altfrac*altura))
+ --rp((comfrac*compri,radius,0));
+ thelockb = rp((-comfrac*compri,radius,-altfrac*altura))
+ --rp((-comfrac*compri,radius,0));
+ for i=1 upto numpl:
+ aux := i*radang/numpl;
+ poi7 := (comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ poi8 := (-comfrac*compri,radius*cosd(aux),radius*sind(aux));
+ thelocka := thelocka...rp(poi7);
+ thelockb := thelockb...rp(poi8);
+ endfor;
+ thelock = thelocka--reverse thelockb--cycle;
+ drawoptions( withcolor lockcol );
+ filldraw thelock;
+ drawoptions( withcolor tracecol );
+ draw theside;
+ draw thefront;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/thethreekindsofperspec.mp b/graphics/metapost/contrib/macros/featpost/example/thethreekindsofperspec.mp
new file mode 100644
index 0000000000..d49190f65e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/thethreekindsofperspec.mp
@@ -0,0 +1,195 @@
+% thethreekindsofperspec.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+% bash: export TEX=latex
+% tcsh: setenv TEX latex
+
+f := (4,2,2.5);
+Spread := 45;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+color psdf, psdu, psdv, rll, rlr, rur, rul, pll, plr, pur, pul;
+color pc;
+numeric projecplanesize, sizefraction, positfraction, aspectratio, rectsize;
+pen realpen, lightpen, projpen, dotpen;
+path projecplanepath, realpath;
+psdf = 3.1*(0,1,0.37);
+projecplanesize = 1.7;
+sizefraction = 0.19;
+positfraction = 0.65;
+aspectratio = 1.0;
+rectsize = 0.15;
+realpen = pencircle scaled 2.6pt;
+lightpen = pencircle scaled 0.55pt;
+projpen = pencircle scaled 1.8pt;
+dotpen = pencircle scaled 3.8pt;
+psdv = N( (-Y(psdf), X(psdf), 0) );
+psdu = ncrossprod( psdf, psdv );
+pll = projecplanesize*(-aspectratio*psdv-psdu);
+plr = projecplanesize*(+aspectratio*psdv-psdu);
+pur = projecplanesize*(+aspectratio*psdv+psdu);
+pul = projecplanesize*(-aspectratio*psdv+psdu);
+projecplanepath = rp(pll)--rp(plr)--rp(pur)--rp(pul)--cycle;
+pc = positfraction*psdf;
+rll = pc+sizefraction*projecplanesize*(-psdv-psdu);
+rlr = pc+sizefraction*projecplanesize*(+psdv-psdu);
+rur = pc+sizefraction*projecplanesize*(+psdv+psdu);
+rul = pc+sizefraction*projecplanesize*(-psdv+psdu);
+realpath = rp(rll)--rp(rlr)--rp(rur)--rp(rul)--cycle;
+
+beginfig(1);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ prll = rp(rll-pc);
+ prlr = rp(rlr-pc);
+ prur = rp(rur-pc);
+ prul = rp(rul-pc);
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(rll+(1-positfraction)*psdf) withpen lightpen;
+ draw prlr--rp(rlr+(1-positfraction)*psdf) withpen lightpen;
+ draw prur--rp(rur+(1-positfraction)*psdf) withpen lightpen;
+ draw prul--rp(rul+(1-positfraction)*psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+% label.bot( btex viewcentr etex, rp(black) );
+endfig;
+
+beginfig(2);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ drawoptions();
+ pair prll, prlr, prur, prul;
+ LightSource:=psdf;
+ prll = rp(projectpoint(black,rll));
+ prlr = rp(projectpoint(black,rlr));
+ prur = rp(projectpoint(black,rur));
+ prul = rp(projectpoint(black,rul));
+ path projpath;
+ projpath = prll--prlr--prur--prul--cycle;
+ draw projpath withpen projpen;
+ draw prll--rp(psdf) withpen lightpen;
+ draw prlr--rp(psdf) withpen lightpen;
+ draw prur--rp(psdf) withpen lightpen;
+ draw prul--rp(psdf) withpen lightpen;
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+ label.bot( btex viewcentr etex, rp(black) );
+endfig;
+
+beginfig(3);
+ draw projecplanepath withpen realpen;
+ draw realpath withpen realpen;
+ draw rp(psdf) withpen lightpen;
+ drawoptions( withpen lightpen );
+ squareangline( psdf, psdv, black, rectsize );
+ squareangline( psdf, psdu, black, rectsize );
+ numeric dist;
+ dist = conorm( psdf );
+ color ml, mt, mr, mb;
+ mb = 0.5[rll,rlr];
+ ml = 0.5[rll,rul];
+ mr = 0.5[rur,rlr];
+ mt = 0.5[rur,rul];
+ drawoptions( withpen projpen );
+ angline( rll, mb, psdf, dist, "", top );
+ angline( rll, ml, psdf, dist, "", top );
+ angline( rur, mt, psdf, dist, "", top );
+ angline( rur, mr, psdf, dist, "", top );
+ angline( mb, rlr, psdf, dist, "", top );
+ angline( ml, rul, psdf, dist, "", top );
+ angline( mr, rlr, psdf, dist, "", top );
+ angline( mt, rul, psdf, dist, "", top );
+ angline( black, mb, psdf, dist, "", top );
+ angline( black, ml, psdf, dist, "", top );
+ angline( black, mr, psdf, dist, "", top );
+ angline( black, mt, psdf, dist, "", top );
+ drawoptions();
+ numeric marc, darc, dmarc, ddarc;
+ marc = 0.01745*getangle(-psdf,mt-psdf)*dist;
+ darc = 0.01745*getangle(-psdf,rll-psdf)*dist*0.707;
+ color pro[], esf[], proc[], esfc[];
+ pro1 = darc*(-psdv-psdu);
+ pro2 = marc*(-psdu);
+ pro3 = darc*(+psdv-psdu);
+ pro4 = marc*(+psdv);
+ pro5 = darc*(+psdv+psdu);
+ pro6 = marc*(+psdu);
+ pro7 = darc*(-psdv+psdu);
+ pro8 = marc*(-psdv);
+ esf1 = psdf+dist*N(rll-psdf);
+ esf2 = psdf+dist*N(mb-psdf);
+ esf3 = psdf+dist*N(rlr-psdf);
+ esf4 = psdf+dist*N(mr-psdf);
+ esf5 = psdf+dist*N(rur-psdf);
+ esf6 = psdf+dist*N(mt-psdf);
+ esf7 = psdf+dist*N(rul-psdf);
+ esf8 = psdf+dist*N(ml-psdf);
+ ddarc = conorm(pro1-esf1)/3;
+ dmarc = conorm(pro2-esf2)/3;
+ proc1 = pro1+ddarc*N(psdf);
+ proc2 = pro2+dmarc*N(psdf);
+ proc3 = pro3+ddarc*N(psdf);
+ proc4 = pro4+dmarc*N(psdf);
+ proc5 = pro5+ddarc*N(psdf);
+ proc6 = pro6+dmarc*N(psdf);
+ proc7 = pro7+ddarc*N(psdf);
+ proc8 = pro8+dmarc*N(psdf);
+ esfc1 = esf1+ddarc*N(rll-psdf);
+ esfc2 = esf2+dmarc*N(mb-psdf);
+ esfc3 = esf3+ddarc*N(rlr-psdf);
+ esfc4 = esf4+dmarc*N(mr-psdf);
+ esfc5 = esf5+ddarc*N(rur-psdf);
+ esfc6 = esf6+dmarc*N(mt-psdf);
+ esfc7 = esf7+ddarc*N(rul-psdf);
+ esfc8 = esf8+dmarc*N(ml-psdf);
+ numeric i;
+ drawoptions( withpen lightpen );
+ for i=1 upto 8:
+ draw rp(esf[i])..controls rp(esfc[i]) and rp(proc[i])..rp(pro[i]);
+ draw rp(psdf)--rp(esf[i]);
+ endfor;
+ draw rp(pro2)--rp(pro6);
+ draw rp(pro4)--rp(pro8);
+ draw rp(mb)--rp(mt);
+ draw rp(ml)--rp(mr);
+ drawoptions( withpen projpen );
+ draw rp(pro1)...rp(pro2)..rp(pro3);
+ draw rp(pro3)...rp(pro4)..rp(pro5);
+ draw rp(pro5)...rp(pro6)..rp(pro7);
+ draw rp(pro7)...rp(pro8)..rp(pro1);
+ draw rp(black)--rp(psdf) withpen lightpen;
+ draw rp(black) withpen dotpen;
+ draw rp(psdf) withpen dotpen;
+ label.rt( btex f etex, rp(psdf) );
+% label.ulft( btex viewcentr etex, rp(black) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/thunderproblem.mp b/graphics/metapost/contrib/macros/featpost/example/thunderproblem.mp
new file mode 100644
index 0000000000..cd5ec29dbf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/thunderproblem.mp
@@ -0,0 +1,37 @@
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric u, dist, desv, rayf, aux;
+ u = 1cm;
+ dist = 2u;
+ desv = 1.5u;
+ rayf = 1.2;
+ ahangle := 30;
+ aux = (rayf-1.0)*u;
+ z1 = (dist,desv);
+ z2 = (dist,-0.5u);
+ z3 = (dist-aux,0.33*desv);
+ z4 = (dist-aux,0.67*desv);
+ drawdblarrow origin--(dist,0);
+ drawarrow subpath (1,2) of fullcircle scaled (rayf*u);
+ drawarrow z3--z4;
+ pickup pencircle scaled 2pt;
+ draw fullcircle scaled u;
+ pickup pencircle scaled 5pt;
+ draw z2--z1 withcolor 0.5white;
+ label.urt(btex $i_2$ etex, (0,0.5*rayf*u) );
+ label.llft(btex $i_1$ etex, z4 );
+ label.top(btex $l$ etex, (0.5*dist,0) );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/tiposdetrans.mp b/graphics/metapost/contrib/macros/featpost/example/tiposdetrans.mp
new file mode 100644
index 0000000000..c9db83e65a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tiposdetrans.mp
@@ -0,0 +1,71 @@
+% tiposdetransb.mp
+% L. Nobre G.
+% 2003
+
+input expressg;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture pi[];
+ numeric altura, lagura, unid, i, alt, lag, magura;
+ unid = 5mm;
+ altura = 7unid;
+ lagura = 14unid;
+ lag = 5.6unid;
+ smoothrad := 3unid;
+ alt = lag;
+ magura = 0.5*lagura;
+ pi1 = btex \shortstack{{\Huge U}\\ uniforme} etex;
+ pi2 = btex \shortstack{{\Huge H}\\ homog\'enea (0)} etex;
+ pi3 = btex \shortstack{{\Huge B}\\ bandas (1)} etex;
+ pi4 = btex \shortstack{{\Huge D}\\ defeitos} etex;
+ pi5 = btex \shortstack{{\Huge P}\\ paredes} etex;
+ pi6 = btex \shortstack{{\Huge O}\\ outra (2)} etex;
+ z1 = ( -lagura, altura );
+ z2 = ( lagura, altura );
+ z3 = ( -magura, 0 );
+ z4 = ( magura, 0 );
+ z5 = ( 0, -altura );
+ z6 = ( -lagura, -altura );
+ pickup thickpen;
+ drawPREF( 1, lag, alt )( pi1 );
+ drawPREF( 2, lag, alt )( pi2 );
+ drawPREF( 3, lag, alt )( pi3 );
+ drawPREF( 4, lag, alt )( pi4 );
+ drawPREF( 5, lag, alt )( pi5 );
+ drawPREF( 6, lag, alt )( pi6 );
+ z8 = ( xpart z1c, ypart z3c );
+ z9 = ( xpart z2c, ypart z4c );
+ z7 = ( xpart z3c, ypart z2c );
+ z10= ( xpart z3c, ypart z5c );
+ z11= ( xpart z4c, ypart z5c );
+ drawnormalthree( 1bm, 8, 3ml );
+ drawnormalthree( 3tm, 7, 2ml );
+ drawnormalthree( 4mr, 9, 2bm );
+ drawnormalthree( 3bm, 10,5ml );
+ drawnormalthree( 5mr, 11,4bm );
+ smooth( 1bm, 8, 3ml );
+ smooth( 3tm, 7, 2ml );
+ smooth( 4mr, 9, 2bm );
+ smooth( 3bm, 10,5ml );
+ smooth( 5mr, 11,4bm );
+ drawnormalOA( 1mr, 2ml );
+ drawnormalOA( 3mr, 4ml );
+ drawnormalOA( 1bm, 6tm );
+ drawOA( 8, 3ml );
+ drawOA( 7, 2ml );
+ drawOA( 9, 2bm );
+ drawOA( 10,5ml );
+ drawOA( 11,4bm );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/tiposdetransb.mp b/graphics/metapost/contrib/macros/featpost/example/tiposdetransb.mp
new file mode 100644
index 0000000000..f91f603ac5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tiposdetransb.mp
@@ -0,0 +1,57 @@
+% tiposdetransb.mp
+% L. Nobre G.
+% 2003
+
+input expressg;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture pi[];
+ numeric altura, lagura, unid, i, alt, lag, magura, RaD;
+ unid = 5mm;
+ altura = 7unid;
+ lagura = 14unid;
+ lag = 5.6unid;
+ smoothrad := 3unid;
+ alt = lag;
+ RaD = lag;
+ magura = 0.5*lagura;
+ pi1 = btex \shortstack{{\Huge U}\\ uniforme} etex;
+ pi2 = btex \shortstack{{\Huge H}\\ homog\'enea (0)} etex;
+ pi3 = btex \shortstack{{\Huge B}\\ bandas (1)} etex;
+ pi4 = btex \shortstack{{\Huge D}\\ defeitos} etex;
+ pi5 = btex \shortstack{{\Huge P}\\ paredes} etex;
+ pi6 = btex \shortstack{{\Huge O}\\ outra (2)} etex;
+ z1 = ( -lagura, altura );
+ z2 = ( lagura, altura );
+ z3 = ( -magura, 0 );
+ z4 = ( magura, 0 );
+ z5 = ( 0, -altura );
+ z6 = ( -lagura, -altura );
+ pickup thickpen;
+ drawcirclebox( 1, RaD )( pi1 );
+ drawcirclebox( 2, RaD )( pi2 );
+ drawcirclebox( 3, RaD )( pi3 );
+ drawcirclebox( 4, RaD )( pi4 );
+ drawcirclebox( 5, RaD )( pi5 );
+ drawcirclebox( 6, RaD )( pi6 );
+ drawnormalOA( 1br, 3tl );
+ drawnormalOA( 3tr, 2ml );
+ drawnormalOA( 4tr, 2bl );
+ drawnormalOA( 3br, 5tl );
+ drawnormalOA( 5tr, 4bl );
+ drawnormalOA( 1mr, 2ml );
+ drawnormalOA( 3mr, 4ml );
+ drawnormalOA( 1bm, 6tm );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/tiposdetranst.mp b/graphics/metapost/contrib/macros/featpost/example/tiposdetranst.mp
new file mode 100644
index 0000000000..d8225a66bb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tiposdetranst.mp
@@ -0,0 +1,43 @@
+% tiposdetranst.mp
+% L. Nobre G.
+% 2003
+
+input expressg;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+
+beginfig(1);
+ picture pi[];
+ numeric altura, lagura, unid, i, alt, lag, magura, RaD;
+ unid = 5mm;
+ altura = 7unid;
+ lagura = 14unid;
+ lag = 5.6unid;
+ smoothrad := 3unid;
+ alt = lag;
+ RaD = lag;
+ magura = 0.5lagura;
+ pi1 = btex \shortstack{{\Huge U}\\ uniforme} etex;
+ pi2 = btex \shortstack{{\Huge H}\\ homog\'enea} etex;
+ pi3 = btex \shortstack{{\Huge B}\\ bandas} etex;
+ z1 = ( -magura, altura );
+ z2 = ( magura, altura );
+ z3 = ( 0, 0 );
+ pickup thickpen;
+ drawcirclebox( 1, RaD )( pi1 );
+ drawcirclebox( 2, RaD )( pi2 );
+ drawcirclebox( 3, RaD )( pi3 );
+ drawnormalOA( 1br, 3tl );
+ drawnormalOA( 3tr, 2bl );
+ drawnormalOA( 1mr, 2ml );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/toro4transit.mp b/graphics/metapost/contrib/macros/featpost/example/toro4transit.mp
new file mode 100644
index 0000000000..cd39a6e9d5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/toro4transit.mp
@@ -0,0 +1,202 @@
+%GNUPLOT Metapost output: Tue Jun 26 16:09:32 2012
+
+prologues:=1;
+
+warningcheck:=0;
+defaultmpt:=mpt:=4;
+th:=.6;
+%% Have nice sharp joins on our lines
+linecap:=butt;
+linejoin:=mitered;
+
+def scalepen expr n = pickup pencircle scaled (n*th) enddef;
+def ptsize expr n = mpt:=n*defaultmpt enddef;
+
+color currentcolor; currentcolor:=black;
+color fillcolor;
+boolean colorlines,dashedlines;
+colorlines:=false;
+dashedlines:=false;
+
+def _wc = withpen currentpen withcolor currentcolor enddef;
+
+def linetype expr n =
+ currentcolor:= if colorlines : col[n] else: black fi;
+ if n = -1 :
+ drawoptions(withcolor currentcolor withpen (currentpen scaled .5));
+ else :
+ drawoptions(_wc);
+ fi
+enddef;
+
+beginfig(1);
+ w:=5.000in;
+ h:=3.000in;
+ a:=w/1200.0;
+ b:=h/720.0;
+ scalepen 1;
+ ptsize 1.000;
+ linetype 0;
+ draw (729.8a,485.8b)--(721.8a,485.3b)--(714.0a,483.9b)--(706.4a,481.6b)--(699.0a,478.6b)
+ --(692.1a,474.9b)--(685.5a,470.6b)--(679.4a,466.0b)--(673.5a,461.1b)--(668.0a,456.1b)
+ --(662.8a,451.0b)--(657.7a,446.0b)--(652.6a,441.0b)--(647.6a,435.9b)--(642.6a,430.9b)
+ --(637.5a,425.7b)--(632.5a,420.4b)--(627.5a,414.8b)--(622.6a,408.9b)--(618.1a,402.7b)
+ --(614.0a,396.0b)--(610.4a,389.0b)--(607.5a,381.6b)--(605.5a,373.9b)--(604.3a,366.0b)
+ --(604.0a,358.0b)--(604.8a,350.1b)--(606.4a,342.3b)--(608.9a,334.7b)--(612.1a,327.5b)
+ --(616.0a,320.6b)--(620.3a,314.1b)--(625.0a,308.1b)--(629.9a,302.3b)--(635.0a,296.9b)
+ --(640.0a,291.7b)--(645.1a,286.6b)--(650.1a,281.6b)--(655.1a,276.5b)--(660.2a,271.5b)
+ --(665.4a,266.4b)--(670.8a,261.4b)--(676.4a,256.4b)--(682.4a,251.7b)--(688.8a,247.2b)
+ --(695.5a,243.2b)--(702.7a,239.8b)--(710.1a,237.1b)--(717.9a,235.3b)--(725.8a,234.3b)
+ --(733.8a,234.3b)--(741.7a,235.3b)--(749.5a,237.1b)--(756.9a,239.8b)--(764.1a,243.2b)
+ --(770.8a,247.2b)--(777.2a,251.7b)--(783.2a,256.4b)--(788.8a,261.4b)--(794.2a,266.4b)
+ --(799.4a,271.5b)--(804.5a,276.5b)--(809.5a,281.6b)--(814.5a,286.6b)--(819.6a,291.7b)
+ --(824.6a,296.9b)--(829.7a,302.3b)--(834.6a,308.1b)--(839.3a,314.1b)--(843.6a,320.6b)
+ --(847.5a,327.5b)--(850.7a,334.7b)--(853.2a,342.3b)--(854.8a,350.1b)--(855.6a,358.0b)
+ --(855.3a,366.0b)--(854.1a,373.9b)--(852.1a,381.6b)--(849.2a,389.0b)--(845.6a,396.0b)
+ --(841.5a,402.7b)--(837.0a,408.9b)--(832.1a,414.8b)--(827.1a,420.4b)--(822.1a,425.7b)
+ --(817.0a,430.9b)--(812.0a,435.9b)--(807.0a,441.0b)--(801.9a,446.0b)--(796.8a,451.0b)
+ --(791.6a,456.1b)--(786.1a,461.1b)--(780.2a,466.0b)--(774.1a,470.6b)--(767.5a,474.9b)
+ --(760.6a,478.6b)--(753.2a,481.6b)--(745.6a,483.9b)--(737.8a,485.3b)--(729.8a,485.8b);
+ draw (729.8a,382.7b)--(728.3a,382.9b)--(726.8a,383.4b)--(725.1a,384.2b)--(723.3a,385.2b)
+ --(721.2a,386.2b)--(718.9a,387.3b)--(716.4a,388.1b)--(713.9a,388.7b)--(711.3a,388.8b)
+ --(708.8a,388.6b)--(706.5a,387.8b)--(704.5a,386.5b)--(702.9a,384.8b)--(701.8a,382.8b)
+ --(701.1a,380.4b)--(701.0a,377.9b)--(701.2a,375.3b)--(701.9a,372.8b)--(702.8a,370.3b)
+ --(703.8a,368.1b)--(704.9a,366.0b)--(705.8a,364.2b)--(706.6a,362.6b)--(707.0a,361.1b)
+ --(707.1a,359.6b)--(706.8a,358.2b)--(706.2a,356.6b)--(705.4a,354.9b)--(704.4a,353.0b)
+ --(703.3a,350.8b)--(702.3a,348.5b)--(701.5a,346.0b)--(701.1a,343.4b)--(701.0a,340.8b)
+ --(701.4a,338.4b)--(702.3a,336.2b)--(703.7a,334.3b)--(705.5a,332.8b)--(707.6a,331.8b)
+ --(710.0a,331.2b)--(712.6a,331.2b)--(715.1a,331.6b)--(717.7a,332.3b)--(720.1a,333.2b)
+ --(722.3a,334.3b)--(724.2a,335.3b)--(726.0a,336.2b)--(727.6a,336.9b)--(729.1a,337.2b)
+ --(730.5a,337.2b)--(732.0a,336.9b)--(733.6a,336.2b)--(735.4a,335.3b)--(737.3a,334.3b)
+ --(739.5a,333.2b)--(741.9a,332.3b)--(744.5a,331.6b)--(747.0a,331.2b)--(749.6a,331.2b)
+ --(752.0a,331.8b)--(754.1a,332.8b)--(755.9a,334.3b)--(757.3a,336.2b)--(758.2a,338.4b)
+ --(758.6a,340.8b)--(758.5a,343.4b)--(758.1a,346.0b)--(757.3a,348.5b)--(756.3a,350.8b)
+ --(755.2a,353.0b)--(754.2a,354.9b)--(753.4a,356.6b)--(752.8a,358.2b)--(752.5a,359.6b)
+ --(752.6a,361.1b)--(753.0a,362.6b)--(753.8a,364.2b)--(754.7a,366.0b)--(755.8a,368.1b)
+ --(756.8a,370.3b)--(757.7a,372.8b)--(758.4a,375.3b)--(758.6a,377.9b)--(758.5a,380.4b)
+ --(757.8a,382.8b)--(756.7a,384.8b)--(755.1a,386.5b)--(753.1a,387.8b)--(750.8a,388.6b)
+ --(748.3a,388.8b)--(745.7a,388.7b)--(743.2a,388.1b)--(740.7a,387.3b)--(738.4a,386.2b)
+ --(736.3a,385.2b)--(734.5a,384.2b)--(732.8a,383.4b)--(731.3a,382.9b)--(729.8a,382.7b);
+ draw (600.0a,680.6b)--(592.0a,680.1b)--(584.2a,678.7b)--(576.6a,676.4b)--(569.2a,673.4b)
+ --(562.3a,669.6b)--(555.7a,665.4b)--(549.6a,660.8b)--(543.7a,655.9b)--(538.2a,650.9b)
+ --(533.0a,645.8b)--(527.9a,640.8b)--(522.8a,635.7b)--(517.8a,630.7b)--(512.8a,625.7b)
+ --(507.7a,620.5b)--(502.7a,615.2b)--(497.7a,609.6b)--(492.8a,603.7b)--(488.3a,597.5b)
+ --(484.2a,590.8b)--(480.6a,583.7b)--(477.7a,576.3b)--(475.7a,568.6b)--(474.5a,560.8b)
+ --(474.2a,552.8b)--(475.0a,544.8b)--(476.6a,537.0b)--(479.1a,529.5b)--(482.3a,522.2b)
+ --(486.2a,515.4b)--(490.5a,508.9b)--(495.2a,502.8b)--(500.1a,497.1b)--(505.2a,491.7b)
+ --(510.2a,486.5b)--(515.3a,481.4b)--(520.3a,476.3b)--(525.3a,471.3b)--(530.4a,466.3b)
+ --(535.6a,461.2b)--(541.0a,456.2b)--(546.6a,451.2b)--(552.6a,446.4b)--(559.0a,442.0b)
+ --(565.7a,438.0b)--(572.9a,434.6b)--(580.3a,431.9b)--(588.1a,430.0b)--(596.0a,429.1b)
+ --(604.0a,429.1b)--(611.9a,430.0b)--(619.7a,431.9b)--(627.1a,434.6b)--(634.3a,438.0b)
+ --(641.0a,442.0b)--(647.4a,446.4b)--(653.4a,451.2b)--(659.0a,456.2b)--(664.4a,461.2b)
+ --(669.6a,466.3b)--(674.7a,471.3b)--(679.7a,476.3b)--(684.7a,481.4b)--(689.8a,486.5b)
+ --(694.8a,491.7b)--(699.9a,497.1b)--(704.8a,502.8b)--(709.5a,508.9b)--(713.8a,515.4b)
+ --(717.7a,522.2b)--(720.9a,529.5b)--(723.4a,537.0b)--(725.0a,544.8b)--(725.8a,552.8b)
+ --(725.5a,560.8b)--(724.3a,568.6b)--(722.3a,576.3b)--(719.4a,583.7b)--(715.8a,590.8b)
+ --(711.7a,597.5b)--(707.2a,603.7b)--(702.3a,609.6b)--(697.3a,615.2b)--(692.3a,620.5b)
+ --(687.2a,625.7b)--(682.2a,630.7b)--(677.2a,635.7b)--(672.1a,640.8b)--(667.0a,645.8b)
+ --(661.8a,650.9b)--(656.3a,655.9b)--(650.4a,660.8b)--(644.3a,665.4b)--(637.7a,669.6b)
+ --(630.8a,673.4b)--(623.4a,676.4b)--(615.8a,678.7b)--(608.0a,680.1b)--(600.0a,680.6b);
+ draw (600.0a,577.5b)--(598.5a,577.7b)--(597.0a,578.2b)--(595.3a,579.0b)--(593.5a,580.0b)
+ --(591.4a,581.0b)--(589.1a,582.0b)--(586.6a,582.9b)--(584.1a,583.4b)--(581.5a,583.6b)
+ --(579.0a,583.3b)--(576.7a,582.6b)--(574.7a,581.3b)--(573.1a,579.6b)--(572.0a,577.5b)
+ --(571.3a,575.2b)--(571.2a,572.7b)--(571.4a,570.1b)--(572.1a,567.5b)--(573.0a,565.1b)
+ --(574.0a,562.9b)--(575.1a,560.8b)--(576.0a,559.0b)--(576.8a,557.4b)--(577.2a,555.9b)
+ --(577.3a,554.4b)--(577.0a,553.0b)--(576.4a,551.4b)--(575.6a,549.7b)--(574.6a,547.7b)
+ --(573.5a,545.6b)--(572.5a,543.3b)--(571.7a,540.8b)--(571.3a,538.2b)--(571.2a,535.6b)
+ --(571.6a,533.2b)--(572.5a,530.9b)--(573.9a,529.0b)--(575.7a,527.6b)--(577.8a,526.5b)
+ --(580.2a,526.0b)--(582.8a,526.0b)--(585.3a,526.3b)--(587.9a,527.1b)--(590.3a,528.0b)
+ --(592.5a,529.1b)--(594.4a,530.1b)--(596.2a,531.0b)--(597.8a,531.7b)--(599.3a,532.0b)
+ --(600.7a,532.0b)--(602.2a,531.7b)--(603.8a,531.0b)--(605.6a,530.1b)--(607.5a,529.1b)
+ --(609.7a,528.0b)--(612.1a,527.1b)--(614.7a,526.3b)--(617.2a,526.0b)--(619.8a,526.0b)
+ --(622.2a,526.5b)--(624.3a,527.6b)--(626.1a,529.0b)--(627.5a,530.9b)--(628.4a,533.2b)
+ --(628.8a,535.6b)--(628.7a,538.2b)--(628.3a,540.8b)--(627.5a,543.3b)--(626.5a,545.6b)
+ --(625.4a,547.7b)--(624.4a,549.7b)--(623.6a,551.4b)--(623.0a,553.0b)--(622.7a,554.4b)
+ --(622.8a,555.9b)--(623.2a,557.4b)--(624.0a,559.0b)--(624.9a,560.8b)--(626.0a,562.9b)
+ --(627.0a,565.1b)--(627.9a,567.5b)--(628.6a,570.1b)--(628.8a,572.7b)--(628.7a,575.2b)
+ --(628.0a,577.5b)--(626.9a,579.6b)--(625.3a,581.3b)--(623.3a,582.6b)--(621.0a,583.3b)
+ --(618.5a,583.6b)--(615.9a,583.4b)--(613.4a,582.9b)--(610.9a,582.0b)--(608.6a,581.0b)
+ --(606.5a,580.0b)--(604.7a,579.0b)--(603.0a,578.2b)--(601.5a,577.7b)--(600.0a,577.5b);
+ draw (600.0a,291.0b)--(592.0a,290.5b)--(584.2a,289.1b)--(576.6a,286.9b)--(569.2a,283.8b)
+ --(562.3a,280.1b)--(555.7a,275.8b)--(549.6a,271.2b)--(543.7a,266.3b)--(538.2a,261.3b)
+ --(533.0a,256.3b)--(527.9a,251.2b)--(522.8a,246.2b)--(517.8a,241.2b)--(512.8a,236.1b)
+ --(507.7a,231.0b)--(502.7a,225.6b)--(497.7a,220.1b)--(492.8a,214.2b)--(488.3a,207.9b)
+ --(484.2a,201.2b)--(480.6a,194.2b)--(477.7a,186.8b)--(475.7a,179.1b)--(474.5a,171.2b)
+ --(474.2a,163.2b)--(475.0a,155.3b)--(476.6a,147.5b)--(479.1a,139.9b)--(482.3a,132.7b)
+ --(486.2a,125.8b)--(490.5a,119.4b)--(495.2a,113.3b)--(500.1a,107.6b)--(505.2a,102.1b)
+ --(510.2a,96.9b)--(515.3a,91.8b)--(520.3a,86.8b)--(525.3a,81.8b)--(530.4a,76.7b)
+ --(535.6a,71.6b)--(541.0a,66.6b)--(546.6a,61.6b)--(552.6a,56.9b)--(559.0a,52.4b)
+ --(565.7a,48.4b)--(572.9a,45.0b)--(580.3a,42.3b)--(588.1a,40.5b)--(596.0a,39.5b)
+ --(604.0a,39.5b)--(611.9a,40.5b)--(619.7a,42.3b)--(627.1a,45.0b)--(634.3a,48.4b)
+ --(641.0a,52.4b)--(647.4a,56.9b)--(653.4a,61.6b)--(659.0a,66.6b)--(664.4a,71.6b)
+ --(669.6a,76.7b)--(674.7a,81.8b)--(679.7a,86.8b)--(684.7a,91.8b)--(689.8a,96.9b)
+ --(694.8a,102.1b)--(699.9a,107.6b)--(704.8a,113.3b)--(709.5a,119.4b)--(713.8a,125.8b)
+ --(717.7a,132.7b)--(720.9a,139.9b)--(723.4a,147.5b)--(725.0a,155.3b)--(725.8a,163.2b)
+ --(725.5a,171.2b)--(724.3a,179.1b)--(722.3a,186.8b)--(719.4a,194.2b)--(715.8a,201.2b)
+ --(711.7a,207.9b)--(707.2a,214.2b)--(702.3a,220.1b)--(697.3a,225.6b)--(692.3a,231.0b)
+ --(687.2a,236.1b)--(682.2a,241.2b)--(677.2a,246.2b)--(672.1a,251.2b)--(667.0a,256.3b)
+ --(661.8a,261.3b)--(656.3a,266.3b)--(650.4a,271.2b)--(644.3a,275.8b)--(637.7a,280.1b)
+ --(630.8a,283.8b)--(623.4a,286.9b)--(615.8a,289.1b)--(608.0a,290.5b)--(600.0a,291.0b);
+ draw (600.0a,187.9b)--(598.5a,188.1b)--(597.0a,188.6b)--(595.3a,189.4b)--(593.5a,190.4b)
+ --(591.4a,191.5b)--(589.1a,192.5b)--(586.6a,193.3b)--(584.1a,193.9b)--(581.5a,194.1b)
+ --(579.0a,193.8b)--(576.7a,193.0b)--(574.7a,191.8b)--(573.1a,190.1b)--(572.0a,188.0b)
+ --(571.3a,185.6b)--(571.2a,183.1b)--(571.4a,180.5b)--(572.1a,178.0b)--(573.0a,175.5b)
+ --(574.0a,173.3b)--(575.1a,171.3b)--(576.0a,169.4b)--(576.8a,167.8b)--(577.2a,166.3b)
+ --(577.3a,164.9b)--(577.0a,163.4b)--(576.4a,161.8b)--(575.6a,160.1b)--(574.6a,158.2b)
+ --(573.5a,156.0b)--(572.5a,153.7b)--(571.7a,151.2b)--(571.3a,148.6b)--(571.2a,146.1b)
+ --(571.6a,143.6b)--(572.5a,141.4b)--(573.9a,139.5b)--(575.7a,138.0b)--(577.8a,137.0b)
+ --(580.2a,136.5b)--(582.8a,136.4b)--(585.3a,136.8b)--(587.9a,137.5b)--(590.3a,138.4b)
+ --(592.5a,139.5b)--(594.4a,140.5b)--(596.2a,141.4b)--(597.8a,142.1b)--(599.3a,142.5b)
+ --(600.7a,142.5b)--(602.2a,142.1b)--(603.8a,141.4b)--(605.6a,140.5b)--(607.5a,139.5b)
+ --(609.7a,138.4b)--(612.1a,137.5b)--(614.7a,136.8b)--(617.2a,136.4b)--(619.8a,136.5b)
+ --(622.2a,137.0b)--(624.3a,138.0b)--(626.1a,139.5b)--(627.5a,141.4b)--(628.4a,143.6b)
+ --(628.8a,146.1b)--(628.7a,148.6b)--(628.3a,151.2b)--(627.5a,153.7b)--(626.5a,156.0b)
+ --(625.4a,158.2b)--(624.4a,160.1b)--(623.6a,161.8b)--(623.0a,163.4b)--(622.7a,164.9b)
+ --(622.8a,166.3b)--(623.2a,167.8b)--(624.0a,169.4b)--(624.9a,171.3b)--(626.0a,173.3b)
+ --(627.0a,175.5b)--(627.9a,178.0b)--(628.6a,180.5b)--(628.8a,183.1b)--(628.7a,185.6b)
+ --(628.0a,188.0b)--(626.9a,190.1b)--(625.3a,191.8b)--(623.3a,193.0b)--(621.0a,193.8b)
+ --(618.5a,194.1b)--(615.9a,193.9b)--(613.4a,193.3b)--(610.9a,192.5b)--(608.6a,191.5b)
+ --(606.5a,190.4b)--(604.7a,189.4b)--(603.0a,188.6b)--(601.5a,188.1b)--(600.0a,187.9b);
+ draw (470.2a,485.8b)--(462.2a,485.3b)--(454.4a,483.9b)--(446.8a,481.6b)--(439.4a,478.6b)
+ --(432.5a,474.9b)--(425.9a,470.6b)--(419.8a,466.0b)--(413.9a,461.1b)--(408.4a,456.1b)
+ --(403.2a,451.0b)--(398.1a,446.0b)--(393.0a,441.0b)--(388.0a,435.9b)--(383.0a,430.9b)
+ --(377.9a,425.7b)--(372.9a,420.4b)--(367.9a,414.8b)--(363.0a,408.9b)--(358.5a,402.7b)
+ --(354.4a,396.0b)--(350.8a,389.0b)--(347.9a,381.6b)--(345.9a,373.9b)--(344.7a,366.0b)
+ --(344.4a,358.0b)--(345.2a,350.1b)--(346.8a,342.3b)--(349.3a,334.7b)--(352.5a,327.5b)
+ --(356.4a,320.6b)--(360.7a,314.1b)--(365.4a,308.1b)--(370.3a,302.3b)--(375.4a,296.9b)
+ --(380.4a,291.7b)--(385.5a,286.6b)--(390.5a,281.6b)--(395.5a,276.5b)--(400.6a,271.5b)
+ --(405.8a,266.4b)--(411.2a,261.4b)--(416.8a,256.4b)--(422.8a,251.7b)--(429.2a,247.2b)
+ --(435.9a,243.2b)--(443.1a,239.8b)--(450.5a,237.1b)--(458.3a,235.3b)--(466.2a,234.3b)
+ --(474.2a,234.3b)--(482.1a,235.3b)--(489.9a,237.1b)--(497.3a,239.8b)--(504.5a,243.2b)
+ --(511.2a,247.2b)--(517.6a,251.7b)--(523.6a,256.4b)--(529.2a,261.4b)--(534.6a,266.4b)
+ --(539.8a,271.5b)--(544.9a,276.5b)--(549.9a,281.6b)--(554.9a,286.6b)--(560.0a,291.7b)
+ --(565.0a,296.9b)--(570.1a,302.3b)--(575.0a,308.1b)--(579.7a,314.1b)--(584.0a,320.6b)
+ --(587.9a,327.5b)--(591.1a,334.7b)--(593.6a,342.3b)--(595.2a,350.1b)--(596.0a,358.0b)
+ --(595.7a,366.0b)--(594.5a,373.9b)--(592.5a,381.6b)--(589.6a,389.0b)--(586.0a,396.0b)
+ --(581.9a,402.7b)--(577.4a,408.9b)--(572.5a,414.8b)--(567.5a,420.4b)--(562.5a,425.7b)
+ --(557.4a,430.9b)--(552.4a,435.9b)--(547.4a,441.0b)--(542.3a,446.0b)--(537.2a,451.0b)
+ --(532.0a,456.1b)--(526.5a,461.1b)--(520.6a,466.0b)--(514.5a,470.6b)--(507.9a,474.9b)
+ --(501.0a,478.6b)--(493.6a,481.6b)--(486.0a,483.9b)--(478.2a,485.3b)--(470.2a,485.8b);
+ draw (470.2a,382.7b)--(468.7a,382.9b)--(467.2a,383.4b)--(465.5a,384.2b)--(463.7a,385.2b)
+ --(461.6a,386.2b)--(459.3a,387.3b)--(456.8a,388.1b)--(454.3a,388.7b)--(451.7a,388.8b)
+ --(449.2a,388.6b)--(446.9a,387.8b)--(444.9a,386.5b)--(443.3a,384.8b)--(442.2a,382.8b)
+ --(441.5a,380.4b)--(441.4a,377.9b)--(441.6a,375.3b)--(442.3a,372.8b)--(443.2a,370.3b)
+ --(444.2a,368.1b)--(445.3a,366.0b)--(446.2a,364.2b)--(447.0a,362.6b)--(447.4a,361.1b)
+ --(447.5a,359.6b)--(447.2a,358.2b)--(446.6a,356.6b)--(445.8a,354.9b)--(444.8a,353.0b)
+ --(443.7a,350.8b)--(442.7a,348.5b)--(441.9a,346.0b)--(441.5a,343.4b)--(441.4a,340.8b)
+ --(441.8a,338.4b)--(442.7a,336.2b)--(444.1a,334.3b)--(445.9a,332.8b)--(448.0a,331.8b)
+ --(450.4a,331.2b)--(453.0a,331.2b)--(455.5a,331.6b)--(458.1a,332.3b)--(460.5a,333.2b)
+ --(462.7a,334.3b)--(464.6a,335.3b)--(466.4a,336.2b)--(468.0a,336.9b)--(469.5a,337.2b)
+ --(470.9a,337.2b)--(472.4a,336.9b)--(474.0a,336.2b)--(475.8a,335.3b)--(477.7a,334.3b)
+ --(479.9a,333.2b)--(482.3a,332.3b)--(484.9a,331.6b)--(487.4a,331.2b)--(490.0a,331.2b)
+ --(492.4a,331.8b)--(494.5a,332.8b)--(496.3a,334.3b)--(497.7a,336.2b)--(498.6a,338.4b)
+ --(499.0a,340.8b)--(498.9a,343.4b)--(498.5a,346.0b)--(497.7a,348.5b)--(496.7a,350.8b)
+ --(495.6a,353.0b)--(494.6a,354.9b)--(493.8a,356.6b)--(493.2a,358.2b)--(492.9a,359.6b)
+ --(493.0a,361.1b)--(493.4a,362.6b)--(494.2a,364.2b)--(495.1a,366.0b)--(496.2a,368.1b)
+ --(497.2a,370.3b)--(498.1a,372.8b)--(498.8a,375.3b)--(499.0a,377.9b)--(498.9a,380.4b)
+ --(498.2a,382.8b)--(497.1a,384.8b)--(495.5a,386.5b)--(493.5a,387.8b)--(491.2a,388.6b)
+ --(488.7a,388.8b)--(486.1a,388.7b)--(483.6a,388.1b)--(481.1a,387.3b)--(478.8a,386.2b)
+ --(476.7a,385.2b)--(474.9a,384.2b)--(473.2a,383.4b)--(471.7a,382.9b)--(470.2a,382.7b);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/torus.mp b/graphics/metapost/contrib/macros/featpost/example/torus.mp
new file mode 100644
index 0000000000..bc0f99cc74
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/torus.mp
@@ -0,0 +1,323 @@
+% torus.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+% Draw a torus with NP dots, a section of 3.14*RS^2
+% and a total diameter of 2*(RB+RS). The dots are placed
+% on a single closed line that turns around the $z$ axis
+% NB times and around the section NS times.
+% figure(1) exemplifies the use of signalvertex.
+
+def flask( expr TheVal ) =
+ begingroup
+ numeric RB, RS, RP, NB, NS, NM, phi, theta, first, second, third;
+ RB=1;
+ RS=0.3;
+ RP=0.02;
+ NB=8;
+ NS=5;
+ NM=4;
+ theta=360*NB*TheVal;
+ phi=360*NS*TheVal;
+ first =(RB+(RS+RP*sind(NM*theta))*cosd(phi))*cosd(theta);
+ second=(RB+(RS+RP*sind(NM*theta))*cosd(phi))*sind(theta);
+ third = (RS+RP*sind(NM*theta))*sind(phi);
+ ( (first,second,third) )
+ endgroup
+enddef;
+
+def blask( expr TheVal ) =
+ begingroup
+ numeric RB, RS, NB, NS, phi, theta, first, second, third;
+ RB=1;
+ RS=0.1;
+ NB=1;
+ NS=24;
+ theta=360*NB*TheVal;
+ phi=360*NS*TheVal;
+ first =(RB+RS*cosd(phi))*cosd(theta);
+ second=(RB+RS*cosd(phi))*sind(theta);
+ third = RS*sind(phi);
+ ( (first,second,third) )
+ endgroup
+enddef;
+
+beginfig(5);
+ Spread := 200;
+ numeric NP, i, varfrac;
+ path cl;
+ string comm;
+ pen bip, sp;
+ varfrac = 1.25;
+ bip = pencircle scaled 15pt;
+ sp = pencircle scaled 9pt;
+ NP=600;
+ cl = for i=1 upto NP: rp(flask(i/NP)).. endfor cycle;
+ draw cl;
+ for i=1 upto NP:
+ comm:="draw subpath ("
+ & decimal(i-0.5)
+ & ","
+ & decimal(i+0.5)
+ & ") of cl withpen bip; undraw subpath ("
+ & decimal(i-varfrac)
+ & ","
+ & decimal(i+varfrac)
+ & ") of cl withpen sp;";
+ getready( comm, flask( i/NP ) );
+ endfor;
+ closedline( true, 300, 0.5, 1 )( blask );
+ doitnow;
+endfig;
+
+beginfig(4);
+ f := (16,2,3.8);
+ Spread:=40;
+ pickup pencircle scaled 3pt;
+ smoothtorus( black-3*blue, blue, 4, 1 );
+ smoothtorus( black, blue, 4, 1 );
+ smoothtorus( black+3*blue, blue, 4, 1 );
+endfig;
+
+beginfig(3);
+ Spread := 100;
+ f := (7,3,9);
+ HoriZon := -2;
+ LightSource := (1,-1,15);
+ numeric sinthe, costhe, ux, uz, lx, lz, co, i;
+ costhe = (4*sqrt(5)-sqrt(3))/11;
+ sinthe = sqrt(1-(costhe**2));
+ ux = costhe*sqrt(2)/2;
+ uz = sinthe/2;
+ lx = sqrt(4/3)*sinthe;
+ lz = -sqrt(2/3)*costhe;
+ co = sqrt(2)*(2*sqrt(5)+5*sqrt(3))/22;
+ V1 := (ux,0,-uz);
+ V2 := (lx,0,-lz);
+ V3 := (0,ux,uz); V15:= (0,-ux,uz);
+ V4 := (0,lx,lz); V16:= (0,-lx,lz);
+ V5 := (co,co,0); V14:= (-co,-co,0);
+ V6 := (-ux,0,-uz);
+ V7 := (-lx,0,-lz);
+ V8 := (-co,co,0); V13:= (co,-co,0);
+ V9 := improvertex( V5, 1, V4, 1, V3, sqrt(3)-1, (0,1,0) );
+ V10:= (-X(V9),-Y(V9),Z(V9));
+ V11:= (Y(V9),-X(V9),-Z(V9));
+ V12:= (-Y(V9),X(V9),-Z(V9));
+ makeface1(1,2,3);
+ makeface2(1,2,5);
+ makeface3(2,3,5);
+ makeface4(9,4,5);
+ makeface5(3,4,1);
+ makeface6(1,4,5);
+ makeface7(3,6,7);
+ makeface8(3,7,8);
+ makeface9(6,7,8);
+ makeface10(9,8,4);
+ makeface11(4,6,8);
+ makeface12(3,4,6);
+ makeface13(3,5,9);
+ makeface14(3,8,9);
+ makeface15(7,8,12);
+ makeface16(7,14,12);
+ makeface17(6,8,12);
+ makeface18(6,14,12);
+ makeface19(2,5,11);
+ makeface20(2,13,11);
+ makeface21(1,5,11);
+ makeface22(1,13,11);
+ makeface23(10,15,13);
+ makeface24(10,15,14);
+ makeface25(10,16,13);
+ makeface26(10,16,14);
+ makeface27(2,1,15);
+ makeface28(6,7,15);
+ makeface29(13,15,2);
+ makeface30(14,15,7);
+ makeface31(16,1,15);
+ makeface32(16,6,15);
+ for i=1 upto 32:
+ FC[i] := TableColors;
+ FCD[i]:= true;
+ endfor;
+ ShadowOn := true;
+ setthearena(15,6);
+ fill_faces();
+ draw_invisible( false, false, TableC3, TableC0 );
+% drawoptions( withcolor red );
+% for i=1 upto 16:
+% label.bot( decimal( i ), rp( V[i] ) );
+% endfor;
+endfig;
+
+% Draw a torus with faces.
+
+beginfig(2);
+
+ PrintStep := 7;
+
+ f := ( 3,1,1 );
+
+ RB:=1;
+ RS:=0.25;
+ NB:=3;
+ NS:=5;
+ jB:=360/NB;
+ jS:=360/NS;
+ iS:=jS;
+ iB:=jB;
+ counter:=0;
+ for i=1 upto NB:
+ for j=1 upto NS:
+ counter := incr(counter);
+ npf[counter]:= 4;
+ phi :=j*jS;
+ theta:=i*jB;
+ f1 :=(RB+(RS)*cosd(phi))*cosd(theta);
+ s1 :=(RB+(RS)*cosd(phi))*sind(theta);
+ t1 := (RS)*sind(phi);
+ F[counter]p[1]:=(f1,s1,t1);
+ f2 :=(RB+(RS)*cosd(phi))*cosd(theta+iB);
+ s2 :=(RB+(RS)*cosd(phi))*sind(theta+iB);
+ t2 := (RS)*sind(phi);
+ F[counter]p[2]:=(f2,s2,t2);
+ f3 :=(RB+(RS)*cosd(phi+iS))*cosd(theta+iB);
+ s3 :=(RB+(RS)*cosd(phi+iS))*sind(theta+iB);
+ t3 := (RS)*sind(phi+iS);
+ F[counter]p[3]:=(f3,s3,t3);
+ f4 :=(RB+(RS)*cosd(phi+iS))*cosd(theta);
+ s4 :=(RB+(RS)*cosd(phi+iS))*sind(theta);
+ t4 := (RS)*sind(phi+iS);
+ F[counter]p[4]:=(f4,s4,t4);
+ endfor;
+ endfor;
+ NF:=counter;
+% faceraytrace(0.3, blue);
+% draw_all_test(false);
+ sharpraytrace;
+endfig;
+
+beginfig(1);
+ color tmpcolor;
+ string tmpstr;
+ Nobjects := 0;
+ f := ( 3,1,1 );
+ Spread := 110;
+ NP:=624;
+ RB:=1;
+ RS:=0.2;
+ R3:=0.1;
+ NB:=8;
+ NS:=5;
+ jB:=360*NB/NP;
+ jS:=360*NS/NP;
+ for i=1 upto NP:
+ phi :=i*jS;
+ theta :=i*jB;
+ first :=(RB+(RS+R3*sind(4*theta))*cosd(phi))*cosd(theta);
+ second:=(RB+(RS+R3*sind(4*theta))*cosd(phi))*sind(theta);
+ third := (RS+R3*sind(4*theta))*sind(phi);
+ tmpcolor := (first,second,third);
+ tmpstr := cstr( tmpcolor );
+ getready("signalvertex(" & tmpstr &
+ ",1,black);signalvertex(" & tmpstr & ",0.7,white);", tmpcolor );
+ endfor;
+ doitnow;
+endfig;
+
+beginfig(6);
+ f := (6,2,4);
+% f := (6,2,7); % NO CUSP.
+ Spread:=70;
+ HoriZon := -2;
+ ShadowOn := true;
+ numeric bigray, smaray, angstep;
+ color toruscenter, torusmoment, nearaxe, sideaxe, viewline;
+ color circlecenter, circlemoment;
+ numeric ang, ind, i, anglim;
+ path cpath, apath, opath, ipath, wp, ep;
+ pair outerp[], innerp[], refpair;
+ pen markpen;
+ boolean cuspcond;
+ picture holepic;
+ markpen = pencircle scaled 5pt;
+ pickup markpen;
+ bigray = 2;
+ smaray = 1;
+ angstep= 2;
+ toruscenter = black;
+ torusmoment = (0,1,2);
+ refpair = unitvector( rp(toruscenter+torusmoment)-rp(toruscenter) );
+ viewline = f-toruscenter;
+ ind = 0;
+ sideaxe = bigray*ncrossprod( torusmoment, viewline );
+ nearaxe = bigray*ncrossprod( sideaxe, torusmoment );
+ anglim = 0.5*angstep-180;
+ if ShadowOn:
+ for ang=anglim step angstep until -anglim:
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang);
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ filldraw circleshadowpath(circlecenter,circlemoment,smaray);
+ endfor;
+ fi;
+ for ang=anglim step angstep until -anglim:
+ ind := incr( ind );
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang);
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,smaray,true);
+ if ang>=0:
+ outerp[ind]=point 0 of cpath;
+ innerp[ind]=point (length cpath) of cpath;
+ elseif ang<0:
+ innerp[ind]=point 0 of cpath;
+ outerp[ind]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ opath = for i=1 upto ind: outerp[i].. endfor cycle;
+ ipath = for i=1 upto ind: innerp[i].. endfor cycle;
+ holepic = currentpicture;
+ clip holepic to ipath;
+ unfill opath;
+ draw holepic;
+ draw opath withcolor green;
+ draw ipath withcolor red;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% There is an analytic way of getting the angle of the cusp point! %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ i := ceiling(1+180/angstep);
+ forever:
+ i := incr( i );
+ cuspcond := refpair dotprod innerp[i+1] < refpair dotprod innerp[i];
+ exitif cuspcond or ( i > ind-1 );
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ep = outerp[ind-i]--innerp[ind-i];
+ wp = innerp[i]--outerp[i];
+ unfill buildcycle(opath,ep,reverse ipath,wp);
+ draw opath withcolor green;
+ draw subpath (i,ind-i) of ipath withcolor red;
+endfig;
+
+beginfig(7); %%%%%%% copy of figure 6
+ f := (6,2,4);
+ Spread:=70;
+ HoriZon := -2;
+ ShadowOn := true;
+ numeric bigray, smaray;
+ color toruscenter, torusmoment;
+ pen markpen;
+ markpen = pencircle scaled 5pt;
+ bigray = 2;
+ smaray = 1;
+ toruscenter = black;
+ torusmoment = (0,1,2);
+ setthestage( 17, 8 );
+ pickup markpen;
+ smoothtorus( toruscenter, torusmoment, bigray, smaray );
+endfig;
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/torusexperiment.mp b/graphics/metapost/contrib/macros/featpost/example/torusexperiment.mp
new file mode 100644
index 0000000000..e9ad366138
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/torusexperiment.mp
@@ -0,0 +1,152 @@
+% torusexperiment.mp
+% L. Nobre G.
+% 2014
+
+% DO NOT CHANGE PARAMETERS. YOU HAVE BEEN WARNED!
+
+prologues := 1;
+input featpost3Dplus2D;
+%SphericalDistortion := true;
+%ParallelProj := true;
+beginfig(1);
+ Spread:=70;
+ numeric bigray, smaray, angstep;
+ color toruscenter, torusmoment, nearaxe, sideaxe, viewline;
+ color circlecenter, circlemoment;
+ numeric ang, ind, i, anglim;
+ path cpath, apath, opath, ipath, wp, ep;
+ pair outerp[], innerp[], refpair;
+ pen markpen;
+ boolean cuspcond;
+ picture holepic;
+ color hvec, fakef, visualcircenter, hvecf, perpvec, axisvec;
+ numeric rratio, hratio, visualray, resultang;
+ numeric fakedist, fakeangle, fakeviewlimitangle, tmpangle;
+ markpen = pencircle scaled 5pt;
+ pickup markpen;
+ bigray = 5;
+ smaray = 1;
+ %message "Villarceau angle: " & decimal(angle(bigray+-+smaray,smaray));
+ message "Actual view angle: " & decimal(angle(X(f)++Y(f),Z(f)));
+ angstep= 0.5;
+ toruscenter = black;
+ torusmoment = (0,0,1);
+ % f := (3,-6,3);
+ %%%%%%%%%%%%%%%%%%%%%%%%%%% f := 3*(0,4.24706,0.67267); fakedist = 7.3;
+ f := (7,4,2); fakedist = 4.3; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ fakeangle = 9;
+ fakeviewlimitangle = 2;
+% fakef = (0,4,3);
+% fakef = f;
+% fakef = (-Y(f),X(f),Z(f));
+ fakef = (0,fakedist*cosd(fakeangle),fakedist*sind(fakeangle));
+ %show fakef;
+ %endfig;
+ %end.
+ if cdotprod(f-viewcentr,torusmoment)<0 :
+ torusmoment := -torusmoment;
+ fi;
+ refpair = unitvector( rp(toruscenter+torusmoment)-rp(toruscenter) );
+ viewline = f-toruscenter;
+ ind = 0;
+ sideaxe = bigray*ncrossprod( torusmoment, viewline );
+ nearaxe = bigray*ncrossprod( sideaxe, torusmoment );
+ anglim = 0.5*angstep-180;
+ hvec = cdotprod(f-toruscenter,N(torusmoment))*N(torusmoment);
+ hratio = conorm(hvec)/bigray;
+ rratio = conorm(f-toruscenter-hvec)/bigray;
+ for ang=anglim step angstep until -anglim:
+ ind := incr( ind );
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang);
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,smaray,true);
+ if ang>=0:
+ outerp[ind]=point 0 of cpath;
+ innerp[ind]=point (length cpath) of cpath;
+ elseif ang<0:
+ innerp[ind]=point 0 of cpath;
+ outerp[ind]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ opath = for i=1 upto ind: outerp[i].. endfor cycle;
+ ipath = for i=1 upto ind: innerp[i].. endfor cycle;
+ holepic = currentpicture;
+ clip holepic to ipath;
+ unfill opath;
+ draw holepic;
+ draw ipath withcolor red;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% There is an analytic way of getting the angle of the cusp point! %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ i := ceiling(1+180/angstep);
+ forever:
+ i := incr( i );
+ cuspcond := refpair dotprod innerp[i+1] < refpair dotprod innerp[i];
+ exitif cuspcond or ( i > ind-1 );
+ endfor;
+ resultang = anglim+angstep*(i-1);
+ write decimal(smaray/bigray) & " " & decimal(rratio) & " " & decimal(hratio) & " " & decimal(resultang) to "torusexperimentoneline.dat";
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ep = outerp[ind-i]--innerp[ind-i];
+ wp = innerp[i]--outerp[i];
+ unfill buildcycle(opath,ep,reverse ipath,wp);
+ draw opath withcolor green;
+ draw subpath (i,ind-i) of ipath withcolor red;
+ hvecf = cdotprod(fakef-toruscenter,N(torusmoment))*N(torusmoment);
+ visualcircenter = 0.5[toruscenter+hvecf,fakef];
+ axisvec = fakef-visualcircenter;
+ visualray = conorm( axisvec );
+ perpvec = ncrossprod(axisvec,torusmoment)*visualray;
+ color tmpf, tmpc, tmpp[], tmpq[], tmpa, tmpv;
+ numeric theta, alpha, beta;
+ tmpv = N(torusmoment);
+ i := 0;
+ drawoptions( withcolor blue withpen pencircle scaled 5pt );
+ for theta=2*anglim step angstep until -2*anglim:
+ tmpf := visualcircenter+planarrotation( axisvec, perpvec, theta );
+ tmpa := N( planarrotation( axisvec, perpvec, theta/2 ) );
+ tmpc := toruscenter+tmpa*bigray;
+ beta := getangle(tmpa,tmpf-tmpc);
+ alpha := angle( smaray, conorm( tmpf-tmpc ) +-+ smaray ); %%%%%%%%%%%%
+ tmpp[i] := tmpc + smaray*planarrotation( -tmpa, tmpv, 180-alpha-beta );
+ tmpq[i] := tmpc + smaray*planarrotation( -tmpa, tmpv, 180+alpha-beta );
+ if i>0:
+ tmpangle := getangle(tmpp[i]-tmpp[i-1],tmpp[i]-fakef);
+ %write decimal(i) & " " & decimal(tmpangle) to "torusexperimentangles.dat";
+ if (tmpangle<fakeviewlimitangle) or (180-tmpangle<fakeviewlimitangle):
+ draw rp(tmpp[i])--rp(fakef) withpen pencircle scaled 0pt;
+ fi;
+ fi;
+ i := incr(i);
+ endfor;
+ draw rp(fakef);
+ if smaray>bigray:
+ draw rp(toruscenter+tmpv*(smaray+-+bigray));
+ draw rp(toruscenter-tmpv*(smaray+-+bigray));
+ fi;
+ ind := i-1;
+ drawoptions();
+ pickup pencircle scaled 0pt;
+ draw rp(fakef)--rp((X(fakef),Y(fakef),0))--rp((0,bigray,0))--cycle dashed evenly;
+ draw goodcirclepath((0,bigray,0),red,smaray) dashed evenly;
+ draw for i=0 upto ind: rp(tmpp[i]).. endfor cycle;
+ draw for i=0 upto ind: rp(tmpq[i]).. endfor cycle;
+ pickup pencircle scaled 2pt;
+ draw spatialhalfcircle( toruscenter, torusmoment, bigray+smaray, true );
+ %draw rigorouscircle( toruscenter, torusmoment, bigray-smaray );
+ draw rigorouscircle( toruscenter+smaray*tmpv, torusmoment, bigray );
+ %draw rigorouscircle( toruscenter-smaray*tmpv, torusmoment, bigray );
+ picture tmppicture;
+ path zoomwindow;
+ zoomwindow = (550,230)--(750,230)--(750,330)--(550,330)--cycle;
+ tmppicture = currentpicture;
+ clip tmppicture to zoomwindow;
+endfig;
+
+beginfig(2);
+ draw tmppicture scaled 4;
+endfig;
+
+end.
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/trajectoryline.mp b/graphics/metapost/contrib/macros/featpost/example/trajectoryline.mp
new file mode 100644
index 0000000000..182fa6d77a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/trajectoryline.mp
@@ -0,0 +1,88 @@
+% trajectoryline.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 30;
+f := (10,0,0);
+
+color posa, posb, axer;
+numeric kfac, refrad;
+posa = -5*green;
+posb = 5*green;
+axer = blue;
+kfac = 2.5;
+refrad = 1;
+
+def vecfunc( expr posit )=
+ begingroup
+ save modula, modulb, field;
+ color field;
+ numeric modula, modulb;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = ( posit-posa )/(modula**3)+kfac*( posit-posb )/(modulb**3);
+ ( -field )
+ endgroup
+enddef;
+
+def magfunc( expr posit )=
+ begingroup
+ save perpd, refvec, dist;
+ color perpd, refvec;
+ numeric dist;
+ perpd = ccrossprod( axer, posit );
+ refvec = posit - refrad*ncrossprod( perpd, axer );
+ dist = conorm( refvec );
+ ( ncrossprod( refvec, perpd )/(dist**2) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, numa, sa, diffstep, ray;
+ color stp, svl;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 400;
+ numa = 58;
+ diffstep = 0.12;
+ ray = 3.5;
+ sa = 168;
+ for i=sa step numa until (180):
+ stp := ( 0, ray*cosd(i), ray*sind(i) );
+ svl := N( -stp );
+ oneline := trajectorypath( lena, stp, svl, diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(posa) withpen grossa;
+ draw rp(posb) withpen grossa;
+endfig;
+
+beginfig(2);
+ numeric i, lena, numa, sa, diffstep, ray;
+ color stp, svl;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 100;
+ numa = 4;
+ diffstep = 1;
+ ray = 5.5;
+ sa = 97;
+ for i=sa step numa until (120):
+ stp := ( 0, ray*cosd(i), ray*sind(i) );
+ svl := 0.8*N( -stp );
+ oneline := magnetictrajectorypath( lena, stp, svl, diffstep, magfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ draw rp(black) withpen grossa;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/trebuchet.mp b/graphics/metapost/contrib/macros/featpost/example/trebuchet.mp
new file mode 100644
index 0000000000..b9d81babd2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/trebuchet.mp
@@ -0,0 +1,36 @@
+% trebuchet.mp
+% L. Nobre G.
+% 2014
+
+%prologues := 1;
+%outputformat := "png";
+%outputformatoptions := "format=rgb antialias=best";
+%hppp := 0.25;
+%vppp := 0.25;
+
+beginfig(1);
+ numeric i, s, a, u, h, t;
+ pair pi, pj, pk;
+ u = 9mm;
+ h = 5u;
+ a = 0.039u;
+ s = 5;
+ draw (0,-h) for i=s-90 step s until 90:
+ ..(h*(2*cosd(i),sind(i)))
+ endfor --cycle;
+ draw origin--(2h,0);
+ t = 0;
+ forever:
+ t := incr(t);
+ i := h-0.5*a*t**2;
+ exitif i<-h;
+ pi := (0,i);
+ pj := (h+-+i,0);
+ pk := 2[pi,pj];
+ if i<0:
+ draw pj withpen pencircle scaled 0.17u;
+ fi;
+ draw pi--pk withcolor 0.5white;
+ endfor;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/treecarbonedited.mp b/graphics/metapost/contrib/macros/featpost/example/treecarbonedited.mp
new file mode 100644
index 0000000000..b57726f92b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/treecarbonedited.mp
@@ -0,0 +1,2128 @@
+%
+% fig2dev (version 3.2.5-alpha7) -L (m)mp version 0.05 --- Preamble
+%
+
+%
+% mp output driver options:
+% -L mp
+%
+
+% +MP-ADDITIONAL-HEADER
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{palatino}
+\begin{document}
+etex
+% -MP-ADDITIONAL-HEADER
+
+
+%SetFigFont macros for latex
+verbatimtex
+%
+\begingroup\makeatletter\ifx\SetFigFontNFSS\undefined%
+\gdef\SetFigFontNFSS#1#2#3#4#5{%
+ \reset@font\fontsize{#1}{#2pt}%
+ \fontfamily{#3}\fontseries{#4}\fontshape{#5}%
+ \selectfont}%
+\fi\endgroup%
+\ifx\SetFigFontSize\undefined%
+\gdef\SetFigFontSize#1#2{%
+ \fontsize{#1}{#2pt}%
+ \selectfont}%
+\fi%
+etex
+
+% Now draw the figure
+beginfig(0)
+% Some reasonable defaults
+ labeloffset:=0;
+ truecorners:=1;
+ bboxmargin:=0;
+% Begin polyline object
+ linecap:=butt;
+ linejoin:=mitered;
+ miterlimit:=20.0;
+ pickup pencircle scaled 0.94;
+ path p;
+ p = (25.51, 202.39)
+ --(578.27, 202.39)
+ --(578.27, -30.05)
+ --(25.51, -30.05)
+ --(25.51, 202.39)--cycle;
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.75,0.38,0.00) + -0.10white);
+ draw p withcolor (0.75,0.38,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (362.83, 721.13)
+ --(362.83, 602.08);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.53,0.81,1.00) + 0.00white);
+ draw p withcolor (0.53,0.81,1.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (347.91, 686.05)
+ --(362.83, 629.35)
+ --(377.70, 686.05)
+ --(347.91, 686.05) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.53,0.81,1.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (530.08, 712.63)
+ --(530.08, 193.89);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.53,0.81,1.00) + 0.00white);
+ draw p withcolor (0.53,0.81,1.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (515.15, 277.86)
+ --(530.08, 221.17)
+ --(544.94, 277.86)
+ --(515.15, 277.86) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.53,0.81,1.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (127.56, 525.54)
+ --(62.36, 698.46);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.82,0.00,0.00) + 0.00white);
+ draw p withcolor (0.82,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (105.89, 625.20)
+ --(72.00, 672.94)
+ --(78.05, 614.68)
+ --(105.89, 625.20) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.82,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (181.42, 446.17)
+ --(181.42, 239.24);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.00,0.56,0.56) + 0.00white);
+ draw p withcolor (0.00,0.56,0.56);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (166.49, 323.21)
+ --(181.42, 266.52)
+ --(196.28, 323.21)
+ --(166.49, 323.21) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.00,0.56,0.56);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (433.70, 35.15)
+ --(337.32, 154.20);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.00,0.82,0.00) + 0.00white);
+ draw p withcolor (0.00,0.82,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (401.64, 98.39)
+ --(354.46, 133.04)
+ --(378.52, 79.62)
+ --(401.64, 98.39) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.00,0.82,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (124.72, 23.81)
+ --(235.28, 108.85);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.00,0.82,0.00) + 0.00white);
+ draw p withcolor (0.00,0.82,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (177.76, 45.92)
+ --(213.67, 92.22)
+ --(159.62, 69.48)
+ --(177.76, 45.92) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.00,0.82,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path p;
+ p = (96.38, 179.72)
+ --(45.35, 304.44);
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.82,0.00,0.00) + 0.00white);
+ draw p withcolor (0.82,0.00,0.00);
+% Draw arrowhead type 1
+ linecap:=0;
+ linejoin:=0;
+ pickup pencircle scaled 14.17;
+ path arr;
+ arr = (90.90, 232.38)
+ --(55.69, 279.18)
+ --(63.37, 221.10)
+ --(90.90, 232.38) -- cycle;
+ fill arr withcolor white;
+ draw arr withcolor (0.82,0.00,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=2;
+ pickup pencircle scaled 0.94;
+ path p;
+ p = (250.39, 206.49)
+ --(251.15, 207.87)
+ --(251.84, 209.39)
+ --(252.47, 210.83)
+ --(253.10, 212.35)
+ --(253.73, 213.92)
+ --(254.30, 215.56)
+ --(254.80, 217.20)
+ --(255.37, 218.90)
+ --(255.87, 220.66)
+ --(256.31, 222.49)
+ --(256.76, 224.38)
+ --(257.20, 226.27)
+ --(257.57, 228.16)
+ --(257.95, 230.11)
+ --(258.27, 232.13)
+ --(258.58, 234.14)
+ --(258.90, 236.09)
+ --(259.15, 238.11)
+ --(259.40, 240.13)
+ --(259.65, 242.14)
+ --(259.84, 244.16)
+ --(259.97, 246.11)
+ --(260.16, 248.13)
+ --(260.28, 250.08)
+ --(260.41, 252.03)
+ --(260.54, 253.98)
+ --(260.66, 255.94)
+ --(260.72, 257.89)
+ --(260.79, 259.72)
+ --(260.91, 261.61)
+ --(260.98, 263.50)
+ --(261.04, 265.45)
+ --(261.10, 267.46)
+ --(261.17, 269.48)
+ --(261.23, 271.56)
+ --(261.23, 273.64)
+ --(261.29, 275.78)
+ --(261.29, 277.98)
+ --(261.35, 280.19)
+ --(261.35, 282.46)
+ --(261.35, 284.72)
+ --(261.35, 286.99)
+ --(261.35, 289.26)
+ --(261.35, 291.53)
+ --(261.35, 293.80)
+ --(261.29, 296.00)
+ --(261.29, 298.20)
+ --(261.23, 300.35)
+ --(261.17, 302.49)
+ --(261.10, 304.57)
+ --(261.04, 306.58)
+ --(260.98, 308.54)
+ --(260.91, 310.43)
+ --(260.85, 312.31)
+ --(260.72, 314.14)
+ --(260.66, 315.91)
+ --(260.54, 317.61)
+ --(260.41, 319.24)
+ --(260.28, 321.20)
+ --(260.16, 323.09)
+ --(259.97, 324.91)
+ --(259.78, 326.80)
+ --(259.59, 328.63)
+ --(259.40, 330.52)
+ --(259.15, 332.35)
+ --(258.90, 334.24)
+ --(258.58, 336.13)
+ --(258.33, 337.95)
+ --(258.02, 339.84)
+ --(257.64, 341.73)
+ --(257.26, 343.56)
+ --(256.88, 345.39)
+ --(256.44, 347.21)
+ --(256.06, 348.98)
+ --(255.56, 350.74)
+ --(255.12, 352.50)
+ --(254.61, 354.20)
+ --(254.11, 355.84)
+ --(253.61, 357.48)
+ --(253.04, 359.12)
+ --(252.47, 360.69)
+ --(251.91, 362.20)
+ --(251.34, 363.78)
+ --(250.71, 365.35)
+ --(250.08, 366.93)
+ --(249.39, 368.50)
+ --(248.69, 370.08)
+ --(247.94, 371.78)
+ --(247.18, 373.42)
+ --(246.36, 375.12)
+ --(245.54, 376.88)
+ --(244.66, 378.58)
+ --(243.78, 380.41)
+ --(242.83, 382.17)
+ --(241.95, 383.94)
+ --(240.94, 385.76)
+ --(240.00, 387.53)
+ --(239.06, 389.29)
+ --(238.11, 390.99)
+ --(237.17, 392.69)
+ --(236.22, 394.27)
+ --(235.34, 395.84)
+ --(234.46, 397.35)
+ --(233.57, 398.80)
+ --(232.76, 400.19)
+ --(232.00, 401.51)
+ --(231.18, 402.71)
+ --(230.49, 403.91)
+ --(229.80, 405.04)
+ --(229.10, 406.05)
+ --(228.03, 407.69)
+ --(227.02, 409.20)
+ --(226.08, 410.58)
+ --(225.20, 411.91)
+ --(224.38, 413.17)
+ --(223.62, 414.36)
+ --(222.93, 415.50)
+ --(222.30, 416.57)
+ --(221.80, 417.57)
+ --(221.35, 418.46)
+ --(221.04, 419.34)
+ --(220.85, 420.16)
+ --(220.72, 420.91)
+ --(220.72, 421.61)
+ --(220.79, 422.30)
+ --(220.98, 422.99)
+ --(221.17, 423.50)
+ --(221.35, 424.00)
+ --(221.67, 424.57)
+ --(221.98, 425.07)
+ --(222.36, 425.64)
+ --(222.87, 426.14)
+ --(223.37, 426.65)
+ --(223.94, 427.15)
+ --(224.57, 427.59)
+ --(225.20, 427.97)
+ --(225.95, 428.35)
+ --(226.71, 428.60)
+ --(227.53, 428.85)
+ --(228.35, 428.98)
+ --(229.23, 429.04)
+ --(230.11, 429.04)
+ --(230.99, 428.98)
+ --(231.94, 428.79)
+ --(232.82, 428.47)
+ --(233.76, 428.09)
+ --(234.71, 427.65)
+ --(235.72, 427.09)
+ --(236.60, 426.46)
+ --(237.54, 425.76)
+ --(238.49, 424.94)
+ --(239.50, 424.06)
+ --(240.57, 423.06)
+ --(241.64, 421.98)
+ --(242.71, 420.79)
+ --(243.91, 419.53)
+ --(245.04, 418.27)
+ --(246.30, 416.88)
+ --(247.50, 415.50)
+ --(248.76, 414.05)
+ --(250.02, 412.54)
+ --(251.28, 411.09)
+ --(252.54, 409.64)
+ --(253.73, 408.19)
+ --(254.99, 406.74)
+ --(256.19, 405.35)
+ --(257.39, 404.03)
+ --(258.52, 402.77)
+ --(259.65, 401.57)
+ --(260.79, 400.38)
+ --(261.86, 399.31)
+ --(262.93, 398.24)
+ --(263.94, 397.35)
+ --(264.94, 396.54)
+ --(265.95, 395.72)
+ --(266.96, 394.96)
+ --(267.97, 394.20)
+ --(268.98, 393.57)
+ --(270.05, 392.94)
+ --(271.06, 392.44)
+ --(272.13, 391.94)
+ --(273.20, 391.56)
+ --(274.27, 391.24)
+ --(275.34, 390.99)
+ --(276.41, 390.87)
+ --(277.42, 390.80)
+ --(278.43, 390.80)
+ --(279.43, 390.93)
+ --(280.44, 391.12)
+ --(281.39, 391.43)
+ --(282.33, 391.81)
+ --(283.21, 392.31)
+ --(284.09, 392.88)
+ --(284.91, 393.51)
+ --(285.73, 394.27)
+ --(286.49, 395.09)
+ --(287.24, 396.03)
+ --(288.00, 397.04)
+ --(288.76, 398.11)
+ --(289.45, 399.37)
+ --(290.14, 400.69)
+ --(290.83, 402.08)
+ --(291.59, 403.59)
+ --(292.28, 405.23)
+ --(292.98, 406.87)
+ --(293.73, 408.69)
+ --(294.49, 410.52)
+ --(295.18, 412.47)
+ --(295.94, 414.43)
+ --(296.69, 416.38)
+ --(297.45, 418.39)
+ --(298.14, 420.41)
+ --(298.90, 422.43)
+ --(299.65, 424.44)
+ --(300.35, 426.33)
+ --(301.10, 428.22)
+ --(301.86, 430.05)
+ --(302.55, 431.75)
+ --(303.24, 433.45)
+ --(304.00, 434.96)
+ --(304.69, 436.47)
+ --(305.39, 437.80)
+ --(306.08, 439.06)
+ --(306.83, 440.25)
+ --(307.34, 441.01)
+ --(307.84, 441.70)
+ --(308.35, 442.39)
+ --(308.91, 442.96)
+ --(309.42, 443.59)
+ --(309.98, 444.09)
+ --(310.49, 444.60)
+ --(311.06, 445.04)
+ --(311.62, 445.42)
+ --(312.19, 445.80)
+ --(312.76, 446.05)
+ --(313.32, 446.30)
+ --(313.95, 446.49)
+ --(314.52, 446.61)
+ --(315.09, 446.68)
+ --(315.65, 446.68)
+ --(316.22, 446.61)
+ --(316.72, 446.55)
+ --(317.29, 446.36)
+ --(317.80, 446.11)
+ --(318.30, 445.86)
+ --(318.80, 445.48)
+ --(319.31, 445.04)
+ --(319.75, 444.60)
+ --(320.19, 444.03)
+ --(320.57, 443.46)
+ --(320.94, 442.77)
+ --(321.32, 442.08)
+ --(321.70, 441.32)
+ --(321.95, 440.50)
+ --(322.27, 439.62)
+ --(322.52, 438.74)
+ --(322.71, 437.73)
+ --(322.96, 436.72)
+ --(323.09, 435.65)
+ --(323.21, 434.52)
+ --(323.34, 433.32)
+ --(323.46, 432.06)
+ --(323.46, 430.43)
+ --(323.53, 428.66)
+ --(323.46, 426.83)
+ --(323.46, 424.88)
+ --(323.34, 422.80)
+ --(323.21, 420.66)
+ --(323.02, 418.46)
+ --(322.90, 416.13)
+ --(322.65, 413.73)
+ --(322.46, 411.28)
+ --(322.20, 408.76)
+ --(321.95, 406.17)
+ --(321.64, 403.59)
+ --(321.39, 401.01)
+ --(321.13, 398.43)
+ --(320.88, 395.84)
+ --(320.63, 393.32)
+ --(320.38, 390.80)
+ --(320.19, 388.41)
+ --(319.94, 386.08)
+ --(319.81, 383.81)
+ --(319.69, 381.67)
+ --(319.56, 379.65)
+ --(319.50, 377.70)
+ --(319.43, 375.94)
+ --(319.43, 374.24)
+ --(319.50, 372.66)
+ --(319.62, 371.28)
+ --(319.75, 369.95)
+ --(319.94, 368.82)
+ --(320.19, 367.81)
+ --(320.50, 366.87)
+ --(320.88, 366.11)
+ --(321.32, 365.42)
+ --(321.83, 364.91)
+ --(322.33, 364.47)
+ --(322.96, 364.09)
+ --(323.59, 363.91)
+ --(324.28, 363.78)
+ --(325.04, 363.78)
+ --(325.86, 363.91)
+ --(326.68, 364.09)
+ --(327.56, 364.41)
+ --(328.44, 364.79)
+ --(329.39, 365.29)
+ --(330.39, 365.86)
+ --(331.40, 366.55)
+ --(332.41, 367.31)
+ --(333.42, 368.06)
+ --(334.43, 368.94)
+ --(335.43, 369.89)
+ --(336.44, 370.83)
+ --(337.45, 371.84)
+ --(338.46, 372.85)
+ --(339.40, 373.92)
+ --(340.41, 374.99)
+ --(341.35, 376.06)
+ --(342.30, 377.20)
+ --(343.18, 378.33)
+ --(344.06, 379.46)
+ --(345.20, 380.91)
+ --(346.27, 382.36)
+ --(347.40, 383.87)
+ --(348.47, 385.45)
+ --(349.54, 387.02)
+ --(350.61, 388.66)
+ --(351.75, 390.30)
+ --(352.82, 391.94)
+ --(353.95, 393.57)
+ --(355.02, 395.28)
+ --(356.09, 396.91)
+ --(357.17, 398.55)
+ --(358.24, 400.13)
+ --(359.31, 401.70)
+ --(360.31, 403.15)
+ --(361.26, 404.54)
+ --(362.27, 405.86)
+ --(363.21, 407.12)
+ --(364.09, 408.25)
+ --(364.98, 409.32)
+ --(365.80, 410.33)
+ --(366.61, 411.15)
+ --(367.43, 411.97)
+ --(368.25, 412.66)
+ --(368.94, 413.17)
+ --(369.57, 413.61)
+ --(370.27, 414.05)
+ --(370.96, 414.36)
+ --(371.59, 414.68)
+ --(372.28, 414.87)
+ --(372.91, 415.06)
+ --(373.61, 415.12)
+ --(374.24, 415.18)
+ --(374.87, 415.18)
+ --(375.50, 415.12)
+ --(376.13, 414.93)
+ --(376.69, 414.74)
+ --(377.20, 414.49)
+ --(377.76, 414.17)
+ --(378.20, 413.80)
+ --(378.71, 413.42)
+ --(379.09, 412.91)
+ --(379.46, 412.41)
+ --(379.78, 411.91)
+ --(380.09, 411.34)
+ --(380.28, 410.71)
+ --(380.47, 410.02)
+ --(380.66, 409.39)
+ --(380.72, 408.63)
+ --(380.79, 407.94)
+ --(380.79, 407.18)
+ --(380.79, 406.36)
+ --(380.66, 405.35)
+ --(380.47, 404.22)
+ --(380.16, 403.09)
+ --(379.84, 401.83)
+ --(379.40, 400.57)
+ --(378.90, 399.18)
+ --(378.33, 397.80)
+ --(377.70, 396.28)
+ --(377.01, 394.77)
+ --(376.19, 393.20)
+ --(375.37, 391.56)
+ --(374.49, 389.98)
+ --(373.61, 388.35)
+ --(372.66, 386.71)
+ --(371.65, 385.07)
+ --(370.71, 383.50)
+ --(369.70, 381.98)
+ --(368.69, 380.47)
+ --(367.75, 378.96)
+ --(366.74, 377.51)
+ --(365.80, 376.13)
+ --(364.79, 374.74)
+ --(363.78, 373.35)
+ --(362.83, 372.03)
+ --(361.83, 370.65)
+ --(360.76, 369.26)
+ --(359.75, 367.94)
+ --(358.68, 366.49)
+ --(357.54, 365.10)
+ --(356.47, 363.72)
+ --(355.34, 362.27)
+ --(354.27, 360.88)
+ --(353.13, 359.50)
+ --(352.06, 358.11)
+ --(350.99, 356.72)
+ --(349.92, 355.40)
+ --(348.91, 354.14)
+ --(347.91, 352.88)
+ --(346.96, 351.69)
+ --(346.08, 350.55)
+ --(345.20, 349.42)
+ --(344.38, 348.35)
+ --(343.62, 347.28)
+ --(342.87, 346.27)
+ --(342.05, 345.13)
+ --(341.29, 344.00)
+ --(340.47, 342.93)
+ --(339.72, 341.80)
+ --(338.96, 340.60)
+ --(338.27, 339.46)
+ --(337.51, 338.27)
+ --(336.76, 337.07)
+ --(336.06, 335.87)
+ --(335.37, 334.61)
+ --(334.68, 333.42)
+ --(334.05, 332.22)
+ --(333.42, 331.02)
+ --(332.79, 329.83)
+ --(332.22, 328.69)
+ --(331.72, 327.50)
+ --(331.15, 326.36)
+ --(330.65, 325.29)
+ --(330.20, 324.16)
+ --(329.70, 323.02)
+ --(329.26, 321.89)
+ --(328.76, 320.76)
+ --(328.31, 319.56)
+ --(327.81, 318.30)
+ --(327.31, 316.98)
+ --(326.87, 315.65)
+ --(326.36, 314.20)
+ --(325.92, 312.76)
+ --(325.48, 311.24)
+ --(325.04, 309.73)
+ --(324.60, 308.16)
+ --(324.22, 306.58)
+ --(323.84, 305.01)
+ --(323.53, 303.37)
+ --(323.21, 301.80)
+ --(322.96, 300.22)
+ --(322.71, 298.65)
+ --(322.52, 297.07)
+ --(322.33, 295.50)
+ --(322.20, 293.92)
+ --(322.08, 292.60)
+ --(322.02, 291.21)
+ --(321.95, 289.83)
+ --(321.89, 288.38)
+ --(321.89, 286.87)
+ --(321.89, 285.35)
+ --(321.89, 283.78)
+ --(321.89, 282.14)
+ --(321.95, 280.50)
+ --(322.02, 278.80)
+ --(322.14, 277.10)
+ --(322.20, 275.40)
+ --(322.33, 273.70)
+ --(322.46, 272.00)
+ --(322.58, 270.30)
+ --(322.71, 268.60)
+ --(322.83, 266.96)
+ --(323.02, 265.39)
+ --(323.15, 263.81)
+ --(323.34, 262.30)
+ --(323.53, 260.85)
+ --(323.72, 259.40)
+ --(323.84, 258.02)
+ --(324.03, 256.63)
+ --(324.22, 255.18)
+ --(324.47, 253.67)
+ --(324.66, 252.22)
+ --(324.85, 250.71)
+ --(325.10, 249.20)
+ --(325.35, 247.69)
+ --(325.61, 246.17)
+ --(325.86, 244.60)
+ --(326.11, 243.02)
+ --(326.43, 241.51)
+ --(326.68, 239.94)
+ --(326.99, 238.36)
+ --(327.24, 236.85)
+ --(327.56, 235.34)
+ --(327.87, 233.89)
+ --(328.19, 232.44)
+ --(328.50, 230.99)
+ --(328.76, 229.61)
+ --(329.07, 228.28)
+ --(329.39, 226.96)
+ --(329.70, 225.64)
+ --(330.02, 224.38)
+ --(330.33, 223.06)
+ --(330.65, 221.73)
+ --(331.02, 220.41)
+ --(331.34, 219.09)
+ --(331.72, 217.70)
+ --(332.09, 216.25)
+ --(332.54, 214.87)
+ --(332.98, 213.35)
+ --(333.42, 211.91)
+ --(333.92, 210.46)
+ --(334.36, 208.94)
+ --(334.87, 207.50)
+ --(335.37, 206.05)
+ --(335.94, 204.66)
+ --(336.44, 203.28)
+ --(337.01, 201.95)
+ --(337.51, 200.63)
+ --(338.08, 199.43)
+ --(338.65, 198.24)
+ --(339.21, 197.10)
+ --(339.78, 195.97)
+ --(340.35, 194.90)
+ --(340.98, 193.76)
+ --(341.67, 192.63)
+ --(342.36, 191.50)
+ --(343.12, 190.36)
+ --(343.94, 189.23)
+ --(344.76, 188.09)
+ --(345.64, 186.96)
+ --(346.52, 185.83)
+ --(347.40, 184.69)
+ --(348.35, 183.62)
+ --(349.29, 182.49)
+ --(350.24, 181.42)
+ --(351.12, 180.41)
+ --(352.06, 179.40)
+ --(352.94, 178.39)
+ --(353.89, 177.45)
+ --(354.71, 176.57)
+ --(355.59, 175.62)
+ --(356.41, 174.80)
+ --(357.23, 173.92)
+ --(357.92, 173.17)
+ --(358.61, 172.47)
+ --(359.24, 171.78)
+ --(359.94, 171.02)
+ --(360.63, 170.33)
+ --(361.26, 169.57)
+ --(361.89, 168.88)
+ --(362.46, 168.19)
+ --(363.02, 167.50)
+ --(363.53, 166.87)
+ --(364.03, 166.24)
+ --(364.47, 165.61)
+ --(364.79, 165.10)
+ --(365.10, 164.60)
+ --(365.29, 164.16)
+ --(365.48, 163.78)
+ --(365.54, 163.46)
+ --(365.48, 163.28)
+ --(365.42, 163.09)
+ --(365.17, 162.96)
+ --(364.91, 162.90)
+ --(364.54, 162.96)
+ --(364.09, 163.09)
+ --(363.53, 163.21)
+ --(362.83, 163.53)
+ --(362.08, 163.84)
+ --(361.20, 164.22)
+ --(360.25, 164.72)
+ --(359.18, 165.23)
+ --(357.98, 165.86)
+ --(356.72, 166.55)
+ --(355.40, 167.24)
+ --(353.95, 168.06)
+ --(352.44, 168.88)
+ --(350.93, 169.76)
+ --(349.29, 170.65)
+ --(347.65, 171.59)
+ --(346.02, 172.54)
+ --(344.38, 173.48)
+ --(342.74, 174.36)
+ --(341.17, 175.31)
+ --(339.59, 176.19)
+ --(338.08, 177.07)
+ --(336.57, 177.89)
+ --(335.18, 178.65)
+ --(333.80, 179.40)
+ --(332.47, 180.16)
+ --(331.28, 180.79)
+ --(330.27, 181.29)
+ --(329.32, 181.80)
+ --(328.44, 182.24)
+ --(327.56, 182.68)
+ --(326.68, 183.06)
+ --(325.86, 183.43)
+ --(325.04, 183.75)
+ --(324.28, 184.06)
+ --(323.46, 184.31)
+ --(322.71, 184.50)
+ --(322.02, 184.63)
+ --(321.32, 184.76)
+ --(320.63, 184.82)
+ --(320.00, 184.82)
+ --(319.43, 184.82)
+ --(318.87, 184.69)
+ --(318.30, 184.50)
+ --(317.86, 184.31)
+ --(317.35, 184.00)
+ --(316.98, 183.69)
+ --(316.60, 183.31)
+ --(316.22, 182.80)
+ --(315.91, 182.30)
+ --(315.65, 181.73)
+ --(315.40, 181.10)
+ --(315.21, 180.41)
+ --(315.02, 179.65)
+ --(314.83, 178.83)
+ --(314.71, 177.95)
+ --(314.65, 177.01)
+ --(314.58, 175.87)
+ --(314.52, 174.55)
+ --(314.46, 173.23)
+ --(314.52, 171.72)
+ --(314.52, 170.14)
+ --(314.65, 168.50)
+ --(314.71, 166.74)
+ --(314.90, 164.91)
+ --(315.09, 163.02)
+ --(315.28, 161.01)
+ --(315.53, 158.99)
+ --(315.78, 156.91)
+ --(316.09, 154.83)
+ --(316.41, 152.76)
+ --(316.79, 150.61)
+ --(317.17, 148.54)
+ --(317.61, 146.52)
+ --(317.98, 144.50)
+ --(318.43, 142.61)
+ --(318.93, 140.72)
+ --(319.37, 138.96)
+ --(319.87, 137.26)
+ --(320.31, 135.62)
+ --(320.82, 134.11)
+ --(321.32, 132.66)
+ --(321.89, 131.28)
+ --(322.65, 129.45)
+ --(323.46, 127.75)
+ --(324.35, 126.17)
+ --(325.23, 124.66)
+ --(326.17, 123.28)
+ --(327.12, 122.02)
+ --(328.13, 120.76)
+ --(329.13, 119.62)
+ --(330.14, 118.61)
+ --(331.15, 117.61)
+ --(332.09, 116.72)
+ --(333.04, 115.91)
+ --(333.92, 115.09)
+ --(334.80, 114.33)
+ --(335.56, 113.64)
+ --(336.25, 112.94)
+ --(336.94, 112.25)
+ --(337.51, 111.56)
+ --(338.14, 110.74)
+ --(338.71, 109.86)
+ --(339.21, 108.91)
+ --(339.65, 107.97)
+ --(340.03, 106.96)
+ --(340.41, 105.89)
+ --(340.66, 104.88)
+ --(340.85, 103.87)
+ --(341.04, 102.93)
+ --(341.10, 102.05)
+ --(341.10, 101.23)
+ --(341.04, 100.47)
+ --(340.98, 99.84)
+ --(340.79, 99.34)
+ --(340.60, 98.96)
+ --(340.35, 98.71)
+ --(340.03, 98.52)
+ --(339.59, 98.46)
+ --(339.15, 98.58)
+ --(338.58, 98.83)
+ --(337.89, 99.21)
+ --(337.13, 99.72)
+ --(336.38, 100.28)
+ --(335.50, 100.91)
+ --(334.55, 101.67)
+ --(333.54, 102.36)
+ --(332.54, 103.12)
+ --(331.53, 103.87)
+ --(330.46, 104.57)
+ --(329.39, 105.26)
+ --(328.38, 105.83)
+ --(327.37, 106.46)
+ --(326.24, 107.02)
+ --(325.10, 107.59)
+ --(323.91, 108.22)
+ --(322.71, 108.79)
+ --(321.45, 109.42)
+ --(320.25, 110.05)
+ --(318.99, 110.68)
+ --(317.86, 111.24)
+ --(316.72, 111.87)
+ --(315.72, 112.50)
+ --(314.77, 113.13)
+ --(313.89, 113.76)
+ --(313.13, 114.39)
+ --(312.44, 115.02)
+ --(311.81, 115.65)
+ --(311.24, 116.35)
+ --(310.80, 117.10)
+ --(310.36, 117.98)
+ --(309.92, 118.87)
+ --(309.54, 119.81)
+ --(309.23, 120.88)
+ --(308.91, 122.02)
+ --(308.66, 123.21)
+ --(308.35, 124.41)
+ --(308.09, 125.73)
+ --(307.91, 127.06)
+ --(307.65, 128.44)
+ --(307.34, 129.83)
+ --(307.09, 131.34)
+ --(306.77, 132.85)
+ --(306.52, 134.11)
+ --(306.20, 135.43)
+ --(305.89, 136.82)
+ --(305.51, 138.27)
+ --(305.13, 139.78)
+ --(304.69, 141.29)
+ --(304.25, 142.87)
+ --(303.75, 144.44)
+ --(303.24, 145.95)
+ --(302.74, 147.46)
+ --(302.17, 148.91)
+ --(301.61, 150.24)
+ --(301.04, 151.50)
+ --(300.47, 152.69)
+ --(299.91, 153.70)
+ --(299.34, 154.58)
+ --(298.77, 155.34)
+ --(298.20, 155.91)
+ --(297.64, 156.35)
+ --(297.07, 156.66)
+ --(296.50, 156.79)
+ --(295.94, 156.79)
+ --(295.37, 156.60)
+ --(294.74, 156.28)
+ --(294.17, 155.84)
+ --(293.54, 155.21)
+ --(292.91, 154.52)
+ --(292.28, 153.57)
+ --(291.65, 152.57)
+ --(291.09, 151.43)
+ --(290.46, 150.24)
+ --(289.89, 148.91)
+ --(289.32, 147.53)
+ --(288.82, 146.08)
+ --(288.31, 144.57)
+ --(287.87, 143.06)
+ --(287.43, 141.54)
+ --(287.06, 140.03)
+ --(286.74, 138.52)
+ --(286.43, 136.94)
+ --(286.17, 135.50)
+ --(285.92, 134.11)
+ --(285.67, 132.60)
+ --(285.42, 131.09)
+ --(285.23, 129.57)
+ --(284.98, 128.00)
+ --(284.79, 126.36)
+ --(284.54, 124.79)
+ --(284.22, 123.15)
+ --(283.97, 121.51)
+ --(283.65, 119.87)
+ --(283.34, 118.30)
+ --(282.96, 116.72)
+ --(282.58, 115.21)
+ --(282.14, 113.70)
+ --(281.70, 112.31)
+ --(281.20, 110.99)
+ --(280.63, 109.67)
+ --(280.00, 108.47)
+ --(279.37, 107.34)
+ --(278.68, 106.27)
+ --(277.98, 105.26)
+ --(277.04, 104.25)
+ --(276.03, 103.24)
+ --(274.96, 102.30)
+ --(273.83, 101.42)
+ --(272.57, 100.54)
+ --(271.24, 99.72)
+ --(269.92, 98.96)
+ --(268.47, 98.27)
+ --(267.02, 97.57)
+ --(265.57, 97.01)
+ --(264.13, 96.50)
+ --(262.74, 96.00)
+ --(261.35, 95.62)
+ --(260.09, 95.31)
+ --(258.83, 95.06)
+ --(257.70, 94.87)
+ --(256.69, 94.68)
+ --(255.75, 94.61)
+ --(254.87, 94.61)
+ --(254.17, 94.61)
+ --(253.73, 94.68)
+ --(253.29, 94.74)
+ --(252.98, 94.80)
+ --(252.66, 94.87)
+ --(252.35, 94.99)
+ --(252.09, 95.12)
+ --(251.91, 95.31)
+ --(251.78, 95.50)
+ --(251.65, 95.69)
+ --(251.53, 95.87)
+ --(251.53, 96.13)
+ --(251.46, 96.31)
+ --(251.53, 96.57)
+ --(251.59, 96.88)
+ --(251.65, 97.13)
+ --(251.78, 97.39)
+ --(251.91, 97.70)
+ --(252.09, 97.95)
+ --(252.28, 98.27)
+ --(252.54, 98.58)
+ --(252.79, 98.83)
+ --(253.04, 99.15)
+ --(253.35, 99.40)
+ --(253.67, 99.72)
+ --(253.98, 99.97)
+ --(254.30, 100.22)
+ --(254.68, 100.47)
+ --(254.99, 100.72)
+ --(255.37, 100.98)
+ --(255.75, 101.23)
+ --(256.44, 101.67)
+ --(257.20, 102.05)
+ --(258.02, 102.49)
+ --(258.83, 102.93)
+ --(259.72, 103.37)
+ --(260.66, 103.94)
+ --(261.54, 104.50)
+ --(262.49, 105.20)
+ --(263.37, 105.89)
+ --(264.31, 106.71)
+ --(265.13, 107.59)
+ --(265.95, 108.54)
+ --(266.71, 109.61)
+ --(267.34, 110.80)
+ --(267.97, 112.06)
+ --(268.54, 113.39)
+ --(268.91, 114.52)
+ --(269.29, 115.72)
+ --(269.61, 116.98)
+ --(269.92, 118.36)
+ --(270.24, 119.81)
+ --(270.55, 121.32)
+ --(270.80, 122.96)
+ --(271.06, 124.66)
+ --(271.37, 126.43)
+ --(271.56, 128.19)
+ --(271.81, 130.08)
+ --(272.06, 131.91)
+ --(272.25, 133.73)
+ --(272.50, 135.62)
+ --(272.69, 137.39)
+ --(272.94, 139.15)
+ --(273.13, 140.91)
+ --(273.32, 142.55)
+ --(273.51, 144.13)
+ --(273.76, 145.64)
+ --(273.95, 147.09)
+ --(274.20, 148.47)
+ --(274.52, 150.17)
+ --(274.83, 151.75)
+ --(275.15, 153.26)
+ --(275.53, 154.83)
+ --(275.91, 156.28)
+ --(276.35, 157.80)
+ --(276.72, 159.24)
+ --(277.17, 160.63)
+ --(277.61, 162.08)
+ --(277.98, 163.40)
+ --(278.43, 164.72)
+ --(278.80, 165.98)
+ --(279.12, 167.18)
+ --(279.50, 168.31)
+ --(279.81, 169.45)
+ --(280.06, 170.52)
+ --(280.31, 171.59)
+ --(280.50, 172.66)
+ --(280.69, 173.86)
+ --(280.88, 175.06)
+ --(280.94, 176.31)
+ --(281.01, 177.57)
+ --(281.01, 178.83)
+ --(281.01, 180.09)
+ --(280.88, 181.35)
+ --(280.69, 182.55)
+ --(280.38, 183.62)
+ --(280.06, 184.69)
+ --(279.69, 185.57)
+ --(279.24, 186.39)
+ --(278.68, 187.09)
+ --(278.11, 187.65)
+ --(277.48, 188.03)
+ --(276.72, 188.28)
+ --(276.03, 188.47)
+ --(275.28, 188.47)
+ --(274.46, 188.41)
+ --(273.51, 188.28)
+ --(272.50, 188.03)
+ --(271.43, 187.72)
+ --(270.30, 187.28)
+ --(269.10, 186.77)
+ --(267.91, 186.20)
+ --(266.65, 185.57)
+ --(265.39, 184.88)
+ --(264.13, 184.13)
+ --(262.87, 183.37)
+ --(261.61, 182.61)
+ --(260.41, 181.86)
+ --(259.28, 181.04)
+ --(258.08, 180.28)
+ --(257.01, 179.53)
+ --(255.87, 178.77)
+ --(254.80, 177.95)
+ --(253.73, 177.20)
+ --(252.66, 176.38)
+ --(251.59, 175.50)
+ --(250.52, 174.61)
+ --(249.51, 173.67)
+ --(248.57, 172.72)
+ --(247.62, 171.78)
+ --(246.80, 170.83)
+ --(246.05, 169.83)
+ --(245.35, 168.82)
+ --(244.79, 167.81)
+ --(244.35, 166.87)
+ --(243.97, 165.86)
+ --(243.72, 164.91)
+ --(243.53, 163.91)
+ --(243.53, 162.90)
+ --(243.53, 161.89)
+ --(243.72, 160.82)
+ --(243.97, 159.75)
+ --(244.28, 158.55)
+ --(244.72, 157.35)
+ --(245.17, 156.16)
+ --(245.73, 154.83)
+ --(246.36, 153.51)
+ --(246.99, 152.19)
+ --(247.69, 150.87)
+ --(248.31, 149.54)
+ --(249.01, 148.28)
+ --(249.70, 147.02)
+ --(250.27, 145.76)
+ --(250.90, 144.57)
+ --(251.40, 143.43)
+ --(251.91, 142.36)
+ --(252.28, 141.29)
+ --(252.66, 140.09)
+ --(253.04, 138.96)
+ --(253.29, 137.76)
+ --(253.48, 136.63)
+ --(253.54, 135.43)
+ --(253.61, 134.30)
+ --(253.61, 133.10)
+ --(253.54, 131.97)
+ --(253.42, 130.90)
+ --(253.29, 129.83)
+ --(253.10, 128.82)
+ --(252.85, 127.87)
+ --(252.60, 126.99)
+ --(252.28, 126.17)
+ --(251.97, 125.42)
+ --(251.65, 124.72)
+ --(251.34, 124.03)
+ --(250.96, 123.34)
+ --(250.58, 122.71)
+ --(250.20, 122.08)
+ --(249.83, 121.51)
+ --(249.32, 121.01)
+ --(248.88, 120.50)
+ --(248.38, 120.00)
+ --(247.94, 119.62)
+ --(247.43, 119.31)
+ --(246.93, 119.06)
+ --(246.43, 118.87)
+ --(245.92, 118.74)
+ --(245.42, 118.68)
+ --(244.98, 118.68)
+ --(244.47, 118.74)
+ --(243.91, 118.93)
+ --(243.34, 119.18)
+ --(242.77, 119.50)
+ --(242.14, 119.94)
+ --(241.57, 120.38)
+ --(241.01, 120.94)
+ --(240.50, 121.57)
+ --(240.00, 122.20)
+ --(239.62, 122.90)
+ --(239.31, 123.53)
+ --(238.99, 124.16)
+ --(238.87, 124.79)
+ --(238.80, 125.42)
+ --(238.80, 125.98)
+ --(238.93, 126.61)
+ --(239.18, 127.24)
+ --(239.50, 127.87)
+ --(239.94, 128.50)
+ --(240.44, 129.13)
+ --(241.01, 129.83)
+ --(241.51, 130.52)
+ --(242.02, 131.21)
+ --(242.46, 131.91)
+ --(242.77, 132.60)
+ --(243.02, 133.35)
+ --(243.15, 134.11)
+ --(243.21, 134.80)
+ --(243.09, 135.56)
+ --(242.96, 136.38)
+ --(242.71, 137.26)
+ --(242.39, 138.20)
+ --(242.02, 139.15)
+ --(241.51, 140.16)
+ --(241.01, 141.17)
+ --(240.50, 142.17)
+ --(239.94, 143.12)
+ --(239.43, 144.06)
+ --(238.87, 145.01)
+ --(238.36, 145.83)
+ --(237.86, 146.65)
+ --(237.42, 147.34)
+ --(237.04, 148.03)
+ --(236.60, 148.66)
+ --(236.16, 149.29)
+ --(235.72, 149.92)
+ --(235.21, 150.55)
+ --(234.77, 151.06)
+ --(234.27, 151.56)
+ --(233.76, 151.94)
+ --(233.20, 152.31)
+ --(232.69, 152.57)
+ --(232.13, 152.76)
+ --(231.56, 152.82)
+ --(230.99, 152.82)
+ --(230.36, 152.76)
+ --(229.73, 152.57)
+ --(228.98, 152.25)
+ --(228.16, 151.87)
+ --(227.28, 151.37)
+ --(226.33, 150.80)
+ --(225.32, 150.17)
+ --(224.31, 149.54)
+ --(223.31, 148.91)
+ --(222.36, 148.35)
+ --(221.42, 147.91)
+ --(220.47, 147.53)
+ --(219.72, 147.28)
+ --(218.96, 147.21)
+ --(218.33, 147.28)
+ --(217.83, 147.53)
+ --(217.51, 147.84)
+ --(217.20, 148.28)
+ --(216.94, 148.79)
+ --(216.76, 149.42)
+ --(216.63, 150.17)
+ --(216.57, 150.99)
+ --(216.57, 151.94)
+ --(216.63, 153.01)
+ --(216.76, 154.14)
+ --(216.94, 155.34)
+ --(217.20, 156.66)
+ --(217.51, 157.98)
+ --(217.95, 159.37)
+ --(218.46, 160.82)
+ --(219.02, 162.27)
+ --(219.65, 163.72)
+ --(220.35, 165.17)
+ --(221.10, 166.61)
+ --(221.92, 168.06)
+ --(222.87, 169.51)
+ --(223.56, 170.65)
+ --(224.38, 171.78)
+ --(225.26, 172.98)
+ --(226.14, 174.17)
+ --(227.15, 175.43)
+ --(228.16, 176.69)
+ --(229.23, 178.02)
+ --(230.36, 179.34)
+ --(231.50, 180.72)
+ --(232.69, 182.17)
+ --(233.89, 183.62)
+ --(235.15, 185.13)
+ --(236.41, 186.65)
+ --(237.67, 188.16)
+ --(238.93, 189.67)
+ --(240.13, 191.24)
+ --(241.32, 192.82)
+ --(242.52, 194.33)
+ --(243.65, 195.91)
+ --(244.79, 197.42)
+ --(245.86, 198.93)
+ --(246.87, 200.44)
+ --(247.81, 201.95)
+ --(248.76, 203.46)
+ --(249.57, 204.98)
+ --(250.39, 206.49)--cycle;
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.50,0.19,0.00) + -0.15white);
+ draw p withcolor (0.50,0.19,0.00);
+% End polyline object
+% Begin polyline object
+ linecap:=0;
+ linejoin:=2;
+ pickup pencircle scaled 0.94;
+ path p;
+ p = (187.09, 400.82)
+ --(183.18, 400.38)
+ --(179.28, 399.94)
+ --(175.43, 399.37)
+ --(171.72, 398.80)
+ --(168.19, 398.11)
+ --(164.85, 397.35)
+ --(161.70, 396.54)
+ --(158.87, 395.65)
+ --(156.22, 394.71)
+ --(153.83, 393.70)
+ --(151.62, 392.63)
+ --(149.61, 391.56)
+ --(147.72, 390.43)
+ --(146.02, 389.23)
+ --(144.44, 388.03)
+ --(142.93, 386.90)
+ --(141.48, 385.70)
+ --(140.09, 384.50)
+ --(138.71, 383.37)
+ --(137.26, 382.30)
+ --(135.81, 381.23)
+ --(134.30, 380.22)
+ --(132.66, 379.34)
+ --(130.90, 378.52)
+ --(129.07, 377.89)
+ --(127.06, 377.39)
+ --(124.85, 377.01)
+ --(122.46, 376.88)
+ --(119.94, 377.01)
+ --(117.23, 377.39)
+ --(114.33, 378.02)
+ --(111.37, 379.02)
+ --(108.28, 380.35)
+ --(105.20, 382.05)
+ --(102.17, 384.19)
+ --(99.21, 386.65)
+ --(96.88, 389.04)
+ --(94.68, 391.69)
+ --(92.72, 394.46)
+ --(90.96, 397.29)
+ --(89.39, 400.19)
+ --(88.00, 403.02)
+ --(86.74, 405.86)
+ --(85.73, 408.57)
+ --(84.85, 411.21)
+ --(84.09, 413.73)
+ --(83.53, 416.19)
+ --(83.02, 418.46)
+ --(82.65, 420.66)
+ --(82.39, 422.80)
+ --(82.14, 424.76)
+ --(82.08, 426.71)
+ --(82.02, 428.54)
+ --(82.02, 430.36)
+ --(82.02, 432.06)
+ --(82.08, 433.83)
+ --(82.20, 435.53)
+ --(82.33, 437.29)
+ --(82.46, 439.06)
+ --(82.58, 440.88)
+ --(82.77, 442.77)
+ --(82.90, 444.72)
+ --(83.02, 446.80)
+ --(83.15, 449.01)
+ --(83.28, 451.40)
+ --(83.40, 453.86)
+ --(83.46, 456.57)
+ --(83.59, 459.40)
+ --(83.65, 462.49)
+ --(83.72, 465.76)
+ --(83.78, 469.17)
+ --(83.84, 472.82)
+ --(83.97, 476.60)
+ --(84.03, 480.57)
+ --(84.22, 484.66)
+ --(84.41, 488.82)
+ --(84.66, 493.04)
+ --(85.04, 497.20)
+ --(85.67, 502.49)
+ --(86.43, 507.46)
+ --(87.24, 512.00)
+ --(88.13, 516.09)
+ --(89.07, 519.69)
+ --(90.08, 522.77)
+ --(91.02, 525.35)
+ --(91.97, 527.50)
+ --(92.85, 529.20)
+ --(93.80, 530.52)
+ --(94.61, 531.46)
+ --(95.50, 532.22)
+ --(96.31, 532.66)
+ --(97.13, 533.04)
+ --(97.95, 533.23)
+ --(98.77, 533.35)
+ --(99.53, 533.48)
+ --(100.41, 533.61)
+ --(101.23, 533.80)
+ --(102.11, 534.17)
+ --(103.06, 534.68)
+ --(104.00, 535.43)
+ --(105.01, 536.44)
+ --(106.08, 537.76)
+ --(107.21, 539.40)
+ --(108.41, 541.35)
+ --(109.67, 543.69)
+ --(110.93, 546.33)
+ --(112.25, 549.29)
+ --(113.64, 552.57)
+ --(114.96, 556.03)
+ --(116.22, 559.56)
+ --(117.54, 563.53)
+ --(118.74, 567.37)
+ --(119.69, 570.90)
+ --(120.38, 574.05)
+ --(120.76, 576.82)
+ --(120.94, 579.28)
+ --(120.88, 581.29)
+ --(120.63, 582.99)
+ --(120.13, 584.44)
+ --(119.56, 585.57)
+ --(118.80, 586.52)
+ --(117.98, 587.34)
+ --(117.10, 587.97)
+ --(116.22, 588.60)
+ --(115.34, 589.23)
+ --(114.52, 589.86)
+ --(113.83, 590.55)
+ --(113.26, 591.37)
+ --(112.82, 592.38)
+ --(112.69, 593.51)
+ --(112.82, 594.90)
+ --(113.26, 596.54)
+ --(114.02, 598.43)
+ --(115.28, 600.50)
+ --(116.91, 602.90)
+ --(119.06, 605.42)
+ --(121.70, 608.00)
+ --(124.72, 610.58)
+ --(127.37, 612.47)
+ --(130.08, 614.30)
+ --(132.85, 615.94)
+ --(135.62, 617.45)
+ --(138.27, 618.77)
+ --(140.72, 619.91)
+ --(143.12, 620.91)
+ --(145.26, 621.80)
+ --(147.21, 622.49)
+ --(149.04, 623.06)
+ --(150.61, 623.56)
+ --(152.13, 623.94)
+ --(153.45, 624.19)
+ --(154.65, 624.38)
+ --(155.72, 624.57)
+ --(156.79, 624.63)
+ --(157.73, 624.69)
+ --(158.74, 624.76)
+ --(159.75, 624.76)
+ --(160.82, 624.82)
+ --(161.95, 624.88)
+ --(163.21, 624.94)
+ --(164.60, 625.01)
+ --(166.17, 625.13)
+ --(167.94, 625.32)
+ --(170.02, 625.51)
+ --(172.35, 625.76)
+ --(174.93, 626.14)
+ --(177.83, 626.52)
+ --(181.10, 626.96)
+ --(184.69, 627.46)
+ --(188.66, 628.03)
+ --(192.88, 628.66)
+ --(197.35, 629.23)
+ --(202.08, 629.86)
+ --(206.93, 630.43)
+ --(211.53, 630.93)
+ --(216.13, 631.37)
+ --(220.47, 631.75)
+ --(224.63, 632.13)
+ --(228.54, 632.44)
+ --(232.13, 632.69)
+ --(235.40, 632.94)
+ --(238.36, 633.20)
+ --(240.94, 633.39)
+ --(243.28, 633.57)
+ --(245.29, 633.70)
+ --(247.06, 633.89)
+ --(248.57, 634.02)
+ --(249.95, 634.14)
+ --(251.09, 634.27)
+ --(252.09, 634.39)
+ --(252.98, 634.52)
+ --(253.86, 634.58)
+ --(254.68, 634.71)
+ --(255.43, 634.77)
+ --(256.25, 634.83)
+ --(257.20, 634.90)
+ --(258.20, 634.90)
+ --(259.28, 634.90)
+ --(260.60, 634.90)
+ --(262.11, 634.90)
+ --(263.81, 634.83)
+ --(265.76, 634.71)
+ --(268.03, 634.58)
+ --(270.55, 634.39)
+ --(273.39, 634.14)
+ --(276.54, 633.83)
+ --(280.00, 633.45)
+ --(283.72, 633.01)
+ --(287.69, 632.50)
+ --(291.84, 631.87)
+ --(296.13, 631.18)
+ --(300.47, 630.43)
+ --(305.26, 629.48)
+ --(309.86, 628.41)
+ --(314.14, 627.34)
+ --(318.11, 626.20)
+ --(321.64, 625.07)
+ --(324.85, 624.00)
+ --(327.62, 622.93)
+ --(330.02, 621.86)
+ --(332.03, 620.85)
+ --(333.73, 619.84)
+ --(335.12, 618.90)
+ --(336.25, 617.95)
+ --(337.13, 617.07)
+ --(337.89, 616.19)
+ --(338.52, 615.31)
+ --(339.02, 614.49)
+ --(339.46, 613.67)
+ --(339.91, 612.85)
+ --(340.35, 611.97)
+ --(340.91, 611.15)
+ --(341.54, 610.33)
+ --(342.36, 609.45)
+ --(343.31, 608.57)
+ --(344.50, 607.69)
+ --(345.95, 606.80)
+ --(347.72, 605.86)
+ --(349.73, 604.91)
+ --(352.06, 603.97)
+ --(354.65, 603.09)
+ --(357.61, 602.14)
+ --(360.76, 601.32)
+ --(364.22, 600.50)
+ --(367.75, 599.81)
+ --(371.34, 599.24)
+ --(375.62, 598.74)
+ --(379.65, 598.49)
+ --(383.31, 598.43)
+ --(386.52, 598.55)
+ --(389.29, 598.87)
+ --(391.62, 599.31)
+ --(393.51, 599.87)
+ --(395.02, 600.57)
+ --(396.16, 601.32)
+ --(396.98, 602.14)
+ --(397.61, 603.02)
+ --(397.98, 603.97)
+ --(398.30, 604.91)
+ --(398.49, 605.86)
+ --(398.74, 606.80)
+ --(398.99, 607.75)
+ --(399.37, 608.69)
+ --(399.87, 609.57)
+ --(400.63, 610.46)
+ --(401.64, 611.21)
+ --(403.02, 611.97)
+ --(404.72, 612.60)
+ --(406.74, 613.10)
+ --(409.26, 613.48)
+ --(412.09, 613.73)
+ --(415.31, 613.86)
+ --(418.77, 613.73)
+ --(422.36, 613.42)
+ --(425.32, 613.04)
+ --(428.28, 612.54)
+ --(430.99, 612.09)
+ --(433.57, 611.59)
+ --(435.91, 611.21)
+ --(437.98, 610.90)
+ --(439.81, 610.65)
+ --(441.39, 610.52)
+ --(442.77, 610.52)
+ --(443.91, 610.58)
+ --(444.85, 610.77)
+ --(445.61, 611.02)
+ --(446.24, 611.34)
+ --(446.74, 611.72)
+ --(447.18, 612.09)
+ --(447.56, 612.54)
+ --(447.87, 612.98)
+ --(448.19, 613.29)
+ --(448.57, 613.61)
+ --(449.01, 613.80)
+ --(449.51, 613.92)
+ --(450.14, 613.80)
+ --(450.90, 613.54)
+ --(451.84, 613.04)
+ --(452.98, 612.28)
+ --(454.36, 611.21)
+ --(455.94, 609.83)
+ --(457.76, 608.00)
+ --(459.84, 605.80)
+ --(462.17, 603.15)
+ --(464.76, 600.00)
+ --(467.46, 596.41)
+ --(470.43, 592.38)
+ --(473.39, 587.91)
+ --(475.59, 584.38)
+ --(477.80, 580.66)
+ --(479.94, 576.94)
+ --(482.02, 573.17)
+ --(484.03, 569.39)
+ --(485.92, 565.73)
+ --(487.75, 562.14)
+ --(489.45, 558.61)
+ --(491.09, 555.28)
+ --(492.66, 552.06)
+ --(494.05, 548.98)
+ --(495.43, 546.08)
+ --(496.69, 543.31)
+ --(497.83, 540.66)
+ --(498.96, 538.08)
+ --(499.97, 535.69)
+ --(500.98, 533.42)
+ --(501.92, 531.21)
+ --(502.80, 529.07)
+ --(503.62, 526.99)
+ --(504.44, 524.98)
+ --(505.20, 523.02)
+ --(506.02, 521.07)
+ --(506.71, 519.12)
+ --(507.46, 517.10)
+ --(508.22, 515.09)
+ --(508.98, 513.07)
+ --(509.73, 510.93)
+ --(510.55, 508.72)
+ --(511.31, 506.46)
+ --(512.13, 504.00)
+ --(512.94, 501.54)
+ --(513.83, 498.90)
+ --(514.71, 496.13)
+ --(515.59, 493.17)
+ --(516.54, 490.14)
+ --(517.42, 486.93)
+ --(518.36, 483.59)
+ --(519.31, 480.13)
+ --(520.19, 476.60)
+ --(521.07, 472.94)
+ --(521.95, 469.23)
+ --(522.71, 465.51)
+ --(523.40, 461.80)
+ --(523.97, 458.14)
+ --(524.41, 454.68)
+ --(524.79, 449.39)
+ --(524.79, 444.79)
+ --(524.47, 440.94)
+ --(523.78, 437.80)
+ --(522.83, 435.40)
+ --(521.70, 433.64)
+ --(520.44, 432.44)
+ --(518.99, 431.81)
+ --(517.42, 431.62)
+ --(515.78, 431.81)
+ --(514.08, 432.25)
+ --(512.38, 433.01)
+ --(510.61, 433.89)
+ --(508.79, 434.83)
+ --(507.02, 435.84)
+ --(505.26, 436.85)
+ --(503.50, 437.73)
+ --(501.73, 438.55)
+ --(500.03, 439.18)
+ --(498.39, 439.56)
+ --(496.82, 439.69)
+ --(495.31, 439.56)
+ --(493.98, 439.06)
+ --(492.79, 438.24)
+ --(491.78, 437.04)
+ --(491.02, 435.59)
+ --(490.58, 433.89)
+ --(490.39, 432.00)
+ --(490.58, 429.92)
+ --(491.15, 427.91)
+ --(492.03, 426.02)
+ --(493.17, 424.25)
+ --(494.55, 422.74)
+ --(496.06, 421.42)
+ --(497.76, 420.28)
+ --(499.53, 419.34)
+ --(501.42, 418.58)
+ --(503.37, 417.89)
+ --(505.32, 417.32)
+ --(507.28, 416.88)
+ --(509.29, 416.38)
+ --(511.24, 415.94)
+ --(513.20, 415.50)
+ --(515.15, 414.93)
+ --(516.98, 414.24)
+ --(518.74, 413.48)
+ --(520.38, 412.54)
+ --(521.83, 411.40)
+ --(523.09, 410.08)
+ --(524.09, 408.57)
+ --(524.79, 406.80)
+ --(525.17, 404.91)
+ --(525.04, 402.90)
+ --(524.41, 400.82)
+ --(523.46, 399.06)
+ --(522.20, 397.42)
+ --(520.76, 395.84)
+ --(519.18, 394.52)
+ --(517.54, 393.39)
+ --(515.91, 392.44)
+ --(514.27, 391.69)
+ --(512.69, 391.12)
+ --(511.18, 390.68)
+ --(509.67, 390.43)
+ --(508.28, 390.30)
+ --(506.90, 390.24)
+ --(505.57, 390.24)
+ --(504.25, 390.36)
+ --(502.93, 390.43)
+ --(501.54, 390.49)
+ --(500.16, 390.55)
+ --(498.65, 390.55)
+ --(497.07, 390.49)
+ --(495.37, 390.30)
+ --(493.48, 389.98)
+ --(491.46, 389.48)
+ --(489.20, 388.85)
+ --(486.74, 387.97)
+ --(484.03, 386.90)
+ --(481.07, 385.57)
+ --(477.98, 384.00)
+ --(474.65, 382.24)
+ --(471.24, 380.28)
+ --(467.72, 378.14)
+ --(464.25, 375.94)
+ --(460.91, 373.73)
+ --(457.83, 371.53)
+ --(455.06, 369.39)
+ --(452.47, 367.31)
+ --(450.27, 365.42)
+ --(448.38, 363.59)
+ --(446.74, 361.89)
+ --(445.42, 360.31)
+ --(444.28, 358.80)
+ --(443.34, 357.42)
+ --(442.52, 356.09)
+ --(441.89, 354.83)
+ --(441.32, 353.57)
+ --(440.76, 352.38)
+ --(440.25, 351.24)
+ --(439.75, 350.05)
+ --(439.12, 348.85)
+ --(438.43, 347.72)
+ --(437.61, 346.46)
+ --(436.66, 345.26)
+ --(435.53, 344.00)
+ --(434.14, 342.74)
+ --(432.63, 341.48)
+ --(430.80, 340.22)
+ --(428.85, 339.02)
+ --(426.65, 337.89)
+ --(424.31, 336.94)
+ --(421.92, 336.13)
+ --(419.53, 335.62)
+ --(416.88, 335.37)
+ --(414.55, 335.50)
+ --(412.47, 335.81)
+ --(410.77, 336.38)
+ --(409.45, 337.01)
+ --(408.44, 337.64)
+ --(407.81, 338.33)
+ --(407.43, 339.09)
+ --(407.31, 339.72)
+ --(407.37, 340.41)
+ --(407.56, 341.10)
+ --(407.87, 341.80)
+ --(408.19, 342.49)
+ --(408.50, 343.24)
+ --(408.82, 344.06)
+ --(409.01, 344.94)
+ --(409.07, 346.02)
+ --(408.94, 347.28)
+ --(408.57, 348.66)
+ --(407.94, 350.36)
+ --(406.93, 352.31)
+ --(405.61, 354.58)
+ --(403.91, 357.17)
+ --(401.83, 360.06)
+ --(399.50, 363.34)
+ --(396.85, 366.80)
+ --(394.71, 369.57)
+ --(392.63, 372.41)
+ --(390.49, 375.18)
+ --(388.54, 377.89)
+ --(386.65, 380.47)
+ --(384.88, 382.87)
+ --(383.31, 385.13)
+ --(381.92, 387.21)
+ --(380.60, 389.17)
+ --(379.53, 390.93)
+ --(378.52, 392.57)
+ --(377.64, 394.08)
+ --(376.88, 395.46)
+ --(376.19, 396.79)
+ --(375.56, 397.98)
+ --(374.99, 399.18)
+ --(374.43, 400.38)
+ --(373.86, 401.51)
+ --(373.23, 402.65)
+ --(372.60, 403.84)
+ --(371.84, 405.10)
+ --(371.02, 406.43)
+ --(370.08, 407.81)
+ --(369.01, 409.32)
+ --(367.75, 410.90)
+ --(366.36, 412.66)
+ --(364.79, 414.49)
+ --(362.96, 416.44)
+ --(361.01, 418.52)
+ --(358.80, 420.66)
+ --(356.47, 422.87)
+ --(353.95, 425.01)
+ --(351.31, 427.15)
+ --(348.66, 429.17)
+ --(345.20, 431.50)
+ --(341.92, 433.39)
+ --(338.96, 434.90)
+ --(336.31, 435.97)
+ --(333.98, 436.66)
+ --(332.09, 436.98)
+ --(330.52, 437.04)
+ --(329.20, 436.79)
+ --(328.19, 436.35)
+ --(327.37, 435.72)
+ --(326.74, 434.96)
+ --(326.24, 434.08)
+ --(325.73, 433.20)
+ --(325.29, 432.25)
+ --(324.79, 431.37)
+ --(324.22, 430.55)
+ --(323.46, 429.80)
+ --(322.52, 429.17)
+ --(321.39, 428.72)
+ --(320.00, 428.47)
+ --(318.30, 428.41)
+ --(316.35, 428.60)
+ --(314.08, 429.04)
+ --(311.56, 429.80)
+ --(308.91, 430.80)
+ --(306.14, 432.00)
+ --(303.24, 433.51)
+ --(300.60, 435.09)
+ --(298.27, 436.66)
+ --(296.31, 438.24)
+ --(294.74, 439.69)
+ --(293.48, 441.07)
+ --(292.54, 442.33)
+ --(291.91, 443.46)
+ --(291.46, 444.54)
+ --(291.21, 445.48)
+ --(291.09, 446.43)
+ --(291.02, 447.37)
+ --(290.96, 448.25)
+ --(290.83, 449.20)
+ --(290.58, 450.20)
+ --(290.27, 451.28)
+ --(289.64, 452.47)
+ --(288.82, 453.73)
+ --(287.75, 455.12)
+ --(286.30, 456.63)
+ --(284.60, 458.20)
+ --(282.52, 459.91)
+ --(280.25, 461.61)
+ --(277.80, 463.18)
+ --(275.09, 464.76)
+ --(272.50, 466.08)
+ --(270.11, 467.15)
+ --(267.97, 468.03)
+ --(266.14, 468.66)
+ --(264.50, 469.17)
+ --(263.06, 469.54)
+ --(261.86, 469.73)
+ --(260.79, 469.92)
+ --(259.78, 469.98)
+ --(258.90, 470.05)
+ --(258.02, 470.05)
+ --(257.13, 470.05)
+ --(256.19, 469.98)
+ --(255.18, 469.98)
+ --(254.11, 469.98)
+ --(252.91, 469.92)
+ --(251.59, 469.86)
+ --(250.27, 469.73)
+ --(248.94, 469.54)
+ --(247.69, 469.29)
+ --(246.61, 468.85)
+ --(245.80, 468.09)
+ --(245.42, 467.28)
+ --(245.54, 466.58)
+ --(245.98, 465.95)
+ --(246.74, 465.51)
+ --(247.75, 465.26)
+ --(248.88, 465.13)
+ --(250.08, 465.07)
+ --(251.34, 465.07)
+ --(252.60, 465.01)
+ --(253.86, 464.76)
+ --(255.06, 464.38)
+ --(256.13, 463.56)
+ --(257.01, 462.36)
+ --(257.70, 460.66)
+ --(258.14, 458.33)
+ --(258.20, 455.37)
+ --(257.95, 451.84)
+ --(257.57, 449.32)
+ --(257.13, 446.80)
+ --(256.57, 444.22)
+ --(256.06, 441.76)
+ --(255.56, 439.50)
+ --(255.12, 437.29)
+ --(254.74, 435.34)
+ --(254.36, 433.51)
+ --(254.11, 431.81)
+ --(253.86, 430.24)
+ --(253.67, 428.79)
+ --(253.54, 427.46)
+ --(253.35, 426.14)
+ --(253.23, 424.88)
+ --(253.04, 423.69)
+ --(252.85, 422.36)
+ --(252.54, 421.10)
+ --(252.16, 419.72)
+ --(251.65, 418.20)
+ --(251.02, 416.63)
+ --(250.20, 414.93)
+ --(249.20, 413.10)
+ --(248.00, 411.15)
+ --(246.49, 409.07)
+ --(244.79, 406.99)
+ --(242.77, 404.85)
+ --(240.57, 402.77)
+ --(238.11, 400.82)
+ --(235.53, 399.12)
+ --(232.94, 397.73)
+ --(230.49, 396.60)
+ --(228.16, 395.78)
+ --(226.14, 395.21)
+ --(224.38, 394.90)
+ --(222.93, 394.83)
+ --(221.73, 394.90)
+ --(220.79, 395.15)
+ --(220.03, 395.46)
+ --(219.46, 395.97)
+ --(218.96, 396.54)
+ --(218.58, 397.10)
+ --(218.27, 397.73)
+ --(217.89, 398.43)
+ --(217.45, 399.06)
+ --(216.88, 399.69)
+ --(216.06, 400.25)
+ --(215.06, 400.76)
+ --(213.67, 401.20)
+ --(211.97, 401.57)
+ --(209.83, 401.83)
+ --(207.24, 402.02)
+ --(204.09, 402.02)
+ --(200.50, 401.89)
+ --(196.41, 401.64)
+ --(191.94, 401.26)
+ --(187.09, 400.82)--cycle;
+ path f;
+ f = p--cycle;
+ fill f withcolor ((0.00,0.69,0.00) + 0.00white);
+ draw p withcolor (0.00,0.69,0.00);
+% End polyline object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex pelas folhas etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((260.79,669.17))+llcorner p) withcolor (0.00,0.00,1.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex CO$_2$ dissolvido etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((232.44,66.33))+llcorner p) withcolor (0.00,0.82,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex na chuva \'{e} absorvido etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((232.44,45.54))+llcorner p) withcolor (0.00,0.82,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex pelas ra\'{\i}zes etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((232.44,24.76))+llcorner p) withcolor (0.00,0.82,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex na chuva etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((462.05,320.50))+llcorner p) withcolor (0.00,0.00,1.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex folhas etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((87.87,346.96))+llcorner p) withcolor (0.00,0.00,0.56);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex caiem etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((87.87,326.17))+llcorner p) withcolor (0.00,0.00,0.56);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex decomposi\c{c}\~{a}o das etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((116.22,225.07))+llcorner p) withcolor (0.82,0.00,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex folhas liberta carbono etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((116.22,204.28))+llcorner p) withcolor (0.82,0.00,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex CO$_2$ absorvido etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((260.79,689.95))+llcorner p) withcolor (0.00,0.00,1.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex CO$_2$ dissolvido etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((462.05,341.29))+llcorner p) withcolor (0.00,0.00,1.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex CO$_2$ libertado etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((85.04,698.46))+llcorner p) withcolor (0.82,0.00,0.00);
+% End text object
+% Begin text object
+ picture q;
+ q=thelabel.urt(btex pela respira\c{c}\~{a}o etex scaled (17pt/fontsize defaultfont),(0,0));
+ picture p;
+ p = q rotated 0.00;
+ label.urt(p,((85.04,677.67))+llcorner p) withcolor (0.82,0.00,0.00);
+% End text object
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/trianglecenterofmass.mp b/graphics/metapost/contrib/macros/featpost/example/trianglecenterofmass.mp
new file mode 100644
index 0000000000..5074aae8a5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/trianglecenterofmass.mp
@@ -0,0 +1,43 @@
+% trianglecenterofmass.mp
+% L. Nobre G.
+% 2010
+
+%
+
+prologues := 1;
+
+beginfig(1);
+ numeric u;
+ u = 1cm;
+ z1 = origin;
+ z2 = (1u,0);
+ z3 = (1+uniformdeviate(4))*dir(5+uniformdeviate(80))*u;
+ draw z1--z2--z3--cycle withpen pencircle scaled 2pt;
+ numeric a, b, c, d;
+ a = (ypart z3)/3;
+ z4 = (0,a);
+ if (xpart z3) < (xpart z2):
+ d = xpart z2;
+ else:
+ d = xpart z3;
+ fi;
+ z5 = (d,a);
+ draw z4--z5 withcolor red;
+ z12 = (xpart z3,0);
+ z23 = whatever[z2,z3];
+ z230 = unitvector((-ypart (z3-z2),xpart (z3-z2)));
+ z23 = whatever[z1,z230];
+ z13 = whatever[z1,z3];
+ z130 = unitvector((ypart (z3-z1),-xpart (z3-z1)));
+ z13 = whatever[z2,z2+z130];
+ b = abs(z23)/3;
+ c = abs(z13-z2)/3;
+ z6 = z2+b*z230;
+ z7 = z3+b*z230;
+ draw z6--z7 withcolor green;
+ z8 = z3+c*z130;
+ z9 = z1+c*z130;
+ draw z8--z9 withcolor blue;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/triangulartrimesh.mp b/graphics/metapost/contrib/macros/featpost/example/triangulartrimesh.mp
new file mode 100644
index 0000000000..970d546590
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/triangulartrimesh.mp
@@ -0,0 +1,39 @@
+% triangulartrimesh.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+def zsurface( expr xc, yc ) =
+ cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4)
+enddef;
+
+f := 16*(4,1,1);
+Spread := 35;
+LightSource := 10*(4,-3,4);
+defaultfont := "cmvtt10";
+beginfig(1);
+ numeric np, ssize, lx, ly, topl, ystep, i, zl;
+ string L[];
+ L0 = "P";
+ L1 = "H";
+ L2 = "Y";
+ L3 = "S";
+ L4 = "I";
+ L5 = "C";
+ L6 = "S";
+ np = 72;
+ ssize = 15;
+ ly = -0.5*ssize;
+ lx = -sqrt(3)*ssize/6;
+ ystep = ssize/7;
+ topl = 2*zsurface( 0, 0 );
+ for i=0 upto 6:
+ zl := zsurface(lx,i*ystep+ly);
+ labelinspace(false,(lx,i*ystep+ly,zl),green*ystep,blue*(topl-zl),L[i]);
+ endfor;
+ hexagonaltrimesh( false,np,ssize,zsurface);
+ label.ulft("matagalatlante.org",lrcorner currentpicture);
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/trig.mp b/graphics/metapost/contrib/macros/featpost/example/trig.mp
new file mode 100644
index 0000000000..e1872df02b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/trig.mp
@@ -0,0 +1,84 @@
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+%prologues := 2;
+
+
+vardef trigonometry(expr ct)=
+
+ save z, p, m, pic;
+ numeric m;
+ pair z[];
+ path p[];
+ picture pic;
+
+ pic := nullpicture;
+ m := if (xpart ct) > (ypart ct): ypart ct else: xpart ct fi;
+
+ p0 = unitsquare xscaled (xpart ct) yscaled (ypart ct);
+ p3 = origin--ct;
+ p2 = (m,0)--(m,m)--(0,m);
+ p1 = (m,0){up}..{left}(0,m);
+
+ z0 = origin;
+ z2 = point 0 of p2;
+ z5 = point 2 of p2;
+ z6 = ct;
+ z3 = p1 intersectionpoint p3;
+ z4 = p2 intersectionpoint p3;
+ z1 = (xpart z3, 0);
+
+ p4 = z1--z3;
+ m := xpart (p2 intersectiontimes p3);
+ if m <= 1:
+ p5 = z2--z4;
+ p6 = z5--z6;
+ else:
+ p5 = z5--z4;
+ p6 = z2--z6;
+ fi;
+
+ m := top(0)-bot(0);
+
+ for i=0 upto 4:
+ addto pic doublepath p[i] withpen pencircle scaled (m/3);
+ endfor;
+ for i=3 upto 6:
+ addto pic doublepath p[i] withpen pencircle scaled m;
+ endfor;
+
+ for i=0 upto 6:
+ addto pic doublepath z[i] withpen pencircle scaled 3m;
+ endfor;
+
+ addto pic also thelabel.llft(btex \strut $a$ etex , z0);
+ addto pic also thelabel.bot(btex \strut $b$ etex, z1);
+ addto pic also thelabel.bot(btex \strut $c$ etex, z2);
+ addto pic also thelabel.lft(btex $d$ etex, z3);
+ addto pic also thelabel.ulft(btex $e$ etex, z4);
+ addto pic also thelabel.lft(btex \strut $f$ etex, z5);
+ addto pic also thelabel.rt(btex \strut $g$ etex, z6);
+
+ pic
+enddef;
+
+
+
+
+beginfig(1);
+
+pickup pencircle scaled .6pt;
+
+draw trigonometry((6cm,3cm));
+draw trigonometry((3cm,6cm))shifted (7cm,0);
+
+endfig;
+verbatimtex
+\end{document}
+etex
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/trigonometry.mp b/graphics/metapost/contrib/macros/featpost/example/trigonometry.mp
new file mode 100644
index 0000000000..fb7299ddaa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/trigonometry.mp
@@ -0,0 +1,89 @@
+% trigonometry.mp
+% L. Nobre G.
+% 2002
+
+% %input mp-tool;
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+def PickColor =
+ ( uniformdeviate(1) , uniformdeviate(1), 0 )
+enddef;
+
+beginfig(1);
+ picture sin, cos, tan, ctg, sec, csc;
+ color sincol, coscol, tancol, ctgcol, seccol, csccol;
+ pair sinl, cosl, tanl, ctgl, secl, cscl;
+ path sinp, cosp, tanp, ctgp, secp;
+ numeric Ang, U, len, labelscale;
+ path diag, fram, quar;
+ pair urc, ulc, lrc, tgc, sic, coc, btg;
+ pen basepen, thikpen, thinpen;
+ Ang = 21; % Ang < 45
+ U = 1.8in;
+ labelscale = 2;
+ basepen = pencircle scaled 1.2pt;
+ thikpen = pencircle scaled 3.4pt;
+ thinpen = pencircle scaled 1.2pt;
+ sincol = PickColor;
+ coscol = PickColor;
+ tancol = PickColor;
+ ctgcol = PickColor;
+ seccol = PickColor;
+ csccol = PickColor;
+ len = U * cosd( Ang ) / sind( Ang );
+ urc = ( len, U );
+ ulc = ( 0, U );
+ lrc = ( len, 0 );
+ tgc = ( U, U * sind( Ang ) / cosd( Ang ) );
+ sic = ( U * cosd( Ang ), U * sind( Ang ) );
+ coc = ( U * cosd( Ang ), 0 );
+ btg = ( U, 0 );
+ diag = origin--urc;
+ fram = origin--lrc--urc--ulc--cycle;
+ quar = halfcircle cutafter ( origin--up );
+ quar := quar scaled 2U;
+ draw fram withpen basepen;
+ draw quar withpen basepen;
+ sinl = 0.5[coc,sic];
+ sinp = coc--sic;
+ cosl = 0.5[origin,coc];
+ cosp = origin--coc;
+ tanl = 0.5[btg,tgc];
+ tanp = btg--tgc;
+ ctgl = 0.5[ulc,urc];
+ ctgp = ulc--urc;
+ secl = 0.5[origin,sic];
+ secp = origin--tgc;
+ cscl = 0.5[origin,urc];
+ draw diag withcolor csccol withpen thikpen;
+ draw secp withcolor seccol withpen thinpen;
+ draw ctgp withcolor ctgcol withpen thinpen;
+ draw tanp withcolor tancol withpen thinpen;
+ draw cosp withcolor coscol withpen thinpen;
+ draw sinp withcolor sincol withpen thinpen;
+ sin = thelabel.lft( btex sin etex scaled labelscale, sinl );
+ cos = thelabel.top( btex cos etex scaled labelscale, cosl );
+ tan = thelabel.rt( btex tan etex scaled labelscale, tanl );
+ ctg = thelabel.bot( btex cotan etex scaled labelscale, ctgl );
+ sec = thelabel.top( btex sec etex scaled labelscale, origin );
+ csc = thelabel.top( btex cosec etex scaled labelscale, origin );
+ draw sin withcolor sincol;
+ draw cos withcolor coscol;
+ draw tan withcolor tancol;
+ draw ctg withcolor ctgcol;
+ draw sec rotated Ang shifted secl withcolor seccol;
+ draw csc rotated Ang shifted cscl withcolor csccol;
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/troncoconedef.mp b/graphics/metapost/contrib/macros/featpost/example/troncoconedef.mp
new file mode 100644
index 0000000000..fa21c1c30a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/troncoconedef.mp
@@ -0,0 +1,54 @@
+% troncoconedef.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+f := (5,0,3);
+
+def twoclicpathesinapen( expr CycleA, CycleB )=
+ begingroup
+ numeric TheLengthOfA, TheLengthOfB, TheMargin;
+ path SubPathA, SubPathB;
+ TheMargin = 0.02;
+ TheLengthOfA = ( length CycleA ) - TheMargin;
+ TheLengthOfB = ( length CycleB ) - TheMargin;
+ SubPathA = subpath ( 0, TheLengthOfA ) of CycleA;
+ SubPathB = subpath ( 0, TheLengthOfB ) of CycleB;
+ ( makepath makepen ( SubPathA--SubPathB--cycle ) )
+ endgroup
+enddef;
+
+beginfig(0);
+ numeric rayo, rayt;
+ path onec, twoc, botc;
+ color axec, baso, bast;
+ rayo = 1;
+ rayt = 0.7;
+ axec = red;
+ baso = black;
+ bast = (1,1,1);
+ onec = goodcirclepath( baso, axec, rayo );
+ twoc = goodcirclepath( bast, axec, rayt );
+ botc = twoclicpathesinapen( onec, twoc );
+ fill botc withcolor green;
+ draw onec;
+ draw twoc;
+ draw botc;
+ dotlabel.bot( btex onec0 etex, point 0 of onec );
+ dotlabel.bot( btex twoc0 etex, point 0 of twoc );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/tropicalglobe.mp b/graphics/metapost/contrib/macros/featpost/example/tropicalglobe.mp
new file mode 100644
index 0000000000..39814afa37
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tropicalglobe.mp
@@ -0,0 +1,99 @@
+% tropicalglobe.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+verbatimtex \documentclass{article}\begin{document} etex
+
+beginfig(1);
+ numeric radius, numc;
+ pen thickp;
+
+ f := (3,0,2);
+ viewcentr := 0.5*(1,1,1);
+ Spread := 20;
+ radius = 1;
+ numc = 18;
+ thickp = pencircle scaled 1mm;
+
+ drawoptions( withpen thickp );
+ tropicalglobe( numc, black, radius, blue );
+ produce_auto_scale;
+endfig;
+
+beginfig(2);
+ color gammacnt, earthaxis;
+ numeric newradius, aux, i, foc, lc;
+ path conepath, latpath;
+ picture theglobe;
+
+ f := (5,2,4);
+ viewcentr := black;
+ Spread := 70;
+ radius := 1;
+ numc := 9;
+ thickp := pencircle scaled 0.5mm;
+
+ earthaxis = eulerrotation( 0, 0, 23, blue);
+ pickup thickp;
+ tropicalglobe( numc, black, radius, earthaxis );
+ for i=1 upto numc: % longitudes
+ aux := (i-1)*180/numc;
+ gammacnt := eulerrotation( 0, 0, 23, (cosd(aux),sind(aux),0) );
+ draw spatialhalfcircle(black,gammacnt,radius,true);
+ endfor;
+ theglobe = currentpicture;
+endfig;
+
+beginfig(3);
+ draw theglobe;
+ TDAtiplen := 0.15; % tdarrow and tdcircarrow
+ TDAhalftipbase := 0.06; % Three-Dimensional (Circular)
+ TDAhalfthick := 0.03; % Arrow
+ path planet, twilight, shadowplanet, fullplanet;
+ numeric endtime, begintime, cutmargin, scalevecs;
+ color planetcolor, sunposition, earthvelocity, refpoi, surfacevel;
+ color ua, ub, uc, ud, ue;
+ pair va, vb, vc, vd, ve;
+ cutmargin = 0.01;
+ scalevecs = 1.3;
+ planetcolor = 0.3*(255,152,55)/255;
+ sunposition = red;
+ earthvelocity = green;
+ surfacevel = eulerrotation( 0, 0, 23, earthvelocity );
+ refpoi = 1.1*sunposition;
+ planet = rigorousfearpath( black, radius );
+ twilight = spatialhalfcircle( black, sunposition, radius+cutmargin, true );
+ endtime = xpart ( planet intersectiontimes twilight );
+ begintime = xpart ( reverse planet intersectiontimes twilight );
+ shadowplanet = subpath (-begintime-cutmargin,endtime+cutmargin) of planet;
+ fullplanet = buildcycle( shadowplanet, reverse twilight );
+ fill fullplanet withcolor planetcolor;
+ tdcircarrow( black, earthaxis, 1.1, 0, 90 );
+% tdcircarrow( black, earthaxis, 1.1, 90, -90 );
+ ua = refpoi+scalevecs*earthaxis;
+ ub = refpoi+scalevecs*surfacevel;
+ uc = refpoi-scalevecs*earthaxis;
+ ud = refpoi-scalevecs*surfacevel;
+ ue = 2.2*earthvelocity;
+ tdarrow( 1.05*earthvelocity, ue );
+ tdarrow( refpoi, uc );
+ tdarrow( refpoi, ud );
+ tdarrow( refpoi, ub );
+ tdarrow( refpoi, ua );
+ va = rp( ua );
+ vb = rp( ub );
+ vc = rp( uc );
+ vd = rp( ud );
+ ve = rp( ue );
+ label.top( btex $\vec{A}$ etex, va );
+ label.rt( btex $\vec{B}$ etex, vb );
+ label.bot( btex $\vec{C}$ etex, vc );
+ label.lft( btex $\vec{D}$ etex, vd );
+ label.rt( btex $\vec{E}$ etex, ve );
+endfig;
+
+verbatimtex \end{document} etex
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/troysfear.mp b/graphics/metapost/contrib/macros/featpost/example/troysfear.mp
new file mode 100644
index 0000000000..59acbd784a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/troysfear.mp
@@ -0,0 +1,77 @@
+% troysfear.mp
+% L. Nobre G.
+% 2008
+
+input featpost3Dplus2D;
+
+% verbatimtex
+% \documentclass{article}
+% \usepackage{beton}
+% \usepackage{concmath}
+% \usepackage{ccfonts}
+% \begin{document}
+% etex
+
+prologues := 1;
+
+beginfig(1);
+ f := (10,-5,5.44);
+ Spread := 120;
+ viewcentr := black;
+ numeric i, numl, aux, thickf;
+ color poincol, gammacnt, raycol;
+ numl = 20;
+ thickf = 0.05;
+ poincol = blue;
+ raycol = (1,1,0.1);
+ color poin[];
+ poin1 = ( 0.0000000000000000, 0.0000000000000000, 1.0000000000000000);
+ poin2 = ( 0.7333266247606663, 0.0000000000000000, 0.6798765045338225);
+ poin3 = ( -0.4170317493123703, -0.8933183244372310, -0.1675317620337181);
+ poin4 = ( -0.2314815726239148, 0.6208617150619569, 0.7489639592836793);
+ poin5 = ( 0.1537652646366442, -0.9604012907848274, 0.2323480235553130);
+ poin6 = ( -0.3863954912627506, -0.6607125590945075, 0.6435506495891403);
+ poin7 = ( -0.7710058807464431, 0.5605065386692130, 0.3022951404893231);
+ poin8 = ( -0.0959044889866723, 0.9868269446283826, 0.1302877981532283);
+ poin9 = ( 0.0997534549176198, 0.7727171212494309, -0.6268632217318151);
+ poin10 = ( 0.8172909883532864, -0.5598423938515633, 0.1364255635980997);
+ poin11 = ( 0.2373103227489228, 0.0812688716483729, -0.9680285022755282);
+ poin12 = ( 0.3405602349795320, -0.8413398111607557, -0.4197213939110916);
+ poin13 = ( -0.9610728898061991, 0.1533664531864700, -0.2298208683226212);
+ poin14 = ( -0.8870795087724005, -0.4278302969039353, 0.1733527679825362);
+ poin15 = ( 0.7212726731262007, 0.4012160791697596, -0.5646161428944713);
+ poin16 = ( -0.5528113739219546, 0.7452763339754855, -0.3727771061620893);
+ poin17 = ( 0.5797275131891773, 0.8147563131365292, -0.0093893905905605);
+ poin18 = ( -0.0762908334114027, -0.5230879059144918, -0.8488573210047642);
+ poin19 = ( 0.4559835073369932, 0.6170900853351784, 0.6413102740621552);
+ poin20 = ( 0.7633512867021243, -0.3106468355352665, -0.5663862256995101);
+ poin21 = ( -0.4508345799824528, 0.2265357804581852, -0.8633827202719813);
+ poin22 = ( -0.7074496211764032, -0.3987032948435680, -0.5835672336400034);
+ poin23 = ( 0.9849663581348018, 0.1640719469282586, 0.0540524705618168);
+ poin24 = ( 0.3404137309548133, -0.5605840215601572, 0.7548934007850813);
+ poin25 = ( -0.6907194772069863, -0.0072100091830313, 0.7230868686226352);
+ for i=1 upto 25:
+% draw rp( N( poin[i] ) )--rp( poin[i] ) withcolor raycol;
+% signalvertex( poin[i], thickf, poincol );
+ fill rigorouscircle( poin[i], poin[i], thickf ) withcolor poincol;
+ endfor;
+ tropicalglobe( numl, black, 1, blue );
+ for i=1 upto numl: % longitudes
+ aux := (i-1)*180/numl;
+ gammacnt := (cosd(aux),sind(aux),0);
+ draw spatialhalfcircle(black,gammacnt,1,true);
+ endfor;
+ for i=1 upto 25:
+ if ( conorm( f-poin[i] ) < conorm( f ) ) and ( conorm( poin[i] ) > 0.99 ):
+% draw rp( N( poin[i] ) )--rp( poin[i] ) withcolor raycol;
+% signalvertex( poin[i], thickf, poincol );
+ fill rigorouscircle( poin[i], poin[i], thickf ) withcolor poincol;
+ fi;
+ endfor;
+endfig;
+
+% verbatimtex
+% \end{document}
+% etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/tshirtfig.mp b/graphics/metapost/contrib/macros/featpost/example/tshirtfig.mp
new file mode 100644
index 0000000000..35cafe5c69
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tshirtfig.mp
@@ -0,0 +1,39 @@
+% tshirtfig.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ f := (5,4,3);
+ Spread := 70;
+ pickup pencircle scaled 2.4pt;
+ numeric gridstep, cylength, cyradius, numcylis;
+ numeric i, j, curcoord, curangle, curnorma, tmp;
+ numeric othcoord, othangle, zcoord, coef, othnorma;
+ color base, lenvec;
+ cylength := 0.2;
+ cyradius := 0.3;
+ gridstep := cyradius*2.2;
+ numcylis := 7;
+ coef := 0.22;
+ for i=1 upto numcylis: % saddle
+ curnorma := i-0.5*(numcylis+1);
+ curcoord := curnorma*gridstep;
+ curangle := -curcoord*2*coef;
+ for j=1 upto numcylis:
+ othnorma := j-0.5*(numcylis+1);
+ othcoord := othnorma*gridstep;
+ othangle := othcoord*2*coef;
+ zcoord:=coef*(othcoord**2-curcoord**2);
+ base := (curcoord,othcoord,zcoord);
+ lenvec := cylength*N((-curangle,-othangle,1));
+ tmp := zcoord/2.4+0.8;
+ if tmp > 1: show tmp; fi;
+ background := tmp*TableC2;
+ rigorousdisc( 0, true,base,cyradius,lenvec);
+ endfor;
+ endfor;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/tuftescatter.mp b/graphics/metapost/contrib/macros/featpost/example/tuftescatter.mp
new file mode 100644
index 0000000000..4c2f31a353
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/tuftescatter.mp
@@ -0,0 +1,83 @@
+% tuftescatter.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+def linscatter = uniformdeviate( 2 ) - 1 enddef;
+
+def fullcalculator =
+ begingroup
+ color aux;
+ numeric cx, cy;
+ forever:
+ cx := linscatter;
+ cy := linscatter;
+ exitif cx ++ cy < 0.8; % Saddle ray
+ endfor;
+ aux = ( cx, cy, cx*cx-cy*cy );
+ ( eulerrotation( -25, -15, -5, aux ) ) % Rotation angles
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric totalnum, classnum, sparksiz, pointray;
+ totalnum = 250; % Number of data points
+ classnum = 30; % Number of sparkline classes
+ sparksiz = 0.34; % Maximum sparkline height
+ pointray = 0.035; % Size of the data points
+ f := ( 7, 6, 5 );
+ Spread := 120;
+ numeric i, j, k, l, hx[], hy[], hz[], classtep;
+ classtep = 2/classnum;
+ color tmp;
+ for j=0 upto classnum:
+ hx[j] = 0;
+ hy[j] = 0;
+ hz[j] = 0;
+ endfor;
+ for l=1 upto totalnum:
+ tmp := fullcalculator;
+ for k=1 upto classnum:
+ if ( X(tmp) <= k*classtep-1 ) and ( X(tmp) > (k-1)*classtep-1 ):
+ hx[k] := incr( hx[k] );
+ fi;
+ if ( Y(tmp) <= k*classtep-1 ) and ( Y(tmp) > (k-1)*classtep-1 ):
+ hy[k] := incr( hy[k] );
+ fi;
+ if ( Z(tmp) <= k*classtep-1 ) and ( Z(tmp) > (k-1)*classtep-1 ):
+ hz[k] := incr( hz[k] );
+ fi;
+ endfor;
+ draw rigorouscircle( (-1,Y(tmp),Z(tmp)), red, pointray );
+ draw rigorouscircle( (X(tmp),-1,Z(tmp)), green, pointray );
+ draw rigorouscircle( (X(tmp),Y(tmp),-1), blue, pointray );
+ getready("fill rigorousfearpath("
+ & cstr( tmp )
+ & ",pointray) withcolor blue; draw rigorousfearpath("
+ & cstr( tmp )
+ & ",pointray); ", tmp);
+ endfor;
+ numeric maxn, sparkfac;
+ maxn = 0;
+ for i=1 upto classnum:
+ if hx[i]>maxn: maxn := hx[i]; fi;
+ if hy[i]>maxn: maxn := hy[i]; fi;
+ if hz[i]>maxn: maxn := hz[i]; fi;
+ endfor;
+ sparkfac = sparksiz/maxn;
+ for j=1 upto classnum:
+ draw rp(((j-1)*classtep-1,1+sparkfac*hx[j-1],-1))
+ --rp(((j-1)*classtep-1,1+sparkfac*hx[j],-1))
+ --rp((j*classtep-1,1+sparkfac*hx[j],-1));
+ draw rp((-1,(j-1)*classtep-1,1+sparkfac*hy[j-1]))
+ --rp((-1,(j-1)*classtep-1,1+sparkfac*hy[j]))
+ --rp((-1,j*classtep-1,1+sparkfac*hy[j]));
+ draw rp((-1,1+sparkfac*hz[j-1],(j-1)*classtep-1))
+ --rp((-1,1+sparkfac*hz[j],(j-1)*classtep-1))
+ --rp((-1,1+sparkfac*hz[j],j*classtep-1));
+ endfor;
+ doitnow;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/twistflat.mp b/graphics/metapost/contrib/macros/featpost/example/twistflat.mp
new file mode 100644
index 0000000000..b4d3e84da9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twistflat.mp
@@ -0,0 +1,55 @@
+% twistflat.mp
+% L. Nobre G.
+% Y2K
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+
+ f := 0.7*(1.5,0.3,1.2);
+
+ Spread := 700;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base;
+ sizevec := (11,6,1);
+ gridvec := (0.05,0.1,0.1);
+ thetamin := 55;
+ thetamax := 125;
+ long := 0.08;
+ base := 0.1;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -0.5*X(gridvec)*(X(sizevec)-1) ,
+ -0.5*Y(gridvec)*(Y(sizevec)-1) ,
+ -0.5*Z(gridvec)*(Z(sizevec)-1) );
+ bordpos := starpos - 0.5*gridvec;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ NF := 1;
+ draw facepath(1);
+ counter := 1;
+ for i=1 upto X(sizevec):
+ for j=1 upto Y(sizevec):
+ for k=1 upto Z(sizevec):
+ phi := 90;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := starpos+( (i-1)*X(gridvec) ,
+ (j-1)*Y(gridvec) ,
+ (k-1)*Z(gridvec) );
+ generatedirline( counter, phi, theta, long, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NL := decr(counter);
+ director_invisible( true, base, false );
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/twistnlc.mp b/graphics/metapost/contrib/macros/featpost/example/twistnlc.mp
new file mode 100644
index 0000000000..23591c6b48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twistnlc.mp
@@ -0,0 +1,54 @@
+% explvis2
+% L. Nobre G.
+% 1999
+
+input featpost3Dplus2D;
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, thetamin,
+ thetamax, thetastp, long, base, radius, polar;
+ sizevec := (4,36,1);
+ gridvec := (0.14,0.1,0.3);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ base := 0.02;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ counter := 2;
+ for i=1 upto X(sizevec):
+ radius := (i-1)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-1)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ generatedirface( counter, phi, theta, long, base, currpos );
+ counter := incr(counter);
+ endfor;
+ endfor;
+ endfor;
+ NF := decr(counter);
+ draw_all_test(false);
+% sharpraytrace;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/twistroundbiax.mp b/graphics/metapost/contrib/macros/featpost/example/twistroundbiax.mp
new file mode 100644
index 0000000000..5377b5e0ec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twistroundbiax.mp
@@ -0,0 +1,62 @@
+% twistroundbiax.mp
+% L. Nobre G.
+% 2002
+
+input featpost3Dplus2D;
+
+
+
+beginfig(1);
+
+ f := (2,1,1);
+
+ Spread := 250;
+
+ color gridvec, sizevec, currpos, starpos, bordpos;
+ numeric i, j, k, counter, theta, phi, gamma, thetamin, innercircle,
+ thetamax, thetastp, long, base, radius, polar, larg;
+ sizevec := (4,36,1);
+ gridvec := (0.143,0.1,0.1);
+ thetamin := 90;
+ thetamax := 150;
+ long := 0.08;
+ larg := 0.02;
+ base := 0.2;
+ gamma := -30;
+ innercircle := 0.5;
+ thetastp := (thetamax-thetamin)/(X(sizevec)-1);
+ starpos := ( -X(gridvec)*X(sizevec) ,
+ -X(gridvec)*X(sizevec) ,
+ 0 );
+ bordpos := starpos;
+ npf1 := 4;
+ F1p1 := bordpos;
+ F1p2 := (X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p3 := (-X(bordpos),-Y(bordpos), Z(bordpos));
+ F1p4 := (-X(bordpos),Y(bordpos), Z(bordpos));
+ NF := 1;
+ draw facepath(1);
+ counter := 0;
+ for i=1 upto X(sizevec):
+ radius := (i-innercircle)*X(gridvec);
+ polar := i*floor(Y(sizevec)/X(sizevec));
+ for j=1 upto polar:
+ for k=1 upto Z(sizevec):
+ phi := 360*(j-1)/polar;
+ theta := thetamin+(i-innercircle)*thetastp;
+ currpos := radius*(cosd(phi-90),sind(phi-90),0)
+ +(k-1)*(0,0,Z(gridvec));
+ counter := incr(counter);
+% generateonebiax( counter, phi, theta, long,
+% gamma, larg, currpos );
+ generatedirline( counter, phi, theta, long, currpos );
+ endfor;
+ endfor;
+ endfor;
+ NL := counter;
+ director_invisible( true, base, false );
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/twoDcolision.mp b/graphics/metapost/contrib/macros/featpost/example/twoDcolision.mp
new file mode 100644
index 0000000000..5d9b378163
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twoDcolision.mp
@@ -0,0 +1,59 @@
+% twoDcolision.mp
+% L. Nobre G.
+% 2013
+
+verbatimtex \documentclass{article}\begin{document} etex;
+
+beginfig(1);
+ ahangle := 30;
+ numeric angthe, angalf, xpoin;
+ numeric radthe, vini;
+ numeric ysize, xsize, margs, units, i, dim;
+ pair vone, vinic, vtwo;
+ path xaxis, yaxis, vonep, vinicp, vtwop, auxil;
+ pen thick, usual, vthin;
+ angthe = 65;
+ dim = 50;
+ units = 0.8mm;
+ ahlength := 2.5units;
+ margs = 8units;
+ xsize = 75units;
+ ysize = 40units;
+ radthe = 23units;
+ vini = xsize-2.5*margs;
+ thick = pencircle scaled 0.5units;
+ usual = pencircle scaled 0.2units;
+ vthin = pencircle scaled 0.1units;
+ yaxis = ( 0, -vini/2 )--( 0, ysize-margs );
+ xaxis = ( -margs, 0 )--( xsize-margs, 0 );
+ pickup usual;
+ drawarrow xaxis;
+ label.bot( btex $x$ etex, point 1 of xaxis );
+ drawarrow yaxis;
+ label.lft( btex $y$ etex, point 1 of yaxis );
+ pickup thick;
+ vinic = vini*right;
+ vinicp = origin--vinic;
+ drawarrow vinicp;
+ label.urt( btex $\vec{v}_i$ etex, vinic );
+ vone = vini*cosd(angthe)*dir(angthe);
+ vonep = origin--vone;
+ drawarrow vonep;
+ label.ulft( btex $\vec{v}_1$ etex, vone );
+ vtwo = vini*sind(angthe)*dir(angthe-90);
+ vtwop = origin--vtwo;
+ drawarrow vtwop;
+ label.lrt( btex $\vec{v}_2$ etex, vtwo );
+ pickup vthin;
+ draw fullcircle scaled radthe cutafter vonep;
+ draw fullcircle scaled vini shifted (vinic/2);
+ label.urt( btex $\Theta$ etex, ( radthe/2, 0 ) );
+ z1 = dir(angthe)*margs/2;
+ z2 = dir(angthe-45)*margs/sqrt(2);
+ z3 = dir(angthe-90)*margs/2;
+ draw z1--z2--z3;
+endfig;
+
+verbatimtex \end{document} etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/twocyclestogether.mp b/graphics/metapost/contrib/macros/featpost/example/twocyclestogether.mp
new file mode 100644
index 0000000000..8d33328021
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twocyclestogether.mp
@@ -0,0 +1,113 @@
+% twocyclestogether.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+f := (4.5,-6,5);
+
+beginfig(1);
+ numeric len[], ray[];
+ color axe[], pos[], fix[], lab[], Ve[];
+ color reflabpos, reflabpoi;
+ picture txt[], dashpatt;
+ numeric inclang, aberang, sampang;
+ numeric squside, sqlevel, ul, outermagpos;
+ numeric innerray, polesep, fracone, fracsam;
+ numeric labelscale;
+ path tmpath, aupath, copath;
+
+ pickup pencircle scaled 1.2pt;
+ dashpatt = evenly scaled 3;
+ ul = 0.1;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Change one of these at a time. %%%%%%%%
+ inclang = 129;
+ aberang = 19;
+ outermagpos = 22ul;
+ polesep = 1.7ul;
+ len4 = 30ul;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ sampang = 30;
+ fracone = 0.33;
+ fracsam = 0.86;
+ ray1 = 10ul;
+ ray2 = 6ul;
+ ray3 = 8ul;
+ ray4 = 1.5ul;
+ ray5 = 4ul;
+ ray6 = 3ul;
+ ray7 = 3.5ul;
+ ray8 = 2ul;
+ len3 = 7ul;
+ len5 = 3ul;
+ len7 = 3.5ul;
+ len8 = 7ul;
+
+ len1 = (1-fracone)*(outermagpos-ray5-polesep);
+ pos1 = (-outermagpos,0,0);
+ rigorousdisc( 0, true, pos1, ray1, len1*(1,0,0) );
+
+ len2 = fracone*(outermagpos-ray5-polesep);
+ pos2 = (len1-outermagpos,0,0);
+ tmpath := goodcirclepath( pos2, (1,0,0), ray1 );
+ aupath := goodcirclepath( (-ray5-polesep,0,0), (1,0,0), ray2 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ Ve5 := fracsam*ray5*( sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ Ve6 := fracsam*ray5*( -sind( sampang ),
+ cosd( sampang )*cosd( inclang -90 ),
+ cosd( sampang )*sind( inclang -90 ) );
+ Ve8 := fracsam*ray5*( sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ Ve7 := fracsam*ray5*( -sind( sampang ),
+ -cosd( sampang )*cosd( inclang -90 ),
+ -cosd( sampang )*sind( inclang -90 ) );
+ tmpath := rp(Ve5)--rp(Ve6)--rp(Ve7)--rp(Ve8)--cycle;
+ unfill tmpath;
+ draw tmpath;
+
+ axe6 = ( 0, cosd( inclang+aberang ), sind( inclang+aberang ) );
+ pos6 = ray1*axe6;
+ len6 = len4;
+ axe7 = ( 0, cosd( inclang-aberang ), sind( inclang-aberang ) );
+ pos7 = ( ray1 + 0.5len6 )*axe7;
+ draw rp(pos6)--rp((0,0,0))--rp(pos7) dashed dashpatt;
+
+ pos8 = pos7+len7*axe7;
+ tmpath := goodcirclepath( pos7, axe7, ray7 );
+ aupath := goodcirclepath( pos8, axe7, ray8 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ axe8 = axe7;
+ rigorousdisc( 0, true, pos8, ray8, len8*axe8 );
+
+ len9 = len2;
+ pos9 = (ray5+polesep,0,0);
+ ray9 = ray2;
+ ray10 = ray1;
+ tmpath := goodcirclepath( pos9, (1,0,0), ray9 );
+ pos10 = pos9+len9*(1,0,0);
+ aupath := goodcirclepath( pos10, (1,0,0), ray10 );
+ copath := twocyclestogether( tmpath, aupath );
+ unfill copath;
+ draw copath;
+ draw aupath;
+
+ len10 = len1;
+ rigorousdisc( 0, true, pos10, ray10, len10*(1,0,0) );
+
+ produce_auto_scale;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/twoholes.mp b/graphics/metapost/contrib/macros/featpost/example/twoholes.mp
new file mode 100644
index 0000000000..69a8e01545
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twoholes.mp
@@ -0,0 +1,31 @@
+% twoholes.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+f := 1.5*(0,1.5,1);
+Spread := 100;
+
+beginfig(1);
+ numeric stagelevel, holediam, outerdiam, stagemargin;
+ numeric numberofstagesidesquares, stagesidesize;
+ numeric centercoord;
+ color centerposdisc, centerpostorus;
+ stagelevel = 0.2;
+ holediam = 0.6;
+ stagemargin = 0.2;
+ numberofstagesidesquares = 20;
+ outerdiam = holediam+4*stagelevel;
+ stagesidesize = 2*( outerdiam + stagemargin );
+ centercoord = 0.3535*outerdiam;
+ HoriZon := -stagelevel;
+ centerpostorus = ( centercoord, -centercoord, 0 );
+ centerposdisc = ( -centercoord, centercoord, HoriZon );
+ setthestage( numberofstagesidesquares, stagesidesize );
+ smoothtorus( centerpostorus, blue,
+ 0.5*holediam+stagelevel, stagelevel );
+ rigorousdisc( 0.5*holediam, true, centerposdisc,
+ 0.5*outerdiam, 1.5*stagelevel*blue );
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/twoplustwo.mp b/graphics/metapost/contrib/macros/featpost/example/twoplustwo.mp
new file mode 100644
index 0000000000..0aeb2f916d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twoplustwo.mp
@@ -0,0 +1,59 @@
+% twoplustwo.mp
+% L. Nobre G.
+% 2006
+
+def screenpath( expr CentrePoi, Width, Height, CorneRay ) =
+ begingroup
+ pair sp[];
+ sp0 = CentrePoi - 0.5*( Width*right + Height*up ) + CorneRay*down;
+ sp1 = CentrePoi + 0.5*( Width*right - Height*up ) + CorneRay*down;
+ sp2 = CentrePoi + 0.5*( Width*right - Height*up ) + CorneRay*right;
+ sp3 = CentrePoi + 0.5*( Width*right + Height*up ) + CorneRay*right;
+ sp4 = CentrePoi + 0.5*( Width*right + Height*up ) + CorneRay*up;
+ sp5 = CentrePoi - 0.5*( Width*right - Height*up ) + CorneRay*up;
+ sp6 = CentrePoi - 0.5*( Width*right - Height*up ) + CorneRay*left;
+ sp7 = CentrePoi - 0.5*( Width*right + Height*up ) + CorneRay*left;
+ ( sp0---sp1..sp2---sp3..sp4---sp5..sp6---sp7..cycle )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric u, i, j, k, l;
+ pen stdpen;
+ color bgcol, fgcol;
+ bgcol = 0.7white;
+ fgcol = 0.85*(blue+green);
+ stdpen = pencircle scaled 9pt;
+ u = 5cm;
+ for i=1 upto 5:
+ j := 90-72+i*72;
+ k := i+5;
+ l := k+5;
+ z[i] = u*dir(j);
+ z[k] = u*sind(18)*dir(j);
+ z[l] = u*sind(18)*dir(j+36)/cosd(36);
+ endfor;
+ path inip, inis, init, iniq, scrbord;
+ scrbord = screenpath( origin, 1.7u, 1.1u, 0.7u );
+ inip = z5---z2--z12{unitvector(z8-z2)}..{unitvector(z5-z9)}z14--cycle;
+% inis = ( inip ) rotated 72;
+% init = ( ( ( inip ) shifted -z5 ) yscaled -1 ) shifted z4;
+% iniq = ( ( ( ( inip ) shifted -z2 ) yscaled -1 ) rotated 72 ) shifted z4;
+% draw inip withpen pencircle scaled 3pt;
+% draw inis;
+% draw init;
+% draw iniq;
+ fill inip withcolor fgcol;
+ draw inip withpen stdpen withcolor bgcol;
+ picture unitpic;
+ unitpic = currentpicture;
+ currentpicture := nullpicture;
+ fill scrbord withcolor bgcol;
+ draw ( ( ( ( unitpic ) shifted -z2 ) yscaled -1 ) rotated 72 ) shifted z4;
+ draw unitpic;
+ draw ( ( ( unitpic ) shifted -z5 ) yscaled -1 ) shifted z4;
+ draw ( unitpic ) rotated 72;
+endfig;
+
+end;
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/twosolarpanels.mp b/graphics/metapost/contrib/macros/featpost/example/twosolarpanels.mp
new file mode 100644
index 0000000000..6913fb0c95
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twosolarpanels.mp
@@ -0,0 +1,85 @@
+% twosolarpanels.mp
+% L. Nobre G.
+% 2014
+
+input featpost3Dplus2D;
+
+f := (2.7,5,2);
+Spread := 170;
+color poi[], colthr, coltwo;
+pen penthr, pentwo;
+numeric projx, projy, projz;
+penthr = pencircle scaled 2.4pt;
+pentwo = pencircle scaled 1.0pt;
+colthr = blue;
+coltwo = black;
+projx = -0.5;
+projy = -1;
+projz = -0.5;
+
+def drawonesegmentmanytimes( expr poia, poib ) =
+ begingroup
+ draw rp((projx,Y(poia),Z(poia)))--rp((projx,Y(poib),Z(poib))) withpen pentwo withcolor coltwo;
+ draw rp((X(poia),projy,Z(poia)))--rp((X(poib),projy,Z(poib))) withpen pentwo withcolor coltwo;
+ draw rp((X(poia),Y(poia),projz))--rp((X(poib),Y(poib),projz)) withpen pentwo withcolor coltwo;
+ draw rp(poia)--rp(poib) withpen penthr withcolor colthr
+ endgroup
+enddef;
+
+vardef segments( text t ) =
+ color tmpcol[];
+ numeric tmpnum, i;
+ tmpnum := 0;
+ forsuffixes $=t:
+ tmpnum := tmpnum+1;
+ tmpcol[tmpnum] = poi$;
+ endfor;
+ for i=1 upto tmpnum-1:
+ drawonesegmentmanytimes(tmpcol[i],tmpcol[i+1]);
+ endfor
+enddef;
+
+beginfig(1);
+ numeric fac;
+ fac = 0.5*sqrt(2);
+ numeric panelangle, roofangle, panelwid, panellen;
+ panelangle = 61;
+ roofangle = 22;
+ panelwid = 0.5;
+ panellen = 0.8;
+ numeric panelz, panelx;
+ panelz = panellen*sind(panelangle);
+ panelx = panellen*cosd(panelangle);
+ numeric forwarddescent, backwardascent, middledescent;
+ forwarddescent = panelwid*fac*sind(roofangle)/cosd(roofangle);
+ backwardascent = panelx*fac*sind(roofangle)/cosd(roofangle);
+ middledescent = (panelwid-panelx)*fac*sind(roofangle)/cosd(roofangle);
+ poi1 = (panelwid,0,panelz);
+ poi2 = (panelwid,panelwid,panelz);
+ poi3 = (0,panelwid,panelz);
+ poi4 = (panelwid,0,backwardascent);
+ poi5 = (0,panelwid,backwardascent);
+ poi6 = (panelwid+panelx,0,0);
+ poi7 = (panelwid+panelx,panelwid,0);
+ poi8 = (panelwid,panelwid,0);
+ poi9 = (panelwid,panelwid+panelx,0);
+ poi10= (0,panelwid+panelx,0);
+ poi11= (panelwid,panelwid,-middledescent);
+ poi12= (panelwid+panelx,panelwid,-forwarddescent);
+ poi13= (panelwid,panelx+panelwid,-forwarddescent);
+ segments( 6, 12, 11, 13, 10 );
+ segments( 12, 7, 8, 9, 13 );
+ segments( 7, 6, 1, 2, 7 );
+ segments( 9, 10, 3, 2, 9 );
+ segments( 11, 8, 2 );
+ segments( 6, 4, 1 );
+ segments( 10, 5, 3 );
+ segments( 1, 3 );
+ segments( 12, 4, 5, 13 );
+ segments( 6, 10 );
+ segments( 4, 11, 5 );
+ unfill rp(poi7)--rp(poi6)--rp(poi1)--rp(poi2)--cycle;
+ unfill rp(poi9)--rp(poi10)--rp(poi3)--rp(poi2)--cycle;
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/twoupcones.mp b/graphics/metapost/contrib/macros/featpost/example/twoupcones.mp
new file mode 100644
index 0000000000..7d8f664985
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/twoupcones.mp
@@ -0,0 +1,51 @@
+% twoupcones.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton,concmath,ccfonts}
+\begin{document}
+etex
+
+f := 3*(2,1,0.5);
+
+beginfig(1);
+ numeric raya, rayb, heia, heib, rang, marg, u;
+ color cena, cenb, vera, verb, auxa, auxb, pora, porb, poha, pohb;
+ u = 0.38;
+ raya = 1u;
+ rayb = 2u;
+ heia = 0.65u;
+ marg = 0.2u;
+ rang = 60;
+ heib = heia*rayb/raya;
+ cena = (raya*(1+marg),0,0);
+ cenb = (-rayb*(1+marg),0,0);
+ auxa = cena + raya*(cosd(rang),sind(rang),0);
+ auxb = cenb + rayb*(cosd(rang),sind(rang),0);
+ pora = 0.5[auxa,cena];
+ porb = 0.5[auxb,cenb];
+ vera = cena+heia*blue;
+ verb = cenb+heib*blue;
+ poha = 0.5[cena,vera];
+ pohb = 0.5[cenb,verb];
+ verygoodcone(true,cenb,blue,rayb,verb);
+ draw rp(verb)--rp(cenb)--rp(auxb) dashed evenly;
+ label.urt(btex $h_1$ etex, rp(pohb));
+ label.urt(btex $R_1$ etex, rp(porb));
+ verygoodcone(true,cena,blue,raya,vera);
+ draw rp(vera)--rp(cena)--rp(auxa) dashed evenly;
+ label.urt(btex $h_2$ etex, rp(poha));
+ label.urt(btex $R_2$ etex, rp(pora));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/ubhtransients.mp b/graphics/metapost/contrib/macros/featpost/example/ubhtransients.mp
new file mode 100644
index 0000000000..27d39c5dea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ubhtransients.mp
@@ -0,0 +1,139 @@
+% ubhtransients.mp
+% L. Nobre G.
+% 2003
+
+numeric SingleContinuosParameter;
+SingleContinuosParameter = 0.95;
+
+numeric vertn, horin, grids, thex, they, varx, xcomp;
+numeric ymax, xmax, i, j, size, u, ycomp, theta, phi;
+numeric power, xlim, ylim, frax, fray, allang, shift;
+numeric perang, ampper, velang, displamp, hdk;
+numeric velfunc, auxfunc, homang, vpower;
+pair actpos, direct, one, two, displvec;
+path cirma;
+color thedark;
+path VGAborder;
+
+u := 0.5mm;
+size := 1.14u;
+grids := 4u;
+hdk := 0.47;
+
+% This is for the sudden rotation
+%allang := SingleContinuosParameter[0,80];
+%homang := 0;
+
+% This is for the UH evolution
+% allang := 80;
+% homang := SingleContinuosParameter[0,80];
+% ampper := 0;
+% displamp := 0;
+% frax := 1.2;
+% fray := 1.6;
+% velang := 0;
+% power := 1;
+% vpower := 1;
+
+% The next homang parameter when in UBH evolution
+% has two parts:
+% Part1 - SingleContinuosParameter from 0 to 1 [0,45]
+% Part2 - SingleContinuosParameter from 1 to 0 [85,45]
+% homang := SingleContinuosParameter[0,45];
+% allang := 85;
+% ampper := SingleContinuosParameter[0,33];
+% velang := 15;
+% displamp := SingleContinuosParameter[0,5u];
+% frax := 1.2;
+% fray := 2.0;
+% power := 1;
+% vpower := 1;
+
+% This is for the UB evolution
+ allang := 90;
+ homang := 0;
+ ampper := SingleContinuosParameter[0,84];
+ displamp := SingleContinuosParameter[0,9u];
+ frax := 0.8;
+ fray := 1.5;
+ velang := 0;
+ power := 1;
+ vpower := 1;
+
+%power := SingleContinuosParameter[1,0.47];
+%vpower := 1.0/power;
+
+xlim := 115.00;
+ylim := 86.025;
+vertn := 2.0*ylim/grids;
+horin := 2.0*xlim/grids;
+ymax := floor(0.5*(vertn*fray-1));
+xmax := floor(0.5*(horin*frax-1));
+%varx := 450/(0.5*(vertn-1));% in UH and UBH
+varx := 350/(0.5*(vertn-1));% in UB
+
+ VGAborder := (-xlim,-ylim)-- %
+ ( xlim,-ylim)-- %
+ ( xlim, ylim)-- %
+ (-xlim, ylim)--cycle; %
+
+ def mypower( expr base, expo ) =
+ begingroup
+ save aux;
+ numeric aux;
+ if base=0:
+ aux = 1;
+ else:
+ aux = abs(base)/base;
+ fi;
+ ( aux*(abs(base)**expo) )
+ endgroup
+ enddef;
+
+ def produce_vga_border =
+ begingroup
+ draw VGAborder withcolor background withpen pencircle scaled 0;
+ clip currentpicture to VGAborder
+ endgroup
+ enddef;
+
+ beginfig(0);
+ pickup pencircle scaled u;
+ cirma := fullcircle scaled (1.43*grids);
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=(grids*(i,j)) rotated (-allang);
+ thex:=i*varx;
+ they:=j*varx;
+ auxfunc:=dir(velang) dotprod (thex,they);
+ perang :=ampper*mypower(sind(auxfunc),power);
+ theta:=180-allang+perang+homang;
+ direct:=dir(theta);
+ velfunc:=-displamp*mypower(cosd(auxfunc),vpower);
+ displvec:=dir(velang)*velfunc;
+ actpos := actpos+displvec;
+ thedark := (1-hdk*(ypart direct))*white;
+ fill cirma shifted actpos withcolor thedark;
+ endfor;
+ endfor;
+ for i=-xmax upto xmax:
+ for j=-ymax upto ymax:
+ actpos:=(grids*(i,j)) rotated (-allang);
+ thex:=i*varx;
+ they:=j*varx;
+ auxfunc:=dir(velang) dotprod (thex,they);
+ perang :=ampper*mypower(sind(auxfunc),power);
+ theta:=180-allang+perang+homang;
+ direct:=dir(theta);
+ velfunc:=-displamp*mypower(cosd(auxfunc),vpower);
+ displvec:=dir(velang)*velfunc;
+ actpos := actpos+displvec;
+ one:=actpos-size*direct;
+ two:=actpos+size*direct;
+ draw one--two;
+ endfor;
+ endfor;
+ produce_vga_border;
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ultraeye.mp b/graphics/metapost/contrib/macros/featpost/example/ultraeye.mp
new file mode 100644
index 0000000000..a93847c773
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ultraeye.mp
@@ -0,0 +1,16 @@
+% ultraeye.mp
+% L. Nobre G.
+% 2007
+
+prologues := 1;
+beginfig(1);
+ LaTeX_unitlength := 14.22636pt; % from the emp LaTeX package
+ w := 15*LaTeX_unitlength;
+ h := 10*LaTeX_unitlength;
+ for i=h step -h/20 until h/20:
+ fill fullcircle scaled i xscaled (w/h) withcolor blue;
+ fill fullcircle scaled i withcolor red;
+ endfor;
+endfig;
+end.
+endinput;
diff --git a/graphics/metapost/contrib/macros/featpost/example/ultraimprovertex.mp b/graphics/metapost/contrib/macros/featpost/example/ultraimprovertex.mp
new file mode 100644
index 0000000000..658682b458
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/ultraimprovertex.mp
@@ -0,0 +1,63 @@
+% ultraimprovertex.mp
+% L. Nobre G.
+% 2012
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric r, i, ste;
+ r = 0.65;
+ ste = 4;
+ color cc, cl, sc, sl, pdir, inip;
+ cl = (3*r,0,0);
+ cc = (-1.5*r,0,-0.5*r);
+ sl = (0,1.7*r,0);
+ sc = (0,0,0.5*r);
+ rigorousdisc( 0, true, cc, r, cl);
+ spheroid( sc, sl, r );
+ drawoptions( withpen pencircle scaled 3pt );
+ for i=ste step ste until 360:
+ pdir := (-sind(i),cosd(i),0);
+ inip := r*(cosd(i),sind(i),0);
+ draw rp(ultraimprovertex( black, pdir, cc, r, cl, sc, sl, r, inip ));
+ endfor;
+endfig;
+
+beginfig(2);
+ numeric r, i, ste;
+ r = 0.65;
+ ste = 4;
+ color cc, cl, sc, sl, pdir, inip;
+ cl = (3.5*r,0,0);
+ cc = (-2*r,0,-0.5*r);
+ sl = (0,1.9*r,0);
+ sc = (0,0,0.95*r);
+ spheroid( cc, cl, r );
+ spheroid( sc, sl, r );
+ drawoptions( withpen pencircle scaled 3pt );
+ draw for i=ste step ste until 360:
+ hide( pdir := (-sind(i),cosd(i),0); inip := r*(cosd(i),sind(i),0); )
+ rp(necplusimprovertex( black, pdir, cc, cl, r, sc, sl, r, inip ))..
+ endfor cycle;
+endfig;
+
+beginfig(3);
+ numeric r, i, ste;
+ r = 0.65;
+ ste = 4;
+ color cc, cl, sc, sl, pdir, inip;
+ cl = (3*r,0,0);
+ cc = (-1.5*r,0,-0.5*r);
+ sl = (0.7*r,0,0);
+ sc = (0,0,0.5*r);
+ rigorousdisc( 0, true, cc, r, cl);
+ spheroid( sc, sl, r );
+ drawoptions( withpen pencircle scaled 3pt );
+ for i=ste step ste until 360:
+ pdir := (-sind(i),cosd(i),0);
+ inip := r*(cosd(i),sind(i),0);
+ draw rp(ultraimprovertex( black, pdir, cc, r, cl, sc, sl, r, inip ));
+ endfor;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/unperfection.mp b/graphics/metapost/contrib/macros/featpost/example/unperfection.mp
new file mode 100644
index 0000000000..fe7c92b3ec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/unperfection.mp
@@ -0,0 +1,59 @@
+% unperfection.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 70;
+f := (10,4,5);
+
+beginfig(1);
+ numeric i, len, polelen;
+ numeric fws, NumLines, linex, inray, outay, axray;
+ numeric wang, poleray;
+ path aro[], oneline;
+ color axe, pole, polec, aroc;
+ picture floorwall;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ pole := (0,1,0);
+ fws := 4;
+ polelen := 0.8*fws;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ poleray := 0.07*inray;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ polec := (0,(outay-inray)*cosd(wang)-fws/2,
+ (outay+inray)*sind(wang)-poleray-fws/2);
+ aro1 := goodcirclepath( aroc, axe, inray );
+ aro2 := goodcirclepath( aroc+len*axe, axe, inray );
+ aro3 := buildcycle( aro1, aro2 );
+ floorwall := currentpicture;
+ clip floorwall to aro3;
+ aro4 := spatialhalfcircle( aroc+len*axe, axe, inray, false );
+ aro5 := spatialhalfcircle( aroc+len*axe, axe, outay, false );
+ aro6 := reverse aro5;
+ aro7 := aro4--aro6--cycle;
+ fill aro7 withcolor (0.6*background);
+ rigorousdisc( 0, true, aroc, inray, axe*len );
+ draw floorwall;
+ draw aro3;
+ rigorousdisc( 0, true, polec, poleray, pole*polelen );
+ aro8 := spatialhalfcircle( aroc+len*axe, axe, inray, true );
+ aro9 := spatialhalfcircle( aroc+len*axe, axe, outay, true );
+ aro10 := reverse aro9;
+ aro11 := aro8--aro10--cycle;
+ fill aro11 withcolor (0.6*background);
+ rigorousdisc( 0, false, aroc, outay, axe*len );
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/unperfectionremoved.mp b/graphics/metapost/contrib/macros/featpost/example/unperfectionremoved.mp
new file mode 100644
index 0000000000..0606ac9d07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/unperfectionremoved.mp
@@ -0,0 +1,34 @@
+% unperfectionremoved.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+Spread := 70;
+f := (13,4,3);
+
+beginfig(1);
+ numeric i, len;
+ numeric fws, NumLines, linex, inray, outay, axray;
+ numeric wang;
+ path oneline;
+ color axe, aroc;
+ len := 0.6;
+ wang := 60;
+ axe := (0,cosd(90-wang),sind(90-wang));
+ fws := 4;
+ outay := 0.45*fws;
+ inray := 0.7*outay;
+ NumLines := 30;
+ for i=0 upto NumLines:
+ linex := fws*(i/NumLines-0.5);
+ oneline := rp((linex,0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,-0.5*fws))
+ --rp((linex,-0.5*fws,0.5*fws));
+ draw oneline withcolor (0.7*background);
+ endfor;
+ aroc := outay*(0,cosd(wang),sind(wang))-0.5*(0,fws,fws);
+ rigorousdisc( inray, true, aroc, outay, axe*len );
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/vanallenbelt.mp b/graphics/metapost/contrib/macros/featpost/example/vanallenbelt.mp
new file mode 100644
index 0000000000..6420ea64dc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/vanallenbelt.mp
@@ -0,0 +1,51 @@
+% vanallenbelt.mp
+% L. Nobre G.
+% 2004
+
+input featpost3Dplus2D;
+
+def magnfield( expr pos ) =
+ begingroup
+ save dist, anga, angb, angp, bv, bh, br, bx, by, bz, fin;
+ numeric dist, anga, angb, bv, bh, br, bx, by, bz;
+ pair angp;
+ color fin;
+ dist = conorm( pos );
+ angp = getanglepair( pos );
+ anga = xpart( angp );
+ angb = ypart( angp );
+ bh = 0.5*cosd( angb )/dist**3;
+ bv = sind( angb )/dist**3;
+ br = bv*cosd( angb ) - bh*sind( angb );
+ bz = bv*sind( angb ) + bh*cosd( angb );
+ bx = br*cosd( anga );
+ by = br*sind( anga );
+ fin = ( bx, by, bz );
+ ( 25*fin )
+ endgroup
+enddef;
+
+def pmf( expr pos ) =
+ (2*red/(((greenpart pos) ++ (bluepart pos))**2))
+enddef;
+
+beginfig(1);
+ color vel;
+ vel = 1.1*(-0.25,0.0,0.1);
+ cartaxes(1,1,1);
+ draw magnetictrajectorypath(200, red, vel, 0.22, magnfield );
+% draw magnetictrajectorypath(400, red,-vel, 0.22, magnfield );
+endfig;
+
+beginfig(2);
+ f := 2*red;
+ Spread := 200;
+ numeric ang;
+ color vel;
+ ang = 145;
+ vel = 0.8*( 0, cosd( ang ), sind( ang ) );
+ draw magnetictrajectorypath(200, green, vel, 0.1, pmf );
+ drawarrow reverse (rp(blue)--rp(black)--rp(green));
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/featpost/example/verygoodcone.mp b/graphics/metapost/contrib/macros/featpost/example/verygoodcone.mp
new file mode 100644
index 0000000000..d63d22e888
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/verygoodcone.mp
@@ -0,0 +1,28 @@
+% verygoodcone.mp
+% L. Nobre G.
+% 2003
+
+input featpost3Dplus2D;
+
+beginfig(1);
+ numeric radiusin, fac, i, numc, stepang, xcoor, ycoor, radc;
+
+ f := (5,0.3,1.5);
+ Spread := 70;
+ radiusin = 0.3;
+ numc = 9;
+ fac = 3;
+ stepang = 360/numc;
+ radc = (fac-1)*radiusin*sind(0.5*stepang);
+
+ for i=0 step stepang until 180:
+ xcoor := -radiusin*cosd(i);
+ ycoor := radiusin*sind(i);
+verygoodcone(true,fac*(xcoor,-ycoor,0),(-xcoor,ycoor,0),radc,(xcoor,-ycoor,0));
+verygoodcone(true,fac*(xcoor,ycoor,0),-(xcoor,ycoor,0),radc,(xcoor,ycoor,0));
+ endfor;
+endfig;
+
+end;
+
+
diff --git a/graphics/metapost/contrib/macros/featpost/example/wwfpmp.mp b/graphics/metapost/contrib/macros/featpost/example/wwfpmp.mp
new file mode 100644
index 0000000000..cac886fd4e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/wwfpmp.mp
@@ -0,0 +1,154 @@
+% Converted from PostScript(TM) to MetaPost by pstoedit
+% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu>
+% pstoedit is Copyright (C) 1993 - 2003 Wolfgang Glunz <wglunz@pstoedit.net>
+
+% Generate structured PostScript
+prologues := 1;
+
+% Display a given string with its *baseline* at a given location
+% and with a given rotation angle
+vardef showtext(expr origin)(expr angle)(expr string) =
+ draw string infont defaultfont scaled defaultscale
+ rotated angle shifted origin;
+enddef;
+
+% Modified by L. Nobre G's Lex scanner %%%%%%%%%%%
+randomseed := 1010;
+vardef renewcolore =
+ color tmpcolo;
+ tmpcolo = (uniformdeviate(0.8),uniformdeviate(0.8),uniformdeviate(0.8));
+ drawoptions( withcolor tmpcolo );
+enddef;
+defaultscale := 0.16;
+beginfig(1);
+ path PreeditedPath[];
+linecap := butt;
+linejoin := mitered;
+ PreeditedPath1 = hide(z1=(209.192,405.337))z1..controls hide(z2=(193.976,401.343))z2 and hide(z3=(180.8,387.983))z3..hide(z4=(178.3,374.014))z4
+ ..controls hide(z5=(176.925,366.33))z5 and hide(z6=(179.259,357.391))z6..hide(z7=(184.709,349.463))z7
+ ..controls hide(z8=(185.808,347.865))z8 and hide(z9=(186.687,346.288))z9..hide(z10=(186.687,345.915))z10
+ ..controls hide(z11=(186.687,345.544))z11 and hide(z12=(184.513,343.637))z12..hide(z13=(181.828,341.652))z13
+ ..controls hide(z14=(156.708,323.087))z14 and hide(z15=(140.969,300.809))z15..hide(z16=(134.227,274.277))z16
+ ..controls hide(z17=(131.23,262.485))z17 and hide(z18=(130.362,253.818))z18..hide(z19=(130.125,233.359))z19
+ ..controls hide(z20=(129.983,221.147))z20 and hide(z21=(129.563,212.396))z21..hide(z22=(128.852,206.826))z22
+ ..controls hide(z23=(127.635,197.3))z23 and hide(z24=(127.497,188.834))z24..hide(z25=(128.461,182.787))z25
+ ..controls hide(z26=(129.206,178.12))z26 and hide(z27=(131.726,168.007))z27..hide(z28=(133.225,163.671))z28
+ ..controls hide(z29=(135.196,157.97))z29 and hide(z30=(133.11,157.822))z30..hide(z31=(125.95,163.155))z31
+ ..controls hide(z32=(103.858,179.608))z32 and hide(z33=(87.1804,209.064))z33..hide(z34=(82.4009,240.072))z34
+ ..controls hide(z35=(81.376,246.721))z35 and hide(z36=(81.3604,265.495))z36..hide(z37=(82.3743,272.039))z37
+ ..controls hide(z38=(85.2769,290.772))z38 and hide(z39=(92.6594,308.476))z39..hide(z40=(103.623,322.994))z40
+ ..controls hide(z41=(108.759,329.797))z41 and hide(z42=(119.045,339.931))z42..hide(z43=(126.845,345.874))z43
+ ..controls hide(z44=(130.233,348.455))z44 and hide(z45=(132.983,350.779))z45..hide(z46=(132.983,351.062))z46
+ ..controls hide(z47=(132.983,352.33))z47 and hide(z48=(129.85,351.42))z48..hide(z49=(124.735,348.665))z49
+ ..controls hide(z50=(88.8674,329.346))z50 and hide(z51=(66.1748,297.613))z51..hide(z52=(58.7385,256.375))z52
+ ..controls hide(z53=(57.7061,250.65))z53 and hide(z54=(57.3645,245.698))z54..hide(z55=(57.1956,233.998))z55
+ ..controls hide(z56=(56.9331,215.816))z56 and hide(z57=(57.4407,211.238))z57..hide(z58=(61.8733,191.802))z58
+ ..controls hide(z59=(63.4004,185.106))z59 and hide(z60=(63.5593,183.107))z60..hide(z61=(63.6526,169.425))z61
+ ..controls hide(z62=(63.7874,149.669))z62 and hide(z63=(64.5361,144.671))z63..hide(z64=(69.7825,128.507))z64
+ ..controls hide(z65=(82.0679,90.6582))z65 and hide(z66=(95.7263,71.4067))z66..hide(z67=(114.186,65.9214))z67
+ ..controls hide(z68=(127.101,62.0835))z68 and hide(z69=(142.784,62.0671))z69..hide(z70=(150.309,65.8833))z70
+ ..controls hide(z71=(157.396,69.4775))z71 and hide(z72=(157.994,74.8027))z72..hide(z73=(153.107,90.7861))z73
+ ..controls hide(z74=(149.823,101.527))z74 and hide(z75=(148.291,108.503))z75..hide(z76=(147.898,114.506))z76
+ ..controls hide(z77=(147.6,119.045))z77 and hide(z78=(147.695,120.765))z78..hide(z79=(148.263,121.112))z79
+ ..controls hide(z80=(149.597,121.927))z80 and hide(z81=(150.525,120.388))z81..hide(z82=(155.367,109.327))z82
+ ..controls hide(z83=(168.496,79.342))z83 and hide(z84=(173.615,68.8303))z84..hide(z85=(180.494,57.7322))z85
+ ..controls hide(z86=(195.237,33.9487))z86 and hide(z87=(212.187,21.4004))z87..hide(z88=(235.661,16.8931))z88
+ ..controls hide(z89=(244.036,15.2849))z89 and hide(z90=(260.11,15.4221))z90..hide(z91=(266.669,17.1577))z91
+ ..controls hide(z92=(275.747,19.5603))z92 and hide(z93=(280.789,23.1016))z93..hide(z94=(281.655,27.6833))z94
+ ..controls hide(z95=(282.208,30.6094))z95 and hide(z96=(281.006,35.2915))z96..hide(z97=(278.358,40.5339))z97
+ ..controls hide(z98=(274.26,48.6443))z98 and hide(z99=(272.498,54.0881))z99..hide(z100=(269.85,66.8108))z100
+ ..controls hide(z101=(267.725,77.0188))z101 and hide(z102=(267.096,84.4568))z102..hide(z103=(267.408,95.709))z103
+ ..controls hide(z104=(267.868,112.332))z104 and hide(z105=(270.992,122.729))z105..hide(z106=(277.473,129.21))z106
+ ..controls hide(z107=(282.46,134.197))z107 and hide(z108=(287.223,134.241))z108..hide(z109=(291.524,129.338))z109
+ ..controls hide(z110=(298.515,121.37))z110 and hide(z111=(299.705,101.144))z111..hide(z112=(294.629,76.5288))z112
+ ..controls hide(z113=(292.969,68.4731))z113 and hide(z114=(292.615,65.2798))z114..hide(z115=(292.562,57.8601))z115
+ ..controls hide(z116=(292.501,49.293))z116 and hide(z117=(292.578,48.7368))z117..hide(z118=(294.36,44.8816))z118
+ ..controls hide(z119=(297.995,37.0154))z119 and hide(z120=(303.878,33.7029))z120..hide(z121=(314.172,33.7263))z121
+ ..controls hide(z122=(323.351,33.7471))z122 and hide(z123=(333.416,36.9553))z123..hide(z124=(345.052,43.5701))z124
+ ..controls hide(z125=(355.021,49.2373))z125 and hide(z126=(361.587,57.4126))z126..hide(z127=(369.879,74.4829))z127
+ ..controls hide(z128=(382.573,100.614))z128 and hide(z129=(391.848,133.047))z129..hide(z130=(397.011,169.361))z130
+ ..controls hide(z131=(399.774,188.797))z131 and hide(z132=(400.469,200.293))z132..hide(z133=(400,218.846))z133
+ ..controls hide(z134=(399.546,236.875))z134 and hide(z135=(398.304,246.849))z135..hide(z136=(394.996,259.061))z136
+ ..controls hide(z137=(392.594,267.928))z137 and hide(z138=(390.68,267.308))z138..hide(z139=(390.653,257.654))z139
+ ..controls hide(z140=(390.644,254.313))z140 and hide(z141=(390.221,248.703))z141..hide(z142=(389.713,245.187))z142
+ ..controls hide(z143=(384.752,210.854))z143 and hide(z144=(364.418,184.698))z144..hide(z145=(335.781,175.811))z145
+ ..controls hide(z146=(329.771,173.946))z146 and hide(z147=(317.834,171.982))z147..hide(z148=(312.509,171.982))z148
+ ..controls hide(z149=(310.08,171.982))z149 and hide(z150=(307.164,171.594))z150..hide(z151=(306.02,171.119))z151
+ ..controls hide(z152=(304.886,170.648))z152 and hide(z153=(301.777,167.859))z153..hide(z154=(299.179,164.981))z154
+ ..controls hide(z155=(296.581,162.104))z155 and hide(z156=(293.341,159.158))z156..hide(z157=(292.05,158.5))z157
+ ..controls hide(z158=(287.492,156.174))z158 and hide(z159=(280.734,157.216))z159..hide(z160=(272.167,161.566))z160
+ ..controls hide(z161=(266.568,164.409))z161 and hide(z162=(262.001,164.863))z162..hide(z163=(254.457,163.325))z163
+ ..controls hide(z164=(246.785,161.761))z164 and hide(z165=(243.566,161.882))z165..hide(z166=(240.2,163.861))z166
+ ..controls hide(z167=(237.131,165.665))z167 and hide(z168=(233.232,170.832))z168..hide(z169=(230.451,176.777))z169
+ ..controls hide(z170=(227.492,183.105))z170 and hide(z171=(224.6,185.336))z171..hide(z172=(215.649,188.197))z172
+ ..controls hide(z173=(193.43,195.298))z173 and hide(z174=(177.714,211.11))z174..hide(z175=(169.999,234.126))z175
+ ..controls hide(z176=(167.233,242.379))z176 and hide(z177=(166.281,247.808))z177..hide(z178=(165.809,258.038))z178
+ ..controls hide(z179=(165.317,268.691))z179 and hide(z180=(166.114,276.45))z180..hide(z181=(168.842,287.575))z181
+ ..controls hide(z182=(172.354,301.896))z182 and hide(z183=(178.804,316.336))z183..hide(z184=(187.433,329.196))z184
+ ..controls hide(z185=(194.726,340.065))z185 and hide(z186=(193.628,339.248))z186..hide(z187=(198.003,337.06))z187
+ ..controls hide(z188=(205.601,333.261))z188 and hide(z189=(208.425,333.986))z189..hide(z190=(218.334,342.279))z190
+ ..controls hide(z191=(224.603,347.525))z191 and hide(z192=(231.441,351.833))z192..hide(z193=(237.834,354.565))z193
+ ..controls hide(z194=(251.781,360.524))z194 and hide(z195=(253.271,368.324))z195..hide(z196=(244.111,387.44))z196
+ ..controls hide(z197=(236.574,403.168))z197 and hide(z198=(224.501,409.355))z198..cycle;
+ renewcolore;
+ draw PreeditedPath1;
+ dotlabels.rt(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198);
+ PreeditedPath2 = hide(z199=(257.974,155.725))z199..controls hide(z200=(263.28,154.78))z200 and hide(z201=(271.076,153.845))z201..hide(z202=(275.427,153.633))z202
+ ..controls hide(z203=(279.775,153.421))z203 and hide(z204=(283.412,153.05))z204..hide(z205=(283.56,152.802))z205
+ ..controls hide(z206=(284.051,151.985))z206 and hide(z207=(280.606,147.349))z207..hide(z208=(278.368,145.815))z208
+ ..controls hide(z209=(275.629,143.938))z209 and hide(z210=(270.569,142.573))z210..hide(z211=(266.349,142.573))z211
+ ..controls hide(z212=(262.833,142.573))z212 and hide(z213=(255.786,144.135))z213..hide(z214=(253.051,145.52))z214
+ ..controls hide(z215=(248.639,147.754))z215 and hide(z216=(244.228,153.345))z216..hide(z217=(244.228,156.702))z217
+ ..controls hide(z218=(244.228,158.268))z218 and hide(z219=(243.333,158.332))z219..cycle;
+ renewcolore;
+ draw PreeditedPath2;
+ dotlabels.rt(199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219);
+ PreeditedPath3 = hide(z220=(357.135,385.448))z220..controls hide(z221=(345.75,382.778))z221 and hide(z222=(333.16,368.004))z222..hide(z223=(331.428,355.281))z223
+ ..controls hide(z224=(330.516,348.575))z224 and hide(z225=(332.776,345.015))z225..hide(z226=(340.64,340.775))z226
+ ..controls hide(z227=(347.237,337.218))z227 and hide(z228=(352.682,332.712))z228..hide(z229=(360.197,324.593))z229
+ ..controls hide(z230=(364.872,319.542))z230 and hide(z231=(367.186,317.542))z231..hide(z232=(369.283,316.742))z232
+ ..controls hide(z233=(372.885,315.367))z233 and hide(z234=(377.21,315.818))z234..hide(z235=(381.558,318.022))z235
+ ..controls hide(z236=(388.047,321.312))z236 and hide(z237=(396.27,330.475))z237..hide(z238=(400.019,338.594))z238
+ ..controls hide(z239=(401.562,341.935))z239 and hide(z240=(401.765,343.134))z240..hide(z241=(401.793,349.08))z241
+ ..controls hide(z242=(401.821,354.897))z242 and hide(z243=(401.601,356.33))z243..hide(z244=(400.143,359.82))z244
+ ..controls hide(z245=(393.363,376.06))z245 and hide(z246=(379.602,386.294))z246..hide(z247=(364.807,386.101))z247
+ ..controls hide(z248=(361.93,386.063))z248 and hide(z249=(358.521,385.773))z249..cycle;
+ renewcolore;
+ draw PreeditedPath3;
+ dotlabels.rt(220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249);
+ PreeditedPath4 = hide(z250=(230.29,279.386))z250..controls hide(z251=(220.653,277.409))z251 and hide(z252=(210.078,268.587))z252..hide(z253=(204.855,258.165))z253
+ ..controls hide(z254=(201.592,251.655))z254 and hide(z255=(200.56,246.913))z255..hide(z256=(200.918,240.072))z256
+ ..controls hide(z257=(201.417,230.546))z257 and hide(z258=(205.557,222.672))z258..hide(z259=(212.069,218.865))z259
+ ..controls hide(z260=(214.237,217.598))z260 and hide(z261=(216.097,217.11))z261..hide(z262=(219.613,216.886))z262
+ ..controls hide(z263=(228.86,216.297))z263 and hide(z264=(233.455,219.421))z264..hide(z265=(244.122,233.551))z265
+ ..controls hide(z266=(247.646,238.218))z266 and hide(z267=(251.522,242.976))z267..hide(z268=(252.795,244.196))z268
+ ..controls hide(z269=(254.993,246.303))z269 and hide(z270=(255.096,246.593))z270..hide(z271=(255.096,250.685))z271
+ ..controls hide(z272=(255.096,255.736))z272 and hide(z273=(253.262,263.325))z273..hide(z274=(250.847,268.267))z274
+ ..controls hide(z275=(246.692,276.77))z275 and hide(z276=(238.676,281.105))z276..cycle;
+ renewcolore;
+ draw PreeditedPath4;
+ dotlabels.rt(250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276);
+ PreeditedPath5 = hide(z277=(315.706,267.3))z277..controls hide(z278=(310.07,265.498))z278 and hide(z279=(305.137,260.211))z279..hide(z280=(300.623,251.133))z280
+ ..controls hide(z281=(296.045,241.926))z281 and hide(z282=(295.968,241.259))z282..hide(z283=(298.965,236.748))z283
+ ..controls hide(z284=(300.304,234.73))z284 and hide(z285=(302.736,229.906))z285..hide(z286=(304.412,225.943))z286
+ ..controls hide(z287=(310.819,210.79))z287 and hide(z288=(314.433,205.338))z288..hide(z289=(319.926,202.542))z289
+ ..controls hide(z290=(325.542,199.684))z290 and hide(z291=(335.821,202.351))z291..hide(z292=(341.611,208.169))z292
+ ..controls hide(z293=(350.474,217.073))z293 and hide(z294=(351.424,236.3))z294..hide(z295=(343.725,250.941))z295
+ ..controls hide(z296=(337.909,262.001))z296 and hide(z297=(324.189,270.012))z297..cycle;
+ renewcolore;
+ draw PreeditedPath5;
+ dotlabels.rt(277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297);
+ PreeditedPath6 = hide(z298=(251.708,195.581))z298..controls hide(z299=(245.954,194.662))z299 and hide(z300=(242.601,191.25))z300..hide(z301=(243.409,187.135))z301
+ ..controls hide(z302=(243.88,184.73))z302 and hide(z303=(245.89,183.255))z303..hide(z304=(251.516,181.182))z304
+ ..controls hide(z305=(256.887,179.204))z305 and hide(z306=(261.102,176.061))z306..hide(z307=(263.429,172.302))z307
+ ..controls hide(z308=(264.181,171.087))z308 and hide(z309=(265.18,170.064))z309..hide(z310=(265.614,170.064))z310
+ ..controls hide(z311=(266.044,170.064))z311 and hide(z312=(267.564,170.977))z312..hide(z313=(268.906,172.042))z313
+ ..controls hide(z314=(272.56,174.94))z314 and hide(z315=(275.427,176.235))z315..hide(z316=(280.031,177.066))z316
+ ..controls hide(z317=(285.146,177.99))z317 and hide(z318=(288.846,179.502))z318..hide(z319=(289.653,180.997))z319
+ ..controls hide(z320=(291.597,184.6))z320 and hide(z321=(289.237,189.242))z321..hide(z322=(284.314,191.499))z322
+ ..controls hide(z323=(278.305,194.254))z323 and hide(z324=(258.741,196.703))z324..cycle;
+ renewcolore;
+ draw PreeditedPath6;
+ dotlabels.rt(298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324);
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/featpost/example/xcmplaca2buraquads.mp b/graphics/metapost/contrib/macros/featpost/example/xcmplaca2buraquads.mp
new file mode 100644
index 0000000000..45b31f78de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/xcmplaca2buraquads.mp
@@ -0,0 +1,69 @@
+% xcmplaca2buraquads.mp
+% L. Nobre G.
+% 2008
+
+verbatimtex
+\documentclass{article}
+\usepackage{palatino,concmath,ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ numeric fy, tf, fl, tk, fu, fd;
+ fy = 0.25+uniformdeviate( 0.35 );
+ tf = 0.4*fy/sqrt(2.0);
+ fl = 0.3*tf+uniformdeviate( 0.7*tf );
+ tk = fl/sqrt(2.0);
+ fu = tk+uniformdeviate( 0.24-tk );
+ fd = 0.26+uniformdeviate( 0.24-tk );
+ numeric u,h,w;
+ u = 5mm;
+ w = 10u;
+ h = 11*u*fy;
+ drawarrow origin--(0,h);
+ drawarrow origin--(w,0);
+ label.lft( btex $y$ etex, (0,h) );
+ label.bot( btex $x$ etex, (w,0) );
+ numeric marg, tl;
+ tl = 0.05*h;
+ marg = 0.1*w;
+ numeric xzero, yzero, xum, xdois, yum, ydois, lado, ang;
+ xzero = w-marg;
+ yzero = h-marg;
+ xum = fu * xzero;
+ xdois = fd * xzero;
+ yum = 0.7 * yzero;
+ ydois = 0.3 * yzero;
+ lado = fl * xzero;
+ ang = 10+uniformdeviate( 26 );
+ path placa, quadrad, quadrum, quadois;
+ placa = origin--(xzero,0)--(xzero,yzero)--(0,yzero)--cycle;
+ fill placa withcolor 0.5white;
+ draw placa;
+ quadrad = (origin--(lado,0)--(lado,lado)--(0,lado)--cycle)
+ shifted (-0.5*lado*(1,1)) rotated ang;
+ quadrum = quadrad shifted (xum,yum);
+ quadois = quadrad shifted (xdois,ydois);
+ unfill quadrum;
+ draw quadrum;
+ unfill quadois;
+ draw quadois;
+ z1 = (xum,0);
+ z2 = (xdois,0);
+ z3 = (xzero,0);
+ z4 = (0,yzero);
+ draw z1--(z1+tl*up);
+ draw z2--(z2+tl*up);
+ draw z3--(z3+tl*up);
+ draw z4--(z4+tl*right);
+ label.lft( btex $y_0$ etex, z4 );
+ label.bot( btex $x_1$ etex, z1 );
+ label.bot( btex $x_2$ etex, z2 );
+ label.bot( btex $x_0$ etex, z3 );
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end.
diff --git a/graphics/metapost/contrib/macros/featpost/example/xraycamera.mp b/graphics/metapost/contrib/macros/featpost/example/xraycamera.mp
new file mode 100644
index 0000000000..f2fd74873d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/example/xraycamera.mp
@@ -0,0 +1,117 @@
+% xraycamera.mp
+% L. Nobre G.
+% IYP (2005)
+
+input featpost3Dplus2D;
+
+verbatimtex
+\documentclass{article}
+\usepackage{beton}
+\usepackage{concmath}
+\usepackage{ccfonts}
+\begin{document}
+etex
+
+beginfig(1);
+ f := (10,7,8);
+ Spread := 45;
+ numeric w, h, l, d, t, tr, tl, ma, mb, we, ar;
+ w = 3;
+ h = 2;
+ l = 4;
+ d = 0.75;
+ t = 1.2;
+ tr= 0.15;
+ tl= 0.25;
+ ma= 0.3;
+ mb= 0.2;
+ ar= 2;
+ we= 0.6*(h-t);
+ pen thin, thick, aver;
+ thin = pencircle scaled 0.5pt;
+ thick= pencircle scaled 1.5pt;
+ aver = pencircle scaled 1.0pt;
+ ahlength:=2mm;
+ ahangle:=30;
+ color p[];
+ p1 = (0,w/2,-ma-mb);
+ p2 = (0,w/2,-ma);
+ p3 = (0,w/2,0);
+ p4 = (0,w/2,h);
+ p5 = (0,-w/2,-ma-mb);
+ p6 = (0,-w/2,-ma);
+ p7 = (0,-w/2,0);
+ p8 = (0,-w/2,h);
+ p9 = (0,-w/2-ma-mb,0);
+ p10= (0,-w/2-ma,0);
+ p11= (0,-w/2-ma-mb,h);
+ p12= (0,-w/2-ma,h);
+ p13= (-l,-w/2-ma-mb,h);
+ p14= (-l,-w/2-ma,h);
+ p15= (-l,-w/2,h);
+ p16= (-l,-w/2,0);
+ p17= (-l,w/2,0);
+ p18= (-l,w/2,h);
+ p19= (-l+d,0,0);
+ p20= (-l+d,0,t);
+ p21= (-l-ma,0,t);
+ p22= (-l-ma-mb,0,t);
+ p23= (-l-ma,0,0);
+ p24= (-l-ma-mb,0,0);
+ p25= (-l+d,w/2+ma,0);
+ p26= (-l+d,w/2+ma+mb,0);
+ p27= (-l,w/2+ma,0);
+ p28= (-l,w/2+ma+mb,0);
+ p29= 0.5[p2,p6];
+ p30= 0.5[p10,p12];
+ p31= 0.5[p12,p14];
+ p32= 0.5[p21,p23];
+ p33= 0.5[p25,p27];
+ p34= (0,0,h);
+ p35= (0,0,2*t-h);
+ drawoptions( withpen thick );
+ draw rp(p8)--rp(p4)--rp(p3)--rp(p7)--rp(p8)--rp(p15)--rp(p16);
+ draw rp(p15)--rp(p18)--rp(p17)--rp(p3)--rp(p4)--rp(p18);
+ path pat[];
+ pat1 = rp(p8)--rp(p4);
+ pat2 = rp(p7)--rp(p16)--rp(p17);
+ pat3 = rp(p4)--rp(p18);
+ pat4 = pat2 cutbefore pat1 cutafter pat3;
+ draw pat4;
+ drawoptions( withpen thin );
+ drawdblarrow rp(p2)--rp(p6);
+ drawdblarrow rp(p10)--rp(p12);
+ drawdblarrow rp(p14)--rp(p12);
+ drawdblarrow rp(p21)--rp(p23);
+ drawdblarrow rp(p25)--rp(p27);
+ draw rp(p1)--rp(p3);
+ draw rp(p5)--rp(p7);
+ draw rp(p7)--rp(p9);
+ draw rp(p8)--rp(p11);
+ draw rp(p13)--rp(p15);
+ draw rp(p20)--rp(p22);
+ draw rp(p19)--rp(p24);
+ draw rp(p17)--rp(p28);
+ draw rp(p19)--rp(p26);
+ drawoptions( withpen thick );
+ rigorousdisc( 0, true, p20, tr, (-tl,0,0) );
+ draw rp(p19)--rp(p20) withpen thin;
+ drawoptions( withpen aver );
+ draw rp(p34)--rp(p20)--rp(p35);
+ fill ellipticpath( (0,0,t), (h-t)*blue, we*green ) withcolor 0.5white;
+ draw pat2 dashed evenly withpen thick;
+ draw rp(p20)--rp(p35)--rp(p34) dashed evenly;
+ draw rp((0,0,t)-we*green)--rp((0,0,t)+we*green) dashed evenly;
+ angline( p34, p35, p20, ar, btex $\alpha$ etex, llft );
+ label.bot(btex $w$ etex, rp(p29));
+ label.lft(btex $h$ etex, rp(p30));
+ label.top(btex $l$ etex, rp(p31));
+ label.lft(btex $t$ etex, rp(p32));
+ label.rt(btex $d$ etex, rp(p33));
+endfig;
+
+verbatimtex
+\end{document}
+etex
+
+end;
diff --git a/graphics/metapost/contrib/macros/featpost/featpost.mp b/graphics/metapost/contrib/macros/featpost/featpost.mp
new file mode 100644
index 0000000000..67c930e8a5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/featpost.mp
@@ -0,0 +1,2 @@
+input featpost3Dplus2D;
+
diff --git a/graphics/metapost/contrib/macros/featpost/featpost3Dplus2D.mp b/graphics/metapost/contrib/macros/featpost/featpost3Dplus2D.mp
new file mode 100644
index 0000000000..52a5f7789e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/featpost3Dplus2D.mp
@@ -0,0 +1,4625 @@
+% featpost3Dplus2D.mp
+% L. Nobre G., lnobreg@gmail.com, http://matagalatlante.org
+% C. Barbarosie
+% J. Schwaiger
+% B. Jackowski
+% P. J. Sebastião
+% P. Jørgensen
+% S. Pakin
+%
+% Copyright (C) 2014
+
+% This set of macros adds a lot of features to
+% the MetaPost language and eases the production of
+% physics diagrams and animations.
+
+% This is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 3
+% of the License, or (at your option) any later version.
+
+% This set of macros is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+
+ message "FeatPost-0.8.8";
+
+ warningcheck := 0;
+ background := 0.987white;
+ defaultscale := 0.75;
+ defaultfont := "cmss17"; % This is used by cartaxes
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Global Variables %%%%%%%%%%%
+
+ boolean ParallelProj, SphericalDistortion, FCD[], ShadowOn;
+ boolean OverRidePolyhedricColor, MalcomX;
+ numeric Nobjects, RefDist[], HoriZon, RopeColorSeq[], PhotoMarks;
+ numeric Spread, PrintStep, PageHeight, PageWidth, ActuC, Shifts;
+ numeric NL, npl[], NF, npf[], FC[], MaxFearLimit, TableColors;
+ numeric TDAtiplen, TDAhalftipbase, TDAhalfthick, RopeColors, NCL;
+ pair OriginProjPagePos, ShiftV, PhotoPair[];
+ path VGAborder, CLPath[];
+ color f, viewcentr, V[], L[]p[], F[]p[], TableC[];
+ color HigColor, SubColor, LightSource, PhotoPoint[];
+ string ostr[];
+ pen BackPen, ForePen;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default Values %%%%%%%%%%%%%%%
+
+ f := (3,5,4); % This f is the point of view in 3D
+
+ viewcentr := black; % This is the aim of the view
+
+ Spread := 140; % Magnification
+
+ Shifts := 105.00mm;
+
+ ShiftV := Shifts*(1,1); % Central coordinates on paper
+
+ OriginProjPagePos := (Shifts,148.45mm); % This should be the
+ % page center.
+
+ ParallelProj := false; % Kind of perspective %
+ % Can't have both true
+ SphericalDistortion := false; % Kind of lens %
+
+ VGAborder := (182.05,210.00)-- % This definition assumes
+ (412.05,210.00)-- % ShiftV = 105.00mm(1,1)
+ (412.05,382.05)-- % Use: gs -r200 and you
+ (182.05,382.05)--cycle; % get few extra pixels
+
+ PrintStep := 5; % Coarseness, in resolvec
+
+ PageHeight := 9in;
+ PageWidth := 6in; % And this is used by produce_auto_scale
+
+ MaxFearLimit := 17; % Valid Maximum Distance from Origin
+
+ HigColor := 0.85white; % These two colors are used in
+ SubColor := 0.35white; % fillfacewithlight
+ LightSource := 10*(4,-3,4); % This also
+ OverRidePolyhedricColor:=false; % And also this
+ ShadowOn := false; % Some objects may block the light and
+ HoriZon := 0; % cast a shadow on a horizontal plane at this Z
+
+ TableC0 := 0.85white; % grey %% G N U P L O T
+ TableC1 := red; % red %%
+ TableC2 := ( 0.2, 0.2, 1.0 ); % blue %% colors
+ TableC3 := ( 1.0, 0.7, 0.0 ); % orange %%
+ TableC4 := 0.85green; % pale green %%
+ TableC5 := 0.90*(red+blue); % magenta %%
+ TableC6 := 0.85*(green+blue); % cyan %%
+ TableC7 := 0.85*(red+green); % yellow %%
+
+ TableColors := 7;
+ ActuC := 5;
+
+ RopeColorSeq0 := 3; %
+ RopeColorSeq1 := 3; %
+ RopeColorSeq2 := 1; %
+ RopeColorSeq3 := 3; % ropepattern
+ RopeColorSeq4 := 7; %
+ RopeColorSeq5 := 5; %
+ %
+ RopeColors := 5; %
+
+ Nobjects := 0; % getready and doitnow
+
+ TDAtiplen := 0.05; % tdarrow and tdcircarrow
+ TDAhalftipbase := 0.02; % Three-Dimensional (Circular)
+ TDAhalfthick := 0.01; % Arrow
+
+ NCL := 0; % closedline
+ ForePen := pencircle scaled 15pt;
+ BackPen := pencircle scaled 9pt;
+
+ MalcomX := false;
+
+ %%% The variables PhotoMarks, PhotoPair[], PhotoPoint[]
+ %%% and CLPath[] have NO default values.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Part I:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Very basic:
+
+% Colors have three or four coordinates. Get one.
+
+ def X(expr A) =
+ if color A: redpart A elseif MalcomX: blackpart A else: cyanpart A fi
+ enddef;
+
+ def Y(expr A) =
+ if color A: greenpart A else: magentapart A fi
+ enddef;
+
+ def Z(expr A) =
+ if color A: bluepart A else: yellowpart A fi
+ enddef;
+
+ def W(expr A) =
+ blackpart A
+ enddef;
+
+% The length of a vector.
+
+ def conorm(expr A) =
+ ( X(A) ++ Y(A) ++ Z(A) )
+ enddef;
+
+ def cmyknorm(expr A) = %% This is not good when MalcomX is true
+ ( X(A) ++ Y(A) ++ Z(A) ++ W(A) )
+ enddef;
+
+ def makecmyk( expr A, B ) =
+ ( ( X(A), Y(A), Z(A), B ) )
+ enddef;
+
+ def maketrio( expr A ) =
+ ( ( X(A), Y(A), Z(A) ) )
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Vector Calculus:
+
+% Calculate the unit vector of a vector (or a point)
+
+ def N(expr A) =
+ begingroup
+ save M, exitcolor;
+ numeric M;
+ color exitcolor;
+ M = conorm( A );
+ if M > 0:
+ exitcolor = ( X(A)/M, Y(A)/M, Z(A)/M );
+ else:
+ exitcolor := black;
+ fi;
+ ( exitcolor )
+ endgroup
+ enddef;
+
+ def cdotprod(expr A, B) =
+ ( X(A)*X(B) + Y(A)*Y(B) + Z(A)*Z(B) )
+ enddef;
+
+ def ccrossprod(expr A, B) =
+ ( Y(A)*Z(B) - Z(A)*Y(B),
+ Z(A)*X(B) - X(A)*Z(B),
+ X(A)*Y(B) - Y(A)*X(B) )
+ enddef;
+
+% The dotproduct of two normalized vectors is the cosine of the angle
+% they form.
+
+ def ndotprod(expr A, B) =
+ begingroup
+ save a, b;
+ color a, b;
+ a = N(A);
+ b = N(B);
+ ( ( X(a)*X(b) + Y(a)*Y(b) + Z(a)*Z(b) ) )
+ endgroup
+ enddef;
+
+% The normalized crossproduct of two vectors.
+
+ def ncrossprod(expr A, B) =
+ N( ccrossprod( A, B ) )
+ enddef;
+
+% Haahaa! Trigonometry.
+
+ def getangle(expr A, B) =
+ begingroup
+ save coss, sine;
+ numeric coss, sine;
+ coss := cdotprod( A, B );
+ sine := conorm( ccrossprod( A, B ) );
+ ( angle( coss, sine ) )
+ endgroup
+ enddef;
+
+% Something I need for spatialhalfsfear.
+
+ def getcossine( expr Center, Radius ) =
+ begingroup
+ save a, b;
+ numeric a, b;
+ a = conorm( f - Center );
+ b = Radius/a;
+ if abs(b) >= 1:
+ show "The point of view f is too close (getcossine).";
+ b := 2; % DANGER!
+ fi;
+ ( b )
+ endgroup
+ enddef;
+
+% The following routine is used by circularsheet and may be used to
+% rotate vectors elliptically. Also used by tdcircarrow.
+
+ vardef planarrotation( expr VecX, VecY, TheAngle ) =
+ ( VecX*cosd( TheAngle ) + VecY*sind( TheAngle ) )
+ enddef;
+
+% The following routine could be used by kindofcube and may be used to
+% rotate polyhedra (must cycle through all Vs before calling makeface).
+
+ def eulerrotation( expr AngA, AngB, AngC, Vec ) =
+ begingroup
+ save auxx, auxy, veca, vecb, vecc;
+ color auxx, auxy, veca, vecb, vecc;
+ veca = ( cosd(AngA)*cosd(AngB),
+ sind(AngA)*cosd(AngB),
+ sind(AngB) );
+ auxx = ( cosd(AngA+90), sind(AngA+90), 0 );
+ auxy = ccrossprod( veca, auxx );
+ vecb = cosd(AngC)*auxx + sind(AngC)*auxy;
+ vecc = cosd(AngC+90)*auxx + sind(AngC+90)*auxy;
+ ( X(Vec)*veca + Y(Vec)*vecb + Z(Vec)*vecc )
+ endgroup
+ enddef;
+
+% Rotate a vector around another. Supposes all vectors share the same origin.
+
+ def rotvecaroundanother( expr Angle, RotVec, FixVec ) =
+ begingroup
+ save uf, cf, xr, yr;
+ color uf, cf, xr, yr;
+ uf = N( FixVec );
+ yr = ccrossprod( uf, RotVec );
+ cf = uf*cdotprod( uf, RotVec );
+ xr = RotVec - cf;
+ ( cf + planarrotation( xr, yr, Angle ) )
+ endgroup
+ enddef;
+
+% inplanarvolume is used by kindofcube.
+
+ def inplanarvolume( expr PointPerpA, PointPerpB, Point ) =
+ begingroup
+ save va, vb, vc;
+ color va, vb, vc;
+ va = Point - PointPerpA;
+ vb = Point - PointPerpB;
+ vc = PointPerpB - PointPerpA;
+ ( cdotprod(va,vc)*cdotprod(vb,vc) <= 0 )
+ endgroup
+ enddef;
+
+% Maybe you would like to calculate the angular arguments of kindofcube...
+
+ def getanglepair( expr InVec ) =
+ begingroup
+ save alphaone, alphatwo;
+ numeric alphaone, alphatwo;
+ alphaone = angle( ( X(InVec), Y(InVec) ) );
+ alphatwo = angle( ( X(InVec) ++ Y(InVec), Z(InVec) ) );
+ ( (alphaone,alphatwo) )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Auxiliary:
+
+% Projection Size. Meant for objects with size one.
+% Used by signalvertex.
+
+ def ps(expr A, Thicken_Factor) =
+ Thicken_Factor/conorm(A-f)/3
+ enddef;
+
+% Rigorous Projection of a Point. Draws a circle with
+% a diameter inversely proportional to the distance of
+% that Point from the point of view.
+
+ def signalvertex(expr A, TF, Col) =
+ draw rp(A) withcolor Col withpen pencircle scaled (Spread*ps(A,TF))
+ enddef;
+
+ def signalshadowvertex(expr A, TF, Col) =
+ begingroup
+ save auxc, auxn;
+ color auxc;
+ numeric auxn;
+ auxc := cb(A);
+ auxn := TF*conorm(f-auxc)/conorm(LightSource-A);
+ signalvertex( auxc, auxn, Col )
+ endgroup
+ enddef;
+
+% Get the vector that projects onto the resolution
+
+ def resolvec(expr A, B) =
+ begingroup
+ save sizel, returnvec;
+ numeric sizel;
+ color returnvec;
+ sizel = abs( rp(A) - rp(B) );
+ if sizel > 0:
+ returnvec = PrintStep*(B-A)/sizel;
+ else:
+ returnvec = 0.3*(B-A);
+ fi;
+ ( returnvec )
+ endgroup
+ enddef;
+
+% Movies need a constant frame
+
+ def produce_vga_border =
+ begingroup
+ draw VGAborder withcolor background withpen pencircle scaled 0;
+ clip currentpicture to VGAborder
+ endgroup
+ enddef;
+
+% The following macro fits a figure in the page.
+% Probably it is obsolete since MetaPost 1.000
+% Should be the last command in a figure.
+
+ def produce_auto_scale =
+ begingroup
+ picture storeall, scaleall;
+ numeric pwidth, pheight;
+ storeall = currentpicture shifted -(center currentpicture);
+ currentpicture := nullpicture;
+ pwidth = xpart ((lrcorner storeall)-(llcorner storeall));
+ pheight = ypart ((urcorner storeall)-(lrcorner storeall));
+ if PageHeight/PageWidth < pheight/pwidth:
+ scaleall = storeall scaled (PageHeight/pheight);
+ else:
+ scaleall = storeall scaled (PageWidth/pwidth);
+ fi;
+ draw scaleall shifted OriginProjPagePos
+ endgroup
+ enddef;
+
+% The following two procedures are useful for getready.
+
+ vardef cstr( expr Cl ) =
+ "(" &
+ decimal(X(Cl)) &
+ "," &
+ decimal(Y(Cl)) &
+ "," &
+ decimal(Z(Cl)) &
+ ")"
+ enddef;
+
+ vardef bstr( expr bv ) =
+ save bstring; string bstring;
+ if bv: bstring = "true"; else: bstring = "false"; fi;
+ bstring
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Fundamental:
+
+% Rigorous Projection. This the kernel of all these lines of code.
+% It won't work if R belongs the plane that contains f and that is
+% ortogonal to vector f-viewcentr, unless SphericalDistortion is true.
+% f-viewcentr must not be (anti-)parallel to zz.
+
+ def rp(expr R) =
+ begingroup
+
+ save projpoi;
+ save v, u;
+ save verti, horiz, eta, squarf, radio, ang, lenpl;
+ pair projpoi;
+ color v, u;
+ numeric verti, horiz, eta, squarf, radio, ang, lenpl;
+
+ v = N( (-Y(f-viewcentr), X(f-viewcentr), 0) );
+ u = ncrossprod( f-viewcentr, v );
+
+ horiz = cdotprod( R-viewcentr, v );
+ verti = cdotprod( R-viewcentr, u );
+
+ if SphericalDistortion:
+ if ( horiz <> 0 ) or ( verti <> 0 ):
+ lenpl = ( horiz ++ verti )*20; %%%%%%%%%%%%%%% DANGER
+ ang = getangle( f-R, f-viewcentr );
+ horiz := ang*horiz/lenpl;
+ verti := ang*verti/lenpl;
+ projpoi = (horiz,verti);
+ else:
+ projpoi = origin;
+ fi;
+ else:
+ if ParallelProj:
+ eta = 1;
+ else:
+ squarf = cdotprod( f-viewcentr, f-viewcentr );
+ radio = cdotprod( R-viewcentr, f-viewcentr );
+ eta = 1 - radio/squarf;
+ if abs((horiz,verti)) > MaxFearLimit*eta:
+ eta := abs((horiz,verti))/MaxFearLimit;
+ fi;
+ fi;
+ projpoi = (horiz,verti)/eta;
+ fi;
+
+ ( projpoi*Spread + ShiftV )
+
+ endgroup
+ enddef;
+
+% Much improved rigorous pseudo-projection algorithm that follows
+% an idea from Cristian Barbarosie.
+% This makes shadows caused by a light source point.
+
+ def cb(expr R) =
+ begingroup
+ save ve, ho;
+ numeric ve, ho;
+ LightSource-ho*red-ve*green-HoriZon*blue=whatever*(LightSource-R);
+ ( ho*red + ve*green + HoriZon*blue )
+ endgroup
+ enddef;
+
+% And this just projects points rigorously on some generic plane using
+% LightSource as the point of convergence (focus).
+
+ def projectpoint(expr ViewCentr, R) =
+ begingroup
+ save verti, horiz;
+ save v, u, lray;
+ numeric verti, horiz;
+ color v, u, lray;
+ lray = LightSource-ViewCentr;
+ v = N( (-Y(lray), X(lray), 0) );
+ u = ncrossprod( lray, v );
+ lray - horiz*v - verti*u = whatever*( LightSource - R );
+ ( horiz*v + verti*u + ViewCentr )
+ endgroup
+ enddef;
+
+% And this is the way to calculate the intersection of some line with some
+% plan.
+
+ def lineintersectplan( expr LinePoi, LineDir, PlanPoi, PlanDir ) =
+ begingroup
+ save incognitus;
+ color incognitus;
+ cdotprod( incognitus-PlanPoi, PlanDir ) = 0;
+ whatever*LineDir + LinePoi = incognitus;
+ ( incognitus )
+ endgroup
+ enddef;
+
+% Vanishing point.
+
+ def vp( expr D ) =
+ begingroup
+ ( rp( lineintersectplan( f, D, viewcentr, f-viewcentr) ) )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Basic Functions:
+
+% Get the 2D path of a straight line in beetween 3D points A and B.
+% This would add rigor to rigorousdisc, if one would introduce the
+% the concept of three-dimensional path. That is not possible now.
+% Also this is only interesting when using SphericalDistortion:=true
+
+ def pathofstraightline( expr A, B ) =
+ begingroup
+ save k, i, mark, stepVec, returnp, pos;
+ numeric k, i;
+ color mark, stepVec;
+ path returnp;
+ pair pos[];
+ stepVec = resolvec(A,B);
+ pos0 = rp( A );
+ k = 1;
+ forever:
+ mark := A+(k*stepVec);
+ exitif cdotprod(B-mark,stepVec) <= 0;
+ pos[k] = rp( mark );
+ k := incr(k);
+ endfor;
+ pos[k] = rp(B);
+ returnp = pos0 for i=1 upto k: ..pos[i] endfor;
+ ( returnp )
+ endgroup
+ enddef;
+
+ def drawsegment( expr A, B ) =
+ begingroup
+ if SphericalDistortion:
+ draw pathofstraightline( A, B );
+ else:
+ draw rp(A)--rp(B);
+ fi
+ endgroup
+ enddef;
+
+% Cartesian axes with prescribed lengths.
+
+ def cartaxes(expr axex, axey, axez) =
+ begingroup
+ save orig, axxc, ayyc, azzc;
+ color orig, axxc, ayyc, azzc;
+ orig = (0,0,0);
+ axxc = (axex,0,0);
+ ayyc = (0,axey,0);
+ azzc = (0,0,axez);
+ drawarrow rp(orig)..rp(axxc);
+ drawarrow rp(orig)..rp(ayyc);
+ drawarrow rp(orig)..rp(azzc);
+ label.bot( "x" ,rp(axxc)); %%%%%%%%%%%%%%%%%%%%%%%%%
+ label.bot( "y" ,rp(ayyc)); %% Some Labels... %%
+ label.lft( "z" ,rp(azzc)); %%%%%%%%%%%%%%%%%%%%%%%%%
+ endgroup
+ enddef;
+
+% Orthogonal axes with prescribed lengths and labels.
+
+ def orthaxes(expr axex, strx, axey, stry, axez, strz ) =
+ begingroup
+ save axxc, ayyc, azzc;
+ color axxc, ayyc, azzc;
+ axxc = (axex,0,0);
+ ayyc = (0,axey,0);
+ azzc = (0,0,axez);
+ drawarrow rp(black)..rp(axxc);
+ drawarrow rp(black)..rp(ayyc);
+ drawarrow rp(black)..rp(azzc);
+ label.bot( strx ,rp(axxc));
+ label.bot( stry ,rp(ayyc));
+ label.lft( strz ,rp(azzc));
+ endgroup
+ enddef;
+
+% This is it. Draw an arch beetween two straight lines with a
+% common point (Or) in three-dimensional-euclidian-space and
+% place a label near the middle of the arch. Points A and B
+% define the lines. The arch is at a distance W from Or. The
+% label is S and the position is RelPos (rt,urt,top,ulft,lft,
+% llft,bot,lrt). But arches must be smaller than 180 degrees.
+
+ def angline(expr A, B, Or, W, S)(suffix RelPos) =
+ begingroup
+ save G, Dna, Dnb, al;
+ numeric G;
+ color Dna, Dnb;
+ path al;
+ G = conorm( W*( N(A-Or) - N(B-Or) ) )/2.5; %%%%%%% BIG DANGER!
+ Dna = ncrossprod(ncrossprod(A-Or,B-Or),A-Or);
+ Dnb = ncrossprod(ncrossprod(B-Or,A-Or),B-Or);
+ al = rp(W*N(A-Or)+Or)..
+ controls rp(W*N(A-Or)+Or+G*Dna)
+ and rp(W*N(B-Or)+Or+G*Dnb)..
+ rp(W*N(B-Or)+Or);
+ draw al;
+ label.RelPos( S, point 0.5*length al of al )
+ endgroup
+ enddef;
+
+% As i don't know how to declare variables of type suffix,
+% i provide a way to avoid the problem. This time RelPos may
+% be 0,1,2,3,4,6,7 or anything else.
+
+ def anglinen(expr A, B, Or, W, S, RelPos) =
+ begingroup
+ save G, Dna, Dnb, al, middlarc;
+ numeric G;
+ color Dna, Dnb;
+ path al;
+ pair middlarc;
+ G = conorm( W*( N(A-Or) - N(B-Or) ) )/3;
+ Dna = ncrossprod(ncrossprod(A-Or,B-Or),A-Or);
+ Dnb = ncrossprod(ncrossprod(B-Or,A-Or),B-Or);
+ al = rp(W*N(A-Or)+Or)..
+ controls rp(W*N(A-Or)+Or+G*Dna)
+ and rp(W*N(B-Or)+Or+G*Dnb)..
+ rp(W*N(B-Or)+Or);
+ draw al;
+ middlarc = point 0.5*length al of al;
+ if RelPos = 0:
+ label.rt( S, middlarc );
+ elseif RelPos =1:
+ label.urt( S, middlarc );
+ elseif RelPos =2:
+ label.top( S, middlarc );
+ elseif RelPos =3:
+ label.ulft( S, middlarc );
+ elseif RelPos =4:
+ label.lft( S, middlarc );
+ elseif RelPos =5:
+ label.llft( S, middlarc );
+ elseif RelPos =6:
+ label.bot( S, middlarc );
+ elseif RelPos =7:
+ label.lrt( S, middlarc );
+ else:
+ label( S, middlarc );
+ fi
+ endgroup
+ enddef;
+
+% As a bigger avoidance, replace the arch by a paralellogram.
+
+ def squareangline(expr A, B, Or, W) =
+ begingroup
+ save sal;
+ path sal;
+ sal = rp(Or)--rp(W*N(A-Or)+Or)--
+ rp(W*(N(B-Or)+N(A-Or))+Or)--rp(W*N(B-Or)+Or)--cycle;
+ draw sal
+ endgroup
+ enddef;
+
+% Just as we are here we can draw circles. (color,color,numeric)
+
+ def rigorouscircle( expr CenterPos, AngulMom, Radius ) =
+ begingroup
+ save ind, G, Dn, Dna, Dnb, al, vec;
+ numeric ind, G;
+ color vec[], Dn, Dna, Dnb;
+ path al;
+ vec1 = ncrossprod( CenterPos-f, AngulMom);
+ for ind=2 step 2 until 8:
+ vec[ind+1] = ncrossprod( vec[ind-1], AngulMom );
+ vec[ind] = N( vec[ind-1] + vec[ind+1] );
+ endfor;
+ G = conorm( Radius*( vec1 - vec2 ) )/3;
+ al = rp(Radius*vec1+CenterPos)
+ for ind=2 upto 8:
+ hide(
+ Dn:=ncrossprod(vec[ind-1],vec[ind]);
+ Dna:=ncrossprod(Dn,vec[ind-1]);
+ Dnb:=ncrossprod(-Dn,vec[ind])
+ )
+ ..controls rp(Radius*vec[ind-1]+CenterPos+G*Dna)
+ and rp(Radius*vec[ind] +CenterPos+G*Dnb)
+ ..rp(Radius*vec[ind] +CenterPos)
+ endfor
+ ...cycle;
+ ( al )
+ endgroup
+ enddef;
+
+% 3D straight arrow.
+
+ def tdarrow(expr FromPos, ToTip ) =
+ begingroup
+ save basevec, longvec, a, b, c, d, e, g, h, len, p;
+ color basevec, longvec, a, b, c, d, e, g, h;
+ numeric len;
+ path p;
+ len = conorm( ToTip - FromPos );
+ longvec := N( ToTip - FromPos );
+ basevec := ncrossprod( FromPos-f, longvec );
+ if len <= TDAtiplen:
+ b = basevec*TDAhalftipbase*len/TDAtiplen;
+ c = FromPos+b;
+ e = FromPos-b;
+ p = rp(ToTip)--rp(c)--rp(e)--cycle;
+ else:
+ d = ToTip-longvec*TDAtiplen;
+ a = FromPos+basevec*TDAhalfthick;
+ h = FromPos-basevec*TDAhalfthick;
+ b = d+basevec*TDAhalfthick;
+ g = d-basevec*TDAhalfthick;
+ c = d+basevec*TDAhalftipbase;
+ e = d-basevec*TDAhalftipbase;
+ p = rp(a)--rp(b)--rp(c)--rp(ToTip)--rp(e)--rp(g)--rp(h)--cycle;
+ fi;
+ unfill p;
+ draw p
+ endgroup
+ enddef;
+
+% 3D circular arrow.
+
+ def tdcircarrow(expr CenterPos, AngulMom, Ray, StartAngle, Amplituda ) =
+ begingroup
+ save veca, vecb, vecc, vecd, a, b, c, d, p, stepa, numa, anga, angb;
+ save signus, ca, da, i;
+ color veca, vecb, vecc, vecd;
+ pair a, b, c, d, ca, da, aa;
+ numeric stepa, numa, anga, angb, signus, i;
+ path p;
+ signus = Amplituda/abs(Amplituda);
+ stepa = 6signus; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER.
+ vecd = ncrossprod( CenterPos-f, AngulMom );
+ vecc = ncrossprod( vecd, AngulMom );
+ anga = signus*180*(TDAhalfthick/TDAhalftipbase)*TDAtiplen/(3.14159*Ray);
+ angb = signus*180*TDAtiplen/(3.14159*Ray);
+ numa = StartAngle+Amplituda;
+ a = rp(Ray*planarrotation(vecc,vecd,StartAngle+anga));
+ b = rp(Ray*planarrotation(vecc,vecd,numa+angb));
+ c = rp((Ray+TDAhalftipbase)*planarrotation(vecc,vecd,numa));
+ d = rp((Ray-TDAhalftipbase)*planarrotation(vecc,vecd,numa));
+ ca = rp((Ray+TDAhalfthick)*planarrotation(vecc,vecd,numa));
+ da = rp((Ray-TDAhalfthick)*planarrotation(vecc,vecd,numa));
+ aa = rp((Ray-TDAhalfthick)*planarrotation(vecc,vecd,StartAngle));
+ p = for i=StartAngle step stepa until numa:
+ rp((Ray+TDAhalfthick)*planarrotation(vecc,vecd,i))..
+ endfor ca--c--b--d--da..
+ for i=numa-stepa step -stepa until StartAngle:
+ rp((Ray-TDAhalfthick)*planarrotation(vecc,vecd,i))..
+ endfor aa--a--cycle;
+ unfill p;
+ draw p
+ endgroup
+ enddef;
+
+% Draw lines with a better expression of three-dimensionality.
+
+ def emptyline(expr JoinP,ThickenFactor,OutCol,InCol,theN,EmptyFrac,sN)(text LinFunc) =
+ begingroup
+ save i, j, k;
+ numeric i, j, k;
+ k = ThickenFactor*EmptyFrac;
+ if ShadowOn:
+ for i = 0 upto theN:
+ signalshadowvertex( LinFunc(i/theN), ThickenFactor, black );
+ endfor;
+ fi;
+ for j = 0 upto sN-1:
+ signalvertex( LinFunc(j/theN), ThickenFactor, OutCol );
+ endfor;
+ if JoinP:
+ for j = -sN upto 0:
+ signalvertex( LinFunc(j/theN), k, InCol );
+ endfor;
+ fi;
+ for i = sN upto theN:
+ signalvertex( LinFunc( i/theN ), ThickenFactor, OutCol );
+ for j = sN downto 0:
+ signalvertex( LinFunc( (i-j)/theN ), k, InCol );
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+% Draw space-paths of possibly closed lines making use of "getready"
+
+ def closedline( expr ThisIsClosed, theN, ForeFrac, BackFrac )( text LinFunc ) =
+ begingroup
+ save i, comm;
+ numeric i;
+ string comm;
+ NCL := incr( NCL );
+ if ThisIsClosed:
+ CLPath[NCL] :=
+ for i=1 upto theN:
+ rp(LinFunc(i/theN))..
+ endfor
+ cycle;
+ for i=1 upto theN:
+ comm:="draw subpath ("
+ & decimal(i-ForeFrac)
+ & ","
+ & decimal(i+ForeFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen ForePen; undraw subpath ("
+ & decimal(i-BackFrac)
+ & ","
+ & decimal(i+BackFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen BackPen;";
+ getready( comm, LinFunc(i/theN) );
+ endfor;
+ else:
+ CLPath[NCL] := rp(LinFunc(0))
+ for i=1 upto theN: ..rp(LinFunc(i/theN)) endfor;
+ comm:="draw subpath (0,"
+ & decimal(ForeFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen ForePen; undraw subpath (0,"
+ & decimal(BackFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen BackPen;";
+ getready( comm, LinFunc(1/theN) );
+ for i=2 upto theN-1:
+ comm:="draw subpath ("
+ & decimal(i-ForeFrac)
+ & ","
+ & decimal(i+ForeFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen ForePen; undraw subpath ("
+ & decimal(i-BackFrac)
+ & ","
+ & decimal(i+BackFrac)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen BackPen;";
+ getready( comm, LinFunc(i/theN) );
+ endfor;
+ comm:="draw subpath ("
+ & decimal(theN-ForeFrac)
+ & ","
+ & decimal(theN)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen ForePen; undraw subpath ("
+ & decimal(theN-BackFrac)
+ & ","
+ & decimal(theN)
+ & ") of CLPath"
+ & decimal(NCL)
+ & " withpen BackPen;";
+ getready( comm, LinFunc(1) );
+ fi
+ endgroup
+ enddef;
+
+% The next allows you to draw any solid that has no vertices and that has
+% two, exactly two, cyclic edges. In fact, it doesn't need to be a solid.
+% In order to complete the drawing of this solid you have to choose one of
+% the edges to be drawn immediatly afterwards.
+
+ def twocyclestogether( expr CycleA, CycleB ) =
+ begingroup
+ save TheLengthOfA, TheLengthOfB, TheMargin, Leng, i;
+ save SubPathA, SubPathB, PolygonPath, FinalPath;
+ numeric TheLengthOfA, TheLengthOfB, TheMargin, Leng, i;
+ path SubPathA, SubPathB, PolygonPath, FinalPath;
+ TheMargin = 0.02;
+ TheLengthOfA = ( length CycleA ) - TheMargin;
+ TheLengthOfB = ( length CycleB ) - TheMargin;
+ SubPathA = subpath ( 0, TheLengthOfA ) of CycleA;
+ SubPathB = subpath ( 0, TheLengthOfB ) of CycleB;
+ PolygonPath = makepath makepen ( SubPathA--SubPathB--cycle );
+ Leng = (length PolygonPath) - 1;
+ FinalPath = point 0 of PolygonPath
+ for i = 1 upto Leng:
+ --point i of PolygonPath
+ endfor
+ --cycle;
+ ( FinalPath )
+ endgroup
+ enddef;
+
+% Ellipse on the air.
+
+ def ellipticpath(expr CenterPos, OneAxe, OtherAxe ) =
+ begingroup
+ save ind;
+ numeric ind;
+ ( for ind=0 upto 35:
+ rp( CenterPos+planarrotation(OneAxe,OtherAxe,ind*10) )...
+ endfor cycle )
+ endgroup
+ enddef;
+
+% Shadow of an ellipse on the air.
+
+ def ellipticshadowpath(expr CenterPos, OneAxe, OtherAxe ) =
+ begingroup
+ save ind;
+ numeric ind;
+ ( for ind=1 upto 36:
+ rp( cb( CenterPos+planarrotation(OneAxe,OtherAxe,ind*10) ) )...
+ endfor cycle )
+ endgroup
+ enddef;
+
+% It should be possible to attach some text to some plan.
+% Unfortunately, this only works correctly when ParallelProj := true;
+
+ def labelinspace(expr KeepRatio,RefPoi,BaseVec,UpVec)(text SomeString) =
+ begingroup
+ save labelpic, plak, lrc, ulc, llc, centerc, aratio, newbase;
+ picture labelpic;
+ pair lrc, ulc, llc;
+ transform plak;
+ color centerc, newbase;
+ numeric aratio;
+ labelpic = thelabel( SomeString, origin );
+ lrc = lrcorner labelpic;
+ ulc = ulcorner labelpic;
+ llc = llcorner labelpic;
+ aratio = (xpart lrc - xpart llc)/(ypart ulc - ypart llc);
+ if KeepRatio:
+ newbase = conorm(UpVec)*aratio*N(BaseVec);
+ else:
+ newbase = BaseVec;
+ fi;
+ rp(RefPoi+newbase) = lrc transformed plak;
+ rp(RefPoi+UpVec) = ulc transformed plak;
+ centerc = RefPoi+0.5(newbase+UpVec);
+ rp(RefPoi) = llc transformed plak;
+ label( labelpic transformed plak, rp(centerc) )
+ endgroup
+ enddef;
+
+% It should be possible to attach some path to some surface.
+
+ def closedpathinspace( expr SomeTDPath, NDivide )( text ConverterFunc ) =
+ begingroup
+ save i, outpath, st;
+ numeric i, st;
+ path outpath;
+ st = 1/NDivide;
+ outpath = for i=st step st until (length SomeTDPath):
+ ConverterFunc( point i of SomeTDPath ) --
+ endfor cycle;
+ ( outpath )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Standard Objects:
+
+% And more precisely. The next routines spatialhalfcircle and
+% rigorousfear require circles drawn in a systematic and precise way.
+
+ def goodcirclepath(expr CenterPos, AngulMom, Radius ) =
+ begingroup
+ save cirath, vecx, vecy, ind, goodangulmom, decision, view;
+ numeric ind, decision;
+ color vecx, vecy, goodangulmom, view;
+ path cirath;
+ view = f-CenterPos;
+ decision = cdotprod( view, AngulMom );
+ if decision < 0:
+ goodangulmom = -AngulMom;
+ else:
+ goodangulmom = AngulMom;
+ fi;
+ vecx = Radius*ncrossprod( view, goodangulmom );
+ decision := getangle( view, goodangulmom );
+ if decision > 0.5: %%%%%%%%%%%%%%% DANGER %%%
+ vecy = Radius*ncrossprod( goodangulmom, vecx );
+ cirath = for ind=10 step 10 until 360:
+ rp( CenterPos + planarrotation(vecx,vecy,ind) )...
+ endfor cycle;
+ else:
+ cirath = head_on_circle( CenterPos, Radius );
+ fi;
+ ( cirath )
+ endgroup
+ enddef;
+
+% And its shadow.
+
+ def circleshadowpath(expr CenterPos, AngulMom, Radius ) =
+ begingroup
+ save cirath, vecx, vecy, view, decision;
+ numeric decision;
+ color vecx, vecy, view;
+ path cirath;
+ view = LightSource-CenterPos;
+ vecx = ncrossprod( view, AngulMom );
+ decision := getangle( view, AngulMom );
+ if decision > 0.5: %%%%%%%%%%%%%%% DANGER %%%
+ vecy = ncrossprod( AngulMom, vecx );
+ cirath = ellipticshadowpath(CenterPos,vecx*Radius,vecy*Radius);
+ else:
+ vecx := N( (-Y(view), X(view), 0) );
+ vecy = ncrossprod( view, vecx );
+ cirath = ellipticshadowpath(CenterPos,vecx*Radius,vecy*Radius);
+ fi;
+ ( cirath )
+ endgroup
+ enddef;
+
+% When there are numerical problems with the previous routine
+% use the following alternative:
+
+ def head_on_circle(expr Pos, Radius ) =
+ begingroup
+ save vecx, vecy, ind, view;
+ numeric ind;
+ color vecx, vecy, view;
+ view = f-Pos;
+ vecx = Radius*N( (-Y(view), X(view), 0) );
+ vecy = Radius*ncrossprod( view, vecx );
+ ( for ind=10 step 10 until 360:
+ rp( Pos + planarrotation(vecx,vecy,ind) )...
+ endfor cycle )
+ endgroup
+ enddef;
+
+% The nearest or the furthest part of a circle returned as a path.
+% This function has been set to work for rigorousdisc (next).
+% Very tough settings they were.
+
+ def spatialhalfcircle(expr Center, AngulMom, Radius, ItsTheNearest ) =
+ begingroup
+ save va, vb, vc, cc, vd, ux, uy, pa, pb;
+ save nr, cn, valx, valy, valr, choiceang;
+ save auxil, auxih, fcirc, returnp;
+ save choice;
+ color va, vb, vc, cc, vd, ux, uy, pa, pb;
+ numeric nr, cn, valx, valy, valr, choiceang;
+ path auxil, auxih, fcirc, returnp;
+ boolean choice;
+ va := Center - f;
+ vb := N( AngulMom );
+ vc := vb*( cdotprod( va, vb ) );
+ cc := f + vc;
+ vd := cc - Center; % vd := va + vc;
+ nr := conorm( vd );
+ if Radius >= nr:
+ returnp := rp( cc ); % this single point will show up in spheroid
+ else:
+ valr := Radius*Radius;
+ valx := valr/nr;
+ valy := sqrt( valr - valx*valx );
+ ux := N( vd );
+ choiceang := getangle( vc, va ); %%%%%%%%%%%%%
+ choice := ( choiceang < 89 ) or ( choiceang > 91 );%% DANGER %
+ if choice: %%%%%%%%%%%%%
+ uy := ncrossprod( vc, va );
+ else:
+ uy := ncrossprod( AngulMom, va );
+ fi;
+ pa := valx*ux + valy*uy + Center;
+ pb := pa - 2*valy*uy;
+ if choice:
+ auxil := rp(1.1[Center,pb])--rp(0.9[Center,pb]);
+ auxih := rp(1.1[Center,pa])--rp(0.9[Center,pa]);
+ fcirc := goodcirclepath( Center, AngulMom, Radius );
+ if ItsTheNearest:
+ returnp := (fcirc cutafter auxih) cutbefore auxil;
+ else:
+ returnp := (fcirc cutbefore auxih)..(fcirc cutafter auxil);
+ fi;
+ else:
+ if ItsTheNearest:
+ if cdotprod( va, AngulMom ) > 0:
+ returnp := rp(pb)--rp(pa);
+ else:
+ returnp := rp(pa)--rp(pb);
+ fi;
+ else:
+ if cdotprod( va, AngulMom ) < 0:
+ returnp := rp(pb)--rp(pa);
+ else:
+ returnp := rp(pa)--rp(pb);
+ fi;
+ fi;
+ fi;
+ fi;
+ ( returnp )
+ endgroup
+ enddef;
+
+% Cylinders or tubes ( numeric, boolean, color, numeric, color ).
+% Great stuff. The "disc" in the name comes from the fact that
+% when SphericalDistortion := true; the sides of cylinders are
+% not drawn correctly (they are straight). And when it is a tube
+% you should force the background to be white.
+
+ def rigorousdisc(expr InRay, FullFill, BaseCenter, Radius, LenVec) =
+ begingroup
+ save va, vb, vc, cc, vd, base, holepic;
+ save vA, cC, nr, vala, valb, hashole, istube;
+ save auxil, auxih, halfl, halfh, thehole;
+ save auxili, auxihi, rect, theshadow;
+
+ color va, vb, vc, cc, vd, base;
+ picture holepic;
+ color vA, cC;
+ numeric nr, vala, valb;
+ boolean hashole, istube;
+ path auxil, auxih, halfl, halfh, thehole;
+ path auxili, auxihi, rect, theshadow;
+
+ va := BaseCenter - f;
+ vb := N( LenVec );
+ vc := vb*( cdotprod( va, vb ) );
+ cc := f + vc;
+ vd := cc - BaseCenter;
+ nr := conorm( vd );
+ base := BaseCenter + LenVec;
+ vA := base - f;
+ vala := conorm( va );
+ valb := conorm( vA );
+ if ShadowOn:
+ auxil := circleshadowpath( BaseCenter, LenVec, Radius );
+ auxih := circleshadowpath( base, LenVec, Radius );
+ fill twocyclestogether( auxil, auxih );
+ fi;
+ auxil := goodcirclepath( base, LenVec, Radius );
+ auxih := goodcirclepath( BaseCenter, LenVec, Radius );
+ istube := false;
+ hashole := false;
+ if InRay > 0:
+ istube := true;
+ auxili := goodcirclepath( base, LenVec, InRay );
+ auxihi := goodcirclepath( BaseCenter, LenVec, InRay );
+ hashole := (-1,-1) <> ( auxili intersectiontimes auxihi );
+ if hashole:
+ draw auxili;
+ draw auxihi;
+ holepic := currentpicture;
+ clip holepic to auxili;
+ clip holepic to auxihi;
+ fi;
+ fi;
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ if Radius >= nr: % THE CASE Radius > nr > InRay IS NOT SUPPORTED %
+ if vala <= valb :
+ thehole := auxil;
+ auxil := auxih;
+ auxih := thehole;
+ fi;
+ if istube:
+ if vala <= valb :
+ thehole := auxili;
+ auxili := auxihi;
+ auxihi := thehole;
+ fi;
+ holepic := currentpicture;
+ clip holepic to auxihi;
+ fi;
+ unfill auxil;
+ draw auxil;
+ if istube:
+ draw holepic;
+ draw auxihi;
+ fi;
+ else:
+ cC := base + vd;
+ if ( cdotprod( f - cc, f - cC ) <= 0 ) or ( not FullFill ):
+ halfl := spatialhalfcircle(BaseCenter,LenVec,Radius,true);
+ halfh := spatialhalfcircle(base,LenVec,Radius,true);
+ if FullFill:
+ rect := halfl--halfh--cycle;
+ else:
+ rect := halfl--(reverse halfh)--cycle;
+ fi;
+ unfill rect;
+ draw rect;
+ elseif vala > valb:
+ halfl := spatialhalfcircle(BaseCenter,LenVec,Radius,true);
+ halfh := spatialhalfcircle(base,LenVec,Radius,false);
+ rect := halfl--halfh--cycle;
+ unfill rect;
+ draw rect;
+ if istube:
+ if hashole:
+ draw holepic;
+ fi;
+ draw auxili;
+ fi;
+ draw auxil;
+ else:
+ halfl := spatialhalfcircle(BaseCenter,LenVec,Radius,false);
+ halfh := spatialhalfcircle(base,LenVec,Radius,true);
+ rect := halfl--halfh--cycle;
+ unfill rect;
+ draw rect;
+ if istube:
+ if hashole:
+ draw holepic;
+ fi;
+ draw auxihi;
+ fi;
+ draw auxih;
+ fi;
+ fi
+ endgroup
+ enddef;
+
+% And maybe a full cone border. The vertex may go anywhere.
+% Choose the full cone border (UsualForm=true) or just the nearest
+% part of the base edge (UsualForm=false).
+% This is used by tropicalglobe as a generic spatialhalfcircle to
+% draw only the in fact visible part of circular lines. Please, don't
+% put the vertex too close to the base plan when UsualForm=false.
+
+ def rigorouscone(expr UsualForm,CenterPos,AngulMom,Radius,VertexPos) =
+ begingroup
+ save basepath, thesubpath, fullpath, finalpath, auxpath, bigcirc;
+ save themargin, newlen, i, auxt, startt, endt, thelengthofc;
+ save pa, pb, pc, pd, pe;
+ path basepath, thesubpath, fullpath, finalpath, auxpath;
+ path bigcirc;
+ numeric themargin, newlen, i, auxt, startt, endt, thelengthofc;
+ pair pa, pb, pc, pd, pe;
+ themargin = 0.02; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER
+ basepath = goodcirclepath( CenterPos, AngulMom, Radius );
+ thelengthofc = ( length basepath ) - themargin;
+ thesubpath = subpath ( 0, thelengthofc ) of basepath;
+ fullpath = makepath makepen ( rp(VertexPos)--thesubpath--cycle );
+ pa = 0.995[rp(CenterPos),rp(VertexPos)];
+ pb = 1.005[rp(CenterPos),rp(VertexPos)];
+ auxpath = pa--pb;
+ pc = auxpath intersectiontimes fullpath;
+ if pc <> (-1,-1):
+ auxt = ypart pc;
+ newlen = length fullpath;
+ if UsualForm:
+ finalpath = point auxt of fullpath
+ --point auxt+1 of fullpath
+ for i = auxt+2 upto auxt+newlen-1:
+ ...point i of fullpath
+ endfor
+ --cycle;
+ else:
+ bigcirc = goodcirclepath( CenterPos, AngulMom, 1.005*Radius );
+ pd = bigcirc intersectiontimes fullpath;
+ pe = ( reverse bigcirc ) intersectiontimes fullpath;
+ startt = floor( xpart pd );
+ endt = ceiling( ( length bigcirc ) - ( xpart pe ) );
+ finalpath = subpath (startt,endt) of basepath;
+ fi;
+ else:
+ finalpath = rp(VertexPos);
+ fi;
+ ( finalpath )
+ endgroup
+ enddef;
+
+ def verygoodcone(expr BackDash,CenterPos,AngulMom,Radius,VertexPos) =
+ begingroup
+ save thepath, lenpath, bonevec, sidevec, viewaxe, cipath;
+ save thelengthofc, thesubpath, themargin, basepath;
+ color bonevec, sidevec, viewaxe;
+ path thepath, cipath, basepath, thesubpath;
+ numeric lenpath, thelengthofc, themargin;
+ themargin = 0.02;
+ bonevec = VertexPos - CenterPos;
+ if cdotprod( bonevec, AngulMom ) < 0:
+ sidevec = -N(AngulMom);
+ else:
+ sidevec = N(AngulMom);
+ fi;
+ viewaxe = f-CenterPos;
+ if ShadowOn:
+ basepath = circleshadowpath( CenterPos, AngulMom, Radius );
+ thelengthofc = ( length basepath ) - themargin;
+ thesubpath = subpath ( 0, thelengthofc ) of basepath;
+ fill makepath makepen ( rp(cb(VertexPos))--thesubpath--cycle );
+ fi;
+ thepath = rigorouscone(true,CenterPos,AngulMom,Radius,VertexPos);
+ lenpath = length thepath;
+ if lenpath<>0:
+ unfill thepath;
+ draw thepath;
+ if cdotprod( sidevec, viewaxe ) < 0:
+ draw goodcirclepath( CenterPos, AngulMom, Radius );
+ else:
+ if BackDash:
+ draw
+ goodcirclepath( CenterPos, AngulMom, Radius ) dashed evenly;
+ fi;
+ fi;
+ else:
+ cipath = goodcirclepath( CenterPos, AngulMom, Radius );
+ unfill cipath;
+ draw cipath;
+ if cdotprod( sidevec, viewaxe ) > 0:
+ draw rp( VertexPos );
+ fi;
+ fi
+ endgroup
+ enddef;
+
+% Its a sphere, don't fear, but remember that the rigorous projection
+% of a sphere is an ellipse.
+
+ def rigorousfearpath(expr Center, Radius ) =
+ begingroup
+ save auxil, ux, uy, newcen, nr, valx, valy, valr;
+ color ux, uy, newcen;
+ numeric nr, valx, valy, valr;
+ path auxil;
+ nr := conorm( Center - f );
+ valr := Radius**2;
+ valx := valr/nr;
+ valy := sqrt( valr - valx**2 );
+ newcen := valx*( f - Center )/nr;
+ auxil := head_on_circle( Center+newcen, valy );
+ ( auxil )
+ endgroup
+ enddef;
+
+ def rigorousfearshadowpath(expr Center, Radius ) =
+ begingroup
+ save ux, uy, newcen;
+ save nr, valx, valy, valr, lenr;
+ save auxil, auxih, fcirc, returnp;
+ save dcenter;
+ color ux, uy, newcen;
+ numeric nr, valx, valy, valr, lenr;
+ path auxil, auxih, fcirc, returnp;
+ pair dcenter;
+ nr := conorm( Center - LightSource );
+ valr := Radius**2;
+ valx := valr/nr;
+ valy := sqrt( valr - valx**2 );
+ newcen := valx*( LightSource - Center )/nr;
+ auxil := circleshadowpath( Center+newcen, newcen, valy );
+ ( auxil )
+ endgroup
+ enddef;
+
+% It's a globe (without land).
+
+ def tropicalglobe( expr NumLats, TheCenter, Radius, AngulMom ) =
+ begingroup
+ save viewaxe, sinalfa, sinbeta, globaxe, aux, limicos, lc;
+ save stepang, actang, newradius, foc, newcenter, cpath, i;
+ save outerpath, conditiona, conditionb;
+ color viewaxe, globaxe, foc, newcenter;
+ numeric sinalfa, sinbeta, aux, limicos, stepang, actang;
+ numeric newradius, lc, i;
+ path cpath, outerpath;
+ boolean conditiona, conditionb;
+ if ShadowOn:
+ fill rigorousfearshadowpath( TheCenter, Radius );
+ fi;
+ viewaxe = f-TheCenter;
+ sinalfa = Radius/conorm( viewaxe );
+ aux = cdotprod( viewaxe, AngulMom );
+ if aux < 0:
+ globaxe = -N(AngulMom);
+ else:
+ globaxe = N(AngulMom);
+ fi;
+ sinbeta = cdotprod( globaxe, N(viewaxe) );
+ aux := sqrt((1-sinalfa**2)*(1-sinbeta**2));
+ limicos = aux - sinalfa*sinbeta;
+ stepang = 180/NumLats;
+ globaxe := globaxe*Radius;
+ outerpath = rigorousfearpath(TheCenter,Radius);
+ unfill outerpath;
+ draw outerpath;
+ for actang = 0.5*stepang step stepang until 179:
+ if cosd(actang) < limicos-0.005: %%%%%%%%%%%%%%%%%%%%%%%% DANGER
+ newradius := Radius*sind(actang);
+ newcenter := TheCenter - globaxe*cosd(actang);
+ conditiona:=(actang<94) and (actang>86); % DANGER % DANGER VV
+ conditionb:=abs(cdotprod(globaxe/Radius,N(f-newcenter)))<0.08;
+ if conditiona or conditionb:
+ draw spatialhalfcircle(newcenter,globaxe,newradius,true);
+ else:
+ foc := TheCenter - globaxe/cosd(actang);
+ lena := -Radius*cosd(actang);
+ lenb := cdotprod(viewaxe,globaxe/Radius);
+ if (actang <= 86) or ((lenb<lena) and (actang>=94)):
+ cpath :=
+ rigorouscone(false,newcenter,globaxe,newradius,foc);
+ draw cpath;
+ else:
+ cpath :=
+ rigorouscone(true,newcenter,globaxe,newradius,foc);
+ lc := length cpath;
+ if lc <> 0:
+ draw subpath (1,lc-1) of cpath;
+ else:
+ draw rigorouscircle( newcenter,globaxe,newradius );
+ fi;
+ fi;
+ fi;
+ fi;
+ endfor
+ endgroup
+ enddef;
+
+% An elliptical frustum:
+
+ def whatisthis(expr CenterPos,OneAxe,OtherAxe,CentersDist,TheFactor) =
+ begingroup
+ save patha, pathb, pathc, centersvec, noption;
+ path patha, pathb, pathc;
+ color centersvec;
+ numeric noption;
+ centersvec = CentersDist*ncrossprod( OneAxe, OtherAxe );
+ if ShadowOn:
+ patha = ellipticshadowpath( CenterPos,
+ OneAxe,
+ OtherAxe );
+ pathb = ellipticshadowpath( CenterPos+centersvec,
+ TheFactor*OneAxe,
+ TheFactor*OtherAxe );
+ pathc = twocyclestogether( patha, pathb );
+ fill pathc;
+ fi;
+ patha := ellipticpath( CenterPos,
+ OneAxe,
+ OtherAxe );
+ pathb := ellipticpath( CenterPos+centersvec,
+ TheFactor*OneAxe,
+ TheFactor*OtherAxe );
+ pathc := twocyclestogether( patha, pathb );
+ unfill pathc;
+ draw pathc;
+ noption = cdotprod( centersvec, f-CenterPos );
+ if noption > (CentersDist**2):
+ draw pathb;
+ elseif noption < 0:
+ draw patha;
+ fi
+ endgroup
+ enddef;
+
+% Probably the last algorithm I'm going to write for featpost...
+% Wrong. The last is ultraimprovertex.
+% Wrong again. The last is necplusimprovertex.
+% And again wrong. The last is tdcircarrow.
+% Well, what can I say, really the last is ellipsoid.
+% Wait! It is torushadow!
+% Bullshit. Only death can stop me. Now it's revolparab.
+% Continuing with torus accessories...
+% And I forgot to mention intersectprolatespheroid!!!
+% The first of Red October, 2014, added vp.
+
+ def spheroidshadow( expr CentrPoi, NorthPoleVec, Ray ) =
+ begingroup
+ save a, k, fx, fy, tmpa, tmpb, tmpc, ep, vax, wax, xax, yax, zax, cm, cp;
+ save bdh, bdm, bdp, bdv, sm, sp, i, cac;
+ numeric a, k, fx, fy, tmpa, tmpb, tmpc, cm, cp, sm, sp, i;
+ path ep;
+ color vax, wax, xax, yax, zax, cac;
+ pair bdh, bdm, bdp, bdv;
+ vax = LightSource-CentrPoi;
+ if cdotprod(NorthPoleVec,vax)<0:
+ xax = -N(NorthPoleVec);
+ else:
+ xax = N(NorthPoleVec);
+ fi;
+ a = conorm(NorthPoleVec);
+ k = a/Ray;
+ if getangle(xax,vax) > 0.5: %%%%%%%%%%%%%%% DANGER %%%
+ zax = ncrossprod(xax,vax);
+ else:
+ zax = N( ( 0, Z(vax), -Y(vax) ) );
+ fi;
+ yax = ncrossprod(zax,xax);
+ fx = cdotprod(vax,xax);
+ fy = cdotprod(vax,yax);
+ tmpa = Ray*fx/k;
+ tmpb = fy*(fy ++ (fx/k) +-+ Ray);
+ tmpc = ((fx/k)**2)+(fy**2);
+ cm = (tmpa-tmpb)/tmpc;
+ cp = (tmpa+tmpb)/tmpc;
+ sm = 1 +-+ cm;
+ if fx<a:
+ sp = 1 +-+ cp;
+ else:
+ sp = -( 1 +-+ cp );
+ fi;
+ bdm = (k*cm,sm)*Ray;
+ bdp = (k*cp,sp)*Ray;
+ bdh = 0.5[bdp,bdm];
+ tmpc := Ray*( 1 +-+ ((xpart bdh)/a) );
+ tmpb := tmpc +-+ (ypart bdh);
+ bdv = bdm-bdp;
+ wax = 0.5*( xax*( xpart (bdv) ) + yax*( ypart (bdv) ) );
+ cac = CentrPoi+ xax*( xpart (bdh) ) + yax*( ypart (bdh) );
+ fill ellipticshadowpath( cac, wax, zax*tmpb );
+ endgroup
+ enddef;
+
+ def spheroid( expr CentrPoi, NorthPoleVec, Ray ) =
+ begingroup
+ save a, k, fx, fy, tmpa, tmpb, tmpc, ep;
+ save vax, wax, xax, yax, zax, cm, cp;
+ save bdh, bdm, bdp, bdv, sm, sp, i, cac;
+ numeric a, k, fx, fy, tmpa, tmpb, tmpc, cm, cp, sm, sp, i;
+ path ep;
+ color vax, wax, xax, yax, zax, cac;
+ pair bdh, bdm, bdp, bdv;
+ if ShadowOn:
+ spheroidshadow( CentrPoi, NorthPoleVec, Ray );
+ fi;
+ vax = f-CentrPoi;
+ if cdotprod(NorthPoleVec,vax)<0:
+ xax = -N(NorthPoleVec);
+ else:
+ xax = N(NorthPoleVec);
+ fi;
+ a = conorm(NorthPoleVec);
+ k = a/Ray;
+ if getangle(xax,vax) > 0.5: %%%%%%%%%%%%%%% DANGER %%%
+ zax = ncrossprod(xax,vax);
+ else:
+ zax = N( (-Y(vax), X(vax), 0) );
+ fi;
+ yax = ncrossprod(zax,xax);
+ fx = cdotprod(vax,xax);
+ fy = cdotprod(vax,yax);
+ tmpa = Ray*fx/k;
+ tmpb = fy*(fy ++ (fx/k) +-+ Ray);
+ tmpc = ((fx/k)**2)+(fy**2);
+ cm = (tmpa-tmpb)/tmpc;
+ cp = (tmpa+tmpb)/tmpc;
+ sm = 1 +-+ cm;
+ if fx<a:
+ sp = 1 +-+ cp;
+ else:
+ sp = -( 1 +-+ cp );
+ fi;
+ bdm = (k*cm,sm)*Ray;
+ bdp = (k*cp,sp)*Ray;
+ bdh = 0.5[bdp,bdm];
+ tmpc := Ray*( 1 +-+ ((xpart bdh)/a) );
+ tmpb := tmpc +-+ (ypart bdh);
+ bdv = bdm-bdp;
+ wax = 0.5*( xax*( xpart (bdv) ) + yax*( ypart (bdv) ) );
+ cac = CentrPoi+ xax*( xpart (bdh) ) + yax*( ypart (bdh) );
+ ep = ellipticpath( cac, wax, zax*tmpb );
+ unfill ep;
+ draw ep;
+ draw spatialhalfcircle( CentrPoi, NorthPoleVec, Ray, true );
+ endgroup
+ enddef;
+
+% Another brute-force algorythm.
+% It's advisable to use three orthogonal axes.
+
+ def ellipsoid( expr Centr, AxOne, AxTwo, AxThr ) =
+ begingroup
+ save count, i, j, axx, axy, cyc, cy, di, leng;
+ numeric count, i, j, leng;
+ color axx, axy, di[];
+ path cy, cyc[];
+ di1 = AxOne;
+ di2 = AxTwo;
+ di3 = AxThr;
+ count = 0;
+ for i=1 upto 3:
+ if i=1:
+ axx := di2;
+ axy := di3;
+ elseif i=2:
+ axx := di1;
+ axy := di3;
+ else:
+ axx := di1;
+ axy := di2;
+ fi;
+ for j=5 step 10 until 175:
+ cyc[incr(count)] = ellipticpath( Centr, di[i],
+ Centr + planarrotation( axx, axy, j ) );
+ endfor;
+ endfor;
+ cy = cyc1;
+ for i=2 upto count-1:
+ cy := twocyclestogether( cy, cyc[i] );
+ endfor;
+ leng = (length cy) - 1;
+ ( point 0 of cy for i = 1 upto leng: ..point i of cy endfor ..cycle )
+ endgroup
+ enddef;
+
+ def ellipsoidshadow( expr Centr, AxOne, AxTwo, AxThr ) =
+ begingroup
+ save count, i, j, axx, axy, cyc, cy, di, leng;
+ numeric count, i, j, leng;
+ color axx, axy, di[];
+ path cy, cyc[];
+ di1 = AxOne;
+ di2 = AxTwo;
+ di3 = AxThr;
+ count = 0;
+ for i=1 upto 3:
+ if i=1:
+ axx := di2;
+ axy := di3;
+ elseif i=2:
+ axx := di1;
+ axy := di3;
+ else:
+ axx := di1;
+ axy := di2;
+ fi;
+ for j=5 step 10 until 175:
+ cyc[incr(count)] = ellipticshadowpath( Centr, di[i],
+ Centr + planarrotation( axx, axy, j ) );
+ endfor;
+ endfor;
+ cy = cyc1;
+ for i=2 upto count-1:
+ cy := twocyclestogether( cy, cyc[i] );
+ endfor;
+ leng = (length cy) - 1;
+ ( point 0 of cy for i = 1 upto leng: ..point i of cy endfor ..cycle )
+ endgroup
+ enddef;
+
+ def revolparab( expr BaseCenter, ParabTip, BaseRay ) =
+ begingroup
+ save bcpt, conetip, fakex, fakey, fakez, tipview, ellicenter, coneview;
+ save tanefe, majorvec, minorvec, cutvec, auxpoi, crux, auxx, baseview;
+ save xzero, yzero, xdelta, fakea, xpos, ypos, xneg, yneg, l, apertur;
+ save auxy, maxy, ellmaxang, ymin, xefe, auxray, auxcos, auxsin, ste, a;
+ save auxpath, tippath;
+ save conda, condb, condc;
+ color bcpt, conetip, fakex, fakey, fakez, tipview, ellicenter, coneview;
+ color tanefe, majorvec, minorvec, cutvec, auxpoi, crux, auxx, baseview;
+ numeric xzero, yzero, xdelta, fakea, xpos, ypos, xneg, yneg, l, apertur;
+ numeric auxy, maxy, ellmaxang, ymin, xefe, auxray, auxcos, auxsin, ste;
+ numeric a;
+ path auxpath, tippath;
+ boolean conda, condb, condc;
+ bcpt = BaseCenter-ParabTip;
+ conetip = BaseCenter-2*bcpt;
+ maxy = conorm(bcpt);
+ apertur = angle(2*maxy,BaseRay);
+ fakey = N(bcpt);
+ coneview = f-conetip;
+ tipview = f-ParabTip;
+ baseview = f-BaseCenter;
+ a = getangle(coneview,bcpt);
+ conda = a<=apertur;
+ condb = a>=180-apertur;
+ fakez = ncrossprod( tipview, bcpt );
+ fakex = ccrossprod( fakey, fakez );
+ xzero = cdotprod( fakex, tipview );
+ yzero = cdotprod( fakey, tipview );
+ fakea = maxy/(BaseRay**2);
+ condc = yzero>=fakea*(xzero**2);
+ if (conda and condc) or condb:
+ auxpath = rigorouscircle( BaseCenter, bcpt, BaseRay );
+ unfill auxpath;
+ draw auxpath;
+ else:
+ xdelta = sqrt(xzero**2 - yzero/fakea);
+ xpos = xzero + xdelta;
+ xneg = xzero - xdelta;
+ ypos = fakea*(xpos**2);
+ yneg = fakea*(xneg**2);
+ auxy = 0.5[ypos,yneg];
+ ellicenter = ParabTip+fakex*xzero+fakey*auxy;
+ if yneg<ypos:
+ ymin=yneg;
+ xefe=xneg;
+ else:
+ ymin=ypos;
+ xefe=xpos;
+ fi;
+ tanefe = ParabTip +fakex*xefe+fakey*ymin;
+ minorvec = xdelta*fakez;
+ majorvec = tanefe-ellicenter;
+ if (yneg<maxy) and (ypos<maxy):
+ draw ellipticpath( ellicenter, majorvec, minorvec );
+ else:
+ auxpoi = lineintersectplan(conetip,conetip-f,BaseCenter,bcpt);
+ auxray = conorm( BaseCenter-auxpoi );
+ auxcos = BaseRay/auxray;
+ auxsin = 1 +-+ auxcos;
+ if cdotprod(fakex,auxpoi-BaseCenter)>0:
+ auxx = fakex;
+ else:
+ auxx = -fakex;
+ fi;
+ crux = BaseCenter+BaseRay*(auxx*auxcos +fakez*auxsin);
+ cutvec = crux-ellicenter;
+ auxcos := cdotprod(cutvec,N(majorvec))/conorm(majorvec);
+ auxsin := cdotprod(cutvec,N(minorvec))/conorm(minorvec);
+ ellmaxang = angle(auxcos,auxsin);
+ ste = ellmaxang/18; %%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER %%%%%%%%%%%%
+ tippath =
+ rp(ellicenter+planarrotation(majorvec,minorvec,-ellmaxang))
+ for l=ste-ellmaxang step ste until ellmaxang:
+ ..rp(ellicenter+planarrotation(majorvec,minorvec,l))
+ endfor --rp(ellicenter+planarrotation(majorvec,minorvec,ellmaxang));
+ if cdotprod( baseview, bcpt )<0:
+ auxpath = rigorouscone(true,BaseCenter,bcpt,BaseRay,conetip);
+ numeric len;
+ len = length auxpath;
+ auxpath := subpath (1,len-1) of auxpath;
+ auxpath := tippath--(reverse auxpath)--cycle;
+ unfill auxpath;
+ draw auxpath;
+ else:
+ tippath := tippath--cycle;
+ unfill tippath;
+ draw tippath;
+ auxpath = rigorouscircle( BaseCenter, bcpt, BaseRay );
+ unfill auxpath;
+ draw auxpath;
+ fi;
+ fi;
+ fi
+ endgroup
+ enddef;
+
+% You can't see through this hole. f must not be on the hole axis.
+% Not yet documented because "buildcycle" doesn't work properly.
+
+ def fakehole( expr CenterPos, LenVec, Radius ) =
+ begingroup
+ save patha, pathb, pathc, noption, hashole, auxv, poption, vv;
+ save ta, tb, taf, tbf, margint, stopair, pa, pb, testpath, isin;
+ path patha, pathb, pathc, pa, pb, testpath;
+ numeric noption, ta, tb, margint;
+ boolean hashole, poption, isin;
+ color auxv, vv;
+ pair stopair;
+ vv = f-CenterPos;
+ patha := rigorouscircle( CenterPos, LenVec, Radius );
+ pathb := rigorouscircle( CenterPos+LenVec, LenVec, Radius );
+% patha := goodcirclepath( CenterPos, LenVec, Radius );
+% pathb := goodcirclepath( CenterPos+LenVec, LenVec, Radius );
+ auxv := ncrossprod( LenVec, ccrossprod( vv, LenVec ) );
+ poption := abs( cdotprod( vv, auxv ) ) <= 1.05*Radius;% DANGER!
+ if poption:
+ draw patha;
+ draw pathb;
+ else:
+ noption = cdotprod( LenVec, vv );
+ if noption > (conorm(LenVec)**2):
+ pa = patha;
+ pb = pathb;
+ elseif noption < 0:
+ pa = pathb;
+ pb = patha;
+ fi;
+ draw pb;
+ stopair = pa intersectiontimes pb;
+ hashole = (-1,-1) <> stopair;
+ if hashole:
+ testpath = rp(CenterPos+0.5*LenVec)--(point 0 of pa);
+ isin = (-1,-1) <> testpath intersectiontimes pb;
+ if not isin:
+ ta = xpart stopair;
+ tb = ypart stopair;
+ stopair := (reverse pa) intersectiontimes (reverse pb);
+ taf = length pa - xpart stopair;
+ tbf = length pb - ypart stopair;
+ margint = 0.01; % DANGER!
+ draw (subpath (0,ta-margint) of pa)--
+ (subpath (tb+margint,tbf-margint) of pb)--
+ (subpath (taf+margint,length pa - margint) of pa)--
+ cycle;
+ else:
+ pathc := buildcycle( pa, pb ); % I don't get it!
+ % Why doesn't buildcycle work all the time??? See fakehole.mp
+ % When point 0 of pa is inside pb, builcycle doesn't work!!
+ draw pathc;
+ fi;
+ fi;
+ fi
+ endgroup
+ enddef;
+
+% It is time for a kind of cube. Don't use SphericalDistortion here.
+
+ def kindofcube(expr WithDash, IsVertex, RefP, AngA, AngB, AngC, LenA, LenB, LenC ) =
+ begingroup
+ save star, pos, patw, patb, refv, near, centre, farv;
+ save newa, newb, newc, veca, vecb, vecc, auxx, auxy, i;
+ color star, pos[], refv, near, newa, newb, newc;
+ color veca, vecb, vecc, auxx, auxy, centre, farv;
+ path patw, patb;
+ numeric i;
+ veca = ( cosd(AngA)*cosd(AngB),
+ sind(AngA)*cosd(AngB),
+ sind(AngB) );
+ auxx = ( cosd(AngA+90), sind(AngA+90), 0 );
+ auxy = ccrossprod( veca, auxx );
+ vecb = cosd(AngC)*auxx + sind(AngC)*auxy;
+ vecc = cosd(AngC+90)*auxx + sind(AngC+90)*auxy;
+ veca := LenA*veca;
+ vecb := LenB*vecb;
+ vecc := LenC*vecc;
+ if IsVertex:
+ star = RefP;
+ centre = RefP + 0.5*( veca + vecb + vecc);
+ else:
+ star = RefP - 0.5*( veca + vecb + vecc);
+ centre = RefP;
+ fi;
+ pos1 = star + veca;
+ pos2 = pos1 + vecb;
+ pos3 = pos2 + vecc;
+ pos4 = pos3 - vecb;
+ pos5 = pos4 - veca;
+ pos6 = pos5 + vecb;
+ pos7 = pos6 - vecc;
+ if ShadowOn:
+ patw = rp(cb(star))--rp(cb(pos1))--rp(cb(pos2))
+ --rp(cb(pos3))--rp(cb(pos4))
+ --rp(cb(pos5))--rp(cb(pos6))--rp(cb(pos7))--cycle;
+ patb = makepath makepen patw;
+ fill patb;
+ fi;
+ patw := rp(star)--rp(pos1)--rp(pos2)--rp(pos3)--rp(pos4)
+ --rp(pos5)--rp(pos6)--rp(pos7)--cycle;
+ patb := makepath makepen patw;
+ unfill patb;
+ draw patb;
+ i = 0;
+ if inplanarvolume( star, star+veca, f ): i := incr( i ); fi;
+ if inplanarvolume( star, star+vecb, f ): i := incr( i ); fi;
+ if inplanarvolume( star, star+vecc, f ): i := incr( i ); fi;
+ if (i=2) and WithDash:
+ message "Unable to dash kindofcube " & cstr( RefP ) & ".";
+ elseif i = 3:
+ message "f is inside kindofcube " & cstr( RefP ) & ".";
+ else:
+ refv = f - centre;
+ if cdotprod( refv, veca ) > 0:
+ newa = -veca;
+ else:
+ newa = veca;
+ fi;
+ if cdotprod( refv, vecb ) > 0:
+ newb = -vecb;
+ else:
+ newb = vecb;
+ fi;
+ if cdotprod( refv, vecc ) > 0:
+ newc = -vecc;
+ else:
+ newc = vecc;
+ fi;
+ near = centre - 0.5*( newa + newb + newc );
+ draw rp(near)--rp(near+newa);
+ draw rp(near)--rp(near+newb);
+ draw rp(near)--rp(near+newc);
+ if WithDash:
+ if i=1:
+ message "Unable to dash kindofcube " & cstr( RefP ) & ".";
+ else:
+ farv = centre + 0.5*( newa + newb + newc );
+ draw rp(farv)--rp(farv-newa) dashed evenly;
+ draw rp(farv)--rp(farv-newb) dashed evenly;
+ draw rp(farv)--rp(farv-newc) dashed evenly;
+ fi;
+ fi;
+ fi
+ endgroup
+ enddef;
+
+% It's a bit late now but the stage must be set.
+
+ def setthestage( expr NumberOfSideSquares, SideSize ) =
+ begingroup
+ save i, j, squaresize, squarepath, ca, cb, cc, cd;
+ numeric i, j, squaresize;
+ path squarepath;
+ color ca, cb, cc, cd;
+ squaresize = SideSize/(2*NumberOfSideSquares-1);
+ for i=-0.5*SideSize step 2*squaresize until 0.5*SideSize:
+ for j=-0.5*SideSize step 2*squaresize until 0.5*SideSize:
+ ca := (i,j,HoriZon);
+ cb := (i,j+squaresize,HoriZon);
+ cc := (i+squaresize,j+squaresize,HoriZon);
+ cd := (i+squaresize,j,HoriZon);
+ squarepath := rp(ca)--rp(cb)--rp(cc)--rp(cd)--cycle;
+ unfill squarepath;
+ draw squarepath;
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+ def setthearena( expr NumberOfDiameterCircles, ArenaDiameter ) =
+ begingroup
+ save i, j, circlesize, polar, currpos, phi, cpath;
+ numeric i, j, circlesize, polar, phi;
+ color currpos;
+ path cpath;
+ circlesize = ArenaDiameter/NumberOfDiameterCircles;
+ for i=0.5*ArenaDiameter step -circlesize until 0.4*circlesize:
+ polar := floor(6.28318*i/circlesize);
+ for j=1 upto polar:
+ phi := 360*j/polar;
+ currpos := i*(cosd(phi),sind(phi),0)+(0,0,HoriZon);
+ cpath := rigorouscircle( currpos, blue, 0.3*circlesize);
+ unfill cpath;
+ draw cpath;
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+% And a transparent dome. The angular momentum vector is supposed
+% to point from the concavity of the dome and into outer space.
+% The pen can only be changed with a previous drawoptions().
+
+ def spatialhalfsfear(expr Center, AngulMom, Radius ) =
+ begingroup
+ save spath, cpath, fpath, rpath, cutp;
+ path spath, cpath, fpath, rpath, cutp;
+ save ap, bp, cp, dp, cuti, cute, vp;
+ pair ap, bp, cp, dp, cuti, cute, vp;
+ save auxcos, actcos, actsin, auxsin;
+ numeric auxcos, actcos, actsin, auxsin;
+ picture partoffear;
+ save A, B;
+ color A, B;
+ spath = rigorousfearpath( Center, Radius );
+ auxcos = getcossine( Center, Radius );
+ actcos = cdotprod( N( f - Center ), N( AngulMom ) );
+ actsin = sqrt(1-actcos**2);
+ auxsin = sqrt(1-auxcos**2);
+ if actsin <= auxcos:
+ if actcos >= 0:
+ cpath = goodcirclepath( Center, AngulMom, Radius );
+ draw cpath;
+ else:
+ draw spath;
+ fi;
+ else:
+ fpath = spatialhalfcircle( Center, AngulMom, Radius, true );
+ rpath = spatialhalfcircle( Center, AngulMom, Radius, false );
+ cuti = point 0 of rpath;
+ cute = point ( length rpath ) of rpath;
+ ap = 1.1[cuti,cute];
+ bp = 1.1[cute,cuti];
+ partoffear = nullpicture;
+ addto partoffear doublepath spath;
+ A = ncrossprod( f-Center, ncrossprod( f-Center, AngulMom ) );
+ B = Center + 1.1*Radius*( auxcos*N( f-Center ) + auxsin*A );
+ vp = rp(B) - rp(Center);
+ cp = ap + vp;
+ dp = bp + vp;
+ cutp = ap--cp--dp--bp--cycle;
+ clip partoffear to cutp;
+ draw fpath;
+ draw partoffear;
+ if actcos >= 0:
+ draw rpath;
+ fi;
+ fi
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Toroidal Stuff
+
+% Take a donut.
+
+ def smoothtorus( expr Tcenter, Tmoment, Bray, Sray ) =
+ begingroup
+ save nearaxe, sideaxe, viewline, circlecenter, circlemoment;
+ save ang, ind, i, anglim, angstep, cuspcond, holepic, coofrac;
+ save cpath, apath, opath, ipath, wp, ep, refpair, distance, lr;
+ color nearaxe, sideaxe, viewline, circlecenter, circlemoment;
+ numeric ang, ind, i, anglim, angstep, distance, coofrac, lr;
+ path cpath, apath, opath, ipath, wp, ep;
+ pair outerp[], innerp[], refpair;
+ boolean cuspcond;
+ picture holepic;
+ save tmoment;
+ color tmoment;
+ angstep= 4; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER!
+ if ShadowOn:
+ torushadow( Tcenter, Tmoment, Bray, Sray );
+ fi;
+ viewline = f-Tcenter;
+ if cdotprod( viewline, Tmoment ) < 0:
+ tmoment = -Tmoment;
+ else:
+ tmoment = Tmoment;
+ fi;
+ refpair = unitvector( rp(Tcenter+tmoment)-rp(Tcenter) );
+ sideaxe = Bray*ncrossprod( tmoment, viewline );
+ nearaxe = Bray*ncrossprod( sideaxe, tmoment );
+ coofrac = cdotprod( viewline, N( tmoment ) )/Sray;
+ if (coofrac <= 1.04) and (coofrac >= 1.01): %%%%%%%%%%% DANGER!
+ ind = 360/angstep;
+ anglim = 0.5*angstep;
+ for i=1 upto ind:
+ ang := i*angstep-anglim-180.0;
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang)+Tcenter;
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,Sray,true);
+ if i >= 0.5*ind+1:
+ outerp[i]=point 0 of cpath;
+ else:
+ outerp[i]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ opath = for i=1 upto ind: outerp[i].. endfor cycle;
+ unfill opath;
+ draw opath;
+ elseif coofrac < 1.01:
+ distance = conorm( viewline );
+ lr = Bray + Sray*( 1 +-+ coofrac );
+ anglim = angle( ( lr, distance +-+ lr ) );
+ ind = 2*floor(anglim/angstep);
+ angstep := 2*anglim/(ind+1);
+ for i=0 upto 0.5*ind-1:
+ ang := i*angstep-anglim;
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang)+Tcenter;
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,Sray,true);
+ innerp[i]=point 0 of cpath;
+ outerp[i]=point (length cpath) of cpath;
+ endfor;
+ for i=0.5*ind upto ind-2:
+ ang := (i+2)*angstep-anglim;
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang)+Tcenter;
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,Sray,true);
+ outerp[i]=point 0 of cpath;
+ innerp[i]=point (length cpath) of cpath;
+ endfor;
+ if coofrac > 0.94:
+ apath = innerp0
+ for i=1 upto ind-2:
+ ..innerp[i]
+ endfor
+ --cycle;
+ else:
+ apath = innerp0 for i=2 upto ind-2: ..innerp[i] endfor
+ ..outerp[ind-2] for i=ind-3 downto 0: ..outerp[i] endfor
+ ..cycle;
+ fi;
+ unfill apath;
+ draw apath;
+ else:
+ ind = 360/angstep;
+ anglim = 0.5*angstep;
+ for i=1 upto ind:
+ ang := i*angstep-anglim-180.0;
+ circlecenter:= nearaxe*cosd(ang)+sideaxe*sind(ang)+Tcenter;
+ circlemoment:=-nearaxe*sind(ang)+sideaxe*cosd(ang);
+ cpath:=spatialhalfcircle(circlecenter,circlemoment,Sray,true);
+ if i >= 0.5*ind+1:
+ outerp[i]=point 0 of cpath;
+ innerp[i]=point (length cpath) of cpath;
+ else:
+ innerp[i]=point 0 of cpath;
+ outerp[i]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ opath = for i=1 upto ind: outerp[i].. endfor cycle;
+ ipath = for i=1 upto ind: innerp[i].. endfor cycle;
+ holepic = currentpicture;
+ clip holepic to ipath;
+ unfill opath;
+ draw holepic;
+ draw opath;
+ draw ipath;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Perhaps there is an analytic way of getting the angle of the cusp point?
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ i := ceiling(1+0.5*ind);
+ cuspcond = false;
+ forever:
+ i := incr( i );
+ exitif i > ind-1;
+ cuspcond :=
+ refpair dotprod innerp[i+1] < refpair dotprod innerp[i];
+ exitif cuspcond;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ if cuspcond:
+ show "Torus shows cusp points.";
+ ep = outerp[ind-i+1]--innerp[ind-i+1];
+ wp = innerp[i]--outerp[i];
+ unfill buildcycle(reverse opath,ep,ipath,wp);
+ draw opath;
+ draw subpath (i-1,ind-i) of ipath;
+ fi;
+ fi;
+ endgroup
+ enddef;
+
+% The shadow of a torus
+
+ def torushadow( expr Tcenter, Tmoment, Bray, Sray ) =
+ begingroup
+ save theplace, viewline, tmoment, refpair, sideaxe, nearaxe, i;
+ color theplace, viewline, tmoment, refpair, sideaxe, nearaxe;
+ numeric i;
+ viewline = f-Tcenter;
+ if cdotprod( viewline, Tmoment ) < 0:
+ tmoment = -Tmoment;
+ else:
+ tmoment = Tmoment;
+ fi;
+ sideaxe = Bray*ncrossprod( tmoment, viewline );
+ nearaxe = Bray*ncrossprod( sideaxe, tmoment );
+ for i=1 upto 60: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER!
+ theplace := Tcenter + planarrotation( sideaxe, nearaxe, 6i ); %%
+ fill rigorousfearshadowpath( theplace, Sray );
+ endfor;
+ endgroup
+ enddef;
+
+% Take a "quarter" of a donut
+% (no longer under construction but contains a bug).
+
+ def quartertorus( expr Tcenter, Tstart, Tfinis, Sray ) =
+ begingroup
+ save sideaxe, viewline, circlecenter, circlemoment, amax;
+ save i, angstep, tmoment, cpath, opath, ipath, fpath, finc;
+ save vstart, vfinis, ostart, ofinis, cstart, cfinis, finis;
+ color sideaxe, viewline, circlecenter, circlemoment;
+ color tmoment, vstart, vfinis, finis, finc;
+ numeric i, angstep, amax;
+ path cpath, opath, ipath, cstart, cfinis, fpath;
+ pair outerp[], innerp[];
+ boolean ostart, ofinis;
+ angstep = 4; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DANGER!
+ viewline = f-Tcenter;
+ tmoment = ncrossprod( Tstart, Tfinis );
+ vstart = ncrossprod( Tstart, tmoment );
+ vfinis = ncrossprod( tmoment, Tfinis );
+ finis = -vstart*conorm( Tstart );
+ amax = getangle( Tstart, Tfinis );
+ finc = N( Tfinis )*conorm( Tstart );
+ if cdotprod( viewline, tmoment ) < 0:
+ tmoment := -tmoment;
+ fi;
+ sideaxe = ncrossprod( tmoment, viewline );
+ for i=0 step angstep until amax:
+ circlecenter:= Tstart*cosd(i)+finis*sind(i);
+ circlemoment:= ccrossprod(circlecenter,tmoment);
+ cpath:=spatialhalfcircle(circlecenter+Tcenter,circlemoment,Sray,true);
+ if cdotprod( sideaxe, circlecenter ) < 0:
+ outerp[i/angstep]=point 0 of cpath;
+ innerp[i/angstep]=point (length cpath) of cpath;
+ else:
+ innerp[i/angstep]=point 0 of cpath;
+ outerp[i/angstep]=point (length cpath) of cpath;
+ fi;
+ endfor;
+ cstart = spatialhalfcircle(Tstart+Tcenter,vstart,Sray,true);
+ if cdotprod( sideaxe, Tstart ) > 0:
+ cstart := reverse cstart;
+ fi;
+ cfinis = spatialhalfcircle(finc+Tcenter,vfinis,Sray,true);
+ if cdotprod( sideaxe, finc ) < 0:
+ cfinis := reverse cfinis;
+ fi;
+ opath = outerp0 for i=angstep step angstep until amax:
+ ..outerp[i/angstep] endfor;
+ ipath = innerp0 for i=angstep step angstep until amax:
+ ..innerp[i/angstep] endfor;
+ fpath = ipath---cfinis---reverse opath---cstart---cycle;
+ unfill fpath;
+ draw fpath;
+ ostart = cdotprod( viewline-Tstart, vstart ) > 0;
+ if ostart:
+ cpath := rigorouscircle( Tcenter+Tstart, vstart, Sray );
+ unfill cpath;
+ draw cpath;
+ fi;
+ ofinis = cdotprod( viewline-finc, vfinis ) > 0;
+ if ofinis:
+ cpath := rigorouscircle( Tcenter+finc, vfinis, Sray );
+ unfill cpath;
+ draw cpath;
+ fi;
+ %draw opath withcolor blue;
+ %draw ipath withcolor red;
+ endgroup
+ enddef;
+
+ def pointinsidetorus( expr Point, Tcenter, Tmoment, Bray, Sray ) =
+ begingroup
+ save outputboolean, height, dist, dray;
+ boolean outputboolean;
+ numeric height, dist, dray;
+ height = cdotprod(N(Tmoment),Point-Tcenter);
+ if abs(height)>=Sray:
+ outputboolean = false;
+ else:
+ dist = conorm(Point-Tcenter-height*N(Tmoment));
+ dray = Sray +-+ abs(height);
+ if (dist<Bray+dray) and (dist>Bray-dray):
+ outputboolean = true;
+ else:
+ outputboolean = false;
+ fi;
+ fi;
+ ( outputboolean )
+ endgroup
+ enddef;
+
+ def pointrelativetotorus( expr Point, Tcenter, Tmoment, Bray, Sray ) =
+ begingroup
+ save height, dist;
+ numeric height;
+ color dist;
+ height = cdotprod(N(Tmoment),Point-Tcenter);
+ dist = N(Point-Tcenter-height*N(Tmoment));
+ ( conorm(Point-Bray*dist)-Sray )
+ endgroup
+ enddef;
+
+ def intersectorus( expr Tcenter, Tmoment, Bray, Sray, LinePoi, LineDir ) =
+ begingroup
+ save trypoi, factry, linedi;
+ color trypoi, linedi;
+ numeric factry, j, auxd;
+ trypoi = LinePoi;
+ factry = 0.25;
+ linedi = N(LineDir);
+ for j= 1 upto 50:
+ auxd := pointrelativetotorus( trypoi, Tcenter, Tmoment, Bray, Sray );
+ trypoi := trypoi+factry*linedi*auxd;
+ endfor;
+ ( trypoi )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Non-standard objects:
+
+ def positivecharge( expr InFactPositive, Center, BallRay ) =
+ begingroup
+ save auxc, axehorf, axeside, viewline, spath, pa, pb, pc, pd;
+ color auxc, axehorf, axeside, viewline, pa, pb, pc, pd;
+ path spath;
+ viewline = f - Center;
+ axehorf = N( ( X(viewline), Y(viewline), 0 ) );
+ axeside = ccrossprod( axehorf, blue );
+ if ShadowOn:
+ fill rigorousfearshadowpath( Center, BallRay );
+ fi;
+ spath = rigorousfearpath( Center, BallRay );
+ unfill spath;
+ draw spath;
+ auxc = Center + sqrt(3)*axehorf;
+ pa = auxc + axeside;
+ pb = auxc - axeside;
+ angline( pa, pb, Center, BallRay, "", top );
+ if InFactPositive:
+ pc = auxc + blue;
+ pd = auxc - blue;
+ angline( pc, pd, Center, BallRay, "", top );
+ fi
+ endgroup
+ enddef;
+
+ def simplecar(expr RefP, AngCol, LenCol, FronWheelCol, RearWheelCol ) =
+ begingroup
+ save veca, vecb, vecc, anga, angb, angc, lena, lenb, lenc;
+ save auxn, viewline, auxm, fl, fr, rl, rr, auxx, auxy;
+ save fmar, fthi, fray, rmar, rthi, rray, inrefp;;
+ color veca, auxx, auxy, vecb, vecc, viewline;
+ color fl, fr, rl, rr, inrefp;
+ numeric anga, angb, angc, lena, lenb, lenc, auxm, auxn;
+ numeric fmar, fthi, fray, rmar, rthi, rray;
+ anga = X( AngCol );
+ angb = Y( AngCol );
+ angc = Z( AngCol );
+ lena = X( LenCol );
+ lenb = Y( LenCol );
+ lenc = Z( LenCol );
+ fmar = X( FronWheelCol );
+ fthi = Y( FronWheelCol );
+ fray = Z( FronWheelCol );
+ rmar = X( RearWheelCol );
+ rthi = Y( RearWheelCol );
+ rray = Z( RearWheelCol );
+ veca = ( cosd(anga)*cosd(angb),
+ sind(anga)*cosd(angb),
+ sind(angb) );
+ auxx = ( cosd(anga+90), sind(anga+90), 0 );
+ auxy = ccrossprod( veca, auxx );
+ vecb = cosd(angc)*auxx + sind(angc)*auxy;
+ vecc = cosd(angc+90)*auxx + sind(angc+90)*auxy;
+ viewline = f - RefP;
+ auxm = cdotprod( viewline, veca );
+ auxn = cdotprod( viewline, vecb );
+ inrefp = RefP - 0.5*lenc*vecc;
+ fl = inrefp + (0.5*lena-fmar-fray)*veca + 0.5*lenb*vecb;
+ fr = inrefp + (0.5*lena-fmar-fray)*veca - 0.5*lenb*vecb;
+ rl = inrefp - (0.5*lena-rmar-rray)*veca + 0.5*lenb*vecb;
+ rr = inrefp - (0.5*lena-rmar-rray)*veca - 0.5*lenb*vecb;
+ if auxn > 0.5*lenb:
+ if auxm > 0:
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ else:
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ fi;
+ elseif auxn < -0.5*lenb:
+ if auxm > 0:
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ else:
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ fi;
+ else:
+ if auxm > 0:
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ else:
+ rigorousdisc( 0, true, fl, fray, fthi*vecb );
+ rigorousdisc( 0, true, rl, rray, rthi*vecb );
+ rigorousdisc( 0, true, fr, fray, -fthi*vecb );
+ rigorousdisc( 0, true, rr, rray, -rthi*vecb );
+ kindofcube(false,false,RefP,anga,angb,angc,lena,lenb,lenc);
+ fi;
+ fi
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Differential Equations:
+
+% Oh! Well... I couldn't do without differential equations.
+% The point is that I want to draw vectorial field lines in space.
+% Keep it simple: second-order Runge-Kutta method.
+% This is for solving first order differential equations
+
+ def fieldlinestep( expr Spos, Step )( text VecFunc ) =
+ begingroup
+ save kone, ktwo;
+ color kone, ktwo;
+ kone = Step*VecFunc( Spos );
+ ktwo = Step*VecFunc( Spos+0.5*kone );
+ ( Spos+ktwo )
+ endgroup
+ enddef;
+
+ def fieldlinepath( expr Numb, Spos, Step )( text VecFunc ) =
+ begingroup
+ save ind, flpath, prevpos, thispos;
+ numeric ind;
+ color prevpos, thispos;
+ path flpath;
+ prevpos = Spos;
+ flpath = rp( Spos )
+ for ind=1 upto Numb:
+ hide( thispos := fieldlinestep( prevpos, Step, VecFunc ) )
+ ..rp( thispos )
+ hide( prevpos := thispos )
+ endfor;
+ ( flpath )
+ endgroup
+ enddef;
+
+% Another point is that I want to draw trajectories in space.
+% This is for solving second order differential equations
+
+ def trajectorypath( expr Numb, Spos, Svel, Step )( text VecFunc ) =
+ begingroup
+ save ind, flpath, prevpos, thispos, prevvel, thisvel;
+ save rone, rtwo, vone, vtwo;
+ numeric ind;
+ color prevpos, thispos, prevvel, thisvel;
+ color rone, rtwo, vone, vtwo;
+ path flpath;
+ prevpos = Spos;
+ prevvel = Svel;
+ flpath = rp( Spos )
+ for ind=1 upto Numb:
+ hide(
+ vone := Step*VecFunc( prevpos );
+ rone := Step*prevvel;
+ vtwo := Step*VecFunc( prevpos+0.5*rone );
+ rtwo := Step*( prevvel+0.5*vone );
+ thisvel := prevvel+vtwo;
+ thispos := prevpos+rtwo
+ )
+ ..rp( thispos )
+ hide(
+ prevpos := thispos;
+ prevvel := thisvel
+ )
+ endfor;
+ ( flpath )
+ endgroup
+ enddef;
+
+% Another point is that I want to draw trajectories in space and
+% dependent on velocity: VecFunc( position, velocity ).
+% This time is fourth-order Runge-Kutta.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CHANGES PrintStep!!!!
+
+ def dragtrajectorypath( expr Spos, Svel, Step )( text VecFunc ) =
+ begingroup
+ save ind, flpath, prevpos, thispos, prevvel, thisvel;
+ save rone, rtwo, rthr, rfou, vone, vtwo, vthr, vfou;
+ numeric ind;
+ color prevpos, thispos, prevvel, thisvel;
+ color rone, rtwo, rthr, rfou, vone, vtwo, vthr, vfou;
+ path flpath;
+ prevpos = Spos;
+ prevvel = Svel;
+ flpath = rp( Spos );
+ ind = 1;
+ forever:
+ vone := Step*VecFunc( prevpos , prevvel );
+ rone := Step*prevvel;
+ vtwo := Step*VecFunc( prevpos+0.5*rone, prevvel+0.5*vone );
+ rtwo := Step*( prevvel+0.5*vone );
+ vthr := Step*VecFunc( prevpos+0.5*rtwo, prevvel+0.5*vtwo );
+ rthr := Step*( prevvel+0.5*vtwo );
+ vfou := Step*VecFunc( prevpos+rthr, prevvel+vthr );
+ rfou := Step*( prevvel+vthr );
+ thisvel := prevvel+(vtwo+vthr)/3+(vone+vfou)/6;
+ thispos := prevpos+(rtwo+rthr)/3+(rone+rfou)/6;
+ exitif Z( thispos ) < -0.0001; %%%%%%%%%% EDIT!
+ prevpos := thispos;
+ prevvel := thisvel;
+ flpath := flpath--rp( thispos );
+ endfor;
+ PrintStep := Y(thispos);
+ ( flpath )
+ endgroup
+ enddef;
+
+% And now i stop.
+
+ def magnetictrajectorypath( expr Numb, Spos, Svel, Step )( text VecFunc ) =
+ begingroup
+ save ind, flpath, prevpos, thispos, prevvel, thisvel;
+ save rone, rtwo, rthr, rfou, vone, vtwo, vthr, vfou;
+ numeric ind;
+ color prevpos, thispos, prevvel, thisvel;
+ color rone, rtwo, rthr, rfou, vone, vtwo, vthr, vfou;
+ path flpath;
+ prevpos = Spos;
+ prevvel = Svel;
+ flpath = rp( Spos )
+ for ind=1 upto Numb:
+ hide(
+ vone := Step*ccrossprod( VecFunc( prevpos ), prevvel );
+ rone := Step*prevvel;
+ vtwo :=
+ Step*ccrossprod(VecFunc(prevpos+0.5*rone),prevvel+0.5*vone);
+ rtwo := Step*( prevvel+0.5*vone );
+ vthr :=
+ Step*ccrossprod(VecFunc(prevpos+0.5*rtwo),prevvel+0.5*vtwo);
+ rthr := Step*( prevvel+0.5*vtwo );
+ vfou :=
+ Step*ccrossprod( VecFunc( prevpos+rthr ), prevvel+vthr );
+ rfou := Step*( prevvel+vthr );
+ thisvel := prevvel+(vtwo+vthr)/3+(vone+vfou)/6;
+ thispos := prevpos+(rtwo+rthr)/3+(rone+rfou)/6
+ )
+ ..rp( thispos )
+ hide(
+ prevpos := thispos;
+ prevvel := thisvel
+ )
+ endfor;
+ ( flpath )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Part II:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Advanced 3D-Object Definition Functions %%%%%
+% Please check the examples in planpht.mp or the default object below %%%%
+
+ vardef makeline@#( text vertices ) =
+ save counter;
+ numeric counter;
+ counter = 0;
+ for ind=vertices:
+ counter := incr( counter );
+ L@#p[counter] := V[ind];
+ endfor;
+ npl@# := counter;
+ NL := @#
+ enddef;
+
+ vardef makeface@#( text vertices ) =
+ save counter;
+ numeric counter;
+ counter = 0;
+ for ind=vertices:
+ counter := incr( counter );
+ F@#p[counter] := V[ind];
+ endfor;
+ npf@# := counter;
+ NF := @#;
+ FCD[NF] := false
+ enddef;
+
+ vardef getready( expr commstr, refpoi ) =
+ Nobjects := incr( Nobjects );
+ ostr[Nobjects] := commstr;
+ RefDist[Nobjects] := conorm( f - refpoi )
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definition of a 3D-Object
+% define vertices
+ V1 := (1,0,0);
+ V2 := (0,0,0);
+ V3 := (0,1,0);
+ V4 := (-0.3,0.2,1);
+ V5 := (1,0,1);
+ V6 := (0,1,1);
+ V7 := (0,0,2);
+ V8 := (-0.5,0.6,1.2);
+ V9 := (0.6,-0.5,1.2);
+ makeline1(8,9);
+ makeface1(1,2,7);
+ makeface2(2,3,7);
+ makeface3(5,4,6);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% or the old way below %%%%%%%%%
+% define lines
+% NL := 1; % number of lines
+% npl1 := 2; % number of vertices of the first line
+% L1p1 := V8;
+% L1p2 := V9;
+% define faces
+% NF := 3; % number of faces
+% npf1 := 3; % number of vertices of the first face
+% F1p1 := V1;
+% F1p2 := V2;
+% F1p3 := V7;
+% npf2 := 3; % number of vertices of the second face
+% F2p1 := V2;
+% F2p2 := V3;
+% F2p3 := V7;
+% npf3 := 3; % number of vertices of the third face
+% F3p1 := V5;
+% F3p2 := V4;
+% F3p3 := V6;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Flip first argument accordingly to the second
+
+ def flipvector(expr A, B) =
+ begingroup
+ save nv;
+ color nv;
+ if cdotprod( A, B) < 0 :
+ nv = -A;
+ else:
+ nv = A;
+ fi;
+ ( nv )
+ endgroup
+ enddef;
+
+% Frontside of a face given by three of its vertices
+
+ def facevector(expr A, B, C) =
+ begingroup
+ save nv;
+ color nv;
+ nv = ncrossprod( A-B, B-C );
+ ( flipvector( nv, f-B ) )
+ endgroup
+ enddef;
+
+% Center or inside of a face
+
+ def masscenter(expr Nsides)(suffix Coords) =
+ begingroup
+ save mc, counter;
+ numeric counter;
+ color mc;
+ mc = (0,0,0);
+ for counter=1 upto Nsides:
+ mc := mc + Coords[counter];
+ endfor;
+ ( mc / Nsides )
+ endgroup
+ enddef;
+
+% Direction of coverability. The trick is here.
+% The condition for visibility is
+% that the angle beetween the vector that goes from the side of a face to
+% the mark position and the covervector must be greater than 90 degrees.
+
+ def covervector(expr A, B, MassCenter) =
+ begingroup
+ save nv;
+ color nv;
+ nv = ncrossprod( A-f, B-f );
+ ( flipvector( nv, MassCenter-B) )
+ endgroup
+ enddef;
+
+% O.K., the following macro tests the visibility of a point
+
+ def themarkisinview(expr Mark, OwnFace) =
+ begingroup
+ save c, faceVec, centerPoint, coverVec, inview, l, m;
+ color c, faceVec, centerPoint, coverVec;
+ boolean inview;
+ numeric l, m;
+ l = 0;
+ forever: % cycle over faces until the mark is covered
+ l := incr(l);
+ if l = OwnFace:
+ l := incr(l);
+ fi;
+ exitif l > NF;
+ faceVec := facevector(F[l]p1,F[l]p2,F[l]p3);
+ inview := true;
+ if cdotprod(Mark-F[l]p1, faceVec) < 0:
+ centerPoint := masscenter(npf[l], F[l]p);
+ m := 0;
+ forever: % cycle over segments of a face
+ m := incr(m);
+ exitif m > npf[l];
+ if m < npf[l]:
+ c := F[l]p[m+1];
+ else:
+ c := F[l]p1;
+ fi;
+ coverVec := covervector(F[l]p[m], c, centerPoint);
+ inview := cdotprod(Mark-c,coverVec) <= 0;
+ exitif inview;
+ endfor;
+ fi;
+ exitif not inview;
+ endfor;
+ ( inview )
+ endgroup
+ enddef;
+
+% Check for possible intersection or crossing.
+
+ def maycrossviewplan(expr Ea, Eb, La, Lb) =
+ begingroup
+ ( abs( cdotprod( ccrossprod(Ea-f,Eb-f), La-Lb ) ) > 0.001 )
+ endgroup
+ enddef;
+
+% Calculate the intersection of two sides. This is very nice.
+
+ def crossingpoint(expr Ea, Eb, La, Lb) =
+ begingroup
+ save thecrossing, perpend, exten, aux;
+ color thecrossing, perpend;
+ numeric exten, aux;
+ if ( Ea = Lb ) or ( Ea = La ):
+ thecrossing = Ea;
+ elseif ( Eb = Lb ) or ( Eb = La ):
+ thecrossing = Eb;
+ else:
+ perpend = ccrossprod( Ea-f, Eb-f );
+ if conorm( perpend ) = 0:
+ thecrossing = Eb;
+ else:
+ aux = cdotprod( perpend, f );
+ cdotprod( perpend, thecrossing ) = aux;
+ ( La-Lb )*exten = La-thecrossing;
+ fi;
+ fi;
+ ( thecrossing )
+ endgroup
+ enddef;
+
+% Calculate the intersection of an edge and a face.
+
+ def crossingpointf(expr Ea, Eb, Fen) =
+ begingroup
+ save thecrossing, perpend, exten;
+ color thecrossing, perpend;
+ numeric exten;
+ perpend = ccrossprod( F[Fen]p1-F[Fen]p2, F[Fen]p3-F[Fen]p2 );
+ cdotprod(perpend,thecrossing) = cdotprod( perpend, F[Fen]p2 );
+ ( Ea-Eb )*exten = Ea-thecrossing;
+ ( thecrossing )
+ endgroup
+ enddef;
+
+% Check for possible intersection of an edge and a face.
+
+ def maycrossviewplanf(expr Ea, Eb, Fen) =
+ begingroup
+ save perpend;
+ color perpend;
+ perpend = ccrossprod( F[Fen]p1-F[Fen]p2, F[Fen]p3-F[Fen]p2 );
+ ( abs( cdotprod( perpend, Ea-Eb ) ) > 0.001 )
+ endgroup
+ enddef;
+
+% The intersection point must be within the extremes of the segment.
+
+ def insidedge(expr Point, Ea, Eb) =
+ begingroup
+ save fract;
+ numeric fract;
+ fract := cdotprod( Point-Ea, Point-Eb );
+ ( fract < 0 )
+ endgroup
+ enddef;
+
+% Skip edges that are too far away
+
+ def insideviewsphere(expr Ea, Eb, La, Lb) =
+ begingroup
+ save furthestofedge, nearestofline, flag, exten;
+ color nearestofline, furthestofedge;
+ boolean flag;
+ numeric exten;
+ nearestofline = La+exten*(Lb-La);
+ cdotprod( nearestofline-f, Lb-La ) = 0;
+ if conorm(Ea-f) < conorm(Eb-f):
+ furthestofedge := Eb;
+ else:
+ furthestofedge := Ea;
+ fi;
+ if conorm(nearestofline-f) < conorm(furthestofedge-f):
+ flag := true;
+ else:
+ flag := false;
+ fi;
+ ( flag )
+ endgroup
+ enddef;
+
+% The intersection point must be within the triangle defined by
+% three points. Really smart.
+
+ def insidethistriangle(expr Point, A, B, C ) =
+ begingroup
+ save arep, area, areb, aret, flag;
+ color arep, area, areb, aret;
+ boolean flag;
+ aret = ccrossprod( A-C, B-C );
+ arep = flipvector( ccrossprod( C-Point, A-Point ), aret );
+ area = flipvector( ccrossprod( A-Point, B-Point ), aret );
+ areb = flipvector( ccrossprod( B-Point, C-Point ), aret );
+ flag = ( conorm( arep + area + areb ) <= 2*conorm( aret ) );
+ ( flag )
+ endgroup
+ enddef;
+
+% The intersection point must be within the triangle defined by the
+% point of view f and the extremes of some edge.
+
+ def insideviewtriangle(expr Point, Ea, Eb) =
+ insidethistriangle( Point, Ea, Eb, f )
+ enddef;
+
+% The intersection point must be within the face
+
+ def insidethisface(expr Point, FaN) =
+ begingroup
+ save flag, m, central;
+ boolean flag;
+ numeric m;
+ color central;
+ m = npf[FaN];
+ central = masscenter( m, F[FaN]p );
+ flag = insidethistriangle( Point,
+ central, F[FaN]p[m], F[FaN]p[1] );
+ for m=2 upto npf[FaN]:
+ exitif flag;
+ flag := insidethistriangle( Point,
+ central, F[FaN]p[m-1], F[FaN]p[m] );
+ endfor;
+ ( flag )
+ endgroup
+ enddef;
+
+% Draw the visible parts of a straight line in beetween points A and B
+% changing the thickness of the line accordingly to the distance from f
+
+ def coarse_line(expr A, B, Facen, Press, Col) =
+ begingroup
+ save k, mark, stepVec;
+ numeric k;
+ color mark, stepVec;
+ stepVec := resolvec(A,B);
+ k := 0;
+ forever: % cycle along a whole segment
+ mark := A+(k*stepVec);
+ exitif cdotprod(B-mark,stepVec) < 0;
+ if themarkisinview(mark,Facen):
+ signalvertex(mark, Press, Col);
+ fi;
+ k := incr(k);
+ endfor
+ endgroup
+ enddef;
+
+% Get the 2D rigorous projection path of a face.
+% Don't use SphericalDistortion here.
+
+ def facepath(expr Facen) =
+ begingroup
+ save thispath, counter;
+ path thispath;
+ numeric counter;
+ thispath = rp(F[Facen]p[1])--
+ for counter=2 upto (npf[Facen]):
+ rp(F[Facen]p[counter])--
+ endfor
+ cycle;
+ ( thispath )
+ endgroup
+ enddef;
+
+ def faceshadowpath(expr Facen) =
+ begingroup
+ save thispath, counter;
+ path thispath;
+ numeric counter;
+ thispath = rp(cb(F[Facen]p[1]))--
+ for counter=2 upto (npf[Facen]):
+ rp(cb(F[Facen]p[counter]))--
+ endfor
+ cycle;
+ ( thispath )
+ endgroup
+ enddef;
+
+% FillDraw a face
+
+ def face_invisible( expr Facen )( text LineAtribs ) =
+ begingroup
+ save ghost;
+ path ghost;
+ ghost = facepath( Facen );
+ unfill ghost;
+ draw ghost LineAtribs
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Different kinds of renderers:
+
+% Draw only the faces, calculating edge-intersections.
+% Mind-blogging kind of thing.
+% Only two constraints: i) faces must be planar and
+% ii) faces must be convex.
+% Pay attention: depends on PrintStep (resolvec).
+
+ def sharpraytrace
+%% ( expr LabelCrossPoints )
+ =
+ begingroup
+ save i, j, k, l, counter, a, b, c, d, currcross;
+ save flag, swapc, swapn, somepoint, frac, exten;
+ save trythis, refpath, otherpath, intertimes;
+ save counter, infolabel;
+ numeric i, j, k, l, counter, swapn;
+ color a, b, c, d, currcross, swapc;
+ boolean flag, trythis;
+ path refpath, otherpath;
+ pair intertimes;
+ string infolabel;
+ color crosspoin[];
+ numeric sortangle[];
+ for i=1 upto NF: % scan all faces
+ for j=1 upto npf[i]: % scan all edges
+ a := F[i]p[j];
+ if j <> npf[i]:
+ b := F[i]p[j+1];
+ else:
+ b := F[i]p1;
+ fi;
+ crosspoin[1] := a;
+ counter := 2;
+ refpath := rp(a)--rp(b); % The limits a and b of one
+ % side of one face
+ for k=1 upto NF:
+ otherpath := facepath(k);
+ intertimes := refpath intersectiontimes otherpath;
+ trythis := xpart intertimes <> 0;
+ if trythis and (xpart intertimes <> 1) and (k <> i):
+ for l=1 upto npf[k]:
+ c := F[k]p[l];
+ if l < npf[k]:
+ d := F[k]p[l+1];
+ else:
+ d := F[k]p1;
+ fi;
+ if insideviewsphere( a, b, c, d ):
+ if maycrossviewplan( a, b, c, d ):
+ currcross := crossingpoint( a, b, c, d );
+ if insideviewtriangle( currcross, a, b ):
+ if insidedge( currcross, c, d ):
+ swapc := ccrossprod( a-b, f-currcross);
+ swapc := ccrossprod(swapc,f-currcross);
+ color somepo;
+ numeric fract;
+ (b-a)*fract = somepo-a;
+ cdotprod(swapc,somepo) =cdotprod(swapc,f);
+ if (fract>0) and (fract<1):
+ crosspoin[counter] := somepo;
+ counter := incr(counter);
+ fi;
+ fi;
+ fi;
+ fi;
+ fi;
+ endfor;
+ if maycrossviewplanf( a, b, k ):
+ currcross := crossingpointf( a, b, k );
+ if insidethisface( currcross, k ):
+ if insidedge( currcross, a, b ):
+ crosspoin[counter] := currcross;
+ counter := incr(counter);
+ fi;
+ fi;
+ fi;
+ fi;
+ endfor;
+ crosspoin[counter] := b;
+ sortangle[1] := 0;
+ for k=2 upto counter:
+ sortangle[k] := conorm(crosspoin[k]-a);
+ endfor;
+ forever:
+ flag := true;
+ for k=2 upto counter:
+ if sortangle[k] < sortangle[k-1]:
+ swapn := sortangle[k-1];
+ sortangle[k-1] := sortangle[k];
+ sortangle[k] := swapn;
+ swapc := crosspoin[k-1];
+ crosspoin[k-1] := crosspoin[k];
+ crosspoin[k] := swapc;
+ flag := false;
+ fi;
+ endfor;
+ exitif flag;
+ endfor;
+ for k=2 upto counter:
+ swapc := resolvec(crosspoin[k-1],crosspoin[k]);
+ flag := themarkisinview( crosspoin[k-1]+swapc, i );
+ if flag and themarkisinview( crosspoin[k]-swapc, i ):
+ draw rp(crosspoin[k-1])--rp(crosspoin[k]);
+ fi;
+ endfor;
+% if LabelCrossPoints:
+% for k=1 upto counter:
+% infolabel:=decimal(i)&","&decimal(j)&","&decimal(k);
+% infolabel := "0";
+% dotlabelrand(infolabel,rp(crosspoin[k]));
+% endfor;
+% fi;
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+% Draw three-dimensional lines checking visibility.
+
+ def lineraytrace(expr Press, Col) =
+ begingroup
+ save i, j, a, b;
+ numeric i, j;
+ color a, b;
+ for i=1 upto NL: % scan all lines
+ for j=1 upto npl[i]-1:
+ a := L[i]p[j];
+ b := L[i]p[j+1];
+ coarse_line( a, b, 0, Press, Col);
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+% Draw only the faces, rigorously projecting the edges.
+
+ def faceraytrace(expr Press, Col) =
+ begingroup
+ save i, j, a, b;
+ numeric i, j;
+ color a, b;
+ for i=1 upto NF: % scan all faces
+ for j=1 upto npf[i]:
+ a := F[i]p[j];
+ if j <> npf[i]:
+ b := F[i]p[j+1];
+ else:
+ b := F[i]p1;
+ fi;
+ coarse_line( a, b, i, Press, Col);
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+% Fast test for your three-dimensional object
+
+ def draw_all_test( expr AlsoDrawLines ) =
+ begingroup
+ save i, j, a, b;
+ numeric i, j;
+ color a, b;
+ if ShadowOn:
+ for i=1 upto NF:
+ fill faceshadowpath( i );
+ endfor;
+ if AlsoDrawLines:
+ for i=1 upto NL: % scan all lines
+ for j=1 upto npl[i]-1:
+ a := L[i]p[j];
+ b := L[i]p[j+1];
+ drawsegment( cb(a), cb(b) );
+ endfor;
+ endfor;
+ fi;
+ fi;
+ for i=1 upto NF: % scan all faces
+ for j=1 upto npf[i]:
+ a := F[i]p[j];
+ if j <> npf[i]:
+ b := F[i]p[j+1];
+ else:
+ b := F[i]p1;
+ fi;
+ drawsegment( a, b );
+ endfor;
+ endfor;
+ if AlsoDrawLines:
+ for i=1 upto NL: % scan all lines
+ for j=1 upto npl[i]-1:
+ a := L[i]p[j];
+ b := L[i]p[j+1];
+ drawsegment( a, b );
+ endfor;
+ endfor;
+ fi
+ endgroup
+ enddef;
+
+% Don't use SphericalDistortion here.
+
+ def fill_faces( text LineAtribs ) =
+ begingroup
+ save i;
+ numeric i;
+ if ShadowOn:
+ for i=1 upto NF:
+ fill faceshadowpath( i );
+ endfor;
+ fi;
+ for i=1 upto NF:
+ face_invisible( i, LineAtribs );
+ endfor
+ endgroup
+ enddef;
+
+ def doitnow =
+ begingroup
+ save i, j, farone;
+ numeric i, j, farone[];
+ for i=1 upto Nobjects:
+ farone[i] := i;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Shell's Method of sorting %%%%%%%%
+ save inc, v, vv;
+ numeric inc, v, vv;
+ inc = 1;
+ forever:
+ inc := 3*inc+1;
+ exitif inc > Nobjects;
+ endfor;
+ forever:
+ inc := round(inc/3);
+ for i=inc+1 upto Nobjects:
+ v := RefDist[i];
+ vv:= farone[i];
+ j := i;
+ forever:
+ exitunless RefDist[j-inc] > v;
+ RefDist[j] := RefDist[j-inc];
+ farone[j] := farone[j-inc];
+ j := j-inc;
+ exitif j <= inc;
+ endfor;
+ RefDist[j] := v;
+ farone[j] := vv;
+ endfor;
+ exitunless inc > 1;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ for i=Nobjects downto 1:
+ j := farone[i];
+ scantokens ostr[j];
+ endfor
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Nematic Liquid Crystal wise:
+
+ def generatedirline(expr Lin, Phi, Theta, Long, Currpos ) =
+ begingroup
+ save longvec;
+ color longvec;
+ npl[Lin] := 2;
+ longvec := Long*( cosd(Phi)*cosd(Theta),
+ sind(Phi)*cosd(Theta),
+ sind(Theta) );
+ L[Lin]p1 := Currpos-0.5*longvec;
+ L[Lin]p2 := Currpos+0.5*longvec
+ endgroup
+ enddef;
+
+ def generatedirface(expr Fen, Phi, Theta, Long, Base, Currpos ) =
+ begingroup
+ save basevec, longvec;
+ color basevec, longvec;
+ npf[Fen] := 3;
+ longvec := Long*( cosd(Phi)*cosd(Theta),
+ sind(Phi)*cosd(Theta),
+ sind(Theta) );
+ basevec := Base*ncrossprod( Currpos-f, longvec );
+ F[Fen]p1 := Currpos-0.5*(longvec+basevec);
+ F[Fen]p2 := Currpos+0.5*longvec;
+ F[Fen]p3 := Currpos-0.5*(longvec-basevec)
+ endgroup
+ enddef;
+
+ def generateonebiax(expr Lin, Phi, Theta, Long, SndDirAngl, Base, Currpos ) =
+ begingroup
+ save basevec, longvec, u, v;
+ color basevec, longvec, u, v;
+ npl[Lin] := 4;
+ longvec := Long*( cosd(Phi)*cosd(Theta),
+ sind(Phi)*cosd(Theta),
+ sind(Theta) );
+ v = (-sind(Phi), cosd(Phi), 0);
+ u = ( cosd(Phi)*cosd(Theta+90),
+ sind(Phi)*cosd(Theta+90),
+ sind(Theta+90) );
+ basevec := Base*( v*cosd(SndDirAngl)+u*sind(SndDirAngl) );
+ L[Lin]p1 := Currpos-0.5*longvec;
+ L[Lin]p2 := Currpos+0.5*basevec;
+ L[Lin]p3 := Currpos+0.5*longvec;
+ L[Lin]p4 := Currpos-0.5*basevec
+ endgroup
+ enddef;
+
+ def director_invisible( expr SortEmAll, ThickenFactor, CyclicLines ) =
+ begingroup
+ save i, j, k, farone, thisfar;
+ save outerr, innerr, direc, ounum;
+ numeric i, j, k, farone[], dist[], thisfar, ounum;
+ pen actualpen, outerr, innerr;
+ path direc;
+ actualpen = currentpen;
+ if SortEmAll:
+ for i=1 upto NL: % scan all lines
+ dist[i] := conorm( masscenter( npl[i], L[i]p ) - f );
+ farone[i] := i;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Shell's Method of sorting %%%%%%%%
+ save inc, v, vv;
+ numeric inc, v, vv;
+ inc = 1;
+ forever:
+ inc := 3*inc+1;
+ exitif inc > NL;
+ endfor;
+ forever:
+ inc := round(inc/3);
+ for i=inc+1 upto NL:
+ v := dist[i];
+ vv:= farone[i];
+ j := i;
+ forever:
+ exitunless dist[j-inc] > v;
+ dist[j] := dist[j-inc];
+ farone[j] := farone[j-inc];
+ j := j-inc;
+ exitif j <= inc;
+ endfor;
+ dist[j] := v;
+ farone[j] := vv;
+ endfor;
+ exitunless inc > 1;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ else:
+ for i=1 upto NL:
+ farone[i] := i;
+ endfor;
+ fi;
+ for i=NL downto 1: % draw all pathes
+ j := farone[i];
+ direc := rp( L[j]p1 )
+ for k=2 upto npl[j]:
+ --rp( L[j]p[k] )
+ endfor;
+ if CyclicLines:
+ direc := direc--cycle;
+ fi;
+ ounum := Spread*ps( masscenter(npl[j],L[j]p), ThickenFactor );
+ outerr := pencircle scaled ounum;
+ innerr := pencircle scaled (0.8*ounum); %% DANGER %%
+ pickup outerr;
+ draw direc withcolor black;
+ pickup innerr;
+ draw direc withcolor background;
+ endfor;
+ pickup actualpen
+ endgroup
+ enddef;
+
+% Now two routines to draw "bananas", well, sort of...
+% Initially coded by Pedro J. Sebastião
+
+ def circularsheet( expr CenterP, Rad, VecX, VecY, StartA, FinisA, Width ) =
+ begingroup
+ save vecz, ind;
+ color vecz;
+ numeric ind;
+ vecz = ncrossprod( VecX, VecY );
+ ( rp( CenterP + Width*vecz + Rad*planarrotation( VecX, VecY, StartA ) )
+ for ind=StartA+1 upto FinisA:
+ --rp( CenterP + Width*vecz + Rad*planarrotation( VecX, VecY, ind ))
+ endfor
+ for ind=FinisA downto StartA:
+ --rp( CenterP + Rad*planarrotation( VecX, VecY, ind ) )
+ endfor
+ --cycle )
+ endgroup
+ enddef;
+
+ def banana( expr CenterPos, Radius, AngleColor, Wid, Amp ) =
+ begingroup
+ save ind, sinbeta, cosbeta, aux, delta, angfvbx, angpos, angneg, au;
+ save bx, by, bz, fv, beta, gamma, alfa;
+ save outpath, outpathb, outpathc, visneg, vispos;
+ numeric ind, sinbeta, cosbeta, aux, delta, angfvbx, angpos, angneg, au;
+ numeric beta, gamma, alfa;
+ color bx, by, bz, fv;
+ path outpath, outpathb, outpathc;
+ boolean visneg, vispos;
+
+ alfa = X(AngleColor);
+ beta = Y(AngleColor);
+ gamma= Z(AngleColor);
+ bx = eulerrotation( alfa, beta, gamma, red );
+ by = eulerrotation( alfa, beta, gamma, green );
+ bz = eulerrotation( alfa, beta, gamma, blue );
+
+ au = cdotprod( f-CenterPos, by );
+ if 0 > au:
+ by := -by;
+ fi;
+ fv = cdotprod( f, bx )*bx + cdotprod( f, by )*by;
+ aux = conorm( fv-CenterPos );
+ if aux > Radius:
+ cosbeta = Radius/aux;
+ sinbeta = ( aux +-+ Radius )/aux;
+ delta = angle( cosbeta, sinbeta );
+ angfvbx = getangle( fv - CenterPos, bx );
+ if 0 > cdotprod( fv - CenterPos, by ):
+ angfvbx := -angfvbx;
+ fi;
+ angpos = delta + angfvbx;
+ angneg = angfvbx - delta;
+ if ( angneg > -Amp ) and ( Amp > angneg ):
+ visneg = true;
+ else:
+ visneg = false;
+ fi;
+ if ( angpos > -Amp ) and ( Amp > angpos ):
+ vispos = true;
+ else:
+ vispos = false;
+ fi;
+ if visneg and not vispos:
+ outpath = circularsheet(CenterPos,Radius,bx,by,-Amp,angneg,Wid);
+ unfill outpath;
+ draw outpath;
+ outpathb = circularsheet(CenterPos,Radius,bx,by,angneg,Amp,Wid);
+ unfill outpathb;
+ draw outpathb
+ fi;
+ if vispos and not visneg:
+ outpath = circularsheet(CenterPos,Radius,bx,by,-Amp,angpos,Wid);
+ unfill outpath;
+ draw outpath;
+ outpathb = circularsheet(CenterPos,Radius,bx,by,angpos,Amp,Wid);
+ unfill outpathb;
+ draw outpathb
+ fi;
+ if (not vispos) and (not visneg):
+ outpath = circularsheet(CenterPos,Radius,bx,by,-Amp,Amp,Wid);
+ unfill outpath;
+ draw outpath;
+ fi;
+ if vispos and visneg:
+ if 0 > cdotprod( f-CenterPos, bx ):
+ outpath=circularsheet(CenterPos,Radius,bx,by,angneg,angpos,Wid);
+ unfill outpath;
+ draw outpath;
+ outpathb = circularsheet(CenterPos,Radius,bx,by,-Amp,angneg,Wid);
+ unfill outpathb;
+ draw outpathb;
+ outpathc = circularsheet(CenterPos,Radius,bx,by,angpos,Amp,Wid);
+ unfill outpathc;
+ draw outpathc;
+ else:
+ outpathb = circularsheet(CenterPos,Radius,bx,by,-Amp,angneg,Wid);
+ unfill outpathb;
+ draw outpathb;
+ outpathc = circularsheet(CenterPos,Radius,bx,by,angpos,Amp,Wid);
+ unfill outpathc;
+ draw outpathc;
+ outpath=circularsheet(CenterPos,Radius,bx,by,angneg,angpos,Wid);
+ unfill outpath;
+ draw outpath;
+ fi;
+ fi;
+ else:
+ outpath = circularsheet( CenterPos, Radius, bx, by, -Amp, Amp, Wid );
+ unfill outpath;
+ draw outpath;
+ fi;
+ draw rp(CenterPos+Radius*bx)--rp(CenterPos+Radius*bx+Wid*bz);
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Plotting:
+
+% Define and draw surfaces with a triangular mesh.
+% On a hexagonal or triangular area. Without sorting (no need).
+
+ def hexagonaltrimesh( expr BeHexa,theN,SideSize )( text SurFunc ) =
+ begingroup
+ save i, j, posx, posy, posz, higx, higy,
+ counter, stepx, stepy, poi, lowx, lowy,
+ newn, bola, bolb, bolc;
+ numeric i, j, posx, posy, posz, higx, higy,
+ counter, stepx, stepy, lowx, lowy, newn;
+ color poi[][];
+ boolean bola, bolb, bolc;
+ npf0 := 3;
+ FCD0 := true; % this is used in the calls to fillfacewithlight
+ ActuC := incr( ActuC );
+ if ActuC > TableColors:
+ ActuC := 1;
+ fi;
+ FC0 := ActuC; %%
+ counter = 0;
+ stepy = SideSize/theN;
+ stepx = 0.5*stepy*sqrt(3);
+ lowy = -0.5*SideSize;
+ lowx = -sqrt(3)*SideSize/6;
+ higy = -lowy;
+ higx = sqrt(3)*SideSize/3;
+ for i=0 upto theN:
+ for j=0 upto theN-i:
+ posx := lowx + i*stepx;
+ posy := lowy + i*stepx/sqrt(3) + j*stepy;
+ posz := SurFunc( posx, posy );
+ poi[i][j] := ( posx, posy, posz );
+ endfor;
+ endfor;
+ if BeHexa:
+ newn = round((theN+1)/3)+1;
+ else:
+ newn = 1;
+ fi;
+ for j=newn upto theN-newn+1:
+ F0p1 := poi[0][j-1];
+ F0p2 := poi[0][j];
+ F0p3 := poi[1][j-1];
+ fillfacewithlight( 0 ); % see below
+ endfor;
+ for i=1 upto theN-1:
+ for j=1 upto theN-i:
+ bola := ( i < newn ) and ( j < newn-i );
+ bolb := ( i < newn ) and ( j > theN-newn+1 );
+ bolc := ( i > theN-newn );
+ if not ( bola or bolb or bolc ):
+ F0p1 := poi[i-1][j];
+ F0p2 := poi[i][j-1];
+ F0p3 := poi[i][j];
+ fillfacewithlight( 0 );
+ F0p1 := poi[i+1][j-1];
+ fillfacewithlight( 0 );
+ fi;
+ endfor;
+ endfor;
+ i := theN-newn+1;
+ for j=1 upto newn-1:
+ F0p1 := poi[i-1][j];
+ F0p2 := poi[i][j-1];
+ F0p3 := poi[i][j];
+ fillfacewithlight( 0 );
+ endfor;
+ endgroup
+ enddef;
+
+ def fillfacewithlight( expr FaceN ) =
+ begingroup
+ save perpvec, reflectio, viewvec, inciden, refpos, projincid;
+ save shiftv, fcol, lcol, theangle, ghost, pa, pb, pc, j, lowcolor;
+ color perpvec, reflectio, viewvec, inciden, refpos, projincid;
+ color shiftv, fcol, lcol, pa, pb, pc, lowcolor;
+ numeric theangle, j;
+ path ghost;
+ ghost := rp( F[FaceN]p1 )
+ for j=2 upto npf[FaceN]:
+ --rp( F[FaceN]p[j] )
+ endfor
+ --cycle;
+ if OverRidePolyhedricColor:
+ unfill ghost;
+ else:
+ refpos = masscenter( npf[FaceN], F[FaceN]p );
+ pa = F[FaceN]p1;
+ pb = F[FaceN]p2;
+ pc = F[FaceN]p3;
+ inciden = LightSource - refpos;
+ viewvec = f - refpos;
+ perpvec = ncrossprod( pa-pb, pb-pc );
+ if cdotprod( perpvec, blue ) < 0:
+ perpvec := -perpvec;
+ fi;
+ projincid = perpvec*cdotprod( perpvec, inciden );
+ shiftv = inciden - projincid;
+ reflectio = projincid - shiftv;
+ theangle = getangle( reflectio, viewvec );
+ if FCD[FaceN]:
+ lowcolor = TableC[FC[FaceN]];
+ else:
+ lowcolor = TableC0;
+ fi;
+ lcol = (cosd( theangle ))[lowcolor,HigColor];
+ if cdotprod( viewvec, perpvec ) < 0:
+ fcol = lcol - SubColor;
+ else:
+ fcol = lcol;
+ fi;
+ fill ghost withcolor fcol;
+ fi;
+ draw ghost;
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Part III (parametric plots and another renderer):
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%% Kindly contributed by Jens Schwaiger %%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% dmin_ is the minimal distance of all faces to f;
+% dmax_ is the maximal distance of all faces to f;
+% (both values are determined in "draw_invisible")
+% Facen is the number of the face to be filled;
+% ColAtrib is the color used for filling;
+% ColAtribone the color used for drawing;
+% Colordensity depends on distance of the face from f
+
+ def face_drawfill( expr Facen, dmin_, dmax_ ,ColAtrib, ColAtribone ) =
+ begingroup
+ save j, ptmp, colfac_, coltmp_;
+ path ghost;
+ numeric j, colfac_;
+ color ptmp, coltmp_;
+ ghost := rp( F[Facen]p1 );
+ for j=2 upto npf[Facen]:
+ ghost := ghost--rp( F[Facen]p[j] );
+ endfor;
+ ghost := ghost--cycle;
+ ptmp:= masscenter( npf[Facen], F[Facen]p ) - f;
+ % 0<=colfac_<=1
+ colfac_ := ( conorm(ptmp)-dmin_ )/( dmax_ - dmin_ );
+ % color should be brighter, if distance to f is smaller
+ colfac_ := 1 - colfac_;
+ % color should be not to dark, i.e., >=0.1 (and <=1)
+ colfac_ := 0.9colfac_ + 0.1;
+ % now filling and drawing with appropriate color;
+ fill ghost withcolor colfac_*ColAtrib;
+ draw ghost withcolor colfac_*ColAtribone;
+ endgroup
+ enddef;
+
+% Now a much faster faces-only-ray-tracer based upon the unfill
+% command and the constraint of non-intersecting faces of similar
+% sizes. Faces are sorted by distance from nearest vertex or
+% masscenter to the point of view. This routine may be used to
+% draw graphs of 3D surfaces (use masscenters in this case).
+%
+% Option=true: test all vertices
+% Option=false: test masscenters of faces
+% DoJS=true: use face_drawfill by J. Schwaiger
+% DoJS=false: use fillfacewithlight by L. Nobre G.
+% ColAtrib=color for filling faces
+% ColAtribone=color for drawing edges
+
+ def draw_invisible( expr Option, DoJS, ColAtrib, ColAtribone ) =
+ begingroup
+ save i, j, a, b, thisfar, ptmp, farone;
+ numeric i, j, farone[], dist[], thisfar, distmin_, distmax_;
+ color a, b, ptmp;
+ for i=1 upto NF: % scan all faces
+ if Option: % for distances of
+ dist[i] = conorm( F[i]p1 - f ); % nearest vertices
+ if i=1:
+ distmin_ := dist1; % initialisation of
+ distmax_ := dist1; % dmin_ and dmax_
+ fi;
+ distmin_ := min( distmin_, dist[i] );
+ distmax_ := max( distmax_, dist[i] );
+ for j=2 upto npf[i]:
+ thisfar := conorm( F[i]p[j] - f );
+ distmin_ := min( distmin_, thisfar );
+ distmax_ := max( distmax_, thisfar );
+ if thisfar < dist[i]:
+ dist[i] := thisfar;
+ fi;
+ endfor;
+ else: % for distances of centers of mass
+ dist[i] := conorm( masscenter( npf[i], F[i]p ) - f );
+ if i=1:
+ distmin_ := dist1; % initialisation of
+ distmax_ := dist1; % dmin_ and dmax_ in this case
+ fi;
+ distmin_ := min( distmin_, dist[i] );
+ distmax_ := max( distmax_, dist[i] );
+ fi;
+ farone[i] = i;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Shell's Method of sorting %%%%%%%%
+ save inc, v, vv;
+ numeric inc, v, vv;
+ inc = 1;
+ forever:
+ inc := 3*inc+1;
+ exitif inc > NF;
+ endfor;
+ forever:
+ inc := round(inc/3);
+ for i=inc+1 upto NF:
+ v := dist[i];
+ vv:= farone[i];
+ j := i;
+ forever:
+ exitunless dist[j-inc] > v;
+ dist[j] := dist[j-inc];
+ farone[j] := farone[j-inc];
+ j := j-inc;
+ exitif j <= inc;
+ endfor;
+ dist[j] := v;
+ farone[j] := vv;
+ endfor;
+ exitunless inc > 1;
+ endfor;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ for i=NF downto 1: % draw and fill all pathes
+ j := farone[i];
+ if DoJS:
+ face_drawfill( j, distmin_, distmax_, ColAtrib, ColAtribone );
+ else:
+ fillfacewithlight( j );
+ fi;
+ endfor;
+ endgroup
+ enddef;
+
+% Move to the good range (-1,1).
+
+ def bracket( expr low, poi, hig ) =
+ begingroup
+ save zout;
+ numeric zout;
+ zout = (2*poi-hig-low)/(hig-low);
+ if zout > 1:
+ zout := 1;
+ fi;
+ if zout < -1:
+ zout := -1;
+ fi;
+ ( zout )
+ endgroup
+ enddef;
+
+% Define parametric surfaces with a triangular mesh... unless a
+% quadrangular mesh can do a fine, rigorous job just as well.
+
+ def partrimesh( expr nt,ns,lowt,higt,lows,higs,lowx,higx,lowy,higy,lowz,higz,facz)( text parSurFunc ) =
+ begingroup
+ save i, j, k, posx, posy, posz;
+ save counter, stept, steps, poss, post, tmpaux;
+ save veca, vecb, vecc, vecd;
+ numeric i, j, k, posx, posy, posz, counter, stept, steps;
+ color poi[][], tmpaux, veca, vecb, vecc, vecd;
+ counter := NF; % <-- NF must be initialized!
+ ActuC := incr( ActuC );
+ if ActuC > TableColors:
+ ActuC := 1;
+ fi;
+ steps = ( higs - lows )/ns;
+ stept = ( higt - lowt )/nt;
+ for i=0 upto ns:
+ for j=0 upto nt:
+ poss := lows + i*steps;
+ post := lowt + j*stept;
+ tmpaux := parSurFunc( poss, post );
+ posz := Z(tmpaux);
+ posx := X(tmpaux);
+ posy := Y(tmpaux);
+ posx := bracket(lowx,posx,higx);
+ posy := bracket(lowy,posy,higy);
+ posz := bracket(lowz,posz,higz)/facz;
+ poi[i][j] := ( posx, posy, posz );
+ endfor;
+ endfor;
+ for i=1 upto ns:
+ for j=1 step 1 until nt:
+ veca := poi[i][j]-poi[i-1][j];
+ vecb := poi[i][j]-poi[i-1][j-1];
+ vecc := poi[i][j]-poi[i][j-1];
+ if abs(cdotprod(ccrossprod(veca,vecb),vecc))<0.00005: %DANGER!
+ counter := incr(counter);
+ npf[counter] := 4;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i-1][j];
+ F[counter]p3 := poi[i][j];
+ F[counter]p4 := poi[i][j-1];
+ FC[counter] := ActuC;
+ FCD[counter] := true;
+ else:
+ tmpaux:=
+ 0.25*(poi[i-1][j-1]+poi[i-1][j]+poi[i][j]+poi[i][j-1]);
+ veca := poi[i-1][j-1]-tmpaux;
+ vecb := poi[i-1][j]-tmpaux;
+ vecc := poi[i][j]-tmpaux;
+ vecd := poi[i][j-1]-tmpaux;
+ if getangle(vecb,vecd)>getangle(veca,vecc):
+ for k=-1 upto 0:
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i-1][j-1];
+ F[counter]p2 := poi[i+k][j-1-k];
+ F[counter]p3 := poi[i][j];
+ FC[counter] := ActuC;
+ FCD[counter] := true;
+ endfor;
+ else:
+ for k=-1 upto 0:
+ counter := incr(counter);
+ npf[counter] := 3;
+ F[counter]p1 := poi[i+k][j+k];
+ F[counter]p2 := poi[i][j-1];
+ F[counter]p3 := poi[i-1][j];
+ FC[counter] := ActuC;
+ FCD[counter] := true;
+ endfor;
+ fi;
+ fi;
+ endfor;
+ endfor;
+ NF := counter;
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Part IV (automatic perspective tuning and minimization):
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ def randomfear =
+ begingroup
+ save a, b, c, i, h;
+ numeric a, b, c, i, h;
+ i = uniformdeviate( 360 );
+ h = uniformdeviate( 180 );
+ a = cosd( h )*cosd( i );
+ b = sind( h )*cosd( i );
+ c = sind( i );
+ ( (a,b,c) )
+ endgroup
+ enddef;
+
+ def renormalizevc( expr inF, inVC ) =
+ begingroup
+ save a;
+ color a;
+ cdotprod( inF, a ) = 0;
+ inF - a = whatever*( inF - inVC );
+ ( a )
+ endgroup
+ enddef;
+
+ def calculatecost( expr TryF, TryVc, TrySp, TrySh ) =
+ begingroup
+ save sumsquares, i, difpair, xx, yy;
+ numeric sumsquares, i, xx, yy;
+ pair difpair;
+ sumsquares = 0;
+ f := TryF;
+ viewcentr := TryVc;
+ Spread := TrySp;
+ ShiftV := TrySh;
+ for i=1 upto PhotoMarks:
+ difpair := 0.05*(rp(PhotoPoint[i]) - PhotoPair[i]); % DANGER
+ xx := ((xpart difpair)**2)/PhotoMarks;
+ yy := ((ypart difpair)**2)/PhotoMarks;
+ sumsquares := sumsquares + xx + yy;
+ endfor;
+ ( sumsquares )
+ endgroup
+ enddef;
+
+ def forcepointinsidefear( text A ) =
+ begingroup
+ if abs( X(A) ) > 0.5*MaxFearLimit :
+ A := 0.5*A*MaxFearLimit/abs( X(A) );
+ fi;
+ if abs( Y(A) ) > 0.5*MaxFearLimit :
+ A := 0.5*A*MaxFearLimit/abs( Y(A) );
+ fi;
+ if abs( Z(A) ) > 0.5*MaxFearLimit :
+ A := 0.5*A*MaxFearLimit/abs( Z(A) );
+ fi;
+ ( A )
+ endgroup
+ enddef;
+
+ def forcepairinsidepage( text A ) =
+ begingroup
+ if xpart A > 2*(xpart OriginProjPagePos):
+ A := ( 2*(xpart OriginProjPagePos), ypart A );
+ fi;
+ if ypart A > 2*(ypart OriginProjPagePos):
+ A := ( xpart A, 2*(ypart OriginProjPagePos) );
+ fi;
+ if xpart A < 0:
+ A := ( 0, ypart A );
+ fi;
+ if ypart A < 0:
+ A := ( xpart A, 0 );
+ fi;
+ ( A )
+ endgroup
+ enddef;
+
+ def calculatejump( expr AverCost, PrevCost, RandCost, JumpLimit ) =
+ begingroup
+ save funfact, numer, denom;
+ numeric funfact, numer, denom;
+ if RandCost+PrevCost > 2*AverCost:
+ numer := 3*PrevCost - 4*AverCost + RandCost;
+ denom := 4*( RandCost + PrevCost - 2*AverCost );
+ if abs( denom )*JumpLimit < abs( numer ):
+ funfact := 0;
+ else:
+ funfact := numer/denom;
+ fi;
+ else:
+ funfact := 0;
+ fi;
+ ( funfact )
+ endgroup
+ enddef;
+
+ def photoreverse( expr IterNum, ExpTao, JumpFact ) =
+ begingroup
+ save j, auxvc, actfact, auxfac;
+ save prevf, randf, averf, prevvc, randvc, avervc;
+ save prevsp, randsp, aversp, prevsh, randsh, aversh;
+ save prevcost, randcost, avercost, spreadlimit, expfact;
+ numeric j, prevsp, randsp, aversp, actfact;
+ numeric prevcost, randcost, avercost;
+ numeric spreadlimit, expfact;
+ color prevf, randf, averf, prevvc, randvc, avervc, auxvc;
+ pair prevsh, randsh, aversh;
+ spreadlimit = 20; % DANGER
+ prevf = f;
+ prevvc= viewcentr;
+ prevsp= Spread;
+ prevsh= ShiftV;
+ prevcost = calculatecost( prevf, prevvc, prevsp, prevsh );
+ show prevcost;
+ auxfac = -1280.0/ExpTao/IterNum;
+ for j=0 upto IterNum:
+ expfact := mexp(auxfac*j);
+ randf := prevf + expfact*randomfear;
+ randcost := calculatecost( randf, prevvc, prevsp, prevsh );
+ averf := 0.5[prevf,randf];
+ avercost := calculatecost( averf, prevvc, prevsp, prevsh );
+ actfact := calculatejump(avercost,prevcost,randcost,JumpFact);
+ prevf := actfact[prevf,randf];
+ auxvc := prevvc + expfact*randomfear;
+ randvc:= renormalizevc( randf, auxvc );
+ randcost := calculatecost( prevf, randvc, prevsp, prevsh );
+ auxvc := 0.5[prevvc,randvc];
+ avervc:= renormalizevc( averf, auxvc );
+ avercost := calculatecost( prevf, avervc, prevsp, prevsh );
+ actfact := calculatejump(avercost,prevcost,randcost,JumpFact);
+ auxvc := actfact[prevvc,randvc];
+ prevvc:= renormalizevc( prevf, auxvc );
+ randsp:= prevsp+expfact*spreadlimit*(uniformdeviate( 1 ) - 0.5);
+ randcost := calculatecost( prevf, prevvc, randsp, prevsh );
+ aversp:= 0.5[prevsp,randsp];
+ avercost := calculatecost( prevf, prevvc, aversp, prevsh );
+ actfact := calculatejump(avercost,prevcost,randcost,JumpFact);
+ prevsp:= actfact[prevsp,randsp];
+ randsh:= prevsh + expfact*dir( uniformdeviate( 360 ) ); % DANGER
+ randcost := calculatecost( prevf, prevvc, prevsp, randsh );
+ aversh:= 0.5[prevsh,randsh];
+ avercost := calculatecost( prevf, prevvc, prevsp, aversh );
+ actfact := calculatejump(avercost,prevcost,randcost,JumpFact);
+ prevsh:= actfact[prevsh,randsh];
+ prevcost := calculatecost( prevf, prevvc, prevsp, prevsh );
+ %show (prevcost,expfact);
+ endfor;
+ show prevcost;
+ endgroup
+ enddef;
+
+% Minimization routine for scalar functions like y=f(x) where an initial
+% triplet (x1,x2,x3) with x1<x2<x3 is given as a parabolic squeleton that
+% provides a way to search for the smallest value of y (if iterated)
+
+ def minimizestep( expr Abcisscolor )( text PlainFunc ) =
+ begingroup
+ save xa, xb, xc, xd, ya, yb, yc, yd, aux, coeb, coec, den;
+ save colout;
+ numeric xa, xb, xc, xd, ya, yb, yc, yd, aux, coeb, coec, den;
+ color colout;
+ xa = X( Abcisscolor );
+ xb = Y( Abcisscolor );
+ xc = Z( Abcisscolor );
+ ya = PlainFunc(xa);
+ yb = PlainFunc(xb);
+ yc = PlainFunc(xc);
+ if ya = yb:
+ colout = (-0.125[xa,xb],xb,xc);
+ elseif yb = yc:
+ colout = (xa,xb,1.125[xb,xc]);
+ else:
+ if (yb>ya) or (yb>yc):
+ show Abcisscolor;
+ message " Unable to minimizestep!";
+ fi;
+ den = (xb-xc)*((xa**2)-(xb**2))-(xa-xb)*((xb**2)-(xc**2));
+ if abs(den) < 0.0005:
+ show den;
+ message " Unable to minimizestep!";
+ fi;
+ coeb = ((yb-yc)*((xa**2)-(xb**2))-(ya-yb)*((xb**2)-(xc**2)))/den;
+ coec = ((xb-xc)*(ya-yb)-(xa-xb)*(yb-yc))/den;
+ xd = -0.5*coeb/coec;
+ yd = PlainFunc( xd );
+ if ((xa<xd) and (xd<xb)):
+ if (yd<yb):
+ colout = (xa,xd,xb);
+ else:
+ colout = (xd,xb,xc);
+ fi;
+ elseif ((xb<xd) and (xd<xc)):
+ if (yd<yb):
+ colout = (xb,xd,xc);
+ else:
+ colout = (xa,xb,xd);
+ fi;
+ else:
+ aux := 0.125[xb,xc]-0.125[xb,xa];
+ colout = (xa,0.125[xb,xa]+uniformdeviate(aux),xc);
+ fi;
+ fi;
+ ( colout )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Part V:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Intersections:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Check lineintersectplan above %%%%%%%%%%%%%%%
+
+ def calculatecostver(expr VerA,DisA,VerB,DisB,VerC,DisC,TryV) =
+ begingroup
+ save a, b, c;
+ numeric a, b, c;
+ a = conorm( TryV - VerA ) - DisA;
+ b = conorm( TryV - VerB ) - DisB;
+ c = conorm( TryV - VerC ) - DisC;
+ ( ( a ++ b ++ c )**2 )
+ endgroup
+ enddef;
+
+% Approximation of the intersection of three spheres.
+% Be aware of the next three danger parameters.
+
+ def improvertex( expr VerA, DisA, VerB, DisB, VerC, DisC, IniV ) =
+ begingroup
+ save j, iternum, prevcost, factry, actpoi, actfact, auxa, auxb;
+ save jumplim, trypoi, halfpo, expfact, randcost, avercost, auxc;
+ numeric j, iternum, prevcost, factry, randcost, avercost, actfact;
+ numeric jumplim, expfact;
+ color actpoi, trypoi, halfpo, auxa, auxb, auxc;
+ trypoi = IniV;
+ iternum = 24; % DANGER!
+ factry = 0.25; % DANGER!
+ jumplim = 2.5; % DANGER!
+ prevcost = calculatecostver(VerA,DisA,VerB,DisB,VerC,DisC,trypoi);
+ message "improvertex initial cost: " & decimal(prevcost)
+ & " at point " & cstr(trypoi);
+ for j=1 upto 5:
+ auxa := VerA-trypoi;
+ auxa := N(auxa)*(conorm(auxa)-DisA);
+ auxb := VerB-trypoi;
+ auxb := N(auxb)*(conorm(auxb)-DisB);
+ auxc := VerC-trypoi;
+ auxc := N(auxc)*(conorm(auxc)-DisC);
+ trypoi := trypoi+factry*(auxa+auxb+auxc);
+ endfor;
+ prevcost := calculatecostver(VerA,DisA,VerB,DisB,VerC,DisC,trypoi);
+ message "phase one cost: " & decimal(prevcost)
+ & " at point " & cstr(trypoi);
+ for j=0 upto iternum:
+ expfact := mexp(-j*200/iternum); % DANGER!
+ actpoi := trypoi+factry*expfact*randomfear;
+ randcost :=
+ calculatecostver(VerA,DisA,VerB,DisB,VerC,DisC,actpoi);
+ halfpo := 0.5[trypoi,actpoi];
+ avercost :=
+ calculatecostver(VerA,DisA,VerB,DisB,VerC,DisC,halfpo);
+ actfact := calculatejump(avercost,prevcost,randcost,jumplim);
+ trypoi := actfact[trypoi,actpoi];
+ prevcost :=
+ calculatecostver(VerA,DisA,VerB,DisB,VerC,DisC,trypoi);
+ % show prevcost;
+ endfor;
+ message "final cost: " & decimal(prevcost)
+ & " at point " & cstr(trypoi);
+ ( trypoi )
+ endgroup;
+ enddef;
+
+% The approximation of the intersection of a plane, an infinite cylinder (tube)
+% and a spheroid (an oblate spheroid, a prolate spheroid or a perfect sphere)
+
+ def ultraimprovertex( expr PlanPoi, PlanDir, BaseCenter, Radius, LenVec,
+ CentrPoi, NorthPoleVec, Ray, IniV ) =
+ begingroup
+ save trypoi, auxa, auxb, auxc, auxd, plandi, cyldi, factry, focn, focs;
+ save norpoldi, major, majortmp, nordi, tmpdi;
+ color trypoi, auxa, auxb, auxc, auxd, plandi, cyldi, focn, focs;
+ color norpoldi, nordi, tmpdi;
+ numeric factry, major, majortmp;
+ trypoi = IniV;
+ factry = 0.25;
+ plandi = N(PlanDir);
+ cyldi = N(LenVec);
+ norpoldi = N(NorthPoleVec);
+ major = conorm(NorthPoleVec);
+ if major>Ray:
+ focn := CentrPoi+(major+-+Ray)*norpoldi;
+ focs := CentrPoi-(major+-+Ray)*norpoldi;
+ fi;
+ for j=1 upto 50:
+ if major<Ray:
+ tmpdi := trypoi-CentrPoi;
+ nordi := N(tmpdi-cdotprod(tmpdi,norpoldi)*norpoldi);
+ focn := CentrPoi+(Ray+-+major)*nordi;
+ focs := CentrPoi-(Ray+-+major)*nordi;
+ elseif major=Ray:
+ focn := CentrPoi;
+ focs := CentrPoi;
+ fi;
+ auxa := plandi*cdotprod(PlanPoi-trypoi,plandi);
+ auxb := cyldi*cdotprod(trypoi-BaseCenter,cyldi)-trypoi+BaseCenter;
+ auxb := N(auxb)*(conorm(auxb)-Radius);
+ auxc := focn-trypoi;
+ auxd := focs-trypoi;
+ if major>Ray:
+ auxc := (N(auxc)+N(auxd))*(conorm(auxc)+conorm(auxd)-2*major);
+ else:
+ auxc := (N(auxc)+N(auxd))*(conorm(auxc)+conorm(auxd)-2*Ray);
+ fi;
+ trypoi := trypoi+factry*(auxa+auxb+auxc);
+ endfor;
+ ( trypoi )
+ endgroup
+ enddef;
+
+% The approximation of the intersection of a plane and two prolate spheroids
+
+ def necplusimprovertex( expr PlanPoi, PlanDir,
+ CentrPoiA, NorthPoleVecA, RayA,
+ CentrPoiB, NorthPoleVecB, RayB, IniV ) =
+ begingroup
+ save trypoi, auxa, auxb, auxc, auxd, plandi, factry, focni, focsi;
+ save norpoldi, norpoldj, maior, major, focnj, focsj, auxe;
+ color trypoi, auxa, auxb, auxc, auxd, plandi, focni, focsi, focnj, focsj;
+ color norpoldi, norpoldj, auxe;
+ numeric factry, maior, major;
+ trypoi = IniV;
+ factry = 0.25;
+ plandi = N(PlanDir);
+ norpoldi = N(NorthPoleVecA);
+ maior = conorm(NorthPoleVecA);
+ norpoldj = N(NorthPoleVecB);
+ major = conorm(NorthPoleVecB);
+ focni = CentrPoiA+(maior+-+RayA)*norpoldi;
+ focsi = CentrPoiA-(maior+-+RayA)*norpoldi;
+ focnj = CentrPoiB+(major+-+RayB)*norpoldj;
+ focsj = CentrPoiB-(major+-+RayB)*norpoldj;
+ for j=1 upto 50:
+ auxa := plandi*cdotprod(PlanPoi-trypoi,plandi);
+ auxb := focni-trypoi;
+ auxe := focsi-trypoi;
+ auxc := focnj-trypoi;
+ auxd := focsj-trypoi;
+ auxb := (N(auxb)+N(auxe))*(conorm(auxb)+conorm(auxe)-2*maior);
+ auxc := (N(auxc)+N(auxd))*(conorm(auxc)+conorm(auxd)-2*major);
+ trypoi := trypoi+factry*(auxa+auxb+auxc);
+ endfor;
+ ( trypoi )
+ endgroup
+ enddef;
+
+% The approximation of the intersection of a straight line and
+% one prolate spheroid
+
+ def intersectprolatespheroid( expr CentrPoi, NorthPoleVec, Ray,
+ LinePoi, LineDir ) =
+ begingroup
+ save trypoi, factry, linedi, norpol, focn, focs, maior, j;
+ save auxa, auxb, auxc, auxd;
+ color trypoi, linedi, norpol, focn, focs;
+ color auxa, auxb, auxc, auxd;
+ numeric factry, maior, j;
+ trypoi = LinePoi;
+ factry = 0.25;
+ linedi = N(LineDir);
+ norpol = N(NorthPoleVec);
+ maior = conorm(NorthPoleVec);
+ focn = CentrPoi+(maior+-+Ray)*norpol;
+ focs = CentrPoi-(maior+-+Ray)*norpol;
+ for j=1 upto 50:
+ auxb := focn-trypoi;
+ auxd := focs-trypoi;
+ auxa := (N(auxb)+N(auxd))*(conorm(auxb)+conorm(auxd)-2*maior);
+ auxc := linedi*cdotprod(auxa,linedi);
+ trypoi := trypoi+factry*auxc;
+ endfor;
+ ( trypoi )
+ endgroup
+ enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Part VI (strictly two-dimensional):
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Verify if a path is cyclic (written by Scott Pakin)
+
+ def is_cyclic expr cpath =
+ (point 0 of cpath = point (length cpath) of cpath)
+ enddef;
+
+% Produce the schematics of a spring.
+
+ def springpath( expr begp, endp, piturnum, piturnproj, spgfrac ) =
+ begingroup
+ boolean leftside;
+ numeric counter, springwidth;
+ pair stepdir, leftdir, rightdir, auxil, lastp, endvec;
+ path thespring;
+ leftside = true;
+ stepdir = spgfrac*(endp-begp)/piturnum;
+ endvec = (1-spgfrac)*(endp-begp)/2;
+ springwidth = piturnproj +-+ abs( stepdir );
+ auxil = ( -ypart stepdir, xpart stepdir );
+ leftdir = springwidth*unitvector( auxil );
+ auxil := ( ypart stepdir, -xpart stepdir );
+ rightdir = springwidth*unitvector( auxil );
+ leftdir := (stepdir + leftdir)/2;
+ rightdir := (stepdir + rightdir)/2;
+ lastp = begp+endvec;
+ thespring := begp--lastp;
+ for counter=1 upto piturnum:
+ if leftside:
+ auxil := lastp + leftdir;
+ else:
+ auxil := lastp + rightdir;
+ fi;
+ lastp := lastp + stepdir;
+ thespring := thespring--auxil--lastp;
+ leftside := not leftside;
+ endfor;
+ thespring := thespring--endp;
+ ( thespring )
+ endgroup
+ enddef;
+
+% Summarize a great length in a zig-zag frontier line
+
+ def zigzagfrontier( expr begp, endp, nzigs, dev, zthick, tthick, fthick, excol, incol ) =
+ begingroup
+ interim linecap := squared;
+ interim linejoin := mitered;
+ boolean leftside;
+ numeric counter, tmpval;
+ pair stepdir, leftdir, rightdir, auxil, lastp;
+ path thefrontier;
+ leftside = true;
+ stepdir = (endp-begp)/nzigs;
+ leftdir = unitvector( ( -ypart stepdir, xpart stepdir ) );
+ rightdir = unitvector( ( ypart stepdir, -xpart stepdir ) );
+ thefrontier = begp;
+ lastp = begp;
+ for counter=1 upto nzigs-1:
+ lastp := lastp + stepdir;
+ tmpval := zthick+normaldeviate*dev;
+ if leftside:
+ auxil := lastp + leftdir*tmpval;
+ else:
+ auxil := lastp + rightdir*tmpval;
+ fi;
+ thefrontier := thefrontier--auxil;
+ leftside := not leftside;
+ endfor;
+ thefrontier := thefrontier--endp;
+ draw
+ thefrontier withcolor excol withpen pencircle scaled tthick;
+ draw
+ thefrontier withcolor incol withpen pencircle scaled fthick;
+ ( thefrontier )
+ endgroup
+ enddef;
+
+% The name says it all.
+
+ def randomcirc( expr radi, stddev, numpois ) =
+ begingroup
+ numeric i, astep;
+ path ranc;
+ astep = 360/numpois;
+ ranc = (radi+stddev*normaldeviate)*dir(-180);
+ for i= -180+astep step astep until 180:
+ ranc := ranc--((radi+stddev*normaldeviate)*dir(i));
+ endfor;
+ ranc := ranc--cycle;
+ ( ranc )
+ endgroup
+ enddef;
+
+% Just label some 2D-place in a way similar to anglinen.
+
+ def labeln(expr S, Pos, RelPos) =
+ begingroup
+ if RelPos = 0:
+ label.rt( S, Pos );
+ elseif RelPos =1:
+ label.urt( S, Pos );
+ elseif RelPos =2:
+ label.top( S, Pos );
+ elseif RelPos =3:
+ label.ulft( S, Pos );
+ elseif RelPos =4:
+ label.lft( S, Pos );
+ elseif RelPos =5:
+ label.llft( S, Pos );
+ elseif RelPos =6:
+ label.bot( S, Pos );
+ elseif RelPos =7:
+ label.lrt( S, Pos );
+ else:
+ label( S, Pos );
+ fi
+ endgroup
+ enddef;
+
+% There must be a sort of planar cross-product. The z coordinate.
+
+ def paircrossprod(expr A, B) =
+ ( (xpart A)*(ypart B) - (xpart B)*(ypart A) )
+ enddef;
+
+% Just dot-label some 2D-place in a random way.
+
+ def dotlabelrand(expr S, Pos ) =
+ begingroup
+ save RelPos;
+ numeric RelPos;
+ RelPos = floor( uniformdeviate(9) );
+ if RelPos = 0:
+ dotlabel.rt( S, Pos );
+ elseif RelPos =1:
+ dotlabel.urt( S, Pos );
+ elseif RelPos =2:
+ dotlabel.top( S, Pos );
+ elseif RelPos =3:
+ dotlabel.ulft( S, Pos );
+ elseif RelPos =4:
+ dotlabel.lft( S, Pos );
+ elseif RelPos =5:
+ dotlabel.llft( S, Pos );
+ elseif RelPos =6:
+ dotlabel.bot( S, Pos );
+ elseif RelPos =7:
+ dotlabel.lrt( S, Pos );
+ else:
+ dotlabel( S, Pos );
+ fi
+ endgroup
+ enddef;
+
+ def radialcross( expr A, la, B, lb, GoUp) =
+ begingroup
+ numeric x, y, xa, xb, ya, yb, YM, YA, La, Lb;
+ numeric AA, BB, CC, auxil, na, nb, norm;
+ pair As, Bs, selectedpoint;
+ na = abs(A);
+ nb = abs(B);
+ norm := 0;
+ for t = na, nb, la, lb:
+ if norm < t:
+ norm := t;
+ fi;
+ endfor;
+ xa = xpart A/norm;
+ xb = xpart B/norm;
+ ya = ypart A/norm;
+ yb = ypart B/norm;
+ La = la/norm;
+ Lb = lb/norm;
+ if abs( ya - yb ) < 0.005 :
+ x := La**2 - Lb**2 + xb**2 - xa**2;
+ x := 0.5*x/( xb - xa );
+ auxil := La +-+ (xa-x);
+ As = ( x, ya + auxil );
+ Bs = ( x, ya - auxil );
+ else:
+ YM := (xb-xa)/(ya-yb);
+ YA := Lb**2 - La**2 + xa**2 - xb**2;
+ YA := 0.5*( YA - (ya-yb)**2 )/(ya-yb);
+ AA := 1 + YM**2;
+ BB := 2*( YM*YA - xa );
+ CC := xa**2 - La**2 + YA**2;
+ CC := sqrt( BB**2 - 4*AA*CC );
+ x := -0.5*( BB + CC )/AA;
+ y := YA + ya + YM*x;
+ Bs = ( x, y );
+ x := -0.5*( BB - CC )/AA;
+ y := YA + ya + YM*x;
+ As = ( x, y );
+ fi;
+ if ypart As > ypart Bs:
+ if GoUp:
+ selectedpoint = As;
+ else:
+ selectedpoint = Bs;
+ fi;
+ elseif ypart As = ypart Bs:
+ if xpart As > xpart Bs:
+ if GoUp:
+ selectedpoint = As;
+ else:
+ selectedpoint = Bs;
+ fi;
+ else:
+ if GoUp:
+ selectedpoint = Bs;
+ else:
+ selectedpoint = As;
+ fi;
+ fi;
+ else:
+ if GoUp:
+ selectedpoint = Bs;
+ else:
+ selectedpoint = As;
+ fi;
+ fi;
+ ( norm*selectedpoint )
+ endgroup
+ enddef;
+
+ def ropethread( expr Index ) =
+ begingroup
+ save aux;
+ numeric aux;
+ if Index > RopeColors:
+ aux = 0;
+ else:
+ aux = Index;
+ fi;
+ ( aux )
+ endgroup
+ enddef;
+
+ def ropepattern( expr BasePath, RopeWidth, Nturns ) =
+ begingroup
+ save indturns, nmoves, indthread, movelen, turnlen, totlen;
+ numeric indturns, nmoves, indthread, movelen, turnlen, totlen;
+ save lenpos, timar, steplen, indstep, startdownc, startupcol;
+ numeric lenpos, timar, steplen, startdownc, indstep;
+ save actuc, actdc, stepwidth;
+ numeric actuc, actdc, stepwidth, startupcol;
+ save p;
+ pair p[];
+ save actcolor;
+ color actcolor;
+ nmoves = 2*(RopeColors+1);
+ totlen = arclength BasePath;
+ turnlen = totlen/Nturns;
+ movelen = turnlen/nmoves;
+ steplen = movelen/2;
+ startdownc = 0;
+ startupcol = RopeColors;
+ stepwidth = RopeWidth/RopeColors;
+ for indturns=0 upto Nturns-1:
+ for indmove=0 upto nmoves-1:
+ for indstep=0 upto 3:
+ lenpos :=
+ indturns*turnlen+indmove*movelen+indstep*steplen;
+ timar := arctime lenpos of BasePath;
+ p[indstep] := direction timar of BasePath rotated 90;
+ p[indstep] := unitvector( p[indstep] );
+ p[indstep+4] := point timar of BasePath;
+ endfor;
+ actdc := startdownc;
+ for indthread=0 upto RopeColors:
+ p8 := p5-p1*(0.5*RopeWidth-(indthread-0.5)*stepwidth);
+ p9 := p4-p0*(0.5*RopeWidth-indthread*stepwidth);
+ p10:= p5-p1*(0.5*RopeWidth-(indthread+0.5)*stepwidth);
+ p11:= p6-p2*(0.5*RopeWidth-indthread*stepwidth);
+ actcolor := TableC[RopeColorSeq[actdc]];
+ fill p8--p9--p10--p11--cycle withcolor actcolor;
+ actdc := ropethread( incr( actdc ) );
+ endfor;
+ startdownc := ropethread( incr( startdownc ) );
+ actuc := startupcol;
+ p9 := p5+p1*0.5*(RopeWidth+stepwidth);
+ p10:= p6+p2*0.5*RopeWidth;
+ p11:= p7+p3*0.5*(RopeWidth+stepwidth);
+ actcolor := TableC[RopeColorSeq[actuc]];
+ fill p9--p10--p11--cycle withcolor actcolor;
+ actuc := ropethread( incr( actuc ) );
+ for indthread=0 upto RopeColors-1:
+ p8 := p6+p2*(0.5*RopeWidth-indthread*stepwidth);
+ p9 := p5+p1*(0.5*RopeWidth-(indthread+0.5)*stepwidth);
+ p10:= p6+p2*(0.5*RopeWidth-(indthread+1)*stepwidth);
+ p11:= p7+p3*(0.5*RopeWidth-(indthread+0.5)*stepwidth);
+ actcolor := TableC[RopeColorSeq[actuc]];
+ fill p8--p9--p10--p11--cycle withcolor actcolor;
+ actuc := ropethread( incr( actuc ) );
+ endfor;
+ p8 := p6-p2*0.5*RopeWidth;
+ p9 := p5-0.5*p1*(RopeWidth+stepwidth);
+ p11:= p7-0.5*p3*(RopeWidth+stepwidth);
+ actcolor := TableC[RopeColorSeq[actuc]];
+ fill p8--p9--p11--cycle withcolor actcolor;
+ startupcol := ropethread( incr( startupcol ) );
+ endfor;
+ endfor
+ endgroup
+ enddef;
+
+ def firsttangencypoint( expr Path, Point, ResolvN ) =
+ begingroup
+ save auxp, i, cutp, va, vb;
+ path auxp;
+ numeric i;
+ pair cutp, va, vb;
+ auxp =
+ hide( va := unitvector( point 0 of Path - Point );
+ vb := unitvector( direction 0 of Path ); )
+ ( paircrossprod( va, vb ), 0 )
+ for i=1/ResolvN step 1/ResolvN until length Path:
+ hide( va := unitvector( point i of Path - Point );
+ vb := unitvector( direction i of Path ); )
+ ...( paircrossprod( va, vb ), i )
+ endfor;
+ cutp = auxp intersectionpoint ( origin--( 0, length Path ) );
+ ( point ( ypart cutp ) of Path )
+ endgroup
+ enddef;
+
+% Shrink or swell a cyclic path without cusp points and without
+% coinciding pre and post control points.
+
+ def lasermachine( expr DefinedPath, Beam, CosLimit ) =
+ begingroup
+ save patlen, j;
+ save apoi, bpoi, cpoi, dpoi, epoi;
+ save apat, bpat, cpat, dpat, a, b, c;
+ save anew, bnew, cnew;
+ save aang, bang, cang, dang;
+ save newp, pairvector, cou, val;
+ numeric patlen, j;
+ pair apoi, bpoi, cpoi, dpoi, epoi;
+ pair apat, bpat, cpat, dpat, a, b, c;
+ pair anew, bnew, cnew, pairvector[];
+ numeric aang, bang, cang, dang, cou, val;
+ path newp;
+ patlen = length DefinedPath;
+ cou = 0;
+ for j=0 upto patlen-1:
+ apoi := precontrol j of DefinedPath;
+ bpoi := point j of DefinedPath;
+ cpoi := postcontrol j of DefinedPath;
+ dpoi := precontrol j+1 of DefinedPath;
+ epoi := point j+1 of DefinedPath;
+ apat := apoi-bpoi;
+ bpat := bpoi-cpoi;
+ cpat := cpoi-dpoi;
+ dpat := dpoi-epoi;
+ aang := angle( apat );
+ bang := angle( bpat );
+ cang := angle( cpat );
+ dang := angle( dpat );
+ val := cosd( 0.5*(aang-bang) );
+ bnew := cpoi+Beam*dir( 90+0.5*(bang+cang) )/cosd( 0.5*(bang-cang) );
+ cnew := dpoi+Beam*dir( 90+0.5*(cang+dang) )/cosd( 0.5*(cang-dang) );
+ if ( val > 0 ) and
+ ( val < CosLimit ) and
+ ( Beam*sind( 0.5*(aang-bang) ) < 0 ):
+
+ a := bpoi+Beam*dir(90+aang);
+ b := a+0.5*Beam*dir(aang); %%% DANGER %%%%%0.5%%%%%%%
+ %draw b withpen pencircle scaled 3pt withcolor green;
+ anew := bpoi+Beam*dir(90+bang);
+ c := anew-0.5*Beam*dir(bang); %%% DANGER %%0.5%%%%%%%
+ %draw c withpen pencircle scaled 3pt withcolor blue;
+ pairvector[3*cou] = a;
+ pairvector[3*cou+1] = b;
+ pairvector[3*cou+2] = c;
+ cou := incr(cou);
+ pairvector[3*cou] = anew;
+ pairvector[3*cou+1] = bnew;
+ pairvector[3*cou+2] = cnew;
+ cou := incr(cou);
+ else:
+ anew := bpoi+Beam*dir( 90+0.5*(aang+bang) )/val;
+ pairvector[3*cou] = anew;
+ pairvector[3*cou+1] = bnew;
+ pairvector[3*cou+2] = cnew;
+ cou := incr(cou);
+ fi;
+ endfor;
+ newp = for j=0 upto cou-1:
+ pairvector[3*j]..controls pairvector[3*j+1] and pairvector[3*j+2]..
+ endfor cycle;
+ ( newp )
+ endgroup
+ enddef;
+
+% Move the starting point of a cyclic path along that path
+
+ def startahead( expr DefinedPath, JumpTime ) =
+ begingroup
+ save patlen, j;
+ save apoi, bpoi, cpoi;
+ save newp;
+ numeric patlen, j;
+ pair apoi, bpoi, cpoi;
+ path newp;
+ patlen = length DefinedPath;
+ newp = for j=0 upto patlen-1:
+ hide(
+ apoi := point JumpTime+j of DefinedPath;
+ bpoi := postcontrol JumpTime+j of DefinedPath;
+ cpoi := precontrol JumpTime+j+1 of DefinedPath;
+ )
+ apoi..controls bpoi and cpoi..
+ endfor
+ cycle;
+ ( newp )
+ endgroup
+ enddef;
+
+% In order to use a "lasermachine" one needs a single full outline.
+% One may have two somewhat concentric cyclic paths intersecting in
+% several points.
+% The next routine may help but first the paths must be adapted with
+% "startahead" and/or "reverse" so that they both rotate in the same
+% direction and they start on consecutive "lobes" (hard to explain).
+% Now pay attention: given the direction of rotation (clockwise or
+% counter-clockwise) the SecondPath must start BEFORE the FirstPath.
+% And another problem: there must be at least four intersection points.
+% Very nasty routine. All because of finispoi...
+
+ def crossingline( expr FirstPath, SecondPath, TimeTolerance ) =
+ begingroup
+ save m;
+ save its, finispoi;
+ save increm, fo, ma, tmpp, mastarter;
+ numeric m;
+ pair its, finispoi;
+ path increm, fo, ma, tmpp, mastarter;
+ m = TimeTolerance;
+ fo = FirstPath;
+ ma = SecondPath;
+ its := fo intersectiontimes ma;
+ increm := subpath (m, (xpart its) - m ) of fo;
+ mastarter = subpath (m, (ypart its) - m ) of ma;
+ finispoi = reverse ma intersectionpoint reverse fo;
+
+ forever:
+
+ fo := subpath ( (xpart its)+m, length fo ) of fo;
+ ma := subpath ( (ypart its)+m, length ma ) of ma;
+ its := ma intersectiontimes fo;
+ tmpp := subpath ( m, (xpart its)-m ) of ma;
+ increm := increm...tmpp;
+
+ fo := subpath ( (ypart its)+m, length fo ) of fo;
+ ma := subpath ( (xpart its)+m, length ma ) of ma;
+ its := fo intersectiontimes ma;
+ tmpp := subpath ( m, (xpart its)-m ) of fo;
+ increm := increm...tmpp;
+
+ exitif abs( point (xpart its) of fo - finispoi ) < m;
+ endfor;
+
+ fo := subpath ( (xpart its)+m, length fo ) of fo;
+ ma := (subpath ( (ypart its)+m, (length ma)-m ) of ma)...mastarter;
+ its := ma intersectiontimes fo;
+ tmpp := subpath ( m, (xpart its)-m ) of ma;
+ increm := increm...tmpp;
+
+ tmpp := subpath ( (ypart its)+m, (length fo)-m ) of fo;
+ ( increm...tmpp...cycle )
+ endgroup
+ enddef;
+
+% Calculate path areas (contributed by Boguslaw Jackowski
+% to the metapost mailing list)
+
+ vardef segmentarea( expr Ps ) =
+ save xa, xb, xc, xd, ya, yb, yc, yd;
+ ( xa, 20ya ) = point 0 of Ps;
+ ( xb, 20yb ) = postcontrol 0 of Ps;
+ ( xc, 20yc ) = precontrol 1 of Ps;
+ ( xd, 20yd ) = point 1 of Ps;
+ ( xb - xa )*( 10ya + 6yb + 3yc + yd )
+ + ( xc - xb )*( 4ya + 6yb + 6yc + 4yd )
+ + ( xd - xc )*( ya + 3yb + 6yc + 10yd )
+ enddef;
+
+ vardef cyclicpatharea( expr P ) = % result = area of the interior
+ segmentarea(subpath (0,1) of P)
+ for t=1 upto length(P)-1: + segmentarea(subpath (t,t+1) of P) endfor
+ enddef;
+
+% Mark bidimensional angles (contributed by Palle Jørgensen
+% to the metapost mailing list)
+
+ vardef archangle@#( expr _p, _q, _s, archwidth ) text _t =
+ begingroup;
+ save _a, _b, _w, _arch, _halfangle, _label_origin;
+ ( _a, _b ) = _p intersectiontimes _q;
+ pair _w;
+ _w = whatever[
+ point _a of _p +
+ archwidth * unitvector direction _a of _p,
+ point _a of _p +
+ archwidth * unitvector direction _a of _p +
+ (ypart.direction _a of _p, -xpart.direction _a of _p)
+ ];
+ _w = whatever[point _b of _q, point _b of _q + direction _b of _q];
+ path _arch;
+ _arch = point _a of _p +
+ archwidth * unitvector direction _a of _p{
+ (if direction _a of _p dotprod unitvector direction _b of _q > 0:
+ 1
+ else:
+ -1
+ fi) *
+ ( _w - (point _a of _p + archwidth * unitvector direction _a of _p) )
+ }..point _b of _q +
+ archwidth * unitvector direction _b of _q;
+ draw _arch _t;
+ path _halfangle;
+ _halfangle = point _a of _p - 2*archwidth*
+ unitvector( direction _a of _p + direction _b of _q )--point _a of _p +
+ 2*archwidth*unitvector( direction _a of _p + direction _b of _q );
+ pair _label_origin;
+ _label_origin = _halfangle intersectionpoint _arch;
+ label@#( _s, _label_origin ) _t;
+ endgroup;
+enddef;
+
+% EOF
diff --git a/graphics/metapost/contrib/macros/featpost/png/38.1.png b/graphics/metapost/contrib/macros/featpost/png/38.1.png
new file mode 100644
index 0000000000..bd699b4eaf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/38.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/A131.1.png b/graphics/metapost/contrib/macros/featpost/png/A131.1.png
new file mode 100644
index 0000000000..346b217c2f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/A131.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/CAT.1.png b/graphics/metapost/contrib/macros/featpost/png/CAT.1.png
new file mode 100644
index 0000000000..d2f691d514
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/CAT.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/DebianSwirlsmallEdited.1.png b/graphics/metapost/contrib/macros/featpost/png/DebianSwirlsmallEdited.1.png
new file mode 100644
index 0000000000..f683e5d0ce
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/DebianSwirlsmallEdited.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/EBcrossed.1.png b/graphics/metapost/contrib/macros/featpost/png/EBcrossed.1.png
new file mode 100644
index 0000000000..45a7ccf857
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/EBcrossed.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/LED.1.png b/graphics/metapost/contrib/macros/featpost/png/LED.1.png
new file mode 100644
index 0000000000..e94c3060e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/LED.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/SlowDownNowBitmapScanned.1.png b/graphics/metapost/contrib/macros/featpost/png/SlowDownNowBitmapScanned.1.png
new file mode 100644
index 0000000000..651ca602c9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/SlowDownNowBitmapScanned.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/acmaglev.1.png b/graphics/metapost/contrib/macros/featpost/png/acmaglev.1.png
new file mode 100644
index 0000000000..21fa0d5029
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/acmaglev.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/acoplanv.1.png b/graphics/metapost/contrib/macros/featpost/png/acoplanv.1.png
new file mode 100644
index 0000000000..f8cb1d9c30
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/acoplanv.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ahoraesglobal.1.png b/graphics/metapost/contrib/macros/featpost/png/ahoraesglobal.1.png
new file mode 100644
index 0000000000..fffe7883e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ahoraesglobal.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/aledlogo.1.png b/graphics/metapost/contrib/macros/featpost/png/aledlogo.1.png
new file mode 100644
index 0000000000..79634c3bec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/aledlogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/aledlogo.2.png b/graphics/metapost/contrib/macros/featpost/png/aledlogo.2.png
new file mode 100644
index 0000000000..dd6b2c859f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/aledlogo.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/allgreatideas.1.png b/graphics/metapost/contrib/macros/featpost/png/allgreatideas.1.png
new file mode 100644
index 0000000000..918738a2d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/allgreatideas.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/anglinerigorouscircle.1.png b/graphics/metapost/contrib/macros/featpost/png/anglinerigorouscircle.1.png
new file mode 100644
index 0000000000..1e4b30cdcd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/anglinerigorouscircle.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/antimattermeteor.1.png b/graphics/metapost/contrib/macros/featpost/png/antimattermeteor.1.png
new file mode 100644
index 0000000000..e42f36ba87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/antimattermeteor.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/avalzero.1.png b/graphics/metapost/contrib/macros/featpost/png/avalzero.1.png
new file mode 100644
index 0000000000..be4282eb9b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/avalzero.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/avalzero.2.png b/graphics/metapost/contrib/macros/featpost/png/avalzero.2.png
new file mode 100644
index 0000000000..0aba9b9dfb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/avalzero.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/avalzero.3.png b/graphics/metapost/contrib/macros/featpost/png/avalzero.3.png
new file mode 100644
index 0000000000..6c307f073d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/avalzero.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/avalzero.4.png b/graphics/metapost/contrib/macros/featpost/png/avalzero.4.png
new file mode 100644
index 0000000000..eecdc630d3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/avalzero.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/badshreeyantra.1.png b/graphics/metapost/contrib/macros/featpost/png/badshreeyantra.1.png
new file mode 100644
index 0000000000..7f87b4d294
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/badshreeyantra.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/balllauncher.0.png b/graphics/metapost/contrib/macros/featpost/png/balllauncher.0.png
new file mode 100644
index 0000000000..42d65ead63
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/balllauncher.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/balllauncher.9.png b/graphics/metapost/contrib/macros/featpost/png/balllauncher.9.png
new file mode 100644
index 0000000000..30e63b6a7b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/balllauncher.9.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/bananadimmer.1.png b/graphics/metapost/contrib/macros/featpost/png/bananadimmer.1.png
new file mode 100644
index 0000000000..5e5d8b3d59
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/bananadimmer.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/beautiful00.1.png b/graphics/metapost/contrib/macros/featpost/png/beautiful00.1.png
new file mode 100644
index 0000000000..6a11008499
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/beautiful00.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/bichaepolicia.0.png b/graphics/metapost/contrib/macros/featpost/png/bichaepolicia.0.png
new file mode 100644
index 0000000000..5e0c9f1a8a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/bichaepolicia.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/brownellips.0.png b/graphics/metapost/contrib/macros/featpost/png/brownellips.0.png
new file mode 100644
index 0000000000..618e1cbebe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/brownellips.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/bstr.1.png b/graphics/metapost/contrib/macros/featpost/png/bstr.1.png
new file mode 100644
index 0000000000..4fb674766d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/bstr.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/bughunt.1.png b/graphics/metapost/contrib/macros/featpost/png/bughunt.1.png
new file mode 100644
index 0000000000..19190cded8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/bughunt.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/bughunt.2.png b/graphics/metapost/contrib/macros/featpost/png/bughunt.2.png
new file mode 100644
index 0000000000..f6eff7bd4a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/bughunt.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.1.png b/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.1.png
new file mode 100644
index 0000000000..35f6043aaa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.2.png b/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.2.png
new file mode 100644
index 0000000000..e64c270358
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/buildcyclebug.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/canschemes.1.png b/graphics/metapost/contrib/macros/featpost/png/canschemes.1.png
new file mode 100644
index 0000000000..af287a650e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/canschemes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/canschemes.2.png b/graphics/metapost/contrib/macros/featpost/png/canschemes.2.png
new file mode 100644
index 0000000000..56dbb8faa4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/canschemes.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/canschemes.3.png b/graphics/metapost/contrib/macros/featpost/png/canschemes.3.png
new file mode 100644
index 0000000000..e69a681941
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/canschemes.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.1.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.1.png
new file mode 100644
index 0000000000..1ce998db5d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.2.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.2.png
new file mode 100644
index 0000000000..b82b2b6e5f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.3.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.3.png
new file mode 100644
index 0000000000..48c5704bd3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.4.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.4.png
new file mode 100644
index 0000000000..885475bfa2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.5.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.5.png
new file mode 100644
index 0000000000..d0a0d17b94
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.6.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.6.png
new file mode 100644
index 0000000000..c390b4eea8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.7.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.7.png
new file mode 100644
index 0000000000..526f4bcadd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.8.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.8.png
new file mode 100644
index 0000000000..89b515cec8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.8.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cap29res.9.png b/graphics/metapost/contrib/macros/featpost/png/cap29res.9.png
new file mode 100644
index 0000000000..115da7dc16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cap29res.9.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/caratk3edit.1.png b/graphics/metapost/contrib/macros/featpost/png/caratk3edit.1.png
new file mode 100644
index 0000000000..58ba9a74ad
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/caratk3edit.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cartaxes.1.png b/graphics/metapost/contrib/macros/featpost/png/cartaxes.1.png
new file mode 100644
index 0000000000..b7bf0bc33f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cartaxes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cartaxes.2.png b/graphics/metapost/contrib/macros/featpost/png/cartaxes.2.png
new file mode 100644
index 0000000000..2c316c1e93
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cartaxes.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/casadopessoal.1.png b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.1.png
new file mode 100644
index 0000000000..e79c2b55b2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/casadopessoal.2.png b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.2.png
new file mode 100644
index 0000000000..0a29351865
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/casadopessoal.3.png b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.3.png
new file mode 100644
index 0000000000..9ad72e0f10
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/casadopessoal.4.png b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.4.png
new file mode 100644
index 0000000000..3c1585cd2e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/casadopessoal.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cellevolve.0.png b/graphics/metapost/contrib/macros/featpost/png/cellevolve.0.png
new file mode 100644
index 0000000000..d5ba2d317b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cellevolve.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cinemwork.1.png b/graphics/metapost/contrib/macros/featpost/png/cinemwork.1.png
new file mode 100644
index 0000000000..87c33495d9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cinemwork.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cinemwork.2.png b/graphics/metapost/contrib/macros/featpost/png/cinemwork.2.png
new file mode 100644
index 0000000000..544619cdaa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cinemwork.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/circlespeedprofile.1.png b/graphics/metapost/contrib/macros/featpost/png/circlespeedprofile.1.png
new file mode 100644
index 0000000000..3ed04af43e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/circlespeedprofile.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/closingbox.1.png b/graphics/metapost/contrib/macros/featpost/png/closingbox.1.png
new file mode 100644
index 0000000000..bfc7714363
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/closingbox.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cmykropes.1.png b/graphics/metapost/contrib/macros/featpost/png/cmykropes.1.png
new file mode 100644
index 0000000000..168bda6fbc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cmykropes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cone.1.png b/graphics/metapost/contrib/macros/featpost/png/cone.1.png
new file mode 100644
index 0000000000..66ef46cb8b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cone.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conegetready.1.png b/graphics/metapost/contrib/macros/featpost/png/conegetready.1.png
new file mode 100644
index 0000000000..06a644093e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conegetready.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conicurv.1.png b/graphics/metapost/contrib/macros/featpost/png/conicurv.1.png
new file mode 100644
index 0000000000..9610e2cbca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conicurv.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conoscopy.1.png b/graphics/metapost/contrib/macros/featpost/png/conoscopy.1.png
new file mode 100644
index 0000000000..a554e575c4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conoscopy.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conoscopy.2.png b/graphics/metapost/contrib/macros/featpost/png/conoscopy.2.png
new file mode 100644
index 0000000000..718eb740db
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conoscopy.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conoscopy.3.png b/graphics/metapost/contrib/macros/featpost/png/conoscopy.3.png
new file mode 100644
index 0000000000..914cdb5242
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conoscopy.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conoscopy.4.png b/graphics/metapost/contrib/macros/featpost/png/conoscopy.4.png
new file mode 100644
index 0000000000..f5b4e3cb90
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conoscopy.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/conoscopy.5.png b/graphics/metapost/contrib/macros/featpost/png/conoscopy.5.png
new file mode 100644
index 0000000000..5696b5ea88
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/conoscopy.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/convergingspirals.1.png b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.1.png
new file mode 100644
index 0000000000..79bd4ee1a7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/convergingspirals.2.png b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.2.png
new file mode 100644
index 0000000000..a4fb84e24b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/convergingspirals.3.png b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.3.png
new file mode 100644
index 0000000000..894c5535bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/convergingspirals.4.png b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.4.png
new file mode 100644
index 0000000000..bbe2853a48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/convergingspirals.5.png b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.5.png
new file mode 100644
index 0000000000..9592eab174
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/convergingspirals.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/crossingline.1.png b/graphics/metapost/contrib/macros/featpost/png/crossingline.1.png
new file mode 100644
index 0000000000..573bfd2693
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/crossingline.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/crossingline.2.png b/graphics/metapost/contrib/macros/featpost/png/crossingline.2.png
new file mode 100644
index 0000000000..c98c83792a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/crossingline.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/crossingline.3.png b/graphics/metapost/contrib/macros/featpost/png/crossingline.3.png
new file mode 100644
index 0000000000..2b21b65438
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/crossingline.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cruztuga.1.png b/graphics/metapost/contrib/macros/featpost/png/cruztuga.1.png
new file mode 100644
index 0000000000..a2b6009ba1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cruztuga.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicfacecentered.1.png b/graphics/metapost/contrib/macros/featpost/png/cubicfacecentered.1.png
new file mode 100644
index 0000000000..bc4b4325d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicfacecentered.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicfigures.1.png b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.1.png
new file mode 100644
index 0000000000..11fc4ac0df
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicfigures.2.png b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.2.png
new file mode 100644
index 0000000000..22ab2aa54c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicfigures.3.png b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.3.png
new file mode 100644
index 0000000000..e766e33bef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicfigures.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructurefcc.1.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructurefcc.1.png
new file mode 100644
index 0000000000..419b33ca86
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructurefcc.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.1.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.1.png
new file mode 100644
index 0000000000..eb4e437c9c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.2.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.2.png
new file mode 100644
index 0000000000..57cad6a305
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.3.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.3.png
new file mode 100644
index 0000000000..ab2725880c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.4.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.4.png
new file mode 100644
index 0000000000..0754c08739
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.5.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.5.png
new file mode 100644
index 0000000000..c9462840ca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cubicstructures.6.png b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.6.png
new file mode 100644
index 0000000000..ee78ba176e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cubicstructures.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cylimple.1.png b/graphics/metapost/contrib/macros/featpost/png/cylimple.1.png
new file mode 100644
index 0000000000..7d5f34c8c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cylimple.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/cylinderborders.1.png b/graphics/metapost/contrib/macros/featpost/png/cylinderborders.1.png
new file mode 100644
index 0000000000..bcd9a68e8d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/cylinderborders.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/daliasensor.1.png b/graphics/metapost/contrib/macros/featpost/png/daliasensor.1.png
new file mode 100644
index 0000000000..31621f25b0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/daliasensor.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/decorstatement.0.png b/graphics/metapost/contrib/macros/featpost/png/decorstatement.0.png
new file mode 100644
index 0000000000..344dbf09b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/decorstatement.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/defaultcmr.0.png b/graphics/metapost/contrib/macros/featpost/png/defaultcmr.0.png
new file mode 100644
index 0000000000..5b428fa19f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/defaultcmr.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/deperspective.1.png b/graphics/metapost/contrib/macros/featpost/png/deperspective.1.png
new file mode 100644
index 0000000000..3968376ca7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/deperspective.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/deperspective.2.png b/graphics/metapost/contrib/macros/featpost/png/deperspective.2.png
new file mode 100644
index 0000000000..954995dfd7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/deperspective.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/deperspective.3.png b/graphics/metapost/contrib/macros/featpost/png/deperspective.3.png
new file mode 100644
index 0000000000..a137e76445
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/deperspective.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/deperspective.4.png b/graphics/metapost/contrib/macros/featpost/png/deperspective.4.png
new file mode 100644
index 0000000000..9606619cc9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/deperspective.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/derivondatriang.1.png b/graphics/metapost/contrib/macros/featpost/png/derivondatriang.1.png
new file mode 100644
index 0000000000..7784ea9006
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/derivondatriang.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/diameters.1.png b/graphics/metapost/contrib/macros/featpost/png/diameters.1.png
new file mode 100644
index 0000000000..c81067699a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/diameters.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/directfonts.0.png b/graphics/metapost/contrib/macros/featpost/png/directfonts.0.png
new file mode 100644
index 0000000000..f72bcd58e4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/directfonts.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/doitnow.1.png b/graphics/metapost/contrib/macros/featpost/png/doitnow.1.png
new file mode 100644
index 0000000000..074b539ab4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/doitnow.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/downloadicon.1.png b/graphics/metapost/contrib/macros/featpost/png/downloadicon.1.png
new file mode 100644
index 0000000000..2a0f41725b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/downloadicon.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/dreamhouse.1.png b/graphics/metapost/contrib/macros/featpost/png/dreamhouse.1.png
new file mode 100644
index 0000000000..8083c8bdc0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/dreamhouse.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/dreamhouse.2.png b/graphics/metapost/contrib/macros/featpost/png/dreamhouse.2.png
new file mode 100644
index 0000000000..e59edd5963
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/dreamhouse.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/durgayantra.1.png b/graphics/metapost/contrib/macros/featpost/png/durgayantra.1.png
new file mode 100644
index 0000000000..37333aed64
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/durgayantra.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/durgayantra.2.png b/graphics/metapost/contrib/macros/featpost/png/durgayantra.2.png
new file mode 100644
index 0000000000..10789b985e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/durgayantra.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/eemcsblabla.1.png b/graphics/metapost/contrib/macros/featpost/png/eemcsblabla.1.png
new file mode 100644
index 0000000000..26e9407e59
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/eemcsblabla.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/electricpotential.0.png b/graphics/metapost/contrib/macros/featpost/png/electricpotential.0.png
new file mode 100644
index 0000000000..df99658cc3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/electricpotential.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/electricpotential.1.png b/graphics/metapost/contrib/macros/featpost/png/electricpotential.1.png
new file mode 100644
index 0000000000..b95170d28b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/electricpotential.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/electricpotential.2.png b/graphics/metapost/contrib/macros/featpost/png/electricpotential.2.png
new file mode 100644
index 0000000000..0fe7871222
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/electricpotential.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/electricpotential.3.png b/graphics/metapost/contrib/macros/featpost/png/electricpotential.3.png
new file mode 100644
index 0000000000..1c087f7604
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/electricpotential.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/electrospiral.1.png b/graphics/metapost/contrib/macros/featpost/png/electrospiral.1.png
new file mode 100644
index 0000000000..6a37801f29
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/electrospiral.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ellipticextrusionpress.1.png b/graphics/metapost/contrib/macros/featpost/png/ellipticextrusionpress.1.png
new file mode 100644
index 0000000000..b0c2c27e45
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ellipticextrusionpress.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ellipticprism.1.png b/graphics/metapost/contrib/macros/featpost/png/ellipticprism.1.png
new file mode 100644
index 0000000000..278817f73e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ellipticprism.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ellipticproperties.1.png b/graphics/metapost/contrib/macros/featpost/png/ellipticproperties.1.png
new file mode 100644
index 0000000000..badf98d72d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ellipticproperties.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/elliptictable.1.png b/graphics/metapost/contrib/macros/featpost/png/elliptictable.1.png
new file mode 100644
index 0000000000..c24febce13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/elliptictable.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ellipticthing.1.png b/graphics/metapost/contrib/macros/featpost/png/ellipticthing.1.png
new file mode 100644
index 0000000000..bbfbbf7fd4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ellipticthing.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/embroncordada.1.png b/graphics/metapost/contrib/macros/featpost/png/embroncordada.1.png
new file mode 100644
index 0000000000..b2943ff09b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/embroncordada.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/emptylines.1.png b/graphics/metapost/contrib/macros/featpost/png/emptylines.1.png
new file mode 100644
index 0000000000..809d468c8f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/emptylines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/equilatrianglelines.1.png b/graphics/metapost/contrib/macros/featpost/png/equilatrianglelines.1.png
new file mode 100644
index 0000000000..230d5e3a72
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/equilatrianglelines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/equilibriodetorques.1.png b/graphics/metapost/contrib/macros/featpost/png/equilibriodetorques.1.png
new file mode 100644
index 0000000000..dfb33ae3ca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/equilibriodetorques.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/esteveslogo.1.png b/graphics/metapost/contrib/macros/featpost/png/esteveslogo.1.png
new file mode 100644
index 0000000000..bcab3d4419
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/esteveslogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/experimental.1.png b/graphics/metapost/contrib/macros/featpost/png/experimental.1.png
new file mode 100644
index 0000000000..3936b5718d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/experimental.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/experimental2Dsetup.1.png b/graphics/metapost/contrib/macros/featpost/png/experimental2Dsetup.1.png
new file mode 100644
index 0000000000..6c06c9b93f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/experimental2Dsetup.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula03.1.png b/graphics/metapost/contrib/macros/featpost/png/f1aula03.1.png
new file mode 100644
index 0000000000..ce7db0b350
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula03.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula03.2.png b/graphics/metapost/contrib/macros/featpost/png/f1aula03.2.png
new file mode 100644
index 0000000000..9f823083f8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula03.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula03.3.png b/graphics/metapost/contrib/macros/featpost/png/f1aula03.3.png
new file mode 100644
index 0000000000..48e492545b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula03.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula03.4.png b/graphics/metapost/contrib/macros/featpost/png/f1aula03.4.png
new file mode 100644
index 0000000000..cb8c0ce927
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula03.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula05.1.png b/graphics/metapost/contrib/macros/featpost/png/f1aula05.1.png
new file mode 100644
index 0000000000..e675a75e24
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula05.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/f1aula05.2.png b/graphics/metapost/contrib/macros/featpost/png/f1aula05.2.png
new file mode 100644
index 0000000000..212c8d09d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/f1aula05.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fakehole.1.png b/graphics/metapost/contrib/macros/featpost/png/fakehole.1.png
new file mode 100644
index 0000000000..83ae187352
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fakehole.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fakehole.2.png b/graphics/metapost/contrib/macros/featpost/png/fakehole.2.png
new file mode 100644
index 0000000000..797c0bc855
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fakehole.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fallinthewind.1.png b/graphics/metapost/contrib/macros/featpost/png/fallinthewind.1.png
new file mode 100644
index 0000000000..a69f312b08
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fallinthewind.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/featpostlogo.1.png b/graphics/metapost/contrib/macros/featpost/png/featpostlogo.1.png
new file mode 100644
index 0000000000..536bee92de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/featpostlogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ffcbob.1.png b/graphics/metapost/contrib/macros/featpost/png/ffcbob.1.png
new file mode 100644
index 0000000000..c2515437e7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ffcbob.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlines.1.png b/graphics/metapost/contrib/macros/featpost/png/fieldlines.1.png
new file mode 100644
index 0000000000..ec4d6808dc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.1.png b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.1.png
new file mode 100644
index 0000000000..0084e26c56
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.2.png b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.2.png
new file mode 100644
index 0000000000..9005875ed6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnorma.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.1.png b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.1.png
new file mode 100644
index 0000000000..34e91e58a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.2.png b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.2.png
new file mode 100644
index 0000000000..9156804c13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaper.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaperwork.1.png b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaperwork.1.png
new file mode 100644
index 0000000000..a120096f6d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fieldlinesnormapaperwork.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis1prex.1.png b/graphics/metapost/contrib/macros/featpost/png/fis1prex.1.png
new file mode 100644
index 0000000000..adf04fdbfb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis1prex.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis1prex.2.png b/graphics/metapost/contrib/macros/featpost/png/fis1prex.2.png
new file mode 100644
index 0000000000..49060b6658
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis1prex.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis1prex.3.png b/graphics/metapost/contrib/macros/featpost/png/fis1prex.3.png
new file mode 100644
index 0000000000..44adde271e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis1prex.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.1.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.1.png
new file mode 100644
index 0000000000..4ec3a06dfd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.2.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.2.png
new file mode 100644
index 0000000000..6f9f2fb3af
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.3.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.3.png
new file mode 100644
index 0000000000..b90ffdc5d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.4.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.4.png
new file mode 100644
index 0000000000..33fcc06e13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.5.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.5.png
new file mode 100644
index 0000000000..69c98cbad9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.6.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.6.png
new file mode 100644
index 0000000000..631a0a400e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.7.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.7.png
new file mode 100644
index 0000000000..fe27d1e082
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.8.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.8.png
new file mode 100644
index 0000000000..44e2eb8763
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.8.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex.9.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex.9.png
new file mode 100644
index 0000000000..6a268b4b90
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex.9.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.1.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.1.png
new file mode 100644
index 0000000000..984e68ad8d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.2.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.2.png
new file mode 100644
index 0000000000..e2a077746d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.3.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.3.png
new file mode 100644
index 0000000000..1c94072b4f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.4.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.4.png
new file mode 100644
index 0000000000..3511c11a5b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.5.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.5.png
new file mode 100644
index 0000000000..e1e836d713
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.6.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.6.png
new file mode 100644
index 0000000000..09859f8ab4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.7.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.7.png
new file mode 100644
index 0000000000..2877ed41e6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prex7.8.png b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.8.png
new file mode 100644
index 0000000000..976fa23487
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prex7.8.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prey.1.png b/graphics/metapost/contrib/macros/featpost/png/fis3prey.1.png
new file mode 100644
index 0000000000..695baee4d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prey.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prey.2.png b/graphics/metapost/contrib/macros/featpost/png/fis3prey.2.png
new file mode 100644
index 0000000000..85b7204609
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prey.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/fis3prey.3.png b/graphics/metapost/contrib/macros/featpost/png/fis3prey.3.png
new file mode 100644
index 0000000000..6aecc7c90d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/fis3prey.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/frustum.1.png b/graphics/metapost/contrib/macros/featpost/png/frustum.1.png
new file mode 100644
index 0000000000..764d9cf1ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/frustum.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/galvanometro-inducao.1.png b/graphics/metapost/contrib/macros/featpost/png/galvanometro-inducao.1.png
new file mode 100644
index 0000000000..8411bd1eb2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/galvanometro-inducao.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/gausslawframe.1.png b/graphics/metapost/contrib/macros/featpost/png/gausslawframe.1.png
new file mode 100644
index 0000000000..e923f81b93
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/gausslawframe.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geombasic.1.png b/graphics/metapost/contrib/macros/featpost/png/geombasic.1.png
new file mode 100644
index 0000000000..d28a242bb3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geombasic.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geomcasq.1.png b/graphics/metapost/contrib/macros/featpost/png/geomcasq.1.png
new file mode 100644
index 0000000000..23ac48e596
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geomcasq.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geometricaverage.1.png b/graphics/metapost/contrib/macros/featpost/png/geometricaverage.1.png
new file mode 100644
index 0000000000..d20de4145a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geometricaverage.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geomfiguei.1.png b/graphics/metapost/contrib/macros/featpost/png/geomfiguei.1.png
new file mode 100644
index 0000000000..1507d4397c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geomfiguei.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geomfreder.1.png b/graphics/metapost/contrib/macros/featpost/png/geomfreder.1.png
new file mode 100644
index 0000000000..ad963d1fb3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geomfreder.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geommine.1.png b/graphics/metapost/contrib/macros/featpost/png/geommine.1.png
new file mode 100644
index 0000000000..7464ce3ddb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geommine.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/geomsrinath.1.png b/graphics/metapost/contrib/macros/featpost/png/geomsrinath.1.png
new file mode 100644
index 0000000000..d435f19184
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/geomsrinath.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/gnupost.1.png b/graphics/metapost/contrib/macros/featpost/png/gnupost.1.png
new file mode 100644
index 0000000000..77e69f88a9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/gnupost.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/gnupost3Dlogo.1.png b/graphics/metapost/contrib/macros/featpost/png/gnupost3Dlogo.1.png
new file mode 100644
index 0000000000..250b443808
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/gnupost3Dlogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/goldenellipse.1.png b/graphics/metapost/contrib/macros/featpost/png/goldenellipse.1.png
new file mode 100644
index 0000000000..a325930068
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/goldenellipse.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/graphene.1.png b/graphics/metapost/contrib/macros/featpost/png/graphene.1.png
new file mode 100644
index 0000000000..dc7eaa1a84
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/graphene.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/graphexample.1.png b/graphics/metapost/contrib/macros/featpost/png/graphexample.1.png
new file mode 100644
index 0000000000..a60b4fb5cb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/graphexample.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/graphs.1.png b/graphics/metapost/contrib/macros/featpost/png/graphs.1.png
new file mode 100644
index 0000000000..eecad3023d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/graphs.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/graphs.2.png b/graphics/metapost/contrib/macros/featpost/png/graphs.2.png
new file mode 100644
index 0000000000..0057bd1183
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/graphs.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/halfcirclesfear.1.png b/graphics/metapost/contrib/macros/featpost/png/halfcirclesfear.1.png
new file mode 100644
index 0000000000..5a608bdb34
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/halfcirclesfear.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hap.1.png b/graphics/metapost/contrib/macros/featpost/png/hap.1.png
new file mode 100644
index 0000000000..0af3e65eb2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hap.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/heatfromroom.1.png b/graphics/metapost/contrib/macros/featpost/png/heatfromroom.1.png
new file mode 100644
index 0000000000..31dd7693bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/heatfromroom.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/helix.1.png b/graphics/metapost/contrib/macros/featpost/png/helix.1.png
new file mode 100644
index 0000000000..15d2f46e60
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/helix.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hermitespliknot.1.png b/graphics/metapost/contrib/macros/featpost/png/hermitespliknot.1.png
new file mode 100644
index 0000000000..5e7b5971c0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hermitespliknot.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hexacylon.1.png b/graphics/metapost/contrib/macros/featpost/png/hexacylon.1.png
new file mode 100644
index 0000000000..1683d9accb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hexacylon.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.1.png b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.1.png
new file mode 100644
index 0000000000..4b987337ad
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.2.png b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.2.png
new file mode 100644
index 0000000000..8713f21454
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.3.png b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.3.png
new file mode 100644
index 0000000000..1fa59b5cc6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hexagonalgrid.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hexagonaltrimesh.1.png b/graphics/metapost/contrib/macros/featpost/png/hexagonaltrimesh.1.png
new file mode 100644
index 0000000000..f08d957a39
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hexagonaltrimesh.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hiddenlinegraph.1.png b/graphics/metapost/contrib/macros/featpost/png/hiddenlinegraph.1.png
new file mode 100644
index 0000000000..c59e19d16a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hiddenlinegraph.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hiddensurface.1.png b/graphics/metapost/contrib/macros/featpost/png/hiddensurface.1.png
new file mode 100644
index 0000000000..4b3c340deb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hiddensurface.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/hiddensurfaces.1.png b/graphics/metapost/contrib/macros/featpost/png/hiddensurfaces.1.png
new file mode 100644
index 0000000000..c31b884726
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/hiddensurfaces.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/iamsorrykarl.1.png b/graphics/metapost/contrib/macros/featpost/png/iamsorrykarl.1.png
new file mode 100644
index 0000000000..d6b5e28ac3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/iamsorrykarl.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/inductionbob.1.png b/graphics/metapost/contrib/macros/featpost/png/inductionbob.1.png
new file mode 100644
index 0000000000..f266816d81
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/inductionbob.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/integerbars.1.png b/graphics/metapost/contrib/macros/featpost/png/integerbars.1.png
new file mode 100644
index 0000000000..2fa27db9c8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/integerbars.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/integratorfigures.1.png b/graphics/metapost/contrib/macros/featpost/png/integratorfigures.1.png
new file mode 100644
index 0000000000..e06118fb5d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/integratorfigures.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/integratorfigures.2.png b/graphics/metapost/contrib/macros/featpost/png/integratorfigures.2.png
new file mode 100644
index 0000000000..8f51b88077
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/integratorfigures.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/interdigitrodes.1.png b/graphics/metapost/contrib/macros/featpost/png/interdigitrodes.1.png
new file mode 100644
index 0000000000..86882273af
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/interdigitrodes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/intersectorus.1.png b/graphics/metapost/contrib/macros/featpost/png/intersectorus.1.png
new file mode 100644
index 0000000000..f4068117b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/intersectorus.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/intersectprolatespheroid.1.png b/graphics/metapost/contrib/macros/featpost/png/intersectprolatespheroid.1.png
new file mode 100644
index 0000000000..aff7c8c7f1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/intersectprolatespheroid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/iplaca.1.png b/graphics/metapost/contrib/macros/featpost/png/iplaca.1.png
new file mode 100644
index 0000000000..72271da198
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/iplaca.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jd44.1.png b/graphics/metapost/contrib/macros/featpost/png/jd44.1.png
new file mode 100644
index 0000000000..5e5519bd32
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jd44.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jd44.2.png b/graphics/metapost/contrib/macros/featpost/png/jd44.2.png
new file mode 100644
index 0000000000..feb8f3e8cd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jd44.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jd44.3.png b/graphics/metapost/contrib/macros/featpost/png/jd44.3.png
new file mode 100644
index 0000000000..cbbd2fde20
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jd44.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jd44.4.png b/graphics/metapost/contrib/macros/featpost/png/jd44.4.png
new file mode 100644
index 0000000000..4b46d69704
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jd44.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jdbug.1.png b/graphics/metapost/contrib/macros/featpost/png/jdbug.1.png
new file mode 100644
index 0000000000..8cfd7f9a7e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jdbug.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/jdbug.2.png b/graphics/metapost/contrib/macros/featpost/png/jdbug.2.png
new file mode 100644
index 0000000000..3980d51686
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/jdbug.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/joinedemptylines.1.png b/graphics/metapost/contrib/macros/featpost/png/joinedemptylines.1.png
new file mode 100644
index 0000000000..b62b69e381
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/joinedemptylines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/keplernewtonfeynman.1.png b/graphics/metapost/contrib/macros/featpost/png/keplernewtonfeynman.1.png
new file mode 100644
index 0000000000..2f453f9a5a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/keplernewtonfeynman.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/kindofcube.1.png b/graphics/metapost/contrib/macros/featpost/png/kindofcube.1.png
new file mode 100644
index 0000000000..b959bf65cc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/kindofcube.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/kindofcube.2.png b/graphics/metapost/contrib/macros/featpost/png/kindofcube.2.png
new file mode 100644
index 0000000000..58b7747298
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/kindofcube.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/kindofcuber.1.png b/graphics/metapost/contrib/macros/featpost/png/kindofcuber.1.png
new file mode 100644
index 0000000000..17ec3ce210
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/kindofcuber.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/kopptrammel.1.png b/graphics/metapost/contrib/macros/featpost/png/kopptrammel.1.png
new file mode 100644
index 0000000000..7e1e522edd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/kopptrammel.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/labelconstruct.1.png b/graphics/metapost/contrib/macros/featpost/png/labelconstruct.1.png
new file mode 100644
index 0000000000..d5235a485e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/labelconstruct.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/labelinspace.1.png b/graphics/metapost/contrib/macros/featpost/png/labelinspace.1.png
new file mode 100644
index 0000000000..7c1e19886e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/labelinspace.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lamarquejaune.1.png b/graphics/metapost/contrib/macros/featpost/png/lamarquejaune.1.png
new file mode 100644
index 0000000000..8b55e59602
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lamarquejaune.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lasermachine.1.png b/graphics/metapost/contrib/macros/featpost/png/lasermachine.1.png
new file mode 100644
index 0000000000..3520225225
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lasermachine.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/latexboxes.0.png b/graphics/metapost/contrib/macros/featpost/png/latexboxes.0.png
new file mode 100644
index 0000000000..71479a3825
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/latexboxes.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/latexboxes.1.png b/graphics/metapost/contrib/macros/featpost/png/latexboxes.1.png
new file mode 100644
index 0000000000..d482251f48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/latexboxes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lawofcosines.1.png b/graphics/metapost/contrib/macros/featpost/png/lawofcosines.1.png
new file mode 100644
index 0000000000..2eec3c36ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lawofcosines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lawofcosines.2.png b/graphics/metapost/contrib/macros/featpost/png/lawofcosines.2.png
new file mode 100644
index 0000000000..5fba66c3a3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lawofcosines.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lcurvature.1.png b/graphics/metapost/contrib/macros/featpost/png/lcurvature.1.png
new file mode 100644
index 0000000000..b5422f0585
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lcurvature.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lcurvature.2.png b/graphics/metapost/contrib/macros/featpost/png/lcurvature.2.png
new file mode 100644
index 0000000000..0d0f1e273c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lcurvature.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ledlogo.1.png b/graphics/metapost/contrib/macros/featpost/png/ledlogo.1.png
new file mode 100644
index 0000000000..9576a7691e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ledlogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ledlogo.2.png b/graphics/metapost/contrib/macros/featpost/png/ledlogo.2.png
new file mode 100644
index 0000000000..9a4c5a2ea6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ledlogo.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ledlogo.3.png b/graphics/metapost/contrib/macros/featpost/png/ledlogo.3.png
new file mode 100644
index 0000000000..3a692490f5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ledlogo.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ledlogo.4.png b/graphics/metapost/contrib/macros/featpost/png/ledlogo.4.png
new file mode 100644
index 0000000000..1b54bdc418
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ledlogo.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.1.png b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.1.png
new file mode 100644
index 0000000000..e8444c4b87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.2.png b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.2.png
new file mode 100644
index 0000000000..4c0edfac9a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.3.png b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.3.png
new file mode 100644
index 0000000000..1ee3d8260a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.4.png b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.4.png
new file mode 100644
index 0000000000..f05511c80c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lgc2refractionEdited.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/loglogpaper.1.png b/graphics/metapost/contrib/macros/featpost/png/loglogpaper.1.png
new file mode 100644
index 0000000000..0bdac9c62e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/loglogpaper.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/logofontest.0.png b/graphics/metapost/contrib/macros/featpost/png/logofontest.0.png
new file mode 100644
index 0000000000..0c27c8ab3d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/logofontest.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/lowcostgreenhouse.1.png b/graphics/metapost/contrib/macros/featpost/png/lowcostgreenhouse.1.png
new file mode 100644
index 0000000000..19625c0477
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/lowcostgreenhouse.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/magneticflux.1.png b/graphics/metapost/contrib/macros/featpost/png/magneticflux.1.png
new file mode 100644
index 0000000000..4857ee8cce
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/magneticflux.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/magneticflux.2.png b/graphics/metapost/contrib/macros/featpost/png/magneticflux.2.png
new file mode 100644
index 0000000000..1b044b7598
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/magneticflux.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mainmemtest.1.png b/graphics/metapost/contrib/macros/featpost/png/mainmemtest.1.png
new file mode 100644
index 0000000000..63715719eb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mainmemtest.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/manjusha.1.png b/graphics/metapost/contrib/macros/featpost/png/manjusha.1.png
new file mode 100644
index 0000000000..c6f5fc7553
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/manjusha.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/manjusha.4.png b/graphics/metapost/contrib/macros/featpost/png/manjusha.4.png
new file mode 100644
index 0000000000..983239b8b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/manjusha.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/manjusha.6.png b/graphics/metapost/contrib/macros/featpost/png/manjusha.6.png
new file mode 100644
index 0000000000..59292550e9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/manjusha.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/matricskoc.1.png b/graphics/metapost/contrib/macros/featpost/png/matricskoc.1.png
new file mode 100644
index 0000000000..a2dbaaf0a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/matricskoc.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mce-lng.1.png b/graphics/metapost/contrib/macros/featpost/png/mce-lng.1.png
new file mode 100644
index 0000000000..1d3d512c21
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mce-lng.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/metalcharge.1.png b/graphics/metapost/contrib/macros/featpost/png/metalcharge.1.png
new file mode 100644
index 0000000000..e20d32ef88
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/metalcharge.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/micostufas.1.png b/graphics/metapost/contrib/macros/featpost/png/micostufas.1.png
new file mode 100644
index 0000000000..d91dce62dc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/micostufas.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/micromu.1.png b/graphics/metapost/contrib/macros/featpost/png/micromu.1.png
new file mode 100644
index 0000000000..a9533a6dba
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/micromu.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.1.png b/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.1.png
new file mode 100644
index 0000000000..f6a63fefcb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.2.png b/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.2.png
new file mode 100644
index 0000000000..f636834ec5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/milimetricpaper.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.0.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.0.png
new file mode 100644
index 0000000000..1217453552
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.1.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.1.png
new file mode 100644
index 0000000000..2a411e181c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.2.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.2.png
new file mode 100644
index 0000000000..cb8a757ef9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.3.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.3.png
new file mode 100644
index 0000000000..2025af4780
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.4.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.4.png
new file mode 100644
index 0000000000..65eb009652
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.5.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.5.png
new file mode 100644
index 0000000000..cfcfd2c6e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.6.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.6.png
new file mode 100644
index 0000000000..96d5f14db6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mpfields.7.png b/graphics/metapost/contrib/macros/featpost/png/mpfields.7.png
new file mode 100644
index 0000000000..8309bc2498
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mpfields.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mptoolcone.0.png b/graphics/metapost/contrib/macros/featpost/png/mptoolcone.0.png
new file mode 100644
index 0000000000..f7a756f697
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mptoolcone.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/muslimpattern.1.png b/graphics/metapost/contrib/macros/featpost/png/muslimpattern.1.png
new file mode 100644
index 0000000000..932b6752f4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/muslimpattern.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/muslimpattern.2.png b/graphics/metapost/contrib/macros/featpost/png/muslimpattern.2.png
new file mode 100644
index 0000000000..630ce8fde5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/muslimpattern.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mypatent.1.png b/graphics/metapost/contrib/macros/featpost/png/mypatent.1.png
new file mode 100644
index 0000000000..545e81f9fb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mypatent.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mypatent.2.png b/graphics/metapost/contrib/macros/featpost/png/mypatent.2.png
new file mode 100644
index 0000000000..d0a77d35e9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mypatent.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mypatent.3.png b/graphics/metapost/contrib/macros/featpost/png/mypatent.3.png
new file mode 100644
index 0000000000..74845fae66
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mypatent.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mypatent.4.png b/graphics/metapost/contrib/macros/featpost/png/mypatent.4.png
new file mode 100644
index 0000000000..886fd0c96e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mypatent.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mypatentpieces.1.png b/graphics/metapost/contrib/macros/featpost/png/mypatentpieces.1.png
new file mode 100644
index 0000000000..0c1115b5c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mypatentpieces.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/mysquaresectionbar.1.png b/graphics/metapost/contrib/macros/featpost/png/mysquaresectionbar.1.png
new file mode 100644
index 0000000000..311190db87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/mysquaresectionbar.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/naoestacionar.1.png b/graphics/metapost/contrib/macros/featpost/png/naoestacionar.1.png
new file mode 100644
index 0000000000..abf9df3ec9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/naoestacionar.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/naotocanacalote.1.png b/graphics/metapost/contrib/macros/featpost/png/naotocanacalote.1.png
new file mode 100644
index 0000000000..9bc4f00401
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/naotocanacalote.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nembends.1.png b/graphics/metapost/contrib/macros/featpost/png/nembends.1.png
new file mode 100644
index 0000000000..36621d9095
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nembends.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nembiaxi.1.png b/graphics/metapost/contrib/macros/featpost/png/nembiaxi.1.png
new file mode 100644
index 0000000000..2251083aca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nembiaxi.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nemdirector.1.png b/graphics/metapost/contrib/macros/featpost/png/nemdirector.1.png
new file mode 100644
index 0000000000..b457eee3da
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nemdirector.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nemquira.1.png b/graphics/metapost/contrib/macros/featpost/png/nemquira.1.png
new file mode 100644
index 0000000000..361251b9ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nemquira.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nemquirapitch.1.png b/graphics/metapost/contrib/macros/featpost/png/nemquirapitch.1.png
new file mode 100644
index 0000000000..0e5ccb314a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nemquirapitch.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nemsaddl.1.png b/graphics/metapost/contrib/macros/featpost/png/nemsaddl.1.png
new file mode 100644
index 0000000000..15288564c1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nemsaddl.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nemuniax.1.png b/graphics/metapost/contrib/macros/featpost/png/nemuniax.1.png
new file mode 100644
index 0000000000..c431f3d8ce
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nemuniax.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/newcommunism.1.png b/graphics/metapost/contrib/macros/featpost/png/newcommunism.1.png
new file mode 100644
index 0000000000..8a93d5c0ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/newcommunism.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/newcommunism.2.png b/graphics/metapost/contrib/macros/featpost/png/newcommunism.2.png
new file mode 100644
index 0000000000..c6d8ddcb2f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/newcommunism.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/newexperimental.1.png b/graphics/metapost/contrib/macros/featpost/png/newexperimental.1.png
new file mode 100644
index 0000000000..de4bf04299
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/newexperimental.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nosimples.1.png b/graphics/metapost/contrib/macros/featpost/png/nosimples.1.png
new file mode 100644
index 0000000000..ff601215ba
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nosimples.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nosuspension.0.png b/graphics/metapost/contrib/macros/featpost/png/nosuspension.0.png
new file mode 100644
index 0000000000..b13b79b6b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nosuspension.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nsmetica.1.png b/graphics/metapost/contrib/macros/featpost/png/nsmetica.1.png
new file mode 100644
index 0000000000..b82493bb31
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nsmetica.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.1.png b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.1.png
new file mode 100644
index 0000000000..13078cd9b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.2.png b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.2.png
new file mode 100644
index 0000000000..e025c2bd60
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.3.png b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.3.png
new file mode 100644
index 0000000000..2793b6df7e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.4.png b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.4.png
new file mode 100644
index 0000000000..015a21b95d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nulldefectanglexample.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/nurbstobeziern.0.png b/graphics/metapost/contrib/macros/featpost/png/nurbstobeziern.0.png
new file mode 100644
index 0000000000..f5776b24d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/nurbstobeziern.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/onebigword.1.png b/graphics/metapost/contrib/macros/featpost/png/onebigword.1.png
new file mode 100644
index 0000000000..c460019e34
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/onebigword.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/optest.1.png b/graphics/metapost/contrib/macros/featpost/png/optest.1.png
new file mode 100644
index 0000000000..9b73e93e0b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/optest.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/optest.2.png b/graphics/metapost/contrib/macros/featpost/png/optest.2.png
new file mode 100644
index 0000000000..80dcaaf063
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/optest.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/optica.1.png b/graphics/metapost/contrib/macros/featpost/png/optica.1.png
new file mode 100644
index 0000000000..c9be4c2387
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/optica.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.1.png b/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.1.png
new file mode 100644
index 0000000000..9777a8450c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.2.png b/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.2.png
new file mode 100644
index 0000000000..86e419047b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/par3Dplotexamples.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/parafuso.1.png b/graphics/metapost/contrib/macros/featpost/png/parafuso.1.png
new file mode 100644
index 0000000000..75fff05772
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/parafuso.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/parafuso.2.png b/graphics/metapost/contrib/macros/featpost/png/parafuso.2.png
new file mode 100644
index 0000000000..96916cb8e8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/parafuso.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/parafuso.3.png b/graphics/metapost/contrib/macros/featpost/png/parafuso.3.png
new file mode 100644
index 0000000000..481ae19c14
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/parafuso.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/parafuso.4.png b/graphics/metapost/contrib/macros/featpost/png/parafuso.4.png
new file mode 100644
index 0000000000..17137236f5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/parafuso.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/parafusoprojxy.1.png b/graphics/metapost/contrib/macros/featpost/png/parafusoprojxy.1.png
new file mode 100644
index 0000000000..c3e3b68de0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/parafusoprojxy.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/pathernon.0.png b/graphics/metapost/contrib/macros/featpost/png/pathernon.0.png
new file mode 100644
index 0000000000..0f4a0d700f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/pathernon.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/pathofstraightline.1.png b/graphics/metapost/contrib/macros/featpost/png/pathofstraightline.1.png
new file mode 100644
index 0000000000..b716c9c173
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/pathofstraightline.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/perspec.1.png b/graphics/metapost/contrib/macros/featpost/png/perspec.1.png
new file mode 100644
index 0000000000..85f38845d5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/perspec.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/photorefer.1.png b/graphics/metapost/contrib/macros/featpost/png/photorefer.1.png
new file mode 100644
index 0000000000..8e8743c4c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/photorefer.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/photorefer.2.png b/graphics/metapost/contrib/macros/featpost/png/photorefer.2.png
new file mode 100644
index 0000000000..861be0a0ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/photorefer.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/photoreverse.1.png b/graphics/metapost/contrib/macros/featpost/png/photoreverse.1.png
new file mode 100644
index 0000000000..39c2f46f16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/photoreverse.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/pifpaf.1.png b/graphics/metapost/contrib/macros/featpost/png/pifpaf.1.png
new file mode 100644
index 0000000000..d64871e61c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/pifpaf.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/pixelgrid.1.png b/graphics/metapost/contrib/macros/featpost/png/pixelgrid.1.png
new file mode 100644
index 0000000000..8ed27f15b2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/pixelgrid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/plaintangency.0.png b/graphics/metapost/contrib/macros/featpost/png/plaintangency.0.png
new file mode 100644
index 0000000000..e9ead491a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/plaintangency.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/plaintangency.1.png b/graphics/metapost/contrib/macros/featpost/png/plaintangency.1.png
new file mode 100644
index 0000000000..0eb66c830f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/plaintangency.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planintersection.1.png b/graphics/metapost/contrib/macros/featpost/png/planintersection.1.png
new file mode 100644
index 0000000000..58176a341d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planintersection.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.1.png b/graphics/metapost/contrib/macros/featpost/png/planpht.1.png
new file mode 100644
index 0000000000..d23e16657b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.2.png b/graphics/metapost/contrib/macros/featpost/png/planpht.2.png
new file mode 100644
index 0000000000..fe565d7e5a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.3.png b/graphics/metapost/contrib/macros/featpost/png/planpht.3.png
new file mode 100644
index 0000000000..dfee55d88b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.4.png b/graphics/metapost/contrib/macros/featpost/png/planpht.4.png
new file mode 100644
index 0000000000..78a3c8306f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.5.png b/graphics/metapost/contrib/macros/featpost/png/planpht.5.png
new file mode 100644
index 0000000000..cd7f789ad6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.6.png b/graphics/metapost/contrib/macros/featpost/png/planpht.6.png
new file mode 100644
index 0000000000..ca20172ef3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/planpht.7.png b/graphics/metapost/contrib/macros/featpost/png/planpht.7.png
new file mode 100644
index 0000000000..f6b9126189
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/planpht.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/polyhedr.1.png b/graphics/metapost/contrib/macros/featpost/png/polyhedr.1.png
new file mode 100644
index 0000000000..72f7338476
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/polyhedr.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/polyhedr.2.png b/graphics/metapost/contrib/macros/featpost/png/polyhedr.2.png
new file mode 100644
index 0000000000..a502a886bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/polyhedr.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/polyhedr.3.png b/graphics/metapost/contrib/macros/featpost/png/polyhedr.3.png
new file mode 100644
index 0000000000..d4c343a9bd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/polyhedr.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/positivecharge.1.png b/graphics/metapost/contrib/macros/featpost/png/positivecharge.1.png
new file mode 100644
index 0000000000..07ec875952
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/positivecharge.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/potenciadecicloeliptico.1.png b/graphics/metapost/contrib/macros/featpost/png/potenciadecicloeliptico.1.png
new file mode 100644
index 0000000000..732b04e8f9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/potenciadecicloeliptico.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/probtodooterr.1.png b/graphics/metapost/contrib/macros/featpost/png/probtodooterr.1.png
new file mode 100644
index 0000000000..a642ebc61f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/probtodooterr.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/profaux.1.png b/graphics/metapost/contrib/macros/featpost/png/profaux.1.png
new file mode 100644
index 0000000000..8c1dab6704
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/profaux.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/project.1.png b/graphics/metapost/contrib/macros/featpost/png/project.1.png
new file mode 100644
index 0000000000..01818150fd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/project.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/qap.1.png b/graphics/metapost/contrib/macros/featpost/png/qap.1.png
new file mode 100644
index 0000000000..b178d737c7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/qap.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/quartertorus.1.png b/graphics/metapost/contrib/macros/featpost/png/quartertorus.1.png
new file mode 100644
index 0000000000..65be479e62
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/quartertorus.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/quartertorus.2.png b/graphics/metapost/contrib/macros/featpost/png/quartertorus.2.png
new file mode 100644
index 0000000000..70d576eb27
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/quartertorus.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/radiativeforcing.0.png b/graphics/metapost/contrib/macros/featpost/png/radiativeforcing.0.png
new file mode 100644
index 0000000000..ab5a96f780
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/radiativeforcing.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.1.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.1.png
new file mode 100644
index 0000000000..a2a73cb0b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.2.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.2.png
new file mode 100644
index 0000000000..38dfc8dada
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.3.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.3.png
new file mode 100644
index 0000000000..a0812f477f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.4.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.4.png
new file mode 100644
index 0000000000..916789fcda
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.5.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.5.png
new file mode 100644
index 0000000000..5308faee66
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.6.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.6.png
new file mode 100644
index 0000000000..cbc6c04999
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.7.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.7.png
new file mode 100644
index 0000000000..6ea3bce249
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.8.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.8.png
new file mode 100644
index 0000000000..2cbc2b2d66
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.8.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.9.png b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.9.png
new file mode 100644
index 0000000000..24c7be6db1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/raiodoscirculos.9.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/redplanet.1.png b/graphics/metapost/contrib/macros/featpost/png/redplanet.1.png
new file mode 100644
index 0000000000..5807bf970b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/redplanet.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/reeditedgoodquestionmark.1.png b/graphics/metapost/contrib/macros/featpost/png/reeditedgoodquestionmark.1.png
new file mode 100644
index 0000000000..de4798a18b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/reeditedgoodquestionmark.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/resistcircuit.1.png b/graphics/metapost/contrib/macros/featpost/png/resistcircuit.1.png
new file mode 100644
index 0000000000..80ed3471da
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/resistcircuit.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/reuleaux.1.png b/graphics/metapost/contrib/macros/featpost/png/reuleaux.1.png
new file mode 100644
index 0000000000..92d8e3b4a6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/reuleaux.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/reuleaux.2.png b/graphics/metapost/contrib/macros/featpost/png/reuleaux.2.png
new file mode 100644
index 0000000000..36e03abf5a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/reuleaux.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolipsoid.1.png b/graphics/metapost/contrib/macros/featpost/png/revolipsoid.1.png
new file mode 100644
index 0000000000..effd789662
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolipsoid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolipsoid.2.png b/graphics/metapost/contrib/macros/featpost/png/revolipsoid.2.png
new file mode 100644
index 0000000000..946ce07d31
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolipsoid.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.1.png b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.1.png
new file mode 100644
index 0000000000..5b9fcdddb3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.2.png b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.2.png
new file mode 100644
index 0000000000..8cacf808ed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.3.png b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.3.png
new file mode 100644
index 0000000000..5563b252e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.4.png b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.4.png
new file mode 100644
index 0000000000..27c0fc4dce
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.5.png b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.5.png
new file mode 100644
index 0000000000..d6a7f1a3d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolutionparaboloid.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.1.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.1.png
new file mode 100644
index 0000000000..6cefc2e2af
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.2.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.2.png
new file mode 100644
index 0000000000..a237e16c82
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.3.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.3.png
new file mode 100644
index 0000000000..5d06395b76
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.4.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.4.png
new file mode 100644
index 0000000000..776cd933aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.5.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.5.png
new file mode 100644
index 0000000000..5d47ce7c89
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.6.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.6.png
new file mode 100644
index 0000000000..3c9b8823e8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/revolvers.7.png b/graphics/metapost/contrib/macros/featpost/png/revolvers.7.png
new file mode 100644
index 0000000000..224967877f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/revolvers.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorcubo.0.png b/graphics/metapost/contrib/macros/featpost/png/rigorcubo.0.png
new file mode 100644
index 0000000000..072cdc9163
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorcubo.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorouscircle.1.png b/graphics/metapost/contrib/macros/featpost/png/rigorouscircle.1.png
new file mode 100644
index 0000000000..8e5a6b5d30
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorouscircle.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorouscone.1.png b/graphics/metapost/contrib/macros/featpost/png/rigorouscone.1.png
new file mode 100644
index 0000000000..95efca01b7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorouscone.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorousdiscSD.1.png b/graphics/metapost/contrib/macros/featpost/png/rigorousdiscSD.1.png
new file mode 100644
index 0000000000..11d0bf40c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorousdiscSD.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorousdiscoptions.1.png b/graphics/metapost/contrib/macros/featpost/png/rigorousdiscoptions.1.png
new file mode 100644
index 0000000000..fa8733e4d8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorousdiscoptions.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rigorousfearpath.1.png b/graphics/metapost/contrib/macros/featpost/png/rigorousfearpath.1.png
new file mode 100644
index 0000000000..32e4d354d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rigorousfearpath.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rmnbob.1.png b/graphics/metapost/contrib/macros/featpost/png/rmnbob.1.png
new file mode 100644
index 0000000000..2999fc0ab5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rmnbob.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/roadincline.1.png b/graphics/metapost/contrib/macros/featpost/png/roadincline.1.png
new file mode 100644
index 0000000000..6bf43cbe2d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/roadincline.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rodarolaremplaninc.1.png b/graphics/metapost/contrib/macros/featpost/png/rodarolaremplaninc.1.png
new file mode 100644
index 0000000000..17716e42e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rodarolaremplaninc.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ropepatterns.1.png b/graphics/metapost/contrib/macros/featpost/png/ropepatterns.1.png
new file mode 100644
index 0000000000..a3c73a5445
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ropepatterns.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rosadosventos.1.png b/graphics/metapost/contrib/macros/featpost/png/rosadosventos.1.png
new file mode 100644
index 0000000000..1292c3134d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rosadosventos.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rotatnlc.1.png b/graphics/metapost/contrib/macros/featpost/png/rotatnlc.1.png
new file mode 100644
index 0000000000..e0fc1ba18e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rotatnlc.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rothexagrid.1.png b/graphics/metapost/contrib/macros/featpost/png/rothexagrid.1.png
new file mode 100644
index 0000000000..913e6781b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rothexagrid.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.1.png b/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.1.png
new file mode 100644
index 0000000000..96d5f14db6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.2.png b/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.2.png
new file mode 100644
index 0000000000..07b135bea8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/rungekuttasecond.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sal.1.png b/graphics/metapost/contrib/macros/featpost/png/sal.1.png
new file mode 100644
index 0000000000..352830ab8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sal.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sal.2.png b/graphics/metapost/contrib/macros/featpost/png/sal.2.png
new file mode 100644
index 0000000000..6c04576bb3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sal.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sap.1.png b/graphics/metapost/contrib/macros/featpost/png/sap.1.png
new file mode 100644
index 0000000000..bcb28df1db
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sap.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/saturn.1.png b/graphics/metapost/contrib/macros/featpost/png/saturn.1.png
new file mode 100644
index 0000000000..4945da7605
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/saturn.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sfearschem.1.png b/graphics/metapost/contrib/macros/featpost/png/sfearschem.1.png
new file mode 100644
index 0000000000..9f9fccb3ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sfearschem.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.1.png b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.1.png
new file mode 100644
index 0000000000..c87c096f8f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.2.png b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.2.png
new file mode 100644
index 0000000000..93b38e26e5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.3.png b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.3.png
new file mode 100644
index 0000000000..8616a26b96
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.4.png b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.4.png
new file mode 100644
index 0000000000..38535df71d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sharpraytrace.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/signalvertexSD.1.png b/graphics/metapost/contrib/macros/featpost/png/signalvertexSD.1.png
new file mode 100644
index 0000000000..6f5de73c09
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/signalvertexSD.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplecar.1.png b/graphics/metapost/contrib/macros/featpost/png/simplecar.1.png
new file mode 100644
index 0000000000..7a4bcaef5b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplecar.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplecarparam.1.png b/graphics/metapost/contrib/macros/featpost/png/simplecarparam.1.png
new file mode 100644
index 0000000000..3113916cdf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplecarparam.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.0.png b/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.0.png
new file mode 100644
index 0000000000..d6b92dd7aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.1.png b/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.1.png
new file mode 100644
index 0000000000..4a53aef84d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplecenterofmass.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplelens.1.png b/graphics/metapost/contrib/macros/featpost/png/simplelens.1.png
new file mode 100644
index 0000000000..2c1f54fc81
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplelens.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplependulum.1.png b/graphics/metapost/contrib/macros/featpost/png/simplependulum.1.png
new file mode 100644
index 0000000000..4e9d75901d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplependulum.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/simplexperiment.1.png b/graphics/metapost/contrib/macros/featpost/png/simplexperiment.1.png
new file mode 100644
index 0000000000..104806d8da
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/simplexperiment.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.1.png b/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.1.png
new file mode 100644
index 0000000000..2d6017fbf3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.2.png b/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.2.png
new file mode 100644
index 0000000000..9d3bdc8d07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sincityredesigned.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/slingshot.1.png b/graphics/metapost/contrib/macros/featpost/png/slingshot.1.png
new file mode 100644
index 0000000000..65d46c7021
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/slingshot.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/smC.1.png b/graphics/metapost/contrib/macros/featpost/png/smC.1.png
new file mode 100644
index 0000000000..f50dcdb9aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/smC.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/sniperlogo.1.png b/graphics/metapost/contrib/macros/featpost/png/sniperlogo.1.png
new file mode 100644
index 0000000000..2dd33feb54
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/sniperlogo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/solarconcentrator.1.png b/graphics/metapost/contrib/macros/featpost/png/solarconcentrator.1.png
new file mode 100644
index 0000000000..82731b260f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/solarconcentrator.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/solardish.1.png b/graphics/metapost/contrib/macros/featpost/png/solardish.1.png
new file mode 100644
index 0000000000..23456eb91f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/solardish.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/solardish.2.png b/graphics/metapost/contrib/macros/featpost/png/solardish.2.png
new file mode 100644
index 0000000000..e6f460e44e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/solardish.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/solardish.3.png b/graphics/metapost/contrib/macros/featpost/png/solardish.3.png
new file mode 100644
index 0000000000..54b5723695
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/solardish.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/solardish.4.png b/graphics/metapost/contrib/macros/featpost/png/solardish.4.png
new file mode 100644
index 0000000000..b9170f35c8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/solardish.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/some2Dvecs.1.png b/graphics/metapost/contrib/macros/featpost/png/some2Dvecs.1.png
new file mode 100644
index 0000000000..16d54a9d62
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/some2Dvecs.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/spaceinvader.1.png b/graphics/metapost/contrib/macros/featpost/png/spaceinvader.1.png
new file mode 100644
index 0000000000..38b7b54569
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/spaceinvader.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/spaceinvader.2.png b/graphics/metapost/contrib/macros/featpost/png/spaceinvader.2.png
new file mode 100644
index 0000000000..1c28bab16f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/spaceinvader.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/spatialhalfsfear.1.png b/graphics/metapost/contrib/macros/featpost/png/spatialhalfsfear.1.png
new file mode 100644
index 0000000000..381674ec91
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/spatialhalfsfear.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/spherample.1.png b/graphics/metapost/contrib/macros/featpost/png/spherample.1.png
new file mode 100644
index 0000000000..93fca44c8e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/spherample.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.0.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.0.png
new file mode 100644
index 0000000000..0c623a4c50
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.1.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.1.png
new file mode 100644
index 0000000000..6f8bbeeb97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.2.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.2.png
new file mode 100644
index 0000000000..8f9d8f1cfd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.3.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.3.png
new file mode 100644
index 0000000000..be274b6609
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.4.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.4.png
new file mode 100644
index 0000000000..c30c410b10
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspective.5.png b/graphics/metapost/contrib/macros/featpost/png/splineperspective.5.png
new file mode 100644
index 0000000000..98978b7af8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspective.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspectives.1.png b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.1.png
new file mode 100644
index 0000000000..cf52282f2b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspectives.2.png b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.2.png
new file mode 100644
index 0000000000..74f83099a6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/splineperspectives.3.png b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.3.png
new file mode 100644
index 0000000000..802b7d6e1b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/splineperspectives.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/spltwiben.1.png b/graphics/metapost/contrib/macros/featpost/png/spltwiben.1.png
new file mode 100644
index 0000000000..595513f4d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/spltwiben.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/squareanglines.1.png b/graphics/metapost/contrib/macros/featpost/png/squareanglines.1.png
new file mode 100644
index 0000000000..bd50593dd1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/squareanglines.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.1.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.1.png
new file mode 100644
index 0000000000..eae77d8884
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.2.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.2.png
new file mode 100644
index 0000000000..15e0d8ac16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.3.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.3.png
new file mode 100644
index 0000000000..a21b539154
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.5.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.5.png
new file mode 100644
index 0000000000..eadc3df16f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.6.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.6.png
new file mode 100644
index 0000000000..86db99d14f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.7.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.7.png
new file mode 100644
index 0000000000..26597b628f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.8.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.8.png
new file mode 100644
index 0000000000..39a09922d0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.8.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.9.png b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.9.png
new file mode 100644
index 0000000000..30da9fe9b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/srinathpolineni.9.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/stageforthree.1.png b/graphics/metapost/contrib/macros/featpost/png/stageforthree.1.png
new file mode 100644
index 0000000000..46e5b81c62
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/stageforthree.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/stageforthree.2.png b/graphics/metapost/contrib/macros/featpost/png/stageforthree.2.png
new file mode 100644
index 0000000000..d63889977c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/stageforthree.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/stageforthree.3.png b/graphics/metapost/contrib/macros/featpost/png/stageforthree.3.png
new file mode 100644
index 0000000000..03446d9473
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/stageforthree.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/statement.1.png b/graphics/metapost/contrib/macros/featpost/png/statement.1.png
new file mode 100644
index 0000000000..b4e36b3126
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/statement.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/statement.2.png b/graphics/metapost/contrib/macros/featpost/png/statement.2.png
new file mode 100644
index 0000000000..64fb632dea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/statement.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/statethreelines.0.png b/graphics/metapost/contrib/macros/featpost/png/statethreelines.0.png
new file mode 100644
index 0000000000..11db56ce20
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/statethreelines.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/steamcamera.0.png b/graphics/metapost/contrib/macros/featpost/png/steamcamera.0.png
new file mode 100644
index 0000000000..f6ca1cdb8e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/steamcamera.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/strength1defect.1.png b/graphics/metapost/contrib/macros/featpost/png/strength1defect.1.png
new file mode 100644
index 0000000000..b45a4a14db
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/strength1defect.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/symbol.1.png b/graphics/metapost/contrib/macros/featpost/png/symbol.1.png
new file mode 100644
index 0000000000..d5e90bbe8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/symbol.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tangency2D.1.png b/graphics/metapost/contrib/macros/featpost/png/tangency2D.1.png
new file mode 100644
index 0000000000..0beb894c1f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tangency2D.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tangencypoint.1.png b/graphics/metapost/contrib/macros/featpost/png/tangencypoint.1.png
new file mode 100644
index 0000000000..e9ead491a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tangencypoint.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tdarrow.1.png b/graphics/metapost/contrib/macros/featpost/png/tdarrow.1.png
new file mode 100644
index 0000000000..46ee84d49c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tdarrow.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tdcircarrow.1.png b/graphics/metapost/contrib/macros/featpost/png/tdcircarrow.1.png
new file mode 100644
index 0000000000..608e02059b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tdcircarrow.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/telemira.1.png b/graphics/metapost/contrib/macros/featpost/png/telemira.1.png
new file mode 100644
index 0000000000..50ed3f14c0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/telemira.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/telheiro.1.png b/graphics/metapost/contrib/macros/featpost/png/telheiro.1.png
new file mode 100644
index 0000000000..71c7df7791
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/telheiro.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/telheiro.2.png b/graphics/metapost/contrib/macros/featpost/png/telheiro.2.png
new file mode 100644
index 0000000000..16430fc68b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/telheiro.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tete.1.png b/graphics/metapost/contrib/macros/featpost/png/tete.1.png
new file mode 100644
index 0000000000..4dd23ee776
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tete.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tetrapodes.1.png b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.1.png
new file mode 100644
index 0000000000..93a6dd190f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tetrapodes.2.png b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.2.png
new file mode 100644
index 0000000000..137f959f47
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tetrapodes.3.png b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.3.png
new file mode 100644
index 0000000000..c59d5361e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tetrapodes.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/theHURD.1.png b/graphics/metapost/contrib/macros/featpost/png/theHURD.1.png
new file mode 100644
index 0000000000..940608ccca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/theHURD.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/thearchicon.1.png b/graphics/metapost/contrib/macros/featpost/png/thearchicon.1.png
new file mode 100644
index 0000000000..48b7de294d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/thearchicon.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.1.png b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.1.png
new file mode 100644
index 0000000000..f1d6813694
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.2.png b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.2.png
new file mode 100644
index 0000000000..71966aca0b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.3.png b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.3.png
new file mode 100644
index 0000000000..533f634b3b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/thethreekindsofperspec.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/thunderproblem.1.png b/graphics/metapost/contrib/macros/featpost/png/thunderproblem.1.png
new file mode 100644
index 0000000000..a2c6ef5025
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/thunderproblem.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tiposdetrans.1.png b/graphics/metapost/contrib/macros/featpost/png/tiposdetrans.1.png
new file mode 100644
index 0000000000..d84c3ca58e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tiposdetrans.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tiposdetransb.1.png b/graphics/metapost/contrib/macros/featpost/png/tiposdetransb.1.png
new file mode 100644
index 0000000000..808c5358d0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tiposdetransb.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tiposdetranst.1.png b/graphics/metapost/contrib/macros/featpost/png/tiposdetranst.1.png
new file mode 100644
index 0000000000..41426ee790
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tiposdetranst.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/toro4transit.1.png b/graphics/metapost/contrib/macros/featpost/png/toro4transit.1.png
new file mode 100644
index 0000000000..23132cd0fe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/toro4transit.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.1.png b/graphics/metapost/contrib/macros/featpost/png/torus.1.png
new file mode 100644
index 0000000000..9a8ef97047
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.2.png b/graphics/metapost/contrib/macros/featpost/png/torus.2.png
new file mode 100644
index 0000000000..c763732758
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.3.png b/graphics/metapost/contrib/macros/featpost/png/torus.3.png
new file mode 100644
index 0000000000..08d735ebbf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.4.png b/graphics/metapost/contrib/macros/featpost/png/torus.4.png
new file mode 100644
index 0000000000..db18539a9c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.4.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.5.png b/graphics/metapost/contrib/macros/featpost/png/torus.5.png
new file mode 100644
index 0000000000..bca6bb91c9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.5.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.6.png b/graphics/metapost/contrib/macros/featpost/png/torus.6.png
new file mode 100644
index 0000000000..506f10fd14
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.6.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torus.7.png b/graphics/metapost/contrib/macros/featpost/png/torus.7.png
new file mode 100644
index 0000000000..1068dda55b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torus.7.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torusexperiment.1.png b/graphics/metapost/contrib/macros/featpost/png/torusexperiment.1.png
new file mode 100644
index 0000000000..0772d20e91
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torusexperiment.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/torusexperiment.2.png b/graphics/metapost/contrib/macros/featpost/png/torusexperiment.2.png
new file mode 100644
index 0000000000..5b6338bc6e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/torusexperiment.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trajectoryline.1.png b/graphics/metapost/contrib/macros/featpost/png/trajectoryline.1.png
new file mode 100644
index 0000000000..2c07db0907
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trajectoryline.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trajectoryline.2.png b/graphics/metapost/contrib/macros/featpost/png/trajectoryline.2.png
new file mode 100644
index 0000000000..25ace08499
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trajectoryline.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trebuchet.1.png b/graphics/metapost/contrib/macros/featpost/png/trebuchet.1.png
new file mode 100644
index 0000000000..0481f53cb4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trebuchet.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/treecarbonedited.0.png b/graphics/metapost/contrib/macros/featpost/png/treecarbonedited.0.png
new file mode 100644
index 0000000000..a8dce1e607
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/treecarbonedited.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trianglecenterofmass.1.png b/graphics/metapost/contrib/macros/featpost/png/trianglecenterofmass.1.png
new file mode 100644
index 0000000000..8e87ac240b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trianglecenterofmass.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/triangulartrimesh.1.png b/graphics/metapost/contrib/macros/featpost/png/triangulartrimesh.1.png
new file mode 100644
index 0000000000..54c072c8a0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/triangulartrimesh.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trig.1.png b/graphics/metapost/contrib/macros/featpost/png/trig.1.png
new file mode 100644
index 0000000000..e01e0819b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trig.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/trigonometry.1.png b/graphics/metapost/contrib/macros/featpost/png/trigonometry.1.png
new file mode 100644
index 0000000000..df41d9dbdb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/trigonometry.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/troncoconedef.0.png b/graphics/metapost/contrib/macros/featpost/png/troncoconedef.0.png
new file mode 100644
index 0000000000..863de9263c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/troncoconedef.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.1.png b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.1.png
new file mode 100644
index 0000000000..28797b6cea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.2.png b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.2.png
new file mode 100644
index 0000000000..26b8b32948
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.3.png b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.3.png
new file mode 100644
index 0000000000..3ca215b22a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tropicalglobe.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/troysfear.1.png b/graphics/metapost/contrib/macros/featpost/png/troysfear.1.png
new file mode 100644
index 0000000000..ee85dbca5a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/troysfear.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tshirtfig.1.png b/graphics/metapost/contrib/macros/featpost/png/tshirtfig.1.png
new file mode 100644
index 0000000000..bb32adbe79
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tshirtfig.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/tuftescatter.1.png b/graphics/metapost/contrib/macros/featpost/png/tuftescatter.1.png
new file mode 100644
index 0000000000..4cc7e22a6d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/tuftescatter.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twistflat.1.png b/graphics/metapost/contrib/macros/featpost/png/twistflat.1.png
new file mode 100644
index 0000000000..093100b5f0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twistflat.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twistnlc.1.png b/graphics/metapost/contrib/macros/featpost/png/twistnlc.1.png
new file mode 100644
index 0000000000..0a0428a475
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twistnlc.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twistroundbiax.1.png b/graphics/metapost/contrib/macros/featpost/png/twistroundbiax.1.png
new file mode 100644
index 0000000000..e6ec7e710c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twistroundbiax.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twoDcolision.1.png b/graphics/metapost/contrib/macros/featpost/png/twoDcolision.1.png
new file mode 100644
index 0000000000..09125505c2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twoDcolision.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twocyclestogether.1.png b/graphics/metapost/contrib/macros/featpost/png/twocyclestogether.1.png
new file mode 100644
index 0000000000..9cff197695
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twocyclestogether.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twoholes.1.png b/graphics/metapost/contrib/macros/featpost/png/twoholes.1.png
new file mode 100644
index 0000000000..f780f6ab32
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twoholes.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twoplustwo.1.png b/graphics/metapost/contrib/macros/featpost/png/twoplustwo.1.png
new file mode 100644
index 0000000000..7a54fcc436
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twoplustwo.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twosolarpanels.1.png b/graphics/metapost/contrib/macros/featpost/png/twosolarpanels.1.png
new file mode 100644
index 0000000000..1aa2561422
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twosolarpanels.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/twoupcones.1.png b/graphics/metapost/contrib/macros/featpost/png/twoupcones.1.png
new file mode 100644
index 0000000000..d756127c12
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/twoupcones.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ubhtransients.0.png b/graphics/metapost/contrib/macros/featpost/png/ubhtransients.0.png
new file mode 100644
index 0000000000..2b46229c1f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ubhtransients.0.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ultraeye.1.png b/graphics/metapost/contrib/macros/featpost/png/ultraeye.1.png
new file mode 100644
index 0000000000..e05140a816
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ultraeye.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.1.png b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.1.png
new file mode 100644
index 0000000000..54e139debd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.2.png b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.2.png
new file mode 100644
index 0000000000..a7c7c9f8a8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.3.png b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.3.png
new file mode 100644
index 0000000000..a44f6a75a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/ultraimprovertex.3.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/unperfection.1.png b/graphics/metapost/contrib/macros/featpost/png/unperfection.1.png
new file mode 100644
index 0000000000..6913a7d08b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/unperfection.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/unperfectionremoved.1.png b/graphics/metapost/contrib/macros/featpost/png/unperfectionremoved.1.png
new file mode 100644
index 0000000000..2aac7c14ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/unperfectionremoved.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.1.png b/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.1.png
new file mode 100644
index 0000000000..82fdb62400
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.2.png b/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.2.png
new file mode 100644
index 0000000000..decbd869cf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/vanallenbelt.2.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/verygoodcone.1.png b/graphics/metapost/contrib/macros/featpost/png/verygoodcone.1.png
new file mode 100644
index 0000000000..2f1ecd6136
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/verygoodcone.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/wwfpmp.1.png b/graphics/metapost/contrib/macros/featpost/png/wwfpmp.1.png
new file mode 100644
index 0000000000..f3c31c8087
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/wwfpmp.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/xcmplaca2buraquads.1.png b/graphics/metapost/contrib/macros/featpost/png/xcmplaca2buraquads.1.png
new file mode 100644
index 0000000000..bf23daad09
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/xcmplaca2buraquads.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/featpost/png/xraycamera.1.png b/graphics/metapost/contrib/macros/featpost/png/xraycamera.1.png
new file mode 100644
index 0000000000..51dbbadd78
--- /dev/null
+++ b/graphics/metapost/contrib/macros/featpost/png/xraycamera.1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/fiziko/README b/graphics/metapost/contrib/macros/fiziko/README
new file mode 100644
index 0000000000..8eda66ae7e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/fiziko/README
@@ -0,0 +1,19 @@
+Name: fiziko
+Version: 0.1.3
+License: GNU GPLv3 or later
+Author: Sergey Slyusarev
+Repository: https://github.com/jemmybutton/fiziko
+
+Description:
+This MetaPost library was initially written to automate
+some elements of black and white illustrations for a physics
+textbook. It provides functions to draw things like lines
+of variable width, shaded spheres and tubes of different kinds,
+which can be used to produce images of a variety of objects.
+The library also contains functions to draw some objects
+constructed from these primitives.
+
+Contents:
+fiziko.mp — the library itself
+fiziko.tex — documentation source
+fiziko.pdf — documentation pdf
diff --git a/graphics/metapost/contrib/macros/fiziko/fiziko.mp b/graphics/metapost/contrib/macros/fiziko/fiziko.mp
new file mode 100644
index 0000000000..cf134b0fed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/fiziko/fiziko.mp
@@ -0,0 +1,2163 @@
+% fiziko 0.1.3
+% MetaPost library for physics textbook illustrations
+% Copyright 2019 Sergey Slyusarev
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+% https://github.com/jemmybutton/fiziko
+
+%
+% Here we define some things of general interest
+%
+
+pi := 3.1415926;
+radian := 180/pi;
+
+vardef sin primary x = (sind(x*radian)) enddef;
+
+vardef cos primary x = (cosd(x*radian)) enddef;
+
+vardef log (expr n, b) =
+ save rv;
+ numeric rv;
+ if n > 0:
+ rv := (mlog(n)/mlog(b));
+ else:
+ rv := 0;
+ fi;
+ rv
+enddef;
+
+vardef arcsind primary x = angle((1+-+x,x)) enddef;
+
+vardef arccosd primary x = angle((x,1+-+x)) enddef;
+
+vardef arcsin primary x = ((arcsind(x))/radian) enddef;
+
+vardef arccos primary x = ((arccosd(x))/radian) enddef;
+
+vardef angleRad primary x = angle(x)/radian enddef;
+
+vardef dirRad primary x = dir(x*radian) enddef;
+
+% used here and there.
+
+vardef sign (expr x)=
+ if x > 0: 1 fi
+ if x < 0: -1 fi
+ if x = 0: 1 fi
+enddef;
+
+% This is inverted `clip`
+
+primarydef i maskedWith p =
+begingroup
+ save q, invertedmask, resultimage;
+ pair q[];
+ path invertedmask;
+ picture resultimage;
+ resultimage := i;
+ q1 := ulcorner(i) shifted (-1, 1);
+ q3 := lrcorner(i) shifted (1, -1);
+ q2 := (xpart(q3), ypart(q1));
+ q4 := (xpart(q1), ypart(q3));
+ bp := ypart((ulcorner(p)--llcorner(p)) firstIntersectionTimes p);
+ invertedmask := (subpath (bp, length(p) + bp) of p) -- q1 -- q2 -- q3 -- q4 -- q1 -- cycle;
+ clip resultimage to invertedmask;
+ resultimage
+endgroup
+enddef;
+
+%
+% Since metapost is somewhat unpredictable in determining where paths intersect, here's macro
+% that returns first intersection times with first path (ray) priority.
+% Actually, it is so in most cases, but sometimes second path can take precedence,
+% so the macro just checks whether reversing 'q' changes something
+%
+
+primarydef p firstIntersectionTimes q =
+begingroup
+ save t;
+ pair t[];
+ t1 := p intersectiontimes q;
+ t2 := p intersectiontimes reverse(q);
+ if xpart(t1) < xpart(t2):
+ t3 := t1;
+ else:
+ t3 := (xpart(t2), length(q) - ypart(t2));
+ fi;
+ if xpart(t1) < 0: t3 := t2; fi;
+ t3
+endgroup
+enddef;
+
+% This checks if point a is inside of closed path p
+
+primarydef a isInside p =
+begingroup
+ save ang, v, i, rv, pp;
+ boolean rv;
+ pair pp[];
+ ang := 0;
+ for i := 0 step 1/4 until (length(p)):
+ pp1 := (point i of p) - a;
+ pp2 := (point i + 1/4 of p) - a;
+ if (pp1 <> (0, 0)) and (pp2 <> (0, 0)):
+ v := angle(pp1) - angle(pp2);
+ if v > 180: v := v - 360; fi; if v < -180: v := v + 360; fi;
+ ang := ang + v;
+ fi;
+ endfor;
+ if abs(ang) > 355:
+ rv := true;
+ else:
+ rv := false;
+ fi;
+ rv
+endgroup
+enddef;
+
+%
+% sometimes it's useful to put some arrows along the path. this macro puts them
+% in the middles of the segments that have length no less than midArrowLimit;
+%
+
+midArrowLimit := 1cm;
+
+def drawmidarrow (expr p) text t =
+begingroup
+ save i, j, q;
+ path q;
+ j := 0;
+ for i := 1 upto length(p):
+ if arclength(subpath(i-1, i) of p) >= midArrowLimit:
+ q := subpath(j, i - 1/2) of p;
+ j := i - 1/2;
+ draw q t;
+ filldraw arrowhead q t;
+ fi;
+ endfor;
+ draw subpath(j, length(p)) of p t;
+endgroup
+enddef;
+
+% This macro marks angles, unsurprisingly
+
+def markAngle (expr a, o, b) (text t) =
+begingroup
+ save p, an, d;
+ numeric an[], d[];
+ pair p;
+ an1 := angle(a-o);
+ an2 := angle(b-o) - an1;
+ if (an2 < 0): an2 := an2 + 360; fi;
+ an3 := an1 + 1/2an2;
+ p := center(t);
+ d1 := abs(ulcorner(t)-lrcorner(t));
+ if (an2 < 90) and (an2 > 0):
+ d2 := max(1/3cm, (d1/(abs(sind(an2))*1/3cm))*1/3cm);
+ else:
+ d2 := 1/3cm;
+ fi;
+ draw subpath (0, 8an2/360) of fullcircle scaled 2d2 rotated an1 shifted o withpen thinpen;
+ draw (t) shifted -p shifted o shifted (dir(an3)*(d2 + d1));
+endgroup
+enddef;
+
+%
+% Here we define some auxilary global variables
+%
+
+% Offset path algorithm can subdivide original path in order to be more precise
+offsetPathSteps := 4;
+
+% The following macro sets all the values related to minimal stroke width at once.
+% It can be used to easily redefine all of them.
+def defineMinStrokeWidth (expr msw) =
+ % We don't want to display strokes that are too thin to print. Default value
+ % is subject to change when needed.
+ minStrokeWidth := msw;
+ maxShadingStrokeWidth := 2minStrokeWidth;
+
+ % At some point it's useless to display even dashes
+ minDashStrokeWidth := 1/3minStrokeWidth;
+
+ % this value corresponds to particular dashing algorithm and is subject to change whenever this algorithm changes
+ minDashStrokeLength := 3minStrokeWidth;
+
+ dashStrokeWidthStep := 1/5minDashStrokeWidth;
+
+ % all the shading algorithms need to know how close lines should be packed
+ shadingDensity := 3maxShadingStrokeWidth;
+
+ % here are some pens
+ pen thinpen, thickpen, fatpen;
+
+ thinpen := pencircle scaled minStrokeWidth;
+ thickpen := pencircle scaled 3minStrokeWidth;
+ fatpen := pencircle scaled 6minStrokeWidth;
+enddef;
+
+defineMinStrokeWidth(1/5pt);
+
+% here we set global light direction
+
+def defineLightDirection (expr ldx, ldy) =
+ pair lightDirection, lightDirectionVector;
+ lightDirection := (ldx, ldy);
+ lightDirectionVector := (sin(xpart(lightDirection)), sin(ypart(lightDirection)));
+enddef;
+
+defineLightDirection(-1/8pi, 1/8pi);
+
+boolean shadowsEnabled;
+shadowsEnabled := false;
+
+%
+% To simplify further calculations we need subdivided original path
+%
+
+vardef pathSubdivideBase (expr p, subdivideStep, i) =
+ save returnPath, sp;
+ path returnPath, sp;
+ returnPath := point i of p;
+ if i<length(p):
+ sp := subpath(i, i + subdivideStep) of p;
+ returnPath := returnPath .. controls (postcontrol 0 of sp) and (precontrol 1 of sp) .. pathSubdivideBase (p, subdivideStep, i + subdivideStep);
+ fi;
+ if (i = 0) and (cycle p):
+ (subpath(0, length(returnPath)-1) of returnPath) .. controls (postcontrol length(returnPath)-1 of returnPath) and (precontrol length(returnPath) of returnPath) .. cycle
+ else:
+ returnPath
+ fi
+enddef;
+
+vardef offsetPathSubdivide (expr p) =
+ pathSubdivideBase(p, 1/offsetPathSteps, 0)
+enddef;
+
+vardef pathSubdivide (expr p, n) =
+ pathSubdivideBase(p, 1/n, 0)
+enddef;
+
+%
+% This macro creates a template offset path to a straight line, so we can correct angles
+% It might appear as if we need to calculate derivative of the function somehow, instead of mocking it
+% but this function might be anything, function of coordinates of distance to some point etc.,
+% so consider this a lazy way to do the right thing.
+%
+% either offsetPathTime or offsetPathLength are intended to be used as arguments. offsetPathTime is for time and offsetPathLength is for distance
+%
+
+vardef offsetPathTemplate (expr p, i) (text offsetFunction) =
+ save returnPath, offsetPathTime, offsetPathLength, instantDirection, nextDirection;
+ numeric offsetPathTime, offsetPathLength, currentAngle;
+ pair instantDirection, nextDirection;
+ path returnPath;
+ if (i <= length(p)):
+ offsetPathTime := i;
+ else:
+ offsetPathTime := length(p);
+ fi;
+ if (arclength(p) > 0):
+ offsetPathLength := arclength(subpath (0, i) of p)/arclength(p);
+ else:
+ offsetPathLength := 0;
+ fi;
+ returnPath := (arclength(subpath (0, i) of p), offsetFunction);
+ if (i < length(p)):
+ % this thing is glitchy, but should be more accurate
+ %if (arclength(subpath (0, i) of p) < arclength(subpath (0, i + 1/4) of p)):
+ % offsetPathTime := i + 1/4;
+ % offsetPathLength := arclength(subpath (0, i + 1/4) of p)/arclength(p);
+ % instantDirection := unitvector((arclength(subpath (0, i + 1/4) of p), offsetFunction) - point 0 of returnPath);
+ % offsetPathTime := i + 1;
+ % offsetPathLength := arclength(subpath (0, i + 1) of p)/arclength(p);
+ % nextDirection := (arclength(subpath (0, i + 1) of p), offsetFunction);
+ % offsetPathTime := i + 3/4;
+ % offsetPathLength := arclength(subpath (0, i + 3/4) of p)/arclength(p);
+ % nextDirection := unitvector(nextDirection - (arclength(subpath (0, i + 3/4) of p), offsetFunction));
+ % returnPath := returnPath{instantDirection} .. {nextDirection}offsetPathTemplate(p, i + 1)(offsetFunction);
+ % returnPath := returnPath -- offsetPathTemplate(p, i + 1)(offsetFunction);
+ %else:
+ returnPath := returnPath -- offsetPathTemplate(p, i + 1)(offsetFunction);
+ %fi;
+ fi;
+ returnPath
+enddef;
+
+%
+% This macro creates offset path p based on previously built template q, instead of function itself
+% It is loosely based on something called Tiller-Hanson heuristic as described here:
+% http://math.stackexchange.com/questions/465782/control-points-of-offset-bezier-curve
+%
+
+vardef offsetPathGenerate (expr p, q, i) =
+ save returnPath, c, d, pl, ps;
+ path returnPath, pl[];
+ pair c[], d[];
+ c1 := precontrol i of p;
+ c2 := point i of p;
+ c3 := postcontrol i of p;
+ if abs(c1-c2) = 0:
+ c1 := c2 shifted (c2-c3);
+ fi;
+ if abs(c3-c2) = 0:
+ c3 := c2 shifted (c2-c1);
+ fi;
+ if (abs(c1-c2) > 0) and (abs(c2-c3) > 0):
+ d1 := unitvector(c1-c2) rotated -90;
+ d2 := unitvector(c2-c3) rotated -90;
+ pl1 := (unitvector(c2-c1)--unitvector(c1-c2))
+ scaled arclength(subpath (i - 1/2, i + 1/2) of p)
+ shifted (point i of p shifted (d1 scaled ypart(point i of q)));
+ pl2 := (unitvector(c2-c3)--unitvector(c3-c2))
+ scaled arclength(subpath (i - 1/2, i + 1/2) of p)
+ shifted (point i of p shifted (d2 scaled ypart(point i of q)));
+ if (abs(angle(d1) - angle(d2)) > 2) and (xpart(pl1 intersectiontimes pl2) > 0):
+ c4 := pl1 intersectionpoint pl2;
+ else:
+ c4 := c2 shifted (d1 scaled ypart(point i of q));
+ fi;
+ returnPath := c4;
+ else:
+ returnPath := c2 shifted (unitvector( (point i-1 of p) - (point i+1 of p) rotated -90) scaled ypart (point i of q));
+ fi;
+ if i < length(p):
+ path ps;
+ ps := subpath (i, i + 1) of p;
+ c1 := point 0 of ps;
+ c2 := postcontrol 0 of ps;
+ c3 := precontrol 1 of ps;
+ c4 := point 1 of ps;
+ c5 := point 0 of returnPath;
+ if (abs(c3-c4)>0)
+ and (abs(c1-c2)>0)
+ and (abs(c1-c4)>0)
+ and (abs(direction i of q) > 0):
+ c6 := c4 shifted (unitvector(c4 - c3) rotated 90 scaled ypart(point i + 1 of q));
+ c7 := (c2 - c1) scaled (abs(c5-c6)/abs(c1-c4)) rotated angle(direction i of q) shifted c5;
+ c8 := (c3 - c4) scaled (abs(c5-c6)/abs(c1-c4)) rotated angle(direction i + 1 of q) shifted c6;
+ returnPath := returnPath .. controls c7 and c8 .. offsetPathGenerate (p, q, i + 1);
+ else:
+ returnPath := returnPath -- offsetPathGenerate (p, q, i + 1);
+ fi;
+ fi;
+ returnPath
+enddef;
+
+%
+% Frontend for offsetPathGenerate and offsetPathTemplate
+%
+
+vardef offsetPath (expr p)(text offsetFunction) =
+ offsetPathGenerate (p, offsetPathTemplate(p, 0)(offsetFunction), 0)
+enddef;
+
+%
+% Brush macro. It draws line with brush of variable width.
+% For parts thicker than minStrokeWidth it uses offsetPath functions'
+% results, for thiner parts it draws dashed lines of fixed width
+%
+
+def brushGenerate (expr p, q, i) =
+begingroup
+ save w, bp, bt, t;
+ numeric w[], t[];
+ path bp[], bt;
+ bt := q;
+ w0 := (ypart(urcorner(bt)));
+ w1 := (ypart(lrcorner(bt)));
+ t := cutPathTime(bt, minStrokeWidth);
+ if ((w0 > minStrokeWidth)
+ and (w1 < minStrokeWidth)
+ and (t > 0)
+ and (t < length(p))
+ and (arclength(p) > minDashStrokeLength)
+ and (i < 10)):
+ brushGenerate (subpath (0, t) of p, subpath (0, t) of q, i + 1);
+ brushGenerate (subpath (t, length(p)) of p, subpath (t, length(q)) of q, i + 1);
+ elseif (arclength(p) > 0):
+ if (w0 > 99/100minStrokeWidth)
+ and (w1 > 99/100minStrokeWidth):
+ bp1 := offsetPathGenerate (p, q yscaled 1/2, 0);
+ bp2 := offsetPathGenerate (p, q yscaled -1/2, 0);
+ fill bp1 -- reverse(bp2) -- cycle;
+ elseif (w0 < 101/100minStrokeWidth) and (w1 < 101/100minStrokeWidth):
+ thinBrushGenerate (p, q, 0)
+ fi;
+ fi;
+endgroup
+enddef;
+
+%
+% macro for thin lines which are actually dashed
+%
+
+def thinBrushGenerate (expr p, q, i) =
+begingroup
+ save w, bp, bt, t, h, linecap;
+ numeric w[], t[];
+ path bp[], bt;
+ bt := q;
+ w0 := (ypart(urcorner(bt)));
+ w1 := (ypart(lrcorner(bt)));
+ w2 := floor((1/2(w0 + w1))/dashStrokeWidthStep)*dashStrokeWidthStep;
+ t := cutPathTime(bt, w2);
+ bp1 := subpath (0, t) of p;
+ bp2 := subpath (t, length(p)) of p;
+ if (((w0 - w1) > dashStrokeWidthStep) and (i < 15))
+ and ((arclength(bp1) > minDashStrokeLength)
+ or (arclength(bp2) > minDashStrokeLength)):
+ thinBrushGenerate (bp1, subpath (0, t) of q, i + 1);
+ thinBrushGenerate (bp2, subpath (t, length(q)) of q, i + 1);
+ else:
+ linecap := butt;
+ if (w2 > minStrokeWidth):
+ w2 := minStrokeWidth;
+ fi;
+ if (w2 >= minDashStrokeWidth) and (arclength(p) > 0):
+ draw p withpen thinpen dashed thinBrushPattern(w2, arclength(p));
+ fi;
+ fi;
+endgroup
+enddef;
+
+%
+% this macro returns path as a shaded edge
+%
+
+vardef shadedEdge (expr p) =
+ image(
+ brushGenerate (p,
+ offsetPathTemplate (p, 0) (
+ 1/2minStrokeWidth + 2*minStrokeWidth
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(direction offsetPathTime of p), 1/2)
+ ), 0, point offsetPathTime of p
+ )
+ ), 0);
+ )
+enddef;
+
+%
+% Whenever we have brush thinner than minStrokeWidth we call this dash pattern macro
+%
+
+vardef thinBrushPattern (expr w, l) =
+ save d;
+ numeric d[];
+ d0 := w;
+ if d0 > minStrokeWidth: d0 := minStrokeWidth; fi;
+ % d1 is a result of some arbitrary function of line width
+ % we do not use simple linear function because minimal dash length
+ % also shouldn't be less than minStrokeWidth.
+ % After we get d1 other measurements are calculated,
+ % so filled area per unit length remains adequate and dashes are aligned
+ % with segments
+ d1 := (1/2minDashStrokeLength) + (((d0/minStrokeWidth)**2)*1/2minDashStrokeLength);
+ d1 := d1 + 1/2uniformdeviate(d1);
+ d2 := (minStrokeWidth - d0)*(d1/d0);
+ d3 := round(l/(d2 + d1));
+ if (d3 < 1): d3 := 1; fi;
+ d4 := (l/d3)/(d2 + d1);
+ d1 := d1*d4;
+ d2 := d2*d4;
+ if (uniformdeviate(2) > 1):
+ dashpattern (on d1 off 2d2)
+ else:
+ dashpattern (off 2d2 on d1)
+ fi
+enddef;
+
+%
+% macro that actually draws line of variable width
+%
+
+vardef brush (expr p) (text offsetFunction) =
+ image(
+ brushGenerate (p, offsetPathTemplate(p, 0)(offsetFunction), 0);
+ )
+enddef;
+
+%
+% This macro generates tube between paths p and q, of variable width d
+% Tube is subdivided into segments in such a way that within every segment
+% we need 2**n lines to generate even fill
+%
+
+def tubeGenerate (expr p, q, d, i) =
+begingroup
+ save w, bw, k, t, tubeWidth, sp, currentPath, currentTubePath, currentDepth;
+ numeric w[], bw[], t, currentDepth;
+ path tubeWidth, sp, currentPath, currentTubePath;
+ tubeWidth := d yscaled 2;
+ w0 := (ypart(urcorner(tubeWidth))) - 1/1000;
+ w1 := (ypart(lrcorner(tubeWidth))) + 1/1000;
+ w2 := ceiling(log(w0/shadingDensity, 2));
+ w3 := ceiling(log(w1/shadingDensity, 2));
+ if ((w2 > w3) and (i<20)):
+ t := cutPathTime(tubeWidth, shadingDensity*(2**(w2-1)));
+ tubeGenerate (subpath (0, t) of p, subpath (0, t) of q, subpath (0, t) of d, i + 1);
+ tubeGenerate (subpath (t, length(p)) of p, subpath (t, length(q)) of q, subpath (t, length(d)) of d, i + 1);
+ else:
+ if (arclength(p) > 0) and (arclength(q) > 0):
+ bw1 := 2**w2;
+ currentTubePath := interpath (1/2, q, p);
+ for k := 0 upto bw1:
+ currentPath := interpath (k/bw1, q, p);
+ angleOnTube := arccos(((k/bw1)*2) - 1);
+ currentDepth := -abs((1-sin(angleOnTube))*w0);
+ if shadowsEnabled:
+ currentPath := shadowCut(currentPath, currentDepth);
+ fi;
+ brushGenerate (currentPath,
+ offsetPathTemplate(currentPath, 0)(
+ maxShadingStrokeWidth
+ if odd (k): * (abs(ypart(point offsetPathTime of tubeWidth)/bw1) - 1/2shadingDensity) fi
+ %* orderFade(xpart(unitvector(direction offsetPathTime of tubeWidth yscaled 1/2cos(angleOnTube))), k) % why was it even here?
+ * angleToLightness(
+ tubeAngleToAbsoulteAngle((
+ angleOnTube,
+ angleRad(direction offsetPathTime of currentTubePath),
+ angleRad(direction offsetPathTime of tubeWidth yscaled 1/2)
+ )), currentDepth, point offsetPathTime of currentPath)
+ ), 0);
+ endfor;
+ fi;
+ fi;
+endgroup
+enddef;
+
+%
+% This macro is analogous to tubeGenerate, but draws transverse strokes
+% result is somewhat suboptimal for now, but in simple cases it works ok
+%
+
+def tubeGenerateAlt (expr p, q, d) =
+begingroup
+ save spth, lpth, currentPath, pos, t, pthdir, corr, o, l, i, j, k, tubeAngle, pathAngle, scorr, dt;
+ numeric l[];
+ path spth, lpth, currentPath;
+ pos := 0;
+ j := 0;
+ forever:
+ dt := (xpart(point pos of d) + 1/2shadingDensity);
+ scorr := cosd(angle(direction xpart(d intersectiontimes ((dt, ypart(lrcorner(d))) -- (dt, ypart(urcorner(d))))) of d));
+ t1 := arctime ((arclength(subpath(0, pos) of p)) + shadingDensity/scorr) of p;
+ t2 := arctime ((arclength(subpath(0, pos) of q)) + shadingDensity/scorr) of q;
+ if (arclength(subpath(pos, t1) of p) < arclength(subpath(pos, t1) of q)):
+ pthdir := -1;
+ t3 := t1;
+ else:
+ pthdir := 1;
+ t3 := t2;
+ fi;
+ corr := round(arclength(subpath(pos, t3) of if pthdir = 1: p else: q fi)/(shadingDensity/scorr));
+ if (corr < 1): corr := 1; fi;
+ corr := (arclength(subpath(pos, t3) of if pthdir = 1: p else: q fi) - (corr*(shadingDensity/scorr)))/corr;
+ t3 := arctime (arclength(subpath(0, t3) of if pthdir = 1: q else: p fi) - 1/3corr) of if pthdir = 1: q else: p fi;
+ spth := subpath(pos, t3) of if pthdir = 1: q else: p fi;
+ lpth := subpath(pos, t3) of if pthdir = 1: p else: q fi;
+ tubeAngle := angleRad(direction 1/2[pos, t3] of d);
+ pathAngle := angleRad(direction 1/2 of interpath (1/2, spth, lpth));
+ pos := t3;
+ l1 := round(arclength(lpth)/(shadingDensity/scorr));
+ if (l1 < 1): l1 := 1; fi;
+ l2 := arclength(lpth)/(l1*(shadingDensity/scorr));
+ for i := 0 upto l1 - 1:
+ j := j + 1;
+ k := i*(arclength(lpth)/l1);
+ currentPath := point (arctime k of lpth) of spth -- point (arctime k of lpth) of lpth;
+ currentPath := offsetPathSubdivide(currentPath);
+ brushGenerate (
+ currentPath,
+ offsetPathTemplate(currentPath, 0)(
+ maxShadingStrokeWidth
+ * orderFade(offsetPathLength[1/l1, l2], j)
+ * angleToLightness(
+ tubeAngleToAbsoulteAngle((
+ arccos(pthdir*((offsetPathLength*2)-1)),
+ pathAngle,
+ tubeAngle)
+ ), -2(1/2arclength(currentPath))+sqrt(1 - (2offsetPathLength - 1)**2)*(1/2arclength(currentPath)), point offsetPathTime of currentPath)
+ )
+ , 0);
+ endfor;
+ exitif pos >= length(p);
+ endfor;
+endgroup
+enddef;
+
+%
+% This macro converts some measurements of point on tube to absolute angle.
+% Since there are three such measurements, macro gets them as as a single
+% argument of "color" type, in case it will eventually appear as a result
+% of some other macro.
+%
+
+vardef tubeAngleToAbsoulteAngle (expr p) =
+ save a;
+ numeric a[];
+ a1 := bluepart(p) + 1/2pi;
+ a2 := arccos(cos(redpart(p))*sin(a1));
+ a3 := greenpart(p) + 1/2pi;
+ a4 := arccos((cos(a1) * cos(a3) - cos(a2) * sin(a3))*(99/100));
+ a5 := arccos((cos(a1) * sin(a3) + cos(a2) * cos(a3))*(99/100));
+ (a5, a4)
+enddef;
+
+%
+% frontends to simplify tube drawing. tubeOutline variable changes on every call
+% of any tube frontend function and can be used afterwards.
+%
+
+path tubeOutline;
+boolean drawTubeEnds;
+drawTubeEnds := true;
+
+vardef tube.l (expr p)(text offsetFunction)=
+ save q;
+ path q[];
+ q0 := offsetPathSubdivide(p);
+ q1 := offsetPathTemplate(q0, 0)(offsetFunction);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeOutline := q3--reverse(q2)--cycle;
+ image(
+ tubeGenerate (q2, q3, q1, 0);
+ if (cycle p) or (not drawTubeEnds):
+ draw q2 withpen thinpen;
+ draw q3 withpen thinpen;
+ else:
+ draw q2--reverse(q3)--cycle withpen thinpen;
+ fi;
+ )
+enddef;
+
+vardef tube.t (expr p)(text offsetFunction)=
+ save q;
+ path q[];
+ q0 := offsetPathSubdivide(p);
+ q1 := offsetPathTemplate(q0, 0)(offsetFunction);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeOutline := q3--reverse(q2)--cycle;
+ image(
+ tubeGenerateAlt (q2, q3, q1);
+ if (cycle p) or (not drawTubeEnds):
+ draw q2 withpen thinpen;
+ draw q3 withpen thinpen;
+ else:
+ draw q2--reverse(q3)--cycle withpen thinpen;
+ fi;
+ )
+enddef;
+
+vardef tube.e (expr p)(text offsetFunction)=
+ save q;
+ path q[];
+ q0 := offsetPathSubdivide(p);
+ q1 := offsetPathTemplate(q0, 0)(offsetFunction);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeOutline := q3--reverse(q2)--cycle;
+ if not drawTubeEnds:
+ image(
+ draw q2 withpen thinpen;
+ draw q3 withpen thinpen;
+ )
+ else:
+ tubeOutline := q3--reverse(q2)--cycle;
+ tubeOutline
+ fi
+enddef;
+
+%
+% Sphere can be used as a cap for a tube, so it has same 2**n lines.
+%
+
+vardef sphere.c (expr d) =
+ save currentCircle, origCircle, currentRadius, currentDepth, order, circleThickness;
+ path currentCircle, origCircle;
+ numeric currentRadius, currentDepth, order;
+ origCircle := fullcircle;
+ order := 2**ceiling(log((1/2d)/shadingDensity, 2));
+ image(
+ draw fullcircle scaled d withpen thinpen;
+ for i := 1 upto order:
+ currentRadius := i/order;
+ currentCircle := origCircle scaled (currentRadius*d) rotated uniformdeviate (1/4pi);
+ if odd(i):
+ circleThickness := maxShadingStrokeWidth * ((abs(d - (shadingDensity*order)))/order);
+ else:
+ circleThickness := maxShadingStrokeWidth;
+ fi;
+ currentDepth:= -(1-sqrt(1-currentRadius**2))*(1/2d);
+ if shadowsEnabled:
+ currentCircle := shadowCut(currentCircle, currentDepth);
+ fi;
+ brushGenerate (currentCircle,
+ offsetPathTemplate (currentCircle, 0) (
+ circleThickness
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(direction offsetPathTime of currentCircle), currentRadius)
+ ), currentDepth, point offsetPathTime of currentCircle
+ )
+ ), 0);
+ endfor;
+ )
+enddef;
+
+%
+% Alternative sphere macro. It's all about latitudinal strokes.
+% The idea is: when we have a sphere with evenly distributed parallel strokes
+% we know how their density rises towards edge in a projection,
+% so all we need to do is to fade lines correspondingly
+%
+
+vardef sphere.l (expr d, lat) =
+ save p, a, x, y, sphlat, latrad, n, c, currentPath, nline, tlat;
+ path p[], currentPath, currentArc;
+ sphlat := 0;
+ nline := 0;
+ latrad := (2pi*lat/360);
+ n := ceiling((pi*1/2d)/shadingDensity);
+ if (cosd(lat) <> 0): tlat := (sind(lat)/cosd(lat)); fi;
+ image(
+ draw fullcircle scaled d withpen thinpen;
+ p0 := fullcircle rotated 90;
+ for nline := 1 upto n-1:
+ sphlat := nline*(pi/n);
+ if (sphlat + latrad < pi) and (sphlat + latrad > 0):
+ if (cosd(lat) <> 0):
+ if (sin(sphlat) <> 0):
+ x := tlat*(cos(sphlat)/sin(sphlat));
+ else:
+ x := 0;
+ fi;
+ else:
+ if ((sphlat > 1/2pi) and (lat > 0)) or ((sphlat < 1/2pi) and (lat < 0)):
+ x := -2;
+ else:
+ x := 2;
+ fi;
+ fi;
+ if (abs(x) <= 1):
+ y := arcsin(x);
+ p1 := subpath(6 + 8y/2pi, 2 - 8y/2pi) of p0;
+ else:
+ p1 := p0;
+ fi;
+ if (x > -1) and (arclength(p1) > 0):
+ currentPath := (p1 scaled (d*sin(sphlat)) yscaled sind(lat)) shifted (0, 1/2d*cos(sphlat)*cosd(lat));
+ currentPath := offsetPathSubdivide(currentPath);
+ brushGenerate(currentPath,
+ offsetPathTemplate(currentPath, 0)(
+ maxShadingStrokeWidth * orderFade(
+ sqrt(1 -
+ abs(
+ ypart(point offsetPathTime of currentPath)/(1/2d),
+ 1 - abs(
+ 1 - abs(
+ xpart(point offsetPathTime of currentPath)
+ /(1/2d)
+ )
+ )**abs(sind(lat))
+ )**2)
+ , nline)
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle((
+ (
+ if (abs(point offsetPathTime of currentPath) > 0):
+ angleRad(point offsetPathTime of currentPath)
+ else:
+ 0
+ fi
+ + 1/2pi), 2abs(point offsetPathTime of currentPath)/(d+1))
+ ), 0, point offsetPathTime of currentPath)
+ ), 0);
+ fi;
+ fi;
+ endfor;
+ )
+enddef;
+
+vardef orderFade (expr v, n)=
+ save o;
+ if (v > 1/256):
+ o := 2**ceiling(log(1/v, 2));
+ if ((n mod 1/2o) = 0):
+ if ((n mod o) = 0):
+ 1
+ else:
+ (v*o) - 1
+ fi
+ else:
+ 0
+ fi
+ else:
+ 0
+ fi
+enddef;
+
+%
+% This one converts point location on sphere to absolute angle
+%
+
+vardef sphereAngleToAbsoulteAngle (expr p) =
+ save a;
+ numeric a[];
+ a1 := xpart(p) - 1/2pi;
+ a2 := arcsin(ypart(p));
+ a3 := arccos(sin(a2)*cos(a1));
+ a4 := pi - arccos(sin(a2)*sin(a1));
+ (a3, a4)
+enddef;
+
+%
+% Once we get two angles at some point of some surface, we can compute light intensity there.
+%
+
+vardef angleToLightness (expr p, d, q) =
+ save returnValue, shiftedShadowPath;
+ path shiftedShadowPath;
+ if shadowsEnabled:
+ for i := 0 step 1 until numberOfShadows:
+ shiftedShadowPath := shadowPath[i] shifted (lightDirectionVector scaled (d-shadowDepth[i]));
+ if q isInside shiftedShadowPath:
+ returnValue := 1;
+ fi;
+ endfor;
+ fi;
+ if not known returnValue:
+ returnValue := (cos(xpart(p) + xpart(lightDirection))++cos(ypart(p) - ypart(lightDirection)));
+ returnValue := angleToLightnessPP(returnValue);
+ fi;
+ if returnValue > 1:
+ 1
+ else:
+ returnValue
+ fi
+enddef;
+
+vardef angleToLightnessPP (expr v) =
+ v**3
+enddef;
+
+% Shadows are global
+
+path shadowPath[];
+numeric shadowDepth[];
+
+% Shadows either require high path resolution, or some points
+% on a path in just the right place for shadows.
+% This macro adds such points.
+
+vardef shadowCut (expr pathToCut, currentDepth)=
+ save shiftedShadowPath, pathShadowIntersection, pathShadowCut, currentPath;
+ path shiftedShadowPath, currentPath;
+ pair pathShadowIntersection;
+ numeric pathShadowCut;
+ currentPath := pathToCut;
+ for j := 0 step 1 until numberOfShadows:
+ shiftedShadowPath := shadowPath[j] shifted (lightDirectionVector scaled (currentDepth - shadowDepth[j]));
+ forever:
+ pathShadowIntersection := shiftedShadowPath firstIntersectionTimes currentPath;
+ pathShadowCut := ypart(pathShadowIntersection);
+ if (pathShadowCut > 1/10) and (pathShadowCut < length(currentPath) - 1/10):
+ currentPath := (subpath (0, pathShadowCut - 1/20) of currentPath) .. (subpath (pathShadowCut + 1/20, length(currentPath)) of currentPath);
+ fi;
+ shiftedShadowPath := subpath (xpart(pathShadowIntersection) + 1/5, length(shiftedShadowPath)) of shiftedShadowPath;
+ exitif (pathShadowCut = -1);
+ endfor;
+ endfor;
+ currentPath
+enddef;
+
+%
+% Several macros rely on cutting offset path template at given height.
+% Taking cutting points closer to the middle gives better results, and that's
+% just what this macro tries to do.
+%
+
+vardef cutPathTime (expr p, h) =
+ save cutTime, d;
+ numeric cutTime[], d[];
+ d1 := xpart(urcorner(p));
+ d2 := xpart(ulcorner(p));
+ if (d2 < d1):
+ d3 := 1/2(d1 + d2);
+ cutTime1 := ypart(((d3, h) -- (d1, h)) firstIntersectionTimes p);
+ cutTime2 := ypart(((d3, h) -- (d2, h)) firstIntersectionTimes p);
+ d4 := xpart (point cutTime1 of p);
+ d5 := xpart (point cutTime2 of p);
+ if abs(d4-d3) < abs(d5-d3):
+ cutTime3 := cutTime1
+ else:
+ cutTime3 := cutTime2
+ fi;
+ else:
+ cutTime3 := -1;
+ fi;
+ cutTime3
+enddef;
+
+%
+% This macro calculates ray angle after refraction. It takes raw angles (one of ray — p and one of surface — q)
+% and refraction indices ratio. Whether ray comes from opticaly denser material is determined by direction of q
+% relative to that of p
+%
+
+vardef refractionAngle (expr p, q, n) =
+ save a;
+ numeric a[];
+ a0 := p - q;
+ if (sin(a0) < 0):
+ a1 := cos(a0 + pi) * n;
+ a2 := pi;
+ else:
+ a1 := cos(a0) / n;
+ a2 := 0;
+ fi;
+ if abs(a1) <= 1:
+ a3 := arccos(a1) + q + a2;
+ else:
+ a3 := -1000;
+ fi;
+ a3
+enddef;
+
+%
+% Same thing for reflection angle, just in case
+%
+
+vardef reflectionAngle (expr p, q) =
+ (2pi - p + 2q)
+enddef;
+
+%
+% This macro returns path of ray 'sa' (which can actually be any path, but only ray from next to last to last point
+% will count) refracted with coef. n through some shape p; if ray can't be refracted and, therefore, totally reflected,
+% it will contunue as reflected from that point. i is total number of refractions to compute;
+%
+
+vardef refractionPathR (expr sa, p, n, i, mn) =
+ save ray, resultRay, d, s, a, iT;
+ path ray, resultRay;
+ pair s, iT;
+ numeric d[], a;
+ s := point (length(sa) - 1) of sa;
+ a := angleRad((point (length(sa)) of sa)-(point (length(sa) - 1) of sa));
+ ray := (s shifted (-dirRad(a) scaled 2)) -- s -- (s shifted (dirRad(a) scaled (abs(llcorner(p)-(urcorner(p))) + abs(s-(center(p))))));
+ if (i > 0): ray := subpath (1 + 1/1000, 2) of ray; fi;
+ iT := ray firstIntersectionTimes p;
+ d1 := xpart(iT);
+ d2 := ypart(iT);
+ d3 := a;
+ d4 := angleRad(direction d2 of p);
+ if (n > 0):
+ d5 := refractionAngle(d3, d4, n);
+ if (d5 < -100) and (d2 >= 0):
+ d5 := reflectionAngle(d3, d4);
+ fi;
+ else:
+ d5 := reflectionAngle(d3, d4);
+ fi;
+ if (d1 >= 0) and (i < mn) and (d5 > -100):
+ resultRay := (subpath (0, length(sa) - 1) of sa) -- refractionPathR(point d2 of p -- (point d2 of p shifted dirRad(d5)), p, n, i + 1, mn);
+ else:
+ if (d5 > -100) or (d1 < 0):
+ resultRay := subpath (0, 1/2) of ray;
+ else:
+ resultRay := subpath (0, d1) of ray;
+ fi;
+ fi;
+ resultRay
+enddef;
+
+vardef refractionPath (expr sa, p, n) =
+ refractionPathR(sa, p, n, 0, 10)
+enddef;
+
+%
+% These macros are for isolines. cLine draws continuous line and is called by isoLines.
+% For now they are only used to draw wood texture, but can be used elsewhere
+%
+
+%
+% isoLines goes through i by j matrix of nodes (xy), looking for square, that has some of it's
+% angles below zero and some - above, when found, it calls cLine, that tries to build segment of
+% isoline, that happen to go through abovementioned square. Thickness of line is
+% controlled by values in v array.
+% All squares with lines already drawn through are ignored.
+%
+
+vardef isoLines (suffix xy)(expr cs, l, s) =
+ save xxyy, i, j, c, v, sqB, iL, lvl;
+ numeric xxyy[][], c[], v[], sqB, sqbM;
+ lvl := l;
+ path iL;
+ image(
+ for i := 0 step 1 until xpart(cs) - 1:
+ for j := 0 step 1 until ypart(cs) - 1:
+ if (unknown xxyy[i][j]):
+ c1 := xy[i][j]+lvl;
+ c2 := xy[i][j+1]+lvl;
+ c3 := xy[i+1][j]+lvl;
+ c4 := xy[i+1][j+1]+lvl;
+ sqB := 0;
+ sqBm := 0;
+ if (abs(sign(c1)+sign(c2)+sign(c3)+sign(c4)) < 4):
+ iL := cLine (xy)((i, j), (0, 0), 0, cs) scaled s;
+ brushGenerate (reverse(iL),
+ offsetPathTemplate(iL, 0)(
+ 1/16minStrokeWidth
+ /(1/64 + 2(
+ if (offsetPathTime < length(iL) - 1):
+ (offsetPathTime - floor(offsetPathTime))
+ [v[floor(sqB + offsetPathTime)],
+ v[ceiling(sqB + offsetPathTime)]]
+ else:
+ 1
+ fi
+ ))
+ )
+ , 0);
+ fi;
+ fi;
+ endfor;
+ endfor;
+ draw (0,0);
+ )
+enddef;
+
+% cLine tries to generate continouos segment of an isoline
+
+vardef cLine (suffix xy)(expr ij, dr, st, cs) =
+ save p, d, dd, n, i, j, k, outputPath, sqS, cp, dp, nd;
+ pair p[], d[], dd[], cp[], dp[];
+ path outputPath;
+ i := xpart(ij);
+ j := ypart(ij);
+ sqS := 0;
+ if (i >= 0) and (i <= xpart(cs)-1) and (j >= 0) and (j <= ypart(cs)-1):
+ n := 0;
+ c1 := xy[i][j] + lvl; d1:= (i, j);
+ c2 := xy[i][j+1] + lvl; d2:= (i, j+1);
+ c3 := xy[i+1][j] + lvl; d3:= (i+1, j);
+ c4 := xy[i+1][j+1] + lvl; d4:= (i+1, j+1);
+ cp1 := (1, 2); dp1 := (-1, 0);
+ cp2 := (1, 3); dp2 := (0, -1);
+ cp3 := (2, 4); dp3 := (0, 1);
+ cp4 := (3, 4); dp4 := (1, 0);
+ for k := 1 upto 4:
+ c5 := c[xpart(cp[k])]; d5 := d[xpart(cp[k])];
+ c6 := c[ypart(cp[k])]; d6 := d[ypart(cp[k])];
+ if (sign(c5)) <> (sign(c6)):
+ n := n + 1;
+ p[n] := (abs(-c5/(c6-c5)))[d5, d6];
+ dd[n] := dp[k];
+ fi;
+ endfor;
+ sqS := max(c1, c2, c3, c4) - min(c1, c2, c3, c4);
+ if (unknown xxyy[i][j]):
+ xxyy[i][j] := 1;
+ if (dr = (0, 0)):
+ outputPath := cLine (xy)(ij shifted dd2, dd2, st + 1,cs) -- p1 -- p2 -- cLine (xy)(ij shifted dd1, dd1, st - 1,cs);
+ else:
+ nd := 0;
+ if (unknown(xxyy[i + xpart(dd1)][j + ypart(dd1)])):
+ nd := 1;
+ elseif (unknown(xxyy[i + xpart(dd2)][j + ypart(dd2)])):
+ nd := 2;
+ fi;
+ if nd > 0:
+ outputPath := cLine (xy)(ij shifted dd[nd], dd[nd], st + sign(st),cs);
+ p3 := p[nd];
+ if (st > 0):
+ outputPath := outputPath -- p3;
+ else:
+ outputPath := p3 -- outputPath;
+ fi;
+ else:
+ outputPath := 1/2[p1, p2];
+ fi;
+ fi;
+ else:
+ outputPath := 1/2[p1, p2];
+ fi;
+ else:
+ outputPath := (i, j);
+ xxyy[i][j] := 1;
+ fi;
+ if (st < sqB): sqB := st; fi;
+ if (st > sqBm): sqBm := st; fi;
+ v[st] := sqS;
+ outputPath
+enddef;
+
+%
+%
+%
+% In following section are gathered all the things for some commonly used
+% real life objects
+%
+%
+%
+
+%
+% Though there's a decent library to deal with geography for mp already
+% (http://melusine.eu.org/lab/bmp/a_mp-geo), here's some basic globe-drawing
+% routine for simple cases, note that latitude starts from the pole,
+% not from the equator (for convenience sake)
+% Below some landmasses are defined
+%
+
+path landmass[];
+landmass1 := (206, 122.33)--(211.07, 116)--(213.3, 109.94)--(218.57, 106.03)--(218.38, 97.36)--(220.28, 91.28)--(229.75, 78.07)--(221.41, 78.29)--(220.78, 76.52)--(218.07, 74.48)--(213.8, 66.08)--(213.38, 62.04)--(222.31, 77.1)--(233.88, 72.27)--(237.79, 68.59)--(234.88, 64.69)--(229.83, 65.57)--(228.98, 64.73)--(227.37, 59.82)--(250.57, 68.12)--(254.63, 80.83)--(257.07, 80.93)--(257.38, 80.52)--(258.64, 75.5)--(266.4, 68.48)--(269.56, 67.49)--(271.88, 70.43)--(272.67, 74.49)--(275.36, 72.94)--(276.87, 78.6)--(276.68, 79.04)--(276.11, 79.28)--(276.3, 80.22)--(276.75, 79.96)--(276.56, 82.38)--(277.05, 82.04)--(280.5, 86.44)--(277.25, 85.56)--(276.55, 88.03)--(279.47, 92.77)--(283.29, 92.25)--(282.68, 90.91)--(283.74, 90.4)--(282.53, 89.58)--(283.03, 88.6)--(278.44, 80.08)--(279.15, 76.64)--(281.08, 78.25)--(282.29, 80.21)--(285.35, 79.72)--(288, 77.83)--(284.21, 71.22)--(287.94, 68.57)--(288, 68.6)--(288.74, 69.82)--(300.09, 61.89)--(300.86, 59.94)--(299.36, 59.63)--(297.64, 55.13)--(301.24, 52.55)--(296.1, 51.5)--(300.45, 49.51)--(299.83, 50.75)--(299.84, 50.82)--(299.44, 51.42)--(303.59, 50.57)--(302.72, 51.9)--(302.96, 52.12)--(304.97, 52.87)--(304.12, 55.13)--(307.89, 53.38)--(306.37, 50.11)--(308.65, 47.92)--(315.01, 45.12)--(319.69, 40.31)--(320.43, 44.25)--(321.66, 44.31)--(323.19, 41.66)--(320.37, 35.59)--(318.47, 37.21)--(315.99, 36.32)--(313.68, 35.16)--(320.43, 31.11)--(332.73, 30.38)--(338.5, 28.24)--(340.91, 28.61)--(334.92, 32.27)--(335, 39.2)--(340.58, 35.32)--(341.69, 32.15)--(340.43, 31.93)--(344.49, 29.68)--(352.49, 28.33)--(355.9, 25.35)--(358.67, 24.01)--(366.1, 25.61)--(368.78, 23.99)--(319.11, 17.34)--(309.82, 19)--(308.23, 18.4)--(307.69, 16.74)--(297.49, 16.63)--(290.61, 13.26)--(285.38, 13.37)--(284.06, 12.79)--(258.59, 16.61)--(260.79, 18.13)--(254.13, 18.01)--(253.53, 17.04)--(252.25, 17.02)--(252.44, 18.56)--(253.69, 19.64)--(251.71, 20.89)--(249.66, 16.97)--(245.54, 19.39)--(236.64, 19.73)--(239.08, 21)--(237.57, 21.46)--(232.4, 21.62)--(232.29, 21.34)--(225.16, 22.27)--(221.46, 21.23)--(218.52, 25.09)--(216.81, 24.69)--(214.76, 24.93)--(214.95, 25.52)--(213.66, 25.25)--(211.67, 23.33)--(215.44, 23.49)--(217.75, 21.65)--(200.52, 19.57)--(194.37, 21.1)--(186.19, 26.3)--(183.33, 30.4)--(187.61, 31.42)--(191.44, 33.88)--(194.61, 33.54)--(197.17, 30.74)--(196.08, 28.46)--(196.04, 27.66)--(203.54, 24.58)--(203.45, 24.88)--(200.38, 27.18)--(200.91, 27.54)--(200.05, 29.69)--(199.62, 29.91)--(201.03, 30.25)--(207.36, 29.93)--(205.2, 31.05)--(199.88, 30.97)--(199.94, 31.44)--(200.26, 32.2)--(202.19, 31.76)--(202.85, 32.2)--(199.62, 32.83)--(199.15, 34.61)--(189.46, 35.87)--(189.93, 35.46)--(191.12, 35.08)--(190.83, 34.56)--(188.1, 33.45)--(186.87, 34.75)--(187.11, 36.02)--(176.39, 40.19)--(176.65, 41.24)--(173.41, 42.02)--(176.82, 43.77)--(169.68, 46.56)--(169.15, 53.05)--(171.1, 53.62)--(173.12, 53.39)--(178.7, 51.26)--(183.17, 46.73)--(186.38, 46.75)--(192.72, 49.52)--(191.46, 52.64)--(193.74, 52.83)--(196.74, 50.32)--(190.71, 44.65)--(191.74, 44.4)--(198.11, 50.06)--(198.89, 52.03)--(200.95, 53.75)--(202.49, 51.99)--(201.15, 49.3)--(204.15, 49.28)--(206.54, 53.44)--(214.39, 53.25)--(211.18, 58.75)--(198.36, 57.7)--(197.88, 59.47)--(188.5, 55.87)--(189.63, 53.18)--(189.49, 52.79)--(173.31, 54.75)--(168.56, 58.21)--(161.34, 69.75)--(160.58, 75.18)--(161.25, 77.58)--(162.08, 79.09)--(163.71, 80.23)--(165.04, 82.46)--(168.88, 84.86)--(182.72, 83.77)--(184.88, 85.79)--(187.22, 85.99)--(186.79, 90.34)--(190.56, 95.97)--(190.23, 105.47)--(193.05, 115.74)--(196.18, 121.46)--(196.92, 124.65)--(206, 122.33)--(206, 122.33);
+landmass2 := (111.44, 45.06)--(113.41, 44.75)--(111.77, 46)--(111.77, 46.07)--(118.69, 43.98)--(118.13, 42.88)--(116.49, 43.6)--(114.48, 42.7)--(114.1, 43.65)--(114.04, 41.9)--(113.28, 42.04)--(108.57, 42.18)--(114.57, 39.81)--(120.91, 38.84)--(119.04, 41.38)--(119.53, 41.59)--(122.9, 42.64)--(121.94, 42.77)--(121.82, 43.31)--(124.3, 42.48)--(125.29, 42.37)--(125.59, 41.84)--(125.41, 41.3)--(124.75, 41.38)--(122.58, 40.38)--(122.97, 39.95)--(121.71, 40.06)--(123.02, 38.38)--(121.65, 38.53)--(120.78, 35.69)--(116.8, 33.48)--(114.09, 29.59)--(110.59, 31.42)--(108.79, 28.81)--(104.18, 27.54)--(99.54, 29.42)--(100.85, 30.15)--(100.61, 31.83)--(100.51, 34.6)--(98.7, 35.56)--(99.11, 36.37)--(99.33, 38.41)--(96.3, 36.78)--(85.98, 32.83)--(83.79, 29.73)--(86.02, 28)--(87.63, 26.53)--(92.02, 23.6)--(94.53, 23.9)--(94.57, 23.59)--(95.6, 23.75)--(96.08, 21.63)--(96.05, 20.47)--(99.61, 19.73)--(103.5, 21.33)--(105.9, 22.76)--(103.75, 23.87)--(104.54, 24.37)--(101.78, 25.83)--(112.52, 27.74)--(113.4, 27.33)--(113.39, 27.23)--(110.6, 24.25)--(110.62, 24.18)--(111.27, 23.6)--(116.34, 23.81)--(117.17, 23.3)--(110.5, 21.34)--(111.78, 20.87)--(110.82, 20.4)--(111.3, 20.21)--(109.74, 19.84)--(110.11, 19.43)--(102.09, 17.29)--(97.38, 16.64)--(92.88, 17.67)--(92.21, 18.01)--(91.83, 17.28)--(89.16, 18.82)--(92.76, 20.05)--(93.22, 20.96)--(92.06, 21.98)--(91.69, 22.39)--(88.11, 21.59)--(87.79, 20.91)--(86.11, 20.22)--(86.94, 19.77)--(84.28, 18.1)--(84.81, 17.32)--(85.92, 16.37)--(82.62, 16.82)--(82.26, 18.46)--(82.22, 20.63)--(80.29, 21.42)--(73.81, 21.72)--(73.19, 21.56)--(73.02, 21.15)--(75.97, 21.21)--(75.92, 20.34)--(77.6, 20.64)--(73.05, 17.2)--(70.79, 18.11)--(67.81, 17.27)--(64.31, 17.23)--(54.27, 15.93)--(52.31, 18.03)--(60.06, 17.29)--(60.43, 18.73)--(59.79, 19.06)--(65.44, 20.05)--(71.86, 20.7)--(72.16, 20.95)--(69.43, 21.73)--(70.4, 21.96)--(70.06, 22.49)--(69.48, 22.4)--(63.3, 21.97)--(48.4, 19.77)--(41.64, 20.99)--(22.72, 18.59)--(11.06, 21.67)--(16.58, 23.75)--(14.57, 23.75)--(10.29, 24.54)--(17.36, 25.3)--(17.42, 26.18)--(12.61, 29.54)--(15.96, 29.89)--(15.52, 31.43)--(20.94, 31.31)--(13.31, 35.43)--(16.05, 35.66)--(19.1, 35.11)--(18.12, 34.75)--(27.83, 28.87)--(28.89, 30.18)--(33.87, 29.92)--(33.36, 30.35)--(38.31, 30.44)--(42.27, 33.16)--(42.87, 32.94)--(47.84, 35.37)--(50.85, 39.13)--(53.79, 42.3)--(54.39, 50.26)--(64.16, 61.59)--(63.13, 61.47)--(62.78, 61.95)--(64.93, 63.33)--(66.24, 65.62)--(67.78, 65.49)--(65.67, 61.75)--(65.09, 58.99)--(66.42, 61.44)--(68.81, 63.42)--(72.94, 69.36)--(81.5, 74.4)--(83.61, 73.92)--(85.99, 75.53)--(90.7, 76.75)--(93.55, 80.26)--(95.61, 82.43)--(96.7, 82.3)--(98.47, 82.54)--(101.05, 86.23)--(98.22, 93.14)--(100.55, 101.04)--(102.97, 105.27)--(107.45, 108.16)--(104.04, 132.27)--(104.08, 133.7)--(103.49, 134.62)--(102.5, 136.82)--(104.04, 136.98)--(103.44, 141.15)--(104.17, 143.63)--(108.08, 144.9)--(110.27, 145.35)--(111.35, 145.04)--(113.34, 144.63)--(109.31, 140.79)--(112.69, 137.21)--(111.47, 135.36)--(113.17, 133.67)--(113.34, 130.92)--(116.56, 129.1)--(119.97, 124.37)--(128.41, 119.87)--(133.19, 114.17)--(136.37, 113.08)--(138.56, 109.76)--(141.63, 100.78)--(139.94, 93.61)--(133.56, 91.17)--(129.89, 90.92)--(128.12, 89.29)--(123.75, 83.93)--(119.97, 83.01)--(117.24, 81.38)--(117.85, 80.79)--(116.9, 80.06)--(117.65, 79.02)--(114.24, 79.23)--(110.12, 78.93)--(108.35, 77.69)--(102.27, 80.15)--(102.6, 80.45)--(101.42, 81.66)--(96.3, 80.94)--(95.6, 75.16)--(91.88, 73.8)--(89.69, 73.89)--(91.19, 69.61)--(91.08, 68.3)--(87.73, 69.96)--(81.32, 69.32)--(81.63, 61.96)--(88.41, 60.66)--(88.78, 61.23)--(92.41, 60.31)--(95.93, 65.23)--(96.7, 65.47)--(97.12, 65.14)--(97.12, 59.81)--(100.34, 56.62)--(103.22, 54.85)--(104.21, 50.99)--(106.28, 48.84)--(108.51, 48.83)--(108.23, 48.05)--(111.68, 45.41);
+landmass3 := (309.58, 101.89)--(307.85, 104.82)--(304.23, 104.36)--(301.98, 106.89)--(301.81, 107.2)--(301.39, 106.32)--(297.9, 109.91)--(292.61, 112.27)--(292.42, 116.24)--(291.76, 116.34)--(293.22, 123.3)--(295.54, 125.57)--(300.79, 123.84)--(313.31, 124.74)--(314.35, 125.13)--(314.72, 125.92)--(316.53, 125.74)--(318.45, 127.71)--(324.06, 128.78)--(326.88, 127.94)--(328.82, 125.64)--(331.64, 120.19)--(331.26, 115.24)--(328.34, 111.83)--(327.46, 109.78)--(327.32, 109.75)--(323.91, 106.24)--(320.57, 100.41)--(318.09, 106.52)--(315.29, 105.19)--(314.65, 104.27)--(314.4, 103.64)--(314.38, 101.88)--(314.02, 100.8)--(310.93, 100.72)--(310, 101.21)--(309.58, 101.89);
+landmass4 := (360, 173.94)--(347.31, 173.02)--(337.83, 170.31)--(340.03, 168.66)--(345.63, 168.61)--(346.01, 167.92)--(341.09, 166.89)--(341.61, 165.5)--(343.88, 164.64)--(343.24, 163.51)--(349.37, 161.91)--(322.58, 157.73)--(323.11, 157.14)--(263.4, 156.39)--(263.26, 156.59)--(263.82, 157.03)--(245.18, 163.09)--(245.85, 157.68)--(234.93, 156.8)--(226.52, 156.65)--(194.69, 160.02)--(194.23, 160.12)--(182.27, 160.22)--(175.88, 161.21)--(175.09, 160.92)--(174.87, 161.24)--(171.99, 160.65)--(165.8, 161.33)--(163.91, 162.6)--(161.68, 163.73)--(141.54, 169.39)--(118.58, 172.13)--(116.78, 171.69)--(102.46, 169.67)--(94.78, 168.49)--(97.74, 167.88)--(101.28, 166.75)--(117.86, 164.33)--(118.52, 163.02)--(117.24, 161.46)--(117.41, 160.81)--(114.93, 158.64)--(113.38, 158.53)--(113.67, 158.17)--(112.94, 157.45)--(115.93, 156.83)--(115.81, 156.34)--(116.18, 155.88)--(116.84, 155.67)--(119.7, 154.63)--(119.77, 154.11)--(121.16, 153.99)--(121.76, 153.53)--(116.74, 154)--(113.84, 154.79)--(110.65, 157.28)--(111.18, 157.79)--(111.19, 159.12)--(104.73, 163.13)--(104.3, 163)--(90.27, 162.69)--(86.46, 162.59)--(74.77, 162.74)--(78.14, 164.63)--(64.48, 164.84)--(65.31, 164.46)--(50.04, 164.22)--(50.29, 164.61)--(32.44, 165.76)--(29.52, 166.6)--(27.21, 166.74)--(27.17, 166.97)--(22.41, 166.97)--(23.06, 168.33)--(21.43, 168.63)--(29.78, 169.97)--(27.58, 170.36)--(29.1, 170.81)--(23.15, 171.94)--(24.93, 172.46)--(17.69, 173.06)--(13.37, 172.69)--(3.71, 172.63)--(13.68, 173.98)--(0, 174.21);
+landmass5 := (124.62, 19.08)--(123.98, 19.56)--(126.36, 20.09)--(127.24, 20.59)--(124.98, 23.19)--(130.77, 29.28)--(135.8, 28.99)--(137.84, 25.04)--(141.86, 24.34)--(146.13, 22.18)--(157, 19.51)--(155.91, 17.98)--(155.55, 16.8)--(159.25, 15.48)--(158.44, 14.93)--(159.9, 14.05)--(157.97, 12.46)--(159.52, 10.77)--(159.19, 10.3)--(167.06, 8.42)--(159.95, 8.2)--(156.76, 8.73)--(153.02, 7.87)--(131.44, 7.07)--(130.82, 7.37)--(127.12, 7.44)--(116.94, 8.32)--(111.03, 9.65)--(105.32, 11.75)--(107.03, 12.86)--(108.98, 13.43)--(112.23, 14.12)--(119.83, 14.46)--(121.54, 15.67)--(120.54, 15.91)--(122.91, 16.69)--(121.82, 17.23)--(124.62, 19.08);
+landmass6 := (307.49, 56.47)--(307.06, 57.11)--(308.22, 57.5)--(310.39, 56.79)--(310.75, 57.43)--(312.59, 56.96)--(313.38, 56.17)--(316.84, 55.24)--(317.14, 55.51)--(319.46, 54.34)--(320.21, 51.88)--(320.32, 48.77)--(319.72, 48.29)--(319.35, 47.51)--(322.01, 46.93)--(323.56, 45.58)--(319.79, 44.82)--(319.05, 44.6)--(318.2, 46.06)--(317.67, 48.01)--(318.7, 48.63)--(315.73, 52.34)--(311.83, 54.71)--(307.49, 56.47);
+landmass7 := (172.44, 33.8)--(171.76, 34.44)--(174.73, 35.22)--(173.52, 37.33)--(172.83, 38.17)--(172.56, 39.98)--(179.32, 38.52)--(178.63, 37.06)--(175.74, 33.85)--(176.19, 30.59)--(172.04, 32.2)--(171.52, 33.36)--(172.44, 33.8);
+landmass8 := (222.04, 111.1)--(224.53, 115.35)--(228.6, 106.45)--(226.81, 103.35)--(222.04, 111.1);
+
+%
+% This macro draws contures for a landmass on globe centered on lon,lat
+%
+
+vardef drawLandMass (expr p, lon, lat) =
+ save i, j, k, l, horizon, currentPoint, horizonTimes, outHorizon, inHorizon, visibleContours, pathNumber, horizonArc, arcTimes, resultPath;
+ path resultPath, visibleContours[], horizon, horizonArc;
+ pair currentPoint, horizonTimes[];
+ numeric pathNumber, outHorizon, arcTimes[];
+ horizon := fullcircle scaled 2;
+ pathNumber := 0;
+ outHorizon := -1;
+ inHorizon := -1;
+
+ % In the following loop visible segments of landmass and points of
+ % horizon-crossing are calculated
+ % visibleContours are just what they are called and horizonTimes are
+ % times on horizon circle where visible segment should cross it
+ for i := 0 upto length(p):
+ currentPoint := pointOnGlobe (point i of p, lon, lat);
+ if (horizonOnGlobe (point i of p, lon, lat) < 0):
+ if (unknown visibleContours[pathNumber]):
+ visibleContours[pathNumber] := currentPoint;
+ if (i > 0):
+ outHorizon := xpart(horizon intersectiontimes ((0,0) -- (findHorizonPoint (subpath(i-1, i) of p, lon, lat, 0) scaled 5)));
+ if (outHorizon < inHorizon): outHorizon := outHorizon + 8; fi;
+ horizonTimes[pathNumber - 1] := (inHorizon, outHorizon);
+ fi;
+ else:
+ visibleContours[pathNumber] := visibleContours[pathNumber] -- currentPoint;
+ fi;
+ else:
+ if (known visibleContours[pathNumber]):
+ pathNumber := pathNumber + 1;
+ inHorizon := xpart(horizon intersectiontimes ((0,0) -- (findHorizonPoint (subpath(i, i-1) of p, lon, lat, 0) scaled 5)));
+ fi;
+ fi;
+ endfor;
+ if (unknown visibleContours0):
+ resultPath := (1,0);
+ else:
+ if (unknown visibleContours[pathNumber]): pathNumber := pathNumber - 1; fi;
+ if (unknown horizonTimes[-1]):
+ if (pathNumber > 0):
+ visibleContours0 := visibleContours[pathNumber] -- visibleContours0;
+ fi;
+ pathNumber := pathNumber - 1;
+ else:
+ if (ypart(horizonTimes[-1]) < inHorizon):
+ horizonTimes[pathNumber] := (inHorizon, ypart(horizonTimes[-1]) + 8);
+ else:
+ horizonTimes[pathNumber] := (inHorizon, ypart(horizonTimes[-1]));
+ fi;
+ fi;
+ % In these loops horizon arcs directions should be handled
+ % The idea is that when we have path with no self-intersections arcs should
+ % not cross one another, these conflicts are resolved here
+ % It's important to note, that horizon-time detecting algorithm is
+ % not absolutely precise for now, so at times in will work incorrect.
+ for i := 0 upto pathNumber - 1:
+ for j := i + 1 upto pathNumber:
+ l := 0;
+ for k := -8, 0, 8:
+ if (xpart(horizonTimes[j]) > xpart(horizonTimes[i]) + k) and (xpart(horizonTimes[j]) < ypart(horizonTimes[i]) + k): l := l + 1; fi;
+ if (xpart(horizonTimes[i]) > xpart(horizonTimes[j]) + k) and (xpart(horizonTimes[i]) < ypart(horizonTimes[j]) + k): l := l + 1; fi;
+ endfor;
+ if (l > 1): horizonTimes[j] := (xpart(horizonTimes[j]) + 8, ypart(horizonTimes[j])); fi;
+ endfor;
+ endfor;
+
+ % In the following loop previously calculated segments of a landmass and
+ % arcs of the horizon are sewed together in order
+ resultPath := visibleContours0
+ for i := 1 upto pathNumber + 1:
+ if (known horizonTimes[i-1]): -- (subpath horizonTimes[i-1] of horizon) fi
+ if (i <= pathNumber): -- visibleContours[i] fi
+ endfor
+ fi;
+ resultPath -- cycle
+enddef;
+
+% This thing just converts coordinates on globe rotated by lon, lat to screen coordinates
+
+vardef pointOnGlobe (expr p, lon, lat) =
+ (cosd(lon + xpart(p)) * sind(ypart(p)),
+ cosd(ypart(p)) * cosd(lat)
+ + sind(lon + xpart(p)) * sind(ypart(p)) * sind(lat))
+enddef;
+
+% This one is needed to check if point on globe is in view
+
+vardef horizonOnGlobe (expr p, lon, lat) =
+ (sind(lon + xpart(p)) * cosd(lat) * sind(ypart(p))) - (cosd(ypart(p)) * sind(lat))
+enddef;
+
+% This macro calculates horizon crossing point with given precision (recursion depth).
+% Likely, this could be done analytically, though.
+
+vardef findHorizonPoint (expr p, lon, lat, i) =
+ save selecthalf, returnpoint;
+ pair selecthalf, returnpoint;
+ if (horizonOnGlobe (point 1/2 of p, lon, lat) < 0):
+ selecthalf := (0, 1/2);
+ else:
+ selecthalf := (1/2, 1);
+ fi;
+ if (i < 5):
+ returnpoint := findHorizonPoint (subpath selecthalf of p, lon, lat, i + 1)
+ else:
+ returnpoint := pointOnGlobe (point 1/2 of p, lon, lat);
+ fi;
+ returnpoint
+enddef;
+
+vardef globe (expr s, lon, lat) =
+ save i, p, lm;
+ picture p[];
+ path lm;
+ begingroup
+ save angleToLightnessPP;
+ vardef angleToLightnessPP (expr v) =
+ 1/2(v**3)
+ enddef;
+ p1 := image(draw sphere.l(2s, lat));
+ vardef angleToLightnessPP (expr v) =
+ if (abs(cos(sphlat)) > 7/8 + uniformdeviate (1/20)):
+ 1/4(v**2)
+ else:
+ 1/3(v**2) + 2/3
+ fi
+ enddef;
+ p2 := image(draw sphere.l(2s, lat));
+ endgroup;
+ image(
+ draw fullcircle scaled 2s withpen thinpen;
+ for i := 1 upto 8:
+ lm := drawLandMass(landmass[i], lon + 90, lat) scaled s;
+ p3 := p2;
+ clip p3 to lm;
+ draw p3;
+ thinBrushGenerate (lm,
+ offsetPathTemplate (lm, 0) (
+ 2/3minStrokeWidth + 1/3minStrokeWidth
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(point offsetPathTime of lm) + 1/4pi, abs(point offsetPathTime of lm)/2s)
+ ), 0, point offsetPathTime of lm
+ )
+ ), 0);
+ p1 := p1 maskedWith lm;
+ endfor;
+ draw p1;
+ )
+enddef;
+
+%
+% This macro draws an eye pointed in the direction a (in degrees)
+% Eye is opened at random angle and pupil is scaled randomly by design
+% Scaling below some level, dependent on minStrokeWidth, simplifies image
+%
+
+eyescale := 1/2cm;
+
+vardef eye (expr a) =
+ save s, eyelids, pupil, eyeball, eyelash, loopstep, p, o;
+ path eyelids[], pupil[], eyelash;
+ pair p[];
+ picture eyeball;
+ numeric s, loopstep;
+ o := 10 + (15/(1 + 2**(3/2normaldeviate)));
+ s := eyescale;
+ p1 := (-3/4s, 0);
+ pupil1 := ((subpath (-2, 2) of fullcircle xscaled 3/5) .. (subpath (3, 5) of fullcircle xscaled 2/5) .. cycle) scaled 3/5s;
+ pupil2 := fullcircle scaled (1/3s + uniformdeviate(1/5s)) xscaled 1/3;
+ p2 := ((p1 -- ((1/2s, 0) rotatedabout (p1, o - 5))) intersectionpoint (subpath (0, 4) of pupil1));
+ eyelids1 := (p1 shifted (0, -1/16s)){dir(1/3o)} .. {dir(0)}p2;
+ eyelids2 := p1 {dir(-1/3o)} .. {dir(0)}((1/6s, 0) rotatedabout (p1, -2/3o - 5));
+ eyelids2 := subpath(xpart(eyelids2 intersectiontimes eyelids1), length(eyelids2)) of eyelids2;
+ eyelids3 := (p1){dir(2/3o)} .. tension 3/2 .. {dir(o-1/3o)}p2 rotatedabout (p1, 1/3o + 7);
+ eyelids3 := subpath (1/8, length(eyelids3)) of eyelids3;
+ eyelids4 := (p1 shifted (0, -1/16s)) .. {dir(1/4o - 2/3o)}((1/6s, -1/6s) rotatedabout (p1, -2/3o - 5));
+ eyelids4 := subpath (1/2, length(eyelids4)) of eyelids4;
+ loopstep := length(eyelids1)/20;
+ if (arclength(subpath(0, loopstep) of eyelids1) < 5minStrokeWidth):
+ loopstep := arctime (5minStrokeWidth) of eyelids1;
+ fi;
+ eyeball := image(
+ if (5loopstep <= 1):
+ draw pupil1 withpen thinpen;
+ fill pupil2;
+ for i := 0 step 5loopstep until length pupil1:
+ draw brush ((point i of pupil1) -- (point i + 6 of pupil2 scaled 5/6 yscaled 1/2))(cos(offsetPathLength*1/2pi)*2minStrokeWidth);
+ endfor;
+ else:
+ fill pupil1;
+ fi;
+ );
+ clip eyeball to (eyelids1{(1, 0)} .. (s, 0) .. {-1, 0}reverse(eyelids2) -- cycle);
+ eyeball := eyeball maskedWith ((fullcircle scaled (1/4s) xscaled 1/2 rotated 2 shifted (1/12s, 0) rotatedabout (p1, 1/3o + 2)));
+ image(
+ draw brush (eyelids1 .. tension 2.5 .. reverse (eyelids3))((1-offsetPathLength)*2minStrokeWidth);
+ draw brush (eyelids2)((offsetPathLength)*2minStrokeWidth);
+ draw brush (eyelids4)(sin(offsetPathLength*pi)*minStrokeWidth);
+ draw eyeball;
+ for i := length(eyelids1) step -loopstep until 0:
+ eyelash := (point i of eyelids1) {dir(angle(direction i of eyelids1) - 60 + 50*(i/length(eyelids1)))}
+ .. (point i of eyelids1) shifted (1/16s + (i/length(eyelids1))*1/4s, (i/length(eyelids1))*1/5s);
+ if (arclength(eyelash) > 2/3minDashStrokeLength):
+ draw brush (eyelash shifted ((-1/32s, uniformdeviate(1/12s)) scaled ((length(eyelids1)-i)/length(eyelids1))) )(minStrokeWidth + (1-offsetPathLength)*minStrokeWidth);
+ fi;
+ endfor;
+ for i := length(eyelids2) step -3/2loopstep until 0:
+ eyelash := (point i of eyelids2) {dir(angle(direction i of eyelids2) + 20 - 40*(i/length(eyelids2)))}
+ .. (point i of eyelids2) shifted (1/16s + (i/length(eyelids2))**2*1/7s, 1/16s - (i/length(eyelids2))*1/5s);
+ if (arclength(eyelash) > minDashStrokeLength):
+ draw brush (eyelash shifted (-1/32s, -uniformdeviate(1/24s)))(minStrokeWidth + (1-offsetPathLength)*minStrokeWidth);
+ fi;
+ endfor;
+ ) if cosd(a) < 0: yscaled -1 rotated (a) else: rotated a fi
+enddef;
+
+%
+% This macro draws solid surface
+%
+
+vardef solidSurface (expr p) =
+ save q, s, d, stripes;
+ path q, s;
+ picture stripes;
+ q := offsetPath(p) (-1/4cm);
+ s := p -- reverse(q) -- cycle;
+ image(
+ draw solid (s, 45, 0);
+ draw p withpen thinpen;
+ )
+enddef;
+
+vardef solid (expr p, a, t) =
+ save stripes, stripeskind, d, i, j, c;
+ picture stripes, stripeskind;
+ pair c;
+ stripes := image(
+ d1 := abs(ulcorner(p rotated (90 - a)) - urcorner(p rotated (90 - a)));
+ d2 := abs(ulcorner(p rotated (90 - a)) - llcorner(p rotated (90 - a)));
+ stripeskind := dashpattern (on 1mm);
+ c := 1/2[ulcorner(p rotated (90 - a)), lrcorner(p rotated (90 - a))] rotated (a - 90);
+ for i:= 0 step (3/2shadingDensity)/d1 until 1:
+ if (t = 1):
+ j := round(i*d1/(3/2shadingDensity));
+ if (j mod 4) = 0:
+ stripeskind := dashpattern (on 8shadingDensity off 4shadingDensity);
+ fi;
+ if ((j mod 4) = 1) or ((j mod 4) = 3):
+ stripeskind := dashpattern (off 1shadingDensity on 6shadingDensity off 5shadingDensity);
+ fi;
+ if (j mod 4) = 2:
+ stripeskind := dashpattern (on 0 off 12shadingDensity);
+ fi;
+ fi;
+ draw ((dir(a) scaled 1/2d2) -- (dir(a + 180) scaled 1/2d2)) shifted c shifted i[dir(a + 90) scaled 1/2d1, dir(a -90) scaled 1/2d1] withpen thinpen
+ dashed stripeskind;
+ endfor;
+ );
+ clip stripes to p;
+ stripes
+enddef;
+
+%
+% Returns a picture of shaded gradient inside shape p at an angle a
+%
+
+vardef gradientShade (expr p, a) =
+ save stripes, stripeshd, d, i, j, s;
+ picture stripes;
+ path s;
+ stripes := image(
+ d1 := abs(ulcorner(p rotated (90 - a)) - urcorner(p rotated (90 - a)));
+ d2 := abs(ulcorner(p rotated (90 - a)) - llcorner(p rotated (90 - a)));
+ for i:= 0 step (shadingDensity)/d1 until 1:
+ s := ((dir(a) scaled 1/2d2) -- (dir(a + 180) scaled 1/2d2)) shifted 1/2[ulcorner(p), lrcorner(p)] shifted i[dir(a + 90) scaled 1/2d1, dir(a -90) scaled 1/2d1];
+ stripeshd := 1/4 + 3/4i;
+ draw brush(s)(minStrokeWidth*stripeshd);
+ endfor;
+ );
+ clip stripes to p;
+ stripes
+enddef;
+
+%
+% This one draws a spring between points p and q with n steps
+% if stretched more than possible, displayed as a straight line
+% if compressed too much, displayed as having less steps
+%
+
+springwidth := 1/8cm;
+
+vardef spring (expr p, q, n) =
+ save sp, ss, t, x, springstep, springcoef, springsegment;
+ transform t;
+ path ss[];
+ pair sp;
+ picture springsegment;
+ springstep := (arclength(p--q) - 2springwidth)/(n+1);
+ if (springstep < 6minStrokeWidth): springstep := arclength(p--q)/round(arclength(p--q)/6minStrokeWidth); fi;
+ if (springstep < (springwidth*pi)):
+ springcoef := (1-(springstep/(springwidth*pi)));
+ else:
+ springcoef := 0;
+ fi;
+ image(
+ for i := 0 step 30 until 360:
+ sp := ((cosd(i - 90), sind(i - 90)) scaled springwidth xscaled 1/4 yscaled springcoef) shifted (springstep*(i/360) - 1/2springstep, 0);
+ if (i = 0):
+ ss1 := sp;
+ else:
+ ss1 := ss1 -- sp;
+ fi;
+ endfor;
+ ss2 := subpath (0, 6) of ss1;
+ ss3 := subpath (6, 12) of ss1;
+ ss4 := subpath (0, ypart(ss2 shifted (-3minStrokeWidth, 0) intersectiontimes ss3)) of ss3;
+ x := ypart(ss2 shifted (3minStrokeWidth, 0) intersectiontimes ss3);
+ if (x > 0):
+ ss5 := subpath (x, length(ss3)) of ss3;
+ else:
+ ss5 := point length(ss3) of ss3;
+ fi;
+ if (xpart(llcorner(ss4)) - 3minStrokeWidth < xpart(urcorner(ss2 shifted (-springstep, 0)))):
+ x := ypart((subpath (3, 6) of ss2 shifted (-springstep + 3minStrokeWidth, 0)) intersectiontimes ss4);
+ if (x > 0):
+ ss6 := subpath (0, x) of ss4;
+ else:
+ ss6 := point 0 of ss4;
+ fi;
+ x := ypart((subpath (0, 3) of ss2 shifted (-springstep + 3minStrokeWidth, 0)) intersectiontimes ss4);
+ if (x > 0):
+ ss7 := subpath (x, length(ss4)) of ss4;
+ else:
+ ss7 := point length(ss4) of ss4;
+ fi;
+ fi;
+ springsegment := image(
+ draw brush (ss2)(minStrokeWidth + sin(offsetPathLength*pi)*minStrokeWidth);
+ if (unknown(ss6)):
+ if (arclength(ss4) > minStrokeWidth): draw ss4 withpen thinpen; fi;
+ else:
+ if (arclength(ss6) > minStrokeWidth): draw ss6 withpen thinpen; fi
+ if (arclength(ss7) > minStrokeWidth): draw ss7 withpen thinpen; fi
+ fi;
+ if (arclength(ss5) > minStrokeWidth): draw ss5 withpen thinpen; fi;
+ );
+ ss8 := (ss2 shifted (-2minStrokeWidth, 0)) rotated angle(q-p) shifted ((springwidth + 1/2springstep)/arclength(p--q))[p, q];
+ for i := springwidth + 1/2springstep step springstep until arclength(p--q) - springwidth - 1/2springstep + 1:
+ t := identity rotated angle(q-p) shifted (i/arclength(p--q))[p, q];
+ draw springsegment transformed t;
+ if (i <= springwidth + 1/2springstep + 2/3springwidth):
+ ss9 := ss3 transformed t;
+ ss10 := subpath (
+ xpart(ss9 intersectiontimes (subpath (0, 3) of ss8)),
+ xpart(ss9 intersectiontimes (subpath (3, 6) of ss8))
+ ) of ss9;
+ if (arclength(ss10) > minStrokeWidth): draw ss10 withpen thinpen; fi;
+ fi;
+ endfor;
+ draw brush (((springwidth)/arclength(p--q))[p, q] shifted (dir(angle(p-q) + 90)*springwidth * springcoef){(p-q)} .. {(p-q)}p)(minStrokeWidth);
+ draw brush (((springwidth)/arclength(p--q))[q, p] shifted (dir(angle(p-q) + 90)*springwidth * springcoef){(q-p)} .. {(q-p)}q)(minStrokeWidth);
+ )
+enddef;
+
+%
+% This macro draws some kind of weight. Not very nice one at the moment
+%
+
+vardef weight.h (expr h) =
+ save auricle, q, r;
+ path q[];
+ auricle.d := 2mm;
+ auricle.t := 2shadingDensity;
+ r := 2/5(h-auricle.d);
+ image(
+ q0 := offsetPathSubdivide((0, -h) -- (0, -auricle.d - 1/6h));
+ q1 := offsetPathTemplate(q0, 0)(r-(offsetPathLength*(1/8r)));
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeGenerate (q2, q3, q1, 0);
+ draw reverse(q2) -- q3 withpen thinpen;
+ q0 := offsetPathSubdivide((0, -auricle.d - 1/6h) -- (0, -auricle.d));
+ q1 := offsetPathTemplate(q0, 0)(2/8r + 5/8r*(sqrt(1-offsetPathLength**2)));
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeGenerateAlt (q2, q3, q1);
+ draw q3 -- reverse(q2) withpen thinpen;
+ q5 := offsetPathSubdivide(point 0 of q3 -- point 0 of q2);
+ q6 := tube.e((0,0) -- (0, -3/2auricle.t))(1/2auricle.t);
+ draw image(
+ q4 := (((0, -1/2) {dir(90)} .. (1/2, 1/2) .. (0, 1) .. {dir(-90)}(-1/2, 1/4)) shifted (0, -1)) scaled 2/3auricle.d;
+ draw shadedEdge(tube.e(q4) (1/4auricle.t)) shifted (0, -1/2auricle.t);
+ ) maskedWith (q3 -- reverse(q2) -- (q2 yscaled 0 shifted (0, -h)) -- (reverse(q3) yscaled 0 shifted (0, -h)) -- cycle)
+ maskedWith q6;
+ draw shadedEdge(q6);
+ thinBrushGenerate (q5,
+ offsetPathTemplate (q5, 0) (
+ minDashStrokeWidth + minStrokeWidth
+ * angleToLightness(
+ (arccos(1 - offsetPathLength*2), 1/2pi)
+ , 0, point offsetPathTime of q5
+ )
+ ), 0);
+ )
+enddef;
+
+vardef weight.s (expr h) =
+ save q,r;
+ path q[];
+ r := 2/5h;
+ image(
+ q0 := offsetPathSubdivide((0, 0) -- (0, h-2/3r));
+ q1 := offsetPathTemplate(q0, 0)(r);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeGenerate (q2, q3, q1, 0);
+ draw reverse(q2)--q3 withpen thinpen;
+ q0 := offsetPathSubdivide((0, h-2/3r) -- (0, h - 1/8r));
+ q1 := offsetPathTemplate(q0, 0)(r-sqrt(1- (1- offsetPathLength*2)**2)*1/3r - 1/6r*offsetPathLength);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeGenerateAlt (q2, q3, q1);
+ draw q2 withpen thinpen;
+ draw q3 withpen thinpen;
+ q0 := offsetPathSubdivide((0, h-1/8r) -- (0, h));
+ q1 := offsetPathTemplate(q0, 0)((r-1/6r)+sqrt(1- (1- offsetPathLength*2)**2)*1/16r);
+ q2 := offsetPathGenerate (q0, q1, 0);
+ q3 := offsetPathGenerate (q0, q1 yscaled -1, 0);
+ tubeGenerateAlt (q2, q3, q1);
+ draw q2 --reverse(q3) withpen thinpen;
+ )
+enddef;
+
+%
+% This macro makes a lens-shaped clockwise path with radii
+% r = (left radius, right radius), thickness t and diameter d
+%
+
+vardef lens (expr r, t, d, s) =
+ save p, q, m, c;
+ pair c[];
+ path p[], q[];
+ if (xpart(r) = infinity):
+ p1 := (0, d) -- (0, -d);
+ else:
+ p1 := subpath (2, 6) of fullcircle scaled 2xpart(r);
+ fi;
+ if (ypart(r) = infinity):
+ p2 := (0, d) -- (0, -d);
+ else:
+ p2 := subpath (-2, 2) of fullcircle scaled 2ypart(r);
+ fi;
+ q1 := (min(xpart(ulcorner(p1)), xpart(ulcorner(p2))) - 1, -1/2d)--(max(xpart(urcorner(p1)), xpart(urcorner(p2))) + 1,-1/2d);
+ q2 := q1 shifted (0, d);
+ q3 := q1 shifted (0, 1/2d);
+ c1 := p1 intersectiontimes q1;
+ c2 := p1 intersectiontimes q2;
+ c3 := p2 intersectiontimes q2;
+ c4 := p2 intersectiontimes q1;
+ if (xpart(c1) > 0):
+ p1 := subpath (xpart(c1), xpart(c2)) of p1;
+ fi;
+ if (xpart(c3) > 0):
+ p2 := subpath (xpart(c3), xpart(c4)) of p2;
+ fi;
+ p1 := p1 shifted (-xpart(point xpart(p1 intersectiontimes q3) of p1), 0);
+ p2 := p2 shifted (-xpart(point xpart(p2 intersectiontimes q3) of p2) + t, 0);
+ reverse(p1--p2--cycle) scaled s
+enddef;
+
+%
+% This one returns a picture of a pulley with diameter d and it's support rotated
+% at angle a. pulleyOutline path changes every time
+%
+
+path pulleyOutline;
+numeric pulleySupportSize;
+pulleySupportSize := 2/3;
+
+vardef pulley (expr d, a) =
+ save pw, p, r;
+ picture pw;
+ path p[];
+ r1 := 3/5d;
+ r2 := 1/6d;
+ image(
+ p0 := fullcircle scaled d;
+ p1 := (subpath (3, 9) of fullcircle) scaled r1;
+ p0 := subpath (
+ xpart(p0 intersectiontimes ((point 0 of p1) -- (point 0 of p1 shifted (0, d)))),
+ 8 + xpart(p0 intersectiontimes ((point 0 of reverse(p1)) -- (point 0 of reverse(p1) shifted (0, d)))))
+ of p0;
+ p0 := ((xpart(point 0 of reverse(p0)), pulleySupportSize*d) -- (xpart(point 0 of p0), pulleySupportSize*d) -- p0 -- cycle) rotated a;
+ pulleyOutline := p0;
+ p1 := (p1 -- (xpart(point 0 of reverse(p1)), pulleySupportSize*d) -- (xpart(point 0 of p1), pulleySupportSize*d) -- cycle) rotated a;
+ pw := pulleyWheel(d) maskedWith p1;
+ draw pw;
+ draw p1 withpen thinpen;
+ draw shadedEdge(reverse(fullcircle) scaled r2);
+ )
+enddef;
+
+vardef pulleyWheel (expr d) =
+ save pw, r, i;
+ picture pw;
+ r1 := 7/9d;
+ r2 := 8/9d;
+ r3 := 3/5d;
+ r4 := 1/8d;
+ if (r2-r1) > shadingDensity:
+ pw := image(
+ for i := r3 step 2shadingDensity until r2:
+ if (i <= r1) or (i >= r2):
+ thinBrushGenerate (fullcircle scaled i,
+ offsetPathTemplate (fullcircle scaled i, 0) (
+ 2/3minStrokeWidth + minStrokeWidth
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(direction offsetPathTime of fullcircle), i/4d)
+ ), 0, point offsetPathTime of fullcircle scaled i
+ )
+ ), 0);
+ else:
+ thinBrushGenerate (fullcircle scaled i,
+ offsetPathTemplate (fullcircle scaled i, 0) (
+ 1/4minStrokeWidth + minStrokeWidth
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(direction offsetPathTime of fullcircle) + pi, 1/2)
+ ), 0, point offsetPathTime of fullcircle scaled i
+ )
+ ), 0);
+ fi;
+ endfor;
+ draw brush (fullcircle scaled r1)(minStrokeWidth);
+ draw brush (fullcircle scaled r2)(minStrokeWidth);
+ draw fullcircle scaled d withpen thinpen;
+ draw fullcircle scaled r3 withpen thinpen;
+ draw shadedEdge(reverse(fullcircle) scaled r4);
+ );
+ else:
+ pw := image(
+ draw shadedEdge (reverse(fullcircle) scaled r1);
+ draw fullcircle scaled d withpen thinpen;
+ draw fullcircle scaled r4 withpen thickpen;
+ )
+ fi;
+ pw
+enddef;
+
+%
+% This macro draws a wheel
+%
+
+vardef wheel (expr d, a) =
+ save pc, p, r, i;
+ picture pc[];
+ path p[];
+ r1 := 2/8d;
+ r2 := d-6minStrokeWidth;
+ r3 := 7/8d-2shadingDensity;
+ if r1 > 3shadingDensity:
+ pc1 := image(
+ for i := r1 step 2shadingDensity until r3:
+ thinBrushGenerate (fullcircle scaled i,
+ offsetPathTemplate (fullcircle scaled i, 0) (
+ 2/3minStrokeWidth + minStrokeWidth
+ * angleToLightness(
+ sphereAngleToAbsoulteAngle(
+ (angleRad(direction offsetPathTime of fullcircle) + pi, i/4d)
+ ), 0, point offsetPathTime of fullcircle scaled i
+ )
+ ), 0);
+ endfor;
+ draw sphere.c(r1);
+ draw shadedEdge (reverse(fullcircle) scaled r3);
+ );
+ else:
+ pc1 := image(
+ draw shadedEdge (fullcircle scaled d);
+ draw shadedEdge (fullcircle scaled r1);
+ draw shadedEdge (reverse(fullcircle) scaled r2);
+ );
+ fi;
+ pc2 := image(fill fullcircle scaled d;) maskedWith (fullcircle scaled r2);
+ pc3 := image(
+ p1 := reverse((1/3d, 1/4d) -- (-1/3d, 1/4d) -- (-1/2d, 1/2d) -- (1/2d, 1/2d) -- cycle) rotated a;
+ draw p1 withpen thinpen;
+ draw gradientShade(p1, 180);
+ );
+ pc3 := pc3 maskedWith (fullcircle scaled d);
+ image(
+ draw pc1;
+ draw pc2;
+ draw pc3;
+ )
+enddef;
+
+%
+% These macros are for drawing wood texture. A bunch of wood-related global
+% variables are also here.
+%
+
+woodBlockRes := 1/3mm;
+woodBlockDetail := 1/5;
+woodBlockYRdensity := 1/24;
+woodKnotAngle := 1/3pi;
+woodKnotRadius := 1/8cm;
+woodKnotDensity := 2cm;
+
+% wField returns a value on a scalar field, that is surface of year ring
+
+vardef wField (suffix wk)(expr i, j, cs, nwk)=
+ save x, y, csx, csy, ba, a, r, outputValue, k, bd;
+ csx := xpart(cs);
+ csy := ypart(cs);
+ x := i*woodBlockDetail;
+ y := j*woodBlockDetail;
+ bd := 1/2(woodKnotRadius/woodBlockRes)*woodBlockDetail;
+ outputValue := 0;
+ for k := 0 upto nwk:
+ r := (abs(((x, y) shifted -wk[k]) yscaled (sin(woodKnotAngle))));
+ a := angleRad((x, y) shifted -wk[k]);
+ if (r >= 2bd) and (1/2r-bd < 8):
+ outputValue := outputValue + ((sqrt(1/2r-bd)/(3**(1/2r-bd)))*(sin(woodKnotAngle)*(1/2sin(-a)) + 1)*(1/3 + 2/3abs(cos(a))))**2;
+ elseif (r < 2bd):
+ outputValue := outputValue - 10sqrt(1-(r/2bd)**4);
+ fi;
+ outputValue := outputValue + 1/64cos(2pi*1/30r);
+ endfor;
+ outputValue := outputValue - (i*woodBlockYRdensity)/5 + 1/32sin(pi*i/xpart(cs) + 4pi*j/ypart(cs));
+ outputValue
+enddef;
+
+% woodBlock generates coordinates of knots, calls wField to
+% generate matrix of heights (one for all years, that's simplification, of course)
+% and then calls isoLines for each year ring (shifting values in matrix by woodBlockYRdensity)
+
+vardef woodBlock (expr w, l) =
+ save wood, wKnot, nwKnot, p, q, i, j, k, cl, tr, wS, lS;
+ numeric wood[][];
+ pair wKnot[];
+ path q;
+ picture p;
+ if (l > w):
+ wS := round(w/woodBlockRes);
+ lS := round(l/woodBlockRes);
+ else:
+ wS := round(l/woodBlockRes);
+ lS := round(w/woodBlockRes);
+ fi;
+ image(
+ p := image(
+ i := -1;
+ j := 0;
+ forever:
+ wKnot[-1] := (uniformdeviate(wS*woodBlockDetail + woodKnotRadius*woodBlockDetail/woodBlockRes), uniformdeviate(lS*woodBlockDetail + woodKnotRadius*woodBlockDetail/woodBlockRes)) shifted (-1/2woodKnotRadius*woodBlockDetail/woodBlockRes, -1/2woodKnotRadius*woodBlockDetail/woodBlockRes);
+ cl := 0;
+ if (i > -1):
+ for k := 0 step 1 until i:
+ if (woodBlockRes*abs(wKnot[k]-wKnot[-1])/woodBlockDetail) < woodKnotDensity:
+ cl := 1;
+ fi;
+ endfor;
+ fi;
+ if cl > 0:
+ j := j + 1;
+ else:
+ i := i + 1;
+ wKnot[i] := wKnot[-1];
+ for tr := 2woodKnotRadius step -8minStrokeWidth until 2minStrokeWidth:
+ draw brush(
+ ((fullcircle scaled tr yscaled (1/sin(woodKnotAngle))) shifted (woodBlockRes*wKnot[i]/woodBlockDetail))
+ )(
+ minStrokeWidth*(1/2+abs(sin(woodKnotAngle))*abs(sin(angleRad(point offsetPathTime of fullcircle))))
+ );
+ endfor;
+ fi;
+ exitif (j >= 10) or (i >= 1/2((w/cm)*(l*cm))/(woodKnotDensity/cm));
+ endfor;
+ nwKnot := i;
+ for i := 0 step 1 until wS:
+ k := uniformdeviate(1/8woodBlockYRdensity);
+ for j := 0 step 1 until lS:
+ wood[i][j] := wField (wKnot)(i, j, (wS, lS), nwKnot) + k;
+ endfor;
+ endfor;
+ for i := -wS/(80woodBlockYRdensity) - 2 upto wS/(80woodBlockYRdensity) + 2:
+ draw isoLines(wood)((wS, lS), woodBlockYRdensity*i + uniformdeviate(1/8woodBlockYRdensity), woodBlockRes);
+ endfor;
+ );
+ q := (0, 0) -- (w, 0) -- (w, l) -- (0, l) -- cycle;
+ if (w > l): q := q xscaled -1 rotated -90; fi;
+ clip p to q;
+ draw p;
+ draw q withpen thinpen;
+ ) if (l < w): xscaled -1 rotated -90 fi
+enddef;
+
+% woodenThing fits a woodBlock into thingOutline at a given woodAngle
+
+vardef woodenThing (expr thingOutline, woodAngle) =
+ save shiftedThing, thingOrigin, thingWoodBlock;
+ path shiftedThing;
+ pair thingOrigin;
+ picture thingWoodBlock;
+ shiftedThing := thingOutline rotated -woodAngle;
+ thingOrigin := llcorner(shiftedThing);
+ shiftedThing := shiftedThing shifted -thingOrigin;
+ thingWoodBlock := woodBlock(xpart(urcorner(shiftedThing)), ypart(urcorner(shiftedThing)));
+ clip thingWoodBlock to shiftedThing;
+ thingWoodBlock := (thingWoodBlock shifted thingOrigin) rotated woodAngle;
+ image(
+ draw thingOutline withpen thinpen;
+ draw thingWoodBlock;
+ )
+enddef;
+
+%
+% This part is related to knots
+%
+
+% lists are only used in knots so far.
+% The following two macros are taken from byrne.mp
+
+vardef appendList@#(suffix listName)(expr valueToAdd, whereToAdd, omitDuplicates) =
+ save v, valueExists;
+ string v;
+ boolean valueExists;
+ valueExists := false;
+ if str @# = "":
+ if not string listName:
+ string listName;
+ fi;
+ else:
+ if not string listName0:
+ string listName[];
+ fi;
+ fi;
+ if unknown listName@#:
+ listName@# := "";
+ fi;
+ if omitDuplicates:
+ for i=scantokens(listName@#):
+ if (i = valueToAdd):
+ valueExists := true;
+ fi;
+ endfor;
+ fi;
+ if not valueExists:
+ if string valueToAdd:
+ v := valueToAdd;
+ else:
+ v := decimal(valueToAdd);
+ fi;
+ if length(listName@#) = 0:
+ listName@# := v;
+ else:
+ if (whereToAdd = 1):
+ listName@# := listName@# & ", " & v;
+ else:
+ listName@# := v & ", " & listName@#;
+ fi;
+ fi;
+ fi;
+enddef;
+
+vardef sortList (expr listToSort, ascending) =
+ save nPre, nPost, pivot, isSorted, lastValue, preList, postList, rv;
+ numeric nPre, nPost, pivot;
+ boolean isSorted;
+ string preList, postList, rv;
+ nPre := 0;
+ nPost := 0;
+ isSorted := true;
+ if ascending:
+ lastValue := -infinity;
+ else:
+ lastValue := infinity;
+ fi;
+ for i=scantokens(listToSort):
+ if (unknown pivot):
+ pivot := i;
+ fi;
+ if ((i < pivot) and ascending) or ((i > pivot) and not ascending):
+ appendList (preList, i, -1, false);
+ nPre := nPre + 1;
+ else:
+ appendList (postList, i, -1, false);
+ nPost := nPost + 1;
+ fi;
+ if ((lastValue > i) and ascending) or ((lastValue < i) and not ascending):
+ isSorted := false;
+ fi;
+ lastValue := i;
+ endfor;
+ if isSorted:
+ rv := listToSort;
+ else:
+ if nPre > 1:
+ preList := sortList(preList, ascending);
+ fi;
+ if nPre > 0:
+ preList := preList & ", ";
+ else:
+ preList := "";
+ fi;
+ if nPost > 1:
+ postList := sortList(postList, ascending);
+ fi;
+ rv := preList & postList;
+ fi;
+ rv
+enddef;
+
+
+% When looking for intersections, knot is browsed with knotStepSize step.
+% Affects nothing interesting.
+numeric knotStepSize;
+knotStepSize := 1/8;
+
+vardef knotFromStrands (suffix knotName) =
+ save slidingSegment, timeToAdd, pathSegments, intTimes, tSegWidth, tSegStyle, numberOfSegments, segmentWidth, totalNumberOfSegments, intersections, intersectionsList, layerContents, layersList, b, e, n, layerContents, segmentPicture;
+ save shadowsEnabled, allShadowPaths, totalNumberOfShadows, numberOfShadows, shadowPath, tmpShadows;
+ boolean shadowsEnabled;
+ path shadowPath[], allShadowPaths[];
+ numeric timeToAdd, numberOfShadows, totalNumberOfShadows;
+ totalNumberOfShadows := -1;
+ tmpShadows := -1;
+ path inspectedPath, slidingSegment, pathSegments[];
+ pair intTimes[];
+ numeric intersections[], numberOfSegments[], segmentWidth[], totalNumberOfSegments, tSegWidth, b, e, n;
+ picture layerPicture[];
+ string layerContents[], segmentStyle[], tSegStyle;
+ totalNumberOfSegments := 0;
+ for sNa := 1 step 1 until knotName.nStrands:
+ inspectedPath := knotName.strandPath[sNa];
+ tSegWidth := knotName.strandWidth[sNa];
+ tSegStyle := knotName.strandStyle[sNa];
+ for sNb := 1 step 1 until knotName.nStrands:
+ for i := -knotStepSize step knotStepSize until length(knotName.strandPath[sNb]):
+ slidingSegment := subpath (i, i + 2knotStepSize) of knotName.strandPath[sNb];
+ intTimes0 := (inspectedPath firstIntersectionTimes slidingSegment);
+ intTimes1 := (reverse(inspectedPath) firstIntersectionTimes slidingSegment);
+ if (sNb = sNa):
+ if (xpart(intTimes0) >= i)
+ and (xpart(intTimes0) <= i + 2knotStepSize):
+ intTimes0 := (-1, -1);
+ fi;
+ if ((length(inspectedPath) - xpart(intTimes1)) >= i)
+ and ((length(inspectedPath) - xpart(intTimes1)) <= i + 2knotStepSize):
+ intTimes1 := (-1, -1);
+ fi;
+ if (i+knotStepSize >= length(inspectedPath)):
+ if (xpart(intTimes0) <= knotStepSize)
+ or (xpart(intTimes0) = length(inspectedPath)):
+ intTimes0 := (-1, -1);
+ fi;
+ if ((length(inspectedPath) - xpart(intTimes1)) <= knotStepSize)
+ or (xpart(intTimes1) = 0):
+ intTimes1 := (-1, -1);
+ fi;
+ fi;
+ if (i-knotStepSize <= length(inspectedPath)):
+ if (xpart(intTimes0) >= (length(inspectedPath) - knotStepSize))
+ or (xpart(intTimes0) = 0):
+ intTimes0 := (-1, -1);
+ fi;
+ if ((length(inspectedPath) - xpart(intTimes1)) >= (length(inspectedPath) - knotStepSize))
+ or (xpart(intTimes1) = length(inspectedPath)):
+ intTimes1 := (-1, -1);
+ fi;
+ fi;
+ fi;
+ timeToAdd := -1;
+ if ((ypart(intTimes0) > 0) and (ypart(intTimes0) < length(slidingSegment)))
+ and ((xpart(intTimes0) >= 0) and (xpart(intTimes0) <= length(inspectedPath)))
+ and ((sNb <> sNa) or ((xpart(intTimes0) < i) or (xpart(intTimes0) > i + 1))):
+ timeToAdd := xpart(intTimes0);
+ elseif (sNb = sNa):
+ if ((ypart(intTimes1) > 0) and (ypart(intTimes1) < length(slidingSegment)))
+ and ((xpart(intTimes1) >= 0) and (xpart(intTimes1) <= length(inspectedPath)))
+ and ((length(inspectedPath) - xpart(intTimes1) < i) or (length(inspectedPath) - xpart(intTimes1) > i + 1)):
+ timeToAdd := length(inspectedPath) - xpart(intTimes1);
+ fi;
+ fi;
+ if (timeToAdd >= 0):
+ if (timeToAdd = length(inspectedPath)):
+ timeToAdd := 0;
+ fi;
+ appendList[sNa](intersectionsList, round(timeToAdd*10)/10, 1, true);
+ fi;
+ endfor;
+ endfor;
+ if known intersectionsList[sNa]:
+ numberOfSegments[sNa] := 0;
+ for i := scantokens(sortList(intersectionsList[sNa], true)):
+ numberOfSegments[sNa] := numberOfSegments[sNa] + 1;
+ intersections[numberOfSegments[sNa]] := i;
+ endfor;
+ intersections[0] := 0;
+ if (not cycle knotName.strandPath[sNa]):
+ intersections[numberOfSegments[sNa] + 1] := length(knotName.strandPath[sNa]);
+ fi;
+ for i := 1 step 1 until numberOfSegments[sNa]:
+ totalNumberOfSegments := totalNumberOfSegments + 1;
+ if (i > 1):
+ b := 1/2[intersections[i-1], intersections[i]];
+ else:
+ if (not cycle knotName.strandPath[sNa]):
+ b := 0;
+ else:
+ b := 1/2[intersections[numberOfSegments[sNa]] - length(knotName.strandPath[sNa]), intersections[i]];
+ fi;
+ fi;
+ if (i < numberOfSegments[sNa]):
+ e := 1/2[intersections[i], intersections[i+1]];
+ else:
+ if (not cycle knotName.strandPath[sNa]):
+ e := length(inspectedPath);
+ else:
+ e := 1/2[intersections[i], intersections[1] + length(knotName.strandPath[sNa])];
+ fi;
+ fi;
+ pathSegments[totalNumberOfSegments] := subpath (b, e) of inspectedPath;
+ if (length(pathSegments[totalNumberOfSegments])<=2):
+ pathSegments[totalNumberOfSegments] := pathSubdivide(pathSegments[totalNumberOfSegments], 2);
+ fi;
+ segmentWidth[totalNumberOfSegments] := tSegWidth;
+ segmentStyle[totalNumberOfSegments] := tSegStyle;
+ endfor;
+ else:
+ totalNumberOfSegments := totalNumberOfSegments + 1;
+ numberOfSegments[sNa] := 1;
+ pathSegments[totalNumberOfSegments] := inspectedPath;
+ segmentWidth[totalNumberOfSegments] := tSegWidth;
+ segmentStyle[totalNumberOfSegments] := tSegStyle;
+ fi;
+ n := 0;
+ for i := scantokens(knotName.intLayers[sNa]):
+ n := n + 1;
+ if (n <= numberOfSegments[sNa]):
+ appendList[i](layerContents, totalNumberOfSegments - numberOfSegments[sNa] + n, 1, true);
+ appendList(layersList, i, 1, true);
+ fi;
+ endfor;
+ if n > 0:
+ if n < numberOfSegments[sNa]:
+ for i := n + 1 step 1 until numberOfSegments[sNa]:
+ appendList0(layerContents, totalNumberOfSegments - numberOfSegments[sNa] + i, 1, true);
+ endfor;
+ appendList(layersList, 0, 1, true);
+ fi;
+ else:
+ for i := 1 step 1 until numberOfSegments[sNa]:
+ appendList0(layerContents, totalNumberOfSegments - numberOfSegments[sNa] + i, 1, true);
+ endfor;
+ appendList(layersList, 0, 1, true);
+ fi;
+ endfor;
+ image(
+ for i := scantokens(sortList(layersList, false)):
+ layerPicture[i] := image(
+ for j := scantokens(layerContents[i]):
+ numberOfShadows := -1;
+ shadowsEnabled := false;
+ for k := 0 step 1 until totalNumberOfShadows:
+ if xpart((subpath (1/10, length(pathSegments[j]) - 1/10) of pathSegments[j])
+ intersectiontimes allShadowPaths[k]) > 0:
+ shadowsEnabled := true;
+ numberOfShadows := numberOfShadows + 1;
+ shadowPath[numberOfShadows] := allShadowPaths[k];
+ shadowDepth[numberOfShadows] := 3/2segmentWidth[j];
+ fi;
+ endfor;
+ save drawTubeEnds;
+ boolean drawTubeEnds;
+ drawTubeEnds := false;
+ draw tube.scantokens(segmentStyle[j])(pathSegments[j])(segmentWidth[j]) if segmentStyle[j] = "e": withpen thickpen fi;
+ tmpShadows := tmpShadows + 1;
+ allShadowPaths[tmpShadows] := tubeOutline;
+ endfor;
+ );
+ for j := 0 step 1 until totalNumberOfShadows:
+ layerPicture[i] := layerPicture[i] maskedWith allShadowPaths[j];
+ endfor;
+ totalNumberOfShadows := tmpShadows;
+ endfor;
+ for i := scantokens(sortList(layersList, true)):
+ draw layerPicture[i];
+ endfor;
+ )
+enddef;
+
+vardef addStrandToKnot (suffix knotName) (expr p, w, s, intersectionLayers) =
+ save n;
+ if not known knotName.nStrands:
+ numeric knotName.nStrands;
+ knotName.nStrands := 0;
+ fi;
+ if not path knotName.strandPath0:
+ path knotName.strandPath[];
+ fi;
+ if not numeric knotName.strandWidth0:
+ numeric knotName.strandWidth[];
+ fi;
+ if not string knotName.strandStyle0:
+ string knotName.strandStyle[];
+ fi;
+ if not string knotName.intLayers0:
+ string knotName.intLayers[];
+ fi;
+ knotName.nStrands := knotName.nStrands + 1;
+ n := knotName.nStrands;
+ knotName.strandPath[n] := p;
+ knotName.strandWidth[n] := w;
+ knotName.strandStyle[n] := s;
+ knotName.intLayers[n] := intersectionLayers;
+enddef;
diff --git a/graphics/metapost/contrib/macros/fiziko/fiziko.pdf b/graphics/metapost/contrib/macros/fiziko/fiziko.pdf
new file mode 100644
index 0000000000..aaf3cfff42
--- /dev/null
+++ b/graphics/metapost/contrib/macros/fiziko/fiziko.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/fiziko/fiziko.tex b/graphics/metapost/contrib/macros/fiziko/fiziko.tex
new file mode 100644
index 0000000000..4848055003
--- /dev/null
+++ b/graphics/metapost/contrib/macros/fiziko/fiziko.tex
@@ -0,0 +1,841 @@
+\documentclass{article}
+
+\usepackage{luamplib}
+\everymplib{verbatimtex \leavevmode etex; input fiziko.mp; beginfig(1);}
+\everyendmplib{endfig;}
+
+\usepackage{listings}
+\lstset{
+language=MetaPost,
+numbers=left,
+numberstyle=\tiny,
+basicstyle=\scriptsize
+}
+
+\usepackage{cclicenses}
+
+\author{Sergey Slyusarev}
+\title{``fiziko'' v. 0.1.3 package for MetaPost}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+This document describes a bunch of macros provided by ``fiziko'' library for MetaPost.
+\end{abstract}
+
+\begin{centering}
+
+This document is distributed under CC-BY-SA 4.0 license
+
+\cc\bysa
+
+https://github.com/jemmybutton/fiziko
+
+\end{centering}
+
+\section{Introduction}
+This MetaPost library was initially written to automate some elements of black and white illustrations for a physics textbook. First and foremost it provides functions to draw things like lines of variable width, shaded spheres and tubes of different kinds, which can be used to produce images of a variety of objects. The library also contains functions to draw some objects constructed from these primitives.
+
+\section{Usage}
+Simply include this in the beginning of your MetaPost document:
+
+\begin{lstlisting}
+input fiziko.mp
+\end{lstlisting}
+
+\section{Global variables}
+A few global variables control different aspects of the behavior of the provided macros. Not all possible values are meaningful and some will definitely result in ugly pictures or errors.
+
+\subsection{minStrokeWidth}
+This variable controls minimal thickness of lines that are used for shading. Below this value lines are not getting thinner, but become dashed instead, maintaining roughly the same amount of ink per unit length as a thinner line would take. Default value is one fifth of a point. There are several things that depend on this value, so it's convenient to change it using a macro:
+
+\begin{lstlisting}
+defineMinStrokeWidth(1/2pt);
+\end{lstlisting}
+
+\subsection{lightDirection}
+This variable controls direction from which light falls on shaded objects. It's of \texttt{pair} type and is set in radians. Default direction is top-left:
+
+\begin{lstlisting}
+lightDirection := (-1/8pi, 1/8pi);
+\end{lstlisting}
+
+\section{``Lower level'' macros}
+Currently, algorithms are quite stupid and will produce decent results only in certain simple circumstances.
+
+\subsection{offsetPath (\emph{path})(\emph{offset function})}
+This macro returns offset path (of type \texttt{path}) to a current path with a distance from the original path controlled by some arbitrary function; typically, it is a function of path length, set as either \texttt{offsetPathTime} or \texttt{offsetPathLength}. Former is simply \texttt{time} on current path and changes from 0 to \texttt{length(path)}, and latter changes from 0 to 1 over the path \texttt{arctime} (as a function of \texttt{arclength}).
+
+\begin{lstlisting}
+ path p, q;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ q := offsetPath(p)(1cm*sin(offsetPathLength*pi));
+ draw p;
+ draw q dashed evenly;
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p, q;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ q := offsetPath(p)(1cm*sin(offsetPathLength*pi));
+ draw p;
+ draw q dashed evenly;
+\end{mplibcode}
+
+\subsection{brush (\emph{path})(\emph{offset function})}
+This macro returns a \texttt{picture} of a line of variable width along given path, which is controlled by some arbitrary function, analogous to \texttt{offsetPath}. If line is getting thinner than \texttt{minStrokeWith}, it is drawn dashed.
+
+\begin{lstlisting}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw brush (p)(2minStrokeWidth*sin(offsetPathLength*pi));
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw brush (p)(2minStrokeWidth*sin(offsetPathLength*pi));
+\end{mplibcode}
+
+\subsection{sphere.c (\emph{diameter})}
+This macro returns a \texttt{picture} of a sphere with specified diameter shaded with concentric strokes. Strokes are arranged to fit those of \texttt{tube.l}.
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ draw sphere.c(i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ draw sphere.c(i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{sphere.l (\emph{diameter, angle})}
+This macro returns a \texttt{picture} of a shaded sphere with specified diameter. Unlike \texttt{sphere.c} macro, this one draws latitudinal strokes around axis rotated at specified \texttt{angle}.
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ draw sphere.l(i*1/4cm, -90 + i*30)
+ shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ draw sphere.l(i*1/4cm, -90 + i*30)
+ shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{tube.l (\emph{path})(\emph{offset function})}
+This macro returns a \texttt{picture} of a shaded ``tube'' of a variable width along a given path, which is controlled by some arbitrary function, analogous to \texttt{offsetPath}. ``Tube'' drawn by this macro is shaded be longitudal strokes. Once tube is generated, you can call \texttt{tubeOutline} path global variable, if you need one.
+
+\begin{lstlisting}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw tube.l (p)(1/2cm*sin(offsetPathLength*pi));
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw tube.l (p)(1/2cm*sin(offsetPathLength*pi));
+\end{mplibcode}
+
+\subsection{tube.t (\emph{path})(\emph{offset function})}
+This macro returns a \texttt{picture} of a shaded ``tube'' of variable width along given path, which is controlled by some arbitrary function, analogous to \texttt{offsetPath}. ``Tube'' drawn by this macro is shaded be transverse strokes. Once tube is generated, you can call \texttt{tubeOutline} path global variable, if you need one.
+
+\begin{lstlisting}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw tube.t (p)(1/2cm*sin(offsetPathLength*pi));
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw tube.t (p)(1/2cm*sin(offsetPathLength*pi));
+\end{mplibcode}
+
+\subsection{tube.e (\emph{path})(\emph{offset function})}
+This macro returns the outline of a tube as a path.
+
+\section{``Higher level'' macros}
+Using macros described in the previous section it is possible to construct more complex images. Macros for drawing some often used images are present in this package.
+
+\subsection{eye (\emph{angle})}
+This macro returns a \texttt{picture} of an eye pointed at the direction \texttt{angle} (in degrees). Eye size is controlled by a global variable \texttt{eyescale}, which has default value of \texttt{eyescale := 1/2cm;}.
+
+\begin{lstlisting}
+ save eyescale;
+ for i := 1 step 1 until 6:
+ eyescale := 1/6cm*i;
+ draw eye(i*60) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ save eyescale;
+ for i := 1 step 1 until 6:
+ eyescale := 1/6cm*i;
+ draw eye(i*60) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{pulley (\emph{diameter, angle})}
+This macro returns a \texttt{picture} of a pulley with specified \texttt{diameter} and its support pointed at the direction \texttt{angle} (in degrees). Note that pulley's support protrudes from its center by \texttt{pulleySupportSize*diameter} and by default \texttt{pulleySupportSize} = 3/2. Once pulley is generated, you can call \texttt{pulleyOutline} path global variable, if you need one.
+
+\begin{lstlisting}
+ draw (-1/8cm, 0)--(12cm, 0);
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw image(
+ draw pulley(2r, 0) shifted (0, -4/3r);
+ draw (r, -4/3r) -- (r, -2cm);
+ drawarrow (-r, -4/3r) -- (-r, -2cm);
+ ) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ draw (-1/8cm, 0)--(12cm, 0);
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw image(
+ draw pulley(2r, 0) shifted (0, -4/3r);
+ draw (r, -4/3r) -- (r, -2cm);
+ drawarrow (-r, -4/3r) -- (-r, -2cm);
+ ) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{pulleyWheel (\emph{diameter})}
+This macro returns a \texttt{picture} of a pulley wheel with specified \texttt{diameter}.
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw image(
+ draw pulleyWheel(2r);
+ draw (r, 0) -- (r, 1cm);
+ drawarrow (-r, 0) -- (-r, 1cm);
+ ) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw image(
+ draw pulleyWheel(2r);
+ draw (r, 0) -- (r, 1cm);
+ drawarrow (-r, 0) -- (-r, 1cm);
+ ) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{wheel (\emph{diameter, angle})}
+This macro returns a \texttt{picture} of a wheel with specified \texttt{diameter} and its support pointed at the direction \texttt{angle} (in degrees).
+
+\begin{lstlisting}
+ draw (-1/8cm, 0)--(12cm, 0);
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw wheel(2r, 0) shifted (0, -r) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ draw (-1/8cm, 0)--(12cm, 0);
+ for i := 1 step 1 until 6:
+ r := 1/7cm*i;
+ draw wheel(2r, 0) shifted (0, -r) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+
+\subsection{weight.s (\emph{height})}
+This macro returns a \texttt{picture} of a weight of a specific \texttt{height} that is standing on the point \texttt{(0, 0)}.
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ draw weight.s(1/4cm + i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+ draw (-1/8cm, 0)--(12cm, 0);
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ draw weight.s(1/4cm + i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+ draw (-1/8cm, 0)--(12cm, 0);
+\end{mplibcode}
+
+\subsection{weight.h (\emph{height})}
+This macro returns a \texttt{picture} of a weight of a specific \texttt{height} that is is hanging from the point \texttt{(0, 0)}.
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ draw weight.h(1/4cm + i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+ draw (12cm, 0)--(-1/8cm, 0);
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ draw weight.h(1/4cm + i*1/4cm) shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+ draw (12cm, 0)--(-1/8cm, 0);
+\end{mplibcode}
+
+
+\subsection{spring (\emph{point a, point b, number of steps})}
+This macro returns a \texttt{picture} of a spring stretched between points \texttt{a} and \texttt{b} (of type \texttt{pair}), with specified \texttt{number of steps}. Spring width is controlled by global variable \texttt{springwidth} with the default value \texttt{springwidth := 1/8cm;}.
+
+\begin{lstlisting}
+ pair a, b;
+ a := (0, 0);
+ for i := 1 step 1 until 6:
+ springwidth := 1/16cm + i*1/48cm;
+ b := (i*1/3cm, - i*1/5cm);
+ draw spring (a, b, 10) shifted (2/5cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ pair a, b;
+ a := (0, 0);
+ for i := 1 step 1 until 6:
+ springwidth := 1/16cm + i*1/48cm;
+ b := (i*1/3cm, - i*1/5cm);
+ draw spring (a, b, 10) shifted (2/5cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{solidSurface (\emph{path})}
+This macro returns a \texttt{picture} of a solid surface on the right side of a given \texttt{path}.
+
+\begin{lstlisting}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw solidSurface(p);
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p;
+ p := (0,0){dir(30)}..(5cm, 0)..{dir(30)}(10cm, 0);
+ draw solidSurface(p);
+\end{mplibcode}
+
+\subsection{solid (\emph{path, angle, type})}
+Fills given \texttt{path} with strokes of specific type at a given \texttt{angle}. \texttt{type} can be 0 (``solid'' strokes) and 1 (``glass'' strokes).
+
+\subsection{woodBlock (\emph{width, height})}
+Returns a \texttt{picture} of a rectangular block of wood with its bottom-left corner in the origin.
+
+\begin{lstlisting}
+ draw woodBlock(10cm, 1/2cm);
+\end{lstlisting}
+
+\begin{mplibcode}
+ draw woodBlock(10cm, 1/2cm);
+\end{mplibcode}
+
+\subsection{woodenThing (\emph{path, angle})}
+Returns a \texttt{picture} of a wood texture at a given \texttt{angle} fitted into a given \texttt{path}.
+
+\begin{lstlisting}
+ path p, q;
+ p := dir(-60) scaled 1/2 -- dir(90) scaled 2/3 -- dir (-120) scaled 3/5 -- cycle;
+ for i := 1 step 1 until 6:
+ q := (p scaled 3/2cm) rotated (i*60);
+ draw woodenThing (q, i*60) shifted (2cm*i, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p, q;
+ p := dir(-60) scaled 1/2 -- dir(90) scaled 2/3 -- dir (-120) scaled 3/5 -- cycle;
+ for i := 1 step 1 until 6:
+ q := (p scaled 3/2cm) rotated (i*60);
+ draw woodenThing (q, i*60) shifted (2cm*i, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{globe (\emph{radius, longitude, latitude})}
+This macro returns a \texttt{picture} of the globe of specified \texttt{radius} centered at specific \texttt{longitude} and \texttt{latitude};
+
+\begin{lstlisting}
+ for i := 1 step 1 until 6:
+ draw globe(i*1/4cm, i*60, -90 + i*30)
+ shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ for i := 1 step 1 until 6:
+ draw globe(i*1/4cm, i*60, -90 + i*30)
+ shifted (1/2cm*(i*(i+1))/2, 0);
+ endfor;
+\end{mplibcode}
+
+\subsection{Knots}
+There are two macros to handle knot drawing: \texttt{addStrandToKnot} and \texttt{knotFromStrands}. Currently the algorithm is not especially stable.
+
+\subsubsection{addStrandToKnot (\emph{knotName}) (\emph{path, ropeWidth, ropeType, intersectionOrder})}
+This macro adds a strand to knot named \texttt{knotName} and returns nothing. Strand follows the given \texttt{path} and has a given \texttt{ropeWidth}. \texttt{ropeType} can be \texttt{"l"}, \texttt{"t"} (as in \texttt{tube.l} and \texttt{tube.t}) or \texttt{"e"} (for an unshaded strand). \texttt{intersectionOrder} is a string of comma separated numbers which represent a ``layer'' to which intersections along the strand go.
+
+\subsubsection{knotFromStrands (\emph{knotName})}
+This macro returns a picture of a knot with a given \texttt{knotName}.
+
+\begin{lstlisting}
+ path p[];
+ p1 := (dir(90)*4/3cm) {dir(0)} .. tension 3/2
+ .. (dir(90 + 120)*4/3cm){dir(90 + 30)} .. tension 3/2
+ .. (dir(90 - 120)*4/3cm){dir(-90 - 30)} .. tension 3/2
+ .. cycle;
+ p2 := (fullcircle scaled 3cm) shifted (0, -3/2cm);
+ p3 := (fullcircle scaled 4cm);
+ addStrandToKnot (theknot) (p1 shifted (4cm, -4cm), 1/5cm, "l",
+ "-1,1,-1,1,-1,1,-1,1,-1");
+ addStrandToKnot (theknot) (p2 shifted (4cm, -4cm), 1/6cm, "l",
+ "");
+ addStrandToKnot (theknot) (p3 shifted (4cm, -4cm), 1/7cm, "l",
+ "-1,1");
+ draw knotFromStrands (theknot);
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p[]; path p[];
+ p1 := (dir(90)*4/3cm) {dir(0)} .. tension 3/2
+ .. (dir(90 + 120)*4/3cm){dir(90 + 30)} .. tension 3/2
+ .. (dir(90 - 120)*4/3cm){dir(-90 - 30)} .. tension 3/2
+ .. cycle;
+ p2 := (fullcircle scaled 3cm) shifted (0, -3/2cm);
+ p3 := (fullcircle scaled 4cm);
+ addStrandToKnot (theknot) (p1 shifted (4cm, -4cm), 1/5cm, "l",
+ "-1,1,-1,1,-1,1,-1,1,-1");
+ addStrandToKnot (theknot) (p2 shifted (4cm, -4cm), 1/6cm, "l",
+ "");
+ addStrandToKnot (theknot) (p3 shifted (4cm, -4cm), 1/7cm, "l",
+ "-1,1");
+ draw knotFromStrands (theknot);
+\end{mplibcode}
+
+\section{Other macros}
+Some macros that are not directly related to drawing are listed below
+
+\subsection{refractionPath (\emph{initial ray, shape, refraction coefficient})}
+This macro returns a \texttt{path} that represent refraction of some \texttt{ray} (any variable of type \texttt{path}, point next to last in a given path is considered a source of a ``ray'', and last point determines its direction) through some \texttt{shape} with given \texttt{refraction coefficient}. When appropriate, the ``ray'' is fully internally reflected.
+
+Setting \texttt{refraction coefficient} to 0 results in reflection instead of refraction in all cases.
+
+\begin{lstlisting}
+ path r, p;
+ p := fullcircle scaled 2.1cm;
+ draw p;
+ for i:= 1cm step -1/4cm until -1cm:
+ r := (-4cm, i) -- (-1cm, i);
+ draw refractionPath(r, p, 1.5);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ path r, p;
+ p := fullcircle scaled 2.1cm;
+ draw p;
+ for i:= 1cm step -1/4cm until -1cm:
+ r := (-4cm, i) -- (-1cm, i);
+ draw refractionPath(r, p, 1.5);
+ endfor;
+\end{mplibcode}
+
+
+\subsection{lens (\emph{(left radius, right radius), thickness, diameter, units})}
+This macro returns a \texttt{path} that represent a section of a lens with given radii of curvature (positive value for convex, negative --- for concave), thickness (i. e. distance benween sides' centers) and diameter (i. e. height) in given arbitrary units.
+
+\begin{lstlisting}
+ draw lens((5, 10), 1/2, 2, cm);
+ draw lens((-10, -5), 1/4, 2, cm) shifted (2cm, 0);
+ draw lens((infinity, 7), 1/4, 2, cm) shifted (4cm, 0);
+\end{lstlisting}
+
+\begin{mplibcode}
+ draw lens((5, 10), 1/2, 2, cm);
+ draw lens((-10, -5), 1/4, 2, cm) shifted (2cm, 0);
+ draw lens((infinity, 7), 1/4, 2, cm) shifted (4cm, 0);
+\end{mplibcode}
+
+\section{Auxilary macros}
+Some macros that not related to physical problems at all are listed below.
+
+\subsection{\emph{picture} maskedWith \emph{path}}
+This macro masks a part of a \texttt{picture} with closed \texttt{path}. In fact this is inversion of metapost's built-in \texttt{clip} but, in contrast to the latter, it does not modify original image. Note that it requires that counter-clockwise \texttt{path} to work properly.
+
+\subsection{\emph{path} firstIntersectionTimes \emph{path}}
+This macro is similar to metapost's \texttt{intersectiontimes} but it returns intersection times with smallest time on first path.
+
+\subsection{pathSubdivide \emph{path, n}}
+This macro returns original \texttt{path} with \texttt{n}-times more points.
+
+\subsection{drawmidarrow (\emph{path})}
+Draws \texttt{path} with arrows in the middles of segments with length no less than \texttt{midArrowLimit} (another global variable, 1cm by default).
+
+\subsection{markAngle (\emph{point a, point o, point b})(\emph{text})}
+This macro marks an angle \texttt{aob} (counter-clockwise) with some \texttt{text}
+
+\begin{lstlisting}
+ pair a, o, b;
+ for i:= 30 step 60 until 390:
+ o := (10cm*(i/360), 0);
+ a := dir(i/2)*4/3cm shifted o;
+ b := dir(i)*4/3cm shifted o;
+ draw (a--o--b);
+ markAngle(a, o, b)(btex $\alpha$ etex);
+ endfor;
+\end{lstlisting}
+
+\begin{mplibcode}
+ pair a, o, b;
+ for i:= 30 step 60 until 390:
+ o := (10cm*(i/360), 0);
+ a := dir(i/2)*4/3cm shifted o;
+ b := dir(i)*4/3cm shifted o;
+ draw (a--o--b);
+ markAngle(a, o, b)(btex $\alpha$ etex);
+ endfor;
+\end{mplibcode}
+
+
+\section{Some examples}
+
+\subsection{Gregory-Maksutov type telescope}
+Lines 3--11 define parameters of lenses and mirrors\footnote{Taken from here http://www.google.ru/patents/US2701983}. Lines 12--16 generate lenses. On line 20 shape of prism is defined. Line 22 cuts part of the rear mirror. Line 26 describes mirror part of the front lens. On lines 31--33 all the glass parts are drawn. On lines 34--36 all the mirror ones. On lines 39--44 rays are traced through all system in order specified in loop on line 41. Lines 49--56 are about the telescope frame.
+\begin{lstlisting}
+ path p[], q[], axis[], f[]; pair o;
+ u := 6mm;
+ r1 := -36.979; r2 := -r1; t1 := 0.7; n1 := 1.517; d1 := 5;
+ l1 := 8.182;
+ r3 := -11.657; r4 := r3; t2 := 0.2; n2 := n1; d2 := 3/2;
+ l2 := 0.4;
+ r5 := -30.433; r6 := 9.598; t3 := 0.39; n3 := 1.621; d3 := d2;
+ l3 := 0.828;
+ r7 := -35.512; r8 := infinity; t4 := 0.7; n4 := 0; d4 := d1;
+ l4 := 5.272;
+ ll0 := 0;
+ for i := 1 upto 4:
+ ll[i] := ll[i-1] + t[i] + l[i];
+ p[i] := lens ((r[i*2 - 1], r[i*2]), t[i], d[i], u)
+ shifted (ll[i-1]*u, 0);
+ endfor;
+ axis1 := (0, 0) -- (ll4*u, 0);
+ axis2 := reverse(axis1);
+ ll5 := ll4 - 1/2l4;
+ p5 := ((-1,-1) -- (1,1) -- (-1,1) -- cycle)
+ scaled (1/2d2*u) shifted (ll5*u, 0);
+ p6 := (subpath
+ (ypart((axis1 shifted (0, 1/2d2*u)) firstIntersectionTimes p4),
+ ypart((axis2 shifted (0, 1/2d2*u)) firstIntersectionTimes p4))
+ of p4) -- cycle;
+ p7 := (subpath
+ (ypart((axis2 shifted (0, 3/4d2*u)) firstIntersectionTimes p1),
+ ypart((axis2 shifted (0, -3/4d2*u)) firstIntersectionTimes p1))
+ of p1);
+ p7 := p7 -- (reverse(p7) shifted ((-1/3t1)*u, 0)) -- cycle;
+ for i := 1, 2, 3, 5:
+ draw p[i] withpen thickpen; draw solid (p[i], 45, 1);
+ endfor;
+ draw solid (p7, -45, 0);
+ draw p6 withpen thickpen; draw solid (p6, -45, 0);
+ draw p6 yscaled -1 withpen thickpen;
+ draw solid (p6 yscaled -1, -45, 0);
+ n7 := 0; n5 := n1;
+ for i := 0, 1:
+ q[i] := (-3/2u, -2u + i*4u) -- (16u, -2u + i*4u);
+ for j = 1, 4, 7, 2, 3, 5:
+ q[i] := refractionPath(q[i], p[j], n[j]);
+ endfor;
+ endfor;
+ o := whatever[point length(q0) of q0, point length(q0)-1 of q0]
+ = whatever[point length(q1) of q1, point length(q1)-1 of q1];
+ for i := 0, 1: drawmidarrow (q[i] -- o) withpen thinpen; endfor;
+ draw eye(-91) shifted o shifted (0, u);
+ f1 := (-1/4u, 1/2d1*u) -- ((ll3 + t4)*u, 1/2d1*u)
+ -- ((ll3 + t4)*u, 1/2d2*u);
+ f2 := (ll1*u - 1/8u, 1/2d2*u) -- (ll5*u - 1/2d2*u, 1/2d2*u)
+ -- (ll5*u - 1/2d2*u, ypart(o));
+ f3 := (ll1*u - 1/8u, -1/2d2*u) -- (ll5*u + 1/2d2*u, -1/2d2*u)
+ -- (ll5*u + 1/2d2*u, ypart(o));
+ draw f1 withpen fatpen; draw f1 yscaled -1 withpen fatpen;
+ draw f2 withpen fatpen; draw f3 withpen fatpen;
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p[], q[], axis[], f[]; pair o;
+ u := 6mm;
+ r1 := -36.979; r2 := -r1; t1 := 0.7; n1 := 1.517; d1 := 5;
+ l1 := 8.182;
+ r3 := -11.657; r4 := r3; t2 := 0.2; n2 := n1; d2 := 3/2;
+ l2 := 0.4;
+ r5 := -30.433; r6 := 9.598; t3 := 0.39; n3 := 1.621; d3 := d2;
+ l3 := 0.828;
+ r7 := -35.512; r8 := infinity; t4 := 0.7; n4 := 0; d4 := d1;
+ l4 := 5.272;
+ ll0 := 0;
+ for i := 1 upto 4:
+ ll[i] := ll[i-1] + t[i] + l[i];
+ p[i] := lens ((r[i*2 - 1], r[i*2]), t[i], d[i], u)
+ shifted (ll[i-1]*u, 0);
+ endfor;
+ axis1 := (0, 0) -- (ll4*u, 0);
+ axis2 := reverse(axis1);
+ ll5 := ll4 - 1/2l4;
+ p5 := ((-1,-1) -- (1,1) -- (-1,1) -- cycle)
+ scaled (1/2d2*u) shifted (ll5*u, 0);
+ p6 := (subpath
+ (ypart((axis1 shifted (0, 1/2d2*u)) firstIntersectionTimes p4),
+ ypart((axis2 shifted (0, 1/2d2*u)) firstIntersectionTimes p4))
+ of p4) -- cycle;
+ p7 := (subpath
+ (ypart((axis2 shifted (0, 3/4d2*u)) firstIntersectionTimes p1),
+ ypart((axis2 shifted (0, -3/4d2*u)) firstIntersectionTimes p1))
+ of p1);
+ p7 := p7 -- (reverse(p7) shifted ((-1/3t1)*u, 0)) -- cycle;
+ for i := 1, 2, 3, 5:
+ draw p[i] withpen thickpen; draw solid (p[i], 45, 1);
+ endfor;
+ draw solid (p7, -45, 0);
+ draw p6 withpen thickpen; draw solid (p6, -45, 0);
+ draw p6 yscaled -1 withpen thickpen;
+ draw solid (p6 yscaled -1, -45, 0);
+ n7 := 0; n5 := n1;
+ for i := 0, 1:
+ q[i] := (-3/2u, -2u + i*4u) -- (16u, -2u + i*4u);
+ for j = 1, 4, 7, 2, 3, 5:
+ q[i] := refractionPath(q[i], p[j], n[j]);
+ endfor;
+ endfor;
+ o := whatever[point length(q0) of q0, point length(q0)-1 of q0]
+ = whatever[point length(q1) of q1, point length(q1)-1 of q1];
+ for i := 0, 1: drawmidarrow (q[i] -- o) withpen thinpen; endfor;
+ draw eye(-91) shifted o shifted (0, u);
+ f1 := (-1/4u, 1/2d1*u) -- ((ll3 + t4)*u, 1/2d1*u)
+ -- ((ll3 + t4)*u, 1/2d2*u);
+ f2 := (ll1*u - 1/8u, 1/2d2*u) -- (ll5*u - 1/2d2*u, 1/2d2*u)
+ -- (ll5*u - 1/2d2*u, ypart(o));
+ f3 := (ll1*u - 1/8u, -1/2d2*u) -- (ll5*u + 1/2d2*u, -1/2d2*u)
+ -- (ll5*u + 1/2d2*u, ypart(o));
+ draw f1 withpen fatpen; draw f1 yscaled -1 withpen fatpen;
+ draw f2 withpen fatpen; draw f3 withpen fatpen;
+\end{mplibcode}
+
+\subsection{L'H\^{o}pital's Pulley Problem}
+Line 3 describe initial setup. Line 4 is problem's solution. Lines 8--11 set all the points where they belong. Lines 12--16 are needed to decide where to put the pulley.
+
+\begin{lstlisting}
+ pair p[], o[];
+ numeric a, d[], l[], x[], y[];
+ l0 := 6; l1 := 4; l2 := 4;
+ x1 := (l1**2 + abs(l1)*((sqrt(8)*l0)++l1))/4l0;
+ y1 := l1+-+x1;
+ y2 := l2 - ((l0-x1)++y1);
+ d1 := 2/3cm; d2 := 4/3cm; d3 := 5/6d1;
+ p1 := (0, 0);
+ p2 := (l0*cm, 0);
+ p3 := (x1*cm, -y1*cm);
+ p4 := p3 shifted (0, -y2*cm);
+ o1 := (unitvector(p4-p3) rotated 90 scaled 1/2d3);
+ o2 := (unitvector(p3-p2) rotated 90 scaled 1/2d3);
+ p5 := whatever [p3 shifted o1, p4 shifted o1]
+ = whatever [p3 shifted o2, p2 shifted o2];
+ a := angle(p1-p3);
+ draw solidSurface(11/10[p1,p2] -- 11/10[p2, p1]);
+ draw pulley (d1, a - 90) shifted p5;
+ draw image(
+ draw p1 -- p3 -- p2 withpen thickpen;
+ draw p3 -- p4 withpen thickpen;
+ ) maskedWith (pulleyOutline shifted p5);
+ draw sphere.c(d2) shifted p4 shifted (0, -1/2d2);
+ dotlabel.llft(btex $A$ etex, p1);
+ dotlabel.lrt(btex $B$ etex, p2);
+ dotlabel.ulft(btex $C$ etex, p4);
+ label.llft(btex $l$ etex, 1/2[p1, p3]);
+ markAngle(p3, p1, p2)(btex $\alpha$ etex);
+\end{lstlisting}
+
+\begin{mplibcode}
+ pair p[], o[];
+ numeric a, d[], l[], x[], y[];
+ l0 := 6; l1 := 4; l2 := 4;
+ x1 := (l1**2 + abs(l1)*((sqrt(8)*l0)++l1))/4l0;
+ y1 := l1+-+x1;
+ y2 := l2 - ((l0-x1)++y1);
+ d1 := 2/3cm; d2 := 4/3cm; d3 := 5/6d1;
+ p1 := (0, 0);
+ p2 := (l0*cm, 0);
+ p3 := (x1*cm, -y1*cm);
+ p4 := p3 shifted (0, -y2*cm);
+ o1 := (unitvector(p4-p3) rotated 90 scaled 1/2d3);
+ o2 := (unitvector(p3-p2) rotated 90 scaled 1/2d3);
+ p5 := whatever [p3 shifted o1, p4 shifted o1]
+ = whatever [p3 shifted o2, p2 shifted o2];
+ a := angle(p1-p3);
+ draw solidSurface(11/10[p1,p2] -- 11/10[p2, p1]);
+ draw pulley (d1, a - 90) shifted p5;
+ draw image(
+ draw p1 -- p3 -- p2 withpen thickpen;
+ draw p3 -- p4 withpen thickpen;
+ ) maskedWith (pulleyOutline shifted p5);
+ draw sphere.c(d2) shifted p4 shifted (0, -1/2d2);
+ dotlabel.llft(btex $A$ etex, p1);
+ dotlabel.lrt(btex $B$ etex, p2);
+ dotlabel.ulft(btex $C$ etex, p4);
+ label.llft(btex $l$ etex, 1/2[p1, p3]);
+ markAngle(p3, p1, p2)(btex $\alpha$ etex);
+\end{mplibcode}
+
+\subsection{Hooke's law}
+
+\begin{lstlisting}
+ numeric l[],d, h;
+ pair p[], q[];
+ l0 := 3/2cm; l1 := 1cm;
+ d := 1cm; h := 7/8cm;
+ p1 := (0, 0); p2 := (0, -l0);
+ p3 := (d, 0); p4 := (d, -l0-l1);
+ p5 := (2d, 0); p6 := (2d, -l0-2l1); p7 := (2d, -l0-2l1-h);
+ draw solidSurface((2d + 1/2cm, 0)--(-1/2cm, 0));
+ draw spring(p1, p2, 20);
+ draw spring(p3, p4, 20);
+ draw weight.h(h) shifted p4;
+ draw spring(p5, p6, 20);
+ draw weight.h(h) shifted p6;
+ draw weight.h(h) shifted p7;
+ q1 := (0, ypart(p2));
+ q2 := (0, ypart(p4));
+ q3 := (0, ypart(p6));
+ draw p2 -- q1 withpen thinpen;
+ draw p4 -- q2 withpen thinpen;
+ draw p6 -- q3 withpen thinpen;
+ drawdblarrow q1--q2 withpen thinpen;
+ drawdblarrow q2--q3 withpen thinpen;
+ label.lft (btex $x$ etex, 1/2[q1, q2]);
+ label.lft (btex $x$ etex, 1/2[q2, q3]);
+\end{lstlisting}
+
+\begin{mplibcode}
+ numeric l[],d, h;
+ pair p[], q[];
+ l0 := 3/2cm; l1 := 1cm;
+ d := 1cm; h := 7/8cm;
+ p1 := (0, 0); p2 := (0, -l0);
+ p3 := (d, 0); p4 := (d, -l0-l1);
+ p5 := (2d, 0); p6 := (2d, -l0-2l1); p7 := (2d, -l0-2l1-h);
+ draw solidSurface((2d + 1/2cm, 0)--(-1/2cm, 0));
+ draw spring(p1, p2, 20);
+ draw spring(p3, p4, 20);
+ draw weight.h(h) shifted p4;
+ draw spring(p5, p6, 20);
+ draw weight.h(h) shifted p6;
+ draw weight.h(h) shifted p7;
+ q1 := (0, ypart(p2));
+ q2 := (0, ypart(p4));
+ q3 := (0, ypart(p6));
+ draw p2 -- q1 withpen thinpen;
+ draw p4 -- q2 withpen thinpen;
+ draw p6 -- q3 withpen thinpen;
+ drawdblarrow q1--q2 withpen thinpen;
+ drawdblarrow q2--q3 withpen thinpen;
+ label.lft (btex $x$ etex, 1/2[q1, q2]);
+ label.lft (btex $x$ etex, 1/2[q2, q3]);
+\end{mplibcode}
+
+\subsection{Weight on a cart}
+
+\begin{lstlisting}
+ numeric l, w, r, h;
+ l := 4cm;
+ w := 1/4cm;
+ r := 2/3cm;
+ h := 1cm;
+ draw solidSurface((-1/5l, 0) -- (6/5l, 0));
+ draw woodBlock (l, w) shifted (0, r);
+ draw wheel (r, 0) shifted (r, 1/2r);
+ draw wheel (r, 0) shifted (l-r, 1/2r);
+ draw weight.s(h) shifted (1/2l, r + w);
+\end{lstlisting}
+
+\begin{mplibcode}
+ numeric l, w, r, h;
+ l := 4cm;
+ w := 1/4cm;
+ r := 2/3cm;
+ h := 1cm;
+ draw solidSurface((-1/5l, 0) -- (6/5l, 0));
+ draw woodBlock (l, w) shifted (0, r);
+ draw wheel (r, 0) shifted (r, 1/2r);
+ draw wheel (r, 0) shifted (l-r, 1/2r);
+ draw weight.s(h) shifted (1/2l, r + w);
+\end{mplibcode}
+
+\subsection{Some knots}
+
+\begin{lstlisting}
+ path p[];
+ p1 := (dir(90)*4/3cm) {dir(0)} .. tension 3/2
+ .. (dir(90 + 120)*4/3cm){dir(90 + 30)} .. tension 3/2
+ .. (dir(90 - 120)*4/3cm){dir(-90 - 30)} .. tension 3/2
+ .. cycle;
+ p1 := p1 scaled 6/5;
+ addStrandToKnot (primeOne) (p1, 1/4cm, "l", "1, -1, 1");
+ draw knotFromStrands (primeOne);
+ p2 := (0, 2cm) .. (1/2cm, 3/2cm) .. (-1/2cm, 0)
+ .. (1/2cm, -2/3cm) .. (4/3cm, 0) .. (0, 17/12cm)
+ .. (-4/3cm, 0) .. (-1/2cm, -2/3cm) .. (1/2cm, 0)
+ .. (-1/2cm, 3/2cm) .. cycle;
+ p2 := p2 scaled 6/5;
+ addStrandToKnot (primeTwo) (p2, 1/4cm, "l", "1, -1, 1, -1, 1");
+ draw knotFromStrands (primeTwo) shifted (4cm, 0);
+ p3 := (dir(0)*3/2cm) .. (dir(1*72)*2/3cm)
+ .. (dir(2*72)*3/2cm) .. (dir(3*72)*2/3cm)
+ .. (dir(4*72)*3/2cm) .. (dir(0)*2/3cm)
+ .. (dir(1*72)*3/2cm) .. (dir(2*72)*2/3cm)
+ .. (dir(3*72)*3/2cm) .. (dir(4*72)*2/3cm)
+ .. cycle;
+ p3 := (p3 rotated (72/4)) scaled 6/5;
+ addStrandToKnot (primeThree) (p3, 1/4cm, "l", "-1, 1, -1, 1, -1");
+ draw knotFromStrands (primeThree) shifted (8cm, 0);
+\end{lstlisting}
+
+\begin{mplibcode}
+ path p[];
+ p1 := (dir(90)*4/3cm) {dir(0)} .. tension 3/2
+ .. (dir(90 + 120)*4/3cm){dir(90 + 30)} .. tension 3/2
+ .. (dir(90 - 120)*4/3cm){dir(-90 - 30)} .. tension 3/2
+ .. cycle;
+ p1 := p1 scaled 6/5;
+ addStrandToKnot (primeOne) (p1, 1/4cm, "l", "1, -1, 1");
+ draw knotFromStrands (primeOne);
+ p2 := (0, 2cm) .. (1/2cm, 3/2cm) .. (-1/2cm, 0)
+ .. (1/2cm, -2/3cm) .. (4/3cm, 0) .. (0, 17/12cm)
+ .. (-4/3cm, 0) .. (-1/2cm, -2/3cm) .. (1/2cm, 0)
+ .. (-1/2cm, 3/2cm) .. cycle;
+ p2 := p2 scaled 6/5;
+ addStrandToKnot (primeTwo) (p2, 1/4cm, "l", "1, -1, 1, -1, 1");
+ draw knotFromStrands (primeTwo) shifted (4cm, -2cm);
+ p3 := (dir(0)*3/2cm) .. (dir(1*72)*2/3cm)
+ .. (dir(2*72)*3/2cm) .. (dir(3*72)*2/3cm)
+ .. (dir(4*72)*3/2cm) .. (dir(0)*2/3cm)
+ .. (dir(1*72)*3/2cm) .. (dir(2*72)*2/3cm)
+ .. (dir(3*72)*3/2cm) .. (dir(4*72)*2/3cm)
+ .. cycle;
+ p3 := (p3 rotated (72/4)) scaled 6/5;
+ addStrandToKnot (primeThree) (p3, 1/4cm, "l", "-1, 1, -1, 1, -1");
+ draw knotFromStrands (primeThree) shifted (8cm, 0);
+\end{mplibcode}
+
+
+\end{document} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/garrigues/README b/graphics/metapost/contrib/macros/garrigues/README
new file mode 100644
index 0000000000..fa8e390b60
--- /dev/null
+++ b/graphics/metapost/contrib/macros/garrigues/README
@@ -0,0 +1,7 @@
+The metapost macros are described in the following article:
+
+Denis Roegel: An introduction to nomography: Garrigues' nomogram
+ for the computation of Easter,
+ TUGboat (volume 30, number 1, 2009, pages 88-104)
+
+The macros are released under the LPPL.
diff --git a/graphics/metapost/contrib/macros/garrigues/article.txt b/graphics/metapost/contrib/macros/garrigues/article.txt
new file mode 100644
index 0000000000..ec81521821
--- /dev/null
+++ b/graphics/metapost/contrib/macros/garrigues/article.txt
@@ -0,0 +1,5 @@
+The metapost macros are described in the following article:
+
+Denis Roegel: An introduction to nomography: Garrigues' nomogram
+ for the computation of Easter,
+ TUGboat (volume 30, number 1, 2009, pages 88-104)
diff --git a/graphics/metapost/contrib/macros/garrigues/garrigues.mp b/graphics/metapost/contrib/macros/garrigues/garrigues.mp
new file mode 100644
index 0000000000..babeb87841
--- /dev/null
+++ b/graphics/metapost/contrib/macros/garrigues/garrigues.mp
@@ -0,0 +1,1392 @@
+%-*- coding: utf-8 -*-
+
+% Damien Garrigues' ``nomogramme,'' reproduced from:
+%
+% @Article{garrigues:chronometrie1939,
+% author = "Damien Garrigues",
+% title = "{Généralisation de la formule pascale de Gauss:
+% Nomogramme du Calendrier perpétuel}",
+% journal = "Annales françaises de chronométrie",
+% year = "1939",
+% date = "1er trimestre 1939",
+% volume = "",
+% number = "",
+% pages = "47-60",
+% month = "",
+% language = "french",
+% }
+%
+%
+% Denis Roegel
+% 10-11 June 2001: initial version (complete, but not meant to be
+% described in an article)
+%
+% 16 October 2008: improved version using latexmp
+% 19 October 2008: some changes to make it more logical
+% (in particular, col4 has been renumbered from the bottom)
+% 20-24 October 2008: more changes and restructuration of the code,
+% improvements in labels and braces
+% 3-7 November 2008: addition of the special case of epact 25 which
+% had previously been forgotten (footnote (a) in
+% the Easter table area)
+%
+%
+%
+% Only part of the ``nomogramme'' is reproduced,
+% and this version is not completely identical to the original.
+% Some of the idiosyncrasies of the original drawing are difficult
+% to reproduce algorithmically and the purpose is not to create an
+% exact copy.
+%
+% It should also be noted that the code is much more complex than
+% it needs to be for the pure reproduction of Garrigues' drawing,
+% because we wanted in addition to show how the drawing is constructed,
+% and provide a number of partial views. As a consequence, the code
+% has been broken into many different pieces, and some related pieces
+% had to be put in different macros.
+%
+% For detailed explanations, see the accompanying article.
+
+input latexmp % for flexible latex labels
+input rboxes % for round boxes in column 10
+
+numeric u;
+u=1mm;
+
+labeloffset:=7bp;
+
+numeric th_ex;
+th_ex=.5pt; % thickness of example dashed lines
+
+% label shifts in column 8:
+numeric col_shift_eight_a,col_shift_eight_b;
+col_shift_eight_a=6u;
+col_shift_eight_b=10u;
+
+def whateverpair=(whatever,whatever) enddef;
+
+% this macro formats the epact so that it fits on two characters
+% (using a phantom 0 on the left)
+def ep_st(expr i)=
+ if i=0: textext("\phantom{0}$\star$")
+ elseif i<10:
+ textext("\phantom{0}"&decimal(i))
+ else:
+ textext(decimal(i))
+ fi
+enddef;
+
+% this macro formats a number on two digits, adding a phantom 0 when
+% necessary
+def gstring(expr i)=
+ if i<10:
+ textext("\vphantom{(}\phantom{0}"&decimal(i))
+ else:
+ textext("\vphantom{(}"&decimal(i))
+ fi
+enddef;
+
+def gpstring(expr i)=
+ if i<10:
+ textext("(\phantom{0}"&decimal(i)&")")
+ else:
+ textext("("&decimal(i)&")")
+ fi
+enddef;
+
+% this macro adds a label within the Easter area at position (x,y)
+def label_easter_slot(expr x,y,lab)=
+ label(lab,.5[s[x]r[y],s[x+1]l[y+1]]);
+enddef;
+
+% transform 1->A, 2->B, 3->C, 4->D, 5->E, 6->F, 7->G
+% for the correct display of the dominical letter
+def DL(expr i)=
+ char(64+i)
+enddef;
+
+% i is the point number in column 2 (1 at the bottom),
+% and this macro returns a pair:
+% a) the Golden number associated to this point
+% b) the Julian epact associated to this point
+vardef gn_epact(expr i)=
+ save G,JE;
+ G=1+((9-11i) mod 19);
+ JE=(11G-3) mod 30;
+ (G,JE) % value returned
+enddef;
+
+% i is the point number in column 2 (1 at the bottom),
+% and this macro returns a pair:
+% a) the Golden number associated to this point
+% b) the corresponding point in column 4 (1 at the bottom)
+% (col. 4 = Julian epact)
+vardef gn_epactl(expr i)=
+ save G,JE,JEL;
+ G=1+((9-11i) mod 19);
+ JE=(11G-3) mod 30;
+ JEL=30-((JE+12) mod 30);
+ (G,JEL) % value returned
+enddef;
+
+vardef sval(text sec)(text f)=
+ save s;string s;
+ % we build a string with space-separated values:
+ for $=sec:
+ if unknown s:
+ s=f $;
+ else:
+ s:=s & " " & f $;
+ fi;
+ endfor;
+ s
+enddef;
+
+% draw the values of the Gregorian secular parts in column 8;
+% each call corresponds to one line
+% i=circle from the bottom (i=1 to 4)
+% j=line within the circle (j=1 at the top)
+vardef secular_year(expr i,j)(text sec)=
+ save vd;
+ vd=4u; % vertical shift of the first line
+ label(textext(sval(sec)(decimal)) scaled .5,
+ col8[2i-1]+(10u,vd-(j-1)*.5vd));
+enddef;
+
+def tddec expr i=
+ if i<10: "0" & decimal(i)
+ else:
+ decimal(i)
+ fi
+enddef;
+
+% i=box number, from 1 (at the bottom) to 7 (at the top)
+% j=1 or 3 (1 for the line at the top of a box, 3 for the line at the bottom)
+vardef yn(expr i,j)(text y)=
+ save vd;
+ vd=2u; % vertical shift of the first line
+ label(textext(sval(y)(tddec)) scaled .5,
+ col10[i]+(0,vd-(j-1)*vd));
+enddef;
+
+% these numbers always appear at a fixed position:
+def yn_left(expr i)(text y)=
+ label.rt(textext(sval(y)(tddec)) scaled .5,col10[i]+(-10u,0));
+enddef;
+
+% these numbers always appear at a fixed position:
+def yn_right(expr i)(text y)=
+ label.lft(textext(sval(y)(tddec)) scaled .5,col10[i]+(10u,0));
+enddef;
+
+% list is a string with comma-separated values
+% l is the line number (1 at the bottom)
+vardef col_six_f(expr list,l)=
+ save n,i;n=0;
+ for $=scantokens(list):
+ n:=n+1;
+ endfor;
+ % n is now the number of values in the list
+ i=0;
+ for $=scantokens(list):
+ i:=i+1;
+ if n>1:
+ % if there is more than 1 value, the extreme values
+ % are put at 2u below and above the center,
+ % and the other values (if any) are spread evenly
+ % in-between
+ label(textext(decimal $) scaled .7,
+ col6a[l]+(0,-2u+(i-1)*(4u/(n-1))));
+ else:
+ % if there is only one value, it is centered;
+ % there is only one such case
+ label(textext(decimal $) scaled .7,col6a[l]);
+ fi;
+ endfor;
+enddef;
+
+vardef col_one_three_f(expr list,l,c)=
+ save n,i;n=0;
+ for $=scantokens(list):
+ n:=n+1;
+ endfor;
+ i=0;
+ for $=scantokens(list):
+ i:=i+1;
+ label(textext(if c=3: (tddec $) else: decimal $ fi)
+ scaled .6,
+ col[c][l]+((if c=3: 2.5u else: 2u fi,0)
+ rotated (180-(i-1)*360/n)));
+ endfor;
+enddef;
+
+% variables for the regular columns and circle radiuses
+pair col[][],col[]a[];
+numeric height;height=150u; % vertical dimension of the drawing
+numeric diam[];
+
+% variables for labels
+string col[][]st;
+
+% variables for the Easter table:
+pair B,C;
+pair s[]r[],s[]l[];
+
+% define the points in columns 1-7
+vardef define_first_cols=
+ save E;
+ diam1=(height-18*.5)/18;
+ for i:=1 upto 19:
+ col1[i]=(0,(i-1)*height/18);
+ endfor;
+ for i:=1 upto 19:
+ col3[i]=(40u,(i-1)*height/18);
+ endfor;
+ for i:=1 upto 37:
+ col2[i]=((xpart(col1[1])+xpart(col3[1]))/2,
+ .5*(i-1)*height/18);
+ endfor;
+ for i:=1 upto 37:
+ E:=ypart(gn_epactl(i));
+ col4[E]=(60u,(E-1)*height/29);
+ endfor;
+ for i:=1 upto 30:
+ col6[i]=(110u,(i-1)*height/29);
+ endfor;
+ for i:=1 upto 58:
+ col5[i]=((xpart(col4[1])+xpart(col6[1]))/2,.5*(i-1)*height/29);
+ endfor;
+ for i:=1 upto 30:
+ % the circles for column 6 appear alternately
+ % on the right and on the left of the center corresponding to col6
+ if i mod 2=0:
+ col6a[i]=col6[i]-(8u,0);
+ else:
+ col6a[i]=col6[i]+(8u,0);
+ fi;
+ endfor;
+ for i:=1 upto 30:
+ % the values in column 7 are shifted vertically by 20u:
+ col7[i]=(130u,20u+(i-1)*(height-20u)/29);
+ endfor;
+enddef;
+
+% define strings containing the numbers in the circles of column 1
+vardef define_col_one_labels=
+ save p;
+ for i=0 upto 84: % only S=0 to 84 are considered
+ p:=1+(9+3i) mod 19;
+ if unknown col1[p]st:
+ col1[p]st=decimal(i);
+ else:
+ col1[p]st
+ :=col1[p]st & "," & decimal(i);
+ fi;
+ endfor;
+enddef;
+
+% define strings containing the numbers in the circles of column 3
+vardef define_col_three_labels=
+ save p;
+ for i=0 upto 99:
+ p:=1+(15+12i) mod 19;
+ if unknown col3[p]st:
+ col3[p]st=decimal(i);
+ else:
+ col3[p]st
+ :=col3[p]st & "," & decimal(i);
+ fi;
+ endfor;
+enddef;
+
+% define strings containing the numbers in the circles of column 6
+vardef define_col_six_labels=
+ save p,M;
+ for i=15 upto 84: % all secular parts of column 6
+ % find the line number where it goes
+ M:=(15+i-floor(i/4)-floor((8i+13)/25)) mod 30;
+ p:=1+(M+21) mod 30;
+ if unknown col6[p]st:
+ col6[p]st=decimal(i);
+ else:
+ col6[p]st:=col6[p]st & "," & decimal(i);
+ fi;
+ endfor;
+enddef;
+
+def draw_col_one_points=
+ for i:=1 upto 19:
+ drawdot col1[i];
+ endfor;
+enddef;
+
+def draw_col_two_points=
+ for i:=1 upto 37:
+ drawdot col2[i];
+ endfor;
+enddef;
+
+def draw_col_three_points=
+ for i:=1 upto 19:
+ drawdot col3[i];
+ endfor;
+enddef;
+
+vardef draw_col_four_points=
+ save GNE;pair GNE;
+ for i:=1 upto 37:
+ GNE:=whateverpair;GNE=gn_epactl(i);
+ drawdot col4[ypart(GNE)];
+ endfor;
+enddef;
+
+def draw_col_five_points=
+ for i:=1 upto 58:
+ drawdot col5[i];
+ endfor;
+enddef;
+
+def draw_col_six_points=
+ for i:=1 upto 30:
+ drawdot col6[i];
+ endfor;
+enddef;
+
+def draw_col_seven_points=
+ for i:=1 upto 30:
+ drawdot col7[i];
+ endfor;
+enddef;
+
+def draw_col_eight_points=
+ for i=1 upto 7:
+ drawdot col8[i];
+ endfor;
+enddef;
+
+def draw_col_nine_points=
+ for i=1 upto 13:
+ drawdot col9[i];
+ endfor;
+enddef;
+
+def draw_col_ten_points=
+ for i=1 upto 7:
+ drawdot col10[i];
+ endfor;
+enddef;
+
+def draw_col_eleven_points=
+ for i=1 upto 7:
+ drawdot col11[i];
+ endfor;
+enddef;
+
+vardef draw_block_one_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_one_points;
+ draw_col_two_points;
+ draw_col_three_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_two_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_two_points;
+ %draw_col_three_points;
+ draw_col_four_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_three_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_four_points;
+ draw_col_five_points;
+ draw_col_six_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_four_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_five_points;
+ %draw_col_six_points;
+ draw_col_seven_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_five_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_eight_points;
+ draw_col_nine_points;
+ draw_col_ten_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_six_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ %draw_col_eight_points;
+ draw_col_nine_points;
+ draw_col_eleven_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_seven_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_col_seven_points;
+ draw_col_eleven_points;
+ pickup oldpen;
+enddef;
+
+% draw the various points in the columns:
+vardef draw_all_points=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw_block_one_points;
+ draw_block_three_points;
+ draw_block_five_points;
+ draw_block_seven_points;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_two_connections=
+ for i:=1 upto 37:
+ draw col2[i]--col4[ypart(gn_epactl(i))];
+ endfor;
+enddef;
+
+def draw_block_four_connections=
+ for i:=1 upto 58:
+ draw col5[i]--col7[1+((i-1) mod 30)];
+ endfor;
+enddef;
+
+def draw_block_six_connections=
+ for i=1 upto 13:
+ draw col9[i]--col11[1+(13-i) mod 7];
+ endfor;
+enddef;
+
+% draw the lines connecting the points
+def draw_all_connections=
+ draw_block_two_connections;
+ draw_block_four_connections;
+ draw_block_six_connections;
+enddef;
+
+% connecting the secular part to the last two digits of the year:
+vardef draw_block_one_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col1[10]--col3[9] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col1[10]--col3[9] dashed evenly;
+ pickup oldpen;
+enddef;
+
+% connecting the Golden number to the Julian epact:
+vardef draw_block_two_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col2[18]--col4[29] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col2[18]--col4[29] dashed evenly;
+ pickup oldpen;
+enddef;
+
+% connecting the Julian epact to M:
+vardef draw_block_three_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col4[29]--col6[16] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col4[29]--col6[16] dashed evenly;
+ pickup oldpen;
+enddef;
+
+% connecting the Gregorian epacts:
+vardef draw_block_four_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col5[44]--col7[14] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col5[44]--col7[14] dashed evenly;
+ pickup oldpen;
+enddef;
+
+% connecting the secular part of the year to the
+% last two digits, in order to obtain the dominical letter:
+vardef draw_block_five_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col8[7]--col10[5] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col8[7]--col10[5] dashed evenly;
+ pickup oldpen;
+enddef;
+
+% connecting the dominical letters together:
+vardef draw_block_six_example=
+ save oldpen;
+ oldpen=savepen;
+ draw col9[11]--col11[3] withcolor white; % erasing the old connection
+ pickup pencircle scaled th_ex;
+ draw col9[11]--col11[3] dashed evenly;
+ pickup oldpen;
+enddef;
+
+vardef draw_block_seven_example=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled th_ex;
+ % connecting all Easter dates with the same dominical letter A:
+ draw col11[3]--C dashed evenly;
+ % connecting all Easter dates with the same Gregorian epact value:
+ draw col7[14]--B dashed evenly;
+ % showing the Easter date:
+ pickup pencircle scaled 3pt;
+ draw (col11[3]--C) intersectionpoint (col7[14]--B);
+ pickup oldpen;
+enddef;
+
+% example for 1939:
+def draw_all_example=
+ draw_block_one_example;
+ draw_block_two_example;
+ draw_block_three_example;
+ draw_block_four_example;
+ draw_block_five_example;
+ draw_block_six_example;
+ draw_block_seven_example;
+enddef;
+
+def draw_dbl_circle(expr da,db,c) text options=
+ unfill fullcircle scaled db shifted c;
+ draw fullcircle scaled db shifted c;
+ draw fullcircle scaled da shifted c options;
+enddef;
+
+% circles in column 1:
+def draw_col_one_circles=
+ for i:=1 upto 19:
+ draw_dbl_circle(.9diam1,diam1,col1[i]);
+ endfor;
+enddef;
+
+% extra labels for block one:
+def draw_col_one_circle_labels=
+ for i:=1 upto 19:
+ label.lft(textext(decimal((4+8*(i-1)) mod 19)),col1[i]+7u*left);
+ endfor;
+enddef;
+
+% circles in column 3:
+def draw_col_three_circles=
+ for i:=1 upto 19:
+ % this produces a simple circle:
+ draw_dbl_circle(diam1,diam1,col3[i]);
+ endfor;
+enddef;
+
+% extra labels for block one:
+def draw_col_three_circle_labels=
+ for i:=1 upto 19:
+ label.lft(textext(decimal((13+8*(i-1)) mod 19)),col3[i]+13u*right);
+ endfor;
+enddef;
+
+def draw_col_six_circles=
+ % circles around column 6:
+ for i:=1 upto 30:
+ draw_dbl_circle(.9diam1,diam1,col6a[i]);
+ endfor;
+ % special case of the Julian calendar:
+ draw_dbl_circle(.9diam1,diam1,col6[7]-(17u,0)) dashed evenly;
+ drawarrow (col6[7]-(17u,0))--col6[7]
+ cutbefore (fullcircle scaled diam1 shifted (col6[7]-(17u,0)));
+ label(textext("\vbox{\halign{\hfil#\hfil\cr Jul.\cr Cal.\cr}}") scaled .7,
+ col6[7]-(17u,0));
+enddef;
+
+% circles around column 8:
+def draw_col_eight_circles=
+ for i=1 upto 7:
+ draw_dbl_circle(.9diam2,diam2,col8[i]-(col_shift_eight_a,0));
+ if i mod 2=1:
+ draw_dbl_circle(.9diam3,diam3,col8[i]+(col_shift_eight_b,0));
+ fi;
+ endfor;
+enddef;
+
+def draw_block_one_circles=
+ draw_col_one_circles;
+ draw_col_one_circle_labels;
+ draw_col_three_circles;
+ draw_col_three_circle_labels;
+enddef;
+
+def draw_block_two_circles=
+ draw_col_three_circles;
+enddef;
+
+def draw_block_three_circles=
+ draw_col_six_circles;
+enddef;
+
+def draw_block_four_circles=
+ draw_col_six_circles;
+enddef;
+
+def draw_block_five_circles=
+ draw_col_eight_circles;
+enddef;
+
+def draw_block_six_circles=
+ draw_col_eight_circles;
+enddef;
+
+def draw_all_circles=
+ draw_col_one_circles;
+ draw_col_three_circles;
+ draw_col_six_circles;
+ draw_col_eight_circles;
+enddef;
+
+% display values in circles of column 1:
+def draw_labels_col_one=
+ for i=1 upto 19:
+ col_one_three_f(col1[i]st,i,1);
+ endfor;
+ label(textext("I"),col1[1]-(0,10u));
+ label(textext("$S$") scaled 1.5,col1[19]+(col1[19]-col1[18]));
+enddef;
+
+def draw_labels_col_two_a=
+ label(textext("II"),col2[1]-(0,10u));
+enddef;
+
+% this is an extended display
+vardef draw_labels_col_two_b=
+ save GNE;pair GNE;
+ for i:=1 upto 37:
+ GNE:=whateverpair;GNE=gn_epact(i);
+ % some of the values here are written twice, but this causes no harm:
+ label.rt(gstring(xpart(GNE)),col2[i]);
+ label.lft(gstring(ypart(GNE)),col2[i]);
+ endfor;
+ label.lft(textext("$E_J$"),col2[37]+(col2[37]-col2[36]));
+ label.rt(textext("$G$"),col2[37]+(col2[37]-col2[36]));
+enddef;
+
+% this is an extended display
+vardef draw_labels_col_two_c=
+ save GNE;pair GNE;
+ for i:=1 upto 37:
+ GNE:=whateverpair;GNE=gn_epact(i);
+ % some of the values here are written twice, but this causes no harm:
+ label.lft(gstring(xpart(GNE)),col2[i]+15u*left);
+ label.lft(gpstring(ypart(GNE)),col2[i]+5u*left);
+ endfor;
+ label.lft(textext("$G$"),col2[37]+(col2[37]-col2[36])+15u*left);
+ label.lft(textext("$E_J$"),col2[37]+(col2[37]-col2[36])+5u*left);
+enddef;
+
+% display values in circles of column 3:
+def draw_labels_col_three=
+ for i=1 upto 19:
+ col_one_three_f(col3[i]st,i,3);
+ endfor;
+ label(textext("III"),col3[1]-(0,10u));
+ label(textext("$A$") scaled 1.5,col3[19]+(col3[19]-col3[18]));
+enddef;
+
+vardef draw_labels_col_four_base=
+ save GNE;pair GNE;
+ for i:=1 upto 37:
+ GNE:=whateverpair;GNE=gn_epactl(i);
+ % some of the values here are written twice, but this causes no harm:
+ label.rt(gstring(xpart(GNE)),col4[ypart(GNE)]);
+ endfor;
+enddef;
+
+% display labels in column 4 (values of the Golden number)
+def draw_labels_col_four_a=
+ draw_labels_col_four_base;
+ label.lft(textext("IV"),col4[1]-(0,10u));
+ label.rt(textext("Gold. N.") rotated 90,col4[1]-(0,10u));
+enddef;
+
+def draw_labels_col_four_b=
+ draw_labels_col_four_base;
+ label(textext("IV"),col4[1]-(0,10u));
+enddef;
+
+vardef draw_labels_col_four_c=
+ save GNE,GNEL;pair GNE,GNEL;
+ for i:=1 upto 37:
+ GNEL:=whateverpair;GNEL=gn_epactl(i);
+ GNE:=whateverpair;GNE=gn_epact(i);
+ label.rt(gpstring(ypart(GNE)),col4[ypart(GNEL)]+5u*right);
+ endfor;
+ label.rt(textext("$G$"),col4[29]+(col4[29]-col4[28]));
+ label.rt(textext("$E_J$"),col4[29]+(col4[29]-col4[28])+5u*right);
+enddef;
+
+vardef draw_labels_col_four_d=
+ save GNE,GNEL;pair GNE,GNEL;
+ for i:=1 upto 37:
+ GNEL:=whateverpair;GNEL=gn_epactl(i);
+ GNE:=whateverpair;GNE=gn_epact(i);
+ label.lft(gstring(xpart(GNEL)),col4[ypart(GNEL)]+8u*left);
+ label.lft(gpstring(ypart(GNE)),col4[ypart(GNEL)]);
+ endfor;
+ label.lft(textext("$G$"),col4[29]+(col4[29]-col4[28])+8u*left);
+ label.lft(textext("$E_J$"),col4[29]+(col4[29]-col4[28]));
+ label.lft(textext("IV"),col4[1]-(0,10u));
+enddef;
+
+def draw_labels_col_five=
+ for i=1 upto 58:
+ label.lft(ep_st((24-i) mod 30) scaled .7,col5[i]);
+ endfor;
+ label.lft(textext("$E_G$"),col5[58]+2(col5[58]-col5[57]));
+ label(textext("V"),col5[1]-(0,10u));
+enddef;
+
+def draw_labels_col_five_a=
+ label(textext("V"),col5[1]-(0,10u));
+enddef;
+
+% display values in circles of column 6:
+def draw_labels_col_six_a=
+ for i=1 upto 30:
+ col_six_f(col6[i]st,i);
+ endfor;
+ label(textext("VI"),col6[1]-(0,10u));
+ label(textext("$S$") scaled 1.5,col6[30]+2(col6[30]-col6[29]));
+enddef;
+
+vardef draw_labels_col_six_b=
+ save lo;
+ lo=labeloffset;
+ labeloffset:=3bp;
+ for i=1 upto 30:
+ label.rt(gstring((7-i) mod 30) scaled .5,col6[i]);
+ endfor;
+ labeloffset:=lo;
+ label(textext("$15-M$") scaled .7,col6[30]+.5(col6[30]-col6[29])+2u*right);
+enddef;
+
+% display values of the Gregorian epact
+def draw_labels_col_seven_a=
+ for i:=1 upto 30:
+ label.rt(ep_st((24-i) mod 30),col7[i]);
+ endfor;
+ label(textext("VII"),col7[1]-(0,20u));
+ label.rt(textext("Epact:") rotated 90,col7[1]-(0,10u));
+enddef;
+
+def draw_labels_col_seven_b=
+ draw_labels_col_seven_a;
+ label.rt(textext("$E_G$"),col7[30]+(col7[30]-col7[29]));
+enddef;
+
+def draw_labels_col_seven_c=
+ for i:=1 upto 30:
+ label.lft(ep_st((24-i) mod 30),col7[i]);
+ endfor;
+ label.lft(textext("$E_G$"),col7[30]+2(col7[30]-col7[29]));
+ label(textext("VII"),col7[1]-(0,20u));
+ label.lft(textext("Epact:") rotated 90,col7[1]-(0,10u));
+enddef;
+
+def draw_block_one_labels=
+ draw_labels_col_one;
+ draw_labels_col_two_a;
+ draw_labels_col_three;
+enddef;
+
+def draw_block_two_labels=
+ draw_labels_col_two_a;
+ draw_labels_col_four_b;
+enddef;
+
+def draw_block_three_labels=
+ draw_labels_col_four_d;
+ draw_labels_col_five;
+ draw_labels_col_six_a;
+ draw_labels_col_six_b;
+enddef;
+
+def draw_block_four_labels=
+ draw_labels_col_five;
+ draw_labels_col_seven_b;
+enddef;
+
+% draw the labels in columns 1-7
+def draw_first_labels=
+ draw_labels_col_one;
+ draw_labels_col_three;
+ draw_labels_col_four_a;
+ draw_labels_col_five_a;
+ draw_labels_col_six_a;
+ draw_labels_col_seven_a;
+enddef;
+
+def define_corners=
+ corner1=whatever[col7[0],B]
+ =C+whatever*up;
+ corner3=.3[B,col7[31]]; % can be positioned freely
+ corner2=(C--corner3) intersectionpoint (B--corner1);
+ corner4=whatever[B,col7[31]]
+ =C+whatever*up;
+enddef;
+
+vardef define_easter_table=
+ save corner,p;
+ pair corner[];
+ % B and C can be positioned freely:
+ C=(xpart(col7[1])+10u,-10u);
+ B=(xpart(C)+150u,ypart(col7[5]));
+ % we define two additional points in column 7,
+ % one above the 30th, and one below the first:
+ col7[1]-col7[0]=col7[31]-col7[30]=col7[2]-col7[1];
+ % these four corners define the shape of area XI:
+ define_corners;
+ % area XI is divided into 8 slices (9 boundaries,
+ % only 8 of which are drawn)
+ for i=1 upto 9:
+ s[i]l0=s[i]r0=(((i-1)/8))[corner4,corner3];
+ s[i]l5=s[i]r5
+ =whatever[corner1,corner2]=whatever[s[i]l0,C];
+ endfor;
+ % each of the eight slices is itself divided four times:
+ for i=1 upto 8: % i varies on the ``vertical lines,''
+ % from left to right; 8 vertical lines enclose the
+ % 35 easter slots;
+ for j=1 upto 4: % j varies on the horizontal inner divisions
+ p:=30-i-(j-1)*7;
+ % from top to bottom
+ if i<8:
+ % division leaving to the right of vertical line i
+ s[i]r[j]=(s[i]l0--s[i]l5)
+ intersectionpoint (B--.5[col7[p],col7[p-1]]);
+ fi;
+ if i>1:
+ % division leaving to the left of vertical line i
+ s[i]l[j]=(s[i]l0--s[i]l5)
+ intersectionpoint
+ (B--.5[col7[p+1],col7[p]]);
+ fi;
+ endfor;
+ endfor;
+enddef;
+
+% draw points B and C
+vardef draw_B_and_C=
+ save oldpen;
+ oldpen=savepen;
+ draw_dbl_circle(.8*3u,3u,B);
+ draw_dbl_circle(.8*3u,3u,C);
+ pickup pencircle scaled 2pt;
+ drawdot B;drawdot C;
+ pickup oldpen;
+ label.ulft(textext("$B$"),B);
+ label.ulft(textext("$C$"),C);
+enddef;
+
+% draw the slices in the Easter table:
+vardef draw_easter_table_slices=
+ save oldpen;
+ oldpen=savepen;
+ for i=1 upto 8:
+ draw s[i]l0--s[i]l5;
+ endfor;
+ draw s8l5--s8l0--s1l0--s1l5--cycle;
+ for i=1 upto 7:
+ for j=1 upto 4:
+ draw s[i]r[j]--s[i+1]l[j];
+ endfor;
+ endfor;
+ pickup pencircle scaled 2pt;
+ % March/April divisions:
+ draw s8l3--s7r3--s7l3--s6r3--s6l3--s5r3--
+ s5l4--s4r4--s4l4--s3r4--s3l4--
+ s2r4--s2l4--s1r4;
+ pickup oldpen;
+enddef;
+
+vardef draw_arrow_label@#(expr lab,c,s)=
+ save oldpen;
+ oldpen=savepen;
+ pickup pencircle scaled 2pt;
+ draw (c);
+ pickup oldpen;
+ drawarrow (c+s)--(c+u*unitvector(s));
+ label@#(lab,c+s);
+enddef;
+
+
+vardef draw_easter_table_details=
+ save corner;
+ pair corner[];
+ define_corners;
+ draw_arrow_label.top(textext("\tt corner4"),corner4,(0,10u));
+ draw_arrow_label.urt(textext("\tt corner3"),corner3,10u*dir(20));
+ draw_arrow_label.lrt(textext("\tt corner2"),corner2,10u*dir(-20));
+ draw_arrow_label.llft(textext("\tt corner1"),corner1,25u*dir(-132));
+
+ draw_arrow_label.top(textext("\tt s2l0"),s[2]l[0],30u*dir(80));
+ draw_arrow_label.rt(textext("\tt s2r0"),s[2]r[0],40u*dir(10));
+ draw_arrow_label.top(textext("\tt s4l0"),s[4]l[0],12u*dir(90));
+ draw_arrow_label.rt(textext("\tt s4r0"),s[4]r[0],20u*dir(5));
+ draw_arrow_label.lrt(textext("\tt s7l3"),s[7]l[3],40u*dir(-10));
+ draw_arrow_label.lrt(textext("\tt s7r3"),s[7]r[3],40u*dir(-40));
+ draw_arrow_label.rt(textext("\tt s7r2"),s[7]r[2],60u*dir(5));
+
+ draw corner1--corner2 dashed evenly;
+ draw corner4--corner3 dashed evenly;
+ draw corner2--corner3 dashed evenly;
+enddef;
+
+% draw the labels in the Easter table:
+vardef draw_easter_table_labels=
+ save laban,march,april,sl,j;
+ string march,april;
+ for i=1 upto 35: % 35 dates from March 22 till April 25
+ sl:=1+(7-(i mod 7)) mod 7;
+ j:=4-floor((i-1)/7);
+ label_easter_slot(sl,j,textext(if i=35:"25 (a)" else:
+ decimal(if i>10:i-10 else: i+21 fi) fi)
+ if i<8: scaled .7 fi);
+ endfor;
+ laban=angle(s8l0-s8l5);
+ march="$\underbrace{\kern"
+ & decimal(arclength(s8l3--s8l5)-5)
+ & "bp}_{\hbox{MARCH}}$";
+ april="$\underbrace{\kern"
+ & decimal(arclength(s8l0--s8l3)-5)
+ & "bp}_{\hbox{APRIL}}$";
+ label(textext(march) rotated laban,
+ .5[s8l3,s8l5]+3u*unitvector((s8l0-s8l5) rotated -90));
+ label(textext(april) rotated laban,
+ .5[s8l0,s8l3]+3u*unitvector((s8l0-s8l5) rotated -90));
+enddef;
+
+def draw_easter_table=
+ draw_easter_table_slices;
+ draw_B_and_C;
+ draw_easter_table_labels;
+enddef;
+
+vardef define_dominical_letters=
+ save shift;
+ pair shift;
+ shift=(3u,3u);
+ for i=1 upto 8:
+ col11[i]=whatever[C,.5[s[i]r0,s[i+1]l0]]
+ =whatever[s1r0+shift,s8l0+shift];
+ endfor;
+enddef;
+
+def draw_labels_col_eleven=
+ for i=1 upto 7:
+ label.ulft(textext(DL(1+(10-i) mod 7)),col11[i]);
+ endfor;
+ label(textext("XI") rotated (angle(s1r0-s8l0)-90),
+ .6[col11[8],col11[7]]);
+enddef;
+
+% define columns 8-11
+def define_last_cols=
+ diam2=7u;
+ diam3=13u;
+ for i=1 upto 7:
+ col8[i]=s8l0+(15u,10u+(i-1)*ypart(s1l0-s8l0)/7);
+ col10[i]=col8[i]+(50u,0);
+ endfor;
+ for i=1 upto 13:
+ col9[i]=(xpart(col8[1]+col10[1])/2,
+ ypart(col8[1])+(i-1)*(ypart(col8[7]-col8[1]))/12);
+ endfor;
+ define_dominical_letters;
+enddef;
+
+vardef draw_labels_col_eight_julian=
+ save v;
+ for i=1 upto 7:
+ for j=1 upto 3:
+ v:=((4+i) mod 7)+(j-1)*7;
+ label(textext(decimal(v)) scaled .5,
+ col8[i]-(col_shift_eight_a,0)
+ +((0,1.4u) rotated ((j-1)*120)));
+ endfor;
+ endfor;
+enddef;
+
+def draw_labels_col_eight_gregorian=
+ % the following lines could be parameterized, but it's not worth it
+ secular_year(1,1)(16,20,24);
+ secular_year(1,2)(28,32,36,40);
+ secular_year(1,3)(44,48,52,56);
+ secular_year(1,4)(60,64,68,72);
+ secular_year(1,5)(76,80,84);
+
+ secular_year(2,1)(17,21);
+ secular_year(2,2)(25,29,33,37);
+ secular_year(2,3)(41,45,49,53);
+ secular_year(2,4)(57,61,65,69);
+ secular_year(2,5)(73,77,81);
+
+ secular_year(3,1)(18,22);
+ secular_year(3,2)(26,30,34,38);
+ secular_year(3,3)(42,46,50,54);
+ secular_year(3,4)(58,62,66,70);
+ secular_year(3,5)(74,78,82);
+
+ secular_year(4,1)(15,19,23);
+ secular_year(4,2)(27,31,35,39);
+ secular_year(4,3)(43,47,51,55);
+ secular_year(4,4)(59,63,67,71);
+ secular_year(4,5)(75,79,83);
+enddef;
+
+vardef draw_labels_col_ten=
+ save rbr;
+ rbr=rbox_radius;
+ rbox_radius:=15pt;
+ for i=1 upto 7:
+ rboxit.rb[i]("");
+ rb[i].c=col10[i];
+ rb[i].dx=9u;rb[i].dy=3.3u;
+ unfill bpath(rb[i]);
+ drawboxes(rb[i]);
+ endfor;
+ rbox_radius:=rbr;
+
+ yn(1,1)(3,8,14,25,31);
+ yn_left(1)(36,42);yn_right(1)(53,59);
+ yn(1,3)(64,70,81,87,92,98);
+
+ yn(2,1)(2,13,19,24,30);
+ yn_left(2)(41,47);yn_right(2)(52,58);
+ yn(2,3)(69,75,80,86,97);
+
+ yn(3,1)(1,7,12,18,29);
+ yn_left(3)(35,40);yn_right(3)(46,57);
+ yn(3,3)(63,68,74,85,91,96);
+
+ yn(4,1)(0,6,17,23,28);
+ yn_left(4)(34,45);yn_right(4)(51,56);
+ yn(4,3)(62,73,79,84,90);
+
+ yn(5,1)(5,11,16,22,33);
+ yn_left(5)(39,44);yn_right(5)(50,61);
+ yn(5,3)(67,72,78,89,95);
+
+ yn(6,1)(4,10,21,27,32);
+ yn_left(6)(38,49);yn_right(6)(55,60);
+ yn(6,3)(66,77,83,88,94);
+
+ yn(7,1)(9,15,20,26,37);
+ yn_left(7)(43,48);yn_right(7)(54,65);
+ yn(7,3)(71,76,82,93,99);
+
+ label(textext("X"),col10[1]-(0,10u));
+ label(textext("$A$") scaled 1.5,col10[7]+2(col8[7]-col8[6]));
+enddef;
+
+def draw_labels_col_ten_a=
+ draw_labels_col_ten;
+ for i=1 upto 7:
+ label.rt(textext(decimal((i+3) mod 7)),col10[i]+10u*right);
+ endfor;
+enddef;
+
+def draw_labels_col_eight_a=
+ draw_labels_col_eight_julian;
+ draw_labels_col_eight_gregorian;
+ label(textext("VIII"),col8[1]-(0,10u));
+ label(textext("J.C.") scaled 1.5,
+ col8[7]+(-col_shift_eight_a,0)+(col8[7]-col8[6]));
+ label(textext("G.C.") scaled 1.5,
+ col8[7]+(col_shift_eight_b,0)+(col8[7]-col8[6]));
+enddef;
+
+def draw_labels_col_eight_b=
+ for i=1 upto 7:
+ label.top(decimal(i-1),col8[i]);
+ endfor;
+enddef;
+
+def draw_labels_col_nine=
+ for i=1 upto 13:
+ label.rt(textext(DL(1+(3+i) mod 7)),col9[i]);
+ endfor;
+ label(textext("IX"),col9[1]-(0,10u));
+ label.rt(textext("Dom. L.") rotated 90,col9[1]-(0,10u));
+enddef;
+
+def draw_labels_col_nine_a=
+ for i=1 upto 13:
+ label.rt(textext(DL(1+(3+i) mod 7)
+ & " ("&decimal((i+3) mod 7)&")"),col9[i]);
+ endfor;
+ label(textext("IX"),col9[1]-(0,10u));
+ label.rt(textext("Dom. L.") rotated 90,col9[1]-(0,10u));
+enddef;
+
+def draw_block_five_labels=
+ draw_labels_col_eight_a;
+ draw_labels_col_eight_b;
+ draw_labels_col_nine_a;
+ draw_labels_col_ten_a;
+enddef;
+
+def draw_block_six_labels=
+ draw_labels_col_nine;
+ draw_labels_col_eleven;
+enddef;
+
+def draw_block_seven_labels=
+ draw_labels_col_seven_c;
+ draw_labels_col_eleven;
+enddef;
+
+def draw_all_labels=
+ draw_first_labels;
+ draw_labels_col_eight_julian;
+ draw_labels_col_eight_gregorian;
+ label(textext("VIII"),col8[1]-(0,10u));
+ draw_labels_col_nine;
+ draw_labels_col_ten;
+ draw_labels_col_eleven;
+enddef;
+
+def draw_block_one_brace=
+ label(textext("$\overbrace{\kern85bp}^{\hbox{Year}}$") scaled 1.5,
+ col2[37]+4(col2[37]-col2[36]));
+enddef;
+
+def draw_col_eight_brace=
+ label(textext("$\overbrace{\kern50bp}^{\hbox{$S$}}$") scaled 1.5,
+ col8[7]+2(col8[7]-col8[6])+(.5(col_shift_eight_b-col_shift_eight_a),0));
+enddef;
+
+def draw_block_five_braces=
+ draw_col_eight_brace;
+ label(textext("$\overbrace{\kern100bp}^{\hbox{Year}}$") scaled 1.5,
+ col9[13]+6(col9[13]-col9[12])
+ +(.25(col_shift_eight_b-col_shift_eight_a),0));
+enddef;
+
+def draw_block_six_brace=
+ draw_col_eight_brace;
+enddef;
+
+def draw_all_braces=
+ draw_block_one_brace;
+ draw_block_five_braces;
+enddef;
+
+def draw_block_one=
+ draw_block_one_example;
+ draw_block_one_circles;
+ draw_block_one_points; % after the circles
+ draw_block_one_labels;
+ draw_block_one_brace;
+ draw_labels_col_two_b;
+enddef;
+
+def draw_block_two=
+ draw_block_two_connections;
+ draw_block_two_example;
+ draw_block_two_points; % after the circles
+ draw_block_two_labels;
+ draw_labels_col_four_c;
+ draw_labels_col_two_c;
+enddef;
+
+def draw_block_three=
+ draw_block_three_example;
+ draw_block_three_circles;
+ draw_block_three_points; % after the circles
+ draw_block_three_labels;
+enddef;
+
+def draw_block_four=
+ draw_block_four_connections;
+ draw_block_four_example;
+ draw_block_four_points; % after the circles
+ draw_block_four_labels;
+enddef;
+
+def draw_block_five=
+ draw_block_five_example;
+ draw_block_five_circles;
+ draw_block_five_labels;
+ draw_block_five_points; % must be after the labels
+ draw_block_five_braces;
+enddef;
+
+def draw_block_six=
+ draw_block_six_connections;
+ draw_block_six_example;
+ draw_block_six_points; % after the example
+ draw_block_six_labels;
+enddef;
+
+def draw_block_seven=
+ draw_block_seven_example;
+ draw_easter_table; % after the example
+ draw_block_seven_labels;
+ draw_block_seven_points; % after the example
+ draw_easter_table_details;
+enddef;
+
+define_first_cols;
+define_easter_table;
+define_last_cols;
+define_col_six_labels;
+define_col_one_labels;
+define_col_three_labels;
+
+beginfig(1);
+ draw_all_connections;
+ draw_all_example;
+ draw_easter_table;
+ label(textext("\footnotesize "&
+ "\parbox{4cm}{\raggedright "&
+ "Note (a). The Gregorian years which have " &
+ "epact $=$ 25, dominical letter $=$ C, and " &
+ "Golden Number $>$ 11 have their Easter on " &
+ "April 18 instead of April 25. The only such " &
+ "years are 1954, 2049, 2106, 3165, 3260, 3317, "&
+ "3852, 3909, 4004, 6399, etc." &
+ "}"),C+35u*right);
+
+ draw_all_circles;
+ draw_all_labels;
+ draw_all_points; % after the circles and the labels
+ draw_all_braces;
+endfig;
+
+beginfig(11);
+ draw_block_one;
+endfig;
+
+beginfig(12);
+ draw_block_two;
+endfig;
+
+beginfig(13);
+ draw_block_three;
+endfig;
+
+beginfig(14);
+ draw_block_four;
+endfig;
+
+beginfig(15);
+ draw_block_five;
+endfig;
+
+beginfig(16);
+ draw_block_six;
+endfig;
+
+beginfig(17);
+ draw_block_seven;
+endfig;
+
+beginfig(21);
+ numeric v,w,last;
+ v=10u;
+ w=20u;
+ last=5;
+ pair P[],Q[],R[];
+ pickup pencircle scaled 2pt;
+ for i=0 upto last:
+ P[i]=(0,i*v);draw P[i];
+ Q[i]=(2w,i*v);draw Q[i];
+ endfor;
+ for i=0 upto 2last:
+ R[i]=(w,i*v/2);draw R[i];
+ endfor;
+ pickup pencircle scaled .5;
+
+ label.bot(textext("$p_i$"),P0);
+ label.bot(textext("$q_i$"),Q0);
+ label.bot(textext("$r_i$"),R0);
+ draw P2--Q3;
+ for i=0 upto 5:
+ label.lft(textext(decimal i) scaled .7,P[i]);
+ endfor;
+ for i=0 upto 5:
+ label.rt(textext(decimal i) scaled .7,Q[i]);
+ endfor;
+ for i=0 upto 4:
+ label.rt(textext(decimal i) scaled .7,R[i]);
+ endfor;
+ unfill bbox(thelabel.rt(textext("5") scaled .7,R5));
+ label.rt(textext("5") scaled .7,R5);
+ for i=6 upto 10:
+ label.rt(textext(decimal i) scaled .7,R[i]);
+ endfor;
+
+endfig;
+
+beginfig(25);
+ numeric v,w,last;
+ v=10u;
+ w=20u;
+ last=5;
+ pair P[],Q[],R[];
+ pickup pencircle scaled 2pt;
+ for i=0 upto last:
+ P[i]=(0,i*v);draw P[i];
+ Q[i]=(2w,i*v);draw Q[i];
+ endfor;
+ for i=0 upto 2last:
+ R[i]=(w,i*v/2);draw R[i];
+ endfor;
+ pickup pencircle scaled .5;
+
+ label.bot(textext("$p_i$"),P0);
+ label.bot(textext("$q_i$"),Q0);
+ label.bot(textext("$r_i$"),R0);
+ draw P2--Q3;
+ for i=0 upto 5:
+ label.lft(textext("$x_" & decimal i & "$") scaled .7,P[i]);
+ endfor;
+ for i=0 upto 5:
+ label.rt(textext("$y_" & decimal i & "$") scaled .7,Q[i]);
+ endfor;
+ for i=0 upto 4:
+ label.rt(textext("$z_" & decimal i & "$") scaled .7,R[i]);
+ endfor;
+ unfill bbox(thelabel.rt(textext("$z_5$") scaled .7,R5));
+ label.rt(textext("$z_5$") scaled .7,R5);
+ for i=6 upto 10:
+ label.rt(textext("$z_{" & decimal i & "}$") scaled .7,R[i]);
+ endfor;
+
+endfig;
+
+
+
+end
diff --git a/graphics/metapost/contrib/macros/hatching/README b/graphics/metapost/contrib/macros/hatching/README
new file mode 100644
index 0000000000..da6ac0e89e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/hatching/README
@@ -0,0 +1,52 @@
+-------------------------------------+-------------------------------------
+ ENGLISH | POLSKI
+-------------------------------------+-------------------------------------
+The file HATCHING.MP contains a set | Plik HATCHING.MP zawiera zestaw makr
+of METAPOST macros for hatching | METAPOST-owych do zakreskowywania
+interior of closed paths. | wn/etrza zamkni/etych /scie/zek.
+
+ made in BOP s.c.
+ e-mail: B.Jackowski@gust.org.pl
+ public domain software
+ (no copyrights, copylefts, copyups, copydowns, or whatsoever)
+
+ 21.09.2000 -- ver 0.11 (pre-release)
+
+The basic macro, hatchfill, works | Podstawowym makrem pakietu jest makro
+very much like the standard fill | hatchfill, dzia/laj/ace bardzo
+command. The general form of the | podobnie do makra fill. Og/olna
+hatchfill command call is as | posta/c u/zycia polecenia hatchfill
+follows: | wygl/ada nast/epuj/aco:
+
+ hatchfill path_expression withcolor c1 withcolor c2 ...
+
+The trick is that for hatching | Trick polega u/zyciu specjalnych
+special ``colors'' are used, namely, | ,,kolor/ow'' -- je/sli mianowicie
+if bluepart(c)<0, the colour c is | bluepart(c)<0, to sk/ladowe koloru c
+interpreted as hatching data: | s/a traktowane jako informacja
+ | o zakreskowaniu:
+
+ hatching angle redpart(c) k/at nachylenia
+ distance between lines greenpart(c) odleg/lo/s/c mi/edzy kreskami
+ thickness of lines -bluepart(c) grubo/s/c kresek
+
+Dashing and colouring of the hatch | Za pomoc/a makra hatchoptions mo/zna
+pattern can be accomplished by | zdefiniowa/c kolor kresek a tak/ze
+using hatchoptions command (cf. | wz/or w przypadku linii przerywanych
+drawoptions in plain.mp). Actually, | (por. makro drawoptions, plain.mp).
+an arbitrary pattern can be used | W istocie dowolny obiekt mo/ze zosta/c
+instead of straight lines: it | u/zyty do wype/lnienia /scie/zki: w tym
+suffices to redefine the macro | celu nale/zy zdefiniowa/c w odpowiedni
+draw_hatched_band (cf. htchuse.mp, | spos/ob makro draw_hatched_band (por.
+figure 103), although one should be | htchuse.mp, ilustracja 103), jednak/ze
+aware that METAPOST memory can be | nale/zy pami/eta/c, /ze w ten spos/ob
+easily overloaded and that the | mo/zna /latwo wyczerpa/c zasoby
+resulting EPS files are usually | pami/eciowe METAPOST-a i /ze na og/o/l
+annoyingly large. | otrzymuje si/e pliki irytuj/aco du/ze.
+ |
+The examples of usage can be found | Przyk/lady u/zycia mo/zna znale/x/c
+in htchuse.mp; for convenience, | w pliku htchuse.mp; dla wygody
+a trivial TeX file for typesetting | do/l/aczony zosta/l trywialny pliczek
+the figures, htchuse_.tex, is | TeX-owy (htchuse_.tex), sk/ladaj/acy
+included. | jedn/a stron/e z tymi przyk/ladami.
+
diff --git a/graphics/metapost/contrib/macros/hatching/hatching.mp b/graphics/metapost/contrib/macros/hatching/hatching.mp
new file mode 100644
index 0000000000..af86e19d2b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/hatching/hatching.mp
@@ -0,0 +1,64 @@
+%%% addto clip hatchfill hatchfill_
+%%% numeric color
+%%% length withcolor
+% This is HATCHING.MP file defining a set of METAPOST macros for
+% hatching interior of closed paths.
+%
+% Made in BOP, Gda\'nsk, Poland
+% E-mail contact: B.Jackowski@gust.org.pl
+% Public domain software (no copyrights, copylefts, copyups, copydowns, etc.)
+% Current version: 11.07.2000 -- ver 0.1 (pre-release)
+% Current version: 21.09.2000 -- ver 0.11 (ending semicolon
+% added in |extra_beginfig|; |hatchfill_| introduced in order
+% to make possible something like |def fill = hatchfill enddef|
+def hatchfill_ expr c = addto currentpicture contour c _op_ enddef;
+
+vardef hatchfill text p =
+ save c_,p_; path p_; color c_[\\]; c_.num:=0;
+ save withcolor_; let withcolor_:=withcolor;
+ def withcolor = ; c_[incr c_.num]:= enddef;
+ p_:=p; let withcolor:=withcolor_;
+ for i_:=c_.num downto 1: % find the least ``true'' fill
+ c_.num':=i_; exitif bluepart(c_[i_])>0;
+ endfor
+ if c_.num>0:
+ for i_:=c_.num' upto c_.num:
+ if bluepart(c_[i_])<0: draw hatched(p_)c_[i_];
+ else: hatchfill_ p_ withcolor c_[i_]; fi
+ endfor
+ else: hatchfill_ p_; fi
+enddef;
+
+vardef hatched(expr o) primary c =
+ save a_, b_, d_, l_, i_, r_, za_, zb_, zc_, zd_;
+ path b_; picture r_; pair za_, zb_, zc_, zd_;
+ r_:=image(
+ a_:=redpart(c) mod 180; l_:=greenpart(c); d_:=-bluepart(c);
+ b_:=o rotated -a_;
+ b_:=if a_>=90: (lrcorner b_--llcorner b_--ulcorner b_--urcorner b_--cycle)
+ else: (llcorner b_--lrcorner b_--urcorner b_--ulcorner b_--cycle) fi
+ rotated a_;
+ za_:=point 0 of b_; zb_:=point 1 of b_;
+ zc_:=point 2 of b_; zd_:=point 3 of b_;
+ if hatch_match>0:
+ n_:=round(length(zd_-za_)/l_); if n_<2: n_:=2; fi; l_:=length(zd_-za_)/n_;
+ else: n_:=length(zd_-za_)/l_; fi
+ % show (greenpart(c), l_);
+ for i_:=if hatch_match>0: 1 else: 0 fi upto ceiling n_-1:
+ draw_hatched_band((i_/n_)[zd_,za_],(i_/n_)[zc_,zb_],a_,l_,d_);
+ endfor
+ );
+ clip r_ to o; r_
+enddef;
+
+def draw_hatched_band(expr za,zb,a,l,d) = % normally, |a| and |l| are ignored
+ draw za--zb withpen pencircle scaled d _hop_;
+enddef;
+
+def hatchoptions(text t) = def _hop_ = t enddef enddef;
+
+newinternal hatch_match; hatch_match:=1;
+hatchoptions(); extra_beginfig:=extra_beginfig & ";hatchoptions();";
+
+endinput
+%%\end
diff --git a/graphics/metapost/contrib/macros/hatching/htchuse.mp b/graphics/metapost/contrib/macros/hatching/htchuse.mp
new file mode 100644
index 0000000000..493ce3ad53
--- /dev/null
+++ b/graphics/metapost/contrib/macros/hatching/htchuse.mp
@@ -0,0 +1,55 @@
+%%% addto hatchfill
+%%% addto beginfig
+%%% enddef endfig
+%%% length withcolor dashed off on
+% This is a sample file demonstrating how one can use the macros defined
+% in hatching.mp.
+
+input hatching.mp;
+
+vardef star(expr n) =
+ for i_:=0 upto 2n-1:
+ if odd i_: 1/2 fi (right rotated (180*(i_/n))) --
+ endfor cycle
+enddef;
+
+beginfig(100);
+ path p; p:=unitsquare xscaled 50mm yscaled 25mm;
+ hatchfill p withcolor red withcolor (45,2mm,-.5bp) withcolor (-45,2mm,-.5bp);
+
+endfig;
+
+beginfig(101);
+ interim hatch_match:=0;
+ path p; p:=star(10) xscaled 35mm yscaled 20mm rotated 20;
+ hatchfill p withcolor (0,1,.5);
+ draw image(hatchfill p
+ withcolor (45,3bp,-.5bp) withcolor (-45,3bp,-.5bp);
+ ) withcolor red dashed evenly; % |evenly=dashpattern(on 3bp off 3bp)|
+endfig;
+
+beginfig(102);
+ path p; p:=star(10) xscaled 35mm yscaled 20mm rotated 20;
+ interim hatch_match:=0;
+ hatchoptions(withcolor blue dashed evenly scaled 2);
+ hatchfill p withcolor .75white withcolor (20,6bp,-.5bp);
+ hatchoptions(withcolor (blue+green) dashed evenly shifted (3/2bp,0));
+ hatchfill p withcolor (110,6bp,-.5bp);
+endfig;
+
+beginfig(103);
+ path p; p:=star(10) xscaled 35mm yscaled 35mm;
+ save draw_hatched_band;
+ vardef draw_hatched_band(expr za,zb,a,l,d) =
+ save n_; n_:=length(za-zb)/l;
+ for i_:=0 upto ceiling n_:
+ fill star(10) xscaled 2/5l yscaled 2/5l
+ shifted (i_/n_)[za,zb] withcolor (i_/n_)[green,blue];
+ endfor
+ enddef;
+ hatchfill p withcolor (red+green) withcolor (45,10bp,-1bp);
+endfig;
+
+end.
+%%\end
+
diff --git a/graphics/metapost/contrib/macros/hatching/htchuse_.tex b/graphics/metapost/contrib/macros/hatching/htchuse_.tex
new file mode 100644
index 0000000000..bf10d5c747
--- /dev/null
+++ b/graphics/metapost/contrib/macros/hatching/htchuse_.tex
@@ -0,0 +1,11 @@
+\input epsf % dvips standard
+\nopagenumbers
+
+\lineskiplimit\maxdimen \lineskip5mm
+
+\centerline{\epsffile{htchuse.100}}
+\centerline{\epsffile{htchuse.101}}
+\centerline{\epsffile{htchuse.102}}
+\centerline{\epsffile{htchuse.103}}
+
+\end
diff --git a/graphics/metapost/contrib/macros/latexmp/README b/graphics/metapost/contrib/macros/latexmp/README
new file mode 100644
index 0000000000..604654ab87
--- /dev/null
+++ b/graphics/metapost/contrib/macros/latexmp/README
@@ -0,0 +1,12 @@
+The MetaPost package latexMP implements a user-friendly
+interface to access LaTeX-based typesetting capabilities in
+MetaPost.
+The text to be typeset is given as string. This allows even
+dynamic text elements, for example counters, to be used in
+labels.
+
+All files of the package belong to the Public Domain.
+
+Since version 1.2 the MP prologues value is not set by
+latexMP anymore. Additionally, the compatibility with
+the normal btex..etex behaviour has been improved.
diff --git a/graphics/metapost/contrib/macros/latexmp/doc/latexmp.pdf b/graphics/metapost/contrib/macros/latexmp/doc/latexmp.pdf
new file mode 100644
index 0000000000..297d4b4c78
--- /dev/null
+++ b/graphics/metapost/contrib/macros/latexmp/doc/latexmp.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/latexmp/latexmp.mp b/graphics/metapost/contrib/macros/latexmp/latexmp.mp
new file mode 100644
index 0000000000..fea35e5332
--- /dev/null
+++ b/graphics/metapost/contrib/macros/latexmp/latexmp.mp
@@ -0,0 +1,459 @@
+%D \module
+%D [ file=latexmp.mp,
+%D system={latexMP},
+%D version=1.2.1,
+%D title=latexMP,
+%D subtitle=LaTeX typesetting in \METAPOST,
+%D author=Jens-Uwe Morawski,
+%D date={2005/04/06},
+%D copyright={none; this module is Public Domain}]
+%D
+%C - all variables start with prefix "latexmp_"
+%C - all internal macros have suffix "_latexmp"
+%C - macros without "_latexmp" suffix are:
+%C textext, setupLaTeXMP
+
+%D \section{Initialisation}
+if known latexmp_module: message(" not loaded again"); endinput ; fi ;
+boolean latexmp_module ; latexmp_module := true ;
+
+%D set the name of the temporary file
+string latexmp_lmpfile ; latexmp_lmpfile := "ltx-" & jobname & ".tmp" ;
+
+%D save some original \METAPOST\ definitions
+inner end ; inner bye ;
+let origEnd_latexmp=end ;
+let origBye_latexmp=bye ;
+let origShipit_latexmp=shipit ;
+string latexmp_extrabeginfig, latexmp_extraendfig ;
+extra_endfig := extra_endfig & "; resetattachstrings_latexmp ;" ;
+latexmp_extrabeginfig := extra_beginfig ;
+latexmp_extraendfig := extra_endfig ;
+color latexmp_background ;
+latexmp_background := background ;
+
+%D The runtime control of latexMP states:
+%D (1) is this the second run in \type{rerun} mode ; (2) has the temporary
+%D mp file already been read; (3) is the LaTeX preamble already
+%D been written to the temporary file
+boolean latexmp_secondrun, latexmp_lmploaded, latexmp_texinit ;
+latexmp_secondrun := false ;
+latexmp_lmploaded := false ;
+latexmp_texinit := false ;
+
+%D The current number of \type{textext()} in the input file. The counter
+%D is incremented at every \type{textext} call. It is used to assign the
+%D pictures from the temporary file.
+numeric latexmp_counter ; latexmp_counter := 0 ;
+
+%D \section{Setup}
+%D LaTeX preamble variables
+string latexmp_docclass, latexmp_classoptions,
+latexmp_inputenc, latexmp_fontenc, latexmp_babellang,
+latexmp_packages, latexmp_preamble, latexmp_lmpprefix,
+latexmp_preamblefile ;
+
+latexmp_docclass := "article" ;
+latexmp_classoptions := "" ;
+latexmp_inputenc := "" ;
+latexmp_fontenc := "" ;
+latexmp_babellang := "" ;
+latexmp_packages := "" ;
+latexmp_preamble := "" ;
+latexmp_preamblefile := "" ;
+
+%D The setup variables that control activation of the specials:
+numeric latexmp_mode ; latexmp_mode := 1 ;
+boolean latexmp_subsinfont ; latexmp_subsinfont := false ;
+boolean latexmp_multicolor ; latexmp_multicolor := false ;
+boolean latexmp_debug ; latexmp_debug := false ;
+
+%D The setup command:
+def setupLaTeXMP(text kvps) =
+ if not latexmp_secondrun:
+ if latexmp_texinit:
+ message("LaTeXMP: setupLaTeXMP cannot be used if textext" &
+ "has already been used; set-up ignored.");
+ else:
+ begingroup;
+%D declaration of key-value parameters for LaTeX preamble
+ save class, options, inputencoding, fontencoding, language,
+ packages, preamble, preamblefile ;
+ string class, options, inputencoding, fontencoding, language,
+ packages, preamble, preamblefile;
+%D declaration of key and synonyms for \type{mode}
+ save mode, normal, rerun ;
+ numeric mode, normal, rerun ;
+ normal:=1 ; rerun := 2 ;
+%D declaration of keys and synonyms for the specials
+ save textextlabel, multicolor, debug, enable, disable ;
+ boolean textextlabel, multicolor, debug, enable, disable ;
+ enable:=true ; disable := false ;
+
+ processKeyvals_latexmp(kvps) ;
+
+ if known class:
+ if (length class) >0: latexmp_docclass:=class ;
+ else: latex_docclass:="article";
+ fi;
+ fi;
+ if known options: latexmp_classoptions:=options ; fi;
+ if known inputencoding: latexmp_inputenc:=inputencoding ; fi;
+ if known fontencoding: latexmp_fontenc:=fontencoding ; fi;
+ if known language: latexmp_babellang:=language ; fi;
+ if known preamble:latexmp_preamble:=preamble ; fi;
+ if known preamblefile: latexmp_preamblefile:=preamblefile ; fi;
+ if known packages: latexmp_packages:=packages ; fi;
+ if known mode:
+ if (mode=normal) or (mode=rerun): latexmp_mode:=mode ;
+ else:
+ errmessage("latexMP error: set mode either to 'normal' or 'rerun'.") ;
+ latexmp_mode := 1 ;
+ fi;
+ fi;
+ if known textextlabel: latexmp_subsinfont:=textextlabel ; fi;
+ if known multicolor: latexmp_multicolor:=multicolor ; fi;
+ if known debug: latexmp_debug:=debug ; fi;
+ endgroup;
+
+%D overwrite the default definition of \type{thelabel} if user has specified
+%D \type{textextlabel=enable}:
+ if latexmp_subsinfont:
+ vardef thelabel@#(expr s,z) =
+ save p; picture p;
+ if picture s: p=s
+ else: p = textext(s)
+ fi;
+ p shifted (z + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p ))
+ enddef;
+ fi;
+
+%D In \type{rerun} mode for the first run own definitions for \type{end}
+%D and \type{bye} are used; output is disabled for first run.
+ if latexmp_mode=2:
+ let end=end_latexmp ;
+ let bye=end_latexmp ;
+ let shipit=relax ;
+%D Since in the first run the temporary file will not contain
+%D correct definitions automatic loading of that file by \type{textext}
+%D is disabled (we fake here that it is already loaded). Loading of the
+%D temporary file in \type{end_latexmp}.
+ latexmp_lmploaded := true ;
+ fi;
+ fi;fi;
+enddef;
+
+%D used in \type{writeLaTeXpreamble_latexmp}
+%D to generate \type{\usepackage} statements
+def writepackages_latexmp=
+ begingroup;
+ save inoptions, currentpackage, currentoptions, s ;
+ boolean inoptions ; inoptions:=false;
+ string currentpackage, currentoptions, s ;
+ currentpackage:=""; currentoptions:="" ;
+
+ for c=0 upto ((length latexmp_packages)-1):
+ s := substring (c,c+1) of latexmp_packages ;
+ if s="[": inoptions := true ;
+ elseif s="]": inoptions := false;
+ elseif s=",":
+ if inoptions: currentoptions:= currentoptions & s ;
+ else:
+ if (length currentpackage)>0:
+ s:="{" & currentpackage & "}" ;
+ if (length currentoptions)>0:
+ s:="[" & currentoptions & "]" & s ;
+ fi;
+ write ("\usepackage" & s) to latexmp_lmpfile ;
+ currentpackage:=""; currentoptions:="" ;
+ fi;
+ fi;
+ else:
+ if inoptions: currentoptions:= currentoptions & s ;
+ else: currentpackage:= currentpackage & s ;
+ fi;
+ fi;
+ endfor;
+ if (length currentpackage)>0: s:="{" & currentpackage & "}" ;
+ if (length currentoptions)>0: s:="[" & currentoptions & "]" & s ; fi;
+ write ("\usepackage" & s) to latexmp_lmpfile ;
+ fi;
+ endgroup;
+enddef;
+
+%D \section{LaTeX preamble}
+
+def writeLaTeXpreamble_latexmp =
+ write "verbatimtex" to latexmp_lmpfile ;
+ write "%&latex" to latexmp_lmpfile ;
+%D If preamble file has been specified in the setup only a
+%D \type{\input} for this file will be used in the LaTeX preamble:
+ if (length latexmp_preamblefile)>0:
+ write ("\input{" & latexmp_preamblefile & "}") to latexmp_lmpfile ;
+ else:
+%D Specific definitions from the setup parameters:
+ write ("\documentclass"
+ if (length latexmp_classoptions)>0:
+ & "[" & latexmp_classoptions & "]"
+ fi & "{" & latexmp_docclass & "}") to latexmp_lmpfile ;
+ if (length latexmp_fontenc)>0:
+ write ("\usepackage[" & latexmp_fontenc & "]{fontenc}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_inputenc)>0:
+ write ("\usepackage[" & latexmp_inputenc & "]{inputenc}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_babellang)>0:
+ write ("\usepackage[" & latexmp_babellang & "]{babel}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_packages)>0: writepackages_latexmp ; fi;
+ if (length latexmp_preamble)>0:
+ write latexmp_preamble to latexmp_lmpfile ;
+ fi
+ fi;
+ if latexmp_multicolor:
+ write ("\makeatletter") to latexmp_lmpfile ;
+ write ("\font\latexmp@special=cmtt8 scaled 250") to latexmp_lmpfile ;
+ write ("\def\reset@color{" &
+ "\parbox[t][0pt][t]{0pt}{\makebox[0pt][l]{\latexmp@special ecolorxxx}}}")
+ to latexmp_lmpfile ;
+ write ("\newcommand*{\color}[2][named]{\parbox[t][0pt][t]{0pt}{" &
+ "\makebox[0pt][l]{\latexmp@special bcolorxxx:#1:#2}}" &
+ "\aftergroup\reset@color\ignorespaces}") to latexmp_lmpfile ;
+ write ("\def\textcolor#1#{\@textcolor{#1}}") to latexmp_lmpfile ;
+ write ("\def\@textcolor#1#2#3{\protect\leavevmode{\color#1{#2}#3}}")
+ to latexmp_lmpfile ;
+ write ("\newcommand*{\transparent}[3][1]{\parbox[t][0pt][t]{0pt}{"&
+ "\makebox[0pt][l]{\latexmp@special btransxxx:#1,#2}}"&
+ "#3\parbox[t][0pt][t]{0pt}{" &
+ "\makebox[0pt][l]{\latexmp@special etransxxx}}}") to latexmp_lmpfile ;
+ write "\makeatother" to latexmp_lmpfile ;
+ fi;
+ write "\begin{document}" to latexmp_lmpfile ;
+ write "etex" to latexmp_lmpfile ;
+ write "picture latexmp_picture[];" to latexmp_lmpfile ;
+enddef;
+
+%D \section{Main Macros}
+
+%D The macro that does the job:
+vardef textext@#(expr s)=
+ save pic ; picture pic ;
+ latexmp_counter:= latexmp_counter+1 ;
+ getpicture_latexmp ;
+ addstring_latexmp(s) ;
+ if (length (str @#))>0 :
+ % V. 1.1 compatible with MetaFun
+ thelabel@#(pic,origin)
+ else:
+ % V. 1.2 better compatibility with btex..etex
+ pic
+ fi
+enddef;
+
+%D strings \type{latexmp_prepend} and \type{latexmp_append} are attached
+%D to the string passed to \type{textext}. This may be useful for package
+%D authors to implement styling interfaces.
+string latexmp_prepend, latexmp_append ;
+latexmp_prepend:= "" ; latexmp_append := "" ;
+
+%D is called at each endfig via extra_endfig
+def resetattachstrings_latexmp =
+ latexmp_prepend:= "" ; latexmp_append := "" ;
+enddef;
+
+def addstring_latexmp(expr s)=
+ if not latexmp_texinit:
+ write EOF to latexmp_lmpfile ;
+ writeLaTeXpreamble_latexmp ;
+ latexmp_texinit := true ;
+ fi;
+ write "latexmp_picture[" & (decimal latexmp_counter) & "]:= btex " &
+ latexmp_prepend & s & latexmp_append & " etex ;" to latexmp_lmpfile ;
+enddef;
+
+def getpicture_latexmp =
+ if not latexmp_lmploaded:
+ if not (readfrom latexmp_lmpfile=EOF):
+ scantokens ("input " & latexmp_lmpfile) ;
+ fi;
+ latexmp_lmploaded := true ;
+ fi;
+ if known latexmp_picture[latexmp_counter]:
+ if latexmp_multicolor and not latexmp_debug:
+ pic := colorspecials_latexmp(latexmp_picture[latexmp_counter]) ;
+ else:
+ pic := latexmp_picture[latexmp_counter] ;
+ fi;
+ else:
+ pic := ("LaTeXMP " & (decimal latexmp_counter))
+ infont defaultfont ;
+ fi;
+enddef;
+
+%D The following is only used if option \type{multicolor} is set in
+%D \type{setupLaTeXMP}. It is employed in \type{getpicture_latexmp}
+%D in order to strip specials from the LaTeX picture and change
+%D the colors of text elements accordigly.
+vardef colorspecials_latexmp(expr p) =
+ save _P, _bb, _tp, _fp, _t, _addto_P ;
+ save _withcolor, _colorpointer, _transparent, _transpointer;
+ picture _P ; path _bb ;
+ string _withcolor[], _transparent[], _tp, _fp, _addto_P ;
+ numeric _colorpointer, _transpointer ;
+ _P := nullpicture ; _bb := pathpart p ;
+ _withcolor[0]:= "" ; _colorpointer := 0 ; _transparent[0]:="" ;
+ _transpointer:=0 ;
+ _addto_P := "addto _P also _tp infont _fp transformed _t " ;
+ for c within p:
+ if textual c:
+ _tp:= textpart c ;
+ _fp:= fontpart c ;
+ transform _t ;
+ (xpart _t,xxpart _t,xypart _t)=(xpart c,xxpart c,xypart c) ;
+ (ypart _t,yypart _t,yxpart _t)=(ypart c,yypart c,yxpart c) ;
+ if (_fp="cmtt8") and ((substring (1,9) of _tp)="colorxxx"):
+ % color special found
+ if (substring (0,1) of _tp)="b":
+ % begin color special
+ _colorpointer := _colorpointer+1;
+ _withcolor[_colorpointer]:= colormacro_latexmp(substring (10,(length _tp)) of _tp) ;
+ elseif (substring (0,1) of _tp)="e":
+ % end color special
+ if not (_colorpointer=0):
+%C if \type{\color} is used ungrouped in a parbox the \type{ecolorxxx}
+%C appears prior \type{bcolorxxx}. multiple instances of \type{ecolorxxx}
+%C would result in counting \type{_colorpointer<0}. thus checking
+%C for \type{_colorpointer=0} is a ugly hack for this problem.
+ _colorpointer := _colorpointer-1;
+ fi;
+%C else:?? ooops; should not happen
+ fi;
+ elseif (_fp="cmtt8") and ((substring (1,9) of _tp)="transxxx"):
+ % transparency special found
+ if (substring (0,1) of _tp)="b":
+ % begin trans special
+ _transpointer := _transpointer+1;
+ _transparent[_transpointer]:= substring (10,(length _tp)) of _tp ;
+ elseif (substring (0,1) of _tp)="e":
+ % end trans special
+ _transpointer := _transpointer-1;
+ fi;
+ else:
+ scantokens (_addto_P & withcurrentcolor_latexmp ) ;
+ fi;
+ fi;
+ endfor;
+ setbounds _P to _bb ;
+ _P
+enddef;
+
+vardef colormacro_latexmp(expr colspec)=
+ save _cmd, _pos, _m, _c ; string _cmd, _m, _c ;
+ _pos := 0 ; _cmd:="" ;
+ for i=1 upto (length colspec):
+ if (substring (i-1,i) of colspec)=":":
+ _pos := i ;
+ fi;
+ endfor;
+ if _pos<2: % "x:..." --> no color model found
+ errmessage("LaTeXMP: no color model found in: " & colspec) ;
+ else:
+ _m := substring (0,(_pos-1)) of colspec ;
+ _c := substring (_pos,(length colspec)) of colspec ;
+ if expandafter known (scantokens ("latexmp_color_" & _m)):
+ _cmd := (scantokens ("latexmp_color_" & _m)) & "(" & _c & ")" ;
+ else:
+ errmessage("LaTeXMP: color model '" & _m & "' not supported)") ;
+ fi;
+ fi;
+ _cmd
+enddef;
+
+vardef withcurrentcolor_latexmp=
+ if (length _withcolor[_colorpointer])>0:
+ if (length _transparent[_transpointer])>0:
+ " withcolor transparent(" & _transparent[_transpointer] & "," &
+ _withcolor[_colorpointer] &")"
+ else: " withcolor " & _withcolor[_colorpointer] fi
+ else:
+ if (length _transparent[_transpointer])>0:
+ " withcolor transparent(" & _transparent[_transpointer] & ",black)"
+ else: "" fi
+ fi
+enddef;
+
+%D \section{The end macro for rerun mode}
+string latexmp_beforererun ; latexmp_beforererun := "" ;
+
+def end_latexmp =
+%D read temporary file if strings have been written there
+ if latexmp_counter>0:
+ write EOF to latexmp_lmpfile;
+ scantokens ("input " & latexmp_lmpfile) ;
+ fi;
+%D re-init
+ latexmp_counter := 0 ; latexmp_secondrun := true ; latexmp_texinit := false ;
+%D restore defaults
+ extra_beginfig := latexmp_extrabeginfig ;
+ extra_endfig := latexmp_extraendfig ;
+ background := latexmp_background ;
+ let end=origEnd_latexmp ; let bye=origBye_latexmp ;
+ let shipit=origShipit_latexmp ;
+ clear_pen_memory; clearit;
+ pickup pencircle scaled .5bp; defaultpen := savepen;
+%D run pre-rerun hooks
+ scantokens latexmp_beforererun ;
+%D input current job again
+ scantokens ("input " & jobname) ;
+enddef;
+
+%D \section{color support}
+vardef Hsvcolor_latexmp(expr H,s,v) =
+ save h, o, b, d, pc, sc; numeric h, o, b, d, pc, sc ;
+ h := H/60 ; pc := floor h ; sc := h - pc ;
+ o := (1-s)*v ; b := (1-(sc*s))*v ; d := (1-((1-sc)*s))*v ;
+ if (pc = 0) or (pc = 6): (v,d,o)
+ elseif pc = 1: (b,v,o)
+ elseif pc = 2: (o,v,d)
+ elseif pc = 3: (o,b,v)
+ elseif pc = 4: (d,o,v)
+ else:(v,o,b)
+ fi
+enddef;
+vardef cmykcolor_latexmp(expr c,m,y,k) =
+%D use MetaFun cmyk-specials if available; macro \type{cmyk()}
+%D checks if \type{cmykcolors=true}
+ if known context_spec: cmyk(c,m,y,k) else: (1-c-k,1-m-k,1-y-k) fi
+enddef;
+vardef graycolor_latexmp(expr g) = (g,g,g) enddef ;
+
+%D which macro should be used for a given color model in multicolor mode.
+string latexmp_color_Hsv, latexmp_color_rgb,
+latexmp_color_gray, latexmp_color_cmyk, latexmp_color_named ;
+
+latexmp_color_Hsv := "Hsvcolor_latexmp" ;
+latexmp_color_gray := "graycolor_latexmp" ;
+latexmp_color_rgb := "" ;
+latexmp_color_cmyk := "cmykcolor_latexmp" ;
+latexmp_color_named := "" ;
+
+%D \section{Key-Value Support Macros}
+def processKeyvals_latexmp (text _kvps_)=
+ begingroup;
+ save _equals, _assign ;
+ let _equals= = ;
+
+ primarydef _ll_ _assign _rr_ =
+ hide(_ll_ _equals _rr_ ) 1
+ enddef;
+
+ save = ;
+ let = _equals _assign ;
+ for _xx_ _equals _kvps_ : endfor ;% NOP
+ endgroup;
+enddef;
diff --git a/graphics/metapost/contrib/macros/m3D/README b/graphics/metapost/contrib/macros/m3D/README
new file mode 100644
index 0000000000..74110f9ece
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/README
@@ -0,0 +1,52 @@
+m3D package
+--------------------
+
+Last modification: december 14, 2005
+------------------------------------
+
+Summary
+-------
+
+The m3D package is an extension to plain MetaPost designed
+for 3 dimensional graphics.
+
+Licence
+-------
+
+Standard LaTeX licence even if I also like the
+``Feel-free-to-send-me-a-postcard'' one.
+
+Brief description of the files
+------------------------------
+
+* mpinputs: MetaPost input files.
+ o m3Dplain.mp (the very core of m3D, reading
+ it is better than read any manual)
+ o m3Dlib01.mp (a small library where one cand find
+ some common mathematical objects)
+ o One may add here new libraries.
+
+* manual: a draft for a manual.
+ o m3Dmanual.pdf (to be read directly)
+ o m3Dmanual.ps (to be read directly)
+ o m3Dmanual.tex (the text [plain-TeX]),
+ o m3Dmanual.mp (illustrations, this helps also to understand
+ how to use m3D),
+ o m3Dmanmac.tex (personal plain-TeX format)
+
+* trials: various things using m3D. Try them.
+
+* gallery: a small gallery of still or animated images.
+
+Suggested TDS location for the contents of mpinputs:
+----------------------------------------------------
+$TEXMF/metapost/misc/m3D
+
+Suggested TDS location for other files:
+---------------------------------------
+/dev/null
+
+Brief commentary: Happy MetaPosting.
+-----------------
+
+Anthony Phan.
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Danim.gif b/graphics/metapost/contrib/macros/m3D/gallery/m3Danim.gif
new file mode 100644
index 0000000000..73b0f14836
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Danim.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dchair.1.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dchair.1.jpg
new file mode 100644
index 0000000000..b82348cbed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dchair.1.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Ddirect.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Ddirect.jpg
new file mode 100644
index 0000000000..d61719e588
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Ddirect.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dlego.gif b/graphics/metapost/contrib/macros/m3D/gallery/m3Dlego.gif
new file mode 100644
index 0000000000..18d85d7223
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dlego.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.1.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.1.jpg
new file mode 100644
index 0000000000..b136497fde
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.1.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.2.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.2.jpg
new file mode 100644
index 0000000000..23df3b25c8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.2.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.3.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.3.jpg
new file mode 100644
index 0000000000..386a41c90f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.3.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.4.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.4.jpg
new file mode 100644
index 0000000000..cc8ac19060
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.4.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.5.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.5.jpg
new file mode 100644
index 0000000000..54030d718a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.5.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.6.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.6.jpg
new file mode 100644
index 0000000000..dafc4648b0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.6.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.7.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.7.jpg
new file mode 100644
index 0000000000..314c0219fb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.7.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.8.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.8.jpg
new file mode 100644
index 0000000000..b396602278
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dmanual.8.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dpolyhedron.gif b/graphics/metapost/contrib/macros/m3D/gallery/m3Dpolyhedron.gif
new file mode 100644
index 0000000000..a18edf504d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dpolyhedron.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/gallery/m3Dviviani.1.jpg b/graphics/metapost/contrib/macros/m3D/gallery/m3Dviviani.1.jpg
new file mode 100644
index 0000000000..9140ced0e7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/gallery/m3Dviviani.1.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/manual/m3Dmanmac.tex b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanmac.tex
new file mode 100644
index 0000000000..e5edcdd900
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanmac.tex
@@ -0,0 +1,1378 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% m3Dmanmac.tex.
+% Auteur : Anthony PHAN.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\ifx\typofrmtversion\undefined\else\endinput\fi
+\def\typofrmtversion{October 19, 2004}%
+%
+\catcode`\@=11
+{\obeyspaces\def\@space{\leavevmode\space}\global\let =\@space}%
+\def\claimsep{\ ---\ \ignorespaces}%
+\def\claimbreak{\ifvmode\medbreak\fi}%
+\def\breakupto#1{\vskip\z@ plus#1\penalty-250\vskip\z@ plus-#1}%
+%
+\def\meta#1#2{\expandafter\def\csname meta@#1\endcsname{#2}}%
+\meta{school}{Universit\'e de Poitiers\\
+ D\'epartement de Math\'ematiques}%
+\let\meta@degree=\undefined
+\let\meta@course=\undefined%
+\meta{year}{Ann\'ee \anneescolaire}%
+\meta{head}{\vtop{\let\\=\cr\halign{\strut##\hfil\cr
+ \meta@school\crcr}}\hfill
+ \vtop{\let\\=\cr\halign{\strut\hfil##\cr
+ \ifx\meta@degree\undefined\else\meta@degree\cr\fi
+ \meta@year\crcr}}}%
+\def\anneescolaire{%
+ \ifnum\month<7 {\count0=\year\advance\count0 by -1
+ \the\count0--\the\year}%
+ \else{\count0=\year\advance\count0 by 1
+ \the\year--\the\count0}\fi}%
+%
+%\long\def\gobblepar#1{\ifx#1\par\let\@next=\relax
+% \else\def\@next{{#1}}\fi\@next}%
+\def\setcounter#1#2{\csname c@#1\endcsname=#2\relax}%
+%
+% THE NEXT MACRO MUST BE INCLUDED
+% IN THE \BYE COMMAND. FOR INSTANCE:
+%
+% \catcode`@=11
+% \outer\def\bye{\close@aux
+% \par\vfill\supereject\end}%
+% \catcode`@=12
+%
+\def\addto#1#2{{\def\@addto##1\end@addto{\gdef#1{##1}}%
+ \expandafter\@addto#1#2\end@addto}}%
+%
+\def\addtoreset#1#2{%
+ \expandafter\ifx\csname cl@#1\endcsname\relax
+ \expandafter\edef\csname cl@#1\endcsname%
+ {\csname c@#2\endcsname=0\relax}\else
+ \expandafter\@addtoreset\csname cl@#1\endcsname
+ {\csname c@#2\endcsname=0\relax}\fi}%
+\def\@addtoreset#1#2{\edef#1{#1#2}}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% OPTIONS SYSTEM
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\def\documentclass#1{%
+ \ifx[#1\let\AfterOptions=\documentclass
+ \def\@next{\ProcessOptions[}\else\let\AfterOptions=\relax
+ \def\@next{\expandafter\ifx\csname option@#1\endcsname\relax
+ \message{documentclass "#1" is undefined !}%
+ \option@article\else\csname option@#1\endcsname\fi}\fi\@next}%
+\def\UseOptions#1{\let\AfterOptions=\relax\ProcessOptions[#1]}%
+\def\useoptions{\UseOptions}%
+\def\ProcessOptions[#1]{\@ProcessOptions[#1,\undefined,\undefined]%
+ \AfterOptions}%
+\def\@ProcessOptions[#1,#2]{\ifx#1\undefined\else
+ \expandafter\ifx\csname option@#1\endcsname\relax
+ \message{Option "#1" is undefined !}%
+ \else\csname option@#1\endcsname\fi
+ \@ProcessOptions[#2]\fi}%
+\def\DefineOption#1{\expandafter\def\csname option@#1\endcsname}%
+\let\AfterOptions=\relax
+%\newwrite\tmp@out
+%\def\IfFileExists#1#2#3{\immediate\openin\tmp@out=#1
+% \ifeof\tmp@out\immediate\closein\tmp@out
+% #3\relax
+% \else\immediate\closein\tmp@out
+% #2\relax
+% \fi}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% HYPERTEXT
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\#=12 \catcode`\*=6
+\gdef\@HyperLinkRef*1{\special{html:<a href="#*1">}}%
+\gdef\@HyperLinkName*1{\special{html:<a name="*1">}}%
+\gdef\@endHyperLink{\special{html:</a>}}}%
+\def\HyperLinkRef#1{}%
+\def\HyperLinkName#1{}%
+\let\endHyperLink=\relax
+\DefineOption{hypertext}{%
+ \let\HyperLinkRef=\@HyperLinkRef
+ \let\HyperLinkName=\@HyperLinkName
+ \let\endHyperLink=\@endHyperLink}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% POINT SIZE
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\DefineOption{magstep0}{\voffset=0.12 true cm
+ \hoffset=0.31 true cm
+ \vsize=24.2 true cm
+ \hsize=15.3 true cm
+ }%
+\DefineOption{magstephalf}{\mag=\magstephalf
+ \voffset=0.12 true cm
+ \hoffset=0.31 true cm
+ \vsize=24.2 true cm
+ \hsize=15.3 true cm
+ }%
+\DefineOption{magstep1}{\mag=\magstep1
+ \voffset=0.12 true cm
+ \hoffset=0.31 true cm
+ \vsize=24.2 true cm
+ \hsize=15.3 true cm
+ }%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LANGUAGE DEPENDENT
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\DefineOption{french}{\language=1
+ \def\authorsep{\bigbreak}% par }%
+ \def\seename{voir}%
+ \def\indexname{Index}%
+ \def\bibname{Bibliographie}%
+ \def\refname{R\'ef\'erences}%
+ \def\chaptername{Chapitre}%
+ \def\chapvarname{Chap.}%
+ \def\contentsname{Table des mati\`eres}%
+ \def\remarkname{Remarque}%
+ \def\remarksname{Remarques}%
+ \def\proofname{D\'emonstration}%
+ \def\figurename{Fig{\rm.}}%
+ \def\theoremname{Th\'eor\`eme}%
+ \def\propositionname{Proposition}%
+ \def\definitionname{D\'efinition}%
+ \def\corollaryname{Corollaire}%
+ \def\lemmaname{Lemme}%
+ \def\examplename{Exemple}%
+ \def\examplesname{Exemples}%
+ \def\exercicename{Exercice}%
+ \def\chapternumeral##1{\ifcase##1 \or premier\else
+ \uppercase\expandafter{\romannumeral##1}\fi}%
+ \def\today{\number\day\space\ifcase\month\or
+ janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
+ juillet\or ao\^ut\or septembre\or octobre\or novembre\or
+ d\'ecembre\fi\space\number\year}%
+ \let\og=\og@french\let\fg=\fg@french
+ \frenchspacing}%
+\DefineOption{english}{\language=0
+ \def\authorsep{\bigbreak}% by }%
+ \def\indexname{Index}%
+ \def\seename{see}%
+ \def\bibname{Bibliography}%
+ \def\refname{References}%
+ \def\chaptername{Chapter}%
+ \def\chapvarname{Chap.}%
+ \def\contentsname{Table of Contents}%
+ \def\remarkname{Remark}%
+ \def\remarksname{Remarks}%
+ \def\proofname{Proof}%
+ \def\figurename{Fig{\rm.}}%
+ \def\theoremname{Theorem}%
+ \def\propositionname{Proposition}%
+ \def\definitionname{Definition}%
+ \def\corollaryname{Corollary}%
+ \def\lemmaname{Lemma}%
+ \def\examplename{Example}%
+ \def\examplesname{Examples}%
+ \def\exercicename{Exercice}%
+ \def\chapternumeral##1{\uppercase\expandafter{\romannumeral##1}}%
+ \let\og=\og@english \let\fg=\fg@english
+ \def\today{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or
+ December\fi\space\number\day, \number\year}%
+ \frenchspacing}%
+\def\date{\today}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FONTS' SECTION (typofont.tex)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\def\DeclareMathSymbol#1#2#3#4{%
+ \count@=#2\multiply\count@ by 16
+ \advance\count@ by \csname#3fam\endcsname
+ \multiply\count@ by 256\advance\count@ by #4
+ \ifcat\noexpand#1\relax
+ \mathchardef#1=\count@
+ \else
+ \expandafter\mathcode
+ \expandafter`\csname#1\endcsname=\count@
+ \fi}%
+%
+\def\DeclareFont#1#2#3#4#5{\ifx*#2%
+ \expandafter\def\csname#1\endcsname{\font\current@font=#3%
+ \current@font}\else
+ \expandafter\font\csname#1@t\endcsname=#3
+ \expandafter\font\csname#1@s\endcsname=#4
+ \expandafter\font\csname#1@ss\endcsname=#5
+ \textfont#2=\csname#1@t\endcsname
+ \scriptfont#2=\csname#1@s\endcsname
+ \scriptscriptfont#2=\csname#1@ss\endcsname
+ \expandafter\def\csname#1\endcsname{\font\current@font=#3
+ \fam#2\current@font}%
+ \fi}%
+%
+%%\def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\n@space$}}}%
+%%\def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
+%%\left#1\vbox to7.25pt{}\right.\n@space$}}}%
+%%\def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
+%%\left#1\vbox to6.5pt{}\right.\n@space$}}}%
+%
+\font\headroman=cmr10% headings
+%
+\def\eightpoint{%
+ \DeclareFont{roman}{0}{cmr8}{cmr6}{cmr5}%
+ \DeclareFont{italic}{*}{cmti8}{*}{*}%
+ \DeclareFont{smallcaps}{*}{cmcsc8}{*}{*}%
+ \DeclareFont{boldface}{4}{cmbx8}{cmbx6}{cmbx5}%
+ \DeclareFont{monospace}{*}{cmtt8}{*}{*}%
+ \DeclareFont{mit}{1}{cmmi8}{cmmi6}{cmmi5}%
+ \DeclareFont{cal}{2}{cmsy8}{cmsy6}{cmsy5}%
+ \DeclareFont{mathex}{3}{cmex8}{cmex8}{cmex8}%
+ \ifx\mbbfam\undefined\else
+ \DeclareFont{mbb}{\mbbfam}{mbb8}{mbb6}{mbb5}\fi
+ \ifx\mathafam\undefined\else
+ \DeclareFont{matha}{\mathafam}{matham8}{matham6}{matham5}\fi
+ \ifx\mathbfam\undefined\else
+ \DeclareFont{mathb}{\mathbfam}{mathbm8}{mathbm6}{mathbm5}\fi
+% \ifx\mathxfam\undefined\else
+% \DeclareFont{mathx}{\mathxfam}{mathx8}{mathx8}{mathx8}\fi
+ \DeclareFont{timesroman}{*}{ptmr at 8\p@}{*}{*}%
+ \DeclareFont{timesitalic}{*}{ptmri at 8\p@}{*}{*}%
+ \DeclareFont{timesbold}{*}{ptmb at 8\p@}{*}{*}%
+ % espacements
+ \smallskipamount=2\p@ plus 1\p@ minus 1\p@
+ \medskipamount=4\p@ plus 2\p@ minus 1\p@
+ \bigskipamount=9\p@ plus 3\p@ minus 3\p@
+ \abovedisplayskip=5\p@ plus 2.5\p@ minus 1\p@
+ \belowdisplayskip=5\p@ plus 2.5\p@ minus 1\p@
+ \abovedisplayshortskip=0\p@ plus 2.5\p@
+ \belowdisplayshortskip=3\p@ plus 2.5\p@
+ \normalbaselineskip=9\p@
+ \setbox\strutbox=\hbox{\vrule
+ height7\p@ depth2\p@ width0\p@}%
+ \normalbaselines\rm}%
+%
+\def\ninepoint{%
+ \DeclareFont{roman}{0}{cmr9}{cmr6}{cmr5}%
+ \DeclareFont{italic}{*}{cmti9}{*}{*}%
+ \DeclareFont{smallcaps}{*}{cmcsc9}{*}{*}%
+ \DeclareFont{boldface}{4}{cmbx9}{cmbx6}{cmbx5}%
+ \DeclareFont{monospace}{*}{cmtt9}{*}{*}%
+ \DeclareFont{mit}{1}{cmmi9}{cmmi6}{cmmi5}%
+ \DeclareFont{cal}{2}{cmsy9}{cmsy6}{cmsy5}%
+ \DeclareFont{mathex}{3}{cmex9}{cmex9}{cmex9}%
+ \ifx\mbbfam\undefined\else
+ \DeclareFont{mbb}{\mbbfam}{mbb9}{mbb6}{mbb5}\fi
+ \ifx\mathafam\undefined\else
+ \DeclareFont{matham}{\mathafam}{matham9}{matham6}{matham5}\fi
+ \ifx\mathbfam\undefined\else
+ \DeclareFont{mathb}{\mathbfam}{mathbm9}{mathbm6}{mathbm5}\fi
+% \ifx\mathxfam\undefined\else
+% \DeclareFont{mathx}{\mathxfam}{mathx9}{mathx9}{mathx9}\fi
+ \DeclareFont{timesroman}{*}{ptmr at 9\p@}{*}{*}%
+ \DeclareFont{timesitalic}{*}{ptmri at 9\p@}{*}{*}%
+ \DeclareFont{timesbold}{*}{ptmb at 9\p@}{*}{*}%
+ % espacements
+ \smallskipamount=2.5\p@ plus 1\p@ minus 1\p@
+ \medskipamount=5\p@ plus 2\p@ minus 1.5\p@
+ \bigskipamount=10.5\p@ plus 3.5\p@ minus 3.5\p@
+ \abovedisplayskip=5.5\p@ plus 2.75\p@ minus 1\p@
+ \belowdisplayskip=5.5\p@ plus 2.75\p@ minus 1\p@
+ \abovedisplayshortskip=0\p@ plus 2.75\p@
+ \belowdisplayshortskip=3.5\p@ plus 2.75\p@
+ \normalbaselineskip=11\p@
+ \setbox\strutbox=\hbox{\vrule
+ height8\p@ depth3\p@ width0\p@}%
+ \normalbaselines\rm}%
+%
+\def\tenpoint{%
+ \DeclareFont{roman}{0}{cmr10}{cmr7}{cmr5}%
+ \DeclareFont{italic}{*}{cmti10}{*}{*}%
+ \DeclareFont{smallcaps}{*}{cmcsc10}{*}{*}%
+ \DeclareFont{boldface}{4}{cmbx10}{cmbx7}{cmbx5}%
+ \DeclareFont{monospace}{*}{cmtt10}{*}{*}%
+ \DeclareFont{mit}{1}{cmmi10}{cmmi7}{cmmi5}%
+ \DeclareFont{cal}{2}{cmsy10}{cmsy7}{cmsy5}%
+ \DeclareFont{mathex}{3}{cmex10}{cmex10}{cmex10}%
+ \ifx\mbbfam\undefined\else
+ \DeclareFont{mbb}{\mbbfam}{mbb10}{mbb7}{mbb5}\fi
+ \ifx\mathafam\undefined\else
+ \DeclareFont{mathma}{\mathafam}{matham10}{matham7}{matham5}\fi
+ \ifx\mathbfam\undefined\else
+ \DeclareFont{mathb}{\mathbfam}{mathbm10}{mathbm7}{mathbm5}\fi
+% \ifx\mathxfam\undefined\else
+% \DeclareFont{mathx}{\mathxfam}{mathx10}{mathx10}{mathx10}\fi
+ \DeclareFont{timesroman}{*}{ptmr at 10\p@}{*}{*}%
+ \DeclareFont{timesitalic}{*}{ptmri at 10\p@}{*}{*}%
+ \DeclareFont{timesbold}{*}{ptmb at 10\p@}{*}{*}%
+ % espacements
+ \smallskipamount=3\p@ plus 1\p@ minus 1\p@
+ \medskipamount=6\p@ plus 2\p@ minus 2\p@
+ \bigskipamount=12\p@ plus 4\p@ minus 4\p@
+ \abovedisplayskip=6\p@ plus 3\p@ minus 1\p@
+ \belowdisplayskip=6\p@ plus 3\p@ minus 1\p@
+ \abovedisplayshortskip=0\p@ plus 3\p@
+ \belowdisplayshortskip=4\p@ plus 3\p@
+ \normalbaselineskip=12\p@
+ \setbox\strutbox=\hbox{\vrule
+ height8.5\p@ depth3.5\p@ width0\p@}%
+ \normalbaselines\rm}%
+%
+\def\twelvepoint{%
+ \DeclareFont{roman}{0}{cmr12}{cmr8}{cmr6}%
+ \DeclareFont{italic}{*}{cmti12}{*}{*}%
+ \DeclareFont{smallcaps}{*}{cmcsc10 at 12\p@}{*}{*}%
+ \DeclareFont{boldface}{4}{cmbx10 at 12\p@}{cmbx8}{cmbx6}%
+ \DeclareFont{monospace}{*}{cmtt12}{*}{*}%
+ \DeclareFont{mit}{1}{cmmi10 at 12\p@}{cmmi8}{cmmi6}%
+ \DeclareFont{cal}{2}{cmsy10 at 12\p@}{cmsy8}{cmsy6}%
+ \DeclareFont{mathex}{3}%
+ {cmex10 at 12\p@}{cmex10 at 12\p@}{cmex10 at 12\p@}%
+ \ifx\mbbfam\undefined\else
+ \DeclareFont{mbb}{\mbbfam}{mbb12}{mbb8}{mbb6}\fi
+ \ifx\mathafam\undefined\else
+ \DeclareFont{matha}{\mathafam}{matham10 at 12\p@}{matham8}{matham6}\fi
+ \ifx\mathafam\undefined\else
+ \DeclareFont{mathb}{\mathbfam}{mathbm10 at 12\p@}{mathbm8}{mathbm6}\fi
+% \ifx\mathxfam\undefined\else
+% \DeclareFont{mathx}{\mathxfam}%
+% {mathx10 at 12\p@}{mathx10 at 12\p@}{mathx10 at 12\p@}\fi
+ \DeclareFont{timesroman}{*}{ptmr at 12\p@}{*}{*}%
+ \DeclareFont{timesitalic}{*}{ptmri at 12\p@}{*}{*}%
+ \DeclareFont{timesbold}{*}{ptmb at 12\p@}{*}{*}%
+ % espacements
+ \smallskipamount=3\p@ plus 1\p@ minus 1\p@
+ \medskipamount=6\p@ plus 2\p@ minus 2\p@
+ \bigskipamount=12\p@ plus 4\p@ minus 4\p@
+ \abovedisplayskip=6\p@ plus 3\p@ minus 1\p@
+ \belowdisplayskip=6\p@ plus 3\p@ minus 1\p@
+ \abovedisplayshortskip=0\p@ plus 3\p@
+ \belowdisplayshortskip=4\p@ plus 3\p@
+ \normalbaselineskip=14.4\p@
+ \setbox\strutbox=\hbox{\vrule
+ height9.7\p@ depth4.2\p@ width0\p@}%
+ \normalbaselines\rm}%
+%
+\def\rm{\let\current@face=\roman\roman}%
+\def\it{\let\current@face=\italic\italic}%
+\def\sc{\let\current@face=\smallcaps\smallcaps}%
+\def\bf{\let\current@face=\boldface\boldface}%
+\def\tt{\let\current@face=\monospace\monospace}%
+%
+\def\small{\ninepoint}\let\footnotesize=\small
+\def\tiny{\eightpoint}%
+\def\large{\twelvepoint}%
+\def\normalsize{\tenpoint}%
+%
+\def\ExtraTextFont{\ifx\current@face\roman
+ \timesroman\else\ifx\current@face\italic
+ \timesitalic\else\ifx\current@face\boldface
+ \timesbold\else\timesroman\fi\fi\fi}%
+%
+\def\guillemotleft{{\ExtraTextFont\char"AB}}%
+\def\guillemotright{{\ExtraTextFont\char"BB}}%
+%
+%\def\guillemotleft{\leavevmode\raise.225ex\hbox{%
+% $\scriptscriptstyle\langle\!\langle$}}%
+%\def\guillemotright{\leavevmode\raise.225ex\hbox{%
+% $\scriptscriptstyle\rangle\!\rangle$}}%
+%
+\def\em{\ifx\current@face\roman\it\else\rm\fi}%
+%
+\newcount\c@quot
+%
+\def\og@french{\ifnum\c@quot>0``\else\guillemotleft~\ignorespaces\fi
+ \ignorespaces\global\advance\c@quot by 1}%
+%
+\def\fg@french{\global\advance\c@quot by -1\unskip
+ \ifnum\c@quot>0''\else~\guillemotright\fi}%
+%
+\def\og@english{\ifnum\c@quot>0 `\else``\fi
+ \ignorespaces\global\advance\c@quot by 1}%
+\def\fg@english{\global\advance\c@quot by -1\unskip
+ \ifnum\c@quot>0 '\else''\fi}%
+%
+\def\textsuperscript#1{\/\raise.82ex%
+ \hbox{$\current@face\scriptscriptstyle#1$}}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MAIN FORMATING COMMANDS (typotex.tex)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\let\stop=\end
+\def\begin#1{\csname #1\endcsname}%
+\def\end#1{\csname end#1\endcsname}%
+%
+% num\'eration
+%
+\def\alphanumeral#1{\ifcase#1 ?\or a\or b\or c\or d%
+ \or e\or f\or g\or h\or i\or j\or k\or l\or m\or n%
+ \or o\or p\or q\or r\or s\or t\or u\or v\or w\or x%
+ \or y\or z\else xx\fi}%
+\def\Alphanumeral#1{\ifcase#1 ?\or A\or B\or C\or D%
+ \or E\or F\or G\or H\or I\or J\or K\or L\or M\or N%
+ \or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X%
+ \or Y\or Z\else XX\fi}%
+%
+% punctuation
+%
+\def\,{\ifmmode\mskip\thinmuskip\else\thinspace\fi}%
+\def\dots{\ifmmode\ldots\else
+ .\kern\fontdimen3\font
+ .\kern\fontdimen3\font
+ .\fi}%
+\def\Bigbreak{\par\ifdim\lastskip<1.5\bigskipamount
+ \removelastskip\penalty-300\vskip1.5\bigskipamount\fi}%
+%
+% equations
+%
+\newcount\c@equation
+\def\everyequationnumber{}%
+\def\eqnum{\global\advance\c@equation by 1
+ \edef\lastref{\everyequationnumber\number\c@equation}%
+ \eqno{(\lastref)}}%
+%
+% sectionnement
+%
+\newcount\c@chapter
+\newcount\c@section
+\newcount\c@subsection
+\newcount\c@subsubsection
+\let\sectionnumber=\number
+\def\lastref{}%
+\def\titlemark{{}{}}%
+%
+\newif\iftitle\titletrue
+\DefineOption{openright}{\def\titlepage{\ifvoid0\else\par\vfill\eject\fi
+ \global\titletrue\gdef\titlemark{{}{}}\ifodd\pageno\else
+ \null\par\vfill\eject\global\titletrue\fi}}%
+\DefineOption{openleft}{\def\titlepage{\ifvoid0\else\par\vfill\eject\fi
+ \global\titletrue\gdef\titlemark{{}{}}\ifodd\pageno
+ \null\par\vfill\eject\global\titletrue\fi}}%
+\DefineOption{openany}{\def\titlepage{\ifvoid0\else\par\vfill\eject\fi
+ \global\titletrue\gdef\titlemark{{}{}}}}%
+% \message{La page \the\pageno\space a ete sautee !}%
+% \advance\pageno by 1\fi}%
+%
+\newif\ifnormalchapter
+\normalchaptertrue
+%
+\let\@author=\undefined
+\def\author#1{\def\@author{#1}}%
+\let\@title=\relax
+\def\title#1{\def\@title{#1}\def\@titlerunning{#1}}%
+\def\institute#1{}%
+\def\titlerunning#1{\def\@titlerunning{#1}}%
+\let\chapterrunning=\titlerunning
+\def\sectionrunning#1{\ifx*#1\let\@next=\@sectionrunning
+ \else\let\@next=\relax\mark{{#1}{\S\ \sectionnumber\c@section}}\fi
+ \@next}%
+\def\@sectionrunning#1{\mark{{#1}{}}}%
+%
+\def\maketitle{\titlepage
+ \normalchapterfalse
+ \let\sectionnumber=\number
+ \let\lastref=\@titlerunning
+ \let\currentchapter=\lastref
+ \edef\titlemark{{\@titlerunning}{}}%
+ \mark{{\@titlerunning}{}}%
+ \def\@tmp{\sectionmark\title}%
+ \expandafter\expandafter\expandafter\@tmp\expandafter{\@title}{}%
+ \@@chapter\@title}%
+\def\chapter#1{\titlepage
+ \ifx*#1
+ \let\@next=\@chapter
+ \normalchapterfalse
+ \let\sectionnumber=\Alphanumeral
+ \else
+ \def\@next{\@chapter{#1}}%
+ \normalchaptertrue
+ \global\advance\c@chapter by 1
+ \let\sectionnumber=\number
+ \fi\@next}%
+%
+\def\@chapter#1{%
+ \def\@titlerunning{#1}%
+ \ifnormalchapter
+ \edef\lastref{\uppercase
+ \expandafter{\romannumeral\c@chapter}}%
+ \edef\currentchapter{\chapvarname~\lastref}%
+ \edef\titlemark{{\@titlerunning}{\currentchapter}}%
+ \mark{{\@titlerunning}{\currentchapter}}%
+ \sectionmark\chapter{#1}{\the\c@chapter}%
+ \else
+ \edef\lastref{#1}%
+ \let\currentchapter=\lastref
+ \edef\titlemark{{\@titlerunning}{}}%
+ \mark{{\@titlerunning}{}}%
+ \sectionmark\chapter{#1}{}%
+ \fi\@@chapter{#1}}%
+\def\@@chapter#1{\titlepagetop
+ \cl@chapter
+ \center
+ {\twelvepoint
+ \ifnormalchapter
+ {\sc\chaptername\unskip~\chapternumeral\c@chapter}%
+ \vskip\bigskipamount\par
+ \fi
+ {\parskip=\smallskipamount
+ \uppercase\expandafter{#1}}\par}%
+ \ifx\@author\undefined
+ \else\rm\authorsep\@author
+ \global\let\@author=\undefined
+ \fi
+ \endcenter\vskip2\bigskipamount}%
+\def\newsection#1#2{\expandafter\def\csname#1\endcsname
+ {\@section{#1}#2}}%
+\def\@section#1#2#3#4#5#6#7#8{#4\csname cl@#1\endcsname
+ \ifx*#8%
+ \def\@next{\@@sectionstar{#1}{#2}{#3}{#5}{#6}{#7}}%
+ \else\def\@next{\@@section{#1}{#2}{#3}{#5}{#6}{#7}{#8}}\fi
+ \@next}%
+\def\@@section#1#2#3#4#5#6#7{%
+ \global\advance\csname c@#2\endcsname by 1
+ \edef\lastref{#3}\def\sectiontext{#7}%
+ \expandafter\sectionmark\csname#1\endcsname{#7}\lastref
+ {#4}#6}%
+\def\@@sectionstar#1#2#3#4#5#6#7{%
+ \def\sectiontext{#7}\def\\{\par\noindent\ignorespaces}%
+ \expandafter\sectionmark\csname#1\endcsname{#7}{}%
+ {#5}\let\\=\endgraf#6}%
+%
+\addtoreset{chapter}{section}%
+\addtoreset{chapter}{equation}%
+\addtoreset{section}{subsection}%
+\addtoreset{subsection}{subsubsection}%
+%
+\DefineOption{defaultsectioning}{%
+ \newsection{section}{{section}%
+ {\sectionnumber\c@section}%
+ {\Bigbreak\breakupto\baselineskip
+ \noindent}%
+ {\rm\lastref.\enspace\bf\sectiontext}%
+ {\bf\sectiontext}%
+ {\nobreak\bigskip}}%
+ \newsection{subsection}{{subsection}%
+ {\sectionnumber\c@section.\number\c@subsection}%
+ {\bigbreak\noindent}%
+ {\rm\lastref.\enspace\sc\sectiontext}%
+ {\sc\sectiontext}%
+ {\nobreak\medskip}}%
+ \newsection{subsubsection}{{subsubsection}%
+ {\number\c@subsubsection\petito}%
+ {\medbreak}%
+ {\noindent\rm\lastref\enspace\it\sectiontext\unskip.}%
+ {\it\sectiontext\unskip.}%
+ {\claimsep}}}%
+\DefineOption{AMSsectioning}{%
+ \newsection{section}{{section}%
+ {\sectionnumber\c@section}%
+ {\Bigbreak\breakupto\baselineskip}%
+ {\center\rm\S\ \lastref.\enspace\sc\sectiontext\endcenter}%
+ {\center\sc\sectiontext\endcenter}%
+ {\nobreak\bigskip}}%
+ \newsection{subsection}{{subsection}%
+ {\sectionnumber\c@section.\number\c@subsection}%
+ {\medbreak}%
+ {\rm\lastref.\enspace\it\sectiontext\unskip.}%
+ {\it\sectiontext\unskip.}%
+ {\claimsep}}%
+ \newsection{subsubsection}{{subsubsection}%
+ {\number\c@subsubsection\petito}%
+ {\medbreak}%
+ {\rm\lastref\enspace\it\sectiontext\unskip.}%
+ {\it\sectiontext\unskip.}%
+ {\claimsep}}}%
+\def\paragraph#1{\claimbreak{\it#1\unskip.}\claimsep}%
+\let\endparagraph=\medbreak
+\def\center{\par\bgroup\centering}%
+\def\endcenter{\par\egroup}%
+\def\centering{\leftskip=0\p@ plus 1fil
+ \rightskip=0\p@ plus 1fil
+ \parfillskip=0\p@
+ \parindent=0\p@}
+%
+% lists
+%
+\newcount\c@item
+\let\if@insidelist\iffalse
+\newdimen\itemindent
+\long\def\startlist#1#2{\c@item=0
+ \expandafter\ifx\csname #1@item\endcsname\relax
+ \roman@item\else\csname #1@item\endcsname\fi
+ \ifx[#2\let\@next=\list@item@fix
+ \else\def\@next{#2}\let\item@box=\relax\fi\@next}%
+%
+\let\item@box=\relax
+\def\list@item@fix#1]{\setbox0=\hbox{#1}\edef\item@box##1{\noexpand\hbox
+ to \the\wd0{\noexpand\hss##1}}}%
+%
+%\long\def\item@all@#1#2{\ifvmode\smallbreak\fi
+% \ifx#2[\let\@next\item@all@@
+% \else\def\@next{\advance\c@item by 1
+% \item@box{#1}\enspace\ignorespaces#2}\fi
+% \@next}%
+%\long\def\item@all@@#1]{\item@box{#1}\enspace\ignorespaces}%
+\long\def\item@all@#1{\ifvmode\smallbreak\fi
+ \advance\c@item by 1
+ \item@box{#1}\enspace\ignorespaces}%
+%
+\def\roman@item{\let\item=\item@roman}%
+\def\item@roman{\item@all@{\rm(\romannumeral\c@item)}}%
+%
+\def\alpha@item{\let\item=\item@alpha}%
+\def\item@alpha{\item@all@{\it\alphanumeral\c@item\/\rm)}}%
+%
+\def\arabic@item{\let\item=\item@arabic}%
+\def\item@arabic{\item@all@{\rm\number\c@item.}}%
+%
+\def\bullet@item{\advance\leftskip by\itemindent
+ \def\item{\ifvmode\smallbreak\fi
+ \noindent\llap{$\bullet$\enspace}\ignorespaces}}%
+%
+\def\definitions@item{\advance\leftskip by\itemindent
+ \def\item##1{\ifvmode\smallbreak\fi
+ \noindent\leavevmode\hskip-\itemindent
+ \item@box{##1}\enspace\ignorespaces}}%
+\def\list#1{\bgroup\if@insidelist\par
+ \advance\leftskip by\itemindent\fi
+ \let\if@insidelist\iftrue
+ \startlist{#1}}%
+\def\endlist{\smallbreak\egroup}%
+%
+% verbatim
+%
+\newdimen\tabindent\tabindent=4em
+\let\verbatimsep\quad
+{\obeyspaces\gdef {\leavevmode\space}%
+\catcode`\^^I=\active\gdef^^I{\hskip\tabindent\relax}}%
+\def\rawverbatim{%
+ \def\@numberedverbatimpar{\def\par{\ifvmode
+ \endgraf\vskip\baselineskip\advance\count@ by 1
+ \else\endgraf\fi}%
+ \everypar={\advance\count@ by 1\leavevmode
+ \llap{\the\count@\verbatimsep}}}%
+ \def\@verbatimpar{\def\par{\ifvmode
+ \endgraf\vskip\baselineskip\else\endgraf\fi}%
+ \everypar={}}}%
+\def\smartverbatim{%
+ \def\@numberedverbatimpar{%
+ \def\par{\ifvmode\endgraf
+ \ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip
+ \@verbatimskiptrue\fi\else\endgraf\fi}%
+ \everypar={\advance\count@ by 1\leavevmode
+ \@ifverbatimskip
+ \llap{\the\count@\verbatimsep}%
+ \@verbatimskipfalse\fi}}%
+ \def\@verbatimpar{%
+ \def\par{\ifvmode\endgraf
+ \ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi
+ \else\endgraf\fi}%
+ \everypar={}}}%
+%
+\def\@verbatimskiptrue{\let\@ifverbatimskip\iftrue}%
+\def\@verbatimskipfalse{\let\@ifverbatimskip\iffalse}%
+\smartverbatim
+\def\verb{\bgroup\tt\uncatcodespecials\obeyspaces\@verb}%
+\def\verbatim{\medbreak\bgroup
+ \rightskip=0\p@ minus 1000\p@
+ \tt\uncatcodespecials\obeyspaces
+ \catcode`\^^I=\active\@verbatim}%
+\def\@verbatim#1{\ifx[#1%
+ \@verbatimskiptrue
+ \@numberedverbatimpar\obeylines\let\@next=\@@verbatim
+ \else\@verbatimpar\obeylines\parindent=0\p@
+ \def\@next{\@@@verbatim#1}\fi\@next}%
+\def\@@verbatim#1]{\setbox0=\hbox{#1\verbatimsep}\parindent=\wd0
+ \count@=0\@@@verbatim}%
+\def\verbatimfile#1{\ifx[#1\let\@next\@verbatimfile
+ \else\def\@next{\@@verbatimfile{\input #1}}\fi\@next}%
+\def\@verbatimfile#1]#2{\@@verbatimfile{[#1]\input #2}}%
+{\catcode`\|=0\catcode`\\=12
+|gdef|@verb#1\endverb{#1|egroup}%
+|gdef|@@@verbatim#1\endverbatim{#1|egroup|medbreak}%
+|gdef|@@verbatimfile#1{|verbatim #1|relax\endverbatim}}%
+\def\uncatcodespecials{\def\do##1{\catcode`##1=12 }\dospecials}%
+%
+% Theorems and such
+%
+% o \theorem<text> : Theorem 1. --- <text>
+% o \theorem*[<text>] : Theorem <text>. ---
+% o \theorem*<text> : Theorem. --- <text>
+% o \theorem[<text>] : Theorem 1 <text>. ---
+%
+\def\everyclaimnumber{}% one can put some chapter number
+%\def\ensurenumbering{\global\let\@numbering=!}%
+\long\def\@claim#1#2#3#4#5{\claimbreak
+ \bgroup\startlist{roman}\sc#1%
+ \ifx*#4%
+ \def\lastref{}%
+ \ifx[#5%
+ \def\@next##1]{\unskip\ ##1\unskip\rm.#3\claimsep}%
+ \else
+ \def\@next{\rm.#3\claimsep#5}%
+ \fi
+ \else\ifx[#4%
+ \def\@next##1]{\unskip\ #5##1\unskip\rm.#3\claimsep}%
+ \global\advance#2 by 1
+ \edef\lastref{\everyclaimnumber\number#2}%
+ \ \lastref
+ \else\global\advance#2 by 1
+ \edef\lastref{\everyclaimnumber\number#2}%
+ \ \lastref\unskip\rm.#3\claimsep\relax
+ \def\@next{#4#5}\fi\fi\@next}%
+\def\end@claim{\par\egroup
+ \ifdim\lastskip<\medskipamount
+ \removelastskip\penalty55\medskip\fi}%
+%
+\newcount\c@theorem \newcount\c@proposition \newcount\c@lemma
+\newcount\c@definition \newcount\c@corollary \newcount\c@figure
+%
+\def\claim#1{\@claim{#1}*\it*}%
+\let\endclaim=\end@claim
+%
+\def\newtheorem#1#2{\expandafter\let\csname end#1\endcsname=\end@claim
+ \expandafter\def\csname#1\endcsname{\@claim#2}}%
+%
+\newtheorem{theorem}{\theoremname\c@theorem\it}%
+\newtheorem{proposition}{\propositionname\c@proposition\it}%
+\newtheorem{definition}{\definitionname\c@definition\relax}%
+\newtheorem{corollary}{\corollaryname\c@corollary\it}%
+\newtheorem{lemma}{\lemmaname\c@lemma\it}%
+\newtheorem{remark}{{\it\remarkname}*{\let\item=\item@alpha}*}%
+\newtheorem{remarks}{{\it\remarksname}*{\let\item=\item@alpha}*}%
+\newtheorem{example}{{\it\examplename}*{\let\item=\item@alpha}*}%
+\newtheorem{examples}{{\it\examplesname}*{\let\item=\item@alpha}*}%
+\newtheorem{exercice}{{\it\exercicename}*{}*}%
+%
+\long\def\proof#1{\claimbreak
+ \ifx[#1%
+ \def\@next##1]{{\it\proofname\ ##1\unskip.}\claimsep}%
+ \else\def\@next{{\it\proofname.}\claimsep#1}\fi\@next}%
+\def\endproof{\medbreak}%
+%\null\hfill$\Box$\medbreak}%
+\def\qed{\relax\ifmmode\Box\else
+ {\unskip\nobreak\hfil\penalty50\hskip1em\null\nobreak\hfil$\Box$%
+ \parfillskip=\z@\finalhyphendemerits=0\endgraf}\fi}%
+%
+\long\def\skiptext#1\endskiptext{\ifx\proofmode\undefined
+ \else
+ \par
+ {\ninepoint\leavevmode\llap{$^*$}\ignorespaces#1\unskip$_*$}%
+ \par
+ \fi}%
+%
+\def\figure{\global\advance\c@figure by 1
+ \edef\lastref{\number\c@figure}%
+ {\sc\figurename\unskip\ \lastref.}}%
+%
+\def\foreword{\skip@=\lastskip\hbox to \hsize\bgroup\hfill
+ $\ifx\lfilet\undefined
+ \vcenter\bgroup\advance\hsize by -2\parindent
+ \else
+ \setbox0=\hbox{$\left\lfilet\right.$}\dimen@=\parindent
+ \advance\dimen@ by -\wd0
+ \left\lfilet\hskip\dimen@
+ \vcenter\bgroup
+ \advance\hsize by -4\parindent\fi
+ \ninepoint}%
+\def\endforeword{\egroup\ifx\lfilet\undefined\else
+ \hskip\dimen@\right\rfilet\fi$\hfill\egroup\par\vskip\skip@}%
+\let\abstract=\foreword
+\let\endabstract=\endforeword
+%
+\newcount\c@footnote
+%
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@}% the \hrule is .4pt high
+%
+\def\footnote{%
+ \edef\@sf{\spacefactor\the\spacefactor}%
+ \global\advance\c@footnote by 1
+ $^{\the\c@footnote}$\@sf
+ \insert\footins\bgroup\ninepoint
+ \interlinepenalty100 \let\par=\endgraf
+ \leftskip=\z@skip \rightskip=\z@skip
+ \splittopskip=10\p@ plus 1\p@ minus 1\p@
+ \floatingpenalty=20000
+ \smallskip$\the\c@footnote.$\enspace
+ \bgroup\strut\aftergroup\@foot\let\@next}%
+\skip\footins=12\p@ plus 2\p@ minus 4\p@ % space added when footnote is present
+%\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=30pc % maximum footnotes per page
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% BIBLIOGRAPHY SECTION
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \bibliographym@rk and \bibname must be defined somewhere
+% (see much below).
+% \refsp@ce is the spacing command that appens between multiple
+% references.
+%
+\let\refsp@ce=\
+\def\citeopen{[}%
+\def\citeclose{]}%
+%
+%\let\refsp@ce=\thinspace
+%\def\citeopen{$^\bgroup}%
+%\def\citeclose{\egroup}}%
+%
+% new variables
+%
+\newcount\c@bibitem
+\newif\ifref@changes\ref@changesfalse
+\newif\ifpageref@changes\ref@changesfalse
+\newif\ifbib@changes\bib@changesfalse
+\newif\ifref@undefined\ref@undefinedfalse
+\newif\ifpageref@undefined\ref@undefinedfalse
+\newif\ifbib@undefined\bib@undefinedfalse
+%
+% One can reference anything, just copy the former macro
+% and use it so: \machin \label{truc}%
+% In machin you would have defined \lastref by some number
+% or any text.
+%
+% References macros
+%
+% The next macros are the core of \ref and \cite commands.
+% Its first argument may be ref, pageref or bib.
+%
+% It is too tricky to be explained.
+% (It is a bit recursive.)
+% It allows using \cite or \ref or ...
+% with arbitrary many arguments,
+% for instance:
+% \cite{knuth1,knuth2,ma pomme}%
+%
+% First argument is always ref, pageref or bib.
+%
+% Note that \meaning\@next is there to allow active things
+% or control sequences within the referencing tag.
+%
+\def\re@dreferences#1#2{{%
+ \re@dreferenceslist{#1}#2,\undefined\@@}}%
+\def\re@dreferenceslist#1#2,#3\@@{\def\@next{#2}%
+ \expandafter\ifx\csname#1@@\meaning\@next\endcsname\relax
+ ??\immediate\write16
+ {Warning, #1-reference "\@next" on page \folio\space
+ is undefined.}%
+ \global\csname#1@undefinedtrue\endcsname
+ \else\HyperLinkRef{#1@@#2}\csname#1@@\meaning\@next\endcsname
+ \endHyperLink\fi
+ \ifx#3\undefined\relax
+ \else,\refsp@ce\re@dreferenceslist{#1}#3\@@\fi}%
+%
+% notice that the former ``,\refsp@ce'' will separate
+% multiple arguments. But beware of spaces
+% while defining a reference or calling for it!
+%
+% tricky thing: \newlabel has two arguments
+% {labelname}{{\lastref}{\pageref}}%
+% The second argument is read as two arguments
+% by \newl@bel. This was necessary to get
+% a jobname.aux containing the same syntax
+% LaTeX would produce and use.
+%
+\def\newlabel#1#2{{\def\@next{#1}\newl@bel#2}}%
+\def\newl@bel#1#2{%
+ \expandafter\xdef\csname ref@@\meaning\@next\endcsname{#1}%
+ \expandafter\xdef\csname pageref@@\meaning\@next\endcsname{#2}}%
+% \immediate can cause nasty things with \pageref...
+\def\label#1{{\init@aux
+ \toks0={#1}\message{ref(\lastref) \the\toks0,}%
+ \immediate\write\aux@out%
+ {\noexpand\newlabel{\the\toks0}{{\lastref}{\folio}}}%
+ \HyperLinkName{ref@@#1}\endHyperLink\def\@next{#1}%
+ \expandafter\ifx\csname ref@@\meaning\@next\endcsname\lastref
+ \else\message{former label is to be checked,}%
+ \global\ref@changestrue\fi%
+ \newlabel{#1}{{\lastref}{\folio}}}}%
+\def\ref#1{\re@dreferences{ref}{#1}}%
+\def\pageref#1{\re@dreferences{pageref}{#1}}%
+%
+% bibliography macros
+%
+\def\bibcite#1#2{{\def\@next{#1}%
+ \expandafter\xdef\csname bib@@\meaning\@next\endcsname{#2}}}%
+\def\cite#1{\citeopen\re@dreferences{bib}{#1}\citeclose}%
+%
+% The argument of \thebibliography
+% is any sequence of numerals which will represent
+% the maximum \item's length. If you have less than 9
+% \bibitem's, this argument may be {any numeral}.
+% if you have between 100 and 999 \bibitem's
+% this argument may be {any three numerals},
+% and so on.
+%
+\def\thebibliography#1{\bibliographym@rk
+ \setbox0\hbox{\citeopen#1\citeclose\enspace}%
+ \parindent=\wd0
+ \global\c@bibitem=0
+ \def\bibitem##1{\init@aux
+ \global\advance\c@bibitem by 1
+ \edef\lastref{\number\c@bibitem}%
+ {\toks0={##1}%
+ \message{bib[\lastref] \the\toks0,}%
+ \immediate\write\aux@out
+ {\noexpand\bibcite{\the\toks0}{\lastref}}}%
+ \def\@next{##1}%
+ \expandafter\ifx
+ \csname bib@@\meaning\@next\endcsname\lastref
+ \else\global\bib@changestrue\fi%
+ \bibcite{##1}{\lastref}%
+ \medbreak
+ \item{\hfill\citeopen
+ \HyperLinkName{bib@@##1}\lastref
+ \endHyperLink\citeclose}%
+ }%
+ \def\idem{\vrule width 4em height 0.222\p@ depth 0pt\,}%
+ }%
+\def\endthebibliography{\par\egroup\par}%
+%
+\def\extra@end{}%
+%
+% initialization of jobname.aux
+%
+\newwrite\aux@out
+\def\init@aux{%
+ \immediate\openin\aux@out=\jobname.aux
+ \ifeof\aux@out
+ \immediate\write16{Creating file \jobname.aux}%
+ \immediate\closein\aux@out
+ \immediate\openout\aux@out=\jobname.aux
+ \immediate\write\aux@out{\relax}%
+ \immediate\closeout\aux@out
+ \else
+ \immediate\closein\aux@out
+ \fi
+ \gdef\@toc{}%
+ \input\jobname.aux
+ \immediate\openout\aux@out=\jobname.aux
+ \global\let\init@aux=\relax
+ \global\let\sectionmark=\@sectionmark
+ \addto\extra@end{\closeout\aux@out
+ \ifref@changes\immediate\write16%
+ {Warning, changes in references.}\fi
+ \ifpageref@changes\immediate\write16%
+ {Warning, changes in page references.}\fi
+ \ifbib@changes\immediate\write16%
+ {Warning, changes in bibliography.}\fi
+ \ifref@undefined\immediate\write16%
+ {Warning, references undefined.}\fi
+ \ifpageref@undefined\immediate\write16%
+ {Warning, page references undefined.}\fi
+ \ifbib@undefined\immediate\write16%
+ {Warning, citations undefined.}\fi}}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LAYOUT COMMANDS
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Table des matieres
+%
+\def\content#1#2#3#4{\addto\@toc{#1{#2}{#3}{#4}}}%
+%
+\def\ignorecontentstitles{\def\contents@title##1##2##3{}}%
+\def\usecontentstitles{\def\contents@title##1##2##3{\chapter{##1}{##2}{##3}}}%
+\ignorecontentstitles
+\def\tableofcontents{%
+ \init@aux
+ \tableofcontentsm@rk
+ \def\\{\par\noindent\ignorespaces}%
+ \def\smartdot##1{{\def\@arg{##1}%
+ \ifx\@arg\empty\relax\else##1\unskip.\enspace\fi}}%
+ \def\leaderfill{\leaders\hbox to 1em{\hss.\hss}\hfill}%
+% \let\normalchapterfalse=\relax\let\normalchaptertrue=\relax
+ \let\title=\contents@title
+ \def\chapter##1##2##3{\bigbreak\noindent%\let\endgraf=\relax
+ {\parindent=0\p@
+ \bf\ifx##2\relax\else
+ \chaptername\unskip\
+ \smartdot{\chapternumeral{##2}}\fi##1}%
+ \leaderfill##3\nobreak\medskip}%
+ \def\section##1##2##3{\medbreak\noindent
+ {\rm\smartdot{##2}\sc##1}\leaderfill
+ ##3\nobreak\smallskip}%
+ \def\subsection##1##2##3{\smallbreak
+ \hangindent\parindent
+ {\rm\smartdot{##2}\it##1}\leaderfill##3\par}%
+ \def\subsubsection##1##2##3{\par\indent\indent
+ \hangindent3\parindent
+ {\rm##2\enspace##1}\leaderfill##3\par}%
+ \@toc
+ \egroup\endtableofcontents}%
+%
+\def\\{\let\stoken= }\\
+\long\def\unexpandwrite#1#2{\def\writ@{\write#1}%
+ {\aftergroup\writ@\aftergroup{\s@nitize#2\ends@nity}}}%
+\def\s@nitize{\futurelet\@next\s@nswitch}%
+\def\s@nswitch{\ifx\@next\ends@nity
+ \else\ifcat\noexpand\@next\stoken\aftergroup\space\let\@next\e@t
+ \else\ifcat\noexpand\@next\bgroup\aftergroup{\let\@next\e@t
+ \else\ifcat\noexpand\@next\egroup\aftergroup}\let\@next\e@t
+ \else\let\@next\copyt@ken\fi\fi\fi\fi
+ \@next}%
+\def\e@t{\afterassignment\s@nitize\let\@next= }%
+\long\def\copyt@ken#1{\ifcat\noexpand#1\relax\aftergroup\noexpand
+ \else\ifcat\noexpand#1\noexpand~\aftergroup\noexpand\fi\fi
+ \aftergroup#1\s@nitize}%
+\def\ends@nity\ends@nity{}%
+\long\def\semiexpandwrite#1#2#3{%
+ \def\writ@{\write#1}\def\toexp@nd{#3}%
+ % beware, a \gdef may replace the last \def
+ {\aftergroup\writ@\aftergroup{\s@nitize#2\ends@nity
+ \aftergroup\toexp@nd}}}%
+%
+\long\def\unexpandmark#1#2{\def\writ@{\mark}%
+ {\aftergroup\writ@\aftergroup{\s@nitize{#2}{#1}\ends@nity}}}%
+\def\semiexpandmark#1#2{\edef\@next{\noexpand\unexpandmark{#2}}%
+ \@next{#1}}%
+%
+% The next macro must be used in sectionning commands
+% as: \sectionmark\section{name of the section}\lastref.
+% When \jobname.aux is initialized, it becomes \@sectionmark
+% and then writes in \jobname.aux informations for the table
+% of contents (and changes headings as it always should do).
+%
+\def\sectionmark#1#2#3{\ifnum\pageno>-1
+ \ifx#1\section\semiexpandmark{#2}{#3}\fi\fi}%
+%
+\def\@sectionmark#1#2#3{\ifnum\pageno>-1
+ \ifx#1\section\semiexpandmark{#2}{#3}\fi
+ \edef\@next{\noexpand\@@sectionmark{#3}}% section number is expanded
+ \@next{#1}{#2}\relax\fi}%
+%
+\def\@@sectionmark#1#2#3{%
+ \semiexpandwrite\aux@out{\content#2{#3}{#1}}{{\folio}}}%
+%
+% sections and al. will be marked if and only if
+% the current page number is strictly positive.
+%
+% headings
+%
+\def\righthead#1#2{\if#2\relax\relax\else\rlap{\headroman\S\ #2}\fi
+ \hfil{\ninepoint\it#1}\hfil\llap{\headroman\folio}}%
+\def\lefthead#1#2{\rlap{\headroman\folio}\hfil{\ninepoint\it#1}\hfil
+ \llap{\headroman#2}}%
+\def\mixedmarks{\def\@tmp##1##2##3##4{%
+ % A REVOIR
+ \ifx##2\relax\relax
+ \ifx##4\relax\relax
+ \def\firstbotmark{{##1/##3}{}}%
+ \else
+ \def\firstbotmark{{##1/##3}{##4}}%
+ \fi
+ \else
+ \ifx##4\relax\relax
+ \def\firstbotmark{{##1/##3}{##2}}%
+ \else\def\firstbotmark{{##1/##3}{##2\,--\,##4}}%
+ \fi
+ \fi}%
+ \expandafter\expandafter\expandafter
+ \@tmp\expandafter\firstmark\botmark}%
+%
+% changes in output
+%
+% \documentclass
+%
+\DefineOption{book}{%
+ \def\titlepagetop{\topglue 2\bigskipamount}%
+ \def\tableofcontentsm@rk{\chapter*{\contentsname}\bgroup}%
+ \let\endtableofcontents=\relax%\newpage
+ \def\bibliographym@rk{\chapter*{\bibname}\bgroup}%
+ \def\everyclaimnumber{}%
+ \def\everyequationnumber{\ifnormalchapter\number\c@chapter.\else
+ \sectionnumber\c@section.\fi}%
+ \headline={\iftitle\hfil\global\titlefalse
+ \ifodd\pageno\advance\pageno by 1\fi
+ \else
+ \ifodd\pageno
+ \edef\tmp@a{\firstmark}%
+ \edef\tmp@b{\botmark}%
+ \ifx\tmp@a\tmp@b
+ \expandafter\righthead\botmark
+ \else\mixedmarks
+ \expandafter\righthead\firstbotmark\fi
+ \else\expandafter\lefthead\titlemark
+ \fi
+ \fi}%
+ \footline={\hfil}}%
+%
+\DefineOption{article}{%
+ \def\titlepagetop{\topglue 2\bigskipamount}%
+ \def\tableofcontentsm@rk{\Bigbreak\centerline{\sc\contentsname}%
+% \sectionmark\section{\contentsname}{}%
+ \bigbreak\bgroup\ninepoint}%
+ \let\endtableofcontents=\Bigbreak
+ \def\bibliographym@rk{\Bigbreak\centerline{\sc\refname}%
+ \sectionmark\section{\refname}{}%
+ \bigbreak\bgroup\ninepoint}%
+ \def\everyclaimnumber{}%
+ \def\everyequationnumber{}%
+ \headline={\hfil}%
+ \footline={\hfil{\headroman\folio}\hfil}}%
+%
+\DefineOption{preprint}{\option@article
+ \headline={\iftitle\hfil\global\titlefalse
+ \else\ifnum\pageno>1\ifodd\pageno
+ \righthead{\today}{}\else
+ \expandafter\lefthead\titlemark\fi
+ \else\hfil\fi\fi}%
+ \footline={\hfil}}%
+%
+\DefineOption{enseignement}{\option@article
+ \mag=\magstep1
+ \hoffset=-0.54truecm\hsize=17truecm
+ \voffset=-0.54truecm\vsize=25.7truecm
+ \headline={\iftitle\hfil\global\titlefalse
+ \else\ifnum\pageno>1\ifodd\pageno
+ \righthead{\ifx\meta@degree\undefined\titlemark
+ \else\meta@degree\fi}{}\else
+ \expandafter\lefthead\titlemark\fi
+ \else\hfil\fi\fi}%
+ \def\titlepagetop{\noindent\leavevmode
+ \meta@head\vskip2\bigskipamount}%
+ \footline={\hfil}}%
+%
+\def\onepageout{\ifodd\pageno \advance\hoffset by \offsetcorrection
+ \else\advance\hoffset by -\offsetcorrection\fi
+ \shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}%
+%
+\output={\onepageout}%
+%
+\newdimen\offsetcorrection\offsetcorrection=\z@
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% typoindx.tex. Version : 28 octobre 2002.
+% Auteur : Anthony PHAN.
+%
+% (inspiré de manmac.tex, book.cls)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\def\index#1{\init@aux
+ \semiexpandwrite\aux@out{\indexentry{#1}}{{\folio}}}%
+\def\indexentry#1#2{}%
+%
+\def\theindex{\chapter*{\indexname}%
+ %\vskip-20pt
+ \nobreak\doublecolumns\raggedright
+ \parskip\z@ plus .3\p@
+ \parindent\z@
+ \def\bold##1{{\bf##1}}\def\see##1##2{{\it\seename}\/~##1}%
+ \def\item{\par\hangindent 40\p@}%
+ \def\subitem{\item \vrule width\z@\nobreak
+ \hskip 20\p@\hskip \z@skip}%
+ \def\subsubitem{\item \vrule width\z@\nobreak
+ \hskip 30\p@\hskip \z@skip}%
+ \def\indexspace{\par\vskip10\p@ plus5\p@ minus3\p@\relax}}%
+% \let\indexspace\medbreak}%
+\def\endtheindex{\enddoublecolumns\par\vfill\eject}%
+\def\printindex{\input\jobname.ind
+ \relax}%
+%
+\newbox\partialpage
+\newdimen\pagewidth
+\newdimen\pageheight
+\pagewidth=\hsize\pageheight=\vsize
+%
+\def\doublecolumns{\pagewidth=\hsize\pageheight=\vsize\begingroup
+% \tolerance 9999 \emergencystretch 3em%
+% \hfuzz .5\p@\vfuzz\hfuzz
+ \output={\global\setbox\partialpage=\vbox{\unvbox255}}\eject
+ \output={\doublecolumnout}%
+ \divide\hsize by 2\advance\hsize by -1em
+ \multiply\vsize by 2}
+%
+\def\enddoublecolumns{\output={\balancecolumns}\eject
+ \endgroup \pagegoal=\vsize}%
+%
+\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight\advance\dimen@ by-\ht\partialpage
+% \advance\dimen@ by -0.5ex
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ {\setbox255=\vbox{\pagesofar}% compatible avec plain ou presque
+ \hsize=\pagewidth\vsize=\pageheight\onepageout}%
+ \unvbox255\penalty\outputpenalty}%
+%
+\def\pagesofar{\unvbox\partialpage\vskip\z@ plus\z@ minus3\p@
+ \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}%
+%
+\def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2 \splittopskip=\topskip
+ {\vbadness=10000 \loop \global\setbox3=\copy0
+ \global\setbox1=\vsplit3 to\dimen@
+ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ \pagesofar}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% BOXES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\newdimen\fboxrule\fboxrule0.8pt
+\newdimen\fboxsep\fboxsep2pt
+\long\def\fbox#1{\hbox{\setbox0\hbox{#1}\dimen@\dp0\advance\dimen@\fboxsep
+ \advance\dimen@\fboxrule\lower\dimen@\hbox{\vrule width\fboxrule
+ \vbox{\hrule height\fboxrule\kern\fboxsep
+ \hbox{\kern\fboxsep\box0\kern\fboxsep}%
+ \kern\fboxsep\hrule height\fboxrule}\vrule width\fboxrule}}}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PERSONAL STUFF
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\hyphenation{pro-ba-bi-li-ste pro-ba-bi-li-stes
+ sto-chas-tique sto-chas-tiques pro-ces-sus
+ lip-schi-tzien lip-schi-tziens lip-schi-tzien-ne
+ lip-schi-tzien-nes
+ mar-tin-gale mar-tin-gales
+ brow-nien brow-niens brow-nien-ne brow-nien-nes
+ li-mi-te li-mi-tes
+ mar-ko-vien mar-ko-viens mar-ko-vienne mar-ko-viennes
+ ins-tant ins-tants
+ ca-no-nique ca-no-niques}%
+%
+% frenchy stuff
+%
+\def\petito{\textsuperscript o}%
+\def\numero{n\textsuperscript o~\ignorespaces}%
+%
+% extending math commands (LaTeX-like)
+%
+\ifx\mathbb\undefined
+ \def\mathbb#1{{\bf#1}}\fi
+\def\mathcal#1{{\cal#1}}%
+\def\mathbf#1{{\bf#1}}%
+\def\mathrm#1{{\rm#1}}%
+%
+\ifx\euro\undefined
+\def\euro{\leavevmode{% Poor but complex Euro symbol
+ \setbox0=\hbox{$\vcenter{\null}$}\dimen@=-\ht0
+ \setbox0=\hbox{C}\advance\dimen@ by 0.5\ht0
+ \rlap{\raise\dimen@\hbox{=}}%
+ % taking slant into account
+ \dimen@i=1pt\divide\dimen@ by \dimen@i
+ \dimen@i=\fontdimen1\the\font
+ \multiply\dimen@ by -\dimen@i
+ \advance\dimen@ by 0.16em
+ \kern\dimen@ C}}%
+\fi
+\ifx\Box\undefined
+\def\Box{{\setbox0\hbox{$+$}\dimen0=\ht0
+ \advance\dimen0 by \dp0 \advance\dimen0 by -0.8\p@
+ \vcenter{\hbox to \wd0{\hss\vbox{%
+ \hrule height 0.4pt\hbox{%
+ \vrule width 0.4\p@
+ \vbox to \dimen0{\hbox to \dimen0{\hss}\vss}%
+ \vrule width 0.4\p@}%
+ \hrule height 0.4\p@}\hss}}}}%
+\fi
+\ifx\lbbbrack\undefined\def\lbbbrack{[\![}\def\rbbbrack{]\!]}\fi
+%\def\indic@trice{\mathop{\mathbb 1\null}\mskip-\thinmuskip\mathord{\null}}%
+\def\indic@trice{\mathbb 1}%
+\def\indicatrice#1{\ifx*#1
+ \def\@next{\indic@trice_}\else
+ \let\@next=\relax\indic@trice_{\{#1\}}\fi\@next}%
+\def\dd{\mathop{\rm d\null}\mskip-\thinmuskip\mathord{\null}}%
+\def\ee{\mathop{\rm e\null}\mskip-\thinmuskip\mathord{\null}}%
+\mathchardef\ii="7069% i imaginaire
+\def\Proba{\mathop{\mathbb P\null}\nolimits}%
+\def\Expect{\mathop{\mathbb E\null}\nolimits}%
+\def\Var{\mathop{\rm Var}\nolimits}%
+\def\Bor{\mathop{\rm\mathcal Bor}\nolimits}%
+\def\pBor{\mathop{\rm p\mathcal Bor}\nolimits}%
+\def\bBor{\mathop{\rm b\mathcal Bor}\nolimits}%
+\def\Dom{\mathop{\rm Dom}\nolimits}%
+\def\Id{\mathop{\rm Id}\nolimits}%
+\def\sgn{\mathop{\rm sgn}\nolimits}%
+\def\card{\mathop{\rm Card}\nolimits}\let\Card=\card
+\ifx\complement\undefined\def\complement{c}\fi
+\mathchardef\D="7064% d differentiel
+\mathchardef\E="7065% e exponentiel
+\mathchardef\I="7069% i imaginaire
+\DefineOption{isolatin}{%
+ \def\@tmp##1{\ifx##1\undefined\let\@next=\relax
+ \else\catcode`##1=\active\fi\@next}%
+ \let\@next=\@tmp
+ \@tmp«»áàâäçéèêëìîïñóòôöùûüÿ
+ ÀÂÄÇÉÈÊËÌÎÏÑÒÔÖÙÛܾ°‚ƒˆ\undefined}%
+{\option@isolatin
+ \gdef«{``}\gdef»{''}%
+ \gdefá{\'a}\gdefà{\`a}\gdefâ{\^a}\gdefä{\"a}%
+ \gdefç{\c c}%
+ \gdefé{\'e}\gdefè{\`e}\gdefê{\^e}\gdefë{\"e}%
+ \gdefì{\`\i}\gdefî{\^\i}\gdefï{\"\i}%
+ \gdefñ{\~n}%
+ \gdefó{\'o}\gdefò{\`o}\gdefô{\^o}\gdefö{\"o}%
+ \gdefù{\`u}\gdefû{\^u}\gdefü{\"u}%
+ \gdefÿ{\"y}%
+ \gdefÀ{\`A}\gdefÂ{\^A}\gdefÄ{\"A}%
+ \gdefÇ{\c C}%
+ \gdefÉ{\'E}\gdefÈ{\`E}\gdefÊ{\^E}\gdefË{\"E}%
+ \gdefÌ{\`I}\gdefÎ{\^I}\gdefÏ{\"I}%
+ \gdefÑ{\~N}%
+ \gdefÒ{\`O}\gdefÔ{\^O}\gdefÖ{\"O}%
+ \gdefÙ{\`U}\gdefÛ{\^U}\gdefÜ{\"U}%
+ \gdef¾{\"Y}\gdef°{\ifmmode^\circ\else$^\circ$\fi}%
+ \gdef‚{\smash{\hbox to 0.5em{\hss\vrule height\ht\strutbox
+ depth\dp\strutbox width 0.4pt\hss}}}%
+ \gdefƒ{\hbox{\dimen@=-0.5ex\advance\dimen@ by 0.4pt
+ \vrule width0.5em height0.5ex depth\dimen@}}%
+ \gdefˆ{\smash{\rlap{ƒ}‚}}}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% THAT'S ALL, FOLKS!
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\outer\def\bye{\extra@end\par\vfill\supereject\stop}%
+\let\document=\relax
+\let\enddocument=\bye
+\let\\=\endgraf
+\def\newpage{\par\vfil\eject}%
+%
+% initialization of \jobname.aux
+%
+\immediate\openin\aux@out=\jobname.aux
+\ifeof\aux@out\immediate\closein\aux@out
+\else\immediate\closein\aux@out\init@aux
+\fi
+%
+\catcode`\@=12
+%
+\UseOptions{english,article,defaultsectioning,openright}%
+\tenpoint
+\parindent=1.333em
+\itemindent=\parindent
+\endinput
diff --git a/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.mp b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.mp
new file mode 100644
index 0000000000..584250e926
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.mp
@@ -0,0 +1,244 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dmanual.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Licence? Feel-free-to-send-me-a-postcard
+%
+% Anthony Phan,
+%
+% D\'epartement de Math\'ematiques,
+% SP2MI, T\'el\'eport 2,
+% Boulevard Marie et Pierre Curie,
+% BP 30179,
+% F-86962 Futuroscope-Chasseneuil cedex.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+input m3Dplain.mp;
+input m3Dlib01.mp;
+
+%prologues:=2;
+%defaultfont:="ptmr8r";% look in ../texmf/dvips/config/psfonts.map
+
+%ObsZ := 10cm;
+Resolution := 1mm;
+Phong := 3;
+Specularity := 1;
+Luminosity := 1;
+Contrast := 1;
+Fog := 2;
+FogZ := 0;
+FogHalf := 1cm;
+%fineplot:=true;
+LightAtInfinity:=false;
+ObjectColor:=0.75white;
+%LightSource:=3/3cm*(Ox+Oy+Oz);
+LightSource:=5cm*(1,1,1);%Unitvector(1,1,1);
+%ProjectionSystem(linear);
+ProjectionSystem(planar);
+%ProjectionSystem(spherical);
+
+fignumber = 0;
+vardef thisfig = fignumber := fignumber+1; fignumber enddef;
+
+%Ox := (0, 0, 1); Oy := (1, 0, 0); Oz := (0, 1, 0);
+
+let Fill = TechnoFill;
+beginfig(thisfig);
+ interim ObsZ:=10cm;
+% ObjectColor := (1, 215/255, 0);
+ OnDepth;
+ Refpoint(1,0,0);
+ Action
+ (UseObject(rope, Origin, (0, 90, 0), 1cm,
+ "cosd(t*90)", "0", "t", 0.25, -3, 0, true, false));
+ Refpoint(-1,0,0);
+ Action
+ (UseObject(rope, Origin, (0, 90, 0), 1cm,
+ "cosd(t*90)", "0", "t", 0.25, 0, 3, false, true));
+ for $ = 0 step 45 until 315:
+ Refpoint Dir($+95,0);
+ Action
+ (TextColor := ($/360)[blue,white];
+ UseObject(simpletext, Origin, ($+95, 0, 90), 10pt, "left", "ulft",
+ "Come let me sing into your ear;",
+ "Those dancing days are gone,",
+ "All that silk and satin gear;",
+ "Crouch upon a stone,",
+ "Wrapping that foul body up",
+ "In as foul a rag:",
+ "I carry the sun in a golden cup;",
+ "The moon in a silver bag."));
+ endfor
+ endOnDepth;
+endfig;
+
+let Fill = WireFill;
+beginfig(thisfig);
+ ObjectColor := (1, 215/255, 0);
+ for $ = -2 upto 2:
+ UseObject(rope, Origin, (0, -90, 0), 1cm,
+ "cosd(t*360)", "sind(t*360)", "t", 0.25, $-0.5, $,
+ if $ = -2: true else: false fi, false); endfor
+ ObjectColor := 0.5white;
+ UseObject(cylinder, (-2.5cm, 0, 0), (0, -90, 0), 1cm, 0.4, 5);
+ ObjectColor := (1, 215/255, 0);
+ for $ = -2 upto 2:
+ UseObject(rope, Origin, (0, -90, 0), 1cm,
+ "cosd(t*360)", "sind(t*360)", "t", 0.25, $, $+0.5,
+ if $ = 2: true else: false fi, false); endfor
+endfig;
+
+let Fill = SolidFill;
+beginfig(thisfig);
+ ObjectColor := (1, 215/255, 0.5);
+ UseObject(sierpinski_sponge, Origin, (10,0,0), 2cm, 2);
+endfig;
+
+%end.
+let Fill = SolidWireFill;
+beginfig(thisfig);
+ ObjectColor := (215/255, 1, 0.5);
+ UseObject(sierpinski_gasket, Origin, (30,0,0), 2cm, 5);
+endfig;
+
+let Fill = SolidFill;
+% beginfig(thisfig);
+% ObjectColor := (0.5, 0.5, 0.5);
+% ObjectPath := (1, 1)...(0.5, 0)...(1, -1);
+% Outside; UseSubObject1(torus, (0, 0, 0), Origin, 1cm, 1.25, 0.25);
+% Inside; UseObject(revolution, Origin, Origin, 1cm, ObjectPath);
+% Outside;
+% UseObject(sphere, (0, 0, -1.5cm), Origin, 0.5cm);
+% SpheresLink((0, 0, -1.5cm), (0, 0, 1.5cm), 0.5cm, 0.5cm, 0.25cm);
+% UseObject(sphere, (0, 0, 1.5cm), Origin, 0.5cm);
+% UseObject(revolution, Origin, Origin, 1cm, ObjectPath);
+% UseSubObject2(torus, (0, 0, 0), Origin, 1cm, 1.25, 0.25);
+% endfig;
+
+beginfig(thisfig);
+ save u; u=3cm;
+ interim Resolution:=0.5mm;
+ ObjectColor := (1, 215/255, 0);
+ ObjectPath :=
+ (eps, 0.65){right}
+ ...{up}(0.45, 1)
+ --(0.5, 1){down}
+ ...{left}(0.1,0.6)% bowl
+ {right}...{down}(0.15,0.55)
+ ...{down}(0.075,0.35){down}
+ ...{down}(0.075, 0.2)
+ ...(0.15,0.15){down}
+ ...{left}(0.1,0.1){right}
+ ...{right}(0.4,0.05)
+ --(0.4,0){left}
+ ...{left}(eps,0.05);
+ OnDepth;
+ Refpoint (0,0,0.8u);
+ Action (ObjectColor := red;
+ UseObject(revolution, (0, 0, 0), Origin, u,
+ (eps, ypart point 0.8 of ObjectPath)..point 0.8 of ObjectPath);
+ ObjectColor := (1, 215/255, 0););
+ % bowl
+ Refpoint (0,0,u);
+ Action (UseObject(revolution, (0, 0, 0), Origin, u,
+ subpath (0.75,3) of ObjectPath););
+ % stem
+ Refpoint (0,0,0.5u);
+ Action (UseObject(revolution, (0, 0, 0), Origin, u,
+ subpath (3,8) of ObjectPath));
+ %foot
+ Refpoint (0,0,0.25u);
+ Action (UseObject(revolution, (0, 0, 0), Origin, u,
+ subpath (8,11) of ObjectPath));
+ endOnDepth;
+endfig;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Molecule (C6 ???)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Object molecule =
+M1 = (0, 0, 1); M2 = (1, 0, 0); M3 = (0, 1, 0);
+M4 = (-1, 0, 0); M5 = (0, -1, 0); M6 = (0, 0, -1);
+srad := 0.25; lrad := 0.1;
+OnDepth;
+Refpoint M1;
+Action(ObjectColor := red; UseObject(sphere, M1, Origin, srad));
+Refpoint M2;
+Action(ObjectColor := red; UseObject(sphere, M2, Origin, srad));
+Refpoint M3;
+Action(ObjectColor := red; UseObject(sphere, M3, Origin, srad));
+Refpoint M4;
+Action(ObjectColor := red; UseObject(sphere, M4, Origin, srad));
+Refpoint M5;
+Action(ObjectColor := red; UseObject(sphere, M5, Origin, srad));
+Refpoint M6;
+Action(ObjectColor := red; UseObject(sphere, M6, Origin, srad));
+%
+Refpoint 0.5[M1, M2];
+Action(ObjectColor := 0.375white; SpheresLink(M1, M2, srad, srad, lrad));
+Refpoint 0.5[M1, M3];
+Action(ObjectColor := 0.375white; SpheresLink(M1, M3, srad, srad, lrad));
+Refpoint 0.5[M1, M4];
+Action(ObjectColor := 0.375white; SpheresLink(M1, M4, srad, srad, lrad));
+Refpoint 0.5[M1, M5];
+Action(ObjectColor := 0.375white; SpheresLink(M1, M5, srad, srad, lrad));
+%
+Refpoint 0.5[M6, M2];
+Action(ObjectColor := 0.375white; SpheresLink(M6, M2, srad, srad, lrad));
+Refpoint 0.5[M6, M3];
+Action(ObjectColor := 0.375white; SpheresLink(M6, M3, srad, srad, lrad));
+Refpoint 0.5[M6, M4];
+Action(ObjectColor := 0.375white; SpheresLink(M6, M4, srad, srad, lrad));
+Refpoint 0.5[M6, M5];
+Action(ObjectColor := 0.375white; SpheresLink(M6, M5, srad, srad, lrad));
+%
+Refpoint 0.5[M2, M3];
+Action(ObjectColor := 0.375white; SpheresLink(M2, M3, srad, srad, lrad));
+Refpoint 0.5[M3, M4];
+Action(ObjectColor := 0.375white; SpheresLink(M3, M4, srad, srad, lrad));
+Refpoint 0.5[M4, M5];
+Action(ObjectColor := 0.375white; SpheresLink(M4, M5, srad, srad, lrad));
+Refpoint 0.5[M5, M2];
+Action(ObjectColor := 0.375white; SpheresLink(M5, M2, srad, srad, lrad));
+endOnDepth;
+endObject;
+
+let Fill = SolidFill;
+beginfig(thisfig);
+ ObjectPath := (1, 1)..(0.5, 0)..(1, -1);
+ UseObject(molecule, Origin, Origin, 2cm);
+endfig;
+
+let Fill = SolidWireFill;
+ObjectColor := 0.5white;
+PenColor := green;
+%fineplot:=true;
+%Resolution := 1mm;
+
+beginfig(thisfig);
+ pickup thin.nib;
+ UseObject(plotThreeD, (0, 0, 0), (0, 0, 0), 0.25cm,
+ "4cosd(180/3.14159*(x++y))*mexp(-(x++y)*50)",
+ -15, 15, -10, 10);
+ UseSubObject1(torus, (0, 0, 2cm), (0, -30, 0), 0.5cm, 2.5, 0.5);
+ UseObject(sphere, (0, 0, 2cm), (0, 0, 0), 0.5cm);
+ UseSubObject2(torus, (0, 0, 2cm), (0, -30, 0), 0.5cm, 2.5, 0.5);
+endfig;
+
+let Fill = SolidFill;
+Resolution:=1mm;
+ObjectColor := (1, 215/255, 0);
+beginfig(thisfig);
+ UseObject(cylinderlike,(0,0,0),(0,0,0),1cm,
+ for i= 0 upto 4: 2dir(i/5*360)--dir((i+0.5)/5*360)-- endfor cycle, 1);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.pdf b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.pdf
new file mode 100644
index 0000000000..73d6a25559
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.tex b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.tex
new file mode 100644
index 0000000000..ed96e1cb5e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/manual/m3Dmanual.tex
@@ -0,0 +1,391 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dmanual.tex
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\input m3Dmanmac
+\input epsf
+\useoptions{preprint,magstep1,english,AMSsectioning}
+
+\def\TM{\textsuperscript{TM}}
+\def\cs#1{\ifmmode\hbox{\tt#1}\else{\tt#1}\fi}%
+\def\var#1{\ifmmode\hbox{\it#1\/}\else{\it#1\/}\fi}%
+\newdimen\fboxsep\fboxsep=2pt
+\newdimen\fboxrule\fboxrule=0.4pt
+\def\mybox#1{\vcenter{\setbox0=\hbox{\vrule width\fboxrule
+ \vbox{\hrule height\fboxrule\kern\fboxsep
+ \hbox{\kern\fboxsep\epsfbox{#1}\kern\fboxsep}\kern\fboxsep
+ \hrule height\fboxrule}\vrule width\fboxrule}
+ \copy0\kern\fboxsep\hbox to\wd0{\hss\tt#1\hss}}}%
+%\def\mybox#1{\hbox{\tt#1}}
+\title{m3D package manual}
+\author{Anthony Phan, \date}
+\maketitle
+
+\section*{Introduction}
+
+In the second half of the nineties (of the past century),
+I discovered \TeX, MetaFont and,
+then, MetaPost. I was truly enthousiastic about this last tool
+since it allows a very simple inclusion of images produced by
+some MetaFont-like language
+into \TeX\ documents. My first attempt in 3D pictures
+with MetaPost was very simple: the projection system was absolutely
+rigid and the picture was composed of a few lines and labels and
+only 4 filled flat surfaces whose colors where static.
+Then I understood that it is necessary to have a parametrizable
+frame since one does not always know if a picture, viewed from
+a certain angle, will be meaningfull or not. So the first and main
+step was done: having a parametrizable frame, dealing with space
+coordinates, drawing contours if their projection on the screen
+is well-oriented.
+
+Then I heard of Denis Roegel's package ``3D''. Its syntax didn't
+fit what I could have in mind about 3D-programming in MetaPost,
+but it features facilities for {\tt eps} to {\tt gif} conversion
+and animation. I stolled these animation facilities in order to
+have fun and also to find the best angle for my picture.
+Then I began to make more complex designs
+intended to illustrate my web pages\dots
+
+What was my {\it leitmotiv}\/
+was to keep the closest as possible to usual MetaFont/MetaPost
+programming, but also to consider every 3-dimensional object
+as enough complex to deserve a quite technical code.
+So I've come to think that what could be nice should be to
+have a stable and powerfull basic program and add to it libraries
+of common objects. Some more complex objects could then be build up
+from those more basic ones by moving them, rotating them and
+rescaling them. My idea about objects is certainly not related to
+object-programming, it is just the naive notion of solid bodies.
+
+The aim one can have with such a project is boundless.
+The package ``m3D'' remains still in progress. I'm only
+glad to be able to use it when a friend ask me if I can
+draw a better picture than he does.
+
+Also one of my believes is that any MetaPost programmer
+prefers to build his/her own macros' system than relying
+on someone else's programs---especially when these ones
+are claimed to be unstable. Such a programmer would
+simply have an overview of the syntax, of some special
+hacks, may publish his/her own programs on Internet
+and in this way give some feed back to every other
+people interested in such programming.
+
+\section{Basic concepts}
+
+As anyone knows, MetaPost provides standard facilities
+for manipulating 3~dimensional vectors with the variable
+type ``color'': type-check, addition, substraction, scalar
+multiplication. What may be seen as missing is affine
+transformations of 3~dimensional vectors or pictures
+but no one would complain about that since MetaPost
+is a 2-dimensional oriented programming language
+and anyone would accept using some higher level
+control sequences for such tasks.
+
+
+\section{Coordinates system}
+
+\section{Projection system}
+
+\section{Rendering parameters}
+
+\list{definitions}
+
+\item{\tt ObsZ :=} internal numeric.
+
+\item{\tt Resolution :=} internal numeric.
+
+\item{\tt Phong :=} internal numeric.
+
+\item{\tt Specularity :=} internal numeric.
+
+\item{\tt Luminosity :=} internal numeric.
+
+\item{\tt Contrast :=} internal numeric.
+
+\item{\tt Fog :=} internal numeric.
+
+\item{\tt FogZ :=} internal numeric.
+
+\item{\tt FogHalf :=} internal numeric.
+
+\item{\tt fineplot :=} boolean.
+
+\item{\tt LightAtInfinity :=} boolean.
+
+\item{\tt LightSource :=} color.
+
+\item{\tt ObjectColor :=} color.
+
+\endlist
+
+\section{About the light source}
+
+There is only one light source defined in {\tt m3Dplain.mp}.
+It can be located at infinity ({\tt LightAtInfinity := true})
+or at some point in the scenery ({\tt LightAtInfinity := false}).
+In both cases its coordinates {\tt LightSource} refer to the
+global screen frame and are not modified when objects are
+translated or rotated, that is that the light is fixed
+for the observer.
+
+If one wants to link the light source to a peculiar object,
+one has to write within the definition of the object something like
+$$
+ \hbox{\tt LightSource := GDir(x,y,z)}
+$$
+if the light source is located at infinity, or
+$$
+ \hbox{\tt LightSource := GCoord(x,y,z)}
+$$
+if the light source is located at some point in space
+({\tt (x,y,z)} are here {\it local}\/ coordinates).
+One should notice that it is barely the only direct use
+of the control sequences {\tt GDir} and {\tt GCoord}.
+
+If one needs more than one light source, one has to
+define anew the control sequence {\tt Light} of
+{\tt m3Dplain.mp} (good luck since it is already
+a heavy machinery).
+
+\section{Ordering and hidden bodies}
+
+Drawing a single convex body is an easy task: one just have to draw
+every facet which contour is seen, or projected, as a positively
+(resp. negatively) oriented path when drawing its exterior (resp.
+interior) side. So, hidden facets are no problem in these cases.
+Switching between inside and outside can be done with \cs{Inside}
+and \cs{Outside} control sequences. They simply reverse the condition
+about orientation.
+
+When dealing with non-convex bodies, one has to decompose these bodies
+into their convex parts and draw them in a proper order. Thus, we come
+to ordering. A fairly tricky control sequence named \cs{QuickSort}
+has been designed for this purpose. Its argument is some text that
+must contain at least two terms and its output is a control sequence
+named \cs{SortedList} which content is the previous (expanded) list
+ordered with respect to a \cs{SortCriterion}.
+\cs{SortCriterion} is a control sequence with two arguments (members of
+the list which is to be sorted) whose replacement text is a boolean.
+By default, these arguments are triples and the condition is about their
+actual depth relatively to the current observer. Thus
+\cs{QuickSort(\var{list of triples})} would output \cs{SortedList}
+whose replacement text is just the expected ordered list of triples.
+One can change this just by adapting \cs{SortCriterion} in order
+to sort numerics, pairs, strings, \dots
+
+It wouldn't be very elegant to sort things this way if one wants to perform
+a list of actions with respect to the depth of a list of points in space.
+A more natural way to do so is to use the following procedure:
+
+\cs{OnDepth;}
+
+\cs{Refpoint \var{triple};}
+
+\cs{Action (\var{delimited control sequences});}
+
+...
+
+\cs{endOnDepth;}
+
+\noindent
+What this procedure does is the following: save and reset a few things
+at the \cs{OnDepth} statement; increase the \cs{Action\_counter} and
+stores the current reference point (a \var{triple}) at \cs{Refpoint}
+invocation; stores the \var{delimited control sequences} into a
+variable control sequence numbered (here there is a little trick that
+I have been looking for a very very long time) with the current
+\cs{Action\_counter}; at \cs{endOnDepth} orders the list
+$1,\dots,\cs{Action\_counter}$ with respect to the depth of the
+reference points and then performs actions with respect to the sorted
+list. The most interesting thing with this procedure is that actions
+may depend on some parameters just as loop or macro parameters. Note
+that the \cs{SortCriterion} has a special and temporary meaning when
+performing \cs{endOnDepth}: its two arguments are then some indexes in
+$1,\dots,\cs{Action\_counter}$ and the comparison is done between the
+depths of the two corresponding reference points.
+
+\section{Integrating text}
+
+This is clear that for some nice and funny pictures, one has to
+integrate text in the three dimensional space, for instance when
+moving a text around a picture as I've done once or twice. This is
+rather particular. Defining any general scheme for doing so seems to
+me rather pointless: it is too complicated, it is hard to imagine what
+people would like to do, etc. Anyway, some control sequence that
+allows to move flat text around would be a basic stuff. Also, basic
+programming of such things may help to design special control
+sequences for more complicated tasks.
+
+\subsection{Simple text}
+An object named \cs{simpletext} is defined in \cs{m3Dplain.mp}. Its
+specific parameters consist, first, in a string describing the
+alignment (\cs{"left"}, \cs{"justify"}, \cs{"center"} or \cs{"right"})
+and a string telling where on the text the reference point should be
+(typically \cs{"right"}, \cs{"urt"}, \cs{"top"}, \cs{"ulft"},
+\cs{"left"}, \cs{"llft"}, \cs{"bot"}, \cs{"lrt"} or [say!]
+\cs{"center"}), then, in a list of strings which would be displayed
+one above another.
+
+For instance, at a top level ({\it see}\/ further on about the scale parameter),
+\tabindent=\parindent
+\verbatim
+ UseObject(simpletext, Origin, (90, 0, 90), 10pt, "justify", "ulft",
+ "Come let me sing into your ear;",
+ "Those dancing days are gone,",
+ "All that silk and satin gear;",
+ "Crouch upon a stone,",
+ "Wrapping that foul body up",
+ "In as foul a rag:",
+ "I carry the sun in a golden cup;",
+ "The moon in a silver bag."));
+\endverbatim
+\noindent
+would display, at basepoint {\tt Origin}, with frame the current one
+rotated by $(90,0,90)$, with scale $10\,\rm pt$, the first part of J.B.~Yeats'
+poem \og Those dancing days are gone\fg. If it is reasonable,
+each line would be justified and the basepoint would correspond
+to the upper left corner of the text.
+
+The {\tt simpletext} object uses a font named by the string {\tt mthreeDfont} (default value: {\tt"rphvb"}). Its design size is defined by the numerical variable named {\tt mtheeDfontsize} (default value: {\tt10pt}).
+The numerical parameter \cs{baselineskip} parameter has its usual role
+(default value: {\tt12pt}). These parameters are only related to the font, not to the {\tt CurrentScale}. Thus, when using {\tt simpletext} into an object, beware of the \var{scale} given in statements like
+$$
+\displaylines{\indent
+\cs{UseObject(simpletext, \var{origin}, \var{Euler angles}, \var{scale},}
+\hfill\cr\hfill
+\cs{\var{alignment string}, \var{location string}, \var{list of strings})}\indent}
+$$
+since \var{scale} must be a {\it local scale}.
+
+Justification is obtained by stretching the normal space
+width of the font up to a \cs{TextStretchFactor}
+(whose default value is $2$ which is quite large). Many
+successive spaces into a sentence count as as many spaces: {\it they are
+not reduced into a single space.}
+
+Each character is drawn separately just to make sure that the affine transformation acting on the character would be approximatively correct if the projection is not linear. {\it Since every character would have a special scaling, one must set\/ \cs{prologues}\/ to 1 or 2 in order to not overflow MetaPost capacities (the whole font will simply be declared at the beginning of the eps figure and not every character with its own transformation).} Of course, one should use PostScript\TM\ fonts for such use. This is why we have introduced {\tt mthreeDfont}.
+
+\subsection{Curved text}
+Planned but not released.
+
+\remark
+Remember that annotating graphics can still be done with usual control
+sequence like
+$$
+\cs{label{\it.loc}({\it label}, proj($x$, $y$, $z$))}
+$$
+since things like {\tt simpletext} or {\tt curvedtext}
+are rather for very special effects.
+\endremark
+
+\section{Animations}
+
+\subsection{Introduction}
+Denis Roegel demonstrated that it is possible to use usual Unix tools
+to merge a list of MetaPost outputs into an animated GIF image (3D package).
+I've learned a lot from his ``metapost to shell'' script. The idea is the following: first, keep track of the maximum boundary limits of every eps outputs; then convert these eps outputs into PostScript\TM\ or eps files with these maximum boundary limits; convert these last files to, say, simple GIF images; then merge all these images into an animation.
+
+\subsection{How-to with m3D}
+With {\tt m3Dplain} (as for {\tt 3D}), (hidden) numerics named
+\cs{xmin\_}, \cs{xmax\_}, \cs{ymin\_} and \cs{ymax\_} are updated
+at every figure ends through a control sequence named {\tt compute\_bbox}
+(embedded by {\tt m3Dplain.mp} into \cs{extra\_endfig}). Executing
+$$
+\hbox{\tt Animate({\it numeric}, {\it boolean or color})}
+$$
+at the end of the file would produce an external file whose name is,
+by default, {\tt animate-script}.
+Once the MetaPost job finished, under Unix-like system, execute
+$$
+ \hbox{\tt bash animate-script}
+$$
+from a console ({\tt xterm} or such) in the right directory. The final
+output is \cs{jobname.gif} where {\tt jobname} is the actual name of the MetaPost program.
+
+\subsection{External programs}
+This script requires the following programs: {\tt sed} and {\tt convert}.
+We choose to use {\tt sed} to change the boundary parameters of every MetaPost output---the resulting temporary files are named {\tt jobname.xxx.eps} where {\tt jobname.xxx} is the name of one of the MetaPost outputs. The PostScript\TM\ to GIF conversion was performed with the Netpbm library in Roegel's macros and their merging into an animation was performed by {\tt gifmerge} (a non standard but very nice Unix program freely available on the web). These last years, ImageMagick (copyrighted first by Dupont de Nemours, then by ImageMagick Studio, but quite free in fact) has spread over almost every Linux distribution. It is a very high quality tool that converts anything into everything, even animations. One of the basic control sequence is {\tt convert} which is the one called by the former script.
+
+\subsection{Details} The following provides more detailed explanations.
+
+\list{definitions}
+
+\item{\tt Animate({\it numeric}, {\it boolean or color})}
+Control sequence whose first parameter is the border in {\tt bp} provided with no units, and the second one is a color or a boolean. When the second parameter is a color, this color will be made transparent in the animation. When it is a boolean, {\tt background} (color) will be made transparent if the boolean is true, and no transparency will be made if this boolean is false.
+
+
+\item{\tt AnimateScript} String variable, name of the (bash) script file which is output by {\tt Animate}.
+
+\item{\tt AnimateQuality} Numerical variable, typical values are 1, 2, 4\dots
+
+\item{\tt AnimateDelay} Numerical variable, time in $1/100$ seconds between every image in the animation.
+
+\item{\tt AnimateLoop} Numerical variable, parameter for the animation, its dafult value is equal to 0 (infinite loop).
+
+\item{\tt compute\_bbox} and also \cs{xmin\_}, \cs{xmax\_}, \cs{ymin\_}, \cs{ymax\_} have been explained before.
+\endlist
+
+\section{Outputting encapsuled PostScript directly}
+
+\cs{DirectEPS \var{filename};}
+
+...
+
+\cs{endDirectEPS;}
+
+\section{Some samples}
+
+The first picture is made with \cs{Fill} equal to \cs{TechnoFill} (I
+have to change this name one day), the next one with \cs{Fill} equal
+to \cs{WireFill} (more conventional). I have also added a text (W.B. Yeats)
+for testing the \cs{simpletext} object. There is, in the second picture, a cylinder but the most
+important is the use of an object named \cs{rope}: given a path in
+space through $x(t)$, $y(t)$, $z(t)$, a radius $r$, a range for $t$,
+this object is what one can expect it to be. Also computations are
+quite fragile (second order) and may leads to unexpected and ugly
+effects. If the object \cs{cylinder} is defined in \cs{m3Dlib01.mp},
+\cs{rope} is defined in \cs{m3Dplain.mp} since I think it may be a
+basic tool.
+$$\mybox{m3Dmanual.1}$$
+$$\mybox{m3Dmanual.2}$$ Here there are two
+Sierpinski--Menger objects: the sponge (object named
+\cs{sierpinskip\_sponge}) and the gasket (object named
+\cs{sierpinskip\_gasket}). The sponge is drawn with \cs{Fill} equal to
+\cs{SolidFill} and the gasket with \cs{Fill} equal to
+\cs{SolidWireFill}. Both objects are defined in \cs{m3Dlib01.mp}. The
+gasket---since it grows as $4^n$ where $n$ is the level of
+recursion---is a lot easier to draw than the sponge---which grows as
+$20^n$. Reaching the level 3 on my current MetaPost implementation for
+the sponge was not an easy task.
+$$\mybox{m3Dmanual.3}\qquad\mybox{m3Dmanual.4}$$
+$$\mybox{m3Dmanual.5}\qquad\mybox{m3Dmanual.6}$$
+$$
+ \mybox{m3Dmanual.7}
+$$
+This last example shows the use of the object named \cs{cylinderlike}
+which is defined in \cs{m3Dplain.mp}.
+$$
+ \mybox{m3Dmanual.8}
+$$
+Its specific parameters are an
+$xOy$-cycle path and the height of the cyclinder. Thus, former picture
+as be obtained with
+\verbatim
+ beginfig(8);
+ UseObject(cylinderlike,(0,0,0),(0,0,0),1cm,
+ for i = 0 upto 4:
+ 2dir(i/5*360)--dir((i+0.5)/5*360)--
+ endfor cycle, 1);
+ endfig;
+\endverbatim
+\noindent which is rather simple.
+%\verbatimfile{m3Dplain.mp}
+\bye
+
diff --git a/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dlib01.mp b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dlib01.mp
new file mode 100644
index 0000000000..ae2ae536fb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dlib01.mp
@@ -0,0 +1,543 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dlib01.mp (basic mathematical objects)
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Licence? Feel-free-to-send-me-a-postcard
+%
+% Anthony Phan,
+%
+% D\'epartement de Math\'ematiques,
+% SP2MI, T\'el\'eport 2,
+% Boulevard Marie et Pierre Curie,
+% BP 30179,
+% F-86962 Futuroscope-Chasseneuil cedex.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if unknown mthreeDplain: input m3Dplain; fi
+message "m3Dlib01: basic mathematical objects.";
+message"";
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 1. Polyhedrons
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%
+% Icosahedron
+%
+% parameters: none
+%
+% sub-objects: none
+%
+% From Marcel Berger, G\'eom\'etrie, Vol. 3
+
+def triface_(suffix $, $$, $$$) =
+ Fill(m$--m$$--m$$$--cycle, (M$+M$$+M$$$)/3, Unitvector(M$+M$$+M$$$));
+enddef;
+
+Object icosahedron =
+save a; a = (sqrt(5)+1)/2;
+UseObject(icosahedronB, Origin, (0, angle(a, 1), 0), 1/(1++a));
+endObject;
+
+Object icosahedronB =
+save tau, tmp; tau = (sqrt(5)+1)/2;
+M1 = (0, tau, 1); M2 = (0, -tau, 1); M3 = (0, tau, -1);
+M4 = (0, -tau, -1); M5 = (1, 0, tau); M6 = (-1, 0, tau);
+M7 = (1, 0, -tau); M8 = (-1, 0, -tau); M9 = (tau, 1, 0);
+M10 = (-tau, 1, 0); M11 = (tau, -1, 0); M12 = (-tau, -1, 0);
+triface_(1, 9, 3); triface_(1, 5, 9); triface_(1, 6, 5); triface_(1, 10, 6);
+triface_(1, 3, 10); triface_(3, 9, 7); triface_(9, 11, 7); triface_(9, 5, 11);
+triface_(5, 2, 11); triface_(5, 6, 2); triface_(6, 12, 2); triface_(6, 10, 12);
+triface_(10, 8, 12); triface_(10, 3, 8); triface_(3, 7, 8); triface_(4, 11, 2);
+triface_(4, 2, 12); triface_(4, 12, 8); triface_(4, 8, 7); triface_(4, 7, 11);
+endObject;
+
+%
+% Dodecahedron
+%
+% parameters: none
+%
+% sub-objects: none
+%
+% From Marcel Berger, G\'eom\'etrie, Vol. 3
+% constructed as the dual of the Icosahedron
+
+def penface_(suffix $, $$, $$$, $$$$, $$$$$) =
+ Fill(m$--m$$--m$$$--m$$$$--m$$$$$--cycle,
+ (M$+M$$+M$$$+M$$$$+M$$$$$)/5, Unitvector(M$+M$$+M$$$+M$$$$+M$$$$$))
+enddef;
+
+Object dodecahedron =
+save a; a = (sqrt(5)+1)/2;
+UseObject(dodecahedronB, Origin, (0, angle(a, 1), 0),
+ 1/length((2a+1)/3, a/3));
+endObject;
+
+Object dodecahedronB =
+save tau; tau = (sqrt(5)+1)/2;
+M'1 = (0, tau, 1); M'2 = (0, -tau, 1); M'3 = (0, tau, -1);
+M'4 = (0, -tau, -1); M'5 = (1, 0, tau); M'6 = (-1, 0, tau);
+M'7 = (1, 0, -tau); M'8 = (-1, 0, -tau); M'9 = (tau, 1, 0);
+M'10 = (-tau, 1, 0); M'11 = (tau, -1, 0); M'12 = (-tau, -1, 0);
+M1 = 1/3(M'1+M'9+M'3); M2 = 1/3(M'1+M'5+M'9);
+M3 = 1/3(M'1+M'6+M'5); M4 = 1/3(M'1+M'10+M'6);
+M5 = 1/3(M'1+M'3+M'10); M6 = 1/3(M'3+M'9+M'7);
+M7 = 1/3(M'9+M'11+M'7); M8 = 1/3(M'9+M'5+M'11);
+M9 = 1/3(M'5+M'2+M'11); M10 = 1/3(M'5+M'6+M'2);
+M11 = 1/3(M'6+M'12+M'2); M12 = 1/3(M'6+M'10+M'12);
+M13 = 1/3(M'10+M'8+M'12); M14 = 1/3(M'10+M'3+M'8);
+M15 = 1/3(M'3+M'7+M'8); M16 = 1/3(M'4+M'11+M'2);
+M17 = 1/3(M'4+M'2+M'12); M18 = 1/3(M'4+M'12+M'8);
+M19 = 1/3(M'4+M'8+M'7); M20 = 1/3(M'4+M'7+M'11);
+penface_(5, 4, 3, 2, 1);
+penface_(1, 2, 8, 7, 6);
+penface_(2, 3, 10, 9, 8);
+penface_(3, 4, 12, 11, 10);
+penface_(4, 5, 14, 13, 12);
+penface_(5, 1, 6, 15, 14);
+penface_(16, 17, 18, 19, 20);
+penface_(16, 20, 7, 8, 9);
+penface_(9, 10, 11, 17, 16);
+penface_(11, 12, 13, 18, 17);
+penface_(6, 7, 20, 19, 15);
+penface_(13, 14, 15, 19, 18);
+endObject;
+
+%
+% Octahedron
+%
+% parameters: none
+%
+% sub-objects: none
+
+Object octahedron =
+Fill(proj(1, 0, 0)--proj(0, 1, 0)--proj(0, 0, 1)--cycle,
+ (1, 1, 1)/3, (1, 1, 1)/sqrt3);
+Fill(proj(0, 1, 0)--proj(-1, 0, 0)--proj(0, 0, 1)--cycle,
+ (-1, 1, 1)/3, (-1, 1, 1)/sqrt3);
+Fill(proj(-1, 0, 0)--proj(0, -1, 0)--proj(0, 0, 1)--cycle,
+ (-1, -1, 1)/3, (-1, -1, 1)/sqrt3);
+Fill(proj(0, -1, 0)--proj(1, 0, 0)--proj(0, 0, 1)--cycle,
+ (1, -1, 1)/3, (1, -1, 1)/sqrt3);
+Fill(proj(1, 0, 0)--proj(0, 0, -1)--proj(0, 1, 0)--cycle,
+ (1, 1, -1)/3, (1, 1, -1)/sqrt3);
+Fill(proj(0, 1, 0)--proj(0, 0, -1)--proj(-1, 0, 0)--cycle,
+ (-1, 1, -1)/3, (-1, 1, -1)/sqrt3);
+Fill(proj(-1, 0, 0)--proj(0, 0, -1)--proj(0, -1, 0)--cycle,
+ (-1, -1, -1)/3, (-1, -1, -1)/sqrt3);
+Fill(proj(0, -1, 0)--proj(0, 0, -1)--proj(1, 0, 0)--cycle,
+ (1, -1, -1)/3, (1, -1, -1)/sqrt3);
+endObject;
+
+%
+% Tetrahedron
+%
+% parameters: none
+%
+% sub-objects: none
+
+Object tetrahedron =
+M1 = (0, 0, 1); z2 = z3 = z4 = -1/3; x2 = 2sqrt(2)/3;
+y2 = 0; y3 = -y4 = x2*sqrt(3)/2; x3 = x4 = -x2/2;
+triface_(1, 2, 3); triface_(1, 3, 4);
+triface_(1, 4, 2); triface_(2, 4, 3);
+endObject;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 2. Common mathematical objects
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%
+% Cylinder (axis: z'Oz)
+%
+% parameters: radius, height
+%
+% sub-objects: 1 (side part), 2 (bottom part), 3 (top part)
+
+Object cylinder(expr r, h) =
+save na, nh;
+na = 4ceiling(1.570796r*(CurrentScale/Resolution));
+SubObject1:
+nh = ceiling(h*(CurrentScale/Resolution));
+for @ = 1 upto nh:
+ for $ = 1 upto na:
+ Fill(proj(r*cosd(($-1)/na*360), r*sind(($-1)/na*360), (@-1)/nh*h)
+ --proj(r*cosd($/na*360), r*sind($/na*360), (@-1)/nh*h)
+ --proj(r*cosd($/na*360), r*sind($/na*360), @/nh*h)
+ --proj(r*cosd(($-1)/na*360), r*sind(($-1)/na*360), @/nh*h)
+ --cycle,
+ (r*cosd(($-.5)/na*360), r*sind(($-.5)/na*360), (@-.5)/nh*h),
+ (cosd(($-.5)/na*360), sind(($-.5)/na*360), 0));
+ endfor
+endfor
+endSubObject;
+SubObject2:
+Fill(for $ = na downto 1:
+ proj(r*cosd($/na*360), r*sind($/na*360), 0)-- endfor cycle,
+ (0, 0, 0), (0, 0, -1));
+endSubObject;
+SubObject3:
+Fill(for $ = 1 upto na:
+ proj(r*cosd($/na*360), r*sind($/na*360), h)-- endfor cycle,
+ (0, 0, h), (0, 0, 1));
+endSubObject;
+endObject;
+
+%
+% Cone (axis: z'Oz)
+%
+% parameters: radius, height
+%
+% sub-objects: 1 (side part), 2 (bottom part)
+
+Object cone(expr radius, h) =
+save na, nh, r;
+na = 4ceiling(1.570796radius*(CurrentScale/Resolution));
+SubObject1:
+nh = ceiling(h*(CurrentScale/Resolution));
+r := radius;
+for @ = 1 upto nh:
+ r' := radius*(1-@/nh);
+ for $ = 1 upto na:
+ Fill(proj(r*cosd(($-1)/na*360), r*sind(($-1)/na*360), (@-1)/nh*h)
+ --proj(r*cosd($/na*360), r*sind($/na*360), (@-1)/nh*h)
+ --proj(r'*cosd($/na*360), r'*sind($/na*360), @/nh*h)
+ --proj(r'*cosd(($-1)/na*360), r'*sind(($-1)/na*360), @/nh*h)
+ --cycle,
+ (0.5(r+r')*cosd(($-.5)/na*360), 0.5(r+r')*sind(($-.5)/na*360),
+ (@-.5)/nh*h),
+ Unitvector(cosd(($-.5)/na*360), sind(($-.5)/na*360), h/radius));
+ endfor
+ r := r';
+endfor
+endSubObject;
+SubObject 2:
+Fill(for $ = na downto 1:
+ proj(radius*cosd($/na*360), radius*sind($/na*360), 0)-- endfor cycle,
+ (0, 0, 0), (0, 0, -1));
+endSubObject;
+endObject;
+
+%
+% Ellipsoid
+%
+% parameters: rx, ry, rz
+%
+
+Object ellipsoid(expr rx, ry, rz) =
+MetaSphere(rx, ry, rz, 0, 360, -90, 90);
+endObject;
+
+%
+% Torus (axis: z'Oz)
+%
+% parameters: primary radius, secondary radius
+%
+% sub-objects: 1 (rear part), 2 (front part)
+
+Object torus(expr PRadius, SRadius) =
+save a, na, nb, r, s, t; r = SRadius/PRadius;
+na = ceiling(1.570796(PRadius+SRadius)*(CurrentScale/Resolution));
+nb = ceiling(3.14159SRadius*(CurrentScale/Resolution));
+%
+% looking for the deepest angle
+%
+a := 0; x := Depth(1, 0, 0);
+for $ = 1 upto 4na:
+ x' := Depth(cosd($/na*90), sind($/na*90), 0);
+ if x' > x: x := x'; a := $; fi
+endfor
+%
+% Let's go
+%
+for $ = if SubObjectNumber = 0: 0 upto 2na-1
+ elseif SubObjectNumber = 1: 0 upto na-1
+ else: na upto 2na-1 fi:
+ x0 := PRadius*cosd(($+a)/na*90); x1 := PRadius*cosd(($+a+1)/na*90);
+ y0 := PRadius*sind(($+a)/na*90); y1 := PRadius*sind(($+a+1)/na*90);
+ x'0 := PRadius*cosd((-$+a)/na*90); x'1 := PRadius*cosd((-$+a-1)/na*90);
+ y'0 := PRadius*sind((-$+a)/na*90); y'1 := PRadius*sind((-$+a-1)/na*90);
+ for @ = 0 upto 2nb-1:
+ t := 1+r*cosd(@/nb*180);
+ x2 := t*x0; y2 := t*y0; x'2 := t*x'0; y'2 := t*y'0;
+ x3 := t*x1; y3 := t*y1; x'3 := t*x'1; y'3 := t*y'1;
+ z2 := z3 := z'2 := z'3 := SRadius*sind(@/nb*180);
+ t := 1+r*cosd((@+1)/nb*180);
+ x5 := t*x0; y5 := t*y0; x'5 := t*x'0; y'5 := t*y'0;
+ x4 := t*x1; y4 := t*y1; x'4 := t*x'1; y'4 := t*y'1;
+ z4 := z5 := z'4 := z'5 := SRadius*sind((@+1)/nb*180);
+ x6 := cosd((@+.5)/nb*180)*cosd(($+a+.5)/na*90);
+ y6 := cosd((@+.5)/nb*180)*sind(($+a+.5)/na*90);
+ z6 := sind((@+.5)/nb*180);
+ x'6 := cosd((@+.5)/nb*180)*cosd((-$+a-.5)/na*90);
+ y'6 := cosd((@+.5)/nb*180)*sind((-$+a-.5)/na*90);
+ z'6 := sind((@+.5)/nb*180);
+ Fill(m2--m3--m4--m5--cycle, (M2+M3+M4+M5)/4, M6);
+ Fill(m'5--m'4--m'3--m'2--cycle, (M'2+M'3+M'4+M'5)/4, M'6);
+ endfor endfor
+endObject;
+
+%
+% Klein bottle (in progress)
+%
+% parameters: none
+%
+% sub-objects: 1 (to be defined), 2 (to be defined)
+
+Object klein_bottle =
+save da, db, r, ct, st, cp, sp, a_min, s, t;
+da = 180/ceiling(12*3.14159(CurrentScale/Resolution));
+db = 180/ceiling(4*3.14159(CurrentScale/Resolution));
+a_min = 0; t = Depth(0, 0, 0); z := 0;
+for $ = 0 step da until 360-da:
+ x := cosd $; y := sind $; s := Depth M;
+ if s > t: t := s; a_min := $; fi
+endfor
+for psi = 0 step da until 180-0.5da:
+ for @ = 0 step db until 360 -0.5db:
+ for $ = a_min+psi, a_min-da-psi:
+ % theta := psi;
+ ct := cosd $; st := sind $;
+ cp := cosd @; sp := sind @;
+ r := 4(1-0.5ct);
+ ct' := cosd($+da); st' := sind($+da);
+ cp' := cosd(@+db); sp' := sind(@+db);
+ r' := 4(1-0.5ct'); z1 := r*sp; z2 := r'*sp; z3 := r'*sp'; z4 := r*sp';
+ if st >= 0:
+ x1 := 6(1+st)*ct+r*ct*cp; y1 := 16st+r*st*cp;
+ x4 := 6(1+st)*ct+r*ct*cp'; y4 := 16st+r*st*cp';
+ else:
+ x1 := 6(1+st)*ct-r*cp; y1 := 16st;
+ x4 := 6(1+st)*ct-r*cp'; y4 := 16st;
+ fi
+ if st'>= 0:
+ x2 := 6(1+st')*ct'+r'*ct'*cp; y2 := 16st'+r'*st'*cp;
+ x3 := 6(1+st')*ct'+r'*ct'*cp'; y3 := 16st'+r'*st'*cp';
+ else:
+ x2 := 6(1+st')*ct'-r'*cp; y2 := 16st';
+ x3 := 6(1+st')*ct'-r'*cp'; y3 := 16st';
+ fi
+ ObjectNormalVector := Unitvector((M2-M1) Vectprod (M4-M1));
+ Fill(m1--m2--m3--m4--cycle, (M1+M2+M3+M4)/4, ObjectNormalVector);
+ endfor
+ endfor endfor
+endObject;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 3. Fractals (Sierpinski-Menger stuff)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% to be improved
+% maximum is recursion_level := 2;
+
+Object sierpinski_sponge(expr level) =
+save a, recurse, dx, dx_, dy, dy_, dz, dz_;
+boolean dx, dx_, dy, dy_, dz, dz_;
+a := 0;
+M1 = (-1, -1, -1); M2 = (0, -1, -1); M3 = (1, -1, -1); M4 = (1, 0, -1);
+M5 = (1, 1, -1); M6 = (0, 1, -1); M7 = (-1, 1, -1); M8 = (-1, 0, -1);
+M9 = (-1, -1, 0); M10 = (1, -1, 0); M11 = (1, 1, 0); M12 = (-1, 1, 0);
+M13 = (-1, -1, 1); M14 = (0, -1, 1); M15 = (1, -1, 1); M16 = (1, 0, 1);
+M17 = (1, 1, 1); M18 = (0, 1, 1); M19 = (-1, 1, 1); M20 = (-1, 0, 1);
+save SortedList;
+QuickSort(M1, M2, M3, M4, M5, M6, M7, M8, M9, M10,
+ M11, M12, M13, M14, M15, M16, M17, M18, M19, M20);
+def recurse(expr p, u, l)(text Mlist) =
+ if l < level:
+ for $ = SortedList:
+ recurse(p+u*$/3, u/3, l+1)(9*(Xpart$+1)+3*(Ypart$+1)+Zpart$+1, Mlist);
+ endfor
+ else:
+ a := 0; dx := dx_ := dy := dy_ := dz := dz_ := false;
+ for $ = Mlist:
+ x := floor($/9); y := floor($/3-3x); z := floor($-9x-3y);
+ if a < level:
+ if (x = 1) or (y = 1) or (z = 1):
+ if (z = 0) and (not dz) and
+ (((x = 1) and ((y = 0) or (y = 2)))
+ or ((y = 1) and ((x = 0) or (x = 2)))):
+ Fill(proj(p+.5u*(-1, -1, 1))--proj(p+.5u*(1, -1, 1))
+ --proj(p+.5u*(1, 1, 1))--proj(p+.5u*(-1, 1, 1))--cycle,
+ p+.5u*(0, 0, 1), (0, 0, 1)); dz := true;
+ fi
+ if (z = 2) and (not dz_) and
+ (((x = 1) and ((y = 0) or (y = 2)))
+ or ((y = 1) and ((x = 0) or (x = 2)))):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(-1, 1, -1))
+ --proj(p+.5u*(1, 1, -1))--proj(p+.5u*(1, -1, -1))--cycle,
+ p+.5u*(0, 0, -1), (0, 0, -1)); dz_ := true;
+ fi
+ if (x = 0) and (not dx) and
+ (((z = 1) and ((y = 0) or (y = 2)))
+ or ((y = 1) and ((z = 0) or (z = 2)))):
+ Fill(proj(p+.5u*(1, -1, -1))--proj(p+.5u*(1, 1, -1))
+ --proj(p+.5u*(1, 1, 1))--proj(p+.5u*(1, -1, 1))--cycle,
+ p+.5u*(1, 0, 0), (1, 0, 0)); dx := true;
+ fi
+ if (x = 2) and (not dx_) and
+ (((z = 1) and ((y = 0) or (y = 2)))
+ or ((y = 1) and ((z = 0) or (z = 2)))):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(-1, -1, 1))
+ --proj(p+.5u*(-1, 1, 1))--proj(p+.5u*(-1, 1, -1))--cycle,
+ p+.5u*(-1, 0, 0), (-1, 0, 0)); dx_ := true;
+ fi
+ if (y = 0) and (not dy) and
+ (((z = 1) and ((x = 0) or (x = 2)))
+ or ((x = 1) and ((z = 0) or (z = 2)))):
+ Fill(proj(p+.5u*(1, 1, -1))--proj(p+.5u*(-1, 1, -1))
+ --proj(p+.5u*(-1, 1, 1))--proj(p+.5u*(1, 1, 1))--cycle,
+ p+.5u*(0, 1, 0), (0, 1, 0)); dy := true;
+ fi
+ if (y = 2) and (not dy_) and
+ (((z = 1) and ((x = 0) or (x = 2)))
+ or ((x = 1) and ((z = 0) or (z = 2)))):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(1, -1, -1))
+ --proj(p+.5u*(1, -1, 1))--proj(p+.5u*(-1, -1, 1))--cycle,
+ p+.5u*(0, -1, 0), (0, -1, 0)); dy_ := true;
+ fi
+ fi
+ fi
+ a := a+1;
+ endfor
+ if (Zpart p > .5-u) and (not dz):
+ Fill(proj(p+.5u*(-1, -1, 1))--proj(p+.5u*(1, -1, 1))
+ --proj(p+.5u*(1, 1, 1))--proj(p+.5u*(-1, 1, 1))--cycle,
+ p+.5u*(0, 0, 1), (0, 0, 1));
+ fi
+ if (Zpart p < -.5+u) and (not dz_):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(-1, 1, -1))
+ --proj(p+.5u*(1, 1, -1))--proj(p+.5u*(1, -1, -1))--cycle,
+ p+.5u*(0, 0, -1), (0, 0, -1));
+ fi
+ if (Xpart p > .5-u) and (not dx):
+ Fill(proj(p+.5u*(1, -1, -1))--proj(p+.5u*(1, 1, -1))
+ --proj(p+.5u*(1, 1, 1))--proj(p+.5u*(1, -1, 1))--cycle,
+ p+.5u*(1, 0, 0), (1, 0, 0));
+ fi
+ if (Xpart p < -.5+u) and (not dx_):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(-1, -1, 1))
+ --proj(p+.5u*(-1, 1, 1))--proj(p+.5u*(-1, 1, -1))--cycle,
+ p+.5u*(-1, 0, 0), (-1, 0, 0));
+ fi
+ if (Ypart p > .5-u) and (not dy):
+ Fill(proj(p+.5u*(1, 1, -1))--proj(p+.5u*(-1, 1, -1))
+ --proj(p+.5u*(-1, 1, 1))--proj(p+.5u*(1, 1, 1))--cycle,
+ p+.5u*(0, 1, 0), (0, 1, 0));
+ fi
+ if (Ypart p < -.5+u) and (not dy_):
+ Fill(proj(p+.5u*(-1, -1, -1))--proj(p+.5u*(1, -1, -1))
+ --proj(p+.5u*(1, -1, 1))--proj(p+.5u*(-1, -1, 1))--cycle,
+ p+.5u*(0, -1, 0), (0, -1, 0));
+ fi
+ fi
+enddef;
+recurse((0, 0, 0), 1, 0)(0);
+endObject;
+
+% to be improved
+% maximum is recursion_level := 5;
+
+Object sierpinski_gasket(expr level) =
+save SortedList;
+M1 = (0, 0, 1);
+M2 = 1/3*(sqrt 8, 0, -1);
+M3 = 1/3*((sqrt 8)*cosd 120, (sqrt 8)*sind 120, -1);
+M4 = 1/3*((sqrt 8)*cosd 240, (sqrt 8)*sind 240, -1);
+QuickSort(M1, M2, M3, M4);
+save recurse;
+def recurse(expr p, u, l) =
+ if l < level:
+ for $ = SortedList:
+ recurse(p+u*$, u/2, l+1);
+ endfor
+ else:
+ for $ = SortedList:
+ Fill(proj(p+u*($+M1))--proj(p+u*($+M2))--proj(p+u*($+M3))--cycle,
+ p+u*($-M4), -Unitvector M4);
+ Fill(proj(p+u*($+M1))--proj(p+u*($+M3))--proj(p+u*($+M4))--cycle,
+ p+u*($-M2), -Unitvector M2);
+ Fill(proj(p+u*($+M1))--proj(p+u*($+M4))--proj(p+u*($+M2))--cycle,
+ p+u*($-M3), -Unitvector M3);
+ Fill(proj(p+u*($+M4))--proj(p+u*($+M3))--proj(p+u*($+M2))--cycle,
+ p+u*($-M1), -Unitvector M1);
+ endfor
+ fi
+enddef;
+recurse(Origin, 0.5, 1);
+endObject;
+
+endinput.
+
+%
+% Cube
+%
+% parameters: none
+%
+% sub-objects: none
+
+Object cube =
+Fill(proj(1, -1, 1)--proj(1, 1, 1)--proj(-1, 1, 1)--proj(-1, -1, 1)--cycle,
+ (0, 0, 1), (0, 0, 1));
+Fill(proj(1, -1, 1)--proj(1, -1, -1)--proj(1, 1, -1)--proj(1, 1, 1)--cycle,
+ (1, 0, 0), (1, 0, 0));
+Fill(proj(1, 1, 1)--proj(1, 1, -1)--proj(-1, 1, -1)--proj(-1, 1, 1)--cycle,
+ (0, 1, 0), (0, 1, 0));
+Fill(proj(-1, 1, 1)--proj(-1, 1, -1)--proj(-1, -1, -1)--proj(-1, -1, 1)--cycle,
+ (-1, 0, 0), (-1, 0, 0));
+Fill(proj(1, -1, 1)--proj(-1, -1, 1)--proj(-1, -1, -1)--proj(1, -1, -1)--cycle,
+ (0, -1, 0), (0, -1, 0));
+Fill(proj(1, 1, -1)--proj(1, -1, -1)--proj(-1, -1, -1)--proj(-1, 1, -1)--cycle,
+ (0, 0, -1), (0, 0, -1));
+endObject;
+
+Object sierpinski_sponge(expr level) =
+save SortedList;
+M1 = (-1, -1, -1); M2 = (0, -1, -1); M3 = (1, -1, -1); M4 = (1, 0, -1);
+M5 = (1, 1, -1); M6 = (0, 1, -1); M7 = (-1, 1, -1); M8 = (-1, 0, -1);
+M9 = (-1, -1, 0); M10 = (1, -1, 0); M11 = (1, 1, 0); M12 = (-1, 1, 0);
+M13 = (-1, -1, 1); M14 = (0, -1, 1); M15 = (1, -1, 1); M16 = (1, 0, 1);
+M17 = (1, 1, 1); M18 = (0, 1, 1); M19 = (-1, 1, 1); M20 = (-1, 0, 1);
+QuickSort(M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, %
+ M11, M12, M13, M14, M15, M16, M17, M18, M19, M20);
+save recurse;
+def recurse(expr p, u, l) =
+ if l < level:
+ for $ = SortedList:
+ recurse(p+u*$, u/3, l+1);
+ endfor
+ else:
+ for $ = SortedList:
+ Fill(proj(p+u*($+.5(1, -1, -1)))--proj(p+u*($+.5(1, 1, -1)))
+ --proj(p+u*($+.5(1, 1, 1)))--proj(p+u*($+.5(1, -1, 1)))--cycle,
+ p+u*($+.5(1, 0, 0)), (1, 0, 0));
+ Fill(proj(p+u*($+.5(1, 1, -1)))--proj(p+u*($+.5(-1, 1, -1)))
+ --proj(p+u*($+.5(-1, 1, 1)))--proj(p+u*($+.5(1, 1, 1)))--cycle,
+ p+u*($+.5(0, 1, 0)), (0, 1, 0));
+ Fill(proj(p+u*($+.5(-1, 1, -1)))--proj(p+u*($+.5(-1, -1, -1)))
+ --proj(p+u*($+.5(-1, -1, 1)))--proj(p+u*($+.5(-1, 1, 1)))--cycle,
+ p+u*($+.5(-1, 0, 0)), (-1, 0, 0));
+ Fill(proj(p+u*($+.5(-1, -1, -1)))--proj(p+u*($+.5(1, -1, -1)))
+ --proj(p+u*($+.5(1, -1, 1)))--proj(p+u*($+.5(-1, -1, 1)))--cycle,
+ p+u*($+.5(0, -1, 0)), (0, -1, 0));
+ Fill(proj(p+u*($+.5(1, -1, 1)))--proj(p+u*($+.5(1, 1, 1)))
+ --proj(p+u*($+.5(-1, 1, 1)))--proj(p+u*($+.5(-1, -1, 1)))--cycle,
+ p+u*($+.5(0, 0, 1)), (0, 0, 1));
+ Fill(proj(p+u*($+.5(1, -1, -1)))--proj(p+u*($+.5(-1, -1, -1)))
+ --proj(p+u*($+.5(-1, 1, -1)))--proj(p+u*($+.5(1, 1, -1)))--cycle,
+ p+u*($+.5(0, 0, -1)), (0, 0, -1));
+ endfor
+ fi
+enddef;
+recurse(Origin, 1/3, 1);
+endObject;
diff --git a/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dplain.mp b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dplain.mp
new file mode 100644
index 0000000000..d0a952a28b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dplain.mp
@@ -0,0 +1,1335 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dplain.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Licence? Feel-free-to-send-me-a-postcard
+%
+% Anthony Phan,
+%
+% D\'epartement de Math\'ematiques,
+% SP2MI, T\'el\'eport 2,
+% Boulevard Marie et Pierre Curie,
+% BP 30179,
+% F-86962 Futuroscope-Chasseneuil cedex.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FOREWORD
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This file is the core of the m3D distribution.
+% It provides elementary control sequences for drawing
+% 3 dimensional objects. Some simple objects are defined
+% in this file, but many others can be found in auxiliary
+% files named m3DlibXX.mp. Those files may be helpful for
+% understanding programming conventions. Samples and
+% a documentation text (m3Dmanual) are also provided.
+%
+% CONTENTS
+%
+% SECTION 0. Parameters and reserved variables
+% SECTION 1. Macros for animation (remembrance of Denis Roegel's macros)
+% SECTION 2. Plain.mp's extension for 3D drawing
+% SECTION 3. A library of basic objects
+% (cube, sphere, revolution, plotThreeD, SpheresLink, rope)
+%
+
+if known mthreeDplain: endinput; fi
+message "m3D now!";
+message "";
+mthreeDplain:=1;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 0. PARAMETERS AND RESERVED VARIABLES
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+newinternal ObsZ, CurrentScale, Contrast, Luminosity,
+Specularity, Phong, Alpha, Resolution, Fog, FogHalf, FogZ;
+color Origin, LightSource, Oo, Ox, Oy, Oz, Ox_, Oy_, Oz_, PenColor,
+ObjectColor, M_, M__;
+% color ObjectAngles; ObjectAngles = (0, 0, 0);
+picture AlphaPict;
+boolean LightAtInfinity, fineplot;
+path ObjectPath;
+
+% For syntax only
+Origin = (0, 0, 0);
+
+% Scale change with respect to every object relative scale.
+CurrentScale := 1;
+
+%
+% Visual settings
+%
+
+% At this level, coordinates refer to the screen
+% (or the piece of paper): x, y are the usual planar
+% coordinates and z is orthogonal to them and has
+% for direction the observer.
+
+% ObsZ is distance of the observer to the ``Origin''
+% say to the screen or the piece of paper
+ObsZ := 10cm;
+% Oo is the origin of the current object with respect
+% to the screen coordinates.
+Oo := (0, 0, 0);
+% initial frame with respect to the screen coordinates
+Ox := (-sqrt(1/2), -sqrt(1/6), sqrt(1/3));
+Oy := (sqrt(1/2), -sqrt(1/6), sqrt(1/3));
+Oz := (0, sqrt(2/3), sqrt(1/3));
+% The light source can be at infinity or not.
+LightAtInfinity := true;
+% vector to THE light source
+LightSource := (0, 1, 1);
+
+%
+% Texture parameters
+%
+
+% Usual contrast parameter
+Contrast := 0.75;
+% Usual luminosity parameter
+Luminosity := 1;
+% Usual specularity parameter (maximum fraction
+% of incident light which can be reflected)
+Specularity := 0.5;
+% Phong is a diffusion exponent for relected light.
+Phong := 3;
+% Alpha is the transparency parameter.
+Alpha := 0.5;
+% See the object ``sphere'' for a use of this parameter.
+Resolution := 2mm;
+% Fog is applied if and only if Fog > 0.
+Fog := 0;
+% FogHalf is like half-life in exponential decay.
+FogHalf := 10cm;
+% FogZ is the z-coordinate (relative to the screen)
+% below which fog can be applied (see below).
+FogZ := 0;
+
+%
+% Other settings
+%
+
+ObjectColor := red;
+
+PenColor := black;
+pen thin.nib, rule.nib, thick.nib;
+
+def SetPens(expr $, $$, $$$) =
+ thin.nib := pencircle scaled $;
+ rule.nib := pencircle scaled $$;
+ thick.nib := pencircle scaled $$$;
+enddef;
+
+SetPens(0.2pt, 0.4pt, 0.8pt);
+
+% parameter of the object ``plotThreeD''
+fineplot := false;
+
+%
+% rather practical (see OnDepth)
+%
+
+vardef romannumeral primary x =
+ save _s_, _x_; string _s_; _s_ := ""; _x_ := x;
+ forever: exitif _x_ < 1000; _s_ := _s_&"m"; _x_ := _x_-1000; endfor
+ if _x_ >= 900: _s_ := _s_&"cm"; _x_ := _x_-900;
+ elseif _x_ >= 500: _s_ := _s_&"d"; _x_ := _x_-500;
+ elseif _x_ >= 400: _s_ := _s_&"cd"; _x_ := _x_-400;
+ fi
+ forever: exitif _x_ < 100; _s_ := _s_&"c"; _x_ := _x_-100; endfor
+ if _x_ >= 90: _s_ := _s_&"xc"; _x_ := _x_-90;
+ elseif _x_ >= 50: _s_ := _s_&"l"; _x_ := _x_-50;
+ elseif _x_ >= 40: _s_ := _s_&"xl"; _x_ := _x_-40;
+ fi
+ forever: exitif _x_ < 10; _s_ := _s_&"x"; _x_ := _x_-10; endfor
+ if _x_ >= 9: _s_ := _s_&"ix"; _x_ := _x_-9;
+ elseif _x_ >= 5: _s_ := _s_&"v"; _x_ := _x_-5;
+ elseif _x_ >= 4: _s_ := _s_&"iv"; _x_ := _x_-4;
+ fi
+ forever: exitif _x_ < 1; _s_ := _s_&"i"; _x_ := _x_-1; endfor
+ _s_
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 1. Macros for animation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% remembrance of 3D macros (Denis Roegel)
+%
+% Unix oriented, uses ``sed'' and ``convert'' (ImageMagick)
+
+string AnimateScript; AnimateScript:="animate-script";
+AnimateDelay:=5;% time between every images
+AnimateQuality:=2;% 1, 2, ...
+AnimateLoop:=0;% Netscape gif parameter
+
+numeric xmin_, ymin_, xmax_, ymax_;
+
+extra_endfig := extra_endfig &"; compute_bbox;";
+
+def compute_bbox =
+ if known xmin_:
+ xmin_ := min(xmin_, xpart(llcorner(currentpicture)));
+ ymin_ := min(ymin_, ypart(llcorner(currentpicture)));
+ xmax_ := max(xmax_, xpart(urcorner(currentpicture)));
+ ymax_ := max(ymax_, ypart(urcorner(currentpicture)));
+ else:
+ xmin_ = xpart(llcorner(currentpicture));
+ ymin_ = ypart(llcorner(currentpicture));
+ xmax_ = xpart(urcorner(currentpicture));
+ ymax_ = ypart(urcorner(currentpicture));
+ fi;
+enddef;
+
+vardef Animate(expr border, transparency)=
+ save s; string s;
+ write "#! /bin/bash" to AnimateScript;
+ write "" to AnimateScript;
+ write ("/bin/rm -f " & jobname & ".log") to AnimateScript;
+ write ("echo Resizing " & jobname & " figures, ...") to AnimateScript;
+ write ("for epsfig in `ls " & jobname & ".*| grep '" & jobname
+ & ".[0-9]'`;do") to AnimateScript;
+ if false: "endfor" fi % indentation hack for meta-mode.el
+ write ("sed " & ditto
+ & "s/%%BoundingBox:.*$/%%BoundingBox: "
+ & decimal ceiling (xmin_-border)& " "
+ & decimal ceiling (ymin_-border)& " "
+ & decimal floor(xmax_+border) & " "
+ & decimal floor (ymax_+2border)
+ & "/1"
+ & ditto
+ & " $epsfig > $epsfig.eps") to AnimateScript;
+ write "done" to AnimateScript;
+ write ("echo merging " & jobname & " figures, ...") to AnimateScript;
+ write ("convert -density " & decimal round(72*AnimateQuality) & " "
+ & "-geometry " & decimal round(100/AnimateQuality) & "% "
+ & "-loop " & decimal round AnimateLoop & " "
+ & "-delay " & decimal AnimateDelay & " "
+ if color transparency:
+ & "-transparent rgbi:"
+ & decimal(redpart transparency) & "/"
+ & decimal(greenpart transparency) & "/"
+ & decimal(bluepart transparency) & " "
+ elseif boolean transparency:
+ if transparency:
+ & "-transparent rgbi:"
+ & decimal(redpart background) & "/"
+ & decimal(greenpart background) & "/"
+ & decimal(bluepart background) & " "
+ fi
+ fi
+ & jobname & ".*.eps "
+ & jobname & ".gif") to AnimateScript;
+ write ("/bin/rm -f " & jobname & ".*.eps") to AnimateScript;
+ write ("echo Done with " & jobname & ".gif.") to AnimateScript;
+ write EOF to AnimateScript;
+ numeric xmin_, ymin_, xmax_, ymax_;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 2. Plain.mp's extension for 3D drawing
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%
+% SUBSECTION 2.0. Projection system
+%
+
+% These control sequences should allow to switch between
+% usual plain MetaPost mode and m3Dplain's one. When working
+% with other input files, one may have to customize these
+% control sequences.
+
+def threeDmode =
+ save M, m, clearxy;
+ % ``M'' plays a similar role to ``z'' in plain MetaPost.
+ % One must notice that ``z'' has here the same role as
+ % ``x'' and ``y''.
+ vardef M@# = (x@#, y@#, z@#) enddef;
+ % quite practical but beware not to use ``m''
+ % simultaneously as this macro and, say, as an
+ % integer parameter.
+ vardef m@# = proj(M@#) enddef;
+ def clearxy = save x, y, z enddef;
+ clearxy;
+% tertiarydef a -- b= if color a: proj(a) else: a fi
+% {curl 1}..{curl 1} if color b: proj(b) else: b fi enddef;
+% tertiarydef a --- b = if color a: proj(a) else: a fi
+% .. tension infinity .. if color b: proj(b) else: b fi enddef;
+% tertiarydef a ... b = if color a: proj(a) else: a fi
+% .. tension atleast 1 .. if color b: proj(b) else: b fi enddef;
+enddef;
+
+def twoDmode =
+ save M, m;
+ vardef z@# = (x@#, y@#) enddef;
+ def clearxy = save x, y enddef;
+ clearxy;
+% def -- = {curl 1}..{curl 1} enddef;
+% def --- = .. tension infinity .. enddef;
+% def ... = .. tension atleast 1 .. enddef;
+enddef;
+
+let Xpart = redpart;
+let Ypart = greenpart;
+let Zpart = bluepart;
+
+vardef SetM@# expr $ = x@#:=Xpart($); y@#:=Ypart($); z@#:=Zpart($) enddef;
+
+% quite practical
+% def unpair expr p = xpart p, ypart p enddef;
+
+% translate relative coordinates to screen coordinates
+vardef GCoord primary p=
+ (CurrentScale*(Xpart p*Ox+Ypart p*Oy+Zpart p*Oz)+Oo)
+enddef;
+
+% translate relative direction to screen direction
+vardef GDir primary p= (Xpart p*Ox+Ypart p*Oy+Zpart p*Oz)
+enddef;
+
+% Depth with respect to the screen
+vardef Depth primary p = -Zpart(GCoord p) enddef;
+
+% Various projection systems: linear, planar, spherical.
+def ProjectionSystem(suffix name) =
+ scantokens("ProjectionSystem_"&str name);
+enddef;
+
+def ProjectionSystem_linear =
+ vardef proj primary p =
+ (Xpart(GCoord p), Ypart(GCoord p))
+ enddef;
+enddef;
+
+def ProjectionSystem_planar =
+ vardef proj primary p =
+ ObsZ/(ObsZ-Zpart(GCoord p))
+ *(Xpart(GCoord p), Ypart(GCoord p))
+ enddef;
+enddef;
+
+def ProjectionSystem_spherical =
+ vardef proj primary p =
+ abs(ObsZ)/Norm(GCoord p-(0, 0, ObsZ))
+ *(Xpart GCoord p, Ypart GCoord p)
+ enddef;
+enddef;
+
+ProjectionSystem(linear);
+
+%
+% SUBSECTION 2.1. Vector calculus
+%
+
+primarydef u Dotprod v =
+ (Xpart u * Xpart v + Ypart u * Ypart v + Zpart u * Zpart v)
+enddef;
+
+primarydef u Vectprod v =
+ (Ypart u * Zpart v - Zpart u * Ypart v,
+ Zpart u * Xpart v - Xpart u * Zpart v,
+ Xpart u * Ypart v - Ypart u * Xpart v)
+enddef;
+
+def Mixtprod(expr u, v, w) =
+ (Xpart u)*((Ypart v)*(Zpart w)-(Zpart v)*(Ypart w))
+ -(Ypart u)*((Xpart v)*(Zpart w)-(Zpart v)*(Xpart w))
+ +(Zpart u)*((Xpart v)*(Ypart w)-(Ypart v)*(Xpart w))
+enddef;
+
+% The following seems to be the best solution for
+% computing a vector's norm. Direct computations
+% with squares and square roots would frequently
+% lead to overflow errors.
+
+vardef Norm primary z =
+ abs (abs(Xpart z, Ypart z), Zpart z)
+enddef;
+
+vardef Unitvector primary z = z/Norm z enddef;
+
+% it seems to work
+vardef Projection(expr u, v, w, d, p) =
+ save x_, y_, z_;
+ Mixtprod((x_, y_, z_)-u, v-u, w-u) = 0;
+ (x_, y_, z_)-p = whatever*d;
+ (x_, y_, z_)
+enddef;
+
+% not tested
+def Reflection(expr u, v, w, d, p) =
+ 2*Projection(u, v, w, d, p)-p
+enddef;
+
+%
+% SUBSECTION 2.2. Rotations and frames
+%
+% Notes (October 6, 2001):
+% In order to allow unscaled material (text)
+% within objects, coordinates vectors are no
+% longer scaled. That means that one should
+% not use them directly in most cases. The
+% internal variable CurrentScale does the
+% scaling via ``m'' and ``proj'' control
+% sequences.
+
+def Xrotate(expr $, $$, $$$) =
+ cphi*ctheta*$ + cphi*stheta*$$ + sphi*$$$
+enddef;
+
+def Yrotate(expr $, $$, $$$) =
+ -(cpsi*stheta+spsi*sphi*ctheta)*$
+ +(cpsi*ctheta-spsi*sphi*stheta)*$$
+ +spsi*cphi*$$$
+enddef;
+
+def Zrotate(expr $, $$, $$$) =
+ (spsi*stheta-cpsi*sphi*ctheta)*$
+ -(spsi*ctheta+cpsi*sphi*stheta)*$$
+ +cpsi*cphi*$$$
+enddef;
+
+def Rotate(expr $, $$, $$$) =
+ (Xrotate($, $$, $$$), Yrotate($, $$, $$$), Zrotate($, $$, $$$))
+enddef;
+
+% The text `t' is any non empty argument. Its reason to be
+% lies in the tricky `Object' behavior.
+
+def Euler(expr theta, phi, psi, ObjectUnit) =
+ Euler_(theta,phi,psi,ObjectUnit,whatever);
+enddef;
+
+def Euler_(expr theta, phi, psi, ObjectUnit)(text t) =
+ Ox_ := Ox; Oy_ := Oy; Oz_ := Oz;
+ save Ox, Oy, Oz, ctheta, stheta, cphi, sphi, cpsi, spsi;
+ color Ox, Oy, Oz;
+ ctheta = cosd theta; stheta = sind theta;
+ cphi = cosd phi; sphi = sind phi;
+ cpsi = cosd psi; spsi = sind psi;
+ interim CurrentScale := ObjectUnit*CurrentScale;
+ Ox = Xrotate(Ox_, Oy_, Oz_);
+ Oy = Yrotate(Ox_, Oy_, Oz_);
+ Oz = Zrotate(Ox_, Oy_, Oz_);
+enddef;
+
+vardef Angle(expr p) =
+ if (Xpart p++Ypart p) < eps: 0, 90 else:
+ angle(Xpart p, Ypart p), angle(Xpart p++Ypart p, Zpart p)
+ fi
+enddef;
+
+def Dir(expr a, b) =
+ (cosd(a)*cosd(b), sind(a)*cosd(b), sind(b))
+enddef;
+
+%
+% SUBSECTION 2.3. Sorting objects with respect to their depth
+%
+
+% Usually, one may just sort points in space.
+
+def SortCriterion(expr $, $$) =
+ Depth $ < Depth $$
+enddef;
+
+% Then arguments of QuickSort is just a list of points
+
+vardef QuickSort(expr pivot)(text remainder) =
+ save MaxList, MinList, MaxCard, MinCard; MaxCard = MinCard = 0;
+ for $ = remainder:
+ if SortCriterion(pivot, $):
+ if MaxCard > 0: expandafter def expandafter MaxList expandafter =
+ MaxList, $ enddef; else: def MaxList = $ enddef; fi
+ MaxCard := MaxCard+1;
+ else:
+ if MinCard > 0: expandafter def expandafter MinList expandafter =
+ MinList, $ enddef; else: def MinList = $ enddef; fi
+ MinCard := MinCard+1;
+ fi
+ endfor
+ if MaxCard > 1: QuickSort(MaxList); let MaxList = SortedList; fi
+ if MinCard > 1: QuickSort(MinList); let MinList = SortedList; fi
+ if MaxCard > 0: expandafter def expandafter SortedList expandafter =
+ MaxList, pivot enddef;
+ else: def SortedList = pivot enddef; fi
+ if MinCard > 0: expandafter def expandafter SortedList expandafter =
+ SortedList, enddef;
+ expandafter expandafter expandafter def
+ expandafter expandafter expandafter SortedList
+ expandafter expandafter expandafter =
+ expandafter SortedList MinList enddef; fi
+enddef;
+
+% Syntax:
+%
+% OnDepth;
+% Refpoint <triple>;
+% Action <text>;
+% ...
+% endOnDepth;
+%
+% <text> may be surrounded by begingroup ... endgroup.
+
+% FORGET IT!
+%def SaveOnDepth =
+% save OnDepth;
+% def OnDepth = begingroup save endOnDepth;
+% def endOnDepth = endgroup enddef;
+% enddef;
+%enddef;
+
+def OnDepth =
+ begingroup
+ save Action_, Action_counter, _x_, _y_, _z_;
+ Action_counter = 0;
+ enddef;
+
+ def Refpoint expr p =
+ Action_counter := Action_counter+1;
+ _x_[Action_counter] = Xpart p;
+ _y_[Action_counter] = Ypart p;
+ _z_[Action_counter] = Zpart p;
+ enddef;
+
+ def Action(text t) =
+ scantokens("vardef Action_." & romannumeral Action_counter & "=")
+ t; quote enddef;
+ enddef;
+
+ def endOnDepth =
+ if Action_counter > 1:
+ save SortCriterion, SortedList;
+ def SortCriterion(expr $, $$) =
+ Depth (_x_[$], _y_[$], _z_[$])
+ < Depth (_x_[$$], _y_[$$], _z_[$$])
+ enddef;
+ QuickSort(1, 2 upto Action_counter);
+ for $ = SortedList:
+ scantokens("Action_." & romannumeral $);
+ endfor
+ elseif Action_counter = 1: Action_.i; fi
+ endgroup;
+enddef;
+
+%
+% SUBSECTION 2.4. Object oriented macros
+%
+
+% About the use of ``quote'' in the next macro,
+% see METAFONTbook, p. 166 and p. 277.
+% Groups around object's replacement text
+% is ensured by the ``UseObject'' macro.
+%
+% Objects can have parameters just as normal definitions.
+% Since they are accessible thru the control sequence
+% UseObject(ObjectName, ObjectOrigin, ObjectAngles, ObjectScale...),
+% ObjectScale... is a text parameter t. The parameter ObjectScale
+% itself is passed to the Object via `INACCESSIBLE' symbolic token.
+
+def Object suffix ObjectName =
+ expandafter quote def
+ scantokens("Object_"&str ObjectName)(expr INACCESSIBLE)
+ enddef;
+
+ let endObject = enddef;
+
+def SubObject expr $ =
+ if (SubObjectNumber = $) or (SubObjectNumber = 0)
+ enddef;
+
+ let endSubObject = fi;
+
+% Beware of the ObjectUnit parameter.
+% Metric units should be used only at
+% the top level (multiple scaling).
+%
+% Syntax:
+% UseObject(<ObjectName>, <ObjectOrigin>, <ObjectAngles>, <ObjectUnit>
+% [, <ObjectParameters>])
+% text t = <ObjectUnit>[, ObjectParameters]
+% It may look like a tricky thing. Well...
+
+def UseObject(suffix ObjectName)
+ (expr ObjectOrigin, ObjectAngles)(text t) =
+ Oo := Oo+CurrentScale*(Xpart ObjectOrigin*Ox+Ypart ObjectOrigin*Oy
+ +Zpart ObjectOrigin*Oz);
+ begingroup
+ Euler_(Xpart ObjectAngles, Ypart ObjectAngles, Zpart ObjectAngles, t, 0);
+ save SubObjectNumber; clearxy;
+ if known SubObjectNumber_: SubObjectNumber = SubObjectNumber_;
+ save SubObjectNumber_; else: SubObjectNumber := 0; fi
+ scantokens("Object_"&str ObjectName)(t);
+ endgroup;
+ Oo := Oo-CurrentScale*(Xpart ObjectOrigin*Ox+Ypart ObjectOrigin*Oy
+ +Zpart ObjectOrigin*Oz);
+enddef;
+
+vardef UseSubObject@#(suffix ObjectName)
+ (expr ObjectOrigin, ObjectAngles)(text t) =
+ save SubObjectNumber_; SubObjectNumber_ := scantokens(str @#);
+ UseObject(ObjectName, ObjectOrigin, ObjectAngles, t)
+enddef;
+
+%
+% SUBSECTION 2.5. Drawing commands
+%
+
+def Outside = let Orientation = turningnumber; Outside_ := 1 enddef;
+def Inside = def Orientation = -turningnumber enddef; Outside_ := -1 enddef;
+
+Outside;
+
+vardef Light(expr p, d, c) =
+ M_ := if LightAtInfinity: Unitvector LightSource
+ else: Unitvector (LightSource-GCoord p)
+ fi;
+ if Fog > 0:
+ (mexp(-256max(0,
+ (if Fog < 2: FogZ+Depth p
+ else: Norm((0, 0, ObsZ)-GCoord p)+FogZ-ObsZ fi)
+ /FogHalf)))[background,
+ fi
+ Luminosity*(0.5*(1+(Outside_*GDir d Dotprod M_))
+ [1-Contrast, 1])*c
+ if Specularity > 0:
+ +Specularity*((max(0, (2(M_ Dotprod GDir d)
+ *GDir d-M_)
+ Dotprod Unitvector((0, 0, ObsZ)-GCoord p)))**Phong)*background
+ fi
+ if Fog>0: ] fi
+enddef;
+
+def SolidFill(expr c, p, n) =
+ if Orientation(c) >= 0:
+ fill c withcolor Light(p, n, ObjectColor)
+ fi
+enddef;
+
+def TechnoFill(expr c, p, n) =
+ addto currentpicture doublepath c withpen
+ if Orientation(c) >= 0: rule.nib
+ else: thin.nib dashed evenly fi
+ withcolor PenColor
+enddef;
+
+def WireFill(expr c, p, n) =
+ if Orientation(c) >= 0:
+ unfill c;
+ addto currentpicture doublepath c
+ withpen rule.nib withcolor PenColor
+ fi
+enddef;
+
+def SolidWireFill(expr c, p, n) =
+ if Orientation(c) >= 0:
+ fill c withcolor Light(p, n, ObjectColor);
+ addto currentpicture doublepath c
+ withpen currentpen withcolor Light(p, n, PenColor)
+ fi
+enddef;
+
+% too heavy to work properly.
+
+def AlphaFill(expr c, p, n)=
+ AlphaPict := nullpicture;
+ if Orientation c >= 0:
+ AlphaPicture(currentpicture, c, Light(p, n, ObjectColor));
+ else:
+ AlphaPicture(currentpicture, c, Light(p, -n, ObjectColor));
+ fi
+ addto currentpicture also AlphaPict;
+enddef;
+
+vardef AlphaPicture(expr p, c, Color) =
+ save p_, xmax_, xmin_, ymax_, ymin_; picture p_;
+ p_ = nullpicture;
+ (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c;
+ addto p_ contour c withcolor Alpha[background, Color];
+ for p__ within p:
+ numeric xmin__, xmax__, ymin__, ymax__;
+ (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__;
+ if (xmax__ <= xmin_) or (xmin__ >= xmax_):
+ else:
+ if (ymax__ <= ymin_) or (ymin__ >= ymax_):
+ else:
+ if (not clipped p__) and (not bounded p__):
+ addto p_ also p__ withcolor
+ Alpha[(redpart p__, greenpart p__, bluepart p__), Color];
+ else:
+ begingroup save AlphaPict;
+ picture AlphaPict; AlphaPict = nullpicture;
+ AlphaPicture(p__, pathpart p__, Color);
+ addto p_ also AlphaPict;
+ endgroup;
+ fi
+ fi
+ fi
+ endfor
+ clip p_ to c;
+ addto AlphaPict also p_;
+enddef;
+
+let Fill = SolidFill;
+
+%
+% Attempt to write directly the eps file
+% Beware: the %%BoundingBox: values are delayed at the end of the file.
+% One could edit the output to put this line at the second place
+% in the file.
+%
+
+def DirectSetup =
+ save xmax_, xmin_, ymax_, ymin_, cp, flag, Fill, filename;
+ let Fill=DirectFill; string filename; boolean flag; flag=false;
+ vardef cp(expr c, t) =
+ if flag:
+ xmax_:=max(xpart point t of c, xmax_);
+ xmin_:=min(xpart point t of c, xmin_);
+ ymax_:=max(ypart point t of c, ymax_);
+ ymin_:=min(ypart point t of c, ymin_);
+ else:
+ xmax_:=xmin_:=xpart point t of c;
+ ymax_:=ymin_:=ypart point t of c;
+ flag:=true;
+ fi
+ decimal xpart point t of c & " " & decimal ypart point t of c
+ enddef;
+enddef;
+
+def DirectEPS expr file =
+ begingroup
+ DirectSetup; filename=file;
+ write "%!PS-Adobe-3.0 EPSF-3.0" to filename;
+ write "%%BoundingBox: (atend)" to filename;
+ write "%%Creator: m3D" to filename;
+ write ("%%CreationDate: "
+ & decimal year & ":" & decimal month & ":"
+ & decimal day & ":" & decimal time) to filename;
+ write "%%Pages: 1" to filename;
+ write "%%EndProlog" to filename;
+ write "%%Page: 1 1" to filename;
+ write "/f {closepath fill} bind def" to filename;
+ write "/l {lineto} bind def" to filename;
+ write "/m {moveto} bind def" to filename;
+ write "/RG {setrgbcolor newpath} bind def" to filename;
+ write "/G {setgray newpath} bind def" to filename;
+ if false: "enddef enddef enddef enddef enddef" fi
+ enddef;
+
+ def endDirectEPS =
+% write "showpage" to filename;
+ write "%%Trailer" to filename;
+ write ("%%BoundingBox: "
+ & decimal floor xmin_ & " "
+ & decimal floor ymin_ & " "
+ & decimal ceiling xmax_ & " "
+ & decimal ceiling ymax_) to filename;
+ write "%%EOF" to filename;
+ write EOF to filename;
+ endgroup;
+enddef;
+
+def DirectFill(expr c, p, n) =
+ if Orientation(c) >= 0:
+ M_:=Light(p, n, ObjectColor);
+ write (
+ if (Xpart M_=Ypart M_) and (Ypart M_=Zpart M_):
+ decimal (Xpart M_) & " G "
+ else:
+ decimal (Xpart M_)
+ &" "& decimal (Ypart M_)
+ &" "& decimal (Zpart M_)
+ & " RG "
+ fi
+ & cp(c,0) & " m "
+ for $=1 upto length c-1:
+ & cp(c, $) & " l "
+ endfor
+ & "f") to filename;
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SECTION 3. A library of basic objects
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SUBSECTION 3.1. Cube
+%
+% parameters: none
+%
+% sub-objects: none
+%
+
+Object cube =
+M1 = (-0.5, -0.5, -0.5); M2 = (0.5, -0.5, -0.5);
+M3 = (0.5, 0.5, -0.5); M4 = (-0.5, 0.5, -0.5);
+M5 = (-0.5, -0.5, 0.5); M6 = (0.5, -0.5, 0.5);
+M7 = (0.5, 0.5, 0.5); M8 = (-0.5, 0.5, 0.5);
+OnDepth;
+Refpoint 0.5[M1, M3];
+Action (Fill(m1--m4--m3--m2--cycle, 0.5[M1, M3], (0, 0, -1)));
+Refpoint 0.5[M5, M7];
+Action (Fill(m5--m6--m7--m8--cycle, 0.5[M5, M7], (0, 0, 1)));
+Refpoint 0.5[M1, M6];
+Action (Fill(m1--m2--m6--m5--cycle, 0.5[M1, M6], (0, -1, 0)));
+Refpoint 0.5[M3, M8];
+Action (Fill(m3--m4--m8--m7--cycle, 0.5[M3, M8], (0, 1, 0)));
+Refpoint 0.5[M2, M7];
+Action (Fill(m2--m3--m7--m6--cycle, 0.5[M2, M7], (1, 0, 0)));
+Refpoint 0.5[M1, M8];
+Action (Fill(m1--m5--m8--m4--cycle, 0.5[M1, M8], (-1, 0, 0)));
+endOnDepth;
+endObject;
+
+%
+% SUBSECTION 3.2. Sphere
+%
+% parameters: none
+%
+% sub-objects: 1 (lower part), 2 (upper part)
+
+def MetaSphere(expr rx, ry, rz, tmin, tmax, pmin, pmax) =
+ save na, nb, t_, t__, p_, p__;
+ p_ = max(-90+eps, min(pmin, pmax));
+ p__ = min(90-eps, max(pmin, pmax));
+ t_ = min(tmin, tmax);
+ t__ = max(tmin, tmax);
+ na=ceiling(3.14159*((p__-p_)/180)
+ *sqrt(rx*ry)*rz*(CurrentScale/Resolution));
+ nb=ceiling(3.14159*((t__-t_)/180)
+ *rx*ry*(CurrentScale/Resolution));
+ for $ = 0 upto na-1:
+ phi :=($/na)[p_, p__]; % for special effects
+ x := cosd phi;
+ y := cosd((($+1)/na)[p_, p__]);
+ z5 := sind((($+.5)/na)[p_, p__])/rz/rz;
+ z0 := cosd((($+.5)/na)[p_, p__]);
+ x2 := rx*x*cosd t_; y2 := ry*x*sind t_;
+ x3 := rx*y; y3 := 0;
+ z1 := z2 := rz*sind phi;
+ z3 := z4 := rz*sind((($+1)/na)[p_, p__]);
+ for @ = 1 upto nb:
+ theta := (@/nb)[t_, t__]; % for special effects
+ x1 := x2; y1 := y2; x4 := x3; y4 := y3;
+ z := cosd theta; x2 := rx*x*z; x3 := rx*y*z;
+ z := sind theta; y2 := ry*x*z; y3 := ry*y*z;
+ x5 := rz*z0*cosd(((@+.5)/nb)[t_, t__])/rx/rx;
+ y5 := rz*z0*sind(((@+.5)/nb)[t_, t__])/ry/ry;
+ Fill (m1--m2--m3--m4--cycle, (M1+M2+M3+M4)/4,
+ Unitvector(x5, y5, z5));
+ endfor endfor
+enddef;
+
+Object sphere =
+MetaSphere(1,1,1,0,360,-90,90);
+endObject;
+
+%
+% SUBSECTION 3.2. Revolution (now!)
+%
+% parameter: planar path p
+%
+% sub-objects: none
+%
+% description: the solid of revolution as we
+% say in a frenchy english is obtained by drawing
+% around the axis z'Oz a planar path p(t) = (x(t), z(t))
+% x(t) should remain >= eps. By the way, it is not
+% supposed to work with very complex designs. One
+% should then decompose such path...
+
+Object revolution(expr p) =
+save a, na, nz;
+%
+% maximum distance to the axis
+%
+z = length p; x = 0;
+for $=0 upto 4*z:
+ % mean distance x := x*($/($+1))+xpart(point $/4*z of p)/($+1);
+ x := max(x, xpart(point $/4*z of p));
+endfor
+%
+% how half many steps for revolution
+%
+na = ceiling(3.14159*(CurrentScale/Resolution)*x);
+%
+% looking for the deepest angle
+%
+a := 0; x := Depth(1, 0, 0);
+for $ = 1 upto 2na:
+ x' := Depth(cosd($/na*180), sind($/na*180), 0);
+ if x' > x: x := x'; a := $; fi
+endfor
+%
+% Let's go
+%
+for n = 0 upto na-1:
+ for t = 0 upto length p-1:
+ x := xpart(point t of p); z := ypart(point t of p);
+ nz := ceiling((arclength subpath (t, t+1) of p)*(CurrentScale/Resolution));
+ for k = 1 upto nz:
+ x' := xpart(point t+k/nz of p); z' := ypart(point t+k/nz of p);
+ %
+ Fill(proj(x*cosd((n+a)/na*180), x*sind((n+a)/na*180), z)
+ --proj(x'*cosd((n+a)/na*180), x'*sind((n+a)/na*180), z')
+ --proj(x'*cosd((n+a+1)/na*180),
+ x'*sind((n+a+1)/na*180), z')
+ --proj(x*cosd((n+a+1)/na*180),
+ x*sind((n+a+1)/na*180), z)
+ --cycle,
+ (0.5(x+x')*cosd((n+a+0.5)/na*180),
+ 0.5(x+x')*sind((n+a+0.5)/na*180), 0.5(z+z')),
+ Unitvector((z-z')*cosd((n+a+0.5)/na*180),
+ (z-z')*sind((n+a+0.5)/na*180), x'-x)
+ );
+ %
+ Fill(proj(x*cosd((-n+a)/na*180), x*sind((-n+a)/na*180), z)
+ --proj(x*cosd((-n+a-1)/na*180),
+ x*sind((-n+a-1)/na*180), z)
+ --proj(x'*cosd((-n+a-1)/na*180),
+ x'*sind((-n+a-1)/na*180), z')
+ --proj(x'*cosd((-n+a)/na*180), x'*sind((-n+a)/na*180), z')
+ --cycle,
+ (0.5(x+x')*cosd((-n+a-0.5)/na*180),
+ 0.5(x+x')*sind((-n+a-0.5)/na*180), 0.5(z+z')),
+ Unitvector((z-z')*cosd((-n+a-0.5)/na*180),
+ (z-z')*sind((-n+a-0.5)/na*180), x'-x)
+ );
+ x := x'; z := z';
+ endfor
+ endfor
+endfor
+endObject;
+
+%
+% SUBSECTION 3.3. cylinderlike
+%
+% parameter: planar path p, numerical height
+%
+% sub-objects: border, top, bottom
+%
+% description: this object is some kind of cylinder
+% with height h (Oz-axis) and a basis which is a
+% planar (xOy-plane) path p
+
+Object cylinderlike(expr p, h) =
+save n, nz, tmppath; path tmppath;
+nz = ceiling(h*(CurrentScale/Resolution));
+SubObject1:
+OnDepth;
+for t = 0 upto length p-1:
+ Refpoint (xpart point t of p, ypart point t of p, 0);
+ Action (x := xpart point t of p; y := ypart point t of p;
+ n := ceiling((arclength subpath (t, t+1) of p)*(CurrentScale/Resolution));
+ for k = 1 upto n:
+ x' := xpart point t+k/n of p; y' := ypart point t+k/n of p;
+ %
+ for $ = 1 upto nz:
+ Fill(proj(x,y,($-1)/nz*h)--proj(x',y',($-1)/nz*h)
+ --proj(x',y',$/nz*h)--proj(x,y,$/nz*h)--cycle,
+ (0.5(x+x'), 0.5(y+y'),($-0.5)/nz*h), Unitvector(y'-y,x-x',0));
+ endfor
+ x := x'; y := y';
+ endfor);
+endfor
+endOnDepth;
+endSubObject;
+SubObject2:
+tmppath:=proj(xpart point 0 of p, ypart point 0 of p, h);
+x:=0; y:=0;
+for t = 0 upto length p-1:
+ x:=x+xpart point t of p; y:=y+ypart point t of p;
+ n := ceiling((arclength subpath (t, t+1) of p)*(CurrentScale/Resolution));
+ tmppath := tmppath for k = 1 upto n:
+ --proj(xpart point t+k/n of p, ypart point t+k/n of p, h) endfor;
+endfor
+x:=x/length p; y:=y/length p;
+tmppath := tmppath--cycle;
+Fill(tmppath, (x,y,h), (0,0,1));
+endSubObject;
+SubObject3:
+tmppath:=proj(xpart point 0 of p, ypart point 0 of p, 0);
+x:=0; y:=0;
+for t = 0 upto length p-1:
+ x:=x+xpart point t of p; y:=y+ypart point t of p;
+ n := ceiling((arclength subpath (t, t+1) of p)*(CurrentScale/Resolution));
+ tmppath := tmppath for k = 1 upto n:
+ --proj(xpart point t+k/n of p, ypart point t+k/n of p, 0) endfor;
+endfor
+x:=x/length p; y:=y/length p;
+tmppath := reverse tmppath--cycle;
+Fill(tmppath, (x,y,0), (0,0,-1));
+endSubObject;
+endObject;
+
+%
+% SUBSECTION 3.3. z = f(x, y)
+%
+% Example:
+%
+% beginfig(1);
+% UseObject(plotThreeD, Origin, (0, 0, 0), 0.15cm,
+% "cosd(abs(x, y)/3.1416*180)", -20, 20, -20, 20);
+% endfig;
+
+vardef plotThreeDFill(suffix $, $$, $$$) =
+ M_ := (M$+M$$+M$$$)/3;% average point
+ M__ := (M$$-M$)Vectprod(M$$$-M$);% normal vector
+ if Norm(M__)>eps: p_ := m$--m$$--m$$$--cycle;
+ if Orientation p_ >0: Fill(p_, M_, Unitvector M__);
+ else: Fill(p_, M_, -Unitvector M__); fi
+ fi
+enddef;
+
+Object plotThreeD(expr formula, xmin, xmax, ymin, ymax) =
+save a, f, nx, ny, p_; a = 0; path p_;
+scantokens("vardef f(expr x, y) ="& formula &" enddef;");
+M5 = (xmin, ymin, 0);
+M6 = (xmin, ymax, 0);
+M7 = (xmax, ymin, 0);
+M8 = (xmax, ymax, 0);
+OnDepth;
+Refpoint M5; Action (M[incr a] = M5);
+Refpoint M6; Action (M[incr a] = M6);
+Refpoint M7; Action (M[incr a] = M7);
+Refpoint M8; Action (M[incr a] = M8);
+endOnDepth;
+p_ := m1--m2--m4--m3--cycle;
+if Orientation p_ < 0: x5 := x2; y5 := y2; z5 := z2;
+ x2 := x3; y2 := y3; z2 := z3; x3 := x5; y3 := y5; z3 := z5; fi
+nx = ceiling((abs(x3-x1)+abs(y3-y1))*(CurrentScale/Resolution));
+ny = ceiling((abs(x2-x1)+abs(y2-y1))*(CurrentScale/Resolution));
+for i = 1 upto nx:
+ for j = 1 upto ny:
+ x5 := ((i-1)/nx)
+ [((j-1)/ny)[x1, x2], ((j-1)/ny)[x3, x4]];
+ x6 := ((i-1)/nx)
+ [(j/ny)[x1, x2], (j/ny)[x3, x4]];
+ x7 := (i/nx)
+ [((j-1)/ny)[x1, x2], ((j-1)/ny)[x3, x4]];
+ x8 := (i/nx)
+ [(j/ny)[x1, x2], (j/ny)[x3, x4]];
+ y5 := ((i-1)/nx)
+ [((j-1)/ny)[y1, y2], ((j-1)/ny)[y3, y4]];
+ y6 := ((i-1)/nx)
+ [(j/ny)[y1, y2], (j/ny)[y3, y4]];
+ y7 := (i/nx)
+ [((j-1)/ny)[y1, y2], ((j-1)/ny)[y3, y4]];
+ y8 := (i/nx)
+ [(j/ny)[y1, y2], (j/ny)[y3, y4]];
+ z5 := f(x5, y5); z6 := f(x6, y6); z7 := f(x7, y7); z8 := f(x8, y8);
+ if fineplot:
+ x0 := (x5+x8)/2; y0 := (y5+y8)/2; z0 := f(x0, y0);
+ plotThreeDFill(0, 5, 6);
+ plotThreeDFill(0, 6, 8);
+ plotThreeDFill(0, 8, 7);
+ plotThreeDFill(0, 7, 5);
+ else:
+ M_:=(M5+M6+M7+M8)/4;% average point
+ % some almost normal vector: a way to compute
+ % such a vector would have been an average over
+ % the four normal vectors associated to the average
+ % point and every consecutive edges; the properties
+ % of the vector product allow to replace the average
+ % point by any other one; here we have taken the Origin.
+ M__:=Unitvector((M5 Vectprod M6 )+(M6 Vectprod M8)
+ +(M8 Vectprod M7)+(M7 Vectprod M5));
+ if Orientation(m5--m6--m8--m7--cycle)>=0:
+ Fill(m5--m6--m8--m7--cycle, M_, M__)
+ else: Fill(m7--m8--m6--m5--cycle, M_, -M__) fi;
+ fi
+ endfor
+endfor
+endObject;
+
+%
+% SUBSECTION 3.4. SpheresLinks for (say) chemistry
+%
+% parameters: center of the first sphere (three coordinates),
+% center of the second sphere (three coordinates),
+% radius of the first sphere (real parameter),
+% radius of the second sphere (real parameter),
+% radius of the cylindrical link (real parameter).
+%
+% Beware! It is not an object which means that one
+% has to use it within an object or with care to
+% global coordinates.
+%
+% If one of the spheres' radius is less than the radius
+% of the link, the corresponding extremity will be the
+% center of that sphere.
+
+vardef SpheresLink(expr fcenter, scenter, fradius, sradius, radius) =
+ clearxy; save MM_, MM__; color MM_, MM__;
+ save na, nh; na=4ceiling(1.5708radius*(CurrentScale/Resolution));
+ if Norm((scenter-fcenter) Vectprod (1, 0, 0)) <eps:
+ M1 = Unitvector((scenter-fcenter) Vectprod (0, 1, 0));
+ else:
+ M1 = Unitvector((scenter-fcenter) Vectprod (1, 0, 0));
+ fi
+ M2 = Unitvector((scenter-fcenter) Vectprod M1);
+ M3 = fcenter if fradius > radius:
+ +(fradius+-+radius)*Unitvector(scenter-fcenter) fi;
+ M4 = scenter if sradius > radius:
+ +(sradius+-+radius)*Unitvector(fcenter-scenter) fi;
+ MM_ := radius*M1;
+ nh=ceiling(Norm(M3-M4)*(CurrentScale/Resolution));
+ for @ = 1 upto nh:
+ for $ = 1 upto na:
+ MM__ := radius*(cosd($/na*360)*M1+sind($/na*360)*M2);
+ Fill(proj(((@-1)/nh)[M3, M4]+MM_)
+ --proj(((@-1)/nh)[M3, M4]+MM__)--proj((@/nh)[M3, M4]+MM__)
+ --proj((@/nh)[M3, M4]+MM_)--cycle,
+ ((@-0.5)/nh)[M3, M4]+0.5[MM_, MM__],
+ cosd(($-0.5)/na*360)*M1+sind(($-0.5)/na*360)*M2);
+ MM_ := MM__;
+ endfor
+ endfor
+enddef;
+
+%
+% SUBSECTION 3.5. Rope
+%
+% parameters: x(t), y(t), z(t), r, tmin, tmax, fillstart, fillend
+%
+% formulae must be given as string with "t" as symbolic variable,
+% r, tmin, tmax are numerical parameters whose meanings are obvious,
+% fillstart and fillend are boolean whose meaning are also obvious.
+
+Object rope(expr xformula, yformula, zformula, r, tmin, tmax,
+ fillstart, fillend) =
+save h, fx, fy, fz, na, nh, dh;
+dh=if tmin > tmax: - fi tolerance;
+scantokens("vardef fx(expr t) ="& xformula &" enddef;");
+scantokens("vardef fy(expr t) ="& yformula &" enddef;");
+scantokens("vardef fz(expr t) ="& zformula &" enddef;");
+%
+% measure the total length or the arc
+%
+h = 0; M_ := (fx(tmin), fy(tmin), fz(tmin));
+nh := 100;
+for $=1 upto nh:
+ M__ := (fx(($/nh)[tmin, tmax]), fy(($/nh)[tmin, tmax]),
+ fz(($/nh)[tmin, tmax]));
+ h := h+Norm(M_-M__);
+ M_ := M__;
+endfor
+%
+% steps parameters
+%
+na=4ceiling(1.570796r*(CurrentScale/Resolution));
+nh := ceiling(h*(CurrentScale/Resolution));
+%
+% initial frame
+%
+x1 := fx(tmin); y1 := fy(tmin); z1 := fz(tmin);
+x'1 := fx(tmin+dh); y'1 := fy(tmin+dh); z'1 := fz(tmin+dh);
+x''1 := (fx(tmin+2dh)+x1-2x'1)/tolerance;
+y''1 := (fy(tmin+2dh)+y1-2y'1)/tolerance;
+z''1 := (fz(tmin+2dh)+z1-2z'1)/tolerance;
+SetM'1(Unitvector(M'1-M1));
+SetM''1(M''1-(M''1 Dotprod M'1)*M'1);
+if M''1=Origin: message "inflexion at time "&decimal(tmin);
+ %
+ % try to find a non vanishing normal acceleration
+ %
+ h := tmin+dh;
+ forever:
+ x''1 := (fx(h+2dh)+fx(h)-2fx(h+dh))/tolerance;
+ y''1 := (fy(h+2dh)+fy(h)-2fy(h+dh))/tolerance;
+ z''1 := (fz(h+2dh)+fz(h)-2fz(h+dh))/tolerance;
+ SetM''1(M''1-(M''1 Dotprod M'1)*M'1);
+ h := h+dh;
+ exitif (M''1 <> Origin);
+ endfor
+fi
+M_ := Unitvector(M''1);
+M__ := M'1 Vectprod M_;
+SetM2(M_); SetM3(M__);
+%
+% fill or not the beginning of the rope
+%
+if fillstart:
+ Fill(for @ = na-1 downto 0:
+ proj(M1+r*(cosd(@/na*360)*M2+sind(@/na*360)*M3))-- endfor cycle,
+ M1, -M'1);
+fi
+%
+% draw the rope
+%
+for $ = 1 upto nh:
+ x4 := fx(($/nh)[tmin, tmax]);
+ y4 := fy(($/nh)[tmin, tmax]);
+ z4 := fz(($/nh)[tmin, tmax]);
+ x'4 := fx(($/nh)[tmin, tmax]+dh);
+ y'4 := fy(($/nh)[tmin, tmax]+dh);
+ z'4 := fz(($/nh)[tmin, tmax]+dh);
+ x''4 := (fx(($/nh)[tmin, tmax]+2dh)+x4-2x'4)/tolerance;
+ y''4 := (fy(($/nh)[tmin, tmax]+2dh)+y4-2y'4)/tolerance;
+ z''4 := (fz(($/nh)[tmin, tmax]+2dh)+z4-2z'4)/tolerance;
+ SetM'4(Unitvector(M'4-M4));
+ SetM''4(M''4-(M''4 Dotprod M'4)*M'4);
+ %
+ % try to find a non vanishing normal acceleration
+ %
+ if M''4=Origin: message "inflexion at time "&decimal(($/nh)[tmin, tmax]);
+ M_ := Unitvector(M2-(M2 Dotprod M'4)*M'4);
+ else:
+ M_ := Unitvector(M''4);
+ fi
+ M__ := M'4 Vectprod M_;
+ SetM5(M_); SetM6(M__); SetM7(M1+r*M2); SetM10(M4+r*M5);
+ if M2 Dotprod M5 < 0: SetM2(-M2); SetM3(-M3);
+ SetM7(M1+r*M2); SetM10(M4+r*M5);fi
+ for @=1 upto na:
+ SetM8(M1+r*(cosd(@/na*360)*M2+sind(@/na*360)*M3));
+ SetM9(M4+r*(cosd(@/na*360)*M5+sind(@/na*360)*M6));
+ Fill(m7--m8--m9--m10--cycle, 0.5(M7+M9),
+ Unitvector(0.5(cosd((@-.5)/na*360)*(M2+M5)
+ +sind((@-.5)/na*360)*(M3+M6))));
+ SetM7(M8); SetM10(M9);
+ endfor
+ SetM1(M4); SetM2(M5); SetM3(M6);
+endfor
+%
+% fill or not the end of the rope
+%
+if fillend:
+ Fill(for @ = 0 upto na-1:
+ proj(M1+r*(cosd(@/na*360)*M2+sind(@/na*360)*M3))-- endfor cycle,
+ M1, M'4);
+fi
+endObject;
+
+%
+% SUBSECTION 3.6. simpletext
+%
+% parameters: TextAlign is a string whose possible values
+% are "right", "left", "center", "justify"; BoxAlign is a string whose
+% possible values are the usual "top", "urt", ... and others
+% like "center" (syntax only).
+
+% one should set prologues:= 1 or 2;
+prologues:=1;
+string mthreeDfont;
+mthreeDfont := "rphvb";% look in ../texmf/dvips/config/psfonts.map
+mthreeDfontsize := 10pt;
+baselineskip := 12pt;
+textwidth := 0;% ????
+color TextColor; TextColor := black;
+TextStretchFactor:=2;
+
+Object simpletext(expr TextAlign, BoxAlign)(text stringlist) =
+save p_, p__, i, j, t_, w, h, d, spacecnt, normalspace;
+picture p_, p__;
+p_ := " " infont mthreeDfont;
+normalspace = xpart urcorner p_; i = 0; w = 0; h = 0;
+%
+% Measuring text: width w[i], height h[i], depth d[i],
+% number of spaces spacecnt[i] of every line [i]; also
+% total width w, total height h.
+%
+for $ = stringlist:
+ i := i+1;
+ p_ := $ infont mthreeDfont;
+ w[i] = xpart(urcorner p_-llcorner p_); if w[i] > w: w := w[i]; fi
+ h[i] = ypart urcorner p_; d[i] = ypart llcorner p_; spacecnt[i]=0;
+ h := if i > 1: h+max(h[i]+d[i-1], baselineskip) else: h[i] fi;
+ for @ = 1 upto length $:
+ if substring (@-1, @) of $ = " ": spacecnt[i] := spacecnt[i]+1; fi
+ endfor
+endfor
+h := h+d[i];% it may be interesting not to take the last depth into account
+%
+% Justification may be not applied when one cannot stretch spaces
+% enough in order to reach the maximum width (parameter TextStretchFactor).
+% It is done by setting the measured width w[i] of such a line [i] to the
+% maximum width w.
+%
+if TextAlign = "justify":
+ i := 0;
+ for $ = stringlist:
+ i := i+1;
+ if (w[i]+spacecnt[i]*TextStretchFactor*normalspace < w):
+ w[i] := w;
+ fi
+ endfor
+fi
+%
+% Printing it
+%
+y = if (BoxAlign = "top") or (BoxAlign = "urt") or (BoxAlign = "ulft"): 0
+elseif (BoxAlign = "bot") or (BoxAlign = "lrt") or (BoxAlign = "llft"): h
+else: 0.5h fi;
+i := 0;
+for $ = stringlist:
+ i := i+1;
+ y := y-if i > 1: max(h[i]+d[i-1], baselineskip) else: h[i] fi;
+ j := 0; x' := x'' := 0;
+ x := if TextAlign = "right": w-w[i] elseif TextAlign="center":
+ 0.5(w-w[i]) else: 0 fi
+ - if (BoxAlign = "left") or (BoxAlign = "ulft") or (BoxAlign = "llft"): 0
+ elseif (BoxAlign = "right") or (BoxAlign = "urt") or (BoxAlign = "lrt"): w
+ else: 0.5w fi;
+ for @ = 1 upto length $:
+ if (TextAlign = "justify") and (substring (@-1, @) of $ = " "):
+ j := @;
+ x := x+x'+x''+normalspace+(w-w[i])/spacecnt[i];
+ else:
+ p_ := substring (j, @) of $ infont mthreeDfont;
+ p__ := substring (@-1, @) of $ infont mthreeDfont;
+ x'' := xpart urcorner p__;
+ x' := xpart urcorner p_-x'';
+ y' := max(ypart ulcorner p__,eps);
+ transform t_;
+ (0, 0) transformed t_ = proj((x+x', y, 0)/mthreeDfontsize);
+ (x'', 0) transformed t_ = proj((x+x'+x'', y, 0)/mthreeDfontsize);
+ (0, y') transformed t_ = proj((x+x', y+y', 0)/mthreeDfontsize);
+% dotlabel("", proj(x+x'+0.5x'',y+0.5y',0));
+ draw p__ transformed t_ withcolor TextColor;
+ % shall we change this?
+ fi
+ endfor
+endfor
+endObject;
+
+%
+% SUBSECTION 3.7. curvedtext
+%
+% parameters: M_t, D_t, message are strings, t_min, t_max
+% are numerics. $\{M_t:t\in[t_{\rm min},t_{\rm max}]\}$
+% is the curve in 3D spaceon which the text ``message'' will be written.
+% $\{D_t:t\in[t_{\rm min},t_{\rm max}]\}$ corresponds to the vertical frame
+% in 3D space.
+
+Object curvedtext(expr M_t, D_t, t_min, t_max, sentence) =
+picture p_, p__;
+p_ := " " infont mthreeDfont scaled (1/CurrentScale) scaled CurrentScale;
+(x.max, ymax) = urcorner p_;
+(x.min, ymin) = llcorner p_;
+endObject;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% END
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+threeDmode;
+
+endinput.
diff --git a/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dsty01.mp b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dsty01.mp
new file mode 100644
index 0000000000..3691d41f5b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/mpinputs/m3Dsty01.mp
@@ -0,0 +1,76 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dsty01.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Visual settings
+%
+
+% At this level, coordinates refer to the screen
+% (or the piece of paper): x, y are the usual planar
+% coordinates and z is orthogonal to them and has
+% for direction the observer.
+
+% ObsZ is distance of the observer to the ``Origin''
+% say to the screen or the piece of paper
+ObsZ := 10cm;
+% Oo is the origin of the current object with respect
+% to the screen coordinates.
+Oo := (0, 0, 0);
+% initial frame with respect to the screen coordinates
+Ox := (-sqrt(1/2), -sqrt(1/6), sqrt(1/3));
+Oy := (sqrt(1/2), -sqrt(1/6), sqrt(1/3));
+Oz := (0, sqrt(2/3), sqrt(1/3));
+% The light source can be at infinity or not.
+LightAtInfinity := true;
+% vector to THE light source
+LightSource := (0, 1, 1);
+
+%
+% Texture parameters
+%
+
+% Usual contrast parameter
+Contrast := 0.75;
+% Usual luminosity parameter
+Luminosity := 1;
+% Usual specularity parameter (maximum fraction
+% of incident light which can be reflected)
+Specularity := 0.5;
+% Phong is a diffusion exponent for relected light.
+Phong := 3;
+% Alpha is the transparency parameter.
+Alpha := 0.5;
+% See the object ``sphere'' for a use of this parameter.
+Resolution := 2mm;
+% Fog is applied if and only if Fog > 0.
+Fog := 1;
+% FogHalf is like half-life in exponential decay.
+FogHalf := 10cm;
+% FogZ is the z-coordinate (relative to the screen)
+% below which fog can be applied (see below).
+FogZ := 0;
+
+%
+% Other settings
+%
+
+ObjectColor := 0.75white;
+
+PenColor := black; SetPens(0.2pt, 0.4pt, 0.8pt);
+
+% parameter of the object ``plotThreeD''
+fineplot := false;
+
+ProjectionSystem(planar); % linear, spherical
+
+let Fill = SolidFill; % WireFill, SolidFill
+
+endinput.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Danim.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Danim.mp
new file mode 100644
index 0000000000..1bc5ce50a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Danim.mp
@@ -0,0 +1,65 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Danim.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TRY IT:
+% mpost <thisfile.mp>
+% bash animate-script
+% rm -f <thisfile>.1*
+% xanim <thisfile>.gif
+
+input m3Dplain.mp;
+input m3Dlib01.mp;
+
+%
+% PARAMETERS
+%
+
+%ObsZ := 10cm;
+Phong := 3;
+Specularity := 1;
+Luminosity := 1;
+Contrast := 1;
+Fog := 2;
+FogZ := 0;
+FogHalf := 1cm;
+%fineplot:=true;
+LightAtInfinity:=false;
+ObjectColor:=0.75white;
+%LightSource:=3/3cm*(Ox+Oy+Oz);
+LightSource:=5cm*(1,1,1);%Unitvector(1,1,1);
+%ProjectionSystem(linear);
+ProjectionSystem(planar);
+%ProjectionSystem(spherical);
+
+let Fill = SolidWireFill;
+ObjectColor := 0.5white;
+PenColor := green;
+fineplot:=true;
+Resolution := 3mm;
+
+%
+% FIGURES
+%
+
+n=20;
+
+for imageno = 0 upto n-1:
+beginfig(100+imageno);
+ pickup thin.nib;
+ alpha:=imageno/n*360;
+ UseObject(plotThreeD, (0, 0, 0), (0, 0, 0), 0.25cm,
+ "4cosd(180/3.14159*(x++y)-alpha)*mexp(-(x++y)*50)",
+ -15, 15, -10, 10);
+endfig;
+endfor
+
+AnimateQuality:=4;
+AnimateDelay:=5;
+Animate(5,true);
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dchair.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dchair.mp
new file mode 100644
index 0000000000..4b61470e64
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dchair.mp
@@ -0,0 +1,174 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dchair.mp (suggested by Pr. Jens Schwaiger)
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TRY IT:
+% mpost <thisfile.mp>
+% gv <thisfile>.0
+% gv <thisfile>.1
+
+input m3Dplain;
+input m3Dlib01;
+
+%
+% PARAMETERS
+%
+
+%ObsZ := 10cm;
+Resolution := 0.75mm;
+Phong := 7;
+Specularity := 1;
+Luminosity := 1;
+Contrast := 1;
+Fog := 2;
+FogZ := 0;
+FogHalf := 1cm;
+n := 15;
+%fineplot := true;
+LightAtInfinity := false;
+LightSource := Origin;
+%background := black;
+%LightSource := Unitvector(1, 1, 2);
+%ProjectionSystem(linear);
+ProjectionSystem(planar);
+%ProjectionSystem(spherical);
+%let Fill = HardFill;
+
+%
+% NEW OBJECTS
+%
+
+Object chair =
+save corner, radius;
+corner = 0.25;
+radius = 0.1;
+OnDepth;
+Refpoint (-0.5, 0, 0);
+Action(ObjectColor := green;
+ UseObject(cylinder, (-0.5, 0.5-corner, 0), (90, 90, 0), 1, radius, 1-2corner));
+%Refpoint (0.5, 0, 0)
+%Action(ObjectColor := green;
+%UseObject(cylinder, (0.5, 0.5-corner, 0), (90, 90, 0), 1, radius, 1-2corner));
+Refpoint (0.5, 0, 1);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5-(1-1/sqrt2)*corner, 0.5-radius, 1-(1-1/sqrt2)*corner), (90, 90, 0), 1, radius, 1-2radius));
+Refpoint (-0.5, 0, 1);
+Action(ObjectColor := green;
+ UseObject(cylinder, (-0.5+(1-1/sqrt2)*corner, 0.5-radius, 1+(1-1/sqrt2)*corner), (90, 90, 0), 1, radius, 1-2radius));
+Refpoint (-0.5, 0, 2);
+Action(ObjectColor := green;
+ UseObject(cylinder, (-0.5, 0.5-corner, 2), (90, 90, 0), 1, radius, 1-2corner));
+%
+Refpoint (0, 0.5, 0);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5-corner, 0.5, 0), (0, 90, 0), 1, radius, 1-2corner));
+Refpoint (0, -0.5, 0);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5-corner, -0.5, 0), (0, 90, 0), 1, radius, 1-2corner));
+Refpoint (0, 0.5, 1);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5-corner, 0.5, 1), (0, 90, 0), 1, radius, 1-2corner));
+Refpoint (0, -0.5, 1);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5-corner, -0.5, 1), (0, 90, 0), 1, radius, 1-2corner));
+%
+Refpoint (0.5, -0.5, 0.5);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5, -0.5, corner), (0, 0, 0), 1, radius, 1-2corner));
+Refpoint (0.5, 0.5, 0.5);
+Action(ObjectColor := green;
+ UseObject(cylinder, (0.5, 0.5, corner), (0, 0, 0), 1, radius, 1-2corner));
+Refpoint (-0.5, -0.5, 1.5);
+Action(ObjectColor := green;
+ UseObject(cylinder, (-0.5, -0.5, corner+1), (0, 0, 0), 1, radius, 1-2corner));
+Refpoint (-0.5, 0.5, 1.5);
+Action(ObjectColor := green;
+ UseObject(cylinder, (-0.5, 0.5, corner+1), (0, 0, 0), 1, radius, 1-2corner));
+%
+Refpoint (0, 0, 1);
+Action(ObjectColor := (215/255, 1, 0);
+ UseObject(cylinder, (0.5-corner, 0, 1), (0, 90, 0), 1, radius, 1-2corner));
+Refpoint (-0.5, 0, 1.5);
+Action(ObjectColor := (215/255, 1, 0);
+ UseObject(cylinder, (-0.5, 0, 1+corner), (0, 0, 0), 1, radius, 1-2corner));
+%
+% corners
+%
+Refpoint (-0.5, -0.5, 0);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5+corner, -0.5+corner, 0), (90, 180, 0), 1, corner, radius));
+Refpoint (-0.5, 0.5, 0);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5+corner, 0.5-corner, 0), (90, 0, 0), 1, corner, radius));
+%
+Refpoint (0.5, -0.5, 0);
+Action(ObjectColor := green;
+ UseObject(corner, (0.5-corner, -0.5, corner), (-90, -90, 0), 1, corner, radius));
+Refpoint (0.5, 0.5, 0);
+Action(ObjectColor := green;
+ UseObject(corner, (0.5-corner, 0.5, corner), (-90, -90, 0), 1, corner, radius));
+%
+Refpoint (0.5, -0.5, 1);
+Action(ObjectColor := green;
+ UseObject(corner, (0.5-corner, -0.5, 1-corner), (-90, 90, 0), 1, corner, radius));
+Refpoint (0.5, 0.5, 1);
+Action(ObjectColor := green;
+ UseObject(corner, (0.5-corner, 0.5, 1-corner), (-90, 90, 0), 1, corner, radius));
+%
+Refpoint (-0.5, -0.5, 1);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5+corner, -0.5, 1+corner), (90, -90, 0), 1, corner, radius));
+Refpoint (-0.5, 0.5, 1);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5+corner, 0.5, 1+corner), (90, -90, 0), 1, corner, radius));
+%
+Refpoint (-0.5, -0.5, 2);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5, -0.5+corner, 2-corner), (180, 90, 0), 1, corner, radius));
+Refpoint (-0.5, 0.5, 2);
+Action(ObjectColor := green;
+ UseObject(corner, (-0.5, 0.5-corner, 2-corner), (0, 90, 0), 1, corner, radius));
+
+endOnDepth;
+endObject;
+
+Object corner (expr corner, radius) =
+save na, nb, r, s, t; r = radius/corner;
+na = ceiling(1.570796(corner+radius)*(CurrentScale/Resolution));
+nb = ceiling(3.14159radius*(CurrentScale/Resolution));
+for $ = 0 upto na-1:
+ x0 := corner*cosd(($)/na*90); x1 := corner*cosd(($+1)/na*90);
+ y0 := corner*sind(($)/na*90); y1 := corner*sind(($+1)/na*90);
+ for @ = 0 upto 2nb-1:
+ t := 1+r*cosd(@/nb*180);
+ x2 := t*x0; y2 := t*y0;
+ x3 := t*x1; y3 := t*y1;
+ z2 := z3 := radius*sind(@/nb*180);
+ t := 1+r*cosd((@+1)/nb*180);
+ x5 := t*x0; y5 := t*y0;
+ x4 := t*x1; y4 := t*y1;
+ z4 := z5 := radius*sind((@+1)/nb*180);
+ x6 := cosd((@+.5)/nb*180)*cosd(($+.5)/na*90);
+ y6 := cosd((@+.5)/nb*180)*sind(($+.5)/na*90);
+ z6 := sind((@+.5)/nb*180);
+ Fill(m2--m3--m4--m5--cycle, (M2+M3+M4+M5)/4, M6);
+ endfor endfor
+endObject;
+
+%
+% FIGURES
+%
+
+DirectEPS "m3Dchair.0";
+UseObject(chair, Origin, Origin, 3cm);
+endDirectEPS;
+
+beginfig(1);
+ UseObject(chair, Origin, Origin, 3cm);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Ddirect.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Ddirect.mp
new file mode 100644
index 0000000000..f7bde35e0f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Ddirect.mp
@@ -0,0 +1,61 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Ddirect.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Here we try the
+%
+% DirectPostScript filename;
+% ...
+% endDirectPostScript;
+%
+% procedure. It works only with Fill commands and should produce
+% a correct EPS file which would be about the half size of what
+% would habe been produced by MetaPost. The Fill commands are directly
+% translated and written in an external file (filename). This is
+% of course faster than MetaPost translation.
+%
+% TRY IT:
+% mpost <thisfile.mp>
+% gv m3Ddirect.eps
+
+input m3Dplain.mp;
+input m3Dlib01.mp;
+
+message "It may take a little time...";
+
+%
+% PARAMETERS
+%
+
+%ObsZ:=10cm;
+Resolution:=0.75mm;
+Phong:=3;
+Specularity:=1;
+Luminosity:=1;
+Contrast:=1;
+Fog:=2;
+FogZ:=0;
+FogHalf:=1cm;
+n:=50;
+%fineplot:=true;
+LightAtInfinity:=false;
+ObjectColor:=0.75white;
+%LightSource:=3/3cm*(Ox+Oy+Oz);
+LightSource:=5cm*(1,1,1);%Unitvector(1,1,1);
+%ProjectionSystem(linear);
+ProjectionSystem(planar);
+%ProjectionSystem(spherical);
+
+%
+% DIRECT OUTPUT
+%
+
+DirectEPS "m3Ddirect.eps";
+UseObject(sierpinski_sponge,Origin,(0,0,0),4cm,3);
+endDirectEPS;
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dlego.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dlego.mp
new file mode 100644
index 0000000000..a66321d449
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dlego.mp
@@ -0,0 +1,302 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dlego.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TRY IT:
+% mpost <thisfile.mp>
+% bash animate-script
+% rm -f <thisfile>.1*
+% xanim <thisfile>.gif
+
+input m3Dplain;
+
+n = 40; % how many images
+
+%
+%
+%
+
+lego_unit := 0.8; % official (if CurrentScale = 1cm)
+lego_height := 1.2lego_unit; % official
+lego_plate_height := 0.4lego_unit; % official
+lego_thickness := 1/6lego_unit;
+lego_eps := 1/20lego_unit;
+lego_overshot := lego_plate_height-lego_thickness;%0.2133lego_unit;
+lego_diam := lego_unit-2lego_thickness;
+lego_Diam := (sqrt 2)*lego_unit-lego_diam;
+
+def lego_face(expr basepoint, u, v) =
+ if Orientation(proj(basepoint)--proj(basepoint+u)
+ --proj(basepoint+u+v)--proj(basepoint+v)--cycle) >= 0:
+ begingroup save nx, ny;
+ nx = ceiling(Norm u*(CurrentScale/Resolution));
+ ny = ceiling(Norm v*(CurrentScale/Resolution));
+ M__ := Unitvector(u Vectprod v);
+ for $ = 1 upto nx:
+ for $$ = 1 upto ny:
+ Fill(proj(basepoint+(($-1)/nx)*u+(($$-1)/ny)*v)
+ --proj(basepoint+($/nx)*u+(($$-1)/ny)*v)
+ --proj(basepoint+($/nx)*u+($$/ny)*v)
+ --proj(basepoint+(($-1)/nx)*u+($$/ny)*v)--cycle,
+ basepoint+(($-.5)/nx)*u+(($$-.5)/ny)*v,
+ M__);
+ endfor
+ endfor
+ endgroup;
+ fi
+enddef;
+
+Object lego_brick(expr nx, ny, hz) =
+M1 = (0, 0, 0);
+M2 = (nx*lego_unit, 0, 0);
+M3 = (nx*lego_unit, ny*lego_unit, 0);
+M4 = (0, ny*lego_unit, 0);
+M5 = (0, 0, hz*lego_height);
+M6 = (nx*lego_unit, 0, hz*lego_height);
+M7 = (nx*lego_unit, ny*lego_unit, hz*lego_height);
+M8 = (0, ny*lego_unit, hz*lego_height);
+OnDepth;
+%
+if false:
+Refpoint 0.5[M1, M6];
+Action(Fill(m1--m2--m6--m5--cycle, 0.5[M1, M6], (0, -1, 0)));
+Refpoint 0.5[M2, M7];
+Action(Fill(m2--m3--m7--m6--cycle, 0.5[M2, M7], (1, 0, 0)));
+Refpoint 0.5[M3, M8];
+Action(Fill(m3--m4--m8--m7--cycle, 0.5[M3, M8], (0, 1, 0)));
+Refpoint 0.5[M4, M5];
+Action(Fill(m4--m1--m5--m8--cycle, 0.5[M4, M5], (-1, 0, 0)));
+Refpoint 0.5[M5, M7];
+Action(Fill(m5--m6--m7--m8--cycle, 0.5[M5, M7], (0, 0, 1)));
+fi
+%
+if true:
+ % A revoir
+Refpoint 0.5[M1, M6];
+Action(lego_face(M1, (nx*lego_unit, 0, 0), (0, 0, hz*lego_height)));
+Refpoint 0.5[M2, M7];
+Action(lego_face(M2, (0, ny*lego_unit, 0), (0, 0, hz*lego_height)));
+Refpoint 0.5[M3, M8];
+Action(lego_face(M3, (-nx*lego_unit, 0, 0), (0, 0, hz*lego_height)));
+Refpoint 0.5[M4, M5];
+Action(lego_face(M4, (0, -ny*lego_unit, 0), (0, 0, hz*lego_height)));
+Refpoint 0.5[M5, M7];
+Action(lego_face(M5, (nx*lego_unit, 0, 0), (0, ny*lego_unit, 0)));
+fi
+%
+Refpoint 0.5[M5, M7]+(0, 0, 0.5lego_overshot);
+Action(lego_tetons(1, nx, 1, ny, hz));
+if Orientation(m1--m4--m3--m2--cycle) >= 0:
+ Refpoint 0.5[M1, M3]+(0, 0, 0.5hz*lego_height);
+ Action(lego_inside(nx, ny, hz);
+ Fill(m1--m4--m3--m2--m1--
+ proj(M1+(lego_thickness, lego_thickness, 0))--
+ proj(M2+(-lego_thickness, lego_thickness, 0))--
+ proj(M3-(lego_thickness, lego_thickness, 0))--
+ proj(M4+(lego_thickness, -lego_thickness, 0))--
+ proj(M1+(lego_thickness, lego_thickness, 0))--cycle,
+ 0.5[M1, M3], (0, 0, -1)));
+fi;
+endOnDepth;
+endObject;
+
+def lego_tetons(expr nx, nxx, ny, nyy , hz) =
+ OnDepth;
+ clearxy;
+ for $ = nx-1 upto nxx-1:
+ for $$ = ny-1 upto nyy-1:
+ M[$*(nyy-ny+1)+$$]
+ = (($+nx-0.5)*lego_unit, ($$+ny-0.5)*lego_unit, hz*lego_height);
+ Refpoint M[$*(nyy-ny+1)+$$];
+ Action(lego_cyl(M[$*(nyy-ny+1)+$$],
+ lego_diam, lego_overshot, true, true, false));
+ endfor
+ endfor
+ endOnDepth;
+enddef;
+
+def lego_inside(expr nx, ny, hz) =
+ OnDepth;
+ clearxy;
+ M1 = (lego_thickness, lego_thickness, 0);
+ M2 = (nx*lego_unit-lego_thickness, lego_thickness, 0);
+ M3 = (nx*lego_unit-lego_thickness, ny*lego_unit-lego_thickness, 0);
+ M4 = (lego_thickness, ny*lego_unit-lego_thickness, 0);
+ M5 = (lego_thickness, lego_thickness, hz*lego_height-lego_thickness);
+ M6 = (nx*lego_unit-lego_thickness, lego_thickness,
+ hz*lego_height-lego_thickness);
+ M7 = (nx*lego_unit-lego_thickness, ny*lego_unit-lego_thickness,
+ hz*lego_height-lego_thickness);
+ M8 = (lego_thickness, ny*lego_unit-lego_thickness,
+ hz*lego_height-lego_thickness);
+ Fill(m5--m8--m7--m6--cycle, 0.5[M5, M7], (0, 0, -1));
+ Refpoint 0.5[M1, M6];
+ Action(Fill(m1--m5--m6--m2--cycle, 0.5[M1, M6], (0, 1, 0)));
+ Refpoint 0.5[M2, M7];
+ Action(Fill(m2--m6--m7--m3--cycle, 0.5[M2, M7], (-1, 0, 0)));
+ Refpoint 0.5[M3, M8];
+ Action(Fill(m3--m7--m8--m4--cycle, 0.5[M3, M8], (0, -1, 0)));
+ Refpoint 0.5[M4, M5];
+ Action(Fill(m4--m8--m5--m1--cycle, 0.5[M4, M5], (1, 0, 0)));
+ Refpoint 0.5[M1, M3]+(0, 0, 0.5hz*lego_height);
+ Action(lego_inside_(nx, ny, hz));
+ endOnDepth;
+enddef;
+
+def lego_inside_(expr nx, ny, hz) =
+ OnDepth;
+ if (nx > 1) and (ny>1):
+ for $ = 0 upto nx-2:
+ for $$ = 0 upto ny-2:
+ M[$*ny+$$+9] = (($+1)*lego_unit, ($$+1)*lego_unit, 0);
+ Refpoint M[$*ny+$$+9];
+ Action(
+ lego_cyl(M[$*ny+$$+9], lego_diam, hz*lego_height-lego_thickness,
+ false, false, false);
+ lego_path:= lego_cyl_bot_path;
+ lego_cyl(M[$*ny+$$+9], lego_Diam, hz*lego_height-lego_thickness,
+ true, false, false);
+ Fill(reverse lego_cyl_bot_path--lego_path--cycle, M[$*ny+$$+9],
+ (0, 0, -1))
+ );
+ endfor
+ endfor
+ else:
+ if (nx > 1) and (ny = 1):
+ for $ = 0 upto nx-2:
+ M[$+9] = (($+1)*lego_unit, .5lego_unit, 0);
+ Refpoint M[$+9];
+ Action(lego_cyl(M[$+9], 2lego_thickness,
+ hz*lego_height-lego_thickness, true, false, true));
+ endfor
+ fi
+ if (nx = 1) and (ny > 1):
+ for $ = 0 upto ny-2:
+ M[$+9] = (.5lego_unit, ($+1)*lego_unit, 0);
+ Refpoint M[$+9];
+ Action(lego_cyl(M[$+9], 2lego_thickness,
+ hz*lego_height-lego_thickness, true, false, true));
+ endfor
+ fi
+ fi
+ endOnDepth;
+enddef;
+
+path lego_path, lego_cyl_bot_path, lego_cyl_top_path;
+
+def lego_cyl(expr center, diam, height, outside, filltop, fillbot) =
+ da:= 180/ceiling(3.14159*.5diam*(CurrentScale/Resolution));
+ if outside:
+ for $ = da step da until 360+0.5da:
+ Fill(
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), 0))--
+ proj(center+(.5diam*cosd($), .5diam*sind($), 0))--
+ proj(center+(.5diam*cosd($), .5diam*sind($), height))--
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), height))--cycle,
+ center+.5diam*(.5diam*cosd($-0.5da), .5diam*sind($-0.5da), 0.5height),
+ (cosd($-0.5da), sind($-0.5da), 0));
+ endfor
+ else:
+ for $ = da step da until 360+0.5da:
+ Fill(
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), height))--
+ proj(center+(.5diam*cosd($), .5diam*sind($), height))--
+ proj(center+(.5diam*cosd($), .5diam*sind($), 0))--
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), 0))--cycle,
+ center+(.5diam*cosd($-0.5da), .5diam*sind($-0.5da), 0.5height),
+ -(cosd($-0.5da), sind($-0.5da), 0));
+ endfor
+ fi
+ lego_cyl_top_path := for $ = da step da until 360+0.5da:
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), height))--
+ endfor cycle;
+ lego_cyl_bot_path := for $ = da step da until 360+0.5da:
+ proj(center+(.5diam*cosd($-da), .5diam*sind($-da), 0))--
+ endfor cycle;
+ if filltop: Fill(lego_cyl_top_path, center+(0, 0, height), (0, 0, 1)); fi
+ if fillbot: Fill(reverse lego_cyl_bot_path, center, (0, 0, -1)); fi
+enddef;
+
+Object pasttrial =
+OnDepth;
+Refpoint (0, 0, 0);
+Action(ObjectColor:= red;
+ UseObject(lego_brick, (0, 0, 0), Origin, 1, 1, 6, 1));
+Refpoint (0, 0, 1);
+Action(ObjectColor:= 0.75white;
+ UseObject(lego_brick, (0, 0, lego_height), Origin, 1, 4, 2, 1));
+Refpoint (0, 0, 2);
+Action(ObjectColor:= green;
+ UseObject(lego_brick, (0, 0, 2lego_height), Origin, 1, 2, 2, 1));
+endOnDepth;
+endObject;
+
+TextColor:=white;
+
+Object trial =
+UseObject(lego_brick, (-2lego_unit, -lego_unit, -0.5lego_height),
+ Origin, 1,4,2,1);
+if Orientation
+ (proj(-2lego_unit,-lego_unit,-0.5lego_height)
+ --proj(2lego_unit,-lego_unit,-0.5lego_height)
+ --proj(2lego_unit,-lego_unit,0.5lego_height)
+ --proj(-2lego_unit,-lego_unit,0.5lego_height)--cycle) > 0:
+ UseObject(simpletext, (0, -lego_unit, 0), (0,0,90),
+ 0.5lego_height, "left", "center", "m3D");
+fi
+if Orientation
+ (proj(2lego_unit,-lego_unit,-0.5lego_height)
+ --proj(2lego_unit,lego_unit,-0.5lego_height)
+ --proj(2lego_unit,lego_unit,0.5lego_height)
+ --proj(2lego_unit,-lego_unit,0.5lego_height)--cycle) > 0:
+ UseObject(simpletext, (2lego_unit, 0, 0), (90,0,90),
+ 0.5lego_height, "left", "center", "is");
+fi
+if Orientation
+ (proj(2lego_unit,lego_unit,-0.5lego_height)
+ --proj(-2lego_unit,lego_unit,-0.5lego_height)
+ --proj(-2lego_unit,lego_unit,0.5lego_height)
+ --proj(2lego_unit,lego_unit,0.5lego_height)--cycle) > 0:
+ UseObject(simpletext, (0, lego_unit, 0), (180,0,90),
+ 0.5lego_height, "left", "center", "still a...");
+fi
+if Orientation
+ (proj(-2lego_unit,lego_unit,-0.5lego_height)
+ --proj(-2lego_unit,-lego_unit,-0.5lego_height)
+ --proj(-2lego_unit,-lego_unit,0.5lego_height)
+ --proj(-2lego_unit,lego_unit, 0.5lego_height)--cycle) > 0:
+ UseObject(simpletext, (-2lego_unit, 0, 0), (270,0,90),
+ 0.5lego_height, "left", "center", "W.I.P.");
+fi
+
+endObject;
+
+ProjectionSystem(planar);
+Fog:= 1;
+FogHalf:= 2cm;
+FogZ:= 0cm;
+LightAtInfinity:= false;
+ObsZ := 8cm;
+Contrast := 0.75;
+Luminosity := 1;
+Specularity:= 0.75;
+Phong:= 3;
+Resolution := 1mm;
+LightSource := (4cm, 2cm, 2cm);% screen coordinates
+
+for imageno = 0 upto n-1:
+ beginfig(100+imageno);
+ "Brique lego";
+ UseObject(trial, Origin, (-imageno/n*360, 0, 0), 1cm);
+ endfig;
+endfor;
+
+AnimateQuality:=4;
+AnimateDelay:=5;
+Animate(5, true);
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dpicts.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dpicts.mp
new file mode 100644
index 0000000000..7cc85a1b6e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dpicts.mp
@@ -0,0 +1,225 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dpicts.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Licence? Feel-free-to-send-me-a-postcard
+%
+% Anthony Phan,
+%
+% D\'epartement de Math\'ematiques,
+% SP2MI, T\'el\'eport 2,
+% Boulevard Marie et Pierre Curie,
+% BP 30179,
+% F-86962 Futuroscope-Chasseneuil cedex.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FOREWORD
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This file is under construction and may attempt to mimic
+% some Z-buffer or such.
+%
+% An attempt to allow automatic ordering:
+%
+% SubPicture refpoint.1;
+% fillArea(n,M1,...,M.n); ...
+% endSubPicture;
+% .
+% .
+% .
+% SubPicture refpoint.n;
+% fillArea(m, M1,...M.m); ...
+% endSubPicture;
+%
+% % ShipPicturesOut; done in extra_endfig
+%
+% Every face is stored as a picture and at the end the whole
+% is ordered and printed. Shipping is done automatically
+% when this counter is reached. At this time, pictures are sorted
+% with a buble sort algorithm. It is slow
+%
+if known mthreeDpicts: endinput; fi
+mthreeDpicts := 1;
+if unknown mthreeDplain: input m3Dplain; fi
+
+extra_beginfig := extra_beginfig &
+";pictcnt_ := 0; picture pict_[]; numeric pictdepth_[];";
+extra_endfig := extra_endfig & "ShipPicturesOut;";
+
+path c_;
+maxpictcnt := 100;
+color M___;
+
+def fillArea(expr vertexCount)(text vertices) =
+ c_ := for $ = vertices: proj $-- endfor cycle;
+ if Orientation(c_) >= 0:
+ M_ := (for $ = vertices: $+ endfor Origin)/vertexCount;
+ n_ := 0;
+ for $ = vertices: M___ := $; exitif true; endfor
+ n_ := 0; M__ := Origin;
+ for $ = vertices:
+ n_ := n_+1;
+ if n_>1: M__ := M__+(M___-M_)Vectprod($-M_); fi
+ M___ := $;
+ endfor
+ for $ = vertices:
+ M__ := M__+(M___-M_)Vectprod($-M_);
+ exitif true;
+ endfor
+ if Norm M__ > 0:
+ pictcnt_ := pictcnt_+1;
+ pictdepth_[pictcnt_] := Depth M_;
+ M__ := Unitvector(M__/vertexCount);
+ pict_[pictcnt_] := nullpicture;
+ addto pict_[pictcnt_] contour c_
+ withcolor Light(M_,M__,ObjectColor);
+ if pictcnt_ = maxpictcnt: ShipPicturesOut; fi
+ fi
+ fi
+enddef;
+
+% polyLine(expr vertexCount)(text vertices)
+% polyMarker(expr vertexCount)(text vertices)
+% text(expr origin)(expr str)
+% polyhedron(expr vertexCount, facetCount)(text vertices)(text facets)
+%
+% setLineStyle(expr style)
+% setLineWidthScaleFactor(expr scalefactor)
+% setLineColor(expr colorindex)
+%
+% setInteriorColor(expr colorindex)
+%
+% setEdgeFlag(expr flag)
+% setEdgeStyle(expr style)
+% setEdgeWidthScaleFactor(expr scalefactor)
+% setEdgeColor(expr colorindex)
+%
+% setMarkerStyle(expr style)
+% setMarkerWidthScaleFactor(expr scalefactor)
+% setMarkerColor(expr colorindex)
+%
+% setTextFont(expr fontindex)
+% setTextColor(expr colorindex)
+
+currentdepth_ := 0;
+picture tmppicture;
+
+def SubPicture expr refpoint =
+ begingroup save pictcnt_, currentdepth_, currentpicture, pict_, pictdepth_;
+ picture pict_[],currentpicture; pictcnt_ = 0;
+ currentdepth_ := Depth refpoint;
+ currentpicture := nullpicture;
+ message "Subpicture starts";
+ enddef;
+
+ def endSubPicture =
+ ShipPicturesOut;
+ tmppicture := currentpicture;
+ currentdepth__ := currentdepth_;
+ endgroup;
+% if tmppicture <> nullpicture: % does not exist
+ pictcnt_ := pictcnt_+1;
+ pict_[pictcnt_] := tmppicture; pictdepth_[pictcnt_] := currentdepth__;
+ message "Subpicture stored in pict "&str[pictcnt_];
+% fi
+enddef;
+
+%vardef ShipPicturesOut =
+% message "Shipping out "&str[pictcnt_]&" picts";
+% if pictcnt_ > 1:
+% save tmp_string, SortCriterion;
+% def SortCriterion(expr first, second) =
+% pictdepth_[first] < pictdepth_[second]
+% enddef;
+% string tmp_string; tmp_string = "";
+% for $ = 1 upto pictcnt_:
+% tmp_string := tmp_string & str[$] if $<pictcnt_: &"," fi;
+% endfor
+% QuickSort(scantokens tmp_string);
+% for $ = scantokens(SortedString):
+% addto currentpicture also pict_[$];
+% endfor;
+% elseif pictcnt_ = 1:
+% addto currentpicture also pict_[1];
+% else:
+% fi
+% pictcnt_ := 0;
+%enddef;
+
+%
+% much slower but use less memory (?)
+%
+
+def ShipPicturesOut =
+ begingroup;
+ if pictcnt_ > 1:
+ message "Shipping out "&str[pictcnt_]&" picts";
+ save sortflag, _i_; boolean sortflag;
+ _i_ = 1;
+ forever:
+ sortflag := true;
+ for $ = 1 upto pictcnt_-_i_:
+ if pictdepth_[$] < pictdepth_[$+1]:
+ pict_[0] := pict_[$]; pictdepth_[0] := pictdepth_[$];
+ pict_[$] := pict_[$+1]; pictdepth_[$] := pictdepth_[$+1];
+ pict_[$+1] := pict_[0]; pictdepth_[$+1] := pictdepth_[0];
+ sortflag := false;
+ fi
+ endfor
+ exitif sortflag;
+ _i_ := _i_+1;
+ endfor
+ for $ = 1 upto pictcnt_:
+ addto currentpicture also pict_[$];
+ endfor;
+ elseif pictcnt_ = 1:
+ message "Shipping out 1 pict";
+ addto currentpicture also pict_[1];
+ else:
+ fi
+ pictcnt_ := 0;
+ endgroup;
+enddef;
+
+endinput.
+
+%
+% Other attempts
+%
+
+numeric VertexCount;
+color FaceNormal, FaceMiddle;
+path FaceContour;
+
+def fillArea text vertices =
+ FaceCountour := for $ = vertices: proj $-- endfor cycle;
+ VertexCount := 0 for $ = vertices: +1 endfor;
+ if Orientation(FaceContour) >= 0:
+ FaceMiddle := (Origin for $ = vertices: +$ endfor)/VertexCount;
+ n_ := 0;
+ for $ = vertices: M___ := $; exitif true; endfor
+ n_ := 0; M__ := Origin;
+ for $ = vertices:
+ n_ := n_+1;
+ if n_>1: M__ := M__+(M___-M_)Vectprod($-M_); fi
+ M___ := $;
+ endfor
+ for $ = vertices:
+ M__ := M__+(M___-M_)Vectprod($-M_);
+ exitif true;
+ endfor
+ if Norm M__ > 0:
+ M__ := Unitvector(M__/VertexCount);
+ pict_[pictcnt_] := nullpicture;
+ addto currentpicture contour FaceContour
+ withcolor Light(FaceMiddle,FaceNormal,ObjectColor);
+ fi
+ fi
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dpolyhedron.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dpolyhedron.mp
new file mode 100644
index 0000000000..b9b3cebd19
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dpolyhedron.mp
@@ -0,0 +1,53 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dpolyhedron.mp (sample file for animation)
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TRY IT:
+% mpost <thisfile.mp>
+% bash animate-script
+% rm -f <thisfile>.1*
+% xanim <thisfile>.gif
+
+input m3Dplain.mp;
+input m3Dlib01.mp;
+
+%
+% PARAMETERS
+%
+%ObsZ:=10cm;
+Resolution:=0.75mm;
+Phong:=3;
+Specularity:=1;
+Luminosity:=1;
+Contrast:=1;
+Fog:=2;
+FogZ:=0;
+FogHalf:=1cm;
+n:=50;
+%fineplot:=true;
+%LightAtInfinity:=false;
+
+%LightSource:=3/3cm*(Ox+Oy+Oz);
+LightSource:=Unitvector(0,1,1);
+%ProjectionSystem(linear);
+ProjectionSystem(planar);
+%ProjectionSystem(spherical);
+
+%
+% FIGURES
+%
+
+for $=0 upto n-1:
+ beginfig(100+$);
+ ObjectColor:=(0.5(1+cosd($/n*360)))[red, blue];;
+ UseObject(icosahedron, (0, 0, 0), ($/n*360, $/n*180, 0), 2cm);
+ endfig;
+endfor
+
+Animate(5,true);
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dsimpletext.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dsimpletext.mp
new file mode 100644
index 0000000000..de8fb5310b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dsimpletext.mp
@@ -0,0 +1,28 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dsimpletext.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% mpost <thisfile.mp>
+% bash animate-script
+% rm -f <thisfile>.1*
+% xanim <thisfile>.gif
+input m3Dplain;
+
+n=50;
+ProjectionSystem(planar);
+
+for $ = 0 upto n-1:
+ beginfig(100+$);
+ UseObject(simpletext, Origin, ($/n*360,0,90), 20pt, "justify", "center",
+ "I love to spin like this!",
+ "But it gives me headache...");
+ endfig;
+endfor;
+
+Animate(2,false);
+
+end.
diff --git a/graphics/metapost/contrib/macros/m3D/trials/m3Dviviani.mp b/graphics/metapost/contrib/macros/m3D/trials/m3Dviviani.mp
new file mode 100644
index 0000000000..8dd75a761b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/m3D/trials/m3Dviviani.mp
@@ -0,0 +1,188 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3D extensions for MetaPost by Anthony Phan.
+% file: m3Dviviani.mp
+% last modification: january 11, 2006
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Fenetre de Viviani (Viviani's window)
+%
+
+input m3Dplain.mp;
+input m3Dpicts.mp;
+
+message "It may take a little time...";
+
+%
+% SUBSECTION ?.?. Implicit functions
+%
+
+% functions f, g must be known
+
+Object ImplicitCurve(expr InitialPoint, dh, ds)=
+save i, gradf, gradg, tangent, inittangent;
+color gradf, gradg, tangent, inittangent;
+M=InitialPoint; i=0;
+gradf := ((f(x+dh, y, z), f(x, y+dh, z), f(x, y, z+dh))
+ -f(x, y, z)*(1, 1, 1))/dh;
+gradg := ((g(x+dh, y, z), g(x, y+dh, z), g(x, y, z+dh))
+ -g(x, y, z)*(1, 1, 1))/dh;
+inittangent:= Unitvector(gradf Vectprod gradg);
+forever:
+ gradf := ((f(x+dh, y, z), f(x, y+dh, z), f(x, y, z+dh))
+ -f(x, y, z)*(1, 1, 1))/dh;
+ gradg := ((g(x+dh, y, z), g(x, y+dh, z), g(x, y, z+dh))
+ -g(x, y, z)*(1, 1, 1))/dh;
+ tangent:= Unitvector(gradf Vectprod gradg);
+ x' := Xpart(M+tangent*ds);
+ y' := Ypart(M+tangent*ds);
+ z' := Zpart(M+tangent*ds);
+ gradf := ((f(x'+dh, y', z'), f(x', y'+dh, z'), f(x', y', z'+dh))
+ -f(x', y', z')*(1, 1, 1))/dh;
+ gradg := ((g(x'+dh, y', z'), g(x', y'+dh, z'), g(x', y', z'+dh))
+ -g(x', y', z')*(1, 1, 1))/dh;
+ tangent:= Unitvector(gradf Vectprod gradg);
+ x'' := 0.5(Xpart(M'+tangent*ds)+x);
+ y'' := 0.5(Ypart(M'+tangent*ds)+y);
+ z'' := 0.5(Zpart(M'+tangent*ds)+z);
+ draw proj M..proj M'';
+ x:=x''; y:=y''; z:=z'';
+ i:=i+1;
+ exitif (i>1000)
+ or (Norm(M-InitialPoint)>10)
+ or ((Norm(M-InitialPoint)<1.5ds) and (abs(tangent Dotprod inittangent)<0.1));
+endfor
+endObject;
+
+%
+% OBJECTS
+%
+
+vardef fsphere primary M =
+ Norm M-1
+enddef;
+
+vardef fcylinder primary M =
+ ((Xpart M-0.5)++Ypart M)-.5
+enddef;
+
+Object sphere =
+save na; na=ceiling(1.5708*(CurrentScale/Resolution));
+for $ = if SubObjectNumber = 1: 0 upto na-1
+ elseif SubObjectNumber = 2: na upto 2na-1
+ else: 0 upto 2na-1 fi:
+ phi :=($/(2na))[-90+eps,90-eps]; % for special effects
+ x := cosd(($/(2na))[-90+eps,90-eps]);
+ y := cosd((($+1)/(2na))[-90+eps,90-eps]);
+ x2 := x; y2 := 0; x3 := y; y3 := 0;
+ z1 := z2 := sind(($/(2na))[-90+eps,90-eps]);
+ z3 := z4 := sind((($+1)/(2na))[-90+eps,90-eps]);
+ for $$ = 0 upto 4na:
+ theta := $$/(4na)*360; % for special effects
+ x1 := x2; y1 := y2; x4 := x3; y4 := y3;
+ z := cosd theta; x2 := x*z; x3 := y*z;
+ z := sind theta; y2 := x*z; y3 := y*z;
+ _i_:=0;
+ for i = 1 upto 4: _f_[i] := fcylinder M[i];
+ if _f_[i] < 0: _i_:=_i_+1; fi endfor
+ if _i_ = 0:
+ fillArea(4,M1,M2,M3,M4);
+ elseif _i_ < 4:
+ _i_:=0;
+ for i = 1 upto 4:
+ if _f_[i] > 0:
+ _i_:=_i_+1; SetM'[_i_](M[i]);
+ else:
+ for @ = if i = 1: 4 else: i-1 fi, if i = 4: 1 else: i+1 fi:
+ if _f_[@] > 0:
+ _i_:=_i_+1; SetM'[_i_]((-_f_[i]/(_f_[@]-_f_[i]))[M[i],M[@]]);
+ fi
+ endfor
+ fi
+ endfor
+ if _i_ > 2: fillArea(_i_, M'[1] for @= 2 upto _i_:, M'[@] endfor);
+% elseif _i_ = 4: fillArea(4, M'[1], M'[2], M'[3], M'[4]);
+% elseif _i_ = 5: fillArea(5, M'[1], M'[2], M'[3], M'[4], M'[5]);
+ fi
+ fi
+ endfor endfor
+endObject;
+
+Object SphereCylinder(expr cyl_length)=
+SubObject1: UseObject(sphere, Origin, Origin, 1); endSubObject;
+save da, dh; da=180/ceiling(0.5*3.14159(CurrentScale/Resolution));
+dh=0.5cyl_length/ceiling(0.5cyl_length*(CurrentScale/Resolution));
+SubObject2:
+for @=dh step dh until 0.5cyl_length:
+ x1:=x4:=1; y1:=y4:=0;
+ for $=da step da until 360+eps:
+ x2:=x3:=0.5cosd($)+0.5; y2:=y3:=0.5sind($);
+ x:=sqrt(1-(x1**2)-(y1**2)); z1:=max(@-dh,x); z4:=max(@,x);
+ x:=sqrt(1-(x2**2)-(y2**2)); z2:=max(@-dh,x); z3:=max(@,x);
+ SetM'1(x1,y1,-z1);
+ SetM'2(x2,y2,-z2);
+ SetM'3(x3,y3,-z3);
+ SetM'4(x4,y4,-z4);
+ if (z1<@) or (z2<@):
+ fillArea(4,M1,M2,M3,M4);
+ z1:=z4:=-z1; z2:=z3:=-z2;
+ fillArea(4,M'4,M'3,M'2,M'1);
+ fi
+ x1:=x4:=x2; y1:=y4:=y2;
+ endfor
+endfor
+endSubObject;
+SubObject3:
+x1:=x2:=1; y1:=y2:=0; z1:=0; z2:=z3=-0.5cyl_length;
+for $=da step da until 360+eps:
+ x3:=x4:=0.5cosd($)+0.5; y3:=y4:=0.5sind($);
+ z4:=-sqrt(1-(x4**2)-(y4**2));
+ fillArea(4,M1,M2,M3,M4);
+ x1:=x2:=x3; y1:=y2:=y3; z1:=z4;
+endfor
+endSubObject;
+endObject;
+
+%
+% PARAMETERS
+%
+
+maxpictcnt:=2000;
+Resolution:=2mm;
+Phong:=3;
+Specularity:=1;
+Luminosity:=1;
+Contrast:=1;
+Fog:=2;
+FogZ:=0;
+FogHalf:=1cm;
+n:=15;
+ProjectionSystem(planar);
+LightAtInfinity:=false;
+LightSource:=5cm*(1,1,1);%Unitvector(1,1,1);
+
+%
+% FIGURE
+%
+
+beginfig(1);
+ vardef f(expr x, y, z)= Norm(x, y, z)-1 enddef;
+ vardef g(expr x, y, z)= (x-0.5)++y-0.5 enddef;
+ Inside;
+ ObjectColor:=0.5[white,blue];%(215/255,1,0);
+ UseSubObject2(SphereCylinder, Origin, Origin, 2cm, 4);
+ %ShipPicturesOut;
+ Inside;
+ ObjectColor:=(1,0,0);
+ UseSubObject1(SphereCylinder, Origin, (0,0,0), 2cm, 4);
+ Outside;
+ ObjectColor:=red;%(1,215/255,0);
+ UseSubObject1(SphereCylinder, Origin, (0,0,0), 2cm, 4);
+% ObjectColor:=blue;%(215/255,1,0);
+% UseSubObject2(SphereCylinder, Origin, Origin, 2cm, 4);
+% ShipPicturesOut;
+% UseObject(ImplicitCurve, Origin, (0, 0, 0), 2cm, (0, 0, 1), 0.001, 0.05);
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/makecirc/MakeCirc-en.pdf b/graphics/metapost/contrib/macros/makecirc/MakeCirc-en.pdf
new file mode 100644
index 0000000000..d96ce6367a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/MakeCirc-en.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/makecirc/MakeCirc.pdf b/graphics/metapost/contrib/macros/makecirc/MakeCirc.pdf
new file mode 100644
index 0000000000..812a192dc3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/MakeCirc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/makecirc/README b/graphics/metapost/contrib/macros/makecirc/README
new file mode 100644
index 0000000000..22b2d8fccb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/README
@@ -0,0 +1,17 @@
+MakeCirc: A METAPOST library for electrical circuit diagrams drawing.
+---------------------------------------------------------------------
+Copyright (c) 2003 GS Bustamante Argañaraz
+
+MakeCirc is a METAPOST library that contains diverse symbols (the mayority
+of wich are electrician) for the use in circuit diagrams. MakeCirc tries to
+offer a high quality tool, with a simple syntax.
+
+MakeCirc is completely integrated with LaTeX documents and with other METAPOST
+drawings/graphics. Its output is a PostScript file.
+
+MakeCirc only requires (La)TeX and METAPOST to run, together with the files
+makecirc.mp and latex.mp.
+
+The file MakeCirc.pdf is the spanish version manual and the file MakeCirc-en.pdf
+is the english version. The file ejemplos.pdf is an example file (in spanish).
+Its source is ejemplos.mp. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/makecirc/ejemplos.mp b/graphics/metapost/contrib/macros/makecirc/ejemplos.mp
new file mode 100644
index 0000000000..7214c94ac5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/ejemplos.mp
@@ -0,0 +1,307 @@
+input makecirc;
+
+initlatex("\usepackage{amsmath,amssymb}");
+
+
+beginfig(1);
+ source.a(origin, AC, 90,"v","220 V");
+ resistor.a(S.a.p+(2cm,1cm),normal,0,"R","5\ohm");
+ centreof.A(R.a.r+(2cm,0),(xpart R.a.r + 2cm,ypart S.a.n - 1cm),cap);
+ capacitor.a(c.A,normal,phi.A,"C","");
+ wire(S.a.p,R.a.l,udsq);
+ wire(R.a.r,C.a.l,rlsq);
+ wireU(S.a.n,C.a.r,-1cm,udsq);
+ imesh(S.a.n+(3cm,5mm),25mm,15mm,cw,0,"i(t)");
+endfig;
+
+beginfig(2);
+ source.a(origin, AC, 90,"v","220 V");
+ resistor.a(S.a.p+(2cm,1cm),normal,0,"R","15\ohm");
+ inductor.a(R.a.r+(2cm,-10mm),Up,-90,"L","");
+ wire(S.a.p,R.a.l,udsq);
+ wire(R.a.r,L.a.l,rlsq);
+ wireU(S.a.n,L.a.r,-1cm,udsq);
+endfig;
+
+beginfig(3);
+ source.a(origin,AC,90,"v","220 V");
+ resistor.a(S.a.p+(2cm,1cm),normal,0,"R","15\ohm");
+ inductor.a(R.a.r+(2cm,-10mm),Up,-90,"L","5 H");
+ centerto.A(R.a.l,R.a.r)(-3.2cm,cap);
+ capacitor.a(A,normal,0,"C","12 pF");
+ wire(S.a.p,R.a.l,udsq);
+ wire(R.a.r,L.a.l,rlsq);
+ wire(S.a.n,C.a.l,udsq);
+ wire(C.a.r,L.a.r,rlsq);
+endfig;
+
+beginfig(4);
+ source.a(origin,AC,90,"v","");
+ resistor.a(S.a.n+(2cm,5mm),normal,90,"R_L","");
+ inductor.a(R.a.l,Down,-90,"L","");
+ resistor.b(R.a.l+(2cm,0),normal,90,"R_C","");
+ capacitor.a(R.b.l,normal,-90,"C","");
+ wireU(S.a.p,R.a.r,1cm,udsq);
+ wireU(S.a.n,L.a.r,-1cm,udsq);
+ wire((xpart R.a.r,ypart S.a.p + 1cm),R.b.r,rlsq);
+ wire(C.a.r,(xpart L.a.r,ypart S.a.n-1cm),udsq);
+endfig;
+
+beginfig(5);
+ source.a(origin,AC,90,"v","");
+ diode.a(S.a.p+(1cm,1cm),normal,0,pinA,"D_r","");
+ impedance.a(D.a.K+(1cm,-1cm),-90,"Z_L","");
+ wire(S.a.p,D.a.A,udsq);
+ wire(D.a.K,Z.a.l,rlsq);
+ wireU(S.a.n,Z.a.r,-1cm,udsq);
+endfig;
+
+beginfig(6);
+ transformer.a(origin,mid,0);
+ diode.a(tf.a.ss+(1cm,1cm),normal,0,pinA,"D_1","");
+ diode.b(tf.a.si+(1cm,-1cm),normal,0,pinA,"D_2","");
+ impedance.a(D.a.K+(3cm,-4mm),-90,"Z_L","300\ohm");
+ wire(tf.a.ss,D.a.A,udsq);
+ wire(tf.a.si,D.b.A,udsq);
+ wire(D.a.K,Z.a.l,rlsq);
+ wire(Z.a.r,tf.a.m,udsq);
+ wire(D.b.K,D.a.K+(1cm,0),rlsq);
+ junction.a(D.a.K+(1cm,0),"")(top);
+ centerto.A(tf.a.pi,tf.a.ps)(-25mm,sac);
+ source.a(A,AC,90,"v","220 V");
+ wire(S.a.p,tf.a.ps,udsq);
+ wire(S.a.n,tf.a.pi,udsq);
+ centreof.A((xpart S.a.p,ypart tf.a.ps),tf.a.ps,cur);
+ current.a(c.A,phi.A,"i(t)","5 A");
+ imesh(tf.a.ss+(2cm,0),3cm,1cm,cw,0,"I_{cc}");
+endfig;
+
+beginfig(7);
+ source.a(origin,AC,90,"v","");
+ junction.a(S.a.p+(3cm,1cm),"")(top);
+ diode.a(J.a,normal,-45,pinA,"D_1","");
+ diode.b(D.a.K,normal,-135,pinK,"D_2","");
+ diode.c(D.b.A,normal,135,pinK,"D_3","");
+ diode.d(D.c.A,normal,45,pinA,"D_4","");
+ junction.b(D.b.A,"")(bot);
+ centerto.A(S.a.n,S.a.p)(5cm,imp);
+ impedance.a(A,90,"Z_L","");
+ wireU(S.a.p,D.a.A,1.5cm,udsq);
+ wireU(S.a.n,D.b.A,-1.5cm,udsq);
+ wire(D.a.K,Z.a.r,rlsq);
+ wire(Z.a.l,Z.a.l+(0,-4mm),nsq);
+ wireU(Z.a.l+(0,-4mm),D.d.A,-4cm,rlsq);
+endfig;
+
+beginfig(8);
+ junction.a(origin,"1b")(bot);
+ junction.b((0,4cm),"1a")(top);
+ resistor.a((1cm,4cm),normal,0,"R_1","0,82\ohm");
+ inductor.a(R.a.r,Up,0,"X_{L1}","0,92\ohm");
+ centerto.A(J.a,J.b,4cm,res);
+ resistor.b(A,normal,90,"G_{\phi}","0,41");
+ centerto.B(J.a,J.b,6cm,ind);
+ inductor.b(B,Down,90,"B_{\phi}","2,24");
+ inductor.c(L.a.r+(2.6cm,0),Up,0,"X'_{L2}","0,9\ohm");
+ resistor.c(L.c.r,normal,0,"R'_2","0,8\ohm");
+ junction.c(R.c.r+(1cm,0),"2a")(top);
+ junction.d(R.c.r+(1cm,-4cm),"2b")(bot);
+ wire(J.a,J.d,nsq);
+ wire(J.b,R.a.l,nsq);
+ wireU(R.b.r,L.b.r,3mm,udsq);
+ wireU(R.b.l,L.b.l,-3mm,udsq);
+ wire(L.a.r,(5cm,ypart R.b.r + 3mm),rlsq);
+ wire((5cm,ypart R.b.l - 3mm),(5cm,0),nsq);
+ wire(R.c.r,J.c,nsq);
+ wire(L.c.l,(5cm,ypart L.c.l),nsq);
+ ctext(J.a,J.b,"$V_1$",noarrow);
+ ctext(J.c,J.d,"$V'_2$",noarrow);
+endfig;
+
+beginfig(9);
+ rheostat.a(origin,Lrheo,0);
+ wire(rh.a.s,rh.a.s+(-1cm,0),udsq);
+ wire(rh.a.i,(-1cm,0),nsq);
+ transformer.a((5cm,0),normal,0);
+ meains.a(tf.a.ps-(1cm,0),ampere,180,"");
+ meains.b((xpart rh.a.r + 5mm,ypart tf.a.ps),watt,0,"");
+ centerto.A(tf.a.pi,tf.a.ps,-1cm,ins);
+ centerto.B(mi.a.r,mi.b.r,0,0);
+ meains.c((xpart B,ypart A),volt,90,"");
+ wire(rh.a.i,tf.a.pi,nsq);
+ wire(rh.a.r,mi.b.l,udsq);
+ wire(mi.b.r,mi.a.r,nsq);
+ wire(B,mi.c.r,nsq);
+ wire(mi.c.l,(xpart B,0),nsq);
+ wire(mi.b.p,(xpart mi.b.p,0),nsq);
+ wire(mi.a.l,tf.a.ps,nsq);
+ wireU(tf.a.si,tf.a.ss,1cm,rlsq);
+ current(mi.b.l-(2mm,0),0,"I_1","");
+endfig;
+
+beginfig(10);
+ generator.a(origin,90,"E_g","");
+ resistor.a(G.a.B,normal,90,"R_a","");
+ resistor.f(G.a.D-(2cm,0),normal,90,"","");
+ resistor.F(R.f.r,variable,90,"","");
+ resistor.L(G.a.B+(2cm,-5mm),normal,90,"R_L","");
+ current.a(R.a.r,90,"I_a","");
+ wireU(i.a.d,R.L.r,5mm,udsq);
+ wireU(G.a.D,R.L.l,-5mm,udsq);
+ wire(i.a.d+(0,5mm),R.F.r,rlsq);
+ wire(R.f.l,G.a.D-(0,5mm),udsq);
+ ctext(R.f.l-(5mm,0),R.F.r-(5mm,0),"$R_f$",noarrow);
+ current.f(i.a.d+(-1cm,5mm),180,"","$I_f$");
+ current.L(i.a.d+(1cm,5mm),0,"I_L","");
+ ctext.lft(R.f.l-(1cm,5mm),(xpart R.F.r-1cm,ypart i.a.d+5mm),"$V_f$",witharrow);
+ ctext.rt((xpart R.L.l+1cm,-5mm),(xpart R.L.r+1cm,ypart i.a.d+5mm),"$V_L$",witharrow);
+endfig;
+
+beginfig(11);
+ generator.a(origin,90,"E_g","500 V");
+ resistor.a(G.a.B,normal,90,"R_a","");
+ current.a(G.a.D+(2mm,-1cm),0,"I_a","");
+ junction.A(i.a.d+(2mm,0),"A")(top);
+ current.s(J.A+(4mm,0),0,"I_s","");
+ resistor.s(i.s.d,normal,0,"R_s","");
+ junction.B(R.s.r+(2mm,0),"B")(top);
+ current.d(J.A+(4mm,-1cm),0,"I_d","54 A");
+ resistor.d(i.d.d,variable,0,"R_d","");
+ current.f(J.B+(2mm,5mm),90,"I_f","");
+ current.L(J.B+(1cm,0),0,"I_L","");
+ resistor.L(i.L.d+(1cm,1.25cm),normal,90,"R_L","");
+ resistor.f(i.f.d+(0,2mm),normal,90,"","");
+ resistor.F(R.f.r,variable,90,"","");
+ wire(R.F.r,R.a.r,rlsq);
+ wire(R.F.r,R.L.r,rlsq);
+ wire(R.L.l,J.B,udsq);
+ wire(J.B+(2mm,0),R.f.l,nsq);
+ wire(J.B,R.d.r,udsq);
+ wire(R.d.l,J.A,rlsq);
+ wire(J.A,R.s.l,nsq);
+ wire(R.s.r,J.B,nsq);
+ wire(J.A,G.a.D,rlsq);
+ puttext("$R_f$",R.f.r-(5mm,0));
+endfig;
+
+beginfig(12);
+ junction.a(origin,"")(bot);
+ junction.b((0,4cm),"")(top);
+ ctext.lft(J.a,J.b,"$V_a=V_L=120\,\text{V}$",witharrow);
+ current.L(J.b+(5mm,0),0,"I_L","");
+ current.f(i.L.d+(5mm,-5mm),-90,"I_f","");
+ current.a(i.L.d+(2cm,0),0,"I_a","");
+ resistor.a(i.a.d+(15mm,-8mm),normal,-90,"R_a","0,25\ohm");
+ motor.a(R.a.r,-90,"E_c","");
+ resistor.f(i.f.d,normal,-90,"","");
+ resistor.F(R.f.r,variable,-90,"","");
+ puttext("$R_f$",R.f.r+(5mm,0));
+ wire(J.b,R.a.l,rlsq);
+ wire(J.a,M.a.B,rlsq);
+ wire(i.f.s+(0,5mm),R.f.l,nsq);
+ wire(R.F.r,(xpart R.F.r,0),nsq);
+endfig;
+
+beginfig(13);
+ junction.a(origin,"")(bot);
+ rheostat.a((5mm,2cm),Rrheo,0);
+ junction.b(rh.a.s-(5mm,0),"")(top);
+ resistor.a(rh.a.r+(2cm,0),normal,-90,"R_a","0,2\ohm");
+ motor.a((xpart R.a.r,0),90,"E_c","");
+ resistor.F(R.a.l+(2cm,0),variable,-90,"","");
+ resistor.f((xpart R.F.l,0),normal,90,"","");
+ wire(J.b,rh.a.s,nsq);
+ wire(rh.a.r,R.a.l,nsq);
+ wire(R.a.l,R.F.l,nsq);
+ wire(R.F.r,R.f.r,nsq);
+ wire(R.a.r,M.a.B,nsq);
+ wire(J.a,R.f.l,nsq);
+ ctext(J.a,J.b,"$V_a$",noarrow);
+endfig;
+
+beginfig(14);
+ transistor.a(origin,pnp,0);
+ junction.B(T.a.B,"B")(top);
+ junction.E(T.a.E,"E")(llft);
+ junction.C(T.a.C,"C")(top);
+ resistor.C(T.a.C+(2cm,-5mm),normal,-90,"R_C","");
+ source.CC(R.C.r,DC,-90,"V_{CC}","");
+ resistor.B(T.a.B-(2cm,0),normal,-90,"R_B","");
+ source.EE(R.B.r,DC,-90,"V_{BB}","");
+ capacitor.a(T.a.B-(3cm,0),normal,180,"C_a","");
+ junction.a(C.a.r-(1cm,0),"")(top);
+ junction.b((xpart J.a,ypart S.EE.p-5mm),"")(bot);
+ wire(T.a.C,R.C.l,rlsq);
+ wire(T.a.B,C.a.l,nsq);
+ wire(C.a.r,J.a,nsq);
+ wireU(S.EE.p,S.CC.p,-5mm,udsq);
+ wire(J.b,S.EE.p-(0,5mm),nsq);
+ wire(T.a.E,(xpart T.a.E,ypart S.EE.p-5mm),nsq);
+ current.E(T.a.E-(0,1cm),90,"I_E","");
+ current.C(T.a.C+(5mm,0),0,"I_C","");
+ current.B(J.B-(5mm,0),180,"I_B","");
+ ctext.lft(J.a,J.b,"$E_1$",witharrow);
+ wire(R.C.l,R.C.l+(1cm,0),nsq);
+ wire(R.C.r,R.C.r+(1cm,0),nsq);
+ ctext.rt(R.C.l+(1cm,0),R.C.r+(1cm,0),"$E_2$",witharrow);
+endfig;
+
+beginfig(15);
+ source.a(origin,AC,90,"v","");
+ diode.a(S.a.p+(1cm,1cm),normal,0,pinA,"D_r","");
+ capacitor.a(D.a.K+(5mm,-12mm),electrolytic,-90,"C_e","");
+ impedance.a(D.a.K+(2cm,-1cm),-90,"Z_L","");
+ wire(S.a.p,D.a.A,udsq);
+ wire(D.a.K,Z.a.l,rlsq);
+ wireU(S.a.n,Z.a.r,-1cm,udsq);
+ wire(D.a.K+(5mm,0),C.a.l,nsq);
+ wire(C.a.r,(xpart C.a.r,ypart S.a.n-1cm),nsq);
+endfig;
+
+beginfig(16);
+ transformer.a(origin,mid,0);
+ diode.a(tf.a.ss+(1cm,1cm),normal,0,pinA,"D_1","");
+ diode.b(tf.a.si+(1cm,-1cm),normal,0,pinA,"D_2","");
+ capacitor.a(D.a.K+(3cm,-6mm),electrolytic,-90,"C_e","");
+ impedance.a(D.a.K+(5cm,-4mm),-90,"Z_L","");
+ wire(tf.a.ss,D.a.A,udsq);
+ wire(tf.a.si,D.b.A,udsq);
+ wire(D.a.K,Z.a.l,rlsq);
+ wire(Z.a.r,tf.a.m,udsq);
+ wire(D.b.K,D.a.K+(1cm,0),rlsq);
+ junction.a(D.a.K+(1cm,0),"")(top);
+ centerto.A(tf.a.pi,tf.a.ps)(-25mm,sac);
+ source.a(A,AC,90,"v","");
+ wire(S.a.p,tf.a.ps,udsq);
+ wire(S.a.n,tf.a.pi,udsq);
+ wire(D.a.K+(3cm,0),C.a.l,nsq);
+ wire(C.a.r,(xpart C.a.r,ypart tf.a.m),nsq);
+endfig;
+
+beginfig(17);
+ inductor.a(origin,Up,90,"","");
+ inductor.b(origin,Down,90+120,"","");
+ inductor.c(origin,Up,90-120,"","");
+ inductor.d(origin,Up,-90,"","");
+ inductor.e(origin,Down,-90-120,"","");
+ inductor.f(origin,Up,-90+120,"","");
+ diode.a((3cm,ypart L.a.r),normal,0,pinA,"","");
+ diode.b((3cm,ypart L.b.r-1.2cm),normal,0,pinA,"","");
+ diode.c((3cm,ypart L.c.r),normal,0,pinA,"","");
+ diode.d((3cm,ypart L.d.r),normal,0,pinA,"","");
+ diode.e((3cm,ypart L.e.r+1.2cm),normal,0,pinA,"","");
+ diode.f((3cm,ypart L.f.r),normal,0,pinA,"","");
+ centerto.A(D.e.K,(xpart D.e.K,0),2cm,imp);
+ impedance.a(A,90,"Z_L","");
+ wire(L.a.r,D.a.A,nsq);
+ wire(L.b.r,D.b.A,udsq);
+ wire(L.c.r,D.c.A,nsq);
+ wire(L.d.r,D.d.A,nsq);
+ wire(L.e.r,D.e.A,udsq);
+ wire(L.f.r,D.f.A,nsq);
+ wire(D.e.K,Z.a.r,rlsq);
+ wire(Z.a.l,origin,udsq);
+ wire(D.b.K,D.e.K,nsq);
+ junction.a(D.e.K,"")(top);
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/makecirc/ejemplos.pdf b/graphics/metapost/contrib/macros/makecirc/ejemplos.pdf
new file mode 100644
index 0000000000..cf13fa545c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/ejemplos.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/makecirc/latex.mp b/graphics/metapost/contrib/macros/makecirc/latex.mp
new file mode 100644
index 0000000000..b2a88d1ad4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/latex.mp
@@ -0,0 +1,246 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% latex.mp Parametrizable latex labels for metapost
+%% Copyright (c) 2003 JL Diaz
+%% based on an idea taken from Metafun, by Hans Hagen
+%
+% This program may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.2 of this
+% license or (at your option) any later version. The latest version
+% of this license is in http://www.latex-project.org/lppl.txt and
+% version 1.2 or later is part of all distributions of LaTeX version
+% 1999/12/01 or later.
+%
+% This program consists of the file latex.mp
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% For the impatient: Jump to "USAGE"
+%
+% Introduction: The problem
+%
+% Let us suppose that you need to typeset several labels of the form
+% $x_1$, $x_2$, ... $x_{10}$. Since each label is a formula, the
+% construction btex/etex is required to typeset it through TeX (or
+% LaTeX). So, the straighforward solution is:
+%
+% label(btex $x_1$ etex, (1u,0u));
+% label(btex $x_2$ etex, (2u,0u));
+% ...
+% label(btex $x_{10}$ etex, (10u,0u));
+%
+% This repeated structure is inviting us to convert it into a for
+% loop. A naive attempt would be:
+%
+% for i=1 upto 10:
+% label (btex $x_{i}$ etex, (i*u, 0));
+% endfor;
+%
+% Unfortunately the above would produce ten times the same label
+% $x_{i}$, because i is not evaluated in this context as a variable.
+%
+% A second, more clever attempt would be:
+%
+% for i=1 upto 10:
+% label("btex $x_{" & decimal i & "}$ etex", (i*u, 0));
+% endfor;
+%
+% where we are making use of the string concatenation operator (&),
+% and the "decimal" operator, which produces an string whith the
+% decimal representation of its argument. This way, the macro label
+% will receive successively as first argument the strings: "btex
+% $x_{1}$ etex", "btex $x_{2}$ etex", end so on.
+%
+% This solution does not work either, because label is receiving a
+% string, instead of a picture (which is the result of a proper
+% btex/etex construction). When a string is received, label simply
+% outputs that string, without calling TeX (LaTeX) for formatting it.
+%
+% Metapost provides a way of "executing" the code which is stored in
+% a string, it is the scantokens primitive. So, it appears that a
+% modification of the label primitive would be possible, which
+% applies the scantokens primitive on the string which it receives as
+% parameter. Unfortunately this does not work either, because the way
+% in which btex/etex works procludes it use as argument of
+% scantokens.
+%
+% So, apparently, there is not an easy solution to the problem of
+% passing arguments to the etex/btex construct.
+%
+% The solution
+%
+% Since the construct btex/etex can only be used at the "top level"
+% of a source file, and not embedded in any string, the only way to
+% achieve the desired result is to store the string "btex ... etex"
+% in an external temporal file, and input back that file.
+%
+% This solution is implemented in the macro package "TEX.mp" which is
+% part of the standard metapost distribution. Using this package, the
+% problem of printing the ten labels $x_1$ .. $x_{10}$ becomes simple:
+%
+% for i=0 upto 10:
+% label(TEX("$x_{" & decimal i & "}$", (u*i,0));
+% endfor;
+%
+% The macro TEX receives an string as argument, and uses TeX to
+% typeset it. This is achieved, as already explained, by creating a
+% new string which encapsulated the given argument into a btex/etex
+% pair, writing this new string in an external file, and inputting
+% that file back.
+%
+% This approach has two main drawbacks:
+%
+% 1) An external file is created, and processed each time TEX is
+% used. This is very inefficient, and the slowdown is noticeable if
+% TEX is used often.
+%
+% 2) If we want to use latex istead of tex, the TEX macro will not
+% work, because the external file created through this macro does
+% not include the verbatimtex header required to initialize latex.
+%
+% Metafun approach: a clever solution
+%
+% In the excelent macro package Metafun (by Hans Hagens), a nice
+% solution is found to the first problem. Instead of writing the
+% auxiliar file and inputting it again, what is wrote is an auxiliar
+% metapost program which defines a serie of picture variables, each
+% one with the result of a btex/etex pair. In the first run of
+% metapost, this auxiliar file is write-only. In the second run, the
+% file is read at the beginning, so all picture variables get
+% defined. In this second run, each time the TEX macro is called, it
+% checks if the corresponding picture variable is already defined,
+% and in this case it simply returns its value.
+%
+% This approach is much more efficient, since a single externa file
+% is produced and processed, no matter how much the TEX macro is
+% called. The only drawback is that two metapost runs are required.
+%
+% latex.mp: my solution
+%
+% I liked very much the metafun solution, but I did not want to use
+% the whole Metafun package only to obtain this
+% functionality. Moreover, metafun relies in a set of external
+% scripts, which decide to input or not the external file, depending
+% on the existence of that file. I would prefer do not require perl
+% nor any other scripting language. Only metapost.
+%
+% This is why I wrote "latex.mp". It implements the idea in the
+% metafun package, but it does not require any external script in
+% order to check the existence of the auxiliar file.
+%
+% ================================================================
+%
+% USAGE
+%
+% input "latex";
+% initlatex(...);
+% ...
+%
+% latex("string to be formatted by latex");
+% % Returns a picture which can be used in a label
+%
+% The initlatex macro writes a latex header in an auxiliar file. You
+% do not need to call this macro if you use TeX as typesetting engine.
+%
+% On the other hand, if you want to use LaTeX as typesetting engine,
+% you need to call this macro before the first beginfig(). The macro
+% requires a mandatory argument, which is a string with adittional
+% macro commands to be placed before the "\begin{document}". For
+% example:
+%
+% initlatex("\usepackage[latin1]{inputenc}\usepackage{amsmath}");
+%
+% If you do not need any aditional package, you can use "" as
+% argument.
+%
+% You can use the latex macro in any place where a picture is
+% expected, as in the first argument of a label comand. For example:
+%
+% for i=0 upto 10:
+% label(latex("$x_{$ & decimal i & "}$", (u*i,0));
+% endfor;
+%
+% In order to correctly obtain the labels which use the latex macro,
+% you need to process your source file twice through metapost. The
+% first run all labels will show as "[?]", but the second run they
+% will have the correct value.
+%
+% IMPORTANT:
+%
+% If the text passed to the latex macro contains errors, latex will be
+% unable to complete its run. This will make impossible to run mpost
+% on the source, even if the errors are corrected, until you delete
+% the auxiliar file (which has .mpt extension)
+%
+%
+%================================================================
+% Implementation
+%
+numeric NumPic; % Total number of times that latex() macro has been
+ % called
+picture LaTeXPic[]; % Picture array which stores the result of each
+ % latex macro call. This array is filled when the
+ % axiliar file is read.
+string LaTeXsetup; % additional packages and macro definitions for latex
+
+% Initialization
+NumPic:=0;
+LaTeXsetup:="\documentclass{article}";
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Entry point
+%
+% The auxiliar file is read, but only if it exists
+%
+if readfrom(jobname&".mpt") <> EOF:
+ scantokens ("input "&jobname & ".mpt");
+fi;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% initlatex()
+%
+% By calling this function, the user can specify aditional packages and
+% macro definitions to the be used by latex.
+%
+% For example:
+%
+% initlatex("\usepackage[latin1]{inputenc}\usepackage{amsmath}");
+%
+% The global variable LaTeXsetup is also provided, mainly for third
+% party libraries which require to define their own macros. The
+% programmers of these libraries should append their own material to
+% the LaTeXsetup variable, by using the & operator. For example:
+%
+% LaTeXsetup:=LaTeXsetup & "\def\TO{\Longrightarrow}";
+%
+def initlatex primary s =
+ write "verbatimtex" to jobname & ".mpt";
+ write "%&latex" to jobname & ".mpt";
+ write LaTeXsetup to jobname & ".mpt";
+ write s to jobname & ".mpt";
+ write "\begin{document}" to jobname & ".mpt";
+ write "etex" to jobname & ".mpt";
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% latex()
+%
+% This macro receives a string, and returns a picture which contains
+% the result of running the string by latex. The result can be used
+% whenever a picture argument is expected, as for example in a label.
+
+vardef latex@#(expr txt) =
+ NumPic := NumPic + 1 ;
+ if string txt :
+ write "% figure " & decimal charcode & " : " & char(10) &
+ "LaTeXPic[" & decimal NumPic & "] := btex " &
+ txt & " etex ;" to jobname & ".mpt" ;
+ if unknown LaTeXPic[NumPic] :
+ thelabel@#("[??]",origin)
+ else :
+ thelabel@#(LaTeXPic[NumPic],origin)
+ fi
+ else :
+ thelabel@#(txt,origin)
+ fi
+enddef ;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% EOF
diff --git a/graphics/metapost/contrib/macros/makecirc/makecirc.mp b/graphics/metapost/contrib/macros/makecirc/makecirc.mp
new file mode 100644
index 0000000000..b104b3969b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/makecirc/makecirc.mp
@@ -0,0 +1,981 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%||||||||||||||||||||«makecirc.mp»|||||||||||||||||||||||||%%
+%%==========================================================%%
+%<------------------- version 1.1 ------------------------->%%
+% A MetaPost library for drawing electrical circuit diagrams.
+% Copyright (c) 2003 GS Bustamante Argañaraz.
+% It uses latex.mp by JL Diaz.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This program may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.2 of this
+% license or (at your option) any later version. The latest version
+% of this license is in http://www.latex-project.org/lppl.txt and
+% version 1.2 or later is part of all distributions of LaTeX version
+% 1999/12/01 or later.
+%
+% This program consists of the files makecirc.mp and latex.mp
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+input latex;
+%
+% Commands definitions to do the labeled easier %
+%
+LaTeXsetup:=LaTeXsetup &
+"\def\ohm{\ensuremath{\,\Omega}}" &
+"\def\kohm{\,k\ensuremath{\Omega}}" &
+"\def\modarg#1#2{\setbox0=\hbox{$\mkern-1mu/#2^\circ$}" &
+"\dp0=.21ex $#1\underline{\box0}$}";
+%
+newinternal labeling, rotatelabel, norotatelabel;
+labeling:=0; norotatelabel:=labeling; rotatelabel:=1;
+
+% Macros for the pens, I define them as such so when they expand,
+% look for the last value assigned to linewd and use it
+% (thanks to JLD). The linewd value assigns it as newinternal to
+% be able to change it «from out».
+
+newinternal linewd;
+linewd:=0.25mm;
+
+def line = pencircle scaled linewd enddef;
+def misc = pencircle scaled .8linewd enddef;
+
+% Arrowhead definitions %
+
+vardef miscahead expr p =
+save A,u,a,b; pair A,u; path a,b;
+A := point length(p) of p;
+u := unitvector(direction length(p)/2 of p);
+a := A--(A - ahlength*u rotated 15);
+b := A--(A - ahlength*u rotated -15);
+(a & reverse(a) & b & reverse(b))--cycle
+enddef;
+
+vardef bjtahead expr p =
+save A,u,a,b; pair A,u; path a,b;
+A := point 0.7length(p) of p;
+u := unitvector(direction length(p)/2 of p);
+a := A--(A - ahlength*u rotated 20);
+b := A--(A - ahlength*u rotated -20);
+(a & reverse(a) & b & reverse(b))--cycle
+enddef;
+
+vardef txtahead expr p =
+save A,B,u,a; pair A,B,u; path a;
+A := point length p of p;
+B := point .97length p of p;
+u := unitvector(direction length p of p);
+a := A{-u}..(A - 7*u rotated 15)--B
+ --(A - 7*u rotated -15)..A{u}--cycle;
+a
+enddef;
+
+% Macros for wire the symbols %
+
+newinternal nsq, udsq, rlsq, usq;
+nsq:=0; udsq:=2; rlsq:=3; usq:=4;
+
+def wire(expr pin_beg,pin_end,type)=
+ if type=nsq:
+ draw pin_beg--pin_end withpen line
+ elseif type=udsq:
+ draw pin_beg--(xpart pin_beg,ypart pin_end)--pin_end withpen line
+ elseif type=rlsq:
+ draw pin_beg--(xpart pin_end,ypart pin_beg)--pin_end withpen line
+ fi;
+enddef;
+
+% Macro to connect two branches in parallel %
+
+def wireU(expr pin_beg,pin_end,dist,type)=
+ if type=udsq:
+ draw pin_beg--(pin_beg+(0,dist))--(xpart pin_end,ypart pin_beg + dist)
+ --pin_end withpen line
+ elseif type=rlsq:
+ draw pin_beg--(pin_beg+(dist,0))--(xpart pin_beg + dist,ypart pin_end)
+ --pin_end withpen line
+ fi;
+enddef;
+
+% Variable to find the center of two pins, for to include a symbols. It returns the point
+% and the input angle for the symbol that we want to place.
+
+vardef centreof@#(expr pin_beg,pin_end,lchar)=
+ pair c@#; numeric phi@#;
+ c@#= -lchar*dir angle(xpart(pin_end)-xpart(pin_beg),
+ ypart(pin_end)-ypart(pin_beg)) shifted .5[pin_beg,pin_end];
+ phi@#=angle(xpart(pin_end)-xpart(pin_beg),
+ ypart(pin_end)-ypart(pin_beg));
+enddef;
+
+% Variable to center an element regarding the pins of another, at
+% a distance «dist» of the same one. It returns the point in which we should
+% place the symbol that we want to center.
+
+vardef centerto.@#(expr pinref_beg,pinref_end)(expr dist,elem)=
+ pair @#;
+ if (xpart(pinref_beg)=xpart(pinref_end)):
+ @#:=(.5[pinref_beg,pinref_end]+(dist,-elem))
+ elseif (ypart(pinref_beg)=ypart(pinref_end)):
+ @#:=(.5[pinref_beg,pinref_end]+(-elem,dist))
+ fi
+enddef;
+
+% Macro for scale the circuit when it is concluded. %
+
+def scalecirc expr factor =
+ currentpicture:=currentpicture scaled factor
+enddef;
+
+% Macro to include text into the circuits %
+
+vardef puttext@#(expr txt, point)=
+ label@#(latex(txt),point);
+enddef;
+
+% Macro to center text among two pins %
+
+newinternal witharrow, noarrow;
+witharrow:=0; noarrow:=1;
+
+vardef ctext@#(expr pin_beg,pin_end,txt,type)=
+ save ctxt; picture ctxt;
+ ctxt:=nullpicture;
+ %ahlength:=10;
+ if type=noarrow:
+ addto ctxt also thelabel(latex(txt),.5[pin_beg,pin_end]);
+ elseif type=witharrow:
+ addto ctxt doublepath pin_beg--pin_end;
+ addto ctxt contour txtahead pin_beg--pin_end;
+ addto ctxt contour txtahead reverse(pin_beg--pin_end);
+ addto ctxt also thelabel@#(latex(txt),.5[pin_beg,pin_end]);
+ fi;
+ draw ctxt withpen line;
+enddef;
+
+% Definition of lbsep (label separation), distance among symbol and label. %
+
+newinternal lbsep;
+lbsep:=3mm;
+
+% Macros to facilitate the one labeled of the symbols %
+
+def putlabel(expr pin_beg,pin_end,lchar,lcharv,ang,name,val)=
+if labeling=rotatelabel:
+ if ((ang > (-90)) and (ang <= 90)) or ((ang > 270) and (ang <= 450)):
+ label(latex("$" & name & "$") rotatedaround (.5[pin_beg,pin_end],ang),
+ (lchar+lbsep)*dir (90+ang) shifted .5[pin_beg,pin_end]);
+
+ label(latex(val) rotatedaround (.5[pin_beg,pin_end],ang),
+ (lcharv+lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif ((ang > 90) and (ang <= 270)) or ((ang > (-270)) and (ang <= (-90))):
+ label(latex("$" & name & "$") rotatedaround (.5[pin_beg,pin_end],180+ang),
+ (lchar+lbsep)*dir (90+ang) shifted .5[pin_beg,pin_end]);
+
+ label(latex(val) rotatedaround (.5[pin_beg,pin_end],180+ang),
+ (lcharv+lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ fi;
+ elseif labeling=norotatelabel:
+ if (ang = 0):
+ label.top(latex("$" & name & "$"), (lchar+.25lbsep)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.bot(latex(val),(lcharv+.25lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif (ang > 0) and (ang < 90):
+ label.ulft(latex("$" & name & "$"), (lchar)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.lrt(latex(val),(lcharv)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif (ang = 90):
+ label.lft(latex("$" & name & "$"),(lchar+.25lbsep)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.rt(latex(val),(lcharv+.25lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif (90 < ang) and (ang < 180):
+ label.llft(latex("$" & name & "$"),(lchar)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.urt(latex(val),(lcharv)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif (ang = 180) or (ang = (-180)):
+ label.bot(latex("$" & name & "$"), (lchar+.25lbsep)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.top(latex(val),(lcharv+.25lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif ((ang > 180) and (ang < 270)) or ((ang > (-180)) and (ang < (-90))):
+ label.lrt(latex("$" & name & "$"),(lchar)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.ulft(latex(val),(lcharv)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif (ang = 270) or (ang = (-90)):
+ label.rt(latex("$" & name & "$"), (lchar+.25lbsep)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.lft(latex(val),(lcharv+.25lbsep)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ elseif ((270 < ang) and (ang < 360)) or ((ang < 0) and (ang > (-90))):
+ label.urt(latex("$" & name & "$"),(lchar)*dir (90+ang)
+ shifted .5[pin_beg,pin_end]);
+
+ label.llft(latex(val),(lcharv)*dir (270+ang) shifted .5[pin_beg,pin_end]);
+ fi;
+ fi;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%% Here the symbols begin %%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%<---Inductor (bobina) --->%%%
+
+newinternal coil, Up, Down;
+coil:=2mm; Up:=0; Down:=1;
+
+vardef inductor@#(expr z,type,ang,name,val)=
+ save bobina;
+ pair L@#.l, L@#.r; % pines %
+ L@#.l=z; L@#.r=(z+(6coil,0)) rotatedaround (z,ang);
+ picture bobina;
+ bobina:=nullpicture;
+
+ if type=Up:
+ addto bobina doublepath z--(z+(coil,0)){up}.. for i=2 upto 4:
+ {down}(z+(i*coil,0)){up}.. endfor {down}(z+(5coil,0))--(z+(6coil,0));
+ putlabel(L@#.l,L@#.r,coil,.5coil,ang,name,val);
+ elseif type=Down:
+ addto bobina doublepath z--(z+(coil,0)){down}.. for i=2 upto 4:
+ {up}(z+(i*coil,0)){down}.. endfor {up}(z+(5coil,0))--(z+(6coil,0));
+ putlabel(L@#.l,L@#.r,coil,.5coil,(ang-180),name,val);
+ fi;
+
+ draw bobina rotatedaround(z,ang) withpen line;
+enddef;
+
+%%%<---Capacitor (condensador)--->%%%
+
+newinternal normal, electrolytic, variable, variant, platsep;
+normal:=0; electrolytic:=1; variable:=2; platsep:=1mm; variant:=3;
+
+vardef capacitor@#(expr z,type,ang,name,val)=
+ save cap;
+ pair C@#.l, C@#.r; % pines %
+ C@#.l:=z;
+ C@#.r:=(xpart(z)+7platsep,ypart(z)) rotatedaround(z,ang);
+ picture cap; cap:=nullpicture;
+
+ addto cap doublepath z--(xpart(z)+3platsep,ypart(z)) withpen line;
+ addto cap doublepath (xpart(z)+4platsep,ypart(z))
+ --(xpart(z)+7platsep,ypart(z)) withpen line;
+
+ if type=normal:
+ addto cap doublepath (xpart(z)+3platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+3platsep,ypart(z)+2.5platsep) withpen line;
+ addto cap doublepath (xpart(z)+4platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+4platsep,ypart(z)+2.5platsep) withpen line;
+ elseif type=electrolytic:
+ addto cap doublepath (xpart(z)+3platsep,ypart(z)-1.8platsep)
+ --(xpart(z)+3platsep,ypart(z)+1.8platsep) withpen line;
+ addto cap doublepath (xpart(z)+2platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+4platsep,ypart(z)-2.5platsep)--(xpart(z)+4platsep,ypart(z)+2.5platsep)
+ --(xpart(z)+2platsep,ypart(z)+2.5platsep) withpen line;
+ elseif type=variable:
+ addto cap doublepath (xpart(z)+3platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+3platsep,ypart(z)+2.5platsep) withpen line;
+ addto cap doublepath (xpart(z)+4platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+4platsep,ypart(z)+2.5platsep) withpen line;
+ addto cap doublepath (xpart(z)+platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+6platsep,ypart(z)+2.5platsep) withpen misc;
+ ahlength:=1.7platsep;
+ addto cap contour miscahead (xpart(z)+platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+6platsep,ypart(z)+2.5platsep) withpen misc;
+ elseif type=variant:
+ addto cap doublepath (xpart(z)+3platsep,ypart(z)-2.5platsep)
+ --(xpart(z)+3platsep,ypart(z)+2.5platsep) withpen line;
+ addto cap doublepath (z+(4.5platsep,-2.5platsep))..(z+(4platsep,0))
+ ..(z+(4.5platsep,2.5platsep)) withpen line;
+ fi;
+
+ draw cap rotatedaround(z,ang);
+
+ putlabel(C@#.l,C@#.r,2.5platsep,2.5platsep,ang,name,val);
+enddef;
+
+%%%<--- Electrical machines (maquinas electricas) --->%%%
+
+vardef motor@#(expr z,ang,name,val)=
+ save mot, p, q, r, s, ca, cb, c, hc;
+ pair M@#.D, M@#.B; % pines %
+ M@#.D:=z; M@#.B:=(z+(2ssize,0)) rotatedaround(z,ang);
+ picture mot; mot:=nullpicture;
+
+ addto mot doublepath z--(z+(.4ssize,0));
+ addto mot doublepath (z+(1.6ssize,0))--(z+(2ssize,0));
+ addto mot doublepath fullcircle scaled ssize shifted (z+(ssize,0));
+ addto mot also thelabel(latex("\textsf{M}") scaled (ssize/6mm)
+ rotated (-ang), (z+(ssize,0)));
+
+ path p,q,r,s,ca,cb,c,hc;
+ p=(z+(.6ssize,.075ssize))--(z+(.4ssize,.075ssize));
+ q=(z+(.4ssize,.075ssize))--(z+(.4ssize,-.075ssize));
+ ca=(z+(.4ssize,-.075ssize))--(z+(.6ssize,-.075ssize));
+
+
+ r=(z+(1.4ssize,.075ssize))--(z+(1.6ssize,.075ssize));
+ s=(z+(1.6ssize,.075ssize))--(z+(1.6ssize,-.075ssize));
+ cb=(z+(1.6ssize,-.075ssize))--(z+(1.4ssize,-.075ssize));
+
+ c=fullcircle scaled ssize shifted (z+(ssize,0));
+ hc=halfcircle scaled ssize rotated 270 shifted (z+(ssize,0));
+
+ addto mot contour buildcycle(p,q,ca,c);
+ addto mot doublepath buildcycle(p,q,ca,c);
+
+ addto mot contour buildcycle(cb,s,r,hc);
+ addto mot doublepath buildcycle(cb,s,r,hc);
+
+ draw mot rotatedaround(z,ang) withpen line;
+
+ putlabel(M@#.D,M@#.B,.5ssize,.5ssize,ang,name,val);
+enddef;
+
+vardef generator@#(expr z,ang,name,val)=
+ save gen;
+ pair G@#.D, G@#.B; % pines %
+ G@#.D:=z; G@#.B:=(z+(2ssize,0)) rotatedaround(z,ang);
+ picture gen; gen:=nullpicture;
+
+ addto gen doublepath z--(z+(.5ssize,0));
+ addto gen doublepath (z+(1.5ssize,0))--(z+(2ssize,0));
+ addto gen doublepath fullcircle scaled ssize shifted (z+(ssize,0));
+ addto gen also thelabel(latex("\textsf{G}") scaled (ssize/6mm)
+ rotated (-ang), (z+(ssize,0)));
+
+ draw gen rotatedaround(z,ang) withpen line;
+
+ putlabel(G@#.D,G@#.B,.5ssize,.5ssize,ang,name,val);
+enddef;
+
+newinternal mid, Fe, auto;
+mid:=1; Fe:=2; auto:=3;
+
+vardef transformer@#(expr z,type,ang)=
+ save trafo;
+ pair tf@#.pi, tf@#.ps, tf@#.si, tf@#.ss, tf@#.m;
+ tf@#.pi:=z; tf@#.ps:=(z+(0,8coil)) rotatedaround(z,ang);
+ tf@#.si:=(z+(2.4coil,0)) rotatedaround(z,ang);
+ tf@#.ss:=(z+(2.4coil,8coil)) rotatedaround(z,ang);
+ tf@#.m:=(z+(3.4coil,4coil)) rotatedaround(z,ang);
+
+ picture trafo; trafo:=nullpicture;
+
+ if type=normal:
+ tf@#.pi:=z; tf@#.ps:=(z+(0,8coil)) rotatedaround(z,ang);
+ tf@#.si:=(z+(2.4coil,0)) rotatedaround(z,ang);
+ tf@#.ss:=(z+(2.4coil,8coil)) rotatedaround(z,ang);
+ addto trafo doublepath z--(z+(0,coil)){right}..
+ for i=2 upto 6: {left}(z+(0,i*coil)){right}.. endfor
+ {left}(z+(0,7coil))--(z+(0,8coil));
+ addto trafo doublepath (z+(coil,coil))--(z+(coil,7coil));
+ addto trafo doublepath (z+(1.4coil,coil))--(z+(1.4coil,7coil));
+ addto trafo doublepath (z+(2.4coil,0))--(z+(2.4coil,coil)){left}..
+ for i=2 upto 6: {right}(z+(2.4coil,i*coil)){left}.. endfor
+ {right}(z+(2.4coil,7coil))--(z+(2.4coil,8coil));
+ elseif type=mid:
+ tf@#.pi:=z; tf@#.ps:=(z+(0,8coil)) rotatedaround(z,ang);
+ tf@#.si:=(z+(2.4coil,0)) rotatedaround(z,ang);
+ tf@#.ss:=(z+(2.4coil,8coil)) rotatedaround(z,ang);
+ tf@#.m:=(z+(3.4coil,4coil)) rotatedaround(z,ang);
+ addto trafo doublepath z--(z+(0,coil)){right}..
+ for i=2 upto 6: {left}(z+(0,i*coil)){right}.. endfor
+ {left}(z+(0,7coil))--(z+(0,8coil));
+ addto trafo doublepath (z+(coil,coil))--(z+(coil,7coil));
+ addto trafo doublepath (z+(1.4coil,coil))--(z+(1.4coil,7coil));
+ addto trafo doublepath (z+(2.4coil,0))--(z+(2.4coil,coil)){left}..
+ for i=2 upto 6: {right}(z+(2.4coil,i*coil)){left}.. endfor
+ {right}(z+(2.4coil,7coil))--(z+(2.4coil,8coil));
+ addto trafo doublepath (z+(2.4coil,4coil))--(z+(3.4coil,4coil));
+ elseif type=Fe:
+ tf@#.pi:=z rotatedaround(z,ang); tf@#.ps:=(z+(0,5.3coil)) rotatedaround(z,ang);
+ tf@#.si:=(z+(14coil,0)) rotatedaround(z,ang);
+ tf@#.ss:=(z+(14coil,5.228coil)) rotatedaround(z,ang);
+ addto trafo doublepath z+(2coil,-2.5coil)--z+(12coil,-2.5coil)
+ --z+(12coil,7.5coil)--z+(2coil,7.5coil)--cycle;
+ addto trafo doublepath z+(4coil,-.5coil)--z+(10coil,-.5coil)
+ --z+(10coil,5.5coil)--z+(4coil,5.5coil)--cycle;
+ addto trafo doublepath z--z+(2coil,0)--z+(4coil,0.728coil)
+ {right}..{left}z+(4coil,1.3*coil);
+ for i=1 upto 4:
+ addto trafo doublepath z+(2coil,(i+.5)*coil){left}..
+ {right}z+(2coil,i*coil)--z+(4coil,(i+0.728)*coil)
+ {right}..{left}z+(4coil,(i+1.3)*coil);
+ endfor;
+ addto trafo doublepath z+(2coil,5.3coil)--z+(0,5.3coil);
+ for i=0 upto 3:
+ addto trafo doublepath z+(10coil,i*coil){left}..
+ {right}z+(10coil,(i+.5)*coil)--z+(12coil,(i+.5+0.728)*coil)
+ {right}..{left}z+(12coil,(i+.656)*coil);
+ endfor;
+ addto trafo doublepath z+(10coil,4coil){left}..{right}
+ z+(10coil,4.5coil)--z+(12coil,5.228coil)--z+(14coil,5.228coil);
+ addto trafo doublepath z+(12coil,0)--z+(14coil,0);
+ elseif type=auto:
+ tf@#.pi:=z rotatedaround(z,ang); tf@#.ps:=(z+(0,4coil)) rotatedaround(z,ang);
+ tf@#.si:=(z+(4coil,-6coil)) rotatedaround(z,ang);
+ tf@#.ss:=(z+(4coil,4coil)) rotatedaround(z,ang);
+ addto trafo doublepath z--z+(2coil,0);
+ addto trafo doublepath z+(2coil,-6coil)--z+(2coil,-5coil){right}..
+ for i=2 upto 10: {left}(z+(2coil,(i-6)*coil)){right}.. endfor
+ {left}(z+(2coil,5coil))--z+(2coil,6coil)--z+(0,6coil);
+ addto trafo doublepath z+(2coil,6coil)--z+(4coil,6coil);
+ addto trafo doublepath z+(2coil,-6coil)--z+(4coil,-6coil);
+ fi;
+
+ draw trafo rotatedaround(z,ang) withpen line;
+enddef;
+
+%%%<---Sources (fuentes de alimentaci'on)--->%%%
+
+newinternal AC,DC,I,V,ssize;
+AC:=1; DC:=0; I:=2; V:=3; ssize:=6mm;
+
+vardef source@#(expr z,type,ang,name,val)=
+ save fuente, positive, negative, seno;
+ pair S@#.p,S@#.n; % pines %
+ if (type=AC) or (type=I) or (type=V):
+ S@#.n:=z;
+ S@#.p:=(z+(2ssize,0)) rotatedaround(z,ang);
+ elseif type=DC:
+ S@#.p:=(z+(ssize,0)) rotatedaround(z,ang);
+ S@#.n:=z;
+ fi;
+
+ picture fuente, positive, negative, seno;
+ positive:=nullpicture; negative:=nullpicture;
+
+ addto positive doublepath (z+(1.05ssize,0))--(z+(1.45ssize,0)) withpen misc;
+ addto positive doublepath (z+(1.25ssize,-.2ssize))--(z+(1.25ssize,.2ssize)) withpen misc;
+ addto negative doublepath (z+(.95ssize,0))--(z+(.55ssize,0)) withpen misc;
+
+ seno:=nullpicture;
+ addto seno doublepath (z+(2ssize/3,0)){dir 45}
+ ..{right}.5[z+(2ssize/3,.2ssize),z+(ssize,.2ssize)]..{dir -45}(z+(ssize,0))
+ ..{right}.5[z+(ssize,-.2ssize),z+(4ssize/3,-.2ssize)]..{dir 45}(z+(4ssize/3,0))
+ withpen line;
+
+ fuente:=nullpicture;
+ if (type=AC) or (type=I) or (type=V):
+ addto fuente doublepath z--(z+(.5ssize,0)) withpen line;
+ addto fuente doublepath (z+(1.5ssize,0))--(z+(2ssize,0)) withpen line;
+ addto fuente doublepath fullcircle scaled ssize shifted (z+(ssize,0))
+ withpen line;
+ if type=AC:
+ addto fuente also seno rotatedaround((z+(ssize,0)),-ang);
+ elseif type=I:
+ ahlength:=4ssize/15; ahangle:=30;
+ addto fuente doublepath (z+(ssize-ssize/3,0))--(z+(ssize+ssize/3,0))
+ withpen line;
+ addto fuente contour arrowhead (z+(ssize-ssize/3,0))--(z+(ssize+ssize/3,0))
+ withpen line;
+ ahlength:=4; ahangle:=45;
+ elseif type=V:
+ addto fuente also positive rotatedaround(z+(1.25ssize,0),-ang);
+ addto fuente also negative rotatedaround(z+(.75ssize,0),-ang);
+ fi;
+ elseif type=DC:
+ addto fuente doublepath z--(z+(0.4ssize,0)) withpen line;
+ addto fuente doublepath (z+(.6ssize,0))--(z+(ssize,0)) withpen line;
+ addto fuente doublepath (z+(.4ssize,-.2ssize))--(z+(.4ssize,.2ssize)) withpen line;
+ addto fuente doublepath (z+(.6ssize,-.6ssize))--(z+(.6ssize,.6ssize)) withpen line;
+ fi;
+
+ if (type=AC) or (type=V) or (type=I):
+ putlabel(S@#.n,S@#.p,.5ssize,.5ssize,ang,name,val);
+ elseif (type=DC):
+ putlabel(S@#.n,S@#.p,.6ssize,.6ssize,ang,name,val);
+ fi;
+
+ draw fuente rotatedaround (z,ang);
+enddef;
+
+%%%<---Resistor (Resistencia)--->%%%
+
+newinternal rstlth;
+rstlth:=2mm;
+
+vardef resistor@#(expr z,type,ang,name,val)=
+ save rst;
+ pair R@#.l,R@#.r; % pines %
+ R@#.l:=z;
+ R@#.r:=(z+(7rstlth,0)) rotatedaround(z,ang);
+ picture rst;
+ rst:=nullpicture;
+ addto rst doublepath z--(z+(2rstlth,0))--(z+(2.25rstlth,.75rstlth))--
+ for i=.5 step .5 until 2.5: (z+((2.25+i)*rstlth,((-1)**(2i))*.75rstlth))--
+ endfor (z+(5rstlth,0))--(z+(7rstlth,0)) withpen line;
+ if type=normal:
+ % no change %
+ elseif type=variable:
+ ahlength:=.8rstlth;
+ addto rst doublepath (z+(2rstlth,-rstlth))--(z+(5.5rstlth,rstlth)) withpen misc;
+ addto rst contour miscahead (z+(2rstlth,-rstlth))--(z+(5.5rstlth,rstlth))
+ withpen misc;
+ fi;
+
+ putlabel(R@#.l,R@#.r,.8rstlth,.8rstlth,ang,name,val);
+
+ draw rst rotatedaround(z,ang);
+enddef;
+
+%%%<--- Diode (diodo) --->%%%
+newinternal zener, LED, diodeht, pinK, pinA;
+zener:=1; LED:=2; diodeht:=3.5mm; pinK:=3; pinA:=4;
+
+vardef diode@#(expr z,type,ang,pin,name,val)=
+ save diodo;
+ pair D@#.K,D@#.A; % pines %
+ picture diodo;
+ diodo:=nullpicture;
+
+ addto diodo doublepath z--(z+(diodeht,0))--(z+(diodeht,.5diodeht))
+ --(z+(2diodeht,0))--(z+(diodeht,-.5diodeht))--(z+(diodeht,0)) withpen line;
+ addto diodo doublepath (z+(2diodeht,0))--(z+(3diodeht,0)) withpen line;
+
+ if type=normal:
+ addto diodo doublepath (z+(2diodeht,-.5diodeht))--(z+(2diodeht,.5diodeht))
+ withpen line;
+ elseif type=zener:
+ addto diodo doublepath (z+(2.5diodeht,-.5diodeht))--(z+(2diodeht,-.5diodeht))
+ --(z+(2diodeht,.5diodeht))--(z+(1.5diodeht,.5diodeht)) withpen line;
+ elseif type=LED:
+ addto diodo doublepath (z+(2diodeht,-.5diodeht))--(z+(2diodeht,.5diodeht))
+ withpen line;
+
+ addto diodo doublepath (0.25diodeht*dir
+ (angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted (z+(2diodeht,.5diodeht)))
+ --(diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))+270) shifted
+ (0.25diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted
+ (z+(2diodeht,.5diodeht)))) withpen misc;
+
+ addto diodo doublepath (0.6diodeht*dir
+ (angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted (z+(2diodeht,.5diodeht)))
+ --(diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))+270) shifted
+ (0.6diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted
+ (z+(2diodeht,.5diodeht)))) withpen misc;
+
+ ahlength:=.4diodeht; ahangle:=30;
+ addto diodo contour arrowhead (0.25diodeht*dir
+ (angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted (z+(2diodeht,.5diodeht)))
+ --(diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))+270) shifted
+ (0.25diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted
+ (z+(2diodeht,.5diodeht)))) withpen misc;
+
+ addto diodo contour arrowhead (0.6diodeht*dir
+ (angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted (z+(2diodeht,.5diodeht)))
+ --(diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))+270) shifted
+ (0.6diodeht*dir(angle(xpart(z+(diodeht,.5diodeht))-xpart(z+(2diodeht,0)),
+ ypart(z+(diodeht,.5diodeht))-ypart(z+(2diodeht,0)))) shifted
+ (z+(2diodeht,.5diodeht)))) withpen misc;
+ ahlength:=4; ahangle:=45;
+ fi;
+
+ if pin=pinA:
+ D@#.A:=z;
+ D@#.K:=(z+(3diodeht,0)) rotatedaround(z,ang);
+ draw diodo rotatedaround(z,ang);
+ elseif pin=pinK:
+ D@#.K:=z;
+ D@#.A:=(z+(3diodeht,0)) rotatedaround(z,ang);
+ diodo:=diodo rotatedaround(.5[z,(z+(3diodeht,0))],180);
+ draw diodo rotatedaround(z,ang);
+ fi;
+
+ if (type=normal) or (type=zener):
+ putlabel(D@#.A,D@#.K,.6diodeht,.6diodeht,ang,name,val);
+ elseif (type=LED):
+ putlabel(D@#.A,D@#.K,1.5diodeht,.6diodeht,ang,name,val);
+ fi;
+enddef;
+
+%%%<--- Transistor --->%%%
+newinternal npn, pnp, cnpn, cpnp, bjtlth;
+npn:=1; pnp:=-1; cnpn:=0; cpnp:=2; bjtlth:=7mm;
+
+vardef transistor@#(expr z,type,ang)=
+ save BJT;
+ pair T@#.B,T@#.E,T@#.C; % pines: Base, Emisor, Colector %
+ T@#.B:=z;
+ T@#.E:=(z+(bjtlth,-.75bjtlth)) rotatedaround(z,ang);
+ T@#.C:=(z+(bjtlth,.75bjtlth)) rotatedaround(z,ang);
+ picture BJT;
+ BJT:=nullpicture;
+
+ addto BJT doublepath z--(z+(.5bjtlth,0)) withpen line;
+ addto BJT doublepath (z+(.5bjtlth,-.5bjtlth))--(z+(.5bjtlth,.5bjtlth)) withpen line;
+ addto BJT doublepath (z+(.5bjtlth,.2bjtlth))--(z+(bjtlth,.5bjtlth))
+ --(z+(bjtlth,.75bjtlth)) withpen line;
+
+ if type=npn:
+ addto BJT doublepath (z+(.5bjtlth,-.2bjtlth))--(z+(bjtlth,-.5bjtlth))
+ --(z+(bjtlth,-.75bjtlth)) withpen line;
+ addto BJT contour bjtahead (z+(.5bjtlth,-.2bjtlth))
+ --(z+(bjtlth,-.5bjtlth)) withpen line;
+ elseif type=cnpn:
+ addto BJT doublepath (z+(.5bjtlth,-.2bjtlth))--(z+(bjtlth,-.5bjtlth))
+ --(z+(bjtlth,-.75bjtlth)) withpen line;
+ addto BJT contour bjtahead (z+(.5bjtlth,-.2bjtlth))
+ --(z+(bjtlth,-.5bjtlth)) withpen line;
+ addto BJT doublepath fullcircle scaled 1.3bjtlth shifted (z+(.65bjtlth,0))
+ withpen line;
+ elseif type=pnp:
+ addto BJT doublepath (z+(bjtlth,-.75bjtlth))--(z+(bjtlth,-.5bjtlth))
+ --(z+(.5bjtlth,-.2bjtlth)) withpen line;
+ addto BJT contour bjtahead (z+(bjtlth,-.5bjtlth))
+ --(z+(.5bjtlth,-.2bjtlth)) withpen line;
+ elseif type=cpnp:
+ addto BJT doublepath (z+(bjtlth,-.75bjtlth))--(z+(bjtlth,-.5bjtlth))
+ --(z+(.5bjtlth,-.2bjtlth)) withpen line;
+ addto BJT contour bjtahead (z+(bjtlth,-.5bjtlth))
+ --(z+(.5bjtlth,-.2bjtlth)) withpen line;
+ addto BJT doublepath fullcircle scaled 1.3bjtlth shifted (z+(.65bjtlth,0)) withpen line;
+ fi;
+
+ draw BJT rotatedaround(z,ang);
+enddef;
+
+%%%<--- Measurement instruments (Intrumentos de medicion)--->%%%
+newinternal volt, ampere, watt;
+volt:=0; ampere:=1; watt:=2;
+
+vardef meains@#(expr z,type,ang,name)=
+ save meter;
+ pair mi@#.l, mi@#.r, mi@#.p; % pines %
+ mi@#.l:=z; mi@#.r:=(z+(2ssize,0)) rotatedaround(z,ang);
+
+ picture meter; meter:=nullpicture;
+ addto meter doublepath z--(z+(.5ssize,0));
+ addto meter doublepath (z+(1.5ssize,0))--(z+(2ssize,0));
+ if (type=volt) or (type=ampere):
+ addto meter doublepath fullcircle scaled ssize shifted (z+(ssize,0));
+ if type=volt:
+ addto meter also thelabel(latex("\textsf{V}") scaled (ssize/6mm)
+ rotated (-ang), (z+(ssize,0)));
+ elseif type=ampere:
+ addto meter also thelabel(latex("\textsf{A}") scaled (ssize/6mm)
+ rotated (-ang), (z+(ssize,0)));
+ fi;
+ elseif (type=watt):
+ mi@#.p:=(z+(ssize,-ssize)) rotatedaround(z,ang);
+ addto meter doublepath (z+(.5ssize,-.5ssize))--(z+(.5ssize,.5ssize))
+ --(z+(1.5ssize,.5ssize))--(z+(1.5ssize,-.5ssize))--cycle;
+ addto meter doublepath (z+(ssize,-.5ssize))--(z+(ssize,-ssize));
+ addto meter also thelabel(latex("\textsf{W}") scaled (ssize/6mm)
+ rotated (-ang), (z+(ssize,0)));
+ fi;
+
+ draw meter rotatedaround(z,ang) withpen line;
+
+ if labeling=rotatelabel:
+ if ((ang > (-90)) and (ang <= 90)) or ((ang > 270) and (ang <= 450)):
+ label(latex(name) rotatedaround (.5[mi@#.l,mi@#.r],ang),
+ (.5ssize+lbsep)*dir (90+ang) shifted .5[mi@#.l,mi@#.r]);
+ elseif ((ang > 90) and (ang <= 270)) or ((ang > (-270)) and (ang <= (-90))):
+ label(latex(name) rotatedaround (.5[mi@#.l,mi@#.r],180+ang),
+ (.5ssize+lbsep)*dir (90+ang) shifted .5[mi@#.l,mi@#.r]);
+ fi;
+ elseif labeling=norotatelabel:
+ if (ang = 0):
+ label.top(latex(name), (.5ssize+.25lbsep)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif (ang > 0) and (ang < 90):
+ label.ulft(latex(name), (.5ssize)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif (ang = 90):
+ label.lft(latex(name),(.5ssize+.25lbsep)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif (90 < ang) and (ang < 180):
+ label.llft(latex(name),(.5ssize)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif (ang = 180) or (ang = (-180)):
+ label.bot(latex(name), (.5ssize+.25lbsep)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif ((ang > 180) and (ang < 270)) or ((ang > (-180)) and (ang < (-90))):
+ label.lrt(latex(name),(.5ssize)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif (ang = 270) or (ang = (-90)):
+ label.rt(latex(name), (.5ssize+.25lbsep)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ elseif ((270 < ang) and (ang < 360)) or ((ang < 0) and (ang > (-90))):
+ label.urt(latex(name),(.5ssize)*dir (90+ang)
+ shifted .5[mi@#.l,mi@#.r]);
+ fi;
+ fi;
+enddef;
+
+%%%<--- Miscellaneous symbols --->%%%
+
+newinternal gndlth, implth, simple, shield;
+gndlth:=5mm; implth:=7mm; simple:=1; shield:=2;
+
+vardef ground@#(expr z,type,ang)=
+ save GND;
+ pair gnd@#; % unico pin %
+ gnd@#:=z;
+ picture GND; GND:=nullpicture;
+ addto GND doublepath z--(z+(0,-.5gndlth)) withpen line;
+ if type=shield:
+ addto GND doublepath (z+(-.5gndlth,-.5gndlth))--(z+(.5gndlth,-.5gndlth)) withpen line;
+ addto GND doublepath (z+(-.35gndlth,-.6gndlth))--(z+(.35gndlth,-.6gndlth)) withpen line;
+ addto GND doublepath (z+(-.2gndlth,-.7gndlth))--(z+(.2gndlth,-.7gndlth)) withpen line;
+ elseif type=simple:
+ addto GND doublepath (z+(-.5gndlth,-.5gndlth))--(z+(.5gndlth,-.5gndlth))
+ withpen pencircle scaled 2linewd;
+ fi;
+ draw GND rotatedaround(z,ang);
+enddef;
+
+newinternal junctiondiam;
+junctiondiam:=1.25mm;
+
+vardef junction@#(expr z,name)(suffix $)=
+ pair J@#; J@#:=z;
+ draw z withpen pencircle scaled junctiondiam;
+ label.$(latex(name),z);
+enddef;
+
+vardef impedance@#(expr z,ang,name,val)=
+ save imp;
+ pair Z@#.l, Z@#.r; % pines %
+ Z@#.l:=z;
+ Z@#.r:=(z+(1.5implth,0)) rotatedaround(z,ang);
+ picture imp; imp:=nullpicture;
+
+ addto imp doublepath z--(z+(.25implth,0));
+ addto imp doublepath (z+(.25implth,-.18implth))--(z+(.25implth,.18implth))
+ --(z+(1.25implth,.18implth))--(z+(1.25implth,-.18implth))--cycle;
+ addto imp doublepath (z+(1.25implth,0))--(z+(1.5implth,0));
+
+ draw imp rotatedaround(z,ang) withpen line;
+
+ putlabel(Z@#.l,Z@#.r,.2implth,.2implth,ang,name,val);
+enddef;
+
+vardef lamp@#(expr z,ang,name,val)=
+ save ampl, p, q, r, s;
+ pair La@#.l,La@#.r; % pines %
+ La@#.l:=z; La@#.r:=(z+(2ssize,0)) rotatedaround(z,ang);
+
+ picture ampl; ampl:=nullpicture;
+
+ addto ampl doublepath z--(z+(.5ssize,0));
+ addto ampl doublepath fullcircle scaled ssize shifted (z+(ssize,0));
+ addto ampl doublepath (z+(1.5ssize,0))--(z+(2ssize,0));
+
+ pair p, q, r, s;
+ p=(-ssize*dir 45 shifted (z+(ssize,0))--(z+(ssize,0))) intersectionpoint
+ (fullcircle scaled ssize shifted (z+(ssize,0)));
+ q=(ssize*dir 45 shifted (z+(ssize,0))--(z+(ssize,0))) intersectionpoint
+ (fullcircle scaled ssize shifted (z+(ssize,0)));
+ r=(-ssize*dir (-45) shifted (z+(ssize,0))--(z+(ssize,0))) intersectionpoint
+ (fullcircle scaled ssize shifted (z+(ssize,0)));
+ s=(ssize*dir (-45) shifted (z+(ssize,0))--(z+(ssize,0))) intersectionpoint
+ (fullcircle scaled ssize shifted (z+(ssize,0)));
+
+ addto ampl doublepath p--q;
+ addto ampl doublepath r--s;
+
+ draw ampl rotatedaround(z,ang) withpen line;
+
+ putlabel(La@#.l,La@#.r,.5ssize,.5ssize,ang,name,val);
+enddef;
+
+%%%<--- Switches (Llaves) --->%%%
+
+newinternal NO, NC, ssep, swt;
+NO:=0; NC:=1; ssep:=3mm; swt:=1.2ssep;
+
+vardef switch@#(expr z,type,ang,name,val)=
+ save swt;
+ pair st@#.l, st@#.r;
+ st@#.l:=z; st@#.r:= (z+(2.4ssep,0)) rotatedaround(z,ang);
+ picture swt; swt:=nullpicture;
+
+ addto swt doublepath z--(z+(.7ssep,0));
+ addto swt doublepath (z+(1.7ssep,ssep/3))--(z+(1.7ssep,0))--(z+(2.4ssep,0));
+
+ if type=NO:
+ addto swt doublepath (z+(.7ssep,0))--(z+(1.8ssep,.7ssep));
+ elseif type=NC:
+ addto swt doublepath (z+(.7ssep,0))--(z+(2ssep,ssep/3));
+ fi;
+
+ draw swt rotatedaround(z,ang) withpen line;
+
+ putlabel(st@#.l,st@#.r,.6ssep,.6ssep,ang,name,val);
+enddef;
+
+%%%<--- Battery (bater'ia) --->%%%
+
+vardef battery@#(expr z,ang,name,val)=
+ save bat;
+ pair B@#.n, B@#.p;
+ B@#.n:=z; B@#.p:=(z+(1.8ssize,0)) rotatedaround(z,ang);
+
+ picture bat; bat:=nullpicture;
+ addto bat doublepath z--(z+(0.4ssize,0)) withpen line;
+ addto bat doublepath (z+(1.4ssize,0))--(z+(1.8ssize,0));
+ for i=0 upto 2:
+ addto bat doublepath (z+((.4+.4i)*ssize,-.2ssize))--(z+((.4+.4i)*ssize,.2ssize));
+ addto bat doublepath (z+((.6+.4i)*ssize,-.6ssize))--(z+((.6+.4i)*ssize,.6ssize));
+ endfor;
+
+ draw bat rotatedaround(z,ang) withpen line;
+
+ putlabel(B@#.n,B@#.p,.6ssize,.6ssize,ang,name,val);
+enddef;
+
+%%%<--- Current (Corriente) --->%%%
+
+vardef current@#(expr z,ang,name,val)=
+ save cur;
+ pair i@#.s,i@#.d;
+ i@#.s:=z; i@#.d:=(z+(3platsep,0)) rotatedaround(z,ang);
+ ahangle:=20; ahlength:=3platsep;
+ picture cur; cur:=nullpicture;
+ addto cur contour arrowhead z--(z+(3platsep,0));
+
+ draw cur rotatedaround(z,ang) withpen line;
+
+ putlabel(i@#.s,i@#.d,.5platsep,.5platsep,ang,name,val);
+
+ ahangle:=45; ahlength:=4;
+enddef;
+
+%%%<--- Mesh current (corriente de malla) --->%%%
+
+newinternal cw, ccw;
+cw:=0; ccw:=1;
+
+def imesh(expr c,wd,ht,dire,ang,name)=
+ save im,r; picture im; numeric r;
+ ahlength:=3platsep; ahangle:=20;
+ if ht > wd: r=.2wd elseif ht < wd: r=.2ht fi;
+ im:=nullpicture;
+ if dire=cw:
+ addto im doublepath (xpart c - .5wd, ypart c - .5ht)
+ --(xpart c - .5wd, ypart c + .5ht-r){up}
+ ..{right}(xpart c - .5wd + r, ypart c + .5ht)
+ --(xpart c + .5wd - r, ypart c + .5ht){right}
+ ..{down}(xpart c + .5wd,ypart c + .5ht - r)
+ --(xpart c + .5wd,ypart c - .5ht + r){down}
+ ..{left}(xpart c + .5wd - r,ypart c - .5ht)
+ --(xpart c - .25wd, ypart c - .5ht);
+ addto im contour arrowhead (xpart c - .5wd, ypart c - .5ht)
+ --(xpart c - .5wd, ypart c + .5ht-r){up}
+ ..{right}(xpart c - .5wd + r, ypart c + .5ht)
+ --(xpart c + .5wd - r, ypart c + .5ht){right}
+ ..{down}(xpart c + .5wd,ypart c + .5ht - r)
+ --(xpart c + .5wd,ypart c - .5ht + r){down}
+ ..{left}(xpart c + .5wd - r,ypart c - .5ht)
+ --(xpart c - .25wd, ypart c - .5ht);
+ elseif dire=ccw:
+ addto im doublepath (xpart c + .5wd, ypart c - .5ht)
+ --(xpart c + .5wd, ypart c + .5ht-r){up}
+ ..{left}(xpart c + .5wd - r, ypart c + .5ht)
+ --(xpart c - .5wd + r, ypart c + .5ht){left}
+ ..{down}(xpart c - .5wd,ypart c + .5ht - r)
+ --(xpart c - .5wd,ypart c - .5ht + r){down}
+ ..{right}(xpart c - .5wd + r,ypart c - .5ht)
+ --(xpart c + .25wd, ypart c - .5ht);
+ addto im contour arrowhead (xpart c + .5wd, ypart c - .5ht)
+ --(xpart c + .5wd, ypart c + .5ht-r){up}
+ ..{left}(xpart c + .5wd - r, ypart c + .5ht)
+ --(xpart c - .5wd + r, ypart c + .5ht){left}
+ ..{down}(xpart c + .5wd,ypart c + .5ht - r)
+ --(xpart c - .5wd,ypart c - .5ht + r){down}
+ ..{right}(xpart c - .5wd + r,ypart c - .5ht)
+ --(xpart c + .25wd, ypart c - .5ht);
+ fi;
+
+ if labeling=rotatelabel:
+ addto im also thelabel(latex("$" & name & "$"),c);
+ elseif labeling=norotatelabel:
+ addto im also thelabel(latex("$" & name & "$") rotatedaround(c,-ang),c);
+ fi;
+
+ draw im rotatedaround (c,ang) withpen line;
+enddef;
+
+%%%<--- Reostatos --->%%%
+
+newinternal rheolth, Rrheo, Lrheo;
+rheolth:=2mm; Rrheo:=1; Lrheo:=2;
+
+vardef rheostat@#(expr z,type,ang)=
+ save reo; picture reo; reo:=nullpicture;
+ pair rh@#.i, rh@#.s, rh@#.r;
+ rh@#.i:=z; rh@#.s:=(z+(0,6rheolth)) rotatedaround(z,ang);
+ rh@#.r:=(z+(3rheolth,6rheolth)) rotatedaround(z,ang);
+
+ ahangle:=20; ahlength:=rheolth;
+
+ if type=Lrheo:
+ addto reo doublepath (z+(6rheolth,-3rheolth))--(z+(4rheolth,-3rheolth))
+ --(z+(4rheolth,-.7rheolth));
+ addto reo contour arrowhead (z+(6rheolth,-3rheolth))--(z+(4rheolth,-3rheolth))
+ --(z+(4rheolth,-.9rheolth));
+
+ addto reo doublepath z--(z+(rheolth,0)){down}.. for i=2 upto 4:
+ {up}(z+(i*rheolth,0)){down}.. endfor {up}(z+(5rheolth,0))--(z+(6rheolth,0));
+
+ reo:=reo rotatedaround(z,90);
+ elseif type=Rrheo:
+ addto reo doublepath (z+(6rheolth,-3rheolth))--(z+(4rheolth,-3rheolth))
+ --(z+(4rheolth,-.7rheolth));
+ addto reo contour arrowhead (z+(6rheolth,-3rheolth))--(z+(4rheolth,-3rheolth))
+ --(z+(4rheolth,-.9rheolth));
+
+ addto reo doublepath z--(z+(1.5rheolth,0))--(z+(1.75rheolth,.75rheolth))--
+ for i=.5 step .5 until 2.5: (z+((1.75+i)*rheolth,((-1)**(2i))*.75rheolth))--
+ endfor (z+(4.5rheolth,0))--(z+(6rheolth,0)) withpen line;
+
+ reo:=reo rotatedaround(z,90);
+ fi;
+ draw reo rotatedaround(z,ang) withpen line;
+enddef;
+
+% Definiciones de las longitudes de centrado,
+% las hago como macros para que cambien de
+% valor cuando lo hagan las dimensiones
+% caracter'isticas de cada s'imbolo.
+
+def res = 3.5rstlth enddef; % 1
+def ind = 3coil enddef; % 2
+def cap = 3.5platsep enddef; % 3
+def sac = ssize enddef; % 4
+def sv = ssize enddef; % 5
+def si = ssize enddef; % 6
+def sdc = .5ssize enddef; % 7
+def mot = ssize enddef; % 8
+def gen = ssize enddef; % 9
+def tra = 4coil enddef; %10
+def ins = ssize enddef; %11
+def dio = 1.5diodeht enddef; %12
+def bjt = .5bjtlth enddef; %13
+def imp = .75implth enddef; %14
+def lam = ssize enddef; %15
+def swt = 1.2ssep enddef; %16
+def bat = .9ssize enddef; %17
+def cur = 1.5platsep enddef; %18
+
+%% END %% \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/matlab/Makefile b/graphics/metapost/contrib/macros/matlab/Makefile
new file mode 100644
index 0000000000..33b9039800
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/Makefile
@@ -0,0 +1,22 @@
+all : simple.ps example.ps doc
+simple.ps: simple.mp
+ rm -f ltx-simple*
+ mpost simple
+ mpost simple
+ tex mproof simple.1
+ dvips -f mproof.dvi > simple.ps
+
+example.ps: example.mp
+ rm -f ltx-example*
+ mpost example
+ mpost example
+ tex mproof example.1
+ dvips -f mproof.dvi > example.ps
+
+doc: matlab.ps
+
+matlab.ps: matlab.dvi
+ dvips -f matlab.dvi > matlab.ps
+
+matlab.dvi:matlab.tex lstmp.tex
+ latex matlab.tex
diff --git a/graphics/metapost/contrib/macros/matlab/README b/graphics/metapost/contrib/macros/matlab/README
new file mode 100644
index 0000000000..b736a9c93e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/README
@@ -0,0 +1,36 @@
+matlab.mp ------- Metapost data plotting in matlab style
+
+Yang Yang yangyang@juggler.ucsd.edu
+
+March 3 2005
+
+
+Matlab has powerful data plotting ability, but one annoying problem
+prevents it from being perfect: when you increase the linewidth, the
+dotted line size stays the same, so the plotted line no longer looks
+like a dotted line.
+
+another problem is matlab bug: it oftern cuts away some curves and
+captions.
+
+plus, matlab is expensive. on the other hand, the free gnuplot also
+doesn't produce very satisfactory visual effects.
+
+
+I got accustomed to matlab's easy interface. so I want to integerate
+the powerful graphic function of Metapost and the easy interface of
+Matlab. so I wrote this script matlab.mp. this is based on graph.mp, I
+just collected the data into 2-D arrays, and remembered the line
+styles, so it's easy to plot out legends.
+
+FEATURES:
+all kinds of line color, width, style (dotted/dashed, etc), and
+markers. you can easily expand this by modifying the code.
+
+easy interface. very similar to matlab
+
+full power of latex in caption/legends, by using the latexmp package.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/matlab/example.mp b/graphics/metapost/contrib/macros/matlab/example.mp
new file mode 100644
index 0000000000..8126c44cf2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/example.mp
@@ -0,0 +1,21 @@
+
+input matlab.mp
+prologues:=0;
+beginfig(1)
+draw begingrf(5in,4in);
+rdata("sample_data",1);
+rdata("sample_data",2);
+rdata("sample_data",3);
+rdata("sample_data",4);
+mtplot("0 2 cr linewidth 2 td");
+mtplot("0 3 cb linewidth 1 solid ");
+mtplot("0 1 cg linewidth 4 pdot ");
+
+ylabel("blahblah");
+xlabel("data from an arbitrary sample\_data");
+finishgrf;
+legend(3,3,"$\alpha \geq \beta$ \bf BoldFace\it italic","ABCDEXYZZZZ","blahblah");
+legend(3,1,"\bf you can have multiple legends ! \tt :)","ABCDEXYZZZZ","blahblah");
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/matlab/latexmp.mp b/graphics/metapost/contrib/macros/matlab/latexmp.mp
new file mode 100644
index 0000000000..fea35e5332
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/latexmp.mp
@@ -0,0 +1,459 @@
+%D \module
+%D [ file=latexmp.mp,
+%D system={latexMP},
+%D version=1.2.1,
+%D title=latexMP,
+%D subtitle=LaTeX typesetting in \METAPOST,
+%D author=Jens-Uwe Morawski,
+%D date={2005/04/06},
+%D copyright={none; this module is Public Domain}]
+%D
+%C - all variables start with prefix "latexmp_"
+%C - all internal macros have suffix "_latexmp"
+%C - macros without "_latexmp" suffix are:
+%C textext, setupLaTeXMP
+
+%D \section{Initialisation}
+if known latexmp_module: message(" not loaded again"); endinput ; fi ;
+boolean latexmp_module ; latexmp_module := true ;
+
+%D set the name of the temporary file
+string latexmp_lmpfile ; latexmp_lmpfile := "ltx-" & jobname & ".tmp" ;
+
+%D save some original \METAPOST\ definitions
+inner end ; inner bye ;
+let origEnd_latexmp=end ;
+let origBye_latexmp=bye ;
+let origShipit_latexmp=shipit ;
+string latexmp_extrabeginfig, latexmp_extraendfig ;
+extra_endfig := extra_endfig & "; resetattachstrings_latexmp ;" ;
+latexmp_extrabeginfig := extra_beginfig ;
+latexmp_extraendfig := extra_endfig ;
+color latexmp_background ;
+latexmp_background := background ;
+
+%D The runtime control of latexMP states:
+%D (1) is this the second run in \type{rerun} mode ; (2) has the temporary
+%D mp file already been read; (3) is the LaTeX preamble already
+%D been written to the temporary file
+boolean latexmp_secondrun, latexmp_lmploaded, latexmp_texinit ;
+latexmp_secondrun := false ;
+latexmp_lmploaded := false ;
+latexmp_texinit := false ;
+
+%D The current number of \type{textext()} in the input file. The counter
+%D is incremented at every \type{textext} call. It is used to assign the
+%D pictures from the temporary file.
+numeric latexmp_counter ; latexmp_counter := 0 ;
+
+%D \section{Setup}
+%D LaTeX preamble variables
+string latexmp_docclass, latexmp_classoptions,
+latexmp_inputenc, latexmp_fontenc, latexmp_babellang,
+latexmp_packages, latexmp_preamble, latexmp_lmpprefix,
+latexmp_preamblefile ;
+
+latexmp_docclass := "article" ;
+latexmp_classoptions := "" ;
+latexmp_inputenc := "" ;
+latexmp_fontenc := "" ;
+latexmp_babellang := "" ;
+latexmp_packages := "" ;
+latexmp_preamble := "" ;
+latexmp_preamblefile := "" ;
+
+%D The setup variables that control activation of the specials:
+numeric latexmp_mode ; latexmp_mode := 1 ;
+boolean latexmp_subsinfont ; latexmp_subsinfont := false ;
+boolean latexmp_multicolor ; latexmp_multicolor := false ;
+boolean latexmp_debug ; latexmp_debug := false ;
+
+%D The setup command:
+def setupLaTeXMP(text kvps) =
+ if not latexmp_secondrun:
+ if latexmp_texinit:
+ message("LaTeXMP: setupLaTeXMP cannot be used if textext" &
+ "has already been used; set-up ignored.");
+ else:
+ begingroup;
+%D declaration of key-value parameters for LaTeX preamble
+ save class, options, inputencoding, fontencoding, language,
+ packages, preamble, preamblefile ;
+ string class, options, inputencoding, fontencoding, language,
+ packages, preamble, preamblefile;
+%D declaration of key and synonyms for \type{mode}
+ save mode, normal, rerun ;
+ numeric mode, normal, rerun ;
+ normal:=1 ; rerun := 2 ;
+%D declaration of keys and synonyms for the specials
+ save textextlabel, multicolor, debug, enable, disable ;
+ boolean textextlabel, multicolor, debug, enable, disable ;
+ enable:=true ; disable := false ;
+
+ processKeyvals_latexmp(kvps) ;
+
+ if known class:
+ if (length class) >0: latexmp_docclass:=class ;
+ else: latex_docclass:="article";
+ fi;
+ fi;
+ if known options: latexmp_classoptions:=options ; fi;
+ if known inputencoding: latexmp_inputenc:=inputencoding ; fi;
+ if known fontencoding: latexmp_fontenc:=fontencoding ; fi;
+ if known language: latexmp_babellang:=language ; fi;
+ if known preamble:latexmp_preamble:=preamble ; fi;
+ if known preamblefile: latexmp_preamblefile:=preamblefile ; fi;
+ if known packages: latexmp_packages:=packages ; fi;
+ if known mode:
+ if (mode=normal) or (mode=rerun): latexmp_mode:=mode ;
+ else:
+ errmessage("latexMP error: set mode either to 'normal' or 'rerun'.") ;
+ latexmp_mode := 1 ;
+ fi;
+ fi;
+ if known textextlabel: latexmp_subsinfont:=textextlabel ; fi;
+ if known multicolor: latexmp_multicolor:=multicolor ; fi;
+ if known debug: latexmp_debug:=debug ; fi;
+ endgroup;
+
+%D overwrite the default definition of \type{thelabel} if user has specified
+%D \type{textextlabel=enable}:
+ if latexmp_subsinfont:
+ vardef thelabel@#(expr s,z) =
+ save p; picture p;
+ if picture s: p=s
+ else: p = textext(s)
+ fi;
+ p shifted (z + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p ))
+ enddef;
+ fi;
+
+%D In \type{rerun} mode for the first run own definitions for \type{end}
+%D and \type{bye} are used; output is disabled for first run.
+ if latexmp_mode=2:
+ let end=end_latexmp ;
+ let bye=end_latexmp ;
+ let shipit=relax ;
+%D Since in the first run the temporary file will not contain
+%D correct definitions automatic loading of that file by \type{textext}
+%D is disabled (we fake here that it is already loaded). Loading of the
+%D temporary file in \type{end_latexmp}.
+ latexmp_lmploaded := true ;
+ fi;
+ fi;fi;
+enddef;
+
+%D used in \type{writeLaTeXpreamble_latexmp}
+%D to generate \type{\usepackage} statements
+def writepackages_latexmp=
+ begingroup;
+ save inoptions, currentpackage, currentoptions, s ;
+ boolean inoptions ; inoptions:=false;
+ string currentpackage, currentoptions, s ;
+ currentpackage:=""; currentoptions:="" ;
+
+ for c=0 upto ((length latexmp_packages)-1):
+ s := substring (c,c+1) of latexmp_packages ;
+ if s="[": inoptions := true ;
+ elseif s="]": inoptions := false;
+ elseif s=",":
+ if inoptions: currentoptions:= currentoptions & s ;
+ else:
+ if (length currentpackage)>0:
+ s:="{" & currentpackage & "}" ;
+ if (length currentoptions)>0:
+ s:="[" & currentoptions & "]" & s ;
+ fi;
+ write ("\usepackage" & s) to latexmp_lmpfile ;
+ currentpackage:=""; currentoptions:="" ;
+ fi;
+ fi;
+ else:
+ if inoptions: currentoptions:= currentoptions & s ;
+ else: currentpackage:= currentpackage & s ;
+ fi;
+ fi;
+ endfor;
+ if (length currentpackage)>0: s:="{" & currentpackage & "}" ;
+ if (length currentoptions)>0: s:="[" & currentoptions & "]" & s ; fi;
+ write ("\usepackage" & s) to latexmp_lmpfile ;
+ fi;
+ endgroup;
+enddef;
+
+%D \section{LaTeX preamble}
+
+def writeLaTeXpreamble_latexmp =
+ write "verbatimtex" to latexmp_lmpfile ;
+ write "%&latex" to latexmp_lmpfile ;
+%D If preamble file has been specified in the setup only a
+%D \type{\input} for this file will be used in the LaTeX preamble:
+ if (length latexmp_preamblefile)>0:
+ write ("\input{" & latexmp_preamblefile & "}") to latexmp_lmpfile ;
+ else:
+%D Specific definitions from the setup parameters:
+ write ("\documentclass"
+ if (length latexmp_classoptions)>0:
+ & "[" & latexmp_classoptions & "]"
+ fi & "{" & latexmp_docclass & "}") to latexmp_lmpfile ;
+ if (length latexmp_fontenc)>0:
+ write ("\usepackage[" & latexmp_fontenc & "]{fontenc}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_inputenc)>0:
+ write ("\usepackage[" & latexmp_inputenc & "]{inputenc}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_babellang)>0:
+ write ("\usepackage[" & latexmp_babellang & "]{babel}")
+ to latexmp_lmpfile ;
+ fi
+ if (length latexmp_packages)>0: writepackages_latexmp ; fi;
+ if (length latexmp_preamble)>0:
+ write latexmp_preamble to latexmp_lmpfile ;
+ fi
+ fi;
+ if latexmp_multicolor:
+ write ("\makeatletter") to latexmp_lmpfile ;
+ write ("\font\latexmp@special=cmtt8 scaled 250") to latexmp_lmpfile ;
+ write ("\def\reset@color{" &
+ "\parbox[t][0pt][t]{0pt}{\makebox[0pt][l]{\latexmp@special ecolorxxx}}}")
+ to latexmp_lmpfile ;
+ write ("\newcommand*{\color}[2][named]{\parbox[t][0pt][t]{0pt}{" &
+ "\makebox[0pt][l]{\latexmp@special bcolorxxx:#1:#2}}" &
+ "\aftergroup\reset@color\ignorespaces}") to latexmp_lmpfile ;
+ write ("\def\textcolor#1#{\@textcolor{#1}}") to latexmp_lmpfile ;
+ write ("\def\@textcolor#1#2#3{\protect\leavevmode{\color#1{#2}#3}}")
+ to latexmp_lmpfile ;
+ write ("\newcommand*{\transparent}[3][1]{\parbox[t][0pt][t]{0pt}{"&
+ "\makebox[0pt][l]{\latexmp@special btransxxx:#1,#2}}"&
+ "#3\parbox[t][0pt][t]{0pt}{" &
+ "\makebox[0pt][l]{\latexmp@special etransxxx}}}") to latexmp_lmpfile ;
+ write "\makeatother" to latexmp_lmpfile ;
+ fi;
+ write "\begin{document}" to latexmp_lmpfile ;
+ write "etex" to latexmp_lmpfile ;
+ write "picture latexmp_picture[];" to latexmp_lmpfile ;
+enddef;
+
+%D \section{Main Macros}
+
+%D The macro that does the job:
+vardef textext@#(expr s)=
+ save pic ; picture pic ;
+ latexmp_counter:= latexmp_counter+1 ;
+ getpicture_latexmp ;
+ addstring_latexmp(s) ;
+ if (length (str @#))>0 :
+ % V. 1.1 compatible with MetaFun
+ thelabel@#(pic,origin)
+ else:
+ % V. 1.2 better compatibility with btex..etex
+ pic
+ fi
+enddef;
+
+%D strings \type{latexmp_prepend} and \type{latexmp_append} are attached
+%D to the string passed to \type{textext}. This may be useful for package
+%D authors to implement styling interfaces.
+string latexmp_prepend, latexmp_append ;
+latexmp_prepend:= "" ; latexmp_append := "" ;
+
+%D is called at each endfig via extra_endfig
+def resetattachstrings_latexmp =
+ latexmp_prepend:= "" ; latexmp_append := "" ;
+enddef;
+
+def addstring_latexmp(expr s)=
+ if not latexmp_texinit:
+ write EOF to latexmp_lmpfile ;
+ writeLaTeXpreamble_latexmp ;
+ latexmp_texinit := true ;
+ fi;
+ write "latexmp_picture[" & (decimal latexmp_counter) & "]:= btex " &
+ latexmp_prepend & s & latexmp_append & " etex ;" to latexmp_lmpfile ;
+enddef;
+
+def getpicture_latexmp =
+ if not latexmp_lmploaded:
+ if not (readfrom latexmp_lmpfile=EOF):
+ scantokens ("input " & latexmp_lmpfile) ;
+ fi;
+ latexmp_lmploaded := true ;
+ fi;
+ if known latexmp_picture[latexmp_counter]:
+ if latexmp_multicolor and not latexmp_debug:
+ pic := colorspecials_latexmp(latexmp_picture[latexmp_counter]) ;
+ else:
+ pic := latexmp_picture[latexmp_counter] ;
+ fi;
+ else:
+ pic := ("LaTeXMP " & (decimal latexmp_counter))
+ infont defaultfont ;
+ fi;
+enddef;
+
+%D The following is only used if option \type{multicolor} is set in
+%D \type{setupLaTeXMP}. It is employed in \type{getpicture_latexmp}
+%D in order to strip specials from the LaTeX picture and change
+%D the colors of text elements accordigly.
+vardef colorspecials_latexmp(expr p) =
+ save _P, _bb, _tp, _fp, _t, _addto_P ;
+ save _withcolor, _colorpointer, _transparent, _transpointer;
+ picture _P ; path _bb ;
+ string _withcolor[], _transparent[], _tp, _fp, _addto_P ;
+ numeric _colorpointer, _transpointer ;
+ _P := nullpicture ; _bb := pathpart p ;
+ _withcolor[0]:= "" ; _colorpointer := 0 ; _transparent[0]:="" ;
+ _transpointer:=0 ;
+ _addto_P := "addto _P also _tp infont _fp transformed _t " ;
+ for c within p:
+ if textual c:
+ _tp:= textpart c ;
+ _fp:= fontpart c ;
+ transform _t ;
+ (xpart _t,xxpart _t,xypart _t)=(xpart c,xxpart c,xypart c) ;
+ (ypart _t,yypart _t,yxpart _t)=(ypart c,yypart c,yxpart c) ;
+ if (_fp="cmtt8") and ((substring (1,9) of _tp)="colorxxx"):
+ % color special found
+ if (substring (0,1) of _tp)="b":
+ % begin color special
+ _colorpointer := _colorpointer+1;
+ _withcolor[_colorpointer]:= colormacro_latexmp(substring (10,(length _tp)) of _tp) ;
+ elseif (substring (0,1) of _tp)="e":
+ % end color special
+ if not (_colorpointer=0):
+%C if \type{\color} is used ungrouped in a parbox the \type{ecolorxxx}
+%C appears prior \type{bcolorxxx}. multiple instances of \type{ecolorxxx}
+%C would result in counting \type{_colorpointer<0}. thus checking
+%C for \type{_colorpointer=0} is a ugly hack for this problem.
+ _colorpointer := _colorpointer-1;
+ fi;
+%C else:?? ooops; should not happen
+ fi;
+ elseif (_fp="cmtt8") and ((substring (1,9) of _tp)="transxxx"):
+ % transparency special found
+ if (substring (0,1) of _tp)="b":
+ % begin trans special
+ _transpointer := _transpointer+1;
+ _transparent[_transpointer]:= substring (10,(length _tp)) of _tp ;
+ elseif (substring (0,1) of _tp)="e":
+ % end trans special
+ _transpointer := _transpointer-1;
+ fi;
+ else:
+ scantokens (_addto_P & withcurrentcolor_latexmp ) ;
+ fi;
+ fi;
+ endfor;
+ setbounds _P to _bb ;
+ _P
+enddef;
+
+vardef colormacro_latexmp(expr colspec)=
+ save _cmd, _pos, _m, _c ; string _cmd, _m, _c ;
+ _pos := 0 ; _cmd:="" ;
+ for i=1 upto (length colspec):
+ if (substring (i-1,i) of colspec)=":":
+ _pos := i ;
+ fi;
+ endfor;
+ if _pos<2: % "x:..." --> no color model found
+ errmessage("LaTeXMP: no color model found in: " & colspec) ;
+ else:
+ _m := substring (0,(_pos-1)) of colspec ;
+ _c := substring (_pos,(length colspec)) of colspec ;
+ if expandafter known (scantokens ("latexmp_color_" & _m)):
+ _cmd := (scantokens ("latexmp_color_" & _m)) & "(" & _c & ")" ;
+ else:
+ errmessage("LaTeXMP: color model '" & _m & "' not supported)") ;
+ fi;
+ fi;
+ _cmd
+enddef;
+
+vardef withcurrentcolor_latexmp=
+ if (length _withcolor[_colorpointer])>0:
+ if (length _transparent[_transpointer])>0:
+ " withcolor transparent(" & _transparent[_transpointer] & "," &
+ _withcolor[_colorpointer] &")"
+ else: " withcolor " & _withcolor[_colorpointer] fi
+ else:
+ if (length _transparent[_transpointer])>0:
+ " withcolor transparent(" & _transparent[_transpointer] & ",black)"
+ else: "" fi
+ fi
+enddef;
+
+%D \section{The end macro for rerun mode}
+string latexmp_beforererun ; latexmp_beforererun := "" ;
+
+def end_latexmp =
+%D read temporary file if strings have been written there
+ if latexmp_counter>0:
+ write EOF to latexmp_lmpfile;
+ scantokens ("input " & latexmp_lmpfile) ;
+ fi;
+%D re-init
+ latexmp_counter := 0 ; latexmp_secondrun := true ; latexmp_texinit := false ;
+%D restore defaults
+ extra_beginfig := latexmp_extrabeginfig ;
+ extra_endfig := latexmp_extraendfig ;
+ background := latexmp_background ;
+ let end=origEnd_latexmp ; let bye=origBye_latexmp ;
+ let shipit=origShipit_latexmp ;
+ clear_pen_memory; clearit;
+ pickup pencircle scaled .5bp; defaultpen := savepen;
+%D run pre-rerun hooks
+ scantokens latexmp_beforererun ;
+%D input current job again
+ scantokens ("input " & jobname) ;
+enddef;
+
+%D \section{color support}
+vardef Hsvcolor_latexmp(expr H,s,v) =
+ save h, o, b, d, pc, sc; numeric h, o, b, d, pc, sc ;
+ h := H/60 ; pc := floor h ; sc := h - pc ;
+ o := (1-s)*v ; b := (1-(sc*s))*v ; d := (1-((1-sc)*s))*v ;
+ if (pc = 0) or (pc = 6): (v,d,o)
+ elseif pc = 1: (b,v,o)
+ elseif pc = 2: (o,v,d)
+ elseif pc = 3: (o,b,v)
+ elseif pc = 4: (d,o,v)
+ else:(v,o,b)
+ fi
+enddef;
+vardef cmykcolor_latexmp(expr c,m,y,k) =
+%D use MetaFun cmyk-specials if available; macro \type{cmyk()}
+%D checks if \type{cmykcolors=true}
+ if known context_spec: cmyk(c,m,y,k) else: (1-c-k,1-m-k,1-y-k) fi
+enddef;
+vardef graycolor_latexmp(expr g) = (g,g,g) enddef ;
+
+%D which macro should be used for a given color model in multicolor mode.
+string latexmp_color_Hsv, latexmp_color_rgb,
+latexmp_color_gray, latexmp_color_cmyk, latexmp_color_named ;
+
+latexmp_color_Hsv := "Hsvcolor_latexmp" ;
+latexmp_color_gray := "graycolor_latexmp" ;
+latexmp_color_rgb := "" ;
+latexmp_color_cmyk := "cmykcolor_latexmp" ;
+latexmp_color_named := "" ;
+
+%D \section{Key-Value Support Macros}
+def processKeyvals_latexmp (text _kvps_)=
+ begingroup;
+ save _equals, _assign ;
+ let _equals= = ;
+
+ primarydef _ll_ _assign _rr_ =
+ hide(_ll_ _equals _rr_ ) 1
+ enddef;
+
+ save = ;
+ let = _equals _assign ;
+ for _xx_ _equals _kvps_ : endfor ;% NOP
+ endgroup;
+enddef;
diff --git a/graphics/metapost/contrib/macros/matlab/lstmp.tex b/graphics/metapost/contrib/macros/matlab/lstmp.tex
new file mode 100644
index 0000000000..73f2ecd029
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/lstmp.tex
@@ -0,0 +1,360 @@
+\lstdefinelanguage{MetaPost}{
+morecomment=[l]{\%},
+morestring=[b]",
+%keywords
+% Yellow
+keywords={
+if,%
+fi,%
+for,%
+forsuffixes,%
+forever,%
+endfor,%
+while,%
+input,%
+addto,%
+clip,%
+cutdraw,%
+draw,%
+drawarrow,%
+drawdblarrow,%
+fill,%
+filldraw,%
+interim,%
+let,%
+loggingall,%
+newinternal,%
+pickup,%
+save,%
+setbounds,%
+shipout,%
+show,%
+showdependencies,%
+showtoken,%
+showvariable,%
+special,%
+tracingall,%
+tracingnone,%
+undraw,%
+unfill,%
+unfilldraw,%
+boxit,%
+boxjoin,%
+bpath,%
+buildcycle,%
+circleit,%
+dashpattern,%
+decr,%
+dotlabel,%
+dotlabels,%
+drawboxed,%
+drawboxes,%
+drawoptions,%
+drawunboxed,%
+fixpos,%
+fixsize,%
+incr,%
+label,%
+labels,%
+max,%
+min,%
+thelabel}%
+%Name:MetaPost Begin / End
+% Before:0~Alpha
+% After:0~Alpha
+% Enabled:1MetaPost
+% Strict Priority:0
+% Priority:1
+% Color:5122
+% Case Sensitive:1
+%
+% Yellow
+,morekeywords=[1]{
+beginfig,%
+endfig,%
+end}%
+%
+%Name:MetaPost TeX
+% Before:0~Alpha
+% After:0~Alpha
+% Enabled:1MetaPost
+% Strict Priority:0
+% Priority:1
+% Color:5121
+% Case Sensitive:1
+ % Yellow,%
+,morekeywords=[2]{
+btex,%
+etex,%
+defaultfont,%
+fontsize,%
+verbatimtex}%
+%
+%
+%variables
+% bluish green
+,morekeywords=[3]{
+ahangle,%
+ahlength,%
+bboxmargin,%
+charcode,%
+circmargin,%
+day,%
+defaultdx,%
+defaultdy,%
+defaultpen,%
+defaultscale,%
+labeloffset,%
+linecap,%
+linejoin,%
+miterlimit,%
+month,%
+pausing,%
+prologues,%
+showstopping,%
+time,%
+tracingcapsules,%
+tracingchoices,%
+tracingcommands,%
+tracingequations,%
+tracinglostchars,%
+tracingmacros,%
+tracingonline,%
+tracingoutput,%
+tracingrestores,%
+tracingspecs,%
+tracingstats,%
+tracingtitles,%
+truecorners,%
+warningcheck,%
+year,%
+background,%
+currentpen,%
+currentpicture,%
+cuttings,%
+defaultfont,%
+extra_beginfig,%
+extra_endfig}%
+%
+%Name:MetaPost Constants
+% Before:0~Alpha
+% After:0~Alpha
+% Enabled:1MetaPost
+% Strict Priority:0
+% Priority:1
+% Color:1025
+% Case Sensitive:1
+%
+% red
+,morekeywords=[4]{
+beveled,%
+black,%
+blue,%
+bp,%
+butt,%
+cc,%
+cm,%
+dd,%
+ditto,%
+down,%
+epsilon,%
+evenly,%
+false,%
+fullcircle,%
+green,%
+halfcircle,%
+identity,%
+in,%
+infinity,%
+left,%
+mitered,%
+mm,%
+nullpicture,%
+origin,%
+pc,%
+pencircle,%
+pensquare,%
+pt,%
+quartercircle,%
+red,%
+right,%
+rounded,%
+squared,%
+true,%
+unitsquare,%
+up,%
+white,%
+withdots}%
+%
+%Name:MetaPost Positions
+% Before:1Point
+% After:0~Alpha
+% Enabled:1MetaPost
+% Strict Priority:0
+% Priority:1
+% Color:1027
+% Case Sensitive:1
+%
+% purple
+,morekeywords=[5]{
+bot,%
+lft,%
+ulft,%
+llft,%
+rt,%
+urt,%
+lrt,%
+top,%
+dx,%
+dy,%
+nw,%
+n,%
+ne,%
+w,%
+e,%
+sw,%
+s,%
+se}%
+%
+%Name:MetaPost Operators
+% Before:0~Alpha
+% After:0~Alpha
+% Enabled:1MetaPost
+% Strict Priority:0
+% Priority:1
+% Color:1029
+% Case Sensitive:1
+ %
+% purple
+,morekeywords=[6]{
+++,%
++-+,%
+abs,%
+and,%
+angle,%
+arclength,%
+arctime,%
+ASCII,%
+bbox,%
+bluepart,%
+boolean,%
+ceiling,%
+center,%
+char,%
+color,%
+cosd,%
+cutafter,%
+cutbefore,%
+cycle,%
+decimal,%
+dir,%
+direction,%
+directionpoint,%
+directiontime,%
+div,%
+dotprod,%
+floor,%
+fontsize,%
+greenpart,%
+hex,%
+infont,%
+intersectionpoint,%
+intersectiontimes,%
+inverse,%
+known,%
+length,%
+llcorner,%
+lrcorner,%
+makepath,%
+makepen,%
+mexp,%
+mlog,%
+mod,%
+normaldeviate,%
+not ,%
+numeric,%
+oct,%
+odd,%
+or,%
+pair,%
+path,%
+pen,%
+penoffset,%
+picture,%
+point,%
+postcontrol,%
+precontrol,%
+redpart,%
+reverse,%
+rotated,%
+round,%
+scaled,%
+shifted,%
+sind,%
+slanted,%
+sqrt,%
+str,%
+string,%
+subpath,%
+substring,%
+transform,%
+transformed,%
+ulcorner,%
+uniformdeviate,%
+unitvektor,%
+unknown,%
+urcorner,%
+whatever,%
+xpart,%
+xscaled,%
+xxpart,%
+xypart,%
+ypart,%
+yscaled,%
+yxpart,%
+yypart,%
+zscaled,%
+exitif,%
+exitunless,%
+upto,%
+downto,%
+step,%
+until,%
+withcolor,%
+dashed,%
+lft,%
+rt,%
+top,%
+bot}%
+}
+
+
+\lstset{language=MetaPost,
+keywordstyle=\color{orange},
+keywordstyle=[1]\color{orange},
+keywordstyle=[2]\color{orange},
+keywordstyle=[3]\color{bluegreen},
+keywordstyle=[4]\color{purple},
+keywordstyle=[5]\color{purple},
+commentstyle=\color{blue},
+stringstyle=\color{red},
+basicstyle=\ttfamily
+}
+
+%Name:MetaPost Begin / End
+% Yellow 1
+
+%Name:MetaPost TeX
+ % Yellow,% 2
+
+%variables
+% bluish green 3
+
+%Name:MetaPost Constants
+% red 4
+
+%Name:MetaPost Positions
+% purple 5
+
+%Name:MetaPost Operators
+% purple 6
diff --git a/graphics/metapost/contrib/macros/matlab/matlab.mp b/graphics/metapost/contrib/macros/matlab/matlab.mp
new file mode 100644
index 0000000000..455d38ce33
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/matlab.mp
@@ -0,0 +1,430 @@
+input graph.mp;
+warningcheck :=0;
+
+input latexmp.mp
+
+% read two columns from a file,
+% need to specify filename, the target
+% path name, and two columns,
+% if there's only one column, take 1---size(column)
+% as default x ---- well, dont' know how to do it yet now
+numeric n_paths; %number of paths I have read so far
+numeric n_line; % lines I have already plotted out
+numeric g_w, g_h; % global width and height of plotting area
+g_w=5in;
+g_h=4in;
+
+numeric mtfontsize, gridfontsize, lgdfontsize;
+mtfontsize:=14;
+gridfontsize:=12;
+lgdfontsize:=10;
+
+vardef pttoinch(expr p)=p/72 enddef;
+
+string wantgrid;
+numeric d[][], count[];
+% d is the raw data I have seen,
+% p is the paths to be plotted
+
+picture line_patterns[], line_markers[];
+color line_colors[];
+numeric line_widths[];
+% the four basic properties of each line,
+% needs to be remembered so that I can draw them in the legend box
+
+
+
+def rdata(expr filename)% a string
+% (suffix d)% an array of paths
+ (expr column)% i is column number in the datafile
+=
+ begingroup
+ string s[];
+ numeric row;
+ row:=0;
+ gdata(filename, s,
+ d[n_paths][row]:=Mlog_str(s[column]);
+ row:=row+1;
+ );
+ count[n_paths]:=row-1;
+ n_paths:=n_paths+1;
+ endgroup;
+enddef;
+
+
+
+% create a path from two "raw paths", which only have
+% meaningful x part
+vardef combine_paths(expr p, q)=
+ (d[p][0],d[q][0])
+ for i=1 upto min(count[p], count[q]):
+ -- (d[p][i],d[q][i])
+ endfor
+enddef;
+
+
+
+
+input string.mp
+
+% style specification:
+% the first two are column numbers,
+% then following are specifications
+% seperated by whitespace,
+% the "linewdith" number should be preceded by
+% "linewidth" , color is started by "c", pattern is started by
+% "p"
+% add a one line from existing data repository into
+% the set of paths to be printed, p. also parse the
+% line style, etc.
+def mtplot(expr cmd)=
+begingroup
+ numeric x,y;
+ string style;
+ path p;
+ string ss;
+ numeric marker_idx;
+
+ ss:=cmd;
+
+ % now use default setting if not specified
+ line_widths[n_line]:=1;
+ line_patterns[n_line] := patterns[n_line mod (patterns.count+1)].d;
+ line_colors[n_line] := colors[n_line mod ( colors.count+1)].d;
+ marker_idx := 0;
+ % X and Y column index
+ x := scantokens(loptok ss );
+ y := scantokens(loptok ss );
+ p := combine_paths(x,y);
+
+ forever : exitif ss="";
+ style := loptok(ss);
+ if ( style = "linewidth" ) :
+ line_widths[n_line]:= scantokens( loptok(ss));
+ else :
+ if ( (substring(0,1) of style)
+ = "c" ):
+ line_colors[n_line]:=searchdefault.colors(style);
+ else:
+ if ( ( substring(0,1) of style )
+ = "p" ):
+ line_patterns[n_line]:= searchdefault.patterns(style);
+ else:
+ if ( ( substring(0,1) of style )
+ = "m" ):
+ marker_idx := searchdefault.markers(style);
+ fi % t spec
+ fi % p spec
+ fi% color spec
+ fi % width spec
+ endfor;
+
+ line_markers[n_line]:=markersp(marker_idx,
+ withpen pencircle scaled line_widths[n_line]
+ withcolor line_colors[n_line]
+ );
+
+
+ gdraw p
+ withpen pencircle scaled line_widths[n_line]
+ withcolor line_colors[n_line]
+ dashed line_patterns[n_line] scaled line_widths[n_line]
+ % scaled is important, so width and length of dashes are
+ % proportional
+ ;
+
+ gdraw p plot line_markers[n_line];
+ n_line := n_line+1;
+endgroup;
+enddef;
+
+
+vardef ttt primary a = (1=1) enddef;
+
+
+%search color or pattern from default table
+vardef searchdefault@#(expr query)=
+ %take the substring from the second char upward
+ string sss;
+ sss:=( substring (1,cspan(query,ttt))
+ of query);
+ searchdefault_rec@#(0,sss)
+enddef;
+
+% a recursive definition
+vardef searchdefault_rec@#(expr idx, query )=
+ if ( @#[idx].name = query ):
+ @#[idx].d
+ elseif ( idx = @#.count):
+ @#[0].d % at the last choice, have to use it
+ else:
+ searchdefault_rec@#(idx+1, query)
+ fi
+enddef;
+
+
+
+
+%default color table
+
+string colors[].name;
+color colors[].d;
+numeric colors.count;
+colors[0].name:="k"; colors[0].d:=black;
+colors[1].name:="r"; colors[1].d:=red;
+colors[2].name:="g"; colors[2].d:=green;
+colors[3].name:="b"; colors[3].d:=blue;
+colors[4].name:="y"; colors[4].d:=red+green;
+colors[5].name:="o"; colors[5].d:=1.5*red+ 0.5*green;
+colors[6].name:="p"; colors[6].d:=red+blue;
+colors.count:=6;
+
+%default dash patterns
+string patterns[].name;
+picture patterns[].d;
+numeric patterns.count;
+patterns[0].name:="solid"; patterns[0].d:=nullpicture;
+patterns[1].name:="dash"; patterns[1].d:=evenly;
+patterns[2].name:="dot";
+ patterns[2].d:=dashpattern( on 0 off 1.5 );
+patterns[3].name:="dashdot";
+ patterns[3].d:=dashpattern(on 4 off 2 on 1 off 2) ;
+patterns[4].name:="dddash";
+ patterns[4].d:=dashpattern(on 1 off 2 on 1 off 2 on 4
+ off 2);
+patterns[5].name:="dddot";
+ patterns[5].d:=dashpattern(
+ on 4 off 2 on 4 off 2 on 1 off 2 );
+patterns.count:=5;
+
+
+%default markers
+string markers[].name;
+numeric markers[].d;
+numeric markers.count;
+picture temppic;
+markers[0].name:="o";
+markers[1].name:="x";
+markers[2].name:="*";
+markers[3].name:="d";
+markers[4].name:="s";
+% just to make the function "searchdefault()" return the index
+markers[0].d:=0;
+markers[1].d:=1;
+markers[2].d:=2;
+markers[3].d:=3;
+markers[4].d:=4;
+
+markers.count=4;
+
+numeric markersize;
+markersize:=3bp;
+% a wacky trick to paste the options
+% (withpen, etc) that is to be supplied later onto
+% the marker picture
+% markers_picture or "markers_paths"
+def markeritem(text s)=
+ hide(
+% save tmp_pic;
+ picture tmp_pic;
+ tmp_pic:=nullpicture;
+ s;
+ )
+ tmp_pic
+enddef;
+
+
+def markerset(text opt)=
+
+ markeritem( trash:=1; ), %nothing
+
+ markeritem( % "X"
+ addto tmp_pic doublepath
+ ( (-1,-1) -- (1, 1) ) scaled markersize opt;
+ addto tmp_pic doublepath
+ ( (-1, 1) -- (1,-1) ) scaled markersize opt;
+ ) ,
+ markeritem( % "*"
+ for i=1, 2 , 3:
+ addto tmp_pic doublepath
+ ( dir(i*120) -- dir(i*120+180) )
+ scaled markersize opt;
+ endfor;
+ ),
+
+ markeritem( % diamond "d"
+ addto tmp_pic doublepath
+ unitsquare shifted (-.5, -.5)
+ rotated 45
+ scaled markersize opt;
+ ),
+
+ markeritem( % square "s"
+ addto tmp_pic doublepath
+ unitsquare shifted ( -.5 , -.5)
+ opt;
+ )
+enddef;
+
+def markersp(expr idx)(text opt)=
+ hide (
+ numeric i;
+ picture result,j;
+ i:=0;
+ for j=markerset(opt): % list out all possible markers
+ if ( i=idx):
+ result:=j;
+ fi
+ i:=i+1;
+ endfor
+ if ( unknown result ):
+ result:=j; % just last marker
+ fi
+ )
+ result
+enddef;
+
+
+
+def xlabel(expr l)=
+ glabel.bot(textext("{\mtfont " & l & " } ") , OUT );
+enddef;
+
+def ylabel(expr l)=
+ glabel.lft(textext("{\mtfont " & l & " } ")
+ rotated 90, OUT);
+enddef;
+
+
+
+%draw the legend, do calculation on the legend box size
+% need lgdfontsize, how many lines to draw, etc,
+% also use the remembered line properties
+vardef legend(expr x, y)(text tags)=
+ numeric lgd_w, lgd_h, lgd_x, lgd_y; % size of legend box
+ picture lgd, tmp_lgd;
+ string s,tagstr[];
+ numeric i,j;
+
+ % parse the tags first, put them into an array,
+ i:=0;
+ for s=tags:
+ tagstr[i]:=s;
+ i:=i+1;
+ endfor
+ for j=i upto n_line -1:
+ tagstr[i]:=decimal(j);
+ endfor
+
+ tmp_lgd:=nullpicture;
+ lgd:=nullpicture;
+
+ %first draw the legend box into picture, then
+ % draw it and shift it
+ margin:=(lgdfontsize/2);
+ for i = 0 upto n_line -1:
+ % draw the sample line in legend box
+ addto tmp_lgd doublepath
+ (( (0,0)
+ --
+ ((g_w /10),0))
+ shifted ( margin , 2margin+ lgdfontsize *i*1.5 )
+ )
+ withpen pencircle scaled line_widths[i]
+ withcolor line_colors[i]
+ dashed line_patterns[i]
+ scaled line_widths[i];
+
+ % add anotation to the sample line
+ addto tmp_lgd also thelabel.rt(
+ textext("{\lgdfont "& tagstr[i] & "}"),
+ ( (margin+g_w/10+margin)
+ ,(2margin+ lgdfontsize *i*1.5))
+ );
+
+ % draw marker mark on sample line
+ addto tmp_lgd also line_markers[i]
+ shifted (
+ ((g_w/20),0)
+ +
+ ( (margin), (2margin+ lgdfontsize *i*1.5))
+ );
+ endfor;
+
+ path box;
+ box:=bbox(tmp_lgd);
+ lgd_w:= xpart(point 1 of box) + margin;
+ lgd_h:= n_line * lgdfontsize *1.5 + 2margin;
+
+ addto lgd contour (0,0)--(lgd_w,0)--(lgd_w,lgd_h)--(0,lgd_h)--cycle
+ withcolor .95 white; % fill the background of legend box with white
+ addto lgd doublepath (0,0)--(lgd_w,0)--(lgd_w,lgd_h)--(0,lgd_h)--cycle
+ withpen pencircle;
+ addto lgd also tmp_lgd;
+
+ % now calculate position of legend box
+ if ( x = 1 ):
+ lgd_x := (g_w/20);
+ elseif( x= 2):
+ lgd_x:=(g_w/2-(lgd_w)/2);
+ else:
+ lgd_x:=(g_w*19/20) - lgd_w;
+ fi
+
+ if ( y=1):
+ lgd_y:=(g_h/10);
+ elseif (y=2):
+ lgd_y:=(g_h/2-(lgd_h)/2);
+ else:
+ lgd_y:=(g_h*9/10)- lgd_h;
+ fi
+
+ %finally draw the legend box
+ draw lgd shifted (lgd_x, lgd_y);
+
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+defaultfont:="Helvetica";
+
+
+% initialization
+def begingrf(expr w, h)=
+hide(
+string tempstr;
+tempstr:=
+ "\font\mtfont=" & defaultfont & " at " & decimal(mtfontsize) &"pt "
+ & " \font\lgdfont=" & defaultfont & " at " &decimal(lgdfontsize) & "pt "
+ & " \font\gridfont=" & defaultfont & " at " &decimal(gridfontsize) &"pt "
+ ; %legend font, use normal 10pt
+setupLaTeXMP(preamble=tempstr);
+)
+begingraph(w,h);
+init_numbers(btex$-$etex,
+ textext("{\gridfont 1}"),
+ %btex$1$etex,
+ btex ${\times}10$ etex,
+ btex${}^-$etex,
+ btex${}^2$etex);
+Gtemplate.itick := origin -- (w/100,0);
+Gtemplate.otick := origin -- (-w/100,0);
+interim Gpaths:=log;
+n_line:=0;
+n_paths:=0;
+wantgrid:="yes";
+enddef;
+
+
+% plot out everyting else
+def finishgrf =
+autogrid(itick.bot,itick.lft) withpen pencircle scaled 1.5;
+if ( wantgrid = "yes" ):
+autogrid(grid.bot,grid.lft) withpen pencircle scaled 0.5 dashed evenly;
+fi
+frame withpen pencircle scaled 1;
+endgraph;
+enddef;
+
+
diff --git a/graphics/metapost/contrib/macros/matlab/matlab.tex b/graphics/metapost/contrib/macros/matlab/matlab.tex
new file mode 100644
index 0000000000..caa42b6dd8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/matlab.tex
@@ -0,0 +1,139 @@
+\documentclass{article}
+\usepackage{listings}
+\usepackage{color}
+\usepackage{epsfig}
+
+\definecolor{orange}{rgb}{1,0.5,0}
+\definecolor{bluegreen}{rgb}{0,.6,.6}
+\definecolor{purple}{rgb}{1,0,1}
+
+%\DeclareGraphicsRule{*}{mps}{*}{}
+\begin{document}
+\title{The Matlab MetaPost Package \\
+--- {\tt matlab} style data plotting with {\tt mpgraph}}
+\author{Yang Yang\\
+{\tt yangyang@juggler.ucsd.edu}}
+
+\section{Introduction}
+{\tt matlab.mp} is a MetaPost package for plotting out 2-D data. This
+is a common task for any scientists or engineers. The most frequently
+used tool for doing such tasks are probably {\sf Gnuplot} and {\sf
+Matlab}. But I have not been very satisfied with the plotting quality
+of either. {\sf Gnuplot} is fast, versatile, and you can choose
+between several line styles/widths, but the available line styles are largely
+hard-coded into {\sf Gnuplot}, and not very beautiful. {\sf Matlab}
+generates better plots, but one particular problem with {\sf Matlab}
+made me decided to create something that suits me needs: if you need
+to plot a thick dotted line in {\sf Matlab}, the seperation distance
+between dots along the line stays {\em constant}, so the line
+looks like a ``railroad track'', instead of a dotted line.
+
+Another choice for plotting data is the {\tt mpgraph} MetaPost
+package. The ``weakness'' of this package is that its default style
+does not look like {\sf Matlab} (because I am accustomed to {\sf
+Matlab} style). Plus, the usage of {\tt mpgraph} is not as easy as
+{\sf Matlab}. Then I decided to integrate the rich plotting ability
+of {\tt mpgraph} with the ease of use of {\sf Matlab}.
+
+
+
+\section{Quick Usage}
+The process of plotting a data plot consists of roughly 3 steps:
+(1) read in the data from a data source file. (2) plotting out the
+data, possibly specifying desired line styles. (3) plotting
+``decorations'', i.e. legends, axis labels, grids, etc. Since we use
+{\tt mpgraph} package, steps (2) and (3) should appear within the {\tt
+begingraph}/{\tt endgraph} construct.
+
+Here is a sample file {\tt simple.mp} that uses of {\tt matlab.mp}:
+%
+%
+%
+\input lstmp
+\begin{lstlisting}[frame=single]
+input matlab.mp
+prologues:=0;
+beginfig(1)
+%begin a matlab data plot
+begingrf(5in,4in);
+% read in column 1 of data file "sample_data"
+% and store it as the 0th "data vector" in our repository
+rdata("sample_data", 1);
+% read in column 2 of data file "sample_data"
+% and store it as the 1st "data vector" in our repository
+rdata("sample_data", 2);
+% plot out data, using vector 0 as X values, and vector 1 as Y values
+% well, we have to make sure that the two vectors have the same
+% lengths
+mtplot("0 1");
+ylabel("sample Y label $\alpha$");
+xlabel("sample X label {\bf Bold} and {\it italic} ");
+% do the post-processing
+finishgrf;
+legend(3, 3, "\bf column 1 and 2 of sample\_file");
+endfig;
+end
+\end{lstlisting}
+%
+%
+{\tt sample\_data} is a text file containing columns of numbers.
+Both files can be found in the {\tt examples} directory of the
+package. That directory also contains a Makefile to generate the
+resulting {\tt simple.1} eps file.
+
+\begin{figure}[b]
+\centering
+\epsfig{file=simple.1,width=.6\columnwidth}
+\caption{simple graph}
+\end{figure}
+
+
+
+\section{More Details}
+Now we show in more detail how to draw a data plot. First we call
+{\tt draw begingrf(width,height)}, just as when using {\tt mpgrah}.
+In fact, {\tt begingrf} just calls {\tt begingraph}, and set a few
+default style parameters. Then we read in data from external data
+files by {\tt rdata("file name", column\_index)}. So each call of
+rdata only reads in one column of data, which is stored into an
+internal vector, indexed from 0 upwards.
+
+Then we actually plot out the data by calling {\tt mtplot("X Y
+.....")}. The parameters to this macro are all put into the same
+string, so the implementation can be easier. Parameters are seperated
+by space in the string. There are two required parameters: the column
+index of the data vector to be used as X coordinates, and that for Y.
+The remaining parameters are used to specify line styles. We have {\bf
+4 categories of line styles}: widths, color, marker shape, and line
+pattern (dotted, dashed, etc). Widths are specified by "{\tt
+linewidth}{\bf n}", where {\bf n} is a number giving the linewidth in
+{\tt pt}. Color specification is "{\tt c}{\bf x}", where x is "{\tt
+k|r|g|b|y|o|p}" for black, red, green, blue, yellow, orange, and
+purple, respectively. Marker shape is "{\tt m}{\bf x}", where x is
+{\tt o|x|*|d|s} for circle, cross, star, diamond, and square. Line
+patterns are "{\tt solid, dash, dot, dashdot,
+dddash}" (for dot dot dash) and "{\tt dddot}" (for dash dash dot).
+If you do not specify line styles, each newly plotted line is
+automatically assigned a new style.
+
+
+
+Finally we can plot out the legends, by calling {\tt legend}.
+ The first parameter gives X position, 1,2,3 corresponds to left,
+ center, and right. Similarly, 1,2,3 for the second parameter
+ corresponds to bottom, middle, and top. Axis labels are printed
+ out by {\tt xlabel(s), ylabel(x)}, where {\tt s} is just a
+ string. Since we use the {\tt latexmp} package for strings,
+ you can use any valid latex constructs for the legends and labels.
+
+
+
+\begin{figure}
+\centering
+\epsfig{file=example.1,width=.6\columnwidth}
+\caption{Full feature graph}
+\end{figure}
+
+
+
+\end{document}
diff --git a/graphics/metapost/contrib/macros/matlab/sample_data b/graphics/metapost/contrib/macros/matlab/sample_data
new file mode 100644
index 0000000000..871ca46624
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/sample_data
@@ -0,0 +1,20 @@
+1 19 3 0.05
+2 18 4 0.2
+3 17 5 0.45
+4 16 6 0.8
+5 15 7 1.25
+6 14 8 1.8
+7 13 9 2.45
+8 12 10 3.2
+9 11 11 4.05
+10 10 12 5
+11 9 13 6.05
+12 8 14 7.2
+13 7 15 8.45
+14 6 16 9.8
+15 5 17 11.25
+16 4 18 12.8
+17 3 19 14.45
+18 2 20 16.2
+19 1 21 18.05
+20 0 22 20
diff --git a/graphics/metapost/contrib/macros/matlab/simple.mp b/graphics/metapost/contrib/macros/matlab/simple.mp
new file mode 100644
index 0000000000..fdd68ac6b1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/simple.mp
@@ -0,0 +1,23 @@
+input matlab.mp
+prologues:=0;
+beginfig(1)
+%begin a matlab data plot
+draw begingrf(5in,4in);
+% read in column 1 of data file "sample_data"
+% and store it as the 0th "data vector" in our repository
+rdata("sample_data", 1);
+% read in column 2 of data file "sample_data"
+% and store it as the 1st "data vector" in our repository
+rdata("sample_data", 2);
+% plot out data, using vector 0 as X values, and vector 1 as Y values
+% well, we have to make sure that the two vectors have the same
+% lengths
+mtplot("0 1");
+ylabel("sample Y label $\alpha$");
+xlabel("sample X label {\bf Bold} and {\it italic} ");
+% do the post-processing
+finishgrf;
+legend(3, 3, "\bf column 1 and 2 of sample\_file");
+endfig;
+end
+
diff --git a/graphics/metapost/contrib/macros/matlab/user_guide.pdf b/graphics/metapost/contrib/macros/matlab/user_guide.pdf
new file mode 100644
index 0000000000..48d961a34b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/matlab/user_guide.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/README b/graphics/metapost/contrib/macros/metago/README
new file mode 100644
index 0000000000..a928b6c1e2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/README
@@ -0,0 +1,51 @@
+
+MetaGo (metago.mp)
+
+=== License
+
+Copyright 2008 Wentao Zheng
+
+This work may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, either version 1.3 of this license
+or (at your option) any later version. The latest version of this
+license is in http://www.latex-project.org/lppl.txt and version 1.3 or
+later is part of all distributions of LaTeX version 2005/12/01 or
+later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Wentao Zheng.
+
+This work consists of the file metago.mp
+
+=== What is MetaGo
+
+This package allows you to draw Go game positions with MetaPost
+
+=== How to use
+
+MetaGo provides two approaches for usage
+
+1. Programatic
+
+ Source code: example-program.mp file
+ Output file: example-program.pdf
+
+2. Script-driven
+
+ Source code: example-script.mp, script.go
+ Output files: example-script-1.pdf
+ example-script-2.pdf
+ example-script-3.pdf
+ example-script-4.pdf
+ example-script-5.pdf
+ example-script-6.pdf
+ example-script-7.pdf
+ example-script-8.pdf
+
+=== Bugs
+
+If you find any bugs, please email to
+
+ zhengwt@cn.ibm.com
+ (Wentao Zheng) \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metago/example-program.mp b/graphics/metapost/contrib/macros/metago/example-program.mp
new file mode 100644
index 0000000000..bc5549fc0f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-program.mp
@@ -0,0 +1,19 @@
+input metago;
+
+beginfig(1);
+
+ set_board_color(0.2,0.4,0.6);
+ set_board_size 18;
+ init_board;
+
+ put_b(B18);
+ put_b(B16);
+ put_b(A17);
+ put_w(B17);
+ put_b(C17);
+
+ display_board;
+
+endfig;
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metago/example-program.pdf b/graphics/metapost/contrib/macros/metago/example-program.pdf
new file mode 100644
index 0000000000..60e521659e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-program.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-1.pdf b/graphics/metapost/contrib/macros/metago/example-script-1.pdf
new file mode 100644
index 0000000000..0b4ce2883e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-2.pdf b/graphics/metapost/contrib/macros/metago/example-script-2.pdf
new file mode 100644
index 0000000000..247890019a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-2.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-3.pdf b/graphics/metapost/contrib/macros/metago/example-script-3.pdf
new file mode 100644
index 0000000000..6a296339be
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-3.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-4.pdf b/graphics/metapost/contrib/macros/metago/example-script-4.pdf
new file mode 100644
index 0000000000..1c79282866
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-4.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-5.pdf b/graphics/metapost/contrib/macros/metago/example-script-5.pdf
new file mode 100644
index 0000000000..f0bb92cd8f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-5.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-6.pdf b/graphics/metapost/contrib/macros/metago/example-script-6.pdf
new file mode 100644
index 0000000000..5248593896
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-6.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-7.pdf b/graphics/metapost/contrib/macros/metago/example-script-7.pdf
new file mode 100644
index 0000000000..dbe815b4aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-7.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script-8.pdf b/graphics/metapost/contrib/macros/metago/example-script-8.pdf
new file mode 100644
index 0000000000..bcf75c2b74
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script-8.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metago/example-script.mp b/graphics/metapost/contrib/macros/metago/example-script.mp
new file mode 100644
index 0000000000..551253becc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/example-script.mp
@@ -0,0 +1,5 @@
+input metago;
+
+set_board_size 6; script "script.go";
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metago/metago.mp b/graphics/metapost/contrib/macros/metago/metago.mp
new file mode 100644
index 0000000000..54111ad1de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/metago.mp
@@ -0,0 +1,799 @@
+
+%% metago.mp
+%% Copyright 2008 Wentao Zheng
+ %
+ % This work may be distributed and/or modified under the conditions
+ % of the LaTeX Project Public License, either version 1.3 of this
+ % license or (at your option) any later version. The latest version
+ % of this license is in http://www.latex-project.org/lppl.txt and
+ % version 1.3 or later is part of all distributions of LaTeX version
+ % 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is Wentao Zheng.
+ %
+ % This work consists of the file metago.mp
+
+input string;
+
+% --------------------------------
+% debug variable and logger method
+% --------------------------------
+boolean _DEBUG;
+_DEBUG = true;
+vardef log text t=
+ if _DEBUG:
+ show t;
+ fi;
+enddef;
+
+
+% ------------------------
+% Stack for pair variables
+% ------------------------
+% - declare a stack: stack.s
+% - push a pair into a stack: s.push(<pair>)
+% - pop a pair from a stack: <pair> = s.pop()
+% - clear a stack: s.clear()
+% - check whether a stack is empty: s.empty()
+
+vardef stack@#=
+ string @#.value[];
+ numeric @#.top;
+ @#.top := 1;
+enddef;
+
+vardef pop@#=
+ save tmp;
+ string tmp;
+ if @#.top > 1:
+ @#.top := @#.top - 1;
+ tmp = @#.value[@#.top];
+ else:
+ tmp = "";
+ fi;
+
+ save p;
+ pair p;
+ p = scantokens(tmp);
+ (p)
+enddef;
+
+vardef push@# expr p=
+ @#.value[@#.top] := "(" & (decimal xpart p) & "," & (decimal ypart p) & ")";
+ @#.top := @#.top + 1;
+enddef;
+
+vardef empty@#=
+ (@#.top = 1)
+enddef;
+
+vardef clear@#=
+ @#.top := 1;
+enddef;
+
+%% determine whether two pairs are equal
+vardef _is_pair_equal(expr p,q)=
+ ((xpart p = xpart q) and (ypart p = ypart q))
+enddef;
+
+%% convert a pair to string with the form of "(x,y)"
+vardef _point_str expr p=
+ ((decimal xpart p) & "," & (decimal ypart p))
+enddef;
+
+% --------------------
+% Parameters of MetaGo
+% --------------------
+
+u = 10pt; % !IMPORTANT, unit metric, DON'T user it or modify it
+
+color board_color; % color of board background color
+
+cell_width = 2u;
+cell_line_width = .05u;
+
+board_gap = 3u;
+board_dot_d = .4u;
+board_color = (1,200/255,100/255);
+board_size = 19;
+
+stone_d = .9cell_width;
+stone_line_width = cell_line_width;
+
+
+% -------------------------------------------
+% Internal functions (DO NOT use/modify them)
+% -------------------------------------------
+
+% Go coord: 0-18, 0-18 (internal coord)
+% MP coord: 0-18u + gap, 0-(-18u) + gap
+transform GoToMP;
+GoToMP := identity xscaled cell_width yscaled -cell_width
+shifted (board_gap,-board_gap);
+
+vardef mp_pos expr p=
+ (p transformed GoToMP)
+enddef;
+
+vardef draw_cell expr p=
+ save i,j;
+ i = xpart p;
+ j = ypart p;
+ draw (mp_pos (i,j)) -- (mp_pos (i+1,j)) -- (mp_pos (i+1,j+1))
+ -- (mp_pos (i,j+1)) -- cycle withpen pencircle scaled cell_line_width;
+enddef;
+
+vardef draw_dot expr p=
+ fill (fullcircle scaled board_dot_d) shifted (mp_pos p);
+enddef;
+
+vardef _draw_stone(expr p,c)=
+ save circ; path circ;
+ circ = (fullcircle scaled stone_d) shifted p;
+ fill circ withcolor c;
+ draw circ withpen pencircle scaled stone_line_width;
+enddef;
+
+vardef draw_stone@# expr p=
+ string type;
+ type = str @#;
+ if (type = "b") or (type = "B"):
+ _draw_stone((mp_pos p),black);
+ elseif (type = "w") or (type = "W"):
+ _draw_stone((mp_pos p),white);
+ else:
+ show "ERROR of stone type: " & type & "!!";
+ fi;
+enddef;
+
+% fout direction point of the pair p:
+% up, down, left, right
+% p \in (1-board_size,1-board_size)
+% if p is one the edge of the board, return p itself
+
+vardef _up expr p=
+ if (ypart p) = 1:
+ (xpart p, ypart p)
+ else:
+ (xpart p, ypart p - 1)
+ fi
+enddef;
+
+vardef _down expr p=
+ if (ypart p) = board_size:
+ (xpart p, ypart p)
+ else:
+ (xpart p, ypart p + 1)
+ fi
+enddef;
+
+vardef _left expr p=
+ if (xpart p) = 1:
+ (xpart p, ypart p)
+ else:
+ (xpart p - 1, ypart p)
+ fi
+enddef;
+
+vardef _right expr p=
+ if (xpart p) = board_size:
+ (xpart p, ypart p)
+ else:
+ (xpart p + 1, ypart p)
+ fi
+enddef;
+
+% board memory: 1 ~ board_size, 1 ~ board_size
+% - 0 means empty
+% - -1 means white
+% - 1 means black
+WHITE = -1;
+BLACK = 1;
+EMPTY = 0;
+numeric mem[][];
+for i=1 upto board_size:
+ for j=1 upto board_size:
+ mem[i][j] = EMPTY;
+ endfor;
+endfor;
+
+vardef MEM expr p=
+ if (xpart p < 1) or (xpart p > board_size)
+ or (ypart p < 1) or (ypart p > board_size):
+ (2)
+ else:
+ (mem[xpart p][ypart p])
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Open functions for Go visualization %%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% draw empty Go board
+vardef draw_board=
+ %% draw board side and fill color
+ save board; path board;
+ board = origin -- (mp_pos(board_size-1,0)) + (board_gap,board_gap)
+ -- (mp_pos(board_size-1,board_size-1)) + (board_gap,-board_gap)
+ -- (mp_pos(0,board_size-1)) + (-board_gap,-board_gap) -- cycle;
+ fill board withcolor board_color;
+ draw board;
+
+ %% draw cells
+ for i=0 upto board_size-2:
+ for j=0 upto board_size-2:
+ draw_cell (i,j);
+ endfor;
+ endfor;
+
+ %% draw dot if size = 19
+ if board_size = 19:
+ for i=3 step 6 until 15:
+ for j=3 step 6 until 15:
+ draw_dot (i,j);
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+vardef _char expr p=
+ char(ASCII("A") + (p-1))
+enddef;
+
+%% draw label
+vardef draw_label=
+ for i=1 upto board_size:
+ label(_char i, mp_pos(i-1,-1));
+ label(_char i, mp_pos(i-1,board_size));
+
+ label((decimal i), mp_pos(-1,board_size-i));
+ label((decimal i), mp_pos(board_size,board_size-i));
+ endfor;
+enddef;
+
+%% put a stone on postion p
+%% B - black stone, p: 1~board_size, 1~board_size
+%% W - white stone, p: 1~board_size, 1~board_size
+%% C - clear stone, p: 1~board_size, 1~board_size
+
+vardef B expr p=
+ log "black " & (_point_str p);
+ if IS_PUT:
+ append_put "B " & (decimal (xpart p)) & " " & (decimal (ypart p));
+ fi;
+ mem[xpart p][ypart p] := BLACK;
+enddef;
+
+vardef W expr p=
+ log "white " & (_point_str p);
+ if IS_PUT:
+ append_put "W " & (decimal (xpart p)) & " " & (decimal (ypart p));
+ fi;
+ mem[xpart p][ypart p] := WHITE;
+enddef;
+
+vardef C expr p=
+ log "clear " & (_point_str p);
+ if IS_PUT:
+ if mem[xpart p][ypart p] = BLACK:
+ append_put "b " & (decimal (xpart p)) & " " & (decimal (ypart p));
+ elseif mem[xpart p][ypart p] = WHITE:
+ append_put "w " & (decimal (xpart p)) & " " & (decimal (ypart p));
+ fi;
+ fi;
+ mem[xpart p][ypart p] := EMPTY;
+enddef;
+
+%% draw current stones on board
+vardef draw_stones=
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ if mem[i][j] = BLACK:
+ draw_stone.b(i-1,j-1);
+ elseif mem[i][j] = WHITE:
+ draw_stone.w(i-1,j-1);
+ elseif mem[i][j] = EMPTY:
+ else
+ show "ERROR board memory with value " & (decimal mem[i][j]) & "!!";
+ fi;
+ endfor;
+ endfor;
+enddef;
+
+%% check life_or_death for all stones
+%% if stone s is dead, clear s from mem
+vardef life_or_death=
+ save m,count,ld;
+ numeric m[][];
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ m[i][j] = -1; %% -1, not checked; 0, pushed; 1 ..., checked
+ endfor;
+ endfor;
+
+ count = 1;
+ boolean ld[];
+ stack.h;
+
+ %% grouping and check life_or_death
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ if (m[i][j] = -1) and not ((MEM(i,j)) = EMPTY):
+ push.h(i,j);
+ m[i][j] := 0;
+ ld[count] := false;
+
+ forever:
+ exitif empty.h;
+
+ save test,p;
+ pair test[],p;
+
+ p := pop.h;
+ m[xpart p][ypart p] := count;
+
+ test[1] := _up p;
+ test[2] := _down p;
+ test[3] := _left p;
+ test[4] := _right p;
+
+ for k=1 upto 4:
+ if ((MEM test[k]) = (MEM(i,j))) and
+ (m[xpart test[k]][ypart test[k]] = -1):
+ push.h(test[k]);
+ m[xpart test[k]][ypart test[k]] := 0;
+ fi;
+
+ if (MEM test[k]) = EMPTY:
+ ld[count] := true;
+ fi;
+ endfor;
+ endfor;
+
+ count := count+1;
+ clear.s;
+ fi;
+ endfor;
+ endfor;
+
+ %% clear dead stones
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ if m[i][j] > 0:
+ if ld[m[i][j]] = false:
+ C(i,j);
+ fi;
+ fi;
+ endfor;
+ endfor;
+enddef;
+
+%% check if added stone at p captures other stones
+vardef _capture expr p=
+ save test;
+ pair test[];
+
+ test[1] := _up p;
+ test[2] := _down p;
+ test[3] := _left p;
+ test[4] := _right p;
+ for i=1 upto 4:
+ if (MEM test[i]) = -(MEM p):
+ _check_death_of(test[i]);
+ fi;
+ endfor;
+enddef;
+
+vardef _check_death_of expr pp=
+ stack.h;
+ numeric m[][];
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ m[i][j] = -1; %% un-pushed
+ endfor;
+ endfor;
+
+ push.h pp;
+ m[xpart pp][ypart pp] := 0;
+ save ld; boolean ld;
+ ld = false;
+
+ forever:
+ exitif empty.h;
+
+ save test,p;
+ pair test[],p;
+
+ p := pop.h;
+ %m[xpart p][ypart p] := 1;
+
+ test[1] := _up p;
+ test[2] := _down p;
+ test[3] := _left p;
+ test[4] := _right p;
+
+ for k=1 upto 4:
+ if ((MEM test[k]) = (MEM p)) and
+ (m[xpart test[k]][ypart test[k]] = -1):
+ push.h(test[k]);
+ m[xpart test[k]][ypart test[k]] := 0;
+ fi;
+
+ if (MEM test[k]) = EMPTY:
+ ld := true;
+ fi;
+ endfor;
+ endfor;
+
+ if ld = false:
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ if m[i][j] = 0:
+ C(i,j);
+ fi;
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+%% check if added stone at p is dead
+vardef _suicide expr p=
+ _check_death_of p;
+enddef;
+
+%% putting stone history
+boolean IS_PUT;
+IS_PUT = false;
+string put_history[];
+numeric cur_put_his;
+cur_put_his = 1;
+string put_his;
+
+%% begin a put action
+vardef beginput=
+ IS_PUT := true;
+ put_his := "";
+enddef;
+
+%% append stoning in a put action
+vardef append_put text t=
+ if (length put_his) = 0:
+ put_his := t;
+ else:
+ put_his := put_his & " " & t;
+ fi;
+enddef;
+
+%% end a put action
+vardef endput=
+ IS_PUT := false;
+ put_history[cur_put_his] := put_his;
+ log "append history: " & put_his;
+ cur_put_his := cur_put_his + 1;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% high level functions (encourged for use) %%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% set_board_size
+% set_board_color
+% init_board
+% put_b / put_w
+% display_board
+
+%% set board size between 1 and 19
+%% default value is 19
+vardef set_board_size expr p=
+ if (p > 0) and (p < 20):
+ board_size := p;
+ fi;
+enddef;
+
+%% set board color with rgb triple (r,g,b)
+vardef set_board_color text t=
+ board_color := t;
+enddef;
+
+%% init the board with no stones
+vardef init_board=
+ save db; boolean db;
+ db = _DEBUG;
+ _DEBUG := false;
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ C(i,j);
+ endfor;
+ endfor;
+ _DEBUG := db;
+enddef;
+
+%% generate a random distributed board with stones
+vardef random_board expr clear_ratio=
+ save tmp;
+ for i=1 upto board_size:
+ for j=1 upto board_size:
+ tmp := normaldeviate;
+ if tmp > 0.5 clear_ratio:
+ put_black(i,j);
+ elseif tmp < -0.5 clear_ratio:
+ put_white(i,j);
+ fi;
+ endfor;
+ endfor;
+enddef;
+
+%% generate a random location ranged from (1,1)--(board_size,board_size)
+vardef random_loc=
+ save x,y;
+ x = (uniformdeviate board_size);
+ y = (uniformdeviate board_size);
+
+ x := floor (abs (x - 0.0001));
+ y := floor (abs (y - 0.0001));
+
+ (x+1,y+1)
+enddef;
+
+%% display the Go board together with label, stones
+vardef display_board=
+ draw_board;
+ draw_label;
+ draw_stones;
+enddef;
+
+%% put a black stone at postion pp, if possible
+%% check life and death after putting the stone
+%% re-put the stone to make sure it survive
+vardef put_black expr pp=
+ save p;
+ pair p;
+ if pair pp:
+ p := pp;
+ else:
+ p := (random_loc);
+ fi;
+ %show "put black at " & (_point_str p);
+ if (legal_loc p):
+ beginput;
+ B p;
+ _capture p;
+ _suicide p;
+ endput;
+ fi;
+enddef;
+
+vardef put_b(text t)=
+ save tt,h,v;
+ string tt;
+ numeric h,v;
+ tt = str t;
+ h = ASCII(substring (0,1) of tt) - ASCII("A") + 1;
+ v = board_size - scantokens(substring (1, length tt) of tt) + 1;
+ % show h, v;
+ put_black(h,v);
+enddef;
+
+%% put a white stone at postion pp, if possible
+%% check life and death after putting the stone
+%% re-put the stone to make sure it survive
+vardef put_white expr pp=
+ save p;
+ pair p;
+ if pair pp:
+ p := pp;
+ else:
+ p := (random_loc);
+ fi;
+ %show "put white at " & (_point_str p);
+ if (legal_loc p):
+ beginput;
+ W p;
+ _capture p;
+ _suicide p;
+ endput;
+ fi;
+enddef;
+
+vardef put_w(text t)=
+ save tt,h,v;
+ string tt;
+ numeric h,v;
+ tt = str t;
+ h = ASCII(substring (0,1) of tt) - ASCII("A") + 1;
+ v = board_size - scantokens(substring (1, length tt) of tt) + 1;
+ % show h, v;
+ put_white(h,v);
+enddef;
+
+%% remove stone from position pp, if possible
+vardef remove_stone expr pp=
+ if (xpart pp > 0) and (xpart pp < board_size+1)
+ and (ypart pp > 0) and (ypart pp < board_size+1):
+ C pp;
+ fi;
+enddef;
+
+%% determine whether putting stone at p is leagal
+%% mem[p] is empty, and p is not out of bound
+vardef legal_loc expr p=
+ save tmp;
+ tmp = 1;
+ save x,y;
+ x = xpart p;
+ y = ypart p;
+ if ((xpart p) < 1) or ((xpart p) > board_size)
+ or ((ypart p) < 1) or ((ypart p) > board_size):
+ show "ILLEGAL OPERATION, cell out of bound";
+ (tmp = 2)
+ elseif not ((MEM p) = EMPTY):
+ show "ILLEGAL OPERATION, cell occupied";
+ (tmp = 2)
+ else:
+ % save prev; string prev;
+% prev = put_history[cur_put_his-1];
+
+% if:
+% show "ILLEGAL OPERATION, re-put comflict";
+% (tmp = 2)
+% else:
+ (tmp = 1)
+% fi
+ fi
+enddef;
+
+%% go script file, plain format, i.e., color x-coord y-coord
+string GO_FILE;
+GO_FILE := "";
+FIG_COUNT = 1;
+
+%% generate boards based on go script
+vardef generate_boards_from_file=
+ if (length GO_FILE) < 1:
+ else:
+ save line,x,y,t;
+ string line,t;
+
+ init_board;
+ display_board_fig; % empty board
+ forever:
+ line := readfrom GO_FILE;
+ exitif (length line) < 3;
+
+ t := loptok line;
+ x := scantokens(loptok line);
+ y := scantokens(loptok line);
+
+ %show "read position " & t & "=(" & (decimal x) & "," & (decimal y) & ")";
+
+ if (t = "b") or (t = "B"):
+ put_black(x,y);
+ elseif (t = "w") or (t = "W"):
+ put_white(x,y);
+ fi;
+ display_board_fig;
+ endfor;
+ fi;
+enddef;
+
+%% display board in new fig
+vardef display_board_fig=
+ beginfig(FIG_COUNT);
+ display_board;
+ FIG_COUNT := FIG_COUNT + 1;
+ endfig;
+enddef;
+
+%GO_FILE := "test.go";
+%generate_boards_from_file;
+
+%% if possible to retract the last put action
+vardef can_restore=
+ (cur_put_his > 1)
+enddef;
+
+%% extract put action from string
+vardef _extract_put suffix s=
+ save t,x,y;
+ string t,x,y;
+ if (length s) < 1:
+ ""
+ else:
+ t = loptok s;
+ x = loptok s;
+ y = loptok s;
+ t & "(" & x & "," & y & ")"
+ fi
+enddef;
+
+%% reverse put action, C->B|W, B|C, W|C
+vardef _reverse suffix s=
+ save t;
+ string t;
+ t = substring (0,1) of s;
+ if (t = "B") or (t = "W"):
+ t := "C";
+ else:
+ t := char(ASCII("A") + ASCII(t) - ASCII("a"));
+ fi;
+ t & (substring (1,length s) of s)
+enddef;
+
+%% retract the last put action
+vardef restore=
+ save prev,act;
+ string prev,act;
+ prev = put_history[cur_put_his-1];
+ cur_put_his := cur_put_his - 1;
+
+ forever:
+ act := _extract_put prev;
+ exitif (length act) = 0;
+ log "restore: " & act;
+ scantokens(_reverse act);
+ endfor;
+enddef;
+
+%% putting stones, format: {B|W}{A-Z}{decimal}
+vardef stone text tt=
+ if (length tt) < 3:
+ show "ERROR: stone string illegal";
+ else:
+ save t,ys,xs;
+ string t,ys,xs;
+ t = loptok tt; %substring (0,1) of tt;
+ xs = loptok tt; %substring (1,2) of tt;
+ ys := loptok tt; %substring (2,length tt) of tt;
+
+ save x,y;
+ x = ASCII(xs) - ASCII("A") + 1;
+ y = board_size - scantokens(ys) + 1;
+
+ log "stone " & t & " at " & (decimal x) & "," & (decimal y);
+ if (t = "B") or (t = "b"):
+ put_black(x,y);
+ elseif (t = "W") or (t = "w"):
+ put_white(x,y);
+ fi;
+ fi;
+enddef;
+
+%% retract the last stoning action if possible
+vardef retract=
+ if can_restore:
+ restore;
+ else:
+ show "restore can not be performed";
+ fi;
+enddef;
+
+%% scripting on file
+vardef script text file=
+ save sf;
+ string sf; sf = file;
+ if (length sf) < 1:
+ show "ERROR: script file name illegal";
+ else:
+ save line,x,y,t;
+ string line,t;
+
+ %set_board_size scantokens(readfrom sf);
+ init_board;
+ %display_board_fig; % empty board
+ forever:
+ line := readfrom sf;
+ exitif (length line) < 3;
+
+ stone line;
+ display_board_fig;
+ endfor;
+ fi;
+enddef;
+
+_DEBUG := false;
+
+%script "script.go";
+
diff --git a/graphics/metapost/contrib/macros/metago/script.go b/graphics/metapost/contrib/macros/metago/script.go
new file mode 100644
index 0000000000..af6805ab09
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metago/script.go
@@ -0,0 +1,8 @@
+B A 6
+W B 5
+B B 4
+W A 4
+B E 2
+W B 3
+B E 1
+W C 4
diff --git a/graphics/metapost/contrib/macros/metaobj/README b/graphics/metapost/contrib/macros/metaobj/README
new file mode 100644
index 0000000000..9fed9c2234
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/README
@@ -0,0 +1,46 @@
+README file for release 0.83 of METAOBJ
+---------------------------------------
+
+Installation
+------------
+
+ Install the file inputs/metaobj.mp on your metapost path, typically under
+
+ .../texmf/metapost/metaobj/
+
+ On UNIX, you may need to run texhash or something like this, so that your
+ TeX installation knows about the new file.
+
+Testing
+-------
+
+ In order to test the package, take any .mp file from the examples
+ directory, for instance mobjstandard.mp, and do the following:
+
+ mpost mobjstandard.mp
+ tex mproof mobjstandard.[0-9]*
+ dvips mproof.dvi -o
+ gv mproof.ps
+
+ If you run into problems, you may have to increase your metapost
+ environment. Try to increase first the limits you have reached.
+ In order to do this, create a texmf.cnf file and put the
+ environment variables with the new values. Recreate the metapost format
+ with inimpost mpost.ini, but be sure the texmf.cmf file you have
+ created is taken into account. (Do something like setenv TEXMFCNF .:
+ or export TEXMF=.: if needed.) And then compile again.
+ Eventually, you should be able to compile the example.
+
+ Note: the compilation of proofex.mp is very slow, be patient.
+
+Documentation
+-------------
+
+ A manual is in the doc directory.
+ The metaobj.mp code is not formatted with mft, because mft can't
+ handle many of metaobj's idiosyncrasies.
+
+
+Denis Roegel, August 2, 2003.
+
+
diff --git a/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf b/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
new file mode 100644
index 0000000000..e113a1d906
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/doc/momanual.pdf
@@ -0,0 +1,23593 @@
+%PDF-1.3
+5 0 obj
+<< /S /GoTo /D (section.1) >>
+endobj
+8 0 obj
+(Cover)
+endobj
+9 0 obj
+<< /S /GoTo /D (section.1) >>
+endobj
+11 0 obj
+(Table of contents)
+endobj
+12 0 obj
+<< /S /GoTo /D (section.2) >>
+endobj
+15 0 obj
+(Introduction)
+endobj
+16 0 obj
+<< /S /GoTo /D (subsection.3) >>
+endobj
+19 0 obj
+(Low-level Metapost)
+endobj
+20 0 obj
+<< /S /GoTo /D (subsection.4) >>
+endobj
+23 0 obj
+(METAOBJ requirements)
+endobj
+24 0 obj
+<< /S /GoTo /D (subsection.5) >>
+endobj
+27 0 obj
+(An appetizer)
+endobj
+28 0 obj
+<< /S /GoTo /D (subsection.6) >>
+endobj
+31 0 obj
+(What is an object?)
+endobj
+32 0 obj
+<< /S /GoTo /D (subsubsection.7) >>
+endobj
+35 0 obj
+(A name)
+endobj
+36 0 obj
+<< /S /GoTo /D (subsubsection.9) >>
+endobj
+39 0 obj
+(Points)
+endobj
+40 0 obj
+<< /S /GoTo /D (subsubsection.10) >>
+endobj
+43 0 obj
+(Equations)
+endobj
+44 0 obj
+<< /S /GoTo /D (subsubsection.11) >>
+endobj
+47 0 obj
+(Pictures)
+endobj
+48 0 obj
+<< /S /GoTo /D (subsubsection.12) >>
+endobj
+51 0 obj
+(Paths)
+endobj
+52 0 obj
+<< /S /GoTo /D (subsubsection.13) >>
+endobj
+55 0 obj
+(Subobjects)
+endobj
+56 0 obj
+<< /S /GoTo /D (subsubsection.14) >>
+endobj
+59 0 obj
+(Other components)
+endobj
+60 0 obj
+<< /S /GoTo /D (subsection.15) >>
+endobj
+63 0 obj
+(Transformations)
+endobj
+64 0 obj
+<< /S /GoTo /D (section.16) >>
+endobj
+67 0 obj
+(A first object)
+endobj
+68 0 obj
+<< /S /GoTo /D (subsection.17) >>
+endobj
+71 0 obj
+(A segment)
+endobj
+72 0 obj
+<< /S /GoTo /D (subsection.18) >>
+endobj
+75 0 obj
+(Connecting two objects)
+endobj
+76 0 obj
+<< /S /GoTo /D (subsection.19) >>
+endobj
+79 0 obj
+(Creating an object containing objects)
+endobj
+80 0 obj
+<< /S /GoTo /D (section.21) >>
+endobj
+83 0 obj
+(Interfaces and reusability)
+endobj
+84 0 obj
+<< /S /GoTo /D (subsection.22) >>
+endobj
+87 0 obj
+(Standard points)
+endobj
+88 0 obj
+<< /S /GoTo /D (subsection.23) >>
+endobj
+91 0 obj
+(Standard equations)
+endobj
+92 0 obj
+<< /S /GoTo /D (section.24) >>
+endobj
+95 0 obj
+(Real examples)
+endobj
+96 0 obj
+<< /S /GoTo /D (section.27) >>
+endobj
+99 0 obj
+(Advanced operations)
+endobj
+100 0 obj
+<< /S /GoTo /D (subsection.28) >>
+endobj
+103 0 obj
+(Streamlined constructors)
+endobj
+104 0 obj
+<< /S /GoTo /D (subsection.29) >>
+endobj
+107 0 obj
+(Cloning)
+endobj
+108 0 obj
+<< /S /GoTo /D (subsection.30) >>
+endobj
+111 0 obj
+(Fiddling with the bounding box)
+endobj
+112 0 obj
+<< /S /GoTo /D (subsubsection.31) >>
+endobj
+115 0 obj
+(BB: a new bounding box layer)
+endobj
+116 0 obj
+<< /S /GoTo /D (subsubsection.33) >>
+endobj
+119 0 obj
+(Rebinding an object)
+endobj
+120 0 obj
+<< /S /GoTo /D (subsection.34) >>
+endobj
+123 0 obj
+(Unattaching an object)
+endobj
+124 0 obj
+<< /S /GoTo /D (subsection.35) >>
+endobj
+127 0 obj
+(Options)
+endobj
+128 0 obj
+<< /S /GoTo /D (subsubsection.36) >>
+endobj
+131 0 obj
+(Syntax)
+endobj
+132 0 obj
+<< /S /GoTo /D (subsubsection.37) >>
+endobj
+135 0 obj
+(Option types)
+endobj
+136 0 obj
+<< /S /GoTo /D (subsubsection.38) >>
+endobj
+139 0 obj
+(Option definition)
+endobj
+140 0 obj
+<< /S /GoTo /D (subsubsection.39) >>
+endobj
+143 0 obj
+(Option names)
+endobj
+144 0 obj
+<< /S /GoTo /D (subsection.40) >>
+endobj
+147 0 obj
+(Adding paths to objects)
+endobj
+148 0 obj
+<< /S /GoTo /D (subsection.41) >>
+endobj
+151 0 obj
+(Connections)
+endobj
+152 0 obj
+<< /S /GoTo /D (subsubsection.43) >>
+endobj
+155 0 obj
+(ncline)
+endobj
+156 0 obj
+<< /S /GoTo /D (subsubsection.44) >>
+endobj
+159 0 obj
+(nccurve)
+endobj
+160 0 obj
+<< /S /GoTo /D (subsubsection.45) >>
+endobj
+163 0 obj
+(ncarc)
+endobj
+164 0 obj
+<< /S /GoTo /D (subsubsection.46) >>
+endobj
+167 0 obj
+(ncbar)
+endobj
+168 0 obj
+<< /S /GoTo /D (subsubsection.47) >>
+endobj
+171 0 obj
+(ncangle)
+endobj
+172 0 obj
+<< /S /GoTo /D (subsubsection.48) >>
+endobj
+175 0 obj
+(ncangles)
+endobj
+176 0 obj
+<< /S /GoTo /D (subsubsection.49) >>
+endobj
+179 0 obj
+(ncdiag)
+endobj
+180 0 obj
+<< /S /GoTo /D (subsubsection.50) >>
+endobj
+183 0 obj
+(ncdiagg)
+endobj
+184 0 obj
+<< /S /GoTo /D (subsubsection.51) >>
+endobj
+187 0 obj
+(ncloop)
+endobj
+188 0 obj
+<< /S /GoTo /D (subsubsection.52) >>
+endobj
+191 0 obj
+(nccircle)
+endobj
+192 0 obj
+<< /S /GoTo /D (subsubsection.53) >>
+endobj
+195 0 obj
+(ncbox)
+endobj
+196 0 obj
+<< /S /GoTo /D (subsubsection.54) >>
+endobj
+199 0 obj
+(ncarcbox)
+endobj
+200 0 obj
+<< /S /GoTo /D (subsubsection.55) >>
+endobj
+203 0 obj
+(nczigzag and nccoil)
+endobj
+204 0 obj
+<< /S /GoTo /D (subsubsection.56) >>
+endobj
+207 0 obj
+(Tree and matrix variants)
+endobj
+208 0 obj
+<< /S /GoTo /D (subsection.57) >>
+endobj
+211 0 obj
+(Adding labels)
+endobj
+212 0 obj
+<< /S /GoTo /D (section.59) >>
+endobj
+215 0 obj
+(The object structure)
+endobj
+216 0 obj
+<< /S /GoTo /D (section.65) >>
+endobj
+219 0 obj
+(Standard Library -- Gallery)
+endobj
+220 0 obj
+<< /S /GoTo /D (subsection.66) >>
+endobj
+223 0 obj
+(Basic objects)
+endobj
+224 0 obj
+<< /S /GoTo /D (subsubsection.67) >>
+endobj
+227 0 obj
+(EmptyBox)
+endobj
+228 0 obj
+<< /S /GoTo /D (subsubsection.69) >>
+endobj
+231 0 obj
+(HRazor)
+endobj
+232 0 obj
+<< /S /GoTo /D (subsubsection.70) >>
+endobj
+235 0 obj
+(RandomBox)
+endobj
+236 0 obj
+<< /S /GoTo /D (subsection.72) >>
+endobj
+239 0 obj
+(Basic containers)
+endobj
+240 0 obj
+<< /S /GoTo /D (subsubsection.73) >>
+endobj
+243 0 obj
+(Box)
+endobj
+244 0 obj
+<< /S /GoTo /D (subsubsection.76) >>
+endobj
+247 0 obj
+(Polygon)
+endobj
+248 0 obj
+<< /S /GoTo /D (subsubsection.78) >>
+endobj
+251 0 obj
+(Ellipse)
+endobj
+252 0 obj
+<< /S /GoTo /D (subsubsection.80) >>
+endobj
+255 0 obj
+(Circle)
+endobj
+256 0 obj
+<< /S /GoTo /D (subsubsection.83) >>
+endobj
+259 0 obj
+(DBox)
+endobj
+260 0 obj
+<< /S /GoTo /D (subsubsection.85) >>
+endobj
+263 0 obj
+(DEllipse)
+endobj
+264 0 obj
+<< /S /GoTo /D (subsection.87) >>
+endobj
+267 0 obj
+(Box alignment constructors)
+endobj
+268 0 obj
+<< /S /GoTo /D (subsubsection.88) >>
+endobj
+271 0 obj
+(HBox)
+endobj
+272 0 obj
+<< /S /GoTo /D (subsubsection.90) >>
+endobj
+275 0 obj
+(VBox)
+endobj
+276 0 obj
+<< /S /GoTo /D (subsection.92) >>
+endobj
+279 0 obj
+(Recursive objects and fractals)
+endobj
+280 0 obj
+<< /S /GoTo /D (subsubsection.93) >>
+endobj
+283 0 obj
+(RecursiveBox)
+endobj
+284 0 obj
+<< /S /GoTo /D (subsubsection.96) >>
+endobj
+287 0 obj
+(VonKochFlake)
+endobj
+288 0 obj
+<< /S /GoTo /D (subsection.97) >>
+endobj
+291 0 obj
+(Trees)
+endobj
+292 0 obj
+<< /S /GoTo /D (subsubsection.98) >>
+endobj
+295 0 obj
+(Tree)
+endobj
+296 0 obj
+<< /S /GoTo /D (subsubsection.106) >>
+endobj
+299 0 obj
+(PTree)
+endobj
+300 0 obj
+<< /S /GoTo /D (subsection.112) >>
+endobj
+303 0 obj
+(Matrices)
+endobj
+304 0 obj
+<< /S /GoTo /D (subsubsection.113) >>
+endobj
+307 0 obj
+(Experimental constructions)
+endobj
+308 0 obj
+<< /S /GoTo /D (subsubsection.114) >>
+endobj
+311 0 obj
+(Matrices with brackets \(experimental\))
+endobj
+312 0 obj
+<< /S /GoTo /D (subsubsection.115) >>
+endobj
+315 0 obj
+(Matrix with labels)
+endobj
+316 0 obj
+<< /S /GoTo /D (subsubsection.116) >>
+endobj
+319 0 obj
+(Matrix options)
+endobj
+320 0 obj
+<< /S /GoTo /D (subsection.118) >>
+endobj
+323 0 obj
+(PSTricks/METAOBJ gallery)
+endobj
+324 0 obj
+<< /S /GoTo /D (section.153) >>
+endobj
+327 0 obj
+(Class builder manual)
+endobj
+328 0 obj
+<< /S /GoTo /D (subsection.154) >>
+endobj
+331 0 obj
+(Components of a class)
+endobj
+332 0 obj
+<< /S /GoTo /D (subsubsection.155) >>
+endobj
+335 0 obj
+(Constructor)
+endobj
+336 0 obj
+<< /S /GoTo /D (subsubsection.156) >>
+endobj
+339 0 obj
+(Streamlined constructor)
+endobj
+340 0 obj
+<< /S /GoTo /D (subsubsection.157) >>
+endobj
+343 0 obj
+(Bounding path)
+endobj
+344 0 obj
+<< /S /GoTo /D (subsubsection.158) >>
+endobj
+347 0 obj
+(Drawing function)
+endobj
+348 0 obj
+<< /S /GoTo /D (subsubsection.159) >>
+endobj
+351 0 obj
+(Alternate constructors)
+endobj
+352 0 obj
+<< /S /GoTo /D (subsubsection.160) >>
+endobj
+355 0 obj
+(Additional functions)
+endobj
+356 0 obj
+<< /S /GoTo /D (subsubsection.161) >>
+endobj
+359 0 obj
+(Option declarations)
+endobj
+360 0 obj
+<< /S /GoTo /D (subsubsection.162) >>
+endobj
+363 0 obj
+(Default values for options)
+endobj
+364 0 obj
+<< /S /GoTo /D (subsection.163) >>
+endobj
+367 0 obj
+(Design rules)
+endobj
+368 0 obj
+<< /S /GoTo /D (section.164) >>
+endobj
+371 0 obj
+(Non-linear transformations on objects)
+endobj
+372 0 obj
+<< /S /GoTo /D (subsection.165) >>
+endobj
+375 0 obj
+(Simple transformations which do not change the layout)
+endobj
+376 0 obj
+<< /S /GoTo /D (subsubsection.166) >>
+endobj
+379 0 obj
+(Example 1: changing the frame color)
+endobj
+380 0 obj
+<< /S /GoTo /D (subsubsection.167) >>
+endobj
+383 0 obj
+(Example 2: changing the content of a label)
+endobj
+384 0 obj
+<< /S /GoTo /D (subsection.168) >>
+endobj
+387 0 obj
+(Transformations that change the layout)
+endobj
+388 0 obj
+<< /S /GoTo /D (section.170) >>
+endobj
+391 0 obj
+(Comparison with other packages)
+endobj
+392 0 obj
+<< /S /GoTo /D (subsection.171) >>
+endobj
+395 0 obj
+(Compatibility with boxes.mp)
+endobj
+396 0 obj
+<< /S /GoTo /D (subsection.172) >>
+endobj
+399 0 obj
+(fancybox package)
+endobj
+400 0 obj
+<< /S /GoTo /D (subsection.173) >>
+endobj
+403 0 obj
+(PSTricks)
+endobj
+404 0 obj
+<< /S /GoTo /D (section.174) >>
+endobj
+407 0 obj
+(Memory requirements -- Metapost bug)
+endobj
+408 0 obj
+<< /S /GoTo /D (section.176) >>
+endobj
+411 0 obj
+(Using METAOBJ from within TeX)
+endobj
+412 0 obj
+<< /S /GoTo /D (section*.177) >>
+endobj
+415 0 obj
+(Conclusion)
+endobj
+416 0 obj
+<< /S /GoTo /D (section*.178) >>
+endobj
+419 0 obj
+(Acknowledgments)
+endobj
+420 0 obj
+<< /S /GoTo /D (section*.179) >>
+endobj
+423 0 obj
+(References)
+endobj
+424 0 obj
+<< /S /GoTo /D (section*.180) >>
+endobj
+427 0 obj
+(Index)
+endobj
+428 0 obj
+<< /S /GoTo /D [429 0 R /Fit ] >>
+endobj
+431 0 obj <<
+/Length 8026
+/Filter /FlateDecode
+>>
+stream
+xÚíIs$Çy†ïý+úD°Û¹/7KÖ”e;È™Åà B…Ä€¢åð÷û|YÕ]@7F C´‚ž¶ÂœFVåöí[fùµÓÿüÚ‡´m.¬krÛÞÛúâfåÖïõè÷+?½SÜVÏ_GnbÌÛúzS‹Þ
+Ëwž¾›¶½…1̯_¯þéw¾®}ݟׯ¿±W^¿ûêìõ·çþìòüë×Ð mñB ÛÔ¦—n.ÎC8{s÷öÏӛˡšÛæ¦W~x¸»¿z£A¯Ï7Ñ©“~Þ¾¿ï/Ï7þì›Q?î/o/ø÷r<½ys{êÙo®Ç$!®½ßöl“'¨4¿.Ú}µ™þä\œVÓ/n|÷ÛZUÞúØíÝß\Þ^}Ð,þKÍ~w¾Ñ¯Ë÷—6Ózšjãã¶kÓôøãè½/?ÿÕg£×¿Û6.þ:þú“ËNÿî¼iã‰mHíÞFÔrJžÆ›W«.¶Úè«MÛœgÐÝߘ÷üçúŸ XnÙý‘Ýö° µOì¦ßôbÈÙ„¸M©ØÃW—ß=\Þ
+7Ý¿__þ~`;¤@ïž7^y$oŸëüõ´Ë‰¶W$+ŸŽ9ø%ˆh‚¶é?Ê7_ʶU½‹R°W¿_ï÷·ú7ú­Ûï“ÿŠ¹£ºÍëW_­¿vëwzüýÿŸWÞ­ÿmxbo¥®7%HåX×7ËVï⥥õõêÕ4Ð&–m="¾$s³äH|¾—ö/ Ti²ÅÛ׫oW¿^UÞ¿Ÿ–+Œè•¼-¾uC¾“8ñ91ö²]ä›kÉ .™ºkíÙÖÝÌø6úmž¶Õnó~±}L³ovj’(½^‰–ŠôW|®q`Ì1 o»âÇ—?÷lƒR~¾9^=†¾Ì“îj(<ÊRÑkËÆëEãöÇñ:F÷3ø{Â÷â°ê\Ö|· ~°7úü|§PŽ0äoîWù' 8±bS¬äÓ³ÓŽç/™õíÓÙ¦®ËÉ4}èÙ$/Ä—Lvw0™õ\Ì•«X6Ççç/¼d²ÿ|:ÙÔu1[êÛ˜ÊGf/¼d¶¯¤yžL8õ^LŠH7–ç'´ÒK&|iªíö@¥Œ!³BÇ#Rž¿ˆD?|ûæÝGï}gñX %öç¦Ï_ÓU4õÝwe’Q0ô$„ øfß–¤q|¯Ç¶W÷uA‘%Ù‚!ÈBó­¬k•m(d}±’Hé¡aV5u³}‹ËRQÞyi‰ˆõ^‡ìÛ.Œz}Ë÷jÛºî|\ ×eÉŠ›úrNRj»µ @UÛnýû¦Ý6é;7n‚T‹DÖz1œÎ¥aóí&Þ­ÖJçÝ7²Vƒv”Öó6&U›ÖÚ7Ù´3Xväö#íÀ»˜qÆÁ~a;<íÖˆÍ S"',
+Xv[ùL[yì²â0O~yâôO„&sñ„íÿÿØ>jZk¸ƒLÜÜdDE×pä\º
+®¤–Ô¼7ooSî·ŒVù>c<ó.;Ê©Ô¶yŠKmòð6ò{[/òå1£‹Ã™+Û¤¹-rÔ“KÓtZ|î.¬#Ô€ÃøÌ«4
+n¼)@º^grçÝi2s€«OÃ*rnRËfƹ^² Ô€rìùQcïÛÔJ)»ÞËE)ÛRª¶ëyÌeëp3'Ðï\Àô’v~â?v!Bs/"hù^k‘JH.>¶™ÇÓñìc6ì·—ÿùæýÝ‘>ußìúïhBäê‚su¢$ÄÃ-ðÙë÷®‘Hoi7ôL-}Ù"Š¯®7ï7»ÖëG­»Þó›ÅóZöm«#׫#½ç8² w°êëÕÁÞ÷¦‹;ßc[/V6ˆÊÏ¡?Ñù Ì0ãa³z#¥
+èZ!©Ž³jô¾QÄTsj£ªÊw9µ6í•(.u†D‹ØÌ•jÓE"Û]³PÒ“#Q☶„6‹è±A3s
+0µMPChfoïö¹k¢ã€Æâ­bû‘fÀ>špFÀ~];,í€Í!¤Ohþ$Ð|h[ÿI þcF؉>8j­Qò胠޾ûô¤€ËÇñ0ü${mê¹Ùw=”< UW6ꕵäбMG(:ÅTš5†Î‘ÙŸ5¸`M.w gYµ>–dIúÚ9fa)nŒ`mGó§RãˆêåD¨=“·õ9›5)è‚ú–'Ô`âÒw³@œÍîÒ¬"£†"%Ë2Œ}Ã$ÕB|€,/Fª¡aüŠ0kHmDûœK½RþØR¬V¬&
+…T´«“‹ÐCÓvÔ¼'‡ U6Ñ ôœ(㿯ýiOEÖ¸õs²à[0âòÁ*
+·©f©]¦F pÚÊSiü]›þG'qR"8¯mË?P'uö±Ú(ÔÕÁ;â¬P=@™ù2Ü‘$²ê¶"­?S=£…·ÖÔ{–¯ÖšÖà¼X½d“jgö>wŠ"°RµA.É»ék/\JfÒCáMv@Bð®—Zad¿-!sn"Õˆg¢I U/íËÕèiJ¤Ž¢†ÕÔZCU—KÆØK²8*sCGdð£s·)æ `‰’7nÔNˆ9mã5ZÖs^$$?±Ø–nM*€#£«¥3¿£õkÎSྡྷ ”±D=*ÖMP¤“$Mù’=È §Ì3‹é&4‹4’ø„diÅÞ P¤`Ù'løŒ˜ @#
+;ç&[ŠÌ„/‰‰>¡
+ ¬Bñ3Â{9IÉrøF'’‚ç K÷U»ÑëÕ“ícç¢&ÃW(-XýP© ÄQ˜"–Ö)À"ÆÌ0å\+Û”4u%Jpb°UÊÑÖƒËÆ!eQ0(1[ÝOÙ;51­@$+WÎuRx¶“ü“°Lí—–Yh•yÒG´ bP7¸>Á¢N!£ÇA¥t=½¡I‹$HOS
+úXÂ6i9dI!˜CBRˆÔb’É\RíZHbEÈúQ—X)‘©O¯+ÇÒ¨•N{×ÛTY!,‘‚dk¬Â%"•åRck½3ªæ†‚É„Š@uâ"©˜’zFÏ^4@UOZ¯by1Hv†o­ÉÅ֬Ǖ&r®¢“ qÍàEÂNë&žâE_vÎF_M *¡‘¬tÌ¡Èš„Fà´b^$›€Ü(R¿Ü8¬w±êV<,™PlR?j‘ÍÂ’¤¿„ÉFÂÓV’µ–Ži"5My°n"jŒI¬–
+ÓRD’±O›–RbH4ñZÀ&µC+Él%ƒu
+–_FQÇæÇ¢%ÔÇ{f~‘Çåp˜ç¼(3¢k“Ò'ïm¶ˆÏmÞqƒ77RâIy©¢`m)–0N/%IeÚÐþ²á&DKâ*)~×±ñe¾ÈËÊäÜ3¶9ü`2°Êtzy‚W@óP°Ê,¶?icsÕÔ#QUj» ™º³xc‹qZáÏFV†/¨ ø¶qâyTô"H`oqclæú%2£«s‘a< ±\6Æ•M†¯¡vkáä:–áBÂÞ¼,̱¬›ŒˆÑxpÅê1!8d¢
+*Øü4¤¤çIS‡”´•+˜W[/°T M2-¢3½R°×àÙ’ªÑtgq¨ÌŒ 9!X&&˜A;ë퇲9!d_ÜkW 4Û{áÙà'"BæÊÆ𵤠Ρ ?7ÒÝòYФ™crâlWl<!ƒú<ù‰}ôíVÎm2œÇ•¥%{+ß°E™(Zj'`2XºSNï0 ‘<^¯ž fAÉ’Ï
+i QÝôÙ’&XcÕR€Y{ÌV±Ÿáj…ó±âïnãËc6Ôê¡l™yÅ]†`ÀŒquD)¤õ4›É Î*I¯šûX±Pý°#"²l;{/Ä›³!›·FÔ¹dÕÈ,Q—èÕî\i:Ç –çAqý€–”EÁÎ1z‹¦E…) t:q IÐ5fd÷ã=ÉÀŠŒløæV0…e“q§ÍÞŒi¬FkŽ‰h‚™É½Ø¡D)ô­‰e(Ù-Sé И݂Ìt–ë¶Y,EÚR8%¢à­7™RÖ&°—ni29 >Žz-æèpΆV" Ø¥‚H“M>§J±M®Š¼?g¨"´AˆC§Žc†ÒÃx#ŽÓa ›ìõÑ9M&L’R6;J,‰Ìüp¼ã(Dõlex©„?‹%|IÎ¥naùÉS_™*Î<Ðæ‰À‚ÅP¥idü¦8
+›uX
++,ô” 7ÖŽØAPaˆÈÔ7At”8a2I”ÆÔÖé7ŽÃûƒ [ÿþ£¿Z}Oˆ»™Vp¨»1X„À{Úd°+S!râXM ÿÊ”9+~žJœ™_²õØM_,îéà¨U¬ãJTÜ­˜ ÞÄ3ÔÝTY-ήÓá3œ –4#r®é!Ö³±‹ÁÝÄ8I^Ö솃YP‚1“(ÎV/M@´WmdÙoˆ¥¦>8dšçn;o÷ŽoqŸÌMwR˜¼Á£©ÌѶÉèÉU%-ÙýÅÚ»©jÚècù®Àª£Í¹qÔ‘@“uÍ°¥¥¸•v:ÆÛæ:l7저 PüÔ›ØWžn^èvÐ1X¤Ç\5"'¢c“â ã*™ñqìXâ,›?‰æ”[QÀäd·8ƒÝ
+deÓc`©nDím€ ËÔq„Ùê@W”¨«¶*yU¥­¢ûâÉ­*'Š8QÄK%ûÌÝ".¤¹L0¿D½=&Š, €FLxÊD’n¦ÖN.4eò«ãºuîl¦l?×Êh‘d‚­äc·Ü¦)*Ò&˜ööÔΤeÖ’K§²û²¹å'´Û€¢ãª<®F&g"‡Í4<>r!k8Êbw“È!­“Œ2?Þ¿Öê,Äa‰–l÷8²nÜ}¬õH'ZXÊáD äSœ«qšµŸdõ&Ü1»֦Ç2‹æúhU8¼Ùd9”‘ðd•¡’ŠKt)ÎV.
+ÌÈr”ýmì"uæÂ+(0lq³yá6¤xI»Æç“°/B|ð—vCªËQZý
+-ÀÅÖÖ(f#oçÒÔ—¬•Q^§äjæLéÎqÛ«eì,pSyn®¶û°M
+=(Ývö¥ûô%vÜåÒ(2¸RNžYB£ˆ°Ú ’UÎkò¾ X*©HivN
+&£±›%Àò(¼Ÿ´oÇLvòøùåòF:{vá›]™ÃÉŽ:ÙQ';êdG쨓u²£NvÔ'hGQèj,™›…ço´„q”ÎSõ}.9xÛBuFÀµ5¿«Y™?ú<}óù‹Gß®œÞjûÏ®ÛaäØ" ù/wö±ïèÏæÏ{ë¯pöðáàˤÓ'«ÛÞ|NSÔ#ßÕ>ßH£Ÿ}>†½¿ã«ògïø:ï…}Ãüêð{N•¯Ÿ=þðöîJd ‰—_“?2g>øæA¤r`|FÕ¾.þüŽ}|«MÂÙïøùV~=ì/öµóëé“õ‹þ•žõÉî¿;—½sv÷ááàËÄ%Žï›»Ûb×GV¹=—-èøG–ßâ¯Çÿücž=ÝjãbÉò²o« ÓŠDŽƒIx&¶\wŸ¹ÿ‰x‡H4÷ã)ïÞþy¼¹x1ŠO§ï/¿‡Ä¯î/o ‘Ëñû¦B‹5IÞ£›±jõ_ ÎÍTêË]þ÷ÈþÉL'¦þÕ­dRŒ°¦?{ÂÍWÿe¼}ÿt=(ÏâkÞæ/‘G_ðìà«T(Ïþ2ÌÖŸ„YÌ|z9è¥{E:oKµÿÍêûÕW_»õ;½ñ‡•ãìõúG R`Ø߬0ÿ(;£x¿X| ~˵²;Ø»C›•\re±ø?9þàÙ-•göO“çÆ[¯¿…d®>ˆœr:{‡ªsg?ÐxƒèR²z”ÏÞ]~¸¸¿¢ý­È­5òa’=~7ADz-KÑ¢g¹óîÅ¿œkÖË{åj3Êô
+ÛÃ/M
+endobj
+429 0 obj <<
+/Type /Page
+/Contents 431 0 R
+/Resources 430 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+/Annots [ 454 0 R 459 0 R 463 0 R 465 0 R 466 0 R ]
+>> endobj
+454 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [407.741 500.367 419.696 508.78]
+/Subtype /Link
+/A << /S /GoTo /D (cite.knuth-digital1999) >>
+>> endobj
+459 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 179.627 203.908 188.538]
+/Subtype /Link
+/A << /S /GoTo /D (section.2) >>
+>> endobj
+463 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 167.672 269.565 176.583]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.3) >>
+>> endobj
+465 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 153.779 276.566 164.363]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4) >>
+>> endobj
+466 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 141.824 230.102 152.561]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5) >>
+>> endobj
+432 0 obj <<
+/D [429 0 R /XYZ 124.802 740.998 null]
+>> endobj
+433 0 obj <<
+/D [429 0 R /XYZ 124.802 716.092 null]
+>> endobj
+6 0 obj <<
+/D [429 0 R /XYZ 124.802 235.487 null]
+>> endobj
+458 0 obj <<
+/D [429 0 R /XYZ 124.802 192.675 null]
+>> endobj
+430 0 obj <<
+/Font << /F17 436 0 R /F18 437 0 R /F23 440 0 R /F19 443 0 R /F30 446 0 R /F33 447 0 R /F32 450 0 R /F8 453 0 R /F8 453 0 R /F36 457 0 R /F37 462 0 R /F38 464 0 R /F29 469 0 R /F24 472 0 R /F31 473 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+478 0 obj <<
+/Length 1861
+/Filter /FlateDecode
+>>
+stream
+xÚíœKsâFÇïþÅμ¹¤²©Ý­ä²©S9$9È ÅJp„¼|úÌh$ ŒÆ¬­£r•yŒ@ÿÔÝÿîé1!óƒG˜0PˆŒ$C µM—Wh47Co¯pue$¶¯'”(Bš'æ‹„vÇØ‘|^òþíÕ«ë«ïÞ¨‘-èèúC9p=û3ÂÀÆ‚‰þ¸ã(.ÆJi”®í#‹â̽^ÝŒ'œGÿ˜C’ñGÓâ‡ñß׿\½¾Þ\Æ \$Ĉ
+] ˜3 d˜Ö[¯vNaloâ1à˜îN<4KµÿiZÉ"ŠÓÑcÐœL°a…‹~t³x™ìŸ_pФùü°¦/ZãØ>I"Ar}Š$IEò×1QÑ*5v˜ÙgÅzÿ*¸6ÔxóeÀBwúØßòÜ,”ràHuãªç*çJ+®¯ ÑïãÂ’]eUi&@hóEp T¿3}Ü> üì0O¶1O¥S!‹{ó4O<’B’<D’+uY—€”²QŒö?îy&¤|ÛãÆ…UG¾³ k¾B\¤¯Eæ'‰TTH3,ï¢%r#lg´¾ãÕÀiÀ\5 É_bOÛJ 'ƽ”Ìw¥i&¹“¸%ÆÕòÎÁÍ’€J˜
+‰lòJÄtÈ-±‹ "¬Gž´æ™'ñƺfI=±]³Ü–ƤuTÄiVÖRæÀ›$?ÖAæì½'rÝ5»LJ u`Ø .lüœ ¦"É?ÄÓdíbFœÍÜ“<¹_[ep“Z‹Ô1Çñ¦ÉŒóY!Ö0â-Á„àǃÉ7'Ý›ivNf&ùÌÝd•6MCÒZ…’JE­ó·gs8t@š˜&¶vgk?MâÕÞIB„t‚àçŸCz>ƒTWDéÏñ0çxÞ'ñÂIÖäs¼¼[”RÏ㦌£×AÊ‹6J¤ïV¨Q"œyý¼ÒÛ³caÝ4©¼åÊ8ã“ܦP6¼Ù æ߉¶~Êõ*R¦Ä-3¢äI%ßu”&’/Koo-)K*Ûš›*r[NuQy•7ÆefòJNCnSbvNV¶?9¡€ÓŽ‘œö§ªùƒª^¬²’ÚÜ+x “Ÿëà‚ÔËY>~Yƒ @¤£»¤´GºµÆ~cEòÌF¼EZkåOiq[çM8ºMœø®ªª÷öf˜mKk;`+ó볟dX׌ˆ‰S»G¼DPgäY~MÔ„R"o®†)†²˜fyõÊo}#`Wãß;|qÕA|j⼕Dïp.ßYÄöÅû+É}φÃQÖd×ètÄ‘L5HÍ:2gÇ3‡3¯»Þ'7©Gh¿§§NvÄÑÁââ—PY.·nÇú=+Û±Šxj«R·Ulm¸UàðüJ=ÄÎ7øîOU1@´«9ò‰Ö«ïî¬ÆMKÔÔ@˜
+¶P:¨¤ƒTï1ÆòMŸÍb¾¸ºNì©AŒ’á¡þHŠõ°\pRPë ú`·õ*Q3®ˆ×P4°má…J_h,Ö¶Q¢co½‚¤Í guÜ´ë–6SIëa¯"kRØk&\\h •=JZ¾é°ÛƒXª¤esOPX‡.gƒ)Lñ딨—Øg»9 ‹îJ±ëzìÊ7Ší%Øj/¸
+«Âë? 襭ÂöŠT6¯ª7‹\e\x!D ü2»˜Ÿ ÷•ê#¦l«eÓEšù;I(Ð%iP|€˜:#½Â%mp§÷ùGŸ®¦iÈÉ
+2Ð Ñí³ô'¶Ñó©×Æ®Œì n£” ™i cÞ«³6Æ7q>0>oƼՎ³ùbðÒOæ¥E¯tE'ºþn
+2´ Ш¶3Ûxô®1Ìumë¬l;Kãù œŸÊje¯pU¸óÁ'?]Õ«rÖ­Iïju7˜î À=ª¢#Ôšø¦ùÔ×TCÐ=8èrÔ;ÜÖ’ÕÍêó=qNô 8“õÔƒnĸw¸­Å«ÿÒùN?ï|OÙϪ£ìÖ ïk°*Ƀ§_¥ ¿áÍÈwÞ~&ÍR^§©º"'½#gv0Ø
+^® %›|8ªv,ã"O«ŽÒc.¢ØÆ¡]T̸1è+Å>Õ´âM„ÑWs9ím¿A\Í]”÷ÊFàdÑ´,/‘z‚>¨‹ÓÌœµUŠšÌ•7þcA,Œ[-I
+ñW£P¶'þ$Mendstream
+endobj
+477 0 obj <<
+/Type /Page
+/Contents 478 0 R
+/Resources 476 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+/Annots [ 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R ]
+>> endobj
+480 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 703.195 256.973 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6) >>
+>> endobj
+481 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 693.177 229.576 701.978]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.7) >>
+>> endobj
+482 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 681.222 222.851 690.023]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.9) >>
+>> endobj
+483 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 667.33 239.179 678.067]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.10) >>
+>> endobj
+484 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 657.312 231.181 666.112]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.11) >>
+>> endobj
+485 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 645.357 220.36 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.12) >>
+>> endobj
+486 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 631.464 243.192 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.13) >>
+>> endobj
+487 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 619.509 275.875 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.14) >>
+>> endobj
+488 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 609.491 244.631 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.15) >>
+>> endobj
+489 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 585.636 208.129 596.484]
+/Subtype /Link
+/A << /S /GoTo /D (section.16) >>
+>> endobj
+490 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 573.681 219.613 584.419]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.17) >>
+>> endobj
+491 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 561.726 275.792 572.574]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.18) >>
+>> endobj
+492 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 549.771 337.809 560.619]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.19) >>
+>> endobj
+493 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 527.853 267.948 538.701]
+/Subtype /Link
+/A << /S /GoTo /D (section.21) >>
+>> endobj
+494 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 515.898 243.441 526.746]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.22) >>
+>> endobj
+495 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 503.943 258.108 514.791]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.23) >>
+>> endobj
+496 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 482.025 212.889 492.873]
+/Subtype /Link
+/A << /S /GoTo /D (section.24) >>
+>> endobj
+497 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 460.107 245.842 470.955]
+/Subtype /Link
+/A << /S /GoTo /D (section.27) >>
+>> endobj
+498 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 450.089 282.295 459]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.28) >>
+>> endobj
+499 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 436.197 207.381 447.045]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.29) >>
+>> endobj
+500 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 424.241 312.958 435.09]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.30) >>
+>> endobj
+501 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 412.286 324.747 423.134]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.31) >>
+>> endobj
+505 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 400.331 283.955 411.179]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.33) >>
+>> endobj
+506 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 388.376 271.308 399.224]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.34) >>
+>> endobj
+507 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 376.421 207.99 387.158]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.35) >>
+>> endobj
+508 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 364.466 225.702 375.203]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.36) >>
+>> endobj
+509 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 352.51 252.324 363.248]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.37) >>
+>> endobj
+510 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 340.555 270.257 351.403]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.38) >>
+>> endobj
+511 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 328.6 256.475 339.338]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.39) >>
+>> endobj
+512 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 316.645 278.891 327.493]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.40) >>
+>> endobj
+513 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 306.627 226.809 315.427]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.41) >>
+>> endobj
+514 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 294.672 226.919 303.085]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.43) >>
+>> endobj
+515 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 282.717 232.149 291.13]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.44) >>
+>> endobj
+516 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 270.761 221.689 279.174]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.45) >>
+>> endobj
+517 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 258.806 221.689 267.219]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.46) >>
+>> endobj
+518 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 244.637 232.149 255.264]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.47) >>
+>> endobj
+519 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 232.682 237.38 243.309]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.48) >>
+>> endobj
+520 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 220.727 226.919 231.354]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.49) >>
+>> endobj
+521 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 208.772 232.149 219.398]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.50) >>
+>> endobj
+522 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 196.817 226.919 207.443]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.51) >>
+>> endobj
+523 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 187.075 237.38 195.488]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.52) >>
+>> endobj
+524 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 175.12 221.689 183.533]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.53) >>
+>> endobj
+525 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 163.165 237.38 171.578]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.54) >>
+>> endobj
+526 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 148.996 291.454 160.121]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.55) >>
+>> endobj
+527 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 139.255 304.157 148.166]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.56) >>
+>> endobj
+528 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 125.362 233.45 136.21]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.57) >>
+>> endobj
+479 0 obj <<
+/D [477 0 R /XYZ 124.802 740.998 null]
+>> endobj
+476 0 obj <<
+/Font << /F8 453 0 R /F37 462 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+531 0 obj <<
+/Length 2064
+/Filter /FlateDecode
+>>
+stream
+xÚíœIsÛ6€ïþ>R!Ø—Þš}ºfO/m´DËJ(RCQYÚ?߀Td’°(ÅfeGãƒd~x+DÎ1ü‘sB9Ò˜ž+Ž‘1ú|²8Ãç3hzuFª.Œ3¤ˆý¯£q\·Â¤¥ñ}lK1«º¼}uöôâìÉK¦Î 2’_\¹–‹éŸ‘ ÑÅu23Í¢ür4–<zŸLJ{G«²‘h=)×E2úû⧳›{boí% R5ï/dóKÇŒQD?S‚ Ñ{NHù ½+ãlÛ¡Oý<~·óјD—𦈋/~¾ÿú—WqjÛÒ®7')(b‚vO’(
+1x%0G!n™£î˜""£1Å”FOã•ö¦4‰0îø aùÙ†VÍ{ Ðx÷|Ò†mͦãîn€±}áÆlýwóå(Úº.6¥)ÕX¡©·9ú.ÁÄð4;˜1P†»ÁŠ2_›AZ“ªÏ‹Å²üò4ÿÜ”…@£‚ï…ï{H€{ I–„©>J²4@¶êòúmüO^4G$¢¡!ÏIlS—øp¸r¸ìv¸oÁ0å‹.±Õp?â+a(=߉4Ý[)V¨¯¸îI”j¤¤:T\iÐØ:›g#j¢2žgÐØ+EËäÌç¢{|aeNl7lÉ€ª˜lÕ¥CN¹BB¼q‚æ[ßlk‚fQÅ’ô£û&O¿Ì@˜›VW#ncâHÒ“Õ Ñ¥ƒÒÝau_¤é|¹JNtïŠ.Ч¢ˆßN÷Ù¼˜¤ÉÉa¾+¸|PÑ·Ã}ÞaƒuI³€ÜjÂO&¸i1(i¹ƒt@KŸ{'4¤0Bbu„”¨Ž>ÛàˆEq:Ÿe‹$³—J©Ž—lR²ÊNëI™wL àŠ±P’’ꇑ¤lÎJb¤t_‚j@Ñd»â ×'%|JxXÒ;â ?N¤ï´9\+ïí5óJ+¿õ{Ak«mWóV'ÍÍ¢rå¯Ä™Ý.c4º*âI§mÅ N5Ã<˜ý øXqs"̈!ý¸©!3|—. kK2éTQk(ÑhïÑm¢±ÉÑ°©ì(9îÒ´yös>¹~™Æ’ǽ8Ò½[QéÑ‹‘fQQ'ù“–jjBÈæ3J9 ! žS}U/PdÅ.Õ{Q$ÉÉ9ºçh`Ò»¶:Qk„ %"£l¯—43Œ•ýk: ,+Åýkì2 ó‰SÜ-½­0
+1µ-9‰o?´C–ÐH[GçÑ @ûy ¤!ª)ìÞüÂYgŸv²U}.ñ”g«²Xû{•¶\jg¸VÝ#– ô±-…æø(6Nûñ2xP^´âÕFÇçS]XQ^û —ÖÏŠ'#ª¢.`­Ô¿°À‰ã­ªb [×Ù`Nl7Òö05bF„ðr·ÑÞͧN ¶'32(3Ö`Vev?ÍkLöQÇ—^ø:r„"zà
+ò
+P-Q×gëG
+³ªO¾´àçªd‰hÊÏ›ï;<5C†§ªòrÞ
+KV8+g?¿HÊ|8Î/ß·–—È0QuœÅi¨:^ÈàBàÜ<ú³_ÜR×8ètƒö§žaw`!^ùÍ4{†áríÎ7¤Ó¤ðq6b4ZƒEl΂Ï+žÅà]í:·v¡ãLABÓòÞjx–/¼?—o**}‰eåäWÕãÖ¦¢3D«N÷ž@|B” ÅçÂ<`¿e ø=•TA‘áü>jx´;Îཉg gÜúâ­bwÍ&: >ö‚YŠ¨1CÜ_N7¾ü;ë±I¼¨Epž%ÓM˜0‰$U!wœRv܈[O\ƒìõ&&‡%V{òOóµUªSW¬>ó¨–1¸óM ¦ÚŠä«çŽtþ–í,îÑàã¾ç.,¶žÝ§m‚Wꤜ·Ë— V -UH‘Ra¾Wë70BQ!ü1-“ÂâŠËj¾¥*GGH¨(!xl“1ý m«!˜à±ÈšÙÔéÌ*mX'¯,²ÌK]—ß >gVI‡v”!ûrSÃÊšª¸ý¾´Šåã€Mëpb’º“áqٕـÑ"%‚eãòD힨éÚÈ%W±­´ªý82ŠÓuRÅW>`pmù2(~g› ôIö`Ê”°ý€žÄô~ľ%ñ¤7ç"Ÿ'›s‘³JÒœ5K»·ÛÀÑÂä–ãsD~Wç2¬¶1òž
+Î$;¬6¾q»U@{‡³f8Sa¶RInó7^,kF䘷³áé]»5:›g³ú!{ûïlˆ³ÿ~ÛpûlBÚ‘§0 q˜
+CR©AõU3PgH}¤˜h
+ÂÔ³ŽÔß7Xq¹/%Ú¬nô*ΩõZ«[íçÖ æ¹%[íµ‹-×Û4,,*•”HPõ¸
+endobj
+530 0 obj <<
+/Type /Page
+/Contents 531 0 R
+/Resources 529 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+/Annots [ 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R ]
+>> endobj
+533 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 703.195 244.936 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (section.59) >>
+>> endobj
+534 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 681.278 278.15 692.126]
+/Subtype /Link
+/A << /S /GoTo /D (section.65) >>
+>> endobj
+535 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 669.322 230.877 680.171]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.66) >>
+>> endobj
+536 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 657.091 237.38 667.717]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.67) >>
+>> endobj
+537 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 647.349 226.919 655.762]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.69) >>
+>> endobj
+538 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 635.394 242.61 643.807]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.70) >>
+>> endobj
+539 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 623.439 244.188 632.239]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.72) >>
+>> endobj
+540 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 611.484 211.228 619.897]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.73) >>
+>> endobj
+541 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 597.315 232.149 607.942]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.76) >>
+>> endobj
+542 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 585.36 232.149 595.986]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.78) >>
+>> endobj
+543 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 575.618 226.919 584.031]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.80) >>
+>> endobj
+544 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 563.663 216.458 572.076]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.83) >>
+>> endobj
+545 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 549.494 237.38 560.121]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.85) >>
+>> endobj
+546 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 537.816 293.475 548.664]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.87) >>
+>> endobj
+547 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 527.798 216.458 536.21]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.88) >>
+>> endobj
+548 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 515.842 216.458 524.255]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.90) >>
+>> endobj
+549 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 501.95 304.047 512.798]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.92) >>
+>> endobj
+550 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 491.932 258.301 500.345]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.93) >>
+>> endobj
+551 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 479.977 258.301 488.39]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.96) >>
+>> endobj
+552 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 468.022 196.671 476.822]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.97) >>
+>> endobj
+553 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 456.067 216.458 464.479]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.98) >>
+>> endobj
+554 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 444.111 221.689 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.106) >>
+>> endobj
+555 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 432.156 211.062 440.957]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.112) >>
+>> endobj
+556 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 418.264 315.116 429.112]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.113) >>
+>> endobj
+557 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 405.755 362.052 417.71]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.114) >>
+>> endobj
+558 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 396.291 276.151 405.202]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.115) >>
+>> endobj
+559 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 382.398 261.844 392.982]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.116) >>
+>> endobj
+560 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 369.89 293.309 381.845]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.118) >>
+>> endobj
+561 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 350.463 246.155 359.374]
+/Subtype /Link
+/A << /S /GoTo /D (section.153) >>
+>> endobj
+562 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 336.57 270.921 347.418]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.154) >>
+>> endobj
+563 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 326.552 247.675 335.353]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.155) >>
+>> endobj
+564 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 314.597 300.283 323.508]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.156) >>
+>> endobj
+565 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 300.705 260.709 311.553]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.157) >>
+>> endobj
+566 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 288.75 271.253 299.598]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.158) >>
+>> endobj
+567 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 278.732 293.42 287.643]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.159) >>
+>> endobj
+568 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 266.776 284.703 275.687]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.160) >>
+>> endobj
+569 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 252.884 281.409 263.732]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.161) >>
+>> endobj
+570 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 240.929 307.617 251.777]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.162) >>
+>> endobj
+571 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 228.974 226.753 239.822]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.163) >>
+>> endobj
+572 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 207.056 331.931 217.904]
+/Subtype /Link
+/A << /S /GoTo /D (section.164) >>
+>> endobj
+573 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 195.101 415.103 205.949]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.165) >>
+>> endobj
+574 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 183.146 357.07 193.994]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.166) >>
+>> endobj
+575 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.664 171.19 383.859 182.039]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.167) >>
+>> endobj
+576 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 159.235 346.471 170.083]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.168) >>
+>> endobj
+532 0 obj <<
+/D [530 0 R /XYZ 124.802 740.998 null]
+>> endobj
+529 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+579 0 obj <<
+/Length 735
+/Filter /FlateDecode
+>>
+stream
+xÚÝWMoÚ@½ó+|´Lwö{-J£VªT¥®©êCh
+ ¯=Ãú½y³3FŒ>!—`Œdàœ&Ë‹fd:`ã"¤
+ëfõ)[æÅ}Ý~|³Ê~ÞTýªZWM,[ùžTnjŸ_uŽH¶UÀ…­°Ùx™QÕñxM1Ñq¾)›¤Ú ,p”mÅ¿™aC ‚÷Ôôª-O´9¶9®AqÝÌ0^ìë¦mé«Y i@‰ýPä? H
+¶ÅrZøAX߶»—Wóf\Hý#퀡#ðUìüNêçÀœŠŸžIdiêh¦S>s0G9Ñ\MžèÍC@i>Ú{’ýM‚¤²#^û[šÑúÈýɸ]d—³Ý“²÷B먈ºBƒÞévÝ,Ô3³8Ë<âiVhŒ'ü
+Ó—:Üp0â𸩟ø‡ÕevT š‹M_ž8š‹Õá<±ý@%k;ÿP K¡ÕÓ=N†ƒ¼!õ.àß?¡­Ûendstream
+endobj
+578 0 obj <<
+/Type /Page
+/Contents 579 0 R
+/Resources 577 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+/Annots [ 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R ]
+>> endobj
+581 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 703.195 304.18 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (section.170) >>
+>> endobj
+582 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 690.964 301.805 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.171) >>
+>> endobj
+583 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 679.008 252.545 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.172) >>
+>> endobj
+584 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [138.75 669.267 215.462 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.173) >>
+>> endobj
+585 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 645.412 342.121 656.26]
+/Subtype /Link
+/A << /S /GoTo /D (section.174) >>
+>> endobj
+587 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 623.218 306.718 634.342]
+/Subtype /Link
+/A << /S /GoTo /D (section.176) >>
+>> endobj
+588 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 603.514 180.601 612.425]
+/Subtype /Link
+/A << /S /GoTo /D (section*.177) >>
+>> endobj
+589 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 579.659 215.677 590.507]
+/Subtype /Link
+/A << /S /GoTo /D (section*.178) >>
+>> endobj
+590 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 559.678 179.591 568.589]
+/Subtype /Link
+/A << /S /GoTo /D (section*.179) >>
+>> endobj
+591 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [123.806 537.76 154.171 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (section*.180) >>
+>> endobj
+580 0 obj <<
+/D [578 0 R /XYZ 124.802 740.998 null]
+>> endobj
+577 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F40 586 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+594 0 obj <<
+/Length 2703
+/Filter /FlateDecode
+>>
+stream
+xÚÅYYÜÆ~ׯXä%œhI³^2ò –#Ç°€x<Ø~àÌpf(ó“­”_ŸºšC¹Ò:
+,lvW«««¾:FÝ…ð§î”¶Aê»Ä†A–¥w»úExw„¥o_(!1։·•Eß­Â Hã iþúðâ«×&¾S606¾{8íÃþ'Om|¥tä½i6F{C×n|£¼ýe7”åµÍæ—‡ï¾zÞeAÞèk¤ZÑö‡SÙí¼:o6:õ.°+¯xjãø{ý®+·_'òÊLÍ„k£,™êbØhíåíöÝâóp¶XY!¼Çï/çÏõûø×ü~Àt8½Sy<Á«Ë•ë=
+\ˆ°-EÞ;·¸ü¶+ :ÔPì¯'êrœzôQ´;_‘@ðTAE$UÙ
+.¢`þM^+_ˆ•¤ÏÑo€J…îxö(ÿ‰Ô9ðÌ›(ïgeìêç²èw(
+¢ñRßné¢H»F'
+“™zß»
+€îËoƒgÖÊ–ø¹Ø JµHð.¿øæat©D:3w~”qš CñJw¼ãÁ?¿e›ù 3‹n™xô¥‰ë>µ÷þv/èÉÞû| âÿ»ú $øq#%SÔI†¾Ž3:b{ìòº.›#“Tys$ø9LDFŠ+û§ÉmÑpÙšcžcu콘ú×sùÌéº"GÏ'KÌRð‹hfˆ[ÜðÜÀï»ݣᗿ·[XËÜò4Æz¹,çûÅò¡li
+@áÀKk›áiϯÿ!u8ýq5µ ƒØÜÂæac#€™U#Sç•€–xÆ¡¨Yº…Ñk­fìxäßuãÙ—Üx ÎVñÜù9Þè8½78…÷*«M;ð
+ξH”¢oë‚G‡¼.«2Gƒ,1 œ„7ÄØ… ¾6Ðqbž©JÇSG ìûK-Áñ“Ô i†‚«YѲ5ŒüyƒKhþXrð$2K^ cÑÝ@XU7¬®ª;ƒP='HÉF=£’­F–$ÅpâŽãº@Ò(öØÙ$÷
+Æ«0äãàÒó¹ãsG¨€cKF5
+*
+çL¤LSND1œ»lô{R$¢˜ TÅ{3±zÂ$ ­f
+1ìñª[øBï+8všÑ®7ÂQJ©LÅ7‘@~‡_Ew)ãJªƒg¦é—·aî[Ô&~
+W¼F®H‘$J¼-¹VÁ+}yåTŠÝ‰'K¸ŠRŽu)ó„“ ²»7’Úª(0Ù<“Úȹ!ôb< ¹P\’¾^ó~‘¢!?)…6GC/Ãá`ÁgÚ®˜àL9¬Š®ü÷¾|›EÞëMj9Íò’]m’Ú5ª:"BRxÆp
+Ž WH¡Ç™¢òé^Ì$I ¼S3Pš´v9·¥,&¦83Ñÿ­$Ú† 8Ô„å@ÙSBò𱜬 á”öI¼â ‰›1à{,ÕŨN˜ˆ‚†Îù-—I\¿l)00ÏujjF
+‹-SéiRð^‰6*º½n žž~ÏœÉñ~£š§ªšª Ì/ñÍé—!t2¯YoR ”Jà’ž Ü<qE¥\X¦[‰t¸À®Oéá¯dXxÈçߢã
+ ÛºK7Áeà7 ©Ø"Êh¼žËǦnXæÕ
+Èd*°áôž0FßQNµq¸P’ ¥Á«'_…ØäSÿ»Ø}ô&~ƒÂ?¿×ÂÇÙmúz%­YÝàQ]±>ûÒFÈà¾z©êzÊÌŸŠ20/ãÓ8°U×äÎ*ô]WêðBB¸˜!.âLÎT¨ŠkŠ‚§ÑFñéª;¤©K4 }%$íÁ‘ÈÄÌ]Ì\†Cüæ«=Rö@=Sä®Ë»è)ºÌ´à.ŠGcY›Íº»©QŸ7QÀ,N[ÛØ+ri ¥åɶ‘Ò=K•Ís¦·‹66E¯p’ªGÆ•-*¨¬^º ò
+×|09Í«›1o`¢‹[â:…7œK)¹á/ ñ#µAp5¼ðÎO#¬ÐNÄ—¢_ѽ´?°›/‘
+ÿa«ÖŒS¼Âa¹ºÓu˜ TFh/Ë¥öxkeMÅE(È‚(v¡`Ž%xàÄ
+»šÃ*` ;ñ>ï„ǵ8(ºC¾+˜ì')²I8Ë#y³äÃ$—?5é0h`—A)º§¢ìrÒ:bíwü•É<Ó·ÒX”žfÏ0™÷+N`¢@g΀–¿h¦A9ÀhøCÛQÇÂáJ-‘ñØ¥,V¹© ·oDÿÀ‘²'Œ^    £ôÖ (ËBÉó`pr6“N¼ìx‘ûuÛñ—ͺçù±DP—…OE X¦÷' ÇÞ#e²7NF°Cú—žŒ¶B€Ÿ]Ãî8¾ÖB(9x€÷Q?µÒ¥·Ò:–J­JNI—yÜØ/ƒ”ÊXäo 
+endobj
+593 0 obj <<
+/Type /Page
+/Contents 594 0 R
+/Resources 592 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+/Annots [ 596 0 R 597 0 R 598 0 R 599 0 R ]
+>> endobj
+596 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [196.099 647.446 203.073 655.859]
+/Subtype /Link
+/A << /S /GoTo /D (cite.hobby1992) >>
+>> endobj
+597 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [206.624 647.446 213.598 655.859]
+/Subtype /Link
+/A << /S /GoTo /D (cite.hoenig1998) >>
+>> endobj
+598 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [217.149 647.446 224.123 655.859]
+/Subtype /Link
+/A << /S /GoTo /D (cite.goossens1997) >>
+>> endobj
+599 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [444.935 635.491 451.909 643.904]
+/Subtype /Link
+/A << /S /GoTo /D (cite.knuth1986) >>
+>> endobj
+595 0 obj <<
+/D [593 0 R /XYZ 124.802 740.998 null]
+>> endobj
+13 0 obj <<
+/D [593 0 R /XYZ 124.802 716.092 null]
+>> endobj
+17 0 obj <<
+/D [593 0 R /XYZ 124.802 560.834 null]
+>> endobj
+592 0 obj <<
+/Font << /F36 457 0 R /F8 453 0 R /F38 464 0 R /F36 457 0 R /F42 600 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+607 0 obj <<
+/Length 2762
+/Filter /FlateDecode
+>>
+stream
+xÚíYKã6¾ûWø62ÐRć^Éi$ÁX,v§’ضÜÖ´,yôOçק$%ùÑÉe }hºX,‹õøŠëþÄZHå±\g:ŽŠ"_o«xý S?­„eQZE™À_7&C™Ê(WÙ:$Äéœé’YGE.×9ñ|Z;jžFñö ùŽ¯Cæ C€Œ0O¢XJ¯µŒQ¤Éú8#†žZ¯,QÞ&Îh‡Õ~Ò5JÖçÕ¯ëßãõ6ý¸ñúß_i×Ó©²8ÊÓT¨µÌ#¥SMò=1ôÔz
+‰LÉ{Ôq~®¯µÃt;/×~pœhÓêze7½CôK–ú éfnÆ^ößÉ¡áÊò$)qþ\àì÷«o~Ì×ET¤jý¸'ÎÇݯÁùPvå&ÔªL]ó`؈à`‰]¹Ý„"LÄçºì¬ãÀtð³äñÓ&”YÐnd|qóÛ®4C¹cçj8à(à?.ûýñço~TŤT:J³ÔêôÔ~©fši¬À½¥¶,û5Û¡j–¼G…Ú£=ÀáÆæI„¦Q‘$n#Pør#YD:Qv£ˆ5Û ðe“¤y.Ñ›P)˜hvvÐ÷ã±Ä± Îhˆiœ×F¢Q‰‚¶my¸m›†­(‚íÀ‚N`Ë<h+<ÊnØ
+.UB8²~å•úy”(agÛ=‹míF¸mû¡ùžæÇ|Cû·Õ¥sŠtaÐó-m’¥6ÊyŒuк"èxš\mÇãö fª†öxÃÀ>Hµg¦ÖÕ Ùü[Ü}õã„B'ƒ'¤Œ²âŸ¼þO^ÿ¿Èë?ÏÏeÆÀ q¤³ î+êqV\²x7‚¿_…RDi,b´a$´†|{\53DÓ<™¼U3ÊË8³+ýB‘9#ÜÚˆgÿÆ>çË}B»4ÏÝÒYÑ{db*zù[‚Ùäz‘¢[̇µMæ5æ–—YwYqìo”•e¦§Êu¯ 8–¶ca·R™à䌚¬jL~vÁåd.Çõí­z•«¥òÏ0Uí°ã¤á¹Ïö8e_Q?0“#fËzØW´-Ö¼…ƒ•¸‚áêW&1àÿ˜:CE/Oh žPu ¨aWF›0)²ÉàÀº³†˜èÛa±‘/8‹Í†Ofï–“R×líêÕŽ¯Û¶/±èn0Ó¡Söæ™m€Ž©ȯðhZ¤¾ž#u©ñµüŸð‡á+e
+]eë®ÒßstíBR1Dë[.àGæUÍÆzÊPšï†F°÷ûÐý£öÆn'g%YGºP Eƒs¿–H¦¾R$T1dY,üÆœx{Jyp #bZ+´^ðýkˆ#ö&•™ w`NËÓhSü46
+¯ƒ.Ž„pæ8UÛaì®J#L¯ÌÔónAdZðŽV]Þì6,zÀ “ ôH5VÄ·|,Ğɢø-ŠwžVm
+éïpf
+ï©»&÷.?;­´ÈÙ—qpêJ*jíØ3a×QdŸçÜg§½5ˆûo Xmó<ý«r«Dæê §Ç©ÿ×¢ óá.¦ç߆ºÇ1˜žò˜Tàj¶8ôÞ`Ç/‹œ.£«ì Þ4ä Ÿ1dð ²(\pZ˜Š Ñ/*SIRËÿÇY’":Ù¶ç§åcùZâƒ[V«¬b§9lÔ7ï à\?V–›.‰v1ý ÎO¡Šut#)üR‘ÞxÜH£$ÍæwOW×£“¨(´ïËzš†¡Ïid…qbB«d$ý'q7¥~à1oÒêÖþ烱Oƒ6X,,ÀêèVšÃ[$œÃa ç‡0ƒ&;Ë×'«† ¡ß’Çî"xggŸ[¦=…8ù8¥\X ‡v&¨n} ážG¸&àë ?®Q5wv‡HÓµS;%Èv&¨©ˆ€W2›–36ˆ“T9äz,‡„ÄÔ>}¼!1&H¹¨ëÈ=?çZ'\¥8C]Ge°/ÎЈÐí$èñ`Ñö±ªÏäÔöMP@÷@ÙG5‰ÞY²…ì.ÓãØ;æà^¤ç)Zú…ŸÑ~õ¬Ip‘%‚o7agøœÚÌdÜm8>mqg˜}‘uÛ',2ÁÇr;ôöÉQƒÄ~t UÇ6ûÄÅÕ¬gwoiȼõUx 5¤¹]¦8° ½
+GÕøòˆôvYÏç{ù@¶~¨è59¶éÀ¸®)p×ç½
+DÉÕ‰€^®.Þ&æôFk;bµÝg²£å2<wl;G8âOT´+*î8ß6.g.N—.?WL0
+ǽÅ5T69®™T³CõÌF‘¯ä¢Yv¾ Ó\ŒÖótbzœ¨¡×f(yæÙÚj¦æ©;é¶çY¸èkO˜ú'(_µi¦Û†n(Þ£›QÏ–¸Þɦ62^iut_(´ˆ'/ÒK/øñgE”|­Vú¤È®ÜBU4˜_eáˆûÒ,Ï„Dîë’ôº8_m«¬E6Ë*™ZE1g(™xªWCr Ïè¹mcÜ‚å ¯&udrÿ«“TQ*ÿêétÒÅh-‚÷{Æù°ÙÑúå
+endobj
+606 0 obj <<
+/Type /Page
+/Contents 607 0 R
+/Resources 605 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 474 0 R
+>> endobj
+608 0 obj <<
+/D [606 0 R /XYZ 124.802 740.998 null]
+>> endobj
+21 0 obj <<
+/D [606 0 R /XYZ 124.802 280.23 null]
+>> endobj
+605 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F32 450 0 R /F36 457 0 R /F42 600 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+611 0 obj <<
+/Length 3096
+/Filter /FlateDecode
+>>
+stream
+xÚÕ]Û6ò}…qO6³â‡D©Enkqí¡û–Ö–m%¶åZÚn¶¿þæ‹”d˹àp66ÉáÌp8ß²ž%ðOÏ´q*OÌÌ»DE>[î’Ù–~¸ÓbU^ãhbqVáEåY1£*œãý÷wß|oì¬PEfgyX¿›ÿšh¿øíáÇ»<Ä°/¿A—Ì
+ÔȪkyá€#:Û £¥âB?©çˆ©éø}Ä 1ßNû€¸«ö‚h]ÁÕºcXX/"cžÚnâ˜ûúã„Ù:’h] ujûÝ¥š,A‡‹ÄÏ– Š©×¯HéÚ \òyÝßÍÞ˜l^® E¼»ºúc!:3¨;»J`X;Ò<‚yÃ@,um‹o(£uu®qbË[›#] ØÆ*Úòäª9¶]Ý¡ItõqË[&•°××¹°vþ¼=€Ûƒ”=Ÿ<IgÀ‘&àBõûSÙ!×@gD©:DùL(HhGFБŽÓYÚ1²7Z¼­!V«L§¯HC:1[ëíP´-Ï ½”7 °‹~_W›’Öº°ÌöQ¨Ûz7”ëùs dŠ”e/(:I¹ 8·gx+à~n¢O©ÖÍaB+~MÒ¤l™ZMjóÍ÷¶èkr•y+g~l>Á%Ì@"&S:5QЩFæ Ã6”'¢À€¿•Ë–Y$9×0Q¶Ñ6^¡Óææ8†¹› Áýž×UWõ±"),Sˆz&É¢$Ш®¬¨M·z
+Ty\3È ‘&?ö¡÷ÄËr+מÿ"†ç¾F{´É¨ºy¼¸ŸÎD95,ŠyÛ0ÔÀ«C"‹÷
+N±ŸÉ6·R4§k}=Ò,ÑÜ
+ÈÆÑ—ç“ Ãs³Y¶¸Ðpi2òL
+}c¢jºncê<=Ê)}šê׺̴UɲYÕf¶Ì²Pƒ„”÷ŽøÕ
+vXØ¡ÁŸÿ}ÁM=Eù ® mc¼Ÿ?!Å¿<:^E®l^®ûª¯àð†s7ß6¡÷àrKM#|†6*Bĺ'Ëzßò4iAn8ÉÇ=\¬ðØ»¾‚Àó¾,`3L“€?ëüIðl‘~Ì_s N
+¸€j÷!8:´§òR™F†Ÿ<ÖÜ”üØ#—ç’ø\Z4°Iß™B­L ïX«/P’Véè$WÚÝj¥xìX¤W×Æî‰wñÂ…‘ŠU9§æûp•
+3§bþ=¾“öØÑB#ú›¾n¤"°mšý>¸žçXÛÂBGÍSd®–£zJÏ4fqÇjÍPÏÔøÙÉ–[eõª¡Ã­«Ø,W¢çBæ‡ß^Å,SYŠ’³F¥àïÁ5ÿ>‹þÚ©dfñ?˜“@:ã.£JgÏwïf¿%³5¬þît2û×Ý2Uyz,&Þk;;ÜQÀW ,ÉÐà÷w¿Ð¼uÖbW4Sظ Œ®Ñ[[
+[NØ2…Zbš†˜†¹XV ‘È6漟B ÌrÁT{ ÔnÌF Hcãæ_Gï‚+Áã5{ÍàuY5Ÿ‹ÙûªÜ\e¼»ß¼4FéÔ¥ö=^ÿzú’˜líw†K’ÓÛ‘üúÉ D¦éÉô×àÿå´Q¤7dÅËÿëÕ,e{¿Û¦h ¹»AŽ–Ó/!g®hÉÞ‰« ï
+Nptð­Öƒ8
+?³‰2¹ÏÈ䕇l'›Ð2o ÍWÑ&ƒëNUQ$Y>œÓ©2ÞÙáÖ\¥…ñ8%èÁMÞÛBîòÕ0•êu0.¢PIâsú–fyZŒ Ws^+>§çæR+xç²ßšà×<pR“„hñ è4Ý•öñVW(g©jþwï2Ð Q©!ŠÑ‚€<È`ˆv-éã2…¼ó‡÷8xKE€ž¿àJ¡âE.|ײỨzæ®QÝQÝ7ŸpÞ̱áʺÚľ_À’^cùyŒåçfÏ—mC¼¼ÿBƺ3£zûaÁ´Œß;Ú÷‰qdƒ¿ë f»ê•§?Â"4Žþ¶Á–*ïÞ”T²µТ@’GÇ
+óÿ(ö|ª­†¦¼Sk…^ø\]ÿÛž˜d
+§ÒáŠÐ ¯~@®¬˜ãUŸ¹%y>ù“O¨¸”ÍÒÏéªMˆ6e¡f5
+ÿk;Áÿendstream
+endobj
+610 0 obj <<
+/Type /Page
+/Contents 611 0 R
+/Resources 609 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+>> endobj
+612 0 obj <<
+/D [610 0 R /XYZ 124.802 740.998 null]
+>> endobj
+25 0 obj <<
+/D [610 0 R /XYZ 124.802 317.092 null]
+>> endobj
+609 0 obj <<
+/Font << /F23 440 0 R /F8 453 0 R /F39 504 0 R /F11 615 0 R /F38 464 0 R /F36 457 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+622 0 obj <<
+/Length 4794
+/Filter /FlateDecode
+>>
+stream
+xÚÅ[mä¸qþ>¿B°I¼Í_DI1ŒÄd¶‘ØI¾wF¢éÖÌômO÷¸[s³ë_Ÿzá«È½ bÆ
+4¤¤£ø®í¤¸ÝZ£6ßÜf3ßnMÛnžnåfºUýæ‡[5 ˆ}ÝÏßµÒœà
+q“±Ä`rM_Î4Õpâš,
+f^×m¾>áÈË*Å þ9xæ’ Bàüà̶ì4Qï6¿91ApOØÜn"ó;ûͽ…¦ý~Ò‡óË‚­Ÿ=ógìÞD_€½°WØñ6GÜã=N-Óƒäßóe½ –k3ø¬#v
+Á‰ßºÌ¯ä†.|ÿ4¿,F
+œ•[3X²3z´Ÿ&)Š«Øð•9q3}–ÜŒ¾èÔÕ]ú¡™Ãô¿Vz‡¹ÐâäǨàA¥Ã, ÁüâcôÞHÿä5JgY«xA­NWÇLä¾¢a·}ÆN|ô ]Iõð‰©&æ…hžœ®'×lL6íñÈLÞe]µn ]†rýó+ oI+‰È¯aä)4]ø5Ž+`Ïx…R]:D½î
+ÔzºoÛ~M]Á‘7XîhP¼|h*xä] {Gj#¤j{SP—8RK‹œKRÁ¢ùÐË‚u #­Æì°-‰K©qÝëam$<ò.†½‚µ@Oª—kê
+ŽÔèÍÐ굕xÂÁQ´#.)SÖ)Ä–ìS©S8(#º…ǦkûT!9#:@F"e—±Ž¸M¤¶ šJmWÔÜqôqJô@`3…¤8RCöƒ;kÖ ´=˜i ¡KýÌÑ|ߘtn¡€ß@˜ÙƒÖ)ÛE½zŒV”Š»7ÛAŠAšG8½¾álx…+Ñç›Ð·´Á|¾á~éÐ/&,QÏQ®”X¢h t¿"­À@˃ۅ¦xÎT`  Æžó-aД·õŒ´D’ =Ø9ë½D=OôƒÙ$¬ÀAV?ÙÆTÒ†þ«•¨Àž'ÚKæû+pÕ®h+°×
+ |9’«mÚjêP¢@É©Çz„+0ÌòuRôh9]R«‘¨ÀïJ¹µìÌ¥wÝŠ´-'Žr%AÚzªZÍT+É.¹°LlP¸ÄlT[p°<8°íp¯<µêLÊ6…ƒ¸ÃŠ¶§jP0ü½5v¥†
+0™òicúÙ5Ü!›v3‚Ÿm*ª5$šcÕwÊc2õ£¬7ÓŽÉ ' ·œqÅp [ô˜R[ hœßV6lȪOÌ;E=Oݸ)d– d”9a‰†^ÃÛå´NÑÀS7g‘¢QJéLÊ
+Ý: çó)B—3[a>é€U–ƒd’s¤¨OeÀÿ¤š.ÀÀQgª.Àrõ9Ý i\L•fq ê“C“1\cIº™‘­Á$…­g°eÆr•'‰PÈ«ëÙvJé³u—žé<‡h²,¨­
+¢ ¬(êëŒd™á—)ÕµK±t¡Ïóq±\€A>“–hè³mÜ­Oûœ Ér0çY q‰™`\´V׬ŒU5Ùj¹
+TçSò1ÕA
+G¾~I`2¶M¥u˜\Ià¨Õ¤‹ð\ýj(ãÀTÎl-UcÿÝJLê¬û FÕ…e IÍ*…ㇷ°´Ùw·ŽŸôz×V64åš.‹K4ý”G˜)&?®»)Ðg_ñÀI{4ò ‹ø.cšÀQRµ¢-áØ•oƒTàÀ7ÙÅÈ<K†gŸaW†PâñoØxÉ>ðF4ØW²›“ÚW
+›UkJ8Ì„°ó¤†t*¤pà+×»a5<J@›IœÀQqïÍdšHñø=îêéì3zŠG©»5uúHv"S}¤pä¬Vûž±PÀÕ ÄÊ"¥¡CØ$ˆ:Bƒ¾Â|M/À§'F'.ý#6ÈÍïλ'ü}œ>PUŽxÀ¸#2¬BÔXc÷K_‹1
+LŒ‘Ñ•«CŽóïñ÷þ{¤Í^~×
+üéŠ÷ ½/¿Ä§š^;«3½ðë_„{ªtûê[ñÏÈðWxy¾ñ÷pªÈ—3Ýý
+뤀ôñ@¯´'‚éí÷÷øû}&׺×òR6Ù[îu;(Ñv#WqU Íày;Ä:3Tÿ{êØší …n»+ùlVò5 \,0ôÐÅ—Õ<ÎDÞoÞ¨ k‡¥:OLy™_BõÍ•þŸ°iq ]5’AR(0ΦÕ5ûùÅ—É‘ÊÁ´\Ó,ÒãæΗbS± P¨têê+œ.¯;ê ²bpB©n[µ›{ð¿íŠ–÷®¦•^™øÑr9Äb"¨šÍ‰wâ+gÀÇÏ”UMXl„
+@a:ëF/`×q!<{výä;Ö
+Ö>h÷trºw¯\æ‡sŠà8QuÜ™ÛÚ@¡:”¾&ÃÅ/| BÙ}ÑW‹£cë%eTO
+h»ù5–O.¡"αvÜŽÅ»Dð†rR-PÜ£zTñ†Õf}ÏÝûÞeDŽ‡…®ßÃË'¬Î::i‹c|=ü…ýËy÷tpvhõHêë‡ËÜŸO±þŽIPýÖtò¦7«®ù2wHoô -py@î +p KÕm¾!¡±/}ǶÝšŽx¬­BÖË?ó¼¥P¨Ùmøs(ç —4Rm ˜7•.‚œÎz€`
+Uhæ’fRgbåâå‡ÃüÆ/h…Ç"xNŽœGźÅ2lx­áüêëáéáLšd8åÚ‹•|^}ÖUÕ‰a´N†3ºU‰–œ½9MT˜7NQkêýá’ú °55²8jÐÕŠVÄqd¨øzæF¸.=>]¨œ¯H9ŽvâÔU†¾ ²ŽçÓ£#_|!ª{Óiw¾,\Çž`Ó2?ž/ñTÅÊj¿yŠ“–Ï»wiËYˆ U×JW²Ü4±Ç:[mÃ<D¢Óìkl‰ï•¸ÇðÖÕ1¥2[ø}<ø2X¤;¸§“cFšáAcœK±m,í…—Î誟80•%?
+ÞâJE·Ÿø† ¶>T¤êã"Þ&,Ô¼â+…‡êQ7è5`&Þy_”§X#NL„€ö)=·þWoqtž>PèíÆ“Së–íÎ P +‘æÓn9~òQé|uxÖxM<w³¯\]¦{_¿
+O'Ï)¾Áò“;ø8»û2Që‡[Œ@³sþù< VÌ_Ñ{+†bõäZx½Î•
+î4;¨¤;™ÔÈ®b%£è¥Ÿ{4ÑΗt«—°Žˆ3ÝänÇø¤ÎŒ– ¡âƒVfôÃ…L$„tB—W·•ò‰Ï­±Ç㱟O{Ÿg×yפ;CÞrž˜ÃÅ‹EÞÎÂ…Õ QîfbÄ¥õóQ°<uî<~|®ÜiFU{(aŽjPös)äP¯íДg$,ÿŽvXPendstream
+endobj
+621 0 obj <<
+/Type /Page
+/Contents 622 0 R
+/Resources 620 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+/Annots [ 624 0 R ]
+>> endobj
+624 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [152.642 208.636 159.104 220.675]
+/Subtype /Link
+/A << /S /GoTo /D (Hfootnote.8) >>
+>> endobj
+623 0 obj <<
+/D [621 0 R /XYZ 124.802 740.998 null]
+>> endobj
+29 0 obj <<
+/D [621 0 R /XYZ 124.802 334.075 null]
+>> endobj
+33 0 obj <<
+/D [621 0 R /XYZ 124.802 287.797 null]
+>> endobj
+631 0 obj <<
+/D [621 0 R /XYZ 140.045 181.492 null]
+>> endobj
+620 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F43 618 0 R /F36 457 0 R /F37 462 0 R /F7 627 0 R /F25 630 0 R /F24 472 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+634 0 obj <<
+/Length 2840
+/Filter /FlateDecode
+>>
+stream
+xÚÝ]oãÈí=¿BØ—Ê@4§¾®èÃ-°»íá®h{ú°»@[±ukKYKŽ“_~>,9——¾¢9Cr8$‡¤¬½þ´§UYh¼Ô†*Ï3o}¸ ½- >Ýh™ÙH¥ßÃÂ@eIŽsÞßÝüð1ór•'‘w÷@3ï6ŸýÇãJûå*Ðþºjáű Ó¾lùíÞš#Ž­ßž¾„:yv¨Bãx[=­Læ—5Ϭ
+jðùEô½À$‘J¼@k•Ç1-n`W0ñ÷rÝÁÔˆ•ØòðÔÒ!mðÍø]ÃÐb½&p+³ªŽ‘¿FhsxdÕx
+™\uò*<ñºd¨åðòaÃL,Û”ãhÐ&.OÌ$JÇZ¦(¡‘xPA®2›Ã VYžÐ<­¬B üÓqèÿcûmªÝœGÌH†kYëiäŠ
+/5þúŠpÌ)d®ÓïàB–Õ !ɺ!Šxî‰ñúRt.Ž±Ðæó-UˆˆÙJ81ž‰CÍ{€§“ÄÉå”A$ §úq•EìÀ0­ªÙ¤`}³ù =„NE86=Ýn'€¶:<BLè½´?€Wí’©•&VìàÃá±{yß<ÏNÒB¬²Î 
+eÃ4Ï;Ç¥f™ÎhÄ‹²|ÜL´Á°Tà¤ó…[ܳ–N¸u´òªÞŒ'€}fÈ—0ÏȹWkÄìS7ÇC±ßøeê7(s#®û„«HÑh$÷ûèéÛ©¿íûøÕ»ù¾úF›ûñ2|$50 ÆQ,º ÿ®ŒQ¼úîõÁ0WðˆÕ(âÿ 
+YÖžzãÉÄ÷á¹è@Û ;›Rf>ȳv&/$Ç‘_–£Q–ùÜ•L®ÊÉ­x
+]ÍÍi»ÃP‘“aZöûjñr$\÷’ö7Žæà ˜¶Mw×Ú—Ô
+O¨øM¹a ]<fÐ.GÖž(È4¾­0—Ú
+ÕŠÕȘGHŠz»ŸÇ‚­F^….¦àð'!®ðÐ3fxÞÿgHð.J-(/íÉÖCX@lÆ8ûZL¨g¹&- †•X`b3ØRšÄ
+Ó5>„6oà4?&^9âÕë/0à^`|Ñ’ùªñ]Õà°6°ZÅ©¾ÊñæMìf{“µÃÒèŠñ½ÁîÖó½ &^•¨FÏ€ý‚Ó(ìŒ^öÞoDÂQ¨9LÞ?Ä©pµBÁOÐ×±#ÂÙtîX ¥€x!×bP½ ,®Ri;a¿áFa ³/ÌE0ûJbx¦¯Ú_ùv§Âe+4$ß00£lƒ[ÑB*ÄðJž'—K””ÈaF§R”ëâäqý ƒ5elÀ¬GAòpà_Õ1V™£ü¨«®²æYg$窓R¢çK ™å…­T gWLt;Jþ¤ˆØ]èŠÌt¤A0twš>±µÓ•¼T6‚}Ò($kA2ÈŒV•T¼{ äÝ5 žß×:=Ÿ}É)º¤¶¢¹]… qš£s*èȈV„9!‹/IhÃ$!äÑ&à’AœzF"Ž2³`87?ð ¦hsQžxà^‰ôÔBÅÍ}…äŠyA’J9z"„$ur\©ž8KJ¢QÝŸL[8 ˆ‰$FRU
+ÓtæàÅIüï'²|¾Fq·YÆa'â#£/%%ç;´µzSö›~á™{²¶o}~«*ÉÞÒ¬OÕ`xq餓vT.-21”´÷KβÆÛ³iä2+Ÿzû;âïIÑBØ¢œ°\“?„DîÚÁd×òB¢MÌ庚I¾?Ñ'럹‡Z> xÎïA
+)7xT:î•0†`M n8Êèp÷Ô ù2tݼû
+‹`Î\P6Ì6ˆþàÑS02ôç‹¢É.—ìîß«ÌRºš$þ¡Úî$Θ$v™¼ËgRðݹ…È$ˆðhÞ1f©‹L %+2nJ”QÊd˹0O<–û¢¯W"þ0Üh%bÈl[¦13MâÚ.\óEßüLqo9 ª¸{ûkƒz§Æ§¾Yré éKŒY,‰xÁTaáf2kFuÈ3ÃʉG·#9ØøŒdIfâ"Géº#Ñ¢]HgF÷$j¢UQa¥‘Çd¤øDÿÂçÌlJ†Sý…ƒ¹^\oÝ{Ž´½‰ä‰ ¸–À}l@H3mÇÓAãÿ½™ñ¢øo ÏkÝ/¸D7 êod7ßÀfA¤E+áŸ÷Nß En*@mÆ.J7ç ºÊ—¥½‹Ð v\ Ñ—sE”G†K°Qåž-O’ýѶºß‹[†Â<ѱŠUXpôŽ),do™ó©ùn‘ʦìDóï.kk>´þnÝ}…¸«ì‡:êá¶Ú”GGeô€BJ–õÛ4æ–ûr[Èç\5OÖ\ÊdrëxéG#:ÉU”Ä£,í-?Щ¥ÎíäÇÿR Œendstream
+endobj
+633 0 obj <<
+/Type /Page
+/Contents 634 0 R
+/Resources 632 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+/Annots [ 636 0 R ]
+>> endobj
+636 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [382.425 705.133 389.399 713.546]
+/Subtype /Link
+/A << /S /GoTo /D (cite.knuth1986) >>
+>> endobj
+635 0 obj <<
+/D [633 0 R /XYZ 124.802 740.998 null]
+>> endobj
+37 0 obj <<
+/D [633 0 R /XYZ 124.802 678.296 null]
+>> endobj
+41 0 obj <<
+/D [633 0 R /XYZ 124.802 394.188 null]
+>> endobj
+632 0 obj <<
+/Font << /F8 453 0 R /F38 464 0 R /F39 504 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+639 0 obj <<
+/Length 3097
+/Filter /FlateDecode
+>>
+stream
+xÚ•Z[¯Û6~?¿Âè“ «¢HÝú–]4Û-°Ø.ö,‹¦:²Ž­D–\IÎIúëwn¤hKNR‰hr8ä çò µ‰àڨ؄yo2…E‘oªÓC´9ÀÐß”h£ÃLᯕÁ…F˜§Òüåéáû·:Ûa‘êÍÓ ‘>í ThÂíNþQIüÒTþ¾lU0Ôãö·§Ÿ¿›ûóv*u^Ðì7Ývg²<蟷»$ Þ×θ“Ú¥PtÀ¯œ.~Úö³GÑwÛ8‡90Ðñ6A¤5Œ°Á<‚'üq¤^Ú•.æmÅ* ­E¨çþÓÊÖ5¨3VBr.Qµ³àÃ6IƒòPãÒEpzÜÎdž÷À„:'¤{Åþ¹nv±ÉÃ<1  IJ_Pe]55=Ê:âf—5iÁÙº}6ÓbŸqfBPvû% U„IQEÕ U[¯p1*ÌUÈãv§Ó8xEí5$õzàÄ^†òTc3 Î4v£÷Déà'Ò‰Oý©5O<¸c=“†EÇf‰Ÿ4xÆ®«Mé,Tƪ-¡­íqü]¤4²>]…¬
+€IÁ>k6¨« ÔRÄ°ã XM g4ò4T™Œ’¬8Ý3´
+©! Ò9h%NK'…f¬rñ: ©?ºh…NýyjÈMUâÂÎïj¢9ä'ЋG3”ò¨Ã[ïÆ@dÙ™g"îÄ'¦˜h©í{ÄR0r!-;€oCÁT›…nÐj!€„â6Wx &Ô*¾B‰E[ N8¿Oh“9<a1 ö_Æ  T(ÿ^ˆ‘À8뵓@ï0¬P4G*”&[Í,÷¨ÿfâ8iRVŠÉWò£ìu%K/cµc¸¢çÿí\ä‹Gkð v&4^Ã駡lGÊoÜÃS­èÀË¡.b)¹2Ãô?8Ñ›bòì6ù±@ÐOfž'œ9Áâ0PkE±ÄQ:9£¸@o!íäWÏß½XVa,fÀ¦ý@–Z[W†D Š´F?)ÞsqdäãpׄR^Š¹ÕÄ¥\8Àå»0 Z FI­‚·*¸õ_+ÄRغ¥5kqñœ²uvRîÅ`5…Ž¡fÓP&,Ì5„tH+³„PÌ«M¥µTÛwm”ÞGf#Òèü¶Uõ§s[¢ h‚¿iãçœõ²Ul1(K7N”ZxõpÛ?>¹Bƒ
+•Ì çë0¼bä¶(aóx£©šù}ãzaÞF%!Õ1¶ÔËtQ˜l^~Ýümö0ú3ü}ÿ ¢Í? "…à›&A-ª Rüæäuî¤WoÚ‡/wºéíÿïpUTc «£Èln/'UÈËÄa^™Þ¨4Œ¡[¯n®Ñ`¸!WŸåËò¬»Õ9ÍÛÍw
+û×ÆÙÊž‰˜u+d½LE·Ã¯Kù7€'6²Úw ¨Q:p€oé` ÍhËÃv$DȪ¶æ£Íxî¬$÷\Ó35Æ-Ïh$Ÿ¹D NîIA0çÂTUkË,Í_özU®l‚9‡ÚzÁæ@2v˜Äa¬“¯£œLÝ 8:^ ¦ûÊ)Â(ˣ֎ðäû,Ô)ü¡œ™Ç&ÏÎ2 d]L–n„*€³ÂZq@˜§Êä›(L‹‚¸%ÊÉfÁ‹Ž ([SVl$½A88Ëhñç@OgB¹Aˆ#¹·›oYl‰sxê<3†r4Ö0 E\%ä¡äO‚™šJL§ bœ¼øÆù§/]`j¸p*ü<TDRÂcO|Ýd+$`  ¦†«Jú1mÛ>ʈÞ ×~Ȧ¥(@áÒÞþö.
+ø­°èìT@Œ1ý¸¼žO ¦Xê›$Í!/v
+EI@;Då#ÏîѤ¿Ø±Þˆ3ˆ(òJÖÑ‘}=ŒW;Z¹a`7ô-îÕ› âdöXú
+ëh¥Üf¾oÐ5cáqbÛ$<EškbW3ò—´„±95-A˜]ʨůÚC¨fõJ—! •ÚÔˆ„UÙÙÓÁŸr'š9h„ŒEžñ®çÜÔ5ˆôP-ô0åò%ŠKw{½©\èr ƒc†â饼€Ä¯G*…´¼+ Î׮광‹ÛaŽAß=òØœ€Še„¸WnX¼6á3eÄá®±p#üA±>ù8ˆ
+Â$ݼ\çA~m--/Ù}|Âo½ Ô|yÕ s$<Z@)Û®=…5Ô×âJ‰»'È–í–®-d·m[}-œZº v·fwÏæ0“÷¼…P%bŽ¡âõ4s@‘Èér¶å² NƒÉAáK0=ÍmQ‹yM¡Ü86ûZóúW`ñ‚yAµqî9ᾦ:r+}Ð{qÐYbÃ7[.×–"Ú ½WH¦3#ñô´!!¥jypñ
+2ÊóV’föyKJªG¾Ñu•Ùw`ÃNnñ/uÉM6þ¾™}”@×êY<ûYjnžïR~P¨½ßN-i²Õ¡ß½JòÞñM³r…±§eÌýâÒ<Ösê­‘E=qi8_–Ò>ì£j9Ü“õL/¬ ÆMÈö‚3ä5(N×üh¤6ŸßçÒ9;pÂŽ¡†Ã½.Å}¾Ú!¾œú/׈Š°½f
+qj®¾y+Ádºr‘ nA¬3øL‡×µ+—Ò”n…£/¡X-ª¬ ¦éìú¿´üxõg#endstream
+endobj
+638 0 obj <<
+/Type /Page
+/Contents 639 0 R
+/Resources 637 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+>> endobj
+640 0 obj <<
+/D [638 0 R /XYZ 124.802 740.998 null]
+>> endobj
+45 0 obj <<
+/D [638 0 R /XYZ 124.802 716.092 null]
+>> endobj
+49 0 obj <<
+/D [638 0 R /XYZ 124.802 578.742 null]
+>> endobj
+637 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+643 0 obj <<
+/Length 2354
+/Filter /FlateDecode
+>>
+stream
+xÚµYYä¶~ß_1oVÓ´(Q×.xÍ‹xòdGRwk££­ÃãɯO$%µÔ› 6Á
+ÞÆ©lA
+f€¹*QÞ÷¨ù!H¼Ëçõ~ÁQ׸dµY“ÕRǘ„ œ1##uÐ
+(íN·\ŠWŽoìÄjägÞ±îÕh‡G FÊ{FW q™»¡÷XZä½T5ZÁÃ0
+¦5'»Uú9¬„iª‚”ZÚ‘ÝVÿ0ö½FWèÖ(ݱv;
+¤÷tAÞ(û¾Yò RuÁrIXµ ;#P‹µÁHÉûRÄ_ÜðKï„ûÕ—ª;v¸HÞÊEwô$BV‚9ŸAæ½2…hÉﻑšÈB›*‡vËx#6»e |ä⼠奙R+ ¾kºö Ñ®fvÙSþ†[«Çªk-Ê_|©p'*ü93æªRÁbÈcÀðˆ)$½¥?œte(7<å‘9ƒÁ צHæ)c¤Å÷™ì9îté0L^x4oîçØüƒÙ<8Lìë…ó˜½âÈÃ×+s [h|׶7.}¡ ô%ñ^ç(²ž¤F^1.7)aª¨M Þ@Á…t]!£Eª¢UMNLMþÄb0¦ ]såâÜBÎÀó~YæªüÕànÜ䂲 ÌDšÏZKkPW™$|Djä]«|œz»ŽªÉ냑Ú,Š6Æ´Ž Ý«Ü4?¾SÓ¥\´· y v´ ÛD…=¡< ³â"¬y=°]´4T|§£Ë6`ÖT+blŸÍUNìvêØshZYåH*
+ú ”B¤Ä™V¶îQ¢¶j^ì¨Á0-õQÂë"ıc2”ÓW“½‰¸Ây*ï«E¡+8 mÝà‘S€Ü7ß?9Ü C)B%1óbJ†8П Çß~` ‘nqD*¤·_¨$[£”{lVÄÖÎhI‘‰HÃÔ$af‘÷tÈ6Œœ觮o4§2×–y³4%ìwàéîùÓ&T"âXí®èAª>¿W–å'ÔC¦–÷’ÜŠDL*|ê+F ÖÂW&ÔT^KÝãgì½v]›Q£÷%­À2ÀeOךF×eˆ<ëÚ
+ùü4µ“`¦Ì1½²û“ÍV'ÖbÔoÀýüqgoâXøid8_.Ø¿R[%GýOÊSeu»i£nÀ•Ym¦Þß“··±±L†—$ƒg´Œ±[D,#Œã‘p¶ À¥Á¿ø‘ß>Žðï¶!TBLJMýû0éÚºZ®Oarkê±eRÙ6R†3ê¢x’‹& ïM×—,줛ªÆêC‘„¹ÙõVs7‡©¼sÌÛw£ëõF…!×µ-éÛF˨v¨µCd
+{CÏÏÛtdú˜YÂ1 bHEfV€
+þ¸ç¯eÕùx58DÙاê³ï•‰(üB‡`¾`iP‹£½c^P’vLX`w®H<W«JÓæ<´¼­@VÜ’9½Q >—EpžÎúÿ
+f·Ò Ý¤òË@!º‚ú@²¨& ´ïm³àN$>àÄpUx³¦Ú ù@3Õ\»ì©°]áB('/.Š ¦l·($HàÜ&¡{†¡ˆ’ô«ÃµÏÇVè÷è™7AÞpA3JMnŽÕ/A'ÙE#adŽ-*ó¸Ù¿ÎÇ7ú-Ð CÎ÷v™½‰úZh^2ñR5G~£b‹”%0EûD‹ ’‚Œ©;õI§~¢o>^új4‹Œ ¸»s5puŽ%ݺ‰:Æ것ё>™öe\LØ~ #Ï(M1
+‡ç¹4ƒ3Jƒ£Îùb
+Qñeûêòº Š¶ž†r[B?~–­Ã`Û5,Ûú’ühäèŽ èÂ
+¬ — lQŠ3œPëiÙv€Ì'{¼Ï9˜+6$öæe@Á+íUýÊ”*3.T©× óax)Ë„6†ÁhÛBxoÛ:ÇÀ½.à_ÊÿUÖ½½—vX)>ŸvëvÎ âä°‡­4skl»quôÉ»¾·hŒé3p:·u[f®ö®û~ê0Ã
+–¶àÒîZÞáœ\õeÁ:ô%&ÄŸ &âÀà¨;ù8œ€‰HYˆltÓMÒàI™®L¦üû—»_Ç’†˜5ˆð? x’pó‘k•C5³‘L7ò0ªÁ‚on©Œod2Jdã»x”æ¦(ˆS¾²“…ö)®È'#Í1@œ=pŸ3— ëÿ5Ô9Þ~>¾>®ºê9Ô¯?ÿún''¯ò=¤Ë»kðž2ç¨ßmU2ù ¤HU¸÷*Þî¬.;@n.•dÓÂd þ ¾
+š<endstream
+endobj
+642 0 obj <<
+/Type /Page
+/Contents 643 0 R
+/Resources 641 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+/Annots [ 645 0 R 646 0 R ]
+>> endobj
+645 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [255.147 556.885 277.618 567.734]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.155) >>
+>> endobj
+646 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [389.657 320.593 396.631 332.548]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.10) >>
+>> endobj
+644 0 obj <<
+/D [642 0 R /XYZ 124.802 740.998 null]
+>> endobj
+53 0 obj <<
+/D [642 0 R /XYZ 124.802 716.092 null]
+>> endobj
+57 0 obj <<
+/D [642 0 R /XYZ 124.802 612.137 null]
+>> endobj
+61 0 obj <<
+/D [642 0 R /XYZ 124.802 543.992 null]
+>> endobj
+641 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F36 457 0 R /F38 464 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+649 0 obj <<
+/Length 2631
+/Filter /FlateDecode
+>>
+stream
+xÚ­YKoä6¾Ï¯ðz£ÜŒHJ””`€Ù,’Åî%b ‡Ì«nË6'ÝRGRÇùõ[/êÑ’gȱù(’Ū¯¾*ë«þô•6‰Êcs•%±*Šüj|_=ÀÐ?_i™b«2¿V·a*wÎùþöÕ7?æW…*œ½º½§™·w¿EýãFGÕf«£7›­q.òÐì¡™ÑÓÆäQs>@ÏöäÑ{m“–VÜCg[uØD)׼⿛ÿÜþû›m1n¦c§’<—-kUò”Éqtª\¡eÂÞ¨¬eljƩԎwŸ¨Þˆ„É„B¹<Œ«~cLTž6Û$‰š®_ˆKeÆéåï¨ÒAÇ—žh „˜ „^üô ߧ­îAm¸ÉÕÖ˜\Ùìj«µ*Ò”äܤ.*[_òbd];_?`ÓÁ£UK•ä©J“pħDz¯>Víâ"Iª’"•Yû¦îúö »ìñ°½ZJMrå²â«¤:™ååÀ%¶®žø÷ó ´žGÎhrwÕûX'u°Â;*i(h(U­y¢"ZZ—Ç
+çƒØeãEŽ$¥õáNå'd¨Ót
+Ý ÖCØMმè_=K¡“£  =œìèY©g_ž»•06VÎä_¡+­§ªÂã7r‚6†ÇåN<
++ô`„GÃV ‹Ü…‹}]$ ËÛ²îîTë‘ô…} ’g”­ƒ0¡£­
+w:ËUæþr¼ûX¶wÕ=4 ¼bQï^¿¥éXÇϲCôûi÷ä»×7ײâãä÷€©?7Œ”¶(ov/LúGsWñœëw¯wÛw¯9ëýñÆì1²á×ßI\šœ‹%TõÜã+¹ ÒTGÈNJxí%nâpJ<¿}˜ßÑ䇀üÜ)î‚ÍS[õ}à1°Ý½¼ Ϧ%ì½oÿƒuûŒà²aˆÒFcç_ŠÍˆ‘gŽ ×W2ÅI’ !m“1|J[ôi!€Ã)ÐRÒ˯®¡¨Qq`¢æ<'™/35[À'ó×¹Ú`¯ª[¾<‰ž½=_b57Ñ–]ȃNÖPÄ¥TÓà-»Ï¢ IJJþ â/P•:ïùK}È„i¼x* aOëìk‹ [—§à
+Ü´ˆ•…NYÀ±ÖM<ØÙÕdÎ:CD 4y Lí¡“… ö/
+
+€”z°û¼±M‹ÿW˜)øTzò<AݹŸ—½¨VCo$Üênb
+ùÅçM(€@‡æ šjá¸0{à¸#†¡ @¶3·˜JSþ@„*g§ðÉ/(*#ÁƒgŒ¬¹˜ƒ:Kb®Þ®æÉãùç¢tM½TŽC­‹U7ª¤Þ[µÜß³;Óc¤¼‡4jàëHóÜiØe&ž©xêN”À,Hh˜6£ü
+endobj
+648 0 obj <<
+/Type /Page
+/Contents 649 0 R
+/Resources 647 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 619 0 R
+>> endobj
+650 0 obj <<
+/D [648 0 R /XYZ 124.802 740.998 null]
+>> endobj
+65 0 obj <<
+/D [648 0 R /XYZ 124.802 505.866 null]
+>> endobj
+69 0 obj <<
+/D [648 0 R /XYZ 124.802 477.215 null]
+>> endobj
+647 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F38 464 0 R /F36 457 0 R /F36 457 0 R /F23 440 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+653 0 obj <<
+/Length 1755
+/Filter /FlateDecode
+>>
+stream
+xÚ½X[›F~ϯ°Ô‡buMh©­ÔKúÐ<d¥¨j*l“`°
+t6"Õß0ÅH`¥]í²¿K+–g»ÞøËmœK›g<ÊË–n¿óF6 ¸X˜DW¸aµñ•q}/Ym”r“0äÓë
+L€’îH×Íá~ðBE< I¢õ„ã½X®Ð¾ç¤ë~XƒŒaè|Ìù0^,Zþ§µÆ2§]ž¡ñ4H¾f½´¯X[¤ÎÐèí¹LÅ#tSYÊ‘;
+¶×„!*ô]e‰—.xЧŠdɯ8rC§7û>%Å ©š¢ËÍ(P ¾JlÖMq(ªy>m”çj£&ñ2ðÀufýd
+E_-…¼o–f’œUR’CkBÕÿN…˜Nø£FÝ®7qQK-ƒÅô Ç1:hÆMÝY€}ÜaèúÉ—»‹îÊQÕö& k<Ïsi…•7ð'šQ%@µ?÷¥æóå¾Ò)|¥OxyÊ»^*‰J§Hš~g×¼Ø<;ºb‡¶;”I•ÀDVm¯`i'Th`Hx^¯jþ/kÜá”ix)íºt‡v?晋€’Ø‚…½·
+u*D¾ÃS„A\½x·ÏHŸÒ Àú±¶`;‚Ðô‚ؘò&€þì‚ÝŠ¢f6Û¾oÌê/Ñ}©EA\éjfæàä5ÊX[4îS=¾PLN%³³rÀ$Ÿú@ÍÏ µ± –¡Yµn`âLüç:Dßp¦L(Ê„ÄÖëcD=o‘v[qå\ŠrX £¶­XÞI»ƒÜO•G¸Ú¡ˆÚƒ(N.Æڈǧ傶%w4;ÀŸô|§Þójç3=„
+«„û½œÇÜŒ.ÝÖ"˜zÉ` yðæ
+º-ñØ}ô
+Õp™Æ¢2w |heh`߯c=k\jé/ÉXôÂoÚQ›iÛ‹e_…ž›|…ç[֤סdo ”?¯qÙ¢¸h‘(“óxWŸ 0ˆîxm â˜Á•)ÈÊd)2ö]»›â4SÝHQÄ‹/'\¾¦e9ro@‡w5]á—*@·-bÚ 6>,¼ˆŸHðŸåÿù³Æ’¨öbú†QJ3¦§WŸ’Êaèvêö®ô]öh‰j‡! ò¨po*ÞáBÕòE»”;‘Aì9–T0í~©i+FŽz¼½4‘ëë/mgùž£ ãí]~8åUGÝòe¿G¹ïx·ÂŽð5ƒÆÜÄC¨Vª•„ª„çD9¨Œpã«gô–·GùvRT”q=˜1pNNÒ‹ÈC™>È×$™ –fV”ĉÀF&Zú樌qãHÌ·ð±QOV°AÛ?ùŽù/€X€endstream
+endobj
+652 0 obj <<
+/Type /Page
+/Contents 653 0 R
+/Resources 651 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+>> endobj
+654 0 obj <<
+/D [652 0 R /XYZ 124.802 740.998 null]
+>> endobj
+651 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+658 0 obj <<
+/Length 1304
+/Filter /FlateDecode
+>>
+stream
+xÚ­W[oÛ6~÷¯’y°X’¢(jC`Å:´hÑ 5°‡¶t³£Ô–:Iž—¿sx(YŽÌCƒ âíÜøñÜ,<ÂR1Ã¥+Î’Äxùvƽ5ý:Ž$T!‹®Î¡2L''ÌèdJóVDL)Ir~^Î^¼/a‰½åÊ’,‹O~Ѧûåz[Öýgñ>â§ù—åÛ¯Í:œ) ê¥`‰0–3­‹y†Òïo«g¡ÿ­mæŒýb7~>„_v(köËò`•L‰Ð ÉŒPO]@±ÄH/²(ýå·ÿ°9lq/ *Î"o?ûä}á^§oáÿn&¸÷~†„Û™4,TZE^¤ÅÄÛÌ>N¤ßh£±‰
+èшùs¼ô‡ìîâWŽÇW¶tS‘’3aâc¹'ÒÀÃc•8¢}µÙÌ%"?Oav"14àóêÔ'O¤F1‹ÂÍp =ŠFèqL­ëõè„ ìÞmÒ°&m웎¯
+×>Jí¬kŸÞ"`ž0
+&€`¤ŸÄ'ÒÝdöèÈϬqÖ”<Ýu0‘*ñ+PÙÓt›~Ec ¬ì2ÅÁ€‡5ë6ÝÒšîÒUeKk¼ŽÛ´ª‘½ÇQ |x£7+:½Ç£f‡‹< I‰z@§pÒ`Ýþ¸Ï\(˜×HNt7‚!rŽÔ ã-Ú„®ÿÕšPТYÑHÀÂËãÊ¿_LN(­€a·´™v?žF ÅB cp?ýÝQówÚ%XÉn·×ÔëÁ5…sýÒÞ×ÆÍñm!Ú×µ ·›ëÅÕój @Ì]>àø­©@¸U˜.²Gˆ^5EI4W7×Yps¾”? .‘o Aæ[TqEìÁ©e]À½.Ëô£c æy³Û¸Ä7Æ‚Ë}mùm“æå£o’¦£ïx÷¬»ì™àGí‚ŠkÂg±kâÿm[<©£ ¸úíM-|çþž€ß8‚Ì&-wVSÚi9„§ãv] @"¨×Ž‡âùÞ*ªê5Ñ[ÞMgL¨Jùà|å¤4»¶+˜)bà,­èåÇDEQ»8͇ÇnûTZלeŽgkTÃPëI…˜†âCqF°Xµ'mË¡cšÌÒ F, èÃUQR’«†–%Ý,è(ÛÍGÏ=},*Fù.5œÝXþ)â4\Ü„G•
+ð0µ¡<DC\Ré­Í¡Á7.È$VË»²§vÅ]§äYk
+Jò6ò<hU
+$
+@Ù6}Š^´’õ"’,äácÃzj ŒbqÀ ƒò
+endobj
+657 0 obj <<
+/Type /Page
+/Contents 658 0 R
+/Resources 656 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+>> endobj
+659 0 obj <<
+/D [657 0 R /XYZ 124.802 740.998 null]
+>> endobj
+73 0 obj <<
+/D [657 0 R /XYZ 124.802 306.473 null]
+>> endobj
+656 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F36 457 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+662 0 obj <<
+/Length 1304
+/Filter /FlateDecode
+>>
+stream
+xÚÕXKÛ6¾ûWè(ÃáC"[ô Û6@Põ-ÉA¶e[[¯´‘è,òï;CRòs·ÞäÒb±ÈÎó›áÈpüƒ„b†‹¤PœYk’åÄ'$ý:È"•dÐê
+1“Ê°Ü
+za&·Ç<ç¼ ™R"Èy;Ÿ¼¹“6±Ìæ2™¯=Ë|õ1mª§ßæ]]6›]Åü<ý<´ €Y­¯ñˆk<]ëJWý±¸ÿÄ5wb†ãÛ™¸Ü³:`å/mWoêæš$'X™y¥–3X>\Ê
+Ì«®|”Ẩ‘ïÍ98«˜22ÉžãÏÍ·u?ͤ”éc7…´f¤«=¾.§¤UO2&ïæc0-0(òœéî˜5˜`A<_’a×0žÁ|2†=t%°q¦“§ÉÇä3OVH}ÿ÷àɇ 1>LtN9·ø¾›äʕN”eÜèàÎsí&M
+Æ “d9R- l`$¢ˆ¤eædåy4ÃÁñ@uçLp@X«‰Ô@¯Ò“ g•fE(·?DKx@û­ô¸xAð|[M3•ó´¯˶YáZÛÔu5bÆF`xš"Êž>"¬Š´íkW· ò5Õ*rÕ—Û°
+3•GòlÔ_ý2^K%¸[…²µ$Ž¯£™tÙ(dµsÁÑÓ„£:È–’™Bþp{|U3:ol'ÞgÞ}8éBeã=!ÿî{»pe=æ<žuÛ˜À¾|ˆo]å3æå9æ-½‚…·^Êš
+uI¾Oתrå’» ëP™Èp|kxÍR¨ o¨(ˆ¾±ùI*,ë¨Aðð£¹/ *u2ë‹xveÚ{ŒWÍᑺB¹Œ­¢Ž¾ Å°¦¶°ïBzº°5ˆ9 †Šo“ 4èÛ?Î./™¥‡n®ÚðôáH ü鲡‡6.i¦óü?0ðæ·¼úÇ/‘[Þ3¾¡d‚uÏâçNˆ}(ÐqÛTþÌHþâuèŽáF£ýn§å'‘‹¿‹, 誗oþ0¡ú³7MéÖÿÿ¤þƒúkçtø¾9=;k˜òd îaÃÍ1²`’ åãa Ó†ÓmŸÄ¼0´wq˜b„’‡]Å´2 NˆäH|ÃY´_i8ûÐÈ“Xq Õ¢¸ö]OŸ•¦PG½ëŠVÐçj¡Àc²8ý­àzgËíendstream
+endobj
+661 0 obj <<
+/Type /Page
+/Contents 662 0 R
+/Resources 660 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+>> endobj
+663 0 obj <<
+/D [661 0 R /XYZ 124.802 740.998 null]
+>> endobj
+660 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+666 0 obj <<
+/Length 2552
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YÝã¶÷_¡>EÖªHê³E_®hŠ ZŠ,‡$@¹¶v­;ÙÚHô9Û¿¾óEJ¶´i‹â°Gj8’Ã™ß Ç*J៊”Î’*ÕQ™¥I]WÑþ´I£úëF ‹ÉLR*üZÜ]%eQB5ò|xÜüþÛ*ª“º0Ñã3q>~ŒÍv—Õ:·;7{ü¿?oU|`² ßÚóK-±šØ¾Bÿu»ÓUÜØaÆ-|^qz £$G$?1çÞ^FpE^éÛnu DO½ž‘BXi['ëþ”ªlÝöçÇï¢Ê’:Ë UIçt@Üg÷£ß™káx;càçvX¦1ÜÇ­Â1zæ1ALKóUœÐ‚+ë=[¡‹,~n¬»
+gŽlßwûìá*ò<þÌzsãòê¸xxv´3)"½¹jZ lƒ&ãAkl=öÌ–E~mýî]‹záYwkãñ³,þa[e±HáAêÄ
+ÅYªà,ÈvZç”üÜäæ/(pxG»¢NJSÏÁâ4Tžd™f@!°
+
+²,³§ëÅï3·´ÇéÉÁ¸4ºfJ| ^ù—ËÖBÞ|u{÷wµŒßHiYn؆7¼“*
+IËøtƒmHY˜àJÚ[U{¸1U5ÙÒo%Ó»Šy€ðÆ}+œtØã3ƒð‹ Ï]@öÑ#I%þEQšVçÓ#CDuˆq™v'å¶0]Ò ”áÓŒ÷Îii_ˆz¯²É+BÜŸÇö€nüNRñé<{ÆqlhÊ0à.åFCo0+QAxdVò~ÎסٷãlB÷rJ£ð€ ²È#Þ˜‘\;Á¨ðã WŒg;›)kØ$´Ã®à}Ÿ¦…Ï©!Ÿ]
+^g¶Ì43É43zçÃÛÙ1Q²¤6äw@ûçJÌ)óÄ(#GzZ8O´üF6#›òÆ‚©|"ã¡æÒ0!¤¯0“³-V~ÖÚ±J”eÿÛIáF×I®ÊU›¦òW‹Byä¾LÄc$6 ° ï-8xAØݸ'A)Wpà³ò¬åÇ*ÙE]™ÿÿ]‹»Ë5äÝ*yÚíœNžþ»g%¤x ‹MæE’y€ å&¿±GÀJƒ!Ï/QØy’Fò¤z
+Mïr&ì)Tm bMð9 qo)N†&Œ 3Åà …âFþÖgU>ta÷>åÂr/…]Srò‰L¯TºüÚö³‰>"Nu,BTÎj`2g!ãå$2®¡LUIýîÔÃ[ˆá܈„ÛÇ·‘àÝãf°œ±LNTá­Ú:¥3_\¨}&Æ
+‡oªJùL,eb0^§Üš—¡á÷<•%‹øÑ¿¯È Ù z—!¿éÔ²® ©‚¡/oÅdW·upœp=rY¤öŠZ)¢5¶Ã4ÚÔY|¼-†Ôù”AßÃ[N(³rÏ(ü„× ê:rè¹=“r¸¿,½ÔT6Ɔ_¯Öç"µ+p¤¿ŸÖtâÕk,M,ß ×cßÍÊÀ
+]zžŸ\†Q¸¹Xì7ðjÓøò%®» ¯ƒjwˆós2x–»½ñüÛ’ Rîn"äùo”æ5ñ?‘í‹å²x)9l%î§ØT[Èì$4ªjý—ŒYÒdjùñ™¹e1ßyLÞ_N(QLqðœßùé²øØw—é·G ½SO«ÕZBÊ/¸ÌàåW&/kW(‚q–À% •¡ÄÊ}Ÿ|¿V+$@ç´oÒLÁ/àÈüµå:¡ ” 0 ÊCÆ~åÈXn÷«.‚>²“ÀÓrí‡9U@ä(³Y2²ò‹¤EwBU ÓLyûcß¿ÌSÊ8endstream
+endobj
+665 0 obj <<
+/Type /Page
+/Contents 666 0 R
+/Resources 664 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+>> endobj
+667 0 obj <<
+/D [665 0 R /XYZ 124.802 740.998 null]
+>> endobj
+77 0 obj <<
+/D [665 0 R /XYZ 124.802 237.652 null]
+>> endobj
+664 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F36 457 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+670 0 obj <<
+/Length 1693
+/Filter /FlateDecode
+>>
+stream
+xÚÕXKÛ6¾çW›Cµ€Íˆ½ZHZ´E
+-ßÚd‰»VbK[‰Îfûë;J²,y“c‹=˜΋3Ù+W!üÉ•TF¤¡Z%&Y–®Šã‹pu[?¿žE-‰_ ›mRg
+"³sžK^ cëù~ûâÕO:[e"‹õj{G,ÛòàSÞ–öîv©(¨íãvßZ»m«¼¾¿•ÁÁvo^¾¾ýkûËJ†ÂÄ«”"‹"’Ì»®º¯Û}ø3ŒÂ7/×7£,ˆÞƒì ìÈïH<œˆ‚¡_ŸØÊÁ
+wÁ/ñ¨%=mãrg½ N­e^3YžUqÆ­×N]cžêÕkuU-ðüД–ãwã”È7NŠü5
+šâ¸†HÈâˆÒ7k7R¤FONzãô¹XbÊË°IP.t¨'†m]BÞ—”™äƒöÙ,Ûü< ¾th ;ÝÝUŸ}ÊÑ̵ £†>µvújx5oÛæ‘ÕÂav› „cçOp®<^:€Ž œ‡ê˜øÝ ç–lRÄš¶º¯êk.õÞ»ÁïW?¥ã%0¤V (öj»¯ºÛI² ln7* ,~¦aPaQ—2 ?È‘-²$PZ…e&·&¿¶Ÿh—$
+7
+‚jàjó[ÐþHjï×5»|8æq{ÛzMy;j}Àu³;ØcçkDfÌäàø‚Ç}ÎuhÐòzOÖ?QЧ¦¶= ƒ-z냻ÍèQðÁ®ã(ž÷g]é;Š“³8Söûýõ\A,4,¼¸ú’øFÇ2 &SÎU©ˆâàué¹.#°ו·–U7Ž­Í‡'^óö#E¨äï܇\éX$ÐÃÏcÞv”í1PAÖFÅ:hîΊ0{GÝÜQ-Â$ë­KÔ¤‚Êñ/$Œa ¾qlc×W~pé5:ÑU»gRÅŠòÌLÜåÒiŒÐ©zÆ5ºÌ¼ c”„{3šècÀ,þ¹(2˾òô•ã§
+«ßr<d‰³‘%B¥Ñ´9ÑîÕ>$ðé6Õì¨ Þa¸<Ør9Ý@4è
+$ìù“o³6Á‰3
+ºïNÜv ÿRmäûÞ”Sçáž2kßú´¹¼ÑÌ€ÑÑZa±Ø–I´Ù„ÞMÇü|ËY—Pz4_çú-ˆ¦†®.8ãé‚J‚ªè—7
+‘njff;t®r§›¢”/\Üa38ct–@Ìú4´žq˜ XÂ%uUZSwñôiüÙ,ÖùÅÖ2iÖ7àbv±#¡úN3™A0! Ù ¾Äž‡Avû¶÷ÙçdÞm9Ðߢ¶?nG¸ì10ôïPÄÐ%þ—p„~‡Ø;6[|ZþÔýEÔïO;`ƒŒ2TÝåk'ç¼ñ"ïî.y‹gÐìÕ7}ÎЊ
+endobj
+669 0 obj <<
+/Type /Page
+/Contents 670 0 R
+/Resources 668 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+>> endobj
+671 0 obj <<
+/D [669 0 R /XYZ 124.802 740.998 null]
+>> endobj
+668 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+674 0 obj <<
+/Length 2515
+/Filter /FlateDecode
+>>
+stream
+xÚ½ÛŽã¶õ}¾ÂØ<ÔlFI]ºX MÑ´ HÛu‘‡Í¢eÍX»i"É3Ù¿ï¹QK3»E€Â"y.<<<WZ¯øé•­J‚pÛ@¥i²Êïo‚Õ€þz£ÅX£b³àÎCa ’(Eœï÷7ßþ¬R•Ffµ¿%Ìýñýº®ŠÍÎh½~ØìÂx]—Õ&LÖÝF¯ œfPVq¬³ETÕ· +²|À¯¶›^_€ÙIàã¢õGX(ruj³³&Z¿¥ Ó”°›^—yÖ¸Ú2߬ÕÈùIdZØ á o€¼cì{”ôÒÊŒ…)6ö?‚vZ«Ô9ÒF×dж·us_à¡Mº~:yn.$´5¬wÍUC¸YWÖ-[g
+ hîã_C`VFE:êãB Æ™ÆvÂë À£¡ÀÜõ„>Ø<WoÎã– ¬ŠMè£Âÿ3põ—³s!Xæë…ªã÷Æ6«íú¡j‰>;ã:×HX¸æ½¡^Ùj××k0ÄúÚj°ÔúҴ·ª;^ÌÈ~™2í²ÃÙo‰ˆ5ú(M£RøP.²Jä««k‚S†x’Ãñû©é¸ðt°£RPË>vôU!$qoÝ8ž‡ÈÀ‰KÖbm}¾t¨*jG¬½ùÄK¨‹ÀåÛ¦hO<¬ hnÌá©$AJdì¸R›y·ƒ8šêçlmfm ú-ê½Ê¥²ƒcÅ)–Îî|eçØjöÙ'$¡'*ƒÕ[
+zÌw&0ÜœQI_[u}øµGYÝ];¤ UjÀ/(r Œ¯ýzóþC°:‚?þx(éFÈ{éêþòŸIdv¾ywóÏ¡IeÈKí'õ¸ÊFK|&j߀ڠè(ÜW‚ñ2‰ëw¼Ú\QSÓ(‰a *8:ϯº.‚iHv„Á™‰}¼E¤(eA4¶ VàbÃÍàxÈ’½$°Ú»šquÇL3†ñ0}ýÆëýý¿!+ ŒüM@}ÖšìPækè£Gl‹ï 4Øïû‡œ¹o 1Lj¨ß¸'“5q* x!«\£aN½£>:D@x_x%$‚ôˆUÞò·*úˆX±ðI¡7ÅcuÒ`t‚ßòüäµ0âF zÁ[y·¨ÚòPRóÛ±H ý3Ž6òm¿Þ(áÚ˜.•¢¢•ò=ÖþøÝðü!x°С+sYf§ÆQ=Nó´M]MŠ 1½ 1Tÿ8c!t¼­„¶¡ÂGèø
+LøGo»TÔ¾JñÕK×0\zÉ$“ûn’y1 éÄGÙz¡zÒ©
+tøL\½®0bˆdø¥P¥èß]a<fͱ¸åšašШŠö»oÞf©äžh7kÛò®‚‚}í»o¶¯ZŒ@û
+/v©T¢ÔeÕñ¶ùJ›= n³m{ضËXô_À‹„Û›q–øÏ"¯ÃWàä_Æ„¿öITÕ¬Ÿ6{NËè‡çЛºãFÑ&Ø[sªhöB0&̉m’¼P8ýO{3‹0xŽèÝå
+Æô™™ûSÒ¤cßò ’ÝÉÛ®\ø‚©ž§!Àqè99邃Z¸g†‡$r²ÞCwΈOýü®”“QžÏóšÈ‡˜Ð*—èå@µ¬
+ìâÿº£$¶/7w:¹ÞVÇ@fâéß–ÿ(*Ùendstream
+endobj
+673 0 obj <<
+/Type /Page
+/Contents 674 0 R
+/Resources 672 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 655 0 R
+/Annots [ 676 0 R ]
+>> endobj
+676 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.087 551.741 425.549 564.057]
+/Subtype /Link
+/A << /S /GoTo /D (Hfootnote.20) >>
+>> endobj
+675 0 obj <<
+/D [673 0 R /XYZ 124.802 740.998 null]
+>> endobj
+677 0 obj <<
+/D [673 0 R /XYZ 140.045 148.719 null]
+>> endobj
+672 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F7 627 0 R /F25 630 0 R /F24 472 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+680 0 obj <<
+/Length 1802
+/Filter /FlateDecode
+>>
+stream
+xÚ¥XYÛ6~ß_al^´¨­Ju5¶è‘E Ä@š>нVjK†Dï&ýõK‡m9AøA<f†sñ›¡ÃE
+ŸŒìmT‘ŸCðÑÆïѤ(“‘¢ÓkCþzêÍ× mÕ+ly|líSÕH
+ÎŒ) +¡Œ"É¥HßÐ6±Sç˜~gp:Dö‡›Œ5”bƒ·UŸm3Ü^´ÙÔ\Ð\ëØ[÷^
+X_ñÝ|œ¹r z¬ÿؼGæ×/–÷£\ûrï‘ýåLä€éϦªVÌ‘¼=m€ÊŽUÛ€Bæ–¸KZÐ|sM›ÌÒbå 5lJËZÞ7½¥x²øfÕ€¥“eÃ˯pA‡eXpåž/¤ýLGg'œ -z¡ãŠŸ
+MA¨¡¬ñjFê[ù1_W¶ªëðÙº„¤ í³Ê¥}8”aF”ë'lÆ7³»A,~î€èÖJG·À#êÁµ ñž ¤ âñ´'9ãm
+19¾F!ב„°¯2réB`óQä<pq„áXŸy^DQ5VC)oå$®c<ž÷3l
+z@X9˜HMу=ñïÕFÝ8 -?ò÷m9ŽKÛU¶ •t­•QàÍVŽª…ñ¹êvv®eFê$¾è}u’œÅžH*jií‘åÉô±ŠL—)AÑyÆzà~·£÷Ͼd‘¶bWâøÔ MYAi ªRéÁã`|uÍ™ƒÕÈ…ÓêST-Ž(ÈÁ·µxÝÍ;Ñû‘°/-½‰ø"ì¼8…ŠëšX)85…ì+@K
+°góeÍD¡å  WƒãÌÆ!@¥Ÿ$8þï1*|áW§ˆtîϾ0IüŒ:ŽOüËæ—¢ÃØ¢ôüÄÿú*•endstream
+endobj
+679 0 obj <<
+/Type /Page
+/Contents 680 0 R
+/Resources 678 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+681 0 obj <<
+/D [679 0 R /XYZ 124.802 740.998 null]
+>> endobj
+678 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+685 0 obj <<
+/Length 2519
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y[Û6~÷¯Ò‡h°1Ë;¥-
+´]´‹(ŠÅЇ¶Àʶb+ðH©¥É4ûë÷\HI¶”IŠÅ` é<‡<×ïÐ*“ð§2¥­(¤Î‚•¢,‹lÿ°‘Ù†þ¹QqŠ±F…_+ƒ[£KQ˜mµ6¢”~>év²e¡3U–8é,‘•™ ‚ø'šÌ¶qž.{Úüšý.³ ÿÿo7Jf?mpæÃÆyáK]Âûy£ a¬·.³¥eðh’Fþ½QÊS¸"'MkGÒyS8!MiHŠà”
+@\®%Že!¬vÊg‰ìß:¡œ„­› ŒÔ––…p… :“¢ð2H[,F–|ØéH«[§”20¡w²(Ög;Ø×`¿qÚysÚ|º2§€ §íODR§±ÂxK¶3†+ qO©Bε1Ñ‘Vhåü•—ˈ™ö"PŽ²J£5ZK[G‘&}ZPhA»ÑÂKL¦ŒEÀÃÎkë‰íìx·»Ã¢P¼F gdXž`š±MSX™“ÛF¯ý×,BD©4ÆD˜¢ûî~óåEVŠ8Ý¿¡‰÷‡_óûS}·Õ¥ÊßÝ©üR¿oºGx陶ïàYä‡Híi2oâX?4ç3“pEÛWCÓ¿©öCwùpWØüŽ•yÓòœá“¢¨§;`ZÝéàA"ÄAœGcïG"¬îx°ÚïÂÓ&wÛ»ßïÝ@ [ O%JçèhÝînë\þ¶Þw[cq |;Øpz&öÈO°G¡'$ú¼ê‘ë—?˜rÒXéÀʨ¶n÷ö7éä0TöPÁ»¯™)9 Ï¸¸DÜmmá@á «‰Â›ù&:~ßÑ.ë=’ªh RvÞáñB†zÉo˜JZ¾ÔuÔI0h“R<íb¸ 1«öx®Q‡Áæ6rúl»_L~ªPM£`¨âÇ;šß‘S&™üÔ€tZÙ7ǶùM*‹Z­Ú=-wé`tœæÀîÀ®«iç]:*RðLÈm8E(š 8Úg½ ÓÊ+Û“[[%óÿ, IIB³Uö £9¡Š£/™ÉÌqJ<.ÒÐtø$}YYæ=çÀ_èõŸ´Ãú]œ¯¾´h‚óù“ŸpÒ)é£eâ}<td®ÿ’ÊpÕ‘…Ö<B¸¡ÆÚ}©U{`ÃC}Ôpâ¹B.õCÕ´ènAsÀŽˆ–jëƒ@Å–ù/ðuª0hk ïƒuûîñ|GGÄ/dÐñkÃnŠ¯C7û}²5Ž|ɬHZ³‡âeì9MBn+>y³¯®òÀ¯XI!„+-¥,eÀ]‡Ó%!QÐ`줗=\;y1êÒ‡üu´©AÆõ‡úÂ_¬(—÷g’Pt?Ö4£¼°åg;/ÊiúëzÚïB]«½¾H–¨>i [:Þ)ÊŠîué‡äœRxë¯õ>e¥Wœ,Ì*ž3%>Ç4 ì<»U=f§
+ÏêÀJ´Ts¼†ru‰UlqD´³ô‹˜Ù¿ùbÊë_óÅþÅâèJÂþCRM’?—IQŠ.Qš|Î
+§¯}ŽýñfKZ(ìØÖO÷'Hê÷—&æíÛ­
+9×ÉÓ=¯¾âˆ"fL0ÕWLåUÕû¨U¿Zèr‹ ÚAòÔ°x¬&-ø¥1fŠ"cç
+
+K‚†AéZœ»oÜ &è‘ÅîyPjy;.èüÁåöá$Åèï›XBÚ”Î<N•\­9{ÇÖ¬ÿ¿ýÑÓþk(qǦýj¥ˆÃ‰Çñ¿¡ù”;o5Â
+²õÒzVØÂDÛÑv”
+ëH—?T˜jð K >G” _`!|±Ë§ãÐc,Å`Í÷˜4Ê·Ò^óc0%ñ&Ž§„÷Pø­j‰Z]â
+èL)À¾ÁuŽCp˜¥o7}w®¢]*„ÀI&0"òËï„"'ɱ—×<û¸+À¥ç.Öüì'Ïê5ÏY(•éKYx‡1’‚0º‡Z)œÐOÞ±`
+aœV÷éFU‘ wç4Œ_0sñ‰í\Äò^UÅ{
+endobj
+684 0 obj <<
+/Type /Page
+/Contents 685 0 R
+/Resources 683 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+686 0 obj <<
+/D [684 0 R /XYZ 124.802 740.998 null]
+>> endobj
+683 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+689 0 obj <<
+/Length 3013
+/Filter /FlateDecode
+>>
+stream
+xÚ¥M«Fòþ~…w/ÁÒ˜
+—
+Â|eGDçI½_¥l
+;Åœ'_UŒ éÙ­áù!š=9€­œt.¼ ±kùÃF¾À(¢•$$b÷ðò%Tzé#Å,“å|“÷w† '‰?XËQ0~©˜ã1¢’.=ÝÒxÅ­¬Å9òGÚº­*¦R'K01Æbø0’Xœ˜W³ÃcÒˆí ã6ž¹“•‡–’vVjr M-4z›5¾+ƒÎ\ä¸q>ˆÔdâ¨æ)¡¶i>¼ lŽåŠ WäÌ  ÏéJ3Q‚¬HbîxŒÌ¥h¾“ÄfW²$tL.ÑŠWBîJ@Ÿë¼<I-óÀµ#àw¶;|ã3uRkbïykúõ;!\‘)sǺ¤°³Y©â(+Tî½×Å  1E: ‘D*c•C¨~@ö#‹
+ž‘£”Sû`PÔ |b¬Á§ËÑëW^JÅñùY »ƒÑî+
+køó-˜ŽéªRBЭ‚•“ÍT_‡žŒ5"còToóÝÀ‹ˆõD_xÞVpøNÑèj™â{ßž$…;•4Íٺݻ²÷gKnÊä° ízãàñÒžÎ}ÉéÑ©íäò':;O—Çá,³ÜzX]ÚÕWÂG˜5ácà0p ÓŸ]þ
+€55ùDã€Çä„mŸî¬¬5ÆH;ïÒ†\Tƒœ%Ta%€›ÈÕQ’a<ÉöÍmã˜Æ¾âW¬1¥ˆ™—Ü;ÛÓyw‚Ã(8rµ¡$ŸÑUR¨$)ŒDïl]5Ì0¾ª:„b–ÂH…Å™âXÍ,!]–±Æ˜¢D ˜>è0–¶Ž¾âsÙóÜ"iÆA#“DAkã'ŽXýNA @‚…ÝbOž]J…I#3Ìc?QJÚ™ûöõO¯ËædègÚBQ6•{?r®Oªºmâ’.¶±˜˜©Ô×irÅ—‚°/Â.Ž”eð6-¤Á$- ¹¤–U±fr‚fqÀØìñ–‹?r™î?°¶ü k-Í—Õµáû7ËÃÀ×É{—_>´¼ÿØîýÊîÚ4Ñ}®(¶Ÿ: ‡{|§–cŒ¾Hy¢MccÒ…G•ŒE+oùAž])ïØãQã“úš”ͪ€²YxÜÉfÅO„¦ÌTÙ@:ð÷=-#°«^…7Zn¶÷kq-?¹ñ/³ W…Ž†?}¦Š;´·m‡y×¥Ý`ÐTä
+š<ÛÏ‚Q
+縅͙¤”Íl  %Nò1oõ,½TûAšŠ'ªš¿à'Ó(±Ëû-/?¶üò—–g_Ùr“ü½Û¯Å¨w¬wû÷Ü-Jå~ìÂŒkk*Ë"‹åpŸ‰ìXÀ:ƒ…%~¦ÖPAzJW7ÓK½ZUuØ{WyIö›‰#Ê0‹”FËÁ.°Pgãhí3ÌxX!Ñ$„I¡¥+H‚çîý·;Þ¿¸xà+‚WΙǬXY¢ý(U7s¿ÜÓè¹Dž«w©£ënBŠ¹ot;©ü“Dõï"ª(ºùö®×ÞC$œäÉänBÚ×æ$_5·èf¼ªM -˜\ÕrÈ@7ãÙÍ>+]=PêŽ7Ì¡²³øziNµ<ﲄ]½$‰Iz{òÌ‹àpá£L£.S¢5–ÿ|//=1Éy¢ë¾4pn"³µîÄz.ðUl®ÎãÎݨ=•ôvUl{»ðÖ©x¢Ò_Å“Ë•Ì.T<¹PXt ½­šÚ YÝj2ǽ·"ÿMå7OÅá›~_b{Ât8ÀÃÕR“_ýÆ]fŸ¨Ê=In|€Bn
+ËTzýC´ÿ+xâendstream
+endobj
+688 0 obj <<
+/Type /Page
+/Contents 689 0 R
+/Resources 687 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+690 0 obj <<
+/D [688 0 R /XYZ 124.802 740.998 null]
+>> endobj
+81 0 obj <<
+/D [688 0 R /XYZ 124.802 656.015 null]
+>> endobj
+85 0 obj <<
+/D [688 0 R /XYZ 124.802 520.675 null]
+>> endobj
+687 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F36 457 0 R /F36 457 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+693 0 obj <<
+/Length 1424
+/Filter /FlateDecode
+>>
+stream
+xÚµXßoã6 ~ï_¤Øà
+;ô†ÛÃ6 öpwŠ£$ÞR»g9Íõ¿Iɉ;m±ÝP –hòE‘Ÿèð‘|Ä…d‰/F±ôYš&£ìáÊmàÕ/WÜ©2`1ÇÙÀËYó,‰RÔùyqõîC2JY£Åš4«Ož2“YHïqÂ=UÕ8 ¼rmŸõ¤Ú*d“÷ÊG5 ª}V—ÕÔêV È7Û‰H<‡¢Öµ5Íޗůï>éÉž ~tÉä›â÷å_V±åtè³ •N-S»sXшs–†!*ÍD0Ÿ‡0ˆY’¤¤0XY€+\„Þ=ú¥Š•ªVàWZ¿‚p¯ê|‚Û4½µýÑŒ',px‹-ØÈ$rÁPÀÃÿVþ8å½2/( Æ
+Uå¬ò—©sØÂ3JÂVx MãZ;$•eeµBýbc%uiŸúkË_ûf«êf©&Ô之Ž B‹(9ž/Ž‡6"¢ØÅf«óÓù3XFŒMy„‰@¡„¶ŒƒŠŸòU“D϶+¸ZuÙ¯þ¦º‘©Ç ƒ$`m%¹ negæéôÚ¸¹À§C¶ùÕÊÁ%“²IÂ]O ªÈV±ªØ*>ª 3áïIg³!—¸w ÆgŸKòÎy_Û•!…# 
+Mž4¤|$£0À<è¦?
+-Á`“?aAjäŸPÐ=ˆb[Ot™!Ýâ« ’+Ì9i•öI¥„”{œPÝ=;CåÀ—H1[û†B‰…á-V$Ñ»‹
+`NÉŤsÕ+û ½V袽„JŒÒ¡ !¼­ý¡rŸ¾,Å8¬Jg¶ ‚í”ë
+驆.W}-´C¹H†Žâf<tSß &üXÀU„tH}Àët˜š¨pŽCbÅÃLaFiø ŽÑ]^
+™øyeçB šÀ
+endobj
+692 0 obj <<
+/Type /Page
+/Contents 693 0 R
+/Resources 691 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+694 0 obj <<
+/D [692 0 R /XYZ 124.802 740.998 null]
+>> endobj
+89 0 obj <<
+/D [692 0 R /XYZ 124.802 689.974 null]
+>> endobj
+691 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F36 457 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+697 0 obj <<
+/Length 2519
+/Filter /FlateDecode
+>>
+stream
+xÚ•kã¶ñ»…{ùX3âC¢Ø"@"é]€" b ®Dkk׺ÊÖž$ßÞþû̃ÔÃ’W,Ö¢†CÎp8oÉu r-•Y¬ÖÖĹl½?­âõ#Lýk%=Š6ZX‰o “[­2aS Ø(uˆóãnõÝÏÙÚ —êõî0w‡÷ÑÛ¢)î6[-eÔ72*`§Ñ Ëè3ŒÊúÒ"<‰ô@OU ¿{|-;ž;ðrý7–ÆgÄèÊúÌÓõ> l½UYTãäy#¿úÏý·<([fá 5"<,åM7ݬ; h‘p—ã¢CÞàïæÃî—õVጧ.IèÈ¥'ë¹Eä‡|ûhåç4͉€"³~xîyB$"ƒ?IßzhÍÏç#ËHÙèȦx(šv²ÖDŒùç™âÓ%ïpi}tŠ…C¼\•¨Àž3 W|ÆaÑðIÒã·¸t_ÒÑA.òÈ´J@n…˜B  ¹£´½„Œ=Üâ•,›d‰XA³h‹¯¹¨”Î8’C+6ÛÌÈh‡«áê^6[“ÂÝweUñð˜#3|z„¤t.œ¹'µóÀ™ªOà-o@çzdä ŽVð¾3unyUéŸAø8Îé¨ñä"ŸPõ}ö?!Îw?k5تv‚;`ƒ}Ú€@ñfÑQ[0öÈ°U*`Æ#ƒe›$†³Ëè‚<¨4È.9¿°öizÓõ¢m=gáxÃÙàõDBzá—{Âðè—–V­€–²!ʾö
+ó¥c
+yUþÐ K
+¡jßy‡îìFàØáÞI/„kïkyš¬Ò ¶ƒ°% D8k5µF…tÅ#ä¤äoMŸ.$€r0E¸·<ñ4z+¥çcì)þ¯
+Þö½Ýën0Àš‡ŸËºÊ»þ\Sc —`à‚1(:£—ma1¢>öbÞ-„‡>Z¢;1 $'Âͽ¨ e!a.x+/i‚OL;öÆ·!È¢’.¤ñÒÅ]ÎUqSMõ²VYÔ®mË&J<ÖÕ¥O2UfÉ
+ðIÙ å‡a@HuC””:±
+1õÍßœ‹ïëûhï?|±GKù›Yx•±ilýBôFBíŽ! ’¥úL‹‚Ëà&8áõ,’«ÄˆÄê‰w8h”^(ä˜àh\|€³ØŒ±±àŸ.š:ñC?lrœÂ6B†ÕZ2˜'Þ]“ÙÕJO÷F¢7Õ‡«Ϥ6úc“i" >`ŸŸy0)àýÐ䣷ž[£Æiã­ÞHrä!ÁwÖ‹å„í…R€ü¾*æZ£2-RgüåÏóôË-ƒz<Pê¸'õ¤»Öq&b(Û&¶]õÀœ¢àÔGwǦ(vMIÖÓÎÈ;+@†¿×"ð¼5²‚Zýw\´úi7”‹ ØB–&‚n[H<¡\ü´³Jj¯S#¨Ô P¼EÅ•©HÖÏ«÷ëñú
+«b}‹M˯ ö<£æ—Ž¨ ’„œŒI™EQòä«ÔÚÛ²ƒ¬$*Ë-z~^~Áùùüâ½°(àìÌ%Sb8™ÑÔ«¦ý5^'µñ ›H8–°§„Òýä¨É5kvIÔp pfádö;îç(_›„"œ‘)9d0Z)HA}îD/›ÑŽó¾} ®T*%
+àPqF5¿ˆÛ—À>µ&¡æùIBi=T0žVØÕ[HyNºoU(¬§ãì1ë…=®Èñ>o´CÞ¸Xóª¡ÃC)m[¨
+endobj
+696 0 obj <<
+/Type /Page
+/Contents 697 0 R
+/Resources 695 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+698 0 obj <<
+/D [696 0 R /XYZ 124.802 740.998 null]
+>> endobj
+695 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+701 0 obj <<
+/Length 2124
+/Filter /FlateDecode
+>>
+stream
+xÚX[oãÆ~ׯà[e`5™û¥š&Ú"¨Ñ>$JK´Å]®èRÔ:þ÷ùÎÌð"‘ö.kRgÎý6çPÿD!¤fžËÂiÎBðÅþó†O8úûFd¥s‚~­î¤Ì+Wì„°,p;GºEÖ,xYI8ÿ/¨šñB[ P^ì"g¦xÙüZü΋NÆÿÁ‹lv!0)¤ îXpÜÛâóf§%3"X?ƒ6›ãÌ[+T¡Ò:GÀÍæß($œ’²œ)g®¹0g<Uì”gNJ®
+wÜàHX+­ÚVƒ)äÔ6ãä’nRdZzÆ2-ŸŸñ·kãߺì«t6u”º¯ÛLÐâçczöÑK4«$_¿&Áâœã˜•žz¬)I]Xx‹$+êòS4‹Ð<ø6Õ"0^b°Ú)¼™˜R$–äý†Y¡½ôç)‹
+T%™0N‡šJÒºnmðØè
+é˜\­mj6Á+ºé„æ–¸­k9bîFTÚtGÜjÜÕÆÐçÈϦqÃó4Žµ6÷Þ4~¬NRÿªS‡[ pû²É¯unsqBXŽ¿<0ÆY‘ÈpßÓå„FøYo¥Ûë?H cn\ªR¯'aOUºÅvQBÁÇÂìmÿë„=ÿª€Œ¢orQ? ïòÑÈV£„.¶\
+#(/¤DUh¥
+ „ÚËX>#Œ>xíM¬©5%Öo%è z!0‰£@¦
+¬x
+¤z¬½¶Ãv%¥ŠKnI‰‘Ìj0šxì"&P²aBwR{ú€½MÅÂCâj‰áÕ˜3DѬÇrXX¸®#0‘ JÃncýÛæ ‚A /±RZï¬^©¥¨ø óÆqEM`MÁŒF[ô€E7"^—L
+ö/óuzX`Qo_Y`ÿÙöõ¾šÝâe®Œñ’Œ…/ÚT<Ø0ž‡á@Ä©»Ìƒ!ŽãTå='Þç™çì.' í ©š‰¬Óå5.Ïç̧}¼ZÇÔ¶©'¶r çƒD‹<{µHiÂ~˜ˆâMó}¶]¤ ²MH×» AF'eÄîf4¹‡fÌgmšÁ«.ÞÝD>œÜ²9’<œP%…2öãörΛ{$·Á‡KMcKž‹È\pãdG¢è²Œ•]6|Vˆ†® wi
+endobj
+700 0 obj <<
+/Type /Page
+/Contents 701 0 R
+/Resources 699 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 682 0 R
+>> endobj
+702 0 obj <<
+/D [700 0 R /XYZ 124.802 740.998 null]
+>> endobj
+699 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+705 0 obj <<
+/Length 1990
+/Filter /FlateDecode
+>>
+stream
+xÚ½ÙŽã6òÝ_!t^lŒÍˆ—Dí`€˜]$À^hûäA¶änMdÉ#ÉÓ3¿u²Ý’7‚, ‘Åb±îÃ2ŠáOFRáb¥&Yæ¢ýqGOpô·…ô(Úh‘JÜÍn”Ê„Ói´‘±Yœ\#½F6"s*rq>Fjµˆ#£ÑÀ8Ú0^,lô²ø)ú%Ž
+8ýþ?,dý}aRa¬–&’©ˆ•´2:.”ŒÖ‘Î8å¢úÒRÈÌ8 °éÕzñ¸Ø8‘j‰’ŠÌ
+›Æðòqž·GTÑfD­SGÄgdo44Ûùß—’±™T¸°° §ün»øú¯.ÊD–èh{ ÔmñÓò±ZÉe³/W ¹l ¹ü´RnYv_ä–uÕ
+ ¥c, €ˆûq9üÖÕ¯¤¼ñnËß‘3ÜœÎ,®‰J {b µPvtRÉÕÈêðLà˃n‰¶ñotí0…½Ø ‰w-Ôe”]æü9_ U5šÁm‡ß$`uåϱ´å9ÐDhn<x©@9…8±œ“NPW´ö$W‡dòÊ“¹r1±Ú¤ évÔaó‚¨t~Ñ6l¢kIÙÀù®okR1êJT ¾6
+ˆ^3±”õ5G-Ñ/Š›‡N”¡‡3‡Â½[5!£U%Ä€…d5F5e/ë–(ø¶¶œ#‰#<)(xüf‡¬~¹°.êœÂ©y⃼a3_»”tZèXzÇúñ^NÂB]O2÷ie1ÑT\Ê@¾`6 L†¬ÂÓÕì ¤LÈô&õBè’ }¡ªk\¥>ŽçÍDGcųç„r¦JÅ`ÎØ»ä•.<(ŠÀ8&÷Ô(À}K2áš³Ê)/Õ!C¤.·Ï•|Ó/¶«y?“‚-–´š½Ÿüà/w³6+ 4+4m|Ê»¢Y-”¦|Ù>we¹#‚‘Pý7_afèχCõ™±ú|ÝïÖý>ä—òó©ã“‚ÞqPc¦¸­/}_=5>=}óÕúáòë¯Àëogôò8€Ÿ?4CÙa<Î!¡›¶U3xVª½h‡{ˆÞŸêZ_ ¤ ïiÊ&;ìãy´!³Æv §ü®H¯pA¡»ß‹»÷Ê¿#Ü÷má% z{ÿñœ‡â¼¦K
+¥nn>´Á4ÈÒùf„áUˆÁïf XH.ëmÜÐÛÿ6½ôR|^Ñóü¡Âü|Ê;ÒÅÕ @/P£ÒöeÇK y÷™¦|7Ãû=lïiïä×úæ=–Ð+ò͔ݛ;¬=¼õ)qj£`Ð-Œ kheS@D¿$k˜õœ¾©Ý[LVc¶kìyh@8æÈIup%N§É3ÀÍÌxŒãUl,;&KEÁB­ð{Ù²Ú®,<¬ñ<
+‹¾&ò®®Êγ˜3pjvö+ =í«1º¡Ù dÕ¥yà S-Ï¢Ø"!ˆ"ÅXlšú¡Ì †ÆŒ'jo<Åê‹ãÚ§à)oó8ŒKêp1ç¶ôo°û
+ü¦¾ƒ½Í„³}YYø1óÜö94¿·VKRáTh"wí粟:G&Lªƒ?æÄ+ðñ+EÕ“-Šöò;FD8w\Í Ð¢Ñh†Kî0á˜:v­ÿZph©c¼žaÊç0ßmÊ”S"ÙþhSö§”•)×~šƒØµI2÷+«L·ÿã§0e_S–iB¿ÍÞürû_wVYˆendstream
+endobj
+704 0 obj <<
+/Type /Page
+/Contents 705 0 R
+/Resources 703 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+706 0 obj <<
+/D [704 0 R /XYZ 124.802 740.998 null]
+>> endobj
+703 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F23 440 0 R /F11 615 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+710 0 obj <<
+/Length 1749
+/Filter /FlateDecode
+>>
+stream
+xÚ¥XK¯ÚFÞó+ܬ@Š'óöL£.µ©©J£°K²0`)à0¥ù÷ýÎÌؘk ·ª¢ÛgÎcÎë;3ˆŒãŸÈ„ÔÌq™š3ï]6ߎxöK¿DbQZ±BÐוż]Å sÖÏ«éèÅk—yæ­Ê¦ËÀ9]|ŸVëùDºñj’+¥Æ‹ê#z7ãê@=nVU\šOrPwÄÜTûH«—ñÙ1=¬çÍÒû*J—­ÐV‰6¯Hy(¢×ÇÊz¼‡À0¯iG‹´¼_—ôùyS±É§é›LhæµÎr!˜7&xõûn’k-Çõ~A®$#Z‹qSÓŽÒ&KræYƒ ´ò€òbßJ>Ýb¯«@€Å¯•?GR͸÷)ž‹}yš®öU5¥mb‡(Ñ ½wÌ™ø—­Ý¼Y×iË[ÚÓñÐįÙ$—E´šåÒÌxsáiyü¼m“Bòf|ZCe³Š%=tL^¹ÁÂ&Ò‡¡'Â0¡lÏ“?C ª Q*1²InaºZ¢î%Ì)EÁjt6Q’¯M½-›õ¼Ül¾Eê1æ8Éž£ 7 É,Ê7úkƒ± òcó2©UòFvé E2úuznÔ‹ÃÃh/ú ô¸‘$!6Yh ~´ÚZT°o¤¦;8|䆎ËåúŸÈ´Aüë–3m/’IÞξL;v8ÎJ’yž(T.Dœõ‰2'
+ý½ êùEÜHu¹ßק¸z6Ë¡9ïÓg‘~©Í<® Fq„ül9zVíˆÓËA!i¦§à‰ÀùóŽÊX¸ña½›_i7m=õ„µ<!$1¢È¨À$¿lcyfWŽù{ª #Ái¨Žñ_MÝSG(ôüà& ׄ`±<…pVÇ×[ñ³ýßû8ŒÏy½©÷©ëoÜÙ\7ÔššXIŽ›¨—¨©£€[ýu"µ­˜ñ* Þß=JS÷4=D´ m»¦.þËÈÛa)-•ÇMÚÄúkõú‰;º8–íË- •*ƵÈóüÌ[î~Í7epáðã ÝSƒ[0Ì”ÿÝð‡ªA“Vóæ—jIQxû
+¾2 ×ç]–ݤ¨nç@dŒ¿—:É™-¾—º]õh8³¦)ª6ây#Ÿ7ªËMS%ÌFê~ˆoh×Ó•mtqdÓvÅpB‹6ݬÚÅ·õ°bE"äž|Òw –F@LÏ׬+c‚ŒL[¢ÑRá‘‘3“F²O<[`õ þ¾ŒÏþåÞ3)¤¡™[0_ptÙv”kÉŒðÖõ¨›QŽ.tÖ
+•)ÁÎ&¯(،ް!Q()iè©Â\jmiO|pA(¤ä
+Ô0iL†Š,1¨¤Ù œÎ¥„•`txµN¨°!8w eIc Ë5g¯oö,cºsÎg–YÇÑ­7œÓä\»Žo3Z^€ðÌKƒ~îÐôÜ+(Ø{ ,˸(îåãÉ•jí‡Ç%•tt*>dH[,€sÊz‘¼¡ŽÖÏM/á=êŠRηX±âã° /ÜJËiñž[»j I8?K]pé±Æ×í¥uûƒíµ¢æ8Žñ¼(nš ëî æNsI´gîÌEŽIfÔÕhÆÕ»æ·ÃyF´$Ó(\wÃ`bpO²8ô0 U´ÂïΪcÎØ8°iøÝQ]ÒiQ™Ã¥‘&œ–4Îv‘Ú^ŸµÙ—ÝÔ‰ãi›^¼ãi?>„óÑ·È?£jz/£¾=]M®kAÄËt  ÒÍ•ÞÏÍHT: r0¼Á-†nži»½;Ïå1»Ý1ÎOÛxáãÁ´( s¦«”–¾øþ´Ü^Ž /0(Wƒq‘8ïÌ‹B1Ïq¦Ê-JÖÑäCí(Ì@ç€B*&•22@{Á¬( x±c`²3d ¦…E޵ʨ²”
+ø i)¸-/qÂàK
+endobj
+709 0 obj <<
+/Type /Page
+/Contents 710 0 R
+/Resources 708 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+711 0 obj <<
+/D [709 0 R /XYZ 124.802 740.998 null]
+>> endobj
+708 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+714 0 obj <<
+/Length 1676
+/Filter /FlateDecode
+>>
+stream
+xÚíËnÛFðί`{¢
+#!9ï×ÎÌJäþD.¤fžËÜiÎBðù|•ñüP¿e"‘(­˜øuY*陳^@ Hsy•½zãóÀ‚UùÕM¤¼Z|*þžy]Ô³R)]Ìg¥(ª?dQµküìñKëàÒ#}6ã/³ÏWï²×W;¥Î² òR
+Í´4‡f=6O³àe.¹E¢oùN€aðàŠEŸ&(‘Dəɷ٧ü3Ï€~ÿ¾d‚ç¿g¥aJåóÒzf¼ç"_e¥°Ìm PL*edÞfÆ1g„²y ê”õ`gØÛìc&³“&„–U‚¸â" ™‘À‘]0åŒÏÁ-5ÀNxQ $CYȆ±L(§=Žy` ¹B#¹CyäHïdîd‘[žð¢Às.>a$¸"XG°€xŠV«‚*)•ǼDØ2»Ì¾e%pZ¥ + W›`BÃ'Àµ‚
+OoàEH¦uŽê€ƒªn*A@I(›‰¢‰Å÷ÓTU Ñ
+þb²fÜh¦ .™å
+¼X I¹£œc‚&Ê’HMôçãA‰¥
+û°?Aú $Ä£¼~î½ïñ`l/àdYŒË}xõF…=©– 7$ú.ˆŠawÑ(¥+úfwÞ¸-š5>]QÅ(¯MÕ¶ðx xßݸXM°÷ý0.Ëé|‹b=&Ð,&úDÜŸ(¶ô}MFl
+ï ²m ='µ!x€=%¨¯›nñW³n®Ûúë/'¥â³Þ$j¤ÖºxÛ‘‚q‰¬›ùº¾ OĤæ½M· ‚¤Ø`–¼õI‹÷’Z<·Ìèðã/ ‡µxë ¹ûÓŸÿïðÿÙßLUu¾Ãc„­„C‰qYeÆ3Î1‘;X»‡ar­HÉM¼0lï\Z“{ )âÖFw¥±„ϵwjׇǠL¼åž¹´5¸?¯,¢ýK”=ÖEŒGš`'”<¸§4!ú%~mOTç®]KL÷ж΄0!ŸÓµ~2†{ÞÒ®j¸óOh#üËÔúF¼Òè‰÷pÖ;šõ"ˆÍúišÊ
+ ß‘°¹F5Õðp´¹XÊØ Eþ4Æie˜V$Øšń]Lé‚ç!åâ°®8L>ÖªgîŽý™Ín¬VèÝæ KH˜YNÖUÜI•£ðA8pQÙo°€ Gðà´ô2o«u¤®£'t´qvh ô²äõên|¸ìïOí…ÒÐê`Ó‚ô×îÌÑ{™4g"ßïÇÊ¥»¶£@GGG,´‚û•éZ8åÚ…«ênwrAVÆŠVÓ›6ÏøÖõø”Å nÖÕª¿œæÅ[,„Ç­šØd¼—mÐ
+êG=ö9„7‰xLÂÆêkÚÚñ‹¶|?ÜUóIÃ<]ýpf¡n:ZZ§Õ›–O\[¡ØñX((bðÜP¯Eó7-Ð
+|RG‹"n±‚<ß_‡à¡[ ЦC7Æ›†¼Žb1Χj;¸Ž¬ID¬;ÛtT<ÔSÔÑÔí²î‚ÔžºšlX§.9¤ß]b¾RÍ¡M¿²,¦ËμjÓ®ŸN‡¢0õûØaž6óBÑû–´»´ ¥éd¯/¡³×kcà%œûMIÀ&⦜žÒ=-°Áä8úê_=…>6endstream
+endobj
+713 0 obj <<
+/Type /Page
+/Contents 714 0 R
+/Resources 712 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+715 0 obj <<
+/D [713 0 R /XYZ 124.802 740.998 null]
+>> endobj
+93 0 obj <<
+/D [713 0 R /XYZ 124.802 217.918 null]
+>> endobj
+712 0 obj <<
+/Font << /F8 453 0 R /F8 453 0 R /F39 504 0 R /F36 457 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+718 0 obj <<
+/Length 2779
+/Filter /FlateDecode
+>>
+stream
+xÚ­YëoÜÆÿ®¿â -Ð1Ü_.Ø)äÀA ·€~Hƒ"÷ttx¤Bò|RÿúÎc—#åÆHaÀ·ÜÇìÌì<~3›
+GÞy»€þÀ‹ýV&0 ÿ5<Q“÷‘*é@3 o`W$½ó¡ÌñÐÉf­±ävЕ…±÷7{w•ðÜr Ê
+ÏV‚ò ÒRVu Ì ~_ööÔ(ƒ£Awg=>wk:v´ÖÍ3nXà’òzKÙY GEô–ÁpêÆ š9d»­µ.Ã}ô˜Ô»<Ÿ &Àÿ•¶"ŽÖãÒ)ïéaÜ2| _ AKŠÛ¤ Ž¿ ¬’#ïŸq©~àã¤)Ür?>íH²lðjËîÝa >•%Ê“ëËÔ{(gÖ8›qàªS)Ž«¬ëy„´³6;š~ЊÝOAÎs@‰äëÛÓ` ¾)/Q)ì}Ž“S¨±+¥ãˆX¯h¥tM³tßybš§¿…3ÇÊ—Ò9;è0JBzòŒMnÊk@ïå>9³ËQ BÓSY?+&‘ —Ψ·rFdxú,{þ=Ð 5­=7è„–(È[®ðe²î,ÿ³„oÓõ2å„~˜ ­m©«ÿŒ17Á7fVG˜jüzæu†œªw*‰Á"ÁêíáÒýv|´‚
+2ú\bfDgÉØþ <;½Ö=¯õããüŠnf:—SÐqZþ53Ÿ@ÊÄ#¬
+•õppúÃéòȉK« öKŒÌ[¾F.¯nïFðlñNxÖJüað< ç©nP–î´G—ÖÈÎs€(-
+©nâûäñÑ:¥ð^ƒýŒÌ#µ¡ÈTðãL!@jÈ&Uso8.1nkѦ²ûjÍÆÁ—ƒDÚ½|ƒ;tÈù RMƒïÝ;o•à­§ÎAü"À„ƒÂÜ£ÊúÁÖ3àƒ@–S–DϧüOáCÄ3œº¶éx'e-t.%7xâlYà;Îõ9¿ßó$Ãêç/JØ!kbqi2ýXЛEÀDp`F?6-O¡—VÕ7ádc+K¤hX +
+.JìWuõãÕ?Z‘/Õ$L$Ë(Ñ[hmaµB·óH™³ê
+‚}‡nIZ§¾ôï#‘ôãÈí¼Y­
+»oƒf£QkÜB‚ÑPm¯²&%ùû5ª'ß½Í\O„¬~ìãüU4T'v’`ÎUéàè‘°­ìõŠE»ÊÎ?b:\[ƒS¡¯.rüÔ”„ãøÝ6Qèò M@vŒc§‰— n°¹"NÎ[Ô¼
+¸qJF¾†ð¼;VAøÿq³‡³(DÞÏQœkÒî"ñŽ¯ÁC(*¢¾±UÐ <o³ýiö`0O!FÚ{l.¿q‹ŽQ@X¦Ê8Dç<y&ò$ÒÜVŠšØ»°e ¥ilÿ:F3“}ÙÜðËú¼ÛÁOg ü Uat—?ç¡M»]±ô£@L*ä@{w¥{PZµ$Ѥ~·KÌ) (’×HŽ³\“q¿˜gédc½ÁÞ<d1ÃéTÛ &˜Å½NS/÷¹&Î]¦&:OxkÇ fB‹Øìê
+vSG*HǮb
+ÊCÛ/òæ·â¾?3AÁ›jÜ~°íÂó¡qÃY÷ýä@²?Xk<=g 0)Hg*8fu‰õΩ¢ ãÊd-¥g²ÎEH¿`»øW/pynª &¿ø»7Áø0#7v\¦3>nR±f84éóè3c^NúòŠ¯ÈðÒµŠo^©±ÅŒHo,sõÜ'°ÓA#(}'Ñ°ó—xÐÙSúq¨Öþj.À’XÙTerIZÄpLÅó¿Äÿ¸7à°endstream
+endobj
+717 0 obj <<
+/Type /Page
+/Contents 718 0 R
+/Resources 716 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+719 0 obj <<
+/D [717 0 R /XYZ 124.802 740.998 null]
+>> endobj
+716 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+722 0 obj <<
+/Length 2751
+/Filter /FlateDecode
+>>
+stream
+xÚÝÛnÛFöÝ_!Èh+Ë!‡·)‚,’núP£Ñ>´E@Q”ÍT"jdÙ@>~Ïm(Þ”
+g#› »»
+8b
+
+ÄGQ®x5åÅ’¸Ý¶A*Q»¹ËÏÐýdDz$ë%èøÎŒU¾"¬' ‰ Â
+©ÐÔ‰úö-jÆZÂ9iå–…c[äUiȒ˃Pm*þf  Ö$C“bîdrG2ÉkÖyFÓÇöJ2áã¯,€Cßkœj‰_âð9Ž.m±gäÈ-8Sgl¹&,&5yÏ–«¶YïYĈƒ$
+ŽT0ç¿ù›CÎwã‘iM[bÓ·Â<µ1ÿozJÏßÒŽw‹)×-»&õmŠ[›±œ®RŽ ¹èiÍümùÐB—_¼Àï‡'Cq\³0ÿU­Zw½!½¥{¾|OšH;ÁäŠiÇóu›·)m¦÷ÂÚfm¶$½!AÖÝ©©vù²jöÉ0§WC’§]Kf’7äNf[ñæUM盩!©ìš9;€“¸ÍÓ鉣Ž¦¦ÜX7€Ï¬c¿%u¬ÍÛö5Ó¼lœl”—ºC6óÒ½¤6oÛ";Þb9ã;ž’Õñ@ç@У<€¾”‡%›ÿ8~Ðègãú) îRV)ŸãðsÄsÏ(*ìØY(J
+}ü´@?‡Žž¡|Z çÙ!!=‹êÂu¡<'‚šµ%—|CÌϤè/ u-„¢æ¡ØSÀ_4¼?³ydÊw|Ë¡pÅ ­Ø¦^@°ëNY÷[J6 ÉåÒJtºzè¤>ú-cžRÐtq}Á‚‘e—ȼ!Ò½švp²t²‚‚“Ê”ôò orN˜D*WÓV©:˜6„Z†Ð „m™®‹‘œÝ/oˆ†|/XUpNÂ\Q.w]¼¼iÊy/„ÎÂU¶JúÏî
+%ƒ“câJZËVY„\Uá
+"[™A­;5OÌËR{´°¸Zçï%Îg–‚`önN1¤a¬ªù>¸Ø™/4@¾¦|b©°ð5 ØÜ…c2 Ø´éníþ~òrðx/H„<£Æ)\Œû)s
+¸ÃGÊá å-€è×ü5ö†¾ÚÚv‡û–·É"’ƒ¨cuN7ñ­MoîG1™ž%r ¶)–ø8Þ„\ÇŠÃ_-Å3æ¿…Ÿ¨Æ9ð¨øÊzY葘ÂK­$`íŒ92 DÈðv‡hÊòkƒÄ•n ˜-œ½F.(jÏP CøÑ¿p b…îtç¼ÀYZ~'šst•&uCD*pHÎÐþ ¨¬–‡Ìz„è,XÁ-Hñ¾ AÝW=ͧŒ@~ Ol¬V×s–6¬±¹
+,>}á`K-Žv¬T’/ÝNNY'ÐŒïÁçüè‚xïçAˆU ^¹—«j93¦X¶çVHaŠîl|늯«þ5¾ÿôRfè„n
+
+£àæäÿYlè§cæö_“[
+endobj
+721 0 obj <<
+/Type /Page
+/Contents 722 0 R
+/Resources 720 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+723 0 obj <<
+/D [721 0 R /XYZ 124.802 740.998 null]
+>> endobj
+724 0 obj <<
+/D [721 0 R /XYZ 260.737 400.475 null]
+>> endobj
+720 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+727 0 obj <<
+/Length 2351
+/Filter /FlateDecode
+>>
+stream
+xÚÅYmoÛFþî_!Èhj¥-¹|wàƒ‘ .R´HŠÁ¹À Ä•µD*$eÙgø¿ß¼,)R¤“kïCaÀ»ÜyæegWÎȆ?gäHOD¶…ž-â8-·göè¦~>s ‰ë¹"tðk`ræJ)ÂZàÄHòr~öÓµbîh¾"ÊyúÑJ‹äp]$[•¾-®õfí⵬&ŽuóoÛ·3ø缘|šÿ fŽ#bߧ…z5™ùÒ·>gù!ãn&Êýâ‚h[xÓY€;odšsCôÈÿ¸Ç¬³0 …+=´?²ûMmóBÿG¥ï’j]žÊ˼:‹T–¦jEÓ?]GG4<áE.P†"°c¢œ¯Õd&½ÈZNfŽ•l
+7òÑ@_Î>~²G)Øò—3[¸`õômáÄñh{æ
+ÇÌ×æìýÙï +Ÿ$¶G}o“ÏY
+)Y]q»ƒ&´ò’¦ô•$µc  g"Ð×ø+IS˜Ò•Î³ cAßh
+8®@…6ôÕšH&3×õ@$äø€®µ¦;##N/H,EgL”னJù lÀíZq'‡%¾oç⚊­Mh{Ã~_ªB°›z"ö¼ÑL¢§x$篪úàᶕ ¨îú±UV{”â¡oÿô Ü™:¼Ìï{.æ:`jihŒ'Ó%³&ùë²QƵ…Ñ)Œ z«7IÁ„¶µ†@^ÔL
+·Ðˆí-QE†Š]Æ—à`2¶öÛy½uT@´:n¤7+Î$Úd2 f&N*äR(R›]í‰' èH‹ÙÅd»¢ÍÖëÐkZ
+¦¸Ã¢»å
+È|Š7™ Ó/ÕÀž§kÞ.°¥Ze(Þiv¼=M«W9îUBÙ*Þ
+î³”dJyÕ’‹ Ó
+¥CÔG“)TIR'ÅÀA™‡Ú'„ïúCB|t²ØœåÕyí‘7e-!67­ú»©),tÏœ^ÇœY^=gWÚ¶eו®;ö,ÈÛ]“É/.étKî)š(„“)· ––<n.Ð^²bÉ Fì;§ü²g¤ÔŸÕÌDÁ«<mÙ÷4T^! &ØŸ+Õ@µç3»ÀS†’ÐÅi†a Æéü¬˜6¾yu®)¦Õ§K3OÙ‚ÁËY"2E‹òv"!!ùþFÝçñ”%1mÖ¥h\'ÿ© -VµZÈWgŠ¢…Y“c¥UG
+½¯ÿèàÚ½°a™{ÿÝ>y›endstream
+endobj
+726 0 obj <<
+/Type /Page
+/Contents 727 0 R
+/Resources 725 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 707 0 R
+>> endobj
+728 0 obj <<
+/D [726 0 R /XYZ 124.802 740.998 null]
+>> endobj
+729 0 obj <<
+/D [726 0 R /XYZ 284.273 154.468 null]
+>> endobj
+725 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+732 0 obj <<
+/Length 2935
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ÛŽœÈõ}¾¢µ/¡%w-UØJ$;ZGY)òF%‘vWÓÐÓ¬iíûës.UP4ÌÌF+K:÷#7!ü“©´HCµ1:Y–nö§›ps[»‘öH¤#a$ÎV6wn"M2<óîöæû÷é&Ymntò¶ø9x¨¶2Øow2Î0êÊíN'Q÷ø«ƒœ§°•wOÚÿGX-ù\{·ÝÅqð¯
+Î<´
+»×ào´MÉ ÈB\Žvø ÷ÎùPµðŠæMÁç‘f<¾oO¸b9eÏ‹#°c^ÃÆ'Èž*¿oXd$î81hÚ}Âœ,KbiR†(Š‚/H®oÛñ¡9
+T„g]YWF7í>iÊÏ(Zr=à¯á…[··‡µ¡;.ùÁ/ÖЈüFK.±Xæ ¯àsšŒøÆšª‚}Î
+Œ³ÈÓÛâÉ(›¼¹¯íê aûgèíZ;¶ H˜QÁßö¡q{èIÓcòÐó=æÞ7 ?G§—?¸MrEp{pXõãÉö°Bª lQœzÎÐѨŠ
+=É¡‰óöäòÎåŠËNÀÖGŸ½æñ! §Êí£N+a#‘QÏ8~â<
+ñ‘*Jä@ãXYÌQ¾#c(9ÔqQœôI…QÙ˜wÊQ÷@‹ ùä‹ŽcL(…ºÊÐ<—žQŠdLkšòò®}\ñ*UŽgk¶­!¬P€ï‡
+é»?Wý‘òˆ­¥Çý9<ÖbD©ÄÛX–¯Á&)—ÖÉ”ßÁý}Û5e×óFÎYÚfg@ËL<£µ£ÀÓ³µIü,ÀSS­Ehœ
+vwÛtœ¸póÃí˜Í&J$†‚v9˜ÂdöóÍÏ¿†›ßoBAŠ|q(d–mN7‘žÕ7ÿºùç”5ÃNÂ93åÃ>..!BÛÔ‘OçžÑ†lz´À‰å/K%T"Í\BÚŒ5–Ê*Ñýq«2´m
+žó,µçEÒ`,sÜ‚7l´_K¯·¡òÒk€½tZŠT»So
+ ßµ»Ã’'œ',Ô"aÂé2Œ)ó+@TQ(OV< ]ï‚åã%ªà
+eBIjsFXø²¹Pa}vöþÈ¢øaLÌ!V‰ž®ó~XK6‘y—-±èÎfù=¯°“ªµõ¨qi¶¼[T.)›~ÖGXqAF€[++×r)È_JÈ 
+ò$€;Ùóp Kü„reÆo¹}Ô; Î Ö<îÒŽŒHFK9©µmÙ‹»WŽ‹±ËBf.ŠöGxë²VæÇF‘¶X“ 9N¸DÉÅcLö¡E"»ªc_§g<­’$S£†l;c aˆJÉDÛØšN= æ gµÜv€ËÜeäÁ…¼.‘N½¦vŠÑˆ+Š•„ñs&Žì_Z9T
+B¦ m‰Lþ K
+‚À[ïÀ©q#U¼ÕS6} Oî¨<^íà?<E'é[O"d,gÌC¿¾okÌ WEÙgÑ©ï<^Úœ`Žî›•¼ôÜLd,Hð#°gdB²Q&ÏàÂËÄ”ÍÓ\¡· ™=–ÌhXQ¼uòP™ígðë1¡·•ÁôÒòÊ<ì~\^Yc0Ô»`Ào–›Í{•)áÛ‚G£þš²Õ&‚ÿÓÀ+ýpF¾å™KØaH ÈW5OGÏãvð¾pÀŠ¼þÎBßxdâŠ<:2¸Û¶ŽŸ×lý05ú¼å¼¸z¨?¶çÚ³ëiþD?c÷ÏëKЊÿ
+œFfþ'#ÿ'yçendstream
+endobj
+731 0 obj <<
+/Type /Page
+/Contents 732 0 R
+/Resources 730 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+>> endobj
+733 0 obj <<
+/D [731 0 R /XYZ 124.802 740.998 null]
+>> endobj
+730 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F32 450 0 R /F11 615 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+737 0 obj <<
+/Length 2770
+/Filter /FlateDecode
+>>
+stream
+xÚÅZKã6¾÷¯hô%2ÐæŠ/=²È!$›ä2XL9d‚D¶å¶²¶Ô‘äñ4¿õ %ª%÷dw²X 0¦HªXU¬úê¡–·1ü“·R‘Åê65±Èóìv{º‰oaé7ÒmÑF‹TâÓÂâÚ¯Â@dIŽ{Þ<Üüí[ÜJ#´Inö´÷a÷SdWk)•¾^Éh÷a•è¨¨·%LF»ÕZ§6j`á †2¢Ù¶è+˜iênõóÃLTŠÜZ&ºVZdÒ0i¥£ÿ®‡‡)”Å †G¤R‡mñ¤ºö·8lZwPv›‹<Ñî™ åtÌálŽIMTøA¿RitY© ا 8û D;œ´Qï70u®Ž+b…èÔüÛlVkk£ßVNxàˆ©UýÁ‰°¥b Ú•N±§˜PQÑl~›
+›^âTªs‡š0±AÑoÓî¼þZžqL›ÝÔë±l·Í‰DãÜt@à™:ªeWÖ RbÓè͹gj$gv[èd2`Âä;ŽØÉù½p©º
+þ¡cIëS‰’è½Ôfb<¤¾âx:Hò™i‘ÝÕ¼†jTIFj£ggOå¶&UL2
+àâËM¡á<êGÿpo‘ÿÓŽÓÉ!l(úòø¼pAOè>çÇG6XíL™I3¹ì­åç¦.ypñ~^mQ•œUÎf(Bá½E9¾ðÝ®á¹çñˆž3aìn[[µåïgÄÙ–lÏj¼'œw'£>–¼BpÌ«ì$´ ¯³ö®BÈ ¨ ¦cc}»ÊÐ,yw×G̲Ç!û–~Ñ*v¥ÛH*Bò-)¹è{Y/HS°èè([ùGžùÕ!p>⪎…L¬ÃÕÍ v­PÚ-~qï¯Åã Sñ5öõÄÛÍ7c„.3‰Ü¦BKá—ÁXZaŒâ@ÍA8ã3S——7ÍG±yÛxÓ— Ÿ…ˆYðO_BH„ØFãVJØ{åßçE˜LC4€¨1¤›Xš“Báq®g®†ó.6`ˆæý—©±Â–Ö{{°3Ü[7¼ƒCÇñŒ¸l³8ú¾çù¦>>óèÔÐ…’‡½¥)…!
+Ló°Mg¥~Àüý¥6Êÿ$>÷  —§£ë¼”Û$"³ˆôûÍO?Ç·;û‡›Xh(=/0†
+àqºÑBB±ÃOÇ›w7ÿ«QXÉ?¡PÂL¨áR“Àë &NÙâÄgUå£Ï{qrÛ´-§åO”?“ îÈÈùuÊ1 ÿpš=D˜yÕb玅;r“¢ VÌÕ»Ns¡^\ Zh2Á÷3Õœý7jÎédÞÀÕ#ÖÂGL&qÔÿò >ÕÈô3&ØŒ0ÉÊ1*'Ÿ,Ú‚sä _¹¼ÿÕ¼òH\¡+Dÿ=¡Š}Éãʼ—½ãÄ—¿j1yç`– )W¨vªm`/±EV¥VÕp“ªö4ç>¬¡,2Œ¦8âäbªX©¤”æºI•‹’‹ÿã«X(™~DIYÇB,÷4×À™1_¢}t5ç1Õ§Éáªð…n,ø§Ž²§RdfËjŒs)û U¿²UU¦1É$„z8…5°ù¥HÈ»äصÅåíR“Ô’eƒÝP¨-¥†6Ó¥—÷kFM2ˆö?¾Þ%9Àuâ…¯©g­n|Ö‰Ü3Àáüî¨ÄFý^ÜÂÁwŒ XRéÔ“^–àÜ¿œš‚H˜e ­!wN?;f¢âÙ)Nþ‡•ÌƒäIr«
+WBÇÁgl³|7Hè¯Ôu~½¶¹¹âÚ9ì‰KÖ ö—{ëü
+Ýç¥ÑXHc>º4ùU'Öòó‹áQ9èËwž½»^ •¸ñþW~|reðîãýî×îîie|þ³yÁÔØÆ‘9ç¡À$ôðygüJ?}§tûîñKL¦®&ª¸v©¨Ž€QPP!µ!Œ7<1TO}@éÓ]͵ÊCÏÊuD:s6Þ¾Ðñòð=#÷¼© §èÜz?”k'Þ„I¿äó0¨É¯rùIçÍå5ÍpSHËèG²îzá3
+w[4ÿ‚?¸Žç“«&¡¤ï…6€cþÂÂo\UÖ ‰ýÈRK!ø¢Á=NúTàmm ™ç€·éèì‰_î|w÷Ù$ñÞ £%ð˜JÿzX‘(ä>ˆ ¾_®Cñ:"ˆ±ÁW™1zÌØÈ2¡¬„‡¶œŸ¯ ¤ ê%d¸Vp5ôÓ0ÄEeÈSeš,ý‰‚L‘¥&
+endobj
+736 0 obj <<
+/Type /Page
+/Contents 737 0 R
+/Resources 735 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+>> endobj
+738 0 obj <<
+/D [736 0 R /XYZ 124.802 740.998 null]
+>> endobj
+97 0 obj <<
+/D [736 0 R /XYZ 124.802 716.092 null]
+>> endobj
+101 0 obj <<
+/D [736 0 R /XYZ 124.802 693.474 null]
+>> endobj
+735 0 obj <<
+/Font << /F36 457 0 R /F36 457 0 R /F8 453 0 R /F38 464 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+741 0 obj <<
+/Length 3190
+/Filter /FlateDecode
+>>
+stream
+xÚÍZ[ë¶~ß_aìKe`­H"uKЇ¦è)Ò—¶è¾%AÀ•ä]åØ’#Éñn}çFŠ²ìƒ¢´8À±ÄËÎ|óÍhãMÿâMœè°ˆ’M®£°,‹Mu|ˆ6¯ÐõLJX†(­Â<Æ·;¥‹0+|‹¬ôÇ\ÓPë„å|ûüðÕ'UnÊ°ÌÔæyOCžëïƒqs<´]óC”FÏCÓ<ÂSLoøß6š÷Ó°Ý¥ILoÍÐ÷“05ïwŒçÔŒØóø´ýñùO›² Užmvq–iJ‹=Žçý¾}?™fÏ°jßíˆ ÑBþ÷ ÊüêS1Ÿ`W‚J `SI <¿µãv§Ê486Û]˜¤RK{‡g3q7¬Í#›<%M
+N¨µÁ›ÉŸ‰=•é~#Óœh7c´2ø(*† ¶z¡…Œ]²_,ç'ízTÈîÆMuö—ˆS§xï€|ixLUÏØ"'TqŽÊ)=åÈM«8  -ÎVÈÄó)anÕ“jÅ@&2CÖƒmt,h (é‡(ÎÞÝÕ@édÛÓ[K+ùGÏèèdÍJ±]òßÊ$µ¾l½kå+iªRË0±¯•¬6^È"#[ KÃÌ­Y÷[´"±Ò”$ø—÷8L’êÀÔ5:øÔöÔ H?Iš:‹ÃgÐ)à*«"µ÷îŸPõ‘”èÜXtZ¶¡Eh"
+}3ó=qËŒy5K°^óƧ»7’ÃŽA6Yo’kÏa>¸¼‚ÖÛjx~KB¾Ž÷mG‘&ØÖ&Ûõ>¡A':ø´-`¡lAyt·4¥A•Ù¬ßÜ‚¼ãùñÙÝÚë<  afe2páQ–‰) ýgüóËÏ+‹Ñ𤕠kǵœ2L³|!Ç<üáyfIÆ`u»8Ra{„ öËÃ÷?F›ߟÐÀ‹Íž£0.ËÍñA…±*äíð𷇿Ζ{¾ojVZ¡(Ù¾Q;Cmo¯£ÈÙÀ¡§²ÀWLV
+mƒns”W6àç‘U?k©yGåê9èãpóšgX±íû×Ö é%Ç8S7hÆÝ,e´¶¦ê<ùl#K‘¥ ‹Ðt³Ò…{¨[÷V®ÒDy:i`¥ ÷‚fÅüH}5ÇÓÁñš'1Ž·¦“§íÌ]æcãÅñ‰zÉZ”GD‰Ñ³ãjã±" 7;·¸‰Ã¥=k’„*…¾âà´˜#”OpÒ|ʬAüFH1ïUñ 3ˆÈÖEŒØÎ
+ X¾ˆnp NtF­ý õ‹Ñ‘ß aÁÛîî­™ÎáÑIΞ¬Ÿ52º‘‚ÊfÆkïb/Z+ £%q64ûÞéï3žÏkRɯ¸‡ZÚ&§¤žþÅ`H*(Ùðà—AT‹áÆ›<ækØ>¥! ꨕVF&CBé¾ñ@Y6§ÐaøçKÉ
+tߥ¿Ü}yk+ñvƒhŽçÓÚÔ4bZ ðÞY
+¯¤³,blÀc©,^Âß =Oo785úFd95¯‰Â<ÅmDI•Ù›×üENwµ •‡‰æ©ÿ©Õ‹õâ!F»|™†e‰D¬ª·ªÞ[çÀ~ò5Ðô—Ì?#ríjY{¸™X ¦¿y0üsdÇ3<èCú0úÕ­¸ù+¤´˜já>( L¹0–’µÖá’ÐlWˆW©{Œ¹ìªeGÄüù^2lçJb`º9/l¨iŽ§‰]
+Ð2eó¡Ç}Kµ¬½9Œ ²V—%ažÙ¼\2O…¥Á«ƒ{Õ¬Öª}®gÑ‹¨sµaì½y ]/‚ŒLKà@ÙÆ®Œž âÂ4U´4„q È€L,ø=ª¹D‡[º>Zmè!É8~üìJe`RÍT¼µzrjì B²†UŠ+[ƒ8Ÿmu'÷¼Rñ.-)c^ß]–yv-ñ'ËHx¾Ù•
+¤ªÿEšÄ&lXœC:)«åw>”Q¨S} „+â¥e½ˆ T
+\ß°²éN#bsô‹Zì'Ü8®Ä
+>éÙKãqä±·o`?;ZIWYü¤°0ß7t96t;ÏÆ",Ÿ§n¼‰ ’{ Tfë<°³!kq·Ð¹VÎ? eJ ì%
+õÁEµ®Ê•¸~gÓÊI}±Ï]í—Ö-Äâ÷{`X”^–i[ç9“Á»À;wH[ÈÀ#Åñßoض“Mâ¯äÜ*J9'evQ
+~ã"îÞTÍÍA¹ß] ºpÆ KÛ–ó\ˆæ²>÷øEG4uú9Ó86ÀM
+)ÓOBý†Y~k«`{vmJøÑ‘¢Hjý´²ó¥× wO¹\)`;ç²Sh²9<3êø÷æ%C{+_´"û±”#®©„sd6\-±.@gÅlˆ¶•¹‡YÄòËæ<¹š‚!Š\q‡Eyòz3ÍÉhÎgÀ²îÛÔÍ/g["'SLãl.nÓø¹"`È.\î±Ému2­,€÷uv5iQ1¡g0’õ±|£Û©$
+Ìé„r{ú¿5¦TÛúQ‹ Á+×NkGÕ¤Ãú³û”Är7à óGD0Á×¹V%Ky&5¼QjÒþ]>
+eTz<:ÃUs~ÛR±¹ÒÁ8
+Ç¡Ë/ÕØcø‡yË‘“u—ÂQÂQúᢗª­b±\$
+endobj
+740 0 obj <<
+/Type /Page
+/Contents 741 0 R
+/Resources 739 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+>> endobj
+742 0 obj <<
+/D [740 0 R /XYZ 124.802 740.998 null]
+>> endobj
+105 0 obj <<
+/D [740 0 R /XYZ 124.802 393.136 null]
+>> endobj
+109 0 obj <<
+/D [740 0 R /XYZ 124.802 299.374 null]
+>> endobj
+739 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F36 457 0 R /F38 464 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+745 0 obj <<
+/Length 3135
+/Filter /FlateDecode
+>>
+stream
+xÚíÉnäÆõ®¯hø’n`ºÂ*ÖBzN1œ0™(¹Ø>PÝT‹Š”IjZãü|ÞRÅ¥Én lE^`kyµ½½Þ«–«þäJ*-’H­œŽDš&«ÝýU´:@×WWÒƒÄ:Nbm¡sz¡ ›"Ì×Wþ[ìV©Hm¼º¾%Ðëý7k#b±ÙʵÜ|wý5€¤HlD9÷Å`4‡Œ„¶Ò|¾ÙƉ^gø‰×U~ä |Ôº~ÜÈuµ/p¥ê0éÙÀ¿'n)3¬|ÄyÃË%Ãj[m`¹dµ•‰ˆ“”ý tn]Áì9Î}äz õl£Ì¥œ Zíz‡YÅX»>ÛÀ}¾çZ•ÚwTü­ܘõ÷a]ÇíÇ¢»ãùà‹}3$*éD¬-‘£“)(EÖƒìêªíÄí·«(‰Œ3ëë»*-®˜¬GÅ §\m•vBÅ1`HŠÔXž®ÌZœ!ÓdÝeï ÄÖ«t>ø†óå¼fß Xár^íʺ-*?®ð wDu¨ÒJËša4€²»¼¹EÂÐ9ÉÆ))?;ùÓ:Ÿ(Án³”Uš®;ÄÈᎠÊØö{ `‹'ÀíÔ V£»nªñä-ÃÕ· 2;g ±@}­„2ö9êKå!ê
+Y×ャ‰Gë÷ÃF²ÎšîrOu'pàO·$p ‹Õ•7-W²jÏ…p>hÎÒ[´ü­¼
+ðKÐyŽ{O„㾕±&¨*ð/ž§&ÚæûÏxÀÀlB˜"Ð!üžÔE“9™A2Û{Þ‚Ž5lÇÆJëK2ŒíÅèpC‘Ì9mÖï¨rƒû Þ âÃk…uÍÙé¿LÔoåiCÒ…í­‡*jì(Éí÷^qA…t$Tò…Ãß× âd0þw^?4(Yç{H:a–]ÞtY_ɼ8,°«Ô"Õz¢?Îò¬v±gZb˜™Iq_”2(ñ®ž/a`‰8Œlò›¢Úÿãæû٠ɢ~7<ÿÍ#cËDe,”Yב‚‡ò-YF)5ì™YÑÑ«?…´×ù —…¹åØfnXÀÒVj+´=«Œ0&9oµPIìÜV‹@W½îmuâ„Ô)Ú4@9Øü‘9?5뀸D® ,OðÃÕ7ßE«=À}} P¡«#”#!Ótu% Èøjyõ¯«ö ŒtnÁ,\òÐÓYÀ®9eV±0‰ë=Œdî`üÙ“Hrrt ±³œ”0ÃOßJ ܨŸßÊ5‘÷Á3ÄÉvÀÛÑ©z‰íXRÇÏîæËü6C†-»ÙV¡dò[Ù"DŽÅÃ^‚mìÏFŽ;AN¬æØù6’ºÊ$ßïŒñ{•Òü¿H6ù°«›º.ólÎÊJ˜ôYç6+ƒéË_ƒy^@],bøYºïîuY7‹¤·¯IúÝÒ6^›ð7%;Ðà¼ÿþ¶ÙµÎî/ˆºýCÔ[·ŸFñc±OúÅíËïgâÕã}Þ» ù},P\¼l<\"¶ý ÅÛ«uöÎÑÏþÅiÿœvʪvQòÛ×Õîm÷±Ü,è²×Wðm×`<ë5õûÒ6>ûìwfÈÛ»l_ÿ0à¿_ÝSz;Qè¸ê¿Œ«þó/øÛT ‰Q-)Œü´¬‘‚ÒDëwùM¾Ó,e|Ð×júr l‚³qRç>ï6
+ŒE½´"ß=1¨ó!D€9„Œ¡Yl>â¿šƒ{G¤øzrC± £9΂Ç1çÙœ¯ èoýèëÙ~Ocφ??e8>pD¬S}>&õôPñâ­ÙÍžâ…‹ÂQ×9ö=—Ï’ØG=¿M…MBÖ‹rÊv:ÌcØxýacì:kŠlâü¾ãžÉéñ…-éUV-äg¨ùBäµâûi(aHAüNRPÐÂÔGª™óm0Ñ'U¬QH'÷ S/>âÂ'fBFà#W²&¤‹°Œ•¬:`–‡e; }H-üµàçÅhlŸSÃvRt˜—P_Lc¼FŒ,¡qžE!ÏÓÀ!]r.ԥѠ4% ïÁŸþD€^€Z^%Dc^´öß»¼h¸HY·æ¾'"Lăê¶ðé:ôlt}‡VµŸVÆØ‘šœóÉ&ÛyMPÃ^|Æ`WßÀuÏZ=:üö$åp¢Þ.ˆ³±ÂFËâ,…Š’‘ì-©×ÿÎl¨p*ý4Y^2ˆ½œb2ÊËôÈž%âH‡[ð\æÁâYÓk#gÒžcä$¤CŠ’ʨU9 ]p^9V²|ˈ-<¡h»Hôv‚ùÅÞì0Ò¡£dzšdz˜‘m_Š–Y!ùjô+"`“—YW|ÈÏ2ÕBêp¸ýÇùááX&–}Zm6¢”LßÎÇkEñåñõû§|i¼Jí'®ÿt\0?ˆk/ñ¢*ž¤h zWYHHó<†¡²n:vYY’b†ò êÑ\>g·Ò&À(úDó\°†q®I–RÅeˆ7”¦fù
+íýkƒX }ìx ;‘êÊ;Jí#LþÂ=ÀÑ5·FœZƦ^“B7KorZ6x~‹ãÔ¯*y׆ró`.ï
+Dcç«ÞƉ=Pã’Ò°EãÕ%¨«öí‚äºHhí.°¯ŠD”NÒΉÛ˜:Ø(ÜÄñ._ØZW?ð‘e 3%áðTBƒÑé[TJÚŒ AWþÔåUïrî‚ì ~ÃbÍßf¯uⱠݽ•9dôº¡ß1€×£WǢͰ„Ï=RuQHávaGXâW")ºüKÆŸõòÉV<;Òn*nŽ%=2jÔ¡ Å6ïÎ ?xJD¡#ߪ vXGcLÊ%LF“r°!Xö˜T禿ʨý!´4lê‘ì Í™$B;yIaÁå5Ñ#ŽÓÒöˆ+Æ‹Or7ø´zÿ<:›Ñã$î=ÅB ,‡µñë­Œœ°pÐñyýµ õŽBäÑ·_ÝÁêr—põ7ø´dp«ôqp8ÒCcÜmµqÄÄsŽŒ#¸¢¤§j{,·p£ì/ ŒE·€EfTðFL$'çdAÖjЉZ…Ä0lîÖ¿ªþR¡mÆ„ØpK•ámÎ :óâtåÑ9àRË—Ð7Áå˜GY©N%¼ !~µîàÁLn‰FwX“—šswÿœQGø@‘_ø`9«üí¡‚Ú¥-)(Ñp—b~š9º„è(õè!¯ÿiAÒÐdù·àŸÑ=¸)~¬ÙoF ä¯Ïý ÆGÓ»ÐÛ»ƒ{vØÙL‘]yG› \¸jñ»½»à³)pLü«qÚXµ?ðØ¥8ÚǘË~÷È×YòÜgç¸_ð–
+endobj
+744 0 obj <<
+/Type /Page
+/Contents 745 0 R
+/Resources 743 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+/Annots [ 748 0 R ]
+>> endobj
+748 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [311.104 119.329 333.575 130.178]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.98) >>
+>> endobj
+746 0 obj <<
+/D [744 0 R /XYZ 124.802 740.998 null]
+>> endobj
+113 0 obj <<
+/D [744 0 R /XYZ 124.802 716.092 null]
+>> endobj
+747 0 obj <<
+/D [744 0 R /XYZ 124.802 600.191 null]
+>> endobj
+117 0 obj <<
+/D [744 0 R /XYZ 124.802 458.718 null]
+>> endobj
+743 0 obj <<
+/Font << /F37 462 0 R /F39 504 0 R /F8 453 0 R /F32 450 0 R /F38 464 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+751 0 obj <<
+/Length 2386
+/Filter /FlateDecode
+>>
+stream
+xÚµYK㸾ϯèôIl­(’zìb;ÀÌîHH:˜C&Y’Ûèá•äq÷þúÔ‹’l¹3‡$ðY,«¾zVüÔƒ
+ŸáCl?M“‡¼y<<ÃÔÏï”h£ýXá×É›…ŽŸD)Ò¼z÷ÝG=(å§Ö><ˆö©ø§gýòÌf§Th½@¿ÍÆš,ßhå+yÞìtl½¬å¶ƒ±ýfiï ôJXëåãæ_Oþîcòúi¤yƒJ|¤´Í§£#E&Z33zp²ÖûRæ89òd5`k¼¼/³±,xðRGYË ­èZ`<ÐÚzç|ìú­p¹â¦½ÏJ›Ï²]6ò±üÇÍÎã}Ü$Úëz¨j‡1kór‹'z÷áiÖ«ñÓ›À×A¼Ôü­”õ Ù:¬ùt©V|[^Þw/~ö9°Á~,_@ `cY×ÝŸ°o¼FaVý°ÒíN¾‰@–ì©⇧ “•ƒ ¨5ŒÁTaâ½ðÈåXåøyäOGúëFî׶^ÎJ'nã‚kìú2¯HÛ%Ÿx›ªEÎŽYSŸ¨Êæ$cÇmt}†+/"“\p¬;×ÄO`èÂQOhiµ ›— —L°Uö}‡$>­U`7c®¼'$KkUà"H…Â?óñƒö£ÊC„)Ë‚—žùÚ“dž±Ú˸éÈû„p“iÆðXÖ\zçHóNFž©f¨“Šimùý
+§¿]û±‰þk f~þc×WÏU»¢ñM¢¯`ø×ÎÙ3¼ñXrgåå8˜8â@°J¤j Šv‹š ½=êGU·‹ÛŽ[K×>—ýžg§8‚u0¬Q®qŠK¸.J.PIhA íî€hÚ,‘4
+|Ò…Zaæ$ž€}Ú¯Ê ¶ K‡‚Mê=ͳ+ „Άߴ€õí¨Ü¡Îƒ ™ÜCƒh¨U–èq9a!X›Õõ+¬7²Ñ² €¡òˆì øŒœƒúE1;ÑŽÿqÒ%uýRô~ä)§×¹Hœb’€y3Ñ©!£02 Ç/$"VÑm½sã.®jq ±A<¿_ÊBªqRÎ|]ôdxÚb¢_úÈÓ®¹Ü/¡8äÃgŽ(0Šða³T˜ŽÞH¿îx+L§ê›P‰|N1CÅØTà\× #›`åFÓ™kë »¤‚W¾ W7L®Ï:3i0iÇD7Þ…¢ìJíCŽµ¯­=Dt€iÇ ò
+«kUEC´õ“$™ki+µôoÐ?‰ÃߨŽÿ:S<±†ªº;`
+úp`>š42 Œ \Y_ˆ¤‹ýTúq`Ä2M9n0
+a]í)÷l&ëE*oŸ5dŽ±¤²åN²àbJiWW“~Ã
+¾_ÑPx<¬AhR?N\Æ€êy%<è4â«P•®ýƒ®!ÆVÑzˆÉUÈóŽ=¤äF¤™¢l5¥Í0™¶àPž04_ÐòuåÎC‰æN¤Å¬¡3‚[ÖK”ø±½©,$ÊtÞz踷GqÐ)À¡nÁBǸ²8ÝÀÄŒL˜L ÅHž¦
+ÁhKÎ@!›ºÊ«l‰‹Tãˆrt^ZK¶:ÓÉX WŒS î„GŒÔÝ C7TVÞ½,ðø 5‡nz¢‚‹ú¤ÕH¡ôå¡s© ’”I) 3K©n?æ,-ÊAäBÓQB®ì¸Ídm×îîa{º`Ê À¢Q@”<Òå ?¸…¶ñ„ï¢<dTè<üu%èx.yäªU ¹j*]1o¥Ú{:ºÐn6]¹ˆSÕгçê+
+S
+åyf}¬ºù4V,e0ë$A4WûŠà1
+‘&kQuoã°;íÕ!UAq>ïé2ðµÂp>]¬`.cu7ÁGEùfY
+}ë03¶ˆj¶5
+CA F›n¡ÄXŸ±íÆ9.Lq„‰¯ârhý$$ CHR…1”÷÷×vƒÉ—õòVPç˜þDÑ;A3‚~2§¹D0™äÙx˜«zån·“â¦Â–˜F““k¸eyÞõÅôF“ŽqÓ IW7ä1:ÁnßOÐ` o–ç ?>³Ó$dRnG‘‡ò)8eÍŸŽ¸MÉf¬ n=»v#E™…‹ÿ'.pvÄ[Žêí'Ÿ¥
+CWqÈå‡ï[Û;G™Ò'\‹º9Yó­­Ÿçœ/µrY’zrÎQFº8géªöyU‡±ìå²vÆù½³ÐÍ0ð>dS4%WyèÈaìíc™ áu¯T^Œ²Ë”jß*—î[ˆâxõùšÕgì¨ÇÈãÐ }ó‚ FhÞHÂÙyÞºà«4F ü$4A<‘DB áàïgªÅø¾‹ˆbv¡é„OŽ"îR†¾íÕÙ9L¯ƒM“í8л$™jä§c¼_ÊÞ½õsA-Záwù’5§ºÞ¾}ê@ùq¬þ‚šÓø:½ †y³Uy²¡5øðñ€É¶ÀiÈGl¦î…¼òò7ˆÒ]sà }n6Ív§š†ØÒ=
+endobj
+750 0 obj <<
+/Type /Page
+/Contents 751 0 R
+/Resources 749 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+>> endobj
+752 0 obj <<
+/D [750 0 R /XYZ 124.802 740.998 null]
+>> endobj
+121 0 obj <<
+/D [750 0 R /XYZ 124.802 716.092 null]
+>> endobj
+125 0 obj <<
+/D [750 0 R /XYZ 124.802 444.713 null]
+>> endobj
+129 0 obj <<
+/D [750 0 R /XYZ 124.802 328.642 null]
+>> endobj
+749 0 obj <<
+/Font << /F36 457 0 R /F8 453 0 R /F39 504 0 R /F38 464 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+755 0 obj <<
+/Length 3105
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZÝo䶿¿ÂðKµ€W)J¢Ú§—KR48 pŸš"Ðîjm]µ’+iãóßù"E­ä6@a`E‘Ãáœù͇¬îøSwJ›Ø&ú®0I\–öîxùÜ=ÁД¤& …oƒ{7
+Øæ%Ò|÷øá›Oö®ŒË<½{<åãéÑãs=Ôç~Ø©¨ÞíUô°ƒII4Á;ŽÀ[ZF•kL;m£Wüé¹ãwl×ÃØôÝÈ=ýŸ6šž™%öÈyòkT—¶éÜˉÉÀ`®Ð{$b’ht!ßN˜½6Àšæô/@³ßýóñ¯°™½Rq™e´© Ä ¦›TGvÀZF¥Q/‹cûixG¦Fé¨ë…™‡ŒâÝ>·:ú´³080±l$øæSZΧ«lkkäŒü®ÿÊ4Áè,NÒT(ŽmEkŒ"íô,â-;ètX(8®#œÓÈÕ°-Ê^'6NU±8 ®~ý ¥úm%–)ã 4†Åú5É>n%ëaÅCUwZ¯lu¬swnÅõ‚&†» Dö=²UóŠ#.ãF‹è§NÖ<á6¨©(õM2Ñ)¶;R¥ )4ZÒ—½*òXJN%§Õ_è « éåTãɦ¸oÔhSÎ }Á5xݦÛ@mÍÒmÿ"‡¶ÿ_v`ÅȨI*é«N§f¾‹- 誧(¿'\¢žh¥G^Ÿ›#.†Æ”é¨ùIª‡¶'nÑÐuÜØC–$ÑuwôÈ‘åó|:‚†¤çÅïüwº´«,I]_½˜xém=nìŠ áÚf¤Ñ.¸`Œ1Ñ+2o¦©îþŒ3?|ÿ8㡉K «â¼4!bÞ"§Êbc4£*!f¨ÏI Êß_^¦74 ÔX}¼<¨ãeÇ=÷çÔè„M°Ò»ïÉZ6n
+¸ýöÓ_–ìPgôåò°W—‹Ÿ[
+«jííhÅ!àpÃçª78@€•éÐ ]Ý[±½ÿ©%úB¿(=1}[¤ó$¶ÑϨžß2›¶±ÕéâÁÀ8p”Ðê™lÙ›E¦h•Ì!¾‹ ë¡q)
+GXÉ
+&25[+{`~㎠@e?ÀîY'ûp~ÏÏàÈHÿ@xö> cX]!C;¥qòœ ˆüÉŽM(O£Ÿ˜·,S6xäì¤ùõpe×€í¾[dŽJ2Gtê)˜ŠSÙæ\Z'Vk"UÎØÁkÓ˜,ÚÈ“óË 7·W°‘
+­I‹ÙÿàkÎhHqeÕLà%÷Dï¸nàPýd‚˜ts_ý•Ž±v
+…ªžk¯Ý|Y)âFgˆåyMv#«[½Z›ãr¿àø›îi /*N­öðaˆ¡lŠ<Äs³“³.D¿ÇùZËèß×~r*®
+@£qÖA‘{sl¦š´ØB¦²HpfW$¾¥X)I±¥$"å jÇ^€‘w³uÏ "ÿÆ|pÞ5¤I5sÖFvzôŽL’j#
+Ï=ŸÕ:ûWà—Êd™ýoÄâ«Í@îýÕø I—¬
+¾òà'"4Þ[w‚˜t$&¥>I´µá•Òq’§É²Ü³0Ûa½ä^ssyŸEôô'B‘¯mDEt®c“.uä@g:ê–‘ÏHÏ7ÖθzôÙkI à Ãæ ·a®Y‚×+ÁÕhuʹ&öOBðËïÖâŠ[fœ·.j|ïÍåZ Êé"IT¢|ö?Øn¯úLË™}
+ô{ëf‘Báx˺ì½=öõ2öÔöòߨ¥‰þÆÚdº"¨7´<´¬£½—óºê2®#fˆØ’R\é*&ÕqBœÅBS¤™“ÿöF!ºÔê+ÅÃÊÅëDÓp¼ˆÍ9L6|,àŒBæ|‚pð >ŠÈ*iÐöÚ· o<—mr…»sΕ†/–…îª÷+n–æAøí Q å,¨N)œÃ²7Ÿøë±ûÓÄ4]ŠF~+O˜zåuû¯*µ9æx¾Ôâì¬ä.yôeça%+K@ ²ËYRûý[ ™ëùd!š¡®'ÉbƬgDæ
+ð*Q²0êxc¬©ZÔ<Þ¸(àcnÊn”¨q:‰ÎtYªì,ÄW˜'ÐqËoÚ·`C.TQ%Âmãµ#o_Fßv¼Ê¬™ë˜ÔÅfä„í2û†ÞŽ³wË!>oЉÚÀâñ6‡¼ïúCÕ>Hšâ¢eº-Ö. Ÿ­Àæ7¼$HBž]¨7ë Êp†3ë; 0‡ TêDD‹ÞÅÔO'Q~a"–à
+6XÆ
+” ‹XÏ•+…ñãú×êÚNLº˜±Ó¹ªï­EwÞŒxŽÖâÈýËl¹î-HS†rþ₯V€Á‡¾Ýˆ~F¢T@éžÈ Úƒ.É~Œu­u60ðÓ*ÒI‹…Æzú|@´úXŸqߟ¹t )•ÅI^„q¼õ!.‡ÆZÅ™²‹Í¿öêr;ìÍ,øè¹H€eª}Ôª;bºÎú wÖ•0N¸t¨­zY®€U¥4FCÕæ÷£¬pŸ¢‡ºÞŠ¸Ué¾0hÏì·ª0&ñ\X{ÿñ~}¸–ZL~"çÛ•$Ÿ[5¹P33sj:t5X…átO¸-êhDOÍD}¤WÌú5pXÒ;Nòœoh÷/’£9½u¿õ æ`i䡧žÂ'‘e'Õ« ˆã ,eËE”i¤0í-¬Œ]"Š&§Ái[üNí.ð‚ŸŽªþðe­Vy\¦.(aýG), åøu¯ˆS ÿ?õlZ$e,¨“÷þÃ^å¥?=©ù—õfbcÓÛOˆdéM2Œ=PY=G«ÔKjIªøä¢$Be §Ô¿èe¢JNsQ)ö6Bê
+ã{šëë®ÎçR¯>Sìx•{,bÛŽÜä$ðýã[°ÜÕ¯›Ö–ôÏ ò…|ëÿûŒŽ>£3Ç@½'©ÆÙ‚XÚ#»u<EÜâìHµ$ؘ1mì0Ud¤Ä4*€í—j9g×ï3ô²Ð›¥F¤4síO
+un%Ê9h¨×y¯^¨Y§`[9»Ö°{áŒlûüèŒò9BчžÚÌh}m5MaðÃA؉è“tûyÎl°¦ëe¦×Ïßo¹Ž
+0Ý&ÀˆÄ;ÍoYã¿XrœÏÿ
+endobj
+754 0 obj <<
+/Type /Page
+/Contents 755 0 R
+/Resources 753 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 734 0 R
+/Annots [ 757 0 R ]
+>> endobj
+757 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.46 375.418 237.433 387.373]
+/Subtype /Link
+/A << /S /GoTo /D (section.65) >>
+>> endobj
+756 0 obj <<
+/D [754 0 R /XYZ 124.802 740.998 null]
+>> endobj
+133 0 obj <<
+/D [754 0 R /XYZ 124.802 526.864 null]
+>> endobj
+753 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F37 462 0 R /F32 450 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+760 0 obj <<
+/Length 2753
+/Filter /FlateDecode
+>>
+stream
+xÚÍYKܸ¾ûW4|Rn­H½ã“¬w H ö²^ 8-Í´=”zÚ³¿>õ"%µzÖr ¸E²X,¿úªÈQ»þ©ÒIXDz—'QX–Åîؽ‹vO0ôÓ;%"q‡¹ÂÖÁƒ…°ÈJ”ùóÝ»>Çù® Ë,ÞÝ=’è]õk†i¸?¨ †ÿTÿxÞ«`žfè÷‡¸ˆƒªþ©¤o|ïowûás±ÔuPE%id (§‚4¤ypęեYð°?è<¨y¤¡Gq øî능j3Òr-t¾îÁ
+°2Uqðsmej3²äiØë"¸pçt"…da¬guÆ©lkQ_Ð’8|T›]Á)”I!3L_m•ª2Ì"%“E5¤«î@ë@ZëÚD‡q¦eÒð<íɧ²ciÂî Ë4ÔIŽUa™f$,ç€WB±w?Þ͇Öð“êPƒú,®á¡Ò0I4C‡aQnaQÕM_ß?µÃƒi­ ®|ƒ¹_¢4zÿØ´m]½‡oõ‘¬Ž®Ì%íp ãd›þé~
+‹D´¿l/C­|ˆ;mè˜,øêï8m·›À6 7qÚ¨JˆÝ¦Ág¤ÆÁòMï :Q°ÒÔ4—a’ª•/¤ä˜ WYnMÿ:¶©Dè<ñGóÈ¿ÆÍ–#_ìŒúÉôôpng5„Òz^¢mÝÄÊ[C¿¸ö0}Î^¦pàqµ"±ÍTo Qxî ¢8ÌÔÿN‰¸íT§[
+p˜0]KiÌ'/ÞÕv”àâ•YÐWFœ
+«ÎX3~Ñו”¶˜ÉB7ìñÕô¢ŒE5Cýêû çKùªZO$¯býé¼í¸™W?ÑÈÓ `˜ñF¡ªÃÔ1MeÍåÖm2M\ñFQ’Åþþg ¡àÜolA1w{ȃ ÅÆw¾¦"VSau¬ÏÍÄ¢.,y¹šéÖoÉÒÀc°Æ粌݉#\”1ãÅyåëŠÒ֦ūD¬€Çø‹c5š×Ój™EјXÉŽ§ëˆC<‚Ý¡ñqE)ô-.9-^.û'ï!\opëÖ¢‚Q7ùa$rˆ‚Ÿå U1!Ø7žUɉ*‰À®vøë ~ÄœÓéŽQI¿°Ü(yPÈ›÷â´ÓÁº{dÓÚ]}O—%…© xQ&©’L8ÍjVäx¶î±äj£¶~ö„<ʘ™þ°ôç÷Æ­öïn7º
+|
+€Ù²àÎ]ËÜ®–ß‚|–z€"<À㌠”8‘Ë\ªÆ‘/*Nà‚—"Í43Wæýñž›²Æ;”5®>‡|=|×~A™ó¸\fõ¸ ëXë0/…‹)v®Ùú "«z€ ñ¼Lëàì͵)¢‡ ÎúÖôŒ<¶ß¸Ó«°ˆ2_Îr)t½ø'DëËØ K uHÅž⃆ø‡k©$¨Ÿž–€k;t¶¯J&õdŠªžÉÒú7!˜ziœÃ–>Õø®©\) ÉöŸ`ç/Æ6ª÷m¡PÀ¼¸ÚvŒïÝW¬qwrdûF~$‚ó
+mñ$‡ß=ßkR¹™¤ÙjtÅy@ÏàéB%Á_èÞbkæcŸU’"_Õõd9.ÆõB+å|A‚Ñ5·‘·Þ2ùâÊnhä³$¯dzÑö¥Ê߬5D>¼·þ¨#¹g~¢Òñö6 úo–Cß{õº‘ ï·o>Qù¿Žb’tY’]ã
+F)5AL,^(+’ªx|‘%ÒmIzï{˜ªŠgH=PËðÃóAL^:¾¼)(
+!®“µÔÎðÕSÓ¹úV¹z´æÖÅ:Í”‘«úÍVEðHW>Ìótå;RM®²À2]cÍ~‹@È?óÕÙ“q®W‹”kv~‰“ú~{œŸn`r­ÅÝaÃHá?V¢“Ó>ÜM§Ñ©ÄôÝл¬]Þ…³Åse¶º¨7U•Í­¿
+ð Žôã6Z
+endobj
+759 0 obj <<
+/Type /Page
+/Contents 760 0 R
+/Resources 758 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+/Annots [ 762 0 R ]
+>> endobj
+762 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.42 457.208 400.394 468.056]
+/Subtype /Link
+/A << /S /GoTo /D (section.65) >>
+>> endobj
+761 0 obj <<
+/D [759 0 R /XYZ 124.802 740.998 null]
+>> endobj
+137 0 obj <<
+/D [759 0 R /XYZ 124.802 716.092 null]
+>> endobj
+141 0 obj <<
+/D [759 0 R /XYZ 124.802 488.549 null]
+>> endobj
+145 0 obj <<
+/D [759 0 R /XYZ 124.802 396.443 null]
+>> endobj
+758 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F32 450 0 R /F39 504 0 R /F38 464 0 R /F36 457 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+766 0 obj <<
+/Length 3008
+/Filter /FlateDecode
+>>
+stream
+xÚíÛŽÛÆõ]_!¬_´Àr2w’5
+¸b7‚¸ñº}°ƒ€–¨]‰Ü’å‘ï9g†Ãá’ë¸Eš‡60ÖÎåܯC‰%‡b)¤f—ËTs–çÙr}Xðå ,=_¿EiÅRo3‹‰’Km
+
+9à¤0!#‘:g:KG¢¨ËóÓæã„°‡”+OÃÄ|lO
+MRFa¡¨nvh…Gb—øÜWAG£õQر´éÚ™´ç‰F‘µ×n4#±[9W³ÁœÚH5¶Ñ9UZ!CL™º(XƒùkˆC¦!¯ üÔ‡£F›ýžœöL¢¹™qOçt „‡¢ãoäž½W’K^‰+§ δéâÉ£º>Ú—Ûã/Œ}Ú4çú—'ÎõHMug79£kØß‚)á@×qwוŸH_8 ˧[X+»×ʺÄ÷y8„I­ë»õ¾œÙ6VÃò4Å•kŠ
+º ;"þÆá‘3©Mû¶¢ Y½Õv²¢MùÑÍ
+7 NêB¶,f$7Ïì”,°uÓG>o'Sc‡‘
+NÕ’ûcÝrçÝÞëQžR.,bHjÛ²vq‚æCþJïç¯>b¬.d$Z2¡ÇùùJø
+¬Ù¯Žˆ¹ñsÇÆ=]ˆÂ…ÖùNG!6 A£h¦V.uU[Õœ:¤¹ÅrêÒ<Ú-ûÓžó¨ZGpÓnF\ÛcÙz²ü\%ö`¼Šå¿.ö{HxZëÕ³K ¿¯?H ݱ¨×DÉU¯O¸Â
+8KÀŠîÎÍ}?‹l6n¦—¹‹È7¤ ÙÂPZÂç(à„åÐ$6çÞ`ÅNÀIŸy§.)ƒù ˜W@P0¯ L2“‡;°Š©¢!zfé
+Ëï÷èn’’(lêNo¹°Ñ» ƒ,ÜbÔèá$G@ýMOäU:Á Ó•nÏMõ!"Á5Õ8¤T‰K›p×&Å¡ïÿ
+ñnOwVe€ñØ]Ä@úËmBüºs÷/ñS´§Ž Ïjâ/I
+â¯+{Ò÷]é@ÒCÃOQ‰ûEPYÁ¨ÓuÀïóëH½ØÓ™ÚµëÀ.±éC ÅÅ §_HÛöDRÛ¯+Œ_‚@5rÕ­‹}ŠªN?~qWméöÀ­JàpxÀÖÚ†˜bÛ6tÔ!ê$˜‚'=>õ;“îlù?¥ÿêâ–t|Ü\ºk@ܸ‹(nOed÷뙟(ÿľñ+Ñ“«}Jñï&»îü ìô—ÈŽUƒug&¦)Ügz$C3/Cw{C*hï…«ßXàÞXÉ“×v@ª›ªž‹þ‹ a?÷ŸïU1Š-ã >‘Z&%„p ›šûµÂp3½+ü‡Í]ÿ1*\¾ ×]ý¯ð5¾åRãŸøMýÅYô+ŠÂ¥s¿¼¨»-} ;8™úos¿øq_¥i4ýd`æGo°Î²Tþ ‘Ê&We ¢Œ~ÅÁüO:endstream
+endobj
+765 0 obj <<
+/Type /Page
+/Contents 766 0 R
+/Resources 764 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+/Annots [ 768 0 R ]
+>> endobj
+768 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [366.064 364.466 380.787 375.314]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.41) >>
+>> endobj
+767 0 obj <<
+/D [765 0 R /XYZ 124.802 740.998 null]
+>> endobj
+764 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+771 0 obj <<
+/Length 2914
+/Filter /FlateDecode
+>>
+stream
+xÚíÛnÛFö]_! /2jMæΙ.
+dSl‚-P´[û­-F¢l¦’˜¥ä8é×ï¹ÌC‹Î>íÓLò̹ßæÌ(j)áŸZ*mEzYY)b ËÍa!—w°ôf¡Š±FT
+¿f×&8aýr |¢ôˆòïe^tRÈ¥¶Zi†ÊåZYË;ø~³XŠSÑW°¢Œ
+·|\ü¶üC.· Àû…’ËŸþgÜûñ)³ün&
+YùH`+*côs¸V §}å¨Eˆ.xþ*¹¼¿KùõYW;at0¶
+˜ hîÈÍ€\ œÊ5^¨Š]3hh 2Œ‘¾´¤€e“¸
+sÝa=úbØxS(ì80a·fá>£"ê„>}¤•G•õëä$Ü»”2ªdƒ— ÚÂ&0-†‹ôÉOnŠËŽšòdGù'ò“§ÔD×ä–‰QlØw  ‘ÈžˆGŽv^CX!¼SEchË…ùÅ:Ø·KƒpÈ´´ƒÆ@$ü4¢x¾/¥q5-":Útü*·Œ¯yñ5/žæÅMqxIg— m´ˆ
+h½VÑêÕíâÅkk`T‰ÕòvGˆ·ÛßVŸNWkµÚÔûŸ?¿{ÿ»t_ëkáð ßêoWÜþˆCå-ÑÕ‚è¾ïz|¶wíŸk¤–×øê7‡YrGä["«~‡OZ#*~ú‹×aE„ø‚²0WA°48«‚݉üý
+\hW¤}{øp¥Vûöw©,¼%[^ÿx¥ÃªéOmwd@·cî0ï ì•„IN(ì‘z»½9×ÇmÝo©Ï÷ÊÀ¼(äMøÖ{R¥ã/°JW¨ˆñnõp*5jAÃD³!Š#
+†Ù`ùŒýôÐJùTHÌù3¡ž²„ýÎ`Óãús 0 %Ì:8]˜‰Áöj…ñF»é#Å *½ Œ€³m¶¼t¾J±©V»tçVï›Í9-¤çù¾I/í¡ù/4í)é€í›úœ¢ÓÑ¿‚/à ªÂT>ÅŸìƒ cbØDaÒ•y>=¸Pt¥WX}ø¬wçœøˆõx~€üER¨S«íêŸÇ„yÄŠøÌ$¡æÜ
+¸(Ú²»¸m³ëlõy_ª¦ìêý>q8'ú”Nè¯ãê<hqE22>lYŬUÃ/9z(ýÔí's¸ €vâÀc x¹V!ÞÍ– b&_~êÐÿ¨¡±Á3’0J`x?aÃRé·Œ´Ù×äSsbŒmÇO´¨Kœ8Ûºž…«äÞäËk µ†›u8Î’CA`¶^R;þülþŸZÚ5¨Ÿ#MU AÂâáÂb¬©V «Ï¡ÝtÇÓ¹È:—phزýgíúîÀo5óÚešG?‰T”«ìêõ”  UõX¦õ ú*T«Çûæ8|„äÉyb–>˜, yŽÜÍ€£ c }ÈXëdÊš„|*DÉy‚”œ«èÂ#ì• Ã|Âg.3¤¹Tµf¿_wz€úõ›ìk’žŠ¢Ÿ€X5.<2 =SÇŠ«›îÐp³¨þ+tâ@v¡öüAíYù€Pè] ŠËXòˆ”ÚêPÿIëwLB;ÆÇ+G}“¹¾ËÌv3Íjè?¸“?ô}ae$+½ž]‰YÕõèh8‹à*ºX{êÉü=î.䵺½§v kù¹£–
+º¢U0Ò—sÑÓŸ3”Ã{Gžhf* ÌCÓGèð d“Ó£ 6¾üÃÐ|úÐ#æÓ·×ïÞ^oÞ^oߢßó†"釒By$Ú=ì÷›ÁQŒ¤&©Âó–Åi$yùMýíËo6ÛOä¼Ë„Â:8A2 'Öÿáí\¹owçŒBèðöÛ ðB?#j
+²õk‡Ø¤CŸùãLê&8^@”½ïi8ê…F4€6{ì…í‡áˆa´\áLÊÑ4t3ü¤|¡Íân²ÇñÌÍÎ%õ¸XQ=³[aRÞ»o: = 2„Û¤—™ %¾OŠ nëÊ:= òh<3ã&‹c– ]ò~8³µæ#ÎSiÀ‹«CsF0JzN¡4Ô/'±bT ) QbwqpãYq2Å&²’)-×RpýáÊP£—¦Í AV~i²R³C†“kÃ…óñl`ïRd:µ6= wÉ7 c“N±däX{f\Š¬7|øl›>éÔñz½Ý¦†!pm¾g)+Ok?Š7Gó·1^à'Œ$¿ÌÌw˵‹0€àµc%¼ä 6‡w¨­`ÛùnjŽxí
+å~9 ÓPÃ7D\Ïý?ü!>T¶˜gnÛL|ʯZñ"rY÷ã8ôendstream
+endobj
+770 0 obj <<
+/Type /Page
+/Contents 771 0 R
+/Resources 769 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+/Annots [ 773 0 R ]
+>> endobj
+773 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.984 538.103 239.455 550.058]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.155) >>
+>> endobj
+772 0 obj <<
+/D [770 0 R /XYZ 124.802 740.998 null]
+>> endobj
+149 0 obj <<
+/D [770 0 R /XYZ 124.802 164.618 null]
+>> endobj
+769 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R /F36 457 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+776 0 obj <<
+/Length 3176
+/Filter /FlateDecode
+>>
+stream
+xÚÕÛnãÆõÝ_aìXÎ…C²i
+lÛl
+ÅQ6n
+K›ÆQ[ᯎÚ-…ãêXòâ¹!27üµbÙÒ8h×FH«(¸¹ÃÅ<Èx{‹sP»àÜÉÁ4‡‹;bŽe#£Û^DB&“7уñ©².lÜ)¬"7å^±œ¬vÊ'Vää  O¯0Ëkëêx ´®ÅaRÓÒ_‹-êÀA>°¤,V.öBØGmÝq½ßË Ö+¯ÀÝMÁ²ÉFhÖçúóÓ*s¶ÃÆ„¤’ΔÌ2ñS¡»L%‰¿ùäãA3‰@-§X .Å
+yéŒâŒVÞ ƒE‚0Í™ä_‹u»Æ 0hT®4ÅAFÇBBNêãèû#Ï6ÈaXc´½âµà°+à Â
+'G¶(!{Èݺ"›8` §¸›Ê%1*öæ5íU®îT‡ˆù¹‰hvV:±sHf±çÅϋăaî
+ Ã-g²صÅIºÍŒõ:§t ¢½b¸àZi°Ì‘M å`-M½ÑC…ª˜"BúUš¹‘䯹”V63W°öÒ$Œz¡|» º8»‹õ\(Àu6“C¯u›¨üu]²Zð°©4 ¬XOÞÕëýŒ+c
+BÏ$µ]­˜˜Ž
+-€³@ÀU=Þ
+š¥Ê-‡°hÿVuy‹‹+ÒGM¥‚£VÌ&³-
+º/Ù@y2‹ÞÈ×0b”LÍö…¯t™&±JûqR€šXj c OÃþYðÌ\±©ÿi‹íU†%'íkø—#¸4ìéqS!§Ì…pœ§h‡€݆lŒ!OrîŽÛµ’š‚åÈÀ¸ææ¡ÑÈJÈÇiôVºîaYÓ…¢šâ&tPW[Z% -ýo“×o»þs+(¤
+ÈeÕe7hãDeøšbbhþ´ƒ¸R?
+È?¾»ú©/ÑaoiƯœ×ö†çœØ+›˜ Bß?ªNŠ3I)sc)_À ¿ÿÃY
+‚Åñ‘K|ÇiqöUGw·óMÙþßbþŠŠÙ·ïO!9Œojâ\e6í³`™(Txt8ùî2°bIÇ/{ ÔzëP,Û<é5œ¹ ÛrO—‘}$ø
+endobj
+775 0 obj <<
+/Type /Page
+/Contents 776 0 R
+/Resources 774 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+/Annots [ 778 0 R ]
+>> endobj
+778 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [440.12 324.615 447.094 335.463]
+/Subtype /Link
+/A << /S /GoTo /D (table.42) >>
+>> endobj
+777 0 obj <<
+/D [775 0 R /XYZ 124.802 740.998 null]
+>> endobj
+774 0 obj <<
+/Font << /F8 453 0 R /F38 464 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+782 0 obj <<
+/Length 2239
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ër£8Ýû+\½ÂUƒFâ5½JæUÕ›©©É®Ó HL à8Ý_?º’ÀãØév°M¨,ÂCÈWÒ‘tîƒ ™bñG¦„2äa:uF¾ïMƒÅOÄ­?'D±˜…\g7Íê®iÙÈ&nw9–551²ÔOü7ùüOCQòÓD]\‹cŒˆïOFä»®>O&ÿLþ®ëÂS“äÛöÎjäCXT£Žtév-ÄC.µ¦²=*º¾™üü‡7õ‘ïXÓ›{Yê&ülüµœ£Œ³töåæÓä÷›º&*pѲª†ïÅBÌeûE¹™QÏøºœ™â_ô\Ñ÷̧LJŠ†Ùd¿8¿E÷|%:')ŸËâ`dûÖ1dñ°@Ö!¢3“Aï-ba„ÿ2™
+àô)Ƈ8øð\ŠRÞ[IÑÞõ<Ê£™iYÌ(|çú8ÈÒTœFÙÓâ²%zŽçP¬x.7Å 1|”QÜ@ü¨àtçõKàtŽ/É÷€³1öóøRü08£4Ü Mçò ™òE4xXz>²Sï­Qð‰¸,ñ€)ê;‚-yÎÁ•éÒ]-¥® ]/oºI,—FEù5Ù ¢M5G–çµ0êS;W··’bmË6$‘,%ÓN¢3Ó±\£œ‹Œ (à¨p![%¡zæNPrÖB[æº"ȵQ®’•šÐÚáƒ_çw‰ZE©CÇ™í<Ym®«
+Ê #Ÿ):ø…Ëk¹ÁíÞ"#Ÿ’Š­lWaßFŽíµ¨H݃Û\Dðת«3)sj.¢OÅl3© O•Ö Çî——Áª„‹ÌÈîõÍ Yg\ÝÔ½¡¸Ÿ©¶)£ì§¡±ž>$ÑÕðÉΑUæg ôélŸ~|lDbå Œ~û±r9敃°rv8žkÒJa}$V5ójøè9pà >9k}gØ»±÷ž±çô§.U%iHŠòÓs«»,K"žžÚ„—åÉHe^Ùl]jÄ÷ê¿4&Iß™¼
+¶[×’jK¤Å؃%FåªÏ3¨Ô&(¢žWOm{Û.Ž¾àâð ëT?hßgê)P .»–·Þ¯zCZðAû…ÿ\ÁV¥Ñ-.äa” «i° £"Z^öü3Z†ÅÀ€.Ô(ãÃs^‚±»r3óRÇÐHS‡å·š>Ý€çÈM„g/2O¹Ï§Òk80%*‘àÌ–4û[4â³Â'¢v°89D—rI”¦~±2Fz‹¿W̧ݎ Wô4H²l94°*Rú4bµ-†½¸d ÞeOÛÎ%±Ú¤ý1Ï<T¾‹Ö•ð¼ªgxV†§y?ÌË‘Ùj1LrÔöüñ~±F‡§0ZŽY#Ü÷FØWåËA¯é÷ËÜ»jë/1
+Y,a˜*ÛÆJÁVÜ Õ…;cßÇ.ŽÈfAVùãà|É;±<ZìF,_˜ÖÈóÅlÏ"ü®¸ÄóHOþ¹öëu0Fr€Èë—È]Ç0[©—üÄ~a;ZŒ{žÔ›èùÄïH¥Jê\¿£/$R#‹Nc­z…R[«ÞÞì ¶Ô|âкTá®!6²9 µE´ÜÚM5ÇçÕKé ÒÅJwÇú¢¨ß)–dµ¦²Í[ÈúýåõLæ ’*”° 캈kdꂆy¡ÎÄ,Pl–6_fȱ·—5Ðeê‰Ü’ØÔ4_x©f“¯vÓáïÏ“¨v±Tçî’3pî_ë{Q¤ªåõÔ
+ÝËË|gFZÃÆ^YN§Àe·˜XETž
+·äñɃ,o±±ZÉi¨òÈã¡Š|Ü~Ÿ1êUÆdQ99§Q£*—å²IµÛi|T2©–­™olÊÑ c+¼_xwx‡üT ´S…v6ü
+¦ÓI0+?\~¿r'ÄX€oU”êVí„9æbÈRƒ²`èKe¤¡.‘5ªn¦&vt"D.ƒ‘y¾e,Íg+å’,ªT
+endobj
+781 0 obj <<
+/Type /Page
+/Contents 782 0 R
+/Resources 780 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+>> endobj
+783 0 obj <<
+/D [781 0 R /XYZ 124.802 740.998 null]
+>> endobj
+779 0 obj <<
+/D [781 0 R /XYZ 216.541 133.427 null]
+>> endobj
+780 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R /F11 615 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+786 0 obj <<
+/Length 2514
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝÛ¸÷_aäÉV<~Šä}H®Í!®mö-—­,ï:gKIÎ^þûÎðK’eïæZ´@ #ÀZ‡3œáÌo¨°%…lɸ$†ò¥–”Xk–åaA—÷0ôã‚!Ñ ßÎ f‚¢s  (·ÈóævñÝ[³´Äæby»uœ·›«×õ:B¬Žk¶ª»ã#ü<®3nVM }µÎØjãYºêó±ªË
+ßäªÙê×ÃØïü¤=Lê<ÃÓn¿÷,8¦Waž“øØŽ»/k•¯Š}U£€ÞóöMø}¨üïLÈõÇÛŸ¾{+ì >׆X®ƒ™g™§að•—‹)X ®ò/AaI˜‚mbŒX¥÷-¬ëWã£Õ‘n³‘£\+Ø’v­øª@[žf‹sKŒ•½Á-íw 쳄]ØÀ[õ+e²®:OyhÐü'ÿÒ?à8>Ãfƶj‘’ƒ¬~¤¦S‹¶òÇ®Úu¦¹€c×ãÅs$;Ãóœpi'vA%ªökp*.ZíQÙæàývôžr‡¢»Áçuܸ‰šw¥×tJa"
+gÖÑß#1ä) ,ìêXì½·˜$VÊ sît~_­Á­äbãÆqE'{†ïeã¤WžsW‡Þ _ã à"Ó
+$¹UÜypp98£Ù¨›V%Îxo¸E\š‘bUÔ¢vÓÝî8±UˆÊ‰¡1(Ñ¡B™Uüu :BÕêQ]<Õ°ø\]09NE8“œÐ²áM÷zØ’hÎú.Ç’œOż™‹aD›x<‰×ê]íû¾øâv§èª°ë"—«Îg'¿qèXô=ò:qrÓö屑Ω!,W“Ýt§†çj…‡£u§ïË.ì&zbjXN‰2SÃfv1M8v¡ ¸H?òT=OÄØijéÜê=zqWß{ZHª°'gF‰á/{ Ê„}Öa†äÆüQ¡ro×F¬\ÜÃË( |tî©nPÐ⯷Ce‚ø°Üa(š‹×icŠHÉ}sÅkœþcõªËý®†tªh>ÜáÃ:S
+_=6’ð{ZýifXÆ(‘9Ã@!
+rvôœ«TŸ1ç]ªR3˼¾™d„û_°ìu2 ´|uƒ¤7ƒµsS%‘àBohªu)1ºê|Íw¾CÓûΔEíŠ}ô2VimC€†ùÓ
+£OñŒ¦
+OPàb÷+qï}¶)cWï¶ÓuŒ_‡§u¢MeÖñi ¦=cµÁ´iGi×ÚÕÃË.ÀvãL2ñÖµ%8‹ 7øìyš#
+Ý8Ñ÷~
+ÚRŠZŽk$K¤–T.- $N¹XæÐ\J
+ Ér"”‚%d@Õ
+8dý¥\ÀÊp6дÆ  H‚´†n[Úñb „2Ò *ihþ”PlP{ Û`Z" b/$AŠA[,MžV“ZN#Qɤ4q‚á=YR[BcJ5`îd\¢€qa)îQ’“6r´ZÚî¤Òà’¨öÌoÓ\puëÿ‘[ß/@wŽ}ðq!ò|’Ü ócÏ&†Ê7Ô¨&gÃl¶ü *¼P]ª,˜qXèL“4£ÄèözŠÐ0Æ á
+×5'ÂRaÆ(å@zX¼¡>þž(ï_$K I’ VI*A†\6º†Û
+endobj
+785 0 obj <<
+/Type /Page
+/Contents 786 0 R
+/Resources 784 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 763 0 R
+/Annots [ 788 0 R ]
+>> endobj
+788 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [436.135 415.251 448.09 423.664]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+787 0 obj <<
+/D [785 0 R /XYZ 124.802 740.998 null]
+>> endobj
+153 0 obj <<
+/D [785 0 R /XYZ 124.802 400.044 null]
+>> endobj
+784 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F32 450 0 R /F37 462 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+792 0 obj <<
+/Length 2442
+/Filter /FlateDecode
+>>
+stream
+xÚí[KÛF¾ëW9I€Ùé÷{Z›E,° Ï-É–83JF⬤ñØÿ~ëÑl’Cyl#¹l@°šÕÝÕõè.Ö×ÅQ•„ªRÚŠ(u¬)Åj{XÉêºþ¹Ryˆ±F…OW:k££>@ù„cÞÞ¬¾ÿ!VI$oª›[y³ûy}sßnj§åúr¿Qëýv£ÃúwhÛó¦Vë3w6G íò@hö“Îÿ (™ÒݯJÀ.öĶÀˆmsÞ?|â¡ï7µŽë~ÄÚ÷´Þ]‹ìxÐóÌœ¡¯ÝüzóÓ÷?=hT++’µð«DrŽ´Ë‹?#£=« MY¬)MÊ&iŽ»9w•„ :ÈlÏ—O팗IBK›Gvh®}w< ¸úÇÍà%ç…O¦ªµ/[tÒ«¾S@ü{¢¬ê¨˜pàp-‚ÁAÏax0 © ¾;˜è­`¥£«"¬“Bÿ³]õô2°Ìø–ævUϺë‡úåõLŠz&h=ZgöÀ¿pÉ+ÔÃJÃeôµê‘Jóþ9“ÙBsaæO4º_Ý–3*…«žW?W¿Êj~üm¥dõ¯Å‘ÿ/Ž|ZI¡£L8Dz‡Õq8ÓÔ©¸Ï¾wÏ—ætyòì2¹?çÉ §!öU24®9’°ð¢°U²Âj©MåµPV&W%-¬3ÀÐ[¡d0THRØÀ‰^
+”Ë(¤ÞF…O1ähµbî"Òà’^ì™ß¦±`që_È­ïV »N°ŒÓÆx?‰ Ô©¸ïÕÀÐrö1Éòäz˜­E4‚¾J ü˯“Ÿàu"\Lü&¤K Ûa<èkˆ+E ð
+Ÿ´0Išˆ4%!7}
+ëwûÃþ(Í rùh×léZ{°‚Ö“L¼WÌ6H€ÕÈi™#ö€]îÛSËMØà-2!‘3Š!ŒQŒÀâÆ ®}úûƒy_‡h“àýÔ&oç6h‰û›X»þ1/z@ ótÎOášl&èÌ¥‰™²iÀó0}™"A*R^ØsëßZ2öàò`Û›~Ä®ß]·è §‡Ìl´¸„G7§<mbš4ÒY9¾ËJN|i
+þ˜¦rÄx·Vœ-/Í ìW-„6@Ý…ÍÃ3®ÙàŸrgs´¢‰Ð²pí‰i¸=h0žƒ(_n ÒA¯÷ÇÌ¡„‹Bt/0s9©6dÍ»':tŽî&(ÈG¤xVz®
+Ãõ±9Lἄ ºmÛæéÜ滌Ñâa‘‹c R»>vÁf±*[Äru
+]Íe.™ñøªí/Äq~4½xÀü ¼*•h—‹€å"`qär°\,‹[—‹€×/óK¬N$k!8Ð'V™*§…ƒ”%Úüî5‚ ÐÐ{Àf×4«ÒlÐ úWã|«!†ê?ŒóA5€Ø” 2@¥yŸß‹pÓÁž1q
+ÿû ¾Ù
+¬JòKƒ âf]¸ì¹ºL 1fچό  ˜ŽI£eàûM8ïàÿ<ÒÝÞÒí1æ~y<U‰Ëáì¡ Õ¿
+
+ ’Ù~Ü·kÏíãüFPŠ ÄI:þå¿
+ñœßì[ -ý¤’ÊãË\y«½ü/èx˜åkgÉšÙ6v4aúGcÿéS‡¯endstream
+endobj
+791 0 obj <<
+/Type /Page
+/Contents 792 0 R
+/Resources 790 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+793 0 obj <<
+/D [791 0 R /XYZ 124.802 740.998 null]
+>> endobj
+790 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F43 618 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+797 0 obj <<
+/Length 2399
+/Filter /FlateDecode
+>>
+stream
+xÚí[KÛF¾ëW¾D˜~?àSØd Àn<·ÄYÒŒ´‘ÄY‰öÀûë÷«îf“r'ìÖ ›ÕÕUÕUÍêú¦Æ¢âø'*!5ó\VNs‚¯Öǯ0õÓBd¥s‚Þ&&kå Ó¶ª!'pK,ÿ®ºI¡O?@ª½H„¼B”dN:g0sì_SÎ8[ Á”·FW–Y!½©<ì ®{¬½0–•½Ü2\/êÑt=’P?×Q¬¨G†Ö}´¢ˆïŠü"%k¨{M½‚Â=¥¡li<?2R46flñÕŽv‹û}ÎLõ´ø­zÇ« âø¯…àÕ/s ÿ_ù»âLzˆ…[°SÿMÇI‘æ4}ª·w‹ïôU`Áªêî>òÝm~[^ÚÕ¹½yw÷óâowey^]wßy0ÌH#Be`h¤³'¦‘‚t4Ó’KUYÉ„æÁTA2mZÍw
+9f8ÓÞ!ˆ–â|åó’Ã_Ž G3ÈJ\5 ¬^2i¼=Íf‚P¢ä³R‡¡2g˜5^ûÞ$§™1ʈÞìž’÷†e…¤XQ(‚Œ`Rko‹6˜t^“‘Å$혒«ª˜­-“Ü!É–Í
+6—=PHŠœâȶâîbR’ÎìQÜ®sÁÖo(¬o°]ÒE>©”µW™!NŠ<÷RbØž6ÏÓB×ýjQýŒ›ƒ,Bĸ ØÆq )<öˆ"´±Õ†õõC*þY(RIì‰ÒünŠYZA&RäÀ¬Óú¦ËÃþ´¥çïÜð~á=½ÝȲÚ"9â@ ­|ujˆc³½ÐcûxÛ­üxÌÂÄ«×7Ø\¾ZÏDkž.žÍyEçÈö†t|ÿ£r½ãj³Š.1œbb¤Ô0Çh•Ìü¡çW8+Ü•m­?œ?n£åuž©…ǽžÏ_E 5> ÙœoÄru#ýò‰tÂr¥%ñq»ý÷Ûsz‡<p$îm¢¼¿©é¥M¤[n£O4+–íì‘SÏDnxûÓŽ/ïvYÌf{¿ú
+;Ü<ÉÐÕ oF1ºJ:žÍ„˜€ÊO¥ÜNIÁ5XšG2 ±Å™xž·KzE*Vœ1ÞŒñæ@ÎoÆx3Æ›Ã:c¼ÏÁx¾òˆˆ€ƒ’>@5SÚæžÃÆ B>§jÃKxÈQ® ²2ð†ÖpâšL×(Z¬tä,¼¡£ˆà(Ç9¼aAÀ% o½Oþ¢ÂoB-ÓT‡‚†üèîZfE¢âXO‚4$EÞ~Õ2VœŠF©DŽew£fLp4#ÊQc5˜gy„’ôöfTÚÕ>“%-ÊIíšü¥ÉxD¹¤Z~u^cuÚnÏTÒ1(i ”´Xp̨
+ñßÊ·›×4a–÷–ˆ}ÂUÑ£ˆ$p²È•Ò0ºÄ’bm’=ªÇæ
+ÈZw¸ØfB}çQ[Ç„)=™íPéyãÝ\8ÈÏV
+ý¬7\!ùîÂ$Ð …Rßp‰
+ÿH4okPùxi2œ±X¨pŒÁ`J¦'û€.À¤ Eµ'w8{š~·mU¤ŠØÓ" I ’þ|ÇJ‹Íݽ~ÒAÉCôåHçYãM§Æ[A>ôø¸kEC~Ýqë¸n;™žÚr¹M2èç¡
+§¦Ç6Z!G^wÞnú…¯†ý§}ÆÄm? »Ò‘MßÄž!ÈuªËîÛ¨îÃvzù3Òøt(MËÍ*’vd)í>‚ê24mlO ›ŒW¨Ðk|­"6Ê„QKì¼i ä°=]¨¹ƒµlîÓ³t¹¤În Qì}!œ2:è
+ºë1öŽ¿ž‰NÖË»®Mš›müuÀ‡Ø.§ß¤87(WçÌ&^êêIàyifð=ƒï9ßøV_¾Õ ¾gð=‡uߟ ¾©kç¯)ð†Œâ«š#™SÿøXkë*êè€ãåáù
+‡ÐŸ-I¤Ó)‰ä<¥S„Iíqr`ˆ´Èb"ÏÁN¸‚ü>¿,„°~u`lþ`¬¿0Ž6<¶!²}ÉêÎD`A2e±úÍèd‹ bg®Æ‘ÃG%§þ‹æ}·ü¥ÏFëÑeê,ýúåú¿MýS69endstream
+endobj
+796 0 obj <<
+/Type /Page
+/Contents 797 0 R
+/Resources 795 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+798 0 obj <<
+/D [796 0 R /XYZ 124.802 740.998 null]
+>> endobj
+157 0 obj <<
+/D [796 0 R /XYZ 124.802 609.196 null]
+>> endobj
+795 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F37 462 0 R /F39 504 0 R /F32 450 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+801 0 obj <<
+/Length 2108
+/Filter /FlateDecode
+>>
+stream
+xÚí[K¯Û¶ÞûWYé
+õõ9‘âõƒôõûéêž¾>ãw».3¿?€=Ž´çü;`ú–$ÂmBýøœ…µ¤kÌwo¢ nÒÐE3²”[#Ȭb7žg‡!X06ºu<d¯”Lzü}=’$e¶qÜGOAˆžúz7Æç’ȇKNŠœb*”`\ÚTÀPð_{Þiþ«E´aA›qÆ5ÛPœæcxö‡˜¡ÃyŸXb wK‚f",,u}MV¼^Za™qú¾iY Çœ9º&òuçeVkdv έVÐ/ô¶'\´oIÿ5¼{0¶noo㊙×ç¨W4uhS:âŒ6Ñ㚢iÃ;ìv™Œ5Üm¯‡þœM¸¤Y—ç>ÊÈäO’AÆô´Þ3òróßÇé1Õþ†ª1†I#è)ý5
+Åxúä‘È«Æ‹DØãO¼dN:G¹=M7Š)gœ­Gå­Ñ•eVHo*rÜø³ÝŒôÂXfNrËåvÓ,†›…„æCÍŠfahs£fñC‘_¤d ͤiRP¸ïihn\ZŽ/…,-YZ<óèyóTŠ4g¦z¿ù©ú…W;äñ×àÕwk"ÿ)‰ü^q&=ÄÂ-öËÓæ<=ÓqP¤1]6^¿Üw/×v¸~Xòì2y|΃Á¾cD¨ ’tN¤À4‚¦²¬%Çöd%šSÉ´QhQ±¹S.δG¶–â|åó’#^Ž G#Û»
+ꆲÝx‰奘h[aÀf4 rŽY‰zv£Ìf×~2ÉifŒBµ+fO”즒bAd¡2‚I­½-Út`ÒyMF“´cJH®ªb66É·“s…çr
+iŒQ‘Sy£­„»˜4¥d4{‘·y-XÓú¥õÇ l—zÀ'•²vVâ ÈcU
+B¢¬™@õâ´<UÆ:YIJžUšœ0Á#A8J8¯€r#
+7Ö¨¾×7('œï E*‰È£(kc1•U a •ü&zçˆÜ€âæ†ÇK\ºyCwtóŸEx‹|«€lÕŠÄV$¶&rEb+[‘ØšÖ/‰éÏBbú EbpRÉ 5Ù`¼ñô8ÇtÊUJ° 5—ôzXYá\%ªdдcMy¦ä7ú#`‡Uœ¶/TxdCì‚à ni*ìZJzd0kîž ðx'É,(‡X¬ ¸‚Ucã¸Pð«Ÿ*0dü\PI;!ž:kîÏz3Îj?ŠÂäx…¢+]¹BÑŠ®PtMëúRð£/Q¢„ðD‰\²’¶M¥ÃxBlÎQ•ƒ÷ðYúJ#WΦ +!Põ
+
+ÅÉ¡9\’<²aî‡ÑCÊ
+ºŸõñÌÛ“²ÖF 7ŠžÖý”¤hâ" âM&+2%ú}É\©£&ÒKÓÝ9k›I=ŒóRK ]G#Û˨ 3û¼(3q‘>[ípûuèQ²s>úáNVQù
+endobj
+800 0 obj <<
+/Type /Page
+/Contents 801 0 R
+/Resources 799 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+802 0 obj <<
+/D [800 0 R /XYZ 124.802 740.998 null]
+>> endobj
+161 0 obj <<
+/D [800 0 R /XYZ 124.802 716.092 null]
+>> endobj
+165 0 obj <<
+/D [800 0 R /XYZ 124.802 332.169 null]
+>> endobj
+799 0 obj <<
+/Font << /F37 462 0 R /F39 504 0 R /F8 453 0 R /F32 450 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+805 0 obj <<
+/Length 2060
+/Filter /FlateDecode
+>>
+stream
+xÚíËnãFìî¯r’ÕtÞôä
+@Ý8DetÁV+Yh¢·ª° ¨3©Ù®Ò|FÌ+Gº¹»]U pµ P½æQ-¤¨‚V~¸"“2ýL%r¨FN#ƒŒ}C5ÙÒ¾$²`´f)ñlG‡ÕS6?%ªxYýRüF‹Øñ÷£Å7CþW ùvE ·Ô!
+ÕÂÁúñP{ 0‰GõþaõÕ·¶pÄiQ<<y¼‡Ý/åùRŸ.ëß~X}ó—ÇÕyq:çNÅs…AGžã”#î Y8I$§\š&©S…ãD*µ$Œ—ÌÊQ"­#j3ÆÖË)èËf×NLf¶+Ë W–³qÎ8¢l$d Ñ\º)3£ˆVVÚQ$#‰RB±Qìq&î –å)Ac`…LH1Â¥´:s“Žpc%
+™E’†Æ©(²ØRN ܲysy65§’Ž2¬È ·¬î,Òh’$öÂnó»àfÖÿ‘Y߯@vŽ_rÀãBh=»<EØ[CÓï^_ U\\«à´?ã‡Å9Í5|\XñÃ*Þ÷VÙ‘Äí*«êÚ\ð!aîýÊ
+¢(Ü…¡Ä‚/
+Üp&œÝ2”7%r¿ R 8ÖÜð¨íqpPpÙ¡?ƒWiÉÊÜÈ!î›ÒòúB ƒ­`/hIçÀ ¡½LðÚú¡¯ü LÖ© Íî¸öêcå¥î¡|âʶ …²L§:À]îŒÃQ”i÷Oh´¡ RáæÐg†v£ÌAï:®(®ÕÌw¶Cß'Ón/¾ÃrÆB;'É)7¡y9zÎaPäÓqïç‚R<
+ÂÍ©Nz86áø5ëîCÛ¼Ë6tð œÎÇ[Ž–×]v¼ â9žBÛ6ýoMìS²øÊåϳàçš^J Ÿï[F|ˈo†üdÄâK2bqˈoñͬÿËŒX~QF,?'#†kK;¼¥ ÖÔ E]3'O3-f¼œY©QCB+ó`I¨•Ì´£©Ã”ú¦epKy•Cã¸^$Â!T¹’ °1˜ø“‰p\Ì+ëýÆ6¥ÂåBÀYùˆs“ Ž&Ü
+C;#wŸÒkòeì~* ö ÿœC#³öèEi^üȘȘG‰Bîs‚òm—óé¯ÿ9LÔœÞÜ¢Ä[”x3ä­nr«›Ü¢Ä›You“/«›„kËú @£ñ™¼ø¼ªÑRíÊ@
+9+ÅèÏ+Åœ?U‹9/Þx%œfÿ¡L¯¼Âªò|ìŽ-îNX‰/º æp†Pãôí:ÿ@G$|Äu¦||^3ÿB \ÒÛ>öÛø~ Îài¯¸/‘t¡¿ ª´kjÿö‹OXAÀ†nFß«|<^Ïš_xØ5Á,Ò2¯
+îà {šå}¬:xæ»éÊ×åžK Ù¡¡¿4–g´U‹ë…Ì]jaù0ìR£Ÿí+X*×Æ8÷54PçùèÙ ý9L£d’³êÔ <ìåOYžs&1L]¹eæ—Ä29õ¾é›SÝbA©cåêT{žQ¨:Ê1 >ëv.)žàáù­×Y:Â@t?SAÖc¬þ8ïœq+³¯1sŒ0íñ·£Õ×~ p‚±}ëS/õ"0°L˜ù/-ÿn¨Ïóendstream
+endobj
+804 0 obj <<
+/Type /Page
+/Contents 805 0 R
+/Resources 803 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+806 0 obj <<
+/D [804 0 R /XYZ 124.802 740.998 null]
+>> endobj
+169 0 obj <<
+/D [804 0 R /XYZ 124.802 563.196 null]
+>> endobj
+173 0 obj <<
+/D [804 0 R /XYZ 124.802 261.878 null]
+>> endobj
+803 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F37 462 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+809 0 obj <<
+/Length 1614
+/Filter /FlateDecode
+>>
+stream
+xÚí[KÛ6¾ëW9Ù€ÅòýhOY - ‡6{KrðúÈrj«Øößw†”(iålØ6ÈÄ93gFäGRË ƒ?N¸PÔ1A¬bÔ{GVÇ‚‘°~.x+"•¤–cí
+³”NSeH z<3(òé˜\R€Ü)„TA• VX«sì+’J«­!œSéŒVÄPÃ…ÓÄÞvUÑÑ“`jÙëMÅUQNØåDCù°rbE91´ô‡-’ú^ éOZÚʾ§¾ƒ$}­‡r0¤)ªdÒÑÔ˜©Å£í‹mŠ>£šÜïÈFÖÇgä×È—È·0*F…cE˜‘V÷ït`òÈSøªÞÜßý䈧ÞHr» r·ëw³K³<7ó·oŠoSó¶ujܽç^S-4÷Dƒ¡^`Ÿ=ÉSS"^Q%˜ÄÊóšxA•– Ð(Ê™•0ÇžQå,ÑP XGœ¥N0ð—¥Ü"f%&½PV…Th'xO³žjÏ%ïYKP~Ø™ÕÔh§\o’UTk©yovOiÇÍIRÏ9D!)Òœ
+¥œI½)O…u
+L&)K%L’d¶2T0 “l\¢ÀàZ$R磤'9rÐ[rw2©Igö$nã¹ ‡õ
+ëÛl¸ƒœÒ˜Ñ̘¼å=61lêõÃi¡l—}ëÈ8ïZ‰ßqañÞ‹ 'oâ⸠Jò#U_t! †ª*”[°c@³úôÒ`Ã`8U#óPV€}”†È¯
+B¨­æ*8ßqtq.º ™d~K!x'^0A')I,…Ézà z5/ùlYï*|n.ï™fK,Bcå sp–˜½
+ Ýàó5rYäòÙ«ÊÀs¤îe°¤ƒ``.0 °|(³>$8LÎhÈ«ê´o‚A§êtn­`wÕŸAYаU‡:îC›u³ïú៚EØ‹èØÉ2h=¾îäåêØËÇñÉj1àþ€ÚF9Vr§ c!“”Æ÷,ôð &¥œ5û9؇ecú«‰ÔÍ_Ë#jûÌj³èD[9\Å€ÑÄÚiÛ²ÔITP>Ômå
+'ÿ é5Ú—ƒ©È\©Jü¿'žj<ÂTªwH«67†Óìr|©ÇÄÒω½§Fâjo¨…<Â.4µØVÞ÷ò„Ùäõõa¹ &–-£ä°ùñ¸£œ–0g8ßjXã™òƒï±C€Î ˆ#>q>¶„&BÄ–«¹°³}¤ÔÐþ„ÅÙ¬…³'<|®ÈÚ ÛÃsÞ>ŽKôVq˜|7.Ì£Íë©åA'±*ááÈ} äfª&Ù ‘Æ ü€höѱð…F³xs
+~NQ˜}‰å£8 Ž<zÆvÜÏV§ºîÔ®šÍ:Rïæ‡ (£ó¹›‹š¿‡Ý>'0ªCR€—(Òú[6ûe+“,ê}7”SÕR’¬ì——®5ússM&n9wád]{¡Ÿß\r k›Ì›Ë¼¹Ì̛˼¹Ì›ËÖ|òÜ«Ý\~%ɧÜw„K»w[v{H$¤}d“·‰i;æ‡7Qp´á ;3%Öî_äuÇ#wŸ'ß]ä/m2¼ÌÌð2ã /sXóÝÅ£_¹[Ö“ÎÊÑ7î£Jt‘Š¨Òª-CÇ ª9xùxUÐIªÌžIì¿þŽý˜’=¸š@Únp51º¿øŠ®&Ä3à$÷œrHº‚å­¸ö•À¦ø°ÇòOÙɪd¡™´ãÿÕürΓendstream
+endobj
+808 0 obj <<
+/Type /Page
+/Contents 809 0 R
+/Resources 807 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+810 0 obj <<
+/D [808 0 R /XYZ 124.802 740.998 null]
+>> endobj
+177 0 obj <<
+/D [808 0 R /XYZ 124.802 387.308 null]
+>> endobj
+807 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F11 615 0 R /F37 462 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+813 0 obj <<
+/Length 2239
+/Filter /FlateDecode
+>>
+stream
+xÚíÙŽãÆñ]_Aìµû>ৠNl @’7Û\‰£Ñ®DM$®g7_Ÿªêƒ¤¨½`$aeÕuwu©jDÅ៨„ÔÌsY9ÍY¾Zí¼ÚÀÖŸ"(­˜8»°¹Ì»0`Þ„¹X|÷ƒrU`Áªêá‘@Ö?׆9v³µ¿ùõá'
+~.™“Î!ûa¢˜rÆÙJ #X£+ˬÞT.Qpù³ZäõXNxËpµXζ—3 ËsËË£Ë=<QÐ
+LÃû¨« ™–\ªÊJ&4‡¸$ÓFB«™àNY!p¦½#Z+ÎWÞ1/9èË1ápÇÓ¦‚­¬^2i¼Ú Ì|Ï
+"瘕ÏFÄœaÖxí–œfÆ(#¶‡•$+KŠ!À
+‘Ljím¡¦“Îkd²°¤SBrU¶µe’;náÊ
+—4P–²Ž
+ž¢Èµ¢îÂÒ`’ÌöÌnÓXp5ëÿ‘Y_/€w€ÀÁ{ní$2ЦH{Ÿ m·že
+éðr87Ž›ñ|XB°ÒÂã"ªŸ)Þ{!+.úÙ¡ñxÁV–Cêê€5à]€u…Gû9MÀ©K€N‚W Ù­ ÖÃÂÓâ~”žÄìäïeE* *ƒhªÑbEj­*Ç ¤î(e£|¾›_¸á ü'p†“7qb”¬_5ÁìÚ»¼x†}u‹@ðÅIÓmvømïG†
+×á?—*ŽÀ˜)6”ï ~)S 8â)Ï;ËÍ#KÔ—³Dyž%N ÙK³
+ßh¸mJOªÚá‹UíÝáð</j‡³Ýi©¬ `Tÿ”¦nvTÔ>ÄÊŽßXÀű­OÍ>›ý–j´xî4gQHü
+Þ ÙiÆF
+nnSL§y‘^0¯ÇÅsé†â90 ÈXòÎbI_|Æ
+>¹B³ÃþǨGiÓ¦Šwôœ_¸Ð¿á!Ѐ ºÞm©Œ'¤¸v³O¥s€BµpÓIJxÇXP>6ðÒy5øñ_ÚnÕ–6g²ÃO8¿äøŒ©DîO¬ðæ K‰(H¶B±Ÿp»‡÷È÷:N±¼ŽÀ€UÔÏT_?œ¶ýX*sŽŽªY [<u$”˜×êA(«ÆC®Þ‹zWú ê"P^ÂIQ?Fˆ~Ý÷§8ÂKõˆj<ìç`dË6Z =¦Ÿã°=Å›idD’Ì ³í:ßï‘ÈoÈyæÍø5g‚›ôî潈‹¥Ôtë hD/¶0 >à Ô«x¨_÷Ԇ귤ոÖôéK}"Áë» ~æaÄÅÝLÛ3öÍ»t¢á@üÉÛoŠ'¶§¸Õ£ »ßG[Ðz 5ñ
+B¢¬áÚÕ¾k{¼Úbr¶J*1
+YŸæl€‹º.kdÕŸâ"õ¹„Zhpú>mE÷Ž÷2%Åͤ÷‚¸©›‡ñØŠdi+©íŸL06×Nq‘·´‘ |^òµïŸ.D$Hÿ‚ߎ¿¼ÎFAÈÈö„–´!b’!q´?Û8Š=¸!ª†Â}sÌn¼dc7ÉíM%AÙoÑ8º~!ãäx¨…ªß¢÷áS‡ŠZè|ù§>Î#¹Û[̉‡ðÓ mƈ€ì˜ dk»yšœEå%æÒû—9é.Ä·ztb‹2š÷Èu)ÁY€wúnN­]­áöCGµkìú~höÏ»°#T¼K´²+oðîn6o¼"­z—Úö'
+Aï&‹Od“ü†"ÍÕáx®æWºêø(ÅWb™Ü.ÞØ9RËv©Á ùQаq—Í%2ÛdÜøê÷Hì€ö®Ê«‚“¿ÁäõŠy,Nóß1HºëÓ‰œáñã;Õp‘È©EM‘Œ”`,¤ï7ÈÈo%¦vIŠÃ<FM]â›:Ü}y÷R[=þÙ¦eô~²|)1ök{­_^ë—WC^ë—×úåµ~y5ëµÓýû:ÝŸª_æ±cÜ[+F+TÝÌjœL¢!C¡R§eÆqT«dFHl‰_ôðc( `ßTêüŠ¦8ýŠNÕE*tær`)tín‚oKÁ0×0ÏŠ¡÷Cß<.:ÿ—íðq¡ó6hûûO–A'$‚`‚Šnð#Ür{éï‚aŸyªz|Æ=µŸ=ZŽ)7ý[ã}”endstream
+endobj
+812 0 obj <<
+/Type /Page
+/Contents 813 0 R
+/Resources 811 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 794 0 R
+>> endobj
+814 0 obj <<
+/D [812 0 R /XYZ 124.802 740.998 null]
+>> endobj
+181 0 obj <<
+/D [812 0 R /XYZ 124.802 716.092 null]
+>> endobj
+185 0 obj <<
+/D [812 0 R /XYZ 124.802 430.093 null]
+>> endobj
+811 0 obj <<
+/Font << /F37 462 0 R /F39 504 0 R /F8 453 0 R /F32 450 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+817 0 obj <<
+/Length 1399
+/Filter /FlateDecode
+>>
+stream
+xÚí[Koã6¾ëW9ÙÀŠËá›í©úÀ=´ñmwŠãÄie;uœ¦í¯ïŒ(Qr$Áiš±@D ?Î g(òË,Là?` 5÷B2§Á³å¦ì
+»~, …(­¸z›è,•7\[V¢ž ,Aþ`]'(.˜ñ¼Ù +AÚ(¹ÂwÔ%¹“ÎìÚô/Š+gœe
+j Y^ri¼„^æ7ôŠœãVê04æ ·Ækß»ä47FèÝî%íÜpX)
+‡»lš\’àäÚ$Q£¤'r`-…;¹Ô§¤s{”·ã½ §õ+JëY¾K:É'•²öhgh:¡í{lcXm/n e;¸ìGÇŽýU‹ø•–,Òƒ{ö¡;Cšó¤óR°:µÞZHÊ®Q£òã—NY“n”ð…¥0w›cH9FÔžÓiYÌ/I$•ÄÐâ®k §í¼ŽVè'îÔƒèl—ófõnwCÏOˆ
+
+endobj
+816 0 obj <<
+/Type /Page
+/Contents 817 0 R
+/Resources 815 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+>> endobj
+818 0 obj <<
+/D [816 0 R /XYZ 124.802 740.998 null]
+>> endobj
+815 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+822 0 obj <<
+/Length 2133
+/Filter /FlateDecode
+>>
+stream
+xÚíZKoãF¾ëW>IÀ°Óïr›ì»Ñ-ÉA–hIYôJòz&¿~¿ên6ISã  @a€!Y]¯®*û+YTÿD%¤fžËÊiÎBðÕúiÆ«-–þ>™EiÅœ §+‹µò†i[Õи%–ÿVÝ¢ Å¢dGäUíE"lñU’9éœÁÊSÿ ˜rÆÙJ¦¼5º²Ì
+éMåágpÝe=ëè…±HözËízVO–뉆ú­zâE=q´Ø#‰¢¾g(ú‹–l¡î-õ
+÷5 õ`KÓõ©’‰¡©3SG;ÚÍKö93ÕëìÇêg^mÇÿ̯þqKäŸ%‘?`WœIϱp«vìßé¸(Òš¦Wõ~9ûæ;_¬ª–‘o¹ùq~¾¬N—ÅÏËïg[ñ,]„»÷<f¤¡2p4H²Ù“ÓhAº
+šiÉ¥ª¬dBó`ª ™6
+
+­f‚;…3 œiïDË@q¾òŽyÉ/Ç„£t%®‚PÖ3/™4^Šžæ3A(Ñ+rŽY©ÃИ3̯}ï’ÓÌeDïvOÉ{ƒX!)„@Š"#˜ÔÚÛbM&×ädqI;¦„äª*nkË$wh²es…‚ÍåR£¢§r`­„»¸Ô§¤s{’·q/¸¥õ/”Öfð]Ò‡|R)kG!.Š¼ö^chŽ›·m¡ÎÂu/NÛÌñoú°„`¥ÅÇETßÇÖ w" =|‘ž)mµ)¤CORšqaœ­~ŸˆîijIDäÚ­‡4êŠ «ƒÍ+í`ûë€Ñ²à”Ð îf÷ƒãN:íü«P¤’Hœ€;FøF­*Ã0׋ZÌmûLן¸á+ü'è†ña€Šù]|>n#ó±ãàÄq÷xäünu$ÚöÐÜwêxÒ
+%?ša‘§¡Ñx^$„¾ Œn£["o£Ûdá60º¥õO90Ò¿k`¤ËÀç f¼1.NSœDŸËSÜ<J1ÂZúÓ
+endobj
+821 0 obj <<
+/Type /Page
+/Contents 822 0 R
+/Resources 820 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+>> endobj
+823 0 obj <<
+/D [821 0 R /XYZ 124.802 740.998 null]
+>> endobj
+189 0 obj <<
+/D [821 0 R /XYZ 124.802 609.196 null]
+>> endobj
+193 0 obj <<
+/D [821 0 R /XYZ 124.802 437.695 null]
+>> endobj
+820 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F37 462 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+826 0 obj <<
+/Length 1986
+/Filter /FlateDecode
+>>
+stream
+xÚíZß#· ~÷_1Ø'¸QEýVót¤Eh{ ô!̓×ëÛuⵯ¶¯{é_ßÔŒÆÞñ%¤ `°ÀZ#Q$Åâ´©Ñø£†ŒSI›&:­rNÍêi¦›,ýyF‰uVEâ§+‹­M^¹Ð´à“u`’7ý"xêòÓý¤nZ²±Ì<༌Š&F¥§áÁ*} ‘²)x×È$ß$(šcÿ±šõó•°îøÖájÖŽ–Û‡ö¥Œv¤E;R´=“Ç;*û ò¯\: í iP©¯IhÏŽ4^3 +3ÖøâD³w~­|ó<ûºùF7÷ÀñÛé毿 ßâTZ™¤3“è`3
+PðÊzÓ……tþ¿i oð&vôû÷ ?mö»?Ž®@u‚£G—ù²H•åßË|™¦|yÊ—' §|yJ¬¦|y‚õ7™/»Ÿ•/»Ÿ‘/#šù˜$@V2rn,1Îb “F„ÌÍ&ãxÊ+GÇjÙGtr2Öâ
+­ã´ Okaæ‘a·FVDÈœefZÅ´þ 6%øâP‘ Õ±Pd윻S†G%Iä]ÁA ”0)¸é£L¥lSbà¼á ü Nax¹hp¡K:ï”69óû-«`5Îí=·)a{`§ƒ"¹Ix5˜¤`PœÀk’¶X,ž‘ÙkHßx¤Èï’Ü' ™£ÏÊY#_…FÍFc"Øyaã öÃÁ’ËV^È‚†ç£ x»Ô'†‘wry©@ƒ›Ùã`FöNx9ãSƒIà’BE¡XŒdŸQ÷Чêl¥ø®{ü¯Q÷¸_´îñŸ]÷¼ªç\ÊWLdyô4*ŽP~žUG™½™s(D2x
+ |J´7݆<lp@׶GeyXѹí–PpÁ»òˆà"TqDE*l60ˆs(¼6b®¶| çôü´ëà“â Ûëp¿ ŠjÍ…Ã ªÌÿr*,¥ÐãŠO\b‹Á¾ "j˜¾•X ²¼&Õ[YZ–׃‡ÿ,J‰'(Bîdßž§?BÔ‰Øt*8ò¨PDi†ÔÞ’ä›Ùðû"Ñá¬ðúõØ¢ˆ…½M–,öydô=d=ÇŠîŸÊÃINˆû¼¿.@Î~WKáÕIV^П*ï}™`¢½”ÈgÃÜOó¿½ÅÂí"¡fÞˆ±±å»cÙSì-bžº©4¼HÎqn‚ÕþÃŽ…vð]Øq)*n;´VۢȊɿ{ÞEÂ+çϵÈ_/;Ût<‹ê® ¾H\ßbþp&
+ÇÂÂó¦ªc¸»­%§b6çwçÇüV,bùë4dç6ùç"9iID8gElS‡Üˆ~þŽÃ
+endobj
+825 0 obj <<
+/Type /Page
+/Contents 826 0 R
+/Resources 824 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+>> endobj
+827 0 obj <<
+/D [825 0 R /XYZ 124.802 740.998 null]
+>> endobj
+197 0 obj <<
+/D [825 0 R /XYZ 124.802 387.437 null]
+>> endobj
+824 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F32 450 0 R /F37 462 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+830 0 obj <<
+/Length 2857
+/Filter /FlateDecode
+>>
+stream
+xÚíZÛŽÇ}çW ö‰ „í¾_' ‰ GûfÁ,w–›—5ÉÍJûõ9Õ·î0²d?9X {º««««NŸªž‘h8þŠFHÍ<—Óœ…à›åvÆ›†þ6YDiÅœ § ƒ å Ó¶Y@Oà–D~iÊ ñŒ7J°8³tòf!´J=+<C—dN:g0´SÎ8ÛÁ”·F7–Y!½i< ®ü,g¥¿
+Ö™ƒÞÚ\ΓáÅDÃâ勉‹‰¡‹Ñz4£ªªþª%¯°V¨Ò—VXŒ¶4Ÿ*™,45fjñÙŽÖ³û~ÎLó4û¡ù‘7wˆãO3Á›¼òÈ÷ØgÒó@"ܪ€€í†CEÓtTßÞ̾ùÖ7«š›û(ws÷Ãüxj§ëoÞÍþzS§çÙur9çÁ0#¡AÒšCW`¤› ™–\ªÆJ&4¦ ’i£ Ðj&¸S ™YàL{‡ Z†çþrL8-qÔ¨g9ó’Iã¥ú\`&%EÎ1+u/æ ³Æk?˜ä43F1˜=ôä½aZíR,(TEF0©µ·u5˜t^“‘Õ$혒«¦š­-“Üeëæj6—=P»ŠªžêÈÑjÕÝÕ¤!$ÅìIÜιà5¬ÿGa}?ƒí’29ä¤RÖž1CyìsÄÐíî^ÒÂ"O^ ³ÓÀa•%þE‰%+-’‹hÞâ9‚¶/-ª gmA]ðˆÖ²‘<ã°î†8PeT#Žj¤b–+ïD0-ê¦ø±A©cT@ѳœiCˆ±Ž¼é7qÛÞ+(0ˆ¡‚§ V@Æ¿ÆZâ\È%áÚÒØàÁÈpµÙzf´µ b˜³@†àŠi¨Þ-Fd2BÈHà©
+1:á"M;â`Ñ %mÄ€Þeãc…e€a`:n óʇÈûJB'öc™s¨é@áÛÖäX”BÆ€½Öd.ª‘®ª‡§oÄ`‘çœr—Ħ´Å,KôXª¹"’¿§% 4”|¹âû¾vI¨ 
+Þ5ÂW(AÎ1¤µ”vËë…˜·‡å-ýî?~à†·ÔDCÐÃ-5®+9¿Š‡e»£ßÕ¦{“9L,s®þDÐD"ÕÎÃQÇh¡«MO"»..¸ßìeòíæ‘š]ž&dãÝSœswZ“5ÅÃ)Ù¡´O‹˜´Èn'tÇ8ýáM·Üó®¢ò}•z[,Ô‹mð³-ÜFíѪç.N¡fR~EÍ?Ó´o¾"ê©Z
+Ad>‡‚ÝþT5å
+`”4Ú¡È¢…×—é)ýÅa:`U¬[¥ …p…®6ÿþó=”Ü\{5?ôQ¶òsGâ 2µ²6ee²µX¡?å•Ö{2g“»ÛÍm1"ëSVwa“n“ö}Ä;ÛmŠàß÷ š4/ùì@|§ÄZ–‡®=ªÞ­¦
+~´ëtÌÓê¦ð0l
+.QwJ y…rÏ¡™ýîò½)ŽÝ_(_P2»àÃõAõ Œd [O•*K…`ÙÎÜvŒ/ b³IxÇÁ¡"&þ²õÃ’–ù
+ÙÐHgª¿Z"-C®çÔ¨V|xQ’Þ¨t¯kÇSç¶Ý•û) pê)-8
+‘BŸà\Ò¾Ö³·£Ê(F>=ãV `ܯ~z¦;lúâ÷¿>=çªg‘ôZÑRÞA™´¹ô¿'1Îwüsa7r’ à¯ÜùÿÈü/ߣ6úendstream
+endobj
+829 0 obj <<
+/Type /Page
+/Contents 830 0 R
+/Resources 828 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+>> endobj
+831 0 obj <<
+/D [829 0 R /XYZ 124.802 740.998 null]
+>> endobj
+201 0 obj <<
+/D [829 0 R /XYZ 124.802 547.196 null]
+>> endobj
+828 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F37 462 0 R /F39 504 0 R /F32 450 0 R /F23 440 0 R /F11 615 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+834 0 obj <<
+/Length 7398
+/Filter /FlateDecode
+>>
+stream
+xÚíœKoäÇuÅ÷ü ­8€Ø©÷#YE@X@da{Aq¨ÚR!)ìOŸó;õïf8–6$ ¨›§«n½î³î­‰» ÿâ.¦²!íz û9ÇîêÃYؽÓOÿ~·&¹ä}üõ™/ò¨ûÒv¢3C£Éï?Ƽ»Zöîy
+û4¤IhyêÀîž…Ú?Æõ[AT¿úöìŸ~3vs?[Þ}û½Û}ûöwçO—Ooþðí×gÿöí±ûÖûØù ç³îkªqîª&:c>Cs_¤ƒÊn–}I!å]KûX¬»™ö¥fleCÏR2g3ìËè:ĶÒÇnôýHAûÕ÷±ó‹ÔRÈ3Ÿ Wg#íS)>c}îëŒ9>ê}ßR™§ƒõºou”ñ<¥^öµæŸ§ýŒlkS·#”÷3F‘PûTÊhÇÑÊܧ>
+“<N©ô}Ž)äÝqÚ¥íSèÒ²ÇÅ-nÛ#tØ£#ãFžŒvÜî㔞ä0íçö©.x=ÖÿGÇú͙枰äj—rníÍàãöÛ¯)†ë»·¿T [ç‹çÞq÷õÌeéáÖ*ãÕý,5˜ê~”:únh†bÍ‚Ö½Zƒ‘ÚõidŒ™lS¢NRú5%¶XDL²€<à$ͦ¸H¦×Ø·œµ‘ž@.sjcßólk#5ííÐäâØZõ>ÈìsM 2MjVé¢.°¯¥$#±çZÝMgb$µÒêšødO/r÷:{ ¬¤º°
+²#„éLmêd5Õ÷!–Í°¦Ö¦¡ZeÉ2 y5ŠµTº-&/$Õ6,­¤hâ¹Å¡ê¥lÓÊúR°µC²¡9 ˜1„a¤ˆeç¢5e(ùÑI
+@jV õTuÜn•ó¢>’™)f; Æò†˜õÖ`h#”ˆ•Ý¶WúˆD^7'(Ö0Ë"§ÉÝ`JÙÍrJx %J\#ª=àž³Ûå˜Úìþï#ŒÊ<¤~Z É –­œb´”炦(sœ»Öž¹š[_XÒD
+Íä·#9õÔ¾u,9T ’Š,)F)ÒZ™y‹ÖBSH3G®PfA]‡°Xzæ>aCÛ\h5[š‹–äc2‹ ]WG)}¶#1ø@Â
+Ò“#Û!°¶0tÅVBš]·h'4´-‡Ža.j£o¸ÀѲÛÍ},R—£d› ±+¸£¬Ž]›Ì
+—‰è K© ÑßžZæÈ:H­i;:›T“â«_ð bÞÎmº ŽL š² îªÃ
+(Å ™Æ 8ö0(ƒa0–ª}
+ÚÆÂ’¶ `,[Y0ã2Ð@vaʺšë^fÈj4‡râ£Ïd²/qÅ°7­òt7ˆ4e;Ád]!PvÀ‡5 ¬Éx9¹,:ðnörb_dÃ×¾C\!^]û#Éü)PîEZû‚ÊýP [ —jA˜íŒ¤:ÌïDÿ‰Hu;éݲ;«¾mR\—Ôc²‡¨QC„ãZËûTò¶3ŽÁ×=íìþ"ÔM†ÄÉdGÝô¢m2 <¢L3¹€aË1 Ë#—q‹_­wFÜ·bï}ƒ ï¾´F³O ’ ùH&¼
+LŒ[£’ü ÐÊ®±i¹íƒÉpâd “
+E¼µløÂä´E?Da£¯‹&kBÝ^D$ºuL ®XDXBÄ÷žuæÞň||Œ\?õ¥º¹Ñа¦ƒ Ž´e§x(FXÜP_—ÜÒ8]ÜôÇœ€iÂ3€¾‚âÒ1*¬ÕX ¾‘ŠKT‹TT7š†áÎ6Ñ@R-iL`Œ…’6>ëÃŽ¬¨ûJQ˜,º—xDö> ’ý "9n ÷¶B <¿ ÈôM&BÌ-Íä¢Ç·þ¿aÝÿ…†8ƃ×4½!e¿ôzEk—¹jÜtÉw RˆåVòŒÓܦÄ*_b^í27
+8oi.(Ù¼`´ëÒjxÈË…S»µm…F‚A‹x‘›BY€µ$ 1ÆËqg¬›ðF r\\ºtt¢µÖbM[Ù„ÑsÇ6ä\š„”®ènåR9­©‹™tÊ»
+x\æjñ¨ŽrÈF#Ó
+F¸ •Âƒ¨ºüÍNzSPŒ8,nDL&$eDB…["½a9¾¦âö ?Њ
+o`ݪ
+P0-·
+>¦œëîtmÖx\‰ö˜i*N®D-G0OxHR”Ø(cõ•“Ô^jÎý§]À#qj*EÜzîº%£É¡$yϼs€Š²‹D6T±÷ºŠú&n‘km¨Ëq¶“/?µ¯‰[Nü’ Òºy•Ye®|=³NZ(7‡ƒ.%J‘—iõJ„>œw+¤ÁÈ÷*BÊ:QWBˆ€¼ôHZŸ‹¼Â†¢fR[[…Ji¾
+º)ùO~3ç7gï~(Í<¼ „­Õµ2<Ÿ`µKmäªc¥Ê!6ïm×fMÒ¢cáضIr€h+âm¿DËvØ6Ê‚«Xž§qL`/ÆmŽ®@¢& .ÁÎa%
+³Å¥$t\>”xÕQòzßG– Š"ìç c’BãYdÎ<Ÿˆh
+œ:×êWDô®•ŽQ”Z„À]­QÒ«Ìy–ä•Ò£‘ 5ê Ê*ÃqV[ŸËšas2´¬.*²+o&ÿR)ÂÖõŠ‚Rj» ÛSÚ\9Ôê”`e_Z…¥&9Auf­¬8ÝÛH\U*GÑ5® +žbu¦ êÔSkW¨‡…1Ü*.D‚œýŠ-ë(?_¡ÒÅS)K*.Ì뙋 ž"ú"aRÜ<ó»/ö÷롽¨¤’)™´&AÆЯš§Ÿ4ˆm$"\CÅkµÄ ºªÙ²I’ýl"Q⇺s½8 ªf™)uò£P¬Üª …hÑ'ÝÏ>âzö!•"‰Ldp-SÉŠ­%¯$÷²ºÔ^Æìêjþõ”W¦”’#Íq ÞÑòXlPÛ¥8¾f^e€™¹*÷3Z“)Í1m¿µ(&Ï‚5~âA…dTìF:7OkÕê²SæØ&e5ܸÈç²úÈq‚rÜÊ7…•N 2YàοjQ´‘°É@¨sß“©Ï#ëÁ¤[º/zz¡ð7~r(„{"ù4\Q8K)oá“_Zh¾:CÑ¢”¥-†ê°ìWÚ¸Fa†¶²å'(À“…£ ˆK_çõ¶ÇÝ Ò\‚Q \ĨIu×}dÊ"¤˜fíNó–•Ê‹ý|zúµW®&ÓxÕF¯ð°ŒµsÁÔyn[V)­ß[h!¼ ‹<ApÉ–HXÓˆŽtªA,ë(
+ªž:Q40ZŠŸjs )øg|šæÇu?ùê@¼:¯Ä«ñê@¼:¯Ä«ñkÄßLJù³ÿ½I)JÎâ¹+¶ÞÞÿhøöúP%vhùôðãõ/Ê»DÕU^oÞºÅ{W¹¼ëÃ/JÈxµÌ“ƒ“:²K׆V¸…5MåË“)]><ÜóùñÑUp¿¨o Ÿ–¶yBw×/jÓâOÇŽ[.÷“$\âîŠç-7(ÉÔê¾ïé‹þk8ÿöÍlç+µòQ#Ÿ_:¥/.Ÿn~æ{9ÿéM+[
+ÎK¸{“ÓùÓã‹ä_ð*{ð¿Þhkk¤¨µç'ƒÉ¢“|Óf¤qþöðËãú…T]<‹7d
+ÿFƺ$#÷Y³ëmÀûõãÊÒmƒ^ÝßÝ:_=ùb:£’Ã9ƒ=­†7‹ŠYŽláIÆÏÝYÅûm ¸âIÊðòÊ®·éJ—S€)ÍÓE]?j©ÌE-åŽV]=î™Ã»÷Ÿˆç^¿_>\¯_.—ˆ¬Íy¼ùîöÐP§_Â$ûpM.rƒ·?nû‰Vîñ'üí†miؾæ¼ÿ¸Ðöœ õüòö–/í9Ñ©ï+eËZï®ýý‰­°~½_Õ–—4xû¸À•0Á§‡ëÃYƒ¯FëûAN¶˜uæªuï§9dæ?˜¿»¿¿\ ]k7ñõñ{™Õ§/>wšˆÌ ù á‡/øÞÏoŽyæ§ëË­›Â§³Ë4:žÇ%lwCÑëÎÝë;u¦ŸôqŠûÃa@žÉnŒ$ì¯o±ýt‹÷ŸYÛoï×ÄeZÖi·÷ç½8¿Öó?n¤—ÈäR>eEZ>]þé°¡¢sù¸>¸|ОN%xeÝù}¥Ò½}7‡´ýùû­©ÐCë_ÎÆ ?Þ<½w>ý3k;̲À½æ'¾YÏf?öôŸž¿Ã^œÒÏbª.õð›7R‡‡N'ÇíM]<ˆ"© ö ÍQy<“È~ªƒ¼PŸè–''ÿ·.ÑZ <‹ýËåaTؾ§­ØàPJpZkð¸Æ»?”ødiþÞ<lBEqÃaÒߨì_>QæË
+endobj
+833 0 obj <<
+/Type /Page
+/Contents 834 0 R
+/Resources 832 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+>> endobj
+835 0 obj <<
+/D [833 0 R /XYZ 124.802 740.998 null]
+>> endobj
+205 0 obj <<
+/D [833 0 R /XYZ 124.802 339.994 null]
+>> endobj
+832 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F37 462 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+838 0 obj <<
+/Length 3854
+/Filter /FlateDecode
+>>
+stream
+xÚí]oã6ò=¿ÂÈ“D¬ø%Q-úÐ;´Å-ŠkƒÃmQȶÖñV±|²³Éö×ßÌðK²è$›ÞKïºûzHçƒ3œáP|QÀ¾àB1SˆE¥
+V×f±º»(èúú‚»!RIVqü•èÌ}/4˜)kó·›‹O¾2‹šÕ¥\ܼ¥‘7럲‡+a²ö*ª´íþ¾[ãO•Ý6øû} ³ÕUγ~wų]Kíc»¶=Ç[
+“·ÜÎüà€3¨ò Î]
+€Oðy(*8sÊi¸ysÛRÞÆKà°Ñy÷¨²Ÿ¹Tqþ±uá‡öÒ·å@ájMá*BqáßU;t²ˆRå]<‡ÈYøT ä|KðZ7t?(ìuÇpeÍ@ŽžÐA×Ëãã…Ç ö›n¿¼E§O9ûib~.;>à‘öÇ“ñSêø@ðøÝàÒC{êy$—äŸ@jëy°cظ?|}öºHêStvÈäêÜdsÀ «„˜7xÜh0X¯x¨[®±o.%Ô 6ØÝ mbsKÁ´·€aw&·x6˜¯"†t>ð|ÜYÖuD’NžGR HäX³üÈðÑ%2¦ç"rͪRGŠÒÉÅ3²EjŠcóÑ‚9!dÙ ¯âeDG:Cy/c2Rw
+w2L¼ð¥íI»aè ø¢6à¦]Ó
+tˆˆ‚˜úøq¸$0ùÙãÜP¼È]õ¨ÜÙ8Õ{î7îš6œRíº §½r‘ö‡çΓ¶ I÷á$NØc†ÔmÛ5sz+žDt½€…ˆ4‘^Í`¨‰¾/Ì5¥@²R^ã€kÎÚnîS0ë€Ä¹&$ß6£Â쪂ã)WU)ÇÍùÍU yï@nÜ<™­ìa€#läçâsLelaÛTlTqȘý^ü~ùˆn»çnÐÜâÛƒ?§$+Šé w$`mCIŸ³R4Z¹¸³LçÈXqã(«š;›…µ…µµxK« ”açf…Õn[·€¹=8Ì6ʆ¿{Ÿ¶ÆÀ‚÷ìÛö˜È ï¾øÀÕC ‚u¶ˆÓÿæbPnÎÏhí%ßÞ]ÚHDÈlçã?φ0:7÷ÖœæHëW”r Й®>.VQ<«ˆ—Å*åΓ6ª'Ô
+“Apã
+ý{+ÍŠ…4Œð{ ˆc\éÅÃÅO‹_ŠÅzß]ðbñÝ0Xp çuZwc „j%ll‰õ<Œäs g”¨5‚8ìWE ‚spã« h–Zš
+7/SUm𼩥¨A¸áE½‚™À +G@yUÉ#2€ðª¬¦k‚(J¥y9¢ ¥£
+[T&’
+ÂóX‚ˆãJAžš ,OoLT9êvš ‚"GË=Ž‚g,å#ž‚è Ã€)¨p$À Á å ­ ˆ¨¦#ýKo"½ì-å[£¹zÔѦ=cÓ÷dFáY™»›±·ñb ° º€)xì༢ôª;Ë
+{ÅKVj!¿>YËÎS5ºª«ôJØi^²ÐÃ,µSG,Y&Á]ÙÿDRzO.Òœ\îV`eY¨úÌøæéIô3QÑ‹[²B)Γ¨©ïiÔïgⱓ,rHçœZIäÔ÷4òù†”å®@xÕTž<uš×I?ε*Ðgׂ^þ‚¥’šàã…H| ªä:V¶Ï/sV+q*IRÊô:VÌϯsNAZ°º¦âØ?B—
+ÙF9zV³ú
+_²¦ªŒQøË6f5ã>SñµGPbûñŠû/c`ÚiqËBÃû=ãv2»D1QKÃ0Æïµ WVïܧukÜƪÈn¬¯U
+Êh¸²ý_\cÒ³ˆÐÁ$YgûíêxŸˆ¢y”ÒÕ!¡»ßÇ‚®±nW[<†±÷ÜàF[3…®XÆsó¶ô Œ‰5R
+_Ra'=DFÝ7^mëʼÖYK8»ôé“ ÚLEá^Öu÷­ýà¸% 6wų±ÙÑÆ¡Ù“yº:ÈÀzìç»òdzëU¼`J8±Ã£Üîùᦽy°Äa§O¨v‡'uìõ»îƒ“
+$¼ž~W,
+endobj
+837 0 obj <<
+/Type /Page
+/Contents 838 0 R
+/Resources 836 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 819 0 R
+/Annots [ 840 0 R 841 0 R ]
+>> endobj
+840 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [447.509 468.23 459.464 479.078]
+/Subtype /Link
+/A << /S /GoTo /D (figure.144) >>
+>> endobj
+841 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [322.588 337.72 334.544 349.675]
+/Subtype /Link
+/A << /S /GoTo /D (figure.150) >>
+>> endobj
+839 0 obj <<
+/D [837 0 R /XYZ 124.802 740.998 null]
+>> endobj
+209 0 obj <<
+/D [837 0 R /XYZ 124.802 395.517 null]
+>> endobj
+836 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F11 615 0 R /F36 457 0 R /F43 618 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+846 0 obj <<
+/Length 2923
+/Filter /FlateDecode
+>>
+stream
+xÚí]oÜ6òÝ¿Âç'ÈÒ")‘TótÅ]
+‚»ó[ÛyWÞU£•ö$9Núë;Ã!¹úZÇÍ9Nš+d)r8Î794?á?ç"a&ç:‰Y–™óõþ,>ßÂÐgÜÈD2ÍñkapåG¡ÁŒÊæû볫Wæ<c™’ç×·òzóSTv—
+dÍl ~À^a`eÞço-YÈj“FÍÁ-Ö€½oTyKC–[ø‹$J ×ãpb—Ý„-BLJÁ„‚Öëú¼Þ ƒÚÛ×€Pàg&1#fí‹þRˆ(s›®wó²ã¼4e\¨#?Šj΃Œ%Z:ucw·'R,ƒÏW*c
+–¤¥•…»Þ9ªQó›ÊÊòìŸ×A¹g2Ñ Ú)¨¶"õÇþvë
+ysóëëE $)SS ¬ˆõRËÆb'á|7åÒJÇŒ§ "B²Œ/1ˤLð
+˜â 7§ÐØI1 ¡–Ûé‹bR+vjôC²~ãm„"e„òË÷dŽSý°C ö(?™4.Á~ÒÓvmíÞûÚ 9`&IÆŸ‚ä”þ85ÿ(nsëšû)”D?)+Ž\â|EÓžDÒ'Ò#¸3ŒñÑU.SО~WnÒõôädsrê»}Ñ–ë™_ ¢×Ñ¡'t,(ÍÕCº¢žHWžWÊ(äMH¾¬”»¾-ëíg²úT!›Ï ä§ '„ÜbØô9F‚þ3†‚E’>ÉœõsDËø!Ië¯ÑœõcÌ9¯·Õåg ù29_}{r¶ÁNZ‰Ø™2KÿtBþhlîÀŠwþ°}Ûù
+Ò'°‡R9 ¹ÏûQؾGpûÌÕ¡)nÏL»NÕ„'·ø GØN†ƒÄ’f
+£,~aÒAºªmž™»hSÑð@=ìaמ̂°MƒSƒSÃ0ŒÐOøá"WåNòa:¾‰Åq¯³6w ~ î”­OVhû2vn“mÃyP4âÁÐŒðmìAÁ·¥\œ~0N^ Ó¡FÂ?. Iª¥÷ ¸¢7Dc‚¦»ÏX¬b½\=–
+ì¸ÀÍ7eÝãœCÃqäb^E„Tr”JÝ·eHj…÷r£ûX÷‚XÓ`~ð}i° )§×@ GÈ`ãp¹ÕðapŒƒ¡ûð5²sÔ áãÎvž:3!ÇÙ$Wø„ZNÍBèxîC¡ÏkbgBó'…Jyz‚)=¬û]Ì„Ï-ÈIãÁÁÞ­˜{ZZJOrGÜôú ûŽ¨OÍRd:Q©ûׇjê_1]Muôº|þ"d¼\jXœéEí—Ö0±
+Ðy@
+endobj
+845 0 obj <<
+/Type /Page
+/Contents 846 0 R
+/Resources 844 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+/Annots [ 848 0 R 850 0 R 851 0 R ]
+>> endobj
+848 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.153 667.053 192.127 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (table.58) >>
+>> endobj
+850 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [341.739 386.184 353.694 397.032]
+/Subtype /Link
+/A << /S /GoTo /D (figure.148) >>
+>> endobj
+851 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [176.414 330.393 188.369 341.242]
+/Subtype /Link
+/A << /S /GoTo /D (figure.119) >>
+>> endobj
+847 0 obj <<
+/D [845 0 R /XYZ 124.802 740.998 null]
+>> endobj
+849 0 obj <<
+/D [845 0 R /XYZ 188.272 473.302 null]
+>> endobj
+844 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F38 464 0 R /F39 504 0 R /F11 615 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+857 0 obj <<
+/Length 3104
+/Filter /FlateDecode
+>>
+stream
+xÚÍYã¶ù}~Å`‘°¢Žû°²iƒé1@’ mÍŒ6²5•äÌî¿ïw‘–,ϱM ,;¢Hêãw_´¹ÖðÏ\›¨\Ûë,Ѫ(òëíþJ_ßÁÒ÷WF¶¸Ä©ÌàÛ…ÅuX…ÊÓ÷|{sõõûüºPEê®oniçÍî§Å®ªn_ªÝrän±YÚ|ñ‰ÇÃ}…ƒdÑÔK³8Èˇ–Þêü½ã©áƲ¼]®a|@0
+T¿$…Héì7`|Û²Û‘žá¾7sù¬½*² >+@ŸrQî`žc‚œÊ³ †@Ë\Ú‰òQXuŠ¨%?ˆýí~O^
+'†ò7”ÁáN¶dlZŒt]\›,‚Ç™À#u‘‰
+ÊÞ
+²—¥å\îÉøÀ©ö+¶ŸÔ)çíÔ|/ç좫†cw ÔØO“rŽ§Áç!ïDµØôd×ØsF‹lPD:–$`ÅV™‚™~s_uHN
+ßw|Žo[tª¾
+“(x '<£0I1 y6·QÒux™‡!Ž
+'Û{r½¸ÉÎAov&.MÌÝÎA»º¥·ÀÖ’5nî¥r¥“,†™u÷X£’,cBÃI2`Æl,83oˆG¸ç<¤âÜ­b`Å/ 1Pz/§Cº „žÙQ…Daà†zèY’‚ìX’~·GíCŸÚžá0‘dd…àžµõ_˜°z@ùž% n‡K1%óæ$-ora¤K1D£¨8#ùŠƒwÉÓóìG³¨p—8ªþž1¨v¡–]é­¡” 'ú€õžÍ’-qB¦) c?>"~-$M¬˜ëújx7§Ü~²qÂ3;€Ù`};‡ÁÁ†à°mл:¤&Ñ‹õ/hPò…iZûvéAö 'ÔçüËòü¤?I‚A¢fWö‡ÙkŠ~v¶t“éÓ™®=gŠ 0x|y|„ŠÂsº ;PØŒøèÒ“¯t&;ùJ|M‰È‡.•a²¹¾å]\¥˜‘Kmø½êN‘ßï)¨Ã'M€Œ¸£ZIž¶Õ²]j¬µà?s¤ƒsJ‘÷84ѨðVyHÎpw
+à ¤|7\XyJ“RË%Môg
+fqÜâðHã9+¡Þ³FåÖÜ÷õeU.Rƒ‰w©R
+©’cÉâ|w'þñý“¥±»¤vªO}»:ÿΪõZ’W(èg!ðÙøÏ0§’¢™Èp˜ž ¨PÞ.Zéÿ-LZ-›’gMBÄŒsà)ðV³r"mÏB-ßß·XÍÊ ­Œ‰åÀÐÊ90È£“¥þvëÈ([¨4ì˜Uv[6Mµ›Ãö¹Ê’àÁ è˜ƒÖª°v¬<hïz–÷M}wOI-zçOìÁ;öè§:Š¯w4±“¬XÊ÷592JåkðÁIp:R¶p&,öPVq
+ˆoµôdp¡íªph¹€€š%#Œß!˵‰ '’Ëù{,³p€IŠ¶ä©Ö—ˆ;®7 0³¤Á®&¯3†¶m…@Ê(Ò“ý·­¸rÍs\âÅC­¿/Mbf=¢/}($ÄléÔPv‰©… Îòp‚¬MÌ…â60Ùäm„&ÈÔC5—pàéyxÄLÈ@ã’ƒUf§å!kE/ ÔÅÉ¡$Û†Žf'w7cC›
+(†wÙâ_Øx­ø#®¸‘× O°¢õ¶iF¤B„nšJN+­ÞPÃ5̲—=kç†v×Ü‚'£7ø6I2O^†r(J-ë~˜&žg(]•Z2×»šµR r½Ò1‹d©…hp½Î 4XÿÇSWFz5ÏSà],tJCNv!(¹ò
+$Ò˜8Wo >¹Ï*Iýd‡:P¤ßW”iÖÛ¦&=~ÅÇÛ7»ø\í>­(Gî‡7cPÉPýðÖ>s[†IÜ‹~žû_ßâ{Uz¥éD#O½2²dfç4pÈC Žüø¯ùºFÑY Àø³?$ê5dÆâ3Syò%Ž<š£*Ó/~„¹Yžƒiá(Ž1KmzW öi¤¥UÎx—¥*Oýh6ÕÊBÉ»CrÏ™X…“?—]¾_Ò'nOØÛF·"7^¸U£®‘Œs£ïb·˜\Nl`žÚ¸t¸IÊFŽ{ü+=¶N1§ÿÌ•f€]SGh´¦éâ/SèOå$ÓK»žúA)‰ŒˆLsªîëHašIdÂ:WbÀOS‰PùÄÃFâ[*`˜`h4äç¶;Ñ¡
+
+gªaW¹/"9/š@…¤â’!¤*+²ç‹IÏ„TÎq€âž/0we·“;3Ÿ©ôìÆì,ŠBœõVÜøþMâ&ËÒJ
+Ø6†JáÄrHîs£Ä+‡[ÈtÛ®
+rúTÜ#Ðgâ†Î6çyÀXü_Ä6eñ’ðÑÞM¬ÕŽ›K’E†|0AàTaþˆäeå9Éc6•›Åwe¤=Ë_f4vUáàû0÷ç: o]£—KÜÊuäÖÐq¡ Ä„MTL»äܦ1¯@
+ö„v )¸i¨Ò, °Ùô
+Ìû EÕù),ê"T’Œ`·ŒŸP¾ïƨzd5ß̹f
+H¬?] lç\¯RØØöw5ÇžoP/V{7>‚ʆ—Á"ý¡³
+endobj
+856 0 obj <<
+/Type /Page
+/Contents 857 0 R
+/Resources 855 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+/Annots [ 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R ]
+>> endobj
+859 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [159.351 414.139 166.325 425.264]
+/Subtype /Link
+/A << /S /GoTo /D (figure.61) >>
+>> endobj
+860 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [170.643 414.139 177.617 425.264]
+/Subtype /Link
+/A << /S /GoTo /D (figure.62) >>
+>> endobj
+861 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.935 414.139 188.909 425.264]
+/Subtype /Link
+/A << /S /GoTo /D (figure.63) >>
+>> endobj
+862 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.964 414.139 216.938 425.264]
+/Subtype /Link
+/A << /S /GoTo /D (figure.64) >>
+>> endobj
+863 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.815 342.685 387.788 353.533]
+/Subtype /Link
+/A << /S /GoTo /D (table.60) >>
+>> endobj
+858 0 obj <<
+/D [856 0 R /XYZ 124.802 740.998 null]
+>> endobj
+213 0 obj <<
+/D [856 0 R /XYZ 124.802 457.103 null]
+>> endobj
+864 0 obj <<
+/D [856 0 R /XYZ 251.839 262.932 null]
+>> endobj
+855 0 obj <<
+/Font << /F8 453 0 R /F23 440 0 R /F11 615 0 R /F39 504 0 R /F32 450 0 R /F36 457 0 R /F38 464 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+871 0 obj <<
+/Length 2007
+/Filter /FlateDecode
+>>
+stream
+xÚí\KÛ6¾ûW¹Ô,†ïGZ´)ÐKQdoiPȶv«Àk'’Ýmþ}‡CÙ‘eIÖÆÝuŒ––H‡Ão†C)Ö§ðÇúŒKb)ïI‰s¶?¹ïÑþdýÖcE!1Ì?ÕdFë܈kb «-£ñ%(ÎùŸ{ï?Ðþ
+þÞó/mÿ~S û¾'¥#NðâyÖ{×ûsCŠö#ƈSª‘ V¢@&ü*JoS–hªú‚(k<¡Ÿoz¯ßÚ>4«EÿæKÝLß~r;X.³tÈãü[&Ã7¿÷~½Ù2šá †5­of
+ä§:ðtãyúòiA²Ã´Di{ n4 Áíçæ—ä6ö‚™-«¬€Œ­<'–¾ºp’#6˜dé'?Péb^åˆ J¨vÇà)òUBLÛã`Z8`Â芘„Û•Ó§E:_ÎÒ|gÀ¤!&èx{W@—…­íˆKÀÙqÐ×­39èæü®Úm‰‘üœ|¼zµG$”95øÇ!„ƒÅmH½0n´by•CN%‘TWŽ`œ;9N³Zs"²¾®@~6@ŽýœåþIþ¢ŠÎá <æÞ/†
+wUˆg¢0Ö€çØãþK
+}Ä«Ë^Çç òü5oÿñ
+±ÑRCœÙ
+¼,qÅO>õÑ^Ÿ†!6øûÍ+T”d4÷éÃ(ðé(OFø~”cšŒÂëÉã]†¡<"¯ÛjÉÅbiA&ÍË)¼ÔÂã( ÔÓ‡ð~2š!D¦w˜Œ²dêÓ»d4Cä,ZE±ùç×~TfCnwÑôÆïPlŠ[C|ÊŒõ‰Të
+è¡4vgô°•G‰' üÕÑq!½G‰«…ˆéu_@aè°ÿé€ ÊMjE`A|îÆ`AŽ)#Q·Í!³Äq·M1 ?@¤ä…ŠR±=} *U" (øèœÝÓ'$—9P¶rèƒêÂAiÔìªÖ=
+ e]* Ùn ÙAÔÅGŠ(pXC`@ßY A®ÁG‰pþ°!EDx¡în„"¤À"¦Àbù$R+›mTqœÀ{ ¨>«T=dÅ6U4ÆIa¤Ã(™ EXÛP'+0
+ʺÏ8e;t]°Ž6.Ø<e×&”ÖÚ<UÃîfîøŠ*,±cA]@.ôB`7Û‚ ‡ùôM!3ªRT†ié:ÆLŦÓc‚b•÷6óø·{‘w;¨îüœ6/Åß܆å,¡šìâ ¾MïÀ×[eÅŽDïP þÛ’eo}er5)N|=˜7Y„#0?L‹ÍúÂÇÜs‡žÁt¨AŽM^¢"úqX¬±/Ñ;Š×e2í¿¤%K»(5½Wf‡'Õ„Ùæéý¥endstream
+endobj
+870 0 obj <<
+/Type /Page
+/Contents 871 0 R
+/Resources 869 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+>> endobj
+872 0 obj <<
+/D [870 0 R /XYZ 124.802 740.998 null]
+>> endobj
+868 0 obj <<
+/D [870 0 R /XYZ 245.82 417.041 null]
+>> endobj
+865 0 obj <<
+/D [870 0 R /XYZ 246.429 124.781 null]
+>> endobj
+869 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+875 0 obj <<
+/Length 2230
+/Filter /FlateDecode
+>>
+stream
+xÚÍY[oÛ:~ϯ0Òk£—W]60P,г8ç¥Xl€}è#˱ ÇN%¹núëÏ\HÙ²dÇ=imQ"‡3ù~tÕ@Â_5PÚŠTêAb¥È²t?^ÈÁlýëBycH~õlFa7F™Œûh”I¬‘’FÛ"9$)Zd6AÂ/Ÿnå`
+„\Ha@Ã-Ì¥PY6x¼0J
+­­ÿ^^üçâß + *I:eGùÐ) |xÈÛ|b¡A£Ì
+éÑ?o.þþ›5ƒDdÉàfFD7ÓOçz©aYˆ
+ÇÍýrcUßq¼¬68Ü×WK"»*K¯òõ
+Çürt{óª¬R‘é¬Í1Çq½Ê™ÓÝÝŽaø¾iÎfÂÆ®W™ºÿè¼uÔ¶²¢ãËpÄßéZ§d–'Ö'/J¶¨6÷k²ÕçšLXTÄ`lOô÷\ßã ât§èäå× ‘M‹Ù(rFýþÝlÃÖgAëÕÝ{ßüO:Y|ÃéS‰Ôð-~À²!eÔØ«ˆ¤|Ô¦ "_¤¸&S)¬Û·pMš¬ªI-?îxõ°å¸A¶øÏ+"ßâÇu× ïß ÅªˆÎQpŒ»tÏ;áøåÎ !+•d6Гx•d´©·È5qXM§4ήٱÑÞmÝY.Ò¿ÈEºë¢e,(V?Å9Ë2õÿd£Å¹¦¥Ø8¸ø‰C-ò÷ Ž’©@Gg #¹`ʆ{{]ŦdJ5ìqŒ=Ë1æ9ÆtSžtŒûqÇ”g:ƾà˜ò ǘŸç˜ó2Æþ"ÇØ®cB{úÉE-§•Uþú¢Ö£`OQ³¯*jnvX L¬bhB øëÈ"22©nx.{Üû;¬t
+ÇÌ>Æ"Ä’2‘Åf±ü¶xØŒ0ÐF‘1fèþ1Š¬uðçâág˜>j&©xg6y½;kÉyè
+ë¿MGVÄÏò¡ 3ÕÉpÝá]YËD(eŽ
+Ê^í“ß­.Ûù[/¿jäçmù«À8ìã°ðm¶ ¿¼à[Œ½>dõ£MhQmýyvO8_¶U›íØ)ˆ¯™·÷ j ÊlZc‘{’¼GÕoOTëË:TZ°ÉÉ/pº,¦ìXßÐvÑÒªâ%7Íöõ'RAi‘H³¯ªwÅ·'î„õ
+ù¬ìŠáö„‡ºnÕh³À ¬šŸùyà­F·Y¬ “h«Aç|SV‹¯¸Z,Ÿy±ž{Ö ·óõr÷Õ\¸Aw†£“Žª¹ MHeK¸<¨Y3%È-Ãõ!(3HøF|Á“ ã¿’Y>ŽàAµ©êžkå“å’Ý¿**ê\;^ƒÄÀÌO„]s¨˜ä(lî3j³÷˜ÛK·ŽÀTA™°ž×ÿù¾éˆ´ ± òÊK †Í9P%€Ù´j]õ÷C^1tq|âxªÈ3è÷{ìV¸S¯y|X|—ÅÄ3™OàëÈ© °</¡ñûà²XÏ¥´Ã)žx;³2è-š8}…æ;AY™µ­{=-  Ê¢ëŸXÄJ'^q)Û’<Ï'Þi!3¦ü¹O|EDSѸªSÖnª’?ð—¿@7ˆâLååÏÖeGA• Ù((„èa¸8¸{»€ª³êÞÒtf(Ò­Úâ£A;hjðµ6PΑ~À@M1P5dP7PkÞ˜O*žPzâÈñ²&r’²˜ÔøÛnÖÈòy„ï»^é-/‡ÅŠäàѯÞ;Äk^”˜ÍÎÖÈ© êzå9Ø»11C¬ò¦#á ¸k^ëDÕÝGþ‚ˆ¿vúWš
+}Â؉XÚ3º¸P¦¿‡û“ýIu| Ðb—ô[ÄB¦/_"¶BÛŒE¿Fûìíõÿµö/ÙÞt´O…s!G'\$ºi
+‰žè—ãHŠÔ¹_ {ʾ$àO¤©m7ˆ]I
+†°¿ïª}7<±FgÞv«ª>]Ä·ó•ºbüù7RqÕ-J&F(Ô
+endobj
+874 0 obj <<
+/Type /Page
+/Contents 875 0 R
+/Resources 873 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+>> endobj
+876 0 obj <<
+/D [874 0 R /XYZ 124.802 740.998 null]
+>> endobj
+866 0 obj <<
+/D [874 0 R /XYZ 236.716 484.991 null]
+>> endobj
+867 0 obj <<
+/D [874 0 R /XYZ 239.096 285.108 null]
+>> endobj
+873 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+879 0 obj <<
+/Length 2653
+/Filter /FlateDecode
+>>
+stream
+xÚÝÉŽãÆõ®¯| ´*¬…KÅð!8“1lØA7ÃŒ1 ¶{$Q&©ÑLòóy[qiªÇ¾:|õêÕÛ—’žÇðÓsmœÊc3Ï\¬¼Ïçëã,ž?ÂÒë™ë¬Ê4~ÝX\Z“«,Íà¥q^=Ìþúëç^ùÔÎv„ú°y­Ûº85»ª>.~}øaöýCG&1Ê[9â·ÙÛ_ãùŽúa+ L]á=VÚûùqf•¶¹|f÷³u4RåÏ$ˆƒ|Ê@½]/–:ª:ª7Íbi­Úý_\´¾Ôßž&ZY†Ø஼ ë„\íðiúÝÕj±L’è ¶ˆ½n
+9_&d˜/µV>Iˆ‹¿Ÿ6‹¥qyô.ÖɇÃçEî¢;
+ŸŒxJ‡²i…7Ð>*„µ!ÐN2f)<{ïC…®NÈj\ùŠ:.[`ÄT¼P¬H„‰Ë` \Ûàág¤R23hh°£Z,œüo `B× ·À(C…äÔèR¼6€Ìž¢šdM|v9§Ü°z‘*½©,w7„¾ö]!w‚ðg%ŽœŽp$=#„òݲ<˥̲èa_2kH²84¯‰Og¶Ì#ÆuÄä´æ,¦¤|„ªô´îsîiöÕµ¼¹!Ð*8Õ>º%AV@ÎV„ç&¸wHŽ[†ßò[ ¢Y½ÓÖMÓ–6)ä-#iã\”5ã rŠÊiÆ7|iä Î20{Ëð‘
+ÒT–D?–«“
+yæ¢ÿ2ü5VSV–žó þe€u£‰:¸7%Ô<j$×£k2`Ï¡Këž³Û—¤ÈŸG¦ZK]àÈ‘a%“š9°²¥}B `¬“¡«¥`Œ,5·í˜¨¨VOS{¤ÊçÁ‡KLM®†¤êYmTšêQˆý„9“ÁDÕyœÐåµØŽ ÞñX…²_ñ“z—A[e'Jgƒ._8_€ÔëÐ5˜À‰Uœ"Ç®^$†b ‘ü0’ÙB3еwSb©Šó »f_lªë”„®Âu$ˆÁmKœÅ©Ê¡ÜÊêŒ#ªèïXE® ÂꌥìÏIöF z" ¼„žÛ)õ|LÝQwÑ‘„úÔ”Ÿé4zÓ2
+¥¿,äD×%¢—š„ úJ!'a‸õÏ·T¯ãÎeñ}Ú:Pê„ñœu*ïê¾ÅØ`j_»§¸éâ ÷\K 0Ü´'FB1AZªú†ëäL6éØÞÓèC¾¨›ø@"%í VÇñ虊H±6¥9ª[åâè Ê»œ¬‹œÅ>¦B-é†$l±t5¼í>  ‡œÏÒ`ÐþêCNÁ“]j¤¥ š{«Gy/Ú¶PÀ›ÔöFà
+´<Èù[ud4¢°á±£:Ñà‘RwõŽ¦\Ø06ø yÞš£ÀKtôfÇ´ª“pt-›®zÍØ“¦"¶¡Ý2|±:B0á·ÌB·€4nø=Ì‘+ÿCÛtï”Nwmx%]
+­÷ö…—#7‘¨hÍpôK<–n¤ßHK†~³Fã)N¸KGÉÖ¯l÷œ¾º¢s•¶€mŒw¶ÀÔŽ}:Ó†ÑúNGãz[´·ŠµÈuâ-÷\¥ i)Õ¯÷%XsIFÀÒO{Tк¬se…^h®M•‡ÇãÌP¿²"âAEkF™úPs÷ Šín”h¤Ô»E\^¨k×¾‚S7YË®‚æøL?›l0¡ö»¾sÓny*_0ØÐÌu][}Y·—:ô n0¬wÕ2ÁP •l•[žjX*¦Ò
+wëiçgÈ3I„ßÏíçWÕ§‰¥–‚FöòÝ茗 Û#û1rÎs
+ŸOH¿„¿½q›Ñ´ÅRÅÙ3ïr ÆæçÞåÌÿ±w)ïMbàD ÙìwNé÷Îïaï-ä—po±ú‚
+…ó¥shÙ|ÅI“';gaaÝí£xõkdšþ#!{‡r9­’Lã$hÀÿRˆëFV¿x^3Möö[;ÉnØûŠ³^”-5aï ]B|ëÄÓ?1ŽÿŠy‰0f)”šÂÿPa„ȥѣL3¹ÏZêÌ(ã-°›ù¯¹Ö²>ÜÏôÿ~…N`Ô½(Öáæèá4!¥­‚¡LÖ jé¹…G?Ò×íúÒ2p7¸.]úç4xÑõ}h•Q9ñ]Ü‹>8Ýk•úÐËíª03øp±væ?ûVØJéK¸ É4Xμ0íýø÷Øù×üO˜æC¸õUSæÇÃÀ¸É .Qi.¹ùV°™ø”Î3e,ŽIªr—ÝúÃX§°”¹/ÿ=—øç´uÛl6þú~î<µendstream
+endobj
+878 0 obj <<
+/Type /Page
+/Contents 879 0 R
+/Resources 877 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+>> endobj
+880 0 obj <<
+/D [878 0 R /XYZ 124.802 740.998 null]
+>> endobj
+217 0 obj <<
+/D [878 0 R /XYZ 124.802 593.261 null]
+>> endobj
+221 0 obj <<
+/D [878 0 R /XYZ 124.802 456.157 null]
+>> endobj
+225 0 obj <<
+/D [878 0 R /XYZ 124.802 397.924 null]
+>> endobj
+881 0 obj <<
+/D [878 0 R /XYZ 124.802 183.01 null]
+>> endobj
+877 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F36 457 0 R /F38 464 0 R /F32 450 0 R /F36 457 0 R /F37 462 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+884 0 obj <<
+/Length 2533
+/Filter /FlateDecode
+>>
+stream
+xÚíZ[Û6~÷¯æÉ"®x'»èC‹ív`Q4tÒ¢Ðز­Ô²f%93ɯßsHJ–,Í-;—4(D¢Èsxx®ß¡‡F ü£e‚˜„EZ$ÄZ-‹Ym`êÇ K¸àDSMLÆL*"‹bC‰¶¼¿æt­ ÖÐÖ ã6úïìÝoI´‚u¯g á°û¼'„Z3*-2 w³·³Ÿ;FISJ¬”7rqD pñoaõ ÕD3q"BFߟÏþöOYbÎ×nÕùêÝü§Ë7y¹_üvþzöÃùñ<À@é(î8|¾(œ-îå|ÁÌüãå"†Gv*—DXöâ(µº[šdëô
+NA³K¸¢]èâA
+lÕÆf³•[‡Ú,´*S(X :; éq”û¬Ž¯1âCÞ¦ûqü.óŸÁU&ÔÂ$ÈÞeÓòê÷ UóûEyÕ#íE,Gý»Ós®Á*bpüÚ[6æ|Þ”áYZÍGJ±BtM
+£mXì¢`ïÇŠttC Üg›´É? V†B@ ¨S4áû|qˆºÆ <ˆû)¡w-Ëüx£g1:j•v¥£?ÚÍÂÀŒÛÙúøÑP2ÞE®ŠÐèýŒ&Ñ¿?›ïÛž¤NÐcÁaœGK¨¨Ò°®Þ@ÐêO¿3wÎpî„Op)W|Ò_™p§ù^)¤ÎægëÊ­*²λH¨Ž.:û»³<h ê XÙ§ŽÝò[̶ô:,ô®±r Ò«Ÿ.ðùù§~ç°|`J& 4 ”yГfhJiÀŒzdJˆä/Û–
+1—<9 ÎÊ0wÛNõø4ž´£ìŽ3µQ+ÕÝûÜx"€§¶—I 3R1ŒÕ[ÙbÈ,wpe>Çÿ7Ç4mä™ùµ k_#4„/þ2ÈàÉ}¡ ŽiåÖôëÒIýÃc€"ߥÕD™?KDg½«_¦+%À&Ãd×ÖìC…s9¯):”¤æß·PV]´¿ÜX‰)}H‡òïÚÚåO3†øÈYÞ Ì±Ìy.ºßàæƒMÛ6üŽÆâMº_•ÅÔ¶“½ÅâM m`wr|&ï)„î)Èöþ‰Ð­í`ØkE.
+Úp’>†IÑ;…ä¾i8T8`£†
+Ã0ß»¶SÛù¥Ç¹ìگ꒼ïKŸDüÀÿê…¯î¾t¿É*?ÄPZež‹yäÞ„Å©V™/þ.¶6wÉè[\ƒaº
+ÁºÜQ§rŸEnn^ ô›RŸô¡ÂàÐi
+ñ•Æà°ë™Üãô›ïRF ‹‰=|?3!å ²{Îcù‹ÉC…^‹ÃØ
+¬ˆ-¾Ù„¶òÓí䛨@¬dK;ÑD1ñ„]XQ'²—Rñnr›/qýû¬®ý-Y{ ×ô®ÜÖ3þ§´ñµÛà–­(.S#¬ÍVán.ð¯·>)Zw€on†"؈q6Ì‚<A$2¾Ãá£,QË1ÞµM¤
+Ù"ÑÊ]Û
+ˆj–ào1êJA£à>£ŒòiJ
+ƒoBh †i\X§Sá£o<À#bÄSá=îó^ O¼Â«B:?Û9Ø
+endobj
+883 0 obj <<
+/Type /Page
+/Contents 884 0 R
+/Resources 882 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 852 0 R
+>> endobj
+885 0 obj <<
+/D [883 0 R /XYZ 124.802 740.998 null]
+>> endobj
+229 0 obj <<
+/D [883 0 R /XYZ 124.802 593.719 null]
+>> endobj
+233 0 obj <<
+/D [883 0 R /XYZ 124.802 399.61 null]
+>> endobj
+882 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R /F37 462 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+888 0 obj <<
+/Length 2525
+/Filter /FlateDecode
+>>
+stream
+xÚíkÛ6ò»…°Ÿd bÅ—(]q.¸´H€CÑf; íÙ–½Jmk#i³Ùþú›’zXÚÇ]6N¯W,°¦Èá¼9ɃþxÀ…bi,£b–ei°>,â`Cß/¸‘J2Ãñkf0’"e&1Ð
+§Võ_–¿\¾Y¼ºì%Ò K2 I+‰}ü 7,ÁH¾/"žÚŽ|~¿ˆ¸d2Q«L
+“èR,SZé 2Œ+%’`¿€>•ÈHE‘ƒ}´(æ ®[GªÞ9>~ú4¬(õÎÉ4K¥JTp»xü`ãý‚ÇÁ?žúÛ2­.ìz„,ã<•ÓûXÆ°Ì ýëH~pûº9ØK²ó'–ãïϱŽ9YþðBì¯p¿§ßÀpô‡ ¾³ Êʸ/¶5yåÁú"k©ç¦ÀIØïÓ’(~”ûý
+ÚQ(qh¿wÞYÕžëºØ¸&¿xA”¶uNœ·4gÓ^!6¹bBdNŒ5P!ÎpöŽFŠâØÍÿ–æG]XNsF“ÿj9,w%éûÛ)µ%vûÃ
+ß#•Üc'ðo¾“Y'"žqÆ“–ž÷J X-Y}rð¦‡×1K3áŒ_]·eul&«™ÇŠÅâp©†1ì4–§<€å¯RòÁ‹wäöqðfs!:ÞB;f<C‡çÕîs.üã("p–i}/šÛrÐc,kŒÐd:M
+«?\C CáOeWÆEfá¿gE2eÔã¬\b”½»† Áö”0ªs=; “&yœ›¿Ûü÷‡vÂJÊÄ™g`%B7ˆ5ˆ…Ó²ßÛ r )ÇtÊ‘bª»{Fô:*–·Ð=¯BoÔa{“ ¸Ê¦\­ªj_äSWLg_Š×Ùæ¨Ê<Š‡œÇ<“ó<“ÝOÅãv_£Ýi³™3}ò¥Vëœé×sl –˜±B¥äë%d™¿ž#jœÑð°õkA[ÿ½Ký¬ö~|©ŸÅâm}³|d•ÿ/û¶„ìðëûxs(êrýµÍô
+Œ}}6c'Ï¿i>¶²]D_Ò™rû‡lž=ý±À~–ý©ýw¹£?ÑüM{·Ÿ‹eç7yÓÖåqwV›Ï±qqñ3us•oªÛ¯oß?Óô/½;KG£€þg–þu²ôÏ?ÛG™`\‘LĪ×pâI¤3 `z.tø%mJ:ªEÒh0Àq)yØby,êÆÆFZŠx
+ÌÙ¢û{JÅ!d¸J ÍÃ`\Û&¢iØ.;Ž)­)mó_©pn¿r‹éº\·7u ë€ØuWü­Vp¼Ôáû‚*™m7ˆ§‹ ¦rÿG”j3ƽE¼®¸i¶ã
+$(YÙ2 “$t¯`”e €ëÂ)Š®Œ\@oåÄÄöøèä!Ë°tÓ¼Âò’ès#™[‚)•åáõk¦¥úÞYÇŠŒD¥9ê "í¤ì©5“’{Ïn‹OƒŠ˜eÂC0Ʀ8Àܱ¯„÷¢]
+°H“‚´_­¼nì¥Jé.WHè«¢vW1¸Fs* 6îvf[ÕÝ ¼ Õqíîuúëg‚‰¸°¾˜â™§<ä»b*1€ÙE-[éÏ{­TmÖÁ m˜Ž7ãP´KYÕ5zaX5í„€æ,íÀÙ´< tRZì‘Ðxåa×6T=çS¡¤fql>Wð¦R8öÒŠN³áØ©}Eê'—¸zZKØvS®÷!Ú/~1(¸á> ÀŠ*À$pšBçkšÄ;´€ªÜçµíl«©$B$,U^5¯×íÝÏ
+¨¼O‚s¨L†+\ÁžÞ ÝÜ{cÊ2£GÞ8ÅÀ
+endobj
+887 0 obj <<
+/Type /Page
+/Contents 888 0 R
+/Resources 886 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+>> endobj
+889 0 obj <<
+/D [887 0 R /XYZ 124.802 740.998 null]
+>> endobj
+890 0 obj <<
+/D [887 0 R /XYZ 124.802 611.07 null]
+>> endobj
+237 0 obj <<
+/D [887 0 R /XYZ 124.802 469.713 null]
+>> endobj
+241 0 obj <<
+/D [887 0 R /XYZ 124.802 401.995 null]
+>> endobj
+886 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F39 504 0 R /F37 462 0 R /F32 450 0 R /F36 457 0 R /F38 464 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+894 0 obj <<
+/Length 2744
+/Filter /FlateDecode
+>>
+stream
+xÚí[ÝÛ6÷_!ì“ T¬ø-µ¸—஽8´×,piȶ¼VN¶6¶ïþ÷!©/Sþèfã éb±–Äáp†3äð'qHƒþh@™ qÄ-"’$q0[¢àH?Ž¨«Â'šâÓ
+…±&<áýX%*í+Ñ Vj$1ç0 …L˜Âù‘“±„'MY(ÑJ+$a4’ˆèØÄÙQ[Ö…E·°å­ÛMÑlä—#ŸÕoßWc6òÔ-F^Ÿ¼n{¶™9{i­N½ ÍÓ*jƒtö\w֤ƎØļΠªcÞí2ߺÛ17¼HDyD–¥^ Ë—äX[IðQ™‘„Tv ˜Y‚,gèHÌ¥¤Ãb ñ)¥7M,gÑFŠèˆC¼@ÊOŠål¥@¸B‘‚ÄK:“S_enxY€Gë¥>ÉnŽµáä‚È(QG!•^ çÁ“c9Æ`òsœ¼D«ŽV=H&†!™|
+$30¦Ê,l‚
+ox’< G9ÖVNBhÄÅ1e¨OR–B°cõ—v/©Ÿfi·fI·–¦•ÎúnÞaO­ïÛ¥Ys'Š­Ì*¼Ë®º®wW»&°‚*D|ø‡ö=®{d½ê•÷Uk­ÑaíŒ B€ðY÷ëãáWHA’˜±"\«ó˼šÇש¨Ykµb˜¢`åî\í~+ðB¨«SCò—{˜ÎØ{/&j„¯8¨] OWæ…çU¹5ß\Ü'-/ÀH"lÔøXu¬‡ÎjóO
+IGâšCˆB ÿ,'º™ÃGü³î„²jÀ1
+#†pÌÍMkܼp§*œ«»æÛšpܦûõÄ/A„ý6iÂLb ó•Ã|”& óײx¼³9ý¼TW+`ÀaJÙœµlR†é1x¬A˜Ax"Ÿ”'ãéÎÄ¢9&‘Š¨Nuµ ¶g†´èðPñˆ‡}ÌzõÓMfolœ³^JÍY˜l³5œzQ¿ÛÀZc"t/¥Ô0íLˆÙÍ (|†(MN)^2yºQ­ìÑ)¼iñak£­)iNHa°ÏæxRŒâ!¤¹mvïNö­ëÆäx4l2wj˜e z¶2$ó}ÎéUµŽzÝ9+¹!]›X1~åNÍÛü³Ü³­jãlÏ¿­©²~tsëØ}[ßM è8¨ë¯9
+ @É0Æ´Ÿ¿Êøpþ*‹º‡“˜&±f‰]b¢"!pÐ2.4æê3†­JAÜÓã^YØÖœaÃz>íôŠ~=²iâ±Éñ‹O¼|P Zš8™=Y®·"\ ?ÄBÅõ 0$‰ DUÙC密™5Ì~²aȈ ú‚lC8xµã~8ë°é­I3tÇ*û”¹šßàUbøÈý» IP\–$؇VuŠ €qéÁ…¦‚…'L¬˜
+ .éþÂø'ºÁ 'endstream
+endobj
+893 0 obj <<
+/Type /Page
+/Contents 894 0 R
+/Resources 892 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+>> endobj
+895 0 obj <<
+/D [893 0 R /XYZ 124.802 740.998 null]
+>> endobj
+896 0 obj <<
+/D [893 0 R /XYZ 124.802 493.371 null]
+>> endobj
+897 0 obj <<
+/D [893 0 R /XYZ 124.802 275.207 null]
+>> endobj
+245 0 obj <<
+/D [893 0 R /XYZ 124.802 208.341 null]
+>> endobj
+892 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F32 450 0 R /F39 504 0 R /F37 462 0 R /F38 464 0 R /F23 440 0 R /F11 615 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+900 0 obj <<
+/Length 2317
+/Filter /FlateDecode
+>>
+stream
+xÚí[ÝÛ6÷_!äÉ*–ß[Üî PàÐëeßÒ>hm­ížl¹¶¶Îþ÷!©KòGšw"‹œgÈß ÅYQøÇ"Æ%I(Œ¤ÄÚ$š®F4šC×Û $B
+b¾ tÆ‚'Äh?@¶Hó¯»Ñ·?&‘%V‹èîÁQÞÍÞß«l !ÇÓ<K·ézÂÆÓIÌÆU+´À1¾ŸÄÜT­é ÈfÙ¬êâÉøÉÿžN€j½éz¾Dasß^.²Éow?}û£àœÂ,¨ ªl&Š‹ü ˜Vév¢ø%8¦–âŠÁD`)6%P/‹5AºÑw ”&ÚŠ(æ”áløGTurEàÁ‰³^ÕHVú†9¼¾ J¤0رY"©2c /ÕQ>Z¢¹ä*2„ &ÙA[Ü4θa]Œj—Q¢¢ýè}ôf0ðï#F£ÿ|Æ‘ß)#Ì&`A¨†X7Vó¾OžZ7»båWIÇîA@ÍÖ †]ò‚¡ÊìCÙs¯gæ¦bþ¥Ñ@pb™Š(¬UË•ÌeM[î:Ãìÿ[äø|šk|’ôWªè=þ„'±¼™,¼a3¾€Nî- ”ßàS/C]£„HØx1ø@+7Ú›Mù“•nçK|®q0ášVÈûæ{Ç·Ø¥cO ÒLÿQlñ¹ÄOOMÛãÌAºÿÙMáw”Ÿ:­*òÇÌhÂ9wž×°lPÄÝ·9 @
+hƒ_î|cºu\|Œ[rQìÂ[ñà»K…ж»MK€‰¼éð S<®ë!çwPɱ!G¾ÜÀÿ»
+ª  ý‡Ïýb9EÅÞ”L+¥ÛVyÕº
+”eGjqÏ«–HWÙ2±îZ†4Ò~.=Ö‡@sbјgZ4Wô7~‰Énþ jÐÏî]þlÞ5¨ò.zHš”ÿx–áÞžröóð³ï‹"ÏÒõ g_%<¤yó-ñs‡‚—ôûÔc:¤ƒ/îúé×vü=%uÇúÿ_Íñú*pþàBvº:±Õõ5qýüV¿
+®—ÛÇÉ™]þÊÐýgã./o>þª}\oèýrV.^ÞÙ¯$Q#ê~‚c_š³õå袶ÿàŒ÷”'| Þ¯=k»Äý›å´|tK ½
+æÏå÷O¿¾‰-'L¸‹`¡’Ʀ?9C¸»mý;-¡¥&ÐýçËÍ.ë_**¼¡‰­ËózÒ8%
+‹Ãíþ˜@¥ˆÖµû×;Vråk¥¿%Ôã{lZæ3W¡`ÆþöQ‡Ò;ô–“ìú†j#ôxYqú‡“ŽÅv\¦Ëu¶ÅûI¥`"Uñ[2Îòƒ‚>wsk4aFTîÕW¡™¡šoÁýM麩M¶Umò¬¹ï •M½FUŽáŠÃå(Šëú=¹OÄa¶ûv‘IÇ:Ý{FɈ‘Ö•rÕ©äЄF¦WÈÁd§#¡ŠJ·Îëª-—‡iñžÀË믕ÀªGI Ó`Ãéˆq’$6¤‚¥` nOe,ü¯ –Ðú×tvÅ=Öx@~ÜÕ!îi·&15oqCPɈ+!õHqk¨Z¡¸ÖÈ«7Ó‰›ùtúúÜCƒôTé«{0‹*\n.|Ý.üÊJØÉòx•ð
+ ¸2™¯Ãù»…?u3U™Ís×ã ×@KyTwj )Ö@÷«çxrÝèÞ\øê@×~*èÚ‹AW|
+芣Uùõ¬+{®Ú|eü
+endobj
+899 0 obj <<
+/Type /Page
+/Contents 900 0 R
+/Resources 898 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+/Annots [ 902 0 R ]
+>> endobj
+902 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.513 464.988 391.469 476.113]
+/Subtype /Link
+/A << /S /GoTo /D (figure.144) >>
+>> endobj
+901 0 obj <<
+/D [899 0 R /XYZ 124.802 740.998 null]
+>> endobj
+903 0 obj <<
+/D [899 0 R /XYZ 124.802 452.044 null]
+>> endobj
+249 0 obj <<
+/D [899 0 R /XYZ 124.802 260.569 null]
+>> endobj
+898 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F43 618 0 R /F39 504 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+906 0 obj <<
+/Length 2545
+/Filter /FlateDecode
+>>
+stream
+xÚí[ëãÆ ÿî¿ÂØ/•h¢yK ú¥m4@g î‚B+Ë»º“-Ÿ%ßæòח䌖´^6{.XDÉr†¿‘(¾Œà/¹P,ŽÄÒªˆ%I¼Ìv‹hy¤ïܳH%™åx5C ¥ˆ™5 È$Èó÷õâëïâeÂ#—ë-q®7/ƒ_¯x¯BìWÐOÍuŽ T‡¦
+¯MЀ2§[yYÂUq¨ýõ Y…È^;[yð—ÆÉyqå›CüMî~j4jrmYlaŠ8g‰Öd3ãØYZ–ïW±
+Ð")ƒËÈk\»Ú‰Z8aÕ±øÝËOÉTOK÷׸!™Ø†æk¤Ž–ǬÌÿŠ-¾]÷^Ó†˜¥P+…N{»l‰‘û·Û›Ñ2T±»q—ß/„d<‰q¢w]Û0®E¬—"bVK« ºX¤E¢—Ü0]}#[tÄŽ½ëßÉn[Ù"ÃiÿpNM8µ&ö±C«¡'÷:Šp¨l £ë3£%ì6¡Îˆ˜Õ5cÔÄòḮÛnùFL/o/—¿FË ¸ôõ‚GËŸ}úúôŒ{É"{çn±ïWº#:šºkw®«nwùx¯ðºþ Œ´³Ê¤ ªÉk&[’ë¬yÛù—Þ)XÂ5m¤& •¬äÒ²Ä%ï)½Ü| eØnê<`)&Kl‚êU¨¥è‡ Wx/À*ºÊ='fÚËc¦ µ… üè6%#laBÂ_JJ߸0襨WÊ%û[u$뮊=þ:îh(~C éÍOdókÔ’’1-ûÙ´†’¤œm™M8‰øŒE™˜R þ(¥Uu]\–. ƒqAS9ê%Ü:HظéÞýBvÄÌL‰nŠæ[6Øû®£ä×uïDµ:jgBžÛ÷žËý¼âRíÒcèÓ¦b‰RgY'ŠÀÍ£Öhùì ƒ@
+‘ÔC!’œÇHð¬S¶ƒÓ²AZ]¾ždMSéçìp\µ™¿Øäõ43˘YÕfØuõ.-'ÉÍ(&Ñ
+ðP¬:R««Åa®6l}Ýb–óõÀµf"1w>¬t<.+Øú‹~ï¨ü{* S%j£Hk‹ˆ°À÷Tç¾þ뫨ÖCðš*¯®<SÑÔŽF¢‹ßs6}½Ä™U GÁФüÀJ`Åc·e£îÂ@äsaѳ‰Žl‚%ܸºG­ÞýRÑ(Q:Ö®o/¹kRÕèˆN$„S-áÄ’pbl8ÐèŠF½‚ž¡×ÐJiU„]½ŠŽNG8Ö”>2£jjÐÔê³Q=¨ øÙ¡Ÿ“Cÿ¯j€ Ý> Är!–2§ æJ€^_œ»UÓ÷Tþë¹°Ò`¦8÷QKTÎê;˜fJ™NÙ0´4,‰d‡Ïº’Œzšƒ ãq[k@åž*Xî‰/–]g› á|LÄúºÂ’—†R}˜R;•ò"ƒ›-ÈŸyJCEÂ{ÌHH®`ÀZ¯Û´šµýÓ£W8bµƒ¯ÉH Xâó’Œwæî|ã¿Ž9¤dOûY Ux`ƒªIÚĹë
+°}>¬v‡´i‹;èóH£úüüHëU,]}G¼!qÓúÔÎ=I„±s_CùÚå¾8GÈÙ‡ÝvZ©rcö +$‰È9 ¼Îº09ƒŸ€!¼5Ÿ|µ:…>×Ø’¿Å +Þ­´dä¿ÃRkGnV&M¾³]•–¹µ3ož¶LË?Rq„p©]UßL˽€ŒßpàúÓ
+•ÉP8l»ÝÑú€©nïÃÚ(lÄëËÕý'iî®ÕtSœÜÊÄ;ÕÖ1ðÝn:W
+,eendstream
+endobj
+905 0 obj <<
+/Type /Page
+/Contents 906 0 R
+/Resources 904 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+>> endobj
+907 0 obj <<
+/D [905 0 R /XYZ 124.802 740.998 null]
+>> endobj
+908 0 obj <<
+/D [905 0 R /XYZ 124.802 488.66 null]
+>> endobj
+253 0 obj <<
+/D [905 0 R /XYZ 124.802 308.864 null]
+>> endobj
+909 0 obj <<
+/D [905 0 R /XYZ 124.802 182.318 null]
+>> endobj
+904 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F43 618 0 R /F32 450 0 R /F38 464 0 R /F11 615 0 R /F37 462 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+912 0 obj <<
+/Length 2191
+/Filter /FlateDecode
+>>
+stream
+xÚí]oã6òÝ¿BÈ“ ¬XñC"y‡{¸m»E(ŠÃ¸‡½>È–œ¨•­œ-7I}gø¡Kv¼¯w7Xˆè!g8œá|DðGÊQ ¤ˆˆÖ*X¬&Qp]?M¨Â'’⯑ÎÐ÷Bƒ¨D¡‚h!,þëëÉwo4Ñ ®—fÈuö~ú¿ˆÊÙo×o'?^7ˆ€§Ì‹]¬C’ë!ÉëÅ>AJI¤”EûÿäýoQå·“ˆpXû=´#BµVN(WîW9y7ùO+ÛÓ̬ÆÖG8õwo@0M/'JÆnÄÆvwp‘’¶øtrΧÅ¿bš®íï|uWϘš>ÚŸ‹b³(s;侨o-4µŸÍŒNÓ¬ØÁÇQ©–C®h¬‰Çùb®÷Ÿûò ¹i𠤊$L|QÊÿ~°
+;Uy÷%ËQ– +'f£ò…Þ®ˆÅ¸ˆÍ
+½”ež6vT“#Æ[(–'qöuËvh-šD”õ¬¥Ù÷CÙ¢Ñ
+aY¾D9ïÊÚöm‹¿1'vö.k!ÄM5ML8O ß[ Ú±²³]bÂ"/÷ê®.ªõv_B #L0~Ĉ½85.±D!øÓÛ(úÏ‘ýÁt”è8>HÅ E@ŶÜè>*‰„íÂI¬ä1Súõd‹kl €Ûi(|<+dw+×&FÝÍBøäû쀶„fç`'!\&OsóC¾LÑ°a×í³¢£ê¬„¸ ¢–eÑαm’g Gî ‡³¡tÀ-Îb6]¬Ró½)û8¥4þT
+óGëÝ*߃ôM0ë n6¿»ÄŽ9ƒ8UÙ&Ë™…1ƒñÊ1¦:Ÿ]Ýóª*ótý¹Õ½LKþéˆÓúrõž|°Þ¨÷ª¬6£ªO.©úÅ—Vü…’.fLNÿøêŸUüÒ8õtuÄÔ¾“óóóQ¦~~>F4^ov³'¬<ùŠ•}_dvve?Æ/¢lÏAÙwSvr—Þ³lçÑa™†¯oŽý8öÕ¿­Ë1_vy•oëM±¾¹¨ÎÇظºzaª¾+õΨ»këß²·—Ÿ½moÓ¬ºÿ–µ}à-ùj5öBùæókþ) ¿ˆÞOµðäŒWxúYWx¡f„ò d‘ºãCåpq’0‚z‡wà<&Qä_~x]= .éC7߸Òf࿇„`½*Çá-{$:·ýBDÖÒðVåeº±]ue¿ép²D¡<©±¹hLí¯ë_$™Îñ<V;Ú·¹m,Í«ÌÊü¢ WYÐݼóVG§ A™ˆéküýøƷwëë¦(y÷xQoYÛ&AŠ /nžhlo-`·Ùun?F&QÅôÍL ´Rûþ´ö¾©N×æ’ÝÔ«Á+ D
+°›/î²Àw2EàóZÓ¹fp?š„L’ˆ3-E”FÅ®:°ÐËÉQX º,۷ØmOƒß'4
+~ù3¾›àk(Õ
+„(áhPû²4€p
+Æ‹æ:!{£@¡ÕTìÍÌj·x®ŽÅôçµå¯29n_´,Ç•ýÞ¦¨·?g¦¾ ÒV&Ê)[¬ìdÝÊIÊ‘¦Õ†¢ˆ ’æ0îÊ~€†!V8Ÿ½iO²Ý¬^YÐ}‡¯'#}ÆAR<îÝ',ý…Aþ®îÊ6ÄÜoŠzìÔá­Zcùr?,p<t˜ý°à’P8¸&E#Hƒ}cÕ¶­rrØ>ɬèÆáà0ð0ì[†À²v`áé¶â;|øpúVåW¯®¬{Bïy•yçÑŪqŠ¯|ï£G‚^ïÔ®FÎØçó–½ G5Ì;”p*`|´N9Iˆ’âxiwjÊÁ +.ûuÊ•àÇŒendstream
+endobj
+911 0 obj <<
+/Type /Page
+/Contents 912 0 R
+/Resources 910 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+>> endobj
+913 0 obj <<
+/D [911 0 R /XYZ 124.802 740.998 null]
+>> endobj
+914 0 obj <<
+/D [911 0 R /XYZ 124.802 636.875 null]
+>> endobj
+257 0 obj <<
+/D [911 0 R /XYZ 124.802 470.536 null]
+>> endobj
+910 0 obj <<
+/Font << /F23 440 0 R /F39 504 0 R /F8 453 0 R /F11 615 0 R /F37 462 0 R /F32 450 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+917 0 obj <<
+/Length 3077
+/Filter /FlateDecode
+>>
+stream
+xÚíÉnã8öî¯0rr€"G\E¢1—F÷4PÀ 1¨Üªûà8Nì/[éTæëç=R¤ÒŽ“rœTMƒ(=¾…âÛE‡ øcCÆ%5–² Öšád9(†7
+Z2¼Ë
+XÁ=Œ ʬ.¢,(綾_ > þ‰ŽŒUj'‡T
+àž©@8ðsò[ö"ÕëÎw2O…@ZÖêö9ìä<6ÓššRBœQÔØ–¾”éÛ))§ø6tí:Z*%-
+ÎÅþºXÌo·ÓÄgza†
+cýñâÙ4%Ç ªD8佚Þ廊 Wê}^m½ñE”/õL]¬YôR §$R¼á´‹‘RT‡õÝÏÆ•§\å„ b¥j ±·Ý'ŒŒÝ-¸s“ÜJ*$뜣 ŸF+§§é›æ¶Å<Ë›ÁÛk¦É©yÉh)ÁHE%“N‡Ñ" Z »ÃýíãÄÜ?¸ÛßÜPÃK08TúxÃA¿5˜3hZiP/Á›+´Øma„1Ã’*Í(ÿ€IjËeVZ+-••CVPm…@Êq8LúH† I$!‰°¤µÄw¤™ˆ†JàEZÌ‚D$Š¤&­U‘Ö²RxB#Ç)(•º³ªÙàºqT›ù<tž‡ ¿ X1üçû†~oú ‘¬Œû- 7œFBŠÇñ—1²C ¸dôÈ¥…6· ¢ä‰^p!
+ 1ÔXpF%5PÝ Ý0‚wу‘>.ÉÐ'‰$‘“´–á÷×ß‘fB B"•È‹´˜E‰H©–™4 "ÍŠúÀ=Ç$•%¸³ Ü(¸l㲈B Œí«Æ{` Û›º¬w|0ò"¾ ¥e–‚䬪éפAI<2¬®Fn².8i—ÙJÖTð€-;ÍŒ©Ë’!Ú»ÓֈݒèØÕ+0¼ÖçD Þ,î\cÊÁ¦nÃ*‡ýú®–JÏ ¦.ÊþÓ6šßàñQ6êL¬O†nƹÿý/_Pˆ±«OÂôÎ à4Ãø¸©‹²7¥Ä¸i’¸)ô{Ü|›ïú7ßãæ‹ÅMùqS7å3ãfÄ…BÏr(HïaÆÇ–™EÍ_æ.†ŸPu3“wÍmp–4ÙE›äˆ÷g)Àì(¶ º»ãÁ¸÷•¥M`IT" eœÛ]¼XÀë>Ó~BÌ/(-,XåY9¨9dUÓT <n{]’ck˜†™7º÷.jèþÜð>ÓåCÜ5®,Ï,Š÷8¯kS"à¶rCØOæTÚý¿hPE}XöÎ|m~Ù :‡qsdÂAU-F$ |˜î%gØÏ"IÎt79ÓàÀPÍ\`7šÚBjヱ€«R £“EYÆ« 'Gì†vºèГ”IùT’LZ<%²h&4,"™À„´¸µ˜DŒÒZZ
+ÏPÉ0ËÈ”JÞYÙIÚûÆ~Ÿû ±\
+àv®kp(Ü(ÌK%JÀZpÚ»õB6غ
+endobj
+916 0 obj <<
+/Type /Page
+/Contents 917 0 R
+/Resources 915 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 891 0 R
+>> endobj
+918 0 obj <<
+/D [916 0 R /XYZ 124.802 740.998 null]
+>> endobj
+919 0 obj <<
+/D [916 0 R /XYZ 124.802 716.092 null]
+>> endobj
+261 0 obj <<
+/D [916 0 R /XYZ 124.802 416.079 null]
+>> endobj
+915 0 obj <<
+/Font << /F39 504 0 R /F37 462 0 R /F8 453 0 R /F32 450 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+922 0 obj <<
+/Length 2835
+/Filter /FlateDecode
+>>
+stream
+xÚí[YÛF~ׯ ò¤†öÍÆbâÄÉn€…ax°XÀÎuŒ$G‰cóë·ªºy‰Ôµ2{L²«ëèúª«‹b øÇ#.KY•0çÒh¼$Ñ H¿ x˜"•d–ãS1–"eÖX¸AÆáœWwƒïN#Çœ‘ÑÝ=ͼ›¼þs}‹T ‹>œOýý}¾\Âc~#ìp¿€»õ̦Ùj³œÞ“–9ˆE'8ÿaÿ/ƒ¸ÀÊYlval±ó³wãlIô >óa¶7ۼȀ£è%îÑž iœ­o~»û5Š¹bN)¸ræ´¦%íˆþ“Âx#³¢ñ÷[$¬hêîÇ,Ðqœ¯oD
+vøË΂N²J
+ݘšmqñ‹u¶ô” Xh‡ù¢ÅzþY.sÛwÉ=Nv‹|½c¸ÄÁë»Xm˜q2Š…a)¬pý#*‰–³$2’QH”ƒ xF?2ƒç_SÖ¤ÕÍj ³Ú)Ŭu&‚ø1\KÂYˆÉ”q©IÇ´H¤ˆÆËŒ&…`„XL 
+º(&ƒSÂ*pÌ/Í4A¯xZr‚ìJcmpצ•Ö–æWë)×X¯z<¨<Qº¦rVå½Ò¡•‹ÇƒÊíM ™ªŽãÁ|p_%ƒ„éh?xý–D
+˜;ÈƸÿ ß#?xmI¯~ª­§‚ãÁÇù†êë„<Q,¡´Y>å²ùruø’ïQ©aÒZ*Äï©ÔJ ¡%LBêÝcVdÜ91®a‘:<.!w¼m•èøòbŽJ!&̯þ.¼ê´¥pØWqa§öTà¾Ùàû¬þpñʆWÆRÂÿnŠd
+*©³¦ÜáËÐg|óI‡í$5SN\ÃDÈœ·æ§é}ö€ï¯EOXþ|¹)1†Aç^ìÙ®6úJΩÓ£ïŒÛ ¯Ý« ®|8£_Ærn¼£ÌõÍr=ÌÃjº]Œ;±,˜v•=±#F›SAc®4Oˆ÷‡„+8€
+Ǧ
+þ]ñyÙ—Ëž>·ïŠíb={ÒÔÞgÆwß}cG÷f1.îæ^©Ð¿ý
+}¾›nžåóÇø“àÌW«o¬^ûtÞÿ«*í ¼_a…¶›g“|ÿòÚsþ„ö¤HÇ­Bü¥ž"ÙÜ}g‰`\Ògu!ëVJiJÕÕYX“
+Íãoé;èÎÆl¹;Xdêü´ùt ’O‡™¿q : á¿ÜSFÙò9ÑF¾3‰ˆ¿|,–¾qæÇÆ9ÙA?ÿâ×Þ|[îÔÛîXÁ!€RÖÿWùcÇf¡Y’¦a6sv…$¼Ÿñï^ s¢ÔÂnbã®~±õ&¯­œ¾-TØ”¥IZ½…Q•áÊ?ÝÐçÆXJI‡€ ‰!…æ<ß5Çh3#xÅÜóekJ_ùì³ÈàªÊ&Úι±L$¦üõK5õ­‚ÐÊSžâ¶™hÈùtTN9kƒð-V‹báW¾ó¦æ÷Þô;ò—‘þøÝ›qå?Ù¿¦qÍ´ÔQ=úÖý²K®˜Ææ}2Þ×–IúæÏ»k‰=1q˜r뽃-eãľWšò4eìw,Så½D;ãÓbB>J5öûqžoý?‘ƒa—Q³/N)7uˆ¤y
+9˜s2­‡§^áÜ¢]
+Ùž>û)“iì£Öp¦¨ë±nf.?Jc‡2nï²i˜ÛJr™OÆÔl „l[O¢@]ÌÖSì[æí‡kÙ¿ !)6á
+Ï"ìçîUä©(ú¡S0{Ί±
+‰•4ö§•Âz¬œYVs“öŽÕCÍP¸¾lì‹u%¯‡ˆÌ»âPÉp}öÀ[ƒñi vsõªBª½DSuÏY1Bµ¢­´ýjˆxÑzºÄÚ\Ћ
+¼,N%ª«†
+q m¢ÊKT=v3¶ç­ñ†;kô‘Mî©—hú±‹¸ço·•Ž.kݼXÀÕ7ðR_+µåbƒ.‘ðæß¾; ÔVËk»•ö@èè„ÐWm¡~ÿôŽ*ˆ‰§âKug3ª‚Šé¯òHðúñ õ?~zq¤‘8¨‡:ŸªA6¯G·tб{~¾Yë@ž·àh7 —ýÇ©dÜê¾?Æ2Ä’ò©yì˜1öP4·À&mû<ÿ ô˜i´endstream
+endobj
+921 0 obj <<
+/Type /Page
+/Contents 922 0 R
+/Resources 920 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+>> endobj
+923 0 obj <<
+/D [921 0 R /XYZ 124.802 740.998 null]
+>> endobj
+924 0 obj <<
+/D [921 0 R /XYZ 124.802 527.389 null]
+>> endobj
+265 0 obj <<
+/D [921 0 R /XYZ 124.802 325.786 null]
+>> endobj
+269 0 obj <<
+/D [921 0 R /XYZ 124.802 270.057 null]
+>> endobj
+920 0 obj <<
+/Font << /F8 453 0 R /F8 453 0 R /F43 618 0 R /F39 504 0 R /F37 462 0 R /F32 450 0 R /F36 457 0 R /F8 453 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+928 0 obj <<
+/Length 2950
+/Filter /FlateDecode
+>>
+stream
+xÚí›[oãÆ€ßõ+¿TÌ ç>lчld èeýP É-Ó’¶åJt½›_ßsæFRÚZ­»
+c¥xÎœsæ™ùæbšðf” b
+–iQ²4Ùb;+²%¨¾ŸQŸ„ N4Å·„2çÌ­4ü
+úm]|Q™T €êmƒ4{å_ÖÁe³¹´õй©ÕÃÁg?Q”¤_neË]í±zX9¯6¶8M}‹ïÆ5*ȃ7ü² uغOáÊûj ‰ Il]Tø‰Û²Õco®¶¶¾ï4uãkuá
+¾ÀNe#…üîëE[5K °oxÜ¢±èÚ~`ÖÍ`ÂÙ·×]ÿ×t{•åª Z3ìþÿ΂ÒEìÈ„ŽN°„×ïg¹* ´„‘:š4:Ûöd¹!ÆÐ’g›YÎ%LŠ¤,Ønf«Ù]¦
+"³ÇÙOÙ/Ev ßÏh‘ýåñØ+kŸåÒ'ÝΚ®š¬Ö+ÙSƒä›Ýq{Óh™KA„V¬œåÔ'„úpÉ[v‘ü,µ˜dµ§”éëã@Þ2ÆO3"Ëò`bÀNÖk“µ¤8¼&d¨ÿ)¼¼ohtVûd Y5×Õ„Qùt³{Û®1àûTªd¡P«O‰4jug %‘Rsc•'•g4P8ÓQ“3N¤Q0"(œe9†‹¢^¤zg”Óaƒ¿´çw3¦‚yªnœ6Q9‚p¡žnìÜG[`.ÉØTk[-?%Ô¨µsoÛµ7üÒJNtr§=%Ò7ãw¶]“a2É`@¦Ù½·×G²Mö*>‘t"ebOíC¿yÂñQÚÜ
+@
+6ì€Ní”OŽ†ÍqEy˼3͵!fé©XVÍOˆõxË[öb§rœ·’‘¬ÒœR¨zLζ_,ÈP e’
+IøpuãaƒlAC«2¬â®Æ~€Rñê²ýŒ½m¤]"?ÐîØB.Ý¢nÚz?òÅáûW”Bˆù[_@‡÷\ØÕ
+>muq†¾Ä&´ë†ö!•ºFÅ»{ŸC_¼[
+,Åp¹yøãxr‚5~‰S›ÖÄP1„|X
+ ÿùP“M;ÈOE²Z}J¤ È׋¶=‚ŽWÂ3³6Ñ­à™&0. áfžGÜ|…'©<ÁdTƒ@xnUøãk|x
+?(ý[ø
+qG˜¬0¾¥¯«›+»#èªC] Ëås˜¨µÛŠ÷¨¾U­+ÛŠXþÁ=á%€kº nm‚êñ¯¶äïÑýjÐdƒ™ðfAÝQ¢í SšúƒçœãMn‹4þ°ÀCÓÓ¸]TT´«@KUµ=¦ª÷v R8"Ý·khŠÍGH #ÿ‰Ã"‡
+#ìg¡‘"¢
+@ôl¤) êE JÅ <ôlœ)Š†¯<ôÊC0T ©%ÈúÔ’u¢$½ç>‰èrÌC¨;wÓ3Úv<”
+xèùP“<M;JE
+<ô|¤iŠ¶iÒå"ñÛ‘ümH|&y8hÝå¢DñN`"ñ‚L„Ǹ’Q»K}f^¹×ÛúΞoZ÷Ž›>»ýú×c¬Aêp¡ÚWn{N²p¯¢Gíz^×38Þ#‚“ÊÄ£v›ÿ\TÞ&ìï¹KèB oCØmIÌC³ È5Ú¯mBjC8 u«›C=ÞªcšpÍâ$Òñ)xƒ¡ÜH~oê$xÓØÑuQöp*Šzì$()JókBö)øöÂñ`:Ç‹*`®Ó¼ã´gœ7íÀJ„
+;—&Yµgœ·ì¡"%R)5¥V{ÂyËW„{E8(&“Rõ9ËKzHÕõÌ„là^Ôï»|)Î::Vy.½yãŽÞJBK6oVy&¼9Ûhª 
+i&"Y­:Þ¼í“ðÌJé+¼ýá í •ý¬_¸Èxx tuã2·~qu±Â§Å ŸŠÛ3²m÷òžï/¿fÏyUï O‰ùÝo7ឬ»Ÿ‰—a1a¼ZÅ[§›Ï58Iß#<8eéö>¡½ÞŠÐöè4»Öý¨6÷ã躤¿à¨,|Reó1ŸäÂå®A¾d¥Aªeþ¾¯Ž×zQï‘âo¤Ör¾¯~Ýíñ0•
+'¨­ü÷rgï /ò¢ÕÚ+𬜅«¯ûpÞ\µõ F¬ã[/_ÙÛª¾Fñ«íž$nUþàwÃéîa½]ãýKnë·&ÇÇÊ0º,`/öžÕûÄÙ;|q:>¯çíÚf¦:ŠS C³úo­¦7.³NúOò'së Ý€“iÁ€‘áC=eqtË“A¡ïƒ
+™fÞB@†€P8ÌOÕn¢rc*¾1¬ÏÒ¼/Žòž‹Sö?¿L>
+Ë”>Z+Xí9`í-Ç`-9|zõà7Êú·r¡µ•)eR6Ö/îÚ\Á>}7תÏkoÛ5‡< K:–U›³ÐÚ›v¡¨$Zq6µ^pê³øÚ›Žøš§À‚Ù~J‹‚&´†úfÊ`3À\á9l2V(d`Xî¼è•ÂEA&ÁFᶛ”¸ÌßÌ¬í ’ SÒ¾(ïdÑ4ïÙÆy/HÌLÞËM—é<æºÿþßñº¥Z—|r•â‰ÑYËom5Ì]0yM„²ZyÞºÃÛFS#€çLðvÉiÏ[wx[h éuøÕê„uÇßv–w?.wͧ®?,JËJ;ܽ¸³Û¢-z¼³|´q;‰’¯ìqñ=°#û½EûuX]n·‘·Ç@ý{:´û
+ŸŽ'aU`«Ðf|±}þÆÁq|æb‰ÙB/”®( ?ÑV÷v­´ùháÃ6]óüÊæÄû7Õp×Õ}ëe ´°NìÈø‘Øæ_ݸ?jº·Ù±¹Ù~™ ƒnGK<´Ç±O*¢J™úGУ…ûëÇ)žQf4­Á
+Îp=ü£Éÿ^wfendstream
+endobj
+927 0 obj <<
+/Type /Page
+/Contents 928 0 R
+/Resources 926 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+>> endobj
+929 0 obj <<
+/D [927 0 R /XYZ 124.802 740.998 null]
+>> endobj
+926 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R /F8 453 0 R /F8 453 0 R /F32 450 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+932 0 obj <<
+/Length 2841
+/Filter /FlateDecode
+>>
+stream
+xÚí\ÝoÛ8÷_aäÉj.¿D‰{¸‡foo‹EƒÃí>ȶb«k[Y[©Ûýëo†–ÑŠš8NÛ
+TÉá ‡Ãáo†tØÂ?6d\’„òa,)Ñ:ÎÖ:\@Õ/æš)HÌð+P9ñµðB¥±ÍåÕà‡
+=ÔD+1¼º6M¯æïFÿº,>¿zµqU ÄÒµ(nÊ|<a£bÌF›¶ü|U1c‚ðHÓÆbäõçàÝït8¹Þ (0‚=¼S´®"¦„sí¾Wƒ·ƒßQÓŽ¢£Ý"
+ÝØ7׺٠‹IÌåP(‰cOÚCÿõFTæÅæî˜$t PŸïáá¢"ã¢\y2ú|3žðx”ÝGDDj~
+q±º_šd×é-èfU¶DIg'ÑLBILuYvh|³m~l¶˜ „Ƨi"”&‰€Kv[V'Ÿ1ÁÛjšº«–HÃzTOe5!W²¹]gÛ|ÖZMœ 8›õÒ§3Úž,‹-ØjþØ*,ë2]'BˆÑl•¡)§X™nf–Jø,p­mæ¶Q ïKWULÇ“(}€"C9k­GN%‘TœÖøOà‚{›íç³ýjÌö#Zk¶-óÙÁbÑêVÞüî1Ü¥mW7Üìû³Øåt—ݼ­ƒ­×_«·Ý›EÐnSƒLñÔb¬ÛîÇøjÚ¹Úl•­Ý7öµ;‹õrA4ëÛ—mR‹H$Y§ñâðp•nJã.‡÷¿²cÆ\õwZ¹¾ØšŸH.Ú‚¼§”Úh¨fh Hí Þ Ðc6ÿD’Œ>¿;Öb´»f£É&[€[þ
+L™òQºZÙ&% ®Cpbg+Ò­k‘î ØF·¾Æ—lîº(pĵð̬»ÙYž~ ÈwömÔh^sØŽ­¡ÇkëÎ:•æyç"JW8°Å¦sÝðÓ‹X7»r›o]Ëæ<r\L‹ò¢sQœIŽ²¸¹h­_Á@îgðŠMwÔè9æ.˜ïdþ1Û¶û‘Šh°[×®™ˆ&ÜQ=*üm±$Ù¾ØY;µX
+×ÒDkUcE}G
+ÌëÖ÷±ë^:ü4KçŒàéz;ŽÀ3Ákx~5-ŠU–nžE]§hÆF²g‡Såö¶ò¸ÍÁír$$5ß:~9º†Šmj1Ôü{Ãþï)“°©F>&z1âoÓˆm P rùÔ4_œaL|®²oÐxÕï ·XAèÔa¿êô‚ìw£f½§—"`0fgNgþÑe½gÆNLTŽà~aM3¨¦†QªoÏ(€`Ÿ"…óÛâýi•³
+±½¯‘Ó­W]i §Õ2КTÄh¯Ê8»áuî"§<¦9chéÖ¤Þ_Ò_aºãîRñOŽLÙ“D–H¦wá%P*ö¥µª_Ìm]ÐeJ‘$–°ÏD$‰jö·µAP¼}l%"BiâÚýçp‘·¦â‰k2a ŒÅ´{Ýît â®n`Q æa®”Kvð‚øÞ¼:Ä%µîñOô.¹;ÖÊì
+[{>>í†Ó‡q 3+[”뎹?°õH&FWK'L=½ëÎÑL¹¹¿äÚÜ䣗5’ÜÄi^M¬X¬«ÞÀÉ"8)‹µó¤‰ J7=ia¥(‹@DÏÀ—¹I´‚,K[‡šÃçíÆ$÷þp€I²
+!á»wÚúÛcöƒ[$͵5ÃR£^c­ 0^?ÏùÆiÍŒˆÅf N˜”¦þgS®¶¦ªô¿‡±eÛ€ä³bm/ݘ ¨#7™¡%TɆòöØ ¸]áU²˜»ÌLîc±¥æYƒˆPš†/˜üHÉÑågÛ`~¸ºŒ¸4©Yñ½â™̹®yYå‹M6w| ÷¬õ¶Ê®KŸt¸"‘‡¬›ÅÅ}SÅa«Žü™õ­K÷’™;)•¦ì~:<øǘPû×n#GÒ,àó—Á8¨˜qnoð3)À½Õ
+árŽ;y ³Ï˜yÒÕ`9¸®ü‰Àk¾GʆŒÿýߨ#¹Aì¦éz°©Ôdk}e×tY´¶K[‘š‰¥:>ÂËÖöáÕºªíHk¬Àß
+š°#¬°¶×¨^·övCY¶­¶›DòæÌ0Øc­p÷ì.tÄMk8}ßÕ¼CÛØ5 N<ÕnŽ³¨×¼{JT¶Œá=ÌÈÔöàó)0@èéÀd¬4 s1µ}¸\¶cI|Zóí—X}R@ý€
+b˜¨Î©†ÑÂ056à^4‡xmÞÜ3AÅß‚âM´ øñ°soö; t|§-FìœËhÈ!bçœêætØZWÙå Ûç3–rR‘bÎO+%°²µ=Xí¿CGÊ+x‹a´,ÌÊÖöTÖÆ–¶1,M­8ØF£»3õ®¶“ß®=4K[‘FfæÅëÁëèØtâikø\
+ÂÌI
+Ÿ´4)P¸ƒx®,.Ì_K·½ÚãÛ|±4€Îá9Doùb³>$më·d ¼V¦¹Ma:0/—; %¬_¡«ŸÐ,68
+sÂZö0$iIM6ŒudÃΘ ‹ž7&Ÿ7}A2̲ºÀŸÜNð7·3Ø$ØÒü†]F×#e=>eRfÍ‹kÕÙ"^jK›„À•-Ú†Ù6›·1ÓŒ0DÞ
+endobj
+931 0 obj <<
+/Type /Page
+/Contents 932 0 R
+/Resources 930 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+>> endobj
+933 0 obj <<
+/D [931 0 R /XYZ 124.802 740.998 null]
+>> endobj
+934 0 obj <<
+/D [931 0 R /XYZ 124.802 716.092 null]
+>> endobj
+273 0 obj <<
+/D [931 0 R /XYZ 124.802 464.125 null]
+>> endobj
+930 0 obj <<
+/Font << /F39 504 0 R /F37 462 0 R /F8 453 0 R /F32 450 0 R /F23 440 0 R /F8 453 0 R /F8 453 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+937 0 obj <<
+/Length 2809
+/Filter /FlateDecode
+>>
+stream
+xÚíœÝoã¸ÀßýW~²HIQ¤ZôáöÚ^q@q½6¸—Ý{PlÙÖ¿Îv6›ýë;3$õaQŽ7qœì6X`%‘Έ’?Žè°~ÿXŸñ8Ôï«8
+ÓT÷ÇË^ÔŸAÖ=f‹ˆX„Šá“'3Z†qÒ¸ 9gXä¾Ëä*ŒÌì£~ c“0ƒÇzKÂ4Jx?`"ä,ýe-'a„/zÇ’œä¢7ïMK#£Pöïzïû¿Fý ¨û­Ç¢þ¿Î®ï¿=|„t–BYaÊ.{«ªL¶ËÄwwÝûÓ?t? ÓDô¯§Tðzò~øn=úõúÇÞ߯Ka+[‰<dqœè]˜+OQõéP“‘¬“01÷«¡¼S´|w¨%0¢•déÐ̉b¨B¡Añ²–°(*M$´øñD+Üt„ó× ¯`Ë*[´Ù”m3kMĸŽ<ÞéV¶ D(b%t‡*Ê=ES«Ïd)ÈX«$e~=”{’žw­^·²•¦²×y¨¹Tà‰s³* :3­cì„ciÕmöú¹ëÆ¡žº²Â–muÌNLf£bhéä¡ndƒJF³Ö)ëRF¹§èòŒu”¬iJacíWD™§èù¾ÕïF¥iqø¹æã<LÁm\8ÊZaNUaªê•®òQÀ†wïÖŸðf"Ýàí>‡)ø²ðæ;¼°ans¡$ÃÛ¿ Y¸ð 5ÒWéÍ‘Jß5+5‰»q¶À„|br?0ãó2›áe·Ï7xhBC}ìS?>¢þû'¨ç-õ·ÿ|®ŸÂ9êÇÛìêæ
+¯cÓt¨j-
+Lš­°Ð˜´®öTÁK <¯7©’¿®·x-fŪ£&T »û‰^þ7Ô0oôZcQ ˜JÀY8 3¥³ÂìFA,ôp
+ÊH@¤•øX$­ý›ô°JØÙ-¯o0ÜØpž›Z?Ž¸æÛ}A Ž)»|“m3,S¬W˜¤†`<–ÚcÙ»WÃœšÇæŽ×Ë €â¶W#ž÷ÖpjÒ¬V•æ.îçŠÍHnB-$ÊŒ˜TSiZá®ØÏGbWÔbš‚ךféÞô#¼E»-xȵ-°ÞØ7üskH—75ÄÐF>lõäKºOÃL$¤n0˜`!,B°ÜՈ˗V
+!öMgý´-íg?Ê}û•¢5öó*sð÷ ®.ø+Køóéqô÷ šNú+%ÿèO?þô±Ÿ~$úé/"?ýhðÓ~î+YÎ$Œ2ÍxÎ<iµê'¿óÕÞ`?m {Ù2Ë~¥pÅ~^e–ýÖÕÉ~¥hÉ~>E–ýÖÓÉ~2dŒw²_\«ö þ^ü¡œ¡´núÀh.ft„ùÊ·u >¸|$;ò«Y,—¶¼ÃÅ Vµ<•ã§3£2ëÒj‚°Ä‡ÅÞ@S±Ãk<Ü~­wdq´ÈMÎ~mJnn!ÑJ™ÖÝ›‡ß ä´‰yXOíl”rø[>Þ›j
+(³Ú|ά®0µQ¾ÍÍ“Ê5jø”“AGPL§aé&Š‰(LµQÌ2››‰9LБ8YÈ" ³.ÿ ‹#è¨DÅi3 4d(˜Äe@èPòXñfjë––°½_Tâ
+*O¢ô$@»˜! j“q(£”%~j3¹¢¶J´¢6¿2Kmëê ¶JÐQ›W¥¶‡ÕtQ[%Ù¦6à(Ââ&[A—²T7ÈÊ“äD»¨í\u7¨ V4,ë…6›÷(l«d+póé²Üv‚ªr«$+vó(rèvÊ;uÁ[M•íxA2ô Ep:9,期á¢Î5UÆC)…
+Ùí±Æ)¡Æb——v5ÀÛÍzqo¨qKØX¬­Éå²d¹6­Å/‹ÐM†ýO†×Ïë-Áã 5!>^zù?>ÖOqN/qáWŒ¹†ïè« qøâžð:ƒºŽ:CPÒ²›ãÓhþ&ë†zù5A}=® Ì´ Î.i(µQöKà…yºŠjÆ
+`×*">Ì SÄÍÉ<•–ØaÎã¹½ÙÑÈÁI}é¶èTËÚí=­;âd¨Ñ¨u €ù"$
+ÆõÑk·U ÙvÒ’Õ¦ëÚ‡ï#¿ÿüƾËìæÙd}÷
+ÊÇ}ýrŸ7NqöËYSEÀÉõa6¯Åy]Ž1o3sÁ~%`¤¯$F‡
+žºßˆ–qE¢c-§Z‡†ð—{Z¨æžúPëèMendstream
+endobj
+936 0 obj <<
+/Type /Page
+/Contents 937 0 R
+/Resources 935 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+>> endobj
+938 0 obj <<
+/D [936 0 R /XYZ 124.802 740.998 null]
+>> endobj
+939 0 obj <<
+/D [936 0 R /XYZ 124.802 354.674 null]
+>> endobj
+935 0 obj <<
+/Font << /F8 453 0 R /F8 453 0 R /F8 453 0 R /F43 618 0 R /F39 504 0 R /F32 450 0 R /F37 462 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+942 0 obj <<
+/Length 1593
+/Filter /FlateDecode
+>>
+stream
+xÚíYKÛ6¾ûWè(Ã÷£E/Ú Š ÉÞ’´¶ÖÖÖko%mœô×w†¤(ÉMë›aÀÍ ¿¾¤oD–Qø±ŒqI,噑”8g³ÅÃŒf+0½±è"¤ †áÝ cÑ[A V;ôys3{ý‡ÐcÄ)•ÝÜyß›å§Ü9Ëå¼`Œ«üCµxjÚúë\ð¼šÂè|æÛy¡E~(Y¾è@jѬòr» Â]S.º ›vþåæD³™#N‹¬`–ë|ȇª›sž—»Ûûà:ò”†0'cn àíæÜæ_ëekš·þæ+«¦Ü€R¹¼íÊ-ø-Ëf;H]©qê±ù~Ð-ꪠyÅ|œ
+Ûɯ»:…Õ:¯»°
+7wá~w1ð…lÚ Oã¤Ay˜ôïUØ>r·À¡‘f¬
+žË걋‘ý€ƒ*ÎÓq:
+k±YF4eS†öÑš ò¸ðéÖqÑÂȶ]RǤp5~õÎ~¿ž[’#f ˆäþ¹õoÖ[ 4üºWú犚ܿŽ%œ„=Ñ #å mfÏ+Gºõì.=d)QÙ~ö)ûB³%½Ÿ1šýu¡¨OôJKbœañ“|?™7³$žéÕeðGù[|v0*3˜cÎgˆŸäÞ¬¡Y{3â'1áäüqþŒF­Ì8¬QkŒŸ(ó¬7+ÄïÅÞŒÊ$&œÃü/?Êßpè—Õ2Óv¨õ³ë%
+(ëiü¥w(÷ïoñà'¸S®ÏŒ&œÃ"qÞè<’ýj(D 0B·EJ[oWã
+eÌ‘Q–‘(n}½äÅ6XMÝóúÊÿÿrD9”NÔâCLáu8á‚ð†C2èŽÉ`(—¯dðJ¯dðJ¯dðJ¯dðJŸ%ƒÄ9®8¼ÇYöîGïîá–}„¶§œÏùž"
+„Éq£3ýŒîÛP»ˆÖÄk'ßè#¯=$c}Óbh pŒX¾³áЮ~"Üþ8\h:
+—bœ ý~¢gÕÏŒ¦]SÄhéÙÇ­;ê:¨h~6b{¢w¡ñÐ6õét¸”áƒí6J Ï åÂ\IÇžƒÆ²!’ü'Àâ?‘¯&eÿöìK‹£Ã†‚YØsõ‚ÁÏ:Œ24ЧbøÝcWï¶íña8¥CŒP¦0ƒÞXœìüws¸oB…¶[aÎõñ‹<˜4¤InØh]'ïH QògŽJ´‚aæ}Òñ”¢Â$—ÂNšX\ùBh8ZÚßۣؕ·›þ;ýd’Ä*Ï8áF…3A45«èóáíÙ©•‡x’8{p²x®íñ'|¤ÌàSC 8d0³ÈµèsëÍ°£}…©fš×ÿcMßendstream
+endobj
+941 0 obj <<
+/Type /Page
+/Contents 942 0 R
+/Resources 940 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+/Annots [ 945 0 R ]
+>> endobj
+945 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.188 127.18 214.161 136.091]
+/Subtype /Link
+/A << /S /GoTo /D (table.95) >>
+>> endobj
+943 0 obj <<
+/D [941 0 R /XYZ 124.802 740.998 null]
+>> endobj
+277 0 obj <<
+/D [941 0 R /XYZ 124.802 716.092 null]
+>> endobj
+281 0 obj <<
+/D [941 0 R /XYZ 124.802 659.906 null]
+>> endobj
+944 0 obj <<
+/D [941 0 R /XYZ 124.802 148.046 null]
+>> endobj
+940 0 obj <<
+/Font << /F36 457 0 R /F38 464 0 R /F8 453 0 R /F37 462 0 R /F39 504 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+949 0 obj <<
+/Length 3346
+/Filter /FlateDecode
+>>
+stream
+xÚíœKo#Ç€ïü„Ov¦Ÿ3ã ‡‰ØŒÄ ûàõ")‰6’Š¼ÿ>Uý¬~H^¯µÔÚ0 ˜ä755ÕÝÕÕÕ=¥åÓþãS.:1íUÇÆq˜.w“nz —þ9á^D*ÉzŽ¿çáêiÊpÉ„§óŽÉqD‰ÿN¾û¾›®@ò‹ Âaú
+~‘×ËÝ‹;_È,×.¥T3H²ðxêî÷¶ÿY½ý#s|7¿»ˆ •ßÝ…Ôqƒñ; €ç‹dˆB²‘¿«.'Üj1×L+þ¤ mNx^ìo·.ÀIÍóšó‹½ñÒpÞ=æ—³ÇÄ9 Rjv}%ÆÙ[ü.gw{ˆë#‹=~ŠÙfbçµËïùl¿Ø:Ön9îÖñóxÀíÐ✶ëäŒÝfÉþõ \¾±ùh8À§œâϘ@¹s€pàL:8q4éÎë£ÿgžË4›c¿¾ó‹9ö\)žœd§»ÅêððäôÏoÈ/>àú@†¼ç;ƒËY“ι ÀÛs.ðôs þÇpÅ™Œ_îÇÕî¦AþÁÝöºÓ6täŽÀ¹`½Ô{ffIÉ”
+²8oàI§}‡Oº]wvð:½Ø„^S†ÙÞK3×7,ãOO,ñ<낉»ŸXóìlãsð\£œ*ô/~¸ánûUïù
+'½`ô€2Š™bÊAZÁÄ0Cß—Ò ŽÒ0d·óÜœw¢÷ÂSŽÂ
+ºtTñ¾ïj ²3 ¦u}![cÔ ~Ö—ƒÒàIs5à ŽÒŠqÑõª’®9JsèƒÓ=·¤ÁAZ lèy¥ºÆ( ‘Yà÷R¸æ(mC½
+÷¨qÒ\ xƒƒ4†±^ô¼”np”Ö0“\sÿ¨¸&º‘Š¡T™nÊ£Ý<BAͦ8öxË|€qëDp§Oš‘̨AgšæÄhC(5ÚÒ®á0£„¥Zžuå( ß´¶T]aíÁiTWÚ\QŒ07Gi£´ñá ÂQ+¤cv&SK1vtÂ*É\¶Æ¸ Ï¡·™ Œ*Je`7q÷˜x3±¦»Il`öКî&®}2¶o°’5 :yÞ•„ÕÇŽ¤™`MAÒ ¯ŽÃë$+
+’Ñ×3…>
+ŽN+rÎÇ£‹»¯iЈ0› íLó,3”âØzQDzÑ]hܯi´Öä’5 =€®EåŽZË8Û ³.PÛpšÉÖt·è†Y·¶”™@ƒl\sÙï&~=ÔùªPÓ¨ÕQ¾A«[¾E!ÛÀ ÛLj
+’.Ý(F·¦0¯‹4ÆIÖ$]v$Š1hਵèÖV.æ“9]ˆ60Ⱥ4‘40ȶÓf^ÚHmmÌ*1FÛhÅ1ùÔ† Bn8ê…F@'‰~Fª—âhïPÈ60í¬¬—Ò»b½p¿‚ ¨$j) ÖŠÈh'Pú
+îaº˜ ’‰ p#+ýòQÓ8eU„Ùœ¥8Ìw
++Ýû壣ÞÞžøœ‡¨Qc <‹hqìm7¦Òh¸8êŵ‚ |äYщ†Ó"0 ( ~ Dx0Ä2¼k,”–0ºkd=u×H‡8 !LKÙd
+PtÊ©#œhL,ZÈ3±
+ÆVË©3…69²¨MN³¡©i²Î£>3/ÂØ^1Íœ¨¦Q£˜z¤a2ÅH£•}.YÓØêaê瀦í&4ø™fó¢‚Á#…ÊŸ]Óàçzò\Ѩ˜›þt®SæäЦɔ¤4.ùãÔ@E—|BC"¡ •% É L6Ï ÉM( „©¬×kuʼÛk“³¾¬hLùâèšñI•«¬ INsÁŠ’”7 Å5%i4]*Hs*WA’ìg‹PMÉ"[„kJ6&žÉ|_iÚìd¹BÓæ)K?*mT¹`Mc»ÍÔ¥9£ í&”lsMÑL°‚ikë3¬|gaÚ,û Ïd{åÓö;“« nã³t³§·š’dÓïþu¸k¤g„’Œ\²¢ñ
+ï‹*Y$#¶ïT|«|ëǶ¢T«ßVJM¶šÀDf+Á±„žÒIM“Ö°gÈ^³šµß2S6ßÓÔz¶+&k>ÁIkØåš(µtž7ªÂ©ýi·–½Ìxô,7ŒÔ³M/톳ËßÙœ^öqÇÚgo)Ï4g;¡Ï^zªÊבǨ@öïYXÀƒÃ,†•'™j‚“Õ¢­qêQ°´xÔLÎG²þÈxöJ7—nðôº8éèìu1åÑïÒa‘΂DÆ£?‹ÒÇy’N¶²0AqÔËË·O6GÈ3“ N½‘Ž÷²Î 8½–OdžCöZžòd³.¥<ö9êÌÂFÆ“nQœ­¦Ò_y
+n„„qwHÍ‹L`5îÄzZ;¼¶•`ß`Ÿa~b!…­3d [›_%–Âý%Ô¸Ž ³g[£´\àåíú+ü¸þå-ùÓ¶z¾f·)W§Ël%Ó_G[r»ÙW‚Nÿêhµ=|uN}¦7¯õà½ax3à"ªøöjP¶"¸ë]ý”-ü팭T9ºÂ¬^¹_z![ªrØù_çµ/æ³ýƩٻׯ!'²½´<Ÿœ(ÖAâ¥_5ƒÌ¾œ6·þ¡ÐP´:ìÜOZÐåµ`ù"^Zl·¡>‘XSAë}¥¥Œ3wëoN n‡ç‹õ=^d—Z¹¹Áú›AUi ç3nq\<øòš¯7«ººf
+endobj
+948 0 obj <<
+/Type /Page
+/Contents 949 0 R
+/Resources 947 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 925 0 R
+>> endobj
+950 0 obj <<
+/D [948 0 R /XYZ 124.802 740.998 null]
+>> endobj
+946 0 obj <<
+/D [948 0 R /XYZ 267.6 514.647 null]
+>> endobj
+285 0 obj <<
+/D [948 0 R /XYZ 124.802 492.784 null]
+>> endobj
+947 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R /F37 462 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+953 0 obj <<
+/Length 5897
+/Filter /FlateDecode
+>>
+stream
+xÚµ<Ûr+·‘ïú
+>RU‡ îÀÄ•‡uk+[)gOíK’Ú¢DJ‡6E:å³ö×o_piÌàxcoÅ.{ˆÆ Ñhôé•‚õJ·Mʬ¢SÛiJ«‡çµz‚®»_±În£ÆÖ sc“ߺ°Ú8· Êã+ÿX•Îh¶j•ì–F Zmt„k&£Â
+ŸzrÐ÷ò´ZßßÁ›~õé毫¿«Õý þûöF«ÕŸo6QmSÚ°í´z¾Ù¿ :ÄI@O7ßÀ0˜k¬4—lÂ,£QˆË
+\:y%pq“p-G!.µµ!¿$]0pò¤h`72'æ@»Ä
+Q:€ø6Â}Æ…î†ý0ÊN[•Š³QÄï™3®1Dj ;\îL„ 5ËþFÍR‰ÔÖÅ`QE·…É$(™)“u[mTt œ™’A?ŽÒ RA¥ý0mJEad“(XŽ\&>i7P§ˆ›ðpðôSp…σœ`‰
+ñ[àQŸ]á G¡HE›fj7‚·9F
+UœP#m˜
+¿L$Á’Ò¦CÀ‚ÒjRT©ØÉQÌ0@VWÑê*&³ÞÚl´†.XÍÙ˜Y`òÒDÚëhp³ƒÖ5Pô ¥KT€˜X§Ø-8W½ÏˆHã'§°a‘aRÀïµ3M¸‰ˆ–ƒÀ—Γì²SÛøì)ÿQÊù,§£À?@ø¹ `†pçJPÊMÄ´T)
+?¸,Qˆ¡V#¨“Ì\BñKÉà+šØ”  <\âÑû–¼w±Ù·ÒDLËA€i\®ÂÍ*ÏÊL¶ d3 bU®¥±’ò¨ˆzSÐǧ`‹X»0š!#²ÓH“ ÀŸdÁÄ:±–ƒøÁ€J&ðÖb j¼ëâ‰AweXš€å6P£a¯ ”aenvÛT•Y»ÁpKÉÐZDh›ug䘲bS`ÅØ€9õdVmL©Zƒ°n…^vx®^''rNX¼¯ùFÔýÃm¢›fõ¼·íE’ÀbÝÐúѓ˘ÆêTlܨ«±k6oxl ¹0ÈËrœl
+$´¶1ll›)ÆK#Ð-IÒ}µdßuô±Ð¼ìèLCET FžC6º¥™d*‹ må£kWòñaOg; &i:·ÞUÂêÄU;ÚÎR†ûÂËõt5#ª®ÈX¬~8‘1 _Ùæ{`óJb|q™€^É
+‹µ¬&£žjk&Im¶o¦“¾h’ÒGÍfŽë˜æ!ŒcÃjb3.UÕL1ºðõÀj˜åøB›]eGR‹iÑS‚ÏšdΕL1¼rRÏQ:'´Îîa¡˜•£žÆJÝaç­ƒ¥Û¥ºS)Ok¶íc*•v5 Ðkó
+–ÀT
+m®#œJ>fê*‚¹YëiNPX+x3b1cGÁªgmK ,
+Œ¥ê8«Î¹¨¢
+ÔLœŒ•
+È°GÖ/—å˪ղR3TÊš5eEURjwV§]7¢pÑš²ö+ñ”zs.'Õ|J«rÃN¡Ô¹:˜¬V×Ñ¢¨.jê4ȺHñ‚µ¶ºè(k굤^+÷Ý)@v±‰ qœ’p» &ëþ¢ì_ºˆ|ÌÚ,Ž÷¸Y·R iGÝf¾Fä•qâV5ßß-‡Tn¹Õì\Ôª‰Ž<:Ïw°Æ-×aä= «|Tå7 ­Õ¬ø6oéØöTŒ\óÓ[HG¼É^a"—+Sã.yÞ%h.‡j3ôhrqv
+¬tºÎ‚=ìçs{9üÙóÁÅñ YÍÏ<!\šøàNÅv„ÓÅ¥8æ,GŸFv\2gZ‰°Š“SQ­ò)­¬{Ÿd•›tgNÁ?6qíÙ”¥N T°9oQÓ øþn0^œÀÏpN:Pù
+b“9Sw ê+*ÉïÙWÒtÑ1iM•SPžTÔlÔÓ1\œrmúS5m…KÇ;G"XX…´ñÕ¬ùz„X? _Ž†ï “\QÇ]Í´Idí¢zÈDF­9­ˆ®U®{ øšH h<żY2'‰cNnŠOœÚI]ðluä뇊ïÎÛàK±zÜÕÚN¡7ýÉ´nJâ­+UijÙ¾vŸ<•ñ5l Ô ‹¦V=ùB­…d­ÚÛ9°EXñøFg=̯×þø㙦)p9Ñ•ïkF=‚dªñÙôøùèO‘µIJ+q(‚¹¦Ç:»2aÅé*…ßZ‰ÓU "aä“ÍâžGÛ5Å޸ÔôÀFl‡¡ûŒpf Šmìjs`ÿáÒ.´‹2kòIÜQ--ñ™cQ­—¸ÃÓ­°ì®öÔÌ4
+|^^¾ †¿XîÇ?³˜û_²˜û_·˜/åb~ÿ/\ÌÃ/YÌï[Ìïåbþð/\Ìþ—,fÿëó¹˜?þÊÅìyħ?“~>_^Há~:ìÿ¦æ#MÿßDsQ?F³ú÷ÏZ3ÍzOo‚ÞÄçW§Ýw´È-Ñ‚sÙ;˜ÜW²»ÓáëÆKônë{ò:.îˆG¿cãv|:ž/v,vm×áýÍW B_+Ðüot xß
+žÞÈ™ŇÇ[½¶YëÖDî Ú;âc†~Ì
+0ë×[L׉·ðO€ÏÅÂ’·0ÂFmüúÃíäÖ´¬Ãáu±Þ;eÒ8%Ñ Sî΀f¿Còö ?ïoQÈ^~ä6Rör¹5iý.z E™õŽ»ŸòªòòÑîÄ]×—Ãß}€…]_Þ ˜u½àkïòJ§F©ñ0=îùð题¯>^Õç—Þñ\»s&?“R~`6 ×Ì+üDûþàëQs$’?ýû¼yA¸{·¨^ ÿ8»°¾<r›—Ì,F[¿Å¾.æ/ÃÕ8ˆu0g¦·ÊîÇN
+‚öõŠÏÊÖƒfØå^¾§·ga/eO¿XÖ²£äår~: Àùòø?î
+8q±ÅgãŒ9îN%ðŵœ_IéÉž¹G°6c²rÉÿJæWÿÑ/‘éÿ)"ÛlS•ÙâÕ0É•? N8¥8’‚çŽYù7¥]Ý+ÃJ
+`ÇÒ¢FY%\%ü‚ß"Ú%Ú ¡-:®Y¥Xô•Ñíb‹Œ†Ì‹Ï1áÁÎèo%ju<ÍPµˆ:ày´ éu"÷)pþ/Ϧ¼endstream
+endobj
+952 0 obj <<
+/Type /Page
+/Contents 953 0 R
+/Resources 951 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+/Annots [ 955 0 R 956 0 R ]
+>> endobj
+955 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [455.894 289.179 462.868 301.134]
+/Subtype /Link
+/A << /S /GoTo /D (section.59) >>
+>> endobj
+956 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [336.675 265.268 343.648 277.224]
+/Subtype /Link
+/A << /S /GoTo /D (section.164) >>
+>> endobj
+954 0 obj <<
+/D [952 0 R /XYZ 124.802 740.998 null]
+>> endobj
+289 0 obj <<
+/D [952 0 R /XYZ 124.802 474.947 null]
+>> endobj
+293 0 obj <<
+/D [952 0 R /XYZ 124.802 416.714 null]
+>> endobj
+951 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F36 457 0 R /F39 504 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+960 0 obj <<
+/Length 3042
+/Filter /FlateDecode
+>>
+stream
+xÚí\Ýo#·×_!Ü“ x7üþ@Ñ— IÑ
+äò°¶V¶Yr%Ù¾þ÷r¿¹òÞ \Q!ˆ%Íp~C‡Cr†8>gðŸs¡rÇÄÜ*–{ïæw36¿Ößf<6‘Jæ–ã¯3“NçÊÌ3£sf=6ù÷¼bZ ÍþrEdóL¨\Ï_g¿Ïÿ`ó%p…ÿÿœq6ÿÇ,ƒ>yf윻œ[éç³L˜\jeø\åŒ1-æ›ÙG ªœs%ÔÜæ’+iFZfBäJXnfµ'ÚÃìǙɅ•Æ¡+…s vpN2¤ ©‘iÒ!Mzl%]ÎœP|mµ‘6jÈ@V9ÆÁBÐí JgÚÃw)Ä<ã&72F[ üŒË\:çýHÛLë\3 Mô)%ku<×VrQ©#‹H™3μ­ ˜
+%XÏ0R(À ˜£­˜sÍBç€íy¥ì-¸ð•JM½daT„àÞ…`##%Ý
+¬•nšÑ˜w*XBYW)ãà~Ü/³à“Æ8Y‹)„j¨àLƒ?o‚Y­ƒÉMkyÔ°ªü½4€¬ÈEÄ€Ùò­¾mV±mÅÄ•òãÍì‡_Ðû<âfE o–¿/Š§§+¾Ø”W_®þ¸ùuöóMa”Úv°ža]€ktFÖPa±Xt.\75F³Ý;i
+\²—/C¸—òž Ns¡´5_êhŠŸ·ñ*Žê^ÚV]^—ÓýrµCÂk&}‡¿wË8ú8”JÅ”i
+Ü6ØÁmH_`
+γ!RèÜ­
+†)7‡@+ö‘‰Ú0-ND¾ߖ˜!•¤–„îŠçClÞ sP#>tì”%¢}b\R¿÷åyQÕCeÒø@œC~•ÁM3@bµ5Âmù`”T­ùQÚ‡Î!yS®bƒÃó-Z:æšm}ÀO ÷è85
+|¨†‰Ît<îáu }¢oqú o?üa¨vRáM.! Wý©²hhØrf ç#ç«ýæ) ³)ñ¾`»Óy\ï¶Ñ;°hó| _È88ôúW´_Ô3
+­ÈežÃ4ü~·n¦Qvá3xjüº‰¼è¡aYµü¯véCìÔj·_>q©nCÊc[K|¼‡Ð?±ØîSº,C¾Ü.+t\H
+týp܃ySÇ V5[o^
+PÓ šÉ±æ*Œég¢ÃÁ_ž[Sÿ
+È´_WS¨E›šBRUUSxSÕéšB-Þª)¤ôU/ßT7þÒ¹MV´å¾Ÿî7N ÓÏ÷‰•ô‰j™ÐûÕ8™ѧÎÜ~õSç Ú-' u!ÛMÑUŽÕ\K[¢–P…Í&GO1ùN’>Aëäó#&ê gAîV†¾yíüF|?ñÚ¹Šê­ŠÂPQSQxCÑ—½vŽ`ÊB8y˜^–®oÝ}—PKõ« ç@V¾µUE öG‘ª!DÎ×ÔѺ†Ò
+oë« 4’U!¡%TÞV2ú¶Îáýòðm3¦Y™8×ÛfLšßÃËßã×<}ë±3¯r3”Ë:~é;Ó©/ ¿\Íwø,:(øðS±!÷Ûú½nxúŒm>\ÞNŸÿí4aÂiÝøv‡a"¨kêMƉlå¾7YKZ½Ããký^¯ûCÿð@3p(Ÿ*kñ»ÇCþî_mÑS„XúÂ|#Oý“À§ü=;U¿²ªÍ-ˆIÛýg,þ Ñ"Oendstream
+endobj
+959 0 obj <<
+/Type /Page
+/Contents 960 0 R
+/Resources 958 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+>> endobj
+961 0 obj <<
+/D [959 0 R /XYZ 124.802 740.998 null]
+>> endobj
+958 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+964 0 obj <<
+/Length 3010
+/Filter /FlateDecode
+>>
+stream
+xÚÕ[KoɾóW t¢M§ß¹H‚,, Èaw#q$Ñ¡H…¢%ï¿OUu÷ÌÓ#Ó6i Xxg¦ºëÑUÕÕ‡ÿD%¤fžËÊiÎBðÕíãŒW÷Ðô·™H]”VÌ ü*4ÖʦmUϤ³Øå¿UnÔ†ñJ[Fœ™È«:HÅLõ:û¥úW hý þ}œ ^ýc¦“ ,€tx ÆTÀ®™ÐÚ›ªŽaM¨V³3a™ðÆ) kÆ•~ª¯ðŒKnÁTà1G´š=ÌÞÍô–ÞÉŠ”9à÷L+ÃE%[[i£&É0ÙJ‚Já` ÅŽ‚3Pâe%óA+Ÿ´h¦½ ºªœqØѼÀ9w0PÇt€‘ªZ´„Ô`˜ÊÝdïZ€<m„ª ‹%3Ö p‚äÌ*H„Då"Qs+eT˜D“jpRP<Wê =W0µ0Âën|AZc;—'ƒ¹ãMc\ ¯Òè„Gr
+¯ƒàMuÅz° ˆ–)-)Œ¨K@
+HÂZI kÙyðqHÕ`•– Ÿ:c•œ¢vPÇ]—èçÓžPœù$E2"ǤZ&µçVœ4ï®gü«¯@ºÕõu¼^ü2ožž.Å|Õ>_þvýÓì/×ýì"z çó%ÇÚ$*Âh埤v&wb{Γø‚);[Í[¾Ûl›58ï¾½¬Å|Ê”±ÿƒÿ«ýQ‡8A³`·-ó”ßN%{Ï_‚ê[t6Ê·ÜuCÞjÖÍ”«: ÙUT‰R±6àx:Zª‡V,P2Õ±ãŽÎ:Ô‚sHÿ
+ÁÝ"ði¹E Ž"z 5¬z+',QÞrAuš¥6¸FAwÅmHu9@_g5®pÚI%§úâ2!]à9žÏ‹\§ –-/4§u¤9­*Ø`pïD\LQ¬sÜx$c¼-÷D§ZŽóÀÁ3ØÃ
+•òô‹²ºs„ÝÂæ6ž,ÈŽTgÚjÖÕÌ­'aXN/1úÔ’?Ì`Kæ"»`.‰ì#@­>µ½¹šƒßG¶Nì7œîà¸e§”ak8BYAQdíÈpçÄ„"l=fT‹±¢ÈTfýg_ßa´W=(^ªOWØ @áwC±kÊÐ×w›ÏødͯÜð|ݵ@'…êx¢ï–ZÄzŠ?¡QtÁ4œQ oÆá|€ßëûD$|IÔ%‰·c‰¸…®Óúm‰EïÆﶟð·„ozÏÄë-=[Ê:í(#G"4W¤íê–ˆ(̓¨04ñâ=9iµ¤r²F® ¿Û!Óñ£mb~±ÃmÛ>âs³h³š÷]Ïhr=ÐRtíb숧 I‡-K*e¤²%b{¤ۂض9F\ÑÊ—±¸—¾ê~C®va{¡ç=ˆÁçMtø3ª{†oq•]||ðn‰e½k·™õâ*Úx±Kê7øX·Þw½Ž ÝÝÙÈì>‰71!’““ÇòHŽðG@ L¯ÈœÁY’Ìç«êãØ 7rP4þâ&Fû”e‰ÛÇl×ENk’ iÏÇô¦žcßÄq<ß’«ögrÈÇÞþÍâŠÜeŠ^ˆÆåQ3’òçÍ–Fy¿\<¶ p6¯?SÞEE½ÓbÎa9 ?Ô]8ÁZXôâ…ŸÕ‚¤üÊ—2r¾{hñEÍ×yëð^v‘†®¸ÂW#ÃË©Hþö*ðõr)ý<qƒ-ð±AÊgœ HÛªXµw½ìf›¨íç]»^dí‹Ä³9à€CPAð¼IFBÃC³‹q°ˆÑˆ`xéŒ#Ý=dÙKðœ nþº\~ùùò9>Õ-3v çC9¿~ÈôüD7˜®øñº±ähzO g]mó¶ŒöóÍÇ-ïv£°8܉˜Ô7kE ÐÞCåk¬‰h;%ñ§KLKañývÙ®“W°c<çáU†ežv
+£†ÑbäÉõëvFmæÿ¾ôjž4+2h¿ºjIQjxlþ3Ðòüi;â…§&”î®H.’®mVúœgÅ`p«f›n
+± ˜ÃªÐx…Ay%¸™ìM}•EC`©öA*5#QÎ9Ÿ„pá¸>@çð/ñfNiRNuÄnÁyD ³JŽ 9£™ Ð{6ë©C€Œ<¦OQ§ ¹³é
+˜;›Ž=ו¹äºïÄ墔1,ס‡ÎyÒ£d0Ar‚X†åN.{Ï[EX.9ë;P¹(aÊÅ¢ õÂÕhVQL™v
+ª5ýD X™Q‡m‘çÚ亸ãq
+:
+–õPã1Ø[á<R…À7LbØIè Õ‘àUœñ§u#Ú>Tvz‰9¾§–ü£2²—`*jUÇ€oc@,ñv¬Úa¼šÐ„­ú›·ÄÚq<zIÊŠ¨U}ò–XßBÞ,œçìÞôÉ7sràíÿ oŠn¦‹pxâ1]Xã½q*|S=hQ0ê Rn¾$å([nObËâ$¶´oIÁ;$˜+'F_͹ðAîG ?ZÆã=)I]FœïK‡èn>¿âWñY“ð§f»Ë_ÙQÇçk}¿ÿŸ¯IÌ1Xå÷@Ìú‡@ÌçÂXõÀXÍ0Vý£0Vs^ŒUÆj¾cÕGc¬û·A0¿ìQåUú;hfÞéøG8iáï@„¼D;s(Á[¯ÜþßîüÐ]Oendstream
+endobj
+963 0 obj <<
+/Type /Page
+/Contents 964 0 R
+/Resources 962 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+>> endobj
+965 0 obj <<
+/D [963 0 R /XYZ 124.802 740.998 null]
+>> endobj
+962 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+968 0 obj <<
+/Length 3348
+/Filter /FlateDecode
+>>
+stream
+xÚí\[o+Ç ~÷¯ΓŒz·s¿ èK€¦h€"hâƒ>$y­õ%°-×Ö±ýóû‘3³»ÒîÚò‰\ ‰’8Ã’Ë™!×GÎþ“3©L„šy#êÃìüöHÌ.1ô÷#™§h£k/é×È`¥ƒ­›U6ÔÊ;šòŸY4¶3ãjæ,D1«¢b¨ÚΞ~šý"fKŒ~‡ÿ=’böÏ£JëZ-
+„ßmh ŒŽTÖ
+rŒòÄ–ð/ºÿüi©*C¨ä×»öIÃež”oNþüm˜þ9½ày§ËŸæ‹ûûc9¿iŽ+9<þåô»£¿vOfÆé`Z»±W)„hŠ »í˜°¿5K%¶ì[vû|“!DLŒvÓn<œíkf[=,î`·Ë)»%œ¦5›¬´qÈÐŽBI1í¦×‡´Ì¹e®½ârÚ‰[Ö–gnX‰GÓ˜zÍJgl¤ÅÝbÄB £…("‡‰h´nS€æTÜRsÎ#‡¦Ì”ãaHlù“­>¹xá£$ÐŽìœ1…–Éãeô5Ÿ\<À%_®×—dˆ{¢§ÄŠ-)8!)0¨ŒÅ&-_ o§íSÒ¾ïgÐ:„‰™2Ñ;ÞÏŒWZåd\aã ÒÚÎ0Ã=ÉB`CMÛ&РHõøŒntÄz/l šµ6¸­|ŸÕ"­œÖBwšRÎtBXR
+§lxRŽÒZÖMçï™×ë‘N Qnfxt<æ_s÷ýàÉËœUË
++:¸MN¢Qõ¶ Õz±^ …%îN˜µÔ8EŒ K£o ›H»™½“ÖºEá$×î­· \A¤#—Ž´… /Ñzûò†ã÷Ž ×ã‰J˜– nÓ%4ªÓ˜}§ókÕñj‰Rp¢x4î ªÉñ™¹'l˜åñÌG>Àv¤t–´§ÌàÇH™q;·ïo˜Ñ÷ÛÏã!* #Ó8¾jì]u¬i‹Õ¸fLÈ¢á]dñÃvÙ¬g7Ø:ƽ Öߺ:§·t)r¼#RUhØú,Êy\ÓF‰Ýý˜­Ë÷Ž ·ã
+:x6Ä€~ß]ö‰ð2@4cˆçCD:=Wùøü:⨎CÄ‹‡/ô›¯/zCÅÓþlj«|vLL‚dÈòcqÂÒNΙHhP±¯â§ØH7×—l+âz¸æôrµ.PŸNH9|²ê ¿]-Yâø¡™t®zbFm»Zâ~µfÛ®W9Ÿ±È†‰ÍŽnF`›Å.p£Z> ា¥Þ¯ÖÖoOm§Ï³|Ù'qO}ÿ-Ošº³÷ΙånÝ<Öä>5ÿ´ÎâoWô±L®kgí躋±±Ú]3 9[¬¬d{
+¦l¼êšQþºÊÞõ݈ŖìÎÅó÷wIPg´s”ÎcM™‰§"‡-/ô­ÒŒòíq0ȋǸ•ªùúªI_îš—u&e+@we f¤ã…Rzþ³Ôæ?Éä
+¶Kâ‚JÊc‡Raþ’(ÏÇ P’¤)E®ËI…
+Ëf™®¶ty¸¾¼:Vq¾.@”IàUZ¡ŽÝ­»OÚaš³ë»åCs³X_?5ߟý:4‰Š8ÿZ*rÊšêÏ\n»ƒ*:¸”ƒuóçëeˆ_~~ÇëzNC·‹õ9ý¼jò\Ö›¦µŠ. ãê"}#Òt2â4©NEi$g¶&Ío­éaMDÐqå„Ÿÿ›<—QÎW_n–iò‚€Ì½*1Ó[ÛÕ‚d%@ qþå‘å.‡ÆÄ}'èP˜/ëæn þ
+6Fþúøåg!Ýy1QhµNZqà“Ws}y—©%ú€
+Ôfj.•¨U’1Q+*”Rµ«­@l¬¬vÎ盲`{O!ƒ÷3•Nв±~Um—+C‹s°7•þ”T䌎˜‘Ø>¾–ž¥µÌ[Ó@§µ+Y
+¨ü£§MÙìÐé80N
+­[€ä{÷F´¤)ƒí™®˜¸Çã‹[—o›jº”œƬ„ÔhEpéù7üTRÎÁ!»9E·•1baÎ7ÏÀlm¿wlJ£±N
+|™ÒiŠ… Ì¥pm• ÷†ù#•#sÆÚ·ë·KCòÅÂÄZu¼*ÖÁ´mA4fw4Q)Nì=ajR»Qi4hv6ÒÊL¬=AÅÍ©ÌA‰?Ы9·-…K +ï¹v”Öònº{ÿØnœŒ¦¨…I£³¦Â½y§ã3kÕñ:*/R¯e\î Š7º‘Jqè ,>¡ü¢ 5 èAœ&
+©—ÿ 1LiÆi…5ydÿˆÅÇûFæýMìŠÞI‘q»[b•Mcï*W™³0â‰ÒÒ}eLL}[Ì.uâ*ƒ¬v¯æ o¯W´÷µ¤Þ‰âUZfÍ;õÞÛ}zÏÈt ¬}žŠ'<»úÊš.lyðbfí8+oÊ…)Q4¬w5”8;F¸X8=%ˆGw‘³îÌŠ‹|æˆÍ^ßz§w9˜×©|ºþš*ç[cɯ BöÖ;”¾ªŒü~1ÿ?/Ì”ÏV¥Û¯²ÀZ }ûüžZàá5ùßZÆ5S>{g÷ó+e\û/ã~þݽ&ÿ¤2íT÷ê¶ÓЂŽ7émðë»Ë4£yYÜ|*Ja-Ú‹9½ê~ÕäW¬U'Kbߺ¼7 a Ýr—CZzõù~ Ÿ¦WdcÙ ï úz•Õ£7­é3ùnu^%}×ü®~“ˆé%wMªñŒÕ¿‰ÿFVÉy2lbaóù›LÒzþø…ÞW/A𘈬†6󇦼iÉåµôf9|ûZÒkøŽ¶eº/Ç8öOÐ`¼¦âµèmÚ­QÊöêÝàx3h¿ùÏÚü.^Jûendstream
+endobj
+967 0 obj <<
+/Type /Page
+/Contents 968 0 R
+/Resources 966 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+>> endobj
+969 0 obj <<
+/D [967 0 R /XYZ 124.802 740.998 null]
+>> endobj
+966 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+972 0 obj <<
+/Length 3732
+/Filter /FlateDecode
+>>
+stream
+xÚí\[o[¹~ׯüd9,ï}Y¤-º@±(ì<möA¶Žc/l˵'?¿ß y.’xÙ•€¢XÉ‘†œr8œ~‡ŠšKüQs¥­ˆRσ•"¥8¿ºŸÉù4ý}¦JcŠ¾U°~ÞD#¤dþÏ»Æà„œk/˜³#Êyã4‹nþmöëü79_¢õgüý}¦äüŸ³Æ ŒóF%¡µRz~?k0„.+lÄÇùÝì|ÖOd‰ìtvª/†*dÔƒÂX únv3ûi$é”Eá½V$
+A+ÅÐ…z¸šsÊÇ‘£‘?¶ð†c… ”S4´H&:BžÔ:hêç‘nºL‰¤®“ c=˜­·ÞÔãðÅ#û‚?zLg¢£Cm€~œN­¥éo¥.¥Pr¸èçLJS`¸‹$0%;FÛ
+¥gÜrçK†+'2/â} Êmzµvm¯yØåâžµxØÍ#YB3ˆè¬DyÓx»1•ž6ŒÛR)è|•4a¥CKF­†¯™»f¥Üº‡•VOl¦/õØ9[9ä:Iã u¤aðCí²Kš°ÔaåžÓnñÌ\37¦=Ì´x|„•îÚ] uoJQÓ*ÐçB¨'":*Q'±·«´Ž5ÛèðGþyPÉìŸ6³#Qq×-ÿ¤Æmé5Ã_?Áî_o×U×$½„¡& ÃUÝy‡ÓkG9Ç«´ÂÚÕ‡–8Ô‡•L&‚[îŠðR6иòt\+¯~·ìcÖ³Ae µSª¨Ùì£jGSæQHo¦që>z–»>Ĭ8ÆÎ B‘Í©>À‰Öù!4X3pó±Ôgë_.§g{µþÈÏëÅWzÞ­¡ÇãúvEχÏÒÉ“ úøÔ¶'ôE1u]¨ô¸¾»}¤çIך¿¶ô>þ™æBX%QÇy`Îo?­¾ÓS,ˆí’ÇÖ‚âŒæ(Öpû¬Œåˆ¿~âa®©FÍjÚï¤eCƒ­i¸ÜÕ€tÂÓü‚HIsƒ¨ _;¥ÿþ¹ÚUC¹½)Éýjª³¹ÞUsCч¿·Ü’—lzÜOülÅu³3“¼î†C_XÛ‡+&’4v„Ó C<ùÄæ¼»ýÒ;Ï%ûÑšxN>äaä©·í=·-ÉI$}úĽòH›‘𪙗»ó\±?àXʃw8I[Û.öWåË®¸—–­Cg‰âÝ?X-[]­—þHBÏË»<eR÷2^µå‡¶º½fnjÍ®˜åaÝ>u¬£¥ËêÇK÷©ïµçÒ]¯º¿|—®–o݃÷ì·ü±‹E ž¾Þ²Ìç/ÜÿK^ÇÅÈpSºáýÐ>v²ÔÕ}7®l<Yv †÷«egsù©ï¹k›<ç+Ç]Ë÷ò÷aü«å6—{%öt³,å/«'žå—Û‡ŠÅ–¼œ‹o¿°ßeEƒÑ²ÏQ"J"ᇔѨ€¬­©îQÂ[ÅRþPfŒ9]ß´ôÁž>tâïëÒRìða«ãúLÇÓoôÏ*ž¿^ž f{ÎÄux¡˜JõÔÝâ1‹ÂÀ‰~µøúÌ2dªSÈç‘= ]£ÌÓ¨®sλ¹]¶ùÜî`€—\oLÕzNŸ¹;qñœ5<·ë2üU^A#%ads:4&——Ò9ánÆ.y•NÞ6Õ
+D¨jrÉér'˜‡Ü'ë‰ÅcÖQ{i2·Íøx¤Ú6ÎqºI>˜z/¤rT¿À"ÁuÀ¸ñà•Š o‹c4ÃÝ^‹¨
+ :–QÁŒZgóÕ:3dèœÒÜÕ*S§Ö¶&vÓsY„Hôr†$x¬€ÊêL¦™ìET%^½+Jn¬)¿!Á
+woù˜”cEPeµ ×pubÇ\NþGÙ[ÿà²ÏóÛ ‘J©ïæ{jM¹ñ}¨K‘Ð PÎ'‰0m(ßeÀ‘H‡ ¿81-gï¿ï­tDlÏùÁÁ»BìâpÀÌeÜТ“@T‹ÿ^–·½ÈJ;›ã¨––“gµ¯FŽ ΄õ­Þ}Ý›D”IílBÄVðÆH›÷BðRÅ âôö;‚|8A¦ˆ@¹hf7½€›K£{ÓkÆÌ906NXiŒžÒÄÍûhª¾fÌܳ2rXUÆ­ûèš@º3ÿÀÞ£¸¨wPÞ¨Îw8 Dªƒ±›àh•Ø³o!¯G‘€=SDÀQ¤[
+ÃEf,†¶T g…,ÃÒ1Pò›zø6Ùi:”MÁb‹ú!èrE¸Ú›.ª&ív„ß«Äeò¶SiYŠFt9•¤hIWÎ;ÈÛ%C¡Â_™&{Óñ+FòñUdØ=TÕP „Þ:lßj,Ýfð|¡ÖM6ÑÁ¢Ní%l¬¥ƒ×IÈ"…Á|¹U?q{ìZߧ1ƒ”Þ€Ž¯¯…n­.˜}&Ž'½eepÄž}ËxG‘ž/ŽfU»qsØÇn¯c©ENÅpØwXI:µª¼¼)Ôñ,œ°ÉÑÖ©{þ-ÓICÞƒ¡È 1P÷ ëåöÒjÞ‡«ƒˆÁåKÈQ9x±ÊX–¡{ˆfÛÔN@9¡MòàÎÇÑpΉ"!J8î¾éÑh¥Q¿ mÍŠ ÎfÈRÉÑŸ^À©œ×§9§ì¦B¢ô†uÕ.ò»¶j_CGDç,牥ïR¡ÅI=e„vP‡ý…\˜Ý;3Y›³Â"DÎnQ?ÑÓ¡U«˜1,vû¢2NÊÒ…©ÛBi\—(¨À(P©'öèqäŸÏè7)E„sfóUQnîß·eÞI6YC
+»6…`‡ƒ ôÄ4¡›ã>ú*×g óÀÛß/¶´E£ï¼‡ª'±ËzC
+÷ÀÜ­‡‘ôÛ¦°GZ\Dbk¸¦#µ[çcHçã…/jqŸ›Í>q¿‚ÉfÞ~§¤±Sª¸uUûüܦ)âi;Ðl±NÃôD™FÈæ¡çÚ‚e"m’=€Ô›èg>©ÆRË»nP7=gÅÖ´d<õ‡Z¦pØž±ƒa+:2”úCS¬U‚
+Œ*‹#¦ýìöööà lýÒøÇ·\@¾¹]²ú~{Ç)? hÿ/n"—É^Ž®;ú˜¯ŸLà±ïEsíÐ\wÀ»ÄßÎt ÛÀÖÆÓåíg©LûÔ>ÐõÛ5b9bËS{•ôÏ«‡çÜrE¡Œ>Ð¥à@ëD_îo¿·KqÖ„$ù¦2ÑøŽðmÏ–M
+sØP®#Þ›Åøê1SHãrÙ• y ë&°ƒ!§­»ÀÝñøŒw,l¾“Žp¤¥_ÉÒ¡’®ÝÚÚ䡨nGö•£L׳ËI!lË&+Gœ¾6þsÿ
+endobj
+971 0 obj <<
+/Type /Page
+/Contents 972 0 R
+/Resources 970 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+>> endobj
+973 0 obj <<
+/D [971 0 R /XYZ 124.802 740.998 null]
+>> endobj
+970 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+976 0 obj <<
+/Length 4472
+/Filter /FlateDecode
+>>
+stream
+xÚí\Yo#G’~ׯ úeÕ€X›÷±‹y1ì]`àÅn`fæMR‡!‘Z‰}øßÏ™YEVQ-õH³î±`´EFfÜQ‘™‘QÔ3…ÿôL×%efÑ©.ç4[Þœ¨Ù†þûD—)ÖÙ.jú618·Éw.ÌæÑuÞYšò³:l§fÖwŒYj6÷Bªó³O'™ýMÍVý=þý|¢ÕìNæÀ‹)¹Yì|ÔÊÎnNæ:t>CŠyè‚26Ì®O~ÔwÚe̘›.Emò‘©smºl­6³¹ër² }}ryò݉étvA8©®u— ð*zfN©sÉÄLèNíŽLLi¯<É’·©°™ÃÌY¹ˆ å‚ö†$uRÇ„Ù±3Ö¥$Z9ßy¼ÜÂ+:Åc“çðM6™ô2¤u´•¡Î]Ž1»ÊIÝ9ï ÑHpWvZHkH8ˆ7öèd¢ëcŽ°®ñ¤k #")X+GGTb"…He­(ˆxòÖZÖÄi«òôD
+, KçÆX8iÄ F ÎyO;ÓLÂFí¡Öu!˜ÙPN².ƒ6
+Äã¼ÅùËñ€ÙƒêB¡Âq¨hoúgKÆë(=3ß½;ù÷ÿJ3Ša={wÎß­þrº¸½}«O¯×÷oÿöî÷'?¼k4
+‰žB3ž…{­2¾º×²b=t¨ž8T…6
+Æ{1³ðBeÒx<þÛmïïbýv®OG2cû N5`ñpÜô°x´’§Ä4 lØû–{ êôÜ…BÁvš'-Æ£eÌ>d°÷l¯Åf12Ö\hô$Z´!;!ÿ¶\) ¦ÂJJLÅáH°}Þ:„V|±×KÑmü"ô)z‘Ü„†î<ÏÞ^.£æ!gœßÁ®vãÀ=…"¶f £šÒ®ÓVÁѺ„%Ðùà%CÇN[Îò:uÊc‰<63³Å:8ãµX9eêÊÚØ….^R$ÒËiÖ‘y9Ø(ðr€µ,„hŽÌ{,/,§Œrá`9(â‘ÕÀÚ±¯z­¤‘‚Ü¢nVq÷ãàùi³Þ¡àÃGŠõîC@FëØCp;z
+ nJ
+mŒ;ŠGÃj»[ì¶cv‚ߣ{è™ã4³ý±‡˜³yAîq›ïëk;lWy8Xv»•¢ò©Ó1…4 «¨žfÊð;ž-AWUÚíga•1óD· jÃôªS*Ó£9ÅHFÁˆ×ʼn\_4üê ÇÙ1+;DAè¡èsèl??7½v„yVº´ºÁžÊè<ø˜|þqbM%ÔÓc÷, Í#a´– ÏnñžwŽ“›Ÿ¹Pë‰õ[ïÎD‹y1 Ÿ.*LÎR”ùŽVYÅŸ•Z¿u>ªt(ÃsMðŒ³)ŸXË59ѮգÜ)ˆó†‰§1ƒ”1Å…Æì—¹Œ˜^Ï[jì$ú2‹Õ(P‘ŠÈsÀüSO{ç¬ýÌ9d§>"±îaç‡T7„Ÿ¾Û~¦¿Ýâ¯Ê«÷£k@¼5|Ì™Ë9‡¿¯yDŸb¦þO’‰ª Û ?Eðý˜ öþô}s1 H€Ï#ŠnŠârL‘6Çó²;~˜â¤ŒçcŠçwè;mñVzOÄwwüwÝaƒ8/;DARÄC×/‹3æv¶d QK •‡"¾ùžt}uÁ¶b ·,"á¼9±Þ\^lµ–\²ø()…fïD„5O§"ö|ÀiÒ¼«±1n·;¦¾Û–Œ(´dàú‘6^O]/CnRÊcr×lª5%קÇks˜ðdèïûëÞ¢‡.\­+ÑCŠÀoþ<rà’Q6»õ]EøqÅì›[àì$×{ÓŹëõ ýٮظôñÏ<kìéé°ßV´÷}Üo…bñI1pUü1‘_pÌóGB®ŒðXqÀîîÏ>òü qûb`g]Mòžm°¾%df¿¼9æ=GÞ/™Òõú¬ÒϽÛÕ+ìУÊÝ1•ßmïX΋«Í§[ñéh¨W[‚ŒRxÆÑÊR²ÅÙ +œ‘í~pš©üïÛäÈÂÖºS}C_Ïé¯àöv
+w÷eÞÍÕgÛ]ÒTl.ÕÕ_•¶ iC›·&ŸîuàÕÝz¹»Únîÿc¼–”ÚzòZTž**S6q@j®Ô‰Ìï¤$c9ÒÓ1M™¬ŸM­­ª<žMee W"rŒÑ4ž¡êœ»h¬ÐÀ >ªÞ"0³á
+‘¥C‘nb.ÍLÊQÅŠt…nP7ÇÑ9Vs0’S{ó¦TMÉg^œ­ Ú$¯ÌœcbMTnF„u0£š2à¼oöð· j±-TÞ™RÙ5žùG ÂáÆô¥xHMÙ*šn’Õ”-YŸGãcjÊ“'ƒB¦§2a@䙬rÞ×+bÎ:Ö‚cãwZ 5ß³rØ3U}aàiÛÑ`øú’r!Ó¨ŒM‡³‡uÚïéÅ1lä鬕§)XÅ=f´ç¢=4Wî,ϲ}]9¹·w!ñZNþí–“±çëlÒ>….Z%+%Þòªj5?ÂóH"£h×0©q¯µä×Zò¡ïßÞ=}u×b3¦ƒ›„©%?3å¡ß'kÉÅï_SKÔ†Y¼nŽ0*^ÿêZr!ðZK~­%¿Ö’_kÉ_¬%ã¼hÝ?©–ìž½–쟽–ìž»–쟽–\J‘?ŽJ‘’/Îw­ v&¿7—,êj}ÍÌR¥“‚2—–¤ Lßœe?Z˜üq¯|ùqPÙ³ôñæ¦QýVËÔþ¥ÊÔî…ÊÔþ×W¦v/P¦ö¿š2µû‡ÊÔþ ej÷Œeêw—PÙ©xz¿¸)Ÿ¤0]ÇænçŠ2 „Óå¢|
+Išƒ¹½&à…Œ_m¸`Ê¿pËBÓãÅߊºkRiˆs{½XIùJ
+ŒšÞeð–‚ßÀsì²`!6?wC`î´É1ð÷¦j{]vl­žê
+œËüh€@W
+‰€2)•„¡CÄ“é©I&‚ó¥×“€ƒ”§îr«E’23O}ä¹Á¢ž5\Uš®rí
+©èñ[¢¤·ÏùfBwð2§æÃIÑjÍž §‹œlÜoçLgc~hp:ô^Ñ-+VC,rô
+¥¸ë öu¡¢
+XÒͬçE²ÍÑÔT¤t#3Ñ~Í9ꈃÊU:2fzªª¬ ÐZžô0êpVÉàØŽèEh6Vsêž 8„€Uª XØ­ILoæéäÏFð£ÁŠWH³L%Rl7àÓÌÛ¤é½Rûé ¾úñöãO„«MÊM]*Êô0Õi‡”pü÷ôâ­-†³B"spîÍœ˜iß•YÚe j¤$lóŒò:ýÊASµØX–Û¬KG§FD Ý3¢#U’Fžð:hÛ„íU#özA²ã¬Ñ™KFÏkN¯½P+¯«,Ï\~ÎÀϚݾUôjkïÁ
+ZÕ½ŸUÍÓ(5Ø3W‰z7T¡ÇÎ'"Дu™UÆîô '€½ ¹§-OµaBýìø¦øР~ŸõÔ«‰‚Üpû—öÑÔ\&%ÍÄoÕæFh.`•þ4¬¢Ê1íù)ö?𼔩©$ÙD=ç좨¸d27× ½ôåUÜáHél¡Èg«ÚG¬Íe,<­OEP{Llû i§ñècµ‹Ê÷×õFg<B­'Vƒ‡6„8ùRáÇâ¨,¿nb¢Åv¶SÁG24ž¿Œ#}”ñR¥eiß+§h©×Ë<»7OÈù!¹¹pu=×Á¼L¿Ëcò\¤b2ô0si»ŠÖæTñ{:€¿=ëƒöÛзueªbÿ2ÙvÄCù«úŽzTi<ŠÓ|¤èË|Žuõ˜Òz&ÙH Ñ—¹k>òÔy®§›l¢V½G4ýqË+¿\l7OmB:ó÷^’~J;ÒYørsÂ!ý§4'ŧÓB«ÒYz‰_¥âÇ‹uu±©í×ëóá›®Ó}+íÍ×Ò¨ôÀ›¯µ·I:˜Ö<óf»ª1êÇÑLîú¸—žúhonZ/ÌÚV~¸unï×/Ѩôý×Ò¯s+ ÝzÐá Ônk×ï_äüþ;nù,­Kû]7£ž£'õÜý†Þ°=iÛi'M·1q6}➯“I"V™¸ùåf ì·ý®íeÿJìÜúÒÂBm-ÞÉÍÇâ¦6²»¬J¶8£¯¹o&òþ” Is{TÊèŽhÊŒíæúa+Îß­¹aç¾L¥Æ›¾w[îÙVt9¸:Úã´+ÚYMýPPŒå$š:”ÎðA/ϽLä–"Œ O
+Û;ù¶iØ«õ}Ao]`út¹øp_%¬jÏ5’­®èÿÂâ½HAÒ~„7>5µmu}bÝ)ïÉ{ÕàÀ®À’¼ª½IëM}‰š pá°ÞBHÓ Qe[qɽ°4Í—¬qp.PûNÝAÝ’;¹!®tJõÂ\\‰6ãž'u§åzÛ'§~õãÔ#"? ZöVMˆº Šé6=ÉÆý_ý;å÷ø endstream
+endobj
+975 0 obj <<
+/Type /Page
+/Contents 976 0 R
+/Resources 974 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 957 0 R
+>> endobj
+977 0 obj <<
+/D [975 0 R /XYZ 124.802 740.998 null]
+>> endobj
+974 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+980 0 obj <<
+/Length 4537
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ko#ǾóWÌQ2“~?ä Ž‘¬‹“EQ ITHÊZÿû|UýŠ”Vò.6ñîxsتêªêêêî#Ù ü“TfBuÞˆ!ÆÐ-ng¢»BÕ·3™›h£/éÛ‘Ê^;×õ …£&ÿéJ¥ƒèЛ{–BÑõÞ§‚+|ývfì`¥Š5·íK¼ºƒX^º¨;éaCðVƒ JJ:Ù-fxrÆùØ©8h¯µÂ°á%Ð:h-c×Cü7*YÌúÜÌŽš%ZA5Z}âG û,–kbõ,¹.r—¯‚[§ç¾Ö•Þ}ë^˜ô#.U–¾ SEî‡ÖÆV5Ð
+«š¹ªÌÛªò&]µJÂÈf‹Ùõì²ú…l÷8û¡û·è.`ágRt›Lüë7ñ»™Qƒó`“ŒX¾ø!Zg`³@l:‰^<´¤÷¶S<%`B‚0£;å ­×±“r€Ð†Šàcmg-!r3;*ì3-×hõ™£³ì“TàYäê³à®
+ÞJ’!Ë·¾6¨DúJ¥2ëÇܪT}«
+ß²²ê¢V…5rE­c¶YóU¸jš:‚‘å’)e÷t3D/•‡"ðogä áž@(Ö7hÝK7H‘f
+GØCY£"OZ憈7˜£aë!áÌvðÖ“©Ä æoLMƒ6ŠÚêÁ(S9¼qXŽ¡vã…a[`,‘¦8ŠŠ.{ƒ™-!û:%ÃÑf<0¯¢íì ¥…;%.ei&"Á£1î@Æ Ä‹±ey¯™¹w¤}!É,0bŸß/5ä»Á³Ÿ4
+¨öÖ&¶uäss†Âj¢#ïÑàí"O‰»–é¤úTË ÌŸÎf¿ýKèà¬ð’³KnwvñÃÉüþþTžÜ,·§ÿ>ûnöÍY%‘)TMÍ<Á$»€UÂ%W„;8my+Ø æ4„æY7.ŒEê8ê¿×‘ª4¬«FuTº¯ùÿ¹0ÉAh
+°˜XÆ{jŒÀ™jãKÖXoæw0ÇÕò´—'ÇLBt™f3Øè„¥:´<Y#E Æa™L£@üˆÊrã2bö¾(­ÀŠˆ;P&°Wˆà£}4{Ý©wš•…Kœ5âpnüŸ‰–ì嵂ýÐ=æлo.O9W¾d­s6Öün~ÌRž³£J£š
+Žæ­¤Ü
+1F¦õÉ ®:šè5*ŽãX5áJ&/&JqÆxYní\Œ¢AT‚{ i=ŒBî“„†áà¼VΣ†dÀ_ ÕÓ~¿ãe1XAiÚH/žÆ ®Ï•ò%¼„ûmV»Ó#Á"i4ò`‹ƒLÍÐ*‹… ÓHä$5j‘Öclƒ­´œn(„E,]ϵÅì6ÆQlC>DQ)§P•Y´±^¥þÁrÒŽ$ÁF^¿ß(À![L©ô3-!Rœ.)hA+ýdõGHJæÍ}0‘'õ¨Ý9¥êÁG, ÁÞ;á¹DX¬3'0¬œºj„'ÕÙ@(•QXÌ#rÝ«sPpZÑb†œ,CR-DŠÖùFFŒ¶{\±‰ñ>f'árð4£ŒŠÊ@³Q!„ŠÈ º5G§zÌ>l‚uÔ³ SEACmC Acu4—` M!¹l¤µBª)·q¬ÈbŒTd?bÌýûdí/ßÚˆ n°Úói
+ä šiüõî´G’x²Þ\”°¸I%t·¦G“Žåæ·ËômwZÒóãõúf™Ûo–Üý7øêÅÉã©ò¥Õbž¹,¨ðšÏ˜¯J·ë܃@åúµw$Ëêî*µÈÔõ}*ácê‹ôœÔ»cíÐ c4é2/Ú¤¤Õí4ø¬ó'óÃÃO«íª¬Z›“ûù_rëõå“ÖitÔîq°n±LUåJÇw†Ù 6ËóÕÝÅ?™Ãòûólhcasëßzbñ·¨:MÝöDø)yéS`’¿½5+VÑq…I綷µ Y02^×y:>¡kLRœ§Ý;†£ Ȥ‘_"å ”ó‚Tj¡%’C…F»pƒ­Žôi‡# 婵„.ä)ä ;nF›ä}±‘¢Ë á=¥êa0D'±Íªrõ2 c›ì­¤][©‚·c3@wä…\¯Ó©®ñå£ Úõ0
+ëï£b° ööÁä³X#”0ØÂQt¬qÚ#[Ñt‡RÆ]KÈΆΆ±mÍ Ad%D·ÐˆeHFÜzO#¿&S6½„É(r·’=#·Rê!x@%Ǹ!HŽÊ—Ö=8…fÆEºÞ:$1t=U‡ÐÃ@BZºÃi&.El⤑VX•V©ÍŽyVý7ášáêŽØr M¸¡ 7ôѸ!?8äâ„úxäùDÈ!3!‡>#rH¿ˆ¢=ïS_ Ò€h½@$_… ¢MüÃjw>$'üЄ(™ðC“µ¿|üÿåø!ÿVüÿ8ü+~È$~ÈOø¡ ?4ÙqÂMø¡ ?4á‡&üЄšðC~hÂ}
+üP| ?„m)r…—ðC-¡O‚ð÷›å÷üÉ(zº\¯/ö°>ûØ †!ýbp]ŠªDã¬`{îJÈ|Ÿ!6([¾ŸßÞðKw͈#åO·#¤Ñ<·<Uá
+Ÿ‰&$Ö„ÄšX_ ë£XkBæL8¬ÉÚkÂaMø ‡5ÙqÂaM8¬Ï‰ÃÒ¿‡¥ß„ÃÒÃÒëÿ‡e1˾ ‡e?%ËN8¬ ‡5á°¾>ÖˆMýcWX-ù|çÝ`°5¤Ô¦•:QB\Ôt¿C‘*ìÅ袌®©Z™Žn­±ÚñÕ2’.…,“^åcBR;%”Á šnÛme-IÉ#3 £fØ[
+A.“ Ñ™âDfÄî`¤«D$SÚc)®bŠÊèÒŸFÊ…`ˆ¤1ýu$òpZãùÏé~žî„D°ù9Iå"¼œ¯ß«ìŒ1t…»‡™¡’Ŭè¡UEUJU#†UéU®f˜"ù¡ùÒÎc2ëiÖÜ'ó~æ}ÇÊ Šî<}Féì/fTË„÷^^Q‚%üŸ]¯ò¿Ü·¯{u‚]ÖQ^\k>ÌëSî9â„kƒ>Έ*݇ùÌŸ²Iý˜Â8ãŽ2áºó¸[>,œ©kc£Äàý”áŸTùaF›ÃCÇÜuÄ(”@=È+?Ìh½;d”»ÄæD6_ÛúW¼Ññ›†R¯î·ü}xÿ¾@±ÏwÛŒM«„Cr³mú¶J~žÓ‡bÍóÃfÍì]ª%°.þÿþe@÷Y‡/‡Êå~Ißèéu˜î÷{Í÷ñº½Œr ØQ¡“L㌠ǩ©oMx|yùáú~Ç£^Òz{ïuƒ¾ÌÞÓ Oæç ÷8°^Dèâ £tCˆ:ýTªÙ\å&ÿøöYo°‡9.àý;ªzÐ*ÿ‰ÕçÈm¯×¯fd:½òzµ ï×ùu‘÷ô¶ÌÕú.W3Þº £ÍrŸ0ÝüŠI¶àEêy~ªâÉÏéy~2í 8PµUu?’PѺÃ¥É܃tÿñuDíè^$n‡`Bn±Àøv¶3à{‡Ñô&b´7Ûu~âŠñî[*·Ô³þ`±ƒžRóuÂijڨ;±Ì¯ô\¦²ô%uzz“,ô@'™e”oóÁsø›>î!på^öùÝER¾¦[&—¥r\÷/!Í)n³<£_Ë—öo…Oé¥&Ï Âê â’mj-½bŸ&ÿjc~›Yå÷© &û¿Ó5õÊ~o¬;yHq’Þûp“ªé¬ôy›~ápAÝ/Îu×­+¿;–®‘+·»9¿v¾¹È­7Åò¯4eéöþÀéòoæ›<3ù-³Ûû›Ì‰~q‘&Бß||_L/ÈåIŸ½7¹,Q¼]]]]™Ü£_D\,É ªD<ÿÕÑßS\’§ìê‡c¡9KÈ÷hî•‘yË¿°Ùì»—õȬã?eššÞb9Rêd¾>ö 7D]^^;V ~yEüÇ4BøÃ%9=#šr$äpÁ£Ý¾·˜ÔK,æ˜Cg%4FÖ}àÒÏ[ žù›ÚvpHv¹ê?³øw"¢ûnFñ4t45é¨ Š&ÐpþF€‘¿–®©R WÓÖÃW¦¬'4äf‡û‚Ždp„Ô”ŸCú.D¿?<“¥Ed@A±?“9G«þm!G!ñƒ†8ªBÞJý¬Bø¶–ÈÒÞé¨Bœ#ïË!ÛǃuÌó_,ÞWȺÚxÆendstream
+endobj
+979 0 obj <<
+/Type /Page
+/Contents 980 0 R
+/Resources 978 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+/Annots [ 983 0 R 984 0 R 985 0 R ]
+>> endobj
+983 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.25 238.411 229.224 249.26]
+/Subtype /Link
+/A << /S /GoTo /D (table.100) >>
+>> endobj
+984 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.81 225.903 448.532 237.858]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.41) >>
+>> endobj
+985 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [152.723 213.948 164.678 225.903]
+/Subtype /Link
+/A << /S /GoTo /D (figure.139) >>
+>> endobj
+981 0 obj <<
+/D [979 0 R /XYZ 124.802 740.998 null]
+>> endobj
+982 0 obj <<
+/D [979 0 R /XYZ 124.802 249.26 null]
+>> endobj
+986 0 obj <<
+/D [979 0 R /XYZ 124.802 177.646 null]
+>> endobj
+978 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R /F37 462 0 R /F38 464 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+992 0 obj <<
+/Length 2549
+/Filter /FlateDecode
+>>
+stream
+xÚí\ßoã6~Ï_aäIjžHý Ô}+¶w‡¢Àázi_º}mÙjK9IN6ýë;Ã!eÙ¢íìÆVœ¬ ¢Å5¢¾ù8ä Å.üñ>‹\1¾Ëâ8LV7î`UÿºáZÄó=&9þ²TŽLíŠÝÐ*#\æ†b0r™Ç(ñÿ›ßÿpSüéOFƒG(»ŒCõêÆ‹<y¡þ½¼ùßÍ›¶ÜÁˆsÁÞfÔE.4C%-½Ý
+™áÀcA¤4þáîæÿŒ1‹Cop7SRwÓßÿܹSgE>üãïš|h@ÂÛ¾^ùÒ?®ÉÝPDÎÓýp$¤“îjãÌÅIÔáŒÃƒUçc:KÖÐ7˺Ó3sy|
+]"€õUªáˆ;“2Û÷²¸‡ø;‰N#ĦïÉSaÞ\>ËJ:Üi%dž BdÓOžèvT]àÁ+èªKÓ˜BqÀÒ¦Ákw5«ê2Ëç$ Äý*rûñ¶£…dÑ»Ãèi/§L'ˆêË€è‘ç†N¦Žó¸È&H :]ƒÈ"Õå2U%éLálú€b)6´,Ð:”¥|
+îäCÃm¡‚;DI…j¹ÊÆÈ )Õ< hz¹&ûüï°Ýë܃¾ýí¾ßê8D¤ë?¹«
+[›A!Y/k8É¡ø]·ñ$“¾¯)¤{üÚ½Xs}KC!s#£ÃíÏ–ëc <¡’|jyÎÞ¼‘¸ý¥1áúÌw½“€lCP'& ±Û |ŒY
+yú¯}cé¦ÕÓjg}¾^¥% vПIáuùäºn‡+‘‘c-À•»¶Ç"Τè>“ˆ\Óp åé<©3²4XÀ¶$‘Z!<â$ ã^ä4öPQMRjkÁ2‰ðB¦úúÂ2Ê.¼—1@eqhKYE†õˆm ¸¦`ˆû,éå½µcI¯fHWCºÒY i‘fóVÖ½˜QÞ×ôó«»Z‡¥7÷Æ}mÿjQ l³¿`ƆHK–„=5•[„+h'ùD£4)Õ<+ŸjOªåoÕ¥¹&íÅ‹ê´OWÐ^h‰2Ë:›ìÃk‚ø¼@¼öèõ/ªôþuJ,á“Õ«û3àÚ‘ˆ='ÁCà ‹r‹{±ÖÌCÑqÁ}ûú4Ær¥¤Ñ¥Ü×YP'é±rTÒ‘Å÷¨ñ–C\›Osc©ž]“ƒSÔô3!ÃF =_®Þ™‡ÿp5šK4YœÛÜï+oìÅâ½ø^ >AOì‹^«F‘÷b,ê =ÛZ´´uŽ™cÆûíesù‰õørÇèLš|‘Åô¨33phLp¨%5Ò˜EUò~ÀxD€°V# ÔÑq³šŠeÛ€¢[6eµŸL„d¬ŒLÒ-Qée\eX0SÞY‹ý
+BKùL¯p«®¦%†Ô8µÅ†—:Ï y+àcŸ ßHLŠ¼ªËµAK pÚë¿Õ;ÌÕq=\‰ëb‰K†hEp puB­®" 5é 5}I©Ê冾¢h³~†Õ†”$ÆØðvØH;(p°RWËI"6NÂŽC€5ÊÑfÆ-V5ÑkúMÀIxn—Âð¤Y@Tå},ž€Å~{,öÛŲXŸSülšÒ¢G
+Å„øV•[òtJ¹ýñ 8LzÁÞ,’-µ<@§odkM¤Ô
+ï´6=WÓI Kiž¼xmgý›ÇãŽúèÑÁÌ1~Â̱~ÂpÚ´F×èÆeG7Ô{¢|íÍVá=oë,«ÆtÙ‹¾»Ç£ÅP7ÂO^n}±²óåJxÕR€!zœEo‹îÿPcä9ɸµÐX>}æÅ,fH½C—ä`öu“ÞÉIŽ¦¤¬ŸÝ„19€s=êI›ˆ«†bp[%C)%à!êl_ç.óä¶Nk¥W8endstream
+endobj
+991 0 obj <<
+/Type /Page
+/Contents 992 0 R
+/Resources 990 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+>> endobj
+993 0 obj <<
+/D [991 0 R /XYZ 124.802 740.998 null]
+>> endobj
+988 0 obj <<
+/D [991 0 R /XYZ 288.521 120.126 null]
+>> endobj
+990 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+996 0 obj <<
+/Length 3727
+/Filter /FlateDecode
+>>
+stream
+xÚíÛŽã¶õÝ_a쓳âE• Ù¦É6@vwÐ>ì -½‘%GÒìÌæë{.$EÙšÙMÑ>Œ)’:wž‹ä2?¹”Ê›¨enQv¹9.’å,}·n‹6ZäŸf×~ÂfÅÜiDa ¿ÿòfñ§o•^¢ÈôòfG[n¶oWï™_ýtóýâ/7áExÏ>—TR— oÎá¥Â¦–_úeñö§d¹¸ß/¡ó'BÅò¸ÐBjëžêÅ›Å߈L˜´ˆðÚK´»¶CÄSšd*”±nGS=œ“¦¥H³ü?£Í­</“®ªÎq+ÀmŠß÷Œ\â]®­Y®–kÀZHK+oªWÊ®ª®¬¯ÖZëUuµ–«Ç+¹*8:Á¨®z\3«vÇ{†=ÌÒÆCÇ3÷0ÑW¼kƒ eà ·Wk•¯ÜÊvµ÷ üßòêÁíê Øf8´Í¹„dª&D“AâBwçv¼þîI¾sqaØR‰\O ûY©Mu¹V™ ±V`ÑEFû^}[6nk>n… yá •Íö–Å‘ÝáŽ< Ãz ›öxq©UÛTÍü=¿‘žB{SÿgÐHÙ(³z¸bU•¢äU±ºôcAru¿¡½[Þ;ì«™“îD“ôb{ž
+–@’Ôà­‘¦ ´Éë6µ_é™ ·£ö²(w ¤7# XËÁ°¤Ä*bài''U5ñ°¯:¿³EÚXUdU•{ié´˜fÉê_tü`ߢ0ëÎ)ºwüC?¯ß\³)€½Æœ± ,&IVÇŠ y*@K-OÍãÃ}O*‡å¶©?ñå‰kèËνM&ˆ‹3g5Ï…ÒòÙ³
+7y¢ÜŽ~èî½ 8ê*´x£QV^åH
+Ôîüt惃ºv»Ýl{tÇô.„”‰]Mò ™E¦ø<yø8%Ùz29ç¡rÔÏg¥ÜÁ»$MÂ=ŸIwÏÃà!¸|fúY¤ež=+ó$òA€T:,– \Gý}‰×yfx¾¥ÊC‡þXÖ5Š7³HŠtW1ž¸z'I•Ày›Žo‰ÈÕj]<01ñ½ZCàâ-ŒÁ«ò0¸wÃExôƒºìØvÆá †öêuù«Ï¤"É@š‚¿Ùˆ n#/Ü'€HˆP½x¯™ [ºáuŠ:ýÄS|+#ËH>Š{âÅS ´œcKñæ(%'ò°IéÌ
+‹ñ‘ÂCðñ2ÏኋÙÆ->`ÙT|÷ãB4ÒF†˜"tÑËåéäÃɦX6·†gA”üèý,ñ*¾opõà€Ï†ÇÕcy<Õ.…¤¸?°õy&Ü
+"-Ð!ÇÖRczÉk¦òà™4UfçðxËoÊRBõÅ%AHî%™M©À° Õ˜L$K ™ìH'þ_Š0Štù°x»¤j„\~XÈdùÃBŠ4ÉܧFC˜,JŒs…›«ù³s:Ìíoþ 0w@ð÷ “ŠTùr*a
+ØpSðü…×6ÓØÚíËl<‡Êd&¿ÜÃÃŒ\¢n¿[h †@J"Tf@ýÇ…Î…TÓF“‹`l]¤Z«É”Iaó|¹YD“@sš!¶q|žR27ËSea*P¦6 jˆ—Ç©z‘B|)³4~5…Äݦ™‰ŒSž
+N”l3V¾pÙ/ÊP
+‚J`PˆÀ·þþg¿eüÅî#"ˆÆ^‹Ò
+Ü!€H…â5&[£…å1Õœ¨ ?Þ~ \b3|C¿»òžšáG
+:‡CKy Fœ/(6ïªêþbTG³{Ê߶®®Êœþ½àÌ”ö%XºÃYœûÒGÐp«#§Lá \ýêæ=î%tÕÃ{üýó¡ãôªò+·Cõù‘V Û–•+$;‚$ÁW)äî)#ICzÞpQöý+ü…Üú½'Pn(ƾNbª_센ƒÚ%#ÃkÂhSsu³“˜’÷76û`øþõËֳ܄¸¤Ü2Ïéc$zðÚï£^|Àç5þ&k™‰ïò‰´ÜX*Œ3ødß”5 èŽÀs}¾aet$ Oë—.–Bæ2Æò#±÷$ë¥)6_‘0ºÃAof fÛ‘XÞ“‘Þ2€ ¶I&²–9ž,îÑep†¨†à*óÕù¶–˜êc.VcÖ&¹d%SWœÇå‡Õphé²¼  è+h¼u5W¤kFq›ð4c·Ëá %¤bOUo·ÒßßôÌçÊÆÅêf?¾û.‘wôƒÓrŽUÛb’»(Ôõâ²(þÎpÁdÏ–Ã 
+Uaʯ•ŒÊ}ø$ÉLŽ‰cöQ]ŸJÅCž*LÒiõÀi2Î!—u=fÛ.‰/¸ê‡;új,"lC£9QöII`©çàÒp—¬ßÖåÉû™©ÖC-W2«öv vaCxmØVfúó7ß÷Ø]HQê±/û°?PÏldïê S²z_.i»aÃU*×ÆžûÐ ‘ƒ«ñKƒ—íãlMz%zàÛÖzj<ÜíPl%Ö’”É° ˲H9­c)㺤‡nËÛAêh$u\Eöð·äå!”QÜ:Ÿ?\r;:j«5ۨܢLêÊF]3öhw(†ÙÕ#Ïg¼”N48 3Jêõ¬¨ À—:®Ä²¨àÖ¦Ô(n‚jTüai®±Ýºy*ƒ«"‹ÅÄ'¬´MŸ[w<« [t;Hf…õHŸ©a'Q+‡¼ˆZ}¥dí‹ið#ÒqÁ çÛSNõn|éÈóÆM³n‘¾®rŽ¨H„ÑO6>°n­¬kÚº® 8ëí5‚‘Ák(+1õüÀà±Üû=šCh#óÜ_wìè{4Üu@$w¸wdµaŠ†=é‘F†ÓŠå¢>/‘Ì.[¬£åchâoòÔ»4ÃÙ›œ, jTQa[q_,úpx*ï{ßÖT‘ò­Šìs!»ÉÀ~¬.¿Í09UÝÉGÞ©Ë´õÕÀ”ÍUæ‰õÝBªç;ÔàN]OAº‚å8ûbaŸ5c¹:ëûgQ#ðÔæÄ' …ëŒe{ý"j‚ÿ̵·}3<|¼Ýýë²íÉõð}A~ËÏ]U:@Q}|3TÚÙÑMpÇ;N%¡3µã¿bÁ]0š©è$Ü'T]{À ÛÝÌieä™ÿÀ&øbÆAW‡qÒ¨™ïµ€ÓP©Gº+ë~F¥H…7Z¤)œ æ‰âå0åÆùت 欔³}›¨‘ê\º‹j ÛJ§Þöü;0¼ãP £Öƒ×ç“MV¶UãœG[óõJ3ÌEbdÄŒ¤oih0~4cÔŠ7™ó]è˜dê÷ñ­§,B3'cÿ¢8QÜ‚ÚÔs]-¸ªòüÜ.®™&º”pÐÓaüTÇì2ã |F †’Ó3GÙÜadôW81~¶±d±8Ú[SÓQ®úáS=Ê b&eäžÏ̘ÔðMêQÁ€û8í=…Ô»ãi
+Paq.f ®ósqj9e_jüŠLM¼ûÑY“ëЙÊ5~\Æ0Zã%û‰€ìî‚}òÓþß\sÈgrs®Nߪl¦&ÊùCá„Eã¿ÐŠÏ†×Ì5ö»è‹&ùeø«*üa¯LßÎqû'·Õ1DÛ½oØuå@&1~$†ÃЪCXt¬ê±ê(.r‡-\«ë™3JÝwþþ
+;lÛòúÚNã1ðpú7Zg)`S9¶ÐŒ…ùß·Î$ª?!çBÙù«³LØÜ<ÿÙ­•_ŸæÅ®òþ’b¢Pendstream
+endobj
+995 0 obj <<
+/Type /Page
+/Contents 996 0 R
+/Resources 994 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+/Annots [ 998 0 R 1000 0 R 1004 0 R ]
+>> endobj
+998 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [373.093 681.278 387.816 692.126]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.118) >>
+>> endobj
+1000 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [358.233 501.902 370.188 510.315]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1004 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [260.045 206.731 272 215.144]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+997 0 obj <<
+/D [995 0 R /XYZ 124.802 740.998 null]
+>> endobj
+999 0 obj <<
+/D [995 0 R /XYZ 124.802 668.333 null]
+>> endobj
+994 0 obj <<
+/Font << /F23 440 0 R /F39 504 0 R /F8 453 0 R /F37 462 0 R /F49 1003 0 R /F43 618 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1007 0 obj <<
+/Length 3727
+/Filter /FlateDecode
+>>
+stream
+xÚíÙŽÜÆñ}¿b°/™Ä6ûâaÃŽã0Û‹¼Ø†@Ípv)qÈ ‡£ÕæëSWóŽ´†£¬âÀ$’ÕÝÕuuuuU^ÅðW¯´q*‹Í*u±ÊólµÙ_Ä«húêBKë¬J5~iŒlæ•Kàé”Í vùçj©U¼J­¢‘¯¢Ì*åW÷?¯~W[h}y¡ãÕw‘I”u‰KWQ«DÇ>[íO qk³B˜÷©·$W>ÕHÀrkLF0'nµÁ©²qj
+a™NbM0ž&2Y˜d€áh“&¹™õÌ[ïóÆ\¥IœøÙÔ6VÚmS¶àe¦ž@µÒNÇn5Á°ÄåétæԨظ4%ºjA¹v5á` ®ËLä3é9Èq‚qølîA5#‘É’—3ºÞ\Ü^üô§üi;ð þŠø|O^Ê$N[0‘Š›(¤¾Ð‰Ò©5s86tmSØU ö¦Á­ipk‘v„ÀΦ:¼ 4‘—à8ÅßE søcæó 3
+ËS‡®³»ÇúãWa8èT™¥ÞÁh ÚH|
+ŒÚPŸ"=ŒÂÄLÁbrpÑ
+4ñ¼ÄÏ xˆ<›%§!6|î>¸gšèÜÜZ‚X’|K>9‘k)ØAÁ¶bkx<`Ì«Tå>ÎWl)ÎÌgá¹¹-ÒQ†Ã.y[t24Z"N¦N¨‹Æy ó€8´ÄÃð€9šL14†ÞKÜÑÈÄiãéè33œRqJ攇éÚùS+ÿ;Z=|­³¸*•†­]P3Æ…Øè¤ £½¿^_|ô¥ËW´‚W×;êw½ýy½k¯~½þöâ‹ëa,Fjå-î_ç¦Á¶ä·Ì²˜$â¡Y†þ04kT®=Pƒ+°Z4€tŠ´ÿø*ÒëOŸ_ÿû_›òþ9>?¯º >ë2´¼èË7W‘·ømù¥ìKly]4þC
+WvEÜÕsª=M‚)ÍÒИûç_‰Ï¢y&Л=>žÅ#ª\%6gTn@u‰½vU]ã³Ü"¨Ç×îXÒHx½|Fã2ÖO)¹ÜUÄTM¼µuÛá1tåV^µ Ž§ó^î
+’N]±
+¸Á‘š¨ÞÓH-¦Š4FÉ Gz:ß(²ëÏIï’×3|Nä™ØŸ—WѼª¦<೨ËÀû¶ Ð-Š€Ôúºdfy À'ÌŽÏ•Ió)áß¿Àæ—¤”ÐYm>mIAÕ ‹ï“¥€·$Ðâþù÷dk/­"êÿÑ—ìÖybÑ~#Â²Ç Ó@À›-âøºìJˆÉ̺¿L’¯;be‹
+¡Õ•^Ï&'=[ºn{þlwü,øq8¾€1}W>u9c××·
+VE«ò° ç,âÞñõ—à¡ËÕÃI'w²çÜd
+sͼ.äªFƒw1Ø÷Š¬U¹ ®ïk' 3t
+¯špª¡“7®ààÎ÷“DpQ×W™[cÃIM
+4l¥bBP]m/‹
+B1›ÌE|8ÞÉjÄÙ{)˜qÉÑù¡ä¨×’þ§}&ÔØàÀWs¯)#b,WJñ·ÃæM·‹Êáږ‘TŒµåÒa §·š•)“±æáÀL'e¸ˆf£áT<ï¹ú8|©„*%ÙP)A
+Ц¨Ë­
+;¾Yèc7% ¡–rË÷&ÊU©y涓M·lZÜkon¹¥jÄ:
+:šñfîE×Þë¡cßÆ+2‡ëÏÓŒl4ülÁˆ½_¿7ÅÀJ©„Q³X‡³Á3ö®£æÅ ñEÔyÎË
+ ó.Ú¶|ø–Èy6_샴¯ÆŒÆçÓ+HÑñŽaSÊÄ÷gF¯šœ›»p뺷B¾Ž’yB$Fï|Ja1l*pr[™°•çà!Ot®Á |þˆÒ¥Ó”á =gîR 1æ# à<ó£xE9¿ÇÓc°¾©Ï¤Ç€ž˜~»¡œ³cpºÄûÙ"†&7Üö„5ç5Þ‚Í´¡.ŸÑëq{‹øB~Pec ²øì5YøŸœ8">rà [ÞaØkì-¨
+~4ã•@€7Ê¢p¥ ¾+¹]3¹—Š95“…MG±Wm‘\2½çJa/ðæ¼FðG ±;ûs1X«*£;>ïHBfætV¼’˜Ùtž.ø7Yõ>endstream
+endobj
+1006 0 obj <<
+/Type /Page
+/Contents 1007 0 R
+/Resources 1005 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+/Annots [ 1010 0 R 1012 0 R ]
+>> endobj
+1010 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [406.093 369.68 418.048 380.529]
+/Subtype /Link
+/A << /S /GoTo /D (figure.149) >>
+>> endobj
+1012 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.7 307.85 264.162 320.166]
+/Subtype /Link
+/A << /S /GoTo /D (Hfootnote.105) >>
+>> endobj
+1008 0 obj <<
+/D [1006 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1009 0 obj <<
+/D [1006 0 R /XYZ 124.802 532.733 null]
+>> endobj
+1011 0 obj <<
+/D [1006 0 R /XYZ 124.802 356.943 null]
+>> endobj
+297 0 obj <<
+/D [1006 0 R /XYZ 124.802 187.793 null]
+>> endobj
+1013 0 obj <<
+/D [1006 0 R /XYZ 140.045 129.79 null]
+>> endobj
+1005 0 obj <<
+/Font << /F49 1003 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R /F37 462 0 R /F32 450 0 R /F7 627 0 R /F38 464 0 R /F25 630 0 R /F24 472 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1017 0 obj <<
+/Length 2723
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝ“Û¶¿¿B½ñƒ4c"ø$Èzú`§M›L=qÓËô!Îuâ˜Ñ‰ªHålÿõÝ€¢DJ‘/míN3ž3A,vX,ö· JM$üS¥­È¤žx+Ežg“Û‡+9¹ÒŸ¯Tb¬^áÛ1‰Thˆ,ÍÇÆ(+rk™ÿÕÍÕ_i3ÉEžšÉÍ ¹Yü0}+•ŸýxóÍÕŸn:FàËNèE’î‰Ì†‹5Êûâ+“ïi0 “ä/›f÷°i«: ìÉp©Î‡qU3KŒ÷(žé´žÏç¦?•·³DM[î|\V·3M—<¶i‹mùxÄf[Ïí§õÝ èȳiÕ2ý6
+¹ ¡ ½Û²hË¿<Vír¸šÄKat:I”¹s4Ùuùxf]©‡]¶a]8 cxøÄé;-nÛÝLM‹Õê=Š¡f¯…Î\óª~7P¤r!•ökY,4,Yüºæçݵ> MËÇ®€ŸæÒƒ›)‘ÚÏÞÍ4´²èfïªúa` ‰TÚž‡i›¢§àcï)üÞnË[~o8½æg ›®÷>t7 Ú÷Œ¹9ƒÂ×ÞÑŽÓÈ͆ô”ŶaùÅáDîê-I1(nEž0I¬Îë·#YÌ
+»ª€a]òK½fZ» m½áž·ÒIPrHóêÛìFÕ]Bà#á áì}6]@³j60]²
+ž© ¨Ö<¸àW>p5Ú”t©iB+”kÛÁ\MšO>î(sÅóP8…ç(ËFÁå¦çý ™=4
+¦Û‡ëYQ„ÓGT…cQÀy‘ª¨ÿ¨سÌêÞÉÏò)ù+•r<þpöôž ÷7ÁWp*·U±ª>€QÉT– ï²›ýLVß6èwtºa›3·Z½™¿¹AG¹éf~*08'œû¬ÃpÁ™2†…/ëõíj׌¢ƒ°ž÷BZFiFÐ:ÉAðp yŠ¬Ð[®|(Œt´ÐwˆB*„_õ†®¸­¦uÐ=â2/œôç
+MRl!Ê,,9±2G¨Ú¢Çå–Ïg>zFrÈ"½?2Æ_‡ÆàÔ;£†5’ù|#8šÜ=ô8ÚE²OA»°œ+`†eN9Øë.Á£Çª¼ ©`ØcÁ‚x¢`Va`u(æfYò@pW»míÌ».‰Û?A]Ͳƙ=ÕÇÙ`ºŸ79‘™xÈꙃsÁ€Ol°£^£CcßàˆZa}4d秴Ö;žâí*dGU40Ä:^|}ßõý~pºÓT¤mž•Q•ôÏI$Âɇ‡t
+c'dš: ê ¢9˜1粓‡«õ^0Q™fºS åÔà¿Fäìm Ë\O4š0=ÒCTÅ´³z^ë œIÇš@à×vTÝSô0ã^ô°f|9D;R2M7 ÓĹעœ°ö”&^°˜Áæ$u¯H
+7y¼úaò£œ,`Ø7ð÷Ó•’“×ÝÎaŠËŽÛ('««¿÷ü‰Ýéo½}"C¹ œnïónzà
+qÚ–„ö3n—4 |7ÐîúÚ¿¬) l÷µßŽhõQË‚hMúK±Áç¶Æ BL…«øR<ŸGaøz}=þ6²‚ )
+dÂuò®Ø…Zß©…g[ó“‹ÄÀwü8 ˜D<ÕlyÊÅEem…ö‰±k³š‚9,ìÿÍ2Îå¡ —xQzѤã̪ti*$ŠTúR W± 5 P ºá9ßW6+Æ)¹ݪÌÈÅš¢Ÿ~Ýö%’®šš{6¼ª¦©æ¡XDz¨‹ð¬Ú¨i?¦Ž/`_ìÁ³¡1£bvXžr‚gržï
+Ú-"hIÿ= ½ aG²"ˆ“:2ÕqÕ¬…ÓOÐÀ©ÖÓo1C£¤'ÆD#ðøŸg°«]\\SlÃÒ¡½å¢¦¾Ç«>„ì9q)d<¾¿fñèû;ôAò{r¨HäѵDW1 ë¯9@VtgÞê5
+C á5Q±ÿi˜?Š ÜO
+ê¾âK?°žUQû˜*±!TÄTŸ©^˜TŸ‰@kT¢}Ü‘eÎŽ1Ñ)ÄW¨õÆË($2Í}dDeΤc#ˆÌáýç¨&¤>I3öôH‘jiN¨Aâ‘–‹"*ñí•(-”DžÑ2
+ˆê‚¥ŒDSâì­ÅÃniIu•Í%xý¡ •iêÜ•ž ºì8vâïØü
+¨Ô)mL½@]¸‰ˆ‰J_cщÐ.Õ©q•DM/\ ¦Uxs78„Ypá Âë«ÌŸPIÔü•c&µã„µfÊÊŠ˜ú묙!ŒsèËÇ\3úJ¡ÒT›ËÑ7Néÿ2úºOŠ¾ö?…¾îW¢/É‚Há¥éÏt8•pìÃg\,øRÒ9Sœ%ÝbF JØV÷ô±%Š ]X•‡x?´bÒŸá§/ÿ¿Æ QK\kz×¥6ü
+v\°„ˆdFn‘B†ïíùGdf½=þðçÿnðê†endstream
+endobj
+1016 0 obj <<
+/Type /Page
+/Contents 1017 0 R
+/Resources 1015 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+>> endobj
+1018 0 obj <<
+/D [1016 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1015 0 obj <<
+/Font << /F23 440 0 R /F8 453 0 R /F39 504 0 R /F32 450 0 R /F11 615 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1021 0 obj <<
+/Length 2983
+/Filter /FlateDecode
+>>
+stream
+xÚí]oÛFòÝ¿B5ò@á–ûÅ%ïpÉ%-Z HÓsÚ>Ðm+'‰.IÕî¿¿ùØ%)‘Rl%‡$HHÍìÌììÎÎwä,¿r&•Y¢fÎ$"ϳÙbs‘Ìnõí…ôC´ÑÂIü5Œ^D–æ8æõÕÅ×ßd³\ä©ž]ÝÐÈ«å/Ñ¢ÚÌcÝÏe´k‹vÏj;uê"|oð5‹¶nÜÀ¨in
+-¼ßùaër{ÛÞ1³êfþÛÕ÷ M,¥È­%­
+L|¹|äQKÒJ$6õcª{ܧUåeòæ
+²¯@žµÑ‡’–ƒË8¦„cgV“ï‡Þ(¨ü‡:“°š
+',݈<“zÄ9›`<ÞŸòþpœÒTËŒ8;#°n5òþæˆ÷„{Êû7düź|G^ŠÏ9%µpÎ)ãT{§}ß6k¢Þ¶G©å$µ}®O2ŸÇ'å˜æ±Oºó ùŠ„A®ÿˆ5OW1­}‰ÑÜUèCþIétáÉVáéËŠ#ÅÕ]pW ³?B ‰;þW1 êGÔë§r¬BZË(x?¨LÈçK0DÈ\‡iilö&MÒç–a{B°^mCIÓ0¤¨=}µõ/{’ÁéB†~Âûj=ï9W÷ñ’Æ?ز{†L§« Y<Ô{«f‚-ƒ|ujÒ̳ñSì ™ƒZiQm1Æsa’â¢3ð“ôfG_…*Àûb9Šä.ºÞa³ny‡¥ªm«M¼»gX1`òpW5¸™
+Ÿë
+Ò*“gÓ‚iϑĽ%œ4zZÂyRu3e/EbŽrL #Ÿ Ì¸>ò¤½ ° éE'TÜnß
+Gˆìüòˆ™Ä—Ò›Š†@¯àlaMØYO
+ñ³WˆÎ#Û&ÚTôù>±Q¹.üW욪7Ä~rP[‡‚Í¡Ïó@‹u_¸°À†%ÆλW¼_¸Å/Ôu9Jï‘f8¿DÃrážLÎê[?â§o†7þRœgj¿+î-˜Dj”Ës¯šjW/ü;NÙ_ñ ¸³ÒlK¯qÁ 9–À̉ŠÔÔßf#Æ
+«©gDÓ{iƒí ÿ†b˜û&¼MwmøÞ,xVx}Òx饾°@
+Úz¬ªw›­è{­†1BZ)2º¤S12ˆ×IÀ.«®
+–Æ@Í—`4—ûxÉW\~÷t¹îøÅ[ %:¬QWÞS£ànÝúÂÞÁœ°—jPÙÛåÁ…ÅèV;Øö.õiü*\x„U
+Ž ßýý%"=„VtÍþ!´^ˆ4'õ*˜ f`ĈZAïø7îЪ¤»föm« üõ‹Þ†+ìÃN C Ķ¢>äyÏ8êgÅ6Q¨ELN’ݬ°1Ý oÔ–ç›d!Ñj¦_'¡3–º¢ŠkAÞ*×Ba]çåäÏ
+™éTÈ<ÒH®…Vràè&Ø [°£˜ý·&©—Ü#šu)ðâ⢶SžÉG ,m&¬ F9Ý. ëk\hT^¬ùª{âó°D£pøñܽ²SJËbº3§ÕĮ̂¼s˜
+¸ý…ü/" Ú@endstream
+endobj
+1020 0 obj <<
+/Type /Page
+/Contents 1021 0 R
+/Resources 1019 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 987 0 R
+/Annots [ 1023 0 R 1025 0 R ]
+>> endobj
+1023 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [345.654 238.155 352.628 249.004]
+/Subtype /Link
+/A << /S /GoTo /D (figure.109) >>
+>> endobj
+1025 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.48 119.329 234.454 130.178]
+/Subtype /Link
+/A << /S /GoTo /D (table.108) >>
+>> endobj
+1022 0 obj <<
+/D [1020 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1024 0 obj <<
+/D [1020 0 R /XYZ 124.802 132.281 null]
+>> endobj
+1019 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R /F11 615 0 R /F23 440 0 R /F43 618 0 R /F11 615 0 R /F23 440 0 R /F8 453 0 R /F38 464 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1030 0 obj <<
+/Length 1970
+/Filter /FlateDecode
+>>
+stream
+xÚí[KsÛ6¾ëWh|¢f*”xðÕÞ:i;“KÛ©zJr DÈâ”U’¶ãþúîâAQÉÈ M«‰Ç3D,Áð}‹}€têÂR&Hè²i \Eátµ¸Ó[èúuBœ¿µtÎmïœRN<©Mº˜Mç.áQ„ÿLÞ}p§ H¾àÅpú
+ш¸”x—´ŒÁ"[‰›¿Z†ðˆÙgS´1WáòAàv0Vl™mC›•I>v”çÙœÚX¼»ÛÊ"]uØ“Ñ6I÷ùöÆ 5ØäÈîô_ p©Š3͇U¦xcg¼[IK‰ VBڎ讦éXº c7º0<ä~;(„ý~?öAØ^‡Ï‚ððz<£hpÈ•E•®jô"è2»Ù|Ävÿë
+—BX°[)_‘!Å0e÷#té·¾ Š!?î2ó%Õ⪉¡ ÆfËÀkÛƒš$“-
+Ô{H¬ÁƒÊ}¼’ãøôŒ#.K ·­.„#ž`½¬ËpÊz˜wbXUžL¼gRäi¼O‰–­ƒùT±-<Þ:T«¡Í|®òyq´¡úUéNê/Šc8$r¬É
+ͼHØb ’\sÏðº»áÎSKƒ}JS¯Âц淲…G›y?&ò«+Ïtxêßl†xK,@¾x¥Æ®‹‚¤N)(zÿÉl]ì,G©³Œé]®‹™ÎöVIH®a×Yæy&ãÝËï:ë8³™,yzW‚úº`r'¿Ã´Z`Ro48-­Ô’ö\ʨÝ:Ö,x‚‰9/<$ÏPbï´ˆ äZ¬ü])׊)èìÏõ'ºf8¬þë½ Yð‹ÊÖa~ÑôêC] ‚žªê~á<è·Ñ}'g"tú#ÎJ“}¿¨Jz½[I…  `º×ãú8<^Å©ŸÁ£U{.áïhʤÍr§b¯N\KÝØ+Ъ¨4‘vª¸^êL&ãIýQ¼¡c¯ÂyÎè‹{G«65Æö–8)±qC^ÚAÒK Õ<çÕ:M×üäB¯è!M`|õÔ¯ËSo:ç;ëã”&úlîû6À<8'Ô1¦WdXäý^Az/3ùÕâͪ±­ÚëÂ"쫉½:»VG©¶¶* £W¬øÚNøÕÐ,«ÇÖÂÍø~kïøñÔ¸¹yqoõ†e}j䱿Ä6¤ :äÙ
+Ú‹Är'ùCoùyrÜôLŠ|fà4ž6UQW«B½k³ N}ëÐÞL)+Ö¸®úE‰
+¨‹ËÃëb0kÂ'jöI|ýóì«îÒ5¦t=bhgˆ5?r=^ÝŽ+t;N©bxé{ ð6 á*ç8VùÍ÷`ÏÞ‡á%aH›¢Ýo†Ü‰—ÿÃù»G<"^ Ì-¿/0sjAXDDýzR]Ÿ?+-P×%¾×ñÎ/c Ò™D<hQ‰Òˆ·õRß'¡Ò³¡w¦S
+endobj
+1029 0 obj <<
+/Type /Page
+/Contents 1030 0 R
+/Resources 1028 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+>> endobj
+1031 0 obj <<
+/D [1029 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1027 0 obj <<
+/D [1029 0 R /XYZ 285.906 210.858 null]
+>> endobj
+1028 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1035 0 obj <<
+/Length 8993
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Û’î¶q…ïõs9»Êdˆ8W‘»âª¤Gw¶ËV$YÙ)KÛÖÁÉã 4M½‡ì”ËöžY\ÿšÆ€àñ3/[ùy1Ö¯i³/ÑokÎéåËo?Ù^¾)Ò¯>1¸‰ón~šˆKW—°¯Ûn§Û„¼îÞ·øÛKÿµMf-ÿ¿Åµ
+ý×ÛËb‡ß,»Yßs|YÌæÖÝ…°¿|ûÉwãƒë$ï`úôóOþá—é%¯yw/Ÿÿ¹nùùW¿{ýý¶mïþðù¯?ùçÏÉvæ^BXÝlýLøgΧȺAÙQbp/ûš£ç‘ÿtÎCï°.>•ä-ÊÖ ÌµÂÒâ—ÿñœ‡f^Ÿ÷k)/}$6pê&E;t±4ÌÞšt[7»™SdÝ€äѤþÚ¤—<ôëâìêK»XaÝÀ_+´îZâŸ.yÍÌë³n !Y¹Iëùn“šs$Úy¤ «-¿“#뻲۠ù¸­©Œ×ÂúÑ~hÖ5X,qÚk@ßu¦YYŸaYûêbRVQÓ³1ß³ºs1åûLy+½mIqΆxjʺAÙ=Ý>Ü‹1qÝË—‘yµ¦ÔcdÝÀ£ŸUØÍÃ[>Ϭ¦ìRäÛ—ïõO4ó
+KûF¿+¶ ÔŠöC䶓k£úµ4‚¹D– lWŸõPôë’K²õ^lѪ]ƒ¢——Ýjsé2bèQÛšèfyåŸÛž³ØAAºîÙ¬¬s¦Ò´i“[²êF×’èe•Å}5erÓªî´-‰n–·_™ËÄ^Yõ]×+ÑËzåËJfKbuUW¶%zymv›“g•¦kÛÝ,¯,i}ÜØ+«®ì–èeýÒ—¿2ír[V=êÚ½¬6`Õ’å´Ð-º¶D7ËsyuÎ:+õ˪;]¿D/ë—®”à|2­ôkSÞ[V+«¬Aeã¸ë©z¸Ù’×Õ_sóϾ–ÝGö­UWîZ›—§ÙÕ$ÿ±Õ
+èÚêÐÍûÉšR+nÞM@Vö’jå¤Gå ÆyHÓ¨*>ÜÍ:œvÝ·¢Ð†UÕ}_KókÙÙ•už”TUíwµ4÷0—ãç䲚¬¬ Í,,—-WÖduihn›Ê‚$îQè‡UNº~¸ yxGØ´'ö0MOìaÃë|™š¡žyC6Yù­¡yx]*ûŸÅ0õßÚ‡ÛÇÕ¦h“×demhÞ`ÖhÂ&ÕÖdumhî½­šh¥ÙdeDóðŽ°iìaª‰æá]LLeéàp#8P–ÇLÝ`oòóƒ7t“¹|ž-áuõÝZ–%ùd”ýÃb4oÙ'‡ÒU³—+lœ+¼¹Ón^VßnÖ°8ú”â`«mPt³À
+0åʪ®­ Í#-Ƶdíâ ¨º×ô²!0ÒbYF·ÏêøpCï°BmÙob‡lºêKCëhƽ$´¦+¿44´ÖÒˆòDRu]eheYnÍn7beMWV†æ‘æú;'¯ª®ìŽèeÝq¤M»cÓtGô²îhJµeÿ½ÃŽŽHNËË*7ñã_Úϯ«Ëæ]†™Å•ÞS fWD¯ ëVµÁ©‡Mˆª¢2‹¼,l «·!åyZUw]Yyš1«—ÓªšuqÃ{È‹«Ï°KA¶Ê@òò@¸¨lý.V9è‡÷˜áÔ@ANÊ@òòÀ²è y B^UuqdåieI]ö^Hkª.nxyqÝ˳ԜMV’÷0þܺó0þªª€ä]¬-cßnåØÄÆrH”·=M7MÍO º{v¸Õ¨›xSË$ný¹ƒ¢ÞÔððÒ?z—a^ì×¼ù]¬°êá\á­Ýy÷ê+‹i÷(ç¹zFÙ¢èæ‰&Ã׺•-GaÑùK­:Š³šuÞòiex¤XŒóúšžÎõÝ;ÌBdËòÅ©=Q¿óý}zÉCï!¯,*b A¬¯ê»ª¿tï1oƒ{âÄþÒôt'ïz‰ÞCÞîàüô&æ5]WzyeÍ»—ã±=«~o8\¯f5ó1¯ÔìÒ&çU]Wzye-šÍfÅö¬º¶¾f>ä¹²·ØàûF{Óuý‡ñNy¶L®Ñç4Ï«êÃùšò†y±{9úÛ\L/Þ–C‰`NyM÷¨>ž?ѽ {ÙYÀ¨Œ›˜Øôsâ½=zy0*³Íb^Õïä}zÍkÞCžßÖ-¦$æUý’7›±ÿx½XÞ¼‡<gV[þGÌkúú>»ÞšÙ¼‡¼ºÊ°QÌ«º»Sߟæ+˜S^9¢(;x#ö—¦ßë¡×ÛÐ}HLå¯H[½‡%úí|‰¾ÉM|< šw!s™k|9`*£_kò)íÞ`@ë! n -‹_) äýFØu$ •‡…¼ZȪlOa÷º Za0wñ;kò­/ÍÌGù±6¸™ÊÃ¥`¸Ÿ6\⪼£úì°¡{—afqð—Øë$qUÕÆ‘yÄ•ä¶l…ꚪŒæòyîŠ/¹èFÏ7'WÙ5Õ¾ñå…k`s/Ã^»^‚s09•éôrª¬ÉU
+Œ×]¬™õL°.Ã[&D ã@áMVÎ'hæ]Óø3ÅaWå šPÐz3k€Ó,RÈñFØg³‰¬<lÛÖ ‡–BX“U
+ZY˜ÉvÝò&UÖd£›PºùP¬ÉR4ÒŒRõ¬›QÐ{˜QFÞ|Jéyš)…òØ”ByÂœ‚ÕœÒóøœ²¥â+³‰4©T}×N*è>L*›Y}vÑH³JÕýYÅ^ãš•Ï*&8H)‡ÓÖLpQãt [uTŸ-3»wær šàTH°p¯­q&žóªžšj?z`òÍõ@¶y—aÞÖðò?ŸüîåÛËWe»_—ÿþ÷'f{ùW¾<3p¼l_Ï[¸5ÂÕ@úå_>ù8\„ËMÙ9añˆºòð¦»ùâÑ”%º÷¶˜ËÁdr[¸$‚ŽªyxÀˆÞe˜Ë¡_SÚ¬XaÕU«q´ª³{Yæù]L«zPLuï!ÏDø:71¯éªƒÅî=æ¹²×Ù¬ó@WK¡õ¶í«Ýá©R!­êFWzypmÒ&9t§<”ênž˜KÍe Hƒ¡ÊF5Ðz
+åèqKp7Ü f»ÜÊ]uTžÌGï2Ì,o‡§ß’Kó¼¦*ó†™ç•k€ÕÑ<¯ªÚ<2×{†öèÊž%…u7ñòT]Ó›šžîC»{ö:œËÎδg¬ “çø`¹[Uÿ±}¨›öºRÞ%•eؾ—ÊD—ƒÝOß_“›8.n•]Ë¥¾oß¿3¯ÿ{¹?¥ù—ñËÖ­îæ‰UvçÄiƒ†Í”ÿ¹Þ^Ñ>gâ)¾Ï—½‡ƒ7ÜäË÷lÇ/ÛþÒ¤Õe7>…
+/©³¹ÞñêêkÙ.倞ºúðš`óëâÖ=„ÜÎonvÛ/¯»ì›øñC߯®¯ëp²Å©«+á-¶k~ðíÆÛNbR3”6*3Üåq!l†ªjNìâ ÿïƒùdê~‰ÎêÚÙYÝ¥}Äø„ù€°îœ*;4 ý¶6‰ƒ—¸w~w°+Í—EŽ]Ü-‚0ü‹q«ÆK‰M¾$
+âf‚Á3ñ= ¾¾9µ”káñxõ’ñu9@¿…F»–£Ÿ$< Xe£|B{A7™áU1‰ÞéïMÖ=î¾ yxáÝ[eú‘*«rT=Q¹ —¬õ˜Ä')ªÊAÛˆèaÞ/ 8} ²Éºç)4/¼ ÎÀ‹A„Ê@V6"zÉ
+÷­”*E5Yõhû‚^²&¿fïÅN_å zhA/Y³[Ó¶y)
+d哶Kõ’µ¬KÖòß]JjºÓ}WÝÌÒv¸¦í£˜º¶2t4ãá’= ×iŸoºSvúîf–7{Œ˜â4SÜ0êÖ8Ò‡[áÜéævíñôöᶠžýIRZjOïœÒn¾§¬™‡·,”b¬¯ü™eUu¿•uÓhÞ²³qqß„ºšzɺ7¨Ñ<¼Á®Ö™]Ȫª½ùM^
+Õ쬋ϻzèËÚ'ZTßµgG š‡wd•ã;ﱘe5M—5¼,+Ãåo7Ϫš2‹¼ðvšPß»YVLy3é¸:­rDññ Ú‡Û[x•v«¯Å9]ѯrîâ£Û ô+Ü`wo籩êéíÃö²¤võ’°ƒ£ücXIz6£yxs½q!˜yaUÕŽh4/ÜCP%ŒÐŠ(ßš«>ìÏš›ÅSŽžŒ436ÙÞ*î“=Ls³8»•Õ´RuMVÎÄÝÍãà^“zIjrTîdº›Å¹²PðÜË<®ÊA=w? ,Ç&ìy>š•£ »‡9¹uÏõ5}ð–
+<^If΅ʮޙ ûWîj ÷_ÖaM°<</ùï~^4ý•Z*Ü^NkJÐ…f°=³’´·y€öJ§r¹¢M0{¨) {µ¯¢u@öæu!%ïX×¾«ŠðzBT£ã©š°ƒùFõ` À”?ãêí]Upõö6Ñ<Èzóâw,î T•FL½yT“oµã§—xÑôæaˆÃSôNácQ£'DUYWzy#"ÕNèL§èÄ㇕Íø¦YUÛ5ü¼eXÙD™l%&¥?¯‰QGϫ϶¡›Ñó<fMáyMÕ±ó–afð<¡¾Ž¿;øw¨ØyB^gßé”À{<±£óê‰]{½§Ñ直ç-Ã;Èyóòš¬jM´òÒœ'„!ùNÕ”ÝqÄÍ›wMdß):fînIؼyeUVµbsòªˆ™7êÐ;U#ooÄ2oÞ;õNÑ ¶7z#óæµu袉µÇ*ëÀ<! ‰wª†$ØÞˆ#^Þ¼76YÕÑÊû#áòæµuâ¢! ´7*#Zž†¸;UCioÄ,oÞ#›¬ê‘hå=’XyóÚww,í)×E¨¼yT“ï5ã”wÚ³uRž°cCØf?Ú{,¬ƒò¤UI#Ý©j#Èë"¯zHcÝi:öXÿèIÛj=ÛÌ’@sHÞ2¬’7m@[_Í©ù®–fe×!yÓ ¤Ü©¾§¥öÈMŒ¼iVU•U¡—guDÞ< wºÂˆ¯Gv‚ÖM{`gÜ)zàBp=2¬YìYŠ>8²ÈL|¼i+vÂæ#´™ 7ÏB¼î#¶Ù‰Ž7Më|;MeÖ#3Áñ¦Yn§«ŒÈzd'\Ý´/vº¦/VÌ#kÖ{–¦/R™o‡ÇÝÀÅ«¢×rñ–agd¼½,Kàîâ)¯‰:,Þ2ÌŒ‹7¯Év§úQñÕOˆk\;esv¦$.^ÜֺȚRñš¨ƒâ-Ą̃xóúØNÕšˆÓãµo†T;ecv¢Þ!°Sñæ}±vª¾Ùyz¼oo^RíT­Ùiz¼:bâ qi§lÎÎÓãÄÄ›÷M„Ú©úf§éñ¾ID¼y}È´;Õ÷ˆ‡w¨ŽˆxB\cÚÝøöDÞ!Žˆxó8dÚ©:Kgé±8"âMÓiw««H<¼CZ'âÍÓÔNSZGé±,"âM³i§«¬ÃôX1ê¦C cæ#€èvc
+Ñ̉ˆ'"ÕîÖ¨˜x‡ÀŽÄ‘k§ªÍ<˜xR rí”67$H4ì‰4§÷qÇþ,K·ò¯]Àð59ë¸xÃË°xpîßäÝÇ9e-o¸OŠ$¸Ý1òïØÁxb`§Û½(¢ñx ‘ñ¤@ÂÛ±ñx ¡ñ¤@âÛ½]¡ÇãÄÆ“ p÷v…"O
+$¾Ý~*âñxdǯÀ ÓÑ?Ç㡪ä ó
+|ÄÈ;ä!#OÌCÒÝ<“Çó:&OÊë°»SÞ#RÞ!IybÒîn}",'vœ\}­+ÌÞsž\“(7¼,/™²*w§·FŒ¼*{]Þðò¼úðw”êKíñm]y/¯>|›R0aNÌ뺖™Ç샙Wï—u1‡0§æ5=©°yÃ:¨yR7íä;å<ƒvÞM;8OJìø;ÕDƒæC²óÄ<$àÝÈñy<¯ãó¤¼ÁSM4hfyDÐòˆ‚§›hºýPa‡ÌI3 ‘â43MGÔ±™f
+S ¡ð4SMg𱩆Îç
+ÔÌ5=Í5ÄÑ'›ÎÂÓN6è?L6ÄÒg›ŽÄ{{¶qzl¶4=¸îáÌì§×d£ãé /Ãé-ee^³óôšt@½á½ÃÓ[¦@½E"êÁ’2Ö»Ö¦H½&'-So¸R03ÁÚ8gꡬƒê /cêI5v2Þ±Ä'T=^Aõ¤8"ãóaõx Qõ¤@Bã½(rõ«'"ïí< ¬Ç㈫'ÅOS_§òñÀÖ;ïΠÑz,’Èz˜ >žbHt,„žƒ½µßâ¶ÏÙs(ëàsÃ{BYÙqHñù…«žéºÕˆ‹p–Ûf©¾*;]Þð2¶Ü_’Ë?®‡²–®7Ü ®ï
+)N¹rUÔÑõ–á%¼^Y³æ|¹xÞyMÓÀõ–aeëÒ\O`ëyxI?œÆœ5A­ž¬·Œèh½ibñŽi
+°Ëc'¦`=«òº™óK>‘ŠWµ §ê-ãVoˆH¼S ªwˆ¤·O¡zs¦Þì‘BdâéžðîD=öH!1õfË#Oó°|걇剨7« ™xš§2;OUED½Yñ”MØi|,¬õfe"OóLfÇ鱇2‰§7­«ñTMØI|ÃL<½Yñ4Æwš‹"žÞ,
+‰xšGþ;MEOoU‰xºguM žÞ,©ñTß¡øxZçéÍÓ*OYYgñ±4âÛÍz<ê4]~°ñÈ=Ò¦"~ïùƒÈ#ÌÄÒƒ÷…v«³ðª¤%é-ÃN(½iÂðŽa@z,ŠHz³¨ÎÂ{;Jäè±(éÍ¢:
+ïõ£Ç¢ˆ£7‹ê¼;ß–HÑãMØqs®¾uæ‘éÄ8ÐœŽ6· óȲð<Fœ¢í@KÚ¨î¥$¸ÃÉïg®òý@‹Ê¨a&ˆ^*K‚äí ¡W%-@o!7ô"¾äb‚Ï«’
+ž·•à#Ó«†~§ºh¾zìÏ›^4ì
+ÿËwå‹ð7”ÿù
+jÿòÇ÷¥ç•5–-fmù=|rùÙ½ÂG~Ѥ¿TÃ7ïÿV~õÓ×-…µ'œrNe…„}¹xÒöú(â ø«ßÿP¶L˯¿øé»w¼pK[–øOhܵlöW“#L{øÓçPæµFsѼþP›²~{_â¯ÞÿÐþÿ›÷‡è¯¡¬¸½¾¯«‡?’·Gi?]à‡Ë…H¸Èoë]íšqûõ÷ß þÛ_‰ý*].«Ã]/[ûø€_±KÓ΢$}ô©Ëƒà+`±·gW¾ñwIÞõz Ê7@@iÎv/ù¹´­>·µÛ\Ï¢);ÅðñÊÓ~}¬¾Åxü›ÿZüôòendstream
+endobj
+1034 0 obj <<
+/Type /Page
+/Contents 1035 0 R
+/Resources 1033 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+/Annots [ 1043 0 R 1044 0 R ]
+>> endobj
+1043 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [155.437 150.485 162.411 161.333]
+/Subtype /Link
+/A << /S /GoTo /D (figure.110) >>
+>> endobj
+1044 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [183.111 150.485 190.085 161.333]
+/Subtype /Link
+/A << /S /GoTo /D (figure.111) >>
+>> endobj
+1036 0 obj <<
+/D [1034 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1026 0 obj <<
+/D [1034 0 R /XYZ 167.816 177.329 null]
+>> endobj
+1033 0 obj <<
+/Font << /F8 453 0 R /F53 1039 0 R /F11 615 0 R /F54 1042 0 R /F23 440 0 R /F7 627 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1049 0 obj <<
+/Length 1491
+/Filter /FlateDecode
+>>
+stream
+xÚ½X[sâ6~çWx(`ÆV,ÉÆv3íL’í¦³/ISú´Ùa â] LÂ4ïΑåvâ\šáAH::—ï|G’E5Sü¨F™E\“iŽeÏsµIÔ2µ¹˜ºlÑD„[œ8z“†š5.ql¯J†ê8šÁ„ Û¥y‰²¤E<!
+Á/-“páàƒø/¦=O‹ZœS1f'ýEë¯ÖŸ©*S3,g@¸[«™Bü—Hµ ^‰Ðlz·­“Ï×â9Úp†BÃé×^¸ì´·ÞÅ}Ã欱«ñ÷þ·áð…ºÄc
+ß0·û1´ac’.Æ4Ã…·”[¨<x˜¬ Ý-cC{Ëxí2VV`®[ËÉ ®5óR™ö)jŸ¥†Ö+M¼ý‰BûX¡JÎÀÄý½Ú£þÍB)l ]„KŒoû#\«E?äÔÒÆŒg‰…ieëÕ1Õ{ë?*õá µï¢c ~3•Ðr¼ é”°p5Úëhzù\Nµ|-,cZŠÞâXN`™ÞµZ§þ ›|Ò¹­¯´ÏB¾á
+éq©ï¢He?·ñH&VÇüLSŸ'¼pBÚùÞ¸úhD÷;/=5êгš 7:ÓéÔ-'<u­xr+½ ¦i$S†©¥*âm; {ÉNÓ(öÛP{(¨#V²¼ò8¡6+?Á”Òv¡Q^Ï'´xVèGÙ¬­é[í•ÎÈ{W
+endobj
+1048 0 obj <<
+/Type /Page
+/Contents 1049 0 R
+/Resources 1047 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+/Annots [ 1051 0 R ]
+>> endobj
+1051 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [344.852 163.182 351.826 175.137]
+/Subtype /Link
+/A << /S /GoTo /D (figure.109) >>
+>> endobj
+1050 0 obj <<
+/D [1048 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1045 0 obj <<
+/D [1048 0 R /XYZ 232.689 166.669 null]
+>> endobj
+1047 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1054 0 obj <<
+/Length 907
+/Filter /FlateDecode
+>>
+stream
+xÚ¥VKOÛ@¾ûWX[²—}ÙëmÕå%qÒÜ
+ºùÆþ›G5t´G˜AB‰\jÄÖ Üçw5g¢¢¨ݪ²n]zÿô‡ùWk -@Þ¼4k‰ëM´ÍíYºÖM¬Ê·ö½ïÓ?lZ§;[×ôv­WÜÎg¸_lÆQ0Ä[³rd¯}é<1‹ rç7ög˜"MóÓëÛõ8@|™«K©îØGSt6,O‘föMÀ£ù|Buïh@k@ÔQ$*«ÒíúWÚÁ–MS›ù©}r:JPÂëÊu½7MD612ü†ûÅ+9™uä—á•ô©+/‹Ò8sû/C ‹‰`ÚxoÞå?ñ¡0ý˜î}rîPŒDBULía‡ÄÕDÇ¢=8M|æ¦ÃBOñC)#ï̇ß7@´XÊ•‹¤‡#*/«T#Jm1.)“ã
+endobj
+1053 0 obj <<
+/Type /Page
+/Contents 1054 0 R
+/Resources 1052 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+/Annots [ 1056 0 R ]
+>> endobj
+1056 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [358.274 300.085 365.248 312.04]
+/Subtype /Link
+/A << /S /GoTo /D (figure.109) >>
+>> endobj
+1055 0 obj <<
+/D [1053 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1046 0 obj <<
+/D [1053 0 R /XYZ 246.111 303.572 null]
+>> endobj
+1052 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1059 0 obj <<
+/Length 3006
+/Filter /FlateDecode
+>>
+stream
+xÚµkoÛÈñ»~…`Ügíí“ò¡Iz/àPçO½Ü”D[
+(Ñ•èØnÑÿÞyì.—¢¤$íALrÞ;;;»3+5•ðOM•¶¢zš[)ʲ˜.·9½Ô÷åIŒ5"Wøu9XxEV"ÍëÛÉ7ß™lª”(›ÞÞííê×Y.®Õ,»ž+¥Ýì窃¯=|Í6ð²¬׿ÝþôÍwÅ´ef˜o®
+aŠ’¸ÿ|=7*›ãáz®óY¯ËMÕ0§){V«°±Zдß<¤ƒÅÎXO³l*|`%ûöZ³hÙª&`>«ø±l·ˆ[lv€¬ºM»cžöŽŸk
+ÉWüþ1dý°Yâk \ÐØHÿsMF ´}:ÏsaµŸ c³è ÞòéMFƒ}ÙîÝþ½‹bºzÅ$O›n=v™Ò¥0¹òÙÕOgüæ¤0F{²šùÂbƒY¹{Á‘íîWñƒ\‚ s?ÒzÏ* Šz[¤Öš`ËȆRh¦—üröèwûtð:w+vœ. D‘óžsÄE“iРröÈ
+Ö'­±V¨è˜íÈZd&µFiöxÛ€MÛÝáÆGPŒ=ëÖõŽm¨Ðl@ÆØ#0;E‘ =¢MO‹¼³òNJ=Q
+çôåQt Îpnö¾^v>çÖä³ê}Í&n‰í*‹«9Œ`C¼¯œP*xŸ"pnŒµ;”h\2}ü}•-Û܉ÖØbv»öPÒÔÏȯ<Z¡v8 P©Ýx)è܉R‡Ü°­›jä.HœÚ…éxZS
+Cëý°6^mÅ>0R
+U \p‡®¶d Ó V>­ùÉ_nûTk•Èm9—RH˜VÈ´ÿœd.$ý`
+çW3«Æú ÖÒ.¨[ŒOÚpü(B9ñáÚAmØ<Ö4n 磣?bãƗ쬾¢PÞPÁ˜ ¢ßùt@;&W`@õN˯¦9qâ¼
+Õ’( ¾K£À×꺺ôD=}Ðd겜U{¶CSLruˆï«pà¾ÃÀÄ »cÌ2‘Æ
+ZZ_µH·fÂqeÍQŽ¸p<@ûΕ×D]®fôìÇîlØ£ïuüÝrk`³hüÐr(ßZ¦8*zà…+ŒLX†ÖÊ>®ÄU "ïwуå¬;°Ü;#“ÕU()t.‡/' zDÜlv½­­,=ì´ô£_ûÆU¼…Ñ—×CA
++ó°†>\’cUXíÍR»;г©0.}þ¤u[Kµ}hê›:•Òæ^Ú§¿¦Ô«%7&äìÀ$·+¤¯âËx,Í)ç¢ QÜuám$üúÑp¤3Ãz·ÚßS×#]1±GÁim´¼9|,uŸ0@hÃè8cöi¶€…x×…~Oý•ỷŸb£S˜½ ÓË Á߯£aíºùÊç}ZE‡ŽwrÊáç·Ñd¸Ñ<gŽE;í÷-~ „ÁDêR9^aôL„ÁX9o M|b8šèÏTí÷>ˆq¼ÀLÄÆßÅÍÍ0^@iÅŒý=R¼[q#çHpNÈ\vŽ¦î É¡0™óþ/³ÙC•4MÊõ›`Íôƒ6‹Ì|ôH:iì}yàDÐPË^p ×\ùopß¡}$“ýœ¦"y¯v Fw®«îÒ\þ3°÷Pѵ½Ü0“:®ñg žR£û´å CãÍ7GáßF‡ÆNÜ˺®Ý~ëI¢ig Ód=×{ö_Ú0¯NŒGµ£4úî¨DM¶àPâÆ>¼×¼y´»Ä&>&¥§€“Ã7aø–f¨}ç `m2¡T9¬€-[§F¹Q |TÇ9¨_°Y1m„ÂãË6f™e–i(£  µªtùYhðIeðÒ •ž&!ØÆÈ ‘K=BGä¥ZÏ·bðü]{Ÿ¥$B¢Cm.
+ëJƒ*
+Q¥Ñ€\BÉöµÁ(NC£ˆ£ù jZÅàr@åC'AÑ—¼øöØuž7a›Ρ¾\ ›ËâHdÝëSc}UèÌ›°‚Ÿ4¾ΈÆë#‚ˆî{ÎN3¨ÝmªPbƒ™^ìïäR’ÄÒÑ E%¨ˆŽ
+ó±>9 ó&¬s¼üËØŸpn+Õ±:Äç{iúF£cÖ„Š«²À5.§?MæqÊ<³:F8+ª†$k¬ÅZ«‡6i y©E‘9ud)Dôg™êyÖyš>¯ŽðŸ¤íëcmÌšp*¡
+eòsº=V¥NÄôó(ù3s›‰"w¤¬
+k…U퇾|9ÉKS#Žoßòù{¹c"R„Å"¶¡z»þÍW~@Ý~àVI}Ï¿ëÿÏ_±uGDÉ#œâ…Sæã}ýÅbìÇ׋(öùBýÌEÁ oþß 9!óí'ÈüÈ k¸<†®4É@víœ@R»Ò»º¸ÙÅ;šþê& ÉÌ›è
+ᇡ^ò#¶šÍ²ê¸cl“úÛ†VÐ@ˆ†JÛ í ‚Ò‡'å«j2ù_6!_ÓzZîWk¯°ýöÐô=çØ$LªvlRP£Ó’ž}rE~â7*|uî{
+I¿#ôúwª¯ò½ öFӌ۪„3b†g4¨G2uêG~€Æëdþ๼_”£c5L|aòáÿ Ð;Wendstream
+endobj
+1058 0 obj <<
+/Type /Page
+/Contents 1059 0 R
+/Resources 1057 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+>> endobj
+1060 0 obj <<
+/D [1058 0 R /XYZ 124.802 740.998 null]
+>> endobj
+301 0 obj <<
+/D [1058 0 R /XYZ 124.802 716.092 null]
+>> endobj
+1057 0 obj <<
+/Font << /F36 457 0 R /F8 453 0 R /F39 504 0 R /F11 615 0 R /F23 440 0 R /F43 618 0 R /F32 450 0 R /F1 1063 0 R /F54 1042 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1066 0 obj <<
+/Length 2688
+/Filter /FlateDecode
+>>
+stream
+xÚÅkoãÆñ»~…>Êh¸Ý÷£E¿\ïš6È!Hm´@sù@K´O)%9}öõ×wfv—‘TœæŒÞ&9³óž[,9üK!5ó\.æ,¿\ï|y¨¯"-QZ1'ðkY(o˜¶ËønqÉÏËŒ –ñ¥öŽi†òe!¤Š{øþzQÁ„÷Ü;«™•*˜ån
+BÏB[õâãâ®U™3³|Zü°ü‘/7 ú§…àË÷¯*ûzQâbÐOšÖ#ó}ç>Âg¬@§¼¹Yüþ/~) Ò,oîhåÍæ‡Õ®º*Ī¾½«òêÇ›oïnZ>‘MKëÚ`˜ Â[ÔØ2¡¸´h^Öˆ¼v;&ƒ¡c_O8Ї–‰âLÊ=H dF_váÛs¿%âmá@+'¸Ž\1ɃCqABwòÄ„¼ËK´iN0ÚxçÁt£Ïì£6£m+Ïè¥P,Àòž@1JŒHÝ#.¬bš b©=FÀڡĸ £M+ÑMäçq¶
+ŸrD¨c·W"¶Ù0bð§Ãq‹Ïûí¾À'²áD/Ìz— Sò7GöôÝ->£øĹ¥@Ï‚c¡xƒàȱLJˆ°5LA\Þ?BÓY7ÛÓC¹¿*”3«õ¡~ÜíOøaW届/û¬kâûv÷PW±gÝ_I¿jª ÙUaœZýõ€ 'üA+>ÑÛ,RH3 nõpUH·:œN¸z‹=pd6‡ø<Ü6%ìÉ …€ûˆ†+ðÔ¾Ø]‹dIä Ænz_ÔÛ']и#
+ ;W Dª°2ÉŒÀ2Âú©ðAñB´ë¶PÁf´Ù‘º¥Hu%iØ7ñдžF_¢Ú°%0ÂàH‹eÓ+í`禗y%.+7´›ˆÙ6§ørÚþ‡²>QÒVf&´Ÿ ãAá&×[x%÷`¼¼Yý­‰2¶‰iYö¡q‹e‡çÛº—Ž”^E¹Å¤ØÖh×q1Ì¥( bcàG‘VpÎ%ˆjã:»/£3¤¬ëÏW^Çt€dnÊ#š¿Ýc9å&WDË'
+‘.
+À[ºACÏÏÿe÷ß¹îyÂ[¸C¿Ã¹ÂKIÃîG;ëu_õI`¦>›’¾÷ëE¼ÊèÒTÀ-1˜ Þelï.Õë¹f®R‰´£„»?3Îj °Ü¹3Q„%\,:4šŠ&¢¥ÄA›Šü‡4Íá,^Ç ÙŸˆZØëú—¦pHÚRÊ2®νÀÅèmy& ñ2a]oH5’5š…&ÒŽ.fB;ð_a™5á\a g/jbŠt™ vOð&@±õ‡b‚³À}@™ŽA
+9׃Ñü³[ oR)s¦_Ägì¯R1‘v”˜Zt5',â_"l<øŒ¤=a
+š QEC¶êyfŒ|Œ‘| y§Õ8‰!–ùêÚ°Èå¡&ÓPGÄ\Ä13òÇO"¯ð_'FÎÓ殣½QL´k}x<þÿ-Y_˜žO›²›òvhBüúL÷ÐuIšT›T‘
+ôÚ†¾‚c¯Ð5 ¾gŸÉkäŠLô<-ÚD€Š«ZyØtÚ=­Ì«¦Mu!TÓn»;ˆ9ø¨ŠoU* 3ùíæèÉ,¸»`Î쯢þÇß7 [„€G'vßÁCAü 4Í€.ñÀÇÿ
+endobj
+1065 0 obj <<
+/Type /Page
+/Contents 1066 0 R
+/Resources 1064 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1032 0 R
+>> endobj
+1067 0 obj <<
+/D [1065 0 R /XYZ 124.802 740.998 null]
+>> endobj
+305 0 obj <<
+/D [1065 0 R /XYZ 124.802 533.433 null]
+>> endobj
+1064 0 obj <<
+/Font << /F8 453 0 R /F1 1063 0 R /F54 1042 0 R /F7 627 0 R /F11 615 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R /F37 462 0 R /F23 440 0 R /F8 453 0 R /F1 1063 0 R /F54 1042 0 R /F7 627 0 R /F11 615 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1070 0 obj <<
+/Length 3112
+/Filter /FlateDecode
+>>
+stream
+xÚµZYãÆ~ׯû !C¦O1ü°§ #†cxƒ
+ø'§R™8jšçy6]î&bz¬ï&Ò‰h£ãTâÛ3Ò™M2ÀN.ù}ê™y‹iªbÒôD1¤1L¹ƒ÷ï&Qnc©L§©Œ­E_»1‰­¶âv%±L’!!¨m'ëÉmˆQÄvú0ùuú›˜®ÀÙljÓ¿²·_&¿ƒ¥z*b¥4dBÄI*25• -sHQ¦b+´M§9™ÒœGn÷“×&}ŸM•ŠUšN?ÜR’>¬~‰þóß>ü0y÷aòs“·LÄFK;…ùBg8OŠLKšd¦‰{„ä»yûºv™DiꔥŽuž'š†JˆÙÄ¥ºp9Éc”l¥ä­O×tŠ^/Jò8SX©„€tv¼0“xÁ‰:ùw߉Ӌ¼bd`3LE¬Ly× s™©ƒ#k ŽòÔ´=ɾ'§4£ÄÄ*ƒð"(Ì°êˆØŽ›_éЕ ŠUÍH§058Î$NlÞwÅ\b&OMÑ`LNÑëÁRÉ3\•búÃ$2Yl°*aïYŽ>#%ceDÞ"n±„¼¨‚U¦µí…×áš«tªfdd¬“$;ë Ùé%¾þ2ðŪ-_ZÆF˜³ãböÀ—©ÛÇAæY·å Öi*æ&ÅZÓsFlÇLžª&ÕwÅš"Æ+Œ5òÜŠg~oÅj5–Sõša/?ZꤽgyR”ÇJf÷'ic•À^<Jß ùùÚö¡¤…WOH´7Äe^þT‘½^ô3ÄšA1dHæP}RÁüg}ÁíÚTk è¼½³‚nïÌxë#™>È*'ÛI³÷ɵø¦Ÿ%§Úh*)RY¬¥4ݹn ƒ3€Îƒz/SÏbÿ§ 1!—ê"òvw4Áfq¢ñÌjÀá#KÛ
+i_>œYpA¶(iRÜßF}1û_ÛÍ~.geß_ä,4üÌÀcÒJ"JàMRÊ]Clòàî(-(wgæ9¬ÿ21&X˳¿pf"§Ý(ðÉm¦Îycö%Þ–‡j_V‡Î€’Êø¹™x »Â`
+glw,óHÎ^ñWåŸwÿV,jüYÃjEƒ¦1*|Ǫ—º|‰?¿ÁP±ù‚ý#±ä¤"™ã¶X’âY®6ïð¹-wDÞ×1;<n)–‹­0sƒ?5úÀWR/wøDZǧ!Ÿ»‚âZÅäóÛCµ¡mö#ñ­*ä?-ðù=xõ`½37€]àØÃÓ&D[Zù°†a•Ì¶°–Šé#ÁBˆÒÜÝÏ%%%NëÃ\e³‡¿ÖëÂIR¢¶s—Õý?Wù¬v¢‡[,ør“
+;ˆJû™ØfYB}{ F
+§À“Äí‚Û‚gñ
+ç‘6^v
+){À†¸Úñ®ê‰fPŒT[
+!¡±jEïIM n8zŒÔ‹Ýò™È‘©.ˆûõð*Š4[qcŠ“LB¿¨Qè|Ú&EŽÖJñ)P|ÎQ$µ7ØM9~A$Þ•Wå¬%€éLÊ&lOh" ¹!u‚6¤:2ñ.øíH®Q3(bZU‚\”‡9m[Ðd{”ØTÏ8šÐˆ[Bñus®ð[!sŸû‘¤£j£©bh0ÉÍ©k“ùQbw
+†à
+YÞW½‚^w8§ûN»´³0Vn‡Ü×Hž?üN¦%Ì8ÎÉ'ìUùÃW˜9 à2¢1£áý©.ÂGÉD\¤ƒ^O €©¿y€‰þ'´ ÿ( †ûÛJ‚maœ «r°êo6¬q ˜ï!s‹ó¹Æ”òçÀÈ
+ìÿ¬ë»û `¸´ÛÄ]á?½… 5e`¤Ñ¿ð~œQôO€¼|øivÒ "éüaðÿ
+endobj
+1069 0 obj <<
+/Type /Page
+/Contents 1070 0 R
+/Resources 1068 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+>> endobj
+1071 0 obj <<
+/D [1069 0 R /XYZ 124.802 740.998 null]
+>> endobj
+309 0 obj <<
+/D [1069 0 R /XYZ 124.802 425.924 null]
+>> endobj
+1068 0 obj <<
+/Font << /F8 453 0 R /F8 453 0 R /F1 1063 0 R /F54 1042 0 R /F7 627 0 R /F11 615 0 R /F43 618 0 R /F37 462 0 R /F38 464 0 R /F39 504 0 R /F8 453 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1075 0 obj <<
+/Length 1880
+/Filter /FlateDecode
+>>
+stream
+xÚí[ÝoÛ8 Ï_ô).š¾,Ë÷x¸Û€‡ûXÞ¶=¸‰›çØ=Çm·ûë¤ä|:MÚ¹N»Ù¢iŠüQ")Kô9ü‰¾šY.û¡æ,Šl²èñþ ºÞõ„'QZ±PàUCç¨î…³&Bš_ƽ7oUØXdT|E¤ãéÇAÈ ŽÄ@Á?ðÁïC1ˆ+¼SB+ÅÆ—áHY5¸«¯«¹»‘áE| bÐÅrøyüþÍ[»ùš‘°LÙˆ^ö6Ý
+ç¡·ÅïNë{Ü€HrቊëŠpYÀ»ó}ŽBÄv ˆc7X"_f{hqpÓ b-†Æp—™f‘=
+¯.YãõEÕœ
+|àL9]E8fA ¡Ú÷NŠl•þ¸ôíÅ¡×Ü‹ÞÛ#è5íKñ(ô¶/ÇÃÑÛ‰ ûÓ­®›g›€"pí6p©(@]÷CÖ´Y©X$Nå创Ô#¸dü bWQO^ ª¿àQ‘«M¡ç'‡½fß®˜†ô Éýž Ÿ8ç{Y~ÈBÕ¨¿>˜Î=‘˜ °O¯°ÜÈi’-òQžÌ
+˜cêŸ/¨¶¶.)Тã»Ü ëÈ%õe—U%p
+ÑÌ!gúvUí8S[j—ò¦Ûå17’íË÷87j_'q£öÅ|an4OÒÙœB²ûH¶ãD
+ÀjN¢ˆÚ4j]†LGGr€8C'šå‡<fÍ£ea\f ÏxL—‚\L.yÄS‰Ñà¸%)Ò
+æ¥3ç4§Ïk¼×8:—ÓN§swǵ]øå¶r’Ò1¡+Ê6Jç6¾,ŸOýN
+<½ã&ng¤ÈñmÂo°˜Kß,rw«ÞUÂöÒW~'õ
+„;XùT®SkhÏq[¤ÜÎy—‡å¨ÁU>\”8$åçw)±LóÔ=®6rþ• ‡ü·³î8°éÆo_øÕOrà`íÀÚðAévîÜEŒU/lx>Äs’ÖN«X9-¶W©Ü"IÐm‰ã–‹î qØ_uÿ¡h8k‡·«r@Ê¡€õ쥷ˢȒ8?wéí*Îêï ’³×àªòf]÷¥ tóãL:¸_pS¿ï}…~;ÐO¿·BNàÞA]9?†Ýn
+oDZÛIÑëTìv"Ì£°‹æÅñ,™vRo;r'ˆÜ"ƒEóìà4‰Ñ5t/3VÐ÷S熮3*Å$bæ Ù¨¦§¥é6¸Kªr?ìþ .ñ󰳯ÿôQ"-åˆÀjîB\ô‘|UcZ~o;Á[©Ÿ']m ”³CôØtÙ 0N.Ï€Òu‰ãÈtù’¡¹¬¾fÆ(«{8Þ[åèNŒ‹‹gCŠ‚és„fK= »Û¾]Îãiq÷ 6hïO}ºÛù<%÷éNšuò
+endobj
+1074 0 obj <<
+/Type /Page
+/Contents 1075 0 R
+/Resources 1073 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+/Annots [ 1077 0 R 1078 0 R ]
+>> endobj
+1077 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [156.008 684.806 167.964 695.654]
+/Subtype /Link
+/A << /S /GoTo /D (figure.119) >>
+>> endobj
+1078 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [169.191 628.566 176.165 639.414]
+/Subtype /Link
+/A << /S /GoTo /D (table.117) >>
+>> endobj
+1076 0 obj <<
+/D [1074 0 R /XYZ 124.802 740.998 null]
+>> endobj
+313 0 obj <<
+/D [1074 0 R /XYZ 124.802 716.092 null]
+>> endobj
+317 0 obj <<
+/D [1074 0 R /XYZ 124.802 659.906 null]
+>> endobj
+1079 0 obj <<
+/D [1074 0 R /XYZ 283.291 296.611 null]
+>> endobj
+1073 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F32 450 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1082 0 obj <<
+/Length 2731
+/Filter /FlateDecode
+>>
+stream
+xÚYIÛ8¾çWsi(+¦DmÇn »'sI€. LÏ–e[Y2$9©ú÷ó6R”eg* Åå‘oá÷©Õ~j¥"æÛh•émXùª<¿Û®Ž0ôû;%Sb‡™Â·;ƒ;
+0O œóËó»÷¿ÅéJ©°H’Õóæ>ïÿdáZÙz£T”Ÿ ýÇ󺈃¾.×q|Þ¯ÿûü¯÷¿éÈ[›¡Î !p®Æu¦ÛýÅSgÛ$05ÎdêÈ›¦ÿ
+6 úWY¯Š°Hcœ¿Q:‹(…FÆ°‰Û"ò¶ðè 6P²Á0š~¬öëMœÃ‰yâCܼ\GYðe¤9V<\Ÿ/MuÆóTí:ʃ±†‰í‘»Ýz“$Á_U98%„WÎÏ<º3ˆ‰¨–©Ö6Fžó iòQ`Ö 1"«œ|CÂJéü4NçJƒ‰€˜®åxŧ t|&iùiÏh7.Gî?™=7HÇka*@<ÚWFݘÌj*`0ݪàù4ñãhôÔQ ¼šc=N‡FaÚ•g‘'½ì×(<ä{+'Äñó©jŸÖ½-‚@¢ÐrlhŒ?ïÑä‘‹!‘¤„Í.–MFÍ÷ŠK’à€²èeƒ¾ªüµ;o•¹¯8Úò•×Ðè j‘LæBBî0FZ‚$›ÄqL Âc0h„ßx˜¹…†A ík”sݵ¦á^à:N¨Ek|…kâ,¢åf*ƒ²cÖ
+oQ¼%yÀ]Z{v!I‡ƒ±¹î™¹¨ ýÃè¯E[Ž 0&§q€óíÎ /Å„Q–B3¸h˦n«¤Ä
+'’9OK"iºp$v¦_PˆÒP%3
+Æ
+Ed¯:Í ‘ÐAÛù‹Hï²¢ÃóŒú—É;zááZ,ŒÅK¾ €ƒ'àhﻦ£óTüj»«ãÎ
+ðìgiý¹U ö¿Ô;49g’0˜±ÁR2FÙ„ÍŽ›yá>#c,®(Ê!š×oºWØæƒBqËAd¸-Â,Ÿß§–˜Kï›°;Þ²k?tPø ž@iÆÒ‚-þOF—ÊIã0Mõhâ.™NwÐ;Ïï
+âAˆMûêÐõ<ždsÖø‚³–$y<:ó,=‡ ¾ìú×OQ¡~˜A¬ãÓÚ]2…šÒ6Êp˜oCLíÉj¿1é·¡à&ÛdfMg5Œ"¦-6´ö…Ì|û0þ Y"È$þIøN^ºú:KžøºF­Fü¾’×î3ߣà ©>ž6G´á•¾Xa¦8»%Ð^i ê!¥ Ëì\¸rB!·Š Çb¥n
+S즢˜ü­¯ÇÑË‘ÐÚ5 ?wú¶‚ßNKì•TÚSŒ  FYX
+k:æÚÈî_×à šø•‚m$ßË\utâñœQ°/ÿrvo1²£ãb”«à3ª‡Šú+ŽÔìø)9u×R¨Ü1`YxBÄÅWÕz¡M2jØŒc—Úò
+×{o7’¦†/Ú™swߺm%Ìå/Zò—x}4â¥×štœcðX[ŠÅ3[Ó<[ûþ¿eº^Õm+)ÍM¢x€¢d ·Cì½Ù×¹’2ÓœÛÀƒâæÄ.ñ“úpo¸7«‘>õSª}µvëjÄ@ÄY¿+3Æ69ßÎiÁ ["ÖZ 
+ÉÒ+÷L~Ó‰“|¥ñ< t×ò¹‰Ë±–û(ßöþ'Ÿøö*’@—Æ
+Æ–eù[Œ5…ÎæYB–3â~}€nÆ»_ŸÝkGª’0-Ô½ïÙ*MÃ<Óü±›>d{{ÛÏØE|KTe°Œª–Íÿ6N´zendstream
+endobj
+1081 0 obj <<
+/Type /Page
+/Contents 1082 0 R
+/Resources 1080 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+>> endobj
+1083 0 obj <<
+/D [1081 0 R /XYZ 124.802 740.998 null]
+>> endobj
+321 0 obj <<
+/D [1081 0 R /XYZ 124.802 716.092 null]
+>> endobj
+1080 0 obj <<
+/Font << /F36 457 0 R /F42 600 0 R /F38 464 0 R /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1086 0 obj <<
+/Length 1488
+/Filter /FlateDecode
+>>
+stream
+xÚµXYoÛF~ׯ „<H€¸Ý›Ü} Úji '
+J¢dÔYŽåß™Ù%EQk»6 cÅùv¾9yˆˆÃŸˆ„Ô,å2J4gÎ¥ÑdÙãÑDôDPQZ±DàU‹0.¥±PŽ )Û”,M4èpQ—7õ4s©Œ‚Ò÷¨Ü¶‚ñÈFÊM^[άä 0M™v‰±Ñ²·:0$q)DÀë«ÞOo€²cΪèjFŠWÓσ÷ïWo{¿_UØ
+i3©ÆŠi®Ü‘/ó"ý¸äÄ[A!"&‘˜m˜âF5ŠŪ>Î%= dJ[yÆ’—>ÈÒiŠø€åÌDw½ÏÑWMAí-üë ]€ÃŽ%J
+ˆ…†×Zè@&4m‚I–iTôþ†M͸4ZF)°HÛc!™pJèw­ã l^÷^÷Ì!+-ÑPðGT8P Á¤&’eO§˜}“8ELÓ¥vPåÏC©FDr&R䥶v.PSÃ
+Å­lDÕ>­p……ŽÆ£ ­ár:Ê;ÊzIy߱ɯ¸®·‹9®‹U¥
+ï†0éÒ¹ÅÂódKÏ“ZgD53’ÄH6B±
+…FœÉy¼j À%1þögFk^°¥ïá–èßwG¿Èƽ>Ï`Ô/Èûñt±-¥EAÉÛµÓ4Šƒjš®oÉ‹"/h(­¨¬|²o«$õGd^ñ¬«§ŸÉíúŽº¡SÚÉîê…“oèØû¢r{šQñ]çÓ¸9•Mq@ŸÉÙ¸Œ¸ÆÍ<6qû''nÜ™¸[úµ;×[çs&G²™³Q“«Ð¨6éŒðódÿ'þ×ÿÓuèÝ6ÿ§Ïäÿ÷'û?ínÜÙýWGþŸÍþLþÏŸìþRùWñöLþÏžìÿ¬Óÿí® m÷®rT¦ˆ·¾êÆXt–ðLŒŸm¤N˜2õ„ôŒœž>}¿YÌo‡0ž®Rj øÏÃXk3¸ú§Ð½ßÏ÷ÙrS é©L)=¸[ £()0x2èÝxݬfC  ~¯¶Áóæ-­ß\ÏüúùÄxA†×ßÚ§Êí<|Èüë¼/Â6Ïñ*ü!øJm~¹dVËsŸl¹†3RüÞ¦hSÁTjMï2mŸs­¥Ï¹¼z…iaåôÉk_0•“úuTendstream
+endobj
+1085 0 obj <<
+/Type /Page
+/Contents 1086 0 R
+/Resources 1084 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+/Annots [ 1088 0 R ]
+>> endobj
+1088 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [412.169 236.036 424.124 244.449]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1087 0 obj <<
+/D [1085 0 R /XYZ 124.802 740.998 null]
+>> endobj
+854 0 obj <<
+/D [1085 0 R /XYZ 212.141 237.032 null]
+>> endobj
+1084 0 obj <<
+/Font << /F11 615 0 R /F23 440 0 R /F53 1039 0 R /F43 618 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1091 0 obj <<
+/Length 2521
+/Filter /FlateDecode
+>>
+stream
+xÚ½YKoG¾óW |²
+HJ+3±þ~U=Ý3äP´-{:ÌLu×ë«GWSÔ(üQCÚvQé&XÕ¥›åv¦š,ý2£~‹±¦ Ä_'Û²Ú’VŠáÔ¦»,¶¸ÇÛl—¢núMÿi
+9ÄN5!u¢¿Õ ­sÍÇÙÛæjVXþcFªùm:¥,Ù&Pg¬'Ól’é4•ßi¯Bj‚ëE6À„dšà;c¬òÍrf:ON¹&„Î;Ÿ`^µJŽ­²Jéдp{ô¹œµÔ%lñ£- ‘ƒ¼*¥…ÊcU-^½Šƒ9mèèÐâRÜ[¡ùÔÙàêzAÚ"á¥jóXqÀ\Å$ÏkÎptz³½ít¢”zÏêçrV|¯¤‚NR«1% ÕÜI¨–³÷³×baôÌ—¬ÖÀÝ(ë†5ÃIpùföÃϱI]ò¦ys-ÛÞ¬Þ>qñîͯ³Wo†dÆvàl½é¢¶Q2ØùfD"ŽŒÃvÛ¹à;”O
+…KÊwÔ¾Q/õß°{$ ÏÏmÆFGš®´ ðü4?ûR쿤ÇDl0Ã@ æU Œ‡:€3ÁŠP­
+êÕÔãÀÔÆbÑ—Ý#YÁ«_¯¦EJ±g›Þˆ¸=]#UGÄ Fóa€š#¼r•¸9pÉ‘±hæè$¨8Û·ÍÀÍ‚ëMõ%䎂j‹Ž¡)$ÔšŠQJ–‚J Ѧ‘"Ô™EvÕÔTè› X[¾0 …ëP9²Æ0á
+œS¡]ùÎÃ
+6¥ñ&ë¡$  Ð(ðÈ%ÙWìâYäÐöJ©æ‰%ÓLG¤ä0(¢Ö„(ÒH%‚¨mªSK6 qÃY`šÁ~L[ÆÐàdý–¹%Qi¬"§":ÒVq¯FÕhÃ'á«-&:Îpzl8n1‘¥¼x.~š6æ©ù56îàøa˜BHNi†Eó Žv‰Ü>½¯ìB u»7ðçr69ê„š+iÁOÎ`ÌäÙ9ìËæ $zM;Î$™FZEƒ”+;êzUºã‘B:€1ê‘œÄ&ð§|¤ eM„Ûáö¡qëˆ!âF)Œ}Œ£fÐx€”hbäs$Å“,(†9y~Áp™@š3çõpÇ‘Û LÀ K2áx‹È’ úOÆ­öK-–IQÁ~P”CÚI'Š¤§½FƒŠ…HO4J8\äÁÓòƒ§Dœ‡Iærä©=%)dÐú™Å)¤¨
+8PYªÆ Æ“-ží<J þjÉíKÎmî®rs°’àŽ»Ÿ5'E8]”±‘ídLƒ5¯½ÉÞ«¾üº¸o8Ž¯ùf`|t±OCyšÁ ·0xŠl€GÊˬ2ÆlAçrÖ˜Owž\ž/`Ðð `Ø”{MNqÏ
+wV4W©^ÖaÇÄZÊ“&©È—%Œ2§Dq¯LÁ ¡ä{Ò8¼€-Û“’E€€Ò,{d™Õ‘Ëî°åEY¢ÚP‘§­q ZLŽ°žµ­¼­Ám*ÿ Á9¨VÏ*»šô»Ì;°¶üsƒœxq–Ïöe²ËêYeËce=ïÀŠ2DãSv`
+ˆºòj¿fϪZM@ì™^Âñkqýk(u|w;Ô%«y鼦õDSfmÞVîihûšpn£„!”eêÏ*»>VÖ³¶ok#_ï1[tKÓQrȲˋ鬲›I¸2+!9¼—xýkѤåÚ³Ò¦aHÃ¥)Æ‚wë‹–ž|yûÀÏåfÝñsñ»rêjϯëO-Jþù ~à³'býâ£_Nψ»šŠ»üŒ8{FÜr*îå7X·šŠûé¬[OŽú"ëþqW Ùv»ÝË÷§Ìû;Æýü½]lø±9ù¸³¿eq·ŸºÌ¾gûøÕÌ ?Ø&í®øk¾˜ï$d󫹈ž/å¹ËŸ«yÞÆLÙ‚gïùûÃú¾ˆÕËm^ÅÚ<ûÿì¯bŒìÑK±ƒ÷<;êV–7·Ùün›Íƹ µXbF&ˆ‹íºì\ˆpþ:Ë?Å?þ±çzÓm%ã!íKØ=Æ=±(„?›…`tŸ{¿“Ï­D~Qày6 6‹«{~Þ}àUA#ë°©JÝ«Û‡‚ãþî¾âø 8Ñœ®¾NWOÁéjŠÓJòþ¡®Þퟀùb
+endobj
+1090 0 obj <<
+/Type /Page
+/Contents 1091 0 R
+/Resources 1089 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+/Annots [ 1094 0 R ]
+>> endobj
+1094 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [450.912 217 462.868 225.413]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1092 0 obj <<
+/D [1090 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1093 0 obj <<
+/D [1090 0 R /XYZ 172.727 217.996 null]
+>> endobj
+1089 0 obj <<
+/Font << /F8 453 0 R /F49 1003 0 R /F43 618 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1097 0 obj <<
+/Length 1669
+/Filter /FlateDecode
+>>
+stream
+xÚ½XÛn7}߯X) #Z–Ã;[ä!nÚ‚ ­;†!K²­À²Iõ%Mÿ½3äR\iW²v5·39g %Ç?(A(æ¸(­âÌ{W§/ÏPõ{µ‰T’Y _Ê*i+ ÈtÙ
+hU ¥ß@ ”ž{õÍ-DZlu:‘IFÀ+¡ftÀ.Ô YygÔ&ìD)À˜†eD>Äèò¯†*À´ó€2#°u—"ÂOw ^‡RQá©FŠnûl&™Êù<_Tñžú£±)R1nÐÅã¶x•·T–´]ͽïVлýe2£çðbÌèy÷žk~² ×ñÝn¥%`SãCôƵ àgêº(ñ8bM6‡»o‡{×%;§³ɦãyÑëéà‚ó1YíÐë
+²Þ‚|ÐF>x"ròCtùüés|™Ì£<€ç!—ÙÍx´±Bo6¹ yN‹„)ú"æ=]žÐ[ÿ®ž|Ï#Î5™ûát™g?æ³só¿^F6ôºÓQÅé4“˜%›Æ,@_„¸¢ŸRƒ‚~^^Æ5ÒËä!¯“3ìt´Êc ÄS¡ZU½š PÉc¾¸}@mÀG¡IæçA3ŠÖ·ú±8]…ç¼»Qëuÿ¾ çÕlrFÏÉeGÞ£ÐNƒÛ·¡>zí½<~ÍËXK&8^?^ãà[áYáô»Òã}.›§ÿ·ÉÙ?»Ø…¸)eÄO»•Rº÷ò¥W‹óñ,*°bØ©ñ=tfuºHÚëÁY zÂEÉÕi|®§x#ŠÕšÕDìÏÍy‚YD&b•/nr>
+»ºæJ‰ |SX `ñoÏ. Ü$àÀ¬éÔG\Ôð‡¹h´É\T.Ê[\4Ú-° ˆÁœ
+š«k° kåòÚï¨ÉËÎ@žUv¥9ê¤Û
+‡z“”ˬ‘ œÁª™ö]k7‚kö¬
+jѲm¨ç­]›Xy†Ö×ô[Ø} -ú6ÐràÞþ瘖*K"Ot ™{°ÃýHÈZ%àJ%íÖ¬>uÔ€|³+¾qn¹ ›èp±Þü¨NÊmÝÿª«ûÉ7»Ölû0R\AŸ{[ÎùÀHQ†b)ɶB²ê­Ãıœx’$QÞ,¬ˆ’CdÙx¡8Â6-—²š¸*ÓŒ­¨ç‰ub<m-ˆ˜
+¦.2rÈ—T¼£Öy(~¦UÖ<ÄCë¹ö¢¦GÇoâï0u wgu 0t›‡Dã’>èd¶øÕñ^ÅwÁ3ŒÏE$€ï¾0³W `¤HÃÄE
+˜Dm
+H/ýt ðÞ·~슟½Ç˜ „sño°z~O²À@nhŽ“Ù§ÿž%n<N_ˆc7;ž'ZôÄÒ¼ú¥YÉv…ú¹qè¡›MÌ™R§ Îâ‰o”8íÐ÷ª—v »|{ò!噉&D^K¿ QΓ̯nçi£Ùàö Øóà‘RÃW‚~ÕJEâñßg¥be¥âI+ífÜ,¤ò9;=ÏÖ8»ZáìÇoéyCQ7i7ÀŒ S¯\€¯aíò‰¬§À´?+|)iëQTyß³ÃÒŽcÈÒ¿@;8»1³ómÃÜ·¾B
+endobj
+1096 0 obj <<
+/Type /Page
+/Contents 1097 0 R
+/Resources 1095 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1072 0 R
+/Annots [ 1100 0 R 1102 0 R ]
+>> endobj
+1100 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [386.418 473.784 398.374 482.197]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1102 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [391.4 168.719 398.374 177.132]
+/Subtype /Link
+/A << /S /GoTo /D (cite.goossens1997) >>
+>> endobj
+1098 0 obj <<
+/D [1096 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1099 0 obj <<
+/D [1096 0 R /XYZ 237.892 474.78 null]
+>> endobj
+1101 0 obj <<
+/D [1096 0 R /XYZ 237.892 169.716 null]
+>> endobj
+1095 0 obj <<
+/Font << /F49 1003 0 R /F43 618 0 R /F8 453 0 R /F1 1063 0 R /F53 1039 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1105 0 obj <<
+/Length 3344
+/Filter /FlateDecode
+>>
+stream
+xÚíioTGòûüŠ'+lÅÓéûâCŠ¡ÝøAh°Ç;ã!㛬ö¿oUõùŽ1•V@DÞ›ª®»ºººû!:ÿ‰NHÍ<—Óœ…à»ÓõŒw€úq&Ò¥sM ç;7‚)¦Æ®˜rº› )ZüpœfÁË. ú½Ë``Ì;ÿpòÊ™îvö¬{λ3@¿š Þý2› ͤԶSŽqT·n@žÃ¥í¬ ºëÖÊ
+e†Î Lsç
+i¢œWR˜áÞš&¥*â!¸À§óB:Œ™µ-wL{L"9yJY&‚T@mAwÍ´²0E
+(Þ­ ö¦+l0JA†Fh+‚§Œ/*¶«cOjËpjD1®@À¸ì‚:*»©rJ¾lć¥jL’Þ£¸ÅÌAEA¯É¼‰¸H›Çô™'Ò&oæ’y ¡ icÀlÛµ@˜Öq㻹S¼Ââ"0¾Fus&à¬ñÌHãc1Ã!Am’8(<&+}X'há܇Z¬ãÀµÞën%¤²=¡à:gw­nàW(üÚ¶&TX±©+rH{,e•£P­n%Û JmÑBÍ5dAk$Hzgúªz¦Œ,þ+ü²“©%E¹ÄbÂ8®©&£ œCaài0Òô«á}Š’_bœ_¿ó+‘VJkˆÇw?ÅòmpFÂê C¹UXÛWT:aå6Ã&9ƒªkí xÞ&¤-ZBè- <šw£êI¤•©ºdZáåH˜Ëúz(+‘¶Â0¿a¹Û+Œòÿƒ,{7’ii%ô9Aa´!© G(33|.`i†¥ÜÇ…›3T ñ:aïWí‘j‘¶’ÆÖ(Í>Ý«?îƒRà=­VRš8æ­Ã53‡Ó¬±Ì(#e\¾dp4g‰m
+¡5§…,2ô)²J <‡% èÈ ,­BIw@Y«{6P\È¢/ê¸â±Â¬8¶YkB—•ŸˆfZÏ ã8–*V©~f!:£î[Ѿ¯hHY ŸÔtÏ%äöÛ?å¾:´½vlxaò§&èéq}6°œï^Fy@—³Ç¥Ûot.vÐ:¬gÃ:HT¡·YÀÌĉ¡çj!NbÏV™<r¯:ƒæZ“õl8¼k+ DK
+šx.uR
+:Ró:-¦àaJë_gÔ×*¡â†Ë©€}l’`Ûª)*8Þ¸{…m‹"ƒ¶ÑL2Ä]¤Ð&ö Îq+pÇ;%Auº
+x™FzìýŠsG3 ̃ì-è¯qo`!V½ÒMØ„+3 Ú×Ñû tØÞìVGb¼¼D&óÊ…òŸ6̧z" g#æ^‰×Ë»Ýh^'êy!ÌBµ5ÔŸh‡ÀVaÎß+mw¹¼I‹ä•zn û-4Rd1¬žn°s#´‰Èp¯¸Õâ<¹;š‹ÃI—fNÀŠkê™þѨÅaž(Ì/Ü\€›³$­:¨Õ®t³D»'o¶ø|»üŽ~Ÿ/Þ¬þô5épµ¹ÆÇoÜðƒÕ¾^/oónµ<ÀçñÁÙŸ7—Äàìh)~xKcw—gzÞ
+ÆSîÑ¥Ÿ0 ›ú¹¶ï¿ó‹cW~¸¹\ùi{ÏŸ¶Ì:æ„= lÛàmÝBq·O›E„9•ÏŽˆÎµƒ­¤1t[jC§ÀxßÀ @­éÔ`Áä°(eÛ,#Ã:0œ º72À&ÚûC•RÞõ$ÞEqT«!îc†–TX±9RW¨³u¨ñ€ÃßJÕÚ»¤vTO`D@Šj ÀF6XôXòN3²x±á˜½Ý“\ÂRU´cK&âœÎÝ¿dÀgçtÖ$œ’ªŸZý†O^…Ðú`ÎÞO¨cÐZÑF `P8]nÜŽe!M
+
+æ‘iÀÕM¼“ØáE^|?ËìÏásÜü6éãµ<‹ªœ]ÁOrý¿š{¤‹—sùîåëõÞÛÿuÅGÞ;d‡üµ ½ÿ² –kÍý Æ2¥'ï?¬¥û~ßÇ–ÁRÉ™r}•þ êendstream
+endobj
+1104 0 obj <<
+/Type /Page
+/Contents 1105 0 R
+/Resources 1103 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1108 0 R 1110 0 R ]
+>> endobj
+1108 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [391.4 322.728 398.374 331.141]
+/Subtype /Link
+/A << /S /GoTo /D (cite.goossens1997) >>
+>> endobj
+1110 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [429.866 148.273 441.822 156.686]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1106 0 obj <<
+/D [1104 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1107 0 obj <<
+/D [1104 0 R /XYZ 237.892 323.724 null]
+>> endobj
+1109 0 obj <<
+/D [1104 0 R /XYZ 194.444 149.269 null]
+>> endobj
+1103 0 obj <<
+/Font << /F8 453 0 R /F1 1063 0 R /F53 1039 0 R /F7 627 0 R /F32 450 0 R /F43 618 0 R /F49 1003 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1114 0 obj <<
+/Length 2594
+/Filter /FlateDecode
+>>
+stream
+xÚíZ[oÜ6~Ÿ_!}‘Êû¥E^šÝ,PlìÖ’À˜xÆ—¬/Ùñ¸vtûžs(Š”ȱ'NQ´áiyîù}¢yÃà7\¨Î1ÑXÅ:ï]sx>cÍ1 ýcÆû)RÉÎrüUlãh«D'™¯Íá
+|XÕ´fd:MuÞ‰&Ìùo¥Bt¬Ñ¬#ïQÈ[nnf¯›·¬YÂèûgÍO³–ÛŽ1ëÀ%—”N»æ|$´ã¢A™àÎHx¯4‰´—e¼óB©æt½qVP+/%ܹNY+=É‚—–ûÁG”¡¶ï´t2Ÿ( %e¼Í ‚L ÁäÈ3­·Ìç!
+^f’Édò<’:ãYp-ªNZkGžUgµ°¦wcÔÖ‰&KEWrÖYΩ:ifªb2˜Ê¹N}‰!ŽzÚgRéóáìdöóãð•?G³œ1¸0ÙNj%9>
+`ÇÅï+ ²&…ä-÷ÑzjxÈ^e²¼Í …ÜùÈ_È=oµ†n§ù¡Ö
+ÕIfb “³¡Ð)¢ØŽµŸ¦–:›ò²¬HÑRVÌÁ_VóUÞ¬yÙ¾ð2?¶õ/ØVx[÷sÀý€[¤2Š6xn¥ÐÞ$“
+¿©Ð ]ªÐª’|UIZ…ÍUH_–²Â4«T¥Âi
+âSåG"Uá[UbV¸
+Í«òÁ’7VØe•†ž<6úkitÚáY,…mÎógwüÈ·‘‘>}:PF„®%]¿ÎàÀ‰§¾¯Ên›R·•>/†¯‹ÿJŸ99€†K—Sò
+GØŸ}û‚ðÔsÿˆfî/_ϯV›½–ÏŸ_¯ñòËêo+¼-®Ïðºyù†O//ðò†iödA3×—7Wx}2Nrüµ\/né÷{o÷Ä­Àw¸F£·ëgû8|€
+twÕé×󫧤#]Ç‘Á¡¢&ÅýƒèÿU†_Ï)Š§ýuÌÉ»+JæJô9Þžã„'O)Ä“Ó%^Wg4iñË*Z`›õ5Ðäèíi™Íþs¸ÚÍi /T¥-S|ùî} à::íŸ]RµOO©\-3ŠGÆ+•†NàðÍÁK¼¼{OfG1Ìþ¾Ÿ}5ï<ìÆ^i¡òÏÞôØ8€ãÞÈü±yqºÇçÇ×kÈUJ9çæ;4ùí x͇¹€¶µ×½6ˆfdÆp€(L8½BSj¾Ã'«p¿„ûð< <’›àí ã
+gg«e,1jßâ ͨ´!õu~@+ǽm)ƒðò(\_Ok"4¬­¬?IÂõqÿ¥ÿßÛ+ÃÍÔP˜Âv)ë[jüDßÀ;/¶h0àpŒ@žò¼6…Ña ªêa‡á°CïpØ¡'‡Ju¬®8ìóZk•ˆ…ì„°ÀÎÎg)t—q4­Qè ‡m%+Ëÿ¦%éu“j‹'BÀ3µÂöaŒ4o8®ãègz ºIµU¶]-Ð\)ÜÔŽÇQ9x3¢ôöªðt“*
+·Dd&Ãma¡-½´E$ml[dD { ñh
+ìB8/"€ÞjÊ`1.ؤ—Ø0O8X“qîX&Ð"!ìp°¶iZÛuPÂë)ŒÖŒ†Ÿ`´ÝF\þ`ôæ;}v°„ W7ŸŸ® ž!veïÈ÷êv¯ÕRÌ¿yõM¸YPtÛ»$¼Ë2·<Ç£háb@äx¹¼=ˆþÞ%«o¸T!¹³€§?åÒÿôê×_ñJþa ®nsÿäˆÊ±8_-£èhAµ»Zàs€áÐj©òŠ \NÒ¿­§*~´^V_-É5Åršºè]]ü-\gäžKÅtžÿKòH(³•<|_¿ eÑ„ÍVš
+Ö„ôŠ ü8Êeç5È =€{O&¥ö>"zZ:¡^Ð\Ø&ˆÞoEôú‚èõïèUBô5ïBô߯(¹õõ&ù”Õùâê„ =|‚•
+ Àþm¸?º}8îß|‡tÈËNFnGÇ„¾“Õ;ðxå0àa‘|üÒH"د0½;3øŒc…ûøÂø⿈2Ñ3‚ãk
+§J° ™½À‡žɹTN$JN„ÿ %ðÿ aÙWê· Fâ ˆQk$cî9ÛÀ9«’cˆü°a‘¯øõnê”·uÒŽÃþ?ü f‰endstream
+endobj
+1113 0 obj <<
+/Type /Page
+/Contents 1114 0 R
+/Resources 1112 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1117 0 R 1122 0 R 1124 0 R ]
+>> endobj
+1117 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [413.11 545.675 425.065 554.087]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1122 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [407.935 348.926 419.89 357.339]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1124 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [174.449 139.222 186.404 147.635]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1115 0 obj <<
+/D [1113 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1116 0 obj <<
+/D [1113 0 R /XYZ 211.2 546.671 null]
+>> endobj
+1121 0 obj <<
+/D [1113 0 R /XYZ 216.375 349.922 null]
+>> endobj
+1123 0 obj <<
+/D [1113 0 R /XYZ 172.224 152.174 null]
+>> endobj
+1112 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R /F49 1003 0 R /F62 1120 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1127 0 obj <<
+/Length 2162
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝoG×_±PT¼ÓùÞ™}hÝ&¸‡àj½¥A ÛkY‰l¹Z9Fû×Éù\­úr—§X àYq8ä‡\I4þ‹FHÍ—M§9óÞ5×÷3Þ¬`êÍLD¥ë~:2Ù¦ÙV8Á:î1 i˜ë4ðpUÏòiæl"ÓŸM  œ3B¨¼ˆc¦yž½kÞóæ¦?Îoþ=k¥cJ[Ý5­ÕÌzé›û¢°R›iÆtRM1kTçˆæ•”Žh²sl®aµgŠw
+,±’y®¬mæ„å‚h¤¦U<+‰$X D×Á‡šO0åŒñµ8 u–[3V¬$Êt¢†´‰)#ZÖ\ˆ†I©”mj†uJ‚'kÕ– N›9«AZ¦¦©m±S›mÖ\ù&ñU.Ìâ*gWŠ«mÉ«í˦L÷ùzv7»<ÀË€[H+Èof­
+º*7Æ
+bœCca«TêçK>Žåƒ®³6V†²Nâ
+åWÿc6náC='| O à‡vÒÊDK¹¯–d¥´äÑ
+\J·•vbgÎÛ•7WqYU\[©,[¡é©zjgÝ«öû%ì÷åiŸ_ȹ&ºÓ¨Å3i%ïðºÆ‹¬C‘^2ÝáýE]WÌù±M•£v½"†7v®¶j„cã:j˜cÛªKc»Ö®j¿cÓ*G}zìYmÍZÖJVhXÕXeèW»™>D¯'6ÒÂB¤¦¶•ZßJeé‘ °ØJWàõÔÈÒ™WÎÈ|ÅcIXök¥±¸?#søuº?mõW¾Õ—§-þúO³PÌki½[s3ûýL2©ÂwJž€Ú„hÐœº~bu
+_÷…0ÊG^îÌè>*îñ/½S°ñõŒ‰¯d|‘àò˜^ÍÈÌ™V¢$YÞÁ ¡=äm§âÚCmƒôŠ¥ÉBÛJTäO²Ú‘Ð<ÙG2[™_£eÂ~DæDq…*ଓïɯ_Ò¯—'~á8m)…àКi IŒ¾µ¡\ƒ_ÈŽ9g a® Vo#«Ã*3pŠÄ µiH*ég$ñW$ÿ)¿iÒ|*<Óž¦^̾{­U ²k·Äº¸y7úýY+æO;>÷¿ô8Þ.Ÿ68îß>Òôzû€ÃÜðWKâÜmŸ_M?Ýì–Ï™úÃÙûÅoèY
+7Ëë30àR`ÿ×)Š> çà ÎçKÔ{_/ŸB&;"l!¢ÛÈÛa<§:ú…eí¸ gußÓ¤Ÿ£iNSønÃ#J
+Ä%*€ÜlÉýqjجWw$jóWà"{þàBQ"Ûõ(hæöÛ8ÞõI3L>ãŸ8³…©]¥®/páÂÂÕ66“å’GRÞ,¦ï!|
+:‰µè>8óÇ–#ÆÚ~‡g¾§?éüß (çï~¤Ð—`ðä
+endobj
+1126 0 obj <<
+/Type /Page
+/Contents 1127 0 R
+/Resources 1125 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1130 0 R ]
+>> endobj
+1130 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [399.48 323.952 411.435 332.365]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1128 0 obj <<
+/D [1126 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1129 0 obj <<
+/D [1126 0 R /XYZ 174.677 324.949 null]
+>> endobj
+1125 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1133 0 obj <<
+/Length 2919
+/Filter /FlateDecode
+>>
+stream
+xÚíÛnÇõ_±R€B²Ó¹_øÁvš
+ÈZçc™:H€f„×@ä€Èݬ€Ó2eW Â
+tŽ)­nŒg*h¡Ð"æ¤q‚œ‰®² JR™J€‚’Á”ÉœW¦6.(&ÁUPòY3P2'‘.KÌpak¥ˆxÄ™ŒÓŠ‚+×
+HE–ÂV Ëá­”æ,$ÓJ¦²ýÓŒ®f—³Ÿ(L–s®‘[Yg¤z[Š“Ð""©bž.fþÞ7à”UÍâ Ñ-Ö/ç_Ÿÿ²øqö—Ef8ÛÂZŒpRÂ¥•• ,})+åim¨Üöhœ£ªòÒå©„Rä´ÅE•b!uU²œ¸",'¸Všë Û–‹¥Ø_@ÉϺ¨)w"TEå`}|(JĹ vTUbe¤ÒUU9ŬÓÊO3¤®ªŠ,…­–Â[+MI(¶•Le¦=.+`JN–"å'UUæÐ4ÁVxh¿°µŒ+{V:&,´
+95SNºšÌ0m´µ,èIFh?Ö aÕÞÛÚ6Çt°Ð»’ý¼ŒŒ¶
+6cȤÔ ‡’q •Ž$pŒ€qw,ØÔ3
+-„¯•µ. d
+aCÔUµXXÇ^ÉQ¹¦„s%Í°…Õ¢T¬µ`qÅTõ«ÍáY!ÓÀëXSQ ¬3g”•&®*®
+/€ÚÂ_ä ù)ÊJ³I%ÑÑèR ɱª\’÷…hˆO‘’ƒXéÊ¡ ª›"™|ªuRCÁ{–u§+&"?¥bÚµª™t8IµË«þ"˜€þh ¿x®¨­HÈŽƒwýPå_ì. )g‘šž¨©Œ‘í1w;UÐÛÐÙ]ÔJÙ…g Iz[©©ù ùmqf‚8¡ebÊÄÚÚ—úDñ%Kÿ»Yú íÒ'
+…¾áËÙj ¸ÆŸåþ‚^·ˆj>ÊëëDF¨®­ôÒ×mÉL²ZÌ¿%*lűC;$¹¹º=àï=ö×^¿ÆǾ{Ù¿úú«øЈÜøt«]¨g·{üy×}Gqz³¼½"¥/n½ÙmsÀ–D¹ßÝrLNŠöË» ÍêŠWƒ¶¯ßâO·ê¿£_P‡¿W Ž´nv9 g ÒÖugÉU‚^’U뎬ì–ïèçpVg¶ß“ÐnbŠùDÇ·»ËQÞ<iS‘þa¿?]ÙÓRf~Û ÿLKâjsA„gãeCvmûnÿ»äûù`Šù ¥÷úÐÝŒÊ_LiŸ3ï>Ú€ÏÐ?‚J|Y]îBx÷¡º«×?zŒ‹W)N‹U~ÌPç¿dÅN
+‡ráD<¤_¼J5·XåÝD°£È'£Æmþ›ñkö§¼$#vë.Ùõ)²“ßL„Q¼à5›<
+÷H4¹¢“ñ?DÇ€µS‡\Q+M¾±Õc2d¿öÉ©†= n½/¨Nß’€‘¶úN
+îÅMzüØ‚° Fâ°TkfáŽg¨qž¢HÅi9JÆ“d=¡TŠ ’Çó®~h@'3ýï69‹R?Ïå]Üsy7¿­îw£;úý§8ë¼ëðÂDr1TíïvÃÃpÍ=D*Šäåfu±‡Ëe4'b—ºß‘½}n‡û÷£©ûý#šÓ–ñÁ¶»£IÀ³Ížæ
+æ‹;0àðÁØzVqˆ¨U„m¶‘¯¿PÏX^w‘ :t‹3Œ>"qZ R×QÄEŸÄï#]P
+ø(‚®‰ÿ†gXþ÷S| fYˆÑeqh\¥¸gÚã./ ÅÇœ-1Ö`óhÆC™R¡¨P¸¨ô‘ [Éñ.$Ä6ʲq&1{IHçwÎl°wð ÛUÀÍOѶßp)û bBt™\­ I¾b[=®'áaïOF®vqB¹Ü®ã
+endobj
+1132 0 obj <<
+/Type /Page
+/Contents 1133 0 R
+/Resources 1131 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1136 0 R 1138 0 R ]
+>> endobj
+1136 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [429.216 356.587 441.171 365]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1138 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [422.328 159.368 434.283 167.781]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1134 0 obj <<
+/D [1132 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1135 0 obj <<
+/D [1132 0 R /XYZ 195.094 357.584 null]
+>> endobj
+1137 0 obj <<
+/D [1132 0 R /XYZ 174.056 160.364 null]
+>> endobj
+1131 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F49 1003 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1141 0 obj <<
+/Length 2409
+/Filter /FlateDecode
+>>
+stream
+xÚíZëÛÆÿ®¿‚0 T˜›}?b8z© Ä-Œ&úæ†NâÝÉÕ=*é|vþúÎÌ.¹KqÏIÐH“ƒ“š÷,‡óãžh8üšy.§9 Á7««o.`éÕL$¥sUÛ~µu– gj<BY¦œnZÁG:Žù4 ^6‰éßÍ`ß1ÞˈÜyÖÆLs?{Û¼ãÍ–?Ìoþ1kHqç5zȸ0N5W#ªbÚé¤Iá-$ ÎZA$”4 Ò ë$ª”VàôL;§Ñ¢™V„ÁHOCéÀŒòªd”œqmƒ+MKÉÕØ4P]p<”NJ1¥ élzD5ÚŠh§×h7PØ6p‚L¶{/ ì|Sc+QÛ"ꜟ̙ó˜æŒ¦siGuM±Tj½š]Î~xÜ»`v>k¡ýž3¡94©«L£¶…^8æGÓNB·²Ú`‡a6(H²…@¡CFo ÍÁˆÀZæœ0ió‹©·† KR¤ ˜†i4Pb¥Üˆr&µ¥F%˜—Ê>² YJ!ŸP*)’IC¼(š©š ®U3hóP n¸.­ØÜiG>þŠǪq(Š×Ö•´T½˜›Ì™s˜5É.MEÉ>ÅìØT7=ûUÿÓUý|&UïMQöLtYÁ!| AËáŽH‚ + RŽ£ŒgbA'eðÁQaˆ×Ž‘%ZÈ)H É€¹Ê|ÒÇ]ÖÝÒkcõÈ$µã¸×€t@&­$™”y;%xW’1:¨èmt h@ÈÎ{9 r ØŒÌ7d,©ÒZšÒ?¸5ªù^©e|´‹ü‡/ò9Œò0ç¿šI敶ã .Ó@ÚÂ\!aÉ#ƒxÀV& ZBy̤IºØg5øÓ@Œ ôæ ^ÜC'š2´%mÍT;õ¨xÝNc#ÉLtÖÉe0yoDi&*É9;Y¨‚À¦›#°ÌxPˆýýj6]Ÿ*©Ùšº4õ»–¶~¥ýƒ•öxj¿C_a\§)Ìldº šÒšæcƒh¶È_a
+JªÂ©
+³*Š«À½
+*¬ÂÇ)̬€Ñ*’©@ž)0ª¨
+Òª
+®
+²¬
+aðöö00ãͳÅ)ÞîÉÐà¸(“>l”¤‘´Ý¬éz¹ßüDù'íäüÕX9ilK•)§ûžçyÁ#K³oÎå…Ù§­^Piw›We»®)'Ëû÷o¨ÆQÁÈÚW/}`PøLáã-ã·y«=ix¹¹¸;ÁMsÒJåçR~}Òªàæ‹K 1Ì·ðD‰ùEúµ†ûÍþ_‘ .J7§í#éúæoV'ÒÏ/—×…ì¡Ðzv‚-¯(³Ï€nЫåݾ—¶Ë.F¤dIz©YÀ1h
+Þ Ü®xs¿Y÷|ÏOZ¸æ›CTu”UdÆÄÝ`BïOpå#ÞÒ:ì
+â›Ì±ÙÇà ‚âÍj€Emšä<úÊŽ&ùC·ëÖl:H
+endobj
+1140 0 obj <<
+/Type /Page
+/Contents 1141 0 R
+/Resources 1139 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1144 0 R 1146 0 R ]
+>> endobj
+1144 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [247.038 406.639 258.993 415.052]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1146 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [381.254 182.553 393.209 190.966]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1142 0 obj <<
+/D [1140 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1143 0 obj <<
+/D [1140 0 R /XYZ 171.973 443.501 null]
+>> endobj
+1145 0 obj <<
+/D [1140 0 R /XYZ 174.65 183.549 null]
+>> endobj
+1139 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F32 450 0 R /F39 504 0 R /F62 1120 0 R /F25 630 0 R /F11 615 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1149 0 obj <<
+/Length 4572
+/Filter /FlateDecode
+>>
+stream
+xÚí\ÛnÇ}߯~ ϸïöCìÈ@œ@HÄ7Û(r)R!%‡¤,9_Ÿª¾TUï¬ 6YZòÎÖt×íT÷t÷®žü§'mÜ’”™¢SKÎi:»Ù¨é)Üúv£[ëì5~Ûssîwgë—`̾6ÚêÅF7Í.ÈÛ»ÍÜ’“™j›Od]/jrf)Ö»Pu]³U‹K!{¨Ee°r³y.¼ÃÛ±ßÄ>Ù|þ ˜)-9„é䢴<9ÿþèÙñ'Ýüå„ã®}¹ëì—£wEaÇÞMýÞ[M}·kªvåžzI&@„³Ó 2a0Tnö[dÇø¦EØq»væÚ—»ê¸è f*/Ae;ÆTo÷›oéõÚVíÌ}¡Ô²sö ¶êÝ_eë«•­Ö™ûZ·„¨¡ó~cõö¯2öËÊXëÌ}5T²†J6K²ÊB-º^¢×ÉNfñÖg è¹h
+öXY¹²òVÆr¹¹àygñÓ«Í÷Ój:èžm´šþ~Àî=ÆîÀôWô-äÒÊ,&˜H`J6v1ÞœTô¢“¶Ó54¯wG]œð©ƒ-œËF6Ù£4MiB¶±4ç'O}ðüCÌsÖB<àA0‹ƒ¨údÚ"ÌÈr.¹ÛÏúèþë—·øùóö›òýâôåu‘?üé?¯^<Ç”WŸœ––·/^Ýáç' ÓEŽßÎoO_‘ôO8M!6yqÁk÷_àÝ/Oc¼<9ëýË·[ºñä~ûúx†<}ú ¿Š_ôѶ¸³}½>{s—ïðûc÷iýº-7Šûú³“â~éô¤)k^õË,á¿Œñ‹S¾FäJDúýí¶¤îù‹óòyywõŸ¢[ø¼¼A=ŸtOjzf©²&éálò ûÝËðm9ûòEIûÕÓ«beOrÏKd§¯?,Ù¨
+kŸ?HS†§‰Å
+ÀJÄ*5j1°ÜB ®ž¾<#€ éÈ8€+jwô·Ñé±IG?ãÿ¶wØ ½º|q·m—Wç÷Ðõ²ö|ulâÑé]ýRêÓYï`9AËûËê‘Íì’Qq‰&µÒÄŒb61“Û•ûÑÀXh-1ÒÓ TZ½­¦~ÁéÓæŸM-ÝI-6Ád õ’}MÜ‹‹ãÙZ{ôýîsÚ˜ ã)‚K^îÝ>m‹Á~[–ð«,vµÕ&ÚõMiÍ÷µY¢•K¶ÏÄ),¸È„» J¡¬¨\v¼Ú³¶Ä<qƒ«;ŒÜ=‡T½@d_Õïgµ”M¦”„e„ÃŲo±£bÄ’ryßzç=(TXÕí[Œ+¿$\Œkõ+Vã­/Ç.ǽ]-Ç»¶½ÏÖÙ;˜›Sʸ T*&œaô0Q¢VÜaÒÛ¤` ÍÞC-d&áÂàþbƒBïUô(ôÎ&\{˜¿uDIrÆ£,ë-‹°'XŠÞÙl!\B˜‚‡ÒŽM¸íáQ!}>¡Qò_Hj˜µg‚>(7 eŸ„ƒMXY_mv× -Qg7 ÿ!w±<ö8Î.ž=ÜŒrÆÊ(·Òf‡€<#”Øýšõ! ãúwy±M0³0ÁzÙ¸TÐÎã¦ÑÅ%%ímÙ>êbY—s@o@U2( K‚…\Ù°8“.2¯3ö±Ÿý8±“ {Ããל~DKpÂ[¨l©1Cï²­“¦3lkCNÒGÜ
+j²ŒEÈzÐЛ¥^-06tÝØ4 ƒ `ïÀ¦=l‘}
+Õ4ùÒ”ÁÎ$bñ³;^ŽšdØ›ò#ZR…ÆžðÁ4!#|ì
+€êòÊf3–€RÞt9wVæŠæC£G$@š‚IBÅ.G+¡…j´6ù0ŒW••&P£­‚»®<~ÓçJ/}„8)
+‹D³FÚ8·lV¢À2\£ÊKü95¢%¥P(¤d¦ á$Á'bY]KÀ\
+;Éàq,k˜Ç“”C!|Ô…ÐeÒCˆ5€˜B*E€KoÚB++aó±Ë*XÄÜlVOp¸’}ü’5¸1Øé3ú¸cÄXè ‹òÜÕs.Ä™ÒÂT"«Êé7ˆ`=«c–l|®E RŽå¼Êàâ9åRB°E‡uˆ”3%ݽҌ&\‘P9i«e;…§^ÁImåClÊ%ãð7);1‘#«Bˆ¾s“Pæq£Û5a3›´©þvç`½Ÿ-lDajàP9%ÔŽGÚ8ÁÂ*AÞÙÝö Z«ð
+º²°¥J(ëùF9﹎!¬Ce´EJ¨å”qz…Q†œË«òž@ËaÁìì :>ÀwAFÇÇõþFÈÀ¹h`^
+ƒF U‚ÊÖÅÑ{À,t’Yøø„¸„_ßuòŠNÎ
+]°Þ?ÁËñ¾è8RÏ>+­áãŒ9„µÿî'QáÛ~Þ»óúÜïÏë³Îÿ’âÌÑÉq²Líjw_]Ý_â`vuwõ予Meñ¡–'÷ÜãŽB‰|:¤¹¶J
+Yh
+1b
+xL_ØPyAxÖ• ÞCuÄ·y0Ç%h‹än«
+-nãjgN!¨piU
+A t…e½MåÏ9¨®C}Æ÷w¬Nã¢Ê;vAŒAZ;H a‡õ€ko–fkÊa
+kt…\Û¾°°ªmöÒÓ,*;‰`Òº¢•AwôåäP;N!iãT ³ ù'Ñla¬™wÐ$£‰‚z‡Rxâeíqïl‘ÁÞÇ ‚Éž¡©¾nœ±T¤JEëˆ{‡ÞÅC¤ÆB BÆÜ»<´¬¼67h¬¸]ÛH•‹ÂÅʧ‹2õˆ‰w‡à*˜³×éÒJ#¯¸LFQè] Fðîʨ5`¸è8Ú³–1³©wvlKy”Z)壎ô–PA­ñxn¬!¥¶·ÿN¤¹ÑìˆF% …Ðx^ÂÛÞÞ§±•A-Sg¹ñFÓ¹3ÈÇƵŠZÈD1°”Ç
+E†Ùö€»)ãxÆúPœ%Ù¶gS*¥¼BÒY‚RDµ]²ñüP ,ëù«¤0Q•9,
+½,È*¨4'­GçCT6›,ŠÊx³BQåÅæ}NÎS•cg%ð,¸“DÊ8‘dT¦œ|cp(
+ z[3 ü`–œË_‚rIƒ,d“eñwÑ0ì¹ '¡ŽFž4Kc”ýã±ÌqYxõYð¹±{»F¬9U¨Zl«N§<Žù
+¼ZjL?4L/6FãË&7€:Èjr@„ïê$¬ 2>„\UùsŠXU^ÚId3éghsy &°ÅIYY+ÁÅsWS6XÂ$NÔ¾Nýݵúm`u›,ëYÊz*…QθpŽðåÂ*NF˜³Ñ!æ”uU"µlR@Ð]@õ
+endobj
+1148 0 obj <<
+/Type /Page
+/Contents 1149 0 R
+/Resources 1147 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1111 0 R
+/Annots [ 1152 0 R 1154 0 R 1156 0 R ]
+>> endobj
+1152 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [137.919 571.871 149.875 580.284]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1154 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [151.203 356.935 163.158 365.348]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1156 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [151.203 132.535 163.158 140.948]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1150 0 obj <<
+/D [1148 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1151 0 obj <<
+/D [1148 0 R /XYZ 177.431 584.823 null]
+>> endobj
+1153 0 obj <<
+/D [1148 0 R /XYZ 173.669 369.887 null]
+>> endobj
+1155 0 obj <<
+/D [1148 0 R /XYZ 173.347 145.487 null]
+>> endobj
+1147 0 obj <<
+/Font << /F62 1120 0 R /F25 630 0 R /F43 618 0 R /F8 453 0 R /F39 504 0 R /F11 615 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1159 0 obj <<
+/Length 4030
+/Filter /FlateDecode
+>>
+stream
+xÚíko$Åñ»ÅètRÖÒÍÐïˆÊ¡èl) @–kß‚íuì=òëSÕÏšíö!_Bö
+év·ººžÝ]Õ5S† þãjrL V±É{7œ^í±á†¾Øã E*9YŽ¿:ƒc€2¾‡Ã¹žœUè ÞFS“wbˆ8ÿ2Tó‰ ÂM{²BkÒÃÛ½o‡ïÙp£?ìq6ümoTfÒÜ=ŒBOB{§†«TMVxé„YÉ0!˜
+8ßáÌʨ­@ Ån
+â€:kü ‘OÒcB @Ö0³å~)&.^‘@FÜ?ƒF›UzŲ„1ñ‘°x«*b;ïË<b¾BŽš0®)ÎÜõèx8íþïÏ! ¸€á P
+6&`ä†ýUÞë¹½Hoý|õEÜD³¼¹Ù&Qf/'Ý7ùû°Ð¶æÜÙÉr<EaûóÞ L,”Õ$^AÇ'‰/7 Æ~ýí¦„T_oÞðÁXó~S´pn
+)àÜöà|&ð€».xq4Érr|üááØ%º¿lôN“ë\k&ÇBŒð¨­Ÿ³‚Á2 LE!ÿœy¨e„Së̪’…,ËŠ=•Â˜}?•êܪ 9Lú[ˆ|§N¢¯SYž:s3Á^Æ'#°.œó­8‡BHÂ'E
+ÒA@EÔQ•œ4ïÆÓ8ò®púå}á´L…e†|Ô¤™q
+£iÌ>4Gˆ“ëܪØApiºZ…1õ~jÕ¹U/\ Ì»®^8Æš&Ĺej'OÀB
+¾¶ Þ‚µ }%\bLEXà‚ Ä#A°#…OÜK¦)„dÆCcK¥&&f ¾¶@ùTiŽæ¬l[
+*| LOr‹È#SÓ“‘×&ák&ÆŒ÷Iè,!Ø߉ ~UÄ4úšÊ·š%£ëjÄ΄/ñH‘°:®(Òøw+Êìüÿý°óûÝ÷H”KšýBp¶¡
+b$„¯íÚ{ﯻÂÙ96¾…ê ›Ý6Î!*
+×½nƱwÞ˾¹ï^6ÖÉœåÀ‚³òN áFÓØCï›qîX'gµðuëEW­8öžjÕÉE-iaHÖU+Ž=ô¾™Ôª“ÛgL>”˜%™)K±5ÇL¹ -†ÄœÇÌ2Ì”’`ÆJ ’lI/ ZNݱœãž9¬’•„±ŠOA…eÆ ÔÔ¼2æ©’rŒÙ¬œ%•)íµ5§ŒÉñ\KM´,Ö¨xÅf•X1-eš=PD3ø­7ï»VîÜýhÝ}°sóÓØÕ©Œ]x僬"_ù¤ÓÜø,\& -GTíx(T¸IBÈvf^66ø£6ÝÇÞò¾¾7äÕÉëÕy)
+„• µ©óvÊ=³¢A¬-ÒB.BÌj¹ZAJ¹¦ÑT>há#×G*R®¢J¹Ü2«¶äºÌ¬,³%~´%žY!(Q¢å¢Ä‘Ö•Šdµ
+»;fñišsÒÄGù·ƒ:ì]©‰€4;Ž:¼9¹å¯6;…N˜ß¼ÙISn©-hyºù,|bkʈ½)¯nÂø*4]²¡sév¹|6ëWÚ$hhRZŸ-[Q¾º¿á
+‡?&}U§yb@zRèÐ*õÑaí¹º£bÝ7lZºN‚FËŸ÷G-ÅâùË£Ðõ‚æAåÏ¡y+Èr[Hžl‚V?GÌç/Eñ<ÒYŠ…!Ϻ<{Mš´ä)~MZ¹ûêEÐQÊø·z«Ufýg÷©’¤Má/x‘¨U%“<©úô{—Á{ ÆM6„$­h¹·¢î‚oõRdÆ„w|¹§ª÷¿tá7ïëÂo~+êÿÆ…_?Ô…_ÿ.TÅ…­«{?Jƒd‡ªÔgˆäx@Ÿ¡N}†8rüÐ>CÁ&,8oõ
+§ÂaŸ¡`‹OâïÓuPü&tÚm’Ž}‡ÁÇËN ø7—Ä»
+;?€þ<m~endstream
+endobj
+1158 0 obj <<
+/Type /Page
+/Contents 1159 0 R
+/Resources 1157 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1162 0 R 1164 0 R ]
+>> endobj
+1162 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [301.556 567.042 313.511 575.454]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1164 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [448.145 184.65 460.1 193.063]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1160 0 obj <<
+/D [1158 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1161 0 obj <<
+/D [1158 0 R /XYZ 173.135 579.993 null]
+>> endobj
+1163 0 obj <<
+/D [1158 0 R /XYZ 172.663 185.646 null]
+>> endobj
+1157 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R /F62 1120 0 R /F25 630 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1168 0 obj <<
+/Length 2970
+/Filter /FlateDecode
+>>
+stream
+xÚíZYoÇ~ß_1 ô@švßG,?är|$bñÍ6j¹¤hðòrJþõùªzúØKZÙ ‚f·ªë®®éþ–jøSƒÒVD©‡`¥H)ó›™.ÁúÛLMKŒ5"(ú¶ƒ9îh“ÞíZ£¤1ØaTÖöüÍuV¤¨‡iÑOC!{/ä´`û…(›6á†ÇÙwÃr8ûÇ™’Ã?fÞ
+ë“uÈOI¥‡›žh„ò.éBÐ%l´È„×Âm‰$…¶& ó˜:ic†Ñ!Ji‚ðÁ+i‰…‘> .ˆè¼2Ÿ9/”ÔNw«àƒ–^÷ªàL”®7è”HV×ù˜½ïRBdÁ‰æ…&š¡Sœ ¦3˜„K.z¬~TËø¡¹e$º.ÂJ‚`MD%¶tMººœ6‹-õů®>ÅûuœÏ^Ï^¿Áe²¸6
+|[û#³'&÷ÉŸNgŸ|‡$’7Ãé¯;=ÿîøï'?œ~5ûëikéI¶‰z‡ÖVê4 Vk4)‚4Ú‘¯F…˜ÐšQ$™”£ÀSr«T[‡ÜM>hpGå…öÆ*ꦸ$Ê §¥ ÕQr;¯l¿ FQ8Û+3Bª¤ÂšQ´§È›o;Þéä»:Ò( µ°Nù¡êÒ0ijØLj˜ôuá–š\ÓQDêŸê¾FÓèhl‹²R¸£¦dTbKÙ¤ª%¶3Ø
+PëÊT¼ß®fí(Í“L;‘BT›ý¤C彯Ÿ¾ØÕO$ÛDáöÁ†ú¨¡§iá#¥vrÊ x ±oƒBb *Ú ]n¦¨#6ò b¢6”Hi„P’5–[Ia/wn%­P²n²‡¾MUÕ&{{¨}@ÁBóª6Hõ¼QJ|])*`€áª ]*}€ájÝ´3aj"öJáC4ŠSö\êŽäZ|•‚¼”,TZÍTÕTóÙÙ«Y¯^ÕÊTÏ·ë×:ȸÈ™¨Ív a gÞû:èëD¼ÉÖ&†¿Êz¿6’è©‚‹m"yLn¥|lûƒXë\?0­-6D7Ž0ÒiÊøºO+¡FmQÙðMQ™ ¹2=ªOµ5ªßR¢ë!èà|¨c¥¶QMýÃÖà¿ÂàKý¢—ŠcÚE&×Y ®ºTi5KUQÍeg®e¼8ÕªRüÞ®Ýú
+'/…“×h£ÐŽÐn‘’L6üu¨ìÞÏ4«"Ÿ‚  ›Q"áFRÂF§‘h‡¨‚ð2DÍvŒxGE<MÂØGêƒÇ»¾RH.QÑź
+™VQaUMH]Þ«Þe:(ÓyÕ¶åäx%”èH¬ÐF^Åg’¢i̪:{c6èX²¸5²_! Í÷1;ßEX(aÉC[UrÕ©*)íMÖÌWÏjqšû[5¤nº¨§ëßkü[­ñ ìã¯>PßB»žá,åp3ÝIúzº.Љ¾#¾øÞKoÛQêºÌiÕÓ>J#rº£Ã¤/ÓŽô \¬Ã¶s±£½è®–ÓÍòŸm„*‰W õŸ¢¹žÚ…ÂÒ^H¡À‹“Q¯ž¿ú‘ž‹ùê/ü¼8{CÏëÕó{æ_ÝÑãö{éäÑ)}\.GôE1u5QoèywÎj*—¾}Ë_?¥‰O7â„»’eV ög§/i)ÛY<¾¤çŸ¯–svcQYG¬d²,æWlv~sÆÏË«ÛÂ277Å¿^D±y­è,•}p쉜²±m›¯V‹·'#~áôpNˆ˜u>­’ל=–|U‘äë’Å£§ì˜lŸ‘ëûzÒÇiïô–Œ\³©,9-Ê"ßd½dÍËØyÒòrĪÎ/%··ósöïì²Ø=zš•s¡Ïn/sÿT2(¹ {‚=ʵ»ùãæjÒ{¶ä2²&ÅY¹a.{ôúƒ¸ç‚ÓGáæ­ìOyÕý/bí‹æïduy÷HÏâž/ÙûǺ¨õ+]¥,]òZfžsA~$ÁU‘óÏx£,¯.¹ ·;º½Xyùœ{++(>ºy¢Ë.Ín3ªéñ¨}'ªÏ¯.ßœÐN<1Ç:asá*yüåõ5ÈoV˳Õ>QhÁêõ‚l~ò9^U™â»x˜T¢Ü(u^ÕY4–.âÓšùÝí-¦ÇÕÝmV{ÅO}|F{¼ZžLÍ¿È®5Òp±Z,³ÄýÙåä³UyÍÝEþþÝfR †+²ÒalËË ûvf”ßÔ“—ÈCÒúCÙ#½¼oŒ}P£ü‚ÔÁj×É/g4ï`F\ž…L€iƒŒJÈÁ†- 2¯ƒ_Æ(·¨¥«¥7ëXTff}u(µ“·[‡÷I¸Éâp9OûŒ1û c϶eá&‹ÃŽbn_d™}±wÛ×’,Üd5Ý í!(+¡9Öeva¾×ØÏ[Æ&á&k}¤=b÷¸uc™ÍÌö²ÇÕ ïzÛ[Ò[–&É"háÊì *³
+jG¹²p“ÅqÎi«÷Ë샌í(WîŒá@iŒÛW®ÌÞ2綌}/µÝÕ$ßă$tÈí .³
+n{—MÂMVs1%a[¥×¡œÌxÛ‰YvlÂFÒ„pyá7ÇÌͼð¾VTÛ­˜EÇ&khÏ™¸',æÖv/N²]X¸ØDE¿)í´E\}ˆ©íNÌ¢%BdtÒ{,eÃû0‹wæè‡Üìö˜ËÜ_Ö“lg+h©5wõFæÐÛcjí{#
+¯éøR¦üFo07óâG†5ÉŽMØÜÐq&µ6™ÍÞ îÄú¸ŽÏ’cut]óqOPÌÝ
+êðÖÈâ]\Y¡w›c®9$‡ÛM?Év¶*ˆpj ÑõáF
+˜“è¨à„ raT@ðŠ0"¤5„çŽÁã6, a+θDR^D¯èê-ð^öÈl‚¶RH]ë)mU85 MýJ\o.â4gØÉ%¬…ÛÍëŽRÁJó2=4M#«
+¾Ù³AÃ~¯Æìý´Y\³ï¦‹°’rjr"ºu%[¶)§kFKâ;ߦâ´
+zŒQÈ|Ü{Êlé6¾óŸ]é—æh³{½–[—I…#ªÑaÝñ±@%endstream
+endobj
+1167 0 obj <<
+/Type /Page
+/Contents 1168 0 R
+/Resources 1166 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1171 0 R 1172 0 R ]
+>> endobj
+1171 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [447.384 443.989 459.339 452.402]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1172 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [201.874 145.979 213.829 154.391]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1169 0 obj <<
+/D [1167 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1170 0 obj <<
+/D [1167 0 R /XYZ 176.926 444.986 null]
+>> endobj
+989 0 obj <<
+/D [1167 0 R /XYZ 173.905 170.885 null]
+>> endobj
+1166 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F39 504 0 R /F11 615 0 R /F7 627 0 R /F23 440 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1175 0 obj <<
+/Length 3369
+/Filter /FlateDecode
+>>
+stream
+xÚí[ëoÇÿ®¿â  
+[Û!IÉÑ…ƒRBI¢Ø ‘l°
+
+§;ÆM ÒHϤÊÁ;’Фœt£íª²5T2C u^­2+ðV™Å E³ê©¢ëÑ›‹»‹—O®þT\ýæ¢úèœìœ$HSèiFóÊœ@QÁk×¹qP FŠóÊ(¤8)…DMF0Þ›€´0:šŒƒµNÚ΅Ľ™w¦Àº
+^…SA• ,Øg­|£¹o ¤çøɹ«sß\$¹o)¢“Œ6Âh´Ÿ ŒVÕÑfæÙW¿FƒM%E{}eÍ•\R´–yÔŸ)ìÏlÂ%‘’á(,`EJµh’‘/ºÚ3sª‹Å™TAÉ\*tUT8©S\õmÜÍ'ïýy½Ï$Ù’l5ŒÚ
+o  ªzçGð¨=_?#£Qä\ÕsЃ¹LzòàŸÓƒ/¡>…5¹Fýž5”,;¸ ð0oã[yÔ”óðò¿§…´hf~œ®§ÓÛ
+a{Ñmµ1W”´µKSßÌUAm±ÔVTs…WSžµ%Ü\]ЖM‰1S‡´ÕJ[ÒÌU>M}ÔÖP3•V[µEÛ\mw÷äÑΣíûX°0žcRŽ39$åP”¯5†ç™ueæšïX
+èÏuèÏ•¬´{6œ˜3‘{ÏÄ°Á4}†_iF3RUm¹-sïÜ'/ýÿyiò^ÅEøøÆ(@·ô•JHC‚1ÖKzEN>'ü ¾PSr àÍ_ç3çY¿JÇÒ«Ç¥p¯é>@ ôqü«ë‹Ï¾5ê ˆ×ohæõêÇÅq}ºêåâ‡×oñ²¾9}M×7Ëwx½?ýð€×Óf—ÝOŠËk¼=¬×—xŠ$ê)Q·xݯÖx¹,£øëôóùÕÏ×ߣßÂ`œý}u¸Ã_¯ë‡‰püa·[ü‰·Ì Àfµ¾§õË÷t9^fÑ8çt ¦ë_ÇâÅ»^Þ¯¿& Ab šÐðf¿Ëü.—4ó°ÿpl!_–
+µHƒýT q§Ï¿ÀñWרëÛõ‹ã³:N6ÏŽÃ5Ûø î3&sÿrÕ[­7wK2áv}Œ„Ó¯`"RïÖñ¿º¥ËñóGѺ>ÐŒõ7«ÛŒ­øá5Þ¾%Èþ¤úäÇý†¼º>«_î×Ü[—«%ɾ‹š$­¢_w÷¿´Ø6›jN·¹l½~  u$uiëFu™v¤¡:'ÌëOôŸìÈþZ>¢?üèÞHÃÁáæ Òù°¹bg¶0l:úðjÎ&šÿÙ·c uÒ‰0Z«x€
+¯«^ëq¡åçW½±fñâ¨ËÝíf×Û8xBM p¡íßÄëÍ~·»J›éæ„Ï€W|ØœàÇ]T
+Ò¶¢•ÂÀÑÔ( ~D®ý‚i"Úº|,O$í€Rüâay›T2ŠðêÕ¨†0ƶÁFÜ¢ºzñ#N¹øæºdÊA
+ëvðZÕ#ÉÃm:¯üûw1À3µr€—îœNQÓcÕÇÿL~?[ß+¨3=•Ñ&̼Ân0°9•Å‚OeGñÛ§²qN=•ÕOeEs,›xÍË*(VmñÐRxï=½¨'T¯~4ÈB ¬šÃ Ý¢Æâ ФÓ6~-pX^@ZÞküZ6üu²
+˜]
+·Šs•ZÝQ”ó­ ~ÆØÉ ï“×?¯×Ï]½´¤]øÍß :8Gü•¨u8Bi6)¥ DécJÑ©½¨«FGqKúÁ((ÀX<€$Zb¢V(±}%(+4Ÿ0B?2fKïíT(~øA¦\ùÎWM¨¤l*oÔéí DÕŽqƒ0ë‚áBÝ`„>õ%åÜ´B´ª à-•c–fJl·I€Ôi¶Ê¬ÀË…7dݪ¯Š­O§_ÏžœþÉ8ýe<ÙÂå2 ©Pß–ìN‰ø-~bCN0+Î8YÆÞ=9H©T™ õÍ=ëBàoN‹Q·“×à\NÓy/‡î5ÚçƒùúN™{}säþJË=
+èE£ê˜¬vë¾iDxrïGè^,º dÿÞÑ ž”žžôoXá1 –v•™ÉÝÏkßÖÍiäÐW©¬4Š"•Ç †Ê|ƒÙØ£1ë€(…±e2qì`ÏÑ<Ü,0\—úbYãB'ã'Ðúê"šŒ6íÓ‰§”¼O6YìÓÐ̯÷éÐñþÚÂ{þSi;j X­ãʇ/'=/j»mZBxÇ)ì«ß6éxÁÑ/XÇËþ=õ+Ü¿B
+uœÖÿŠM)¸Ýú¸ßè÷šFj3ñ—ø&õ>dôê:+´[ÇvˆÔ1q¸‰$írÚ>tC†è²]¨ad³+±‡‰–<»Ü‘ÒÛu6ã´È(\ò^‘ÇÚtHuƒïZî‹
+ËnM;´&·€Ö¯
+þ¼/o’];h½)]R’HQkR`¢5A½?›¸Öh®¼çyê €”"FçŒú\ÇÏãý*lKìðûMtÔpÞ÷’¹ˆ›Æ²Ë×ûS!6Û!‚Z÷+õÝ<|™ ŽÌ~»Åb÷ÚW8Gd›/Ÿ]r§_îK3Ñow(‡[ÖŽ™¿"/§~ ZÁ3fZ¼˜6Þ䮘B:ðûHÀ±%m—õ
+)ðìÁˆò5œˉ¾Œ—ÓaÄÅž›Stˆã©çó¨¿~7ý5Zhˆöø†ÅqH8ÿÇ 6ϯzH姻Ô\¤C[ƒÇÒÁ^nÚ-·m๠iÿ€pPÈ4nŽxU‹wGïpxoo7ïÑëø‹ù!-:í#“Ø_vÈ0/·÷›âÜUœ²‡'ÐÚÅÛêócŒ5½Åb¹KÓÀÐc‡¦àöÍmQd7v»ÀhÕ.Þ½»JÚÐV»<‹„7ý\ÿšEå,↞¤s!Ksc†°m#þ7ûøzYâàêùŒ OVdrý¢"a‹Ù<¾9F®ËxùIHsÏ@%‰Ä<†¨EìíKW›ˆG2R)§ʨñÐôqå­¥±È³trYiŸ™íäræP‹Ü¯$lRØ&UóaÐÊOoéãSendstream
+endobj
+1174 0 obj <<
+/Type /Page
+/Contents 1175 0 R
+/Resources 1173 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1178 0 R 1180 0 R ]
+>> endobj
+1178 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [137.919 458.134 149.875 466.547]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1180 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [430.103 175.931 442.058 184.344]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1176 0 obj <<
+/D [1174 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1177 0 obj <<
+/D [1174 0 R /XYZ 173.536 471.085 null]
+>> endobj
+1179 0 obj <<
+/D [1174 0 R /XYZ 175.165 176.927 null]
+>> endobj
+1173 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1183 0 obj <<
+/Length 2282
+/Filter /FlateDecode
+>>
+stream
+xÚíYYÛF~ׯ ô$ÃÞ¾›L‡xL’ÕCÛ08¥‘A‰Jsþú­ªîæ!jÆÄØÅ &ÙuWWWק ‡"R³ŒËÄiÎò<K–» O6@úa"‹ÒŠ9_gˆi¤¦Æ²Üºs<yÆ2§“4h8åÒ,ÏdâyþLâªãŒ'Ú0ZŽ‹<ê29ã*Y’j͌ɄIv“}ËçÉ‘ˆo“|Ÿ%9¸ª’Åšø«w³?æ?N¾[tqÙNÔdLi«„Ì4WùÐ=I¿dè÷±!/ÚJ¶v”cÎpeÎ"ÚKv~{ÎNÚŠ
+v÷ÓDðä§ÿoïÿööþk‚¾+ÃEŽbÜžtOžöbëiêÓžD[IŒVä\œ7DÄת§†‚h+)’OëÒ2›k‰Ü¤OH07ŠƒûÅ¡ãîq–)·Íó2P` mÖD5"‚ö\Iå¼z+A(‡œ
+› *åÎ@–QwwÓø‹æ—. ‚ Ü~|±Lç]&ÀQ÷3q(穘ÿyÛàó®|KßëⶢõË›#>·õï¹áÓ‚8›úþ€Ï)¬ ZǯUSÜ·«_cŽé&d’Ú³vyõ Ÿåòø–ž`Ÿ˜#ú¶ÆÇžÔ.ÈZYNƒÞØ1¬îðY¯Ê±+¿Ž}0äÃñ+$³øˆ¬øº¨ï
+2O+WäAù0‡C$!Lråˆ_à(™-‚!AÊ¥`‰~”¨fAY:£ñ±ª ò¢ùS|u¤x<çï^®$ >ÏjÿíGY <‘™Õ¦Œ†÷Ë%¾Þ6wqIL/(›Å~CQ~³Æ=•TJ`ùfHÅ·‹é5Jyƒ4…¯Ì,w~ò-Dz~§T õ¡µW7_~_S Gš@/®KÊÇ'”:Ff¶ü†v±Ùn¶TXg*sE-î?^âóÊ+ˆNÿ ‘¤Ø™á„IÎ$̦¨áûíævŽE9‡&›)õ•—ÿZ1hÂ9x€lS¦OuÃ)W.2-ëýÎ Àƒ×»ÝãÓÍ
+ÿylÀ&íV°‹Žëc\m<÷M± t­ü³^{Ê»ÓN(áÖqš[Íènªm6aæýõ‡g«°§ê<Ë`®~NøC/×Jvtw‘ L7sCu1JÀ„ælϵ Ùº=”+_*
+´d–,7¡@Y(£c[òÇkŸ;eÌìp,š#d\Ì6žU)!w[XÙÏá-È`{<•misÝçZ¹ÊªÚÞÀ§?#_KFJËœ!.ìUÕhp–RÖ††ðdòŽf,×”À¦{xçpÇá•©˜€«ÝáUÔÝpÇYçwë¹]¢ÔBEHÑu%xôcÞ¦ëðP{¬Æ:œX 'F¸à«õ·B1—nö8÷‡ D”ž­Q¤§.E¥b-ìËûq.8Œ5V¶þF2¥MFߘïpÿãC ~Z!CÃ\Žýîçs€z““ŒÃDr†( $®:õy¸êy:¸ª®ª1\õ|©tÌjƒ£„éPÃ1LXD¶‘úR™<ŒúŠí$!x ΞµdýS#S$Ù J…5§Ÿ‹Ê“_céi\n^¶˜UàD(a
+ƒ¸•#‹A1 rZ@¡¥#†
+„c2ÓT‰ŸÇM_ÀŒ¡9ãÜe9öOÅ¡&{€Ä,þÚäî%ÓNN˜þ{Î ‘^ae<¶§^´g†w8­.3©ÊÚäÐ;ºdtk©ÂK›(®r<T{Ý*dJÍ-V
+ôáø8ÏÝã•
+°]fÍ3 Ò‚ñóˆSX‡QíEì/øè—Ãë†çàß|ó‹åendstream
+endobj
+1182 0 obj <<
+/Type /Page
+/Contents 1183 0 R
+/Resources 1181 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1186 0 R 1188 0 R ]
+>> endobj
+1186 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [389.351 490.088 401.306 498.501]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1188 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [448.145 187.255 460.1 195.668]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1184 0 obj <<
+/D [1182 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1185 0 obj <<
+/D [1182 0 R /XYZ 174.729 491.084 null]
+>> endobj
+1187 0 obj <<
+/D [1182 0 R /XYZ 177.199 188.251 null]
+>> endobj
+1181 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F39 504 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1191 0 obj <<
+/Length 2770
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝÛ6÷_!ì“Xëø)’Wä!›» Päî²oiȶÖë¶|²6ÎÞ_3CŠ¢,í6-úÔ¦*y8œ¯ßœ¡–g þñŒ •[&2£XîœÍVûË60ôÃŒ©dn8þš\t£ )síÄ—EnÊœ \ò©ÜY‘¦ÿfQ?ËY¦UNú;"ë¥å:;Ï>dY¶†á_fœe?ÍBçB; †ižsf¬Íö*Ì3F‰ iÊ0mˆÆ
+k
+¢Y¥ ™-”Ë 'M¶‚ÉE.+%·8 4#œÔDójÂtJ" g›Ü8&Ì€ÓæÂY'm^`°RÅ.gʱb`¡›ðÄ|ö³{j!­TY*Qä\™^-üÖè%ÍŒæÕ:Ãe–¸¡åØáHóá
+¡I8c‰1ÖÝ=*…zÂ=áñÃìý7üÿÒøßÏ&g¶(.àï‰1f`º3rZ‘8–@`!^F  ·¹Ö ï:ù)ð „6À³œ m¸M3ØÒR­@³F[ZÇù؉„–
+¾ Ò…!pFÀñ¢. ™b†ŠNkm~ƒá0†&x±f`Àc0T|½ún%Ž)CB|‡L±ÐÆ&ô÷[ázëß}qàe¡råTÌA…õhMrðT]/ø¼}óØàósõú}_>îˆþîØâs[ðñ3ÓìêPãëºò3¯¯€Ê»Q±ß‡Wþ&7Þ¿¹\êQv;PÆFjôïTSgSŸOø$%D'êº)ñyŽLW#a;r‘òöï8úêî
+À×Cuþ„ÏÕ»'|nêçNñ’,©¾\Ã. ¢ñG »üóªE:ŸßÈβ­$«7»ª£8
+Ùtsu¤xížödr³Ù’Ȫ˜=ñ&Aää‚€mÜð*œr÷™N7wøx3zÆÙƒàSÜ(àëMÕùÙVøZ6AEVÜ6drõºcöÑàÍùÓHÔ- ãK%4û8ÈW½—~ô3AZ);ñ5׫˜£W=Š‹q Þ-‘ïœÙv&å«Wâfb;‘k²<z‡Ï¥0È™Áq°€ÓXàýË$áûíæñ”€×Š‰¹ÔTÚÊù»OmS¶Ûk Œgø™KÕTŸ¯…S ó~_!ƒœ¯êÃh…§ÅÔ'Úð öúŸ-Î%!•'PžÁð}[5^Û±ÜÔô<õ½ÿýáò@“UÍa[u:wÜö7óÍ&ÜÛÿç‡gÏG^Œad|`xnòÇZ‰ç)ó·!°kÓ8º-¹˜—Rx8N¡»A²™·@}¨<˱lÊ=¬KbšÞÖOؘ£ vr'L0¤ºÖ~-\â. º‚#–ÅeS7^ "Ûžð]Í×Q÷ˆÁ#Âßz®Ï×Zƒõ˜•ÏN¤6Õ1úá÷ÁfEëñF‰¥gì2YV”*®±Ó+¡ºG‰5,i@ûƒŸ…ïP'AYu üd ÿ¤xÁ ÅyyÜï€Á‚YÛ“g¥±/åþx{Oœ¨®FΧ΀2èÛvÏ0rk̼>Ѽí2‘ÔYv,O·Œ[wïç8$`¤˜ŸÕ5È~ð”÷]r˜ i(>ð#æ ¼Ÿш¶©<~2Ù‚ÏŽ‹¢‰Iç
+QqCÊÊŠb@?µe&ã&ƒ²Càì^Q\ÙŽE-}z´m½‡ôS\w£ãL(›&¦Ìr…ÏÅ O;/R8CÉYž<âŠO¯¦ò?|Ö”hÙ¦ZQ‘´£¡ñG˜ÚSÕ%Fíè3®l‚¶8/¤Û@3(Û¢ÊCwFà(†O¸œÞmc4Ã!%]’°‘Û.1°&:£™çQiB>Z™Òï9’¶,ô­*cZH:>Fú
+• Ùeò êX &°*<2Qc\†ôNÁÄæ ÕaRm [ Ð.W{ÀŠxËGíZ<XŒÌ‹bò«8£ORñ©AXÑ’>xƒ3¿þÁÛ3%¼¡Ì÷ÿ»øअÞþ…ÞoÓßhº¡SQ´Š+굡
+²œš³
+¦öaÐ §¨w4Зc‹Š7‚~u
+4àtå]‹ð£È£+ìãDtRi¼¥ÇËüm¹+”ÿÎ"ðBHJ
+«ñÑX8Y«¥~ ˆV:È ¥ „Ä8pBB«$k¸ÑDR:&‰È8ã$Í!<xIZä
+ß®.ë/]“]v=ø2öÍdîõ³Ûƒ÷¡Yuü|¿OšØŽÉO»Ø¯iÚéKêù?û’i÷ÔÏ&ë`Ï°<uåŠ ©¿œ¨ ýÝðÞùp¯O|ü:š·JÍ£(ԑ붳Ž'rè¤;Ô ×Mzå’ïeÄ MUXthÀ>ì¬ûš>.i…±T´ÂJih…±¾´Â£‚38‹®b>¬
+endobj
+1190 0 obj <<
+/Type /Page
+/Contents 1191 0 R
+/Resources 1189 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1193 0 R 1195 0 R ]
+>> endobj
+1193 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [448.145 485.998 460.1 494.411]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1195 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [391.413 130.506 403.369 138.919]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1192 0 obj <<
+/D [1190 0 R /XYZ 124.802 740.998 null]
+>> endobj
+842 0 obj <<
+/D [1190 0 R /XYZ 175.46 486.994 null]
+>> endobj
+1194 0 obj <<
+/D [1190 0 R /XYZ 232.897 131.502 null]
+>> endobj
+1189 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1198 0 obj <<
+/Length 999
+/Filter /FlateDecode
+>>
+stream
+xÚíVËnbGÝ߯h±É·§«úh±G3R%açxášaÄc‚í8“¯Ï©n¸0’YG‹nêqêÔƒ¢I|H; «èŒÎ9©éª1jÕ íL¬³:’|;£l÷Ú–RÖ>ž³ñI§è`èX}jætN¬vF¿«^œ´Qu ¿š@;pP/Í­²øÜ5ô{˜~lȨ›–¶ì(+”±Õª ÚE6AQÒÑGëÕ²±¤M´Ö*2šCJYˆSÈÁ+²ÚäÌN%£]òN1üaÁjŠŒ
+š˜”ÍÈ3Ù¨¨ú¨kç]€ˆY“ lU¨÷1‹+`|Jœá 5Àƒ¬ÑÑY"Ž5ÇD UÉ:[ïq³ØÞJ¥¼ŽÉÂÐRä$˜mÂ=¡4Ì™Ò{m³wN‹œ€c’#’³0˜ƒ†ª6jï ̧MHÚ32iÁ¥H^qÖLÉ%ô^*ÆÊ}9Û¾žÓ¦•!YÌ&ƒp˦EM%%V­AX&s ‡ðH,XFŠg6m~ECçè<ææ¨ã¥Û„nÿßäÿF“ûå =Ü’Ó1
+±}FÓWG²v/Dîÿ$;ˆ> B‹Rˆ É…èú°ÐŠš‹2È‚¹7on’BñƒUã‡b6žÝßͺ îÆï›ïǽ÷Îyï+½ÏÑÀ›´Ë ëHQôdjç@1ÛHge½oåOhø“ô^Œé þU]uÿFŸOé·;cñþù ÂÈɶ#ø¸“Åç{ݽŒZ^oþ”CO~3ÞÜËõ©ƒc]¢‹€ä+ »†$×o…˜,yðÀ/ó æýeLþ
+LW0ïõT4íDË1}+˜¾\WW¶žâ}†Í¤z¾ÝlåXÌë !ÖÓÂi;-\7ÂƉ
+endobj
+1197 0 obj <<
+/Type /Page
+/Contents 1198 0 R
+/Resources 1196 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1165 0 R
+/Annots [ 1201 0 R ]
+>> endobj
+1201 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [399.259 286.484 411.214 294.897]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1199 0 obj <<
+/D [1197 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1200 0 obj <<
+/D [1197 0 R /XYZ 225.051 287.48 null]
+>> endobj
+1196 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1204 0 obj <<
+/Length 5268
+/Filter /FlateDecode
+>>
+stream
+xÚí=ÙnI’ïü
+ÂÀ`Öä}L£v==³hÌn÷´õæi4EÉêÕá‘e»=_¿qdeF²X2›½û°kÁ€IFfÜ‘‘Gd•ôRÁ?½ÔÆ I™etjÈ9-77 µ¼„¦¿,téb¢Æ_{Wcëʽ¯‹aHÑõø:c¯Ê°ë?–•‚Ë|æ4¬€©6Yiç—u2@H¥!&Påfq+ÈS‡±9#Ò¿-þðç´ÌCvyvA=ÏÎ_üx}ªOÖ§?Ÿ}¿øî¬iQ4ü•¶z06Çy¦ØÁÂóó„£Jn& Æ';Ï;Ân{?áW%C토b˜gHbh'ü
+nCÕ"\•F_ð¸ò:/o:°3C
+*/¯ªÂL0³ÐJâzñvqQãNFŒC66䙈¡fw|Ä4|13LKÄ|™ç\ÄHn-bf¸óevó#¶ˆ™a8FÌ—š¹ˆi¨{"¦Ä€é†cÀô‘±Xñg£Åš!;ãôþ`áÖãceÕˆ`™áYþE–s¡Ò1«±2Ãlôö¹ÍGJǯ†Ê ¿ÑÛ_ä§çE°Sƒ_~Z¼Zþ¬–çÐï—…VËÿXPÆp!bsƒwÊS¢é :ÐW€Á¬¤<-L˜óLÐÉ1Ì[ø¶Y Ô›"ÔDèB]SJšaÚX
+ËK„“š¬Ò›E£©Û70Ü_>ÄS@È€¸X¬"L ÎfÆ¢)ÒΈ:رùÑDõwåÕn®*è{Íáû#,©Ã”¥±ûxª)OÆ—<xJgogybs–zÂq%;Ò¼ŠÔ!NùÁ>cÂð›]~¹c¨`~Ïj^?îp¤‚Y2„ÝTÁÎkÈÓð» ²dhq z=Ï;5_ò4~ˆÆøyžÔÁhU“©¼LÓ¬Êh¹K&£v¨¬Š0<Ò“"DH9ŸaÕp¯Š §œ×˜%òàµÎ Ô6áâ<ÃVÔXcÑ™l‘´ìDAR\;‚óÙíš!¡¤Ž¦†5—W.îp°×ÁD)'ÀBð”uš>=4gt‰&I3 ÚY•zþðSŠEþ*+$£Xò`U
+vå¦dæ¦ÿ$ëUSծ͢•¢0½`.|Tåì|Yš:½LØOÑð %`¶6À>s–Ë8‘Ǽ³ÿ¤qlN_š­'§_ ¯Œ`‰£áI¦<šË
+²d¨ÁŠÚR`ígÈR2MöNŒÛñƒ˜²:?Â;˜#,È’a è<oPjŸ²;xùCè6‡ÎùYý°ÙdM·o
+[1¾@÷ýJÑb«%­ȃ`@P'‘ <žÃy›û´PË·.kLû¬»Tä#`[Óç,
+ò…κÑÒ‹d ÁQ§¢ƒÒI• `*'JU µ%ì
+ èœ1KI]ÂE´ä uÙ v“Q« ‹:ãܲ©¢qýԽйÁ
+Ø¥ä³sàïwè^–Pcx,·m&Çs„*0]$‡®Z—w§Al[ýc¼Î§³ ã6ÔZ1bV¸°¸”qt6Ò€í‚g°¾ÜÞ[5D‹?HÌXx ´_Áóaz¬2ÑSE=(,BÀÂÈÑ
+¦ÖØű@…ñ±D„¯}O;èl“ô´Œ9÷|5(® R>€eXOE©†€ú2öE=“æž#E¬û*¥%o MV3vÒ¢²Áº¥PÆfð¥^ª]atžQìÓ:V#6z£­%ßæ’*`s\Õcêà>>EÀ×/±œ?@Ò‹‘Ù¤RÇ„N^•D˜lI…Â3.[_ʼ „“›é¨#“A ‹û?Èð;5lv¥ñÑÛדò£6LÔÀãY]Ä“J¬2HVØJ›}ŒÑä2ŠQfSè@Ñ'Š¾=”‹¤
+¶äð†-æ÷ó£öãËëB@àîÖÝóU~j·GÖÜW[ cÀçèçëÑÜáØ¢ûjDïXÂ~¦ÇGXb‡Ã”Ü[_$WØskºÃãÆ®‚uyu<˜Å«x0Æi¨‰#\{¬äi/uV¾+|jØ&ÍeAq‚Œ`X~·/bROÕãÒ®8&awºÁæHK.¡U,'ª;P>{íhŽ‡´ÿvžÛÉ:ývZgÄÚqrg­ÖWصQ>w5i…[G­v½_6ÌOQñ“2¦‚ž;Ã-í×ÜÞ…ä)®Æ+_:Í2¥öcKÆ«½ãÛ7_¤¦vd¡¡ Kv.ÎεoþÍúôŽa’ç»3,±Ãï©ÞŒ$WÜ|*ØëÎr¥‡pìþé­P\3Þ&µ.÷©¬‡–a@ ûÔ.™¥{S·“JAâ%jK;
+ýeýS˜Jôm&T¥ù…ÒUUZáÓªÖï÷µœ§øxŠi|ÀrÈÇÁÆÀO¶·ª7î&ñxÔï–½Q<“(‹Éîx8jùbxßÝjX
+o*ŒNܦÃ
+Ï%S'¢‚%ÝclªX+ JèXiÇz¤à,
+—BÄZàªÔ:¨PZL…yDÏjEA±Ú[òž©R
+Veöøz'Û>EÃW x¢jèÙ•VÇ}èov‹è(˜ T?k9;G\ÄÊ::|ªHw_[ª¢¯
+®(£;˜š a®NíöÈRzAn¸c:…ù& °$84 ˜6Ý_ƒð¹(y󧃳Qëƒ:å¥ÓxoöT›E  /(ƒ½=Ý©Nàæö¶¾à ŠW]-71ƒû[/ØvÂ\é!˜ Àß7oðu6Ö4™
+~ÕÞ£PÍ%£ÜSÇõ™ñɱÿ¯ûrâ'Ö@r
+ÂçÁa L×F!³ú„ÊaÚBÎhnÑ“Ò~âë^²+>sè­J‡à<L
+ßlƒõ ³¿‰
+3Äv}0L.±^-Á|üªªV‚î·¡{€×ˆÃ%'Ü|â«r豋O‘‚é![…ØRÁÊ Ð=eØÏYK›7\0ÁÃÓ+È&w,ø\l•ę̀ޥ®°ÜWè5@->.‡U‘
+Õ(›2Xø©|`)C„*Á’ $ÖÙ
+ÙC8E¡£„‰=ëèu‰uÆòRãëナR"Ø€†PN;›ì&à…C|V®éhp;©¼—ÛÉ
+ën¡W(¾x®Ú¸B…/*á5!‘ðo•]„Á¨âžpÙì¡—‹«GÍw.ñL°Ÿ¥ÃA|‹mŸ¥A6× œ%2Õõî5#¬É9¼` ã&©
+(›.Oÿd«ñÎÐÑPä]ÈZÉ:Kóg˜ è,Øc¥”îéÀ3ÓxM tŠôº¥põ‹öh¬
+Ÿ‰]!mgH1¿¥¿ÜR!ãßn'{4ß—{?çñê¿î YGxdózän8tlöfÁ×g#ÊãØÔíÅwÏ…h
+ØX!´x´üÂåùßäaP›ø]Ù?zÒý½|u‡Ð·–ø±¹º؆ǃÐÌ6(î¡À­OÁW8ŸáÏû5¹úð~ŸÒøâ`Ø–­§¯Ç:Ánðw© $Šo~ƒ²Eø¡¨ñú†‡ Ã9ŠïNá¿_¡–tÞ„“³·Å"ˆÀ{÷ÐÛVßÂeœÂ&‹n
+ÐäŸz+ËÔæ†.ñŒ6¿Œz­ o”æaïá! m‡Ä;ºÝ?Ò¡èäe¦·ëø ªzüA¾< …˜kb?Èþ#Q¨endstream
+endobj
+1203 0 obj <<
+/Type /Page
+/Contents 1204 0 R
+/Resources 1202 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+/Annots [ 1207 0 R ]
+>> endobj
+1207 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [429.634 151.18 441.589 159.593]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1205 0 obj <<
+/D [1203 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1206 0 obj <<
+/D [1203 0 R /XYZ 172.751 152.177 null]
+>> endobj
+1202 0 obj <<
+/Font << /F8 453 0 R /F23 440 0 R /F11 615 0 R /F43 618 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1211 0 obj <<
+/Length 1375
+/Filter /FlateDecode
+>>
+stream
+xÚÝYÛnÛ8}ÏWA
+8€Å/²å橶»X-Pøm[,d‰v”µ%C’“´ÈÇ/9C*”M;vÁÂ’È!9sÎ\HšöBõ£=ʉCÖ‰ŒÇq/]ž…½¹êúãŒ.8Qýåé lo@ÈŒó 13Þ "ñH÷œœýöIðÞˆŒG½É ¤&Ùßý"^´_>ýø2½ýF¡~mÔ Õþª¤¬@®„OÝ®dí«•¥¶ ì+6ŸüÕ‹B+ÇD #XÚ7¹]Ý£µ lÀ¶&qbŸ/t^ÈÆÿXH«W–@ÓÌ.ƒˆ³¾¼ƒ®bñÃj>Ð=ê©?¦åÈç?¥]œ/—vq%ê,6`H†KËÕ;.Z.½Ke’µ\éçG-ÁK³(z¾ÈAZ&
+ËÌe}…ßÍÄ—ºA×ÌÀÜL,fsY£P9Ãg‚½–%G‡ÊLW¬—fecƒbV5V(d;ØŒaI‘u-\£SãÇ£Á \Ü€œgWîÖ_®ëÆX™ü Êàh“®ŒTSbë&¹“¸¤e…v¥f®}^±¾‹”Ä`>CF­+D6Y‡©\LMÊ¿¯]ö=my«­q€FYC°=9°?ëµ ÝÖ£¯÷x4̨<^žÙ™h·Š ò$LðåŬUÀçÇ'4æëñÆ°gŒ©šãòHá&ÃZch>pkÓI9ÚÅϦ´‰:¥¥cz–Wv½ÅÌcÔV<Nl<¬*y ”k“òº“°"–ÕMÇ3G¾€¡á[<p€”ò“YVP?jw'çw 7McIÙlhuÛSOñ!Fñ.¤=¡pÒ¿Ô}ªã܇à>U³¯L½’Iì-EÄémúE4ÈõÌ ¹ie©µJ>X…ÍÈ$Úhݨ|lg¤l–`ð¬Ù8¥œÂ ÷Z—o;ÀºjGõ|}WüßÒÆÞmN¸™¢º°õÎnÒaŽïí¹ïýÉhG¦~`.l“ªÐpf¤! ð©\´¸é6OŠJ“ªE¬ÞÇò» w–×÷’"5-SL„÷hžÁ ì‚åD
+s‚ÁmˆÜ
+2æÞ¿r4h*û”§—á±ÀÙw¡ÆojEGcÂÙ¨«ÕºNšendstream
+endobj
+1210 0 obj <<
+/Type /Page
+/Contents 1211 0 R
+/Resources 1209 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+>> endobj
+1212 0 obj <<
+/D [1210 0 R /XYZ 124.802 740.998 null]
+>> endobj
+853 0 obj <<
+/D [1210 0 R /XYZ 242.486 203.099 null]
+>> endobj
+1209 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1215 0 obj <<
+/Length 3188
+/Filter /FlateDecode
+>>
+stream
+xÚí[Ûn#Ç}×WH€8î{÷8ðKÖ^‚E¼B^CàJ”V6Em$î
+ öãsªúVCR¶•‹áxå<ä™êºžêêJÏþé™6nHÊÌ¢SÃ8¦ÙùÍš]áÖ׺ˆXg‡¨éÛž›ózwìà¬Þ'ã㢛͵‹òö¶˜ÆdfEèï³
+k­5‹v`ûU]Ýàgß;W³ Üþá@«ÙŸŒBŒÚÏæQ )=»™bnTzœò&&F´£&Ä£( íhfçF#9Áý˜´
+ÖSX€œKPÈআÂ|²£–rpÙXç¤6…¡1¸‰U=ªN^x(9##ÇÉã
+‡œ»BÜV¸× I!™1ûZ‹fÐÖ)öµ¸È$°-Âlg¨¤CÊ•¤um-¹Òjã úÖyªìÒy~ðöàõ3ÍŸÍ—‚R¯e¬'<{5Cì<1)á e´ÓšÝ8Dïƒ4
+*˜ âo¤¹Ëµlvm-ëÂj'§:×lþw¤†)hfÇÑ –DOU[4ècœÐ ÐŒÚA3 çÔhD˜ ’4K¹’´®­'WXm4ç$yÁ:·çgž¿<_b™¾ÂþõÁ\§1SÁEû²éÀ÷Ô£%À¢±#¡ºF£ yÒ0T9ÒM`L‘nE)ÂJJì}ÐL@oÉ…ë†ÂY¥5Èrfˆ¡Km¹pzœšGÏÙhþ¡±R’ c‚åxitGÁÇȇ®1€ɉnØèF=¿‹“Ô%ãLÄ,Æ‘t÷ F£[vºdOb×ز-M7Vº»Ê.ÇyÔþïy|²“à5*Á7™ëqÌò>QͧbGÒ…FÀ£2ÅÙ
+ÒBR V)h–²Twœ–eƒGÂC¢-ŠtÒèKn$ˆ©¼3@ÊEçrÎ…qb×!0¤c¢8yíåuYc§D{ïˆÁF?y®"}Êú0•SΪQè1Ú‰AX­'n™ÁS â|‡j<²ƒX¨FZ”¡¼ëˆS·ˆ®-Y^õº_––ƒQ±«Å{@<száääT4¡–­®©'UXìÉoŽIÞŠ÷»TæÙóÌñïãÞ+ä
+¢ã„ë=àê é•W(Þ‡®ž„Ê%N«8D­X¨Q6!Ù7UM&š>`>ð
+0ì“à1aX9¬aÌÚ`)7„‚5ŸQº+­:.&æ˜tFËAi;Dc=>[êòºœ‡aÃç4]ÇØ€Nnj„Z¬,:N&‘4¨†Lc5åLªÃŠµ¾Â0&:Ê¿+†«‹†ºrÌF 0´åi”!7ŒF·Üɞî±g[Úî¼t/%«5š]¦ËJ÷<>ñ9p)ØNè¸,ÆßL0ô1)
+þÑo¡2KFŒ ÚN¸Ç’Ñ[
+æ3¡Id¡"’÷.UsÚ5ÕÜK{•£îU!²;Þ€ í´IÊ ª6¼ ÂÂVšw—Ý¥8о1 ’v
+h÷zp‘w©š¦®©&SÚ«)ï^uZªçÛäm?ØϤþNHí]G€i:×™kÚÜXj/+‚º‡Zf& V£h b¢?JÔÉÄdÑÉ`ç‚”Ï-6?æ°©L!÷NAf­­á
+ ÈšA/ÙeP‰T@Ø” àD¯4D'©ÖÛîLÞnánCJHÕ tm’ßô
+^“‹R4QŸ>ÜÝad“z²Á¨Øêc[»‹®t¸z8=<+ÇÆ&¡O .òÙYÇ¢16Ÿæä³dlFU2)ð‘X>Kd]bVæí, ÒK‡Êí,9omû!’m ¬'ÉR*$ Uõ yb²$ Ïê±q÷_B9Ì<²€qñÌøYWa“¦•°‰Â9S½-¾a‰É3@À’4j'ã¬PÎPIG—kIëÚZr…ÕNBó®1Õ"Øá3Ïûgž?žÅ›‘Rǽpïf‚ò™-™RuíÄÖ3FõÝ×Û|Ê›+|4õ N²Kõ€Võ Ø ˆç2o'‚¹ÒljÂ\ëÝ–é\ííÄÉ\ߥ#5ä<¶¢ù@;Ì„¾rð- —òl¸¹XÎÒI²…RŠk17ˆ·äÁ–D¡°¥{bºÓ}ììõPvyÞz=ò<>é™ðZÔ„š
+êüÞ•j“·Vsmrq ôŽžßA¡Úókµ ]8&~Y&Ê8Þz1H¯Œáoòf,¢hЬó»e¤.åw/ôòÈÐïåâ`¢r¾¼üÍ1ÓÏ_P CŒ¶Ô?¬
+æ¹ùõsÒÓ(8ï{rkünˆÒMäèªÚVë<M³Sçr&¸2¦ékÂ'æ¯/yÙXsâL©¹,u~ó(Myþ¯—ûëüÞ0ó’òaœ¾»ÍKÉ&'órÑžÇüqu?µ˜Ÿ¬y}ZD¥_óⴺΠb-Üȼnð,çÏ–éžzõ†>þÐd%ËzØðú°\òåövSÃ`³QsS}2Q³§vþ¶½7'%
+¡j_ÕýmGa6Š_—‹u][èòîöþ—EáIOâà¶ÙYm†ŽÑôo''ÝâÉýCn}–tE¢ jH ý¸>çæn±þ˜7Ë,ðþ~)Ç™£ ôhùÓ"+*%‹»ÉûÍ‚¿^,î.²Ð%€G¨Ç­á‘ˆsñWýc¹ãû·›í%o]³– ÞýÖøœ’­,Ÿèm5æ±î›xÃùlìîúŠwë}/دÅÃÙ>ožÎHàÇeN÷Ç,ô&7a¹ùº/#y1*Ÿ«ùÛ"++ËÅü~“'À«Îü¤ î>
+éóù5í•ïó—w¤òÓƒdï(ÿÿÈ:«ë«5º#<cÛá
+ÛhÌèÏlvÿ"Ó5`o¯÷ÞÔÁ t|­ÚyÁ¾4k½mXÇq°&N3ý/³TTRendstream
+endobj
+1214 0 obj <<
+/Type /Page
+/Contents 1215 0 R
+/Resources 1213 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+/Annots [ 1217 0 R ]
+>> endobj
+1217 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [363.397 171.746 375.352 180.159]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1216 0 obj <<
+/D [1214 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1014 0 obj <<
+/D [1214 0 R /XYZ 174.696 172.742 null]
+>> endobj
+1213 0 obj <<
+/Font << /F43 618 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1220 0 obj <<
+/Length 1779
+/Filter /FlateDecode
+>>
+stream
+xÚíZYo7~ׯXøIB†÷Ñ mÑZ¤Iõ–l+¶ÙRl5ÎÏï ¹<äݵ%£ÒlòÀ]çü8CîȼaðŸ7\(ê˜h¬bÔ{ל\NXs¤Ÿ'¼]"•¤–ã[‘$*q†r¥ûÖpÉ©³ª!ÖÔä»Ëõ k>5Y»¦¬‘Žíi’eYT7·“·Í;Öœõㄳæ׉T”qm%Z×>]Ö“’
+#}#ÑrËpFP­„×8ÅV*L1Î%DdFKga’Se!J0z)¼3Üqæ›üP¦€“Q+L5)<µÌI^„Á ·Æîꎥ¹©lƒ)©`²8PÍ$çg™¹Ú4•0M•sš×J e‚± ´Øf¨ÛTê4“¶ö4M§%"y] [–VÂ[´V0$ëv
+Ú4•ƒ—¤äMˆdM+Ù[&v ¬È-’YB²R“qÌe;.‘ʧ b^•1Ì’2„U
+ꑳ+† ª4|àoÀc¬þWåÓ/UK´ø9öÃ|òô…kàÖÎ?„…óÓ·ÓãÙ»ùËÉOóòIY '1™è}Ÿ*¤Š}4-W뻺"oaÕThëm¿&$º}ÝÞUC"kåR ”k8“àŸèž¹OÉb(pÄD Ô¦ü€ òûåwby¢tI™Rœ÷
+´ûeî(2EáðA/àÜêh÷ _v„G¦—¸q Ðɬ㽡ÄÇÅ¿ðFô ®чU AQ8Cø T½zblV3ˆJa ‘”²_O óÃz†
+3ª?íè©´¢È›iËÐlt«#î=J§åëMëÚÍÝ8Jf©fƒp¨^†…;—¶o @ÈñÖ¨ÜØ;¦c{|{lmÖ±=>¶ÇÇöøØ»¨c{|öëk‚Ï+g­GÓ”…
+Ú”1Îs-œÀiê5‡§ðÇBKíÁfùë}T@5Fð+ßGCÕ$ßG|x[/}Ø^J
+©öÑq[4C­jƒ#íà.xdŠÍ^ØäÌ÷w©éÀ8‰L©Km9¨ýMj ÚLQ6 gà\ê“H‡5X[®(=£šÀ$T1¡$$%‡h*ÈÅ}P]ômÎAœcwG@ƒÚÁµ3û¨X¢ÁR®ƒÊ©(7n?>¢
+endobj
+1219 0 obj <<
+/Type /Page
+/Contents 1220 0 R
+/Resources 1218 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+/Annots [ 1223 0 R ]
+>> endobj
+1223 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [415.227 183.059 427.182 191.472]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-beta) >>
+>> endobj
+1221 0 obj <<
+/D [1219 0 R /XYZ 124.802 740.998 null]
+>> endobj
+843 0 obj <<
+/D [1219 0 R /XYZ 191.503 495.388 null]
+>> endobj
+1222 0 obj <<
+/D [1219 0 R /XYZ 209.083 184.055 null]
+>> endobj
+1218 0 obj <<
+/Font << /F8 453 0 R /F43 618 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1226 0 obj <<
+/Length 8425
+/Filter /FlateDecode
+>>
+stream
+xÚí]Y[Éu~ï_Aè% 2µ/ òñ–žÑ›m½PRZݲšŠdÿú|ßwê^Þn²9˜‰á g0ÓdÝZN:û9·èWÿú•iÓ\XÕä6½·Õå»3·zƒG¿9ó£KLqS=¿y¸žž®1QwåX_ʦÕôp‚ƒ‰¦^kRÙõO«éaˆqƒ¿Ño4ÇÔì°jŒšu“WŸÎ~¿ú£[]áñoñßgÞ­þãló&öVêj]¦§ëêݲջº ¾´´º9û~L´ŽeÓC™ã&ŸãÓ£Ö€ÀÞ¢÷ÍÙÛ³oÎ Êo¸ßýæ ]ò¦øÖ#z{·qÙçĹ—í`Ô’99Î%u×Ú“­ó\ñ56þKi¶ÁnóØnËì›CÝÔä;Fƺ)¹„øTã4­aØ×®øởz5£”Ÿnïb_”\CÁäÜnËÆ›Eã÷ÇÏÕf÷øõ&áû¾éÕ¹Œõnü }zN*ÿæÕÙ?þº­ðµÄÕ«×êùêê÷Ïy÷ñ…~q³}ñÇW¿=ûÕ«=ç9öS¬ •|zrY{þ5«^<^m ].†åCÿÂ&Ù!~Íbw‹iäb­\Á²9>½–uøšÅ>?^l ]¬–ú&¦ò…Õ¬Ã׬öéz÷öñ‚côbÁP@º±<½ :¤¯Yð͇íöÅÚ?¿}¼ê˜b±*éøKDÊç_E¢÷oϯÎÐFïƒÇJ(±?µœ=ÿ*œ>^j=Æî‡N‚2•M-=ãQß„ZÀ’s[‚Æñ¼Û\ÝWÅoºO¡¯BØTç[YÕº‰ÐByuy‘Ò Á#4qqS\†ŠòÎCs@D¬ö:dßv)êõ=,ûÕ¶qÝù¸˜®GHý~^¬)ñU
+ž*ÚåÄXH¦‰#t×CJì¨4
+@ØܨÚ@ØŠ;x¨öàÂb·X¨”¨ÈÔtyæa!•¼D
+;FazÌ…¥!ùc}°">†SX@F›)¶Tà/šöÆξP:—°½ýl܉­-VåŽk€Áty¶Ž¶K ŒdM;@ ùÐ/6:7C3BæÆió\{Ü.Öœ`mNóŽœçCþtà?‹ÿžÈÎClW{:=ü«bÒë1v?t&f¡txî2 kj¡:€Ù¿Jð= U°Éì!Þ#Cé°ûŽ·x§MoJ†ÿÀ}%œ7¬ú\á Ü8ñOØ7ÐIR§´o[Û,ašem ååBkÁB½9€Y Xúí¾eÚÝÏÑFÇ#û€Å¦‰@bÚ/r„Jdðl‰¤L2`ƒàZrÝÏ{›@wcÿsÓ„Ÿyš ‡‹µ–gxÆ)Ì?>'“§Óû{>=ãÎá=ÊÜ;çßóy&„ý¦wZߟN'ûw|²ß+`´w°(fª)ËZÚý†Þô¬|IS_Xý¸Þœ+E¬$ãävÿ¸n÷÷{_4:¬Ð[aRΪè}#ˆ©æD†mø§VaÓ^Åõp~A.™å?UËEF¶;VaIOŽŒÇ´ah³€if
+ ç}Ó¥Ênj,º5f ÑbªŽÍ0*û`I¦u›K ÐÇÃ1_l`ß4m”,?7²òHNë<[î4fËbÑ ú,¹ˆ†fàrba@Ch²·ç}ÎMhØXôš0¶ŸiB샧ØÃ5ŸÒøƒÓ4!}:æŸÅ1ÚV§ƒÿYü—Œ° ü HਵƒG
+b5„CR„Ê7š¤
+-ûD>SLb#ã1  ÚBgy…äº
+ˆ.Sw@þp¤€€„UXüLá=œ¤¤¾è$S…¤€CÁyûŠÝ {õÌöqç &W(-¨~¨Ôƃca
+dXZ¥@>
+P'£G£R:žà ½Ž @2HÏRL)ÔǶ ÀÌ!C
+‘9 $qÐÀZLð1¹T;
+: ל¼@ØnÆS<è‹„³è«A!4’JÇYƒÐ|&_L 7 ¹±ãr ‰ã:+ž,™¨Ø ~Л… Aá$ž
+XAÖ*Ó@0Þy•My°j jX-¥-ªÒª2—U|rÑSJwZŸ ÒŒQà e° ìÙ3<†­HwiÜX ˜$ÕAÜg0ÂæB „²¥…¸³&˃o8I~¬W€š®z7Y)@!ap†Y#E2Ä/ć$QoÌÇ7Š~¨ix‡hR¥C R@ŸJvûxÓ¥[ÍÇÊ„X¡]ד”jbÀ GÓÁÔà!*3_•%ß‚³à|ž*…| $Bg+N‡}E–êDÀˆœ€KaêMqÊ£QŒ’_øŽ‡‡Nc™$HåË̱1§•ø7ؒঔøò_n*a¼’¡"9ÇÊè" ä
+Ĺ•¬Ø°Õ$¹Ã” iĬI
+/1®ÈX
+EñŸ²µ@L:²6­P\ñ*OÊW²¤¦R›V„n³w8 ›À-)]3kå„g(†ÌÁÔ^i '¶À—(°X`XŠÈïɱr1Sj  p0*¦.]•¬ð<UØd…½ó…+Ïm󠊵,»g謙•Æ£Þe§¹[r*Ôⵆã>7{U€Æ£w–n…Á ™HŒ…=ùJAËaWâ=Pàè5_ô Ä
+õÒŸ²Ç0 žÇþÊÈ€¦Þ„×e k•c½–ŽÔEìÕ‚¤*÷ç® Aþ07<+×
+4·"‡MŠžm1uÇTl¥EªÀ6[a•°ˆ”nGïz<‰ŒÞJIãÕ’®—Ÿ†/¶gà æ„Um2³L´¬”ô!°=²1±Ü"kLáùÜ¢x€Is¨ë$†wå{;zÕ„ôÉQ4[=0ãšMT*ÔE„;’׃àq°ß¼6Èj½f.[a¸XÛc⤡ˆ %b›†Râ”Ô<âµ@›T/­$ÙJÂu
+Ê/SQÇæ huë'ó“yºŽæ9;ÂŒèEmPúÌ{Ëñ¹M;näÍ5T ø‚‰Iy¨¢ ¶ù± •ÙFín4$
+ŠßuÚø0_àeeæÜ3msòƒdÑ
+Óê9ä¯@ÍÂU®¢ýAËUÈĪRí.dÖõÈâ-âTáÏV†/Tä[ØÙS™/ ÙÜ›\¿ÄŒ† u.²D˜X.‹qa“Ñ×
+h= Ċ
+NŠŽI¯š»A T¢ŸìHÙmÖëóàålÀæ­‘ê\/²bJÊ,PèµhÌXv †çÁâzÃ-)0
+‚Þc
+&D¡·Þ`J© h/]i28 >Z½×Ôá|7´2’`È®T*i°Ér*ÛpUàý9C q@âT{ÍБôh¼1ŽÓÉZš§×mp…L¹HJYvX™ys¼£¢znżT†?‹¾LÎ¥®0üä1¦Š“Ú¼‘ˆC…¦ñ›¢!Œ
+¢Ðgñ©2•‘añ²óÔtyöýY"Ö^ µ@ceH..l{ Ì.ónž|¡Àä;>ç²#®„œ/ÑO]K¿ÖŠÃâÊà·dm°»²WÜr_ëNñÂS¼ð/<Å OñÂS¼ð/<Å OñÂS¼ð/<Å OñÂS¼ð/<Å OñÂS¼ð/ü?ÂÊÐ7@Æãûõôb
+ƒ)ܬ£
+B¼ÙÛ ª…P&Êę̀'Ä">r0ÃÁÛ•>Ä$hjÂdøÂ-'¬ÿäX?¼tbzÕˆº¾VTÆ×qAk£iè2vVßNWú0ZDÇ1ÐÍãRŸÃ¾è €{g¬Ž[tŽo¸“±ãäx¹PÔY0^
+Í…–Ç%Bl/pÁ±ôízx²3Zi@Æ¡«ãEJo¡ ¡Ð
+ z„3Ø)v(¨hˆÀÔ³› :•8Ãd>T£­sœ½ï.lýñgÿþìO q7iGõ ƒAì‡M]™Ú"g@œVS£¥ÊœŠŸG‰3ׇl=vÅï÷tðU«XíJTº[1 ߌg`¸TX-N×i€ðƒ gKšˆœ×ôè~äÍ>^2„¯ˆÖìš/f‘ÄL 8AMÀh/ÚdÙ¯KMÝ8ÄÍón;¯{G‚WÜ'ó¦;(š¼ÁSSÉÑV‚ÄFòª’–t1ö.UÍ6ŽQ~W`UksÎ^ud IC3ÙRF)ÝJÝ#Fãµ¹N¶›Ö &1¨ ~Œfì+›º^t ŠôÈUcät,I¡o°«`ÆGÛ1ÄY–?IÍ ·¢Âàd·hAw£³°éi`a|nŒÚk‚L–©v³U;®QW¼ªÒVGûòÑ­*'Š8QÄ×J"î3wE\˜æ’`þQtqL) @˜è)3’ôn´væBSf~UHc0‰‰GFÐ]+Ö"É ¶2ˆqå6¥¨˜6¡iß‚:¢3©ÌZrIq*Ý—Í[~²¥Ý ‹ŽWåñjdæLà°IÃÓG.Ìš¾Ê¢»IàƒÖ™Œ’¯Ä¯ZBJ´dÝÿá˜uãÝÇ€:Qa)G'GÀ|Šs5Žµ©ö¬ÞDwŒá]µá1Ìࢹnm 
+Go6)‡b OB*Sq‰CŠä@` U‰MAéeꞦœNóaÚ¶.‡c^ÇÑ›(ip1±[´9eâ„ÜZÉÿÊ…E{ñX·Åñ5&E"#«:/:x’¶ŒRlÇN{¼Çy¢ƒÑóD'ÊøŸÞ=ÑȉFŽ¾*úUæ ųH‰
+Ø‹ñ«¬™Ë½5óèVS˜ã' sì/ùXJ
+Ldiek]¤.aŽsåè´x³yámHkðvMŸÂ¼Hâ#a7Lu9Öƒ£"LžY‹,gžÕ\±p
+ Ÿ¸±Ä¼R!n¥“+ß•)SicaÓ4¿Vät£7 RfÞS<¥u»xˆ¥#^y6xÑôk)s$ 8#*¼µše±6A)´@.V[c1óv.±ÌZ‰ò:K®&΄î´Û^•±Sà‚LåysµîÖ
+XX©‚Ž™5suü®ùC¥1jTôŒ*?„ñ
+l³DÁ¢]ðem^µSX')!^XìGý,¬'¤FØè²4ÎF­a5²,ôÕȬ<,l€XQ$‰ò;£¥Y”ê\Cn3²'aB9˜5’«ôÓ°^%©<+›³êè™{T5ƒg1kWJžf‚7ÑèUÛͲ·uR¼M÷˲ä:‰+q.QÈÔU#]‘9ðD·Ø™gQµgàQâ¾é°‘{ñÖ¤1Ѥ ¯jØjVúÊ€RŠÅ$Uœ¯0E¯¢VŠi+E%)*ÔáûEV¬8ÖÀ¨H܆z°tÛé—ôÓ,±ã].CÂ+ËÉ3Ah,"¬Z²Ê¹ &ï‹áº°Ò˜)Mï -…U Ì°æÅ°°Ššõ½m2 £±Ë x,¼±ŸÔoÇ ;Ù>~·¼‘Æž.|Ó•Ù1œì¨“u²£NvÔÉŽ:ÙQ';êdGý í(z
+5‚Ì›…§ßh
+£•Î3¦êûT rÐ[¡:FÄkk~®Y™~ôyüæóïWÛïšÁb =1Ýb‡}òíÅe òV?|úé›»Ïü»9ÿƒËî?ž?ÃGÿÏŒSòg¥;7¹ñ«›þ½~¯ï›‹yäÅáÈü¥‘—óÈK|±Ÿ?{}ͦ››íÿ²ÏîÃG~ܲӳ—º]òÏÝÍ݇©÷‡y :kú÷×—;þýøA _¢7ÿ~`ï7·ÝÞþ9àja|~¹ÿg¯5èüÝá$ÚØG_>ìüéúJ
+ÈÆAO]HþÃ<XG®à2ÁGã¨çýFãÀe òà.ߊìÿ .tòu\ÆOƒÓ– ç´Ïó¡
+}~þv®mŠþzŽ;~zˆð×BÜåÍvÿŸ÷œ÷y÷#ŠGþ·)‚lÓ´¥M~Z&<ÀÑ/¿Ñ>?o®.¦Ù.vzôÙÈå—zþÑjkmw‹ŸÕî­}[Pa¾+_Ý}²ïÛ1· #Lôïk|@-÷:pþ¢6ü")‹Aßš,¹ûtpdóo/ â+™zt:ÀýÅÍÓ×èÐrÍ(É$Á‘sZ"å1Eßî)Ú$ã¤Bæc<¦´¯Ðù§oÕéöŸ':j\Ú¸?䟫¥ª:— xchüWi‚W ÈÛñôñR›÷¿8`íÁñƯo>é®vo§Õó»wŒ‚›kÁ
+Óœ¸²Ucß/ËÊþ´ŒÖ{Eð0þ²\§Q¾qs.soSsÚç„ãÓhÙM«¾?ßááÛÑ l„jÀ¾~A¼l÷ÝÅÝ,'é*·e|«Øbw:º÷{w 9……v÷`F j9ååùGZ|¡y[Ÿ~À2oñ?ãîk®zk>ñ )„_î0OÎênsíîíÁù‡yÊé™Æ»iåÝn _*– ]&î-<'@wü(Ôm'ºÑ¦p^s¾aÐÝÛt3$w¯¹r~níWÜÇœ—¬Ø~ø ˜ÚåG­~»ø2¦{ÏöÝÛ{ 6ôŠ®Çî9õøøé-çý³ÿ4ˆŽtúÛOÓÄÛÅæï8þf€ÿz·ýpd§(1äçïΉ»Ò‘ó x œo]Ï­ßåÝíýöO··—Ûaäð¡‘/¡`Ãõ½ý½½ÛÙ‡÷ç|!fùw Ó!$և܄‘¸ ]âù?ìŽìïÝŸƒK»f,$<ñ¿8a˜{˘éßw£íÞþ’7V»¾à.¶ödwgï·cNÍ8ž³/çŒæþü~æz2zÊÕwç—ñ­u¢7Ç¿Ó3.ðyÂÅЕÖñÂèâèÎEâ\ðõŸùÿ[(Òã8|¸bþ½¦˜»½ÜÉaƒÎCý 1-`
+endobj
+1225 0 obj <<
+/Type /Page
+/Contents 1226 0 R
+/Resources 1224 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+>> endobj
+1227 0 obj <<
+/D [1225 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1228 0 obj <<
+/D [1225 0 R /XYZ 173.03 180.947 null]
+>> endobj
+1224 0 obj <<
+/Font << /F8 453 0 R /F8 453 0 R /F43 618 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1231 0 obj <<
+/Length 2717
+/Filter /FlateDecode
+>>
+stream
+xÚÍYÛnäÆ}߯ì‡Ì
+~Ü‹Ž^Ò2þ*ˆ`ó¸ˆô"÷ù¤mNÒQTå£,ìÞå>nó>j¬&ï…w&¾þfù¹ÆÙøºZ(â„%âÜEÇŠ|©ÑR'Øû¦ä§{4å~«è#
+îwdM¹ù]Ï27Û¼.qü¥knZþ€^ ü!NY¡õҮ¨˜ôA(“ÿçBq#`“üRlw&Ï7_×¼D*³ù©$åú8xËëugPß³ú¸Q˜Î[!­†3‰^
+º¸#æê…ŒÈJ¹ó~eoÖ
+åÔó§²s™À5¦®’Ì]•]<¤2SmËú
+Ý[ˆ‘Lf¤Oªq²b€‘’ß<ÍA%®G㘕é±4¡Þ¾ï
+EÊY±‡ªæY!‚>:.žkˆÂÈØÌá®E⇠Cêý‡7¸
+훶-»8}@~~ÇŸ݉k±çâ=eŠ—8÷¸pÜÐn°Â,5-ùWN¦DÄZ;=//™Pf16p€XŒ txS[ÄPêæ2‰^7tÞ)„ D!„PW$#½ôNÓÆ©ö®8× Ù;~Ò ôŽ#Þ!çÙï@æ¥S Mv 4*ó‰aœ€3(à°pšRlráÅF8—¬»ØOÂA;:ÎÂA9Ÿ`¹+—ž‹•êõÝ=ñ#zIðcAƒçn ÕÁ±—Áè,œùÍ}yâwÇHË1¿ásŸR¤6àÝ V’·jD˜Xöy ýdl$øZqrwj%AóxÑE¯np†~8to3Λ(sÛPhPû§T6`*—]uz8–óEÊéì(|sîiáeiq(/=»£±åò¬¹Ã3«þ5¤¡óÆz
+r 'µÒ$ˆÁ9²í9â… ä.§°ô5¯>Cà!Õþå|*Ûj¿ÂÝ-”>òe,±>Ÿ|û•D‘‹l`›ËD1æ8×z¤,GAF¿(RÙ«eÆ#CŒŸbM®Ṥ̱̂*ƒˆõÿó]9ºI¨Æú¬6åjôgÖh{p« ù˜Y(Ý6Hœ(­ìfFlKNúüò¢[ð|Ÿ@¢ª»)qz·†Å€{^-]ƒê•âíÍr—XH˜±áÅe—¨(;á-t’0tˆ¹C„d™›\FtpYêÐ`‹á®ä¡§ûtÜÔ% ܡʘùÕeÑòhßuÇ›?±H‡aÂ!.®+jz xÃãÌÂý…AiLÎ-®p·’0Ø )g%v‡>˜áŒV‘Ž‘o†´¬¥ßteÏ£UÍ_Qú‚LÇ®,¼~¶ù¤€Í{9
+èæJ ‹_N2ÉàBeš kðgႳzLZ#܇µ]­GaüÔ`JD¤œ¡)"ƒ
+˜uCx¿JÓsïbçwS’‰ð[@Q›ÌmY*–aðÇIM%¥&¸r•íÝœ¼ãÀ¬¤ F7iŠ\`óC{ñ«Ç‡Y­Íµ$3ÀÓ•¤äƒÐÒ|&'}6%a'þKIEÕ®d$ü½3M÷¼j‰VuDá–± dľ<'«/¢:³ó’<`b0d!C¹šˆ¤ðÚ¼"½d;ŸHEʘi*Í
+¾ ©Z~:Ü‹+ÓoyZè|ž’€÷·cÀrËW»›˜‰|>f"lŸ~–ÓHåD.ý…[<›Œ gš|úÛ¥ÖLí桨¸lÁîÈpÀªpüë± £D~ñf=üvÒcn’—”kô]?s]»Îf³lÖ{Îä*eµ–rk2_Ä„0ã«q>Êb¸TÁ—Áø0­P$ªñ@¨§Æøë”FŠÌØ5 Ñ|HŒóq•q_a
+Ê\À‡r&)Ûñµpù÷Õ`SÛi&ÞÔqyŒeJP‹—Þ'ÐÀÑÅÙ(PuQ*5ê
+æ=Ü«]ÔwºÙ"&ÄŸŒm,ýRq‚Ôr*œ6Ñ1ø#ÙV›k\Žôü?$¿ù kÎ.X3¼­¢ÔÈš³ t‚ Èôãujö.Ñhø¥ZÈXÏk~ $É êo£þ[L’’yÅ(Y-r?E%¿D `z1·tAäÊÍQéß
+endobj
+1230 0 obj <<
+/Type /Page
+/Contents 1231 0 R
+/Resources 1229 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1208 0 R
+>> endobj
+1232 0 obj <<
+/D [1230 0 R /XYZ 124.802 740.998 null]
+>> endobj
+325 0 obj <<
+/D [1230 0 R /XYZ 124.802 716.092 null]
+>> endobj
+329 0 obj <<
+/D [1230 0 R /XYZ 124.802 696.263 null]
+>> endobj
+333 0 obj <<
+/D [1230 0 R /XYZ 124.802 626.075 null]
+>> endobj
+1229 0 obj <<
+/Font << /F36 457 0 R /F36 457 0 R /F8 453 0 R /F23 440 0 R /F32 450 0 R /F39 504 0 R /F37 462 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1235 0 obj <<
+/Length 3446
+/Filter /FlateDecode
+>>
+stream
+xÚÍZKsã6¾ûW¨’ µ5Â/L.I¶2›ä0Ù­ñž’Ô-Ñ6YôPR<Njÿûö
+«k¢ñYàÁ@2$Nj=••U6«^ÝLÎë´P*Þ €teö%¯úˆÄé¼imŠl ËCÅd°e¸®šîi;á4OÍÆßO÷¶’e)´õ#žìëÃH„;³…ÈU<ÊÓ=3Ÿ…G; œø%¦Þã§É`c“‹RäVQ–s+í*”Ç@R‚4ÓjH!Ü= «#«ªf®øú¥—"/ãQ "|¨»ýÌ•)-dZ¼gǹÍa5($U±2Ùxi„4Åàòtž]/½ÎZ¸žR±¨¡ÊyR9há;åë’Ù¬åp åK-ÇŒáN½È\¼šòæ&[s龬PR%%%ÅhI ×Mu@‰P%^kbá…É‹‘Ô=—µM°9s&¢çëËX
+^%³ðöx2&QÄŒ·2ÿ šÑÔW9õøÃ̸ü1\P/\¾…c,-€À9‡mEaäË61‹¤ÛÀ0ÆäÙ¦Æø\ßd1c„+åŸÍ³‘{—RbØ Ð¢PÓºeS!BÞ%Ÿ¨,a
+º¸ n9…q3üLeå ÒÇÞ›Ÿç$…E–£-„Ín‚!:ÃœáÐÂ$:Òƒ®m¯€;XΊƒT¹P¥ kïí™_ÌT›·ö¤ÙsÄÀ““ƒˆÉ©,A™ÛXéBT"‰>ˆ†Ò­r•«@†¾CDGx‰Mv$ÈõuµÝÒü»¹¸Ã §UIS&€Á,Ó-†c
+ì†`F˜øX‘;N¼‡É¾iñþžV8KÇ«ZBpÒ‡–Ìë(0¥½†ù¦÷lð=ZÇÍÉÍìðfpw,{à~–ha8û€ÞÓi+Þ½UÙæ
+*;¢Ϫ}Ë#£ÝÕ
+
+zð*z_•Â6¦2û
+pÙÐzá7åy”äy¨µ?ñé¸>$[ed¯‘5ØØbbŠ«¿.mz[q –jCoû¬#L»Åß”3Aª Ajq64-(ß„#ÃÚØÈn¸oKá+"ïÕvØNUQBPcˆºøˆ× «¦ˆdÑ'XX ÃÎBŒâgЬÐ:¾d/^a0 :À)»6°€®bûÐ@ ©'ïêw˜$ ˆÑCQêtïèná.ѶïX`¡É’"QxÔy#ǻía[JâÙû$ÈÇ¥_ ãé¾Ç?DŸ™Ã@Do‚îÃïLXQ•£´q¦$÷ì[ŒS˜­BÆé“•ñןgæÂ4†ÎeÔòÐŒ
+æAô­&æ9HnCs´2lÛ¢•Á~Y= GÃý¯£)¼ ^¶â¢kñÈÓŸT¡Dá—]²P»Ô Æa[ŸEߢ0j6ç©%½ô¿èµç\Ê“1Âǧ=•9—õ4ÿ>‹ò©´ÿôã £]ï„°ç$½á!O‘Ù³)Fp%ÖÉeÅO<¥³e
+J‚ü–±c~³çˆ–Rb'
+…$!þ
+ƘÜncÝl
+!_6Ûú³Iöà½T
+Ê.®ø3²Èu4§€a±øâSÖ*2_¨S¿oš›‹›þ'ÄpØ ‹¯[!¶^Ä'ÛfW¯1uŒ“ÞáèOf9»ñ3Ëkrºd4ÁJ̤5µ^û3xÝÔû˯íŽQ?èæ£NÜ`z)Ã1§@h=浦Þkú|6^
+ðú³Ï÷…le.ÇåRÚSÒÒ•BÓïDÿÓ·äšendstream
+endobj
+1234 0 obj <<
+/Type /Page
+/Contents 1235 0 R
+/Resources 1233 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+>> endobj
+1236 0 obj <<
+/D [1234 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1233 0 obj <<
+/Font << /F23 440 0 R /F39 504 0 R /F32 450 0 R /F8 453 0 R /F11 615 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1240 0 obj <<
+/Length 2043
+/Filter /FlateDecode
+>>
+stream
+xÚµXYÜ6~÷¯̾¨iFIì:›I²@#;oN`Ð’zF‰FjHj'¿~ë u´Ô¶±‰Ñ@‹"‹¥:¿*R^…ð“W2Ò" £«D‡"ËÒ«üñExuKß¿ŽDi%‰o‹{¿
+‘ÆÒ¼º{ñÕ­J®2‘Åêêî@¤wÅ› Rìö2ˆàOš0øïÐídPÚGœ¬+üopÅn¯RämÓÃÔÐò¡ív¿Ýýç«ÛtÎy/S¡ÒŒøÿØìö‘1AÛžMÇ3C‹Ï8xWðž«™ _<E¾‹ÒàÁVŽÕð0‘´°¦~/sä<ô7ÈLmãÖû‡öÔuÁ[O½›ÿU*ÝÓXí&uAÛ²¸fâ÷øY–¸¯Z´Bï>z@¥IQ)2“¢£Tq0~Z
+Fd¬l­#Ü=”ÏHš2©møe22éèÛv˜™‰ž*øì–Ž]‹®²è“¹
+”ÝdJ†hƒ(mgËaî¥ô¦éS-dª?Nƈ82 ËÇè 0®ë…ùa1ÂP"¢ž&ó¡b‡Î-™P¨8µ ÓãBwï(~ùž ®íl„<ç'#\ í¥ÝÂÙ"™§L¢„1 ŒH³x¼Êï«ö„Š ¹÷ µGËQõ€ýÎ2<†PymûžwDjæÓDŠ/Üá8ªhZW"M¼¾]oO…I|vT+yb‘…£§'¼Eq0½í0Íg/NÚu´ÄäŸt<^MZÏ…ˆ ‹Ì'tЇԠá¸UP@ÂIÞ©È1 Ã\¡¡ZÂÈMº7á–#ÄuÄ5C‡L ½àKsè¸{¨¤“ÌóKåÀ; ƒ“G<C\;À"+ÑMu·À⦧Ÿ7X]’tV•W.ñX̉%ŠÎ{íÉíDíÀ}:ñ ʲaZ?•-Oœd±(•f†'‰&5(êçâðéòLjù½›ë…€"þÀSÁªŸpBxäÏ[ÇÆ2=À~…Š  Z‡u+6Îô Z&¦&ÈmÃÛ|•^+íEÁ؄埖4ãš×;¸<r¬€ß@;jY’
+%>¨:Äž_ ½CΆ”PR´^4?”Œš: ±•· Øã]çíлOS•æXªe¼ã„‹.Ïk•®2…\Ì|¾^*ª
+FJ9"&áåªJB„ £¨¡Ð"Œþz¡,Ê@B'V¿þt@ݪ¼Œsò¶k(t¼0+ÒZWI«—ßHŽèZÚ-Ž­hÞ¾Ä7Mooªßöû²)Æmùs^—TŸ9ùgá€böë’A´r³bhW1þÍy
+ñ©ò〧f,ŠŸW82á‚ý¢sÓF É ¤š/TC‘J3«!(IÁ’Ùš$jùmÂbŒñ,Þª&РJí[Ù¢³OÅŽVÑ—*&se–É…
+ødD=pðûž•ñ Æ´]ôì ±–CBx|±ºùŸ‰¢r±¾t¦>pQ8è 5Â©Ó (r
+wÀß:XƱHãÍ&Á¸&á_51+1ªÌÓÙ5ž?ÌóÕ'š†odz?Ý‹ì•IW-?ÎfG?˜´5HB]õàf._•¡1 gÔ7éüœcÇá¸Ú'<rä»(Jª®_G‘»Wƒ…-Çöt B§òEÞ8´7¿¡®éhlïËÞ{ef±ýÏNQ`Ûw¿¯1f쥹½¡PD)Âðb±ƒvL¦³›­²ìZÅ
+endobj
+1239 0 obj <<
+/Type /Page
+/Contents 1240 0 R
+/Resources 1238 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+/Annots [ 1242 0 R ]
+>> endobj
+1242 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [384.633 605.105 399.356 615.953]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.28) >>
+>> endobj
+1241 0 obj <<
+/D [1239 0 R /XYZ 124.802 740.998 null]
+>> endobj
+337 0 obj <<
+/D [1239 0 R /XYZ 124.802 716.092 null]
+>> endobj
+341 0 obj <<
+/D [1239 0 R /XYZ 124.802 592.16 null]
+>> endobj
+345 0 obj <<
+/D [1239 0 R /XYZ 124.802 454.78 null]
+>> endobj
+349 0 obj <<
+/D [1239 0 R /XYZ 124.802 269.911 null]
+>> endobj
+1238 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F23 440 0 R /F32 450 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1245 0 obj <<
+/Length 2112
+/Filter /FlateDecode
+>>
+stream
+xÚíZ_Û¸÷§0îIbž(‘™¢·Esè½mývw´–¼V*K©$w»ßþæ)K–ö’I³-Œ +j8r†?ÎŒ<”ëþɵŒ”0a´NU(¬5ëýi® ëÇ•t,±ŠE*ñm¡së{¡!Lb‘çn·úþMœ®­°I¼Þˆu—ÿ!Åf+ƒþH?äyÙ#¡lê¬Úlc£‚ùÞ÷ðÞm~Ýýôý3–²•FÄÆ’¬€=Lƒ}•u(¡s¯ØÎj|I‚c¶‰Lð/üSp·ãm6[ o¹þ¾ÀfΣg ñ6N® ȸßDipdQ§ìƒ`CbzÇ»gñ9\oWž>TE º«X;œìˆ½´·4ÐgØ¢Ú¤ªV'¤êh)XH=cƒsW0%«*¦ôG¢„ :Xé$ƒ_B©°¿È™_³¹ã‘½¥Q"2±Û»SÑo¢(Èšû÷³$R9FÐ^‚·µÓf.ëM«£É[¿Š®/‘åa¾b´À6ŠRalê ¡ÙGÚ-¡gh܃¹Sš
+^È(¼—ZeÇTX8íHÅP‰$MÜÊK‡¹(s•HÇpt¢K,Lê5ÿÓ|¸ú"~f·T(i]ïØ
+©QÐÔ…}à'c™ùA£¾hqy‰h à‘¼:Ý%ëÜÉj&§j¦%L¤Bjãve×ÅlÛÀeF*rcÇŒ¸XyéÔ>4h£ªA=½Ó©^£àÕŸw_ª„5ð0¼œ{Ûk¯+µP´‚ÁÛÚ¹·Í 0¥Ž4)ñ·¦éßÞ¿÷K¨Ãî|8À
+ÊswwDùG2Á}b&P:AewwGhÄëké “'
+s+­àóGÜëÉ™TJQ„Â'Íd|6á8¨4ø”Œk¥ "A“£òôØÓ
+O´`‡ >_©éF}b8×:ql¾nº’>›®‘Øt!]a·cÀí8³`{1ÛTàgç·öDg¤/½[C—%ɧ OMÌ1í ½k>ÅCŽÞqÜÓ¡,x?Ó„<Ùتy !Øæ¼[÷ΉñÎÜpùcë7èúCf‹þ L6þœIÝçÌ[™ÿžÁà ë/öi׺̕úžý¶áO›¿ ›ïÁ˜c1ߥ(©V¿¿ÉúósÒP.å6°° µ’ !M/É—LF¹¹D ܨÉKÂçÀÓ JÈZ÷IßâçG¨ôúù‡\ÜÐ'–ÝÄj•ó«÷½|îS´Uò <^ü8YÅÆá
+>êU!`ŽÇáû:ãÍé„Èv.yžÿ¹ÓKA3-[øÞvþâ’ùw6L¯…sn¹ø ]ŸL–uq-½phyè?W?ÿ®sþÓ
+Ü”5ëGh‡BZ»>­b!ÑqÑ[µúûê¯Ðc?2{Õì³êzr<é˜Ü|dòú|*Zˆï׺§ððõgo>øoâ)T0hò&27¤¼¤|ÈÊv6·ZÙo‡€A¢í (/
+(]ß–õÃ’êòÛ!‚ŽŒn@yQ@Ù7UÓ~­Éíçº Ùõ (/
+(÷MSY}KRþòP5÷s¨|©Ù¿m>û¹N%ÖBãß7¬¼$¬|ÍŒö~þ€ò"3Ú[øyHy6¥5·OŸPþk)í§GŸÉoÍ€•P$q:)òîðç_%Cªu´]yñ•_|Ÿ—L¤ÿÚÌ„Š«S¾:I#¯~n§J–Â5þ7wd*Ç=ÈŽ;û£gj40×ÙË+\µv¡ÕÔ¾.jž+Tü{7úòäZøSø¤k“÷íy([7\SÙ&Ú:ƒS•ù%ôL¸ªuo\½„úæ%%¦#LÝÝZÉ û«ç®}x[clPNÍGÞlXPÅŠÛŒzF÷h¨ÈѸÒ+/¸Á?ÿû×£-Î{°‰›øàªÈ[Öþv ÎǵYæ/¬\Ý[,5º{(9ž¨QjZ£jQŠ·YìÅ…)0£æ"x±Ñ¨ÊR}¸·Tº‹/¤×y|c ˆ™+Œv]¨y¨Pèœ/®Cª/që<æ;v]1Á;>ÐX­ÿîPVU‘‡õòO¹Ã±;’’ãc…¯&ðä &°c(-Âãä®$ß““2«­;9|½Ê^€¾/ý-B >÷ýÑ಻wŽí@;~òW 2®€EfZ[8ñŒànÒá}€–w’.u=W·J$¤{ébüL”ˆÍ8€šùÖÉyø”©q”Nèoѳ endstream
+endobj
+1244 0 obj <<
+/Type /Page
+/Contents 1245 0 R
+/Resources 1243 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+>> endobj
+1246 0 obj <<
+/D [1244 0 R /XYZ 124.802 740.998 null]
+>> endobj
+353 0 obj <<
+/D [1244 0 R /XYZ 124.802 716.092 null]
+>> endobj
+357 0 obj <<
+/D [1244 0 R /XYZ 124.802 454.658 null]
+>> endobj
+1243 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F38 464 0 R /F39 504 0 R /F23 440 0 R /F32 450 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1249 0 obj <<
+/Length 2612
+/Filter /FlateDecode
+>>
+stream
+xÚYYãÆ~Ÿ_!ø‰ìмÙtž’8Û€á;@Ø~àˆ”ÄEβ)k÷ßç«£yˆšuvQÕÕÕu~Ý wþ‡»0J|D»< ü¢0»ýù!Ø1õχPIâ$öózw&ŸÜ,¾É
+¢ùÛó÷ïã|WøEïžLú\ýê?ôŸBÏàO˜Þ÷õ¡¼´ããSlïÇ,ñÊöR[êÇÞ(û:‘׿ŽÔmúÎ>þþüÓ·ïÍ’ûShüؼÇ_ÛK’ÐCïTS›–£3b5~¬ ÙSA¯­„ú„vùˆ?º¬”¹
+bbZ$EÿÇ4#I1V“T8S’åÞó©±óf~³ vÓ¯OQ.‹I¤J×A>ýĬqP>\èiƇ۷¥¥E[¦IàýHd©·/;i¼€±ˆ“ÖJrmÀ•U³îÂ0ð³8SûØzüååc½Õ0¿¼Bg$ã­Îa>?Èr]§Ò¼„ÙbدQ]ã4%5÷,Ì;Læ1ì2¨Œ¬²,cý÷¤ú+û)ŠR?b=}ÊÛÌj¹9DQYž‡ºÞˆ '’H)&%bç8†5~ ¤sÆäÑdö´+7w '7ÀBœ©FŒ
+œ“=LæòKl&©íw$ÖÃ?žçØIüÂà'ƒtá*ôn£ ÚNXþ)ºŠmt½i½ß‚4ø†ôò Z!÷FôÎ}µùž›Qíf;§÷LøI9£Ü7Æh$ƒqDa¥cÛ {¤³ç©7\ÚúÏ¢ôC-q6”­î¸ E&‰p@9Õ!û—žIæ›XépÝ~äÒ‰µ—3Y1‚)Nå(­Q’¦ÞGgÖýhe¢”vhŽt¢Š"ñø¢OŸþ„{9#d~Ñ(g‡6!¦XE3ü.íKr‘¦;Rd€ú…Ž1J[ýÛ¯ؽm\Dò(»YD¹…²Í›«^–ˆ™sò£%•,Ÿ³æ&oëáÜLq1‘‚ò‹´­Ìþ(c/v\%. ݾ«% 6ùL"’dµÄå6É©œ%bß_«ÙÃiÅ6/­ž¹dì…rÙ4Aš#Ëe·–sù‘—‘÷j" ÔŠ’3e#!Î3œÄ¢ÙT rJË€É"…?Ý9ÜÅÖƒ(äÊuÌ×ÊÀi]†(õš©Üt,R ÎO6º
+Ý6LÎê¡Øô•‹Z9ªiÆS}–rö†Eþ³:$"}?ÔÈyÄ‹¬Ÿgâù˜pñQs<‡“ÎLF{%˜w#!ZÙ¸`ÍäZ¾¸.\¸JcH>ØQ¸Œ”‚¿h»šµÕ1±/‡’åxzÓس±cª8(<©Î}3‡ ¯§†«fÈOsc9¸xçÎÅNaZ£õçש"Xå,:¡ÉOÉp9Ê<qL!ÎXE²9˜·€a)…‘HXçXbĤðºò<>`2*äh ´óÖƒÚEæ©ýY:ã©çPD“Ó‡TóØТô¯r¨d¯ÆY˜+©@+†BB+¸ÁB}"W.'OÞ&–—IÜñêN]Ž+ù¤EŒlµˆÁ¥·if4ÙB&ßê¡_DúaÁµao0K(FÜ/Pg¶wã@ƒhĺ™wîÙ·Ñšch¼wpÍWˆ[NOƒ'ǃ휹í›ýLž—¤‰”-ѱæ:Ãz³42.MÒX<•è7¤Á­itÒ 1Úz ±-u›úÆÚ’j³ÈpŠ„uiç߯E·mŽÝ¹ž­‹—ן÷µË@£ “[
+€|Õí<œëª)G—VÕÙ™“è8 MŽÌõe ê®UúmNTYÎÎ+fbû®¿cô–79Š@bèÙC‘ä QÐ\V¾cyÉ TOP÷Ê zC6É4ƒ¯ë$Ù¢(¦
+æ ¢öZ Øf©§œ8û"#W®eÕ “×Êr.ÇnxÎ6ŒùùäD$×t¨‚kX#W’!Ý-¤lc
+SÉ¢dÀ¢e¶ÁÁg?HÔV—)Ô*aq]AF0èêEÕ·åð…Y¯YK°%wõER­àÎ½àŸ„ŒŠñ{C@D½!2Ōܨ„FE Ö“*+”4\&T¨ø–^UQ“H Ó‚52¦ý­ø‘ée|Gë NuŒhÙÑ·!\¦Ø}y]»MùûEdP檫7ËýßIÕMrYp%í¦#E97[ú!Sµ­d
+ …8^B”ÍãFøIï`SÜ棯½nÐ3HDOJDôi7=zøø‹cð«‡d1a৻ëï»ßƒ]…éa°ûù¨@݃ÜÐûT;w°2ö¶ ƒUïôð,~zH3?+¢‚y¸6ìèÇI–¤²jÑÚÐÏ“¬@›ÅVuó›Ír.™^nÌöá¦|Ù¼ éâymù)Pñý­dòÿÙj_Õ‡ãf7]?/OoLN,3è®ÈÌj;™Õ¹ükÛýWþm6Taž:ÿž'a®"$ÅÅækü@šçncŠ¶ǯtK“¢@ù?ù%à gPu¯Pá$Šuᤑ«K«â.îTLEH’¯½hoŸ…dÇW8)(±5ûñ2Ô|íyÃXyß/žëU´WrI‹ÔûÑåXK
+«½J’~ŠlÖ8Þè#¶?O¤Ä£\Sêý¥UžJ8%j÷¯2ÙN¯££Šó¾&
+´by3êºUýJÁg·AŒiŠ1=‘Ú^Z¬ë~B‹šqóÊ iýQäw2è- 6‹¯ (øS¸P›Ãvù=aÔ±R«zË6IæpÁ•KZvOSø+ßÅ·ý@™Ô‡ëiÒlíuû='E± •àÝ–Cæ›iºµÛ,aág©Û€tµ)h.¿‰xïSb˜aÊ$‹¯w2~š[Þa^€e¾þ>ù?8Ž–endstream
+endobj
+1248 0 obj <<
+/Type /Page
+/Contents 1249 0 R
+/Resources 1247 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+>> endobj
+1250 0 obj <<
+/D [1248 0 R /XYZ 124.802 740.998 null]
+>> endobj
+361 0 obj <<
+/D [1248 0 R /XYZ 124.802 716.092 null]
+>> endobj
+365 0 obj <<
+/D [1248 0 R /XYZ 124.802 625.757 null]
+>> endobj
+1247 0 obj <<
+/Font << /F37 462 0 R /F8 453 0 R /F39 504 0 R /F36 457 0 R /F38 464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1253 0 obj <<
+/Length 2587
+/Filter /FlateDecode
+>>
+stream
+xÚYYã6~Ÿ_Ñûh3’¨s€Fcf±‹™,°i ì[–m%²ä•ä¸;¿~ë¢K“Í ÐâQ,‹u|Eûwü÷ïü Ô©Ü%¡§³,½ËOo¼»Lýý/$&4:ñ±·2¹u³ÐÐiœ!Í7o¾|o²»Lg±¹{Üéãî?ªª‹ÍÏÿüò}:Îù‘Ž3_ôfg¡z<n|Ul¶¡Ÿ¨¾9c#V•}ÞlƒÇ}Uñ˜­pÇíþ(+N¶¬yè‰ÿq‡W7øóÂ#ײª¦s²þ <mkO´Q_´ÄíCÂÁ9î¶"üÖ÷uEt„º¸n¶Æ•ãòìˆQ ­KÞ7­¦µ~¨³0œ-ý„KÕõ„É2uÅNmO-v~ŸŒ 4Aš©]Aû”¨7%ÚÃvE _ñOséA½a©éܸzPÒJÀNN§¯qaÏì|ÕºÆ"%ž¯á%'Ûƒ¶D1ÓÓÅtºA,Ø·s2ÿ ÷ü¥‹¤^=6ªbßKËA%kZþ^åH©*…²·¿9uýUžbXÄeãßð€%5çÍF3Õš4jѱ)x³›´-03¾!Mß®<Ô8ŒCy9¨¡©;¦'%Ùž;'àÒIo’èät5^©IÔ6VXü…p²Ä¼»œŠ g×F% ,-Ûop)ÍT¸=î”’ŠIÞ†»ìЯœ¸Ä™Ož]Üñp —ë5è?ƒ
+TÍòtl,¡gFÈ{[*‰S^¨ð2‘€&_PtøI^yª'™B/ y¤àÆh×£P½‡eeM§¬^7©A pè¢ÿBvšÞ°0k¥É„Êr÷;´•§5;­wx¹>R$ê'l*g«°xT[çä8†/¸›ÅšÔLœÚ̬¯(ؤËQ$9”ä{éxGñNC–ØTÇAÚñÀÅ/oµ$OÁ‘O^ä‘Ž˜Å¹²ì³ÓCrà©(K.öPÀ"ÿ-’¼y÷8¦0ˆU)ñDGQ6Ír·Ùâ}œ ?Ÿå
+¸å(ˆÔ‡°&4¸]ð&”,€,ÌÆÓC^Ô8iÍsó²r„œÔ¦[Ç+0r’½œmÛ£b>êbû¤é¸à (áI_·õ•Æ¿[3ˆ×‘C êpè˜ÃO+`áõáüY«:œì®kg„É'‹õ•5N®
+F ?Hb¡Î©Áø‰­¼9á8"Áªxá±ëƒ­!èA»¨EêW†a½[ÎØC’lUÑÆ K RÆ 8T7¢ë[Z-F¨W`•;E}
+ÀfÇß‚Ó ^8
+yD.îZpÚ}¯¿Ò Ÿ›»FŒ;tfäÝ6¨ŒÕØðCª^ŠÏÃJÑép³ÿþ†“ãìB(OB
+ÕÂ$Æ"Ì„1e¨ƒ“,†˜€‹±38¥‚}O¶¶õX¼‡tÚÚºÛ7hã¨|óI¨Ó%ÒÀábƒa‚Í|& G¹+ œ?ƒbŒ7M%ÍÁ,Z( Qe.K&° [3¡‹F#HåqÂ_ðµÎ~ßDp½%C}·#ÁXê§É’1ö·Å¾ø‹{; Ï–öL¡R–4Âó|æ »Lö,C[’tâ» 8A§-”’¥+i
+ÃOìÑ9ñ»<§»Óin‹y.¹
+/ÑÆ@‡¥{Áz€Á?ÑîäÑ+i´vz†ëy6Ç;:rÑëR<Ã"š¦÷/ÊIl¯cΚÉ0%Œ8”ïïƶðÌU IB‰Ñqnh çWjyAònç]vÀÅYc{ºyJ4
+ÖB×”Xóƒ öTKT+›š˜IäE§š»­øh’ Pw
+²‚m'J"ñA[õžc—O¡Z\.¬=‰ä÷j2KFC5Z>¹k'êýT¾PÄi&¿.À0=8N¹-àÂÜÖ›3†˜_ÈÈY\}–è0N†:€.„íÕýŒ„íÒY¸/¶. ›¹K¹Õ’þ:²3îò­Ñ=V…€}¬ý¤æÇP•P!ê^Óå#£ïg·¼ý$Ó&Hæ¿Óýxäìôendstream
+endobj
+1252 0 obj <<
+/Type /Page
+/Contents 1253 0 R
+/Resources 1251 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+>> endobj
+1254 0 obj <<
+/D [1252 0 R /XYZ 124.802 740.998 null]
+>> endobj
+369 0 obj <<
+/D [1252 0 R /XYZ 124.802 369.821 null]
+>> endobj
+373 0 obj <<
+/D [1252 0 R /XYZ 124.802 268.859 null]
+>> endobj
+377 0 obj <<
+/D [1252 0 R /XYZ 124.802 172.768 null]
+>> endobj
+1251 0 obj <<
+/Font << /F39 504 0 R /F8 453 0 R /F36 457 0 R /F38 464 0 R /F36 457 0 R /F37 462 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1257 0 obj <<
+/Length 1428
+/Filter /FlateDecode
+>>
+stream
+xÚµXKÛ6¾ï¯0öR °Y‘zo±—
+–•'¬Èʱι.OY’Ây³¼ûõ÷¸œ•¬ÌâÙrãT–ëwA£žŸ´®Û^1ù>J£•U/á"i iØ„<èä^­i bK3S8Áiu¿A¥ÊhÓ!L§Ö(»ÿ-ü°ü ®ZpÎÊ4uWJV=š®ÞÖÍ5麓ÏoWŸ âSŒt­®+i•W\ͯ¨ÜŠ™ÖÖ¦ùx²ïã<éq¥êúÁºBGsQíol]uÀÏùÉÏ ±$ƒ'RV”d~É8 <ð‹§Qðö¼È}«qS…‹¸ˆñ
+Šxý\닽?«¤e³Ai\ÓrVøºQ²Ð4°yã;Wzšö7¦ÛK ŸÚÀ¯C+O‰³ÒÒâXç”îüDK”| ¡€ááƒýFûsà({êIÝšµ.¿Ç‘¾^anñ´±^㌤~cÞå` (™Cx$9¥‚,peÆË Œ©Ê9‘™”ꦷ²©Ô@âÐY°öÆ#‘‰lw ¸ÆTÌZIü­ì/Ž´Éé °Kl˺WUC“²Õa]Õ•¤ÁvÊÙüp›ÞPó
+hr~
+mÚѪ?P_rÉê¯prc*ÄÿæÈyééÄÜxcÂdñÑòªÊ¥9Ÿ7Àp|Bkúãwà ÿ> qH|P|(ž
+J™É´i~U
+ÍK–GüGdPJÂÇz> Ø?ýy~íKXqÞ$¯ê Üe¤4}›ï
+Ò‚yví¿<K N'£G—oâ":‡æà®XäÓ‰üñ¡Quendstream
+endobj
+1256 0 obj <<
+/Type /Page
+/Contents 1257 0 R
+/Resources 1255 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1237 0 R
+>> endobj
+1258 0 obj <<
+/D [1256 0 R /XYZ 124.802 740.998 null]
+>> endobj
+381 0 obj <<
+/D [1256 0 R /XYZ 124.802 618.243 null]
+>> endobj
+385 0 obj <<
+/D [1256 0 R /XYZ 124.802 420.533 null]
+>> endobj
+1255 0 obj <<
+/Font << /F39 504 0 R /F37 462 0 R /F8 453 0 R /F36 457 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1261 0 obj <<
+/Length 4245
+/Filter /FlateDecode
+>>
+stream
+xÚµ[[o[Ç~ׯ ü$áéîÎì-E´ P (Zû-ɃlÓ¶RKL%¹Fÿ}¿ovIŠ{bA‘a"÷6÷ËÎ,ýÊáŸ_ù Sqa•ÕMµ–Õ›ë3·z©Î|_"*Söü6˜\K(SNpPª\óÝ«³?|_VuªIV¯ÞÙÊWo<ÿóÍöŸßØÜ^¬Eäü׋u(çÛ»»«×W1suïÿk“Wwü«ç÷Ûöý'/úéæ"Ôóû«Í‹>÷»6íó;|Ü~ê'¿Ù^_¬½ÈçÛ›¶ÊŸßðü{|»ã·o/~~õ·³¿¾:Ðârˆ«uðSõG¼xH¶“jh,1r¥žÒûé¨þãõ/?¹è¶íÏýt»ÝÞã“ç`òG"õk˜1žì»¹¿Ýl~ÝÞÙæ¾ÏaŸßñÔÂï=@Ž8¸NZdÏFøêæIÆäryuÃoá|ûúbãù/›7¾?–<Ŷ¥Ä>·ï—múó-VC¬ÿž&,˜Ø÷©Ÿ4׃°½Þ©Ä¦éBõæò¦íxmÓ}ËíæÓÝæmGª/èHÜl:R÷·;åÚ ô©iɺú)Åô»õ @_AÓ½œhØ+Ã$NŽ¸²(KÛõMŸ¢q͆ùìñ”ÜÉ ´›·ï7òÍ›íÕG®zñÍ ~¼¼½nغp}=ÿ|õöþ‡ãnx Úÿ½Ûüj{ß´EM{×zïezó§ííÕû«›5w¸orÛ3Rø··—Ÿ»¾w¯Ôj~è ‰ædnÛÀ]¹ìKøùîCÓ뛶ýªÿýÉyÅ¢÷ŸÚÒÚäSž¢ÂÑhSÕ¦Mœ¸}ßWüë‡E׫úð¸¶äȧ/mž.ÖYó\óžÍdÍ·¾m׳Ï÷®ÈÝ·{:7>“~ÙÓ
+y”<Õì³}MVÂaì ñ7н?
+>LÆäݨ;7ÅÕç³W?»Õ[Lÿ ÿ9ónõ÷³u™bIµ×)¦Çp}¶ö2yøÌ´w$fY}<£ƒ)¥Rd9TL=IÒà¹3H •ÀN«¯t1‘Šcg©ª+,Îç„ua
+ѧÂÞ9ŸšŠClǜϠ¹ÚçÀ×)ÆÃÎ꣬ôæk0}"þðj!x±}iòÅ ¹R€ÿ .ÅŠU¾H m¹)ƒ€‘š î eåéY*ÆÖÈXpR]•)eš\CR`”Bî»<RLz0¹”ÜÎvE vÕàclÁ¾¨çÁу‹†d…Àk.@Ò…"j«Juäú„³š9€¬Å‰±Tã
+T¨àôŠ “¨FjUšx*×IöBÌA±HÑ•ƒ/qÙ07%q1@“‘Hy€$g!ð…#à‹—H´@T6Tøï2÷è·¦ þ
+¶%‰mŽ´âhW]Û–§PÉÒ#¦ý™ºP±^(n"Œ³Atz'I4"ê'•
+$ÖD“<R>çàŠ°¬ªi‘$¯  CÎ9 ÏÅŽÃ4ð÷ ˆäAØ뀊qgÂúJµƒòˆk;§ÈàBÜ(ažœª+ÑFBÓy|ȡÁØ‚c¡Ø: pX(—x¸§™¸©hÅqÜ‹yï½ÙDª#¼„¢mºN=PƒÄ7Û^(2]ÈÙZ‘ !\ØXÎÐxØéKŒ'*¢K¶šlÚôp5O.ÁS"€ÃüdzgßÁñt‡°¢3ªÄ ãǽÐLKÂrzM£/  jr‘5Ñ×LÄŠ‘‰ÅÒ€ýú“éD†ë÷r”B‡UD*9Ž¤™©O´c ¢É´zYí
+´#µHSƒpnÞö‰a nà„*HËŠ¾˜Þ=¨ðqdÙÀÝÛPsàÄ‚"–àhØ#ì.y…¨á”ù…á#•¡%Ó™Qê Ä0Ì Ìãà1=õõˆÊNýÕÈpÇ‹0œ¤±+VH|„¢à/B£xªU×r€„èÐaËÈ”H <<†4G Πâ€ÃõI ïΔ/IaÎ…Nh’6
+ohCÎ@ŒßJŸU`!÷ÇÁàÎè­$K"·p»[!Íè# æ >VS8‘D#Â
+Ó8i Æ×êÄl®4¶ðé­¡ìj7­h8ŵúñ7>ðÌ×ãµߌÛ#yôH×90ðóJÑ<BáY³ÑÀt*‰ùw…ù»\ýÒèþÂx·OP¿ x·Tí”–?'3¥ë³›Czmó»Ùü[u¡›Ëw³ó¾û°y=|d a çëcÀù‡°ÚÎÃƽˆààrbyľÃèŒQ_\ÐW‚ðÒòtÎè»l><U<}÷a3\0.qg*œ\Òlç©hjy}6ÔࡲìâX0_çü—t <BødÓå©BY÷í3©À'#µ_²™6ýpr*˜¶wd5LôŒ6~¨)tj ò~hîòÐncÉsŸw°½ç<Ç°‡+"³¶òÈÞ8[úÜoqúv{Z©áÎõa+u„±¹G€ÙÞŸH´mÁée8—Œt&ã:5»³ðU¦â‚g7Œ"ÀJtiqm¿ßðêV™HDzK|[EÄÁsà´5=·nà<Ë Wž,˜çÖÇ$-P4@saí é‹¡¾m
+þ8 {ºÓ]MgæzÆÃû3ƒý³C9
+÷p1¶!Œã}›NO ø³Ý³ˆ¿
+ü \ÛEþ'
+ªoŸíÞÇþ1Àüm!ú„4PÓyxž3j¬ÿ[YJ
+ˆÂâÁÞÓƒY5`”9Y*¨©5€E
+æÛ Óà’¶öFtµ¹ ²kf°:ŠAœT¼UqØ›ÐÐhŒ \Îv!SV)-rEVĶk²¸VÿJ,]Kod$/ÑÎm1XX~‡=[ ,ÊQmøתàÖòl!øXArì¡’œu`k´±´ýUÂ!c_[ùĺ&ÚP…ž·Ê.ñÌ fòÇÙ•¨°/ÄJ¾G(W«x°È Äb1<ªY°B¼oA!%ö8Xþù
+á4¤
+ü©§ßAѪ#–E§†ð¬pb çGVî¤Õ¤©Ú[¡¦<PN½I¯+û…vUˆÖ_0“¬Šãï0 Ëy8 Þt¸²è˜Òþº°ó=¬ëµÚ:‚_œCkŠ€6c
+­yd¥ÓˆZMN°¦ÌR( R4.Óe9µò5R‰Æ°æœ¼Xc Ò/´!¸µWVclÃeXKÍ à>ðt¶Ìóy¢¬
+¥˜yüja«×ü‡ÞÈ™5ò@XVkgã‡4ÃB ‚3?
+ÛPP]6gØqwí‹V¶hZÓ¨i{‘yר4ÛQéª=[uº¤Ä0$#2»ø}”a%ðjš€•œ'kàõŠº¶Á1†~@G^kbƒ’F±V"ŠîŒ¡zjÅ ³ÕXùÌ£ÁúC™O²ZW˜cÕyÏ}˜6´ß{CŒf › ´¶çƒë¦„#Ö DbÄ7É¥ QØÒä3ßž"ÀXÜrb E¿_g=0@ÖhZS€N{ë†Á
+¥vÈÀ[Õå4#€53ä <;à!.eH­¶1çhkÔž]D¶K‚µ¶‚*â{G; ‹”Uà“691Æ —ÇÑ—q 1½4
+=tå ÚÃ,ÅqÍRœ3ã3~ÛSLN UcµO’‹¥66t{z…¯b ñ˜Wv²yr¶Ú ÇÃìJ,•iö蘈™oâ[Ôd½_ÃÇ‹·vf#þ’bëhu…Ï,<æqÚ:S|…’Û“\­1}6ù²AE»ÁN˶
+¡ÌLD”b¯ˆö0àÒèªmÎLr{`rE[V—ù`)èÊJHF@DDPîEH„4'S…,cÅ[I¥:X<ífi—í(t^/¬Ääå†U÷EšI0“ªEƒnÒxxÆrË깡7­\¶ M«6ûÔ®Õa÷¼m5„Øæqظbóù°uÔºš±qÖCšñëK£K¢új0ŽÛWC¶íÛWOÔ®uØ}h`àõÖ—-u°NE4PÒ£ÓŒMcíXÊbëY!µ±FÜÚ·±ž&œ}k&C#k(ž]#ëË
+Y³­»JÖÔ®WõeH‹¥,á=£íýç~™—=1E2‚Tó1£¿¿zÿ©?öæ‹cÕo/Öªñü/üA‹½E¾¾l¿5°Ÿ¸Ü¼?úŸÕŸø¦À‡¬qá÷6·úd7¢©vF=ü-ÿéìYóêýGºû̡ˇۯ¯>òÏýÕ¦ÿ@ârG_ÿ?ûqcËï«;µòeÎEÞùJê7Ã]8 x–X…|Ìšÿó»‚endstream
+endobj
+1260 0 obj <<
+/Type /Page
+/Contents 1261 0 R
+/Resources 1259 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+/Annots [ 1263 0 R ]
+>> endobj
+1263 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [301.814 507.928 313.769 518.776]
+/Subtype /Link
+/A << /S /GoTo /D (figure.169) >>
+>> endobj
+1262 0 obj <<
+/D [1260 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1264 0 obj <<
+/D [1260 0 R /XYZ 280.441 216.07 null]
+>> endobj
+1259 0 obj <<
+/Font << /F8 453 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1268 0 obj <<
+/Length 3183
+/Filter /FlateDecode
+>>
+stream
+xÚÍZIoãȾ÷¯ð-`UXÉš¾MÒ™Hf0íC€L4EKœ–D¢Ûö¿Ï[ªŠ¤HËîœ ´Šµ¾zË÷–²¼I៼‘ʈ"U7¹I…sÅMuøÞlaè‡ÒOÑF‹\â×Âà:ŒBC™Ã9ßß}øë?tv#Ð&»¹{ ¹w›ÿ$2]­%™ü­]Éäp*áÿº’çö¸ZëÜ&OðÑôðߎ¿[j×8¯ãžSY­´L¾¬2”[¥Áóê¿w?óÉR8kùäµÒ¢&œ/!çDôHÀ}³ç“µJ^<)ØßïüÆéhciáÞp_ì·z®ñâ
+¼¯.ÒäÄ«×mŽ¡§¯Kß×>xbÜ°·LµÐÙ@ýs tŸæ$HQígÝÂv¸'<ö¼õ±õ¾ÝÖý®îøë)ˆ4rnrt&ŒË¿éhèb ¤Æ
+˜7hhFÔÜÁeæê …ÔÊ òX?}ß>Ï©­Ð6ôûÜwQY‰vWð ÷DÜѤ—ààYä‘›'’-³Ÿ{Q"“"…ÛD…»ÎˆL…TYÔY6ÜðiÅ8…¤ìPµðû먳¬úÇ5¶Ê”ÈR=b¹ßi“®ÞÔ¿§Òàæõ‚Qd€e…|‹Jåšô-ïë¡t7¥LfɾùÂ_ó£2!åR“@ŠÀµÎ
+$oõý•ë£sðùS(†#>í÷Íé\ÏŽ±
+f°»_rº´¤»‚.姽<ÝúÓ W¬‡ŸìR"{æŽ0.f ÀÉý%oÄ>‰ìû™{ÆÁ4u”¼ ò ‘Ę÷ÈC¤‚;o ܼÄë©8¡\{nÓÞžþÊ«)¢ƒ×¼ihun4å‰F90æ‡>Ü »Âã¢QŽOö{?²ä@ôF]÷ßʉ4ƽ¨ÔtrÏ¿åþÜrkGW%ä=Ÿfn(Ô÷$6 HG8›oE:4/ ˜!óþ5ª€(jj¹CAËêaB(Êa¶Ù£¡B=Ög–ö¢-Â!2fW˶˜ÙÕÉ,ϯXb*L6Ä7öU_A!Æÿá*rÔuÎ
+†ËÏÀºa1ÌõL‹x‹Û†ýãÑ»¸›KÕDä•Ò5‘Jó¦È£·&ÐzÐ÷Q ä=¹±"ÏõÄ£ý«—7å]½çžo1J6Œ0 ¹tERëÇý†»†›:‘çàâž|¨7©üÆØmH x`È’qWJžpYpÐF¬ÚⲎtŽ{"ÿÚ÷äÒ\ò:vUf–¥¿êns!mq=)tÈ—)G%Ï5€1fkOM,5ŒÃ)ð)¹}¯
+ÚqÜuQFZK›Š@
+˜,Š¢U“ÔBqc¶`"%Åè|¹J´°½…ó]pL Å­™—r˜‘“*„vW²L0ÕÜEBŽ°^[ˆÁõèô‰¯Cöž:ÆÓ,ľ!-€þ3é“A1EG  Ä’‰?4Fp›òT3tžÀšÌ^ï;¤ïç»XbL9_É Å[(@zeKcá¤x³4²Ì/·Å|ë•¢&©Ñ–c–Æ-¥6ç]¹iŸ–X
+Ù\½Çwh"99 =JÛ•ÎCVÚ%Ìÿ]3B† O[ôS)û>‡V„‰d/´i¹ 5àlcáq øСeú"çÇ[½f怔q>3m®ÒªÈ! ˜bs{Zq]îã¥ôÖ
+îæè]ÁÿtšÑ~-÷‹¦†UM}ÝŒQ
+•™kÚãDÁc9ö³Ì9›EM‹ÅÀ8£Gi ?ææÊr=Q+@4T¨SGzÕ5¥\qä2¾‚®ÊåÆË«¶;Žb]ëJôð÷©tÆñòT¶|ÆÕ£/wú€„‰_*^ÆàðqO•I^ùº)€+´ý³™Â¦}„Pd$ÇÕPb[`ÈÛ0'1öátæp ŽšT“ûì‡ %ÿl(,
+ù/ötC©Ò[_Éæ=‚øºGÃ¥=i¹ÄZEÿ&;ÎÜ1ü6cŒÞf°wÇqÚ"Žkbmï*Žøê)Žã¦ ¦[J¿/ÚŽ:ÂÈè‚{枃Ϝhž8aÄ›c=eRÊ7ÆAmÐ\»=”Xl7%[ÆVíˆ3¢ ã!଼(ËZ;Ù÷ÃY20Úq‰×Ê"л3º•ÖÑ—ð
+KØÓ¨÷õˆkêÖÚªQJˆo¦¸,ÈGzÎź/„$Ÿ‹yÆ{àÆGÈX]`fpNñq®!,°±°²¬$bÌXSöéêJh\žäáqÒx•Æ 4¿Þ„ LŠÜN½|ûòK¸¬öÉoã#È&>$ù¹üvQᣜZ Û4΢výFÔþëg˜uGINõe5¼-OJE4ƒ¿ñš›ÅúVCø•óû)6ªöp*ûf€°|Z÷ÁŽ_¡ýùnUh®m²Œ)M_sï :8± ¿ñi“ÜÚf”=ãðÁ
+Ç6Q¼ÕãaT{-Y1•u1â&ÖfˆªS¿9¤¹Jºú¸BÍAÖ*_.Xâ~ß\®¤¿
+endobj
+1267 0 obj <<
+/Type /Page
+/Contents 1268 0 R
+/Resources 1266 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+/Annots [ 1270 0 R ]
+>> endobj
+1270 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [172.886 183.879 187.608 194.727]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.118) >>
+>> endobj
+1269 0 obj <<
+/D [1267 0 R /XYZ 124.802 740.998 null]
+>> endobj
+389 0 obj <<
+/D [1267 0 R /XYZ 124.802 716.092 null]
+>> endobj
+393 0 obj <<
+/D [1267 0 R /XYZ 124.802 693.474 null]
+>> endobj
+397 0 obj <<
+/D [1267 0 R /XYZ 124.802 456.765 null]
+>> endobj
+401 0 obj <<
+/D [1267 0 R /XYZ 124.802 266.97 null]
+>> endobj
+1266 0 obj <<
+/Font << /F36 457 0 R /F36 457 0 R /F30 446 0 R /F38 464 0 R /F8 453 0 R /F39 504 0 R /F23 440 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1273 0 obj <<
+/Length 3010
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZYÛ8~ï_aôËÊ€Í%RÇ~ÈäØíÁìfc`èi²¥¶•È’G’ã>Ðÿ}ë eÉv'™E€H"‹d_Ë-G.ü“#é)¹Þ(T®ˆãh´Ü\¸£LýýB_ù"”øufrjgáEDAŒ4?Í/~xï#©„¯‚Ñü–hçéµ#åx*áHçŸÙ¦ªïÇS?ÔNÁ óÇX:»œß7ðž•c_:mÃ4ã›ùÏ?¼toSÏ E ”Ùz“µcÏw’íxª§jZ^1`#VÝØ,XìVLb>L½X
+_ûð"EäI"œ¯3³WÒsEÅý³='©ŸN¶T!œn™Ü&˱9ŸÇ:p’UƲåFÆ/8•±V”S$õ*ã©"çªå±]Cêiø+áeEef«[~6m— Á•Ù7)SžX&°ÜàFI9öbçyMƒHx>H.¥ˆµ&v—¾êvƒu*t–­ÜÂH²lóªl.y"‡‘òTOŒäëàHQh$u0R^ƒÞ]Kâ«H9¿­ÑðØÏ
+œ+~48Ô&5̶4òx[ñs_ç8Nܵ@4wíòêÐ8Û£¸çuR²2¤Ž… ¼6@ @‹áþ’
+ßýîJM|Â~{Ô¢9ÿÂÒð¾‚rºFÀ€lž=í9$ënŒ±{,˜³ºáÉ
+'Ú펙÷´3kü¸g|é‰Ð³­“e^®@ êc³ZxÜL™7¼))63' Qñ)ù±NR|q=£Wã#©¡‡ïu–×üUä$
+LãKK;ƒm¼ ¤ð`›‡‘p==°yY•¼¯`´GU|tEs™ËwÙÅÌd‘oò¶AÅ+ßù›,ÃöÁeÖ;äÖoÁž„3Æ“`Œ‰q¬ªÍî_>¼Yg)Ó‘˜‘r Ji¬°åj`j=0µDf»bgGBãC[j°ò-ŽUUñ±É²spç†þ!~µÒ
+òBä0ˆ×å&›TÂ7yPÒö>ð×wЊ»ÛÅM›¿’„ÕŽUËD(¾kÃ
+8U”GPT›Gpz“¯Öh_sþ:9d%TV¥ þ †÷´:“
+ŒëÆ:Óú꤀é%I²Ùr1`°»d+*CùÓWÚÕ9|‚
+ÀôÑ·Á&‘²‘Õ¬)-ˆÿadSþƒŸ¶YW·´™!©Jtf|Û÷+ èR!,î厖gs–'iÑzXÁ¦!2Œv;PC§9“±((ˆÄ
+16Yʼ6ü,©Î‹]S/s% ðoVRØŠ{œmÐ:
+84` ΰë}X*Fc l*š&²áá˪®³%û*ÁàÛœ…ü‚·Ÿ&š¡Cbù•ðüˆðue†»¤…kì;ÚNEÈ¡ŠR§[X»IPŸ÷L“MÅÃeFÞ¸"ŒÉ):FÈù–F›]êI' ¹ R&¬aXzl§2^q(ÐúÝhký”×ö2vĆ#ª¶’„¦] Ô{*(Ögª*/êûS±©k#¡Ãa]{…÷ÐëÁkàÃ*‡ã4;å"…Œô÷1ª ¼áA¨ùš4šDy& Pm»/1]Aá{ŃǮ@ˆæÓ,14¼’?¨”Ý
+¦ˆº
+\\߸£è~¾p…G£=¼»BB´¹ð Ê’‘ù,.~½øOŸ!)áûÏnC«\؆ß,ùpŸ@xî³P•„]—Âê°°ßãhPYÒù°øD‘³lßÒó6ÙQœ·¶Œ˜èìXh÷rÎn”]šI£­åb!=šÅ·—øùÊBR,T û<¼<‡Ç—ì-™X(èì[šp+|½Lˆ²®öä—ƒcÒ:ÙóMjwxîißG+.‰~œáÌü£ÝºÌöñùï
+³-8UU~´’/Z“?§Ú§`A1Íi߃‹_v×—XÙC‰¯2!gÎì)mµµó–y®ú!¼À­žrp éû‰Ž¼ë˜]Сx¼á‰k§!'—·¤«„ «‡n‰¢É:&&¤ºÒ!Mq7àpBì)áùª¯¿’è3R5s¶è˜@Îî gdÃìn –[Ò!šÚ¡Û„lÎœO“ËÒY©‹ûnòÀÙÀ¡¾ÍÕÃÿŸ«‡WE§':ë<5KWºK0>aBjÿÂ8žâwB/7vÿ^,MO¦\.8„ îÎñ¡n8 SóÎ êé2!¶VEöÚr*#·c‚Ý&©‰­×4KIfC³gâ­\Ò9[HØÁ…g$;pvÙÅ}ÇíùK2?|]f·gxÆžÍk»½\nºH9#ñ±ˆ$÷rFžYç«œâîŒ8
++%‰]‹ø>uL=­DÁ ¯û+éLFÂwƒÑ4’BKùí
+wz©ý r®z6…úð=ïÅz0äçR¨Š0Ž¿–Cñ¢¹ ‡^åä:j±ÃóéÔ¼¸fS1ªp~œ×\q?=r¹“™
+(¥çìíÓ©sìòæq˜gÖ RòØ?Ëé>| úôØ>‘8cÙ¢£ÔHDuE´O4ýtm³ÝŒXª¶7@ª°/mk ~÷t=ÌX³.]ML’"†f¥¹›“ÌtÊn{Ï| }Ö¡ú¤ŸûfÅý ÷[ÏjÛnùð][>ôT0=aõšW¯2ªEÊŠÁqbñ& Ñ
+ŸQ°«gpímûé‘ãgýgùs'ä
+P–sÎ3<¥lÃ=óòL|d$múȾ×&£òÓ »p)Š±)yÀ?@S„9{œ/Eâ¯À"ºŒÖ
+§.5Ðz×_ hïóÕÎ\tU9Jÿ8ž†p•}ƒwÉfË}Fšëšï^ÿW´H¸nwÛk0BÓà}QœÞ¹©5lÛbYÿÛmJ»F`ÿÀáï12P/ùy´ÙÝïÑU:¿0Yx‡ŠРD°¥p•G¤¯Ow>¤ÙédÞu{Õ šÀ¯°ÔÐÔNà.Oï÷° ¶¹±ÉcŠ;W¨xØån釴-ÿJÇ7éøž‚à%:±»¶ä²"nÒì^ußE÷ݤw™×¦u¦ [t·xm;ãè ±|RL“)ÛÖYcÚ›øf‚%¸ýÑT!URóõѱµzñ·uE¿%·SÖ±,j/tU²ÒtARþ ÕþÖð(÷7mÇÃv²»¼1ã‰]ßýóËjcÊ·6]µÆ´}L³¤×EìúImû8¶¹›¬¨ç•Ô÷ãH9Â^7Ž[P®<×Ùpé'tm{@0{+þŠç@Bzþñ‰2ŒÄÂáß^ü9%°endstream
+endobj
+1272 0 obj <<
+/Type /Page
+/Contents 1273 0 R
+/Resources 1271 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+>> endobj
+1274 0 obj <<
+/D [1272 0 R /XYZ 124.802 740.998 null]
+>> endobj
+405 0 obj <<
+/D [1272 0 R /XYZ 124.802 716.092 null]
+>> endobj
+1276 0 obj <<
+/D [1272 0 R /XYZ 177.412 185.025 null]
+>> endobj
+1271 0 obj <<
+/Font << /F36 457 0 R /F65 1275 0 R /F8 453 0 R /F38 464 0 R /F39 504 0 R /F43 618 0 R /F32 450 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1279 0 obj <<
+/Length 3906
+/Filter /FlateDecode
+>>
+stream
+xÚµZ[oã6~Ÿ_aìË(À˜)J”»½înÛ-:)¶@ÛÅ–c5¶Hr3ù÷{n¤dK™:;Xˆ%òðˆ<üΕԫþôJ«òجœUQä«ÍñM¼º‡®oÞh!Il¢œÆ·…εï…•gÒüýöÍg_'ÙJ[•Ølu»#ÚÛí¯‘67k ŸŒ~îotT7÷7¿ßþ󳯳tBër¥‘Çj¸1IT¶w0é[§Ub!Ýuíñf8=ÕÀ|Øãÿ[Òè¯
+§t–ÃL•Îsóµç*un5¶þ"ŸÊW…*²¿´6iªŒ…_­r£Ç¹™¨|¼Y[µýÀÃ&£ÒLYàÉóÛ´7k“GÛ
+È]m@QÉSÄ÷;èuuê¨:ÞÀ‹4m·@U!ùz³äÆC¾ãºU¦
+gñƒÚUè•Q±5ôÑÏgsáåÖHX6©J\žÒ6ˆ›ÓÕØú ù©ö<—a_‰´ŠÉº­rÆɺ«ã£ê‡çùD´2E*Dåæ„óp“fQy/Rø-N㶡y¬M«Üe+€*RžÌ·7y}þÐiØç4~Eâ7_ÝŽØÍ•‹ Ør
+N·…(j˜l’€.â¤JyiZ”F’DCEkF`ëHCPîÂZá—?¡M ˆäwÃZ
+…ÞIT§…n囲C»Ewª€¤:ºçæ—½X’²¶à…²
+¡Â¨ÄD? _L
+ù>Y°6œ5ïhã“œgc\Žqeq¥Ü
+†‚_Œn‘fÓ6›º—>¯Õ~Ê ES”Mé=ï†>^kìÜ$s¨A_ÔÓ'{J(ª†#+”Ð}“[´rŒ`˜äö ¤Ò‹Ñ:˜É»—½F©§××yëö$ò#çWC`ˆHtôÈ0› Âe s¥B$é²Ï.GŸÝ{鈋ô&Ó šßzÏ“¿ŒK4jè:r0'yÆá ¶w÷Bð± 'ý„LA-$¶0YØ+˜ 8—Â2¢¿@Ç¥Îô2—i¼˜¡¾àð]H¿ŽåCð2=B'&Ÿeuq©H†RP< ¿Û ÇÕH‰EDz©=å Ý-@:M£?*ÂÜ€ŠíbšöÒßÈ
+-¸g[~¥8ˆ9›Ø<|y¡8•±ºâoõa¨*T=’ÎÑH³%xEÈ$ê„ßšó†P%Û•œÑR„9„j´ðø@ßm°ªë…%ïB¿À›¡]h6<ÐFún O4ˆÿæV¶çÂzâØ 9.¹•FñÁ )
+ty¿ƒvLçÑ0—ë’õ UÅçŠ<ƒp€-[ȆŠ.׈O”§¡¯ƒÀã Û =$tê}Ã^6¸¤j·Ñ~÷E_"çk©'â9Š Å­À4À°¨8Ò¦†I†RÙö4p¹<Ü·Ÿ 1Ìȳ8Çð6xÈów|;·i8b!npX¨¢ÄC(Zz­Ÿ§(Ûêñ<ûß"€7F«U‹‘’­ÔˆU¡âXU áÔŠ}Uwüv`9³%(jR9!6ÌdÛÑ"ŸØb¡¬‰¾o}$„ôýC)RW²‘œoX;YUÇV°mzŽ6cOuF)›dIÞã^?C·’¡XùÀßa/ØMm÷Ì­pœ–̼5R‘£”¹=4!shÔº$”ÐìŽñwsê½”¨½Øã•ŸC¼©½Qï}úh“xŒw°»e"æ†ö¥@È-'1.ôú ÄAAÒU­ŽYød#ºÚ+þ¢ÓÙU>Ä™¦Q/9Vr 
+Š×‹waGu6©…¼on–ÿ¢Ò'>Kä¸Û&>tÅ;I··ÜK{Ê… |íªÇƒx/
+îešbz«Lûšé]û¡êÕñq)'5™?M‘Mœñ2±²Y!DÝ˼œŠ]êîdt–¦é SI‘™‘]Ùlžõâ![æ «-ÎgÉçv-ÿÂÊFÊ.ØBxwWÉ<6þ
+sy$DGÎMé¹*»CMXn¥¾ë}ÀvMØÁQ1cm¨©nÚ3Åì¼kª$Ã*lëÔé+lí§ÙJAoB\Ø'>‚‚”ÏIþè
+4²Ýg7»Qì6Î_
+!ýáç:ËÅ N¾<ÿÊYp‰Ogº%£ä<è™ÇRµ>ÖCÍí/›<ŸœI?c0*-z":òB*ÉA…äÔ¬ƒg§& -Çd½÷\ev¥ÐÍc(d¿¿(ÉæÓÊ'°‰ìõt¦Z¯ÈnƒÌ×;®‘â¤8Æä"€°ËW>b9Ôº‹² õÍn-@î¤Å¬'<ä·šV+XûÂù"~ƒ㊉Étak&ªlî¹zÖ-…ûd—]*!ÒÕ”OE†vG›ù!Ô‡sSÄúºM7“¿T ÇO\ø Lx¿q`p0”UÈR(!hšÁ¬Àkw¢m[/ÄÆc´“ä>yÊÃ^ãvÕçJy,±
+g©çHmɨ8wóÂ}ÅåÁ‹:¨ßˆžÜØçM;½FT# ð„–Oáe<ÙâæíÀ¯“#F?sY|ùWW‡s½eR ûŸ¸`^½í'£‚´ "6ø$-`ì[&3‘Y{[Tlƒ¶ ¹ü,‰î)xܳ­äèÛà•EÉþ7t-Æ™ë¯íYƒj-4³Þ’Ùñ‚‡®’ÎÍ¡ì{~ís–,Ò8Ôë8•ü³p&•Hþ¯÷8åò
+d±!ÅÊ–¯bb¶ÿ9ê%?:\œQè¢H¤J®@$Ó£’p¡ÄWš³Üš&*Xö»è«1lwñœ±Ï$Ý ‰§ö—Aú JrÌù´Ž{/dû)Cݹô:KËŒ±Ê¸ìµU0Ë·gŽ ¿= ÁÅi•'çKßÒe”ôÛ!ˆÑéëE<ìË¢H1ÐXý»ñæxv¿éÄÒeS9Ý]8¹O•³ÉÅš?rçN«<ö"úÏh¦ó:N¨X²NR•g¯½««?!Š˜ÝtÌ”+^}ÓQ›O dÐî”,œpo‰M8"›G•º´—&ËÀ€ìÀ„øÛ çõuféöGnè/®a–@kW¨„.sO˜þ:èžendstream
+endobj
+1278 0 obj <<
+/Type /Page
+/Contents 1279 0 R
+/Resources 1277 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+/Annots [ 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R ]
+>> endobj
+1281 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [162.515 671.357 174.47 679.769]
+/Subtype /Link
+/A << /S /GoTo /D (cite.ohl1997) >>
+>> endobj
+1282 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [417.524 647.446 424.498 655.859]
+/Subtype /Link
+/A << /S /GoTo /D (cite.hagen2000) >>
+>> endobj
+1283 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [429.776 647.446 436.75 655.859]
+/Subtype /Link
+/A << /S /GoTo /D (cite.hagen2000a) >>
+>> endobj
+1284 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [450.193 561.823 462.148 572.671]
+/Subtype /Link
+/A << /S /GoTo /D (figure.175) >>
+>> endobj
+1285 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [454.787 281.845 466.742 290.258]
+/Subtype /Link
+/A << /S /GoTo /D (cite.roegel1997) >>
+>> endobj
+1286 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [397.556 210.114 409.511 218.527]
+/Subtype /Link
+/A << /S /GoTo /D (cite.vanzandt-girou1994) >>
+>> endobj
+1287 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [260.911 186.204 267.885 194.617]
+/Subtype /Link
+/A << /S /GoTo /D (cite.girou1995) >>
+>> endobj
+1288 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [249.696 162.293 261.652 170.706]
+/Subtype /Link
+/A << /S /GoTo /D (cite.rose1997) >>
+>> endobj
+1289 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [363.128 126.428 375.083 134.841]
+/Subtype /Link
+/A << /S /GoTo /D (cite.korittky1998) >>
+>> endobj
+1290 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [379.883 126.428 391.838 134.841]
+/Subtype /Link
+/A << /S /GoTo /D (cite.kuhlmann2001) >>
+>> endobj
+1280 0 obj <<
+/D [1278 0 R /XYZ 124.802 740.998 null]
+>> endobj
+409 0 obj <<
+/D [1278 0 R /XYZ 124.802 716.092 null]
+>> endobj
+413 0 obj <<
+/D [1278 0 R /XYZ 124.802 521.945 null]
+>> endobj
+1277 0 obj <<
+/Font << /F36 457 0 R /F65 1275 0 R /F38 464 0 R /F8 453 0 R /F7 627 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1302 0 obj <<
+/Length 1546
+/Filter /FlateDecode
+>>
+stream
+xÚ¥WKoÛF¾ûWèˆޜ:q4EÐh8‡µ’Q¤º¤¬èÔ¿Þy,)ɲQ…ahwfvvgæ›Å$†?1RGy,'™Ž£¢È'åö&ž¬€u#¼ˆÒ*ÊîžaN.,¢<-PæíìæÍû|RDEª&³%IÎ_ƒ EІ2«,m8ANU"ƒ?"øÅt Vâ?ÑkƒÔãÈrLî[þíváYeµ<2õ;:t¨šUÇÄ-m_M·Î»Þ™²¯a®ƒ(œê"fkëuxsSâí2ü6û&M…ˆŠ$!Óú5(5=JdÙÁfçZ?p2 ÖHOƒªcþ…pÛ ÏÉ‚Æ’qøv/jøgtK]3¡l·»ª|èX¿AU ¯vÉ´²Ý;V7ÞòäÆÅðªö»jk\n‘Iе[¯DË”ô#•lAÃXÓ V{³²àËLŠà7ûx3ØÚÖöî5œÑÅ¥‚
+·nãoDAò•³^€ž
+m¶fT
+J¡Øòú,Å¥z’I¡‚[f\fÅ‘‰XÄ =w€Ú8&vÇ®'Á-ïUÈå“\ ÙýÛa1ª9¥ >‘TÿlΔâ:SØÌæÑÈ»«$QI”CØw·Ÿ?`>«ëpNe""™&°PQñÙÿŸpb Êtð¡ç—€¹÷+0±´VŽÀ½®J;Š=“Ù@½
+ç}4þ¥ÜÆY2”ÛŽõS}ÛV}oõ‘¯à¬qìè–{ÚkîÊTm{«†_¯ ÃÖî†è°GôyÖÜhAtFfËfš Íf¿#F%*™œ¨úÚ ÒHBþœ·ð7<¶?µh(ð¦´Þá5ru$_ HÖõ<ÀЂz^Uþ÷¤ÉиD—="N t„æ×­?B£R§š2PÉÜ+r¥£$i"Ó¡ tꋃ’€ vÁmº6M‹?‡q$Y¬0z¶ ÷…î*è F
+*𨪇Ä!sÑ4Ü¥Á¥$ê˜w_9
+³qÀ !Ÿ«
+M6¬`,…¶ñŸ üe4—%Üö~‰à“q%ŸãÖÑð掚ÐÊúíù·Ç»á»gÃÃ{ÿŒ]÷{Òÿ“8Z”sµ¥ 6º †&™À§f‘>÷* ÑÀ\ÃsÁKó€ÉSÕ"+"H¦Ëyâ/]®Îendstream
+endobj
+1301 0 obj <<
+/Type /Page
+/Contents 1302 0 R
+/Resources 1300 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+/Annots [ 1304 0 R 1305 0 R ]
+>> endobj
+1304 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [430.923 657.312 437.896 665.725]
+/Subtype /Link
+/A << /S /GoTo /D (cite.kamin1997) >>
+>> endobj
+1305 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 0]
+/Rect [184.638 633.402 191.612 641.814]
+/Subtype /Link
+/A << /S /GoTo /D (cite.knudsen1999) >>
+>> endobj
+1303 0 obj <<
+/D [1301 0 R /XYZ 124.802 740.998 null]
+>> endobj
+417 0 obj <<
+/D [1301 0 R /XYZ 124.802 552.931 null]
+>> endobj
+1300 0 obj <<
+/Font << /F8 453 0 R /F38 464 0 R /F39 504 0 R /F36 457 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1310 0 obj <<
+/Length 3053
+/Filter /FlateDecode
+>>
+stream
+xÚÍZmoÛFþž_!܇–¢÷•d¾¥qâ¼Ø‰aË×ö’â@I´Ä3E
+$U7-Ðûë73»¤%‘vüÖCaÀ"—Ëåîì3Ï<3$øðÇ\(úb(ŸEQ8˜­žùƒ\:|Æ]©$ 8žõ\5Wစ&Â>?LžßH3àŠIe“ ê;™öN“‹d8â^™ä3:¨†¿LÞ?{=iÇó#ÁY(xßËB7zF8ˆXdäö>ó_ö‡ä>ÓÜôOG·xäi5_{‡i9ä^±a0u¡¥÷.aMi6ÇÿùÂö[âÉbiO²äס=Znf›Šép¤µ÷èFͳš`¼ZrÛçä Ž'ÃPze:Ã.«çp%"mg <씥óf 2'ÚsiMó_—íÕ$Çj:™ãc¸×ø+¼Éùá÷Ð/Òøyg®ýd("{w”Õ[.ì¥/¾ößàó‹’fC¾o}!$ µi§–¶—ÊÅÀœ:ÄD]ã/ëzýb<¾ººbõfÁŠr1¦%Žö‡ÅÎñz¥³¸N‹¼ŸœMÀp—ÕÍx~éØÜ÷šæ+¶®Øâ÷ýéÁödÄܶ?ÂHhÎ80tæ¡@ý@nò7F<Ft”o™
+õT,PÑ@0?¤¾/»ƒ)° ½é2!|h¦$µr¥¨ùuÓêÁuëOL’k œ`L‡åP €Ô2U¸ØÐ{U¬`q롨çh/´gAG/†£Ð÷½wa,C/©ê’zÖÄ
+xÿ¼À†Ùf•äµòª¦^ZƒÚÙ iìôuïôµ›>ã(vKB廊ê3"ôût][“má!Ym£ |¦ŒÞ1À)y} ƒÌSÜàl¾”Ò;~ù¼œéUE>úy*©2ºå+‚Âu®
+z<žSAè¥~¨ƒÈ§v·ä
+g®àdA«Á¦ ëˆQàÀû^y³o ÂÂö­v Q:‚­‡çHz«8ßÄYg» P’Ü£œY…ïû³ò0„çH»Æ‡q캌«Ø2e<O ~ÿA’Ã:÷ì|w~” 5Âûqü¨þ.ÛœÔñ›ax›¼³y2dÌï²y`S#þþ›'Bɤn6ïÁ¾«ŸzóÞK«¤QÞÃ_é½-¦SÔ/_‘žF!„.ÛˆW~_Ù[Àù0\!sƒRÓÒ{iqO†*k7i³ÄÆS|4(ÌŽ]rÖZ
+XÛ"M*{­u88&B-òÚf5œ¸xípH7s'Ìž[ùÂX wÐ3ô8œ£¼ã‚z']b–Lû¢¥¹‘H“¿ ùÿŒØ&ˆ^¢¹•ò>ýf'7·=Ç°Ú¼®¬Zç<‡8Á‰&Uã¯N …7h9 œõO ô³xE|h3ã}DÖÚû¯ÒÜ6Q¸œÛãb¡_Óë–·_±%®‘.¹Ï$^àÌò¢eŽ4ÎFh©MéزÂ\
+èb Ài2§bcÛ¥Y±d ½vücŠAe™d+2ÐMBo}&#Ùµ‚¿e€Øå´Z>ï* ãÀ˜G)™:ùá{Ž˜]”ûãƒÉÀ<¸ ¢°ðÃûbãÍî&žÚÝŽã²QÒ1„÷aƒ™­âÜ–ÀFZÞÙÛ@š"º»·ÁÜú¼°Ñ$¸Áu~ ÁƒF€Üzoå·ávz+ÀÒ[×¥Io5à¥'EÕr'E¥2:ÞÙ(a43… çn mN¾ Zî5×5?bF
+¤¶a²¸Ž§‹$Àk÷^•‰{ˆåý¥ÚFº²/ªmÓö‹ÀÀ…
+Ô˜|ä·€eeîÉÍú©ÁüÔ›¥f¬zŠ”öõÆbí½ýâKµ¨¦ôõ‹m:¥R÷bþ?Û¬²tu¼•ÊãK{r´û) ¾X£yºJò
+\¡yïr{†±­íUÿ°·_¥Ö;öŠ€÷‹ñXòŠÚÚ¥„cû€Ô, ïI
+ܪÝÁê¬ãHòiÀáÐEÓï8ÿÇOk`Eä/Ë:eIŽÁÃÌ-ò$:‰×Iúœdvõy¤—ø¦÷ñÍ^bž\Á¤«¢^º¿R˜ãkª‚ÓÉ¿,¤êl@ŠÒrrFÅ…²Mî1©‡qè›û>OôYÙ¼ûâ"„¸¯Å6tD‡¼þãõf\¬7Žh‹iUdIŒ×øá æ‚—ÕxšØ÷®E_Òä YSAF–îÙO¿ ÍÔí;Ê…é`$
+endobj
+1309 0 obj <<
+/Type /Page
+/Contents 1310 0 R
+/Resources 1308 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1265 0 R
+/Annots [ 1312 0 R 1313 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R ]
+>> endobj
+1312 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [368.14 668.866 469.509 680.821]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/applications/PSTricks/TUG95-PSTricks_4.ps.gz) >>
+>> endobj
+1313 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 657.187 376.91 668.312]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/applications/PSTricks/TUG95-PSTricks_4.ps.gz) >>
+>> endobj
+1317 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [332.768 593.15 466.017 605.105]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.pragma-ade.com) >>
+>> endobj
+1318 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [275.908 573.225 409.157 585.18]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.pragma-ade.com) >>
+>> endobj
+1319 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [325.799 453.95 469.509 465.075]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www-sal.cs.uiuc.edu/~kamin/fpic) >>
+>> endobj
+1320 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 441.994 203.811 453.119]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www-sal.cs.uiuc.edu/~kamin/fpic) >>
+>> endobj
+1321 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [266.05 314.473 367.419 325.598]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://tex.loria.fr) >>
+>> endobj
+1322 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [409.983 294.271 469.509 306.226]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://tex.loria.fr) >>
+>> endobj
+1323 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 284.806 188.12 292.887]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://tex.loria.fr) >>
+>> endobj
+1324 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [249.169 250.712 350.538 261.837]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://tex.loria.fr) >>
+>> endobj
+1325 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [273.994 218.555 469.509 230.51]
+/Subtype /Link /A << /Type /Action /S /URI /URI (ftp://ftp.loria.fr/pub/ctan/graphics/metapost/macros/3d/tugboat/tb57roeg.pdf) >>
+>> endobj
+1326 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 206.876 350.26 218.001]
+/Subtype /Link /A << /Type /Action /S /URI /URI (ftp://ftp.loria.fr/pub/ctan/graphics/metapost/macros/3d/tugboat/tb57roeg.pdf) >>
+>> endobj
+1327 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [368.14 174.719 469.509 186.674]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/TUGboat/Articles/tb18-3/tb56rose.pdf) >>
+>> endobj
+1328 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 163.04 335.067 174.165]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/TUGboat/Articles/tb18-3/tb56rose.pdf) >>
+>> endobj
+1329 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [368.14 142.838 469.509 154.794]
+/Subtype /Link /A << /Type /Action /S /URI /URI (ftp://ftp.loria.fr/pub/ctan/obsolete/pstricks/beta) >>
+>> endobj
+1330 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 131.16 308.418 142.285]
+/Subtype /Link /A << /Type /Action /S /URI /URI (ftp://ftp.loria.fr/pub/ctan/obsolete/pstricks/beta) >>
+>> endobj
+1311 0 obj <<
+/D [1309 0 R /XYZ 124.802 740.998 null]
+>> endobj
+421 0 obj <<
+/D [1309 0 R /XYZ 124.802 696.263 null]
+>> endobj
+1296 0 obj <<
+/D [1309 0 R /XYZ 124.802 700.248 null]
+>> endobj
+603 0 obj <<
+/D [1309 0 R /XYZ 124.802 654.199 null]
+>> endobj
+1292 0 obj <<
+/D [1309 0 R /XYZ 124.802 610.64 null]
+>> endobj
+1293 0 obj <<
+/D [1309 0 R /XYZ 124.802 590.161 null]
+>> endobj
+601 0 obj <<
+/D [1309 0 R /XYZ 124.802 570.236 null]
+>> endobj
+602 0 obj <<
+/D [1309 0 R /XYZ 124.802 526.954 null]
+>> endobj
+1306 0 obj <<
+/D [1309 0 R /XYZ 124.802 495.073 null]
+>> endobj
+1307 0 obj <<
+/D [1309 0 R /XYZ 124.802 439.006 null]
+>> endobj
+604 0 obj <<
+/D [1309 0 R /XYZ 124.802 418.804 null]
+>> endobj
+475 0 obj <<
+/D [1309 0 R /XYZ 124.802 389.414 null]
+>> endobj
+1298 0 obj <<
+/D [1309 0 R /XYZ 124.802 355.596 null]
+>> endobj
+1299 0 obj <<
+/D [1309 0 R /XYZ 124.802 311.484 null]
+>> endobj
+1291 0 obj <<
+/D [1309 0 R /XYZ 124.802 281.817 null]
+>> endobj
+1294 0 obj <<
+/D [1309 0 R /XYZ 124.802 247.723 null]
+>> endobj
+1297 0 obj <<
+/D [1309 0 R /XYZ 124.802 203.887 null]
+>> endobj
+789 0 obj <<
+/D [1309 0 R /XYZ 124.802 160.052 null]
+>> endobj
+1308 0 obj <<
+/Font << /F36 457 0 R /F8 453 0 R /F39 504 0 R /F32 450 0 R /F63 1316 0 R /F33 447 0 R /F38 464 0 R /F7 627 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1333 0 obj <<
+/Length 581
+/Filter /FlateDecode
+>>
+stream
+xÚµ”MoÛ0 †ïù¾MfÚ%KìNÖÛ©X\`h×Cš8©Ñ¦.lµÝÇŸ¹M—¤Ã†a "õ’¢žD&d"•W¨Äêˆ\2[ŠdÉ¡ñH)¨¬ Þž`öe\IÏsÞU£üÈ%TbR-Ö'ªù™8“ö<=¯>Ž«'i@“Ý_C9C/IVͪõ—©râ[š©’Ä}jJ1½‰ÎišÉàH1÷¼@(ž¡ÚèPHƒÖñ$¤W©u¢kfWýAši,ÄqÛûɬkn=‹‰ÕtÖ¥F‰6d÷qoÁêmíq}Swì7³èW¡j"] ˆI¦@j³.w¸Þçë;“lv?¿I3”$NúµÈ«~•)§@&ɤ21u|ªÌëx«gÃQ¬ÃáV¯YQH"„íáÇ–O¢<çé–I4> É3Úý¥÷·yîë¯pÝvÍݶ> ÝzÜ—^r§¹LZ-œ¬Ê?#Ìý_ÂøkC;§Ó›9¿B@CÑ€ZŒ¼¯a£éct쮽[“˜)‹âC÷!¯ ë˜wÌö¤JŠ#eÅU¿^…ŠÌc£œ|´B‹Ô0‘a™ú>ømøPš„4_
+S /ò@!ý°³
+ é_°SÚñS–)½Ë”á™ÚcêááüÝÚn™W'|ñE;õùÛÎ7³ëºÏý…4÷Pd[kÿbÃ[Õƒæm¿C–6`¨g=þ=Èÿ›:äÜ}hÉR:ý{¸¤²;¸ZþѨ-^K$Iendstream
+endobj
+1332 0 obj <<
+/Type /Page
+/Contents 1333 0 R
+/Resources 1331 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 1336 0 R 1337 0 R 1338 0 R ]
+>> endobj
+1336 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [203.266 690.964 304.635 702.088]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://tex.loria.fr) >>
+>> endobj
+1337 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [200.271 659.083 469.509 670.208]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/TUGboat/Articles/tb15-3/tb44tvz.ps) >>
+>> endobj
+1338 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [0 1 1]
+/Rect [144.285 647.128 156.738 655.624]
+/Subtype /Link /A << /Type /Action /S /URI /URI (http://www.tug.org/TUGboat/Articles/tb15-3/tb44tvz.ps) >>
+>> endobj
+1334 0 obj <<
+/D [1332 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1335 0 obj <<
+/D [1332 0 R /XYZ 124.802 716.092 null]
+>> endobj
+1295 0 obj <<
+/D [1332 0 R /XYZ 124.802 687.975 null]
+>> endobj
+1331 0 obj <<
+/Font << /F8 453 0 R /F32 450 0 R /F39 504 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1342 0 obj <<
+/Length 2727
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ks"G¾ëWp„+·ÞãÈëu¬/û°v/¶ ôhØE …vŒÆþó›ÕÝ  T¶ºU€1è†Îú2ëˬ¬¬„÷þã=.8&zV1ðÞõF7¬÷€—¾¿áÕ-RI°<üUsñvuõ¿È3Sw+/ÚââÝýÍŸþ"M+Êôî?7Ýêÿu6Ξ¿ÜÿpóÝýÆg9¦}í÷‚F‰o…ç
+ÉÿwóÓ/¬7Ƹa ñâ|Í€{ß{¼à¯þšÞüxóõUWÖ⹞oä¦p÷ƒ[)eÿg¦ÙhpËûóÇÇál<àáþÍ®ÔÆ€âv…XxgñP]úç÷Ÿaýî÷”·ÔoÃE‹ÃçàñYGdŽƒ ×æŸ_‚onŒ% ßÙ‹7À y,’GŒåЇ÷ñ†¦Šà(pr!€»ðñÔ†€'ïÿ{àd¸˜àËáÇi¶Ü
+QÙ
+b ÎðÚAˆ¹TÀ™'ÐÖ P4ÄXƒ`²cŒµ!m…±>ñy€t6.|ˆ¸/-X±‚7 {l*l™îf`cë#Ô»…í‹ýF`û¯e°[¼ º&¸5ª+£ÝG•kpÞ§Eµ+xN²XØUF¡:<̈âÅKLƒù.ëe¸¢úó'|'ŸÌg‡ÌÕá œŒ«IŽ«yjßý,† ŽŒ‚e$ÕJ ¬Ríì!h2+uXhwº¡V‰jÍùÏgµ:õ AT’¦?Ç(Õp4óÙ¬|#‚Â:«Q0VÎ-HI6%hŽÂâózd¼ÿ½„W[Å,+^¯RŒRx1J®$Ó·âízKŸJµ9'ÑÆ<h·5c²´¬Š"{ÍÚlúœíÁ€ !·ÞøA7kh³š÷ïpþ2sÂöÃÈ[åŸ ß(žÚð•ï†ß½á¯GkrçI#º39¼bhm¾cg¢ð!\D9“ÍÁþD)¹?§Ê†Kǃ€IŸx2á°98&Z²NoÉü ,¹ P¥Oh¸ã]ç—¬óÇݤÞÖœ®ûc2 +y×ñ/ëcGhJè5¯ùIè„Kk­„Tdt‡îÞeqÉ' 5È´aéh" ,P£Ô‡<½ŠÉq©V£Sšllè3Š+IéAåÁEæ±!Ù:ÛÿÒÎnolºÂÒ÷…›NºÂb(yÂÐ6Ð9;#oÌ““‹’yãe‘P 9TÞÿÛÇÁ­Öýÿlå¤w6RöMŒ¡û¢û/.’çNEz8W$ŸÁ‘P„U1 ©¥fEÅ*\»‡åN+íJ‰3MöNR‚,Ïà.ÆN?„m¿</6û>†1åY™Ƨõ8Þ.ôúkÂýhÉȤsüßõçÓl8+ö²Ãð5_§“e^“-–VlŠÒá¶vKº¥pêS¹¨MÀQ Û8ÛýzÁ@¨jOú5踳A§cH±‚Ö e¤‚¦óÅ)ƒÖÝ®~½²š˜²kGYk00¢p:
+©|1œ-?…
+eœ
+yåçTéå×W›åñÀåu&+8wÀYÔóÃódþ¸½ YdëÏtjð¶ãmH‹Ï®:Ó鎉~w·}åðö© =ú–túãYúJ*N«¤ò¤Žr„ämaô±êµ[žVÅŠ‡Ä
+æ4Ìó ˤÚÝ®7*†u=‘%®¹…# ¹g‹Í’‘†§š„Áº)OÛœn¨ƒ+ö[OŒP•XG†‡ž[˜®‡§UQ‹±æ¸+JÍž÷¥o²Z]¹jx'׊ڣG ßä¤dú£ñ&}Á‘ÑÉE ùæ@ Ò{
+¹vÍûãì)¯ÖšµáÒ©Y{ñG h§â VwÐþœM> ¯Á­²ì`¥²ñ×zã Ÿä¤î(q• ªÚ)cñøŒ¸CÃ;c)«P«9ÐV•<GzY– "­ñ4[mÑNÑãò»¨ —»§²[Ê·“Åhº…ïéÒ^¦b×4pÕe´¦ å»Ç§¼ˆØCã6ƒ˜¨Î$D{rgAk¹¢ð!$õÔÖ^ŸìÂ$Úšéx,<”bÅyà"2
+“ú¿A3Y>É!{¡ÿ”ÄU!› è=§Y>DFYÞÇ|åÇžI
+²¸2åôJ$Îu.‹H^ŒÆåB÷ËówÛçÔOø6æHµÔ³ËT\š}—bc—TÉ‚Þ©Äñ38¾ài‰ ÆÚ˜ð`T@Iph§;Žpð*®J‡PzØÀŠ“¢ñ ßíc#¼ˆéø‚LïOdT»Ê¬¶í¬7_#ÙÛKM¡¨¸}þoËy]6˜ª–4¤”}ªj&¿²è]M³…Æ{*z*ã€QûOÕ¨ c‡­ )÷!ñqÍ¥ö¸¦.uÌœl‡Aþh+ƒx\Eå`ÿ<,
+öµ%Xz‡›^[Ž6YqF)ÂÀÇϵ­ž£M›†µá«´n±™&=
+>9
+–%GÁŠä(¸3:lïÒ·¾ñ‚”¿­ª"H 9ìkhZ¼Od¨6¯Û!²æ–£èíÛ&²&"˜ô"øvYDI‘šÈšˆ ’‹pþDö¶µ<¤LWAdq'vÇÙþŠHƒ2í(ìMÙÞ‰3hÕ会¤z :ÎïeÓb ý˜U'"&¿ç;÷ר¸0iÉ·t´ „ã¸@ŒÁíÓ0$槓õ&z±ºÕæ#”EOÏAÙ‘8Ê*P–Ç7+ªp×à-Ë=Ãi[vwqØEÛÝÏŒ«ùš…oûÉ ÌÓ7µT»4ë =Ã’ç*M˾MPðÉEh7Xm&‚8£H1½]ºô¥‰/[4<Õ‹mM¨Ùø›šã L´Ä¦Í»½{OömÿR®ŽÐ›¡à“‹`Yr[¸BÃÐðÐߢF†¸¬ÆèÚÊØ0=¯ÝÓ ü%þvà«væZâó3Øñ6¶ãíÊ\q&«Ã–÷Ӿ͖%3מûÙʱÏ_µ´åá‰Úu¸– ühj7Kï˜úÇmÍPhy÷»öŒ¶K¬¸Œâ•÷˜i·SQ'~6 m\¶H Z¹´a‹IozÞ6¥Jz‘«ly¼Ú_«7°…v#’WRjz>{gõ‹duÉ$H†!½T༭m–cÈUEñá_ùpû¥Ne‰­ÿÑJêendstream
+endobj
+1341 0 obj <<
+/Type /Page
+/Contents 1342 0 R
+/Resources 1340 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R ]
+>> endobj
+1344 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [193.81 667.8 205.765 679.756]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1345 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.973 645.883 231.928 657.838]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1346 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.024 645.883 247.979 657.838]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1347 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.914 633.927 269.869 645.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1348 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [273.08 633.927 285.035 645.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1349 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.859 621.972 269.814 633.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1350 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [273.024 621.972 284.98 633.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1351 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [239.705 610.017 251.66 621.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1352 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [255.756 610.017 267.711 621.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+1353 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [213.027 598.062 224.982 610.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1354 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.078 598.062 241.033 610.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.68) >>
+>> endobj
+1355 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [244.022 598.062 255.977 610.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1356 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.687 586.107 226.643 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+1357 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.144 574.152 253.099 586.107]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1358 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.539 562.196 259.494 574.152]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1359 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 562.196 275.238 574.152]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+1360 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 550.795 175.611 561.145]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+1361 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 550.795 191.662 561.145]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1362 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 550.795 212.695 561.145]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1363 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.447 538.286 259.402 550.241]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1364 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 538.286 275.238 550.241]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+1365 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 526.884 175.611 537.235]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+1366 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 526.884 191.662 537.235]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1367 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.455 514.376 266.41 526.331]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1368 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 502.421 277.452 514.376]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1369 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 491.019 175.611 501.369]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1370 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 491.019 191.662 501.369]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+1371 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 478.51 277.452 490.465]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1372 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 467.109 175.611 477.459]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1373 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 467.109 191.662 477.459]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+1374 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.637 454.6 247.592 466.555]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1375 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [246.086 442.645 258.041 454.6]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1376 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 442.645 275.238 454.6]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1377 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 431.243 175.611 441.593]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1378 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 431.243 196.644 441.593]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1379 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [245.971 418.734 257.926 430.69]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1380 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 418.734 275.238 430.69]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1381 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 409.27 175.611 417.683]
+/Subtype /Link
+/A << /S /GoTo /D (page.49) >>
+>> endobj
+1382 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.785 394.824 260.74 406.779]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1383 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 394.824 277.452 406.779]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1384 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 383.422 175.611 393.773]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1385 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 383.422 191.662 393.773]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+1386 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [226.034 370.914 237.989 382.869]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+1387 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.085 370.914 254.04 382.869]
+/Subtype /Link
+/A << /S /GoTo /D (page.22) >>
+>> endobj
+1388 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [258.136 370.914 275.072 382.869]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1389 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.861 358.959 224.816 370.914]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1390 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.255 335.602 235.21 346.45]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1391 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [173.054 323.647 185.01 334.495]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1392 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.105 323.647 201.061 334.495]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1393 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.553 311.691 222.508 322.54]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1394 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.286 299.736 212.241 310.584]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1395 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.337 299.736 228.292 310.584]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1396 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.085 287.781 211.04 298.629]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1397 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [203.33 275.826 215.285 286.674]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1398 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.113 263.871 236.068 274.719]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1399 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.365 251.916 213.32 262.764]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1400 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.678 239.96 218.634 250.809]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1401 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [183.93 228.005 195.886 238.853]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1402 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.962 216.05 231.917 226.898]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1403 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.214 204.095 209.169 214.943]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1404 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.186 192.14 224.141 202.988]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1405 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.437 180.185 201.393 191.033]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1406 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.488 180.185 217.444 191.033]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1407 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.52 168.229 247.476 179.078]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1408 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.482 156.274 226.438 167.122]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1409 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [204.492 144.319 216.447 155.167]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1410 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.744 132.364 193.699 143.212]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1411 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.795 132.364 209.75 143.212]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1412 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.795 120.409 209.75 131.257]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1413 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [213.846 120.409 225.801 131.257]
+/Subtype /Link
+/A << /S /GoTo /D (page.58) >>
+>> endobj
+1414 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.235 668.354 433.19 679.202]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1415 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.071 655.845 391.026 667.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1416 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.404 633.927 376.359 645.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+1417 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.455 633.927 392.41 645.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1418 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.505 633.927 413.442 645.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1419 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [442.461 621.972 454.416 633.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1420 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [436.301 610.017 448.256 621.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1421 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.361 598.062 469.316 610.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1422 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.309 586.107 374.283 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+1423 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.379 586.107 390.334 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+1424 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.43 586.107 406.385 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1425 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.481 586.107 422.436 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1426 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.532 586.107 438.487 598.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1427 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 574.152 466.742 586.107]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1428 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 564.687 364.902 573.1]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1429 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 550.241 466.742 562.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1430 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 540.777 364.902 549.19]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1431 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.734 526.331 406.69 538.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.10) >>
+>> endobj
+1432 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.068 514.376 451.023 526.331]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1433 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [455.119 514.376 467.074 526.331]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1434 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.788 502.421 436.744 514.376]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1435 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [445.793 490.465 457.748 502.421]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1436 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [416.182 478.51 428.137 490.465]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1437 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.569 466.555 443.524 478.51]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+1438 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.413 454.6 403.369 466.555]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1439 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.506 432.682 445.461 444.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1440 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [449.557 432.682 461.512 444.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1441 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.778 420.727 387.733 432.682]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1442 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.829 420.727 408.765 432.682]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1443 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.681 408.772 413.636 420.727]
+/Subtype /Link
+/A << /S /GoTo /D (page.10) >>
+>> endobj
+1444 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.117 396.817 438.072 408.772]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+1445 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.835 396.817 453.791 408.772]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1446 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.554 396.817 469.509 408.772]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1447 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [360.142 373.46 372.097 384.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1448 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.193 373.46 388.148 384.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.68) >>
+>> endobj
+1449 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.137 373.46 403.092 384.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1450 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [361.802 361.505 373.757 372.353]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+1451 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.104 349.549 397.059 360.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+1452 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.155 349.549 413.11 360.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1453 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.206 349.549 429.161 360.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1454 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.752 337.594 379.707 348.443]
+/Subtype /Link
+/A << /S /GoTo /D (page.74) >>
+>> endobj
+1455 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.803 337.594 395.758 348.443]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1456 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [351.128 325.639 363.083 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1457 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.404 325.639 380.36 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1458 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.681 325.639 397.636 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1459 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.957 325.639 414.912 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1460 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [420.234 325.639 432.189 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1461 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.51 325.639 449.465 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1462 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 325.639 466.742 336.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1463 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 313.684 364.902 324.034]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1464 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 313.684 380.953 324.034]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1465 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [350.416 301.729 362.371 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1466 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.811 301.729 379.767 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1467 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.206 301.729 397.162 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1468 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.601 301.729 414.557 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1469 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.997 301.729 431.952 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1470 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.392 301.729 449.347 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1471 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 301.729 466.742 312.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1472 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 289.774 364.902 300.124]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1473 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 289.774 380.953 300.124]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1474 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [358.481 277.818 370.436 288.667]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1475 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [374.532 277.818 386.487 288.667]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1476 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.583 277.818 407.52 288.667]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+1477 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.615 277.818 428.552 288.667]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1478 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.148 265.863 400.103 276.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1479 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.199 265.863 416.154 276.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1480 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [381.478 253.908 393.434 264.756]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1481 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.529 253.908 409.485 264.756]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1482 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.148 241.953 400.103 252.801]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1483 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.199 241.953 416.154 252.801]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1484 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.119 229.998 384.074 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1485 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [389.05 229.998 401.005 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1486 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [403.994 229.998 415.949 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1487 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [420.925 229.998 432.88 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1488 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.856 229.998 449.811 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1489 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 229.998 466.742 240.846]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1490 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 218.043 364.902 228.393]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1491 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.89 218.043 379.846 228.393]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1492 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.941 218.043 395.897 228.393]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1493 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [399.992 218.043 411.948 228.393]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1494 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [360.049 206.087 372.005 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1495 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.008 206.087 387.963 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1496 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.967 206.087 403.922 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1497 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [406.911 206.087 418.866 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1498 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [422.869 206.087 434.825 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1499 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.828 206.087 450.783 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1500 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 206.087 466.742 216.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1501 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 194.132 364.902 204.482]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1502 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 194.132 380.953 204.482]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1503 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 194.132 397.004 204.482]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1504 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 194.132 413.055 204.482]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1505 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.15 194.132 434.087 204.482]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1506 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [348.519 182.177 360.474 193.025]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1507 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.57 182.177 376.525 193.025]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1508 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.514 182.177 391.469 193.025]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+1509 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.565 182.177 407.52 193.025]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1510 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.615 182.177 423.571 193.025]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1511 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 170.222 364.902 181.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1512 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 170.222 380.953 181.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1513 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [386.543 158.267 398.498 169.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1514 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.309 158.267 416.265 169.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1515 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.253 158.267 431.209 169.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1516 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.02 158.267 448.975 169.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1517 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 158.267 466.742 169.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1518 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 146.312 364.902 156.662]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1519 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 146.312 380.953 156.662]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1520 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 146.312 397.004 156.662]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1521 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 146.312 413.055 156.662]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1522 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [370.569 134.356 382.524 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1523 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [387.888 134.356 399.843 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1524 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [405.206 134.356 417.161 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1525 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [422.524 134.356 434.48 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1526 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.468 134.356 449.424 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1527 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 134.356 466.742 145.205]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1528 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 122.401 364.902 132.751]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1529 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 122.401 380.953 132.751]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1530 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 122.401 397.004 132.751]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1531 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 122.401 413.055 132.751]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1532 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.15 122.401 429.105 132.751]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1343 0 obj <<
+/D [1341 0 R /XYZ 124.802 740.998 null]
+>> endobj
+425 0 obj <<
+/D [1341 0 R /XYZ 124.802 681.25 null]
+>> endobj
+1340 0 obj <<
+/Font << /F36 457 0 R /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1535 0 obj <<
+/Length 3049
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ks7¾ëWð(V­°x?Ž–c'•ÍÖ:ŠâK’Ȥ%îò¡%ǶìýóÛÀ”äiôhF mVªR’I z`=
+ÿ±ã’XÊ{FRâœí ¦'´w ýxÂV_RÃüo‘χO­†àAÚùïœ_žüýµí9â´è]¾ ß¼þqúnÑg§Å´ÆNG˲Ïíé§Éèoý¿.>yu¹y¢â°_¯æÿeq½úèâÇ­ÏòËçT_yDô¶?®Ñ` 5K‚¦1x ÿûòo%qÍmÚæ‚@“à²o„¡m’pƃ#"üÄ)…¤…?A(j´hB­Ã²ÃÒ¶I°hT›;ÒˆÇHØì¹Á“ìá–§(µã!üRÞÔuš&’š¼:M+y;:M<A§±¼:­\v:Õiú¨Ó ²“àR6¢N»)& ÇÆ׳™‚ â‚e•;0V)K4`ÙVy{ÜZ p[ç%¦–´Ù fÛJ¯ l (›Í‰i›6† Ž&#¿g…ßÁþ£°‡5Ò¥#Êá¶ÉÎ>cc;&a„ˆQC µIR´Œw®ˆbh©uþãnŽÂr8F½[_>‡v—rÛ¡á`ä˜zˆ&·=ú—b¸¢Q³B!m'@pC¨„5’Ðd4ó®Üð®N¦"L¢]9+¯n8¥5–©ÅðÃ5ÀEÖ-¥Ö`"‰ÔeY,J¿¯õm•”pÆ:‰kÜ£JJ˜I¢tZ”‹ñ:›÷Ï
+e_@D’´Ýz·u४|?.Fáç¹÷fç‹zT΀æ@«r¾XFTn³ÎeTÚžqs:ϼCVŽ†ï|tuK *Ûqž×
+cC6$4o“OÓbqíC„gŠƒÖXZ`6ZÃiGõb;”D*Ù1„5ÒðÍâªâ¬—Ç»š
+ŠRkÐ$c±8b¬ìŽ
+XC&)—…7¦†r>Þ1‘œh›„™—7á”ÀA5§ëÅëlÞƒâq¹Í›lD‚r{ZØÀŸÀ×N<œ?çFìaÃ1^øÍ6<Ò§ýìö¥,
+‡\h=Ù‡'aÿ+ŽÊí›Qnåb4ú\ŠñmÔÕD)¼
+ï~XÝ…ÂŽ>Á¯g{VÑnÄ° foŽ^$ZÍ0¡ˆ°I°îå¤XVjféWè1ø¿Wèþ+/ª/ø Êt}ÊÊñ<ªÇ (8#›Åc-.OkˆcIòÅ7ói´4zÕóI»$Œ¤I€èü<J¤OÒR´%çù]²Ö££ NΘÁ¸KB ç!¶}5{^°ñ á`t†È6(‡ÍN í¦ÉšÐrÖÖâë}…ÍN‚n -yð,ùJ­¾½<OGÍ0ß|”qŽ‹'
+õ›06¦êU,®ã¤Ô
+ê!Î]Ö2i8ÏÛgˆT‹]‘ê¤>Ó·,…XÞ?ªîªº7¯}j¼øÏÿÖY툦¬—³b³êDG%Z¤ñq¿#þ®Û̈U„ñ$p>XÍ!÷qÿ]õÏ”:ýwÿLqú'UtP•ÞO /CøV{ç' ¢µ²Åú*mvé`Õ’8ŠÕáKý´aiš¬CéÛ–÷<+Ê*‰rå}×reš¯‰¡øQHùíCÒÀ’rhlÚÆ'Åbú@ôBxÉËÝl4=+á£ùº…%ÊW.¥Á+s‰lÑE6ÙQðV/@(9_¨ÙlÝ/»z-ÿÑüAgNüÍ#L¢Cj’µ[©À)ºúJ¡†N2¥ÃTÃt‘9À܇2±ö«ÒÊÇ<ö Ž6æëñÙ²ä±"V¹d/oƒR]³ôLývKcDZ2¢]fv?­®Çwéˆe"•í7k51¾¾ésïô6%"Ž—¡]nvdwÝ_UÓcÏÑ72rÙŸ­RÍ9À——ÍÍl;Î
+JK„H–æõítíXBá¾K¨x¢%œÌÂ/ŠêfÓñ²Œ 7R=S×"ví@à­,ô†4?èå|\ÊÓYFÜÅ ûS&.……—™'ÜŠvBÃÛ4ðʦçbèÏr(å)Ê›hÙ‘ Tàgaå×Â"SÐt3ÄX£Xâ<ÅÂÛëâj2ª׶ (øìØÌòHßÞ†S²ØýVpƒº¾ñȨˆ\zêÙ×à"g›=Ð#JÃyö¥i¸Š}¿WãV[§91Zõ²¶7K» "²Öc’\ ÕjúÑ:D»§:‰¯ŸÈ_yÀ÷ [%quƒš°$\´¹=¡ÊÒŒËzìßEÑÒÎP×=K¤N²ç·•q¨y£q~«Ž•Š†5x’J^üjz»êyÚR—c\“Q‚Üâ*l!{×ivŠwK®‚Y’æ¾
+·|¼W r\’Ñw”&õè/Aqí(Ï­7ÃÀi÷L\•kï.6݋ድîì©5Mñ¡Â™‹¨x„Ä_#‡SÖH UDò51ø-ñå—¸¤Œ‚5Òæá ý°cYùúõ
+0ºÎ“wèP]Oæ~&_1‰U ­/Þëpýµ: Í#ð1룬„ùí*@»ÉÇÓëx8¹´i7Je&Ätjk3¢ŸáÝ71¸Ø=©FóÎ%mäÚQHBó×fºß(„¶ivø¦µ‹$:­ í(8·…•š~aþæ/‘ST¼~‹
+¸},ÍU8ŠÊ²\„ÜØuì¶ùu-Õ·¬WüÐ)SÀy~a™¬Š#ÒBI ËÛ6€.뜎ü2c ¥b‹2ËL^ »Óuta‹YZßåw/'5¬û½]!A¹øªJÅF~hгk ·=ùPï 5¾×Ø>^øÿs1~endstream
+endobj
+1534 0 obj <<
+/Type /Page
+/Contents 1535 0 R
+/Resources 1533 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R 1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R 1680 0 R 1681 0 R 1682 0 R 1683 0 R 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R 1741 0 R 1742 0 R 1743 0 R 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R 1749 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R ]
+>> endobj
+1537 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.443 703.195 208.398 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1538 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.48 703.195 226.435 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1539 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.424 703.195 241.379 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1540 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.46 703.195 259.415 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1541 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 703.195 277.452 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1542 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 691.24 175.611 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1543 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 691.24 191.662 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1544 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 691.24 207.713 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1545 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 691.24 223.764 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1546 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.138 679.285 212.093 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1547 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.943 679.285 228.898 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1548 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.887 679.285 243.842 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1549 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.692 679.285 260.647 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1550 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 679.285 277.452 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1551 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 667.33 175.611 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1552 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 667.33 191.662 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1553 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 667.33 207.713 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1554 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 667.33 223.764 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1555 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [176.386 655.375 188.342 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+1556 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [192.437 655.375 204.393 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1557 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [174.505 643.42 186.46 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.68) >>
+>> endobj
+1558 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.555 643.42 202.511 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1559 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.606 643.42 218.562 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1560 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [193.323 631.464 205.278 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.77) >>
+>> endobj
+1561 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.374 631.464 221.329 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+1562 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [225.425 631.464 237.38 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1563 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.476 631.464 253.431 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1564 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [169.246 619.509 181.202 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1565 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.297 619.509 197.253 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1566 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.348 619.509 213.304 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1567 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.399 619.509 229.355 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1568 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.45 619.509 245.405 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1569 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.501 619.509 266.438 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+1570 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [177.078 607.554 189.033 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1571 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.877 595.599 190.832 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+1572 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.928 595.599 206.883 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1573 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [170.381 583.644 182.336 594.492]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1574 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [183.941 571.689 195.897 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1575 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.748 559.733 232.703 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1576 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.471 547.778 232.426 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1577 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [173.065 535.823 185.021 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1578 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.116 535.823 201.072 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1579 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.167 535.823 222.104 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+1580 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.348 523.868 213.304 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+1581 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.399 523.868 229.355 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1582 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.343 523.868 244.299 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1583 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.035 511.913 207.99 522.761]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1584 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.086 511.913 224.041 522.761]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1585 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.107 499.958 211.062 510.806]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+1586 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.185 488.002 190.14 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1587 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.732 476.047 211.687 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1588 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.783 476.047 227.738 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1589 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.27 464.092 197.225 474.94]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1590 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [171.516 452.137 183.471 462.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1591 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [166.451 440.182 178.407 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1592 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [182.63 428.227 194.585 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1593 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.61 428.227 211.566 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1594 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.591 428.227 228.546 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1595 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.535 428.227 243.49 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1596 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.516 428.227 260.471 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1597 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 428.227 277.452 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1598 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 416.271 175.611 426.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1599 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 416.271 191.662 426.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1600 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 416.271 207.713 426.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1601 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 416.271 223.764 426.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1602 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.462 404.316 214.417 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1603 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.492 404.316 230.447 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1604 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.436 404.316 245.392 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1605 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.466 404.316 261.422 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1606 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 404.316 277.452 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1607 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 392.361 175.611 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1608 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 392.361 191.662 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1609 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 392.361 207.713 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1610 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 392.361 223.764 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1611 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.288 380.406 192.244 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+1612 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.339 380.406 208.295 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1613 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.39 380.406 229.327 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+1614 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.974 368.451 201.93 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1615 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.025 368.451 217.98 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1616 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.076 368.451 234.031 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1617 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [238.127 368.451 250.082 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1618 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.178 368.451 266.133 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1619 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.295 356.496 220.25 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1620 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.345 356.496 236.301 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+1621 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.396 356.496 257.333 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+1622 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [261.429 356.496 278.365 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+1623 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.018 344.54 219.973 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1624 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.069 344.54 241.005 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+1625 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.324 332.585 190.279 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1626 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [175.556 320.63 187.511 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+1627 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.607 320.63 203.562 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1628 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [174.505 308.675 186.46 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1629 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.555 308.675 202.511 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1630 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [168.97 296.72 180.925 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1631 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.021 296.72 196.976 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1632 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.072 296.72 213.027 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1633 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.123 296.72 229.078 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1634 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.174 296.72 245.129 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+1635 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.224 296.72 261.18 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1636 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.68 272.809 213.636 283.547]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1637 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.6 260.854 190.556 271.592]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1638 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.933 248.899 175.888 259.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+1639 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.984 248.899 191.939 259.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1640 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.035 248.899 207.99 259.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1641 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.086 248.899 229.022 259.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1642 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [168.598 236.944 175.572 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+1643 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.427 236.944 188.401 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+1644 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.256 236.944 206.211 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1645 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.066 236.944 224.021 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1646 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.876 236.944 241.831 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1647 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.686 236.944 259.642 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+1648 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 236.944 277.452 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1649 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 224.989 175.611 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1650 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.6 224.989 190.555 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1651 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.651 224.989 206.606 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1652 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.702 224.989 222.657 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1653 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [226.753 224.989 243.69 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+1654 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [175.307 213.034 187.262 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+1655 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.358 213.034 203.313 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1656 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.409 213.034 224.346 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1657 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.474 201.078 209.429 211.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1658 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [174.449 189.123 186.404 199.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1659 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.5 189.123 202.455 199.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1660 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.551 189.123 223.488 199.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+1661 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.404 177.168 198.36 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1662 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.794 165.213 190.749 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+1663 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.845 165.213 206.8 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+1664 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.896 165.213 227.832 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1665 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.928 165.213 248.865 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+1666 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [252.961 165.213 269.897 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+1667 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 153.258 202.732 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.9) >>
+>> endobj
+1668 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.274 153.258 218.229 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+1669 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [221.772 153.258 233.727 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1670 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [237.269 153.258 249.224 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1671 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [252.767 153.258 264.722 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1672 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [268.264 153.258 280.219 163.995]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+1673 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [174.311 141.303 186.266 152.04]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1674 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.255 141.303 201.21 152.04]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+1675 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.306 141.303 217.261 152.04]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1676 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [173.481 129.347 185.436 140.085]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1677 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [182.917 117.392 194.873 128.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1678 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [198.968 117.392 210.924 128.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1679 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [369.025 703.195 380.98 713.933]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+1680 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.076 703.195 397.031 713.933]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1681 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.127 703.195 413.082 713.933]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+1682 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.652 691.24 396.588 701.978]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+1683 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [374.117 679.285 381.091 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+1684 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.187 679.285 397.142 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1685 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.238 679.285 413.193 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+1686 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.289 679.285 434.225 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+1687 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [365.012 667.33 376.968 678.067]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1688 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [381.063 667.33 393.018 678.067]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+1689 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.114 667.33 409.069 678.067]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1690 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.058 667.33 424.013 678.067]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+1691 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [371.239 655.375 383.194 666.112]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1692 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.346 643.42 384.301 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+1693 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.797 631.464 404.752 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1694 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [363.463 619.509 375.418 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1695 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.514 619.509 396.45 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1696 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.546 619.509 417.482 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+1697 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.861 607.554 409.817 618.292]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1698 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [413.912 607.554 425.868 618.292]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1699 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.963 607.554 441.919 618.292]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+1700 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [359.691 595.599 366.665 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+1701 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.219 595.599 379.193 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+1702 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [384.748 595.599 396.703 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1703 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.257 595.599 414.213 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1704 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.767 595.599 431.722 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1705 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.277 595.599 449.232 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+1706 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 595.599 466.742 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1707 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 583.644 364.902 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1708 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 583.644 380.953 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1709 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 583.644 397.004 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1710 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 583.644 418.036 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+1711 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [422.132 583.644 439.068 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1712 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [443.164 583.644 460.1 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+1713 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [363.601 571.689 375.556 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+1714 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.652 571.689 391.607 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+1715 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.703 571.689 407.658 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+1716 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [362.771 559.733 374.726 570.471]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1717 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.621 547.778 409.595 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+1718 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [413.691 547.778 425.646 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1719 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.208 535.823 384.163 546.561]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+1720 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.259 535.823 400.214 546.561]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1721 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.706 523.314 421.661 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1722 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.26 511.359 404.215 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1723 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.311 511.359 420.266 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1724 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.871 499.404 451.826 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1725 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [444.242 487.449 456.197 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1726 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [459.408 487.449 471.363 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1727 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [443.827 475.494 455.782 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1728 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [458.992 475.494 470.948 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1729 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 463.539 466.742 475.494]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1730 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 454.074 364.902 462.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1731 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 439.628 466.742 451.583]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1732 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 430.164 364.902 438.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1733 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [435.415 415.718 447.37 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1734 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [451.466 415.718 463.421 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1735 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [444.492 403.763 456.448 415.718]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1736 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [459.658 403.763 471.613 415.718]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1737 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.759 391.808 441.714 403.763]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+1738 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [349.891 368.451 361.846 379.188]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1739 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.054 356.496 388.01 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1740 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.105 356.496 404.06 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1741 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.988 344.54 427.943 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1742 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [432.039 344.54 443.994 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1743 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.933 332.585 427.888 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1744 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.984 332.585 443.939 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1745 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.786 320.63 407.741 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1746 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.837 320.63 423.792 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+1747 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.115 308.675 394.07 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+1748 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.166 308.675 410.121 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.22) >>
+>> endobj
+1749 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.217 308.675 431.153 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1750 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [361.525 296.72 373.481 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.10) >>
+>> endobj
+1751 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.579 284.765 403.535 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1752 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.584 272.809 424.539 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1753 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.973 260.854 394.928 271.702]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1754 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.36 248.899 410.315 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+1755 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [358.205 236.944 370.16 247.792]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1756 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.472 224.989 380.427 235.837]
+/Subtype /Link
+/A << /S /GoTo /D (page.10) >>
+>> endobj
+1757 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.497 213.034 388.452 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1758 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [461.894 201.078 478.83 211.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1759 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [450.077 189.123 467.013 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1760 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [462.752 177.168 479.688 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1761 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [446.203 165.213 463.139 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1762 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [453.121 153.258 470.058 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1763 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [456.082 141.303 473.019 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1764 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [444.265 129.347 461.202 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1765 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [456.94 117.392 473.877 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1536 0 obj <<
+/D [1534 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1533 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1768 0 obj <<
+/Length 2817
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ks¹¾ëWèHVÙÞãzcoÕf7ÞØÊ^6{ È±ÌÔPTFT,ûק!)Jƒ¡Ð£‡t¥\å"E‰èwh4zØ9…ìœqI,åçFRâœ=Ÿ.Îèù|ôÓ[ÿŠ‚æßE>|-8|j5¼€/ÒÎÿΛ‹³¿¼³çŽ8-Î/>…ß¼˜ý1šÿ¢L^Ù¨ÿyñóÙÛ‹í×pM¨²õÿ9ûãOz>ƒ¥~>£D
+5ß(Øÿ¤ºZôá§ÖïcÌ48‘ÄIÙb)Œs"˜„Œ8¥þo){–¿]UsÏþUcuE”5°•¬> ­ œÙ4[)‹Uñë$$ß¿-ƒÕ¼f£EøÿzÌÝhEŠû›²Á ¬ð`LéÌ8úô‹ü¯ðV³‡Eøšý<'c+FUˆ ¼”kf€[3âØä…µÂòbyŒÑÆ „*ÎÓÔRù`çiþâéoÐË ‘M.Ó ä¶ýqƒ%­}.'AÒáI»±µ$ÚÍS‹?*{è{9~­Ôèßã˜ÑÂßk‡••àƒ«‹QŠŠ¿ÆkÑ~ÎÍhâßVËv¿WŒX!û±xþº~,þ $@ŒGiÑy-vÖo‚þîDKI¤DÇlÁ7a1ÑÊP"•KÊØåöãÜ¿Ÿú—[Òt
++ˆÓ+üôŸf]ß$ˆ~ÉI‚ƒK1…,à^¬V¬‚ý6Ã/—
+©Ë&¡ˆâ~µ>ª]úÿk]FlžA¿³Á»ªDU ` ¡^Bþ/ŧUSöŽhʲž·öhFzèupi“Þ‡ùÕçpâËX¹äýHñ ^—âaIи? `óMþó¦I¸ç’Yô÷
+üa‹qHÈ(KnHXm‡ 7õ¾à¶tƒ¿h‡³ ]ë$³ø.‡Ê^ëS}í,A_˶y0œvº¨~ ÷wqW´ƒ,•Ôh»cÛëÈܲž[Z³›—Ì qø»ÛX 8gH÷laá‡j=`ÃŒ¾úÙÍñ¼K–%g›÷v8úñ£YïÃ>úðáI8‚ɆèÉ Ô¦64LÈW–ÍŽ ©‰qÙY3b${Ý[¶ÞƒE¤Ì ´«Ü|ø©Ai}¢;|ün;ÙQQÆ
+endobj
+1767 0 obj <<
+/Type /Page
+/Contents 1768 0 R
+/Resources 1766 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 1795 0 R 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R 1803 0 R 1804 0 R 1805 0 R 1806 0 R 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R ]
+>> endobj
+1770 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [251.101 703.195 268.037 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1771 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [258.905 691.24 275.841 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+1772 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [261.789 679.285 273.744 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1773 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.996 667.33 262.951 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1774 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [171.156 655.375 183.111 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.16) >>
+>> endobj
+1775 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [187.207 655.375 199.162 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.23) >>
+>> endobj
+1776 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [203.258 655.375 215.213 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1777 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.309 655.375 231.264 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+1778 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.624 643.42 203.579 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1779 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.675 643.42 224.611 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+1780 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.564 631.464 207.52 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1781 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.615 631.464 223.571 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+1782 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.666 631.464 244.603 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1783 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [188.176 619.509 200.131 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1784 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [204.226 619.509 216.182 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1785 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.644 607.554 208.599 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1786 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.648 595.599 229.604 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1787 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [272.709 583.644 284.664 594.492]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1788 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 573.626 175.611 582.039]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1789 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.458 559.733 260.413 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1790 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 559.733 277.452 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1791 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 549.715 175.611 558.128]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1792 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [188.032 535.823 199.988 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.14) >>
+>> endobj
+1793 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [204.079 535.823 216.034 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.16) >>
+>> endobj
+1794 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.125 535.823 232.08 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+1795 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.171 535.823 248.127 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1796 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [252.218 535.823 264.173 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1797 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [268.264 535.823 280.219 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1798 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.87 523.868 214.826 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+1799 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.908 511.913 241.863 522.761]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1800 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.272 499.958 241.227 510.806]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+1801 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.138 488.002 222.093 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1802 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.666 476.047 217.621 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1803 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.831 476.047 232.786 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.19) >>
+>> endobj
+1804 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.996 476.047 247.952 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1805 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [251.162 476.047 263.117 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+1806 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [266.327 476.047 283.264 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1807 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [167.807 464.092 179.763 474.442]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1808 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.921 452.137 230.877 462.874]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1809 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.972 452.137 251.909 462.874]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1810 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.803 440.182 232.758 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1811 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [213.331 428.227 225.286 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1812 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.382 428.227 241.337 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+1813 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.973 416.271 231.928 427.12]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1814 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.024 416.271 247.979 427.12]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+1815 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [252.075 416.271 264.03 427.12]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+1816 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.765 404.316 220.72 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1817 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.352 392.361 221.307 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1818 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [204.37 380.406 216.326 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1819 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.461 368.451 214.416 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1820 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.075 356.496 221.03 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1821 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [175.279 344.54 182.253 355.124]
+/Subtype /Link
+/A << /S /GoTo /D (page.5) >>
+>> endobj
+1822 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.349 344.54 198.304 355.124]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+1823 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [170.575 332.585 182.53 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+1824 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.7 320.63 193.655 330.98]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1825 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.242 308.675 197.197 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1826 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.172 296.72 201.127 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1827 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [175.861 284.765 187.816 295.115]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1828 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.635 272.809 203.59 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1829 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.324 260.854 190.279 271.702]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1830 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.27 248.899 197.225 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1831 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [177.493 236.944 189.449 247.792]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1832 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.823 224.989 197.778 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1833 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.814 213.034 192.769 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1834 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.796 201.078 197.751 211.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1835 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.047 189.123 190.002 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1836 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.098 189.123 206.053 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1837 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.091 177.168 193.046 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1838 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.116 165.213 201.072 175.796]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1839 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [172.844 153.258 184.799 163.608]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1840 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [160.612 141.303 172.567 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+1841 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [182.475 129.347 194.43 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.46) >>
+>> endobj
+1842 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [198.526 129.347 210.481 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1843 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.404 117.392 198.36 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.46) >>
+>> endobj
+1844 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.455 117.392 214.411 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1845 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [362.383 703.195 374.339 713.546]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1846 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.434 703.195 390.389 713.546]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+1847 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.158 691.24 390.113 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1848 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.209 691.24 406.164 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1849 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.259 691.24 422.215 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+1850 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.31 691.24 443.247 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+1851 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [363.49 679.285 375.445 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+1852 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.541 679.285 391.496 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.93) >>
+>> endobj
+1853 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.846 667.33 376.802 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1854 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.897 667.33 392.852 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1855 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.948 667.33 408.903 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+1856 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.999 667.33 429.936 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1857 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [371.792 655.375 383.748 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1858 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [387.843 655.375 399.799 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+1859 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.016 643.42 375.971 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1860 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.346 631.464 384.301 641.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1861 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.397 631.464 400.352 641.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1862 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.448 631.464 416.403 641.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+1863 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [420.499 631.464 437.435 641.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+1864 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.337 619.509 379.292 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+1865 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.388 619.509 395.343 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1866 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [399.439 619.509 416.375 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+1867 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.318 607.554 384.274 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1868 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [366.23 595.599 378.185 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+1869 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.941 595.599 395.897 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1870 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.653 595.599 413.608 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1871 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.364 595.599 431.319 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+1872 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.075 595.599 449.031 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+1873 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 595.599 466.742 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.93) >>
+>> endobj
+1874 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 583.644 369.883 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+1875 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [373.979 583.644 390.915 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+1876 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.614 571.689 379.569 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+1877 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.665 571.689 395.62 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+1878 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.639 559.733 387.594 570.317]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+1879 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.873 547.778 388.829 558.516]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1880 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.829 535.823 405.765 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+1881 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.448 523.868 410.403 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1882 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.977 511.913 390.932 522.65]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1883 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.563 499.958 394.518 510.695]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1884 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.681 488.002 410.636 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1885 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.732 488.002 426.687 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1886 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.783 488.002 442.738 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1887 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.621 476.047 392.576 486.785]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+1888 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.39 464.092 387.345 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1889 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.722 452.137 387.677 462.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1890 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [355.991 440.182 367.946 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1891 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.042 440.182 383.997 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1892 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.093 440.182 400.048 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1893 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [353.223 428.227 365.178 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1894 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [369.274 428.227 386.211 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1895 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.998 416.271 407.935 427.12]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1896 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.407 404.316 432.343 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1897 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.407 392.361 390.362 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+1898 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.458 392.361 406.413 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.22) >>
+>> endobj
+1899 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.509 392.361 422.464 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1900 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.559 392.361 443.496 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1901 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.818 380.406 396.755 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1902 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.227 368.451 421.163 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1903 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.205 356.496 392.161 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1904 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.256 356.496 408.212 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+1905 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.307 356.496 424.263 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+1906 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.825 344.54 404.78 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1907 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.876 344.54 425.812 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1908 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.908 344.54 446.845 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1909 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.233 332.585 434.17 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1910 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [374.145 320.63 391.081 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1911 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.177 320.63 412.114 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1912 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.553 308.675 415.49 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1913 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [376.885 296.72 388.84 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1914 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.936 296.72 409.872 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1915 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [387.705 284.765 399.66 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.25) >>
+>> endobj
+1916 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [403.756 284.765 415.711 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1917 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.807 284.765 436.744 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1918 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.375 272.809 391.33 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+1919 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.426 272.809 407.381 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1920 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.477 272.809 423.432 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1921 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [427.528 272.809 444.465 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1922 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [403.784 260.854 420.72 271.702]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1923 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.585 248.899 399.522 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1924 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [406.994 236.944 423.93 247.792]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1925 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.004 224.989 413.94 235.837]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1926 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.933 213.034 417.87 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1927 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.342 201.078 442.278 211.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1928 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.904 189.123 405.859 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1929 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.757 177.168 400.712 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1930 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.808 177.168 421.744 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+1931 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.692 165.213 395.648 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1932 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.822 153.258 427.777 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1933 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.873 153.258 443.828 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+1934 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [447.924 153.258 459.879 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+1935 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.473 141.303 424.429 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.24) >>
+>> endobj
+1936 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [427.639 141.303 439.594 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+1937 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [442.804 141.303 454.759 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+1938 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.97 141.303 469.925 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1939 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [456.088 129.347 468.043 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+1940 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [445.295 117.392 457.25 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+1769 0 obj <<
+/D [1767 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1766 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1943 0 obj <<
+/Length 2562
+/Filter /FlateDecode
+>>
+stream
+xÚí]Íw"Ç¿óWp„÷¬NW÷q%oüâCìd¹Ù>ÌÂH"< k³ùçSÝ|ˆhÒÅÒ´ût
+²¡BþØ¿¶7ë ×ûÔ¦¸g\úÂÇ58Ð(þ±¡MmŤ…ÂÔÆ5¤¢ÂÝCc©™Eö•­™!nÅál<IØy[œÀAÏ‘°>qþ#зNkŽå)«ï$OÛ…#|3®îÚdvL€+LfÇÀ·Ý
+ï]Š¾à}yú¢!žÀÓ:µç”†²z ÷œIÇ;Ceáz³Ç”T(¯ ƒÆ5´¥þ<¾ûœâ`­Ea‘0L¹<ÏÕׯo/ 3k ÷{ç—ßxw„ëüØáL¢›ö GÑ~èæ_}št>tþñrå•}ëÿ„&@ëÞ¿ú å$ðï yóHI¡”L›,å´!rvêà
+—cuWà·füÅpñ}}[…'ByxÄ”‡iJÈ83 éähF@hÔ$vü¼
+^x"ZGïÍg‚tà 2¢.žšvØ ‘¡R×}xÑzâA2šq̵õÞ ŠcÖž9MÁ<è;Ù
+»šÎo£æ~HîTh²4|‹æ†ÛCàÇõûߥsH0äÜpâ(
+«à
+m¨¤ÃÿÛ4p›ås[ Ó:ÇIæ¹+mZ½C¥/èO\Û Ãféé —¾Ox Ÿƒá Žq}~‰ÎŽð½E5ž^`]À ½QrQ4êÅÓc?­x·¾L Ð9)¹‚ ÁŒë¶¢õŽn.ìÉ71¸Ó§vN¬ÐÞI—UOš/šºzØ—ÖF_—s²³$ÅPͨæ VÑsv\P'×­æJÝ´i'˜¤'¤Îaß%mƒðy®úÓ¯̧Éx¾H¥U=½OKZ#KhÒǪٕk”P«dÊ«ÿ{ÐŽÞ‘#NIDnð \Ce•U¯o‹¹—Åòãl¦ ÃœÌ2܃›vÙ†3eÉî¢Ñ§OCËA±YjζÝnlʦ©ˆfÔd‚¼I=½s"áiÚE©.“w¯É"0ø…·D–†˜ÓÊ2hÞ„—9&c1¬¦©6>i§,Ü'* Y†c…²Ò(tK¡0LÍ™·¹0›áw©´e›+]ƨlŒ—U¸yèoXS¼ãFIŸ‡w/X‰ªÁ”î\Á5„ÍÍÔ¸ÙîºIçQc
+°)Üo
+¸ ^ÔN3‡Ó^À£d{›`Fîã Îàò¨:Jö´RJ[œ÷&ß±
+õÌf8©ÛKƒúrCí0Ôþ8nÝN6úÜdéb8‰°ôFž¹ŠÕ§¯—5¶fž‹Lr­ S!3nQ/ wïáu^ç¹ìé
+Î+§d!Îä8€M¶œ¯{NgÍþ~mTŠÞ
+“n÷ßåì[[
+]4u=]ú¯£µÏ¿~š&}ŽmY©âº¦‡ÇÀ ´ð¬ØóiÙà0®÷õô8º#§Ï†JMìéqyYÆ¥õiFÛýÒÉ =1êö:Ö©d^–å|¾¯õ2_Ón‚]M‰QùKê¢û*oÂöf6Nž6i6í_I)z¿rÍ—™²j>ÇÐn8B1UdoÅIŠzð¸ä>Æô¥‡zõrê®Z¨çí†"ÿ6ä°w¦”c–ÿ˜–ê|—¸’ÊÊ
+n~—j²š>(pú1-õ%ÚqBCuúæÍÏÀ²ÄI1Å„Ï2ãÛ¢{ÒuÒ}Ý·,º/Ê] É*ßTÍp¿Žq«è\’Æ5òFê^¡}—š£=À%=)?½©II)Ì
+endobj
+1942 0 obj <<
+/Type /Page
+/Contents 1943 0 R
+/Resources 1941 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R 1956 0 R 1957 0 R 1958 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R 1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R 2021 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R 2041 0 R 2042 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R 2057 0 R 2058 0 R 2059 0 R 2060 0 R 2061 0 R 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2100 0 R 2101 0 R 2102 0 R 2103 0 R 2104 0 R 2105 0 R 2106 0 R 2107 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R ]
+>> endobj
+1945 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.377 703.195 198.332 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1946 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.306 691.24 202.262 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1947 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [176.995 679.285 188.95 689.635]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1948 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [192.769 667.33 204.725 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1949 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.102 655.375 190.057 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1950 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.458 643.42 191.413 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1951 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.628 631.464 190.583 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1952 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.958 619.509 198.913 629.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1953 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.949 607.554 193.904 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1954 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.93 595.599 198.885 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1955 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.181 583.644 191.137 594.492]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1956 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [182.226 571.689 194.181 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1957 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.251 559.733 202.206 570.317]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+1958 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.328 547.778 208.284 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1959 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [192.742 535.823 204.697 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.11) >>
+>> endobj
+1960 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.793 535.823 220.748 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1961 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.844 535.823 236.799 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1962 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.895 535.823 257.831 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1963 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [187.235 523.868 199.19 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.24) >>
+>> endobj
+1964 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [203.286 523.868 215.241 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1965 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.336 523.868 236.273 534.716]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+1966 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.059 511.913 213.995 522.761]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1967 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.879 499.958 202.815 510.806]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1968 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.774 488.002 262.729 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1969 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [266.825 488.002 278.78 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+1970 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [198.885 476.047 215.822 486.785]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1971 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.344 464.092 271.281 474.94]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+1972 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.205 452.137 197.142 462.874]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1973 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [193.766 440.182 210.702 450.919]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1974 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [188.646 428.227 205.583 438.964]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1975 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.994 416.271 223.93 427.12]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1976 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.898 404.316 219.835 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+1977 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.609 392.361 241.564 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+1978 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [188.065 380.406 200.02 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+1979 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [204.116 380.406 216.071 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.58) >>
+>> endobj
+1980 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.34 368.451 250.276 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1981 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.639 356.496 244.575 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+1982 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.981 332.585 214.936 343.323]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1983 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.018 320.63 219.973 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.17) >>
+>> endobj
+1984 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.069 320.63 236.024 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+1985 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.12 320.63 252.075 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+1986 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [256.171 320.63 273.107 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1987 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.734 308.675 206.689 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+1988 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.785 308.675 227.722 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+1989 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.035 296.72 207.99 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.17) >>
+>> endobj
+1990 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.086 296.72 229.022 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+1991 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.183 284.765 198.138 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1992 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [187.262 272.809 199.218 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+1993 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [157.015 260.854 168.97 271.592]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+1994 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [160.601 248.899 172.556 259.637]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+1995 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [164.21 236.944 176.165 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1996 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.261 236.944 197.197 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+1997 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [161.442 224.989 173.398 235.726]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+1998 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [167.796 213.034 179.752 223.771]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+1999 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [165.029 201.078 176.984 211.816]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2000 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.08 201.078 198.016 211.816]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2001 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.814 189.123 192.769 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2002 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.744 177.168 196.699 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2003 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [171.433 165.213 183.388 175.563]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2004 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [187.207 153.258 199.162 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2005 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [173.896 141.303 185.851 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2006 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.842 129.347 192.797 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2007 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.395 117.392 193.351 127.742]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2008 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [365.677 703.195 377.632 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2009 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [370.658 691.24 382.613 702.088]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2010 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [372.612 679.285 384.567 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2011 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [362.909 667.33 374.864 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2012 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.96 667.33 390.915 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2013 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [365.953 655.375 377.908 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2014 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [357.43 643.42 369.385 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2015 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [373.481 643.42 385.436 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.97) >>
+>> endobj
+2016 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.425 643.42 400.38 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2017 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.476 643.42 421.412 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+2018 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.401 643.42 441.337 654.157]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+2019 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [349.349 631.464 361.304 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2020 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [365.4 631.464 377.355 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2021 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [351.84 619.509 363.795 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2022 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.89 619.509 379.846 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2023 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.941 619.509 400.878 630.247]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2024 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [366.219 607.554 378.174 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2025 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.27 607.554 399.206 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2026 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.963 595.599 364.918 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2027 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [369.014 595.599 385.951 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2028 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.046 595.599 406.983 606.336]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2029 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.443 583.644 410.398 594.492]
+/Subtype /Link
+/A << /S /GoTo /D (page.11) >>
+>> endobj
+2030 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.585 571.689 414.521 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+2031 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [377.853 559.733 389.808 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.15) >>
+>> endobj
+2032 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.904 559.733 405.859 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.35) >>
+>> endobj
+2033 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [365.704 547.778 372.678 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2034 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.434 535.823 390.389 546.671]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+2035 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.945 523.314 409.9 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2036 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [361.802 499.958 373.757 510.806]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2037 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [369.274 488.002 381.229 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2038 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.325 488.002 397.28 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2039 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.269 488.002 412.224 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+2040 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [416.32 488.002 428.275 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2041 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [432.371 488.002 449.308 498.851]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2042 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.859 476.047 380.814 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2043 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [384.91 476.047 396.865 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2044 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [399.854 476.047 411.809 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+2045 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.905 476.047 427.86 486.895]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2046 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.113 464.092 387.069 474.94]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2047 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.585 452.137 394.541 462.985]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2048 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.636 452.137 410.592 462.985]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2049 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.687 452.137 426.642 462.985]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2050 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.17 440.182 394.125 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2051 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.221 440.182 410.176 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2052 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.272 440.182 426.227 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2053 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [356.295 428.227 368.25 438.577]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2054 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [363.767 416.271 375.722 427.009]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2055 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.818 416.271 391.773 427.009]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2056 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.762 416.271 406.717 427.009]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2057 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.813 416.271 427.749 427.009]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2058 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [363.352 404.316 375.307 415.054]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2059 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.403 404.316 391.358 415.054]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2060 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.347 404.316 406.302 415.054]
+/Subtype /Link
+/A << /S /GoTo /D (page.49) >>
+>> endobj
+2061 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.724 392.361 379.68 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2062 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.775 392.361 395.731 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2063 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [399.826 392.361 411.782 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2064 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.877 392.361 427.832 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2065 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.669 380.406 379.624 391.254]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2066 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [388.729 368.451 400.684 379.299]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2067 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.79 356.496 391.746 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2068 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.841 356.496 407.796 367.344]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2069 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [381.728 344.54 393.683 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2070 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.778 344.54 409.734 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2071 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [370.436 332.585 382.392 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2072 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [386.487 332.585 398.443 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2073 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.874 320.63 376.829 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2074 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.925 320.63 392.88 331.478]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2075 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [371.239 308.675 383.194 319.523]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2076 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.711 296.72 390.666 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2077 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.762 296.72 406.717 307.568]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2078 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.296 284.765 390.251 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2079 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.347 284.765 406.302 295.613]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2080 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [381.506 272.809 393.461 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2081 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.557 272.809 409.512 283.658]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2082 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.897 260.854 392.852 271.702]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2083 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.948 260.854 408.903 271.702]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2084 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [366.783 248.899 378.739 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2085 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [382.834 248.899 394.79 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2086 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.96 236.944 390.915 247.792]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2087 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.011 236.944 406.966 247.792]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2088 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.388 224.989 395.343 235.837]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2089 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [399.439 224.989 411.394 235.837]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2090 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.49 224.989 427.445 235.837]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2091 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [381.783 213.034 393.738 223.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2092 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [384.827 201.078 396.782 211.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2093 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.918 189.123 379.873 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2094 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.969 189.123 395.924 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2095 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.02 189.123 411.975 199.971]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2096 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.667 177.168 387.622 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2097 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.718 177.168 403.673 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2098 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.769 177.168 419.724 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2099 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.82 177.168 435.775 188.016]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2100 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [374.588 165.213 386.543 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2101 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.639 165.213 402.594 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2102 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [406.689 165.213 418.645 176.061]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2103 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.657 153.258 397.612 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2104 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.708 153.258 413.663 164.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2105 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.129 141.303 405.084 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2106 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.18 141.303 421.135 152.151]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2107 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [392.714 129.347 404.669 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2108 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.765 129.347 420.72 140.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2109 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.514 117.392 391.469 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2110 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.565 117.392 407.52 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2111 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.615 117.392 423.571 128.24]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+1944 0 obj <<
+/D [1942 0 R /XYZ 124.802 740.998 null]
+>> endobj
+1941 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2114 0 obj <<
+/Length 2736
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ys7~ׯà#YbѸñùÈV²)g•_’<ÐäDa–‡–¤c9ûç·á=C=âhhËU2©¡„Fw£ûë ‚ÇС˜ã¢egÞ»V|Ã[øè»X~D*É,„w%»RàSgðþ"ãÃgnïoþñÖµ<óF¶îŸ¼üÒM;]áÚÓÇ´ç.´‡øâïð"û¦óÛý÷7oî׿É'Wk†ïÌ–î¾;¸‚‚ýß“d‡ôC?\ Á0î™—@š{Æ0ð¶Õ`^ëcÌ›ôÆE. ϤÔçá’x—<•­HXsIk&•KâRP1ÛdQ¿²Ç2½²Ò9&(BÕœï—ä
+¹ßéuLp÷%žÙ8 š7N‚÷Ån˜ªŠ¢ß5Ç2ëåUsjÓœµØœgN'™§é¯d.±E™1õš&é·†JjÑ,IôÓW媤\†"1ë˜ÑTÝ– ìU^/"/!uŠóì-ÿþbSøÿhÔŸŽ¦³ÉÚ1Pd« ]ó’’ U tÞg[6(s}\™¯•g5# º>
+۱̸ õß›_~ã­Rõý gÒ»Ö§°Q³oŠÉ/ßn~¾ù÷F‰ò'Ǩ½v„k?õO2 Gñö¨
+½Äyu l´œË¤àµ(&ÀhU/]vºï8Ù*”•§…f‚îˆhlâÌK›È¦o£A›‡œéb8(¶ºŠj9IÉ¿9Qc*ÅOÃ鸈b㞇ʃFÉó‰TÞÞ–â4ôä T*›J!“’ƒH&ÚÛ~ꔪ8S–œ9%&<]pntÓH¿Œiœ Æ6ÎwÖJž)ˆÅ¬-@À¦B°i¨w¥ÅWÃY¿j)ǬTd¹‘ìvÌød:§“þèãýL™É±è¹8ÔkÄF‚F%’ûú˜}DÈoë9–Þâ2Õå¼~3
+€{¸®~õ”“â<4òåÆ3ëU¢ÿY‘<ÏÊ<ºde0ÍǠ綼UÂ`¢©ñž “z†ÿyüPXéjqÛ‡ÂrH$öÇÞ" ña1dÒ2òYpž†‚Љ¤þB»l¾.z%HÜ„Fr%€˜ >CRhžŽ>#‹Ë(Fß 4Ýÿˆæ‘iò‰Fo—i%vÏõü@ÕTÏÓfA
+La.-Ù˜t*’Vž"l›÷îH !<L€ª(·‚f’œˆ¡:®‘ œöI¾+’l˜¢§ä‰$ãÊ$’|Ó ’è„”*Ù*hAG¥}ªs½‹¢íœ­[ÿŠîöPBÕAìV$nAxâ¹òF®£YVšVR‚ICf¸l¨ZÚqLºThò>0,Æ™?äm¡ý€ZÿÀ÷oG½ÿDá¥n˜ÕçIb‹ÃB·©¶ôý]/v¯ÆšD™Q’Šž”á¤Ä¬aB&¹ìþbÖ›¬×ï@ô¸Ä0)ëžmpÓüDþW®yo‘ãþ¡²³Èð[PaNï,µÍ7·zŠ A
+¦pŸ]BwŒs¯{£Ð2ý0ét¥”‘‘±*¢ô^^)ÈŸLy§”±ž$‡îV5‹Hmyè°˜SIèõÒÏìóµ7Ÿ—rÐ
+!režŽÇAŸ£”jtÝìJ8nIZ¥³>©GîªU±+°°60sŽ½»*ª4i|L•”ÄPI4 JWutý˜» €+Š0› cW;‘
+î¬Ô²¡¡ÓÕœo«V76÷„42ßê& ?ƒJ78„iPA™qîE”xNki'c×âUçŽvë-›•µû¬26/î O0é™6nÛ?] Ø%(Ó|1†ý?”´mig/UB˽úÃCóÀý}â¬~t“†×áRQ–F2v W­z ­ªŒ×/Ö>…i Wwwaš”×/V³4àrpµQ¦Y!öê ›åëÐ’ ’’ÙÝ Ák‚êté21ùImR€!ÞZ¦Q¶ÈBS\0öO±ý2–”Çñ+zß^°ìéqDÚ­ Tܬ'Õ\®”Ö‹’ou»lþ&Σå»ÍÛìÂNÃ7·6ë­ãc™ çl։ʛ=n%¦ÁX‹3–ñ&øR_
+q2Y=ìç¶Q‹u¼P«”îP‰¯gTÚt_1¹€™T¥ˆK.í>†}™Ïã×ÇM‰q5Ó µ“,ŸoÌŽ©â‘~VߪuP”eÂ%u BA¿Îí§@¾J‰Ž3Mî‡sîR*½™èT—÷slõ:8fÒ&”·Õ©MûÕ­g5"‹w:]­Ûn5œvµÖ0àô±¼ h©æœjBÛ
+dË l»ÞΦEKqŠ·À‘ óÕž’ºåK­FvÑͶå‡vy/ÍqÐæ-Ó–Þ!Ùüu)ÒÑZ’$Ó^’Ý)´_ g+¼°D냓·/ÓDǘ®—ãŠ<…-iwØ.vàÿƒ9|ÿ¹Š
+°o“'†M€º8è
+Û{Ûqª=ë³Á»ðàíp´F†aK+g³„ÅÍqfŸMk&¸8Ý›™’ØsèædÅj»hþž% 5aþ]™ÿ¸ߧ³Í]·ƒ8`”ßb5/С˜Yáتr¶ ¬?œ·ïT0Í^5P—˜/É?„±04í]5WpU(¾'àÃ~W3KGTpÖV`]¥OLã$~δ îrR9IÃ556ñ"fý§pî/>Îö€Øéã ˜°äÆqa¨}ï"톡½Ýåè#ä­fóÕÖf’m'>å:@z&Çh³ÊG~Òƒ”÷ŽM'?ä×(ç³G?¹èB]&5¨ó‚–ˆÃEdÒ%à ¿ÇQTÒQ/ʪSáþ Õ|îW’D¡¥¢„gš«g0´ [»[(ÖIÝã±
+Èm­Nvzî¼NOЙ þ¼NOÔ$gŠÓSLñŠ“0¯ is¹œ¹´AæA°øÜå§6ÌB…·~S¿ª]zOP¸!•>ù(ΫYŽ>U> %_”Ó< ¾qAX~9¸ÖŠ/cî±ftó7S“
+àBÆ¿÷?Kq+^›IlQá‚Jæè8ïÏ Õ×XƒÞI|®Âà=.ïh r$ë«O¸¦ˆBèûMØ3C±
+$¸ÆI¢qÌ¡Aä–è¤þ–l½Å-1Œž€ìt%©ƒ]XÃT¸Z"Ó”ÎÿÅä*Þ;h¬ŠzÖ3)ÜîÂÿ8ìbendstream
+endobj
+2113 0 obj <<
+/Type /Page
+/Contents 2114 0 R
+/Resources 2112 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1339 0 R
+/Annots [ 2116 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R 2123 0 R 2124 0 R 2125 0 R 2126 0 R 2127 0 R 2128 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R 2135 0 R 2136 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R 2159 0 R 2160 0 R 2161 0 R 2162 0 R 2163 0 R 2164 0 R 2165 0 R 2166 0 R 2167 0 R 2168 0 R 2169 0 R 2170 0 R 2171 0 R 2172 0 R 2173 0 R 2174 0 R 2175 0 R 2176 0 R 2177 0 R 2178 0 R 2179 0 R 2180 0 R 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R 2195 0 R 2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R 2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 2212 0 R 2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R 2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 2230 0 R 2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2237 0 R 2238 0 R 2239 0 R 2240 0 R 2241 0 R 2242 0 R 2243 0 R 2244 0 R 2245 0 R 2246 0 R 2247 0 R 2248 0 R 2249 0 R 2250 0 R 2251 0 R 2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R 2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R ]
+>> endobj
+2116 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [183.914 703.195 195.869 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2117 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.965 703.195 211.92 714.044]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2118 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [173.065 691.24 185.021 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2119 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.116 691.24 201.072 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2120 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.467 679.285 196.422 690.133]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2121 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.939 667.33 203.894 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2122 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.99 667.33 219.945 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2123 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.041 667.33 235.996 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2124 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.092 667.33 252.047 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2125 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.524 655.375 203.479 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2126 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.575 655.375 219.53 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2127 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.626 655.375 235.581 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2128 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [172.844 643.42 184.799 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2129 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.316 631.464 192.271 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2130 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.367 631.464 208.322 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2131 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.418 631.464 224.373 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2132 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.901 619.509 191.856 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2133 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.952 619.509 207.907 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2134 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.003 619.509 223.958 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2135 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.874 607.554 213.829 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2136 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.925 607.554 229.88 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2137 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [190.777 595.599 202.732 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2138 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.828 595.599 218.783 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2139 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.879 595.599 234.834 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+2140 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [164.542 583.644 176.497 593.994]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2141 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [172.014 571.689 183.969 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2142 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.958 571.689 198.913 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2143 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [203.009 571.689 219.945 582.426]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2144 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [171.599 559.733 183.554 570.471]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2145 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.543 559.733 198.498 570.471]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2146 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [177.272 547.778 189.227 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2147 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [187.583 523.868 194.557 534.605]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+2148 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [198.653 523.868 205.627 534.605]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2149 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [189.686 511.913 196.66 522.65]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2150 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.838 499.958 230.794 510.695]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2151 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 488.002 207.713 498.74]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2152 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [181.091 476.047 193.046 486.785]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2153 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.204 464.092 196.159 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+2154 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.463 464.092 212.418 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2155 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.721 464.092 228.676 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2156 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.98 464.092 244.935 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2157 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.238 464.092 261.193 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2158 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 464.092 277.452 474.83]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2159 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 454.074 180.593 462.487]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2160 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [192.465 440.182 204.42 451.03]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2161 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.632 428.227 226.587 439.075]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2162 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.607 416.271 203.562 427.009]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2163 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [203.562 404.316 215.517 415.164]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2164 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.952 392.361 207.907 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+2165 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.003 392.361 223.958 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2166 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [228.054 392.361 244.99 403.209]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2167 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.469 380.406 203.424 391.143]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2168 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.893 368.451 208.848 379.188]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2169 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.52 356.496 224.456 367.233]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2170 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.985 344.54 213.94 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2171 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.036 344.54 234.972 355.389]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2172 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.571 332.585 212.545 343.433]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2173 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [192.88 320.63 204.835 331.368]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2174 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.931 320.63 220.886 331.368]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2175 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.982 320.63 236.937 331.368]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+2176 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [199.107 308.675 211.062 319.412]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2177 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.214 296.72 212.169 307.457]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2178 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [191.33 284.765 203.286 295.502]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2179 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.381 284.765 224.318 295.502]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2180 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [225.729 272.809 237.684 283.547]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2181 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.1 260.854 198.055 271.592]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+2182 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.151 260.854 214.106 271.592]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2183 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.489 248.899 237.463 259.747]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2184 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.075 236.944 212.031 247.681]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2185 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.201 224.435 242.157 236.39]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2186 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [246.252 224.435 258.208 236.39]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2187 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.637 202.517 232.592 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.74) >>
+>> endobj
+2188 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.688 202.517 248.643 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2189 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.63 190.562 197.585 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2190 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.68 190.562 218.617 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2191 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 169.143 180.593 177.555]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2192 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 145.232 180.593 153.645]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2193 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.972 118.831 214.909 130.786]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2194 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 693.177 369.883 701.59]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2195 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 669.267 369.883 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2196 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 645.357 369.883 653.77]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2197 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 621.446 369.883 629.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2198 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 597.536 369.883 605.949]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2199 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 573.626 369.883 582.039]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2200 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 549.715 369.883 558.128]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2201 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 525.805 364.902 534.218]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+2202 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 501.895 364.902 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2203 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 487.449 466.742 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2204 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 476.047 364.902 486.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2205 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 476.047 380.953 486.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2206 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [450.415 463.539 462.37 475.494]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2207 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.655 451.583 405.61 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.16) >>
+>> endobj
+2208 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.706 451.583 421.661 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.23) >>
+>> endobj
+2209 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.757 451.583 437.712 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2210 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.808 451.583 453.763 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2211 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.123 439.628 426.078 451.583]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2212 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.174 439.628 447.11 451.583]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+2213 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [418.064 427.673 430.019 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2214 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [434.115 427.673 446.07 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2215 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [450.165 427.673 467.102 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2216 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.675 415.718 422.63 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2217 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.726 415.718 438.681 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2218 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.143 403.763 431.098 415.718]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+2219 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [440.148 391.808 452.103 403.763]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2220 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 368.451 364.902 378.801]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2221 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 368.451 380.953 378.801]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2222 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 344.54 364.902 354.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+2223 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 344.54 380.953 354.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2224 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 344.54 397.004 354.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2225 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.864 332.032 420.819 343.987]
+/Subtype /Link
+/A << /S /GoTo /D (page.14) >>
+>> endobj
+2226 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.171 332.032 436.127 343.987]
+/Subtype /Link
+/A << /S /GoTo /D (page.16) >>
+>> endobj
+2227 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.479 332.032 451.434 343.987]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+2228 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 332.032 466.742 343.987]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2229 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 320.63 364.902 330.98]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2230 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 320.63 380.953 330.98]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2231 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.37 308.121 437.325 320.077]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+2232 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.407 296.166 464.362 308.121]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2233 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [451.771 284.211 463.726 296.166]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2234 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [432.637 272.256 444.592 284.211]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2235 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [427.058 260.301 439.013 272.256]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+2236 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [442.223 260.301 454.178 272.256]
+/Subtype /Link
+/A << /S /GoTo /D (page.19) >>
+>> endobj
+2237 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.388 260.301 469.344 272.256]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2238 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 248.899 364.902 259.249]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2239 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 248.899 385.934 259.249]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2240 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.38 236.39 403.335 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2241 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.232 236.39 419.187 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2242 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.083 236.39 435.039 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2243 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.935 236.39 450.89 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2244 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 236.39 466.742 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2245 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 224.989 364.902 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2246 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 224.989 380.953 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2247 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 224.989 397.004 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2248 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 224.989 413.055 235.339]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2249 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [391.38 212.48 403.335 224.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2250 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.232 212.48 419.187 224.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2251 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.083 212.48 435.039 224.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2252 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.935 212.48 450.89 224.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2253 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 212.48 466.742 224.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2254 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 201.078 364.902 211.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2255 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 201.078 380.953 211.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2256 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 201.078 397.004 211.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2257 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 201.078 413.055 211.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2258 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.001 178.607 411.956 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2259 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.864 178.607 427.82 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2260 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.728 178.607 448.664 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+2261 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.573 178.607 469.509 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2262 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.323 166.652 442.278 178.607]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2263 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [446.374 166.652 458.329 178.607]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2264 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.265 154.697 396.201 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+2265 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.297 154.697 417.233 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+2266 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.344 142.742 403.318 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.9) >>
+>> endobj
+2267 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.218 142.742 419.174 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+2268 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.075 142.742 435.03 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2269 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.931 142.742 450.886 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2270 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 142.742 466.742 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2271 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 133.277 364.902 141.69]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+2272 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.307 118.831 402.262 130.786]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+2115 0 obj <<
+/D [2113 0 R /XYZ 124.802 740.998 null]
+>> endobj
+2112 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2275 0 obj <<
+/Length 2822
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ys#·~ׯà#Y"8×c¶|lmœre£<Ù~‰”ÄE*$×+oþ|ºgxÏA`8£¡d•«¼$‡"Æ×7 zÿ=!9.{8óÞõn¯xïýx%Ö_Q ˜ô®àápó_0g<}çÃõÕ_p=ϼQ½ë»ô›×£_úß?D<Šþí—Õøç'|·šÌgøÏr0”RõåšßÎéÉl„ðñ—Áoן®¾¿ÞŽ)¤aJÉ AôÑâ~ýìó¥ÃKwüCÙWæUöÇ9"4“<š! 7` „¹B@/óZW1wü¼ÏF?#ÏnC­ûÿùn>®ÿu6*ÎZÅq^&v^
+X»›Êš@Q©3«ŸÆw«¸Iɬ‚Vf,,†qçbI°:Ž©ŽYpk¦š(¦~žÜ?°¬hÊ gSÖ&´=GÄYü·€¹–)×så;QµÂÜ`é’s°Q#h1ìØž9¡jmž?l£ί®p¸O]Ë` q
+q‹äø·¥bÖÊé¿W¿üÆ{#äÓg
+ÕÙW¢› ï{W’yç×ï¦Wÿºúçî7²'UcßÎqo¸þhœìyã£:ã'Ƨ%KV«.Öäæ iÎqáši”ÃÍo…/™¶1(„fBÛÞP
+¦E¥Ê¿KÅk:™m4B3¸%1„L §Ér™½?­&øp>+FδŽF':Çq'£˜« ÓV„àxŽ¹Ë¡øÓñÞ6§Ï§ø…d™~cÃêíUÂmˤ´o†ÛåZSáö BŸ_¹
+sºå0}T-̹+|·6I-Öð3HøßñߢéëD4 ¶i.DÆ7i¿dÆ×5Þ$-´å¢åÒʦIˆßõÝËeð´ÌÝ9 ^ÆÞÄÁoªéFƒ!H{ ¼€Úo«ÚŠW2él·þ
+b £ÚvN›Ã~”:ÁWõ€·Y%`Ñì°¼Iv Í@¿zI&8Þù:¸ à‚îœ ^¶¸9Ml ÕFZ50ëu¨JC&¹ß·;ƒºÅ@Ä ú¶?_å†GKÖèÖ‡œ§Ê¶0[HrHD´8IkIXá^Ã
+NïÈBÉ ÎÑ2nÖïT °Áõ+ {HŬ2¯aý¹µsLYøo=ji_ÃÒ­Ð;(P 7çOŠ›
+”Ô‹P¿Å ¹ï6RRÝyª 2B­8ãÆE`aÜx};[o¶MÒÞ¦
+e­\N¥a-@ŸR.V_*ib§8 µt{Iæ$+äKÿ§¥?ïÐa7Ýš…Ži©»ÍÔ#Á\¼ësà½PÛÉf´]ýà'Û­MG$˜®³5¸Ð¬’«EBÓé€:$èË „{ÙNmá¾&Ø+;’JÊŽèÉiƒ_Ø®kIx·÷ßíýw{ÿRí}ߌ½/›µ÷¿N¨aõ0‚áûáQz[CJÃçºÛ0‡eÆ@·°7Ü3í|M̱ËÙ;ì½ÃÞë s€aBø¬¤_V¡ÞCBfÝä~V– ª*{F—_Gû5οºªFÎlP>ôã‡ù@ÚþóŽ—‡QòLeu^ÁŒ3/ê(7ã«_
+%Cúï3²Ï¾dqE‘iQè—ZeÉtTäZüQåÚXé š”î
+endobj
+2274 0 obj <<
+/Type /Page
+/Contents 2275 0 R
+/Resources 2273 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 2465 0 R
+/Annots [ 2277 0 R 2278 0 R 2279 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2292 0 R 2293 0 R 2294 0 R 2295 0 R 2296 0 R 2297 0 R 2298 0 R 2299 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R 2342 0 R 2343 0 R 2344 0 R 2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R ]
+>> endobj
+2277 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.138 702.642 262.093 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2278 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.303 702.642 282.24 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2279 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.012 690.687 265.967 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2280 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [246.54 678.732 258.495 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2281 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [262.591 678.732 274.546 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+2282 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [251.189 666.776 263.145 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2283 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [266.355 666.776 278.31 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+2284 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 657.312 175.611 665.725]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+2285 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.974 642.866 253.929 654.821]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2286 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229 630.911 240.956 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2287 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.364 609.392 246.319 621.347]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2288 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.415 609.392 262.37 621.347]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2289 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.033 597.436 252.988 609.392]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2290 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.084 597.436 269.039 609.392]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2291 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [221.025 585.481 232.98 597.436]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2292 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.19 585.481 248.145 597.436]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2293 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [251.134 585.481 263.089 597.436]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2294 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [266.299 585.481 278.255 597.436]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2295 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 574.08 175.611 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2296 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 574.08 191.662 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2297 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 574.08 207.713 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2298 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.702 574.08 222.657 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2299 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [226.753 574.08 238.708 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2300 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.804 574.08 254.759 584.43]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2301 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.092 561.571 228.048 573.526]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2302 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.323 561.571 245.278 573.526]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+2303 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.553 561.571 262.508 573.526]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2304 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 561.571 277.452 573.526]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2305 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 550.169 175.611 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2306 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [180.63 550.169 192.585 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2307 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [197.603 550.169 209.558 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2308 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.576 550.169 226.532 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2309 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.55 550.169 243.505 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2310 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.523 550.169 260.478 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2311 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 550.169 277.452 560.519]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2312 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 540.151 180.593 548.564]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2313 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.561 525.705 254.516 537.661]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2314 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [237.579 513.75 249.535 525.705]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2315 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.67 501.795 247.625 513.75]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2316 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.284 489.84 254.239 501.795]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2317 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.404 477.885 213.359 489.84]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2318 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.455 477.885 229.41 489.84]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2319 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.399 477.885 244.354 489.84]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2320 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.45 477.885 260.405 489.84]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2321 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [264.501 477.885 276.456 489.84]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2322 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [205.832 465.93 217.787 477.885]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2323 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [221.883 465.93 233.838 477.885]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2324 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.215 453.974 247.17 465.93]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2325 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.553 453.974 262.508 465.93]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2326 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 453.974 277.452 465.93]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2327 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 442.573 175.611 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2328 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 442.573 191.662 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2329 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 442.573 207.713 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2330 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 442.573 223.764 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2331 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.86 442.573 239.815 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2332 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [243.911 442.573 255.866 452.923]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2333 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [264.169 430.064 276.124 442.019]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2334 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [228.522 418.109 240.477 430.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2335 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.009 418.109 258.964 430.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2336 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 418.109 277.452 430.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+2337 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 406.707 175.611 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2338 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [178.6 406.707 190.555 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2339 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.98 406.707 207.935 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2340 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [213.359 406.707 225.314 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2341 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.738 406.707 242.693 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2342 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.117 406.707 260.073 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2343 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 406.707 277.452 417.057]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2344 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 396.689 175.611 405.102]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2345 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.975 382.243 246.93 394.199]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2346 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.553 382.243 262.508 394.199]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2347 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 382.243 277.452 394.199]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2348 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 370.842 175.611 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2349 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 370.842 191.662 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2350 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 370.842 207.713 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2351 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 370.842 223.764 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2352 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.86 370.842 239.815 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2353 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [243.911 370.842 255.866 381.192]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2354 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [245.656 358.333 257.611 370.288]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2355 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 358.333 275.238 370.288]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2356 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 346.931 175.611 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2357 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 346.931 191.662 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2358 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 346.931 207.713 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2359 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 346.931 223.764 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2360 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.86 346.931 239.815 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2361 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [243.911 346.931 255.866 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2362 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [259.962 346.931 271.917 357.281]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2363 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.562 324.859 230.517 336.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2364 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.613 324.859 246.568 336.814]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2365 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.491 312.903 197.446 324.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2366 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [200.435 312.903 212.39 324.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2367 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.486 312.903 228.441 324.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2368 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.68 300.948 228.635 312.903]
+/Subtype /Link
+/A << /S /GoTo /D (page.68) >>
+>> endobj
+2369 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.731 300.948 244.686 312.903]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2370 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.782 300.948 260.737 312.903]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2371 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.661 288.993 196.616 300.948]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2372 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.16 277.038 246.115 288.993]
+/Subtype /Link
+/A << /S /GoTo /D (page.77) >>
+>> endobj
+2373 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.828 277.038 261.783 288.993]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+2374 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 277.038 277.452 288.993]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2375 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 267.573 175.611 275.986]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2376 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.827 253.681 191.801 264.529]
+/Subtype /Link
+/A << /S /GoTo /D (page.5) >>
+>> endobj
+2377 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.098 241.172 206.053 253.128]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2378 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.149 241.172 222.104 253.128]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2379 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.171 229.217 226.126 241.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2380 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.28 229.217 243.235 241.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2381 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.388 229.217 260.343 241.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2382 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 229.217 277.452 241.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2383 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 217.816 175.611 228.166]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2384 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 217.816 196.644 228.166]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+2385 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.488 195.743 215.462 207.698]
+/Subtype /Link
+/A << /S /GoTo /D (page.5) >>
+>> endobj
+2386 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.558 195.743 231.513 207.698]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+2387 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [144.893 184.341 161.83 194.924]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2388 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.343 162.822 202.317 173.67]
+/Subtype /Link
+/A << /S /GoTo /D (page.5) >>
+>> endobj
+2389 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [228.69 140.749 240.646 152.704]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2390 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [225.12 128.794 237.076 140.749]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2391 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.334 116.839 239.29 128.794]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2392 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [243.385 116.839 255.341 128.794]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2393 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.769 702.642 419.724 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2394 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.82 702.642 435.775 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2395 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.871 702.642 456.807 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+2396 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.074 690.687 405.029 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2397 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.086 667.33 387.041 678.178]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2398 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [371.516 655.375 383.471 666.223]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2399 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [373.73 643.42 385.685 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2400 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [389.781 643.42 401.736 654.268]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2401 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [364.874 631.464 376.829 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2402 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.925 631.464 392.88 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2403 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.976 631.464 413.912 642.313]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+2404 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [374.339 619.509 386.294 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2405 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.389 619.509 402.345 630.357]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2406 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.621 607.554 392.576 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2407 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.672 607.554 408.627 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2408 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.722 607.554 429.659 618.402]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+2409 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [395.565 595.599 407.52 606.447]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2410 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [375.086 583.644 387.041 594.492]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2411 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [367.116 571.689 379.071 582.537]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2412 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [378.434 559.733 390.389 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2413 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [394.485 559.733 406.44 570.582]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2414 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [371.543 547.778 383.499 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2415 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [387.594 547.778 399.55 558.626]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2416 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.233 535.27 429.189 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2417 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.284 535.27 445.24 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2418 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.578 523.314 433.533 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2419 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.075 523.314 449.031 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2420 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.573 523.314 469.509 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+2421 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.459 511.359 450.415 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2422 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.981 499.404 429.936 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2423 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.01 487.449 421.966 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2424 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.329 475.494 433.284 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2425 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.38 475.494 449.335 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2426 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.438 463.539 426.394 475.494]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2427 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.489 463.539 442.444 475.494]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2428 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.544 451.583 420.499 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2429 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.343 439.628 422.298 451.583]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+2430 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.393 439.628 438.349 451.583]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2431 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.129 427.673 450.084 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2432 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 427.673 466.742 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2433 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 418.209 364.902 426.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2434 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.199 403.763 453.154 415.718]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2435 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [456.364 403.763 468.32 415.718]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2436 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 392.361 364.902 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2437 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 392.361 380.953 402.711]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2438 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [440.12 379.852 452.075 391.808]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2439 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [455.285 379.852 467.24 391.808]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2440 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 370.388 364.902 378.801]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2441 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 355.942 466.742 367.897]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2442 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 346.478 364.902 354.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2443 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [458.66 332.032 470.616 343.987]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2444 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 322.567 364.902 330.98]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2445 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [458.245 308.121 470.2 320.077]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2446 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 298.657 364.902 307.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2447 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 284.211 466.742 296.166]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2448 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 272.809 364.902 283.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2449 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 272.809 380.953 283.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2450 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.577 260.301 453.532 272.256]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2451 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.554 260.301 469.509 272.256]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2452 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.847 248.346 413.802 260.301]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2453 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.407 236.39 427.362 248.346]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2454 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [404.199 214.473 416.154 226.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2455 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [380.205 202.517 392.161 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2456 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [396.256 202.517 408.212 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+2457 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [412.307 202.517 424.263 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2458 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.213 190.562 464.169 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2459 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [451.937 178.607 463.892 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2460 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.741 166.652 419.696 178.607]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2461 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.671 154.697 423.626 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2462 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [398.36 142.742 410.315 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2463 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [414.134 130.786 426.089 142.742]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2464 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.823 118.831 412.778 130.786]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2276 0 obj <<
+/D [2274 0 R /XYZ 124.802 740.998 null]
+>> endobj
+2273 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2468 0 obj <<
+/Length 2839
+/Filter /FlateDecode
+>>
+stream
+xÚí]K“G¾Ï¯à«re½ë8£•½áõ®¼ã _dcvyhYKþõ›Õ<º!³é¦™B4ˆ®¬ÊÇ—_eeCKâh2"HÕòFŠC«7¾‘­~ôÝ ¬¾¢Ò»œ߬?Å"¸˜¾s÷póÍ·¡Etºõð[ö͇§íq¯óÚ½á¬7êwÞhmÚ¿H+;x)]ŸŽÇÝɾËð—ίßß¼{ØÜ'á¼^!]™ VÝWxGk~'ûJ¾( ñ&Úá ÑZ‚(Óá( ¢3AzÓqºˆR O¹R'BôÕH¡
+¤ˆxB<Ïp¼ÿë¨ÐÞY•­0ÅKb…R®î%±ÂZwZš4Úaw°³*Ý’B¯[‰‚ÐWe%Sœ¬ëU¯lEÐ% q¸“BƒO‚à•CSñÂX®(FÖ¤è? Á BÍjZg³9í¼Q¾=ý˜çwŽi¸‰¦~ 7ÖÓEùs8øsi©—“ ²õŸyzƒ°ªnÂEr:¸è8§s–%”©ÙáD¼þ£PômGD˜tÇ9Æ9êÎçË«¨jÐ^ §“Âa4ÛTµoÜT¯À[ 7Ýÿ0"S¤š:©&Éûæ¯ët’yãìõ"yf¼©îôãêm®ÆxD.ÀžahÞ[–C4¥¥˜þ$!¦Ç­ÝÓ^ÌK!m3!rdñø¡'AŽI/í`”
+xP A}
+—±ƒ}—Jqòn'T ¯Ôïcž)ùOV=]Ë¢Ö; ¨)<|að›<õxüë=vQkf<ÕÂñ'ò
+ 4jžFáÀÓ,tcž!™'3KÆÅ´ñ5Â2ù:|nÝðßóÌÓ!­£éÕ>Ñz˜_ç!º(]5y”º:uzè"Dâ4¾$y >ÎP|N±²{#$’öžgvWº)P€ÓÌހϻëP¥F 0öªiRf¦ñ!€tÌøo„¡¢ó§Dì2xu2»þuduÇ Ã¤‹L–‘àÜj9Ùë1éÒPs.•ÐÑÐôr4LÝ Š¼3‡UVäçʪ%­›%1Ë A5?„J]-jˆ€ê°£nç2Ž¥dò³•‹Èl×ì/þ$jŸ"Ãl+.d0ê# zá•…I—7ÕÂ"–H›Yr2x±±y2a±Â—ØTÜ–$Gÿ}ÃŶ«”ê¿7~•­'¼Å÷7ãYhý‘FmÚo”ˆÉ̲w£›ŸnþµùÕ'Çî|WŽ?ðN(Þ?­xÛ©MŽTÃqó—”ožm—¥:™çÞb:+¢¶¬a›Ô¬E÷à’FòFPÌÞã¼sݶð×i4~\/»Ø Á ð˴ع–Ò"wÝsùc2‹égêó
+'íyƒpb<á­Q²óÍ#vU*?¹rýèÝž-S hó@оÙÙ¹\v\Zýj'‘Ð:,Tâ¡cÐÞ¿®©ÜEkbë:|`á!PÂi*ºÍ4mþ<^—aíâãÉ|1{^Ç4Tâ€è¨K€“ YrKÝ•F±> Ój¼Ìš¶†•67†•\Ó$W·D*Q[D‰îÒÀïʬNô‚-ˆfÖf¢¥;²$ëR«dîêw{©Œ>»ÚTWJdaøµéª¤MÊ !\‘嚯Ôr¾q"+@ó\šRL C¥ Äóö`Ÿø¥ãJU¡E–x¶¥;f‰<ÞDS!ÎÛé¤7zžçÄÉã>K#Ž2PM8)..Å›Hjòð×Þ‘ƒì‚Æó´8ÇÃ1A(©â¼KI䉬œ,Ÿ’xkU³|o¢©ËµoÞO%vì)œc;§«Ýg/QäVm(5¶{L(ŸLbý-ÏÉ2 ƒ¬(êé#vžý”·ÿG7SÅá§}ðÎ$±zÇòHõ{üüˆG(-¬#ó퉟zD¬jÛÿÆág[¿ƒµrÂ}^Ž‰ÎÎÙj’ÌıðéÅP->¶ü]VuEàÔ:ŽN™(P->ã<ûÙùŽEwp,ã>bùÊůcnXZTT ó¨Û(PÄšŽ>'y!?÷Âñ:Õ|ý w?õÆ*U³7ÁûV¯07gó\2R|•zpn¨—¢T=§¢Ú^ïªK‘Qð £}óuA7^Lxù™á¬)¹¾?”^`°èó\Í›²Â“Sœ}ÙîÏÉpÀ‰¨tÝâ9ÆäýÝ'®÷ÉÉEéd¸×õÄ‹0TôgÊB&ÔØKS •tÙÈÍ•tR[b¼ïo;ŠdZ>\VžŸ_]&Qñloª"+ãÇm$u cií}æ +,_q|ä¶è0Î!Ý "xöªèæ‰eÏÞöŠºòsšÑL³ÿ¾,ì%áw|ÿí¨ûŸM£²èÛø2]^x˜ Ö­&‰{ßÍJ÷¦³RT%:ØNr74– VžúK’òEŸ•ÉdÛ{ÛØMŒB#QQ(~ºdxEv觕¥UúïIx›
+åm‘ˆé£“-@³íšnqŸ`ô×3‘Ú‘ÅÔ…Ô\Æ•±*„_&†Îõ×ʆ׾*Ûž˜t˜l)Ùùóê@óŠ”ÍVsÕcŸ‘ª‹”þtKÖû1¡šE?Ÿ–UÂñ¹ë¹›™f£5§ûË,¶ÙäÇÍiƒùT£õÑü6}Ž‹8}¤Å×$Öóúèi6ìugIÈnºþy4œ/JÓ®©ý¢´Ä¤f®Ôtnx ·rùa­ÿ²ÌÎcöVíбa¿_»-Ãá
+Ú…ÖÌÁðz%tÐÌuýçó8 k:ïíV,Rº—¦½¶È?%¦bóýðÀTÚ•à2N×aX§mK.1z¨­{"£áÔn¼«?ªh\(šUÛt‡3^¿
+ç¹ì§%ù=ðD’J¸X¿·/œQLx°é6ý{¸b”t7iKý+†iQìK‘쑒ͧF(ž¹
+endobj
+2467 0 obj <<
+/Type /Page
+/Contents 2468 0 R
+/Resources 2466 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 2465 0 R
+/Annots [ 2470 0 R 2471 0 R 2472 0 R 2473 0 R 2474 0 R 2475 0 R 2476 0 R 2477 0 R 2478 0 R 2479 0 R 2480 0 R 2481 0 R 2482 0 R 2483 0 R 2484 0 R 2485 0 R 2486 0 R 2487 0 R 2488 0 R 2489 0 R 2490 0 R 2491 0 R 2492 0 R 2493 0 R 2494 0 R 2495 0 R 2496 0 R 2497 0 R 2498 0 R 2499 0 R 2500 0 R 2501 0 R 2502 0 R 2503 0 R 2504 0 R 2505 0 R 2506 0 R 2507 0 R 2508 0 R 2509 0 R 2510 0 R 2511 0 R 2512 0 R 2513 0 R 2514 0 R 2515 0 R 2516 0 R 2517 0 R 2518 0 R 2519 0 R 2520 0 R 2521 0 R 2522 0 R 2523 0 R 2524 0 R 2525 0 R 2526 0 R 2527 0 R 2528 0 R 2529 0 R 2530 0 R 2531 0 R 2532 0 R 2533 0 R 2534 0 R 2535 0 R 2536 0 R 2537 0 R 2538 0 R 2539 0 R 2540 0 R 2541 0 R 2542 0 R 2543 0 R 2544 0 R 2545 0 R 2546 0 R 2547 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2552 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 2596 0 R 2597 0 R 2598 0 R 2599 0 R 2600 0 R 2601 0 R 2602 0 R 2603 0 R 2604 0 R 2605 0 R 2606 0 R 2607 0 R 2608 0 R 2609 0 R 2610 0 R 2611 0 R 2612 0 R 2613 0 R 2614 0 R 2615 0 R 2616 0 R 2617 0 R 2618 0 R 2619 0 R 2620 0 R 2621 0 R 2622 0 R 2623 0 R 2624 0 R 2625 0 R 2626 0 R 2627 0 R 2628 0 R 2629 0 R ]
+>> endobj
+2470 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [218.479 702.642 230.434 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2471 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.702 690.687 222.657 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2472 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.032 678.732 230.987 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2473 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.023 666.776 225.978 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2474 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.005 654.821 230.96 666.776]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2475 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.256 642.866 223.211 654.821]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2476 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.307 642.866 239.262 654.821]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2477 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.3 630.911 226.255 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2478 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.325 618.956 234.281 630.911]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2479 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.053 607.001 218.008 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2480 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.241 585.083 227.196 597.038]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+2481 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.292 585.083 243.247 597.038]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2482 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.343 585.083 264.279 597.038]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+2483 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.697 573.128 253.652 585.083]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2484 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.748 573.128 269.703 585.083]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2485 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [193.821 561.172 205.776 573.128]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2486 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.684 549.217 227.639 561.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.46) >>
+>> endobj
+2487 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.735 549.217 243.69 561.172]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2488 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.613 537.262 231.569 549.217]
+/Subtype /Link
+/A << /S /GoTo /D (page.46) >>
+>> endobj
+2489 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.664 537.262 247.619 549.217]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2490 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.302 525.307 218.257 537.262]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2491 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.353 525.307 234.308 537.262]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2492 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.084 513.352 232.039 525.307]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2493 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.249 513.352 247.204 525.307]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2494 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [250.415 513.352 262.37 525.307]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2495 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.58 513.352 282.516 525.307]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+2496 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.409 501.397 219.364 513.352]
+/Subtype /Link
+/A << /S /GoTo /D (page.45) >>
+>> endobj
+2497 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.46 501.397 235.415 513.352]
+/Subtype /Link
+/A << /S /GoTo /D (page.93) >>
+>> endobj
+2498 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [208.765 489.441 220.72 501.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2499 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.816 489.441 236.771 501.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2500 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.867 489.441 252.822 501.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.51) >>
+>> endobj
+2501 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [256.918 489.441 273.855 501.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2502 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.711 477.486 227.666 489.441]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2503 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.762 477.486 243.717 489.441]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2504 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.935 465.531 219.89 477.486]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2505 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.778 453.576 227.734 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2506 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.613 453.576 243.568 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2507 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.448 453.576 259.403 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2508 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 453.576 280.219 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2509 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.256 441.621 223.211 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.47) >>
+>> endobj
+2510 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.307 441.621 239.262 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2511 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [243.358 441.621 260.294 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+2512 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.237 429.666 228.192 441.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2513 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 417.71 223.764 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2514 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [229.705 417.71 241.66 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2515 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.601 417.71 259.556 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2516 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 417.71 277.452 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.44) >>
+>> endobj
+2517 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 406.309 175.611 416.659]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2518 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 406.309 191.662 416.659]
+/Subtype /Link
+/A << /S /GoTo /D (page.93) >>
+>> endobj
+2519 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 406.309 212.695 416.659]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+2520 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.79 406.309 233.727 416.659]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2521 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.533 393.8 223.488 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2522 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.583 393.8 239.539 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.48) >>
+>> endobj
+2523 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.558 381.845 231.513 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.52) >>
+>> endobj
+2524 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.792 369.89 232.747 381.845]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2525 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [228.098 357.935 235.072 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+2526 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [239.168 357.935 246.142 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2527 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.747 345.979 249.684 357.935]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2528 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.367 334.024 254.322 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2529 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.895 322.069 234.851 334.024]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2530 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.201 310.114 237.175 322.069]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2531 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [226.482 298.159 238.437 310.114]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2532 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [259.353 286.204 271.308 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2533 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.273 274.248 248.228 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2534 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [221.606 262.293 233.561 274.248]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2535 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [228.719 250.338 240.675 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+2536 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.108 250.338 259.063 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2537 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 250.338 277.452 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2538 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 238.936 175.611 249.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2539 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 238.936 191.662 249.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2540 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 238.936 207.713 249.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2541 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 238.936 228.746 249.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2542 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.98 226.428 244.935 238.383]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2543 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [255.147 214.473 267.102 226.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2544 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.122 202.517 244.077 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2545 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [244.077 190.562 256.032 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2546 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [234.474 178.607 246.429 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+2547 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.64 178.607 261.595 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2548 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [264.805 178.607 281.742 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2549 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.984 166.652 243.939 178.607]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2550 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [237.408 154.697 249.363 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2551 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.001 142.742 258.956 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+2552 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 142.742 277.452 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2553 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 133.277 175.611 141.69]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2554 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.035 118.831 264.971 130.786]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2555 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.79 702.642 443.745 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2556 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [447.841 702.642 464.777 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2557 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [435.376 690.687 442.35 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2558 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [422.685 678.732 434.64 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2559 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.736 678.732 450.691 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2560 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 678.732 466.742 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+2561 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [428.912 666.776 440.867 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2562 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.019 654.821 441.974 666.776]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2563 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [413.829 642.866 425.785 654.821]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2564 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.135 630.911 433.091 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2565 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.186 630.911 454.123 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+2566 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [455.534 618.956 467.489 630.911]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2567 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.599 607.001 420.554 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2568 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.905 595.045 427.86 607.001]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+2569 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.956 595.045 443.911 607.001]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2570 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [460.294 583.09 467.268 595.045]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2571 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.88 571.135 441.836 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2572 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [442.389 559.18 454.344 571.135]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2573 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 547.225 466.742 559.18]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2574 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 535.823 364.902 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2575 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 535.823 380.953 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2576 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 535.823 397.004 546.173]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2577 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 523.314 466.742 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2578 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 511.913 364.902 522.263]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2579 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 511.913 380.953 522.263]
+/Subtype /Link
+/A << /S /GoTo /D (page.50) >>
+>> endobj
+2580 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [422.536 499.404 434.491 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2581 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.931 487.449 420.886 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2582 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [443.319 475.494 455.274 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2583 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [420.571 463.539 432.526 475.494]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2584 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [389.2 441.621 401.155 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2585 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [405.251 441.621 417.206 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2586 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.301 441.621 433.257 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2587 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [386.432 429.666 398.387 441.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+2588 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.483 429.666 419.42 441.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2589 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.207 417.71 441.144 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2590 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [449.446 405.755 466.383 417.71]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2591 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.623 393.8 421.578 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+2592 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.788 393.8 436.744 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.22) >>
+>> endobj
+2593 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.954 393.8 451.909 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2594 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [455.119 393.8 472.056 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2595 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [413.027 381.845 429.963 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2596 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.266 369.89 455.202 381.845]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2597 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [413.414 357.935 425.37 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2598 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.465 357.935 441.421 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.55) >>
+>> endobj
+2599 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [445.516 357.935 457.471 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+2600 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [424.041 345.979 435.996 357.935]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2601 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [439.207 345.979 456.143 357.935]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2602 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [459.353 345.979 476.29 357.935]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2603 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [451.272 334.024 468.209 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2604 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.354 322.069 424.29 334.024]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2605 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [428.386 322.069 445.323 334.024]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2606 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [432.592 310.114 449.529 322.069]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2607 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.093 298.159 422.049 310.114]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+2608 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.144 298.159 443.081 310.114]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2609 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [420.679 286.204 432.635 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.25) >>
+>> endobj
+2610 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [436.626 286.204 448.581 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2611 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.573 286.204 469.509 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2612 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.592 274.248 422.547 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+2613 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.757 274.248 437.712 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2614 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [440.922 274.248 452.878 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2615 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [456.088 274.248 473.024 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2616 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [437.823 262.293 454.759 274.248]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2617 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [415.794 250.338 432.731 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2618 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.033 238.383 457.97 250.338]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2619 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [431.043 226.428 447.979 238.383]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2620 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [434.142 214.473 451.079 226.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2621 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [457.388 202.517 474.325 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2622 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [430.766 190.562 442.721 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2623 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.597 178.607 450.553 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2624 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 178.607 466.742 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2625 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 169.143 364.902 177.555]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2626 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [438.482 154.697 450.437 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2627 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 154.697 466.742 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2628 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 145.232 364.902 153.645]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2629 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [427.113 130.786 439.068 142.742]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+2469 0 obj <<
+/D [2467 0 R /XYZ 124.802 740.998 null]
+>> endobj
+2466 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2632 0 obj <<
+/Length 2799
+/Filter /FlateDecode
+>>
+stream
+xÚí]Ks#·¾ëWè(UYo£õÆW%»‘X¹x} ÈY™)Š”‡d¼vþ|º1CŠ¯!ÑGÔZ[®¢8œÙºÝøúùÄÿà”Aªso¤ˆ1œ÷Îäù=Þúá êG´ÑÂ]m¹y5¿‹_Dp‘ž¹îœýåoá<Šèôyçsz²Óÿéâ±;¸„‹²[–ø§{©ÂÅïÃÁdzùsçdz÷Å+­ÁW£ýzöÓÏò¼£þx&…Æùý†ß¥€ÏΔˆ!ÖWó۳-^á„®çÛ4—OÒÊîtJ3ÜÍðsZàOðÝÆd”p2Ìi§_ÊûúÖÍo·~ý=Õ#ÛYJ oé ˆhm ‡ô9¹¼Âi¯¤AàûÞû¤Rê<öMq®¿|’`ðïpØÇåå•R*QÔFø{AŒíMãQuküHÒ%\l¥Pœ.™:l#S­’Ùô7&ä“&ªšŽ7sY e¢pÇ‹þå•UP±›øœ¸:*zÕbÆåD\§'ÆõeËA¸x$–ëÃYh=Wqd–gÏÅ IÚÌ›BdIÝY´ð&KêdŸ*‘’q( ´ù•Á§E°Åæ;/Àš7eµ4JLÛƒ¸Y)ο“õ2à*uvÓ–0©~Ú£?¸çèè¸4*wLýA¡›ÍN=c
+ÿÛTa…ÅuÕt¾%«¹.ñm:cŒ0Ò½)ÁN!6Ìá nÝþb<‘Õ™vË<›!gÚ‡g³RÆ#ò2‡—ªt¡làó²è&øŽ»´ÖzÝðÐOhxhù6 ek¹Ä…Óo–A±ø‹•øKf}Ѐíp*¾*ç¯RwrAr„uÀäd}åÅs=³úήIàèkã[uÙ©O‹wÇ2FÍpð¶ÀžÅ5õ2ÈhzñGbáxH@ù~¼ÍÈn%Â+¡¤â±AƒA~Ã3T‘æô1ñäAS
+U씚^³w©íáCýœÍΞÂQµÓ¢‰Òlí”Lí´Aø¨¹2¾^2´Q©ÜîòªÁ £ìŸUÔKàP“T—?v.ƒA¶X2kÖo++2úã ËÝO‚:ý àJ+€
+ÖúØNŠú¦râSzm±Ø*Û’ 4˜ã´D‹ö…ŸT 'ß™<ðBDÈÞ¼=¿xL<KÜ+þѭ±_ÞS@âóCQËEñŸ\(x íqµnŠQú ÛIÝ®RŒÎ¯®œ_¸¨ˆNvkNô<–ô…§%ò+Úñ·½Ûö
+ \› - Fsñ%û|?\öý÷[nT"ÏÇžˆc˜‰Y wîPŒÂÃq¨iv£p^1©)«o›¤4
+&8t¶b»´D#/Ù¶I
+‚…er-¢·Ç¥P¼nYN€ƒ,J~\qw—‰@”^X>’gÊÉ “ äGÏ–N@Ï©– Â1”áÔ†Û$Ó¬AAH íÚ6”LŒ\Bfåúa˜„Z][6Ö8W4)ŒÓ½g-³B[Õ618؃ˆaRƒ\Ó¦íÇ µ@‚™-UŒ
+®°Á¶n(Ê’LªÁD³(öͱ¸Ö¥<m®5™¸àÁý•ÞpBrˆrœ5m“ƒƒ@ž€ÆÓMè¹Y~¾‚‚bŽÅõœª·Â¡ÃfƒF| û¨š&—a=8îžfÙbp|k\qš÷N€d¯ ­yÀ
+y³ò$O<¼Z”š(³Kè;8>¤‡£FöGðS7*ž|
+Z¿žþ n&ËácÞÎ]ÎÛ³ŠÇËdzÛáƒemx8†ÉÃð³:`³€†ËFtWED0«á8t4"^L09ùëIå/.‡”¦,’™=RHùe£{ñTÙñ”-µÔ…,Ð?I¶|z]ã°a±R›žcÐú²ŠO‘åQ„Ë“ú5ò)zWu'rV¨*´O H¡‹’fŠ®?ßS+Ál8ý€)N  õ0èC[ñO#OžÝ0ªìFÍ÷Îæ1ä¢4ÅûvæÙŸ&
+6¶ØlÑü²õƒñô5#§v^¾_õô\ÈŠG´|ijk×áγvþ'›‹«G2è¸bƒérOW4pZëçR,í›õûfý¾Y¿oÖoâ¬mßz*
+žÞßb*ª*£K°¶:Vh³ÕÞCh}‹Š꼩]Š ÏA×Bó;¢lä‰5ˆè-G¬µÔ5A__Ëž ¼êW-LÈJ«ßN“ÝïRà¦O ¿Îºµ/6aÅ9é8:#°mÚR&Õòiû{UÑ:W‚2v{ëMŸY%­ ½Fµ´²HbȪ]Y%•bÕ¤n9
+)¤•úUÞÕMÄ*^L»ƒQQÞÎ¥WÍi¦ëÇù¡9Õ#ÃýZ²+eá€Ñi…ç§aÀ
+Ã/‰òŽ 'o“WÇ>JÒŠà†Û¶‚áÓ²è>¬Õñ:
+WŸβO)Ñ)Õ™\­׋CwœÝã@8oßÖIiZ¦®õœ˜Àìnõ¨¹Æczqó¡ôö›:åÙ˜×ÌŠlܱ¢YýµŸ{ø
+@/ûèÅWðKܺ›£$t"æǨðÚ‘ ð-5øWPéÂMa9¤TgêEåpÖŒÆÚ<4¾‰ãÓ_—Kˆw3'³OÜ—t
+)+Ql…åjÍûÖpÈx\nMÊ«³ *:çZ.–tRfÈ) ìp1¤sé\Ï6Jð–MÑ!+«ÝÙLaÒñW/ þnªµ"òŬ^dO7}8ë¼cµ¡z-°1g_Á)#–]½CF:gµñF=_Ä?®ÕµpŒÌÉ¿ÛÆ–^“²¨ã¬·FfyNeJz#E)Ô¼’û+µ,¯B9™uЄƒUVÓÓ´×Õ Où¨B
+Gj¶ßuŠYÞyl5ÞqF
+endobj
+2631 0 obj <<
+/Type /Page
+/Contents 2632 0 R
+/Resources 2630 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 2465 0 R
+/Annots [ 2634 0 R 2635 0 R 2636 0 R 2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R 2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R 2655 0 R 2656 0 R 2657 0 R 2658 0 R 2659 0 R 2660 0 R 2661 0 R 2662 0 R 2663 0 R 2664 0 R 2665 0 R 2666 0 R 2667 0 R 2668 0 R 2669 0 R 2670 0 R 2671 0 R 2672 0 R 2673 0 R 2674 0 R 2675 0 R 2676 0 R 2677 0 R 2678 0 R 2679 0 R 2680 0 R 2681 0 R 2682 0 R 2683 0 R 2684 0 R 2685 0 R 2686 0 R 2687 0 R 2688 0 R 2689 0 R 2690 0 R 2691 0 R 2692 0 R 2693 0 R 2694 0 R 2695 0 R 2696 0 R 2697 0 R 2698 0 R 2699 0 R 2700 0 R 2701 0 R 2702 0 R 2703 0 R 2704 0 R 2705 0 R 2706 0 R 2707 0 R 2708 0 R 2709 0 R 2710 0 R 2711 0 R 2712 0 R 2713 0 R 2714 0 R 2715 0 R 2716 0 R 2717 0 R 2718 0 R 2719 0 R 2720 0 R 2721 0 R 2722 0 R 2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R 2728 0 R 2729 0 R 2730 0 R 2731 0 R 2732 0 R 2733 0 R 2734 0 R 2735 0 R 2736 0 R 2737 0 R 2738 0 R 2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R 2744 0 R 2745 0 R 2746 0 R 2747 0 R 2748 0 R 2749 0 R 2750 0 R 2751 0 R 2752 0 R 2753 0 R 2754 0 R 2755 0 R 2756 0 R 2757 0 R 2758 0 R 2759 0 R 2760 0 R 2761 0 R 2762 0 R 2763 0 R 2764 0 R 2765 0 R 2766 0 R 2767 0 R 2768 0 R 2769 0 R 2770 0 R 2771 0 R ]
+>> endobj
+2634 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [236.594 702.642 248.549 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2635 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [213.846 690.687 225.801 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2636 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [267.406 678.732 279.362 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2637 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 669.267 175.611 677.68]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2638 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 654.821 277.452 666.776]
+/Subtype /Link
+/A << /S /GoTo /D (page.38) >>
+>> endobj
+2639 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 643.42 175.611 653.77]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2640 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 643.42 191.662 653.77]
+/Subtype /Link
+/A << /S /GoTo /D (page.91) >>
+>> endobj
+2641 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.878 630.911 261.833 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2642 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [246.202 618.956 258.157 630.911]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+2643 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 618.956 275.238 630.911]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2644 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 609.491 175.611 617.904]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2645 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.13 595.045 239.085 607.001]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2646 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.101 583.09 254.056 595.045]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2647 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [238.21 571.135 250.165 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2648 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.261 571.135 266.216 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2649 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.353 559.18 231.308 571.135]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2650 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.404 559.18 247.359 571.135]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2651 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.436 547.225 277.391 559.18]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2652 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.007 535.27 202.981 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+2653 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.077 535.27 219.032 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+2654 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.128 535.27 240.064 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2655 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.282 523.314 253.237 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+2656 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.174 511.359 245.129 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2657 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [237.545 499.404 249.5 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2658 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [252.489 499.404 264.444 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2659 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [267.654 499.404 284.591 511.359]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2660 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [240.23 487.449 252.186 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2661 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [255.175 487.449 267.13 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.43) >>
+>> endobj
+2662 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [186.902 475.494 198.858 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2663 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [202.953 475.494 214.909 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2664 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.004 475.494 230.96 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+2665 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.36 453.576 232.316 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2666 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.687 441.621 226.643 453.576]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2667 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.353 429.666 202.289 441.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+2668 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.908 417.71 253.863 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2669 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.958 417.71 269.914 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2670 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.675 405.755 244.631 417.71]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2671 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.726 405.755 265.663 417.71]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+2672 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.611 393.8 239.566 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2673 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [257.748 381.845 269.703 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2674 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [272.914 381.845 284.869 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.75) >>
+>> endobj
+2675 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 372.38 175.611 380.793]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+2676 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [255.285 357.935 267.24 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.24) >>
+>> endobj
+2677 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [270.451 357.935 282.406 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.27) >>
+>> endobj
+2678 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 346.533 175.611 356.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2679 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 346.533 191.662 356.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2680 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.752 334.024 231.707 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2681 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [235.803 334.024 247.758 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+2682 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 312.605 175.611 321.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+2683 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 288.694 175.611 297.107]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2684 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [219.586 274.248 231.541 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2685 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.515 262.293 235.471 274.248]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2686 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.204 250.338 222.159 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2687 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [225.978 238.383 237.934 250.338]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2688 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.311 226.428 223.266 238.383]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2689 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.667 214.473 224.622 226.428]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2690 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.837 202.517 223.792 214.473]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2691 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.167 190.562 232.122 202.517]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2692 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.158 178.607 227.113 190.562]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2693 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.139 166.652 232.094 178.607]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2694 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.39 154.697 224.346 166.652]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2695 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [215.435 142.742 227.39 154.697]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2696 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [223.46 130.786 235.415 142.742]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2697 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.445 118.831 239.4 130.786]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2698 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [418.827 702.642 430.783 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2699 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [418.767 690.687 430.722 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.11) >>
+>> endobj
+2700 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [436.777 690.687 448.732 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+2701 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [454.787 690.687 466.742 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2702 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 681.222 369.883 689.635]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+2703 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.981 666.776 414.936 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2704 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [397.917 654.821 409.872 666.776]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2705 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.734 632.903 421.689 644.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.24) >>
+>> endobj
+2706 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.785 632.903 437.74 644.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2707 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [441.836 632.903 458.772 644.859]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+2708 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [419.558 620.948 436.495 632.903]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2709 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.378 608.993 425.314 620.948]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2710 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 585.636 364.902 595.986]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2711 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 585.636 380.953 595.986]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2712 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [421.384 573.128 438.321 585.083]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2713 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 551.708 369.883 560.121]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+2714 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.704 537.262 419.641 549.217]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2715 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [416.265 525.307 433.201 537.262]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2716 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [411.145 513.352 428.082 525.307]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2717 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [429.493 501.397 446.429 513.352]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2718 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [425.397 489.441 442.334 501.397]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+2719 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.295 477.486 429.25 489.441]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+2720 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [434.934 477.486 446.889 489.441]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2721 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.573 477.486 464.528 489.441]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2722 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 466.085 364.902 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2723 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 466.085 380.953 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2724 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 466.085 397.004 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2725 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 466.085 413.055 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2726 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.15 466.085 429.105 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2727 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.201 466.085 445.156 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2728 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [449.252 466.085 461.207 476.435]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2729 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [435.807 453.576 447.762 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.34) >>
+>> endobj
+2730 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.573 453.576 464.528 465.531]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2731 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 442.174 364.902 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2732 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [368.997 442.174 380.953 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2733 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [385.048 442.174 397.004 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2734 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [401.099 442.174 413.055 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2735 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.15 442.174 429.105 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2736 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.201 442.174 445.156 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2737 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [449.252 442.174 461.207 452.524]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2738 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [452.108 429.666 464.063 441.621]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2739 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [410.564 417.71 422.519 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2740 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [426.615 417.71 438.57 429.666]
+/Subtype /Link
+/A << /S /GoTo /D (page.58) >>
+>> endobj
+2741 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [453.846 405.755 470.783 417.71]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2742 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [450.138 393.8 467.074 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+2743 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.848 369.89 420.803 381.845]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+2744 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [428.524 357.935 440.48 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.17) >>
+>> endobj
+2745 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [443.69 357.935 455.645 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.18) >>
+>> endobj
+2746 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [458.855 357.935 470.81 369.89]
+/Subtype /Link
+/A << /S /GoTo /D (page.28) >>
+>> endobj
+2747 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [352.946 348.47 369.883 356.883]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2748 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.233 334.024 429.189 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2749 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.284 334.024 450.221 345.979]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+2750 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.688 322.069 445.644 334.024]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2751 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [423.698 310.114 435.653 322.069]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2752 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [400.95 298.159 412.905 310.114]
+/Subtype /Link
+/A << /S /GoTo /D (page.56) >>
+>> endobj
+2753 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.001 298.159 428.956 310.114]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2754 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [418.534 286.204 430.489 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.17) >>
+>> endobj
+2755 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [434.585 286.204 451.522 298.159]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+2756 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [417.001 274.248 428.956 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2757 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [433.052 274.248 445.007 286.204]
+/Subtype /Link
+/A << /S /GoTo /D (page.58) >>
+>> endobj
+2758 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [408.682 262.293 420.637 274.248]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2759 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.761 250.338 421.717 262.293]
+/Subtype /Link
+/A << /S /GoTo /D (page.33) >>
+>> endobj
+2760 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [379.514 228.42 391.469 240.375]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2761 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.1 216.465 395.055 228.42]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2762 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [386.709 204.51 398.664 216.465]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2763 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [402.76 204.51 419.696 216.465]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+2764 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [383.941 192.555 395.897 204.51]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2765 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [390.295 180.6 402.251 192.555]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2766 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [387.528 168.644 399.483 180.6]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2767 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [403.579 168.644 420.516 180.6]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2768 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [403.313 156.689 415.269 168.644]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2769 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [407.243 144.734 419.198 156.689]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2770 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [393.932 132.779 405.887 144.734]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2771 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [409.706 120.824 421.661 132.779]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2633 0 obj <<
+/D [2631 0 R /XYZ 124.802 740.998 null]
+>> endobj
+2630 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2774 0 obj <<
+/Length 1503
+/Filter /FlateDecode
+>>
+stream
+xÚÕ[[sÚF~çWð(͔ힽïk:qf’‡NSš—$°­ƒ ÄIÝ?ß³’1¼K–=žñ€$kÏwî7CŸãôA(æ¸è[Å™÷®?¾îñþ%Þz׃ò©$³¾ÕÜlîâæŒϼö~=s}ϼ‘ýáEþäpò9YÏÓpÉ"Å_?Ó”2ùÂ5/®Ó$×£y
+ɯÀ/é×áûÞÛauŒ“Lx¿!!\Y^–·>¾;x V»ï)©Gâñ #ú
+ƒ¨Ž
+¤èl<S†î¢EçÞÍÉ-h¦l”sÎIü³á…’ìÓ|Dˆ#ñÏ7c’ÏJZÉ
+ËN¯—-)×WŽqˆk_lqò÷sL˜uò”ô§­5=]R(ð8@…[™b ¨t b6Z­Šzy„˜C¥ÞÖeͧÆVË´%g²Q'HPdL“ÆI$¨Æ¹@„• Â6Z}¡s•ÖM¤íÏšv:Ñ4 äÐç»ïÈÆS
+«Éö+m³ò=„fUl'¸"-²ûà¦)y³ÑXMGëú¼èúOŠ
+$W¡0Ø £î‡`\WYu¸´*.=êãBuçLCæT–:nn?-½zb—»›¦E¶Çõ„âµ°œïm‚m1Ú Š‡WjjTËŒ?§ …‰µ½§½­€Þáw¡a+Ò„ÇÆÜÂÊÜB
+E«ºõ¶š)ÙÒçžéZ1%ðƒ@¦ƒ;Æô¿F³ì™µ=Øãn\ÂfPŸd+ÌÝš?á!:j¦ñ}ž
+Ok;8.ÔX|½£;Oý¤&ñSH†> BOÊ‘Bv9Êê™ Çó™¯ÎwÎW/H|¼•c|]V]€Q,™ºû)b±ŒåÓ›EŠ%ÁÏC
+R˜ZV`Æ‘µÂØÎ3OÓý@1*Ür ’Y3N¸=ß„ÞéöÆËV†‹—B‡ö¾o삹:wüu”ðF´ÎE5â?¥Nƒ>lë8sZ·»-`ñŒ¸iÂm¶Ê‚rÌì”Íç6γ„R?­€ãô,T‘ …”W»žÇ”ÏÐKê?¤E›Ã¡CÇvµ‘†y”×ßùbë~·Z0ÍM#.ùÐ’´µLÅmÿmà@ò¡â’«³Ù=€-ÎŽé`¾­If‰q“3câ¢ÍÇÑÝb¹kHhêWV8ž¾lÀ_ÛÊOÊš(÷¾Êm];
+Ò~%Ä#]¼°wNÏ?Œiv<ôý@c;'¡Ù8w ­öu M¼–×ÃÄ)}ÄÇk§W£õ´ø?ˆ]‡u|ýÖ;¦Ù¼€æryX#AòÀUó Åä¦orðÔýÖ<XŸ/>=8ø: ý}endstream
+endobj
+2773 0 obj <<
+/Type /Page
+/Contents 2774 0 R
+/Resources 2772 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 2465 0 R
+/Annots [ 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2780 0 R 2781 0 R 2782 0 R 2783 0 R 2784 0 R 2785 0 R 2786 0 R 2787 0 R 2788 0 R 2789 0 R 2790 0 R 2791 0 R 2792 0 R 2793 0 R 2794 0 R 2795 0 R 2796 0 R 2797 0 R 2798 0 R 2799 0 R 2800 0 R 2801 0 R 2802 0 R 2803 0 R 2804 0 R 2805 0 R 2806 0 R 2807 0 R 2808 0 R 2809 0 R 2810 0 R 2811 0 R 2812 0 R 2813 0 R 2814 0 R 2815 0 R 2816 0 R 2817 0 R 2818 0 R 2819 0 R 2820 0 R 2821 0 R 2822 0 R 2823 0 R 2824 0 R 2825 0 R 2826 0 R 2827 0 R 2828 0 R 2829 0 R 2830 0 R 2831 0 R 2832 0 R 2833 0 R 2834 0 R 2835 0 R 2836 0 R 2837 0 R 2838 0 R 2839 0 R 2840 0 R 2841 0 R 2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R 2847 0 R 2848 0 R 2849 0 R 2850 0 R 2851 0 R 2852 0 R ]
+>> endobj
+2776 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [207.105 702.642 219.06 714.597]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2777 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.051 690.687 226.006 702.642]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2778 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.604 678.732 226.559 690.687]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2779 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.595 666.776 221.551 678.732]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2780 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.577 654.821 226.532 666.776]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2781 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.53 642.866 228.486 654.821]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2782 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.828 630.911 218.783 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+2783 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.879 630.911 234.834 642.866]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2784 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.872 618.956 221.827 630.911]
+/Subtype /Link
+/A << /S /GoTo /D (page.54) >>
+>> endobj
+2785 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [206.041 607.001 217.996 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+2786 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.699 607.001 236.654 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.97) >>
+>> endobj
+2787 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [239.643 607.001 251.598 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2788 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [258.301 607.001 275.238 618.956]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+2789 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 597.536 180.593 605.949]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+2790 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [193.268 583.09 205.223 595.045]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2791 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.319 583.09 221.274 595.045]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2792 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 571.135 207.713 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.59) >>
+>> endobj
+2793 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 571.135 223.764 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2794 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [227.86 571.135 244.797 583.09]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2795 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.138 559.18 222.093 571.135]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+2796 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [226.189 559.18 243.125 571.135]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2797 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.882 547.225 208.837 559.18]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+2798 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.933 547.225 229.869 559.18]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2799 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.965 547.225 250.902 559.18]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+2800 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [261.861 535.27 273.816 547.225]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+2801 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [242.361 523.314 254.317 535.27]
+/Subtype /Link
+/A << /S /GoTo /D (page.11) >>
+>> endobj
+2802 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [182.796 511.359 189.77 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.7) >>
+>> endobj
+2803 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.351 511.359 207.306 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.32) >>
+>> endobj
+2804 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [212.887 511.359 224.843 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+2805 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [230.424 511.359 242.379 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.42) >>
+>> endobj
+2806 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.96 511.359 259.915 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+2807 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 511.359 277.452 523.314]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+2808 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 499.958 175.611 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2809 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 499.958 191.662 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+2810 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [195.758 499.958 207.713 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.90) >>
+>> endobj
+2811 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [211.809 499.958 228.746 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+2812 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.841 499.958 249.778 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+2813 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [253.874 499.958 270.81 510.308]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+2814 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.464 487.449 234.419 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.76) >>
+>> endobj
+2815 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [238.515 487.449 250.47 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2816 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [254.566 487.449 271.502 499.404]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+2817 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.853 475.494 244.809 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+2818 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.175 475.494 261.13 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+2819 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 475.494 277.452 487.449]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2820 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 464.092 175.611 474.442]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+2821 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 464.092 191.662 474.442]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2822 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [249.673 451.583 261.628 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2823 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 451.583 277.452 463.539]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+2824 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 440.182 180.593 450.532]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+2825 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.689 440.182 201.625 450.532]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+2826 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [241.503 427.673 258.44 439.628]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+2827 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [247.89 415.718 259.845 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2828 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [263.283 415.718 280.219 427.673]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+2829 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [220.499 393.8 232.454 405.755]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2830 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [221.772 381.845 233.727 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.15) >>
+>> endobj
+2831 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [237.823 381.845 249.778 393.8]
+/Subtype /Link
+/A << /S /GoTo /D (page.35) >>
+>> endobj
+2832 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.731 359.927 229.687 371.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.89) >>
+>> endobj
+2833 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [233.782 359.927 245.738 371.882]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2834 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [209.623 347.972 216.597 359.927]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2835 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [185.491 336.017 197.446 347.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2836 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [201.542 336.017 213.497 347.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.69) >>
+>> endobj
+2837 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [217.593 336.017 229.548 347.972]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2838 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [216.68 324.062 228.635 336.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2839 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [232.731 324.062 244.686 336.017]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2840 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [184.661 312.106 196.616 324.062]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2841 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [245.904 300.151 257.859 312.106]
+/Subtype /Link
+/A << /S /GoTo /D (page.41) >>
+>> endobj
+2842 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [196.312 288.75 203.286 299.598]
+/Subtype /Link
+/A << /S /GoTo /D (page.8) >>
+>> endobj
+2843 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [224.512 276.241 236.467 288.196]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+2844 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [194.098 264.286 206.053 276.241]
+/Subtype /Link
+/A << /S /GoTo /D (page.60) >>
+>> endobj
+2845 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [210.149 264.286 222.104 276.241]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+2846 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [214.023 252.331 225.978 264.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.66) >>
+>> endobj
+2847 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [231.181 252.331 243.136 264.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.67) >>
+>> endobj
+2848 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [248.339 252.331 260.294 264.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.70) >>
+>> endobj
+2849 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [265.497 252.331 277.452 264.286]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+2850 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [163.656 240.929 175.611 251.279]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+2851 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [179.707 240.929 191.662 251.279]
+/Subtype /Link
+/A << /S /GoTo /D (page.92) >>
+>> endobj
+2852 0 obj <<
+/Type /Annot
+/Border [0 0 0] /H /I /C [1 0 0]
+/Rect [222.353 218.458 234.308 230.413]
+/Subtype /Link
+/A << /S /GoTo /D (page.12) >>
+>> endobj
+2775 0 obj <<
+/D [2773 0 R /XYZ 124.802 740.998 null]
+>> endobj
+2772 0 obj <<
+/Font << /F8 453 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1315 0 obj <<
+/Length1 763
+/Length2 1118
+/Length3 532
+/Length 1690
+/Filter /FlateDecode
+>>
+stream
+xÚí’mTWÇ]„­ ˆT*/ÊJ!V’™hHŠDð!J ˆ(¦É$Œ„™8$I  T¡¦¨Åõ€È‹ˆšE(J›EXE-U
+‡BÁ‚¨T䈼lÀzz–~Üý´§s¿Ìó<ÿû¿¿ùßqu
+æ{pÅø^dŽ)<`ìüx¡,
+üp¹š@¥Q
+àîG±
+‰1zˆ„2ÀÇE(¢PÓ
+°‘¢‰> €IpÀzÓ+åoGqk„îFH*0"ŠqL¦bDB¢oÃg!F’ÿÔ|óMJ™l›0fÖ~6¤?Œ…1¨Lý›
+LO $¡š­L&H€Š‰@TF`: ÃÆ-ÀL"àiöN=™€Îm‘þø 6ઠx0˜FO†'°˜Pâ
+Ã0t¿ ðL‚Ø æ\W¤$SÌý9ÆxÞÖÔ˜(‚¨©³y§î;Yq¨D³ñ\ë3j¬Cvqjó·˳½iC?z/ùž¨¼Š¬¥¤ìCK­²ž^¢‹%ÌÛ
+î†>ý`¥Áâ=êÙþ;OEC‘“ÆÜúZ˘3‡:ûä•=ýÁe¬;î[3}Ðc˜•oûäˆiɃö©_5ÑÚ–žNó¿‰]ú³H{r¯}ììþªibx3~ï,l|?2gÌzºÓ¶¶ë^ô#‹lNz.oáƒ8N÷FA»‹×i=Zöq÷ýõ†¬U·ð‹·‹*íGÆ ;^ß}ÖZÝ“wÞ5“s%=»Þ•r*ãÓ™„<“Í(Ôýˆm¿+鹡ß?Ÿ¶ÞòÊt©¸¢ðÝŠvß^Þpké/ϲÚ2é„6>T|ÒüÙ³‘¶wÜ}Ùe‘ý>èç[qµù‹^^:ô^K°Åæå=ABY¶î@°OÐÍÃÊ&’Nc•…¼F‡.céø¹IÛjRȧ~¾nb¨1¤{yââ®Õ]¼ÈöN^Çe‹-¥¢$ë;ÊüHÓ©_Ò”Ã!g½^X8Ɔîåej~p†Ü™¥Ï ;N˜,ÑòàM‘vÄo`žOÖ_×i›V';ìt˜ao¢KNiO:ž¼ø.Ë[wJƒ@Öúd¹ÐçKÍû.»{÷fåµ€¬JG›ø”/²}ºíøÜè]×J hš¸p­óe^²ê»ª'V~“öæ_uêklU,ßÁ®žþžå”}Oipz]54nµ¬$œ¬ŠXÜS¢ SιêÂä´í7Ï>_T0y~q¯¶pëJ¥Ùî‡ëBz#–¤Ä3ôk×û" @p5•óÓVNèvÒRiýhîõ¯`y†î˜JÖÔTî×æ¿÷jye û±Cp®6›(å¬ÕÔ|3¼¥ïâ?v}è²¥Èùxñ‡“®æ[}µb7Ëc>×lšŽxï±M“¥… Q­Ãûúš#Þ-ô,böJÇKö—Ýô*;j÷Ãq‡äóž ËzÉQkoÛÔƒ¬.ýŒ…KÝåÖG¦]'vASi'>_?&ç/}¥Q+ìn¬jŸ¦¯—¼º¯ýÄyAu~ühOõÑ]©:ö‡Ò¯?¼t÷ÝQ´íhänGÑûJénÎ7ËnEJ$ÄÛ6»›|ûÔ‘‘ÎÑdá$ÇÍÀÍ4Ë}Ö§xº¶îU%Ù9ìq­Î÷e’ÍpôÃÓÛ¥E½_º<­¾hoÀVÔ ÈuŸÅ®zP-­¤Æ©ãròî±_÷†› ]^s÷)4¯¯p>ç͵lm[=“Té!ÏP's>wNȯé(Öm-âû’îçµÚpAiMØýS6Ò6œžO?e(dSí|§ã)ÇÛkªrÌKn'Vö݉om¦çíÖ®$û èr2=Óg¹f ÿ¥™”iõ`&Õ³jø¯áþ¦‚»WN0v~çÅ÷Lòô¼úEè­â¶±¨dåæ~‡UšºâÀe5+“Ì«jö~ÿ—–åfõ—
+:ÌÍ’ÒΘÓf>¶ lYè–¹®ª”>кt?·áÆ‚¦qè¿|Hü_ˆdˆPà1B"šôoX2‰Bendstream
+endobj
+1316 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2853 0 R
+/FirstChar 65
+/LastChar 65
+/Widths 2854 0 R
+/BaseFont /SKYUAW+CMTI7
+/FontDescriptor 1314 0 R
+>> endobj
+1314 0 obj <<
+/Ascent 694
+/CapHeight 678
+/Descent -194
+/FontName /SKYUAW+CMTI7
+/ItalicAngle -14
+/StemV 76
+/XHeight 431
+/FontBBox [-27 -250 1268 750]
+/Flags 4
+/CharSet (/A)
+/FontFile 1315 0 R
+>> endobj
+2854 0 obj
+[866 ]
+endobj
+2853 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 65/A 66/.notdef]
+>> endobj
+2855 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xÚÍÒ½Š1
+ߺ¨p±ÒÏ`ÞÀÜb‰endstream
+endobj
+2856 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xÚµÒ½
+Â0ð8î%zO`š‚­[¡*ØAÐÉAœÔÑAÑ9}4¥ÐÑ¡x&éE±ØM‡ð#äþ’Ž‡j„ŽÍH¦1îœ ‰Í<²S»±;B^€\cƒœ›UÅ/çëd¾œ 9ÅÂh ÅC"ª„™‘ŒšÚç] 5,yKöÆVok{¦vì€æB§î1kþc_=Î3èäuù»}Qû ­–JöÆVë—¶^@w§ðjoÓšýHŸþ¬gëws}Ïíû)5÷«¹ÿŒß#äÿ
+endobj
+2857 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+xÚ3·Ð34U0P°
+endobj
+2858 0 obj <<
+/Length 163
+/Filter /FlateDecode
+>>
+stream
+xÚ35Õ³0R0P0WÐ5T0±T07VH1ä*ä21
+…M 2ɹ\Nž\úá
+&†\ú@a.}O_…’¢ÒT.}§
+endobj
+2859 0 obj <<
+/Length 329
+/Filter /FlateDecode
+>>
+stream
+xÚ…Ó=N„@ÀqÉ4w²$‹Õ$ëšHa¢•…±RK ÖÃM¼
+Gá )ÈŒï;nv“_`ÉûçEžŸ—äPÁY;Øïà¹Poª*ñ`ûRÎ<½ªC­²{¨J•]ãa•Õ7ðñþù¢²Ãí%*;ÂCù£ª6|ÒF·ukº‰¦sýD×»AžrF§´Â鄉G™œe²ö(†(Îã GI ZIðè$Ùp‚Ï–¿BˤCüá7"¿…s "o"b¬i,%tDí(¡õ˜bþˆ 3¶XÃÄ«1lj=Ö0q>~}âYþÑŒt¥ÐÆ3µ£)ÌÔÑì‰_3ޛϘËŒxó>C¾5Ì€ï݆†ö*Ô´í i)[&.˜ۅѸ0ÎÏï\=ö«—aõŠ¨«ZÝ©?¨ºïendstream
+endobj
+2860 0 obj <<
+/Length 270
+/Filter /FlateDecode
+>>
+stream
+xÚÝ’±NÃ@ †]eˆä%¿
+endobj
+2861 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xÚÝѽ
+Â0
+ÚpJ¶¨
+Šõ{U
+endobj
+2862 0 obj <<
+/Length 244
+/Filter /FlateDecode
+>>
+stream
+xÚÍ‘±
+Â0†O
+·ô¼'0­`Û­Pì èä Nêè è\ÍGñ;”žIškQW!ß%¹ÜýâdŽ) DÏxLñˆö!ž0Št˜Ð쎘å¨ÖE¨æzU¾ Ëùz@•-'¢šÒ&¤`‹ù” Çf<
+E%P~‚©ûðÝXÛs«¢Óe…ê Ñ^ è-_LðÄŸÖCçj-ùµ8Ïàþ‚›çupkÈð:p=ô ^ÕM?N Ë/3"§¥,Ú q£ÒwÇtIœå¸Âåö(•endstream
+endobj
+2863 0 obj <<
+/Length 135
+/Filter /FlateDecode
+>>
+stream
+xÚ37Ò35W0
+endobj
+1275 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F65
+/FontMatrix [0.00836 0 0 0.00836 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2864 0 R
+/Encoding 2865 0 R
+/CharProcs 2866 0 R
+>> endobj
+2864 0 obj
+[83.73 78.15 0 0 78.15 0 0 0 0 55.82 0 0 100.48 0 83.73 78.15 0 0 78.15 72.57 ]
+endobj
+2865 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101 102/.notdef 106/a106 107/.notdef 109/a109 110/.notdef 111/a111/a112 113/.notdef 115/a115/a116]
+>> endobj
+2866 0 obj <<
+/a97 2855 0 R
+/a98 2856 0 R
+/a101 2857 0 R
+/a106 2858 0 R
+/a109 2859 0 R
+/a111 2860 0 R
+/a112 2861 0 R
+/a115 2862 0 R
+/a116 2863 0 R
+>> endobj
+1119 0 obj <<
+/Length1 874
+/Length2 2914
+/Length3 532
+/Length 3550
+/Filter /FlateDecode
+>>
+stream
+xÚíRy<”ý»Fö5•¡Énf0½•±fŸ,ÙcæÁf˜Œ%ÙR¶$[’o
+Iö,ÉR²SBc-KY’(Ê~¦:ï¯súýyÎ_çsžçŸïuß×÷º¯Ïue$ÑÖÊ(É 4$©Êp¸6 gnnŒGŒ[FF b¨xQCµ8©˜ø{ªj
+ÈéÉÿ i(ŒÇbˆ€9†ê ú04°oÀš„ÅƒÔ 
+H
+¸pí¨(]KÏt9~‚nß«m& M4ö#ÅUW ·Þß·’õ|å¶CB¨…9b(„wóA:ÿíª^³ëÜÆ­C\ %÷·{ÍæµYº\éGŸOIKˆö‹´ÒÖØþïÊõ@'Nw*{ðI˜ò+•ôÑcÓ·ãR=ÙZDã¬åÈâi-tŸMõSeG­× +صúçrqÑí²m®º6+& ¨Ô™”Å@[§™ÁâëÌåƒ<ÃyÛd<8pÈÅ$± ÿ «z5çÓôVÇK®€Ð±Ñ‹O¼½Ú!‡
+Šõ­±IQßÒÈãV:µ«æN×¹ÞY}Üi³óÞ×ÃFyh¤‹ïFÞ—­Û™¶8ë$ ±Ê§~nׇ³;µsÄ
+endobj
+1120 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2867 0 R
+/FirstChar 62
+/LastChar 121
+/Widths 2868 0 R
+/BaseFont /ZXBJIX+CMMI9
+/FontDescriptor 1118 0 R
+>> endobj
+1118 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /ZXBJIX+CMMI9
+/ItalicAngle -14
+/StemV 74
+/XHeight 431
+/FontBBox [-29 -250 1075 750]
+/Flags 4
+/CharSet (/greater/J/K/X/Y/j/x/y)
+/FontFile 1119 0 R
+>> endobj
+2868 0 obj
+[799 0 0 0 0 0 0 0 0 0 0 0 566 870 0 0 0 0 0 0 0 0 0 0 0 0 849 597 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 420 0 0 0 0 0 0 0 0 0 0 0 0 0 583 506 ]
+endobj
+2867 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 62/greater 63/.notdef 74/J/K 76/.notdef 88/X/Y 90/.notdef 106/j 107/.notdef 120/x/y 122/.notdef]
+>> endobj
+1062 0 obj <<
+/Length1 802
+/Length2 1235
+/Length3 532
+/Length 1828
+/Filter /FlateDecode
+>>
+stream
+xÚíR}<Tù&c —µ—Aq­b^奚Ìd¼ #e†muÌœ™9™9ü0Q*I(ÒªÝTQm„|X­bÓêÅÒ2’Š–V¡ZZ²‡¶{?kÿÜû×ýÜsþ9ßçûüžïsžïÏÁ6d“ •'‰†èDîBp%x>A46\ñxŒƒƒå°ñå@ðô$þ
+@$D‚‘èEöÀ8
+ñÂ.CŠ`.ˆ
+ˆá ¸áñxwwò<ÊUH¥"Ÿ¿^hŒj>Œ†AJˆ‹y𣄻&m{Auº:™VÒQ¦ë¬í-¨ÉaV6Þ»f˜Ú}X[t¶- ιï2ûíù"ÓeƒºƒË¦±²ýõI¬vú‹Ýq9…ïã· íøË/
+R=µû5uĨ®úþ«çnÚÁwû¾WçsNWü²eä«'ß°¡%½¶ZM‘ñUMÇÓV»³éE¢Í{/;’lC ãÔ™ä M‚q~îbÍ©ÉÛ3ôkWöŒIêÿx[¢ÿeÞ»Ï^׶µ”6\é°‹j2{Ñù‘…qßÉ
+‚u~GRy³ýĶÌ›¯°šÒÜ” "'}æÒù‡7³6 î³íd=׌´ù6n Ù{˜’ˆ_|fâ)ÎxWO›Úw³WÜXžœ³^·£Ó[ÿË )N7Ècø&RUš]ÃýtÏS5Ì@ýñ!ãÿcû_y2˯0‘}‹™¡Ã œÈVÞÇâ⬕ç|æë$ËuŸì»ž¢sC×’Ûùìáâ·åÝlö´õ«üÕð*^¨p¿¼ôli…A­Z¹Öþó¦aÛ-ŽØC•„=q´>B$ÒTÙ]H²ÿ~õ­}m``Œž ÖiyµCH8É0ÑMï~q•“PBÈŠlÝ’6¾»Ÿƒm¼sù4ÇÙ4eBÔ²¨-§_@üê l2³}3„©!?W„ÈGýüþeõ¤¼ù`Vý¡u•N¦šÎJêÅ"¾¶“åUÿ‚…~^ÜéëìŽÇõƒ3©Ë’ .õîˆáÖÐ=¦OÚžÉn<a¹×nKlך§å† ¯Õùm±†QFcS)-”™~ûÝn/ý‹f‹Â¯ûùñÍÑf–e%GÚ_`ýfÖ$4þµQpìö­›e[ByÊÀ{Êž#™Ù¿}«‡Ñt]½1:Ú>»cã¹l¸;ðD¸£yS9\µté³QæÓþ}:BƒÝ5”—ÌŠZAÒ¹
+Ù} ­Ï‚_Rë`¥“nèÆÞ¥q4¸¹ìèóéV¹yvá›8kæ
+KÇË'œÈtž×ÔØÁÛs“ÜVJiòùnÃöS²Á4Ã6«Ö:ò5AwšZ[ìÞsï©o|U‘ó"òfM—œNÐÍÊqø¤—SÓJ¡ö,2ÍÌņ )=Ü’3Ò@ézÞÕœ·Æ$K/Bï;Õs«¥fíÙ¥Gé>MC4LýV, Q‡ÓT,v@ÙÉSZ½PY.¥måëhO|ÌÌæÓfV^Æšk¥Üå·j “1Æ/„ë)õò®ÆUe³ëYV41{²} …ÌÚ´¨õaRâ×û¤iÍþò³N]è?QyxøàZϨÝÓ ½ÁmRê°BYÕú™Û#ô<ëdØM˜zÐvÁ÷î“Ê»/=xº#ØYIbo¸²×zvðƒp+žõ,i-K7
+Ÿ\BÏO(RðR :u·Çþ'Dq]Õã0pÌoú\ÁöþÕ°ˆºã¤cø’…‰g•á&ò÷÷ãü¢2bFÂþÙ_~쌽¶íÌxÔçÁG~1ŠŒvÄçß2ïþÌ×äµlC³™Ž+øÑíÀLój;UNÞ¤—ŽMºšQ9ChGKžØ@›+‡,n ÷
+Û‹¸ÕÍ
+Ecãl³÷®ã³S‚IïµÔcÔY73ÒîÆãú
+endobj
+1063 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2869 0 R
+/FirstChar 90
+/LastChar 113
+/Widths 2870 0 R
+/BaseFont /YCIRYX+CMEX10
+/FontDescriptor 1061 0 R
+>> endobj
+1061 0 obj <<
+/Ascent 40
+/CapHeight 0
+/Descent -600
+/FontName /YCIRYX+CMEX10
+/ItalicAngle 0
+/StemV 47
+/XHeight 431
+/FontBBox [-24 -2960 1454 772]
+/Flags 4
+/CharSet (/integraldisplay/radicalBig)
+/FontFile 1062 0 R
+>> endobj
+2870 0 obj
+[556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ]
+endobj
+2869 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 90/integraldisplay 91/.notdef 113/radicalBig 114/.notdef]
+>> endobj
+1041 0 obj <<
+/Length1 789
+/Length2 781
+/Length3 532
+/Length 1353
+/Filter /FlateDecode
+>>
+stream
+xÚí’kPW†ë½T*RäsÙh¸£$A&‚·=Õd7l6Lb¸ÅPE±¨M)(­
+*Vµ…*Z«€RQ J­0 ŒÔ.PÇ)þluºçÏžï{Ï{žóžco+a P"ú8ÅB؈†¬w›Ë°·‘PBaî+¡ @ÜÝ PÇ
+L®ýK@(”j
+’ @!‰—†Ã1¶@ˆbjÅø®?%‘cR#‡€…,es—ðǘÊÓ@TŒQÒX “ÈUp´qt<
+Þ(g]dÀú
+5
+endobj
+1042 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2871 0 R
+/FirstChar 48
+/LastChar 49
+/Widths 2872 0 R
+/BaseFont /UZLYLP+CMSY7
+/FontDescriptor 1040 0 R
+>> endobj
+1040 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /UZLYLP+CMSY7
+/ItalicAngle -14
+/StemV 93
+/XHeight 431
+/FontBBox [-15 -951 1252 782]
+/Flags 4
+/CharSet (/prime/infinity)
+/FontFile 1041 0 R
+>> endobj
+2872 0 obj
+[329 1139 ]
+endobj
+2871 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 48/prime/infinity 50/.notdef]
+>> endobj
+1038 0 obj <<
+/Length1 854
+/Length2 2430
+/Length3 532
+/Length 3046
+/Filter /FlateDecode
+>>
+stream
+xÚíRi<”í¶Vgl%-Š<fˆY4&KjP²“}͘y˜©131Æ’¥¬Iå%cI*i!2¯¬•Ie_FDt"[x…,%gÒyÏûžÞç|:¿óÜχûúÿ¯ûº¯ßõ¿•÷ÚØi` Toð•ÂÐ@j"u#KKS Àß"ee#:ˆc¨cÔ::Ú€Y
+5fsŸHùeÅö* ÓÊÕgú”™5¢-Æ‘˜[²SDî÷ðVçÂN‡7õŠ¥”FR!Ù-®‚ŽcƒW^­|4¡æP{sw¸g,lýÖ+ûd ãt¿DºNB¶¥pSgPu›§¤{í!‰c;Øy¸.UóÅ ¶¢@ù”>h•·œ+n[E½/†+|‚~˜RÄê3¿à.,ÐJ²"9®]ƒ5Z7¹_»’çÈ©ò#öEÅ=0FxÔr`"n\¤ûËÖ2Ìäô[›Œ—ö8¾Å2Ž2Ð?pïNÑjnëá‰ìÜ.½ÉbÊ.Žœcíη÷+_¸¿¹EÈÉ¡˜œÍ B:BÀä¹Ïœ¹ ¶ðeí_ßç3ŸŒ‡)˜j¨ÞÏ6H 6Ùî'!±ÁÀêT¦Ç‹ÙšvXƒ4& ››{1Y »»Ïsu˯¶ÄÆ°jØsŸ²i‚J;'‚sÒ^„dtyßVdbS¡#6;[ëW¬*°ùÈÍájµ%»Œ¹Œìt]^ð¡%ž”³Y¼l4øÀèÙhÊVã–oFª«úÛCS ñ9'>­EáK%“¦›º7²òœ[¿Zî–q Þp?e*JæñX1…Ñ•M^À2Ëa¡}[ÔH¶6‚Z¡•ö¬É4‹E!‰ÂÞ—ç·<=\Õˆ \h‰•¤es7u$èÒ7Í,ÂâêµeöfZ] 9<7~άŠ*ÒŽ‰/I2ó¿ DØëÄì“YJî.{ªzwZñöí©mì¢kÊ—EUvs|¶ÈŽ
+l¶Å›ß9þ•öÙå…Da¯ìbû 6oÛ¾9ï
+Wgžë%¿Ugƒå»†—•®Üx¤si’5ÿè^VFGîŽ!í¦fÕ ÉF¥´µƒ#6rH*tu0ÁAj‰‡O3j«¹­¿äöÚ8^¾Tóyƒ4¬Ó`tLOúÊ‹ ÌKãرͯ†ƒy"Á%._¿!5ª[¤T¢­Â¶{Ï}bÓ®xÐUh'ë–½N§Çqò3e¤Úzqöoˆž óNJ¬·ïm–~-m}hÍUÑŸ=ÌÌàÜÑùjÇ,Ù‘¤ÚWÀâºd‰ „C?rÔBïy°…•b/8Ù8sÝ€®×8èцohe)c›+¼ÆHA–í]/ j7?E FyG½’ºI‚6˜ë;Mr;ß<h{4˜™æõA½PÁ6íºé…sÑ™t®r¿Â¶»Žj玪‘>‘#®q“$›’̃’ÖŽ³Bðh§¶[dï}j„kÜOÎü–¯ ®Yù¶:i¤×-Ï¿âôk)‡‚äðÄÎU§ß’‡-¿&TæÅcú¥×ÏTrɸ´Q‰PI9ѽR¨]üݦÆ0™ƒ XúÀäνDÎ6Í\Œ¬´(€Ó. ‘îKåy/[›(y·é8ÆÊ4°Üuš«á¥óôÃ^{ŒÂåÛEi œ8™‰ çöDZ¿¹9¸¢¨¦Õ¬1<TPÞ—aåZ?y¦¸ðì—òcEˆnætÎŒ!lñ•…âx„\Šs:&!n:?ÐØÍmó;öÞ.(Š¨¿‡Ýj„·^¼˜s`SBl©¡t=h·&à·¥dõˆÜÝ^mú–«šJ,1YÍ%ë0Ç©\å΄C¡½½/]í07liª³™K¨tÒQ{rrÚå)Êî›™mÖ»ŽBŽÊe}=ý>3¡d«¸lã`ÒØ€\3’›pCÚi^=Ø(|ŽUè¬<¢ê=ÉFÀ¹úÕß^ÞVxö„IËšñ¹šOô†HjÚÅo¿uR ÞßÓ¶é5ôãt3;÷ñ[“æ³Þ#{™»$ …†l7 쪋ßúKdÒL梤0ü¶bSJÔ!-©ùÑ]‡è«[Ûb_‰2¡µšÅZŸÜ‡.Ý2Ý…G¥zZ©´g1¼ŽžÇkrDjÿF_ìÜXú­åîhì%~Õÿ¦ž´tc¯äœYdIú—Æs¼h„l¸rêôî‚®½EINøÔ®ÞiÁxÔ‚Xtïԙ㟌gu7>s÷{IÖ7š<×#s¢æøKì熆®‹yÔô©¦pŽH*^Ì~Çp)]u˜€(GN¬¼çµI.ÖV>Ú³¥¢Ña:W¨ }¹l}¹%ï©4EÐg~VŦº¦}nÀùêÓ”ÅâƒL”éÐ »ý2^Q^®vgï¨8Ü_UdÎ#x®Fž6+Sy[5e@¾ƒ9…u/?k7Œ.ؽò,N¼²Gɨ³ªbÓž‰Ö.žÙS}YÛ>fÒKUçÜ<º'Œ/«<e–z›“Ù¯„hnD
+ø/cúÛ)œ+–øÝÕÍ+Tá±Ɖ6%+˜@ùô¢R¡–Äé…â±ûá__/ж7Ëötøærþyéø³íA«óΤuNm[MºÒrFœz›=˜‘áE7ƒ\
+«=òá=ÜT¨r›ÚÓQEçû¢#-gGËŒCDb„ZlêÂûúñ"Kš±öîúòò=¿š¦jÈ¥kZr;f°óÆ’ ÁâyàÐÉ:Õ¦ÙZà^XöŽ©~^46êø’B.=a>šØ«Wôd ±ÇUI£Gtœ× ÷®ãMZ|{M¬ä!ye©™âC¸§ò±1éЊœ±ÞDs÷l¹8"<ë^ûÌ/œ—»Í­ÿ8TF]¼ ¤Õ,†.q•Õ¨Qò9õÛT؞̚YI)¦w¯IåÂξf^[~”#æßyõ]FÚd¬HR»]OítùÈæ=‡ãÁÆ9­ÖÉÃÄâ{Õ¶¿Ìnª eøÞt.?Ïž+<‘]—/q=T«¡JÍÞNþð…ñõ>x]”üPÑÚDœYÜnM‚tˆ_úòÌÅ©hâ¼Â%?Á©'dß–õ5.Q„X!±Ë'dó+ö-aÉ° S­‘ÇŒÄ5¨t¼™|±(ÄüX_ržæ=˜¨œ+"Ì÷H: Jn̹^Få4§[)ÐmÃ,>M’C,V¾8>Ó-Vq³Hÿ*â’ŸY«á/]—§Ûêu.+æEl^bõ×{Êïe>7kô3dÛSÃ[-`)ÃÑóbûf—3öH^¦ûk~ 4£@$:øÜBW†Èq¸ö3Zá\Oog¬[¹¡w ªä–³”äiˆ¾Ì´®ÍC[r#,SnÇÌ"FØ:öHÜÑûYbN§•áP‘Iè8…àݦ×ãâ?ü ÿøŸÀ“AAõÃÑOCþ–á6qendstream
+endobj
+1039 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2873 0 R
+/FirstChar 65
+/LastChar 122
+/Widths 2874 0 R
+/BaseFont /KJNRTG+CMMI7
+/FontDescriptor 1037 0 R
+>> endobj
+1037 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /KJNRTG+CMMI7
+/ItalicAngle -14
+/StemV 81
+/XHeight 431
+/FontBBox [0 -250 1171 750]
+/Flags 4
+/CharSet (/A/Z/d/g/x/y/z)
+/FontFile 1038 0 R
+>> endobj
+2874 0 obj
+[859 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 0 0 0 0 0 595 0 0 557 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 648 579 546 ]
+endobj
+2873 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 65/A 66/.notdef 90/Z 91/.notdef 100/d 101/.notdef 103/g 104/.notdef 120/x/y/z 123/.notdef]
+>> endobj
+1002 0 obj <<
+/Length1 1009
+/Length2 3729
+/Length3 532
+/Length 4413
+/Filter /FlateDecode
+>>
+stream
+xÚí“i<”}ÛdzEdß“œ”YìKÈš}ß—fŒa̘1d){¸d[¶ÙŠ¢$$¤…({²%eF–¬Eî©ë¹¯®çº_>Ï«çóœç›ó{,¿ÿïsüSTØÒFVŽõD`1Y(ªèšY«P„QTT€PXŒŒ€P ªªP@; ÈA
+øw*¤˜$(&%ŠE8ƒàoF°9–r‚âäÃÔ?Å ‚Ðhs˜ÿOyÊŒþ# óG¡Cÿ+õ" ð€ŽÀcþYê€øÓšŽ
+òÿgÖˆ
+)ï¿¿Üþq”>Æ Ga(ë ¨ÀðxX(#e/(¤„CŽ!¿`K ´
+€±ÄÏà/V„
+
+y圧–=2÷ã•ÃngÚºU/Ú[t[ûà°±ÜÓ^»;>“^ìùº{r2ÝäÄ‚·Ïv_à>0®dü¸Ìõ‘SE¦²Ÿ9å;býîêa>¼YË,ð èt>ï"i[Ú<g^ª¾Ž¾L-U'àzÓ1é„ɉDÀªÚ@ù9Ž9óó${¸yøŸ̦3ì„VŨJU­Ñ÷‡§ŽÝ“Ê»)¬ç6Ë)<ÖPU§‚êŠiVÔ“í/úÙ+ðé^Wÿ1᰺ܧ.oU1ùD
+¨iu’IíV¾n{§~b·;#fÚ·œwÚP—˜©Z¿ØáBsýk³‘–z¢ñéî…iMÝ3мj’Œ¦ƒ²x€@)•5Úû%,<›kdCˆ=“I0çyO—‹ÀaAŽ¿€|º*w5×F÷’b–ùÝ1s¿5e¢÷! u¥€¼ÌC[^4%£[3:`›ZIl…h49< î¬Þ1h3YÓðm2ºëW“Ç$¯`|A·r¸76Yüx³x,nïY¾3ž“¿‰}¢¸Ô‰&!P÷eøKô¥º³6â²g0ÃìO¡ùgâd0‘î—%ºúÚþHöIbzÆßÄëcjháw3M£Ìõóp»Œ‹z‰ÇÅßî”ÎýÜ—©ãcBŒ/ÐÇ…J‹ / ŽÖ4FdK.nx°rÍ/¼6´€6Úå–áoÜ'·cš§RÜ;û.ùed;~‹Íœj‡¾Ö\Ñ•Þ~kßɲÇCÃS‚xßI28Œ¨Ô^[~·mp6þƒtSâ.Íi…È^±ååJó]KPgÅP½ðÚð`ÀÚ_³¤¥"θX¨¡dgp "izÆ)Á_¾WðàðÞœ›I»ÌÚ©¶L- …ÀôÐs«ZïT»£Jœ>¬rp[Ù]Ó_¹“5\/UÀ‘Urí•D”ë
+l=ª0졾Úü-î<u»¿—.9ûÆ…t¶Î+çhŠJµéêU6¸w<…Ï >Êp˜1â· s”pk ¬ZJó³‚ÑVpa2›¡3Íj3™8êG¶¥¹Xë·é¤% *œ4L·9â!é¥]dÍVx òžËå•{dF•"F}Ü=£ï0m¥«ï8ùTšÏ±8‘ÁÊÙeQl~=ç[y¨M}Ĭ-×NÒ×hº?œì!n«ð®LÑám‘Hƒyoˆ¤+ÙÂ…î]©e) Ó;Oè–5'"âlÈ6m!-‰ºXÌ0-nìð†j}i‡;ñg–žO­•À;†ÞjçTO ?êÐÇwNŒ˜¶ß:.•ÞKÛÛÉ+X°˜óØ=à®uDØÜ°µlľÞÓÎ!¡q:fëäž~³^€
+JèÅ— z0é¡äÈZ%”ÕeovG{ᶠ«ùˆ5£l³Ÿ›åyCƒá’¹SïÈ]ýÈÝðÍRôLæ&²ö¾8M*;4ÎÞ±G¶ü†ºÔ÷³²*m£rïÈ’}¸£Wb.Ï>_‰¼˜ºƒúRÂ+6äZ¿ÄerCZábes·œ:ðí1¹n–‹~PÔQjæO9Bî5ßð²?hm Âõ¯w³ O;nµ­ŒyŠ·ÓçK ;7˜SÖýÒ÷ãæÃeyPjòœ¦Õw?ƒ Ðö@+Æøã·€¯sp=Ý Õ‰WJ…¸sR´rÙઙæíõà°òdë/LœÒÚ­÷w\ëå
+|ÏúPÿdHÞïB{*Zíjï'›Ãýò
+:ofáBe!;TR ÀÖ›´w'7<>gj¼·â?^ûÉD3ƹ³“$é*¦ž¬úˆ6©{U(ìÈ=ßJBÈÁZSá3‡Q2©gƒÔ”þºJ}—42úÙ.–Vè˜ækoiR—f¢»z»Æäyy·s=WXÎ
+LMµmë*•Q“GT&È 3D©*{Ùé.ù3“úC¦Q5:Ž2ºÒ¥Å&J²vCÊwÀYÚïKU²R‡;ˆ‡W!'¾W4sÓWý€çƒâÑÄMÏ…ê:œGRfG MvLÈ£U%ˆˆ
+˜ß3ý4½uAúŦEÈåJµ˜ÌµÏø)ÃöŠ#˜žs=»HQ©Ê3±¢OÕôËQš5 úߣõôà[Û"4õšA¼y‰!Ò*“³jùQÛ–öM+ßF›æ꧆ÕÇÈÜ 4QûÜÐœÿ=P×ÖE(ýÉÜ¥IÈØcšçcS{ úÚâÒEñÕmKåkü)Ï´æR¾ØºLç˜ÓòJKÞÞ·«î]¾ª?c›òqí«5]‹'Þ´â*#É0ÌÞ»â9ÝÆ_ýº?µcσp4©R Ö±¬Áó'C2¢Üd/éxq§“¦¹—Ï~Âäåë=óŠ­>Cª¬ÄËh¦UÝsÙäv][eP–öNÊi&(öþ™œ‹òù,A³vYM®&fEÇäo¯&l]Û«þÊ1JŽ?®{µl0ѹî
+(ÀջȄ´þŽtª^Ú
+@?)œ®;rd}‚Ã}&Ò\ÿq€«áúñ>‰2Ü;ç€ÙZèØKr’O~Ý:,R»âÉ-Ý1>ÕÔëɲŸEj<(€v òºKût»è;â zBÌùzä³ûyÁTŒw_Ô<=â‰[~]¥òÃïòÇ‚ðNßQ-9apP"¼‹œ:¥ú$¶µÐ§³¼Ð¼ózÞm…͹5¾§è2I²ù6èÛ'á¾Ã<iylG~²òb²¼ïUbqd†ì«6}{î*4~¯ÖÅu³eÎÛ☊W$HË$»–a?ûsÒ‡WOÓÏ¥¾+iRTXŒ]÷ÀÜÕ½áäØ?÷AùGTær¶‘?<6ݾ^cþ¶ Õ Gbá˜Êõ½È‡×ùº=:úà†zLÓƒèùÂqm´’Íý¹ØTÜ[®²¿3.¾CdÎÂ[ýýa 澜.jÂß'@‚xÔt»¶ºóH±€h2kþU¸íÁ!éÝź—_£3‚Κ|Šnã>áë}¡"lV¿6q_¢jûÔ8í®bߊ„N û‹f3ÂcÜ'ÿáÃøÿÿ'¼Ðž€õ‡áýÿörß™endstream
+endobj
+1003 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2875 0 R
+/FirstChar 49
+/LastChar 126
+/Widths 2876 0 R
+/BaseFont /HQTNWE+CMR9
+/FontDescriptor 1001 0 R
+>> endobj
+1001 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /HQTNWE+CMR9
+/ItalicAngle 0
+/StemV 74
+/XHeight 431
+/FontBBox [-39 -250 1036 750]
+/Flags 4
+/CharSet (/one/two/A/B/X/Y/Z/a/b/c/d/e/f/g/o/r/t/tilde)
+/FontFile 1002 0 R
+>> endobj
+2876 0 obj
+[514 514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 771 728 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 771 771 628 0 0 0 0 0 0 514 571 457 571 457 314 514 0 0 0 0 0 0 0 514 0 0 402 0 400 0 0 0 0 0 0 0 0 0 514 ]
+endobj
+2875 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 49/one/two 51/.notdef 65/A/B 67/.notdef 88/X/Y/Z 91/.notdef 97/a/b/c/d/e/f/g 104/.notdef 111/o 112/.notdef 114/r 115/.notdef 116/t 117/.notdef 126/tilde 127/.notdef]
+>> endobj
+629 0 obj <<
+/Length1 808
+/Length2 1538
+/Length3 532
+/Length 2128
+/Filter /FlateDecode
+>>
+stream
+xÚíRk<TûN(Š(•K{•M$fãZ9Æ=·Á´Ij7fÆ̬aÍ Fšä²³ »Â•P‡tQ¹ä²]ŠÔ¸Ì–kLš¥¢b/:}NûãÙŸöï¬õe=ÏûüŸ÷YïÿÕÚJðÒ·¦0ýA{&ÄÖÇ`-
+!ë€3H0L⢽@8‚¨Œ
+ ewHáËN»Ý®}\-ÛsFŠ~ù‘s莧·|$W3•×Ë>§Æ:YåÑb?~<ôtFçüpØááÌÈ»j>ï3]¹/B¶MÇŽ)T–vL¾ÆI¹·?¤îÏkÈžhË!èØGVöo]Vw ìN]Vœ‰©}&}߉ø[ÚF[=3B ŒOˆÂSÏʈÚbyÁ'äÊõúÞ1«8J’\¹‹)ó~“/Ûÿq@…ßirjíìêbЃH§õŒ¿KÌMκ[1'¹ÆG[ JµOg@»ù)$»rͳĪQw²y1ýñ‚œ£ª 3?â¿oãµùÕ”5=ˆÚvQݘÑž´GðI¦¥~ž %Y#ÛÜ0^{ÿOðFY4ð‹ñÌdh£ÈÀÆHƒ5šU:R“pÁ?…k5îûPdzvÂp0ÒÄ%䌣Ít!ÖVY¸íº¡Kâe¯þ(|îNXï1ÓòZŒš»¿ósWú0—w´·eW䫤 RG5•ÕW½Qt‘ˆžËƒò$»Èfôw.»+Þ¿ÂéBƒ=]Nþáb…Ãaó”¦Þ³¾p…í°›¼ÍJb-¸~˜¿;–2pgef”ÛKzÆLNT0å1¥Ö<¶O6ÓVp#îÊ:F†Ü®qÍ5ÄkŽtöýKÞs!mgb6 óÓó§¢KW §^ûTs&Up4£Ôía€IAlzûvŠA™q0ßùÐK/Á®èB²óœNaJbˆó“¤û¿á<šçõ¶Çýzê£Ýò±‚Y\Í#ü°²„*ÌKÅS7¡"ÎÁà¼á„ñç ‹óËZäÔø¥Õ%º¹ëX ¥AÞ9„VÊÖÏñ
+îÇJn>É©ØÜeñßí/bio¼;í&§7Σ°¤Ô$çÊÒ[‰Y~všIB‰ˆv®Ý¨ˆª£?Ñ»åRŸ0ñ™œ¹ÌåÞ Îë–¿íª LꫬS«ÍßØH³I¢{Eî–™#³ënâZCý”6Ýêæ†i$ñ²Çž‡{©uþ‚ÝS½}Ðr<»ð FõT•å…Ÿ³y…ò©N–é7^5Hê¾r•¤_l˜ºy†6DÜ÷y4\£ÆN“‚÷8Öº?Ô­x˜Ë2 ¯QØñ¨Z±åäñɼöSž&ý=–±ÅžÂínŸxÂ8ß2 lÐ\)RÎ;‘¢9h6SØnó÷êyo’rNùàU NòTwP´*'i:Ä*',‹XOͳI8n¶õZGÈíÎ34 KSAÐ|òÅ´Ò†šòÆÌ 4w%?úžð7X‹´á‹ª——=6yÚ¡ž¼üeMÒ0Ü_–Š~&8Ÿ£æŒ)ñÖ=¸‡›½žÊõ6‚p‚\]P[³Ö®ùF§/[[£¤ôÚÞ#g+¡Ñ÷°»h§n´G“éC{‚›¯^÷9>=š+V‘z®‰›œÚŠ&¨)[×O5%0ï~øìa¿>8^«;s¯9´/wGCg d¸Óün~9”qL™>ª#]çä±òWÃRþŠ’}Cþõ2„sâúµ´Þ’Š´·Ïw.4á´(0QÓÖÙá7?QРâr3ß-ãþ1GÞ¹è”kK;®†$? çù¥+”;ŒhÕ¾&ÿÐ*b½Lÿþgã9×|nÏfÊgùôŠ¤á™F‰W_rÍ­à /£Âyr"z§#VU7{-$ª{;˜8õ&S„‰LÚ;ïsHläU߸:ÌÔßuÞ±ýé´úcnœÏι®|°cQ깫]í¢Q+ —2u¼÷L~„³¯ed^‚Ý#b|½­ýâ¬ÁêMå©æf—ãƔܤfé Z›@fÓÈ,/#¤~®»‘!ý¤éÞIjJŒßL~à…7~{ÃcÕ®ûÏ"]Z“¥ùÇU¼$•r,‡Ð
+Š:}Pör̽úqVÞ?K‰_uë94¢§æ iÁ†xùdð¡š`î¶Ôj÷-ê#o†D¢J-ŸWì-vœ"mpãtoߪŒ¸ÍÕa§Ù3&„£lÚ°‡Jíwí¡šY‡²¶©’g\1­7®l[_•¾b÷¬éyxÏyéÊܺJ4@·ÏÁüêÿ 2$Ál&ƒÓP¿qÂendstream
+endobj
+630 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2877 0 R
+/FirstChar 49
+/LastChar 52
+/Widths 2878 0 R
+/BaseFont /ZSRZKP+CMR6
+/FontDescriptor 628 0 R
+>> endobj
+628 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /ZSRZKP+CMR6
+/ItalicAngle 0
+/StemV 83
+/XHeight 431
+/FontBBox [-20 -250 1193 750]
+/Flags 4
+/CharSet (/one/two/three/four)
+/FontFile 629 0 R
+>> endobj
+2878 0 obj
+[611 611 611 611 ]
+endobj
+2877 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef]
+>> endobj
+626 0 obj <<
+/Length1 856
+/Length2 1962
+/Length3 532
+/Length 2575
+/Filter /FlateDecode
+>>
+stream
+xÚíR{<”ùnºÑäÎR)^„qŸw*!¦ ¹DÑcæe†1ï˜ 3„\"Ë¢¢¤‹K–eD IÌFZä~-D¹”Ö’kJÄž¡³»ç´žó×ùœ÷÷Ïû<Ï÷÷|ŸÏ÷ûSVp8¡eN€¼@kˆÂÐBi£L
+@ðCªüˆˆBfЮsâ÷ùIþ¡¾5·f’ÉÇqþëöüýMÅù“Èìê?•É
+d ‹ŸWG›1øW
+ õ‘¡ÿ^èB!0Aì~s$ÒÐøëäðL ¤06Þ%`oa ÈñðþçÞ4Ú÷úƒ˜ü0«»ÛÔa>Éǹ5ݼQ}—aäÜ&›
+…89¦^“Æì3Eäµë'M
+FæR/ÅÏûxÆäGÈM?¶sÁþòÉ8ä½%ÑC…¦øc=|Ýh"9Œ+í¢lNN
+˜ªç˜yq+‹>)Ò2ZˆAðn—©9¼Là°ÇžÑÍŠ·*Q
+›lîD)]<™Y³­çB;®Æ¸ïÍ(Ö½+å!_ ë.¿1£4:5øåNߺ‡‘€ØÁ ¸·EûµÍ ‹¼¤à­5‚»GÇ驇»c·X6Ÿ1nxOOÒ5<å²=—90Õ®_—*ùlr !¢äòÓ£•a¥jÛ>«6‹°f‹±‹Ûž&ä­¸N>Ç~¦²ßL ÷†]Þív,5|zßïm×&L;VdÇ«q‡ögaÞQ+êZo4 «¼e>8–YdIƒî4ißÿéË5«÷`ê$Ø¡‹Ð×*]º+Ñ×l>Œð³-ï6Åhάì¢ë½ß·§éœ
+%%1
+÷_Åæ¨\iYúIsÙÕϬLWq¿–+@µáZÌÉa.ʽM ï:Q†ã!‚/éŽØQ»ã"·
+uº£“ûpB¼\Z/I“ $›'9ãS¢›=#S¡ßÔs.sûôgÇôšÀåï ”å-5jØÇß<“?Sö27€³/ÎORïçE¥ÖjÏùÝÒ¡"ÚS ª¨x‚MTð´#qÕÆ­1¶rü,¶)æ\…25Íe" + ç%©-"siàsbz§p‚‹Q‹RrÍŽªê;UoŸÉ©M÷öa5åÔ ÅËWǶzŸþQ6G¯Òb¸eß» €ròÐ
+u»WÏت'}i;µÎ#ÞIó%ìȻھ©²¾ ºÔýŒï·7ÑÂ#mA[òƒ'œs$ný(u
+endobj
+627 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2879 0 R
+/FirstChar 43
+/LastChar 65
+/Widths 2880 0 R
+/BaseFont /VXGSGO+CMR7
+/FontDescriptor 625 0 R
+>> endobj
+625 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /VXGSGO+CMR7
+/ItalicAngle 0
+/StemV 79
+/XHeight 431
+/FontBBox [-27 -250 1122 750]
+/Flags 4
+/CharSet (/plus/zero/one/two/three/four/A)
+/FontFile 626 0 R
+>> endobj
+2880 0 obj
+[877 0 0 0 0 569 569 569 569 569 0 0 0 0 0 0 0 0 0 0 0 0 843 ]
+endobj
+2879 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 43/plus 44/.notdef 48/zero/one/two/three/four 53/.notdef 65/A 66/.notdef]
+>> endobj
+617 0 obj <<
+/Length1 2211
+/Length2 13816
+/Length3 532
+/Length 15031
+/Filter /FlateDecode
+>>
+stream
+xÚí·UXœÍ¶p‹Cîîww·w÷§ñàîîBpÁ î!¸;ÁÝþþöÚ{‘µÿËs®Îsš›³æ[s”¼U 5¹²“˜¹ƒ)@ÚÁÞ…‰™ŸLBA]—Œ™‘šZ0q:ØKš¸
+
+r‘±Ø»Ú™þ³Ä–öoan2s[[Ð[ˆ‡ŒÅ
+îÀ°·XüeûïèÿJf÷ìüOÎ6oAp®­«ó[
+21³¸üÇkÀö0‡ÿsWòqü;û?_¾VÉÙ 4‚Ì\íÞâ`IWðA
+ž;Ž·AG¨­³WÇ\JÓ«#¥É:}ÙgýG¹Ê´’ê{ðËä?õÜêfsóhKgÚj„…Ô~à WEKw* ç [qGKN„Y™òµCøÁ°tîÐæŠñð-éÅ2ŒÍ!heksÚoì¦o\)¥ñn{BS")+ß
+×K~ØÜDcÿÁrðOK ºä'¿
+{ݱÜÍ£|eܸÎ#©d)tgŸÅnÞ'`¡¬M†º{/psÓ%©º }-öƒ&f½2$>¹•Š ºÜ µû5‹Ýµ½b›J 4£_jDãC2Spc*›‰PQŒÂmã™NnÌ¢ —ÿ¸€Ê¯lñt±äÙs\²–Æ=“W‰~‘D͆ƒ+
+/L
+†²Ù9Fwi¦3¼D
+tŒ/8¶_¥Zs O¼ æê1¬oЫã_ΗF¨Øœk25ÐèüóU]¯o#a–Ó¯r_¯¥…’åŒÙlvÎøŒïk.0GFýfe~[áç0³ ðØO)N£Æ”ÔÆ#?‚t‘ò^à,md«“Füj»úøÏ}ûê@¥î„s,Ž¦õ/pßè ˆgOõ£Ý(“¨òFDYFIÇU;-X"ùæÎë‰ÒöÆ97¬»#I’!>úÈ«$eœ7•Ê>ø,Y¢YR)½ëÎIY1¶¤¼Òk/©éU=`-½¼ëã"Ö9 “fyd¥ñ ÚDSøX&P[cWX+ð‡ºƒ1€¶w‚EI"RQiÁüòðQÍÌU 0-ÎaÞ<WÑÀ?1IV›ïЕežËä‹Rùù†”Z{¶Z$§ÀžìwØz¿gK“#Â¥}¸B:q­_Îœ8êøEª0¦¿’çsç7ªn"øˆaí4*-±óCw§)†´– ì]1>5œí§ÅÍCÄo»EÜÐ. "øÍÛ‘q@â˘Éz´w• }íR7iàb3„Z!@g<Ãb$
+ÕvÝðŠ{¢Ž ξ/yT¹•_ Qn=…e3—AÖ¸~ú\D˜SÏ'~Ç(µY>û;èBÄ‹M°(xOSv|Bh°)»_Óc«é~ –e„írªÅ•JjÙ2†™'¢RXˆM†Ýж–UÞÔêh€zOiy—h¥Q…¦!›GìÛú÷.åCI–kÂ’5xÎÚ(lêépyOPà¢×ÑË,ÆË¿\ŸšØ=2ÔçõçGë9îa7§‰â^„‘‹h·Ú°EÈÎQ½úêI(]¾ÏËL¾”BWÙFncR]ø¹Æ„[Bà…„_씼CMw¸x\ ¿óYˆZ½€hh‘¢›c,9Ô q¬.Ÿ–›î¿P·PÝð««ÁZLœ‚[–è?të>ë)üBψ̆ØþstçPH©üõ9HÖÿ+P±­ñVKñ&_&ÝZ=­*F!¿ˆÖž ÖHñÙá‹ð<³í¡»‡…Ajaã˜d™YRïTv‘ea`jˆ`­8B³ýâ(C•µØpô<ïsŒ8?ÓEÇÓ*}@y´×ÁSµA‡˜B}O5E%â1ê²<ÆúR#ÎÂ~ØGqÝy³?Ž”ï=:‡Ca7Ê_Ø-mw79鶛ÕU>ªìðŒ|j Ûºñ¦¡ÍÎÿYІqþiî²Ù{;ÑAïïú’ Y\‹íZXÁÅDÝg*¦”
+g•qÜ
+œK Nˆ?ùNMb˜¬ ûxN§Æ+f^(ô2ø]tK ÃX‘—CªõË#p§Ú¹·8ùžï\“0© ~Ó2Šùj1žY¤&„Ôƒx'ÛP §­/¾Q#–^ÉÐÈ Þ–úöŒP¾.° )¿¦BEÀzó"ÛAôbv ÖÉýƒz½ÿÀéüT^9ÌÏ7×Xòð.¥Õ€í彘ÄJÊšõLIþNô˜Qç{I³ú[ç,2îP^˜×Âì€ÕiôU̾ƒŽfû‡ÒãÀ8øŒ5 «@µä5?éõNÀÞ4æÒN[ÀÎ-g2¦ØÞÇ€D›÷%ùÒ2ÔáUŸ¬±–ŸÉmâs£÷] “Gõ(Óî÷¦gÏV{ÇöqhTx$N­ý yî*!ŒM‹ÖÅPëËZî‘ÅÂ@èJ×¥\7©>g·MâEÊBÓ(qH¼ &VÊ#¾qD!¿$D¾ƒ9bŒ”8P”2oåliºë&éÌGâŒ9îç=¾û¬eöu¢)Uñ
+ý—×\‹­<}È;Àág>>ÁnŠ½+”sq£r¯|ˆáÿ¾=nŠ“+Ôv×ì'H„Z´¯W‰ŽÒẙ‹GG/Ь¶º4¶ñù/õEOõˆœäYG^°ÜÄÒ3ñ;ÅìžL/ÃŒLv„g¶g¡Ð
+òÈo|ü7«ðp±¡¹kËîQMÔU6Ï>E`päÔx¯¥$*“™ÀOò!×x©á ­ˆä'ÞÜÃ+Z¢ln?ä‡b´Ü™ø,†®¢Ýµ<z"øj´wxßU»ú—0l`ýØ­%ÄSg£t3;=ùæφߥ݌o_“ŽÈêórâ¹à£Ò?ik/ê‚Œvvâz²ÓY »SšÊѹ8­… =í Îp ZëÓÄï<WQü“®ÖဳŸeï½=T(ÿÒaåûÙŸñ'gó•>žM›äU™5[(iÆÄ^\ž·Ï¥øW·}Ôê‰Êz<eò#Ô‹)™§÷w«ø=¶Š¬?Ç'Oh€/¿ŸO.à( _°x*Fa™+¹‚¸f°F·ø[ ‹L.ú“~ïÏak¨{Ô7SœÁܶ…°núòL½8S×ÊFaZì)fw®p;ƒ ›®?³’µ`ï”?þŽ¯»Õª^/t®ý«bB»_ÒW(=úùÒœlªxç¹oj
+²:Y$Óób+;t«B«ûä÷ª
+“xðåݳ{zæÙKEÆÜ5’ÒŠŸÚ¼¾îu•ÿé#¼ ð×ÙÒTUwGtTØ ‚<èE{2¨¸ýŠyæ |ÕJJÂ÷XÖ±‚ÑüÍ=(y¦àµ(? '{¨0»NqÞ¤Û±dsˆ^°n»•À/ìš“°þ!Q÷w$7¼„+ôÇõïÙ¶ ö*xŽwtZç!Qc(8Àãúyme±ðš²f9¯VvÜ– Þ˜~ýî³EfÂ…ˆ‚#
+Dw†ïT¶ù¿[~ëø9Û%€+qxñb–¹í6ìå×·ø¬q;ˆ3WT² Í(Ü?á£JF‘,§ÎC[5â4ï÷y½û=¥ðb•†Ùv¸[:?€AKü5H2×3žž;²Ÿ3Iü5Iý¤L8V5}7z0ÁxxlI©/–»¨d(¥#FÚÞJ(áëó{b
+–‰éc­i©,Ý8}˜ü5¤x
+²k¦*ú,Dl¡q­kÀ”jXùDVQÃaqÑ#Â,¹@‹Õ›î \hŒ ·s{arîKàü$Í¿ð|-„ÊËýQÀX‚Êø²/3A ô­ÿùÜ£ZëG‰EêìwÒ/›Ú'6S k1»-Õ Ãg.ŸB/Ëùi»AUi‰Ð§xÈ“°˜Âõ7ߌc+e’J飉'Ï!è.‹Š5GÄXëív×(0“þÂ>ÒÀR SÚŸF=…Ç-2ªç’”¿à|è ÃèS|‹?1,«!Áƒ!É|h³ß ‰¼ÈYt³§À bùs{ ¤–ä'©u3šçµ·­tÄ¢¦÷¡6ÏþœýÍåÀõ+À,p&Y«²êÕ×zFû›¯›5ö=‹—Ÿãø‰ê´¿™‹Ü·£÷MøõÁxåtýå•“Û²~öÊÙ\]<Tm¥O#2!,þ5¸wÜø[kŠM\(ªæûê²C^·ådVÏ›ž]9Xb''g½ˆ)!2•‚82K£¼¬Ö¯MÁe6{PM³6´Ÿ/Ñfù’àX^¿×æuÙÍÏ"›þÉx#¾öD*ËÛGË{AŠs‡e¾¢OĶ­Ø^Wü¾VÛ q5j$+&ê¸Mf$û)?ÉBÚÛÑš&Í“IUDÊW£—b5n¹#;û„²’¦‹0!‰[꺭Oõc3PŽH¶u“%%“Ùšæw€,1òQrÞ”JS÷z&§¿Ú–KVâ((çm>ïrÝ͆Cáj®,L\@rï|^‰ä¦øñ=úÙ5õt25e³j€?®«$i"û„çZž±CÖ
+wþ8Aå/ªïž¼kÏÝqWœèF’E„기s>‘EÜ/]JÇ q<•T $TyÅ2Uo0BÍÜ;âë«£éÁäç@*žQ
+½¯óg²ú™Tƒê·vìî9ÒÝR%ŸzmRvä4¿4˜>ç¯`­& 0à—C¬cÅëYdoNEÂs®)&7d¥ºÊoKì°\Ö3ÝeÏ,Ý䳦ևãRMµ^Nº4bh(`EÄ4÷ï?!tzEé0é)Bº9’àpf HߢpõúK‡G|fÌÊ&Bf~ȵ ­Š÷ˆKAžD5Pë[å€ÿ(èæu
+ÿÇGp|‹Äª]1¯9âbü åyÞ<6ò•,tj Ç%_3‰RÊàêþ®-yˆªáL[Þð'´é…b·BtC+¦Û.?"—Y¤Ã¦³n\—Ÿî'}9äPÅk<Ô ·Œ.4Fó‰Z/Ípiø
+)OÝ’¼Y™¬-˼ñS^„¸6‡<ƒûÉ} “c°r-cDDë¤Ù`h¸ Ó<ÂÒ^lO7(FV§©”®ý±‹¯)ßïÀh³%@I©òcÌðÅ0
+`ÜÞu|ž™LÇü=A2`ê/[o¤|Å$A¯Í=×Úéc›enKžˆæEÊÃG®Ây*êBŠòqk.–E€BG&᧷Òê’‰R)Ô{Ÿ4´ÃT–f<µ-ÙŽDãÚÖ«È…Ùí-'ükJÍ%zÝ{<Í„°j0 ˆ'Wi.ðkPÜ°÷RËq·…¬´ùóìÇéûÛ¿D‘gìAÐëQ<u@ß¡›^ÑçÜ»Í*fNßÚIf ®&pN¸ãn1ŽÚKw4ë—/æ†õ!CDŒ2Ï>U)ä…ª O‚¿ÛFbAŽ‹Â
+áa½Û¸¤Sóɤvaþƒ7yš,ª¿ïóŽRVqIŠ×-Y—CÃãþèsŽW7Îk1œÉÂÐV„ûÊÔv|0Yži{Z\Înc·{lÁãˆÈø‡í‘ý cIÐJ9
+ÿ
+„á$„}pMr0Ö^+óº<Lû®Ö(Æž²c«„ýœ/صÂ=¤IªïóîU†¡·˜Õ+äÑQ… Úù:Ã,Æœ…o:œÜlªG²m‚šWöÂN4ÃòŽia áµO{Í
+ux‡fN¸…ê«» c'ýM{u‰×ñ“¾ôØ|¹ñUÈKJhdÃd›
+ã»ÆD­_ߌnW{Ç£¿«oê½¾ƒ#ÚÉr)£Ž¹ |ï­ë›{?é‚}·`¹^ëì—+êö+gðTC”ÙqÒÀ&BÕ1§$½ âp:Ä:+œ,çÚÔ™<sý§ñ5m—ÇQ×xøà´•åðŠR&æä!2í@Ÿbòiˆ7åsu"ýá {‚âdŒóK|ùBJ
+äæ4áM Õ|aÏsF<ÄrеÚf ìÌlA.Lv »NçVrx!lYÀì Á¥öÁa)†¬@BíÌF1Çòeåt*ßÂeýòWC(\ƒ^% º>´(X'(àËHÊ~™¬‘ÚɺÆÉòƒºÊ9þè˜QÿU0ðŠ³¸ö˜eÙ+ðó¤Ï$>Öÿ|™³Ø+žáq„…BݼêP·•ïr&N<·
+;ßÿúµ{±(0յߨõ©]Xˆ5A,¨9‘ó|˜ ˜ƒ¤ÈQi᱑G´(&
+]”Iˆc7èf9êÜ}ÔB"JÆê2öNXBX¥4±²ÁuR?aÙç \㬿ƒ]µÒÍëa3ÁV)vòBË´‡ßõð-[ôxÙê O¾
+üøþÙ×ÞÒ#ZN}äÈúÌè9¨ã±ÕÒjÐÌéT:ÿTìoJ%.Žû¨6¬Z[ËH¯H¢l_o#€Q#ªUV¾ÿûDÏ™¾¥½,Ô“•E¼ÞP­ª¦u$«ªAx§×‰%„ññjÐîêC{hÇuðÓŽ<
+Sa³…?Øa™Û\W£¬§¾zÈþŠ,TóõÔµÓH–â°Â;õIð¦óÖ#µ;\ ¸ŸFxØhÊõÛP^§Œù
+ öõÓ2Émð.V•Èñšz³þbí&é¿@ó†Ï-×»æ¬Ùcne+­êÉYC¹ùz58"ž×2ßåÃó+»ýðùX©¼— J¥Zh绬wíñr£GÒ“2–moÅdµn ÙÚ"‘¯#7ÍТìq‚k|¦I3‡gI"½Ö^¸üe×¾¸Á òˆá$¦þBnÆ€féì {wRá5ß„·;Ôd·†«ýƒ wçPÕªØÇ0WYד¾\m§ç®¤+;¼Ïp ð¸ýË”³ãÏA;§ê8·(á ÎrNZ®$Õì€#ýïØHÇîñC§ß!â…#!÷)]® øU’nÁ—>íÆgKvÖwð´m
+ÃòJI+% å3ßÇp³é5Wi<Ù`nv¸%=§9àò,…v`Hkg6·€ã(·S•ÂšDø
+ŠóAí ï0ãÉL~•DãÓìì„·Úy÷¸kSÂîµÕå©‘{©¤I¡v¿)iyçédƒsÆýñ¹ü&NJ%²^"º)ÿ›¨¤Sgÿ/”ƒ¯§
+¢¾G—VñÃZkQ mˆÑ‹ ¢óº·II
+^¬Ð‹°àçÃþþØénÛ9'éð%kÞ—¿†FTC;ÔáÛR.J<›C¨Õhxöò5ô«›J=³YXŠâ`ÝѼ3Á¶Š{/ÆjW6‹¢¥ËçÚÌM…„}'ýåÎQw`ËÝDSfjÛ¤ ñbøJDÞ{^D±Øl×çSÄq‘)e.r>·–S^y£§)V u>¢¬@Ûz*QDZú|9R½?½ô¾×Ä|i8d™_õX@¿{ n¥üéÃJâ¿Óª
+kÀvÓ3CQ^ŒMÓÖ‡Bk¢ý=äP›Üúù 1ÜŸ­/êú±‹äã+Éê‹•„¸¼Ý Ÿ¤ž9¦-‘µuIGv-ŸâWš‹»ù'~å£ë¢žI{ïði»­ëò™+æRÉÒr¸²}‡Ñ_à-oŸq’«çÀÐóŒøèµ*5j›"RÐAÔ¡¿ìË©2ˆ¶fx¤ôq„2ø¥Pb™S ¡"ÐD¯^z$<Ù~/~á"‘Ó
+Ç­­™^ø`í¿|ÂP‚äe !‡‚ñ=Ü#ú
+­»o©àxÈ.¹kfÑ O©‡p…ƒûGÍ>µ]}O58¸A"Ù ~Ì(i°ÿwUTYí'QIhKªAZÈ­Bö¬ù‰a"Ô¯Êdjózèºjš^ᆱpLã|‚ÿ…}&<®–ª¸F5§RöåBØàL–¢»Î~[Ò„°C½Ö;nÏ/­Íös+•{RÜm÷9*ŠŠ§ËÏí&¦z-ˆßô ›Ã?j=EÍ¢Pü3HN°Ü’7ž §ð'KþDÌXÜ„]?Þ͞ʟåbê;c…äDͺGz.<'F´fådGèÏj³™*60¸®ýËô‰©Êì\Ñÿ@"äò*q`¶ÍŽ%^ag˜½8Eèh‹s¸' b¥ŒyÕ–^!’= ×ÓæoRèÛÐ QÌô’ Y‹¹7s©¯jΗÏBÃwc
+s©ã õ¢¸SÁ±|’êoý[O@óŠ­;×~¾“b ÷¢7ל“¨‘¤Áòc6
+Jþ[†ù
+m7“Å|NÊÒ‡T;h:œ°ÐìÙneWÖÊ®Ò_LóüjÊ•q*Sv¸Fƒ9Æ \ž¢ÔV3јy™%Î~·Uòb¶ƒ¶Ÿ— E+‰º›öµ¹¿õ¦e†³ܹȩ nù¡ù=ùÀu"õdoÕù%:¯‰eÅŸëŒwZC¡Â>lì¶Ü3¾ø]
+ê×É0š–3UÍ÷ò'&{ŒöALßÌêåìdýƒmDGÍŒ ¬£éOÀž3ç¼ø8ÞU
+ÝÌø0ɱ¬EûNœ÷Ô:“Z!Ô9éü’%Ì@»âjô¼`^_ê»?²Ø¹n4î¼Ñúêw9-ã}e¼×¡”‰œk…ì—ïrµëçFSr·ø$&ƒ¾®ºãË1Å~;éìÇúTWcp…'ÿÒ—d^ @`5{û9yˆ ëƒ×PÚuŽ#"À³ªÂEYϵ¼|xUq GÓ+Fº†ð:‘ì…¾¦·dàõ+~Õé{<V¼ô4¾ù`À÷™ SîKgÅ8Ÿ
+×ïÞ¾)ļLÁÙ“ýw¯É‚¯7Ø2]ЄMî­ùè}V9Bxía4Yyý!áÕ±—VÅ$Ei”ïj—Ä ½´p«x~éóçe×ø?+à¶"j1¥ÑX)wD,n²SBÿâÔYÀàlÁÓ'½›¡tJù”7îDAz5Éþ¡.•_:ðw÷åÑêTš­%D8VÕÅHÊ<½â})¨iúŸgT7°õDUë&cuy¡† “³ï¡BŽžH†!MʘIØ€r=nÔm«/=æ§HÍßÕ^pÈs¢«
+Ü›X½£Ûé*“}|µˆ¬yNèUá° (iZå‘‚¶šMòÖ¸¢J?ÌsOK‰@¡QDw,4·‰;CÖ¥yZgê„àlx&PYHiˆ}¸:Wo÷Ø€"¼êþŠ!šÓŒ”I‡èìíÏh$ÿ<‰±+«.ñÃsٻʊêsJKõµ¬é ­©¯|\eMŽþ,rB—DN h-êÞŸª¼ªP¦ñ¥ŒiŽ|?2.‚åâ‡oÞ¤f¤©øìÚi*'h>qw Æ<cNß;S‰®Fø|©a6U±°OkqÃïOm“$¡•úcô‡ÄáÍ(Ý}›S6|-Uu+`R»³ÍÜ$ø7=²ƒˆ— ã§s,JÁiÜ­UÞ:lçë­¿Š–upUsý„!Ь«uÜ„^zzo“Sc$®íªç%j’F=
+i0òÏñáÔ³ý
+Ü7£Lq×_Pç%œ-0ú¹|G+¦¡»P­šlÚ¼¢Ò˜ ë&¨Hª}*Ú01žÍ¤¼—9=bðÏ“ÖîFüÞ1a´sO^{cQçÅs–ŒÆ"’ã%™ë¨¤”ÓÑS)YÚð×µS£¯Käû²qƒ¤¢ëZ†CMü¾•“C´Ä%p '”Y‚ªè„Þ‚‚+À”G‡à©`k-åë¯$r¼¤ÔÎ;Ì]õñv¨¼w(YIí _©Óè|γƖƒ–‹ŸAňM'eÊ>a§¸ˆ]d†·DÕÛ5·0¥q´rL?‚Ní²¬ÂÌDh‰]ÚU>Ö˜p½cóuX(_4»ÃΦ
+µ7Ȇ’³
+ íoŽ%ÀžCêËdíD†±PðÌXÆ ø-.Sà ÿë‡}O³Ó,
+F
+Ðxí³óß)ꢾ}g~§[Àn¶—á¯3[4ÆäÌî)ƒª,üyç²ó°éÊœŒ(Œ‡÷.@/ÂœCA&»`o±D·›uGŸ²R½ùi®¨“æ£Z G0—uN¯g.ƒjB"#{%îë5Fx«hßð#˜½ü©‘ß=¬‰¬¶mî … u³0Š%2î_ñU£ B‹ü±ÂÈ z·]P˜àL:LKîÑ©€ªK¸@Á¸Þ¹1í†{à"¬ç³d¹êªaãg$“ÛÀÓ2,]½FÅ¡&ü˜}Å’3xNDU‡áYæiÐcŽp”õc”9¨wß'óûLy‡|cUslø%"¥ ß;ϼ þi»kxLtc¼dÏÝ’X®Ì{“ª]±ú¬Ø¼³"':¦r"MÉÚn[Ï×Éö)Õ‹X&]Zs¢?ø qû#j‡Å*Ÿ@@¶³øºêñÒñU‡©âR tV¨iaŽ‘KÅ‹.6Ò‚N†}øÕzÚ/x9}õ‰hÁßA½%ze†¿0£ñiå²#»è›'¸‚_ÉåHÜ‘/q6qOÈËœBëÜDÍuëÔóè/VU£ÇÆ~G™Ãà߯s9ØüÙL; ¸ŠÏÕBC\°cUàiØ2Ž«VžpÛœ
+aÛ÷ôp²ŠÕn*¼èä®Xåƒ<iL8þá­£ÝXÐ`l ³-¶¥›‡=@.S —º΀E}ƒºŸõŽ{^VuöH¢=ýliÛ–tcã'«’+×"uD¶8¾PL°°³šbyÊ
+*ÆÑŒWð}2.}gx¾8Û°—q|<åÙü~‘G%åØË14tlüÏ0ÝQÁueïYÜY‹)… cw÷È¥Ù¿Ì:
+/Š%ÜIÍ÷q!7ùaY`Ó¬b„µÐGÊsÃ$ªÄgÉ£ÌsJ˜ë"oèˆIŠ{5G`“½hw½19S€ÙNyÞo †Q`-‡"TµFb‰vI&]µVãÆç.m„¹‘§ºb×Áz¦Oï–<'Û¶1aŠñÜ‘ò¼œ£Ø?bUDŸ ìÆòè£6Y:õT„ÐTÓªv¡ò³<„móŸ÷~àßÝ÷§:;”jn =Îä¸À2¶¾ ü:…ß`·€¯ÚkØL«abÍbÆv¤åçÓ‚a–—œbž_Zv±#ŒJ˜—?ûy7%€¯…²ÏÑpŒóÂÃcÞ¡c3ÿ&†ÂN’¼Vÿ"¸,?níVvQçCÜÈõ¡N¯Ñ5C¤}ïDí>qtXÜß(œÈ·G]¶lEƒ\ªbî`óyDb£™Z&ýÝF~B ÂÏÛç?ö%v$*Â}ä‹â©É,[eh&Ä:-ÄŠZLZ¿Š ]‹tW¿Ûì[Ûû×^ämUa#@‰^ŠÚÛòå•ÆL:=ÛmM,©Æ$‡Ý9 úƒÙ)¡o™=×»Æúÿðƒøÿwðÿ‰Ìl& ; âÿ¶êð"endstream
+endobj
+618 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2881 0 R
+/FirstChar 34
+/LastChar 125
+/Widths 2882 0 R
+/BaseFont /BHONNC+CMTT8
+/FontDescriptor 616 0 R
+>> endobj
+616 0 obj <<
+/Ascent 611
+/CapHeight 611
+/Descent -222
+/FontName /BHONNC+CMTT8
+/ItalicAngle 0
+/StemV 76
+/XHeight 431
+/FontBBox [-5 -232 545 699]
+/Flags 4
+/CharSet (/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
+/FontFile 617 0 R
+>> endobj
+2882 0 obj
+[531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 0 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 0 531 531 531 531 531 0 531 531 531 531 531 531 531 531 0 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 ]
+endobj
+2881 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 34/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 63/.notdef 64/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 88/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 126/.notdef]
+>> endobj
+614 0 obj <<
+/Length1 1224
+/Length2 7131
+/Length3 532
+/Length 7920
+/Filter /FlateDecode
+>>
+stream
+xÚí–eX›[·®q
+¥P(-V P\ƒ»»w+‡@p/^¬P´Xq§¸{q(î/Zœ¥øÉZßþV{¾ýóœ_ûÚÉŸ÷sÌg<sÌ‘\/-•š&«f•…9¸°r°q¤@ 
+wF˜0üm“€0 9Øy P lv¢áåÿ‡­ÿ—uµ³S1³ÿKþïNý·u3{k;ÏÿÊ€Ù;ºº@á
+`afç ý;u€ü§DÿþöÁ.£¡,§)Ïü_Wû÷¢š™µƒ‹–§#
+¶I®-ö“É/Agt~™R<ÜR›"Ķ¿"D0 oÓ‚RüÀÁ·±.}št¨ô‰bÁ³FR/áÓï­É2ßÿ„1;Uó¼od‚2Ù×…gŸ¾³@¹éØÀ|üõÕŪ[;z…òw¾’ôâ¹Ù»3?[ÿ‘µ…Ç ¯¶’°3[”¡:»«±_®ä`¹°…ü"£Ô‹g÷ $]Ë“¶KOR"3A¨3)"·X@F‹õlŽ4[ʽŠš‚^òNëd¥
+òfLÞ
+m%i÷7ò’û¡o‘Ù¾c;Ðbòæ?BmW*3õç/«é|AŸ ÑòaUO¶--V*µ÷<ÀJ,¨<á@Íòi;—hìµÈ„Ç*”ü/˜ûh_•º<U»É1eƒë‹µvt9À6˯¼Ý8[U_óYÞOŠjäå{ÇøŸÎq“‡¿Æ|¼>¿!@â(ã•ä÷üs^Îõ1¾Lã°á‚ÃNIÊòàšµÀFP[¾ë+½Ot¢$ß~‰«³râ[hyíô™#ׯi!M9öe„´ÂÍI3K†â~гn…sb‡þ&ÇÈPYÚ‚»šÜ$v¿ÍyñZ^*å_9‚št
+õvLH(Ëh¿Î’ˆ7/àSò|uYï bKÙj?³¯EV'®]ß<:ŒYláY€ 5M‰,Üm ÿÊJuƒ\YH ¾Ò”åÔ}bÕ~ Ìi `‰ù~Ï'½×ÉY×c1ÞÇm,í—·Ë1uò£ïÓë³â¸"o¯z®EJ·vÿÉ7ò¢ÅÙ¿ŠP´ÎŸEë}‡‚©îj}Ò…0˜éè’ ¢HUAìí¹Î›Úã:”½fõê@²Žc–‘YšÙÙEi )êzøÙ¦“¿O΀<L­½P}—Ìpi&æn\˜ÛJúMËþ;몉ÌÈh3×?E5e`VÇ
+²uù¤Šûaàe,ô¡ßh†ˆ÷»·JÍòU’–äëqϾ€÷}¯øY-بkTy×F³a¾ç¢&8f)f¬à[Þ(×urj‘UççÍÅ®¬¸Hh²hGö^È4íÔÈ Š/}šNzUwßE+U‹Q?j8Xáü˜Ù Èúc{oÚ+Ü3Á¼‚`SÝF#Ubð(í²Íâ:–Û,¼ï%ɜˆ/Mï\-«á'"h‹¨Ð涖ͳ_'6S]­¾ÈOÚ¯I•ØчÁã²BؘÙêÇhˆG©£ÐKݸ½Î¦N¤þ…\õK§•Ì¬¿2H’èPx,J8¢¯šØŠÝ×m_vy,QиpÈ°ÓàTàB2&ºóR™7K,ãÛ>@e9 ]­gÃÕ)‘?æÕÏé• É„ö6MˆÕ¡9Öuñ_lÓ—÷to&d8Cîê bmúà ¯ËIæ9<
+Llð¥!1£• ©Ïœ%¢X†|­+72@”@¥F‹óipîÍ0FÓ­Œzÿ°-æ·Xà4ÿg¸ý–7*¡4™u”óP\‘¹bîmÁq’²Á/¨¹ÂlÇùËeC·Ø(Hª&^Uk[/Džép4Xì°>o‡”c´Å5¹˜Æñf.7¼Åk£[ó]g6B~Éï|ÄPUÃÉ“ÃÒxÐÈvLÚ»*¿YÁÀO»5[[ÿˆô¦sŽÖHòèüØFV£Ï¦¦@´Ÿn¿Kîþ3âWE.Z>Õ2»(
+*)·?32g›ãa3C/©YT¼eìÈ%,„‰ð«IÍÆ{ÞŠÈ!á=Â$J Ãctp¼—hÍA¨4Eü4„oº·­™Ty¿Tçò´íò%V¿ùÚÌ"S÷pÑ$QXól>,â} †%HÝX5 ¹nJ­IÅ4‰ÿf-ÒaíaÈ„LÝNÉ”
+þÞJ•Áã`œ¥¼ÜŒ.*%¹Œ›ý»ß}¯›Ï 1Åï‡ÌY7O¢ÄÕ&ÛÖ2F­_ËH3øv¤a;?"°Òz‚ý.™Hø³±®/EBÛO"J3yWRÙèõzçÈÿfp³Ài1†ñ®dk‚,¦fÁöåá±Û…†¡c¾î §ïVIÈ÷Ò¬»Æ,>:.î|Azªä„á©j´Ut$OòöQ²¶!£m2÷g—¾)·!sù7û ò …è:1ËzO¦Wªç6›Fg_£Öò¥°ßªN ç^¸Üø¼I³äûª°Š¾23º2a`&J?<ÿl%îzfµ*‰qSŠb’º?âÉ”›uU”ÒM¼a-mÅh2K/--DaÓÌãä àõø–š³—Íq /sË+ˆaq±ûŽ—S Ía¿–-´¹¨ßÅÚœsÒ1ZìËQ%i•óÒc‹4Ä)Ó8×pµ¥½y'vLç@pªëí",wUîåôutŸ€MýÞI›ÛÈóZ¬ù[¨žC ²Ÿ˜SŸiâ2±©nœbœà)©:Œ®âñ$º-ŒÃbY(,H\Tß¼çÖÖ×~«-ÓøtǃxùÃÓ×%ÍÓŒæ@Gß/é¬Y|äù…ªY"±µK×&4S_¿/^è£@QvºŠšOêï Ÿ‰NGП >Arfîý¢³¾h´”¯ˆw\RV·ÔÀ#ìþxÇyµ¹‚{àZ;yõԠرõšh1ÉpÀÍíâJ<ƒ¬jÖ»4å!”>n
+Ο%~0 áûœ¸<¶|é:hTEû"
+eàÎï ¶ì3ãxr61Ÿ~»yf>Eø+ ýS©SžzÍ«ýœdÎ%†fç+›eœ†1µͪËÉ3Å^Y/ꩳšZþCœ½³oy­™˜¹Á]§ô˜£,æ5ÛÏpªx-¤)¥ä\½hýÄ•f1Ä’w’; ÑàvÓ,WÉ´W¹c+¶tDªby#
+vY•iñ‘¬Æàµë˜n)<íÑ“ÀãûÙÿ@KšC„Jq[ï³\}ú]á™·±ÆŒõ·%t©°Jã·\šîk0çIF4­¿—³²ÎI—Iš¥Ÿ8'ªz°Ä6C{(|Xш¤ ÿ¬àÌ~äîݘ¨6j…¬Ï¥Ð“Ž—ü™iÛ;äÅ+«ä9b[M à+ò%Wˆ¦¢yÛCúW'i Š–“ê­=L.ÓN=9ÞÈ’"ƒ½Ž÷9å~cüMÊFfªÅMÁoZ.½Œ¼È츗~
+¼vÇlZÂç€/•¡_/I]ìR ™v'™¶–ì5ÝÐ?Ö/U¬Ô»_ùŽŒ”àëÑÆT3¨„ñÆDèWý&0ôsÓà¡ Û’µoeI‹0SZõN÷N™ôhÌAÎ9ë'kÈ_äGaƒÅ[.¬(­ ¢ñ·Šï¸|ª‰ÇÍå¾wœÔVR̪<SqU·£1*±¢»_¢`'^Þ' [Yá}ßn]¼ç¿= z.<ËÍkÛ¤Gtù<Ôü¸£W¦¦$¦•m›b@ o±ÊCí©Í®íøaÊqå'¢«27zpµ'¸CÖ’Êm±wCFÚ°˜ •ÿëü0|òín6s©ð ùãèÈ*YÜ펜»”}r³åWzAç˜?AÜk Þ!º~L'>‚ÇSÝá¥2]ÓJû_~ÀMÑõd-¯Ž*
+Çs6÷wlŠT™ù¸4wÞšO‡\™Á¤Äé·oev‹ÜÇôPå’C8ÚW˜î¾äôú-”øUIÜWE8·ÃÕjMp—Æ~2w“/t›+|aÉÏ)PDüâS Møª§5ÞòâFJ®j4È3»ñ§gö+‘
+ˆ@ T¤åÉåPHpFh¢jWÑʨ¾eºçiú1ÖMÝ—ñÔï쇙BM‰]ßdêB|ÐÀcÕM^v‰Ž<9Œ´»â¨.„ýfqí1b}Ç?ë
+Hœgqd²ª2ÅuÓV%Bió†6ô{ÒNE»¨6±^æ¿í6dðŽÄ·ÌmŠ§i
+WeZ`—܈D·ºL¿p•ëž$Ém aÙF»‹áÊ'ËŸeø"ñXdö\Ñ®?¦bøºÊ£‘E¼cøÝF*ØGSÒb¸½Hm°øö3Çëî¦g§/RK50”ؾØö¸%K’ùµÕ­íüè0÷ùˆ—†{nÇœ‡ÔC5Á—ð+¥jv××$„í; X`Nƒ–\Ôf¾¦ÀÞ‘ Úm§%LpúP03S?j•µ9‰Ç¾O½­|±^ê×͈&1vY”Þ«üz?TÙá4ŠöÑt*eR.ú«u2*!Òs¤«Io™ð'©9©¾»É+ŸÃŽ&ê‹ï”žd= „yÝV^’J¹æ¤?¡Xln—H‘RŸ‹‹ì·€ï„ì’¸ÑnÁD– òcèÞ”·ÃQï#”©jB„˜—]ÒI«ó¢ãY
+O8 Y@ìR'SüI¦œâqï"È8 /V»?£|`ÞL¬mYÛ©îÀY½?^¸ÊXÖžmK:›FúŽ@ŒòTzèJ2.Q:àFÚ?e¥ ûòñ":Æ‚ŽR]òÏm̳D>y±†Ç
+1ÌÆê.¼qäÙ,ìò7^V½'!\ºñ%G>#ÕñN‚ðq<îàòͦ=Ž)ãI·}ë¾MiB¦µ F©ådac8ᘼ9a좶¨Ù¥Žm[iVãÞK‡8÷[-ñgg<Ô‘6©5j*tÎAS|’Ãœ¹kôèLß<ü£/-äÏ@ÉWiŠ0ÅÌÛ]ÉwïpUòêP©xb¹È„³ü
+÷ÄyFò!Þý%²HÀ±^Ìe…ðxy7@%¨"pü íÎàÁOp"õdž›HQÍÀ[qâ²õ†1]à.ʺø†ÏPU%† e9s>mCÄðö\žÜ<Im@a?ÙíÜëã£X7¢™¢¼L…Ûa#~Ô‘wTC0ò®fN~¬}¥Á toA•¢Ž”‰ ó VÑÙhÿÞ©ô6ÝZuÞ;¦Kd——c]h­×¼=Q» Ý• â&ölŸ¨WÞ-Õ|òKtæ¡‹gu…ýr«€Óq¯F<7Vë+4l²Ût‘ÝdøúŒñóèÓ¬ü C/zû³`ií™7aù!fS„ñsì¯ÒX+>.ؘô{¼ß9gñ¿n\_¿°HzFϯŽö󆪠âp­ã_0Ñ”tM¸×dÃEMtºv†ÐŠ+,¿ q3i=š¶Ôs<[èeñ0øÄ™AWd΃’s„üÁ—eó@MÒ{?¹Ã†+Lp$ñs!$6çí˜m‘žÆvÊÙ.«bO|ÐgJk)Ðæ¯ùcŸü/bR¦ýkÇä#2!ËêÛ³wZp>®L`õ@ú°"ù-zý<&'ÓôMÅEHtÚ˜!W«â|¶©æWÇrfÚª5š>ö«^ži© ›™ŽmÕ!®8Øíç’(òšÄ5ç¤vpRÝBúH¬ôQ•[ßµk¯õå ηÂñI¯5ÕØ6šœ­Ç9m¤aÜ Læw†½ÊÜ~®ÓÌIn€±
+endobj
+615 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2883 0 R
+/FirstChar 58
+/LastChar 122
+/Widths 2884 0 R
+/BaseFont /ERLGSH+CMMI10
+/FontDescriptor 613 0 R
+>> endobj
+613 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /ERLGSH+CMMI10
+/ItalicAngle -14
+/StemV 72
+/XHeight 431
+/FontBBox [-32 -250 1048 750]
+/Flags 4
+/CharSet (/period/comma/less/greater/A/B/C/D/E/K/U/X/Y/Z/c/d/e/f/g/i/m/n/o/p/q/r/t/u/x/y/z)
+/FontFile 614 0 R
+>> endobj
+2884 0 obj
+[278 278 778 0 778 0 0 750 758 715 828 738 0 0 0 0 0 849 0 0 0 0 0 0 0 0 0 683 0 0 828 581 683 0 0 0 0 0 0 0 0 433 520 466 490 477 0 345 0 0 0 878 600 485 503 446 451 0 361 572 0 0 572 490 465 ]
+endobj
+2883 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 58/period/comma/less 61/.notdef 62/greater 63/.notdef 65/A/B/C/D/E 70/.notdef 75/K 76/.notdef 85/U 86/.notdef 88/X/Y/Z 91/.notdef 99/c/d/e/f/g 104/.notdef 105/i 106/.notdef 109/m/n/o/p/q/r 115/.notdef 116/t/u 118/.notdef 120/x/y/z 123/.notdef]
+>> endobj
+2885 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xÚµÑ1
+Â0àW
+oÉ ì»€¦›âT¨ì èä Nêè (¸µGëQz„ŽJãkÔUP1C>x’ˆž ÃùÒ@‘“V´WxÂ@óÐ'=z$»#Æ)Ê5åœÇ(Ó]Î×Êx9%…2¡"‹iB
+endobj
+2886 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xڭѱ
+Â0
+endobj
+2887 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+xÚ33Õ30W0P
+Lþÿ€z€B5ü?À
+endobj
+2888 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+xÚ31Ó3±P0P0SÐ5T0Ò†
+)†\…\ÆÆ@A ×"“œËåäÉ¥®`lÌ¥ïæÒ÷ôU()*MåÒw
+pV0äÒwQˆ6T0ˆåòtQ```°b†ÿ0‚ñÃ0%ä@„=ˆ¨o
+endobj
+2889 0 obj <<
+/Length 288
+/Filter /FlateDecode
+>>
+stream
+xÚmÒ1N„@Æñ!$¯áò. €&°ɺ&R˜hea¶RK &vÐYz¥5–Anà–žïâ†Q!L~â?Ìâè (9ã’÷s.\ä|“Ó=•ã.§/×w´¬)½ä2£ôT_SZŸñãÃÓ-¥ËócÎ)]ñUÎÙšêïw}Ó:Dòqˆ­ôÉ [‡ÊÊàÐÌ`d†Ñ„‹
+´šR¼;è\o‹G‡Þ$À°@³5Õà¡L³k¤÷.€„"E „ò"fB7!ÀÞ
+endobj
+2890 0 obj <<
+/Length 251
+/Filter /FlateDecode
+>>
+stream
+xÚÕ’±nƒ0†/ê€t À½@cÌà(RB¤0Dj§U§&c‡Fé Æ£ðŒ ˆË]™¡RÕµ’?ýðÛæÿí¶ëMA9ôhÉmÉY:[üDçDÌÉáÍûîj4/䚣ÈhêÝ®_4»§=Y4½ZÊß°®ày
+É e
+endobj
+2891 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+xÚ33Õ30W0P0WÐ5T03V03PH1ä*ä25
+(˜Bd’s¹œ<¹ôÃLM¹ô=€Â\úž¾
+%E¥©\úNÎ
+@¾‹B´¡‚A,—§‹‚ü ``°QêAÔ?†ÿ`Ð
+õãÿ(%ÿLñ£Pìÿ¨O¡Ú
+ä
+endobj
+2892 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xÚ­±
+Â0†„[úÞ˜I UÁ‚N⤎ŠÎõÑú(}„ŽŠ1ÉAg „»Kîþÿ23ÖSÑâo6‘LË1å ãbíC_8œ¹(YmÅVK—eU®äv½ŸX뙤¬æ²KE﹜ ¬;D¹GM6 äl3`„ZDxo)ïÉŸªšO¸vÇ÷„86Š’v€%ˆ¯£ka³Ã+ˆF€>Bòî -=vÖU€… ê*®õÃÃxQò†_õÒØ#endstream
+endobj
+2893 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+xÚ33Ð31R0
+ä
+endobj
+600 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F42
+/FontMatrix [0.01004 0 0 0.01004 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2894 0 R
+/Encoding 2895 0 R
+/CharProcs 2896 0 R
+>> endobj
+2894 0 obj
+[69.72 65.07 0 0 65.07 0 0 0 0 46.48 0 0 83.67 0 69.72 65.07 0 0 65.07 60.42 ]
+endobj
+2895 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101 102/.notdef 106/a106 107/.notdef 109/a109 110/.notdef 111/a111/a112 113/.notdef 115/a115/a116]
+>> endobj
+2896 0 obj <<
+/a97 2885 0 R
+/a98 2886 0 R
+/a101 2887 0 R
+/a106 2888 0 R
+/a109 2889 0 R
+/a111 2890 0 R
+/a112 2891 0 R
+/a115 2892 0 R
+/a116 2893 0 R
+>> endobj
+2897 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+xڥͱ‚0€á# $·ðÜ h©RâÖ1±ƒ‰NÆI4º
+Æ£ðˆgx
+§éß4§ßüÛ3èqcð€?ƒî¤«endstream
+endobj
+2898 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ñ32S0P
+endobj
+2899 0 obj <<
+/Length 125
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ñ32S0P
+endobj
+2900 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+xÚ3¶Ð37S0P0UÐ5T06Q05TH1ä*ä2²
+… 2ɹ\Nž\úá
+F\ú@a.}O_…’¢ÒT.}§
+endobj
+2901 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xÚmѱJÄ@à )¦É#d^@“6žÕÂy‚)­,ä*µ´P´uófæQro°I²þs«¸'nóÁ,Ìì?ÛœŸ6\sÃG†ËÖðƒ¡g²+k¶'ñæþ‰Ö-U·lWT]¢LU{ů/oT­¯ÏÙPµá;Ãõ–Ú ¿+9e÷cØëúЉþ×^ }@–8Â<q‚ΰH\¤=”.|¢Ç ð´‡NÄ{ÊQåKT‹Å¤ô,Ϊ˜ þ6_T9ŠA91ƒT¡ó}ªdÛ»‹º]ܪü\¢!Z ‚¨-5GäÔ +±¤C}uêPõŸÿƒ.Zº¡/ÕËendstream
+endobj
+2902 0 obj <<
+/Length 222
+/Filter /FlateDecode
+>>
+stream
+xÚ½=nÂ@F?DiÁs°^Ä
+º•H¸@JªQ*’’Djûh>Šà’Âb˜1Þ‚ ¤™'ÍÏîÌ «™_pÁs~õ–<ÿx:Q°dÁaþ¨Ž´.É}rXÛiš\¹çËùï—Üúý=¹ y.¾©Ü0PÉÀ‹ˆÔ@Tt€Fé11Ü05ÈС=™´È¥ÉnÐz“ÛlÕFAìb«È»Ø(²®pM¨í—Ð'hÄôÿñ´DZðiëtÑã¾¼WH«çC5dƒfô2Z©U1¯Öc/™Nж¤ºß0§endstream
+endobj
+2903 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ñ32S0P0SÐ5T05R05PH1ä*ä21
+(˜Bd’s¹œ<¹ôÃLL¹ô=€Â\úž¾
+%E¥©\úNÎ
+@¾‹B´¡‚A,—§‹‚ýÿÿÿ0ÔÉ? ÿA
+endobj
+2904 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+xÚ¥±
+Â0†Â-}ï LZW¡V0ƒ “ƒ8©cEçöÑú(y„ŒNž¹ ØŽ‚ùàr?÷ÿgËy±@ƒülÖà%‡”6ö†[œ¨è–ô&þ‚v[|ÜŸWÐÕn…9è9š¸UKDÝ„˜³Ÿ —»6Ñ«XÔ¨þæh[ÚÏ^^±ï[%÷”G²yÉéED-Ì^§?p¬oƒ¸¹ÑÓÀž¾·§$^ÁÚÁ>­*—°endstream
+endobj
+2905 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ð3¶P0
+endobj
+586 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F40
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2906 0 R
+/Encoding 2907 0 R
+/CharProcs 2908 0 R
+>> endobj
+2906 0 obj
+[58.14 54.26 0 0 54.26 0 0 0 0 38.76 0 0 69.76 0 58.14 54.26 0 0 54.26 50.38 ]
+endobj
+2907 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101 102/.notdef 106/a106 107/.notdef 109/a109 110/.notdef 111/a111/a112 113/.notdef 115/a115/a116]
+>> endobj
+2908 0 obj <<
+/a97 2897 0 R
+/a98 2898 0 R
+/a101 2899 0 R
+/a106 2900 0 R
+/a109 2901 0 R
+/a111 2902 0 R
+/a112 2903 0 R
+/a115 2904 0 R
+/a116 2905 0 R
+>> endobj
+503 0 obj <<
+/Length1 2197
+/Length2 14289
+/Length3 532
+/Length 15510
+/Filter /FlateDecode
+>>
+stream
+xÚí·UXœÍ¶p‹»<@ãîîîî·wwwî<h€àÜ‚×à$8üý­½÷JÖþ/Ϲ:Ï.³æ[5zÎz«ž¦"SÕ`³p4J;:¸1±1³ñ$”45ÙXl̬¬âHTT.@S7£ƒ¤©ÀÆÇÇsr°sØXù9ÙÁHT
+Î4u:Ø-ÿär²ýwô¿öοÃìà)\ÁݹÚþ ‚íìÜ]ÿÀîæŽöö¦"`qko'kàiNî‚ÿRK»Ú™ºZÿ‰€•}€.Ž|
+]*ÎÊþIê/M$Gå ȪWšASÑŒéóF¬0JÒ‚ñ%/}¦Òj Üêg¬Y—J½’ìS>EÓó“¤H¹Ù)®óŠõ™ã¦ç8á s:ãÒâ©Sñ`ßÏkÚ¢ªŸ\TO$¸½´\y¿IÅmýÅŽmPÂÖÍi4>–AW!l0ñ|§';eyçRV¦É0¡Õy"Z!v£bVÍʳ.;à”» = `ÌnÕÄ÷]Œ ~ìV:fyuð8q. ! H$ïy¨<<SxcèwWî s
+Z
+®B2$p#-{uŒë1¡Bš ‘RèAÈSHÊ -³tù©~¦`ä½aâ¡‚cq™ÿXà~u 0¢ç©Ù„
+U-GW†RbL‹(S|EF€Y²@š©†W¨þœA)®… ~ãሠì°E*»íµìò–ç´'K¶s×"áQùÎ}N9b£·wÀ <ÿÒ8¿5æX1“Œ4ß`jy[ÖOxùŸÞ2Yv4&†}"4$Îæ~b¥°v™¥úv’Ùõ?ßø
+’&•¿0OÁÚ½7ËV¹ÎÇk~¼p$ytv@á…-ùd/L1t~NÜ/}]Û˜LÒ!áƒ3ÎT°×™BÓs•ySÙÑŽ«b¤+_¸m¹¶•>Rjèÿ^²Pè[¦ìsÄ,é¯kkÝŽ®y ÿnSbÏEnM—þäyfÑ"x.´[ZÝ)¥µè,)ÌyòARŠ½¢™*ªž[ëp UN&ó2ó¬ÑM:?µ‹š@t‡±KbE`Ó8ɳ¤‰¶ö€ Q³µÖw㤷_øÁ50Æ5?¦:‰º(0úîSn ©2Àjðs+w_<!l6]ƒ\‡4W)ÂNµQ™Ööøí™)E—4í¡ƒ_#¤L¸B|(µ†þ:
+Aï,ô{l¾áíý(gô@_ù3×¾:ÙŽnñ^çÓ¬kîé¼ñ†Æ§wؼöGúg”¿.Ì~UÿÀÛç=TViúÑ:Y±ß]Tµ*ÓâÙãá½·iÏE…õüežDl€¿bo$ùX> JTMűÀl1ØŽA¡™uâ}fg%˜õ³ýj¹JDËŠ˜š ']VÈb«æòJ ³EØÕ‡&’«Ze-èGÎ7À‡"tûÔñ,Âá5óûnnÍæï¨I´ïb¹ýõn&@bX•ÚÀÝ´Ëmp«/+b[r=CŽT¿¤f:¡ìà»”àó÷9Ç+1­r*ñ„dju&bë]yÍ—ÂZ7o«©”ÉÄ1-ŽbÜr©
+ü@œÐÀ×ó9²Í 7HÕ‡1låxH²Â‚Eæo£ƒåè1›½Ì §^ö±Ý¾
+ð½sîK‡‹EÚRZ]¨j¡mK}ýT‰ø_iw9’H„ì2 ,M=¥eªâ]5ÿf4& L,¢ôï±+Èw¸ÞÂEV˜§Cë;ìϪý´ó®ÌéSRÔ°>+ϸ_ÿA*:]vð[«!" #®µð±'åQb³
+@ \ºíbC𯩃dë'Ó0–ùØ‚„<ôd)6ôÀ"VQHâwN´äì%ûðû¶È­)rbHeΩū.0‘sÔåö!³< ËPž Ó\ ñ™¤§tzÜ”a¸Ò´oŠæÔ6œ|gô'¨ÃPÈXÇ>?0ác(<ü}³ÓH‹aÁ¯¨X«™l¼Ý“É1ÜI±Jš••OÛœ ³Èׂ,ÞH Øá
+`jœG|‘á[‰.È#o½"úÙ¾M4³lO㳦Oû~EMÏåî,“ ˆdOÛÊ(~]ìn¾FšÆ\B*W@¨e EÙ¾—iiÆ‘pQÁKÿ¸WÜ•Ð<û÷PhXnò,uGV‚4HÞr$$Q€^2îÁS˜x¼¨
+ȃ‘¸õLèìž$Àwwƾŗî^óðF¥(¡ÑeåªwŸc×ûÄ7_ʲ6mVbB e«8Ÿ_99Q-Cåˆøm‰¾ŽÀ %O|úÌ­¢R<ÌJ½ö 39¸$«;z‘ÛüAÒ°¤Ñ%£Ա¸V”Gê=E®<1ôÌÎÕÞüIÖ•©â¢Ö‡%a  ð7!ÀSìÊ ®!MåÃí’¿ØSƒÄ+³<5 J{16¦{QHáäúz2ý+v"ÇsãµÚÕêù&º
+|ŽŒ1y„&35ꎪøýIå©VxÔ¾Yw›ü-áE&O¿‡ vW@4oåJû;Y_ˆ›rí® a&¡üŠkÆôæ Åò3"w·ó›uü'ø—ë»åõš•Ì/ÈÌÌ’‘’
+²´3È(•6ãu6Ì^sK;"ITݯ«‘‚³.—DÄY™"žxáJòŽ\Ë®_—)fÈMkn)Œ0Û²¾gIᔸó½/hÚÕWF†©ÝÖŽ‹†¯iã.´zv‡&IÂö2¿ Ê,JÔ"„&%I«I½.~¹ƒEeÓe´A['•§
+
+6kúhªÃ?Yw†¹ҜƋæ8¾ÕÒÔŒ;IbùÄÙS\†@h£ák¼óAIt
+÷z_?ÝÖ«ÕÑÛØ”5l`³Ü6Ê…zï*q'¸4ÄAÅÔ¿0̨ÙiuF™Û×o«Ìž;WZy̧{µÝÔbDìù
+,K¸lËyhN’’'Öl¼6°‘x9Ü„ÒdNÙò£Ð8k0ð <‹RfI.y¨¨XÑ¿Ë1²îÌû}Ç•yª&k°mšV©ú’Ÿ
+Z’»Ó„&¬þ·ƒ1þÍ{PúÛ®¡û·¾¤Š|B»óÉ9oÑ)êì]ó·ØA(çRÙ~X
+K;½w1aŸæË=OpÝd—Ⱥñ(Pćø^¿WãÎêÕ¿šQ¥Nnçl± ¥½Ûç¡÷)Y“Q *\~ûµÍ‹M¨Äy2¤ŒO¼‘ wä9ƒ8µš]OÜšâ ÿ+c|:˜ö“ÕT²´—,d+a$Œ—B·ã«ðÍúÀäg5©§6‰Q[¯PµVÝý›=¦/ÝÏN2&AR
+gB;¢Ÿ×žiË’ž-¬ƒ=ø³±$Y€knºq¡niÃ!beÖ¹)Ú—>Y–š6K³ÂŸŸW
+ÚšCÖ,M6Ñ4‘ñ¾Íù1 ôa1©l`#“ÌWÈžœ?04ÏjaØú²úsõŠ
+ºköFCiÌlœ)l¯’LŽ·{øiîç\~LÒài€ÞÞÂ$Ù "—sFO`K9Â.s63(n?Ý[Ï;™Av6Íâã­'Î$Ë˱8{^Q,}³H9#\Ú埉¥€Nú‰žþ1¹r)O·moßK orŽ]ÜôæÎJ°Bhĉ–1 Åò´š{ãº{¶‰o“ü²Õ
+ƒFOÌ&ŽY›(†æµµHòróIÇãˆæC
+úA_—¡¨8^£1mw‹ò–ÕŸ „:´&ÍŒx¹¢ óŽ1Í1%¥z¶{ h¾Æ]o'7”m¹Dx*Ým» äå×¥d¯Ü² W«¯Ü`ð4ëZoÐTSøþä½n¹â“R.žûÈh
+ñ,h R0 ˜3ˆÜùlBpšKoN}w9º§ëî…7úõ5MGB½9Ti')0ß¾¥{4-½áGÁòrð^ÅvvÿZÕ¥ªj†£}ç †Å@û7Më§û¦wÖ7Ý…ê «¬é¿sBŒ|ëÊ]˜e’›3“®áÑí¿' Vyô‹Ô1ðº'!úMÚnoÈÖUÚzøÙÖ܇õ(^ÇÞZŠzÍûûÕÆRwêÌ=×tJ#JvñÐ’3ˆwYâÌåÄOª!wlÖO$èzÜüSœÓFt´ÊÃ%8j)¥í ½ÍÆ1ºì1ôíÉ•ZÒä ¥_Õ? m+oWvä¹Õ0õj~óõ*|Ñ9‡À§3Ùç|³} F Iº
+iªÁ˜¢Û_ Þj ƒu÷$`C5Ñ”ÜÛÆhÞÒîrA [ÒÕð„{ÉE÷èŸÚjhK l’Pr/Dû}Å´Mü‰’²ÆOVgyHºÒe¨Ðp6,Ü+“·a “/ É~ä½XjðªùJÉó@­‹xˆÔòÉí ¾¬uuïTÜ©.‰2¶>ÂÚŠ©@•×ì¥4Ò
+ô#ÁÝ”Š–ÍD¹kÎwG Á“´Q¼– ǃ«pk;± jPY¡mè¬Ùd²D?™¼©…ïˆó1÷°&bMì- šº ÒÎ
+,û·ÊÓvçnÝXú*2ÌÎlÌ;ø`ŽGYµÊO,KOÆ' â$óD_ÖÛ¹Öìyê¥e¨ŸÎØ.[ƒÌÌ ¬@RaÂî´~gúðDªÔ§”©ãlƒ€ÊðUÍx…XÜʬ- g^H±%'8&ÑNSYY]º8à@ÕᛢŠý$–µc3´G!"ï–‡Ô)ün‚ ñÒ)¿súeˆ4 iÚp•¦¼Ät†]Œ>ËŸQÊT–ñ,ðýœ ¶i<Hd±ÅºæK}bEü§×
+ªU)ÖAIF´ÑÁïI9r×lï«e_¸ö¦]¼å>W‚¾/…àÇÚ/¸£jø!ýÒzW»H³±-qÜCÅPüÏÚà'“8ØÿX=–-äêTÙü–e`ö…ÖÎ߱ƿé…Îœ¼›Í|ÿr2PÚ殄é¸ïÌy$ÅTyÀ6ÊS¼ÉÕÂqÿ›½o‹{Üз¬ŒÓä·2‰ÕæÎ/3…ijWrOFZògý1ˆ
+’ #Ü‘Ñ"rFtSö\áb8ØdÈÕæÕïBÄškèçvÙ”ýYæiš›gÎÆN*){èYpÎïYÜœ¤Eˆš×¬;K—Áq´Î
+
+Ó®…
+)ò‰»8꣒K»Ð£'¨dÆN/\Ú ëׇ²N@!ñÕ‚I†y"CµNm‹Âòé
+Qjß' o赇â`ˆ4­æ™­¬pPf‹!îZ°˜‘Ø9†Ètrõ#Úo°q^¨ñ>ŠªJÍÞd 2ÎŒŸa±³¹ Þ;oæeÄ“àë4!S!ê±"»‘
+vpû°a 5v²´%ø5w*Z8ÒKŽx¨P«÷CŠ•î£Ù_ø—Â&Z[ê w4ÕóoÛ!»> ýª=#þáJ­öòMß™"×*MVö„Í ¨6‹lî û$Ã!Îͬl1 ämT˜O²6‰îäÙ§Œ›õ¿|ÿåK‹>¶Ä-G‚b@ÚôïHlZ‰Of>6ì&C"Oƒ£†¥eg¯TRHw·­yOÈÑåà¯Ñ»GÍ»2<¿i®7tð=ÎB÷t¯5q+÷›Fçãö¿r'{šùòªÍª¨\ˆÑLBÊçe|pM„Ön¢(šì'ëö¹^Ëð
+5H”ä]úÇ~$Æ$ŠgƒtW
+¢q¤Öó€3š9èŽHåcTrh—ü.ï$³8ÿ;›â‹á-F–ËeM‡Öqú{‹(HŠ’)AÀ¢Ãž
+ä:ŒFyB]lW‘á”J*…BW©‚Vù¯ßZ!IZDf»ÅuDÑGZbñ7‹÷ãFB«'ýríÉ^Np–YÝ;J2R>wk뢂ȹ¬ÑXÚ6)>\C¯¸…S4ÆìãM©_¿1ÕJz#Û"~Tò±üçù\ «xq›z¡ÛÛs¸ëíƘÆ÷€aa;Óa¸?'ØÉyߺ#ºÄ¯÷!†þwn
+äðö¥¹Ø¼ÂÂÌëX—,]„Ή‰³‰KaÎÏCÔëöƒwáL©æet¢@8ü•™PV"ñp^}Ìæø$¬Ù•ygÆ'$ùž~Fá\hZäÜ£«îªñhJªw
+…Ÿõׂ¶mØŒº~¸ß~»êeâ<¿"–É+ÀNÆÏë|ÝjuªÙ´,Ñ›-õDŽÍËñ'•Åþ4ñƒíήÊE«´úêòÝÏ%wá–ž Ô—ËŠ(Ñ“;ÒGȧÌy‰å6(mE cO›Ð•nÄ£îVó°J¿ú53T´àUÉ?y¯cÂóùÛ.ïí1 çÓ†tŸzO1˜q(˜Ÿž[AŠ7Ö1h®Mx^¾ë»ž¸îth)È}kn²,Ê_^Ï)È6/›øfvUÙF¿^ç}Í*FÆÑ«kX碽[ÍöZœ¢Ý€1ýí'¯á>«Ï™‰
+_Š¿%ûÄdieÿ+óo¿*³—¢1Ñêþ/«ƒoôjÈÚù᯻hkðWMÖ$P8PãÝ{ƒ0ålUHÏ{ù­o“×ÍýAOQsú¿k)´ÄqÝ?9K†°.ì¨<ùíûÚyMÃRoþ
+ú™–hêžÅÿußøéD]ÿtCpäV
+#ŽöÓÖÈþ8›?œ–Y—v«íi§$l|Z0K&3ǃóÙ™ ª“ù'AnQ¬ÐBÃùæsõ¯Ì,A”×ù¨?¨G(ó¶­øÅñ&1³H“\Ž…^,1qšÃÀU~ûqAÙºþ*mýò­fb¾ãG3Ìg©É ,! TþCiœÀ/1þKT µLe‹dŸÆÉ*ͽ©ë.CYÙŸ1YÊqVí•?Ò®«~µÀ…_VYá¥+~DÇ3“Yû*d;ÎxL­HžVØ(OÏÈàCÞÅÄ,ú¹¯mù7ÂÐü:¡¦­å¸DÓEÜ"Ç[}ãðµ‘ã‘¿ Γ*ÌÜ' WV»b^ì&EŸoê†àõ§¬wywˆ/¦?Âr¤5ffÒ÷2à&›zWh¨\5»Wy2msÄoBªÎêhÖFV—¦ ^¯P ²Ñ®übßÍBcÞ¦Xlk¾è?ÃÍ2¬•Bô(:v9ÿòJ*#0N1žh­tAñº†1Ê`Ö2Îå`18”F')³ñœg{Oø@˜‚¶¨ÊfٱؒÞs¼TJ‹gܪ'Îl£|æB"ЙRg÷2† ©:”•–Š¨d"ö0µøN¿¤;1 a-Ù=nÁ6RÁ¥2~þ½Pc/ôý¶zßöÄ
+bfC/œÀÀÓüÆéÝÂ@
+$l´Kú³ü@h%v¼ ¿&‡¼$G׸&wW‚ñg'ŽQnù´u ¬[$¬ÍA±€KZµ1bFÒ­‹J|žž—Ûq¤I|~rl&5€Ð8Ò¶!MZܹr—ñ=Ëœ©_¡÷UT…/³Z·i”ø ©°wÖE Zœ%ÒÞï
+·\½¸+C͵YÃ=¨¼”Fè½ÍXÙ&adÒ˜f؆/¨ßx?$2ª^ŒùcÕ‘`‰å9V\e¤mä>±ÓÖ@¥ã³Ú6|Ú²¨áp,Å•¦‘±ÁbÎ8 Ÿ€Åš`NkÌϘ¹ÂF=­þª3Î}§çæWYëeÑ{êb¢‹ÿJvÃO‹´¤êhBÿA½ù«Úá~Ñd©ÃªÞØbÈ$ÂèUüU%`¤ÌôÛ½¿WÈ/¥'ƈ[÷J¶üÃe'ª¦ã|Z×Áßgñ‡Ýü?ßqEX¾¿­ƒ›UÛ†%Ôas)6È|Ó Bð¯ºÍ°ÒK4tŽ.OIU£Ò±oÚîN£æíjtMùÀ)µwýœ…¿13^ÞM´*¤¢G‡*÷%á„^É?¿Ûl±„ý3Óž÷| £«‚St*ѯ kLÕ®Ó÷Ã4!ï”~0jú‰-3¼oŠZÔžÞÙ²cCâÃlш‡}a¥\7ä«<”€ú…dV誥ßyNœÛ¼ØPgÇìt܂ݳßå5ÞŠ„`Ö¬·zç Í ðåù2§ü]Öè<`³¤?”‡è7KA°0“$OI±¤JDj*3Ò+|4‰umŠ¾’ ³ïÁú
+7ª¸ú…úÖ4.>ou|†‚øF¹ÿ]­SŒãdž^w¢×üÍzQFU÷1]÷
+ÁS­ž2 ¹•>v~ø×ëÏ‚ÃÏ¿qée±u ®hOµªÐ¾œ#wkpi_. @“z–L˜;¦wÚvJ×…BþÔÊ>$‹g"Ñd÷:.ì¦[öœ ÅÝ‚n0?_çøÖãÿd|hIWr2þ%Ûß7«TJþÔÿiÂÀ´B4I·ö{²Pâ)Ô¤/ûÒÌW‡-ç©…£ÅºöævXËgEa£l»eüƺ£è-œê›¢Š<ïï"²ß’<“Þ Ùk–êÖŠ~#K}LE>4ýÈBÄ~í°qÚzÅåמ,(Nè.tKÃjîLY›Ué3î›ãJ%h¶¥Iì@1@|ÅbäÆ}=V¥ žHÆÒTÝF‘½cºÀ÷æž_I ò/ì8 €ñ¡2VÖ6+ã²wÛ<‡Å6MdœœÂ3îÈÜ‹n8Saçî#Šg0]9«g2vã˜hö,Uì†ü^\£ÎSè éU‹<Ô“ÈUÿFÁÛ&4ñ3¾<g»|ΫNZÏDzƒ¸´<ÅM¢:Þá]L{Œk;kÈ5©‡l3+y-]ÝŒsÖŠ§æi
+רrÝf,˜‰¤b¤å©Ð<ÃÝÙ)^q® ‚wü3v!¢ÙÅ×bUn¢ÚÒ »Öÿ‡?HÿÿÿŸ˜ÀÜhêâæhoêb‹ô
+endobj
+504 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2909 0 R
+/FirstChar 33
+/LastChar 126
+/Widths 2910 0 R
+/BaseFont /YQDZPB+CMTT10
+/FontDescriptor 502 0 R
+>> endobj
+502 0 obj <<
+/Ascent 611
+/CapHeight 611
+/Descent -222
+/FontName /YQDZPB+CMTT10
+/ItalicAngle 0
+/StemV 69
+/XHeight 431
+/FontBBox [-4 -235 731 800]
+/Flags 4
+/CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright/asciitilde)
+/FontFile 503 0 R
+>> endobj
+2910 0 obj
+[525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 0 525 525 525 0 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 ]
+endobj
+2909 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand 39/.notdef 40/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 63/.notdef 64/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y 90/.notdef 91/bracketleft/backslash/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 124/.notdef 125/braceright/asciitilde 127/.notdef]
+>> endobj
+2911 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+xÚË=
+Â@à')Óä;Ðͺ‹Á-­Rˆ•Z
+*Ú z´%ÇH!Ž‹v©2<¾â=ÆM£)§<æ¾agÙ>ºÍB™²þ—ý‰rOºd›‘^†š´_ñíz?’Î×s6¤ ÞNwä †
+endobj
+2912 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+xÚ31Õ33W0P
+endobj
+2913 0 obj <<
+/Length 121
+/Filter /FlateDecode
+>>
+stream
+xÚ31Õ33W0P
+ä
+endobj
+2914 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+xÚ36Ö35W0P0SÐ5T0²P01TH1ä*ä22
+(˜Ad’s¹œ<¹ôÃŒ ¹ô=€Â\úž¾
+%E¥©\úNÎ
+@Q…h žX.O††´F ?~€Ñ†õÿ?
+endobj
+2915 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xÚ]Ï;
+Â@à )Óä™ èfe%‚0… •…X©¥ ¢x³x“õk·¢¨#q‰8 _ñÿ00õ¤š$SBIõ)I3‰+TŠÃ˜T­h¦ l¥(F¤ŠÇ(Ò>mÖÛ9ŠÖ ME‡Æ’â ¦Z¶Œg
+¬ožlðõņΠræ
+endobj
+2916 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+xÚµ1
+Â@EH˜f°sÝD– M„Á‚Vb¥–ŠvA=ZŽ’#¤LX'$¶Âò–ùgf¿Žã‡ly±ÙF|ŠèJr‡<éã…ÒœÌN|2+‘Éäk¾ßg2éfÁ¢f¼—žåC¹ÀË9ÀsΕð…‚º†ªà7Ðo@JyV & ¡þÁn zÿ›ß{û_Í…Oè^ Õt'Dõ B‰£] Ð2§-}
+endobj
+2917 0 obj <<
+/Length 109
+/Filter /FlateDecode
+>>
+stream
+xÚ31Ò33Q0
+endobj
+473 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F31
+/FontMatrix [0.01506 0 0 0.01506 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2918 0 R
+/Encoding 2919 0 R
+/CharProcs 2920 0 R
+>> endobj
+2918 0 obj
+[48.69 45.67 0 0 45.67 0 0 0 0 33.57 0 0 57.77 0 48.69 0 0 0 0 42.64 ]
+endobj
+2919 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101 102/.notdef 106/a106 107/.notdef 109/a109 110/.notdef 111/a111 112/.notdef 116/a116]
+>> endobj
+2920 0 obj <<
+/a97 2911 0 R
+/a98 2912 0 R
+/a101 2913 0 R
+/a106 2914 0 R
+/a109 2915 0 R
+/a111 2916 0 R
+/a116 2917 0 R
+>> endobj
+471 0 obj <<
+/Length1 1324
+/Length2 6800
+/Length3 532
+/Length 7622
+/Filter /FlateDecode
+>>
+stream
+xÚí”g<œÛ»°õ2‚ :1JtFïŒDoA}0ÌF‰.¢÷DÞ{o ÑE%‚ jôäÌÞûü÷ÎÙçãû~zï<_æº×½îu­µîçyĨ­Ç#gƒ°‚(!œÜxøyù%€
+ºb@~^>À£G
+Hˆ¥á¤hé‘
+Û¸;ÿgÈ‚tEIÙQ’@”¢  æ´Ø@šÔZ”Éÿ ©Wr‡Á4-á”GÑÿµ„Ca^ÿ=Ž€;»»A@ „ éôïTCÈ_j¨;üߣOÜ,aPk9';È÷Wêªõ„ØhCÝ¬í¶–0WÈŸqˆ“Í¿%PÇö§HQKEWW™ëÏÛüsHÛêä¦ïåüwÑ?rÿdþu6H¨'Є—•ˆzþóïù¿–zìd°:¡ÚAXh‰DZzP}"a ?êdñB<Q¾ ^'„j
+u$~@[ðÇeò
+‹A®8ÔCõ×¢"Â@Üß$Š*«ù7‰¡Lôÿ!Q ÈðoBõèCqÔ<«µ’õßÄχR³ù QÛ†ü†Õo(Ùý†(ûße ý Q›tø QNŽ¿!J
+ö¢¬àÿ ?ÊÊé7DY!~C”•óoˆÒ@þ†( ×ߥáö¢4ÜC”†ÇoˆÒxñ¢>7 Ïߥáõ'þïÖ——GxúðŠ
+·ñ“Ûߘý|/ä»ôŽsÎ Å›¢‰l‘¸×</ŸŸ÷žRá-–m9¾¯Ñ¯ƒ^ôq3ÝÏ7s‹‘õ”‚ü÷õš*|T35¤¡±H! ßÐNŽ4Ûy°,H¼L„,ÆÒ0 ŽŠY€§`$’X4ბŒ#O{€¢íõ}Yi–öTrÎ'-òÝ/7¦Œ†¦ã' =yâ­ø)‚òß`Ô÷/£+H:¿éòë\³Ÿøµ¯í˜V©ûaTi5omÈ?Ñ%ç~Ó–"se9IßRóI‡@¹ñ¡Ïx>»I™ô\
+˜ŸvrpÐC®“âà&v>ç†kb z
+Ô¼{p”€~îbŽ‘#š·Þ@Ö¬êqo–h:¶ƒXO¸‘ê·fäøf#£
+UÂÇ°xîˆdò·Ü|ç< #«iHu½ÞÍ}!1ž[;ÝhtË—[L· ži±c:úŒ¾ì±¼n¡éf¨·Z¸z€¨â0pŽ,"×òÈmx¸±=挾ŽVH׳¢Içkü貕‘×™4Ó6XÉ”£­eT=üX+Ò
+1ë•œ)ÜÝd­/UÛ¾\ý›!Y¡•÷½wENÆ÷_>>d’è‚×øzðÎjÐf¶èy´×SSú8ök
+"Ÿ'ÕðŸ‘JîÊy»‘: QσĄ„˜#:?¥ùä´îØ-LËœŒnÊ.“Éc*øÒLB¢¤Å:\ƒ‚5;GËR”I˜X?‹}»u¥|vØå6£ÏAÇ&*ù¶2P[•`O<
+Ç Ùë%£¹RüÀÂ%© .Ž½-“<”úÒp1¯úNI‚ßàù1u‰ !Pý€‡-!hÑï–Ñ›Ìw“9<Äd¡äÝ.CtyÏÜ0‚É%Ë$ö<Þâí„ÐS
+ŽèÇŠ÷A*AìžEõã ®DLÖBñc
+¿s`¯în|a¶æiÏ!©ãž2ZÃÞi
+¦£Zmª2Õ—¿ß‚Ù}ǘªŠ©—§å:4 7{©ßÝ8I&ç—â5“4Z×!ñ š½`†«?¤ÒÞÌÌ\ .ÏQzæiQóNŒ \N!Á†'îPLCWX;êÄã}u˜,ÆÓÛ•îbÃànê8 É÷;‹ÐvwÍÅÑ8'æ* :Gj&õfˆhl^fçúŠN„c/äЋkD¬š|v?1§}äkƒÝÐIÂlZ¨_0s¹M‚Ïi¨¤ £!ÔškºvL`!‘œ‚£ˆÃºLÉåÓ¹Ø×5ÏÕ&–¨ä *4}õÖøÚÑ^|e
+¶ +*©» gkàuFÌ×Ú¸Òàmfº¾xEFô"öÃTxî^»Ê'Ž`®»(“XêAØ_ˆÞ&po_ü¯ÊÈ׬X‡ý‘Î>4o‹*§"ˆ½|Tu‡xËÒµctIo­0/ÈUKïªæ§Ö˜%÷¿ýàTÃk–蹬ª-·¾'é€+»ÏÉE[ø… 0Ίl%[=zvïÙú<·ËŽZ,\vIIà5Ýtiy[ÃÝ/W˜»ÀÖÐýíDaopÎcKs:¹,ñÞ@_‚Œïy1Á‘¬Ì³ðN<%œ‡…±ß.[ðJ¨¾åx~±®`„ý*YÇq®®ª¢½Ê#‘ ÁjÆ´W—ÀPHÁ§Ma2ÇOmãÛ°U£‰~KS}Ê‘m{•F©²D‡>ä%Þ4ùž¹AU3º;IŸèÞà7¶ô¨É£¤p69ÄÇèbó¶¤ïeÛÝ&9uÞ‘ÝdØ¢æóuÇ\ÁN*c©‰x ó¤qk©Ž+} 9€Äóóiu?kXÏâ,áÆË@°ø =R®³\u÷’ü‹k•ª÷ÞZÈëMâ{¾Vl}6פˆçU`ûÉ?£˜CdYœêE§!)£Lí¸˜EbN‡ia÷]YÓÊ
+êùËñi
+Î>F3 HM®¾vÜe7v ÇÁWêy$ÆÑh}p{²K*9¦—)9]ͯQ†ýpÙ«f—à£c£esŽ]-#[GÚV°¿ÐBÈð¹âyú ÖÝ|SÉ1¥€¢Õ¹›Ù>Åtç8,:ý¶õû’;ÇL’k·×Õ-àí²DRZuLÆÜ‹o›7QT" ÜMÚ ed¯=dÅ1+·Ëý1å²L£<¦ÿó) ïRô 4=ÈýøÜOçà^³D1§½3¼yøb Ž=G2B‡8]j[Ò>k¡vƒ«%tÒ¾¨ Å²Ê¼<àž,o_¦yª‹[¾ãͨۙËhÒf2®°üŒÃA—+Èœ:pëÝV‹¿]Å¢¥·ý ÃÁ©ÎÔ#T\ÿˆžò'4#þ M,¡ofþ)Fe¡s&©%{'Õ¥…’ÛÞ‡[2¥¦1_';ù•gí3£·ÇëýFlð~ ÿ­j#É[ƒ›OÙ5¼,QV¸"Åš’dVB=T>Á(?7­z®¹Dßk΃å–Ò
+´™#Ì05ê4ÓÅ86û)
+~öPÈ~Îvd¹Sì8ü$b¾Udþ•ã~͆†&(Ù¢v%§v&«8½c,P,„Ö´Ôጵөv›®ùëI)ÇD3ë<þ¯î%âÙiŠõj¯ŽÖiQ|º(;aÜëÀ¦ Jšþò•¼#)ØÔÕ,Þ-5ÃÝr¨ÜÊ®ú£z“iZ“Üì#¿éË÷MÌÞÞiA—opE],Xû_P㑳vøÌ|{ÌJĬB‹ ‰yÔOt†k-©  `€Ð¢ïTœåÂÆëV—¤j û††Ô‹Þ¬U~¿J&4ÄÖ¾|ò5f’¾Ü"ÿ-s
+ñsŸYVRƒ°ÀuîÙ%©H–µ~U¬MtÍe®IÍG6ÌiMf,”æW¯Gƒ¸íœÕH¡.¯–;ür$Ù«‹”UW2míë¹Ëp”µOÅF9ùÞ4¼F“Z€¥¾Åi%ÜGvß 9{’v¶ÿÅ6ý…&áä‰í7’d߬Œr_(ï½aÓRòžÔWêí_í…ú³r›C7lŸ‘c~üa–µ›
+h8?R/©ÉP©%uؙԿa /G?Û¢Šgù†Ø‚”WÆéÝSž„›$ªCcVáË&x
+V–ì9a§N«ga?ƒKÛ(ï±? ›Za-‰¤ó¿òåêtkM^®ßœo•¿$É”9È_j¤´ñ@Bߟ5*…™2ÕäÆf° zGöÎì¼qÛµ{4À,Imt£D÷ÃwcÖú+朡;Y
+JIO¶i´ôT¹Ù”€a½•BÖð7kmcL²ÑÝãÒ¥Á§v IÜÁÉ'< ‰
+»‚!¶–¤Ö•1âú¤(>QµÖ¾^žË¡¯Õ­p謃RÒöD-=wXœ˜0¬¸ºhY¢3dšæ{ÿ•XEˆÅ‹A%áµM{LsòkUYþhFÝÐD\Ã
+øMu‡Š4gëR¯-è/‚yƒß™'HlŒ³t¤ïˆ>ÆXãPž—ÄJ¸‚ìÃœ)ú†°vFÐDÊmÞzcË6H™çH™wê8ö(š|Œ¡c–ùpiÐ_Vgõ½;¼Ñ[q§þYŽ¿NeÑtÎæ¡ñ)ußjlˆÏõbSìüHËðÍÆq@>‹…»„fÐÁžs€oSôg…‰--ÓøK2´Â,áŠïƒÇÉ[¶'ľðÊm f«?Ôà ^2k<ñ³FŽõ¦Ó&ô'']1eU½:Èꦶ°–Cˆ†É–_Od¥ã0=×Ôè´”-™Vs¤ðʽ:½î»_ýdgL1g¨tu^ëƒÂ‘MZVB¢ª®D:$ËQÇçÝk‰.R
+7ÃIÆàÛl)ƉaÇùàJÖ#šXÌ™`_ä5§î»›‘>¨¢óqÏV‰¡Ë?LFˆå#$JLš`ì‡ÿÄÿx¡í.ˆáåÜ7L!¹´Zþ>{|ä]tÝJs¸Ê‘a䦄DOˆì‰õ£Ê­ÄhÊÈнŸ8€»AÔ ÅïWöåâq='‹:gs°¨híïòÓýŸïòüOò·Kì9™­8Ã]`WIYKŸèD¤94¬Åé׆–³,ÃùÍŽµ€úY{ôfLÜ£g:wgЫ±üO„äDñ
+ûg[P’–hÜš€,fÒ˜Ðê áPC¡ÃC¡cÓ—˜Ô‡pGL™¡Kð"+ÃvlWµìo‘kæ;_ßF?AdÌžáì¦ò‰ÈÑ¿ÊšW©¸‘?¶œÞÑ¡dÿF›Ÿ¸õRI@ ­-ª©Š2­já^TWL›¦ §:.¹›Æ±ÌÌS=64CÚ$‘aZ"IŒÿ9öÓûöŒø›Ÿ±Kƒ8ŒF;XÖ8­ÜX˜|uçž®7‰Í†³F<Æ»O¸ŒÅ{aÂaxJ˜X.‘tM+ÖÄK^¾•isáp“¤6Oæë×ó^ö˜­,·oç÷ž
+endobj
+472 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2921 0 R
+/FirstChar 12
+/LastChar 121
+/Widths 2922 0 R
+/BaseFont /DOHRRG+CMR8
+/FontDescriptor 470 0 R
+>> endobj
+470 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /DOHRRG+CMR8
+/ItalicAngle 0
+/StemV 76
+/XHeight 431
+/FontBBox [-36 -250 1070 750]
+/Flags 4
+/CharSet (/fi/parenleft/parenright/comma/period/zero/two/eight/semicolon/A/N/T/W/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y)
+/FontFile 471 0 R
+>> endobj
+2922 0 obj
+[590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 413 413 0 0 295 0 295 0 531 0 531 0 0 0 0 0 531 0 0 295 0 0 0 0 0 796 0 0 0 0 0 0 0 0 0 0 0 0 796 0 0 0 0 0 767 0 0 1091 0 0 0 0 0 0 0 0 0 531 590 472 590 472 325 531 590 295 325 561 295 885 590 531 590 0 414 419 413 590 561 767 561 561 ]
+endobj
+2921 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 46/period 47/.notdef 48/zero 49/.notdef 50/two 51/.notdef 56/eight 57/.notdef 59/semicolon 60/.notdef 65/A 66/.notdef 78/N 79/.notdef 84/T 85/.notdef 87/W 88/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef]
+>> endobj
+468 0 obj <<
+/Length1 773
+/Length2 733
+/Length3 532
+/Length 1294
+/Filter /FlateDecode
+>>
+stream
+xÚíRkPSGµ:Ô­ h¡ÑŽ F¥y\B€€R“ˆyˆ O©Ë½¸Ü 77ÈðP”A4*ÒŠˆZÁ_¥U$:VE¨E‹X:•Ê¨€Z‹¯jUAqzuñgû«ÓÝ?ûí9{öìù–Ï‹Ô
+8•gS$#DDH P…kãý
+¤ %A8Ê$C«¡z ¥02Pèõ@ã8ah„tÄE81 &$Gì0¤&uðØÆMi¯¡ HYS`
+kr*`-â©·
+›0åˆõ™ü‚á<Ñõ«åê²ÆO1}{qa}hÉÈ¢ ÛC£u|eºçÆ‚Ë¢qç÷w
+R¾ÙrCi ª¸º¤¸<}¤Ï ©È+xÀë4¥õv̰ΩÞçºwù/fOaË¢Í÷6©Ÿy3Q“ÓýYõ;~༫-yú¾ï¶ëCí6.Ï-ê—Æ'¶øCÝ  P³¬Òø7Õ5|òCîñšX^)wt„Û^)š4ªÖœÏŸ«:­­MÄáÎcö_û)z9¹c&[Ÿç'66¶ž{V›¿¦)gMÌÎk— ryœ¥âƒÜ>ûQ(°çZ2ë¸Q‘zƒôÞ¹¡+¹5ö_Þ’[œž8–ò[u¶ÄzÑ™©D2_{2W§,ð½’0vzïLQè.òÈ™e'n*9ÕØzÈæ?Ó%Ÿœ¾§¬®äZ%ÿppþøO`zˆÒ e@éTÎ_?ñÅÌendstream
+endobj
+469 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2923 0 R
+/FirstChar 3
+/LastChar 3
+/Widths 2924 0 R
+/BaseFont /LSYBCR+CMSY6
+/FontDescriptor 467 0 R
+>> endobj
+467 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /LSYBCR+CMSY6
+/ItalicAngle -14
+/StemV 93
+/XHeight 431
+/FontBBox [-4 -948 1329 786]
+/Flags 4
+/CharSet (/asteriskmath)
+/FontFile 468 0 R
+>> endobj
+2924 0 obj
+[639 ]
+endobj
+2923 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 3/asteriskmath 4/.notdef]
+>> endobj
+2925 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Ì;
+Â@à‘ir„ èfMVË@Œà‚Vb¥–Š‚•æh{”Á2Epœ X¨S|0ÿ<¬í%CŠi@]C6&khcpi"¡´ýçd½ÃÜ¡^Pš žHŒÚMéx8mQç³Ô- Å+tAÀ5
+endobj
+2926 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+xڕϱ
+Â0à‡Â->‚÷&´º µ‚ÄI][­ÒGpìPræ"Ö¹„|Ã…ÿ?’ši6'MY¸vF©¦³ÁZMrÒïÃ銹Cµ'«Q­Ã•ÛÐãþ¼ Ê·K2¨
+:ÒGtUÌ
+‹!”¿lâc_ßwÔ•üWwøÜ=endstream
+endobj
+2927 0 obj <<
+/Length 120
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0b S…C®B.C ß
+Ñ@-±\ž.
+õÿ€DüoÀ þ0€
+ä
+endobj
+2928 0 obj <<
+/Length 121
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0SÐ5T0±P05PH1ä*ä21
+(˜Bd’s¹œ<¹ôÃL ¹ô=€Â\úž¾
+%E¥©\úNÎ
+@¾‹B4PO,—§‹Bý `
+endobj
+2929 0 obj <<
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+xÚ36Ó³4T0P0UÐ5T06R05TH1ä*ä22
+… 2ɹ\Nž\úá
+Ff\ú@a.}O_…’¢ÒT.}§
+ ì ü;®
+endobj
+2930 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xÚmбjÃ0
+IfX<œ>6°¨Á¼b‘ƒYqL½Æýîû Ìâù-˜%¾YÌÞ¡^b£ä4ä¡ N¢¦Yˆz& LJóÈT‰ié$è$µù4 j¹ò¨:D)30½J˜„é™A¥LÌt̨*&šT«š”“üå·öô$´‘§úoHƒ{Ïì‰yÄ+ѬnÐî¼%úCs]Ý¿\– O5¼À/X÷±
+endstream
+endobj
+2931 0 obj <<
+/Length 212
+/Filter /FlateDecode
+>>
+stream
+xÚ}СNÄ@àm*šü¦Ðÿ`»ô
+²Éq$T€B O×:^«Ž×X‡­£biéÌšS˜/™7u}Z]h©çzâ´.µvúìä ›j-×x—§½l[±÷º©Ä^¯µØöFß^ß_Äno/Õ‰ÝéƒÓòQÚ~cÒ!¬f~¦K´?r žŽt¢þÎ0,´ëaC‹枎0›``2C³ÐŽ6=,êa>Âl‚i€É M´£Í'ý‚Å7Ì`¶À”&ÔD;ÚYÐÜÇþ7>&W­ÜÉðm”=endstream
+endobj
+2932 0 obj <<
+/Length 212
+/Filter /FlateDecode
+>>
+stream
+xÚÍ1nÂ@E?r4à¹
+´˜£å(>‚K“,§òXi÷I÷köÿæÙ’SÎxæ9d<ï<i±R1åðÒßüh]’ûäÅŠÜFerå;ŸO—=¹õö•=¹‚¿<§ßTŒ‰È/€D¤ST"ÓL 5¦rƒ4ˆ[ØŽk j‘¨iÒ!¹©©Cn¸#××WC>›¥ægÂè?+Cõ¬9do€i‡X «ZmIW3tƒ¾ÎEîꉽ•ôA…xUendstream
+endobj
+2933 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0SÐ5T05
+sé{ú*”•¦ré;8+
+ц
+±\ž.
+õÿÿÿo`
+endobj
+2934 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0bS0J1ä*ä21òÁ\Dr.—“'—~¸‚‰1—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEáÿÿÿÿ˜ä~0)&íÁâö€ D0Ô!‘¨D"› ±b#Èö`—ü
+æBkÿ7€T@Hy°j~ù
+endobj
+2935 0 obj <<
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+xÚ31׳´T0
+endobj
+464 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F38
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2936 0 R
+/Encoding 2937 0 R
+/CharProcs 2938 0 R
+>> endobj
+2936 0 obj
+[55.37 51.68 0 0 51.68 51.68 0 0 0 36.91 0 0 66.44 55.37 55.37 51.68 0 0 51.68 47.99 ]
+endobj
+2937 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101/a102 103/.notdef 106/a106 107/.notdef 109/a109/a110/a111/a112 113/.notdef 115/a115/a116]
+>> endobj
+2938 0 obj <<
+/a97 2925 0 R
+/a98 2926 0 R
+/a101 2927 0 R
+/a102 2928 0 R
+/a106 2929 0 R
+/a109 2930 0 R
+/a110 2931 0 R
+/a111 2932 0 R
+/a112 2933 0 R
+/a115 2934 0 R
+/a116 2935 0 R
+>> endobj
+461 0 obj <<
+/Length1 1666
+/Length2 11118
+/Length3 532
+/Length 12088
+/Filter /FlateDecode
+>>
+stream
+xÚíºUT\ݶp ÁÝ 
+B€@pw‡
+tÛÚH
+0;ŒLÍÀ6¨Ìÿ8ÉØ€lÜÿ›8Ùý÷³)Ä* û—æ{
+BeV°…V3…ºü¿¡õ?“K9YY)
+l,jcfe
+`ùwì v55Q;›@@+ÓÅMmLþ§´qÿ`ÖÔT—–“fø¯=ý× lã¨æf÷Ÿ´ÿÌþ³þahw `W€. ´½¬Ð‰Ðßÿ¾ÒÿÅ$mŒmMÀ6f
+€—ƒËëÿž©n¶w2•‘€ž&nèÓøOÔØ =´Žÿz{Ckü7ƒÀЗš©©«©1êâ[cþ
+×B¥”‚”®žç­ ]IŸÉÕÈ‘•ÛVs}%.¤p:d œÂrˆlàmÛI*×á`¼ C¤ŸÌú¦¡Á‹JðÅSöë·È‚Ãä)u¸Ä7<©ø"mù)0ƒ|aÿøQa\?¦ÄSç-<6Q»ª¦î-ëî­½G…½N¿>—[SÀˆˆÔθ
+áü&€„\;=΂XMuu‡vÎBš,ÃY§/ѾÌæåŽÐ\¼ðG2#w ŸWü™ˆ"³Áaw왢ÓIXK½Ü7åeÄY •¥-’O4÷ŠââÿažŠ¨¹4×¢Mß m*ç;žÎŸëb‹;Á2s«ý‚. ÃgɳG2ÚCéÎÿÅ"Áåf°å!k8Ä`äíÍ,{&°€~l‰’†y)(0u?•kíc¨§°&[Ã^ЊaoÊ~Ò[‚y¢X>=0šÏÛdhœ´rÊIq rXξ¶hâ3zÜå6Éù"á3·&œbåQÅ €5÷ öý äž>¶³f3Gô&Äv÷ùS§URFЙE-‘œ%ÈXÓ‹èí™®| º |‹ËÔw„"²qFiƒÌ»“_¢³¦zRÊ;ƒƒ.ª4 ¿ðàÐ\ÒxÌÇËH6LÐþ};SPE¹#¤„ß•.~²*®¥r߬Ûy7yÔN•‚\Š˜«µïÅËè‡ãr¸ ÈŒ[ÑÚðz0ì¯L_a-Ì^ò[bVé·ÇÅ(a3¦Àe/í `mÕYšè{^¤íÈå¸zx^
+'u.Ø‚?n8„ÐUvr’¡9…ªÞò¼U"í=øPõyWXùÕH†%ÏXºÜ(Xó;ó*?wŠ™X9|»P4|U~§tŠË„{!lÝXÀJµ nýž¨N‹}ïª5ž(Nr©î>œýpcvŒ §ë/,ÌÀ_q¢<„8Fæôö¤Oõ 6Ö¡WS¬/ÙzÜØŸŽzÒ[±2£ædœELŽ1eaޒᦠ<rÁvÿ–m¯ÎàÇÜ}zá~s™8[Ipé¤mÖÆ-Oj§ì§'´ú™ó®N%%P&d^o—ÿk[&ö(ÍF'8Oœ2=rXYTþfËk¨ˆ.2ü}ÂW›2Öy]OÒªÚ b+1ÜNõõ'øÞ•Hå‘CEù…vrU7éI.Ssœ"#ï2~M¯êó/ØW>4­]|›açrŒMzòuÑ“\cX’Z Ç_«›+×ûÀSŠ½-ž”eï2âO>˜¶ióóêP92'7W_ŧE3p§oì“·é¿”ŠÌôêhNß.¼t7õZo¢Áûæo¦_>“ž€Þ¬¾MŠžÝ3ÛÙ0ý"èn¹„Ìa—-²\·Ö6Ëtå­ùž®€¶pa‹ˆä{ôÛc
+4Il,}&äó+Àôx7ÞÅÒ#ÛÅÕ £³Úcvr
+˜¢É_yàÅ{„ÕÉ!3ô
+0 ?vÁÒ<z¬^c¾§@¯0Ú&ò;þè!upžíÝ–0sÎáN+> Ñi¢%ûbà9YT%¢AÆ UäŠk¨²q)óíýé)QÑQcxÚÛÒ“Å»rƒœ;•é¿™ðž¿ÄvKi/ÆàXù…¨)AJ$½,3ÈI‚žàÀ-º7Nó ¦ñ/HzŒ}@ä×®·©ØÎ)À ß8÷‰ V"}¹Lœ/Ñ·®ëöLŠ
+I¢UHð ¹$&¿Åtst֣ΰí‡;3¯:šfŒ¯ú%(=XŠ„wLö.›9”1ë?LLGíêb»´‡æ™Â­øS´Å\RÁDRwTë»ÞÂd¯ks0SEY—AiÞ.– Ÿ¶ ­îàjÓŒ¡Ùw<}mÒÉÝ~xÆÂg@žEÛ\ýñVê×îPíïˆSÆ_ýË8Šdߧ·ÚÉRŽ¢)¯5+ZfÈÔkR“LÚ¶g)N"Ãœå{ßí'keŽwLã’žøC˜“u-Ù«(®Å@A­èCÏ ‹¤ÞDŸ¬’Iû„5Œ[øâ/~o:xÒö´Øìèñ^PSw¨q:ëf¯ap>t6<=Ð5ïŒæÇðß—,“z³%’ÕyÊqj†» b=
+‡c*g°pxˆñ°&Bð½ê½::Dòºzúe+¬
+R•XöŒjú7fqÒ
+y¿Ü#Øõ9+›„g Çíêo•d”Oµk3RR |gÖ!u—c
+Y8‚' ÒTð·
+ÌR©mש-·•WÊ#\ùù+Ø병œÈt^gU5v×Ý-{=IÓ‘*übü>[—Í¿4^AJé=îÕD‡ÒqÖ?rwÁF£Æ¨ÕÔ<•’#Ž?µ ‚ŒO¦ø(‹·)YûÓÑwÂÛSªßk\ÄÃéoiÔÛ
+:ë$ŸÌŽZ’®Ú¯§óLTDDŽÍI#h£bn >>ɇÚÂ0ú.5¸è“dQK0£±äÔº}¾*™ê‰.\ L½(Q
+-/N»¿³zÿÄÑ¾É Ì •¬)~- /"v,brS#Ágð5"ŸRχÑú‹L2›/Úï9 ®Œ©ÓÚ$õõÇ'{y«ÖÇïH»c׉zÈBK%ðdS>üÀÐyõ ßgîmÁŸ¥á<4ý]j·ÄKuŠéˆÓ´³…àÏj¢ËDÓ¦Ããõõm!v#ß݀‰ÑieZšSbØ/Ö^¥ˆôòÔànµùé
+«h$i穧ŠT·o kßÁPN¯È8zðÇvÆYÜ¡+ë/H~K¾ÿa,'V¢^?7ǵ:♾4}ÕÔ„¤IÆšÑQÆYtgâM=á5DPb¥ƒà|º‹ë›§c5ç9/Ûê…þý.åaÌf^×gÜ÷IŸwÂîo7D(ç>IÔÞŃ½©s/=°Žja¢PŽ
+òtHŠwl9|dø#’vÈ@`œ
+—§xîâæ êfž9ºÇW¥ÑDyÍxÓ¶Jì›Y}0¿ˆ÷‘ß]ëŠ1uŽrºÄ›Å÷Äìt°“Ï%9ÀíÉB¯·5û˜µ@þ|
+ƒŠ`Ô˜…‡É:º£\ŠG/P#lÜÔTÒÞvˆy U<°¬£ä‹¨ªQ* ¨VËm¤¸?A;ú×']ÛO‚~3TÔ3ÑY‚5F\kw’ÈS¯Ø•Fó'­E[·CŒ¹ëì$ÎY:çá" Á駟*ƒ<Õ¾ðV3XšeÉäF©õ9jçK<R‹`Þ·<¥’M÷zÚ„ž’Ë ßkYî9õÇtiE6ç¿¡ÛÍûR¨O;˜¹kð†ÌÉ;c)"5[‹ŸJnx‚j[Üg2K”}ÁUÞ€X5׸
+ÅSu>Ò§ZOŸWJ¨ÍHsÿ«OËñG‹ÄÆ?){…¬Š?3Ýß\ØÅmæ,߃â ìXr¡‰íìè£Êk`C1Å™W|'³ràµÚR¸ŠELÊÝÛBrÆyºWÈeixÅþŸBµ¾÷…zŽ»Õô—á=ñ,¡øíVi(£ÁP˜ã.–Ž<%®¦›'çi5WÀY]ò…ôr ݘ Z~ó[ç5¾öù&2Ü=ÈõfÈ.1T
+¥±Ë@LŠ•Ã
+È$cn}ÿÂfé™ ÀORîT5•µ‰V¬Yë`o£ÊùWÝ©‚bc¿ó©é¿³ý@ËÃ93Ö½ZeÎÞñHúEh­/”9pQÀcš¢¡ì§“ˆ½Z{”c
+¤ñ¥¹£Ÿî@aíöÓØ®N«˜-µ‡¸”ŽCT×lß2ÀsÏÍ… …R1ENÔ„D&Ù4ÉÈ3,ÏÚˆ§¨'÷¶VœHb»/ŸLdœ2âßß!ÁV6ñÔˆí7©é€u¼ÊZ‡¿>×~uñU¾ƒ,âsÆïçŸø qbú^¦BI>³þÆ» BÊ#á/3%r„•ÜN<ábì4e)*Ï Àoi¶Úà.â¹rfJ>~tqm‚ œ*òDÁ×w–au•…¢0×嬤hHtY®>1(ÓT¬`ÊØDµsá©vúž­1+pgêçiu¤‡g©i+˜9î~òÚ J}¥q¯“bvö…1qèú2Cš
+SÔØG®BB\«½TŒ(·
+WÞ,‰¥¥¿ŽGab°8C•  ~=¸òƒ™(‚Àþ¶côš^U§rqp:=PgBI‡JüŒ×ìGàQMNlùá¤â·r¬"ÔP¥—”‡Î;üÊ£4¤'tw,™ã€¶Ú\i™¼õ“„ħ¥¸ú5æœݸRÒA¼Ç˜¶,o¤Òð؎σ±ôxî;W8-ÉÏ‹ÂŒ¯*K½ZðË(µ_ñ¼³k©«,¦…¾_ŒÈí|dø•ôÚG&ðè·Ÿº>zGt>þ½"/‹Ñ@ÙÚ×IÇî.+ƒµÉi|»yWæÅÐíí^õµ'ÒŸƒ<(Zä´Ð£ÎTúrJìã…¸–=¬R?øÆcÊ~ØØκö¢ÃéŒæúœz>ȇfÜ*úsÛáè“K„ ó½ã3r¿P¨*꥟¦ò ]džŠÙís‚êânLbI0–\ÈXî ç ÑŸàÍ…^“»®m}!_?bùïOÕÌØÇ;_(BáDýÇR¿…UÝá Nn¶y¤Ù ý2t[µ«IÁïð—¬â²¶½[NDœßüéµ”¿ê)<†jIšÈÁžšXµ‚ãZÅÝYóQ$<¸‡•ŸøÚµSfÆW¨e{ø”†ˆä1#.ò³gò|ÌÖFøÀÛR Õ••Cýp‚ÈÌ 4”í1Äñdð)â±¥#Šò!ù?<f¨‘çqØgÂïôçåÞ'Ú`¾ò>à!DOX”ó²ûò9€ªeUÞŸ=´vÆÝiy[“gä#:Æ´lJ•Û«FÂFÉå^—°£Sö™YZì„Yk¢2Ùã5Ž34ãvÚm—AT9üårgí¯y”6§‘±€˜[’+©®mlˆ.Ý*>‘ˆz[LÞ¢‹G|«È(g½½ë˜beæh˜Ê•ú'Ê‚íHŠK¯Ò€ô@å…®˜#caä·—²ô¤?Æå®ÊBýƒëó=,›C²2Â][2Ü(z4ó嘼N¼ûÜ­¹0Îö­D±Ïx½8î|Ý(‰V{ ôŸžu– ˜TÏ)7êÑ&S/ÄñºÌ ·¿šî£j+O¹.ÈÈGþ@Ñéó΀Šg¡é-^k÷µáSáu­hõráKï2¶¥«~MǬŒôí£Ö¦Ÿçz»L"yP@¶.î † bÐ{»ß™>ÍA,óª€vKS'—´ôò®·I`Ãw|yìJÁ;¦¨zârx²“u–‰H[C¬— ¦˜•®Ÿ³PœÑõOnîÇ’hB—’JšSì/9máØ+F‰8l¥ q¯ºöÌn‘¨d@Ã5ŸM(¼î>© ‚>l¹ ä‘¢4‘/žÆÍò?:Óßc­•R<ÆäÍDÛ¬£IéZ|_´>:‘D+ÀÁ´gÏìõr°$†½5BÏ‹°¥{MfÍlªG¥ï6•ŠØ˜ÜÂSÖè!9©%Q2lŽÐJ7àkˆ1øù-Eq‘8·ü*5N‘ÖßðÞLæ‹o¸³ï†fõ¢ˆ6A·.>ß­Ñr*éV[Ä
+i¼”’—õOLéÃàe\ ˆJE_<HýWïtRÊÊ;|9›¿ÌH«ÁZ€~¿§.Îâý:Bû;Ï«Òwß'&QgBÉRžÀ¼—°]*Û?¨WàMnѵÕF à(õ§¢¦ñ1œB«—˜G·iÛÂBë7É<PÔ\yšø¿êi·û2eX¾ûtÀ1Ï“¾üj–[Ì1qlÏ—NLO:Äkç&Ýþ 8×ï1èà­{Ù8*½O1ès6]¦ô0YØð}žÙft¹Qb¥t`4Ø-sèøD—ùýós½"Í•þ@Ÿg\ëÒw'²SÌÉPß5ë~iÞmœÕ8}õ²eH0w·a¹¹À/~×…geÎ|oÑ_‘§ÆòÞ¢Ö³Õ*°­AƒM)&‰Y©)Q Ðáœ=-\Vƒí†è|Úß
+Ò² ^ز÷¡·ü³íV1<ˆŸ}Mž2¥>#z#7ß8¸ZeP-2ÌäSÏ´ 8åþìå› Þæ-ÜÚ ЗOØžñ÷«ÀuŽþ~/"ò¶ßÄÝ|42ù3kîi[!:O˜VÕ1ä ’—¿ž-Æ9Q ¯á±<{´9$XXE‡Ó:§ÍpÀ'u¶OUt! >M3kKŒ=üõ«;пEôl>ÉRBPÄ xÇÃë«tHˆ0YPuÙ®Ëg÷„¾…Çr‘ÒŸ×à—ÇC´©òý6ÝD9/J sS¬0~€ÊØR¹’¯Kp÷H—p¦-GSú¥œ1‚óõ|áz¾äe„ý‘cw?·€=Ê€|=Ð}Þ–~E:[M6Úêñ9Þš}ƒ¬".®ÔeKÒŠÂo³U§5‚¹\ òÉ£]âœr†ŸLÎÍòÄçÃÍžÉ!»‚áÉ„~þø‹CÁù™è ðtîûâ?G¥Ì"k}¾±#Y©ÏÐÐÿ€§¼Á #³ŠGÁ•¯Å›m¯:¦O¾m¨>´0a ko{GŸ„¶B1äúܱDQŒ‘J¿¦ù Æò…OíÈÚkè.›Ÿ|!º‚ô´}iúý—ha^ËYçGÐÓ|µÖèÝÁ*è™(Q|WöM5e\.á*VÛ@9ž¯ó d+Ñ5Ý­ FM˱f_'¦¬wVˆÁ,.r¼,ùA»´U3i ™±4Ò¡»s/Dƒ³@lÖùE¾üñÂà&=맕ŸJXYA6Iö¤Þñ$Ð'64ç^‡à!~uÈ<᎖ÑF¤[DгnJW15ë;·ýõÇò.Y0¦þ–¡¾“ìäm‚©¹ÎXìý!H<΋¡ôÆ®b¶0úŒ> [Ú+ÝÐÐÜ!vÎù‘só³êÍëU!î@Z=#› 7/m}Α† ã¦ÃÃ¥¸…'_$'uoq짤–âe­Uµö Ëâ
+6º`7IϺ44_tÕ«O®VZTÀßí]hgÕ
+Ý G‘„{ü’zq›skÂT6tÔBòKÇ¢¯j¯L?º#¯Rµ^¾wH#ÜŸöudcŽ(ð­é=¨áÖŒcCa¹šˆ³VÔzþºsC$ûf†ôíÜGO•06dÆl£•Öê›@gǧˆ•=»¸|Ð
+žüÇ ’WG?à0šRÑiøCÃñl
+ÃÜœÑd+£ê匵Íb6R9¿§|-Ù$“øsT7Ã?D}ó«çS}c™ÙÁ±FBj¶3Yh{Ȉ·sÿÀI
+ý&dRCó…í£¯Ý’îÃ,çæ¯$‹¶Üyz„`§LÒÓª4ærù' ô+
+½&{§{@Úu¡»òM˜Ÿi¹Šµ×•’¯·ÖV³ìÆö´ñR±CG^T)aMkJPýMº3—05Î1Ù4Õ‰x$uˀ¹ª4Vt\oQŽÜlßPmÂÎ"Ëšëx¦ùOãœsð£•(½­Ñ „-!Ýt_Õ!J
+¨“§Kàó T+&ä¶^ÑÏ_+H²•¢ÙT-7ºoç†cŸ÷•ûù"F·@je8k¤'Ÿ;ôuO´©–DXs9ì¾@qÆ—¶@˜‘~ByñÝâG_ºla² Íµ¼-ö}â
+?*]~v‹ ‹õ{«Õ["ŠÞ0sö„ìÁÇZX.שV‡Zê÷¦ÚMäÊÇÆtµ©ºiT¤Ó{«i™|ÞB×-çˆÆ3.ÑPœƒ8~~Qˆ+xe?ò]17­ÿb”nËç5±ÍôÅmoòÕ>¿kÙGÔ]TB?b¾ ?A™ò‹?Anq²±¤S§wÄ°…Ï“AM
+•dG´Xÿ¹‰½¶G#œZœÁÓK±úËèÔÆnªh:o>ÞbŸi{ú¦…ÅÌ„-±bÿ¡ºÓ·C8½vbVN[¹¢->¿Ø»uvš EU˜Úßé0çß*Øjå)‡0ŽbýB&>ãú¤\ùß/…yiñpS¦¦ç Àì?;ç®Ñ)Gz0ã¼o›Œ­'#÷Þ³i¿AB7^9âFB4Ó5jë‹/ œOÉË5
+ÚU,Øß tò‰3Ú¨³òßGêŸy“¬«¬‡t$¦èã´@š¯c+ÛPC1'’bŸã:ß^žëhËÚ/[Þ®­lØ›Úí8^VçÌ[Þƒ• ¼’4áãw
+¡RÓ ú”¹™«2fZC…~$
+2\†,¨¨dÄ‘6Ž+EšŽd5ÌÜ™^?~ûV¶ê]ee¯/Úú3ÃØùØS ¸zweõ:œ*zÎ…NgÙÀUbæÝÉ)"m*2ÙQì¸-ñ˜f3ß¼t}˜( {
+­ºœE$iñÛ°XVµ´whNwã¼uÜYÆ/¤ÞO¸[Chw$Ñ…%å.R§ŽXsïªÉS ÉàÌÕ´i›I,“á._˜·ÎÑ$—Õäè­s‚ËD÷¥Í‚?νûÅÆïop)ô¸X\Öë~(¦Ø‚Eëß>,
+KhØ°8 ‚ÿ¦°9ç­;™Ô¥¯Þ~w|~õZŒµâ0=‹€îºÆJˆé—•,5Y×–ºoõìCÃq²Ê9oP¿‹wTWòNÍÞ³KuÅŽ­ïc S}u³Rf¡×tYôs¨\eúd§¾Xi×î{ø‡½„­ØTe«Qãœü·ö$Vrë-«÷ˆ½õ˜Íf¿m)QÅ*øÁ\¢­²,½ð¿«’ïƒúQ`{¥È6ÿù×ÜÿG?¨ÿ‚ÿO$0¶2Bm­KÔÿV¸“endstream
+endobj
+462 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2939 0 R
+/FirstChar 12
+/LastChar 123
+/Widths 2940 0 R
+/BaseFont /WWUGKG+CMBX10
+/FontDescriptor 460 0 R
+>> endobj
+460 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /WWUGKG+CMBX10
+/ItalicAngle 0
+/StemV 114
+/XHeight 444
+/FontBBox [-301 -250 1164 946]
+/Flags 4
+/CharSet (/fi/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/G/I/L/M/N/O/P/R/S/T/U/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/endash)
+/FontFile 461 0 R
+>> endobj
+2940 0 obj
+[639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 447 447 0 0 0 383 319 0 575 575 575 575 575 575 575 575 575 575 319 0 0 0 0 0 0 869 818 831 882 756 0 904 0 436 0 0 692 1092 900 864 786 0 862 639 800 885 0 0 869 0 0 0 0 0 0 0 0 559 639 511 639 527 351 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 607 607 0 575 ]
+endobj
+2939 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E 70/.notdef 71/G 72/.notdef 73/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 88/X 89/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef 123/endash 124/.notdef]
+>> endobj
+456 0 obj <<
+/Length1 1680
+/Length2 10035
+/Length3 532
+/Length 10989
+/Filter /FlateDecode
+>>
+stream
+xÚí—UXÊÖ`qwwwwwî¤qm´qw÷ `Á Á=@pM‚»\LŸsÿ{’¹÷qæi¾Ö®ê½Wí’¯¡£ÒÐf“²r¶
+!€
+Ðœ”ÿêšœ9÷¼çe¶—í×N
+¼ÈVõÝu¡¾ ?Âìl™½:æƒVŸ^¯LÓ/Ì=:*Ô`”ÕÙG\¥‚ê3ôjêˉà
+/Í1~"'›M3‰=€L4.z¢#Œ:Æ&Ú%åÈ¥¤ùH¹§š¦à,
+÷äzŒ{ùÒºë^,j Ú¹Ý(6ÅõæÅãñô%éðA~1Û’dWY=¬3Ñm3d9ì8‡ÞÆ*¹·Xj‡{è’ÂòBÊ…?èMËeµb¢?éý&e.Ãõö„/:g„²8=“³8,7©‘®1-ðu\ì>—uñà‚dã‡z†/Òh\Ž÷¯£Å
+TÎVèÊù<JÖÙÕÙŒÕQet¾󒮈Ó{÷¥y©Õ
+sÞŽ¼ "ÙqÍçD}ZŸÍ/› š’Ðδ"þ,¦› V°:Ì©ÇJ5º¨®y
+¼ÉìRDí¬é—(.˜wjÑi¾þbÊá—ÐØo?ÙŸÍÐQP¼°aö´#´.}›%¸Æ<Ä]—Í÷”rĤ9Ó ókX3xÌnÅ9íÛ¨’÷¦¨¡¾z!¥Žmoߟ} •EÛËŠ NâÔ'@èÀOfØ Ó6F Rz\®>Q´•ªIlõ xÑåâZX6:ͧ·T»Ø{#$b(Öé)ß 8T`¨ïÀ©ð4¾…™Î·¦,îË4´°‚å°Éi¦6ñPmø¬6}¸{ÐÀŸ ‹Y^À˜4Á<óiSqG
+ÏÌñÓF‡fÛÀ¸¤ïäVÞ­Å
+0ô!pü’g-ò•¿·k×ê7Ñ’c&áéºÒt9å&4ö%šóZDUŲ?sÅhLÙ_:†®êÐÃÞ§x>p®¼åH9^˜uwñÓ¸Ž "Fت„š#¾× ¾3Á±k²×gÖ ·Ûѳo³â±jK)îJôWĉ½­î‘m¦ËCĶ­PWáÖHjá5bõT‚,Ù@?ï,)U,Ô%7X*_“l²$YQi=·S`]|]ò%á Í‚E¨Ä½)Oar‡fáó%¬KP Ÿƒ;Ú°ªl;~Î ýDCŠ=zŦPm~ðPñ¬ŒSŸ¨çz+2RÛãµËù¡%ð!ªÝè 7½ ÕV‚Þa¶œêYJc?&+'y`z˜ mLÉ:\²u2/éjªEl0V¥úÄ@œúèZ®ÿ¤·¹d¼3•oæ¶Ë+(œúFrM#ü¡ˆ·”éj2ý +ê¯E2ü+ËÈõ8û äNñéëE
+ç*ö¨O¦®´ØÕò¾´ÕåGÀ6Ì8ôuÍŸâŸìœÄÂY¸´6ž#EÑ| Ÿk8é”x´3H%wQÁÌx®ÊôòLFŸvÍ…gÖ§—6A °Ëñ¾G—I‘º›Õ®y†ºoh
+˜Ó3»½ðÃå—¾±+ÚNøÜ<Iy¨ª%—oz.arrDŒ Ìs¦¡SŒ$¶ç \®ÃI¥.ÊÖÙ4È©»¥n¹…­(Õ½ï¬×Þ´1ÂøbŒ3Ó}%Ýw¤ÀÆÑ9²«Tp¦øŠ%ý8“8nAº,{*Ck¼|5÷à%»h±­,&*>C,àË “­kàöoÀær/j .OÐ¥/pPjïMÇ,‘9ÂAÝ"æÄ+–€çn—ÏU»kJkÊÇi “°_?Я͌䱡ø|'¬ÜlÝíI·ŠAe#Ò3G|3 áÕâÁ(æˆ ân¦”FW„æÛA,RËþÑk§±‚R©å±çV#/;G.™Á½IÈ-œž~Ü1†ç ¸Øš}×Z@lxìè­>ü&=.ÛqãgÒÞSÜÑåx'à6)uÕS
+I7TW˜ªµë
+çjˆæZ[šŽÞôUCGG£H„kñ˜Y2CPãÜÒíÅ)/l([2ú”µë'àqÒ¼ç7rÿÍ\Žwó]>‰sMö>p£Õúï)»Á=‡GŸ2ê^‹ÙŒr3”(ñ`z=œIŒF°áCåf–.'æ¢H,Á&“ÍwVãñõ%hΧ=¢y‹¡#`Ûjª7[¸`ôö/äžË%ÍX¦]Xg5ÜÅtøÿr§•$ÛÊ]Ù®ÊIËÊ8衮²+5í’yãðAš`:Úà{™ÂóÕd5Ͼõš®Ô}¢£÷ÑOcžPÁøþ€$ôÀŸ ‰3×0­Qéc*Ý Žu–À‹4u†%†Ò²„«j;€qƒVÙéÛØÝ@8²`!§y4e§ï~þ8bNr“#|P
+LóPIŠÕ_Œª" /¾!ïYò—Žâ×ä"µÇ5.<Êã@¾>î à¦Ý#;VSήã.H= K¸H·ñû Ëò¼btîò*Æú~d93c3 -Äï]ÿ ®õj™5Öun+#Ǻ]IüÝ°‚6¢†>­šÏuÏ6aˆ™ÙœÒ;ÈìÎs;â‰ä®V%¶ÞB ›Êçd¢çä)NSí¿>zœNe#Ty=et„´÷ö¶J*¼k Åt‘ý2Ž8²fï»gv«7“ªN_êÂû‰Cç€+¼KÆ,¢]pö¥Ö)øV<B »Ÿ(ZÖñ"n«9ò/•‚xšNiÍÄÔÕC—Ùë[ƒ{'Xk©:÷+*µï!|¸R^róÁ¯0PiÐ…94œ ¾}Fþ°€F—F.W?UE>}Tø”o7©#0~ò…•t†oÉ·N6pBpÞŸÖq _KÄÐŒyµ÷äeIGCØ2¯0‘ò:mCn›ÕÁýÈRE sÅ–g5ÇÓó߬óx‡NV¯ÇÅ3ÖCû‚ÊkåBµÄÛ,Xk­Þi2B_uÈíÈçéÔ +îШ-Á„í,4½*ò%(ëÂmz}Xi ÿÝk¥qÊlºìÀáJÁ««Øç79!qANéKE¼Ç<øêtKk+å?ªÁ‹œÇÌVÉÚ(›®¼ÇjŽ%y8ßaŠ?NWäõá“àú¸oÓ7ã~Q‡·‰O$U ÍW†–Nk¥Y¶0*‚EîP®±ˆ{ PÏÈŘxýؾ’Í„Z¿YBøVÌ–E 
+ÜÃi³¨]Èg¯ 4öþ¤Û:.Lc›Õ³h¤êw1ÑGoVPU%:HÓ–ÉÓ_—¼äºó>Ãä¶ic‰íúfv;ô¹k?ÜÀ,éÔ¾˜>è´±¬GÂá¢ÆX w`x½{X¥QBþiwT¢þDH…OæV­$ÀœAˆÚ cä¨ÆrÔt¨@–TIÕÔü¦’È[yõpŽH“ƒýÞ‘ýùØýjà î¼-†Á)؃c„¢Ûã@}£©}»ª8 aÑ<ÒEåù× Uy¾ ðÈràZ§˜(èHõÇQ³Ò.›ÀBÅÏþÆxüc-Ú«fNëѸ±gì‡6‰Ó=/MJqܤ /ÏB`ñE×sÒÔ–|¼ß¢A+ÖÆúñ/†f£ËŸ[á#Æ´˜å×ý²Îí\l‘$úx­ÛäéÊèÓ#еîÊ6m!ñ ¤ºûæòõêÆHL
+~c(ª0ÊsÞLç&ÐU8—A†4Тò(}Ï&Â^ýŠåØ|ÉϲA\ë·\TV'2®é­cAù@ç/ž¼œ«Ò‚•ÃÞÄÞe|9E½§4¯¨dë^ïñ?‚œp4&üÔhaЧÞwvŽìú–xÿm#OÓ—ñ;¸êJ[sY«g¹5sy‚’yº$IßZ2Ùgþ]­ù«Gj‹[¸ªåAëq
+MôP  ‘x/‰c“1¾FéÌÖ60è€Óã€ä¿w<Ãx9¥í½t_Íz–ïøÑø´tù…ó¬+¿ÖŠ¹Üu¼äw‹¸
+vϸêOÐûîjÔ¹!¢gñ»èµI‰„€×såØC8› Þ¦Ø3B°ÜU$ÄcS.m¹ˆgÐÒßg•“à¬
+ÿ–³G-N€ª¨~VÞuŸAZxÕŽ59²\*rjšNâ‚vç®mßÓ<U†¼üγcL¥:Ä?DvT\=ø™ãÝĉ µzIç+OĨ€‘ÌT”œìþþïåŒ("GÅ,ûÑË-0 )ge°,–àèýª o$†k†×o¦E4=f6KÝ€ªÒ+ëc3bž6ïG ‘Èf.õDûsÃrÓ˜jh¬‡HöGe n¿RÍh»X~
+ì0l v}àØ ×X%N²¶• ү؎m‰r„áZuzëÛ£“û:ÑtOºC_¸ˆ´×=ò¹’è?Þ·sõF ÄÁ©5)ù}V»›ì.xkú2§ŸþƒõÑ$»îk´Ë`ïÁ†Z3­MåRæ@*|/dŒ Р„8á~ç%?e5]‰ô¸Fê`×q&ô=!ûNùÇè ŒH‹¾UÁ$9Q zÞËEcÉŠ(ÅчñÈŠ}
+þòË7ÞÌ}yɯ{›wc‚mãBB¿
+@áµà-’DUñÉ«¦a#-|—{Âj/,]P§½KËöÇ46•Ĺã±"»¦B9v.êEË ×Øù©™òˆ!»ÌHÁµ}ê
+ÞÜ¿`ƒ.ÉLOÊš‚³X'Ž™§9ÃÅ ôˆ‰B›®y1]–¿ã‰ç«ùz ™²xÆÐ0ˆ5Š7!(%ºqš©
+•Þ犪Ô1ÊgZöL9˜ `…pÝY~ÛNNXÈfÅ)rW&`_*ƒcsë8%“4iq+D ·í0¾Ëî
+§bâÒîÐMÜäéZñ-¶Ö¥W¹›ë»,5 n¬ßu/ŽÔ㆚'«LIj[žÎK3R]€~˜k
+vWÆX¹ºî–^pÞÇæÙÎ öŸ.$ŸõEmJK·Ûز>­uÚs¬Ï™vÏgï.¹%0©I9¬>iíüÈIÊ9ÉÙŽ'¯káeõOÛ™½‡O jlïa¯¦1 ) µwɘ4Étˆ_iÀˆRHóë’rÂÀ=KÔÄ92_¿4KÛ2b|x–€¹B©ú¨>:×3I E"dÌ»i5ß=t÷k#×"/¡¦zá»8z£wV4G“§N)¾\ÁbÔ‡ªB¦ òM›‡íö"í®So¡­˜œá¨÷÷â”Ë=ôÁë¡gh9XÎó“ ¦™Dh›ÚµeZ¿,о½<Ï>ZÓs_Ïr^Ç1 @ëé§Ytªæm> …%äŽÕ&eX•V™‰[¯¡UDmù)ÚNªaY[©o‚Ž«‘}Vì¸3Ýý…¬“æ ~íR0à♓tð9ÈJ“)¦ü€gXŽìÓ[©À;½™{Ëóæ³Fç›ÆÀÆÇê€Fœ¦ô':Ä3ªI…ØýɘꔱÁ#G;s‹ª­­¾‚¶ƒÏ¥Ü{B³)ü/Ókvú%KÑW$‚_ –¹-¾Ÿ”ýÐßø™fœnbnüíæ¯w`Ujñ‘E åodÓ¾èØÖ¯‹ånü˜m
+¸Á{;S×õbõQ×@
+ƒi6×S¦OœRÙ bkõçB¤¬ ÜN~>²NÏV¨ìê‚<û…“[þÆqwî,±ˆXyâK8Xï;“ïÏ„©÷ú4š‹¿ímì®ÛÖsÁ¨ÕÑæÏlSÌœk2
+¨uÓÝÏ“çþç;„†gxH3üéxKfÉ]9®jÐŒ_C÷çJ£}>˜Ëë|k‡šö ôãŸrN”0?BF‰¶Ðgt”JFD•â¦c –wBñðS…êÈ(IwåÍ3‰vÀ«Ã¶‰{ürž{I.²Ëϵ#äæJ¸¢¨bõ`¼ E´¯ô³Êtû–·UŸTù9ÄfY®¢†Õm-‚¢})³øø%è—.\åwÛ›çÄ¥c¢ý¤Ö¡i¤ án*ê£ü^ù÷ŠXœ 8OÂ.¦^i´;'A˜‹­Ãt»7Ù^41]
+¢‚wƒn§_È¡4X©´û)o Y“h$__F.L ¶F‡õofJó•`Íž EàÜ‹ÜÚ°£ùH³á¦û×b=Ü;¹2kMá}í4ŠÄ«0ÆÁ~ÿÚO"ø†£9úëÃõËO¤rÈ÷äÝF±Ò]|oú÷K’ óUß m©îÏŠV¦Þ ÈÕeñ-bÏXp§ïŸÒà’àgÅëh9?Œ>þdtSô‚Ël à˜â/⊿~º¤áõ$ê>‹'O\S;#x'Vb"56\ºóSH€6JÕ=7†Äžqþ‘=P9ؾ:C¨Ÿ•æS~ËåcŠtԻꂔ¶Ï«Àæ͔ۉœÄ,ÄòÆü-.æ­Bè•å³…º0wDU¨A
+åf!„×*¿2i„} ‹²h6iù÷(_¼Òðì}a‡
+¼Ùak%+ò>æµäÏp侊QôÛ™OT×xÓ¨ÑU‘ÇòíX‘ª«¡ æÈtÖi©p*¹æý4•† ,IËž {›¹†;n^+{úùñ€¢íø¾Çt½ã¯ŸçÊ“~;­öö0¢»ÐØ5L&–qænýñx2 `ƒ‰EA#ý˜ED?ÚO'¬ÕZ»ÐQ öK,[£„S9œŠÜi£¾± 2"ûå~ºuËw\ò+V¥%õúb&ÖÕ$rº°éç#Ù–~NØ\T©Œõ"K KÃä `=C¨ŠôëEíe<•r‘MAYŽgyÏiš ˜*¼‹Í¤#ÏŠ´¨˜TûûAùL2u²|9kjäɱ)Oç¨),ª®3Òûvåðu³‰”ÒÄãÒDZ±”hžsĹœø¦ÀŸ¬h[T`øsÏ•^œX bV·5òMOvÅPs$­l1 g­Ôlf†)\ąή¼H›8,èÙ‰èû¡Ä—¦œuC»+<¤Íʨ6ûîä{^ØÞÁžnÈ,›)t¶ÚO£å"²Ðá8Ô+°w'Qz©þLgÒß̲ý¿†¶Ëᨙˆ ,~<‚ÇJVɘ¨jbé4ôbiÕ€m¾Oæî9NQVFŽ¢·ø?îƒP¦…‰ŽÄS æŽúÄ7³ùw—Ç*¦52±ß«šø´ˆ t–k'Ö÷¦Zå ¬ˆíŽºC-\5Œ–>õHŽ×èyP„Â:g‡/ª0eQὄÌï4ûpS÷ÁÒÞÔù{œ“ya¥¡*ÏšVŸ$ÃÈ(ré— ˆ¾jQþ^0ù¥ƒfÒ˜ÅgƒÀ“þ¥˜W‡ÎvÔþÕ¢¬ù TÁ3Á×[Çx.’q P6™V4ù‰T‚(
+t9ÉjaArÇÀħӤù¡wDÌŸJ{HR›fº|YžŸŽ`¨¥–YcÞ“ ÀQ¸82}ŠŽÏ»Bž¹jÓÄàq1i¯Ün7e÷k°“¬‘‘ØX¨r„ÅŸÊ­ò|vtmä#1»åþ&ºõ ÅecMtà‡ÛoåôG"ê‚ ?ÀE–µDÂÙ*.‘kRè°Gؘ÷> T¥–‚"jË+œÒ:õQ¢ˆ±M#H{ˆ£ö4³24vS²‘:žCÞ¤gJ‰Èèó™b."ÂöÏâOÍÎÚ©°¸Ë(ëSV)ºÖf<¶;Âm!t…÷VŠ"¬y(xÌöæ]jZ?™ÖÔ›‚û´Ô<§#¼y¡1×1•º|(Ã]c¢«rM.Ðs8/®æ°†ÄR˜žUWJ‚¿çÁ,LÇÂl[d¡'‚¦[]¹~
+2ѧâÀ/¥$"À*OÍo•œè¦ÙöÓE¸F¾§6ƒÛ.ÌÖ3éÄ®bÙØ@W@ݾƑ£ã@ÌØJ«nêWƒÑ¸ù& Ž#“¥G47Mãtà êJ§_fÛò2áJm95–m¡øPÙ²îkŠÏw[MÄ¥(3m¥,—ôx²Øj`Güz,ŽD {aBjšQ
+É£ÕWáHÈxGZ=lÚó7ŠAj%ɾÊ(¬|s
+ï>·ÁûÆ$“ö¼mÇÒ!£¥p4¨/dÅøa¨÷ö\ÝÜ狈 5¼zÛh[ÈH¶÷7O¦‚²ååûƒˆ ìmä[ØÛ!YÚ W¨CÉH_‡2]
+éùŠªÌELð2‹‚KË"Á…òÚšüÕÓ›;˜-áõµÒ ¡Ø[Ïå©´®;…À'²¼™W”·âé15›$ÁŠ|8fž^rÚ( –;s‹—såCº´ž‚iÏd,ë¯sïí‹ëSÀcÁÅvÃzãc=©ŒKNwõ£š´rPÍ2©Ð¬ÅŽ´çªy¤A¥¢y4Åد–^ÉÀŒÊAqž§ÏEج\¼æ$h!‰Ž;üÑ#˜\%×#´…‹@ÓMLÔô&5EXóeAô[ó®T Aûé ³}­Ó×d Ÿp(ã3›rÂfw‘]
+WåÁ;î1áŒ_ìŽ,áMßô‡¥ì<èÞm{šUŒžÙh]Zv»Vͨ¡Ú‰ÛžEÊC¤êEZçÙ}y8Ç9b„럼¯*U…ð†tm’âË–Ô1tµ¼ÄŠøg—°ãíñ5]ŠÆU)IØðØgÊ
+ÝWu»Ü<õê<ç]j[ –tw~Îq횟êVŽæ ìJX·ïqÞ¸Ó®^“H¦‚øCXÐmœŒÌ…ʇk ’üXË°>Õçj¡î©Ù-¹‰Ãy%R7#4‚ï4†’ku°2Þ‘©k„ñg Xb‚¤…]¨ï¤£êÄV¨ £\Ýœ†ìO€†×õêè騧õ”iH‡ çA^òÅð¯|Î  ‡=&¦ ±Ì
+Gj¡ÎSÒ;¬ƒ>Ó}éc·Ò(SÛÕøE²ä'þ¯B‡^ÕVrc¼ÜcôÝšrÙøöÆÁš»!áJÚ&<%H~äCíj•VÄENšØÄ¡tŽ¾ÀÖ¡êÉ„ÕÐXâƒßÓrYAáñ…tÁU•ÖjüœD’”É’Î9[¿û†é¬ÃÃlðÊýTzÁÃRGõ—­¥hœ–´0]ÇMÙã…é²T©”haf¥7Iúa„ÔâÔ¹¨i&Wyh߈Yø>³nÑ=ûd÷*DŸ`›(K¶3ˆ\µÞlgeÔ 6é˜N’1Y4]3Z õNŒí8`>}(³`Œþ1,9µH4oøøþ–ÉtØïxã`ûÞ*5|+FQD"€¢Dk@USᣉøÃKsÃ}pMã<@K6îX4ŧ`2øÂÍaø¡)’ƒúc‰—~„0Õ
+¯È ©ï2îZd­=¦„†Ñ#Ï\*©
+endobj
+457 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2941 0 R
+/FirstChar 12
+/LastChar 123
+/Widths 2942 0 R
+/BaseFont /KSYQCS+CMBX12
+/FontDescriptor 455 0 R
+>> endobj
+455 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /KSYQCS+CMBX12
+/ItalicAngle 0
+/StemV 109
+/XHeight 444
+/FontBBox [-53 -251 1139 750]
+/Flags 4
+/CharSet (/fi/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/question/A/B/C/D/E/F/G/I/L/M/N/O/P/R/S/T/U/W/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash)
+/FontFile 456 0 R
+>> endobj
+2942 0 obj
+[625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 375 313 563 563 563 563 563 563 563 563 563 563 563 0 0 0 0 0 531 0 850 800 813 862 738 707 884 0 419 0 0 676 1067 880 845 769 0 839 625 782 865 0 1162 850 0 0 0 0 0 0 0 0 547 625 500 625 513 344 563 625 313 344 594 313 938 625 563 625 594 459 444 438 625 594 813 594 594 500 563 ]
+endobj
+2941 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 12/fi 13/.notdef 45/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G 72/.notdef 73/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W/X 89/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash 124/.notdef]
+>> endobj
+452 0 obj <<
+/Length1 2282
+/Length2 16395
+/Length3 532
+/Length 17654
+/Filter /FlateDecode
+>>
+stream
+xÚ¬¶eT\Ͷp»»„àîÜÝÝww ÁÝÝÝ‚{pwwwà_?çÞ{’sÞ¿ß £çªUUs¯’ÝäÄŠ*ôB¦öÆ
+0ƒc”·Î
+p²ûïT Àÿ¸ÉL-]mÿ»UÊÅÈÆÒDÈÎÜ@Äô?!KgqK€©¢¥‹‰‘™‘3à_q€éK
+]þ¬>ë?K
+ÿ&N ‹âº(ý! ‹òº¨ü! ‹êº¨ý! ‹úºhü! ‹æºhý›¸€.Úèbìddb pùí|‡üû,ýgë¿;üçIàâøßÿ™ôús¸€^Æèeòç"`Š™þ…ÿl–¿ðŸ­ü5ÌÿB`¡,þB`¥þºq˜€jV!ÐÉú/Jýu1­lÿºË€Vv!ÐÊþ/Z9ü…ÿlç¿håôþs¶þB •Ë_´rý Vn!ÐÊý¯+håñ­<ÿB •×_øÏUigú÷ÝÂÌTØþW h`j
+ü“<‚§ØÍð¥0òsàhB¼ÔB™øŽj ÊäÅ°¡ÜÜŽ:i2Ȫ:ùkǼ½xÞË.¸&^lUuê;rô±RM¡+³“Ôl~ÃýÒÈ´
+·@ªU6H^wüôÚV2ãÙуEÉ «Úd±R)Xc‰5ù‘]Î0Ôk¼îbÕƒ¾ÒaÄÐbD€‘Ö"p#5Öꋸc/¼Ôúæåi9ëÅןUQ¢‘ÏøyÆÜ<0…ÃB‘‚·ËüS÷*kž·Ï+VÄ3øNР
+HOHL8ÞÂÖñ0ñ X<D&2¦>3}óˆÞåø ¯Lêݯâî¥üãKÇ ¤k›á›³'ÙÛvÒÁ9©ßJ$üëK}‡XŸÚ„’ÙG*†/xÖ­´$8PæyTâ ~·QõÙÌ° m.Ë9㚦
+ìÀ~
+‘ùÞ¾Ì&}<½¢nXºU˜ÀÝÝDÈ„Xì.Üç¯FäÃïsxjíç*JÏ“!<ÍÌo`Ö[AE´w›¨—ÆÍö¨—±ôsPqWùiµ;ò©JOQ®Ùø ×A±v@òhÁ{oÈäìÄÈ ö“5«4i¨ë3u‰×ãÏ”Ï'9*—{{ò~(È‚³{!U¿:FÁåñä”Þèa\?G¡z#Eí9ଯٕb Z<ǯö“ÍmØ7F¹+aDÒeò—™E†uóu'†dˆ*Ñ›ò·qã·ŸyKƒ*G’±ÖžôkCgÏ(éÇG­ñKÙþ?¥™e­Ú[¼òÛ‹­V®ì§& ¶@Ñ×ÌõW ØÕõ¥— AG+Íʨ÷ ½ðHÀ«¼ ß*)œÌc=
+Qé#Þ)Õs§è¦›Ó ¾4ô`rv¿Ã•üúŠºfáy_`I©%Ž¢ŒÍ)uƒÇM ƒ–­E‚Y`HñëÇW¡QrÍ}ÚO1êÕ|-4ÜÊ;ó[Ós¸¯ºL»ÙEa|4c1@Ó)Ü1ž‡¯Rðz›~\Õ0t
+Ÿ3òè-bOª°†ÀÝÕ)ý 78~“ô¨!y’dzSvY¤ÖM Þ‚ýVØ™Œz H8æ°tÕ(Œ*B® OÊоÌÖ¢ÆÇ•íåÄ7<• mÈÐ(ò%· Ý<6‰8LÏUZE¿Í‹ ØS»€«@¥=Ãã®bæ‹£­ßC§Þ˜åCêÅ·Z™…(T’k9ö!f‚à’'„åz’löWíD¯ìÝ[øÂzyXxÕrµÆ¤™¦ÏCþuØ̆Ã˸/äŲjÏ2n¹J‘†(ÐÂ=£ñµYùn¢®r ¼~CIÞ°þ²Åg¯br­*Þ!p¥¦¨t‚¶]®sý‰(¡ýîlj5kUbuèÇДÌBï翾Ѻ}%¢ïŸK æöY0få¼kN-ÁJŠ·åqIà4d â¬[Áµ~ R*ªÉùñÒ®›2”ˆ)Ò ÏLMÜi›úNÙt)Œ¢è6ëèkÖ×}AB#\Õµö\d’uŒý6¹æŠÂ䨯ã¼\xõŒÁ E¤ ž›ûyùÞ¸òÍFN¼Ëô Ö£PÖ°^V<iÖÔÕÚ„qû'«ú!½õ³£Ý@*ÍM›Ã‡w‹šç0~T¹ºà<[´ž¶ŸŒ_ºwT~N´}MÜñZ9,ÎGyWy=O3Î<¤ð2x&›sºMB9›ç¤}x&7á&r¼Mp €föJ‘ž÷S`%´ÄÚpÍw„áïù¾ãè†xô³ÆKB.Ðœ)J /oÔ?Ê*º廟թ¿QÓeH‡ßîá.a<©
+óW?^m/%Ê—(!‰l—íüõÅIÙÜüµˆl§âÿEb&Â% ï!ÁëGëPS`£†mH%¶ÊÊŸªK )(2‘ü<ˆ$¿¯²Æ‚êÆNdý›ç Ÿ…ªlXÇUˆÁåŠYíöŠ[ÈIÁí~|Á¸C›˜1ü:
+pŒñIòü<¸¤ås;ËC †sµ·2Ô¿ÕXþæì]7(ǵîÐ7iÉÛÝ&^Ù­tmm< »Q²ŸéÌ•Pƒ‚‰ªOÔÉuÅ:?¹&òÅ~°˜=_Þ÷éágð÷ßtV…]ª—’±ù4!"iÝÑÁ<Û^+g!r߯ÖÍîkfO:4¢E..HÞ>¸§[V¨:6<^îiýQ¤ÒC .‘¥ôFt¦¬¸Ÿg}íVÛ Ëm¡ÝzS9VÏîwƒdáàñWêlyª²žåmò­#ÇùÂA¡
+Þß—
+mFcdÀ‰PÛ,žIssæ}¬¨  ?놸
+‡~uH¶E,}¹àÍG [ó¸ô ûŸ½›`/¶z‚¼/Ž%ÿ¢EùçE©‚—¤×û\%1Τ¢±E(ØXƒ[ñ90kÿ ¾ô÷z}µ(ŠOàbÒýV]ãÞ/Òa¢€cœ<9„M1:—ˆß.™aǶ¨±¹ÅК¡â¿:æÕ¶Q––.ÐÛvPŽCì ÈT>®=àUçŸéñ8M¿u‹š1FgõÌ@#£B¿¡»ýBµI\G¾ÉI<†>LŸRúAèL9dôMxï} Óöò–eMõ}±v©ø󊃱ÎVÔQ¬;Šï?Ê,Š…ýøƒ½ŽSlô”Oïœw#»ã~ªÀÈi×[Ò˜žµ ¿ëc–äh…°Ïºš+ç.ÄåŒêeíà 0Õõ‡kn/]û)¿æèÔ¦Ù¥f˜ÄíèÅžÖþÌ<÷žŽ¿f¼eslcÙÙ²
+¬‹w c¹L!ÐõÍs¹ Ú‘€Q
+£¼<e›bWrJÐ ¹"h‘,´InŽ¬ŽÂr>öÖ³Û¥è‡ Xß$ÖsNTPÓG™²I…,˺E†Nªñ§‚ÕúVüý¡W±_Šª#&æêpbó¾pq™|8CG#U 1äêÙ;hKlõT«>‹]Lã“eh€Ønr (ÇqæMÆ@u6ŸT
+Љ-K­6«ø)Åá„únÅê³G8”ÑرRS{>æZévU–Sl oIhctšþ Wë«5wýí$[­¯s;“Bö·tÖqéÉ”\’^ÏäÈ5ãñbUª4²cŒš>!ã_›Õë­zedóføq/Bù t^koeš¨0÷dP­‡Žà€0ѼXÛÞüL/‚ö¾+5}»$¤‹„(|8¼Â"²:,"¡È™´á“ìQ×-g0, Ó#ȪñÜV.˜$¬7½s©%çYJŽ¥ ð ù=•/ç&Úd“÷„qŠŠm
+)Þ£ØS
+óŽ5šiЃev·Ò«Ü)É7¤Ò†hWòP<$ èèülÊҨϣiß~ôA÷^rÞŒ¦q‘@¯ÖTI÷SmtâĈèŽK‚¨Ú£1õè¢6DzIO4*É](:ÖÁJM> ÷ô|ÇÌøß—mØÅÃ.;„‡‘½eQïaou'ù],•qÇzñ)÷L›È~·ö#ãÆV†f×¢l5‚öuE«Ýü:ÖZ#Ksly¸(: )¨ð0 Jê¨sK7šÄ9Õ¤Ó‹àÄó„0™Â»ß|ªÈWîôärÈÚ¼LCe΀¨Y0ÓÝÂ*T^íÖ«Ò3ZÕäóvð˜W¶Ó¾ÅqÚwÏÃz†4P‡crŸ]ò24d»P8Õ‡.–j±UNVxÕÕ6ýöûìúÝñy¯¢+ô»‘˜ŒÜS;OV¤äÔ}·™-
+¾¼Ë¬Ï¸¾HôV8­·o1IŸTßš ð©'ËsåƬÆ<“Ò2ºüûÈ×ϲtæ¨ÏÇFA³Ù1mKÄ—³<ö{.ü*Ög:Ë‚Š³—jª,RN‚‚L ìã`¬~æPiGé‘›ò=¯å׋¹â¹ÆÐOÝBÓy¥bG±ñžSüF·DHë
+/«ëÄ߉IŠ“ãð)ËeˆíG{<Z@Þ£*Òó«!«éʪ!ÐÛ"®|»$_¾ûÜÕ¾‹Ræ¯OÇO8a|{Y)½¦)x¾ ´€àK‡ô'\;:‰ìT¼j‘¯´Aⶢ{°DGš‡‹¶:/ÙêÉÇ«qË%ÌQ.õ7ý˜êÍìr²*Çú0–ó0^ƒÄ+sl5³cAP4‡>w*¶!”ݶäÁ[ùNÙ8nÖP†˜>¢H­i(ì·~î~ëžà™“oD²;ƒ–%óñÃÝÉìû¹WôäJ-ëm=ª8?QÓ±žì@[
+íºnSú”g¼ÚŠúÚjY¡jB |9FüÍÞõÓuÒ=žSÈX;\¯4ÃJu‘J3•3èü¬ˆœyP_oS_€E’³“‘ Àà ]¥GþÖ/:øÓ£UÒp­x®’ƒöĨ‰Ny¸9/©‡¬û}<KZ¥¾tÑšo¶uíñÃCWTûc¡´î tr wȺõËÍór)ç ò­øìÄ#ø½ŠË¤Õ{n]M9ÿ@,fa[ô$êw&Êyß[0æ‰õó&7R•Z¯\O×Ï †úùX“0TV~ìccnEüF3H×®$ëÃfKî€øFö}:Àj×<ÄsÛ§ÏÃÑ¡<û$'³ó´k þR˨Á0O L2¤åźqˆP_èÃeïúáV â«­HwÁ‹ãI¥ ¦ý׌ÞA(W®a®äALïŽbL
+ÓÖ4{OAlÒ ÇÆè ,å&úßíÖ- Èœö̦û[µLɹšnò£’)>Z soTGK póÀ«(L´nÎÚÅNU˜£MºM X˜Lk1Øâ+ã"±-G½U«×©$RZÏ×JÏU«Ì%ò]¤•çìƳZœ^U+‡&£AOu?ˆy1=G¥Æâx^NZŸx)IÙ³»@¢¨í ŠíFÜ.^cÝoX˜KMMrÓ˜ÏÓ:o€;Õ¶Q3}ÇÔî˜MʦÖ²Ù/ø±çÀvfž~Ô mìwÙïFé
+hè×´"îþZˆœð÷ tœÔÔø©
+ŠØ„¸wa³&EõtÊMª¦;ÒŽ‘Õ"Â_„˜»¿š:czê°€àžïIRÜ?¸õ†§iú†1Ûª×êÍ×#‰ÕPÞçÎùP~€"»‚6)„üZr¹’KË_ùå‚0KQfÈvƒj±šI=IÂø3C¡ˆsþ#m/·\¯P°J@I˜®6{¬aW*ô®Äw/ÐdóîMpÎ-"?_dÉÙUÇþ‰Ø ‚_ŸìÉ3¥ïS[aº+4ýÊÏð&æ{{.)½¹·¥~«Ý¶®MÁuÌìUõUöâ|'#eï6C¨¼‡”£éwV¶“Z×  ›%Q@m©Ä‰åãìÊCƒöf϶¸L_†1•NjÛà2ÞÛ1„I¢l‡Ø£T”L)ÛŒ˜ÀmêC8•MÜÎëð–†Êa ª™u½5»*
+!+‰YŽ¼;d°ïÓ>­)®çœÈ"í\SÓëÌ¥UC“fOE8ÏÒ·OcøŒ(Ñu3úV@¼fkiûè„bbªSÏÏJ="ˆI;œ
+H`Ñ>G%ü<//Ògd5¹y˜¨QŸ¿úeGƒÝñ»B±×¥ïû£”¶[¦iòĈ7ùEMl8æ…Ň“AÀ„È]£È1ˆ£ 4=/8nì§CïáѺÜq22Ž†Ï/Ý}Ò¯?-¬ñH}ôOð¯â”š]äLÿ*5‘›¯ÈIsqìL”4Ð^à–ß•wé±K&‰8 ŸDlÉ/„±E“P%®÷,K’ ЗB¢H³)ÀÝ›h­‚Ã,¶0=Ô¬óm›È%L)að5º}1|ÑeUå3!: Z\}††ƒÇz¶ìè&•Ù¾ÆêîCråå‘‘iÐY‘Ä4"Ì–W¯bgºOÅÑaˆLmÿÖttSƒ"ûúTUå¿Ý<”`˜Ýz9©—Uµ¸X² êË5ÿÖ^ÞÝÎ&ÿÁ§ÀÎe(¸y; l°;˜‰Hò­
+$¥G_â²Þl»¨h¿H4‹
+í¦é.5BymQ³T½)k‹‘l 3(½š©!œÜ•f†<>|¿tÎlwRØ´> UFæc·½r’²<~by“ÔÖ ª¹ÐëÌõ”M‹3¿}‡¸¶œê¼)V·îÚ1Ññ£,“®^"vðããNÕÿ×þ6Ÿh‡ø«†OR†¾$œ†½”LFIè[RÚ5ÛÂØ+«Õœ7ÖtYVªûg‹0$T¸ú³Ü}Ïl¯Çøør÷ïº_+À{zåòDøzt6R‚sž9Ñ ):XöÞp`eÕÞ•q™D´@˜q®Dl¹ŠUp[ìüÄñã0./[hÀ­ÐªÊEæ¤P×Çøv@I÷D÷îC}IáÂçy’\º7²ëÜÞtšçL
+fî؉Ԃ´Q!&êqÍ¡m“Jüèaç3\ÁÝ%CfšÂ÷8Ø`Ï÷Úùüݲ-°·˜Û'Q'Îí–<YA[›Œ7ù.RÍÌ`Ÿ߃£ì]4E´ÐT dp÷Üïù¡V-¶3®‚!¾¿b´—î{ˆô÷mG5½2]êf•0[iìkë±bܸ\°ŽÊÜ•¬ ”[¼;Þ㯠Øú_Ô²Zv›°ÍÂ8|òÿ¸™¬¦ZžðÀUðåí0€~^‚gŸ”Xõ¹p]aÖ#Xšf"8 IÂÞ {Räg|§ÎcP­HÌgŒ@|¬z·nHkáVWN©S#~[¤…RêÄwœÃÈUŸç:T—_tŒƒÈ¬C4QÈŒÃ\Åu©©w”4ÖGE®”¯}kmÆ)¹] ‚L#f‘ 5¨¹¨[nsqv£±&ºn8ØŸg$ LM—kßÝS¼Þ¯Òž¡ÒLõ<ÍA ‹êU- g.4/½ëxÖêKXO¢¡>ö(ècma!Û}-¶æ™—÷ÛÉÖ©ot)?Šf§L¼¾S"N÷ˆqwûmNLKÉ£LÊmâÙª!W‰¨ñ~äR=²…PÏÜŠtšØOµ[õpìð‹ÎÝ80ë¸ÔOèv’¥¸bNB83ö“­(¸hÖ7‡-‡Ä~ÚÕ&$]”f”7[¬,7bWÓ¯Ö¤uÀÉUßÙîå7¯ק«ùï†hËõXnþeSdzj·Ø·Žæ¦-×[:·ö‘´‚šTĺÝTÓ¼–Ÿ÷}Œ)Æ5&s f™Äϱ/“êeúƒ*ïCÙ7KÌ׃ŸU\¯…[ŒÌ³7Kö<T8äÚ@uÊ'*ñT᪛—4’íjæIˆŽŽ’^ H¿9ªó 3õZ•­|§Ûå'µË³údÿñN8ۋŶ®~M OÏjÁ,>Ø5_ ?f
+Aqrß¡”ß{N¼[ÿyy¬_
+Ó};UŒÜ:•½2 À“¡Ý*€ª÷>þS7‘ûÌÀÏ”&ïM Áx¡5—ô{—ð¢’{úîbriPvoó0q­À/qG(Âèú>u
+WA±Ç(–¾LõYìæxã“â¸Nk¯ ½¼¦=1Ús{dXJ¢º‡|Ö%Ò‘•šƒÚcÃŒKÙ¡ûÙö’Lå­üLdž‡!ó£ ‰E·.Joh¤%Ó->Nö^nÅ<–<ê·ÊÛIUàG,Éîc%ð¥üd¦`îײÏ;¾-Ú¦}l;iœ.Ú ¸:~81YiX±—&Ç⯛]È™K{¡MÁÃÎ3Ì=OH­4
+Eø0Û×¼å´n´ã§^ü"þñî9·ÜÖð<é×-µLý•q® ®YZEb î´Œ§?šùóq…}¹ŒÇ ŽîËÒ`¦ {å‹þŠžây·aU¶áï'í?Œ±´ƒcMïËv)p'’&JAºf @qÙF~êM¢0Ϥ Z˜=ö¨}effæ† ¬NH=ÿ59\ÞeµžY®ÜÜHo™u-Y—pçUvÁ¸…-¡óq¶ª½’ ÐÄE¶ž[ Ï,!@ DþˆŽIôSÈtõÌBåúQ;»Ø³ƒEóJ·þ(FŽ_qÐ<NKÝz FÍ ™ƒó|cSØ
+‘_µ“ûðd HH"wL4ƒ“ì~‚æ¼Jô0˜–•)ÕŒt®nñƒ\zì}Žó ¹W‰yÈ}«ÔlömåIEô ”áL byj¢@ø*T¡ Án AºÞòÝE Æ%¢hÍ ¹ŠVh˿飹‡Z¹¯¼Å–íßÝF¯Vè0-ró•~×îw‰ÒqÆtΰtOŠ£,kû¤Pa%"ñ¹£¦aÒ–ËS­÷‚Kì!ÈîÐZöR™jï{Ãxb &Óŵ5~´`M¬ÍU]²<jsh¦oŠ×N¶\‹OÖG‹è”F
+Kè.¤J‘ÝPÑvã¢ßOî0É2‚%O6óÌõÃñO ‹J`‹qWtK‡§²aÐî ðfl˜»(Ç{nl™ÌD¡2ƾ{ª@I¥õâ žr¡ áB>t¨¯˜DUÜí›™c™ðžü²‹~œÞ;:hSœuEȤøû„9ô~ÖÁÔy)Á¾¬@Zsäm=’oú+‡5Ÿói<<c
+…ÎR˜oÒê+f,5­gÖÞ7}—ˆ
+Œ=ö "½Îr*`VC ýR!ãÚ‹%'4`%öå4“ü¾•2ŸrX良Î#ÅaK½E0¤Ë
+ç°tõlGRå2J¤em™à‹­“æ
+*5ûì©’¥J°“ìêžF;ÌLqž˱Gf ¹øò²˜à ûªöŒJ*sÚhÊ3W÷AÊ9ü¡sòÉÖÌI¾©¿£ }ÿšÌ1Aœ:tžhFh·¯A¨^Ö~ׇ5•’W†a'º¶%¿
+å"(AZ~B(/E)B"øz>dMÀcŒKþç&¼<º<2Nï¹4ŒÞjF…¼yîb½¬RwÑavã|¾‹ë
+ä'0ßj¯ßÎß”ÕP-CÍgàæ¦/ÉÌÛ6x>°Ï¶×|GÚx~†H‘^ Þ7óésQpS—ü*¸ÔÁŒ²Ü¯ýí¹Z§·YÞ"8JeñÖƒé#Úwa/ç!®vG‹=H„&°ayœßÈ¥‘¿8”Ãá !Çÿþ+¦Là’î,?>M ‡dèÁMr+³ñ×¼ØA&j¶iR$LPsÖ3¾ÃýÇ—°S)YEŒ©§><IiL‚õl5ÓÌþGJ{ÉJëÓ—z1úƒž’Ž3­ó=siÄ
+XbÙWRC
+Ïâf±p¢2¹xäZbÏîó}γ¶ž£bøð[bCFí¨;ÒžøE’³£"µPrò'('%? Á[n~ˆ€¯ÆíÆ~:gåè›"é®ëÂì‚iú¥Z4·Ö9zõ{0i)ï­Ó‹Ûd\/Sâ"E.DTï3H­«ä«é<Ür‰¦OòS½^3›¡r
+ÙNÆ´€ÝrõimŸ#hÞòÍ‚Yí|æªÚi²¼Ñeìîöû 'œ9³½/k‚ÈžB^]^ŒËà’µm²,TÛÌwã–ÔšŠÎÒh1DÖpWmQmÍgA®ðªRœy1Y ÉÓz»“#Y*Uv=¥U(¾Ç%š8‰±Ó¯Üìó›î#Ž&£ð0½1NÏ¥æUXE6~îëb¹Ä"¤J¸¶zQNw}ŪgÒU³ífW•š%-ovþCç+"¦XÅß{@¤ü‚¤U¶ ËB'—V ‰ìñ^ ¥x¸¢ôªyP‡Ð} >N‹ôJ7á6ï÷O‰Éúìbð8ZØšM`4Y$”!ýÆûê׎Œz]3Œ[NuüF¬ý G.eo† ¯(=ÐéïÐnh‡'¥p„âNcžxÃ,G4Hʧø«„¼yý×VΊ ø! r¬Î0>Mɬ¼)jÚÆöv>ØiÿDX]ñÈ°ÖÇvßò4Éi•ÀF»5Aè >ϧèj™™|)L·ÛÈÿ6áÃCÐ ñ8àY«¤Üä&Êœ $J€eGšñ5É·f\:,UâÄ‘Ij±é¼ÕØ‘³
++Cc°NëgÊ̇>sÄû©ûpÌ¿¸¿ðïª Fžt(µ²š_p]â»ÍÕÆ’(}ÓHB8£!©@áå›^¥Z*³¿ècŸ\Ü>PÃZñ ŒŽÃÎÞX @¹¼â3jWKÐ\cžBÚ¦ó¸áuز¿ƒ3H+Úèô¦p-¹7aú~i0ŸlGTëÊ ÷Ôí ’œø=)€úÙI%Rð—aR— ©Ý–lwR¿žØغX°a_Ý…²)+ãd‡æÙ´µ8Ì$žúÓƒƒ~.›ÅOOÜÉ?D¶Šåçç:|AX*Ð~žû¬í¶šÐÆÖú `Müåþ2j<Ø@Äé·âž ½h 'xºoý°1@,5á¬ç¾¹¢·¹ÅF„=wFðøök'A7×n»7aØe³à§‘²Aì,Öæškέ.Í
+ðbFq(ê·¯êÔ™f3LoíÈ v®¦ff QºnyJÓE¤lv5”.Úf*Œ[¦ÎÕð7ð ž+HÊÌ›cd`âZ‹þ”­:æ¬ÄÑp"‡Œ-rpɆ­ÑÌó !ŽÇ߆ӚiùÔÊW4Œ|Êb¢pÄ™nž¶µ°¤]øc̤xÄ9Vá¡Úß•§X"Wë”×*’D!íaKTW·ä×%Ps—?$VÙÛ;@UI»x ½p=—%V@>Ǫë;ù;>­!rÉ%Õ÷µ¸V]¥y”ðy¢¹ÜØÖqØühøPKM•ê§‹*UÕ˜cÒOÔ/
+
+ þ¦«eQÓÌ™"óN(™ó´fMÖ/^UõZ¾™·/ÄH½&Àƒê§Ù)Cy¯c§±ùuÓÇBɹWr¥b­~Pg)ŽÙÎŒ\â]Là5õÜÑ€·0Ô.8>‚ CWrïý[çÇm³é‹gÌ!¢yŒ$GÎÌy!îêÞ„šŸú*"‘Z*h?§;ý/]xÚÍŒß3•\™…BDv¤Ÿ-Y•ryºtõ‹Ý =e]…´‘˜—Õ6øC—ðkAú1z EÛVYÒ¬šDÇäEƒ iØ믅NŠa~)\k ÒB÷žy€qS7¹†~$Œ
+ŽsdŒ‚TÊ¥lMs®Y¿(ÞŸ‹H6Áž¸J¢…æ:6ÿruÉ<9ÖHB¹À šOTÕ–$ò;
+Àzˆwr|g‰ó4¯ù“@o¨±ïç’­¦ŸåSœyu z0¨L A0IÇ'²çøˇÙ" ‹+Ü"ÕïŸËf:ãŒr{AQ1)±#Á¿º…y ¶±›t—ô›»Q12N£Ï‹¬&WeJal»3òŠ¾óÑ ´®:½egÜ骄ž‚˜rE.¡`]4V»êV *†îLÝÆXYÅcIõ'ñA(¤Ú"£Ká\Û¨Ã}19ÙÅ:ÃÈ_°â· NãÀ£ˆ.¹!TtyÚ­vè¨Î d]^npFq2ळásï. ñ2ø“mðGmð¢‚F×úÖUÃä¾Ê0»MIJbö[û–Ôˆk¸À¯ –Ÿ9öÞE­U?°’:("j7éeOCë*¬Ö‡C^Ú1ÝFßV õS}áÙý<šwË~AWÝ
+Ë|Ìê$¹¯æÓNjIvö1 ‡B¤a:_4yü¦ŸÚû)Ç£lÉ’^R¢ün¶pÒXq÷µ•E©D1ÿÊ]/]ˆ=,½í‚³*‡Àü®Z}øA‚ÉÚšÊæ±tfG¸Y”§#˜Ÿ¨×¢RP²mBˆ— ]óCVËö‘ “)5 ®:D¶Í·ªR8ÙöS¨Ý¶3UÛäÌЯ-<T·üõ–ôî²[ûF×Ü%¬y|YÉÖ5(’ ã—KÊ×å—˜²û"ÐÏ<bì^ê%‹Ië
+vy)ûb„±B\­SàBw¼Ö§ö.@05¡ûsM>ôEÑú*Weô 5[àq3(¹xlÑŠ=º£ ÏÆûõÔæ¥1ȳ AS¶…öˆLgCÕnô®\ºí½uÖaÕ¦Pê-Ë›;ÔRê@/¦{¤åÃíãyÓá¤$D¶ÄéE“dx†@Àe²8Ž8{‘<‹èÜ„Ó›!¤F§.ñ°°Ä"ŒÒ²6ÿó=âÚæù ’~²q$Kkô‘šV½ÂþëE.Üj‹“±5¸ÇO_W z !1.‰‚*†”òy=ùîù+Š4OêÊ.΋jõ;ÐÊÈÖ?åÔDŸÚJ¶›j¼Æã²™éÁšôi+yBÎiµ…|ʉ\ÏÐ>Žþå\bÅ@»[s¢áÔ>k†"IÄGº­F\5_·®0 ·sÊêYA_‘s¶cÀRM¬çD¢ôÂNn›8+k€ZYýAøZüã)A¾ê'¹ ÂÝÂ*ûÚGµð•¬0"ÆŒ@8šë™?àêÚÔ$œH®š,¾›ø|=&†Ú§w…ÉèÇD㻯Ê*ùƒ+öÖFb¬RÛçzˆó3ÓÙÞ½€c“0¾.íÕ,íϨ¤*ªä3ræLÆJq±HèÀ¥2]z’+%ea½œŸÑTÐ̱^žŸ¢uL¥ò8~ªDZô¤Ø»} q‰/åȸ ÅæE¶R²¡-P[:&5ðûË}n ‚»sŸûª>LjTZe/¸áxÎ"‡
+èEï&‡–ëݵ¡ P¹Ù É.[Ö¿º72÷
+ö;µ‹ËMn“NÚHë[¤MÙi,d}Ûãs™¹W3\·ŸÙ¯
+¢¡ux¯<=6p˜ë-qiÅÛð|¾ä馾áÇ«¾Cðù×s%@ãŠfA’¦Á4>Ú–»¬*í°±œ{áÖïI\®˜B¸(IT­œíËlÑH˜’ òFâGaLŸ1heb¬÷º1 ”‡Bã1Þùu\«è;Ï)¼öÎ-w±«F4–@NÎRéþº>&9VÝü‹B 3Yǧ Ÿgï±ëþ½òx
+|XþÖ‰I{5¹rÆ-”È™ìGvFd°v» ˆƒi)¤Z–¸üqкÙrsøú˜YÙnèt= CÏK§M¦ù“ÑhòdÃKÑïfaêž=Táý/ ßL¾õ¥ïñþ *" ËuÒ3S\RöpÍeí§Ä`NhhVínþ½7åõRo¶/\ŒàuªeiSÖE ¸ÜŒ•±Ðƒ Q Þ9Ó„_,YöîÞ–?I(Á‘Al"<‚TÀ•xaÿ®FÐççÌÇjîfH«:™“¾(5³–?©~ÕJÝ×|ß½9¿¹‘ÎA5±y¬Û¡1ðŠ|ʨŸõ,1o.†3?ˆ^é‚׋Â,~f‹ïS³°’ÿÎ؆WˆdwÛ–÷HVU/±—œ f”ôx2NÉ žííc“OhŽ",òB­³Iä'Ôf-"L¨ú»aóž*gq òRv&øèª|„ª3[c;MTd¯#$‡É¤8:’ðÕ”[  º0=ŸB/¬«È¾Ü"y%@¨÷QݪHmø<Ÿ.yò@Ê~‰{Å‘^% u,%Ü ÄÐ] vÍT̘{Ó,K=×6­j`™·B “ÊVi̪jDä—Ù¶‡œ[
+üTV–}ÈwKñº.gŠÂ9I™É@öö´¾–e\EÎ!>iÐ]‚w ‹c`²×\CÃÑÉøY•ÝsN·<ííàzE#íÀ+ó;Ï~|#
+Eub®XÓÉ­l#=«G[Ç÷¬w'™ÒWŠf3 ÔÛ¦¬îýÛ•˜ÓbÓZÂ|Ñ _¸ÒŒ9‘ ä#œ’Ùd\OQ½Ÿ@¹&L+„~ßfƒ©è…+ïgºn±sý}NÅÎͳþá@
+Gn¸àÒâMŽM5æ|òÍ°r8äáªg¼BI›œ‹ãÔï4Q|³¼LñPùZóèGßüûcš·è­·»'-R=Àe»žZŠG·y7Î̹ãgOηù^Ûq›h˜I½þ‡‚N…{ ÜEn]¾7ÆUMEUƒ(ô.QŠ!l•Ì‡·ð´}ô¢×8—ò¶ˆ*Òô«59]×
+rñ{õùôá|{ñåsPg·ô·Íž._è);ò"BF
+våº7²e¥sbɪ³%_,Lï
+èŠ×c¤yv:™F[;Î œ;M}DGÛ‰Ê`¾†õÏiÌ1(?¼GFUšëìDdÎ‘Ü ¹¼ÐŸÍ
+ÈCÛcKLÝF=P$B¬«!ªuƒ^òAž»ïiÖèWv†®g½­Å¾¤«k_s¸–¾‘ùòÁeºB)1¡Ãª Í ¼NµŽZ–äNZPBÌUGŒ›¦»!öç_Ϭëܳ|« j>7÷Q&
+ºx ¶¨
+Q$†+@*ˆ»à8ÃhöjÑ­„éu¸›»h¸³HDqG8Ø6ËíË•…1‹³ù ù8Þ½ä+ε¶À’èèÉ¢· Co¨<ë÷'4i˱ëVúßà+ê[â¼.
+ÈÁµîÊé[€†äì–m5Ã
+óy,\0Æ×r»™Ž﵋æë}½©/nvdË3OÀŠ¤Ty˜ÀÈ¥âšßL¨vÖ.ØF IW׫&hIw#?>/ž)½Úâ¯|#85³| ­§`Wýy#Êÿ! ôð`ù¨š†‹ç#w†åÝGyg„Z‚–ÚþѪ‰Lýýd’›âÛÉÝãöÂMàHØÀK8mŸ›øW&?ÌG-Bl2nYT*ã6plS‰ïSŒ·Â½^y“K'˜Ýµ×b>7j°ˆíÄ?ÀMG†Msµ4jÆ›U%˜(æ@pÌdqVÏ·Ù«Â|ìÜŠWqëš?¾ÅÊXJì^ï­Eú—Dí®c -™Yæç+Kc5 %ï}Ê«=6«J—h¿ ^¦÷vXïJX€FNŒ¦Ê„™Gòe( N´™'¦Ó|¸‘˜¼ÁxXЈÛÌ(ÏKŒŽì|C­â€EÖ]!E„ëÉÕ3—…¼pZzÐUú~›VG°5+•aÒ>MÄü.§icî\däeÝmSa ot¿¨l³‰9.7v£ £¯‹­’ˆÖXÔ^ŠQô±~:úáÎÇC”h:ã˜rGÌyÞ— C2rüã­è÷TæךÀ‡Ç„©Â9å†êàüÒŽgÏÒ~³êžNn²¡-h®ûÔÂÝÔÙPX_“D£'¬_÷œÉuƒ3ôã•–ÑZ¦>Á=;H"û‡9 äFd]ÖFçiöŠ6ètM‹µ¥¦io+þa•hÅ7´n¸nqlóÚ6“F®³FG{ºbbÙ&{ÞðzÕaš§™ÅÐåÿß¼Üu¯ªoVÝ« ›zGnÆp¡€EÁ[ïýåøº²yjg¿[OüõìÀÃ÷Ú˜\k»$
+í´n…ßÜŸÖã½ùß÷«eAÎ_fKúXñ6ìvªÚœ ³9æꉻï¥ôtQ\móßC¹ûΕz÷½ˆË5Îs;·Ú„ÿ÷‡ Sì^k\¸¹ˆ­¯’ïaøþ°•[Vê²ÈòÚÐÇ&,ây+½gÙý×j™Öv†þ^ÑXa_¿0ÝëÕâoQ©“dþ¯žqîKæƒ8ô]A¿¥ µ$¿(†(þÙ#?ëWXå¢Ã!j«_®|Xu˜gæ¹èomoƒ²ûEç•öðL÷o9éùoÁ~%Vá+³Þ¬Ž²ëüÜ(س¿wç ³2//zãÄuv¡Üû‰“ÙlÞwPí-½{šù‚­ÇýÖŸšwîÓú}NîØn`w ûÜ•[} j¶Ý73Ÿ:Y/ÒÞdÉëöïÇþ2Þ µñÆÑ­Ñç_—r½’´½«ÔyÍ|ss«ã ¶¥]ª<<sT6½2ü¯–æÀ‘X´ììÕc}Ú§Nù}áBgxòŠn– ¯
+7¸&ì
+8ÖÝ}bb²T‡à$æ*Û¢£qµ‚­ ¿ÌOX/\/àðyêÉÇ÷Ûô‹LMάx³yÿ|s«GœþmOf'gÛ\:ùí礛!ì_õmÝêÍú”—¿>5Ýæôi®U¼Z2{¬Nq~,ÙÚ5yýÑ&,•_ã4ÏZÈ
+ö™Æpþ1dM¶,˜7‘iϯc-œ„.ÿšòÍÚ¿+#eò䩳.î øfÜ«W¤Æ4Eê
+ÿäþÓ|‚v\É÷švþ:§Æ¨v8^nù‚«&¾?ï9 &‡™Äžíûý2ÏÑx.ËÍ%¿vûµ®2kg/O™öêù£W/
+'̺Ûi-"þî¼ûÁm•—žÿ)½ùÌ—ù/ìÖ¼y¨ø†ËsrÏîmÇ« Y²e–un8zRåð>›½VŒÏ¥d4“„ºÒ¾qFܸÊk¢ûG_k7Å[lo<Ì8Q2ëZú„lÄ«27›9.?áíTž&u{Ýï'
+9¾n~Î! 7çÌÓø¹V±KïÕë»èÙ»?#Ô¦‘ãñó®Q†…É9©‰E%ù¹‰EÙ\
+endobj
+453 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2943 0 R
+/FirstChar 0
+/LastChar 127
+/Widths 2944 0 R
+/BaseFont /WJHKND+CMR10
+/FontDescriptor 451 0 R
+>> endobj
+451 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /WJHKND+CMR10
+/ItalicAngle 0
+/StemV 69
+/XHeight 431
+/FontBBox [-251 -250 1009 969]
+/Flags 4
+/CharSet (/Gamma/Delta/Pi/ff/fi/fl/ffi/oslash/suppress/exclam/quotedblright/ampersand/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/dieresis)
+/FontFile 452 0 R
+>> endobj
+2944 0 obj
+[625 833 0 0 0 750 0 0 0 0 0 583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 278 278 500 0 0 0 778 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 472 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 0 0 278 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 1000 0 0 500 ]
+endobj
+2943 0 obj <<
+/Type /Encoding
+/Differences [ 0 /Gamma/Delta 2/.notdef 5/Pi 6/.notdef 11/ff/fi/fl/ffi 15/.notdef 28/oslash 29/.notdef 32/suppress/exclam/quotedblright 35/.notdef 38/ampersand/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright 94/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash 125/.notdef 127/dieresis 128/.notdef]
+>> endobj
+449 0 obj <<
+/Length1 1636
+/Length2 12665
+/Length3 532
+/Length 13626
+/Filter /FlateDecode
+>>
+stream
+xÚí·UX\ÍÖ¨Kp îîîîÜÝ=H»»C€àîÁÝ5Hpwww‚Ãf}kÿ+Ùk_žsužÓÝýŽª9Æ;GÕ¬§›œXQ…^ÈÄÖ nkãDÏÌÀÌC$"§*ÅÌDÄÌÀÄ$ KN.â
+FSöMìF!¯AOÆàEäAx4êÜ4¨ ã]}Сì^DëÌðƒ%Â]»&Ú‹eÒ» —Nˆ*Ù#fÎ<ì³ðÒ…ù×Kß±Í%¸Ò½$X½ì6ÙD€úáFÌÈÓ©„m¾íRá¦nÚêÛvïÚ´å*|*÷·l9°¹Tþ&j7Ó­1XætKÂ%Í,nÉ÷êúDb†_.óŠ©‹òðœÅÅö}HøÓ¨œß‰O9D ²N7ýP­weИœ-¼e¬/Ïï’Ƈ<Ý
+aÖëÌxÁ;œ9d¢ãyú7kZr8Œ`o2¡VÇò4Ëà5›;"øe„Pß ›6
+÷u—Oã^µêäW—3®7-‹Xf*—aÓÏê¥HaäÎñ{[ù„áóp«3•³(GVcúKóÊË7ïg nÞå¾¤‡¯,¥~0Ç[džÞ‡¼¼»Ö×áÁ)ïúVE‰Ì4ç›fœþŒ Ô+[W_
+NPj5?Ö¯Þ-Ä¡à?ç]Ür¡_(l¼I^]Ò$ëÒ½oêlðîuc9D—cš, Bnx»Dž O4,ÕÛ%˜Ö{¼Ê$/”׸\øàvŒZʉ·‰§ØiP/ïd ‡>™¼iÿò®m5ÁtáÙn—FÔ¿…âC¯iJìzŠýÝH`ñr|uÖß’6Ó¦ÍIÍ@—àŠ=`L ³¼ÈD¿«¤» Ïz$ÚÒLþ˜"6ÿ]¿oÂÛ5KO÷s˜ÒÕB;ê›}pÂòÍ.•ä„ IEÕ·Ë}F
+\槴³IS¥S$ƒ;÷•_KólÒ5¸ÙȹÝk:W`‚n$Œd€iÎŒ£›çÑdo~lO…©f}žÙm´\š6,ÜŸ3í^K²å *ÊE¨vÂèôãî5)nÆ¢à¶!ó4#^ܾå‚É;bS¸dêp”-ªï|"NóQ†o¿'EÇý´Ø%rrwÚ!"DXŸ Z P1û¢*©„ dâ¬r+mqïˆðdÞúÑ–çÈsJ¬a^Xa®ƒ:˜9FÏÕyÇÌ©ÑìÞ!ÂÌ}ü#F¨5§.l"©‹•8?ûÝ ·î
+Þa¬­…²)}ÝìrœuÝ€‘÷rÉCÌáòܼJ†õÃÅÈ‚]àyÔ A=[‘ÍC'~L úVÄ"Ú“ wP·LùUúÉžÂvZ~ i,ÆlËÈlNø*5ÎûÑ0Ig5. ÿä·
+§^GwuJ›Ë'OX¾–¾"Æyä<q‹UŠúü&ë9©S³ï;41g³ýÌš¸…£/$ä1’Íî°ý»JiØÝ „%­,Eïß—ú‡7s¼v-¤kØœ©¾Õ6I¦hµßvH=JèX…Ø^¢WÅ­µª>ô²‚#îTø/,a»l¡`å!d̈š³kSL9?2%ÅZez¹YÓ¯Èw®ˆÚ%æuZËóÄ,ÆCßµ@gSÝTËþÍKý™“ð…ˆ(ubGËwä¼¾D±ü<íaý«+‹š”$=ÉDbnê’ií28ÏŽäíúð>à¥#k©µ?%—§šù…¥Z±.ÒX\~U"Û›Ô÷.ÊC«+¶Ø“-Ô€Þßx¡«Ãð
+‰½n¤¦å@ [´ìZ½Ý|þj¿©¿Y{¢þ.…õ‹ÜåQ
+Ù0‚ؘ—Fí»]WuòÊJ;»+£ ÆÂùñ'õfBkRÔd‡Ã­-Z•µ•5‹XŠè,ó ð8ÄT¢4ÉÇ">§ŠÔ>
+Ä<á‹Å@šµg‚9«]†lºvS…75ûzE4Ï©’Ku@f°'m'›§] TÝ«[_„\· F»j—
+Bÿ|bt~‚;õåFl'µ3Ȫg+sŠ¹(nñTÀ,>.þ Š
+gby+„R~‚„dJ{Ø0gÖ…QPÀCˆû©Éóº:Ï”³*ƒ:Ç*ŸàÏö) _6;1´-p†Q°®'¬üáõ@º×ên¹p„Gb™¼°KpÒ½Ð_Ð6q¯ºÏ»EatJï?Ê×’Yïì]~ø®¨ë6ÉDz^Û©žµ"±~û0ÊÀ÷Sž<žØUq€éZ‰1dBÀÐo`âWÚò¾^)Z³ ¬~RâÅχ@±ÚÇ¥Ùùó4ÅÍÂØÏÇ`ø’§Ú„"ƈñ›“Å0Y¯€ž”û@ 2êcƒq:€ô¨ßgþÂlgÁ§ˆ Ñ~fQϘKHǾúòåg¹jŒä;qÓQ- â¤_±]óØâ¿$¦È $”~,VæÁ+u!ìæ©++Ônèöwš¡DãÇ©öË™!uT¼ÑS‹Å
+{ãJ„YÃZ»ã?iî…aá«¥ƒ‰à>¶/7çf«FA¶f–ÀsóìùÝb.,˜Εn¦ãÒ„Yaµ`ê%£«—ŽÉø³á t¬†vÿ
+cõd:áƒ1íŽök±õ‡q¦‡)äׂš M—ƒ¯ÜÞgI°5¡L¬›­IRSUí_á…±Þg2EXqt|bv²¥îenˆ<S.‡Úø¬§™ùƒ“ãÙx¶Þï\Œ'RbIŸ¹çÊK‰ÐÕýÊÞóÇ
+c¶•x‡(ü<‡{'ˆV3æIÅíÝï×Tà,b"x\RCd±¾î›ð¨ÄûžS1(¡aè!‹Ó°Ÿš01Ï#6ZÆÞó.£4öä±´@}ÄGhXH£´àѤŽÛéÒôÓ1Èf&8Ò¯¦ÙéEl§2­›dªûKG(½”w®dyÍÕü^"ÀñTî´–CÊÉ?b/¯Ë3¸â«Ö
+@BŒáÆ:¡qD÷Ѳî•ÎpðSÐðÌnSlÙŸ÷¯Qå¿™
+]¯£ÊÍFpÀV3ÂñÀÜ ñýØ 9óÒAøÉ3˜Š¯~UIlôâŒo!øíJ›äî—TNT›WÎ „
+cVËÀ K¿K¶µ6 í«ÃÆuC5à©Ü%îÛ¾bÜ1ˆæ&ªsý騽jrþ9Zj+»R²¦/ù§²¯S8IûóÝï¬jlSirI§REQåŽX½¬áN»2R­{pþë-Ã:Óv¢ºEøÖALGa”v“É"Ÿ¾ÖºRL²âcxYôàŒ)>¨
+Á»~=†Þ r<Èóœ|†Ÿ~E ðEGžæ”+¾ÆI©üÞ`§|Âò¹–Ÿø
+Ú íðuÄ?ët¹†#ÀôzÅ›‹áTnæÖÖ™ëbïräÁf>´–ŸS–%}¢¾ÿ(i§2òe4Rø>Øñ ™ÐMË}ál.Èçí9Î# ÓL|Í›&Øtgë@ºZ“¯®çV+·€Èn÷=3–''ßB}â{ƒðž£}°5{à Á©í„ÿr;ra¦=¬55ϳÏa©€JµäÐEœÄ‰|±´ÚC…£þ€ÛÌ—¶Ä—åV·+qØ- N¢C¾ÚL'nAg•¨]¬Õ¹—QŽ`Ú­ò‰<¼%Iaø£UX¡nÿ«n¦þ¨TìvªÇ6Zq|¾¶ÜÔ4g©É"¯E‹7Õ$üÓ+üLNEZ[9³í¢u© ÊPÑK½Æ·#›©lWž@O|Åw\ ÀzJßmq…¶ão‹.?ŸµÙ)êcaÜ@ë£= h;û¡ò5Š²¯ÕÖdÓò%3?z a—®Õr¬·{‚3–i=»³ÎnÓ¦rÖ¥¿¬
+ó•¤ï¨njÙ}=Q¶~Ã>!â;ü¤‘z䀫…BHuLXG«ÖÔ\~ôÙ´ ®Mzdn¸ååˆj2n&`rÔHRÕ©‚E®ÎðWù›«G¼[M„+df‹
+Ú*œs”ù›áEÛ#úYlŒÐicÁñ½O‡ÊO¶6×øêÙJ ÔzXÏ6åÔZŽW7U¡Û™Ÿir±[Úè¶m‚RàçB NâI+=Ëï:äÓ@KŒµ0Ç£‰µüJÝ8m*æé‹aœwÎAóGˆý—SFƒùª’€{õ®†jjCl„•Ïa+|©í=7'y“š"k` ¶†iµÖçœ4&l•¨ž¹{4és\?N°!´s2p))ûûÛ%õv8…´„‚#8'oŸ÷fͦ‡ÁÈ6Éœgˆ™)ãŽs׌6Áç+<³®MùLájŒ>³/òîD¾ˆožÙ/ «$E¯NÃ+übwb·ë[žð… ¿ûÌèw/{>‡E\².ÿ,-ŸeW®Ã¿=áB“¾QKyBWâ×°†_PLžyä¿"®Ùn¸‡Ü•ÓhËÎÂùûgµœ«¨Áµ€ÍÖ©X”-ØYYQ®˜¿_:s÷à ©ÍgUÄó;¦s°út–GOÒ–'nfïx¬Å
+¡r-åoI–ËåL6ºÌ_Öÿ%1ÔI‡2vï“;«Ÿ ‡ÞÁªF„mžÅè…œkl9¡qÝ4M¨X]\)bîy„’TÝ´uÛŸF=øìÙyØSŧœB(vš¸Ç%¬<ý¿p“ìÈP„íi'ØS’Í_ÒýeÛ•/2_ÈàæÎŽ[Öy<‡ú½ /ˆèþº9G¬àŠûQè³.8ËqÈ‚=/ÞSeO;þqÔTL€ý#¸F·Ö½~>cÀºuÕ`Uöø†TÇ óÉ›ŠÆÕg (¦œMi”±½s(›i'ä¹v‘½7[H?dŒ|À"”¤j'.j
+FàÄ)èIÂn3þR¾ûŽY˜k}Jm¹»²‡\=Õ^RZ±æñ[ãaprN×Õl„7èµÞ’Z©Ù­Ò¹w™2nÊ¢7œLäñÚaG¢sPåç·1#FXË•:”ÜŠý<ú±>²>f|Z¥•(ª›ÜÓ|‹­4HFËŠ†2²sâáP`Ð[4ÑšCäÇÏ
+:Émðw½:k½åj_ݬÂñŽ4RR¡Õ¢˜8¯›aA" Qûqb‚”ð°zר¨´gf§É'ºÌéóšŸü+­ ºÂ@h\pRy£¸tètÅöS¥Ù:%==P”¾a饹¯Dy‰»±Ó“À}ÿ–ÇŒ€ŽqÒ„ø`N%dÝ]–ÚNÓŒHz†ãvÆj‹9­B–µ•DCØ翯º\_ §ü¶þnlÀä~‚àw`žº"Ät7éÃGrœ’ÇAÅýTžÚOUÔ~ðí¹gMäh¹ê8;YÄ8ç€"[²­´ÈÎ%s½ÿÁʬ:?ˆÚNçj‘¢ %81kž’WtQn•LYÏŠ3cUþ{> ªy¿¨ûÓ÷µó.cmtNj¡m.1>Vñ™‰Õ|ýX‡\BIþƒ¼Ë¸R^6,yÐ6îö„†ˆ*9IwöEv>Òª ¢Ž4v„‘ËaUkHk‰ÆïJX?b¼/ÜQÇåÔ$`¾êòá`Zm¾Znˆ.@j4§1¦Ôp#ç""iö _>ƒv«&ÏÿFÃj˜ïtÄ‚ÝWfƒÚiD)lû0nƒÊÆ™è¨, Ñ5Aš ­xk€[
+<ÂùÇÀ«{}Áàv®›¯ôúç†6zi#Z²ŸßóË@“"Z‡:zË @°îõƒÎ'–Éw‡2Æyé÷ðLàfI|ÃU©¶4NÀ|ÉŸ#e?ÀišÏb8A¾ƒ˜¬=öB¥HVôó6
+»¼IõEêɱCÌ=ͱ[C¢*±LþÑaŽEâ!®Ât¤¬½Ós>‡éN1së­€L äQ¹së»näänDÂEÄ-¦r…׌ϸ —Ë1‚ÓŽ]’‘+†Jã ÔÆ|탩|EmÇ+È!»óä
+ï†â#ÊEà^±¥æ²Åž×S‡òuŽù¶T}Hh@$õ؉ÍÆ›CÅÝ[8\é†>·&£“Âû»£.|Œ#ðp9ÞÈ¥n*¨?odš&­z™vƒkP;nkžq»P£ã“Ô:Qk8Ź`ùq"DjBjÿø.Ýz¸Û»çoAY:ÅYã,~²$«^u¸˜®°‰«Ff¹¨ZC8Òq‹킼hŽso46e*ŒJ+nåµlcÒTü0©Áýçðû¢kÄøSé™àcqë4xÕ&Qhªi&çÇüPReÜ5p"ƒ„WN2ÍA0±÷úÅþ‘ßÓ"飈ä9¨Q3°¤¢1sH\ç\>ßc÷µöé9uIú~ñ³ícyZY"Òç+ÊÜŽÁ¨`ÏË€>Ùt—ùº=$HÕ»äîƒ`¿"%€üF^»ú6ªËþ>øì$P
+Eüлq¤mã{‘c×2ÉO j«%‡—ñ+tC”*w6Z€|ŒO‡ò—^‚úä¹­¿>ãSå.A¥KlW°vØñÔL‘µ¿oc²Œ®Æv`#˜­RÕ­›°‘“>u#ZÇð[iC¬ˆoÜ»rjo\…Æ㯌ð<R sYŒ– Íí'ü.£oÃAš ñ1}ÍÁMþÖXŸèÌ~Y†;ÏŠL,Z¬¯›T´EA¿¤;ë¾cÞ/ì¬Bˆïv²u=Ï ãæNC½”¢-ej•¾Á¿§ vVi²»ÏMÝ5h¡À î–0¡u8<WäQ}i(ýÒ8¾R,{µ]2}çàA#|%R)ò{þÔEßSÅòV}â]P¯~32ž¥¬Å£7†ÄL¡á †wVß6õp¼§ùVø ý¢‡YM/ ¾nÃ*¨ø8„¼Q}ý†cgQâdìÕõé"à5ت=Kn@\‡F¥Ir‡Ôëøë=L¶êœñŒöa{„hN fC§°OÓÃue0‹ViË
+iüê Ð|CÈOƹFxñÀ¬·PfZ Ëç,H5Ȧ¡â/,ò(SîGµûB _KvQ©ƒ‡ÞÑ¡þ Üp#þÝ9œ4Cp®ƒôž*¼¢gb9ˆqÀÎÁ§RôÈÇmLi*©¼½Å[n†pP2_©j”J´mê\ÖÚžæìïâd=°aÛjðÚ„+¼ñBîóù6(ˆYŒ®°Jv§Ö1¨ú“ê8Ï×<Í;ñBlÂYƒjé5Ñ
+ú-\üË‘8ÑžÆ×6¡A¿Ÿ.¸'/ÁUƒ‘JÞ@¸.[2(‹E>
+˜lYÌY³‰h 1MÕcuõŽG=¨ÚJUµñ‚ÙD‹/Z/Ò{Ϥ‰$™Ã &«@~‘’圣 ì+ö÷4ÝᲓŸŒÅõ‰%eðnrÄò˜Ä‚Û^óŽ,á„ï;߬‡>¿U Âs6,Î<LúN•¹$}7[×®ù|¼ŸqtŒw="«EŽ´y†Ù\¶ûeºú"…GO…h}óJÎIñ{&^Æ‘‰®Ú%ƒZîÉ\¬ÎðûMhïÙUnŠ—È9%Ný&ˆtwÝ ½3=âhNk}ùÈ
+£ð«c¯‘Ù.ãÓyÙîž<ìIÇ´4ZÐëÑ<éö&‹ˆAñÕí^aþ£½ìši»¾¯¡n{gO5$Éwߔڢ• -…6âÂË€uO½"oIÙGáæò¤èaNŒ‘dLf’†£” óÝC[æ­tÛúã—$․Ûì:z_lürà”8³ŽïŸë ¦×=Xº0tøÌ_¹wƒØºÇÏ(îv8{u!A¦„ Þ ‰ýJŠA&)ÐZ}d(9 E¨ôšgØ£ÛÆgÝ’‡ño žPáQzI)ô‰é1
+Ñi––»‰›Tú´VÛ%©tÓ”õ)fR3›Úó÷ V'ø·3›·Qƒ‹ï/ùGÇ_ œÊŽjFû ùSb·òÙPóõè2Gé¼÷–°¨oŸ’0VŠç‡¡ZŒš¶w²¤Fbƒ×2”ÇêS “Ä‚¬g-+ ì.c]lüñJ\ÝÅç
+ÿphxÑ#€gì¬ \pÁ“ÜV¼JtiàìÜÆ\ë–úÂe'ó… œßÁwoOây_Â4ØW¡ðʃ[Ëg†/I¹Äì'ç¾#ó,·ø¤ä'”DÕFí&©hÜjËßíÇa~£ÉÝ'Í
+Ö›¬d¿_åi„Òí(š|Òw!Ô¼Žj¨Çlhõ ®ÇX 'N§{ÃÍFñ•üy–ÖP¡ Ml¹2E#Y“îÁȱ
+«ZdK°æ~«\SÄqìØY…4H%Odyº„âÌ&GÄøã¾ÈHaÑLÂ*¯ ìè9yªþ3tâÎ#Súf˜ÆçtŒó[AœlÅh T~ªV$À~‘6†Z8À{²²xÅÎeaÏËå;íådÍàÝ[¿0ÅM²)¯É¾aö|€fE$!ÿÊ­õ¶½®Á0Lvlt·Gò„罜9”ï>NÌA>Ž¹®s³„MÃá£Í0ba™\¾§_¢ÑðåÁ šj;¾¦\ª$#o,· ³åoÉ׃µ‰/&³™ÛÚ7¾é8\aÛÎy ÏÔ®
+c¿¿™ýt_])­0 W_w”Æëëið`¼.›¼w’ã‘¢Œ"¯g»à—’‰c»âðìí›cvì³±ôØPßDOÓ×;E öº•2-$àúÀ ±Í=lÁ×^”'ùµ=4îVí~©{1 Ý¢¾ZÑ:…_Ár‚°F²cè*19ødþZÚÎă9jŸì'–VfŸËQêb‘ ðcè&ÅÚVz“ ì› £H¯Æ×S¸ÄÝÿÝqo T”ôšÆ>¥o C¨´¿¹‡œŠ±÷v “·!$µ:V¢ÏŽàf¤¨aùÅì¥`¾†æÁ''‰Ëv~;짯jmÚ@ÑPžù'˜Yn40ƒ W÷¿˜ÑMh䉢 /ÅÇ·„woäÅ‘j¸u4¡mªÛ®–mFUfr¸£‡2‘µnKäŸ}®%úb‹HØmË‹k’ù€®e1µÏ5·CVöž‰pÔÃ2r0¡pŸ|ãŽE%½U[p
+± ÇYe Ðûcìý¨ÐÓ…TU×™þ¾`ÿÿÿŸH`l0tp²µ6t°„ý_;Î,¥endstream
+endobj
+450 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2945 0 R
+/FirstChar 11
+/LastChar 124
+/Widths 2946 0 R
+/BaseFont /GSKOVR+CMTI10
+/FontDescriptor 448 0 R
+>> endobj
+448 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /GSKOVR+CMTI10
+/ItalicAngle -14
+/StemV 68
+/XHeight 431
+/FontBBox [-163 -250 1146 969]
+/Flags 4
+/CharSet (/ff/fi/fl/grave/ampersand/quoteright/comma/hyphen/period/two/colon/semicolon/A/B/C/D/E/F/G/I/J/L/M/N/P/R/S/T/U/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash)
+/FontFile 449 0 R
+>> endobj
+2946 0 obj
+[613 562 588 0 0 0 0 511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 767 307 0 0 0 0 307 358 307 0 0 0 511 0 0 0 0 0 0 0 307 307 0 0 0 0 0 743 704 716 755 678 653 774 0 386 525 0 627 897 743 0 678 0 729 562 716 743 0 0 743 0 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 307 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 409 0 1022 ]
+endobj
+2945 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 18/grave 19/.notdef 38/ampersand/quoteright 40/.notdef 44/comma/hyphen/period 47/.notdef 50/two 51/.notdef 58/colon/semicolon 60/.notdef 65/A/B/C/D/E/F/G 72/.notdef 73/I/J 75/.notdef 76/L/M/N 79/.notdef 80/P 81/.notdef 82/R/S/T/U 86/.notdef 88/X 89/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/emdash 125/.notdef]
+>> endobj
+2947 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xÚmϱnÂ@ `G"yá‪+l‘HÍ€T&†ªSaì
+endobj
+2948 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0b3S…C®B.S# ÌI$çr9yré‡+˜qé{
+endobj
+2949 0 obj <<
+/Length 163
+/Filter /FlateDecode
+>>
+stream
+xÚ35Ô3³P0P0SÐ5T03P05PH1ä*ä25
+¹†™ä\.'O.ýpSc.} 0—¾§¯BIQi*—¾S€³ï¢m¨`Ëåé¢ÀÀþ>0ðƒ¨h”<DN¾P){ÜTênŠñnŠù„¹J5@¨/4@(ö`•PŠÿ
+«¿¨ã½e¡¸\=¹¹
+endobj
+2950 0 obj <<
+/Length 284
+/Filter /FlateDecode
+>>
+stream
+xÚ]ÐAJÄ0à„,
+ÙôBÞ´­ÎDw…q»t5 q¥.](º“¶Þ¬Þ¤Þ Ë „Ö?IŽmò÷# ×h}²ZQIšŽ+:?£uEO•|•Zc±¤õiÜy|‘›F;ÒZ×X–EsCïoϲØÜ^R%‹-ÝWT>ÈfK,ëd>x #Ô_ŒõÀT@×/˜ƒ/O@óÖNÈÐ:_oú®0Ù„p˜|rÂyÔ¨gŒcÜù:ø^P't_– ƒß脉˜p·@xd#^›¹I„Q€£¦îÃõÓEp;Ç ãûÉCõ|ï˜o¥g³M0@ÇÝèÓcHèÄѦÄ8J`‡pÈÏ
+endobj
+2951 0 obj <<
+/Length 242
+/Filter /FlateDecode
+>>
+stream
+xÚmбJ1à [,L³yÍæ$§…8Op A+ ±Ò+¯P´“Ý<Ú>Ê>BÊaq’ÀÝ.X}É„Iò1—W×ÔÒ–.4m7d4}hüDc¸Ø’Ù”“÷#î:T/d ª.£êéûëç€j÷tGÕž^5µoØí j
+endobj
+2952 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+xÚuÐ1NÄ0Ð¥ˆ4MŽà¹
+ÿò“¨ýyÌt8¥Çšqá¸F×Iëé:iJóÎfF¯_5¨9ù”_Š¬–`)9ΔcÈᦠt;Ð#ýZÅ\endstream
+endobj
+2953 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+xÚ31׳´T0P04RÐ5T03T05PH1ä*ä2±
+%E¥©\úNÎ
+@¾‹B´¡‚A,—§‹Bý ø÷@Äø00 ’ò ØI{ìdòv’ñv’ùv’ývÓá”8ßLÊ€.WO®@.
+endobj
+447 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F33
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ 0 -1 93 73 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2954 0 R
+/Encoding 2955 0 R
+/CharProcs 2956 0 R
+>> endobj
+2954 0 obj
+[55.37 0 0 0 51.68 51.68 0 0 0 0 0 0 66.44 55.37 55.37 0 0 0 0 47.99 ]
+endobj
+2955 0 obj <<
+/Type /Encoding
+/Differences [97/a97 98/.notdef 101/a101/a102 103/.notdef 109/a109/a110/a111 112/.notdef 116/a116]
+>> endobj
+2956 0 obj <<
+/a97 2947 0 R
+/a101 2948 0 R
+/a102 2949 0 R
+/a109 2950 0 R
+/a110 2951 0 R
+/a111 2952 0 R
+/a116 2953 0 R
+>> endobj
+445 0 obj <<
+/Length1 1072
+/Length2 4278
+/Length3 532
+/Length 4989
+/Filter /FlateDecode
+>>
+stream
+xÚí—gX]·†A@z¯RdT@z:(¡ISé¤ ”’€tPi¢DJPšˆtD”¦TÐé UŠtAàDßï{õ¼ßÏs~ëÌü™{íµ×óÌ^{Ïuà9C 58Ú¡…Fá$ ’%@CÏÔ"@$Á4‚‚ ‡D£®Àp%
+Ѓá\žÄN0Àí„Dàü%5Àøç ,`ŒÀ"0¾¸$ À‘N8Àá‚DÑ€~:ÒE9£ù¿Âp¯ù"0X¢)@˜hR Z„£Qþ
+à0>ˆ_a
+þOÄuûå
+`
+QRu—W úu´w†z<ûpÍ[t²Üò (•abÿælÌÛ £n­õ[Þ |Ò^óXn¥éùÏ{ß»³Âø¦úãΪ,©AÿdgA’Un ~£u%ËPøŠé"åø9’&ßʦôp9yK­4³¨ˆr!ésÆL½ ¢e¢&n2%=$Ÿè¹âEU#6¶‰~ëÃrCõ4ñØž ÞmîpÌzBú`‹ÏСífhç³ùἡ›8ݨ§)S1)«õ?¶‡Å¸ˆq4ºÏ
+ž½Ôi•~Àà v8h©mâ5”X`%˜&”Z‹JéQÕ°‰‹¹¦î¤ñYsŠm>Aøãtw•ü¬ªÀB÷ôrÚ>YŒ”ÃSÙØÁ²1K}QÀ¤HOl-õÃÁ-ÌÔwvìvlú·ÅgؼDV%›tûyØ\¨jð.Y¢­(W@ò^¶-[|Å»êB)÷ÇâR­å–.Qg?Uı“@r&ÍïÇÊCòý—K¨_ÜXhÉif 1 s’ïòåHÚ„¸}‡JŸ„Ђø/ÊèŸXÝO¯=
+¨§‹ÝÒëlHÒ>õUPÌ%T5¨â‘_WÄÄf‹qí£5K»>ôjó¬hó@ÅJ˜Öø„|hjsÛ›¶fýFŽeÑ‹œË!Ö†l[îM½ï¡®UáÓÌm²ß|€žYÕ>j§f^É€}0«Ÿêã´ŒÐöUjÙ(ëbé?©¤"‘º5š1ëa*0zq¨æ5?(ÅoÚ’ßÓvÅêL¾F«d˜Ì'X^++ru?,19L‚Eê1×*<ˆ¥eñjÑÁ6“ŠO¢£=ËxO¯‚¾Ñ˜î}ê¾(ˆã£z=æyÖíÁþü²ðèx;kÄò…Lr»x9/ÙXæbH¯ "¹c»,BC£^‰e.²z>{ÿÅ•¿þØ®5°;ƒ°Rîu•4ƒí81óñÝ
+3Ù*/M£d‘ žýõ•uÇÁcCJÛ'g,âZYMºø[Xñ'á]½×Ä`=§îÑÅ57…{ÈìÞxgÇÊÚ Ôœšní&1µÓhm¨-tWnð‡Œöe=%U}æS¤*ý– É©¸b‚?®Jˆ+º4%¦3T»&ϲŸMýÒc­ßÅ(Ï5•=d8}ë¸È§Pþ,K"Žà7È<Ï–¹PÔ|Q½'—æ’“û59GÊí'º-FG[6{.¦2*IßMkÜÕΤ9LœÞ\Ãë®'¿y®Ô. ê!ͱ0êëáýL8¯’á½÷ÜÛKC†N"¦k¡ ‹áÛmKôºÇ!CÝ7l¹SSÞØ\¯9$½™ˆJoKáì}û£ÒÊõ‘„ªdNB/ÃâpØ»9¬Ý¶Z{ÿ.…9aH‚–‹œüeË
+ÅÚn9«ó’¥Ô»w*ÒöÎŒW‰¥—Èwà²×••o ›úÉ?ašù.éÐô=-æVÈ>áÖ̾5,@˜ÁËØ}Òº]ˆ¡
+Ížº{is-=tÁبY~(€;²#§æÝÀ¶2÷ý ž‹â´ô~œoVÖ²W7'»’Ñ—\Ð{ÑõE(¶}›×gD³x'¯Eûaò¼ËD°)¥Õ)y©ëÙ¸ÓAL{¢²]½
+|Xf] A-èÁºl"Ž¿}^XÀ>yòVç6Mäê\úQÿ²ÎŠáu‡ÒVû2éµèÒ+eìŸûnÞ¡CAÇÿÂì;DC¼ôÖÖgeÏÈð<¬]8NËJ¥ä%#ý¾)nÃYc×Á<×ÜxßZ½Ã_ÁYÉè:X…–Ð}“qi–Ðñç7•é†-UþíFË^#¸þ“ª-+zÛTî^ÃÊ-'·K×?eh¶¬jÀ¥=•(òê9ßÉpod—s™à"$2\Žq‡Ìيуd¡#t«[Ъ lY4fÈu]“%nÐad^jŠð þºE=VoªêEY/©t?~¢âÜÇEÜI€ÎœòhåÑHÖl5ÆwódÎMè£Ë§ÀTüª‡³Å\þ¾Ö&'ýôg%P2{¼å¾Hÿû/^Zjðl——jò´WfhiCÍ]!qæßI¢Ò„ªÙ´>o|w¿ ouc0ª^רJU#y¹qeÉÒî‘ùòÎiO…ñ·ã\Å*‡^JBî¾d-ÖßZˆô~I0çҪ뮳jL<<S>mÁÜô)ärvKÓÕù%!ef=îzÈDK÷w$Â2ÌKnkÒê
+- éuí"_ Ï—Ù÷/-Ê
+„?ççê¾æWnMC´ÃÌ>ÊÒ/]h jxÖ]=³Ú¨ÅÌwözëh
+µUY2±wŸ±]^=·ô$ïS|‰ò
+YDÀ‹›ž_W7˜Oò]´žáo1–~­q½Â¡FB—®«—bÒQ4ž‰¹ùý¦Ì[Kðf©ÉÞ#ûtÓ…~ÖÔ岊{ž£ú$Y¸Ù­+cDuã¿f ¸QØGo=…’!¶/Ÿžþha<—§h’{=Uô¥ªEÃM-&‰ÉÁ¨ ʆþ°}vGè$ßçìOǧÂÔ2Òç"yŠ‚Ýhgµú9‡‹Åž$.¯N«Õ°Öxöê[Äðö^ÝÝ¢v~÷ŠŸC§ãì†îKMeõ³ÍH0=™}ÛÂ$ÄZw3·ž*˜;aéëvm~\VúXþÆŒÉÃ=‹È™>¾ÄB aÊЫV¹[à×UŒ/ôk:¼h+cëôçÁaòa^eÎ$Ï k0seß±Zú3gÞ ”*Ĥõ:xшÖRÔÜæJ9çO䳌§ Ç›“BÝ¥W„áÄO¿³vQ0I@L}œ+ýÁ{ðÿð¢ùÿÿ'
+8y `Ú†q§ù/Òj endstream
+endobj
+446 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2957 0 R
+/FirstChar 46
+/LastChar 121
+/Widths 2958 0 R
+/BaseFont /UWWUYO+CMTT12
+/FontDescriptor 444 0 R
+>> endobj
+444 0 obj <<
+/Ascent 611
+/CapHeight 611
+/Descent -222
+/FontName /UWWUYO+CMTT12
+/ItalicAngle 0
+/StemV 65
+/XHeight 431
+/FontBBox [-1 -234 524 695]
+/Flags 4
+/CharSet (/period/at/P/S/T/a/b/c/e/f/g/i/k/l/m/n/o/p/r/s/x/y)
+/FontFile 445 0 R
+>> endobj
+2958 0 obj
+[515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 0 515 515 0 0 0 0 0 0 0 0 0 0 0 0 515 515 515 0 515 515 515 0 515 0 515 515 515 515 515 515 0 515 515 0 0 0 0 515 515 ]
+endobj
+2957 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 46/period 47/.notdef 64/at 65/.notdef 80/P 81/.notdef 83/S/T 85/.notdef 97/a/b/c 100/.notdef 101/e/f/g 104/.notdef 105/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s 116/.notdef 120/x/y 122/.notdef]
+>> endobj
+442 0 obj <<
+/Length1 1220
+/Length2 5858
+/Length3 532
+/Length 6642
+/Filter /FlateDecode
+>>
+stream
+xÚí–WX“Û·î¤J¯R ½½w„P¤«!„¡é½w©"éÒQz•^Dºô*EQD8Ykíÿrµ/ϹÚÏþróýÆóïs$O8Xõ ”lÖ0u$-
+
+A; ª4L
+1Ÿÿ¼Yük/5iã€À H
+£bý›0*п ˆi¿ìˆÑ±ûbŽáðÄ(Áÿ)çßÄœ ñÄ(#ÿ¿.ÿ@LÓQÿ@ÌFnÿ@L~_P#åý'þ÷‰TVFzù
+ˆŠD@@ÌY% aÿÿ»ÎáàêÓRÅÜ›°°„”ØŸQ¨;
+3
+è?0Ãþ¶uÀ|5`0/”èã,*ì˜ÖZ V8^†Ë{KÙîm¼nÝ»©ö;/ænÁ_i»ò.ך]–gR‘nánÝó¼bt‹ló3U?~îŸ>s½åaµ•éÓÌhvš öÞta»x±OÖÚ8}~
+©#a«„¿0¤àKsXj“UÀA›C²Ú^‰mw,Ρ¿žü§!zNÞo¯îÙ½ëT¹¤`ÑMtƒ^t½}úÆL¸ZK”„OÔ;üD¿ù®`zŽ§~/c‰Ü™Gˆ¦BèÄ9Ú+\AÁQû™GLQYÄÎ ;séA"ár¤·©í;D‰94+qdtèk_ÓLø;˜Ò´óÂÉ0|žä’TvìõR¤ S‡ö'„ØߎJ“_sîÇŽ1V%›ܤÇXl;wB÷T7T62ü«\$0৩ÕSŽ—ßÀ?áäS¯#«Û)7Êf£>jvˆ±€ÓàU©Ñ"TTOÍ‹O¦Ô=\T˜¨yô~ç°ê^Ü­Ìô%Qê¶ÜCür˜˜[­U-lrúfœh­]*ß$ÝdÞáW¡àºøF6«¹¢ÂÆKäu¨ïÌ!î¤Má‹]|äRLË5%úéÆgÊV†/ÙVñW!¨‹d.e)ºÇÔÜ4øÞ},qa+ÅRÕO–ù®pZÒ\CgŽßwŸˆí¡3™X,kßRvïgÑ•{‰ŽPq•$ûFÛ%‡ý
+{TĵÒKôŽ÷&lp°òCiÌx°FƧïäçl¯·ñûϲMA÷áÅÅ?×'ÈåËúl2Hé•xƉ۲¸{ P.¨ 4x5òL% •QÆ"à³  8¿Ñ}ÝJ*bËPw"’µ=55\¸s4à½N ¢bE3@IÈCƒAïK¢¬µ:^œyØ6™ÔkýêïÉ=¾“¶y•¢W³,Á\qzï¡L#Eq9d½ùº¢Q½û@I™r%R8B]Ðrêê>‡ <ÅæÉ9d&V…y­¯çóéæŽÞþÿsšn¹Å;cÆTÒ¥‹"8ijåÉ(\‹$†¯y1ݦüì”D¤Þ¨ÿ"öE„ÞWxÇÀéZùªP!‡Ú‚úÑì®íá´#<aë‰e²
+®xk¶@Ëny¸}e“Û2?I„¨ åI)ÚSxr>9j|lÀ;ö¯?ˆÛÅ }”9ÔÃvY°ê=Ä[³pÏàµi;a.Ÿ¶Ò×кÙ:âo ©/Á-“¥éLqmþˆ ö»º(tó€;ø“$W'+Tè‹È*sPþ¹†Ù¤õ¤Œ÷î$æÆ|náNzS1uK߯cb|…Õ;&4ƒ²FÏ
+W×±ëÌ Ô’B­šœ´ŽSLîiûm7úÕ;…BMÚ‹´™òšh¨Ö%¯PÝKäÇ׫'Œ×bRZÚ̦ïá> ì-¬aN›Ïi«E:{¸ojdz¸xs¾<KÑQæùͳ¢U0šèôÙTw!˜+
+=ãP@áÃxÅiq…Iš‘ÝdÊI
+æŠÝDvÈ0l¾B¿¸Ù>×lƒC3j±Ð¥ 7¦7™4:GåüCpI{æÅÁB£+ו©5÷{ÂÄ©e·®õµ¶S'/¯‹ b÷¢kC˜¼PèzÁÍl¬Šy¶a«]¯ui€€dç{ÛãݯòÆDzÕ+wôö”ßÈ·GŸº±ÛgÍ¢Ax/‹Û(iU$ínyh>‰ su mŠ*¼_ö`+vœhjhÚñ›>[­ÝHºÜE–fÑ|˜Ëm³rWýÍ´5ÚæIþ×…&@‡_¬IÓÃw÷ªj>½òówâ:kÀ!™h§ÑyÑy¿UëöÐå%¬Ú£®K¦fn ÎW/ºœ‘Ãö…âíÄp±¥ŽÏÅG‚±ïQݾÓxõ«cÁ Ë3öØ—”lX|É•â|\Ý®æó.QºtÅZÑH¨Gl¸6³‡ßÅ3à–Í Lñk;<¢ØÖª½—N§{ØÒìï™mïÿF.æl<’Âå)Öñ¨ûæ’kôÚ2íþ$
+¸¨†3Én˜Ü´oº¾8ªQ7ý²+ §º’íK·û¤„Ûâe.§ª*‰5x•¹a²›æâ?B¼Â– =´UÅù$?h·Œd°zªNÀ6ðÃ-…”p¨íuAN™F!¹ëîÃøã±{ÒGß<ògƒ¦7º¤¤êâFû2Žíƒˆ5ö/òïî?×,þÑ0—¡m·.Ƥ¢kOÛf·Ž=Þ2Q |b³®9àuÅ.,Ÿñ¹ñÂÛŽniÉ*u—uƒ³ÐýíäDÇ®SÁ[œ–gªªí­8çs
+ý¸Ê(ÔŠd˺û´“\Öh—l`†Õ0f©£“bçÀ˽–¥¼â‘ãóâs–ñÖ¢@‘Ð
+ÆdGvˆa1.læb`û
+“Q%Cd¬÷ßå¬Þ¸ûÑõ(³D¬ñz%.Š¦×íÍœ:ñ´œE÷³ëTÒ~8uQÃw©Ò餴L_©@_3x'ÝФºî*­¶Øù©¹`:°ÙÙ#³ôœ«¢WÉœ01®¡üD•Û@wA:ëRÏÌÝñäL»<0È¿Œ{v@ÛÄ{ûmÔ SÁƒ±ó<d“ý”ƒÆRPÓ÷®z×þRÞú꣌ÕusqÁÝYÕâÛ4‘œj U5ÜF÷“ë*(ƒÏ¿wˆD+˜fŠ3Í­{_Výh ¿•WxP·f¹?®Ïó¤»Ê*+£q&
+ëž…œ<«†Í´àÖÉÍÓV©wÓÈq}ݶ®½ ªå ù0ºÒ»õU†$VîOŧ¬Íptì¿M‘žÎ¬n&$8*mh¹™“€š¥sï¯ðYµrEÝ=¥Mr$N\(-ZßÍ>Æ>.ãëI}éZëùŠI§þÛ`¶œ©\V§= ;=gYZ•óÆÞø¹³vï
+dÊ/ž ~¢ï»ƒ—‹.3ús 㯡b>-“gmY‰}È؉l¬]»¬
+ìúãEøÒ~Ëx´F6ظ—F”÷G˜­Ú}!s¹:œÿEïO¤ÁÖÏ8¢Í4c·Èß™?Yœ“\ÚíÍŒIŽ<k¢m0U÷ß-ØÀâyn80|1J}¨žc%¨äî–â"Š"⶿lÅVe)¾Å¤:6 lH#k:¦ª·ÃÅ §H²â¥k>c‘1oP#Ô.Yt­MõÌÄec^´rºY`î]4É{©;]–qž!öþfœÑ=¼Ã[ÑbCœq›—Ÿóöy^Mg]>¿@g.WÆÜQîôò ²üꤿ¡ÍzøÁEåŠL«}ZzÕDpüþ<êôÛ)ø…gб@XÄ(cÇ@wïçáFý ~¹lç2ýî­øA" $š¬õÓlŠ·ô]=Ÿ/©PÈm‚Tq*|¤ÙøM˜g2îÙÇa©§ ©æ¦VIÅi’¢6{K‹û /¶3¬åÑ·bÝî|)•¸‰b>xë\K¨@®àfµ“‚硇›%‹r÷{ÚÖ‹i5ær¦Ãu8%'L¶Ø/D=k2”’½Š w4Ä,¾„UjÏ`s0Ü Øß›ž66 âõíºÆ2è
+»\ejœ®d²½öXQM¼|u5ì(¾Wöt§s{êþ«Å,žgÚ49æL>Âü'àæô
+ʦWNNøX|=7“”WC“irð2i{HásÛ '—ˆ"ÑNq]‚¨ž’²ÑDJ=µ””v‹·³WA¾mž¢*«ú#ö/=ˆ©EïpH`J
+t† œˆþ‘’M\endstream
+endobj
+443 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2959 0 R
+/FirstChar 40
+/LastChar 121
+/Widths 2960 0 R
+/BaseFont /LOFNXZ+CMR12
+/FontDescriptor 441 0 R
+>> endobj
+441 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /LOFNXZ+CMR12
+/ItalicAngle 0
+/StemV 65
+/XHeight 431
+/FontBBox [-34 -251 988 750]
+/Flags 4
+/CharSet (/parenleft/parenright/comma/zero/one/two/five/A/D/F/I/L/N/O/R/S/a/b/c/e/g/i/l/m/n/o/p/r/s/t/y)
+/FontFile 442 0 R
+>> endobj
+2960 0 obj
+[381 381 0 0 272 0 0 0 490 490 490 0 0 490 0 0 0 0 0 0 0 0 0 0 0 734 0 0 748 0 639 0 0 353 0 0 612 0 734 762 0 0 721 544 0 0 0 0 0 0 0 0 0 0 0 0 0 490 544 435 0 435 0 490 0 272 0 0 272 816 544 490 544 0 381 386 381 0 0 0 0 517 ]
+endobj
+2959 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 48/zero/one/two 51/.notdef 53/five 54/.notdef 65/A 66/.notdef 68/D 69/.notdef 70/F 71/.notdef 73/I 74/.notdef 76/L 77/.notdef 78/N/O 80/.notdef 82/R/S 84/.notdef 97/a/b/c 100/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t 117/.notdef 121/y 122/.notdef]
+>> endobj
+439 0 obj <<
+/Length1 1006
+/Length2 1866
+/Length3 532
+/Length 2559
+/Filter /FlateDecode
+>>
+stream
+xÚíS{<”‰Žä2Dn Ù>"!sÁ¸E–qYe†ˆ¢•>3ߘaÌLßÌÔLÅÊÔ¸T]DV»ëVî™sa6J.‰B…Ü·Îv\’ÚÎGÛv¶ýóœ¿Îï|ß?ßû<ïû¼Ïï}ßÏHßÇÏÜ™Â
+…ÜYL®9³D¿@À¡±(## \:‹é
+r!{
+à q ø0DA£p8€B'sP(ŒÎDa–y2©,Àæ#Lá±?Q‡!˜ƒ˜¶"&M
+DEaH,¤„8ùo˜úRÜÇ`ÀÈeù•)ý…#é Áï¬H6 Á
+28Ð
+1)_ZAÆ·b³×›D"8›ý¾×Ò¤3¹{lÀ~Î^‰qŸcdJ0ìÇ¢±X’ˆ¼Ÿ¾‚¿hæÆ$³(tf`·@(ä‚Dá
+-ˆ¼Êùó5´”iŒÖ‹_¬Ú{xäÄE®RÒ¾½;¸%òÝ“Ý~1tª™m5ÛŸ§ia[ûÊr
+¿i
+Úf·ë“ÀŸÚ ÊEû®Þz¾” ~¡³t?´ù¼Û óÐjïHpãB®÷8Ü×ü¾P¤¦ùƒ“Ž·ƒ|ÔÅÈÔÌè ƒ¸zb)Zæñ›“›Éø±á´<ÈëÔæÿŒë,lhE¯ö~’}A”ãgþêo.Æ]UŸ˜;R¹mÞ—Ö\Uh¬ìE1@ÇÇuÍwl.J¼¼U‰è˜ßkÏVIH‹K\Oxº?‹ªè£Á^&]¹ON+Ei:¤ ( 2®°÷X]¸}®"àÅƆ44%¼Î‰F ؉ªàÌY×]Ø®¦ÚB½µëä%;o¦Ú Li‡ž-÷’!‹Fh<GÃøRmûQK‰MAxðÒ­3ÜkUzJ-+=½3·J.î2¼‘úv®¹!f]wÕI×'¬ÆVùÞm_GõÃ3¹ƒšÛ‹³ÇÅÔiñÒÞ[Å€5Ôì7ëðê{Sr]?Ú©CÚµñ«SƒÙ¦â
+úÖ$]ƒ§„\33Çw)f‡âȤ¾¥Z ¯PØS4ë”R¯ïv!e«©ÆhÛá{²Ç‡v?(a¯go©* œp+Q˜½ÊOß´¯È'GknXž}òÑ™vù ÿìÊ܃”©bHܹ»Ji}7¿)
+R"&=k?Ë>Ê:¢¼ÇU«%$*ž~S—±°~øU™‹µÈ]`K‡Ì ß›8œŒoK™ˆì—ÛÖýÓR³P8ô|ç& bÖ]Zã•«*UOÜžäMz»Jw 7kC$3“ï)‹±Q ">77ÂHBè¸m¶ñÔóáJ½WE3Õ¯¯äÍã}Ëí†0¢‡oãQœéMIž™±'Õšg”­ÝqÙAÑÖ°ož--µà=Büû¢štXˆXØÒ"ó¡± ÞN9øïù’Š¬®ÙÝ
+ãáµÇÚñ »™Yï""Ïÿ²@o¶ÑI Ô½é+)ÚŒORVôp³heô墳Ïo‹ó|*ÉÑ;ÔPŸð}gÆ£ÑÓ‰Ç~xCՙ犒×s Ìâ¨èn/½7çsúbêdµýól6[øÐ-7jìÜnQݬŠÑë‘¿6²Èt.»_ƒ†J]¤.Ê[¾ÿŠz=­ùÈk³œ;Ér z4iÉô©ZÜ1óÌ=þ@§åSãGi9w
+)ºÇÙJz“WÖ¢ªuSœ ]Ô˜ªG–Voúî´Ž.iܨÄ€µÁ8ú°›TWw^ºú4X“äÅö|פGQl÷ŒM¦„L­IO½—/QQ®yx:¸°3<R¶eqß’íÅ€e·Vi=#_Bbšzñk‰å›|mRhªßšzôÙ:ÄtX/NÁaÝ›ºôí²´(/«@4iÎú™ãyWlü×ùáÚ}ëÐ%ɨDâêx¿Ø3·]Õööo4°ï8¾kläl2c‘Ö‘Ù¦æ9JZ|8F_Ö °è 
+©æ†ÁmýüüöâÚÉäšNÏeßœRÌ0^ãeêNKc[t7¦æÉjOOW]¿mà2ï7¯ÿ°0b€R§ë2ÈGëh2ÖoÛUâr
+om¹¿m<õH'?Z½Cû>¨ÿ üOsY‘ ú˜M?oendstream
+endobj
+440 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2961 0 R
+/FirstChar 0
+/LastChar 110
+/Widths 2962 0 R
+/BaseFont /WONNCA+CMSY10
+/FontDescriptor 438 0 R
+>> endobj
+438 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /WONNCA+CMSY10
+/ItalicAngle -14
+/StemV 85
+/XHeight 431
+/FontBBox [-29 -960 1116 775]
+/Flags 4
+/CharSet (/minus/multiply/asteriskmath/bullet/lessequal/arrowright/logicalor/turnstileleft/angbracketleft/angbracketright/backslash)
+/FontFile 439 0 R
+>> endobj
+2962 0 obj
+[778 0 778 500 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 778 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 611 0 0 0 0 0 0 0 389 389 0 0 0 0 500 ]
+endobj
+2961 0 obj <<
+/Type /Encoding
+/Differences [ 0 /minus 1/.notdef 2/multiply/asteriskmath 4/.notdef 15/bullet 16/.notdef 20/lessequal 21/.notdef 33/arrowright 34/.notdef 95/logicalor/turnstileleft 97/.notdef 104/angbracketleft/angbracketright 106/.notdef 110/backslash 111/.notdef]
+>> endobj
+2963 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xÚÝнnÂ@
+endobj
+2964 0 obj <<
+/Length 247
+/Filter /FlateDecode
+>>
+stream
+xÚ½Ò½‚0pˆƒÉ->‚÷V@'?Ltr0Nêè ÑY­Â#8:Ϋ奬Ú~”†ëýépÔ$ØÇ(âK2ÂaŒûN›É¾y|¿ÙaœZcœ€šó4¨l—óõ
+ªÐ´¸ì7Âè‚?"l@}‡~®Aײ Ab±A¹èÞ£˜Z4É¢
+… Ð´ý¡w‹6i‹P4 ¯ãö{øE½¹=».L_~˵4
+/±Ül“j*9wåÃ,ƒ¼
+endobj
+2965 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+xÚ³°Ô32W0P04†
+f
+)†\…\f–@¾ˆ –IÎåròäÒW0³äÒ÷
+sé{ú*”•¦ré;8+ré»(DUÆryº(Èÿ‡€öPƇzJÿÿ›ñƒqàÿeË€€ããn¦â†bÀĆ3bI´ð„ OêðÄÏåêÉÈ
+endobj
+2966 0 obj <<
+/Length 163
+/Filter /FlateDecode
+>>
+stream
+xÚ33Ö37W0P°TÐ5R05Q°°PH1ä*ä21
+…¡2ɹ\Nž\úá
+&&\ú@a.}O_…’¢ÒT.}§
+endobj
+2967 0 obj <<
+/Length 367
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Ô1NÃ0€áD*yñ °/
+ëÈp¼WdØ÷Ž ]ØÇ®¥7,Àç!§î™#æ¸uìªÅT6M©³›dgõMçÈ’-ö”3ö„Ù9¥yŠÐÌí0ýÜ;\l¶VÍÖ²ÞÚÿOÿá¿Þ¿ßâ¬Wâ]Õ¹:endstream
+endobj
+2968 0 obj <<
+/Length 307
+/Filter /FlateDecode
+>>
+stream
+xÚí“1N…@†—¼‚dŽÀ\@—@ "y>)L´²0Vji¡ÑŽ¶GᔄqØȘмÞM€/;;3»ìÿWùu‘cŠ9^±:bYâ[ŸP<™b%‘×85<aY@rÇÓ4÷øýõóÉéá3HÎøœaúÍ1Ñlüh‰htt e8Œökܯ¹ÄÐ#uÆD‚vÍryõRˆ Kñ2.á›4ñã{¶3cï{Îœ`FÄ:‡ü ýž8ÚE²ë€¬Âx’³P¯q\OØ×ÁZc»á¨±Œ/BÚpÒh£ÜÁÝvÑì^¡¾î]=ìËHKn¢Uò<¬ú%ˆªi1‹_ÊéDK9÷nÅ"£³ˆÃã(g)¿)Šá¬Y)û }’Ûá†ÅUAendstream
+endobj
+2969 0 obj <<
+/Length 133
+/Filter /FlateDecode
+>>
+stream
+xÚ³0Ò³T0
+þ1ÔØÿ˜pÖÿؙص!™ ü``”9Êe’ÁdÿÉø
+endobj
+437 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F18
+/FontMatrix [0.00697 0 0 0.00697 0 0]
+/FontBBox [ 0 -2 105 88 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 97
+/LastChar 116
+/Widths 2970 0 R
+/Encoding 2971 0 R
+/CharProcs 2972 0 R
+>> endobj
+2970 0 obj
+[95.65 89.27 0 0 89.27 0 0 0 0 63.77 0 0 114.78 0 95.65 0 0 0 0 82.9 ]
+endobj
+2971 0 obj <<
+/Type /Encoding
+/Differences [97/a97/a98 99/.notdef 101/a101 102/.notdef 106/a106 107/.notdef 109/a109 110/.notdef 111/a111 112/.notdef 116/a116]
+>> endobj
+2972 0 obj <<
+/a97 2963 0 R
+/a98 2964 0 R
+/a101 2965 0 R
+/a106 2966 0 R
+/a109 2967 0 R
+/a111 2968 0 R
+/a116 2969 0 R
+>> endobj
+435 0 obj <<
+/Length1 965
+/Length2 3081
+/Length3 532
+/Length 3737
+/Filter /FlateDecode
+>>
+stream
+xÚí“y<U{÷Ç£Ü Wæ9OÛ<åLf"Cæy¼† ÇqäpŽcÉ1”™L™B$3…$ ™•™""c¦žS÷wŸÛ¯çÏßï¯çõìýÏ~¯µög}öZß-Ägb.©æ‚sFjá°I(ªhšAå
+œ€T 
+
+P@Íç
+%›È]pXt
+K>2²
+;³7^®æ™ˆ^±X>;ÅwªÝη¶=“(+g­umQ-,ÅgƘîU-õÎ19ñÌ»þð÷(êF‰ÉM\³óAõý¤dz÷óhÙ*ר†OgòÀª°)¯Ó„
+Åjì ˜`qŠ¢_q¤  (}NÛÇ!$tŸ¢¥ò\f&µÇäÒZ?‘[åñËQãµKÕˆ§F3Gî”ØÔÔaKžSA_/š­_ö»ü°füý;ñøÔNâ¹
+»Å©$þ¼ß„èWå±Ì…¹Ý‡_kŸ_……o½.Ö¿éŸW™]ü±Âøécµ‚™ë
+òöflÚËâ¨t}°Oã¶5ëé—
+–÷*kââ.†È&»ÛmRÒSöºuYðVÏ´ô"‰Ã"‰:¨•Ùc¶gå’ñƒ¥´èÒä^ O^Í¢Åa¼~&' ÒÊ¢·æ®ž&>Ÿ,¬|dmôqºŽSt¨q+‚·~žu¯Cý%9@É…
+½}+Ô‘:ö‰ÞwF³·ݰ—çÀkt°F¢òžƒ”>Á¹A‹ùì™Á»áÙM£·Uá éƒÁ3¹éüß,OÛ i¥1„¯+«Ú:Móf¦"¹Læ¦Ëªrl\E*¥#pšPþ¢â“WiÐB›¾ÂRs
+œã•dý!k™‹¹¾~ŸUŒ ¦Q*]B¾oY8¦•P_Ù~#a¶jÿ:lgøF``“^ÜO¶ÔiO¼í‚·"¥<¬ÏíÐ9º(ÍOc/ŒÏ0¾´­cïÆ)¾·
+~^{¢Ç9‹Á'×£>E«T™˜¸ ó¾8u+èº(°dë#˜Êðí*„®Ô<’Á—'CÎÎÿ¡.çˆ8¹y&Ôà´Âh&{¤dR®¢Ü^œaápfžÕàd|‹Ü-X]ˆ«Ì#!,LŽ×÷rª0—•¶ky¨¬‰æoÕWήJé¸SݶÛ{ænŽäõü~.É9êòeT’÷y=çýJ‰š¡ÚYA×¥Ðêü©IÞ7[ ëø ¦;î©!ƒ fq©’ß`ËØÃ[§°|x¿tá“õBó£úÁõ°Ø¥© ìlðÄ×&PU
+eK„ÂÊG&Ô8p
+„n6¨³~¶IË1¹ü»yJZÿ`LO³É ¬õÒ쬄o>¥\HvÇ!Û‚Â1µÄõçΨ);‡×ÛoqÆ›³Î–§¯ÛˆMKZŽØ2©®ç{„ Vf+­‰¬lõ‚‰ËJŽ:²k$óÇ9ÅëÝíÍ«ª7”yÝ)ܤî)Ì°º*xC9츱þN Lz±ßc«<ÏÆ㆔ŽNSÄÖ §÷L¨¹«ÙdÔ+3$TP¯ÞGnÕݢߋ¡ZÍ3Ì8©Z£ë!½÷úºÁú;ýóêßåƒ!Pùü€ß üÎÛû]±½@”¤øTeî²-i˜í_Bã©VÚ•õšðvMiRØKwñ„cÌø,}‹0IˆdCàÓó¬i*ÆÏÉ T§CÜæ vŸ•s;ÑÃgÔÏm-<´ô#åEÔ0'ŠV¨Jµ: °0Ð>,1Q<K<UÄ/4¥ÌFÒQ“º-ýJ69+1¢#)Ÿ¸%ø-…þQƨ‹ò$U•.‹Ð=LHíÅáBÝW1öztêL§Nhõòï\2‡"†kç*õ†â«ln8×ÕÈžáÞ»O£{A[ü̦—§¹¼‡E£Ä±+~ϱ .îœ"ý1„Aí´ñ¶D¾›cÜÙ# ,ŸNf6ð,¼ç´3Ĺü¤²'&0ýJ`ð…:]qï”HßI+¥AËb%–¦Å“xRÜZ8ª?³ÊÈnŽÇ6¬¤‘·¯^Æì_“K\N_W¤ãÕ©²úÀ=a¥xWë'™s:U¦[1èU-uQiWIço|ûÄþç›.¶;ÚTêÚÍxÇ}ËD$ÛËÆŠ 6sOÒîgº?ã`Ÿ_éfº:IE¾eÛ±8ç[гØ^vËI"]š/éJˆi…C¸\BÞäBƒxø7„·ì¤ Lên¯Þ¹ò¬]ªã#î•2ÙÍCR³ãTªn_â©ò8nÅ©mU~9Ê¿ÒV‰âjÞ/+«-Þ&ô™YŽµ(‡¶ªgñUîÏ4æ7c“¶'è .n`‡÷’5ÔäsCC‘ ˜Å‹EýãªÅÓ×MFË›:«‹/˜ïvç\5;nw«IŸòû”d Z+¸ZLcxÆú íTÝ‚ó¡ÁeM—3!¢D%ÅB8CÄHÞh³Šòe,} *®-Ø‘h¸‰O7{}›aU›ÌYi{â¬ÝðbFµiìTtšÊäò׃*Y‹-Fa‡;ƒ‘·jäh™Ãj/Y½ÓÐ2È+ó+1Î:=´¨UJüÀK­ÊiÇhExH>ürè‘´çA5·Ý­ã%Eñô|VçÚÄÛÙ7üÙHŽÜ¬ŒÛö¼‘+ðTìå4_çN¥ö:'}¾Ñ¼p7‹²“N”=ä¢ÂÚ )ÂœÍ[]qÚìñë»8:¹Ž(E ­åR9 BŸIMÞk* 'Á¥Ê^ãMp/XrÔƒÏ"w¾èžv\ÐÒ÷Åh8îD”,úú
+ÌxqÓ ¾•’Zo»plsK•´‚šK¡H–‰¶~\ד¨ªñn°…5L_p¢’ªrÝæ›ðZ™&lý=å<3!*Ê/±úf›÷eV8±î°à³éD/WaÈn˜bÞøšçðñÓ X~Ù…_.ìWzÿÈʤžåÜ£žîeͬ=£\Re,©?XÝ“1iÚð\‰=zäÒ€fï ¬-0_3™ãhÈzÖL·É1åÔ;Yå2ehÕ{bÆ\êóì}+·žðeªrO´Qò`–kê®çÅ+¼`bŽ¯µý$7O÷¥ÙÄ‘
+F8£zG˜ÏÔL 3†‚¡ G,£¿Öõu{µ÷Ý:Zºlž‡èêDg-L1Rñ;·ÆØðÚìàÔ6 ™PŒ¹’œÊU/ µA9:#-B
+Ùï¢ÿñ@÷ÉaãM ¯oñWA›E×LpHFêÌvÏ‚ÙR–2t¾å…N)ÇRŠøóq–Ðtž=eJ‹ÜÂèq#:RŠ\àËR~=Ö›¯ÔøÇCôß(ë76.ù
+ì_Jrí^={i¤ûóØ›ÐîÊi¡\-\½âÎœu+ã«–H5µ&¯Ðç,yXÿ]ç¥÷ô¾»iZ¢Ä*=xµßô¦ÆwŠ
+‹O¬XŽ8‡Cúæ¼tvÜÂc…CÛÓbÑ~Ìñ´ÅÎïF>nÊ•ý‹Ò-Ψœïòqn•dªX§}†ÊPt7MŠ°g>5„e•tÎœØo]:fÉ—:šÈ¤6ôмÿ$w7K:Ü×óz*Ч­,¨÷CDÖ Ð¥ws‡‹º¥FAדbÍxÅAmC6㙺1ŒéÓ+ðÎgì¤t—-È[¢h<á àöaÿ¶{£=Œâ|¬­bw„Ý««GQša9¼÷Lï§]Á;kh‡w|Ÿ í·µ* õüš ›žñø59Ñ.Ó0Ò×P0_‡\œ¦þ€ÀRÌÍÇ\ÆÞ¹$µ®ÈÄœ\zYœÜ®@þíþ#h$OÀaàxÚ†|”øendstream
+endobj
+436 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 2973 0 R
+/FirstChar 84
+/LastChar 117
+/Widths 2974 0 R
+/BaseFont /LXOBSV+CMR17
+/FontDescriptor 434 0 R
+>> endobj
+434 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -195
+/FontName /LXOBSV+CMR17
+/ItalicAngle 0
+/StemV 53
+/XHeight 431
+/FontBBox [-33 -250 945 749]
+/Flags 4
+/CharSet (/T/a/c/d/e/f/h/i/l/m/n/o/r/t/u)
+/FontFile 435 0 R
+>> endobj
+2974 0 obj
+[668 0 0 0 0 0 0 0 0 0 0 0 0 459 0 406 511 406 276 0 511 250 0 0 250 772 511 459 0 0 354 0 354 511 ]
+endobj
+2973 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 84/T 85/.notdef 97/a 98/.notdef 99/c/d/e/f 103/.notdef 104/h/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r 115/.notdef 116/t/u 118/.notdef]
+>> endobj
+474 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [429 0 R 477 0 R 530 0 R 578 0 R 593 0 R 606 0 R]
+>> endobj
+619 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [610 0 R 621 0 R 633 0 R 638 0 R 642 0 R 648 0 R]
+>> endobj
+655 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [652 0 R 657 0 R 661 0 R 665 0 R 669 0 R 673 0 R]
+>> endobj
+682 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [679 0 R 684 0 R 688 0 R 692 0 R 696 0 R 700 0 R]
+>> endobj
+707 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [704 0 R 709 0 R 713 0 R 717 0 R 721 0 R 726 0 R]
+>> endobj
+734 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2975 0 R
+/Kids [731 0 R 736 0 R 740 0 R 744 0 R 750 0 R 754 0 R]
+>> endobj
+763 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [759 0 R 765 0 R 770 0 R 775 0 R 781 0 R 785 0 R]
+>> endobj
+794 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [791 0 R 796 0 R 800 0 R 804 0 R 808 0 R 812 0 R]
+>> endobj
+819 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [816 0 R 821 0 R 825 0 R 829 0 R 833 0 R 837 0 R]
+>> endobj
+852 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [845 0 R 856 0 R 870 0 R 874 0 R 878 0 R 883 0 R]
+>> endobj
+891 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [887 0 R 893 0 R 899 0 R 905 0 R 911 0 R 916 0 R]
+>> endobj
+925 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2976 0 R
+/Kids [921 0 R 927 0 R 931 0 R 936 0 R 941 0 R 948 0 R]
+>> endobj
+957 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [952 0 R 959 0 R 963 0 R 967 0 R 971 0 R 975 0 R]
+>> endobj
+987 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [979 0 R 991 0 R 995 0 R 1006 0 R 1016 0 R 1020 0 R]
+>> endobj
+1032 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [1029 0 R 1034 0 R 1048 0 R 1053 0 R 1058 0 R 1065 0 R]
+>> endobj
+1072 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [1069 0 R 1074 0 R 1081 0 R 1085 0 R 1090 0 R 1096 0 R]
+>> endobj
+1111 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [1104 0 R 1113 0 R 1126 0 R 1132 0 R 1140 0 R 1148 0 R]
+>> endobj
+1165 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2977 0 R
+/Kids [1158 0 R 1167 0 R 1174 0 R 1182 0 R 1190 0 R 1197 0 R]
+>> endobj
+1208 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2978 0 R
+/Kids [1203 0 R 1210 0 R 1214 0 R 1219 0 R 1225 0 R 1230 0 R]
+>> endobj
+1237 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2978 0 R
+/Kids [1234 0 R 1239 0 R 1244 0 R 1248 0 R 1252 0 R 1256 0 R]
+>> endobj
+1265 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2978 0 R
+/Kids [1260 0 R 1267 0 R 1272 0 R 1278 0 R 1301 0 R 1309 0 R]
+>> endobj
+1339 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2978 0 R
+/Kids [1332 0 R 1341 0 R 1534 0 R 1767 0 R 1942 0 R 2113 0 R]
+>> endobj
+2465 0 obj <<
+/Type /Pages
+/Count 4
+/Parent 2978 0 R
+/Kids [2274 0 R 2467 0 R 2631 0 R 2773 0 R]
+>> endobj
+2975 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2979 0 R
+/Kids [474 0 R 619 0 R 655 0 R 682 0 R 707 0 R 734 0 R]
+>> endobj
+2976 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2979 0 R
+/Kids [763 0 R 794 0 R 819 0 R 852 0 R 891 0 R 925 0 R]
+>> endobj
+2977 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2979 0 R
+/Kids [957 0 R 987 0 R 1032 0 R 1072 0 R 1111 0 R 1165 0 R]
+>> endobj
+2978 0 obj <<
+/Type /Pages
+/Count 28
+/Parent 2979 0 R
+/Kids [1208 0 R 1237 0 R 1265 0 R 1339 0 R 2465 0 R]
+>> endobj
+2979 0 obj <<
+/Type /Pages
+/Count 136
+/Kids [2975 0 R 2976 0 R 2977 0 R 2978 0 R]
+>> endobj
+2980 0 obj <<
+/Type /Outlines
+/First 7 0 R
+/Last 426 0 R
+/Count 18
+>> endobj
+426 0 obj <<
+/Title 427 0 R
+/A 424 0 R
+/Parent 2980 0 R
+/Prev 422 0 R
+>> endobj
+422 0 obj <<
+/Title 423 0 R
+/A 420 0 R
+/Parent 2980 0 R
+/Prev 418 0 R
+/Next 426 0 R
+>> endobj
+418 0 obj <<
+/Title 419 0 R
+/A 416 0 R
+/Parent 2980 0 R
+/Prev 414 0 R
+/Next 422 0 R
+>> endobj
+414 0 obj <<
+/Title 415 0 R
+/A 412 0 R
+/Parent 2980 0 R
+/Prev 410 0 R
+/Next 418 0 R
+>> endobj
+410 0 obj <<
+/Title 411 0 R
+/A 408 0 R
+/Parent 2980 0 R
+/Prev 406 0 R
+/Next 414 0 R
+>> endobj
+406 0 obj <<
+/Title 407 0 R
+/A 404 0 R
+/Parent 2980 0 R
+/Prev 390 0 R
+/Next 410 0 R
+>> endobj
+402 0 obj <<
+/Title 403 0 R
+/A 400 0 R
+/Parent 390 0 R
+/Prev 398 0 R
+>> endobj
+398 0 obj <<
+/Title 399 0 R
+/A 396 0 R
+/Parent 390 0 R
+/Prev 394 0 R
+/Next 402 0 R
+>> endobj
+394 0 obj <<
+/Title 395 0 R
+/A 392 0 R
+/Parent 390 0 R
+/Next 398 0 R
+>> endobj
+390 0 obj <<
+/Title 391 0 R
+/A 388 0 R
+/Parent 2980 0 R
+/Prev 370 0 R
+/Next 406 0 R
+/First 394 0 R
+/Last 402 0 R
+/Count -3
+>> endobj
+386 0 obj <<
+/Title 387 0 R
+/A 384 0 R
+/Parent 370 0 R
+/Prev 374 0 R
+>> endobj
+382 0 obj <<
+/Title 383 0 R
+/A 380 0 R
+/Parent 374 0 R
+/Prev 378 0 R
+>> endobj
+378 0 obj <<
+/Title 379 0 R
+/A 376 0 R
+/Parent 374 0 R
+/Next 382 0 R
+>> endobj
+374 0 obj <<
+/Title 375 0 R
+/A 372 0 R
+/Parent 370 0 R
+/Next 386 0 R
+/First 378 0 R
+/Last 382 0 R
+/Count -2
+>> endobj
+370 0 obj <<
+/Title 371 0 R
+/A 368 0 R
+/Parent 2980 0 R
+/Prev 326 0 R
+/Next 390 0 R
+/First 374 0 R
+/Last 386 0 R
+/Count -2
+>> endobj
+366 0 obj <<
+/Title 367 0 R
+/A 364 0 R
+/Parent 326 0 R
+/Prev 330 0 R
+>> endobj
+362 0 obj <<
+/Title 363 0 R
+/A 360 0 R
+/Parent 330 0 R
+/Prev 358 0 R
+>> endobj
+358 0 obj <<
+/Title 359 0 R
+/A 356 0 R
+/Parent 330 0 R
+/Prev 354 0 R
+/Next 362 0 R
+>> endobj
+354 0 obj <<
+/Title 355 0 R
+/A 352 0 R
+/Parent 330 0 R
+/Prev 350 0 R
+/Next 358 0 R
+>> endobj
+350 0 obj <<
+/Title 351 0 R
+/A 348 0 R
+/Parent 330 0 R
+/Prev 346 0 R
+/Next 354 0 R
+>> endobj
+346 0 obj <<
+/Title 347 0 R
+/A 344 0 R
+/Parent 330 0 R
+/Prev 342 0 R
+/Next 350 0 R
+>> endobj
+342 0 obj <<
+/Title 343 0 R
+/A 340 0 R
+/Parent 330 0 R
+/Prev 338 0 R
+/Next 346 0 R
+>> endobj
+338 0 obj <<
+/Title 339 0 R
+/A 336 0 R
+/Parent 330 0 R
+/Prev 334 0 R
+/Next 342 0 R
+>> endobj
+334 0 obj <<
+/Title 335 0 R
+/A 332 0 R
+/Parent 330 0 R
+/Next 338 0 R
+>> endobj
+330 0 obj <<
+/Title 331 0 R
+/A 328 0 R
+/Parent 326 0 R
+/Next 366 0 R
+/First 334 0 R
+/Last 362 0 R
+/Count -8
+>> endobj
+326 0 obj <<
+/Title 327 0 R
+/A 324 0 R
+/Parent 2980 0 R
+/Prev 218 0 R
+/Next 370 0 R
+/First 330 0 R
+/Last 366 0 R
+/Count -2
+>> endobj
+322 0 obj <<
+/Title 323 0 R
+/A 320 0 R
+/Parent 218 0 R
+/Prev 302 0 R
+>> endobj
+318 0 obj <<
+/Title 319 0 R
+/A 316 0 R
+/Parent 302 0 R
+/Prev 314 0 R
+>> endobj
+314 0 obj <<
+/Title 315 0 R
+/A 312 0 R
+/Parent 302 0 R
+/Prev 310 0 R
+/Next 318 0 R
+>> endobj
+310 0 obj <<
+/Title 311 0 R
+/A 308 0 R
+/Parent 302 0 R
+/Prev 306 0 R
+/Next 314 0 R
+>> endobj
+306 0 obj <<
+/Title 307 0 R
+/A 304 0 R
+/Parent 302 0 R
+/Next 310 0 R
+>> endobj
+302 0 obj <<
+/Title 303 0 R
+/A 300 0 R
+/Parent 218 0 R
+/Prev 290 0 R
+/Next 322 0 R
+/First 306 0 R
+/Last 318 0 R
+/Count -4
+>> endobj
+298 0 obj <<
+/Title 299 0 R
+/A 296 0 R
+/Parent 290 0 R
+/Prev 294 0 R
+>> endobj
+294 0 obj <<
+/Title 295 0 R
+/A 292 0 R
+/Parent 290 0 R
+/Next 298 0 R
+>> endobj
+290 0 obj <<
+/Title 291 0 R
+/A 288 0 R
+/Parent 218 0 R
+/Prev 278 0 R
+/Next 302 0 R
+/First 294 0 R
+/Last 298 0 R
+/Count -2
+>> endobj
+286 0 obj <<
+/Title 287 0 R
+/A 284 0 R
+/Parent 278 0 R
+/Prev 282 0 R
+>> endobj
+282 0 obj <<
+/Title 283 0 R
+/A 280 0 R
+/Parent 278 0 R
+/Next 286 0 R
+>> endobj
+278 0 obj <<
+/Title 279 0 R
+/A 276 0 R
+/Parent 218 0 R
+/Prev 266 0 R
+/Next 290 0 R
+/First 282 0 R
+/Last 286 0 R
+/Count -2
+>> endobj
+274 0 obj <<
+/Title 275 0 R
+/A 272 0 R
+/Parent 266 0 R
+/Prev 270 0 R
+>> endobj
+270 0 obj <<
+/Title 271 0 R
+/A 268 0 R
+/Parent 266 0 R
+/Next 274 0 R
+>> endobj
+266 0 obj <<
+/Title 267 0 R
+/A 264 0 R
+/Parent 218 0 R
+/Prev 238 0 R
+/Next 278 0 R
+/First 270 0 R
+/Last 274 0 R
+/Count -2
+>> endobj
+262 0 obj <<
+/Title 263 0 R
+/A 260 0 R
+/Parent 238 0 R
+/Prev 258 0 R
+>> endobj
+258 0 obj <<
+/Title 259 0 R
+/A 256 0 R
+/Parent 238 0 R
+/Prev 254 0 R
+/Next 262 0 R
+>> endobj
+254 0 obj <<
+/Title 255 0 R
+/A 252 0 R
+/Parent 238 0 R
+/Prev 250 0 R
+/Next 258 0 R
+>> endobj
+250 0 obj <<
+/Title 251 0 R
+/A 248 0 R
+/Parent 238 0 R
+/Prev 246 0 R
+/Next 254 0 R
+>> endobj
+246 0 obj <<
+/Title 247 0 R
+/A 244 0 R
+/Parent 238 0 R
+/Prev 242 0 R
+/Next 250 0 R
+>> endobj
+242 0 obj <<
+/Title 243 0 R
+/A 240 0 R
+/Parent 238 0 R
+/Next 246 0 R
+>> endobj
+238 0 obj <<
+/Title 239 0 R
+/A 236 0 R
+/Parent 218 0 R
+/Prev 222 0 R
+/Next 266 0 R
+/First 242 0 R
+/Last 262 0 R
+/Count -6
+>> endobj
+234 0 obj <<
+/Title 235 0 R
+/A 232 0 R
+/Parent 222 0 R
+/Prev 230 0 R
+>> endobj
+230 0 obj <<
+/Title 231 0 R
+/A 228 0 R
+/Parent 222 0 R
+/Prev 226 0 R
+/Next 234 0 R
+>> endobj
+226 0 obj <<
+/Title 227 0 R
+/A 224 0 R
+/Parent 222 0 R
+/Next 230 0 R
+>> endobj
+222 0 obj <<
+/Title 223 0 R
+/A 220 0 R
+/Parent 218 0 R
+/Next 238 0 R
+/First 226 0 R
+/Last 234 0 R
+/Count -3
+>> endobj
+218 0 obj <<
+/Title 219 0 R
+/A 216 0 R
+/Parent 2980 0 R
+/Prev 214 0 R
+/Next 326 0 R
+/First 222 0 R
+/Last 322 0 R
+/Count -7
+>> endobj
+214 0 obj <<
+/Title 215 0 R
+/A 212 0 R
+/Parent 2980 0 R
+/Prev 98 0 R
+/Next 218 0 R
+>> endobj
+210 0 obj <<
+/Title 211 0 R
+/A 208 0 R
+/Parent 98 0 R
+/Prev 150 0 R
+>> endobj
+206 0 obj <<
+/Title 207 0 R
+/A 204 0 R
+/Parent 150 0 R
+/Prev 202 0 R
+>> endobj
+202 0 obj <<
+/Title 203 0 R
+/A 200 0 R
+/Parent 150 0 R
+/Prev 198 0 R
+/Next 206 0 R
+>> endobj
+198 0 obj <<
+/Title 199 0 R
+/A 196 0 R
+/Parent 150 0 R
+/Prev 194 0 R
+/Next 202 0 R
+>> endobj
+194 0 obj <<
+/Title 195 0 R
+/A 192 0 R
+/Parent 150 0 R
+/Prev 190 0 R
+/Next 198 0 R
+>> endobj
+190 0 obj <<
+/Title 191 0 R
+/A 188 0 R
+/Parent 150 0 R
+/Prev 186 0 R
+/Next 194 0 R
+>> endobj
+186 0 obj <<
+/Title 187 0 R
+/A 184 0 R
+/Parent 150 0 R
+/Prev 182 0 R
+/Next 190 0 R
+>> endobj
+182 0 obj <<
+/Title 183 0 R
+/A 180 0 R
+/Parent 150 0 R
+/Prev 178 0 R
+/Next 186 0 R
+>> endobj
+178 0 obj <<
+/Title 179 0 R
+/A 176 0 R
+/Parent 150 0 R
+/Prev 174 0 R
+/Next 182 0 R
+>> endobj
+174 0 obj <<
+/Title 175 0 R
+/A 172 0 R
+/Parent 150 0 R
+/Prev 170 0 R
+/Next 178 0 R
+>> endobj
+170 0 obj <<
+/Title 171 0 R
+/A 168 0 R
+/Parent 150 0 R
+/Prev 166 0 R
+/Next 174 0 R
+>> endobj
+166 0 obj <<
+/Title 167 0 R
+/A 164 0 R
+/Parent 150 0 R
+/Prev 162 0 R
+/Next 170 0 R
+>> endobj
+162 0 obj <<
+/Title 163 0 R
+/A 160 0 R
+/Parent 150 0 R
+/Prev 158 0 R
+/Next 166 0 R
+>> endobj
+158 0 obj <<
+/Title 159 0 R
+/A 156 0 R
+/Parent 150 0 R
+/Prev 154 0 R
+/Next 162 0 R
+>> endobj
+154 0 obj <<
+/Title 155 0 R
+/A 152 0 R
+/Parent 150 0 R
+/Next 158 0 R
+>> endobj
+150 0 obj <<
+/Title 151 0 R
+/A 148 0 R
+/Parent 98 0 R
+/Prev 146 0 R
+/Next 210 0 R
+/First 154 0 R
+/Last 206 0 R
+/Count -14
+>> endobj
+146 0 obj <<
+/Title 147 0 R
+/A 144 0 R
+/Parent 98 0 R
+/Prev 126 0 R
+/Next 150 0 R
+>> endobj
+142 0 obj <<
+/Title 143 0 R
+/A 140 0 R
+/Parent 126 0 R
+/Prev 138 0 R
+>> endobj
+138 0 obj <<
+/Title 139 0 R
+/A 136 0 R
+/Parent 126 0 R
+/Prev 134 0 R
+/Next 142 0 R
+>> endobj
+134 0 obj <<
+/Title 135 0 R
+/A 132 0 R
+/Parent 126 0 R
+/Prev 130 0 R
+/Next 138 0 R
+>> endobj
+130 0 obj <<
+/Title 131 0 R
+/A 128 0 R
+/Parent 126 0 R
+/Next 134 0 R
+>> endobj
+126 0 obj <<
+/Title 127 0 R
+/A 124 0 R
+/Parent 98 0 R
+/Prev 122 0 R
+/Next 146 0 R
+/First 130 0 R
+/Last 142 0 R
+/Count -4
+>> endobj
+122 0 obj <<
+/Title 123 0 R
+/A 120 0 R
+/Parent 98 0 R
+/Prev 110 0 R
+/Next 126 0 R
+>> endobj
+118 0 obj <<
+/Title 119 0 R
+/A 116 0 R
+/Parent 110 0 R
+/Prev 114 0 R
+>> endobj
+114 0 obj <<
+/Title 115 0 R
+/A 112 0 R
+/Parent 110 0 R
+/Next 118 0 R
+>> endobj
+110 0 obj <<
+/Title 111 0 R
+/A 108 0 R
+/Parent 98 0 R
+/Prev 106 0 R
+/Next 122 0 R
+/First 114 0 R
+/Last 118 0 R
+/Count -2
+>> endobj
+106 0 obj <<
+/Title 107 0 R
+/A 104 0 R
+/Parent 98 0 R
+/Prev 102 0 R
+/Next 110 0 R
+>> endobj
+102 0 obj <<
+/Title 103 0 R
+/A 100 0 R
+/Parent 98 0 R
+/Next 106 0 R
+>> endobj
+98 0 obj <<
+/Title 99 0 R
+/A 96 0 R
+/Parent 2980 0 R
+/Prev 94 0 R
+/Next 214 0 R
+/First 102 0 R
+/Last 210 0 R
+/Count -8
+>> endobj
+94 0 obj <<
+/Title 95 0 R
+/A 92 0 R
+/Parent 2980 0 R
+/Prev 82 0 R
+/Next 98 0 R
+>> endobj
+90 0 obj <<
+/Title 91 0 R
+/A 88 0 R
+/Parent 82 0 R
+/Prev 86 0 R
+>> endobj
+86 0 obj <<
+/Title 87 0 R
+/A 84 0 R
+/Parent 82 0 R
+/Next 90 0 R
+>> endobj
+82 0 obj <<
+/Title 83 0 R
+/A 80 0 R
+/Parent 2980 0 R
+/Prev 66 0 R
+/Next 94 0 R
+/First 86 0 R
+/Last 90 0 R
+/Count -2
+>> endobj
+78 0 obj <<
+/Title 79 0 R
+/A 76 0 R
+/Parent 66 0 R
+/Prev 74 0 R
+>> endobj
+74 0 obj <<
+/Title 75 0 R
+/A 72 0 R
+/Parent 66 0 R
+/Prev 70 0 R
+/Next 78 0 R
+>> endobj
+70 0 obj <<
+/Title 71 0 R
+/A 68 0 R
+/Parent 66 0 R
+/Next 74 0 R
+>> endobj
+66 0 obj <<
+/Title 67 0 R
+/A 64 0 R
+/Parent 2980 0 R
+/Prev 14 0 R
+/Next 82 0 R
+/First 70 0 R
+/Last 78 0 R
+/Count -3
+>> endobj
+62 0 obj <<
+/Title 63 0 R
+/A 60 0 R
+/Parent 14 0 R
+/Prev 30 0 R
+>> endobj
+58 0 obj <<
+/Title 59 0 R
+/A 56 0 R
+/Parent 30 0 R
+/Prev 54 0 R
+>> endobj
+54 0 obj <<
+/Title 55 0 R
+/A 52 0 R
+/Parent 30 0 R
+/Prev 50 0 R
+/Next 58 0 R
+>> endobj
+50 0 obj <<
+/Title 51 0 R
+/A 48 0 R
+/Parent 30 0 R
+/Prev 46 0 R
+/Next 54 0 R
+>> endobj
+46 0 obj <<
+/Title 47 0 R
+/A 44 0 R
+/Parent 30 0 R
+/Prev 42 0 R
+/Next 50 0 R
+>> endobj
+42 0 obj <<
+/Title 43 0 R
+/A 40 0 R
+/Parent 30 0 R
+/Prev 38 0 R
+/Next 46 0 R
+>> endobj
+38 0 obj <<
+/Title 39 0 R
+/A 36 0 R
+/Parent 30 0 R
+/Prev 34 0 R
+/Next 42 0 R
+>> endobj
+34 0 obj <<
+/Title 35 0 R
+/A 32 0 R
+/Parent 30 0 R
+/Next 38 0 R
+>> endobj
+30 0 obj <<
+/Title 31 0 R
+/A 28 0 R
+/Parent 14 0 R
+/Prev 26 0 R
+/Next 62 0 R
+/First 34 0 R
+/Last 58 0 R
+/Count -7
+>> endobj
+26 0 obj <<
+/Title 27 0 R
+/A 24 0 R
+/Parent 14 0 R
+/Prev 22 0 R
+/Next 30 0 R
+>> endobj
+22 0 obj <<
+/Title 23 0 R
+/A 20 0 R
+/Parent 14 0 R
+/Prev 18 0 R
+/Next 26 0 R
+>> endobj
+18 0 obj <<
+/Title 19 0 R
+/A 16 0 R
+/Parent 14 0 R
+/Next 22 0 R
+>> endobj
+14 0 obj <<
+/Title 15 0 R
+/A 12 0 R
+/Parent 2980 0 R
+/Prev 10 0 R
+/Next 66 0 R
+/First 18 0 R
+/Last 62 0 R
+/Count -5
+>> endobj
+10 0 obj <<
+/Title 11 0 R
+/A 9 0 R
+/Parent 2980 0 R
+/Prev 7 0 R
+/Next 14 0 R
+>> endobj
+7 0 obj <<
+/Title 8 0 R
+/A 5 0 R
+/Parent 2980 0 R
+/Next 10 0 R
+>> endobj
+2981 0 obj <<
+/Names [(Doc-Start) 433 0 R (Hfootnote.105) 1013 0 R (Hfootnote.20) 677 0 R (Hfootnote.8) 631 0 R (cite.girou1995) 1296 0 R (cite.goossens1997) 603 0 R (cite.hagen2000) 1292 0 R (cite.hagen2000a) 1293 0 R (cite.hobby1992) 601 0 R (cite.hoenig1998) 602 0 R (cite.kamin1997) 1306 0 R (cite.knudsen1999) 1307 0 R (cite.knuth-digital1999) 475 0 R (cite.knuth1986) 604 0 R (cite.korittky1998) 1298 0 R (cite.kuhlmann2001) 1299 0 R (cite.ohl1997) 1291 0 R (cite.roegel1997) 1294 0 R (cite.rose1997) 1297 0 R (cite.vanzandt-beta) 789 0 R (cite.vanzandt-girou1994) 1295 0 R (cite.vanzandt1993) 1335 0 R (figure.109) 1026 0 R (figure.110) 1045 0 R (figure.111) 1046 0 R (figure.119) 854 0 R (figure.120) 1093 0 R (figure.121) 1099 0 R (figure.122) 1101 0 R (figure.123) 1107 0 R (figure.124) 1109 0 R (figure.125) 1116 0 R (figure.126) 1121 0 R (figure.127) 1123 0 R (figure.128) 1129 0 R (figure.129) 1135 0 R (figure.130) 1137 0 R (figure.131) 1143 0 R (figure.132) 1145 0 R (figure.133) 1151 0 R (figure.134) 1153 0 R (figure.135) 1155 0 R (figure.136) 1161 0 R (figure.137) 1163 0 R (figure.138) 1170 0 R (figure.139) 989 0 R (figure.140) 1177 0 R (figure.141) 1179 0 R (figure.142) 1185 0 R (figure.143) 1187 0 R (figure.144) 842 0 R (figure.145) 1194 0 R (figure.146) 1200 0 R (figure.147) 1206 0 R (figure.148) 853 0 R (figure.149) 1014 0 R (figure.150) 843 0 R (figure.151) 1222 0 R (figure.152) 1228 0 R (figure.169) 1264 0 R (figure.175) 1276 0 R (figure.25) 724 0 R (figure.26) 729 0 R (figure.61) 864 0 R (figure.62) 865 0 R (figure.63) 866 0 R (figure.64) 867 0 R (page.1) 432 0 R (page.10) 640 0 R (page.100) 1134 0 R (page.101) 1142 0 R (page.102) 1150 0 R (page.103) 1160 0 R (page.104) 1169 0 R (page.105) 1176 0 R (page.106) 1184 0 R (page.107) 1192 0 R (page.108) 1199 0 R (page.109) 1205 0 R (page.11) 644 0 R (page.110) 1212 0 R (page.111) 1216 0 R (page.112) 1221 0 R (page.113) 1227 0 R (page.114) 1232 0 R (page.115) 1236 0 R (page.116) 1241 0 R (page.117) 1246 0 R (page.118) 1250 0 R (page.119) 1254 0 R (page.12) 650 0 R (page.120) 1258 0 R (page.121) 1262 0 R (page.122) 1269 0 R (page.123) 1274 0 R (page.124) 1280 0 R (page.125) 1303 0 R (page.126) 1311 0 R (page.127) 1334 0 R (page.128) 1343 0 R (page.129) 1536 0 R (page.13) 654 0 R (page.130) 1769 0 R (page.131) 1944 0 R (page.132) 2115 0 R (page.133) 2276 0 R (page.134) 2469 0 R (page.135) 2633 0 R (page.136) 2775 0 R (page.14) 659 0 R (page.15) 663 0 R (page.16) 667 0 R (page.17) 671 0 R (page.18) 675 0 R (page.19) 681 0 R (page.2) 479 0 R (page.20) 686 0 R (page.21) 690 0 R (page.22) 694 0 R (page.23) 698 0 R (page.24) 702 0 R (page.25) 706 0 R (page.26) 711 0 R (page.27) 715 0 R (page.28) 719 0 R (page.29) 723 0 R (page.3) 532 0 R (page.30) 728 0 R (page.31) 733 0 R (page.32) 738 0 R (page.33) 742 0 R (page.34) 746 0 R (page.35) 752 0 R (page.36) 756 0 R (page.37) 761 0 R (page.38) 767 0 R (page.39) 772 0 R (page.4) 580 0 R (page.40) 777 0 R (page.41) 783 0 R (page.42) 787 0 R (page.43) 793 0 R (page.44) 798 0 R (page.45) 802 0 R (page.46) 806 0 R (page.47) 810 0 R (page.48) 814 0 R (page.49) 818 0 R (page.5) 595 0 R (page.50) 823 0 R (page.51) 827 0 R (page.52) 831 0 R (page.53) 835 0 R (page.54) 839 0 R (page.55) 847 0 R (page.56) 858 0 R (page.57) 872 0 R (page.58) 876 0 R (page.59) 880 0 R (page.6) 608 0 R (page.60) 885 0 R (page.61) 889 0 R (page.62) 895 0 R (page.63) 901 0 R (page.64) 907 0 R (page.65) 913 0 R (page.66) 918 0 R (page.67) 923 0 R (page.68) 929 0 R (page.69) 933 0 R (page.7) 612 0 R (page.70) 938 0 R (page.71) 943 0 R (page.72) 950 0 R (page.73) 954 0 R (page.74) 961 0 R (page.75) 965 0 R (page.76) 969 0 R (page.77) 973 0 R (page.78) 977 0 R (page.79) 981 0 R (page.8) 623 0 R (page.80) 993 0 R (page.81) 997 0 R (page.82) 1008 0 R (page.83) 1018 0 R (page.84) 1022 0 R (page.85) 1031 0 R (page.86) 1036 0 R (page.87) 1050 0 R (page.88) 1055 0 R (page.89) 1060 0 R (page.9) 635 0 R (page.90) 1067 0 R (page.91) 1071 0 R (page.92) 1076 0 R (page.93) 1083 0 R (page.94) 1087 0 R (page.95) 1092 0 R (page.96) 1098 0 R (page.97) 1106 0 R (page.98) 1115 0 R (page.99) 1128 0 R (section*.1) 458 0 R (section*.101) 986 0 R (section*.102) 999 0 R (section*.103) 1009 0 R (section*.104) 1011 0 R (section*.107) 1024 0 R (section*.177) 413 0 R (section*.178) 417 0 R (section*.179) 421 0 R (section*.180) 425 0 R (section*.32) 747 0 R (section*.68) 881 0 R (section*.71) 890 0 R (section*.74) 896 0 R (section*.75) 897 0 R (section*.77) 903 0 R (section*.79) 908 0 R (section*.81) 909 0 R (section*.82) 914 0 R (section*.84) 919 0 R (section*.86) 924 0 R (section*.89) 934 0 R (section*.91) 939 0 R (section*.94) 944 0 R (section*.99) 982 0 R (section.1) 6 0 R (section.153) 325 0 R (section.16) 65 0 R (section.164) 369 0 R (section.170) 389 0 R (section.174) 405 0 R (section.176) 409 0 R (section.2) 13 0 R (section.21) 81 0 R (section.24) 93 0 R (section.27) 97 0 R (section.59) 213 0 R (section.65) 217 0 R (subsection.112) 301 0 R (subsection.118) 321 0 R (subsection.15) 61 0 R (subsection.154) 329 0 R (subsection.163) 365 0 R (subsection.165) 373 0 R (subsection.168) 385 0 R (subsection.17) 69 0 R (subsection.171) 393 0 R (subsection.172) 397 0 R (subsection.173) 401 0 R (subsection.18) 73 0 R (subsection.19) 77 0 R (subsection.22) 85 0 R (subsection.23) 89 0 R (subsection.28) 101 0 R (subsection.29) 105 0 R (subsection.3) 17 0 R (subsection.30) 109 0 R (subsection.34) 121 0 R (subsection.35) 125 0 R (subsection.4) 21 0 R (subsection.40) 145 0 R (subsection.41) 149 0 R (subsection.5) 25 0 R (subsection.57) 209 0 R (subsection.6) 29 0 R (subsection.66) 221 0 R (subsection.72) 237 0 R (subsection.87) 265 0 R (subsection.92) 277 0 R (subsection.97) 289 0 R (subsubsection.10) 41 0 R (subsubsection.106) 297 0 R (subsubsection.11) 45 0 R (subsubsection.113) 305 0 R (subsubsection.114) 309 0 R (subsubsection.115) 313 0 R (subsubsection.116) 317 0 R (subsubsection.12) 49 0 R (subsubsection.13) 53 0 R (subsubsection.14) 57 0 R (subsubsection.155) 333 0 R (subsubsection.156) 337 0 R (subsubsection.157) 341 0 R (subsubsection.158) 345 0 R (subsubsection.159) 349 0 R (subsubsection.160) 353 0 R (subsubsection.161) 357 0 R (subsubsection.162) 361 0 R (subsubsection.166) 377 0 R (subsubsection.167) 381 0 R (subsubsection.31) 113 0 R (subsubsection.33) 117 0 R (subsubsection.36) 129 0 R (subsubsection.37) 133 0 R (subsubsection.38) 137 0 R (subsubsection.39) 141 0 R (subsubsection.43) 153 0 R (subsubsection.44) 157 0 R (subsubsection.45) 161 0 R (subsubsection.46) 165 0 R (subsubsection.47) 169 0 R (subsubsection.48) 173 0 R (subsubsection.49) 177 0 R (subsubsection.50) 181 0 R (subsubsection.51) 185 0 R (subsubsection.52) 189 0 R (subsubsection.53) 193 0 R (subsubsection.54) 197 0 R (subsubsection.55) 201 0 R (subsubsection.56) 205 0 R (subsubsection.67) 225 0 R (subsubsection.69) 229 0 R (subsubsection.7) 33 0 R (subsubsection.70) 233 0 R (subsubsection.73) 241 0 R (subsubsection.76) 245 0 R (subsubsection.78) 249 0 R (subsubsection.80) 253 0 R (subsubsection.83) 257 0 R (subsubsection.85) 261 0 R (subsubsection.88) 269 0 R (subsubsection.9) 37 0 R (subsubsection.90) 273 0 R (subsubsection.93) 281 0 R (subsubsection.96) 285 0 R (subsubsection.98) 293 0 R (table.100) 988 0 R (table.108) 1027 0 R (table.117) 1079 0 R (table.42) 779 0 R (table.58) 849 0 R (table.60) 868 0 R (table.95) 946 0 R]
+/Limits [(Doc-Start) (table.95)]
+>> endobj
+2982 0 obj <<
+/Kids [2981 0 R]
+>> endobj
+2983 0 obj <<
+/Dests 2982 0 R
+>> endobj
+2984 0 obj <<
+/Type /Catalog
+/Pages 2979 0 R
+/Outlines 2980 0 R
+/Names 2983 0 R
+ /PageMode /UseOutlines /URI << /Base () >> /ViewerPreferences << >>
+/OpenAction 428 0 R
+>> endobj
+2985 0 obj <<
+/Producer (pdfTeX-0.14f)
+/Author (Denis Roegel) /Title (METAOBJ Manual) /Subject (METAOBJ) /Creator (LaTeX with hyperref package) /Producer (pdfTeX14.f) /Keywords (METAOBJ, METAPOST)
+/Creator (TeX)
+/CreationDate (D:20020915120600)
+>> endobj
+xref
+0 2986
+0000000001 65535 f
+0000000002 00000 f
+0000000003 00000 f
+0000000004 00000 f
+0000000000 00000 f
+0000000009 00000 n
+0000018541 00000 n
+0000932682 00000 n
+0000000054 00000 n
+0000000077 00000 n
+0000932595 00000 n
+0000000122 00000 n
+0000000158 00000 n
+0000045362 00000 n
+0000932469 00000 n
+0000000204 00000 n
+0000000235 00000 n
+0000045423 00000 n
+0000932395 00000 n
+0000000284 00000 n
+0000000321 00000 n
+0000048643 00000 n
+0000932308 00000 n
+0000000370 00000 n
+0000000409 00000 n
+0000052196 00000 n
+0000932221 00000 n
+0000000458 00000 n
+0000000489 00000 n
+0000057640 00000 n
+0000932097 00000 n
+0000000538 00000 n
+0000000575 00000 n
+0000057701 00000 n
+0000932023 00000 n
+0000000627 00000 n
+0000000652 00000 n
+0000061268 00000 n
+0000931936 00000 n
+0000000704 00000 n
+0000000729 00000 n
+0000061329 00000 n
+0000931849 00000 n
+0000000782 00000 n
+0000000810 00000 n
+0000064858 00000 n
+0000931762 00000 n
+0000000863 00000 n
+0000000890 00000 n
+0000064919 00000 n
+0000931675 00000 n
+0000000943 00000 n
+0000000967 00000 n
+0000068062 00000 n
+0000931588 00000 n
+0000001020 00000 n
+0000001049 00000 n
+0000068123 00000 n
+0000931514 00000 n
+0000001102 00000 n
+0000001137 00000 n
+0000068184 00000 n
+0000931440 00000 n
+0000001187 00000 n
+0000001221 00000 n
+0000071260 00000 n
+0000931314 00000 n
+0000001268 00000 n
+0000001301 00000 n
+0000071321 00000 n
+0000931240 00000 n
+0000001351 00000 n
+0000001379 00000 n
+0000075196 00000 n
+0000931153 00000 n
+0000001429 00000 n
+0000001470 00000 n
+0000079816 00000 n
+0000931079 00000 n
+0000001520 00000 n
+0000001576 00000 n
+0000093450 00000 n
+0000930953 00000 n
+0000001623 00000 n
+0000001668 00000 n
+0000093511 00000 n
+0000930879 00000 n
+0000001718 00000 n
+0000001752 00000 n
+0000095367 00000 n
+0000930805 00000 n
+0000001802 00000 n
+0000001839 00000 n
+0000107289 00000 n
+0000930716 00000 n
+0000001886 00000 n
+0000001918 00000 n
+0000122875 00000 n
+0000930587 00000 n
+0000001965 00000 n
+0000002003 00000 n
+0000122936 00000 n
+0000930509 00000 n
+0000002054 00000 n
+0000002098 00000 n
+0000126572 00000 n
+0000930417 00000 n
+0000002149 00000 n
+0000002176 00000 n
+0000126634 00000 n
+0000930286 00000 n
+0000002227 00000 n
+0000002277 00000 n
+0000130399 00000 n
+0000930207 00000 n
+0000002331 00000 n
+0000002379 00000 n
+0000130523 00000 n
+0000930128 00000 n
+0000002433 00000 n
+0000002472 00000 n
+0000133368 00000 n
+0000930036 00000 n
+0000002523 00000 n
+0000002564 00000 n
+0000133430 00000 n
+0000929905 00000 n
+0000002615 00000 n
+0000002642 00000 n
+0000133492 00000 n
+0000929826 00000 n
+0000002696 00000 n
+0000002722 00000 n
+0000137220 00000 n
+0000929733 00000 n
+0000002776 00000 n
+0000002808 00000 n
+0000140596 00000 n
+0000929640 00000 n
+0000002862 00000 n
+0000002899 00000 n
+0000140658 00000 n
+0000929561 00000 n
+0000002953 00000 n
+0000002985 00000 n
+0000140720 00000 n
+0000929469 00000 n
+0000003036 00000 n
+0000003079 00000 n
+0000147838 00000 n
+0000929337 00000 n
+0000003130 00000 n
+0000003161 00000 n
+0000157377 00000 n
+0000929258 00000 n
+0000003215 00000 n
+0000003241 00000 n
+0000163035 00000 n
+0000929165 00000 n
+0000003295 00000 n
+0000003322 00000 n
+0000165602 00000 n
+0000929072 00000 n
+0000003376 00000 n
+0000003401 00000 n
+0000165664 00000 n
+0000928979 00000 n
+0000003455 00000 n
+0000003480 00000 n
+0000168170 00000 n
+0000928886 00000 n
+0000003534 00000 n
+0000003561 00000 n
+0000168232 00000 n
+0000928793 00000 n
+0000003615 00000 n
+0000003643 00000 n
+0000170292 00000 n
+0000928700 00000 n
+0000003697 00000 n
+0000003723 00000 n
+0000172990 00000 n
+0000928607 00000 n
+0000003777 00000 n
+0000003804 00000 n
+0000173052 00000 n
+0000928514 00000 n
+0000003858 00000 n
+0000003884 00000 n
+0000177388 00000 n
+0000928421 00000 n
+0000003938 00000 n
+0000003966 00000 n
+0000177450 00000 n
+0000928328 00000 n
+0000004020 00000 n
+0000004045 00000 n
+0000179882 00000 n
+0000928235 00000 n
+0000004099 00000 n
+0000004127 00000 n
+0000183185 00000 n
+0000928142 00000 n
+0000004181 00000 n
+0000004220 00000 n
+0000191068 00000 n
+0000928063 00000 n
+0000004274 00000 n
+0000004318 00000 n
+0000195697 00000 n
+0000927985 00000 n
+0000004369 00000 n
+0000004402 00000 n
+0000203986 00000 n
+0000927892 00000 n
+0000004450 00000 n
+0000004490 00000 n
+0000212386 00000 n
+0000927759 00000 n
+0000004538 00000 n
+0000004585 00000 n
+0000212448 00000 n
+0000927641 00000 n
+0000004636 00000 n
+0000004669 00000 n
+0000212510 00000 n
+0000927562 00000 n
+0000004723 00000 n
+0000004751 00000 n
+0000215589 00000 n
+0000927469 00000 n
+0000004805 00000 n
+0000004831 00000 n
+0000215651 00000 n
+0000927390 00000 n
+0000004885 00000 n
+0000004914 00000 n
+0000218682 00000 n
+0000927258 00000 n
+0000004965 00000 n
+0000005001 00000 n
+0000218744 00000 n
+0000927179 00000 n
+0000005055 00000 n
+0000005078 00000 n
+0000222097 00000 n
+0000927086 00000 n
+0000005132 00000 n
+0000005159 00000 n
+0000225139 00000 n
+0000926993 00000 n
+0000005213 00000 n
+0000005240 00000 n
+0000228191 00000 n
+0000926900 00000 n
+0000005294 00000 n
+0000005320 00000 n
+0000230991 00000 n
+0000926807 00000 n
+0000005374 00000 n
+0000005398 00000 n
+0000234602 00000 n
+0000926728 00000 n
+0000005452 00000 n
+0000005480 00000 n
+0000237945 00000 n
+0000926596 00000 n
+0000005531 00000 n
+0000005577 00000 n
+0000238007 00000 n
+0000926517 00000 n
+0000005631 00000 n
+0000005655 00000 n
+0000244750 00000 n
+0000926438 00000 n
+0000005709 00000 n
+0000005733 00000 n
+0000250293 00000 n
+0000926306 00000 n
+0000005784 00000 n
+0000005834 00000 n
+0000250355 00000 n
+0000926227 00000 n
+0000005888 00000 n
+0000005920 00000 n
+0000254282 00000 n
+0000926148 00000 n
+0000005974 00000 n
+0000006006 00000 n
+0000260970 00000 n
+0000926016 00000 n
+0000006057 00000 n
+0000006082 00000 n
+0000261032 00000 n
+0000925937 00000 n
+0000006136 00000 n
+0000006160 00000 n
+0000298456 00000 n
+0000925858 00000 n
+0000006215 00000 n
+0000006240 00000 n
+0000324848 00000 n
+0000925726 00000 n
+0000006292 00000 n
+0000006320 00000 n
+0000328056 00000 n
+0000925647 00000 n
+0000006375 00000 n
+0000006421 00000 n
+0000331751 00000 n
+0000925554 00000 n
+0000006476 00000 n
+0000006535 00000 n
+0000334522 00000 n
+0000925461 00000 n
+0000006590 00000 n
+0000006628 00000 n
+0000334585 00000 n
+0000925382 00000 n
+0000006683 00000 n
+0000006717 00000 n
+0000337835 00000 n
+0000925303 00000 n
+0000006769 00000 n
+0000006813 00000 n
+0000416732 00000 n
+0000925170 00000 n
+0000006862 00000 n
+0000006902 00000 n
+0000416795 00000 n
+0000925052 00000 n
+0000006954 00000 n
+0000006995 00000 n
+0000416858 00000 n
+0000924973 00000 n
+0000007050 00000 n
+0000007081 00000 n
+0000423429 00000 n
+0000924880 00000 n
+0000007136 00000 n
+0000007179 00000 n
+0000423492 00000 n
+0000924787 00000 n
+0000007234 00000 n
+0000007267 00000 n
+0000423554 00000 n
+0000924694 00000 n
+0000007322 00000 n
+0000007358 00000 n
+0000423616 00000 n
+0000924601 00000 n
+0000007413 00000 n
+0000007455 00000 n
+0000426196 00000 n
+0000924508 00000 n
+0000007510 00000 n
+0000007550 00000 n
+0000426259 00000 n
+0000924415 00000 n
+0000007605 00000 n
+0000007644 00000 n
+0000429339 00000 n
+0000924336 00000 n
+0000007699 00000 n
+0000007745 00000 n
+0000429402 00000 n
+0000924257 00000 n
+0000007797 00000 n
+0000007829 00000 n
+0000432444 00000 n
+0000924124 00000 n
+0000007878 00000 n
+0000007935 00000 n
+0000432507 00000 n
+0000924006 00000 n
+0000007987 00000 n
+0000008060 00000 n
+0000432570 00000 n
+0000923927 00000 n
+0000008115 00000 n
+0000008170 00000 n
+0000434466 00000 n
+0000923848 00000 n
+0000008225 00000 n
+0000008287 00000 n
+0000434529 00000 n
+0000923769 00000 n
+0000008339 00000 n
+0000008397 00000 n
+0000443179 00000 n
+0000923636 00000 n
+0000008446 00000 n
+0000008496 00000 n
+0000443242 00000 n
+0000923557 00000 n
+0000008548 00000 n
+0000008595 00000 n
+0000443305 00000 n
+0000923464 00000 n
+0000008647 00000 n
+0000008683 00000 n
+0000443368 00000 n
+0000923385 00000 n
+0000008735 00000 n
+0000008763 00000 n
+0000446858 00000 n
+0000923291 00000 n
+0000008812 00000 n
+0000008867 00000 n
+0000453062 00000 n
+0000923197 00000 n
+0000008916 00000 n
+0000008965 00000 n
+0000453125 00000 n
+0000923103 00000 n
+0000009015 00000 n
+0000009045 00000 n
+0000455497 00000 n
+0000923009 00000 n
+0000009095 00000 n
+0000009130 00000 n
+0000462449 00000 n
+0000922915 00000 n
+0000009180 00000 n
+0000009210 00000 n
+0000499558 00000 n
+0000922835 00000 n
+0000009260 00000 n
+0000009285 00000 n
+0000017443 00000 n
+0000018663 00000 n
+0000009337 00000 n
+0000018417 00000 n
+0000018479 00000 n
+0000918876 00000 n
+0000914856 00000 n
+0000918713 00000 n
+0000914217 00000 n
+0000911161 00000 n
+0000908318 00000 n
+0000910998 00000 n
+0000907359 00000 n
+0000900433 00000 n
+0000907196 00000 n
+0000899704 00000 n
+0000894430 00000 n
+0000899540 00000 n
+0000893822 00000 n
+0000890623 00000 n
+0000876711 00000 n
+0000890459 00000 n
+0000875038 00000 n
+0000857100 00000 n
+0000874876 00000 n
+0000017614 00000 n
+0000855982 00000 n
+0000844707 00000 n
+0000855818 00000 n
+0000018601 00000 n
+0000017783 00000 n
+0000843537 00000 n
+0000831163 00000 n
+0000843373 00000 n
+0000017940 00000 n
+0000830445 00000 n
+0000018099 00000 n
+0000018258 00000 n
+0000827392 00000 n
+0000825819 00000 n
+0000827232 00000 n
+0000824807 00000 n
+0000816902 00000 n
+0000824645 00000 n
+0000816264 00000 n
+0000919423 00000 n
+0000463083 00000 n
+0000028856 00000 n
+0000020856 00000 n
+0000018915 00000 n
+0000028794 00000 n
+0000021355 00000 n
+0000021514 00000 n
+0000021677 00000 n
+0000021840 00000 n
+0000022003 00000 n
+0000022167 00000 n
+0000022330 00000 n
+0000022494 00000 n
+0000022658 00000 n
+0000022818 00000 n
+0000022976 00000 n
+0000023136 00000 n
+0000023296 00000 n
+0000023456 00000 n
+0000023614 00000 n
+0000023774 00000 n
+0000023934 00000 n
+0000024092 00000 n
+0000024250 00000 n
+0000024406 00000 n
+0000024566 00000 n
+0000024725 00000 n
+0000813131 00000 n
+0000797335 00000 n
+0000812967 00000 n
+0000024889 00000 n
+0000025053 00000 n
+0000025213 00000 n
+0000025372 00000 n
+0000025536 00000 n
+0000025699 00000 n
+0000025863 00000 n
+0000026025 00000 n
+0000026185 00000 n
+0000026345 00000 n
+0000026509 00000 n
+0000026672 00000 n
+0000026836 00000 n
+0000027000 00000 n
+0000027164 00000 n
+0000027327 00000 n
+0000027491 00000 n
+0000027655 00000 n
+0000027819 00000 n
+0000027982 00000 n
+0000028145 00000 n
+0000028308 00000 n
+0000028472 00000 n
+0000028636 00000 n
+0000038798 00000 n
+0000031097 00000 n
+0000028953 00000 n
+0000038736 00000 n
+0000031580 00000 n
+0000031738 00000 n
+0000031895 00000 n
+0000032055 00000 n
+0000032218 00000 n
+0000032382 00000 n
+0000032545 00000 n
+0000032705 00000 n
+0000032869 00000 n
+0000033033 00000 n
+0000033196 00000 n
+0000033360 00000 n
+0000033524 00000 n
+0000033687 00000 n
+0000033847 00000 n
+0000034010 00000 n
+0000034174 00000 n
+0000034333 00000 n
+0000034497 00000 n
+0000034660 00000 n
+0000034820 00000 n
+0000034984 00000 n
+0000035149 00000 n
+0000035310 00000 n
+0000035475 00000 n
+0000035639 00000 n
+0000035804 00000 n
+0000035969 00000 n
+0000036129 00000 n
+0000036288 00000 n
+0000036448 00000 n
+0000036613 00000 n
+0000036778 00000 n
+0000036943 00000 n
+0000037107 00000 n
+0000037271 00000 n
+0000037436 00000 n
+0000037601 00000 n
+0000037766 00000 n
+0000037927 00000 n
+0000038086 00000 n
+0000038247 00000 n
+0000038411 00000 n
+0000038575 00000 n
+0000041592 00000 n
+0000039723 00000 n
+0000038908 00000 n
+0000041530 00000 n
+0000039934 00000 n
+0000040092 00000 n
+0000040253 00000 n
+0000040414 00000 n
+0000040574 00000 n
+0000796649 00000 n
+0000040732 00000 n
+0000040891 00000 n
+0000041051 00000 n
+0000041211 00000 n
+0000041371 00000 n
+0000045484 00000 n
+0000044485 00000 n
+0000041702 00000 n
+0000045300 00000 n
+0000044648 00000 n
+0000044810 00000 n
+0000044973 00000 n
+0000045138 00000 n
+0000793699 00000 n
+0000462766 00000 n
+0000462829 00000 n
+0000462576 00000 n
+0000463020 00000 n
+0000048703 00000 n
+0000048462 00000 n
+0000045620 00000 n
+0000048581 00000 n
+0000052257 00000 n
+0000052015 00000 n
+0000048839 00000 n
+0000052134 00000 n
+0000790438 00000 n
+0000782233 00000 n
+0000790274 00000 n
+0000780745 00000 n
+0000765429 00000 n
+0000780582 00000 n
+0000919541 00000 n
+0000057824 00000 n
+0000057280 00000 n
+0000052406 00000 n
+0000057578 00000 n
+0000057419 00000 n
+0000764983 00000 n
+0000762127 00000 n
+0000764822 00000 n
+0000761777 00000 n
+0000759368 00000 n
+0000761616 00000 n
+0000057762 00000 n
+0000061390 00000 n
+0000060905 00000 n
+0000057985 00000 n
+0000061206 00000 n
+0000061044 00000 n
+0000064980 00000 n
+0000064677 00000 n
+0000061500 00000 n
+0000064796 00000 n
+0000068245 00000 n
+0000067524 00000 n
+0000065090 00000 n
+0000068000 00000 n
+0000067671 00000 n
+0000067836 00000 n
+0000071382 00000 n
+0000071079 00000 n
+0000068368 00000 n
+0000071198 00000 n
+0000073547 00000 n
+0000073366 00000 n
+0000071531 00000 n
+0000073485 00000 n
+0000919659 00000 n
+0000075257 00000 n
+0000075015 00000 n
+0000073631 00000 n
+0000075134 00000 n
+0000076919 00000 n
+0000076738 00000 n
+0000075354 00000 n
+0000076857 00000 n
+0000079877 00000 n
+0000079635 00000 n
+0000077003 00000 n
+0000079754 00000 n
+0000081928 00000 n
+0000081747 00000 n
+0000079974 00000 n
+0000081866 00000 n
+0000085030 00000 n
+0000084607 00000 n
+0000082012 00000 n
+0000084906 00000 n
+0000084746 00000 n
+0000084968 00000 n
+0000087228 00000 n
+0000087047 00000 n
+0000085165 00000 n
+0000087166 00000 n
+0000919777 00000 n
+0000090092 00000 n
+0000089911 00000 n
+0000087312 00000 n
+0000090030 00000 n
+0000093572 00000 n
+0000093269 00000 n
+0000090176 00000 n
+0000093388 00000 n
+0000095428 00000 n
+0000095186 00000 n
+0000093682 00000 n
+0000095305 00000 n
+0000098318 00000 n
+0000098137 00000 n
+0000095538 00000 n
+0000098256 00000 n
+0000100800 00000 n
+0000100619 00000 n
+0000098415 00000 n
+0000100738 00000 n
+0000103135 00000 n
+0000102954 00000 n
+0000100884 00000 n
+0000103073 00000 n
+0000919895 00000 n
+0000105255 00000 n
+0000105074 00000 n
+0000103245 00000 n
+0000105193 00000 n
+0000107350 00000 n
+0000107108 00000 n
+0000105352 00000 n
+0000107227 00000 n
+0000110512 00000 n
+0000110331 00000 n
+0000107472 00000 n
+0000110450 00000 n
+0000113670 00000 n
+0000113427 00000 n
+0000110596 00000 n
+0000113546 00000 n
+0000113608 00000 n
+0000116441 00000 n
+0000116198 00000 n
+0000113767 00000 n
+0000116317 00000 n
+0000116379 00000 n
+0000119734 00000 n
+0000119553 00000 n
+0000116538 00000 n
+0000119672 00000 n
+0000920013 00000 n
+0000122998 00000 n
+0000122694 00000 n
+0000119844 00000 n
+0000122813 00000 n
+0000126696 00000 n
+0000126391 00000 n
+0000123121 00000 n
+0000126510 00000 n
+0000130585 00000 n
+0000130034 00000 n
+0000126819 00000 n
+0000130337 00000 n
+0000130461 00000 n
+0000130173 00000 n
+0000133554 00000 n
+0000133187 00000 n
+0000130721 00000 n
+0000133306 00000 n
+0000137282 00000 n
+0000136862 00000 n
+0000133677 00000 n
+0000137158 00000 n
+0000137001 00000 n
+0000140782 00000 n
+0000140238 00000 n
+0000137405 00000 n
+0000140534 00000 n
+0000140377 00000 n
+0000920131 00000 n
+0000144381 00000 n
+0000144019 00000 n
+0000140931 00000 n
+0000144319 00000 n
+0000144158 00000 n
+0000147900 00000 n
+0000147472 00000 n
+0000144478 00000 n
+0000147776 00000 n
+0000147611 00000 n
+0000151635 00000 n
+0000151279 00000 n
+0000148023 00000 n
+0000151573 00000 n
+0000151418 00000 n
+0000154245 00000 n
+0000154307 00000 n
+0000154064 00000 n
+0000151745 00000 n
+0000154183 00000 n
+0000157439 00000 n
+0000157011 00000 n
+0000154417 00000 n
+0000157315 00000 n
+0000157150 00000 n
+0000463466 00000 n
+0000160265 00000 n
+0000160084 00000 n
+0000157562 00000 n
+0000160203 00000 n
+0000920249 00000 n
+0000163097 00000 n
+0000162854 00000 n
+0000160375 00000 n
+0000162973 00000 n
+0000165726 00000 n
+0000165421 00000 n
+0000163233 00000 n
+0000165540 00000 n
+0000168294 00000 n
+0000167989 00000 n
+0000165849 00000 n
+0000168108 00000 n
+0000170354 00000 n
+0000170111 00000 n
+0000168417 00000 n
+0000170230 00000 n
+0000173114 00000 n
+0000172809 00000 n
+0000170490 00000 n
+0000172928 00000 n
+0000174897 00000 n
+0000174716 00000 n
+0000173237 00000 n
+0000174835 00000 n
+0000920367 00000 n
+0000177512 00000 n
+0000177207 00000 n
+0000174994 00000 n
+0000177326 00000 n
+0000179944 00000 n
+0000179701 00000 n
+0000177635 00000 n
+0000179820 00000 n
+0000183247 00000 n
+0000183004 00000 n
+0000180067 00000 n
+0000183123 00000 n
+0000191130 00000 n
+0000190887 00000 n
+0000183409 00000 n
+0000191006 00000 n
+0000195759 00000 n
+0000195174 00000 n
+0000191240 00000 n
+0000195635 00000 n
+0000195321 00000 n
+0000195478 00000 n
+0000389073 00000 n
+0000404656 00000 n
+0000199649 00000 n
+0000198898 00000 n
+0000195895 00000 n
+0000199525 00000 n
+0000199053 00000 n
+0000199587 00000 n
+0000199209 00000 n
+0000199367 00000 n
+0000920485 00000 n
+0000398480 00000 n
+0000339966 00000 n
+0000204110 00000 n
+0000202969 00000 n
+0000199785 00000 n
+0000203924 00000 n
+0000203140 00000 n
+0000203297 00000 n
+0000203454 00000 n
+0000203611 00000 n
+0000203768 00000 n
+0000204048 00000 n
+0000206601 00000 n
+0000209251 00000 n
+0000209313 00000 n
+0000206540 00000 n
+0000206663 00000 n
+0000206359 00000 n
+0000204272 00000 n
+0000206478 00000 n
+0000209375 00000 n
+0000209070 00000 n
+0000206760 00000 n
+0000209189 00000 n
+0000212633 00000 n
+0000212205 00000 n
+0000209472 00000 n
+0000212324 00000 n
+0000212572 00000 n
+0000215712 00000 n
+0000215408 00000 n
+0000212795 00000 n
+0000215527 00000 n
+0000218806 00000 n
+0000218440 00000 n
+0000215835 00000 n
+0000218559 00000 n
+0000218621 00000 n
+0000920603 00000 n
+0000222159 00000 n
+0000221792 00000 n
+0000218968 00000 n
+0000221911 00000 n
+0000221973 00000 n
+0000222035 00000 n
+0000225201 00000 n
+0000224718 00000 n
+0000222321 00000 n
+0000225015 00000 n
+0000224857 00000 n
+0000225077 00000 n
+0000228315 00000 n
+0000227949 00000 n
+0000225324 00000 n
+0000228068 00000 n
+0000228130 00000 n
+0000228253 00000 n
+0000231053 00000 n
+0000230748 00000 n
+0000228477 00000 n
+0000230867 00000 n
+0000230929 00000 n
+0000234664 00000 n
+0000234359 00000 n
+0000231202 00000 n
+0000234478 00000 n
+0000234540 00000 n
+0000238069 00000 n
+0000237702 00000 n
+0000234787 00000 n
+0000237821 00000 n
+0000237883 00000 n
+0000920721 00000 n
+0000241452 00000 n
+0000241271 00000 n
+0000238241 00000 n
+0000241390 00000 n
+0000244812 00000 n
+0000244507 00000 n
+0000241586 00000 n
+0000244626 00000 n
+0000244688 00000 n
+0000248104 00000 n
+0000247861 00000 n
+0000244972 00000 n
+0000247980 00000 n
+0000248042 00000 n
+0000250479 00000 n
+0000249937 00000 n
+0000248264 00000 n
+0000250231 00000 n
+0000250417 00000 n
+0000250076 00000 n
+0000254222 00000 n
+0000254344 00000 n
+0000254041 00000 n
+0000250615 00000 n
+0000254160 00000 n
+0000261094 00000 n
+0000260444 00000 n
+0000254467 00000 n
+0000260908 00000 n
+0000260591 00000 n
+0000260749 00000 n
+0000920839 00000 n
+0000264520 00000 n
+0000264339 00000 n
+0000261217 00000 n
+0000264458 00000 n
+0000267913 00000 n
+0000267732 00000 n
+0000264642 00000 n
+0000267851 00000 n
+0000271631 00000 n
+0000271450 00000 n
+0000268022 00000 n
+0000271569 00000 n
+0000275746 00000 n
+0000275565 00000 n
+0000271753 00000 n
+0000275684 00000 n
+0000280588 00000 n
+0000280407 00000 n
+0000275855 00000 n
+0000280526 00000 n
+0000286127 00000 n
+0000285314 00000 n
+0000280697 00000 n
+0000285942 00000 n
+0000286004 00000 n
+0000285469 00000 n
+0000285624 00000 n
+0000285784 00000 n
+0000286065 00000 n
+0000920957 00000 n
+0000289085 00000 n
+0000378070 00000 n
+0000289147 00000 n
+0000288904 00000 n
+0000286275 00000 n
+0000289023 00000 n
+0000293837 00000 n
+0000293064 00000 n
+0000289257 00000 n
+0000293713 00000 n
+0000293221 00000 n
+0000293775 00000 n
+0000293383 00000 n
+0000758683 00000 n
+0000753984 00000 n
+0000758519 00000 n
+0000293550 00000 n
+0000298582 00000 n
+0000297795 00000 n
+0000293987 00000 n
+0000298264 00000 n
+0000298328 00000 n
+0000297947 00000 n
+0000298392 00000 n
+0000298105 00000 n
+0000298519 00000 n
+0000402272 00000 n
+0000301761 00000 n
+0000301575 00000 n
+0000298771 00000 n
+0000301697 00000 n
+0000305558 00000 n
+0000304962 00000 n
+0000301898 00000 n
+0000305430 00000 n
+0000305114 00000 n
+0000305494 00000 n
+0000305273 00000 n
+0000317768 00000 n
+0000307997 00000 n
+0000308061 00000 n
+0000307810 00000 n
+0000305759 00000 n
+0000307933 00000 n
+0000921078 00000 n
+0000317832 00000 n
+0000317233 00000 n
+0000308159 00000 n
+0000317704 00000 n
+0000753465 00000 n
+0000750133 00000 n
+0000753300 00000 n
+0000749793 00000 n
+0000748156 00000 n
+0000749629 00000 n
+0000317386 00000 n
+0000317545 00000 n
+0000319922 00000 n
+0000321425 00000 n
+0000319986 00000 n
+0000319555 00000 n
+0000317983 00000 n
+0000319858 00000 n
+0000319699 00000 n
+0000321489 00000 n
+0000321059 00000 n
+0000320071 00000 n
+0000321361 00000 n
+0000321203 00000 n
+0000324911 00000 n
+0000324661 00000 n
+0000321574 00000 n
+0000324784 00000 n
+0000747735 00000 n
+0000745620 00000 n
+0000747569 00000 n
+0000328119 00000 n
+0000327869 00000 n
+0000325100 00000 n
+0000327992 00000 n
+0000331814 00000 n
+0000331564 00000 n
+0000328371 00000 n
+0000331687 00000 n
+0000921203 00000 n
+0000334712 00000 n
+0000333988 00000 n
+0000332027 00000 n
+0000334458 00000 n
+0000334141 00000 n
+0000334300 00000 n
+0000334648 00000 n
+0000337898 00000 n
+0000337648 00000 n
+0000334836 00000 n
+0000337771 00000 n
+0000340029 00000 n
+0000339591 00000 n
+0000338022 00000 n
+0000339902 00000 n
+0000339735 00000 n
+0000343191 00000 n
+0000342756 00000 n
+0000340154 00000 n
+0000343063 00000 n
+0000343127 00000 n
+0000342900 00000 n
+0000345715 00000 n
+0000345040 00000 n
+0000343290 00000 n
+0000345524 00000 n
+0000345588 00000 n
+0000345193 00000 n
+0000345651 00000 n
+0000345360 00000 n
+0000349954 00000 n
+0000349278 00000 n
+0000345853 00000 n
+0000349762 00000 n
+0000349826 00000 n
+0000349431 00000 n
+0000349890 00000 n
+0000349595 00000 n
+0000921328 00000 n
+0000353708 00000 n
+0000352793 00000 n
+0000350118 00000 n
+0000353454 00000 n
+0000353518 00000 n
+0000352955 00000 n
+0000745079 00000 n
+0000741243 00000 n
+0000744914 00000 n
+0000353580 00000 n
+0000353121 00000 n
+0000353644 00000 n
+0000353287 00000 n
+0000356528 00000 n
+0000356090 00000 n
+0000353847 00000 n
+0000356400 00000 n
+0000356464 00000 n
+0000356234 00000 n
+0000360314 00000 n
+0000359639 00000 n
+0000356639 00000 n
+0000360122 00000 n
+0000360186 00000 n
+0000359792 00000 n
+0000360250 00000 n
+0000359955 00000 n
+0000363594 00000 n
+0000362916 00000 n
+0000360426 00000 n
+0000363403 00000 n
+0000363467 00000 n
+0000363069 00000 n
+0000363531 00000 n
+0000363236 00000 n
+0000369329 00000 n
+0000368410 00000 n
+0000363757 00000 n
+0000369073 00000 n
+0000369137 00000 n
+0000368572 00000 n
+0000369201 00000 n
+0000368739 00000 n
+0000369265 00000 n
+0000368906 00000 n
+0000374266 00000 n
+0000373590 00000 n
+0000369479 00000 n
+0000374074 00000 n
+0000374138 00000 n
+0000373743 00000 n
+0000374202 00000 n
+0000373910 00000 n
+0000921453 00000 n
+0000378133 00000 n
+0000377455 00000 n
+0000374404 00000 n
+0000377942 00000 n
+0000378006 00000 n
+0000377608 00000 n
+0000377775 00000 n
+0000382411 00000 n
+0000381732 00000 n
+0000378282 00000 n
+0000382219 00000 n
+0000382283 00000 n
+0000381885 00000 n
+0000382347 00000 n
+0000382052 00000 n
+0000385562 00000 n
+0000384885 00000 n
+0000382522 00000 n
+0000385370 00000 n
+0000385434 00000 n
+0000385038 00000 n
+0000385498 00000 n
+0000385205 00000 n
+0000389199 00000 n
+0000388524 00000 n
+0000385673 00000 n
+0000389009 00000 n
+0000388677 00000 n
+0000389135 00000 n
+0000388842 00000 n
+0000390828 00000 n
+0000390390 00000 n
+0000389310 00000 n
+0000390701 00000 n
+0000390765 00000 n
+0000390534 00000 n
+0000396713 00000 n
+0000396275 00000 n
+0000390926 00000 n
+0000396585 00000 n
+0000396649 00000 n
+0000396419 00000 n
+0000921578 00000 n
+0000398543 00000 n
+0000398293 00000 n
+0000396837 00000 n
+0000398416 00000 n
+0000402336 00000 n
+0000401897 00000 n
+0000398628 00000 n
+0000402208 00000 n
+0000402041 00000 n
+0000404783 00000 n
+0000404281 00000 n
+0000402421 00000 n
+0000404592 00000 n
+0000404719 00000 n
+0000404425 00000 n
+0000413637 00000 n
+0000413387 00000 n
+0000404881 00000 n
+0000413510 00000 n
+0000413574 00000 n
+0000416921 00000 n
+0000416545 00000 n
+0000413747 00000 n
+0000416668 00000 n
+0000420798 00000 n
+0000420611 00000 n
+0000417084 00000 n
+0000420734 00000 n
+0000921703 00000 n
+0000423679 00000 n
+0000423059 00000 n
+0000420935 00000 n
+0000423365 00000 n
+0000423203 00000 n
+0000426322 00000 n
+0000426009 00000 n
+0000423816 00000 n
+0000426132 00000 n
+0000429465 00000 n
+0000429152 00000 n
+0000426459 00000 n
+0000429275 00000 n
+0000432633 00000 n
+0000432257 00000 n
+0000429589 00000 n
+0000432380 00000 n
+0000434592 00000 n
+0000434279 00000 n
+0000432770 00000 n
+0000434402 00000 n
+0000439459 00000 n
+0000439029 00000 n
+0000434703 00000 n
+0000439332 00000 n
+0000439173 00000 n
+0000439396 00000 n
+0000921828 00000 n
+0000443430 00000 n
+0000442808 00000 n
+0000439544 00000 n
+0000443115 00000 n
+0000442952 00000 n
+0000446985 00000 n
+0000446671 00000 n
+0000443580 00000 n
+0000446794 00000 n
+0000740555 00000 n
+0000446921 00000 n
+0000453188 00000 n
+0000451135 00000 n
+0000447148 00000 n
+0000452998 00000 n
+0000451360 00000 n
+0000451520 00000 n
+0000451683 00000 n
+0000451846 00000 n
+0000452005 00000 n
+0000452169 00000 n
+0000452341 00000 n
+0000452504 00000 n
+0000452666 00000 n
+0000452832 00000 n
+0000463274 00000 n
+0000462639 00000 n
+0000462702 00000 n
+0000463338 00000 n
+0000465261 00000 n
+0000462512 00000 n
+0000463402 00000 n
+0000463146 00000 n
+0000463210 00000 n
+0000455560 00000 n
+0000454952 00000 n
+0000453325 00000 n
+0000455433 00000 n
+0000455105 00000 n
+0000455268 00000 n
+0000462892 00000 n
+0000462956 00000 n
+0000463529 00000 n
+0000458805 00000 n
+0000455671 00000 n
+0000462385 00000 n
+0000459084 00000 n
+0000459310 00000 n
+0000737576 00000 n
+0000735601 00000 n
+0000737412 00000 n
+0000459536 00000 n
+0000459724 00000 n
+0000459912 00000 n
+0000460113 00000 n
+0000460315 00000 n
+0000460497 00000 n
+0000460680 00000 n
+0000460862 00000 n
+0000461045 00000 n
+0000461284 00000 n
+0000461523 00000 n
+0000461741 00000 n
+0000461959 00000 n
+0000462172 00000 n
+0000465325 00000 n
+0000464354 00000 n
+0000463692 00000 n
+0000465133 00000 n
+0000465197 00000 n
+0000464516 00000 n
+0000464699 00000 n
+0000464916 00000 n
+0000921953 00000 n
+0000499620 00000 n
+0000468231 00000 n
+0000465423 00000 n
+0000499494 00000 n
+0000470067 00000 n
+0000470220 00000 n
+0000470376 00000 n
+0000470532 00000 n
+0000470688 00000 n
+0000470843 00000 n
+0000470999 00000 n
+0000471154 00000 n
+0000471309 00000 n
+0000471465 00000 n
+0000471621 00000 n
+0000471777 00000 n
+0000471933 00000 n
+0000472089 00000 n
+0000472245 00000 n
+0000472401 00000 n
+0000472557 00000 n
+0000472713 00000 n
+0000472869 00000 n
+0000473026 00000 n
+0000473182 00000 n
+0000473338 00000 n
+0000473494 00000 n
+0000473650 00000 n
+0000473805 00000 n
+0000473961 00000 n
+0000474117 00000 n
+0000474273 00000 n
+0000474428 00000 n
+0000474584 00000 n
+0000474740 00000 n
+0000474894 00000 n
+0000475048 00000 n
+0000475202 00000 n
+0000475358 00000 n
+0000475515 00000 n
+0000475670 00000 n
+0000475825 00000 n
+0000475980 00000 n
+0000476135 00000 n
+0000476291 00000 n
+0000476447 00000 n
+0000476603 00000 n
+0000476759 00000 n
+0000476914 00000 n
+0000477071 00000 n
+0000477227 00000 n
+0000477381 00000 n
+0000477536 00000 n
+0000477692 00000 n
+0000477847 00000 n
+0000478003 00000 n
+0000478159 00000 n
+0000478314 00000 n
+0000478469 00000 n
+0000478625 00000 n
+0000478780 00000 n
+0000478935 00000 n
+0000479090 00000 n
+0000479245 00000 n
+0000479401 00000 n
+0000479556 00000 n
+0000479712 00000 n
+0000479868 00000 n
+0000480023 00000 n
+0000480179 00000 n
+0000480335 00000 n
+0000480491 00000 n
+0000480646 00000 n
+0000480801 00000 n
+0000480957 00000 n
+0000481112 00000 n
+0000481266 00000 n
+0000481422 00000 n
+0000481577 00000 n
+0000481734 00000 n
+0000481890 00000 n
+0000482046 00000 n
+0000482202 00000 n
+0000482357 00000 n
+0000482513 00000 n
+0000482668 00000 n
+0000482824 00000 n
+0000482980 00000 n
+0000483136 00000 n
+0000483290 00000 n
+0000483446 00000 n
+0000483601 00000 n
+0000483756 00000 n
+0000483912 00000 n
+0000484068 00000 n
+0000484224 00000 n
+0000484380 00000 n
+0000484535 00000 n
+0000484690 00000 n
+0000484844 00000 n
+0000485000 00000 n
+0000485156 00000 n
+0000485312 00000 n
+0000485469 00000 n
+0000485625 00000 n
+0000485781 00000 n
+0000485937 00000 n
+0000486093 00000 n
+0000486248 00000 n
+0000486403 00000 n
+0000486558 00000 n
+0000486714 00000 n
+0000486870 00000 n
+0000487025 00000 n
+0000487181 00000 n
+0000487337 00000 n
+0000487493 00000 n
+0000487649 00000 n
+0000487804 00000 n
+0000487960 00000 n
+0000488116 00000 n
+0000488272 00000 n
+0000488427 00000 n
+0000488583 00000 n
+0000488739 00000 n
+0000488895 00000 n
+0000489051 00000 n
+0000489207 00000 n
+0000489363 00000 n
+0000489519 00000 n
+0000489675 00000 n
+0000489831 00000 n
+0000489987 00000 n
+0000490143 00000 n
+0000490299 00000 n
+0000490455 00000 n
+0000490611 00000 n
+0000490767 00000 n
+0000490924 00000 n
+0000491080 00000 n
+0000491236 00000 n
+0000491392 00000 n
+0000491548 00000 n
+0000491704 00000 n
+0000491860 00000 n
+0000492016 00000 n
+0000492171 00000 n
+0000492327 00000 n
+0000492482 00000 n
+0000492638 00000 n
+0000492794 00000 n
+0000492950 00000 n
+0000493105 00000 n
+0000493261 00000 n
+0000493417 00000 n
+0000493573 00000 n
+0000493729 00000 n
+0000493885 00000 n
+0000494041 00000 n
+0000494197 00000 n
+0000494353 00000 n
+0000494509 00000 n
+0000494665 00000 n
+0000494821 00000 n
+0000494977 00000 n
+0000495133 00000 n
+0000495289 00000 n
+0000495445 00000 n
+0000495600 00000 n
+0000495756 00000 n
+0000495911 00000 n
+0000496067 00000 n
+0000496222 00000 n
+0000496377 00000 n
+0000496533 00000 n
+0000496689 00000 n
+0000496845 00000 n
+0000497000 00000 n
+0000497156 00000 n
+0000497312 00000 n
+0000497468 00000 n
+0000497624 00000 n
+0000497780 00000 n
+0000497936 00000 n
+0000498092 00000 n
+0000498248 00000 n
+0000498403 00000 n
+0000498559 00000 n
+0000498715 00000 n
+0000498871 00000 n
+0000499027 00000 n
+0000499183 00000 n
+0000499339 00000 n
+0000540742 00000 n
+0000502835 00000 n
+0000499705 00000 n
+0000540678 00000 n
+0000505031 00000 n
+0000505187 00000 n
+0000505342 00000 n
+0000505498 00000 n
+0000505653 00000 n
+0000505809 00000 n
+0000505963 00000 n
+0000506117 00000 n
+0000506271 00000 n
+0000506425 00000 n
+0000506581 00000 n
+0000506737 00000 n
+0000506893 00000 n
+0000507049 00000 n
+0000507205 00000 n
+0000507359 00000 n
+0000507513 00000 n
+0000507667 00000 n
+0000507821 00000 n
+0000507977 00000 n
+0000508133 00000 n
+0000508287 00000 n
+0000508442 00000 n
+0000508597 00000 n
+0000508753 00000 n
+0000508909 00000 n
+0000509064 00000 n
+0000509220 00000 n
+0000509376 00000 n
+0000509532 00000 n
+0000509688 00000 n
+0000509844 00000 n
+0000509999 00000 n
+0000510156 00000 n
+0000510312 00000 n
+0000510468 00000 n
+0000510624 00000 n
+0000510780 00000 n
+0000510936 00000 n
+0000511092 00000 n
+0000511248 00000 n
+0000511404 00000 n
+0000511560 00000 n
+0000511717 00000 n
+0000511873 00000 n
+0000512029 00000 n
+0000512185 00000 n
+0000512340 00000 n
+0000512496 00000 n
+0000512652 00000 n
+0000512807 00000 n
+0000512963 00000 n
+0000513119 00000 n
+0000513273 00000 n
+0000513429 00000 n
+0000513584 00000 n
+0000513739 00000 n
+0000513894 00000 n
+0000514050 00000 n
+0000514205 00000 n
+0000514361 00000 n
+0000514517 00000 n
+0000514673 00000 n
+0000514829 00000 n
+0000514985 00000 n
+0000515141 00000 n
+0000515297 00000 n
+0000515453 00000 n
+0000515609 00000 n
+0000515765 00000 n
+0000515921 00000 n
+0000516077 00000 n
+0000516233 00000 n
+0000516389 00000 n
+0000516545 00000 n
+0000516701 00000 n
+0000516857 00000 n
+0000517013 00000 n
+0000517168 00000 n
+0000517323 00000 n
+0000517479 00000 n
+0000517635 00000 n
+0000517791 00000 n
+0000517946 00000 n
+0000518102 00000 n
+0000518259 00000 n
+0000518416 00000 n
+0000518571 00000 n
+0000518727 00000 n
+0000518883 00000 n
+0000519038 00000 n
+0000519193 00000 n
+0000519348 00000 n
+0000519504 00000 n
+0000519657 00000 n
+0000519811 00000 n
+0000519965 00000 n
+0000520119 00000 n
+0000520273 00000 n
+0000520426 00000 n
+0000520581 00000 n
+0000520735 00000 n
+0000520891 00000 n
+0000521047 00000 n
+0000521202 00000 n
+0000521359 00000 n
+0000521514 00000 n
+0000521669 00000 n
+0000521825 00000 n
+0000521981 00000 n
+0000522137 00000 n
+0000522293 00000 n
+0000522449 00000 n
+0000522605 00000 n
+0000522759 00000 n
+0000522915 00000 n
+0000523071 00000 n
+0000523227 00000 n
+0000523383 00000 n
+0000523539 00000 n
+0000523696 00000 n
+0000523852 00000 n
+0000524008 00000 n
+0000524162 00000 n
+0000524319 00000 n
+0000524474 00000 n
+0000524630 00000 n
+0000524784 00000 n
+0000524941 00000 n
+0000525098 00000 n
+0000525255 00000 n
+0000525410 00000 n
+0000525566 00000 n
+0000525722 00000 n
+0000525878 00000 n
+0000526034 00000 n
+0000526190 00000 n
+0000526345 00000 n
+0000526499 00000 n
+0000526654 00000 n
+0000526810 00000 n
+0000526965 00000 n
+0000527120 00000 n
+0000527275 00000 n
+0000527431 00000 n
+0000527587 00000 n
+0000527743 00000 n
+0000527898 00000 n
+0000528054 00000 n
+0000528210 00000 n
+0000528367 00000 n
+0000528522 00000 n
+0000528677 00000 n
+0000528832 00000 n
+0000528987 00000 n
+0000529143 00000 n
+0000529298 00000 n
+0000529454 00000 n
+0000529610 00000 n
+0000529766 00000 n
+0000529923 00000 n
+0000530079 00000 n
+0000530235 00000 n
+0000530391 00000 n
+0000530546 00000 n
+0000530701 00000 n
+0000530857 00000 n
+0000531013 00000 n
+0000531169 00000 n
+0000531325 00000 n
+0000531481 00000 n
+0000531637 00000 n
+0000531793 00000 n
+0000531949 00000 n
+0000532106 00000 n
+0000532263 00000 n
+0000532418 00000 n
+0000532574 00000 n
+0000532730 00000 n
+0000532886 00000 n
+0000533042 00000 n
+0000533197 00000 n
+0000533353 00000 n
+0000533509 00000 n
+0000533665 00000 n
+0000533820 00000 n
+0000533975 00000 n
+0000534131 00000 n
+0000534287 00000 n
+0000534443 00000 n
+0000534599 00000 n
+0000534755 00000 n
+0000534911 00000 n
+0000535067 00000 n
+0000535223 00000 n
+0000535379 00000 n
+0000535535 00000 n
+0000535690 00000 n
+0000535846 00000 n
+0000536002 00000 n
+0000536158 00000 n
+0000536314 00000 n
+0000536470 00000 n
+0000536625 00000 n
+0000536780 00000 n
+0000536935 00000 n
+0000537090 00000 n
+0000537246 00000 n
+0000537402 00000 n
+0000537557 00000 n
+0000537712 00000 n
+0000537867 00000 n
+0000538023 00000 n
+0000538180 00000 n
+0000538335 00000 n
+0000538491 00000 n
+0000538647 00000 n
+0000538803 00000 n
+0000538958 00000 n
+0000539113 00000 n
+0000539269 00000 n
+0000539425 00000 n
+0000539581 00000 n
+0000539738 00000 n
+0000539895 00000 n
+0000540052 00000 n
+0000540209 00000 n
+0000540366 00000 n
+0000540523 00000 n
+0000572091 00000 n
+0000543712 00000 n
+0000540814 00000 n
+0000572027 00000 n
+0000545386 00000 n
+0000545543 00000 n
+0000545699 00000 n
+0000545855 00000 n
+0000546010 00000 n
+0000546166 00000 n
+0000546322 00000 n
+0000546478 00000 n
+0000546634 00000 n
+0000546789 00000 n
+0000546945 00000 n
+0000547100 00000 n
+0000547256 00000 n
+0000547413 00000 n
+0000547569 00000 n
+0000547725 00000 n
+0000547881 00000 n
+0000548037 00000 n
+0000548193 00000 n
+0000548349 00000 n
+0000548505 00000 n
+0000548661 00000 n
+0000548817 00000 n
+0000548973 00000 n
+0000549129 00000 n
+0000549284 00000 n
+0000549440 00000 n
+0000549596 00000 n
+0000549752 00000 n
+0000549907 00000 n
+0000550063 00000 n
+0000550219 00000 n
+0000550375 00000 n
+0000550531 00000 n
+0000550687 00000 n
+0000550843 00000 n
+0000550999 00000 n
+0000551156 00000 n
+0000551312 00000 n
+0000551468 00000 n
+0000551625 00000 n
+0000551780 00000 n
+0000551936 00000 n
+0000552092 00000 n
+0000552247 00000 n
+0000552402 00000 n
+0000552556 00000 n
+0000552711 00000 n
+0000552867 00000 n
+0000553022 00000 n
+0000553178 00000 n
+0000553333 00000 n
+0000553487 00000 n
+0000553642 00000 n
+0000553797 00000 n
+0000553949 00000 n
+0000554105 00000 n
+0000554260 00000 n
+0000554416 00000 n
+0000554571 00000 n
+0000554727 00000 n
+0000554882 00000 n
+0000555038 00000 n
+0000555194 00000 n
+0000555350 00000 n
+0000555506 00000 n
+0000555662 00000 n
+0000555818 00000 n
+0000555974 00000 n
+0000556130 00000 n
+0000556286 00000 n
+0000556442 00000 n
+0000556597 00000 n
+0000556753 00000 n
+0000556907 00000 n
+0000557062 00000 n
+0000557218 00000 n
+0000557374 00000 n
+0000557529 00000 n
+0000557684 00000 n
+0000557839 00000 n
+0000557994 00000 n
+0000558149 00000 n
+0000558305 00000 n
+0000558460 00000 n
+0000558615 00000 n
+0000558770 00000 n
+0000558926 00000 n
+0000559082 00000 n
+0000559238 00000 n
+0000559393 00000 n
+0000559549 00000 n
+0000559705 00000 n
+0000559861 00000 n
+0000560018 00000 n
+0000560174 00000 n
+0000560330 00000 n
+0000560487 00000 n
+0000560643 00000 n
+0000560798 00000 n
+0000560954 00000 n
+0000561110 00000 n
+0000561266 00000 n
+0000561422 00000 n
+0000561578 00000 n
+0000561735 00000 n
+0000561892 00000 n
+0000562048 00000 n
+0000562203 00000 n
+0000562359 00000 n
+0000562515 00000 n
+0000562672 00000 n
+0000562828 00000 n
+0000562983 00000 n
+0000563139 00000 n
+0000563295 00000 n
+0000563451 00000 n
+0000563607 00000 n
+0000563763 00000 n
+0000563917 00000 n
+0000564073 00000 n
+0000564228 00000 n
+0000564383 00000 n
+0000564538 00000 n
+0000564694 00000 n
+0000564851 00000 n
+0000565007 00000 n
+0000565164 00000 n
+0000565320 00000 n
+0000565476 00000 n
+0000565632 00000 n
+0000565789 00000 n
+0000565946 00000 n
+0000566103 00000 n
+0000566259 00000 n
+0000566415 00000 n
+0000566571 00000 n
+0000566725 00000 n
+0000566881 00000 n
+0000567037 00000 n
+0000567193 00000 n
+0000567349 00000 n
+0000567505 00000 n
+0000567661 00000 n
+0000567815 00000 n
+0000567971 00000 n
+0000568126 00000 n
+0000568282 00000 n
+0000568439 00000 n
+0000568594 00000 n
+0000568750 00000 n
+0000568906 00000 n
+0000569063 00000 n
+0000569219 00000 n
+0000569376 00000 n
+0000569532 00000 n
+0000569688 00000 n
+0000569844 00000 n
+0000570001 00000 n
+0000570157 00000 n
+0000570313 00000 n
+0000570470 00000 n
+0000570626 00000 n
+0000570782 00000 n
+0000570938 00000 n
+0000571094 00000 n
+0000571250 00000 n
+0000571406 00000 n
+0000571562 00000 n
+0000571717 00000 n
+0000571873 00000 n
+0000602514 00000 n
+0000574806 00000 n
+0000572163 00000 n
+0000602450 00000 n
+0000576444 00000 n
+0000576600 00000 n
+0000576755 00000 n
+0000576910 00000 n
+0000577065 00000 n
+0000577221 00000 n
+0000577376 00000 n
+0000577532 00000 n
+0000577688 00000 n
+0000577844 00000 n
+0000577999 00000 n
+0000578155 00000 n
+0000578311 00000 n
+0000578467 00000 n
+0000578623 00000 n
+0000578779 00000 n
+0000578935 00000 n
+0000579091 00000 n
+0000579248 00000 n
+0000579403 00000 n
+0000579559 00000 n
+0000579716 00000 n
+0000579873 00000 n
+0000580030 00000 n
+0000580186 00000 n
+0000580341 00000 n
+0000580498 00000 n
+0000580654 00000 n
+0000580811 00000 n
+0000580968 00000 n
+0000581125 00000 n
+0000581280 00000 n
+0000581437 00000 n
+0000581593 00000 n
+0000581748 00000 n
+0000581904 00000 n
+0000582060 00000 n
+0000582217 00000 n
+0000582373 00000 n
+0000582528 00000 n
+0000582683 00000 n
+0000582837 00000 n
+0000582993 00000 n
+0000583149 00000 n
+0000583306 00000 n
+0000583460 00000 n
+0000583616 00000 n
+0000583772 00000 n
+0000583928 00000 n
+0000584083 00000 n
+0000584239 00000 n
+0000584394 00000 n
+0000584551 00000 n
+0000584707 00000 n
+0000584863 00000 n
+0000585019 00000 n
+0000585175 00000 n
+0000585331 00000 n
+0000585487 00000 n
+0000585643 00000 n
+0000585799 00000 n
+0000585955 00000 n
+0000586111 00000 n
+0000586267 00000 n
+0000586423 00000 n
+0000586578 00000 n
+0000586734 00000 n
+0000586889 00000 n
+0000587043 00000 n
+0000587199 00000 n
+0000587353 00000 n
+0000587508 00000 n
+0000587662 00000 n
+0000587818 00000 n
+0000587974 00000 n
+0000588130 00000 n
+0000588284 00000 n
+0000588439 00000 n
+0000588594 00000 n
+0000588751 00000 n
+0000588907 00000 n
+0000589063 00000 n
+0000589219 00000 n
+0000589376 00000 n
+0000589533 00000 n
+0000589689 00000 n
+0000589846 00000 n
+0000590002 00000 n
+0000590158 00000 n
+0000590313 00000 n
+0000590469 00000 n
+0000590622 00000 n
+0000590778 00000 n
+0000590934 00000 n
+0000591089 00000 n
+0000591245 00000 n
+0000591400 00000 n
+0000591557 00000 n
+0000591713 00000 n
+0000591868 00000 n
+0000592024 00000 n
+0000592179 00000 n
+0000592334 00000 n
+0000592490 00000 n
+0000592646 00000 n
+0000592802 00000 n
+0000592956 00000 n
+0000593111 00000 n
+0000593266 00000 n
+0000593421 00000 n
+0000593577 00000 n
+0000593733 00000 n
+0000593889 00000 n
+0000594046 00000 n
+0000594202 00000 n
+0000594358 00000 n
+0000594514 00000 n
+0000594669 00000 n
+0000594825 00000 n
+0000594981 00000 n
+0000595137 00000 n
+0000595293 00000 n
+0000595449 00000 n
+0000595604 00000 n
+0000595760 00000 n
+0000595915 00000 n
+0000596070 00000 n
+0000596226 00000 n
+0000596382 00000 n
+0000596537 00000 n
+0000596691 00000 n
+0000596847 00000 n
+0000597002 00000 n
+0000597157 00000 n
+0000597313 00000 n
+0000597469 00000 n
+0000597625 00000 n
+0000597781 00000 n
+0000597937 00000 n
+0000598093 00000 n
+0000598249 00000 n
+0000598404 00000 n
+0000598559 00000 n
+0000598715 00000 n
+0000598871 00000 n
+0000599027 00000 n
+0000599182 00000 n
+0000599338 00000 n
+0000599494 00000 n
+0000599650 00000 n
+0000599806 00000 n
+0000599961 00000 n
+0000600117 00000 n
+0000600273 00000 n
+0000600429 00000 n
+0000600584 00000 n
+0000600740 00000 n
+0000600896 00000 n
+0000601052 00000 n
+0000601208 00000 n
+0000601364 00000 n
+0000601520 00000 n
+0000601675 00000 n
+0000601831 00000 n
+0000601986 00000 n
+0000602141 00000 n
+0000602295 00000 n
+0000631447 00000 n
+0000605403 00000 n
+0000602586 00000 n
+0000631383 00000 n
+0000606951 00000 n
+0000607107 00000 n
+0000607262 00000 n
+0000607416 00000 n
+0000607570 00000 n
+0000607726 00000 n
+0000607881 00000 n
+0000608035 00000 n
+0000608190 00000 n
+0000608345 00000 n
+0000608501 00000 n
+0000608656 00000 n
+0000608812 00000 n
+0000608967 00000 n
+0000609123 00000 n
+0000609279 00000 n
+0000609435 00000 n
+0000609591 00000 n
+0000609747 00000 n
+0000609903 00000 n
+0000610059 00000 n
+0000610214 00000 n
+0000610370 00000 n
+0000610526 00000 n
+0000610682 00000 n
+0000610838 00000 n
+0000610994 00000 n
+0000611150 00000 n
+0000611307 00000 n
+0000611463 00000 n
+0000611619 00000 n
+0000611775 00000 n
+0000611930 00000 n
+0000612085 00000 n
+0000612238 00000 n
+0000612394 00000 n
+0000612549 00000 n
+0000612705 00000 n
+0000612860 00000 n
+0000613015 00000 n
+0000613170 00000 n
+0000613324 00000 n
+0000613479 00000 n
+0000613634 00000 n
+0000613791 00000 n
+0000613945 00000 n
+0000614101 00000 n
+0000614257 00000 n
+0000614413 00000 n
+0000614569 00000 n
+0000614725 00000 n
+0000614881 00000 n
+0000615037 00000 n
+0000615193 00000 n
+0000615349 00000 n
+0000615503 00000 n
+0000615659 00000 n
+0000615814 00000 n
+0000615968 00000 n
+0000616123 00000 n
+0000616278 00000 n
+0000616434 00000 n
+0000616589 00000 n
+0000616744 00000 n
+0000616901 00000 n
+0000617057 00000 n
+0000617211 00000 n
+0000617367 00000 n
+0000617522 00000 n
+0000617678 00000 n
+0000617833 00000 n
+0000617988 00000 n
+0000618144 00000 n
+0000618300 00000 n
+0000618455 00000 n
+0000618611 00000 n
+0000618768 00000 n
+0000618925 00000 n
+0000619082 00000 n
+0000619238 00000 n
+0000619394 00000 n
+0000619550 00000 n
+0000619707 00000 n
+0000619864 00000 n
+0000620021 00000 n
+0000620178 00000 n
+0000620334 00000 n
+0000620490 00000 n
+0000620646 00000 n
+0000620802 00000 n
+0000620958 00000 n
+0000621113 00000 n
+0000621268 00000 n
+0000621424 00000 n
+0000621580 00000 n
+0000621736 00000 n
+0000621892 00000 n
+0000622048 00000 n
+0000622204 00000 n
+0000622359 00000 n
+0000622516 00000 n
+0000622671 00000 n
+0000622827 00000 n
+0000622983 00000 n
+0000623139 00000 n
+0000623295 00000 n
+0000623451 00000 n
+0000623605 00000 n
+0000623759 00000 n
+0000623913 00000 n
+0000624069 00000 n
+0000624225 00000 n
+0000624381 00000 n
+0000624537 00000 n
+0000624691 00000 n
+0000624845 00000 n
+0000625000 00000 n
+0000625156 00000 n
+0000625312 00000 n
+0000625468 00000 n
+0000625624 00000 n
+0000625780 00000 n
+0000625936 00000 n
+0000626092 00000 n
+0000626249 00000 n
+0000626403 00000 n
+0000626558 00000 n
+0000626713 00000 n
+0000626867 00000 n
+0000627022 00000 n
+0000627178 00000 n
+0000627334 00000 n
+0000627490 00000 n
+0000627646 00000 n
+0000627800 00000 n
+0000627955 00000 n
+0000628110 00000 n
+0000628264 00000 n
+0000628419 00000 n
+0000628575 00000 n
+0000628731 00000 n
+0000628887 00000 n
+0000629043 00000 n
+0000629199 00000 n
+0000629354 00000 n
+0000629511 00000 n
+0000629668 00000 n
+0000629824 00000 n
+0000629980 00000 n
+0000630137 00000 n
+0000630294 00000 n
+0000630449 00000 n
+0000630605 00000 n
+0000630760 00000 n
+0000630916 00000 n
+0000631072 00000 n
+0000631227 00000 n
+0000665561 00000 n
+0000634422 00000 n
+0000631519 00000 n
+0000665497 00000 n
+0000636249 00000 n
+0000636405 00000 n
+0000636561 00000 n
+0000636717 00000 n
+0000636872 00000 n
+0000637028 00000 n
+0000637184 00000 n
+0000637339 00000 n
+0000637495 00000 n
+0000637651 00000 n
+0000637803 00000 n
+0000637959 00000 n
+0000638114 00000 n
+0000638270 00000 n
+0000638426 00000 n
+0000638581 00000 n
+0000638736 00000 n
+0000638892 00000 n
+0000639048 00000 n
+0000639202 00000 n
+0000639356 00000 n
+0000639510 00000 n
+0000639664 00000 n
+0000639818 00000 n
+0000639972 00000 n
+0000640128 00000 n
+0000640284 00000 n
+0000640440 00000 n
+0000640596 00000 n
+0000640752 00000 n
+0000640907 00000 n
+0000641063 00000 n
+0000641219 00000 n
+0000641374 00000 n
+0000641530 00000 n
+0000641686 00000 n
+0000641843 00000 n
+0000641999 00000 n
+0000642154 00000 n
+0000642308 00000 n
+0000642463 00000 n
+0000642618 00000 n
+0000642772 00000 n
+0000642927 00000 n
+0000643081 00000 n
+0000643236 00000 n
+0000643391 00000 n
+0000643546 00000 n
+0000643700 00000 n
+0000643855 00000 n
+0000644010 00000 n
+0000644166 00000 n
+0000644322 00000 n
+0000644478 00000 n
+0000644634 00000 n
+0000644789 00000 n
+0000644945 00000 n
+0000645101 00000 n
+0000645257 00000 n
+0000645413 00000 n
+0000645569 00000 n
+0000645725 00000 n
+0000645879 00000 n
+0000646034 00000 n
+0000646190 00000 n
+0000646346 00000 n
+0000646502 00000 n
+0000646658 00000 n
+0000646814 00000 n
+0000646969 00000 n
+0000647125 00000 n
+0000647281 00000 n
+0000647437 00000 n
+0000647593 00000 n
+0000647749 00000 n
+0000647905 00000 n
+0000648060 00000 n
+0000648216 00000 n
+0000648372 00000 n
+0000648528 00000 n
+0000648684 00000 n
+0000648840 00000 n
+0000648996 00000 n
+0000649152 00000 n
+0000649307 00000 n
+0000649463 00000 n
+0000649619 00000 n
+0000649775 00000 n
+0000649931 00000 n
+0000650087 00000 n
+0000650242 00000 n
+0000650398 00000 n
+0000650553 00000 n
+0000650709 00000 n
+0000650865 00000 n
+0000651021 00000 n
+0000651176 00000 n
+0000651332 00000 n
+0000651488 00000 n
+0000651644 00000 n
+0000651799 00000 n
+0000651955 00000 n
+0000652111 00000 n
+0000652267 00000 n
+0000652422 00000 n
+0000652578 00000 n
+0000652734 00000 n
+0000652890 00000 n
+0000653047 00000 n
+0000653202 00000 n
+0000653358 00000 n
+0000653514 00000 n
+0000653668 00000 n
+0000653823 00000 n
+0000653978 00000 n
+0000654133 00000 n
+0000654289 00000 n
+0000654445 00000 n
+0000654600 00000 n
+0000654757 00000 n
+0000654913 00000 n
+0000655068 00000 n
+0000655224 00000 n
+0000655378 00000 n
+0000655533 00000 n
+0000655689 00000 n
+0000655844 00000 n
+0000656001 00000 n
+0000656157 00000 n
+0000656313 00000 n
+0000656469 00000 n
+0000656625 00000 n
+0000656782 00000 n
+0000656937 00000 n
+0000657093 00000 n
+0000657249 00000 n
+0000657405 00000 n
+0000657560 00000 n
+0000657716 00000 n
+0000657871 00000 n
+0000658026 00000 n
+0000658180 00000 n
+0000658335 00000 n
+0000658490 00000 n
+0000658646 00000 n
+0000658802 00000 n
+0000658958 00000 n
+0000659113 00000 n
+0000659269 00000 n
+0000659424 00000 n
+0000659580 00000 n
+0000659736 00000 n
+0000659892 00000 n
+0000660048 00000 n
+0000660204 00000 n
+0000660360 00000 n
+0000660516 00000 n
+0000660672 00000 n
+0000660828 00000 n
+0000660983 00000 n
+0000661139 00000 n
+0000661295 00000 n
+0000661450 00000 n
+0000661605 00000 n
+0000661761 00000 n
+0000661917 00000 n
+0000662072 00000 n
+0000662227 00000 n
+0000662382 00000 n
+0000662536 00000 n
+0000662691 00000 n
+0000662847 00000 n
+0000663003 00000 n
+0000663159 00000 n
+0000663315 00000 n
+0000663471 00000 n
+0000663627 00000 n
+0000663782 00000 n
+0000663938 00000 n
+0000664094 00000 n
+0000664250 00000 n
+0000664406 00000 n
+0000664562 00000 n
+0000664718 00000 n
+0000664874 00000 n
+0000665030 00000 n
+0000665185 00000 n
+0000665341 00000 n
+0000922078 00000 n
+0000695121 00000 n
+0000668553 00000 n
+0000665633 00000 n
+0000695057 00000 n
+0000670128 00000 n
+0000670284 00000 n
+0000670440 00000 n
+0000670596 00000 n
+0000670752 00000 n
+0000670907 00000 n
+0000671063 00000 n
+0000671219 00000 n
+0000671373 00000 n
+0000671529 00000 n
+0000671685 00000 n
+0000671841 00000 n
+0000671997 00000 n
+0000672154 00000 n
+0000672310 00000 n
+0000672466 00000 n
+0000672622 00000 n
+0000672778 00000 n
+0000672933 00000 n
+0000673089 00000 n
+0000673245 00000 n
+0000673401 00000 n
+0000673557 00000 n
+0000673713 00000 n
+0000673869 00000 n
+0000674024 00000 n
+0000674180 00000 n
+0000674336 00000 n
+0000674491 00000 n
+0000674646 00000 n
+0000674802 00000 n
+0000674958 00000 n
+0000675115 00000 n
+0000675271 00000 n
+0000675427 00000 n
+0000675582 00000 n
+0000675738 00000 n
+0000675894 00000 n
+0000676050 00000 n
+0000676207 00000 n
+0000676363 00000 n
+0000676519 00000 n
+0000676676 00000 n
+0000676832 00000 n
+0000676987 00000 n
+0000677141 00000 n
+0000677296 00000 n
+0000677451 00000 n
+0000677607 00000 n
+0000677763 00000 n
+0000677920 00000 n
+0000678076 00000 n
+0000678230 00000 n
+0000678384 00000 n
+0000678538 00000 n
+0000678693 00000 n
+0000678847 00000 n
+0000679001 00000 n
+0000679158 00000 n
+0000679314 00000 n
+0000679470 00000 n
+0000679625 00000 n
+0000679781 00000 n
+0000679937 00000 n
+0000680093 00000 n
+0000680249 00000 n
+0000680405 00000 n
+0000680561 00000 n
+0000680717 00000 n
+0000680873 00000 n
+0000681029 00000 n
+0000681185 00000 n
+0000681342 00000 n
+0000681497 00000 n
+0000681653 00000 n
+0000681809 00000 n
+0000681965 00000 n
+0000682121 00000 n
+0000682276 00000 n
+0000682433 00000 n
+0000682589 00000 n
+0000682745 00000 n
+0000682901 00000 n
+0000683057 00000 n
+0000683212 00000 n
+0000683369 00000 n
+0000683524 00000 n
+0000683681 00000 n
+0000683835 00000 n
+0000683990 00000 n
+0000684146 00000 n
+0000684302 00000 n
+0000684458 00000 n
+0000684614 00000 n
+0000684770 00000 n
+0000684926 00000 n
+0000685083 00000 n
+0000685239 00000 n
+0000685395 00000 n
+0000685550 00000 n
+0000685706 00000 n
+0000685860 00000 n
+0000686014 00000 n
+0000686169 00000 n
+0000686324 00000 n
+0000686480 00000 n
+0000686636 00000 n
+0000686792 00000 n
+0000686947 00000 n
+0000687103 00000 n
+0000687259 00000 n
+0000687415 00000 n
+0000687571 00000 n
+0000687727 00000 n
+0000687883 00000 n
+0000688037 00000 n
+0000688193 00000 n
+0000688349 00000 n
+0000688505 00000 n
+0000688661 00000 n
+0000688817 00000 n
+0000688973 00000 n
+0000689127 00000 n
+0000689281 00000 n
+0000689435 00000 n
+0000689590 00000 n
+0000689745 00000 n
+0000689901 00000 n
+0000690055 00000 n
+0000690210 00000 n
+0000690365 00000 n
+0000690521 00000 n
+0000690678 00000 n
+0000690834 00000 n
+0000690991 00000 n
+0000691147 00000 n
+0000691304 00000 n
+0000691461 00000 n
+0000691617 00000 n
+0000691774 00000 n
+0000691930 00000 n
+0000692086 00000 n
+0000692243 00000 n
+0000692399 00000 n
+0000692555 00000 n
+0000692711 00000 n
+0000692868 00000 n
+0000693025 00000 n
+0000693182 00000 n
+0000693338 00000 n
+0000693495 00000 n
+0000693652 00000 n
+0000693809 00000 n
+0000693965 00000 n
+0000694121 00000 n
+0000694277 00000 n
+0000694433 00000 n
+0000694589 00000 n
+0000694745 00000 n
+0000694901 00000 n
+0000720988 00000 n
+0000698073 00000 n
+0000695193 00000 n
+0000720924 00000 n
+0000699450 00000 n
+0000699606 00000 n
+0000699762 00000 n
+0000699918 00000 n
+0000700073 00000 n
+0000700229 00000 n
+0000700383 00000 n
+0000700537 00000 n
+0000700693 00000 n
+0000700849 00000 n
+0000701005 00000 n
+0000701161 00000 n
+0000701316 00000 n
+0000701471 00000 n
+0000701625 00000 n
+0000701780 00000 n
+0000701935 00000 n
+0000702090 00000 n
+0000702245 00000 n
+0000702399 00000 n
+0000702554 00000 n
+0000702710 00000 n
+0000702865 00000 n
+0000703021 00000 n
+0000703175 00000 n
+0000703331 00000 n
+0000703488 00000 n
+0000703643 00000 n
+0000703798 00000 n
+0000703954 00000 n
+0000704110 00000 n
+0000704265 00000 n
+0000704420 00000 n
+0000704576 00000 n
+0000704733 00000 n
+0000704888 00000 n
+0000705043 00000 n
+0000705198 00000 n
+0000705354 00000 n
+0000705508 00000 n
+0000705662 00000 n
+0000705816 00000 n
+0000705971 00000 n
+0000706125 00000 n
+0000706280 00000 n
+0000706436 00000 n
+0000706592 00000 n
+0000706748 00000 n
+0000706904 00000 n
+0000707060 00000 n
+0000707216 00000 n
+0000707372 00000 n
+0000707528 00000 n
+0000707684 00000 n
+0000707840 00000 n
+0000707996 00000 n
+0000708152 00000 n
+0000708308 00000 n
+0000708464 00000 n
+0000708620 00000 n
+0000708776 00000 n
+0000708931 00000 n
+0000709086 00000 n
+0000709241 00000 n
+0000709395 00000 n
+0000709551 00000 n
+0000709707 00000 n
+0000709863 00000 n
+0000710019 00000 n
+0000710176 00000 n
+0000710332 00000 n
+0000710488 00000 n
+0000710644 00000 n
+0000710799 00000 n
+0000710956 00000 n
+0000711113 00000 n
+0000711270 00000 n
+0000711426 00000 n
+0000711582 00000 n
+0000711739 00000 n
+0000711896 00000 n
+0000712053 00000 n
+0000712210 00000 n
+0000712367 00000 n
+0000712524 00000 n
+0000712681 00000 n
+0000712836 00000 n
+0000712992 00000 n
+0000713148 00000 n
+0000713304 00000 n
+0000713460 00000 n
+0000713616 00000 n
+0000713772 00000 n
+0000713927 00000 n
+0000714083 00000 n
+0000714239 00000 n
+0000714395 00000 n
+0000714551 00000 n
+0000714707 00000 n
+0000714863 00000 n
+0000715019 00000 n
+0000715175 00000 n
+0000715330 00000 n
+0000715486 00000 n
+0000715642 00000 n
+0000715798 00000 n
+0000715953 00000 n
+0000716107 00000 n
+0000716263 00000 n
+0000716418 00000 n
+0000716573 00000 n
+0000716727 00000 n
+0000716881 00000 n
+0000717035 00000 n
+0000717191 00000 n
+0000717347 00000 n
+0000717504 00000 n
+0000717660 00000 n
+0000717816 00000 n
+0000717971 00000 n
+0000718127 00000 n
+0000718283 00000 n
+0000718440 00000 n
+0000718596 00000 n
+0000718752 00000 n
+0000718908 00000 n
+0000719064 00000 n
+0000719219 00000 n
+0000719372 00000 n
+0000719527 00000 n
+0000719682 00000 n
+0000719837 00000 n
+0000719991 00000 n
+0000720145 00000 n
+0000720300 00000 n
+0000720456 00000 n
+0000720612 00000 n
+0000720768 00000 n
+0000735529 00000 n
+0000722644 00000 n
+0000721060 00000 n
+0000735465 00000 n
+0000723472 00000 n
+0000723627 00000 n
+0000723783 00000 n
+0000723939 00000 n
+0000724095 00000 n
+0000724251 00000 n
+0000724406 00000 n
+0000724562 00000 n
+0000724718 00000 n
+0000724874 00000 n
+0000725030 00000 n
+0000725186 00000 n
+0000725342 00000 n
+0000725499 00000 n
+0000725656 00000 n
+0000725811 00000 n
+0000725966 00000 n
+0000726121 00000 n
+0000726276 00000 n
+0000726431 00000 n
+0000726586 00000 n
+0000726742 00000 n
+0000726897 00000 n
+0000727053 00000 n
+0000727209 00000 n
+0000727364 00000 n
+0000727519 00000 n
+0000727673 00000 n
+0000727829 00000 n
+0000727985 00000 n
+0000728141 00000 n
+0000728296 00000 n
+0000728452 00000 n
+0000728608 00000 n
+0000728764 00000 n
+0000728920 00000 n
+0000729077 00000 n
+0000729234 00000 n
+0000729390 00000 n
+0000729546 00000 n
+0000729701 00000 n
+0000729858 00000 n
+0000730014 00000 n
+0000730169 00000 n
+0000730325 00000 n
+0000730481 00000 n
+0000730637 00000 n
+0000730793 00000 n
+0000730949 00000 n
+0000731106 00000 n
+0000731263 00000 n
+0000731419 00000 n
+0000731574 00000 n
+0000731731 00000 n
+0000731885 00000 n
+0000732039 00000 n
+0000732193 00000 n
+0000732349 00000 n
+0000732505 00000 n
+0000732660 00000 n
+0000732816 00000 n
+0000732972 00000 n
+0000733128 00000 n
+0000733283 00000 n
+0000733439 00000 n
+0000733595 00000 n
+0000733751 00000 n
+0000733905 00000 n
+0000734061 00000 n
+0000734217 00000 n
+0000734373 00000 n
+0000734529 00000 n
+0000734685 00000 n
+0000734841 00000 n
+0000734997 00000 n
+0000735153 00000 n
+0000735309 00000 n
+0000737802 00000 n
+0000737777 00000 n
+0000737885 00000 n
+0000738196 00000 n
+0000738495 00000 n
+0000738730 00000 n
+0000738974 00000 n
+0000739384 00000 n
+0000739735 00000 n
+0000740014 00000 n
+0000740339 00000 n
+0000740808 00000 n
+0000740906 00000 n
+0000741086 00000 n
+0000745457 00000 n
+0000745300 00000 n
+0000748032 00000 n
+0000747958 00000 n
+0000750037 00000 n
+0000750007 00000 n
+0000753827 00000 n
+0000753676 00000 n
+0000759136 00000 n
+0000758923 00000 n
+0000762027 00000 n
+0000761990 00000 n
+0000765289 00000 n
+0000765208 00000 n
+0000781707 00000 n
+0000781326 00000 n
+0000790929 00000 n
+0000790716 00000 n
+0000791239 00000 n
+0000791523 00000 n
+0000791802 00000 n
+0000792024 00000 n
+0000792255 00000 n
+0000792624 00000 n
+0000792956 00000 n
+0000793212 00000 n
+0000793496 00000 n
+0000793951 00000 n
+0000794048 00000 n
+0000794228 00000 n
+0000794385 00000 n
+0000794649 00000 n
+0000794909 00000 n
+0000795115 00000 n
+0000795327 00000 n
+0000795654 00000 n
+0000795957 00000 n
+0000796195 00000 n
+0000796456 00000 n
+0000796901 00000 n
+0000796998 00000 n
+0000797178 00000 n
+0000814087 00000 n
+0000813704 00000 n
+0000814648 00000 n
+0000814889 00000 n
+0000815121 00000 n
+0000815323 00000 n
+0000815523 00000 n
+0000815810 00000 n
+0000816074 00000 n
+0000816516 00000 n
+0000816605 00000 n
+0000816775 00000 n
+0000825435 00000 n
+0000825119 00000 n
+0000827626 00000 n
+0000827601 00000 n
+0000827718 00000 n
+0000827978 00000 n
+0000828234 00000 n
+0000828435 00000 n
+0000828637 00000 n
+0000828845 00000 n
+0000829172 00000 n
+0000829465 00000 n
+0000829758 00000 n
+0000829994 00000 n
+0000830254 00000 n
+0000830697 00000 n
+0000830802 00000 n
+0000830976 00000 n
+0000844284 00000 n
+0000843920 00000 n
+0000856727 00000 n
+0000856358 00000 n
+0000876093 00000 n
+0000875628 00000 n
+0000891357 00000 n
+0000890993 00000 n
+0000891794 00000 n
+0000892095 00000 n
+0000892346 00000 n
+0000892590 00000 n
+0000892955 00000 n
+0000893278 00000 n
+0000893596 00000 n
+0000894074 00000 n
+0000894163 00000 n
+0000894302 00000 n
+0000900165 00000 n
+0000899948 00000 n
+0000907893 00000 n
+0000907646 00000 n
+0000911746 00000 n
+0000911480 00000 n
+0000912036 00000 n
+0000912363 00000 n
+0000912691 00000 n
+0000912923 00000 n
+0000913167 00000 n
+0000913615 00000 n
+0000914003 00000 n
+0000914470 00000 n
+0000914559 00000 n
+0000914729 00000 n
+0000919219 00000 n
+0000919100 00000 n
+0000922185 00000 n
+0000922305 00000 n
+0000922425 00000 n
+0000922549 00000 n
+0000922666 00000 n
+0000922758 00000 n
+0000932755 00000 n
+0000940161 00000 n
+0000940202 00000 n
+0000940242 00000 n
+0000940423 00000 n
+trailer
+<<
+/Size 2986
+/Root 2984 0 R
+/Info 2985 0 R
+>>
+startxref
+940679
+%%EOF
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/connections.mp b/graphics/metapost/contrib/macros/metaobj/examples/connections.mp
new file mode 100644
index 0000000000..3b791cf593
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/connections.mp
@@ -0,0 +1,512 @@
+input metaobj
+
+beginfig(1);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b);
+endfig;
+
+clearObj a,b;
+
+beginfig(2);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a.c)(b.c);
+endfig;
+
+clearObj a,b;
+
+beginfig(3);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b) "linewidth(1mm)", "linestyle(dashed evenly)";
+endfig;
+
+clearObj a,b;
+
+beginfig(4);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b) "posA(n)";
+endfig;
+
+clearObj a,b;
+
+beginfig(5);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b) "offsetA((1cm,0))";
+endfig;
+
+clearObj a,b;
+
+beginfig(6);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b) "doubleline(true)", "arrows(draw)";
+endfig;
+
+clearObj a,b;
+
+beginfig(7);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncline(a)(b) "nodesepB(10mm)", "arrows(draw)";
+endfig;
+
+clearObj a,b;
+
+beginfig(11);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccurve(a)(b) "angleA(0)";
+endfig;
+
+clearObj a,b;
+
+beginfig(12);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccurve(a)(b) "angleA(-30)", "angleB(80)", "linecolor(red)",
+ "linewidth(1mm)", "doubleline(true)", "linestyle(dashed withdots)";
+endfig;
+
+clearObj a,b;
+
+beginfig(13);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccurve(a)(b) "angleA(-30)", "angleB(80)", "linecolor(red)",
+ "linewidth(3pt)","linestyle(dashed withdots)",
+ "linetension(2)";
+endfig;
+
+clearObj a,b;
+
+beginfig(21);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncbar(a)(b) "angleA(-50)", "linecolor(blue)",
+ "linewidth(1pt)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(22);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncbar(a)(b) "angleA(90)", "linecolor(blue)",
+ "linewidth(1pt)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(31);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncangle(a)(b) "angleA(90)", "angleB(80)", "linecolor(blue)",
+ "linewidth(1pt)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(32);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncangle(a)(b) "angleA(0)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(41);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncangles(a)(b) "angleA(0)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+
+beginfig(42);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncangles(a)(b) "angleA(0)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)","armB(2cm)","offsetA((0,1cm))";
+endfig;
+
+clearObj a,b;
+
+beginfig(43);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncangles(a)(b) "angleA(90)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(51);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncdiag(a)(b) "angleA(90)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(52);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncdiag(a)(b) "angleA(0)", "angleB(90)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(61);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncdiagg(a)(b) "angleA(90)", "angleB(50)", "linecolor(blue)",
+ "linewidth(1pt)","armA(3cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(62);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncdiagg(a)(b) "angleA(0)", "angleB(90)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(71);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(b) "angleA(0)", "angleB(90)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(72);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(a) "angleA(0)", "angleB(90)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(2cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(73);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(b) "angleA(0)", "angleB(90)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(74);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(b) "angleA(0)", "angleB(180)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(75);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(b) "angleA(0)", "angleB(-100)", "linecolor(blue)",
+ "linewidth(1pt)","armA(2cm)","armB(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(76);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(a) "angleA(0)", "angleB(0)", "linecolor(blue)",
+ "linewidth(1pt)","armA(1cm)","armB(1cm)","loopsize(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(77);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncloop(a)(a) "angleA(0)", "angleB(0)", "linecolor(blue)",
+ "linewidth(1pt)","armA(1cm)","armB(1cm)","loopsize(1cm)",
+ "offsetA((0,2mm))","offsetB((0,-3mm))";
+endfig;
+
+clearObj a,b;
+
+beginfig(81);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccircle(a) "angleA(0)", "linecolor(blue)","linewidth(1pt)";
+endfig;
+
+clearObj a,b;
+
+beginfig(101);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncbox(a)(b) "linecolor(blue)",
+ "linewidth(1pt)","nodesepA(1cm)","nodesepB(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(102);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncbox(a)(b) "linecolor(blue)",
+ "linewidth(1pt)","nodesepA(1cm)","nodesepB(1cm)",
+ "boxsize(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(103);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncbox(a)(b) "linecolor(blue)",
+ "linewidth(1pt)","nodesepA(1cm)","nodesepB(1cm)",
+ "boxsize(1cm)","linearc(3mm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(111);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncarcbox(a)(b) "arcangleA(0)", "linecolor(blue)",
+ "linewidth(1pt)","nodesepA(1cm)","nodesepB(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(112);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncarcbox(a)(b) "arcangleA(-30)", "linecolor(blue)",
+ "linewidth(1pt)","nodesepA(1cm)","nodesepB(1cm)",
+ "boxsize(1cm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(121);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncarc(a)(b);
+endfig;
+
+clearObj a,b;
+
+beginfig(122);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncarc(a)(b);
+ ncarc(b)(a);
+endfig;
+
+clearObj a,b;
+
+beginfig(123);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ ncarc(a)(b) "arcangleA(50)";
+ ncarc(b)(a);
+endfig;
+
+clearObj a,b;
+
+beginfig(131);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nczigzag(a)(b);
+endfig;
+
+clearObj a,b;
+
+beginfig(132);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nczigzag(a)(b) "angleA(-90)","angleB(120)","linetension(0.8)",
+ "coilwidth(2mm)","linearc(.1mm)";
+endfig;
+
+clearObj a,b;
+
+beginfig(141);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccoil(a)(b);
+endfig;
+
+clearObj a,b;
+
+beginfig(142);
+ newCircle.a(btex start etex);
+ newCircle.b(btex end etex);
+ a.c=origin;
+ b.c-a.c=(3cm,2cm);
+ drawObj(a,b);
+ nccoil(a)(b) "doubleline(true)","coilwidth(2mm)",
+ "angleA(0)", "arrows(-)","linewidth(1pt)";
+endfig;
+
+clearObj a,b;
+
+beginfig(200);
+ newBox.a("") "dx(3cm)", "dy(2cm)", "framecolor(blue)";
+ addUserPath.a(a.nw--a.se);
+ addUserPath.a(a.nw{right}..a.se) "linecolor(red)";
+ addUserPath.a(fullcircle scaled 1cm shifted a.c) "arrows(-)";
+ addUserPath.a(fullcircle scaled 1cm shifted a.ne) "arrows(-)",
+ "pathfilled(true)","pathfillcolor((1,0,1))";
+ addUserPath.a(fullcircle scaled 1cm shifted a.sw) "arrows(-)",
+ "pathfilled(true)","pathfillcolor((1,0,1))",
+ "linecolor((1,0,1))";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(201);
+ xscaleObj(a,.5);
+ a.c=origin-(0,6cm);
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/mobjstandard.mp b/graphics/metapost/contrib/macros/metaobj/examples/mobjstandard.mp
new file mode 100644
index 0000000000..e51e3e9a81
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/mobjstandard.mp
@@ -0,0 +1,931 @@
+input metaobj
+
+def show_standard_bb(suffix n_)=
+ pickup pencircle scaled 2pt;
+ draw n_.nw;draw n_.ne;
+ draw n_.sw;draw n_.se;
+ pickup pencircle scaled .5bp;
+ label.ulft(btex nw etex,n_.nw);
+ label.urt(btex ne etex,n_.ne);
+ label.llft(btex sw etex,n_.sw);
+ label.lrt(btex se etex,n_.se);
+enddef;
+
+def show_standard_ibb(suffix n_)=
+ pickup pencircle scaled 2pt;
+ draw n_.inw;draw n_.ine;
+ draw n_.isw;draw n_.ise;
+ pickup pencircle scaled .5bp;
+ label.ulft(btex inw etex,n_.inw);
+ label.urt(btex ine etex,n_.ine);
+ label.llft(btex isw etex,n_.isw);
+ label.lrt(btex ise etex,n_.ise);
+enddef;
+
+
+
+beginfig(1);
+ show_empty_boxes:=true;
+ newEmptyBox.a(2cm,1cm) "framed(true)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(2);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(3);
+ newHRazor.a(3cm) "framed(true)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(4);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(5);
+ show_empty_boxes:=true;
+ newRandomBox.a(2cm,1cm,2mm,-1mm) "framed(true)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(6);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(7);
+ newRandomBox.a(2cm,1cm,2mm,-1mm) "framed(true)", "framewidth(1mm)";
+ a.c=origin;
+ drawObj(a);
+
+endfig;
+
+clearObj a;
+
+beginfig(8);
+ newRandomBox.a(1cm,5mm,2mm,-1mm) "framed(true)", "filled(true)",
+ "fillcolor(red)","framewidth(1mm)","framecolor(green)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(10);
+ newBox.a(btex some text etex);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(11);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(12);
+ newBox.a(btex some text etex) "fit(false)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(13);
+ newBox.a("") "filled(true)", "dx(2mm)", "dy(2mm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(15);
+ newBox.a(btex This is an ovalbox etex) "rbox_radius(2mm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(17);
+ newBox.a(btex This is a shadowbox etex) "shadow(true)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+
+clearObj a;
+
+beginfig(20);
+ newPolygon.a(btex some text etex,5);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(21);
+ newPolygon.a(btex some text etex,5) "polymargin(3mm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(22);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(23);
+ newPolygon.a(btex some text etex,7) "fit(false)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(30);
+ newEllipse.a(btex some text etex);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(31);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(32);
+ newEllipse.a(btex some text etex) "fit(false)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(33);
+ newEllipse.a("") "filled(true)","circmargin(2mm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(35);
+ newCircle.a(btex some text etex);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(40);
+ newDBox.a(btex some text etex);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(41);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(42);
+ newDBox.a(btex some text etex) "fit(false)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(43);
+ newDBox.a("") "dx(1cm)", "dy(1cm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(50);
+ newDEllipse.a(btex some text etex);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(51);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(52);
+ newDEllipse.a(btex some text etex) "fit(false)";
+ a.c=origin;
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+beginfig(53);
+ newDEllipse.a("") "filled(true)","circmargin(2mm)";
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+clearObj a;
+
+beginfig(55);
+ newDEllipse.a(btex some text etex);
+ scaleObj(a,2);
+ rotateObj(a,45);
+ a.c=origin;
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+
+beginfig(61);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newHBox.h(a,b,c);
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+beginfig(62);
+ drawObj(h);
+ show_standard_bb(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(64);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newHBox.h(a,b,c) "align(top)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(65);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newHBox.h(a,b,c) "align(center)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(67);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newHBox.h(a,b,c) "align(center)","hbsep(3mm)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(68);
+ newPolygon.a(btex Box A etex,5) "fit(false)","polymargin(5mm)";
+ newBox.b(btex Box B etex scaled \magstep3);
+ newHRazor.ba(1cm);
+ newPolygon.c(btex Box C etex scaled \magstep2,11) "polymargin(3mm)";
+ newHBox.h(a,b,ba,c) "align(center)","hbsep(3mm)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,ba,c,h;
+
+
+beginfig(71);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newVBox.h(a,b,c);
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+beginfig(72);
+ drawObj(h);
+ show_standard_bb(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(74);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newVBox.h(a,b,c) "align(right)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(75);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newVBox.h(a,b,c) "align(center)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(77);
+ newBox.a(btex Box A etex);
+ newBox.b(btex Box B etex scaled \magstep3);
+ newBox.c(btex Box C etex scaled \magstep2);
+ newVBox.h(a,b,c) "align(center)","vbsep(3mm)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,c,h;
+
+beginfig(78);
+ newPolygon.a(btex Box A etex,5) "fit(false)","polymargin(5mm)";
+ newBox.b(btex Box B etex scaled \magstep3);
+ newVRazor.ba(1cm);
+ newPolygon.c(btex Box C etex scaled \magstep2,11) "polymargin(3mm)";
+ newVBox.h(a,b,ba,c) "align(center)","vbsep(3mm)";
+ h.c=origin;
+ drawObj(h);
+endfig;
+
+clearObj a,b,ba,c,h;
+
+beginfig(101);
+ newRecursiveBox.a(10);
+ scaleObj(a,.3);
+ a.c=origin;
+ drawObj(a);
+endfig;
+
+beginfig(102);
+ drawObj(a);
+ show_standard_bb(a);
+endfig;
+
+clearObj a;
+
+% beginfig(104);
+% newRecursiveBox.a(20);
+% a.c=origin;
+% drawObj(a);
+% endfig;
+
+
+% beginfig(111);
+% newVonKochFlake.a(3);
+% scaleObj(a,.5);
+% a.c=origin;
+% drawObj(a);
+% endfig;
+
+%clearObj a;
+
+
+beginfig(121);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c);
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e);
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables);
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+beginfig(122);
+ drawObj(food);
+ show_standard_bb(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(124);
+ newBox.a(btex apples\strut etex);
+ newBox.b(btex oranges\strut etex);
+ newBox.c(btex bananas\strut etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Dalign(bot)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Dalign(center)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hbsep(1cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(134);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Lalign(left)", "treemode(L)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Lalign(center)", "treemode(L)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(L)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(135);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ extendObjRight.a(3cm);
+ extendObjRight.b(3cm);
+ extendObjRight.c(3cm);
+ extendObjRight.d(3cm);
+ extendObjRight.e(3cm);
+
+ newBox.f(btex fruits etex);
+ newBox.v(btex vegetables etex);
+ rebindrelativeObj(f)(0,0,0,-xpart(v.e-v.w-f.e+f.w));
+ newTree.fruits(f)(a,b,c) "Lalign(left)", "treemode(L)";
+ newTree.vegetables(v)(d,e) "Lalign(center)", "treemode(L)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(L)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(136);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Ralign(right)", "treemode(R)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Ralign(center)", "treemode(R)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(R)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(137);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ rebindrelativeObj(f)(0,0,xpart(v.e-v.w-f.e+f.w),0);
+ newTree.fruits(f)(a,b,c) "Ralign(right)", "treemode(R)";
+ newTree.vegetables(v)(d,e) "Ralign(center)", "treemode(R)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(R)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(138);
+ newBox.a(btex apples\strut etex);
+ newBox.b(btex oranges\strut etex);
+ newBox.c(btex bananas\strut etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Ualign(bot)", "treemode(U)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Ualign(center)", "treemode(U)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(U)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(139);
+ setObjectDefaultOption("Tree")("treeflip")(true);
+ newBox.a(btex apples\strut etex);
+ newBox.b(btex oranges\strut etex);
+ newBox.c(btex bananas\strut etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Ualign(bot)", "treemode(U)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Ualign(center)", "treemode(U)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)", "treemode(U)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+ setObjectDefaultOption("Tree")("treeflip")(false);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(140);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Dalign(bot)", "hideleaves(true)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Dalign(center)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(142);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Dalign(bot)", "hideleaves(true)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Dalign(center)", "hideleaves(true)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hbsep(5cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(144);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Dalign(bot)", "hideleaves(true)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Ralign(center)", "hideleaves(true)", "treemode(R)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hbsep(1cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(146);
+ newBox.a(btex apples etex);
+ newBox.b(btex oranges etex);
+ newBox.c(btex bananas etex);
+ newBox.f(btex fruits etex);
+ newTree.fruits(f)(a,b,c) "Lalign(left)", "hideleaves(true)", "treemode(L)",
+ "vsep(3mm)";
+ newBox.d(btex potatoes etex);
+ newBox.e(btex peas etex);
+ newBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "align(center)", "hideleaves(true)", "treemode(R)";
+ newBox.fo(btex food etex);
+ newTree.food(fo)(fruits,vegetables) "hbsep(1cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+clearObj a,b,c,f,fruits,d,e,v,vegetables,fo,food;
+
+beginfig(148);
+ newPolygon.a(btex apples etex,5);
+ newPolygon.b(btex oranges etex,6);
+ newPolygon.c(btex bananas etex,7);
+ newPolygon.f(btex fruits etex,8);
+ newTree.fruits(f)(a,b,c) "Lalign(left)", "hideleaves(true)", "treemode(L)",
+ "vsep(3mm)";
+ newEllipse.d(btex potatoes etex);
+ newDEllipse.e(btex peas etex);
+ newDBox.v(btex vegetables etex);
+ newTree.vegetables(v)(d,e) "Ralign(center)", "hideleaves(true)", "treemode(R)";
+ newPolygon.fo(btex food etex,12);
+ newTree.food(fo)(fruits,vegetables) "hsep(1cm)";
+ scaleObj(food,.5);
+ food.c=origin;
+ drawObj(food);
+endfig;
+
+beginfig(149);
+ newDEllipse.ff(food);
+ ff.c=origin;
+ drawObj(ff);
+endfig;
+
+clearObj ff;
+
+beginfig(150);
+ rebindVisibleObj(food);
+ newDEllipse.ff(food);
+ drawObj(ff);
+endfig;
+
+beginfig(151);
+ newEllipse.xx(btex This is a new root etex);
+ newTree.x(xx)(ff);
+ drawObj(x);
+endfig;
+
+clearObj x,xx,food,ff,a,b,c,f,fruits,d,e,v,vegetables,fo;
+
+% fans
+
+beginfig(160);
+newBox.a(btex root etex);
+newBox.leaf1(btex leaf 1 etex);
+newBox.leaf2(btex leaf 2 etex);
+newHFan.f(1cm,0);
+newTree.t(a)(leaf1,leaf2,f) "hsep(5mm)","Dalign(center)";
+t.c=origin;
+drawObj(t);
+endfig;
+
+clearObj a,leaf,f,t;
+
+beginfig(161);
+newBox.a(btex root etex);
+newBox.leaf1(btex leaf 1 etex);
+newBox.leaf2(btex leaf 2 etex);
+newHFan.f(2cm,0);
+newTree.t(a)(leaf1,leaf2,f) "hsep(5mm)","Dalign(center)";
+t.c=origin;
+drawObj(t);
+endfig;
+
+clearObj a,leaf,f,t;
+
+beginfig(162);
+newBox.a(btex root etex);
+newBox.leaf1(btex leaf 1 etex);
+newBox.leaf2(btex leaf 2 etex);
+newVFan.f(0,1.5cm);
+newTree.t(a)(leaf1,leaf2,f) "vsep(5mm)","Ralign(right)","treemode(R)";
+t.c=origin;
+drawObj(t);
+endfig;
+
+clearObj a,leaf,f,t;
+
+
+beginfig(201);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newPTree.proof(c)(a,b)("")("");
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+clearObj a,b,c,proof;
+
+beginfig(202);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newPTree.proof(c)(a,b)("")("") "treemode(U)";
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+
+clearObj a,b,c,proof;
+
+beginfig(203);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newPTree.proof(c)(a,b)(btex (left rule) etex)(btex (right rule) etex);
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+clearObj a,b,c,proof;
+
+beginfig(204);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newPTree.proof(c)(a,b)("")(btex (MP) etex);
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+clearObj a,b,c,proof;
+
+beginfig(205);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newPTreeR.proof(c)(a,b)(btex (MP) etex) "lenddx(1cm)";
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+beginfig(206);
+ scaleObj(proof,2);
+ slantObj(proof,1);
+ proof.c=origin;
+ drawObj(proof);
+endfig;
+
+clearObj a,b,c,proof;
+
+beginfig(220);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $B$ etex);
+ newAssumption.d(btex $D$ etex);
+ newAssumption.e(btex $E$ etex);
+ newPTreeR.proof1(c)(a,b)(btex (MP) etex);
+ newPTreeR.proof2(proof1)(d,e)("") "treemode(U)";
+ proof2.c=origin;
+ drawObj(proof2);
+endfig;
+
+clearObj a,b,c,d,e,proof;
+
+beginfig(221);
+ newAssumption.a(btex $A$ etex);
+ newAssumption.b(btex $A\rightarrow B$ etex);
+ newConclusion.c(btex $BBBBBBBBBBBBBB$ etex);
+ newAssumption.d(btex $D$ etex);
+ newAssumption.e(btex $E$ etex);
+ newPTreeR.proof1(c)(a,b)(btex (MP) etex);
+ newPTreeR.proof2(proof1)(d,e)("") "treemode(U)";
+ proof2.c=origin;
+ drawObj(proof2);
+endfig;
+
+clearObj a,b,c,d,e,proof;
+
+beginfig(300);
+
+ newBox.mela(btex A etex);
+ newMatrix.mat(1,1)(mela);
+ mat.c=origin;
+ drawObj(mat);
+endfig;
+
+clearObj mat,mela;
+
+beginfig(302);
+
+ newBox.melb(btex B etex) "dx(1cm)";
+ newBox.melc(btex C etex) "dy(1cm)";
+ newMatrix.mata(2,1)(melb,melc);
+
+ mata.c=origin;
+
+ drawObj(mata);
+
+endfig;
+
+beginfig(304);
+ newBox.melba(btex melba etex);
+ newBox.melda(btex D$\displaystyle\int_0^\infty{1\over 1+x^2}dx$ etex);
+ newBox.melbb(btex Bb etex);
+ newBox.melcb(btex C etex);
+ newBox.meldb(btex D etex);
+
+ newMatrix.matc(3,2)(melba,nb,melda,melbb,melcb,meldb)
+ "halign(ew)", "valign(sns)";
+
+ matc.c=origin-(0,10cm);
+ drawObj(matc);
+
+endfig;
+
+beginfig(306);
+
+
+ duplicateObj(matd,matc); % the holes get duplicated
+ scaleObj(matd,2);
+ matd.c=origin-(0,15cm);
+ drawObj(matd);
+
+endfig;
+
+beginfig(308);
+
+
+ newBox.rep(btex Very Long Replacement etex);
+
+ replaceMatrixElement.exp.matd(1,1)(rep);
+ newBox.repc(btex court etex);
+ replaceMatrixElement.exp.matd(1,1)(repc);
+ newBox.repd(btex D etex yscaled 3 rotated 30);
+ replaceMatrixElement.exp.matd(3,2)(repd);
+ newBox.repe(btex 00000000000000000 etex yscaled 3 rotated 30);
+ replaceMatrixElement.exp.matd(1,1)(repe);
+ newBox.repf(btex new line etex);
+ replaceMatrixElement.exp.matd(4,2)(repf);
+ matd.c=origin;
+ drawObj(matd);
+
+endfig;
+
+beginfig(320);
+
+
+ newBox.repg(btex new corner etex);
+ replaceMatrixElement.exp.matd(4,3)(repg);
+ matd.c=origin;
+ drawObj(matd);
+
+
+endfig;
+
+beginfig(330);
+
+
+ deleteMatrixElement.exp.matd(2,2);
+ deleteMatrixElement.exp.matd(4,2);
+ deleteMatrixElement.exp.matd(3,1);
+ deleteMatrixElement.exp.matd(3,2);
+ deleteMatrixElement.exp.matd(3,2);
+ deleteMatrixElement.exp.matd(1,1);
+ matd.c=origin;
+ drawObj(matd);
+
+
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/proofex.mp b/graphics/metapost/contrib/macros/metaobj/examples/proofex.mp
new file mode 100644
index 0000000000..02d61b7df9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/proofex.mp
@@ -0,0 +1,153 @@
+% D. Roegel, 20/5/2001
+
+input metaobj
+
+% Proof from
+% David, Nour, Raffalli: Introduction à la logique, Paris: Dunod, 2001
+% p. 197
+
+verbatimtex
+ \newcount\pntcnt
+ \pntcnt=0
+ \def\npoints#1{\pntcnt=#1\vbox{\offinterlineskip\kern5pt\npointsa}}
+ \def\npointsa{\ifnum\pntcnt>0\hbox{$.$}\kern5pt\advance\pntcnt-1
+ \expandafter\npointsa\fi}
+etex
+
+beginfig(1);
+% setObjectDefaultOption("PTree")("treemode")("U"); % default is down
+ newAssumption.pi1(btex $\Pi_1$ etex);
+ newConclusion.pi1c1(btex \npoints3 etex);
+ newPTreeR.pi1proof(pi1c1)(pi1)("") "rule(0)";
+ newConclusion.pi1c2(btex $\Gamma,B \vdash \Delta$ etex);
+ newPTreeR.a1(pi1c2)(pi1proof)("") "rule(0)";
+
+ newAssumption.pi2(btex $\Pi_2$ etex);
+ newConclusion.pi2c1(btex \npoints3 etex);
+ newPTreeR.pi2proof(pi2c1)(pi2)("") "rule(0)";
+ newConclusion.pi2c2(btex $\Gamma,C \vdash \Delta$ etex);
+ newPTreeR.a2(pi2c2)(pi2proof)("") "rule(0)";
+
+
+ newConclusion.c1(btex $\Gamma,B\lor C \vdash \Delta$ etex);
+ newPTreeR.proof1(c1)(a1,a2)(btex $\lor_g$ etex);
+
+ newAssumption.pi3(btex $\Pi_3$ etex);
+ newConclusion.pi3c1(btex \npoints3 etex);
+ newPTreeR.pi3proof(pi3c1)(pi3)("") "rule(0)";
+ newConclusion.pi3c2(btex $\Gamma' \vdash B,C, \Delta'$ etex);
+ newPTreeR.a3(pi3c2)(pi3proof)("") "rule(0)";
+
+ newConclusion.c2
+ (btex $\Gamma_A,\Gamma'\vdash B,C,\Delta,\Delta'_A$ etex);
+ newPTreeR.proof2(c2)(proof1,a3)(btex {\it mix\/}$(1)$ etex);
+ newConclusion.c2points
+ (btex $\npoints{12}$ etex);
+ newPTreeR.proof2a(c2points)(proof2)("") "rule(0)";
+
+ duplicateObj(a4,a1);
+ duplicateObj(a5,a3);
+ newConclusion.c3(btex $\Gamma' \vdash B\lor C, \Delta'$ etex);
+ newPTreeR.proof3(c3)(a5)(btex $\lor_d$ etex);
+ newConclusion.c4(btex $\Gamma_A,\Gamma',B \vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof4(c4)(a4,proof3)(btex {\it mix\/}$(2)$ etex);
+ newConclusion.c5(btex $\Gamma_A,\Gamma',\Gamma_A,\Gamma'
+ \vdash C,\Delta, \Delta'_A,\Delta, \Delta'_A$ etex);
+ newHRazor.hr1(-4cm);
+ newPTreeR.proof5(c5)(proof2a,hr1,proof4)(btex {\it mix\/}$(3)$ etex);
+
+ duplicateObj(a6,a2);
+
+ duplicateObj(proof3a,proof3);
+
+ newConclusion.c7(btex $\Gamma_A,\Gamma',C
+ \vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof3b(c7)(a6,proof3a)(btex {\it mix\/}$(4)$ etex);
+ newConclusion.c8(btex $\Gamma_A,\Gamma',\Gamma_A,\Gamma',\Gamma_A,\Gamma'
+ \vdash \Delta, \Delta'_A,\Delta, \Delta'_A,\Delta, \Delta'_A$ etex);
+ newPTreeR.proof3d(c8)(proof5,proof3b)(btex {\it mix\/}$(5)$ etex)
+ "hsep(5mm)";
+ newConclusion.c9(btex $\Gamma_A,\Gamma'\vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof3E(c9)(proof3d)(btex contr$_g$,contr$_d$ etex);
+
+
+ %yscaleObj(proof3E,2);
+ %reflectObj(proof3E,(0,0),(0,1));
+ %slantObj(proof3E,0.2);
+
+ proof3E.c=origin;
+ drawObj(proof3E);
+
+endfig;
+
+clearObj pi,a,c,proof,hr;
+
+beginfig(2);
+ setObjectDefaultOption("PTree")("treemode")("U"); % default is down
+ newAssumption.pi1(btex $\Pi_1$ etex);
+ newConclusion.pi1c1(btex \npoints3 etex);
+ newPTreeR.pi1proof(pi1c1)(pi1)("") "rule(0)";
+ newConclusion.pi1c2(btex $\Gamma,B \vdash \Delta$ etex);
+ newPTreeR.a1(pi1c2)(pi1proof)("") "rule(0)";
+
+ newAssumption.pi2(btex $\Pi_2$ etex);
+ newConclusion.pi2c1(btex \npoints3 etex);
+ newPTreeR.pi2proof(pi2c1)(pi2)("") "rule(0)";
+ newConclusion.pi2c2(btex $\Gamma,C \vdash \Delta$ etex);
+ newPTreeR.a2(pi2c2)(pi2proof)("") "rule(0)";
+
+
+ newConclusion.c1(btex $\Gamma,B\lor C \vdash \Delta$ etex);
+ newPTreeR.proof1(c1)(a1,a2)(btex $\lor_g$ etex);
+
+ newAssumption.pi3(btex $\Pi_3$ etex);
+ newConclusion.pi3c1(btex \npoints3 etex);
+ newPTreeR.pi3proof(pi3c1)(pi3)("") "rule(0)";
+ newConclusion.pi3c2(btex $\Gamma' \vdash B,C, \Delta'$ etex);
+ newPTreeR.a3(pi3c2)(pi3proof)("") "rule(0)";
+
+ newConclusion.c2
+ (btex $\Gamma_A,\Gamma'\vdash B,C,\Delta,\Delta'_A$ etex);
+ newPTreeR.proof2(c2)(proof1,a3)(btex {\it mix\/}$(1)$ etex);
+ newConclusion.c2points
+ (btex $\npoints{12}$ etex);
+ newPTreeR.proof2a(c2points)(proof2)("") "rule(0)";
+
+ duplicateObj(a4,a1);
+ duplicateObj(a5,a3);
+ newConclusion.c3(btex $\Gamma' \vdash B\lor C, \Delta'$ etex);
+ newPTreeR.proof3(c3)(a5)(btex $\lor_d$ etex);
+ newConclusion.c4(btex $\Gamma_A,\Gamma',B \vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof4(c4)(a4,proof3)(btex {\it mix\/}$(2)$ etex);
+ newConclusion.c5(btex $\Gamma_A,\Gamma',\Gamma_A,\Gamma'
+ \vdash C,\Delta, \Delta'_A,\Delta, \Delta'_A$ etex);
+ newHRazor.hr1(-4cm);
+ newPTreeR.proof5(c5)(proof2a,hr1,proof4)(btex {\it mix\/}$(3)$ etex);
+
+ duplicateObj(a6,a2);
+
+ duplicateObj(proof3a,proof3);
+
+ newConclusion.c7(btex $\Gamma_A,\Gamma',C
+ \vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof3b(c7)(a6,proof3a)(btex {\it mix\/}$(4)$ etex);
+ newConclusion.c8(btex $\Gamma_A,\Gamma',\Gamma_A,\Gamma',\Gamma_A,\Gamma'
+ \vdash \Delta, \Delta'_A,\Delta, \Delta'_A,\Delta, \Delta'_A$ etex);
+ newPTreeR.proof3d(c8)(proof5,proof3b)(btex {\it mix\/}$(5)$ etex)
+ "hsep(5mm)";
+ newConclusion.c9(btex $\Gamma_A,\Gamma'\vdash \Delta, \Delta'_A$ etex);
+ newPTreeR.proof3E(c9)(proof3d)(btex contr$_g$,contr$_d$ etex);
+
+
+ %yscaleObj(proof3E,2);
+ %reflectObj(proof3E,(0,0),(0,1));
+ %slantObj(proof3E,0.2);
+
+ proof3E.c=origin;
+ drawObj(proof3E);
+
+endfig;
+
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/pstricksex1.mp b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex1.mp
new file mode 100644
index 0000000000..ef733cf97c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex1.mp
@@ -0,0 +1,311 @@
+% This file contains metaobj code for several figures of the pstricks manual,
+% regarding connections, matrices and trees.
+
+% D. Roegel, May 6-9, 2001
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+def TCs=
+ new_Circle_("")("filled(true)")
+enddef;
+
+def Tdot(expr p)=
+ new_Circle_(p)("circmargin(-.2mm)")
+enddef;
+
+def Toplus=
+ Tdot(btex $+$ etex)
+enddef;
+
+input metaobj
+
+% page 26 of beta manual
+
+beginfig(1);
+ setObjectDefaultOption("Matrix")("hsep")(1cm);
+ setObjectDefaultOption("Matrix")("vsep")(1cm);
+ newBox.a(btex $U$ etex) "framed(false)";
+ newBox.b(btex $X\times_Z Y$ etex) "framed(false)";
+ newBox.c(btex $X$ etex) "framed(false)";
+ newBox.d(btex $Y$ etex) "framed(false)";
+ newBox.e(btex $Z$ etex) "framed(false)";
+ newMatrix.mat(3,3)(a,nb,nb,nb,b,c,nb,d,e);
+ mat.c=origin;
+
+ mcline.mat(1,1,2,2) "name(a)";
+ ObjLabel.mat(btex $y$ etex) "labpathname(a)","labdir(llft)";
+ mcline.mat(1,1,2,3) "doubleline(true)",
+ "arrows(draw)","linestyle(dashed evenly)", "name(b)";
+ ObjLabel.mat(btex $x$ etex) "labpathname(b)","labdir(urt)";
+ mcline.mat(2,2,2,3), "name(c)";
+ ObjLabel.mat(btex $p$ etex) "labpathname(c)","labdir(bot)";
+ mcline.mat(2,2,3,2), "name(d)";
+ ObjLabel.mat(btex $q$ etex) "labpathname(d)","labdir(lft)";
+ mcline.mat(3,2,3,3), "name(e)";
+ ObjLabel.mat(btex $g$ etex) "labpathname(e)","labdir(bot)";
+ mcline.mat(2,3,3,3), "name(f)";
+ ObjLabel.mat(btex $f$ etex) "labpathname(f)","labdir(rt)";
+
+ drawObj(mat);
+endfig;
+
+clearObj a,b,c,d,e,mat;
+
+% page 27 of beta manual
+
+beginfig(3);
+ newCircle.a(btex A etex);
+ newCircle.b(btex B etex);
+ newCircle.c(btex C etex);
+ newCircle.d(btex D etex);
+ newCircle.e(btex E etex);
+ verbatimtex \small etex;
+ newMatrix.mat(3,3)(nb,a,nb,b,e,c,nb,d,nb) "hsep(2cm)", "vsep(2cm)";
+ mcline.mat(2,2,2,3) "name(a)";
+ ObjLabel.mat(btex a etex) "labpathname(a)","labpos(0.75)", "labdir(top)";
+ mcline.mat(2,2,2,1) "name(b)";
+ ObjLabel.mat(btex b etex) "labpathname(b)","labdir(bot)";
+ mcline.mat(3,2,2,1) "name(c)";
+ ObjLabel.mat(btex c etex) "labpathname(c)","labdir(llft)";
+ mcarc.mat(3,2,1,2)
+ "arcangleA(-40)","arcangleB(-40)", "border(3pt)", "name(d)";%,
+ %"laberase(true)";
+ ObjLabel.mat(btex d etex) "labpathname(d)","labdir(lrt)", "labpos(0.3)";
+ ObjLabel.mat(btex e etex) "labpathname(d)","labdir(llft)", "labpos(0.7)";
+ mcarc.mat(1,2,2,1) "arcangleA(12)","arcangleB(12)", "name(f)";
+ ObjLabel.mat(btex f etex) "labpathname(f)","labdir(lrt)";
+ mcarc.mat(2,1,1,2) "arcangleA(12)","arcangleB(12)", "name(g)";
+ ObjLabel.mat(btex g etex) "labpathname(g)","labdir(ulft)";
+ mat.c=origin;
+ drawObj(mat);
+endfig;
+
+% page 28 of beta manual
+
+clearObj a,b,c,d,e,mat;
+
+beginfig(4);
+ newCircle.x(btex X etex);
+ newCircle.y(btex Y etex) "framed(false)";
+ newCircle.Z(btex Z etex) "framed(false)"; % |z| is reserved
+ newMatrix.mat(2,2)(nb,x,y,Z) "hsep(1cm)", "vsep(2cm)";
+ mcline.mat(1,2,2,1) "nodesepA(3pt)";
+ mcline.mat(1,2,2,2) "nodesepA(3pt)";
+ mcline.mat(2,1,2,2) "linestyle(dashed withdots)";
+ mat.c=origin;
+ drawObj(mat);
+endfig;
+
+clearObj x,y,Z,mat;
+
+% page 33 of beta manual
+
+beginfig(5);
+ setCurveDefaultOption("arrows")("draw"); % works
+ t=_T(new_Ellipse(btex root etex))(TCs,TCs,TCs,TCs);
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(55);
+setCurveDefaultOption("arrows")("draw");
+ u=T_(Tn)(TCs,
+ T_(Tc)(TCs,TCs)("hbsep(5mm)","hideleaves(true)"),
+ TCs)("hbsep(5mm)");
+
+ Obj(u).c=origin;
+ draw_Obj(u);
+endfig;
+
+
+% page 34 of beta manual
+
+beginfig(6);
+setCurveDefaultOption("arrows")("draw");
+ t:=_T(new_Circle(btex $X$ etex))
+ (new_Box_(btex $\tilde{\tilde{X}}$ etex)("framed(false)"),
+ new_Box_(btex $x$ etex)("framed(false)"),
+ new_Box_(btex $y$ etex)("framed(false)"));
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(66);
+setCurveDefaultOption("arrows")("draw");
+ % in the next example, we align the baselines, by adding \strut s:
+ t:=_T(new_Circle(btex $X$ etex))
+ (new_Box_(btex \strut $\smash{\tilde{\tilde{X}}}$ etex)("framed(false)"),
+ new_Box_(btex \strut $x$ etex)("framed(false)"),
+ new_Box_(btex \strut $y$ etex)("framed(false)"));
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+
+
+% page 35 of beta manual
+
+
+beginfig(7);
+setCurveDefaultOption("arrows")("draw");
+ setCurveDefaultOption("nodesepA")(3pt); % works
+ setCurveDefaultOption("nodesepB")(3pt); % works
+ setObjectDefaultOption("Tree")("hideleaves")(true); % works
+
+ t:=_T(TCs)
+ (_T(TCs)(TCs,Tn),
+ _T(TCs)(TCs,_T(TCs)(Tn,TCs))
+ );
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setCurveDefaultOption("nodesepA")(0); % works
+ setCurveDefaultOption("nodesepB")(0); % works
+endfig;
+
+% page 36 of beta manual
+
+beginfig(8);
+ setObjectDefaultOption("Tree")("hideleaves")(true);
+ t:=T_(new_Circle(btex foo etex))
+ (new_HFan_(1cm,0)("filled(true)"),
+ Tf,
+ _T(new_RBox(btex bar etex))(new_HFan(1cm,0))
+ )
+ ("Dalign(center)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setObjectDefaultOption("Tree")("hideleaves")(false);
+endfig;
+
+beginfig(88);
+ setObjectDefaultOption("Tree")("hideleaves")(true);
+ t:=_T(new_Circle(btex foo etex))
+ (_T(new_HFan_(1cm,0)("filled(true)","fillcolor(red)","fanlinearc(1mm)"
+ %,"pointedfan(false)"
+ ))
+ (TCs,new_HFan_(1cm,0)("fanlinestyle(dashed evenly)")));
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setObjectDefaultOption("Tree")("hideleaves")(false);
+endfig;
+
+% page 37 of beta manual
+
+beginfig(9);
+setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("hideleaves")(true); % works
+ setCurveDefaultOption("nodesepA")(3pt); % works
+ setCurveDefaultOption("nodesepB")(3pt); % works
+ setObjectDefaultOption("Tree")("Ualign")("center");
+ setObjectDefaultOption("Tree")("Lalign")("center");
+ setObjectDefaultOption("Tree")("hbsep")(5mm);
+ setObjectDefaultOption("Tree")("vbsep")(5mm);
+ setObjectDefaultOption("Tree")("hsep")(2cm);
+ setObjectDefaultOption("Tree")("vsep")(2cm);
+
+ t:=T_(Tc_(1.5mm))(T_(Tc_(1.5mm))(Toplus,Toplus)("treemode(L)"),Toplus,Toplus)("treemode(U)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setCurveDefaultOption("nodesepA")(0pt); % works
+ setCurveDefaultOption("nodesepB")(0pt); % works
+endfig;
+
+beginfig(10);
+setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("hsep")(1cm);
+ setObjectDefaultOption("Tree")("vsep")(1cm);
+ % we draw two trees which share a root node:
+ t:=T_(new_Circle(btex root etex))(Tr_(btex B etex))("treemode(L)");
+ Obj(t).c=origin;
+ u:=_T(obj(Obj(t).root))(Tr_(btex A1 etex),Tr_(btex A2 etex));
+ draw_Obj(t);
+ draw_Obj(u);
+endfig;
+
+% page 38 of beta manual
+
+beginfig(11);
+setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("Dalign")("center");
+ setObjectDefaultOption("Tree")("hbsep")(5mm);
+
+ t:=_T(Tc)(TCs,
+ T_(Tc)(new_Circle_("")("filled(true)","circmargin(15pt)"),TCs)
+ ("treenodehsize(1cm)"),
+ TCs);
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(110);
+ setCurveDefaultOption("arrows")("draw");
+ t:=_T(Tc)(Tr_(btex $j$ etex),Tr_(btex $K_4$ etex),Tr_(btex $x>y$ etex));
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(111);
+ setCurveDefaultOption("arrows")("draw");
+ t:=T_(Tc)(Tr_(btex $j$ etex),Tr_(btex $K_4$ etex),Tr_(btex $x>y$ etex))
+ ("treenodehsize(5mm)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+ setObjectDefaultOption("Tree")("Dalign")("top");
+ setObjectDefaultOption("Tree")("hideleaves")(false); % works
+
+% page 39 of beta manual
+
+beginfig(12);
+ setCurveDefaultOption("arrows")("draw");
+ t:=_T(TCs)(Tc,_T(TCs)(_T(Tc)(Tc,Tc,Tc),TCs,TCs,TCs));
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(120);
+ setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("hideleaves")(true);
+ t:=_T(TCs)(Tc,_T(TCs)(_T(Tc)(Tc,Tc,Tc),TCs,TCs,TCs));
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setObjectDefaultOption("Tree")("hideleaves")(false);
+endfig;
+
+beginfig(121);
+ setCurveDefaultOption("arrows")("draw");
+ t:=T_(TCs)(_T(TCs)(TCs,TCs),_T(TCs)(TCs,TCs))("vsep(.5cm)","hbsep(2cm)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+% page 40 of beta manual
+
+beginfig(13);
+ % We don't have a hook for a given level as PSTricks does,
+ % so we have to give the hsep option several times;
+ % however, we could avoid it by building the tree in a non-streamlined way.
+ % Also, the labels must be given in the opposite order.
+ setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("treemode")("R");
+ %setObjectDefaultOption("Tree")("treeflip")(true);
+ t:=_T(Tc)(
+ _T(TCs)(T_(TCs)(Tr_(btex $J_1$ etex),Tr_(btex $J_2$ etex))("hsep(3cm)"),
+ T_(TCs)(Tr_(btex $K_1$ etex),Tr_(btex $K_2$ etex))("hsep(3cm)")
+ ),
+ _T(TCs)(T_(TCs)(Tr_(btex $Y_1$ etex),Tr_(btex $Y_2$ etex))("hsep(3cm)"),
+ T_(TCs)(Tr_(btex $X_1$ etex),Tr_(btex $X_2$ etex))("hsep(3cm)")
+ )
+ );
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+
+end
+
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/pstricksex2.mp b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex2.mp
new file mode 100644
index 0000000000..c1fb1ba0a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex2.mp
@@ -0,0 +1,136 @@
+input metaobj
+
+% page 41 of beta manual
+
+beginfig(15);
+ setObjectDefaultOption("Tree")("treemode")("R");
+ t:=T_(new_Circle_("")("circmargin(3mm)"))
+ (Tcircle_(btex L etex),Tcircle_(btex H etex),
+ Tcircle_(btex K etex),Tcircle_(btex N etex))("edge(ncdiag)", "angleB(0)",
+ "armA(0)","armB(1cm)","hsep(3.5cm)","posA(e)","arrows(draw)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+% page 42 of beta manual
+
+beginfig(16);
+ setObjectDefaultOption("Tree")("treemode")("R");
+ setObjectDefaultOption("Tree")("Ralign")("center");
+ t:=T_(new_Circle_("")("circmargin(1mm)","framewidth(1pt)"))
+ (Tr_(btex $x<y$ etex),Tr_(btex $z_2 < y\leq x$ etex),
+ Tr_(btex $z_1<y\leq z_2$ etex),Tr_(btex $z_1\leq y$ etex))
+ ("edge(ncdiag)", "nodesepA(2mm)","angleB(0)",
+ "armA(0)","armB(3cm)","hsep(3.5cm)","arrows(draw)","vbsep(5mm)",
+ "linewidth(1pt)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(17);
+ setObjectDefaultOption("Tree")("treemode")("U");
+ setObjectDefaultOption("Tree")("hbsep")(5mm);
+ setObjectDefaultOption("Tree")("hideleaves")(true); % works
+ setCurveDefaultOption("arrows")("draw");
+
+ t:=_T(Tc)(TCs,_T(Tc)(TCs,TCs),TCs);
+
+ % changes to the edges:
+ setTreeEdge(Obj(t))(1)(linestyle)("dashed evenly");
+ setTreeEdge(treepos(Obj(t))(2))(1)(linestyle)("dashed evenly");
+
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setObjectDefaultOption("Tree")("treemode")("D");
+ setObjectDefaultOption("Tree")("hideleaves")(false);
+endfig;
+
+% page 43 of beta manual
+
+beginfig(18);
+ setCurveDefaultOption("arrows")("draw");
+ setCurveDefaultOption("nodesepA")(2mm);
+ setCurveDefaultOption("nodesepB")(2mm);
+
+ t:=_T(Toval_(btex nature etex))
+ (_T(new_Circle_("")("circmargin(1mm)","name(top)"))(TCs,TCs),
+ _T(new_Circle_("")("circmargin(1mm)","name(bot)"))(TCs,TCs));
+ Obj(t).c=origin;
+
+ ncline.Obj(t)("top")("bot")
+ "nodesepA(0)","nodesepB(0)","linestyle(dashed evenly)";
+
+ draw_Obj(t);
+ setCurveDefaultOption("nodesepA")(0);
+ setCurveDefaultOption("nodesepB")(0);
+endfig;
+
+beginfig(19);
+ setCurveDefaultOption("arrows")("draw");
+ setObjectDefaultOption("Tree")("treemode")("R");
+ t:=T_(Toval_(btex root etex))
+ (Tr_(btex Z etex),Tr_(btex Y etex),Tr_(btex X etex))
+ ("edge(nccurve)","angleA(0)","angleB(0)","hsep(3.5cm)",
+ "posA(e)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+ setObjectDefaultOption("Tree")("treemode")("D");
+endfig;
+
+beginfig(20);
+ setCurveDefaultOption("arrows")("drawarrow");
+ t:=T_(new_Polygon_(btex root etex)(4)("name(top)"))
+ (new_Box_(btex x etex)("framed(false)","name(lx)"),
+ new_Box_(btex y etex)("framed(false)","name(ly)"),
+ new_Box_(btex z etex)("framed(false)","name(lz)"))
+ ("edge(none)","vsep(1.5cm)");
+ ncbar.Obj(t)("top")("lx") "angleA(180)","armA(1cm)";
+ ncline.Obj(t)("top")("ly");
+ ncbar.Obj(t)("top")("lz") "angleA(0)","armA(1cm)";
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(21);
+ setObjectDefaultOption("Tree")("treemode")("D");
+ setCurveDefaultOption("nodesepA")(2mm);
+ setCurveDefaultOption("nodesepB")(0);
+ setCurveDefaultOption("arrows")("rdrawarrow");
+
+ t:=T_(new_Polygon_(btex root etex,3)("angle(90)","polymargin(4mm)"))
+ (TCs,TCs,TCs,TCs)
+ ("edge(rncangle)","angleA(90)","angleB(90)","armB(1cm)","vsep(2.5cm)");
+ Obj(t).c=origin;
+ draw_Obj(t);
+endfig;
+
+beginfig(22);
+ newBox.a(btex Idea1 etex);
+ newBox.b(btex Idea2 etex);
+ b.c-a.c=(5cm,3cm);
+ a.c=origin;
+ ncbox(a)(b) "linearc(1mm)","linestyle(dashed evenly)",
+ "boxsize(1cm)","nodesepA(1cm)","nodesepB(1cm)";
+ drawObj(a,b);
+endfig;
+
+clearObj a,b;
+
+beginfig(23);
+ newBox.a(btex Idea1 etex);
+ newBox.b(btex Idea2 etex);
+ b.c-a.c=(5cm,3cm);
+ a.c=origin;
+ ncarcbox(a)(b) "doubleline(true)",
+ %"doublesep(5mm)",
+ "linestyle(dashed evenly)",
+ "boxsize(7mm)","nodesepA(1cm)","nodesepB(1cm)","arcangleA(-50)";
+ drawObj(a,b);
+endfig;
+
+
+
+end
+
+
+
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/pstricksex3.mp b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex3.mp
new file mode 100644
index 0000000000..386b76ebf9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex3.mp
@@ -0,0 +1,127 @@
+input metaobj
+
+% the black disk is small, but its bounding box is extended so that we
+% get a good alignment with the empty circles
+
+% TCE=TC Extended
+def TCE=
+ rebindrelative_Obj(new_Circle_("")("filled(true)","circmargin(.5mm)"))
+ (1.5mm,-1.5mm,1.5mm,-1.5mm)
+enddef;
+
+% 11-12/5/2001
+beginfig(25);
+ setCurveDefaultOption("arrows","draw");
+ setObjectDefaultOption("Tree")("vsep")(2cm);
+ setObjectDefaultOption("Tree")("hbsep")(2cm);
+ setObjectDefaultOption("Tree")("treenodevsize")(5mm);
+ t:=T_(Tn)(T_(Tr_(btex Player 1 etex))
+ (T_(Tr_(btex Player 2 etex))
+ (Tr_(btex Player 3 etex))("edge(none)"))("edge(none)"),
+ T_(Tc_(2mm))(
+ _T(Tc_(2mm))(TCE,T_(Tc_(2mm))(TCE,TCE)("hideleaves(true)")),
+ _T(Tc_(2mm))(TCE,T_(Tc_(2mm))(TCE,TCE)("hideleaves(true)"))
+ )("hbsep(2cm)"),
+ new_HRazor(-5cm),
+ TCE)("edge(none)");
+ Obj(t).c=origin;
+
+ ncbox.Obj(t)(treeroot(Obj(t))(2,1))
+ (treeroot(Obj(t))(2,2))
+ "linestyle(dashed evenly)", "boxsize(3mm)",
+ "nodesepA(5mm)", "nodesepB(5mm)", "linearc(3mm)";
+ ncarcbox.Obj(t)(treeroot(Obj(t))(2,1,2))
+ (treeroot(Obj(t))(2,2,2))
+ "linestyle(dashed evenly)", "arcangleA(30)",
+ "nodesepA(5mm)", "nodesepB(5mm)","boxsize(3mm)";
+ ncline.Obj(t)(treeroot(Obj(t))(2))(treeroot(Obj(t))(4)) "name(N)";
+
+ ObjLabel.Obj(t)(btex N etex) "labpathname(N)", "labdir(top)";
+ % we add labels on edges; the standard edges of a tree are numbered 1,2, ...
+ % and we use |labpathid|; we must take care to give the correct objet
+ % as first parameter of |ObjLabel|.
+ ObjLabel.treepos(Obj(t))(2)(btex L etex) "labpathid(1)", "labdir(lft)";
+ ObjLabel.treepos(Obj(t))(2)(btex R etex) "labpathid(2)", "labdir(rt)";
+
+ ObjLabel.ntreepos(Obj(t))(2,1)(btex l etex) "labpathid(1)", "labdir(lft)";
+ % The previous is a shorthand for
+ % ObjLabel.treepos(treepos(Obj(t))(2))(1)(btex l etex)
+ % "labpathid(1)", "labdir(lft)";
+
+ ObjLabel.ntreepos(Obj(t))(2,1)(btex r etex) "labpathid(2)"
+ %,"laberase(true)";
+ , "labdir(rt)";
+ ObjLabel.ntreepos(Obj(t))(2,2)(btex l etex) "labpathid(1)", "labdir(lft)";
+ ObjLabel.ntreepos(Obj(t))(2,2)(btex r etex) "labpathid(2)", "labdir(rt)";
+
+ ObjLabel.ntreepos(Obj(t))(2,1,2)(btex c etex) "labpathid(1)", "labdir(lft)";
+ ObjLabel.ntreepos(Obj(t))(2,1,2)(btex d etex) "labpathid(2)", "labdir(rt)";
+ ObjLabel.ntreepos(Obj(t))(2,2,2)(btex c etex) "labpathid(1)", "labdir(lft)";
+ ObjLabel.ntreepos(Obj(t))(2,2,2)(btex d etex) "labpathid(2)", "labdir(rt)";
+
+ % labels on nodes:
+ ObjLabel.ntreepos(Obj(t))(2,1,1)(btex $(-10,10.-10)$ etex) "labcard(s)";
+ % the distance between the node and the label is 1cm as defined in |ObjLabel|
+ ObjLabel.ntreepos(Obj(t))(2,2,1)(btex $(10,-10.0)$ etex) "labcard(s)";
+ ObjLabel.ntreepos(Obj(t))(2,1,2,1)(btex $(3,8,-4)$ etex) "labcard(s)";
+ ObjLabel.ntreepos(Obj(t))(2,1,2,2)(btex $(-8,3,4)$ etex) "labcard(s)";
+ ObjLabel.ntreepos(Obj(t))(2,2,2,1)(btex $(4,8,-3)$ etex) "labcard(s)";
+ ObjLabel.ntreepos(Obj(t))(2,2,2,2)(btex $(0,-5,0)$ etex) "labcard(s)";
+
+ ObjLabel.treepos(Obj(t))(4)(btex $(0,0,0)$ etex) "labcard(e)";
+ % 4, because the HRazor counts for one subtree
+
+ draw_Obj(t);
+
+endfig;
+
+% TCE=TC Extended
+def TCE=
+ rebindrelative_Obj(new_Circle_("")("filled(true)","circmargin(.5mm)"))
+ (.5mm,-.5mm,.5mm,-.5mm)
+enddef;
+
+beginfig(27);
+setCurveDefaultOption("arrows","draw");
+ setObjectDefaultOption("Tree")("treemode")("R");
+ setObjectDefaultOption("Tree")("vbsep")(5mm);
+ setObjectDefaultOption("Tree")("treenodevsize")(-1);
+ setObjectDefaultOption("Tree")("treenodehsize")(5mm);
+ t:=T_(Tc)(
+ T_(Tc)(
+ _T(Tc)(TCE,TCE),
+ T_(Tn)(T_(Tn)(TCE)("edge(none)"))("edge(none)"),
+ T_(Tn)(T_(Tn)(_T(Tc)(TCE,TCE))("edge(none)"))("edge(none)"),
+ TCE
+ )("edge(none)"),
+ _T(Tn)(new_VFan_(2mm,1cm)("edge(none)"))
+ )("edge(none)","pointedfan(false)");
+
+ ncline.Obj(t)(treeroot(Obj(t))(1))(treeroot(Obj(t))(1,1));
+ ncline.Obj(t)(treeroot(Obj(t))(1))(treeroot(Obj(t))(1,2,1,1));
+ ncline.Obj(t)(treeroot(Obj(t))(1))(treeroot(Obj(t))(1,3,1,1));
+ ncline.Obj(t)(treeroot(Obj(t))(1))(ntreepos(Obj(t))(1,4));
+ ncline.Obj(t)(obj(Obj(t)root)) (treeroot(Obj(t))(1));
+
+ % we call |ncfan| because we draw a non-standard fan
+ ncfan.Obj(t)(obj(Obj(t)root))(ntreepos(Obj(t))(2,1))(2);
+
+ Obj(t).c=origin;
+
+ draw_Obj(t);
+
+ % we call |drawfan| because we draw a non-standard fan
+ drawfan.Obj(t)(ntreepos(Obj(t))(2,1))(2);
+
+% draw ntreepos(Obj(t))(1,2,1,1).nw--
+% ntreepos(Obj(t))(1,2,1,1).ne--
+% ntreepos(Obj(t))(1,2,1,1).se--
+% ntreepos(Obj(t))(1,2,1,1).sw--cycle withcolor red;
+
+% draw treeroot(Obj(t))(1,3,1,1).nw--
+% treeroot(Obj(t))(1,3,1,1).ne--
+% treeroot(Obj(t))(1,3,1,1).se--
+% treeroot(Obj(t))(1,3,1,1).sw--cycle withcolor red;
+
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/metaobj/examples/pstricksex4.mp b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex4.mp
new file mode 100644
index 0000000000..9d9616333d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/examples/pstricksex4.mp
@@ -0,0 +1,25 @@
+input metaobj
+
+% top of page 45 of beta manual
+
+beginfig(30);
+ t:=T_(Tc)(TC,TC,Tc)("treemode(R)","arrows(draw)","hsep(2cm)");
+ Obj(t).c=origin;
+ ObjLabel.Obj(t)(btex below etex) "labpathid(1)", "labdir(bot)";
+ ObjLabel.Obj(t)(btex above etex) "labpathid(2)", "labdir(top)";
+ ObjLabel.Obj(t)(btex above etex) "labpathid(3)", "labdir(top)";
+ draw_Obj(t);
+endfig;
+
+beginfig(31);
+ t:=T_(Tc)(TC,TC,Tc)("treemode(R)","arrows(draw)","hsep(2cm)");
+ Obj(t).c=origin;
+ ObjLabel.Obj(t)(btex below etex)
+ "labpathid(1)", "labdir(bot)","labangle(0)","labpos(0.4)";
+ ObjLabel.Obj(t)(btex above etex) "labpathid(2)", "labdir(top)","labpos(0.6)";
+ ObjLabel.Obj(t)(btex above etex)
+ "labpathid(3)", "labdir(top)","labangle(0)","labpos(0.3)";
+ draw_Obj(t);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metaobj/inputs/metaobj.mp b/graphics/metapost/contrib/macros/metaobj/inputs/metaobj.mp
new file mode 100644
index 0000000000..8daf16e0d3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/inputs/metaobj.mp
@@ -0,0 +1,7710 @@
+% metaobj.mp 0.93
+% D. Roegel (roegel@loria.fr)
+% January 15 - June 14, 2001
+% November 13, 2001
+% December 5, 2001
+% December 23, 2002
+% March 23, 2004
+% April 9, 2004
+% May 27, 2004
+% June 1, 2004
+% October 5, 2005
+% October 23, 2005
+% May 1st, 2006
+% June 18, 2006
+%
+% MetaPost bug:
+% ------------
+% With this file, I discovered a bug in the linux/web2c 7.3.1
+% implementation of metapost. There is a memory leak with
+% respect to strings. Apparently, if you increase |pool_size|
+% and recreate the |.mem|, you can avoid it, but I am not
+% sure the problem is really gone.
+% I mentionned this problem on the metafont mailing list on January 26, 2001.
+%
+% History:
+%
+% January 15, 2001: start of the package
+% January 2001: development of most of
+% the low-level object functions
+% including cloning,
+% as well as many classes of objects,
+% including trees and the option mechanism
+% January 26, 2001: metapost bug discovered
+% February 2001: code improved
+% March-May 2001: paths and labels,
+% addition of many of PSTricks' features
+% May 29, 2001: first private release (0.5)
+% with a 120 pages documentation
+% and 225 KB of core code.
+% May 31, 2001: new option pathfilled for paths
+% 0.51
+% June 5, 2001: coil and zigzag connections, option shortcuts
+% (arm for armA and armB, etc.), arrows shortcuts
+% (-, ->, etc.)
+% June 6, 2001: flip and treeflip options, linetension split
+% into linetensionA and linetensionB
+% June 7, 2001: define_global_pair_option
+% framestyle option
+% ObjColor, ObjString, ObjBoolean and ObjTransform
+% Second private release (0.51)
+% 0.52 June 8, 2001: shadowcolor option
+% June 12, 2001: general shadows for all objects,
+% and simplification of the shadow mechanism for Box
+% 0.60 June 13, 2001: boxheight and boxdepth parameters for ncbox
+% and ncarcbox; addUserPath,addStandardPath,ObjPath;
+% 0.80 June 14, 2001: addition of |unfill| in objects
+% June 14, 2001: first released version on CTAN
+% 0.81 Nov. 13, 2001: bug correction: contrary to what is written above,
+% ObjColor, ObjString, ObjBoolean and ObjTransform
+% were not correctly implemented. The field
+% containing their list (for instance booleanlist_)
+% was not declared. (Bug reported by
+% Marc van Dongen, dongen@cs.ucc.ie,
+% November 5, 2001.)
+% 0.82 Dec. 5, 2001: for compatibility with ConTeXt, the |.exp|
+% extensions were renamed into |.expl|
+% (Bug reported by Eckhart Guthöhrlein,
+% eckhart_guthoehrlein@public.uni-hamburg.de,
+% July 3, 2001)
+% 0.83 Dec. 23, 2002: in addPath, an incorrect use of infinity was
+% replaced by length (infinity can't be used to
+% get the end of a cyclic path, see metapost manual)
+% (bug noticed by Jan Holfert (jan.holfert@gmx.net),
+% comp.text.tex, 2002-05-13 15:00:07 PST,
+% but never reported to me since);
+% all other such misuses (in five other macros)
+% have been corrected.
+% 0.84 March 23, 2004: bug correction in newCircle (usually, only half
+% of the cardinal points were correctly positionned)
+% (bug noticed by Stephan Hennig,
+% comp.text.tex, 2004-03-18 14:55:54 PST)
+% The bug is also visible on page 43 of the manual,
+% when the use of posA(n) is shown.
+% It will be corrected in future versions of
+% the manual.
+% 0.85 April 9, 2004: arctime renamed into arctime_
+% to avoid conflict with the cmarrows package
+% (bug noticed by Stephan Hennig,
+% comp.text.tex)
+% 0.86 May 27, 2004: treemode made a global option of trees
+% (bug noticed by Stephan Hennig)
+% (Actually, a number of local options should be
+% made global, and will probably be made so soon.)
+% 0.87 June 1, 2004: - in drawTree, the root is unfilled only when
+% there are fan children; before, it was always done
+% (bug noticed by Stephan Hennig, May 29, 2004)
+% - in all tc... macros, ntreepos was replaced
+% by treeroot (bug noticed by Stephan Hennig, May 29, 2004)
+% - labshift option now works when labels are attached
+% to paths
+% 0.88 October 5, 2005: - in newMatrix, the largest and tallest elements
+% were not correctly computed when the options
+% matrixnodehsize or matrixnodevsize were positive;
+% surprisingly, these options had never been tested.
+% (bug noticed by Stephan Hennig, September 2005)
+% 0.89 October 23, 2005: - in newMatrix, the bounding box was not correctly
+% computed when the options
+% matrixnodehsize or matrixnodevsize were positive;
+% (bug noticed by Stephan Hennig, October 2005)
+% - also in newMatrix, the vertical distance between
+% two rows was not correctly computed when the option
+% matrixnodevsize was positive (the horizontal
+% distance problem was corrected for version 0.88,
+% but this one was forgotten)
+% (bug noticed by Stephan Hennig, October 2005)
+% 0.90 May 1st, 2006: - in ObjLabel, user labels were only
+% correctly positionned when the c point of the
+% object was at the origin, because I had forgotten
+% to translate the label. Incidentally, the bug
+% occurred right next to the labshift bug corrected
+% for version 0.87.
+% (bug noticed by Stephan Hennig, May 2004,
+% who reminded me on April 30, 2006)
+% 0.91 June 18, 2006: - connections such as ncdiag didn't use
+% global defaults for angleA and angleB
+% (bug noticed by Stephan Hennig, 18 June 2006)
+% This was corrected in macro nc__.
+% 0.92 Sep 27, 2006: - define_local_picture_option added
+% for labels on connections
+% (this change, and those up to Oct. 5,
+% were prompted by Steffen Reith
+% Steffen Reith <streit@streit.cc>)
+% 0.921 Oct 2, 2006: - labpos, labpic, labdist, labangle
+% and labdir can now be used with immediate
+% connections
+% Oct 3, 2006: - the objpathlabel_ macro had a bug related
+% to the change of version 0.90, in that
+% labels were not correctly positioned if
+% the object was not centered at the origin;
+% the problem had only partly been corrected
+% in version 0.90;
+% Oct 5, 2006: - finished the label code for connections
+% added to objects (nc_core_)
+% - the labdist option is now recognized also
+% for ObjLabel
+% 0.923 Nov 10, 2006: - additional testing in nc__ for the case
+% where the two object centers are the same;
+% - new `curvemax' option for nccurve
+% (prompted by Steffen Reith
+% Steffen Reith <streit@streit.cc>)
+% - `nccurve_' was extended to improve
+% its behavior when the curve is looping
+% 0.93 Dec 3, 2006: - improvement of Container class
+% to be mentioned in LGC2
+% (this class was suggested by Michael Schwarz)
+%
+% The code has a lot of formatting for the mft program, but mft (even
+% with Ulrick Vieth's changes) can't be used, because metaobj's code
+% has too many idiosyncrasies. And besides, mft overflows anyway...
+
+% Don't load this package twice:
+if known metaobj_version: expandafter endinput; fi;
+
+numeric metaobj_version;string metaobj_date;
+metaobj_version=0.93;
+metaobj_date="2006/12/03";
+% The banner:
+message "******* metaobj " & decimal (metaobj_version) &
+ " (c) D. Roegel (" & metaobj_date & ") *******";message "";
+
+tracingstats:=1;
+
+% This helps simplifying the code.
+def quote(expr s)=
+ ditto & s & ditto
+enddef;
+
+% Compatibility with |boxes.mp|:
+def boxit=newBox enddef;
+def circleit=newEllipse enddef;
+
+% Compatibility with |rboxes.mp| (which includes |boxes.mp|):
+def rboxit=newRBox enddef;
+
+% We also define |drawboxes|, |drawboxed|, |drawunboxed|, more or less
+% similar to the ones in |boxes.mp|.
+% The corresponding functions in |boxes.mp| also do |fixsize(t); fixpos(t);|
+
+def drawboxed(text t) = % Draw each box
+ forsuffixes s=t:
+ if unknown s.c: s.c=origin;fi;
+ drawObj(s);
+ draw BpathObj(s);
+ endfor
+enddef;
+
+def drawunboxed(text t) = % Draw contents of each box
+ forsuffixes s=t:
+ if unknown s.c: s.c=origin;fi;
+ drawObj(s);
+ endfor
+enddef;
+
+def drawboxes(text t) = % Draw boundary path for each box
+ forsuffixes s=t:
+ if unknown s.c: s.c=origin;fi;
+ draw BpathObj(s);
+ endfor
+enddef;
+
+%---------------------------------------------------------------------
+% First, let's borrow two definitions from |boxes.mp|. We just give
+% them different names to avoid conflicts.
+
+% (from |str_prefix| in |boxes.mp|)
+% Find the length of the prefix of string |s| for which |cond| is true for each
+% character c of the prefix
+vardef str_prefix_(expr s)(text cond) =
+ save i_, c; string c;
+ i_ = 0;
+ forever:
+ c := substring (i_,i_+1) of s;
+ exitunless cond;
+ exitif incr i_=length s;
+ endfor
+ i_
+enddef;
+
+% (from |generisize| in |boxes.mp|)
+% Take a string returned by the |str| operator and return the same string
+% with explicit numeric subscripts replaced by generic subscript symbols [].
+vardef generisize_(expr ss) =
+ save res, s, l; string res, s;
+ res = ""; % result so far
+ s = ss; % left to process
+ forever: exitif s="";
+ l := str_prefix_(s, (c<>"[") and ((c<"0") or (c>"9")));
+ res := res & substring (0,l) of s;
+ s := substring (l,infinity) of s;
+ if s<>"":
+ res := res & "[]";
+ l := if s>="[": 1 + str_prefix_(s, c<>"]")
+ else: str_prefix_(s, (c=".") or ("0"<=c) and (c<="9"))
+ fi;
+ s := substring(l,infinity) of s;
+ fi
+ endfor
+ res
+enddef;
+
+% We also use |pathsel__| when constructing an ellipse.
+% (from |pathsel_| in |boxes.mp|)
+vardef pathsel__(expr a_,b_)(expr dhi)(expr circmargin)(text tt) =
+ save f_, p_; path p_;
+ p_ = origin..(a_,b_)+circmargin*unitvector(a_,b_);
+ vardef f_(expr d_) =
+ xpart((tt) intersectiontimes p_) >= 0
+ enddef;
+ solve f_(0,dhi+1.5circmargin)
+enddef;
+
+%---------------------------------------------------------------------
+
+boolean show_object_names,show_corners,show_empty_boxes;
+show_object_names=false;show_corners=false;
+show_empty_boxes=false;
+
+let obj=scantokens; % This is for clarity and should only be used
+ % when the argument of |scantokens| is a suffix
+ % representing an object. Otherwise, use |sc_|.
+def Obj(expr n)=obj(iname_[n]) enddef;
+
+% A few definitions to simplify the code
+let sc_=scantokens;
+% |currentObjname| is a string representing the current object
+def sco_(expr s)=sc_(currentObjname&s) enddef;
+
+def setcurrentobjname_(expr n)=
+ save currentObjname;
+ string currentObjname;
+ currentObjname=n;
+enddef;
+
+% An array of class names.
+string Classes_[];
+numeric nClasses_; % Number of different instanciated classes.
+nClasses_=0;
+
+numeric ClassName_[]; % The class name of an object.
+ % This is an index into the |Classes_| array.
+
+% This array records the name of an object (not its class)
+string iname_[];
+% This function accesses the internal name.
+def internalname_(expr n)=iname_[n] enddef;
+
+def objClassName_(expr n)= Classes_[ClassName_[n]] enddef;
+
+% Objects can have shortcut names; these are names defined
+% by the user and which will lead to the object numbers.
+% We use two arrays. The first has the shortcuts,
+% the second has the object numbers.
+
+string oname_[];
+numeric ovalue_[];
+numeric nshortcuts_;
+nshortcuts_=0;
+
+vardef addShortCut_(expr oname,ovalue)=
+ save found;boolean found;found=false;
+ for i:=1 upto nshortcuts_:
+ if oname_[i]=oname:
+ ovalue_[i]:=ovalue;
+ found:=true;
+ fi;
+ exitif found;
+ endfor;
+ if not found:
+ nshortcuts_:=nshortcuts_+1;
+ oname_[nshortcuts_]=oname;
+ ovalue_[nshortcuts_]:=ovalue;
+ fi;
+enddef;
+
+% This function returns the number of an object, given its shortcut.
+vardef objValue_(expr oname)=
+ save val;numeric val;
+ hide(
+ for i:=1 upto nshortcuts_:
+ if oname_[i]=oname:
+ val:=ovalue_[i];
+ fi;
+ exitif known val;
+ endfor;
+ )
+ val
+enddef;
+
+def nameToSuffixString_(expr s)=
+ iname_[objValue_(s)]
+enddef;
+
+def nameToSuffix_(expr s)=
+ obj(nameToSuffixString_(s))
+enddef;
+
+let O_=nameToSuffix_;
+
+vardef addclass_(expr n,clname)=
+ save i,j;
+ if nClasses_>0:
+ % first, see if |clname| is a known class name
+ for i:=0 upto nClasses_-1:j:=i;
+ exitif clname=Classes_[i];
+ endfor;
+ if clname=Classes_[j]:
+ ClassName_[n]=j;
+ else: % it is a new class name
+ %createClassTest(clname); % we call it elsewhere
+ ClassName_[n]=nClasses_;
+ Classes_[nClasses_]=clname;
+ nClasses_:=nClasses_+1;
+ fi;
+ else: % it is the first class name
+ %createClassTest(clname); % we call it elsewhere
+ ClassName_[n]=nClasses_;
+ Classes_[nClasses_]=clname;
+ nClasses_:=nClasses_+1;
+ fi;
+enddef;
+
+def createClassTest(expr clname)=
+ sc_ ("def is" & clname &
+ "(suffix n)= (objClassName_(n)=" &
+ ditto & clname & ditto & ") enddef;")
+enddef;
+
+
+% This is sometimes useful
+vardef whateverstring = save ?; string ?; ? enddef;
+def whateverpair = (whatever,whatever) enddef;
+
+
+% We need an array to store option function names whose parameter
+% is a string. For instance, when the option is "drawfunction(mydraw)",
+% the string |"drawfunction"| is in the array and makes it possible
+% to extract |"mydraw"| without calling the function |drawfunction|.
+% This is not true of all option functions. Those having numeric
+% parameters do not need a special treatment.
+
+string opfunc_[];
+numeric nopfunc_;nopfunc_=0;
+
+% This function adds a string to the array.
+% |addOptionFunction| should be called where the option functions
+% are defined.
+def addOptionFunction(expr s)=
+ nopfunc_:=nopfunc_+1;
+ opfunc_[nopfunc_]=s;
+enddef;
+
+% This function checks if a string is in the array:
+vardef isOpFunc_(expr s)=
+ save b;boolean b;
+ hide(
+ b=false;
+ for i:=1 upto nopfunc_:
+ if opfunc_[i]=s:b:=true;fi;
+ exitif b;
+ endfor;
+ )
+ b
+enddef;
+
+% This function takes a string such as |"drawfunction(mydraw)"|
+% and replaces it with |"drawfunction("mydraw")"|
+% if the function name (the first part, here |"drawfunction"|)
+% is in the |opfunc_| array.
+% The argument of the function can have parentheses, but they must
+% be balanced. For instance, we can have |"color((0,1,1))"|.
+% The argument can also contain spaces.
+
+vardef correctOption_(expr s)=
+ save a,b,c,l;string c;l=0; % parenthesis depth
+ for i:=0 upto length(s)-1:
+ c:=substring(i,i+1) of s;
+ if (c="(") and (l=0): a:=i;
+ elseif (c=")") and (l=1): b:=i;
+ fi;
+ if c="(": l:=l+1;fi;
+ if c=")": l:=l-1;fi;
+ endfor;
+ if isOpFunc_(substring(0,a) of s):
+ (substring(0,a+1) of s &
+ ditto & substring(a+1,b) of s & ditto
+ & substring(b,infinity) of s)
+ else: s
+ fi
+enddef;
+
+% Apply a linear transformation to object |n|.
+% The last parameter is of type |transform|.
+% Fixed objects can be transformed, but they are untied.
+vardef transformObj(suffix n)(expr $)=
+ save p_,q_,i; pair p_[],q_[];
+ memorizePoints_(n,$);
+ % update the current transformation:
+ n.ctransform_:=n.ctransform_ transformed $;
+ % update the transformations for the non-standard labels
+ % (such labels can be added to an object, even after several
+ % transformations have been applied to it)
+ if known n.ipic_.transf_.n_:
+ for i:=1 upto n.ipic_.transf_.n_:
+ n.ipic_.transf_[i]:=n.ipic_.transf_[i] transformed $;
+ endfor;
+ fi;
+ % |message "transforming a box of type " & objClassName_(n);|
+ begingroup
+ save tie_function_; % used in the |subobjties_| strings
+ for i:=1 upto n.nsubobjties_:
+ % we define the function |tie_function_|:
+ sc_ n.subobjties_[i];
+ % and we call it:
+ sc_ "tie_function_".n($);
+ endfor;
+ endgroup;
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef transform_Obj(expr n)(expr $)=
+ hide(transformObj(obj(iname_[n]))($)) n
+enddef;
+
+% rotate object |n| by angle |$| around the origin
+def rotateObj(suffix n)(expr $)=
+ transformObj(n)(identity rotated $);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef rotate_Obj(expr n)(expr $)=
+ hide(rotateObj(obj(iname_[n]))($)) n
+enddef;
+
+% scale object |n| by |$|
+def scaleObj(suffix n)(expr $)=
+ transformObj(n)(identity scaled $);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef scale_Obj(expr n)(expr $)=
+ hide(scaleObj(obj(iname_[n]))($)) n
+enddef;
+
+% xscale object |n| by |$|
+def xscaleObj(suffix n)(expr $)=
+ transformObj(n)(identity xscaled $);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef xscale_Obj(expr n)(expr $)=
+ hide(xscaleObj(obj(iname_[n]))($)) n
+enddef;
+
+% yscale object |n| by |$|
+def yscaleObj(suffix n)(expr $)=
+ transformObj(n)(identity yscaled $);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef yscale_Obj(expr n)(expr $)=
+ hide(yscaleObj(obj(iname_[n]))($)) n
+enddef;
+
+% reflect object |n| around the line defined by the two points |$| and |$$|
+def reflectObj(suffix n)(expr $,$$)=
+ transformObj(n)(identity reflectedabout($,$$));
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef reflect_Obj(expr n)(expr $,$$)=
+ hide(reflectObj(obj(iname_[n]))($,$$)) n
+enddef;
+
+% slant object |n|
+def slantObj(suffix n)(expr $)=
+ transformObj(n)(identity slanted $);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef slant_Obj(expr n)(expr $)=
+ hide(slantObj(obj(iname_[n]))($)) n
+enddef;
+
+def declarestring_(expr s)(text l)=
+ for $:=l:
+ sc_("string " & s & "." & $);
+ endfor;
+enddef;
+
+% |s| is an object; this function returns true if |s| has not been used
+% as a prefix before.
+def isNewPrefix(suffix s)=
+ (not string s.pointlist_)
+enddef;
+
+% returns |true| if |v| is of type |t|, where both |t| and |v|
+% are strings
+def isOfType(expr t,v)=
+ (sc_(t & " " & v))
+enddef;
+
+% returns a string representing the type of |v|
+def TypeOf(expr v)=
+ if numeric v:"numeric"
+ elseif boolean v:"boolean"
+ elseif pair v:"pair"
+ elseif string v:"string"
+ elseif color v:"color"
+ elseif transform v:"transform"
+ fi
+enddef;
+
+% |n| is the object and |s| its class
+def assignObj(suffix n)(expr s)=
+ n=incr(nObj_); % new object number
+ iname_[n]=str n; % the number and the associated string are recorded
+ % so that we can go from the number to the name
+ % (and hence to the object)
+ addclass_(n,s); % |n|'s class is memorized too
+ % memorize a shortcut, if there is one:
+ if known o_name_val:
+ addShortCut_(o_name_val,n);
+ o_name_val:=whateverstring;
+ else:
+ % we memorize the standard shortcut, which is |str n|, but only
+ % if the object was given a name explicitely:
+ if not streamlined_ and memorizeShortcuts:
+ addShortCut_(str n,n);
+ fi;
+ fi;
+ % reset |streamlined_|
+ streamlined_:=false;
+ save gen_n_;string gen_n_;gen_n_=generisize_(str n);
+ if not string n.pointlist_:
+ declarestring_(gen_n_)(
+ "pointlist_", % list of points
+ "pairlist_", % list of pairs (non movable points)
+ "pointarraylist_", % list of arrays
+ "subarraylist_", % list of arrays of subobjects
+ "stringarraylist_",% list of arrays of strings
+ "colorarraylist_", % list of arrays of colors
+ "picturearraylist_",% list of arrays of pictures
+ "transformarraylist_",% list of arrays of transforms
+ "booleanarraylist_",% list of arrays of booleans
+ "numericarraylist_", % list of arrays of numerics
+ "pairarraylist_", % list of arrays of pairs
+ "points_in_arrayslist_", % list of all points of all arrays
+ "picturelist_", % list of pictures
+ "numericlist_", % list of numerics (useful for duplication)
+ "booleanlist_", % list of booleans (ditto)
+ "colorlist_", % list of colors (ditto)
+ "stringlist_", % list of strings (ditto)
+ "transformlist_", % list of transforms (ditto)
+ "sublist_", % list of subobjects
+ "subobjties_[]", % subobj tying equations (1 string/subobject)
+ "code_", % the code of an object
+ "extra_code_"); % the extra code of an object
+ expandafter numeric sc_(gen_n_).nsubobjties_;
+ % number of subobjties
+ expandafter transform sc_(gen_n_).ctransform_;
+ % current transform of that object
+ fi;
+ % initialize the lists:
+ forsuffixes $=pointlist_,pairlist_,pointarraylist_,subarraylist_,
+ stringarraylist_,colorarraylist_,picturearraylist_,transformarraylist_,
+ booleanarraylist_,numericarraylist_,pairarraylist_,points_in_arrayslist_,
+ picturelist_,numericlist_,booleanlist_,colorlist_,stringlist_,
+ transformlist_,sublist_,code_,extra_code_:
+ n$:="";
+ endfor;
+ n.nsubobjties_=0;
+ n.ctransform_:=identity;
+ setcurrentobjname_(str n);
+enddef;
+
+numeric nObj_; % number of instanciated objects ($\geq$|nClasses_|)
+ % and also last instanciated object
+nObj_=0;
+
+% There is no box with the number 0 and we reserve this number
+% for the ``null box'' which is useful in certain places, such as matrices:
+newinternal nb;
+nb:=0;
+
+% In order to refresh a |numeric| n: |n:=whatever;|
+% (suggested by Bogus\l aw Jackowski on Jan 15, 2001 on the metafont list
+% in answer to a question I had asked)
+
+def refresh_(text v)=
+ if numeric v: v:=whatever;
+ elseif pair v: v:=whateverpair;
+ else: message "refresh_ is not defined for this type";
+ fi;
+enddef;
+
+def refreshObjVars_(suffix n)(text v)=
+ forsuffixes $=v:refresh_(n$);endfor;
+enddef;
+
+% This function makes it possible to declare pictures in an object.
+% There can be several |ObjPicture| declarations in an object.
+% (this is similar to |ObjPoint|)
+vardef ObjPicture text l=
+ forsuffixes $=l:
+ if not isOfType("picture",currentObjname & "." & str $):
+ sc_ ("picture " & generisize_(currentObjname) & "." & str $);
+ fi;
+ endfor;
+ forsuffixes $=l:
+ if sco_(".picturelist_")="":
+ sco_(".picturelist_"):=str $;
+ else:
+ sco_(".picturelist_"):=sco_(".picturelist_") & "," & str $;
+ fi;
+ endfor;
+enddef;
+
+% Give a value to a picture variable and center the picture
+% around the origin. All pictures will be centered around the origin
+% and everytime we draw one (see |drawPicture|), we transform it.
+% Pictures cannot be floating.
+def setPicture(text v)(expr val)=
+ sco_("." & str v)=val;
+ sco_("." & str v):=
+ sco_("." & str v) shifted -.5[urcorner(val),llcorner(val)];
+enddef;
+
+vardef drawPicture@#(suffix p) text options=
+ draw @#p transformed @#ctransform_ shifted @#p.off options
+ withcolor OptionValue.@#("picturecolor");
+enddef;
+
+% |ObjNumeric|, |ObjPair|, |ObjColor|, |ObjString| and |ObjTransform|
+% are all created on the same model, using |defineObjType_|.
+
+vardef defineObjType_(expr type,name)=
+ sc_(
+ "vardef Obj" & name & " text l=" &
+ "forsuffixes $=l:" &
+ "if not isOfType(" & quote(type) &
+ ",currentObjname & " & quote(".") & "& str $):" &
+ "sc_ (" & quote(type&" ") & " & generisize_(currentObjname) & " &
+ quote(".") & " & str $);" &
+ "fi;" &
+ "endfor;" &
+ "forsuffixes $=l:" &
+ "if sco_(" & quote("." & type &"list_") & ")=" & quote("") & ":" &
+ "sco_(" & quote("." & type &"list_") & "):=str $;" &
+ "else:" &
+ "sco_(" & quote("." & type &"list_") & "):=sco_(" &
+ quote("." & type &"list_") & ") & " & quote(",") & " & str $;" &
+ "fi;" &
+ "endfor;" &
+ "enddef;"
+ );
+ sc_(
+ "def set" & name & "(text v)(expr val)=sco_(" &
+ quote(".") & " & str v):=val;enddef;"
+ );
+enddef;
+
+% |defineObjType_("numeric","Numeric");|
+
+% This function makes it possible to declare numerical values
+% as part of an object.
+% There can be several |ObjNumeric| declarations in an object.
+% (this is similar to |ObjPoint|)
+% It defines both |ObjNumeric| and |setNumeric|.
+defineObjType_("numeric","Numeric");
+
+% This function makes it possible to declare pairs in an object.
+% There can be several |ObjPair| declarations in an object
+% Contrary to the points of |ObjPoint|, these are points
+% that will not move with the object.
+% They can be used for special purposes, for instance to store path data.
+defineObjType_("pair","Pair");
+
+defineObjType_("color","Color");
+defineObjType_("boolean","Boolean");
+defineObjType_("string","String");
+defineObjType_("transform","Transform");
+
+def BpathObj(suffix n)=
+ sc_ ("Bpath" & objClassName_(n))(n)
+enddef;
+
+def StandardBpath(suffix n)= (n.inw--n.isw--n.ise--n.ine--cycle) enddef;
+
+def BboxObj(suffix n)=(bbox(BpathObj(n))) enddef;
+
+% Computes the real bounding box, without looking at the Bpath.
+% The object must be attached.
+% |bboxmargin| is used by |bbox|.
+def rBboxObj(suffix n)=
+ bbox(image(drawObj(n)))
+enddef;
+
+% This is like |decimal| but adds a "+" if the number is positive
+def signeddecimal expr d=
+ (if d>=0: "+" & decimal d else: decimal d fi)
+enddef;
+
+% min/max xpart/ypart of a list of points
+def minmaxval(text f)(text xy)(expr pa,pb,pc,pd,pe,pf,pg,ph)=
+ f(xy(pa),xy(pb),xy(pc),xy(pd),xy(pe),xy(pf),xy(pg),xy(ph))
+enddef;
+
+% Minimum xval of points |pa|, |pb|, ...
+def xminval(expr pa,pb,pc,pd,pe,pf,pg,ph)=
+ minmaxval(min)(xpart)(pa,pb,pc,pd,pe,pf,pg,ph) enddef;
+% Maximum xval of points |pa|, |pb|, ...
+def xmaxval(expr pa,pb,pc,pd,pe,pf,pg,ph)=
+ minmaxval(max)(xpart)(pa,pb,pc,pd,pe,pf,pg,ph) enddef;
+% Minimum yval of points |pa|, |pb|, ...
+def yminval(expr pa,pb,pc,pd,pe,pf,pg,ph)=
+ minmaxval(min)(ypart)(pa,pb,pc,pd,pe,pf,pg,ph) enddef;
+% Maximum yval of points |pa|, |pb|, ...
+def ymaxval(expr pa,pb,pc,pd,pe,pf,pg,ph)=
+ minmaxval(max)(ypart)(pa,pb,pc,pd,pe,pf,pg,ph) enddef;
+
+% Combines two real bounding boxes: both |bba| and |bbb|
+% are paths. Only points 0 through 3 of each path are examined.
+% This function is currently not used.
+vardef combineTwoBBs(expr bba,bbb)=
+ save xm,ym,xM,yM;
+ hide(
+ xm=xminval(point 0 of bba,point 1 of bba,point 2 of bba,point 3 of bba,
+ point 0 of bbb,point 1 of bbb,point 2 of bbb,point 3 of bbb);
+ ym=yminval(point 0 of bba,point 1 of bba,point 2 of bba,point 3 of bba,
+ point 0 of bbb,point 1 of bbb,point 2 of bbb,point 3 of bbb);
+ xM=xmaxval(point 0 of bba,point 1 of bba,point 2 of bba,point 3 of bba,
+ point 0 of bbb,point 1 of bbb,point 2 of bbb,point 3 of bbb);
+ yM=ymaxval(point 0 of bba,point 1 of bba,point 2 of bba,point 3 of bba,
+ point 0 of bbb,point 1 of bbb,point 2 of bbb,point 3 of bbb);
+ )
+ ((xm,ym)--(xM,ym)--(xM,yM)--(xm,yM)--cycle)
+enddef;
+
+% |drawObj| takes a list of suffixes as parameters
+def drawObj(text l)=
+ forsuffixes $:=l:
+ if show_object_names:
+ % the name of the object is displayed at the upper right corner
+ label(str $,$ne);
+ fi;
+ if show_corners:
+ label("ne",$ne);label("se",$se);label("nw",$nw);label("sw",$sw);
+ fi;
+ % we must check if there is a specialized version of |drawObj|
+ % for the current object, and call it if necessary.
+ % We do it in such a way that it doesn't force a default
+ % declaration on the object.
+ if known sc_(str $).option_drawObj_:
+ sc_ (OptionValue$("drawObj"))($);
+ else:
+ sc_ ("draw" & objClassName_($))($);
+ fi;
+ drawLabels$;
+ endfor;
+enddef;
+
+% streamlined version: |n| is a number representing an object;
+% contrary to other streamlined functions, this one does not return
+% an object identification.
+% |n| can also be a string shortcut for an object.
+vardef draw_Obj(expr n)=
+ if string n:
+ drawObj(O_(n));
+ else:
+ drawObj(obj(iname_[n]));
+ fi;
+enddef;
+
+% This function can only be used when the bounding path is continuous;
+% if it is not the case, the |draw...| function for the object must be adapted.
+def drawFramedOrFilledObject_(suffix n)=
+ if OptionValue.n("framed"):
+ % the shadow is the shadow of the frame, and we only show a shadow
+ % if there is a frame
+ if OptionValue.n("shadow"):
+ fill (BpathObj(n) shifted (1mm,-1mm))
+ withcolor OptionValue.n("shadowcolor");
+ fi;
+ % this removes most of the shadow
+ unfill BpathObj(n);
+ fi;
+ if OptionValue.n("filled"):
+ fill BpathObj(n) withcolor OptionValue.n("fillcolor");
+ fi;
+ if OptionValue.n("framed"):
+ pickup pencircle scaled OptionValue.n("framewidth");
+ draw BpathObj(n) withcolor OptionValue.n("framecolor")
+ sc_(OptionValue.n("framestyle"));
+ pickup defaultpen;
+ fi;
+enddef;
+
+% This returns a picture corresponding to the drawing of object |n|
+def pictureObj(suffix n)=
+ image(drawObj(n))
+enddef;
+
+vardef memorizePoints_(suffix n)(expr $$)=
+ save i,tmp,varlist_;string tmp,varlist_;
+ % The array |p_[]| is not declared here, because it is also used elsewhere
+ % (when the |.subobjties_| string is evaluated in |transformObj|)
+ % We memorize all the points declared with |ObjPoint| and those
+ % that are part of arrays. At this point, we have two strings and
+ % we merely concatenate them:
+ if n.pointlist_="":varlist_=n.points_in_arrayslist_;
+ else:
+ if n.points_in_arrayslist_<>"":
+ varlist_=n.pointlist_ & "," & n.points_in_arrayslist_;
+ else: varlist_=n.pointlist_;
+ fi;
+ fi;
+ i=0;
+ if varlist_<>"":
+ forsuffixes $=sc_(varlist_):
+ i:=i+1;p_[i]=n$;
+ endfor;
+ fi;
+ refreshObjVars_(n)(sc_(varlist_));
+ i:=0;
+ if varlist_<>"":
+ forsuffixes $=sc_(varlist_):i:=i+1;
+ if i>1: % equation |$-tmp=(p_[i]-p_1) transformed $$|
+ sc_ (str n & "." & str $ & "-" & tmp)=
+ (p_[i]-p_1) transformed $$;
+ else: tmp=str n & "." & str $;
+ fi;
+ endfor;
+ fi;
+enddef;
+
+% This function makes it possible to declare points in an object.
+% There can be several |ObjPoint| declarations in an object
+% These are points that will move with the object.
+% Pairs that do not move can be declared with |ObjPair|.
+vardef ObjPoint text l=
+ forsuffixes $=l:
+ if not isOfType("pair",currentObjname & "." & str $):
+ sc_ ("pair " & generisize_(currentObjname) & "." & str $);
+ fi;
+ endfor;
+ forsuffixes $=l:
+ if sco_(".pointlist_")="":
+ sco_(".pointlist_"):=str $;
+ else:
+ sco_(".pointlist_"):=sco_(".pointlist_") & "," & str $;
+ fi;
+ endfor;
+enddef;
+
+% We take as a convention that all objects have a minimal interface
+% similar to the one given by |boxes.mp|. This does considerably
+% facilitate reusability. In is not mandatory though.
+% If you want the standard points, add |StandardPoints| as part of your object
+% points (before the |ObjCode| section). You still have to use them in the
+% equations, but it is also a good idea to include a few standard
+% equations with |StandardEquations| (this is a string).
+% Better though, is to write |StandardInterface| at the
+% beginning of your object and use only inner points in the equations
+% and drawing functions.
+%
+% The standard interface has the points ne,nw,se,sw,n,s,e,w,c;
+
+def StandardPoints=
+ ne,nw,sw,se,n,s,e,w,c
+enddef;
+
+% Drawings should not refer to the ``Standard Points,'' because it makes
+% the drawings sensitive to bounding box changes.
+% Instead, they should refer
+% to their Inner variants, which are initially equal to them,
+% as per the StandardInnerEquations
+def StandardInnerPoints=
+ ine,inw,isw,ise,in,is,ie,iw,ic
+enddef;
+
+vardef isStandardPoint@#=
+ (
+ (str @#="ne") or (str @#="nw") or (str @#="sw") or (str @#="se") or
+ (str @#="n") or (str @#="s") or (str @#="e") or (str @#="w") or
+ (str @#="c")
+ )
+enddef;
+
+vardef StandardEquationsRaw@#=
+ @#se-@#sw=@#ne-@#nw; % parallelogram equation
+ @#n=.5[@#ne,@#nw]; % North
+ @#s=.5[@#se,@#sw]; % South
+ @#e=.5[@#ne,@#se]; % East
+ @#w=.5[@#nw,@#sw]; % West
+ @#c=.5[@#n,@#s]; % Center
+enddef;
+
+% These are the equations connecting the outer bounding box
+% (i.e. the interface) to the inner bounding box (the interface
+% as seen from the inside)
+def StandardInnerEquations=
+ ("@#ine=@#ne;@#inw=@#nw;@#isw=@#sw;@#ise=@#se;@#in=@#n;@#is=@#s;" &
+ "@#ie=@#e;@#iw=@#w;@#ic=@#c;")
+enddef;
+
+
+% It is important that this be a string, because there is a
+% |sc_(PureStandardEquations)| somewhere.
+def PureStandardEquations=
+ ("@#se-@#sw=@#ne-@#nw;" & % parallelogram equation
+ "xpart(@#se-@#ne)=0;" &
+ "ypart(@#se-@#sw)=0;" &
+ "@#n=.5[@#ne,@#nw];" & % North
+ "@#s=.5[@#se,@#sw];" & % South
+ "@#e=.5[@#ne,@#se];" & % East
+ "@#w=.5[@#nw,@#sw];" & % West
+ "@#c=.5[@#n,@#s];" ) % Center
+enddef;
+
+def StandardEquations=
+ (PureStandardEquations & StandardInnerEquations)
+enddef;
+
+% This is the minimum set of equations for standard points,
+% assuming only the middle relations. It is convenient if
+% you want to control completely where the corners of the
+% object are. This is for instance used in the |RandomBox| class.
+def MinimumStandardEquations=
+ ("@#n=.5[@#ne,@#nw];" & % North
+ "@#s=.5[@#se,@#sw];" & % South
+ "@#e=.5[@#ne,@#se];" & % East
+ "@#w=.5[@#nw,@#sw];" & % West
+ "@#c=.5[@#n,@#s];" % Center
+ & StandardInnerEquations)
+enddef;
+
+def StandardNumerics=
+ dx,dy
+enddef;
+
+def StandardInterface=
+ ObjPoint StandardPoints,StandardInnerPoints;
+ ObjNumeric StandardNumerics;
+enddef;
+
+% Normally, the user can specify that a certain point in
+% a certain subobject is tied (that is, is bound to it
+% linearly, modulo the linear transformations) to
+% a certain point in the main object.
+% This is done with |tiePointToSubpoint(sw,sub,A)|
+% for instance. If we assume that the first point of the
+% main object (first in the point declarations)
+% is always defined, and that this is the same for
+% the subobjects, we can automatically tie all those
+% pairs of points. The user will actually seldom
+% need more. And what would that be anyway?
+% If there are no subobjects, this function does nothing.
+vardef StandardTies=
+ save mainfirst,subfirst,co;
+ string mainfirst,subfirst,co;
+ co=currentObjname;
+ mainfirst=firstPointOf_(co);
+ % we loop over all subobjects
+ % first, regular subobjects:
+ if sc_(co).sublist_<>"":
+ forsuffixes $:=sc_(sc_(co).sublist_):
+ subfirst:=firstPointOf_(sc_(co)$);
+ sc_("tiePointToSubpoint(" & mainfirst & "," &
+ str $ & "," & subfirst & ")"); % ties |$subfirst| to |mainfirst|
+ endfor;
+ fi;
+ % then arrays of subobjects:
+ if sc_(co).subarraylist_<>"":
+ forsuffixes $:=sc_(sc_(co).subarraylist_):
+ for i:=1 upto sc_(co)$n_:
+ % we check that the subobject is defined (in certain case,
+ % such as matrices, there can be holes)
+ if known sc_(co)$[i]:
+ subfirst:=firstPointOf_(sc_(co)$[i]);
+ sc_("tiePointToSubpoint(" & mainfirst & "," &
+ str $ & decimal i & "," & subfirst & ")");
+ % ties |$subfirst| to |mainfirst|
+ fi;
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+% In order to extract the first point of an object,
+% we go through its |pointlist_| string, and exit
+% as soon as we have a suffix. In case this string is empty
+% (that's very unlikely), we go through |points_in_arrayslist_|.
+% If both are empty, there is no first point and we return an empty string.
+% |n| is a suffix in string form.
+vardef firstPointOf_(expr n)=
+ save first_;string first_;
+ hide(
+ forsuffixes $:=sc_(sc_(n).pointlist_):
+ first_:=str $;
+ exitif first_<>"";
+ endfor;
+ if first_="":
+ forsuffixes $:=sc_(sc_(n).points_in_arrayslist_):
+ first_:=str $;
+ exitif first_<>"";
+ endfor;
+ fi;)
+ first_
+enddef;
+
+% This function finds the internal index of a point, where
+% the |ObjPoint|s come first, then the points defined in an |ObjPointArray|.
+% For instance, if |ObjPoint a,b,c| and |ObjPointArray(po)(7)|,
+% the index of |a| is 1, the index of |b| is 2, the index of |c| is 3,
+% the index of |po1| is 4, the index of |po2| is 5, etc.
+% |n| is the object.
+vardef indexOfPoint(suffix n)(text v)=
+ save i_,j_,found_; % |v| can't be |i_| or |j_|
+ hide(
+ boolean found_;found_=false;
+ j_:=0;
+ if n.pointlist_<>"":
+ forsuffixes i_:=sc_(n.pointlist_):
+ j_:=j_+1;
+ if str i_=str v:found_:=true;fi;
+ exitif found_;
+ endfor;
+ fi;
+ if not found_:
+ if n.points_in_arrayslist_<>"":
+ for i_:=sc_(n.points_in_arrayslist_):
+ j_:=j_+1;
+ if str i_=str v:found_:=true;fi;
+ exitif found_;
+ endfor;
+ fi;
+ fi;
+ if not found_:j_:=0;fi;
+ ) j_
+enddef;
+
+% This function needs to be called when points are added to an array
+vardef addPointToPointArray@#(suffix a)=
+ save co;string co;co=str @#;
+ @#a.n_:=@#a.n_+1;
+ if sco_(".points_in_arrayslist_")="":
+ sco_(".points_in_arrayslist_"):=str a & decimal @#a.n_;
+ else:
+ sco_(".points_in_arrayslist_"):=
+ sco_(".points_in_arrayslist_") & "," & str a & decimal @#a.n_;
+ fi;
+enddef;
+
+% These are points that will move with the object.
+% Pairs that do not move can be declared with |ObjPairArray|.
+vardef ObjPointArray(suffix a)(expr n)=
+ save co;string co;co=currentObjname;
+ if not isOfType("pair",co & "." & str a & "1"):
+ sc_ ("pair " & generisize_(co) & "." & str a & "[]");
+ fi;
+ sco_("." & str a & ".n_"):=n;
+ if sco_(".pointarraylist_")="":
+ sco_(".pointarraylist_"):= str a;
+ else:
+ sco_(".pointarraylist_"):=sco_(".pointarraylist_") &","& str a;
+ fi;
+ for i:=1 upto n:
+ if sco_(".points_in_arrayslist_")="":
+ sco_(".points_in_arrayslist_"):=str a & decimal i;
+ else:
+ sco_(".points_in_arrayslist_"):=
+ sco_(".points_in_arrayslist_") & "," & str a & decimal i;
+ fi;
+ endfor;
+enddef;
+
+
+% For pairs:
+% |name| can be |"Pair"|
+% |type| |"pair"|
+% |var| |"pairarraylist_"|
+% This creates a function |ObjPairArray| storing the pairs
+% in the |"pairarraylist_"| variable of the current object.
+% The first parameter of |ObjPairArray| is the name of the array
+% and the second parameter is its size. The function created memorizes
+% the size of the array.
+% The size can be modified afterwards, but only as many elements
+% as were announced will be manipulated in automatic operations
+% such as |duplicateObj|.
+vardef defineArrayFunction(expr name)(expr type)(expr var)=
+ save tmp;string tmp;
+ tmp="vardef Obj" & name & "Array(suffix a)(expr n)=" &
+ "save co;string co;co=currentObjname;" &
+ "if not isOfType(" & quote(type) &",co & " & quote(".") &
+ " & str a & " & quote("1") & "):" &
+ "sc_ (" & quote(type & " ") & " & generisize_(co) & " &
+ quote(".") & " & str a & " & quote("[]") & ");" &
+ "fi;" &
+ "sco_(" & quote(".") & " & str a & " &
+ quote(".n_") & "):=n;" &
+ "if sco_(" & quote("." & var) & ")=" & quote("") & ":" &
+ "sco_(" & quote("." & var) & "):= str a;" &
+ "else:" &
+ "sco_(" & quote("." & var) & "):=" &
+ "sco_(" & quote("." & var) & ") & " &
+ quote(",") & " & str a;" &
+ "fi;" &
+ "enddef;";
+ sc_ tmp;
+enddef;
+
+defineArrayFunction("Numeric")("numeric")("numericarraylist_");
+defineArrayFunction("String")("string")("stringarraylist_");
+defineArrayFunction("Sub")("string")("subarraylist_");
+defineArrayFunction("Pair")("pair")("pairarraylist_");
+defineArrayFunction("Color")("color")("colorarraylist_");
+defineArrayFunction("Picture")("picture")("picturearraylist_");
+defineArrayFunction("Transform")("transform")("transformarraylist_");
+defineArrayFunction("Boolean")("boolean")("booleanarraylist_");
+
+% |t| is a list of strings, representing the object code,
+% including equations (see examples)
+vardef ObjCode text l=
+ save s_,mac_,i_; % notice that we don't have to say that |s_| is a string!
+ string mac_;mac_="";
+ % The problem with object code and the equations it contains
+ % is that they contain the name of the object,
+ % but as given in the new... macro.
+ % We only have the formal parameter name!
+ % We must assume that it is `|@#|'. Maybe in the future, we will
+ % guess it from the equations. Hope is not lost!
+ % We now define locally (just in this |ObjCode| macro)
+ % a macro having `|@#|' as a suffix parameter:
+ % The macro looks like:
+ % |vardef code_function_@#= <the equations> enddef;|
+
+ for s_:=l:mac_:=mac_&s_ & ";"; endfor;
+ % we store the equations in the object; this is useful when an
+ % object gets duplicated:
+ sco_(".code_"):=mac_;
+ begingroup; % we want the |vardef| macro only defined locally;
+ % we don't need it later
+ save code_function_;
+ mac_:="vardef code_function_@#=" & mac_ & " enddef;";
+ sc_ mac_; % this defines the macro
+ % we call it with
+ sc_ ("code_function_." & currentObjname);
+ endgroup;
+enddef;
+
+% This function adds equations to an already existing object.
+% These equations should only define new points, not alter
+% previously defined points.
+vardef addObjCode@# text l=
+ save mac;string mac;mac="";
+ for s:=l:mac:=mac&s & ";"; endfor;
+ @#code_:=@#code_ & mac;
+enddef;
+
+vardef addObjExtraCode@# text l=
+ save mac;string mac;mac="";
+ for s:=l:mac:=mac&s & ";"; endfor;
+ @#extra_code_:=@#extra_code_ & mac;
+enddef;
+
+% |sub| is a field name and |t| is the subobject name
+% we could even use the same name for boths
+def SubObject(suffix sub)(suffix t)=
+ if expandafter not expandafter string sco_("." & str sub):
+ sc_ ("string " & generisize_(currentObjname) & "." & str sub);
+ fi;
+ sco_("." & str sub)=str t;
+ if sco_(".sublist_")="":
+ sco_(".sublist_"):=str sub;
+ else:
+ sco_(".sublist_"):=sco_(".sublist_") & "," & str sub;
+ fi;
+enddef;
+
+def SubObjectOfArray(suffix sub)(suffix t)=
+ sco_("." & str sub)=str t;
+enddef;
+
+% Point |b| of subobject |sub| (of the current object)
+% is tied to point |a| of the current object.
+% This means that we memorize an equation.
+vardef tiePointToSubpoint(suffix a,sub,b)=
+ save co,n,j;string co;co=currentObjname;
+ obj(co).nsubobjties_:=obj(co).nsubobjties_+1;
+ n=obj(co).nsubobjties_;
+ % We must memorize the following code:
+ % |q_[n]=obj(co.sub).b;|
+ % |transformObj(obj(currentObjname.sub))($);|
+ % |co.a-obj(co.sub).b=(p_[j]-q_[n]) transformed $;|
+ % (where |p_[j]| is the memorized value of the current objects' "a" point)
+ % We have to find `|j|':
+ j=indexOfPoint(obj(co))(a);
+ % we store everything in a |vardef|, using |@#| instead of co
+ % (this is necessary for matters of duplication)
+ obj(co).subobjties_[n]:=
+ "vardef tie_function_@#(expr $)=" &
+ "q_" & decimal n & "=obj(@#" & str sub & ")." & str b &";" &
+ "transformObj(obj(@#" & str sub & "))($);" &
+ "@#" & str a & "-obj(@#" & str sub & ")." & str b &
+ "=(p_" & decimal j & "-q_" & decimal n & ") transformed $;" &
+ "enddef;";
+enddef;
+
+% Generation of new names (suffixes):
+% All the names will start with |"_______"|.
+% This initial string can be changed but it must end with |_|.
+% The suffixes are generated in that order:
+% |_______a|, |_______b|, |_______c|, ..., |_______z|,
+% |_______aa|, |_______ab|, |_______ac|, ..., |_______az|,
+% |_______ba|, ..., |_______bz|, |_______ca|, ...,
+% |_______zz|, |_______aaa|, |_______aab|, etc.
+% All we need to is remember the last created suffix.
+% We store it in a string:
+string last_obj_;last_obj_="_______";
+
+vardef newobjstring_=
+ save l,prefix,lastchar,lastpos,lastposchar;
+ hide(
+ numeric lastpos;
+ string prefix,lastchar,lastposchar;
+ l=length(last_obj_);
+ lastchar=substring (l-1,l) of last_obj_;
+ if lastchar="_":
+ last_obj_:=last_obj_ & "a";
+ elseif lastchar="z":
+ % in this case, we find the last character different from "z";
+ % it is either a letter, or `|_|'
+ lastpos=l;
+ for i:=l-1 downto 1:
+ lastpos:=i;
+ lastposchar:=substring (i-1,i) of last_obj_;
+ exitif (lastposchar<>"z");
+ endfor;
+ if lastposchar="_": % in this case, we have only z's
+ last_obj_:=last_obj_ & "a";
+ else:
+ last_obj_:=(substring (0,lastpos-1) of last_obj_) &
+ char(ASCII lastposchar +1)
+ for i:=lastpos+1 upto l: & "a" endfor;
+ fi;
+ else:
+ last_obj_:=
+ (substring (0,l-1) of last_obj_) & char(ASCII lastchar +1);
+ fi;
+ )
+ last_obj_
+enddef;
+
+
+% We can call this function for instance with
+% |duplicateArray_(n,m)("ObjStringArray")(stringarraylist_)|
+vardef duplicateArray_(suffix n,m)(expr f)(suffix var)=
+ if m.var<>"":
+ forsuffixes $:=sc_(m.var):
+ sc_(f & "(" & str $ & ")(" & decimal m$n_ & ");");
+ % we can do the previous |Obj...Array| because |assignObj|
+ % defined the current object
+ % we also fill the array:
+ for i:=1 upto m$n_:
+ n$[i]:=m$[i];
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+% This creates a copy of object |m| in object |n|
+% If |n| contained something, it gets either overriden (if the fields
+% were common with those of |m|, or meaningless (if the fields
+% were not common with those of |m|)
+% The various strings are copied, and the object code is executed
+% (this recreates the equations, as when the object is created by
+% a constructor). The difference with the constructor is that
+% no parameter is given and that we make a deep copy.
+% We also copy the subobjects.
+% Problem: we need new names for the subobjects.
+% We solve that problem by using the ``name generator'' |newobjstring_|
+%
+vardef duplicateObj(suffix n,m)=
+ assignObj(n)(objClassName_(m)); % new number, but same type
+ % |n.pointlist_:=m.pointlist_;| % (see below)
+ % |n.pointarraylist_:=m.pointarraylist_;| % (see below)
+ % |n.points_in_arrayslist_:=m.points_in_arrayslist_;| % (see below)
+ n.code_:=m.code_;
+ n.extra_code_:=m.extra_code_;
+ % |n.picturelist_:=m.picturelist_;| % (see below)
+ n.nsubobjties_:=m.nsubobjties_;
+ for i:=1 upto n.nsubobjties_:
+ n.subobjties_[i]:=m.subobjties_[i];
+ endfor;
+
+ n.sublist_:=m.sublist_; % list of subobjects (this doesn't change,
+ % but the values of the subobjects will be new)
+ % create the types:
+ if m.pointlist_<>"":
+ % this also fills |n.pointlist_|
+ sc_ ("ObjPoint " & m.pointlist_);
+ fi;
+ if m.picturelist_<>"":
+ % this also fills |n.picturelist_| and creates all appropriate variables
+ sc_ ("ObjPicture " & m.picturelist_);
+ fi;
+
+ % Duplication of numerical values:
+ if m.numericlist_<>"":
+ sc_ ("ObjNumeric " & m.numericlist_); % this also fills |n.numericlist_|
+ fi;
+
+ % Duplication of boolean values:
+ if m.booleanlist_<>"":
+ sc_ ("ObjBoolean " & m.booleanlist_); % this also fills |n.booleanlist_|
+ fi;
+
+ % Duplication of color values:
+ if m.colorlist_<>"":
+ sc_ ("ObjColor " & m.colorlist_); % this also fills |n.colorlist_|
+ fi;
+
+ % Duplication of string values:
+ if m.stringlist_<>"":
+ sc_ ("ObjString " & m.stringlist_); % this also fills |n.stringlist_|
+ fi;
+
+ % Duplication of transform values:
+ if m.transformlist_<>"":
+ sc_ ("ObjTransform " & m.transformlist_); % fills also |n.transformlist_|
+ fi;
+
+ % Duplication of pairs:
+ if m.pairlist_<>"":
+ sc_ ("ObjPair " & m.pairlist_); % this also fills |n.pairlist_|
+ fi;
+
+ % copy the current transformation of the object:
+ n.ctransform_:=m.ctransform_;
+
+ save gen_n_;string gen_n_;gen_n_=generisize_(str n);
+ % we copy the options and their values:
+ if known m.options_:
+ %if (gen_n_=str n): % UNSURE IF THIS SHOULD ALWAYS BE COMMENTED (October 23, 2005)
+ if unknown n.options_:
+ expandafter string sc_(gen_n_).options_;
+ fi;
+ %fi
+ n.options_=m.options_;
+ forsuffixes $:=sc_(n.options_):
+ % each |$| suffix starts with a |_|
+ %if gen_n_=str n: % UNSURE IF THIS SHOULD ALWAYS BE COMMENTED (October 23, 2005)
+ if expandafter unknown sc_(str n & ".option" & str $ & "_"):
+ sc_(TypeOf(sc_(str m & ".option" & str $ & "_")) & " " &
+ gen_n_ & ".option" & str $ & "_");
+ fi;
+ %fi;
+ n.sc_("option" & str $ & "_")=m.sc_("option" & str $ & "_");
+ endfor;
+ fi;
+
+ % we copy the numerical, pair and picture values if there are any
+ forsuffixes $$=numericlist_,booleanlist_,colorlist_,stringlist_,
+ transformlist_,pairlist_,picturelist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):n$:=m$;endfor;
+ fi;
+ endfor;
+
+ % the following fills |n.pointarraylist_|
+ % as well as |n.points_in_arrayslist_|
+ if m.pointarraylist_<>"":
+ forsuffixes $:=sc_(m.pointarraylist_):
+ sc_("ObjPointArray(" & str $ & ")(" & decimal m$n_ & ");");
+ % we can do the previous |ObjPointArray| because |assignObj|
+ % defined the current object
+ endfor;
+ fi;
+
+ % We duplicate the numeric arrays:
+ duplicateArray_(n,m)("ObjNumericArray")(numericarraylist_);
+
+ % We duplicate the pair arrays (non movable points);
+ % this includes the structures memorizing paths:
+ duplicateArray_(n,m)("ObjPairArray")(pairarraylist_);
+
+ % We duplicate the string arrays:
+ % it also fills |n.stringarraylist_|
+ duplicateArray_(n,m)("ObjStringArray")(stringarraylist_);
+
+ % We duplicate the color, picture, transform and boolean arrays:
+ duplicateArray_(n,m)("ObjColorArray")(colorarraylist_);
+ duplicateArray_(n,m)("ObjPictureArray")(picturearraylist_);
+ duplicateArray_(n,m)("ObjTransformArray")(transformarraylist_);
+ duplicateArray_(n,m)("ObjBooleanArray")(booleanarraylist_);
+
+ % this is similar, but for Object arrays
+ % it also fills |n.subarraylist_|
+ if m.subarraylist_<>"":
+ forsuffixes $:=sc_(m.subarraylist_):
+ sc_("ObjSubArray(" & str $ & ")(" & decimal m$n_ & ");");
+ % we can do the previous |ObjSubArray| because |assignObj|
+ % defined the current object
+ % Here, we do not copy the strings, because we are doing a deep copy
+ endfor;
+ fi;
+
+ % Copy the information on subobjects (variables) and
+ % call |duplicateObj| appropriately
+
+ % First, the subobjects that are not part of arrays of subobjects:
+ % we go through all suffixes corresponding to subobjects
+ % of object |m|, and for each, we create a new name
+ save newsub_;string newsub_;
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):
+ newsub_:=newobjstring_;
+ % first, create the type:
+ if not string n$:
+ sc_("string " & generisize_(str n & "." & str $));
+ fi;
+ n$:=newsub_;
+ % we must now duplicate |obj(m$)| as |obj(n$)|; this will
+ % also choose a value for |obj(m$)|
+ duplicateObj(obj(n$),obj(m$));
+ endfor;
+ fi;
+ % Second, the subobjects that are part of arrays of subobjects:
+ % we go through all arrays of subobjects
+ % of object |m|, and for each, we create a new name
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ % and now, we go through each element of the array:
+ for i:=1 upto m$n_:
+ % we only duplicate if there is something
+ % (in matrices, for instance, certain objects can be null)
+ if known m$[i]:
+ newsub_:=newobjstring_;
+ n$[i]:=newsub_;
+ duplicateObj(obj(n$[i]),obj(m$[i]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % relink everything: we take the first point of this object,
+ % and recreate all equations; we cannot take the code stored,
+ % because it is the initial code, and the duplication of a
+ % rotated object would then not be a rotated object
+ % (except if we store all transformations, but this would
+ % restrict us anyway to linear transformations)
+ save mainfirst;string mainfirst;
+ mainfirst=firstPointOf_(str n);
+
+ % go through all points except the first, and relink
+ forsuffixes $$=pointlist_,points_in_arrayslist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):
+ if str $<>mainfirst:
+ n.sc_(mainfirst)-n$=m.sc_(mainfirst)-m$;
+ fi;
+ endfor;
+ fi;
+ endfor;
+
+ % go to all regular subobjects, and relink
+
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):
+ n.sc_(mainfirst)-obj(n$).obj(firstPointOf_(n$))=
+ m.sc_(mainfirst)-obj(m$).obj(firstPointOf_(m$));
+ endfor;
+ fi;
+
+ % go through all array subobjects, and relink;
+ % we go through all arrays of subobjects
+ % of object |m|, and for each, we create a new name
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ % and now, we go through each element of the array:
+ for i:=1 upto n$n_:
+ if known n$[i]:
+ n.sc_(mainfirst)-obj(n$[i]).obj(firstPointOf_(n$[i]))=
+ m.sc_(mainfirst)-obj(m$[i]).obj(firstPointOf_(m$[i]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+% Streamlined version of |duplicateObj|: |n| is a number representing an object
+% This function takes a number representing an object,
+% duplicates it and returns a number representing its duplication.
+vardef duplicate_Obj(expr n)=
+ save newname_;string newname_;
+ hide(
+ % we do not set |streamlined_| to true, because it should be
+ % used only before a constructor is called, which is not the case here.
+ % first, choose a new name for the duplication:
+ newname_:=newobjstring_;
+ duplicateObj(obj(newname_),obj(iname_[n]));
+ ) sc_(newname_)
+enddef;
+
+% This function merely unties all points of an object,
+% but keeps the equations. Also, the subobjects remain attached
+% to the main object. What it does is part of what
+% |duplicateObj| does.
+% |untieObj| is applied recursively.
+%
+% This function makes it possible to draw an object somewhere,
+% to untie it and move it elsewhere, to draw it there, etc.
+% We could achieve the same effect with duplication, but it would
+% consume more memory.
+vardef untieObj(suffix n)=
+ save fp,p_,q_,i;
+ string fp;pair p_[],q_[];
+ % we first extract a point
+ fp=firstPointOf_(str n);
+ % we now go through all the points and store the differences
+ % with the point |fp|
+ i:=0;
+ forsuffixes $$=pointlist_,points_in_arrayslist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):i:=i+1;
+ p_[i]=n$-n.sc_(fp);
+ endfor;
+ fi;
+ endfor;
+
+ % we also store the positions of the first points of all subobjects
+ i:=0;
+
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):i:=i+1;
+ q_[i]=obj(n$).obj(firstPointOf_(n$))-n.sc_(fp);
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ i:=i+1;
+ q_[i]=obj(n$[j]).obj(firstPointOf_(n$[j]))-n.sc_(fp);
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % we refresh all points:
+
+ save varlist_;string varlist_;
+ if n.pointlist_="":varlist_=n.points_in_arrayslist_;
+ else:
+ if n.points_in_arrayslist_<>"":
+ varlist_=n.pointlist_ & "," & n.points_in_arrayslist_;
+ else: varlist_=n.pointlist_;
+ fi;
+ fi;
+ refreshObjVars_(n)(sc_(varlist_));
+
+ % we untie the subobjects
+
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):
+ untieObj(obj(n$));
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ untieObj(obj(n$[j]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % and we recreate the differences from the ones stored:
+ % (exactly the same code as above!)
+ i:=0;
+ forsuffixes $$=pointlist_,points_in_arrayslist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):i:=i+1;
+ p_[i]=n$-n.sc_(fp);
+ endfor;
+ fi;
+ endfor;
+
+ % we also attach again the subobjects
+ % (also exactly the same code as above!)
+ i:=0;
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):i:=i+1;
+ q_[i]=obj(n$).obj(firstPointOf_(n$))-n.sc_(fp);
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ i:=i+1;
+ q_[i]=obj(n$[j]).obj(firstPointOf_(n$[j]))-n.sc_(fp);
+ fi;
+ endfor;
+ endfor;
+ fi;
+enddef;
+
+% Draw an array of objects. |n| is the object, |a| is the array,
+% and the number of elements are assumed to be |a.n_|
+% If you don't want to draw all the subobjects, make your own function.
+
+def drawObjArray(suffix n)(suffix a)=
+ for i:=1 upto n.a.n_:
+ if known n.a[i]: % in certain cases (for instances matrices),
+ % we can have holes in the array
+ drawObj(obj(n.a[i]));
+ fi;
+ endfor;
+enddef;
+
+% One idea for implementing |resetObj.expl| is to have the object
+% constructor behave in a certain way when a flag is set. This way
+% would be to refresh the variables, and to call again the equations.
+% The problem with this approach is that subobjects have also to
+% be reset, and this makes it necessary to give again the
+% parameters of the constructor, since we don't save them,
+% and since there is no constructor overloading in metapost.
+% Hence, we decided to merely use the code in |ObjCode| sections.
+% We first refresh the variables (only points), then call
+% reset on the subobjects, then execute the memorized code.
+% This constrains the user to put his code in |ObjCode|.
+% (Otherwise, if |resetObj.expl| is never used, the code can just
+% be given outside |ObjCode|, and not in strings.)
+
+vardef resetObj.expl@#=
+ save varlist_;string varlist_;
+ % refresh the points (also those in arrays)
+ if @#pointlist_="":varlist_=@#points_in_arrayslist_;
+ else:
+ if @#points_in_arrayslist_<>"":
+ varlist_=@#pointlist_ & "," & @#points_in_arrayslist_;
+ else: varlist_=@#pointlist_;
+ fi;
+ fi;
+ refreshObjVars_(@#)(sc_(varlist_));
+
+ % reset the current transformation:
+ @#ctransform_:=identity;
+
+ % reset the label transformations
+ % (as can be observed, this does not place us back in the
+ % initial state, if labels were only added after the application
+ % of a transformation to an object)
+ if known @#ipic_.n_:
+ for i:=1 upto @#ipic_.n_:
+ @#ipic_.transf_[i]:=identity;
+ endfor;
+ fi;
+
+ % reset all subobjects
+
+ if @#sublist_<>"":
+ forsuffixes $:=sc_(@#sublist_):
+ resetObj.expl.obj(@#.$);
+ endfor;
+ fi;
+ if @#subarraylist_<>"":
+ forsuffixes $:=sc_(@#subarraylist_):
+ % and now, we go through each element of the array:
+ for i:=1 upto @#.$n_:
+ if known @#.$[i]:
+ resetObj.expl.obj(@#.$[i]);
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % call the code
+ begingroup; % we want the |vardef| macro only defined locally;
+ % we don't need it later
+ save code_function_;
+ % define the function
+ sc_("vardef code_function_@#=" & @#code_ & @#extra_code_ &
+ " enddef;");
+ % call it
+ code_function_@#;
+ endgroup;
+
+enddef;
+
+% In order to find which point of an object is the most
+% to the left, we search which of the four corners is such that
+% all others are to its right. We return a string corresponding
+% to the corner. |"sw"| for |sw|, etc.
+% This function does not assume the corners to be determined,
+% but it assumes that the vector between two points is known.
+% |f| is |xpart| or |ypart|
+% |g| is |<| or |>|
+vardef findmost@#(text f)(text g)=
+ save found_,i,corner;
+ hide(
+ string corner;boolean found_;found_=false;
+ forsuffixes $:=nw,ne,sw,se:
+ i:=0;
+ forsuffixes $$:=nw,ne,sw,se:
+ exitif f (@#.$$-@#.$) g 0;
+ i:=i+1;
+ endfor;
+ if i=4:found_:=true;corner:=str $;fi;
+ exitif found_;
+ endfor;
+ )
+ corner
+enddef;
+
+% Recursive version of |findmost|. This function returns a numeric
+% corresponding to the x or y part of a point.
+% |f| is |xpart| or |ypart| and |g| is |<| or |>|
+vardef findrecmost@#(text f)(text g)=
+ save found_,i,corner,currentsub;
+ hide(
+ numeric corner,currentsub;boolean found_;found_=false;
+ % first, we check the four corners of the object
+ forsuffixes $:=nw,ne,sw,se:
+ i:=0;
+ forsuffixes $$:=nw,ne,sw,se:
+ exitif f (@#.$$-@#.$) g 0;
+ i:=i+1;
+ endfor;
+ if i=4:found_:=true;corner:=f(@#.$);fi;
+ exitif found_;
+ endfor;
+ % then, we check each subobject recursively:
+ % and first, the regular subobjects:
+ if @#sublist_<>"":
+ forsuffixes $:=sc_(@#sublist_):
+ % check |obj(@#.$)|:
+ currentsub:=findrecmost.obj(@#.$)(f)(g);
+ if not (corner-currentsub g 0):
+ corner:=currentsub;
+ fi;
+ endfor;
+ fi;
+ % and second, the subobjects that are part of arrays of subobjects:
+ % we go through all arrays of subobjects of object |@#|:
+ if @#subarraylist_<>"":
+ forsuffixes $:=sc_(@#subarraylist_):
+ % and now, we go through each element of the array:
+ for i:=1 upto @#.$n_:
+ % check |obj(@#.$[i])|:
+ if known @#.$[i]:
+ currentsub:=findrecmost.obj(@#.$[i])(f)(g);
+ if not (corner-currentsub g 0):
+ corner:=currentsub;
+ fi;
+ fi;
+ endfor;
+ endfor;
+ fi;
+ )
+ corner
+enddef;
+
+% These functions return a string corresponding to a suffix:
+vardef find_lft_most@#= findmost@#(xpart)(<) enddef;
+vardef find_rt_most@#= findmost@#(xpart)(>) enddef;
+vardef find_top_most@#= findmost@#(ypart)(>) enddef;
+vardef find_bot_most@#= findmost@#(ypart)(<) enddef;
+
+% The following are recursive versions of the previous functions.
+% These functions return a numeric.
+vardef findrec_lft_most@#= findrecmost@#(xpart)(<) enddef;
+vardef findrec_rt_most@#= findrecmost@#(xpart)(>) enddef;
+vardef findrec_top_most@#= findrecmost@#(ypart)(>) enddef;
+vardef findrec_bot_most@#= findrecmost@#(ypart)(<) enddef;
+
+%========================================================================
+% Streamlining
+
+% We use a boolean to keep distinguish a streamlined function, from
+% a non-streamlined one. This is needed to find out if a name has been
+% given explicitely to an object.
+boolean streamlined_;streamlined_=false;
+% This boolean is set to true, which means that every time
+% an object is defined with an explicit name, the string version
+% of the name can be used as a shortcut. This is sometimes useful.
+% Setting the boolean to false saves some space.
+boolean memorizeShortcuts;memorizeShortcuts=true;
+
+% Called with something like |streamline("BB")("(expr t)","suffixpar(t)");|
+% where |t| represents the {\it number\/} of an object,
+% the streamline function creates two variants of a constructor:
+% 1) a first variant without options:
+%|vardef new_BB(expr t)=|
+%| save newname_;string newname_;|
+%| hide(|
+%| streamlined_:=true;|
+%| newname_:=newobjstring_;|
+%| newBB.sc_(newname_) suffixpar(t);|
+%| )|
+%| sc_(newname_)|
+%|enddef;|
+
+% 2) a second variant with options:
+%|vardef new_BB_(expr t)(text options)=|
+%| save newname_;string newname_;|
+%| hide(|
+%| streamlined_:=true;|
+%| newname_:=newobjstring_;|
+%| newBB.sc_(newname_) suffixpar(t) options;|
+%| )|
+%| sc_(newname_)|
+%|enddef;|
+
+% Called with something like
+% |streamline("Tree")("(expr theroot)(text subtrees)",|
+% |"suffixpar(theroot) suffixlist(subtrees)");|
+% the streamline function creates the two variants:
+%|vardef new_Tree(expr theroot)(text subtrees)=|
+%| save newname_;string newname_;|
+%| hide(|
+%| streamlined_:=true;|
+%| newname_:=newobjstring_;|
+%| newTree.sc_(newname_) suffixpar(theroot) suffixlist(subtrees);|
+%| )|
+%| sc_(newname_)|
+%|enddef;|
+%
+% and
+%
+%|vardef new_Tree_(expr theroot)(text subtrees)(text options)=|
+%| save newname_;string newname_;|
+%| hide(|
+%| streamlined_:=true;|
+%| newname_:=newobjstring_;|
+%| newTree.sc_(newname_) suffixpar(theroot) suffixlist(subtrees)|
+%| options;|
+%| )|
+%| sc_(newname_)|
+%|enddef;|
+%
+
+% In the above variants, |theroot| is not a suffix, but a string representing
+% a suffix, as possibly returned by another |new_| call.
+% Similarly, |subtree| is not a list of suffixes, but a list
+% of strings representing suffixes. In one case, |suffixpar| must be specified
+% in the parameters of |streamline|. In the other case, one has to write
+% |suffixlist|.
+% |suffixlist| transforms a list of strings into a list of suffixes.
+
+
+% These ``streamlined'' variants do not take
+% an object name; instead, they provide one by themselves; then they
+% call the regular constructor, and the name of the object
+% is returned as a string
+% The three parameters are strings.
+
+vardef streamline(expr class,formalparameters,actualparameters)=
+ save mac;string mac;
+ mac="vardef new_" & class & formalparameters &
+ "=save newname_;string newname_;" &
+ "hide(streamlined_:=true;newname_:=newobjstring_;new" &
+ class & ".sc_(newname_)" &
+ actualparameters & ";)sc_(newname_) enddef;";
+ sc_ mac;
+ % variant with options:
+ mac:="vardef new_" & class & "_" & formalparameters &
+ "(text options)=save newname_;string newname_;" &
+ "hide(streamlined_:=true;newname_:=newobjstring_;new" &
+ class & ".sc_(newname_)" &
+ actualparameters & " options;)sc_(newname_) enddef;";
+ sc_ mac;
+ % we also create the "is" function:
+ createClassTest(class);
+enddef;
+
+% A few definitions used above:
+
+def suffixpar(expr s)=(obj(iname_[s])) enddef;
+
+vardef concatsuffixlist_(text t)=
+ save tmp;string tmp;
+ hide(
+ tmp="";
+ for $:=t:
+ if tmp<>"":
+ tmp:=tmp & "," & iname_[$];
+ else:
+ tmp:=iname_[$];
+ fi;
+ endfor;
+ )
+ tmp
+enddef;
+
+% From a list of numbers, produces the concatenation of the
+% associated suffixes, ready for a |text| parameter
+def suffixlist(text t)=
+ expandafter (sc_ concatsuffixlist_(t))
+enddef;
+
+% This function tries to find an inner point among the points of object |@#|
+% It returns the point name as a string, and an empty string if there
+% is no inner point.
+vardef find_inner_point@#=
+ save inn;string inn;
+ hide(
+ inn="";
+ % we first loop over the |pointlist_| array:
+ if @#pointlist_<>"":
+ forsuffixes $:=sc_(@#pointlist_):
+ if not isStandardPoint$:inn:=str $;fi;
+ exitif inn<>"";
+ endfor;
+ fi;
+ if inn="":
+ % we then loop over all points of arrays,
+ % that is, the |points_in_arrayslist_|:
+ if @#points_in_arrayslist_<>"":
+ forsuffixes $:=sc_(@#points_in_arrayslist_):
+ if not isStandardPoint$:inn:=str $;fi;
+ exitif inn<>"";
+ endfor;
+ fi;
+ fi;
+ )
+ inn
+enddef;
+
+% |rebindrelativeObj|:
+% This function is in a certain way similar to |newBB| in that
+% it provides a regular bounding box to an object. That means that
+% the four corners will be where they should be: |.nw| at the top left,
+% |.sw| at the bottom left, etc.
+% The difference with |newBB| is that it does not create
+% a new object, it only modifies the one given in parameter.
+% No object layer is added.
+% It should be emphasized however that there is no guarantee
+% that the new bounds will contain the whole object, because
+% neither the drawing instructions
+% nor the subobjects are taken into account. We do not take
+% the subobjects into account, because if we did, it would make it
+% difficult to cheat on the bounding box.
+% The new bounding box is only guaranteed to be the tightest
+% containing the former corners of the current object,
+% plus the shifts given in parameters.
+% This function is useful when you want to pretend that
+% the bounding box is different from what it is, because
+% the bounding box is used to decide how much space an object
+% takes when used within another object.
+% This function looks complex because it is! The object we want
+% to recompute may be floating and we have to preserve that;
+% we have to move some points in a floating object.
+% The four additionnal parameters are four dimensions,
+% representing changes in size in the four directions.
+% The values can be positive or negative. Positive values
+% move up or towards the right, and negative values move
+% down or towards the left.
+vardef rebindrelativeObj(suffix n)(expr dyn,dys,dxe,dxw)=
+ save innerpoint,xleft,xright,ytop,ybot,i,nwi,swi,nei,sei,mac;
+ string innerpoint,mac;
+ % we define arrays of points, which will be useful below:
+ save p_,q_,r_;pair p_[],q_[],r_[];
+% message "*** Rebinding with parameters " &
+% decimal(dyn) & "," & decimal(dys) & "," &
+% decimal(dxe) & "," & decimal(dxw);
+ % first, we find the bounds (left, right, bottom, top) of object |n|:
+ % we only look at the current object and not its subobjects
+ % (if one wants the real bounding box, taking into account all
+ % visible parts, use |rebindvisibleObj|)
+ xleft= xpart(n.sc_(find_lft_most.n));
+ xright=xpart(n.sc_(find_rt_most.n));
+ ytop= ypart(n.sc_(find_top_most.n));
+ ybot= ypart(n.sc_(find_bot_most.n));
+
+ % We distinguish two cases: either there is an inner point
+ % (i.e., different from the standard points of the bounding box + .c
+ % which we also consider part of the bounding box),
+ % or there is no such point.
+ % The standard points are those we are going to change.
+ innerpoint=find_inner_point.n;
+ if innerpoint="": % easy (but rare) case
+ % (It is not compulsorily an error if the object has no other points,
+ % it could well be a filling or space object.)
+ % IN THIS CASE, WE IGNORE POSSIBLE SUBOBJECTS, SINCE WE ASSUME
+ % THAT THEY ARE TIED TO INNER POINTS.
+ % Here, we have only to give new values to the standard points.
+ % We first compute the value of the top left corner (|p_1|)
+ % and the differences:
+ p_1=(xleft,ytop)+(dxw,dyn);
+ p_2=(xleft,ybot)+(dxw,dys)-p_1;
+ p_3=(xright,ytop)+(dxe,dyn)-p_1;
+ p_4=(xright,ybot)+(dxe,dys)-p_1;
+ % Then, we refresh the original bounding box
+ refreshObjVars_(n)(ne,nw,se,sw,n,s,e,w,c);
+ % and we could recreate the three differences:
+ % |n.sw-n.nw=p_2-p_1;n.ne-n.nw=p_3-p_1;n.se-n.nw=p_4-p_1;|
+ % however, because of the StandardEquations, we can just define
+ % two opposite corners:
+ n.se-n.nw=p_4-p_1;
+ % Now, either |p_1| is known, or it is not. If it is known,
+ % we give its value to |n.nw|:
+ if known p_1: n.nw:=p_1;fi;
+ else: % common case, more work
+ % first we memorize (computed (nw) - n.nw), (computed (sw) - n.sw), etc.,
+ % that is, how much each corner is going to move to reach its
+ % standard position:
+ q_1=(xleft,ytop)-n.nw+(dxw,dyn);
+ q_2=(xleft,ybot)-n.sw+(dxw,dys);
+ q_3=(xright,ytop)-n.ne+(dxe,dyn);
+ q_4=(xright,ybot)-n.se+(dxe,dys);
+ % these four differences will be used later
+
+ % We now memorize the differences between all points and the
+ % inner point; only those differences which are fully known
+ % will be considered (IS THIS TRUE?);
+ % this will allow us to accept a few non
+ % known (and non used) points
+ % WE HAVE ASSUMED THAT THE INNERPOINT IS ATTACHED INSIDE THE OBJECT
+ i:=0;
+ % First, go through the regular points:
+ if n.pointlist_<>"":
+ forsuffixes $:=sc_(n.pointlist_):i:=i+1;
+ p_[i]=n$-n.sc_(innerpoint);
+ % memorize the indexes of the points |nw|,|sw|,|ne|,|se| when they pass
+ if str $="nw":nwi=i;elseif str $="sw":swi=i;
+ elseif str $="ne":nei=i;elseif str $="se":sei=i;fi;
+ endfor;
+ fi;
+ % then through all other points:
+ if n.points_in_arrayslist_<>"":
+ forsuffixes $:=sc_(n.points_in_arrayslist_):i:=i+1;
+ p_[i]=n$-n.sc_(innerpoint);
+ endfor;
+ fi;
+ % we also save the value of the inner point,
+ % in case it is well in place:
+ if known n.sc_(innerpoint):p_0=n.sc_(innerpoint);fi;
+
+ % we save the differences between the innerpoint and the first
+ % points of the subobjects, if there are any:
+
+ i:=0;
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):i:=i+1;
+ r_[i]=n.sc_(innerpoint)-obj(n$).obj(firstPointOf_(n$));
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ % and now, we go through each element of the array:
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ i:=i+1;
+ r_[i]=n.sc_(innerpoint)-
+ obj(n$[j]).obj(firstPointOf_(n$[j]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % we refresh everything:
+ forsuffixes $$=pointlist_,points_in_arrayslist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):refreshObjVars_(n)($);endfor;
+ fi;
+ endfor;
+
+ % we also untie the subobjects:
+
+ i:=0;
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):i:=i+1;
+ untieObj(obj(n$));
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ % and now, we go through each element of the array:
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ i:=i+1;
+ untieObj(obj(n$[j]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % and we redefine everything except the standard points:
+ i:=0;
+ forsuffixes $$=pointlist_,points_in_arrayslist_:
+ if n$$<>"":
+ forsuffixes $:=sc_(n$$):i:=i+1;
+ if not isStandardPoint$:
+ n$-n.sc_(innerpoint)=p_[i];
+ fi;
+ endfor;
+ fi;
+ endfor;
+
+ % and finally, we attach the subobjects (same code as above):
+
+ i:=0;
+ if n.sublist_<>"":
+ forsuffixes $:=sc_(n.sublist_):i:=i+1;
+ r_[i]=n.sc_(innerpoint)-obj(n$).obj(firstPointOf_(n$));
+ endfor;
+ fi;
+ if n.subarraylist_<>"":
+ forsuffixes $:=sc_(n.subarraylist_):
+ % and now, we go through each element of the array:
+ for j:=1 upto n$n_:
+ if known n$[j]:
+ i:=i+1;
+ r_[i]=n.sc_(innerpoint)-
+ obj(n$[j]).obj(firstPointOf_(n$[j]));
+ fi;
+ endfor;
+ endfor;
+ fi;
+
+ % Now, all non standard points are bound to the inner point.
+ % Finally, we attach the standard points properly;
+ % we know where the new corners are located in the old system
+ % points, for instance
+ % |(xpart(n.sc_(lftmost)),ypart(n.sc_(topmost)))|
+ % corresponds to the new |n.nw|; however, if the object is floating,
+ % we cannot write |n.nw=(xpart(n.sc_(lftmost)),...)|
+ % because the latter refers to variables that do no longer exist.
+ % What we can do is to say
+ % |new(n.nw)-new(n.innerpoint)=(old(n.nw)-old(n.innerpoint))|
+ % |+ (old(computed nw)-old(n.nw))|
+ % The value of |(old(n.nw)-old(n.innerpoint))| is in the |p_| array
+ % The value of |old(computed nw)-old(n.nw)| has been computed above,
+ % before the variables were refreshed. We can just add them.
+ %
+ % Of the four following equations, we define only two,
+ % corresponding to opposite corners. Otherwise, there are redundant
+ % equations.
+ n.nw-n.sc_(innerpoint)=p_[nwi]+q_1;
+ %|n.sw-n.sc_(innerpoint)=p_[swi]+q_2;|
+ %|n.ne-n.sc_(innerpoint)=p_[nei]+q_3;|
+ n.se-n.sc_(innerpoint)=p_[sei]+q_4;
+
+ % And finally, we define the innerpoint |p_0| if necessary
+ if known p_0:n.sc_(innerpoint)=p_0;fi;
+ fi;
+
+ mac:="vardef code_function_@#= " & PureStandardEquations & "enddef;";
+ % we want the |vardef| macro only defined locally;we don't need it later
+ begingroup;
+ save code_function_;
+ sc_(mac);
+ % determine |.n|, |.s|, etc.:
+ sc_ ("code_function_." & str n);
+ endgroup;
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef rebindrelative_Obj(expr n)(expr dyn,dys,dxe,dxw)=
+ hide(rebindrelativeObj(obj(iname_[n]))(dyn,dys,dxe,dxw)) n
+enddef;
+
+def rebindObj(suffix n)=
+ rebindrelativeObj(n)(0,0,0,0);
+enddef;
+
+% streamlined version: |n| is a number representing an object
+vardef rebind_Obj(expr n)=
+ hide(rebindObj(obj(iname_[n]))) n
+enddef;
+
+% This function does an exact rebind, unlike the previous functions.
+% It takes into account everything that is visible
+vardef rebindVisibleObj(suffix n_)=
+ save untied,p;boolean untied;path p;untied=true;
+ if known n_.c:untied:=false;fi;
+ if untied:n_.c=origin;fi;
+ % first, we do a simple |rebindObj| to make sure
+ % that the bounding box is parallel to the axes
+ rebindObj(n_);
+ save bboxmargin;
+ bboxmargin:=0;
+ p=rBboxObj(n_);
+ rebindrelativeObj(n_)(
+ ypart((point 2 of p)-n_.n),
+ ypart((point 1 of p)-n_.s),
+ xpart((point 1 of p)-n_.e),
+ xpart((point 0 of p)-n_.w));
+ if untied:untieObj(n_);fi;
+enddef;
+
+% It is often useful to set the size of an object, in order
+% to get proper alignments. We provide several functions.
+% These functions take a length and extend in one of the four
+% directions until reaching this length. It is a straightforward
+% application of |rebindrelativeObj|:
+
+vardef extendObjRight@#(expr wd)=
+ rebindrelativeObj(@#)(0,0,wd-xpart(@#e-@#w),0);
+enddef;
+
+vardef extendObjLeft@#(expr wd)=
+ rebindrelativeObj(@#)(0,0,0,xpart(@#e-@#w)-wd);
+enddef;
+
+vardef extendObjUp@#(expr ht)=
+ rebindrelativeObj(@#)(ht-ypart(@#n-@#s),0,0,0);
+enddef;
+
+vardef extendObjDown@#(expr ht)=
+ rebindrelativeObj(@#)(0,ypart(@#n-@#s)-ht,0,0);
+enddef;
+
+% Handling of options in constructors:
+
+% Options are added as optional text parameters at the end of constructors.
+% The options are normally strings representing function calls
+% with parameters. Several options can be separated by commas.
+% Each object honors its own options.
+% Non honored options produce errors.
+
+% It is up to the object to decide if it takes options and if it
+% handles them. Options are handled by a generic |ExecuteOptions| call.
+% This function defines variables according to the options given.
+% Later, these variables can be used to achieve various effects.
+
+% The |ExecuteOptions| definition must not be a |vardef|
+% because some of the options
+% (for instance |o_treemode|) do |save|s and the scope of
+% these |save|s must be the whole constructor.
+% |$$| is the object; we need it in order to define |currentObjname|
+% which is used by certain options. However, local options
+% (the ones only used in the constructor) do not use the object name.
+def ExecuteOptions(suffix $$)(text options)=
+ % we don't need a |vardef| here,
+ % because |ExecuteOptions| is called within a |vardef|
+ setcurrentobjname_(str $$);
+ for $:=options:
+ % each option is a function call, so we just call it;
+ % if the function called does not exist, it will of course
+ % produce an error, but this error can clearly be diagnosed.
+ % We call the function |correctOption_| in order to add
+ % quotes in certain cases.
+ sc_ (correctOption_("o_" & $));
+ endfor;
+enddef;
+
+% Here are the functions that can be called; new functions can
+% easily be added to handle more parameters.
+
+def set_local_type(expr type,name,val)=
+ sc_("save o_" & name & "_val;" &
+ type & " o_" & name & "_val;o_" & name & "_val")=val;
+enddef;
+
+% For every option name |s|, this function defines a function |o_s|
+% and calls |addOptionFunction| if the type is |"string"|.
+% This call registers the option so that
+% its arguments is protected.
+
+vardef define_local_type_option(expr type,s)=
+ save tmp;
+ string tmp;
+ tmp="def o_" & s & "(expr s)=";
+ if s="arrows":
+ tmp:=tmp & "set_local_type(" & quote(type) & "," & quote(s) &
+ ",arrows_function_(s));enddef;";
+ else:
+ tmp:=tmp &
+ "set_local_type(" & quote(type) & "," & quote(s) & ",s);enddef;";
+ fi;
+ if type="string":
+ tmp:=tmp & "addOptionFunction(" & quote("o_" & s) & ");";
+ fi;
+ sc_ tmp;
+enddef;
+
+def define_local_string_option(expr s)=
+ define_local_type_option("string",s);
+enddef;
+
+def define_local_numeric_option(expr s)=
+ define_local_type_option("numeric",s);
+enddef;
+
+def define_local_pair_option(expr s)=
+ define_local_type_option("pair",s);
+enddef;
+
+def define_local_color_option(expr s)=
+ define_local_type_option("color",s);
+enddef;
+
+def define_local_boolean_option(expr s)=
+ define_local_type_option("boolean",s);
+enddef;
+
+def define_local_picture_option(expr s)=
+ define_local_type_option("picture",s);
+enddef;
+
+def settodefaultifnotknown_(expr opname)(text type)(expr default)=
+ if expandafter unknown sc_("o_" & opname & "_val"):
+ expandafter save sc_("o_" & opname & "_val");
+ expandafter type sc_("o_" & opname & "_val");
+ sc_("o_" & opname & "_val")=default;
+ fi;
+enddef;
+
+% Alignment option; the string version of the parameter is put
+% into the current object |option_align_| field.
+% This definition must not be a |vardef| because
+% the scope of the |save| is the whole constructor.
+define_local_string_option("align");
+
+define_local_string_option("Dalign");
+define_local_string_option("Ualign");
+define_local_string_option("Lalign");
+define_local_string_option("Ralign");
+
+vardef define_global_type_option(expr type,opname)=
+ save tmp;string tmp;
+ tmp="def o_" & opname & "(expr s)=" &
+ "global_" & type & "_option_(" & ditto & opname & ditto &
+ ")(s);enddef;";
+ if type="string":
+ tmp:=tmp &
+ "addOptionFunction(" & ditto & "o_" & opname & ditto & ");";
+ fi;
+ sc_(tmp);
+enddef;
+
+def define_global_string_option(expr opname)=
+ define_global_type_option("string",opname);
+enddef;
+
+def define_global_boolean_option(expr opname)=
+ define_global_type_option("boolean",opname);
+enddef;
+
+def define_global_color_option(expr opname)=
+ define_global_type_option("color",opname);
+enddef;
+
+def define_global_numeric_option(expr opname)=
+ define_global_type_option("numeric",opname);
+enddef;
+
+def define_global_pair_option(expr opname)=
+ define_global_type_option("pair",opname);
+enddef;
+
+% The parameter of |halign| or |valign|
+% is a list of alignment options, for instance |"clrccl"|
+% It is used for matrix columns.
+
+define_global_string_option("halign");
+define_global_string_option("valign");
+
+% Filling option; the parameter is put
+% into the current object |option_filled_| field for later use.
+define_global_boolean_option("filled");
+
+% Color filling option
+define_global_color_option("fillcolor");
+
+% Framing options.
+define_global_boolean_option("framed");
+define_global_color_option("framecolor");
+define_global_string_option("framestyle");
+
+% Picture option
+define_global_color_option("picturecolor");
+
+% Shadow options
+define_global_boolean_option("shadow");
+define_global_color_option("shadowcolor");
+
+% Fitting option. Usually, the default is for a frame to fit
+% its contents. This options makes it possible to have regular frames
+% around objects that have different widths and heights.
+define_global_boolean_option("fit");
+
+% Tree direction option.
+% This definition must not be a |vardef| because
+% the scope of the |save| is the whole constructor.
+% The name |treemode| was chosen for compatibility with PSTricks.
+define_global_string_option("treemode");
+
+% PSTricks compatibility:
+% This corresponds to PSTricks |treenodesize|;
+% we took a different name, because we have two variants:
+define_local_numeric_option("treenodehsize");
+define_local_numeric_option("treenodevsize");
+
+define_local_numeric_option("matrixnodehsize");
+define_local_numeric_option("matrixnodevsize");
+
+% |HBox| and |VBox| versions of the |"treenodehsize"|/|"treenodevsize"| option:
+define_local_numeric_option("elementsize");
+
+define_local_boolean_option("flip");
+define_local_boolean_option("treeflip");
+
+define_local_boolean_option("hideleaves");
+
+% draw functions for connections
+define_local_string_option("cdraw");
+
+% label for connections
+define_local_picture_option("labpic");
+define_local_numeric_option("labdist");
+
+
+
+% This is a list of all the stored options of a path.
+% This list is defined so that it is easy to loop
+% over all options.
+def pathoptions_=
+ _draw_,_connect_,posA,posB,armA,armB,offsetA,offsetB,
+ name,linecolor,border,bordercolor,linestyle,doubleline,doublesep,
+ arrows,angleA,angleB,arcangleA,arcangleB,curvemax,
+ linewidth,nodesepA,nodesepB,
+ loopsize,linearc,linetensionA,linetensionB,
+ visible,boxsize,boxheight,boxdepth,pathfilled,pathfillcolor,
+ coilarmA,coilarmB,coilheight,coilwidth,coilaspect,coilinc
+enddef;
+
+% default values for curves:
+numeric curve_linewidth_default,
+ curve_arcangleA_default,curve_arcangleB_default,
+ curve_curvemax_default,
+ curve_armA_default,curve_armB_default,curve_loopsize_default,
+ curve_linetensionA_default,curve_linetensionB_default,
+ curve_linearc_default,
+ curve_border_default,curve_nodesepA_default,curve_nodesepB_default,
+ curve_boxsize_default,curve_boxheight_default,curve_boxdepth_default,
+ curve_doublesep_default,
+ curve_coilarmA_default,curve_coilarmB_default,
+ curve_coilheight_default,curve_coilwidth_default,
+ curve_coilaspect_default,curve_coilinc_default;
+% default values for curves (non stored options)
+numeric curve_labpos_default,curve_labangle_default,curve_labdist_default;
+
+
+curve_linewidth_default=.5bp;
+curve_arcangleA_default=10;
+curve_arcangleB_default=10;
+curve_curvemax_default=1;
+curve_armA_default=5mm;
+curve_armB_default=5mm;
+curve_loopsize_default=0.25cm;
+curve_linearc_default=0cm;
+curve_linetensionA_default=1;
+curve_linetensionB_default=1;
+curve_border_default=0pt;
+curve_nodesepA_default=0pt;
+curve_nodesepB_default=0pt;
+curve_boxsize_default=5mm;
+curve_boxheight_default=-1pt; % means that there is no default
+curve_boxdepth_default=-1pt; % means that there is no default
+curve_doublesep_default=1pt;
+curve_coilarmA_default=5mm; % same as in PSTricks
+curve_coilarmB_default=5mm; % same as in PSTricks
+curve_coilheight_default=1; % same as in PSTricks
+curve_coilwidth_default=1cm; % same as in PSTricks
+curve_coilaspect_default=45; % same as in PSTricks
+curve_coilinc_default=90; % 20 is better when |coilaspect|=0
+ % (the PSTricks default is 10, but it seems unnecessary in most cases)
+
+curve_labpos_default=0.5;
+curve_labangle_default=0.0;
+curve_labdist_default=1; % ratio
+
+boolean curve_visible_default,curve_doubleline_default,
+ curve_pathfilled_default;
+curve_visible_default=true;
+curve_doubleline_default=false;
+curve_pathfilled_default=false;
+
+
+color curve_linecolor_default,curve_bordercolor_default,
+ curve_pathfillcolor_default;
+curve_linecolor_default=black;
+curve_bordercolor_default=white;
+curve_pathfillcolor_default=black;
+
+string curve_linestyle_default,curve_arrows_default,
+ curve_posA_default,curve_posB_default;
+pair curve_offsetA_default,curve_offsetB_default;
+curve_linestyle_default="";
+curve_arrows_default="drawarrow";
+curve_posA_default="ic";
+curve_posB_default="ic";
+curve_offsetA_default=(0,0);
+curve_offsetB_default=(0,0);
+
+% curve options shortcuts table
+string curve_options_shortcuts_[];
+numeric ncurve_options_shortcuts_;
+ncurve_options_shortcuts_=0;
+
+vardef isCurveOptionShortcut(expr opname)=
+ save r;boolean r;r=false;
+ hide(
+ for i:=0 upto ncurve_options_shortcuts_-1:
+ if curve_options_shortcuts_[i]=opname:r:=true;fi;
+ exitif r;
+ endfor;
+ )
+ r
+enddef;
+
+def setCurveDefaultOption(expr name,value)=
+ if isCurveOptionShortcut(name):
+ sc_("curve_" & name & "A_default"):=value;
+ sc_("curve_" & name & "B_default"):=value;
+ elseif name="arrows":
+ sc_("curve_" & name & "_default"):=arrows_function_(value);
+ else:
+ sc_("curve_" & name & "_default"):=value;
+ fi;
+enddef;
+
+% For all options for which there are two versions (A and B),
+% we define special shortcuts, as does PSTricks.
+% We also memorize the shortcuts, because they are needed in
+% |setCurveDefaultOption|.
+
+def define_path_option_shortcut(expr s)=
+ scantokens("def o_" & s &
+ "( expr l)=o_" & s & "A(l);o_" & s & "B(l);enddef;");
+ curve_options_shortcuts_[ncurve_options_shortcuts_]=s;
+ ncurve_options_shortcuts_:=ncurve_options_shortcuts_+1;
+enddef;
+
+define_path_option_shortcut("linetension");
+define_path_option_shortcut("coilarm");
+define_path_option_shortcut("pos");
+define_path_option_shortcut("offset");
+define_path_option_shortcut("arm");
+define_path_option_shortcut("angle");
+define_path_option_shortcut("arcangle");
+define_path_option_shortcut("nodesep");
+
+% Arrows functions: these functions should be similar to |draw|.
+% They can be parameters to the |"arrows"| option.
+
+def rdrawarrow = drawarrow reverse enddef;
+
+% This is the default value for connections.
+% |p| is a path to be drawn.
+% |n| is a suffix for an array of stored parameters
+% |i| is the index in this array
+% If the suffix is empty, we use locally stored values.
+vardef cdraw_default(suffix n)(expr i)(expr p)=
+ save colorcmd,p_;string colorcmd;path p_;colorcmd="";
+ p_=p;
+ p_:=cutpathends_(p_,if known o_nodesepB_val: o_nodesepB_val
+ else: curve_nodesepB_default fi,
+ if known o_nodesepA_val: o_nodesepA_val
+ else: curve_nodesepA_default fi);
+ if str n="":
+ if CLOV_("border")>0:
+ pickup pencircle scaled CLOV_("border");
+ % we cut the ends of the path in order to avoid
+ % the end nodes to be erased; the standard setting
+ % should work in most cases, except when the path
+ % reaches the node under a small angle; we should then
+ % add options to define how much of the path we cut.
+ draw cutpathends_(p,2*CLOV_("border"),2*CLOV_("border"))
+ withcolor CLOV_("bordercolor");
+ fi;
+ pickup pencircle scaled CLOV_("linewidth");
+ if CLOV_("linecolor")<>black:
+ colorcmd:="withcolor " & colortostring(CLOV_("linecolor"));
+ fi;
+ if CLOV_("doubleline"):
+ sc_(CLOV_("arrows") & "_double")
+ (p_)(CLOV_("doublesep"))(CLOV_("linewidth"))
+ sc_(CLOV_("linestyle"))
+ sc_(colorcmd);
+ else:
+ sc_(CLOV_("arrows"))
+ (p_)
+ sc_(CLOV_("linestyle"))
+ sc_(colorcmd);
+ fi;
+ else:
+ if n.border[i]>0:
+ pickup pencircle scaled n.border[i];
+ % we cut the ends of the path in order to avoid
+ % the end nodes to be erased; the standard setting
+ % should work in most cases, except when the path
+ % reaches the node under a small angle; we should then
+ % add options to define how much of the path we cut.
+ draw cutpathends_(p,2*n.border[i],2*n.border[i])
+ withcolor n.bordercolor[i];
+ fi;
+ pickup pencircle scaled n.linewidth[i];
+ if n.linecolor[i]<>black:
+ colorcmd:="withcolor " & colortostring(n.linecolor[i]);
+ fi;
+ if n.doubleline[i]:
+ sc_(n.arrows[i] & "_double")
+ (p_)(n.doublesep[i])(n.linewidth[i])
+ sc_(n.linestyle[i])
+ sc_(colorcmd);
+ else:
+ sc_(n.arrows[i])
+ (p_)
+ sc_(n.linestyle[i])
+ sc_(colorcmd);
+ fi;
+ fi;
+ pickup pencircle scaled curve_linewidth_default;
+enddef;
+
+% color for connections
+% We don't name it |color|, because at some point we would need
+% to do a |sc_("color")| which would fail.
+define_local_color_option("linecolor");
+
+% border color (PSTricks compatibility)
+define_local_color_option("bordercolor");
+
+% size of border (PSTricks compatibility)
+define_local_numeric_option("border");
+
+% option for the path array |_path_|; this option makes
+% it possible to use a different array with |nccurve| and similar
+% functions.
+define_local_string_option("patharray");
+
+% connections within trees
+define_global_string_option("edge");
+
+% fan options:
+define_global_string_option("fanlinestyle");
+
+define_global_boolean_option("pointedfan");
+define_global_numeric_option("fanlinearc");
+
+% angles for connections (PSTricks compatibility)
+define_local_numeric_option("angleA");
+define_local_numeric_option("angleB");
+define_local_numeric_option("arcangleA");
+define_local_numeric_option("arcangleB");
+
+% separations for connections (PSTricks compatibility)
+define_local_numeric_option("nodesepA");
+define_local_numeric_option("nodesepB");
+
+% parameters for |ncbox| and |ncarcbox|: size of boxes (PSTricks compatibility)
+define_local_numeric_option("boxsize");
+define_local_numeric_option("boxheight");
+define_local_numeric_option("boxdepth");
+
+% parameter for |ncloop|
+define_local_numeric_option("loopsize");
+
+% smoothness of connections
+define_local_numeric_option("linearc");
+
+% coil/zigzag connections:
+define_local_numeric_option("coilarmA");
+define_local_numeric_option("coilarmB");
+define_local_numeric_option("coilheight");
+define_local_numeric_option("coilwidth");
+define_local_numeric_option("coilaspect");
+define_local_numeric_option("coilinc");
+
+% visibility of connections
+% (a connection can be invisible and be used for other purposes,
+% such as label positionning or computation of intersections)
+define_local_boolean_option("visible");
+
+define_local_boolean_option("pathfilled");
+define_local_color_option("pathfillcolor");
+
+% tensions of connection (only |nccurve|)
+define_local_numeric_option("linetensionA");
+define_local_numeric_option("linetensionB");
+
+% maximum distance for loops produced by nccurve
+define_local_numeric_option("curvemax"); % added Nov 10, 2006
+
+% thickness for connections
+define_local_numeric_option("linewidth");
+
+% style for connections
+define_local_string_option("linestyle");
+
+% double lines:
+define_local_boolean_option("doubleline");
+define_local_numeric_option("doublesep");
+
+
+% positions for connections
+define_local_string_option("posA");
+define_local_string_option("posB");
+
+% offsets for connections
+define_local_pair_option("offsetA");
+define_local_pair_option("offsetB");
+
+% arms for connections
+define_local_numeric_option("armA");
+define_local_numeric_option("armB");
+
+% names for connections
+define_local_string_option("name");
+
+% Label options:
+define_local_numeric_option("labrotate");
+define_local_numeric_option("labangle");
+define_local_numeric_option("labpos");
+define_local_pair_option("labshift");
+% this is like the labshift option, but will use the
+% |laboff| definition used by |label|
+define_local_string_option("labdir");
+define_local_color_option("labcolor");
+define_local_boolean_option("laberase");
+define_local_string_option("labpoint");
+define_local_string_option("labcard");
+define_local_string_option("labpathname");
+define_local_numeric_option("labpathid");
+
+
+% Internal horizontal separation.
+define_local_numeric_option("hsep");
+
+% Internal vertical separation.
+define_local_numeric_option("vsep");
+
+define_local_numeric_option("hbsep");
+define_local_numeric_option("vbsep");
+
+% External horizontal separation
+define_local_numeric_option("dx");
+
+% External vertical separation
+define_local_numeric_option("dy");
+
+% Rotation angle
+define_local_numeric_option("rotangle");
+
+% How much the start of a line is shifted right
+define_local_numeric_option("lstartdx");
+
+% How much the end of a line is shifted right
+define_local_numeric_option("lenddx");
+
+define_global_numeric_option("rule");
+define_local_numeric_option("lrsep");
+define_local_numeric_option("rrsep");
+
+% Line width for draws
+define_global_numeric_option("framewidth");
+
+% radius for corners of rounded corners
+define_global_numeric_option("rbox_radius");
+
+% Circle margin
+define_local_numeric_option("circmargin");
+
+% Polygon margin
+define_local_numeric_option("polymargin");
+
+define_local_numeric_option("angle");
+
+% Draw arrow function option;
+% the parameter is a string representing a draw function
+% We first define a conversion function:
+
+def arrows_function_(expr s)=
+ if ((substring(0,1) of s >= "A") and (substring(0,1) of s <= "Z")) or
+ ((substring(0,1) of s >= "a") and (substring(0,1) of s <= "z")):
+ s
+ elseif s="-": "draw"
+ elseif s="->": "drawarrow"
+ elseif s="<-": "rdrawarrow"
+ % other cases can easily be added here
+ else: "draw" % default
+ fi
+enddef;
+
+define_local_string_option("arrows");
+
+% This is an option to locally redefine the main drawing function
+% of the object.
+define_global_string_option("drawObj");
+
+def global_option_(expr name)(expr s)=
+ global_string_option_(name)(s);
+enddef;
+
+def global_boolean_option_(expr name)(expr s)=
+ global_type_option_("boolean")(name)(s);
+enddef;
+
+def global_string_option_(expr name)(expr s)=
+ global_type_option_("string")(name)(s);
+enddef;
+
+def global_numeric_option_(expr name)(expr s)=
+ global_type_option_("numeric")(name)(s);
+enddef;
+
+def global_color_option_(expr name)(expr s)=
+ global_type_option_("color")(name)(s);
+enddef;
+
+% This is for options that are attached to an object,
+% and that are not local only to its constructor.
+def global_type_option_(expr type)(expr name)(expr s)=
+ if not isOfType(type,currentObjname & ".option_" & name & "_"):
+ sc_(type)
+ obj(generisize_(currentObjname)).sc_("option_" & name & "_");
+ fi;
+ if not string obj(currentObjname).options_:
+ expandafter string obj(generisize_(currentObjname)).options_;
+ fi;
+ if unknown obj(currentObjname).options_:
+ obj(currentObjname).options_="_" & name;
+ % we added a |_| so that the tag becomes unknown
+ % for we can then traverse the |options_| with a |forsuffixes|
+ % in |duplicateObj|
+ % (we should make this more robust)
+ else:
+ obj(currentObjname).options_:=obj(currentObjname).options_& ",_" & name;
+ fi;
+ obj(currentObjname).sc_("option_" & name & "_")=s;
+enddef;
+
+% This is a general function to test options:
+% |@#| is the object name. |opname| is the option name
+% and |opvalue| is the option value.
+
+vardef Option@#(expr opname,opvalue)=
+ (OptionValue@#(opname)=opvalue)
+enddef;
+
+% This function finds the value of a parameter for an object.
+% An option is either stored in the object (when it is local, but meant
+% to be used later, not in the constructor),
+% or local in the object, but for an immediate use (i.e., it won't be
+% available after the creation), or global to the class.
+% In the first case, we check the variable
+% |@#sc_("option_" & opname & "_")|
+% (the type of the option is irrelevant here)
+% In the second case, we check |sc_("o_" & opname & "_val")|
+% (the type of the option is irrelevant here)
+% In the third case, we check the global value
+% |sc_(clname & "_" opname)|
+% (the type of the option is irrelevant here)
+vardef OptionValue@#(expr opname)=
+ (if known (@#sc_("option_" & opname & "_")):
+ (@#sc_("option_" & opname & "_"))
+ elseif known (sc_("o_" & opname & "_val")):
+ (sc_("o_" & opname & "_val"))
+ elseif known (sc_(objClassName_(@#) & "_" & opname)):
+ (sc_(objClassName_(@#) & "_" & opname))
+ else:
+ whatever
+ fi
+ )
+enddef;
+
+% This function only looks at local options and does not
+% take an object into account. It is suitable for the options
+% of a draw command. Moreover, the last parameter is a default
+% value.
+vardef LocalOptionValue(expr opname,default)=
+ (if known (sc_("o_" & opname & "_val")):
+ (sc_("o_" & opname & "_val"))
+ else:
+ default
+ fi
+ )
+enddef;
+
+% Constructions such as |LocalOptionValue("posA",curve_posA_default)|
+% are quite common. We therefore introduce a shortcut:
+def CLOV_(expr opname)=
+ sc_("LocalOptionValue(" &
+ quote(opname) & ",curve_" & opname & "_default)")
+enddef;
+
+% This function defines default global values for classes.
+% This works for numerical, string or color values.
+% |setObjectDefaultOption("HBox")("hsep")(5mm)|
+def setObjectDefaultOption(expr clname)(expr var)(expr val)=
+ if numeric val:
+ sc_(clname & "_" & var):=val;
+ elseif string val:
+ sc_("string " & clname & "_" & var & ";");
+ sc_(clname & "_" & var):=val;
+ elseif color val:
+ sc_("color " & clname & "_" & var & ";");
+ sc_(clname & "_" & var):=val;
+ elseif boolean val:
+ sc_("boolean " & clname & "_" & var & ";");
+ sc_(clname & "_" & var):=val;
+ fi;
+enddef;
+
+% |clearObj a,b| makes it possible to reuse the objects |a| and |b|
+% If this function is called within |beginfig|/|endfig|, it only
+% clears the object until the end of the environment.
+let clearObj=save;
+
+let showObj=showvariable;
+
+% n is the number of an object
+def show_Obj(expr n)=
+ sc_("showObj " & iname_[n]);
+enddef;
+
+
+% Handling of paths in objects:
+
+% This function adds a point to an object's point array.
+% |p| is the point and |a| is the array of object |@#|.
+% This function is used when a path is attached to an object.
+vardef addPointToArray@#(expr p)(suffix a)=
+ @#a.n_:=@#a.n_+1;
+ @#a[@#a.n_]:=p;
+ % The relative position of the point is memorized as an equation,
+ % so that we can conveniently reset the object later, and not loose
+ % the points.
+ addObjExtraCode@# "@#" & str a & decimal(@#a.n_) & "-@#c=(" &
+ decimal(xpart(p-@#c)) & "," & decimal(ypart(p-@#c)) & ");";
+ if @#points_in_arrayslist_="":
+ @#points_in_arrayslist_:=str a & decimal(@#a.n_);
+ else:
+ @#points_in_arrayslist_:=@#points_in_arrayslist_ & "," & str a & decimal(@#a.n_);
+ fi;
+enddef;
+
+def cutpathends_(expr p,a,b)=
+ if (a=0) and (b=0):p
+ else:
+ p cutafter (p intersectionpoint
+ (fullcircle scaled a shifted (point (length(p)) of p)))
+ cutbefore (p intersectionpoint
+ (fullcircle scaled b shifted (point 0 of p)))
+ fi
+enddef;
+
+
+% This function adds a path to an object.
+% The path is |p| and the object is |@#|.
+% |n| is the name of the path within the object.
+% It must have been defined with |addPathArray|.
+vardef addPath@#(suffix n)(expr i)(text p)=
+ save p_,untied;path p_;boolean untied;untied=true;
+ % n is _spath_ or _upath_
+ if known @#c:untied:=false;fi;
+ % we temporarily tie the object if necessary
+ if untied:@#c=origin;fi;
+ % only then can we store the path:
+ p_=p;
+ % Now, we slightly modify the path in order to take the |nodesepA|
+ % and |nodesepB| parameters into account:
+ p_:=cutpathends_(p_,if known o_nodesepB_val: o_nodesepB_val
+ else: curve_nodesepB_default fi,
+ if known o_nodesepA_val: o_nodesepA_val
+ else: curve_nodesepA_default fi);
+ setcurrentobjname_(str @#);
+ % if the |ip_| array does not yet exist, create it:
+ if not pair @#n.ip_1:
+ ObjPointArray(n.ip_)(0);
+ else:
+ % if it does already exist, we only initialize it once:
+ if unknown @#n.ip_.n_:
+ ObjPointArray(n.ip_)(0);
+ fi;
+ fi;
+ xpart(@#n[i])=@#n.ip_.n_+1; % path number
+ % we add each point of the path |p_| to the |ip_| array:
+ for j:=0 upto length p_-1:
+ addPointToArray@#(point j of p_)(n.ip_);
+ addPointToArray@#(postcontrol j of p_)(n.ip_);
+ addPointToArray@#(precontrol (j+1) of p_)(n.ip_);
+ endfor;
+ addPointToArray@#(point (length(p_)) of p_)(n.ip_);
+ ypart(@#n[i])=length p_;
+ % if the object was initially untied, we untie it
+ if untied:untieObj(@#);fi;
+enddef;
+
+% This function removes the paths from an array:
+vardef deletePaths@#(suffix n)=
+ @#extra_code_:="";
+ for i:=1 upto @#n.ip_.n_:
+ @#n[i]:=(whatever,whatever);
+ endfor;
+ % reset |ip_|
+ @#n.ip_.n_:=0;
+ % remove |ip_1|, ... from |points_in_arrayslist|:
+ save newpoints_in_arrayslist_;
+ string newpoints_in_arrayslist_;newpoints_in_arrayslist_:="";
+ forsuffixes $:=sc_(@#points_in_arrayslist_):
+ if (substring(0,length(str n & ".ip_")) of (str$))<>(str n & ".ip_"):
+ if newpoints_in_arrayslist_="":
+ newpoints_in_arrayslist_:=str$;
+ else:
+ newpoints_in_arrayslist_:=newpoints_in_arrayslist_ & "," & str$;
+ fi;
+ fi;
+ endfor;
+ @#points_in_arrayslist_:=newpoints_in_arrayslist_;
+ message "@#points_in_arrayslist_=" & @#points_in_arrayslist_;
+enddef;
+
+% This function defines an array of paths within an object.
+% |p| is the array name, |n| the size of the array
+% and |@#| is the object.
+vardef addPathArray@#(suffix p)(expr n)=
+ setcurrentobjname_(str @#);
+ ObjPairArray(p)(n);
+enddef;
+
+vardef addPathVariables@#(suffix p)=
+ setcurrentobjname_(str @#);
+ addPathArray@#(p)(0); % this is a standard array for paths added to
+ % an object
+ forsuffixes $=_draw_,_connect_,posA,posB,name,linestyle,arrows:
+ ObjStringArray(p$)(0);
+ endfor;
+ forsuffixes $=angleA,angleB,arcangleA,arcangleB,nodesepA,nodesepB,
+ loopsize,linearc,linetensionA,linetensionB,linewidth,
+ armA,armB,border,boxsize,boxheight,boxdepth,
+ doublesep,coilarmA,coilarmB,coilheight,coilwidth,coilaspect,coilinc:
+ ObjNumericArray(p$)(0);
+ endfor;
+ ObjBooleanArray(p.visible)(0);
+ ObjBooleanArray(p.pathfilled)(0);
+ ObjColorArray(p.pathfillcolor)(0);
+ ObjBooleanArray(p.doubleline)(0);
+ ObjPairArray(p.offsetA)(0);
+ ObjPairArray(p.offsetB)(0);
+ ObjColorArray(p.linecolor)(0);
+ ObjColorArray(p.bordercolor)(0);
+enddef;
+
+def increment_pathparameters_(suffix p)(suffix $)=
+ $p.n_:=$p.n_+1;
+ $p._draw_[$p.n_]:=LocalOptionValue("cdraw","cdraw_default");
+ $p.visible[$p.n_]:=CLOV_("visible");
+ $p.pathfilled[$p.n_]:=CLOV_("pathfilled");
+ $p.pathfillcolor[$p.n_]:=CLOV_("pathfillcolor");
+ $p.border[$p.n_]:=CLOV_("border");
+ $p.bordercolor[$p.n_]:=CLOV_("bordercolor");
+ $p.linewidth[$p.n_]:=CLOV_("linewidth");
+ $p.linecolor[$p.n_]:=CLOV_("linecolor");
+ $p.nodesepA[$p.n_]:=CLOV_("nodesepA");
+ $p.nodesepB[$p.n_]:=CLOV_("nodesepA");
+ $p.arrows[$p.n_]:=CLOV_("arrows");
+ $p.linestyle[$p.n_]:=CLOV_("linestyle");
+ $p.doubleline[$p.n_]:=CLOV_("doubleline");
+ forsuffixes $$=_draw_,visible,border,bordercolor,linewidth,linecolor,
+ arrows,linestyle,nodesepA,nodesepB,doubleline,pathfilled,pathfillcolor:
+ $p$$n_:=$p.n_;
+ endfor;
+enddef;
+
+% This is a function simplifying the use of |addPath|
+vardef addUserPath@#(text p) text options=
+ ExecuteOptions()(options);
+ if unknown @#_upath_.n_:
+ addPathVariables@#(_upath_);
+ fi;
+ increment_pathparameters_(_upath_)(@#);
+ addPath@#(_upath_,@#_upath_.n_,p);
+enddef;
+
+vardef addStandardPath@#(text p) text options=
+ ExecuteOptions()(options);
+ if unknown @#_spath_.n_:
+ addPathVariables@#(_spath_);
+ fi;
+ increment_pathparameters_(_spath_)(@#);
+ addPath@#(_spath_,@#_spath_.n_,p);
+enddef;
+
+def ObjPath(text p) text options=
+ addStandardPath.sc_(currentObjname)(p) options;
+enddef;
+
+% The |Path| function reconstructs a path from a path |p[j]|
+% and an object reference |@#|.
+vardef Path@#(suffix p)(expr j)=
+ (
+ for i:=0 upto ypart(@#p[j])-1:
+ @#p.ip_[xpart(@#p[j])+i*3]..
+ controls @#p.ip_[xpart(@#p[j])+i*3+1] and
+ @#p.ip_[xpart(@#p[j])+i*3+2]..
+ endfor
+ @#p.ip_[xpart(@#p[j])+ypart(@#p[j])*3]
+ )
+enddef;
+
+% The |drawMemorizedPaths_| function draws paths that have been memorized.
+% It must be called explicitely in the draw function of an object.
+% It uses the value of the |cdraw| option to draw the memorized path.
+% This makes it possible to change the color, the style, etc.
+% There are two kinds of paths attached to an object: the standard ones,
+% in the |_spath_| array, and the user ones in the |_upath_| array.
+% For instance, the standard paths of a tree are the connections between
+% the root and the subtrees.
+def drawMemorizedPaths_(suffix n)=
+ forsuffixes $=_spath_,_upath_:
+ if known n$n_:
+ for i:=1 upto n$n_:
+ % fans are not drawn here
+ if n$arrows[i]<>"fandraw":
+ if n$visible[i]:
+ if n$pathfilled[i]:
+ fill Path.n($,i)--cycle withcolor n$pathfillcolor[i];
+ fi;
+ sc_(n$_draw_[i])(n$)(i)(Path.n($,i));
+ fi;
+ fi;
+ endfor;
+ fi;
+ endfor;
+enddef;
+
+% The following function is useful for classes which contain
+% an object or a picture:
+def StandardObjectOrPictureContainerSetup(expr v)=
+ if (picture v) or (string v):
+ ObjPoint p.off;
+ ObjPicture p;
+ if picture v:
+ setPicture(p)(v); % initialize the picture
+ elseif string v:
+ if v="":
+ setPicture(p)(nullpicture);
+ else:
+ % borrowed from |boxes.mp|
+ setPicture(p)(v infont defaultfont scaled defaultscale);
+ fi;
+ fi;
+ elseif numeric v:
+ SubObject(sub,Obj(v));
+ else:
+ errmessage "Parameter of StandardObjectOrPictureContainerSetup should be picture, a string or an object.";
+ fi;
+ ObjNumeric a,b;
+ (obj(currentObjname)a,obj(currentObjname)b) =
+ if numeric v: % object
+ .5*(obj(obj(currentObjname)sub)ne-obj(obj(currentObjname)sub)sw)
+ elseif (picture v) or (string v):
+ .5*(urcorner obj(currentObjname)p - llcorner obj(currentObjname)p)
+ fi;
+enddef;
+
+def drawPictureOrObject(suffix n)=
+ if known n.p:
+ if urcorner(n.p)-llcorner(n.p)<>(0,0):
+ drawPicture.n(p);
+ fi;
+ else:
+ drawObj(obj(n.sub));
+ fi;
+enddef;
+
+% Node connections:
+
+def patharray_suffix_=
+ sc_(LocalOptionValue("patharray","_upath_"))
+enddef;
+
+def sign_(expr n)=
+ if n>=0:1 else:-1 fi
+enddef;
+
+% This function is used when certain paths have to be smoothed
+% |p| is the path and |r| is the radius used where a sharp edge
+% is rounded.
+vardef smoothen(expr p,r)=
+ save q,qq,anglechange;path q;pair qq[];
+ hide(
+ if r>0:
+ q=point 0 of p;
+ for i:=1 upto length(p)-1:
+ qq0:=(whatever,whatever);qq1:=(whatever,whatever);
+ qq2:=(whatever,whatever);qq3:=(whatever,whatever);
+ if (point (i+1) of p=point i of p) or
+ (point (i-1) of p=point i of p):
+ anglechange:=0;
+ else:
+ anglechange:=angle(point (i+1) of p-point i of p)
+ -angle(point i of p-point (i-1) of p);
+ fi;
+ if anglechange>180: anglechange:=anglechange-360;fi;
+ if anglechange<-180: anglechange:=anglechange+360;fi;
+ if abs(anglechange)>1:
+ % first, we compute the center of the arc
+ qq0=whatever[point (i-1) of p,point i of p]
+ +r*dir(angle(point i of p-point (i-1) of p)
+ +sign_(anglechange)*90)
+ =whatever[point i of p,point (i+1) of p]
+ +r*dir(angle(point (i+1) of p-point i of p)
+ +sign_(anglechange)*90);
+ % |qq1| and |qq2| are the points where the arc touches
+ % the original curve
+ qq1=whatever[point (i-1) of p,point i of p]
+ =whatever[qq0,qq0+(point i of p-point (i-1) of p) rotated 90];
+ qq2=whatever[point i of p,point (i+1) of p]
+ =whatever[qq0,qq0+(point (i+1) of p-point i of p) rotated 90];
+ qq3=qq0+r*unitvector(qq1+qq2-2qq0);
+ q:=q & ((point (length(q)) of q)--qq1..
+ qq3..{point (i+1) of p-point i of p}qq2);
+ else:
+ q:=q & (point (length(q)) of q--point i of p);
+ fi;
+ endfor;
+ q:=q & (point (length(q)) of q--point (length(p)) of p);
+ else:
+ q:=p;
+ fi;
+ )
+ q
+enddef;
+
+% Generic part in the handling of node connections.
+% |vardef| can't be used
+% The object is |$| (if there is no object, |$| is empty)
+% |n| and |m| are either objects (if they are numerics) or points
+% (if they are pairs)
+def nc_(suffix $)(suffix n,m)(expr f) text options =
+ % this next line is actually only relevant when |$| is non-empty;
+ % but if it is empty, the line is harmless.
+ o_patharray("_upath_");
+ % The first parameter is not used, because we have only local options
+ % (non-local options have only a meaning for object constructors)
+ ExecuteOptions()(options);
+ nc__($)(n,m)(f)(patharray_suffix_);
+enddef;
+
+% The object is |$|
+% |n| and |m| are either objects (if they are numerics) or points
+% (if they are pairs)
+def nc__(suffix $)(suffix n,m)(expr f)(suffix p)=
+ if str $ <> "":
+ if unknown $p.n_:
+ addPathVariables$(p);
+ fi;
+ $p.n_:=$p.n_+1;
+ % the next four lines must occur before the variables get a value,
+ % because we want to memorize the initial state
+ $p.angleA[$p.n_]:=o_angleA_val;
+ $p.angleB[$p.n_]:=o_angleB_val;
+ $p.nodesepA[$p.n_]:=o_nodesepA_val;
+ $p.nodesepB[$p.n_]:=o_nodesepB_val;
+ fi;
+ if unknown o_angleA_val:
+ save o_angleA_val;numeric o_angleA_val;
+ if known curve_angleA_default: % added 18 June 2006
+ o_angleA_val=curve_angleA_default;
+ else:
+ if numeric n:
+ if m.sc_(CLOV_("posB"))-n.sc_(CLOV_("posA"))<>(0,0):
+ o_angleA_val=
+ angle(m.sc_(CLOV_("posB"))-n.sc_(CLOV_("posA")));
+ else:
+ o_angleA_val=0;
+ fi;
+ else:
+ if m-n<>(0,0):
+ o_angleA_val=angle(m-n);
+ else:
+ o_angleA_val=0;
+ fi;
+ fi;
+ fi;
+ fi;
+ if unknown o_angleB_val:
+ save o_angleB_val;numeric o_angleB_val;
+ if known curve_angleB_default: % added 18 June 2006
+ o_angleB_val=curve_angleB_default;
+ else:
+ if numeric n:
+ if m.sc_(CLOV_("posB"))-n.sc_(CLOV_("posA"))<>(0,0):
+ o_angleB_val=
+ angle(m.sc_(CLOV_("posB"))-n.sc_(CLOV_("posA")));
+ else:
+ o_angleB_val=0;
+ fi;
+ else:
+ if m-n<>(0,0):
+ o_angleB_val=angle(m-n);
+ else:
+ o_angleB_val=0;
+ fi;
+ fi;
+ fi;
+ fi;
+
+ settodefaultifnotknown_("nodesepA")(numeric)(curve_nodesepA_default);
+ settodefaultifnotknown_("nodesepB")(numeric)(curve_nodesepB_default);
+ if str $ <> "":
+ $p._draw_[$p.n_]:=LocalOptionValue("cdraw","cdraw_default");
+ $p._connect_[$p.n_]:=f;
+ forsuffixes $$=posA,posB,armA,armB,loopsize,visible,
+ linetensionA,linetensionB,
+ arcangleA,arcangleB,offsetA,offsetB,linewidth,linecolor,border,
+ bordercolor,linestyle,arrows,boxsize,boxheight,boxdepth,
+ doubleline,doublesep,pathfilled,pathfillcolor:
+ $p$$[$p.n_]:=CLOV_(str $$);
+ endfor;
+ $p.name[$p.n_]:=LocalOptionValue("name","");
+ nc_inc_$(p);
+ fi;
+enddef;
+
+
+% Increment the size of the option arrays
+vardef nc_inc_@#(suffix p)=
+ forsuffixes $:=pathoptions_:
+ @#p$n_:=@#p$n_+1;
+ endfor;
+enddef;
+
+% This macro draws a label on an immediate curve % ZZZZZZZZ
+% (created Sep. 28, 2006)
+vardef nc_label_(expr p)=
+ if known o_labpic_val:
+ if known o_labangle_val:
+ o_labangle_val:=o_labangle_val
+ +angle(direction (o_labpos_val*length(p)) of p);
+ o_labpic_val:=o_labpic_val rotated o_labangle_val;
+ fi;
+ save shift_;pair shift_;
+ shift_:=(0,0); % default
+ if known o_labdir_val:
+ shift_:=clabshift_*CLOV_("labdist");
+ fi;
+ label(o_labpic_val,
+ (point (CLOV_("labpos")*length(p)) of p) shifted shift_);
+ fi;
+enddef;
+
+% This is the main function that distinguishes if a curve is in
+% or out of an object (that is, if it will follow the object or not),
+% and if it links two objects or two points.
+% (That makes four different combinations.)
+% |pa| is the path connecting two objects
+% |pb| is the path connecting two points
+% |n| can be either an object (numeric) or a point (pair).
+vardef nc_core_@#(suffix n)(suffix p)(text pa)(text pb)=
+
+ if str @# <> "":
+ % we are in an object (deferred curve)
+ if numeric n:
+ % @#p.n_ = path number
+ addPath@#(p,@#p.n_,pa);
+ if known o_labpic_val:
+ ObjLabel@#(o_labpic_val) "labpathid(" & decimal(-@#p.n_) & ")"; %AAAAAA
+ % in the above, labpos is already taken into account if set
+ fi;
+
+ else:
+ addPath@#(p,@#p.n_,pb);
+ if known o_labpic_val:
+ ObjLabel@#(o_labpic_val) "labpathid(" & decimal(-@#p.n_) & ")"; %AAAAAA
+ % in the above, labpos is already taken into account if set
+ fi;
+ fi;
+ else:
+ % we are not in an object (immediate curve)
+ % we draw the curve only if it is visible:
+ if CLOV_("visible"):
+ if numeric n:
+ sc_(LocalOptionValue("cdraw","cdraw_default"))
+ ()(0) % value irrelevant, but first parameter empty
+ (pa);
+ % if necessary, a label is drawn
+ nc_label_(pa); % added Sep. 28, 2006
+ else:
+ sc_(LocalOptionValue("cdraw","cdraw_default"))
+ ()(0) % value irrelevant, but first parameter empty
+ (pb);
+ % if necessary, a label is drawn
+ nc_label_(pb); % added Sep. 28, 2006
+ fi;
+ fi;
+ fi;
+enddef;
+
+% This is like |nc_core_|, but the last two parameters of
+% |nc_core_| are identical.
+vardef nc_core_double_@#(suffix n)(suffix p)(text pa)=
+ nc_core_@#(n)(p)(pa)(pa);
+enddef;
+
+vardef ncshort_@#(expr a,b)(text n)(text m)(text options)=
+ if string n:
+ save tmp;string tmp;
+ tmp="(" & str @# & ")(" & nameToSuffixString_(n) & "," &
+ nameToSuffixString_(m) & ")";
+ sc_(a & "_" & tmp)(b) options;
+ sc_(b & "_" & tmp)(patharray_suffix_);
+ else:
+ sc_(a & "_")(@#)(n,m)(b) options;
+ sc_(b & "_")(@#)(n,m)(patharray_suffix_);
+ fi;
+enddef;
+
+def object_(suffix n)(expr s)=
+ (n.sc_(CLOV_("pos" &s))+CLOV_("offset" & s))
+enddef;
+
+def objectpoint_(suffix n)(expr s)=
+ (n+CLOV_("offset" & s))
+enddef;
+
+% This function is useful for matrices. It returns the object at
+% a given coordinate pair in a matrix. It is used by functions such
+% as |mcline|.
+def matpos(suffix $)(expr p)=
+ obj($sb[(xpart(p)-1)*$ny+ypart(p)])
+enddef;
+
+let mpos=matpos;
+
+% This function is useful for trees. It returns the object at
+% a given rank in a tree.
+def treepos(suffix $)(expr n)=
+ obj(obj($subt).sb[n])
+enddef;
+
+let tpos=treepos;
+
+% |ntreepos| is a shorthand for embedded |treepos| calls
+vardef ntreepos_(suffix O)(text l)=
+ save list,first,result;string list,result;
+ hide(
+ first=0;list="";
+ forsuffixes $=l:
+ if first=0: first:=$;
+ else:
+ if list="":list:=str $;
+ else:
+ list:=list & "," & str $;
+ fi;
+ fi;
+ endfor;
+ if list="":
+ result="treepos(" & str O & ")(" & decimal(first) & ")";
+ else:
+ result="ntreepos(treepos(" & str O & ")(" & decimal(first) &
+ "))(" & list & ")";
+ fi;
+ )
+ result
+enddef;
+
+% we can't use a |vardef| where a suffix appears, so we split
+% the |ntreepos| function in two parts.
+def ntreepos(suffix O)(text l)=
+ scantokens(ntreepos_(O)(l))
+enddef;
+
+def treeroot(suffix $)(text l)=
+ if isTree(ntreepos($)(l)):
+ obj(ntreepos($)(l)root)
+ else:
+ ntreepos($)(l)
+ fi
+enddef;
+
+def setupobjectfunction(suffix n)=
+ save f;
+ if numeric n:
+ let f=object_;
+ else:
+ let f=objectpoint_;
+ fi;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs)
+vardef nccurve@#(text n)(text m) text options =
+ ncshort_@#("nc","nccurve")(n)(m)(options);
+enddef;
+
+% ``reverse'' |nccurve|
+vardef rnccurve@#(text n)(text m) text options =
+ ncshort_@#("nc","nccurve")(m)(n)(options);
+enddef;
+
+vardef nccurve_(suffix $)(suffix n,m)(suffix p)=
+ if n=m: % case added Nov. 10, 2006
+ nc_core_$(n)(p)
+ (object_(n)("A"){dir(o_angleA_val)}
+ ..{dir(180+o_angleB_val)-dir(o_angleA_val)}
+ (object_(n)("A")+CLOV_("curvemax")*1cm
+ *dir(.5[o_angleA_val,180+o_angleB_val]))
+ ..{dir(o_angleB_val)}object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))
+ (objectpoint_(n)("A"){dir(o_angleA_val)}
+ ..{dir(180+o_angleB_val)-dir(o_angleA_val)}
+ (object_(n)("A")+CLOV_("curvemax")*1cm
+ *dir(.5[o_angleA_val,180+o_angleB_val]))
+ ..{dir(o_angleB_val)}objectpoint_(m)("B"));
+ else:
+ nc_core_$(n)(p)
+ (object_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))
+ (objectpoint_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}objectpoint_(m)("B"));
+ fi;
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mccurve@#(expr ai,aj,bi,bj) text options=
+ nccurve@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tccurve@#(text ai)(text bi) text options=
+ nccurve@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs)
+vardef ncline@#(text n)(text m) text options =
+ ncshort_@#("nc","ncline")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncline|
+vardef rncline@#(text n)(text m) text options =
+ ncshort_@#("nc","ncline")(m)(n)(options);
+enddef;
+
+vardef ncline_(suffix $)(suffix n,m)(suffix p)=
+ nc_core_$(n)(p)
+ (object_(n)("A")..object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))
+ (objectpoint_(n)("A")..objectpoint_(m)("B"));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcline@#(expr ai,aj,bi,bj) text options=
+ ncline@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcline@#(text ai)(text bi) text options=
+ ncline@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs)
+vardef ncarc@#(text n)(text m) text options =
+ ncshort_@#("nc","ncarc")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncarc|
+vardef rncarc@#(text n)(text m) text options =
+ ncshort_@#("nc","ncarc")(m)(n)(options);
+enddef;
+
+vardef ncarc_(suffix $)(suffix n,m)(suffix p)=
+ nc_core_$(n)(p)
+ (object_(n)("A"){dir(o_angleA_val+CLOV_("arcangleA"))}
+ ..{dir(o_angleB_val-CLOV_("arcangleB"))}object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))
+ (objectpoint_(n)("A"){dir(o_angleA_val+CLOV_("arcangleA"))}
+ ..{dir(o_angleB_val-CLOV_("arcangleB"))}objectpoint_(m)("B"));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcarc@#(expr ai,aj,bi,bj) text options=
+ ncarc@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcarc@#(text ai)(text bi) text options=
+ ncarc@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncangle@#(text n)(text m) text options =
+ ncshort_@#("nc","ncangle")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncangle|
+vardef rncangle@#(text n)(text m) text options =
+ ncshort_@#("nc","ncangle")(m)(n)(options);
+enddef;
+
+vardef ncangle_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find two additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap;pair ap[];
+ setupobjectfunction(n);
+ f(m)("B")-ap1=CLOV_("armB")*dir(CLOV_("angleB"));
+ ap2=f(n)("A")+whatever*dir(CLOV_("angleA"));
+ ap1=ap2+whatever*dir(CLOV_("angleA")+90);
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap2--ap1--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap2--ap1--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcangle@#(expr ai,aj,bi,bj) text options=
+ ncangle@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcangle@#(text ai)(text bi) text options=
+ ncangle@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncangles@#(text n)(text m) text options =
+ ncshort_@#("nc","ncangles")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncangles|
+vardef rncangles@#(text n)(text m) text options =
+ ncshort_@#("nc","ncangles")(m)(n)(options);
+enddef;
+
+vardef ncangles_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap;pair ap[];
+ setupobjectfunction(n);
+ ap1-f(n)("A")=CLOV_("armA")*dir(CLOV_("angleA"));
+ f(m)("B")-ap2=CLOV_("armB")*dir(CLOV_("angleB"));
+ ap3=ap1+whatever*dir(CLOV_("angleA")+90);
+ ap2=ap3+whatever*dir(CLOV_("angleA"));
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap1--ap3--ap2--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap1--ap3--ap2--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcangles@#(expr ai,aj,bi,bj) text options=
+ ncangles@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcangles@#(text ai)(text bi) text options=
+ ncangles@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncdiag@#(text n)(text m) text options =
+ ncshort_@#("nc","ncdiag")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncdiag|
+vardef rncdiag@#(text n)(text m) text options =
+ ncshort_@#("nc","ncdiag")(m)(n)(options);
+enddef;
+
+vardef ncdiag_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find two additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap;pair ap[];
+ setupobjectfunction(n);
+ ap1-f(n)("A")=CLOV_("armA")*dir(CLOV_("angleA"));
+ f(m)("B")-ap2=CLOV_("armB")*dir(CLOV_("angleB"));
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap1--ap2--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap1--ap2--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcdiag@#(expr ai,aj,bi,bj) text options=
+ ncdiag@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcdiag@#(text ai)(text bi) text options=
+ ncdiag@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncdiagg@#(text n)(text m) text options =
+ ncshort_@#("nc","ncdiagg")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncdiagg|
+vardef rncdiagg@#(text n)(text m) text options =
+ ncshort_@#("nc","ncdiagg")(m)(n)(options);
+enddef;
+
+vardef ncdiagg_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find an additional point; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap;pair ap;
+ setupobjectfunction(n);
+ ap-f(n)("A")=CLOV_("armA")*dir(CLOV_("angleA"));
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcdiagg@#(expr ai,aj,bi,bj) text options=
+ ncdiagg@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcdiagg@#(text ai)(text bi) text options=
+ ncdiagg@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncbar@#(text n)(text m) text options =
+ ncshort_@#("nc","ncbar")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncbar|
+vardef rncbar@#(text n)(text m) text options =
+ ncshort_@#("nc","ncbar")(m)(n)(options);
+enddef;
+
+vardef ncbar_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap,posap;pair ap[];numeric posap;
+ setupobjectfunction(n);
+ % we use different arms, but the same angles (see PSTricks documentation):
+ ap1-f(n)("A")=CLOV_("armA")*dir(CLOV_("angleA"));
+ ap2-f(m)("B")=CLOV_("armB")*dir(CLOV_("angleA"));
+ ap3=posap[f(n)("A"),ap1]=whatever[ap2,ap2+(ap2-f(m)("B")) rotated 90];
+ ap4=whatever[f(m)("B"),ap2]=whatever[ap1,ap1+(ap1-f(n)("A")) rotated 90];
+ if posap<1:
+ ap5=ap1;ap6=ap4;
+ else:
+ ap5=ap3;ap6=ap2;
+ fi;
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap5--ap6--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap5--ap6--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcbar@#(expr ai,aj,bi,bj) text options=
+ ncbar@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcbar@#(text ai)(text bi) text options=
+ ncbar@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncloop@#(text n)(text m) text options =
+ ncshort_@#("nc","ncloop")(n)(m)(options);
+enddef;
+
+% ``reverse'' |ncloop|
+vardef rncloop@#(text n)(text m) text options =
+ ncshort_@#("nc","ncloop")(m)(n)(options);
+enddef;
+
+vardef ncloop_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find additionnal points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap,posap;pair ap[];numeric posap;
+ setupobjectfunction(n);
+ ap1-f(n)("A")=CLOV_("armA")*dir(CLOV_("angleA"));
+ f(m)("B")-ap2=CLOV_("armB")*dir(CLOV_("angleB"));
+ ap3-ap1=CLOV_("loopsize")*unitvector((ap1-f(n)("A")) rotated 90);
+ ap4=whatever[ap3,ap3+(ap2-f(m)("B"))]
+ =whatever[ap2,ap2+(ap2-f(m)("B")) rotated 90];
+ nc_core_$(n)(p)
+ (smoothen(object_(n)("A")--ap1--ap3--ap4--ap2--object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m))(CLOV_("linearc")))
+ (smoothen(objectpoint_(n)("A")--ap1--ap3--ap4--ap2--objectpoint_(m)("B"))
+ (CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcloop@#(expr ai,aj,bi,bj) text options=
+ ncloop@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcloop@#(text ai)(text bi) text options=
+ ncloop@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |firstpart| returns the time elapsed between the beginning of |p|
+% and the point where the distance to the origin (on |p|) is |d|
+
+def firstpart_(expr d,p)=
+ arctime_(d/arclength(p),p)
+enddef;
+
+% Cut a path |p| in pieces of approximate arclength |d|
+% (this is actually a macro I wrote in April 1995)
+vardef divide_equally_(expr p,d)=
+ save a,q,v;
+ numeric a;
+ path q,v;
+ hide(
+ v=p;
+ q=point 0 of v;
+ forever:
+ a:=firstpart_(d,v);
+ q:=q{direction 0 of v}..{direction a of v}(point a of v);
+ exitif abs(a-length(v))<.1mm;
+ v:=subpath(a,length(v)) of v;
+ endfor;
+ )
+ q
+enddef;
+
+vardef zigzagit__(expr p)=
+ save n,q,r,zz;path q,r;pair zz[];
+ hide(
+ n=floor(arclength(p)/(CLOV_("coilwidth")*CLOV_("coilheight"))+0.5);
+ % we now divide |p| in |n| pieces
+ q=divide_equally_(p,arclength(p)/n);
+ % here, we must now introduce additional points
+ for i:=0 upto length(q)-1:
+ zz[i*3]=point i of q;
+ zz[i*3+1]=.25[point i of q,point (i+1) of q]
+ +CLOV_("coilwidth")/2
+ *(unitvector((point (i+1) of q)-(point i of q)) rotated 90);
+ zz[i*3+2]=.75[point i of q,point (i+1) of q]
+ +CLOV_("coilwidth")/2
+ *(unitvector(point (i+1) of q-point i of q) rotated -90);
+ endfor;
+ zz[length(q)*3]=point (length(q)) of q;
+ % when joining the points, we must take care not to introduce
+ % additional angles, in case |p| was not a straight line
+ r=zz[0]--zz[1] for i:=1 upto length(q)-1: -- zz[3*i-1]--zz[3*i+1] endfor
+ --zz[3*(length(q)-1)+2]--zz[3*length(q)];
+ )
+ r
+enddef;
+
+% coil function
+def coilf_(expr q,i)=
+ (
+ if i>0:
+ (arcpoint (i/n,q)
+ +((.5CLOV_("coilwidth")
+ *(sind(frac(i)*360),
+ 2*newcoilheight*i
+ +cosd(frac(i)*360)*sind(CLOV_("coilaspect"))))
+ -(0,.5CLOV_("coilwidth")*sind(CLOV_("coilaspect"))+(i/n)*arclength(q)))
+ rotated (angle(arcdirection (i/n,q))-90)
+ )
+ else:
+ (arcpoint (0,q)
+ +((.5CLOV_("coilwidth")
+ *(0,sind(CLOV_("coilaspect"))))
+ -(0,.5CLOV_("coilwidth")*sind(CLOV_("coilaspect"))))
+ rotated (angle(arcdirection (0,q))-90)
+ )
+ fi
+ )
+enddef;
+
+vardef coilit__(expr p)=
+ save n,q,newcoilheight;path q;
+ hide(
+ n=round(arclength(p)/(CLOV_("coilheight")*CLOV_("coilwidth")));
+ % we slightly change the coilheight so that the coil
+ % turns an integer number of times
+ if n>0:
+ newcoilheight=arclength(p)/n/CLOV_("coilwidth");
+ fi;
+ q=coilf_(p,0)
+ for i:=1 upto n*(360/CLOV_("coilinc")):
+ ..coilf_(p,i*(CLOV_("coilinc")/360))
+ endfor;
+ )
+ q
+enddef;
+
+% This function takes two paths where the last point
+% of the first path is the first point of the second path;
+% it creates a path looking like |p--q|, but where the
+% common point is not duplicated.
+def combinepaths_(expr p,q)=
+ ((subpath(0,length(p)-1) of p)..
+ controls (postcontrol (length(p)-1) of p) and
+ (precontrol length(p) of p) ..q)
+enddef;
+
+vardef zigcoil_(expr type,p)=
+ save na,nb;
+ hide(
+ % first, we cut two ends at lengths |coilarmA| and |coilarmB|
+ na=firstpart_(CLOV_("coilarmA"),p);
+ nb=firstpart_(CLOV_("coilarmB"),reverse p);
+ )
+ % we merge three paths, but we take care that no double points are added;
+ % the double points would make it difficult to smooth the curve afterwards
+ combinepaths_(
+ combinepaths_(subpath (0,na) of p,
+ scantokens(type)(subpath (na,length(p)-nb) of p)),
+ subpath (length(p)-nb,length(p)) of p)
+enddef;
+
+vardef zigzagit(expr p)=
+ zigcoil_("zigzagit__",p)
+enddef;
+
+vardef coilit(expr p)=
+ zigcoil_("coilit__",p)
+enddef;
+
+def frac(expr i)=
+ (i-floor(i))
+enddef;
+
+% function giving the time with respect to arclength:
+% arctime_ 0 of p=beginning
+% arctime_ 1 of p=end
+%
+vardef arctime_(expr i,p)=
+ save t;
+ hide(
+ if i=0: t=0;
+ elseif i=1: t=length(p);
+ else:
+ save d,min,max;
+ d=i*arclength(p);
+ min=0;max=length(p);
+ forever:
+ t:=(min+max)/2;
+ if arclength(subpath(0,t) of p)<d:
+ min:=t;
+ else:
+ max:=t;
+ fi;
+ exitif arclength(subpath(min,max) of p)<.1mm;
+ endfor;
+ fi;
+ )
+ t
+enddef;
+
+def arcpoint(expr i,p)=
+ (point arctime_(i,p) of p)
+enddef;
+
+def arcdirection(expr i,p)=
+ (direction arctime_(i,p) of p)
+enddef;
+
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef nccoil@#(text n)(text m) text options =
+ ncshort_@#("nc","nccoil")(n)(m)(options);
+enddef;
+
+% ``reverse'' |nccoil|
+vardef rnccoil@#(text n)(text m) text options =
+ ncshort_@#("nc","nccoil")(m)(n)(options);
+enddef;
+
+vardef nccoil_(suffix $)(suffix n,m)(suffix p)=
+ setupobjectfunction(n);
+ nc_core_$(n)(p)
+ (coilit(object_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m)))
+ (coilit(objectpoint_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}objectpoint_(m)("B")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mccoil@#(expr ai,aj,bi,bj) text options=
+ nccoil@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tccoil@#(text ai)(text bi) text options=
+ nccoil@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef nczigzag@#(text n)(text m) text options =
+ ncshort_@#("nc","nczigzag")(n)(m)(options);
+enddef;
+
+% ``reverse'' |nczigzag|
+vardef rnczigzag@#(text n)(text m) text options =
+ ncshort_@#("nc","nczigzag")(m)(n)(options);
+enddef;
+
+vardef nczigzag_(suffix $)(suffix n,m)(suffix p)=
+ setupobjectfunction(n);
+ nc_core_$(n)(p)
+ (smoothen(zigzagit(object_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}object_(m)("B")
+ cutbefore BpathObj(n) cutafter BpathObj(m)))(CLOV_("linearc")))
+ (smoothen(zigzagit(objectpoint_(n)("A"){dir(o_angleA_val)}
+ ..tension CLOV_("linetensionA") and CLOV_("linetensionB")
+ ..{dir(o_angleB_val)}objectpoint_(m)("B")))(CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mczigzag@#(expr ai,aj,bi,bj) text options=
+ nczigzag@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tczigzag@#(text ai)(text bi) text options=
+ nczigzag@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncbox@#(text n)(text m) text options =
+ ncshort_@#("nc","ncbox")(n)(m)("arrows(draw)",options);
+enddef;
+
+% ``reverse'' |ncbox|
+vardef rncbox@#(text n)(text m) text options =
+ ncshort_@#("nc","ncbox")(m)(n)("arrows(draw)",options);
+enddef;
+
+% Compute the |boxheight| parameter
+def compute_boxh(expr boxs,boxh,boxd)=
+ if boxh>=0: boxh
+ elseif boxd>=0: (2*boxs-boxd) % boxsize is half the width,
+ % according to PSTricks' documentation
+ else: boxs
+ fi
+enddef;
+
+% Compute the |boxdepth| parameter
+def compute_boxd(expr boxs,boxh,boxd)=
+ if boxd>=0: boxd
+ elseif boxh>=0: (2*boxs-boxh) % boxsize is half the width,
+ % according to PSTricks' documentation
+ else: boxs
+ fi
+enddef;
+
+vardef ncbox_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap,boxh,boxd;pair ap[];
+ setupobjectfunction(n);
+ boxh=compute_boxh(CLOV_("boxsize"),CLOV_("boxheight"),CLOV_("boxdepth"));
+ boxd=compute_boxd(CLOV_("boxsize"),CLOV_("boxheight"),CLOV_("boxdepth"));
+ f(n)("A")-ap1=CLOV_("nodesepA")*unitvector(f(m)("B")-f(n)("A"));
+ ap5-ap1=boxh*unitvector(dir(90+angle(f(m)("B")-f(n)("A"))));
+ ap1-ap2=boxd*unitvector(dir(90+angle(f(m)("B")-f(n)("A"))));
+ ap4-ap3=ap5-ap2;
+ ap4-ap5=(CLOV_("nodesepA")
+ +CLOV_("nodesepB")
+ +arclength(f(n)("A")--f(m)("B")))*unitvector(f(m)("B")-f(n)("A"));
+ % we set nodesepA and nodesepB to 0 because they are used with another
+ % meaning in |addPath| (I am just following what PSTricks does.)
+ o_nodesepA_val:=0;
+ o_nodesepB_val:=0;
+ nc_core_double_$(n)(p)
+ (smoothen(ap1--ap2--ap3--ap4--ap5--ap1)(CLOV_("linearc")));
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcbox@#(expr ai,aj,bi,bj) text options=
+ ncbox@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcbox@#(text ai)(text bi) text options=
+ ncbox@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source subobject, |m| is the target.
+% We also distinguish the case when |n| and |m| are objects
+% and when they are points (numerics vs pairs).
+vardef ncarcbox@#(text n)(text m) text options =
+ ncshort_@#("nc","ncarcbox")(n)(m)("arrows(draw)",options);
+enddef;
+
+% ``reverse'' |ncarcbox|
+vardef rncarcbox@#(text n)(text m) text options =
+ ncshort_@#("nc","ncarcbox")(m)(n)("arrows(draw)",options);
+enddef;
+
+vardef ncarcbox_(suffix $)(suffix n,m)(suffix p)=
+ % we have to find additional points; we must be careful
+ % not to use assignments, because |n.c| and |m.c|
+ % may be floating:
+ save ap,boxh,boxd;pair ap[];
+ setupobjectfunction(n);
+ boxh=compute_boxh(CLOV_("boxsize"),CLOV_("boxheight"),CLOV_("boxdepth"));
+ boxd=compute_boxd(CLOV_("boxsize"),CLOV_("boxheight"),CLOV_("boxdepth"));
+ ap20=unitvector(dir(90+angle(f(m)("B")-f(n)("A"))+CLOV_("arcangleA")));
+ ap21=-ap24=ap20 rotated -90;
+ ap22=-ap25=ap21 rotated (-2*CLOV_("arcangleA"));
+ ap23=ap20 rotated (-2*CLOV_("arcangleA"));
+ ap1-f(n)("A")=boxh*ap20;
+ f(n)("A")-ap2=boxd*ap20;
+ ap5-f(m)("B")=boxh*ap23;
+ f(m)("B")-ap4=boxd*ap23;
+ ap1-ap11=ap2-ap12=ap21*CLOV_("nodesepA");
+ ap15-ap5=ap14-ap4=ap22*CLOV_("nodesepB");
+ if CLOV_("arcangleA")=0:
+ % normally, one would use |ncbox| instead of |ncarcbox| in this case,
+ % but we make sure it works anyway
+ ap6=.5[ap1,ap5];
+ ap3=.5[ap2,ap4];
+ else:
+ if abs(CLOV_("arcangleA"))=90:
+ ap0=.5[ap1,ap5];
+ else:
+ ap0=whatever[ap1,ap2]=whatever[ap5,ap4];
+ fi;
+ ap6-ap0=(ap1-ap0) rotated (.5*(angle(ap5-ap0)-angle(ap1-ap0)));
+ ap3-ap0=(ap2-ap0) rotated (.5*(angle(ap5-ap0)-angle(ap1-ap0)));
+ fi;
+ % we set nodesepA and nodesepB to 0 because they are used with another
+ % meaning in |addPath| (I am just following what PSTricks does.)
+ o_nodesepA_val:=0;
+ o_nodesepB_val:=0;
+ nc_core_double_$(n)(p)
+ (ap11{ap21}..ap1{ap21}..ap6..{ap22}ap5..ap15{ap22}..{ap25}ap14..
+ {ap25}ap4..ap3..{ap24}ap2{ap24}..{ap24}ap12..{ap21}ap11);
+enddef;
+
+% variant for matrices:
+% We connect two nodes of the matrix |@#|.
+% This cannot be used to connect nodes that are not in the same
+% matrix. It is simpler to name the nodes in order to achieve
+% trans-connections.
+vardef mcarcbox@#(expr ai,aj,bi,bj) text options=
+ ncarcbox@#(matpos(@#)((ai,aj)))(matpos(@#)((bi,bj))) options;
+enddef;
+
+% variant for trees:
+% We connect two nodes of the tree |@#|.
+% This cannot be used to connect nodes that are not in the same tree.
+% It is simpler to name the nodes in order to achieve trans-connections.
+vardef tcarcbox@#(text ai)(text bi) text options=
+ ncarcbox@#(treeroot(@#)(ai))(treeroot(@#)(bi)) options;
+enddef;
+
+% |@#| is the object to which a line is added
+% |n| is the source and target subobject
+% we could also distinguish the case when |n| is an object
+% and when it is a point (numerics vs pairs)
+vardef nccircle@#(text n) text options =
+ o_patharray("_upath_");
+ % The first parameter is not relevant since we have only local options
+ ExecuteOptions()(options);
+ if string n:
+ save tmp;string tmp;
+ tmp="(" & str @# & ")(" & nameToSuffixString_(n) & ")";
+ sc_("nccircle_" & tmp)(patharray_suffix_);
+ else:
+ nccircle_(@#)(n)(patharray_suffix_);
+ fi;
+enddef;
+
+% |n| is either an object (if numeric) or a point (if it is a pair)
+vardef nccircle_(suffix $)(suffix n)(suffix p)=
+ if str $<>"":
+ if unknown $p.n_:
+ addPathVariables$(p);
+ fi;
+ fi;
+ settodefaultifnotknown_("angleA")(numeric)(0);
+ settodefaultifnotknown_("linewidth")(numeric)(curve_linewidth_default);
+ settodefaultifnotknown_("nodesepA")(numeric)(0);
+ settodefaultifnotknown_("nodesepB")(numeric)(0);
+ if str $ <>"":
+ $p.n_:=$p.n_+1;
+ $p._draw_[$p.n_]:=LocalOptionValue("cdraw","cdraw_default");
+ $p.name[$p.n_]:=LocalOptionValue("name","");
+ $p._connect_[$p.n_]:="nccircle";
+ $p.arrows[$p.n_]:=CLOV_("arrows");
+ $p.visible[$p.n_]:=CLOV_("visible");
+ $p.pathfilled[$p.n_]:=false;
+ $p.pathfillcolor[$p.n_]:=black;
+ $p.angleA[$p.n_]:=o_angleA_val;
+ $p.angleB[$p.n_]:=o_angleB_val;
+ $p.linewidth[$p.n_]:=o_linewidth_val;
+ $p.nodesepA[$p.n_]:=o_nodesepA_val;
+ $p.nodesepB[$p.n_]:=o_nodesepB_val;
+ nc_inc_$(p);
+ fi;
+
+ % we have to find one additional point; we must be careful
+ % not to use assignments, because |n.c| may be floating:
+ save ap;pair ap;
+ if numeric n:
+ ap=n.c+2cm*dir(90+o_angleA_val); % 2cm should be a parameter
+ else:
+ ap=n+2cm*dir(90+o_angleA_val); % 2cm should be a parameter
+ fi;
+ nc_core_$(n)(p)
+ (n.c{dir(o_angleA_val)}..ap..n.c
+ cutbefore BpathObj(n) cutafter BpathObj(n))
+ (n{dir(o_angleA_val)}..ap..n);
+enddef;
+
+% variant for matrices:
+vardef mccircle@#(expr ai,aj) text options=
+ nccircle@#(matpos(@#)((ai,aj))) options;
+enddef;
+
+%====================================================================
+% Labels
+
+% Labels are pictures. We use an internal array |ipic_| in order
+% to store the labels that are not the standard labels (such
+% as the contents of a circle, etc.)
+
+% This should be common to all labels
+def objlabel_(suffix $)(expr p) text options =
+ ExecuteOptions($)(options);
+ if unknown $ipic_1:
+ ObjPictureArray(ipic_)(0);
+ ObjPointArray(ipic_.off_)(0);
+ ObjTransformArray(ipic_.transf_)(0);
+ ObjColorArray(ipic_.col_)(0);
+ ObjBooleanArray(ipic_.erase_)(0);
+ fi;
+ $ipic_.n_:=$ipic_.n_+1;
+ % we give default values to the options, in case they don't have any
+ settodefaultifnotknown_("labrotate")(numeric)(0);
+ settodefaultifnotknown_("labpos")(numeric)(0.5);
+ settodefaultifnotknown_("labcolor")(color)(black);
+ settodefaultifnotknown_("labpoint")(string)("ic");
+ settodefaultifnotknown_("laberase")(boolean)(false);
+ % picture:
+ $ipic_[$ipic_.n_]=p;
+ $ipic_[$ipic_.n_]:=$ipic_[$ipic_.n_]
+ shifted -.5[urcorner(p),llcorner(p)] rotated o_labrotate_val;
+ % transformation
+ $ipic_.transf_.n_:=$ipic_.transf_.n_+1;
+ $ipic_.transf_[$ipic_.transf_.n_]=identity;
+ % we also store the color:
+ $ipic_.col_.n_:=$ipic_.col_.n_+1;
+ $ipic_.col_[$ipic_.col_.n_]=o_labcolor_val;
+ $ipic_.erase_.n_:=$ipic_.erase_.n_+1;
+ $ipic_.erase_[$ipic_.erase_.n_]=o_laberase_val;
+enddef;
+
+% This is used in |ObjLabel|
+% the shift uses values defined in |plain.mp|
+% (labeloffset, laboff, etc.); see the code for |thelabel|.
+def labshift_(suffix $)=
+ (2 % 2 instead of 1 in the original code
+ *labeloffset*laboff.sc_(o_labdir_val)
+ -
+ (labxf.sc_(o_labdir_val)*(lrcorner $ipic_[$ipic_.off_.n_])
+ + labyf.sc_(o_labdir_val)*(ulcorner $ipic_[$ipic_.off_.n_])
+ + (1-labxf.sc_(o_labdir_val)-labyf.sc_(o_labdir_val))
+ *(llcorner $ipic_[$ipic_.off_.n_])
+ )
+ )
+enddef;
+
+% variant for curve labels:
+def clabshift_=
+ (2 % 2 instead of 1 in the original code
+ *labeloffset*laboff.sc_(o_labdir_val)
+ -
+ (labxf.sc_(o_labdir_val)*(lrcorner o_labpic_val)
+ + labyf.sc_(o_labdir_val)*(ulcorner o_labpic_val)
+ + (1-labxf.sc_(o_labdir_val)-labyf.sc_(o_labdir_val))
+ *(llcorner o_labpic_val)
+ )
+ )
+enddef;
+
+% not used
+def opposite_(expr c)=
+ if c="n": "s"
+ elseif c="s": "n"
+ elseif c="e": "w"
+ elseif c="w": "e"
+ elseif c="ne": "sw"
+ elseif c="nw": "se"
+ elseif c="sw": "ne"
+ else: "nw"
+ fi
+enddef;
+
+%
+def cardtodir_(expr c)=
+ if c="n": "top"
+ elseif c="s": "bot"
+ elseif c="e": "rt"
+ elseif c="w": "lft"
+ elseif c="ne": "urt"
+ elseif c="nw": "ulft"
+ elseif c="sw": "llft"
+ else: "lrt"
+ fi
+enddef;
+
+% This adds the picture |p| on point |a| of object |@#|.
+% Two options are recognized: |labshift| and |labrotate|.
+vardef ObjLabel@#(expr p) text options =
+ objlabel_(@#)(p) options;
+ % offset:
+ addPointToPointArray@#(ipic_.off_);
+ save tmpoff;pair tmpoff;
+ if unknown o_labpathname_val and unknown o_labpathid_val:
+ if unknown o_labcard_val:
+ settodefaultifnotknown_("labshift")(pair)((0,0));
+ tmpoff=@#sc_(o_labpoint_val)+o_labshift_val;
+ else:
+ % The |labcard| option is handled like the |labdir| option,
+ % but from the |labcard| point of the object. For instance,
+ % |labcard(s)| will be handled like a |labdir(bot)| on point |s|
+ % of the object. We use |cardtodir_| to transform a cardinal point
+ % into a direction.
+ settodefaultifnotknown_("labdir")(string)(cardtodir_(o_labcard_val));
+ tmpoff=@#sc_(o_labcard_val);
+ fi;
+ else:
+ settodefaultifnotknown_("labshift")(pair)((0,0)); % added June 1, 2004
+ tmpoff=objpathlabel_(@#)+@#c+o_labshift_val; % o_labshift_val added June 1, 2004
+ % and @#c on May 1, 2006
+ if known o_labangle_val:
+ @#ipic_[@#ipic_.n_]:=@#ipic_[@#ipic_.n_] rotated o_labangle_val;
+ fi;
+ fi;
+ if known o_labdir_val:
+ @#ipic_.off_[@#ipic_.off_.n_]=tmpoff+labshift_(@#)*CLOV_("labdist");
+ else:
+ @#ipic_.off_[@#ipic_.off_.n_]=tmpoff;
+ fi;
+enddef;
+
+% This function places a label at a place
+% that is the value of the expression |t|.
+vardef ObjComputedLabel@#(expr p)(text t) text options =
+ objlabel_(@#)(p) options;
+ % offset:
+ addPointToPointArray@#(ipic_.off_);
+ @#ipic_.off_[@#ipic_.off_.n_]=t;
+enddef;
+
+% |pathid| is a path index in the standard or user path arrays.
+% We distinguish the two cases with the sign of |pathid|.
+% The |labpos| option will be the parameter of the path.
+vardef objpathlabel_(suffix $)=
+ save pathn,tmpoff;numeric pathn;pair tmpoff;
+ hide(
+ if known o_labpathid_val: pathn=o_labpathid_val;
+ else:
+ % we search in the path arrays for a path of that name;
+ % this will give us its index:
+ forsuffixes $$=_upath_,_spath_:
+ if known $.$$n_:
+ for i:=1 upto $.$$n_:
+ if $.$$name[i]=o_labpathname_val:
+ if str $$="_upath_":
+ pathn=-i;
+ else:
+ pathn=i;
+ fi;
+ fi;
+ exitif $.$$name[i]=o_labpathname_val;
+ endfor;
+ fi;
+ endfor;
+ fi;
+ save untied;boolean untied;untied=true;
+ if known $c:untied:=false;
+ save obj_pos;pair obj_pos;
+ obj_pos=$c;
+ untieObj($);
+ fi;
+ % we temporarily retie the object to the origin if necessary
+ % (before Oct. 3, 2006, this was only done when the object
+ % was not tied, but it produced wrong results when
+ % the center of the object was not the origin)
+ $c=origin;
+ if pathn>0:
+ tmpoff=point (o_labpos_val*length(Path$(_spath_,pathn)))
+ of Path$(_spath_,pathn);
+ if known o_labangle_val:
+ o_labangle_val:=o_labangle_val
+ +angle(direction (o_labpos_val*length(Path$(_spath_,pathn)))
+ of Path$(_spath_,pathn));
+ fi;
+ else:
+ tmpoff=point (o_labpos_val*length(Path$(_upath_,-pathn)))
+ of Path$(_upath_,-pathn);
+ if known o_labangle_val:
+ o_labangle_val:=o_labangle_val
+ +angle(direction (o_labpos_val*length(Path$(_upath_,-pathn)))
+ of Path$(_upath_,-pathn));
+ fi;
+ fi;
+ % if the object was initially untied, we untie it
+ if untied:untieObj($);
+ else: % retie it correctly:
+ untieObj($);
+ $c=obj_pos;
+ fi;
+ ) tmpoff
+enddef;
+
+% Draw the non-standard labels of object |@#|:
+vardef drawLabels@#=
+ if known @#ipic_.n_:
+ for i:=1 upto @#ipic_.n_:
+ if @#ipic_.erase_[i]:
+ unfill bbox(@#ipic_[i] transformed @#ipic_.transf_[i]
+ shifted @#ipic_.off_[i]);
+ fi;
+ draw @#ipic_[i] transformed @#ipic_.transf_[i] shifted @#ipic_.off_[i]
+ withcolor @#ipic_.col_[i];
+ endfor;
+ fi;
+enddef;
+
+%====================================================================
+% Line styles
+
+% This is adapted from the definition of |double| in |feynmp.mp|:
+def draw_double(expr p)(expr sep)(expr lwidth) text s =
+ save oldpen;
+ pen oldpen;
+ oldpen := currentpen;
+ pickup pencircle scaled (2lwidth+sep);
+ % we use |cutdraw|, otherwise the ends are closed because
+ % |undraw| will only remove some inner part
+ cutdraw(p) s;
+ pickup pencircle scaled sep;
+ undraw p;
+ pickup oldpen;
+enddef;
+
+def drawarrow_double(expr p)(expr sep)(expr lwidth) text s =
+ save oldpen;
+ pen oldpen;
+ oldpen := currentpen;
+ pickup pencircle scaled (2lwidth+sep);
+ drawarrow(p) s;
+ pickup pencircle scaled sep;
+ undraw p;
+ pickup oldpen;
+enddef;
+
+def rdrawarrow_double(expr p)(expr sep)(expr lwidth) text s =
+ drawarrow_double(reverse p)(sep)(lwidth) s;
+enddef;
+
+%====================================================================
+% Trees
+
+% A tree can be thought of as a root and a (possibly empty) list of subtrees.
+% One could think of creating an object for the root and putting
+% subobjects for all subtrees. However, doing so is not a good thing,
+% because one has at the same place the shape of the root and
+% the links to subtrees. So, if one wants to change the shape of
+% the root (and possibly other nodes), one has either
+% - to make a copy of the function defining the object
+% and to change the shape (points, equations, paths), or
+% - to make a copy of another function defining the desired shape
+% and add what is relevant to subtrees
+% But, there is a better way: one can define a generic ``tree node''
+% object, having not only the usual subtrees as its subobjects,
+% but also the root. Then, changing the shape of the root becomes
+% independent of the rest of tree (assuming the interface conventions
+% are respected, of course). The tree node object can even be
+% parameterized more, for instance by a function deciding the layout
+% of the subtrees (packed or not, considering only the bounding box,
+% or looking inside, etc.)
+
+% Tree: Generic Trees
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+vardef newTree@#(suffix theroot)(text subtrees) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Tree");
+ StandardInterface;
+ save n,eq;numeric n;string eq;
+ n=0;
+ forsuffixes $:=subtrees:n:=n+1;endfor;
+ ObjNumeric nst;
+ setNumeric(nst)(n);
+ % The |_spath_| variables are for connections
+ % between the root and the subtrees
+ addPathVariables@#(_spath_);
+ SubObject(subt,obj(newobjstring_));
+ if Option@#("treemode","L"):
+ % We put the subtrees in an |VBox| object
+ % and we use this non-documented construction to pass an option,
+ % because we can't pass the option the usual way, at least not simply:
+ begingroup;
+ o_flip(OptionValue@#("treeflip"));
+ o_align(OptionValue@#("Lalign"));
+ o_vbsep(OptionValue@#("vbsep"));
+ o_elementsize(OptionValue@#("treenodevsize"));
+ newVBox.obj(@#subt)(subtrees);
+ endgroup;
+ elseif Option@#("treemode","R"):
+ % We put the subtrees in an |VBox| object:
+ begingroup;
+ o_flip(OptionValue@#("treeflip"));
+ o_align(OptionValue@#("Ralign"));
+ o_vbsep(OptionValue@#("vbsep"));
+ o_elementsize(OptionValue@#("treenodevsize"));
+ newVBox.obj(@#subt)(subtrees);
+ endgroup;
+ elseif Option@#("treemode","U"):
+ % We put the subtrees in an |HBox| object:
+ begingroup;
+ o_flip(OptionValue@#("treeflip"));
+ o_align(OptionValue@#("Ualign"));
+ o_hbsep(OptionValue@#("hbsep"));
+ o_elementsize(OptionValue@#("treenodehsize"));
+ newHBox.obj(@#subt)(subtrees);
+ endgroup;
+ else: % default case
+ % We put the subtrees in an |HBox| object:
+ begingroup;
+ o_flip(OptionValue@#("treeflip"));
+ o_align(OptionValue@#("Dalign"));
+ o_hbsep(OptionValue@#("hbsep"));
+ o_elementsize(OptionValue@#("treenodehsize"));
+ newHBox.obj(@#subt)(subtrees);
+ endgroup;
+ fi;
+
+ % The root is also a subobject:
+ SubObject(root,theroot);
+ % we now build the equations:
+ % CURRENTLY, WE ASSUME THAT THE SUBTREES ARE LARGER THAN THE ROOT,
+ % BUT IT SHOULD BE MADE MORE GENERAL
+ % (right now, nothing here depends on the width of the root)
+ % (the tree can still be built, but it can happen that the root
+ % protrudes)
+ % 1 horizontal equation: the root is in the middle of the tree
+ % |xpart(root.c)=xpart(subt.c)|
+ % 2 horizontal equation: horizontal space at the edges
+ % |xpart(subt.w-@#w)=xpart(@#e-subt.e)=0mm;|
+ % 3 vertical equation: vertical distance between root and subtrees
+ % |ypart(root.s-subt.n)=1cm;|
+ % 4 vertical equation: vertical space at the top
+ % |ypart(@#n-root.n)=0mm;|
+ % 5 vertical equation: vertical space at the bottom
+ % |ypart(subt.s-@#s)=0mm;|
+ if Option@#("treemode","L") or Option@#("treemode","R"):
+ % 1: |ypart(root.c)=ypart(subt.c)|
+ eq:="ypart(obj(@#root).c)=ypart(obj(@#subt).c);";
+ % 2: |ypart(subt.s-@#s)=ypart(@#n-subt.n)=5mm;|
+ eq:=eq & "ypart(obj(@#subt).s-@#s)=ypart(@#n-obj(@#subt).n)=" &
+ decimal (OptionValue@#("dy")) & ";";
+ if Option@#("treemode","L"):
+ % 3: |xpart(root.w-subt.e)=1cm;|
+ if OptionValue@#("treenodehsize")>0:
+ eq:=eq & "xpart(obj(@#root).e-obj(@#subt).e)=" &
+ decimal
+ (OptionValue@#("hsep")+OptionValue@#("treenodehsize")) & ";";
+ else:
+ eq:=eq & "xpart(obj(@#root).w-obj(@#subt).e)=" &
+ decimal (OptionValue@#("hsep")) & ";";
+ fi;
+ % 4: |xpart(@#e-root.e)=0mm;|
+ eq:=eq & "xpart(@#e-obj(@#root).e)=" &
+ decimal (OptionValue@#("dx")) & ";";
+ % 5: |xpart(subt.w-@#w)=0mm;|
+ eq:=eq & "xpart(obj(@#subt).w-@#w)=" &
+ decimal (OptionValue@#("dx")) & ";";
+ else: % R
+ % 3: |xpart(subt.w-root.e)=1cm;|
+ if OptionValue@#("treenodehsize")>0:
+ eq:=eq & "xpart(obj(@#subt).w-obj(@#root).w)=" &
+ decimal
+ (OptionValue@#("hsep")+OptionValue@#("treenodehsize")) & ";";
+ else:
+ eq:=eq & "xpart(obj(@#subt).w-obj(@#root).e)=" &
+ decimal (OptionValue@#("hsep")) & ";";
+ fi;
+ % 4: |xpart(root.w-@#w)=0mm;|
+ eq:=eq & "xpart(obj(@#root).w-@#w)=" &
+ decimal (OptionValue@#("dx")) & ";";
+ % 5: |xpart(@#e-subt.e)=0mm;|
+ eq:=eq & "xpart(@#e-obj(@#subt).e)=" &
+ decimal (OptionValue@#("dx")) & ";";
+ fi;
+ else: % includes default case
+ % 1: |xpart(root.c)=xpart(subt.c)|
+ eq:="xpart(obj(@#root).c)=xpart(obj(@#subt).c);";
+ % 2: |xpart(subt.w-@#w)=xpart(@#e-subt.e)=5mm;|
+ eq:=eq & "xpart(obj(@#subt).w-@#w)=xpart(@#e-obj(@#subt).e)=" &
+ decimal (OptionValue@#("dx")) & ";";
+ if Option@#("treemode","U"):
+ % 3: |ypart(subt.s-root.n)=1cm;|
+ if OptionValue@#("treenodevsize")>0:
+ eq:=eq & "ypart(obj(@#subt).s-obj(@#root).s)=" &
+ decimal
+ (OptionValue@#("vsep")+OptionValue@#("treenodevsize")) & ";";
+ else:
+ eq:=eq & "ypart(obj(@#subt).s-obj(@#root).n)=" &
+ decimal (OptionValue@#("vsep")) & ";";
+ fi;
+ % 4: |ypart(root.s-@#s)=0mm;|
+ eq:=eq & "ypart(obj(@#root).s-@#s)=" &
+ decimal (OptionValue@#("dy")) & ";";
+ % 5: |ypart(@#n-subt.n)=0mm;|
+ eq:=eq & "ypart(@#n-obj(@#subt).n)=" &
+ decimal (OptionValue@#("dy")) & ";";
+ else: % default case
+ % 3: |ypart(root.s-subt.n)=1cm;|
+ if OptionValue@#("treenodevsize")>0:
+ eq:=eq & "ypart(obj(@#root).n-obj(@#subt).n)=" &
+ decimal
+ (OptionValue@#("vsep")+OptionValue@#("treenodevsize")) & ";";
+ else:
+ eq:=eq & "ypart(obj(@#root).s-obj(@#subt).n)=" &
+ decimal (OptionValue@#("vsep")) & ";";
+ fi;
+ % 4: |ypart(@#n-root.n)=0mm;|
+ eq:=eq & "ypart(@#n-obj(@#root).n)=" &
+ decimal (OptionValue@#("dy")) & ";";
+ % 5: |ypart(subt.s-@#s)=0mm;|
+ eq:=eq & "ypart(obj(@#subt).s-@#s)=" &
+ decimal (OptionValue@#("dy")) & ";";
+
+ fi;
+ fi;
+
+ ObjCode StandardEquations,eq;
+% |"xpart(@#n)=xpart(@#s);ypart(@#ne)=ypart(@#nw);";|
+ StandardTies;
+
+ if OptionValue@#("hideleaves"):
+ hideTreeLeaves(@#);
+ fi;
+
+ memorizeConnections_@#(true);
+enddef;
+
+% |t| is the tree, |n| is the child number, |par| is the parameter
+% |val| is the new value
+def setTreeEdge(suffix t)(expr n)(suffix par)(expr val)=
+ t._spath_.par[n]:=val;
+enddef;
+
+% This function memorizes the connections between the root and the
+% subtrees; it is also used when a subtree is replaced by another one,
+% or when the number of subtrees changes.
+% The value of |fromoptions| determines
+% whether we take the connection information
+% from the options, or from a memorized structure
+vardef memorizeConnections_@#(expr fromoptions)=
+ % we memorize the connection paths:
+ for i:=1 upto @#nst:
+ % only connections to non empty boxes
+ if not isEmptyBox(obj(obj(@#subt).sb[i])):
+ if not(isHFan(Obj(TreeRootObj_(obj(obj(@#subt).sb[i]))))) and
+ not(isVFan(Obj(TreeRootObj_(obj(obj(@#subt).sb[i]))))):
+ % the next call will inherit the options of |Tree| that are
+ % relevant to the |edge| argument, such as |cdraw|:
+ if OptionValue@#("edge")<>"none":
+ if fromoptions:
+ sc_(connectionCommand_@#(i,true));
+ else:
+ % we use the |pp| variable which is defined in
+ % |replaceTreeElement.expl|:
+ sc_(connectionCommand_@#(i,false));
+ fi;
+ fi;
+ else:
+ ncfan@#(obj(@#root))(Obj(TreeRootObj_(obj(obj(@#subt).sb[i]))))(i);
+ fi;
+ fi;
+ endfor;
+enddef;
+
+% |n| is the fan object and |i| is the rank in the subtrees
+vardef fanconnection_@#(suffix root,n,a,b)(expr i)=
+ if OptionValue.n("pointedfan"):
+ addPath@#(_spath_,i,
+ smoothen(((.5[n.a,n.b]--root.ic) intersectionpoint BpathObj(root))
+ --n.a--.5[n.a,n.b],
+ OptionValue.n("fanlinearc"))
+ & smoothen(.5[n.a,n.b]--n.b--
+ ((.5[n.a,n.b]--root.ic) intersectionpoint BpathObj(root)),
+ OptionValue.n("fanlinearc")));
+ else:
+ addPath@#(_spath_,i,
+ smoothen(((n.a--root.ic) intersectionpoint BpathObj(root))--n.a
+ --.5[n.a,n.b],
+ OptionValue.n("fanlinearc"))
+ & smoothen(.5[n.a,n.b]--n.b--
+ ((n.b--root.ic) intersectionpoint BpathObj(root)),
+ OptionValue.n("fanlinearc")));
+ fi;
+ @#_spath_.n_:=@#_spath_.n_+1;
+ % the value |"fandraw"| allows us to detect that the memorized path
+ % corresponds to a fan
+ @#_spath_.arrows[@#_spath_.n_]:="fandraw";
+enddef;
+
+
+vardef ncfan@#(suffix n)(suffix m)(expr i)=
+ if isHFan(m):
+ fanconnection_@#(n,m,ie,iw)(i);
+ elseif isVFan(m):
+ fanconnection_@#(n,m,in,is)(i);
+ fi;
+enddef;
+
+% temporary
+def fandraw = draw enddef;
+
+% This function builds a complex connection command from options.
+% The result is a string.
+vardef connectionCommand_@#(expr i,fromoptions)=
+ save cmd;string cmd;
+ hide(
+ if fromoptions:
+ cmd=OptionValue@#("edge");
+ else:
+ cmd=pp._connect_[i];
+ fi;
+ cmd:=cmd & "." & str @# & "(obj(" &
+ str @# & ".root))(Obj(TreeRootObj_(obj(obj(" & str @# & ".subt).sb[" &
+ decimal i & "]))))" &
+ " " & quote("patharray(_spath_)")
+ optionCase_("angleA",i,fromoptions)(decimal)(@#)
+ optionCase_("angleB",i,fromoptions)(decimal)(@#)
+ optionCase_("arcangleA",i,fromoptions)(decimal)(@#)
+ optionCase_("arcangleB",i,fromoptions)(decimal)(@#)
+ optionCase_("linewidth",i,fromoptions)(decimal)(@#)
+ optionCase_("nodesepA",i,fromoptions)(decimal)(@#)
+ optionCase_("nodesepB",i,fromoptions)(decimal)(@#)
+ optionCase_("loopsize",i,fromoptions)(decimal)(@#)
+ optionCase_("boxsize",i,fromoptions)(decimal)(@#)
+ optionCase_("boxheight",i,fromoptions)(decimal)(@#)
+ optionCase_("boxdepth",i,fromoptions)(decimal)(@#)
+ optionCase_("visible",i,fromoptions)(booleantostring)(@#)
+ optionCase_("pathfilled",i,fromoptions)(booleantostring)(@#)
+ optionCase_("pathfillcolor",i,fromoptions)(colortostring)(@#)
+ optionCase_("linearc",i,fromoptions)(decimal)(@#)
+ optionCase_("linetensionA",i,fromoptions)(decimal)(@#)
+ optionCase_("linetensionB",i,fromoptions)(decimal)(@#)
+ optionCase_("coilarmA",i,fromoptions)(decimal)(@#)
+ optionCase_("coilarmB",i,fromoptions)(decimal)(@#)
+ optionCase_("coilheight",i,fromoptions)(decimal)(@#)
+ optionCase_("coilwidth",i,fromoptions)(decimal)(@#)
+ optionCase_("coilaspect",i,fromoptions)(decimal)(@#)
+ optionCase_("coilinc",i,fromoptions)(decimal)(@#)
+ optionCase_("posA",i,fromoptions)()(@#)
+ optionCase_("posB",i,fromoptions)()(@#)
+ optionCase_("armA",i,fromoptions)(decimal)(@#)
+ optionCase_("armB",i,fromoptions)(decimal)(@#)
+ optionCase_("offsetA",i,fromoptions)(pairtostring)(@#)
+ optionCase_("offsetB",i,fromoptions)(pairtostring)(@#)
+ optionCase_("name",i,fromoptions)()(@#)
+ optionCase_("linecolor",i,fromoptions)(colortostring)(@#)
+ optionCase_("border",i,fromoptions)(decimal)(@#)
+ optionCase_("bordercolor",i,fromoptions)(colortostring)(@#)
+ optionCase_("linestyle",i,fromoptions)()(@#)
+ optionCase_("doubleline",i,fromoptions)(booleantostring)(@#)
+ optionCase_("doublesep",i,fromoptions)(decimal)(@#)
+ optionCase_("arrows",i,fromoptions)()(@#);
+ )
+ cmd
+enddef;
+
+def pairtostring(expr p)=
+ "(" & decimal (xpart(p)) & "," & decimal(ypart(p)) & ")"
+enddef;
+
+def booleantostring(expr b)=
+ if b:"true" else: "false" fi
+enddef;
+
+def colortostring(expr p)=
+ "(" & decimal(redpart(p)) & "," & decimal(greenpart(p)) & "," &
+ decimal(bluepart(p)) & ")"
+enddef;
+
+def optionCase_(expr opname,i,fromoptions)(text type)(suffix $)=
+ if fromoptions:
+ if expandafter known sc_("o_" & opname & "_val"):
+ & "," & quote(opname &"(" & type (OptionValue$(opname)) & ")")
+ fi
+ else:
+ if known pp.sc_(opname)[i]:
+ & "," & quote(opname & "(" & type (pp.sc_(opname)[i]) & ")")
+ fi
+ fi
+enddef;
+
+streamline("Tree")("(expr theroot)(text subtrees)",
+ "suffixpar(theroot)suffixlist(subtrees)");
+
+% useful shortcuts:
+def T =newTree enddef;
+def _T =new_Tree enddef;
+def T_=new_Tree_ enddef;
+
+def BpathTree(suffix n)= StandardBpath(n) enddef;
+
+% This returns the internal number of the root object
+% In order to get the appropriate suffix, one should apply |Obj|
+% to the result.
+def TreeRootObj_(suffix sb)=
+ (if isBB(sb): TreeRootObj_(obj(sb.sub))
+ elseif isTree(sb): TreeRootObj_(obj(sb.root))
+ else: sb
+ fi
+ )
+enddef;
+
+% CHOOSE A BETTER NAME
+% This returns the center of the root object
+def TreeRoot_(suffix sb)=
+ Obj(TreeRootObj_(sb)).ic
+enddef;
+
+% This returns the bounding path of the root object
+def TreeRootPath_(suffix sb)=
+ BpathObj(Obj(TreeRootObj_(sb)))
+enddef;
+
+vardef drawTree(suffix n)=
+ save fanchildren;
+ boolean fanchildren;
+ fanchildren=false;
+ drawFramedOrFilledObject_(n);
+% pickup pencircle scaled 2pt;
+% draw n.nw--n.ne--n.se--n.sw--cycle withcolor red;
+% pickup pencircle scaled .4pt;
+ drawMemorizedPaths_(n);
+ drawObj(obj(n.subt));
+ % and draw connections (this should be parameterized too)
+ for i:=1 upto n.nst:
+ % only connections to non empty boxes:
+ if not isEmptyBox(obj(obj(n.subt).sb[i])):
+ if isHFan(Obj(TreeRootObj_(obj(obj(n.subt).sb[i])))) or
+ isVFan(Obj(TreeRootObj_(obj(obj(n.subt).sb[i])))):
+ fanchildren:=true;
+ drawfan_(n,Obj(TreeRootObj_(obj(obj(n.subt).sb[i]))))(i,false);
+ else:
+ % drawn by |drawMemorizedPaths_|
+ fi;
+ fi;
+ endfor;
+ % |unfill| is necessary to cut points of fans
+ if fanchildren:
+ unfill BpathObj(obj(n.root));
+ fi;
+ drawObj(obj(n.root));
+enddef;
+
+setObjectDefaultOption("Tree")("treemode")("D"); % default is top-down
+setObjectDefaultOption("Tree")("treeflip")(false);
+setObjectDefaultOption("Tree")("treenodehsize")(-1pt); % like PSTricks
+setObjectDefaultOption("Tree")("treenodevsize")(-1pt); % like PSTricks
+setObjectDefaultOption("Tree")("dx")(0mm); % left/right margins
+setObjectDefaultOption("Tree")("dy")(0mm); % top/down margins
+% internal horizontal separation between root and subtrees
+setObjectDefaultOption("Tree")("hsep")(1cm);
+% internal vertical separation between root and subtrees
+setObjectDefaultOption("Tree")("vsep")(1cm);
+% the next two options are passed to |newHBox| or |newVBox|
+% and concern the separation between subtrees:
+setObjectDefaultOption("Tree")("hbsep")(1cm);
+setObjectDefaultOption("Tree")("vbsep")(1cm);
+setObjectDefaultOption("Tree")("hideleaves")(false); % leaves are in the bb
+setObjectDefaultOption("Tree")("edge")("ncline");
+% we don't have a default for |cdraw|, which means |ncline|, |ncangle|, ...'s
+% default will be used
+setObjectDefaultOption("Tree")("framed")(false);
+setObjectDefaultOption("Tree")("filled")(false);
+setObjectDefaultOption("Tree")("fillcolor")(black);
+setObjectDefaultOption("Tree")("framewidth")(.5bp);
+setObjectDefaultOption("Tree")("framecolor")(black);
+setObjectDefaultOption("Tree")("framestyle")("");
+setObjectDefaultOption("Tree")("Dalign")("top");
+setObjectDefaultOption("Tree")("Ualign")("bot");
+setObjectDefaultOption("Tree")("Lalign")("right");
+setObjectDefaultOption("Tree")("Ralign")("left");
+setObjectDefaultOption("Tree")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Tree")("shadowcolor")(black);
+
+% Declaration of a few arrays.
+% This must be a |def| and not a |vardef|:
+def declare_pp_variables_=
+ save pp;
+ string pp._draw_[],pp._connect_[],pp.posA[],pp.posB[],pp.name[],
+ pp.linestyle[],pp.arrows[];
+ numeric pp.angleA[],pp.angleB[],pp.arcangleA[],pp.arcangleB[],
+ pp.linewidth[],pp.border[],pp.nodesepA[],pp.nodesepB[],
+ pp.loopsize[],pp.boxsize[],pp.boxheight[],pp.boxdepth[],
+ pp.linearc[],pp.linetensionA[],pp.linetensionB[],
+ pp.armA[],pp.armB[],pp.doublesep[],
+ pp.coilarmA[],pp.coilarmB[],pp.coilheight[],pp.coilwidth[],
+ pp.coilaspect[],pp.coilinc[],
+ pp.n_;
+ boolean pp.visible[],pp.doubleline[],pp.pathfilled[];
+ color pp.linecolor[],pp.bordercolor[],pp.pathfillcolor[];
+ pair pp.offsetA[],pp.offsetB[];
+enddef;
+
+vardef resetPathArray@#(suffix $$)=
+ % reset the user arrays:
+ if known @#.$$n_:
+ @#.$$n_:=0;
+ forsuffixes $:=pathoptions_:
+ @#.$$.$n_:=0;
+ endfor;
+ deletePaths@#($$);
+ fi;
+enddef;
+
+% This function either replaces a subtree or adds a subtree at the end
+% of the subtrees.
+% This function always resets the tree.
+vardef replaceTreeElement.expl@#(expr i)(suffix rep)=
+ resetObj.expl@#;
+
+ if isHBox(obj(@#subt)):
+ replaceHBoxElement.expl.obj(@#subt)(i)(rep);
+ else:
+ replaceVBoxElement.expl.obj(@#subt)(i)(rep);
+ fi;
+ if i=@#nst+1:
+ @#nst:=@#nst+1;
+ % extend the path parameters
+ % we use the same parameters as those for the last connection
+ if OptionValue@#("edge")<>"none":
+ @#_spath_.n_:=@#_spath_.n_+1;
+ forsuffixes $:=pathoptions_:
+ @#_spath_$[@#_spath_.n_]:=@#_spath_$[@#_spath_.n_-1];
+ endfor;
+ fi;
+ fi;
+
+ if OptionValue@#("edge")<>"none":
+ % memorize the path parameters in a local array:
+ declare_pp_variables_;
+ pp.n_=@#_spath_.n_;
+ for j:=1 upto pp.n_:
+ forsuffixes $:=pathoptions_:
+ pp$[j]=@#_spath_$[j];
+ endfor;
+ endfor;
+
+ % reset the standard arrays:
+ resetPathArray@#(_spath_);
+ fi;
+
+ % reset the user arrays:
+ resetPathArray@#(_upath_);
+
+ resetObj.expl@#;
+
+ % recreate the standard paths from the memorized information
+ memorizeConnections_@#(false);
+
+enddef;
+
+% This function deletes a subtree.
+% This function always resets the tree.
+vardef deleteTreeElement.expl@#(expr i)=
+ resetObj.expl@#;
+ if isHBox(obj(@#subt)):
+ deleteHBoxElement.expl.obj(@#subt)(i);
+ else:
+ deleteVBoxElement.expl.obj(@#subt)(i);
+ fi;
+ @#nst:=@#nst-1;
+
+ if OptionValue@#("edge")<>"none":
+ % memorize the path parameters in a local array:
+ declare_pp_variables_;
+ pp.n_=@#_spath_.n_-1;
+ % first part (before the removed element)
+ for j:=1 upto i-1:
+ forsuffixes $:=pathoptions_:
+ pp$[j]=@#_spath_$[j];
+ endfor;
+ endfor;
+
+ % second part (after the removed element)
+ for j:=i upto pp.n_:
+ forsuffixes $:=pathoptions_:
+ pp$[j]=@#_spath_$[j+1];
+ endfor;
+ endfor;
+
+ % reset the standard arrays:
+ resetPathArray@#(_spath_);
+ fi;
+
+ % reset the user arrays:
+ resetPathArray@#(_upath_);
+
+ resetObj.expl@#;
+
+ % recreate the standard paths from the memorized information
+ memorizeConnections_@#(false);
+
+enddef;
+
+% This function sets the bounding box of a tree to its root.
+% It will be more general later.
+def hideTreeLeaves(suffix $)=
+ % we have merely to give the right shifts as parameters of
+ % |rebindrelativeObj|:
+ rebindrelativeObj($)(ypart(obj($root).n-$n),ypart(obj($root).s-$s),
+ xpart(obj($root).e-$e),xpart(obj($root).w-$w));
+enddef;
+
+% streamlined version
+vardef hideTreeLeaves_(expr n)=
+ % we have merely to give the correct shifts as parameters of
+ % |rebindrelativeObj|:
+ rebindrelative_Obj(obj(iname_[n]))
+ (ypart(obj(obj(iname_[n]).root).n-obj(iname_[n]).n),
+ ypart(obj(obj(iname_[n]).root).s-obj(iname_[n]).s),
+ xpart(obj(obj(iname_[n]).root).e-obj(iname_[n]).e),
+ xpart(obj(obj(iname_[n]).root).w-obj(iname_[n]).w)
+ )
+enddef;
+
+%=====================================================================
+% A fan is an object normally only used in trees. It is directly
+% inspired of PSTricks' fans.
+% This object is actually very similar to a HRazor or VRazor.
+% It only behaves like a fan in a Tree context.
+
+vardef newHFan@#(expr dx,dy) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"HFan");
+ StandardInterface;
+ ObjCode StandardEquations,
+ "@#ise-@#isw=(" & decimal dx & ",0)",
+ "@#ine-@#ise=(0," & decimal dy & ")";
+enddef;
+
+streamline("HFan")("(expr dx,dy)","(dx,dy)");
+
+% won't be used
+def BpathHFan(suffix n)=StandardBpath(n) enddef;
+
+% This is not used, but the parent calls |drawfan_|
+def drawHFan(suffix n)=
+ % empty, because the fan is drawn by the parent
+ %draw n.ise--n.isw;
+ drawMemorizedPaths_(n);
+enddef;
+
+% |forceedge| is a boolean that can override the option value |"edge"|
+def drawfan_(suffix n,fan)(expr i,forceedge)=
+ if (OptionValue.fan("edge")="yes") or forceedge:
+ if OptionValue.fan("filled"):
+ fill Path.n(_spath_,i)--cycle withcolor OptionValue.fan("fillcolor");
+ else:
+ if OptionValue.fan("fanlinestyle")<>"":
+ draw Path.n(_spath_,i)
+ scantokens(OptionValue.fan("fanlinestyle"))
+ withcolor OptionValue.fan("fillcolor");
+ else:
+ draw Path.n(_spath_,i) withcolor OptionValue.fan("fillcolor");
+ fi;
+ fi;
+ fi;
+enddef;
+
+vardef drawfan@#(suffix fan)(expr i)=
+ drawfan_(@#,fan)(i,true);
+enddef;
+
+setObjectDefaultOption("HFan")("filled")(false);
+setObjectDefaultOption("HFan")("edge")("yes");
+setObjectDefaultOption("HFan")("pointedfan")(true);
+setObjectDefaultOption("HFan")("fanlinestyle")("");
+setObjectDefaultOption("HFan")("fanlinearc")(0);
+setObjectDefaultOption("HFan")("fillcolor")(black);
+
+%=====================================================================
+
+vardef newVFan@#(expr dx,dy) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"VFan");
+ StandardInterface;
+ ObjCode StandardEquations,
+ "@#ise-@#isw=(" & decimal dx & ",0)",
+ "@#ine-@#ise=(0," & decimal dy & ")";
+enddef;
+
+streamline("VFan")("(expr dx,dy)","(dx,dy)");
+
+% won't be used
+def BpathVFan(suffix n)=StandardBpath(n) enddef;
+
+% This is not used, but the parent calls |drawfan_|
+def drawVFan(suffix n)=
+ % empty, because the fan is drawn by the parent
+ %draw n.ine--n.ise;
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("VFan")("filled")(false);
+setObjectDefaultOption("VFan")("edge")("yes");
+setObjectDefaultOption("VFan")("pointedfan")(true);
+setObjectDefaultOption("VFan")("fanlinestyle")("");
+setObjectDefaultOption("VFan")("fanlinearc")(0);
+setObjectDefaultOption("VFan")("fillcolor")(black);
+
+%-------------------------------------------------------------------------
+
+% PTree: Proof Trees
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+% |left| and |right| are the rule names (they are pictures)
+% |conclusion| is a picture too.
+% Even though this object seems simple, its code is quite complex
+% because we try to cover all special cases.
+% However, we assume that there is at least either a conclusion
+% or one subtree. Calling this function with no subtrees and
+% no conclusion will produce an error.
+vardef newPTree@#(expr conclusion)(text subtrees)(expr left,right)
+ text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"PTree");
+ % parameters that should be options:
+ save vdist,rdistl,rdistr,dist_n,dist_s,dist_e,dist_w;
+ % vertical distance between premisses and conclusion:
+ vdist=OptionValue@#("vsep");
+ % rule distance left
+ rdistl=OptionValue@#("lrsep");
+ % rule distance right
+ rdistr=OptionValue@#("rrsep");
+ % distances around the proof:
+ dist_n=dist_s=OptionValue@#("dy");
+ dist_e=dist_w=OptionValue@#("dx");
+ StandardInterface;
+ ObjPoint ledge,redge, % a |PTree| has two additionnal points that
+ % are useful for a fine positionning of the
+ % horizontal line (actually, we could do without them,
+ % by analyzing the structure of the tree, but this
+ % is a first attempt)
+ lstart,lend; % These are the points where the line starts and
+ % where it ends. These variables are not really
+ % necessary, but having them is convenient.
+ save n,i,eq,spl,spr;numeric n,i,spl,spr;string eq;
+ % we count the number of subtrees:
+ n=0;
+ forsuffixes $:=subtrees:
+ % we have to be careful because there is always at least one loop,
+ % even if |subtrees| is empty (because an empty suffix is a valid suffix):
+ if length(str $)>0:n:=n+1;fi;
+ endfor;
+ ObjNumeric nst;
+ % the number of subtrees is stored in the object
+ setNumeric(nst)(n);
+ i=0;
+ SubObject(subt,obj(newobjstring_));
+ if not numeric conclusion:
+ SubObject(conc,obj(newobjstring_));
+ fi;
+ if not numeric left:
+ SubObject(lr,obj(newobjstring_));
+ fi;
+ if not numeric right:
+ SubObject(rr,obj(newobjstring_));
+ fi;
+ % We put the subtrees in an HBox object except if there are no subtrees:
+ if n>0:
+ begingroup;
+ % we define options passed to |newHBox|
+ o_hbsep(OptionValue@#("hsep"));
+ if Option@#("treemode","U"):
+ o_align("top");
+ else:
+ o_align("bot");
+ fi;
+ newHBox.obj(@#subt)(subtrees);
+ endgroup;
+ else:
+ newEmptyBox.obj(@#subt)(0,0);
+ fi;
+ %
+ if string conclusion:if conclusion="": newEmptyBox.obj(@#conc)(0,0);
+ else:newBox.obj(@#conc)(conclusion) "framed(false)";fi;
+ elseif picture conclusion:newBox.obj(@#conc)(conclusion) "framed(false)";
+ else: % object
+ SubObject(conc,Obj(conclusion));
+ fi;
+ if string left:if left="": newEmptyBox.obj(@#lr)(0,0);
+ else:newBox.obj(@#lr)(left) "framed(false)";fi;
+ elseif picture left:newBox.obj(@#lr)(left) "framed(false)";
+ else: % object
+ SubObject(lr,Obj(left));
+ fi;
+ if string right:if right="": newEmptyBox.obj(@#rr)(0,0);
+ else:newBox.obj(@#rr)(right) "framed(false)";fi;
+ elseif picture right:newBox.obj(@#rr)(right) "framed(false)";
+ else: % object
+ SubObject(rr,Obj(right));
+ fi;
+ % We now build the equations: here are the equations for a top-down tree
+ % (the conclusion being under the subtrees)
+ % 1 horizontal equation: the conclusion is in the middle
+ % of the last line of the subtree
+ % |xpart(conc.c)=xpart(.5[subt.ledge,subt.redge])|
+ % 2 vertical equation: vertical distance between root and subtrees
+ % |ypart(subt.s-conc.n)=vdist;| % depends on option
+ % 3 vertical equation: vertical space at the top
+ % |ypart(@#n-subt.n)=dist_n;| % depends on option
+ % 4 vertical equation: vertical space at the bottom
+ % |ypart(conc.s-@#s)=dist_s;| % depends on option
+ % 5 Edges:
+ % |@#ledge=conc.sw;@#redge=conc.se;| % depends on option
+ % 6 Start and end of the line:
+ % |ypart(@#lstart)=ypart(@#lend)=.5[ypart(subt.s),ypart(conc.n)]|
+ % |xpart(@#lstart)=min(xpart(subt.ledge),xpart(conc.w))|
+ % |xpart(@#lend)=max(xpart(subt.redge),xpart(conc.e))|
+ % 7 horizontal space at right of subtree
+ % |max(xpart(@#lend)+wd(@#rr)+rdistr-xpart(subt.e),0)|
+ % 8 horizontal space at left of subtree
+ % |min(xpart(@#lstart)-wd(@#lr)-rdistl-xpart(subt.w),0)|
+ % 9 Attachment of the rules:
+ % |@#lstart-(rdistl,0)=@#lr.e|
+ % |@#lend=@#rr.w-(rdistr,0)|
+ %
+ % Left and right edges of the subtree are actually not defined,
+ % because it is an |HBox|. But even the components of the |HBox|
+ % may lack these features if we are at the top of the proof tree.
+ % So, what we do is that we compute the positions of the edges
+ % with respect to the |.s| point of the subtree.
+ save subledge,subredge;pair subledge,subredge;
+ if not isEmptyBox(obj(@#subt)):
+ if isPTree(obj(obj(@#subt).sb[1])):
+ subledge=obj(obj(@#subt).sb[1]).ledge-obj(@#subt).s;
+ else:
+ subledge=obj(obj(@#subt).sb[1]).sw-obj(@#subt).s;
+ fi;
+ if isPTree(obj(obj(@#subt).sb[@#nst])):
+ subredge=obj(obj(@#subt).sb[@#nst]).redge-obj(@#subt).s;
+ else:
+ subredge=obj(obj(@#subt).sb[@#nst]).se-obj(@#subt).s;
+ fi;
+ else: % if the subtree is empty, we use the edges of the conclusion
+ % with respect to the |.n| point of the conclusion
+ subledge=obj(@#conc).nw-obj(@#conc).n;
+ subredge=obj(@#conc).ne-obj(@#conc).n;
+ % see below how it is used when there are no subtrees
+ fi;
+ eq:="";
+ % 1 |xpart(conc.c)=xpart(.5[subt.ledge,subt.redge])|
+ % |=xpart(.5[subt.s+subledge,subt.s+subredge])|
+ % |=.5(xpart(subt.s)+xpart(subledge),xpart(subt.s)+xpart(subredge))|
+ % (if for some reason conc.ledge and conc.redge exist, we replace
+ % conc.c by .5[conc.ledge,conc.redge])
+ if (not isEmptyBox(obj(@#subt))) and (not isEmptyBox(obj(@#conc))):
+ eq:=eq & "xpart(";
+ if pair obj(@#conc).ledge and pair obj(@#conc).redge:
+ eq:=eq & ".5[obj(@#conc).ledge,obj(@#conc).redge]";
+ else:
+ eq:=eq & "obj(@#conc).c";
+ fi;
+ eq:=eq & ")=.5[xpart(obj(@#subt).s)" & (signeddecimal xpart(subledge)) &
+ ",xpart(obj(@#subt).s)" & (signeddecimal xpart(subredge)) & "];";
+ fi;
+ % 2 |ypart(subt.s-conc.n)=vdist;| % depends on options
+ if (not isEmptyBox(obj(@#subt))) and (not isEmptyBox(obj(@#conc))):
+ if Option@#("treemode","U"):
+ eq:=eq & "ypart(obj(@#conc).s-obj(@#subt).n)=" & decimal vdist & ";";
+ else:
+ eq:=eq & "ypart(obj(@#subt).s-obj(@#conc).n)=" & decimal vdist & ";";
+ fi;
+ fi;
+ % 3 |ypart(@#n-subt.n)=dist_n;| % depends on option
+ if Option@#("treemode","U"):
+ if (not isEmptyBox(obj(@#conc))):
+ eq:=eq & "ypart(@#n-obj(@#conc).n)=" & decimal dist_n & ";";
+ else:
+ eq:=eq & "ypart(@#n-obj(@#subt).n)=" & decimal (vdist/2) & ";";
+ fi;
+ else:
+ if (not isEmptyBox(obj(@#subt))):
+ eq:=eq & "ypart(@#n-obj(@#subt).n)=" & decimal dist_n & ";";
+ else:
+ eq:=eq & "ypart(@#n-obj(@#conc).n)=" & decimal (vdist/2) & ";";
+ fi;
+ fi;
+ % 4 |ypart(conc.s-@#s)=dist_s;| % depends on option
+ if Option@#("treemode","U"):
+ if (not isEmptyBox(obj(@#subt))):
+ eq:=eq & "ypart(obj(@#subt).s-@#s)=" & decimal dist_s & ";";
+ else:
+ eq:=eq & "ypart(obj(@#conc).s-@#s)=" & decimal (vdist/2) & ";";
+ fi;
+ else:
+ if (not isEmptyBox(obj(@#conc))):
+ eq:=eq & "ypart(obj(@#conc).s-@#s)=" & decimal dist_s & ";";
+ else:
+ eq:=eq & "ypart(obj(@#subt).s-@#s)=" & decimal (vdist/2) & ";";
+ fi;
+ fi;
+ % 5 |@#ledge=conc.sw;@#redge=conc.se;| % depends on option
+ if (not isEmptyBox(obj(@#conc))):
+ if Option@#("treemode","U"):
+ eq:=eq & "@#ledge=obj(@#conc).nw;@#redge=obj(@#conc).ne;";
+ else:
+ eq:=eq & "@#ledge=obj(@#conc).sw;@#redge=obj(@#conc).se;";
+ fi;
+ else:
+ % |@#ledge=@#lstart; @#redge=@#lend;|
+ eq:=eq & "@#ledge=@#lstart;@#redge=@#lend;";
+ fi;
+ % 6 Start and end of the line:
+ % |ypart(@#lstart)=ypart(@#lend)=ypart(conc.n)+vdist/2|
+ % |if xpart(subt.redge)-xpart(subt.ledge) > xpart(conc.e)-xpart(conc.w):|
+ % |xpart(@#lstart)=xpart(subt.ledge)|
+ % |xpart(@#lend)=xpart(subt.redge)|
+ % |else:|
+ % | xpart(@#lstart)=xpart(conc.w)|
+ % | xpart(@#lend)=xpart(conc.e)|
+ % |fi|
+ if Option@#("treemode","U"):
+ if not isEmptyBox(obj(@#conc)):
+ eq:=eq & "ypart(@#lstart)=ypart(@#lend)" &
+ "=ypart(obj(@#conc).s)-" & decimal (vdist/2) & ";";
+ else:
+ eq:=eq & "ypart(@#lstart)=ypart(@#lend)" &
+ "=ypart(obj(@#subt).n)+" & decimal (vdist/2) & ";";
+ fi;
+ else:
+ if not isEmptyBox(obj(@#conc)):
+ eq:=eq & "ypart(@#lstart)=ypart(@#lend)" &
+ "=ypart(obj(@#conc).n)+" & decimal (vdist/2) & ";";
+ else:
+ eq:=eq & "ypart(@#lstart)=ypart(@#lend)" &
+ "=ypart(obj(@#subt).s)-" & decimal (vdist/2) & ";";
+ fi;
+ fi;
+ if xpart(subredge)-xpart(subledge) >
+ (if pair obj(@#conc).ledge:
+ xpart(obj(@#conc).redge)-xpart(obj(@#conc).ledge)
+ else:
+ xpart(obj(@#conc).e)-xpart(obj(@#conc).w)
+ fi):
+ eq:=eq & "xpart(@#lstart)=xpart(obj(@#subt).c)" &
+ (signeddecimal xpart(subledge)) &
+ (signeddecimal(OptionValue@#("lstartdx"))) & ";";
+ eq:=eq & "xpart(@#lend)=xpart(obj(@#subt).c)" &
+ (signeddecimal xpart(subredge)) &
+ (signeddecimal(OptionValue@#("lenddx"))) & ";";
+ % 7 horizontal space at right of subtree
+ % |max(xpart(@#lend)+rdistr+wd(@#rr)-xpart(subt.e),0)|
+ % |= max(xpart(obj(@#subt).redge)+rdistr+wd(@#rr)-xpart(obj(@#subt).e),0)|
+ spr=xpart(obj(@#subt).s)+xpart(subredge)+rdistr
+ +xpart(obj(@#rr).e-obj(@#rr).w)-xpart(obj(@#subt).e);
+ if spr<0: spr:=0;fi;spr:=spr+dist_e;
+ % 8 horizontal space at left of subtree
+ % |min(xpart(@#lstart)-wd(@#lr)-rdistl-xpart(subt.w),0)|
+ % |= min(xpart(obj(@#subt).ledge)-wd(@#lr)-rdistl-xpart(obj(@#subt).w),0)|
+ spl=xpart(obj(@#subt).s)+xpart(subledge)
+ -xpart(obj(@#lr).e-obj(@#lr).w)-rdistl-xpart(obj(@#subt).w);
+ if spl>0:spl:=0;fi;spl:=spl-dist_w;
+ eq:=eq & "xpart(@#e)-xpart(obj(@#subt).e)=" & (signeddecimal spr) & ";";
+ eq:=eq & "xpart(obj(@#subt).w)-xpart(@#w)=" & (signeddecimal (-spl)) & ";";
+ else:
+ if pair obj(@#conc).ledge:
+ eq:=eq & "xpart(@#lstart)=xpart(obj(@#conc).ledge)" &
+ (signeddecimal(OptionValue@#("lstartdx"))) & ";";
+ eq:=eq & "xpart(@#lend)=xpart(obj(@#conc).redge)" &
+ (signeddecimal(OptionValue@#("lenddx"))) & ";";
+ else:
+ eq:=eq & "xpart(@#lstart)=xpart(obj(@#conc).w)" &
+ (signeddecimal(OptionValue@#("lstartdx"))) & ";";
+ eq:=eq & "xpart(@#lend)=xpart(obj(@#conc).e)" &
+ (signeddecimal(OptionValue@#("lenddx"))) & ";";
+ fi;
+ % 7 horizontal space at right of conclusion
+ % |max(xpart(@#lend)+rdistr+wd(@#rr)-xpart(conc.e),0)|
+ % |= max(rdistr+wd(@#rr),0)|
+ spr=rdistr+xpart(obj(@#rr).e-obj(@#rr).w);
+ if spr<0: spr:=0;fi;spr:=spr+dist_e;
+ % 8 horizontal space at left of conclusion
+ % |min(xpart(@#lstart)-wd(@#lr)-rdistl-xpart(conc.w),0)|
+ % |= min(-wd(@#lr)-rdistl,0)|
+ spl=-xpart(obj(@#lr).e-obj(@#lr).w)-rdistl;
+ if spl>0:spl:=0;fi;spl:=spl-dist_w;
+ if pair obj(@#conc).ledge:
+ eq:=eq & "xpart(@#e)-xpart(obj(@#conc).redge)=" &
+ (signeddecimal spr) & ";";
+ eq:=eq & "xpart(obj(@#conc).ledge)-xpart(@#w)=" &
+ (signeddecimal (-spl)) & ";";
+ else:
+ eq:=eq & "xpart(@#e)-xpart(obj(@#conc).e)=" &
+ (signeddecimal spr) & ";";
+ eq:=eq & "xpart(obj(@#conc).w)-xpart(@#w)=" &
+ (signeddecimal (-spl)) & ";";
+ fi;
+ fi;
+ %
+ % 9 Attachment of the rules:
+ % |@#lstart=@#lr.e|
+ % |@#lend=@#rr.w|
+ if not isEmptyBox(obj(@#lr)):
+ eq:=eq & "@#lstart-(rdistl,0)=obj(@#lr).e;";
+ fi;
+ if not isEmptyBox(obj(@#rr)):
+ eq:=eq & "@#lend=obj(@#rr).w-(rdistr,0);";
+ fi;
+ ObjCode StandardEquations,eq;
+% |"xpart(@#n)=xpart(@#s);ypart(@#ne)=ypart(@#nw);";|
+ StandardTies;
+enddef;
+
+streamline("PTree")("(expr conclusion)(text subtrees)(expr left,right)",
+ "suffixpar(conclusion)suffixlist(subtrees)(left,right)");
+
+def BpathPTree(suffix n)= StandardBpath(n) enddef;
+
+% CHOOSE A BETTER NAME
+def PTreeRoot_(suffix sb)=
+ (if isBB(sb): PTreeRoot_(obj(sb.sub))
+ elseif isPTree(sb): PTreeRoot_(obj(sb.root))
+ else: sb.ic
+ fi
+ )
+enddef;
+
+def PTreeRootPath_(suffix sb)=
+ (if isBB(sb): PTreeRootPath_(obj(sb.sub))
+ elseif isPTree(sb): PTreeRootPath_(obj(sb.root))
+ else: BpathObj(sb)
+ fi
+ )
+enddef;
+
+def drawPTree(suffix n)=
+ drawFramedOrFilledObject_(n);
+ if not isEmptyBox(obj(n.conc)): drawObj(obj(n.conc)); fi;
+ if not isEmptyBox(obj(n.subt)): drawObj(obj(n.subt)); fi;
+ if not isEmptyBox(obj(n.lr)): drawObj(obj(n.lr)); fi;
+ if not isEmptyBox(obj(n.rr)): drawObj(obj(n.rr)); fi;
+ if OptionValue.n("rule")>0:
+ pickup pencircle scaled OptionValue.n("rule");
+ draw n.lstart -- n.lend;
+ fi;
+% pickup pencircle scaled 2pt;
+% draw n.ledge withcolor red;
+% draw n.redge withcolor red;
+ pickup pencircle scaled .4pt;
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("PTree")("treemode")("D"); % default is down
+setObjectDefaultOption("PTree")("dx")(0mm); % left/right margins
+setObjectDefaultOption("PTree")("dy")(0mm); % top/down margins
+setObjectDefaultOption("PTree")("hsep")(3mm); % internal horizontal separation
+ % between subtrees
+setObjectDefaultOption("PTree")("vsep")(2mm); % internal vertical separation
+setObjectDefaultOption("PTree")("lrsep")(2mm); % separation with left rule
+setObjectDefaultOption("PTree")("rrsep")(2mm); % separation with right rule
+setObjectDefaultOption("PTree")("lstartdx")(0); % positive towards the right
+setObjectDefaultOption("PTree")("lenddx")(0); % positive towards the right
+setObjectDefaultOption("PTree")("rule")(.5bp); % rule thickness
+setObjectDefaultOption("PTree")("framed")(false);
+setObjectDefaultOption("PTree")("filled")(false);
+setObjectDefaultOption("PTree")("fillcolor")(black);
+setObjectDefaultOption("PTree")("framewidth")(.5bp);
+setObjectDefaultOption("PTree")("framecolor")(black);
+setObjectDefaultOption("PTree")("framestyle")("");
+setObjectDefaultOption("PTree")("shadow")(false); % no shadow by default
+setObjectDefaultOption("PTree")("shadowcolor")(black);
+
+% Two simplified versions, where only one rule is given:
+vardef newPTreeL@#(expr conclusion)(text subtrees)(expr left) text options=
+ newPTree@#(conclusion)(subtrees)(left,"") options
+enddef;
+
+vardef newPTreeR@#(expr conclusion)(text subtrees)(expr right) text options=
+ newPTree@#(conclusion)(subtrees)("",right) options
+enddef;
+
+% A version with no subtrees and no rules:
+vardef newAxiom@#(expr axiom) text options=
+ newPTree@#(axiom)("")("","") options
+enddef;
+
+vardef newAssumption@#(expr assumption)=
+ newBox@#(assumption) "framed(false)", "dx(0)", "dy(0)"
+enddef;
+
+% This is identical to |newAssumption|, but it would be confusing
+% to use |newAssumption| where a conclusion occurs.
+vardef newConclusion@#(expr conclusion)=
+ newBox@#(conclusion) "framed(false)", "dx(0)", "dy(0)"
+enddef;
+
+%=====================================================================
+% |HBox| class
+
+% |HBox|: Generic Horizontal Alignments
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+vardef newHBox@#(text sublist) text options =
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"HBox");
+ StandardInterface;
+ save n,i,eq;numeric n,i;string eq;
+ n=0;
+ forsuffixes $:=sublist:n:=n+1;endfor;
+ ObjSubArray(sb)(n); % |n| is the number of horizontal elements
+ ObjNumeric nst,tallest;
+ setNumeric(nst)(n);
+ i=0;
+ if OptionValue@#("flip"):
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sb[n+1-i],$);
+ endfor;
+ else:
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sb[i],$);
+ endfor;
+ fi;
+ % we now build the equations:
+ % 1: horizontal equation: horizontal separation between elements
+ % if elementsize<0:
+ % |xpart(sb[2].w-sb[1].e)=xpart(sb[3].w-sb[2].e)=...|
+ % |=xpart(sb[n].w-sb[n-1].e)=5mm;|
+ % if elementsize>=0:
+ % |xpart(sb[2].c-sb[1].c)=xpart(sb[3].c-sb[2].c)=...|
+ % |=xpart(sb[n].c-sb[n-1].c)=hbsep+elementsize;|
+ %
+ % 2: horizontal equation: horizontal space at the edges
+ % |xpart(sb[1].w-@#w)=xpart(@#e-sb[n].e)=0mm;|
+ % 3: vertical equation: elements are lined up at the top
+ % |ypart(sb[1].n)=ypart(sb[2].n)=...=ypart(sb[n].n)|
+ % or at the bottom (default) (depending on the options)
+ % |ypart(sb[1].s)=ypart(sb[2].s)=...=ypart(sb[n].s)|
+ % or at the center
+ % |ypart(sb[1].c)=ypart(sb[2].c)=...=ypart(sb[n].c)|
+ % 4: vertical equation: vertical space at the top
+ % |ypart(@#n-sb[i].n)=0mm;| where |sb[i]| is the tallest
+ % 5: vertical equation: vertical space at the bottom
+ % |ypart(sb[i].s-@#s)=0mm;| where |sb[i]| is the tallest
+ % 1:
+ if OptionValue@#("elementsize")<0:
+ eq:="if @#sb.n_>1:" &
+ "xpart(obj(@#sb[2]).w-obj(@#sb[1]).e) " &
+ "if @#sb.n_>2:" &
+ "for i:=3 upto @#sb.n_: " &
+ "=xpart(obj(@#sb[i]).w-obj(@#sb[i-1]).e)" &
+ "endfor " &
+ "fi" &
+ "=" & decimal(OptionValue@#("hbsep")) & ";" &
+ "fi;";
+ else:
+ eq:="if @#sb.n_>1:" &
+ "xpart(obj(@#sb[2]).c-obj(@#sb[1]).c) " &
+ "if @#sb.n_>2:" &
+ "for i:=3 upto @#sb.n_: " &
+ "=xpart(obj(@#sb[i]).c-obj(@#sb[i-1]).c)" &
+ "endfor " &
+ "fi" &
+ "=" &
+ decimal(OptionValue@#("hbsep")+OptionValue@#("elementsize")) & ";" &
+ "fi;";
+ fi;
+ % 2: |xpart(sb[1].w-@#w)=xpart(@#e-sb[n].e)=5mm;|
+ if OptionValue@#("elementsize")<0:
+ eq:=eq & "xpart(obj(@#sb[1]).w-@#w)" &
+ "=xpart(@#e-obj(@#sb[@#sb.n_]).e)=" &
+ decimal(OptionValue@#("dx")) & ";";
+ else:
+ eq:=eq & "xpart(obj(@#sb[1]).c-@#w)" &
+ "=xpart(@#e-obj(@#sb[@#sb.n_]).c)=" &
+ decimal(OptionValue@#("dx")+.5*OptionValue@#("elementsize")) & ";";
+ fi;
+ % The next equation depends on an option:
+ save alignsuffix;string alignsuffix; alignsuffix="s";
+ if Option@#("align","top"):alignsuffix:="n";
+ elseif Option@#("align","center"):alignsuffix:="c";
+ fi;
+
+ % 3: |ypart(sb[1].alignsuffix)=ypart(sb[2].alignsuffix)=...|
+ % |=ypart(sb[n].alignsuffix)|
+ eq:=eq & "if @#sb.n_>1:" &
+ "ypart(obj(@#sb[1])." & alignsuffix & ")" &
+ "for i:=2 upto @#sb.n_: " &
+ "=ypart(obj(@#sb[i])." & alignsuffix & ")" &
+ "endfor;" &
+ "fi;";
+ % first, we compute the tallest subtree:
+ setTallest@#;
+ % 4: |ypart(@#n-sb[tallest].n)=0mm;|
+ eq:=eq & "ypart(@#n-obj(@#sb[@#tallest]).n)=" &
+ decimal(OptionValue@#("dy")) & ";";
+ % 5: |ypart(sb[tallest].s-@#s)=0mm;|
+ eq:=eq & "ypart(obj(@#sb[@#tallest]).s-@#s)=" &
+ decimal(OptionValue@#("dy")) & ";";
+
+ ObjCode StandardEquations,eq;
+% |"xpart(@#n)=xpart(@#s);ypart(@#ne)=ypart(@#nw);";|
+ StandardTies;
+enddef;
+
+% The result of |setTallest| must be greater than 0.
+vardef setTallest@#=
+ save tallest_height;
+ @#tallest:=1;tallest_height=0;
+ for i:=1 upto @#nst:
+ if ypart(obj(@#sb[i]).n-obj(@#sb[i]).s)>tallest_height:
+ @#tallest:=i;
+ tallest_height:=ypart(obj(@#sb[i]).n-obj(@#sb[i]).s);
+ fi;
+ endfor;
+enddef;
+
+streamline("HBox")("(text sublist)","suffixlist(sublist)");
+
+def BpathHBox(suffix n)= StandardBpath(n) enddef;
+
+def drawHBox(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawObjArray(n)(sb);
+ drawMemorizedPaths_(n);
+enddef;
+
+% Default values of |HBox|:
+setObjectDefaultOption("HBox")("dx")(0mm);
+setObjectDefaultOption("HBox")("dy")(0mm);
+setObjectDefaultOption("HBox")("hbsep")(1mm);
+setObjectDefaultOption("HBox")("elementsize")(-1pt); % like PSTricks
+setObjectDefaultOption("HBox")("align")("bot");
+setObjectDefaultOption("HBox")("framed")(false);
+setObjectDefaultOption("HBox")("filled")(false);
+setObjectDefaultOption("HBox")("fillcolor")(black);
+setObjectDefaultOption("HBox")("framewidth")(.5bp);
+setObjectDefaultOption("HBox")("framecolor")(black);
+setObjectDefaultOption("HBox")("framestyle")("");
+setObjectDefaultOption("HBox")("flip")(false);
+setObjectDefaultOption("HBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("HBox")("shadowcolor")(black);
+
+
+% Replace an element in an |HBox| or add an element at the end of the list.
+% A succeeding call to this function resets the object.
+vardef replaceHBoxElement.expl@#(expr i)(suffix rep)=
+ setcurrentobjname_(str @#);
+ if (i<1) or (i>@#sb.n_+1):
+ errmessage "Value out of range";
+ elseif i<@#sb.n_+1:
+ % first, we reset the object in order to be sure we have its right
+ % dimensions when we try to update |tallest|
+ resetObj.expl@#;
+ @#sb[i]:=str rep;
+ % we recompute the tallest element:
+ setTallest@#;
+ resetObj.expl@#;
+ else: % |i=@#sb.n_+1|
+ % we add |rep| at the end of the |HBox|
+ % first, we reset the object in order to be sure we have its right
+ % dimensions when we try to update |tallest|
+ resetObj.expl@#;
+ @#sb.n_:=@#sb.n_+1;
+ @#sb[@#sb.n_]:=str rep;
+ setTallest@#; % not fast, but short
+ resetObj.expl@#;
+ % we need to add one tie, and the easiest is to recreate them all:
+ @#nsubobjties_:=0;
+ StandardTies;
+ fi;
+enddef;
+
+% Delete an element in an |HBox|
+% A succeeding call to this function resets the object.
+vardef deleteHBoxElement.expl@#(expr i)=
+ setcurrentobjname_(str @#);
+ if (i<0) or (i>@#sb.n_):
+ errmessage "Value out of range";
+ else:
+ resetObj.expl@#;
+ for j:=i upto @#sb.n_-1:
+ @#sb[j]:=@#sb[j+1];
+ endfor;
+ @#sb[@#sb.n_]:=whateverstring;
+ @#sb.n_:=@#sb.n_-1;
+ setTallest@#;
+ resetObj.expl@#;
+ % we reconstruct the standard ties
+ @#nsubobjties_:=0;
+ StandardTies;
+ fi;
+enddef;
+
+
+% The next class is the vertical analog of |HBox|. It would have
+% been possible to merge |newHBox| and |newVBox| in something like
+% |newAlign| (|xpart| becoming |ypart|, |.w| becoming |.s|, etc.)
+% but we didn't do it for the sake of clarity. It is left as an
+% exercise.
+
+%=====================================================================
+% |VBox| class
+
+% |VBox|: Generic Vertical Alignments
+% The objects are stacked up (and not down as in \TeX).
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+vardef newVBox@#(text sublist) text options =
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"VBox");
+ StandardInterface;
+ save n,i,eq;numeric n,i;string eq;
+ n=0;
+ forsuffixes $:=sublist:n:=n+1;endfor;
+ ObjSubArray(sb)(n); % |n| is the number of vertical elements
+ ObjNumeric nst,widest;
+ setNumeric(nst)(n);
+ i=0;
+ if OptionValue@#("flip"):
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sb[n+1-i],$);
+ endfor;
+ else:
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sb[i],$);
+ endfor;
+ fi;
+ % we now build the equations:
+ % 1: vertical equation: vertical separation between elements
+ % |ypart(sb[2].s-sb[1].n)=ypart(sb[3].s-sb[2].n)=...|
+ % |=ypart(sb[n].s-sb[n-1].n)=5mm;|
+ % 2: vertical equation: vertical space at the edges
+ % |ypart(sb[1].s-@#s)=ypart(@#n-sb[n].n)=0mm;|
+ % 3: horizontal equation: elements are lined up at the left (default)
+ % |xpart(sb[1].w)=xpart(sb[2].w)=...=xpart(sb[n].w)|
+ % or at the right (depending on the options)
+ % |xpart(sb[1].e)=xpart(sb[2].e)=...=xpart(sb[n].e)|
+ % or at the center
+ % |xpart(sb[1].c)=xpart(sb[2].c)=...=xpart(sb[n].c)|
+ % 4: horizontal equation: horizontal space at the right
+ % |xpart(@#e-sb[i].e)=0mm;| where |sb[i]| is the widest
+ % 5: horizontal equation: vertical space at the left
+ % |xpart(sb[i].w-@#w)=0mm;| where |sb[i]| is the widest
+ % 1:
+ if OptionValue@#("elementsize")<0:
+ eq:="if @#sb.n_>1:" &
+ "ypart(obj(@#sb[2]).s-obj(@#sb[1]).n)" &
+ "if @#sb.n_>2:" &
+ "for i:=3 upto @#sb.n_: " &
+ "=ypart(obj(@#sb[i]).s-obj(@#sb[i-1]).n)" &
+ "endfor " &
+ "fi" &
+ "=" & decimal(OptionValue@#("vbsep")) & ";" &
+ "fi;";
+ else:
+ eq:="if @#sb.n_>1:" &
+ "ypart(obj(@#sb[2]).c-obj(@#sb[1]).c)" &
+ "if @#sb.n_>2:" &
+ "for i:=3 upto @#sb.n_: " &
+ "=ypart(obj(@#sb[i]).c-obj(@#sb[i-1]).c)" &
+ "endfor " &
+ "fi" &
+ "=" &
+ decimal(OptionValue@#("vbsep")+OptionValue@#("elementsize")) & ";" &
+ "fi;";
+ fi;
+ % 2: |ypart(sb[1].s-@#s)=ypart(@#n-sb[n].n)=5mm;|
+ if OptionValue@#("elementsize")<0:
+ eq:=eq & "ypart(obj(@#sb[1]).s-@#s)" &
+ "=ypart(@#n-obj(@#sb[@#sb.n_]).n)=" &
+ decimal(OptionValue@#("dy")) & ";";
+ else:
+ eq:=eq & "ypart(obj(@#sb[1]).c-@#s)" &
+ "=ypart(@#n-obj(@#sb[@#sb.n_]).c)=" &
+ decimal(OptionValue@#("dy")+.5*OptionValue@#("elementsize")) & ";";
+ fi;
+ % The next equation depends on an option:
+ save alignsuffix;string alignsuffix; alignsuffix="w"; % default
+ if Option@#("align","right"):alignsuffix:="e";
+ elseif Option@#("align","center"):alignsuffix:="c";
+ fi;
+
+ % 3: |xpart(sb[1].alignsuffix)=xpart(sb[2].alignsuffix)=...|
+ % |=xpart(sb[n].alignsuffix)|
+ eq:=eq & "if @#sb.n_>1:" &
+ "xpart(obj(@#sb[1])." & alignsuffix & ")" &
+ "for i:=2 upto @#sb.n_: " &
+ "=xpart(obj(@#sb[i])." & alignsuffix & ")" &
+ "endfor;" &
+ "fi;";
+ % first, we compute the widest subtree:
+ setWidest@#;
+ % 4: |xpart(@#e-sb[widest].e)=0mm;|
+ eq:=eq & "xpart(@#e-obj(@#sb[@#widest]).e)=" &
+ decimal(OptionValue@#("dx")) & ";";
+ % 5: |xpart(sb[widest].w-@#w)=0mm;|
+ eq:=eq & "xpart(obj(@#sb[@#widest]).w-@#w)=" &
+ decimal(OptionValue@#("dx")) & ";";
+ ObjCode StandardEquations,eq;
+% |"ypart(@#n)=ypart(@#s);xpart(@#ne)=xpart(@#nw);";|
+ StandardTies;
+enddef;
+
+% The result of |setWidest| must be greater than 0.
+vardef setWidest@#=
+ save widest_width;@#widest:=1;widest_width=0;
+ for i:=1 upto @#nst:
+ if xpart(obj(@#sb[i]).e-obj(@#sb[i]).w)>widest_width:
+ @#widest:=i;
+ widest_width:=xpart(obj(@#sb[i]).e-obj(@#sb[i]).w);
+ fi;
+ endfor;
+enddef;
+
+streamline("VBox")("(text sublist)","suffixlist(sublist)");
+
+def BpathVBox(suffix n)= StandardBpath(n) enddef;
+
+def drawVBox(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawObjArray(n)(sb);
+ drawMemorizedPaths_(n);
+enddef;
+
+% Default values of |VBox|:
+setObjectDefaultOption("VBox")("dx")(0mm);
+setObjectDefaultOption("VBox")("dy")(0mm);
+setObjectDefaultOption("VBox")("vbsep")(1mm);
+setObjectDefaultOption("VBox")("elementsize")(-1pt); % like PSTricks
+setObjectDefaultOption("VBox")("align")("left");
+setObjectDefaultOption("VBox")("framed")(false);
+setObjectDefaultOption("VBox")("filled")(false);
+setObjectDefaultOption("VBox")("fillcolor")(black);
+setObjectDefaultOption("VBox")("framewidth")(.5bp);
+setObjectDefaultOption("VBox")("framecolor")(black);
+setObjectDefaultOption("VBox")("framestyle")("");
+setObjectDefaultOption("VBox")("flip")(false);
+setObjectDefaultOption("VBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("VBox")("shadowcolor")(black);
+
+% Replace an element in an |VBox| or add an element at the end of the list.
+% A succeeding call to this function resets the object.
+vardef replaceVBoxElement.expl@#(expr i)(suffix rep)=
+ setcurrentobjname_(str @#);
+ if (i<1) or (i>@#sb.n_+1):
+ errmessage "Value out of range";
+ elseif i<@#sb.n_+1:
+ % first, we reset the object in order to be sure we have its right
+ % dimensions when we try to update |widest|
+ resetObj.expl@#;
+ @#sb[i]:=str rep;
+ % we recompute the widest element:
+ setWidest@#;
+ resetObj.expl@#;
+ else: % |i=@#sb.n_+1|
+ % we add |rep| at the end of the |VBox|
+ % first, we reset the object in order to be sure we have its right
+ % dimensions when we try to update |widest|
+ resetObj.expl@#;
+ @#sb.n_:=@#sb.n_+1;
+ @#sb[@#sb.n_]:=str rep;
+ setWidest@#; % not fast, but short
+ resetObj.expl@#;
+ % we need to add one tie, and the easiest is to recreate them all:
+ @#nsubobjties_:=0;
+ StandardTies;
+ fi;
+enddef;
+
+% Delete an element in an |VBox|
+% A succeeding call to this function resets the object.
+% This function should be merged with |deleteHBoxElement.expl|
+vardef deleteVBoxElement.expl@#(expr i)=
+ setcurrentobjname_(str @#);
+ if (i<0) or (i>@#sb.n_):
+ errmessage "Value out of range";
+ else:
+ resetObj.expl@#;
+ for j:=i upto @#sb.n_-1:
+ @#sb[j]:=@#sb[j+1];
+ endfor;
+ @#sb[@#sb.n_]:=whateverstring;
+ @#sb.n_:=@#sb.n_-1;
+ setWidest@#;
+ resetObj.expl@#;
+ % we reconstruct the standard ties
+ @#nsubobjties_:=0;
+ StandardTies;
+ fi;
+enddef;
+
+%=====================================================================
+% |Matrix| class
+
+% |Matrix|: Generic Matrix
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+vardef newMatrix@#(expr Nx,Ny)(text elements) text options =
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Matrix");
+ StandardInterface;
+ save i,eq;numeric i;string eq;
+ ObjSubArray(sb)(Nx*Ny);
+ ObjNumeric nx,ny;
+ setNumeric(nx)(Nx);
+ setNumeric(ny)(Ny);
+ ObjNumericArray(wd)(Ny);
+ ObjNumericArray(ht)(Nx);
+
+ i=0;
+ forsuffixes $:=elements:i:=i+1;
+ if $<>0: % null box
+ SubObjectOfArray(sb[i],$);
+ fi;
+ endfor;
+
+ % We compute for each column, which element is the widest,
+ % and for each line, which one is the tallest; the indices
+ % are stored in the |wd| and |ht| arrays:
+ % This assumes that there is at least one object in each column
+ % and line.
+ % First, the tallest elements in each line:
+ if OptionValue@#("matrixnodevsize")<0:
+ for i:=1 upto Nx:
+ % find the first column which contains an object and initialize
+ % |@#ht[i]| to its index:
+ @#ht[i]=0;
+ for k:=1 upto Ny:
+ if known @#sb[(i-1)*Ny+k]: @#ht[i]:=k;fi;
+ exitif @#ht[i]=k;
+ endfor;
+ for j:=@#ht[i]+1 upto Ny:
+ if known @#sb[(i-1)*Ny+j]:
+ if ypart(obj(@#sb[(i-1)*Ny+j]).n-obj(@#sb[(i-1)*Ny+j]).s)>
+ ypart(obj(@#sb[(i-1)*Ny+@#ht[i]]).n-obj(@#sb[(i-1)*Ny+@#ht[i]]).s):
+ @#ht[i]:=j;
+ fi;
+ fi;
+ endfor;
+ @#ht[i]:=(i-1)*Ny+@#ht[i];
+ endfor;
+ else:
+ for i:=1 upto Nx:
+ @#ht[i]=1+(i-1)*Ny; % bug corrected on October 5, 2005
+ endfor;
+ fi;
+
+ % Then, the widest elements in each column:
+ if OptionValue@#("matrixnodehsize")<0:
+ for i:=1 upto Ny:
+ @#wd[i]=0;
+ % find the first line which contains an object and initialize
+ % |@#wd[i]| to its index:
+ for k:=1 upto Nx:
+ if known @#sb[(k-1)*Ny+i]: @#wd[i]:=k;fi;
+ exitif @#wd[i]=k;
+ endfor;
+ for j:=@#wd[i]+1 upto Nx:
+ if known @#sb[(j-1)*Ny+i]:
+ if xpart(obj(@#sb[(j-1)*Ny+i]).e-obj(@#sb[(j-1)*Ny+i]).w)>
+ xpart(obj(@#sb[(@#wd[i]-1)*Ny+i]).e-obj(@#sb[(@#wd[i]-1)*Ny+i]).w):
+ @#wd[i]:=j;
+ fi;
+ fi;
+ endfor;
+ @#wd[i]:=(@#wd[i]-1)*Ny+i;
+ endfor;
+ else:
+ for i:=1 upto Ny:
+ @#wd[i]=i; % bug corrected on October 5, 2005
+ endfor;
+ fi;
+ % The basic equations are:
+ % horizontally:
+ % |xpart(sb[wd(1)].w-@#w)=5mm;|
+ % |xpart(@#e-sb[wd(ny)].e)=5mm;|
+ % |for i=1 upto ny-1|
+ % |xpart(sb[wd(i+1)].w-sb[wd(i)].e)=5mm;| ****
+ % |for i=1 upto ny|
+ % |for j=1 upto nx|
+ % |xpart(sb[(j-1)*ny+i].c)=xpart(sb[wd(i)].c)|
+ % vertically:
+ % |ypart(@#n-sb[ht(1)].n)=5mm;|
+ % |ypart(sb[ht(nx)].s-@#s)=5mm;|
+ % |for i=1 upto nx-1|
+ % |ypart(sb[ht(i)].s-sb[ht(i+1)].n)=5mm;| ****
+ % |for i=1 upto ny|
+ % |for j=1 upto nx|
+ % |ypart(sb[(j-1)*ny+i].c)=ypart(sb[ht(j)].c)|
+ %
+ % `****' shows where matrixnode(h/v)size needs to be taken into account
+ % These two equations become:
+ % |xpart(sb[wd(i+1)].c-sb[wd(i)].c)=matrixnodehsize;|
+ % |ypart(sb[ht(i)].c-sb[ht(i+1)].c)=matrixnodevsize;|
+ %
+ % By not hardwiring the widest and tallest elements
+ % we allow ourselves the possibility to replace elements
+ % and still have the size adjusted (after resetting the object).
+ % The only assumption is that there is always at least one non null
+ % object in each column and each line.
+
+ eq:="save fal_;" &
+ "vardef fal_(expr i,s)=" &
+ "save l;" &
+ "hide(l=length(s);)" &
+ "substring if i>l: (l-1,l) else: (i-1,i) fi of s " &
+ "enddef; " &
+ if OptionValue@#("matrixnodehsize")>=0:
+ "xpart(obj(@#sb[@#wd[1]]).c-@#w)=" &
+ decimal (OptionValue@#("matrixnodehsize")/2+OptionValue@#("dx")) &";" &
+ "xpart(@#e-obj(@#sb[@#wd[@#ny]]).c)=" &
+ decimal (OptionValue@#("matrixnodehsize")/2+OptionValue@#("dx")) &";" &
+ else:
+ "xpart(obj(@#sb[@#wd[1]]).w-@#w)=" & decimal (OptionValue@#("dx")) &";" &
+ "xpart(@#e-obj(@#sb[@#wd[@#ny]]).e)=" &
+ decimal (OptionValue@#("dx")) &";" &
+ fi
+ "for i:=1 upto @#ny-1:";
+ if OptionValue@#("matrixnodehsize")>=0:
+ eq:=eq &
+ "xpart(obj(@#sb[@#wd[i+1]]).c-obj(@#sb[@#wd[i]]).c)=" &
+ decimal (OptionValue@#("matrixnodehsize")) &";";
+ else:
+ eq:=eq &
+ "xpart(obj(@#sb[@#wd[i+1]]).w-obj(@#sb[@#wd[i]]).e)=" &
+ decimal (OptionValue@#("hsep")) &";";
+ fi;
+ eq:=eq &
+ "endfor;" &
+ "for i:=1 upto @#ny:" &
+ "for j:=1 upto @#nx:" &
+ "if ((j-1)*@#ny+i<>@#wd[i]) and (known @#sb[(j-1)*@#ny+i]):" &
+ "xpart(obj(@#sb[(j-1)*@#ny+i]).sc_(fal_(i," &
+ quote(OptionValue@#("halign")) & ")))" &
+ "=xpart(obj(@#sb[@#wd[i]]).sc_(fal_(i," &
+ quote(OptionValue@#("halign")) & ")));" &
+ "fi;" &
+ "endfor;" &
+ "endfor;" &
+ if OptionValue@#("matrixnodevsize")>=0:
+ "ypart(@#n-obj(@#sb[@#ht[1]]).c)=" &
+ decimal (OptionValue@#("matrixnodevsize")/2+OptionValue@#("dy")) &";" &
+ "ypart(obj(@#sb[@#ht[@#nx]]).c-@#s)=" &
+ decimal (OptionValue@#("matrixnodevsize")/2+OptionValue@#("dy")) &";" &
+ else:
+ "ypart(@#n-obj(@#sb[@#ht[1]]).n)=" & decimal (OptionValue@#("dy")) &";" &
+ "ypart(obj(@#sb[@#ht[@#nx]]).s-@#s)=" &
+ decimal (OptionValue@#("dy")) &";" &
+ fi
+ "for i:=1 upto @#nx-1:";
+ if OptionValue@#("matrixnodevsize")>=0:
+ eq:=eq &
+ "ypart(obj(@#sb[@#ht[i]]).c-obj(@#sb[@#ht[i+1]]).c)=" &
+ decimal (OptionValue@#("matrixnodevsize")) &";";
+ else:
+ eq:=eq &
+ "ypart(obj(@#sb[@#ht[i]]).s-obj(@#sb[@#ht[i+1]]).n)=" &
+ decimal (OptionValue@#("vsep")) &";";
+ fi;
+ eq:=eq &
+ "endfor;" &
+ "for i:=1 upto @#ny:" &
+ "for j:=1 upto @#nx:" &
+ "if ((j-1)*@#ny+i<>@#ht[j]) and (known @#sb[(j-1)*@#ny+i]):" &
+ "ypart(obj(@#sb[(j-1)*@#ny+i]).sc_(fal_(i," &
+ quote(OptionValue@#("valign")) & ")))" &
+ "=ypart(obj(@#sb[@#ht[j]]).sc_(fal_(i," &
+ quote(OptionValue@#("valign")) & ")));" &
+ "fi;" &
+ "endfor;" &
+ "endfor;";
+ ObjCode StandardEquations,eq;
+ StandardTies;
+enddef;
+
+streamline("Matrix")("(expr nx,ny)(text sublist)",
+ "(nx,ny)suffixlist(sublist)");
+
+def BpathMatrix(suffix n)= StandardBpath(n) enddef;
+
+def drawMatrix(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawObjArray(n)(sb);
+ drawMemorizedPaths_(n);
+enddef;
+
+% Default values of |Matrix|:
+setObjectDefaultOption("Matrix")("dx")(0mm);
+setObjectDefaultOption("Matrix")("dy")(0mm);
+setObjectDefaultOption("Matrix")("hsep")(1mm);
+setObjectDefaultOption("Matrix")("vsep")(1mm);
+setObjectDefaultOption("Matrix")("halign")("c");
+setObjectDefaultOption("Matrix")("valign")("c");
+setObjectDefaultOption("Matrix")("framed")(false);
+setObjectDefaultOption("Matrix")("filled")(false);
+setObjectDefaultOption("Matrix")("fillcolor")(black);
+setObjectDefaultOption("Matrix")("framewidth")(.5bp);
+setObjectDefaultOption("Matrix")("framecolor")(black);
+setObjectDefaultOption("Matrix")("framestyle")("");
+setObjectDefaultOption("Matrix")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Matrix")("shadowcolor")(black);
+setObjectDefaultOption("Matrix")("matrixnodehsize")(-1pt);
+setObjectDefaultOption("Matrix")("matrixnodevsize")(-1pt);
+
+
+% Some special functions on matrices:
+
+% This function replaces the element at position (i,j) by element |rep|
+% Since we call |resetObj.expl|, this function cancels transformations.
+% However, the new matrix has its equations correctly applied
+% to the new object.
+% |i| is the line, |j| the column
+% It is possible to create new columns or new lines by giving to
+% |i| (or |j|) the value of the number of lines (or columns) plus one.
+vardef replaceMatrixElement.expl@#(expr i,j)(suffix rep)=
+ % first, we reset the object in order to be sure we have its right
+ % dimensions when we try to update |ht[i]| and |wd[j]|
+ resetObj.expl@#;
+
+ % first, see if a new column or a new line are needed
+ if i=@#nx+1:
+ if (j>0) and (j<=@#ny):
+ % create new line
+ @#nx:=@#nx+1;
+ @#sb.n_:=@#nx*@#ny;
+
+ % increase size of |@#ht[]| array
+ @#ht.n_:=@#nx;
+
+ @#ht[i]=(i-1)*@#ny+j;
+ if xpart(rep.e-rep.w)>xpart(obj(@#sb[@#wd[j]]).e-obj(@#sb[@#wd[j]]).w):
+ @#wd[j]:=(i-1)*@#ny+j;
+ fi;
+ % we replace the string representing the subobject
+ @#sb[(i-1)*@#ny+j]:= str rep;
+ % we reset the object again, this time in order to take the changes
+ % to |ht[i]| and |wd[j]| into account
+ resetObj.expl@#;
+
+ elseif j=@#ny+1:
+ % in this case, we create a new line and a new column
+ % first, a new column:
+ addmatrixcolumn_@#;
+
+ % create new line
+ @#nx:=@#nx+1;
+ @#sb.n_:=@#nx*@#ny;
+ % increase sizes of |@#ht[]| array
+ @#ht.n_:=@#nx;
+
+ % we now update |@#ht| and |@#wd| because of the new object;
+ % this is easy, because the object is alone on its line and column.
+ @#ht[@#nx]:=@#nx*@#ny;
+ @#wd[@#ny]:=@#nx*@#ny;
+ % we add the subobject:
+ @#sb[@#nx*@#ny]:= str rep;
+ % and we reset the object
+
+ resetObj.expl@#;
+ else:
+ errmessage "Column number out of range";
+ fi;
+ elseif (i>@#nx+1) or (i<1):
+ errmessage "Line number out of range";
+ else:
+ if (j>0) and (j<=@#ny):
+ % AVERAGE CASE
+ % we replace the string representing the subobject
+ @#sb[(i-1)*@#ny+j]:= str rep;
+ % we recompute the |ht[i]| and |wd[j]| values; since it is possible
+ % that we replace the largest element by a smaller one, the new largest
+ % element can be different from both the previous largest and the
+ % new element; so, in order to simplify the code, we recompute
+ % |ht[i]| and |wd[j]| from scratch.
+ @#ht[i]:=(i-1)*@#ny+j; % we are sure this element exists
+ updateHeight_@#(i);
+ @#wd[j]:=(i-1)*@#ny+j; % we are sure this element exists
+ updateWidth_@#(j);
+ % we reset the object again, this time in order to take the changes
+ % to |ht[i]| and |wd[j]| into account
+ resetObj.expl@#;
+
+ elseif j=@#ny+1:
+ addmatrixcolumn_@#;
+ @#sb.n_:=@#nx*@#ny;
+
+ % we now update |@#ht| and |@#wd| because of the new object;
+ % the width is easy, because the object is alone on its column.
+
+ @#wd[@#ny]:=i*@#ny;
+
+ % for the height, we update |@#ht[i]|:
+ if ypart(rep.n-rep.s) > ypart(obj(@#sb[@#ht[i]]).n-obj(@#sb[@#ht[i]]).s):
+ @#ht[i]:=i*@#ny;
+ fi;
+
+ % we add the subobject:
+ @#sb[i*@#ny]:= str rep;
+ % and we reset the object
+ resetObj.expl@#;
+ else:
+ errmessage "Column number out of range";
+ fi;
+ fi;
+enddef;
+
+% This function is only used by |replaceMatrixElement.expl|
+vardef addmatrixcolumn_@#=
+ % create a new column
+ for k:=@#nx downto 1:
+ for l:=@#ny downto 1:
+ if known @#sb[(k-1)*@#ny+l]:
+ @#sb[(k-1)*(@#ny+1)+l]:=@#sb[(k-1)*@#ny+l];
+ else:
+ @#sb[(k-1)*(@#ny+1)+l]:=whateverstring;
+ fi;
+ endfor;
+ endfor;
+ % we must also refresh the new column:
+ for k:= 1 upto @#nx:
+ @#sb[k*(@#ny+1)]:=whateverstring;
+ endfor;
+
+ % The values of |@#ht[i]| and |@#wd[i]| are now incorrect
+ % because of the new column that changed the indices.
+ %
+ for k:=1 upto @#nx:
+ @#ht[k]:=@#ht[k]+((@#ht[k]-1) div @#ny);
+ endfor;
+ for k:=1 upto @#ny:
+ @#wd[k]:=@#wd[k]+((@#wd[k]-1) div @#ny);
+ endfor;
+ @#ny:=@#ny+1;
+ % increase sizes of |@#wd[]| array
+ @#wd.n_:=@#ny;
+enddef;
+
+
+% This function is only used by |replaceMatrixElement.expl|
+vardef updateHeight_@#(expr i)=
+ for k:=1 upto @#ny:
+ if known @#sb[(i-1)*@#ny+k]:
+ if @#ht[i]>0:
+ if ypart(obj(@#sb[(i-1)*@#ny+k]).n-obj(@#sb[(i-1)*@#ny+k]).s)>
+ ypart(obj(@#sb[@#ht[i]]).n-obj(@#sb[@#ht[i]]).s):
+ @#ht[i]:=(i-1)*@#ny+k;
+ fi;
+ else:
+ @#ht[i]:=(i-1)*@#ny+k;
+ fi;
+ fi;
+ endfor;
+enddef;
+
+% This function is only used by |replaceMatrixElement.expl|
+vardef updateWidth_@#(expr j)=
+ for k:=1 upto @#nx:
+ if known @#sb[(k-1)*@#ny+j]:
+ if @#wd[j]>0:
+ if xpart(obj(@#sb[(k-1)*@#ny+j]).e-obj(@#sb[(k-1)*@#ny+j]).w)>
+ xpart(obj(@#sb[@#wd[j]]).e-obj(@#sb[@#wd[j]]).w):
+ @#wd[j]:=(k-1)*@#ny+j;
+ fi;
+ else:
+ @#wd[j]:=(k-1)*@#ny+j;
+ fi;
+ fi;
+ endfor;
+enddef;
+
+% Delete matrix element (i,j). In certain cases, we reduce the number
+% of columns or lines.
+% We assume that after deletion the matrix is not empty.
+vardef deleteMatrixElement.expl@#(expr i,j)=
+ % The easy case is when the element we want to remove was neither
+ % alone on its line, nor on its column
+ if isaloneoncolumn_@#(i,j):
+ if isaloneonline_@#(i,j): % case 1 (toughest case)
+ % Here, we have to shift up to three whole blocks of the matrix
+ for k:=1 upto (@#nx-1)*(@#ny-1):
+ if known @#sb[transfer_@#(k,@#nx-1,@#ny-1,i,j)]:
+ @#sb[k]:=@#sb[transfer_@#(k,@#nx-1,@#ny-1,i,j)];
+ else:
+ @#sb[k]:=whateverstring;
+ fi;
+ endfor;
+
+ % the last column and line must be refreshed
+ for k:=(@#nx-1)*(@#ny-1)+1 upto @#nx*@#ny:
+ @#sb[k]:=whateverstring;
+ endfor;
+
+ % |@#wd[]| and |@#ht[]| must be updated,
+ % as well as their number of elements.
+ for k:=1 upto i-1:
+ @#ht[k]:=transferi_@#(@#ht[k],@#nx-1,@#ny-1,i,j);
+ endfor;
+ for k:=i+1 upto @#nx:
+ @#ht[k-1]:=transferi_@#(@#ht[k],@#nx-1,@#ny-1,i,j);
+ endfor;
+ for k:=1 upto j-1:
+ @#wd[k]:=transferi_@#(@#wd[k],@#nx-1,@#ny-1,i,j);
+ endfor;
+ for k:=j+1 upto @#ny:
+ @#wd[k-1]:=transferi_@#(@#wd[k],@#nx-1,@#ny-1,i,j);
+ endfor;
+
+ % |@#nx| and |@#ny| must be updated
+ @#nx:=@#nx-1;@#ny:=@#ny-1;
+ @#sb.n_:=@#nx*@#ny;
+
+ @#ht.n_:=@#ht.n_-1;@#wd.n_:=@#wd.n_-1;
+
+ else: % case 2: we remove column |j|
+ for k:=1 upto @#nx*(@#ny-1):
+ if known @#sb[transfer_@#(k,@#nx,@#ny-1,@#nx+1,j)]:
+ @#sb[k]:=@#sb[transfer_@#(k,@#nx,@#ny-1,@#nx+1,j)];
+ else:
+ @#sb[k]:=whateverstring;
+ fi;
+ endfor;
+ % the last column must be refreshed
+ for k:=@#nx*(@#ny-1)+1 upto @#nx*@#ny:
+ @#sb[k]:=whateverstring;
+ endfor;
+
+ % |@#wd[]| and |@#ht[]| must be updated,
+ % as well as their number of elements.
+ for k:=1 upto @#nx:
+ @#ht[k]:=transferi_@#(@#ht[k],@#nx,@#ny-1,@#nx+1,j);
+ endfor;
+ % SPECIAL TREATMENT FOR |@#ht[i]|:
+ @#ht[i]:=0;updateHeight_@#(i);
+
+ for k:=1 upto j-1:
+ @#wd[k]:=transferi_@#(@#wd[k],@#nx,@#ny-1,@#nx+1,j);
+ endfor;
+ for k:=j+1 upto @#ny:
+ @#wd[k-1]:=transferi_@#(@#wd[k],@#nx,@#ny-1,@#nx+1,j);
+ endfor;
+
+ % |@#ny| must be updated
+ @#ny:=@#ny-1;
+ @#sb.n_:=@#nx*@#ny;
+
+ @#wd.n_:=@#wd.n_-1;
+
+ fi;
+ else:
+ if isaloneonline_@#(i,j): % case 3: we remove line |i|
+ for k:=1 upto (@#nx-1)*@#ny:
+ if known @#sb[transfer_@#(k,@#nx-1,@#ny,i,@#ny+1)]:
+ @#sb[k]:=@#sb[transfer_@#(k,@#nx-1,@#ny,i,@#ny+1)];
+ else:
+ @#sb[k]:=whateverstring;
+ fi;
+ endfor;
+
+ % the last line must be refreshed
+ for k:=(@#nx-1)*@#ny+1 upto @#nx*@#ny:
+ @#sb[k]:=whateverstring;
+ endfor;
+
+ % |@#wd[]| and |@#ht[]| must be updated,
+ % as well as their number of elements.
+ for k:=1 upto i-1:
+ @#ht[k]:=transferi_@#(@#ht[k],@#nx-1,@#ny,i,@#ny+1);
+ endfor;
+ for k:=i+1 upto @#nx:
+ @#ht[k-1]:=transferi_@#(@#ht[k],@#nx-1,@#ny,i,@#ny+1);
+ endfor;
+ for k:=1 upto @#ny:
+ @#wd[k]:=transferi_@#(@#wd[k],@#nx-1,@#ny,i,@#ny+1);
+ % SPECIAL TREATMENT FOR |@#wd[j]|:
+ endfor;
+ @#wd[j]:=0;updateWidth_@#(j);
+ % |@#nx| and |@#ny| must be updated
+ @#nx:=@#nx-1;
+ @#sb.n_:=@#nx*@#ny;
+
+ @#ht.n_:=@#ht.n_-1;
+
+ else: % case 4 (easiest case)
+ % we cancel the subobject
+ @#sb[(i-1)*@#ny+j]:=whateverstring;
+ % and we recompute the |@#ht[i]| and |@#wd[j]| values:
+ @#ht[i]:=0;updateHeight_@#(i);
+ @#wd[j]:=0;updateWidth_@#(j);
+ fi;
+ fi;
+ resetObj.expl@#;
+enddef;
+
+% This function is only used by |deleteMatrixElement.expl|
+% Given a slot |n| in a matrix |nnx|$\times$|nny|, where |nnx=@#nx| or
+% |@#nx-1|, and |nny=@#ny| or |@#ny-1|, this function finds
+% the slot number from the matrix |@#nx|$\times$|@#ny|.
+% |i| and |j| are the missing line and column indexes
+% If either |i| or |j| is equal to 0, only a line or only a column is missing.
+vardef transfer_@#(expr n,nnx,nny,i,j)=
+ save l,c,res;
+ hide(
+ % line and column of |n|:
+ l=((n-1) div nny)+1;
+ c=n-(l-1)*nny;
+ if i*j>0:
+ if (l>=1) and (l<i):
+ if c<j: res=(l-1)*@#ny+c;
+ else: res=(l-1)*@#ny+c+1;
+ fi;
+ elseif (l>=i):
+ if c<j: res=l*@#ny+c;
+ else: res=l*@#ny+c+1;
+ fi;
+ else:
+ errmessage "Function not defined";
+ fi;
+ else:
+ errmessage "This should not happen";
+ fi;
+ ) res
+enddef;
+
+% This is an inverse to |transfer_|.
+% |n| is an index in the |@#nx|$\times$|@#ny| matrix,
+% the new matrix is |nnx|$\times$|nny| and |i| and |j| are the cuts.
+% The function returns the index in the new matrix.
+vardef transferi_@#(expr n,nnx,nny,i,j)=
+ save l,c,res;
+ hide(
+ % line and column of |n|:
+ l=((n-1) div @#ny)+1;
+ c=n-(l-1)*@#ny;
+ % FIRST, THE CASE WHERE |i|*|j|>0:
+ if i*j>0:
+ if (l>=1) and (l<i):
+ if c<j: res=(l-1)*nny+c;
+ else: res=(l-1)*nny+c-1;
+ fi;
+ elseif (l>=i):
+ if c<j: res=(l-2)*nny+c;
+ else: res=(l-2)*nny+c-1;
+ fi;
+ else:
+ errmessage "Function not defined";
+ fi;
+ else:
+ errmessage "This should not happen";
+ fi;
+ ) res
+enddef;
+
+% This function is only used by |deleteMatrixElement.expl|
+vardef isaloneoncolumn_@#(expr i,j)=
+ save res;boolean res;res=true;
+ for k:=1 upto @#nx:
+ if (k<>i) and (known @#sb[(k-1)*@#ny+j]):
+ res:=false;
+ fi;
+ endfor;
+ res
+enddef;
+
+% This function is only used by |deleteMatrixElement.expl|
+vardef isaloneonline_@#(expr i,j)=
+ save res;boolean res;res=true;
+ for k:=1 upto @#ny:
+ if (k<>j) and (known @#sb[(i-1)*@#ny+k]):
+ res:=false;
+ fi;
+ endfor;
+ res
+enddef;
+
+% add brackets to an object
+% the left bracket is |left| and the right bracket is |right|
+vardef bracketit.expl(suffix $)(expr left,right)=
+ save ratio;numeric ratio;
+ ratio=ypart($n-$s)/ypart(urcorner left-lrcorner left);
+ settodefaultifnotknown_("labshift")(pair)
+ ((-.5ratio*xpart(urcorner left-ulcorner left),0));
+ ObjLabel.$(left scaled ratio) "labpoint(w)";
+ ratio:=ypart($n-$s)/ypart(urcorner right-lrcorner right);
+ o_labshift_val:=(.5ratio*xpart(urcorner right-ulcorner right),0);
+ ObjLabel.$(right scaled ratio) "labpoint(e)";
+enddef;
+
+%=====================================================================
+% Definitions specific to the |EmptyBox| class
+
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+vardef newEmptyBox@#(expr dx,dy) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"EmptyBox");
+ StandardInterface;
+ ObjCode StandardEquations,
+ "@#ise-@#isw=(" & decimal dx & ",0)",
+ "@#ine-@#ise=(0," & decimal dy & ")";
+enddef;
+
+% shortcut (PSTricks compatibility)
+def Tn=
+ new_EmptyBox(0,0)
+enddef;
+
+streamline("EmptyBox")("(expr dx,dy)","(dx,dy)");
+
+def BpathEmptyBox(suffix n)=StandardBpath(n) enddef;
+
+def drawEmptyBox(suffix n)=
+ if show_empty_boxes:
+ drawFramedOrFilledObject_(n);
+ fi;
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("EmptyBox")("filled")(false);
+setObjectDefaultOption("EmptyBox")("fillcolor")(black);
+setObjectDefaultOption("EmptyBox")("framed")(false);
+setObjectDefaultOption("EmptyBox")("framewidth")(.5bp);
+setObjectDefaultOption("EmptyBox")("framecolor")(black);
+setObjectDefaultOption("EmptyBox")("framestyle")("");
+setObjectDefaultOption("EmptyBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("EmptyBox")("shadowcolor")(black);
+
+
+% |HRazor| and |VRazor| are just wrappers around the |EmptyBox| class
+vardef newHRazor@#(expr dx) text options =newEmptyBox@#(dx,0) options enddef;
+vardef new_HRazor(expr dx)= new_EmptyBox(dx,0) enddef;
+vardef newVRazor@#(expr dy) text options =newEmptyBox@#(0,dy) options enddef;
+vardef new_VRazor(expr dy)= new_EmptyBox(0,dy) enddef;
+
+% Moreover, we define two handy abbreviations for the streamlined versions:
+def HR(expr dx)=new_HRazor(dx) enddef;
+def VR(expr dy)=new_VRazor(dy) enddef;
+
+%=====================================================================
+% Definitions specific to the |RandomBox| class
+% A class ``|RandomBox|'' with four random points.
+
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+% |wd| is the width, |ht| the height, and |dx| and |dy| are
+% maximum allowed variations. Then to each point are
+% added |(uniformdeviate(dx),uniformdeviate(dy))|
+vardef newRandomBox@#(expr wd,ht,dx,dy) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"RandomBox");
+ StandardInterface;
+ % The random calculations are done only once, when the object
+ % is created. So, there are no problems for duplicating such
+ % an object.
+ ObjCode MinimumStandardEquations,
+ "xpart(@#ine)-xpart(@#inw)=" & decimal (wd+uniformdeviate(dx)-dx/2),
+ "xpart(@#ise)-xpart(@#inw)=" & decimal (wd+uniformdeviate(dx)-dx/2),
+ "xpart(@#isw)-xpart(@#inw)=" & decimal (uniformdeviate(dx)-dx/2),
+ "ypart(@#inw)-ypart(@#ine)=" & decimal (uniformdeviate(dy)-dy/2),
+ "ypart(@#inw)-ypart(@#ise)=" & decimal (ht+uniformdeviate(dy)-dy/2),
+ "ypart(@#inw)-ypart(@#isw)=" & decimal (ht+uniformdeviate(dy)-dy/2);
+enddef;
+
+streamline("RandomBox")("(expr wd,ht,dx,dy)","(wd,ht,dx,dy)");
+
+def BpathRandomBox(suffix n)=StandardBpath(n) enddef;
+
+def drawRandomBox(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("RandomBox")("filled")(false);
+setObjectDefaultOption("RandomBox")("fillcolor")(black);
+setObjectDefaultOption("RandomBox")("framed")(true);
+setObjectDefaultOption("RandomBox")("framewidth")(.5bp);
+setObjectDefaultOption("RandomBox")("framecolor")(black);
+setObjectDefaultOption("RandomBox")("framestyle")("");
+setObjectDefaultOption("RandomBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("RandomBox")("shadowcolor")(black);
+
+%=====================================================================
+% Definitions specific to the |RecursiveBox| class
+% A class ``|RecursiveBox|'' with four points.
+
+% A constructor initializing a box containing |n| levels of itself.
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+vardef newRecursiveBox@#(expr n) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"RecursiveBox");
+ StandardInterface;
+ % we create a subobject only when |n|>0
+ if n>0:
+ % we find a name for the subobject:
+ SubObject(sub,obj(newobjstring_));
+ % and we continue to create the hierarchy:
+ newRecursiveBox.obj(@#sub)(n-1);
+ rotateObj(obj(@#sub),OptionValue@#("rotangle"));
+ % the equations are slightly adapted from |newBB|:
+ ObjCode StandardEquations,
+ "save lftmost,rtmost,topmost,botmost;",
+ "string lftmost,rtmost,topmost,botmost;",
+ "lftmost=find_lft_most.obj(@#sub);",
+ "rtmost =find_rt_most.obj(@#sub);",
+ "topmost=find_top_most.obj(@#sub);",
+ "botmost=find_bot_most.obj(@#sub);",
+ "xpart(@#inw)=xpart(obj(@#sub).obj(lftmost));",
+ "xpart(@#ine)=xpart(obj(@#sub).obj(rtmost));",
+ "ypart(@#inw)=ypart(obj(@#sub).obj(topmost));",
+ "ypart(@#isw)=ypart(obj(@#sub).obj(botmost));";
+ else:
+ ObjCode StandardEquations,
+ "@#ise-@#isw=(" & decimal (OptionValue@#("dx")) & ",0)",
+ "@#ine-@#ise=(0," & decimal (OptionValue@#("dy")) & ")";
+ fi;
+ StandardTies;
+enddef;
+
+streamline("RecursiveBox")("(expr n)","(n)");
+
+def BpathRecursiveBox(suffix n)=StandardBpath(n) enddef;
+
+def drawRecursiveBox(suffix n)=
+ drawFramedOrFilledObject_(n);
+ if known n.sub:
+ drawObj(obj(n.sub));
+ fi;
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("RecursiveBox")("filled")(false);
+setObjectDefaultOption("RecursiveBox")("fillcolor")(black);
+setObjectDefaultOption("RecursiveBox")("framed")(true);
+setObjectDefaultOption("RecursiveBox")("framewidth")(.5bp);
+setObjectDefaultOption("RecursiveBox")("framecolor")(black);
+setObjectDefaultOption("RecursiveBox")("framestyle")("");
+setObjectDefaultOption("RecursiveBox")("dx")(5cm);
+setObjectDefaultOption("RecursiveBox")("dy")(5cm);
+setObjectDefaultOption("RecursiveBox")("rotangle")(10);
+setObjectDefaultOption("RecursiveBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("RecursiveBox")("shadowcolor")(black);
+
+%=====================================================================
+% Definitions specific to the |VonKochFlake| class
+% This class draws a generic Von Koch flake.
+
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+vardef newVonKochFlake@#(expr n) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"VonKochFlake");
+ StandardInterface;
+ % define a triangle
+ ObjPoint A,B,C;
+ save p;
+ pair p[];
+ % Compute the three vertices:
+ p2-p1=(10cm,0);p3-p1=(p2-p1) rotated 60;
+ % we create subobjects only when |n|>0
+ if n>0:
+ % we find names for the three subobjects
+ % (one for each side of the triangle)
+ SubObject(suba,obj(newobjstring_));
+ SubObject(subb,obj(newobjstring_));
+ SubObject(subc,obj(newobjstring_));
+ % and we continue to create the hierarchy:
+ newVonKochSide.obj(@#suba)(p1,p2,n-1);
+ newVonKochSide.obj(@#subb)(p2,p3,n-1);
+ newVonKochSide.obj(@#subc)(p3,p1,n-1);
+ ObjCode StandardEquations,
+ "@#B-@#A=(" & decimal xpart(p2-p1) & "," & decimal ypart(p2-p1) & ")",
+ "@#C-@#A=(" & decimal xpart(p3-p1) & "," & decimal ypart(p3-p1) & ")",
+ "@#A=@#isw","@#B=@#ise", "ypart(@#C)=ypart(@#inw)",
+ "@#A=obj(@#suba).A=obj(@#subc).E",
+ "@#B=obj(@#suba).E=obj(@#subb).A",
+ "@#C=obj(@#subb).E=obj(@#subc).A";
+ else:
+ ObjCode StandardEquations,
+ "@#B-@#A=(" & decimal xpart(p2-p1) & "," & decimal ypart(p2-p1) & ")",
+ "@#C-@#A=(" & decimal xpart(p3-p1) & "," & decimal ypart(p3-p1) & ")",
+ "@#A=@#isw","@#B=@#ise","ypart(@#C)=ypart(@#inw)";
+ fi;
+ StandardTies;
+enddef;
+
+streamline("VonKochFlake")("(expr n)","(n)");
+
+def BpathVonKochFlake(suffix n)=n.A--n.B--n.C--cycle enddef;
+
+def drawVonKochFlake(suffix n)=
+ if known n.suba:drawObj(obj(n.suba));else: draw n.A--n.B;fi;
+ if known n.subb:drawObj(obj(n.subb));else: draw n.B--n.C;fi;
+ if known n.subc:drawObj(obj(n.subc));else: draw n.C--n.A;fi;
+ drawMemorizedPaths_(n);
+enddef;
+
+%=====================================================================
+% Definitions specific to the |VonKochSide| class
+% This class draws a generic Von Koch flake side.
+
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+vardef newVonKochSide@#(expr pa,pb,n) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"VonKochSide");
+ StandardInterface;
+ % define a triangle
+ ObjPoint A,B,C,D,E;
+ save p;
+ pair p[];
+ % Compute the five vertices:
+ p1=pa;p5=pb;p2-p1=p4-p2=p5-p4=(p4-p3) rotated -60=(p3-p2) rotated 60;
+ % we create subobjects only when |n|>0
+ if n>0:
+ % we find names for the four subobjects
+ % (one for each of the subdivision of the sides)
+ SubObject(suba,obj(newobjstring_));
+ SubObject(subb,obj(newobjstring_));
+ SubObject(subc,obj(newobjstring_));
+ SubObject(subd,obj(newobjstring_));
+ % and we continue to create the hierarchy:
+ newVonKochSide.obj(@#suba)(p1,p2,n-1);
+ newVonKochSide.obj(@#subb)(p2,p3,n-1);
+ newVonKochSide.obj(@#subc)(p3,p4,n-1);
+ newVonKochSide.obj(@#subd)(p4,p5,n-1);
+ ObjCode StandardEquations,
+ "@#B-@#A=(" & decimal xpart(p2-p1) & "," & decimal ypart(p2-p1) & ")",
+ "@#C-@#A=(" & decimal xpart(p3-p1) & "," & decimal ypart(p3-p1) & ")",
+ "@#D-@#A=(" & decimal xpart(p4-p1) & "," & decimal ypart(p4-p1) & ")",
+ "@#E-@#A=(" & decimal xpart(p5-p1) & "," & decimal ypart(p5-p1) & ")",
+ "@#isw=@#A","@#ine=@#E",
+ "@#A=obj(@#suba).A",
+ "@#B=obj(@#suba).E=obj(@#subb).A",
+ "@#C=obj(@#subb).E=obj(@#subc).A",
+ "@#D=obj(@#subc).E=obj(@#subd).A",
+ "@#E=obj(@#subd).E";
+ else:
+ ObjCode StandardEquations,
+ "@#B-@#A=(" & decimal xpart(p2-p1) & "," & decimal ypart(p2-p1) & ")",
+ "@#C-@#A=(" & decimal xpart(p3-p1) & "," & decimal ypart(p3-p1) & ")",
+ "@#D-@#A=(" & decimal xpart(p4-p1) & "," & decimal ypart(p4-p1) & ")",
+ "@#E-@#A=(" & decimal xpart(p5-p1) & "," & decimal ypart(p5-p1) & ")",
+ "@#isw=(xpart(@#A),ypart(@#A))", "@#ine=(xpart(@#E),ypart(@#E))";
+ fi;
+ StandardTies;
+enddef;
+
+streamline("VonKochSide")("(expr pa,pb,n)","(pa,pb,n)");
+
+def BpathVonKochSide(suffix n)=n.A--n.B--n.C--n.D--n.E enddef;
+
+def drawVonKochSide(suffix n)=
+ if known n.suba:drawObj(obj(n.suba));else: draw n.A--n.B;fi;
+ if known n.subb:drawObj(obj(n.subb));else: draw n.B--n.C;fi;
+ if known n.subc:drawObj(obj(n.subc));else: draw n.C--n.D;fi;
+ if known n.subd:drawObj(obj(n.subd));else: draw n.D--n.E;fi;
+ drawMemorizedPaths_(n);
+enddef;
+
+%=====================================================================
+% Definitions specific to the |Box| class
+% A class ``Box'' with four points.
+
+% A constructor initializing the variable |p| (picture)
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+% |v| is either a picture, a string or an object given by its number
+vardef newBox@#(expr v) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Box");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ if OptionValue@#("rbox_radius")>0:
+ ObjPoint ene,ese,sse,ssw,wsw,wnw,nnw,nne;
+ % we use paths for the rounded corners if necessary
+ addPathVariables@#(_spath_);
+ fi;
+ if not OptionValue@#("fit"):
+ @#a:=max(@#a,@#b);@#b:=@#a; % square
+ fi;
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ if OptionValue@#("rbox_radius")>0:
+ "@#ine-@#nne=@#ise-@#sse=@#nnw-@#inw=@#ssw-@#isw=(" &
+ decimal (OptionValue@#("rbox_radius")) & ",0)",
+ "@#ine-@#ene=@#ese-@#ise=@#inw-@#wnw=@#wsw-@#isw=(0," &
+ decimal (OptionValue@#("rbox_radius")) & ")",
+ fi
+ "@#ise-@#isw=(" & decimal (2@#a+2*OptionValue@#("dx")) & ",0)",
+ "@#ine-@#ise=(0," & decimal (2@#b+2*OptionValue@#("dy")) & ")";
+ StandardTies;
+ if OptionValue@#("rbox_radius")>0:
+ addPath@#(_spath_,1,
+ @#nnw{left}..{down}@#wnw--@#wsw{down}
+ ..{right}@#ssw--@#sse{right}..{up}@#ese--@#ene{up}
+ ..{left}@#nne--cycle
+ );
+ defineBox_pathparameters(@#);
+ fi;
+enddef;
+
+def defineBox_pathparameters(suffix $)=
+ $_spath_.n_:=1;
+ $_spath_._draw_[1]:=LocalOptionValue("cdraw","cdraw_default");
+ $_spath_.visible[1]:=true;
+ $_spath_.pathfilled[1]:=false;
+ $_spath_.pathfillcolor[1]:=black;
+ $_spath_.border[1]:=CLOV_("border");
+ $_spath_.bordercolor[1]:=CLOV_("bordercolor");
+ $_spath_.linewidth[1]:=OptionValue$("framewidth");
+ $_spath_.linecolor[1]:=OptionValue$("framecolor");
+ $_spath_.nodesepA[1]:=0;
+ $_spath_.nodesepB[1]:=0;
+ $_spath_.arrows[1]:="draw";
+ $_spath_.linestyle[1]:=CLOV_("linestyle");
+ $_spath_.doubleline[1]:=false;
+ forsuffixes $$=_draw_,visible,border,bordercolor,linewidth,linecolor,
+ arrows,linestyle,nodesepA,nodesepB,doubleline,pathfilled,pathfillcolor:
+ $_spath_$$n_:=1;
+ endfor;
+enddef;
+
+def Tr_(expr p)=
+ new_Box_(p)("framed(false)")
+enddef;
+
+def Tf=
+ new_Box_("")("filled(true)")
+enddef;
+
+vardef newRBox@#(expr v) text options=
+ newBox@#(v) "rbox_radius(1mm)", options;
+enddef;
+
+vardef new_RBox(expr v)=
+ new_Box_(v)("rbox_radius(1mm)")
+enddef;
+
+streamline("Box")("(expr v)","(v)");
+
+def BpathBox(suffix n)=
+ (if OptionValue.n("rbox_radius")=0:
+ StandardBpath(n)
+ else:
+ % good curve:
+ % |cycle| was added because in certain cases, |unfill| is called
+ % on the path returned by |BpathBox|.
+ (Path.n(_spath_,1)--cycle)
+ % bad curve:
+% (n.nnw{n.nnw-n.nne}..{n.wsw-n.wnw}n.wnw--n.wsw{n.wsw-n.wnw}
+% ..{n.sse-n.ssw}n.ssw--n.sse{n.sse-n.ssw}
+% ..{n.ene-n.ese}n.ese--n.ene{n.ene-n.ese}
+% ..{n.nnw-n.nne}n.nne--cycle)
+ fi
+ )
+enddef;
+
+def drawBox(suffix n)=
+ if OptionValue.n("rbox_radius")=0:
+ drawFramedOrFilledObject_(n);
+ else:
+ if OptionValue.n("framed"):
+ if OptionValue.n("shadow"):
+ fill (BpathObj(n) shifted (1mm,-1mm))
+ withcolor OptionValue.n("shadowcolor");
+ fi;
+ unfill BpathObj(n);
+ fi;
+ if OptionValue.n("filled"):
+ fill BpathObj(n) withcolor OptionValue.n("fillcolor");
+ fi;
+ fi;
+ drawPictureOrObject(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("Box")("dx")(3bp); % same value as in |boxes.mp|
+setObjectDefaultOption("Box")("dy")(3bp); % same value as in |boxes.mp|
+setObjectDefaultOption("Box")("filled")(false);
+setObjectDefaultOption("Box")("fillcolor")(black);
+setObjectDefaultOption("Box")("framed")(true);
+setObjectDefaultOption("Box")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Box")("shadowcolor")(black);
+setObjectDefaultOption("Box")("fit")(true);
+setObjectDefaultOption("Box")("framewidth")(.5bp);
+setObjectDefaultOption("Box")("framecolor")(black);
+setObjectDefaultOption("Box")("framestyle")("");
+setObjectDefaultOption("Box")("rbox_radius")(0); % after rboxes.mp
+setObjectDefaultOption("Box")("picturecolor")(black);
+
+
+%=====================================================================
+% Definitions specific to the |Polygon| class
+
+% A polygon, either empty, or enclosing a picture or an object |v|.
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+% |nsides| is the number of sides
+vardef newPolygon@#(expr v,nsides) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Polygon");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ ObjPointArray(po)(nsides);
+ % we can now use |po1|, |po2|, ..., |po[nsides]|
+ ObjNumeric ns;
+ setNumeric(ns)(nsides); % now, we can use |@#ns| in the |ObjCode|
+ % we actually define an ellipse on which we build the polygon:
+ ObjNumeric cdx,cdy; % computed dx and dy
+ @#cdx=@#cdy=pathsel__(@#a,@#b)(max(@#a,@#b),OptionValue@#("polymargin"),
+ (@#a+d_,0){up}...(0,@#b+d_){left});
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ % the size of the box is related to the size of its contents
+ if OptionValue@#("fit"):
+ "@#ise-@#isw=(" & decimal (2@#a+2*@#cdx) & ",0)",
+ "@#ine-@#ise=(0," & decimal (2@#b+2*@#cdy) & ")",
+ else:
+ "@#ise-@#isw=(" & decimal(2(@#a++@#b)
+ + OptionValue@#("polymargin")) & ",0);",
+ "@#ine-@#ise=(0," & decimal(2(@#a++@#b)
+ + OptionValue@#("polymargin")) & ");",
+ fi
+ "save ys,op;numeric ys;",
+ "def op expr $=(.5(@#ine-@#inw)) rotated $ yscaled ys enddef;",
+ if OptionValue@#("fit"):
+ "ys=" & decimal((@#b+@#cdy)/(@#a+@#cdx)) & ";",
+ else:
+ "ys=1;",
+ fi
+ "save k;for k:=1 upto " & decimal nsides & ":",
+ "@#po[k]-.5(@#isw+@#ine)=op (" & decimal(OptionValue@#("angle")) &
+ "+(k-1)*(360/@#ns));",
+ "endfor;";
+ StandardTies;
+enddef;
+
+streamline("Polygon")("(expr v,nsides)","(v,nsides)");
+
+def BpathPolygon(suffix n)=
+ (for i:=1 upto n.po.n_: n.po[i]--endfor cycle)
+enddef;
+
+def drawPolygon(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawPictureOrObject(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+% These are all the options that can be used with a |Polygon|.
+setObjectDefaultOption("Polygon")("polymargin")(2mm);
+setObjectDefaultOption("Polygon")("angle")(0);
+setObjectDefaultOption("Polygon")("filled")(false);
+setObjectDefaultOption("Polygon")("fillcolor")(black);
+setObjectDefaultOption("Polygon")("framed")(true);
+setObjectDefaultOption("Polygon")("fit")(true);
+setObjectDefaultOption("Polygon")("framewidth")(.5bp);
+setObjectDefaultOption("Polygon")("framecolor")(black);
+setObjectDefaultOption("Polygon")("framestyle")("");
+setObjectDefaultOption("Polygon")("picturecolor")(black);
+setObjectDefaultOption("Polygon")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Polygon")("shadowcolor")(black);
+
+% a few common shortcuts:
+vardef newTriangle@#(expr v) text options=
+ newPolygon@#(v,3) options;
+enddef;
+
+vardef newSquare@#(expr v) text options=
+ newPolygon@#(v,4) options;
+enddef;
+
+vardef newPentagon@#(expr v) text options=
+ newPolygon@#(v,5) options;
+enddef;
+
+vardef newHexagon@#(expr v) text options=
+ newPolygon@#(v,6) options;
+enddef;
+
+vardef newHeptagon@#(expr v) text options=
+ newPolygon@#(v,7) options;
+enddef;
+
+vardef newOctagon@#(expr v) text options=
+ newPolygon@#(v,8) options;
+enddef;
+
+vardef newEnneagon@#(expr v) text options=
+ newPolygon@#(v,9) options;
+enddef;
+
+vardef newDecagon@#(expr v) text options=
+ newPolygon@#(v,10) options;
+enddef;
+
+
+% THESE SHORTCUTS SHOULD BE STREAMLINED (OR MAYBE NOT, TO DISCOURAGE THEIR USE
+% FOR THE MORE GENERIC newPolygon)
+
+
+%=====================================================================
+% Definitions specific to the |Ellipse| class
+
+% A constructor initializing the variable |p| (picture)
+% |@#| is a name for a box (must be a suffix)
+% |@#| will be the number of the box, but will also be used
+% as a prefix for other variables.
+vardef newEllipse@#(expr v) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Ellipse");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ if not OptionValue@#("fit"):
+ @#a:=max(@#a,@#b);@#b:=@#a; % circle
+ fi;
+ ObjNumeric cdx,cdy; % computed dx and dy
+ if (@#a=0) and (@#b=0):
+ @#cdx=@#cdy=OptionValue@#("circmargin");
+ else:
+ @#cdx=@#cdy=pathsel__(@#a,@#b)(max(@#a,@#b),OptionValue@#("circmargin"),
+ (@#a+d_,0){up}...(0,@#b+d_){left});
+ fi;
+ if not OptionValue@#("fit"):
+ % we draw a circle that fits horizontally
+ @#cdx:=OptionValue@#("circmargin");
+ @#cdy:=@#cdx;
+ fi;
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ "@#ise-@#isw=(" & decimal (2@#a+2*@#cdx) & ",0)",
+ "@#ine-@#ise=(0," & decimal (2@#b+2*@#cdy) & ")";
+ StandardTies;
+enddef;
+
+streamline("Ellipse")("(expr v)","(v)");
+
+% shortcut (PSTricks compatibility)
+def Toval_(expr p)=
+ new_Ellipse(p)
+enddef;
+
+% The function drawing the ellipse uses the current transformation
+% of the object to get the right shape. However, when doing so,
+% we can't use the current points, since the current transformation
+% applies to the initial points... We can either inverse
+% the current transform (using |inverse|) or use some information
+% stored on the initial status.
+vardef ellipse@#(expr a_,b_,c_,d_)=
+ (fullcircle
+ xscaled (2@#a+2*@#cdx)
+ yscaled (2@#b+2*@#cdy)
+ transformed @#ctransform_
+ shifted ((a_+c_)/2)
+ )
+enddef;
+
+def BpathEllipse(suffix n)=
+ ellipse.n(n.isw,n.ise,n.ine,n.inw)
+enddef;
+
+def drawEllipse(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawPictureOrObject(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("Ellipse")("circmargin")(2bp); % same value as in |boxes.mp|
+setObjectDefaultOption("Ellipse")("framed")(true);
+setObjectDefaultOption("Ellipse")("filled")(false);
+setObjectDefaultOption("Ellipse")("fillcolor")(black);
+setObjectDefaultOption("Ellipse")("fit")(true);
+setObjectDefaultOption("Ellipse")("framewidth")(.5bp);
+setObjectDefaultOption("Ellipse")("framecolor")(black);
+setObjectDefaultOption("Ellipse")("framestyle")("");
+setObjectDefaultOption("Ellipse")("picturecolor")(black);
+setObjectDefaultOption("Ellipse")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Ellipse")("shadowcolor")(black);
+
+
+%=====================================================================
+% Definitions specific to the |Circle| class
+
+vardef newCircle@#(expr v) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Circle");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ ObjNumeric cdx,cdy; % computed dx and dy
+ if (numeric v) or (picture v) or (string v): % object or picture
+ % correction of bug discovered by Stephan Hennig
+ % (comp.text.tex, 2004-03-18)
+ @#cdx=(@#a++@#b)+OptionValue@#("circmargin")-@#a;
+ %@#cdy=(@#a++@#b)+OptionValue@#("circmargin")-@#b; % DR 23/3/2004
+ @#cdy=@#cdx+@#a-@#b; % DR 23/3/2004
+ %@#cdx=@#cdy=pathsel__(@#a,@#b)(max(@#a,@#b),OptionValue@#("circmargin"),
+ % (@#a+d_,0){up}...(0,@#b+d_){left});
+ else:
+ @#cdx=@#cdy=OptionValue@#("circmargin");
+ fi;
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ % correction of bug discovered by Stephan Hennig
+ % (comp.text.tex, 2004-03-18)
+ % "@#ise-@#isw=(" & decimal(2*max(@#a,@#b)+2*@#cdx) % DR 23/3/2004
+ "@#ise-@#isw=(" & decimal(2*(@#a+@#cdx)) % DR 23/3/2004
+ %decimal(@#a++@#b+OptionValue@#("circmargin"))
+ & ",0)",
+ %"@#ine-@#ise=(0," & decimal(2*max(@#a,@#b)+2*@#cdy) % DR 23/3/2004
+ "@#ine-@#ise=(0," & decimal(2*(@#b+@#cdy)) % DR 23/3/2004
+ %decimal(@#a++@#b+OptionValue@#("circmargin"))
+ & ")";
+ StandardTies;
+enddef;
+
+streamline("Circle")("(expr v)","(v)");
+
+% shortcuts (PSTricks compatibility)
+def Tcircle_(expr p)=
+ new_Circle(p)
+enddef;
+
+% circle with a 1mm radius
+def Tc=
+ new_Circle_("")("circmargin(1mm)")
+enddef;
+
+def Tc_(expr s)=
+ new_Circle_("")("circmargin(" & decimal(s) & ")")
+enddef;
+
+% filled circle with a 1mm radius
+def TC=
+ new_Circle_("")("filled(true)","circmargin(1mm)")
+enddef;
+
+% default filled circle
+def TCs=
+ new_Circle_("")("filled(true)")
+enddef;
+
+def TC_(expr s)=
+ new_Circle_("")("filled(true)","circmargin(" & decimal(s) & ")")
+enddef;
+
+vardef circle@#(expr a_,b_,c_,d_)=
+ (fullcircle
+ scaled 2(@#a+@#cdx)
+ transformed @#ctransform_
+ shifted ((a_+c_)/2)
+ )
+enddef;
+
+def BpathCircle(suffix n)=
+ circle.n(n.isw,n.ise,n.ine,n.inw)
+enddef;
+
+def drawCircle(suffix n_)=
+ drawFramedOrFilledObject_(n_);
+ drawPictureOrObject(n_);
+ drawMemorizedPaths_(n_);
+enddef;
+
+setObjectDefaultOption("Circle")("circmargin")(2bp); % same value as in |boxes.mp|
+setObjectDefaultOption("Circle")("filled")(false);
+setObjectDefaultOption("Circle")("fillcolor")(black);
+setObjectDefaultOption("Circle")("framed")(true);
+setObjectDefaultOption("Circle")("framewidth")(.5bp);
+setObjectDefaultOption("Circle")("framecolor")(black);
+setObjectDefaultOption("Circle")("framestyle")("");
+setObjectDefaultOption("Circle")("picturecolor")(black);
+setObjectDefaultOption("Circle")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Circle")("shadowcolor")(black);
+
+%=====================================================================
+% Double Box
+vardef newDBox@#(expr v) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"DBox");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ if not OptionValue@#("fit"):
+ @#a:=max(@#a,@#b);@#b:=@#a; % square
+ fi;
+ ObjPoint swi,nwi,sei,nei;
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ % inner/outer:
+ "@#isw-@#swi=@#nei-@#ine=(-" & decimal(OptionValue@#("hsep")) & ",-" &
+ decimal(OptionValue@#("vsep")) & ");",
+ "@#ise-@#sei=@#nwi-@#inw=(" & decimal(OptionValue@#("hsep")) & ",-" &
+ decimal(OptionValue@#("vsep")) & ");",
+ % the size of the inner box is related to the size of its contents
+ "@#sei-@#swi=(" & decimal(2@#a+2*OptionValue@#("dx")) & ",0)",
+ "@#nei-@#sei=(0," & decimal(2@#b+2*OptionValue@#("dy")) & ")";
+ StandardTies;
+enddef;
+
+streamline("DBox")("(expr v)","(v)");
+
+def BpathDBox(suffix n)=StandardBpath(n) enddef;
+
+def drawDBox(suffix n)=
+ drawFramedOrFilledObject_(n);
+ if OptionValue.n("framed"):
+ draw n.swi--n.sei--n.nei--n.nwi--cycle
+ withcolor OptionValue.n("framecolor") sc_(OptionValue.n("framestyle"));
+ fi;
+ drawPictureOrObject(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("DBox")("filled")(false);
+setObjectDefaultOption("DBox")("fillcolor")(black);
+setObjectDefaultOption("DBox")("framed")(true);
+setObjectDefaultOption("DBox")("hsep")(1mm);
+setObjectDefaultOption("DBox")("vsep")(1mm);
+setObjectDefaultOption("DBox")("dx")(3bp); % same value as in |boxes.mp|
+setObjectDefaultOption("DBox")("dy")(3bp); % same value as in |boxes.mp|
+setObjectDefaultOption("DBox")("fit")(true);
+setObjectDefaultOption("DBox")("framewidth")(.5bp);
+setObjectDefaultOption("DBox")("framecolor")(black);
+setObjectDefaultOption("DBox")("framestyle")("");
+setObjectDefaultOption("DBox")("picturecolor")(black);
+setObjectDefaultOption("DBox")("shadow")(false); % no shadow by default
+setObjectDefaultOption("DBox")("shadowcolor")(black);
+
+%=====================================================================
+% Double Ellipse
+vardef newDEllipse@#(expr v) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"DEllipse");
+ StandardInterface;
+ StandardObjectOrPictureContainerSetup(v);
+ if not OptionValue@#("fit"):
+ @#a:=max(@#a,@#b);@#b:=@#a; % circle
+ fi;
+ ObjPoint swi,nwi,sei,nei;
+ ObjNumeric cdx,cdy; % computed dx and dy
+ @#a:=@#a+OptionValue@#("hsep");@#b:=@#b+OptionValue@#("vsep");
+ if (@#a=0) and (@#b=0):
+ @#cdx=@#cdy=OptionValue@#("circmargin");
+ else:
+ @#cdx=@#cdy=pathsel__(@#a,@#b)(max(@#a,@#b),OptionValue@#("circmargin"),
+ (@#a+d_,0){up}...(0,@#b+d_){left});
+ fi;
+ if not OptionValue@#("fit"):
+ % we draw a circle that fits horizontally
+ @#cdx:=OptionValue@#("circmargin");
+ @#cdy:=@#cdx;
+ fi;
+ ObjCode StandardEquations,
+ if numeric v:
+ ".5[@#isw,@#ine]=.5[obj(@#sub)ne,obj(@#sub)sw]", % object
+ elseif (picture v) or (string v):
+ ".5[@#isw,@#ine]=@#p.off", % picture offset
+ fi
+ % inner/outer:
+ "@#isw-@#swi=@#nei-@#ine=(-" & decimal(OptionValue@#("hsep")) & ",-" &
+ decimal(OptionValue@#("vsep")) & ");",
+ "@#ise-@#sei=@#nwi-@#inw=(" & decimal(OptionValue@#("hsep")) & ",-" &
+ decimal(OptionValue@#("vsep")) & ");",
+ "@#ise-@#isw=(" & decimal(2@#a+2*@#cdx) & ",0)",
+ "@#ine-@#ise=(0," & decimal(2@#b+2*@#cdx) & ")";
+ StandardTies;
+enddef;
+
+streamline("DEllipse")("(expr v)","(v)");
+
+vardef innerellipse@#(expr a_,b_,c_,d_)=
+ (fullcircle
+ xscaled (2@#a+2*@#cdx-2*OptionValue@#("hsep"))
+ yscaled (2@#b+2*@#cdx-2*OptionValue@#("vsep"))
+ transformed @#ctransform_
+ shifted ((a_+c_)/2)
+ )
+enddef;
+
+def BpathDEllipse(suffix n)=BpathEllipse(n) enddef;
+
+def drawDEllipse(suffix n)=
+ drawFramedOrFilledObject_(n);
+ if OptionValue.n("framed"):
+ draw innerellipse.n(n.swi,n.sei,n.nei,n.nwi)
+ withcolor OptionValue.n("framecolor") sc_(OptionValue.n("framestyle"));
+ fi;
+ drawPictureOrObject(n);
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("DEllipse")("circmargin")(2bp); % same value as in |boxes.mp|
+setObjectDefaultOption("DEllipse")("filled")(false);
+setObjectDefaultOption("DEllipse")("fillcolor")(black);
+setObjectDefaultOption("DEllipse")("framed")(true);
+setObjectDefaultOption("DEllipse")("hsep")(1mm);
+setObjectDefaultOption("DEllipse")("vsep")(1mm);
+setObjectDefaultOption("DEllipse")("fit")(true);
+setObjectDefaultOption("DEllipse")("framewidth")(.5bp);
+setObjectDefaultOption("DEllipse")("framecolor")(black);
+setObjectDefaultOption("DEllipse")("framestyle")("");
+setObjectDefaultOption("DEllipse")("picturecolor")(black);
+setObjectDefaultOption("DEllipse")("shadow")(false); % no shadow by default
+setObjectDefaultOption("DEllipse")("shadowcolor")(black);
+
+% It would of course be easy to create triple boxes, triple circles, etc.
+
+%=====================================================================
+% The Container class was suggested by Michael Schwarz
+% (<mi-schwarz@gmx.de>)
+% (Emails from May 20, 2006)
+% THIS CODE HAS NOT YET BEEN CHECKED (added October 8, 2006)
+% CODE IMPROVED ON December 3, 2006.
+
+setObjectDefaultOption("Container")("filled")(false);
+setObjectDefaultOption("Container")("fillcolor")(black);
+setObjectDefaultOption("Container")("framed")(false);
+setObjectDefaultOption("Container")("framewidth")(.5bp);
+setObjectDefaultOption("Container")("framecolor")(black);
+setObjectDefaultOption("Container")("framestyle")("");
+setObjectDefaultOption("Container")("shadow")(false);
+setObjectDefaultOption("Container")("shadowcolor")(black);
+setObjectDefaultOption("Container")("dx")(0);
+setObjectDefaultOption("Container")("dy")(0);
+
+vardef newContainer@#(text sublist) text options =
+ save i,topC, botC, lftC, rtC, topS, botS, lftS, rtS, floating,
+ n, firstsub, $;
+ boolean floating;
+ string firstsub;
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Container");
+ StandardInterface;
+
+ n:=0;
+ forsuffixes $=sublist:
+ if incr(n)=1 : firstsub:= str $; fi;
+ endfor;
+ ObjSubArray(sub_)(n); % |n| is the number of elements
+ i=0;
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sub_[i],$);
+ endfor;
+
+ if known(obj(firstsub).c):
+ floating := false;
+ else:
+ floating := true;
+ obj(firstsub).scantokens(firstPointOf_(firstsub)) = origin;
+ fi;
+
+ forsuffixes $=sublist:
+ topS := findrec_top_most.$;
+ botS := findrec_bot_most.$;
+ lftS := findrec_lft_most.$;
+ rtS := findrec_rt_most.$;
+ if known topC:
+ if topS > topC : topC := topS; fi;
+ else:
+ topC := topS;
+ fi;
+
+ if known botC:
+ if botS < botC : botC := botS; fi;
+ else:
+ botC := botS;
+ fi;
+
+ if known lftC:
+ if lftS < lftC : lftC := lftS; fi;
+ else:
+ lftC := lftS;
+ fi;
+
+ if known rtC:
+ if rtS > rtC : rtC := rtS; fi;
+ else:
+ rtC := rtS;
+ fi;
+ endfor;
+
+ ObjCode StandardEquations,
+ "@#nw = (" & decimal (lftC-OptionValue@#("dx")) & "," &
+ decimal (topC+OptionValue@#("dy")) & ")",
+ "@#se = (" & decimal (rtC+OptionValue@#("dx")) & "," &
+ decimal (botC-OptionValue@#("dy")) & ")";
+ StandardTies;
+ if floating: untieObj(@#); fi;
+enddef;
+
+streamline("Container")("(text t)")("suffixlist(t)");
+
+def BpathContainer(suffix n)= StandardBpath(n) enddef;
+
+vardef drawContainer(suffix n) =
+ save i;
+ drawFramedOrFilledObject_(n);
+ for i=1 upto n.sub_.n_:
+ drawObj(obj(n.sub_[i]));
+ endfor;
+ drawMemorizedPaths_(n);
+enddef;
+
+
+%=====================================================================
+% Definitions specific to the |BB| class (Bounding Box)
+% Sometimes, we want to make a new object hiding the positions
+% of an object. For instance, if we rotate an object upside down,
+% the |.s| component will be at the top, etc., and this is likely
+% to produce unwanted effects when such an object is a subobject
+% somewhere. One solution is to move the bounding points,
+% without moving the contents (with respect to the whole bounding box).
+% This may be a problem if the drawing macros of the object rely
+% on the bounding box (which would be bad practice).
+% So here we provide another solution which is simply a class
+% to encapsulate cleanly a strange object. This class merely adds a layer.
+%
+% The computation of the new bounding box only looks at the corners
+% of the object, not at other points or subobjects. |rebindObj| might
+% be used to ensure that nothing protrudes.
+
+vardef newBB@#(suffix t) text options=
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"BB");
+ StandardInterface;
+ SubObject(sub,t);
+ % We inject the following in the equations, using |obj(@#sub)|
+ % instead of |t|, so that |resetObj.expl|, or any other function
+ % using the object code, can reexecute the function code.
+ % |lftmost=find_lft_most.t;|
+ % |rtmost =find_rt_most.t;|
+ % |topmost=find_top_most.t;|
+ % |botmost=find_bot_most.t;|
+ % The equations are now:
+ % |xpart(@#nw)=xpart(obj(@#sub).obj(lftmost))|
+ % |xpart(@#ne)=xpart(obj(@#sub).obj(rtmost))|
+ % |ypart(@#nw)=ypart(obj(@#sub).obj(topmost))|
+ % |ypart(@#sw)=ypart(obj(@#sub).obj(botmost))|
+ % (the other points are found with the standard equations)
+ ObjCode StandardEquations,
+ "save lftmost,rtmost,topmost,botmost;",
+ "string lftmost,rtmost,topmost,botmost;",
+ "lftmost=find_lft_most.obj(@#sub);",
+ "rtmost =find_rt_most.obj(@#sub);",
+ "topmost=find_top_most.obj(@#sub);",
+ "botmost=find_bot_most.obj(@#sub);",
+ "xpart(@#inw)=xpart(obj(@#sub).obj(lftmost));",
+ "xpart(@#ine)=xpart(obj(@#sub).obj(rtmost));",
+ "ypart(@#inw)=ypart(obj(@#sub).obj(topmost));",
+ "ypart(@#isw)=ypart(obj(@#sub).obj(botmost));";
+ StandardTies;
+enddef;
+
+% create a streamlined version
+streamline("BB")("(expr t)","suffixpar(t)");
+
+def BpathBB(suffix n)= StandardBpath(n) enddef;
+
+def drawBB(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawObj(obj(n.sub));
+ drawMemorizedPaths_(n);
+enddef;
+
+setObjectDefaultOption("BB")("filled")(false);
+setObjectDefaultOption("BB")("fillcolor")(black);
+setObjectDefaultOption("BB")("framed")(false);
+setObjectDefaultOption("BB")("framewidth")(.5bp);
+setObjectDefaultOption("BB")("framecolor")(black);
+setObjectDefaultOption("BB")("framestyle")("");
+setObjectDefaultOption("BB")("shadow")(false); % no shadow by default
+setObjectDefaultOption("BB")("shadowcolor")(black);
+
+endinput
diff --git a/graphics/metapost/contrib/macros/metaobj/license.txt b/graphics/metapost/contrib/macros/metaobj/license.txt
new file mode 100644
index 0000000000..d79c68c99d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metaobj/license.txt
@@ -0,0 +1,9 @@
+METAOBJ
+
+This metapost package provides high-level object-oriented drawing.
+It can be seen as an approximate extension of boxes.mp.
+It implements many of PSTricks' features.
+
+It is released under the LPPL.
+
+Denis Roegel, 3 August 2003
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/README.md b/graphics/metapost/contrib/macros/metapost-colorbrewer/README.md
new file mode 100644
index 0000000000..973b68d633
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/README.md
@@ -0,0 +1,49 @@
+# metapost-colorbrewer
+
+An implementation of the colour palettes from http://colorbrewer2.org for Metapost
+
+The Colorbrewer palettes are copyright (c) Cynthia Brewer, Mark Harrower and The Pennsylvania State University.
+
+This implementation that makes them available for Metapost is copyright (c) 2018 Toby Thurston.
+
+Toby Thurston -- 18 Sept 2018
+
+## Provides
+
+- A Python script that reads "cb.csv" from https://github.com/axismaps/colorbrewer/
+ and creates a Metapost include-file that includes all the Colorbrewer definitions as
+ Metapost colors (cmyk or rgb, as you please)
+
+- colorbrewer-cmyk.mp
+- colorbrewer-rgb.mp
+- colorbrewer-sampler.mp
+
+![Colorbrewer Sampler](colorbrewer-sampler.png)
+
+## Usage
+
+(Assumes you are on osx, adapt as needed for windows, or linux).
+
+- git clone http://github.com/thruston/metapost-colorbrewer
+- mkdir -p ~/Library/texmf/metapost
+- cp metapost-colorbrewer/colorbrewer-cmyk.mp ~/Library/texmf/metapost
+- cp metapost-colorbrewer/colorbrewer-rgb.mp ~/Library/texmf/metapost
+
+and then look at metapost-colorbrewer/colorbrewer-sampler.mp for an example of
+how to use them. Once they are in your local texmf tree you just need to include
+them with "include colorbrewer-rgb" or "include colorbrewer-cmyk"
+
+## Licence
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-cmyk.mp b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-cmyk.mp
new file mode 100644
index 0000000000..0cd730869e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-cmyk.mp
@@ -0,0 +1,1739 @@
+% This package includes color specifications and designs
+% developed by Cynthia Brewer (http://colorbrewer.org/).
+% Metapost version adapted from cb.csv by Toby Thurston.
+% Please see license at http://colorbrewer.org/export/LICENSE.txt
+
+% This package defines all the colours from colorbrewer.org
+% Visit the site to get an idea what you can do with them
+% Each colour set is defined as a MP variable with two suffixes
+% The first suffix defines the number of colours in the set,
+% the second one defines the index of this colour in the set
+% starting at 1, so this loop shows you all the shades of red
+% in the six colour "Reds" set.
+%
+% for i=1 upto 6:
+% fill unitsquare scaled 1cm shifted (i*cm,0) withcolor Reds[6][i];
+% endfor
+%
+% Six of the qualititative colour sets have numbers in their names at colorbrewer.org
+% MP doesn't allow this, so they are renamed here as follows:
+%
+% Dark2 is called DarkTwo
+% Pastel1 is called PastelOne
+% Pastel2 is called PastelTwo
+% Set1 is called SetOne
+% Set2 is called SetTwo
+% Set3 is called SetThree
+%
+% No sequence has fewer than three colours.
+% All of the sequences are defined for upto eight colours.
+% The sequential sequences are defined for 3 to 9 colours each.
+% The divergent sequences are defined for 3 to 11 colours each.
+% A few of the qualitative sequences have upto 12 colours.
+%
+% In general try not to use too many colours in one chart.
+% The sequences were designed for cartography and may not suit all applications.
+
+message "metapost-colorbrewer - Copyright (C) 2018 Toby Thurston. This program comes with ABSOLUTELY NO WARRANTY. " &
+"This is free software, and you are welcome to redistribute it under certain conditions; read the LICENCE file for details. " &
+"The colorbrewer colours are copyright (C) Cynthia Brewer, Mark Harrower and The Pennsylvania State University. " &
+"See http://colorbrewer2.org";
+
+
+cmykcolor Accent[][], Blues[][], BrBG[][], BuGn[][], BuPu[][],
+ DarkTwo[][], GnBu[][], Greens[][], Greys[][], OrRd[][], Oranges[][],
+ PRGn[][], Paired[][], PastelOne[][], PastelTwo[][], PiYG[][],
+ PuBu[][], PuBuGn[][], PuOr[][], PuRd[][], Purples[][], RdBu[][],
+ RdGy[][], RdPu[][], RdYlBu[][], RdYlGn[][], Reds[][], SetOne[][],
+ SetThree[][], SetTwo[][], Spectral[][], YlGn[][], YlGnBu[][],
+ YlOrBr[][], YlOrRd[][];
+
+Accent[3][1] = 1/100 (50,0,50,0);
+Accent[3][2] = 1/100 (25,25,0,0);
+Accent[3][3] = 1/100 (0,25,40,0);
+Accent[4][1] = 1/100 (50,0,50,0);
+Accent[4][2] = 1/100 (25,25,0,0);
+Accent[4][3] = 1/100 (0,25,40,0);
+Accent[4][4] = 1/100 (0,0,40,0);
+Accent[5][1] = 1/100 (50,0,50,0);
+Accent[5][2] = 1/100 (25,25,0,0);
+Accent[5][3] = 1/100 (0,25,40,0);
+Accent[5][4] = 1/100 (0,0,40,0);
+Accent[5][5] = 1/100 (80,40,0,0);
+Accent[6][1] = 1/100 (50,0,50,0);
+Accent[6][2] = 1/100 (25,25,0,0);
+Accent[6][3] = 1/100 (0,25,40,0);
+Accent[6][4] = 1/100 (0,0,40,0);
+Accent[6][5] = 1/100 (80,40,0,0);
+Accent[6][6] = 1/100 (0,100,0,0);
+Accent[7][1] = 1/100 (50,0,50,0);
+Accent[7][2] = 1/100 (25,25,0,0);
+Accent[7][3] = 1/100 (0,25,40,0);
+Accent[7][4] = 1/100 (0,0,40,0);
+Accent[7][5] = 1/100 (80,40,0,0);
+Accent[7][6] = 1/100 (0,100,0,0);
+Accent[7][7] = 1/100 (25,60,90,0);
+Accent[8][1] = 1/100 (50,0,50,0);
+Accent[8][2] = 1/100 (25,25,0,0);
+Accent[8][3] = 1/100 (0,25,40,0);
+Accent[8][4] = 1/100 (0,0,40,0);
+Accent[8][5] = 1/100 (80,40,0,0);
+Accent[8][6] = 1/100 (0,100,0,0);
+Accent[8][7] = 1/100 (25,60,90,0);
+Accent[8][8] = 1/100 (0,0,0,60);
+Blues[3][1] = 1/100 (13,3,0,0);
+Blues[3][2] = 1/100 (38,8,0,0);
+Blues[3][3] = 1/100 (82,27,0,0);
+Blues[4][1] = 1/100 (8,2,0,0);
+Blues[4][2] = 1/100 (28,7,0,0);
+Blues[4][3] = 1/100 (57,14,0,0);
+Blues[4][4] = 1/100 (90,34,0,0);
+Blues[5][1] = 1/100 (8,2,0,0);
+Blues[5][2] = 1/100 (28,7,0,0);
+Blues[5][3] = 1/100 (57,14,0,0);
+Blues[5][4] = 1/100 (82,27,0,0);
+Blues[5][5] = 1/100 (100,45,0,7);
+Blues[6][1] = 1/100 (8,2,0,0);
+Blues[6][2] = 1/100 (24,6,0,0);
+Blues[6][3] = 1/100 (38,8,0,0);
+Blues[6][4] = 1/100 (57,14,0,0);
+Blues[6][5] = 1/100 (82,27,0,0);
+Blues[6][6] = 1/100 (100,45,0,7);
+Blues[7][1] = 1/100 (8,2,0,0);
+Blues[7][2] = 1/100 (24,6,0,0);
+Blues[7][3] = 1/100 (38,8,0,0);
+Blues[7][4] = 1/100 (57,14,0,0);
+Blues[7][5] = 1/100 (75,22,0,0);
+Blues[7][6] = 1/100 (90,34,0,0);
+Blues[7][7] = 1/100 (100,55,0,5);
+Blues[8][1] = 1/100 (3,1,0,0);
+Blues[8][2] = 1/100 (13,3,0,0);
+Blues[8][3] = 1/100 (24,6,0,0);
+Blues[8][4] = 1/100 (38,8,0,0);
+Blues[8][5] = 1/100 (57,14,0,0);
+Blues[8][6] = 1/100 (75,22,0,0);
+Blues[8][7] = 1/100 (90,34,0,0);
+Blues[8][8] = 1/100 (100,55,0,5);
+Blues[9][1] = 1/100 (3,1,0,0);
+Blues[9][2] = 1/100 (13,3,0,0);
+Blues[9][3] = 1/100 (24,6,0,0);
+Blues[9][4] = 1/100 (38,8,0,0);
+Blues[9][5] = 1/100 (57,14,0,0);
+Blues[9][6] = 1/100 (75,22,0,0);
+Blues[9][7] = 1/100 (90,34,0,0);
+Blues[9][8] = 1/100 (100,45,0,7);
+Blues[9][9] = 1/100 (100,55,0,30);
+BrBG[10][10] = 1/100 (100,30,70,40);
+BrBG[10][1] = 1/100 (45,60,100,40);
+BrBG[10][2] = 1/100 (45,60,100,0);
+BrBG[10][3] = 1/100 (25,43,80,0);
+BrBG[10][4] = 1/100 (12,20,45,0);
+BrBG[10][5] = 1/100 (3,8,20,0);
+BrBG[10][6] = 1/100 (22,0,6,0);
+BrBG[10][7] = 1/100 (50,0,17,0);
+BrBG[10][8] = 1/100 (80,12,35,0);
+BrBG[10][9] = 1/100 (100,30,60,0);
+BrBG[11][10] = 1/100 (100,30,60,0);
+BrBG[11][11] = 1/100 (100,30,70,40);
+BrBG[11][1] = 1/100 (45,60,100,40);
+BrBG[11][2] = 1/100 (45,60,100,0);
+BrBG[11][3] = 1/100 (25,43,80,0);
+BrBG[11][4] = 1/100 (12,20,45,0);
+BrBG[11][5] = 1/100 (3,8,20,0);
+BrBG[11][6] = 1/100 (0,0,0,5);
+BrBG[11][7] = 1/100 (22,0,6,0);
+BrBG[11][8] = 1/100 (50,0,17,0);
+BrBG[11][9] = 1/100 (80,12,35,0);
+BrBG[3][1] = 1/100 (15,25,55,0);
+BrBG[3][2] = 1/100 (0,0,0,5);
+BrBG[3][3] = 1/100 (65,5,23,0);
+BrBG[4][1] = 1/100 (35,55,90,0);
+BrBG[4][2] = 1/100 (12,20,45,0);
+BrBG[4][3] = 1/100 (50,0,17,0);
+BrBG[4][4] = 1/100 (100,10,55,0);
+BrBG[5][1] = 1/100 (35,55,90,0);
+BrBG[5][2] = 1/100 (12,20,45,0);
+BrBG[5][3] = 1/100 (0,0,0,5);
+BrBG[5][4] = 1/100 (50,0,17,0);
+BrBG[5][5] = 1/100 (100,10,55,0);
+BrBG[6][1] = 1/100 (45,60,100,0);
+BrBG[6][2] = 1/100 (15,25,55,0);
+BrBG[6][3] = 1/100 (3,8,20,0);
+BrBG[6][4] = 1/100 (22,0,6,0);
+BrBG[6][5] = 1/100 (65,5,23,0);
+BrBG[6][6] = 1/100 (100,30,60,0);
+BrBG[7][1] = 1/100 (45,60,100,0);
+BrBG[7][2] = 1/100 (15,25,55,0);
+BrBG[7][3] = 1/100 (3,8,20,0);
+BrBG[7][4] = 1/100 (0,0,0,5);
+BrBG[7][5] = 1/100 (22,0,6,0);
+BrBG[7][6] = 1/100 (65,5,23,0);
+BrBG[7][7] = 1/100 (100,30,60,0);
+BrBG[8][1] = 1/100 (45,60,100,0);
+BrBG[8][2] = 1/100 (25,43,80,0);
+BrBG[8][3] = 1/100 (12,20,45,0);
+BrBG[8][4] = 1/100 (3,8,20,0);
+BrBG[8][5] = 1/100 (22,0,6,0);
+BrBG[8][6] = 1/100 (50,0,17,0);
+BrBG[8][7] = 1/100 (80,12,35,0);
+BrBG[8][8] = 1/100 (100,30,60,0);
+BrBG[9][1] = 1/100 (45,60,100,0);
+BrBG[9][2] = 1/100 (25,43,80,0);
+BrBG[9][3] = 1/100 (12,20,45,0);
+BrBG[9][4] = 1/100 (3,8,20,0);
+BrBG[9][5] = 1/100 (0,0,0,5);
+BrBG[9][6] = 1/100 (22,0,6,0);
+BrBG[9][7] = 1/100 (50,0,17,0);
+BrBG[9][8] = 1/100 (80,12,35,0);
+BrBG[9][9] = 1/100 (100,30,60,0);
+BuGn[3][1] = 1/100 (10,0,0,0);
+BuGn[3][2] = 1/100 (40,0,15,0);
+BuGn[3][3] = 1/100 (83,0,70,0);
+BuGn[4][1] = 1/100 (7,0,0,0);
+BuGn[4][2] = 1/100 (30,0,5,0);
+BuGn[4][3] = 1/100 (60,0,30,0);
+BuGn[4][4] = 1/100 (87,10,83,0);
+BuGn[5][1] = 1/100 (7,0,0,0);
+BuGn[5][2] = 1/100 (30,0,5,0);
+BuGn[5][3] = 1/100 (60,0,30,0);
+BuGn[5][4] = 1/100 (83,0,70,0);
+BuGn[5][5] = 1/100 (100,20,100,0);
+BuGn[6][1] = 1/100 (7,0,0,0);
+BuGn[6][2] = 1/100 (20,0,6,0);
+BuGn[6][3] = 1/100 (40,0,15,0);
+BuGn[6][4] = 1/100 (60,0,30,0);
+BuGn[6][5] = 1/100 (83,0,70,0);
+BuGn[6][6] = 1/100 (100,20,100,0);
+BuGn[7][1] = 1/100 (7,0,0,0);
+BuGn[7][2] = 1/100 (20,0,6,0);
+BuGn[7][3] = 1/100 (40,0,15,0);
+BuGn[7][4] = 1/100 (60,0,30,0);
+BuGn[7][5] = 1/100 (75,0,55,0);
+BuGn[7][6] = 1/100 (87,10,83,0);
+BuGn[7][7] = 1/100 (100,35,100,0);
+BuGn[8][1] = 1/100 (3,0,0,0);
+BuGn[8][2] = 1/100 (10,0,0,0);
+BuGn[8][3] = 1/100 (20,0,6,0);
+BuGn[8][4] = 1/100 (40,0,15,0);
+BuGn[8][5] = 1/100 (60,0,30,0);
+BuGn[8][6] = 1/100 (75,0,55,0);
+BuGn[8][7] = 1/100 (87,10,83,0);
+BuGn[8][8] = 1/100 (100,35,100,0);
+BuGn[9][1] = 1/100 (3,0,0,0);
+BuGn[9][2] = 1/100 (10,0,0,0);
+BuGn[9][3] = 1/100 (20,0,6,0);
+BuGn[9][4] = 1/100 (40,0,15,0);
+BuGn[9][5] = 1/100 (60,0,30,0);
+BuGn[9][6] = 1/100 (75,0,55,0);
+BuGn[9][7] = 1/100 (87,10,83,0);
+BuGn[9][8] = 1/100 (100,20,100,0);
+BuGn[9][9] = 1/100 (100,50,100,0);
+BuPu[3][1] = 1/100 (12,3,0,0);
+BuPu[3][2] = 1/100 (38,14,0,0);
+BuPu[3][3] = 1/100 (47,60,0,0);
+BuPu[4][1] = 1/100 (7,0,0,0);
+BuPu[4][2] = 1/100 (30,10,0,0);
+BuPu[4][3] = 1/100 (45,30,0,0);
+BuPu[4][4] = 1/100 (47,70,0,0);
+BuPu[5][1] = 1/100 (7,0,0,0);
+BuPu[5][2] = 1/100 (30,10,0,0);
+BuPu[5][3] = 1/100 (45,30,0,0);
+BuPu[5][4] = 1/100 (47,60,0,0);
+BuPu[5][5] = 1/100 (47,95,0,5);
+BuPu[6][1] = 1/100 (7,0,0,0);
+BuPu[6][2] = 1/100 (25,9,0,0);
+BuPu[6][3] = 1/100 (38,14,0,0);
+BuPu[6][4] = 1/100 (45,30,0,0);
+BuPu[6][5] = 1/100 (47,60,0,0);
+BuPu[6][6] = 1/100 (47,95,0,5);
+BuPu[7][1] = 1/100 (7,0,0,0);
+BuPu[7][2] = 1/100 (25,9,0,0);
+BuPu[7][3] = 1/100 (38,14,0,0);
+BuPu[7][4] = 1/100 (45,30,0,0);
+BuPu[7][5] = 1/100 (45,50,0,0);
+BuPu[7][6] = 1/100 (47,70,0,0);
+BuPu[7][7] = 1/100 (50,100,0,15);
+BuPu[8][1] = 1/100 (3,0,0,0);
+BuPu[8][2] = 1/100 (12,3,0,0);
+BuPu[8][3] = 1/100 (25,9,0,0);
+BuPu[8][4] = 1/100 (38,14,0,0);
+BuPu[8][5] = 1/100 (45,30,0,0);
+BuPu[8][6] = 1/100 (45,50,0,0);
+BuPu[8][7] = 1/100 (47,70,0,0);
+BuPu[8][8] = 1/100 (50,100,0,15);
+BuPu[9][1] = 1/100 (3,0,0,0);
+BuPu[9][2] = 1/100 (12,3,0,0);
+BuPu[9][3] = 1/100 (25,9,0,0);
+BuPu[9][4] = 1/100 (38,14,0,0);
+BuPu[9][5] = 1/100 (45,30,0,0);
+BuPu[9][6] = 1/100 (45,50,0,0);
+BuPu[9][7] = 1/100 (47,70,0,0);
+BuPu[9][8] = 1/100 (47,95,0,5);
+BuPu[9][9] = 1/100 (50,100,0,40);
+DarkTwo[3][1] = 1/100 (90,0,55,0);
+DarkTwo[3][2] = 1/100 (15,60,100,0);
+DarkTwo[3][3] = 1/100 (55,45,0,0);
+DarkTwo[4][1] = 1/100 (90,0,55,0);
+DarkTwo[4][2] = 1/100 (15,60,100,0);
+DarkTwo[4][3] = 1/100 (55,45,0,0);
+DarkTwo[4][4] = 1/100 (5,85,5,0);
+DarkTwo[5][1] = 1/100 (90,0,55,0);
+DarkTwo[5][2] = 1/100 (15,60,100,0);
+DarkTwo[5][3] = 1/100 (55,45,0,0);
+DarkTwo[5][4] = 1/100 (5,85,5,0);
+DarkTwo[5][5] = 1/100 (60,10,100,0);
+DarkTwo[6][1] = 1/100 (90,0,55,0);
+DarkTwo[6][2] = 1/100 (15,60,100,0);
+DarkTwo[6][3] = 1/100 (55,45,0,0);
+DarkTwo[6][4] = 1/100 (5,85,5,0);
+DarkTwo[6][5] = 1/100 (60,10,100,0);
+DarkTwo[6][6] = 1/100 (10,30,100,0);
+DarkTwo[7][1] = 1/100 (90,0,55,0);
+DarkTwo[7][2] = 1/100 (15,60,100,0);
+DarkTwo[7][3] = 1/100 (55,45,0,0);
+DarkTwo[7][4] = 1/100 (5,85,5,0);
+DarkTwo[7][5] = 1/100 (60,10,100,0);
+DarkTwo[7][6] = 1/100 (10,30,100,0);
+DarkTwo[7][7] = 1/100 (35,45,90,0);
+DarkTwo[8][1] = 1/100 (90,0,55,0);
+DarkTwo[8][2] = 1/100 (15,60,100,0);
+DarkTwo[8][3] = 1/100 (55,45,0,0);
+DarkTwo[8][4] = 1/100 (5,85,5,0);
+DarkTwo[8][5] = 1/100 (60,10,100,0);
+DarkTwo[8][6] = 1/100 (10,30,100,0);
+DarkTwo[8][7] = 1/100 (35,45,90,0);
+DarkTwo[8][8] = 1/100 (0,0,0,60);
+GnBu[3][1] = 1/100 (12,0,12,0);
+GnBu[3][2] = 1/100 (34,0,25,0);
+GnBu[3][3] = 1/100 (75,12,0,0);
+GnBu[4][1] = 1/100 (6,0,8,0);
+GnBu[4][2] = 1/100 (27,0,23,0);
+GnBu[4][3] = 1/100 (52,0,15,0);
+GnBu[4][4] = 1/100 (80,20,0,0);
+GnBu[5][1] = 1/100 (6,0,8,0);
+GnBu[5][2] = 1/100 (27,0,23,0);
+GnBu[5][3] = 1/100 (52,0,15,0);
+GnBu[5][4] = 1/100 (75,12,0,0);
+GnBu[5][5] = 1/100 (100,35,0,0);
+GnBu[6][1] = 1/100 (6,0,8,0);
+GnBu[6][2] = 1/100 (20,0,20,0);
+GnBu[6][3] = 1/100 (34,0,25,0);
+GnBu[6][4] = 1/100 (52,0,15,0);
+GnBu[6][5] = 1/100 (75,12,0,0);
+GnBu[6][6] = 1/100 (100,35,0,0);
+GnBu[7][1] = 1/100 (6,0,8,0);
+GnBu[7][2] = 1/100 (20,0,20,0);
+GnBu[7][3] = 1/100 (34,0,25,0);
+GnBu[7][4] = 1/100 (52,0,15,0);
+GnBu[7][5] = 1/100 (70,5,0,0);
+GnBu[7][6] = 1/100 (85,20,0,0);
+GnBu[7][7] = 1/100 (100,42,0,5);
+GnBu[8][1] = 1/100 (3,0,5,0);
+GnBu[8][2] = 1/100 (12,0,12,0);
+GnBu[8][3] = 1/100 (20,0,20,0);
+GnBu[8][4] = 1/100 (34,0,25,0);
+GnBu[8][5] = 1/100 (52,0,15,0);
+GnBu[8][6] = 1/100 (70,5,0,0);
+GnBu[8][7] = 1/100 (85,20,0,0);
+GnBu[8][8] = 1/100 (100,42,0,5);
+GnBu[9][1] = 1/100 (3,0,5,0);
+GnBu[9][2] = 1/100 (12,0,12,0);
+GnBu[9][3] = 1/100 (20,0,20,0);
+GnBu[9][4] = 1/100 (34,0,25,0);
+GnBu[9][5] = 1/100 (52,0,15,0);
+GnBu[9][6] = 1/100 (70,5,0,0);
+GnBu[9][7] = 1/100 (85,20,0,0);
+GnBu[9][8] = 1/100 (100,35,0,0);
+GnBu[9][9] = 1/100 (100,50,0,20);
+Greens[3][1] = 1/100 (10,0,10,0);
+Greens[3][2] = 1/100 (37,0,37,0);
+Greens[3][3] = 1/100 (81,0,76,0);
+Greens[4][1] = 1/100 (7,0,7,0);
+Greens[4][2] = 1/100 (27,0,27,0);
+Greens[4][3] = 1/100 (55,0,55,0);
+Greens[4][4] = 1/100 (84,10,83,0);
+Greens[5][1] = 1/100 (7,0,7,0);
+Greens[5][2] = 1/100 (27,0,27,0);
+Greens[5][3] = 1/100 (55,0,55,0);
+Greens[5][4] = 1/100 (81,0,76,0);
+Greens[5][5] = 1/100 (100,20,100,0);
+Greens[6][1] = 1/100 (7,0,7,0);
+Greens[6][2] = 1/100 (22,0,22,0);
+Greens[6][3] = 1/100 (37,0,37,0);
+Greens[6][4] = 1/100 (55,0,55,0);
+Greens[6][5] = 1/100 (81,0,76,0);
+Greens[6][6] = 1/100 (100,20,100,0);
+Greens[7][1] = 1/100 (7,0,7,0);
+Greens[7][2] = 1/100 (22,0,22,0);
+Greens[7][3] = 1/100 (37,0,37,0);
+Greens[7][4] = 1/100 (55,0,55,0);
+Greens[7][5] = 1/100 (75,0,70,0);
+Greens[7][6] = 1/100 (87,10,83,0);
+Greens[7][7] = 1/100 (100,35,90,0);
+Greens[8][1] = 1/100 (3,0,3,0);
+Greens[8][2] = 1/100 (10,0,10,0);
+Greens[8][3] = 1/100 (22,0,22,0);
+Greens[8][4] = 1/100 (37,0,37,0);
+Greens[8][5] = 1/100 (55,0,55,0);
+Greens[8][6] = 1/100 (75,0,70,0);
+Greens[8][7] = 1/100 (87,10,83,0);
+Greens[8][8] = 1/100 (100,35,90,0);
+Greens[9][1] = 1/100 (3,0,3,0);
+Greens[9][2] = 1/100 (10,0,10,0);
+Greens[9][3] = 1/100 (22,0,22,0);
+Greens[9][4] = 1/100 (37,0,37,0);
+Greens[9][5] = 1/100 (55,0,55,0);
+Greens[9][6] = 1/100 (75,0,70,0);
+Greens[9][7] = 1/100 (87,10,83,0);
+Greens[9][8] = 1/100 (100,20,100,0);
+Greens[9][9] = 1/100 (100,50,100,0);
+Greys[3][1] = 1/100 (0,0,0,6);
+Greys[3][2] = 1/100 (0,0,0,26);
+Greys[3][3] = 1/100 (0,0,0,61);
+Greys[4][1] = 1/100 (0,0,0,3);
+Greys[4][2] = 1/100 (0,0,0,20);
+Greys[4][3] = 1/100 (0,0,0,41);
+Greys[4][4] = 1/100 (0,0,0,68);
+Greys[5][1] = 1/100 (0,0,0,3);
+Greys[5][2] = 1/100 (0,0,0,20);
+Greys[5][3] = 1/100 (0,0,0,41);
+Greys[5][4] = 1/100 (0,0,0,61);
+Greys[5][5] = 1/100 (0,0,0,85);
+Greys[6][1] = 1/100 (0,0,0,3);
+Greys[6][2] = 1/100 (0,0,0,15);
+Greys[6][3] = 1/100 (0,0,0,26);
+Greys[6][4] = 1/100 (0,0,0,41);
+Greys[6][5] = 1/100 (0,0,0,61);
+Greys[6][6] = 1/100 (0,0,0,85);
+Greys[7][1] = 1/100 (0,0,0,3);
+Greys[7][2] = 1/100 (0,0,0,15);
+Greys[7][3] = 1/100 (0,0,0,26);
+Greys[7][4] = 1/100 (0,0,0,41);
+Greys[7][5] = 1/100 (0,0,0,55);
+Greys[7][6] = 1/100 (0,0,0,68);
+Greys[7][7] = 1/100 (0,0,0,85);
+Greys[8][1] = 1/100 (0,0,0,0);
+Greys[8][2] = 1/100 (0,0,0,6);
+Greys[8][3] = 1/100 (0,0,0,15);
+Greys[8][4] = 1/100 (0,0,0,26);
+Greys[8][5] = 1/100 (0,0,0,41);
+Greys[8][6] = 1/100 (0,0,0,55);
+Greys[8][7] = 1/100 (0,0,0,68);
+Greys[8][8] = 1/100 (0,0,0,85);
+Greys[9][1] = 1/100 (0,0,0,0);
+Greys[9][2] = 1/100 (0,0,0,6);
+Greys[9][3] = 1/100 (0,0,0,15);
+Greys[9][4] = 1/100 (0,0,0,26);
+Greys[9][5] = 1/100 (0,0,0,41);
+Greys[9][6] = 1/100 (0,0,0,55);
+Greys[9][7] = 1/100 (0,0,0,68);
+Greys[9][8] = 1/100 (0,0,0,85);
+Greys[9][9] = 1/100 (0,0,0,100);
+OrRd[3][1] = 1/100 (0,9,18,0);
+OrRd[3][2] = 1/100 (0,27,40,0);
+OrRd[3][3] = 1/100 (10,70,70,0);
+OrRd[4][1] = 1/100 (0,6,12,0);
+OrRd[4][2] = 1/100 (0,20,40,0);
+OrRd[4][3] = 1/100 (0,45,55,0);
+OrRd[4][4] = 1/100 (15,80,80,0);
+OrRd[5][1] = 1/100 (0,6,12,0);
+OrRd[5][2] = 1/100 (0,20,40,0);
+OrRd[5][3] = 1/100 (0,45,55,0);
+OrRd[5][4] = 1/100 (10,70,70,0);
+OrRd[5][5] = 1/100 (30,100,100,0);
+OrRd[6][1] = 1/100 (0,6,12,0);
+OrRd[6][2] = 1/100 (0,17,32,0);
+OrRd[6][3] = 1/100 (0,27,40,0);
+OrRd[6][4] = 1/100 (0,45,55,0);
+OrRd[6][5] = 1/100 (10,70,70,0);
+OrRd[6][6] = 1/100 (30,100,100,0);
+OrRd[7][1] = 1/100 (0,6,12,0);
+OrRd[7][2] = 1/100 (0,17,32,0);
+OrRd[7][3] = 1/100 (0,27,40,0);
+OrRd[7][4] = 1/100 (0,45,55,0);
+OrRd[7][5] = 1/100 (5,60,60,0);
+OrRd[7][6] = 1/100 (15,80,80,0);
+OrRd[7][7] = 1/100 (40,100,100,0);
+OrRd[8][1] = 1/100 (0,3,6,0);
+OrRd[8][2] = 1/100 (0,9,18,0);
+OrRd[8][3] = 1/100 (0,17,32,0);
+OrRd[8][4] = 1/100 (0,27,40,0);
+OrRd[8][5] = 1/100 (0,45,55,0);
+OrRd[8][6] = 1/100 (5,60,60,0);
+OrRd[8][7] = 1/100 (15,80,80,0);
+OrRd[8][8] = 1/100 (40,100,100,0);
+OrRd[9][1] = 1/100 (0,3,6,0);
+OrRd[9][2] = 1/100 (0,9,18,0);
+OrRd[9][3] = 1/100 (0,17,32,0);
+OrRd[9][4] = 1/100 (0,27,40,0);
+OrRd[9][5] = 1/100 (0,45,55,0);
+OrRd[9][6] = 1/100 (5,60,60,0);
+OrRd[9][7] = 1/100 (15,80,80,0);
+OrRd[9][8] = 1/100 (30,100,100,0);
+OrRd[9][9] = 1/100 (50,100,100,0);
+Oranges[3][1] = 1/100 (0,10,15,0);
+Oranges[3][2] = 1/100 (0,32,50,0);
+Oranges[3][3] = 1/100 (10,65,95,0);
+Oranges[4][1] = 1/100 (0,7,10,0);
+Oranges[4][2] = 1/100 (0,26,40,0);
+Oranges[4][3] = 1/100 (0,45,70,0);
+Oranges[4][4] = 1/100 (15,70,100,0);
+Oranges[5][1] = 1/100 (0,7,10,0);
+Oranges[5][2] = 1/100 (0,26,40,0);
+Oranges[5][3] = 1/100 (0,45,70,0);
+Oranges[5][4] = 1/100 (10,65,95,0);
+Oranges[5][5] = 1/100 (35,75,100,0);
+Oranges[6][1] = 1/100 (0,7,10,0);
+Oranges[6][2] = 1/100 (0,19,30,0);
+Oranges[6][3] = 1/100 (0,32,50,0);
+Oranges[6][4] = 1/100 (0,45,70,0);
+Oranges[6][5] = 1/100 (10,65,95,0);
+Oranges[6][6] = 1/100 (35,75,100,0);
+Oranges[7][1] = 1/100 (0,7,10,0);
+Oranges[7][2] = 1/100 (0,19,30,0);
+Oranges[7][3] = 1/100 (0,32,50,0);
+Oranges[7][4] = 1/100 (0,45,70,0);
+Oranges[7][5] = 1/100 (5,58,90,0);
+Oranges[7][6] = 1/100 (15,70,100,0);
+Oranges[7][7] = 1/100 (45,78,100,0);
+Oranges[8][1] = 1/100 (0,4,6,0);
+Oranges[8][2] = 1/100 (0,10,15,0);
+Oranges[8][3] = 1/100 (0,19,30,0);
+Oranges[8][4] = 1/100 (0,32,50,0);
+Oranges[8][5] = 1/100 (0,45,70,0);
+Oranges[8][6] = 1/100 (5,58,90,0);
+Oranges[8][7] = 1/100 (15,70,100,0);
+Oranges[8][8] = 1/100 (45,78,100,0);
+Oranges[9][1] = 1/100 (0,4,6,0);
+Oranges[9][2] = 1/100 (0,10,15,0);
+Oranges[9][3] = 1/100 (0,19,30,0);
+Oranges[9][4] = 1/100 (0,32,50,0);
+Oranges[9][5] = 1/100 (0,45,70,0);
+Oranges[9][6] = 1/100 (5,58,90,0);
+Oranges[9][7] = 1/100 (15,70,100,0);
+Oranges[9][8] = 1/100 (35,75,100,0);
+Oranges[9][9] = 1/100 (50,80,100,0);
+PRGn[10][10] = 1/100 (100,50,100,0);
+PRGn[10][1] = 1/100 (60,100,0,40);
+PRGn[10][2] = 1/100 (55,80,10,0);
+PRGn[10][3] = 1/100 (40,49,5,0);
+PRGn[10][4] = 1/100 (23,30,0,0);
+PRGn[10][5] = 1/100 (9,14,0,0);
+PRGn[10][6] = 1/100 (15,0,15,0);
+PRGn[10][7] = 1/100 (35,0,35,0);
+PRGn[10][8] = 1/100 (65,5,65,0);
+PRGn[10][9] = 1/100 (90,20,90,0);
+PRGn[11][10] = 1/100 (90,20,90,0);
+PRGn[11][11] = 1/100 (100,50,100,0);
+PRGn[11][1] = 1/100 (60,100,0,40);
+PRGn[11][2] = 1/100 (55,80,10,0);
+PRGn[11][3] = 1/100 (40,49,5,0);
+PRGn[11][4] = 1/100 (23,30,0,0);
+PRGn[11][5] = 1/100 (9,14,0,0);
+PRGn[11][6] = 1/100 (0,0,0,3);
+PRGn[11][7] = 1/100 (15,0,15,0);
+PRGn[11][8] = 1/100 (35,0,35,0);
+PRGn[11][9] = 1/100 (65,5,65,0);
+PRGn[3][1] = 1/100 (31,38,0,0);
+PRGn[3][2] = 1/100 (0,0,0,3);
+PRGn[3][3] = 1/100 (50,5,50,0);
+PRGn[4][1] = 1/100 (53,77,0,0);
+PRGn[4][2] = 1/100 (23,30,0,0);
+PRGn[4][3] = 1/100 (35,0,35,0);
+PRGn[4][4] = 1/100 (100,0,100,0);
+PRGn[5][1] = 1/100 (53,77,0,0);
+PRGn[5][2] = 1/100 (23,30,0,0);
+PRGn[5][3] = 1/100 (0,0,0,3);
+PRGn[5][4] = 1/100 (35,0,35,0);
+PRGn[5][5] = 1/100 (100,0,100,0);
+PRGn[6][1] = 1/100 (55,80,10,0);
+PRGn[6][2] = 1/100 (31,38,0,0);
+PRGn[6][3] = 1/100 (9,14,0,0);
+PRGn[6][4] = 1/100 (15,0,15,0);
+PRGn[6][5] = 1/100 (50,5,50,0);
+PRGn[6][6] = 1/100 (90,20,90,0);
+PRGn[7][1] = 1/100 (55,80,10,0);
+PRGn[7][2] = 1/100 (31,38,0,0);
+PRGn[7][3] = 1/100 (9,14,0,0);
+PRGn[7][4] = 1/100 (0,0,0,3);
+PRGn[7][5] = 1/100 (15,0,15,0);
+PRGn[7][6] = 1/100 (50,5,50,0);
+PRGn[7][7] = 1/100 (90,20,90,0);
+PRGn[8][1] = 1/100 (55,80,10,0);
+PRGn[8][2] = 1/100 (40,49,5,0);
+PRGn[8][3] = 1/100 (23,30,0,0);
+PRGn[8][4] = 1/100 (9,14,0,0);
+PRGn[8][5] = 1/100 (15,0,15,0);
+PRGn[8][6] = 1/100 (35,0,35,0);
+PRGn[8][7] = 1/100 (65,5,65,0);
+PRGn[8][8] = 1/100 (90,20,90,0);
+PRGn[9][1] = 1/100 (55,80,10,0);
+PRGn[9][2] = 1/100 (40,49,5,0);
+PRGn[9][3] = 1/100 (23,30,0,0);
+PRGn[9][4] = 1/100 (9,14,0,0);
+PRGn[9][5] = 1/100 (0,0,0,3);
+PRGn[9][6] = 1/100 (15,0,15,0);
+PRGn[9][7] = 1/100 (35,0,35,0);
+PRGn[9][8] = 1/100 (65,5,65,0);
+PRGn[9][9] = 1/100 (90,20,90,0);
+Paired[10][10] = 1/100 (60,70,0,0);
+Paired[10][1] = 1/100 (35,7,0,0);
+Paired[10][2] = 1/100 (90,30,0,0);
+Paired[10][3] = 1/100 (30,0,45,0);
+Paired[10][4] = 1/100 (80,0,100,0);
+Paired[10][5] = 1/100 (0,40,25,0);
+Paired[10][6] = 1/100 (10,90,80,0);
+Paired[10][7] = 1/100 (0,25,50,0);
+Paired[10][8] = 1/100 (0,50,100,0);
+Paired[10][9] = 1/100 (20,25,0,0);
+Paired[11][10] = 1/100 (60,70,0,0);
+Paired[11][11] = 1/100 (0,0,40,0);
+Paired[11][1] = 1/100 (35,7,0,0);
+Paired[11][2] = 1/100 (90,30,0,0);
+Paired[11][3] = 1/100 (30,0,45,0);
+Paired[11][4] = 1/100 (80,0,100,0);
+Paired[11][5] = 1/100 (0,40,25,0);
+Paired[11][6] = 1/100 (10,90,80,0);
+Paired[11][7] = 1/100 (0,25,50,0);
+Paired[11][8] = 1/100 (0,50,100,0);
+Paired[11][9] = 1/100 (20,25,0,0);
+Paired[12][10] = 1/100 (60,70,0,0);
+Paired[12][11] = 1/100 (0,0,40,0);
+Paired[12][12] = 1/100 (23,73,98,12);
+Paired[12][1] = 1/100 (35,7,0,0);
+Paired[12][2] = 1/100 (90,30,0,0);
+Paired[12][3] = 1/100 (30,0,45,0);
+Paired[12][4] = 1/100 (80,0,100,0);
+Paired[12][5] = 1/100 (0,40,25,0);
+Paired[12][6] = 1/100 (10,90,80,0);
+Paired[12][7] = 1/100 (0,25,50,0);
+Paired[12][8] = 1/100 (0,50,100,0);
+Paired[12][9] = 1/100 (20,25,0,0);
+Paired[3][1] = 1/100 (35,7,0,0);
+Paired[3][2] = 1/100 (90,30,0,0);
+Paired[3][3] = 1/100 (30,0,45,0);
+Paired[4][1] = 1/100 (35,7,0,0);
+Paired[4][2] = 1/100 (90,30,0,0);
+Paired[4][3] = 1/100 (30,0,45,0);
+Paired[4][4] = 1/100 (80,0,100,0);
+Paired[5][1] = 1/100 (35,7,0,0);
+Paired[5][2] = 1/100 (90,30,0,0);
+Paired[5][3] = 1/100 (30,0,45,0);
+Paired[5][4] = 1/100 (80,0,100,0);
+Paired[5][5] = 1/100 (0,40,25,0);
+Paired[6][1] = 1/100 (35,7,0,0);
+Paired[6][2] = 1/100 (90,30,0,0);
+Paired[6][3] = 1/100 (30,0,45,0);
+Paired[6][4] = 1/100 (80,0,100,0);
+Paired[6][5] = 1/100 (0,40,25,0);
+Paired[6][6] = 1/100 (10,90,80,0);
+Paired[7][1] = 1/100 (35,7,0,0);
+Paired[7][2] = 1/100 (90,30,0,0);
+Paired[7][3] = 1/100 (30,0,45,0);
+Paired[7][4] = 1/100 (80,0,100,0);
+Paired[7][5] = 1/100 (0,40,25,0);
+Paired[7][6] = 1/100 (10,90,80,0);
+Paired[7][7] = 1/100 (0,25,50,0);
+Paired[8][1] = 1/100 (35,7,0,0);
+Paired[8][2] = 1/100 (90,30,0,0);
+Paired[8][3] = 1/100 (30,0,45,0);
+Paired[8][4] = 1/100 (80,0,100,0);
+Paired[8][5] = 1/100 (0,40,25,0);
+Paired[8][6] = 1/100 (10,90,80,0);
+Paired[8][7] = 1/100 (0,25,50,0);
+Paired[8][8] = 1/100 (0,50,100,0);
+Paired[9][1] = 1/100 (35,7,0,0);
+Paired[9][2] = 1/100 (90,30,0,0);
+Paired[9][3] = 1/100 (30,0,45,0);
+Paired[9][4] = 1/100 (80,0,100,0);
+Paired[9][5] = 1/100 (0,40,25,0);
+Paired[9][6] = 1/100 (10,90,80,0);
+Paired[9][7] = 1/100 (0,25,50,0);
+Paired[9][8] = 1/100 (0,50,100,0);
+Paired[9][9] = 1/100 (20,25,0,0);
+PastelOne[3][1] = 1/100 (0,30,20,0);
+PastelOne[3][2] = 1/100 (30,10,0,0);
+PastelOne[3][3] = 1/100 (20,0,20,0);
+PastelOne[4][1] = 1/100 (0,30,20,0);
+PastelOne[4][2] = 1/100 (30,10,0,0);
+PastelOne[4][3] = 1/100 (20,0,20,0);
+PastelOne[4][4] = 1/100 (12,17,0,0);
+PastelOne[5][1] = 1/100 (0,30,20,0);
+PastelOne[5][2] = 1/100 (30,10,0,0);
+PastelOne[5][3] = 1/100 (20,0,20,0);
+PastelOne[5][4] = 1/100 (12,17,0,0);
+PastelOne[5][5] = 1/100 (0,15,30,0);
+PastelOne[6][1] = 1/100 (0,30,20,0);
+PastelOne[6][2] = 1/100 (30,10,0,0);
+PastelOne[6][3] = 1/100 (20,0,20,0);
+PastelOne[6][4] = 1/100 (12,17,0,0);
+PastelOne[6][5] = 1/100 (0,15,30,0);
+PastelOne[6][6] = 1/100 (0,0,20,0);
+PastelOne[7][1] = 1/100 (0,30,20,0);
+PastelOne[7][2] = 1/100 (30,10,0,0);
+PastelOne[7][3] = 1/100 (20,0,20,0);
+PastelOne[7][4] = 1/100 (12,17,0,0);
+PastelOne[7][5] = 1/100 (0,15,30,0);
+PastelOne[7][6] = 1/100 (0,0,20,0);
+PastelOne[7][7] = 1/100 (10,12,20,0);
+PastelOne[8][1] = 1/100 (0,30,20,0);
+PastelOne[8][2] = 1/100 (30,10,0,0);
+PastelOne[8][3] = 1/100 (20,0,20,0);
+PastelOne[8][4] = 1/100 (12,17,0,0);
+PastelOne[8][5] = 1/100 (0,15,30,0);
+PastelOne[8][6] = 1/100 (0,0,20,0);
+PastelOne[8][7] = 1/100 (10,12,20,0);
+PastelOne[8][8] = 1/100 (0,15,0,0);
+PastelOne[9][1] = 1/100 (0,30,20,0);
+PastelOne[9][2] = 1/100 (30,10,0,0);
+PastelOne[9][3] = 1/100 (20,0,20,0);
+PastelOne[9][4] = 1/100 (12,17,0,0);
+PastelOne[9][5] = 1/100 (0,15,30,0);
+PastelOne[9][6] = 1/100 (0,0,20,0);
+PastelOne[9][7] = 1/100 (10,12,20,0);
+PastelOne[9][8] = 1/100 (0,15,0,0);
+PastelOne[9][9] = 1/100 (0,0,0,5);
+PastelTwo[3][1] = 1/100 (30,0,15,0);
+PastelTwo[3][2] = 1/100 (0,20,25,0);
+PastelTwo[3][3] = 1/100 (20,10,0,0);
+PastelTwo[4][1] = 1/100 (30,0,15,0);
+PastelTwo[4][2] = 1/100 (0,20,25,0);
+PastelTwo[4][3] = 1/100 (20,10,0,0);
+PastelTwo[4][4] = 1/100 (3,20,0,0);
+PastelTwo[5][1] = 1/100 (30,0,15,0);
+PastelTwo[5][2] = 1/100 (0,20,25,0);
+PastelTwo[5][3] = 1/100 (20,10,0,0);
+PastelTwo[5][4] = 1/100 (3,20,0,0);
+PastelTwo[5][5] = 1/100 (10,0,20,0);
+PastelTwo[6][1] = 1/100 (30,0,15,0);
+PastelTwo[6][2] = 1/100 (0,20,25,0);
+PastelTwo[6][3] = 1/100 (20,10,0,0);
+PastelTwo[6][4] = 1/100 (3,20,0,0);
+PastelTwo[6][5] = 1/100 (10,0,20,0);
+PastelTwo[6][6] = 1/100 (0,5,30,0);
+PastelTwo[7][1] = 1/100 (30,0,15,0);
+PastelTwo[7][2] = 1/100 (0,20,25,0);
+PastelTwo[7][3] = 1/100 (20,10,0,0);
+PastelTwo[7][4] = 1/100 (3,20,0,0);
+PastelTwo[7][5] = 1/100 (10,0,20,0);
+PastelTwo[7][6] = 1/100 (0,5,30,0);
+PastelTwo[7][7] = 1/100 (5,10,15,0);
+PastelTwo[8][1] = 1/100 (30,0,15,0);
+PastelTwo[8][2] = 1/100 (0,20,25,0);
+PastelTwo[8][3] = 1/100 (20,10,0,0);
+PastelTwo[8][4] = 1/100 (3,20,0,0);
+PastelTwo[8][5] = 1/100 (10,0,20,0);
+PastelTwo[8][6] = 1/100 (0,5,30,0);
+PastelTwo[8][7] = 1/100 (5,10,15,0);
+PastelTwo[8][8] = 1/100 (0,0,0,20);
+PiYG[10][10] = 1/100 (75,0,100,40);
+PiYG[10][1] = 1/100 (10,100,0,35);
+PiYG[10][2] = 1/100 (20,90,10,0);
+PiYG[10][3] = 1/100 (11,52,6,0);
+PiYG[10][4] = 1/100 (4,28,0,0);
+PiYG[10][5] = 1/100 (0,12,0,0);
+PiYG[10][6] = 1/100 (10,0,17,0);
+PiYG[10][7] = 1/100 (28,0,47,0);
+PiYG[10][8] = 1/100 (50,5,80,0);
+PiYG[10][9] = 1/100 (70,15,100,0);
+PiYG[11][10] = 1/100 (70,15,100,0);
+PiYG[11][11] = 1/100 (75,0,100,40);
+PiYG[11][1] = 1/100 (10,100,0,35);
+PiYG[11][2] = 1/100 (20,90,10,0);
+PiYG[11][3] = 1/100 (11,52,6,0);
+PiYG[11][4] = 1/100 (4,28,0,0);
+PiYG[11][5] = 1/100 (0,12,0,0);
+PiYG[11][6] = 1/100 (0,0,0,3);
+PiYG[11][7] = 1/100 (10,0,17,0);
+PiYG[11][8] = 1/100 (28,0,47,0);
+PiYG[11][9] = 1/100 (50,5,80,0);
+PiYG[3][1] = 1/100 (7,35,3,0);
+PiYG[3][2] = 1/100 (0,0,0,3);
+PiYG[3][3] = 1/100 (37,0,60,0);
+PiYG[4][1] = 1/100 (15,90,0,0);
+PiYG[4][2] = 1/100 (4,28,0,0);
+PiYG[4][3] = 1/100 (28,0,47,0);
+PiYG[4][4] = 1/100 (70,0,100,0);
+PiYG[5][1] = 1/100 (15,90,0,0);
+PiYG[5][2] = 1/100 (4,28,0,0);
+PiYG[5][3] = 1/100 (0,0,0,3);
+PiYG[5][4] = 1/100 (28,0,47,0);
+PiYG[5][5] = 1/100 (70,0,100,0);
+PiYG[6][1] = 1/100 (20,90,10,0);
+PiYG[6][2] = 1/100 (7,35,3,0);
+PiYG[6][3] = 1/100 (0,12,0,0);
+PiYG[6][4] = 1/100 (10,0,17,0);
+PiYG[6][5] = 1/100 (37,0,60,0);
+PiYG[6][6] = 1/100 (70,15,100,0);
+PiYG[7][1] = 1/100 (20,90,10,0);
+PiYG[7][2] = 1/100 (7,35,3,0);
+PiYG[7][3] = 1/100 (0,12,0,0);
+PiYG[7][4] = 1/100 (0,0,0,3);
+PiYG[7][5] = 1/100 (10,0,17,0);
+PiYG[7][6] = 1/100 (37,0,60,0);
+PiYG[7][7] = 1/100 (70,15,100,0);
+PiYG[8][1] = 1/100 (20,90,10,0);
+PiYG[8][2] = 1/100 (11,52,6,0);
+PiYG[8][3] = 1/100 (4,28,0,0);
+PiYG[8][4] = 1/100 (0,12,0,0);
+PiYG[8][5] = 1/100 (10,0,17,0);
+PiYG[8][6] = 1/100 (28,0,47,0);
+PiYG[8][7] = 1/100 (50,5,80,0);
+PiYG[8][8] = 1/100 (70,15,100,0);
+PiYG[9][1] = 1/100 (20,90,10,0);
+PiYG[9][2] = 1/100 (11,52,6,0);
+PiYG[9][3] = 1/100 (4,28,0,0);
+PiYG[9][4] = 1/100 (0,12,0,0);
+PiYG[9][5] = 1/100 (0,0,0,3);
+PiYG[9][6] = 1/100 (10,0,17,0);
+PiYG[9][7] = 1/100 (28,0,47,0);
+PiYG[9][8] = 1/100 (50,5,80,0);
+PiYG[9][9] = 1/100 (70,15,100,0);
+PuBuGn[3][1] = 1/100 (7,9,0,0);
+PuBuGn[3][2] = 1/100 (35,15,0,0);
+PuBuGn[3][3] = 1/100 (90,12,27,0);
+PuBuGn[4][1] = 1/100 (3,5,0,0);
+PuBuGn[4][2] = 1/100 (26,13,0,0);
+PuBuGn[4][3] = 1/100 (60,15,0,0);
+PuBuGn[4][4] = 1/100 (100,15,35,0);
+PuBuGn[5][1] = 1/100 (3,5,0,0);
+PuBuGn[5][2] = 1/100 (26,13,0,0);
+PuBuGn[5][3] = 1/100 (60,15,0,0);
+PuBuGn[5][4] = 1/100 (90,12,27,0);
+PuBuGn[5][5] = 1/100 (100,25,65,0);
+PuBuGn[6][1] = 1/100 (3,5,0,0);
+PuBuGn[6][2] = 1/100 (18,12,0,0);
+PuBuGn[6][3] = 1/100 (35,15,0,0);
+PuBuGn[6][4] = 1/100 (60,15,0,0);
+PuBuGn[6][5] = 1/100 (90,12,27,0);
+PuBuGn[6][6] = 1/100 (100,25,65,0);
+PuBuGn[7][1] = 1/100 (3,5,0,0);
+PuBuGn[7][2] = 1/100 (18,12,0,0);
+PuBuGn[7][3] = 1/100 (35,15,0,0);
+PuBuGn[7][4] = 1/100 (60,15,0,0);
+PuBuGn[7][5] = 1/100 (80,20,0,0);
+PuBuGn[7][6] = 1/100 (100,15,35,0);
+PuBuGn[7][7] = 1/100 (100,30,70,0);
+PuBuGn[8][1] = 1/100 (0,3,0,0);
+PuBuGn[8][2] = 1/100 (7,9,0,0);
+PuBuGn[8][3] = 1/100 (18,12,0,0);
+PuBuGn[8][4] = 1/100 (35,15,0,0);
+PuBuGn[8][5] = 1/100 (60,15,0,0);
+PuBuGn[8][6] = 1/100 (80,20,0,0);
+PuBuGn[8][7] = 1/100 (100,15,35,0);
+PuBuGn[8][8] = 1/100 (100,30,70,0);
+PuBuGn[9][1] = 1/100 (0,3,0,0);
+PuBuGn[9][2] = 1/100 (7,9,0,0);
+PuBuGn[9][3] = 1/100 (18,12,0,0);
+PuBuGn[9][4] = 1/100 (35,15,0,0);
+PuBuGn[9][5] = 1/100 (60,15,0,0);
+PuBuGn[9][6] = 1/100 (80,20,0,0);
+PuBuGn[9][7] = 1/100 (100,15,35,0);
+PuBuGn[9][8] = 1/100 (100,25,65,0);
+PuBuGn[9][9] = 1/100 (100,50,80,0);
+PuBu[3][1] = 1/100 (7,7,0,0);
+PuBu[3][2] = 1/100 (35,15,0,0);
+PuBu[3][3] = 1/100 (85,20,0,0);
+PuBu[4][1] = 1/100 (5,5,0,0);
+PuBu[4][2] = 1/100 (26,13,0,0);
+PuBu[4][3] = 1/100 (55,17,0,0);
+PuBu[4][4] = 1/100 (100,30,0,0);
+PuBu[5][1] = 1/100 (5,5,0,0);
+PuBu[5][2] = 1/100 (26,13,0,0);
+PuBu[5][3] = 1/100 (55,17,0,0);
+PuBu[5][4] = 1/100 (85,20,0,0);
+PuBu[5][5] = 1/100 (100,30,0,20);
+PuBu[6][1] = 1/100 (5,5,0,0);
+PuBu[6][2] = 1/100 (18,12,0,0);
+PuBu[6][3] = 1/100 (35,15,0,0);
+PuBu[6][4] = 1/100 (55,17,0,0);
+PuBu[6][5] = 1/100 (85,20,0,0);
+PuBu[6][6] = 1/100 (100,30,0,20);
+PuBu[7][1] = 1/100 (5,5,0,0);
+PuBu[7][2] = 1/100 (18,12,0,0);
+PuBu[7][3] = 1/100 (35,15,0,0);
+PuBu[7][4] = 1/100 (55,17,0,0);
+PuBu[7][5] = 1/100 (80,20,0,0);
+PuBu[7][6] = 1/100 (100,30,0,0);
+PuBu[7][7] = 1/100 (100,30,0,30);
+PuBu[8][1] = 1/100 (0,3,0,0);
+PuBu[8][2] = 1/100 (7,7,0,0);
+PuBu[8][3] = 1/100 (18,12,0,0);
+PuBu[8][4] = 1/100 (35,15,0,0);
+PuBu[8][5] = 1/100 (55,17,0,0);
+PuBu[8][6] = 1/100 (80,20,0,0);
+PuBu[8][7] = 1/100 (100,30,0,0);
+PuBu[8][8] = 1/100 (100,30,0,30);
+PuBu[9][1] = 1/100 (0,3,0,0);
+PuBu[9][2] = 1/100 (7,7,0,0);
+PuBu[9][3] = 1/100 (18,12,0,0);
+PuBu[9][4] = 1/100 (35,15,0,0);
+PuBu[9][5] = 1/100 (55,17,0,0);
+PuBu[9][6] = 1/100 (80,20,0,0);
+PuBu[9][7] = 1/100 (100,30,0,0);
+PuBu[9][8] = 1/100 (100,30,0,20);
+PuBu[9][9] = 1/100 (100,30,0,50);
+PuOr[10][10] = 1/100 (75,100,0,40);
+PuOr[10][1] = 1/100 (50,70,100,0);
+PuOr[10][2] = 1/100 (30,60,100,0);
+PuOr[10][3] = 1/100 (12,46,92,0);
+PuOr[10][4] = 1/100 (0,28,55,0);
+PuOr[10][5] = 1/100 (0,12,24,0);
+PuOr[10][6] = 1/100 (15,10,0,0);
+PuOr[10][7] = 1/100 (30,25,0,0);
+PuOr[10][8] = 1/100 (50,45,5,0);
+PuOr[10][9] = 1/100 (70,80,5,0);
+PuOr[11][10] = 1/100 (70,80,5,0);
+PuOr[11][11] = 1/100 (75,100,0,40);
+PuOr[11][1] = 1/100 (50,70,100,0);
+PuOr[11][2] = 1/100 (30,60,100,0);
+PuOr[11][3] = 1/100 (12,46,92,0);
+PuOr[11][4] = 1/100 (0,28,55,0);
+PuOr[11][5] = 1/100 (0,12,24,0);
+PuOr[11][6] = 1/100 (0,0,0,3);
+PuOr[11][7] = 1/100 (15,10,0,0);
+PuOr[11][8] = 1/100 (30,25,0,0);
+PuOr[11][9] = 1/100 (50,45,5,0);
+PuOr[3][1] = 1/100 (5,35,70,0);
+PuOr[3][2] = 1/100 (0,0,0,3);
+PuOr[3][3] = 1/100 (40,35,0,0);
+PuOr[4][1] = 1/100 (10,60,100,0);
+PuOr[4][2] = 1/100 (0,28,55,0);
+PuOr[4][3] = 1/100 (30,25,0,0);
+PuOr[4][4] = 1/100 (65,70,0,0);
+PuOr[5][1] = 1/100 (10,60,100,0);
+PuOr[5][2] = 1/100 (0,28,55,0);
+PuOr[5][3] = 1/100 (0,0,0,3);
+PuOr[5][4] = 1/100 (30,25,0,0);
+PuOr[5][5] = 1/100 (65,70,0,0);
+PuOr[6][1] = 1/100 (30,60,100,0);
+PuOr[6][2] = 1/100 (5,35,70,0);
+PuOr[6][3] = 1/100 (0,12,24,0);
+PuOr[6][4] = 1/100 (15,10,0,0);
+PuOr[6][5] = 1/100 (40,35,0,0);
+PuOr[6][6] = 1/100 (70,80,5,0);
+PuOr[7][1] = 1/100 (30,60,100,0);
+PuOr[7][2] = 1/100 (5,35,70,0);
+PuOr[7][3] = 1/100 (0,12,24,0);
+PuOr[7][4] = 1/100 (0,0,0,3);
+PuOr[7][5] = 1/100 (15,10,0,0);
+PuOr[7][6] = 1/100 (40,35,0,0);
+PuOr[7][7] = 1/100 (70,80,5,0);
+PuOr[8][1] = 1/100 (30,60,100,0);
+PuOr[8][2] = 1/100 (12,46,92,0);
+PuOr[8][3] = 1/100 (0,28,55,0);
+PuOr[8][4] = 1/100 (0,12,24,0);
+PuOr[8][5] = 1/100 (15,10,0,0);
+PuOr[8][6] = 1/100 (30,25,0,0);
+PuOr[8][7] = 1/100 (50,45,5,0);
+PuOr[8][8] = 1/100 (70,80,5,0);
+PuOr[9][1] = 1/100 (30,60,100,0);
+PuOr[9][2] = 1/100 (12,46,92,0);
+PuOr[9][3] = 1/100 (0,28,55,0);
+PuOr[9][4] = 1/100 (0,12,24,0);
+PuOr[9][5] = 1/100 (0,0,0,3);
+PuOr[9][6] = 1/100 (15,10,0,0);
+PuOr[9][7] = 1/100 (30,25,0,0);
+PuOr[9][8] = 1/100 (50,45,5,0);
+PuOr[9][9] = 1/100 (70,80,5,0);
+PuRd[3][1] = 1/100 (9,9,0,0);
+PuRd[3][2] = 1/100 (20,38,0,0);
+PuRd[3][3] = 1/100 (10,90,15,0);
+PuRd[4][1] = 1/100 (5,5,0,0);
+PuRd[4][2] = 1/100 (15,25,0,0);
+PuRd[4][3] = 1/100 (10,60,0,0);
+PuRd[4][4] = 1/100 (17,95,35,0);
+PuRd[5][1] = 1/100 (5,5,0,0);
+PuRd[5][2] = 1/100 (15,25,0,0);
+PuRd[5][3] = 1/100 (10,60,0,0);
+PuRd[5][4] = 1/100 (10,90,15,0);
+PuRd[5][5] = 1/100 (40,100,47,0);
+PuRd[6][1] = 1/100 (5,5,0,0);
+PuRd[6][2] = 1/100 (16,23,0,0);
+PuRd[6][3] = 1/100 (20,38,0,0);
+PuRd[6][4] = 1/100 (10,60,0,0);
+PuRd[6][5] = 1/100 (10,90,15,0);
+PuRd[6][6] = 1/100 (40,100,47,0);
+PuRd[7][1] = 1/100 (5,5,0,0);
+PuRd[7][2] = 1/100 (16,23,0,0);
+PuRd[7][3] = 1/100 (20,38,0,0);
+PuRd[7][4] = 1/100 (10,60,0,0);
+PuRd[7][5] = 1/100 (5,85,5,0);
+PuRd[7][6] = 1/100 (17,95,35,0);
+PuRd[7][7] = 1/100 (43,100,50,0);
+PuRd[8][1] = 1/100 (3,3,0,0);
+PuRd[8][2] = 1/100 (9,9,0,0);
+PuRd[8][3] = 1/100 (16,23,0,0);
+PuRd[8][4] = 1/100 (20,38,0,0);
+PuRd[8][5] = 1/100 (10,60,0,0);
+PuRd[8][6] = 1/100 (5,85,5,0);
+PuRd[8][7] = 1/100 (17,95,35,0);
+PuRd[8][8] = 1/100 (43,100,50,0);
+PuRd[9][1] = 1/100 (3,3,0,0);
+PuRd[9][2] = 1/100 (9,9,0,0);
+PuRd[9][3] = 1/100 (16,23,0,0);
+PuRd[9][4] = 1/100 (20,38,0,0);
+PuRd[9][5] = 1/100 (10,60,0,0);
+PuRd[9][6] = 1/100 (5,85,5,0);
+PuRd[9][7] = 1/100 (17,95,35,0);
+PuRd[9][8] = 1/100 (40,100,47,0);
+PuRd[9][9] = 1/100 (60,100,75,0);
+Purples[3][1] = 1/100 (6,5,0,0);
+Purples[3][2] = 1/100 (28,18,0,0);
+Purples[3][3] = 1/100 (55,48,0,0);
+Purples[4][1] = 1/100 (5,4,0,0);
+Purples[4][2] = 1/100 (20,15,0,0);
+Purples[4][3] = 1/100 (38,30,0,0);
+Purples[4][4] = 1/100 (60,60,0,0);
+Purples[5][1] = 1/100 (5,4,0,0);
+Purples[5][2] = 1/100 (20,15,0,0);
+Purples[5][3] = 1/100 (38,30,0,0);
+Purples[5][4] = 1/100 (55,48,0,0);
+Purples[5][5] = 1/100 (70,80,0,0);
+Purples[6][1] = 1/100 (5,4,0,0);
+Purples[6][2] = 1/100 (14,10,0,0);
+Purples[6][3] = 1/100 (26,18,0,0);
+Purples[6][4] = 1/100 (38,30,0,0);
+Purples[6][5] = 1/100 (55,48,0,0);
+Purples[6][6] = 1/100 (70,80,0,0);
+Purples[7][1] = 1/100 (5,4,0,0);
+Purples[7][2] = 1/100 (14,10,0,0);
+Purples[7][3] = 1/100 (26,18,0,0);
+Purples[7][4] = 1/100 (38,30,0,0);
+Purples[7][5] = 1/100 (50,40,0,0);
+Purples[7][6] = 1/100 (60,60,0,0);
+Purples[7][7] = 1/100 (75,90,0,0);
+Purples[8][1] = 1/100 (1,1,0,0);
+Purples[8][2] = 1/100 (6,5,0,0);
+Purples[8][3] = 1/100 (14,10,0,0);
+Purples[8][4] = 1/100 (26,18,0,0);
+Purples[8][5] = 1/100 (38,30,0,0);
+Purples[8][6] = 1/100 (50,40,0,0);
+Purples[8][7] = 1/100 (60,60,0,0);
+Purples[8][8] = 1/100 (75,90,0,0);
+Purples[9][1] = 1/100 (1,1,0,0);
+Purples[9][2] = 1/100 (6,5,0,0);
+Purples[9][3] = 1/100 (14,10,0,0);
+Purples[9][4] = 1/100 (26,18,0,0);
+Purples[9][5] = 1/100 (38,30,0,0);
+Purples[9][6] = 1/100 (50,40,0,0);
+Purples[9][7] = 1/100 (60,60,0,0);
+Purples[9][8] = 1/100 (70,80,0,0);
+Purples[9][9] = 1/100 (80,100,0,0);
+RdBu[10][10] = 1/100 (100,50,0,40);
+RdBu[10][1] = 1/100 (60,100,75,0);
+RdBu[10][2] = 1/100 (30,90,70,0);
+RdBu[10][3] = 1/100 (15,60,57,0);
+RdBu[10][4] = 1/100 (3,35,38,0);
+RdBu[10][5] = 1/100 (0,14,16,0);
+RdBu[10][6] = 1/100 (18,4,0,0);
+RdBu[10][7] = 1/100 (43,8,0,0);
+RdBu[10][8] = 1/100 (75,20,0,0);
+RdBu[10][9] = 1/100 (90,40,0,0);
+RdBu[11][10] = 1/100 (90,40,0,0);
+RdBu[11][11] = 1/100 (100,50,0,40);
+RdBu[11][1] = 1/100 (60,100,75,0);
+RdBu[11][2] = 1/100 (30,90,70,0);
+RdBu[11][3] = 1/100 (15,60,57,0);
+RdBu[11][4] = 1/100 (3,35,38,0);
+RdBu[11][5] = 1/100 (0,14,16,0);
+RdBu[11][6] = 1/100 (0,0,0,3);
+RdBu[11][7] = 1/100 (18,4,0,0);
+RdBu[11][8] = 1/100 (43,8,0,0);
+RdBu[11][9] = 1/100 (75,20,0,0);
+RdBu[3][1] = 1/100 (5,45,50,0);
+RdBu[3][2] = 1/100 (0,0,0,3);
+RdBu[3][3] = 1/100 (60,15,0,0);
+RdBu[4][1] = 1/100 (20,100,75,0);
+RdBu[4][2] = 1/100 (3,35,38,0);
+RdBu[4][3] = 1/100 (43,8,0,0);
+RdBu[4][4] = 1/100 (100,30,0,0);
+RdBu[5][1] = 1/100 (20,100,75,0);
+RdBu[5][2] = 1/100 (3,35,38,0);
+RdBu[5][3] = 1/100 (0,0,0,3);
+RdBu[5][4] = 1/100 (43,8,0,0);
+RdBu[5][5] = 1/100 (100,30,0,0);
+RdBu[6][1] = 1/100 (30,90,70,0);
+RdBu[6][2] = 1/100 (5,45,50,0);
+RdBu[6][3] = 1/100 (0,14,16,0);
+RdBu[6][4] = 1/100 (18,4,0,0);
+RdBu[6][5] = 1/100 (60,15,0,0);
+RdBu[6][6] = 1/100 (90,40,0,0);
+RdBu[7][1] = 1/100 (30,90,70,0);
+RdBu[7][2] = 1/100 (5,45,50,0);
+RdBu[7][3] = 1/100 (0,14,16,0);
+RdBu[7][4] = 1/100 (0,0,0,3);
+RdBu[7][5] = 1/100 (18,4,0,0);
+RdBu[7][6] = 1/100 (60,15,0,0);
+RdBu[7][7] = 1/100 (90,40,0,0);
+RdBu[8][1] = 1/100 (30,90,70,0);
+RdBu[8][2] = 1/100 (15,60,57,0);
+RdBu[8][3] = 1/100 (3,35,38,0);
+RdBu[8][4] = 1/100 (0,14,16,0);
+RdBu[8][5] = 1/100 (18,4,0,0);
+RdBu[8][6] = 1/100 (43,8,0,0);
+RdBu[8][7] = 1/100 (75,20,0,0);
+RdBu[8][8] = 1/100 (90,40,0,0);
+RdBu[9][1] = 1/100 (30,90,70,0);
+RdBu[9][2] = 1/100 (15,60,57,0);
+RdBu[9][3] = 1/100 (3,35,38,0);
+RdBu[9][4] = 1/100 (0,14,16,0);
+RdBu[9][5] = 1/100 (0,0,0,3);
+RdBu[9][6] = 1/100 (18,4,0,0);
+RdBu[9][7] = 1/100 (43,8,0,0);
+RdBu[9][8] = 1/100 (75,20,0,0);
+RdBu[9][9] = 1/100 (90,40,0,0);
+RdGy[10][10] = 1/100 (0,0,0,90);
+RdGy[10][1] = 1/100 (60,100,75,0);
+RdGy[10][2] = 1/100 (30,90,70,0);
+RdGy[10][3] = 1/100 (15,60,57,0);
+RdGy[10][4] = 1/100 (3,35,38,0);
+RdGy[10][5] = 1/100 (0,14,16,0);
+RdGy[10][6] = 1/100 (0,0,0,12);
+RdGy[10][7] = 1/100 (0,0,0,27);
+RdGy[10][8] = 1/100 (0,0,0,47);
+RdGy[10][9] = 1/100 (0,0,0,70);
+RdGy[11][10] = 1/100 (0,0,0,70);
+RdGy[11][11] = 1/100 (0,0,0,90);
+RdGy[11][1] = 1/100 (60,100,75,0);
+RdGy[11][2] = 1/100 (30,90,70,0);
+RdGy[11][3] = 1/100 (15,60,57,0);
+RdGy[11][4] = 1/100 (3,35,38,0);
+RdGy[11][5] = 1/100 (0,14,16,0);
+RdGy[11][6] = 1/100 (0,0,0,0);
+RdGy[11][7] = 1/100 (0,0,0,12);
+RdGy[11][8] = 1/100 (0,0,0,27);
+RdGy[11][9] = 1/100 (0,0,0,47);
+RdGy[3][1] = 1/100 (5,45,50,0);
+RdGy[3][2] = 1/100 (0,0,0,0);
+RdGy[3][3] = 1/100 (0,0,0,40);
+RdGy[4][1] = 1/100 (20,100,75,0);
+RdGy[4][2] = 1/100 (3,35,38,0);
+RdGy[4][3] = 1/100 (0,0,0,27);
+RdGy[4][4] = 1/100 (0,0,0,75);
+RdGy[5][1] = 1/100 (20,100,75,0);
+RdGy[5][2] = 1/100 (3,35,38,0);
+RdGy[5][3] = 1/100 (0,0,0,0);
+RdGy[5][4] = 1/100 (0,0,0,27);
+RdGy[5][5] = 1/100 (0,0,0,75);
+RdGy[6][1] = 1/100 (30,90,70,0);
+RdGy[6][2] = 1/100 (5,45,50,0);
+RdGy[6][3] = 1/100 (0,14,16,0);
+RdGy[6][4] = 1/100 (0,0,0,12);
+RdGy[6][5] = 1/100 (0,0,0,40);
+RdGy[6][6] = 1/100 (0,0,0,70);
+RdGy[7][1] = 1/100 (30,90,70,0);
+RdGy[7][2] = 1/100 (5,45,50,0);
+RdGy[7][3] = 1/100 (0,14,16,0);
+RdGy[7][4] = 1/100 (0,0,0,0);
+RdGy[7][5] = 1/100 (0,0,0,12);
+RdGy[7][6] = 1/100 (0,0,0,40);
+RdGy[7][7] = 1/100 (0,0,0,70);
+RdGy[8][1] = 1/100 (30,90,70,0);
+RdGy[8][2] = 1/100 (15,60,57,0);
+RdGy[8][3] = 1/100 (3,35,38,0);
+RdGy[8][4] = 1/100 (0,14,16,0);
+RdGy[8][5] = 1/100 (0,0,0,12);
+RdGy[8][6] = 1/100 (0,0,0,27);
+RdGy[8][7] = 1/100 (0,0,0,47);
+RdGy[8][8] = 1/100 (0,0,0,70);
+RdGy[9][1] = 1/100 (30,90,70,0);
+RdGy[9][2] = 1/100 (15,60,57,0);
+RdGy[9][3] = 1/100 (3,35,38,0);
+RdGy[9][4] = 1/100 (0,14,16,0);
+RdGy[9][5] = 1/100 (0,0,0,0);
+RdGy[9][6] = 1/100 (0,0,0,12);
+RdGy[9][7] = 1/100 (0,0,0,27);
+RdGy[9][8] = 1/100 (0,0,0,47);
+RdGy[9][9] = 1/100 (0,0,0,70);
+RdPu[3][1] = 1/100 (0,12,8,0);
+RdPu[3][2] = 1/100 (0,38,12,0);
+RdPu[3][3] = 1/100 (20,90,0,0);
+RdPu[4][1] = 1/100 (0,8,8,0);
+RdPu[4][2] = 1/100 (0,30,15,0);
+RdPu[4][3] = 1/100 (0,60,10,0);
+RdPu[4][4] = 1/100 (30,100,0,0);
+RdPu[5][1] = 1/100 (0,8,8,0);
+RdPu[5][2] = 1/100 (0,30,15,0);
+RdPu[5][3] = 1/100 (0,60,10,0);
+RdPu[5][4] = 1/100 (20,90,0,0);
+RdPu[5][5] = 1/100 (50,100,0,5);
+RdPu[6][1] = 1/100 (0,8,8,0);
+RdPu[6][2] = 1/100 (0,23,15,0);
+RdPu[6][3] = 1/100 (0,38,12,0);
+RdPu[6][4] = 1/100 (0,60,10,0);
+RdPu[6][5] = 1/100 (20,90,0,0);
+RdPu[6][6] = 1/100 (50,100,0,5);
+RdPu[7][1] = 1/100 (0,8,8,0);
+RdPu[7][2] = 1/100 (0,23,15,0);
+RdPu[7][3] = 1/100 (0,38,12,0);
+RdPu[7][4] = 1/100 (0,60,10,0);
+RdPu[7][5] = 1/100 (10,80,0,0);
+RdPu[7][6] = 1/100 (30,100,0,0);
+RdPu[7][7] = 1/100 (50,100,0,5);
+RdPu[8][1] = 1/100 (0,3,3,0);
+RdPu[8][2] = 1/100 (0,12,8,0);
+RdPu[8][3] = 1/100 (0,23,15,0);
+RdPu[8][4] = 1/100 (0,38,12,0);
+RdPu[8][5] = 1/100 (0,60,10,0);
+RdPu[8][6] = 1/100 (10,80,0,0);
+RdPu[8][7] = 1/100 (30,100,0,0);
+RdPu[8][8] = 1/100 (50,100,0,5);
+RdPu[9][1] = 1/100 (0,3,3,0);
+RdPu[9][2] = 1/100 (0,12,8,0);
+RdPu[9][3] = 1/100 (0,23,15,0);
+RdPu[9][4] = 1/100 (0,38,12,0);
+RdPu[9][5] = 1/100 (0,60,10,0);
+RdPu[9][6] = 1/100 (10,80,0,0);
+RdPu[9][7] = 1/100 (30,100,0,0);
+RdPu[9][8] = 1/100 (50,100,0,5);
+RdPu[9][9] = 1/100 (70,100,0,15);
+RdYlBu[10][10] = 1/100 (85,70,0,0);
+RdYlBu[10][1] = 1/100 (35,100,70,0);
+RdYlBu[10][2] = 1/100 (15,80,75,0);
+RdYlBu[10][3] = 1/100 (3,57,63,0);
+RdYlBu[10][4] = 1/100 (0,32,55,0);
+RdYlBu[10][5] = 1/100 (0,12,40,0);
+RdYlBu[10][6] = 1/100 (12,0,0,0);
+RdYlBu[10][7] = 1/100 (33,3,0,0);
+RdYlBu[10][8] = 1/100 (55,15,0,0);
+RdYlBu[10][9] = 1/100 (75,37,0,0);
+RdYlBu[11][10] = 1/100 (75,37,0,0);
+RdYlBu[11][11] = 1/100 (85,70,0,0);
+RdYlBu[11][1] = 1/100 (35,100,70,0);
+RdYlBu[11][2] = 1/100 (15,80,75,0);
+RdYlBu[11][3] = 1/100 (3,57,63,0);
+RdYlBu[11][4] = 1/100 (0,35,55,0);
+RdYlBu[11][5] = 1/100 (0,12,40,0);
+RdYlBu[11][6] = 1/100 (0,0,25,0);
+RdYlBu[11][7] = 1/100 (12,0,0,0);
+RdYlBu[11][8] = 1/100 (33,3,0,0);
+RdYlBu[11][9] = 1/100 (55,15,0,0);
+RdYlBu[3][1] = 1/100 (0,45,55,0);
+RdYlBu[3][2] = 1/100 (0,0,25,0);
+RdYlBu[3][3] = 1/100 (43,11,0,0);
+RdYlBu[4][1] = 1/100 (15,90,80,0);
+RdYlBu[4][2] = 1/100 (0,32,55,0);
+RdYlBu[4][3] = 1/100 (33,3,0,0);
+RdYlBu[4][4] = 1/100 (85,30,0,0);
+RdYlBu[5][1] = 1/100 (15,90,80,0);
+RdYlBu[5][2] = 1/100 (0,32,55,0);
+RdYlBu[5][3] = 1/100 (0,0,25,0);
+RdYlBu[5][4] = 1/100 (33,3,0,0);
+RdYlBu[5][5] = 1/100 (85,30,0,0);
+RdYlBu[6][1] = 1/100 (15,80,75,0);
+RdYlBu[6][2] = 1/100 (0,45,55,0);
+RdYlBu[6][3] = 1/100 (0,12,40,0);
+RdYlBu[6][4] = 1/100 (12,0,0,0);
+RdYlBu[6][5] = 1/100 (43,11,0,0);
+RdYlBu[6][6] = 1/100 (75,37,0,0);
+RdYlBu[7][1] = 1/100 (15,80,75,0);
+RdYlBu[7][2] = 1/100 (0,45,55,0);
+RdYlBu[7][3] = 1/100 (0,12,40,0);
+RdYlBu[7][4] = 1/100 (0,0,25,0);
+RdYlBu[7][5] = 1/100 (12,0,0,0);
+RdYlBu[7][6] = 1/100 (43,11,0,0);
+RdYlBu[7][7] = 1/100 (75,37,0,0);
+RdYlBu[8][1] = 1/100 (15,80,75,0);
+RdYlBu[8][2] = 1/100 (3,57,63,0);
+RdYlBu[8][3] = 1/100 (0,32,55,0);
+RdYlBu[8][4] = 1/100 (0,12,40,0);
+RdYlBu[8][5] = 1/100 (12,0,0,0);
+RdYlBu[8][6] = 1/100 (33,3,0,0);
+RdYlBu[8][7] = 1/100 (55,15,0,0);
+RdYlBu[8][8] = 1/100 (75,37,0,0);
+RdYlBu[9][1] = 1/100 (15,80,75,0);
+RdYlBu[9][2] = 1/100 (3,57,63,0);
+RdYlBu[9][3] = 1/100 (0,32,55,0);
+RdYlBu[9][4] = 1/100 (0,12,40,0);
+RdYlBu[9][5] = 1/100 (0,0,25,0);
+RdYlBu[9][6] = 1/100 (12,0,0,0);
+RdYlBu[9][7] = 1/100 (33,3,0,0);
+RdYlBu[9][8] = 1/100 (55,15,0,0);
+RdYlBu[9][9] = 1/100 (75,37,0,0);
+RdYlGn[10][10] = 1/100 (100,25,90,0);
+RdYlGn[10][1] = 1/100 (35,100,70,0);
+RdYlGn[10][2] = 1/100 (15,80,75,0);
+RdYlGn[10][3] = 1/100 (3,57,63,0);
+RdYlGn[10][4] = 1/100 (0,32,55,0);
+RdYlGn[10][5] = 1/100 (0,12,42,0);
+RdYlGn[10][6] = 1/100 (15,0,45,0);
+RdYlGn[10][7] = 1/100 (35,0,60,0);
+RdYlGn[10][8] = 1/100 (60,0,65,0);
+RdYlGn[10][9] = 1/100 (90,0,80,0);
+RdYlGn[11][10] = 1/100 (90,0,80,0);
+RdYlGn[11][11] = 1/100 (100,25,90,0);
+RdYlGn[11][1] = 1/100 (35,100,75,0);
+RdYlGn[11][2] = 1/100 (15,80,75,0);
+RdYlGn[11][3] = 1/100 (3,57,63,0);
+RdYlGn[11][4] = 1/100 (0,32,55,0);
+RdYlGn[11][5] = 1/100 (0,12,42,0);
+RdYlGn[11][6] = 1/100 (0,0,25,0);
+RdYlGn[11][7] = 1/100 (15,0,45,0);
+RdYlGn[11][8] = 1/100 (35,0,60,0);
+RdYlGn[11][9] = 1/100 (60,0,65,0);
+RdYlGn[3][1] = 1/100 (0,45,55,0);
+RdYlGn[3][2] = 1/100 (0,0,25,0);
+RdYlGn[3][3] = 1/100 (43,0,65,0);
+RdYlGn[4][1] = 1/100 (15,90,80,0);
+RdYlGn[4][2] = 1/100 (0,32,55,0);
+RdYlGn[4][3] = 1/100 (35,0,60,0);
+RdYlGn[4][4] = 1/100 (90,0,90,0);
+RdYlGn[5][1] = 1/100 (15,90,80,0);
+RdYlGn[5][2] = 1/100 (0,35,55,0);
+RdYlGn[5][3] = 1/100 (0,0,25,0);
+RdYlGn[5][4] = 1/100 (35,0,60,0);
+RdYlGn[5][5] = 1/100 (90,0,90,0);
+RdYlGn[6][1] = 1/100 (15,80,75,0);
+RdYlGn[6][2] = 1/100 (0,45,55,0);
+RdYlGn[6][3] = 1/100 (0,12,42,0);
+RdYlGn[6][4] = 1/100 (15,0,45,0);
+RdYlGn[6][5] = 1/100 (43,0,65,0);
+RdYlGn[6][6] = 1/100 (90,0,90,0);
+RdYlGn[7][1] = 1/100 (15,80,75,0);
+RdYlGn[7][2] = 1/100 (0,45,55,0);
+RdYlGn[7][3] = 1/100 (0,12,42,0);
+RdYlGn[7][4] = 1/100 (0,0,25,0);
+RdYlGn[7][5] = 1/100 (15,0,45,0);
+RdYlGn[7][6] = 1/100 (43,0,65,0);
+RdYlGn[7][7] = 1/100 (90,0,80,0);
+RdYlGn[8][1] = 1/100 (15,80,75,0);
+RdYlGn[8][2] = 1/100 (3,57,63,0);
+RdYlGn[8][3] = 1/100 (0,32,55,0);
+RdYlGn[8][4] = 1/100 (0,12,42,0);
+RdYlGn[8][5] = 1/100 (15,0,45,0);
+RdYlGn[8][6] = 1/100 (35,0,60,0);
+RdYlGn[8][7] = 1/100 (60,0,65,0);
+RdYlGn[8][8] = 1/100 (90,0,80,0);
+RdYlGn[9][1] = 1/100 (15,80,75,0);
+RdYlGn[9][2] = 1/100 (3,57,63,0);
+RdYlGn[9][3] = 1/100 (0,32,55,0);
+RdYlGn[9][4] = 1/100 (0,12,42,0);
+RdYlGn[9][5] = 1/100 (0,0,25,0);
+RdYlGn[9][6] = 1/100 (15,0,45,0);
+RdYlGn[9][7] = 1/100 (35,0,60,0);
+RdYlGn[9][8] = 1/100 (60,0,65,0);
+RdYlGn[9][9] = 1/100 (90,0,80,0);
+Reds[3][1] = 1/100 (0,12,12,0);
+Reds[3][2] = 1/100 (0,43,43,0);
+Reds[3][3] = 1/100 (12,82,75,0);
+Reds[4][1] = 1/100 (0,10,10,0);
+Reds[4][2] = 1/100 (0,32,32,0);
+Reds[4][3] = 1/100 (0,59,59,0);
+Reds[4][4] = 1/100 (20,90,80,0);
+Reds[5][1] = 1/100 (0,10,10,0);
+Reds[5][2] = 1/100 (0,32,32,0);
+Reds[5][3] = 1/100 (0,59,59,0);
+Reds[5][4] = 1/100 (12,82,75,0);
+Reds[5][5] = 1/100 (35,95,85,0);
+Reds[6][1] = 1/100 (0,10,10,0);
+Reds[6][2] = 1/100 (0,27,27,0);
+Reds[6][3] = 1/100 (0,43,43,0);
+Reds[6][4] = 1/100 (0,59,59,0);
+Reds[6][5] = 1/100 (12,82,75,0);
+Reds[6][6] = 1/100 (35,95,85,0);
+Reds[7][1] = 1/100 (0,10,10,0);
+Reds[7][2] = 1/100 (0,27,27,0);
+Reds[7][3] = 1/100 (0,43,43,0);
+Reds[7][4] = 1/100 (0,59,59,0);
+Reds[7][5] = 1/100 (5,77,72,0);
+Reds[7][6] = 1/100 (20,90,80,0);
+Reds[7][7] = 1/100 (40,100,90,0);
+Reds[8][1] = 1/100 (0,4,4,0);
+Reds[8][2] = 1/100 (0,12,12,0);
+Reds[8][3] = 1/100 (0,27,27,0);
+Reds[8][4] = 1/100 (0,43,43,0);
+Reds[8][5] = 1/100 (0,59,59,0);
+Reds[8][6] = 1/100 (5,77,72,0);
+Reds[8][7] = 1/100 (20,90,80,0);
+Reds[8][8] = 1/100 (40,100,90,0);
+Reds[9][1] = 1/100 (0,4,4,0);
+Reds[9][2] = 1/100 (0,12,12,0);
+Reds[9][3] = 1/100 (0,27,27,0);
+Reds[9][4] = 1/100 (0,43,43,0);
+Reds[9][5] = 1/100 (0,59,59,0);
+Reds[9][6] = 1/100 (5,77,72,0);
+Reds[9][7] = 1/100 (20,90,80,0);
+Reds[9][8] = 1/100 (35,95,85,0);
+Reds[9][9] = 1/100 (60,100,90,0);
+SetOne[3][1] = 1/100 (10,90,80,0);
+SetOne[3][2] = 1/100 (80,30,0,0);
+SetOne[3][3] = 1/100 (70,0,80,0);
+SetOne[4][1] = 1/100 (10,90,80,0);
+SetOne[4][2] = 1/100 (80,30,0,0);
+SetOne[4][3] = 1/100 (70,0,80,0);
+SetOne[4][4] = 1/100 (40,65,0,0);
+SetOne[5][1] = 1/100 (10,90,80,0);
+SetOne[5][2] = 1/100 (80,30,0,0);
+SetOne[5][3] = 1/100 (70,0,80,0);
+SetOne[5][4] = 1/100 (40,65,0,0);
+SetOne[5][5] = 1/100 (0,50,100,0);
+SetOne[6][1] = 1/100 (10,90,80,0);
+SetOne[6][2] = 1/100 (80,30,0,0);
+SetOne[6][3] = 1/100 (70,0,80,0);
+SetOne[6][4] = 1/100 (40,65,0,0);
+SetOne[6][5] = 1/100 (0,50,100,0);
+SetOne[6][6] = 1/100 (0,0,80,0);
+SetOne[7][1] = 1/100 (10,90,80,0);
+SetOne[7][2] = 1/100 (80,30,0,0);
+SetOne[7][3] = 1/100 (70,0,80,0);
+SetOne[7][4] = 1/100 (40,65,0,0);
+SetOne[7][5] = 1/100 (0,50,100,0);
+SetOne[7][6] = 1/100 (0,0,80,0);
+SetOne[7][7] = 1/100 (35,60,80,0);
+SetOne[8][1] = 1/100 (10,90,80,0);
+SetOne[8][2] = 1/100 (80,30,0,0);
+SetOne[8][3] = 1/100 (70,0,80,0);
+SetOne[8][4] = 1/100 (40,65,0,0);
+SetOne[8][5] = 1/100 (0,50,100,0);
+SetOne[8][6] = 1/100 (0,0,80,0);
+SetOne[8][7] = 1/100 (35,60,80,0);
+SetOne[8][8] = 1/100 (0,50,0,0);
+SetOne[9][1] = 1/100 (10,90,80,0);
+SetOne[9][2] = 1/100 (80,30,0,0);
+SetOne[9][3] = 1/100 (70,0,80,0);
+SetOne[9][4] = 1/100 (40,65,0,0);
+SetOne[9][5] = 1/100 (0,50,100,0);
+SetOne[9][6] = 1/100 (0,0,80,0);
+SetOne[9][7] = 1/100 (35,60,80,0);
+SetOne[9][8] = 1/100 (0,50,0,0);
+SetOne[9][9] = 1/100 (0,0,0,40);
+SetThree[10][10] = 1/100 (25,45,0,0);
+SetThree[10][1] = 1/100 (45,0,15,0);
+SetThree[10][2] = 1/100 (0,0,30,0);
+SetThree[10][3] = 1/100 (25,20,0,0);
+SetThree[10][4] = 1/100 (0,50,40,0);
+SetThree[10][5] = 1/100 (50,15,0,0);
+SetThree[10][6] = 1/100 (0,30,55,0);
+SetThree[10][7] = 1/100 (30,0,60,0);
+SetThree[10][8] = 1/100 (0,20,0,0);
+SetThree[10][9] = 1/100 (0,0,0,15);
+SetThree[11][10] = 1/100 (25,45,0,0);
+SetThree[11][11] = 1/100 (20,0,20,0);
+SetThree[11][1] = 1/100 (45,0,15,0);
+SetThree[11][2] = 1/100 (0,0,30,0);
+SetThree[11][3] = 1/100 (25,20,0,0);
+SetThree[11][4] = 1/100 (0,50,40,0);
+SetThree[11][5] = 1/100 (50,15,0,0);
+SetThree[11][6] = 1/100 (0,30,55,0);
+SetThree[11][7] = 1/100 (30,0,60,0);
+SetThree[11][8] = 1/100 (0,20,0,0);
+SetThree[11][9] = 1/100 (0,0,0,15);
+SetThree[12][10] = 1/100 (25,45,0,0);
+SetThree[12][11] = 1/100 (20,0,20,0);
+SetThree[12][12] = 1/100 (0,7,55,0);
+SetThree[12][1] = 1/100 (45,0,15,0);
+SetThree[12][2] = 1/100 (0,0,30,0);
+SetThree[12][3] = 1/100 (25,20,0,0);
+SetThree[12][4] = 1/100 (0,50,40,0);
+SetThree[12][5] = 1/100 (50,15,0,0);
+SetThree[12][6] = 1/100 (0,30,55,0);
+SetThree[12][7] = 1/100 (30,0,60,0);
+SetThree[12][8] = 1/100 (0,20,0,0);
+SetThree[12][9] = 1/100 (0,0,0,15);
+SetThree[3][1] = 1/100 (45,0,15,0);
+SetThree[3][2] = 1/100 (0,0,30,0);
+SetThree[3][3] = 1/100 (25,20,0,0);
+SetThree[4][1] = 1/100 (45,0,15,0);
+SetThree[4][2] = 1/100 (0,0,30,0);
+SetThree[4][3] = 1/100 (25,20,0,0);
+SetThree[4][4] = 1/100 (0,50,40,0);
+SetThree[5][1] = 1/100 (45,0,15,0);
+SetThree[5][2] = 1/100 (0,0,30,0);
+SetThree[5][3] = 1/100 (25,20,0,0);
+SetThree[5][4] = 1/100 (0,50,40,0);
+SetThree[5][5] = 1/100 (50,15,0,0);
+SetThree[6][1] = 1/100 (45,0,15,0);
+SetThree[6][2] = 1/100 (0,0,30,0);
+SetThree[6][3] = 1/100 (25,20,0,0);
+SetThree[6][4] = 1/100 (0,50,40,0);
+SetThree[6][5] = 1/100 (50,15,0,0);
+SetThree[6][6] = 1/100 (0,30,55,0);
+SetThree[7][1] = 1/100 (45,0,15,0);
+SetThree[7][2] = 1/100 (0,0,30,0);
+SetThree[7][3] = 1/100 (25,20,0,0);
+SetThree[7][4] = 1/100 (0,50,40,0);
+SetThree[7][5] = 1/100 (50,15,0,0);
+SetThree[7][6] = 1/100 (0,30,55,0);
+SetThree[7][7] = 1/100 (30,0,60,0);
+SetThree[8][1] = 1/100 (45,0,15,0);
+SetThree[8][2] = 1/100 (0,0,30,0);
+SetThree[8][3] = 1/100 (25,20,0,0);
+SetThree[8][4] = 1/100 (0,50,40,0);
+SetThree[8][5] = 1/100 (50,15,0,0);
+SetThree[8][6] = 1/100 (0,30,55,0);
+SetThree[8][7] = 1/100 (30,0,60,0);
+SetThree[8][8] = 1/100 (0,20,0,0);
+SetThree[9][1] = 1/100 (45,0,15,0);
+SetThree[9][2] = 1/100 (0,0,30,0);
+SetThree[9][3] = 1/100 (25,20,0,0);
+SetThree[9][4] = 1/100 (0,50,40,0);
+SetThree[9][5] = 1/100 (50,15,0,0);
+SetThree[9][6] = 1/100 (0,30,55,0);
+SetThree[9][7] = 1/100 (30,0,60,0);
+SetThree[9][8] = 1/100 (0,20,0,0);
+SetThree[9][9] = 1/100 (0,0,0,15);
+SetTwo[3][1] = 1/100 (60,0,30,0);
+SetTwo[3][2] = 1/100 (0,45,50,0);
+SetTwo[3][3] = 1/100 (45,25,0,0);
+SetTwo[4][1] = 1/100 (60,0,30,0);
+SetTwo[4][2] = 1/100 (0,45,50,0);
+SetTwo[4][3] = 1/100 (45,25,0,0);
+SetTwo[4][4] = 1/100 (7,45,0,0);
+SetTwo[5][1] = 1/100 (60,0,30,0);
+SetTwo[5][2] = 1/100 (0,45,50,0);
+SetTwo[5][3] = 1/100 (45,25,0,0);
+SetTwo[5][4] = 1/100 (7,45,0,0);
+SetTwo[5][5] = 1/100 (35,0,70,0);
+SetTwo[6][1] = 1/100 (60,0,30,0);
+SetTwo[6][2] = 1/100 (0,45,50,0);
+SetTwo[6][3] = 1/100 (45,25,0,0);
+SetTwo[6][4] = 1/100 (7,45,0,0);
+SetTwo[6][5] = 1/100 (35,0,70,0);
+SetTwo[6][6] = 1/100 (0,15,80,0);
+SetTwo[7][1] = 1/100 (60,0,30,0);
+SetTwo[7][2] = 1/100 (0,45,50,0);
+SetTwo[7][3] = 1/100 (45,25,0,0);
+SetTwo[7][4] = 1/100 (7,45,0,0);
+SetTwo[7][5] = 1/100 (35,0,70,0);
+SetTwo[7][6] = 1/100 (0,15,80,0);
+SetTwo[7][7] = 1/100 (10,20,35,0);
+SetTwo[8][1] = 1/100 (60,0,30,0);
+SetTwo[8][2] = 1/100 (0,45,50,0);
+SetTwo[8][3] = 1/100 (45,25,0,0);
+SetTwo[8][4] = 1/100 (7,45,0,0);
+SetTwo[8][5] = 1/100 (35,0,70,0);
+SetTwo[8][6] = 1/100 (0,15,80,0);
+SetTwo[8][7] = 1/100 (10,20,35,0);
+SetTwo[8][8] = 1/100 (0,0,0,30);
+Spectral[10][10] = 1/100 (65,60,0,0);
+Spectral[10][1] = 1/100 (0,100,20,35);
+Spectral[10][2] = 1/100 (15,75,50,0);
+Spectral[10][3] = 1/100 (3,57,63,0);
+Spectral[10][4] = 1/100 (0,32,55,0);
+Spectral[10][5] = 1/100 (0,12,42,0);
+Spectral[10][6] = 1/100 (10,0,40,0);
+Spectral[10][7] = 1/100 (33,0,33,0);
+Spectral[10][8] = 1/100 (60,0,30,0);
+Spectral[10][9] = 1/100 (82,23,0,0);
+Spectral[11][10] = 1/100 (82,23,0,0);
+Spectral[11][11] = 1/100 (65,60,0,0);
+Spectral[11][1] = 1/100 (0,100,20,35);
+Spectral[11][2] = 1/100 (15,75,50,0);
+Spectral[11][3] = 1/100 (3,57,63,0);
+Spectral[11][4] = 1/100 (0,32,55,0);
+Spectral[11][5] = 1/100 (0,12,42,0);
+Spectral[11][6] = 1/100 (0,0,25,0);
+Spectral[11][7] = 1/100 (10,0,40,0);
+Spectral[11][8] = 1/100 (33,0,33,0);
+Spectral[11][9] = 1/100 (60,0,30,0);
+Spectral[3][1] = 1/100 (0,45,55,0);
+Spectral[3][2] = 1/100 (0,0,25,0);
+Spectral[3][3] = 1/100 (40,0,40,0);
+Spectral[4][1] = 1/100 (15,90,80,0);
+Spectral[4][2] = 1/100 (0,32,55,0);
+Spectral[4][3] = 1/100 (33,0,33,0);
+Spectral[4][4] = 1/100 (85,25,0,0);
+Spectral[5][1] = 1/100 (15,90,80,0);
+Spectral[5][2] = 1/100 (0,32,55,0);
+Spectral[5][3] = 1/100 (0,0,25,0);
+Spectral[5][4] = 1/100 (33,0,33,0);
+Spectral[5][5] = 1/100 (85,25,0,0);
+Spectral[6][1] = 1/100 (15,75,50,0);
+Spectral[6][2] = 1/100 (0,45,55,0);
+Spectral[6][3] = 1/100 (0,12,42,0);
+Spectral[6][4] = 1/100 (10,0,40,0);
+Spectral[6][5] = 1/100 (40,0,40,0);
+Spectral[6][6] = 1/100 (82,23,0,0);
+Spectral[7][1] = 1/100 (15,75,50,0);
+Spectral[7][2] = 1/100 (0,45,55,0);
+Spectral[7][3] = 1/100 (0,12,42,0);
+Spectral[7][4] = 1/100 (0,0,25,0);
+Spectral[7][5] = 1/100 (10,0,40,0);
+Spectral[7][6] = 1/100 (40,0,40,0);
+Spectral[7][7] = 1/100 (82,23,0,0);
+Spectral[8][1] = 1/100 (15,75,50,0);
+Spectral[8][2] = 1/100 (3,57,53,0);
+Spectral[8][3] = 1/100 (0,32,55,0);
+Spectral[8][4] = 1/100 (0,12,42,0);
+Spectral[8][5] = 1/100 (10,0,40,0);
+Spectral[8][6] = 1/100 (33,0,33,0);
+Spectral[8][7] = 1/100 (60,0,30,0);
+Spectral[8][8] = 1/100 (82,23,0,0);
+Spectral[9][1] = 1/100 (15,75,50,0);
+Spectral[9][2] = 1/100 (3,57,63,0);
+Spectral[9][3] = 1/100 (0,32,55,0);
+Spectral[9][4] = 1/100 (0,12,42,0);
+Spectral[9][5] = 1/100 (0,0,25,0);
+Spectral[9][6] = 1/100 (10,0,40,0);
+Spectral[9][7] = 1/100 (33,0,33,0);
+Spectral[9][8] = 1/100 (60,0,30,0);
+Spectral[9][9] = 1/100 (82,23,0,0);
+YlGnBu[3][1] = 1/100 (7,0,30,0);
+YlGnBu[3][2] = 1/100 (50,0,20,0);
+YlGnBu[3][3] = 1/100 (85,27,0,0);
+YlGnBu[4][1] = 1/100 (0,0,20,0);
+YlGnBu[4][2] = 1/100 (37,0,25,0);
+YlGnBu[4][3] = 1/100 (75,0,10,0);
+YlGnBu[4][4] = 1/100 (90,45,0,0);
+YlGnBu[5][1] = 1/100 (0,0,20,0);
+YlGnBu[5][2] = 1/100 (37,0,25,0);
+YlGnBu[5][3] = 1/100 (75,0,10,0);
+YlGnBu[5][4] = 1/100 (85,27,0,0);
+YlGnBu[5][5] = 1/100 (90,70,0,0);
+YlGnBu[6][1] = 1/100 (0,0,20,0);
+YlGnBu[6][2] = 1/100 (22,0,27,0);
+YlGnBu[6][3] = 1/100 (50,0,20,0);
+YlGnBu[6][4] = 1/100 (75,0,10,0);
+YlGnBu[6][5] = 1/100 (85,27,0,0);
+YlGnBu[6][6] = 1/100 (90,70,0,0);
+YlGnBu[7][1] = 1/100 (0,0,20,0);
+YlGnBu[7][2] = 1/100 (22,0,27,0);
+YlGnBu[7][3] = 1/100 (50,0,20,0);
+YlGnBu[7][4] = 1/100 (75,0,10,0);
+YlGnBu[7][5] = 1/100 (90,15,0,0);
+YlGnBu[7][6] = 1/100 (90,45,0,0);
+YlGnBu[7][7] = 1/100 (100,70,0,10);
+YlGnBu[8][1] = 1/100 (0,0,15,0);
+YlGnBu[8][2] = 1/100 (7,0,30,0);
+YlGnBu[8][3] = 1/100 (22,0,27,0);
+YlGnBu[8][4] = 1/100 (50,0,20,0);
+YlGnBu[8][5] = 1/100 (75,0,10,0);
+YlGnBu[8][6] = 1/100 (90,15,0,0);
+YlGnBu[8][7] = 1/100 (90,45,0,0);
+YlGnBu[8][8] = 1/100 (100,70,0,10);
+YlGnBu[9][1] = 1/100 (0,0,15,0);
+YlGnBu[9][2] = 1/100 (7,0,30,0);
+YlGnBu[9][3] = 1/100 (22,0,27,0);
+YlGnBu[9][4] = 1/100 (50,0,20,0);
+YlGnBu[9][5] = 1/100 (75,0,10,0);
+YlGnBu[9][6] = 1/100 (90,15,0,0);
+YlGnBu[9][7] = 1/100 (90,45,0,0);
+YlGnBu[9][8] = 1/100 (90,70,0,0);
+YlGnBu[9][9] = 1/100 (100,70,0,40);
+YlGn[3][1] = 1/100 (3,0,27,0);
+YlGn[3][2] = 1/100 (32,0,43,0);
+YlGn[3][3] = 1/100 (81,0,76,0);
+YlGn[4][1] = 1/100 (0,0,20,0);
+YlGn[4][2] = 1/100 (24,0,39,0);
+YlGn[4][3] = 1/100 (53,0,53,0);
+YlGn[4][4] = 1/100 (87,10,83,0);
+YlGn[5][1] = 1/100 (0,0,20,0);
+YlGn[5][2] = 1/100 (24,0,39,0);
+YlGn[5][3] = 1/100 (53,0,53,0);
+YlGn[5][4] = 1/100 (81,0,76,0);
+YlGn[5][5] = 1/100 (100,25,90,0);
+YlGn[6][1] = 1/100 (0,0,20,0);
+YlGn[6][2] = 1/100 (15,0,35,0);
+YlGn[6][3] = 1/100 (32,0,43,0);
+YlGn[6][4] = 1/100 (53,0,53,0);
+YlGn[6][5] = 1/100 (81,0,76,0);
+YlGn[6][6] = 1/100 (100,25,90,0);
+YlGn[7][1] = 1/100 (0,0,20,0);
+YlGn[7][2] = 1/100 (15,0,35,0);
+YlGn[7][3] = 1/100 (32,0,43,0);
+YlGn[7][4] = 1/100 (53,0,53,0);
+YlGn[7][5] = 1/100 (75,0,70,0);
+YlGn[7][6] = 1/100 (87,15,83,0);
+YlGn[7][7] = 1/100 (100,35,90,0);
+YlGn[8][1] = 1/100 (0,0,10,0);
+YlGn[8][2] = 1/100 (3,0,27,0);
+YlGn[8][3] = 1/100 (15,0,35,0);
+YlGn[8][4] = 1/100 (32,0,43,0);
+YlGn[8][5] = 1/100 (53,0,53,0);
+YlGn[8][6] = 1/100 (75,0,70,0);
+YlGn[8][7] = 1/100 (87,15,83,0);
+YlGn[8][8] = 1/100 (100,35,90,0);
+YlGn[9][1] = 1/100 (0,0,10,0);
+YlGn[9][2] = 1/100 (3,0,27,0);
+YlGn[9][3] = 1/100 (15,0,35,0);
+YlGn[9][4] = 1/100 (32,0,43,0);
+YlGn[9][5] = 1/100 (53,0,53,0);
+YlGn[9][6] = 1/100 (75,0,70,0);
+YlGn[9][7] = 1/100 (87,15,83,0);
+YlGn[9][8] = 1/100 (100,25,90,0);
+YlGn[9][9] = 1/100 (100,50,90,0);
+YlOrBr[3][1] = 1/100 (0,3,25,0);
+YlOrBr[3][2] = 1/100 (0,23,65,0);
+YlOrBr[3][3] = 1/100 (15,60,95,0);
+YlOrBr[4][1] = 1/100 (0,0,17,0);
+YlOrBr[4][2] = 1/100 (0,15,40,0);
+YlOrBr[4][3] = 1/100 (0,40,80,0);
+YlOrBr[4][4] = 1/100 (20,67,100,0);
+YlOrBr[5][1] = 1/100 (0,0,17,0);
+YlOrBr[5][2] = 1/100 (0,15,40,0);
+YlOrBr[5][3] = 1/100 (0,40,80,0);
+YlOrBr[5][4] = 1/100 (15,60,95,0);
+YlOrBr[5][5] = 1/100 (40,75,100,0);
+YlOrBr[6][1] = 1/100 (0,0,17,0);
+YlOrBr[6][2] = 1/100 (0,11,40,0);
+YlOrBr[6][3] = 1/100 (0,23,65,0);
+YlOrBr[6][4] = 1/100 (0,40,80,0);
+YlOrBr[6][5] = 1/100 (15,60,95,0);
+YlOrBr[6][6] = 1/100 (40,75,100,0);
+YlOrBr[7][1] = 1/100 (0,0,17,0);
+YlOrBr[7][2] = 1/100 (0,11,40,0);
+YlOrBr[7][3] = 1/100 (0,23,65,0);
+YlOrBr[7][4] = 1/100 (0,40,80,0);
+YlOrBr[7][5] = 1/100 (7,55,90,0);
+YlOrBr[7][6] = 1/100 (20,67,100,0);
+YlOrBr[7][7] = 1/100 (45,78,100,0);
+YlOrBr[8][1] = 1/100 (0,0,10,0);
+YlOrBr[8][2] = 1/100 (0,3,25,0);
+YlOrBr[8][3] = 1/100 (0,11,40,0);
+YlOrBr[8][4] = 1/100 (0,23,65,0);
+YlOrBr[8][5] = 1/100 (0,40,80,0);
+YlOrBr[8][6] = 1/100 (7,55,90,0);
+YlOrBr[8][7] = 1/100 (20,67,100,0);
+YlOrBr[8][8] = 1/100 (45,78,100,0);
+YlOrBr[9][1] = 1/100 (0,0,10,0);
+YlOrBr[9][2] = 1/100 (0,3,25,0);
+YlOrBr[9][3] = 1/100 (0,11,40,0);
+YlOrBr[9][4] = 1/100 (0,23,65,0);
+YlOrBr[9][5] = 1/100 (0,40,80,0);
+YlOrBr[9][6] = 1/100 (7,55,90,0);
+YlOrBr[9][7] = 1/100 (20,67,100,0);
+YlOrBr[9][8] = 1/100 (40,75,100,0);
+YlOrBr[9][9] = 1/100 (60,80,100,0);
+YlOrRd[3][1] = 1/100 (0,7,35,0);
+YlOrRd[3][2] = 1/100 (0,30,65,0);
+YlOrRd[3][3] = 1/100 (5,77,80,0);
+YlOrRd[4][1] = 1/100 (0,0,30,0);
+YlOrRd[4][2] = 1/100 (0,20,60,0);
+YlOrRd[4][3] = 1/100 (0,45,70,0);
+YlOrRd[4][4] = 1/100 (10,90,80,0);
+YlOrRd[5][1] = 1/100 (0,0,30,0);
+YlOrRd[5][2] = 1/100 (0,20,60,0);
+YlOrRd[5][3] = 1/100 (0,45,70,0);
+YlOrRd[5][4] = 1/100 (5,77,80,0);
+YlOrRd[5][5] = 1/100 (25,100,70,0);
+YlOrRd[6][1] = 1/100 (0,0,30,0);
+YlOrRd[6][2] = 1/100 (0,15,50,0);
+YlOrRd[6][3] = 1/100 (0,30,65,0);
+YlOrRd[6][4] = 1/100 (0,45,70,0);
+YlOrRd[6][5] = 1/100 (5,77,80,0);
+YlOrRd[6][6] = 1/100 (25,100,70,0);
+YlOrRd[7][1] = 1/100 (0,0,30,0);
+YlOrRd[7][2] = 1/100 (0,15,50,0);
+YlOrRd[7][3] = 1/100 (0,30,65,0);
+YlOrRd[7][4] = 1/100 (0,45,70,0);
+YlOrRd[7][5] = 1/100 (0,70,75,0);
+YlOrRd[7][6] = 1/100 (10,90,80,0);
+YlOrRd[7][7] = 1/100 (30,100,70,0);
+YlOrRd[8][1] = 1/100 (0,0,20,0);
+YlOrRd[8][2] = 1/100 (0,7,35,0);
+YlOrRd[8][3] = 1/100 (0,15,50,0);
+YlOrRd[8][4] = 1/100 (0,30,65,0);
+YlOrRd[8][5] = 1/100 (0,45,70,0);
+YlOrRd[8][6] = 1/100 (0,70,75,0);
+YlOrRd[8][7] = 1/100 (10,90,80,0);
+YlOrRd[8][8] = 1/100 (30,100,70,0);
+YlOrRd[9][1] = 1/100 (0,0,20,0);
+YlOrRd[9][2] = 1/100 (0,7,35,0);
+YlOrRd[9][3] = 1/100 (0,15,50,0);
+YlOrRd[9][4] = 1/100 (0,30,65,0);
+YlOrRd[9][5] = 1/100 (0,45,70,0);
+YlOrRd[9][6] = 1/100 (0,70,75,0);
+YlOrRd[9][7] = 1/100 (10,90,80,0);
+YlOrRd[9][8] = 1/100 (25,100,70,0);
+YlOrRd[9][9] = 1/100 (50,100,70,0);
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-rgb.mp b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-rgb.mp
new file mode 100644
index 0000000000..d3b6fea47d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-rgb.mp
@@ -0,0 +1,1739 @@
+% This package includes color specifications and designs
+% developed by Cynthia Brewer (http://colorbrewer.org/).
+% Metapost version adapted from cb.csv by Toby Thurston.
+% Please see license at http://colorbrewer.org/export/LICENSE.txt
+
+% This package defines all the colours from colorbrewer.org
+% Visit the site to get an idea what you can do with them
+% Each colour set is defined as a MP variable with two suffixes
+% The first suffix defines the number of colours in the set,
+% the second one defines the index of this colour in the set
+% starting at 1, so this loop shows you all the shades of red
+% in the six colour "Reds" set.
+%
+% for i=1 upto 6:
+% fill unitsquare scaled 1cm shifted (i*cm,0) withcolor Reds[6][i];
+% endfor
+%
+% Six of the qualititative colour sets have numbers in their names at colorbrewer.org
+% MP doesn't allow this, so they are renamed here as follows:
+%
+% Dark2 is called DarkTwo
+% Pastel1 is called PastelOne
+% Pastel2 is called PastelTwo
+% Set1 is called SetOne
+% Set2 is called SetTwo
+% Set3 is called SetThree
+%
+% No sequence has fewer than three colours.
+% All of the sequences are defined for upto eight colours.
+% The sequential sequences are defined for 3 to 9 colours each.
+% The divergent sequences are defined for 3 to 11 colours each.
+% A few of the qualitative sequences have upto 12 colours.
+%
+% In general try not to use too many colours in one chart.
+% The sequences were designed for cartography and may not suit all applications.
+
+message "metapost-colorbrewer - Copyright (C) 2018 Toby Thurston. This program comes with ABSOLUTELY NO WARRANTY. " &
+"This is free software, and you are welcome to redistribute it under certain conditions; read the LICENCE file for details. " &
+"The colorbrewer colours are copyright (C) Cynthia Brewer, Mark Harrower and The Pennsylvania State University. " &
+"See http://colorbrewer2.org";
+
+
+color Accent[][], Blues[][], BrBG[][], BuGn[][], BuPu[][], DarkTwo[][],
+ GnBu[][], Greens[][], Greys[][], OrRd[][], Oranges[][], PRGn[][],
+ Paired[][], PastelOne[][], PastelTwo[][], PiYG[][], PuBu[][],
+ PuBuGn[][], PuOr[][], PuRd[][], Purples[][], RdBu[][], RdGy[][],
+ RdPu[][], RdYlBu[][], RdYlGn[][], Reds[][], SetOne[][],
+ SetThree[][], SetTwo[][], Spectral[][], YlGn[][], YlGnBu[][],
+ YlOrBr[][], YlOrRd[][];
+
+Accent[3][1] = 1/256 (127,201,127);
+Accent[3][2] = 1/256 (190,174,212);
+Accent[3][3] = 1/256 (253,192,134);
+Accent[4][1] = 1/256 (127,201,127);
+Accent[4][2] = 1/256 (190,174,212);
+Accent[4][3] = 1/256 (253,192,134);
+Accent[4][4] = 1/256 (255,255,153);
+Accent[5][1] = 1/256 (127,201,127);
+Accent[5][2] = 1/256 (190,174,212);
+Accent[5][3] = 1/256 (253,192,134);
+Accent[5][4] = 1/256 (255,255,153);
+Accent[5][5] = 1/256 (56,108,176);
+Accent[6][1] = 1/256 (127,201,127);
+Accent[6][2] = 1/256 (190,174,212);
+Accent[6][3] = 1/256 (253,192,134);
+Accent[6][4] = 1/256 (255,255,153);
+Accent[6][5] = 1/256 (56,108,176);
+Accent[6][6] = 1/256 (240,2,127);
+Accent[7][1] = 1/256 (127,201,127);
+Accent[7][2] = 1/256 (190,174,212);
+Accent[7][3] = 1/256 (253,192,134);
+Accent[7][4] = 1/256 (255,255,153);
+Accent[7][5] = 1/256 (56,108,176);
+Accent[7][6] = 1/256 (240,2,127);
+Accent[7][7] = 1/256 (191,91,23);
+Accent[8][1] = 1/256 (127,201,127);
+Accent[8][2] = 1/256 (190,174,212);
+Accent[8][3] = 1/256 (253,192,134);
+Accent[8][4] = 1/256 (255,255,153);
+Accent[8][5] = 1/256 (56,108,176);
+Accent[8][6] = 1/256 (240,2,127);
+Accent[8][7] = 1/256 (191,91,23);
+Accent[8][8] = 1/256 (102,102,102);
+Blues[3][1] = 1/256 (222,235,247);
+Blues[3][2] = 1/256 (158,202,225);
+Blues[3][3] = 1/256 (49,130,189);
+Blues[4][1] = 1/256 (239,243,255);
+Blues[4][2] = 1/256 (189,215,231);
+Blues[4][3] = 1/256 (107,174,214);
+Blues[4][4] = 1/256 (33,113,181);
+Blues[5][1] = 1/256 (239,243,255);
+Blues[5][2] = 1/256 (189,215,231);
+Blues[5][3] = 1/256 (107,174,214);
+Blues[5][4] = 1/256 (49,130,189);
+Blues[5][5] = 1/256 (8,81,156);
+Blues[6][1] = 1/256 (239,243,255);
+Blues[6][2] = 1/256 (198,219,239);
+Blues[6][3] = 1/256 (158,202,225);
+Blues[6][4] = 1/256 (107,174,214);
+Blues[6][5] = 1/256 (49,130,189);
+Blues[6][6] = 1/256 (8,81,156);
+Blues[7][1] = 1/256 (239,243,255);
+Blues[7][2] = 1/256 (198,219,239);
+Blues[7][3] = 1/256 (158,202,225);
+Blues[7][4] = 1/256 (107,174,214);
+Blues[7][5] = 1/256 (66,146,198);
+Blues[7][6] = 1/256 (33,113,181);
+Blues[7][7] = 1/256 (8,69,148);
+Blues[8][1] = 1/256 (247,251,255);
+Blues[8][2] = 1/256 (222,235,247);
+Blues[8][3] = 1/256 (198,219,239);
+Blues[8][4] = 1/256 (158,202,225);
+Blues[8][5] = 1/256 (107,174,214);
+Blues[8][6] = 1/256 (66,146,198);
+Blues[8][7] = 1/256 (33,113,181);
+Blues[8][8] = 1/256 (8,69,148);
+Blues[9][1] = 1/256 (247,251,255);
+Blues[9][2] = 1/256 (222,235,247);
+Blues[9][3] = 1/256 (198,219,239);
+Blues[9][4] = 1/256 (158,202,225);
+Blues[9][5] = 1/256 (107,174,214);
+Blues[9][6] = 1/256 (66,146,198);
+Blues[9][7] = 1/256 (33,113,181);
+Blues[9][8] = 1/256 (8,81,156);
+Blues[9][9] = 1/256 (8,48,107);
+BrBG[10][10] = 1/256 (0,60,48);
+BrBG[10][1] = 1/256 (84,48,5);
+BrBG[10][2] = 1/256 (140,81,10);
+BrBG[10][3] = 1/256 (191,129,45);
+BrBG[10][4] = 1/256 (223,194,125);
+BrBG[10][5] = 1/256 (246,232,195);
+BrBG[10][6] = 1/256 (199,234,229);
+BrBG[10][7] = 1/256 (128,205,193);
+BrBG[10][8] = 1/256 (53,151,143);
+BrBG[10][9] = 1/256 (1,102,94);
+BrBG[11][10] = 1/256 (1,102,94);
+BrBG[11][11] = 1/256 (0,60,48);
+BrBG[11][1] = 1/256 (84,48,5);
+BrBG[11][2] = 1/256 (140,81,10);
+BrBG[11][3] = 1/256 (191,129,45);
+BrBG[11][4] = 1/256 (223,194,125);
+BrBG[11][5] = 1/256 (246,232,195);
+BrBG[11][6] = 1/256 (245,245,245);
+BrBG[11][7] = 1/256 (199,234,229);
+BrBG[11][8] = 1/256 (128,205,193);
+BrBG[11][9] = 1/256 (53,151,143);
+BrBG[3][1] = 1/256 (216,179,101);
+BrBG[3][2] = 1/256 (245,245,245);
+BrBG[3][3] = 1/256 (90,180,172);
+BrBG[4][1] = 1/256 (166,97,26);
+BrBG[4][2] = 1/256 (223,194,125);
+BrBG[4][3] = 1/256 (128,205,193);
+BrBG[4][4] = 1/256 (1,133,113);
+BrBG[5][1] = 1/256 (166,97,26);
+BrBG[5][2] = 1/256 (223,194,125);
+BrBG[5][3] = 1/256 (245,245,245);
+BrBG[5][4] = 1/256 (128,205,193);
+BrBG[5][5] = 1/256 (1,133,113);
+BrBG[6][1] = 1/256 (140,81,10);
+BrBG[6][2] = 1/256 (216,179,101);
+BrBG[6][3] = 1/256 (246,232,195);
+BrBG[6][4] = 1/256 (199,234,229);
+BrBG[6][5] = 1/256 (90,180,172);
+BrBG[6][6] = 1/256 (1,102,94);
+BrBG[7][1] = 1/256 (140,81,10);
+BrBG[7][2] = 1/256 (216,179,101);
+BrBG[7][3] = 1/256 (246,232,195);
+BrBG[7][4] = 1/256 (245,245,245);
+BrBG[7][5] = 1/256 (199,234,229);
+BrBG[7][6] = 1/256 (90,180,172);
+BrBG[7][7] = 1/256 (1,102,94);
+BrBG[8][1] = 1/256 (140,81,10);
+BrBG[8][2] = 1/256 (191,129,45);
+BrBG[8][3] = 1/256 (223,194,125);
+BrBG[8][4] = 1/256 (246,232,195);
+BrBG[8][5] = 1/256 (199,234,229);
+BrBG[8][6] = 1/256 (128,205,193);
+BrBG[8][7] = 1/256 (53,151,143);
+BrBG[8][8] = 1/256 (1,102,94);
+BrBG[9][1] = 1/256 (140,81,10);
+BrBG[9][2] = 1/256 (191,129,45);
+BrBG[9][3] = 1/256 (223,194,125);
+BrBG[9][4] = 1/256 (246,232,195);
+BrBG[9][5] = 1/256 (245,245,245);
+BrBG[9][6] = 1/256 (199,234,229);
+BrBG[9][7] = 1/256 (128,205,193);
+BrBG[9][8] = 1/256 (53,151,143);
+BrBG[9][9] = 1/256 (1,102,94);
+BuGn[3][1] = 1/256 (229,245,249);
+BuGn[3][2] = 1/256 (153,216,201);
+BuGn[3][3] = 1/256 (44,162,95);
+BuGn[4][1] = 1/256 (237,248,251);
+BuGn[4][2] = 1/256 (178,226,226);
+BuGn[4][3] = 1/256 (102,194,164);
+BuGn[4][4] = 1/256 (35,139,69);
+BuGn[5][1] = 1/256 (237,248,251);
+BuGn[5][2] = 1/256 (178,226,226);
+BuGn[5][3] = 1/256 (102,194,164);
+BuGn[5][4] = 1/256 (44,162,95);
+BuGn[5][5] = 1/256 (0,109,44);
+BuGn[6][1] = 1/256 (237,248,251);
+BuGn[6][2] = 1/256 (204,236,230);
+BuGn[6][3] = 1/256 (153,216,201);
+BuGn[6][4] = 1/256 (102,194,164);
+BuGn[6][5] = 1/256 (44,162,95);
+BuGn[6][6] = 1/256 (0,109,44);
+BuGn[7][1] = 1/256 (237,248,251);
+BuGn[7][2] = 1/256 (204,236,230);
+BuGn[7][3] = 1/256 (153,216,201);
+BuGn[7][4] = 1/256 (102,194,164);
+BuGn[7][5] = 1/256 (65,174,118);
+BuGn[7][6] = 1/256 (35,139,69);
+BuGn[7][7] = 1/256 (0,88,36);
+BuGn[8][1] = 1/256 (247,252,253);
+BuGn[8][2] = 1/256 (229,245,249);
+BuGn[8][3] = 1/256 (204,236,230);
+BuGn[8][4] = 1/256 (153,216,201);
+BuGn[8][5] = 1/256 (102,194,164);
+BuGn[8][6] = 1/256 (65,174,118);
+BuGn[8][7] = 1/256 (35,139,69);
+BuGn[8][8] = 1/256 (0,88,36);
+BuGn[9][1] = 1/256 (247,252,253);
+BuGn[9][2] = 1/256 (229,245,249);
+BuGn[9][3] = 1/256 (204,236,230);
+BuGn[9][4] = 1/256 (153,216,201);
+BuGn[9][5] = 1/256 (102,194,164);
+BuGn[9][6] = 1/256 (65,174,118);
+BuGn[9][7] = 1/256 (35,139,69);
+BuGn[9][8] = 1/256 (0,109,44);
+BuGn[9][9] = 1/256 (0,68,27);
+BuPu[3][1] = 1/256 (224,236,244);
+BuPu[3][2] = 1/256 (158,188,218);
+BuPu[3][3] = 1/256 (136,86,167);
+BuPu[4][1] = 1/256 (237,248,251);
+BuPu[4][2] = 1/256 (179,205,227);
+BuPu[4][3] = 1/256 (140,150,198);
+BuPu[4][4] = 1/256 (136,65,157);
+BuPu[5][1] = 1/256 (237,248,251);
+BuPu[5][2] = 1/256 (179,205,227);
+BuPu[5][3] = 1/256 (140,150,198);
+BuPu[5][4] = 1/256 (136,86,167);
+BuPu[5][5] = 1/256 (129,15,124);
+BuPu[6][1] = 1/256 (237,248,251);
+BuPu[6][2] = 1/256 (191,211,230);
+BuPu[6][3] = 1/256 (158,188,218);
+BuPu[6][4] = 1/256 (140,150,198);
+BuPu[6][5] = 1/256 (136,86,167);
+BuPu[6][6] = 1/256 (129,15,124);
+BuPu[7][1] = 1/256 (237,248,251);
+BuPu[7][2] = 1/256 (191,211,230);
+BuPu[7][3] = 1/256 (158,188,218);
+BuPu[7][4] = 1/256 (140,150,198);
+BuPu[7][5] = 1/256 (140,107,177);
+BuPu[7][6] = 1/256 (136,65,157);
+BuPu[7][7] = 1/256 (110,1,107);
+BuPu[8][1] = 1/256 (247,252,253);
+BuPu[8][2] = 1/256 (224,236,244);
+BuPu[8][3] = 1/256 (191,211,230);
+BuPu[8][4] = 1/256 (158,188,218);
+BuPu[8][5] = 1/256 (140,150,198);
+BuPu[8][6] = 1/256 (140,107,177);
+BuPu[8][7] = 1/256 (136,65,157);
+BuPu[8][8] = 1/256 (110,1,107);
+BuPu[9][1] = 1/256 (247,252,253);
+BuPu[9][2] = 1/256 (224,236,244);
+BuPu[9][3] = 1/256 (191,211,230);
+BuPu[9][4] = 1/256 (158,188,218);
+BuPu[9][5] = 1/256 (140,150,198);
+BuPu[9][6] = 1/256 (140,107,177);
+BuPu[9][7] = 1/256 (136,65,157);
+BuPu[9][8] = 1/256 (129,15,124);
+BuPu[9][9] = 1/256 (77,0,75);
+DarkTwo[3][1] = 1/256 (27,158,119);
+DarkTwo[3][2] = 1/256 (217,95,2);
+DarkTwo[3][3] = 1/256 (117,112,179);
+DarkTwo[4][1] = 1/256 (27,158,119);
+DarkTwo[4][2] = 1/256 (217,95,2);
+DarkTwo[4][3] = 1/256 (117,112,179);
+DarkTwo[4][4] = 1/256 (231,41,138);
+DarkTwo[5][1] = 1/256 (27,158,119);
+DarkTwo[5][2] = 1/256 (217,95,2);
+DarkTwo[5][3] = 1/256 (117,112,179);
+DarkTwo[5][4] = 1/256 (231,41,138);
+DarkTwo[5][5] = 1/256 (102,166,30);
+DarkTwo[6][1] = 1/256 (27,158,119);
+DarkTwo[6][2] = 1/256 (217,95,2);
+DarkTwo[6][3] = 1/256 (117,112,179);
+DarkTwo[6][4] = 1/256 (231,41,138);
+DarkTwo[6][5] = 1/256 (102,166,30);
+DarkTwo[6][6] = 1/256 (230,171,2);
+DarkTwo[7][1] = 1/256 (27,158,119);
+DarkTwo[7][2] = 1/256 (217,95,2);
+DarkTwo[7][3] = 1/256 (117,112,179);
+DarkTwo[7][4] = 1/256 (231,41,138);
+DarkTwo[7][5] = 1/256 (102,166,30);
+DarkTwo[7][6] = 1/256 (230,171,2);
+DarkTwo[7][7] = 1/256 (166,118,29);
+DarkTwo[8][1] = 1/256 (27,158,119);
+DarkTwo[8][2] = 1/256 (217,95,2);
+DarkTwo[8][3] = 1/256 (117,112,179);
+DarkTwo[8][4] = 1/256 (231,41,138);
+DarkTwo[8][5] = 1/256 (102,166,30);
+DarkTwo[8][6] = 1/256 (230,171,2);
+DarkTwo[8][7] = 1/256 (166,118,29);
+DarkTwo[8][8] = 1/256 (102,102,102);
+GnBu[3][1] = 1/256 (224,243,219);
+GnBu[3][2] = 1/256 (168,221,181);
+GnBu[3][3] = 1/256 (67,162,202);
+GnBu[4][1] = 1/256 (240,249,232);
+GnBu[4][2] = 1/256 (186,228,188);
+GnBu[4][3] = 1/256 (123,204,196);
+GnBu[4][4] = 1/256 (43,140,190);
+GnBu[5][1] = 1/256 (240,249,232);
+GnBu[5][2] = 1/256 (186,228,188);
+GnBu[5][3] = 1/256 (123,204,196);
+GnBu[5][4] = 1/256 (67,162,202);
+GnBu[5][5] = 1/256 (8,104,172);
+GnBu[6][1] = 1/256 (240,249,232);
+GnBu[6][2] = 1/256 (204,235,197);
+GnBu[6][3] = 1/256 (168,221,181);
+GnBu[6][4] = 1/256 (123,204,196);
+GnBu[6][5] = 1/256 (67,162,202);
+GnBu[6][6] = 1/256 (8,104,172);
+GnBu[7][1] = 1/256 (240,249,232);
+GnBu[7][2] = 1/256 (204,235,197);
+GnBu[7][3] = 1/256 (168,221,181);
+GnBu[7][4] = 1/256 (123,204,196);
+GnBu[7][5] = 1/256 (78,179,211);
+GnBu[7][6] = 1/256 (43,140,190);
+GnBu[7][7] = 1/256 (8,88,158);
+GnBu[8][1] = 1/256 (247,252,240);
+GnBu[8][2] = 1/256 (224,243,219);
+GnBu[8][3] = 1/256 (204,235,197);
+GnBu[8][4] = 1/256 (168,221,181);
+GnBu[8][5] = 1/256 (123,204,196);
+GnBu[8][6] = 1/256 (78,179,211);
+GnBu[8][7] = 1/256 (43,140,190);
+GnBu[8][8] = 1/256 (8,88,158);
+GnBu[9][1] = 1/256 (247,252,240);
+GnBu[9][2] = 1/256 (224,243,219);
+GnBu[9][3] = 1/256 (204,235,197);
+GnBu[9][4] = 1/256 (168,221,181);
+GnBu[9][5] = 1/256 (123,204,196);
+GnBu[9][6] = 1/256 (78,179,211);
+GnBu[9][7] = 1/256 (43,140,190);
+GnBu[9][8] = 1/256 (8,104,172);
+GnBu[9][9] = 1/256 (8,64,129);
+Greens[3][1] = 1/256 (229,245,224);
+Greens[3][2] = 1/256 (161,217,155);
+Greens[3][3] = 1/256 (49,163,84);
+Greens[4][1] = 1/256 (237,248,233);
+Greens[4][2] = 1/256 (186,228,179);
+Greens[4][3] = 1/256 (116,196,118);
+Greens[4][4] = 1/256 (35,139,69);
+Greens[5][1] = 1/256 (237,248,233);
+Greens[5][2] = 1/256 (186,228,179);
+Greens[5][3] = 1/256 (116,196,118);
+Greens[5][4] = 1/256 (49,163,84);
+Greens[5][5] = 1/256 (0,109,44);
+Greens[6][1] = 1/256 (237,248,233);
+Greens[6][2] = 1/256 (199,233,192);
+Greens[6][3] = 1/256 (161,217,155);
+Greens[6][4] = 1/256 (116,196,118);
+Greens[6][5] = 1/256 (49,163,84);
+Greens[6][6] = 1/256 (0,109,44);
+Greens[7][1] = 1/256 (237,248,233);
+Greens[7][2] = 1/256 (199,233,192);
+Greens[7][3] = 1/256 (161,217,155);
+Greens[7][4] = 1/256 (116,196,118);
+Greens[7][5] = 1/256 (65,171,93);
+Greens[7][6] = 1/256 (35,139,69);
+Greens[7][7] = 1/256 (0,90,50);
+Greens[8][1] = 1/256 (247,252,245);
+Greens[8][2] = 1/256 (229,245,224);
+Greens[8][3] = 1/256 (199,233,192);
+Greens[8][4] = 1/256 (161,217,155);
+Greens[8][5] = 1/256 (116,196,118);
+Greens[8][6] = 1/256 (65,171,93);
+Greens[8][7] = 1/256 (35,139,69);
+Greens[8][8] = 1/256 (0,90,50);
+Greens[9][1] = 1/256 (247,252,245);
+Greens[9][2] = 1/256 (229,245,224);
+Greens[9][3] = 1/256 (199,233,192);
+Greens[9][4] = 1/256 (161,217,155);
+Greens[9][5] = 1/256 (116,196,118);
+Greens[9][6] = 1/256 (65,171,93);
+Greens[9][7] = 1/256 (35,139,69);
+Greens[9][8] = 1/256 (0,109,44);
+Greens[9][9] = 1/256 (0,68,27);
+Greys[3][1] = 1/256 (240,240,240);
+Greys[3][2] = 1/256 (189,189,189);
+Greys[3][3] = 1/256 (99,99,99);
+Greys[4][1] = 1/256 (247,247,247);
+Greys[4][2] = 1/256 (204,204,204);
+Greys[4][3] = 1/256 (150,150,150);
+Greys[4][4] = 1/256 (82,82,82);
+Greys[5][1] = 1/256 (247,247,247);
+Greys[5][2] = 1/256 (204,204,204);
+Greys[5][3] = 1/256 (150,150,150);
+Greys[5][4] = 1/256 (99,99,99);
+Greys[5][5] = 1/256 (37,37,37);
+Greys[6][1] = 1/256 (247,247,247);
+Greys[6][2] = 1/256 (217,217,217);
+Greys[6][3] = 1/256 (189,189,189);
+Greys[6][4] = 1/256 (150,150,150);
+Greys[6][5] = 1/256 (99,99,99);
+Greys[6][6] = 1/256 (37,37,37);
+Greys[7][1] = 1/256 (247,247,247);
+Greys[7][2] = 1/256 (217,217,217);
+Greys[7][3] = 1/256 (189,189,189);
+Greys[7][4] = 1/256 (150,150,150);
+Greys[7][5] = 1/256 (115,115,115);
+Greys[7][6] = 1/256 (82,82,82);
+Greys[7][7] = 1/256 (37,37,37);
+Greys[8][1] = 1/256 (255,255,255);
+Greys[8][2] = 1/256 (240,240,240);
+Greys[8][3] = 1/256 (217,217,217);
+Greys[8][4] = 1/256 (189,189,189);
+Greys[8][5] = 1/256 (150,150,150);
+Greys[8][6] = 1/256 (115,115,115);
+Greys[8][7] = 1/256 (82,82,82);
+Greys[8][8] = 1/256 (37,37,37);
+Greys[9][1] = 1/256 (255,255,255);
+Greys[9][2] = 1/256 (240,240,240);
+Greys[9][3] = 1/256 (217,217,217);
+Greys[9][4] = 1/256 (189,189,189);
+Greys[9][5] = 1/256 (150,150,150);
+Greys[9][6] = 1/256 (115,115,115);
+Greys[9][7] = 1/256 (82,82,82);
+Greys[9][8] = 1/256 (37,37,37);
+Greys[9][9] = 1/256 (0,0,0);
+OrRd[3][1] = 1/256 (254,232,200);
+OrRd[3][2] = 1/256 (253,187,132);
+OrRd[3][3] = 1/256 (227,74,51);
+OrRd[4][1] = 1/256 (254,240,217);
+OrRd[4][2] = 1/256 (253,204,138);
+OrRd[4][3] = 1/256 (252,141,89);
+OrRd[4][4] = 1/256 (215,48,31);
+OrRd[5][1] = 1/256 (254,240,217);
+OrRd[5][2] = 1/256 (253,204,138);
+OrRd[5][3] = 1/256 (252,141,89);
+OrRd[5][4] = 1/256 (227,74,51);
+OrRd[5][5] = 1/256 (179,0,0);
+OrRd[6][1] = 1/256 (254,240,217);
+OrRd[6][2] = 1/256 (253,212,158);
+OrRd[6][3] = 1/256 (253,187,132);
+OrRd[6][4] = 1/256 (252,141,89);
+OrRd[6][5] = 1/256 (227,74,51);
+OrRd[6][6] = 1/256 (179,0,0);
+OrRd[7][1] = 1/256 (254,240,217);
+OrRd[7][2] = 1/256 (253,212,158);
+OrRd[7][3] = 1/256 (253,187,132);
+OrRd[7][4] = 1/256 (252,141,89);
+OrRd[7][5] = 1/256 (239,101,72);
+OrRd[7][6] = 1/256 (215,48,31);
+OrRd[7][7] = 1/256 (153,0,0);
+OrRd[8][1] = 1/256 (255,247,236);
+OrRd[8][2] = 1/256 (254,232,200);
+OrRd[8][3] = 1/256 (253,212,158);
+OrRd[8][4] = 1/256 (253,187,132);
+OrRd[8][5] = 1/256 (252,141,89);
+OrRd[8][6] = 1/256 (239,101,72);
+OrRd[8][7] = 1/256 (215,48,31);
+OrRd[8][8] = 1/256 (153,0,0);
+OrRd[9][1] = 1/256 (255,247,236);
+OrRd[9][2] = 1/256 (254,232,200);
+OrRd[9][3] = 1/256 (253,212,158);
+OrRd[9][4] = 1/256 (253,187,132);
+OrRd[9][5] = 1/256 (252,141,89);
+OrRd[9][6] = 1/256 (239,101,72);
+OrRd[9][7] = 1/256 (215,48,31);
+OrRd[9][8] = 1/256 (179,0,0);
+OrRd[9][9] = 1/256 (127,0,0);
+Oranges[3][1] = 1/256 (254,230,206);
+Oranges[3][2] = 1/256 (253,174,107);
+Oranges[3][3] = 1/256 (230,85,13);
+Oranges[4][1] = 1/256 (254,237,222);
+Oranges[4][2] = 1/256 (253,190,133);
+Oranges[4][3] = 1/256 (253,141,60);
+Oranges[4][4] = 1/256 (217,71,1);
+Oranges[5][1] = 1/256 (254,237,222);
+Oranges[5][2] = 1/256 (253,190,133);
+Oranges[5][3] = 1/256 (253,141,60);
+Oranges[5][4] = 1/256 (230,85,13);
+Oranges[5][5] = 1/256 (166,54,3);
+Oranges[6][1] = 1/256 (254,237,222);
+Oranges[6][2] = 1/256 (253,208,162);
+Oranges[6][3] = 1/256 (253,174,107);
+Oranges[6][4] = 1/256 (253,141,60);
+Oranges[6][5] = 1/256 (230,85,13);
+Oranges[6][6] = 1/256 (166,54,3);
+Oranges[7][1] = 1/256 (254,237,222);
+Oranges[7][2] = 1/256 (253,208,162);
+Oranges[7][3] = 1/256 (253,174,107);
+Oranges[7][4] = 1/256 (253,141,60);
+Oranges[7][5] = 1/256 (241,105,19);
+Oranges[7][6] = 1/256 (217,72,1);
+Oranges[7][7] = 1/256 (140,45,4);
+Oranges[8][1] = 1/256 (255,245,235);
+Oranges[8][2] = 1/256 (254,230,206);
+Oranges[8][3] = 1/256 (253,208,162);
+Oranges[8][4] = 1/256 (253,174,107);
+Oranges[8][5] = 1/256 (253,141,60);
+Oranges[8][6] = 1/256 (241,105,19);
+Oranges[8][7] = 1/256 (217,72,1);
+Oranges[8][8] = 1/256 (140,45,4);
+Oranges[9][1] = 1/256 (255,245,235);
+Oranges[9][2] = 1/256 (254,230,206);
+Oranges[9][3] = 1/256 (253,208,162);
+Oranges[9][4] = 1/256 (253,174,107);
+Oranges[9][5] = 1/256 (253,141,60);
+Oranges[9][6] = 1/256 (241,105,19);
+Oranges[9][7] = 1/256 (217,72,1);
+Oranges[9][8] = 1/256 (166,54,3);
+Oranges[9][9] = 1/256 (127,39,4);
+PRGn[10][10] = 1/256 (0,68,27);
+PRGn[10][1] = 1/256 (64,0,75);
+PRGn[10][2] = 1/256 (118,42,131);
+PRGn[10][3] = 1/256 (153,112,171);
+PRGn[10][4] = 1/256 (194,165,207);
+PRGn[10][5] = 1/256 (231,212,232);
+PRGn[10][6] = 1/256 (217,240,211);
+PRGn[10][7] = 1/256 (166,219,160);
+PRGn[10][8] = 1/256 (90,174,97);
+PRGn[10][9] = 1/256 (27,120,55);
+PRGn[11][10] = 1/256 (27,120,55);
+PRGn[11][11] = 1/256 (0,68,27);
+PRGn[11][1] = 1/256 (64,0,75);
+PRGn[11][2] = 1/256 (118,42,131);
+PRGn[11][3] = 1/256 (153,112,171);
+PRGn[11][4] = 1/256 (194,165,207);
+PRGn[11][5] = 1/256 (231,212,232);
+PRGn[11][6] = 1/256 (247,247,247);
+PRGn[11][7] = 1/256 (217,240,211);
+PRGn[11][8] = 1/256 (166,219,160);
+PRGn[11][9] = 1/256 (90,174,97);
+PRGn[3][1] = 1/256 (175,141,195);
+PRGn[3][2] = 1/256 (247,247,247);
+PRGn[3][3] = 1/256 (127,191,123);
+PRGn[4][1] = 1/256 (123,50,148);
+PRGn[4][2] = 1/256 (194,165,207);
+PRGn[4][3] = 1/256 (166,219,160);
+PRGn[4][4] = 1/256 (0,136,55);
+PRGn[5][1] = 1/256 (123,50,148);
+PRGn[5][2] = 1/256 (194,165,207);
+PRGn[5][3] = 1/256 (247,247,247);
+PRGn[5][4] = 1/256 (166,219,160);
+PRGn[5][5] = 1/256 (0,136,55);
+PRGn[6][1] = 1/256 (118,42,131);
+PRGn[6][2] = 1/256 (175,141,195);
+PRGn[6][3] = 1/256 (231,212,232);
+PRGn[6][4] = 1/256 (217,240,211);
+PRGn[6][5] = 1/256 (127,191,123);
+PRGn[6][6] = 1/256 (27,120,55);
+PRGn[7][1] = 1/256 (118,42,131);
+PRGn[7][2] = 1/256 (175,141,195);
+PRGn[7][3] = 1/256 (231,212,232);
+PRGn[7][4] = 1/256 (247,247,247);
+PRGn[7][5] = 1/256 (217,240,211);
+PRGn[7][6] = 1/256 (127,191,123);
+PRGn[7][7] = 1/256 (27,120,55);
+PRGn[8][1] = 1/256 (118,42,131);
+PRGn[8][2] = 1/256 (153,112,171);
+PRGn[8][3] = 1/256 (194,165,207);
+PRGn[8][4] = 1/256 (231,212,232);
+PRGn[8][5] = 1/256 (217,240,211);
+PRGn[8][6] = 1/256 (166,219,160);
+PRGn[8][7] = 1/256 (90,174,97);
+PRGn[8][8] = 1/256 (27,120,55);
+PRGn[9][1] = 1/256 (118,42,131);
+PRGn[9][2] = 1/256 (153,112,171);
+PRGn[9][3] = 1/256 (194,165,207);
+PRGn[9][4] = 1/256 (231,212,232);
+PRGn[9][5] = 1/256 (247,247,247);
+PRGn[9][6] = 1/256 (217,240,211);
+PRGn[9][7] = 1/256 (166,219,160);
+PRGn[9][8] = 1/256 (90,174,97);
+PRGn[9][9] = 1/256 (27,120,55);
+Paired[10][10] = 1/256 (106,61,154);
+Paired[10][1] = 1/256 (166,206,227);
+Paired[10][2] = 1/256 (31,120,180);
+Paired[10][3] = 1/256 (178,223,138);
+Paired[10][4] = 1/256 (51,160,44);
+Paired[10][5] = 1/256 (251,154,153);
+Paired[10][6] = 1/256 (227,26,28);
+Paired[10][7] = 1/256 (253,191,111);
+Paired[10][8] = 1/256 (255,127,0);
+Paired[10][9] = 1/256 (202,178,214);
+Paired[11][10] = 1/256 (106,61,154);
+Paired[11][11] = 1/256 (255,255,153);
+Paired[11][1] = 1/256 (166,206,227);
+Paired[11][2] = 1/256 (31,120,180);
+Paired[11][3] = 1/256 (178,223,138);
+Paired[11][4] = 1/256 (51,160,44);
+Paired[11][5] = 1/256 (251,154,153);
+Paired[11][6] = 1/256 (227,26,28);
+Paired[11][7] = 1/256 (253,191,111);
+Paired[11][8] = 1/256 (255,127,0);
+Paired[11][9] = 1/256 (202,178,214);
+Paired[12][10] = 1/256 (106,61,154);
+Paired[12][11] = 1/256 (255,255,153);
+Paired[12][12] = 1/256 (177,89,40);
+Paired[12][1] = 1/256 (166,206,227);
+Paired[12][2] = 1/256 (31,120,180);
+Paired[12][3] = 1/256 (178,223,138);
+Paired[12][4] = 1/256 (51,160,44);
+Paired[12][5] = 1/256 (251,154,153);
+Paired[12][6] = 1/256 (227,26,28);
+Paired[12][7] = 1/256 (253,191,111);
+Paired[12][8] = 1/256 (255,127,0);
+Paired[12][9] = 1/256 (202,178,214);
+Paired[3][1] = 1/256 (166,206,227);
+Paired[3][2] = 1/256 (31,120,180);
+Paired[3][3] = 1/256 (178,223,138);
+Paired[4][1] = 1/256 (166,206,227);
+Paired[4][2] = 1/256 (31,120,180);
+Paired[4][3] = 1/256 (178,223,138);
+Paired[4][4] = 1/256 (51,160,44);
+Paired[5][1] = 1/256 (166,206,227);
+Paired[5][2] = 1/256 (31,120,180);
+Paired[5][3] = 1/256 (178,223,138);
+Paired[5][4] = 1/256 (51,160,44);
+Paired[5][5] = 1/256 (251,154,153);
+Paired[6][1] = 1/256 (166,206,227);
+Paired[6][2] = 1/256 (31,120,180);
+Paired[6][3] = 1/256 (178,223,138);
+Paired[6][4] = 1/256 (51,160,44);
+Paired[6][5] = 1/256 (251,154,153);
+Paired[6][6] = 1/256 (227,26,28);
+Paired[7][1] = 1/256 (166,206,227);
+Paired[7][2] = 1/256 (31,120,180);
+Paired[7][3] = 1/256 (178,223,138);
+Paired[7][4] = 1/256 (51,160,44);
+Paired[7][5] = 1/256 (251,154,153);
+Paired[7][6] = 1/256 (227,26,28);
+Paired[7][7] = 1/256 (253,191,111);
+Paired[8][1] = 1/256 (166,206,227);
+Paired[8][2] = 1/256 (31,120,180);
+Paired[8][3] = 1/256 (178,223,138);
+Paired[8][4] = 1/256 (51,160,44);
+Paired[8][5] = 1/256 (251,154,153);
+Paired[8][6] = 1/256 (227,26,28);
+Paired[8][7] = 1/256 (253,191,111);
+Paired[8][8] = 1/256 (255,127,0);
+Paired[9][1] = 1/256 (166,206,227);
+Paired[9][2] = 1/256 (31,120,180);
+Paired[9][3] = 1/256 (178,223,138);
+Paired[9][4] = 1/256 (51,160,44);
+Paired[9][5] = 1/256 (251,154,153);
+Paired[9][6] = 1/256 (227,26,28);
+Paired[9][7] = 1/256 (253,191,111);
+Paired[9][8] = 1/256 (255,127,0);
+Paired[9][9] = 1/256 (202,178,214);
+PastelOne[3][1] = 1/256 (251,180,174);
+PastelOne[3][2] = 1/256 (179,205,227);
+PastelOne[3][3] = 1/256 (204,235,197);
+PastelOne[4][1] = 1/256 (251,180,174);
+PastelOne[4][2] = 1/256 (179,205,227);
+PastelOne[4][3] = 1/256 (204,235,197);
+PastelOne[4][4] = 1/256 (222,203,228);
+PastelOne[5][1] = 1/256 (251,180,174);
+PastelOne[5][2] = 1/256 (179,205,227);
+PastelOne[5][3] = 1/256 (204,235,197);
+PastelOne[5][4] = 1/256 (222,203,228);
+PastelOne[5][5] = 1/256 (254,217,166);
+PastelOne[6][1] = 1/256 (251,180,174);
+PastelOne[6][2] = 1/256 (179,205,227);
+PastelOne[6][3] = 1/256 (204,235,197);
+PastelOne[6][4] = 1/256 (222,203,228);
+PastelOne[6][5] = 1/256 (254,217,166);
+PastelOne[6][6] = 1/256 (255,255,204);
+PastelOne[7][1] = 1/256 (251,180,174);
+PastelOne[7][2] = 1/256 (179,205,227);
+PastelOne[7][3] = 1/256 (204,235,197);
+PastelOne[7][4] = 1/256 (222,203,228);
+PastelOne[7][5] = 1/256 (254,217,166);
+PastelOne[7][6] = 1/256 (255,255,204);
+PastelOne[7][7] = 1/256 (229,216,189);
+PastelOne[8][1] = 1/256 (251,180,174);
+PastelOne[8][2] = 1/256 (179,205,227);
+PastelOne[8][3] = 1/256 (204,235,197);
+PastelOne[8][4] = 1/256 (222,203,228);
+PastelOne[8][5] = 1/256 (254,217,166);
+PastelOne[8][6] = 1/256 (255,255,204);
+PastelOne[8][7] = 1/256 (229,216,189);
+PastelOne[8][8] = 1/256 (253,218,236);
+PastelOne[9][1] = 1/256 (251,180,174);
+PastelOne[9][2] = 1/256 (179,205,227);
+PastelOne[9][3] = 1/256 (204,235,197);
+PastelOne[9][4] = 1/256 (222,203,228);
+PastelOne[9][5] = 1/256 (254,217,166);
+PastelOne[9][6] = 1/256 (255,255,204);
+PastelOne[9][7] = 1/256 (229,216,189);
+PastelOne[9][8] = 1/256 (253,218,236);
+PastelOne[9][9] = 1/256 (242,242,242);
+PastelTwo[3][1] = 1/256 (179,226,205);
+PastelTwo[3][2] = 1/256 (253,205,172);
+PastelTwo[3][3] = 1/256 (203,213,232);
+PastelTwo[4][1] = 1/256 (179,226,205);
+PastelTwo[4][2] = 1/256 (253,205,172);
+PastelTwo[4][3] = 1/256 (203,213,232);
+PastelTwo[4][4] = 1/256 (244,202,228);
+PastelTwo[5][1] = 1/256 (179,226,205);
+PastelTwo[5][2] = 1/256 (253,205,172);
+PastelTwo[5][3] = 1/256 (203,213,232);
+PastelTwo[5][4] = 1/256 (244,202,228);
+PastelTwo[5][5] = 1/256 (230,245,201);
+PastelTwo[6][1] = 1/256 (179,226,205);
+PastelTwo[6][2] = 1/256 (253,205,172);
+PastelTwo[6][3] = 1/256 (203,213,232);
+PastelTwo[6][4] = 1/256 (244,202,228);
+PastelTwo[6][5] = 1/256 (230,245,201);
+PastelTwo[6][6] = 1/256 (255,242,174);
+PastelTwo[7][1] = 1/256 (179,226,205);
+PastelTwo[7][2] = 1/256 (253,205,172);
+PastelTwo[7][3] = 1/256 (203,213,232);
+PastelTwo[7][4] = 1/256 (244,202,228);
+PastelTwo[7][5] = 1/256 (230,245,201);
+PastelTwo[7][6] = 1/256 (255,242,174);
+PastelTwo[7][7] = 1/256 (241,226,204);
+PastelTwo[8][1] = 1/256 (179,226,205);
+PastelTwo[8][2] = 1/256 (253,205,172);
+PastelTwo[8][3] = 1/256 (203,213,232);
+PastelTwo[8][4] = 1/256 (244,202,228);
+PastelTwo[8][5] = 1/256 (230,245,201);
+PastelTwo[8][6] = 1/256 (255,242,174);
+PastelTwo[8][7] = 1/256 (241,226,204);
+PastelTwo[8][8] = 1/256 (204,204,204);
+PiYG[10][10] = 1/256 (39,100,25);
+PiYG[10][1] = 1/256 (142,1,82);
+PiYG[10][2] = 1/256 (197,27,125);
+PiYG[10][3] = 1/256 (222,119,174);
+PiYG[10][4] = 1/256 (241,182,218);
+PiYG[10][5] = 1/256 (253,224,239);
+PiYG[10][6] = 1/256 (230,245,208);
+PiYG[10][7] = 1/256 (184,225,134);
+PiYG[10][8] = 1/256 (127,188,65);
+PiYG[10][9] = 1/256 (77,146,33);
+PiYG[11][10] = 1/256 (77,146,33);
+PiYG[11][11] = 1/256 (39,100,25);
+PiYG[11][1] = 1/256 (142,1,82);
+PiYG[11][2] = 1/256 (197,27,125);
+PiYG[11][3] = 1/256 (222,119,174);
+PiYG[11][4] = 1/256 (241,182,218);
+PiYG[11][5] = 1/256 (253,224,239);
+PiYG[11][6] = 1/256 (247,247,247);
+PiYG[11][7] = 1/256 (230,245,208);
+PiYG[11][8] = 1/256 (184,225,134);
+PiYG[11][9] = 1/256 (127,188,65);
+PiYG[3][1] = 1/256 (233,163,201);
+PiYG[3][2] = 1/256 (247,247,247);
+PiYG[3][3] = 1/256 (161,215,106);
+PiYG[4][1] = 1/256 (208,28,139);
+PiYG[4][2] = 1/256 (241,182,218);
+PiYG[4][3] = 1/256 (184,225,134);
+PiYG[4][4] = 1/256 (77,172,38);
+PiYG[5][1] = 1/256 (208,28,139);
+PiYG[5][2] = 1/256 (241,182,218);
+PiYG[5][3] = 1/256 (247,247,247);
+PiYG[5][4] = 1/256 (184,225,134);
+PiYG[5][5] = 1/256 (77,172,38);
+PiYG[6][1] = 1/256 (197,27,125);
+PiYG[6][2] = 1/256 (233,163,201);
+PiYG[6][3] = 1/256 (253,224,239);
+PiYG[6][4] = 1/256 (230,245,208);
+PiYG[6][5] = 1/256 (161,215,106);
+PiYG[6][6] = 1/256 (77,146,33);
+PiYG[7][1] = 1/256 (197,27,125);
+PiYG[7][2] = 1/256 (233,163,201);
+PiYG[7][3] = 1/256 (253,224,239);
+PiYG[7][4] = 1/256 (247,247,247);
+PiYG[7][5] = 1/256 (230,245,208);
+PiYG[7][6] = 1/256 (161,215,106);
+PiYG[7][7] = 1/256 (77,146,33);
+PiYG[8][1] = 1/256 (197,27,125);
+PiYG[8][2] = 1/256 (222,119,174);
+PiYG[8][3] = 1/256 (241,182,218);
+PiYG[8][4] = 1/256 (253,224,239);
+PiYG[8][5] = 1/256 (230,245,208);
+PiYG[8][6] = 1/256 (184,225,134);
+PiYG[8][7] = 1/256 (127,188,65);
+PiYG[8][8] = 1/256 (77,146,33);
+PiYG[9][1] = 1/256 (197,27,125);
+PiYG[9][2] = 1/256 (222,119,174);
+PiYG[9][3] = 1/256 (241,182,218);
+PiYG[9][4] = 1/256 (253,224,239);
+PiYG[9][5] = 1/256 (247,247,247);
+PiYG[9][6] = 1/256 (230,245,208);
+PiYG[9][7] = 1/256 (184,225,134);
+PiYG[9][8] = 1/256 (127,188,65);
+PiYG[9][9] = 1/256 (77,146,33);
+PuBuGn[3][1] = 1/256 (236,226,240);
+PuBuGn[3][2] = 1/256 (166,189,219);
+PuBuGn[3][3] = 1/256 (28,144,153);
+PuBuGn[4][1] = 1/256 (246,239,247);
+PuBuGn[4][2] = 1/256 (189,201,225);
+PuBuGn[4][3] = 1/256 (103,169,207);
+PuBuGn[4][4] = 1/256 (2,129,138);
+PuBuGn[5][1] = 1/256 (246,239,247);
+PuBuGn[5][2] = 1/256 (189,201,225);
+PuBuGn[5][3] = 1/256 (103,169,207);
+PuBuGn[5][4] = 1/256 (28,144,153);
+PuBuGn[5][5] = 1/256 (1,108,89);
+PuBuGn[6][1] = 1/256 (246,239,247);
+PuBuGn[6][2] = 1/256 (208,209,230);
+PuBuGn[6][3] = 1/256 (166,189,219);
+PuBuGn[6][4] = 1/256 (103,169,207);
+PuBuGn[6][5] = 1/256 (28,144,153);
+PuBuGn[6][6] = 1/256 (1,108,89);
+PuBuGn[7][1] = 1/256 (246,239,247);
+PuBuGn[7][2] = 1/256 (208,209,230);
+PuBuGn[7][3] = 1/256 (166,189,219);
+PuBuGn[7][4] = 1/256 (103,169,207);
+PuBuGn[7][5] = 1/256 (54,144,192);
+PuBuGn[7][6] = 1/256 (2,129,138);
+PuBuGn[7][7] = 1/256 (1,100,80);
+PuBuGn[8][1] = 1/256 (255,247,251);
+PuBuGn[8][2] = 1/256 (236,226,240);
+PuBuGn[8][3] = 1/256 (208,209,230);
+PuBuGn[8][4] = 1/256 (166,189,219);
+PuBuGn[8][5] = 1/256 (103,169,207);
+PuBuGn[8][6] = 1/256 (54,144,192);
+PuBuGn[8][7] = 1/256 (2,129,138);
+PuBuGn[8][8] = 1/256 (1,100,80);
+PuBuGn[9][1] = 1/256 (255,247,251);
+PuBuGn[9][2] = 1/256 (236,226,240);
+PuBuGn[9][3] = 1/256 (208,209,230);
+PuBuGn[9][4] = 1/256 (166,189,219);
+PuBuGn[9][5] = 1/256 (103,169,207);
+PuBuGn[9][6] = 1/256 (54,144,192);
+PuBuGn[9][7] = 1/256 (2,129,138);
+PuBuGn[9][8] = 1/256 (1,108,89);
+PuBuGn[9][9] = 1/256 (1,70,54);
+PuBu[3][1] = 1/256 (236,231,242);
+PuBu[3][2] = 1/256 (166,189,219);
+PuBu[3][3] = 1/256 (43,140,190);
+PuBu[4][1] = 1/256 (241,238,246);
+PuBu[4][2] = 1/256 (189,201,225);
+PuBu[4][3] = 1/256 (116,169,207);
+PuBu[4][4] = 1/256 (5,112,176);
+PuBu[5][1] = 1/256 (241,238,246);
+PuBu[5][2] = 1/256 (189,201,225);
+PuBu[5][3] = 1/256 (116,169,207);
+PuBu[5][4] = 1/256 (43,140,190);
+PuBu[5][5] = 1/256 (4,90,141);
+PuBu[6][1] = 1/256 (241,238,246);
+PuBu[6][2] = 1/256 (208,209,230);
+PuBu[6][3] = 1/256 (166,189,219);
+PuBu[6][4] = 1/256 (116,169,207);
+PuBu[6][5] = 1/256 (43,140,190);
+PuBu[6][6] = 1/256 (4,90,141);
+PuBu[7][1] = 1/256 (241,238,246);
+PuBu[7][2] = 1/256 (208,209,230);
+PuBu[7][3] = 1/256 (166,189,219);
+PuBu[7][4] = 1/256 (116,169,207);
+PuBu[7][5] = 1/256 (54,144,192);
+PuBu[7][6] = 1/256 (5,112,176);
+PuBu[7][7] = 1/256 (3,78,123);
+PuBu[8][1] = 1/256 (255,247,251);
+PuBu[8][2] = 1/256 (236,231,242);
+PuBu[8][3] = 1/256 (208,209,230);
+PuBu[8][4] = 1/256 (166,189,219);
+PuBu[8][5] = 1/256 (116,169,207);
+PuBu[8][6] = 1/256 (54,144,192);
+PuBu[8][7] = 1/256 (5,112,176);
+PuBu[8][8] = 1/256 (3,78,123);
+PuBu[9][1] = 1/256 (255,247,251);
+PuBu[9][2] = 1/256 (236,231,242);
+PuBu[9][3] = 1/256 (208,209,230);
+PuBu[9][4] = 1/256 (166,189,219);
+PuBu[9][5] = 1/256 (116,169,207);
+PuBu[9][6] = 1/256 (54,144,192);
+PuBu[9][7] = 1/256 (5,112,176);
+PuBu[9][8] = 1/256 (4,90,141);
+PuBu[9][9] = 1/256 (2,56,88);
+PuOr[10][10] = 1/256 (45,0,75);
+PuOr[10][1] = 1/256 (127,59,8);
+PuOr[10][2] = 1/256 (179,88,6);
+PuOr[10][3] = 1/256 (224,130,20);
+PuOr[10][4] = 1/256 (253,184,99);
+PuOr[10][5] = 1/256 (254,224,182);
+PuOr[10][6] = 1/256 (216,218,235);
+PuOr[10][7] = 1/256 (178,171,210);
+PuOr[10][8] = 1/256 (128,115,172);
+PuOr[10][9] = 1/256 (84,39,136);
+PuOr[11][10] = 1/256 (84,39,136);
+PuOr[11][11] = 1/256 (45,0,75);
+PuOr[11][1] = 1/256 (127,59,8);
+PuOr[11][2] = 1/256 (179,88,6);
+PuOr[11][3] = 1/256 (224,130,20);
+PuOr[11][4] = 1/256 (253,184,99);
+PuOr[11][5] = 1/256 (254,224,182);
+PuOr[11][6] = 1/256 (247,247,247);
+PuOr[11][7] = 1/256 (216,218,235);
+PuOr[11][8] = 1/256 (178,171,210);
+PuOr[11][9] = 1/256 (128,115,172);
+PuOr[3][1] = 1/256 (241,163,64);
+PuOr[3][2] = 1/256 (247,247,247);
+PuOr[3][3] = 1/256 (153,142,195);
+PuOr[4][1] = 1/256 (230,97,1);
+PuOr[4][2] = 1/256 (253,184,99);
+PuOr[4][3] = 1/256 (178,171,210);
+PuOr[4][4] = 1/256 (94,60,153);
+PuOr[5][1] = 1/256 (230,97,1);
+PuOr[5][2] = 1/256 (253,184,99);
+PuOr[5][3] = 1/256 (247,247,247);
+PuOr[5][4] = 1/256 (178,171,210);
+PuOr[5][5] = 1/256 (94,60,153);
+PuOr[6][1] = 1/256 (179,88,6);
+PuOr[6][2] = 1/256 (241,163,64);
+PuOr[6][3] = 1/256 (254,224,182);
+PuOr[6][4] = 1/256 (216,218,235);
+PuOr[6][5] = 1/256 (153,142,195);
+PuOr[6][6] = 1/256 (84,39,136);
+PuOr[7][1] = 1/256 (179,88,6);
+PuOr[7][2] = 1/256 (241,163,64);
+PuOr[7][3] = 1/256 (254,224,182);
+PuOr[7][4] = 1/256 (247,247,247);
+PuOr[7][5] = 1/256 (216,218,235);
+PuOr[7][6] = 1/256 (153,142,195);
+PuOr[7][7] = 1/256 (84,39,136);
+PuOr[8][1] = 1/256 (179,88,6);
+PuOr[8][2] = 1/256 (224,130,20);
+PuOr[8][3] = 1/256 (253,184,99);
+PuOr[8][4] = 1/256 (254,224,182);
+PuOr[8][5] = 1/256 (216,218,235);
+PuOr[8][6] = 1/256 (178,171,210);
+PuOr[8][7] = 1/256 (128,115,172);
+PuOr[8][8] = 1/256 (84,39,136);
+PuOr[9][1] = 1/256 (179,88,6);
+PuOr[9][2] = 1/256 (224,130,20);
+PuOr[9][3] = 1/256 (253,184,99);
+PuOr[9][4] = 1/256 (254,224,182);
+PuOr[9][5] = 1/256 (247,247,247);
+PuOr[9][6] = 1/256 (216,218,235);
+PuOr[9][7] = 1/256 (178,171,210);
+PuOr[9][8] = 1/256 (128,115,172);
+PuOr[9][9] = 1/256 (84,39,136);
+PuRd[3][1] = 1/256 (231,225,239);
+PuRd[3][2] = 1/256 (201,148,199);
+PuRd[3][3] = 1/256 (221,28,119);
+PuRd[4][1] = 1/256 (241,238,246);
+PuRd[4][2] = 1/256 (215,181,216);
+PuRd[4][3] = 1/256 (223,101,176);
+PuRd[4][4] = 1/256 (206,18,86);
+PuRd[5][1] = 1/256 (241,238,246);
+PuRd[5][2] = 1/256 (215,181,216);
+PuRd[5][3] = 1/256 (223,101,176);
+PuRd[5][4] = 1/256 (221,28,119);
+PuRd[5][5] = 1/256 (152,0,67);
+PuRd[6][1] = 1/256 (241,238,246);
+PuRd[6][2] = 1/256 (212,185,218);
+PuRd[6][3] = 1/256 (201,148,199);
+PuRd[6][4] = 1/256 (223,101,176);
+PuRd[6][5] = 1/256 (221,28,119);
+PuRd[6][6] = 1/256 (152,0,67);
+PuRd[7][1] = 1/256 (241,238,246);
+PuRd[7][2] = 1/256 (212,185,218);
+PuRd[7][3] = 1/256 (201,148,199);
+PuRd[7][4] = 1/256 (223,101,176);
+PuRd[7][5] = 1/256 (231,41,138);
+PuRd[7][6] = 1/256 (206,18,86);
+PuRd[7][7] = 1/256 (145,0,63);
+PuRd[8][1] = 1/256 (247,244,249);
+PuRd[8][2] = 1/256 (231,225,239);
+PuRd[8][3] = 1/256 (212,185,218);
+PuRd[8][4] = 1/256 (201,148,199);
+PuRd[8][5] = 1/256 (223,101,176);
+PuRd[8][6] = 1/256 (231,41,138);
+PuRd[8][7] = 1/256 (206,18,86);
+PuRd[8][8] = 1/256 (145,0,63);
+PuRd[9][1] = 1/256 (247,244,249);
+PuRd[9][2] = 1/256 (231,225,239);
+PuRd[9][3] = 1/256 (212,185,218);
+PuRd[9][4] = 1/256 (201,148,199);
+PuRd[9][5] = 1/256 (223,101,176);
+PuRd[9][6] = 1/256 (231,41,138);
+PuRd[9][7] = 1/256 (206,18,86);
+PuRd[9][8] = 1/256 (152,0,67);
+PuRd[9][9] = 1/256 (103,0,31);
+Purples[3][1] = 1/256 (239,237,245);
+Purples[3][2] = 1/256 (188,189,220);
+Purples[3][3] = 1/256 (117,107,177);
+Purples[4][1] = 1/256 (242,240,247);
+Purples[4][2] = 1/256 (203,201,226);
+Purples[4][3] = 1/256 (158,154,200);
+Purples[4][4] = 1/256 (106,81,163);
+Purples[5][1] = 1/256 (242,240,247);
+Purples[5][2] = 1/256 (203,201,226);
+Purples[5][3] = 1/256 (158,154,200);
+Purples[5][4] = 1/256 (117,107,177);
+Purples[5][5] = 1/256 (84,39,143);
+Purples[6][1] = 1/256 (242,240,247);
+Purples[6][2] = 1/256 (218,218,235);
+Purples[6][3] = 1/256 (188,189,220);
+Purples[6][4] = 1/256 (158,154,200);
+Purples[6][5] = 1/256 (117,107,177);
+Purples[6][6] = 1/256 (84,39,143);
+Purples[7][1] = 1/256 (242,240,247);
+Purples[7][2] = 1/256 (218,218,235);
+Purples[7][3] = 1/256 (188,189,220);
+Purples[7][4] = 1/256 (158,154,200);
+Purples[7][5] = 1/256 (128,125,186);
+Purples[7][6] = 1/256 (106,81,163);
+Purples[7][7] = 1/256 (74,20,134);
+Purples[8][1] = 1/256 (252,251,253);
+Purples[8][2] = 1/256 (239,237,245);
+Purples[8][3] = 1/256 (218,218,235);
+Purples[8][4] = 1/256 (188,189,220);
+Purples[8][5] = 1/256 (158,154,200);
+Purples[8][6] = 1/256 (128,125,186);
+Purples[8][7] = 1/256 (106,81,163);
+Purples[8][8] = 1/256 (74,20,134);
+Purples[9][1] = 1/256 (252,251,253);
+Purples[9][2] = 1/256 (239,237,245);
+Purples[9][3] = 1/256 (218,218,235);
+Purples[9][4] = 1/256 (188,189,220);
+Purples[9][5] = 1/256 (158,154,200);
+Purples[9][6] = 1/256 (128,125,186);
+Purples[9][7] = 1/256 (106,81,163);
+Purples[9][8] = 1/256 (84,39,143);
+Purples[9][9] = 1/256 (63,0,125);
+RdBu[10][10] = 1/256 (5,48,97);
+RdBu[10][1] = 1/256 (103,0,31);
+RdBu[10][2] = 1/256 (178,24,43);
+RdBu[10][3] = 1/256 (214,96,77);
+RdBu[10][4] = 1/256 (244,165,130);
+RdBu[10][5] = 1/256 (253,219,199);
+RdBu[10][6] = 1/256 (209,229,240);
+RdBu[10][7] = 1/256 (146,197,222);
+RdBu[10][8] = 1/256 (67,147,195);
+RdBu[10][9] = 1/256 (33,102,172);
+RdBu[11][10] = 1/256 (33,102,172);
+RdBu[11][11] = 1/256 (5,48,97);
+RdBu[11][1] = 1/256 (103,0,31);
+RdBu[11][2] = 1/256 (178,24,43);
+RdBu[11][3] = 1/256 (214,96,77);
+RdBu[11][4] = 1/256 (244,165,130);
+RdBu[11][5] = 1/256 (253,219,199);
+RdBu[11][6] = 1/256 (247,247,247);
+RdBu[11][7] = 1/256 (209,229,240);
+RdBu[11][8] = 1/256 (146,197,222);
+RdBu[11][9] = 1/256 (67,147,195);
+RdBu[3][1] = 1/256 (239,138,98);
+RdBu[3][2] = 1/256 (247,247,247);
+RdBu[3][3] = 1/256 (103,169,207);
+RdBu[4][1] = 1/256 (202,0,32);
+RdBu[4][2] = 1/256 (244,165,130);
+RdBu[4][3] = 1/256 (146,197,222);
+RdBu[4][4] = 1/256 (5,113,176);
+RdBu[5][1] = 1/256 (202,0,32);
+RdBu[5][2] = 1/256 (244,165,130);
+RdBu[5][3] = 1/256 (247,247,247);
+RdBu[5][4] = 1/256 (146,197,222);
+RdBu[5][5] = 1/256 (5,113,176);
+RdBu[6][1] = 1/256 (178,24,43);
+RdBu[6][2] = 1/256 (239,138,98);
+RdBu[6][3] = 1/256 (253,219,199);
+RdBu[6][4] = 1/256 (209,229,240);
+RdBu[6][5] = 1/256 (103,169,207);
+RdBu[6][6] = 1/256 (33,102,172);
+RdBu[7][1] = 1/256 (178,24,43);
+RdBu[7][2] = 1/256 (239,138,98);
+RdBu[7][3] = 1/256 (253,219,199);
+RdBu[7][4] = 1/256 (247,247,247);
+RdBu[7][5] = 1/256 (209,229,240);
+RdBu[7][6] = 1/256 (103,169,207);
+RdBu[7][7] = 1/256 (33,102,172);
+RdBu[8][1] = 1/256 (178,24,43);
+RdBu[8][2] = 1/256 (214,96,77);
+RdBu[8][3] = 1/256 (244,165,130);
+RdBu[8][4] = 1/256 (253,219,199);
+RdBu[8][5] = 1/256 (209,229,240);
+RdBu[8][6] = 1/256 (146,197,222);
+RdBu[8][7] = 1/256 (67,147,195);
+RdBu[8][8] = 1/256 (33,102,172);
+RdBu[9][1] = 1/256 (178,24,43);
+RdBu[9][2] = 1/256 (214,96,77);
+RdBu[9][3] = 1/256 (244,165,130);
+RdBu[9][4] = 1/256 (253,219,199);
+RdBu[9][5] = 1/256 (247,247,247);
+RdBu[9][6] = 1/256 (209,229,240);
+RdBu[9][7] = 1/256 (146,197,222);
+RdBu[9][8] = 1/256 (67,147,195);
+RdBu[9][9] = 1/256 (33,102,172);
+RdGy[10][10] = 1/256 (26,26,26);
+RdGy[10][1] = 1/256 (103,0,31);
+RdGy[10][2] = 1/256 (178,24,43);
+RdGy[10][3] = 1/256 (214,96,77);
+RdGy[10][4] = 1/256 (244,165,130);
+RdGy[10][5] = 1/256 (253,219,199);
+RdGy[10][6] = 1/256 (224,224,224);
+RdGy[10][7] = 1/256 (186,186,186);
+RdGy[10][8] = 1/256 (135,135,135);
+RdGy[10][9] = 1/256 (77,77,77);
+RdGy[11][10] = 1/256 (77,77,77);
+RdGy[11][11] = 1/256 (26,26,26);
+RdGy[11][1] = 1/256 (103,0,31);
+RdGy[11][2] = 1/256 (178,24,43);
+RdGy[11][3] = 1/256 (214,96,77);
+RdGy[11][4] = 1/256 (244,165,130);
+RdGy[11][5] = 1/256 (253,219,199);
+RdGy[11][6] = 1/256 (255,255,255);
+RdGy[11][7] = 1/256 (224,224,224);
+RdGy[11][8] = 1/256 (186,186,186);
+RdGy[11][9] = 1/256 (135,135,135);
+RdGy[3][1] = 1/256 (239,138,98);
+RdGy[3][2] = 1/256 (255,255,255);
+RdGy[3][3] = 1/256 (153,153,153);
+RdGy[4][1] = 1/256 (202,0,32);
+RdGy[4][2] = 1/256 (244,165,130);
+RdGy[4][3] = 1/256 (186,186,186);
+RdGy[4][4] = 1/256 (64,64,64);
+RdGy[5][1] = 1/256 (202,0,32);
+RdGy[5][2] = 1/256 (244,165,130);
+RdGy[5][3] = 1/256 (255,255,255);
+RdGy[5][4] = 1/256 (186,186,186);
+RdGy[5][5] = 1/256 (64,64,64);
+RdGy[6][1] = 1/256 (178,24,43);
+RdGy[6][2] = 1/256 (239,138,98);
+RdGy[6][3] = 1/256 (253,219,199);
+RdGy[6][4] = 1/256 (224,224,224);
+RdGy[6][5] = 1/256 (153,153,153);
+RdGy[6][6] = 1/256 (77,77,77);
+RdGy[7][1] = 1/256 (178,24,43);
+RdGy[7][2] = 1/256 (239,138,98);
+RdGy[7][3] = 1/256 (253,219,199);
+RdGy[7][4] = 1/256 (255,255,255);
+RdGy[7][5] = 1/256 (224,224,224);
+RdGy[7][6] = 1/256 (153,153,153);
+RdGy[7][7] = 1/256 (77,77,77);
+RdGy[8][1] = 1/256 (178,24,43);
+RdGy[8][2] = 1/256 (214,96,77);
+RdGy[8][3] = 1/256 (244,165,130);
+RdGy[8][4] = 1/256 (253,219,199);
+RdGy[8][5] = 1/256 (224,224,224);
+RdGy[8][6] = 1/256 (186,186,186);
+RdGy[8][7] = 1/256 (135,135,135);
+RdGy[8][8] = 1/256 (77,77,77);
+RdGy[9][1] = 1/256 (178,24,43);
+RdGy[9][2] = 1/256 (214,96,77);
+RdGy[9][3] = 1/256 (244,165,130);
+RdGy[9][4] = 1/256 (253,219,199);
+RdGy[9][5] = 1/256 (255,255,255);
+RdGy[9][6] = 1/256 (224,224,224);
+RdGy[9][7] = 1/256 (186,186,186);
+RdGy[9][8] = 1/256 (135,135,135);
+RdGy[9][9] = 1/256 (77,77,77);
+RdPu[3][1] = 1/256 (253,224,221);
+RdPu[3][2] = 1/256 (250,159,181);
+RdPu[3][3] = 1/256 (197,27,138);
+RdPu[4][1] = 1/256 (254,235,226);
+RdPu[4][2] = 1/256 (251,180,185);
+RdPu[4][3] = 1/256 (247,104,161);
+RdPu[4][4] = 1/256 (174,1,126);
+RdPu[5][1] = 1/256 (254,235,226);
+RdPu[5][2] = 1/256 (251,180,185);
+RdPu[5][3] = 1/256 (247,104,161);
+RdPu[5][4] = 1/256 (197,27,138);
+RdPu[5][5] = 1/256 (122,1,119);
+RdPu[6][1] = 1/256 (254,235,226);
+RdPu[6][2] = 1/256 (252,197,192);
+RdPu[6][3] = 1/256 (250,159,181);
+RdPu[6][4] = 1/256 (247,104,161);
+RdPu[6][5] = 1/256 (197,27,138);
+RdPu[6][6] = 1/256 (122,1,119);
+RdPu[7][1] = 1/256 (254,235,226);
+RdPu[7][2] = 1/256 (252,197,192);
+RdPu[7][3] = 1/256 (250,159,181);
+RdPu[7][4] = 1/256 (247,104,161);
+RdPu[7][5] = 1/256 (221,52,151);
+RdPu[7][6] = 1/256 (174,1,126);
+RdPu[7][7] = 1/256 (122,1,119);
+RdPu[8][1] = 1/256 (255,247,243);
+RdPu[8][2] = 1/256 (253,224,221);
+RdPu[8][3] = 1/256 (252,197,192);
+RdPu[8][4] = 1/256 (250,159,181);
+RdPu[8][5] = 1/256 (247,104,161);
+RdPu[8][6] = 1/256 (221,52,151);
+RdPu[8][7] = 1/256 (174,1,126);
+RdPu[8][8] = 1/256 (122,1,119);
+RdPu[9][1] = 1/256 (255,247,243);
+RdPu[9][2] = 1/256 (253,224,221);
+RdPu[9][3] = 1/256 (252,197,192);
+RdPu[9][4] = 1/256 (250,159,181);
+RdPu[9][5] = 1/256 (247,104,161);
+RdPu[9][6] = 1/256 (221,52,151);
+RdPu[9][7] = 1/256 (174,1,126);
+RdPu[9][8] = 1/256 (122,1,119);
+RdPu[9][9] = 1/256 (73,0,106);
+RdYlBu[10][10] = 1/256 (49,54,149);
+RdYlBu[10][1] = 1/256 (165,0,38);
+RdYlBu[10][2] = 1/256 (215,48,39);
+RdYlBu[10][3] = 1/256 (244,109,67);
+RdYlBu[10][4] = 1/256 (253,174,97);
+RdYlBu[10][5] = 1/256 (254,224,144);
+RdYlBu[10][6] = 1/256 (224,243,248);
+RdYlBu[10][7] = 1/256 (171,217,233);
+RdYlBu[10][8] = 1/256 (116,173,209);
+RdYlBu[10][9] = 1/256 (69,117,180);
+RdYlBu[11][10] = 1/256 (69,117,180);
+RdYlBu[11][11] = 1/256 (49,54,149);
+RdYlBu[11][1] = 1/256 (165,0,38);
+RdYlBu[11][2] = 1/256 (215,48,39);
+RdYlBu[11][3] = 1/256 (244,109,67);
+RdYlBu[11][4] = 1/256 (253,174,97);
+RdYlBu[11][5] = 1/256 (254,224,144);
+RdYlBu[11][6] = 1/256 (255,255,191);
+RdYlBu[11][7] = 1/256 (224,243,248);
+RdYlBu[11][8] = 1/256 (171,217,233);
+RdYlBu[11][9] = 1/256 (116,173,209);
+RdYlBu[3][1] = 1/256 (252,141,89);
+RdYlBu[3][2] = 1/256 (255,255,191);
+RdYlBu[3][3] = 1/256 (145,191,219);
+RdYlBu[4][1] = 1/256 (215,25,28);
+RdYlBu[4][2] = 1/256 (253,174,97);
+RdYlBu[4][3] = 1/256 (171,217,233);
+RdYlBu[4][4] = 1/256 (44,123,182);
+RdYlBu[5][1] = 1/256 (215,25,28);
+RdYlBu[5][2] = 1/256 (253,174,97);
+RdYlBu[5][3] = 1/256 (255,255,191);
+RdYlBu[5][4] = 1/256 (171,217,233);
+RdYlBu[5][5] = 1/256 (44,123,182);
+RdYlBu[6][1] = 1/256 (215,48,39);
+RdYlBu[6][2] = 1/256 (252,141,89);
+RdYlBu[6][3] = 1/256 (254,224,144);
+RdYlBu[6][4] = 1/256 (224,243,248);
+RdYlBu[6][5] = 1/256 (145,191,219);
+RdYlBu[6][6] = 1/256 (69,117,180);
+RdYlBu[7][1] = 1/256 (215,48,39);
+RdYlBu[7][2] = 1/256 (252,141,89);
+RdYlBu[7][3] = 1/256 (254,224,144);
+RdYlBu[7][4] = 1/256 (255,255,191);
+RdYlBu[7][5] = 1/256 (224,243,248);
+RdYlBu[7][6] = 1/256 (145,191,219);
+RdYlBu[7][7] = 1/256 (69,117,180);
+RdYlBu[8][1] = 1/256 (215,48,39);
+RdYlBu[8][2] = 1/256 (244,109,67);
+RdYlBu[8][3] = 1/256 (253,174,97);
+RdYlBu[8][4] = 1/256 (254,224,144);
+RdYlBu[8][5] = 1/256 (224,243,248);
+RdYlBu[8][6] = 1/256 (171,217,233);
+RdYlBu[8][7] = 1/256 (116,173,209);
+RdYlBu[8][8] = 1/256 (69,117,180);
+RdYlBu[9][1] = 1/256 (215,48,39);
+RdYlBu[9][2] = 1/256 (244,109,67);
+RdYlBu[9][3] = 1/256 (253,174,97);
+RdYlBu[9][4] = 1/256 (254,224,144);
+RdYlBu[9][5] = 1/256 (255,255,191);
+RdYlBu[9][6] = 1/256 (224,243,248);
+RdYlBu[9][7] = 1/256 (171,217,233);
+RdYlBu[9][8] = 1/256 (116,173,209);
+RdYlBu[9][9] = 1/256 (69,117,180);
+RdYlGn[10][10] = 1/256 (0,104,55);
+RdYlGn[10][1] = 1/256 (165,0,38);
+RdYlGn[10][2] = 1/256 (215,48,39);
+RdYlGn[10][3] = 1/256 (244,109,67);
+RdYlGn[10][4] = 1/256 (253,174,97);
+RdYlGn[10][5] = 1/256 (254,224,139);
+RdYlGn[10][6] = 1/256 (217,239,139);
+RdYlGn[10][7] = 1/256 (166,217,106);
+RdYlGn[10][8] = 1/256 (102,189,99);
+RdYlGn[10][9] = 1/256 (26,152,80);
+RdYlGn[11][10] = 1/256 (26,152,80);
+RdYlGn[11][11] = 1/256 (0,104,55);
+RdYlGn[11][1] = 1/256 (165,0,38);
+RdYlGn[11][2] = 1/256 (215,48,39);
+RdYlGn[11][3] = 1/256 (244,109,67);
+RdYlGn[11][4] = 1/256 (253,174,97);
+RdYlGn[11][5] = 1/256 (254,224,139);
+RdYlGn[11][6] = 1/256 (255,255,191);
+RdYlGn[11][7] = 1/256 (217,239,139);
+RdYlGn[11][8] = 1/256 (166,217,106);
+RdYlGn[11][9] = 1/256 (102,189,99);
+RdYlGn[3][1] = 1/256 (252,141,89);
+RdYlGn[3][2] = 1/256 (255,255,191);
+RdYlGn[3][3] = 1/256 (145,207,96);
+RdYlGn[4][1] = 1/256 (215,25,28);
+RdYlGn[4][2] = 1/256 (253,174,97);
+RdYlGn[4][3] = 1/256 (166,217,106);
+RdYlGn[4][4] = 1/256 (26,150,65);
+RdYlGn[5][1] = 1/256 (215,25,28);
+RdYlGn[5][2] = 1/256 (253,174,97);
+RdYlGn[5][3] = 1/256 (255,255,191);
+RdYlGn[5][4] = 1/256 (166,217,106);
+RdYlGn[5][5] = 1/256 (26,150,65);
+RdYlGn[6][1] = 1/256 (215,48,39);
+RdYlGn[6][2] = 1/256 (252,141,89);
+RdYlGn[6][3] = 1/256 (254,224,139);
+RdYlGn[6][4] = 1/256 (217,239,139);
+RdYlGn[6][5] = 1/256 (145,207,96);
+RdYlGn[6][6] = 1/256 (26,152,80);
+RdYlGn[7][1] = 1/256 (215,48,39);
+RdYlGn[7][2] = 1/256 (252,141,89);
+RdYlGn[7][3] = 1/256 (254,224,139);
+RdYlGn[7][4] = 1/256 (255,255,191);
+RdYlGn[7][5] = 1/256 (217,239,139);
+RdYlGn[7][6] = 1/256 (145,207,96);
+RdYlGn[7][7] = 1/256 (26,152,80);
+RdYlGn[8][1] = 1/256 (215,48,39);
+RdYlGn[8][2] = 1/256 (244,109,67);
+RdYlGn[8][3] = 1/256 (253,174,97);
+RdYlGn[8][4] = 1/256 (254,224,139);
+RdYlGn[8][5] = 1/256 (217,239,139);
+RdYlGn[8][6] = 1/256 (166,217,106);
+RdYlGn[8][7] = 1/256 (102,189,99);
+RdYlGn[8][8] = 1/256 (26,152,80);
+RdYlGn[9][1] = 1/256 (215,48,39);
+RdYlGn[9][2] = 1/256 (244,109,67);
+RdYlGn[9][3] = 1/256 (253,174,97);
+RdYlGn[9][4] = 1/256 (254,224,139);
+RdYlGn[9][5] = 1/256 (255,255,191);
+RdYlGn[9][6] = 1/256 (217,239,139);
+RdYlGn[9][7] = 1/256 (166,217,106);
+RdYlGn[9][8] = 1/256 (102,189,99);
+RdYlGn[9][9] = 1/256 (26,152,80);
+Reds[3][1] = 1/256 (254,224,210);
+Reds[3][2] = 1/256 (252,146,114);
+Reds[3][3] = 1/256 (222,45,38);
+Reds[4][1] = 1/256 (254,229,217);
+Reds[4][2] = 1/256 (252,174,145);
+Reds[4][3] = 1/256 (251,106,74);
+Reds[4][4] = 1/256 (203,24,29);
+Reds[5][1] = 1/256 (254,229,217);
+Reds[5][2] = 1/256 (252,174,145);
+Reds[5][3] = 1/256 (251,106,74);
+Reds[5][4] = 1/256 (222,45,38);
+Reds[5][5] = 1/256 (165,15,21);
+Reds[6][1] = 1/256 (254,229,217);
+Reds[6][2] = 1/256 (252,187,161);
+Reds[6][3] = 1/256 (252,146,114);
+Reds[6][4] = 1/256 (251,106,74);
+Reds[6][5] = 1/256 (222,45,38);
+Reds[6][6] = 1/256 (165,15,21);
+Reds[7][1] = 1/256 (254,229,217);
+Reds[7][2] = 1/256 (252,187,161);
+Reds[7][3] = 1/256 (252,146,114);
+Reds[7][4] = 1/256 (251,106,74);
+Reds[7][5] = 1/256 (239,59,44);
+Reds[7][6] = 1/256 (203,24,29);
+Reds[7][7] = 1/256 (153,0,13);
+Reds[8][1] = 1/256 (255,245,240);
+Reds[8][2] = 1/256 (254,224,210);
+Reds[8][3] = 1/256 (252,187,161);
+Reds[8][4] = 1/256 (252,146,114);
+Reds[8][5] = 1/256 (251,106,74);
+Reds[8][6] = 1/256 (239,59,44);
+Reds[8][7] = 1/256 (203,24,29);
+Reds[8][8] = 1/256 (153,0,13);
+Reds[9][1] = 1/256 (255,245,240);
+Reds[9][2] = 1/256 (254,224,210);
+Reds[9][3] = 1/256 (252,187,161);
+Reds[9][4] = 1/256 (252,146,114);
+Reds[9][5] = 1/256 (251,106,74);
+Reds[9][6] = 1/256 (239,59,44);
+Reds[9][7] = 1/256 (203,24,29);
+Reds[9][8] = 1/256 (165,15,21);
+Reds[9][9] = 1/256 (103,0,13);
+SetOne[3][1] = 1/256 (228,26,28);
+SetOne[3][2] = 1/256 (55,126,184);
+SetOne[3][3] = 1/256 (77,175,74);
+SetOne[4][1] = 1/256 (228,26,28);
+SetOne[4][2] = 1/256 (55,126,184);
+SetOne[4][3] = 1/256 (77,175,74);
+SetOne[4][4] = 1/256 (152,78,163);
+SetOne[5][1] = 1/256 (228,26,28);
+SetOne[5][2] = 1/256 (55,126,184);
+SetOne[5][3] = 1/256 (77,175,74);
+SetOne[5][4] = 1/256 (152,78,163);
+SetOne[5][5] = 1/256 (255,127,0);
+SetOne[6][1] = 1/256 (228,26,28);
+SetOne[6][2] = 1/256 (55,126,184);
+SetOne[6][3] = 1/256 (77,175,74);
+SetOne[6][4] = 1/256 (152,78,163);
+SetOne[6][5] = 1/256 (255,127,0);
+SetOne[6][6] = 1/256 (255,255,51);
+SetOne[7][1] = 1/256 (228,26,28);
+SetOne[7][2] = 1/256 (55,126,184);
+SetOne[7][3] = 1/256 (77,175,74);
+SetOne[7][4] = 1/256 (152,78,163);
+SetOne[7][5] = 1/256 (255,127,0);
+SetOne[7][6] = 1/256 (255,255,51);
+SetOne[7][7] = 1/256 (166,86,40);
+SetOne[8][1] = 1/256 (228,26,28);
+SetOne[8][2] = 1/256 (55,126,184);
+SetOne[8][3] = 1/256 (77,175,74);
+SetOne[8][4] = 1/256 (152,78,163);
+SetOne[8][5] = 1/256 (255,127,0);
+SetOne[8][6] = 1/256 (255,255,51);
+SetOne[8][7] = 1/256 (166,86,40);
+SetOne[8][8] = 1/256 (247,129,191);
+SetOne[9][1] = 1/256 (228,26,28);
+SetOne[9][2] = 1/256 (55,126,184);
+SetOne[9][3] = 1/256 (77,175,74);
+SetOne[9][4] = 1/256 (152,78,163);
+SetOne[9][5] = 1/256 (255,127,0);
+SetOne[9][6] = 1/256 (255,255,51);
+SetOne[9][7] = 1/256 (166,86,40);
+SetOne[9][8] = 1/256 (247,129,191);
+SetOne[9][9] = 1/256 (153,153,153);
+SetThree[10][10] = 1/256 (188,128,189);
+SetThree[10][1] = 1/256 (141,211,199);
+SetThree[10][2] = 1/256 (255,255,179);
+SetThree[10][3] = 1/256 (190,186,218);
+SetThree[10][4] = 1/256 (251,128,114);
+SetThree[10][5] = 1/256 (128,177,211);
+SetThree[10][6] = 1/256 (253,180,98);
+SetThree[10][7] = 1/256 (179,222,105);
+SetThree[10][8] = 1/256 (252,205,229);
+SetThree[10][9] = 1/256 (217,217,217);
+SetThree[11][10] = 1/256 (188,128,189);
+SetThree[11][11] = 1/256 (204,235,197);
+SetThree[11][1] = 1/256 (141,211,199);
+SetThree[11][2] = 1/256 (255,255,179);
+SetThree[11][3] = 1/256 (190,186,218);
+SetThree[11][4] = 1/256 (251,128,114);
+SetThree[11][5] = 1/256 (128,177,211);
+SetThree[11][6] = 1/256 (253,180,98);
+SetThree[11][7] = 1/256 (179,222,105);
+SetThree[11][8] = 1/256 (252,205,229);
+SetThree[11][9] = 1/256 (217,217,217);
+SetThree[12][10] = 1/256 (188,128,189);
+SetThree[12][11] = 1/256 (204,235,197);
+SetThree[12][12] = 1/256 (255,237,111);
+SetThree[12][1] = 1/256 (141,211,199);
+SetThree[12][2] = 1/256 (255,255,179);
+SetThree[12][3] = 1/256 (190,186,218);
+SetThree[12][4] = 1/256 (251,128,114);
+SetThree[12][5] = 1/256 (128,177,211);
+SetThree[12][6] = 1/256 (253,180,98);
+SetThree[12][7] = 1/256 (179,222,105);
+SetThree[12][8] = 1/256 (252,205,229);
+SetThree[12][9] = 1/256 (217,217,217);
+SetThree[3][1] = 1/256 (141,211,199);
+SetThree[3][2] = 1/256 (255,255,179);
+SetThree[3][3] = 1/256 (190,186,218);
+SetThree[4][1] = 1/256 (141,211,199);
+SetThree[4][2] = 1/256 (255,255,179);
+SetThree[4][3] = 1/256 (190,186,218);
+SetThree[4][4] = 1/256 (251,128,114);
+SetThree[5][1] = 1/256 (141,211,199);
+SetThree[5][2] = 1/256 (255,255,179);
+SetThree[5][3] = 1/256 (190,186,218);
+SetThree[5][4] = 1/256 (251,128,114);
+SetThree[5][5] = 1/256 (128,177,211);
+SetThree[6][1] = 1/256 (141,211,199);
+SetThree[6][2] = 1/256 (255,255,179);
+SetThree[6][3] = 1/256 (190,186,218);
+SetThree[6][4] = 1/256 (251,128,114);
+SetThree[6][5] = 1/256 (128,177,211);
+SetThree[6][6] = 1/256 (253,180,98);
+SetThree[7][1] = 1/256 (141,211,199);
+SetThree[7][2] = 1/256 (255,255,179);
+SetThree[7][3] = 1/256 (190,186,218);
+SetThree[7][4] = 1/256 (251,128,114);
+SetThree[7][5] = 1/256 (128,177,211);
+SetThree[7][6] = 1/256 (253,180,98);
+SetThree[7][7] = 1/256 (179,222,105);
+SetThree[8][1] = 1/256 (141,211,199);
+SetThree[8][2] = 1/256 (255,255,179);
+SetThree[8][3] = 1/256 (190,186,218);
+SetThree[8][4] = 1/256 (251,128,114);
+SetThree[8][5] = 1/256 (128,177,211);
+SetThree[8][6] = 1/256 (253,180,98);
+SetThree[8][7] = 1/256 (179,222,105);
+SetThree[8][8] = 1/256 (252,205,229);
+SetThree[9][1] = 1/256 (141,211,199);
+SetThree[9][2] = 1/256 (255,255,179);
+SetThree[9][3] = 1/256 (190,186,218);
+SetThree[9][4] = 1/256 (251,128,114);
+SetThree[9][5] = 1/256 (128,177,211);
+SetThree[9][6] = 1/256 (253,180,98);
+SetThree[9][7] = 1/256 (179,222,105);
+SetThree[9][8] = 1/256 (252,205,229);
+SetThree[9][9] = 1/256 (217,217,217);
+SetTwo[3][1] = 1/256 (102,194,165);
+SetTwo[3][2] = 1/256 (252,141,98);
+SetTwo[3][3] = 1/256 (141,160,203);
+SetTwo[4][1] = 1/256 (102,194,165);
+SetTwo[4][2] = 1/256 (252,141,98);
+SetTwo[4][3] = 1/256 (141,160,203);
+SetTwo[4][4] = 1/256 (231,138,195);
+SetTwo[5][1] = 1/256 (102,194,165);
+SetTwo[5][2] = 1/256 (252,141,98);
+SetTwo[5][3] = 1/256 (141,160,203);
+SetTwo[5][4] = 1/256 (231,138,195);
+SetTwo[5][5] = 1/256 (166,216,84);
+SetTwo[6][1] = 1/256 (102,194,165);
+SetTwo[6][2] = 1/256 (252,141,98);
+SetTwo[6][3] = 1/256 (141,160,203);
+SetTwo[6][4] = 1/256 (231,138,195);
+SetTwo[6][5] = 1/256 (166,216,84);
+SetTwo[6][6] = 1/256 (255,217,47);
+SetTwo[7][1] = 1/256 (102,194,165);
+SetTwo[7][2] = 1/256 (252,141,98);
+SetTwo[7][3] = 1/256 (141,160,203);
+SetTwo[7][4] = 1/256 (231,138,195);
+SetTwo[7][5] = 1/256 (166,216,84);
+SetTwo[7][6] = 1/256 (255,217,47);
+SetTwo[7][7] = 1/256 (229,196,148);
+SetTwo[8][1] = 1/256 (102,194,165);
+SetTwo[8][2] = 1/256 (252,141,98);
+SetTwo[8][3] = 1/256 (141,160,203);
+SetTwo[8][4] = 1/256 (231,138,195);
+SetTwo[8][5] = 1/256 (166,216,84);
+SetTwo[8][6] = 1/256 (255,217,47);
+SetTwo[8][7] = 1/256 (229,196,148);
+SetTwo[8][8] = 1/256 (179,179,179);
+Spectral[10][10] = 1/256 (94,79,162);
+Spectral[10][1] = 1/256 (158,1,66);
+Spectral[10][2] = 1/256 (213,62,79);
+Spectral[10][3] = 1/256 (244,109,67);
+Spectral[10][4] = 1/256 (253,174,97);
+Spectral[10][5] = 1/256 (254,224,139);
+Spectral[10][6] = 1/256 (230,245,152);
+Spectral[10][7] = 1/256 (171,221,164);
+Spectral[10][8] = 1/256 (102,194,165);
+Spectral[10][9] = 1/256 (50,136,189);
+Spectral[11][10] = 1/256 (50,136,189);
+Spectral[11][11] = 1/256 (94,79,162);
+Spectral[11][1] = 1/256 (158,1,66);
+Spectral[11][2] = 1/256 (213,62,79);
+Spectral[11][3] = 1/256 (244,109,67);
+Spectral[11][4] = 1/256 (253,174,97);
+Spectral[11][5] = 1/256 (254,224,139);
+Spectral[11][6] = 1/256 (255,255,191);
+Spectral[11][7] = 1/256 (230,245,152);
+Spectral[11][8] = 1/256 (171,221,164);
+Spectral[11][9] = 1/256 (102,194,165);
+Spectral[3][1] = 1/256 (252,141,89);
+Spectral[3][2] = 1/256 (255,255,191);
+Spectral[3][3] = 1/256 (153,213,148);
+Spectral[4][1] = 1/256 (215,25,28);
+Spectral[4][2] = 1/256 (253,174,97);
+Spectral[4][3] = 1/256 (171,221,164);
+Spectral[4][4] = 1/256 (43,131,186);
+Spectral[5][1] = 1/256 (215,25,28);
+Spectral[5][2] = 1/256 (253,174,97);
+Spectral[5][3] = 1/256 (255,255,191);
+Spectral[5][4] = 1/256 (171,221,164);
+Spectral[5][5] = 1/256 (43,131,186);
+Spectral[6][1] = 1/256 (213,62,79);
+Spectral[6][2] = 1/256 (252,141,89);
+Spectral[6][3] = 1/256 (254,224,139);
+Spectral[6][4] = 1/256 (230,245,152);
+Spectral[6][5] = 1/256 (153,213,148);
+Spectral[6][6] = 1/256 (50,136,189);
+Spectral[7][1] = 1/256 (213,62,79);
+Spectral[7][2] = 1/256 (252,141,89);
+Spectral[7][3] = 1/256 (254,224,139);
+Spectral[7][4] = 1/256 (255,255,191);
+Spectral[7][5] = 1/256 (230,245,152);
+Spectral[7][6] = 1/256 (153,213,148);
+Spectral[7][7] = 1/256 (50,136,189);
+Spectral[8][1] = 1/256 (213,62,79);
+Spectral[8][2] = 1/256 (244,109,67);
+Spectral[8][3] = 1/256 (253,174,97);
+Spectral[8][4] = 1/256 (254,224,139);
+Spectral[8][5] = 1/256 (230,245,152);
+Spectral[8][6] = 1/256 (171,221,164);
+Spectral[8][7] = 1/256 (102,194,165);
+Spectral[8][8] = 1/256 (50,136,189);
+Spectral[9][1] = 1/256 (213,62,79);
+Spectral[9][2] = 1/256 (244,109,67);
+Spectral[9][3] = 1/256 (253,174,97);
+Spectral[9][4] = 1/256 (254,224,139);
+Spectral[9][5] = 1/256 (255,255,191);
+Spectral[9][6] = 1/256 (230,245,152);
+Spectral[9][7] = 1/256 (171,221,164);
+Spectral[9][8] = 1/256 (102,194,165);
+Spectral[9][9] = 1/256 (50,136,189);
+YlGnBu[3][1] = 1/256 (237,248,177);
+YlGnBu[3][2] = 1/256 (127,205,187);
+YlGnBu[3][3] = 1/256 (44,127,184);
+YlGnBu[4][1] = 1/256 (255,255,204);
+YlGnBu[4][2] = 1/256 (161,218,180);
+YlGnBu[4][3] = 1/256 (65,182,196);
+YlGnBu[4][4] = 1/256 (34,94,168);
+YlGnBu[5][1] = 1/256 (255,255,204);
+YlGnBu[5][2] = 1/256 (161,218,180);
+YlGnBu[5][3] = 1/256 (65,182,196);
+YlGnBu[5][4] = 1/256 (44,127,184);
+YlGnBu[5][5] = 1/256 (37,52,148);
+YlGnBu[6][1] = 1/256 (255,255,204);
+YlGnBu[6][2] = 1/256 (199,233,180);
+YlGnBu[6][3] = 1/256 (127,205,187);
+YlGnBu[6][4] = 1/256 (65,182,196);
+YlGnBu[6][5] = 1/256 (44,127,184);
+YlGnBu[6][6] = 1/256 (37,52,148);
+YlGnBu[7][1] = 1/256 (255,255,204);
+YlGnBu[7][2] = 1/256 (199,233,180);
+YlGnBu[7][3] = 1/256 (127,205,187);
+YlGnBu[7][4] = 1/256 (65,182,196);
+YlGnBu[7][5] = 1/256 (29,145,192);
+YlGnBu[7][6] = 1/256 (34,94,168);
+YlGnBu[7][7] = 1/256 (12,44,132);
+YlGnBu[8][1] = 1/256 (255,255,217);
+YlGnBu[8][2] = 1/256 (237,248,177);
+YlGnBu[8][3] = 1/256 (199,233,180);
+YlGnBu[8][4] = 1/256 (127,205,187);
+YlGnBu[8][5] = 1/256 (65,182,196);
+YlGnBu[8][6] = 1/256 (29,145,192);
+YlGnBu[8][7] = 1/256 (34,94,168);
+YlGnBu[8][8] = 1/256 (12,44,132);
+YlGnBu[9][1] = 1/256 (255,255,217);
+YlGnBu[9][2] = 1/256 (237,248,177);
+YlGnBu[9][3] = 1/256 (199,233,180);
+YlGnBu[9][4] = 1/256 (127,205,187);
+YlGnBu[9][5] = 1/256 (65,182,196);
+YlGnBu[9][6] = 1/256 (29,145,192);
+YlGnBu[9][7] = 1/256 (34,94,168);
+YlGnBu[9][8] = 1/256 (37,52,148);
+YlGnBu[9][9] = 1/256 (8,29,88);
+YlGn[3][1] = 1/256 (247,252,185);
+YlGn[3][2] = 1/256 (173,221,142);
+YlGn[3][3] = 1/256 (49,163,84);
+YlGn[4][1] = 1/256 (255,255,204);
+YlGn[4][2] = 1/256 (194,230,153);
+YlGn[4][3] = 1/256 (120,198,121);
+YlGn[4][4] = 1/256 (35,132,67);
+YlGn[5][1] = 1/256 (255,255,204);
+YlGn[5][2] = 1/256 (194,230,153);
+YlGn[5][3] = 1/256 (120,198,121);
+YlGn[5][4] = 1/256 (49,163,84);
+YlGn[5][5] = 1/256 (0,104,55);
+YlGn[6][1] = 1/256 (255,255,204);
+YlGn[6][2] = 1/256 (217,240,163);
+YlGn[6][3] = 1/256 (173,221,142);
+YlGn[6][4] = 1/256 (120,198,121);
+YlGn[6][5] = 1/256 (49,163,84);
+YlGn[6][6] = 1/256 (0,104,55);
+YlGn[7][1] = 1/256 (255,255,204);
+YlGn[7][2] = 1/256 (217,240,163);
+YlGn[7][3] = 1/256 (173,221,142);
+YlGn[7][4] = 1/256 (120,198,121);
+YlGn[7][5] = 1/256 (65,171,93);
+YlGn[7][6] = 1/256 (35,132,67);
+YlGn[7][7] = 1/256 (0,90,50);
+YlGn[8][1] = 1/256 (255,255,229);
+YlGn[8][2] = 1/256 (247,252,185);
+YlGn[8][3] = 1/256 (217,240,163);
+YlGn[8][4] = 1/256 (173,221,142);
+YlGn[8][5] = 1/256 (120,198,121);
+YlGn[8][6] = 1/256 (65,171,93);
+YlGn[8][7] = 1/256 (35,132,67);
+YlGn[8][8] = 1/256 (0,90,50);
+YlGn[9][1] = 1/256 (255,255,229);
+YlGn[9][2] = 1/256 (247,252,185);
+YlGn[9][3] = 1/256 (217,240,163);
+YlGn[9][4] = 1/256 (173,221,142);
+YlGn[9][5] = 1/256 (120,198,121);
+YlGn[9][6] = 1/256 (65,171,93);
+YlGn[9][7] = 1/256 (35,132,67);
+YlGn[9][8] = 1/256 (0,104,55);
+YlGn[9][9] = 1/256 (0,69,41);
+YlOrBr[3][1] = 1/256 (255,247,188);
+YlOrBr[3][2] = 1/256 (254,196,79);
+YlOrBr[3][3] = 1/256 (217,95,14);
+YlOrBr[4][1] = 1/256 (255,255,212);
+YlOrBr[4][2] = 1/256 (254,217,142);
+YlOrBr[4][3] = 1/256 (254,153,41);
+YlOrBr[4][4] = 1/256 (204,76,2);
+YlOrBr[5][1] = 1/256 (255,255,212);
+YlOrBr[5][2] = 1/256 (254,217,142);
+YlOrBr[5][3] = 1/256 (254,153,41);
+YlOrBr[5][4] = 1/256 (217,95,14);
+YlOrBr[5][5] = 1/256 (153,52,4);
+YlOrBr[6][1] = 1/256 (255,255,212);
+YlOrBr[6][2] = 1/256 (254,227,145);
+YlOrBr[6][3] = 1/256 (254,196,79);
+YlOrBr[6][4] = 1/256 (254,153,41);
+YlOrBr[6][5] = 1/256 (217,95,14);
+YlOrBr[6][6] = 1/256 (153,52,4);
+YlOrBr[7][1] = 1/256 (255,255,212);
+YlOrBr[7][2] = 1/256 (254,227,145);
+YlOrBr[7][3] = 1/256 (254,196,79);
+YlOrBr[7][4] = 1/256 (254,153,41);
+YlOrBr[7][5] = 1/256 (236,112,20);
+YlOrBr[7][6] = 1/256 (204,76,2);
+YlOrBr[7][7] = 1/256 (140,45,4);
+YlOrBr[8][1] = 1/256 (255,255,229);
+YlOrBr[8][2] = 1/256 (255,247,188);
+YlOrBr[8][3] = 1/256 (254,227,145);
+YlOrBr[8][4] = 1/256 (254,196,79);
+YlOrBr[8][5] = 1/256 (254,153,41);
+YlOrBr[8][6] = 1/256 (236,112,20);
+YlOrBr[8][7] = 1/256 (204,76,2);
+YlOrBr[8][8] = 1/256 (140,45,4);
+YlOrBr[9][1] = 1/256 (255,255,229);
+YlOrBr[9][2] = 1/256 (255,247,188);
+YlOrBr[9][3] = 1/256 (254,227,145);
+YlOrBr[9][4] = 1/256 (254,196,79);
+YlOrBr[9][5] = 1/256 (254,153,41);
+YlOrBr[9][6] = 1/256 (236,112,20);
+YlOrBr[9][7] = 1/256 (204,76,2);
+YlOrBr[9][8] = 1/256 (153,52,4);
+YlOrBr[9][9] = 1/256 (102,37,6);
+YlOrRd[3][1] = 1/256 (255,237,160);
+YlOrRd[3][2] = 1/256 (254,178,76);
+YlOrRd[3][3] = 1/256 (240,59,32);
+YlOrRd[4][1] = 1/256 (255,255,178);
+YlOrRd[4][2] = 1/256 (254,204,92);
+YlOrRd[4][3] = 1/256 (253,141,60);
+YlOrRd[4][4] = 1/256 (227,26,28);
+YlOrRd[5][1] = 1/256 (255,255,178);
+YlOrRd[5][2] = 1/256 (254,204,92);
+YlOrRd[5][3] = 1/256 (253,141,60);
+YlOrRd[5][4] = 1/256 (240,59,32);
+YlOrRd[5][5] = 1/256 (189,0,38);
+YlOrRd[6][1] = 1/256 (255,255,178);
+YlOrRd[6][2] = 1/256 (254,217,118);
+YlOrRd[6][3] = 1/256 (254,178,76);
+YlOrRd[6][4] = 1/256 (253,141,60);
+YlOrRd[6][5] = 1/256 (240,59,32);
+YlOrRd[6][6] = 1/256 (189,0,38);
+YlOrRd[7][1] = 1/256 (255,255,178);
+YlOrRd[7][2] = 1/256 (254,217,118);
+YlOrRd[7][3] = 1/256 (254,178,76);
+YlOrRd[7][4] = 1/256 (253,141,60);
+YlOrRd[7][5] = 1/256 (252,78,42);
+YlOrRd[7][6] = 1/256 (227,26,28);
+YlOrRd[7][7] = 1/256 (177,0,38);
+YlOrRd[8][1] = 1/256 (255,255,204);
+YlOrRd[8][2] = 1/256 (255,237,160);
+YlOrRd[8][3] = 1/256 (254,217,118);
+YlOrRd[8][4] = 1/256 (254,178,76);
+YlOrRd[8][5] = 1/256 (253,141,60);
+YlOrRd[8][6] = 1/256 (252,78,42);
+YlOrRd[8][7] = 1/256 (227,26,28);
+YlOrRd[8][8] = 1/256 (177,0,38);
+YlOrRd[9][1] = 1/256 (255,255,204);
+YlOrRd[9][2] = 1/256 (255,237,160);
+YlOrRd[9][3] = 1/256 (254,217,118);
+YlOrRd[9][4] = 1/256 (254,178,76);
+YlOrRd[9][5] = 1/256 (253,141,60);
+YlOrRd[9][6] = 1/256 (252,78,42);
+YlOrRd[9][7] = 1/256 (227,26,28);
+YlOrRd[9][8] = 1/256 (189,0,38);
+YlOrRd[9][9] = 1/256 (128,0,38);
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.mp b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.mp
new file mode 100644
index 0000000000..25789c8d99
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.mp
@@ -0,0 +1,45 @@
+prologues := 3;
+outputtemplate := "%j.eps";
+
+input colorbrewer-cmyk
+
+beginfig(1);
+ defaultfont := "phvr8r";
+ x = 0; y = 0; bx = 8; by = -13; path box; box = unitsquare shifted -(1/2,1/2) xscaled bx yscaled by;
+ forsuffixes gamut =
+ Reds, Oranges, Greens, Blues, Purples, Greys,
+ Skip,
+ OrRd, YlOrRd, YlOrBr, YlGn, BuGn, PuBuGn, YlGnBu, GnBu, PuBu, RdPu, PuRd, BuPu,
+ Skip,
+ PRGn, PiYG, BrBG, PuOr, RdGy, RdBu, RdYlBu, RdYlGn, Spectral,
+ Skip,
+ Accent, DarkTwo, PastelTwo, SetTwo,
+ PastelOne, SetOne, SetThree, Paired:
+
+ for i=3 upto 12:
+ if known gamut[i][1]:
+ label.lft(decimal i & ":", (x,y));
+ if i=3:
+ label.lft(str gamut, (x-15,y));
+ fi
+ fi
+ for j = 1 upto i:
+ if known gamut[i][j]:
+ fill box shifted (x+j*bx, y) withcolor gamut[i][j];
+ fi
+ endfor
+ x := x + i*bx + 32;
+ endfor
+ y := y + by * 17/13;
+ x := 0;
+ endfor
+ label.rt("Single hue, sequential",(560,-42));
+ label.rt("Multi-hue, sequential", (560,-212));
+ label.rt("Assortments", (560,-552));
+ label.rt("Diverging", (780,-402));
+ path b; b = unitsquare shifted -(1/2,1/2) yscaled 55 xscaled 233 shifted (720, -120);
+ fill b withcolor Paired[4][1]; draw b withcolor Paired[4][2];
+ label.top("Colorbrewer for Metapost" infont "phvb8r" scaled 1.414, center b);
+ label.bot("http://colorbrewer2.org", center b shifted 2 down);
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.pdf b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.pdf
new file mode 100644
index 0000000000..bd7e1697ec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.png b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.png
new file mode 100644
index 0000000000..ce6994740b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/colorbrewer-sampler.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metapost-colorbrewer/make_mp_colorbrewer.py b/graphics/metapost/contrib/macros/metapost-colorbrewer/make_mp_colorbrewer.py
new file mode 100644
index 0000000000..86b304c2b6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metapost-colorbrewer/make_mp_colorbrewer.py
@@ -0,0 +1,148 @@
+#! /usr/bin/env python3
+from __future__ import print_function, division
+
+import argparse
+import csv
+import os.path
+import re
+import textwrap
+
+def get_rid_of_numbers(ss):
+ ss = ss.replace('1', 'One')
+ ss = ss.replace('2', 'Two')
+ ss = ss.replace('3', 'Three')
+ ss = ss.replace('4', 'Four')
+ ss = ss.replace('5', 'Five')
+ ss = ss.replace('6', 'Six')
+ ss = ss.replace('7', 'Seven')
+ ss = ss.replace('8', 'Eight')
+ ss = ss.replace('9', 'Nine')
+ return ss
+
+def get_cmyk_values():
+ csv_file_name = os.path.join(args.colorbrewer, 'cb.csv')
+ with open(csv_file_name) as csv_file:
+ cynthia = csv.DictReader(csv_file)
+
+ # ColorName,NumOfColors,Type,CritVal,ColorNum,ColorLetter,C,M,Y,K,SchemeType
+ colors = list()
+ ranges = list()
+
+ for row in cynthia:
+
+ if row['ColorName']:
+ this_range = get_rid_of_numbers(row['ColorName'])
+ if this_range not in ranges:
+ ranges.append(this_range)
+
+ if row['NumOfColors']:
+ this_size = row['NumOfColors']
+
+ colors.append('{}[{}][{}] = 1/100 ({},{},{},{});'.format(
+ this_range, this_size, row['ColorNum'], row['C'], row['M'], row['Y'], row['K'])
+ )
+
+ return colors, ranges
+
+def is_int(n):
+ "Is this a dagger?"
+ try:
+ a = int(n)
+ except:
+ return False
+ return True
+
+def get_rgb_values():
+ js_file_name = os.path.join(args.colorbrewer, 'colorbrewer_schemes.js')
+
+ colors = list()
+ ranges = list()
+ with open(js_file_name) as js:
+ for line in js:
+ m = re.match(r'^([A-Za-z0-9]+):\s*({.*})\s*,?$', line)
+ if m is None:
+ continue
+ this_range = get_rid_of_numbers(m.group(1))
+ ranges.append(this_range)
+ details = eval(m.group(2))
+
+ for k in details:
+ if is_int(k):
+ for i, v in enumerate(details[k]):
+ if v.startswith('rgb('):
+ colors.append('{}[{}][{}] = 1/256 {};'.format(this_range, k, i+1, v[3:]))
+
+ return colors, ranges
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-c", "--colorbrewer",
+ help="Directory for local copy of the Axel Maps Colorbrewer project")
+ parser.add_argument("-r", "--rgb", action="store_true", help="Create RGB colors, not CMYK")
+
+ args = parser.parse_args()
+
+ if args.rgb:
+ colors, ranges = get_rgb_values()
+ else:
+ colors, ranges = get_cmyk_values()
+
+ print('''% This package includes color specifications and designs
+% developed by Cynthia Brewer (http://colorbrewer.org/).
+% Metapost version adapted from cb.csv by Toby Thurston.
+% Please see license at http://colorbrewer.org/export/LICENSE.txt
+
+% This package defines all the colours from colorbrewer.org
+% Visit the site to get an idea what you can do with them
+% Each colour set is defined as a MP variable with two suffixes
+% The first suffix defines the number of colours in the set,
+% the second one defines the index of this colour in the set
+% starting at 1, so this loop shows you all the shades of red
+% in the six colour "Reds" set.
+%
+% for i=1 upto 6:
+% fill unitsquare scaled 1cm shifted (i*cm,0) withcolor Reds[6][i];
+% endfor
+%
+% Six of the qualititative colour sets have numbers in their names at colorbrewer.org
+% MP doesn't allow this, so they are renamed here as follows:
+%
+% Dark2 is called DarkTwo
+% Pastel1 is called PastelOne
+% Pastel2 is called PastelTwo
+% Set1 is called SetOne
+% Set2 is called SetTwo
+% Set3 is called SetThree
+%
+% No sequence has fewer than three colours.
+% All of the sequences are defined for upto eight colours.
+% The sequential sequences are defined for 3 to 9 colours each.
+% The divergent sequences are defined for 3 to 11 colours each.
+% A few of the qualitative sequences have upto 12 colours.
+%
+% In general try not to use too many colours in one chart.
+% The sequences were designed for cartography and may not suit all applications.
+
+message "metapost-colorbrewer - Copyright (C) 2018 Toby Thurston. This program comes with ABSOLUTELY NO WARRANTY. " &
+"This is free software, and you are welcome to redistribute it under certain conditions; read the LICENCE file for details. " &
+"The colorbrewer colours are copyright (C) Cynthia Brewer, Mark Harrower and The Pennsylvania State University. " &
+"See http://colorbrewer2.org";
+
+ ''')
+
+
+ if args.rgb:
+ out = "color "
+ else:
+ out = "cmykcolor "
+
+ out = out + ', '.join('{}[][]'.format(x) for x in sorted(ranges)) + ';'
+
+ rapper = textwrap.TextWrapper(subsequent_indent = ' ', width = 72)
+ print('\n'.join(rapper.wrap(out)))
+
+ print("")
+
+ for c in sorted(colors):
+ print(c)
diff --git a/graphics/metapost/contrib/macros/metauml/README b/graphics/metapost/contrib/macros/metauml/README
new file mode 100644
index 0000000000..f646504337
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/README
@@ -0,0 +1,19 @@
+MetaUML https://github.com/ogheorghies/MetaUML
+
+Version: 0.2.6
+Author : Ovidiu Gheorghies
+Date : February 02, 2019
+
+MetaUML is a MetaPost library for creating UML diagrams using a textual notation.
+It offers partial support for:
+- class diagrams
+- package diagrams
+- activity diagrams
+- use case diagrams
+- state machine diagrams
+
+This release contains the following directories:
+
+doc : PDF documentation
+examples : source code for the documentation
+inputs : the macros needed to use MetaUML \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metauml/doc/metauml-manual-v0.2.6-19d34de3da75cbd9f814f0a9ec03b4e0861b1541.pdf b/graphics/metapost/contrib/macros/metauml/doc/metauml-manual-v0.2.6-19d34de3da75cbd9f814f0a9ec03b4e0861b1541.pdf
new file mode 100644
index 0000000000..30c8ae4f5f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/doc/metauml-manual-v0.2.6-19d34de3da75cbd9f814f0a9ec03b4e0861b1541.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity.mp
new file mode 100644
index 0000000000..676d1996eb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity.mp
@@ -0,0 +1,52 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+input metauml;
+
+beginfig(1);
+ Begin.b;
+ End.e;
+ FlowFinal.f;
+
+ leftToRight(20)(b, e, f);
+
+ drawObjects(b, e, f);
+endfig;
+
+beginfig(2);
+ Activity.A("Learn MetaUML -",
+ "the MetaPost UML library");
+ drawObject(A);
+endfig;
+
+beginfig(3);
+ Fork.forkA("h", 50);
+ Fork.forkB("v", 20);
+
+ leftToRight(10)(forkA, forkB);
+
+ drawObjects(forkA, forkB);
+endfig;
+
+beginfig(4);
+ Branch.testA;
+
+ drawObject(testA);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity_diagrams.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity_diagrams.mp
new file mode 100644
index 0000000000..0807619acd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/activity_diagrams.mp
@@ -0,0 +1,59 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+% for f in `find . | grep '.*\.[1-9]'`; do echo $f; done
+
+input metauml;
+
+beginfig(1);
+ Begin.b;
+ Activity.eat("Eat something good", "from the kitchen");
+ Branch.enough;
+ Fork.fork("h", 50);
+ Activity.read("Read a book");
+ Activity.listen("Listen to music", "(and ignore it)");
+ Fork.join("h", 50);
+ End.e;
+
+ eat.n = b.s + (0,-20);
+ enough.n = eat.s + (0,-20);
+ fork.n = enough.s + (0, -20);
+
+ read.top = listen.top = fork.bottom - 30;
+ listen.left - read.right = 10;
+ b.midx = .5[listen.left, read.right];
+
+ join.n = (b.midx, listen.bottom - 20);
+ e.n = join.s + (0, -20);
+
+ drawObjects(b, eat, enough, fork, read, listen, join, e);
+
+ clink(transition)(b, eat);
+ clink(transition)(eat, enough);
+ link(transition)(pathStepX(enough.w, eat.w, -80));
+ clink(transition)(enough, fork);
+ clink(transition)(fork, read);
+ clink(transition)(fork, listen);
+ clink(transition)(read, join);
+ clink(transition)(listen, join);
+ clink(transition)(join, e);
+
+ item(iGuard)("still hungry")(obj.se = enough.w + (-20, 0));
+ item(iGuard)("had enough")(obj.nw = enough.s + (0, -4));
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/appetizer.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/appetizer.mp
new file mode 100644
index 0000000000..ed90dc77dc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/appetizer.mp
@@ -0,0 +1,203 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Class.Client("Client")()();
+
+ Class._Component("Component")()();
+ %("+Operation()", "+Add(Component)", "+Remove(Component)", "+GetChild(int)");
+ classStereotype._Component("<<interface>>");
+
+ Class.Leaf("Leaf")()("+Operation()");
+
+ Class.Composite("Composite")()();
+ %("+Operation()", "+Add(Component)", "+Remove(Component)", "+GetChild(int)");
+
+ leftToRight.top(30)(Client, _Component);
+ leftToRight.top(20)(Leaf, Composite);
+ .5[Leaf.ne, Composite.nw] = below(_Component.s, 45);
+
+ drawObjects(Client, _Component, Leaf, Composite);
+
+ link(associationUni)(pathHorizontal(Client.e, _Component.left));
+ link(inheritance)(pathStepY(Leaf.n, _Component.s, 20));
+ link(inheritance)(pathStepY(Composite.n, _Component.s, 20));
+
+ link(aggregationUni)(pathStepX(_Component.e, Composite.e, 55));
+endfig;
+
+beginfig(2);
+ Begin.b;
+ Activity.eat("Eat something good", "from the kitchen");
+ Branch.enough;
+ Fork.fork("h", 50);
+ Activity.read("Read a book");
+ Activity.listen("Listen to music", "(and ignore it)");
+ Fork.join("h", 50);
+ End.e;
+
+ leftToRight.top(10)(read, listen);
+ Group.readListen(read, listen);
+
+ leftToRight(30)(b, eat);
+ topToBottom(20)(eat, enough, fork, readListen, join, e);
+
+ drawObjects(b, eat, enough, fork, readListen, join, e);
+
+ clink(transition)(b, eat);
+ clink(transition)(eat, enough);
+ link(transition)(pathStepX(enough.e, eat.e, 80));
+ clink(transition)(enough, fork);
+ clink(transition)(fork, read);
+ clink(transition)(fork, listen);
+ clink(transition)(read, join);
+ clink(transition)(listen, join);
+ clink(transition)(join, e);
+
+ item(iGuard)("still hungry")(obj.sw = enough.e + (20, 0));
+ item(iGuard)("had enough")(obj.nw = enough.s + (0, -4));
+endfig;
+
+beginfig(3);
+ Actor.user("User");
+ Actor.db("Database");
+
+ Usecase.dbquery("Query database");
+ Usecase.auth("Authenticate user");
+ Usecase.authA("Authenticate by", "username, password");
+ Usecase.authB("Authenticate by", "smartcard");
+
+ leftToRight(30)(user.human, auth, dbquery, db.human);
+ leftToRight.top(30)(authA, authB);
+ .5[authA.ne, authB.nw] = below(auth.s, 20);
+
+ drawObjects(user, auth, dbquery, db, authA, authB);
+
+ clink(inheritance)(authA, auth);
+ clink(inheritance)(authB, auth);
+ clink(association)(auth, dbquery);
+ clink(association)(user.human, auth);
+ clink(association)(dbquery, db.human);
+endfig;
+
+beginfig(4);
+ save b, e, reading, processing, composite, exit, error, result, theEnd;
+
+ Begin.b;
+ State.reading("Reading commands")();
+ State.processing("Processing commands")();
+ End.e;
+
+ State.composite("Working")(b, reading, processing, e);
+ composite.info.left := composite.info.right := 10;
+ composite.info.drawNameLine := 1;
+
+ topToBottom(20)(b, reading, processing, e);
+ drawObject(composite);
+
+ clink(transition)(b, reading);
+ clink(transition)(reading, processing);
+ clink(transition)(processing, e);
+
+ ExitPoint.exit;
+ exit.c=(composite.right, reading.midy);
+ drawObject(exit);
+ item(iAssoc)("error")(obj.nw = exit.s);
+
+ clink(transition)(reading, exit);
+
+ State.error("Preparing error report")();
+ State.result("Writing result")();
+ End.theEnd;
+
+ topToBottom(20)(error, result, theEnd);
+ leftToRight(30)(exit, error);
+
+ drawObjects(error, result, theEnd);
+
+ clink(transition)(exit, error);
+ clink(transition)(error, result);
+ clink(transition)(result, theEnd);
+
+ link(transition)(rpathHorizontal(result.w, composite.right));
+endfig;
+
+
+beginfig(5);
+ save A, B;
+
+ Note.A("An important", "UML note");
+ Note.B("Another note");
+
+ leftToRight(20)(A, B);
+ drawObjects(A, B);
+
+ clink(dashedLink)(A, B);
+endfig;
+
+beginfig(6);
+ Class.A("A")()();
+ Class.B("B")()();
+
+ Package.pA("net.foo")();
+ Package.pB("net.foo.bar")(A, B);
+
+ leftToRight(20)(A, B);
+ leftToRight(50)(pA, pB);
+
+ drawObjects(A, B, pA, pB);
+
+ clink(nest)(pB, pA);
+endfig;
+
+beginfig(7);
+ save A;
+
+ Class.A("MyClass")
+ ("attr1: int", "attr2: int")
+ ("method1(): void",
+ "method2(): void");
+
+ A.nw = (0, 0); % optional, implied
+ drawObject(A);
+endfig;
+
+beginfig(8);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ A.nw = (0,0);
+ B.w = A.e + (20, 0);
+
+ drawObjects(A, B);
+endfig;
+
+beginfig(9);
+ save A, B;
+
+ Class.A("A")()();
+ Class.B("B")()();
+ B.w = A.e + (20, 0);
+ drawObjects(A, B);
+ link(inheritance)(B.w -- A.e);
+endfig;
+end
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/boxes_vs_util.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/boxes_vs_util.mp
new file mode 100644
index 0000000000..985c9bb158
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/boxes_vs_util.mp
@@ -0,0 +1,92 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input boxes;
+input util_commons;
+input util_object;
+input util_picture;
+
+beginfig(1);
+ boxit.a ("yummy");
+ boxit.b ("cool");
+
+ a.nw = (0,0);
+ b.sw = a.se + (10,0);
+
+ drawboxed (a, b);
+ draw a.sw -- b.se dashed evenly withpen pencircle scaled 1.1;
+
+ boxit.c ("yummy");
+ boxit.d ("cool");
+
+ c.nw = (0,-20);
+ d.sw = c.se + (10,0);
+
+ drawunboxed (c, d);
+ draw c.sw -- d.se dashed evenly withpen pencircle scaled 1.1;
+endfig;
+
+beginfig(2);
+ save a, b, c, d;
+
+ Picture.a("yummy");
+ Picture.b("cool");
+ a.info.boxed := b.info.boxed := 1;
+
+ a.nw = (0,0);
+ b.sw = a.se + (10,0);
+
+ drawObjects(a, b);
+ draw a.sw -- b.se dashed evenly withpen pencircle scaled 1.1;
+
+ Picture.c("yummy");
+ Picture.d("cool");
+
+ c.nw = (0,-20);
+ d.sw = c.se + (10,0);
+
+ drawObjects(c, d);
+ draw c.sw -- d.se dashed evenly withpen pencircle scaled 1.1;
+endfig;
+
+beginfig(3);
+ save a, b, c, d;
+
+ iPict.ignoreNegativeBase := 1;
+
+ Picture.a("yummy");
+ Picture.b("cool");
+ a.info.boxed := b.info.boxed := 1;
+
+ a.nw = (0,0);
+ b.sw = a.se + (10,0);
+
+ drawObjects(a, b);
+ draw a.sw -- b.se dashed evenly withpen pencircle scaled 1.1;
+
+ Picture.c("yummy");
+ Picture.d("cool");
+
+ c.nw = (0,-20);
+ d.sw = c.se + (10,0);
+
+ drawObjects(c, d);
+ draw c.sw -- d.se dashed evenly withpen pencircle scaled 1.1;
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class.mp
new file mode 100644
index 0000000000..e5d03d3d43
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class.mp
@@ -0,0 +1,134 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+input metauml;
+
+beginfig(1);
+ Class.A("Point")
+ ("#x:int",
+ "#y:int")
+ ("+set(x:int, y:int)",
+ "+getX():int",
+ "+getY():int",
+ "-debug():void",
+ "test():void");
+ drawObject(A);
+endfig;
+
+beginfig(2);
+ save A, T;
+
+ Class.A("User")()();
+ Class_stereotypes.A("<<interface>>", "<<home>>");
+
+ drawObject(A);
+endfig;
+
+beginfig(3);
+ save A, T;
+
+ Class.A("Vector")()();
+ ClassTemplate.T("T", "size: int")(A);
+
+ drawObjects(A, T);
+endfig;
+
+beginfig(4);
+ link(association)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(5);
+ link(associationUni)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(6);
+ link(inheritance)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(7);
+ link(aggregation)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(8);
+ link(aggregationUni)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(9);
+ link(composition)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(10);
+ link(compositionUni)( (0,0) -- (50,0) );
+endfig;
+
+beginfig(11);
+ save A;
+ Interface.A("Observer")
+ ("+update(src:Object)");
+
+ drawObject(A);
+endfig;
+
+beginfig(12);
+ save A;
+ EClass.A(iAbstractClass)("Observable")
+ ("observers: Observer[0..*]")
+ ("+addObserver(o: Observer)",
+ "+notify()");
+
+ drawObject(A);
+endfig;
+
+beginfig(13)
+ save A;
+
+ Class.A("MyModel")()();
+ A.info.iName.top := 10;
+ A.info.iName.bottom := 10;
+ A.info.iAttributeStack.top := 0;
+ A.info.iAttributeStack.bottom := 0;
+ A.info.iMethodStack.top := 0;
+ A.info.iMethodStack.bottom := 0;
+
+ drawObject(A);
+endfig;
+
+beginfig(14)
+ save A, B;
+
+ EClass.A(iClassNameOnly)("MyModel")()();
+ ClassName.B("AnotherModel");
+ classStereotypes.B("<<smart>>");
+
+ topToBottom(20)(A, B);
+
+ drawObjects(A, B);
+endfig;
+
+beginfig(15);
+ save A;
+
+ Class.A("Point")
+ ("#x:int", "#y:int")
+ ("+toString():String");
+ Class_noVisibilityMarkers.A;
+
+ drawObject(A);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_association.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_association.mp
new file mode 100644
index 0000000000..2ff5037a8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_association.mp
@@ -0,0 +1,72 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save P,B;
+
+ Class.P("Person")()();
+ Class.B("Bank")()();
+
+ P.nw = (0,0);
+ B.w = P.e + (50,0);
+
+ drawObjects(P, B);
+
+ drawRelation(association)(P.e -- B.w);
+
+ item.assocName(iAssoc)("works for")(assocName.s = .5[P.e,B.w]);
+
+ draw assocName.n -- (assocName.n + (20,20));
+ label.urt("association name" infont "tyxtt", assocName.n + (20,20));
+endfig;
+
+beginfig(2);
+ save P,C;
+
+ Class.P("Person")()();
+ Class.C("Company")()();
+
+ C.n = P.s + (0, -70);
+ drawObjects(P, C);
+
+ link(association)(P.s -- C.n);
+
+ item(iAssoc)("employee")(obj.nw = P.s);
+ item(iAssoc)("1..*")(obj.ne = P.s);
+
+ item(iAssoc)("employer")(obj.sw = C.n);
+ item(iAssoc)("0..*")(obj.se = C.n);
+
+ item(iAssoc)("works for")(obj.w = .5[P.s,C.n]);
+endfig;
+
+beginfig(3);
+ save F, O;
+
+ Class.F("Factory")()();
+ Class.O("Object")()();
+
+ O.n = F.s - (0, 50);
+ drawObjects(F, O);
+
+ clink(dependency)(F, O);
+ item(iStereo)("<<creates>>")(obj.w = .5[F.s,O.n])
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization.mp
new file mode 100644
index 0000000000..980915ea00
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization.mp
@@ -0,0 +1,94 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ iClass.foreColor := (.9, .9, 0);
+
+ Class.A("A")()();
+ Class.B("B")()();
+ Class.C("C")()();
+
+ B.w = A.e + (20,0);
+ C.n = .5[A.se, B.sw] + (0, -10);
+
+ drawObjects(A, B, C);
+endfig;
+
+beginfig(2);
+ save A, B, C;
+ iClass.foreColor := (.9, .9, 0);
+
+ Class.A("A")()();
+ Class.B("B")()();
+ Class.C("C")()();
+ C.info.foreColor := (.7, .7, .9);
+ C.info.borderColor := blue;
+ C.info.iName.iFont.scale := 2;
+
+ B.w = A.e + (20,0);
+ C.n = .5[A.se, B.sw] + (0, -10);
+
+ drawObjects(A, B, C);
+endfig;
+
+beginfig(3);
+ ClassInfoCopy.iHome(iClass);
+ iHome.foreColor := (0, .9, .9);
+
+ ClassInfo.iRemote;
+ iRemote.foreColor := (.9, .9, 0);
+ iRemote.borderColor := (0, 0, .9);
+
+ save A, B, C, D;
+
+ EClass.A(iHome)("UserHome")()();
+ EClass.B(iRemote)("UserRemote")()();
+ EClass.C(iHome)("CartHome")()();
+ EClass.D(iRemote)("CartRemote")()();
+
+
+ B.nw = A.ne + (20,0);
+ D.nw = C.ne + (20,0);
+ A.bottom - C.top = 10;
+ A.left = C.left;
+
+ drawObjects(A, B, C, D);
+endfig;
+
+beginfig(4);
+ iClass.foreColor := .9white;
+ save A;
+
+ Class.A("Foo")
+ ("a: int", "b: int")
+ ("foo()", "bar()", "gar()");
+ A.info.iName.iFont.name := metauml_defaultFontBold;
+ A.info.iName.iFont.scale := 1.2;
+
+ A.info.iAttributeStack.iPict.iFont.scale := 0.8;
+ A.info.iAttributeStack.top := 10;
+ A.info.iAttributeStack.spacing := 11;
+
+ A.info.iMethodStack.iPict.iFont.scale := 2;
+ A.info.iMethodStack.spacing := 17;
+ A.info.iMethodStack.bottom := 10;
+ drawObject(A);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization2.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization2.mp
new file mode 100644
index 0000000000..be45e95240
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_customization2.mp
@@ -0,0 +1,31 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save Test;
+ Class.Test("TestClass")("attribute1: int","attribute2: double")
+ ("oneLongMethod(): void",
+ "anotherLongMethod(): void");
+
+ Test.nw = (0,0);
+ Class_draw.Test;
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_diagrams.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_diagrams.mp
new file mode 100644
index 0000000000..614cdbeca6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_diagrams.mp
@@ -0,0 +1,212 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Class.Count("Count")
+ ("#n: int")
+ ("+increase(): void",
+ "+get(): int");
+
+ %Count.nw = (0,0);
+ drawObject(Count);
+ %Class_draw.Count;
+endfig;
+
+beginfig(2);
+ Class.A("Point")
+ ("+x: int",
+ "+y: int") ();
+
+ Class.B("Circle")
+ ("radius: int")
+ ("+getRadius(): int",
+ "+setRadius(r: int):void");
+
+ A.nw = (0,0);
+ B.n = A.s - (0,45);
+ Class_draw.A;
+ Class_draw.B;
+
+ drawRelation(aggregationUni)(A.s -- B.n);
+endfig;
+
+beginfig(3);
+ Class.Test("Test")("a1","a2","a3")("aLongMethod():void");
+
+ Test.nw = (0,0);
+ Class_draw.Test;
+
+ dotlabel.ulft(btex nw etex, Test.nw);
+ dotlabel.top(btex n etex, Test.n);
+ dotlabel.urt(btex ne etex, Test.ne);
+ dotlabel.rt(btex e etex, Test.e);
+ dotlabel.lrt(btex se etex, Test.se);
+ dotlabel.bot(btex s etex, Test.s);
+ dotlabel.llft(btex sw etex, Test.sw);
+ dotlabel.lft(btex w etex, Test.w);
+
+ dotlabel.lft(btex c etex, Test.c);
+
+ draw Test.nw - (50,0) -- Test.ne + (10,0);
+ label.urt(btex top etex, Test.nw - (50,0));
+
+ draw Test.sw - (50,0) -- Test.se + (10,0);
+ label.lrt(btex bottom etex, Test.sw - (50,0));
+
+ draw Test.nw + (0,10) -- Test.sw - (0, 50);
+ label.bot(btex left etex, Test.sw - (0,50));
+
+ draw Test.ne + (0,10) -- Test.se - (0, 50);
+ label.bot(btex right etex, Test.se - (0,50));
+
+ drawarrow Test.nw - (25,0) -- Test.sw - (25,0);
+ label.lft(btex height etex, .5[Test.nw, Test.sw] - (25,0));
+
+ drawarrow Test.sw - (0,25) -- Test.se - (0,25);
+ label.bot(btex width etex, .5[Test.sw, Test.se] - (0,25));
+endfig;
+
+%newAssociationDescription.association;
+%newAssociationUniDescription.associationUni;
+%newInheritanceDescription.inheritance;
+%newAggregationDescription.aggregation;
+%newAggregationUniDescription.aggregationUni;
+%newCompositionDescription.composition;
+%newCompositionUniDescription.compositionUni;
+%newDashedLinkDescription.dashedLink;
+%newDependencyDescription.dependency;
+
+beginfig(4);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(association)(X.e -- Y.w);
+endfig;
+
+beginfig(5);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(associationUni)(X.e -- Y.w);
+endfig;
+
+beginfig(6);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(inheritance)(X.e -- Y.w);
+endfig;
+
+beginfig(7);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(aggregation)(X.e -- Y.w);
+endfig;
+
+beginfig(8);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(aggregationUni)(X.e -- Y.w);
+endfig;
+
+beginfig(9);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(composition)(X.e -- Y.w);
+endfig;
+
+beginfig(10);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(compositionUni)(X.e -- Y.w);
+endfig;
+
+beginfig(11);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(dependency)(X.e -- Y.w);
+endfig;
+
+beginfig(12);
+ save X, Y;
+ Class.X("X")()();
+ Class.Y("Y")()();
+
+ X.nw = (0,0);
+ Y.w = X.e + (50,0);
+ Class_draw.X;
+ Class_draw.Y;
+
+ drawRelation(realization)(X.e -- Y.w);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_templates.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_templates.mp
new file mode 100644
index 0000000000..bf89f9d3cd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/class_templates.mp
@@ -0,0 +1,29 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Class.V("Vector")("elements: T(n)")();
+ Template.T("T", "n: int");
+ Template_attachToClass.T(V);
+
+ drawObjects(V);
+ drawObjects(T);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/component.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/component.mp
new file mode 100644
index 0000000000..da46c9d346
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/component.mp
@@ -0,0 +1,61 @@
+input metauml;
+
+beginfig(1);
+ Component.C("Business Logic")();
+ drawObject(C);
+endfig;
+
+beginfig(2);
+ save A, B, C, BigC;
+
+ Class.A("A")()();
+ Package.B("B")();
+ Component.C("C")();
+
+ Component.BigC("Big Component")(A, B, C);
+
+ leftToRight(10)(A, B);
+ topToBottom(10)(A, C);
+
+ drawObject(BigC);
+endfig;
+
+beginfig(3);
+ save A, B;
+ Component.A("A")();
+ Component.B("B")();
+
+ leftToRight(80)(A, B);
+
+ drawObjects(A, B);
+
+ link(providedInterface)( A.e -- .5[A.e, B.w] );
+endfig;
+
+beginfig(4);
+ save A, B;
+ Component.A("A")();
+ Component.B("B")();
+
+ leftToRight(80)(A, B);
+
+ drawObjects(A, B);
+
+ link(requiredInterface)( B.w -- .5[A.e, B.w]);
+endfig;
+
+beginfig(5);
+ save A, B;
+ Component.A("A")();
+ Component.B("B")();
+
+ leftToRight(80)(A, B);
+
+ drawObjects(A, B);
+
+ link(providedInterface)( A.e -- .5[A.e, B.w] );
+ link(requiredInterface)( B.w -- .5[A.e, B.w] );
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/group.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/group.mp
new file mode 100644
index 0000000000..0e25e58ea6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/group.mp
@@ -0,0 +1,51 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input boxes;
+input util_commons;
+input util_object;
+input util_picture;
+input util_margins;
+input util_group;
+
+beginfig(1);
+ iGroup.left:=20;
+ iGroup.right:=15;
+ iGroup.boxed:=1;
+ iPict.boxed:=1;
+
+ Picture.a("yummy");
+ Picture.b("cool");
+ Picture.c("fool");
+
+ a.nw = (0,0);
+ b.nw = (20,20);
+ c.nw = (15, 40);
+
+ Group.g(a, b, c);
+
+ drawObjects(g);
+endfig;
+
+beginfig(2);
+endfig;
+
+beginfig(3);
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/how-links-work.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/how-links-work.mp
new file mode 100644
index 0000000000..c8d8500358
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/how-links-work.mp
@@ -0,0 +1,38 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ drawRelation(aggregationUni)
+ ((0,0)--(40,0));
+endfig;
+
+
+beginfig(2);
+ path myPath;
+ myPath := (0,0) -- (100,0);
+ LinkStructure.ls(myPath,
+ aggregationUni.widthA,
+ aggregationUni.widthB);
+
+ describeLinkStructure(ls);
+ drawLinkStructure(ls)(aggregationUni);
+endfig;
+
+end
+
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/instance.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/instance.mp
new file mode 100644
index 0000000000..9417224306
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/instance.mp
@@ -0,0 +1,9 @@
+input metauml;
+
+beginfig(1);
+ Instance.order("o: Order")
+ ("name='book'", "{placed}", "{payed}");
+ drawObject(order);
+endfig;
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/mptextmp.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/mptextmp.mp
new file mode 100644
index 0000000000..3e16f83e56
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/mptextmp.mp
@@ -0,0 +1 @@
+btex But this is insane: $\sum_1^3 f(x) \over x$! etex
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/note.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/note.mp
new file mode 100644
index 0000000000..f04a5b5e4f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/note.mp
@@ -0,0 +1,74 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+input TEX;
+
+beginfig(1);
+ Note.A("This note", "has two lines.");
+ drawObject(A);
+endfig;
+
+beginfig(2);
+ save A, C;
+ Note.A("This is a class");
+ Class.C("Object")()();
+
+ A.sw = C.ne + (20, 20);
+
+ drawObjects(A, C);
+
+ clink(dashedLink)(A, C);
+endfig;
+
+beginfig(3);
+ save C;
+ Note.nA("This is the class name");
+ Note.nB("This is a key attribute");
+ Note.nC("This is a nice method");
+
+ Class.C("Object")("+id:int")
+ ("+clone()", "+serialize()");
+
+ topToBottom.left(10)(nA, nB, nC);
+ leftToRight(10)(C, nB);
+
+ drawObjects(C, nA, nB, nC);
+
+ clink(dashedLink)(C.namePict, nA);
+ clink(dashedLink)(C.attributeStack.pict[0], nB);
+ clink(dashedLink)(C.methodStack.pict[1], nC);
+endfig;
+
+beginfig(4);
+ save A;
+ Note.A("This class implements the formula:",
+ TEX("$\sum_1^n f(x)\cdot dx$"));
+ drawObjects(A);
+endfig;
+
+beginfig(5);
+ save A;
+ Note.A("Can you do it?",
+ TEX("$\sum_1^n f(x) \cdot dx " &
+ "\over \sum_1^m g(y) \cdot dy$"));
+ A.stack.info.spacing := 30;
+ A.stack.pict[1].info.ignoreNegativeBase := 0;
+ drawObjects(A);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/object_stack.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/object_stack.mp
new file mode 100644
index 0000000000..b9cd4d32b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/object_stack.mp
@@ -0,0 +1,46 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input boxes;
+input util_commons;
+input util_object;
+input util_picture;
+
+
+beginfig(1);
+ iPict.ignoreNegativeBase := 1;
+ iPict.boxed := 1;
+ Picture.a0("yummy");
+ Picture.a1("cool");
+ Picture.a2("fool");
+
+ a0.nw = (0,0);
+ setObjectJoin(pa.sw = pb.nw);
+
+ joinObjects(scantokens listArray(a)(3));
+ drawObjects(scantokens listArray(a)(3));
+
+endfig;
+
+beginfig(2);
+endfig;
+
+beginfig(3);
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/package.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/package.mp
new file mode 100644
index 0000000000..88653b5fee
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/package.mp
@@ -0,0 +1,93 @@
+input metauml;
+input metauml_package;
+input metauml_package_relations;
+
+beginfig(1);
+ Package.P("java.lang")();
+ drawObject(P);
+endfig;
+
+beginfig(2);
+ save P;
+ Package.P("An important", "package")();
+ drawObject(P);
+endfig;
+
+beginfig(3);
+ save P;
+ Package.P("java.lang")();
+ P.info.forceEmptyContent := 1;
+ drawObject(P);
+endfig;
+
+beginfig(4);
+ save P, A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+ Package.P("net.metauml")(A, B);
+
+ leftToRight(10)(A, B);
+
+ drawObject(P);
+endfig;
+
+beginfig(5);
+ Package.X("X")();
+ Package.Y("Y")();
+
+ leftToRight(50)(X, Y);
+ drawObjects(X, Y);
+
+ link(nest)(X.e -- Y.w);
+endfig;
+
+beginfig(8);
+ Package.emptyPackage("")();
+
+ Package.nameOnlyPackage("java.sun.com")();
+
+ Class.oneClass("A class")()();
+ Package.oneClassPackage("One class package")(oneClass);
+
+ Instance.oneInstance("An instance")();
+ State.oneState("A state")();
+ Activity.oneActivity("An activity");
+ Package.multiPackage("Multipackage")(oneInstance, oneState, oneActivity);
+
+ Package.allPackage("This package contains them all")(emptyPackage, nameOnlyPackage,
+ oneClassPackage, multiPackage);
+
+ nameOnlyPackage.nw = emptyPackage.ne + (30, 0);
+ oneClassPackage.ne = emptyPackage.s - (0, 50);
+
+ multiPackage.top = oneClassPackage.top;
+ multiPackage.left = oneClassPackage.right + 20;
+
+ centered_align_top(oneState, oneActivity)(10, below(oneInstance.s, 20));
+
+ drawObjects(allPackage);
+endfig;
+
+beginfig(8);
+ Package.nameOnlyOnTopPackage("Name on top")();
+ nameOnlyOnTopPackage.info.forceEmptyContent := 1;
+ Package.nameOnlyInMiddlePackage("By default name", "is in the middle")();
+
+ Class.cl("A class")("Attribute")("Method");
+ Package.notEmptyPackage("Contains class")(cl);
+
+ nameOnlyInMiddlePackage.n = nameOnlyOnTopPackage.s - (0, 40);
+ notEmptyPackage.w = nameOnlyInMiddlePackage.e + (80, 0);
+ drawObjects(nameOnlyOnTopPackage, nameOnlyInMiddlePackage, notEmptyPackage);
+
+ %link(import)(pathStepX(notEmptyPackage.w, nameOnlyOnTopPackage.e, -30));
+ %link(import)(pathVertical(nameOnlyInMiddlePackage.ne - (10, 0), nameOnlyOnTopPackage.bottom));
+ %link(import)(notEmptyPackage.sw -- nameOnlyInMiddlePackage.ne);
+endfig;
+
+beginfig(8);
+ link(nest)((10,10)--(30,30));
+endfig;
+
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths.mp
new file mode 100644
index 0000000000..06ca576120
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths.mp
@@ -0,0 +1,132 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ pair za, zb;
+ za = (10,10);
+ zb = (10,-5);
+ path cool;
+ cool := za .. za+(20,10) ..
+ zb+(20,-20) ..
+ zb+(-10,-30) -- zb;
+ link(aggregationUni)(cool);
+endfig;
+
+beginfig(2);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ B.sw = A.ne + (10,10);
+
+ drawObjects(A, B);
+
+ link(aggregationUni)
+ (rpathManhattanX(A.e, B.s));
+ link(inheritance)
+ (pathManhattanY(A.n, B.w));
+endfig;
+
+beginfig(3);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ B.sw = A.ne + (10,10);
+
+ drawObjects(A, B);
+
+ stepX:=60;
+ link(aggregationUni)
+ (pathStepX(A.e, B.e, stepX));
+
+ stepY:=20;
+ link(inheritance)
+ (pathStepY(B.n, A.n, stepY));
+
+ pair X,Y;
+ X := A.se + (0,-30);
+ Y := X + (stepX, 0);
+ draw A.se -- X dashed evenly;
+ draw (xpart Y, ypart A.e) -- Y dashed evenly;
+ drawdblarrow X + (0,15) -- Y + (0,15);
+ label.top(btex stepX etex, .5[X,Y]);
+
+ pair X,Y;
+ X := B.n + (-70,-0);
+ Y := X + (0, stepY);
+
+ draw B.n -- X dashed evenly;
+ draw B.n + (0,stepY) -- Y dashed evenly;
+ drawdblarrow X + (15,0) -- Y + (15,0);
+ label.lft(btex stepY etex, .5[X,Y]);
+endfig;
+
+% horizontal, vertical
+beginfig(4);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")("b")();
+ Class.C("C")("foo: int")();
+
+ B.sw = A.se + (30,5);
+ C.sw = A.nw + (0, 30);
+
+ drawObjects(A, B, C);
+
+ untilX := B.left;
+ drawRelation(association)
+ (pathHorizontal(A.e, untilX));
+
+ draw B.nw -- B.sw + (0,-10) dashed evenly;
+ label.bot(btex untilX etex, B.sw + (0,-10));
+
+ untilY:= C.bottom;
+ drawRelation(association)(pathVertical(A.n, untilY));
+
+ draw C.sw -- C.sw + (-20,0) dashed evenly;
+ label.lft(btex untilY etex, C.sw + (-20,-0));
+
+endfig;
+
+beginfig(5);
+ save A,B;
+ Activity.A("A");
+ Activity.B("B");
+
+ B.nw = A.ne + (40,30);
+ drawObjects(A,B);
+
+ z = A.se + (30, -10);
+ link(transition)(pathCut(A, B)
+ (A.c -- z -- B.c));
+endfig;
+
+beginfig(6);
+ save A,B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ B.nw = A.ne + (20,30);
+ drawObjects(A,B);
+
+ clink(inheritance)(A, B);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths_man.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths_man.mp
new file mode 100644
index 0000000000..a6c502f147
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/paths_man.mp
@@ -0,0 +1,143 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save A, B;
+ Class.A("A")("foo:int")("bar()");
+ Class.B("B")()();
+
+ A.nw = (0,0);
+ B.s = A.ne + (30,30);
+
+ Class_draw.A;
+ Class_draw.B;
+
+ drawRelation(aggregationUni)
+ (A.n ..(30,30)..B.w);
+ path cool;
+ cool := A.e .. A.e+(20,10) ..
+ B.s+(20,-40) .. B.s+(-10,-30)
+ -- B.s;
+ drawRelation(inheritance)(cool);
+endfig;
+
+beginfig(2);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ A.nw = (0,0);
+ B.sw = A.ne + (10,10);
+
+ Class_draw.A;
+ Class_draw.B;
+
+ drawRelation(aggregationUni)
+ (pathManhattanX(A.e, B.s));
+ drawRelation(inheritance)
+ (pathManhattanY(A.n, B.w));
+endfig;
+
+beginfig(3);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ A.nw = (0,0);
+ B.sw = A.ne + (10,10);
+
+ Class_draw.A;
+ Class_draw.B;
+
+ stepX:=60;
+ drawRelation(aggregationUni)
+ (pathStepX(A.e, B.e, stepX));
+
+ stepY:=20;
+ drawRelation(inheritance)
+ (pathStepY(B.n, A.n, stepY));
+
+ pair X,Y;
+ X := A.se + (0,-30);
+ Y := X + (stepX, 0);
+ draw A.se -- X dashed evenly;
+ draw (xpart Y, ypart A.e) -- Y dashed evenly;
+ drawdblarrow X + (0,15) -- Y + (0,15);
+ label.top(btex stepX etex, .5[X,Y]);
+
+ pair X,Y;
+ X := B.n + (-70,-0);
+ Y := X + (0, stepY);
+
+ draw B.n -- X dashed evenly;
+ draw B.n + (0,stepY) -- Y dashed evenly;
+ drawdblarrow X + (15,0) -- Y + (15,0);
+ label.lft(btex stepY etex, .5[X,Y]);
+endfig;
+
+beginfig(4);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")("a")();
+
+ A.nw = (0,0);
+ B.sw = A.se + (30,5);
+
+ Class_draw.A;
+ Class_draw.B;
+
+ untilX := B.left;
+ drawRelation(association)
+ (pathHorizontal(A.e, untilX));
+
+ draw B.nw -- B.sw + (0,-10) dashed evenly;
+ label.bot(btex untilX etex, B.sw + (0,-10));
+endfig;
+
+beginfig(5);
+ save A, B;
+ Class.A("A")()();
+ Class.B("B")("a")("foo()");
+
+ A.nw = (0,0);
+ B.sw = A.ne + (-20,20);
+
+ Class_draw.A;
+ Class_draw.B;
+
+ untilY:= B.bottom;
+ drawRelation(association)
+ (pathVertical(A.n, untilY));
+
+ draw B.sw -- B.sw + (-20,0) dashed evenly;
+ label.lft(btex untilY etex, B.sw + (-20,-0));
+endfig;
+
+beginfig(6);
+ save A,B;
+ Class.A("A")()();
+ Class.B("B")()();
+
+ B.nw = A.ne + (40,30);
+ drawObjects(A,B);
+
+ link(inheritance)(pathCut(A,B)(A.c -- B.c));
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_info.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_info.mp
new file mode 100644
index 0000000000..df3b10145f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_info.mp
@@ -0,0 +1,86 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input boxes;
+input util_commons;
+input util_object;
+input util_picture;
+input util_positioning;
+
+PictureInfoCopy.iBig(iPict);
+iBig.left := iBig.right := 20;
+iBig.top := 10;
+iBig.bottom := 1;
+iBig.boxed := 1;
+iBig.ignoreNegativeBase := 1;
+iBig.iFont.name := defaultfont;
+iBig.iFont.scale := 3;
+
+PictureInfoCopy.iSmall(iPict);
+iSmall.boxed := 1;
+iSmall.borderColor := green;
+
+beginfig(1);
+ EPicture.a(iBig)("yummy");
+ EPicture.b(iSmall)("cool");
+% you can still modify a.info
+% and b.info if you wish.
+
+ a.nw = (0,0);
+ b.nw = a.sw + (0,-10);
+
+ drawObjects(a, b)
+endfig;
+
+beginfig(2);
+ save a, b, c, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.fixedWidth := 15;
+ myFixed.fixedHeight := 20;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)(".-.");
+ EPicture.c(myFixed)("toolong");
+
+ leftToRight.bottom(10)(a, b, c);
+
+ drawObjects(a, b, c);
+endfig;
+
+beginfig(3);
+ save a, b, c, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.bottom := 4.5;
+ myFixed.valign := "bottom";
+ myFixed.halign := "center";
+ myFixed.fixedWidth := 25;
+ myFixed.fixedHeight := 15;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)("yum");
+ EPicture.c(myFixed)("b");
+
+ leftToRight.bottom(10)(a, b, c);
+
+ drawObjects(a, b, c);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_stack.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_stack.mp
new file mode 100644
index 0000000000..ee6e09104b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/picture_stack.mp
@@ -0,0 +1,44 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input boxes;
+input util_commons;
+input util_object;
+input util_picture;
+input util_group;
+input util_picture_stack;
+
+beginfig(1);
+ iStack.boxed := 1;
+ iStack.iPict.boxed := 1;
+ PictureStack.myStack("foo",
+ "bar: int" infont "tyxtt",
+ "cool-man-centered" infont defaultfont,
+ "nice")("vcenter");
+
+ myStack.nw = (0,0);
+ drawObject(myStack);
+endfig;
+
+beginfig(2);
+endfig;
+
+beginfig(3);
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/positioning.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/positioning.mp
new file mode 100644
index 0000000000..f98de47182
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/positioning.mp
@@ -0,0 +1,139 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Class.A("A")()();
+ Class.B("B")()();
+ Class.C("C")()();
+ Class.Base("Base")()();
+
+
+ A.ne = B.nw - (20,0);
+ B.ne = C.nw - (20,0);
+ Base.s = B.n + (0,20);
+
+ drawObjects(Base, A, B, C);
+endfig;
+
+beginfig(2);
+ save A, B, C, Base;
+
+ Class.A("A")()();
+ Class.B("B")()();
+ Class.C("C")()();
+ Class.Base("Base")()();
+
+ leftToRight(20)(A, B, C);
+ topToBottom(20)(Base, B);
+
+ drawObjects(Base, A, B, C);
+endfig;
+
+iPict.boxed := 1;
+spacing := 5;
+string strA, strB, strC;
+strA := "a";
+strB := "...";
+strC := "Cyan";
+
+beginfig(3);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.top(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.top) -- (Z.right, X.top) dashed evenly withpen pencircle withcolor red;
+endfig;
+
+beginfig(4);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.midy(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.midy) -- (Z.right, X.midy) dashed evenly withpen pencircle withcolor red;;
+endfig;
+
+beginfig(5);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.bottom(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.bottom) -- (Z.right, X.bottom) dashed evenly withpen pencircle withcolor red;;
+endfig;
+
+beginfig(6);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.left(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.top) -- (X.left, Z.bottom) dashed evenly withpen pencircle withcolor red;;
+endfig;
+
+beginfig(7);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.midx(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.midx, X.top) -- (X.midx, Z.bottom) dashed evenly withpen pencircle withcolor red;;
+endfig;
+
+beginfig(8);
+ save A, B, C, X, Y, Z;
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.right(spacing)(X, Y, Z);
+
+ drawObjects(X, Y, Z);
+
+ draw (X.right, X.top) -- (X.right, Z.bottom) dashed evenly withpen pencircle withcolor red;;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/properties.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/properties.mp
new file mode 100644
index 0000000000..94f71d772e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/properties.mp
@@ -0,0 +1,58 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+input metauml;
+
+beginfig(1);
+ Class.Test("Test")("a1","a2","a3")("aLongMethod():void");
+
+ Test.nw = (0,0);
+ Class_draw.Test;
+
+ dotlabel.ulft(btex nw etex, Test.nw);
+ dotlabel.top(btex n etex, Test.n);
+ dotlabel.urt(btex ne etex, Test.ne);
+ dotlabel.rt(btex e etex, Test.e);
+ dotlabel.lrt(btex se etex, Test.se);
+ dotlabel.bot(btex s etex, Test.s);
+ dotlabel.llft(btex sw etex, Test.sw);
+ dotlabel.lft(btex w etex, Test.w);
+
+ dotlabel.lft(btex c etex, Test.c);
+
+ draw Test.nw - (50,0) -- Test.ne + (10,0);
+ label.urt(btex top etex, Test.nw - (50,0));
+
+ draw Test.sw - (50,0) -- Test.se + (10,0);
+ label.lrt(btex bottom etex, Test.sw - (50,0));
+
+ draw Test.nw + (0,10) -- Test.sw - (0, 50);
+ label.bot(btex left etex, Test.sw - (0,50));
+
+ draw Test.ne + (0,10) -- Test.se - (0, 50);
+ label.bot(btex right etex, Test.se - (0,50));
+
+ drawarrow Test.nw - (25,0) -- Test.sw - (25,0);
+ label.lft(btex height etex, .5[Test.nw, Test.sw] - (25,0));
+
+ drawarrow Test.sw - (0,25) -- Test.se - (0,25);
+ label.bot(btex width etex, .5[Test.sw, Test.se] - (0,25));
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/state.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/state.mp
new file mode 100644
index 0000000000..77c7691a9a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/state.mp
@@ -0,0 +1,55 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+input metauml;
+
+beginfig(1);
+ State.s("Take order")();
+ drawObject(s);
+endfig;
+
+beginfig(2);
+ Begin.b;
+ End.e;
+ State.c("Component")();
+ State.composite("Composite")(b, e, c);
+
+ b.midx = e.midx = c.midx;
+ c.top = b.bottom - 20;
+ e.top = c.bottom - 20;
+
+ composite.info.drawNameLine := 1;
+ drawObject(composite);
+
+ link(transition)(b.s -- c.n);
+ link(transition)(c.s -- e.n);
+endfig;
+
+beginfig(3);
+ save s;
+ State.s("An interesting state",
+ "which is worth mentioning")();
+ stateTransitions.s(
+ "OnEntry / Open eyes",
+ "OnExit / Sleep well");
+ s.info.drawNameLine := 1;
+
+ drawObject(s);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/statemachine_diagrams.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/statemachine_diagrams.mp
new file mode 100644
index 0000000000..ff93a74dd5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/statemachine_diagrams.mp
@@ -0,0 +1,78 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+% for f in `find . | grep '.*\.[1-9]'`; do echo $f; done
+
+input metauml;
+
+beginfig(1);
+ Begin.b;
+ State.on("On")();
+ State.off("Off")();
+ End.e;
+
+ setObjectJoin(pb.w = pa.e + (20,0));
+ joinObjects(b, on, off, e);
+ drawObjects(b, on, off, e);
+
+ clink(transition)(b, on);
+ clink(transition)(on, off);
+ clink(transition)(off, e);
+endfig;
+
+beginfig(2);
+ save b, reading, processing, e, exit;
+
+ Begin.b;
+ State.reading("Commands read")();
+ State.processing("Processing commands")();
+ End.e;
+ setObjectJoin(pb.n = pa.s + (0, -20));
+ joinObjects(b, reading, processing, e);
+
+ State.composite("Work")(b, reading, processing, e);
+ drawObject(composite);
+
+ clink(transition)(b, reading);
+ clink(transition)(reading, processing);
+ clink(transition)(processing, e);
+
+ ExitPoint.exit;
+ exit.c=(composite.right, reading.midy);
+ drawObject(exit);
+ item(iAssoc)("error")(obj.nw = exit.s);
+
+ clink(transition)(reading, exit);
+
+ State.error("Prepare error report")();
+ State.result("Display result")();
+ End.theEnd;
+
+ error.midx = result.midx = theEnd.midx = composite.right + 90;
+ error.midy = exit.midy;
+ result.midy = processing.midy;
+ theEnd.midy = e.midy;
+ drawObjects(error, result, theEnd);
+
+ clink(transition)(exit, error);
+ clink(transition)(error, result);
+ clink(transition)(result, theEnd);
+
+ link(transition)(rpathHorizontal(result.w, composite.right));
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_activity.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_activity.mp
new file mode 100644
index 0000000000..841bdb8a31
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_activity.mp
@@ -0,0 +1,46 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Begin.b;
+ End.e;
+
+ e.n = (30,30);
+ drawObject(b);
+ show "Object b drawn";
+ drawObject(e);
+
+ link(associationUni)(pathCut(b,e)(b.c--e.c));
+endfig;
+
+beginfig(2);
+ EActivity.act(iActivity)("go to school", "while singing");
+ drawObject(act);
+
+ Branch.br;
+ br.nw = (50,50);
+ drawObject(br);
+
+ Fork.fork("h",30);
+ fork.nw = (30,70);
+ drawObject(fork);
+endfig;
+
+end
+
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class.mp
new file mode 100644
index 0000000000..94e1fdc130
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class.mp
@@ -0,0 +1,156 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(0);
+ show "Copying class info...";
+ ClassInfoCopy.foo(iClass);
+endfig;
+
+beginfig(1);
+ Class.A("A")()();
+ Class_setDebugMode.A;
+
+ A.nw=(0,0);
+ Class_draw.A;
+endfig;
+
+beginfig(2);
+ save B;
+ Class.B("B")("+ a:int")();
+ Class_setDebugMode.B;
+
+ B.nw=(0,0);
+ Class_draw.B;
+endfig;
+
+beginfig(3);
+ save C;
+ Class.C("C")("+ a-#~+:int", "- b-#~+:int", "- g-#~+:int", "~ c-#~+:int", "# g-#~+:double")();
+ Class_setDebugMode.C;
+
+ C.nw=(0,0);
+ Class_draw.C;
+endfig;
+
+beginfig(4);
+ save D;
+ Class.D("D")
+ ("+ a-#~+:int", "- b-#~+:int", "- g-#~+:int", "~ c-#~+:int", "# g-#~+:double")
+ ("+ a()-#~+:int", "- b()-#~+:int", "- g()-#~+:int", "~ c()-#~+:int", "# g()-#~+:double");
+ Class_setDebugMode.D;
+
+ D.nw=(0,0);
+ Class_draw.D;
+endfig;
+
+beginfig(5);
+ save P, Q;
+
+ Class.P("AAA")()();
+ Class_stereotypes.P("ooo", "home", "interface");
+ Class_setDebugMode.P;
+ P.nw=(0,0);
+ Class_draw.P;
+
+ Class.Q("AAA")()();
+ Class_stereotypes.Q("ooo", "home", "interface");
+ Q.nw=P.ne + (20,0);
+ Class_draw.Q;
+endfig;
+
+beginfig(6);
+ save A;
+
+ Class.A("User6")()();
+ Class_stereotypes.A("<<interface>>","<<home>>");
+ A.nw=(0,0);
+ drawObject(A);
+endfig;
+
+beginfig(7)
+ save A;
+ Class.A("User7")()();
+ A.info.iMethodStack.left := A.info.iMethodStack.right := 50;
+ A.info.iMethodStack.top := A.info.iMethodStack.bottom := 20;
+
+ drawObject(A);
+endfig;
+
+beginfig(8)
+ save inter;
+ EClass.inter(iInterface)("Observer")()("+update(src: Object)");
+ drawObjects(inter);
+endfig;
+
+beginfig(9)
+ save inter;
+ EInterface.inter(iInterface)("Observer")("+update(src: Object)");
+ drawObjects(inter);
+endfig;
+
+beginfig(10)
+ save inter;
+ Interface.inter("Observer")("+update(src: Object)");
+ drawObjects(inter);
+endfig;
+
+beginfig(11)
+ save A;
+ EClass.A(iAbstractClass)("AbstractClass")("[]{}")("+update(src: Object)");
+ drawObjects(A);
+endfig;
+
+beginfig(12)
+ save A;
+ AbstractClass.A("AbstractClass")("[]{}")("+update(src: Object)");
+ drawObjects(A);
+endfig;
+
+beginfig(13)
+ save A;
+ EClass.A(iClassNameOnly)("AClassWithNoCompartments")()();
+ drawObjects(A);
+endfig;
+
+beginfig(14)
+ save A;
+ ClassName.A("AnotherClass");
+ drawObjects(A);
+endfig;
+
+beginfig(15)
+ save A;
+ ClassName.A("AnotherClass");
+ classStereotypes.A("<<interface>>","<<remote>>");
+
+ drawObjects(A);
+endfig;
+
+beginfig(16);
+ save A, B, C;
+
+ Class.A("Foo")
+ ("+a: int", "-b: int", "#c: int", "d: int")
+ ("+x()", "-y()", "#z()", "t()");
+ Class_noVisibilityMarkers.A;
+
+ drawObjects(A);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_feature_types.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_feature_types.mp
new file mode 100644
index 0000000000..f35c0b7b68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_feature_types.mp
@@ -0,0 +1,53 @@
+% Copyright 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+input metauml;
+
+beginfig(1);
+ if not metauml_private_isAbstract(abstract "foo"):
+ 1 = 2;
+ fi;
+
+ if metauml_private_isAbstract("@abstracp"):
+ 1 = 2;
+ fi;
+endfig;
+
+beginfig(2);
+ if not metauml_private_isStatic(static "bar"):
+ 1 = 2;
+ fi;
+
+ if metauml_private_isStatic("@statique"):
+ 1 = 2;
+ fi;
+endfig;
+
+beginfig(3);
+ Class.A("A")
+ ("+a:int+", static "+b:int")
+ ("+f+():int", static "+g+():int", abstract "+h():int");
+ Class_setDebugMode.A;
+ drawObjects(A);
+endfig;
+
+beginfig(4);
+ save A;
+ Class.A("A")
+ (static "-instanceCount:int")
+ (static "+getInstanceCount():int", abstract "+work()");
+ drawObjects(A);
+endfig;
+
+beginfig(5);
+ save A, B;
+ Class.A("A")()();
+ Class.B(abstract "B")()();
+ Class.C("C")()(abstract "foo()");
+
+ leftToRight(5)(A, B, C);
+
+ drawObjects(A, B, C);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_qual_assoc.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_qual_assoc.mp
new file mode 100644
index 0000000000..735bba19e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_qual_assoc.mp
@@ -0,0 +1,53 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save P,qa;
+
+ Class.P("Person")()();
+ QualifiedAssociation.qa("accountNumber:int", "foo: id");
+
+ P.nw = (0,0);
+ qa.n = P.s;
+
+
+ P.info.iName.left := 35;
+ P.info.iName.right := 35;
+ drawObjects(P);
+
+ drawObject(qa);
+endfig;
+
+beginfig(2);
+ save P,qa;
+
+ Class.P("Person")()();
+ QualifiedAssociation.qa("accountNumber:int", "foo: id", "foolang");
+
+ P.nw = (0,0);
+ qa.w = P.e;
+
+ P.info.shade := 0;
+ P.info.iMethodStack.top := 20;
+ drawObjects(P);
+
+ drawObject(qa);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_templates.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_templates.mp
new file mode 100644
index 0000000000..c3fc50209c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_class_templates.mp
@@ -0,0 +1,62 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save P,template;
+
+ Class.P("Person")()();
+ Template.template("foo", "bar");
+
+ drawObjectAt(P)(P.nw=(0,0));
+
+ Template_attachToClass.template(P);
+ drawObject(template);
+endfig;
+
+beginfig(2);
+ save P,template;
+
+ Class.P("Person")()();
+ Template.template("foo: int");
+ Template_attachToClass.template(P);
+
+ drawObjectAt(P)(P.nw=(0,0));
+ drawObject(template);
+endfig;
+
+beginfig(3);
+ save CA, TA, CB, TB, CC, TC;
+ Class.CA("VeryVeryLongClassName")()();
+ ClassTemplate.TA("int foo")(CA);
+
+ Class.CB("Shortie")("abracadabra: long long int")();
+ ClassTemplate.TB("T")(CB);
+
+ Class.CC("Shortie")("abracadabra: long long int")();
+ ClassTemplate.TC("TrulyAmazingLongTypename")(CC);
+
+ CA.s = CB.n + (0,14);
+ CB.s = CC.n + (0,14);
+
+ drawObjects(CA, TA, CB, TB, CC, TC);
+endfig;
+
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_component.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_component.mp
new file mode 100644
index 0000000000..94d866c753
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_component.mp
@@ -0,0 +1,30 @@
+input metauml;
+input metauml_component;
+input metauml_component_relations;
+
+beginfig(1);
+ Class.classA("Class A")()();
+ Class.classB("Class B")()();
+
+ Component.compA("Component A")();
+ Component.compB("Component B")();
+ Component.compC("Component C")(compA, compB, classA, classB);
+
+ compB.w = compA.e + (40, 0);
+ classA.w = compB.e + (20, 0);
+ classB.w = classA.e + (20, 0);
+
+ drawObjects(compC);
+
+ path open;
+ open := compA.e .. compA.e + (20, 0);
+ path close;
+
+ close := compB.w .. compA.e + (20, 0);
+
+ link(requiredInterface)(open);
+
+ link(providedInterface)(close);
+endfig;
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_font.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_font.mp
new file mode 100644
index 0000000000..21e748a4f7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_font.mp
@@ -0,0 +1,81 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+string theFont;
+
+beginfig(1);
+ theFont := "pcrr";
+
+ boxjoin(a.sw=b.nw);
+
+ boxit.ff(("Font name: ( ) " & theFont) infont theFont);
+ boxit.s0("<<stereotype>> text with guillemets. ><>><<" infont theFont );
+ boxit.s1("<<a>>, <<b>>, <<c>>" infont theFont);
+ boxit.s2("[g uard] text with square brackets []]." infont theFont);
+ boxit.s3("{c onstraint} text with curly brackets {}}." infont theFont);
+
+ drawboxed(ff, s0, s1, s2, s3);
+endfig;
+
+beginfig(2);
+ save ff,s,g,c;
+ theFont := "tyxbtt";
+
+ boxjoin(a.sw=b.nw);
+
+ boxit.ff(("Font name: ( ) " & theFont) infont theFont);
+ boxit.s0("<<stereotype>> text with guillemets. ><>><<" infont theFont );
+ boxit.s1("<<a>>, <<b>>, <<c>>" infont theFont);
+ boxit.s2("[g uard] text with square brackets []]." infont theFont);
+ boxit.s3("{c onstraint} text with curly brackets {}}." infont theFont);
+
+ drawboxed(ff, s0, s1, s2, s3);endfig;
+
+beginfig(3);
+ picture pA, pB, pC;
+ string sA, sB, sC;
+ sA := "assembleElementLocalMatrix(k: KeyType, mat: LocalMatrixType, a: AssembleAction)";
+ sB := "assembleElementLocalMatri(k: KeyType, mat: LocalMatrixType, a: AssembleAction)";
+ sC := "assembleElntLocalMatri(k: KeyType, mat: LocalMatrixType, a: AssembleAction)";
+
+ pA := sA infont "tyxbtt";
+ pB := sB infont "tyxbtt";
+ pC := sC infont "tyxbtt";
+
+ draw pA;
+ draw pB shifted (0,-20);
+ draw pC shifted (0,-40);
+endfig;
+
+beginfig(4);
+ save ff,s,g,c;
+ theFont := "ptmr8r";
+
+ boxjoin(a.sw=b.nw);
+ boxit.ff(("Font name: ( ) " & theFont) infont theFont);
+
+ boxit.s0("<<stereotype>> text with guillemets. ><>><<" infont theFont );
+ boxit.s1("<<a>>, <<b>>, <<c>>" infont theFont);
+ boxit.s2("[g uard] text with square brackets []]." infont theFont);
+ boxit.s3("{c onstraint} text with curly brackets {}}." infont theFont);
+
+ drawboxed(ff, s0, s1, s2, s3);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_group.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_group.mp
new file mode 100644
index 0000000000..17265c458b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_group.mp
@@ -0,0 +1,60 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ save p,q,r,t,g;
+
+ EPicture.p(iPictBoxed)("p0");
+ EPicture.q(iPictBoxed)("p1");
+ p.se = q.nw;
+
+ string f;
+ f= enumToString(p,q)("");
+ show "f=" & f;
+
+ EGroup.g(iGroup)(p,q);
+ g.nw = (0,0);
+
+ drawObject(g);
+endfig;
+
+beginfig(2);
+ save g,h,p,gg;
+
+ Group.g();
+ g.info.boxed := 1;
+ g.nw = (30,30);
+ drawObject(g);
+
+ Picture.p("Test picture in group");
+ p.info.boxed := 1;
+ Group.h(p);
+ h.info.boxed := 1;
+ h.nw = (0,0);
+ drawObject(h);
+
+ Picture.v0("s"); v0.info.boxed := 1;
+ Picture.v1("s"); v1.info.boxed := 1;
+ v1.nw = v0.se + (10,10);
+ Group.gg(v0, v1); gg.info.boxed := 1;
+ gg.nw = (70,70);
+ drawObject(gg);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_instance.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_instance.mp
new file mode 100644
index 0000000000..d01ff8452e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_instance.mp
@@ -0,0 +1,35 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Radu-George Radulescu
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ Instance.A(":Foo")("int: val1", "bool: val2");
+ Instance.B(":Bar")("very long text for testing purposes");
+ Instance.C("s: Student")("line1", "line2", "line3", "line4", "line5");
+ Instance.D("Example")("small");
+ Instance.E("g: Yummy")("{placed}", "{color=red}");
+
+ B.w = A.e + (20, 0);
+ C.n = A.s - (0, 20);
+ D.w = C.e + (20, 0);
+ E.w = D.e + (20, 0);
+
+ drawObjects(A, B, C, D, E);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lars_issues.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lars_issues.mp
new file mode 100644
index 0000000000..428d7b4144
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lars_issues.mp
@@ -0,0 +1,94 @@
+input metauml;
+
+numeric u;
+u = 1.3cm;
+
+beginfig(1);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Class.ElLocSysAcc("ElementLocalSystemAcceptor")
+()
+("+startElementAssebly()",
+ "+assembleElementLocalMatrix(k: KeyType, mat: LocalMatrixType, a: AssembleAction)",
+ "+assembleElementLocalRHS(k: KeyType, rhs: LocalRHSType, a: AssembleAction)",
+ "+endElementAssembly()");
+
+classStereotypes.ElLocSysAcc("<<interface>>");
+ClassTemplate.TEl("KeyType: typename")(ElLocSysAcc);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Class.FaceLocSysAcc("FaceLocalSystemAcceptor")
+ ()
+ ("+startFaceAssebly()",
+ "+assembleFaceLocalMatrix(k1: KeyType, k2: KeyType, mat: LocalMatrixType, a: AssembleAction)",
+ "+assembleFaceLocalRHS(k: KeyType, rhs: LocalRHSType, a: AssembleAction)",
+ "+endFaceAssembly()");
+
+ classStereotypes.FaceLocSysAcc("<<interface>>");
+ ClassTemplate.TFa("KeyType: typename")(FaceLocSysAcc);
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Class.SolProvider("SolutionProvider")
+ ()
+ ("+startSortBack()",
+ "+getLocalSolution(k: KeyType, sol: LocalSolutionType)",
+ "+endSortBack()");
+
+ classStereotypes.SolProvider("<<interface>>");
+ ClassTemplate.TSol("KeyType: typename")(SolProvider);
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ % now inherit from these for LapackMatrixSorter
+ Class.LapackMS("LapackMatrixSorter")
+ ("-indMan: IndexManager",
+ "-A: LaGenMatDouble&",
+ "-x: LaVectorDouble&",
+ "-b: LaVectorDouble&"
+ )
+ ("+startElementAssembly()");
+
+ ClassTemplate.TLap("KeyType: typename", "IndexManager: class")(LapackMS);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% where to draw these:
+FaceLocSysAcc.nw = ElLocSysAcc.ne + (1.5u, 0);
+SolProvider.nw = FaceLocSysAcc.ne + (1.5u, 0);
+LapackMS.n = FaceLocSysAcc.s + (0, -3u);
+
+drawObjects(ElLocSysAcc, TEl, FaceLocSysAcc, TFa,
+ SolProvider, TSol, LapackMS, TLap);
+
+% 50: how much should the path raise upwards before making a horizontal turn.
+link(inheritance)(pathStepY(LapackMS.n, FaceLocSysAcc.s, 50));
+link(inheritance)(pathStepY(LapackMS.n, SolProvider.s, 50));
+link(inheritance)(pathStepY(LapackMS.n, ElLocSysAcc.s, 50));
+
+endfig;
+
+beginfig(2);
+ Begin.b;
+ Activity.A("Activity A", "on line two");
+ Activity.B("Activity B");
+ End.e;
+
+ % or other positioning code...
+ setObjectJoin(pa.s = pb.n + (0,20));
+ joinObjects(b, A, B, e);
+
+ % important: first draw the activities
+ drawObjects(b, A, B, e);
+
+ % you can now draw the transitions
+ clink(transition)(b, A);
+ clink(transition)(A, B);
+ link(transition)(pathStepX(B.e, e.e, 30));
+
+ item(iGuard)("guard")(obj.sw = .5[b.s, A.n]);
+endfig;
+
+end;
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lowlevel.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lowlevel.mp
new file mode 100644
index 0000000000..952da34f48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_lowlevel.mp
@@ -0,0 +1,66 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+input util_infrastructure;
+
+beginfig(1);
+ show "Lowlevel test";
+ %string foo;
+ %foo := var_instruction(numeric) x, y;
+ %show foo;
+ %foo := foo & ";";
+ %show foo;
+ attributes(foo);
+ _n_ := "foo";
+ %scantokens foo;
+ %string x;
+ %x := str(numeric);
+ var(numeric) x;
+
+ label.top("nothing shown (intentionally)", (0,0));
+endfig;
+
+vardef _foo@#=
+ attributes(@#);
+ var(string) @#a[];
+ @#a[0] := "fpp";
+ @#a[1] := "gqq";
+enddef;
+
+% _foo.b; % not working
+
+vardef _bar@#(text s)=
+ attributes(@#);
+ var(string) elements;
+ @#elements := enumToString(s)("");
+enddef;
+
+beginfig(2);
+ for f = scantokens "a, b, c":
+ show f;
+ endfor;
+ _bar.xx(a, b, c, d);
+ show xx.elements;
+ for f = scantokens xx.elements:
+ show f;
+ endfor;
+ label.top("nothing shown (intentionally)", (0,0));
+endfig;
+
+end
+
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_note.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_note.mp
new file mode 100644
index 0000000000..bf8c1aeb2f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_note.mp
@@ -0,0 +1,39 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml_note;
+input metauml_base;
+input metauml_paths;
+input metauml_links;
+input metauml_class_relations;
+
+beginfig(1);
+ Note.foo("This is the first line", "and this the second one.");
+ drawObject(foo);
+endfig;
+
+beginfig(2);
+ save foo;
+ Note.foo("Please disregard this note.");
+ Note.bar("Please take the other note", "very seriously.");
+
+ bar.s = foo.n + (10,20);
+ drawObjects(foo, bar);
+ clink(dashedLink)(foo, bar);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_package.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_package.mp
new file mode 100644
index 0000000000..6d4f97ea9f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_package.mp
@@ -0,0 +1,54 @@
+input metauml;
+input metauml_package;
+input metauml_package_relations;
+
+beginfig(1);
+ Package.emptyPackage("")();
+
+ Package.nameOnlyPackage("java.sun.com")();
+
+ Class.oneClass("A class")()();
+ Package.oneClassPackage("One class package")(oneClass);
+
+ Instance.oneInstance("An instance")();
+ State.oneState("A state")();
+ Activity.oneActivity("An activity");
+ Package.multiPackage("Multipackage")(oneInstance, oneState, oneActivity);
+
+ Package.allPackage("This package contains them all")(emptyPackage, nameOnlyPackage,
+ oneClassPackage, multiPackage);
+
+ nameOnlyPackage.nw = emptyPackage.ne + (30, 0);
+ oneClassPackage.ne = emptyPackage.s - (0, 50);
+
+ multiPackage.top = oneClassPackage.top;
+ multiPackage.left = oneClassPackage.right + 20;
+
+ centered_align_top(oneState, oneActivity)(10, below(oneInstance.s, 20));
+
+ drawObjects(allPackage);
+endfig;
+
+beginfig(2);
+ Package.nameOnlyOnTopPackage("Name on top")();
+ nameOnlyOnTopPackage.info.forceEmptyContent := 1;
+ Package.nameOnlyInMiddlePackage("By default, the name", "is in the middle")();
+
+ Class.cl("A class")("Attribute")("Method");
+ Package.notEmptyPackage("Contains class")(cl);
+
+ nameOnlyInMiddlePackage.n = nameOnlyOnTopPackage.s - (0, 40);
+ notEmptyPackage.w = nameOnlyInMiddlePackage.e + (80, 0);
+ drawObjects(nameOnlyOnTopPackage, nameOnlyInMiddlePackage, notEmptyPackage);
+
+ %link(import)(pathStepX(notEmptyPackage.w, nameOnlyOnTopPackage.e, -30));
+ %link(import)(pathVertical(nameOnlyInMiddlePackage.ne - (10, 0), nameOnlyOnTopPackage.bottom));
+ %link(import)(notEmptyPackage.sw -- nameOnlyInMiddlePackage.ne);
+endfig;
+
+beginfig(3);
+ link(nest)((10,10)--(30,30));
+endfig;
+
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_paths.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_paths.mp
new file mode 100644
index 0000000000..eedd11a9b0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_paths.mp
@@ -0,0 +1,100 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+iPict.boxed := 1;
+
+beginfig(1);
+ iClass.shade := 3;
+ Class.F("Foo")("a: int","b: int")();
+ Class.B("Bar")()();
+
+ B.nw = F.ne + (20,-20);
+
+ drawObjects(B, F);
+
+ link(association)(B.nw -- F.ne);
+
+ draw objectBorder(B) withcolor red;
+ draw objectBorder(F) withcolor blue;
+
+ link(association)(pathCut(B,F)(B.c--F.c));
+endfig;
+
+beginfig(2);
+ save A, B;
+
+ Picture.A("A");
+ Picture.B("Blue");
+
+ B.sw = A.ne + (20,20);
+
+ drawObjects(A, B);
+
+ link(associationUni)(pathManhattanX(A.e, B));
+endfig;
+
+beginfig(3);
+ save A, B, C, D, O;
+
+ Picture.A("Alpha");
+ Picture.B("Beta");
+ Picture.C("Gamma");
+ Picture.D("Delta");
+ Picture.O("Omega");
+
+ A.c = O.c + (-50,50);
+ B.c = O.c + (50,50);
+ C.c = O.c + (-50,-50);
+ D.c = O.c + (50,-50);
+
+ drawObjects(O, A, B, C, D);
+
+ link(associationUni)(pathManhattanX(O, A));
+ link(associationUni)(pathManhattanX(O, B));
+ link(associationUni)(pathManhattanX(O, C));
+ link(associationUni)(pathManhattanX(O, D));
+endfig;
+
+beginfig(3);
+ show "";
+ show "";
+ show " FIGURE 3";
+
+ save A, B, C, D, O;
+
+ Picture.A("Alpha");
+ Picture.B("Beta");
+ Picture.C("Gamma");
+ Picture.D("Delta");
+ Picture.O("Omega");
+
+ A.c = O.c + (-50,50);
+ B.c = O.c + (50,50);
+ C.c = O.c + (-50,-50);
+ D.c = O.c + (50,-50);
+
+ drawObjects(O, A, B, C, D);
+
+ link(associationUni)(pathManhattanX(O, A));
+ link(associationUni)(pathManhattanX(O, B));
+ link(associationUni)(pathManhattanX(O, C));
+ link(associationUni)(pathManhattanX(O, D));
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture.mp
new file mode 100644
index 0000000000..7a56236e82
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture.mp
@@ -0,0 +1,273 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+string theFont;
+theFont := "tyxbtt";
+
+beginfig(1);
+ draw "xxx" infont defaultfont scaled defaultscale shifted (0,0);
+ draw "yyy" infont (iFont.name) scaled (iFont.scale) shifted (25, 0);
+
+ Picture.p("foo, bar, baz");
+ p.nw = (0,0);
+ drawObject(p);
+
+ Picture.q("qux, norf");
+ drawObjectAt(q)( q.nw = (30,30) );
+
+ FontInfo.foo("tyxbtt", 1);
+ PictureInfo.iNice(3,6,5,10)(foo);
+ iNice.boxed := 1;
+
+ EPicture.myPic(iNice)("Custom iPicture");
+ drawObjectAt(myPic)( myPic.nw = (70,0));
+endfig;
+
+beginfig(2);
+ save p, q, r, t;
+
+ Picture.p("foo");
+ Picture.q("bar");
+ p.nw = (10, 10);
+ q.nw = (20, 20);
+
+ drawObject(p);
+ drawObject(q);
+
+ drawObjects(p, q);
+
+ Picture.a0("root" infont defaultfont);
+ Picture.a1("toof");
+
+ a[0].nw = (30, 30);
+ a[1].nw = (50, 50);
+
+ drawObjects(scantokens listArray(a)(2));
+endfig;
+
+beginfig(3);
+ save p, q, r, t, u, pp;
+
+ bboxmargin := 0;
+
+ picture pp;
+ pp = "a" infont theFont;
+ Picture.p(pp);
+ Picture.q("foo" infont theFont);
+ Picture.r("bar" infont theFont);
+ Picture.t("baz");
+ Picture.u("norf" infont theFont);
+
+ p.nw = (0,0);
+ setObjectJoin(pa.left=pb.left; pa.bottom = pb.top + 1);
+ joinDrawObjects(p, q, r, t, u);
+
+ defaultdy:=0;
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ boxit.A0("foo1");
+ boxit.A1("bar1");
+ boxit.A2("baz2");
+ boxit.A3("norf2");
+ boxit.A4("..");
+ A0.nw=(50,0);
+ drawboxed(A0,A1,A2,A3,A4);
+
+ myy := 10;
+
+ bboxmargin := 0;
+
+ pair p;
+ p := (30,myy);
+ dotlabel.lrt(".", p);
+ picture x;
+ x := "f: int" infont theFont;
+ draw bbox(x) shifted p;
+ draw x shifted p;
+
+ pair q;
+ q := (70,myy);
+ dotlabel.lrt(".", q);
+ picture y;
+ y := "goofy: int" infont theFont;
+ draw bbox(y) shifted q;
+ draw y shifted q;
+
+ pair qq;
+ qq := (135,myy);
+ dotlabel.lrt(".", qq);
+ picture y;
+ y := "goot" infont theFont;
+ draw bbox(y) shifted qq;
+ draw y shifted qq;
+
+ draw (0,myy)--(150, myy) dashed evenly;
+
+ myyb := 30;
+ Picture.aa(btex goof etex);
+ aa.sw = (30, myyb);
+ Picture_draw.aa;
+
+ draw (0,myyb)--(100, myyb) dashed evenly;
+endfig;
+
+beginfig(4);
+ save a, b;
+ FontInfo.myFont(theFont, 1);
+ PictureInfo.myWay(0,0,0,0)(myFont);
+ myWay.boxed := 1;
+
+ EPicture.a0(myWay)("goof");
+ EPicture.a1(myWay)("Aoorian");
+ EPicture.a2(myWay)("fpp");
+ EPicture.a3(myWay)("f: int");
+ EPicture.a4(myWay)("aa()");
+
+ a0.nw = (0,0);
+ setObjectJoin(pa.bottom = pb.bottom; pa.right = pb.left - 10);
+ joinDrawObjects(scantokens listArray(a)(5));
+
+ draw a0.sw -- a4.se withcolor black dashed evenly;
+
+ myWay.ignoreNegativeBase := 1;
+ EPicture.b0(myWay)("foo");
+ EPicture.b1(myWay)("Bar baz");
+ EPicture.b2(myWay)("qux");
+ EPicture.b3(myWay)("f: int");
+ EPicture.b4(myWay)("aa()");
+
+ b0.nw = (0,-20);
+ setObjectJoin(pa.bottom = pb.bottom; pa.right = pb.left - 10);
+ joinDrawObjects(scantokens listArray(b)(5));
+
+ draw b0.sw -- b4.se withcolor black dashed evenly;
+endfig;
+
+beginfig(5);
+ truecorners := 1;
+ bboxmargin := 0;
+ save p;
+ picture basepict;
+ basepict := "<<foo>>" infont "tyxtt";
+
+ draw basepict;
+ draw bbox basepict;
+endfig;
+
+beginfig(6);
+ item.foo(iPictBoxed)("foo bar baz")(foo.nw = (0,0));
+ item.bar(iPict)("x: int")(bar.nw = (20,20));
+
+ aitem(iPictBoxed)("an anounymous item")(obj.nw = (40,10));
+endfig;
+
+beginfig(7);
+ save a, b, c, d, e, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.fixedWidth := 20;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)("bar");
+ EPicture.c(myFixed)(".-.");
+ EPicture.d(myFixed)("baz");
+ EPicture.e(myFixed)("qux norf");
+
+ leftToRight.bottom(20)(a, b, c, d, e);
+
+ drawObjects(a, b, c, d, e);
+endfig;
+
+beginfig(8);
+ save a, b, c, d, e, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.halign := "center";
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.fixedWidth := 20;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)("bar");
+ EPicture.c(myFixed)(".-.");
+ EPicture.d(myFixed)("baz");
+ EPicture.e(myFixed)("qux norf");
+
+ leftToRight.bottom(20)(a, b, c, d, e);
+
+ drawObjects(a, b, c, d, e);
+endfig;
+
+beginfig(9);
+ save a, b, c, d, e, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.halign := "center";
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.fixedWidth := 20;
+ myFixed.fixedHeight := 30;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)("bar");
+ EPicture.c(myFixed)(".-.");
+ EPicture.d(myFixed)("baz");
+ EPicture.e(myFixed)("qux norf");
+
+ leftToRight.bottom(20)(a, b, c, d, e);
+
+ drawObjects(a, b, c, d, e);
+endfig;
+
+beginfig(10);
+ save a, b, c, d, e, myFixed;
+ PictureInfoCopy.myFixed(iPict);
+ myFixed.halign := "center";
+ myFixed.valign := "center";
+ myFixed.ignoreNegativeBase := 1;
+ myFixed.fixedWidth := 20;
+ myFixed.fixedHeight := 30;
+ myFixed.boxed := 1;
+
+ EPicture.a(myFixed)("a");
+ EPicture.b(myFixed)("bar");
+ EPicture.c(myFixed)(".-.");
+ EPicture.d(myFixed)("baz");
+ EPicture.e(myFixed)("qux norf");
+
+ leftToRight.bottom(20)(a, b, c, d, e);
+
+ drawObjects(a, b, c, d, e);
+endfig;
+
+beginfig(11);
+ save a, b, c;
+ Picture.a("goo");
+ a.info.textDecoration := "underline";
+
+ Picture.b("foo()");
+ b.info.textDecoration := "underline";
+
+ Picture.c("x");
+ c.info.textDecoration := "underline";
+
+ topToBottom(5)(a, b, c);
+
+ drawObjects(a, b, c);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_stack.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_stack.mp
new file mode 100644
index 0000000000..8ad4776fa4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_stack.mp
@@ -0,0 +1,130 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+string theFont;
+theFont := "tyxtt";
+
+util_log_thresholdlevel := 100;
+
+beginfig(1);
+ PictureStackInfoCopy.stackWay(iStack);
+
+ EPictureStack.emptyStack(stackWay)()("vcenter");
+ emptyStack.nw=(10,10);
+ drawObject(emptyStack);
+endfig;
+
+beginfig(2);
+ PictureStack.myStack("foo")("vcenter");
+ myStack.nw = (0,0);
+ PictureStack_draw.myStack;
+endfig;
+
+beginfig(3);
+ PictureStack.myStackB("foo", "bar")("vcenter");
+ myStackB.nw = (0,0);
+ PictureStack_draw.myStackB;
+endfig;
+
+beginfig(4);
+ % 1
+ PictureStack.stack("item A", "item B long", "C")("vcenter");
+ stack.info.boxed := 1;
+ stack.info.iPict.boxed := 1; % this does nothing, it's too late
+
+ stack.nw = (0,0);
+ drawObject(stack);
+
+ % 2
+ PictureStack.stackb("item A", "item B long", "C")("vcenter");
+ stackb.info.boxed := 1;
+ stackb.pict[0].info.boxed := 1;
+ stackb.pict[2].info.boxed := 1;
+
+ stackb.nw = (100,0);
+ drawObject(stackb);
+
+ % 3
+ PictureStackInfoCopy.myInfo(iStack);
+ myInfo.boxed := 1;
+ myInfo.iPict.boxed := 1;
+ EPictureStack.stackc(myInfo)("item A", "item B long", "C")("vcenter");
+
+ stackc.nw = (200,0);
+ drawObject(stackc);
+endfig;
+
+beginfig(5);
+ vardef joinCallback= enddef;
+ PictureStack.custom("A.A", "B__________B", "C-----C")
+ ("joinCallback");
+
+ drawObject(custom);
+endfig;
+
+beginfig(6);
+ save custom;
+
+ pickup pencircle scaled 4pt;
+ drawdot origin;
+
+ vardef joinCallbackA=
+ setObjectJoin(pa.bottom = pb.top + index*10; pa.left = pb.left);
+ setObjectJoinFirst(pa.nw = (30,0));
+ enddef;
+
+ PictureStack.customA("go", "further", "and further", "and further still")
+ ("joinCallbackA");
+
+ vardef joinCallbackB=
+ setObjectJoin(pb.bottom = customA.pict[index].bottom; pb.midx = pa.midx);
+ setObjectJoinFirst(pa.bottom = customA.pict[index].bottom);
+ enddef;
+
+ PictureStack.customB(".", "..", "...", "....")
+ ("joinCallbackB");
+
+ drawObjects(customA, customB);
+endfig;
+
+beginfig(7);
+ save stackX;
+ save stylePA, stylePB;
+ save stylePictureStack;
+
+ PictureInfoCopy.stylePA(iPict);
+ stylePA.borderColor := green;
+ stylePA.boxed := 1;
+
+ PictureInfoCopy.stylePB(iPict);
+ stylePB.borderColor := red;
+ stylePB.boxed := 1;
+
+ PictureStackInfoCopy.stylePictureStack(iStack);
+
+ def styleSupplier(expr i)= if i mod 2 = 0: stylePA else: stylePB fi enddef;
+
+ stylePictureStack.childStyleSupplier := "styleSupplier";
+
+ EPictureStack.stackX(stylePictureStack)("a","b","c","d","e")("vcenter");
+
+ drawObjects(stackX);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_tex_rendering.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_tex_rendering.mp
new file mode 100644
index 0000000000..3c04129869
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_picture_tex_rendering.mp
@@ -0,0 +1,43 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+input TEX;
+
+beginfig(1);
+ PictureInfoCopy.myP(iPict);
+ myP.boxed := 1;
+ myP.ignoreNegativeBase := 1;
+
+ EPicture.p(myP)( TEX("Hello, world $x=7$") );
+
+ PictureStackInfoCopy.myPS(iStack);
+ myPS.boxed := 1;
+ myPS.iPict.boxed := 1;
+ myPS.iPict.ignoreNegativeBase := 1;
+
+ EPictureStack.ps(myPS)("Hello, world!",
+ TEX("This is cool: $x=y$."),
+ TEX("But this is insane: $\sum_1^3 f(x) \over x$!") ) ("vleft");
+
+ leftToRight(20)(p, ps);
+
+ drawObjects(p, ps);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_positioning.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_positioning.mp
new file mode 100644
index 0000000000..6603476771
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_positioning.mp
@@ -0,0 +1,195 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+iPict.boxed := 1;
+spacing := 5;
+string strA, strB, strC;
+strA := "a";
+strB := "...";
+strC := "XYZ";
+
+beginfig(1);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(top, left, right)(spacing)("+")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.left, A.top) -- (C.right, A.top);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.top(spacing)(X, Y, Z);
+
+ X.top = A.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.top) -- (Z.right, X.top);
+endfig;
+
+beginfig(2);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(midy, left, right)(spacing)("+")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.left, A.midy) -- (C.right, A.midy);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.midy(spacing)(X, Y, Z);
+
+ X.top = A.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.midy) -- (Z.right, X.midy);
+endfig;
+
+beginfig(3);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(bottom, left, right)(spacing)("+")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.left, A.bottom) -- (C.right, A.bottom);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ leftToRight.bottom(spacing)(X, Y, Z);
+
+ X.top = A.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.bottom) -- (Z.right, X.bottom);
+endfig;
+
+beginfig(4);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(left, top, bottom)(spacing)("-")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.left, A.top) -- (A.left, C.bottom);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.left(spacing)(X, Y, Z);
+
+ X.top = C.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.left, X.top) -- (X.left, Z.bottom);
+endfig;
+
+beginfig(5);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(midx, top, bottom)(spacing)("-")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.midx, A.top) -- (A.midx, C.bottom);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.midx(spacing)(X, Y, Z);
+
+ X.top = C.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.midx, X.top) -- (X.midx, Z.bottom);
+endfig;
+
+beginfig(6);
+ save A, B, C, X, Y, Z;
+
+ Picture.A(strA);
+ Picture.B(strB);
+ Picture.C(strC);
+
+ align(right, top, bottom)(spacing)("-")(A, B, C);
+
+ drawObjects(A, B, C);
+
+ draw (A.right, A.top) -- (A.right, C.bottom);
+
+ %%%%
+
+ Picture.X(strA);
+ Picture.Y(strB);
+ Picture.Z(strC);
+
+ topToBottom.right(spacing)(X, Y, Z);
+
+ X.top = C.bottom - 10;
+
+ drawObjects(X, Y, Z);
+
+ draw (X.right, X.top) -- (X.right, Z.bottom);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins.mp
new file mode 100644
index 0000000000..750cee4e97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins.mp
@@ -0,0 +1,26 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+input metauml_skin_simple;
+
+beginfig(1);
+ Class.HelloSkin("HelloSkin")("nice: int")("done(): void");
+ drawObject(HelloSkin);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins_global_defaults.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins_global_defaults.mp
new file mode 100644
index 0000000000..aaeffd043b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_skins_global_defaults.mp
@@ -0,0 +1,29 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+string metauml_defaultFont, metauml_defaultFontLight;
+metauml_defaultFont := "cmr12";
+metauml_defaultFontLight := "cmr10";
+
+input metauml;
+
+beginfig(1);
+ Class.HelloSkinB("HelloSkinGlobal")("foo: int")("bar(): void");
+ drawObject(HelloSkinB);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_state.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_state.mp
new file mode 100644
index 0000000000..5420750749
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_state.mp
@@ -0,0 +1,73 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+beginfig(1);
+ EntryPoint.entry;
+ ExitPoint.exit;
+
+ entry.nw = (0,0);
+ exit.nw = (50,50);
+
+ drawObjects(entry, exit);
+ clink(transition)(entry, exit);
+endfig;
+
+beginfig(2);
+ EState.myState(iState)("The light is", "visibly on")();
+ drawObject(myState);
+
+ State.anotherState("Another nice state")();
+ anotherState.info.drawNameLine := 1;
+ drawObjectAt(anotherState)(anotherState.nw = (0,50));
+endfig;
+
+beginfig(3);
+ State.interesting("Interesting state")();
+ State_internalTransitions.interesting("OnEntry / doVeryHappy", "OnExit / doSomewhatSad");
+ interesting.info.drawNameLine := 1;
+
+ drawObject(interesting);
+endfig;
+
+beginfig(4);
+ Begin.b;
+ End.e;
+ State.sa("A state")();
+ State.sb("Another state")();
+ setObjectJoin(pb.w = pa.e + (40, 0));
+ joinObjects(b, sa, sb, e);
+
+ State.composite("Composite state")(b, e, sa, sb);
+ drawObject(composite);
+
+ clink(transition)(b, sa);
+ clink(transition)(sa, sb);
+ clink(transition)(sb, e);
+endfig;
+
+beginfig(5);
+endfig;
+
+beginfig(6);
+endfig;
+
+beginfig(7);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_usecase.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_usecase.mp
new file mode 100644
index 0000000000..32688814cf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/test_usecase.mp
@@ -0,0 +1,185 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+input metauml;
+
+HumanInfoCopy.iDwarf(iHuman);
+iDwarf.width := 60;
+iDwarf.height := 20;
+iDwarf.foreColor := blue;
+iDwarf.shadeColor := .8blue;
+
+beginfig(1);
+ Human.h;
+ drawObject(h);
+ draw objectBox(h);
+
+ Human.h1;
+ h1.n = (35, 0);
+ h1.info.foreColor := red;
+ drawObject(h1);
+
+ Human.h2;
+ h2.info.height := 90;
+ h2.nw = (50,0);
+ drawObject(h2);
+ draw objectBox(h2);
+
+ EHuman.d(iDwarf);
+ drawObjectAt(d)(d.s = (10,-50));
+
+ EHuman.d2(iDwarf);
+ d2.info.shadeColor := red;
+ drawObjectAt(d2)(d2.s = (10,-80));
+endfig;
+
+beginfig(2);
+ save a,b;
+
+ Actor.a("foo");
+ drawObject(a);
+
+ Actor.b("Actor line one", "and line two");
+ Actor_setDebugMode.b;
+ b.n = (70,0);
+ drawObject(b);
+endfig;
+
+beginfig(3);
+ Usecase.u("foo");
+ drawObject(u);
+
+ draw objectBox(u) withpen pencircle scaled .1;
+
+ draw u.n withpen pencircle scaled 2 withcolor red;
+ draw u.s withpen pencircle scaled 2 withcolor red;
+ draw u.e withpen pencircle scaled 2 withcolor red;
+ draw u.w withpen pencircle scaled 2 withcolor red;
+
+ draw u.ulft withpen pencircle scaled 2 withcolor blue;
+ draw u.urt withpen pencircle scaled 2 withcolor blue;
+ draw u.llft withpen pencircle scaled 2 withcolor blue;
+ draw u.lrt withpen pencircle scaled 2 withcolor blue;
+
+ Usecase.login("Log in for an eagerly", "awaiting user", "which spans well into a very long 3rd line.");
+ login.s = (0, 5);
+ drawObject(login);
+
+ Usecase.t("Line 1 goo bar", "Line 2");
+ t.s = login.n + (0,10);
+ drawObject(t);
+
+ Usecase.q("Line 1 abcdefg hij", "abcde", "Line 3 abc def ghe jkl", "Line 4 x");
+ q.s = t.n + (0,10);
+ drawObject(q);
+
+endfig;
+
+beginfig(4);
+ Actor.userA("User A2", "line 2", "line 3 long long long");
+ % Any Actor object is made of two sub-objects: nameStack and human.
+ % Each individual picture in the nameStack can be configured individually.
+ %
+ % However, it is not possible to configure all the lines in the nameStack at
+ % once now, saying something like:
+ %
+ % userA.nameStack.info.iPict.iFont.scale := 3;
+ %
+ % This happens because the information above is copied into the Picture objects
+ % in the Actor constructor (and it is useless to modify it afterwards).
+ %
+ % If you do want to make such global modifications of the settings, see the
+ % next two examples.
+
+ userA.nameStack.pict[0].info.iFont.scale := 1.2;
+ userA.nameStack.pict[1].info.iFont.scale := .7;
+ userA.nameStack.info.borderColor := blue;
+ userA.nameStack.info.boxed := 1;
+ userA.nameStack.group.info.left := 30;
+ userA.nameStack.group.info.right := 5;
+ userA.human.info.foreColor := red;
+
+ drawObject(userA);
+ %draw objectBox(userA.nameStack);
+ %draw objectBox(userA.human);
+endfig;
+
+beginfig(5);
+ save userA;
+ % If you want to have preset a info for specific objects
+
+ ActorInfoCopy.iBig(iActor);
+
+ % ActorInfo contains info-s for two objects
+ % iNameStack: for the stack representing the actor's name
+ % iHuman: for the little human
+
+ iBig.iNameStack.iPict.iFont.scale := 3;
+ iBig.iNameStack.spacing := 25;
+ iBig.iHuman.height := 25;
+
+ EActor.userA(iBig)("User A", "Specifically configured");
+ drawObject(userA);
+endfig;
+
+beginfig(6);
+ save userA;
+
+ iActor.iNameStack.iPict.iFont.scale := 2;
+ iActor.iNameStack.spacing := 18;
+
+ Actor.userA("User A", "Globally configured");
+ drawObject(userA);
+endfig;
+
+beginfig(7);
+ save usecaseA;
+ Usecase.usecaseA("A highly customizable", "usecase. Foo bar!");
+ usecaseA.info.iNameStack.iPict.iFont.scale := .5;
+ drawObject(usecaseA);
+endfig;
+
+beginfig(8);
+ save usecaseA;
+ Usecase.usecaseA("A highly customizable", "usecase. Foo bar 2!");
+ usecaseA.info.iNameStack.iPict.iFont.scale := 1.1;
+ usecaseA.info.foreColor := red;
+ usecaseA.info.borderColor := blue;
+ usecaseA.info.iShade.background := green;
+ usecaseA.info.iShade.shift := 4;
+ drawObject(usecaseA);
+endfig;
+
+beginfig(9);
+ save usecaseA;
+ UsecaseInfoCopy.iMyUsecase(iUsecase);
+ iMyUsecase.iNameStack.iPict.iFont.scale := .6;
+ iMyUsecase.iNameStack.spacing := 5;
+ iMyUsecase.foreColor := green;
+ iMyUsecase.iShade.background := red;
+
+ EUsecase.usecaseA(iMyUsecase)("A highly ", " customizable usecase.");
+ EUsecase.usecaseB(iMyUsecase)("Another very ", " customizable usecase.");
+
+ usecaseB.info.iShade.background := green;
+
+ leftToRight(20)(usecaseA, usecaseB);
+ drawObjects(usecaseA, usecaseB);
+endfig;
+
+end
+
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase.mp
new file mode 100644
index 0000000000..ca8040f57b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase.mp
@@ -0,0 +1,43 @@
+% Sample MetaUML figures.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+input metauml;
+
+beginfig(1);
+ Usecase.U("Authenticate user",
+ "by name, password");
+ drawObject(U);
+endfig;
+
+beginfig(2);
+ Actor.A("User");
+ drawObject(A);
+endfig;
+
+beginfig(3);
+ save A;
+
+ Actor.A("Administrator");
+ drawObject(A);
+ draw A.nw -- A.ne -- A.se -- A.sw -- cycle;
+ draw A.human.nw -- A.human.ne -- A.human.se -- A.human.sw -- cycle;
+
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase_diagrams.mp b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase_diagrams.mp
new file mode 100644
index 0000000000..110ca35c07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/fig/usecase_diagrams.mp
@@ -0,0 +1,48 @@
+% Part of the MetaUML manual.
+% Copyright (C) 2005 Ovidiu Gheorghies
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+% for f in `find . | grep '.*\.[1-9]'`; do echo $f; done
+
+input metauml;
+
+beginfig(1);
+ Actor.user("User");
+ Actor.db("Database");
+
+ Usecase.dbquery("Query database");
+ Usecase.auth("Authentification");
+ Usecase.authA("Authentification by", "username, password");
+ Usecase.authB("Authentification by", "smartcard");
+
+ auth.w = user.human.e + (30,0);
+ dbquery.s = auth.n + (0,30);
+ db.human.w = dbquery.e + (30,0);
+
+ authB.left - authA.right = 30;
+ authB.midy = authA.midy;
+ .5[authB.w, authA.e] = (auth.midx, auth.bottom - 50);
+
+ drawObjects(user, auth, dbquery, db, authA, authB);
+
+ clink(inheritance)(authA, auth);
+ clink(inheritance)(authB, auth);
+ clink(association)(auth, dbquery);
+ clink(association)(user.human, auth);
+ clink(association)(dbquery, db.human);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.bib b/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.bib
new file mode 100644
index 0000000000..845db1968f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.bib
@@ -0,0 +1,64 @@
+@misc{metaobj,
+ author = "Denis Roegel",
+ title = "The {METAOBJ} tutorial and reference manual",
+ year = "2002",
+ url = "http://texdoc.net/texmf-dist/doc/metapost/metaobj/momanual.pdf"
+}
+@book{texbook,
+ author = "Donald E. Knuth",
+ title = "The {\TeX{}}book",
+ year = "1986",
+ publisher = "Addison-Wesley Publishing Company"
+}
+@book{latexbook,
+ author = "Leslie Lamport",
+ title = "{\LaTeX} a {D}ocument {P}reparation {S}ystem",
+ year = "1994",
+ publisher = "Addison-Wesley Publishing Company"
+}
+@misc{metapost,
+ author = "John D. Hobby",
+ title = "{METAPOST} {A} {U}ser's {M}anual",
+ year = "2018",
+ url = "http://www.tug.org/tutorials/mp/mpman.pdf"
+}
+@misc{umlsty,
+ author = "Ellef Fange Gjelstad",
+ title = "uml.sty, a package for writing {UML} diagrams in {LATEX}",
+ year = "2010",
+ url = "http://mirror.hmc.edu/ctan/graphics/pstricks/contrib/uml/uml.pdf"
+}
+
+@misc{pstumlsty,
+ author = "Maurice Diamantini",
+ title = "Interface utilisateur du package pst-uml",
+ year = "2006",
+ url = "http://mirrors.nxthost.com/ctan/graphics/pstricks/contrib/pst-uml/pst-uml-doc.pdf"
+}
+
+@misc{umldoc,
+ author = "Doug Palmer",
+ title = "The umldoc {UML} {D}ocumentation {P}ackage",
+ year = "1999",
+ url = "https://www.charvolant.org/elements/umldoc.pdf"
+}
+
+@misc{tikzuml,
+ author = "Nicolas Kielbasiewicz",
+ title = "The {T}ik{Z}-{UML} package",
+ year = "2016",
+ url = "http://perso.ensta-paristech.fr/~kielbasi/tikzuml/var/files/doc/tikzumlmanual.pdf"
+}
+
+@misc{svglatex,
+ author = "Johan B. C. Engelen",
+ title = "How to include an SVG image in LATEX",
+ url = "http://tug.ctan.org/info/svg-inkscape/InkscapePDFLaTeX.pdf"
+}
+
+@misc{umlomg,
+ publisher = "Object Management Group",
+ title = "{OMG}® {U}nified {M}odeling {L}anguage® ({OMG} {UML}®)",
+ year = "2017",
+ url = "https://www.omg.org/spec/UML/2.5.1/"
+}
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.tex b/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.tex
new file mode 100644
index 0000000000..933130a33d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/metauml-manual.tex
@@ -0,0 +1,2072 @@
+% MetaUML: Tutorial, Reference and Test Suite
+%
+% Copyright (c) 2005-2019 Ovidiu Gheorghies
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled "GNU
+% Free Documentation License".
+
+\documentclass{article}
+
+\usepackage[utf8]{inputenc}
+\usepackage[pdftex,colorlinks=true]{hyperref}
+\usepackage{multicol}
+\usepackage{multido}
+\usepackage[style=ieee]{biblatex}
+\addbibresource{metauml-manual.bib}
+
+\ifx\pdftexversion\undefined
+ \usepackage[dvips]{graphicx}
+\else
+ \usepackage[pdftex]{graphicx}
+ \DeclareGraphicsRule{*}{mps}{*}{}
+\fi
+
+\newcommand{\code}{\ttfamily}
+
+\setcounter{page}{1}
+
+\begin{document}
+
+MetaUML: A Manual and Test Suite
+
+\begin{quote}
+ Copyright \copyright 2005-2019 Ovidiu Gheorghie\c{s}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+\end{quote}
+
+\pagebreak
+This page is intentionally left blank.
+
+\pagebreak
+\title{MetaUML: A Manual and Test Suite}
+
+\author{Ovidiu Gheorghie\c{s}}
+
+\maketitle
+
+\begin{abstract}
+MetaUML is a MetaPost \cite {metapost} library for creating UML \cite{umlomg} diagrams by means of a textual notation.
+While presenting the inner workings of MetaUML, this manual doubles as a step-by-step tutorial.
+More importantly, its source code contains many useful examples of diagrams, ranging from the very basic to the
+more advanced and customized.
+\end{abstract}
+
+\section{Introduction}
+
+Here is a quick MetaUML showcase:
+
+\begin{multicols}{2}
+\paragraph{A} Class Diagram\\
+\includegraphics[scale=.55]{fig/appetizer.1}
+\paragraph{B} Activity Diagram\\
+\includegraphics[scale=.55]{fig/appetizer.2}
+\paragraph{C} Notes\\
+\includegraphics[scale=.55]{fig/appetizer.5}
+\columnbreak
+\paragraph{D} Use Case Diagram\\
+\includegraphics[scale=.55]{fig/appetizer.3}
+\paragraph{E} State Machine Diagram\\
+\includegraphics[scale=.55]{fig/appetizer.4}
+\paragraph{F} Package Diagram\\
+\includegraphics[scale=.55]{fig/appetizer.6}
+\end{multicols}
+
+\pagebreak
+
+The code that generates these diagrams is quite straightforward, combining a natural object-oriented parlance
+with the power of MetaPost equation solving.
+
+For example, a UML class is drawn as follows:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("MyClass")
+ ("attr1: int", "attr2: int")
+ ("method1(): void",
+ "method2(): void");
+
+A.nw = (0, 0); % optional, implied
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/appetizer.7}
+\end{multicols}
+
+This code creates a visual object, referenced by its name {\code A}, of the MetaUML-defined type {\code Class}.
+Object {\code A} has the following content properties: a name
+({\code MyClass}), a list of attributes ({\code attr1}, {\code attr2})
+and a list of methods ({\code method1}, {\code method2}). To set the object's location, we assign a value to the
+so-called ``north-west'' point of the encompassing rectangle, {\code A.nw} --- a point which in actual fact references
+the upper-left corner.
+
+Every MetaUML visual object has the layout properties shown in figure \ref{fig:properties}.
+These properties may be used to set the location of any given object, either by assigning to them absolute values,
+or by linking them relatively to other objects via equations.
+
+\begin{figure}
+\centering
+\includegraphics{fig/properties.1}
+\caption{Layout properties of MetaUML objects. Here, a {\code Class} object is depicted.}
+\label{fig:properties}
+\end{figure}
+
+The following example demonstrates, respectively, the use of absolute and relative positioning for two classes, {\code A} and {\code B}.
+
+\begin{multicols}{2}
+\begin{verbatim}
+A.nw = (0,0);
+B.w = A.e + (20, 0);
+\end{verbatim}
+\columnbreak
+\includegraphics{fig/appetizer.8}
+\end{multicols}
+
+After the objects have been drawn, it becomes possible to attach links to them. In a class diagram, inheritance
+or association relations are meaningful links between classes, while in a state machine diagram, transitions between
+states can be used. Here is the general pattern used by MetaUML for drawing links:
+
+\begin{verbatim}
+link(<how-to-draw-information>)(<path-to-draw>);
+\end{verbatim}
+
+The ``how-to-draw-information'' is an object which defines the style of the line (e.g. solid, dashed) and the appearance
+of the heads (e.g. nothing, arrow, diamond). One such object, appropriately called {\code inheritance}, defines a solid
+line style and a white triangle head. The other parameter, the ``path-to-draw'', is simply a MetaPost path.
+
+For example, the following call draws an inheritance relation from class {\code B} to class {\code A}.
+
+\begin{verbatim}
+link(inheritance)(B.e -- A.w);
+\end{verbatim}
+
+The direction of the path is important, as MetaUML uses it to determine the
+type of adornment to attach to the link ends (if applicable). In our example, a white triangle,
+denoting inheritance, points towards the end of the path, that is towards class {\code A}.
+
+Let us sum up with a diagram typical for MetaUML use. Firstly, we define the objects that we want to include
+in our diagram. Secondly, we position these objects relative to each other. Thirdly, we draw the objects. Finally, we
+draw the links, by referencing the layout properties of the previously drawn objects. Note that in our example the
+positioning of {\code A} need not be set explicitly because ``floating'' objects are automatically positioned at
+{\code (0,0)} by their draw method.
+
+\begin{multicols}{2}
+
+\begin{verbatim}
+input metauml;
+
+beginfig(1);
+ Class.A("A")()(); % 1. Define the objects
+ Class.B("B")()();
+ B.w = A.e + (20, 0); % 2. Position the objects
+ drawObjects(A, B); % 3. Draw the objects
+ link(inheritance)(B.w -- A.e); % 4. Draw links between objects
+endfig;
+end
+\end{verbatim}
+\columnbreak
+\includegraphics{fig/appetizer.9}
+\end{multicols}
+
+As far as a user is concerned, this is all there is to MetaUML. With a reference describing how the
+UML elements are created, arbitrarily complex diagrams can be crafted.
+
+\section{Class Diagrams}
+
+A class is created as follows:
+
+\begin{verbatim}
+Class.<name>(<class-name>)
+ (<list-of-attributes>)
+ (<list-of-methods>);
+\end{verbatim}
+
+The suffix {\code <name>} specifies an identifier for the newly created {\code Class} object
+(which, of course, represents a UML class).
+The name of the UML class is a string given by {\code <class-name>};
+the attributes and methods are given as list of strings, {\code <list-of-attributes>} and {\code <list-of-methods>}
+respectively. The list of attributes and the list of methods may be void.
+
+An attribute or a method string may begin with a visibility marker: ``$+$'' for
+public, ``\#'' for protected, ``$-$'' for private, and ``\textasciitilde'' for package private.
+The default visibility is package private.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("Point")
+ ("#x:int", "#y:int")
+ ("+set(x:int, y:int)",
+ "+getX():int",
+ "+getY():int",
+ "-debug():void",
+ "test():void");
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\includegraphics{fig/class.1}
+\end{multicols}
+
+To disable showing the visibility markers, use {\code Class\_noVisibilityMarkers}, as shown below:
+
+\begin{multicols}{2}
+\begin{verbatim}
+ Class.A("Point")
+ ("#x:int", "#y:int")
+ ("+toString():String");
+ Class_noVisibilityMarkers.A;
+
+ drawObject(A);
+\end{verbatim}
+\columnbreak
+\includegraphics{fig/class.15}
+\end{multicols}
+
+\subsection{Stereotypes}
+
+After a class is created, but before it is drawn, its stereotypes may be specified by using {\code Class\_stereotypes}:
+
+\begin{verbatim}
+Class_stereotypes.<name>(<list-of-stereotypes>);
+\end{verbatim}
+
+Here, {\code <name>} is the object name of a previously created class and {\code <list-of-stereotypes>}
+is a comma-separated list of strings. Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("User")()();
+Class_stereotypes.A("<<interface>>","<<home>>");
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/class.2}
+\end{multicols}
+
+\subsection{Interfaces and Abstract Classes}
+
+At times it is preferred to write the name of an interface in an oblique font, rather than using the ``interface''
+stereotype. This can be easily achieved by using the macro {\code Interface}:
+
+\begin{verbatim}
+Interface.name(class-name)
+ (list-of-methods);
+\end{verbatim}
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Interface.A("Observer")
+ ("+update(src:Object)");
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class.11}
+\end{multicols}
+
+Since internally {\code Interface} treated as a special kind of {\code Class}, the code above is equivalent to:
+\begin{verbatim}
+EClass.A(iInterface)("Observer")()
+ ("+update(src:Object)");
+\end{verbatim}
+
+Abstract classes can be drawn similarly using the {\code iAbstractClass} style:
+\begin{samepage}
+\begin{multicols}{2}
+\begin{verbatim}
+EClass.A(iAbstractClass)("Observable")
+ ("observers: Observer[0..*]")
+ ("+addObserver(o: Observer)",
+ "+notify()");
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class.12}
+\end{multicols}
+\end{samepage}
+
+If you prefer, you can use equivalent construct:
+
+\begin{verbatim}
+AbstractClass.A("Observable")
+ ("observers: Observer[0..*]")
+ ("+addObserver(o: Observer)",
+ "+notify()");
+\end{verbatim}
+
+\subsection{Displaying Class Name Only}
+
+If you want the empty methods and attributes compartments in a class not being displayed, one way is to set the spacing
+at their top and the bottom to {\code 0}:
+\begin{samepage}
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("MyModel")()();
+A.info.iName.top := 10;
+A.info.iName.bottom := 10;
+A.info.iAttributeStack.top := 0;
+A.info.iAttributeStack.bottom := 0;
+A.info.iMethodStack.top := 0;
+A.info.iMethodStack.bottom := 0;
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class.13}
+\end{multicols}
+\end{samepage}
+
+The same effect can be achieved by using the formatting information object {\code iClassNameOnly} or the {\code ClassName} macro:
+
+\begin{multicols}{2}
+\begin{verbatim}
+EClass.A(iClassNameOnly)("MyModel")()();
+ClassName.B("AnotherModel");
+Class_stereotypes.B("<<smart>>");
+
+topToBottom(20)(A, B);
+
+drawObjects(A, B);
+\end{verbatim}
+\columnbreak
+\hspace{2cm}\includegraphics{fig/class.14}
+\end{multicols}
+
+To customize the space around the class name globally, you can set the values of {\code iClassNameOnly.iName.top} and {\code iClassNameOnly.iName.bottom}. Individually, for a given object, say {\code B}, the attributes {\code B.info.iName.top} and {\code B.info.iName.bottom} can be used.
+
+\subsection{Objects (or Class Instances)}
+
+A UML object (or class instance) is created as follows:
+
+\begin{verbatim}
+Instance.name(object-name)
+ (list-of-attributes);
+\end{verbatim}
+
+The suffix {\code name} gives a name to the {\code Instance} object. The name of the object (given by {\code object-name}) is typeset underlined. The attributes are given as a comma-separated list of strings, {\code list-of-attributes}.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Instance.order("o: Order")
+ ("name='book'", "{placed}", "{payed}");
+drawObject(order);
+\end{verbatim}
+\columnbreak
+\hspace{2cm}\includegraphics{fig/instance.1}
+\end{multicols}
+
+
+\subsection{Parametrized Classes (Templates)}
+
+The most convenient way of typesetting a class template in MetaUML is to use the macro {\code ClassTemplate}.
+This macro creates a visual object which is appropriately positioned near the class object it adorns.
+
+\begin{verbatim}
+ClassTemplate.name(list-of-templates)
+ (class-object);
+\end{verbatim}
+
+The {\code name} is the name of the template object, {\code list-of-templates} is a comma-separated list of strings and the {\code class-object} is the name of a class object.
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("Vector")()();
+ClassTemplate.T("T", "size: int")(A);
+
+drawObjects(A, T);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class.3}
+\end{multicols}
+
+The macro {\code Template} can also be used to create a template object, but this time the resulting
+object can be positioned freely.
+
+\begin{verbatim}
+Template.name(list-of-templates);
+\end{verbatim}
+
+Of course, it is possible to specify both stereotypes and template parameters for a given class.
+
+\subsection{Types of Links}
+
+In this section we enumerate the relations that can be drawn between classes by means
+of MetaUML macros. Suppose that we have the declared two points, {\code A} (on the left)
+and {\code B} (on the right):
+
+\begin{verbatim}
+pair A, B;
+A = (0,0);
+B = (50,0);
+\end{verbatim}
+
+\begin{tabular}{||l|c||}
+\hline
+{\code link(association)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.4} \\
+\hline
+{\code link(associationUni)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.5} \\
+\hline
+{\code link(inheritance)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.6} \\
+\hline
+{\code link(realization)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.12} \\
+\hline
+{\code link(aggregation)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.7} \\
+\hline
+{\code link(aggregationUni)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.8} \\
+\hline
+{\code link(composition)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.9} \\
+\hline
+{\code link(compositionUni)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.10} \\
+\hline
+{\code link(dependency)(X.e -- Y.w)} & \includegraphics{fig/class_diagrams.11} \\
+\hline
+\end{tabular}
+
+\subsection{Associations}
+In UML an association typically has two of association ends and may have a name specified for it.
+In turn, each association end may specify a multiplicity, a role, a visibility, an ordering.
+These entities are treated in MetaUML as pictures having specific drawing information
+(spacings, font).
+
+The first method of creating association ``items'' is by giving them explicit names.
+Having a name for an association item comes in handy when referring to its properties
+is later needed (see the non UML-compliant diagram below). The last parameter of the macro {\code item} is an equation which may use the item's name to perform positioning.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.P("Person")()();
+Class.C("Company")()();
+% drawing code ommited
+
+item.aName(iAssoc)("works for")
+ (aName.s = .5[P.w, C.w]);
+draw aName.n -- (aName.n + (20,20));
+label.urt("association name" infont "tyxtt",
+ aName.n + (20,20));
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics[scale=.8]{fig/class_association.1}
+\end{multicols}
+
+However, giving names to every association item may become an annoying burden
+(especially when there are many of them). Because of this, MetaUML also allows for
+``anonymous items''. In this case, the positioning is set by an equation
+which refers to the anonymous item as {\code obj}.
+
+\begin{multicols}{2}
+\begin{verbatim}
+% P and C defined as in the previous example
+
+item(iAssoc)("employee")(obj.nw = P.s);
+item(iAssoc)("1..*")(obj.ne = P.s);
+
+% other items are drawn similarly
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/class_association.2}
+\end{multicols}
+
+\subsection{Dependencies and Stereotypes}
+
+Stereotypes are frequently used with dependencies. Below is an example.
+\pagebreak
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.F("Factory")()();
+Class.O("Object")()();
+
+O.n = F.s - (0, 50);
+drawObjects(F, O);
+
+clink(dependency)(F, O);
+item(iStereo)("<<creates>>")(obj.w = .5[F.s,O.n])
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/class_association.3}
+\end{multicols}
+
+\section{Notes}
+
+A note is created as follows:
+
+\begin{verbatim}
+Note.name(list-of-lines);
+\end{verbatim}
+
+The suffix {\code name} is the name of the {\code Note} object. The contents of the note is given by a comma-separated
+list of strings, {\code list-of-lines}, gives the text contents of the note object, each string being drawn on its own
+line.
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Note.A("This note", "has two lines.");
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/note.1}
+\end{multicols}
+
+\subsection{Attaching notes to diagram elements}
+
+Notes can be attached to diagram elements by using a link of type {\code dashedLink}.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Note.A("This is a class");
+Class.C("Object")()();
+
+A.sw = C.ne + (20, 20);
+
+drawObject(A, C);
+
+clink(dashedLink)(A, C);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/note.2}
+\end{multicols}
+
+Now let us see a more complex example, which demontrates the ability of accessing sub-elements in a MetaUML diagram.
+\pagebreak
+
+\begin{multicols}{2}
+\begin{verbatim}
+Note.nA("This is the class name");
+Note.nB("This is a key attribute");
+Note.nC("This is a nice method");
+
+Class.C("Object")("+id:int")
+ ("+clone()", "+serialize()");
+
+topToBottom.left(10)(nA, nB, nC);
+leftToRight(10)(C, nB);
+
+drawObjects(C, nA, nB, nC);
+
+clink(dashedLink)(C.namePict, nA);
+clink(dashedLink)(C.attributeStack.pict[0], nB);
+clink(dashedLink)(C.methodStack.pict[1], nC);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/note.3}
+\end{multicols}
+
+Macros like {\code leftToRight} and {\code topToBottom} are presented in section \ref{section:positioning}.
+
+\subsection{Using mathematical formulae}
+
+MetaUML notes can contain mathematical formulae written in TeX \cite{texbook}. Regretably, LaTeX \cite{latexbook} support for formulae is {\bf not} available.
+Limited as it may be, this feature is considered experimental, as it is not always straightforward to use. In the example below, note that the MetaPost package {\code TEX} is imported.
+
+\begin{multicols}{2}
+\begin{verbatim}
+input metauml;
+input TEX;
+
+beginfig(1);
+ Note.A("This class implements the formula:",
+ TEX("$\sum_1^n f(x) \cdot dx$"));
+ drawObjects(A);
+endfig;
+
+end
+\end{verbatim}
+\columnbreak
+\hspace{0.5cm}\includegraphics{fig/note.4}
+\end{multicols}
+
+For taller formulae, you must be prepared to do some advanced stunts. Remark: {\code "aaa" \& "bbb"} is MetaPost's way to concatenate the strings into {\code "aaabbb"};
+the string containing the formula was split in two for layout reasons.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Note.A("Can you do it?",
+ TEX("$\sum_1^n f(x) \cdot dx " &
+ "\over \sum_1^m g(y) \cdot dy$"));
+A.stack.info.spacing := 30;
+A.stack.pict[1].info.ignoreNegativeBase := 0;
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/note.5}
+\end{multicols}
+
+Alas, this trick does not entirely solve the problem: a third line in the note would be badly aligned. Therefore,
+until MetaUML's {\code Note} class is upgraded to better support this scenario, you may want to limit yourself
+to two lines per note --- at least when tall formulae are involved.
+
+\section{Packages}
+
+MetaUML allows for the creation of packages in various forms. Firstly, we have the option of writing the package
+name in the middle of the main box. Secondly, we can write the name on the tiny box above the main box, leaving
+the main box empty. Lastly, we can write the package name as in the second case, but the main box can have an arbitrary
+contents: classes, other packages, or even other UML items.
+
+The macro that creates a package has the following synopsis:
+
+\begin{verbatim}
+Package.name(package-name)(subitems-list);
+\end{verbatim}
+
+The parameter {\code package-name} is a string or a list of comma-separated strings representing the package's name.
+The {\code subitems-list} parameter is used to specify the subitems (tipically classes or packages) of this package;
+its form is as a comma-separated list of objects, which can be void.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Package.P("java.lang")();
+drawObject(P);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/package.1}
+\end{multicols}
+
+Below is another example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Package.P("An important", "package")();
+drawObject(P);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/package.2}
+\end{multicols}
+
+If you wish to leave the main box empty, you can use the following code:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Package.P("java.lang")();
+P.info.forceEmptyContent := 1;
+drawObject(P);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/package.3}
+\end{multicols}
+
+The same effect as above can be achieved globally by doing:
+
+\begin{verbatim}
+iPackage.forceEmptyContent := 1;
+\end{verbatim}
+
+More information on MetaUML's way of managing global and per-object configuration data can be found in
+section \ref{section:infrastructure} and section \ref{section:customization}.
+
+Here is an example involving items contained in a package.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("A")()();
+Class.B("B")()();
+Package.P("net.metauml")(A, B);
+
+leftToRight(10)(A, B);
+
+drawObject(P);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/package.4}
+\end{multicols}
+
+\subsection{Types of Links}
+
+The nesting relation between packages is created by using the {\code nest} link information.
+
+\begin{tabular}{||l|c||}
+\hline
+{\code link(nest)(X.e -- Y.w)} & \includegraphics{fig/package.5} \\
+\hline
+\end{tabular}
+
+\section{Component Diagrams}
+
+A component is created by the macro {\code Component}:
+
+\begin{verbatim}
+Component.name(component-name)
+ (subitems-list)
+\end{verbatim}
+
+The parameter {\code component-name} is a string representing the component's name. The {\code subitems-list} parameter
+is used to specify the subitems of this component (possibly classes, packages or other components); its form is as a
+comma-separated list of objects, which can be void.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Component.C("Business Logic")();
+drawObject(C);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/component.1}
+\end{multicols}
+
+Here is an example involving subitems in a component:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("A")()();
+Package.B("B")();
+Component.C("C")();
+
+Component.BigC("Big Component")(A, B, C);
+
+leftToRight(10)(A, B);
+topToBottom(10)(A, C);
+
+drawObject(BigC);
+\end{verbatim}
+\columnbreak
+\hspace{3cm}\includegraphics{fig/component.2}
+\end{multicols}
+
+\subsection{Types of Links}
+
+\begin{tabular}{||l|c||}
+\hline
+{\code link(requiredInterface)( A.e -- .5[A.e, B.w] );} & \includegraphics{fig/component.3} \\
+\hline
+{\code link(providedInterface)( .5[A.e, B.w] -- B.w );} & \includegraphics{fig/component.4} \\
+\hline
+\end{tabular}
+
+\vspace{0.5cm}
+
+The {\code requiredInterface} and {\code providedInterface} visual constructs can be easily combined, as shown in the following example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Component.A("A")();
+Component.B("B")();
+
+leftToRight(80)(A, B);
+
+drawObjects(A, B);
+
+link(providedInterface)( A.e -- .5[A.e, B.w] );
+link(requiredInterface)( B.w -- .5[A.e, B.w] );
+\end{verbatim}
+\columnbreak
+\hspace{-1cm}\includegraphics{fig/component.5}
+\end{multicols}
+
+
+\section{Use Case Diagrams}
+
+\subsection{Use Cases}
+An use case is created by the macro {\code Usecase}:
+
+\begin{verbatim}
+Usecase.name(list-of-lines);
+\end{verbatim}
+
+The {\code list-of-lines} is a comma-separated list of strings. These strings are placed
+on top of each other, centered and surrounded by the appropriate visual UML notation.
+
+Here is an use case example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Usecase.U("Authenticate user",
+ "by name, password");
+drawObject(U);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/usecase.1}
+\end{multicols}
+
+\subsection{Actors}
+
+An actor is created by the macro {\code Actor}:
+
+\begin{verbatim}
+Actor.name(list-of-lines);
+\end{verbatim}
+
+Here, {\code list-of-lines} represents the actor's name. For convenience, the name may be
+given as a list of strings which are placed on top of each other, to provide support for
+the situations when the role is quite long. Otherwise, giving a single string
+as an argument to the Actor constructor is perfectly fine.
+
+Here is an actor example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Actor.A("User");
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/usecase.2}
+\end{multicols}
+
+Sometimes it may be preferable to draw diagram relations positioned relatively to
+the visual representation of an actor (the ``human'') rather than relatively to the whole
+actor object (which also includes the text). Because of that, MetaUML provides access
+to the ``human'' of every actor object {\code actor} by means of the sub-object {\code actor.human}.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Actor.A("Administrator");
+drawObject(A);
+draw objectBox(A);
+draw objectBox(A.human);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/usecase.3}
+\end{multicols}
+
+In MetaUML, {\code objectBox(X)} is equivalent to {\code X.nw -- X.ne -- X.se -- X.sw -- cycle} for every object {\code X}. {\code A.human} is considered a MetaUML object, so you can use expressions like {\code A.human.n} or {\code A.human.midx}.
+
+\subsection{Types of Links}
+
+Some of the types of links defined for class diagrams (such as inheritance, association etc.) can be used with similar semantics within use case diagrams.
+
+\section{Activity Diagrams}
+
+\subsection{Begin, End and Flow End}
+
+The begin and the end of an activity diagram can be marked by using the macros {\code Begin}
+and {\code End} or {\code FlowFinal}, respectively. The constructors of these visual objects take no parameters:
+
+\begin{verbatim}
+Begin.beginName;
+End.endName;
+\end{verbatim}
+
+Below is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Begin.b;
+End.e;
+FlowFinal.f;
+
+leftToRight(20)(b, e, f);
+
+drawObjects(b, e, f);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/activity.1}
+\end{multicols}
+
+\subsection{Activity}
+
+An activity is constructed as follows:
+\begin{verbatim}
+Activity.name(list-of-strings);
+\end{verbatim}
+
+The parameter {\code list-of-strings} is a comma-separated list of strings. These strings are
+centered on top of each other to allow for the accommodation of a longer activity description
+within a reasonable space.
+
+An example is given below:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Activity.A("Learn MetaUML -",
+ "the MetaPost UML library");
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/activity.2}
+\end{multicols}
+
+\subsection{Fork and Join}
+
+A fork or join is created by the macro:
+
+\begin{verbatim}
+Fork.name(type, length);
+\end{verbatim}
+
+The parameter {\code type} is a string and can be either of {\code "h"}, {\code "horiz"}, {\code "horizontal"}
+for horizontal bars, and either of {\code "v"}, {\code "vert"}, {\code "vertical"} for vertical bars.
+The {\code length} gives the bar's length.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Fork.forkA("h", 100);
+Fork.forkB("v", 20);
+
+leftToRight(10)(forkA, forkB);
+
+drawObject(forkA, forkB);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/activity.3}
+\end{multicols}
+
+\subsection{Branch}
+
+A branch is created by the macro:
+
+\begin{verbatim}
+Branch.name;
+\end{verbatim}
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Branch.testA;
+
+drawObject(testA);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/activity.4}
+\end{multicols}
+
+
+\subsection{Types of Links}
+
+In activity diagrams, transitions between activities are needed. They are typeset
+as in the example below. In section \ref{composite-states} such a transition
+is showed. This type of link is also used for state machine diagrams.
+
+\begin{verbatim}
+link(transition)( pointA -- pointB );
+\end{verbatim}
+
+\section{State Diagrams}
+
+The constructor of a state allows for aggregated sub-states:
+
+\begin{verbatim}
+State.name(state-name)(substates-list);
+\end{verbatim}
+
+The parameter {\code state-name} is a string or a list of comma-separated strings representing
+the state's name or description. The {\code substates-list} parameter is used to specify
+the substates of this state as a comma-separated list of objects; this list may be void.
+
+An example of a simple state:
+
+\begin{multicols}{2}
+\begin{verbatim}
+State.s("Take order")();
+drawObject(s);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/state.1}
+\end{multicols}
+
+
+\subsection{Composite States}
+\label{composite-states}
+
+A composite state is defined by enumerating at the end of its constructor the inner
+states. Interestingly enough, the composite state takes care of drawing the sub-states it
+contains. The transitions must be drawn after the composite state, as seen in the
+next example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Begin.b;
+End.e;
+State.c("Component")();
+State.composite("Composite")(b, e, c);
+
+b.midx = e.midx = c.midx;
+c.top = b.bottom - 20;
+e.top = c.bottom - 20;
+
+composite.info.drawNameLine := 1;
+drawObject(composite);
+
+link(transition)(b.s -- c.n);
+link(transition)(c.s -- e.n);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/state.2}
+\end{multicols}
+
+\subsection{Internal Transitions}
+
+Internal transitions can be specified by using the macro:
+\begin{verbatim}
+stateTransitions.name(list-transitions);
+\end{verbatim}
+
+Identifier {\code name} gives the state object whose internal transitions are being set,
+and parameter {\code list-transitions} is a comma-separated string list.
+
+
+An example is given below:
+
+\begin{multicols}{2}
+\begin{verbatim}
+State.s("An interesting state",
+ "which is worth mentioning")();
+stateTransitions.s(
+ "OnEntry / Open eyes",
+ "OnExit / Sleep well");
+s.info.drawNameLine := 1;
+
+drawObject(s);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/state.3}
+\end{multicols}
+
+\subsection{Special States}
+
+Similarly to the usage of {\code Begin} and {\code End} macros, one can define history states,
+exit/entry point states and terminate pseudo-states, by using the following constructors.
+
+\begin{verbatim}
+History.nameA;
+ExitPoint.nameB;
+EntryPoint.nameC;
+Terminate.nameD;
+\end{verbatim}
+
+\section{Drawing Paths}
+
+The {\code link} macro is powerful enough to draw relations following arbitrary paths:
+
+\begin{multicols}{2}
+\begin{verbatim}
+path cool;
+cool := A.e .. A.e+(20,10) ..
+ B.s+(20,-40) .. B.s+(-10,-30)
+ -- B.s;
+link(inheritance)(cool);
+
+link(aggregationUni)
+ (A.n ..(30,30)..B.w);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.1}
+\end{multicols}
+
+Amusing as it may be, this feature gets old soon. When typesetting UML diagrams in good style, rectangular paths are usually preferred.
+It is for this kind of paths that MetaUML offers extensive support, by means of ``syntactic sugar'' constructs which
+are not only self-documenting, but reduce the amount of typing and thinking required.
+
+\subsection{Manhattan Paths}
+
+The ``Manhattan'' path macros generate a path between two points consisting of one
+horizontal and one vertical segment. The macro {\code pathManhattanX} generates first a
+horizontal segment, while the macro {\code pathManhattanY} generates first a
+vertical segment. In MetaUML it also matters the direction of a path, so you
+can choose to reverse it by using {\code rpathManhattanX} and {\code rpathManhattanY}
+(note the prefix ``{\code r}''):
+
+\begin{verbatim}
+pathManhattanX(A, B)
+pathManhattanY(A, B)
+
+rpathManhattanX(A, B)
+rpathManhattanY(A, B)
+\end{verbatim}
+
+\pagebreak
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("A")()();
+Class.B("B")()();
+
+B.sw = A.ne + (10,10);
+drawObjects(A, B);
+
+link(aggregationUni)
+ (rpathManhattanX(A.e, B.s));
+link(inheritance)
+ (pathManhattanY(A.n, B.w));
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.2}
+\end{multicols}
+
+\subsection{Stair Step Paths}
+
+These path macros generate stair-like paths between two points.
+The ``stair'' can ``rise'' first in the direction of $Ox$ axis ({\code pathStepX})
+or in the direction of $Oy$ axis ({\code pathStepY}). How much should a step
+rise is given by an additional parameter, {\code delta}. Again, the macros
+prefixed with ``{\code r}'' reverse the direction of the path given by their
+unprefixed counterparts.
+
+\begin{verbatim}
+pathStepX(A, B, delta)
+pathStepY(A, B, delta)
+
+rpathStepX(A, B, delta)
+rpathStepY(A, B, delta)
+\end{verbatim}
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+stepX:=60;
+link(aggregationUni)
+ (pathStepX(A.e, B.e, stepX));
+
+stepY:=20;
+link(inheritance)
+ (pathStepY(B.n, A.n, stepY));
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.3}
+\end{multicols}
+
+\subsection{Horizontal and Vertical Paths}
+
+There are times when drawing horizontal or vertical links is required,
+even when the objects are not properly aligned. To this aim, the following macros
+are useful:
+
+\begin{verbatim}
+pathHorizontal(pA, untilX)
+pathVertical(pA, untilY)
+
+rpathHorizontal(pA, untilX)
+rpathVertical(pA, untilY)
+\end{verbatim}
+
+A path created by {\code pathHorizonal} starts from the point {\code pA}
+and continues horizontally until coordinate {\code untilX} is reached. The macro
+{\code pathVertical} constructs the path dually, working vertically.
+The prefix ``{\code r}'' reverses the direction of the path.
+
+Usage example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+untilX := B.left;
+link(association)
+ (pathHorizontal(A.e, untilX));
+
+untilY:= C.bottom;
+link(association)
+ (pathVertical(A.n, untilY));
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.4}
+\end{multicols}
+
+\subsection{Direct Paths}
+
+A direct path can be created with {\code directPath}. The call {\code directPath(A, B)}
+is equivalent to {\code A -{}- B}.
+
+\subsection{Paths between Objects}
+
+Using the constructs presented above, links between diagram objects are drawn easily like this:
+
+\begin{verbatim}
+link(transition)(directPath(objA.nw, objB.se));
+\end{verbatim}
+
+There are times however when this direct approach may yield unsatisfactory visual results,
+especially when the object's corners is round. To tackle these situations, MetaUML provides the macro
+{\code pathCut}, whose aim is to limit a given path exactly to the region outside the actual
+borders of the objects it connects. The macro's synopsis is:
+
+\begin{verbatim}
+pathCut(thePath)(objectA, objectB)
+\end{verbatim}
+
+Here, {\code thePath} is a given MetaPost path and {\code objectA} and {\code objectB}
+are two MetaUML objects. By contract, each MetaUML object of type, say, {\code X}
+defines a macro {\code X\_border} which returns the path that surrounds it. Because
+of that, {\code pathCut} can make the appropriate modifications to {\code thePath}.
+
+The following code demonstrates the benefits of the {\code pathCut} macro:
+
+\begin{multicols}{2}
+\begin{verbatim}
+z = A.se + (30, -10);
+link(transition)
+ (pathCut(A, B)(A.c--z--B.c));
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.5}
+\end{multicols}
+
+\subsubsection{Direct Paths between Centers}
+
+At times is quicker to just draw direct paths between the center of two objects,
+minding of course the object margins. The macro which does this is {\code clink}:
+
+\begin{verbatim}
+clink(how-to-draw-information)(objA, objB);
+\end{verbatim}
+
+The parameter {\code how-to-draw-information} is the same as for the macro {\code link};
+{\code objA} and {\code objB} are two MetaUML objects.
+
+Below is an example which involves the inheritance relation:
+
+\begin{multicols}{2}
+\begin{verbatim}
+clink(inheritance)(A, B);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/paths.6}
+\end{multicols}
+
+\section{Arranging Diagram Items}
+\label{section:positioning}
+
+Using equations involving cardinal points, such as {\code A.nw = B.ne + (10,0)}, is
+good enough for achieving the desired results. However, programs are best to
+be written for human audience, rather than for compilers. It does become a bit
+tiresome to think all the time of cardinal points and figure out the
+direction of positive or negative offsets. Because of that, MetaUML offers
+syntactic sugar which allows for an easier understanding of the intent behind
+the positioning code.
+
+Suppose that we have three classes, {\code A}, {\code B}, {\code C} and their base class
+{\code Base}. We want the base class to be at the top, and the derived classes to be
+on a line below. This code will do:
+
+\begin{verbatim}
+A.ne = B.nw + (20,0);
+B.ne = C.nw + (20,0);
+Base.s = B.n + (0,-20);
+\end{verbatim}
+
+Unfortunately, writing code such as this makes it hard for fellow programmers to visualize
+its intent upon reading it. And ``fellow programmers`` include the author, five minutes later.
+
+Perhaps the next version of the code will drive home the point. The outcome is
+the same as before, but the layout is stated in a more human-friendly way. You might even
+infer by yourself that the numeric argument represents the distance between the objects.
+
+\begin{multicols}{2}
+\begin{verbatim}
+leftToRight(20)(A, B, C);
+topToBottom(20)(Base, B);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/positioning.2}
+\end{multicols}
+
+Below there are examples which show how these macros can be used. Suppose that we have the
+following definitions for objects {\code X}, {\code Y}, and {\code Z}; also, let's assume
+that {\code spacing} is a numeric variable set to {\code 5}.
+
+\begin{verbatim}
+Picture.X("a");
+Picture.Y("...");
+Picture.Z("Cyan");
+\end{verbatim}
+
+\begin{tabular}{||l|c||}
+\hline
+{\code leftToRight.top(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.3} \\
+\hline
+{\code leftToRight.midy(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.4} \\
+\hline
+{\code leftToRight.bottom(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.5} \\
+\hline
+{\code topToBottom.left(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.6} \\
+\hline
+{\code topToBottom.midx(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.7} \\
+\hline
+{\code topToBottom.right(spacing)(X, Y, Z);} & \includegraphics{fig/positioning.8} \\
+\hline
+\end{tabular} \\
+
+To make things even easier, the following equivalent contructs are also allowed:
+
+\begin{verbatim}
+leftToRight.midy(spacing)(X, Y, Z);
+leftToRight(spacing)(X, Y, Z);
+\end{verbatim}
+
+\begin{verbatim}
+topToBottom.midx(spacing)(X, Y, Z);
+topToBottom(spacing)(X, Y, Z);
+\end{verbatim}
+
+If you want to specify that some objects have a given property equal, while the distance between them is given elsewhere, you can use the macro {\code same}.
+This macro accepts a variable number of parameters, but at least two. The following table gives the interpretation of the macro for a simple example.
+
+\begin{tabular}{||l|l||}
+\hline
+{\code same.top(X, Y, Z);} & {\code X.top = Y.top = Z.top;} \\
+\hline
+{\code same.midy(X, Y, Z);} & {\code X.midy = Y.midy = Z.midy;} \\
+\hline
+{\code same.bottom(X, Y, Z);} & {\code X.bottom = Y.bottom = Z.bottom;} \\
+\hline
+{\code same.left(X, Y, Z);} & {\code X.left = Y.left = Z.left;} \\
+\hline
+{\code same.midx(X, Y, Z);} & {\code X.midx = Y.midx = Z.midx;} \\
+\hline
+{\code same.right(X, Y, Z);} & {\code X.right = Y.right = Z.right;} \\
+\hline
+\end{tabular} \\
+
+Relative positions of two points can be declared more easily using the macros {\code below}, {\code above}, {\code atright}, {\code atleft}.
+Let us assume that {\code A} and {\code B} are two points (objects of type {\code pair} in MetaPost). The following constructs are equivalent:
+
+\begin{tabular}{||l|l||}
+\hline
+{\code B = A + (5,0);} & {\code B = atright(A, 5);} \\
+{\code B = A - (5,0);} & {\code B = atleft(A, 5);} \\
+{\code B = A + (0,5);} & {\code B = above(A, 5);} \\
+{\code B = A - (0,5);} & {\code B = below(A, 5);} \\
+\hline
+\end{tabular}
+
+
+\section{The MetaUML Infrastructure}
+\label{section:infrastructure}
+
+MetaPost is a macro language based on equation solving. Using it may seem quite
+tricky at first for a programmer accustomed to modern object-oriented languages.
+However, the great power of MetaPost consists in its versatility. Indeed, it is possible to write
+a system which mimics quite well object-oriented behavior. Along this line, METAOBJ
+\cite{metaobj} is a library worth mentioning: it provides a high-level objects
+infrastructure along with a battery of predefined objects.
+
+Surprisingly enough, MetaUML does not use METAOBJ. Instead, it uses a custom written,
+lightweight object-oriented infrastructure, provisionally called ``{\code util}''.
+METAOBJ's facilities, although impressive, were perceived by me as being a bit too much
+for what was initially intented as a quick way of getting some UML diagrams layed out.
+Inspired by METAOBJ, ``{\code util}'' was designed to fulfill with minimal effort
+the specific tasks needed to confortably position, allign or group visual objects
+which include text.
+
+Another library having some object-oriented traits is the {\code boxes}
+library, which comes with the standard MetaPost distribution. Early versions of
+MetaUML did use {\code boxes} as an infrastructure, but this approach had to be abandoned eventually.
+The main reason was that it was difficult to achieve good visual results when stacking texts
+(more on that further on). For all it's worth, it did not fit well with the way in which MetaUML's
+layout mechanism was shaping up at the time.
+
+\subsection{Motivation}
+
+Suppose that we want to typeset two texts with their bottom lines aligned, using {\code boxit}:
+
+\begin{multicols}{2}
+\begin{verbatim}
+boxit.a ("yummy");
+boxit.b ("cool");
+
+a.nw = (0,0); b.sw = a.se + (10,0);
+
+drawboxed (a, b); % or drawunboxed(a,b)
+draw a.sw -- b.se dashed evenly
+ withpen pencircle scaled 1.1;
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/boxes_vs_util.1}
+\end{multicols}
+
+Note that, despite supposedly having their bottom lines alligned,
+``yummy'' {\it looks} slightly higher than ``cool''. This would be unacceptable
+in a UML class diagram, when roles are placed at the ends of a horizontal association.
+Regardless of the default spacing being smaller in the {\code util} library,
+the very same unfortunate misalignment effect rears its ugly head:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Picture.a("yummy");
+Picture.b("cool");
+% comment next line for unboxed
+a.info.boxed := b.info.boxed := 1;
+
+b.sw = a.se + (10,0);
+
+drawObjects(a, b);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/boxes_vs_util.2}
+\end{multicols}
+
+However, the strong point of {\code util} is that we have a recourse to this problem:
+
+\begin{multicols}{2}
+\begin{verbatim}
+iPict.ignoreNegativeBase := 1;
+
+Picture.a("yummy");
+Picture.b("cool");
+% the rest the same as above
+drawObjects(a, b);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/boxes_vs_util.3}
+\end{multicols}
+
+\subsection{The Picture Macro}
+
+We have seen previously the line {\code iPict.ignoreNegativeBase := 1}.
+Who is {\code iPict} and what is it doing in our program? MetaUML
+aims at separating the ``business logic'' (what to draw) from the
+``interface'' (how to draw). In order to achieve this, it records the ``how to draw''
+information within the so-called {\code Info} structures. The object {\code iPict}
+is an instance of {\code PictureInfo} structure, which has the following properties
+(or attributes):
+\begin{verbatim}
+left, right, top, bottom
+ignoreNegativeBase
+boxed, borderColor
+\end{verbatim}
+
+The first four attributes specify how much space should be left around the
+actual item to be drawn. The marvelous effect of {\code ignoreNegativeBase}
+has just been shown (off), while the last two attributes control whether the border
+should be drawn (when {\code boxed=1}) and if drawn, in which color.
+
+There's one more thing: the font to typeset the text in. This is specified
+in a {\code FontInfo} structure which has two attributes: the font name
+and the font scale. This information is kept within the {\code PictureInfo} structure
+as a contained attribute {\code iFont}. Both {\code FontInfo} and {\code PictureInfo}
+have ``copy constructors'' which can be used to make copies. We have already
+the effect of these copy constructors at work, when we used:
+
+\begin{verbatim}
+Picture.a("yummy");
+a.info.boxed := 1;
+\end{verbatim}
+
+A copy of the default info for a picture, {\code iPict}, has been made within
+the object {\code a} and can be accessed as {\code a.info}. Having a copy of the
+info in each object may seem like an overkill, but it allows for a fine grained
+control of the drawing mode of each individual object. This feature comes in very
+handy when working with a large number of settings, as it is the case for MetaUML.
+
+Let us imagine for a moment that we have two types of text to write: one with a small font
+and a small margin and one with a big font and a big margin. We could in theory
+configure each individual object or set back and forth global parameters, but
+this is far for convenient. It is preferable to have two sets of settings and specify
+them explicitly when they are needed. The following code could be placed somewhere
+in a configuration file and loaded before any {\code beginfig} macro:
+\begin{verbatim}
+PictureInfoCopy.iBig(iPict);
+iBig.left := iBig.right := 20;
+iBig.top := 10;
+iBig.bottom := 1;
+iBig.boxed := 1;
+iBig.ignoreNegativeBase := 1;
+iBig.iFont.name := defaultfont;
+iBig.iFont.scale := 3;
+
+PictureInfoCopy.iSmall(iPict);
+iSmall.boxed := 1;
+iSmall.borderColor := green;
+\end{verbatim}
+
+Below is an usage example of these definitions. Note the name of the macro: {\code EPicture}.
+The prefix comes form ``explicit'' and it's used to acknowledge that the
+``how to draw'' information is given explicitly --- as a parameter,
+rather than defaulted to what's recorded in {\code iPict}, as with the {\code Picture} macro.
+Having predefined configurations yields short, convenient code.
+
+\begin{multicols}{2}
+\begin{verbatim}
+EPicture.a(iBig)("yummy");
+EPicture.b(iSmall)("cool");
+% you can still modify a.info, b.info
+
+b.sw = a.se + (10,0);
+
+drawObjects(a, b);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/picture_info.1}
+\end{multicols}
+
+\subsubsection{Fixed Sizes}
+
+By default, the size of a {\code Picture} object is set by its contents. However,
+it is possible to specify fixed dimensions both the width and the height, independently.
+This can be done by setting the {\code info}'s attributes {\code fixedWidth} and {\code fixedHeight} to values
+greater than 0. If any of these attributes is left to its default value, {\code -1}, then for the corresponding
+axis the dimension is set according to the dimension of the content. Nevertheless, the fixed dimensions are enforced, even though the contained object would have needed additional space.
+
+\begin{multicols}{2}
+\begin{verbatim}
+PictureInfoCopy.myFixed(iPict);
+myFixed.ignoreNegativeBase := 1;
+myFixed.fixedWidth := 15;
+myFixed.fixedHeight := 20;
+myFixed.boxed := 1;
+
+EPicture.a(myFixed)("a");
+EPicture.b(myFixed)(".-.");
+EPicture.c(myFixed)("toolong");
+
+leftToRight.bottom(10)(a, b, c);
+
+drawObjects(a, b, c);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/picture_info.2}
+\end{multicols}
+
+\subsubsection{Content alignment}
+
+When fixed dimensions are used, one most likely would prefer a centered alignement of the contents in the
+{\code Picture} box. This option can be expressed independently for each of the axes,
+by setting the {\code info}'s attributes {\code valign} and {\code halign} to descriptive string values.
+For horizontal alignement, {\code halign} can be set to {\code "left"} or {\code "center"}, and for
+vertical alignement, {\code valign} can be set to {\code "bottom} or {\code "center"}. The default
+values for these attributes are {\code "left"} and {\code "bottom"}, respectively.
+
+The next example uses horizontal centered alignement and a bottom alignement with a {\code 4.5} base offset, for
+vertical alignement. This vertical alignement gives a better visual result than the centered one, at
+least for the situations in which there are texts to be placed horizontally.
+
+\begin{multicols}{2}
+\begin{verbatim}
+PictureInfoCopy.myFixed(iPict);
+myFixed.ignoreNegativeBase := 1;
+myFixed.bottom := 4.5;
+myFixed.valign := "bottom";
+myFixed.halign := "center";
+myFixed.fixedWidth := 25;
+myFixed.fixedHeight := 15;
+myFixed.boxed := 1;
+
+EPicture.a(myFixed)("a");
+EPicture.b(myFixed)("yum");
+EPicture.c(myFixed)("b");
+
+leftToRight.bottom(10)(a, b, c);
+
+drawObjects(a, b, c);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/picture_info.3}
+\end{multicols}
+
+\subsection{Stacking Objects}
+
+It is possible to stack objects, much in the style of {\code setboxjoin}
+from {\code boxes} library.
+
+\begin{multicols}{2}
+\begin{verbatim}
+Picture.a0("yummy");
+Picture.a1("cool");
+Picture.a2("fool");
+
+setObjectJoin(pa.sw = pb.nw);
+joinObjects(scantokens listArray(a)(3));
+
+drawObjects(scantokens listArray(a)(3));
+% or drawObjects (a0, a1, a2);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/object_stack.1}
+\end{multicols}
+
+The {\code listArray} macro provides here a shortcut for writing
+{\code a0, a1, a2}. This macro is particularly useful for generic
+code which does not know beforehand the number of elements to be drawn.
+Having to write the {\code scantokens} keyword is admittedly a nuisance, but
+this is required.
+
+
+\subsection{The Group Macro}
+
+It is possible to group objects in MetaUML. This feature is the cornerstone
+of MetaUML, allowing for the easy development of complex objects, such as
+composite stats in state machine diagrams.
+
+Similarly to the macro {\code Picture}, the structure {\code GroupInfo}
+is used for specifying group properties; its default instantiation is
+{\code iGroup}. Furthermore, the macro {\code EGroup} explicitely sets the
+layout information.
+
+Here is an example:
+
+\begin{multicols}{2}
+\begin{verbatim}
+iGroup.left:=20;
+iGroup.right:=15;
+iGroup.boxed:=1;
+iPicture.boxed:=1;
+
+Picture.a("yummy");
+Picture.b("cool");
+Picture.c("fool");
+
+b.nw = a.nw + (20,20); % A
+c.nw = a.nw + (15, 40); % B
+
+Group.g(a, b, c);
+g.nw = (10,10); % C
+
+drawObject(g);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/group.1}
+\end{multicols}
+
+After some objects are grouped, they can only be drawn
+by invoking the {\code drawObject} macro on the group that aggregates them, and not individually.
+Conveniently, once the relative positioning of objects within a group is set (line A and B), the whole
+group can be ``moved'' do the desired position (line C), and all the contained objects will move along.
+
+\subsection{The PictureStack Macro}
+
+The {\code PictureStack} macro is a syntactic sugar for a set of pictures,
+stacked according to predefined equations and grouped together.
+
+\begin{multicols}{2}
+\begin{verbatim}
+iStack.boxed := 1;
+iStack.iPict.boxed := 1;
+PictureStack.myStack("foo",
+ "bar: int" infont "tyxtt",
+ "nicely-centered" infont defaultfont,
+ "nice")("vcenter");
+
+drawObject(myStack);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/picture_stack.1}
+\end{multicols}
+
+Note the last parameter of the macro {\code PictureStack}, here {\code vcenter}.
+It is used to generate appropriate equations based on a descriptive name.
+The spacing between individual picture objects is set by the field
+{\code iStack.spacing}. Currently, the following alignment names are
+defined: {\code vleft}, {\code vright}, {\code vcenter},
+{\code vleftbase}, {\code vrightbase}, {\code vcenterbase}. All these
+names refer to vertical alignment (the prefix ``{\code v}''); alignment can
+be at left, right or centered. The variants having the suffix ``{\code base}'' align
+the pictures so that {\code iStack.spacing} refer to the distance between the
+bottom lines of the pictures. The unsuffixed variants use {\code iStack.spacing} as
+the distance between one's bottom line and the next's top line.
+
+The ``{\code base}'' alignment is particularly useful for stacking text, since it
+offers better visual appearance when {\code iPict.ignoreNegativeBase} is set to {\code 1}.
+
+\section{Components Design}
+
+Each MetaUML component (e.g. {\code Picture}, {\code PictureStack}, {\code Class}) is
+designed according to an established pattern. This section gives more insight
+on this.
+
+In order to draw a component, MetaUML categorizes the required information as follows:
+\begin{itemize}
+\item what to draw, or what are the elements of a component.
+\item how to draw, or how are the elements positioned in relation to each other within the component
+\item where to draw
+\end{itemize}
+
+For example, in order to draw a picture object we must know, respectively:
+\begin{itemize}
+\item what is the text or the native picture that needs to be drawn
+\item what are the margins that should be left around the contents
+\item where is the picture to be drawn
+\end{itemize}
+
+Why do we bother with these questions? Why don't we just simply draw the picture
+component as soon as it was created and get it over with?
+That is, why doesn't the following code just work?
+
+\begin{verbatim}
+Picture.pict("foo");
+\end{verbatim}
+
+Well, although we have the answer to question 1 (what to draw),
+we still need to have question 3 answered. The code below becomes thus a
+necessity (actually, you are not forced to specify the positioning of an object,
+because its draw method positions it to {\code (0,0)} by default):
+
+\begin{verbatim}
+% question 1: what to draw
+Picture.pict("foo");
+
+% question 3: where to draw
+pict.nw = (10,10);
+
+% now we can draw
+drawObject(pict);
+\end{verbatim}
+
+How about question 2, how to draw? By default, this problem is addressed behind the
+scenes by the component. This means, for the Picture object, that a native picture is created
+from the given string, and around that picture certain margins are placed, by means of MetaPost equations.
+(The margins also come in handy when stacking Picture objects, so that the result doesn't look too cluttered.)
+If these equations were defined within the Picture constructor, then an
+usability problem would have appeared, because it wouldn't have been possible to modify the margins,
+as in the code below:
+
+\begin{verbatim}
+% question 1: what to draw
+Picture.pict("foo");
+
+% question 2: how to draw
+pict.info.left := 10;
+pict.info.boxed := 1;
+
+% question 3: where to draw
+pict.nw = (0,0);
+
+% now we can draw
+drawObject(pict);
+\end{verbatim}
+
+To allow for this type of code, the equations that define the layout of the {\code Picture} object (here, what the margins are)
+must be defined somewhere after the constructor. This is done by a macro called {\code Picture\_layout}.
+This macro defines all the equations which link the ``what to draw'' information to the ``how to draw''
+information (which in our case is taken from the {\code info} member, a copy of {\code iPict}).
+Nevertheless, notice that {\code Picture\_layouts} is not explicitly invoked. To the user's
+great relief, this is taken care of automatically within the {\code Picture\_draw} macro.
+
+There are times however, when explicitly invoking a macro like {\code Picture\_layout}
+becomes a necessity. This is because, by contract, it is only after the {\code layout}
+macro is invoked that the final dimensions (width, height) of an object are
+definitely and permanently known. Imagine that we have a component whose job is to
+surround in a red-filled rectangle some other objects. This component
+needs to know what the dimensions of the contained objects are, in order to be able to set
+its own dimensions. At drawing time, the contained objects must not have been drawn already,
+because the red rectangle of the container would overwrite them.
+Therefore, the whole pseudo-code would be:
+\begin{verbatim}
+Create objects o1, o2, ... ok;
+Create container c(o1, o2, ..., ok);
+Optional: modify info-s for o1, o2, ... ok;
+Optional: modify info for c;
+
+layout c, requiring layout of o1, o2, ... ok;
+establish where to draw c;
+draw red rectangle defined by c;
+draw components o1, o2, ...ok within c
+\end{verbatim}
+
+A natural conclusion is that an object must not be laid out more than once, because otherwise
+inconsistent or superfluous equations would arise. To enforce this, by contract,
+any object must keep record of whether its layout method has already been invoked,
+and if the answer is affirmative, subsequent invocations of the layout macro would
+do nothing. It is very important to mention that after the {\code layout} macro is
+invoked over an object, modifying the {\code info} member of that object has
+no subsequent effect, since the layout equations are declared and interpreted only once.
+
+\subsection{Notes on the Implementation of Links}
+
+MetaUML considers edges in diagram graphs as links. A link is composed of a path and the
+heads (possible none, one or two). For example, since an association has no heads, it suffices
+to draw along the path with a solid pen; however, an unidirectional aggregation has, in addition
+to a solid path, two heads: one is an arrow and the other is a diamond.
+
+The general algorithm for drawing a link is:
+
+\begin{verbatim}
+0. Reserve space for heads
+1. Draw the path (except for the heads)
+2. Draw head 1
+3. Draw head 2
+\end{verbatim}
+
+Each of the UML link types define how the drawing should be done, in each of the
+cases (1, 2 and 3). Consider the link type of unidirectional composition.
+Its ``class'' is declared as:
+
+\begin{verbatim}
+vardef CompositionUniInfo@# =
+ LinkInfo@#;
+
+ @#widthA = defaultRelationHeadWidth;
+ @#heightA = defaultRelationHeadHeight;
+ @#drawMethodA = "drawArrow";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawDiamondBlack";
+
+ @#drawMethod = "drawLine";
+enddef;
+\end{verbatim}
+
+Using this definition, the actual description is created like this:
+
+\begin{verbatim}
+CompositionUniInfo.compositionUni;
+\end{verbatim}
+
+As shown previously, is is the macro {\code link} which
+performs the actual drawing, using the link description information
+which is given as parameter (generally called {\code iLink}).
+For example, we can use:
+
+\begin{verbatim}
+link(aggregationUni)((0,0)--(40,0));
+\end{verbatim}
+
+%\begin{figure}
+%\centering
+%\includegraphics{fig/how-links-work.1}
+%\caption{An example of a picture stack.}
+%\label{fig:hlw}
+%\end{figure}
+
+Let us see now the inner workings of macro {\code link}. Its definition is:
+
+\begin{verbatim}
+vardef link(text iLink)(expr myPath)=
+ LinkStructure.ls(myPath,
+ iLink.widthA, iLink.widthB);
+ drawLinkStructure(ls)(iLink);
+enddef;
+\end{verbatim}
+
+\begin{figure}
+\centering
+\begin{tabular}{l|l}
+$AB$ & the path specified by the user \\
+$|AA'|$ & {\code iLink.widthA}\\
+$|BB'|$ & {\code iLink.widthB}
+\end{tabular}
+\includegraphics{fig/how-links-work.2}
+\caption{Details on how a link is drawn by MetaUML.}
+\label{fig:hlw2}
+\end{figure}
+
+First, space is reserved for heads, by ``shortening'' the given path {\code myPath}
+by {\code iLink.widthA} at the beginning and by {\code iLink.widthB} at the end.
+After that, the shortened path is drawn with the ``method''
+given by {\code iLink.drawMethod} and the heads with the ``methods''
+{\code iLink.drawMethodA} and {\code iLink.drawMethodB},
+respectively (figure \ref{fig:hlw2}).
+
+\subsection{Object Definitions: Easier {\code generic\_declare}}
+
+In MetaPost, if somebody wants to define something resembling a class in an object-oriented language,
+named, say, {\code Person}, he would do something like this:
+
+\begin{verbatim}
+vardef Person@#(expr _name, _age)=
+ % @# prefix can be seen as `this` pointer
+ string @#name;
+ numeric @#age;
+
+ @#name := _name;
+ @#age := _age;
+enddef;
+\end{verbatim}
+
+This allows for the creation of instances (or objects) of class {\code Person} by using
+declarations like:
+
+\begin{verbatim}
+Person.personA;
+Person.personB;
+\end{verbatim}
+
+ However, if one also wants to able able to create indexed arrays of persons, such as
+{\code Person.student0}, {\code Person.student1} etc., the definition of class
+{\code Person} must read:
+
+\begin{verbatim}
+vardef Person@#(expr _name, _age)=
+ _n_ := str @#;
+ generic_declare(string) _n.name;
+ generic_declare(numeric) _n.age;
+
+ @#name := _name;
+ @#age := _age;
+enddef;
+\end{verbatim}
+
+This construction is rather inelegant. MetaUML offers alternative macros to achieve
+the same effect, uncluttering the code by removing the need for the unaesthetic {\code \_n\_} and
+{\code \_n}.
+
+\begin{verbatim}
+vardef Person@#(expr _name, _age)=
+ attributes(@#);
+ var(string) name;
+ var(numeric) age;
+
+ @#name := _name;
+ @#age := _age;
+enddef;
+\end{verbatim}
+
+\section{Customization in MetaUML: Examples}
+\label{section:customization}
+
+We have seen that in MetaUML the ``how to draw'' information is memorized into the so-called
+``{\code Info}'' structures. For example, the default way in which a {\code Picture} object is
+to be drawn is recorded into an instance of {\code PictureInfo}, named {\code iPict}. In this section we
+present a case study involving the customization of {\code Class} objects. The customization of
+any other MetaUML objects works similarly. Here we cannot possibly present all the customization
+options for all kinds of MetaUML objects: this would take too long. Nevertheless, an interested reader can refer
+to the top of the appropriate MetaUML library file, where {\code Info} structures are defined.
+For example, class diagram related definitions are in {\code metauml\_class.mp}, activity diagram
+definitions are in {\code metauml\_activity.mp} etc.
+
+\subsection{Global settings}
+
+Let us assume that we do not particularly like the default foreground color of all classes, and wish
+to change it so something yellowish. In this scenario, one would most likely want to change
+the appropriate field in {\code iClass}:
+
+\begin{verbatim}
+iClass.foreColor := (.9, .9, 0);
+\end{verbatim}
+
+After this, we can obtain the following result:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("A")()();
+Class.B("B")()();
+Class.C("C")()();
+
+B.w = A.e + (20,0);
+C.n = .5[A.se, B.sw] + (0, -10);
+
+drawObjects(A, B, C);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class_customization.1}
+\end{multicols}
+
+\subsection{Individual settings}
+
+To modify the settings of one particular {\code Class} objects, another strategy is more appropriate. How about having class
+{\code C} stand out with a light blue foreground color, a bigger font size for the class name and a blue border?
+
+\begin{multicols}{2}
+\begin{verbatim}
+iPict.foreColor := (.9, .9, 0);
+
+Class.A("A")()();
+Class.B("B")()();
+Class.C("C")()();
+C.info.foreColor := (.9, .7, .7);
+C.info.borderColor := green;
+C.info.iName.iFont.scale := 2;
+
+% positioning code ommited
+drawObjects(A, B, C);
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class_customization.2}
+\end{multicols}
+
+As an aside, each {\code Class} object has an {\code info} member which is created as
+a copy of {\code iClass}; the actual drawing is performed using this copied
+information. Because of that, the {\code info} member can be safely modified after the object
+has been created, obtaining the expected results and not influencing other objects.
+
+Another thing worth mentioning is that the {\code ClassInfo} structure contains
+the {\code iName} member, which is an instance of {\code PictureInfo}. In our example we
+do not want to modify the spacings around the {\code Picture} object,
+but the characteristics of the font its contents is typeset into. To do that,
+we modify the {\code iName.iFont} member, which by default is a copy of {\code iFont}
+(an instance of {\code FontInfo}, defined in {\code util\_picture.mp}).
+If, for example, we want to change the font the class name is rendered into, we would set
+the attribute {\code iName.iFont.name} to a string representing a font name
+on our system (as used with the MetaPost {\code infont} operator).
+
+\subsection{Predefined settings}
+
+This usage scenario is perhaps more interesting. Suppose that we have two
+types of classes which we want to draw differently. Making the setting adjustments
+for each individual class object would soon become a nuisance. MetaUML's solution consists in the
+ability of using predefined ``how to draw'' {\code Info} objects. Let us create such objects:
+
+\begin{verbatim}
+ClassInfoCopy.iHome(iClass);
+iHome.foreColor := (0, .9, .9);
+
+ClassInfo.iRemote;
+iRemote.foreColor := (.9, .9, 0);
+iRemote.borderColor := green;
+\end{verbatim}
+
+Object {\code iHome} is a copy of {\code iClass} (as it might have been set at
+the time of the macro call). Object {\code iRemote} is created just as {\code iClass}
+is originally created. We can now use these {\code Info} objects to easily set the
+``how to draw'' information for classes. The result is depicted below,
+please note the ``{\code E}'' prefix in {\code EClass}:
+
+\begin{multicols}{2}
+\begin{verbatim}
+EClass.A(iHome)("UserHome")()();
+EClass.B(iRemote)("UserRemote")()();
+EClass.C(iHome)("CartHome")()();
+EClass.D(iRemote)("CartRemote")()();
+\end{verbatim}
+\columnbreak
+\hspace{1cm}\includegraphics{fig/class_customization.3}
+\end{multicols}
+
+\subsection{Extreme customization}
+
+When another font (or font size) is used, it may become necessary to change the space between the
+baselines of attributes and methods. Figure below is the result of the (unlikely) code:
+
+\begin{multicols}{2}
+\begin{verbatim}
+Class.A("Foo")
+ ("a: int", "b: int")
+ ("foo()", "bar()", "gar()");
+
+A.info.iName.iFont.name := metauml_defaultFontBold;
+A.info.iName.iFont.scale := 1.2;
+
+A.info.iAttributeStack.iPict.iFont.scale := 0.8;
+A.info.iAttributeStack.top := 10;
+A.info.iAttributeStack.spacing := 11;
+
+A.info.iMethodStack.iPict.iFont.scale := 2;
+A.info.iMethodStack.spacing := 17;
+A.info.iMethodStack.bottom := 10;
+
+drawObject(A);
+\end{verbatim}
+\columnbreak
+\hspace{4cm}\includegraphics{fig/class_customization.4}
+\end{multicols}
+
+\begin{verbatim}
+\end{verbatim}
+
+Both {\code iAttributeStack} and {\code iMethodStack} are instances of
+{\code PictureStackInfo}, which is used to control the display of {\code PictureStack} objects.
+%We can also customize the size and colors of the ``locks'' by setting {\code A.info.iLock}.
+
+As font names, you can choose from the globally defined {\code metauml\_defaultFont}, {\code metauml\_defaultFontOblique}, {\code metauml\_defaultFontBold}, {\code metauml\_defaultFontBoldOblique}, or any other name of a font that is available on your system.
+
+\section{Alternatives to MetaUML}
+
+No software package is perfect, and for this MetaUML is a prime example. Here is a list of packages that may also be used to create UML diagrams for LaTeX work:
+
+\begin{itemize}
+\item uml.sty \cite{umlsty}
+\item pst-uml \cite{pstumlsty}
+\item umldoc \cite{umldoc}
+\item TiKZ-UML \cite{tikzuml}
+\end{itemize}
+
+Do not ignore the possibility of creating your diagrams using a GUI program, and then exporting them into a LaTex-friendly open format such as SVG \cite{svglatex}.
+
+\pagebreak
+\input{test-suite}
+
+\pagebreak
+\section{References}
+\printbibliography[heading=none]
+
+\end{document}
diff --git a/graphics/metapost/contrib/macros/metauml/examples/manual/test-suite.tex b/graphics/metapost/contrib/macros/metauml/examples/manual/test-suite.tex
new file mode 100644
index 0000000000..b0aa9a6685
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/examples/manual/test-suite.tex
@@ -0,0 +1,82 @@
+% Part of the MetaUML manual
+% Copyright (c) 2005 Ovidiu Gheorghies
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled "GNU
+% Free Documentation License".
+
+\newcommand{\metaumltest}[2]{Test #2 --- \\ \includegraphics{fig/test_#1.#2} \\ }
+\newcommand{\metaumltests}[2]{\multido{\iA=1+1}{#2}{\metaumltest{#1}{\iA}}}
+
+\section{Test Suite}
+
+\subsection{Low-level}
+ \metaumltests{lowlevel}{2}
+
+\subsection{Fonts}
+ \metaumltests{font}{3}
+
+\subsection{Util library}
+ \subsubsection{Picture tests}
+ \metaumltests{picture}{10}
+
+ \subsubsection{Picture tests - TeX rendering}
+ \metaumltests{picture_tex_rendering}{1}
+
+ \subsubsection{Group tests}
+ \metaumltests{group}{2}
+
+ \subsubsection{PictureStack tests}
+ \metaumltests{picture_stack}{7}
+
+ \subsubsection{Positioning tests}
+ \metaumltests{positioning}{6}
+
+\subsection{Class diagram}
+ \subsubsection{Class tests}
+ \metaumltests{class}{16}
+ \subsubsection{Class feature types tests}
+ \metaumltests{class_feature_types}{5}
+ \subsubsection{Class template tests}
+ \metaumltests{class_templates}{3}
+
+ \subsubsection{Qualified Association tests}
+ \metaumltests{class_qual_assoc}{2}
+
+\subsection{Package diagram}
+\subsubsection{Package tests}
+ \metaumltests{package}{2}
+
+\subsection{Component diagram}
+\subsubsection{Component tests}
+ \metaumltests{component}{1}
+
+\subsection{Paths}
+ \metaumltests{paths}{3}
+
+\subsection{Behavioral diagrams}
+ \subsubsection{Activity tests}
+ \metaumltests{activity}{2}
+
+ \subsubsection{State Machine tests}
+ \metaumltests{state}{5}
+
+ \subsubsection{Usecase tests}
+ \metaumltests{usecase}{9}
+
+\subsection{Miscelaneous}
+ \subsubsection{Notes}
+ \metaumltests{note}{2}
+ \subsubsection{Objects (Class Instances)}
+ \metaumltests{instance}{1}
+
+\subsection{User requests}
+ Test 1 --- \\ \includegraphics[scale=.2]{fig/test_lars_issues.1} \\
+ \metaumltest{lars_issues}{2}
+
+\subsection{Skins}
+ \metaumltests{skins}{1}
+ \metaumltests{skins_global_defaults}{1}
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml.mp
new file mode 100644
index 0000000000..95748cf767
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml.mp
@@ -0,0 +1,66 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_mp:
+ expandafter endinput
+fi;
+_metauml_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_infrastructure;
+inputonce util_object;
+inputonce util_commons;
+inputonce util_margins;
+inputonce util_picture;
+inputonce util_group;
+inputonce util_picture_stack;
+inputonce util_positioning;
+inputonce util_shade;
+
+inputonce metauml_base;
+
+inputonce metauml_links;
+inputonce metauml_paths;
+
+inputonce metauml_note;
+
+inputonce metauml_stereotype;
+
+inputonce metauml_class;
+inputonce metauml_instance;
+inputonce metauml_class_relations;
+inputonce metauml_class_assoc;
+
+inputonce metauml_package;
+inputonce metauml_package_relations;
+
+inputonce metauml_behavioral_common;
+inputonce metauml_activity;
+inputonce metauml_state;
+
+inputonce metauml_usecase_clipart;
+inputonce metauml_usecase;
+
+input metauml_behavioral_common;
+input metauml_activity;
+input metauml_state;
+
+input metauml_usecase_clipart;
+input metauml_usecase;
+
+input metauml_component;
+input metauml_component_relations;
+
+input metauml_templates;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_activity.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_activity.mp
new file mode 100644
index 0000000000..79ac5042e2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_activity.mp
@@ -0,0 +1,229 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_activity_mp:
+ expandafter endinput
+fi;
+_metauml_activity_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef ActivityInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iText (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iStack (2, 2, 2, 2)(9)(@#iText);
+
+ @#iStack.iPict.ignoreNegativeBase := 1;
+
+ Margins.@#(2,2,2,2);
+
+ @#fat := 5;
+
+ ShadeInfo.@#iShade;
+ @#foreColor := .9white;
+ @#borderColor := black;
+enddef;
+
+vardef ActivityInfoCopy@#(text src)=
+ log "ActivityInfoCopy: Copying activity info";
+
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ PictureStackInfoCopy.@#iStack (src.iStack);
+ MarginsCopy.@#(src);
+ @#fat := src.fat;
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+enddef;
+
+ActivityInfo.iActivity;
+
+vardef Activity@#(text contents)=
+ EActivity.@#(iActivity)(contents);
+enddef;
+
+vardef EActivity@#(text _info)(text contents)=
+ ObjectEquations(@#);
+ @#className := "Activity";
+
+ ActivityInfoCopy.@#info(_info);
+
+ numeric @#nLines; @#nLines := 0;
+ string @#lines[];
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+
+ EPictureStack.@#stack(@#info.iStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+enddef;
+
+vardef Activity_layout@#=
+ if @#laidout = 1:
+ log "Activity " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+
+ PictureStack_layout.@#stack;
+
+ @#width = @#stack.width + @#info.left + @#info.right + 2 * @#info.fat;
+ @#height = @#stack.height + @#info.top + @#info.bottom;
+
+ @#c = @#stack.c;
+
+ pair @#urt, @#lrt, @#ulft, @#llft;
+
+ @#urt := @#ne - (@#info.fat, 0);
+ @#lrt := @#se - (@#info.fat, 0);
+ @#ulft := @#nw + (@#info.fat, 0);
+ @#llft := @#sw + (@#info.fat, 0);
+ fi;
+enddef;
+
+vardef Activity_draw@#=
+ Activity_layout@#;
+ objectEnsurePositioning.@#;
+
+ attributes(@#);
+ var(path) border;
+ @#border := @#ulft -- @#urt .. @#e .. @#lrt -- @#llft .. @#w .. cycle;
+
+ drawObjectShade(@#);
+ fill @#border withcolor @#info.foreColor;
+ draw @#border withcolor @#info.borderColor;
+
+ drawObject(@#stack);
+enddef;
+
+vardef Activity_border@#=
+ @#border
+enddef;
+
+
+vardef BranchInfo@#=
+ @#width := 10;
+ @#height := 10;
+
+ numeric @#shade;
+ color @#shadeColor, @#foreColor;
+ @#shade := .3;
+ @#shadeColor := .6white;
+ @#foreColor := white;
+enddef;
+
+BranchInfo.iBranch;
+
+vardef Branch@#=
+ ObjectEquations(@#);
+ @#className := "Branch";
+
+ @#width = iBranch.width;
+ @#height = iBranch.height;
+enddef;
+
+vardef Branch_layout@#=
+ % nothing to do
+enddef;
+
+vardef Branch_draw@#=
+ objectEnsurePositioning.@#;
+
+ path @#border;
+ @#border := @#n -- @#e -- @#s -- @#w -- cycle;
+
+ fill @#border shifted (iBranch.shade, -iBranch.shade) withcolor iBranch.shadeColor;
+ fill @#border withcolor iBranch.foreColor;
+ draw @#border;
+enddef;
+
+vardef Branch_border@#=
+ @#border
+enddef;
+
+vardef ForkInfo@#=
+ @#thickness := 3;
+
+ numeric @#shade;
+ color @#shadeColor, @#foreColor;
+ @#shade := .3;
+ @#shadeColor := .6white;
+ @#foreColor := black;
+enddef;
+
+ForkInfo.iFork;
+
+vardef Fork@#(expr orientation, length)=
+ ObjectEquations(@#);
+ @#className := "Fork";
+
+ if (orientation="h") or (orientation="horiz") or (orientation="horizontal"):
+ @#width = length;
+ @#height = iFork.thickness;
+ else:
+ @#height = length;
+ @#width = iFork.thickness;
+ fi;
+enddef;
+
+vardef Fork_layout@#=
+ % nothing to do
+enddef;
+
+vardef Fork_draw@#=
+ objectEnsurePositioning.@#;
+
+ path @#border;
+ @#border := @#nw -- @#ne -- @#se -- @#sw -- cycle;
+
+ fill @#border shifted (iFork.shade, -iFork.shade) withcolor iFork.shadeColor;
+ fill @#border withcolor iFork.foreColor;
+enddef;
+
+vardef Fork_border@#=
+ @#border
+enddef;
+
+defaultTransitionHeadWidth := 15;
+defaultTransitionHeadHeight := 5;
+
+vardef TransitionInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultTransitionHeadWidth;
+ @#heightB = defaultTransitionHeadHeight;
+ @#drawMethodB = "drawArrow";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+TransitionInfo.transition;
+
+FontInfo.guardFont(metauml_defaultFont, .7);
+PictureInfo.iGuard(2, 2, 2, 2)(guardFont);
+iGuard.ignoreNegativeBase := 1;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_base.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_base.mp
new file mode 100644
index 0000000000..22f73d3906
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_base.mp
@@ -0,0 +1,171 @@
+% Copyright 2006 2015 Ovidiu Gheorghies, Radu-George Radulescu
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_base_mp:
+ expandafter endinput
+fi;
+_metauml_base_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef markPoint(text p)(text color) =
+ draw p withpen pencircle scaled 1 withcolor color;
+enddef;
+
+vardef drawLine(text pA)(text pB)(text base) =
+ draw pA--pB;
+enddef;
+
+vardef drawArrow(text pA)(text pB)(text base) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+
+ pair pC, pD;
+ pC := (0, base/2);
+ pC := pC rotated (alfa) shifted pA;
+ pD := (0, base/2);
+ pD := pD rotated (180+alfa) shifted pA;
+
+ %fill pA--pC--pB--pD--cycle withcolor .8white;
+
+ draw pA--pB;
+ draw pB--pC;
+ draw pB--pD;
+enddef;
+
+vardef drawTriangle(text pA)(text pB)(text base) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+ pair pC, pD;
+ pC := (0, base/2);
+ pC := pC rotated (alfa) shifted pA;
+ pD := (0, base/2);
+ pD := pD rotated (180+alfa) shifted pA;
+
+ fill pA--pC--pB--pD--cycle withcolor white;
+
+ draw pA--pC;% withcolor red;
+ draw pA--pD;% withcolor green;
+ draw pB--pC;% withcolor blue;
+ draw pB--pD;
+enddef;
+
+vardef drawDiamond(text pA)(text pB)(text height) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+
+ numeric width;
+ width = _length(pA)(pB);
+
+ path diamond;
+ diamond = (0,0)--(width/2, height/2)--(width, 0)--(width/2, -height/2)--cycle;
+
+ fill diamond rotated alfa shifted pA withcolor white;
+ draw diamond rotated alfa shifted pA;
+enddef;
+
+vardef drawDiamondBlack(text pA)(text pB)(text height) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+
+ numeric width;
+ width = _length(pA)(pB);
+
+ path diamond;
+ diamond = (0,0)--(width/2, height/2)--(width, 0)--(width/2, -height/2)--cycle;
+
+ fill diamond rotated alfa shifted pA;
+enddef;
+
+vardef drawCrossedCircle(text pA)(text pB)(text height) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+
+ numeric width;
+ width = _length(pA)(pB);
+
+ pair pC, pD;
+ pC := (width/2, height/2 + 1);
+ pC := pC rotated (alfa) shifted pA;
+ pD := (width/2, -height/2 - 1);
+ pD := pD rotated (alfa) shifted pA;
+
+ fill pA..pB..pA -- cycle withcolor white;
+
+ draw pA -- pB;
+ draw pC -- pD;
+ draw pA .. pB .. pA;
+enddef;
+
+vardef drawSemiCircle(text pA)(text pB)(text height) =
+ numeric dx, dy;
+ dx = xpart(pB - pA);
+ dy = ypart(pB - pA);
+
+ numeric alfa;
+ alfa = angle(dx, dy);
+
+ numeric width;
+ width = _length(pA)(pB);
+
+ pair pC, pD;
+ pC := (width/2 + 5, height/2 + 1);
+ pC := pC rotated (alfa) shifted pB;
+ pD := (width/2 + 5, -height/2 - 1);
+ pD := pD rotated (alfa) shifted pB;
+
+ draw pC .. pA .. pD;
+enddef;
+
+vardef drawCircle(text pA)(text pB)(text height) =
+ fill pA..pB..pA -- cycle withcolor white;
+
+ draw pA .. pB .. pA;
+enddef;
+
+vardef drawLine(expr my_path) =
+ draw my_path;
+enddef;
+
+vardef drawLineDashed(expr my_path) =
+ draw my_path dashed evenly;
+enddef;
+
+vardef drawNothing(text pA)(text pB)(text base) =
+enddef;
+
+def shorterLineEndPoint(text pA)(text pB)(text delta) =
+ (xpart(pA) + _dx(pA)(pB)*(1 - delta/_length(pA)(pB)), ypart(pA) + _dy(pA)(pB) * (1 - delta/_length(pA)(pB)) )
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_behavioral_common.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_behavioral_common.mp
new file mode 100644
index 0000000000..190980eb69
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_behavioral_common.mp
@@ -0,0 +1,214 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_behavioral_common_mp:
+ expandafter endinput
+fi;
+_metauml_behavioral_common_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef SpecialStateInfo@#=
+ numeric @#diameter;
+ color @#discColor;
+
+ numeric @#shade;
+ color @#shadeColor, @#foreColor;
+
+ @#diameter := 0.4cm;
+ @#discColor := black;
+ @#foreColor := black;
+
+ ShadeInfo.@#iShade;
+enddef;
+
+vardef SpecialStateInfoCopy@#(text src)=
+ SpecialStateInfo.@#;
+ ShadeInfo_copy.@#iShade(src.iShade);
+
+ @#diameter := src.diameter;
+ @#discColor := src.discColor;
+ @#foreColor := src.foreColor;
+enddef;
+
+%%%%%%%%%%%%%%%%%%
+% BEGIN %
+%%%%%%%%%%%%%%%%%%
+
+SpecialStateInfo.iBegin;
+
+vardef Begin@#=
+ ObjectEquations(@#);
+ @#className := "Begin";
+
+ SpecialStateInfoCopy.@#info(iBegin);
+enddef;
+
+vardef Begin_layout@#=
+ if @#laidout = 1:
+ log "Begin " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+
+ @#width = @#info.diameter;
+ @#height = @#info.diameter;
+ fi;
+enddef;
+
+vardef Begin_draw@#=
+ Begin_layout@#;
+ objectEnsurePositioning.@#;
+
+ path @#border;
+ @#border := @#n..@#e..@#s..@#w..cycle;
+
+ drawObjectShade(@#);
+
+ fill @#border withcolor @#info.discColor;
+ draw @#border withcolor @#info.foreColor;
+enddef;
+
+vardef Begin_border@#=
+ @#border
+enddef;
+
+%%%%%%%%%%%%%%%%%%
+% END %
+%%%%%%%%%%%%%%%%%%
+
+SpecialStateInfo.iEnd;
+iEnd.innerSpacing := 2;
+iEnd.discColor := white;
+
+vardef End@#=
+ ObjectEquations(@#);
+ @#className := "End";
+ SpecialStateInfoCopy.@#info(iEnd);
+ @#info.innerSpacing := iEnd.innerSpacing;
+enddef;
+
+vardef End_layout@#=
+ Begin_layout@#;
+enddef;
+
+vardef End_draw@#=
+ Begin_draw.@#;
+
+ path @#innerDisc;
+ @#innerDisc := @#n - (0, @#info.innerSpacing) ..
+ @#e - (@#info.innerSpacing, 0) ..
+ @#s + (0, @#info.innerSpacing) ..
+ @#w + (@#info.innerSpacing, 0) ..cycle;
+
+ fill @#innerDisc withcolor @#info.foreColor;
+enddef;
+
+vardef End_border@#=
+ @#border
+enddef;
+
+%%%%%%%%%%%%%%%%%%
+% ENTRY POINT %
+%%%%%%%%%%%%%%%%%%
+
+SpecialStateInfo.iEntryPoint;
+iEntryPoint.discColor := white;
+iEntryPoint.innerSpacing := 2;
+
+vardef EntryPoint@#=
+ ObjectEquations(@#);
+ @#className := "EntryPoint";
+ SpecialStateInfoCopy.@#info(iEntryPoint);
+ @#info.innerSpacing := iEntryPoint.innerSpacing;
+enddef;
+
+vardef EntryPoint_layout@#=
+ Begin_layout@#;
+enddef;
+
+vardef EntryPoint_draw@#=
+ Begin_draw.@#;
+enddef;
+
+vardef EntryPoint_border@#=
+ @#border
+enddef;
+
+%%%%%%%%%%%%%%%%%%
+% EXIT POINT %
+%%%%%%%%%%%%%%%%%%
+
+SpecialStateInfo.iExitPoint;
+iExitPoint.discColor := white;
+iExitPoint.innerSpacing := 2;
+
+vardef ExitPoint@#=
+ ObjectEquations(@#);
+ @#className := "ExitPoint";
+ SpecialStateInfoCopy.@#info(iExitPoint);
+ @#info.innerSpacing := iExitPoint.innerSpacing;
+ @#info.iShade.shift := 0;
+enddef;
+
+vardef ExitPoint_layout@#=
+ Begin_layout@#;
+enddef;
+
+vardef ExitPoint_draw@#=
+ Begin_draw.@#;
+
+ _n_ := str @#;
+ generic_declare(pair) _n.urt, _n.lrt, _n.llft, _n.ulft;
+
+ @#urt := @#c + @#info.diameter/2 * (sind(45), cosd(45));
+ @#lrt := @#c + @#info.diameter/2 * (sind(135), cosd(135));
+ @#llft := @#c + @#info.diameter/2 * (sind(225), cosd(225));
+ @#ulft := @#c + @#info.diameter/2 * (sind(315), cosd(315));
+
+ draw @#urt -- @#llft;
+ draw @#ulft -- @#lrt;
+enddef;
+
+vardef ExitPoint_border@#=
+ @#border
+enddef;
+
+%%%%%%%%%%%%%%%%%%
+% FlowFinal %
+%%%%%%%%%%%%%%%%%%
+
+SpecialStateInfo.iFlowFinal;
+iFlowFinal.discColor := white;
+iFlowFinal.innerSpacing := 2;
+
+vardef FlowFinal@#=
+ ObjectEquations(@#);
+ @#className := "FlowFinal";
+ SpecialStateInfoCopy.@#info(iFlowFinal);
+ @#info.innerSpacing := iFlowFinal.innerSpacing;
+ %@#info.iShade.shift := 0;
+enddef;
+
+vardef FlowFinal_layout@#=
+ Begin_layout@#;
+enddef;
+
+vardef FlowFinal_draw@#=
+ ExitPoint_draw@#
+enddef;
+
+vardef FlowFinal_border@#=
+ @#border
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_class.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class.mp
new file mode 100644
index 0000000000..c3ac333b21
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class.mp
@@ -0,0 +1,485 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_class_mp:
+ expandafter endinput
+fi;
+_metauml_class_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+inputonce util_picture;
+inputonce util_picture_stack;
+inputonce util_shade;
+
+string visibilityPublic, visibilityProtected, visibilityPrivate, visibilityPackage;
+visibilityPublic:="+";
+visibilityProtected:="#";
+visibilityPrivate:="-";
+visibilityPackage:="~";
+
+string metauml_private_abstractMarker, metauml_private_staticMarker;
+metauml_private_abstractMarker := "@abstract";
+metauml_private_staticMarker := "@static";
+
+def abstract expr methodName= metauml_private_abstractMarker&methodName enddef;
+def static expr featureName= metauml_private_staticMarker&featureName enddef;
+
+def metauml_private_isAbstract(expr name) = (substring (0, 9) of name = metauml_private_abstractMarker) enddef;
+def metauml_private_isStatic(expr name) = (substring (0, 7) of name = metauml_private_staticMarker) enddef;
+def metauml_private_stripStatic(expr name) = substring (7,infinity) of name enddef;
+def metauml_private_stripAbstract(expr name) = substring (9,infinity) of name enddef;
+
+vardef ClassInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(string) featureVisibilityMode;
+
+ FontInfo.@#nameFont(metauml_defaultFont, defaultscale);
+ FontInfo.@#featureFont (metauml_defaultFont, defaultscale);
+ FontInfo.@#stereotypeFont(metauml_defaultFont, .7);
+
+ ShadeInfo.@#iShade;
+
+ @#featureVisibilityMode := "individual"; % "none", "grouped"
+
+ @#foreColor := .9white;
+ @#borderColor := black;
+
+ PictureInfo.@#iName (2, 2, 1, 3)(@#nameFont);
+ @#iName.ignoreNegativeBase := 1;
+
+ PictureInfoCopy.@#iNameAbstract(@#iName);
+ @#iNameAbstract.iFont.name := metauml_defaultFontOblique;
+
+ PictureInfo.@#iStereotype(2, 2, 2, 2)(@#stereotypeFont);
+ @#iStereotypeStack.iPict.ignoreNegativeBase := 1;
+
+ PictureStackInfo.@#iStereotypeStack(2, 2, 1, 1)(5.5)(@#iStereotype);
+
+ PictureInfo.@#iFeature (2, 2, 1.25, 0)(@#featureFont);
+
+ PictureInfoCopy.@#iFeatureAbstract (@#iFeature);
+ @#iFeatureAbstract.iFont.name := metauml_defaultFontOblique;
+
+ PictureInfoCopy.@#iFeatureStatic (@#iFeature);
+ @#iFeatureStatic.textDecoration := "underline";
+
+ PictureStackInfo.@#iFeatureStack (2, 2, 2.5, 2)(10.5)(@#iFeature);
+ PictureStackInfoCopy.@#iAttributeStack(@#iFeatureStack);
+ PictureStackInfoCopy.@#iMethodStack(@#iFeatureStack);
+
+ @#iFeatureStack.iPict.bottom := 2;
+ @#iFeatureStack.iPict.ignoreNegativeBase := 1;
+
+ PictureStackInfoCopy.@#iAttributeVisibilityStack (@#iFeatureStack);
+ PictureStackInfoCopy.@#iMethodVisibilityStack (@#iFeatureStack);
+
+ @#iAttributeVisibilityStack.right := 0;
+ @#iMethodVisibilityStack.right := 0;
+enddef;
+
+vardef ClassInfoCopy@#(text src)=
+ log "ClassInfoCopy: Copying class";
+
+ attributes(@#);
+ var(numeric) featureVisibilitySpacing, visibilityWidth, visibilityHeight;
+ var(color) foreColor, borderColor;
+ var(string) featureVisibilityMode;
+
+ FontInfoCopy.@#nameFont(src.nameFont);
+ FontInfoCopy.@#featureFont(src.featureFont);
+ FontInfoCopy.@#stereotypeFont(src.stereotypeFont);
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+
+ PictureInfoCopy.@#iName (src.iName);
+ PictureInfoCopy.@#iNameAbstract (src.iNameAbstract);
+
+ PictureInfoCopy.@#iStereotype(src.iStereotype);
+ PictureInfoCopy.@#iFeature (src.iFeature);
+ PictureInfoCopy.@#iFeatureAbstract (src.iFeatureAbstract);
+ PictureInfoCopy.@#iFeatureStatic (src.iFeatureStatic);
+
+ PictureStackInfoCopy.@#iStereotypeStack(src.iStereotypeStack);
+ PictureStackInfoCopy.@#iFeatureStack (src.iFeatureStack);
+ PictureStackInfoCopy.@#iAttributeStack (src.iAttributeStack);
+ PictureStackInfoCopy.@#iMethodStack (src.iMethodStack);
+ PictureStackInfoCopy.@#iAttributeVisibilityStack (src.iAttributeVisibilityStack);
+ PictureStackInfoCopy.@#iMethodVisibilityStack (src.iMethodVisibilityStack);
+
+ @#featureVisibilityMode := src.featureVisibilityMode;
+enddef;
+
+ClassInfo.iClass;
+
+ClassInfoCopy.iClassNameOnly(iClass);
+iClassNameOnly.iName.top := 10;
+iClassNameOnly.iName.bottom := 10;
+iClassNameOnly.iAttributeStack.top := 0;
+iClassNameOnly.iAttributeStack.bottom := 0;
+iClassNameOnly.iMethodStack.top := 0;
+iClassNameOnly.iMethodStack.bottom := 0;
+
+ClassInfoCopy.iInterface(iClass);
+iInterface.iAttributeStack.top := 0;
+iInterface.iAttributeStack.bottom := 0;
+iInterface.iName.iFont.name := metauml_defaultFontOblique;
+
+ClassInfoCopy.iAbstractClass(iClass);
+iAbstractClass.iName.iFont.name := metauml_defaultFontOblique;
+
+%
+% CLASS
+%
+vardef defClass@#(expr pname) =
+ ObjectEquations(@#);
+ @#className := "Class";
+
+ string @#name;
+ boolean @#isAbstract;
+
+ @#isAbstract := metauml_private_isAbstract(pname);
+ if @#isAbstract:
+ @#name = metauml_private_stripAbstract(pname);
+ else:
+ @#name = pname;
+ fi
+
+ numeric @#nStereotypes;
+ string @#stereotypes[];
+
+ string @#attributes[];
+ string @#attributesVisibility[];
+ boolean @#attributesIsStatic[];
+
+ string @#methods[];
+ string @#methodsVisibility[];
+ boolean @#methodsIsStatic[];
+ boolean @#methodsIsAbstract[];
+
+ numeric @#nAttrs;
+ numeric @#nMethods;
+ numeric @#nStereotypes;
+
+ @#nStereotypes := 0;
+ @#nAttrs := 0;
+ @#nMethods := 0;
+enddef;
+
+vardef addAttribute@#(expr pcontent) =
+ string visibility;
+ string attribute;
+
+ attribute := pcontent;
+
+ @#attributesIsStatic[@#nAttrs] := metauml_private_isStatic(attribute);
+ if @#attributesIsStatic[@#nAttrs]:
+ attribute := metauml_private_stripStatic(attribute);
+ fi
+
+ visibility := substring(0,1) of attribute;
+ if (not (visibility = visibilityPublic)) and
+ (not (visibility = visibilityPrivate)) and
+ (not (visibility = visibilityProtected)) and
+ (not (visibility = visibilityPackage)):
+
+ @#.attributes[@#.nAttrs] := attribute;
+ @#.attributesVisibility[@#.nAttrs] := visibilityPackage;
+ else:
+ save from;
+ from := 1;
+ if (substring(1,2) of attribute) = " ": from := 2; fi;
+
+ @#.attributes[@#.nAttrs] := substring(from, infinity) of attribute;
+ @#.attributesVisibility[@#.nAttrs] := visibility;
+ fi;
+
+ @#.nAttrs := @#.nAttrs + 1;
+enddef;
+
+vardef addMethod@#(expr pcontent) =
+ string visibility;
+ string method;
+
+ method := pcontent;
+
+ @#methodsIsStatic[@#nMethods] := metauml_private_isStatic(method);
+ if @#methodsIsStatic[@#nMethods]:
+ method := metauml_private_stripStatic(method);
+ fi
+
+ @#methodsIsAbstract[@#nMethods] := metauml_private_isAbstract(method);
+ if @#methodsIsAbstract[@#nMethods]:
+ method := metauml_private_stripAbstract(method);
+ @#isAbstract := true;
+ fi
+
+ visibility := substring(0,1) of method;
+ if (not (visibility = visibilityPublic)) and
+ (not (visibility = visibilityPrivate)) and
+ (not (visibility = visibilityProtected)) and
+ (not (visibility = visibilityPackage)):
+
+ @#.methods[@#.nMethods] := method;
+ @#.methodsVisibility[@#.nMethods] := visibilityPackage;
+ else:
+ save from;
+ from := 1;
+ if (substring(1,2) of method) = " ": from := 2; fi;
+
+ @#.methods[@#.nMethods] := substring(from, infinity) of method;
+ @#.methodsVisibility[@#.nMethods] := visibility;
+ fi;
+
+ @#.nMethods := @#.nMethods + 1;
+enddef;
+
+vardef classStereotype@#(expr pcontent) =
+ show "Macro classStereotype is deprecated, use Class_stereotypes instead.";
+ Class_stereotypes.@#(pcontent);
+enddef;
+
+vardef classStereotypes@#(text stereotypes)=
+ show "Macro classStereotypes is deprecated, use Class_stereotypes instead.";
+ Class_stereotypes.@#(stereotypes);
+enddef;
+
+vardef EClass@#(text _info)(expr name)(text attributes)(text methods)=
+ log "EClass begin: " & str @#;
+
+ defClass@#(name);
+
+ log "Copying class info";
+ ClassInfoCopy.@#info(_info);
+
+ for a=attributes:
+ log "Adding attribute ", a;
+ addAttribute@#(a);
+ endfor;
+ for m=methods:
+ log "Adding method ", m;
+ addMethod@#(m);
+ endfor;
+enddef;
+
+vardef Class@#(expr name)(text attributes)(text methods)=
+ EClass@#(iClass)(name)(attributes)(methods);
+enddef;
+
+vardef Interface@#(expr name)(text methods)=
+ EClass@#(iInterface)(name)()(methods);
+enddef;
+
+vardef EInterface@#(text _info)(expr name)(text methods)=
+ EClass@#(_info)(name)()(methods);
+enddef;
+
+vardef ClassName@#(expr name)=
+ EClass@#(iClassNameOnly)(name)()();
+enddef;
+
+vardef EClassName@#(text _info)(expr name)=
+ EClass@#(_info)(name)()();
+enddef;
+
+vardef AbstractClass@#(expr name)(text attributes)(text methods)=
+ EClass@#(iAbstractClass)(name)(attributes)(methods);
+enddef;
+
+vardef EAbstractClass@#(text _info)(expr name)(text methods)=
+ EClass@#(_info)(name)()(methods);
+enddef;
+
+vardef Class_border@#=
+ objectBox(@#)
+enddef;
+
+vardef Class_noVisibilityMarkers@#=
+ @#info.featureVisibilityMode := "none";
+enddef;
+
+vardef Class_layout@# =
+ if @#laidout = 1:
+ log "Class " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Class layout: " & (str @#);
+
+ EPictureStack.@#stereotypeStack(@#info.iStereotypeStack)
+ (scantokens listArray(@#stereotypes)(@#nStereotypes))("vcenterbase");
+
+ if (@#isAbstract):
+ EPicture.@#namePict(@#info.iNameAbstract)(@#name);
+ else:
+ EPicture.@#namePict(@#info.iName)(@#name);
+ fi;
+
+ layoutObjects(@#stereotypeStack, @#namePict);
+
+ % Define attributes
+
+ def metauml_private_attributeStyleSupplier(expr i)=
+ if @#attributesIsStatic[i]: @#info.iFeatureStatic
+ else: @#info.iFeature
+ fi
+ enddef;
+
+ @#info.iAttributeStack.childStyleSupplier := "metauml_private_attributeStyleSupplier";
+
+ EPictureStack.@#attributeStack(@#info.iAttributeStack)
+ (scantokens listArray(@#attributes)(@#nAttrs))("vleftbase");
+
+ if @#info.featureVisibilityMode = "individual":
+ vardef joinCallbackAttributesVisibility@#=
+ setObjectJoin(pb.bottom = @#.attributeStack.pict[index].bottom; pb.midx = pa.midx);
+ setObjectJoinFirst(pa.bottom = @#.attributeStack.pict[index].bottom);
+ enddef;
+
+ EPictureStack.@#attributeVisibilityStack(@#info.iAttributeVisibilityStack)
+ (scantokens listArray(@#attributesVisibility)(@#nAttrs))
+ ("joinCallbackAttributesVisibility." & (str @#));
+ elseif @#info.featureVisibilityMode = "none":
+ EPicture.@#attributeVisibilityStack(iPictNoMargins)("");
+ else:
+ show "Unknown feature visibility mode", @#featureVisibilityMode;
+ 1=2;
+ fi;
+
+ % Define methods
+
+ def metauml_private_methodStyleSupplier(expr i)=
+ if @#methodsIsStatic[i]: @#info.iFeatureStatic
+ elseif @#methodsIsAbstract[i]: @#info.iFeatureAbstract
+ else: @#info.iFeature
+ fi
+ enddef;
+
+ @#info.iMethodStack.childStyleSupplier := "metauml_private_methodStyleSupplier";
+
+ EPictureStack.@#methodStack(@#info.iMethodStack)
+ (scantokens listArray(@#methods)(@#nMethods))("vleftbase");
+
+ if @#info.featureVisibilityMode = "individual":
+ vardef joinCallbackMethodsVisibility@#=
+ setObjectJoin(pb.bottom = @#.methodStack.pict[index].bottom; pb.midx = pa.midx);
+ setObjectJoinFirst(pa.bottom = @#.methodStack.pict[index].bottom);
+ enddef;
+
+ EPictureStack.@#methodVisibilityStack(@#info.iMethodVisibilityStack)
+ (scantokens listArray(@#methodsVisibility)(@#nMethods))
+ ("joinCallbackMethodsVisibility." & (str @#));
+ elseif @#info.featureVisibilityMode = "none":
+ EPicture.@#methodVisibilityStack(iPictNoMargins)("");
+ else:
+ show "Unknown feature visibility mode", @#featureVisibilityMode;
+ 1=2;
+ fi;
+
+ % Integrate components
+ show layoutObjects(@#attributeStack, @#methodStack);
+ layoutObjects(@#attributeStack, @#methodStack);
+
+ @#attributeStack.left = @#methodStack.left;
+ @#methodStack.top = @#attributeStack.bottom;
+
+ layoutObjects(@#attributeVisibilityStack, @#methodVisibilityStack);
+
+ @#attributeVisibilityStack.midx = @#methodVisibilityStack.midx;
+
+ if (@#.nMethods = 0) or (@#info.featureVisibilityMode="none"):
+ @#methodVisibilityStack.top = @#methodStack.top;
+ fi;
+ if (@#.nAttrs = 0) or (@#info.featureVisibilityMode="none"):
+ @#attributeVisibilityStack.top = @#attributeStack.top;
+ fi;
+
+ EGroup.@#visibilityStacks(iGroupNoMargins)(@#attributeVisibilityStack, @#methodVisibilityStack);
+
+ EGroup.@#featureStacks(iGroupNoMargins)(@#attributeStack, @#methodStack);
+
+ layoutObjects(@#visibilityStacks, @#featureStacks);
+
+ @#visibilityStacks.right = @#featureStacks.left;
+
+ EGroup.@#featureGroup(iGroupNoMargins)(@#visibilityStacks, @#featureStacks);
+
+ topToBottom(0)(@#stereotypeStack, @#namePict, @#featureGroup);
+
+ EGroup.@#all(iGroupNoMargins)(@#stereotypeStack, @#namePict, @#featureGroup);
+
+ layoutObjects(@#all);
+
+ @#.nw = @#all.nw;
+ @#.se = @#all.se;
+
+ log "Class layout for " & (str @#) & " done...";
+ fi;
+enddef;
+
+vardef Class_paintSkin@# =
+ log "Painting class skin...";
+ nameAttributeY := @#attributeStack.top;
+ attributeMethodY := @#methodStack.top;
+
+ drawObjectShade(@#);
+
+ fill Class_border.@# withcolor @#info.foreColor;
+ draw Class_border.@# withcolor @#info.borderColor;
+
+ draw (xpart @#nw, nameAttributeY)--(xpart @#se, nameAttributeY) withcolor @#info.borderColor;
+ draw (xpart @#nw, attributeMethodY)--(xpart @#se, attributeMethodY) withcolor @#info.borderColor;
+enddef;
+
+vardef Class_draw@#=
+ log "Class_draw begin " & @#;
+ Class_layout.@#;
+ objectEnsurePositioning.@#;
+ Class_paintSkin.@#;
+
+ drawObjects(@#all);
+ log "Class_draw end " & @#;
+enddef;
+
+vardef Class_setDebugMode@#=
+ @#.info.iName.boxed := 1;
+
+ @#.info.iFeature.boxed := 1;
+ @#.info.iFeatureStatic.boxed := 1;
+ @#.info.iFeatureAbstract.boxed := 1;
+
+ @#.info.iStereotypeStack.boxed := 1;
+ @#.info.iStereotypeStack.iPict.boxed := 1;
+ @#.info.iAttributeStack.boxed := 1;
+ @#.info.iAttributeStack.iPict.boxed := 1;
+ @#.info.iMethodStack.boxed := 1;
+ @#.info.iMethodStack.iPict.boxed := 1;
+
+ @#.info.iAttributeVisibilityStack.boxed := 1;
+ @#.info.iAttributeVisibilityStack.iPict.boxed := 1;
+ @#.info.iMethodVisibilityStack.boxed := 1;
+ @#.info.iMethodVisibilityStack.iPict.boxed := 1;
+enddef;
+
+vardef Class_stereotypes@#(text _stereotypes)=
+ for stereotype = _stereotypes:
+ @#stereotypes[@#nStereotypes] := stereotype;
+ @#nStereotypes := @#nStereotypes + 1;
+ endfor;
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_assoc.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_assoc.mp
new file mode 100644
index 0000000000..720117fc90
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_assoc.mp
@@ -0,0 +1,93 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_class_assoc_mp:
+ expandafter endinput
+fi;
+_metauml_class_assoc_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+inputonce metauml_defaults;
+
+FontInfo.assocFont(metauml_defaultFont, .7);
+PictureInfo.iAssoc(2, 2, 2, 2)(assocFont);
+iAssoc.ignoreNegativeBase := 1;
+
+vardef QualifiedAssociationInfo@#=
+ color @#background;
+ color @#borderColor;
+ numeric @#borderScale;
+
+ @#background := .9white;
+ @#borderColor := black;
+ @#borderScale := .5;
+
+ FontInfo.@#iFont(metauml_defaultFont, .9);
+ PictureInfo.@#iPict(2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iStack(2, 2, 1, 1)(7)(@#iPict);
+
+ @#iStack.iPict.ignoreNegativeBase := 1;
+enddef;
+
+vardef QualifiedAssociationInfoCopy@#(text src)=
+ color @#background;
+ color @#borderColor;
+ numeric @#borderScale;
+
+ @#background := src.background;
+ @#borderColor := src.borderColor;
+ @#borderScale := src.borderScale;
+
+ FontInfoCopy.@#iFont(src.iFont);
+ PictureInfoCopy.@#iPict(src.iPict);
+ PictureStackInfoCopy.@#iStack(src.iStack);
+enddef;
+
+QualifiedAssociationInfo.iQualifiedAssociation;
+
+%
+% QualifiedAssociation
+%
+vardef EQualifiedAssociation@#(text _info)(text qualifiedAssociations) =
+ ObjectEquations(@#);
+ @#className := "QualifiedAssociation";
+
+ QualifiedAssociationInfoCopy.@#info(_info);
+
+ EPictureStack.@#elementsStack(@#info.iStack)(qualifiedAssociations)("vleftbase");
+
+ @#nw = @#elementsStack.nw;
+ @#se = @#elementsStack.se;
+enddef;
+
+vardef QualifiedAssociation@#(text qualifiedAssociations)=
+ EQualifiedAssociation@#(iQualifiedAssociation)(qualifiedAssociations);
+enddef;
+
+vardef QualifiedAssociation_paintSkin@# =
+ log "Painting qualifiedAssociation skin...";
+
+ fill objectBox(@#) withcolor @#info.background;
+
+ draw objectBox(@#)
+ withpen pencircle scaled @#info.borderScale withcolor @#info.borderColor;
+enddef;
+
+vardef QualifiedAssociation_draw@# =
+ PictureStack_layout.@#elementsStack;
+
+ QualifiedAssociation_paintSkin.@#;
+ drawObject(@#elementsStack);
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_relations.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_relations.mp
new file mode 100644
index 0000000000..0379aceeca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_class_relations.mp
@@ -0,0 +1,172 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_class_relations_mp:
+ expandafter endinput
+fi;
+_metauml_class_relations_mp:=1;
+
+defaultRelationHeadWidth := 25;
+defaultRelationHeadHeight := 10;
+
+vardef AssociationInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = 0;
+ @#heightB = 0;
+ @#drawMethodB = "drawNothing";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef AssociationUniInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawArrow";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef InheritanceInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawTriangle";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef AggregationInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawDiamond";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef AggregationUniInfo@# =
+ LinkInfo@#;
+
+ @#widthA = defaultRelationHeadWidth;
+ @#heightA = defaultRelationHeadHeight;
+ @#drawMethodA = "drawArrow";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawDiamond";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef CompositionInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawDiamondBlack";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef CompositionUniInfo@# =
+ LinkInfo@#;
+
+ @#widthA = defaultRelationHeadWidth;
+ @#heightA = defaultRelationHeadHeight;
+ @#drawMethodA = "drawArrow";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawDiamondBlack";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef DashedLinkInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = 0;
+ @#heightB = 0;
+ @#drawMethodB = "drawNothing";
+
+ @#drawMethod = "drawLineDashed";
+enddef;
+
+vardef DependencyInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawArrow";
+
+ @#drawMethod = "drawLineDashed";
+enddef;
+
+vardef RealizationInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawTriangle";
+
+ @#drawMethod = "drawLineDashed";
+enddef;
+
+AssociationInfo.association;
+AssociationUniInfo.associationUni;
+InheritanceInfo.inheritance;
+AggregationInfo.aggregation;
+AggregationUniInfo.aggregationUni;
+CompositionInfo.composition;
+CompositionUniInfo.compositionUni;
+DashedLinkInfo.dashedLink;
+DependencyInfo.dependency;
+RealizationInfo.realization;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Deprecated, kept to support code using the older API.
+% Using the generic formulation involving link, e.g.
+% link(association)(A.n--B.s) is preferable.
+% link and clink are defined in metauml_links
+%
+vardef drawRelation(text iLink)(expr myPath)=
+ link(iLink)(myPath);
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_component.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_component.mp
new file mode 100644
index 0000000000..c124f77110
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_component.mp
@@ -0,0 +1,186 @@
+% Copyright 2006 2015 Radu-George Radulescu, Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_component_mp:
+ expandafter endinput
+fi;
+_metauml_component_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef ComponentInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) minimumNameContentsDifference;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iText (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iNameStack (2, 2, 2, 2)(9)(@#iText);
+ @#iNameStack.iPict.ignoreNegativeBase := 1;
+
+ Margins.@#(2,2,2,2);
+
+ ShadeInfo.@#iShade;
+ @#foreColor := .9white;
+ @#borderColor := black;
+
+ @#minimumNameContentsDifference := 20;
+
+ GroupInfo.@#iContentsGroup(2, 2, 10, 2);
+enddef;
+
+vardef ComponentInfoCopy@#(text src)=
+ log "ComponentInfoCopy: Copying component info";
+
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) minimumNameContentsDifference;
+
+ PictureStackInfoCopy.@#iNameStack (src.iNameStack);
+ MarginsCopy.@#(src);
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+
+ @#minimumNameContentsDifference := src.minimumNameContentsDifference;
+
+ GroupInfoCopy.@#iContentsGroup(src.iContentsGroup);
+enddef;
+
+ComponentInfo.iComponent;
+
+vardef Component@#(text contents)(text _subItems)=
+ EComponent.@#(iComponent)(contents)(_subItems);
+enddef;
+
+vardef EComponent@#(text _info)(text contents)(text _subItems)=
+ ObjectEquations(@#);
+ @#className := "Component";
+
+ ComponentInfoCopy.@#info(_info);
+
+ numeric @#nLines; @#nLines := 0;
+ string @#lines[];
+ numeric @#nSubItems; @#nSubItems := 0;
+
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+
+ for s=_subItems:
+ @#nSubItems := @#nSubItems + 1;
+ endfor;
+
+ EGroup.@#subItems(@#info.iContentsGroup)(_subItems);
+
+ EPictureStack.@#nameStack(@#info.iNameStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+enddef;
+
+vardef Component_layout@#=
+ if @#laidout = 1:
+ log "Component '" & (str @#) & "' has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Component layout: '" & (str @#) & "'";
+
+ log "Component name layout '" & (str @#) & "'...";
+ PictureStack_layout.@#nameStack;
+ log "SubItems for component layout '" & (str @#) & "'...";
+ Group_layout.@#subItems;
+
+ log "All elements in component '" & (str @#) & "' successfully layed out, integrating...";
+
+
+ if @#subItems.width < @#nameStack.width + @#info.minimumNameContentsDifference:
+ @#contentWidth = @#nameStack.width + @#info.minimumNameContentsDifference;
+ else:
+ @#contentWidth = lmax(@#nameStack.width, @#subItems.width);
+ fi;
+
+ @#width = @#contentWidth + @#info.left + @#info.right + 15;
+
+ if @#nSubItems = 0:
+ @#height = @#info.top + @#info.bottom + @#subItems.height + 15;
+ @#nameStack.n = @#n - (0, 7);
+ else:
+ @#height = @#info.top + @#info.bottom + @#subItems.height + 30;
+ @#nameStack.n = @#n + (0, @#info.top) - (0, 5);
+ fi;
+
+ @#subItems.n = @#n + (0, -((@#height - @#subItems.height)/2)) - (0, 5);
+
+ log "Component layout for " & (str @#) & " ended.";
+ fi;
+enddef;
+
+vardef Component_draw@#=
+ Component_layout.@#;
+ objectEnsurePositioning.@#;
+
+ attributes(@#);
+ var(path) border;
+
+ @#border := @#ne -- @#nw -- @#sw -- @#se -- cycle;
+
+ drawObjectShade(@#);
+
+ fill @#border withcolor @#info.foreColor;
+ draw @#border withcolor @#info.borderColor;
+
+ drawComponentVisualStereotype(@#ne);
+
+ drawObject(@#nameStack);
+ drawObject(@#subItems);
+
+enddef;
+
+vardef drawComponentVisualStereotype(text ne)=
+ % lud = left-up-down of the top-right rectangle; luu = left-up-up of the top-right rectangle etc.
+ pair lud, luu, ru, rd, ldd, ldu, lmd, lmu;
+ % urectld = upper rectangle left-down, lrectru = lower rectangle right-up
+ pair urectld, urectlu, urectru, urectrd, lrectld, lrectlu, lrectru, lrectrd;
+ lud = ne - (14, 5 );
+ luu = lud + (0, 2 );
+ ru = luu + (8, 0 );
+ rd = ru - (0, 14);
+ ldd = rd - (8, 0 );
+ ldu = ldd + (0, 2 );
+ lmd = ldu + (0, 3 );
+ lmu = lud - (0, 3 );
+
+ urectld = lmu - (3, 0);
+ urectlu = lud - (3, 0);
+ urectru = lud + (3, 0);
+ urectrd = lmu + (3, 0);
+
+ lrectld = ldu - (3, 0);
+ lrectlu = lmd - (3, 0);
+ lrectru = lmd + (3, 0);
+ lrectrd = ldu + (3, 0);
+
+ draw lud -- luu -- ru -- rd -- ldd -- ldu;
+ draw lmd -- lmu;
+ draw urectld -- urectlu -- urectru -- urectrd -- urectld;
+ draw lrectld -- lrectlu -- lrectru -- lrectrd -- lrectld;
+enddef;
+
+vardef Component_border@#=
+ @#border
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_component_relations.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_component_relations.mp
new file mode 100644
index 0000000000..e6800a2acb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_component_relations.mp
@@ -0,0 +1,55 @@
+% Copyright 2006 2015 Radu-George Radulescu, Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_component_relations_mp:
+ expandafter endinput
+fi;
+_metauml_component_relations_mp:=1;
+
+defaultRelationHeadWidth := 25;
+defaultRelationHeadHeight := 10;
+requiredInterfaceHeadWidth := 5;
+requiredInterfaceHeadHeight := 15;
+
+vardef requiredInterfaceInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = requiredInterfaceHeadWidth;
+ @#heightB = requiredInterfaceHeadHeight;
+ @#drawMethodB = "drawSemiCircle";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+vardef providedInterfaceInfo@# =
+ LinkInfo@#;
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawCircle";
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+requiredInterfaceInfo.requiredInterface;
+providedInterfaceInfo.providedInterface;
+
+vardef drawRelation(text iLink)(expr myPath)=
+ link(iLink)(myPath);
+enddef;
+
+vardef drawLine(expr my_path) =
+ draw my_path;
+enddef;
+
+vardef drawNothing(text pA)(text pB)(text base) =
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_defaults.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_defaults.mp
new file mode 100644
index 0000000000..228df4c48c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_defaults.mp
@@ -0,0 +1,31 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_defaults_mp:
+ expandafter endinput
+fi;
+_metauml_defaults_mp:=1;
+
+% txbtt
+
+if not known metauml_defaultFont:
+ string metauml_defaultFont;
+ metauml_defaultFont := "ptmr8r";
+fi;
+
+if not known metauml_defaultFontOblique:
+ string metauml_defaultFontOblique;
+ metauml_defaultFontOblique := "ptmro8r";
+fi;
+
+if not known metauml_defaultFontBold:
+ string metauml_defaultFontBold;
+ metauml_defaultFontBold := "ptmb8r";
+fi;
+
+if not known metauml_defaultFontBoldOblique:
+ string metauml_defaultFontBoldOblique;
+ metauml_defaultFontBoldOblique := "ptmbo8r";
+fi;
+
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_instance.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_instance.mp
new file mode 100644
index 0000000000..543920eb49
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_instance.mp
@@ -0,0 +1,186 @@
+% Copyright 2005 2015 Radu-George Radulescu
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_instance_mp:
+ expandafter endinput
+fi;
+_metauml_instance_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+inputonce util_picture;
+inputonce util_picture_stack;
+inputonce util_shade;
+
+vardef InstanceInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ FontInfo.@#nameFont(metauml_defaultFont, defaultscale);
+
+ FontInfo.@#attributeFont(metauml_defaultFont, defaultscale);
+
+ ShadeInfo.@#iShade;
+
+ @#foreColor := .9white;
+ @#borderColor := black;
+
+ PictureInfo.@#iName (2, 2, 1, 3)(@#nameFont);
+
+ PictureInfo.@#iAttribute (2, 2, 1.25, 0)(@#attributeFont);
+
+ PictureStackInfo.@#iAttributeStack (2, 2, 2.5, 2)(10.5)(@#iAttribute); % 8.5
+ @#iAttributeStack.iPict.bottom := 2;
+
+ @#iName.ignoreNegativeBase := 1;
+ @#iAttributeStack.iPict.ignoreNegativeBase := 1;
+enddef;
+
+vardef InstanceInfoCopy@#(text src)=
+ log "InstanceInfoCopy: Copying Instance";
+
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ FontInfoCopy.@#nameFont(src.nameFont);
+
+ FontInfoCopy.@#attributeFont(src.attributeFont);
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+
+ PictureInfoCopy.@#iName (src.iName);
+
+ PictureInfoCopy.@#iAttribute (src.iAttribute);
+ PictureStackInfoCopy.@#iAttributeStack (src.iAttributeStack);
+
+enddef;
+
+InstanceInfo.iInstance;
+
+%
+% Instance
+%
+vardef defInstance@#(expr pname) =
+ ObjectEquations(@#);
+ @#className := "Instance";
+
+ string @#name;
+ @#name = pname;
+
+ string @#attributes[];
+ numeric @#nAttrs;
+ @#nAttrs := 0;
+enddef;
+
+vardef Instance_addAttribute@#(expr pcontent) =
+
+ @#.attributes[@#.nAttrs] := pcontent;
+ @#.nAttrs := @#.nAttrs + 1;
+
+enddef;
+
+vardef EInstance@#(text _info)(expr name)(text attributes)=
+ log "EInstance begin";
+ defInstance@#(name);
+
+ log "Copying Instance info";
+ InstanceInfoCopy.@#info(_info);
+
+ for a = attributes:
+ log "Adding attribute ", a;
+ Instance_addAttribute@#(a);
+ endfor;
+enddef;
+
+vardef Instance@#(expr name)(text attributes)=
+ EInstance@#(iInstance)(name)(attributes);
+enddef;
+
+vardef Instance_border@#=
+ objectBox(@#)
+enddef;
+
+vardef Instance_layout@# =
+ if @#laidout = 1:
+ log "Instance " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Instance layout: " & (str @#);
+
+ @#maxFeatureWidth := 0;
+
+ EPicture.@#namePict(@#info.iName)(@#name);
+ EPictureStack.@#attributeStack(@#info.iAttributeStack)
+ (scantokens listArray(@#attributes)(@#nAttrs))("vleftbase");
+
+ layoutObjects(@#namePict, @#attributeStack);
+
+ @#maxFeatureWidth := lmax(@#namePict.width, @#attributeStack.width) + 1;
+
+ @#namePict.midx = @#midx;
+
+ @#namePict.top = @#top - 1;
+ @#attributeStack.top = @#namePict.bottom - 1;
+
+ @#attributeStack.left = @#left;
+
+ @#width = @#maxFeatureWidth;
+ @#bottom = @#attributeStack.bottom;
+
+ log "Layout done...";
+ fi;
+enddef;
+
+vardef Instance_drawFeatures@#=
+ log "Drawing name";
+ drawObject(@#namePict);
+ log "Underlining name";
+ pair A, B;
+ A := @#namePict.se + (-@#namePict.info.left, @#namePict.info.bottom-1);
+ B := @#namePict.sw + (@#namePict.info.right, @#namePict.info.bottom-1);
+ draw A--B;
+ log "Drawing attribute stack";
+ drawObject(@#attributeStack);
+
+enddef;
+
+vardef Instance_paintSkin@# =
+ log "Painting Instance skin...";
+
+ drawObjectShade(@#);
+
+ fill Instance_border.@# withcolor @#info.foreColor;
+ draw Instance_border.@# withcolor @#info.borderColor;
+
+ draw (xpart @#nw, @#attributeStack.top)--(xpart @#se, @#attributeStack.top) withcolor @#info.borderColor;
+enddef;
+
+vardef Instance_draw@#=
+ log "draw Instance begin...";
+ Instance_layout.@#;
+ objectEnsurePositioning.@#;
+ Instance_paintSkin.@#;
+ Instance_drawFeatures.@#;
+enddef;
+
+vardef Instance_setDebugMode@#=
+ @#.info.iName.boxed := 1;
+ @#.info.iAttributeStack.boxed := 1;
+ @#.info.iAttributeStack.iPict.boxed := 1;
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_links.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_links.mp
new file mode 100644
index 0000000000..06a9dbabba
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_links.mp
@@ -0,0 +1,86 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+% A LinkStructure is used to compute the relevant elements
+% of a link, such as what is the main path of the link and
+% where the link ends are to be drawn.
+%
+% For example, for a unidirectional aggregation between points
+% A and B one must reserve some space for one diamond to the left and one arrow
+% to the right, and draw the continous line on a segment shorter than AB.
+%
+
+if known _metauml_links_mp:
+ expandafter endinput
+fi;
+_metauml_links_mp:=1;
+
+vardef LinkStructure@#(expr my_path, widthA, widthB) =
+ pair @#pointA, @#pointB, @#pointAc, @#pointBc;
+ path @#circleA, @#circleB;
+ numeric @#timeA, @#timeB;
+ path @#actualPath;
+
+ @#pointA = point 0 of my_path;
+ @#pointB = point infinity of my_path;
+
+ @#circleA = fullcircle scaled widthA shifted @#pointA;
+ @#circleB = fullcircle scaled widthB shifted @#pointB;
+
+ @#timeA = xpart (my_path intersectiontimes @#circleA);
+ @#timeB = xpart (my_path intersectiontimes @#circleB);
+ @#pointAc = point @#timeA of my_path;
+ @#pointBc = point @#timeB of my_path;
+
+ @#actualPath = subpath (@#timeA, @#timeB) of my_path;
+enddef;
+
+% Used for visual debugging purposes
+%
+vardef describeLinkStructure(text linkStruct)=
+ %draw linkStruct.pointA -- linkStruct.pointB withpen pencircle scaled 2 withcolor green;
+
+ draw linkStruct.circleA;
+ draw linkStruct.circleB;
+
+ dotlabel.lft("A", linkStruct.pointA);
+ dotlabel.rt ("B", linkStruct.pointB);
+
+ dotlabel.urt("A1", linkStruct.pointAc);
+ dotlabel.ulft("B1", linkStruct.pointBc);
+
+ draw linkStruct.actualPath withcolor red;
+enddef;
+
+% Draws the path using graphical elements specified by iLink
+% using the landmark points computed in the LinkStructure
+% linkStruct.
+%
+vardef drawLinkStructure(text linkStruct)(text iLink) =
+ scantokens(iLink.drawMethod)(linkStruct.actualPath);
+
+ scantokens(iLink.drawMethodA)(linkStruct.pointAc)(linkStruct.pointA)(iLink.heightA);
+ scantokens(iLink.drawMethodB)(linkStruct.pointBc)(linkStruct.pointB)(iLink.heightB);
+enddef;
+
+vardef LinkInfo@# =
+ numeric @#widthA, @#heightA;
+ string @#drawMethodA;
+
+ numeric @#widthB, @#heightB;
+ string @#drawMethodB;
+
+ string @#drawMethod;
+enddef;
+
+% Draws a link using the given path as support.
+%
+vardef link(text iLink)(expr myPath)=
+ LinkStructure.ls(myPath, iLink.widthA, iLink.widthB);
+ drawLinkStructure(ls)(iLink);
+enddef;
+
+% Draws a direct link between the center of the objects.
+vardef clink(text iLink)(suffix objectA, objectB)=
+ link(iLink)(pathCut(objectA, objectB)(objectA.c--objectB.c));
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_note.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_note.mp
new file mode 100644
index 0000000000..083b686f65
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_note.mp
@@ -0,0 +1,140 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_note_mp:
+ expandafter endinput
+fi;
+_metauml_note_mp:=1;
+
+% def metauml_note_debug text txt=log txt enddef;
+def metauml_note_debug text txt= enddef;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+inputonce util_object;
+inputonce util_picture_stack;
+inputonce util_shade;
+inputonce util_margins;
+
+vardef NoteInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) horizontalFolding, verticalFolding;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iText (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iStack (0, 0, 0, 0)(9)(@#iText);
+
+ @#iStack.iPict.ignoreNegativeBase := 1;
+
+ ShadeInfo.@#iShade;
+ Margins.@#(2,2,2,2);
+
+ @#foreColor := .9white;
+ @#borderColor := black;
+ @#horizontalFolding := 10;
+ @#verticalFolding := 10;
+enddef;
+
+vardef NoteInfoCopy@#(text src)=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ log "NoteInfoCopy: Copying usecase info";
+
+ PictureStackInfoCopy.@#iStack (src.iStack);
+ MarginsCopy.@#(src);
+ ShadeInfoCopy.@#iShade(src.iShade);
+
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+ @#horizontalFolding := src.horizontalFolding;
+ @#verticalFolding := src.verticalFolding;
+enddef;
+
+NoteInfo.iNote;
+
+vardef Note@#(text contents)=
+ ENote.@#(iNote)(contents);
+enddef;
+
+vardef ENote@#(text _info)(text contents)=
+ ObjectEquations(@#);
+ @#className := "Note";
+
+ NoteInfoCopy.@#info(_info);
+
+ %% The following code cannot work when pictures are given in the contents argument, such as in:
+ %% ENote.myNote(iNote)("This is a formula", TEX("$a=b$"));
+ %%
+ %numeric @#nLines; @#nLines := 0;
+ %string @#lines[];
+ %for l=contents:
+ % @#lines[@#nLines] := l;
+ % @#nLines := @#nLines + 1;
+ %endfor;
+ %
+ %EPictureStack.@#stack(@#info.iStack)(scantokens listArray(@#lines)(@#nLines))("vleftbase");
+
+ EPictureStack.@#stack(@#info.iStack)(contents)("vleftbase");
+enddef;
+
+vardef Note_layout@#=
+ if @#laidout = 1:
+ log "Note " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Note layout: " & (str @#);
+
+ PictureStack_layout.@#stack;
+
+ @#width = @#stack.width + @#info.left + @#info.right + @#info.horizontalFolding;
+ @#height = @#stack.height + @#info.top + @#info.bottom;
+
+ @#top = @#stack.top + @#info.top;
+ @#left = @#stack.left - @#info.left;
+ fi;
+enddef;
+
+vardef Note_draw@#=
+ Note_layout@#;
+ objectEnsurePositioning.@#;
+
+ attributes(@#);
+ var(path) border, corner;
+
+ @#border := @#nw -- (@#ne - (@#info.horizontalFolding, 0)) --
+ (@#ne - (0, @#info.verticalFolding) ) -- @#se -- @#sw -- cycle;
+
+ @#corner := (@#ne - (@#info.horizontalFolding, 0)) --
+ (@#ne - (@#info.horizontalFolding, @#info.verticalFolding)) --
+ (@#ne - (0, @#info.verticalFolding));
+
+ drawObjectShade(@#);
+
+ fill Note_border.@# withcolor @#info.foreColor;
+ draw Note_border.@# withcolor @#info.borderColor;
+
+ draw @#corner withcolor @#info.borderColor;
+ drawObject(@#stack);
+enddef;
+
+vardef Note_border@#=
+ @#border
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_package.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_package.mp
new file mode 100644
index 0000000000..2e76c41fd1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_package.mp
@@ -0,0 +1,176 @@
+% Copyright 2006 2015 Radu-George Radulescu, Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_package_mp:
+ expandafter endinput
+fi;
+_metauml_package_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef PackageInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) forceEmptyContent;
+ var(numeric) minimumNameContentsDifference;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iText (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iNameStack (2, 2, 2, 2)(9)(@#iText);
+ @#iNameStack.iPict.ignoreNegativeBase := 1;
+
+ Margins.@#(2,2,2,2);
+
+ ShadeInfo.@#iShade;
+ @#foreColor := .9white;
+ @#borderColor := black;
+
+ @#forceEmptyContent := 0;
+
+ @#minimumNameContentsDifference := 20;
+
+ GroupInfo.@#iContentsGroup(2, 2, 10, 2);
+enddef;
+
+vardef PackageInfoCopy@#(text src)=
+ log "PackageInfoCopy: Copying package info";
+
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) forceEmptyContent;
+ var(numeric) minimumNameContentsDifference;
+
+ PictureStackInfoCopy.@#iNameStack (src.iNameStack);
+ MarginsCopy.@#(src);
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+
+ @#forceEmptyContent := src.forceEmptyContent;
+
+ @#minimumNameContentsDifference := src.minimumNameContentsDifference;
+
+ GroupInfoCopy.@#iContentsGroup(src.iContentsGroup);
+enddef;
+
+PackageInfo.iPackage;
+
+vardef Package@#(text contents)(text _subItems)=
+ EPackage.@#(iPackage)(contents)(_subItems);
+enddef;
+
+vardef EPackage@#(text _info)(text contents)(text _subItems)=
+ ObjectEquations(@#);
+ @#className := "Package";
+
+ PackageInfoCopy.@#info(_info);
+
+ numeric @#nLines; @#nLines := 0;
+ string @#lines[];
+% numeric @#nSubItems; @#nSubItems := 0;
+ numeric @#nameInCenter; @#nameInCenter := 0;
+
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+
+% for s=_subItems:
+% @#nSubItems := @#nSubItems + 1;
+% endfor;
+
+ EGroup.@#subItems(@#info.iContentsGroup)(_subItems);
+
+ EPictureStack.@#nameStack(@#info.iNameStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+enddef;
+
+vardef Package_layout@#=
+ if @#laidout = 1:
+ log "Package '" & (str @#) & "' has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Package layout: '" & (str @#) & "'";
+
+ log "Package name layout '" & (str @#) & "'...";
+ PictureStack_layout.@#nameStack;
+ log "SubItems for package layout '" & (str @#) & "'...";
+ Group_layout.@#subItems;
+
+ log "All elements in package '" & (str @#) & "' successfully layed out, integrating...";
+
+ if @#subItems.nObjects = 0:
+ if @#info.forceEmptyContent = 0:
+ @#nameInCenter := 1;
+ fi;
+ fi;
+
+ if @#subItems.width < @#nameStack.width + @#info.minimumNameContentsDifference:
+ @#contentWidth = @#nameStack.width + @#info.minimumNameContentsDifference;
+ else:
+ @#contentWidth = lmax(@#nameStack.width, @#subItems.width);
+ fi;
+
+ if @#nameInCenter = 1:
+ @#height = @#info.top + @#info.bottom + @#nameStack.height;
+ @#width = @#info.left + @#info.right + @#nameStack.width;
+ @#nameStack.sw = @#sw + (@#info.left, @#info.bottom);
+ else:
+ @#nameStack.sw = @#nw;
+ @#width = @#contentWidth + @#info.left + @#info.right;
+ @#height = @#info.top + @#info.bottom + @#subItems.height;
+ fi;
+
+ @#subItems.n = @#n + (0, -((@#height - @#subItems.height)/2));
+
+ log "Package layout for " & (str @#) & " ended.";
+ fi;
+enddef;
+
+vardef Package_draw@#=
+ Package_layout.@#;
+ objectEnsurePositioning.@#;
+
+ attributes(@#);
+ var(path) border, nameStackBorder, emptyNameBorder;
+
+ @#border := @#ne -- @#nw -- @#sw -- @#se -- cycle;
+ @#nameStackBorder := @#nameStack.ne -- @#nameStack.nw -- @#nameStack.sw -- @#nameStack.se -- cycle;
+ @#emptyNameBorder := @#nw -- @#nw + (0, 10) -- @#n + (0, 10) -- @#n -- cycle;
+
+ drawObjectShade(@#);
+
+ fill @#border withcolor @#info.foreColor;
+ draw @#border withcolor @#info.borderColor;
+ if @#nameInCenter = 0:
+ fill @#nameStackBorder withcolor @#info.foreColor;
+ draw @#nameStackBorder withcolor @#info.borderColor;
+ else:
+ fill @#emptyNameBorder withcolor @#info.foreColor;
+ draw @#emptyNameBorder withcolor @#info.borderColor;
+ fi;
+
+
+ drawObject(@#nameStack);
+ drawObject(@#subItems);
+
+enddef;
+
+vardef Package_border@#=
+ @#border
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_package_relations.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_package_relations.mp
new file mode 100644
index 0000000000..87f1cc4dd1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_package_relations.mp
@@ -0,0 +1,37 @@
+% Copyright 2006 2015 Radu-George Radulescu
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_package_relations_mp:
+ expandafter endinput
+fi;
+_metauml_package_relations_mp:=1;
+
+defaultRelationHeadWidth := 25;
+defaultRelationHeadHeight := 10;
+
+vardef NestInfo@# =
+ LinkInfo@#;
+
+ @#widthA = 0;
+ @#heightA = 0;
+ @#drawMethodA = "drawNothing";
+
+ @#widthB = defaultRelationHeadWidth;
+ @#heightB = defaultRelationHeadHeight;
+ @#drawMethodB = "drawCrossedCircle";
+
+ @#drawMethod = "drawLine";
+enddef;
+
+NestInfo.nest;
+
+vardef drawRelation(text iLink)(expr myPath)=
+ link(iLink)(myPath);
+enddef;
+
+vardef drawLine(expr my_path) =
+ draw my_path;
+enddef;
+
+vardef drawNothing(text pA)(text pB)(text base) =
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_paths.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_paths.mp
new file mode 100644
index 0000000000..d93832fd0f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_paths.mp
@@ -0,0 +1,173 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_paths_mp:
+ expandafter endinput
+fi;
+_metauml_paths_mp:=1;
+
+def pathDirect(expr pA,pB) =
+ pA--pB
+enddef;
+
+vardef pathManhattanX(text twoParams) =
+ pair pointA__, pointB__;
+ string paramA_str__, paramB_str__;
+ boolean paramA_isObject__, paramB_isObject__;
+
+ paramA_isObject__ := true;
+ paramB_isObject__ := true;
+
+ boolean isFirstParam__;
+ isFirstParam__ := true;
+
+ %string twoParams;
+ %twoParams := "";
+
+ %twoParams := str paramA & ", " & str paramB;
+ %%includeonce% show "the two params are: " & twoParams;
+
+ forsuffixes param__ = twoParams:
+
+ if isFirstParam__:
+ isFirstParam__ := false;
+ paramA_str__ := str param__;
+ %includeonce% show "paramA_str__ <-- " & paramA_str__;
+
+ if not known (scantokens (paramA_str__ & ".className")):
+ %includeonce% show "paramA is not an object";
+ paramA_isObject__ := false;
+ fi;
+ else:
+ paramB_str__ := str param__;
+ %includeonce% show "paramB_str__ <-- " & paramB_str__;
+
+ if not known (scantokens (paramB_str__ & ".className")):
+ %includeonce% show "paramB is not an object";
+ paramB_isObject__ := false;
+ fi;
+ fi;
+ endfor;
+
+ %includeonce% show paramA_str__;
+ %includeonce% show paramA_isObject__;
+
+ %includeonce% show paramB_str__;
+ %includeonce% show paramB_isObject__;
+
+ string stringPath__;
+ stringPath__ := "(0,0)--(50,50)";
+
+ if (not paramA_isObject__) and (not paramB_isObject__):
+ %includeonce% show "Both are points!";
+
+
+ stringPath__ := paramA_str__ & "--(xpart " & paramB_str__ & ", ypart " & paramA_str__ & ") -- " & paramB_str__;
+ %includeonce% show stringPath__;
+ else:
+ pair refPointA__, refPointB__;
+ if paramA_isObject__:
+ refPointA__ := scantokens (paramA_str__ & ".c");
+ else:
+ refPointA__ := scantokens paramA_str__;
+ fi;
+ if paramB_isObject__:
+ refPointB__ := scantokens (paramB_str__ & ".c");
+ else:
+ refPointB__ := scantokens paramB_str__;
+ fi;
+
+ %includeonce% show "Reference point A: ";
+ %includeonce% show refPointA__;
+ %includeonce% show "Reference point B: ";
+ %includeonce% show refPointB__;
+
+ numeric dx__, dy__;
+ dx__ := xpart refPointB__ - xpart refPointA__;
+ dy__ := ypart refPointB__ - ypart refPointA__;
+
+ string addornmentA__;
+ addornmentA__ := "";
+ string addornmentB__;
+ addornmentB__ := "";
+
+ if (paramA_isObject__):
+ if (dx__ > 0):
+ addornmentA__ := ".e";
+ else:
+ addornmentA__ := ".w";
+ fi;
+ fi;
+
+ if (paramB_isObject__):
+ if (dy__ > 0):
+ addornmentB__ := ".s";
+ else:
+ addornmentB__ := ".n";
+ fi;
+ fi;
+ stringPath__ := "pathManhattanX(" & paramA_str__ & addornmentA__ & ", " & paramB_str__ & addornmentB__ & ")";
+
+ %includeonce% show stringPath;
+ %includeonce% show "-------------------> recursive call";
+ fi;
+
+ scantokens stringPath__
+enddef;
+
+vardef rpathManhattanX(text twoParams) =
+ reverse pathManhattanX(twoParams)
+enddef;
+
+vardef pathManhattanY(expr pA,pB) =
+ pA--(xpart(pA), ypart(pB))--pB
+enddef;
+
+vardef rpathManhattanY(expr pA,pB) =
+ pB--(xpart(pA), ypart(pB))--pA
+enddef;
+
+vardef pathStepX(expr pA,pB, deltax) =
+ pA--(pA+(deltax, 0))--(((xpart pA)+deltax), ypart(pB))--pB
+enddef;
+
+vardef rpathStepX(expr pA,pB, deltax) =
+ pB--(((xpart pA)+deltax), ypart(pB))--(pA+(deltax, 0))--pA
+enddef;
+
+vardef pathStepY(expr pA,pB, deltay) =
+ pA--(pA+(0, deltay))--(xpart(pB), ((ypart pA)+deltay))--pB
+enddef;
+
+vardef rpathStepY(expr pA,pB, deltay) =
+ pB--(xpart(pB), ((ypart pA)+deltay))--(pA+(0, deltay))--pA
+enddef;
+
+vardef pathHorizontal(expr pA, untilX) =
+ pA--(untilX,ypart(pA))
+enddef;
+
+vardef rpathHorizontal(expr pA, untilX) =
+ (untilX,ypart(pA))--pA
+enddef;
+
+vardef pathVertical(expr pA, untilY) =
+ pA--(xpart(pA), untilY)
+enddef;
+
+vardef rpathVertical(expr pA, untilY) =
+ (xpart(pA), untilY)--pA
+enddef;
+
+% Cuts path thePath so that it won't intersect the objects
+% objectA and objectB. The border of the objects is obtained
+% by invoking the method "_border".
+%
+vardef pathCut(suffix objectA, objectB)(expr thePath)=
+ save timeA, timeB;
+
+ timeA = xpart (thePath intersectiontimes objectBorder(objectA));
+ timeB = xpart (thePath intersectiontimes objectBorder(objectB));
+
+ subpath (timeA, timeB) of thePath
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_skin_simple.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_skin_simple.mp
new file mode 100644
index 0000000000..3225eb8fc3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_skin_simple.mp
@@ -0,0 +1,28 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+%% Usage of skins
+%%
+%% Skins are configuration files that, in geneal, customize the settings of
+%% MetaUML *Info objects. You most likely want to include the skin file after
+%% all other MetaUML files have been included:
+%%
+%% input metauml
+%% input metauml_skin_simple
+%%
+%% % normal usage of MetaUML follows here
+%%
+%% More advanced skin files might customize fonts for specific elements
+%% (eg for Class and Note), and also colors (eg foreground, shade, line etc.)
+
+if known _metauml_skin_simple_mp:
+ expandafter endinput
+fi;
+_metauml_skin_simple_mp:=1;
+
+iClass.foreColor := blue;
+iClass.iName.iFont.name := "cmr12";
+iClass.iAttributeStack.iPict.iFont.name := "cmr10";
+iClass.iMethodStack.iPict.iFont.name := "cmr10";
+
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_state.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_state.mp
new file mode 100644
index 0000000000..08b5d3be24
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_state.mp
@@ -0,0 +1,201 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_state_mp:
+ expandafter endinput
+fi;
+_metauml_state_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef StateInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) round;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iText (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iStack (2, 2, 2, 2)(9)(@#iText);
+
+ @#iStack.iPict.ignoreNegativeBase := 1;
+
+ Margins.@#(2,2,0,6);
+
+ GroupInfo.@#iGroupSubstates(2, 2, 4, 2);
+
+ @#round := 5;
+ @#drawNameLine := 0;
+
+ ShadeInfo.@#iShade;
+ @#foreColor := .9white;
+ @#borderColor := black;
+enddef;
+
+vardef StateInfoCopy@#(text src)=
+ log "StateInfoCopy: Copying state info";
+ attributes(@#);
+ var(color) foreColor, borderColor;
+ var(numeric) round;
+
+ PictureStackInfoCopy.@#iStack (src.iStack);
+ MarginsCopy.@#(src);
+ @#round := src.round;
+ @#drawNameLine := src.drawNameLine;
+
+ GroupInfoCopy.@#iGroupSubstates(src.iGroupSubstates);
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+enddef;
+
+StateInfo.iState;
+
+vardef State@#(text contents)(text _substates)=
+ EState.@#(iState)(contents)(_substates);
+enddef;
+
+vardef EState@#(text _info)(text contents)(text _substates)=
+ ObjectEquations(@#);
+ @#className := "State";
+
+ StateInfoCopy.@#info(_info);
+
+ numeric @#nLines; @#nLines := 0;
+ string @#lines[];
+
+ numeric @#nInternalTransitions; @#nInternalTransitions := 0;
+ string @#internalTransitions[];
+
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+
+ EGroup.@#substates(@#info.iGroupSubstates)(_substates);
+ %@#substates.info.boxed := 1;
+
+ EPictureStack.@#stack(@#info.iStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+enddef;
+
+vardef stateTransitions@#(text transitions)=
+ State_internalTransitions@#(transitions);
+enddef;
+
+vardef State_internalTransitions@#(text transitions)=
+ for transition=transitions:
+ @#internalTransitions[@#nInternalTransitions] := transition;
+ @#nInternalTransitions := @#nInternalTransitions + 1;
+ endfor;
+enddef;
+
+vardef State_layout@#=
+ if @#laidout = 1:
+ log "State '" & (str @#) & "' has already been layed out";
+ else:
+ @#laidout := 1;
+ log "State layout: '" & (str @#) & "'";
+
+ EPictureStack.@#internalTransitionsStack(@#info.iStack)
+ (scantokens listArray(@#internalTransitions)(@#nInternalTransitions))("vleftbase");
+
+ log "State name layout '" & (str @#) & "'...";
+ PictureStack_layout.@#stack;
+ log "Internal transitions layout '" & (str @#) & "'...";
+ PictureStack_layout.@#internalTransitionsStack;
+ log "Substates layout '" & (str @#) & "'...";
+ Group_layout.@#substates;
+
+ log "All elements in state '" & (str @#) & "' successfully layed out, integrating...";
+
+% @#internalTransitionsStack.info.boxed := 1;
+
+ @#contentWidth = lmax(@#stack.width, @#internalTransitionsStack.width, @#substates.width);
+
+ @#width = @#contentWidth + @#info.left + @#info.right + 2 * @#info.round;
+ @#height = @#stack.height + @#info.top + @#info.bottom +
+ @#internalTransitionsStack.height + @#substates.height;
+
+ @#stack.n = @#n + (0, -@#info.top);
+ @#substates.n = @#stack.s;
+
+ @#internalTransitionsStack.sw = @#sw + (@#info.round, @#info.round);
+
+ attributes(@#);
+ var(pair) urt, lrt, ulft, llft;
+ var(pair) urta, lrta, ulfta, llfta;
+ var(pair) urtb, lrtb, ulftb, llftb;
+
+ @#urta := @#ne - (@#info.round, 0);
+ @#urtb := @#ne - (0, @#info.round);
+
+ @#lrta := @#se + (0, @#info.round);
+ @#lrtb := @#se - (@#info.round, 0);
+
+ @#ulfta := @#nw - (0, @#info.round);
+ @#ulftb := @#nw + (@#info.round, 0);
+
+ @#llfta := @#sw + (@#info.round, 0);
+ @#llftb := @#sw + (0, @#info.round);
+
+ @#urt := @#ne - (@#info.round, @#info.round) + @#info.round * (sind(45),cosd(45));
+ @#lrt := @#se + (-@#info.round, @#info.round) + @#info.round * (sind(135),cosd(135));
+ @#llft := @#sw + (@#info.round, @#info.round) + @#info.round * (sind(225),cosd(225));
+ @#ulft := @#nw + (@#info.round, -@#info.round) + @#info.round * (sind(315),cosd(315));
+
+ var(pair) nameLineLeft, nameLineRight;
+ ypart @#nameLineLeft = ypart @#nameLineRight = @#stack.bottom;
+ xpart @#nameLineLeft = xpart @#nw;
+ xpart @#nameLineRight = xpart @#ne;
+
+ log "State layout for " & (str @#) & " ended.";
+ fi;
+enddef;
+
+vardef State_draw@#=
+ State_layout.@#;
+ objectEnsurePositioning.@#;
+
+ attributes(@#);
+ var(path) border;
+
+ @#border := @#urta .. @#urt .. @#urtb -- %
+ @#lrta .. @#lrt .. @#lrtb -- %
+ @#llfta .. @#llft .. @#llftb -- %
+ @#ulfta .. @#ulft .. @#ulftb -- cycle;
+
+ %fill @#border shifted (@#info.shade, -@#info.shade) withcolor .7white;
+ drawObjectShade(@#);
+
+ fill @#border withcolor @#info.foreColor;
+ draw @#border withcolor @#info.borderColor;
+
+
+ drawObject(@#internalTransitionsStack);
+ drawObject(@#stack);
+ drawObject(@#substates);
+
+ if @#info.drawNameLine = 1:
+ draw @#nameLineLeft -- @#nameLineRight;
+ fi;
+enddef;
+
+vardef State_border@#=
+ @#border
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_stereotype.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_stereotype.mp
new file mode 100644
index 0000000000..9251c30833
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_stereotype.mp
@@ -0,0 +1,25 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_stereotype_mp:
+ expandafter endinput
+fi;
+_metauml_stereotype_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+
+FontInfo.assocFont(metauml_defaultFont, .7);
+PictureInfo.iStereo(2, 2, 2, 2)(assocFont);
+iStereo.ignoreNegativeBase := 1;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_templates.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_templates.mp
new file mode 100644
index 0000000000..940377bc20
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_templates.mp
@@ -0,0 +1,132 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_templates_mp:
+ expandafter endinput
+fi;
+_metauml_templates_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef TemplateInfo@#=
+ color @#background;
+ color @#borderColor;
+ numeric @#borderScale;
+
+ @#background := .9white;
+ @#borderColor := black;
+ @#borderScale := 1;
+
+ FontInfo.@#iFont(metauml_defaultFont, .9);
+ PictureInfo.@#iPict(2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iStack(2, 2, 1, 1)(7)(@#iPict);
+
+ @#iStack.iPict.ignoreNegativeBase := 1;
+enddef;
+
+vardef TemplateInfoCopy@#(text src)=
+ color @#background;
+ color @#borderColor;
+ numeric @#borderScale;
+
+ @#background := src.background;
+ @#borderColor := src.borderColor;
+ @#borderScale := src.borderScale;
+
+ FontInfoCopy.@#iFont(src.iFont);
+ PictureInfoCopy.@#iPict(src.iPict);
+ PictureStackInfoCopy.@#iStack(src.iStack);
+enddef;
+
+TemplateInfo.iTemplate;
+
+%
+% Template
+%
+vardef ETemplate@#(text _info)(text templates) =
+ ObjectEquations(@#);
+ @#className := "Template";
+
+ TemplateInfoCopy.@#info(_info);
+
+ EPictureStack.@#elementsStack(@#info.iStack)(templates)("vleftbase");
+
+ @#nw = @#elementsStack.nw;
+ @#se = @#elementsStack.se;
+enddef;
+
+vardef Template@#(text templates) =
+ ETemplate@#(iTemplate)(templates);
+enddef;
+
+vardef EClassTemplate@#(text _info)(text templates)(text theClass)=
+ ETemplate.@#(_info)(templates);
+ Template_attachToClass.@#(theClass);
+enddef;
+
+vardef ClassTemplate@#(text templates)(text theClass)=
+ EClassTemplate.@#(iTemplate)(templates)(theClass);
+enddef;
+
+vardef Template_layout@#=
+ if @#laidout = 1:
+ log "Template " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Template layout: " & (str @#);
+ PictureStack_layout.@#elementsStack;
+ fi;
+enddef;
+
+vardef Template_paintSkin@# =
+ log "Painting template skin...";
+
+ fill objectBox(@#) withcolor @#info.background;
+
+ draw objectBox(@#) dashed evenly scaled .8
+ withpen pencircle scaled @#info.borderScale withcolor @#info.borderColor;
+enddef;
+
+vardef Template_draw@# =
+ Template_layout.@#;
+
+ Template_paintSkin.@#;
+ drawObject(@#elementsStack);
+enddef;
+
+vardef Template_attachToClass@#(text theClass)=
+ Template_layout.@#;
+ Class_layout.theClass;
+
+ log "--- Attaching template " & (str @#) & " to class " & (str theClass);
+
+ save __nItems, __nameToRight;
+
+ __nItems := @#elementsStack.nItems;
+ __nameToRight := theClass.right - theClass.namePict.right;
+
+ @#elementsStack.pict[__nItems-1].midy = theClass.top;
+
+ if __nameToRight > @#width/2:
+ @#midx = theClass.right;
+ log "X";
+ else:
+ @#midx = theClass.right + (@#width/2 - __nameToRight) + 2;
+ log "Y";
+ fi;
+
+ %@#elementsStack.pict[__nItems-1].info.boxed:=1;
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase.mp
new file mode 100644
index 0000000000..f9c666abf3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase.mp
@@ -0,0 +1,215 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _metauml_usecase_mp:
+ expandafter endinput
+fi;
+_metauml_usecase_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce metauml_defaults;
+inputonce util_log;
+
+vardef ActorInfo@#=
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iName (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iNameStack (1pt, 1pt, 1pt, 1pt)(9)(@#iName);
+
+ @#iNameStack.iPict.ignoreNegativeBase := 1;
+
+ HumanInfo.@#iHuman(25, 35, .3, .35, .5, 1, 1);
+enddef;
+
+vardef ActorInfoCopy@#(text src)=
+ log "ActorInfoCopy: Copying actor info";
+
+ PictureStackInfoCopy.@#iNameStack (src.iNameStack);
+
+ HumanInfoCopy.@#iHuman(src.iHuman);
+enddef;
+
+ActorInfo.iActor;
+
+vardef Actor@#(text contents)=
+ EActor.@#(iActor)(contents);
+enddef;
+
+vardef EActor@#(text _info)(text contents)=
+ ObjectEquations(@#);
+ @#className := "Actor";
+
+ ActorInfoCopy.@#info(_info);
+
+ numeric @#nLines; @#nLines := 0;
+ string @#lines[];
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+ EHuman.@#human(@#info.iHuman);
+ EPictureStack.@#nameStack(@#info.iNameStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+enddef;
+
+vardef Actor_setDebugMode@#=
+ @#.nameStack.info.boxed := 1;
+enddef;
+
+vardef Actor_layout@#=
+ if @#laidout = 1:
+ log "Actor " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Actor layout: " & (str @#);
+ Human_layout.@#human;
+ PictureStack_layout.@#nameStack;
+
+ @#width = max(@#nameStack.width)(@#human.width);
+ @#height = @#nameStack.height + @#human.height;
+
+ @#n = @#human.n;
+ @#nameStack.n=@#human.s;
+ @#s = @#nameStack.s;
+ fi;
+enddef;
+
+vardef Actor_draw@#=
+ Actor_layout.@#;
+
+ objectEnsurePositioning.@#;
+
+ drawObjects(@#nameStack, @#human);
+enddef;
+
+vardef Actor_border@#=
+ objectBox(@#);
+enddef;
+
+vardef UsecaseInfo@#=
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ FontInfo.@#iFont(metauml_defaultFont, defaultscale);
+ @#iFont.ignoreNegativeBase := 1;
+
+ PictureInfo.@#iName (2, 2, 2, 2)(@#iFont);
+ PictureStackInfo.@#iNameStack (0, 0, 0, 0)(9)(@#iName);
+
+ @#iNameStack.iPict.ignoreNegativeBase := 1;
+
+ Margins.@#(2,2,2,2);
+
+ @#hFatRatio := .1;
+ @#vFatRatio := .15;
+
+ ShadeInfo.@#iShade;
+ @#foreColor := .9white;
+ @#borderColor := black;
+enddef;
+
+vardef UsecaseInfoCopy@#(text src)=
+ log "UsecaseInfoCopy: Copying usecase info";
+ attributes(@#);
+ var(color) foreColor, borderColor;
+
+ PictureStackInfoCopy.@#iNameStack (src.iNameStack);
+ MarginsCopy.@#(src);
+ @#hFatRatio := src.hFatRatio;
+ @#vFatRatio := src.vFatRatio;
+
+ ShadeInfoCopy.@#iShade(src.iShade);
+ @#foreColor := src.foreColor;
+ @#borderColor := src.borderColor;
+enddef;
+
+UsecaseInfo.iUsecase;
+
+vardef Usecase@#(text contents)=
+ EUsecase.@#(iUsecase)(contents);
+enddef;
+
+vardef EUsecase@#(text _info)(text contents)=
+ ObjectEquations(@#);
+ @#className := "Usecase";
+
+ UsecaseInfoCopy.@#info(_info);
+
+ attributes(@#);
+ var(numeric) nLines;
+ @#nLines := 0;
+
+ string @#lines[];
+ for l=contents:
+ @#lines[@#nLines] := l;
+ @#nLines := @#nLines + 1;
+ endfor;
+enddef;
+
+vardef Usecase_layout@#=
+ if @#laidout = 1:
+ log "Usecase " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+
+ EPictureStack.@#nameStack(@#info.iNameStack)(scantokens listArray(@#lines)(@#nLines))("vcenterbase");
+ PictureStack_layout.@#nameStack;
+
+ numeric @#vFat, @#hFat;
+
+ @#hFat = 0;
+ @#vFat = 10;
+
+ @#width = @#nameStack.width + @#info.left + @#info.right + 2 * @#hFat;
+ @#height = @#nameStack.height + @#info.top + @#info.bottom + 2 * @#vFat;
+
+ log "UC w,h";
+ log @#hFat;
+ log @#vFat;
+ log @#nameStack.width;
+ log @#nameStack.height;
+ log @#width;
+ log @#height;
+
+ @#c = @#nameStack.c;
+ fi;
+enddef;
+
+vardef Usecase_draw@#=
+ Usecase_layout@#;
+
+ pair @#urt, @#lrt, @#ulft, @#llft;
+
+ @#urt = @#nameStack.ne;
+ @#lrt = @#nameStack.se;
+ @#ulft = @#nameStack.nw;
+ @#llft = @#nameStack.sw;
+
+ objectEnsurePositioning.@#;
+
+ path @#border;
+ %@#border := @#w .. @#ulft .. @#n .. @#urt .. @#e .. @#lrt .. @#s .. @#llft .. cycle;
+ @#border := @#w .. @#n .. @#e .. @#s .. cycle;
+
+ drawObjectShade(@#);
+
+ fill Usecase_border.@# withcolor @#info.foreColor;
+ draw Usecase_border.@# withcolor @#info.borderColor;
+
+ drawObject(@#nameStack);
+enddef;
+
+vardef Usecase_border@#=
+ @#border
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase_clipart.mp b/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase_clipart.mp
new file mode 100644
index 0000000000..3344454bc4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/metauml_usecase_clipart.mp
@@ -0,0 +1,158 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+%%
+%% This file contains various drawings which can be used in
+%% UML usecase diagrams
+%%
+
+if known _metauml_usecase_clipart_mp:
+ expandafter endinput
+fi;
+_metauml_usecase_clipart_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef HumanInfo@#(expr _width, _height, _yHeadRatio, _yBodyRatio, _yHandsRatio, _xHandsRatio, _xLegsRatio)=
+ attributes(@#);
+
+ var(numeric) width, height, yHeadRatio, yBodyRatio,
+ yHandsRatio, xHandsRatio, xLegsRatip;
+ var(color) foreColor, shadeColor;
+ var(numeric) shade;
+
+ @#width := _width;
+ @#height := _height;
+ @#yHeadRatio := _yHeadRatio;
+ @#yBodyRatio := _yBodyRatio;
+ @#yHandsRatio := _yHandsRatio;
+ @#xHandsRatio := _xHandsRatio;
+ @#xLegsRatio := _xLegsRatio;
+
+ @#foreColor := black;
+ @#shadeColor := .7white;
+ @#shade := .5;
+
+ Margins.@#(2,2,1,0);
+enddef;
+
+vardef HumanInfoCopy@#(text src)=
+ HumanInfo@#(src.width, src.height, src.yHeadRatio, src.yBodyRatio, src.yHandsRatio, src.xHandsRatio, src.xLegsRatio);
+
+ _n_ := str @#;
+ var(color) foreColor, shadeColor;
+ var(numeric) shade;
+
+ @#foreColor := src.foreColor;
+ @#shadeColor := src.shadeColor;
+ @#shade := src.shade;
+
+ MarginsCopy.@#(src);
+enddef;
+
+HumanInfo.iHuman(25, 25, .3, .35, .55, 1, 1);
+
+vardef EHuman@#(text _info)=
+ ObjectEquations(@#);
+ @#className := "Human";
+
+ var(path) pHead, pBody, pHands, pLegs;
+
+ HumanInfoCopy.@#info(_info);
+enddef;
+
+vardef Human@#=
+ EHuman@#(iHuman);
+enddef;
+
+vardef Human_layout@#=
+ if @#laidout = 1:
+ log "Human " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+ log "Human layout: " & (str @#);
+
+ attributes(@#);
+
+ @#height = @#info.height;
+ @#width = @#info.width;
+
+ log "(W, H) MUST BE SET. Their values are: " & (decimal @#height) &" "& (decimal @#width);
+
+ var(numeric) actualHeight, actualWidth;
+ @#actualHeight = @#height - @#info.top - @#info.bottom;
+ @#actualWidth = @#width - @#info.left - @#info.right;
+
+ % HEAD
+ var(pair) headS, headE, headW;
+
+ ypart @#headW = ypart @#headE;
+ .5[@#n - (0, @#info.top), @#headS] = .5[@#headE, @#headW];
+ (ypart @#n - @#info.top) - (ypart @#headS) =
+ (xpart @#headE) - (xpart @#headW) =
+ @#actualHeight * @#info.yHeadRatio;
+ (xpart @#headS) = (xpart @#n);
+
+ % BODY
+ var(pair) bodyS;
+ xpart @#bodyS = xpart @#headS;
+ ypart @#headS - ypart @#bodyS = @#actualHeight * @#info.yBodyRatio;
+
+ % HANDS
+ var(pair) handsW, handsE;
+ ypart @#handsW = ypart @#handsE = ypart @#n - (@#actualHeight * @#info.yHandsRatio);
+ .5[xpart @#handsE, xpart @#handsW] = @#midx;
+ xpart @#handsE - xpart @#handsW = @#actualWidth * @#info.xHandsRatio;
+
+ % LEGS
+ var(pair) footW, footE;
+ ypart @#footW = ypart @#footE = ypart @#s + @#info.bottom;
+ .5[xpart @#footW, xpart @#footE] = @#midx;
+ xpart @#footE - xpart @#footW = @#actualWidth * @#info.xLegsRatio;
+
+ log "Human layout completed";
+ fi;
+enddef;
+
+vardef Human_draw@#=
+ log "Drawing human";
+
+ Human_layout.@#;
+ objectEnsurePositioning.@#;
+
+ % all coordinates must be set to known values in order to compute the paths
+ @#pHead := (@#n - (0, @#info.top)) .. @#headE .. @#headS .. @#headW .. cycle;
+ @#pBody := @#headS -- @#bodyS;
+ @#pHands := @#handsW -- @#handsE;
+ @#pLegs := @#footW -- @#bodyS -- @#footE;
+
+ attributes(@#);
+ var(pair) shadeShift;
+ @#shadeShift = (@#info.shade, -@#info.shade);
+
+ draw @#pHead shifted @#shadeShift withcolor @#info.shadeColor;
+ draw @#pBody shifted @#shadeShift withcolor @#info.shadeColor;
+ draw @#pHands shifted @#shadeShift withcolor @#info.shadeColor;
+ draw @#pLegs shifted @#shadeShift withcolor @#info.shadeColor;
+
+ draw @#pHead withcolor @#info.foreColor;
+ draw @#pBody withcolor @#info.foreColor;
+ draw @#pHands withcolor @#info.foreColor;
+ draw @#pLegs withcolor @#info.foreColor;
+enddef;
+
+vardef Human_border@#=
+ objectBox(@#)
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_commons.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_commons.mp
new file mode 100644
index 0000000000..3ff7f06e83
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_commons.mp
@@ -0,0 +1,137 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_commons_mp:
+ expandafter endinput
+fi;
+_util_commons_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef lmax(text items)=
+ log "finding lmax of items " & str items;
+ save current, nItems;
+ numeric current, nItems;
+ nItems := 0;
+ current:= 0;
+
+ for item = items:
+ log nItems;
+ log item;
+
+ if nItems = 0:
+ current := item;
+ else:
+ current := max(current)(item);
+ fi;
+ nItems := nItems + 1;
+ endfor;
+
+ current
+enddef;
+
+vardef lmin(text items)=
+ save current, nItems;
+ numeric current, nItems;
+ nItems := 0;
+ current:= 0;
+
+ for item = items:
+ if nItems = 0:
+ current := item;
+ else:
+ current := min(current)(item);
+ fi;
+ nItems := nItems + 1;
+ endfor;
+
+ current
+enddef;
+
+def _max(text a)(text b)=
+ if (a > b): a%
+ else:b%
+ fi;
+enddef;
+
+def _min(text a)(text b)=
+ if (a < b): a%
+ else:b%
+ fi;
+enddef;
+
+vardef ensurePict(text pictOrText)(expr font, scale) =
+ save p; picture p;
+ if picture pictOrText: p=pictOrText
+ else: p = pictOrText infont font scaled scale
+ fi;
+ p
+enddef;
+
+def pictHeight(text obj) =
+ (ypart (urcorner obj) - ypart (llcorner obj))
+enddef;
+
+def pictWidth(text obj) =
+ (xpart (urcorner obj) - xpart (llcorner obj))
+enddef;
+
+vardef listArray(text array)(text nElements)=
+ save objEnum;
+ string objEnum;
+ objEnum := "";
+
+ for i = 0 upto nElements-1:
+ if i>0:
+ objEnum := objEnum & ", ";
+ fi;
+ objEnum := objEnum & (str array) & (decimal i);
+ endfor;
+
+ objEnum
+enddef;
+
+vardef enumToString(text enumeration)(expr prefix)=
+ save ret, firstVar;
+ string ret;
+ ret := "";
+
+ numeric firstVar;
+ firstVar := 1;
+
+ forsuffixes v = enumeration:
+ if firstVar = 0:
+ ret := ret & ",";
+ else:
+ firstVar := 0;
+ fi;
+
+ ret := ret & prefix & (str v);
+ endfor;
+
+ ret
+enddef;
+
+def _dx(text pA)(text pB) =
+ (xpart(pB)-xpart(pA))
+enddef;
+
+def _dy(text pA, pB) =
+ (ypart(pB)-ypart(pA))
+enddef;
+
+def _length(text pA)(text pB) =
+ sqrt (_dx(pA)(pB)*_dx(pA)(pB) + _dy(pA)(pB)*_dy(pA)(pB))
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_group.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_group.mp
new file mode 100644
index 0000000000..7dad82ba02
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_group.mp
@@ -0,0 +1,181 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_group_mp:
+ expandafter endinput
+fi;
+_util_group_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_object;
+inputonce util_commons;
+inputonce util_margins;
+inputonce util_log;
+
+vardef GroupInfo@#(expr pleft, pright, ptop, pbottom)=
+ attributes(@#);
+ var(color) borderColor;
+ var(numeric) boxed;
+
+ @#boxed := 0;
+ @#borderColor := red;
+
+ Margins.@#(pleft, pright, ptop, pbottom);
+enddef;
+
+vardef GroupInfoCopy@#(text src)=
+ GroupInfo@#(src.left, src.right, src.top, src.bottom);
+
+ @#boxed := src.boxed;
+ @#borderColor := src.borderColor;
+
+enddef;
+
+GroupInfo.iGroup(2, 2, 2, 2);
+GroupInfo.iGroupNoMargins(0, 0, 0, 0);
+
+GroupInfoCopy.iGroupBoxed(iGroup);
+iGroupBoxed.boxed := 1;
+
+vardef EGroup@#(text groupInfo)(text objects)=
+ ObjectEquations(@#);
+ @#className := "Group";
+
+ var(numeric) minx, maxx, miny, maxy;
+ var(numeric) nObjects;
+ var(string) objectsAsString;
+
+ GroupInfoCopy.@#info(groupInfo);
+
+ @#objectsAsString := enumToString(objects)("");
+ log @#objectsAsString;
+
+ @#nObjects := 0;
+ if @#objectsAsString <> "":
+ forsuffixes obj = scantokens @#objectsAsString:
+ @#nObjects := @#nObjects + 1;
+ endfor;
+ fi;
+
+enddef;
+
+vardef Group@#(text objects)=
+ EGroup@#(iGroup)(objects);
+enddef;
+
+vardef Group_layout@#=
+ if @#laidout = 0:
+ log "Needing layout for group " & (str @#);
+ @#laidout := 1;
+
+ log "Calling layout for objects in group '" & (str @#) & "' .";
+ log " Objects are: '" & @#objectsAsString & "'.";
+
+ if (@#objectsAsString = ""):
+ log "Empty layout begin";
+ @#width = @#info.left + @#info.right;
+ @#height = @#info.top + @#info.bottom;
+ log "Empty layout end";
+ else:
+ log "Layout with content";
+ layoutObjects(scantokens @#objectsAsString);
+ log "All objects in group '" & (str @#) & "' are now laid out.";
+
+ % As already tested, @#objectsAsString must be <> "".
+ % See page 53, User's manual for MetaPost
+ % "if some of the suffixes are empty, the loop gets
+ % executed, with the loop index parameter set to
+ % the empty suffix" (!)
+
+ log "Group_layout: finding min/max x/y of objects:" & @#objectsAsString;
+
+ __objectIndex := 0;
+ forsuffixes obj__ = scantokens @#objectsAsString:
+ if __objectIndex = 0:
+ log "Group_layout: first object " & str obj__ & ", initial minx, maxx, miny, maxy follow.";
+ @#minx := obj__.left;
+ @#maxx := obj__.right;
+ @#miny := obj__.bottom;
+ @#maxy := obj__.top;
+
+ log @#minx;
+ log @#maxx;
+ log @#miny;
+ log @#maxy;
+ __objectIndex := __objectIndex + 1;
+ else:
+ log "Group_layout: current object " & str obj__;
+
+ log "comparing minx";
+ log @#minx;
+ log obj__.left;
+ @#minx := min(@#minx, obj__.left);
+
+ log "comparing maxx";
+ log @#maxx;
+ log obj__.right;
+ @#maxx := max(@#maxx, obj__.right);
+
+ log "comparing miny";
+ log @#miny;
+ log obj__.bottom;
+ @#miny := min(@#miny, obj__.bottom);
+
+ log "comparing maxy";
+ log @#maxy;
+ log obj__.top;
+ @#maxy := max(@#maxy, obj__.top);
+
+ __objectIndex := __objectIndex + 1;
+ fi;
+ endfor;
+ log "Group_layout: finding min/max x/y: done.";
+ log @#minx;
+ log @#maxx;
+ log @#miny;
+ log @#maxy;
+
+ log "Group_layout: about to set nw, se";
+ log @#nw;
+ log @#se;
+
+ @#nw = (@#minx - @#info.left, @#maxy + @#info.top);
+ @#se = (@#maxx + @#info.right, @#miny - @#info.bottom);
+
+ log "Done performing actual layout for group " & str @#;
+ fi;
+ else:
+ log "NOT needing layout for group " & (str @#);
+ fi;
+enddef;
+
+vardef Group_draw@#=
+ log "Drawing group....";
+ Group_layout@#;
+ objectEnsurePositioning.@#;
+
+ if @#objectsAsString <> "":
+ drawObjects(scantokens @#objectsAsString);
+ fi;
+
+ if (@#info.boxed = 1):
+ draw objectBox(@#) withcolor @#info.borderColor;
+ fi;
+enddef;
+
+vardef Group_border@#=
+ objectBox(@#)
+enddef;
+
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_infrastructure.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_infrastructure.mp
new file mode 100644
index 0000000000..8e6c2ed05d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_infrastructure.mp
@@ -0,0 +1,56 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_infrastructure_mp:
+ expandafter endinput
+fi;
+_util_infrastructure_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef attributes(text objectName)=
+ _n_ := str objectName
+enddef;
+
+vardef variables_ext text variables=
+ save ret, firstVar;
+ string ret;
+ ret := "";
+
+ numeric firstVar;
+ firstVar := 1;
+
+ forsuffixes v = variables:
+ if firstVar = 0:
+ ret := ret & ",";
+ else:
+ firstVar := 0;
+ fi;
+
+ ret := ret & " _n." & (str v);
+ endfor;
+
+ ret
+enddef;
+
+vardef var(text type) text variables =
+ save _variables;
+ string _variables;
+ _variables := variables_ext variables;
+
+ generic_declare(type) scantokens _variables;
+enddef;
+
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_log.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_log.mp
new file mode 100644
index 0000000000..61c86ec8d6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_log.mp
@@ -0,0 +1,31 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+%%% if known _util_log_mp:
+%%% expandafter endinput
+%%% fi;
+_util_log_mp:=1;
+
+util_loglevel_PARANOIA:=1;
+util_loglevel_DEBUG:=2;
+util_loglevel_RELEASE:=3;
+util_loglevel_SILENT:=4;
+
+util_log_thresholdlevel := util_loglevel_DEBUG;
+util_log_defaultlevel := util_loglevel_RELEASE;
+
+def elog(expr loglevel) text txt=
+ if (loglevel <= util_log_thresholdlevel):
+ %includeonce% show txt
+ else:
+ % do nothing
+ fi;
+enddef;
+
+def log text txt=
+ if (util_log_defaultlevel <= util_log_thresholdlevel):
+ show txt
+ else:
+ % do nothing
+ fi;
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_margins.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_margins.mp
new file mode 100644
index 0000000000..7b014ee9e7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_margins.mp
@@ -0,0 +1,21 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_margins_mp:
+ expandafter endinput
+fi;
+_util_margins_mp:=1;
+
+vardef Margins@#(expr pleft, pright, ptop, pbottom)=
+ attributes(@#);
+ var(numeric) left, right, top, bottom;
+
+ @#left := pleft;
+ @#right := pright;
+ @#top := ptop;
+ @#bottom := pbottom;
+enddef;
+
+vardef MarginsCopy@#(text src)=
+ Margins@#(src.left, src.right, src.top, src.bottom);
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_object.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_object.mp
new file mode 100644
index 0000000000..fbc569dd6f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_object.mp
@@ -0,0 +1,233 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_object_mp:
+ expandafter endinput
+fi;
+_util_object_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_infrastructure;
+inputonce util_log;
+
+def ObjectEquations(suffix $)=
+ attributes($);
+ var(pair) n, ne, e, se, s, sw, w, nw, c;
+ var(pair) dim;
+ var(numeric) width, height;
+
+ var(numeric) left, right;
+ var(numeric) top, bottom;
+ var(numeric) midx, midy;
+
+ var(picture) pict;
+ var(string) className;
+
+ var(numeric) laidout, drawn;
+
+ $.laidout := 0;
+ $.drawn := 0;
+
+ $.left = xpart $.nw = xpart $.sw;
+ $.right = xpart $.ne = xpart $.se;
+
+ $.top = ypart $.ne = ypart $.nw;
+ $.bottom = ypart $.se = ypart $.sw;
+
+ $.w = .5[$.nw,$.sw];
+ $.s = .5[$.sw,$.se];
+ $.e = .5[$.ne,$.se];
+ $.n = .5[$.ne,$.nw];
+
+ $.c = .5[$.nw, $.se];
+
+ $.width = $.right - $.left;
+ $.height = $.top - $.bottom;
+
+ $.midx = xpart($.c);
+ $.midy = ypart($.c);
+
+ xpart $.dim = $.width;
+ ypart $.dim = $.height;
+
+ $.className := "Object";
+enddef;
+
+def objectBox(text obj)=
+ obj.nw -- obj.ne -- obj.se -- obj.sw -- cycle
+enddef;
+
+vardef objectBorder(suffix @#)=
+ save methodName;
+ string methodName;
+ methodName := @#className & "_border";
+ log "objectBorder: invoking " & methodName & " arg=" & str @#;
+
+ scantokens (methodName).@#
+enddef;
+
+vardef Object_toString(text obj)=
+ save ret; string ret;
+ ret := "Generic object";
+ ret
+enddef;
+
+vardef toString(suffix @#)=
+ scantokens (@#className & "_toString").@#
+enddef;
+
+vardef layoutObject(suffix @#)=
+ save methodName;
+ string methodName;
+ methodName := @#className & "_layout";
+ log "layoutObject: invoking " & methodName & " arg=" & str @#;
+
+ scantokens (methodName).@#;
+enddef;
+
+vardef drawObject(suffix @#)=
+ save methodName;
+ string methodName;
+ methodName := @#className & "_draw";
+ log "drawObject: invoking " & methodName & " arg=" & str @#;
+
+ scantokens (methodName).@#;
+enddef;
+
+vardef drawObjectShade(suffix @#)=
+ fill objectBorder(@#) shifted
+ (@#.info.iShade.shift, -@#.info.iShade.shift) withcolor @#.info.iShade.background;
+enddef;
+
+vardef objectEnsurePositioning@#=
+ if unknown (xpart @#nw):
+ log "*** WARNING: DEFAULTING OBJECT'S (" & (str @#) & ") x TO 0";
+ xpart @#nw = 0;
+ fi;
+ if unknown (ypart @#nw):
+ log "*** WARNING: DEFAULTING OBJECT'S (" & (str @#) & ") y TO 0";
+ ypart @#nw = 0;
+ fi;
+enddef;
+
+vardef drawObjectAt(suffix @#)(text eq)=
+ eq;
+ drawObject(@#);
+enddef;
+
+vardef layoutObjects(text objects)=
+ log "layoutObjects: begin";
+ forsuffixes o = objects:
+ if (str o) <> "":
+ layoutObject(o);
+ fi;
+ endfor;
+ log "layoutObjects: end";
+enddef;
+
+vardef drawObjects(text objects)=
+ % This needs to be done first in order to allow for equations which define
+ % relative positioning to be appropiately solved. Otherwise, for example,
+ % object0 may be positioned somewhere by default, and object1 also, leading
+ % to inconsitent equations. Inconsistency would have been caused by the fact that the
+ % positioning equations become meaningful only after object layout is performed
+ % --- but that would have been too late, since the positioning would have been
+ % done already to inappropriate values.
+ %
+ layoutObjects(objects);
+
+ forsuffixes o = objects:
+ if (str o) <> "":
+ drawObject(o);
+ fi;
+ endfor;
+enddef;
+
+%%
+%% Joins the given pictures according to the equation given
+%% by the pictureDoJoin macro. Note: the pictureDoJoin macro
+%% can be conveniently set by calling setPicutureJoin macro.
+%%
+%% Usage example:
+%% joinObjects (p, q, r);
+%%
+def joinObjects(text pictures)=
+ log "joinObjects: call started.";
+
+ save _index;
+ _index := 0;
+ forsuffixes p=pictures:
+ exitif (str p) = "";
+ if _index=0:
+ log " joinObjects: calling join for first object.";
+ log _index;
+ log p;
+ objectDoJoinFirst(p)(_index);
+ else:
+ log " joinObjects: calling join for next object.";
+ log _index;
+ log p;
+ objectDoJoin(previousPic, p)(_index);
+ fi;
+
+ _index := _index + 1;
+ def previousPic=p enddef;
+ endfor;
+
+ log "joinObjects: call ended."
+enddef;
+
+%%
+%% Sets the macro pictureDoJoin, which is used by joinObjects to join
+%% one picture into another.
+%%
+%% The pictureDoJoin macro has two arguments: pa and pb.
+%% pa represents the first picture and pb the second picture.
+%% The second picture is positioned relatively to pa as specified
+%% by the given equation.
+%%
+%% Usage examples:
+%%
+%% % place the second picture at the bottom of the first
+%% setPictureJoin(pa.sw = pb.nw);
+%%
+%% % place the second picture at the right of the first
+%% setPictureJoin(pa.ne = pb.nw);
+%%
+def setObjectJoin(text eq)=
+ def objectDoJoin(suffix pa, pb)(expr index)=eq; enddef;
+ def objectDoJoinFirst(suffix pa)(expr index)= log " objectDoJoinFirst: NOP"; enddef;
+enddef;
+
+def setObjectJoinFirst(text eq)=
+ def objectDoJoinFirst(suffix pa)(expr index)=eq; enddef;
+enddef;
+
+%%
+%% A shortcut for setting the join equation and actually performing the join.
+%
+def joinObjectsEq(text objects)(text eq)=
+ setObjectJoin(eq);
+ joinObjects(objects);
+enddef;
+
+
+%%
+%% Joins the pictures and draws them. A shorthand for
+%% the corresponding two macro invocations.
+%%
+def joinDrawObjects(text pictures)=
+ joinObjects(pictures);
+ drawObjects(pictures);
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_picture.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_picture.mp
new file mode 100644
index 0000000000..85ce68f7d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_picture.mp
@@ -0,0 +1,285 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_picture_mp:
+ expandafter endinput
+fi;
+_util_picture_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+inputonce util_margins;
+
+if not known _n_cur_:input boxes;fi;
+
+vardef FontInfo@#(expr tname, tscale)=
+ attributes(@#);
+ var(string) className;
+ var(string) name;
+ var(numeric) scale;
+
+ @#className := "FontInfo";
+
+ @#name := tname;
+ @#scale := tscale;
+enddef;
+
+vardef FontInfoCopy@#(text fontInfo)=
+ FontInfo@#(fontInfo.name, fontInfo.scale);
+ @#ignoreNegativeBase := fontInfo.ignoreNegativeBase;
+enddef;
+
+vardef FontInfo_toString@#=
+ save ret; string ret;
+ ret := "FontInfo(" & (str @#) & "): {" & (@#name) & ", " & (decimal @#scale) & "}";
+ ret
+enddef;
+
+log "()()() Creating iFont";
+FontInfo.iFont(defaultfont, defaultscale);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% PICTURE %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef PictureInfo@#(expr pleft, pright, ptop, pbottom)(text pfont)=
+ attributes(@#);
+ var(string) className;
+ @#className := "PictureInfo";
+
+ var(color) borderColor;
+ var(numeric) boxed;
+
+ %% Used to set the base of a text to the natural base of the letters.
+ %% If set to '1', 'y' and 'a' will have the same base line, the tail
+ %% of 'y' being rendered below that line
+ %%
+ var(numeric) ignoreNegativeBase;
+
+ %% If these attributes are set to -1, the height and width of the
+ %% Picture object is deduced from the dimensions of the contained
+ %% object (picture or text). If one of these parameters is set to
+ %% a positive value, then the given value is used, regardless of the
+ %% size of the contents.
+ %%
+ var(numeric) fixedWidth, fixedHeight;
+
+ %% Controls how the contents of the picture is to be aligned relatively
+ %% to the picture margins. Can be one of "left", "centered", and defaults to
+ %% "left". The "centered" setting is useful for Picture-s whose fixedWidth
+ %% is set to a given value.
+ %%
+ var(string) halign, valign;
+
+ var(string) textDecoration;
+
+ @#boxed := 0;
+ @#borderColor := blue;
+
+ @#ignoreNegativeBase := 0;
+
+ @#fixedWidth := -1;
+ @#fixedHeight := -1;
+
+ @#halign := "left";
+ @#valign := "bottom";
+
+ @#textDecoration := "none";
+
+ Margins.@#(pleft, pright, ptop, pbottom);
+
+ FontInfoCopy.@#iFont(pfont);
+enddef;
+
+vardef PictureInfoCopy@#(text src)=
+ PictureInfo@#(src.left, src.right, src.top, src.bottom)(src.iFont);
+
+ @#boxed := src.boxed;
+ @#borderColor := src.borderColor;
+ @#ignoreNegativeBase := src.ignoreNegativeBase;
+ @#textDecoration := src.textDecoration;
+
+ @#fixedWidth := src.fixedWidth;
+ @#fixedHeight := src.fixedHeight;
+
+ @#halign := src.halign;
+ @#valign := src.valign;
+enddef;
+
+vardef PictureInfo_toString@#=
+ save ret; string ret;
+ ret := "PictureInfo(" & (str @#) & "): {" & (decimal @#left) & ", " & (decimal @#right) & ", " & (decimal @#top) & ", " & (decimal @#bottom) & "}" & " boxed: " & (decimal @#boxed);
+ ret := ret & " Font: " & toString(@#iFont);
+ ret
+enddef;
+
+PictureInfo.iPict(2, 2, 2, 2)(iFont);
+PictureInfo.iPictNoMargins(0, 0, 0, 0)(iFont);
+
+PictureInfoCopy.iPictBoxed(iPict);
+iPictBoxed.boxed := 1;
+
+%%
+%% Contructs a Picture object by wrapping around the
+%% low-level picture thePict.
+%%
+vardef EPicture@#(text iPict)(expr thePict) =
+ ObjectEquations(@#);
+ @#className := "Picture";
+
+ var(pair) contentShift;
+ var(picture) pict;
+ var(numeric) negativeBase;
+ var(string) contentAsString;
+ var(picture) contentAsPicture;
+
+ PictureInfoCopy.@#info(iPict);
+
+ if string thePict:
+ log "Picture " & (str @#) & " is a text";
+ @#contentAsString := thePict;
+ log @#contentAsString;
+ elseif picture thePict:
+ log "Picture " & (str @#) & " is a native pict";
+ @#contentAsPicture := thePict;
+ log @#contentAsPicture;
+ else:
+ log "Picture " & (str @#) & " [error]";
+ fi;
+
+enddef;
+
+%%
+%% Contructs a Picture object by wrapping around the
+%% low-level picture thePict.
+%%
+vardef Picture@#(expr thePict) =
+ EPicture@#(iPict)(thePict);
+enddef;
+
+%%
+%% Lays out the Picture.
+%%
+vardef Picture_layout@# =
+ if @#laidout = 1:
+ log "Picture " & str @# & " already laid out.";
+ else:
+ log "Laying out " & (str @#);
+
+ @#laidout := 1;
+
+ if known @#contentAsPicture:
+ log "Content is known to be a picture";
+ @#pict = @#contentAsPicture;
+ elseif known @#contentAsString:
+ log "Content is known to be a string: " & @#contentAsString;
+ @#pict = @#contentAsString infont @#info.iFont.name scaled @#info.iFont.scale;
+ else:
+ log "Show unknown parameter type in picture layout";
+ 2 = 3; % force an error
+ fi;
+
+ @#negativeBase = ypart llcorner @#pict;
+
+ if @#info.ignoreNegativeBase = 0:
+ negativeBaseAdjustement__ := 0;
+ else:
+ negativeBaseAdjustement__ := @#negativeBase;
+ fi;
+
+ if @#info.fixedWidth = -1:
+ @#width = pictWidth(@#pict) + @#info.left + @#info.right;
+ else:
+ @#width = @#info.fixedWidth;
+ fi;
+
+ if @#info.fixedHeight = -1:
+ @#height = pictHeight(@#pict) + @#info.top + @#info.bottom + negativeBaseAdjustement__;
+ else:
+ @#height = @#info.fixedHeight;
+ fi;
+
+ if @#info.halign = "left":
+ xdelta__ := @#info.left;
+ elseif @#info.halign = "center":
+ xdelta__ := (@#width-pictWidth(@#pict))/2;
+ else:
+ 2 = 3; % throw exception illegal value for @#info.halign
+ fi;
+
+ if @#info.valign = "bottom":
+ ydelta__ := @#info.bottom - @#negativeBase + negativeBaseAdjustement__;
+ elseif @#info.valign = "center":
+ ydelta__ := (@#height-pictHeight(@#pict))/2 - @#negativeBase + negativeBaseAdjustement__;
+ else:
+ 2 = 3; % throw exception illegal value for @#info.valign
+ fi;
+
+ @#contentShift = @#sw + (xdelta__, ydelta__);
+ fi;
+enddef;
+
+%%
+%% Draws the Picture.
+%%
+vardef Picture_draw@# =
+ Picture_layout@#;
+ objectEnsurePositioning.@#;
+
+ draw @#pict shifted @#contentShift;
+
+ if (@#info.textDecoration = "underline"):
+ save ydelta, height;
+ height := pictHeight(@#pict) - @#negativeBase;
+
+ ydelta := @#info.bottom - @#negativeBase - 0.8;
+
+ draw @#sw + (@#info.left, ydelta) -- @#se + (-@#info.right, ydelta) withcolor black withpen pencircle scaled 0.2bp;
+ fi;
+
+ if (@#info.boxed = 1):
+ draw objectBox(@#) withcolor @#info.borderColor;
+ fi;
+enddef;
+
+vardef Picture_border@#=
+ objectBox(@#)
+enddef;
+
+vardef aitem(text pictInfo)(text thePict)(text equation)=
+ save obj;
+ EPicture.obj(pictInfo)(thePict);
+ equation;
+ drawObject(obj);
+enddef;
+
+vardef item@#(text iPict)(text thePict)(text equation)=
+ save itemName;
+ string itemName;
+ itemName := str @#;
+
+ log "Creating an item with name: '" & itemName & "'";
+
+ if itemName = "":
+ log "Name is empty, creating an anonymous item!";
+ aitem(iPict)(thePict)(equation);
+ else:
+ EPicture@#(iPict)(thePict);
+ equation;
+ drawObject(@#);
+ fi;
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_picture_stack.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_picture_stack.mp
new file mode 100644
index 0000000000..edade327ef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_picture_stack.mp
@@ -0,0 +1,153 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_picture_stack_mp:
+ expandafter endinput
+fi;
+_util_picture_stack_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_picture;
+inputonce util_commons;
+inputonce util_group;
+
+inputonce util_log;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% PICTURE STACK %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Style for a stack of child pictures with the given margins, spacing between children, and a common child style.
+%% If child style supplier @#childStyleSupplier is set, it takes precedence over the common child style.
+%% The child style supplier must be the name of a macro taking a child index as an argument and returning a child style.
+vardef PictureStackInfo@#(expr marginLeft, marginRight, marginTop, marginBottom)(text _spacing)(text _childStyle)=
+ attributes(@#);
+ var(numeric) boxed;
+ var(color) borderColor;
+ var(numeric) spacing;
+ var(string) childStyleSupplier;
+
+ Margins@#(marginLeft, marginRight, marginTop, marginBottom);
+
+ @#spacing := _spacing;
+
+ @#boxed := 0;
+ @#borderColor := green;
+
+ @#childStyleSupplier := "";
+
+ PictureInfoCopy.@#iPict(_childStyle);
+enddef;
+
+vardef PictureStackInfoCopy@#(text src)=
+ PictureStackInfo@#(src.left, src.right, src.top, src.bottom)(src.spacing)(src.iPict);
+
+ @#childStyleSupplier := src.childStyleSupplier;
+ @#boxed := src.boxed;
+ @#borderColor := src.borderColor;
+enddef;
+
+PictureStackInfo.iStack(2, 2, 2, 2)(2)(iPict);
+
+vardef EPictureStack@#(text pictStackInfo)(text thePictures)(text how)=
+ ObjectEquations(@#);
+ @#className := "PictureStack";
+
+ PictureStackInfoCopy.@#info(pictStackInfo);
+
+ attributes(@#);
+ var(numeric) nItems;
+ var(numeric) minx, miny, maxx, maxy;
+ var(string) picturesAsString;
+ %var(text) joinMethod;
+
+ string @#joinMethod;
+
+ %@#joinMethod := str how;
+ for l=how:
+ @#joinMethod := l;
+ endfor;
+
+ @#nItems := 0;
+ for p=thePictures:
+ if (@#info.childStyleSupplier <> ""):
+ EPicture.@#pict[@#nItems](scantokens (@#info.childStyleSupplier)(@#nItems))(p);
+ else:
+ EPicture.@#pict[@#nItems](@#info.iPict)(p);
+ fi;
+ @#nItems := @#nItems + 1;
+ endfor;
+
+ @#picturesAsString := listArray(@#pict)(@#nItems);
+
+ EGroup.@#group(@#info)(scantokens @#picturesAsString);
+
+ @#nw = @#group.nw;
+ @#se = @#group.se;
+enddef;
+
+vardef PictureStack@#(text thePictures)(text how)=
+ EPictureStack@#(iStack)(thePictures)(how);
+enddef;
+
+vardef PictureStack_layout@#=
+ if @#laidout = 1:
+ log "PictureStack " & (str @#) & " has already been layed out";
+ else:
+ @#laidout := 1;
+
+ layoutObjects(scantokens @#picturesAsString);
+
+ if @#joinMethod = "vleft":
+ setObjectJoin(pa.left=pb.left; pa.bottom = pb.top + @#info.spacing);
+ elseif @#joinMethod = "vcenter":
+ setObjectJoin(pa.midx=pb.midx; pa.bottom = pb.top + @#info.spacing);
+ elseif @#joinMethod = "vright":
+ setObjectJoin(pa.right=pb.right; pa.bottom = pb.top + @#info.spacing);
+ elseif @#joinMethod = "vleftbase":
+ setObjectJoin(pa.left=pb.left; pa.bottom = pb.bottom + @#info.spacing);
+ elseif @#joinMethod = "vcenterbase":
+ setObjectJoin(pa.midx=pb.midx; pa.bottom = pb.bottom + @#info.spacing);
+ elseif @#joinMethod = "vrightbase":
+ setObjectJoin(pa.right=pb.right; pa.bottom = pb.bottom + @#info.spacing);
+ else:
+ setObjectJoin(pa.c = pb.c); % By default, stack objects on top of each other.
+ scantokens @#joinMethod;
+ fi;
+
+ joinObjects(scantokens @#picturesAsString);
+
+ Group_layout.@#group;
+ fi;
+enddef;
+
+vardef PictureStack_draw@#=
+ PictureStack_layout.@#;
+ objectEnsurePositioning.@#;
+
+ for i=0 upto @#nItems-1:
+ Picture_draw.@#pict[i];
+ endfor;
+
+ if (@#info.boxed = 1):
+ draw objectBox(@#) withcolor @#info.borderColor;
+ fi;
+enddef;
+
+vardef PictureStack_border@#=
+ objectBox(@#)
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_positioning.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_positioning.mp
new file mode 100644
index 0000000000..9f32a0a54e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_positioning.mp
@@ -0,0 +1,242 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_positioning_mp:
+ expandafter endinput
+fi;
+_util_positioning_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+%% Gives a point which is below the given @point with the given @value.
+%%
+def below(expr point, value) =
+ (point - (0, value))
+enddef;
+
+%% Gives a point which is above the given @point with the given @value.
+%%
+def above(expr point, value) =
+ (point + (0, value))
+enddef;
+
+%% Gives a point which is at the right of the given @point with the given @value.
+%%
+def atright(expr point, value) =
+ (point + (value, 0))
+enddef;
+
+%% Gives a point which is at the left of the given @point with the given @value.
+%%
+def atleft(expr point, value) =
+ (point - (value, 0))
+enddef;
+
+%% Positions the given objects so that they:
+%% * have their tops aligned
+%% * the distance between the objects is @distance
+%% * the center of gravity of the objects (taken on the top line) is at @middlePoint
+%%
+%% @distance
+%% |---------------------------|
+%% | |
+%% | @middlePoint |
+%% __________|_____________._____________|____________ the same top
+%% [objectA] | [objectB]
+%%
+vardef centered_align_top(suffix objectA, objectB)(expr distance, middlePoint)=
+ log middlePoint;
+ objectA.top = objectB.top;
+ objectB.left - objectA.right = distance;
+ middlePoint = .5[objectB.nw, objectA.ne];
+enddef;
+
+%% Deprecated, kept for backward compatibility (align is misspelled).
+%%
+vardef centered_allign_top(suffix objectA, objectB)(expr distance, middlePoint)=
+ log middlePoint;
+ objectA.top = objectB.top;
+ objectB.left - objectA.right = distance;
+ middlePoint = .5[objectB.nw, objectA.ne];
+enddef;
+
+%% theString means here not a sequence of characters but
+%% the horizontal or vertical line on which objects are placed.
+%% For example, if theString is top, then the objects are
+%% "hanging" on a horizontal line, like freshly washed
+%% clothes on a string.
+
+vardef align(suffix theString, extremityNew, extremityOld)
+ (text distanceBetweenObjects)(expr sign)(text objects)=
+ string objectsAsString__;
+ objectsAsString__ := enumToString(objects)("");
+
+ log "Aligning '" & objectsAsString__ & "' at " & str theString;
+ log sign;
+
+ if (objectsAsString__ = ""):
+ log "Nothing to do, bailing out.";
+ else:
+ string previousObject__;
+ previousObject__ := "";
+ objectIndex__ := 0;
+
+ forsuffixes obj = objects:
+ log "object: " & str obj;
+ if objectIndex__ = 0:
+ objectIndex__ := objectIndex__ + 1;
+ previousObject__ := str obj;
+ else:
+ objectIndex__ := objectIndex__ + 1;
+
+ log str theString;
+ log str extremityOld;
+ log str extremityNew;
+ log distanceBetweenObjects;
+
+ string eqA__, eqB__;
+ eqA__ := previousObject__ & "." & str theString & " = " & str obj & "." & str theString;
+
+ if (sign = "+"):
+ eqB__ := previousObject__ & "." & str extremityOld & " + " & (str distanceBetweenObjects) & " = " & str obj & "." & str extremityNew;
+ %eqB__ := previousObject__ & "." & str extremityOld & " + distanceBetweenObjects = " & str obj & "." & str extremityNew;
+ else:
+ eqB__ := previousObject__ & "." & str extremityOld & " - " & (str distanceBetweenObjects) & " = " & str obj & "." & str extremityNew;
+ fi;
+
+ log eqA__, eqB__;
+ scantokens eqA__;
+ scantokens eqB__;
+
+ previousObject__ := str obj;
+ fi;
+ endfor;
+ fi;
+enddef;
+
+vardef leftToRight@#(text distanceBetweenObjects)(text objects)=
+ if str @# = "":
+ log "String is empty, aligning to midy";
+ align(midy, left, right)(distanceBetweenObjects)("+")(objects);
+ else:
+ align(@#, left, right)(distanceBetweenObjects)("+")(objects);
+ fi;
+enddef;
+
+vardef rightToLeft@#(text distanceBetweenObjects)(text objects)=
+ if str @# = "":
+ log "String is empty, aligning to midy";
+ align(midy, right, left)(distanceBetweenObjects)("-")(objects);
+ else:
+ align(@#, right, left)(distanceBetweenObjects)("-")(objects);
+ fi;
+enddef;
+
+vardef topToBottom@#(text distanceBetweenObjects)(text objects)=
+ if str @# = "":
+ log "String is empty, aligning to midx";
+ align(midx, top, bottom)(distanceBetweenObjects)("-")(objects);
+ else:
+ align(@#, top, bottom)(distanceBetweenObjects)("-")(objects);
+ fi;
+enddef;
+
+vardef bottomToTop@#(text distanceBetweenObjects)(text objects)=
+ if str @# = "":
+ log "String is empty, aligning to midx";
+ align(midx, bottom, top)(distanceBetweenObjects)("+")(objects);
+ else:
+ align(@#, bottom, top)(distanceBetweenObjects)("+")(objects);
+ fi;
+enddef;
+
+%%
+%% Defines an equation which sets the given prefix to be equal for all the given objects.
+%% For example:
+%%
+%% same.top(a, b, c);
+%%
+%% is equivalent to
+%% a.top = b.top = c.top;
+%%
+vardef same@#(text objects)=
+ log "begin macro: same@#(text objects)=";
+
+ string equation__, property__;
+ equation__ := "";
+ property__ := str @#;
+
+ objectIndex__ := 0;
+ forsuffixes obj = objects:
+ log "object: " & str obj;
+
+ if objectIndex__ = 0:
+ objectIndex__ := objectIndex__ + 1;
+ equation__ := equation__ & str obj & "." & property__;
+ else:
+ objectIndex__ := objectIndex__ + 1;
+ equation__ := equation__ & "=" & str obj & "." & property__;
+ fi;
+ endfor;
+
+ equation__ := equation__ & ";";
+
+ log "Equation is: '" & equation__ & "'";
+
+ if objectIndex__ <= 1:
+ log "One or no objects, nothing to do!";
+ else:
+ scantokens equation__;
+ fi;
+enddef;
+
+%% this macro is NOT usable (yet)
+vardef leftToRightCentered@#(expr distanceBetweenObjects, middlePoint)(text objects)=
+ string objectsAsString__;
+ objectsAsString__ := enumToString(objects)("");
+
+ if (objectsAsString__ = ""):
+ log "Nothing to do, bailing out.";
+ else:
+ log "ASDFGHJ";
+ leftToRight@#(distanceBetweenObjects)(objects);
+
+ string firstObject__, lastObject__;
+ objectIndex__ := 0;
+ forsuffixes obj = objects:
+ if objectIndex__ = 0:
+ objectIndex__ := objectIndex__ + 1;
+ firstObject__ := str obj;
+ else:
+ objectIndex__ := objectIndex__ + 1;
+ lastObject__ := str obj;
+ fi;
+ endfor;
+
+ log "___";
+ .5[authA.nw,authB.ne] = middlePoint;
+ log "___";
+
+ string eqCenter__;
+ eqCenter__ := ".5[" & firstObject__ & ".nw," & lastObject__ & ".ne] = middlePoint";
+
+ log eqCenter__;
+ log middlePoint;
+
+ log "XXX";
+ scantokens eqCenter__;
+ log "XXX";
+ fi;
+enddef;
diff --git a/graphics/metapost/contrib/macros/metauml/inputs/util_shade.mp b/graphics/metapost/contrib/macros/metauml/inputs/util_shade.mp
new file mode 100644
index 0000000000..b5231164b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/metauml/inputs/util_shade.mp
@@ -0,0 +1,53 @@
+% Copyright 2005 2015 Ovidiu Gheorghies
+% Licensed under the Apache License, Version 2.0.
+
+if known _util_shade_mp:
+ expandafter endinput
+fi;
+_util_shade_mp:=1;
+
+% Sadly, this copy of the macro is needed to prevent multiple file loads being shown by MetaPost.
+% The guard values (such as _metauml_mp) do ensure that the file isn't loaded multiple times,
+% but this macro makes sure that MetaPost won't try to load the file and display a message for that.
+def inputonce text libraryFile=
+ if not known scantokens ("_" & str libraryFile & "_mp"):
+ %includeonce% show "Loading " & str libraryFile;
+ scantokens ("input " & str libraryFile);
+ else:
+ %includeonce% show str libraryFile & " already loaded.";
+ fi;
+enddef;
+
+inputonce util_log;
+
+vardef ShadeInfo@#=
+ _n_ := str @#;
+ generic_declare(numeric) _n.shift;
+ generic_declare(color) _n.background;
+
+ @#shift := 1;
+ @#background := .7white;
+enddef;
+
+vardef ShadeInfoCopy@#(text src)=
+ ShadeInfo.@#;
+ ShadeInfo_copy@#(src);
+enddef;
+
+vardef ShadeInfo_copy@#(text src)=
+ @#shift := src.shift;
+ @#background := src.background;
+enddef;
+
+vardef ShadeInfo_toString@#=
+ save @#ret;
+ string @#ret;
+ @#ret := "Shade (shift: " & (decimal @#shift) & " back: (" &
+ (decimal redpart @#background) & ", " &
+ (decimal greenpart @#background) & ", " &
+ (decimal bluepart @#background) & ")";
+
+ @#ret
+enddef;
+
+
diff --git a/graphics/metapost/contrib/macros/misc/closefrm.mp b/graphics/metapost/contrib/macros/misc/closefrm.mp
new file mode 100644
index 0000000000..880c66b6ed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/misc/closefrm.mp
@@ -0,0 +1,44 @@
+%%%% ========================================================================
+%%%% @MP-file{
+%%%% author = "Ulrik Vieth",
+%%%% version = "1.04",
+%%%% date = "02 May 1995",
+%%%% time = "11:24:17 MET",
+%%%% filename = "closefrm.mp",
+%%%% checksum = "08512 44 231 2198",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% codetable = "ISO/ASCII",
+%%%% keywords = "MetaPost, data files, file closing",
+%%%% supported = "yes",
+%%%% abstract = "This file defines a `closefrom' macro
+%%%% to complement the `readfrom' primitive.
+%%%% It operates by repeatedly reading from
+%%%% a file until reaching EOF, which has
+%%%% the side-effect of closing the file.
+%%%% (See do_read_from in mp.web for details!)
+%%%%
+%%%% This macro might be useful to avoid running
+%%%% out of read files when using the MetaPost
+%%%% graph package to process many data files
+%%%% containing extra junk at the end, causing
+%%%% data reading from the files to stop early
+%%%% without closing the files.
+%%%% ",
+%%%% docstring = "The checksum field above contains a CRC-16
+%%%% checksum as the first value, followed by
+%%%% the equivalent of the standard UNIX wc
+%%%% (word count) utility output of lines,
+%%%% words, and characters. This is produced
+%%%% by Robert Solovay's checksum utility.",
+%%%% }
+%%%% ========================================================================
+
+% Read lines from file f (and throw away the contents) until reaching EOF.
+vardef closefrom(expr f) =
+ save s_;
+ forever:
+ string s_;
+ s_ = readfrom f;
+ exitif s_=EOF;
+ endfor
+enddef;
diff --git a/graphics/metapost/contrib/macros/misc/gpdata.mp b/graphics/metapost/contrib/macros/misc/gpdata.mp
new file mode 100644
index 0000000000..9913da269e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/misc/gpdata.mp
@@ -0,0 +1,62 @@
+%%%% ========================================================================
+%%%% @MP-file{
+%%%% author = "Ulrik Vieth",
+%%%% version = "1.04",
+%%%% date = "02 May 1995",
+%%%% time = "11:25:41 MET",
+%%%% filename = "gpdata.mp",
+%%%% checksum = "50346 62 305 2578",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% codetable = "ISO/ASCII",
+%%%% keywords = "MetaPost, Gnuplot, graphs, data files",
+%%%% supported = "yes",
+%%%% abstract = "This file modifies the `Grdln_' routine
+%%%% of the MetaPost graph package, so that
+%%%% it can parse and ignore comment lines
+%%%% in data files starting with a `#' sign,
+%%%% similar to the conventions in Gnuplot.
+%%%%
+%%%% Users of this package should be careful
+%%%% about not leaving extra blank lines
+%%%% before and after such comment lines,
+%%%% as blank lines in data files will still
+%%%% be interpreted as the end of a data set,
+%%%% even if they occur before any data.
+%%%% ",
+%%%% docstring = "The checksum field above contains a CRC-16
+%%%% checksum as the first value, followed by
+%%%% the equivalent of the standard UNIX wc
+%%%% (word count) utility output of lines,
+%%%% words, and characters. This is produced
+%%%% by Robert Solovay's checksum utility.",
+%%%% }
+%%%% ========================================================================
+
+% Load the graph package if it hasn't been loaded already.
+if unknown Gpaths:
+ input graph
+fi
+
+% Read a line from file f, extract whitespace-separated tokens ignoring any
+% initial "%", and return true if at least one token is found. The tokens
+% are stored in @#1, @#2, .. with "" in the last @#[] entry.
+vardef Grdln_@#(expr f) =
+ save n_, s_;
+ forever:
+ string s_;
+ s_ = readfrom f;
+ exitif s_=EOF;
+ string @#[];
+ @#1 := loptok s_;
+ exitif @#1<>"#";
+ endfor
+ if s_<>EOF:
+ n_ = if @#1="%": 0 else: 1 fi;
+ forever:
+ @#[incr n_] := loptok s_;
+ exitif @#[n_]="";
+ endfor
+ @#1<>""
+ else: false
+ fi
+enddef;
diff --git a/graphics/metapost/contrib/macros/misc/interpol.mp b/graphics/metapost/contrib/macros/misc/interpol.mp
new file mode 100644
index 0000000000..f6c5bded2e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/misc/interpol.mp
@@ -0,0 +1,89 @@
+%%%% ========================================================================
+%%%% @MP-file{
+%%%% author = "Ulrik Vieth",
+%%%% version = "1.04",
+%%%% date = "02 May 1995",
+%%%% time = "11:25:28 MET",
+%%%% filename = "interpol.mp",
+%%%% checksum = "38415 89 464 3698",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% codetable = "ISO/ASCII",
+%%%% keywords = "MetaPost, graphs, interpolation",
+%%%% supported = "yes",
+%%%% abstract = "This file declares a new internal quantity
+%%%% `interpolating' and modifies the `augment'
+%%%% and `Mreadpath' routines of the MetaPost
+%%%% graph package to construct a path from
+%%%% data points using Bezier curves instead
+%%%% instead of polygons (line segments) when
+%%%% `interpolating' is set positive.
+%%%%
+%%%% Users of this package should be aware that
+%%%% using this feature might lead to severe
+%%%% distortions if the data isn't suitable.
+%%%% It might be useful, however, when plotting
+%%%% smooth functions evaluate numerically at
+%%%% discrete intervals.
+%%%% ",
+%%%% docstring = "The checksum field above contains a CRC-16
+%%%% checksum as the first value, followed by
+%%%% the equivalent of the standard UNIX wc
+%%%% (word count) utility output of lines,
+%%%% words, and characters. This is produced
+%%%% by Robert Solovay's checksum utility.",
+%%%% }
+%%%% ========================================================================
+
+% Load the graph package if it hasn't been loaded already.
+if unknown Gpaths:
+ input graph
+fi
+
+newinternal interpolating;
+interpolating:=0;
+
+% Find the result of scanning path p and using macros tx and ty to adjust the
+% x and y parts of each coordinate pair. Boolean paramter c tells whether to
+% force the result to be polygonal.
+vardef Gscan_(expr p, c)(suffix tx, ty) =
+ if (str tx="") and (str ty=""): p
+ else:
+ Gpp_(point 0 of p, tx, ty)
+ if path p:
+ for t=1 upto length p:
+ if c: if interpolating>0: .. else: -- fi
+ else: ..controls Gpp_(postcontrol(t-1) of p, tx, ty)
+ and Gpp_(precontrol t of p, tx, ty) ..
+ fi
+ Gpp_(point t of p, tx, ty)
+ endfor
+ if cycle p: &cycle fi
+ fi
+ fi
+enddef;
+vardef Gpp_(expr p)(suffix tx, ty) = (tx xpart p, ty ypart p) enddef;
+
+% Read a path from file f and return it in Mlog form. The path is terminated
+% by blank line or EOF.
+vardef Mreadpath(expr f) =
+ interim warningcheck:=0;
+ save s;
+ gdata(f, s, if i>1: if interpolating>0: .. else: -- fi fi
+ if s2="": (Mlog i, Mlog_str s1)
+ else: (Mlog_str s1, Mlog_str s2) fi)
+enddef;
+
+% Append coordinates t to polygonal path @#. The coordinates can be numerics,
+% strings, or a single pair.
+vardef augment@#(text t) =
+ interim warningcheck := 0;
+ if not path begingroup @# endgroup:
+ Gerr(begingroup @# endgroup, "Cannot augment--not a path");
+ else:
+ def Gcma_= hide(def Gcma_=,enddef) enddef;
+ if known @#: @#:=@# if interpolating>0: .. else: -- fi else: @#= fi
+ (for p=t:
+ Gcma_ if string p: Mexp Mlog_str fi p
+ endfor);
+ fi
+enddef;
diff --git a/graphics/metapost/contrib/macros/misc/testeq.mp b/graphics/metapost/contrib/macros/misc/testeq.mp
new file mode 100644
index 0000000000..b6cc74339f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/misc/testeq.mp
@@ -0,0 +1,79 @@
+%%%% ========================================================================
+%%%% @MP-file{
+%%%% author = "Ulrik Vieth",
+%%%% version = "1.05",
+%%%% date = "02 May 1995",
+%%%% time = "11:25:12 MET",
+%%%% filename = "testeq.mp",
+%%%% checksum = "19918 79 502 3693",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% codetable = "ISO/ASCII",
+%%%% keywords = "MetaPost, equality test",
+%%%% supported = "yes",
+%%%% abstract = "This file provides a general equality test
+%%%% macro for objects of any type based on
+%%%% code from Appendix D of `The_METAFONTbook',
+%%%% but adapted for MetaPost. Unfortunately
+%%%% it is no longer fully general, because
+%%%% MetaPost lacks bitmap-oriented operation
+%%%% like `cull' and `totalweight' needed when
+%%%% testing for the equality of two pictures.
+%%%%
+%%%% A particular useful feature of this package
+%%%% is the `patheq' macro to test if two paths
+%%%% are actually the same. This might come
+%%%% handy when processing data files with the
+%%%% MetaPost graph package that contain data
+%%%% for an unknown number of paths separated
+%%%% by blank lines. In that case one might use
+%%%% `patheq' to check whether the last path
+%%%% read is actually the same as the first one,
+%%%% having started over from the beginning.
+%%%% ",
+%%%% docstring = "The checksum field above contains a CRC-16
+%%%% checksum as the first value, followed by
+%%%% the equivalent of the standard UNIX wc
+%%%% (word count) utility output of lines,
+%%%% words, and characters. This is produced
+%%%% by Robert Solovay's checksum utility.",
+%%%% }
+%%%% ========================================================================
+
+% See Appendix D of The METAFONTbook for explanations!
+
+tertiarydef p == q =
+ if unknown p or unknown q: false
+ elseif boolean p and boolean q: p=q
+ elseif numeric p and numeric q: p=q
+ elseif pair p and pair q: p=q
+ elseif color p and color q: p=q % added
+ elseif string p and string q: p=q
+ elseif transform p and transform q: p=q
+ elseif path p and path q:
+ if (cycle p = cycle q) and (length p = length q)
+ and (point 0 of p = point 0 of q): patheq p of q
+ else: false fi
+ elseif pen p and pen q: (makepath p == makepath q)
+ elseif picture p and picture q: % piceq p of q % changed
+ errmessage("Sorry, I can't compare pictures"); false % added
+ elseif vacuous p and vacuous q: true
+ else: false fi enddef;
+
+vardef vacuous primary p =
+ not(boolean p or numeric p or pair p or path p
+ or pen p or picture p or string p or transform p) enddef;
+
+vardef patheq expr p of q =
+ save t; boolean t; t=true;
+ for k=1 upto length p:
+ t := (postcontrol k-1 of p = postcontrol k-1 of q)
+ and (precontrol k of p = precontrol k of q)
+ and (point k of p = point k of q);
+ exitunless t; endfor
+ t enddef;
+
+%vardef piceq expr p of q =
+% save t; picture t;
+% t=p; addto t also -q;
+% cull t dropping origin;
+% (totalweight t=0) enddef;
diff --git a/graphics/metapost/contrib/macros/mp3d/README b/graphics/metapost/contrib/macros/mp3d/README
new file mode 100644
index 0000000000..aedb625ec4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/README
@@ -0,0 +1,87 @@
+ 3d/3dgeom version 1.34
+ ======================
+
+This entire package is released under the LPPL, version 1 or (at your
+option) any later version.
+
+This release is a intermediary release of the 3d metapost package.
+It updates the 3d package (CTAN:graphics/metapost/macros/3d)
+and adds features facilitating the creation of space geometry drawings.
+
+There have been a number of changes, and as a consequence we had
+to slightly update the description published in TUGboat in 1998.
+See the doc directory. The doc directory contains both
+the old 1998 article, a corrected version, the 2001 GUTenberg
+article on geometry in space and its translation which appeared in 2003
+(TUGboat 2001).
+
+The 1998 package is completely contained in this release in the directory
+v1.0, except that some files have been renamed in order to prevent
+a conflict. For istance, 3d.mp has been renamed into 3d-1.0.mp
+when necessary. Also, the doc directory from the 1.0 version has been
+transferred to the current doc directory.
+
+The 1.0 version should still be of interest for the documentation
+of its file, which used mft (see for instance v1.0/doc/3d-1.0.ps).
+
+As version 1.34 is an intermediate release, it may lack some
+uniformity which might be added later. Also, the sources do contain
+preliminary and documented material.
+
+This release contains three directories:
+
+ doc : documentation
+ examples : all the examples from the Space Geometry article
+ inputs : the files needed for metapost
+
+
+HOW TO CREATE AN ANIMATION
+--------------------------
+
+Details are given to produce the standard animation
+under UNIX, with the binaries listed below.
+For other architectures, you may have to adapt the
+write_script macro in the 3d.mp file.
+
+ 1) create a directory and copy the .mp files from the
+ inputs directory to it.
+ 2) apply metapost to animpoly.mp ; this will create 100 files
+ named animpoly.101, animpoly.102, ..., animpoly.200.
+ It will also have created a script file named
+ create_animation.sh
+ 3) copy the gifmerge utility (as well as programs such as pnmcut,...)
+ in this directory or let it be reachable through PATH.
+ 4) apply sh to create_animation.sh; this will create the animation;
+ first the metapost outputs are converted to gif, then
+ they are collated with gifmerge.
+ 5) the result is animpoly.gif which is a GIF89A animation file;
+ it can be viewed under netscape or simply with a program like xanim.
+
+ Binaries required by the 3D package
+ -----------------------------------
+
+As it is, the generation of animated gifs requires the following
+programs:
+
+ awk
+ gs (ghostscript)
+ pnmcut
+ ppmquant
+ ppmtogif
+ gifmerge
+
+These executables are not part of that distribution.
+
+The first two are widely available on UNIX.
+The three p* programs are part of the NETPBM toolkit.
+You can find this toolkit on the web through any search tool.
+And gifmerge can be found at http://www.iis.ee.ethz.ch/~kiwi/GIFMerge.
+
+I have no idea how to port all this on other architectures,
+but I assume there are similar tools for PCs or Macs.
+I'd be interested to get feedback and details so that i can
+include instructions in future releases of my package.
+
+========================================================================
+Denis Roegel, 17 August 2003
+roegel@loria.fr
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/README b/graphics/metapost/contrib/macros/mp3d/doc/README
new file mode 100644
index 0000000000..bddb42dd8d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/README
@@ -0,0 +1,23 @@
+tb57roeg:
+
+ Denis Roegel: Creating 3D animations with METAPOST,
+ TUGboat volume 18, number 4 (December 1997), pages 274-283.
+
+ The tb57roeg files in this directory were provided to me on April 8th, 1998
+ by Mimi Burbank. These files were used for the production of the
+ final version of the paper, as it has appeared.
+
+paper1997corrected.pdf: uptodate version of tb57roeg
+
+tugboat-geometry-space.pdf:
+
+ TUGboat (volume 22, number 4, December 2001, pages 298-314)
+
+gut2001.pdf:
+
+ Denis Roegel: La géométrie dans l'espace avec METAPOST,
+ Cahiers GUTenberg numéro 39-40, May 2001, pages 107-138.
+ (Original version of tugboat-geometry-space)
+
+
+Denis Roegel, August 17, 2003.
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/gut2001.pdf b/graphics/metapost/contrib/macros/mp3d/doc/gut2001.pdf
new file mode 100644
index 0000000000..e64bdca4b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/gut2001.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/paper1997corrected.pdf b/graphics/metapost/contrib/macros/mp3d/doc/paper1997corrected.pdf
new file mode 100644
index 0000000000..572c16e6be
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/paper1997corrected.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.pdf b/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.pdf
new file mode 100644
index 0000000000..3fb40bfc8b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.ps b/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.ps
new file mode 100644
index 0000000000..e14204eefb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/tb57roeg.ps
@@ -0,0 +1,19323 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.76a Copyright 1997 Radical Eye Software (www.radicaleye.com)
+%%Title: tb57roeg.dvi
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMR10 CMSSBX10 CMBX10 LOGO10 CMTT10 CMTI10 CMMI10 CMR7
+%%+ CMR6 CMR8 CMTT8 LOGO8 CMCSC10 CMSY10 CMMI7 CMTI7 CMEX10 CMSY9 CMR9
+%%+ CMTT9
+%%EndComments
+%DVIPSCommandLine: dvips -Pcms tb57roeg
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 1998.03.11:1148
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{dup length product length le{dup length product
+exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}
+ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}
+imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false
+RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round
+exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto
+rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup
+/delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{3 2 roll p a}B
+/bos{/SS save N}B /eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: finclude.pro
+%!
+/fstore{dup dict exch{dup 4 2 roll put}repeat def}bind def /fshow{gsave
+72 TeXDict /Resolution get div -72 TeXDict /VResolution get div scale 1
+DVImag div dup scale get cvx exec show grestore}bind def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2
+index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont /setfont cvx]cvx def}def /ObliqueSlant
+{dup sin S cos div neg}B /SlantFont{4 index mul add}def /ExtendFont{3 -1
+roll mul exch}def /ReEncodeFont{/Encoding exch def}def end
+
+%%EndProcSet
+%%BeginProcSet: special.pro
+%!
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale true def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+
+%%EndProcSet
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.1: CMTT9 1.0
+%%CreationDate: 1991 Aug 20 16:46:24
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /arrowup put
+dup 175 /arrowdown put
+dup 176 /quotesingle put
+dup 177 /exclamdown put
+dup 178 /questiondown put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /visiblespace put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /arrowup put
+dup 12 /arrowdown put
+dup 13 /quotesingle put
+dup 14 /exclamdown put
+dup 15 /questiondown put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /visiblespace put
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+dup 127 /dieresis put
+dup 128 /visiblespace put
+dup 160 /space put
+readonly def
+/FontBBox{-6 -233 542 698}readonly def
+/UniqueID 5000831 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B4486BE465959B1188F76DF7824C135A7FB382
+C4E11B0DDFE856B6F34552CA48C24B57DD8448FAC257C4D93FB122E1218FD36B99B2D79DADB8
+A66613EF11039BE77816A7A2D6781FE0D69CECC36232AE87A172AFE095532A8C7FF40BDD4A5F
+CFB6CCFD8F73C572231734E0609C6743EE11010F6579820B367C49069AC1D45760C0CE8DC1E6
+7E2BEB72BE6D287910547E1B4BB52465B75947D224998223275A2C340A1C14C04328CC2935C5
+3EE2723F1DE6357A291E14863F6C1411477B3EA074052B30A4C1EF03AB324D678307E1CB02C7
+AAFFA90B73975378B9DEBCD3F6AAB626A361BE8068C60EDD0B2BE4A7BBF4EFA21CC23607BF7E
+2556C17B5923D7B0FC036D5FEA743C55F2BBF72E8A61995BD63D7104A085B8DD5A83D9077376
+A4AE8F0C048606BB9E84C640C52D0A95B35D48CFAFD6EBE3D6EB0ED88C1212818CA93E406147
+40A77C446B792D02945642014A5D55BA970EF97DCDD5B839F621A052D1085A1E668161D3AC02
+27C7867324EDE883589B39E5D152793009CB5A08EB6719A44DD01B6147E3436BDBB28215CE3D
+29A3B1DFC72BD942F8CB3376B4E12CFF53A793D935346CEB2AFC3428CD9313C671EC1911252C
+19DE341556999AAF7417AA5085DAA35EE71353FDC2C7D83EC2DEDAABB1B89B99E4CB5282159C
+BFB45A286F8D6BF3ABDEDCCBDCEBAF6994B17F1BE07D10F00CBA47F2FBF66C0F608F28260BB5
+BC3CBBBDB7BCBBED9C322336A2F2E4F954A05D4879D3D976E201848ADC85B763C354E8017EA4
+1A9998C520D720772255C69EE591BC3650E52286E6F7089AD632DE39FF9B40F725F8E6E02B74
+8929DD79B8FC1B2E7B761909AAF09F1F3F0AC59488B0D281D4A95C25CE830A5223D618A634F4
+71F737BB211E4B04D6B18D867CCFD1694E1586595AC2D3C5D7EFFCD4773DBDB8424C817414F0
+0B2653598571C3F5D9712671A0E8B555FCC8F9AFC5809CC7EE6131E662E3D3066E183D0B6711
+A18806B426429B44521AD3F2E33FA53438F676B958752A88A2416118602CABEF91C101C94A0A
+5DB4D11B913DBAC9C62AB4B754D3A0B43408AC835B5A5A28BCFABFD6CD9961FC83A21FDB2FC4
+8BF4D06F623ABFCDD7F72E7B2BEBB7995C67FD497FF0008940A6D6CB04A8C65C7697D91B817E
+D4C57962F7A49B2C878F09B012D9AA9B871E7A9400C962982EBCC9011918B1608506CC061ADC
+D18A1CF71E088DBD1AD5D9B7459FF3C6014DB70839555EA342E2F0FB91308981FD02A7143549
+2DF066176634326152BD0C93E4D83C8F9687B5FB6C349A6342AE87F7C15E711172939230DB11
+75B419575780C0A9824F8F4F9ECD9F2C2721BCBAF73E937BC57A80B0C4D7BB6049109F21965A
+6D9EA90B3072074E1C9FB3FA31E81754010705568382F8BBAFDC25E4AF9B1458A8D8AF2E8357
+A9FDB226AD41469A18944F78DE58E996C3888B75315D8F08C991C04C6300B4F111F5FF14FFF1
+2DD6C9FCA55B96142E2FBF4941087FA600ACFAA02A2137720766A431070DA574E0F60E0F3009
+D004671C05C37B1B45583DC371DD2FE9E6108AAEBE6A8CEF22B0AF23F68B44FC3E0CAFDA3AE8
+0188F3AA9DEE25B099A2C0C4CB327AD3275A7DC004790DEF9E2BB835642B81254A1B8CE1F59C
+F7BFC693E5CD4706AEA03463575E0F44AD48691C206B9800060EB2F80A050A332008C9D05832
+7DD3E42F4D046D8BC37244599046B30D65B9D059B55827EDB2FDDB79F0DC693743226EC0B995
+A7AE8D5E9BB55FD830753AC63EF8EAC1B18414F060F4613F868ED7E8D96F69E9BC82DA3DB64F
+939BFD11B4B64A5B2E068796C3E1CE3926B2D6F442408820050D585EC449E2AB037AF3257DB4
+3710F2BA8BC72DEFCAEFC767F92DAF7D91BFAB2AEF7FC7E98C8265CC5604F6D5F63BCBE954C2
+ED8A58D0E312DFDCD46B7CC55981DAB0AE803D65C3BDA792EC50ECD030D41ED9C19C5515CB07
+7EA57787A78A143F714B020B5E51790E3FCB235970C0B930CC0CCE33EC3851F86E0F8897E4DD
+BCE32D78876F1BF668971E0E172A3BAD17F200F9AC224ADC85198F538ACDD6BDA89D5337BD49
+1A19BA4344CEE1C0A2603FE9ABEAFBFB96E0402F1290EEEAF3C59D9FDC7242EC59F006146BFC
+1687A5081562629ABCA526344DFB24A4067339DC7D781F392B9135957D61E7C1B97E29A4DE64
+B7891054A6C33452995B9DF8C063803B20A5A85A8ABBF35B55BB4CA57E91916F619DD920C24D
+7E61D85B549BADBA2BDDFD0790EED49AF54A6F5F62DFF642F05F718EA14C92647A4D20EE0489
+2F15BC318266FDE7DCE53847E6F64C2F48E6A0CDE461DE6AB0A114B3A72ACC43A18458A3C9B1
+3AA722E999DB610EB0F1DDFCD098314EACD40104FE9869325A9B847B74DC1A6B08F55241F8EF
+BC6575766B3A0E3977F0BE297E20C6DDB6ECDF051C0C0DE64DEA23B02FC649A86CA14E0197CE
+B2CC6B9CA3529DBA5ED27A7713EB43E133C60D2A12BF5AB59A2032335856DE22893F2C03BFCC
+046A22CFD609EB0CB3284AF5F0BF9FAE44920C2BC3E3B667A40AF42CAA78DF97286DD34F5CFB
+4BCB44026073A80030017223C4A7F54B49E87478F6B72523E6869BFFBF243698CE53DFC56A2B
+12907580DBC8F29844F7B7780FB6517EC2692D9E6F7F0794E3F5D1D98C0CFB3395AB9D30102D
+95496F3A07D65DE1F99F986887AD42A5F8EA442FD964FE2BE2887DE6A249CA455102091247DC
+D69C6A3763C057BC6AF8E7C2C6140DDC5AC8545820400A6EB63CDDD1077969EFA7791F8C9BE2
+0C35415DCA882E2A177A51EEBA30B74A4A76674CFE4B0FB190F3ADB4EA053CB2134FAD92B66C
+81FD0CFEBF3EFC858B1B1343B32FBBD5C9FDE90B343D49666F7DB0577C85C0471B18A3680349
+0D0594E602EE96BC3400413D97A0364C1E4057AFFEE0880A97D0B07D4C72F2E0DD6D59811541
+BEBEAB66DED21D76411722DFF15EFB5B90BE6774622E29C7C3B409C76159C23CBB0A7D4CC542
+B7E52B6C20932CD32D6A8941A231AB9DDBAD60DAC9494F9F92CB2A04BE0753742A035974C7B2
+CC9C3C58A7986DBDD7490B4F74EC880F20E94DF05BCBCB29AFB8CA3E72B5146B3C3C19BC336F
+07366B99247C3DD400B2897334786069C5B5928DA1867953653629FD9016EEE4CABFC071C3F2
+FCD0A810880B26F5CFEFB5E23193D983D1BC6D954B292167A9729DF33590CBDCA442C7BEEA9B
+97DF822D87DA8DF90636BB48005ADCF821C7ED488D0678601E2D2906391FD595553F5F4093CE
+87CFAF9BFD25DFD3DA97A0DBEDBC884CDFD62F8A7DDC4C8D74EC44C6EA4C264FA9FB7F83FC29
+2FC6A85D8E5540D05B61610166438F643CB4D2C5C0CED49CE885E53678F0207579162CD53A2F
+07831EE409261B7F1DED1600C730DDDDF838365A683DA6A6F33E7A49016CBB9D94532191F666
+05CA66E3BF54590AD680EBFE92A91BF600BD4DFC19B1B895BDCE26EE4C8F632EC828F60E8FBC
+39B9B0CA053A00585100B96469BC6B3D372F84BF41417FB632D797DB504F449D8DE720531CAA
+84104F76F1FFC2B4550EAFAC8CFDC48E709D377972B9AA380D4C9457C84AE40CFAB5174E33C4
+8CCDF3509DEEE1422F7AD69CF3D90185C720B4CB0B82B5AC24019ACB847FAAB343BE85273526
+9F98C12D8CB5D78A9A21996B72A71E83EF16EA611DCC4DB16B16C0960A99EF50141DFD364AD1
+09F58E8FD2414978CA4C51A6E030DFC3B02CFAABC0DBA4012EE2449D7DA7B2970017ADCD8736
+1F43A7C84E19C4A04D610F57120A69ED4EC38D1B2314A66B048A07B268590DB0271F95AF6560
+A1CC21066F31B25E96BCD6EF687DC1D2D97FA44FDF5B1E3CDD84BEE32E032A27310A0D15CCE8
+BEB01015EB3E0BECB7810288324E25CD0528BEAE974357E02808DBA3FDA1DD5103B8A5C94F6D
+9DCF8FA92189D01DAAAE273EFEE45AB6EAC3A9780915272B8F7C3075AB3074FD1526590FC446
+FFEB68D49EF85420ED72681896D377CD1B228F3A54928AE764D1C2FE62648EDCEE93DDA16187
+B710B70D980C50116455019FFEC47D6D9B268FD9F6ABCF089B7DFD444B62219FC5808E524D18
+5A6EA9D8662679D82B28943E457FAD8A8BB804BAA0A26ED7C4604745E01BD94FCDA7FD47F593
+89CBC8E92D81028113DC6F4129C21A6D4C06F782400487E50F615502C1A0DA3BE5B5A168FD12
+935DC67ED163886FCA29A6987EF8D92405315AFF0470DDDD1483D198004ACF11833E123081FC
+BD5B022EDD1D8A2D77EE26E36729B40EE54B91ED653216806FD1DE1BAF894A5FDDAB7CD6646D
+6EDA39A1669712A59DF05F35EAF0C0E951717EF05E05D47BC0619872FA285BE4B0930BDC5993
+CD32F6269745563EA2DF9EE4CCE7714F9D0DB8CC65AD139F8854B3DAC7BC2ACD047F287C2C40
+48852CA95A480C82C9071A22BB14E57D47B3AFC6D2A2BC96DB1D9DDF663E94C7CB0A06686B5B
+06832690524EF5122776265FDC5852FD4DD935FEE5A03F17E05E71BA218E181150784BD37DB1
+7A6ED6BFA0730DE1FD118EF42459CE5B2305C0A2CA87CAE5CB5A0FB79BF68077A7599BCCB759
+E20E3D911B36A717937B094AFA50C3FBDBFEF20D9DE18284B3958731F082D2112F45780E082B
+7259407103A3826F1848EB7AE0840FB90659BBCB57124ABE3B3D60012D43699EC1675A9A95C3
+7E9009EDAE906D332FD771EB666926E18A6B772CBB532BF51482D92D1A2E0BC28FBD7246EAB4
+2BD41527F2ABD4E1358F0CE1B09A1E374F9DE128FD8A499C0067CF3F09A5314898873FA04F02
+B6CAB409B8E6EE6AF895313819ADEFD4906974BCA826D933BF01BB3498417BCCF211CCF67AC0
+41016C776676B6D550480C078897ADB8FB0CCDBABF089C74871B48CE64CDBDB0AB941905D6A1
+0203BFEA7830C0AAD6C32CA155844EE6529396E96FDA312E4C72E0407919D28C5BBE52050BD9
+2E5C4AA61DDE9D500B243D4ED8F30FB0ABF32238E4AB33529E8E9766D93AC8B62148C004ACF5
+03CB12A7723434D9B52BE24421C7DF41188289386C6F8DAB25434AC3AA3E176C297BB067F066
+830FF1C10740772590753065CEAA59FF2561A6683CFDC73AA2DBFA299A25A48DB7A02211F586
+249DFFBE444936DDC4A4D8B55AC00B6400A70031A96D6545CA37AC1863A9DCBC665C07A40293
+7A16B1D1B65C08F1812613119292CCBDA5D628BA1D240630AF2FD59145A7F7DCDE5C82159BC7
+EEF6A8492B0E3E69DBA6E45C7CF47CF7DCC96B19F57B5C9672203EED3EE9001C6282411E1BE2
+157C5E38E8A747FAC83D72DAEA38C96DCDC614B819F6E84B353B3C4AE9C08FDC940005F14206
+AD379A666D9812D032435C25A97631EA4D9234963F4183BBED6ED2B65C2C8DF6E43C4AAE5F52
+9DD716D28FAA91268FA7A366A6E5B1875BC54746BCCE65F1CC98A10300D5F000E5F7C67FAF88
+48E68ACAB634B5D90B8E4C69E1C2317139779388C3D13990EA4E40A3471DF1158EA94C1CA90B
+83E70F5435D8A9AF64E5669F6BCFB437C12579F74B14D9CBAAB148169A652AA60066A43433E3
+AF6200E44C20B588BD126BD5565BD38038FB332A8605811C8E83EA43EBFC12F9F1F3389904D5
+28B7832DF876305EE931C2934CB9C6A03E66A4F042BDE91AFDBD8882890AEAB62B8E878D4283
+65B48DE385EA6D52F020E6588D3D42AC7384FFC99B01E6218ABA693F5FFB00A22587A42D9672
+83850D058130862EC67E143E3233B4D145BE1F96CCE0C50FABAEA414370893EEF80C0A2ACAE4
+F61599E691E94684C30250257CBD657754378A83AC6329D50BB7E8C0DC46CDE54E13D094452A
+0FD0FD3C7C7129DD6DD9F7D15B8B4C0882A24C33D5DE5B80884E2CB81CA458576CAE48514A48
+7A94D747F2AAF4F0AC018DD254EFEBE96145A8D3C92F606094D2A4C73BE183B44108F515EFDE
+8BFD968CE20747E2EAA0BEF32A6862CD1D6666C2D276134CBA9AE56DB71B9C030C87964F0B12
+BCDF85FE8CE5BA1AD178EC4BF77FC769E90A0D46A88A9AF8C10022DC7D15E4242B9E28B9E65C
+330A6349A51FB2BC14CCD4593AFFAF36890AAEF531585F6DE6060A8A1477BDD5F6D1E70B0F2F
+2CDFF62368AA89177347CD20BAE4A96FAE26F9B4524F9AFB7109D57C10D2F576DDD9C1FC3AAF
+DAACC1CC566F9BEC007A682F604279280D9799D94F6F23538C63369CCA480C9ADDCAF94E8E3A
+CF47E4DA69039ECE2DA0F61A12A6D007F7680425D0829E67121366E8B4AB5F911E3A04EEFA86
+E366462F7A90325D58416ABF8FE464116A33435358C525038BD3ED1032164F6BA3B68A66745F
+73758DD06AA5693C34205F5B33E2681AF1EDC50493764FFC0FB42224959209DA11620C0AFEF4
+4C7C328DFF7D2712D1E03BF07034637B4459D8D2EE228D01E6823C9C477CD234DCB6C929EE49
+7128C73B5CDE048270440A9827B8282FF0B20C28A6635B1058B55C6F5C8809C6B9E3AC4A29AC
+41ADD9AAAB2AFCE31F15B89F8210E03AA78BA8E63E4E3864C2CB0A8B577E5EA6B3967E0BD22E
+C08BC53DAE6ED470BD049B7CB53FC213B8E2B606DD507111B221DE855CDF73573641E0F8CC5C
+CFE1FABEC1AC991CF868155DC346A3631BB469477A6154392F13E2394CC0C61557BA30BA0600
+980893256B6A5CE6C123A9BB639EF6C6A9BC782EB9222C986ECFA9B5C159675567BA5D69AF3A
+476BC03CADB9C01EC2D79861B5F3E170B07D6E7991B27014FA33EA552C8462851E7DF7FD9F3C
+76DCDE16E08B3FB44F0845B1CB354F26238E89EB656406077153A6BE189D2A6FA9C11031C1DD
+16513FAE9290CAF9DF420BE75392D36A9D1E9B5D05B57763AE8270E9EDB4FEB6134D0B1B0BFE
+1270A4402797BB76566D027F31E33D1FA703AF8F2608F76F99E02636127D836648AB9BAD0E61
+EAA4FDEAAC409195E044032C2856AA780605946E59103DAD1D1525B7B60BCDCAFE71C78FF00E
+83A77B8271AF411716A1509BC9E0ED98C19DD08C457D3F608C220DD544EF4D4B6DD31D8E6CD4
+BAC1E30FF9FA95945A19FDA3F61B199E2A96055FAF195C66C0D36B300009BF5025E3CAD01AC6
+2FDFFEA9E10FC5E6BC7AA1400A9B7D9E6734CA2C1BC4DF7D82142DFC09A56370FBD6F225D5DD
+06C449598578BEF70513235AA24951323896B07619683DB052288C816FA08A752740261AD1EA
+09860CCCCE951D2C606A2B8175C49F5F4DFCD17A207EE4350784A751038AC6446EF0DDE8BDDC
+01D3BCEE3747A46A6BB2320A5003345597BE631C03280F5A699AAE3F3FF772F808EBB7C66107
+40549DCFBBB26153031FAB1452AA82DAB8E37435D6C143E954E4DB00285FD48681EFEFA513FB
+CCBE3C74B6885B6693957808AB234531C3D08B1C77B3719898BDCD93E763F57935EE2A74E682
+2B11E298B46FA218B91BEA0847DD5163EB4B8355E1A59B4D93CC6E13D9E9C443FC5159839931
+403F9B371AAD48C3EBFA13F6869CD6A761C4A025DCEAA2378BA1141FB3116CC34B676F57B800
+2114D0E601C905C0B341A1A027968788D0DA1B7538EA1CD3FF889998B4C33BCF6708DE5BB6C8
+DF46ACFFEF462EAFB048EAB6119F8ED70D5CBFB7DAB71AA6F2C9DD82F17524581AA73CBF6A22
+5CA70781A2EB82B2209450382A55685DA2A087523264349A55FFE19F6E52BF52ED8E392C5FD3
+B96769EF3C1CD2AE7FF15D95B72D9055D4B1680EB5DE98A399ACC23D8A0A8A59774E73519209
+E0AB48CBAE1FD3B4B5057DF9DBD199A59F4A6B33CA2DE253B55A86DFF752EA5B69D5F0EFBBA0
+A5C53899CF772B1CEA68C8AF11503371DB48872910677CA0D870E1B42D6AB2B4792BFE97FB8A
+0B60CE830DAF6643C7307EA70643644D2F8D0408461FBE68FDE7379F09F8EC87FAFF2F6034AB
+6BB2AD1D13F5714301C878C84253F85779BD1CABB29E07CC0D9C543D50B76C416DC6E90D985D
+01E75A4197EFD2451336584779B17F1A8B96BA920CFDCF58BAA576CFFA1AFCC32B506640DCB2
+E0AD1CDFF9D1907AAE407DA643934F1960F8008B9767342CA9A75B5628A0A3AD9DF5B6F44E08
+6E3B2269AF255F5A4792851D403CF5901DC56E047670F6313233C3D11FE76FFA7E03C1DCCD5F
+A9EC5627BF58D777AB50D413FB0C72DF4B71BB352F81D8045F30C1B13247FA86116167AD6AC6
+D75F6650C34BD5F3EBD4DC864F414FBF34E2E3CF1D4A921B7CE7006AFA0F435A530EBC612E65
+506C3547BD53E20508D39A930931D68F74FC5EA4CE9D5397CF925E6B445AF0E38CA451EAC209
+D7E3C5FDCDB48CCBDACC57A062814CE2FFBD3A5CDE97D01465E790F69D79DBE79C87ADA92230
+650349B98EFD94C6CC80EDD22B559A3228CED6CB5AD5E79507D23F3C54471D0C0B1A7D0D8759
+8038310C232667A05EE8138198191A82815D852E967A9534F360DAFD0790FCD471CCE0AEF5D8
+07D7E14D4AF93C6F7213CA1E5D864DD2BF9BE6879A3212AF6259106B3AFB611EFFAB7D87B03F
+49E0F67B8BFFF7E9A9E30F1222D92FFE5F6870BA8A2D7856038623D5F280DABC661ECA98800E
+758F8CC46BE45E4DD795C05127264B226236F26245FBF409DFF34BD05579086B9002EDC817FA
+0A7B82CEAD24991718311D58D6F29F971C743FCD54429F0CB7DDF91F436D51A52BE1D99C99FA
+FBB93E18DAE89070A9EDCB07674CEF1214C0FE6A4DF86B63399D82C50989A03541D23279B8C8
+3EE0AB2A42D60945D7B1B1AFADFBBB9DA8384C4CEFCA6F6BB8F6AF3303E416B545939C3F6348
+B8D055B9E31C8B450D5A0F292057349D639B0DD79AB8428E872AE2301EB48DAAE5AE32D63518
+8536E446C22B9080C34C8781AAD7A5BC12738526FE7F057494960678EEDD6FA007FB8ED34A0F
+61BEAF4168B770E8C21DD19D7C3C56A96ED431F766E7A6AD8C8AE6447B9902FD10A87197CD6C
+3F771580B4634B807EBE94A169AA42081323E0DCEEDA4AD8B5C2BA36E82194D9CE4746214D69
+84BBE12142BF9EA6DDF0CED377234CB504B40B203A8424E94CD0D9C7EBD7AF6E7781222F6CAA
+3EF9CD4D547B9E8840A766B07A196F92B16CF470BA28AE3A705F1AEF3F7A4FB78BC7E5315812
+F34E832A2625DAC422D278EDE610FB689C42F7B0B2E9BB1C6531BFB591FEFC35A17469A961F9
+66A8065063FA2B2F57850270AF7AE77D6F2E2C62F7C9F046EBD581EB0EB709DE3C50B789F4B4
+5B8B28BE16422D01AD6451D6F8329C38201A9AB27A162AE428E061C460CD7F4524C4A988D420
+114340BCDEDA7F4D6E474DF4AB1E7F6A7EC187C195EA7ED1F0D6B78AFA3E9BFF7F452A86FDA9
+6C2CB0F67A37BE74FCA44C985AC3AC6223AC391EE2E3E47F42C9594A5138B505EF6D89D2E38E
+6DFD6C81984D85D60068C3A887724876699F0D9967352B5058AEE865D210E11ACDABA4F64006
+F8AF65A2988D97E1B21B09CCF382C86E8E28191A30BA425F64970058F5ED779EA9EEA82B5CC8
+6D05534152DACC07537E7EC725B57C4325FC9E4401AFA76E254B194C97907DBDAC3924138D78
+EE81AE2AD9D75260DB65F48DC236DA93475354F57BE726B03F9FE8207FFDCEE6F5504B9141A0
+4B2CBE7EAEC208EEFDE56D00E35D79916E8F05D4D5FE6FA083A76E744059416DE1516873E641
+0695CD5171589C3631443DCBDDB55603C871367412C7170857E8BAE6677EB8680D573E691979
+1992C929C163E8603467CA3FAC801E4F23637BAAE85BC118E3A0235FA797F0FD64CC5D15149C
+1B1FDB4A50E7D59C777CE67F7C10DA9432C73417E5077C18953DED59B7964E8C1A1EB07CC880
+43B095B8504EE177D1F752428D44337C506B1305BA105DEFE2F5F8960C357175DF864274A2DA
+1CC1026E1BCD5D8CFC2AB5BCC63D1ED6994505BF969D3CBC8F97F0683182760B5B8972851A53
+A133643146A803F474FE4118121F507F2C9A90D815496ADF3C9C2EAF333544711B612211F964
+844FE6EB3ABADF202D5F8425DA350922C9F79C1C07AFC03640DE8E691CA7CA74D3CDC56AC0AA
+7C82F99A057FDF9B1E0561BA8D0710D2B9EAC03B1CFB7B141D39693B7054C6815A0C335FFE5E
+36DF9A6AE13E7313C6C7C2331FCA2D6A6F2208F72A0E62C74C91054F9B778957DD83C487E924
+29D63A0FC567290B6B49749D3FFDE6173B5D5B9937EC597FF138547921EDFD0ECBB4055FFAC9
+3A0C3EF17C8898AC54605DF8327D0E77E8AFD22CB8F73AAC3EC94F1AF338B3714A08C2132924
+D19BD496BA4F1F76F410917F4429D5D376310DD5E12339D823292FEE8425310CF40D9A41844F
+5EE2DCC2EDBD53544DAB4A120AB999B516D8B90CB30E1D8CCEE638CF1CED2DF52AD14372DA53
+C9F82F876B77BD8E8BFD3189211657194D83F0E57034319AE16492E17B0766AD4EB3E6771F12
+D8E8134A418A85888DA76A9727BC5B5B9A59B996DA8F135AA7759DABE5E3AEED9340169ECE3A
+9731A6822438D8E8D44196B73FF8BCCA83FB3B1E0F66064ED52C8EED2E86F57B2CE5D4AF398B
+F2664D15F3F411BF5E9F6470DBF2BC6895862819570971BF56897573634856B5D19058DE78F4
+693A339225D1815F62F95204A9E42A49E834BD1B97F20C1332287248A98CD10690414D324E77
+E2AFC5482402EE516F444B7DC47818A64F3F826F4F0EE067CE703D91F52B0C6A5F2A04864627
+15F8562814D6EFE11493F110104FD734D0EB99E02603137C4C0D992CA67B9A7323E946DC8AD4
+16EC380038933E3DDC4EE24215EDEA8125913ECA6EC727715C49B62320868E9407AEF30B07A2
+AC23671A18F3784E6D98A8C1C191C68DD7598A65880220B8BA5B425010EC489022BE4D2645C1
+7494BFD8F9F45FC44C9067075C790F90DEC194655C517A6DCF1FD3122CFC276CECBBC5FC6039
+FDF134F56EE78B5A9ED678C7272FE8FD1A0E8B1C7DA8546F132B9552A581C4FAB5237E254036
+92BD33D7BAD9DC56FBAB7C69CB79062527ADE0C8D8DA93E5C0CF8E4A9ABD743B65FDAE84ABAF
+B0674650285796C620AE873558F53C850B0E82140216B4BA3BD41F6613519935F201FD0BB4CB
+FA8D5223D1A26E734444920978B42620F21CB5A4F24FE225D141B5A56FB25029CB9976ECEAE4
+8647662E7C98796899C3E1723DC998FB42F6F1B13D536F82F908EC3CA7FBDF24D4A0B954A821
+71CC936DFA24706A5D4FB4118D87BAD0BBE0AE559C951E22A33181F31B92E64984D52744A4B6
+E358189A88360B9521475CA082704F444791CBFABEEADD5A6708B864599843A181FEF2905498
+30BB0B4793371A04AB1A9DE37FC3FABB9921C2E2924495C6FEC58CAA3FF4564E9EC89078E84B
+C2066D27270A1E17A92E64AE34134FC6BA7E4F70E8743218EFC83FB76E76AAED306D6A5AA873
+0FED52EED087B46C4583445DFEE680BEE70374C232FE1FBA1C16E2A4FBCE3795B030787D42FB
+F97712B887DBB1685474C68CD30A6AED27392CF8EDE33C61C5CEAECC44DA2B98944D3CF40EB5
+F24240B12E0567FF6F62302C5E1D611CACD6A249CD39573F7C09DE6AD8D01C1E69EEAE713372
+5EDA78387FD25BB4E96FE593928A6915F821EDC87C1CC2B2C288C3CBF49FECFDDB20F47EBAB3
+CA3818D6D61BFC825F164DD73AEF81C6CFC01EA5077B0564000C131F4D45E66D8A7594E95D8D
+07D647C8D4D31843E10C259684E5DBB3660AC7B8D0119924480756B4355E1EC82E74509AE4B0
+2C9B8F5AC8694B878A9175E7FA476420189C487AB4C9016404F13666ADDEF60F5B9211343453
+5EBE0D172942EAF0CF53AF4FD7707D3BDDD04508A8D4DB1362B67F9BBDBB80F942608D44DD69
+88DD8C4BC013E035A27DEAC29397E1CB89DDAE52F61B52AF29EB39C15DAC92F3EA57EE7EA66E
+B8BE4622DC4CA2A7FD49BCD5196A125A74DCFC7615F6759E4BF2FAB28D7E82002347B89AE44D
+4623A1979C1A885F700B157774ECA8B5138C427F7FBE595D9B7907CDD24E765659AC9A3D8009
+1E16FDFCFBDA8A6C9C9656A0F75F4D391D4E503C00B7A4227B2D89437F97D0FD2334CF8613C3
+19FC8AE7B9F31B9265A4AB8C3B40806762227A7D025FCF7B209AF7C54455DAB03D708B2FB3C7
+C4845C0D539A6E3F055F19FFB857365FE39959BDB251FE4D36420F6695DAB7764EE1D9B0820E
+17BC3C918AD2E52F839BE0015E6C596EEC813A6CB06CF1A57A00EE4785159D493BEB152CCD9B
+4EC444998DD44630FE056C5E96E8FE9A7C44E810CA661EEF841A4F540D4F71EBA5660404D39D
+A8A03AA50E4C6293F44413E90B4BC05CA73C0D5BB2169A4EF75E1225C6555B9FB66F9AEA4A55
+0DD39B1DA07754C8F4430067325F1CEEFC48A524E521A4320E0884BDF5965DBF3EF29D6B4F00
+815C26CA5D937E64A24A7D6FD126A46EE733BD1AAC872103DCB28CA020D3B50EAF57AAFF6266
+40F8DD8A859A84EFC1504147C444526762DF179457A6FD46F7F02014F761D24438CFCB0BE296
+69E6025AA73236A5CCFACCEFF05F45FAB87CF96EACEDCA999E9D49E1E6F2D3491B5BAF9BDCE8
+5DCC9A49251AEC2589B56037E5032E9674DE1E92C97085DD5E3CE2ECB83DEFF5E4D37CCBC092
+CBA6AE8521122C21E23A1A13FC3A3CF970E0182851B7B729C37C154496250688D7870E9A0902
+CE7A2B9B22C77E58C057B2ED5455962828BB3034E5CC1EB74EC8F68C75D9EA50739DB54782A8
+D55CCA7C47B05A75E4A8A51E54C383716C0E6D59ACFC0A66CA5056A413801EB193F39DF2E7B9
+775CC59F005863B9BD98BD69B357337AFFD8BBD9FEC8C0D4518AA6F201E1820852A59908C10C
+D48F29EB8ECF19D2168CF7BB39E60E707A41A3D1B84A4704097D689DE1F111F5CFC33D8093C1
+F0F811DBB7908433E1B4354AC6A0DA559464E8F2CA94FF5092DEC40E949F6C92B8F311D3835C
+623B734B3D1F9D54F2E933A7FB664FA0DA414F608BBF614C65E644723B2A723661963E7700EC
+318115637D017AE4DE8EAE0CE6AF903487D0B3831511AE19CEFCB8B9CED35C65F94DF9806BDD
+D82AF0E521FB82A5B4CED998E02AA316A04CAE953D731DB0854D9A4E1CBD272D74AB47572D68
+05067C60E4E960C240CC2BE2AF7AF9E1304C0CA522DF528A18923F97C5CE7B4409FDD09EBD6F
+BB800D11A1C6882B8965DB70E019970E1F6E541BE5219A156C58126FBB21C4726056C1C33561
+32B85FBADB5EC981F8D9334FCBECE6785EBEE2174BE962766EF60B7C02F249882D05E8CFE782
+237F4D9B746323EFAC8BFF9C1CC1B375C620CC708FAB00BD2EBCEBA4E5C0C3B3A4011A72FC47
+4F974CECF0DE5DB304E5A06C04F3D049724DA571B64697C1A80E2059E6BB6A21ECD81A544F7E
+83C6AC240F22F25F815C20C0AF08EBA624467DD4B5645E2E1F4DEB2C760CE6CEFB0217E000D5
+A7895B4A62ED06B86F2A0082F1AAAC04AD55A5102401E897C6C50D616845CF92F25A4147118A
+464D4B94003C7BFBBF3AF22AE709E360D5DE1831994B483350F1BFF514ED4782A9C6982F7501
+63DE2A6B91F67713F49DDAC470C19E9FD4A1250030CC67868662C0015432AD7AC88366B70E0C
+6023F518500BB68C4D84080EE5B692AF1C78C35D48F4F3392B5E4FEB298DF0B869A28B8799E3
+0CCA3C45400620E9AF3D61B5F8074541BE64914343D177B8988AE05ED460AF0180D04B8E78C4
+67E83C0ED5D2C7F8613439A9808F28BAC8F3ADBC52093E4EC591692233562CD5A25070014F62
+C54F1F1A6083C275D7DD8A776E86C207DDB702F122CC92F73AED70DDC65D627525FEF041B597
+03B43840D82AC30DA54B5BF852E1A9CD5FBFA4CB3CAB838BC2D4C0B8ECD37C641885258AAE53
+0BBF0C2B279DAD677F152A1ECCBE6C89A55684483127C3D03AB7F4D8A31FC04535259B242C46
+EFE89BB7D09161ADDA5AF99D63E6B023D3E01BF576D0F4821CB5DE75CD1212DD292172006FB9
+DFB70539B1C9A1DAB6D5AFA53A133FC22F337F5DE642B50EF883F50E5E75037C2104D36E1C31
+5251E246EAD10D073AEBDF2643FD275B6569F1F0EBC42DAC6E322747C3BF4312585C97171F03
+026B81FF362E10FF09A9471224453AA4B32887553668BD484B6356FFD5223FBD8841B584F3A6
+983DBDBE0B4EB9A4915FED5639BFEB0EF3506F6D5F28C9BBC24F1B2943FFDEDBBE4FC4EB4A5E
+0F3E4B86D57EFC43582E6AF464D5808200E9B75657D53F2405132E33AA53D708D5FE901C483D
+395F3013DE8035C445B3E6F3FF15866A0A6A3E6BAFF3503E8B4DE6A37600F24F38204FC7DE40
+77199E4B77E6C9370A6C9355668E70A65F1548CDD938E52CD0E774BE108CD6ADB0894B86E954
+2FBA918E606C88299C92B250E2D63CB0623590BA7C715A68ACF004FFAE4CA76866EC20E14588
+872B8E80F2FF582531601762B7E4F677021CCCDCF94E277439FB143C5D23F360A8ABCEE65224
+FA153538AD8DCF7599752C8353258FFC0AFAB471B2046C5C99BFAC2A639000B23A6497C0D78F
+BE39308D619108E17132FD52C82AB56FD72827CFA98C9F4C27249C111552D863687717974624
+AE692A23EB6BB6AA6AB2904D066CAB913774997E38DEC623488D3EDA398552852A6E49EBF291
+BF4E10E59072CFB85A805BC7BFD9A1A6DA4DB243AD53FE158ED1EA3DD8A8B132773630C6417A
+0D6BF88D63FBD35C4EE55AFE23D45032939A052E42E5D2CFC4669521A45043A37DD06F61C145
+C93DE5405D6AB6FD632A1A2D74A45FC944C2AFE7D66C7F43AAE63CCCFA328DBE0ED033EAD7C9
+4B4B4DB0EDDB167A845A2C918FCDB3509C2F966E45E111EAEEE77E4361E86671DCDEC06E6358
+87DE61485270E33672C0820B62A53F97E54032E1D3782BD14C7466EEE397A31B58ED534917AF
+A762A63F4B2A1E6E3E46FAEF8071B99E3A749A5AFA03F45E285E6F69BF69B6601B5B92CBCE3E
+82230130E220BDBBA449FB5DF7D67066447DF60748EB5FD9A4D177B4DEED8443A55AE6D63CB4
+D960E3C7488B900A95210F1D8B667E8356E8F4BECE485A1401ED4BDAF19021CE99E09E359AEE
+DD22DE12FB4EE8933EA28967704D31639E045585813DF66B97FA4A740FF3725356254FFC53F6
+6375EE08EA4181DC70EB27433BCE126F98163576A7A75CC27EB8A9A9F8B11B806E21CC27805F
+D892417724CEFB8E4B34524D9CDB6F900C4A08FD6FB0656041DC4CFC907954C77D42F130E2F0
+79631EB8D67A289E74C4DBEA0600355024A1AE888E907D73C610A6157AFB983CC041AE3CA368
+1F518E7574E9F0C6A5C89686E2479EDD4C098EE928C74F8AF2129E476A60F069CB8F1F2F04D2
+33B47C74A5849958A4AAB9FD031008E9ECFD5034887F36CE4899EAFFD38729E4021F9BA94A93
+04E186726C24CE65A4AF720CA086CCF6C776221DAE558C9F3A6A70ACDB6B34B0946DB062967B
+C2FAEBEC9FA64FBEBBAA90401982EE34333ACFD2F7287D9FC0243A08B369C394273B39C31EC2
+DB1DCD299248371FEF0428C8C84C4C064D77BF5663A8F0B067E784BD3BA9FE3AC720D9AC048D
+70EA93BDA9A9FC7090AC36BE749A514198C6A9A953650C73F7C40B496767F2FFA303134549C8
+C0B4CA24C40868D22126A8A2FD6DDCA8535792644F109D9A53628BA787E76B6A5AB7E4B2BF90
+1F7547388839D9E7FB2E8114EBA3357BBE95F10BD70C16693032234DC8CABF420D14019F3C3D
+BA872D5C5DE8EBCAF343E18345A2B34B9D299E6E0FC49DC07A6500DFC27F7E78724B01B56523
+87F59ECD335856B76694CA43350FB40E3CB11D4A1334E86057A88F0372622DF11B4C6AE2F02F
+4E6475B4351265D1730BD0CAF5D6891764FB5E5909DCA5A2ED1AF0484E3677CFB38EBC5993EC
+87B8B4E588FF9C2B85C61F8704E1DBE89AD116C55163B88DE73FE118F8B6737CCEDFA28A37C5
+CF58BD59CD6C7ECF9306D38706DB046BA0AB5542BA5391808EAB5B2211A3824A018266BBEA06
+074703E70093CC624824A387B1240023607EDFAC35FADBCF2F238DFE1A2BF494A7BC16D16381
+ED52303AB267FE5BC9C9C71848E8C0AFC603531193E8C6467ACF2E96FB22E56C502394CC8721
+581E305295002C7316B251A9668945761CFA5F1CAF4A6CBE8F74B69D65A2307A4195F6D264BF
+D4C2DA1174006EAEE1CC0F66D50507A887834D9710C40DE47D2B12F62827585F49A76E266F9E
+4A787F6012AB3D03488F0EF975CE81882C42D8E14E2B23696B0D7D220DC130F660E758E70FB7
+0C9F6D77437B10DD6245324FC6BA21DC0E9C4FE5BC2344EEC300C6B9B53A68005A38493A7829
+EF51F89EF4E049539E237687763E951D64741C0714F60850C8822070E8AC4670AB6A8BD9A597
+733DB0C113801698E89F74B5892050170B1220F66D123396D40AD0E32EA8DC3D7ED58E26C776
+1E997BFFC7468D884A0518A201D132D535067138EBD3185E84505B8B6606882270FE2B9CD394
+66D6BE7583B3F9B1701EBD49129ECB6D8DBFFC80382A95DFECD9B35D4F25D35BD39CB264082A
+0A12B570E2394DC231CE55ECD62122B7E8AF1AFCEC346B0AE92AAE17EFB5B29B234187C79DCB
+1BF735CEDDCDE0EDF8F1E514A2FC236F37D9D41CA8E0AE329F4D79E1EAB3F345EC8624153E6D
+E6F5C5F0DBF8FA8B152E3C10412714466F2404472A78FC7B984B3AA8F6F655F13C3F1FDB10FE
+BA215E5F3561FC3C79D07BA8547005665DB79F64C015552AE573BA32AD62FEB08DBDB5304B69
+869CDA9086F7D180D6179CF2B6ECD220A5C20C4E3B6892BA80B3FAB8E03C05963F1C176DD30B
+510189AAE745AC5C03042CF95AE3885B5407C323B4349A3CB445EBEF3CF298725E1D0FD3F240
+FDFB4E38C917BF10F34FB5E5BA2D88F72BA1C08FCAE86774B0535B31DD7C7D47B066C4716214
+671E653A36759D0B19AFFC93F64B41B83DA2BBB8087B07125CB115410A8EBD9D712B6B7A54AE
+25F79B7C6C70C7FD9542FC0CAC783F3B8F8E9AC4E089E6F4A6ECB54F312199CEE85833C5E077
+5DF387123383C3770056473B166AAAD7E3615590B6EB9979D837C3558EED8645354AAB3BA242
+71D1B18B87514847C59AAC104FB483C47F3CEAC41ADE74F9CC5D86E1509ACF12BF29C6632D96
+05BAE3AE921C6EE6219BEA5C54BAA03FEAC7E4BE6A2C2570DAE022C8172DEF353FAD3BF44F3D
+38DE838BA4E0F785973FE639321022C83EECFEE606BF47567DF300E3CCCB041766285912B011
+249F26CF35049E368B855C960DBF5A84DBF4CCF68A65CBFF5A46BEB6A0E36335D886534A295E
+A6D6573DECC1556D3F805030A7853FE4F6E896A722CC5C4B968302C7CFEF896F38EA2A1B5A1C
+1C73D462974AC0730E6829DF882D4FAAA72DDE7FDB838AB8ED392257B2A1B5FA781FD572990A
+4493DF8130BACF4730D9FF732DEB84A31CD76FCBB154E383A55A3C803B07057A92BEF5D56559
+A876E760C6A08D2BF31F4374A9796F9FD71D323AC9036775B346B99E6AD2948885461CEFB703
+B801EDAE4CEDD9C62BD1AD15C45A6EA4FCE3A500C8B9FEF22A8D8D79402D6538F9604E11BAF6
+1F779323B783BB1BAE7E12679890835D150CB3196A70FBECDF3AD7279AA24189D8F75C82AF58
+A9B0770BB155FAD8B400656CB89DEC49B3A14E5470040FA18E6D86D071525F1AF2A779E4B274
+1EAE1D4055DE3B520E143A660A7E9ACBDC354F4589C59E601B8AD3628998DE791CCADFC45486
+995C69FD315E09A33DE11A09551185C1D843A11AA015C2C43281FFC38306A3A07917996E344A
+3F230465D2C42F743506DDFDB0B1CA2BE16705F4299C77DCDBBB78646FA07EDD0A411082251A
+B49CA270CA0E9C6066E475C5967A4FAD7264638C63DF88351371A7A63D0E5B3064747E5E9D52
+B99179E13FBBDC9461A54342DA3FB98FEAAC7A1DC10B6E708EF04E7A02D84C72EEB0A3465FB6
+B1C76C2216D218E64CD54CC3F690CA6BD98C6913A0BA9B5496C425138FA04797CBC1566F381B
+CB46BF2C68AE286EE2A27F8B9EF7D232CC89485114A5B2FEDA1D0F8AA97425E29A7CD47600E9
+82EC75AD3C58F4F28E908FC0F0955560F8502A4497DF6D4F7A6A1343EFD6974793E2DBF11B1B
+4630DF9FD380F0CF01BB69ED2C2B13010AEC2173CCFB4682552B2800E91074A31A83CC3870A5
+5A70CD79E915BD08413324E14B88C9EE9B34BBD92717BEA8F6DEFC8E6DCF1868921BBB6AD163
+057D42EFACDA4048F5DC536C7B6F0E5BDC3DC46CCBAE5B538690E679E7CBAFBE78C27B8DB99C
+672232AD764FEC2D7218E1FAA216CD1EEA7BAFA5AFD6220CF4D1EFF3F013D082B93565355032
+0D6663C959359E4E6B9B439C868CFA0F01429B5E976A1FD2876E3E722B1AF363466361057EDF
+0CC2A93BF4A459C0730DFE9E7C7B19A1DF3DAE8C7871C78180A1828578883212E0085A3BE918
+DB0966D965F3199108A68B3A307433E82341B50F5509A9B87D4AAE3F536FADE30418BA1AD8D7
+9E1237B4F84067345EF75269EEDA1F024030EF28CF9D79F81D8C5F9F5BCA572737D60933158B
+CD61655EA21DD1018962FB58A52891857FD440EE871E6054ECCF8CD1546827852F1843F8EA41
+C701AAC221E97F4C74DCF6C8600338486FDCA002FCA6A68B740D288F6335CB3687E9BAFB5D6B
+B7F3740DD9E1A6AD6825A4BB522489766C84AF2A1E7DCC8CA0E2669B9348CF47C77A33896737
+57CDBEDA57A079EC6DCC516B51B67C9F2DF4835AA127CACCBB0B8E42DBBD4B635DDEE5CC4EAC
+1FEAFB5BA3E104E495DF8A264C27B2358B286F81CEC983E9F3CEDDFB8B5910D81C128F532398
+2FB87588DAB1CF1646AAC3A4BA66799A18E0B833751625531932BF9096C3479DB8696049D6F3
+86B4768155148F2EFC928DB22BCF53E59F01663D50DD7C13885925C409F27D6E1D6F1B229A1B
+AEB68B423F74B99739D5912BED355CB695CD7E15285B647C53EDB6AFA48F00795700358EFB2F
+0E01F9E4C5456FF11D56D3EAB0578287CDE175F095251AB337343F4C2A6B40EFF271467B5250
+35F99F69FA9ABC2CBC78BBA342BD1730BB5C3CC07F2B8692FE89328243B54ED897A5BA9772BE
+64C9234EFEAEE62AC5155CD65A66CF188C50FFA53B5F3B78D49FC9D35C677C6A827EFF15A10B
+1BA2DD7B1F90F310220333010F36E9D93A5DACB253666A18D2346DF08C9337CE0FE806A745E2
+898B4C4890281AEAFE22FA42CA6607AEE24719A416B0BD943E416F937BA8988C6B520E6EAE78
+DE0E309BE1C2A719641517E4F3D5482F090055900BBA8FF70675B214126EBE3CAECAD24666A4
+7770325903AA8271F73ACC39F5DE03D250F2F33C6259CBD823F6F5D49F1C34E361C987160749
+13F8B0FF2521CD08914319D171CFD1E4966562083B418EC7D9647C4DE55E4E03BEFC23006E6B
+5F13CBC4D1AEC758A676B5031DC080713163873D3DAE457BD75ADE007DA158CA2D08D104C39A
+D9B316FA542C1420B6AACBAD4D493E1C772E4B1E2407BFEC694C1C9639A008883F73A4E67827
+E27BA8181E791B10248AE0E2FB581E1F6C4E7E32C64ED03ABA8E0A242C345F3CB9BF07772BFE
+E7B2E6B81AD533D03F528D18E31914BFD244D31677A2A2E1DEBEAE80314E2FB38E76623CB1BA
+725DB0CE13BEA97CF447FA3938EBA6ED2003451C6A89D948BD1EA907E3A94FF65760D53A20C4
+134A4868F81F97472F08F4EE4F4EE59F0642768C517997A8494AB19B20C65CE2F473FD9B3734
+4969AB121734534D6CC1C6BF4D5720CD01D4D889938E71BDC3B8074062849C8A1145FB69CC1D
+BACAA7FAC653644FF5F484F705793B33F73C321FBAA03557E85D3B9B7923A84B370F6F4FC577
+6ACB0C1423C7F3FAD934C29608D9BCD4899C6DF59C2398679578D26D5237379E41E967DDB67D
+798EE6EF00F59B50D8F0DE4288DAE073824275C20D609981074A583C43DA7A1370DF9009BF8C
+058D60508AC2B4DD97165063100B5A622D168C7ED7CF690769573B7EAF6D8F99DDEDB0962B97
+B9C40D38B15717C83538FB95E243E1AA1165D2D3040420737382296C3EB234EA045006C25818
+D743D175EF2A80CC7E0E2BFC77AB2713011E4FF718F5166C101B279598D7CAA9A45A9FAA135E
+69B8B73EB512A6ED54EAF33E324F5536500D5290F5477DD3385187E29A3BE985B22F7909DF43
+848372D2E013ACD50C6DC1FC4B39F5DE72DC293C565CE65712BA69AC33C23B230757C40DDC5E
+517385E211C5E1DB2370A32E4CA069001AA0BBA1D2EBAD24331AEA8692CCDE85AB67EB80187E
+F452AAF1F741C62DF21F715F51310FE22AC05F63C4E43C879F6CCD874648FF6A0D2A18E241D2
+0562DE8AF2D795CE2F285CD4BA64ABDBCBB00BA796C812C61597B2D8CFDD6BDD8ADC7E90850B
+5F60E14A2793DB4393DDB9BCAD01D623D2D9C07CC893AAE088B42EC99493E0DAC521752B42F0
+E4BC6ABBDCFC92C674167E1A6DBDBBDC5D382D1932791C25A31E114B48F8FD110D1507603A56
+9018201869834B631CA6F91178D995D55E9FF41D4CFBC08D7655209B25E74AC28EDB08DA4049
+A6400FC8F0852A6E9D1DAEE159F507A56FE59BEB177B7A8967A8B043EAD2F2C0C1117044F6EF
+5406B70D3CAB63C7C97ED5DB5A4E81C85622E7AC8255F292A4B1557EF5CAD30D5B7576E18DA9
+43AB5E37CD446C92EA057B137E47FA377E1638B32FE24660E9B27D2165583FC4FF7EF86CD53E
+FEC4C70AD65EA222AD2BD824F02754C58796DC92A40472BAFFB40A922E5302610FDA9A6DD657
+A3B3F24E2A85B0C3C84394406893F297589B942AE91C0CF13B4B25FFA2EA8A4C642A8D1C7E5B
+C6CE6DC6F89B76797568403070B1BF1A70DCBD895A83389CF931A2D1E95DD24A013CE9991FFB
+90202661C150EA7E92243DCA1A3412C7AEBA5B94681594D8DB66328DFCDA7D0705377AA311DB
+242351C6308D41068B2B0307250635DE75F9E0E13B9BD7C33F544A2044F393EA8D3F7209660E
+F6C9C24A62935686063A0AEA796F9591B9C7F9E57196E90E29881D5B4C094F6533785E48CB71
+1A54A839566386FAE57D9B6AD584508DE26CD1CD1DF3E34D41FF74793C2F05E3BD7EB18BD477
+6C0C49B215EEB498D45D21BB60E36F85A899AAAD74B45AC097C3EDEC6C36D97B38D4E769A502
+6CA365EE306B5DC1EE932F9AF12EBA52495A6B7B737129EBF6B1EC165867D545C87161B99EB9
+FD7613092465BD80BEAE681397D56E3329C63F1BA8F48D4396412D750BF3E816EBA24C189489
+7B39D4DF8806B6B059D9F0A20533EF4C19AB8DC8A0AB5F49446689E44233E4A76F1C2FBE27C3
+15C078872399803E0E58629E3993D9B62FFC083A6C957489131610C9F9A130606BAF011921A1
+5D44DBB0AEC19A2BD022F2B713C41BA0C7C7F772D24ADE8C8DDAD89053F6416305D80E2554F5
+DC9A7E21A1C5C4FE68F7E66B500D8D2E4FB2BDA0CC3A65CE609DF98B81B264484290807A7FB1
+73C4D5A01CB1198EE883E8D8862AAE210C12E84330165B83992245D5E3BA046C3FB742C55EA1
+D72A086B36D9052E981B2D7800C94B4EFA2F9C9555A1876A3AC1B49BE72FFDDCB6DD704A5BF0
+904C4A2B10BC93E81F26CD4C8893954D150299FC47959C0597F9A828E86CC2E4F987DC140B03
+C1063407C924B5F32799CC29B231E0523F6DBDC920D67CD823E5A37C44904515BF348D75C969
+1BFF90132AFAF15121EFFB54943F01A6550F06C6900C7876BA533BADC79F499278791C677418
+7C917570EBCCC804DC42930804BA24AC79B84E59476E5FAF06F155AF18353DEBD21958FEC90D
+4D7A5C97511DF5BFFEE9C77CB5A3DE52A4C4AB6AA405E3E4847900D8B774486A0DCB2AF23166
+11B246545FC590329A62EDFB76CA767F7676FF21A9D171C77F5CD310AF7AB6FFB10B74581F9B
+10A6CEF863F86427DF0ACCB2BF3EFA7BAC5B0104FB2750FC111060E5E53B2244DFADCB548C57
+3FF3771BDCE4FE8F3593B2A47C05C13FA4782A75D1C2A8D0AF80AC1F5A4AB174EA3F18060202
+C599915BEDB9DAA2373AFD71099D565E976F59642A930465A7A45CD42E11F657ED7B5DBB49F7
+FA58FB739070484823526652FEF5340FABAABE7679C3B951552EA2518240422C6EABA838EBC0
+D42F7BE627D7B9CF20D13688FAA0A80ACC5F293C00F580A3779F331A52DDE22D5401C78FA42B
+DFA0B9D4979671FE7CCB642972F047764CF5CD0E180CCAC8154F0021ED854D76CD9364A77D14
+F2C7AB778CF6459F47ECC750D9615CF348FB94C4A2259EFD2E5D415749513DAE442F840B5046
+79B5AFA05F381DEEB9885E21E8DF0EDBCA9DAD5EE47428CE2E347AAD48EE6111CBA5A3F77802
+7E8B62540E1483577235D6F02445C2C9E3364C986B51FBC03B4302F48DF7716C225DB04E1823
+590E5E64F2D776ACF6549768554DD376E617AAD05C2A764DC3BEAE8CEBC12976F1DAC2A41F5B
+32B48E412444F3616DADE10AC585E1D8B7936C4A293CE678CEAC47D5CD1395A05E4ABEA987E1
+3A0D1069AD62450135170ADD22E02570F58242CAFEC1E47089116511049AB559DF9E1406CBBD
+E0911FE9D3C1658F58DFF363D4E5C5A57FD862C347E7DA9B109AAEB6797919A358DD4C1F23B1
+04F8233A7DE7A256AEE9C9C149C6B447F417D55CDC029252B6034C3AE9FDB45C35DAB333B430
+890D1A2D3F32B6951EFC53DD1FC9E521A5A891BDA1F19B373E6A37B9DE1B1E503F78F27DE920
+911E16FB07833C734770F17227F7C76D7067DA1BAA3887EF8F16D1643156AFD52C4910977784
+06997633A63C58FC63EE43BC83C99BD80ED298887B91F3388685F7B13C0027547662CC0F64BF
+2AAED6A4362D6C6671724451AA003D87AD6B9F8ADB9636F214BD5F013C4C0ED7EB685C17CBBA
+CB44D912457FFD0F3726CFB8500487ACDD7E580346548BF165A3E8DC2C2385E105656A1E1953
+5263A09E9BD3B7C0AAE2D921F3321D9DAFE7B08814DB726F7B56C59804862BA095E4C5D3E5DB
+454ABBBDA041698F951E8808A8A5CA86CECFDEC00A2D3462861D871AE19E8F223C755B0C0F3B
+8710217E747010502F360401F98EA2F46E34DCA6BEF7EEDA347C0351B17555FF0C61CD568135
+022A50589239770213A5324AF5AD0F68D85B5A87D5C600A966BD16C7F2C4D80600935F14DBBE
+FEBE33105CE41716C0E62A1CD18080E5407B0E55D575BFB41033E62D7AEBF9E61415D3F32C02
+E56F018BF5D9A8B8E47A0929EFD0E4710D52DED51BCF60B8F5DFC9FE7774F0B3C4C0D9E797A1
+22B7A899B5FDE3F2E6C636E3BE4EE21ED25DA5DBC2890ABDE56CF5FE7C47A7F04E86B204067A
+E4FD00C32BEEF0939C128DA0F8601902AEED5EFE6997B313B668BD3594ED719175807F03BB72
+16F722884631435E05598B91AF40580139CA927CCC50746DA1D6D68AC3567E9A3A8DF77A60D6
+03DFFDA9761C3466DF50C8FD7C298AC713AE7674EEFA2537065A3B6A67523E5C4C4267BEAF87
+1B634CD26392ABD8538A54C4CBCEBD0B7748B31DC43A05CA835730D0E5EAB7AE8A861256671D
+FCE6A8B2D37A4B7BD7132179163EB4CEBA50464B439AC81FA224C8F7201C345E185D53D14609
+728BE0EA91B584E78BC2E7B88FB454025FD92F0423E6C821A2B783CCF3FC8D7F2A7155B61096
+9785B346C5E4447513AD7650CEED23C2F991A8C3DC215953E222AF8456734C56764E3FA539E1
+A502394367E0F10CA1EBAEFE867681C6E7C5BFF5433F68B9735E6428A9166EF62CA43BF02036
+DAB15672A3805C9EB03E9EBCB6FC16F943FBD67FD7F5F1D25F64CB417E038569040A4250A15B
+C0933C6C86B6EA0D59B85BDBF0EDC9FC3BF184B440AE5E5136B762A23C743DB47201437510AB
+1EF118990945F9752390B73F90B9CCE7A281CFEFC1C643CEF2D67398271F7236B1CC124AE22E
+AACD04B922BF405DD4ACB82A7BD28C4DC9B2AFC7B152777798917A1BA5C92C14AA34321E94C5
+C3307F8FC1AF824C52BDAF7F51E95D8CC79B6759D6073D68AF725410BEB923DA287CD54C202B
+91C738FDF5A9F41A4C5F0A8DECCF48F5B579025FBB83D8B039AD73C82EDBD6065CE626F5CF8A
+838ACDBA15A05A4BA26984C1D7D906A30CF6FF28F443E967FCED75E386F14DBBBD58527163D9
+050F1F290D0F9E43873EDFB865EFD791D1C5BF64582B59B8C1FFA03BB8CC90CA43D466E67333
+A7AD14E3BF24F786D05395A04E32C9B38D5ACA70E10A3AB5373D59675DED7D69B4463C43E071
+59EA1A028A5AE1125C637E430C0489D5E15C8C303762165F66409AF63C3A2C91506C56FC3641
+193A79A630AF6ECAAD5D83739E70909727EBB4F16A4BF721D6FCDFFA5D954F7848DA06E28FEE
+E1D283708165C220A63B4A864D9DC5B6DE0354BA9353CD2B494261F7B257B0A754B3CDD52E9A
+EC7C566F507DC292B2471190D3EBB72A4E1BD8A42591186FEC62E549CEB7BF65D7134B36CEBE
+73272E8C5F8D72CF2A9058E05AD3C9765937F570B802BA20D0D02AB6E1B6BD9C2B396591173B
+4C10976293041155FA4EBD82C51D844BA8F80DF7CF5FD65E3600694145CB35A450DDE4A8E878
+56044CA5D60337ACEF015930AAF0EB5CDF0B1E1A68BCF30BC0E7EA5D5C2736FC3CD262CAA6A9
+0E9CE2E04EE096305327E1C8FD3AF080DB83362C48A141FC130479EA1DA05EDB076109F2387B
+F05FD252CACC81FA1903DB9992ED1F64E2FE510C642CF4CFFDD4EE7B10C089B5C86E5BB69DEA
+2319C2932FF45D29DAFE3C82CE7E40674BA0B3D7989CAE0A727DC2A235D87A59DD3B4D35095D
+FE3C155C6A81E101E6FC517657BB369AF76F6E1F336CE401711D6AC2A8F59EF8639E3EA31CF9
+0D658551B204D7FA73620C0F58C9C6F31BC04AAA58346EE5EAF4A909E5718206FA5DFA33224B
+864E096092FA5F1CADBEF77CC148839D34BCB5FA37534E9535A89677973CC3074D1AAB7DE161
+902209CF7BDC36A72D819B3F56EA89DA7311EB7E9127FBD76A2E4622A13A8A75D086B233E4D7
+AE468EFB3E891B98029C051CB3F8CF448559121E36CB382CC227349D4E23DFB4B48850E43703
+1C43BAB97A3DF6BA3745036817D9E2A279A72F79FFBA64CB7BEDC67F003088E4FF9C67B955F2
+B27755B4BEF3EE2004952A07757BBF35D867213C46EEFD6F3E7C3788B2FF6395569C6DB9B754
+51427FF8C981F93CE4465B8752BA981245C02D0114AEFB57B7281ADE51976D058020C20316F4
+03545D1223F759470E0F13615344F39EB233C4C3B7037D802F14AA61AED76F095928A791497D
+A74AF37D9E6BF3F9279100ABFD656C69D3F213501D581FB5431208691E7D1C93AE306642391C
+361ABDCCD0E2C8C2B8866FA235E37E306EF9E3A7F8D157D08ECEA6234A118749C1F8F86EDAE1
+B65CF9925D7661B86DD88CB1284CAD6D5BF8288B75A7FC1B4D368C67D4268268617017A7FEAA
+2BD49F2121AEE3A5B86E1C3960AF8AE73876478F2FD6E77D9897DC2208ABCD87EA3461A32717
+CD25B7CE6B7D67E233D2B6203B779017CD300D07463E856BF938B9BF72FAF468426DD43186AA
+9DA5DEBB10E12D1F35F89B464EBDA702FFAA4673D99CCA3ABA68741FB9C2EF7AD75A262168FC
+807B6C7C9BB8DDE5397DC7C03AC3FB540DC24C55271675696CB79456ECFC51D623CF61527471
+48ECDA89B0AEEF1388F71038A8CA246931D47DA52D3759B66491F5F8845C2B295BDB417512A7
+30E9A1D9C25E0645E5031ACF12E66D25DE534D3C0CCAD4FCA5C1E12177CE38447A8B427941E5
+42650A8E5F4430A46B3F795718EF2CFA98E9AFB21A67FB9FC1C2F4A87DCC11BF15C9D1420AB8
+37AEC4A0F7F17916055B0E829711C1499538AFAA83DDFD7016B89951DBCF1A8867A10480DACB
+7FBAEFE55A8E2A54405804378F11CC8085F7DD8BC2325268FE003507EC92B0D9A3409B0F0E01
+BB0A05C4658C8B31F7E14D5FC2620BB81AE267E85641F246C7F8682B910A08939EB3AAEDBB71
+7164658976C32A53A2F93B60BC4731A1095F9314F31CF644D6E84A5F6F2D0A33F2E647257EF9
+D5914E315403FCDD5A7592E11DC091296A5E395D89DA8B85E18ECA098CCABC775E64DA9F30A5
+33113A5122E2E2BA128B0BFFC9BEC9EEAF669E88AAE1F659784F2907EF646A58F6644FF150F0
+EB3671758C81C882425249EC0FCF7583B160507EDBDD5A362923A741E4FE92F868821C006354
+25548AEEFF3C7C3094A651F9927CB7D0CF9C895DDEF6EF8BECF94C29816A680323DBA8BF395E
+A2371445E74A09F90FCA22432FB4FF9006AC2789421AEE701D54617ADAB9CF351C2DF459626A
+FF9DD0D5D5D9DDDD2CE5A42A5FF736C5881A86B94B8B20100168DCEA4466F5DDBB73352B0C81
+C69179938DCC461696702A3FB77DD6D7513535635E20788DC2A018281FB7231D95C9B9A94BEC
+E5C6AE242126D38FC6F69D155857C1555031925AA842771478C43F7E2205388949A231B210F9
+696D14D18CD37AEFB0DE2D2AFDF53C84781D5740FC9C969145FCB45787E3E26EDA743C91B2A7
+E10F248FF1B38558A4F1447798FFA9A41D5E5C51F506560B3A33F632D856CAD2BDFD470F330E
+6697ADF166B35B56C6BF3BE3D9B7896E714D84AE2E0FF67ABE9ABDDEF5CC0556BCBBA38F6DC8
+BF0D40C6F4970C3EEAECE1FD5A4C7461049805A2055C07DD1F200A34D6EEC6DE966624F05BA5
+714EF2404AFA3DA5F86F80EAAADDDF370DF0223E94B61550130C45E951ACACDEDEA426731FA0
+FE64AC5065719E3D691F57B9B6CAB4F0387BDBC3641765D01CC4203DAD4EDDC2E1EA3B17907D
+A754E2DECD4BC1D14615AE2C35FD8BF10BCEE295D8D3E2D4940821FAF5877D1E8AECEE7C0803
+01D7121913D27AA371B88FFF45DBB25BA77D2710892E425B9F4266F5B0A076F5ABCCAB3C0155
+95F04440EE4DDFB38823038C993DBAA31E5AD5448DD4972A2001C707372135CAFEED9B5A456F
+48E638099DEEB70EC360E2DB2B39D7A77328C6B3E84E318117FFF84BF85C6D195EA19811965C
+FD9D735B9F211BA3694F3535C4AA235DA0D68C20B37CD60454BAAAECAD3104FABEA8707CC478
+1D7D733A0D51A7E51D8876AB30D741BBB0F09D9A9656A4B00464D9FB215F8A890C94126FECE6
+CC5639FD3800D98D1012BA7B898C71FCD011F32E2E2967187A4B56E8429BC3884E18F96075D2
+16AE15C8FDEC5AC747F3588A89068CD72664D7BF721EA7432C919C4BC40FBF926EBDE67C2E19
+133F967394241852D1B5C7604581CD8AE1AD3F1C52898320B336D30000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.1: CMR9 1.0
+%%CreationDate: 1991 Aug 20 16:39:59
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-39 -250 1036 750}readonly def
+/UniqueID 5000792 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B448685BDD20EB05D5E7C2126132E33A59A717
+0609DCF4871A5D023C9EF57D3362D9F2D7A440BB69BF653364105F16F4D0F03582F9ACED3D05
+CC76489B16E3FA8A446094D30038B06ECCEDA269F2EAB9D19A99C7F939F9548F206C5A457A19
+270B2B82C43B091DFC5573468EAA3E7A4A32F8042891D85E4B180FCBCB3091D2800E54C87D84
+CE9CAD6869B5AABBBE47F40C68799893D22B765295E1E69E33AA048B7ED98BA480CECA91F3EB
+F8EF85FE9A3976909626B95AC5940D53F9B02215D84A44837BA25ED15CCE0D504F1D33506559
+4F3BC8245405407591CCCB11CFD4645DA60D960C0B93F187B0CF7B105543C0B70F89AF5D264B
+6C026E3AE646ACF145950202EC73282111E3E601CF2BCDE22CE3EDF6DB23516481420F26552F
+F4472D749811F27768150450D0D0EBE3C79F999E99B5C0F22EAEBB12D97782B1BD91B2A1F62A
+76412548AD53C0DD411D4A08C0F071C2C21863D9ADB75A4621803ECB84C2BB235B620B658984
+B2D8E0C4637E2811BC8F0D046C8935AFC70141E1B2D9C23BDB251D304B3378FAF8928BD09686
+AA0340FB0CB1DC48C996EF91530FF078666FAD227A3589F50B605267212D3A65EBC1019A8EEC
+9A0739A00279471A01E1505C17658C10030FAE32F274FDC8C8774B0D5406C384A1D17068DCB0
+C2575C562FDC5A2176609BAD9A2C255E426A4325A4FC3053C7B32F35F7BBC9AA50135F302233
+60FA2FBF019294B1D29C5E2AA489FE860FE1A8795EA9F2098A92C845BC50220471AB711BA6E1
+8C4AE211F10A172C60310C10FE9DF9EA1CFECAA5FEE0FC12063F8F48F26955F5809F8EF09DBF
+7515C7EE361CE74828581752D0169CBD3A850793875694C551826A537F8F736C280C09106A42
+A594173592AC22D8837B551670E96F78B71486427834F531C345F233ABE4153ACF5307CDC6BD
+FBF55788BCF0826812EA3D220AE12D403B7185C3DCC1D211F1FEE7BC12A6B005E4EB8DFF9EA4
+F388E39D6AC968CA08B6FDBD3221C01021D4559A396D424C14BA169501BE44275B5C72470C71
+8DBB92EE844F7DB9A5938CB340443B5FD69C7F0318056D55AD66025179B49D484507E6E1D38C
+9E3F20CA96B31EA1892C0E8B844938D9EA985DD202056BB54E7EB393147E7AB32B335EF1002E
+4099909E199154CBA70736830E49AAA18482203E1DF6C36FC9E661B0D4B4E9935A30127A1771
+ED815451983AFD8E6B9FDB0E7526D9566C2C9BCC5A4F8D8B69ABC257D12D97D2771FEB780A15
+BE513B3740F4252534F0BCAA9C755E94AE61AA697BF689107C4FC5841E9DAB101F3B4C00DFEB
+A79D50E74204835B872160AD3BD77E9CEAAE233C72DFC902BD16E457C7A53E665D60D6C87429
+D3CFDD52E7850E490A5F133082D17220A3146C19F0FB45F99AB9A94180FA8E8B19DADF23DBD3
+E2A099D533DC3DC0229415DEE606683EC67929805DF2288CFC116ECEE35BE81DFBED1A77044C
+BBDB7FF8924D50763F9DF29B0D67A7105C455F8A853F80E58D25AD263D860F2E31ED1789C198
+F2C9F71F8207C331E9A81CAD1759D93D65E6EC9F607F819C136C2642B192547CEB6AFA4B24CC
+B316A9B16426BF862316154579CDCEA5AA8AB67E9C68717920124953D48C429E368FE62695A6
+C755FE17963F4AD10EA11D1B043C73D03FECED825290C562041E819B81682CE89E3A8D712FE1
+A882B312A5786DC2AA373B8C733A1D29C641DA4666D939DD2C1ADA11B9358C292205AC7AB478
+7D14B38BB01AC9BA36540E3A2B9A1BE959BC5617EA85C2E67EE039578C98C94EA95FC8055EF0
+DC155B19ECB1E540FF78D579E629350A957DD0E41EA444B2CF13A2FE054E8952E97D9E2B1EF4
+9E63BF6AB23D3B1B208A2C030588B3B635BB798EBB1AF921F801B2711B301175CBA843307E7A
+3140C30BA881D13A533415D46E4DAC4BC37BEC8055A79C6578EE31DC696301C41EEC06A93A4B
+6F35B90D3B2D2B0CB23C7EC2BE8D09CE2C14425C1426458BB270284EC1C9389909CBCCEBEBEE
+A168B102B92D40FAAB8D73B1D610C234705CB6349ACB167578E62B9FD886776A51B59138A33A
+7B5A668427A8E86EF022BB8076C6BDAE83349F8C3B2FBC85DFD0E981926E25AC33983FE117DF
+14B94B1B6A3A3D9C8AA229D5BD71DE6DC3C01DD803CCD3EC679B64A9FF6E2B4B78CD3D7FA85E
+E7EB9E159F49CD814DF9C976F43A5974F66D7FC9BE938CA166FACD1F28F6564D3F7EAD59E5A6
+3E6AB443366F74E543BCD4A23073AA56CF26B12BE2498BF0AABF534290F45FCDB10AECAF7E0B
+8F124ACC5DCEBC60A1DD6F877C4F00F03DA11E2716DE7BDE52EC348EAEBDD3E2547051B80652
+69BDA67E6A946D735863FD50919FE961DED54F53EB1D5DB088B3F7B2D5EDAD30A731A85E19C7
+9B658F9D1E914E0189FAE214687B438B2858A0A660E2436ADD68ADFA8639B15694BBDBB74983
+8ADEEAD0A53447B6C9C46623EE15FC6A66B014E70E29999AC5C51699039C6504F026DB30AF28
+04DE56A155712CDE2F15B638F50C7BF4D3EDCF224C5825111A48CC34A8822C8315A17C1B5874
+B2C115C2FA893AD13043DE08D2DFD2F9521AD7C36BE22C61DA5D422E1E9A29B3C555307020E1
+29236C13257EA49F7494C5446A2BD8B9755566F68BE651E1E4BDCFD8136587B62DE3B79977D0
+9BA18CB403E84DD8194586EFBAFCE53697EE87AA0615C3CA76DD1023E36343C390A145A1306A
+D53D8932003D87263E5CF260AEA09EAC244FB41342ECB2F0C8F3D0E06DB67415034FAA24CD46
+883A5A8DF7128DD4A21C4CF6E76DA7696AB66BAB62D31CE6B563899CB066E2135F5DA74050A7
+7FD3808B550E477821B5B173F6585E3FB6CAD840F33606D65E2460E54FF603257735A6728F25
+31F69440280766BE322DE460EEBC2583CF0A8801D13FA4F636A1EC35FE36B02AE7E7C23E32BC
+0FC721A5F372B81EFBC8B58C3343CE67E34C1EFF8FBF229CE4F06321F1D580FC186505535989
+25D7AD09C9B9DD3447A2DC614E1A7A330E0DE134CC469B2EDB8E31F9663D2BE685815F962AE9
+B1CF51C8584062BEA53BDBDF52C5AFA07C0CAAC0C9F92F60CA7288DD7EBC53F61C0F670AD5CF
+C5E35488BA9A8305A0253628B4357993933ACA122D43D5FE9B76E881E86C7AC2B4DD1C96B527
+4BE5FD69289D9C37C95ABD38FAC01D7933458ACD06170BB1C87EF09BF45F75AFB40936611DC6
+7F3A809F5E9D82286A7B157AB8CC8109733AD1DCFBB95E6CCBCD8CDA7B8FC2478419C8AD0A5E
+51A274B11934F69C5FE4C9BA16A2CE0BCE57FB888368EC93AF6A1DEB09AD493BCFF8529A4D70
+422E3ACCF3E2F8B0EB8293333BEFAF1C0733E29F4BF1D4080B2F32778997B07941B59DF460F9
+B957D82EDD5596F9B110894123421FE8BBABA45C0D69A03A3432C02CA9768CF942AEEF860F40
+0A3E837FF346F0066C4C92C35BCC3E207227AC924E7F9E282DED77CF4CF703F89282571D3FA2
+A7218E75624E153AB91AC251D4B221A93BBD47DF57D70D8F95855CAC83EB021DE7BAFD06F550
+803A21063A06AA03D5458F697CABCA2E5AE12692C7D118C15B8BC9B299E8207A555CFC2B419F
+094198BD3F2F4F4EE78347415AC1559A224D8957F3B610A1E9FEC3DB3D4BEEAE4016C6950858
+8C9CC5C7976966A4D9AD20AF67EABD911A85F2DFFE448AAA8F6A0B2568E393BFC7CFE93FFED7
+861D8C455138DF1661CE4F8ED9EDB500CBE6DD745E43E209E81935CCC9F8CB75E49A3B2B1BF4
+3A59B993B361FE0F8C3D80561F071F93F04A1865A3145981F1937053EBED55DFEB7E5B4A1532
+C1004924D9214007D04B35C162A40CD23794F157FEE32C667DB378B42FA66C1365E95D770BAF
+BA64FD7659806E42BB3E1A33E0FD213B6B3CACDF3CA24881B4DDF8E615B616A32C27F00E9A5A
+4EF256BE36108F59CFDE91E473A9E403B675EE70AD5D165D2901EF28EF82D4FCFCD23FD51506
+41044BBB61B5B74B4EA4D0ABEB2546100AD4620B589586E5FA6B8C3C825FF0DC811045F6AC1B
+AC57EEAF487319917433495A956F4B0B4F2E113615CFC62DCC7D46ED424238187DFD734D090E
+96C308A573E62E96FDE5BA3C8F0D2DFEA845B48C34558241299111CBF1114492F790D2808CAF
+445FAC91499FF2F077B137C28FCE443ADCCCC1D5BEFBDEB8B64C452ACE58B96405C7244CAAE0
+58897DE7AC76549BDBF2D541DF175355DABDC292B4DF85B9E7127F794E1D328161690B0D11CF
+91DDE93C174288419871E8B7F0932BDAD96954FD1D955767D8CF3337C78FFBF8F7565E5FB755
+E252D86FA101A3A7FB119ECB3A893E5372FFA1DDF431781162B15ADC845D6A81021EFEE6B91A
+8E2267FDE73984FEBBA71AFE464F4A5FE5F908D06838D317F2230BFD733DAEA76A404ED4C55C
+59F3D37D10F8D086E5590352D92EFAF0D94A15D6FF0E9B9942FCFAD9EBCEEE42BD47D627BE8B
+DDD5A725E7893A62475DD24B4D9DB0738B5058A2A26A00D13006560C7F6D5C302CB6E6F9CBE3
+CF58FB6C6405CD6137B938E7F16B07D0B1A6524A3D34735AE75528E8994D2C944D90BE3270EE
+01D4C180989A1C6E0EF34691F0B168B33957DD1FE0E8F0B5D213CDE640D9490C8B68D8C7F88B
+D1B1369CA8A8911C1A8E3EB64A640FDC7BCAF45B3CF69360B1265E16302CE6EE2DE6F872CB21
+E4F6A2F232384B704F2F198F8603FBDA728B15A15C96F473E471F86663F25ED04CFEE32F3E1A
+B4E2EB241D0E347A245F164198B1355F15E237E4D00FD36279DAA3B8F826ADF11F2E241C4FF0
+8B7FF1F56E4E42312EB34C8F1DF5EA0F9C75BC377F8F3E842F09B1F0CE78FB0621DFBE87DBD6
+B052B7BC67D66D9242CE2714D54DC5DA474D7EA79DED5A510304A77A96C790D0FBEEF2243E4A
+3CFD2B393910C4039432ECF531099FDA34113DDF106E81DA407D901CA7CD99712B6AD589B1E0
+E36E949D0ED0ECCC5CA3E435B33FE26315E88B04A29D1BC179EDCAE2DFAA32980A32D70CD55C
+22AF4A15FAAC46AA19D0DE0A69A9D31F36388BDC7AC2572011DC394BBE8A602E0A0A870F6693
+DD80FA1FDDF9142533B8C5E75CDED67879560FDC4098C34C856C3D35FDA7A161BAF08CC4CE54
+C06C512B1DDF9955483CFB324E9B04BDDBAC1501A1C67491EF95D2548095D99959257582905E
+824E26071733C83F3E84F44F7FB1F4549D3245D750C5F34953B152ADB57EB3BAD5FE23821781
+FE2F256EA4EC2972243089AD1F7A001E1D9C2D680C1A2BEFDC23907EFDD645EF39C55A67A847
+73F0E9F5F0D64109D12BB9DFF604333BD7555D5E3EFA5A14192E19E38496E1D42A55009ED6FE
+53AD6979A1E56B5FF2C369686067097E6506B912CEF34F019FA6FA39AC99EB312B1B3AD02DE2
+35C40C65E0D505D062C7133D39C03EBE4B75CA6FAB5D02B5CFFBAF537EB5C4A00AE18FC50E89
+CBA3F7FA31FC6008C189665740A6048900BF94560F32AB5A34063822331D40B98524FDB23A25
+650882399223C8F327370073BDA351D165847D2F0B1EB6545AFDC31FDD29324563F9335DEB05
+7F4E1BC026F34FA9FDF0C94217250A08F5F8937C8C8C113FB126DA522B92FC8D70C5F04C6B17
+24E1B2978A5054AC9B43307F1C173BC6B545DC68BDFBD5BB5FDFB340870B2D147120817DFE3A
+8D382DAF3BAB1A53E85FE476B1306DBF540AF07C439A765CAC5DCA4AA6F4EB43B2F93C4985FB
+269E0BAA5794D3C02217BA8AD52D8121ECBF0C3E806F91206E0EF43FF82F561400DC2AAD277F
+C7665543C01C7E64AB886586A5BDA15C1AB6DD4E482475CC2E00DF1D355A49A1AC2E57CDF5BF
+A64235E1B23A480D0CE94E656AC92B1A48F2D2DE0462CA1C7A5B5B4FC97E73A262E9F17B3732
+38BC7C777DBC7B927ED471CEA8FC86E8547DEBF728216C750D460DA9FA857F92DE48A04C7C68
+05FFB805DE8F03293D803941BDD89C1EFFACCDD6A9EE0AC1EDFEDE144FE786F50861D49FDB2D
+089D24F98868FAC405264E4CAAB7B05696FD4D265764F8EA28B74E405AD12A4FAB428AF41756
+5238C72F25390CDDA953D478B6E564DE04A596B6210362D0B3F37404CD7DE65081CBDD5F4989
+436C4DFCDE6B238A4C20B3067F85DF8858A00CB8A4240F3CEDE461E82A44B6DA2AD6D494BE30
+10B46E7F0B6DE9702B55BCFEED0DD89A1FA02F772F52F8B833BBB43EE2671F7E78057D2CEDCF
+816C24EC3BE2DABD2E2E8A9BDDEE62478E432EE1BD71C7F79DFD10C1C184AD1499283D557ED2
+84CA2A2AA7876D90F0C9655100966BEBF404A28E19130F38657F107F48F705BD9688EC2F68FA
+DD38490FD9FFBE2113112EBE30598B9573BA39F1DDC2812A567352DCC3CDB54A677573407F69
+91E22153318B0507B35736307C1D1377621543A0987F93E99198CC9B022A99BC5F5CA8FC0435
+E723B2D84505E279BE7760FA38107631E82792DCCC71C3632904E220A16514BDB0080B84EB9C
+74405BDB19EAC2574C0A7986A36C72961A55579950929C73489F0A07CB0E2A69367F86B2E5DF
+88753AB8728DCB19FC80BB077805470C95A881EF657B842F00EF72D9FE3C754DA84AAA5E3799
+041AC567D789FA6DB50C1B88C7CF4B5E39CDDF19CFBAE9225B46B0AA3B83F9B4E8D215AADD47
+F2BE0794BBE4683FC3F5AE9301E7D16E3798E55B193A2AA1E0C2F61003CFD6E10BC7725693E2
+705B323DE8434A2509293B278D71922F4BD432C2481BFEC17873B74205C5DE79B2C57F518F5F
+D0F971A4EBEDE17E4A034C5EB5A33E2E0E03BD6F61BC7DE8EC3882A0FC885F020044D1AD7D7D
+7E0DB4C425BAE04FCA6953B2BACBD9FB2AB7C015B72EDC5B05BDCDE08455769EC2A76E4A557E
+CDE85DB30BAC84497B35BA2BC581CBB60112CE4DBB17D53A18EFEF227B049F3444CECCD0E788
+0E36AEF24920A2F8EBA2BFC07E91F07F186A80E390BB49E786DA672CFAD2DF5CB7617614D6E8
+65FA2BDFAB653CBBF6A617B1A3BDB61BB8750097E0CC6CC94EBD23438E0F8EFF3F12D4529523
+BC5FBFDCCB4D4F29271182B3A848A7B55A46262A9BA3BA0FBFC983D136B8EC45F4D29476779B
+93302C1DF35C73C87C1B340C661BC4984668326F7142227EAC1010273593C86198832C8D5594
+AD30E3C90672B49EC8C3E25C98C065EF239C4F0AB97413E8726E7C0766906F4E70034FA98314
+B9F3CEFC13E40F14A7883C4DC850EF4CC8D637613033D74CBBDB9837505E2894B9FB9B33E624
+659BBBC22826E155D580EA8B9EF3EB27C070F619ED7EE7EC0AED05F45E5D9C4C6B6D6418E019
+C81E49F18FA808C36E501CF9FCBE138E683F914B25AFAEF8E017A3E894271F01CC636FA29537
+79A4B783773DA5DC3C70EA5D0178AE18BC3DA6A4267507029D47A552C7091F18E4A7900ADA98
+73ED4D472FC0A9CBFC3B08A2AF391DB35093EB03A66A99499DD68A7D9D266EEA7CBF6268E81B
+2ABA51B49A9869891E0435ACC6F9CE402AA1DE2A496EE5C1200FA4E2CA0AE893409347A21866
+D32808C3B918F85CD4B412A3EE8668605860D74BF0F13CA4AA1D6DA673AF97CA5FE989E348A6
+756E003CBE748AD34E0341006939E03D47182EFC7C45171D4E127FA471A934FD2C788C9202F3
+0C7E2AF2C2D71F3A072A2A00A1A81AA55D8A546235ED9177492EEAA89647E6C3966FD7BFD46E
+BFAE9EFCB7DF8BF03B1A4597E686967055BEA5F3B05F48D3CF37C33CE1C17B911353560CFBBF
+0595C41CAAF024FEC83E4168239C22252F5992569B275B628C8CCA3229EA4AF64221CA6D62A8
+84D636E0854A1B5E0B0307B6FCB3C6E6B0F887E516E132F88E1830C0801E0197B9CB76CD9A83
+13BD3A7940D7C160DA3D9E67B5E89C9732C13F24CFEDCB7ECEEDF1BD323FB7BC5B3BFA8CCC5E
+081FE114A5414472DAA4F889BF94B387979A8DBE36998C4D61FF3CF84FD9D492E91CB09D668E
+DAC03C71CBF507E69A37C9C5884BE278EDBB604E7FA0A2B276CDA974571FDC0B645590723B6A
+571263FFB8A211E84B27502AC775A91856D368D3E776F0050AFD4F39FA9C321E405356D060CA
+26EA89021F48FBB183C9FFBA571D5E4326405C8B6EF0C0D7E8BEFB66B06E3329A4DE2DCB7957
+E41BF1345AE0A40538A9EC7C063360A81B3DBB7ECD87D28666E59B105A5EDF2822B64C34CC48
+DCCE38E4DC8D49E20025B3E3BAA8D798EC7ED6B1DAB67B87BB1CCC3C91390CE463CFC0FDF02A
+DBF77DDA6E3E3F812BAF56D822FD081B68BF59DB3DCEC4FC052E92A653C5E399F749DAEBFD18
+C9F20C0699E18E1BBE3E4275F2079E59587B4462B0D437B15CCABBD924AD25694782E0395D74
+6991DE195D5CFAFFAA3BAC74AC86CF67B66EAE6B9604E796306096CD3DAF489AB2711270F5DE
+B93097F45AC29DA4C7FB493DCF76A56278BCF2627F49ED20EB74852C00BECCF2FB1D69AD40DA
+5ACC2FFC20551178F4860776CA2EAE54779374AF1CA3485F314969403B33F4C61C78FD76275E
+D73A513B7E4FA4F2A9355C013E4A981D21FD319A54F139648244D6B05EFFF45D94394B0B5957
+E33BDFA11CFB0EABCA6D8C69079452DBF6ED2C934F01C4FF3290A773EC24907B81CF658FDD4A
+626F37AB3FD4B37F0CF439BFE461870029F5785B7E7CBAC4594DB8C51F8CF2EDEAA2E0190791
+A0AD7E35CD2CC66D5F5152EACFF983E4A12D321C6B20AE605DBD8A323A53F92B6F5B0FF37D40
+2D46A9BDEADCFB3530ABF0E0760C96658C914C4861016EDE63722F522AF61A888108DD9BBA4A
+AB5B5C6C8FE89FF9A4ABD054AECA521F88D96A86FF7EFFB5179EF3FA6549F473A71F84F11E1D
+C3AEC1719505D1E6B7DEAEB3CAC29972ACAB9B8770B53F5A6AC993C74921847D6A566BC96567
+4B3BF7DAC1718854A47CDA8F89574D566EC01917C43BBDA54D50419918A84A3118093F990312
+C37CB5D67A406142DCB578C810F27EE33034666D7DFBDAE9EC153B2889D38DE3D923778BD5B0
+D6A00FE38E7C3794D29231BB0118F54253B7F10D9F245E2C884AA5EE365D5689BBAFD0B2C2F4
+046C5703B5C01A2859D7E7716ED1DDFDFCFCCF00768061B060F48FE16496FEBDEF964227F0DC
+7311892CA3F2605B59F2BA1242A882BA4E6A986B61CC4146D3AD1B4CEB6533319C47E7745834
+FE9F46B9ECC7CDA3E283C7C5F744E55377DBE88763E48108A4A1E2DCCB57902E77EAA7C95E02
+C654950E0644E329D2B7875722CD3E573C5ACCD5CE0CD66BAA840D0315D693A8BB275FB821A1
+FAA9EC0EEF490578473B3705B327E41BE324B088F424E6BAEA36DC7CCBAD5D23B8C5E4A19A74
+2685477C8363BC6A84B2065A1E02AF63D6C33555D5E6A8BFDFE07F2E86ACF69609B7898790FD
+F53D8D5B9EBE7A33A5252EB71FFA81D8ADD80BC11004F725124BF3782DC99E76B702AC01E0A3
+2E1BA317DEC909ED48094801C6B52B58BFE0B9498CDC28B83472DB91D3CAB55714E934E08BDC
+5027D907EC675C94BE19185B62A8666A8777F139C58445FC70B18AB35D2E22C3B9824A38219E
+CBADE61729037510BC840DB0E3D62C8A8F33CB124F12F71DE5CA918E3F593586251FA72E8D36
+A992AE354423303EE1C2BF3D3D37E64EEC500B31ABE2188049EA48C93A1B99D9A82B2C813224
+68560F23EACED62565F3301835E8F96335592C227169FE2ADAA1F7D8D6474118F9E00FF26D63
+0F86DC9509E021A59DA152198979190F2BD180AF8E82ECDB204D9A2FA51B182A84E958929F18
+3DBD8BE6575D4C13943F00ACA12C2EA603B107D15DD7401CBD5FE46413BF16F99DC7618DC526
+EB041DFA841D964A6B5B438C1470EADB68FE4E97D4896395C893EF7177C2909DD9BD8AE8F25C
+1A71A6FB7F9EE515715F4361E0B01E6130EB3506E926475F4F1A8B7E162EDEE25286E7565448
+9CCE65A80C54B46C6EEC990A8F5006697FEC8CAC1DC79B6420501A66146EC648E49F5A1A9739
+25E1F4FE865EBDF350D841DA96C3FF7D9955A9F4C3B2991409A50185E20FE5FE331E569CA978
+6925306020833F9F304C9780E8A142617A0B4758AF5BF73F9DBEC6B0F3DCA36648CEE09C08B8
+E23147681BE470A753DB32E84089D2AF3BE64B9C242182B4AE759EDC6CBF43E5825DD2E86EDA
+6686D6C45D769BCE34EA05E61188E4491FD136CEA5AED10E228E44CFCC461B507D2DA03A10F8
+80341D2F0DBC12F8CEBF0A89F1587E249E6D2089C8DE18CFD1BD691EFA55C66C71076094679B
+46875C78397C0081075EB45DB6DDB519D685E98C44A1CED29E29EFDEFF2B76137F55E1B585EB
+84B8AF5AFAA54DA43001FFD88A84747777A7FCDE41025E6BE63F0CC91B97256903DE43D3BC5E
+9CC0572D9DE3D185579310E93D6775FB33EFD1838B2214EB2332C1AACB0EF116106867A359A4
+A69297B6735176FC07FCDF7DFAD6C9009F87C21B3181796941C2CDF8A2AC2EAD7A70143D8B69
+29E1E36AE6C45035762DC43EB810A2CC0DF7A826376E9C08D7BB38360E0FC2B60B6ADCF4D560
+99D954C5436B4F9C2D15F8429BA4792810FB13E7DC39BAFC1912E1BAAD45F6AB0327A5D93FDB
+9D947185FD936229E4C99280878D91E2018979B583FAFAA33D5D4730D57FA680922D28B12D7A
+F720A080207D4EB4A10DFBF3F77CA336D3A12326A5C3F710AEE63F2767C2074199C9E2CA8851
+7E46D019A8B4F880BB6D5745C168AA0492B7569DB707675D485067F313A2E1F56F7A2C93CF03
+3FBFEE635AD06C6CCABECB5CC777CF274E2A3A7EB96D0B28C928C59E77FB3BE301647EB377C8
+D2E0B57B647F2B7E7B01F44519A3C561F7CE84121093BDE4F9E799B0923608EA9CED23E03F5A
+4DD1425D2E6219AD8E1388C46027483931FBE864FCCE49934BE30DE22AAB04C6BB453D52C95B
+5683CA29C73281333A4E2424B3BAB34AD8AB8270327CEFDFCDC4E63B3BC7068692BD663ADCB0
+2C7BA09EACDEC25FD07D2E236E299EE0F9290E5B8B7F8862FDBD81710468818674C2BF94050D
+C77B479F6FBD83EB939BE411711746229018421BABBEC891DAB8C00BD15602A2236927BAE40C
+057B88F3834E2582F77DF3EE0F387F6DBB23282F887956D01F183D73DC0B074A81432EC813F4
+ECF07EC8C51620EB7B796C22481284FBDCF26505CC200BC1D73821A5A8E3975D9E76FE594528
+F2391911403CFD4993A2CDBF6011E304A858165C6BC439CAEC6723792A78F565BABC47D48B98
+FFF4CD726C9F35FE3FCE4B2955EDB611F0EDF6893D904B2855E468EFBA52BE7BFAC6867ED7CE
+7C226CBFDF2A4B8A545209294FD58C883FF1398D24800CD1823500B0FD98B99E6D24F11282AD
+35FE21D97826B3CBAE293C191D5107185A620CE3F30F04C540C9F39C1BF0F9F59FCCA1D06558
+B0A01B33308DD3B9EB11E881B9A8E317682DC53BD91D7A984A751AFBC2548DCD4CF62B12414A
+CEAE7FE31A084CF7C809AB5EDA0D7A65A4E1552DD3F620AF1BDFA235B908FD2A56A9D316C262
+3812C7967FB7E21330D3E3F4788D58F08DC1266107842337EDA9D915307DF3605168D3456D40
+048E36016250CF994AB7ED3343053B638E58C462B99EB88F1543FEB8E8DEEDCFD096D82A8DCF
+6F978ADBC77DC4DC1C5EBD1783A1BDE71D6F1658E1BDFF1E8FCCDEB0B9CEF930421519D60C98
+96906A79C2E5207D6629DBF4A14863F7A9B8CF3CD8447B92004F29092F1ACF42045240EFEE4A
+70D69F5858647C686CBD317881C53E59795B32757FC33BF15AEF5A830BBA62DB8C42D1153FA8
+DDF7ED7B9849A2080933EE4CEAA4327C2320CFFB858328E2A936A58D8A94D334B463A9BDC35A
+364A0DD0CAD4BEA0AD9B7366DD984AA3AE74C823BC32EB265A7B5D122834BB53DE3A37B414B0
+3320129D8F7B78E59D3459758F40D049FDAE7588828EA1218D828DE318648BA0E0A414DAF43E
+227CEC67E9E0DD502D9A7925D5A2281701DC636BF79362B724FD93FC64BE8BA63CAA4D750113
+25B3C0C20F8DECD8C325688493F3347A71309482A2613B5048E06FA6AD50C6D0C615390DD3F6
+F0F549C333D1654BDD3E372D3970FB9880D15A2D922E86002A98807F68491D29B1341E562B56
+5C220B70F0239538551C3CB40BD1B45061205A60E3345BBA21500E8B869533EB266C31BE4FF8
+4F42F0CC5D8B178B67BBE7CF357199A32F94C1E8EF8CD65515262B29464BCEE3A93491DC134F
+97BE64FB222F15356C11586C7DAC7B2529B6B6246A028AAE3BC08800567F633080963BE6CA8E
+CC8D7385670D9DA59CC3E33253630AB01D3D5FA4DFE77523D2CEC4A5DC8DC62D1515BD78E719
+2C5C1C2199DE7876E36BD6FCC3C27AE577A72247C807EFDC6635FD80081B8CC78498002EB78D
+FB2B4A13B3D1DB8E6315891915F445E046ADF168358F713B4358FDE076907DC9FD86A86E3E27
+1656E9C6D24BAC96C6D400F4A931750F9A4E753F1572E069B4D6F435D63EC1E8B223DE713CF9
+6A40F3745543B8A9789DADD2493FB1738F06F3F35E4C295AC740A44557DA6E74F26A23750FF9
+D51E053EDBCF2CC30D9B6DDBAF684AF9D0EF7A14C4EB101DD6F84C3D7047C32293407103A660
+DEDEFE02EC9869C2FF2C0ED1CFC46A73F879AA6BB207007C76FA776098139F84B4A0D28C3AD6
+D500517AB58BDF672C24AC6979967698B28193C40B10E6EA1A3705B6FD1C1C2FB3813B3287F0
+D46B922673275C63C1A7126A84605D0AB5701C88FEDC467328998A8564FCD953C31C7EA2B668
+AFFF9872F86DE95F3BB1D9DD6FA033AB0B8E903AF01DF2E6B060E3D5116379676EFF7CC5899A
+ECBFC89A0D7FF73E46174F1E452A79E36353595A22493FB7D98AFC04549860F0AEA927653A7D
+B1AC86542502FBC7357314CA668F66E7E44A33F60820FA1F53E4BDBC448FCEB4D685FDB06978
+8D870B203BB18C18C8970A3513232662E92B1E5B126390AEAF1177BBF1EDEB55A1DCA43B4572
+3C9E8789EF056EDCE4FBBF73BB37C90FADF5105312E67F467F0C0BD42FFD8E5643895A5BDDAC
+12557707FB82AFF8DC9813D0B931B3E7513829E0BE3FBE342A6A3786F2656FE68299968ABE35
+5CF4FA53DA08F6745130336F5AB56DC6549EEEF1F579F0060298737DEC827AB7ED5D627BF7B9
+D8EF165A429BEA10A1C2ACE4C668730912EDA9F75D17E215827042E1FEF5D72E643C1BCE5E61
+F8ACA43381FE6FF1E736654D11FBA39EC251D69CC3C5B7D9145ADDF5CCFA6DEAC18D4B9F43E5
+2F3B660A34610761E9937051AF51707581ED226DF239F8F7C735B4FE3D9B251EDA1C9BE2FE14
+D603BC91B22CABD7384D9DD8477F66983042D99C911B14DC0372C8350B3BB1BA4199BE157A08
+DDFACB5BD368BFAD813A05890B8BDBFEC778301DA6CDC7FC67B9300448505B7BCEA5C1F4A06D
+0D39C12DFB649412827813FEC978530C5CE020507B08F90FFFCAC19B3E7B7474ACC6F4BA357D
+974D0B5D5F4C5FDFA899F1895595A51FD2590F0DCF52CB5B5A01DCB94589900AACF23887A182
+4C95295BC28EB912FC8512CF1465B7D1469AB94C104C1C1A57F22300CB9A151B7E7431080FC9
+38868B5A7177569212C1EA0D185CDA5503D592DD781386F619661A4C1DF9D9082F44115BF318
+5419473A1A786138E344C49842AD159E143D671BE1F224E06E71B5E14385F7DB7EB083F8D3F4
+CB8B3FBAC22CA88025F8CA84BDF31FEB9D0A5A379B8637E4E60A5875860945AE85A04D731C6B
+C9F4EA2DFC84A4AED87C6A3FE4DA0578A82895D643D64A99FBE989CCC2ED431464F919B89916
+730868A3DFE6DB998131E15171E39AE509521D4029384D68D6629424FF243B8F3573B1656A89
+38F21E0FF51702A24DCA86CDB87FFABFD07E23245E6A0522B15B8B7F02B32AC81559471C6032
+CB63B5C2AD350F1E60713B798178FCC159EB02B5C033EE36F3D760C469AF012503AFD3E4BE8C
+85403DEEEA0F9862A1DA3BA9BB4BCC3CF4DDEE1D7EDAD994C790284ED6AD9DE0C6E6A73812AE
+1A9295782ED743777A549B6A99C55DE9CFD50D98B8ED95A54D9E9516A5976D8BC3AEE24FCA52
+52FE4D75EC8F2D9AA34BF988384A3A9F86B1C55B6B38519CCCFF89B7CD0165DDF9B5141C173A
+8539C8DADABDD4786452A37B2245C925A0CE6277C5A66B8EA55533009535DD1A456057D5EA3B
+64384D89BCA81F7467518138B5A24670CDDBCDFD5F392208917853858A8EE9A5B4F2AC060ECC
+9A0CE34EF5CA812E15E10328D5234D087E80AB369529DDADA470AEB75555C584C7F68C300CBA
+69CC30169760947DCBD0382E4F2C68BE14CE1C521440AC192F1016EAA233A23FF59BBE98DB9A
+6FD16AC25576AAFB7CD417033A9A43F42DA250D9AB53E96AC10849C36348ED4B59B9E758FF89
+7630E8AF3746394C15FC94E1FC0FEB30EFA61C962E2380EA0479C6F3521634B91718CA44027E
+69D235ACB2DC0F45349AF9A4F7BE58056F6B574AFE364128C0AFE227231D0AA97D45E01914EB
+2EDA018807B73BEEEC8BE2CD1414E898A47267F4C649B326D097152A984B0492C9F42059BFFE
+6189AE83031808223BE65067437D7A89445245F7C6F5F61D87B86D5F3B40F9261EC3E142F495
+F1B199F30A13BA2AC6770B7C73D3A333090E267D3B127103A680DA1A00B0C148F9D000CB3011
+0292FBDB1FAD386C862D5A3594A31DDD421C680A83FF41FA03E2B32CF3D0FE3086EF12DF80E7
+B5EACB2ED8CF1857A00DF3EEA3510F49D6F7540EC0BD08625250DF8A3B2F3A160C0A0035DFB3
+4B7E960550C5C040F0AD461A407AAA9AA7877A23CF99551FDAFF32B82FC87BDBD86A6CC9C63D
+F6EB8BFCFF2C1E8A3B57BE35C0AC602F7B4F3A8CB8CE62253AEC186B1BDC8320D5099180527E
+1CFC40F7398454B9CBFC5BA0B421F55DEDAB33CFCA11217608763D23685E1530D0FA1AABD091
+AC9A6867DDE46A733712CEF63B46E29FF70E9210224E0964FBC56A9AE0F600F720F81C7060E0
+16ACBC1BF97C16F26255BC4D82538BE080D37774642CD4D4C95B3BECC85E32D182BE7A1F450E
+F077500EC91B21C383E71F9B6690C0616457CD8768916022279A6BEF4589A85732149014F067
+746C3FB95DDCBA28C7F0DE2C81926DAE7967A387A06DC62A82F813230BF1F2854E214984001D
+0BD4A7F8E778CBBDD88D702863FC3C8593255627F352DD3327EE291A31F3DF409F108DEBA842
+3116CAD62EE04D8CA8CECC16B8802F698FC2939E3898771FD932799B54705A481C652314C8B6
+4BBCC883296CE238804F68346FCA2F20EEDEB4B9986B470B84CFC07984D5A1E896790B854B5F
+21BEF81262E1E32B949AA9EEE6BF20B9141C890A41081868E83E5780B54A456D1D5F21198126
+93DA3BCC8C88D6DE832717BCBCEF1ABF462E949A415839B98D91DEF040B43D7B1F174EC74506
+262F04F1E599CD6B01D8B5902C029C97487A1E05F84DF9D42FB47DE21F59F91B78BD16DD9FF2
+087D1A73C0C58D4C9C53F64A8E2A076D763B581AAC565E34B05368A456F52D64528EF327ACDB
+4AB6263C1561EDABAA3032EAD94A6FB956F24C2E18B6A8A47BADA39A20BA4BC035CB8408844A
+1CFB7E4107DA5FF66C307CCC01B93DF8D99FAA99DA5F3719FB26C2F214F18494BD92F9B6DB1A
+F2DD492330615C3BE70D6F3E2E77DC8348D16339CAFDBB96A90436D2ADC86A1864B5C2F4809D
+01717A052BD791C092D600B1E2F6A24A21E13138621461A3BBDB4EE06D880B477DEE907B0928
+A154AFC2716865D8F751C398BA65E70F325089882018E0CC5CF735ED15428F074C17AFA559FB
+3E94D43340136BEBAA8E47C773DE6C28D54B3ED9FDE6622924159135D49490EA90A7D91BB08C
+4345C0AE3FA4A1461422EAFF8E9C49329AADF6342B7D55FC513821DEB5E2DFBB36413E954E39
+F5A24B3C974839BEB97250F1566F7A7F2F9F603D2A5E43CEF4AE5B0BAED2B6304461E8C16A7E
+F458E6542E7F8933E6C253341874867965489527C80260E254411265EF559A5CD9E25F6CA0CF
+EF2DDD2DDDF07653B9A0FC6066903189D076F485EF03D52D14D676406AE2CBF46E818D964607
+759091C5B0EC784AAAB7BE495FD20876E11547DBD9CB02508BAFFE62D3DE7F5AB79A2C94318F
+E16574406E7933D4FB8FBEA0DCCFD1553BFF56B1E04BBDA2B43B71A77DEB8B445E74C574D7C5
+B530BB312EA0EE227242D4FCA0CD13FD056E30433DFABDCCF6274BC85B3968AEDD85E3ACA8CC
+017B8077C0991C4C83490F5C59F3F383C6C7BF0A7DB9C4F8D76CD146E3F80D4DB44ED37674B9
+0091E05114257103902A9966F75DDD14A0B7EF5711A429BE60E378A89C7E1B8AEFBA049AB1DE
+59D36A037AA41592DC56E731E911BD486FC06B17D66074FD7332452EE69FB9909D8D1B245E8B
+7C3A4061F3D2DDB055CB9C8BD2BD1BF13C2239E90D9581A323E8CE5865162AAE002F29A05989
+938C8F78C781EB5EE467854052B9B520E9B518FEEA9DE7B9D1D4D13FA85892105E383924EAF5
+C7634E06F9590E1661C0D12F3F867AFCA1A8E34D8F2D7FAFDF87D345D914E3065430E84FD70A
+DF71630C6C836BCDBAD5AA6A1E7C73F3DCCEB4E351C1B3CF348EDC47E8E1E27EA2CFC2B3E7C0
+BB3F7AFB557D158D820FB815B8FE1DBEBDABC179B0914064845C90D2710D506D17729D57F2CE
+A990A49176E3A3A128137DFA6AB814A9B4F544E290BCD8A13E92D4EEA56889B0D2B58C50A02A
+D9508365881471FA7FF4C028704100F45BA347F8F62B3B8C827C2B19002F712D68AF8BD7A167
+E6B9D53BE6F44496E5B00C8458C2A15B90BFEC6E5FA5ED5743F4E607B93EAB75FCAE34A6B163
+D919B80C7E62B1E119BFA65520E2D7B78DAE89E34E0A3D7069EFD1B7D69B7396E741C1E81015
+710F743D2707A8324FEBCF46DA37F1D4A26A62DDFBD03D93F13144296D728EEE912243F8E8F3
+83042C51E48CA1A5FB757E6673CD599BE052BE15E9809F4B1C1373F0781963B39763DC4B3473
+0936DEADE5501C429D265002A4A280A1B7FBECDD6FAD9518BC26D0886314E2C3DDFC5405FDAD
+8FA9B0FBD53863AD59BAF1B0BC6ED0ECB34B7EDE368A1825A896AC132D4A3B598989677BA608
+A26F6B35E46ACF78CC959F94787027C7509F8E8248B32A68F75A5E14E2118DDA7A3861C3944C
+88C198012E811C71D94A3FDF8DE7E842A1662088B4C014CA1C29BBE58A46A8CD7E82E277E8B9
+EA73F75E0BEBEFFFE0A2737F200CF05A697210847EDCB1CE17CAAE782554D57C2C5F206893B1
+49ED59028707595032EA8BCE284A9B409C69C2EE9ADF0CF13035A1AE3084B58557EFA596B273
+DD7582EAA8153DE775B991C27124F684617F45CE264F3749BF05DA720BEC48277BDE7320CE97
+B39317D2D88CDF1967D50496CCAAA99D341E448160DA81DB763F8D721324608E9E13E7B92318
+22C669F6F7472350FD411BB2874935232E47CF8BE653C8DEB6CF00AD9367CD80B674DC67709C
+8317CAF2D618170F99155E2BEE988A972FD99F28AE1990B5C8234721ED0B5B05BB714E2F84D7
+056CF0D2B0C46E1823163BDFD90642CE898A92016C9D05FFF063E7B4B489C6C452CC7467E64A
+59978C6F82DCB872D322ECEA7BF2DA6187D78F27E4A1A9FAF3626554BC5CE69DA195CA0837E3
+A44AFCE6F55C2F540D6B9551CEE083F75155E978CD5BD4782C24EF20DFDEA82E66527304EA74
+CDC79B59B7DBBD262A2B37841AB3726D24F9E2E12325A22EFB884127CD3028C8CF819B23CC90
+8878190F8436AC1934F3478EA966708280EEAE8E35A31D5AEA2AE696258DCF952E53307138A4
+5F54E38566784A07B07B77E170B04BE12772D72D31C58107360F403BC991689A984F5A2C9B93
+7EFE72A267F1547B7CC477FE414D754EF566495D9C13C90FE4C87963011B0C0BDFF6A7179FCF
+5DACA0E475A9BAD39E7325C238E0FD9185DF54465F976DD68B43B057399526DC8C7383FEF16B
+AE73E89CA2A5F55B6EFA49DB81D19712DE1E5BF9C7B4536AA3F01B1EFD1AB3E356C2C27C915B
+9B795780DA39875DE71F836EC0EA0DB3493C17817F07D34FFF52C4879DEBD510088A0A95D1BF
+B06ECEF3524488FAB2F01A5DCEDA2F1C17BD611DF5455CD09AD5712144CFF92037EA80CF0058
+6543E8B40FFDD9A9E34CDF450D4573A9B279DB0A3AA8F17CA50E0881F8C31F681D55D6641807
+A08844309A7E40DA8FB21B1B409B2093275865E0375D7D5F9A9641C2BFD25DA3B7247A8B4724
+4B1BEB930202A9622A7636296B10846CD78FB8CB04C7BE4BD3E74DFC7627165FAA80DB2AFFA8
+914804A91824243A59B76CED9648D12B47CE8950BF760D865136ADD4F83C7CEC9CD730416E71
+01404019522B641F0A4DD1CBF7F9166180FD9232D94248D2ECF149A1F6FAF7F7CAF0FF409079
+10DD32C559476F6B0DF68DCC97716F82BA617DD0CD2C9D147A621200CC26A7A768796283BD30
+65AB4F569933788C17BC564568019D169E5E43D0E46C6CCDB11B36D5FF56B54786EA1FF68A98
+E8DD16F41B2B224D906F09A4347C58278F0F151AE45D1144D05E2519DF446795ABD09BA61531
+F93553D6305F228E82C1F28A76DB47A8BECC7755717952FB5506E4F26AE8882F6AE8F17AE34F
+B80CF2B0D0D99DBA2AEB9221F82155E9F666C5F1709D17049A2E2AFC05CFA9779D10F7AAD03F
+E76F78A57B1C4D844262F5A889802360BB50C3949FF9AF199DEBF95BD5D0A4B13B8663442C92
+DF829C65654C4A85DA8E9CA7224DED598801EB8019E78994A5C70980B1BD09F3B255979194E6
+1DBA6513B5B6288048A9E93DAB48AF7070FBE494A1DDAA087B2278045AA9C5E747A5D49AFA72
+D0BF8BCE89F182905973FBA60C5F65C079E143B0D3DAC6E774F5B298A18CB11AF493BBE2D783
+51B4688BCEDCC6A897797CF30DB8B600A5D5DEB6294E0EEBCB34523E28BBCFECA8C3B467747D
+F85BEB5127DAF911375335C5D8B3F065B1B5D6D6FEE564D88B56897A635822C09C999BCF91AD
+E7143F09F61ACC8C1553B5BC2C9A2CE6F86AA616A89808846FD1A2986D6D82013F1A2B962EA8
+1A418EB77062B721C0A87927E26358378EFC5E75256842F692121D4C5DB323DD87DE40C507CA
+C183F305418C1C4967C2114A28B5B3DA494C01F66AD78438FBE9CB77059574FEF5409FBB77B9
+428355422F16E9DAD5AA5FD0181668A4C896D3A5AFF24C7DBBBB88DAF95FCAA95B270E519F2A
+8729D013A5775CAB79E656BC515BFCF9054154D0C12C2D056DD947D24F553F40DD7052F4287E
+3F0FB30E89190444CC52286959AC984345B11859DAFF089FBFA03D6111DF78DD4393324A5379
+71925FFD6697C14A5A1971613124B13EA20FF1086986DCF54BD6460AE956BA5C3565E43F8DF3
+5AF79C637FCD39C1361CE296612CFA01750180E7857BBDE7DB8F6EC757D71912328E41A69650
+271C5380931EA0B6B5227D9094679D69F04C2EB2B406338ED59ADE317E80198D3CD722B0458F
+0A9274087325380B7E0047196CDDC363D161A49E7EE0F262C3CD9CCF88D279953A6FB0C3CB67
+390EE89BCBEEE246D321E076AB59B8D3C25CC90DDAAE731D19B43FBAD97A7A97BC21DF4FE65F
+673753FE06D633D156E57D1E87433ED1660EE8C34FBD3B2A83EC5E88F98A6F45415EDB555880
+AFEFABF11EBCDDF9DC0F6045BC18B24534BED2DED3A5FD0769F16C521A7F1EDDB0D51776B482
+DE96C8FD119A03D63FD475D7CEF48C854D079AE0D10A96F51171437C565FEF88AE1831C7D56C
+5FB2B184A882200DDDCF0552EE7E809DE45FBAC8777BEAD89958DAAC04BF6142C21191EDE23C
+C7710950472EA107C0EADAF87CB88F7FF9D1ED061A7CE67DE329DE30613DE5A30EC6E46778BD
+BA41C95CB9285908705E47E9B52F3F570F17B0190D33AD6F8F3255A2C499E81AB148ED7A3745
+B0B8FD74133ED7270CD24B33FDBF49E6BEB88E1203537A40FC6D1D3C545C75C7E42663CE5C71
+8BECA455EFAEA50D18E57FFE96F76452B2FE6FD147AD36A88D6DBDE307AA7A0DA0DD21986A79
+2396784F604A84C06EFC40765FAAED39756917635C582A8736D875D7F33ED344E7893BBCAC47
+176555E4A11AD404D1318A778D924FA726A50F4E114C29E44E9AC842060310285BCB78ED2087
+876CC115C0F837A4EBA53F07ED6594A932EAFF40ED42D7B313B99BBC8B10283E8FF683BC93D2
+BE4D2F370F0D2B14E6EF4832FD47CE536FD40E8CCEA442C6956D2C4780423BCEB9680280F132
+FB93670919B643F49F05F205F90EA3091620E48699D55EF35EA51397422E16BBE79776C222FF
+DD5A2E5401435CE0A3690EBA317A8B3469CC19EE0CEEE20DDCA91CC41AEC64E4B483122B1BB0
+1B67333B7E1F39D808F44179CA3042A87DE4649EB1CFD5A5E8231D08221E2C79CCDAA4267789
+3C6417F47C0DB97D8ADAAF7266DCF9011AF7D71CCD8092FC994BD639D80A019714073F3C7EE7
+769056DD117FC021A40DD98DFB115A596CDC0EC9AA9C8F14EFD96B98EF64F1A9430D8DEC60A8
+B4F20E696B812DD9C0EAF3259B69097C81EE43F9546FEE7A556A26F0E1ED927455A1BA0CA65D
+1148A2974516E79B04EE02DAE02A211DCC88C5F8965BFAE5BE65A25494BBF7C23CEC8115B1CE
+2FAA0CBA14D99605A24F14BE129F80C806CD9C5273AFD406AE758B0FA5F81C0F2D7CBBC2B0CF
+D30F525E35D937D4423B2E0FB8C83930A38D1620F12068CF098E459E8E970EBB0C44B74305A4
+01DC449EB227B665445CA242D42B8F73667B2BA0C7BC356BD5C80FCADC2256CB2D0BCE609ADB
+60A22CFED22A5DA1F53A3B7E9535712031C472D34CF2F771520CDBCF9A3A5E878A47B909B794
+91A2D0F2A370957E4B1B3A516A3A4BF0F431BA695339E0EAC940FFC9D93729D07318D6C8EB49
+0CD8C923415A811C9F78B6E5C66601C552500012144B793BD0128E0CDF6360EA70FC83633CEA
+5E962E14AED5633D2ABDD5A1283EF893CFD1BCF6278095C3075A4E03F6738772437BC1F45994
+9F5A14BB014BC909E3551EF70B61430E7EB9C0DA2FB9274F399560B6BC1C754D8A770598062F
+409FB7D1165DDD2356D506E7D1D868847BC0D4F8482C99CD1D4D460B51F30BA5EB7CED25F56A
+001C0AFA884C8A65E241EB72DCEA5DADBEDC6D761B24B5789EE8404529CBADA729159B5B1158
+91AFC097F3A3061606AC8BC1E54649579F65F8B5081CA530F51CB230EE59C1E065EEE4F23B83
+D6CC89F0FD0420F8A76E224491100E9C420008C8E5CDB9F76FC5218AFBD4E8000D47EB6D42DB
+69C07A4609410B28BDE1CE27CA80AD1FDF6D18ABC7E15D8EAA112DB8444495DF49C309FB63A4
+6647F73A5FCDB9DBDDD2F6E5CB19826D7309C1DC3F2ADADF2E9526C6FA3B1520BBD7D1B27E4D
+BF70D32F827FA36FAA710F342373C3A1954F5EADE197609809555808C004C8791AD8B0307C33
+44C93D35B9709B2016E8859FEF495859161F17D49C56DBA5E32300C080B7DB9D40B597D9626B
+2A042BFDD249343DFFAA6D96B585D127D4A6304AED5A8CB39720380DC175C17066FD39CD20C8
+35DD3E87EB3AF936CE1A6F953351A49A8160B22B2BA09000ABBE2FF305FF77326D080EA35CE7
+D924BEEC365A1B0E37F194F3E796810A4039657BD35F21EDA3FF80089C2E3B2A4FF40A7C0685
+8E45FBB7426A1FFE0DBF2855DE7941F616850FC0F3A9273DC2D40DD60ED28C6A6F7C4E684A8F
+B224FA1A52F4F733529A7F3CD3B672A37C9D1F6C00DEAD801078EF12EDCB63CAE750B82ACF26
+DF9650CD502727EBED366E00A1E6EA351119CCC68DBD3E1AE37636E897E964A5EEE0F4E892AF
+88CE18FCAED77CBFECF9216AF5FFBFA35B0181025760CD6920A3732BAFF7ACCB611710F2F389
+CAB8C1A5AF75F82CE7C8DFAF55FB6FEA658D706BBFD8C2A979BF79DE4DBC69DF204769719440
+2274A8D6B61503BE576AC61D64995B9A4E5B2CE5B41C70219E0CD4A42715009B8AB11CC681CF
+501744A54F64C35248A0A5063CF725CED14BA757525E5BA7F959D0CC1918A21AE242293EA7C6
+57D0B1BF860BF3A994EF414D457EAB682AD8A4E0C859B6B0C7FB74E1AE202AC7011F35B1E104
+44734F4C04BFFFC35A36A2F856CA4BAA9B0A885DEB9068F2E635B68411BC397509EF8211128F
+CE9FB991CE287347F06080083E34E61D6266D9FA96DBD1DDB48040FC1B99BEFA11CEDDD479F4
+DBB987236B4C5C41C536F464CFA43B3C2751D2114DCA8C6B75987C326FF5F5859A20CF68FE61
+264D3D19C3EF7A88C66EE455F1B85F570BE50903F0171A46FEFA4DBC8F62EE9383B585DC0D53
+F6E249F469C631099098E3391E8B432E739BA60EDB0B28205F4F6F306A70D16C149BFCA8565D
+1141BC191D12B029D4A97DFD41A10B2A3BF0E7E3E56ACD867CEA04B85C5F7462262DBAF7BB8A
+413DA70DC3D5CAE2C3F3568FA52081447B8F3F7F2C608F9D89156C427136A060323A8779A18D
+CBFA6D21DC08116BB1AC5966900095176900CF3C35323F45CA4DF4BEC4CE8B9E5183847070F3
+FE8EC37EC98365AA6F3353E68E1B371CFCA937C5F3628D85EA35615239402340C3DA703F7A18
+1961AC2AE63CBE7B7A99322B1F73AF2334B569F9597A2426AA02A36CCE40415392F382B26449
+592723D2C7DEF0CDC39773062E13741536AAAD929A35F698A226342E624449AD2534973BC1E9
+B2F8E875B881AC7B061A8FD8893DD399F1AF00E30153B6285C0B591135FD1FEC0425CE1B2C86
+AC0378FA29D7FD7668A4C766CD922FAE0CCA3EF7481DF2AF98C4E204940B03C24CDC6732C548
+6B0FA2C312C041D0A97F51E47AA0DD96CC60F96FFE1F37EE54C835BF34C20EE115378CB582E3
+6ED4FB2DEDC45F06D0AFBA2098C71A914E8A2BCC30701765B9E1F4825715C6328677776A6EEC
+B1674BEBC1EBBE955CC6E0DF92BF67B4A62AFB52A90318ED69347CDA22339AA374C8C7D6DD69
+FE9A3460D7368295FAAE607CF34E7FF41FEFB7650B5CFB4F7B5DED38A73C005B6D21124F9CA9
+012286398270B0A1C18E7CEA3C5116E89EE7751CF42D4E4CBDDEF49D1DA91F0132CE636E4F96
+FA40EB20392338F5D2F1F3B15C44D23B62CDC36F804005A06DB79B70964B48D8B1D859664000
+611D5FADC7CE699BCF030EA53D1ADA7A87D2A6B64ED5A107165F80EC60051D1DC85666E50BAD
+862D961589E379A48D51B7B69336B5CC155C732B14BEF3A01003732D7BF05109D01A2202748E
+C305FD6B7DF421912EB377B99C49FF565C88EBF56C7782BC0D3DB5C634EC0508D9194B09B98C
+E0E43BB9A6EA2DC02BEF2CF3179AC90F7F45FF6AEEA1C6C7C8CCFAEA5A4E8487EB470D9DE00D
+055AA2AA0ABB5B22CE3D96B2D422352747E1BF64C39FF9E1F51D404CE4339BBF79D2EF1B2486
+01B02F863456EEFD02BA5A1C7F97F860D4294D8C85560DD2D29C2167BC2208F9F50259EDEFE5
+8CFDAB9722039D2493AFC7D71E714B886B2DB7E2A6820CD5642FF72FB47D20A8F45E4458880F
+FB30FCCB6ACA8048E5914F6256A439188E004A6DAD74DA2C6499B63A7852684DD3BFF34084F1
+DDE62B6EEE0A0F33C89B90E42E55A285CABDCFE6280929DFB9EAEB9B04AEF296C7A9381054BC
+2E6DA960D32E848C9C40E28670E255121A0C5B17CC9FEDEB5EE0126360C134440F9632903200
+7BCBD32AEFA3E271CE3A8947784CA6B20CB07ABF83CD0B29DF54D69E2C072F939DFB7A7E5B8C
+6C8354758CA5D33AB9D61C77EA562642ED8388F2F84E3733F13787AE7D1089AD08984DB6958E
+65DC5D02572816E696AB3FB9D95A9F64D7AA7A62B3D54D152394D6598431B8BE651435152BDB
+D687DF6330ABB0B451BB3D5198C3740A44435B048B19A9238BFC5805C162B61981D08C4FFCE4
+CAF37D11CBDF6769000093147A26E8F69DB0E18A96150A569097CD1DD8C9848355434B377D5F
+94A01A532002E480AA5E1027B696469F85577FF07B793F4B8F684C044C62CF42D4DFF1AC9E52
+8C05F6F36FDB87F2266D232B6717897E6C57DFF9D31CF3CF5F12A48296FFF2FE7D6F975A2463
+F4FB485171143755AF082FE102DB4D3A267B43953C4F09BB634D54047076056762C099061CAA
+D7B4F5B0BAAA7B1A40396AF29268C784A91F3674DB9EA724C3C1B88B110839825B82CB50B58D
+A5B282D589E0015497E1D887730DB88F6061AD0A0D92645892F0DC6FDB83027C0715EFCE2B97
+B117F11B7A1AFF37CBCADAE82D38B39984AB201CCF1B1AF4D98FCC527CDB75D57454B5103FD1
+1C9305091EFB79DE2B9B7521F3FEC034887D7060CF40C2D522096AAB5D3ADF56920FD7EBF767
+6924AA2F89F97639B42286151E76B04EBFAF1492BEE4BE5C9A75A42079503B7B67E7C81BF5CB
+DBD93E34EB1453EEBD4532BBD47513981577E5C3E051BF62E1753A5A457C78E78AE563A39A60
+069C7294D0C04D46F92CFC9B9620CCCD1E4294CBDADC7B97537333964DFA8CF1E17E01B0533E
+01F41EC9867A111C17556105071E0FA5F247DE49159055AC50CF4B5144E2AD6FF2104784C4D2
+73E948D2A264E4BEB7B47A87D5E3D415D3926734E8C3C05281BB872D1FDE1906E8A397000792
+6CFF3231254CD5DCE65DDEE11ECE87791727042B933C5AC119C848554A4045ADF6ECF563CF33
+A8F910412313BE5B4FC987A67D145686C0F5E11869FC8963B1590FCE32AB66031BD2757E226F
+378EA27FFBFABA11F916538D20E6F692F9EB9CEE02AC13188E9905EE62000B32D6516F32D90F
+F71DBC3C288F3FC76CDCA24AA0AA1D0A7D0668E6986AC61690388413BDCA81CC060BAAF071E6
+7301DE9DB664BC988CF0C4375FD51150F9E254AE93C50A1EEF2310BE1673FC22BFFD2DE463B3
+69B19E23EA76586C54FDA5C50DAC226E3F95D95558A8E832DF2BC4F3AAFE1F3C0C4AFEDF9FD4
+0F0BF05D747C82EAF7EB4A76F01587BE18086C4597BB93A8E3A3AB7DF298F8C16DFDB101881D
+1EEAD4B0EC16688B43ED77D78BF022366C3C3456462265E6A962414EFEBC26D17B67647EF49E
+74308D44304EE64556909765F068DA69E0D3DA44C0F7EBE4019E304039CA80AB806B47B1F49D
+512901895A3822BB0424AFC3157392E402DBE450056C3C6760CF29E257911DF9610DDD9520E4
+A7CF15276A81FF9A79786B22DCB2137B20E1F976E83E98CEC6EAAB2D9427BF8E006FD30757E6
+ACA232D64AB02399FE79A2884F145FC6351B5C186F97AE8BB3AA3DCDD34805EB1E240E393A36
+D1F85C8B396624CD69802DD267D5A9909987669DC66805C8D273B1D69197DA8FE60D005B1132
+3DFD5EBC1B400B9127D71DFBBAC8899E688C92AADD87B2C895813CC20E35B1F7D383E450E384
+9589387488C7ADA1FF323A3CEABEE249298D2A2DC34EE477169EDA7DDEA1FBD7C2D5CDD76667
+06EE7EFA6F42FA80F622F42257E9B88EDEB7BD64BD607FEC542ACE2F119AFE682D97EFD6817B
+545D2D424D6435C101EE6BD670276BA133DD7D16FED98A9DFF0EDB81A6127DF7F070751B4014
+17EEAB5FAB5D4A1A18611655228BD070C0F0DB908BD32F03E1614C95162034560A053DD106FB
+4C0690D0DF259947574C6D82721966397EA456B1E8889518A7525C23BB294E47F5838C1B5E98
+8400A58DB86DC86B35C6A3414BE3E2326892105B2CE25DC7F15B76571D0EC9D646974D53B8EF
+96EAAB63928C4A175A34881BEB0A801C14567EA395C5418E89C5F7BDFD62682CC5598E74608F
+47F3B9A43765FC435C66595772B04048EBEB1C39C18ADF1235426E341DC9FF747FC5554FAF22
+AD4962A609F0CE274C572F98ACE54BEA41930931DC944986485276FD38144A08CDF0DE4FAE02
+9213B596977405C220E2FDD21B7CBBBEA22B2CBF7E7964D58035B242E2C2DFDE43F21B020976
+D1AC86E2C365FAC822A38DE51E6ECFFFF686DD4A8589BE09AC9DC1B70D65DAF7EBF146ED7769
+B3B00AE122F4D322CF1B83FA9AE501FB15221E1B3449ABACC7B62D9CDF77AAB06FA4CF610311
+DA089012AEDDF34D37204DD1E7EE89FF8E50A9AEAF99DCE64DF6EA0CBCFFE8E16BDF5CB5F482
+3C50F6EABA621C6034EE2F2EB0F099950E4425B818F4052EEB014E2929D34D5333055012F3C7
+518BA32BE04B1E8676A14D95EB1AF4F045E78E6CC5F6B5B6AA976527325C29B7234770EE1F9C
+4609DE2CEAD3F39EC7DF027606771406C622377EC9E7C4AFD2B7BC78AE0BDB6F08D3C459D1FD
+8E97C020F39205BF16C907FC5234257189212521E6E57F2AF9AE9EFB11EB36F2A428F3BD3A76
+628FF7E86589BD3CFDA9E774E1655FCE1BA225DBD2506C7AF7078CEF60C209658B0435DD5AAC
+00BDA0D6B11680963D9C64BF1A01E1B884A65BA9CEB5D87B2492D44664879A5E9B046B8DC05A
+96E50AE5A71055D23F79E5AF82FEF4D124D7238DB91E1C8D2EF789811D45411B75785B4F3609
+91C7DC590D15EACCC950634BEC77ADA1B96ACA5E4A09849883104B6B584B2F345BF3A6573044
+4B7E755BB603A170424412A6F39B882BD2A6554CBB33DE4AE5AEBA7AE9B0E61DB5A7ABEB1553
+A4A1B92BB9E6AB4021C266E932E6F871C362E07883D4CA4767FE1081DD626348979533C1DB13
+B42B6DD7ABDA7CB7D84EC347279683E22600ACAB25DF533F564C97BB3EF6E39D935C59A0BD2B
+9CB53C0ACCD759BC4AD7C60BE4536A21D59F47130FB01D174B4BBE901E19FB56AFA5BBF8099E
+50ECE0075C340148F18BD6661EF75F5BBEDDCAB5621144DDA8F5696F8867A4CCD8336DADADEA
+B5C6CBCB6A114F0E44E43945F46C9143C3BB688E4CA8229E8621B2986CBF45646753B0CED554
+E09F8D961CC9BD0EE359A859B0B7313932F6E5013875FEA4B51268BB3D608CA579D999D1CBFD
+6AE8303BF21DC188109092A62B1F5E18ACAE78DF01F41E106EEE0113D253297C7798E58AB6DB
+A4AF1E93ED7968C0A73F5151FA53A5BCB039FCAF488B2E94F20E3D5794256F202FC5EAD8E526
+763C772245B590FC2F98B3C091B9844C332E781283632EF903CDF3D10006969E8BA9F189A1D4
+A3A676C0A459EC476894C3E28891A8D451B055DE02EC8943E3BB0AC46CA0114717C24C6B3917
+5689B22EBD8BA91F97EC1C6452711C57A4B8C883D2FD15D1B416C3D131A902887E567285E018
+D52E3F5CBD6FE3D7127F05FD400419858073E58ED1F47F24A8CFDAE157230C6C801AF3807890
+C9238E6682CE035436E6EB162D8B30E52D6E84E981D8A977CD59B0093E477283FEFF42448642
+ACC058CEC4050282EA8508441E064EBDA93A40EBFBC68EDA94DAFD3675172DFF79A52E352044
+D94D457E84702C33F1C53855D048E0D37BF96E9EE400D584EB9787180E3765A37533BDF3F814
+78BA837FC6D007AE96F23F4712F0D8C610EC1F8027A0D0A993BA0F55D91A92A6A2CAE17E2F58
+638CB84099348B02EE5347FA6F02851EB046095B77B5011E1A629834098593AC3BF9BAC56380
+98C30EA3F0C5526391A8736AFCCD1C3E5864B2CB555E7D979ECBD909DA06F5AB8419C134AB29
+2C296F4EADEA3118D7015DD6A3B9D7350229D8833E34A583AE3B8D084FD9CF948FCA765BA0CD
+47FB37FE46BFF0BB49E7D2A0580968D09D35B8A28FE54848CF0BAAD6AF6C25AB15A1882EB165
+1FC1DBCCF0CAB68A5DD18974C2C5A4AB08C52AAF2C89E2577A621054D8D25A340AD7B0D3167F
+31FC5046819C9728A338AC204C3B0F196CE64AC34435B4491E0E357F26EA356C9049499F2036
+28F5D3BD277A7B337AC5D89ECB7F26E41CC80DEDF47FBFF8DC2E716284F68E6750C0AA4A1933
+B38E114C7A3761030FC8A5B9E1E7FB753E287576AB81A3D6F54691B9945C11B556604BA9853E
+BD89536E56CE770BF86DD1B26D10D797DBB001FD0BE132E5B6DB3D6B9267587F30BC7EBB1B55
+66BC7C5609F9D1125B4AA2ACC850A6C39FB0ABA181AC370E8CD49C56D0338832AA92AED01A18
+B9D228FC350D0B2CE6E1543ECA4150C0ACE22B5AC3938A8A04101C3BD78777DFB6F7A570A205
+1C11EFC3CD6CEC68F70EE9F950AAB03DB2891F942ED550434DA413CD2EFFA9D2043976AA20AF
+8FDE9D2E2FD6F515BB36741CDA5FEAE7BA1E8AC777F68E6CE7DCC16EDFE02F57852E87FD8A19
+1D44D87E69F7B9878CBC734C227C6AF895F083263F4B5029A0013E5909AF9DA77EAC81F17A23
+284CE3BB3C74B26D9D08C5B7379CA8C1E8BE0C84EC0C69D07A645E613249369268FEE614BC90
+AFFBEA486BA07B993119329573575DB8788DA21E5831DA7ED91E18EE3157EC6C72DB051CAF89
+210460766DB6743D9C285FFFA2C2602759F88570367D5A2E3B97DD9B2BB977B3900CF9FE1B49
+0EEDAC8E3640E43331D6AE45355460BE7EE1F38B11925A9DFA3F943074A7347CF0E03F852714
+357115FA41A17531CA9FB49C3AF799EC0FEBD61B81631775290B1F38E205A78B317EF58364BE
+494DD1CAADA4D5F84980D1FAE9ACFF35E2E7D6EEA26F97DE826765DD5E1268A53F5D8AAA8FEB
+528E8A13E0E001BB04C033BC88B1B83E0AC2BA20109014C9FA9353E7F10DD7C1DF8B3FE48A3F
+9AC01006A895B0019E7F62F450960BAD05A70BC457C88F28759CD1DC5904237C1B865AB4F938
+6A2BEA70D5ECBAC9EFFFBA1680413C9B49B2E16485D0BAC750AE473B1B3F6A176DED4EB6A052
+9478F120294E591D34B90CD62579DC53D94ED0A98A5CBA48225E113C0F8BF5FA1113F695B757
+7229F5DEA917A5CB49B85D107CE29CBE83107465A98C6832FB5F08C6B82540123B675E69D442
+7905C93B701C3667DD78A500F405078A7A0B929BF5DD21AFE771ED05E73FBE5699D4D2C9337E
+ADA08B3FC5916EDE6AF94E7FF54A01BA67F72A3A130B61CA2E792D539FE4FB417CBC6E4911DE
+84388B3E58BCA8520EB12A0ADEAB59119CC9795B64FDBC6C759D314BF93E91B8F0ED753F2A7D
+1F50255EA5429A7C2C719E13734DC9F0AE706A14598F05609EFB370FF110B87D418BE62D6B1F
+3278C5072F7C2C609E92DE9CB15654CED6EB336650A9CA2EA1786865508AB6CD71AB57503C18
+7C0A68F532E3F05557C191D1029C4F6095ED7869A4258C893394D8636BD0DECD8F3851B42EF0
+EE6D6D7B23CD07698EFBF2A6159AD01F2FC5C69FA5ADB8F0CECF8CF1EC99AA919A57E6EB4E8A
+840A5761783C7DF31FEFF92651AA3975AF5A2003C307C6703089EC1CD63D8798CD4FB69CBCAE
+A810E5D70EE6F2DC9ED3CAE29039A86173132A0EC628814994191095E1F578582B79274C6050
+191EFA3BAFAF6F331B3109A04B5450EF7D1E8CBBD634374F200980BEDB6A34B19A2057523C86
+706023EED5563570F6F88FD9B8310981D7C73BADC9216AC45A4BFAC6E4800CD101CCF035D2FD
+D71A8D082BFEA07F3F9CF95F2E70FBCEDC89F27BA661EDC0DB4F2468EBA2E4290EF9B5670936
+EDC728E55963D74C444E03AA2344D80C24405EB031F5933CF414705C3329FCF23D93C1F1C6F0
+2AD7B4FC6E5CF38BA92ECE4EA1656327236FA26CAE52031F4F1FA98903DA4C361FC7DBD3B5CF
+37508E1F22C582DE7E3E9F5278D7424A9F824FBA19021AC81EF7F0D3C6D67D53A26E4930BED9
+CB72815F0884BF52D1DDC54E4AF35D9558345D498D63E7A7D6BC327FBF8F47C4997E2DC4C6EA
+4E1B3FB9587FE48978B67EF5C8E8D8CAB7627A982DE551DA90275AB90DEAC04879021D593430
+A30240CF389E10D256FA72A8656E8A8865750283CB245CE063C4EB16059F25AF21AA7F9412B1
+51A3404D965C2CF02CE88FBDD3A708FC7CFA73DBA0C664272F49F86915FDF58477AB8678D42C
+AAB245B637168C4FB33647C6A2CD7F96D54697C375D0422E27D121899462D8998B3624E203EE
+5D0AB08E0AF286D5F1352F0E4D5B58774F0324B5479621488FAF503415333C9B232119542A24
+54A72918BCBAE3628177414CE76975F786C68AB4FBE47B150539D9BD711C510A7BB87523437F
+CB820000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMSY9
+%!PS-AdobeFont-1.1: CMSY9 1.0
+%%CreationDate: 1991 Aug 15 07:22:27
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /minus put
+dup 162 /periodcentered put
+dup 163 /multiply put
+dup 164 /asteriskmath put
+dup 165 /divide put
+dup 166 /diamondmath put
+dup 167 /plusminus put
+dup 168 /minusplus put
+dup 169 /circleplus put
+dup 170 /circleminus put
+dup 173 /circlemultiply put
+dup 174 /circledivide put
+dup 175 /circledot put
+dup 176 /circlecopyrt put
+dup 177 /openbullet put
+dup 178 /bullet put
+dup 179 /equivasymptotic put
+dup 180 /equivalence put
+dup 181 /reflexsubset put
+dup 182 /reflexsuperset put
+dup 183 /lessequal put
+dup 184 /greaterequal put
+dup 185 /precedesequal put
+dup 186 /followsequal put
+dup 187 /similar put
+dup 188 /approxequal put
+dup 189 /propersubset put
+dup 190 /propersuperset put
+dup 191 /lessmuch put
+dup 192 /greatermuch put
+dup 193 /precedes put
+dup 194 /follows put
+dup 195 /arrowleft put
+dup 196 /spade put
+dup 0 /minus put
+dup 1 /periodcentered put
+dup 2 /multiply put
+dup 3 /asteriskmath put
+dup 4 /divide put
+dup 5 /diamondmath put
+dup 6 /plusminus put
+dup 7 /minusplus put
+dup 8 /circleplus put
+dup 9 /circleminus put
+dup 10 /circlemultiply put
+dup 11 /circledivide put
+dup 12 /circledot put
+dup 13 /circlecopyrt put
+dup 14 /openbullet put
+dup 15 /bullet put
+dup 16 /equivasymptotic put
+dup 17 /equivalence put
+dup 18 /reflexsubset put
+dup 19 /reflexsuperset put
+dup 20 /lessequal put
+dup 21 /greaterequal put
+dup 22 /precedesequal put
+dup 23 /followsequal put
+dup 24 /similar put
+dup 25 /approxequal put
+dup 26 /propersubset put
+dup 27 /propersuperset put
+dup 28 /lessmuch put
+dup 29 /greatermuch put
+dup 30 /precedes put
+dup 31 /follows put
+dup 32 /arrowleft put
+dup 33 /arrowright put
+dup 34 /arrowup put
+dup 35 /arrowdown put
+dup 36 /arrowboth put
+dup 37 /arrownortheast put
+dup 38 /arrowsoutheast put
+dup 39 /similarequal put
+dup 40 /arrowdblleft put
+dup 41 /arrowdblright put
+dup 42 /arrowdblup put
+dup 43 /arrowdbldown put
+dup 44 /arrowdblboth put
+dup 45 /arrownorthwest put
+dup 46 /arrowsouthwest put
+dup 47 /proportional put
+dup 48 /prime put
+dup 49 /infinity put
+dup 50 /element put
+dup 51 /owner put
+dup 52 /triangle put
+dup 53 /triangleinv put
+dup 54 /negationslash put
+dup 55 /mapsto put
+dup 56 /universal put
+dup 57 /existential put
+dup 58 /logicalnot put
+dup 59 /emptyset put
+dup 60 /Rfractur put
+dup 61 /Ifractur put
+dup 62 /latticetop put
+dup 63 /perpendicular put
+dup 64 /aleph put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /union put
+dup 92 /intersection put
+dup 93 /unionmulti put
+dup 94 /logicaland put
+dup 95 /logicalor put
+dup 96 /turnstileleft put
+dup 97 /turnstileright put
+dup 98 /floorleft put
+dup 99 /floorright put
+dup 100 /ceilingleft put
+dup 101 /ceilingright put
+dup 102 /braceleft put
+dup 103 /braceright put
+dup 104 /angbracketleft put
+dup 105 /angbracketright put
+dup 106 /bar put
+dup 107 /bardbl put
+dup 108 /arrowbothv put
+dup 109 /arrowdblbothv put
+dup 110 /backslash put
+dup 111 /wreathproduct put
+dup 112 /radical put
+dup 113 /coproduct put
+dup 114 /nabla put
+dup 115 /integral put
+dup 116 /unionsq put
+dup 117 /intersectionsq put
+dup 118 /subsetsqequal put
+dup 119 /supersetsqequal put
+dup 120 /section put
+dup 121 /dagger put
+dup 122 /daggerdbl put
+dup 123 /paragraph put
+dup 124 /club put
+dup 125 /diamond put
+dup 126 /heart put
+dup 127 /spade put
+dup 128 /arrowleft put
+readonly def
+/FontBBox{-30 -958 1146 777}readonly def
+/UniqueID 5000819 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BAC8CED9B09A275AB231194ECF82935205826F4E975D
+CECEC72B2CF3A18899CCDE1FD935D09D813B096CC6B83CDF4F23B9A60DB41F9976AC333263C9
+08DCEFCDBD4C8402ED00A36E7487634D089FD45AF4A38A56A4412C3B0BAFFAEB717BF0DE9FFB
+7A8460BF475A6718B0C73C571145D026957276530530A2FBEFC6C8F67052788E6703BB5EE495
+33870BCA1F113AD83750D597B842D8D96C423BA1273DDC63EB43F34FA90EA73A234AF35FD9B2
+4EB74F19626E9124DF7ACB92629CC87B2CF81C4A89B27447806DB34393DDF0402958E2DAEE0B
+4BF315F9AA0A2650D2E11EE289FFAEC940D0AF160FE7F29411C1C45869D1AC3BCFE2AE4DA724
+22549095F1FC9FEC606289316F106E719A4AE2FD45EE868FDDF07A80E9A626BB43CDFDAA9DCD
+208B88FD99AF20B27F9D6B5CDA6A3FA88D5ACFCE8B5EEBB38854378CECC3BFDAC526514F1BE9
+FB28AE628918BA942A3E05B78C3AFF808CF416A5ED01BE280231B75A7AEE0C66B0549713BEF6
+B3CBC188E625BA827C23C9F98E9ADB21719C2782EC86CF2F3A3B9DC4983DFE6FA8FACBFC6688
+7FB1FEBC30181988F5CA22DEA95EC6AB2AFA527C7FCD14B7952A2A0BBC8047DD79824D485FC0
+696AA1DC16819993EA7CEE925990CF208B1663ECCF6405381FC2D0BB26CE5FAEDF0ABEF0633B
+1216B4F3A138742AE422B81B1589EAFD2F0BFEE3444689461F0A6336BB7377830169D5F4277F
+3F231C8A779CB242DC73606C74AB947F0A39CC1EA1FFA441515210CD7E40D8541A96E5C22526
+194D88CA57A5CEFBE36576F31FC584EBBFA8EAE365B545796EDB64080D4CAF6D77A2435389B5
+F41D3658CDB2A77ED6A52E4C678B4FB66F9D9FA73F7EFB5DE11582821504D6E019E85ABD2685
+6D0B038528DBC0B361453D4CDDBEBACB41DD6C99EDB10E367D10D0A6A945EF3DE4668B5D5473
+B499ADCC4E19A65EB00BC4D901FB58D32F597ED5FAC20FF128BAAB7CEACF55A1EC4B134B727F
+51CDF9F4872302A930F1F1F10BA883FACB0B4961728F77A80D02D1F41BC197FFC7075541ABCA
+84E46FD5BE0F344D9BB27F9363347DAB71E5F7662551D0402470EE97D77AD369E6255C3567CA
+3ABA026DF7114B20A2F1808E053FA31E7F5B59716293FB106FFECA39FCFBB39419B33EE8BFB6
+D8C42CF02B13A51EB0BE99B23680DDBA5B0561FDFBA96502D5D66AE0E40247A1996D6B498871
+D21DE813CE776490E30870BC563E94214EF315A119224E0507BBC245FE0B59535D6A77F009C5
+20D1E3BE8D88C38BD1BCF5066233B48C108DCBE9E9684AE8A799C0B5EEFD6E4F0737F553CBB4
+0EC5091C4666218137E22DDC2093D4AA874907C89915E9825063FC68AAAB12946721025E4AAC
+2EC295E27E3D35844A4B452B2D9BE5C24BC171744E3BD2333DC1959B39F6A422C1909067755E
+148E0225781320B0EF70058D9038D4F5A12DF8E1A563271F2C55CE87A5BE074F9B29F861C651
+D6021BF253B2206DDE18AB986521EF272A4702DD3CC285F0EC3476D2ABB40942CC8FF0789180
+B6F4027A7F6413651A729B305099225B6F909C020E4506776437796E3D58F041FE75EF5C2110
+D9A51C5921F6456095124A293E244A013B70A870A38F52EA8D56E5196E3E55A6B4EF08F84F09
+923A77C14B3AFDD86AF386BF3761B371A1FDA2359C0DB444920C01DA74423E0DABE58895E7A2
+B65F443540713EC3EDC7A807D56F36D4B7B6F1FE12747C032F0887FE814421C09E368EC8C740
+540459873E403A213B0E9CB411A6E8EC67428F1D2EF568F10DBC94BDA1BDBC39F81F58F7FF4B
+30786894856C8F8D754B5CCE9540D3C15B730D0218F0E692DF1E92D445428F1B685FA4A5B36F
+6173EBBA9E90B932F66DEA4B38E59374054EC2323B9332BCFB84C008B1442AFF6D1BB28991AC
+4689BD163B9E79BB1FE0AF42D6289F8C968994CFB4F4655903B88770A00327CFA335745E3640
+F6F78A66C3C5011FD2C86136808C61D62EBC76DD420111E45509EE5EB3E1CB4B3F9A7FC4BB0D
+2734BE499512D059E191A77EF684B578114A53D06DE66A9B1521716A552982E0190DFCF61502
+4BD859A882327E214F26B1B1243E68E8B93F1C143EA913CD70470606C639232D2C6E9234DCD9
+2F0D303A45599BC82D824B28228F4FD4F16229AD8B2E27DE30C5608EF7F6C40DA0A7705606D3
+A06E0020A7C5D6C5562403CA468E4D66314456290FE657C202544E53B63950D413F3BB4E1D20
+6ED0B244F323B047459477B7140575A28AF141B192100B9E765CC2BB27D886BAC426546CDBED
+EDF0B7E06AEB18AE6D4499E25629366DA9275A2CDD531211CCE2DC40451E3ABCBBC3B859982E
+10A6832872DA625F10596C05E8FAEB24BDA12180F22C3C7C52CFE9D6F53144778FD300B8B1E2
+B886A977B9EED87C49CF70AE2EBC85F2236094DD73ED14144D85FE4E02E24ADED098F44F1EB4
+B5A9E0E67D15FB58408F85258EFF2F06A4E239ED4EDD6E8D91DEC719C8145DA7E533A8B7CC0D
+55AB16A9B517787470E1166AC2F5C899CC7594AB1651D4BC0EB399750997D8711773E609CB89
+CF1C27FC4A9154697EFB6CE1616AA105D0DF2DFFD30AA7E89A9FB633756BF609DE90506C3DBB
+518F42A6066048E12D2972E708101AEAD629EE8E6CDD5D164F9E1ECE4C763580EB6D9A83D6EC
+6F5994D658E3CF83E81248932577B91531288667C219916A258F27AC81DE34F1B5CB6AF41E07
+CB833A0E8BF6A99249CC434C34746D0F6072E8779E4B9583297B1C16E19CA066FCE82BBB2C34
+D821598B2208EE678770E95B48A4F569664FAFE7FBD368D1E5D09B69D1DF73099205B93F2174
+D95C435A9DACF24071DFDB86F6D1E19FF71DC06C48561538E068528E30CB949801378860E2FF
+6428543D7BFDDB1C8C8A392745AA37DB6E341931D4B99CF9B8E22E31BE25F6CAC27F2CA4C4BA
+E74FF7586D8819D6F81A986A5FB512150AC9E4A6BF6FCE5992EEE58191E7283FDD1BCF67D069
+3607CEFB968A361498C783D28153E1DE5424BEC4032349F61036547E37BA99E59E96F8962EFF
+06784AB6E0340BBF0AACFE04E12BFA5EB89490587DA665B466A0A2F3EAEE78F1D4C0EE8DEA69
+7CC4DA7EAB852159A707AEB4AD5D46B8EB3C7A52E77FBB683A8DF45662AEEC32E9254696C259
+1A27AA65A48F9B609B7FF686B0C516A82F2F3A856F9CBA2FCD485259B9C4C71F9A2DC8FE5459
+4E58941176A7B4714DAFE21361697FDFC349430EC5AA31EE3AEC18C40A1D3CF225BD5989650D
+05D6FFBCC63824ECBA52FABF1AD9C8466CF1254423D999B1A6B290F4D68D4058BC1484F04D45
+1AF4475ED15109CB3B3AAD319D60181B1D03602BFF1D6C1C132AFBF54E1B91007778F7044260
+078C8FBFC7E6FB22B9B7974B3B535D27F434CE90F29E29E3A120149635595CCC832F5AB85385
+A16037C188C2E7C3AB229DECC132AA637FAC1D6DEBB8E49AF3B30E416793FE1A544B36DD5263
+28D44FA684B2D3E092FD2858C77E9273B157A0296D72A564CBB6B09F9BAAF13F79EA7C6F0230
+E53975CFE29A317A0E346ADDC61B2BE668836DDE0AB038B10D099FF2734065473139FC737FAD
+1DCA597923D2A541F672A37BBDC20AFE015777957DA771CDEE85D788FC320753B0D753EC6FB4
+2ADA7D6C912F8385BAF497E861D1C3E27B422F69894D7BAB83B17F9CB3AF83B4CD813DCD6B29
+B61BCA6D780695BF3FD41AD0C86C081A2BE931B1BB038F0B720C1B7B944BB5A2343C65CF0547
+46F17BDEA90301968D294BCFDDA9B996AAAFAB2A56FE05B9FC6020D35C465C49F2DEB486DB89
+9AC323295A7EBF6A6BA54A455AC9C40778E20C0EEFB2442A7BD9D7C423CDD0EAD44845EDF403
+EC3BC3D6D2CD717734C95240D3EB7C7EDAD099F11920D053E81D887B151BF10C59B3EEF406EF
+0BCBC9764D603B80A7373511003A1FFA9B411AF8A7552FB0E830D4BC9FB7019CA7F477489FD4
+76B4E5CC71DC01341F93160C8951E622E79CD953DC8AEB016123BA71D5104525CC03FFA37310
+57FA0FDCEBBB97C0CD8415080EF05459BD0AD8DC0D03878DBE98A07F0C55D2EDA9BD2B8C36FA
+757F94B538ACE2E5D10FD0CBE23D83FA8179CA8333540121300000283E9C2D3CCB5C6467EED4
+95F927EA7F77552E22FFFC27CE2B4BABDD9255469BD13BB81CA5E998D7DF014FA8EBB880AA21
+FC586DB5BC9E8B722AC26D730F74CFBDFF0358AA7FA75A1EDF7D14E9EB3AEF23C78E52983E36
+F98FF47FA2F897AB454A569E1EB4DE93964384F119CB8914568FEE7D064B35C42C01B66DCB05
+6EE6C39CE49E81FEBD6793290886E836F8D23E89D87A220B9BBB45AFBDDEFE4D1C8766E86386
+21E6BD4F785032C15E1E74F8F5FD2612AA6917DB64E8BC7678B9EA2B3B5EFB49EF34C829D497
+95F9B6101F394B142B54C5D7C128B58A9126E1848225DC27185F7BA9C3DB09333A4D5824EA9A
+F8527CB48A315FED48DAEECDAAB29BE2D286FEE06E4605171D5AD9DEA414ECFE793D6E303864
+72499CDD88A1758BFF59FAA4577F3DD75D2C625337A33C7A839B50C4356714424AF153A4E5D9
+43A9DB4849EA5A768F8EAE150CEC5065BB3AD73F33E86DBEF065E0D268E98C964D8D5493C710
+90195274C3D5C13E58D9A3DA34C16E0F7254D5BEE3A59B99C36E261084B4C5A7DFE7EDB357A2
+B9A3E6144DF5FF533774F22E97055C23FDC200C5EBF55A4E1C9D4B31376BB703C802F1A6E72C
+A288D241C383F09238C6B5092A7C4A4881AADD5CCE18FED9DF4AA25D7EC8C9BF79F86AA2A5A7
+6FA09BAAFFCB1A538491BA9B74865F5C3BD715B6F8E61E1CEB54CAD601E3CE91EB09D3E9CBBA
+3D8080C0A70C43D04758021834D18B3B1509B6204ED52B3408D2ABF63173C48B137862A62098
+AC93CC52029855A98C676B80E3ABA918BBDC47C9A7C75CF4A9EB8C160A417DC0179CFD3F9643
+80828E1CABC9258CA22888B50A5E92084EB60F21862CD49898794F5510F04AF4EF7BD021E54F
+AC2E8E51245ECAC62E4673AD8709635FBB89FD2A1B67CFDFA65F64074580415D98130B430A05
+57C44B565DEF83534AA0B389FD8919E7EA31DB5905187671DEFA960BC43E193D402865FF8324
+6EC96137B4C8D54BC69E97DD3175E260339390BC5DBB8669AEB50FBB52C4A6B8D56FB982F80F
+DFD7B1802E179741A021043F179D5C867321FDE1820C9B8F56C0FDBF12A9B5B0AD988887EC72
+943D8E8AA508521CB72381846697C09E46A082CA77CBE2DB556D4D24D3250BF5F4BA10BBBC08
+5DE7BA6FC161E18380E671FC15813B1ABB7B88A7DAF87C705329469E2659A56131001C4CD3B8
+8B62C43359FC38788C30296F08751BD034109E4931E395E5A6E38126ADEDC01E12B99D65070C
+591AE1D306A5CB814C6B6B98DA11CDC736FCB95C2A3C393ACF1025CE94DDFCB9F48091815385
+7F0A5A5741DFE09000D0F6DA9D95CF1CB72E1D04362CA54F0E982EBB8D0BB7304C5DA7AA6374
+CCDA7628038D1C3FBC7B49B04DA3274F47E0B630B57AE019D0FD4AA917CD46562A6278CC43B7
+5C695EE04F3A1F318DDEDA671A1872E6DF5E55B45611394AADCC45269BE9CA76BF2C44CA39CB
+0F8432E5FBD6037FF267BE21B2BF6558877EAA1B3E54B668021FCCC07644FCCFB0B43255A94A
+48D626EA2BB20098C6EA743AB752332531B5E8B1BC8F6B061DB8CD7209A7D6CE79EC1961706E
+5FDCBAABC5B55402C018ABD452C2CB976B71CCCFFB4B57401A0160066BB3ECF412C779FEE337
+F4B477E1EFCD4A0F7338E55FF93A9472051F4CC2F53CC8A2A694A861A033DA19DCF7DBD11802
+50A442E9A27B8A2EDE87FDF9A8F349DB9CD22B66EE990EEF9EB1AC364900C634B5FBB9C5C6DF
+057E254F2E95CC8261BE32A771D197DFC18F9088A65158B77F8AD81F60C6F74688B7107E6CB3
+C426446EC9101C338119E5C9A0B7E9B17B85C4C25F0E2DE47A55E4813BCA52BA6F53A2CC0B3A
+E230939AFAF657FD85313A26FEA45B3D930CA24E3DF13E43CFE1393EB0CCD3888A4C1EDAB4A9
+16BCAE548281579A44078BDFE4A81499615BA7146EB71E67687F01245853175AC0FD2C740AE2
+3FDBE55C339ECE05B2EAE5594F993F0D127D745420C5028F20365EC46A1F0F6D136FECE236CA
+5D511F8EB576FABF0E9279E812A42B6D57D8DF698EC35EA53562CAAD449B048BEAE2FE1EFA98
+A9BD531671E6AF97CDB8AC81A472CC87FD4AE92ED2019E2D8AD7729AFE01A4647791D8C95846
+6ED4DBA14A86E26AA83351F1C5EFC20174E4C2371F1D0C5A9768BBE26E218E343BB94C35D4A8
+F5AA51A18A75005B583DE5172B842097AD8EFF20B866B0FC14CA9C040851DAD663DCE4EC7297
+9543EE0CAD8F8BECAA466AF04432CAE16D348080573E4E43B244AEAE5ED1A4F411FB6631E73D
+FB837579CAF434210BE9F6F4AA5AF350AE14933A6D315EC86C75DE6EE4BA25E8EE8382BABBE3
+00F8FF48B5092C83AD9EE9A02318C377209551CAC9CB575683C30A3F1B0B8E153F860DD5BF09
+7A3630A2B5E16BB4EA0B3489F6DFF3003F7941C7B6D65E93BD22C4328DD2C318C9FE2DBAB677
+2EF861FB7FB7DC1AC4958E942203418734BFECEB0A95F6E798F7D5292EF1BE205FA592B52FD9
+BD8BDE4955907ABF1B26DE31A09CA50DBE3B2F0C9B1942AE87AED1AA7518B271B9EB352F9C46
+957B328D9BBE2F0DC9F7C6B4329316275FA35BDE6F904B5624D364D23DCEE49EED637E43049A
+18BF2D8C6A119FAF128E71EAD2832C3BEF95710D82EEA2D3D2D9FC2A77C79EDB311D0388B651
+89492BFEBE4146AD39B0529E78BDCBA33F779CB5E3416A80E455BF0B9F9E5428D98C011A52F0
+3DA1442C0B9F6DE21827D004852442D51ABD2D4A7B17862FA6F375FF5DC3B94E2E88B47EFAF0
+EA84C00CC032622BD4EAABA30B0A9CD9511CDBF0C4751CF421CF74BEFB8B1DD81D42152FE5B8
+CF6D987AAD0FD44C3FB8E25732F512A10A23522D2F6D35270BD5925AAC0D4AC930A7E2ACD799
+3185A2DD084F6AE3C41332C40EDE1F22DFFD008819FA5AFAAFADE015FC821FA36625772405BC
+7E995CE0551E1B0A0BEFE8EC3F4E3E1528DBC4B7DA5842561848570167FA2B20CF99176D9175
+2A5D897216ADA21CAF1D0B954FE6A631CDB45684888FE366C3C4ADD8B6A2B3EF76543AA28B66
+19BA29253A8DA942081A63FF830F2500942C65A6F7248ADEAD0F19AE0FA1268A4FD68E33BE0A
+C1D8BE4223086043A96746C7E1F2ED18B6B46FB5775B3BC2022C56935040E6581424EB4B2294
+912F8D7C5ADFDB8438A5C57D7DD4A78105DAF771C0F6F445B96DF66A33B550EC3D1F90851DED
+DE5681A8826EF6969192F99D4B3715409700CB201F977344D84484A688659C954581423EE028
+855B18FF246BD585FE868FAD52666F26556CEB3E506B844D88D42A16DDE434AA4E31B9128443
+8A9F78F8CB488FAFFBE492E66EBDB881B67AD79AD11B5035461A60246C45210A983A097161F2
+24EA8D0D588B0C82A3FD1E9D76934FA221E88C61D22D17193B22D0286EB7D1CC280603C089F7
+EC1E34866EB172F86470A9368F6D12AA403A5F7DD429C877E91195EE19651ECE85C2B27F7822
+B6B36A34D0A33FA7F7E5B5BB9401058F04AE30AB700C2DC95BE029611A0933C2FD41E1FC0017
+B3A9AC906A5229E4E55FC97FE0822F2291F21CD51730DCDC55272E786255BD2636EB76C86B82
+6E65897064C776C21472F4C2846647925713998FDD8EB8025D6879FE259EFB46DD34AE5A5863
+D5EF76CE873D9127CEA0260453DFDE8BE0ECE48F75EEE1B3B79245FA5EA93E2FBAFB78F794A8
+E21C7A89BC5E9A3ABA93D52F7AE3EC1872F91062DB372C7AF1EFAE6E3B5ADC4CFB0169710D3B
+CC46631B9BBD58CD1C99C01E2CC95B74E3418631245903A6CAE538C8609F3F9773868A95CF08
+C5EDB36695AB8E8FD74204EF34F03EF530B79360C34B4A359B8E17401BB2115482EA6CA6929D
+16D3B06883B907C800D6ACBE41FA4BA2223A3EDB7E2C90D0179E9E20B4A18C13739553436019
+7E83E759DC15CDE695F073E9E96CD131CA87E44FC8E45E049B9AAFC8835482570DD872D19DD1
+58DD646C431F60D5C5BFEF48012B7D89618A94A33E6F49FF72C058C042C1871DC552D430AC51
+079C496A60CE005B187DE662F1E78E2AAFFF90DB6BF6948FEF33BBFC38D56F8B104A28C9A1FD
+239F52EBD02E4AEAFA944A0DD7C5ED895CBF11D23C860AF0BC482E2CEF8CCE58857E28B6263C
+CEBA1A6C0533CC8E20AD3D07ACF6DC69698C8CED7C2915173714F6B7A6CAAE546FBD14FFAFF7
+0CD63471B9B9CD660C89AD66ABFF923C088F20AFB06DAB331CFD642D02003AEFBC3C5433CBBE
+FED40AE1F11D6D6379DBBD5E10EC42A60BDE3BE5C4D904446EB0E17E1C57AF3D4FB9F0666FB4
+5678D598965A2F3232118FE53BCB6FE4CC10EDE002A6C3D1F5248ECFFD853364034C12C5BE69
+8C942800BFD5DDE2E9D80B521C4AAE502FAD878A03907348875DF256A86C38CF5C40127A9274
+F959DDF0A604FAB03933FF7C5DD967EA143B14C0414F2646D3D96026C31BE5B5FA24AD4239CB
+65667B84167C4927AA6793913F138EB1EB68AF857563042CD300EB157273FB4FC64976FF9647
+5C900AA939C59898698E393462AE4196D32CCD2E688FAEFD515F8869C0CAB9708E12C4AF9B90
+FD3979A568E77282C015B3A2427F7B841239812AB33113F68A77138AB3A43DDF7152091BC622
+38EBD112CC5258290FCE54D1772794A7830369DCE1D742AE56F926B2807EBBF14F4035BD6F47
+DCFC1823833F9E9A2C6F6434F0CD3C3BD875286350ED70A236ECF6D4ADDD4E9C95024E75FAF8
+D16DD22402CD95B59C99F6B933116FBA8C7F8E1C110032913658330E3C283E97AE5D621F3F15
+E48EFB86441C33693225252B6E084D0A3711156955EDC564FFDC2E8D4AFA588FBF44742A9EBA
+7ACF477ACC90272864535ECD9A38229713CDB6D7A34A1B6997936F85F533915199A8AA1821F9
+6284102BA39C719E9A34C2DFFBBBDB05D2E23810C209066317A2F470CD759FDEFFED0F0E9A9A
+FC557B76A094DD659BE6E35C61DE2CE9D56E4024E97169E3988F42F1DB4504796DD56E10F211
+49E65EC6BFE7182EC39A312E1D5870B91AAE0F1D11635D80657ADAC08B885E2E185E4657AFBC
+C069C337D1B03FDBC3078A9D39FD48BC5B12D08DC5A1B4D2E3665CE5A15CB780FC7C58F0AFD9
+08C6C37375C726EFC5C4C6EAC60AA862329EDC01428E97D7512F61BE628027020CCAABAD392A
+3F4409EBE2DF498459E7B60656216AADF9D591860C56D7C743AB71FF85EE652D9B6B2AE96119
+C627752534C42C5C781A76BBE0C8CB87E4D7A3BEA6FD1E56A845590AA930CD2D02B895687A1F
+5182ED826A88CCF9EFFDA2A7C91AC34ED7E62B895E694FF123D80ACE7DF2ACEEEC3253DCE5C2
+4262BD73BC1E12253CE4611DED198A5E075C540099E351A335E0EDC37B07202ABF457EBD4D59
+5610C99DB34C8959A462B132DB3588698CCEC771DDBA29D0E708190A4BF31C5E88D8BE9D25DC
+0D035B752E5B254B32DDBDD23C23DF47CDB65B6A3058828EAC63E54D0633898905898C0C696A
+3DDD1F8AAC9E251C5020EF4216C93B65A712BB19CA6AA941840ED9D18377DBCC82E3A72FB085
+6C88F41DC6D3062737D7002DC612E901B6C46C63B04ABA1EE805CE76AF11B73DA47460467D90
+1448125C8CA5A72D3A6808FFD1F2EF62A17C3FEDFBC57E2C850A6944E249A47B1B8958025848
+CC8ED2D53227D37459F5C5238753D86E96AFA1DF0A67EEB79E83689C4BC5D935968A9CC68B03
+F1C19F8169619330FE1C2B16EC36A860C3E1D0B22D3C6384885ECC63268D0EDA32FC07A2C1AC
+7DD406925174B46CE8326134EA3B934DC19E9B5A7DB355DA603C369EA27F14387BE3AFA9B7A9
+55A1DE7BA12780BDA66B2631B5260C4BF644FCABB000359241AB8DB95E89ED8D90EBFE561B1E
+9BD56A1F1776F510D20DCF760F72FB2F75B771D1D5E1175F8B53A96EF584888B30086B249447
+50C06A1D374639912492A8DFB9EA7D8E79BC02B864F0F5F2B18D9BF7A94AC2F72B279B634FDC
+DD9A98274F1C0C75A4B8EC98000530CFCEE58AB4EEA884CC9507AC73F6F21C627BD8554F3DCD
+725807ED8F88A2CD55C596906C3DA61D489F4CE9E6CEFDF06F3ADF4296B52922099F51A21325
+A524A2CD0EFAED0BD84694A09568FADB9A64C4959D8EE03D3CF37C202E21468888E8ABD0D773
+04BC831DFCCF2EE88F8D97F6477732DD6D16DC66D161CEF06472E85C2B850D1D7C3B63ADC14F
+C7C90ECBEF2A862BAC75CC29250E0722D7831E6AE0705D90F5F893A7244C9FB6F0E3BFE2506C
+B45FED22B9685A00CC20E217707B82108B47AF78D8ED4EBF4A08DA80903ADC1A70CE142698FF
+37EC752E586FC976D14A97BA9FB28437F75F09AE4737E72CD67CB7F2213C1D22CE2F8CA3405A
+D78FE376C07A7C26DE7196C19CA6FB74C76C80EFC21A41A33A8E76C7FCD254BB5C2D57131B41
+64C11547B68569C38C00A4454EA0C205D5CE20AA3B706D2879C9C90470E796B232C04C93F163
+99D49DE351FEAF6D62207871459DA540EE220744B58584FBCAF4FC6E5BD9FFFBBBCAF2BC2AA4
+76CDCBC2C29C319603B3C09970456F4693FE516E788740BA2C3FB8C415B5F4A110765A1CD435
+EEBE56CA018276A74A43EF7647477C7DA77E2B9ED6FC18E7A41351FD36D2609D791778D29D94
+9D519468A6A890CCA284B668FEFA3799433AB8B863864811435286C4F1BB5A951E7FB08DBA1C
+0B1927D21FBEF7A6979CA66F3310C709DB2FCF5F73BB6FA08DCFC1F0B2971FB1C3089548FC26
+24C292FF756D29BCEC8372E1BCDFD5A01156465B9054BA7BDC7019201FECB2F6BDCB7887AA96
+CD30F2D24C6355A33CC469D625C249487D5A2C99BACAF0932ABDD72167A20285D1A4B76CF7A8
+71C3D959682A3408041936AE6B906F0BEDC4F9EA4F076C198DD4A81536B37DC78C63C6A0A798
+72551796371ECE49B3AAA60D3ADB54E2E3C914231A572ADA0772AFD522056B0BE34822E4860C
+367A146D66EF2514729F754D507108FA60D995A5FD67F4F23E600CBD9324786E0D22367E6F03
+EBB356E3AC5ECE078FC7F05E10CA32D45D5FE4669D6E1A3F71A76648F72012129FE0E453D04B
+9F0526C194356E0C6591933FE3FB5C79761A5F7CB06E73D48C0EB224947C2BB005E09FCD76C1
+5EBB2409520FBAE004DE49EC443C8999FA55037E250845684CAC71B4D044337D72504771CECE
+C8CCEE0034F22D31E6C84EC1F8BFC221F117D141CD183E5F70E8BAF43DA3E8641015AB0D147F
+9A828CC1204515974F351584F70C5EE742FF30D6CC59784FA8B59C3F32115487A36A6C85FA26
+E154F4B5753A4E6D8EED81003B426A7B39902D092FAF36E8729E419E2A40C25C659CA6838366
+F974E1EB30D4CA2E52C1D282D2C7E133B5D1C4AC0E4358B710084A4D141F8F020BA1AB31C2BB
+D13D9381FC1B961BA11809173DD4775D60F2793ED94ED57D9D72002F8E77185478511CD9876A
+BB61C0457A428FFB7178E13A4019C8B20425154D2E2F42ACB079D0F385E7DBE259C5BB3A2984
+3AE99197B3D8841E80A9456E7C8C8C2E8BB5B49D6AED06C69E51954C8AFDAFB52A785F5EF962
+B8FBBAC4E7EA21480C344B9B8669E0E9FB60F7AD6E20D902FAB38665679E43A03123B34E5F92
+629A739E569E72AF9707C8B06000E060A45B540A5DE6D1E4AE9C2558186B28077744769407F4
+F42EEE8AFB718F31BA0EE9DA255A4428FE5225451BEEE7C743677D86590BB4CBAF0A728F34C6
+6D0CEC029923076B65179F37FFEDC1DEAD6A678F4D4A6DA47B66BF101CCE6A90F7A7A8749B0F
+93968F2A5DBE91CBB374732C969631DF81A4F1E51326D31810614268EDAED254E4721D59EDBB
+38E1CD3138931F95ED8A2607FBED22652AFD0E181C40B627F3ACD2D1CEEE74CA61A601BAE64C
+567E6814D204EA628C109023A7149772ACDC7FF9FBEA97BE232D016A1F1EB6F702BB7EEFC069
+853B8014D9C33EB84BFA60B6A1FD4A419CA54B288E30034B228F5E3E846274073F5EA3DC684F
+555DF2E038CFFDAA6E4041EF7F5A7068507BB98AEF63F8BED04D4E2F2B88C07FC7E80F3BA0B4
+FF9F583F8BD6FE45311ACA1076AEB46B391DE8F45C1F74991AF796666A0B50A0CEAC343D598C
+7601667CCE477811C450ADFA5CAEF0D659781553EC53B50D736F214363C9B0EBC163F95C5C49
+CA52B9314F031707CB9B0CBFFB63995AB995CFB3E65FF76F42A94BC3B397E449213B77858E2B
+BE42044857D1C7058F23456A5EBFA36DAC299D0C64DE21D97356017D4E53EEEFB9DFC4A5A18B
+E8CD7B5870F9756CA3688875C8295042FA9C38F2A7999F41AB701128C675AA400C183D67CC63
+6F98F885C9536CAC182DD12F9077279A20D589AE641E4763F59FE68D1E3D496031076F789A31
+B92797810F9ACDC0E0A7B33A3A88F3900530B5A02CF37D87D13E01616F3381360DF4BAF00175
+1B1E8782FA197BA66AD408AB8A3BD38D924FC0F721AC6596F0C14D3CEC9D875BE797004B439E
+84BAB84F43B1A12AFF062E3BEA2BC5618118BB0653AA27324FE8A3DA281C0DC71DC7AA17A4E8
+7299E97BC95AECCA52B97EC6D57AC590DFB9E52E7CC5E0BBEA58ACDD75EF01B932991D5BF410
+1ADE7EFAA4EC44EA551C974F9E7119151FC071D167944B23023CF7051C909101AE3114A718E7
+1D325392DA31F75C88B11DCA76ECFF14F1BDBFC695CDC4D089294DFFC13A57E34A72E454A9BB
+E8D482436E8A788854287C69FB71D3BC0B5CE125A9E7FC7898AD9FAEFE19BDD664E291FA5706
+E9EAD8C77CF5CED09C9274B2322ED7B6E2E8F9C3D1FA9FCD2154E0019B535E69A69251C866A6
+9351F8F24F3860D3D2B819FDEB7B02800E59E0F5197B3AC612F9BDD5DF719A1911C48435514F
+8D6690B920C2350BF14F0089A9BD92C2BEAD5C2FF30934B340EDB90D0C36889EC4202507BF53
+2C91E1E001FB9FDBA89D5A9FBF9C83228B19154297E3B3F87AC2D19A0FA9CC718F60A81444AA
+7818D14DCAE8DB9F35BEDE20330B1F2FE973B21717DA229455C782F533B5A21758F4DD11BEF6
+5D41380F0557FC000E43C76292C3243D2251C4ECADB82867553CCAC7CD7906E72F10C785BF2D
+884E80397A34C4268A80B909E9CD10328D2ED4A336F4C048DBAA4A3C67E9EEBE083BA7C8AF7D
+BE50354F22C9DFA81E24F08B2496A67FAF73D78B34BD3D9CEAF8BD47A1111976927650E72109
+5B1C19924FBDB76BF91D710319FC897EB76674F8CFE5BC8AD95DD86F1801FB56E1A94B0D1C19
+31528FDDE30D05291617B4E095F2ADDF2A4E9FD339FBC3F2A710402C32A503DFE0670777B1ED
+3B1DECCCCBD2A36927EA497F4401A4173615A644D639D6786B7A194EBCEF642BD4A69C7F11FA
+541D1D5E96C2328EE5EF5D3182EDE03E9F33CA1A0FAB75DC03FEC53E277007232971A350BA9B
+304B3A7B4716E10163BD7CBF72450798470880EF7B29445450D13AE9A791422CD0CEDFB39CD4
+6C1BABE0968E1971AEB7FA7928C1892726DBEE269DC53A555EBD451CC52E591E962474CB684E
+9937F44449A1EE9E3D8B93F24D9CC4FBE226E9FAC41461A08207F9FE9A75C015928F144DB071
+A268D413CAB561DA23DAA6050164AFFD9DA89F1E7449D3A18C2858095F9866A7C3C45680CA72
+D25D2DD7A0DF340CF9579D2E1A4B40E581AF74FCF18AA070BB02656BDBA1F8A8E81996E43906
+2AA6B6AF83AB056B7484B005C10AD72351054CA1DD21FF9241D02DAD97CBB9708B8605B185E7
+52BC036A662A8C62E26D6CDC540E282BD379891C4C0EBC66E4AA5A38F44DE31F1BAE1CACA711
+007E698D4150BBA0FF2119CFDB59FEDE5DFC8D7C6A9CDEC1259A2CABF17784FBB694F778371F
+6FBC34C855197B7F7802F1767CA4D20B1FC5BB7DA8E0F880834D3963CF321DD157441D38BC62
+E696C7A150590311D19380D77F39B05DCFAB089B8F3B613EDCBEA90CD8FEB7B367D92028055B
+BEC1D34D9E76C23AEE16A2E58AE7FB62672F971006E21863BEB87098CA1C58A7C8993299B605
+EE23EF6A3A75A9A54CE8136133AD569321F471A3B7E3B7277DA2120339CF1D07948BA3760E95
+F1CD8CF15283E8008AD78E5C391A953A2C9EC219010C6642FC23A1A20DC1A8E73F697AF075F0
+6CAF1E15E3A4DB743E1C37D2DE5569FC5BA700F657DC9957F684EC0B13F841C50EA9AE04718A
+93510166B1216A1BBE7C5842A7239C078E6F8AD0EC731216D9629F77A983F3E498ED41077E4A
+2833A961676744A8252D9293D7E8695A069529E44B657B61F0537A2813A0A94287D7983FFC02
+BD6A957C7B74D7C4D7019C9D1C474CAF66AAC0405DEC2DC968E85F1E9C1B59CA213C0F631DB2
+B2F203EA816511443285F7E83AA2AED0592675316B0AB1C295C6A1FE553CD2E9F16F7CC821F6
+272A8AD0091A775594BAAFDF10F704569CBBB3533196607F6594E5B1E4C77202EB599F3F330A
+B3DD8C26555AAA4612C75BEE3D2039570D307593394F5C1DC5307DAE998D1EC73A6FCEECA19B
+FC35F6C3FEFB45B9B462971F96B0E770A6A6BEBF12D3A3420477DD83E4575A2C4B9330336C6F
+AE6B474346495B68F927715F999D58E35C49DB5A5CADBC98591462C4A05A7DB4C202A89DDC0A
+409AB18B70DEF14AF44CDC704B7C9D5F169BF0DE52F685DAACB39C0DAE0FE6739CF5DEE51EFB
+2A51DA04A7E83D510CA9BD40649A0CEB8413DD8855B8DD39C7766084DDA3A0F357CF5CECE316
+D0BFDFB79B402E1F777667ED5D9D42A9BBA869E36CEB097FE7CD48CAC7562DC7408F13577497
+B16A6D5128EF89E5CDEC7C0E93EADBB1B699A489CE07CB51BA5C2F21B03D358BE882EB274DA5
+992C53237559EA7B59C87557F631EA641ED993CC06E3DB0AA291E57F380F509663F0795AF2A0
+95D988FC8D2FD4780B8F8D16E7946541761DC33108EE20A0DA2DFF7E83A7948597B2310CFD3A
+C1B1AF72B4666B2CE84559281A5DE56C7426F8E4D6FA694DD730FEF69D89FA29FD52204D5265
+DBD079680761B72BEABC9E016213E9E02CEEDE9CAF1647877D6B7A4DF31D94F1D77CFACFF1B2
+B252690152E89568FE5B72E99D0520840809DD69781A5584444C4475C65AAFAD4176F913D947
+413CB2CA27B778177A3768F0254E836645DEDCC11AE6AE3C5EA1A075DFFD32DF9C14C9E320E6
+302BA7D1D59D258E5C6B623107C7BE8AE47E168D141CCD44D5147A1CB42D319EAA1EF302D4F3
+5DBD9F3A418E39E2EED9451E8004881A79889D412A47CE60CE86BDDCDE638BE152BEDBBD56AE
+1D1D0A3DD3BEE23007696366DA89B8AB63B76B25089A3C3708E44D5E7937B815453EBEDE80DF
+F400FD94200734E0C4D2423A154177B85873557E1A4B6C224B06CCCA11D306AEBAE0BFB27AEC
+14FA047D4DDED23B7838166DC778075D90094ED5E92CD06F48468B18C30CD8B6B250FE605EC2
+AE857BAE553A4CB32388DA08084FA957AC23BD35208CFAF7964757B34218AEF5193B4D019569
+A19297A1D813A912C7D6BB5456235DE0451BD679807CF8A2333D94D086D7A91EE6FEBDC7BD14
+4122012EFDB631B1E97034400DC601F633F74955FAE6D6B49351DDFDAA070CACCAAE0181A73B
+501E0CBCFB249C41D2A28B16C455467099EEBCC1B9FA6C04EB0930913155EC1323B7A2AA8AE8
+F0F73C42898A164669EAEFC2015113E14F9793678D0F50CBD040B76883908534906B16B6E29C
+5F4776CB55A9955AA41B7E0342D258F28FF9BEBA84F5685F1BEAE5405E63EA3DC93C7F7D7683
+7C4861257AD2B899272D0D67D882FC9D4F9A5BB3A9B8B97959B45B081609DE1392DC54AA8953
+50142D444FA38EB15DB0964F0E7E000630B3502ACCE64FB6BBE18FD94EA04FA6DAEBFA91AA3E
+A470831BBDBD80C4E9049DBE100AE2121E2D12A5923875D07F37F2EE97604A1E15721B675E29
+0058C119F292E8BA6FBF47CD4195C3D249335AC7EEF34C419AD0896C76471D11259B5D5FBB23
+BA063FF1743C8A62A96293ACCC9EE498DC81FBE7B3DB8C713AF442F2845680B72670A907CD56
+51F5DF4C7E71755DF356D5C8C2FE28C7A980B84E4C4A0FCAA4D1BBFF42CB821EE05917AB5C2A
+C5D6A51D3E1EC9326F61F31E1EC511019196A108A47EE460CE0DF6A71F83E12A71A58A78330F
+87D47E5B8A2724D0C31D5B390CDE246436838F1586347FBF6931A5BE35D337DA071734794704
+E0563AC2E4727D0050215C4ED00B2D2EC80D38D6B7096E701EE2EB61B8579A47C60BB0902F3C
+39D59F5E6CB0743DFA3D193781250E5DCBEA329308B2FA89D95406FA860FC6754FFDB2A61A9A
+92D764998F74B35C183CD0E5435C8AB0AB15D83777D0F4C9744CCC040310332B6AE7F0411AF8
+15EAC3094E734CB73BE514B428003D104F6BE22C67FB7C6641F68D2CD80A071C5C85E639BEC6
+0A321AB9B7069F058994E6BCAB2AD918DAE026B5EEBF3C95CD286B155A01210D202AC89247E2
+996CBCAA5B0FC5F72DE1F2AFE326431B49E4D09E42958E2162CF67ABF2D2C335424EC4908D52
+D1A3534CAD58BC48E6549528E20DA15A13BE3F3F4656D97BA087D356AAE63C4FE4FFF8161ACE
+2A0C465671017431CB3FF45FAFDBA1A7D6CEC695E3EC2C91CAD76B0CDE6B8DEEEB81D0443DA1
+EBDD1475BB8DF19AB4BAF2FA6F91B5E753F5EE11F62C67D5DC78550991FB2D2BCA39E0EEC87A
+A1D2302D3B7FBC57297BA3285DFD875F00FA3BC92E74AEE09407BD8F16FBFA1AC0AB08E58F92
+3A10D5E4BBF72B034F9340BD734373F0CEB0DDD6CEE44A903994806252A4107AB65B18B04D59
+BC46ADDB5CBC56C2F196A458C8F1BADD3C24A003E42239F058D6B9404306F6B38505E827284B
+60DC3C22E878F92F6001DDCC3FE63DC61A04087FBF2B4E3F2339AA658147186D88793EE70D6F
+24FE1D72150546A34202FC655D0145AFC2EC4247F8DAC8C3B5B6BD930934BD435043057CE6A8
+6A5F6DE5B8E51D7DB3BA0B3449612951E35F475E83B659041DDC1DC942A437A1A2778662ECE4
+5722DD25D0A59787F7E58B0C96A652B7708A8C89DAA9B577B9492DC8C48D98AC27C4B73CCF9C
+55B430FBCD12B5C6EA7CF90BD28DB91954BEA34CFFA6683EC5A3B84F0413FBBE04E550D6005A
+5936816848671AC4E369C1D833F41607C041F85B9DD20098B41349AD5331606BDEFF5B5C936E
+C356254A6CEB340345BC9DB418E4093FEFDAC4693A609D4DBE0669D67D443DCDE4735A8918A8
+B8009D055C0746380B8A4195DB3371015F61B302C95B45E2B11F013F8522A44C49040748AA94
+37884F805358D1DE4036F01FBDA4B986114CF9842F1E5D6E7E88F978F480FCCA51E4E0C929C1
+E3227595FDA8EB1A5D6361A5028E1209CED07ACE7D33E42846571A784D2CA58D02058D20FFF1
+955D0E5D9497B0D9CD46D37DAAD7951B5C1F44F63FE8EC3D7209F5C7F4ED7806138EFD4F0746
+39EB7A5CC5419BFD245C95ABD4AD268D4BBE6721F74A1565E2B7FCE1A0A235E4A6802545E8E5
+25BCB645DFDD9B87BF0E7379676F0EAA0E4312F9FEA5D9EC809EDF9EB4A09C8F7110E3842FAE
+2B2EE8AB6287C3411FF5417144ADA4C05B9BE3FBE325243AE2C0623837D2648C2712DB61D180
+AAAA7E06B2952E288536A7366163454831ADD3C48D865B5455B97DEFF5CE69746BA056903A11
+8A2A088817AD86EA8E6A7D7C1B30FD957DAE33BA15EA45FF661AAE136FC48A7481C567FBE81E
+DD7094ED2C4D6E710E2A0B626CFF67E78D83522A6F84F4B1C3196BE60B1F1F1C1A55EE0B0ED4
+F9BAF40264960A149A01D8EB0346131BD6DC12D336F67421A844541B519D5FB85C0CA8E82B53
+AD008F3BA141B332FFC6B505EFEBBBA8DC78EB8FB94506A14C8B212F51C0CE2E1D978FE6DCE9
+488831BD96ED5F2A9DC1204402CA8BF9D2086E4E78183CF56A3B514046FFE9F1FBAE06A6F719
+8AC66C62182F636E9277BEFD5378F6853733E1823BB93D5BAD028647AEABEEB969F4CAE37597
+667C1F08091CF9F1704B3492F4834E93283CF29652706DC0C6AD689F8D3BF4FB7C3C2C01E417
+C122C8F7CD30AA58E8C01C90953F55439AE0DBED0800686F8D096EDE6A1934B5F34B5FC73D27
+89F4B4FD8C8DE720238EB84BC5CF71D6E9FD4E618848C9C4B33BA6BE7D8566DD3708B2C244AA
+86E256B8E5954734EDA64472C438A0436B293D245B268C5DAA08750AD0BE8D1B3F5A7B4881E7
+D74FD9E3E7FA5705050141FBC24D71844055960815A3C0949283DAC0C1CF8FEBD10EAC6F9F4C
+A3F93D54165B0F74A811C31C8CAFF4BFE3AD6C8AF02FFCB2576A04C25A9DEA57FC322836B2AD
+A20745D121C6E65A4839DC52063FBA8D67D42F09A5878C9339E06249BC4758859A994504A369
+A67A17D7F36D583256DD65FE76DC44981EF254D5CD33C9C79717C051F20EDDC7B2744148BC18
+FC2244F596340B69D9BE1316941D6E1F00B3EE56A0425438ECADEF4BA8A9452D2947C7CDDEDF
+5D1BC2C3AE280D77241C48072ADD5C4A4E8806FA581E39F45C95CB6C41D87759AB21155ECFAE
+D8AD387A70B27DAE6122895AB20793ED40912BEFD7C25265D8B52E9AB0308A5920A80C4B6C06
+38F7AEC070C3195D24C3D601546143F7E62573DA6C7203115A2613ACDD2C583B88A1C905D3BE
+019B392560425C82FDE2C57F18079E17A0C191C9A715338B94F72DB795C151C17B60B4813A15
+04DD4D91E7F1150EBD02D600C96322FA5D90E221562B7C5AFEF894F4A9DD36426964508E4155
+B2373221D5AFBF01CE958798CC04A4E6AA3EEEEB4C72A11224A645D7326FD4E704FA13663B3B
+93855501B9E12F3AD4F1820E1051285A9F435FD9C1572BC264C355C792A477A70FCE84813E23
+FAB7A325C03229A257B30A055ACD0620AEE4DA877057BB3FF16A78028FD293B8A5507858BC11
+9E83EA0D0CF842EBB9E4C48BB4480CD0EB448FD1925A88EF9F68AF1F868F9E477870A4A78DFC
+5B299AD9D3966C21C202716B7A7D830E7200CDDE60C5810D574AB778C9D59459A432C117C78B
+7A2E5F23C88308FDA04AB0A0FE01F2426BB7E508ECEF7E87603D51BFEB723ABBFEDD44EF9365
+1C1B8AB35A306B96D92D1736AC62CE8D2C2C60E67583DBCF37953A7ED2F22FED2B3338A5B4AB
+A0EB8282AE9BE5FB37780576D3BD2022C9D4EE4E8F5088816372A236A48534220B210BA346D7
+667A8E22843937D77B770B1BEFA195DE3A41DE77CEBB2FABC5549032344A9B8373984843AC29
+73BEC2CB18AD56D965CA2BC27081C1A88D5222CFEC5DB939B26BE8E78D6EA2DD75D58DF88EE0
+847E9A9135D39160233AC728E73E2EF3A6C89D60722D69A90EB0095700A5CB404F9014D51A65
+3F0605103DBE7068B70584531DF286F2BFA72CF6A8F002BDFEC2A411FE3837B11F2A01C0CCFF
+0D009299F9B53BE568584B919096398E1B88938F94D1DAF5965E485FCF5CF682BD85818F1B8B
+6D3B467B4EB10E8F2971D7E5E4EE3BD0B4B11F6EE7D720B1D69636ACCDA458C3C8EA663362A7
+6650F38BD3EDECA408FB81388840887B60ECB1BF5F67AF16EEA563DBD2AA4288615D9C014BE6
+C555FC5C2FD2EB877A4EE67B81859E96679330732A445C3C1A4FEF79318DCCFB5BC1BF5BBD53
+A51EBD88D9A424F1AE14B38200844296C03651E109446FD75DA1D35B9D7713E91419194EE1E6
+89844AC889D3B392243CFE12F129DB9C0FD0014848CD1A7109441B72E5C503FDC13A0541839C
+B7B8573443145D6AFA1D2B110BB3C9A181A82275641CCF5FBE9A4C2EFA5959662F2B74586C82
+6F7B39972928EF8E3AD74E7DF53E456A5B74DCFED01B39E4B4BA25D14B9C770A8DEA7145D338
+603B25E8ABB72E85A1FA7E28307F9C3FF1CF333AA3644A5B764DB438A358EB5CA7ECAFFEADC4
+53996CE17869F07F41D2E2A052FBE036239E548A1AEF946B0AD7A3DC7962E9DE93A55DF87CCC
+E22208A98DCA6B2FDDC856F63B13317791EFA4070328D10E8119E6015C0A46D868C568029D68
+9D40437BD2737F0B4D1042AE53973818F4A46B37119D18C1A54F43FC8F700B7534F806798169
+31556D5EB3E24F51F3979BF43E9D336BD90411FE10E1A1B9DDC8B58FD232F35C240B495CD27C
+BEC0F22560E5856E86EB13197CE095022003DAF7AFA837D86B96C4A3AF6C29D06AE252712B51
+53B1ACCDF58AA1D32E78BEB442E3904835BEBBEE01803A9191ADF2A6A579FBAE5EC828B17F3A
+C98BE2B9888AB8154455A3897913C30EA380226809F4076C72D81E8C02A59B6ACD1C97364CB0
+F4F5B01AF8F567F73840F93B30A923A002370F6FEFCEE17B62A7F1F352FC3725FE9F4F4F011D
+3075BD9297C94D81988C37DA6189F8D3AF00624922F1BD4D1B99D532488A3887E8F52153A95F
+56759C9EA10B4941185AF057F3809E84704D5EADDC50AA1929768265D97C8EFECE1ABC7B3D1A
+119DA997BD7BD6FBF08EAD3985566B3DE614A84A4FDB8D9077428AEE4AAF19092702499F2BE8
+7DC21918301841F266975D134FA9E8A9344EC6D2E23B0E1E81305FD0DFC0971A250DD385EBDB
+872110B585666CFA5621CB25DE4B332465CF1FCC2CC64AA3BE9D6372FAB5B31E1D402B12361D
+D7242D20A87F11B28F2B1F0EF8F24F8D23DCE63870297B8CCF0C0CE5B1890A035BC3FFD7F833
+031AB13636FF96E421D7823C8B6917FE7E594AFF9E1BBD16A11D991F033517D007156AEE9B89
+7147998F4FA943D2255FF70F556B12EB8D7E438471C012A7A9FB702FC31D2BED3C1006A30AD9
+71C708E5C971BEBC35D40C78FDE0EC2321FB3670265D106E24ACBBB449DED5F4DE5D170B1676
+DF800358E882936BC24B279123B89F8988EBCBB6B44D4F0E06E0C611F9EC17AE9A1BA48E8FEE
+F40BC359C40EFD821EA76BB8ECB02F4C596963F192A8E5AE7AE5917F7B0B457D0234F914B07C
+C61420E11D092068AEE4A44D2424D5A9DB5074B57659E0A7599AF8D3F4E2785430825C108691
+297C172659ED2869C0E23394E03DD550659018BC817D0409362AE35685B284D275DAC2626E29
+877670188B868665B29DA3D5E37217CB421EB2880D78F379172886F80109608B8A3FE464355F
+D86FAE057A8F6A68C2C3F884A7A62DFB74D20614A478B7D325CB89CD529772E27410CEF348DD
+E18239D13FCF5BB30B5AFD02E71D7CCA9F0FF5A2EB7B88488558201F51F02C6F3FD7683290CD
+A6035FFF4AA488537315649C9541186736AB7EF2727CB0793E5736CB0E6FB12213CAF845640A
+15083BE4AFC34F9A22FFB953FF36654DC266E24B1604950E41B2BAFD6A8D0EFF82F1A89B6C0F
+8AD52418A9A26DCA74E4BB4BCEF479735C17A657B63CDB9D4AFC434CD385A6ABA1D9ABC3F128
+9748BD29DEFE7E45ADA40BF65F700A029AF59F2D6CEA188C1E9887C382FBC986B26179D241F6
+E2881DB9C8F0C577735604671D53EBAE52FA47EEE9B74C390F186ECE2C962720F09FF261983F
+8EBB312F17B4C08AB2DD4D3AB3C36846EBA599C6EA8A8F64D0CDE5A4E599534232D4484C7A46
+FF7606E711C52E900EB668399BC7A30CA0F19A470078BA4D2858531A8A2AF2FB72172C242B25
+4911AA4D6DB4D491C7330CC922B22594578D02628670CBFF2D4D0B029F90D4A912728CD4FC68
+0DF3BAE8E905BC74D3FF36D1BC4F6A013F8ADE5DE35F0D22B89119E0356FD9F175094EA8C5A1
+3A5CD7CA4B9A1948FF82FB471C38031AB513036C08E8DA771220358EFC7FEB26B4FE3F99E244
+6F008DDDAE0DABE2732EEEC19A4917CF63D482D121708A416D7763B1ECB12666E936311EF376
+625B65B59482C6059AF535BBD80F939FB21452B72828419B635A7CFBA0BED1A2F1F639F57274
+4BE8E00B114203409742F65327537AD4B52E46D1285049D46E4D2E86B915C8B24E621732916B
+9A487EA1DBE547F83FCD6BD5B77132380D8566B3333C9C15549AF57975BE4D33E360530594B7
+7B07B10BBBC6F247A4EB65A8176C32F6751FBC26303655AF7DC43508F4525CBC18C73F6C7431
+F0170EA6B39658510F537A6992C90F968C6D3BCB3E0269FE2206A763E715B7C9B5F483176AFE
+2F545CD2B1AA662831146FEC8AB40475E6276D0AA4F3EDC8D8AA99076E7C55980D3729928052
+AE4A0D1E5249F0FFBBD28B54D208B496C4AAB0A5192832D9513E8856281B771D26921230C0D6
+5C0A84574BCC7531406B9E79F4F56627E692B5901D346A59EACB9328E96C6C02461D3B420BE4
+B3BB7DA35E2AB0975D6021C11DE28A0814D38BE87904329DDDA53FC320BFA72B136AAFCCD7A5
+AF2F64A7D364AF2AE27DAF5BE67EAB44F02BF350067A4191FA821322833EE156927F8CA078AE
+9D16B0454805BDCB57053C03A3A5FBC8AB47A425ACE5DEA6EA0E2A34B9A1707B651EA9FB3A39
+1C4DC0826A6ADDB97764ADB310287CDB83CC7A268FDC65A04418660A2E25A64FACAEFA106148
+50DF597A1172061DCB6F39E53C77ABFCF5B12D85636E03D3F150D3DCDF1DDD84F5B7165C4454
+E6F44B7D2E64E483DA6D3755F09DE3BA9EA41C38E37CA05894DB3FB1E9C1946E2D1B25FC183A
+D7BF236B8E410C326CD34850BB6FD5200C0481B4A9E62836F8093892B2BC67CA2EBA62BA0F15
+C5BB65CFD03A35F6629CD051A0CE3A78F7C5C16553C55C2F424E608512E5CE607521A567AB97
+8C8BE962E869C7FBBF582FB801BEA242CCDC8E8C84B2CAB30C9EC78220E5928F945AAD997595
+94A63B02C8CD99EA09D865F08275DE178123BF0D5B8BA2A3B1E5243BCF448EF3B882DF28F36B
+415987EA7C06B719034FDCD115BE92FEDD09526DA14BDBD78C23B9B3740ECF878825B193B802
+D0C36A059EF8D81FAA909E7EA951D0889A2D799A32720E93DE638040540BCE28F8E16F230968
+E8EEDC30EE042A7980D53E14888301C77A4EB7152D760D7BC9D13B1FC39BC592DCE2C1010E05
+0B6AECB896456D3C714353A1AA7D6F04172759E034534A9E9A07B7AD1D66F1EAFA7D212694AC
+385A4E20F82BDDD1B66AEB6866CC942D5448C15517B5D107F6E7058360417139F77B8A668578
+D7D61576CE8C44232F4BE41379DC28F3E7C180611D27124873BA90457D2A2F4BCA2A84ADCE08
+9855938AA62E3776959EF719D97C09468584C4B138A16747C63FC06290FCFC59A2DA0E73BBF3
+B444D90B6F7D4E050052EBB2577C2389311B6956E7D583BC378CAA3051BBBFA134F391EF55DD
+752332473020E8B7A1849DFB64803E961EC4E396053482393684556289EF802D3865167BBC84
+06A93F55E337F79050052D3E10ACA40E1FF68C475DB20A9A49776696ABAB21011DC3CB3E651C
+F279200226E8407E6A3FB8053B9C1096FF3E6A7105E76A09505E8CE7EB8481B9A9BDD98926A7
+7280CCE379A6EB0C4EE91B90E4EDC9A23921AB0CEF381D3E7F1A18ECD4CB46037C6296237A5B
+079E62614C08847E5BB18D1EDFBB25CE3C1C4947C709D09B7A130B63C9CF093A62A974D5C3D8
+C858F7D067042F76FDF0513D26463FA238D4D96A58FF898B31FCD014DA4989661E456D0DC620
+4D65AE05B89158DDEA46E51FA1665EAD01715845B575E89BFE34C629755A109BFDEA871945A8
+9E18D8CD452CBE93594D246FC0D31B50521BDD3BAF6D752949B907AF9505FDDBC937D2DB89BC
+64E503EB71D1043B66DB13F11EDA59E03FB64DE3AA9B2E7FE668607A02BB54B7FD5E84C65B20
+659D16841E09902A03A9C326D9D332C7622AF73787DC8B98909FBEE0AA73D43428D0674BE761
+72E94E57917363351ADF9DF2E8256ECEA99558691DE9EE2775624F7675210E6FBB4A8C648F33
+8AE65B478F4E94A2485B75187441ABF860D0EB31D657FFF520694F8E36E7F5052F2EC333CA7B
+318374F74EC8FEAE6CFA920AA04094EE42F2E111E889F469FF848BF0D13548669FAA9333931D
+8480E5159AB8F4110BEB98D24613DD4C1B0B3D078B799D00364027D24295242024EF4E323BF8
+32D54EE33CDE826945FEA9F7FCB8D5EABD8E7BA3A623CF1E1987CFE1A2152688C1B9C097F18F
+237DC2C3E0B10841CA7A26AF98D4A1300FC249347EDC2FE5158694E7884850A8DF7450273C84
+AB9A10ED07E68443483B01A1181E791B10248AE0B893DD2CF901820F710EC8DA35F18D08C04B
+F13841E77871B3A8AC3E75C5364A75CAFF0FC7B963169FC90A7D55F6661E7ACFA13D6D239885
+E782499325F50E24CF795F501BB91422E09E0B1A6FC28EF7BB7439A52DFA48B04D2584466AA8
+A5202915D70E93AC51B9B31454D2F2AFC421DC0F23FEBA2E54C11B58241B73D8D8D3728D6D9C
+AD925CF425398273D7724FFD3E2581AD147DEEFD5DF7A3BF404A767A56D51E334DF0CB49817D
+6042712F55C513DF1F40A052649B55BB50D09EACB2B49DC75C44EB6386D842CDF42037DA6959
+3C0D72B0954E55F4E94E30043F9A644A8F10406AB77173EDA4C260EE96498C0E3AF61AC5B223
+8FD73AB9F1685F13601D080267E514D666C8342AAD4C30F9E0FEF2255C2A4AE62802DC36C15F
+3C41F2BC1281D44E3D77860FD18EA7D67D335BC11EAAEF15CAE8D1CCD26741D738EBA92F5BD3
+C527B920CF883F7F4BD31711D7A467D4DDA775F811BB31AAE9311E4B0DAFE50A2EBF8301C2F2
+A50840C8E61411FF8FEEA7D3E948CC0B796184C30A500CF5A198694566812BA6CC2B02CAA64A
+038CD3112FAAE519EA9E6BA8CDA04592F5759F2962CA28743B2171B85A69DB0689154D69C5D9
+6649B621ECAF2B2B6E4477C8707C1C32C2AD2CA8AD0CE598265907D3BA86D613ECC85A93B3ED
+741F0BAB3D78E035EC3F0070D0C53D46E52C7FBB8DE776079E36D6512BA0F6863BFBD8DB3AF4
+3F0456B00416321DD7464992940B8B7AD3BFC002A73D199BCDAA01EF0B37CD871036923C25F8
+DFE5A756917875150ED2F442A6FA9D53651C715FEE87ABE09D097210A1BEEC3408B5CFF4365D
+53D196FB2FB5723A479ED6FA7C7509C038E2F248447FE6E6619B329AE5D948777ACA0D756339
+576960242F3EDC31CDBBDA235718A53E64FDB146EA3487C816992A733DFC1C43EBABC7A3D77E
+635BD4E964DA2F540FD38A0D843AA6D9E4BD30F16E17491C3C7AE1F6CC4717015948CBC7B7B7
+8D51DA7997A876A9AA18E3C4A09453B35B1961C8990857550F05583732192DB74F1A55BE0526
+BAB47F6875EB7F9274F09829A5E21BCAA61FBE29234E52E803A92262DCE826D2A7A04B497565
+5A39205DC80FB9C6C2845C5B3B98892AC2414C54D6DEC09C38CA648C51B24B6C22F5E73C5F9B
+60C495DDCCFA5F9A1153A5A2381A74D99D1C0392C3A668D6281A623FFB8CCF2336F68A5E1BD3
+9FD0FCA558DEE89FDF4CC7B65C324C1613C4A0777E0B99A24898298CF61BF898B1FE53E23794
+A433C612ED800A77CE6DF76C6AAFC406AEE44767FA1B109FF5A39117BE5A3B8BFE784FF34EA8
+EF65BA77940F3B7A662738CAA98E19714A96AC66F7E7AFA33C244BA06488B854CE55F5AA659F
+646C3A15F5C082CB11B979DBCB780605ADF4332B246C6DDFC3F7A8FDAFC78380EDC0BF3B7B4B
+8A843F78B49828811CCBBECD281B724EB6C146774A01513170165EE561C724B81DB0ECDA2404
+6FAEC3124184E30EB1C3080F983818D04F287B2E44F68C5B84F4B4BFB861063661D2A89FAECF
+49F30572136172CDE89F3585088FD3C12190CB7E2183B865AA60339892855B014B6F84BE699D
+C1FD0558D5AABD02C1282D5E74E3BE31CBB4BE35256101FAF84CD4883FCE88329F095EEE8D46
+CAF552537276E03BC886E2B45A6B080B7FF8B3EF1C3ADF7593B3E7123AB67F632B34AA129376
+1B85704241D79B9EF7544393153622959B3EF1DA3911EDD2A2C1EAFE61DFF8153D2A5F06CD26
+A70143A1F2C8571D6D35B20ACA92BA8EE5568F020B7867BFFB13B258A30D5C7BA5A73765AAD4
+1166B4F0D889D0E0B91B3F1D8EA44F425EE974DAC37064BC195A7D02DB8BE32ECC8B3718B599
+F3751DD224713C603F5DC2C78E802E491E0B0020BAF14A0396196219FFEE2C4DCC14E6E8D34D
+38F7830A9B4535610825E91D4E08DA8A31C6CAEB161F183F8BFDA5EE4A7CF1A78C32141DD2A1
+62379CA05C4D9D005779A4A175DE2CD14A0B49FEF14F9BEB98C8B967196135D8247931557872
+E0ABE65042048EC380BC19359F705B96C3C45BA4469E923B754E08973A8DA02343C972315498
+5CEA4524CCCC134699E8C9577E750C865F6CD7FED22EEEAC8E6B2B01A1B95F426FB051821632
+E02698F44B97E60E43C04E5A3B1A8DAB994C148DD438C0166A3AFAF9964A8CED14C34D07FBFF
+291183884E24B51BF050C394D591DA8E043FC358DD00221C3072DABDD75305A74BD92875BA8F
+E54F599EC04EDA89A20B8FEA682232E566CA147FF5BA08B64816DFADC69CDD39452BA27C9EE2
+1F8D974BBB2B8AEF87BEF53BB11D7DB870745FCD64647BBC60F538DEF1E2DAA92B672B23E150
+D206249DB7BD73273F58AFD7E6543E819BE241D7C363283E19A9E54C349764A1DF2CB4847D73
+80C35CF54C2ED12651D64CB6804DEE1C71176A008D6F6EF24CCB36C60746B9AFF719EBD587A2
+E66F3252A0B79B48B09F6D23E0DB2078B77949AB861B041AD4FB8B2CCA6462AF42EFE2E8CF7E
+178E59D3AE268135997FB721C703F7A9FAF9D4EEA0082C20F2EC900BC1DD30B3D129D6151A1E
+FAF52E9379E6437CB3F5DC75F03A3B1BF457F29B8F58292036084B4E58B296DCE28CEE150998
+3F399C24B7D065E74C51C8E54D07F6E8939D93B46170AC18E1E0AE2CFD954063007F00E6490C
+05C139864F37C4D07F67DCC22ABBA07D2B3965D97B1AC483E65AC14043F71156B3CD9717BE1D
+24DD1F642AF88361AADE33C89E1C3AA48FF9DA04C185A6F0E7E834B06100D5867C1133B8C462
+A60C4291B98E69E7B0419561AD1A42ECB01A8E2FC09644F84367EE7E51359BC07C2195C40E21
+0F66DD2E2CDB7C6AAE4AF98027EF3826E8BF93F10B1D5182BFC5E838EB95B7114A10B73FB4BD
+6296EEE0DCF7193166C4E903BDFC2467222183BCBD4DB6A772AB10C1C8F9E20B08D15736DB16
+4AEB29BCD29A1D59BE64C46338577460D04D043E406EAD24081198BA62D0EF6AD52246DB3CF4
+8CFB6E2B70F43F3D5B68464E8F922BC11DBA3E2951A5F98F1BC1FD6B22A3CF2D179B933AAA63
+2BE6EEBFD2BB965FC3ADDADBA49BD3603922E67B60DD1FE11E533FEA668B8AB3A73A58976975
+F9017893033E88BFE3543B3FFAF4D9575D1458BF77AF4A7CAEE22CAFAF8ABCCD31ADCA0116F3
+9D423EAE339EF19050428B5B835EF58D438A4A88695E4F2EAB2855ED05F408A2C8A574747C6D
+7D11F3FFA46AB02170FBA0C38DF2C4BB28542DF2E553D519F45CD54167EB2BC52B5BCC38E54B
+FB605B0A0D001DA0032EABCCF5C73F965CEB1C33CB820E00E50578B4C398C99AC5E71EDDA32A
+7606599B9CE8DA0B440B4B71BCCE74004F6E4C52894B4BA16E9E47E00B4176D09DD75CEE0350
+7BF43898FAA27D8BE506FBBB6CF9D7E225FEC783439F315221EF02A9CF54276A7CD1F6F8853E
+A51876A91EE00FA11135DB5C3F6285C12857D345DB8EEEF81EE2F61FC14FCBED119737ADA169
+7F584C0A5BF780913B5E5EDAA7356382EB77DED29B0A3B47B4D7A9B078EB32B82AC6824B84D6
+D89BB055421C29685783B37DF7370075A7CBEAE339EDE8B43C7EDCCC956AE0E04D903A8286BA
+0CF6DADDC9968C441230E2AD17174A8FCA2FF7791BEE9B88649686314F2C8136BE6CAA48E25B
+56D50DE62BE38633E7039B5F00713A7288FB1B5A5094A99FCD54183F2ADD51FCB9365813EDBB
+653AADC6AFBC475A695B12D28308049346549EC2602F42215A4F08E91864EE3AB5FF00A0FFB1
+DB66AF760077126CB747E5DD8E6158DD902A2A265262562E6B5B09847BCF4C182EE4E90BDF4A
+3DA1F725A203AF4EDA966E75718DA1D1C304941CF1E3347E36BAE78DD32843F92029516A51C3
+CAB2C8E4D899F24CC4F45E50E132501A8AC50D92BE48B4DDEA54B7E21545942337785B1AC5AD
+25C1A7C6ABD2A925F8593AE4AF9ADCEEF7555D6DC8ED79DA8B3DBFA39EAB384B0BB42A5A9F71
+84C31A98911AC23FF30E3ED0DD58B0348BE7FB0E3F465343F05FF871E502EA6382017FB79277
+56D5265C67ECBE9CB98B5C20D995F393E828273CE50D4C92F7CEE429B966D0A7BC4B57F9E5B6
+CCBA051E34BDB6E3F2932ABF50111BCD5FA0D32E349496B4F3827E591E8725F8809FABAC9AE3
+5B5B1BA79748C0C98295D61D4C83D040523A2BD4DE07002EE83BBEC2C6038C9F89977F06B610
+1D5D8E9EB3F0F7EA4D2CAAC71B8AA0180F8E0B675AFDCF608EF92355B9B31AD1719B90C527B7
+DD4F3E4ACBF3196DE1CD39ED0A06E8614A23C2B43B92DF172382ED02DAEED306AF67C7AD37F4
+6DC1D9209F857C1C0BAB085D3691DC707985980899E410F8F33A56B3E45F7909927793862D6B
+FCBC9DD9D40E3A4BD68728C54C5C63FAB65D9FF73817F1BB70DFD1F22241ABB7960AC01610EE
+358B67C90990410AE8583C1E9D8C9A827E8A2C2793597F1200E0BFC141C261D5C43FB596931F
+147A68B8421DBD6746BF32D58C044F2BF8082D717C1A196590AC9183BF07E7CA0747CDA6B2C9
+EA7B5244FE456F939EF8F82589024E4B23F81612795BAB3F074576BABA4C73F63A166E93DD37
+22F6142DE5ADB791982E52C6DC3AFA0FBF730D0504E857A5D9103CBF2A2DE364C443641FABF8
+2BFE180DC51AB2EAF10A93E15380C99B608E77568EA2E5BA20F8CD41D7F989CE46D1FB6AEF8C
+EEA02063948136064C240067661C1D1021B8660DD175EB9EB8CE9D634528E7333EAB1F0006AA
+65246F03D4DC9D8D86659F856E81BBFD6ECA496E67022C3445FC11295A37090EEA3FBACFF051
+4A6EF31050F30A24971F3EE2D1938CA86BD461845998652CAB1325EF273DFF53B0C44B5BA13A
+51EB92495EEB28BF467883B09944F87AB5C2BC7C516019CE49F0DA012205E81F9678D39D4362
+A63C153567EA9F287173CBBA03F98ED56C75FADA320F5F238B10998AB396A10D852E37A0CF50
+76CF1F0E99AD15C1FE29DD10AD143E3C46B7F317956D13CF75C45C8AC35F6FC174E7584D10F7
+903BF1801FE16ECE31111748EECCACD0FD054AC5AE8260A7287A9A48731420CA33531F351578
+06A591ED7644DD90B57311CABC9E47F5CF19B55F618009F095C1ED38B13229A50404AFED1B63
+137DF4833B8FA87968AFA64DFCA521257D523986FB6BDCE7DBC3CA1995281A5165B28545F638
+A24A7891BEAEA40CDAB87CC3F6460CA1B1875BDF47C0122E6A5417B86A04F51CD6933F5E0AAD
+D81F646FEEAB281F3D264E75593D03A9C03B183FA2E38484D831C3B1D3813864651B3374AAE3
+8E530C3850EDD6EE45F09AA3A319FFFC32788F82C0D9A7C71B0F43BAA1A77B31FCCA8C3292A6
+34817DB608761E96C0EC5F31CE1626BDEF2A912C9974942F808EF7D53E5E649725AF40EAB1F3
+12F929CB329FE013906E986BD0F956559B147153D3E0FA3FA057B9DC113818E0863D071EC31D
+A183A1B1C07A5091CDF22E53A6BA95E1D87981DCFD50E0F7DF2DB6F6E83E05BF41C7E4D17CDA
+BA4A886D882A0A9A76E9427E4C7675ACEB7F3D9293C0C18192506D906255BD8AAE0E8B80ABBB
+CAF6FBE733C7E389C52AF822C2C3CB82BD9B53D9BD926AE7E8C29EE4782EC841DAF2F40D3DF2
+38FB1D3C099E52071D742C6774FAFAA4CE4CD481FBE9AEB58AA2F3BFD9E80B0CA0C6CDEB2BC7
+85F586ED775025CA84E9EBA4ABA79FF34E93275D8D888557B0719C072E900C67996862FA3109
+1263D4ADABAC7B50078FDD845C98B16CCE135CD701FB4499E7FA1108553FC0D113B7A5EFC258
+5912EDA7D68DFAAF058E0134E0C276126535E4122A06289A1F2BCF7684DE89F4444E762D0F44
+B2E19FD4F74C9EEB536AD6CE38E24C8737A4810C5B2611EA03A73CB17480F5F871510A093A01
+A7489EBC57B20375CF8DB11D5D854BAD973599306FD9F843645336E35C8AD236E5990FC4457B
+36400B2D2DC8B3E4FB0148382FEBD864A3CC897C967DF0D8198487B0FF5FF25C62C9C43D54A2
+80E0F5FB77867A9F0FC23C1B6DA7E582345FB81BCBF9B512E0425128C50E6EF312A8E6C877A5
+8E5CBAA425C2AA586D86012CE8C2864447A8AB9F46AA7229990082C52E2BF84F6107C0A4C687
+8746243FC3CE6B09522B8BF06C4766E3E5A131F7EC96326694CA723FDA91973A49BBEACFDA2E
+3989E4CA48F74FA8AE73A280E24022A766A8188850D08C9B8F78743E3E11D897BA3ED9AE6E7B
+1059F5F6D36807069DE3A172205ACB8622177D41229F816AA50116E696DAEC917BFE2AA7B5E4
+F32AC5721061D928AAD96A8CDC5150321200A36EF61EE82D771A25DB81CC1E71A7A1B8171886
+1C9EB588C99CE789326F232B96EC72054DECA172564111B0143AD0836BD42173B4C4B04820AB
+FA65D2FA0B77D0B073227FF5BF3711DFA823CD1AEDE119DFAC288CDD99C7F6A80088FC9BCC69
+A9AD8775D8E58766D7083FA505C88E1829283ACF717E630EFC7A501D490D54594EA13E190588
+9B7344400A1327F0C75198CBB939AF89E93305A033B65CA255CC4CCB27377A85462E2A4B65C7
+EAA385233B6C4773D85DB846D5AB82F5C0B0A6BC9A3176974DA1A239D352B2E9B546128110D6
+D643ED714BFA82C7851DA0C66320FA2739A423A2CE503CF0DDBC3F0660B7B8B2E3B7155327F9
+59F77FFA144CFEA492E50B3F6D3278F33BF3EFE4C9F4901EDA676DD6D3B01ED3DD28DA965727
+3595DFA14280609886A498027A9F169F87A0D9A5C800D6F3233BD47FB18CE16A0380557ADCAD
+CAD9A8366A36C54E33B81B2F22C346EA4FD71727D4D8CFEADCD4083F057F3DC34BCC6D93D580
+C91AB78F0C5015B3137A242BD7EE24E7BC218472C48C92D16687AE450F6BDAFB2A6417AB0E20
+BDDBDDA07E8014F110551859FE25EFF5E84B30EA57234304225799769ED77AC5FFC65084720E
+F3B6ECA720E09DA6375B2DCF24CB495241674A1B6B23EEDBC3233E304D783218C6BCA464E448
+D6149948689776289CDDE7D915073948E0AAC04E4526CBD5915EEA88263630A679B7B7C794FC
+6717FE4885A77785BEE4731C9B2CC8BF04D580043113BB9A69233406374B06937195813B9D03
+419A6C75414047F672899FC68B1E62B12563C92B3DDFB3A8B0336EEE7556A1AF21AF371164DD
+EA91BADFFCF660E8261E51F8C0DF4BBA1E8D6CAA1011BF919E85CFBA2A5E69E4893D2EC98325
+99AB56484BD6CDABECF05EF40512DC42979C9357F5410E73D85B07CEA86674B380AECE9F3B36
+D072CCE3D9586D8C0FF6524E3210EFE54E179DD9801E06B45990E9F2C8F18BBB78F0BFFC2F0B
+9A0504F38B0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMEX10
+%!PS-AdobeFont-1.1: CMEX10 1.00
+%%CreationDate: 1992 Jul 23 21:22:48
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMEX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMEX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /parenleftbig put
+dup 162 /parenrightbig put
+dup 163 /bracketleftbig put
+dup 164 /bracketrightbig put
+dup 165 /floorleftbig put
+dup 166 /floorrightbig put
+dup 167 /ceilingleftbig put
+dup 168 /ceilingrightbig put
+dup 169 /braceleftbig put
+dup 170 /bracerightbig put
+dup 173 /angbracketleftbig put
+dup 174 /angbracketrightbig put
+dup 175 /vextendsingle put
+dup 176 /vextenddouble put
+dup 177 /slashbig put
+dup 178 /backslashbig put
+dup 179 /parenleftBig put
+dup 180 /parenrightBig put
+dup 181 /parenleftbigg put
+dup 182 /parenrightbigg put
+dup 183 /bracketleftbigg put
+dup 184 /bracketrightbigg put
+dup 185 /floorleftbigg put
+dup 186 /floorrightbigg put
+dup 187 /ceilingleftbigg put
+dup 188 /ceilingrightbigg put
+dup 189 /braceleftbigg put
+dup 190 /bracerightbigg put
+dup 191 /angbracketleftbigg put
+dup 192 /angbracketrightbigg put
+dup 193 /slashbigg put
+dup 194 /backslashbigg put
+dup 195 /parenleftBigg put
+dup 196 /arrowdblbt put
+dup 0 /parenleftbig put
+dup 1 /parenrightbig put
+dup 2 /bracketleftbig put
+dup 3 /bracketrightbig put
+dup 4 /floorleftbig put
+dup 5 /floorrightbig put
+dup 6 /ceilingleftbig put
+dup 7 /ceilingrightbig put
+dup 8 /braceleftbig put
+dup 9 /bracerightbig put
+dup 10 /angbracketleftbig put
+dup 11 /angbracketrightbig put
+dup 12 /vextendsingle put
+dup 13 /vextenddouble put
+dup 14 /slashbig put
+dup 15 /backslashbig put
+dup 16 /parenleftBig put
+dup 17 /parenrightBig put
+dup 18 /parenleftbigg put
+dup 19 /parenrightbigg put
+dup 20 /bracketleftbigg put
+dup 21 /bracketrightbigg put
+dup 22 /floorleftbigg put
+dup 23 /floorrightbigg put
+dup 24 /ceilingleftbigg put
+dup 25 /ceilingrightbigg put
+dup 26 /braceleftbigg put
+dup 27 /bracerightbigg put
+dup 28 /angbracketleftbigg put
+dup 29 /angbracketrightbigg put
+dup 30 /slashbigg put
+dup 31 /backslashbigg put
+dup 32 /parenleftBigg put
+dup 33 /parenrightBigg put
+dup 34 /bracketleftBigg put
+dup 35 /bracketrightBigg put
+dup 36 /floorleftBigg put
+dup 37 /floorrightBigg put
+dup 38 /ceilingleftBigg put
+dup 39 /ceilingrightBigg put
+dup 40 /braceleftBigg put
+dup 41 /bracerightBigg put
+dup 42 /angbracketleftBigg put
+dup 43 /angbracketrightBigg put
+dup 44 /slashBigg put
+dup 45 /backslashBigg put
+dup 46 /slashBig put
+dup 47 /backslashBig put
+dup 48 /parenlefttp put
+dup 49 /parenrighttp put
+dup 50 /bracketlefttp put
+dup 51 /bracketrighttp put
+dup 52 /bracketleftbt put
+dup 53 /bracketrightbt put
+dup 54 /bracketleftex put
+dup 55 /bracketrightex put
+dup 56 /bracelefttp put
+dup 57 /bracerighttp put
+dup 58 /braceleftbt put
+dup 59 /bracerightbt put
+dup 60 /braceleftmid put
+dup 61 /bracerightmid put
+dup 62 /braceex put
+dup 63 /arrowvertex put
+dup 64 /parenleftbt put
+dup 65 /parenrightbt put
+dup 66 /parenleftex put
+dup 67 /parenrightex put
+dup 68 /angbracketleftBig put
+dup 69 /angbracketrightBig put
+dup 70 /unionsqtext put
+dup 71 /unionsqdisplay put
+dup 72 /contintegraltext put
+dup 73 /contintegraldisplay put
+dup 74 /circledottext put
+dup 75 /circledotdisplay put
+dup 76 /circleplustext put
+dup 77 /circleplusdisplay put
+dup 78 /circlemultiplytext put
+dup 79 /circlemultiplydisplay put
+dup 80 /summationtext put
+dup 81 /producttext put
+dup 82 /integraltext put
+dup 83 /uniontext put
+dup 84 /intersectiontext put
+dup 85 /unionmultitext put
+dup 86 /logicalandtext put
+dup 87 /logicalortext put
+dup 88 /summationdisplay put
+dup 89 /productdisplay put
+dup 90 /integraldisplay put
+dup 91 /uniondisplay put
+dup 92 /intersectiondisplay put
+dup 93 /unionmultidisplay put
+dup 94 /logicalanddisplay put
+dup 95 /logicalordisplay put
+dup 96 /coproducttext put
+dup 97 /coproductdisplay put
+dup 98 /hatwide put
+dup 99 /hatwider put
+dup 100 /hatwidest put
+dup 101 /tildewide put
+dup 102 /tildewider put
+dup 103 /tildewidest put
+dup 104 /bracketleftBig put
+dup 105 /bracketrightBig put
+dup 106 /floorleftBig put
+dup 107 /floorrightBig put
+dup 108 /ceilingleftBig put
+dup 109 /ceilingrightBig put
+dup 110 /braceleftBig put
+dup 111 /bracerightBig put
+dup 112 /radicalbig put
+dup 113 /radicalBig put
+dup 114 /radicalbigg put
+dup 115 /radicalBigg put
+dup 116 /radicalbt put
+dup 117 /radicalvertex put
+dup 118 /radicaltp put
+dup 119 /arrowvertexdbl put
+dup 120 /arrowtp put
+dup 121 /arrowbt put
+dup 122 /bracehtipdownleft put
+dup 123 /bracehtipdownright put
+dup 124 /bracehtipupleft put
+dup 125 /bracehtipupright put
+dup 126 /arrowdbltp put
+dup 127 /arrowdblbt put
+dup 128 /parenleftBigg put
+dup 160 /space put
+readonly def
+/FontBBox{-24 -2960 1454 772}readonly def
+/UniqueID 5000774 def
+currentdict end
+currentfile eexec
+
+80347982AB3942D930E069A70D0D48311D7190FA2D133A583138F76695558E7AE9348D37CAC6
+651806D08527C1BB4A062A4835AC37784CC39AD8841404E438B4D52D3901E47A1DE4F7924E0F
+B3DAF442499175BAB1226EDF692A4956739F8828E80592F450C5D5C22AC88BCFBE9748F61D18
+243A16F4A4467F084E8E2BE46EF47FC51C3A8199E3CDA62FF9C4FB73956DAB8B6683D2156377
+808CB35026073E80523F59A30D195FCF9B9FCE4FFAFC6D5649664203AB24ACB938D58D246707
+FFE7D62F04BEC4B70C21EF75BEB2B812622B3C74E969D72D3CD11BD7106294A99CAF0B1629BC
+7D4DE6B96CA82930831D64575F23F4AD06A0E45E315B1D392411BE8D6D73C998789FF258A07A
+3C8C2057325784514C845500BFD1A971310CFC11D41C1A167DBD5FF012C60ADD4E87325F6E52
+99032A839DE65FB1473A166AAE1876A4414A434F22C1D241591FB36F857DF6FA930608750FFC
+0C54F44994662B1F00F1400BF752EA8D83FFC4CB77A290BC2D99981AE59A191748BA5C7BA1A9
+D2583FD21398452B6FF5D83A059F7EADCD2EF744E9DD22BDF9C79D049BF06835E878C32B7765
+C69BDD8EF4DEB4EA7CFFF4CF9354A4DDFFA689DE961D16772491C7AFBD7FFFDE42400764C68E
+954EE5C455A5687959829BC3B319B2147DEAAB3628662C8030C5E02FEA09609ABE4EAA12E217
+BC3AF673F1BC36A7039EB13FCACB4218FE0FC5A3F9452D4EDF46CC91DB67B624D4F2D37502FB
+9F11AF4DA18CA40B61097F95D44329375467ED13C5CB585EC53F62B83EF9502CC755AF44BF32
+B87B8AE9F3F2F8DBF72DAB90ACAFBACD280DB6AAFFAEFDFF6D5EFF26669BAC56280A950560E3
+D01714BA38659B0E4E28BF8CDC1F15FF7E3EA9D95A6AFBBE3D8E6905AA6D531D6B6DCAB89E20
+36CC492C65F76DDCC3CFCFF33FDE3D9FFD10F7A90530FD5D04F12CECE01D9E3B7784FCB4AC99
+71D125317E4D6DAF1ED113C795C56C6F57465A10859341F41089169420DFEBAEA770C4FDE4CC
+11ACBED014A3E2EB6CED1694EF30BFEC4F805C6423283D2444975F5F62AC48B88111EE5C79A7
+6A4E64AB2F9488DBE6E21DC00BCA4304C3DBD06FA60DB4DD88E26870B08BD880B67D6ACE131B
+559CBF999E98F3196A47320BC412DEB6C6CA990485CD34B69ACFC6F2A2B534D17FC5C68F1416
+7B3CDD7BB801D960C04043511A268040ABEACC65A28634EDE6B4E209FA3AA93A632CFE1D5A57
+665B3085F9E2CB8AC141E2220AE1799768777D096B6795B177820DD3AFF63FFF0A80341F473E
+1455868EBD9D97AC9DCB3BE4B7AB4E0F3D5411E0A90C9997741FCFFC8C3DA19BCAD2BFF0CF17
+2814D4864D4C5D456FB5121F0431754907A704D2BF711CE4F2456FAE5F0E602AA29334DCCEB9
+02CF1709B53F918BA5F066948694F2CE9F150439F0872E3E1BC2CBDBA9E05D99AA6C0F6ADBF0
+097EC658F2803D63D020FB3DDF1F3ED08235FBA9C110EEEC014D81ED6608F58889A40E3C3A7F
+93BB13FE3D88795BCD841498C6422CDB307C376457776A8249502626CA0E1A3E48B8A45E77EC
+0551347D0A5D51EC0F39A8C2BB330F4B76F3B4D3883606472F29041C1B7BF2CD8620F4E9A5A4
+EAE0B60091CB21E30470CB0219C96B8E66AF03B6744E1DB4FF453E38BF1BCDF3F0DBCF5EBE04
+7B84AB96CF851AB13C8942EEA52AF99324C6E5088F8DE6C30B385E624F4534AB603A3127D708
+DF8879B3D15869B777300E3B1B024F79ECE64A860DFF0EC8D0CC8D28A79A339F99AAFE9FD775
+98A37A01A54994E92AE0D20050CB9DCAE953B6D2B3D6FE9D26FDB3CEC0A6F9060E356503E3DC
+D1984772CDFDDD8C020349BD04380BA9508546B281F116F67372B0C73798C5EC98FDB9346F03
+9B663ED52D97E678F9D1C177C35A93833BDDE68C0BE730B565B34903448914418AE29780F437
+EFE69F259FCC78F9C5705EC781FD699DAC1831CBEA3ABFB9D0189B8A45E79A539CE16A34FCCF
+16B5DF776D5B2AFE24DB54949A23792C1A0BF0E741477928ADD22F2B5566FCB82BBC0CA9BBD5
+BC03D6E8901D01652C4782A3803F8042EECBADC97142DC63ACF1A92BB10400116A6D2320447C
+07BAAF4D8B69ED93E7E1BAEF4BEF80544B94463073D584490849EE9DC9B726D60E2A80EC6D8A
+9B28984277FEE75C0231F0E5A6FF9D3193243A15AEC9C04E98401881EF0C94942F68CE4A0121
+EF50DDD3950015F28E40FE2FAC789EA0982982EBE270DA274CE9A0C88415A68E610807633374
+6D099B85E94F3B7E8F59379A99CA7980548B3A8EA7ED739A988971E778C0FFFB4A843DF0D98A
+56F326C650A94DAA94228083216F89D47AB514C6CE1CFD7B7CB9CDD2BBA61E41B414197843AD
+1FECFA306B3E1E4B866F8F98D8DB93A63E7C6C7149EE3CDFE0E0FE0D0CE35A7568B90CD2A30A
+8D53C95B678F0A739F27856BFA8E4A7D50B942ACE78189E476379FC3A86478C34048DD44E8AF
+60D1099886E485A0BF74638BB3FC929106BDB7C4EAC624F75CF273B38A2909311FD6B6A98F4C
+B426A4610DB5A316F1AB1332E840DDA030047CC203CB1030CC9A3B7550CBF46163ADD6C62AD8
+DC9CC792DB6C8D45C8A71E60C0170F0DBBA5D60EC88B7B1047015B37A2769F96C8738C215D6D
+5BCFCC9EB5884E01C00191067BE0194B994034BADA4BF8CDDBAE88BF9FB7F09420CC50D248F2
+9459574B8857E3A8C22E3113B22D282957AE02BF5DA8D363E012CDBF915BA5215832449F261F
+7C4D4FDAB7C17C2758CBFD5300F3137CD72FB2C967D473B2683628BE64938788E646D945F11E
+CD20FA16A9CDE65DD08D2C59B2C5D13D1148BF9F6F78F0243B455BC43D8893CF1A756B60FF5B
+5528354C8BF1CE8F81C142E762BB6AD54AF2BCBEFB67B75BB822C3B53A92F45AD494C62A0480
+22E4AF0A3158857BAD671F0F49B51301151D3EBC1C9BA6DDAA408B4F923DA1DF1CDBC451393A
+FD47B4201ACE732B74CD0079C67A8E29B02175044EA6A643890CD60C45BBFE15963AF3818077
+EE34EF93F357E77B4748F3195745EC632B359510A528399C8749882FBDBEAB684FBE22307353
+3E428C28D7C6A20C0C1F805F350230E549B2F8E8A8E9EF89EFC7C71BCDE2934CFCB8A04A17FF
+BB92732DC202F5B3FFEA1EFD96B4707D1D51F6579F86BD348AD46E233869B725EB4CC76191A7
+A82264BA610C293C3D37714C42166EA68EB5205FFD4DAF30AD23AB140D01F66F56A320ACDA94
+339A653255FF06365D97BF5AEAF769034D36B9DA6044579779DAAAB309204172F69446413CD7
+912A19898C23487AC3B994BEA258203F894D89BFA826D744FD8B31EB2C75CEDFDAE2E899FFD0
+50D36AB3A63597D19CBC208847DF2AFCB05C29477FD20244511884AC9CECEAEE6C6BD8554A55
+0E7186524F967839E05EEEA9A4065C39C864A5D697B7B88FE47F50844FCA93A63787426D186F
+3CFFE14BA7E4607B65CD8CD03B57341FE369A3FD370303D0338B26506BF0BEFDA0C6FF84BB2D
+0AA65BAC14B189003388F0FBEFA62C9588D1454133F1CDE8CDEC574FFF094D7F4E3D5AC225E0
+B9B00A61B8D667171BB19FFB38121239073334448626D20AC4FDB1BBF6D314D5E034A4EB0EB9
+C26B1604683B18D7E328F6E1B967146EFEF1A9A4172ECF0238BA7DF28E42D01ABCEFD3BD0B06
+DD1FD4CBFD4FA91F06E437FBF0497810E816E7E1482F9F9B42F0B0BD8225C87C6F366D3BA0A7
+80CA78EF6915F537DFABFB7105F2D4E26E34CED31B3E7340404751202BAC85A39D9FA283417B
+682D37CECBFC4C4E20B4D494332003B1FB913942040340B03FC0721722C39CA4623BA384A3FB
+003441641A8C6F39FA9C07C830693D15200DB67722029A76E28DE8EFEC1B1D6C043A9BD4D7FA
+D0731A087A4A2AC3B78B07A464BC374A67A220F0D08A9DE5411C698A2DFEB1889067CBC83BB5
+5EECD734B253D7134E3A0D7C5625E0C2205F5B86B67B237DAD8D47D297AFC42598842EE341DA
+B855828CA1AD4BF332657CE9D18832328B9FB81C9B4843FDE4D63C2C3B06BFB57032C30BE07A
+BED913D7CDB8C4FB359543D39705A5BF55F8DF6268CB2528805172581204111D71C00DA14275
+776D95E0FC612687A33EAD514C267AA0F90BA9A2962D10FF3FC8BA694372266350E8E7E58387
+97D6CEF8561F116CAB2A9DE2CAE98C5AF5AE04667E763F7BBA244F6CFB71DDCD18F69461BAEA
+70EBF2B3A8E2AF95DE0A573CB3470BA4A8981B269E12D3F9E4D2B9A272E2E7BA968283455A85
+D9C6B4B0A3EF125ADEC61BD8EAF92E008FD91E88B578D48415BE071276A1C3545A70A1B3879B
+A4554D7E63110EF362972E5CD986D19EEEC5585333D99F72A91449BA61A14ADC3A08577FCE70
+6C702333DA1ADF26826C4F4AB734014F7B78735F8851D0B08660DD63D8EAD834D2C49900EBCD
+0E16EE67F6D499337046A47624ECEB8F285944C477F253CD65E29B581A9B86886385DF1B68F4
+62520D04DBB5DA7389A1EC090EC908A2D90BD0E19999AD9607E3A90374DDAD1CEEC4DAC6EE43
+A80B097AD9069C46BD657B6D0EF9ECBB7B0BBEEB66C344620E661EFDDAC45FD823F55B5EFC3E
+531E4D8BA3D4ACAA00143437E8E12C30940A77A00F010CCB899AC657F07257F7356564D772BD
+698F08BA5C85406326FF01541F232AF035D3FEE1EEF01C94BC41B6EBBE5921A8D11FC57B8F01
+2304EEB08A51BBC7767BD5D7B17BF636CF36EDBC9B5C731325ACE70F58A39003600A9A8096D1
+3A5E6AB6A7EDBA92F7CE3E2945D3FDF4A2DBE54F1FB71CEF37389DDBE546F1812F1677BC258E
+27FA55175E3E8AE1B4B05B58BE4B3CB9A2D3EF7D0946BA3639F598EA5C41129BFCA77F6F875B
+B9CECC1662D4A621345A2C8F73930043469A418A2C040AD773B6D56C0CA0E77425D2AE23614B
+29845A00DE99C321C29DD12B2B3136A07690F9A1C282AEB900A3F0CCDFE7DD325F4873DA0FB8
+3C3FFDAA40F1B238DF8682031A5ED40EBF4403139AAC8EBB115C072B61BE34CCFB94881CCF55
+4302F6538F8888A7EC630C5967835168E70E9A87DCB6398A1D34042A91103E2E25320A1AB0D0
+70008D61FADC148F347E1E87B6609B9878F187BA8EBB4F3EC451023BDE08A9BB411FD9C7B4CA
+39001D15845780F5688D49857B8B34590EEBD0AFC283411B936CBA9B3E962F6F6FAE49709899
+DB74F9721D586E6A23218262481BCF488B4823AF2AF0E7331F8314EA87E58DD53A2FE0118B4F
+28FF5929F4635CCD542245117D87E421436904E32C2472A93B58091D7372A128C3B04D30E689
+950CEDD6351598E5F794000EF381B29CB2182FB819BE5264BCBB5943EAF4B8B9B68FD5394300
+6A7FB068B1FB6A9A9CF5EE9F5AE5E3BB878EA5DD0F1629BE7EB4E4710F0E5E60398911FA8D13
+300086327DAE5264A588C9D295450C11F4895F4504A878540A3F1A6DF09791A98BF1B5417725
+F332F83920B4DE898E9F2C07FF48FA34C584A0205DF9062A9833CC8E8C3DBC50E2DE66CCC67E
+6AC0A9EF9BB3AA0224EC6FC292E7D6BF889E43535C51F56B7A4CFA52503CA10942D7B91AC34B
+E854A38D9E14174C9D7EBCE32BEAB91C0597DB46EB00DA8D68BEB0D090B9B72055F53253A8AC
+64FD1C4D47EC8EB8A43E9A02CEDA9E86CC9D84D59997F1195A1E228303DB4F7B97AB1DBCE002
+0E1D034EB700AD969FA2FA1381DAFEF50A53CA061380AC2D1B7987CBB5DA9705371BA16BE247
+AF74DDC22EC95F0C4D051CA108359F73EAF8BD9D22E951965B6BF487A7F2914F095575591F9C
+2FDA75C88B443237CD280D2B71C6D0E129FD4259422EA339BEB5503DD63F85AE4CD37B14410C
+A50DFD5AB93E8406D59628CB6FD45DFB43E67F55C657EDC6BF991FB7CE51A79B2EB22B8963A3
+3F653655913048325DC02C8931B75E90D1536C210373C35B5A88AB6D39CB138CC5459DF3BB1D
+73C8DBA90B6A3FF057DBDF509B8E58FD0D9C6DD90B824062E8E6F9F3292B0821048D591FAE83
+866D46C4CC284B57CB74BE4923A7E3A701FFD0CC3E70EC16B4E3A594C7EA0E230964E3BC1F2C
+AC6E2B88563ADEC039827D62A66B2885A1B9D4A5EEAA5F8C817806EE1679B9AAEBAFD6AAF82A
+753CDDACE98313587FD4A73C5F39FB43A03F9259F5FC7CDB4D9A7485F18A99A644DADAA18913
+DFE230606A612FC7039A0BCD636A4ACDFA5348A5FEDD06DB53FF807C6143798ABC7D6CE8CD7C
+97437734BCB251A3EAB27E3AD0213D93229AE9442062D63136CAEF2D0992CD8666EF0B28165A
+69B5A54A114B46348C801C67892D8449164D82A3475EDF45F0B9C3473FCF02671B02BA27120E
+931F1044C620960755D9968B6C534920E2518C33BB0771B93F1A3DCD4173895DE50A0738D2ED
+4B6EEDBD8A2A5608E6118827BC9218D2F27588DDED4D4FB84B657F6DFE512B1AD3698FCBF662
+1FB55735BF7123365987E087F7F66F0508B9A1F409912A9D578C9835005F49EA23556D15EB91
+E1C3D363872A815BF46905F98E2FF3F2956D3A9680A1414AC5C5D2B60913A48230E4E645F249
+04977F108C4782EA721909484785FDE4E5506CF1A6D6C888BCFE3559CFF0D969E559D3349765
+6D6F5E31F0EC0553F11C5AC177617B84ED497491E6858ECD8DF826029239BC2BA35C243A56F7
+233EB71AB68FDFEC0DFEC58198FECE9818B257C97279D7226C7BDFA9C9CF1B0DB516E58D6E13
+26DE5CA2574AE16B72DC3CB5790D491D358D444979C1FEF7DC3BCFD5FD60D781BEBD4B6F34E0
+9430E2685EC1351A48FF1D8AAE34EAE33F8EE8B0FB99CC4C1CBE73A7534A964985FA4A8211A4
+E0F2B14418D28419DC5FEB3EA64ED3B7BA19CC3BFC6064136F74FE0935B346E62C3B705C8F44
+CB62166DD9BE118A804234A4ED039147F5039FA9C9E7099CBED5EE5F1F35C452FCDEE040B385
+438FA027C72A3E9770D75DDA47FFAF2A31B6EA9C19ECE24C0E3F270E14015EB7806B7091D825
+6D6AA9617C06BBDE284F88C87E0363C994E1947A8F61A2978B2243DB550E0D9B23069FBC8AAF
+34C1D8E3603D8E5CD1EEB90A84CDC76AA57D8A1F41BF014E5057EDDFB0F94E97CF3BE7C2E184
+DC2B042A6C6A3C7B04962FC6B9A345519321B68FC37C5C208CCD1BAB4BEE30E67A65B7EAFED6
+F3E45EA0B18840FE9E9E644A4F590573889B8044CB3CBA33F5109B010157AB152A0E75FF1371
+9D3874823F151E5D10D771683B26E8688752E6085921DE52B4AD4997297834B6521A6A4AB145
+B7741595DD1E4E65BE01E1E3376A2DEDF3E549637E1F39E7F3920DE885097964CADA22F3F0FE
+4B5EF75A2ECAEFD8E2E1BD0459803F88BDDD64A481224B78B24EC04B04FD8FBAAC444EE0CC32
+A0269FFFB2EE23AC4D7C8B2AC867445F21DD7C10D102BE10DAA2DE09BA1220DFFB0E9DB7650F
+513F8061ACB90E99BDA8D5D60178CB5B93DEF50A531638FB006AC1D24474F7551FCAEC5658C7
+C34EF029911F9254D60131A66CA84210464E7DC2C8C92A3EA5E38382AD2E8BA82F69FD8C176A
+A13312EA491CCA82E1617703D8DE5F5E8D42BDF02CE82CFD161858DB1CBDAEEAFF55290AE576
+7467E27DB575C4696DD2C43ACF7E9C04D029DBD92697471376F5A2332D903A255C43F932EC9A
+82F397E9AB07A5B067C5F3F8B3B872B6A64C5A46A21EB2429F66541052FAA5ACC66A48CB4E60
+F13F05ACA8F91DF03E0896FDF9D587082CEE991F24A32ADF2457A2A1B81718875AC906DA044D
+CA8E22C66B706626308AFDF1C720738DDD8AA97D424C581AE2364BA63BA3CCEA4797EE2D829B
+BEEB24688A057E6CE6E763DB025EC57BBF21BA1E0594D39E4A9F84D8942B1BA42F971FDCFCCA
+8D9E7AD8C14FD56DBE960CD018C653FAD91CB82DB9D18306A51129CB6DFD28FB1DE7752E239A
+7EA8E14351B21ECFD04F02E9D0C8E401F8E7984FBA9A859912355248A027D1A41E78F79C9D0E
+A35D2EB8F67392F91F061E8860B8B2C56D424C8DC0464128DF1F7908AFDE457F58F3936FB7EC
+6CAFA33E554BB04A8E8349406AFEEE75B9BC301D85B577390168FE969EB89B273A48ECB271EA
+9385BB6C66B9FDDF0F63738EC74086359D917D8035DAD870D81FD8475F85FA03B43392802B0C
+499FC23E1CB1DAD8DA9FE3DBE20447C2CC55CC928ED5F55FA5276CA200728900D02FCDF5741C
+7BBEC226FAC879318FBC7368787C761599C1992D0B3CEA1601AA23D9DF1BDDDBA3D289AA1A65
+45020967D8086A2EF6241A1102523C40DF5C4A6BC009D41B4AEF4FC44BC0E4D4AF44F5186C20
+45732FF4F0B42946069259030CCFDBA15D74B8A4A4205FA03CFB27FF73CB11FA18AC1AA40FE6
+45C774E1DE506EE3E1BD558104F20EE06B144FE808D393715EF016BD4C9AAC827DA83C099300
+B66357DD205570ACE2C8CCC7BEE741E2D9EE2B4E30E631A7BB3710941285434BBFAB8458282A
+7E2E7895A2FD07A3E41B4A8B5B6A95A078CB4407F48405D0565EE77D9D73ABEDDC906B9089F1
+FD130F7DC9042CC750CA6C5F912CFECCAFC848FD93F26B530ECFF1129F62A78CB9F0031DDAC4
+664EE0C556FF3ACA2E3D33B030AF56E7973EED267E0A8D60171DC648C0B836C86CB2FC0885AB
+2521253B22586F283B3C653BB3240D872A790A2F8DF93E2136524059335A003F4538EC6594A0
+8FD05C3D9C4A4EE05C9865FCDC82DDA58817AE98EC438690D5918B4F8D05AC6DA49E9D2F537F
+41B374AEF2F719812D63DB2489C30CCCC2EE36616F15E7B18E4335C4AD05F5F5EA4763DF7A34
+D3F457CEDEE65416967A008229DB777D512AC3A24857BFEC811C93C87E83772A0C803F2D031E
+D8B2391828952D4E689B38FD92639469815ED5C1168BC9E98014FC6E2E4018D556EEA620ED05
+780D5CD225039EFEC55BBAEFD42953DBAAFC669084DB913E7E9EA345E9098F023790F5E81B36
+36F3B7AC73560C25B850F5189668D562B16B748B12E61E0361F68E07206033D3ABFFDFC8BC86
+C7404B589D49C0CC25945925BD8F8ABE46546B981DB956A93E1E96F5868F0FD6603D8A119B5B
+3766672481E7BC54D2A640C28CE4934D39C3D7F9D6376BAE6F4D712457573D7378C36C01A568
+D8DE8CA3EF801FBC960E091963AE21422FADCF1EA35AA3ED57BE34868E56D0B893F98DA41361
+4D08AE6F053A32E14176493A4DAD192440AAA7D96D731A93288A5B5460D310A173BF9793B7D4
+61AA0CDB3E81AF0F1274E2BD71509004BE9C1B0CB64916A9F7222C6A3A2F96307EEF886F627B
+31F8674DC27065AD1E94AF77B5F0ABD0E5F246B0596149183EBC6509AB156F83B95F45EE9AEA
+BECDFA82AEF6036FE06DD18FDB21E6B4D70BA8B24BF04920B240294DF74859E2B34904725EE1
+591262340FC6BE02C3228D7824CBD20DA72B1C78FC6E490B20136313F3ACC29AF7BCF1C5096B
+1907160B0CA2C5744A1BE927FE23F4836101EE791738EFC0AFDCAB00358D70545C8CE899B12E
+FD00691CF7C261F5B2C45ED79CFE0730CD4412DD7844D5959FC8A249584375DEF1715A9EC182
+2E04B80F94E2D551950114683AE08C8B160143D27298076E12E6EBA5ECEC93936EB86FF20F70
+A16074B07A3BC3A24F9570BFB5C18822CF4807583E673ACA60D949BFB09CC5BBFFDBB8FF60D6
+AD930E439BA8952EB49AB2AD05B02F1A6653C344432A4820F3976F37FAC741D2A27F0BC6B30D
+3B8461579171F2581F88BAE17256D349990D6FA2AE099FE66D478D13FFDC3E3C359AAA0949C9
+3D2F55DF7CADD2BF133C735B1E5D808A127504FD3E03F3B2FCA2F49A73351A5393FA6C7FF2F4
+DDB48E00124CD7409AE82C0F90E24F98B7DDDFFB24CF335E07615A2D706E36E433D2D4450545
+6C17123DAF7C16CA2C75B263008F0211C71FA8652B099224607C46B8D2BDB195A6F21B4724F3
+70BD67401750F086D1F2CA4D1D811623969F199BC4BD025C12A4A79F1D9BF0D01051D5121BCD
+A370CF0E94771B7A7A22D9752374DD2743F2E000534695349B3DA6BA15022B9B6EA1651ECFAE
+2236D1380984FFFACA97FD45033A7DC3FC4C413D46BA5FE1473122190ADAC68462586024559F
+6DAA7A684C1E41524EF21306CB7262E8BFC23F221E6A865172D9FB04DEBA63F7AC988A1C23A2
+72A70A75C9BC7783B028760359049625113E895A8D6282FE868E27F88E92002D82B6D82EC758
+DAEF8807EED1D03D5264C7E59213C84FBFCCA99483D1A467ACAEF12045E27BB094E4B0879428
+B3CCC1932BAB4F7D94460CD736A69BB2B985BBF0FF6A3B330C5911BAB107D4163A83A426AE2A
+8ACC75BE3701293653E27707BAD40C37921ADF3AF21589ED419E416BCA7EA1A9119F16102098
+C5471543968FEC3193AB6737078644B531F70B52DFD05B92C1CC4D5C37690D32CCCE5E0DA13B
+651989CDF99F7F110BC94F0E3B8C4B9519354B2E34FB4693ADDB869AC9EFF2F46982387F3BED
+111F82280926671FCF2C6B816B200146EB04F3BEBF63A484270122AF0046D985F71A63243743
+D3B8E7912E8BF769DBE65DA046C0BCBC9E5F4AC2B86126C755ACFDFFC1789B2A212530B46B88
+A38404F127204E23A01709296D4FFBD9B2E664D1AEC1E9CA09DF111C08521797662832439C8A
+B4FE9949E21564582CF6608D45C29B6CB7FC4E70559C5024609BD62E566B4F39C1F88FAEC09B
+558477C16A5F226E6AAD7A322E4B49562675EA07F6A02605BDEAB892CC94DF857E46519D1D4C
+73573491E18C8E800D239AE08D49D5A1D0122DF50115F32680BC5860E4BEA2B14DAB9CCF15F9
+C3779310EB296D174CFD6CA971D8183CF6C3B69A562EF8FF96A74EFAE84ABB37DAF5AAB468A8
+E2DFEDB1DDC17DB85F1C50467A5C3856C43130243060A0F961CB6D81A34E2428762EDE19EBE5
+DC5178D334C2686AF7FA88E0154D0DBDE6BF1DB30D1BC2A200FA677508774B2B8B4FC0E40BDD
+FE9ADA943F64713955FBBCFEAB86ED7013DE435A0E4136E0D3999BCF350D2D2AEB9ED71096D5
+2663EFD809EBFEB0B2A605B9AF40D5D438E2A2DDC23DA63A127FC0F52456379F9B5F26ADDB65
+2DACD4C3351529D8119D1AF722141DF0D768A4AF4EAE17C8B2197CD305ABAE4FE35D0F0BF386
+6F95606491CFA6B283F5E1AF08BAEDCFF8EAEDB3929CA49F5BF68E26051AF7643B282212C9C6
+DB78F21F71E8F645FE9FB3353DA17DA06313B67DEC4095C95C260242CF9BD00131B738AD9BD0
+B091274F7BF1F36510CB8A8AB0BF76CC6AF8CCEA1529FD82D7C118AA70F40F8092D312132AA9
+AC61CADE4AF18E1C999ABFF8AE15290BCA544A0026D296C372C04565947EF9170051E3967F26
+74FBAD5F36959FE281504397548DC28DADFBF8AB5C3E6AF69C53B942F321335CD5E84CA0E11E
+EE3D38550904D52D340AB61ED5EDAE7CAF21857AE55E9D1ECA2FA7DEC6E7D8FCE4FE34D3A600
+47235CE182460EFCB285CC246512A7CCF00481068E0A6910D36EEA3F2348F031A442BE0A78E5
+637E4FC4CA531C3E724C29B06D61FA5635C517C510D444DCC450EEF428487ED17443A19516B1
+15D7DD25C11C6143F510714F3F8754CB79E6BA78699FF13CF7DB1620933B96D364701D9B296D
+A702154D7433EED50834DD70739AA5BF0AD1BB60A47F0CD4C65407E7B5D154174EA2ECC1855D
+5A451F6E00930E6770958471ED4E1F86CCC297D333201E911B7ABABB60ECE5502CFEDADBEEB1
+BF187E65C4A99D236B65942C288FCEFB904BFE7091DDC667C661A0167B268DE3A42F5E558EB8
+36D1A49838F695E442A4037181CEEA10AB51C89BD51F711648469F8E70900A4073CCC6166AAC
+EBA0D5F8D34B129D7EB970AA4F9004B4104D5A5F041E369B16668635CEBB5AA27108B8592401
+8EA0CA05B862B28D44E6A3B1CDB7309D5B571A468CC0818F8210A7EBECC6B2E6AC97C077A9EE
+EB69616CCB8A4AFC98BEC0B558DD18F2808B520F59D8C6E9788E85A8F1AA5E4E8DC378FD746D
+613E20131221C3868EE10BE0609739A6A6920A9924D0D89C42D3909A1AFB118A14C9BD6D81C3
+A6232B10ACF861F407CB7A86B15E697ECAC04FA2AABF895187BA396C1382EA00EA0B0B85E338
+D82D61F4AF8B84D5AD8759D1744808FA112763B35FDA1BDA3C04DABEEB017837BD66D4378AD2
+2D71A5D38FA13136209CEE5344F6E14A12782E407B43C7D70D7FCC2F0B0A1314BE6FB70F3C9C
+4AF9CCE96E83F450ABA31EB90285DD6DC207A07CEA959BEB979642CEAFB14B52C0E49617E1E9
+30D884C860CBCDC691FE50D975B8263E9DC7704112B775EA0C4EB991B47853991C3F59ADBC7B
+671FDB432877EF183CE5A78ED259B8BCE792F0984DC179309734973F3D672FCE6F52FA3DE58E
+7D4D054517FBB70337B00AF36A119748680FF6A53C16C624CA11D757388E7C37F2186D335F34
+1FD289673A71FB7CD39670AF901F5B0C37350595A0836E67EF9064ED625B7EFD8C7EAE865848
+E19E0C2DB2EFF734948DAB18CC81E495F09EF1A17C4DD7C6BF95AEF0289B2C69E6773462EB50
+6B39457909253626F2ED229DAB86047C729386ECB845703BD84C8B97969FB7671A7E31C647C5
+80B3FB7251C1251891AC34B482E6DD7C11DFF66F0FEE4488BD4961374194731BF81947A3EEE8
+AB8C013ED3D6584CA2713DBDE3FC8B386D52B28441B6DC17E7831DB23051CD59D21C7F36F8A4
+873FF75F1E76E2FC9F20819A6267E594BEA4948AEB07C0561218D2A18E677EC323455EFDE5E0
+0F0A11459FCD3788DAE330A3E7C07AAC5FDEECD0730E7124716507BBF402595236DAB2ADFB13
+8299B80C2929B2A6F516F61CAFB8EB63012CCFA240040C1C3F7E9F1AC2D82AA3A669E1867B49
+D5C7DC7247A55DD3E53CDDC6D9582BFA62D255D019CE37E08286E65CD57AA9C2F4CF84DE2B1C
+C6F65193A033D0C50477D424BAD4229786D89B0B9CDB8BECD0E36867C14EB1E4331F8CDC7C34
+2CC8F538FF6710D796B9655CB47D83A547547340F26426744D8F6209D177879849BD55572617
+C36EEAF43D8C8DF78B040283AAAB44438E37EC497209D63F38F8FDD82DA65EB3C8BDC3D4FAF4
+2BA67EDBF845911E829244052C2A5894B08B328EFBEAA6C978140044AC09CA90B4B7D973D0F8
+775EE424F599FB1980918F856891C260AE50DF3C081AF3493B5343888BFE8BF1EFBE6C6FE97A
+FD03B28C9399FB21B90B9F257D02CE7B362C33E8CEED0A916CDCD385C480769C4BE8B0384184
+02792C2B50AD79DA8A743554079C75B72933796CA0BEF5591B5F8226A00D9FFDD8439FE0C9E4
+AA22D034E3A345E7E71950D151F3A92D69BF0174BDBDA1D2BF4D2F37A5EF2381418B80EAF7D3
+9CED1524B28051B74425EE8923C1D7049A557CB8A3214D2E56F9BA262A4CAC9C750C2176E70B
+FC929AB6B049262FBB984F4E97D602C3EB2A43A7EB1D0E82E69F8D04755712083E2124A90F2E
+0FA66BEBE58C756A965BC48E98F9D7E08D9D69340913DEAFDA977F910F3939537CFDAE2B619A
+8C73B2B97806DE736B6E3843D59F329D79133779795BA7133D66D39E7589BFDA6D3F2CEE30FF
+EA9381B8127C39A6519B1942476CFEC61E38CCB74C411B5A5A8D2096278AC5A5EE91A9C1E6CE
+23205823D537A3C12D88F69F6BD73528DF71359460D5CBE2AE49891DEE90C67799684E9FB603
+C17AEFE75ACDCCE8AA427596594F61DC6EFD65620F50A4C3223E92AA8F00102F044674360609
+E6841E701AA3031BEA950EB1B284A05BBE623D59A704D5F5744071B069D41F0253F9A0DD4567
+355DA8FBCD8233111AB2DBF86A3A0AF6C6A0B3E244B916301EB35FE0CE7D3F7832D8A40C2596
+2A57CCEC710DD262DA454B7EF9974723CB34E8E8FCAC0EAA6842E38B81C8C08C79B656ACA3B8
+FD09780274AE6060AA2FA47E34D3E3EAC1AA4DBEDC68845D524E41DF44E375128B838DF92AFD
+0C4F2FAD0DB17B58A2DDFEFEA3A5AC364E05DA44CCEAF60D802CFB7E2E8C948D229B53B2D39E
+3EA2670B6CFAEE513B639DE08D58D1178C317915C0EF0ECC006CDBBCBA5AE085564D5C6AD5FD
+6F707A4C1DC08DAA8B06BB169797FB81C229681E609D0F9CA6F7C7157D50BB46F54643E1AB10
+3A927F4BA889B0F211197D1778BE459F598EBA61B55F351C6C9FCDB85673833FB323B6602A3C
+2F04451DD408D5CB9D54C3C92D429A3FB1BC793B73AADCFE9F48397B2E07B6593DF26F46E964
+DF0545B89800E6C462B502C17520871513A8C581181EFCAD179E30E79C832FF52EE7496E6010
+446A8A6C29EC2243ADDE81205D7A45670621D5BF63392975DAB10E01258F1D66AFFC731D001D
+E415257C61698CA8B854CE4998D1383468DABAA619F7B37DD1CAD246FF12308CF78606957419
+DC6F1D539E96D452B624257BFDCCC2D78257C12764986DB6AC0EB8A632BFC76711E1FA30CDFC
+5ACC188189674112127D8BC4AE0959CED826CA2A9D3C6BE736F9E5FC4A95B97AEA8A0C55DC86
+E138955FF10239308CC61BE2A14927D6079A5E10C757B60648084B3DC418887895D14A1C7E22
+B63A71342B9A72C12C45E932D863D3E8CD8F60E39E28BDCF61542A0C2B417852B99EE3180B74
+37DE70ACE5A809C0287417A37DA19670B411ADB2E837181D75667239DB2E6AAB2C56E6FBF45D
+72E956003DBBCEA38C633C72C6B9D4336953CECED0FC43725291DF357C3D53EFF9D875B215F4
+FD75A183896254A67F519498C1F6DB8A0C3A7A3C9EE7ADBC64B157FF5EFFDCFC949D5D332687
+2976D98BCDFCDEF97E206613F5E193E71F7F08F4F9F489E930204C9E474C698A18373AF48868
+CD2FED6E0A886CAA4DB8BD8730D601D78E369576EFB485B14BCAF41FAD1372E04F207FC06A2C
+0B498C11B6C19C75959DEEA960177F1C9D50E39A0EDCE9CD2F5B4AF04703EA6739302B1344C3
+00CA7FEE41B77768C1C16A5DA38CD240C1ED2403CD0D1A78E8420AD448711B4B49A1EEBE2A46
+04C15FD67961F6CB28186D41228AE20287A18903A5366C9A42B9BEEC723E6BCBE788172B8305
+66669782BC3864FFA2E19AA5C5348317611C123D7456036923806F2F9411D7A1005AB2FF242B
+3F1A6A064F71AF10CA2ED88A4DD1828F93DD186DC544796D132C8FDDF8D9CD03A37349A6F6F7
+DEC6D929E91E247C182F4F572B60323D4A52426669B4DEB335CCC034363072F49CBA9817EC7E
+B195E271679CF03F95475D0414403C7FE22A63289CE09D3238B64FD22BEAFCC3396C3EA3E6E3
+AA7339D6B0BE8BCEEF7DE6D5FAFBF96C62DC55438BD45A6AC4C587E5878EBAF6A6284B244D86
+96025A61C7DFAE6F6C2A5ACCD5A11BB7AE0C1384134F00DDC6679E1E472E331B6AC2A8312863
+F92AD9BC45B3CC12B1A7290E30CC9970EC12EEAC9915D5C3FD7C995AD57756F9D2F256F4C6C8
+FCD2A83EB0F92D46C8D680E438215173F05387D2694C772E718E1327F3ABAB95143C64C93B9E
+9F0AA92AD57E2A138BA22B0A3EB776BBA9ED5BEF57C714E7C17096E80046DE1D7D2B7DE9F494
+F0468091DA15FF36DFF3803A5937B1C8D9ADE4697D8BB9B6EDE81E28B0FC5D7F53750DF6747F
+BD6E8BAC7733081DE5B4E9F1243B94F5D3FF1AFA0B469DF8C0A981E26B685870DC4C585103B0
+A869B0256842F1E9356BC3DB8D6A69867CE154F98DBD0CCAD75E965D2EE76E68F5732E7F3FB0
+01E48EE15236908C4CE3022BDEC61FE1A18562FCD0475E298ABF2F91534E235AA1EEB4E860C5
+5A1818DE4CFAF1BD036AD51E8DE5942857CBD8F872245A6A91848435EDCD0423E1D6C195BF24
+102E53530798FFD02ED7D988A086BE108154CC598C53EFEEEED12809D6B883C0FCDD70DCE9B6
+6E1298FDD4B00EBC68E11BAB2A876D379FB378D3ECF178DA526EBA354668F384FB4748C56568
+92AEEA403E9E674904B5EE6E36A3A690FFA6A2618EA960AB4ECD151369BA6F05FBDE1D104683
+E5F14CF0559CDA91708A75647609304535BFF1FC1C1D8497E9F0EABD18263B34EE2EB97D6819
+272B8E9134F8CAE12F53CC9BA1559CE52B00D7F464D3BCDC8B9C924270B6B77E4870000A2019
+682C15984AA766EB448FFF834EE5C5ABC83C759066834EC1526DFD3CBEDE60D0480ACCF07629
+1F2277C91C9DA25B94E80F6B494869BD324BAF918BDC3FC008819672A50B5F42BB81C5DF23CD
+C3A0B1AF94B984A244BF3DE49812CD96C78614C0C56F2B86EB72ABB428ED7D820FEC817F967D
+BEBCDEAD9C6B77A20B25FF55D49106078B79156880389FE4AF92425FF295F306E96EEF0DFDE2
+D05E098AB10D1E2B8906B20428D8DB67FAFB77B3F24E4BF8835EEF626492C7CF978496A0BE1D
+6056898E99606DCBEC3F90320E6AA342049120A963F5DA6783394A1C6956CCE618C20ED83A83
+7E7E7E0032CF8A4A8652E8BA5765DE7349BE9B81F8A0D75BF408E52B93CBFEDE4EAF1E0A5504
+7FF55251AD91A1B95D64C06DB9A24BA89D3B4007F9D1868708ACCABAB4E68400C61561D38573
+395EB7332C9765E95B36CFCFF62BA0BA444FE5987729E1AED16A10C11040D42A57991D1864BE
+92DAF4E7694E5C8C20A63B948C2AD083438C9604F858B84000797DCBFB97DEDCAE86EB7E5E07
+E7E3A31043AA7854033A3F644A4F7FD443B177ED1EB42F711A5E7312094A5669EEE0036FAA39
+EE6FB9EB44065BBE5130DB601E96AF8B23DD0759D633A7F5CC08089AB85906F4E1523249F685
+DFFBB73C917FED2920C20437BF7F8C0AD585EBB777ACB5443FE9F8922BCA049FA8B0252019AF
+D4EB76A43A59F5A3D98DCF8CEFE0E8AADCBFF93E2E8D88842D7793A4BE3B0C5BA4E4D9217693
+1037181D9E07494675C0A86EBA9E8AB837AF46ED8B3B0EA64585DC8C0A72EB5E6C2614104864
+C1E4821E2E5A13BCBA3E33B19DA87F837D4940687429086AA32715CF0F72DD340A36527F540E
+1873C988C5FEDFE96B2C2C893088DAFDD58B21B21986843A69478A0D517468BB86DB36E84CC0
+996C62942233A5604682C2712EB7F074F97E6C7C8870C3E91B1F5B5160774896715C26DB90AF
+A8004708235B5475575469F7B18C234204E5377D35B15EB146D083C96CDABB658D486F632F5A
+F4CD3DE59A2EBAD44B9B85BE364362433BA8C0C9DEC17108B6A4763997603B6CCEAF1C056E59
+4D28E6A9F01E344403B424B2DFA49C5EA735A61092C1B4ABEAFC6F39A60B6C0AF70D92944B4B
+BFD79F6A4B67B40E6DCD7330F03F7283E8BF2AA0DE68E5639ED2665E6B252636C7726805FE62
+36EA67DF66EE7E46930D5EAFE541338F3621EA64C05A177AEA44FF71852703E66F8DD8F417E3
+E6864CB4355B18CEE3B87ECED2325D83727EB06F10D41F20E9D40EB5378F25583A21E93E0ABE
+444CE3CDE27B82E081DD54C1C478F673EF38B15AFF3C95842B8DC5B90488B9910324B004638A
+0B8C6C894C58EE11701D9046EAABD2C417F17ECCFE15C765220D74C79FDB0B98B96CC59BE479
+63E6BB98E066B7ABEB7DAD10A03352FA9916457313407E5BFE80ADB801E229208AFA0B474E99
+5C6EF5A3B4DEC5AAEEBA2579551BCA9ABEC0142D6051910EE3F3397459A2F12471B36BC11F16
+B53AAA39CFB69FAF02B04D71D74D567C305BC0DC85B5DC7829ED9FA8FFC65D1AEE665730D1B1
+2B0920F7D828D547DD172231494D3BF562B5F516364E355C80B6F20564817E8EE7733107575A
+AB37451D75A292D96EBACBAC3848A5E0842A52E8F5258215CCB1517673F4CEE172467E4EF066
+C18537DD91EFAF2EA46F7F5412B3108C5380EE7B4A9807DB1D5A396ED802C3640D520EC22E28
+8D66A13BE5E8BC8276FB9A2FA09DA2A93BC59C9C3E0A0C20FA823921251C8AE01576D8232C06
+C51EBA11DDC679D9C428F2F60F3F9B99F3F08DCD410A08FA9E4CFA4D82762C6CE53EA6F7A270
+2CB45B6EA563053B02C07483F0EA3261F1644517E9AB19E7F5C1CCBFFEB62E3BC1CC89D6E185
+6AD87B84A37184FB4CCB61CCF2063E41CC8E991E5081D7DB64E3A17D43D5308B069608230570
+696F8ED97AD3814B72896E217A699F8F3A8EB79D915E85309FBA414F8E2BB2849E540A9146CD
+914CC20542F2A4FF690F4E6E60F137FAB4201EEDA336E81A2D944A5ABCC9E3979C20E65435F9
+2388A87B132C6F1C5231E03784306BD033417D147C83281D8BC3F600B773AA2D7D9999C8F378
+CF7DD8B5F8D5FCA3114CF1A7DB64E81B2F80B1930DE6316C241A831F4A655377D77C6E4FD0FF
+FF5A287C648BA2D78556CBC196BC98E1428E9E6BF9B6ECD0440251DCDAE165CAB80DE77F733D
+13E8F3C65ADB56B14AA17ED1795BE79727882A24F89C5B95F9B2D72E2BD201331FB2FCA0B60F
+E5AEEF092DAEF95684BF6F04D9D3736F5A9072DA7EBCEF0B78DB112E83B80943B49BFFDD5233
+A7D4C4A4364F00B815E6D672233EBC2AA2A1D626E9E003A59B3BFC2C153A9989E36575F345BA
+7DBCF7CBA0275A3404FE7B8A18711555229B49AD536DFCDEAF5BD74F63B623856A1E7642F079
+CEBD327620D4E52BBD979975449F5862CECC7767EB8936DEC3B7DD5A7A604B7E04D1E58F6057
+9FDF2FF8EB2DCC816F554474E73ED43FA1AE99159B0F74AC866A811D90C56DAB4EF12939B902
+A7FEF046809744098378BAF764F8DE2765EAB5EAA0146440DD99FF87F402BCAFF83C13816167
+14B520074FA71349AC18CA9833F67A3B3A264B484CFAB91124DAF0E89AAAD9B5591D2366B510
+3F34266E864FA987F24765F7120ED14D6366456B6844038E8B46B4B600EBD0B7941DA2298608
+72F09B5289E2BAFB83DABD00A62F34C723661E192F40E8FC100B79718B31005A779A80CC4837
+7EFB743663011B1DB82630ED3504ECF66336C0DC05F6EA16A661D94A786370543282CF001E0E
+7D9400695C3022DB750789C5D7B52EDF84B5A19F4D8ECBE952EAC9ED292A4C7D03338A223471
+9A987BB30331BFEA3C032460B72C18B693CFE54B7870D30B9AF90E52F478C7F72A1F51ABEAEE
+8A030C0AD7F724DBED5CBC76B35942581EEF6723EF1C82886A9972134EE9FDE3CAD93D9D75D0
+01A0B34770786F240F4D7439A5E515CF88A2325041EB2D7BF29BD7F0A733500434D5107D3374
+8FDF40D4AC6E13718FD1FFC953427277B8EF4F374867B373E4DF9175C96EAA6E2DBE8EF9F08F
+F9613F374BE9B9641381CF22E6192AC68AB497CADEEDB362C4136A170F72B0BCF9D0573C5799
+0EC403CAAD823187FC9898D0ACB86D0E07BA28790FDEF3D459761988DD5749F2518EE1EBD609
+B5C18675F84BF646A2141695342995795952B68A2FA6504E0FDE43723CCD2C0D0D4F5642A0C1
+A3F8CBB216390DE851A841A7EADE53403D7A328FD1C4F5A847180F8283FDD648AD6572E4B0BD
+CC58EB9656B68D4C067AE86C5849D6C542F54A026552364D21CD266AFAC2AFC0EE943AA5CC75
+245F8B47B4AB89D017C52174AAD03B1435DE24D9D2F41AA924C407457022A02E5F0A6B760D69
+7EA94BC5E76CAAF6E085CCA5D32B560D5E3B74F6BE573FD292FABC810A1DDCB486B52A6BC47A
+DDA03997610248F7E13E44DEB241A23D1D4DC1A089457AC6AAF9F8A3FCA2BC2844DE8F64FAF5
+62757A42071E7A67E20A2591963765DCDBEADC1264A3728C4DD3FAC7F907DDD3C41D0CBB3F82
+E605F7C437DFB286E521454889F7A43DA468B3A68835ADD2F16615CB5E5F540D7A3BFB29BDB6
+E382CDFF9AB5DDA834C676D72D34C94C8FDB4B29AE25C9B4B6EF7455F112DC723853A9C7E485
+0BCF12D782C1E74FDB9395116D7BDE6BEE11B5A291CA3CF04BC421DF912B594688359A7CA1DE
+9257FE99BB9EDFD0BDEEE158F56BAB3F1ED04D457FD0AB90A5F522FFDDC6B0CC829926DB21F7
+61B1C2F5CDE5C08CF1873B878B6507BD187D020DE418A365225A7660118FF45D0983C22D2C52
+580E1EC7B9D08311B5DC9DE8BB569AF34AF493246A03CF7787D9EC555ECC2E3E9F1A2C0CB926
+B47A0224560D4F8D2BBAE077E948FE94DD3813BCE4D18BA4B71D185DEE9B05C0C06667308D43
+EBEE794B6000AEA93C7B400CE527F44BE49788E1E7299B2D642A28FAF5D579DBEA8B46AFBF0A
+DF1546EFF04EDB2AD3C3391DA5BFBE5200EDDBD52D509D248AEB2FE608DE9888D7B1A5CE3904
+9F984CC81628A894A463A4825EDC345067F3D1B05C0D97AA16012FE0F05F102070BADD79F188
+FA819664D203153219785EE915FC79B87A95F551913F94F5589D0449789F57C7A104920DE6FD
+D477F43D8B96A219F4025357FF3C5FA0DA800EBDCB38D85BACD230C8EADD88D978ADED975B25
+72B9738B787C2DDDF73F5A4F5F98F6A29E9F0929CA4A1D68ED266256FD80DC1A1E0386996F4E
+D82BDFCF46FA24EC3F48CA364DED12245EC661F9E312F416097E89748409972A88563FC6DCCE
+FC0948A9AC7A22ABB67681DAD268F92A73D2B30A8CD5BB65746609AD40652F18E18EEBDEAC8C
+3D11042757163469F42D5DE1E7016B740213B82E75EE3CC01060267874F05748727014469CCD
+005986ADA6841072C58054E3D9CC51F6AFB99AAB069BEACB8060F3B489C7A468716574AEE183
+643EB3BF17202848FB2593FBAA222C7F02EEFA10EAFD70959E4F8491BB11E359E98C6F089FF8
+57BAA11FC00E6B78260516E5EA81066148432AC35DCCE35845C34460BAA8E20653A90ED7B901
+977DEAEDD3625A9E8952E8367E3854130BCF23A3F4D62D0C42FEF316AC36238B501FC12FD95C
+27C821F7A5659E8486A1F67F72DE27258F26F786EF982CC3934FD43199E89D440BECC0B740C1
+6D72A30BE83E45ADC79DF42D4D6A0C4A7D3B016F4DF327C4D396FCA1DB9B9791B8F19879D104
+D971347250E39E37A3FFD258578A2566A65C568D2E1AB6400D0D7BEE41CBD8632008DA8F5C4C
+D677DFA389AD66837344E100DF6695C607BE52BB5A3C0C2F01F720E0546C1983A5092455BD6D
+3BDA8B15ACB5F4253FBCD9DE3533C3F34E3B1D55ABFE7108CB47BAB62B734233834909927AF3
+C54C449BD76FAD7C30B12B04175C9E1761F8523A255A407D4772B7E65E0336F16BD67DEF0B67
+4EE1771906E9D1F160F812EFDC3D1080F15E2C6EF25C917DF2989B3D53BE6547734D07C3F344
+E50DBE5DC50460FCF792850D7DD52FB24F68D97C99F05BF5DD4A8CC83AE5565F0EAA11B8E630
+C6947EA6FE7E686A654D30B2E285F8E01BBE0AEEEDAC9B0CBFFF941F232AFD48F3A46102D207
+326DF0CB0F26A8536397EEC39381E1C538E8A319CC37E51E0A2435330B6203B441D45B60E57B
+2D84A357340037D0AFBF788E55B23C35F311BCED7F28C7A826426C961E5C1C6F41218F5305B4
+9ECDC9E03252ADEE4F56CC68A85E9D9AF4227B2B30C326911F627EA521EDC0714B7A9A71DAE5
+BA1014C7A507F2B5E13F6C146A1C38F7CEE8BCC4C0A64B175802D0AB724A2A0160234DEF23E8
+29E2DFC1983EDDF81F406A24BACED9C1DD2295FAF5EBDC447DB47B3A38643196DED4A4862E39
+E9B416389CDE7DACCDE02B9D5614BE3531763FC9ADB76BD58E6E86B0F321F1EC99EE55A7ACE6
+8D39A83971B2B2FF924DB84D944747B7C844A562A8A70DDB4DACF155F5F9BFA0CEF24D8D764B
+7A8E4F1755178460E9D26918768B50683D1B5DCA6F8CB726A93E5CBA5411ECB0C84BC1B49078
+DBBED17774642CD7EE12E5A88929AA3E680BAC36089E1D5FA949279050E8270C96915C0A4CDF
+F9C536C89E8988ECAE1BF6D6E0A4B9A065CFF4D531D202B2E737B2C31145A45AB4E4E0C2F2C8
+217283AD316A662E01B4706F44F68C9B4CAD5EFCBDC06C38A0599D784A3D235537692D06012E
+DB740082D6D1CEC0C2A80084F37B173C5F74F7E7C674FD0BD158ED4638C75CC7B7EC27DAB42D
+F2F15D2B362EC5F014021594C3CE09DAC8733A568C61599DD138F366AAA24685309691993A3B
+4D7070A562E9A2858E097C56F9F9D064E9E94A1AD4CF437212FBEEC6F73A4A661566188156E4
+325314E92A58C54DAA0D6334B045D8018E3B5FAB5FEE34E4A6DD46B63B08F8BA13B9A555A367
+B692E503BE3B42D3AD9592BE76EE0CCF4C0D667317F8B4FF4D8229CE466EF032817A3E5F0D63
+44264C5045817ED0941608C6A1477AB55CB23DD6ABCF67067A18295CDC352D1C4396A237E551
+3B4768F00B0E0E383DA9A7A35B21B3E1B7957B3527BD83A424C68B0EB87B60EB7494AED26234
+EB613387F3A8045D3FDB6EAF2F947B5BEB73FF5C995AB888D7D995AD599E646415B2C31ADF21
+48A44D7E7B148DA6832F9364F15D7DBCFB3D0BF08B74D2C3B3BE860829C1DA4122E4920640CA
+E5730A9DB7C58E73E92981D6C72471FA2812FAD88EFB7F77AB8061C481319001B945D8A0A9D5
+123F4D8632A161C450548BE9866B6503C66576E1C815E01F6DAB0E11789F6124B3E4BA0A3558
+67AE1FD312D25987F43E0BF054A18A4B6684A66CACE90CAA56B6538BEDDB78102D90C64F9484
+D76D44A7D846C5DB81F2B1A5F65BC2ECE22CBE2D8FE3E3615C211FFA0EAC3D5CF7A66C1D4D5E
+D1859729EAA4FF523F4E307A48A412AB9F31C5CFA58ABAF92286A2073BAFDF8F1C1A1A51B790
+C53B4C3CCF3EFADD0527AB576F6ED5137D207E9D8657924334FE2D570E03C671FE4217271CC2
+C5D6EEFE5F6AF1409C893926F364B51B0A2F1731E14F4C4B6FE31DE072B7BD091B30B093ADC5
+18FD393DF26C5DE75E9081333ADD05FD745DF049C16B3D6E0E2D75301CB57CA0A09AE1176C63
+4F35541BA284B22EDDB016E36ACE80EF7B3D3C20F1DAEAA50CF668BC65055B7375974D85C1F2
+048FA232B22BA300ACC251831F65289C2BDF785AAFAF5C75B769ECC8F36C2D82E072F0B59B10
+198A4ECD0FB55F7B77F64B4BCBB8B6FB5A16FFB86E8FA6D750ABA4D74A1EB67BCD81534EE47D
+D60E3A30743F15DCC3E235F442572E7BA1E7682D6FB28AE256FABFE7488DC3C5500973662B5F
+8890885D5C7C3B538680F6668989AEEF446B2B3EB435255436EDD1C3143E2D82565924BA0D88
+EBBA169B0DAD999DEBBE1062B20838AB245131BCDC6FC446C817952D627E8A6C393BDB789257
+536E1E60F68F9F4CDBE0C2167947F98E6140769C04412F53008CF108C89E56A9587C1BCE40B8
+390EE1A87EB6B12CEA750ECEAEA75A0AEC405CFEA761E00E4573450CE95B874B75A7A1649B48
+9E6797B833497E2A7D03823E158D43986BCE89EBAA3A3F41506FB7B8DDC8601E3035BE6F7F6F
+D57588305389889891938210929F0E25E0E37AE9E812731F225E1245DA41DB935A590D88FBF4
+574C46E12C9F7D689862104526836DE9174DE954DA8551D0EED02E74DEB8708690B92A31F500
+C6D1717C739D97761337C5F7FCEC0D48E4DC54D6CA16F7D18070122A17775C87E08C230AE3CD
+1EEDBFC16A276A67462E1BBE217C4EAC0EA22BEB8FC1EB93277516E78C5769D83223AB672259
+002329BD69E1708EBBAB9EA93BE0F3EBD95E7CA39D76D35173D351039B3E2D5A4CA40107E249
+F84FAC05A46CCF2F112A655FB35F8EFF03150128A81821A422997678A2BE9737A22D05FAEB51
+9DB7EE5F1F0B43D1D7CE589D30B8B59817ED0D938CD940603105EC746075D53A642C556518F3
+97B36456AC9BF2ECBD967557278331CE597AC716538E31704548CF36248C183B503D1A486E0E
+0D75CD162FC8E53B2243664254EA11478E3971E4B4F1A2D800E1BE02AA4BFC064775F2947681
+B84AF4332E77DE0D577E39DA5A70C6365427FD658BB0EDFCBB279C9ADDC1A0DCD2049BC728D9
+C295916BEFB36926762CC071D9A542C2AFEFE506AECB8D7A9F5374DBB0EB2A1E7EA8596CDC6A
+EF8E21ACC8545270A3F85E82E337EFBF5A3CDB3AD2789A718413A886D1595DCB9EAC464263FD
+F239857AFAC9B61E3F79EFCB9A2411F67A024D4C15070816C4687DA58CB2E2CD42780C0FCE94
+AE344EE73CE00440CE9D33E490E77F0F3AE6A088D5C26A24DA0EF1D4D2C9B05CB207F8EE1CB0
+75E0DB123BC9BDCF2DC689E4D7138DC745AFF9E7A9C787AB6736D793E628995D540E60F9E70A
+17D0A6294623E4FFE49DC9389E063E4AC59D4CD603E6D3AC91FFF3A7E89EE69F7CC970CAE3AE
+BEBAD9254906E19629145DA42B2DC38058BEE8144CF1B02AE83206902C9CB9F6A52188FA59E8
+0FE75D226E3793712A4C6F8F240AA386933AE394DBA9828E1A73315BB8101573BE81C153D449
+31F60B3A7285127C61B775AA2CB3916A57D48462F47CC6B6D5D77B733D553D784CD4A8C269C2
+3CA69DFCD2275590BDB2D357F928921D925B0B648141266F85E92745A543E73F33FCF3E5D816
+622D65DA2974D9DF684CB5B481D46546A5F96833B1011F9D66A547F7B5F5978A4C7A9234176F
+4C07106632A15562F968CDF47B4E6140005BBF60E131EDE887EBDC71748654DAE8DB23A740C0
+41964357719D9180E01A1EADF9410261B564ACBF2FEA3A7D465A370C3EC5520F97C00B3070A8
+7B8892D8DBD84239CA52B664A5A1CDFF4E2CF711D6319B2B833EA5E038D84323E53BBDC19EC6
+EDF6CB15B6E76703079FC117D2C59B45EADC98EBD88ED8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMTI7
+%!PS-AdobeFont-1.1: CMTI7 1.0
+%%CreationDate: 1991 Aug 18 21:07:18
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI7) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI7 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /sterling put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-27 -250 1268 750}readonly def
+/UniqueID 5000825 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACEE583A5C939393E012707B47E0C1FA47D284A1EDC
+9D01A497D772BCA8C543388E6DC0D1E2C4944740470E0914F65EFB0737B0851B2BA713A9A00B
+36D07DA6BCB52920B9B59EFE587734027A3C5E6566AAD332FE6FBCCED1417802822A3B81D618
+7875263D6BBDA04BBCF6E4870FEEAD60F104BB3C5A766610DD11AEA64A6B107B0B04439FA288
+8B8CC39232BB83F7695ABA81F0260CD5248B9E649CD80219794832AF151FE9D5386D1ED91DB5
+4D1F56DBEC55D7C48ED295977E18F23FDA49F00CBF6B37DBCBD34DD98770E780450FAB0BB54C
+B467B1038527DA84F47B0CDFF9561B343383C7CD96F818E10597FB394E91FC05DACDB7B418C8
+E6362CA4E803B563F227624BC4D8E0E1F76925AFFAEB710C3B8220DB48814AC08CC6A4D735D8
+5316555BD4AB77A1098370DCB2BD272EFCE72E2125B0A783A9B1FE202217EAE8EB51E4EE2B97
+35B997AF5B43174C58B407C1C7A4B7528D6DDBC7091F1FB8D4A731D78EC08E4C996301846CBE
+B567359769578272B49423899FFA88ED9E3FB5511C3E471150A3E257BA5656D21B8ED57C4D1F
+6433EB9E04012C52E0FAD62312EB2A88DBFF69CDE9D39D372DD7934FDE7F906A9C4828C1762D
+D4E1AE410026C58B56DB7DF324DAD8FC3696323900480FF909C9F4B9ACBF7D983B9429B25D31
+7613BEAE8EA83B7626FA7B010AEDA862D9D09B45C73D841E6D5E36BC8DB0151D6DD635442552
+FA4D942210B738D3B625884628E541A7ABB75C347EC149ECC27A148CEA9CDF7F1E6842EC26E2
+B9FDAC2BD6AEA7BB0A594E0298B7003B2B858A51D0DA0ECDB9172942C16EEC62C8B4352D64AC
+EE149E55CD6A72B0E80C67782B42C244B955A3885F87C6B7FA8D83A611E2E10D5A6FCE63F0A6
+CBEAC3684F01F7CB60166A924849AA33626D97A1F7C7D2151560097B8A656F0F84765630FE33
+4C554737EF461BB69A0DB61E34ACC22B19BBFA0D7CE72E528EC29E159C244C0C2FED1B7D98D5
+84A95EA05CAF5F35B78CD823562875C767DF1D2646D30851571AD1D51E5AEE2152145DF46035
+A6B88161FEC4746C937C828C5D392138E7847EEA4A5E9B40FF7BC1E8452C4E6C776316EF71F6
+038FA7528C0A685B7F960B0C1585D84C391FB13A0188B6D6FB204376498DCC412AF20E21F5AB
+F28EB903B2D9ECAA4B0409833D2D5F1165C013900D451741B88AF1FAC0152DAD8DD36A93C323
+93C59529F83AF35D268CE1C5CEBF71654517A3F694CFA7E98FDDAB720EFA6B2E642D9BC51D34
+220130375C08835BC5F7504EC0C4E3322E89E3835923958B9F3718053BEF833DF67ADC272C73
+4B6757702583E81886893787EBEFC66F9BB6526A73A1B1B08203264CBF09C2A5D5BA9D15B851
+3B0FCA8E88154EB9689256489EDA76FC11FA0F64E93143A9648CB1FA0A45432987DA9F021096
+3B7250927A30883054354B613C0024A47F270EF2F860E061B502E522D2FEBB3BDB2B04F6EB7E
+44F5BA510414E182612E4DB5294F042061662066F97A617760956CBB2F4D2BA1F9F82EBE5735
+DB5BC1BAF419ECFB25CDA35905CC5709C1492C3BB14A3BA09558D30E6162CFDA31D9D2CDA214
+407F8A1EE87D29536B6DEF5B530DD4E731C73A11955F6EF8388F9E8F78201ACB1F0E78B4E000
+B6D4291F103B87318C8A7774C7475CDB810336FF73D9D50B54DC903E511C3EA7C405A89745B9
+270049C345015196E28D23CCF233AB70CF188FEE04923080EC99E13FEFC2AD5AB9133E9B681F
+2C75DCCE4D3E45C83C0C831C6708E2A3048915DC8A4C7A600F70558F5BED7D3BB6094010CF53
+A08E13623193162C2066CACC8805EE4F8B9C3613CFD0AC681A2DCD6A516F20C2BAC6C472AC5E
+73303EDCFC955744467525E4ABB95DD7875DD276C67175106B6899120F6A4BDB41D042375C33
+1964606EFA00475C1CC2BAD3B1542DF229FBECB72E877477C518B2228F2B678287D4EDD6346C
+4840186DBAE90AC3DA374D6A555080869C3ACC25BAFB3E235FEE18409F6203C0E283FC7944CB
+09C954E8254E55226C3050BCB92B06F5E8544E84B6D366C3EED3456C9BC40F44AE58D5A25EAD
+EA6ACDCC696DE4AC46B023026F5ECF8D31184033E05AC3BBAA5C3E60028B74AFEE4B6C9C416F
+7217AF2E3FE1C03153B6E1ADC3394F2C48CD64425EC2724197002ED4CEFA6B24663BCB24FA45
+5935C1F420002D284DBBD089B18345364B3CE55788BF91B96BA66D5C229F47CA81D4A058A59C
+833B6A8154E6882F55DD00F1B2F6F5B778A42EDBA3BFB439843CADAB3912A2C4E5A9023CF4C3
+5B47F13DFCBBF0AA6F6621D3DC5CD38C35958AB6ABEC76FF637F8F6D0CC5F854F878920BBA2A
+EF0B6D491AEE87D3091FB2460C4838FCB8B315E178E2AA7FE42CA059D8CA6D73BF8F959BBD02
+EC93EB0EA9018BC26C180DB6014F48DDC6F7F3EC9C473DA0325E0536442E1B9E5A1B2A502931
+6E11E89DAE79FA7705139017BDF1222D56E0DD470D07C02672FC946C97ABB487865AC6514250
+0AFDFA3BC608824DD5688F78431BDFDF3FDC692ED8007D92FAA02A76DBE40DCEA737E894178B
+593213105DA21520AE5840742D6027C5FE71285223A2022416BECAF04F5B7C32105A28AE8A4F
+8FEF4EB3FA3101A4ECE142FFC0CCB8F7A3678F8A5885C4E9868F9780C801986A977D9BC5A0B7
+C5137508F7AB336FBF2C1AF1891012381C61BC9301B846D312F068BF70F640BEC8B1494620CE
+6B8396AB0248931162CEEA318E77995BFB6D69343900E85F9010F56A9C630EBE5ABDCDEAD2DC
+CD6FCC962E181E02FD3306D1C75ADDEE09936435C0149D0DD944183CF890F42081B6A194A213
+9D71BA6AC8C6B15F6BEF57E875415304A1008C942D8DCB39F71D7971813AF788BDA2998051A5
+8DE198512348A3D59A0868F198598CFE45A58E4ACB8818BA1F0E2251F7C89324B14F2F06763B
+DCD33B549A6015DD13B66F3F0B899676AF89E0E477C5F5E302B459164B7E1DA620B8A2778A4A
+197173BF443468D300DC1651B5675E54B5B0565CDF7E860A68344AFA61A743BE5336C544A5C2
+102B95B9448165C2372B122D9D7612DE507317F115E3B24DE868E19E3DBE95B8E13B9057F70A
+98B6B1CB3156BC3C06AC2AC9490D6C327492DEC775EC16B0AC1A6A207216892BC954515C29CE
+462BF5417E8B517C210B400401382F4922BAE553A084BD9D1FBBA856E879467F87D6D3FB1CE3
+7F3E74CEC13D4BD11CAA48AB7F89C18DACB843035507079F477F61AC8B8F03485A2E4DD80F27
+4F8C2ED573D512135D633BCCC7D45879D52B2D7D3FD99C65F76A9D3B9E91450E349A844FC923
+D608E1ECC3FD7EBC0A215FA9896004F62DA3009FA2DC16F39A59DBC08ACC205E342901310354
+CA6FD07BF7BD7C2AAF8058D704CEAF59C27F222D5CBC383304BFA7E4362854D71C3749B27885
+70D3A183333E752A31B400D58D9D29E67DC93F79A78F0B0F337498E222EEAB5F98A7BD471372
+BDB306C10E2FEED0D5B2B8E400BB669B07CF69439E87CC70D3C9819F919E07E94BC40D06B6B3
+B23E4450F0368190E81D3402E53A267C2DE7215DFDE4EED6AC389223C26B8BC5AB125FDE227E
+6FB3A473ACFEF839F630935C870E6DA802F79B3B33D6818AF626D1F67390AC9DAAEF603D44DC
+E288A6C45B1A323A88AD47500AB8700AD58CED433EE12E1CDACE3DA395BC6676C4612A04AE4A
+7146C6CFB7BB5338658D9C86872F8B3174D9A000908B7F5D5E19157D0C720CBC53A218D0EC80
+8E4705DB4A600345D857AC4BA3A7FA89C2F75434631E3F40D2979A2DFFC248F38B445E08F5C4
+4E0896D657DD32798F70BE1E2DB5E322DC163657DF936D8767CFCF729D2DC1D76401CEA3AC6A
+B02B39FB72A23E8E0AEAC3F3284A6B9658ED13F6F5F19D92B12C88BD115474C2DEAE952C2D46
+2EED0C89F02EA65396AA77C71180741968BA745F376EC08F04CA2D72055177D16C1DCB551987
+29C31868B309FE12E21E498C9DEB2355BF1480696FE2AC2AF6DD837891CA664DD33F89191237
+89200576C9C585B6BF6577CBCD06FBCD9E37B9553E959F0F51AF62E723C62086FA17CCCAAFBC
+054D2849B03D535137BF57B8936CA6DD921EDD87E5D81D1156158AB6C0F39B66125AB1BD2BEF
+B035ACD0FB77EC59DFAF10B4F93ACB8AE69A01D1EDF99DEA3F9F861BFF36D2874C0966FD2903
+18974E8518CD3FEE234DEBDDDA3FBC7A4506D5D99C426E1984F783DF2AF53C5650B0A1AB2F1A
+333285E5346886F7E47D2903A21DA100299AACE5DE2C1AD1013F4BC66B0F8C3A66138857F2F5
+F070633F1FEB6B133CF9B1DE6297EAC601B905B2C396CC971B92E894587878BD1E5CB9A83FF1
+3538768EF6EF261661597645A156FE77345592B05F8ADDF7F3130DF41FEBEBAFD373D0C201F4
+AA72A8792649250F9C2DE0283BA9B2CD2619450A845F17666C2D0A026EDA405F186F4A73EB93
+3F987294AF208361F485ACD3118445C5AE162A6031548185129650FE54450936062490CF0C88
+E551E8540A20B2625792FA8EA4A2387C6DDE241ED221201E7355340468C4AE86777C81F7EA18
+B2A4324D5BE709DE6E0DC47410F94F71BB406C7806B43906C0BD1E21F1A589655787782FC6ED
+DECC4C5DEE9D5E0E1B52445E82C72837A9CFB5F001DC9EAD73190C977620FE9C1636838E7A61
+D79504FC84B493A6F373E6C3E597D9B9F5FAA0EC0A7D24A0072BAA27AE9347F87B98498E5B92
+B00BA88A1A5DC80FD721BADF1EFB81F95F5C8DD042AAA7E582C6C4F15ADB4383BAC1434B206B
+DE2131B82B871B620F28C7FF95F9CB6F88F6F9665406B6CE176C4D215488E976529ABE2FBA65
+0E9017C3A95D239ED4EEC3DE56E6FF07320938BB658762EDC9FFFB5F0C8C37F9A91AD6E2B129
+801758FB7C9CBCDC7E0E42BD97547866338514FA00EA18FC2437F069FF796D821E318FB469A9
+1AC7C51ABDE45B7A0C1982D42BA906101D65F7D715C33048346B266A46C7C274B805EE072584
+2DFE3E27544CF2A420F939455E1D91DCBB97DABE42C25B16E625D3473B81DEF819318522B3AF
+3B0C4058834109B22AEE26963C21EAADCA0F4BC993D59049284892872A7D048C16CE2254EC0B
+7098417A8384B9D6EED3003C8145635B0BAE4932CA958E368C18CC55F716C17A8A4D0539CC49
+FF0580D8141AAAAE1F81C536EA9DA14960D9BE285918B6B4C3210969D5221F71C03029222C34
+A90B9C6F533CE3FD5A1A10DCB9DD8E233D6C3CFE2634B63A159D6EB8FBB587748B5D84BBDA46
+12710A04748354B74A7CA56EC09767DF1D73905DF3A36EED519BAA12B49D882C6C903AC85AE3
+86A16D718DCDB7722E4E3CEB7010B694A098782D6805CCF1DBE8D1A3EC548112B7AA4420BDF1
+C69A593A3DC87272D97734D0FA64A1A1E01E329FCEC1EEA7C7DF1BB493CEE4123076090E8E47
+6CDF8E35323458EF2A0F83AC72A7B6D0B737B7F04DC8E1AEFEEBD63F66177032D7414A41C9C1
+927D117FE45AD26E1CBE488BF34CC56F1795BF1A17B78126837A711701066D6928D3A1160A7D
+5FD073A26EF59822E2C0AA7A9396E72C1A18379606236A8C2C7FCAC9F8684B9779EBE82A781C
+A3B131418AA97D86378902882D971F766A475EC98FD95772D9D0E49AE476713BBC1ACF77144F
+4C1AD9DFA2E5280473A013995C9607EEEE1D80FFE6B2DB9EF6D7D03AF049B93A1ED0FF3A3E57
+BE5EC0A94DB6984239B61EC4C64D64EAC595B123859F566AA02EDE1A30D7181C7B47AFD54488
+CBBD8EC58724D0A7BA2EF944C356508688957E1A407A1AF4B043802A098FB558C1AF1BB0B4C1
+FB3E1EE426718E84D695BAAE262569746DEB82010372192FECD2F328C9FCF2ED1818B466FF71
+BBD470091A64528F84DF12A7FB210A7FC0FB9A31110B26D4A2E0BCB824DE983B5F351FF4FF6F
+26DAD262EFB421F95B9072172D75825EA663F0E1247AFC06024B8092D681988B5F0AFD9F44AB
+4BDB2A567DE63DDC2C55F9E3C7CAAC934A57E028D46E0BD5B339B7743155D94668558A1BFDB4
+B1E3E80C9B982A1370141FF3AD48A6AF5B677BDB21C01A74CE7CAEEC5E1A95980825D016CCEB
+E32F1C53D4FBD628F93249748A1F755391163B9B4D3937F38123ABBBCD4DF7CD75320CD6EF99
+3AD86901C8266D006C17B0925C7E473188EBFB3C23C00F4CB8EED6BFFCEB6C50E2CFE781B117
+CF321613DF1623AA4601892A59AD52634D9BA738F0B2A1FC20AF0B927573AA73ED63CEFFD189
+837585B2A5C7F263FCBDE25358D72FE3A15EA3CB8F7921E820D3895B789E02F70D972012B981
+041342778D6CEC2EFC09DD31DCEFA35FBE6D06CFA59EDA5B8460E885A41B86D968EB5C698DB4
+D00F1F71E595373B781D54FE67C6C32D3FDC8A78D53390D514765B380ECA339A14EAF339B13E
+9BE2781A55124A0F7B641969D31503E5566B2497419608C449BCBB4852E40057075A11722E33
+23DC3C13C278E856FFA94CCB9ED22969132271BBE8E9A101645F777FEB4629B9772FF7801BF2
+7319FBC49DF955017CE710647E0CE76BC5E2BE69D960987424F78EAC8C7610FFD5593585003E
+87AD8890C4BDFC177B670A29929F631077F8CFD09D6E1A8B2EC5640960B95E1740E1DBB12399
+DF6C94863AD46FDF8A49F9938D4694848EEC2127043312EFE9733FC43CE54683252A661D431A
+9A79F59282602511134DC0D0F28E0A1A4619167DBF90299B4CBE3D269E5D7EBB0F60B06149A8
+69ED6B297FA5E774B19F7C7F0E25C5ACDB4461B97FB918DF2E1676084DDF43E873353BAD31DC
+74FB70A3185160FE2B62F77C5D7C44A42A020FD6BE575D4133D4DD05E8CAA715C9861DADD511
+A7EC171417C196D2F5901877EC1D99426B28DAD3362231CF346D1656573A9A045689D6784C81
+0E44992730CF012CFDE2A715CD62FE52F613BB899FA6F45A7D09024A2A8BE4D1C3E527D52DFF
+2FC617B7CF2E3D4C1A98551866F5195CAB26891D0E9BA906C34F769C6C1A7221A0098E56DCCC
+4F0DE897A71D555AE5914B6F2957622C16AD2094C1673D69C06B214061AEE5D4CA98C6514725
+2E58C603CF5E76523AE73BABD57E3D678DED63A0A6546BB9F57D8681E80C35B47478FE293DA7
+9AB9BDD0890F1E35C3700B90B960B3F5F478473F40AE721391784BA680808813435E7E2228B5
+2123054788AA6C8A0D90FF3DEA5345A4F87115BB1CC348F3082DC4C6172E40D61C907FD87AE2
+A2996152AB73606437639DA9B88D4696CAD068B812742A34BEBD51D9071F4E883C22DEA74525
+F2309BCD936482DA37D56AA1E8A01B850BF0791A7547AE4B20781C23169DB931B78D03B809CB
+D1323D36AD64AD90D7CE270426E87880C9A9F943D81802AFB6D9DE27D8A7F4091A085C911F91
+DBC9AEF7FAD7035183E6C56C204C3472478830B12668F7D7C954BB345BBBF7BF2C5A0E6B8BAB
+E5732658350F7BA953F01CCD541D75A53159F439C7BF7BEB2622B6EE278F610AB74871B3E93C
+6899D8F0E6315C3F9211AE58E88AB1ECAF4AF257FF107439E3EAEEEDB0458A5627696B6178FF
+B73AEABAAEC994690BE1BD79A804BECDE8E5CDE94CC9F88FAB5146B57902F4954A6ACE9EA5B5
+EC7AECC1A593D60A1684E7608B097621C802BA6D0AD212D621D8C2BC45712347E09B6A099EA2
+0F34E24B2757D3A01EA87F8C39A4F613B4255A97988A518CB966F8D555C3CC05FD22C051C9AC
+6F1AF62B9849FF7142856470B8BBE87FDAE6A031ED94F29FCB081822F0496175CA80B3332809
+AFD58F4B04E44E379B1B838035E57520ADC318AB19B7201D1632BBA78C6AA6555C24A9D6C1DC
+7124D703566AE51651EEA36FCE66A9A7E2D005563EEC721E7A309AE973DAA71463BCEB693CD4
+19436561F6139E5D282034DF7AB9BD8302E6D4E3D7D0A0DD0B68525DC82D26E2A9ED1C6C28E4
+7E02E061268B0E4A726B3DB8DC9F3C10BB9F4560E5493263F773D79D8B618D376EA7068890B1
+8A55A6CF7B6952D4D38E7BF3A8772FE2F39E9F41DD570C4B0A71C32E5159E6A4EBED500CEB30
+42FF3E1B8EA473C9382A49EC657BF2F55A43C88B3E0CF7BA2A2B2DE1E38A04007CF12B7E855E
+B460767B14294BFF38DB3C9A4BF6207636B280F3CC107BCE2E4D3C1994A8956B7834E5C5EF2E
+ECBC3B4CB0940AD6849DCBCFD1EEEA6D7B236F7488E2B1A9625FAA0A468DA0A7EC18F6D6ACD6
+8A2B94D5FCA60724BAF253AB14C33A3F243EDFA77289836928D443B2534C2DA7FF87B3A5C4F3
+056674E75F2A00B650811ADC335D42D7193276EDE0EF62F7F7E933EFE4943BC506B8B8B06E0D
+A6402D6A4EFFCDFE239954D3B6ABAA957423D6F3C122146B68FA18E46972A6487FDF328FE304
+B5650F0F83AF013E88416E513B27CD2B8E2D08034F76771479C02D66F8CC4535FE9B273EFEA9
+88AA3B3460249E0AE01B1C46257A99F15DECCB9F4454ABF92E04686A544D922DBB9AD6265C8D
+4ECBB9927748174673307379F9B34899B850C9EBFF5A4D7F3D2C0C3B5119C3691BBE6F42D89E
+EDD8DF44BFA77D5512FA91C125639703FF28DDEE181EB13D4AC5B5145D9AB5C164669D4BA045
+7413C86AA2A953FF291E501D81B3A51DB2B9CE269A6EBDD5CF56AC4AF0B86458257AA7CE7F04
+E4F485EA1D00FF56DA204D7BCD447B7AFA4C13700EF354BF23B6C6D6E3A858BFE8532B8B1ACD
+10933ED648B739365715A17DCD8BED2849C31572C85B68319E651CA8668FBB2095F24BC5D904
+BB80DB0042C2F141C0D87DF986CA47259E11D1A5EB78F7D9D0BB2CEC8C2C5D4399BE239918A5
+E6435971D67977DB363BF546695F09C1ACB775903A1C557243298C3995DDC91A8D7A6393C7AA
+947D15B6F6B24DA261BB00CEB91713453FF88B1AEF2E39B5D4A2983028CA2589CB8A8637F9FF
+40CB6D0A5B1E4C82A4FADDE43DD6D236A982AAEF126F578F01A8A50B7E144A40851060A6A9A1
+DB4FD331F1845FA032492E0119FE741952DB2CCE89A19E3DCC47C549806702120ABB17EA660D
+E91CAEBB78AB81DA7E534485BB1E0A3F7E7D58718B10C2E0D0A07E50695ED02386AFF8AC5767
+4530E3898F5CE2C299A990609F7762F1006741D063985437EC2965F9CD55D15450B9F013F4C4
+840C7C9A8E44AEDD98BCA2086B24E0EB5185711E90B708CAC2391A20A3F350DAD57CE77E7C8C
+7394A0C8C594EDCD38BCDB7452DC1CA3329278ADEEF819C2461362FFA6C2431E7EC45CC23270
+6249F4656A15C8FD281058AFEDCDC4666219BCA2DA00925B6E59F242050D9B2E74B1A091E5FE
+25B6D2EE87D0F9C6BF6854308C0CCDEB6CBA322933399FBF85C28DD9FCDCE4D47F53B20688FD
+1D36FD2398FFD2F070B28B88B97DC41A64B393D989502F6AE5DF40F30A98FF51AB040078349E
+B6922D7B85A937D9E6122D6CB26DBAF151EDE53CB09C8E0BE7D0BE9B4183CA38A0B19E03B7DF
+6E8966D15816C8F78DB2F30AA3A51871B09CD57EE8A99C787B0B06A1F9CBB2A02A8903A6BA4A
+B05689DA561FDE3E9B56599617062324F751D2989626F2F070FD365B435DACE67F36B43DEB1A
+E9AA42703F44B866D2EDE83D16AAAF5703756346CE605CF4DF004A2CFBD58C21836C08D2D0B6
+F1EFF9E94D66664D6810D5FDE2DDA04DA68C9EB60A0B7D2181E477C1CC460253EFE3580E7117
+1C7F634CA08FC9438307EFA00BC3653B5705E4CD6AA62F510FE921DA07CBF0DDE287AAC1307B
+6F2C1B5E13071CBF35613AE1FE2A1CD379E565990E62DC2680EE73856E9A06ECBF7C0B7F8FC4
+21082912555C155089FAF359E1B99E2D88CA82DC449D268D76522EC15407907D53E8055AAED9
+2F004345E9C0C09907CD01331AD1E86BFE773D5B5CF9B55A1A718E2F33BD4C53C835C93CE2FC
+A31018F4437B7677BDD7A153569CE101A97AF0F2520A258E830FEE1D189C1E3507E2A9594A00
+47CE1DA764DB42744FBF4BF24946D2D536F5702B5D97D7A733BAB25907AB02BFB343DCC040A8
+289B0E0C8778C73C94BE294FC94993716FD4D55EA97E728537E9594AB2AE8177BD0B3FD9F5F8
+71582E83F11A39560276E7A5EEE705CCC7EAA5094DA778C6E9D5058AF7E3224C67C63417D51B
+3BFEC0B515AF648B0C3FC4004D57AB278B9C71261E9865A99F6D70DED63E5C987C18A3EBF94A
+3637534F7E990B95215F0E4542D2F596F45A868D3BD77F299850688E02DC2AE3DC969BF79AB8
+865DCB1C52CFB239D880314886110D31F2AC1DB5975DFCA5328496445CA242D43F8A6AFE1EF4
+589DA9186E8F9216D7A3B3A371FA531408838D847AF65440AF384CFDBD762942E5B8BA6A0F6A
+DAB7450497E2E68A33F0FB9AEB14F7FA88D96060E7F4347C95677D88C21C95BD305FE843EEF1
+DF5E83BD581138638C52C21ED79DBB103D3BDC885FEBDCE4671C5780282B61D2E741966AFE69
+4D6EE42BC2A53E6F54F46ADC0117CCE4524C597971340D88875CC71FDF1FB13AD33D2529D02C
+074791CE8AFCC7643B02CB13279D57D7C931D499CD06439A0619567BBC844D4FE1DBB71FA52C
+E6BC7C0571A8096415F2541608A883B59FC889545C937AE956B90ED150E07B22971BC1039B88
+9C9140294C3B3F728A9D97CEBEFF76169637D0B339B78B9B86527D0251F632603B4379E54CD3
+FADDFEFADD22C640111986580CCFCBDF58BCD2133B76785C6EDDC5E56178D579E0FD1AB63C84
+E9E7A48466F0CB6550A3D88327F2A639D1C4EF6A74EAD52A73B5AB4F869A42A6DC51145022E2
+8485A06B2627EDCE5167E71F4963C36D033B0E4124A8083196A45CF86253024432B51BFBFD0D
+DDF42A6994969DA07A003039B8A5613ED845296711BE1C3F08D2535311FC3414A0D02AE49CA6
+99886CDCD6BEA56B6BB2B1D233638B37A74C0296B974235416651BFEDD1DD00512D9E62EFDA3
+72AAB1269860BB2932641EF4D247E7A3235A1DC089BC29AD62FC706BED3510F49EAD95820E9F
+8638CFDE0A714D37FB7683E33BF348BB2A97852FE0F3D7BBF35A4FC035A20BD55DA089764D01
+A63B0838DA4F32E47E0F701C4BBBA632047AABC74249D0AE3A7C6AA881A7EB67D27CE1149CF5
+47CCC2F197528720E8D0CC256AE365CE93A8C7CBB28DDD59B5F28D62230727E72B7C15FDC15E
+3A91DF3893DD405D7F5819D39606F6201C534044EEB26C46CB9B00AAEDC08AEA76B12F192499
+7661CB3A13BEB21F77FF9CE4856FFD4EB9BEC1B3BDFB2BA817BE1BC2746B05C2B14FC4DEE93A
+F09EF7C225B1AA08FC266E6B0C02FE1D7B8CEAED0BC7F9A6A4811C74E22EE3B16A97AB2C7BA6
+E380422F537EAFD8DE60BB5B8D665FE8EF321E0D558312B6E9AB6D341D50EE3BD3908637B9E6
+3149605342C57F71161C4E167D75C67E219B91DC168576FD8E314B75F5579098F16430BACE7E
+246CD3B74E8AE161E41127A6CFA5A35FF5E1F14CF865E037767189305661B33484E98854186F
+12E6091DC3D0109B1E00791B904C7A4646EC23ADC09317F7D3A898ED18BFDD85034CB9ED5289
+B01D469EE255D33DA4614485F7FCF1635281E0D2A5C9BBD60872E2ECC2D9F1A6C1E0E3D541CD
+F84963C80C7178AD990FF6F18FEE729198348875C8203B09FAE2FBB02F3B290A0A32EF012D00
+CB489078BAF72256E3EA05AC2A2123F6DD2C4F6E66F12D7814F89C0F3985CACA039CD4871ECB
+FCCE5589BCF749167C0F80E10B3A562A1C719C4D15E468E443711E954FC1D5D6783D4D2D4E4B
+2E4BE57B84243E7380AF169CC21ECABE5DFD5C30634556715C7469995BD239F66656620EEF49
+90D1AB17EDA3FC2BD47E629370492D1782B31E61B7C7D97D60B8A7639C139ECA60718DE39948
+CF7CD065143141A68382A5216B148258F3F5893F60A61B2B254667E2248D94941065366D8DB9
+58AFEADD18688956BEAFB544FFA519009A1068F233393A5EC5EECF520C215DFA900B5C9FDC1A
+FA32B04DC1CF5AD1160174B92B4B37ABD24FB09042CA216039A07C2801A2D371E88B91954A5E
+CA4C8E14FE3418DC1283667DB39FFD63049C48884175EFE022CAFB6D66F4E83034BC07B05445
+AC350C7FAAA0BF12616C04CBD23763303E48AD88AC2463F5B37A356826A3260B4437C72ED1B1
+B2A17FF5153CF92BA33726B8278FF5455843E9A28F3C8C9E84B16345A0AD4F426E7974F1822D
+1B2052AC20319938073FB226831300840F5BB9749701D827027F25381587A004CAA75887F4A5
+494F1280CD0D4F8C6CFAF2448D26E6F696972B5481CA6A4151D30F5C448EA2EA06031EA7BB05
+A76943610FAED2F4F57B49A2548558654378FD4313A0C3D2A041B96D6E8661E0473B37EE0AB3
+52A82807C4D9084216796B6D3BC54E03D6CBAF8431060D678382E9B88920B05CAF39E05066E9
+43FD606240DEB4874EC6D19E6F44942ABA51ADEA4D6934730584D680A536144A974599AC09BF
+B72551B119AD8BD2A25148FCBDF34BE65D6DD8F89F37445541DBEE4EE3BC0650F50179B59BD7
+C9DBA5DD352001CEC341EF7D6047C1B2068D40145AEDBEC32F6C6A1FE4ED0A25FB5461BC42DD
+17F2BE59ECAADC316C450F0136D271E984C839E39159AB2F013CDF15522780ED5470B0018D83
+CD7C90512C46D322D311FA7BFD605911F39EDEF74A7A494CBE9DEE04E39B625A75213CFE0CC0
+B462758A57C5566E9D2A71EBE08CBE836DDF79FF7FC727283FDBBA5A51B07588642966451079
+4F0A61FB808813BD689F6724A4C65F6A818FE1DCC2F69ABE0952C8E054AF6A5CA2B247BD2577
+6367081C6920E68D2DBC2DD974B823970F2993127011E472E7FBA207F90D846DF12780657697
+1D90BF19506902D1D97539198C1CD6EBF06CFB76B65C003FBE92E21A6FAD23961903835B22E2
+EF25E089B65C4B51B4B84AC7E4B4130CFDC80C17A4AD9EF5A57C352C8510780FE85F611616C8
+6C7CF255F971057F5AE64FF44F4050A88D4FE2C3DE8F51FB6A7B0B6C82308E727F328AE8B113
+C215645ECD06ECB9A9DE93343DE35D34815CFD2E6DA5473072EEEAD1EBEE6269D8FD0083A61C
+991ED90C36A92BD0EE59C093CA6EBD3D1FA2FEC126EBEA9C4B357A3586D81BEFCE526936285D
+AA0F4291DEB3940F054D48B3933EF2FB4AB670536707630A7A76ED7AB474D55FAD0726003AA3
+2E90B8797A2277CE372A29D88D530E4646163DEB2EEE92742F5CFFC0F403472E274CA8B639EE
+83C795852CCF1FF52CCC8A1109C1860D9FFACC6716103DCAAEDE6E36436669FD3F3985FC7118
+B586737FF8316ECF28800A56004532595BA43BE407246D638D8B9A57FCCD0A76597A0828463D
+FD4E8C0FE4FE565DDBA0E1ACEEA61F91D2DDEC3435F9ADBC4474955609B2A7F7475362C5E10A
+D0462397C80973D7088F302E757E4D2807C916B6538139709462D8DC9E84FDAA5C1D16BC1A53
+570DE99E44E01065C3242550540C5D5BCA406F01010E7FBF97806A2363F2B08D46775B8CD4A7
+76A099A68FC88D2341AEE2D22F95EAFEF7B52AC0FFF65857B5777A39C4A81E6F2E27F6690D00
+19CD0C2B783BD9CF13302CB962693E25FE01F7374EB44DFFF9E28562CC43DB03EE4EB661AFCE
+0E6D80210DF2FB20AB4C8BC8857F2E5120BD0083B767918C2682F60D2C4A63C38E2CF25F715E
+FE6E277B6BDBC41696B98954A585E2A8F904F3D08B5084FAD3BAF063A89FCE77AAF580EA83B9
+01943E2542B346BAE4650BD3F2F3899917E5DCD2673CD10190429EFE9FD3D1EEA3A93093A4B0
+17429EFCC642AE08831F3646E942F4B76AB7DA87B6A587700BA876E2F5B780805FBD19154348
+2EA64F4DFEE3F0D2D047BB3FAE1FAB26BE9F87417EBBAD579158658B92FA83759091584E18C9
+77FDC79DA34965CE862EFFEA96C26023213799D805196DFE78739ECF223C86B949AAC0F4E1D9
+7A0CDC60B6ECC895B0BAE4F7D9834A3DBE6E1FEF85487E4342A2337E86BD0B737BF3C6ECBC3C
+80446FB8CAFDDAF3CA13F90191E543B98D1399C1ED24D2FE3E7A39425472B3F2BB97BBBDAA00
+4FC6A9DB3D35812480B384497C38F69301802EE3D121C2FE40B360AC864573E2E45037D80D6D
+9C3526A21F493298E4E1F112DD5E8DC6A08D9258887F2AD7C1934C7BC4B6219EA701266FCFDA
+D8A1D7827448743BD83B8640E6694A6BB2E01349C88A3039D83CAFCB924B98FBFA9BFA099E66
+FFFD23E8DC9DA36EE9FA89747784E05A5B8D08B3023A9BBD7E0C04FF1EA95BEAB77A5FA6BA02
+518255D996515E62915E7C42B1B992D2FC67FCADAED1C1D6837A58D525516BDC78310820D628
+18F371B15F04D6090CF5F36B1DBF9C7AD10ADF738106FAFE5C7A06863F15A681439729F6722E
+30DA3A32DCD8AF595EB31DBC735AB2E8487267098C2B3B83D21D57A1704C25DBC470D172E9C7
+B28102061884FA0F38EA6182C9012A8CC39AE9012EAA63624A51319C17D9C09C3DC15E6DDDCD
+6C7A8B1B2AC08F608BE6E3AEC6568C79C58E71E57CDA4E25985A4A72ADDC3D41D40EBD40D7F9
+168F18781A6A03899DCC6CD5AB2C9242527BF3601E8A4BCDBC63780D4802990D1EB1014340E9
+97AFD6476C579100BCC99B00CCEBF41113E0C3B4EB8F85BA97598F4D5942F4C62FFA2D3C8646
+79C25338F277B701BE5C3E3257925E8A72851BC97055187358BAE3BAD9A65ADF81CB32625661
+DCD8A547A8F6F4AD756ECE1D0D2A349D0702E2FCF17378FEB07F44CA59E412A15F9966DE1046
+DD5179C8973D0A42BD5BEC79E3C635A41628B3702CCA57354FBE633EF184A9F1660D3D024A23
+B5A8D79CD23158CAA168BCB0E07C12133299A0FA15E676D68D008ACF381B734D65076029E4EA
+806F92A5F36DE33A9D6848EF0D85332BA22C5C52E91867643E209E699123AC1D4358F0668BC8
+6F85F7CAC552B596597CC2D43B7CFA607640B8B0015056FEE45B5950200A824B6C61B30AB0D9
+5906C37ABF3556B758A56CD4EDB12E843769AE2D8E9719221F30E6B06F3DD79A882D439356A0
+0D5446FDDF0F0E23F0583F0F88E774EA188488710BBF7A848D611F971D7C5A95E7440C6B2FE4
+9501A1388C74ED5D2F3B80449609F93B5FFE807D16CA203747A6B9E96AF1136EF0076BAC1339
+0483739E7ABEF21E3B942E6D4734D2B8299A3BD788E0894C6EA378F6A5E782379819DD893633
+02812980CC1E47C7FA5470D329FC193964E6CFB1A1178048E6ACCD3B3F39AFA90CE3FEFF3326
+9A2832BE7ED41592B2A3A90171A0D9FDC641336AE2721B31FD79CEFD743BE20FD83FB58EF9B3
+FE805A617E560A71746AF6BAE90F05097F31F7B96CA56AF8A8C817F81D3B196EDE7E076DF690
+8DA6568BEA0154C23AE54F755ECE53E4C8F9E26D888DE6A5BC241C4BB5F1587DF8BD221E863B
+BAD66227A9E06FB6835B0CA3D7BFF80F0113A884DA4E6D6E098D0036535544A8E8555FA1D014
+16E1593924D44109B225E16F282719C72E4DC6A19247DB399B7600A5680480C4B411365D514E
+6E46FDE41B9F894D4FC5CC5DA7A9A642FEA73EA6045BE210D689C58A83D3700A6DF289363328
+826C7DBBC7FB3CE1DA812240E05483732D2FAB98674AA7113464CBACDC59A3B5E9A0C2CBD4A4
+1C1E266B347A41EA0FFEF3477CAE8089E3EF6C01051D58AC674E44D8CCE007DFF912C0C45448
+B35C52870C5C2458FF311B8F716BEE42ED37D2F2839FA23C38E2E92479CFEFB00A6E6C53D4F6
+6DA37FDDE196268438231721C9E8D743A72EE424B16C3013D2A0CB4758CA065739C3C4D311B1
+5F89F98A4E194AE14D1E7535B46078D63BD95EF83B9AA3A960DB731ED51832665121AF8B6783
+35BB39E508A98AEB67CB2F87233EA3DFAF267E8351826F46F2B81E4D95FDAF9729444D1900DC
+3B3B735390792CB162E642EA9FD91ABD1E4E7BED0C6176E821D23C3FE4ACC286F63EA52CEF57
+3F216A200F883C9BE4D19A2078B20E861FDAE32156EC31329A138E7E0A03E7A28A01AAE9122B
+BDC82DC9811B84305E56AD33DA22DF415E31A8B3E8477F052BAD568C7F0894C2D90E8949D5E2
+4F0F9C203087F9CF287CE99145069BB4C855F2C869975DAD97F34F487B9558B887B065BEAA87
+38E7B6A1A27C92F0B87EAA53B16E398D3D818A3320104C492291894F01CE14E1B1F57D05FE2C
+33D0A4D00D79143199DA0D95083B46D73F5350DAADD36EDADE81F9C30751E1E64955ACB42B46
+A8D6FFC479332918FBE9B5F047D0B89272793481BED567342305362F3483C7B491486612DA78
+74087C905BD038A581EC8CD39F0DA181D5630FF194A9BEE594C43EEB9E74AAD77A1A790199DE
+A30F0D3FF5B0DE50A7425C369CE9D74F9D54955E0A140CF3503A5423D3BBC0883D69B9993339
+88BCB16E4F3854AD183E0AB890A2315EA8CA65B70B02B10DF834ADF308ADC2459D6C41B7A459
+4D1DA21573E2BD3DF0F716AC4CE9FE16D1FD476AABEA494C93FE7E7F96052D252680C2C001D5
+EB51573159DFEB11A6626BE92A289AD1BDBB17EAE55FEBB54B5D9A1906BC7A8BB2039DE79451
+4437F4FA9542F51319F598DA5257407EAB9D24BA7EF4E5F81DEFCBFDC0275AA592295C2C24E2
+DF7E98FFDF6C4636C972AA41C8C7E6E284277154DBFC0442CA1325234CE8287CEC5F1FD248AB
+B393230D32E2F7F5662D6874E89A0909AF1E0077D1514B7C18F39143F6CE976BD3BFA9EF250D
+42310B904D1D9610CAB2E8D5AEE0177B17E7091339C623DDE1BDD2AE2714FD8638F41901A661
+1EDF5D8B95E56AAA68F7E14433552CC31D749E1B9BCFCE02BF293F58A3391F261E359C8D936B
+8F4BFC142824852D9F6BF379B1855297F4BF7D84681DCD03841F5E2DC0ADDCFDB21A339B8832
+2419D0EC53876DCDCE8C30E02BD150DD9A6A4ED843BA23E9C4794ACA4CF37A5FCD47906FE1A0
+53A603596DD71584BAFDC45D503938C3B85F9EB00AAEF8B5FED6A5FDE9D0254D25C10006BC0E
+F6A314B182721B65C5C5EB3DFB5B1E6DCD6F825BAA0A853A1E0D9A1E852AD5F65DA9B8BC9F7D
+E8275FE831FBED6D844FF2FB275666B245C35420318FED864D9F71D3D2B515013791CEA3F42F
+26642E27780328854E0CCE6BDB7C2CF0DBE2045639CEB613F61F2D4C90F92DA8C382317AE730
+827DF4DF717969A5C812CF4D6073E23319E0872BD8C2949A8173578769892897BE8B8FEB2C12
+908DBF6BBB732AA6437CF17E7F90E6D7BA1B96863FA14DF7F32B1F6D3A420EA985E413C6131E
+E41BB4D5A9380358D98B4C02A615F676282C2F6064CF9D9F6DEB0DE86E8441BE51F79BFCED27
+FE8D0290BC1152C9EF556A3EE87A350135BC12171A9EA44BECE5C6A2AE2561B048B39F00F237
+7DF174C149C1EC8596394820129B440CFE77711F09A057AC2AC20E5D809A021607FE6A5C2B06
+51C064150507EA3C1E478CDA29AC8BCE3E865AF8A087E22A838758595517A54F81F0F7F48865
+F3289ACB2932EA522C31A07FA500D1D301741D6A332716A62487692114172F8C5C90DF2B12C6
+5265D749064AA622D770C2AA28C73BD1AB014AA595CEC6BF956C9B5849079E142D167BE75083
+BC3EA6609298181B2F6371E361951704A138CF8394D8B71831A2526A6A99018CD072BB612CEB
+A4268FC3E3754CED0EA078701DD92F816BBCA82F934C500F8157AD022D40DB1C4046E2133DEE
+61ECA7CBAF8116D28AC63D8C37A504369C0F1B6CCBC62F56762E929A505A95FC266CF7F059DB
+B9DC95BD0BB1F5503D87CD6479F45643E089E4DB1642FA6A2EC2010742EFE30D8E7F94EA384C
+79D63F9D49A24F40B01D54BFC8A0E238FB5DB0DF14E7415D1084E263A9A49988814FEFEEE6C7
+519DA6CB268894D90C81F6B1219034258622C57AAD352EB60CBC2A8D98EF37D64BF6BA5F4429
+E1B00CE058D9D0D474D1BF36223B9B8F994E37361AA27DE6BB20F57849BC6F60C566ACD8C44F
+835221C265EB8B3C66BF7E0EDE3157F4377AAF1788EC552EC0A6C3CBD8005EA67B5A738348BC
+768C189EEBC3E6B3EF2A90DE4187BF7A174B797A8B8625167741D8957D8DC2D614C0E6BD8CED
+33DEEB4699CD0A1B8E6FEEC5E996FEC1E425259F1350E1D7A5F9D343AE35F2CFD383A7C3BC54
+DA5A2690D5421894DC35C4C0883C11E03E4CDC523E5324B4ACB5DFA52B390E8ED4E531670EF4
+25F90D9BA57A02248D5B33B4C37C328B8CF52E5AADE45D4D66341D91B5F82DC05EA3021716A2
+14EE6CF291B19FE3FC25E08500A07D71724D79204810EA5BA3DFC692400BAE33C7A4A9962CDF
+67D927806BEE92B3136D21FF1620115E6E25A9ADB965DF1F1DD168B01166D39027A3529727E3
+49D1F0BA6E7C4AA487C21989A03CE6D09E694701AD1E69DF254B00E573D1D6E32ED214131141
+86F02477C8A118135297FDB0C9337673FFB814190EB1FF67A00BD3CC92B850A418AF44AA34C0
+568C1A9A564CA282E0CB010CD5A52B9659C60F5BBFB662BD76D14A97BA9BFEB6E2F40AE6A606
+984404D85FF63F50ED159DFFE43F68A73997B01429E67551AD29224C597882E42BA75C1F6A4A
+5D0B843F27A7A7F9CFDA5C5669BFB7962AC7E5D27D1C30CA91D3675FC9FA1141351D3173BBA3
+1EE09A9DE9DE7E4695A99D08343327A4D83653108F15E97181DDC094CF1FE5F3E1F419BB3E10
+159F26601C064D1DED234C2BF715508DDA811A4E5C129B60B96A4DC425B3B110FA8895EA4A98
+B498EDE217A266309AC9A909A6C6483EBFB86A52C5A3C028C60261AE4292BC88A7C0DA597D66
+0D6814C5A14F443BDC00EE62DE358C0AB9813C92702EE5DEA381ADF64DCB49B43964F9E439CC
+FA715DEC27D4E82FADC36DB66977B69C3D8004F9986A576B01879B0C9BCECEB68A3524D00B6E
+44137E237C4EDAE716D624EB1980B47CFD5FFF5917F84E55FAEE2E4E93B4AA265D29400A070A
+1949D86904F5135D9FB5AC520E0BCC73AE8E0DB5F3C48ECCC0F152F3E9E8881767A27BFDC918
+C0C01662D8A5EC26AB0D185D47F23C9D02EF93F79CDCD770C91EEC48EB423D9C9D7557DB8D59
+C35859B77ACD91FFB89A5019B37787B87CB177E264CC619AD3482C39BD3EF83D3496C6B8FC58
+6DD3F0EC2F910C5A921E5D22ACFB5D5CAAB5964F0DE51D476842AF189E08E175C3B58C08B223
+0BA354201423446541F947A3FCC27911358035EFCEDDB5EC4A4D29D782BAFAB229D72FF342AE
+750BFF16407E789D37EE80EB444C22624D8D71A7A3C10B2962381C8508F55C26FBFED43261A0
+B1E92B616342D002518E51D5F038F92E08622743876058F3343EDFBC93979FC638FDF2C373FC
+994D8B49C0D95754BBED8D48FBD7614B7D52C7ADEB25BFB2BF827860DB1535C42BB316C62C75
+8410037751C4E599FCC43D90A2EAC565AD99CCBC88BAC080F9DF4A4BC503A62CD37FC7BA6F05
+F8EDD58768A568EA4ED2439CF2F0D12DACC48279FD3EFABD90099DA6F74A35F2E9114D5C711F
+B61F5AA75547451893C35C1C535B995F8AFF970F9A611AB453753A646803322246CA3B47B84F
+6D7839796B1A0F8254D5C1CE2566A66F6412E6DF0999F962E097190E7FE3BA9522327373FCAC
+C9AE21D9FCE76597BC92980C524DC31358AD4E1DE3E12E03D018C09A82F1D275EEF46FDFC777
+0330258767D71171ABEF53F1125C7B7E466E60E00A4FF424404BEACDB2B5C2A755810D6C9B78
+6DD9F94F88E5E3BA2326869EB7D29D06AD9AA0FD59E1D3DF4C1DAEED4A94103F95058B1CB16E
+617604BDE89FE4548E266529E5D3CB9D08501031EE1A997B5F1253B835D5B8242A6D3C349213
+DE942849D1526E6DECC90BBCFD6A95592C08B289BAF34C4064D3285A2C98F43C327CCA935642
+F3B9A7E8414227C94D544BB8D8BC9A970B284E8D5C930735EF0CCD3F7A5B0224833E41AF4910
+148D72535D9CCAC8E93FCF64BAD0D163898FFBCA39A10EE67129C22A6D4E6E1D3EB9661FCDBC
+9A11AE4EF5C02E444578C45E234C564A3BA9B81EAFD51470E48B67BE3ABAAA9F9D6E9487C63D
+6DD6BA144FD998CE7132D6ECC42E482E7D4E44A8D7DCB1FEF0FC23C426B962B8DDF0AEDF9F8D
+1C2C790608728B5FD93EF5577D7528292C27CE1F0C7AA27D21C335DBAF702A54964569FC51BA
+20A861FB9928DC06BD291B547CCC47CCF235DE6CD0DAA1E7E9C46224BF3480CB751968DDA538
+DE3B82D03C076E65B37A6B5F930722116AC75CFF6D36A642F4ADD7203C3860500577415D958C
+659037822ACDB3A4F2E533756766C5EE438402E8BE3E924740B8F306B663A6E5EF833B24F29E
+55B75C35C3F64A7E74F6E42FE4DBABF2F53FAC79B8A61ECCEFA44AE2C0AB542D60295D44199F
+A6EDB248FB53E648CBB74C6218FEBDC8CDA5F598332562860B7A8B12DF5641E8496960B458FA
+95278F4AEF2638EA0BA6DE9C1B798AAE25DC2576DC3834AE952ECE14D1234D4FF0920B749CB0
+401971E1557F853F7575C3702730EB3B5C4BD5FB77014C572B71FD43E733C1E9467A870EACF4
+BAD4DEC1EB6AD8F6D88315BE37801979C394905AC63B41EE932282C2625482F27A254A86BA19
+9694BA6201D27F07E4CA005180C41A6620C8F3684EAF7C9C0DED950DC2C4AC69A34B5F38EBB8
+7D81DABB1A2061245BFDE2C3CBAB7B29A33C98E3C432129937BE8E0A5E3CDB9AB2128949C3F0
+084227187EDBD2B141FA41F7DF894C060C7578C80EAC6CD40A0C01EAB1E1D4633993D81F689B
+F1C738E3ACFF9A25CB2CD014359D3B7BD1CFD37F7FD4F6031C616058A4096675862BFDCAF08C
+EC55BC6AB97ADF592EE0433B226CD05A4E1AD282845FCE9F264AC1DF0D7C402B817C661C17DF
+526F9936437BC3B5F697464E45472D4475EB81E237E4D2280C79007B1F48A57D412A9189739D
+15E17A47E87C71F44A72AD3CEBD71211A0ED9D39423292C4BFF73DC7422CB144156A917B294E
+0F35EDC982794DB07468BEA15BD35B87AD793961A3416FF0D7939CF7672C7225702EF33F9106
+A7B492906A37F893988F40B284C36DB4F93D77B935D52A7A483718AFF059AA552FDF03E0A53E
+F22CB337CE05EF412589A7A78C58770AEA783152294240F460AE995509C6852A9012D04967E6
+0998550D6BF7FE84144E1064ED51B2DFC15AD14ABEBCF0157D087E18579A8B2F043A6D6E8555
+9448E8749102916F1F53225E0B9B06E09B404171D189867E7698695317B6C962E6218D1CF232
+4D8F4A6EAD6340479875EF925801D54EE8C49F8635607598D3BEB85FDC0CA8209297EC5F6253
+81616854CDA8D475842527C9A20872C29A2FC56B34C31F88A858BF26D6DB73824F6838553AEB
+B217FDCC844E5043BF98629397A7B1F749CD60EDDB5C0F1792D4574D7EBFB9F01F2380D633C9
+D7FF1A2D1903A8B482FC619D541A8911EEA3FF09A7FA97299CC79876F2A743D84B1623D52072
+B6320521F72FC1DE2C548B64CD501ECF5CF6124D0278C7748C8B8DFEA6A18521B7A53CE36295
+35EFC3685ED63D8045734D4B322A5779F55EE392F28001DE9545A5EB5F4F7B1A19BE06F3995B
+FADF948FF4455E8E2FCEC4BFA508BDCD51E25BDA9F88804858D81F298BE5CBE3D6B0AA583976
+BB0AC1B5E4E8D55B277D6F29C2546A1595EAE20DA9B8B35A5FE34787A86824696F8FD3CBBCAF
+B5E3599A814974FA9D80F281F9A23EC96D5298CE0F414B7602345A8617DFCE7DC119B1E325FA
+9469D541E9DC498773508A91BC23AE03DE9DB59E0DC28624B2274998761FA619F477DF4A9E1A
+1C1E5324AAF8EB99C14A2C59CA9DB9A4607F20C1FEFF5DBAEFB047DBA7886FAB905760232192
+3107979341F7844BCE789F30248DEE479E8140BB09D60B42F2A08A1B54BE40F5E0E9E1C68AAB
+1DE74E35A0BBF0876B9BC5B8183D85D5EE863FEF27E3FD71920C95BD5EE7F5709F596B201676
+72DDE74BF4E1C6CDDFF2EE4AE8F36C9E0BDC53D3E2EEB15D04397BDCBB25324061A58D53B2E8
+5103660995162634D5A222394A9C570D2FF281B7EFF8C14211139901206CB895AF44200389D5
+9D1C3D938FE531F71252B95B670EBED077D5659F6FB1BB84D235D05252D21A370E9A3A158E96
+EDF99B77F3C4FA3C08210C1987244A54D18BCF381E58AC3AC02B11785AD69A05C8CF5E89C70E
+BD24F2C944C4E19BA5E43AC6C8BA6C6556B69C96CD52C5E604E2068137197E99FE0F1AB0DBB2
+4F8A2D1A342DABD89192C6839C2CBF1E01E2E36C97B0D61B85F1F9C6367802B96D58DF7773FE
+9A0C42FDDEEC97EDF29A5568462FD776D755C7DF1512BF230CE6F15564F4E455B3550BF725F6
+89166DBF60C90E24D4AD529EAA72BE204A1F98CAB1E45908C84D8DA9B0E23F6204CBEBF909AC
+FC879F5B301FB411690E011E5057ADAC58D6DC048F1BCE4BFFBD829F18C20C16B16C47C35898
+2428C3B25B67388D6950B547B9CB82BF3314823B1DC3B2232D9C785E4FF128BD00E3F26D1E7E
+190D6AE4E5C0141C2E1786224F031A72C2FA8CBF8745914E5950F4D9FB8457F20958E7CEE270
+676D9014BAE1CAEE077D30774ECE94925AEF9FB3634BD4E39514207662AF1FB6448E119A79DD
+8B43EC4606ABBFB0B0DEF39A2233976ADFA1F272D80F514A99F6432F0CF6992A6C236983F776
+7896D400C8AC039B53EA93EBDF7A765037CA8E20A69D7FA3D2926B171C074D8BB0E364DF2473
+6AE2BCF179045253031EFE3BDEB1C6E4ED6CAEF38BB34498223FA4642FA46F8ECA80F7E13B54
+BFEDC3B3F1EE0871B114E40744E1F31EC0693C543D9DE61BC3082A94BE4EF9244E9DC0C65304
+AE1FA2692A9EB88E25DD693FD84132569E3945C8134A7D1D0CD4E562C956E814314C8F22F799
+301B6C190952CFA517C37F84C680F630311781BE5E91F020AF3B3136E977FE8E1F97EFDECB01
+428C018FA849883858FB365D884D57557675B32A3CC401C03D0A41B74F93E2B0679E1911C685
+AF35C3B14C76DE9CD7BBD04AF592311C4F810B841D9412B5063C73E1C2C91F6A95A85F98EDC3
+14D78D2984CAFAE86FA86F72C9D383358219CCF36175A1E513BCD9CB936B75D6854433950BF1
+E5724D4220983EFC2CF1D79798985027F5ABEC97EA5F2A2D50300447FBE18AEDDE6D6E2DDDD5
+AE4655F30DE791C419501B854923A92F88808CD4107F7361CFE596C175A157BF31128658C833
+980C8FC4005E6CDC8B0CEADCB9CBC9BD585DC49206E86C3B106B33B6A3738D0A0BA784993BE7
+8B75FCA432E922663E82D42BDD4BE9A6F0636DF5613F51A2F89488829B541AA7EFBD1653AB1B
+F1C5B5051CE67C174BC369A8042491A1E3BC2DECC4ED7CA291FB2086E20D504DC78170ADBAA7
+544FF9681AE30059BD21D3D328DF9B7010A2B366472CF5B064C8AB9170A1AE0F7A612C44B783
+058728BF1BD0479B636C4BEFE06990AFCC62A4425C9F91355C78B7735F237FEFA74E48C40FFE
+F4C909D459635D87F88B67A2A9EFA2095352460987B5A6CA428EC955A6DEC3108A7E4B91C6D5
+2614EB8F1F01A01D6AD543A86042EF27E3C00155C29DE8EB76C6CEEEA7097B29714689185282
+41C7D81815A200AF39A9D86DC477E87486829A62EE7AB9138F8F8B64FB19D21E76A022CF1668
+91D8CC781868CC37A391785F038CBEECDA4095435C6DAB40E42617DC9D0A17D91B307FFE4196
+DF8F7BC92DB2865983B52F0E1A64F64098CD60E7A144224D9E6B80DD4EB66700462FF11050E8
+A0A6C9698C44283F2E68945538642C7C8EC682536D4C65A048FC0637FF1F6B03A0F94DA79C61
+211BD2F9C6C7CDE624AB5F78C5A8C6E40774CB53C0A81A8A7288B052AF2BB74E5D913E215E17
+35856492BC789081CAE603DABBDBC6CD8F56A7A89CC914D8740BFA185D4C6032C43E15DFD5C5
+38F3FE3EF5AD36937E1AA07ADF3EA87E1E2ECC7C15A2F5A9DFD8F3B4DE9E4306501CB4656B5F
+3D9E6CAA3967187252CF963DD7074B30E9BADB4E42D259625962B6FC150CBD025D7A9EC866BE
+C20DE620C7D01787E00E2E49461BD4D8E12E4A6BC1EB6E5FD2708C152254E1039F90275C6E7F
+46BE2D42FD4CFD5027E3907F61F850EA230622A9989BC5E2F92FA8009F87B1B9FCB5995069AD
+CE83756E367F1AD20622A0E6EA4CB775B14DC576A4074DC1E01A107AC7C87B63EA486890C10F
+E05C773B8677C71C2C9C7CA7E5AE138C2B11CCC91201D8B22FB8F25BE8A79C1CA04A99C6813F
+BC39F99198E44F0A42EA33EF8B0F5B88D70B0045C2DBCD4915483017AF7AD898A608715A1D7E
+150A4D2D8695612B4F3D139AACCECF79F819A2056436033E16F9FC2436CFDA4B7E99E6217C9B
+293F4CC67406B47056197A798988EE4EF3B6CE7F35B574FA2518A1583A50E19FBFD41E2CBF0A
+4951374DA1F553F41BDC651DED65AB24A880379407C66E260D9C98FC30D8DCF9F4AF8DDEA6D3
+A4F5BB220C66BB32CFCB0D9FE9B9EBDD9AB32F9289464BDC3569E729D0EE2566858A84EED82A
+40572B1E8D2AE65742428BC5C41DD72A4BD0688D8318945AD5CA5784BCE347F9A4F341883C5E
+781D324FF340FF95BDC946C3A55A265DE9F3A6278676A88B3F62DECE46A692D33AC49FA3063C
+B0DB6C81D64E9C113981AD38AADB5240B98211528D0F362AD1AB9A7587CD3D348A795790A5DB
+EFA17E2D4921DFA43E90CD44F2AD0B83EB5E41E8544B8272B037FA9FC1725E01D83B481BEAB5
+667A1E08B17DF2E3488B2C7CA155196EF732CC90A032946DB6D39BC502F0EF6DB915FA6797EF
+02BCA90D8D1F03C823EF129E3DE5A12DBE44FE2105F9804FB1A0C21637F8DE84F65F3BF274EC
+7D0FC692990C9FCC9E172C3A36155044917AD29A0F8D9923952C46FE6DEB49DD47874411A535
+0C7491F061B7DD7B036283393E4029F69C61BC1BAB2ECD3812309D317956324103CC7129D48C
+68BED918710FE54BBE0A03ECF05B3CA5644534F4E2AAB97CEA6FAA4E02FA64038C9C3D6A5844
+163AC6EFE6E74F172E20A60AEF628AB330775E9C5368042441846E04218E5D50833BCEF97A3B
+7A684150C477058386CDB38E97CC69341C4CD65A34AA6474B68D1F9EBAD39D1497D947D60410
+6344497996466F6829A6B552D02AE86A3D0C4E4A6B5B1FC6894D084277414A651D55B2F64ED5
+453B79C7B8002E08EE7C90506FF0E228757AE1D867D5607A33762310339CCCCE83B94758A568
+1F0136B2E44069BBDEAB9F4109EAAB1D34F841AC8FBCCFAA8658EBE39FFEAE9F6A0416EB21D5
+FB6E0B1984685C856C495DB7F00D6E350B5CB0B30307373CF059035C5B1E685B70CCFEDDA1F3
+BC419EE6A0BEC775DABBC2DF0DABE325FB53A157D256D322CA83B238401DA6396FB1EEFA7677
+18D7FF4227E1B78059D36605C5FC808D812F50C26CDA09FD7E96C954CCDC2BC0246AA1217E6B
+0E25F936F81B8B1C83CE5C35746A45D0850BEC183A19AB7EE8367DE8D7E73821CFF8CFE14847
+FD3E2F4C10A651D6B5A4590D2F714F0B1AC3DC2A2A4A7BF7FEC48F7AA101AE7E91764707EDB5
+5FDDCCEFF905049EFF296CF57A77D34F2AB83F1605F302F0835257A5C372C3DE764DA1676F87
+84844DE9142496B77AEE1AE8481EF91213CE9E082987B12BFADFAEDCD68A6F6C99D6EAEBE69E
+C910670C441B95B57482DED68901216A39366CC5CB919409F7756DD89435DC6C391946EF1825
+2B6AD08EE9E11742AE82D8247BE76591712433A113FAC72AD53E421E6CD7A8E6F2BF629A2F25
+043BDFF7D65B6459751B7E3442EAA089FF0E3176F657BC532FDA7E366F11CE0F6291BE1CD5E8
+CA7A69F8AEE14BDD7BA6F88FC4D03C1ABD81D5C5F97E72D75232363BDDB5EC6FFBCD01974CD4
+F7A87053D6A4C0D0B1C8325484454E38867EB5F8716BE0137CC4B534575A73E47545ACE34AC2
+FFCE1D63FD7FB915D01DAC93CC736608A59405904D13ED0580308C2FFF4249CD08E1FAFD4FE3
+0A5F9D9E1806AA2A83247FE3AD85BFB9B3D8B8D84728C8B12C9222E03964D4A1454DF1F22D1C
+B90907E322A9E98ECD35A187C15928B958611B003A8D17AE5C4547A0653C71B59A7C31070684
+ABAA4D73BDA1499F8974DD5AD817A66275D0924B774CC3D8631DBD0384621577C060A53CD5DA
+584DB1D7D81C5EC043DABF544A8E02F864231A4362677891951097C1B8B588EA2DE0CFC3C24C
+2439D2CFE01FACC9E51851148055CA179D8C1AD577E30897D1AAB893066002855C0407B52364
+5E26C507CB6E79E7B2177E6865BA553F3780632BC940B4FBF4AF42DEBF19AB4A428CBAD3B447
+BE9D3B13EF2A26D744E10BE4555B7CD391A4B611B9201E32DAF7989818D450DA1021C2495E13
+15BBBA479D5EF60C7DDE4381FEB865F6B5B4A2CD9E145DFDFFBD13C4A324658A66AF82AC3A1E
+27294BC9546E82C45C61EFB62C26DD37C602CA0934445346A3F108778E132ABD1B4FCEC53852
+4B339FC63AFB1F8D83255F07A64B8FDDC15F1200A30548596CC105F2C5B7B5C4A5B285BF66C3
+563C02F0B3D4EC9A0FD3FA57440AB641C584979ED157BD371D24021F2A979519B0DF0158ADF3
+B916C340D9BB22CE505379E7CF366040D74C5F0FEA3DEEEFF2CD1C808635974EADAB5B8E950C
+A6A3B83BA87CF95F04796EE86A8C67E0ADF28C06BDBE2CB528DFD7BBD47DBAC6A1AB95FAD052
+F6CD776061B8A3AC464636F2FEC1DF36930C19AACCEC189B9C228065AF875B589A40BA3E28C9
+5D0D6FE624BC22EFFDD2652CE72DB5E8C5BBBCA4C6ED4F2780DAF48A0C58B61F3102AB965A00
+A501C6AAC98318722FCDC2E6FCE39B9125B55735277F621197F6FFDB580A48DE17303466C2B9
+98068544701BA8FC875422C1180DF65484E766E44CBA078D9DF765814ED7C9545A798FE0C764
+387BC6C363D40A3C489C63AEBEF3A62B7E0D106077CD1872C188234C707F9FE1A1B6C31C4293
+DD443B232339CD27184C6B8A5A0ECF951574FB5BD3C1F5A6249407716D7E3E45134E83A1AD19
+59E11296C06F66EBD23D8A46C477D7AEAFA6D4EB7C8EEA69A0DB8F4D845B2531CC0E4FA72607
+9FDB7B0A788D85FCC395BFB7B47DEF3BECFCC2D18C627D53138904F178C82C3088F799AAB458
+4224CD1600C7EF95926E53FDC76EC57E7ECA2210BF07FF2D3A2248FE4BA1E31E3B9DDC2F1E4E
+B87231994680DD061E4D52E96E8307212B2AEEC3DE4DD85E809FB5D5726F139514FCA4F3440D
+EEDF0D101DBB423BC2AD80F0123FDFC9753D58C853D8BEBAA4FF8137A8D2E9AFC141F8BC7A4A
+B4467C6D5E1B93474B5D02A19403F9725C05B63964B9C3D112F1A48BD6E63A2CB322047EE327
+07C144E62A78312CA028961DD27F344CA54AD3743C0808A87A887DA00B3B7A660BCB17230BB6
+BA1F5EBE625656F7472CF6F77371BD7205BD4E0BF22E139120C2EEE4C4E0C221E57EE978C6B8
+42EB13F21BBA55AB71B3B0CCE5C23351FD987CF244AC7CCFB5CF006845511FD854699C97BAC6
+60920B83FAA85DDCBE5A29047625E68A2DAE3EA9F088A5884554EB62B83E6932CB73BEF50AC5
+17AFA52AE2A32B1F35E16361364AD88BA85716C4AA66B73A3EFFA10067D71BA36BC99DCB57B8
+C561E6F494BF5FCA4DEE2802DDE0E692BED8A42C67646FF1AF4E0BC8E6BEC1F5997CC62EB64C
+CE5308AEA7AA6966B9811292ED53D5736A462681786908F1EAEA6B1193909CBDD479E317459E
+8820D3C8850A8884F0009979D77988FF91532C892BAA67FF881B8275B3272D575E276EA88999
+E3ECD720FB1EBC7FF9983B6C496A74AEF1EAF953B07F34878FD9E461F9D7362FA8386A51B0C9
+D36E315523899B8331E3DF397CBCE9ADA4DF5D71A4778D0D1BA4FFEF8798DD925D73622788A2
+95C43C76C0EAA296AD1A54A9DEF7869BBA0EC0A8BB0C8A0450391A0B7DDB999A9068EB80FB15
+B151E0C933B9BBA9511D1B4BA0F47903AC446BD29A1849142C436C6A39AC61AC9197C1BD8609
+4375763511A8A8A6CF7A9ABB0C704944860425A470DE1C7A739DECA2E64CF00341CC14874643
+2D66B1EBBF4E631DF7F882F21F0447387C2B3C51B5FB920A8EB62A4D07587535F325314DFA50
+1B9136FD7A500DCFFD3FB2C9186D9ED33A0A793ACE82D3F05FE1E18363752672E770AA45DF41
+B03FB2D29BE147AE632762B47F2DF1F518C1FD73371CA142FF8662373F84C89356430ED36DCD
+E40B3ADB90EB5184EED0CAE5C900354FF80CD0F976019F1236AE3C2E6E0F204B8D1FA1422283
+1CF7F78C7C8E28512725F72704F2F554FD0F4E0CBCDA1234B0219324D201FA3564B43302B2FF
+D59D2620617DB165D549F03B12C985289A5DCC2E4B70293851EF92CCC37E28643A5105419B79
+9F504C93D49D0AA4C45261BE75A27332D9CA6FDF2F38782535ED3D238C1E6FC9A6B53B233163
+6AF26399615D14898A2EDA89D154D48AAB01016AA8F2AFE708F963D68B5E5873B2BCB6D4DDAE
+9312462C9743CBD157BEC711503D1A845FFF80E66D486AFABA82CEB83425E30CACD2F7D57C06
+76687E5EC92317DFBF135D0C7396F31D89A59CDFDC70D84C30C812261863D8C252991E4A82F6
+0329D3D26247D2FE9CD0E0F65E529E51D790AF11A2DA6C730FF5C979817C575821B36F09C6BD
+62DE5AEA290D3058199BA825CF372030C7AF1C50D9E754CB62BA72AA0BB5A8FDAD62249FD6CA
+56BBB0DC6E6F4AE13DEAC1A90F571C2FBD76EF3371E0E695B30ACF2725621A07F4062AA1E0DB
+05D506206B7DEAC5D808CF20465BC6D6E8592A73E575E89BBC10E7C3BA47229CEEE0E33EE116
+1CEAF97F02B11E4C9CC3EF97A1837BD268DBD1BCA96D50725F7B6FD0C97753E4AD0F30CCE87B
+58563B56134B1487912C1F661F0143E511B79B421D971F206577470C2FFC20DA1C685C3570B1
+D3A25508D30285E18B1B7970723F21E9D12301A56BD705AF16B50A9C062063AFC59AA0BCD5A9
+2AB44DCAD2F7C6C0FE7DA1F2D2C1F046F2155912B68E29CD5D26DDB18CF8714C32E837F8A9B7
+C08B9CB2298A455EB76B304A0E353CFBCFC4B1BA813581163AC75F32C82A172E6511CDB63B70
+B0FB517FE17CA9E882B0CD6BF298CF5DB0D38D352747470D7552891326F36448A366CC211C78
+C422C2DF3D6BAF3CE7AC159BBB2C57B5C73E977900E5A7B771C7B4443A13A8DD053471743089
+633EFB0477AB4D8D3469FC6D0A09386C156F61E36BA48A7577D293C4749A95E84CC5DD6CDC8E
+C26CC20A3EA60D333ACFE753A062E7C7804F2FB47EDDC77A5F71BBDA052B24E1E57B596DF2F4
+B69919E49C85494AB86CA6B26371A390E9613F934595C992424BAC3046487D147918FA63EA94
+47E7A9E1D2C53A08DAA94AE9622E6CC141F4A42B097C032FA06C77302571E4AF30FCE9565488
+92ABEA291F247D8CD41BFFD083F86820532551E0E903A44CB2F9B2E7E8FE3176C2BE19C9C598
+4C6768BEFA3EDEEC27115C5288B240EA7352C7A9E7550A26A9C547B8685649CA92CA1EE0020E
+4D36E762818850549EC44C53389D13DBCBA527A10CEEB96893A4B6B68A65F572C7011A220C8F
+CE27F347015AF112AA16B0EC87EACCFA6EAA2783E2D9FC43BC50E9F1D5431F79480538E39466
+706B6E3F1603B0F6B68BB268432C6D5A9050697B02AC9A5526D42CA9769BFC44EFE6B1B12179
+D0FA9E5A75326ACD1872623FAB0B93615747A744914BFA4E43DC0FC568F72F20C9550188FD14
+8F98058C5FDAC50A5226633B996E02E7F1A7F917802988BA2C17C179E82B2BABADC20AF66F7F
+0B94FF768C8D72CC961FEC862A79FD06F876773E376AEBBDC6C178C2C547FB2AC692FC733D1B
+5F9B95EAEB46757B56B05515AD1F21BC0D78921907D52E1C37D6AAA406BFA4B64EFB224F46D2
+D4A1CF47D04D61E29A583089EB10DDFABDF1FA6063DA81B32523240C74B842C776472D8DC516
+1D8F20A32BF4C0BF2B5F71931CFA5794B1F8DAD28DB72C7EF9268E78154A0E50949C5C5B5D1E
+6E7D126254C9E55C30B11B03F08777CA8B9689F21A693A562B07CDE3149200BA779A2FBE0CE8
+1F6057763C675811736F8B4B294B47989A59E83F9167BB51B8713764FD5C03AF20E358D93B58
+AE17FCD4EAF54FAA7108C2EB7521EBBE698040475D8BA02C6C780359192EAD0CC8030506A6F1
+2F6ACA11572EE888EC8F58D51ACA84C70D7FDA4A274F2DA86E78C0C174F51F75F9B41090B305
+FBD2B50FA873343C197C51DE70DB2BD1BDF7646F7B16CD84229DBD1AAC771145EFE04DD4033E
+48815677216D5272BFDF16B4B4439EEDACF9EC033A7C42C4542163F687A16021DDB157CCC0EB
+A523B2A930F2F39CF779D88246E82D33FC362829CEA6FB87B1F140E5EABEF7C5D337AA61B663
+E29EE6E44238361F7AC3FB9EDDDA2702C3E198429ABEA143F986551A8E9797A135B173503C49
+3155BCE1A190C3E602F7837E8F812D665214251B5CCB620A2F6A8E4922984B90531112184D0E
+4440F540C7CE6391A97D554B6A59AF64B20B3659B0AE40C9AA11462C2AF9BDE0453BB1B1433F
+4742F9FE7A43374656C26712A06F8C5C30B1703E9347B7A7D3C8B5091E9D6F84BD7F9695C05C
+A07CCD5CF6B5CFC3B3EFE4DB96557390E4CADB3E02FF94F8095C627B3BB82863318C094A1A73
+B7AC3CB452EF8A3DE05398B2F933041E2D70F0F496C53610463D775F657AEDEDD02F8DABB3F7
+98EB5D523A5943FB01B8B49A200B452201B18DD7D3E7BAA9A9ABE65AEC2B4DC2F0A6575862A9
+E274E24CC1EC831666B3250CA0B5236BAD0AFFF1B9929C072BDF6065A431D072E8958B6FADEA
+5642A3C81DA519F4828415D2C46CD6E0637F30778EECD0137976113BC696EA95B695705C612B
+B6D1C7505996B90EC79B632635170EC88FD7114FACA380EDCCE32615183C119215A8446A82D5
+406307DEC78855989A35C0C8698F78D45CBC54D0033CC913A7C948917A96F6E9FDF19834228E
+9DD8063ED4AD5047FDFE31F1CDCF8762D0D698CEE8847A0FF6564189C34F7E0447BFD4B11021
+2695344968B0E87FDFF4B0DB373F64F545D9BB1FBC476A23806F4C1B157F1BDCAF58E0BCC06A
+F5C798794107719AF22F3DFD66E43BFE62A4A348FF8B3D6E47B9C7FCD3C5F0907B5F5E7C23EE
+5B16C13F60D342F83C69834B4A5AE6B2B1B6685648CFEE2B5DAAFF2D1FADEB8D7F742EB92851
+364905D67F9815689AA216F7A9F78CDD09E095E7F66A6CBAF4256292694D4B3B916EC50C90BC
+B1DB7ADAF7495905695093A4AEBE10127CEAC9CDCFB8AD25EC54002B75BFEEC3843B5FAEF8B6
+9774AB021B9C995C0E3A0757466E238B51A78B64A9BAEE86DA0EFBE7B760283752F70C002775
+704340A4C809258E3F4F98B307BAA9DBE506C97B86BB990FE0963D9C806072C19DFE2B536A3C
+3172231AB36F8300C10E5FD4684C8F4BF3BD0B1C5B4104F6496763BAC8E4CC0DFDADB6A2AC76
+CCFE76DD63453C2C3CBB4C0F2288149CDF6BE48FE00BD3BBD4F6D5A8B434CE03709BF0CAA5D6
+43DEB9A6BAA4DF8D7D401B55A5B6EB26E8F6022D9A0A12F50F8E490EE101C6866D701F5FA78A
+5AB55717DFE81B209329D0DA1C335C543CE4BF312FAEED08D352F917CA73C226A84F744A26D2
+AB3152CFC1D53B51F0EC015823DF6372589E034FEB59059091F0369254AEA04DAF54567420A1
+15DA04C4B3A77BEA7FD427C6CDDFEE7A6BFABB0E438AC0287BA9B57F717BE28E7169DD2846C9
+5AAF022027D21B98666439A8FE4CBDEDC2D9EAEEC6BF91104679B1D0F9D7A2D11E1F2FA54502
+416087344766AA8D98D1C515F4DDCCEEB10615182941A2C0C7FCC13D0304E88F06E8A05413E2
+3C1C1F2512262C96B961D62191E06515EDACA27862EBEF4F36532F26AA2D6968EF78873F0271
+341678FE22ABA72730E25557F4B3F9FC55BFC5980FCCDA31042C8B7F997DA7282A78F7F5A79E
+739719828501EFFF232E41CC5C9C1D9FBAD0001D4A7470ACB35913B2B4F6A3D241E730834D41
+AB414A33B436DE4A9501EEB7EA624D7A58714650826AB3E9F3C388D225801A9C45EBF5FF665A
+6A4C5C6F71245C68BB7E74EB19CEDC87E75814278C4EDD9FF33A1304D8BBED0BA260473F0A3A
+E23504A9361C6A937A47C75B47A8B17F083B41E99D277AB9C5D91E8D063C718CD5E5ADC18CDA
+DF71EB36B87F1AF8577C0345CA12391416289EC82C73B157A56C51E7D8CF605976AD33929CEE
+46E85756CB9B921ACBBB2FAFE07494D28DB32E863010E8326B219183F6DA25EB9FC5F496E9A2
+B2ED5DD61CCCC016197F0DD7F971700F390EEB8B3E9A07C316B6D7073AEA97807893A47654D7
+B3E02E6FC70E3AC40197E34BAF005551BD9B2DBD9046F397C5CDACDE08DD85CC5CCB19FC3207
+B14F76A86E7DEE680A1890AD48E6604208BA6F867C38A2A74615881109F4F06624A5FF7B02FD
+2A09528C536457D4EE4A99DBF96211CDDD97580BA75F7994010D78E1CB43EC11339419CFF724
+EA3C40777DDEDABFBEB4802D1AA9AB1663BE52772B76351D447199CBBF970C56C31688057C79
+A5D108E30D6C78DFCA12DBC1966D5D1D41E09E6973D0FD105D95EBEBE8D4C545137F9CBDAA5E
+3143A97E91FF9BB75A78167143A6B358ED9A5C056C1CC7FBFEF737240F40CA72058761D87369
+9087F40BF3938BCF50CF122F3C3D555AE6E36EEB87DAB57F5A1F4E9CD966E955D1466AC396B2
+F8A82E6B6CE6344A61A8EEF08CFCB977D91B1C2E09D1C67A378A7DA370D5AEE40B71FAB8F738
+8501E08DDECDDD5F2A43A1EB7EA247F46A4525F13D13C3291DC461DF62DFA8538A0E9A2BD87F
+048CD2A058B650765961D568F19F74296085181FFA41CF050A3AC357DADC31C34984ED3769A7
+15BDA194C58FD37AF944B5F935B49B691FDA22D7428FF725407232A427D4F30639AFA098FC19
+8496316DD24200E5045E700FC885D25B861D89C4F27D4A93B86D3F6B3854B85246EA89465F88
+722179BA1DD334D1DBF4E19BD5D4AA856944A0E9273F687B2663FAE810E365CA2149ECCD29D2
+48ABC3E57CAF00A384C90D4C9577CBB44485327D2E26B2D0E6BF61CE785255BA6C7C83D19802
+72732906D6DA7114D153FBC1B44D63C39DBE83A41D61C0C1E348E38B39CC45D22092E8258CA1
+D6A89153758CAFC9BA9857E45A29101DC5A58BE4B0EBFCA41906441DB0D3D096B8ABCF645BDA
+51F0CBA1E5BA59B579206B31535D88391BF6C08C5EEE6EF1BBDA4632BF6B75FFBCADD448F325
+235582366FF2D76D73CCA5E48682DC9FEAD610B8905C976E9A2EDADE192DCEEE1025169FE851
+7062FBF291958A9CEEA0BC8F95070467176D7FBC3027C9EDEA74BEABC62DE394597CBE3F220A
+24A19C8D3F405C86D230468A7294C2DDCDD255FA385D8899176C307497764986F55E2237F541
+069AF9AB2752EEDA044396C7786B36261207BA72602BF35F6107F115A1C60BD34A26BEDFC7DF
+97A38A2B80EF7E3BFD4AB140E084EE334CA900C65F21613435AD9CA2174E6D4D2EC2573A1C2F
+A183E7BB545C3580303938F8A9348CE96655A9FD7BF0DD6A687547DA34969798702B2B8E9955
+284661158A6C6E011A44BC4297FF2A2F470B5771EF0BFA46D67D651FB3772403E60AE45EE5E3
+0F2F30A7D8484EAD07931162335F2D92DA304D3C0EA38E8D32DADEE763AD28D8281E9A718B87
+AAA86D81ACC475D9C42CAE230384029C2BDB571D444E4CC68E5843D8EC2C9977896ACC0D8CB1
+D2AF3AE65152FACB62A9FF32A87356D139520E636924C175C86D07BA567CA2BEB66B96ABC1D9
+93A11814DBEAB6D84CDBDE777AB53FA791AC1F60FB729056D1BA26F45834D3D4D5D774B53465
+ABA2FD8439825B513239B1B4D6E51DE568B92F6B6DFA6A89C37DF1A7EDB827A841B0E38A8B4D
+45DAFA6AD4B9DFEBE2F8C740478F6E2C3F54C08FCBAD2C4542F0B4BC443FDEFB1D5A5E8BF4A5
+51A8939D25564F95240862E01A09D2891095190BE462AD624783E0D8D9D0E6F492D4C9B07D52
+89BB4A6BE7AAA167EA06CCA47EB831DBCAE0853517CBEDBE1FBAFAAB9680F3BF8131831E33DF
+A15A12480097B6575560939F89D78DEDD26EF40436DEE6055A1A3D77FB3B9EF39BC32DFB17E8
+68AEB0855176DC9EB9A141C0A873C7BE8682337D27CC4AAE733D616736CACE23F51BFE90C8F2
+0959BAFC60C6C46B186AEAEA5FC98F485E5C95FEFB0A0B1F1D6653E313220633C7ED770A1257
+B7C7248F6D0C0DD22F561FED72F6E2CFD16890C834F31E9C904836E3B97AD5957C6AD6B2EC7D
+B0905E41B98D282BC91A65B7C288E2C0BD0ABDBC35D3F2A14FBC73FF968C9E3473884F6C0ACC
+C31ADFC12AABE3BA92E4276B3C24E799114024F0F396F03869D0E44CD911A70180636AB93198
+E1983147149F1FA8EA468CFD0E823EBAD565556681D8C6B8625920A31115BD30EDEE0C734465
+9F88E4B949F0D00A05BAC6587BF923FC7F17899646F6B65B213D6FF08A2CC87A96E4D3A3A3A3
+405F6F86F4CDA1B055113E349A0CDBEFB157E1C35BFB8F1005C22F505DE84570D6D7EA574BC8
+06958EAC6FEF2C8589F1463589EE7972814CB7F4223958E5E508095B5A6707190B097DAD8A9E
+BB453D684F09987B5E75E1D047158B689EAFF75F9A72B1DDFC66253D2BD1CAB845D4D2E8B65E
+5FF0794D1DFE77464FEB11D3D77440E3E1E5EBDBBFFBCD6838D064177F9B8D1BA22E6469FD21
+A1C1A91714613DC2EF82C45B44BBA387DA4D761775AEFAB879281AE54989DB796FAED62FD27F
+A6DF55AFC8C73264E9230CABDC16DE9C9848D3A247BEF7015B5BACDC368D3E3D796FA1A1E168
+FBDF6D0FBF666080353456AC0372F17B8D77047EABC19B7BA5A3E26C755089F39EBEF880173F
+6F6044A4A31CF673EA7E0F5067CFA8136D78DB48705014CB8B1902F7D2BECB717B3340A9CE92
+3D39B4E7FC0CA95DF3BDD3EE05EEDB2490770CACB8F4F2E0B760C3FF30F9D2BB6A79DDF583D1
+C60CDB33118DD5BC4A11334692F9D706BD2255C52B55BFEC1AAB2E8B48E8C1CCE26538F26EB5
+6178A414D405F1B89732DF3017DC5F7749B468F81AB66034B3695D99F53444539D46E4420791
+9EB3691F57F555C14E7C9B55E3545FEBC07FD249D2BF67F2593E2F30395E38717EA8C063C828
+B7E65D9DF179DEA28D1E02401839AD83CDB6FB0A135638A71600B98F1867CF47BAF8BF8A6C9A
+977B409F4F043DE3C0831692CB0C04C0539568F20EF557A37E46D7DBE830004491CD0AC259CC
+429015D02ABC6789A1407300D11E29A1809373FE555B903177245AAA311C7059EA646B86F3C8
+B70C955E01F686E137F44B8DBA52A210879CA657C20F4626588E48F4A363AED9EB4ECE9582CD
+091C631495446AA54218090A953DD8917097F837BA8F22A404CB69497A7D0F3A76AEE6F58DB4
+7FF53146F6190A4D754145EE0F4629F1047E501B5057A55A710C3E41612C2E5E35BF5FAEDFDC
+3BE60608F93463162BBB71079A23F9E2728874AB92D727D2E6A432500CCC17B8ECE590172860
+E907611D45DC9D9220BB50D6C57746C318D05CE76B28CB82F496CCD2B6876C99830423FF2D60
+EA55EF0CF1C1BD6157CB3CD7F7BB068F367A82C72EF41987D44CF8F7913A86978BC5D0E6CBB7
+0CFD920CDB1E1B050573C0381F60BCE21CB05374E9D8E6EB5ED262925148D51BB2946A5077C9
+998919A73AE1F555AC01BCB5E16923C7123C263075DFC8ECCCC1DA2503E4B9EFF3F3740DB3A9
+FB0F91C859DDA523AE111FB96DF1DEFC71AA58B235BD3FA4B033347B1743ED3FB616620A11A2
+5D4BD3334E4ADC37D203363085B69BAB7E7C013F5DEF3CF039ADB4FE7DF0495A59B876C699CC
+E15507728B6E1BEC86B7A282475E4DDD64562D9F9416B6D65015228F97AB484C5890CFE75534
+BC8B9E8A8292F35511D9918C75173DC18E442F550B4D96078251369165F9F8D2D48AFCADB789
+E4A31B0F3B968B0AF1A6CAAC8B8B6DF595CEBD49AEE1523B36394826DFDACD6128524A9F9BE4
+1218632066BCB8CF66340D0E58EF8E56AD98B4C831013A2BF04D80117E0F808523FE84FB6477
+8AF15900947F7DBACA3F58FC21DD32E5DC45560259051228861DC37CADFA2FC95126DA83460C
+C1EE0F0BFC6ACEEEAD52889DD8DCA769569359FE60B2CC54C606E2BBCFF44A19E4569B0B1CAA
+EB8D9E16D84E290158F05A324C1757198A5FCC357DB62686DABBD405715005AD3AC09C302B27
+15201C631B9E117F0680BE9DEC4E82B2E3E3958ACCCC711EB822F41D3F0745F7276A24DB692D
+2D756D98367F6933ABDBB1F42FDE946C3BC05D38A5F3410D8AF8A8D97DC10C0400EF7DB4B7D8
+2005E5128F3BD630BF87A61CFCCCF672986BCAA38E5C21F37EFF5E51B44D808EDD1F7CAD5B9D
+D489864DA69AB8A750FCA8DF57281F172449C8EB751C0EC0967FBA8833B859C7297C651908B6
+4A54ECB364669A30961B281690A93BBE7261E597FD2C029DADB936A827462C5B9F4F87BB04A8
+9FB5FE4D09551FA5E7125BB84D9C81C8CDCCC359F143F7000718CAE19C8DD102BE3BCB8DAA3B
+9236D65BC2281FE6B8875D91FF181D898CB45F05737D3A8997AD2BBC4B8FAB9840CBB1E3468A
+E75B31BC82B9267A18698DB54C3051855B401F34C190A802E4046F570310837375DD1C38FA56
+B93E5970E4E09720CC70C0B398B93758184A08B7A6ABE65086526427B2342B7BD310C3B07A84
+B68EA64D3C14BB65C601EA9E09ED1662DFBABDA7CF057F4AB1AE1DCA9191F45D5560C0E58D94
+9F94488CB4A7B17BF1A11A557F5F17B12F3B859694F5410707A7DFE40EC1843CE0C73C29448D
+85E83B36301C1915C1BC7AF83C879DDED6A134649D65B4C4691B7FEC655D9CC4442E01585D37
+711407718C89056FA05746807F39A532088D3B85028FD49192C18EE9E6A8699F86D0FB9771C5
+13C36CDACF2FBDBFE512E4FB9E28803360FAB296082069BA0CFBE64C2E17080A4B247E2FD9C8
+CA0437F2127118B9B5D7B20DE8DCFE547E0C5CD258B807BC88C582946E2281EC46A4C5374A08
+ED4A5CCBA2EB839753E41BD876A6FA2ED5D0B8D8C2D115C22A12CB7974C593FCC54F187500F7
+68A43BA8564479C35530E9F17A627AC79001BC7578F881488265EAA856A122AFA210128D481E
+CD0F0574530DF3072914466B976902D0040C4BFCAA95B43F7B058916DB442875F3D55A5F01B2
+CF27A124A37485EAC42F374018EE9D66A5435FCF8BB7965BF913F68A5D7E064E1ED0D88A80D1
+6084ADFE1BCC86507162DDC40652FFC3BF3B08B129EDE22E486C439EF9A7ED2C270B897A73ED
+1FDB54F567DAEF8739F1AF612CCEA5B4D57D0C3AE9CAC9158C0C99CC148D1FC35665D905FC78
+8E169478B51F86BBF3DC6692FF66AF663E37519E8C3121BB2FD5EE1856B826CF16DBE9F3C773
+21A59C6AAD62CD1C00F95B74B18C08D85A6D62C1B075C054AD55F26B9DFB0916E9D4AB856BF3
+042DA4F7B2E3F97210C28DA4908B538A218CDFC48FFE56CFC087A463AEBCDBA3F42F20F58D03
+0D3CA874F53B2C25A8701C19733E89FE3A81AFB85A1B5721066320DA64B1D56E4B7AD4C6EF53
+FD39CB97475AB8C6654E418CBFEA8946C18B84E68512C88844BFB2E81EF23E2CDB9887FDB1A9
+7A060000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMMI7
+%!PS-AdobeFont-1.1: CMMI7 1.100
+%%CreationDate: 1996 Jul 23 07:53:53
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI7) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI7 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /alpha put
+dup 175 /beta put
+dup 176 /gamma put
+dup 177 /delta put
+dup 178 /epsilon1 put
+dup 179 /zeta put
+dup 180 /eta put
+dup 181 /theta put
+dup 182 /iota put
+dup 183 /kappa put
+dup 184 /lambda put
+dup 185 /mu put
+dup 186 /nu put
+dup 187 /xi put
+dup 188 /pi put
+dup 189 /rho put
+dup 190 /sigma put
+dup 191 /tau put
+dup 192 /upsilon put
+dup 193 /phi put
+dup 194 /chi put
+dup 195 /psi put
+dup 196 /tie put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /alpha put
+dup 12 /beta put
+dup 13 /gamma put
+dup 14 /delta put
+dup 15 /epsilon1 put
+dup 16 /zeta put
+dup 17 /eta put
+dup 18 /theta put
+dup 19 /iota put
+dup 20 /kappa put
+dup 21 /lambda put
+dup 22 /mu put
+dup 23 /nu put
+dup 24 /xi put
+dup 25 /pi put
+dup 26 /rho put
+dup 27 /sigma put
+dup 28 /tau put
+dup 29 /upsilon put
+dup 30 /phi put
+dup 31 /chi put
+dup 32 /psi put
+dup 33 /omega put
+dup 34 /epsilon put
+dup 35 /theta1 put
+dup 36 /pi1 put
+dup 37 /rho1 put
+dup 38 /sigma1 put
+dup 39 /phi1 put
+dup 40 /arrowlefttophalf put
+dup 41 /arrowleftbothalf put
+dup 42 /arrowrighttophalf put
+dup 43 /arrowrightbothalf put
+dup 44 /arrowhookleft put
+dup 45 /arrowhookright put
+dup 46 /triangleright put
+dup 47 /triangleleft put
+dup 48 /zerooldstyle put
+dup 49 /oneoldstyle put
+dup 50 /twooldstyle put
+dup 51 /threeoldstyle put
+dup 52 /fouroldstyle put
+dup 53 /fiveoldstyle put
+dup 54 /sixoldstyle put
+dup 55 /sevenoldstyle put
+dup 56 /eightoldstyle put
+dup 57 /nineoldstyle put
+dup 58 /period put
+dup 59 /comma put
+dup 60 /less put
+dup 61 /slash put
+dup 62 /greater put
+dup 63 /star put
+dup 64 /partialdiff put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /flat put
+dup 92 /natural put
+dup 93 /sharp put
+dup 94 /slurbelow put
+dup 95 /slurabove put
+dup 96 /lscript put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /dotlessi put
+dup 124 /dotlessj put
+dup 125 /weierstrass put
+dup 126 /vector put
+dup 127 /tie put
+dup 128 /psi put
+dup 160 /space put
+readonly def
+/FontBBox{0 -250 1171 750}readonly def
+/UniqueID 5087382 def
+currentdict end
+currentfile eexec
+
+80347982AB3942D930E069A70D0D48311D725E830D1C76FBA12E12486E989C9874C2B527F092
+5722787027F44470D484262C360CDFDDDF3657533A57BB16F73048BFBBFCB73A650484015441
+FDC837ADD94AC8FBD2022E3EC8F115D4B4BB7B7F15388F22CC6198EFE768BD9FCEB3446EE4A8
+DC27D6CD152485384EF5F59381FFDA43F2D20C8FB08AA27AB2015B774DB10DACFDCD33E60F17
+8C461553146AB427BDD7DA12534BA078AD3D780414930F01BDAAE649990604A33AA9EAFFBE5B
+5489E5C7C9FF9D9BE01B08220832C41CAAC64816B53BBC087AE4B621D2B44B21AE5E3F7FE4DD
+B05C675ABFE30510EEE4A7C874BB57B2FFE521A6875EDDFDFD18C78125BFCA5A097AAD361DD9
+4DF46F14026C25EA988194899B95001209CB7009CEAD4B4EA03473EA120E7A7E341D4E392679
+6347FDB3A124C29660AC09F4648B313CB58E824884382F24CE08D2EDC686923ACACE1201C16A
+07A42803288CD0B946F7546510E95B1FA1CC96F0BF72AA823D8E83D7C68C752C82A54C752EED
+2B1E699DE9DB1830272FFBF2F4996CCC2D6FE2AE272798989525EF3B67B0D09BFFCEF749A805
+E5F76578222B9C4A8A09B13189A16AB746DDEF7875F1ECF83E568F493D82FF729BAA1E0834DB
+EC30A35D3C49C9B10C5E1D90C6E3C8FB737DF5CEB3299D960FB79632F91F257753B4D2E34E3F
+54A26C7B950981FB7FE4DEE3315DB63E75B024B4D318BAEC8AAC9CDE186F6D65767DF1DBA351
+24287C2E805BC660A3A227720AE4FA097F1D75107441C0A0FBB9EEC17D5516FA03B98756B7DF
+7AC7EFF9C7A2364B9F691ED5CB692DFFF9DD80C761E9C4D5D6061782B327302C053CE1CD09BA
+0605EBF761CF9B730524E1994E7DFAA956799D522EC53D5ACBA27A35C4D28279617771938ECE
+58C5AB664AA00C1BC4EFBA2D15504247A68E3AF0F9BD59A12AC1D8764421DFEF5DFA13FBEE58
+F5ECD4DEEB4CDA9FE9483C229AB29460B05559B035C73D6B88F6A384DE0E2DFAE4B1886F91E5
+22D800B0AD40EAE57F680490FEA4A2EDA9F8F57AEA1A4315674BE45989C2293362DFBD0B5D90
+A523A7B79DE04D6F7B9FFA9F9FF2F2F7A1645E6B6E199C88C8430208A7DF1F8F8839769A44B3
+922B18294062582DFB8EB65D087635F1B602EFBD5AA1D63676616822AC40947E58D449F32261
+43EFD388F810DB12077F5CBBD8D6CFEE0AD3EF2426BDD29BC2CFF5EF597390C78AE61291499B
+076F95738E231EF838D1B7A8B67849CF0841EED6D31BFBCADA8BA9AE383F9C003F51EDA24EF1
+EFEEC12CFDC7162781419BB65E62E3F68C7DB49F83D77ACB20C133BB4DA5194910855BFAB3BE
+B389D848D0C802AAE7856679DF31113FE859B64128FD104AE04F652EF18E8B3860E444BA0BC0
+5DCC11227E2E578543477D34BD8EDD99F20E36A868A7B327AFDA18A903CD24C4DBE23FF7EF75
+3527360098A9C4F73D5AAF334CD804BEBEB6BE1E24CD7840E6B3CE1724887746E4B8BD8ED0AC
+5A6B573CED9C408B10A7BD1E457AE16A401F411F42D2E57E35A2A07B13AF2E091BC8426E30F5
+89B95BAB58F8D5DC2B9E9D34034F16AF06DDFD549660B9144B64406978299C0B964B9688ECDD
+B66D004141F9A3BEB9EF7C418E89545F573C18F43AA2E3200EF93F8286DF556B1C8282349FAC
+4F351B7F3BA92F33095D9786CFB2F66CE46F120B88A6E836866DD0A05A4BE4C611E25D32ECA4
+C1FA3F2BEC2CF153C405C5DC2C9ABA91DD456BFACB2D7025650549E454927FB7F07DC0F215B6
+00CB7090428F4BCB4A495C6501CCF0E0F171D9DBC6C799F3709C8EF3FCAF30567524C2EF71FD
+1ACDB1C804591117ABB9E8F9AB16A19704A1747185680CACB1375902F4ABB547B838B98BD230
+305CD0CA05AF58F40BE1C7854484AEC18A52EDCFC12F893819B94160F128D47378FF286A5342
+2D35A7E7DAB8C164D68AE0F5974940AEC4EC48E725BFAA307E24072CC76C4B0FDD453DDA6178
+FEAAB21B218C02631D1B6414DCC7FE08C805096031078414CB221F826B646FECF3AE2EBEEA3C
+98E76C10F529D4AC720A4CF71D0A3BDE7AFF506E5D4C0DEEB952B7735E91484152B3523FD49E
+D9B495D05F8582F69D3D4BCA0482E5D8CC77658C4D9DF370D7A24A26DAE2A8C7A6BC3521B575
+C3650BFAAE6B5140F5C98CAE76790CBA4D805A5814513553679CB1309A01CB066F8E6AF2B451
+B1C5074B8355D3B84614A8DBC11A56FE2AC39A88E3D604A58BAB849AEB9781D924D0E521DDF4
+499D03D1085A5609E0721A21D513121F07E6EBC0E57815C45C7A525EC3751F5F0118B8F24271
+D42F467E0A994FC9D6024365A117B761E1049E8EF91D3E25A9A9E46898C4AB239D3D6F5AA425
+B03C5752B6554754F4D3240BD2A7A7CA6D3A2C7226935D1FBA7652624EADC4638CF8F61BE95A
+885E653270983BBAB4A774FFADB13B16D527A64B3D083F0B289DE3A7568A53509CEC86CF26EA
+4CA57E9AEB7673D9400F466F2B5D8D4889E82235A3580C84EE00761152DC80147CAD523627DB
+104D48CD2560DDE3C951CF8828D4C9658728DF842AD3495B87522901B0EEB874D3025B66B3C7
+152C7DD8AD7DABDDB48E1CF7A1ABA3AB060EEEEB7963DFD47DEBD1342D5AE8640C0724E32D0A
+B2A849AC822D94A0D19E7159B4C47CC9BEF85C10F1E068E722068BEA6EE0ACB161A8188CDF81
+91A2D9328322B0DCB922D87917CB5787965EB171DB8CD153A55429E67AC86C9DAEE90A31CD54
+FD8F04ACB4356B6F09AB70E917A8A9500D916EDFADDCE5884443A7F98CFCAA0FD2899C7BE11F
+62AE8D2F22A10917242A6689C91067EA4C543A40EF28BEBC4A7BBA2E17C541F4CD655146639F
+F67F5A2D79A55172F95C7746B3A61FE1EBB8F78C5AD4A5EFC3166FF4F8223E514F48755F41E2
+4082CBA63A7D0090694CB3D2DEB4E8C2309FF8FDC6BD1AEDD17DEA1AAF4932D26FBAF0EE9402
+A20FCEE267B5AC223C6FEE0AA5357C054815402C7CF9AE808C2E391237A1B2A15A107B43BEFA
+57471427F92EC4ABED182101EC1D04F130FB1BFF36A2A3C2BA6C4184F718CB1DD9E2069050C1
+CA58FEF786ADE0A56CD63CB671B7B9BBBBA6114E6B6CF6A5BFCA204F32AAA3E3FAD926C0B5B2
+17DD5FFE78628D3EEC531D24876778FE60B241C8E7ADBCFBA8FAA66119C7992A393A2EBC9B79
+0702B1519EFC2D0BCC420405340BEF3FBA7C1CF3C3FA5E3435A0CDB6BD0F55BEEA0BC44FF7A5
+7FD0A1101A23D9F7AA41B61DE857737A40B51B5CC1040FFE623B583490830E3A063A75776CB9
+4FB88151644CA3D357CD1123F51FEAE5953E6800CF6F2237036D0E201305DEC392DCC534F9FE
+32D8A2233A4879330449F9258C7928E6382FC11820D5174836F0BE85D2BE4BACC40BD7072A3A
+C18FA136BD08466131A10097C04E1A9B3C174A0353B1A6DF71FA5DF2EF683FB258F528ADD303
+4D069782A349E85B38CA468795D0747ADBA2B53AEEBB0086212103352A6C9FF80B04C8B21B04
+50535C8465D2C1DDE0A494D6D74BBBB2396C4E99DFBC258A2AED6C472436C532BD84F21CB4E7
+8232DD65101AF1779D28ECC5F1A9EF7BE55CB653E495A76F52F696A5A4AE898409BB839CA6CC
+5DA7DB458C5697CAFEEE7A0190F1F624DF24ADB4FEFDA30CC64538BC587CBA897063BE93CF28
+D52C63789281071A96A1F03DAC3F963DE386DF25564B559ACA5630A13E92F31F3AC9B0FC2F9A
+AFE50BF45CB7E371DBAB0B278D813EE22B224B0E4D196A6B5123B270CA8BF5160605B75441B0
+3D1E2599A96A969CDC46C84AA6D4B94736C933BB94110D54E28898D5D852C18C4E2A9F893EA1
+F34F4720BA1F4DA9D653186F5772C62AA8A0B210BF9B97CCFB86C192468C46780D8D5813618F
+2F7B6937A7B2169194709837D7CBD6B7F237C2E106889E18C9B8F38D40A3723D4D53E8DA3CAB
+D136FCDE420380C8CC497248B0CB524AFA387235D306AE8ACF8E3BBB7D1BF0CE7207B5748448
+AA9B09761254458D55660C98607DF8A08755A37905EF8C526D3BB696946F1CA3AAF32F98EE55
+F6F38402CAC8CD83BCE04B1A21ECD92D7769C0D0AC9CFF0B1104467D9C76673ECA72C3EF1B09
+09D63EBA2D97657200008AD9D8276ED370D36CF17424CB75E2988AEAA7F6C50720316367B99F
+576061F846C6EE85C8A1EC7ED22FC68DD7E1B99522E836BC05E2C4414B65C9E31921766A4A27
+D4C6332FE5B0464B11142355E17D550D22B4D9E3D7D0DEF2EC84BBC7ABD3A5DB6F6F49A0100E
+20834C749E3C4168CA8AEC82B91598D41C81AE19FCE226C5C88EE3E98D844A373938B7D5A687
+E319058E4D1A52CA431ACC7157898141CC7FC4822B943D836994ACEAC450D54F41FEB4561566
+C08649128C779606EFD07B2C3B6D20674D64F39348391DCD3792D214631FFDA96BCC01E45C23
+9CD6E2BD911709E352A909731049118940F6005941C41827951BA7B38A4E9B10528ABFF2C285
+209F7DECC4FD0CF1C26C5D77D7AD6790E73C67E17DE719788BB65D76FC0F61D0825882570C98
+2981A3CC1604D5FCDCF01C879A75DAD33E1A8450C732130F2544666FF692A2DCA278E717B8EC
+BFB8CBAB26583C8DAF6CEB4F060022CA3C8468CEB05B1634E6DD6ED8F759561219AFBFCF1D8C
+1DDF83D242B0CC3D9659834998D1DF8CBA0D53D562C923A3A956266C1BAD118C4C4578880D34
+A6404074B4662AAC6AF2F4C9C8FF606B195397B15AD308202F29C6185037F21D69E6D81912F8
+3AC57FD1355EC90BEAB3F554029F226D62D5F2E5FA1D9C5B25C60DCE792BE2FF2C0C73B14715
+86CF73D0D8B98F94C1E16DC03042664BEBC5114E260EF1B9319A7AAA1FDFDA71A943FF198E9C
+148DBA217C32061A458063B0BC8F2911C55F7CA3A67C01B834164A286665434F426DB71DFFFE
+23DB26B272270586DDB6CE820A6B04FA8670543AA9438EDF32EE3442F531FADF4915663A3D97
+D02D258BE79FE4634417DA41A4383FFE35C2C2C07DF7210C7B767901E61E385DFF7242AC3692
+D1E779D6C98705EBE246AA0BC17CF8DA99DEE86F7CC7053BB106E357BEAE7C0AD2ADC064FA42
+C43C6EAF3AADF274C06499BBE30C7DBD639DE124F66C61899FFF5926501CFD11D937FA2E3FA3
+2A35B6D655D15081252DA57F0356601E9E359903B2321950DF082BCE3750219EF3F74EA1CAC9
+27EDA9061A282CA1AAE219BA9BCB79C477C8D174BB42DA6C3E7CAECC2448B2E1017AD7487B0B
+80413B2E7EC6DA2FF9EFD0B57A3194D8DA6AE765FD6C1E5362B2AC7B4E26C02FCA754DB2C24E
+824E309FC6C3A0F5AE9C723FCF77061EEA4E12A6D404A52D61DBBD5E64BFD3C392887667BFA5
+229EBBFBDE6A065376D3AB8E48314912061E7940122DDA2D8ADEE2F637389E5F03849C89D275
+903379B0949D679322D20C7716AE258855A25499C0E7F0A1B052B0AB19E1FA6C378771140E59
+F28A013704514620A82B871F2309337C20A87C064338982C7A1F2642D69A95F785034EE7AE11
+CD4A74C949A0B8983796925C8DF349D4B49B7E146FB8EE5B3B23B1173CFFFE2558EB7F89711B
+D270E07B1A61861D88C8E9AFC9DEF32347CCE521B9EFA2006415B31036A049F382306D7730EC
+D3D9D3F62DFBCF80DA2163D2E035E8D8C31D17CDE364EE8E81ED8B30B432960DE8A3EEC96C91
+54457847C5EC4DAF8FA56D6F9D09430505CB8550A0C29D37029AE2BC42958620381C0CAC3BD3
+16BAFD21AE70C5BD9E549B1C2FF7A94C7A23E75CB9B905AFBF0DD06A61EFE5DB5155DDDA0D79
+BB7D2A804FDBD05B318E189382A835A8E819B0E4E9B4BDB0FCA344D82D039F7A16C50F08C18A
+D54A48283CBA7DAED367A8DC96F7410CA0257DB97AD7793E6F93B78B4B09B14021B6BBE2CE10
+5A953C4859B8801D360FCC57258F6FEFF09255E35E60B0466930A6710BA100EE7244CF3BFBC8
+29760D839DF1991D92D7D0DA34A93DA112760ACFF209222B681BA175CD5DF809874DC8A98C7B
+BA686AF0398FD54AD253350DC339ADDCDCBF239695E2DD2694775F33077E6EB7D5A257AB9E3C
+EF0C8B3C135929BD902BE3A8E8852B1655E62FEA58788C754C91C68B65561C6289EC2379EF6D
+D790FDA02BA18FD0451C692478BE003CFB5BD998B0DAC2F73024D157C85C2F5B51A064BB0820
+6E23C852E5D81211FA3BDF714E0CA86E3D1B3CC4C66A42E5C0B1FF5FCAB27AF94A254F38D549
+C0367C820CCF98EAE3FA52C2DD950ABDD6550C2412B4113D9D101E6060DE5E5E68CB882909D0
+2DBCE4F6807779FD42C8A46912DA217ECC4C6EC2887473EAF94F37D7568EDA0AC4AD08518898
+133F5D41640070F7317C6A4317C40AE3B0F69319AEA335C8AD2FDF52416F52D3533BD91A4775
+FA03B671BFD39B54D8139DBB44709A43F25B842362D44F8CC6BE96E456CF57DA2DEF7130BF64
+8AF46DD07231672A2D00D8F5702BF62E3E433C395C3EF99039DAE91B672C7107324E4525E46A
+C12D1FEFA0A884972A009B7164EE40ABCE8385A2EE5B12CE41287D1AA8DE6B2AA14DFF5A75D9
+7445CFCB9FD76F77D7E3971506C84813BF7A50D844DA7B2B7743343DDDDAC10DF8D6D7D05C3E
+25FE99391452A4C5DBBA01A528A9D4DFE0D7F719E462DA00F847CC43C245CEFBB9F139A3AD02
+5B680CC8ED2F6202F6F14E68722EF9B6728609F1EAE3DC10642FB721370A22779F4634E7B242
+34A1E16B339D8745DD7B1666907788BAD4460F1BD54F5E66469305B47C7F01841D3F9F2CB0E0
+C419DB5F4015C2709B293C8BE41E4BD5B0EF4EE0200928A2BE5969BF06E4A465E581F52D3337
+4A239FD72FCEA7B042C338C96CD153AE2B08A34B17CCF8423E8D72314F59E01E57038544038D
+9C66F75A5B647C5CECE9A50CFB704F89E21659034C466EE75D3EBDE216D1B483156E3D017C19
+0A62B0DC71BC36AF006EB820D8BFB5351E31FDC5189906F6318A6516C537A59D6E8D409E0DE0
+B65ED4DD6FD08242771B95EE667BB1C28BB88EB31B9F7CFBC8F7F07700C899F97DCBECEAE2C9
+8932A37CE0B98A66C0C104B2D02DE706E3B65AB49524EED7817260DCA01374D0F39D109DF408
+6E66836E9DCE633197AA137D5366386788145B4E5BB2D927AE3EA9B6272D8E1622C52ACD4BCD
+6236445B6FEA218AB243542F30F3B9E6C2AA2D6DFFD4E31AC0E64F458C22BBE36076F8E07979
+AF576C421C998B51549723132F628CF7CAE98387BABDC26D9C002DF3948704C8E2D1C9349403
+514300F721923D77E666B0BE624BB143ADB96FBAD1E9DD6F26603422AB466962781E7BB6D8C0
+C50760C278A4E34A9DE1529622F6046BA2D6A97EA2570A4CD2FF2EDBE77657C261706B9FF4FD
+51E44F9A33D48C3A0D44BC0D74AF3B401337A522BF51631CB5E51032C54BF20A3A30E0441C8E
+A734EAFE35F779D1596388F6F0D2D5D9E9CB8A17D77AA09E51A72340A0C81C714B1E7C9FE566
+87908C8B6D6473A51973FE65136053A839458D942358C750110006A283F1B2DF4D594384C9F9
+1502ACD2B31D446B1E32FD6018D6E9B7E7C8DCE31DA48D14501A541009A187057568C53AC65F
+03DEA75EC1DAB78C6AECA02E92F70874E622A18787197DF8ABD3A0FD77914C07FCA2126BC875
+AC498046954417D378F3F65B87988940A5F794246CDDF774D5F61AE75E7CC012307CDF469002
+D4DE10D80744628813341292B6AC4E09BA6DEFA1E35B12AF906C6E88756D2F3C71A5BA43C192
+CB83ACE0C0EED73F58D4412A29C637A367FE1134BCE8F0314E08A180FA8EFF635BD95D1FFC32
+2E612A53E553A42DB0F15FD3F18E2AFBAA5C6EF5FCDD21F147D6D27202A403A404E8975BBD51
+53F93D40D2798CA821DC595A357E46D5AD79E8D93E63C8256CED66D3D51F26EDB47639B5EE4D
+9D14B62454702006EA66B7D71430C141A3762CE8A7EC32CF95E3208F71F0A8513A4B40105735
+C3E7B4E1BF87C274ED324CD2298269C1CCB8721828D5DBDE8C1875FBC4971BB6996BB5B26330
+FCEBB91D9C0198175289D863788E98520EE1ECB6617187C5602CE415DE45CE10FF7B5A717D90
+E1F28BE96AC8EE2DCED981F92B65FF2ED70EECD785B19B1E6DCC64CF7D58CCD13EECB4B076C4
+B96B4A00945CAE7976FBFB514E253261AE3FA0135E1F03E9785421F5BD640578933FCFDDC878
+71A9E6BC165950A16C6B04A99382B5F1991CD82069DF6A2F96D664D7FE270816069B8BAD8F12
+366F1D8B5DCAE13C7DE3B67D192084E0B3B55F3EE17DB978E2E026A6E7C1FCE12718F4BD1ABA
+FFBBC6D30A33B9D2B2CB741D7771519D4886345DCFF867C54FE348E07AD817EBB996F937AED8
+04721D91787D4935FE847342D7D40D676C1C7BE4CB2192C1B832FCB27B2054007626E9A055ED
+E0AB360EB5517739E2F756D416C962B8A7B27ED92DE3086A1CD05D5480023565190C50D2F9B2
+587E17EE9DC38742E006452A47DCBCB97FD145DF15F9653699F73A808E454F05879924F2284C
+32C8AB6C92F8C43EA57FE61FC6278E88E7B4B570673824657594EFC71A1E75B99528A3E21BD8
+E91CA28D6581F44BF957F6C76215DB28B0CEF44D8589163D51FB364CBC32BD310EE9916A37FF
+808B53003706FE45287F5DF47713F808DAAE009A7742BFAA871A6017DF5F992D43930FED29BC
+3CBCA69E1BBBB8CDD51B5720984BF1788DCB4E665B880CAA22570DA5557D24E90E0753F7A347
+455FB53CCD5FF9C550752C065E6C4018583E64B41FECD7E07CF3D0DE2D5225184B164E4973F6
+54E53D8E612DE5B5AA61753111C068A5010AE29993C0B067E0463B99E1FE237D3326AF97134E
+2A0492C8B99658D55F37CE1C62D6A6CE8AF7C3AE2F994FF005A30E1CF62A9901F6DB108D8F9A
+CF443FF4CB58C5E2C4394D615A8C3EC9591BCF0F46CD8BBB1F70FD4B64E3ADB8E84675C0C0B5
+748538E47539DE8D02BB30975D994D6B05DC6C28844ED9885E75C82BCD560CFBE660694190F9
+BD00B1BD35D7C25B59B7052BDB507E56ED6CEE98E465E9386F188EB74CD163BC0C0D9406133A
+E37001AFC76A33F3470A12B769C4A319AA846552F5EEF093EB25872F8C549A74A8D3E26FB9A4
+ABD083F8A65A131BFF54DED0813B71EB7C9886C0567D426A380FF44D50BCE0C975DC0AFFC7C1
+38A58A7CA3E4F232A38CC6512D7B1BF6B7264E05E7270D53E21F59C49BF648C0FAE043DA737B
+354C2E92BBA6BB1683CF490178F57B08D638626983D2FDCFA8D114FA6FA28F8A1405C9A41D45
+1E605FDAEDF968F9777454A27302C13B96851DB850DB6A239097716EE06D81BBC644D2BA61D5
+32F3B574EB90B6270E23626D0F3DEAB38486275BE5A9C4D3C7824F015DB1599EFFD4301AE22A
+6799EF9137CBE9601A7EEC49380B315558B701F51A5521584F234B4BB681C7AA7A35DE3CC104
+D1535C4D0C6E6217BDC149278DDB0DC5345F25DAD168913938884F0F2F31CB757FBE1807AA32
+542615C7EACBEF02A3C70B76B657A11B4010316F103AE914780CDB0D68FC2A1B77299881348A
+2FFC7DDE814E33B8950D063A298234DD78858B5CD426CAE70D6BB3C2C2D68779BD65079A562B
+EEF0D0585F10AB144507B191BCC1378D6C39E9F9B8F690C59F13B541AFCA46CFDE1950BB0FB4
+E1C875BC6D4E46885BABE609246ED831FEBF88391741EBC271A3FB1459B2FF188E8154E5B321
+6F8D96EE12D66EE3A7EA92FC7A682C2A8A5CE1AD403972964994A7D875A8E4962B29B4213ADC
+2A4226026441A0A78117CB1694843DAA734BB00F706231339EADFA57163AD47E2904B680390D
+43A03DD66C809516F9E9BFF08FD1356D99906B51CD059A4CC42E000F6E716D6161D7F540B78B
+BFAA9B71F8D063714321457055D7FC5D2D6715F36CBD718843FC8A5BD2681FD78FAC8B2D569B
+1C85324C49ECDB618FAA1D0D4A1ED480B790C8B91F5F41A94BB7D351659AD3C73208011D9815
+ACC432455CA6FDE68617992FFF3ACBF624B115E2706C7B59E1AB14B07AD9CF6E133E96345823
+ACB0DC9E741F6EFE209CB421C88D674106A5152ECDD39E7DD7E364285D303E3B3191A835AC98
+B0085062C1B6F540C70B015E795A699F80BAABF2648916304D88F5CC6B227172B415A76FD97A
+452A20666D041C65D582D8AF60623D39CD56AE8C2FE9248E847AF48ECE5B93B2CCFD44E40363
+7344F1647A71EAE6DD93DB79E63F12F6D54E2F221A6FA3E989FDBB31A08B012B7D086F907F84
+6F7B4DEFD5DD4280A8BF45C0EDE89FA2197ED7FBA823ECF0204DF48D16F68E3EA6816DAFECC2
+0DBFED24D87D215F9E9D47FF9C74A6F4B001A0873F4E8FB1B44F55F88E0039921DAD5F00575E
+FB10C1D5416E4C6CEE87256ECB0144B8295D7750091B7A79477844B10A3121AA89217AA83AB5
+404272772A3FA4018F99F6FCED80130685A59712E423BCDB1FA71BA74C144F05ECB997DAF87C
+2A0E4FE7E89C0F9CA82DADE5EFBFC76F6EB7662B2AFF5C2999979F663594C662F932B8F520BB
+EA0B23EA1918BCD6593DD5AF3ECC2BC8C6A8134D2274553B362E54A3689BE99BE3AE7884CE27
+D4026E0073324485B921AC1B3A0F4E4A043BA747EF458F75D4CCA667B082B167FC09B9157072
+110F3642515E83CF4BEC4380EFACE753795DCC7D8329D1B87673C2D1F1F0D46C3E5196ABAC42
+32A7A526EFDE90DCE45641BA9F0DC547B2E748FC576A663878262A5C25915D9E0E46EBC98A5B
+CBC2383A79D03D03B9F7EEFA1B96181A08B56C620335C5819F877C1B52A1AE83664B21AB566B
+278F3E216686DE8E522BE3BAFA7BD2DC45A2BDB517CAB22789467C683F58F4175A75EF221A26
+04E3CE73FA72986A6B6375A8F086E622B4042D285595295BC95CBCA06A89708F25BB050AE446
+AE814DC984311AA296B4B637515B1BFDB076CBDA94830A04D7415E85648D8B9ACD75DB396171
+D373234034DE22118A612585DFE90207E979BFC630F4C890FCD62C17ED5B05B42FC5F41590F0
+E2719AC55205EB81EFEC0A0319CDBAEB8E593F857E6948BF7261638CD9C21B7937A11B8A1AD9
+D4FE3220C03499438D0E95244C9B1A359DF497A2DAD2ABB1BCD68DE427D503A16D87B1CD1645
+53907FA63B1B5CCEE5E811DAD3D459CDED21997521D566BFB63298030CC53E9D5FDBBA67A042
+49DF56F382D9FB03EB8B40B1DDAFBD21A5E7801B130DF79C2BF3808EB24BDB2FE1A4125E1530
+B4E4B3978FC020E63A210CC0C1026A9E6EA7DF7EB5903908A41B56F170327D7C48FBF64DEDD1
+93427A89C5C9F5C781C00348BFC659D12A8185F6B7BEDE00D8189ED019703054B4B15C454CF7
+15FBD38939E9F7695AD745C1D23BA54F5C3833973D5529F2EAF4AE74ABF9B1ECC83FF48A9096
+5283A5D9C8C697542983EA09118C8FAB68781A477309A59420110F57437A58C51358226524F1
+1D1F3204006BF38208F87977530E4C36F672E58DA728FE388E7F814AE2B3E4A26AA1735EDB14
+525D7F262B8EFECBA8717B59A6DC2F0E36CEC8BC1D7262F1E30C7C5716588538E80638989E24
+ECCDAAF151164DB4364E081A8ABB9031B11074B8F3A44E6301DAC07FE19D958C769D79D2F0EA
+00B9D84FA77B29DA250D16B4D5A3592253C423089F5ABD0CBFECCE1493FA58ED14C6E4AA43ED
+7CCA905B947D1CF8891508F43616207E8E262E3B35EA00DA7341FED19C19374E3236A4E226F3
+201B21AD68E5A0AF6D936F62A10EFBD6583BA422D2F8DD3C90737483EC63167FBA9C0537E342
+B9B5C6DC03627743B7D3ACFF22F1ECD4DEEB1F89A9C3ACDBB26B891647BB16B36F94BAE52D37
+F0DE80F7BE722A3BBDC3BE6389994B5B340E2C5B3DDAA2B99F121B3FBAC51655940550DC8961
+51507FC9BE0D67D6E328D669CD22E0AF20CA846F357A59D681272B27B20F88008F4D8B7DD915
+8F793D05473E75F0302DFF1C0940098094F57EDD1B681548A4C075D0510F1B2B4EC5F058F6FF
+D08F8CD51084E9385802CBE514DBBC015F670B6BD587120ECB173821D4DA64027E6C4572A2F4
+41408F6C8D12FA159ADCF5B821F7E51F3AEC9572D198CBB446B4D57849AA4353E36D298A5803
+65BA8EF4CCA88BE9B6A1058521F568FD4E399193CAF25C5C7FD91E89E30CF7D715B89BC1556A
+64D1E348EC0B3AF17AD16A1BDC34D8FEAE1579A234E29D60F0096FDBBAEAC408A38749F05B33
+FE7D38F2A1E1C59190D57A6D8A53E1FD661D07AB5C9A486EFF8E4E3085A0DD5E5FDD9DFBE19C
+E102556E147E40F28F00A892099C985E6BC49B5ABE8819EC5FEBF2F51C832D4A573D42C60441
+42D2EE269F4E9D00AF2738BE1DD308DAFD8C64ABADAC79A528B6D0503F4BE90DC7790CCA4254
+8F6C0C8153F35609B24879B0E4E3D53204F70635BE2AEA09B036F9E8D66C9CE34C0A253770DA
+BF992CD0BC8279A7D539A92E41DCFFBB6E82D48F1550B7B4E110A2B3F2430AF3A497AF89EDDE
+9D78F3223C2628C6542260F9D209D7B14DB949864A097109C2DD030BEB71D26259CFD522E3D9
+0167C07BE5FA624758CE4F6DD2F9BB05168443CB519696BB16F9F0177F63E309CD75E160E2F4
+60926409D732403C9712A2815A8D53205DFCF1EBD0CB482907813A793DEE8870950F1A2450D7
+606E5723F258CD34DF9ECD540B508E368204B46D39D4555F284ADA22FA5C7C9287DFCDA89B13
+96B0F0883C5DCB3A7380F304D08F1177AD30F9DF1C91AF24B826394322DD114F90D154A11B3C
+0F9FEF7A51A7BBC056087CCE66E8A8CB29A3ED832D26AA06CF54E85AB63AF744DC1FBDFDAF20
+77A90F0AC6C4FF9AC47669428BFF213FB8622BBBCD892E268066CDC314491DE3686E7D588928
+02B0524121D17FE77090F443EBE624A9293D2D2A74667FDA7ED2F387FA8E13418A30A01E9847
+79BF72E1D621B34075283A8F8AE7592C87CAC8617493D0743CAED9C4C060EC7C1D88523B4CE6
+ADE8962B2F2DD1E82FEA8CE611FFF799F264A013C918460EAF914D5F850DBEBB4588D7C8B968
+134DAE1A27FE61CF03717808E2D5540BC3B223925EB49F303498D212E9C7A019E53C914B29EF
+1B43FE3A076D9BE60FB2C6A8DDDC9D6FD12CFD21DE244B29CD672F1CA62B23275E192BF26781
+6228FAFFB7CBB4EA0F93B8D4A1E07534AB638AA0383C44375FB6A22ADE028DCADDC3AAC01BAD
+A612EF3E8F5DE6004E98611B434E44746596D4CB43F0383A4034110FE43BFEB0A5DE7E1EA7F2
+32BD4DDB54BC3787D4C91D07D67B0AC954BFA577E3E4268D576AC9D33FD0FD4D3AC2A51C5BAD
+0668D90D133E4A3E46176B082D51658F91F89EF3E66B165B1417C397F0BF48E6CB6FB1A4B012
+1217810933D7D075D1F35E2845B5C13398B3F0E6A966944FF39C939272F727DDD57767340E58
+663808AD9F02BE01A31D6B539FF8173AA32229DF1566969F3F0382AA4F226BC2A860BB0665FB
+72A1C0999011A954465B22D6955A38C73897E164A6D5630885986D0C7D29E1EAC78600AF08F7
+D05A18687E7DEC72A042353946192CAE73A88FC31A750BD93BF1BD0C86C24A11F44F91E8EA2E
+D77C8BA2642256FD9C683BF81C1BB2102893EC70DA0995734277A0703A568E34EB54C1EDE675
+C76288B67FB8346D17E2DE408934F353638321A73AAA5813E287783ED58E340AA204E6FB5FC0
+BD913120ADCD5EADCCE3E3096C61F701C6AFB367DDCC13413B91308A88A8A8DE428AD14F3607
+0B6406E3C26CE69A6FAE90B3E8A0EE84F28CFE2BA9DDAC21A36EE300192564F79CE9C03B0523
+126D10259D3A8EEC4B37A4F11484DB511E866D843A538114EC8F512D253B074345ACB36E67AB
+AA65677B230314B49B6C4FA12ABC501E327C89B4DD0116027E2C5E48D8B3F33BF0D27F19D418
+50F39C38DC8C514668BBDB60CDE73747DF89BA7D8D10AD2F0104B6EB12CC112DD0DA279AA6F3
+A5EA2D9FD41E1B98678E3B69F76544B305F976FFC56AAE5623BCBC7756F6933689ACB649C230
+D2C78DDBC7D6D779A1D89BBD44F92F6E277CB8F5FB641B752BD720215694CE0BA83E54BEF683
+CA62EACC7E418F5545CB1E029B364948A0C8E8FB312A3F7B54DBE83E54CA2D63021600590DA1
+8211C41DC19A8AF58BEBC8EEC2AF347DD5712007E000884EB55F415E008A0ECB0ECE3B3BA8E5
+A8CAE5182BB7338E6A430424BB4D1B02062C8E94AF9DAE00DB64BDE19A2718C562E164900971
+7F3DB0FB1ACBE4FA7443BF4B20A127102201C92E6E2D4A63344D09E3479D7FD94F028AD24FDF
+D6FD1FD992CDC27823B44928CD8792F3978E8FFE8C0D23315D2C838D2E05FED03E9DA7AE6D59
+0541DB2BD29406036921108D3C6EDEBE7C0EC057D65DB37918978D3293516E590A6D7A9CA3BD
+66F7B10ED5278264A4CA4D42415438945FF57147B91144B8E8EE82FA591FBF042A74C6FAFA4C
+DFFA1920C0DB032385B9B4F53594EE261993A05EB151EBF14EEA59FEDD78922739E12BA5DA70
+F5747D5303581BBE76CE1664919DA2884FE0E8E89026E32CF0236AE8046114DDAAD6F8629C64
+1617C5B163E74F2CFF2033F9D6DF892343B6953043CF89FC1BB0F4B0D64466074DD5A81BAFF4
+EEDFF51D46293A7DAFA72B6E31F2C14967E7D057D913F06D9272D2866B901B47CF40F75F671A
+22E0F43247C4AA800B4798C11F76F665E2BE64043EE69A3F2DDBB8F89AEE571C2756DD2FEFE4
+4DF6E45BCB7F4F559605B7C9330E7E927170A98DEAA26403C12E3AFC095A509FD30C2FA316AD
+B89B1CD05D47FD617CC9F9A1335DB9DC3B9A92D6B0470B94622094BE2E1E22A8E971F4F9E708
+B01B320A541231BC90DE41490573C306BA8F89AE3FE673AD42CD0DF3EC0AF572FEECE6500871
+F1E92B06368D1E19B8DEE85B06E66ABB8545B9B29C5C73AC08231A6BAEABCF21EB5922C537BA
+B5D41F9A1EDD103D372BAD0CA062EC7C911632638A23D9EE96F9B68493BEAC9BC88A1047E04B
+4B3A33E9377CEAD6B5EB707AB027CC014C4B05A00CF426F55BF5245E892E09D1188E149B6865
+B999C8EAC788B4A8BFCA633119ACD1590D4D832927AB7966DE03F0180C9CEAA14F46371DAB37
+4ED73B825E861B322BAE154BD8481BFC9D5829065E131940B51BBE8B0B33D06715E0580F6DA1
+C384F3F60CFEA43F69E0DD5733EB473FD82036C7A054FBDFFF5074139C44866DE8CCD767ACB4
+A8327464ECA92C8F75A6599E1832C409CB5EFD85C87208F2550345A1C2E8992669B4BEDD209F
+907FB9A22326EF8030275B20CB4A4EB7FFD98D4E338C8C41D1FAD8514835CE20723E363C27DE
+0EDA33A3F32AD08B861E48AD006937F00E46E7161E5F85F80E2F48FDB21CAC82F2E1489BC26A
+37D6A104BBF174C5565FD8A061A53A3ABEC8E81E3E37EF67658116525192C26D305BF79E90A1
+7907CA6940F2B2E7393CEECD3F3C3541C95643112B429A347973941A01AA9E149B50D60E03A0
+4F2600FF80CA302C0E370C04DE81FF68ACF0B59D5A4ECCD132AF4306FA61699E6850D0703607
+727D5B25949FA6AD8221CCEA3D1E390D5886F170309C60898C9B003F962AA1BE0FC8238A404D
+0637D030434C7FADABF2D02FC4BD1FAB8AEE4FA10533B290AB5395B4A0F08F7C782BD5F03570
+2CF648ACA90899CBABD4AD56A79BC92674B259A6B316477F39D26E403C43A2F5A91EA95C338F
+3987ED1D7A840F5614EBBF419980698689BC1E24C4342FEFD6FB14D69F0C6C79012A576C4355
+2E9DD81A97598F6D7573B5FC5F51F1B20402D19C9CD69BC714A9780E0D6F860572170AEFBCF4
+5DC7910D7C521DFEC01B4BFDB162AEF15E3947CAABD0E66420C04C35052CB9B32D3073EAA3D5
+5D5BAE74F3740D24770B999593E407E656916F42648026E04B1E8630F54C4EC62176190C33FE
+E9FDC8A4FA1A814C0CDC5B1CB0CEF1F652ADF5981CC5C6A8FF1739983161363B2A6BA9805D0E
+E92CD6C55127C6278B160E11575859C6096842F318840F4681B9AD238DDCDA218795B33275CC
+A265BC912008C68A0159D81F8CD35DF7E58DEDC5EB003FB2C16F14BEA012B8C740782D1DE84C
+EC6958FC681E712AF7FC33F0AF557E21412D263689B9D49E958A172989D3FF71FB35953024B0
+F8B8BD722407949AEA81E0D53C90A4C1B3646D37E1A71E7B00889C33641B554D906CC354286A
+087A3E211510A0224309E75147C7157A04015C02CF9695D22D0B180441365BA1387A24D31868
+80D66871D40768E8FB2052A90666AF0B9E2872C8C44842CE0CBEC9AAE4DF1531DEEB1C7F2C65
+3AA57C2F7E0DB8788602E5CE3C2D2DC745D8441765672E12D4506414D39789FBA5B91D7294E5
+A50F3B1D8DF64F708CDFB5CD6103704B02F6F3C80492DDC7091F852BD227692917E06D62B7AE
+E13F95469C5BEB35AADA001595A002B41507DE3EDB7FF56A4E2B4A3EFC448BCEA31304CF68D9
+3CBDC17D91E7FE51C64E6A6B38AEFE42FFC967006067673AD1EC4F59B32ACCE3D59F4CB11DDD
+62C73D949ACDD9306D8B971C8CC2C897B9579658F0691156C395BC5A8B0AC90145605577CAD6
+94540A79C2A342D71C88A39733BD4810A694ACD1698B98C73F7C3DD6B4E3B77EFC6B201FA628
+7BE234347178599F7422C74B835D738FEC17230F72A4D33642F9D7CA390262D421AF23CD4B5D
+85B9586F1A4FE2EA9DDD499F0F2E83878BD6EAD423AF05D097F93BC0C7450095EE0D41E0B047
+3BAFB45A85C9F67DF23A0BC418893B3AF8DA4293A28A215908E91C286C38E1222DFCCE6B1ED2
+0C6542F999C684E82B1C4A85A225BAF7507F422D15FDE1B9E692F13F67E542146F26C06789FF
+2BDBD31FA54399A771396E73AC5748C643AD11CC8A44F92EB44528164B36F7BE1DDF3AF3B01E
+89565D3727A9B76693EE7B853E3EE973D4BF4B67F15A91F079328E256D621BC40CAC8D45A1E4
+688ECCE084B4AD28D2A09AA786D23781D596EB5674C4ED7EB1A8F3B723AD7E4920A56AF442D2
+1E655D96AAE2DD6C13FBB0B0226CCA4704FA3F13CBF0687F9120787CC67AD3904C9CF174438E
+141CD25CC1CDCD19E34DB22E24AFEDBA474E3ECB522AEB2B88B163CD5F08E0526F6D21C3BAEB
+7B9B2E8DC551B436715A85E6BF2AEEC33610DE5E2057C44E07F7B5F265FDD9661078C39760C5
+366F8F355AA3EF6AEB9B7A66F008172B48747E879E939E519CA3F94A92727B8656B49020A6E1
+C9165593C663C7CAD7EBD4CB976D15DE9061C10F689496D086FDEC88BC0F9173EDD29EEFEFCB
+BC8A4001D628D7DEB6C4872C6848BFE45FD5F3D169CAD993A845E0685AB409E3B791C4E4DAB6
+57308C0324681D4DEDE6344F371573F65A63CF5E0490AE55FB0237490FB1F33AF81BF4AA9282
+95E1FBBA88FCB736877447A31E862B56E5D6DE8EE550A25F3A149D91B3D74CD8FCC760B8E742
+10CA81DDD825B0F7E087CB91F1AF6DE9D6FA25625A075707567CB99F59DA31B32CA83495F5BB
+F381C1646E2C1ECEDE44F5B09DA16E12789DE1A19AE16D6464B208D2DC878694A8C5AD4910E1
+30A691EA8C5042873C7746CE511B0D65E901C3B058FE14A5C4BD0F9D9BF8187F3407E22FBFE8
+DC9BCFF51A217DDD70E89D362199217B6E1C2BF517B560983FCBFC9890750E093F3503BB8173
+33BA7982D8E67609D856D5634305CF767A0BC4AAC478D17112EDE04C0D4EE807C48A699FCFD7
+113BBF5381ACFEB58F8569ACDD9CCBB4B576CCB3D20FD7617689F47CC47974365A8645DB6208
+CD9F2F85D00262CDFD3D532A26B9104B968CCB3BDBA732CF7DA7112E2958F88ABAB5645099AD
+D84D5A8E9B57B12BFCAD31CD2B55E4E4C65798ACA0CA326CC2D83699DE3F8934D807DB584B42
+3D74BE293D5D1DF8B058E05C3853C1987BEAF53D1C2C8934E1EE0C742D639ED41CC9EA625340
+B889217C03283DD930F0FE28B32E1200814DACEAE5636F9D822C1481A99C223F071A0D52ECC4
+3CB4C9011A21A9E41F24FE2A3C621CBBF82087BDA5BCA81C45064DF7ED8545929240A8D1E89D
+F968F5B99FBBF8AEFDA604FBEB49474F89BFAC7809F03F43B2084997C45A1915933D4B63BFE4
+DCE15228D327162E2487D394B31A187CB52CD3E6E4977FA03654A66643B179FF867252ECC23B
+3B47C44B4F44D3BC2F45DB57F0EEE856BD7B9D44696ECE793DEDA96EF82C569D98A3709505EB
+B1347A5C9DFBDD229F33DF57A4B91D231ABC6A9BEF04C63853458CB72ACA266B82AE5AC41007
+1D1501C251F72611B18033F2A24ECE213331F51A341F7F45C442549383F763E6CD05EB6B8AE5
+C753BE9FAB2EDC52C9FA8A5E7B71936F0D6F7F4EA6E9A4C992689D22127D3BC0656602E18B54
+A433A54A209B7FA87915CA722D7877CAB4EEBD4F42082BFF5D02FF66C5CA6C4383CFF3625B5E
+1D7A7E286FBDD5AFE1573419FD61E6CA3B9EE56E81A489E71A7A47E876AEBC1B2D203458A476
+E537F4293E431D8EB393EE2A72A866B3AA14F8DCBBD40A3CB70D33A058F664418475C85CA81F
+1C03E57042A3D215955955131CE9506902BEBC9E32F31F8DEBD520373562495766613E00EFA1
+EB1A37B9ECCF87036DB234F0A3C4D453945FFABBE5131220E0F0D4A0885E4E15DC818F2ACE29
+D5DDF38A9F6443834A8AC9D7F435BAC03C8E4F362DF52DE3798F46D4B2AA8BF0AF07460ED6D2
+9BE11ADBA6989E26A985256D73CB116EC540324DD73BCF9AD2876C08CE047218B645E2909207
+A0B6496E74D279EC82DE3BFDD59C9A2D0FD10F8B273912B98FE5C20592BD08A5E48C9EE8C0D1
+13E11BC1F28B0589290D92462535289DC5B03D99DEEDF348DE7C56396A0E04913B30CD8E97F9
+AA523EC136E9238AF835FE9BAAA90B04B6129BECC1A27AC536B5A2641E66D7743E59167C31CF
+6A5DBB8D78B22F4F3F7CB443D96F7CF1A11C66827FACECBA4710DA22FB43E5DB4105B2192E89
+F3A61581D4FBB11C4772139A7D358611F2BEEBF9B94624A218AF0273E3DBDB13C1FB32E8A881
+FD232CBABF890D98C8C943815369C924F7CCD0C246F900190D01DDE52D3BBD33FB139A665714
+49A5A5E9625A6DFEDC464C5329C5482238EB4CB0BEB30CDF5F5D1599859DDF189C92659D6FBD
+7AE7A28E9AEF1AE05F5E0ABAC06E9EA9BD4A18CBF04F19A14BAAF9DF322D9165F488C0D7F48E
+6E7500698C5B214E84030F052EEA86281FEADDEB32E989438F611A02CE21B5DA88DA9F668313
+E2AFE3D22C5505D7E5F0F8710479C1ADF2981B77D4B3BEF0B2D71D292C68703E6EB17726236F
+F801124296B39944C5821170BDBC889CB9797BB99077F3D7EE1853B600AA6B75E4640A6EF4A2
+7414D9A0D72C3A6AE4338B15AC0DD43173B6A25B328D0ABF1F770E9BD0C707A3CFAE2EC296E5
+286EB99AE7EFFB9DA63F521C2A78BB1377DDB1EDB7C4BF9333DC85DB8E8B25D54360388A6AC8
+87543222421322F4E96C2D4D9D7C11F02E5F3AD60D6018FB00A4AC6B13393D3B41307514B881
+38166ED7FBBBAEBCD60A157E7864749534D6E7DE4949917BD37DAD7960DED8BDCBDAE5441AF9
+BDB8692F07C26FBCCB0EA38DE3E495C4CCFDFA55BDB76336EE6E25F03A882F3674A0EDB30F90
+165C382C70B5DFB90FDBDD054BF5BDB8C89885B5C33303DCE12C5E6A9EE85740F7887C7EC3EC
+8920E5C2241EA8EBA41C3234CBE5EB5D0E819F33E3674C3467C53E79B9307090EC7CA7BE967B
+2DD3E436004FB4F544ADC4570D9ECC13F49BF8DB8CA3B736FEF89FB2097BB62E6BDDDEFC6AED
+C701D34E6728CF29E66CEB031071A6F5EB6631D6B5B45DC7E501A4DFC7363B6DE0C3E9DB0122
+C9EFC8124D5B2FA7F3673070749CE63D7A8DB803FE2447A28621974B5F22F0F1FD1DC17DF692
+CAEE180E7124D7EF21F0A86BA1C252A8FB0D4CE82CF9A413C371CCDCF191B73524E303C79BF6
+23575AE895CB7DC72DDF373B3C3B737BBFD7B8BF38AA6CB748D13DA0115E58473D367FD01B54
+C5C375536362A4592F158AA170A7A66AFA3337C9CDFAFE1E58B485A0A0F227FD2656C61C0745
+832445C1B68C58B64920C013D956601C71E23010015AFF4CA9C8F74810EB3927801E5D722E8C
+876B966521EE819D9386436E44F74FC8604C2323728398184B796F502D9D303770742A016A93
+767A4808793E4BC1044C68C57CCA2138A9DFD2E276470E0B74E95BE8E7B315758282F791390F
+B401BF0959A06B9390D0885822171A4C0AAF216724B5ECF28FD57DFB31CD18CA3AF35976BF8F
+5C9071958BEE66D2FDBF25E6BBC5B237E148997A7354C683211C0261C5C91C44A23CE2EB0C34
+4F22239169BBC8D0C0EEF06FAA7778DBEB82EBF9647ADCA5EF1A855F9B4A20A2546D185C747C
+C3953EDC129105887CF30DBB5B29AFC1C9BB720290A0DB8BB8F4D0E2CEA6D861AE797E890CAC
+83B24AB9CFF7942D455D5309368ABE63163F020FEFA2D9B709C8771EBDEA6DD264553B3F5CF7
+0E38C049E9A62EF4EE3176BFD19698C6A378DC5B164481EF0843F3CE80CF9FF77B1CEA8E3CDA
+DBDB058EC9C8B54507940B7BEA3489616DB0DDF359C1A2B0CB1A0ECB0CE52992D274BC821267
+59A0DCB7FA35F86A3E05F99244DB8D673400868B6DADDFFF7549769ACB0C699D0D492AB12A2D
+18469912CEF2E99EC2E0809D629E9C2E70E727A0A2344CDD5D637B5E8545A9E497C55F24840D
+0A98EF0A30E3BD26F1D372E722582981F2B482C3989DC4A20EB7C4DF3F13875B028BD6459B23
+F000C625735CB2A21F4130ADE0C9E24E50751748B01AA5CD043A155AB235E17AEE0889D30C26
+92938EEEF753FFB50BD36B10880164779345DE088E5455990116C7B431547DAA52FED151C2BD
+12ED0A8FDCA774DF1928D9B70E608DD4F1E41781597BE465D07DB6992EB0D672401DB4F4036E
+DF614B773C1787CB28379FD8C580FA113447CDF5164410B7AAD24910722C19ECA808E1BD9CE4
+380F73EB94B7C90DA086D646FA5715F41F8DC4A14645911CF4466C4933F35B0FC3CA053A3D02
+5FC70F805ACF4D3F425054AE2A24A39E92852EB0D5314E537B64D7F3D5EEB0C15986E46ADF76
+F113E6215C7616ECB2AFE489671C369B6C202549E88A5296A922FAB0AA2AC138E0DEBA913E95
+AF9D3897BED45B4438CD76A7B478038C1D5F80B07A701BF3ABA74934D334B674E5F1A1B4ADCD
+B28A84051C239FF54F6673FAF62018DDDD74B2DCC9824A0030219C83FF495A21DCEC4BC7B46B
+AA81D25F0E0267E482303A75A57E0F07174B30E30D20DB77C22A8E1B9A8A5B8E3CD04211502E
+862653023AAB3BF5ED7427792CC9B7557C2A86B2ADFFAAF6C73A0B613EB8DE9DA48A04AAF052
+EB642547C7A4A68F5E6E62280C92433FF3F2F6CA8C35FD265BBFAEBE265304C5BEE42DE289F2
+0E48EAD175FE7A791C7E4F3D9AD8791898E59CF47CAAEAD2F153447FE0E4EDE919C86FEDC2E8
+A4B344DA381CA33F6D2C3FE4B2AD3E7B97EC9A4297E11C3A070D816D3B17D4F38054FD31B9EF
+6508A5CF29DC51CFE31E9DDEC94126B1291F217C7BAF06EDDDEE5FD15E35264ABB118141EDF7
+24EDA854A07CC060D61B6F7B865BBE70B12EADC484E098BCE5417A6A8451924623776D421E94
+EE474E6248DBD23691B3BB5DC79DFD86015C4E504E931AF8AD4E5B31D828D5DCA3CC0ED49B2F
+1A59B208464FB34B970B8D078211641D53EF40395D50BC72F0A609B94FEF0B503DDBBD170D0A
+046FC5CC2E2EF321C3CBCBC2144DD02AE323E74520216776188BD42BE847CED4E6351BAD2E10
+7CF2A2ECC2BAF59C5C6C201522F9EAFEB7CA64729168F0ABD4533B6E955C90505FACC5D85E38
+0FA3A2634F7B157099F315A5C020D5B0E4A4E5EAF34FE5B349BAEE4587FB05797519EB3E3737
+C3EB68CCD8243D13065DBF9DD397CA3283F879B9E9284F4DEBC0976AB87351BE2B467394DA9E
+FB51F9F9BC2559C75CEB098A3FBD7F47C8694AA70A914501454C7328A8ED6E1B37C3279FEF25
+A772ED67BDD631BAD05BF42F15773A997BCC4F66D0C9365D202FA5C251B2EBEC85B8213F543D
+D477CD2B096BC4B5A08E38F9AB51544DF7E9DE3D2610819FDF2F0DE3F555804459814C560FD8
+C9FC2548FDC1C5529ACC7FB3F379644E42BDD7A72A1473F5869D59174274D29EE5CA0CD7DA35
+18BB184EF1D25BF08491EB9F6EC2F8E6FD328FC472B408C3906A585F34443C8BD5319FEF59C2
+E4F08C6C3BB228696C111516D7BE90A390F79BE04949366715D9029F3CC09388ED1DC3223035
+91A6A2A41CD9165E7135C04813C07AF62B0251215623E6EBDEEF870DFB00D4CC2498CDFBEA8C
+B6DE599D49589B0AFDA614DEB7D8B11E6369DDA10291031A0C7EF6BF602AFBFC34B348B74169
+66FEF9D62B4681503EF346BB277682EBE0520DBB728B15A3E03E1D025DC97D615FEB60C4CBF6
+D54A2633F68414333EDF22F1A7628F1C09EC01216F1270EF05D6696FDB961CC11CF21DA6AF4E
+E5CE6DDBDF3FEC42EFD105368D4465C8D5B726C1F7251E52321B2EBB8A2316E7471A9EFC5CA8
+AEE99BC1681731D465C5385F2752E2A41ADC0652A48F46F2A09390C91B147E199A06240485A2
+B1583969A79E22475A8C70ECA68D4DCCD292CD13CAF8BCD94310A6B84D25BD385D132ADC5B9E
+EBBE5A701A2FE4568A5FD348BC689676E4896A715C4C0D809E1B719933324D506430712B9E94
+F84BF3A558B5FBF8465B458626D7C43317FD47F60F7311D772583DF6554D695FC4B8EAB89572
+E8345CA1642F08AC3A404E65D09978121A2242DE8FDFF69DB980535DC3640E83CD4EC40075EE
+9FB82BA5F13FA1CB36F55D0E7BF302FA0BB9F0E1D75BBD955F7A41EBCB296E31D4342F24A4AE
+0B44F0FC9FE7EF5EDAD138B3A1E6B175CD412E7E877A2FB737CB4A2B023B148193D4D43EBF64
+454A70C1728B4F4B8006A6DCA8EA77432A4A432A346DD5327ADED0381449C714077268BD531E
+BD2FA16CC331F5B2ADD5002DC3FD06D6C83A047208BF82D525645D4F57EEF0397FDD3839B201
+366D4654F1798941CB1531807E9D736A4A22A35AB536D198972847727EB3C57B025E9724A257
+13EA871C57FB185EAB6F47EDAAA3E47BD39AFE724C07336602E957B6E5C60207382BAE996FF9
+A59C021F2F52787153D694B42A6F131761DE66891B98E7D7A3C462EC1AA3FA66CB576C1E8CCA
+61E9E10D5E4AC16C1E2CCE7B3496421EBF04C0ADCD9AB839298B1179DA89DC23A95DC578A554
+279C69E566151E482C607138662C75860CDEA52A964A8D5E8FD06AA569736889B256CB1FF0F7
+87F83FFAD695656EC76F0163999E805976665723B349A3EECA090313C7598D57400DB216A156
+39055A12807EF1FC9F4FC9F498240C9D977FA78E36CF483F676CC59643BBDFDACA56D59949A1
+CB84DEF63AED2C20DCDFB5968689EC7DB2BCE1D79D300A6AF4A9CB50AD906FC410AEB10076E4
+FC37FD1BC509C22037F7B8DBF0C8733D95D744D50CFE966B531A934BA9F6D5EE6DF802CBEEBC
+AEF2F7BF747B33D8A8EFAA29F22191F4F675CD9218E5AB3147D2E0522042A3C12EFAAC92BFDF
+9C38BB37BA0E485D39C9D1DD5B39795DF00E19C459BF9CB7A4455A1A0AB6F522BCF7D4B0C739
+3FAA6E33C6D9772D8CCB4AE4874ECC6999163C3841DD1EEF54E21843CD7E3995903F2BBB5E45
+DCF8AD81BFD4069B1BD68295ABE9C3D4FE28F5CB88DACD3B808F0A9278148D79F9B3B3A7AC8B
+344C65D4FCF37B517C64957303065C1BA77034B72D5C048C6586D9F568D52EB1301EE0D07FF0
+B005CFD50726D3AD1A0AF19023432F315C93FCAF64E3ACA7029D8C98569989C8B2CFFE3C951B
+625BD8390C25BE67041D603136B9870F1FC959A9E4CBC64A8A3F7FCD349B0E04E8B4F588F4EB
+29184004E249D12E98DADEABE61D91CF3C799785BDC438C1C4C46BC4E7AB1298C4BDEC98A611
+4FA01DD1801CEA5D1EAC4D5AAE3F0DFF73B0028A9D714B778913D4B3A733F9DA599E36FA43A2
+A92F4F4C294B2CBA3EEC8AE82BD1787BCC331AF8096CFE42C2F723FEF5984273A69E851A6EB6
+C9915C7C13C664855E56C04B2FADD6AEE0F26A44C66D98EB928F261B3E79C2409F77FE09E308
+5A21F806E00DB4297659F8380C5828DD10D8025E9708923F90F494067450BA710AC2D579CE23
+9F498F4FD3ED0DAB3B29C3AC70AF6D91E3F1796027CFECB939BD2F89420C9202A07F42AE794F
+E14741820D6D8599DFFD9D86B4AE1F3928EFC52D9E560C9E36FC9EF7B41BEFDFEB08D73680D9
+6AF9F6070391EA61D36D677159BF92906B81EFA600BE7AA5E130DEA9F6E8B09006C44BCA359B
+FB5BB04C47678A7BEEC1A20F0A55E46CC4757C91683D0B9970B6E263234CC7AB727CF54C892F
+A2DA3FC638A0E5D7EB63EADD59CD99A1192BFF63F91F747F66E8AC5B9DEC88DB12B613F2F4A7
+59211D2ECBF96FA1062F5A3A697102C9F777B40D8E22BE613F209B2C2C350A24D589CFA1A98A
+5E93A8975F1E37AA0CE6B34CEC576D7E37BD0EF873274EF764447879340DCA1DC9932678CB87
+0672C13931DA6BFCB81AE0B9CD88910D71BB5D4BBACDB805C75E08816FB0161B97A0F92F68C9
+5B0AEF34B1EAE4EB2A2A264694CFB355F7179833E5B8FD25AF5A9FB6C3F45B29506C14071E01
+563194BB9922E8D7EE4600ED6D47FE0606C20C573A3CE4CAF4103416D40FDD9C5EE641C393B7
+5DF0C209553E28423C6464E1813D3AAB84B84D78197550F50ADA7EE37EB6AFB54421AAE33381
+89C9F315E0A3F9667293013D4FC19462B1B3484F021B769F25EC77C42B95378F737B251E4244
+04F273415C3AF2E125EE8D99FEC2971C8216DECF521B3C1ACC792513B369C40DE93A2B033EB9
+5BE49362753C6D8B956B352147608D6DFC5FD4D6E5645B960E41AC1FF635369BE5827A5BA98A
+0671B4E87A178A7B9DE73FD44430185F33B6B4446CCAAD4475C5379956613FF8B53788AFF5C7
+C0BD04065EA6B2EC598A1074606ECD8AFCE6C8F7C4EF2D091A4981004FD95E6417FA6440BEBD
+FDF019845C86C9C8C6831A85BD0AFBF6399F2F8D8BBF8A7A5E28FAD827B796E1D29415F8AB8A
+5866AF727E3A7963B74BB58865F1DACBD787038F1116E98625A04A457C0E1DC2A42F0CD2DB80
+4E3F46DD916104AD1114323DE1F5FC9F3D1D3C277D6DAC86561EBBAEEAC35042F2E62DCB09FD
+EFCCC06A51061187A75D8D1CAEFD6B8738F672C2A2D1A6068BCA91D3CCCEEDD5BC93202FF55D
+B0DF6563390AAFDBCEF57B20797717478B89F52EC7897D54FA78ADFAE0C48209650F3290B79F
+B5A933ED7E0BCAA2C0C09A68812C29C66D106B8D6719B5916122F7EC14804F169DBC43CEB5BF
+EBD0328E25B2E96B35A7CB8D0E6FE0A714576C5F602B2305D4EE8209485A38065CD45CCA1F68
+0B3B95C5E5B7F333907BEF1160D7B98F6446B3EB5A419B72AA240A526009C9E1A243E868FE20
+72C3CB790AC815F1BF832A2351D258C1CEAD60A46216E751DF53645827BF020E14E2A8F54F59
+1335CB64EC16B26C452ED5CCFD81B3871D380B689A62519627A1ACC30AC156D04BFCC5DBC764
+31AF55CB8504F8A848DF4D19F5634141A6369853A9AE8EF2BAA91050D3AD6E891A62B4DC0F64
+7F125DA38053E17B92AD02D4E675EA4B580474C223AB4C82A61A8E51AD915A34BC289693F238
+3F5304FF76ACD18193A036065FC90F3F74FF964521E9D00457AECFE4CEA285B62728E21B120B
+B84DFD426132B9FF102CA09986E7EFED65706B46DD4739A7D44A290379E3B5A80D937018E081
+F7FB57ABFB9C621C1F03A334A6BBDF6A08073E3308D5B9485748756E8CEA0F100C292FA9E712
+2778333198B3181366E2F35C8E3727BD68BA143F2A7BCE6715E3517FFE4AF858C969CEEBE9D3
+B0DF0B45513CE373B2345BF019FC25AD182D256644E836CEF3FC83F5EE13DC4E57E2BC1BB936
+AF8B97445603B6F42DAA6BBDC5A7B382D6F64479C2532F5B9AACD85B0D9199663935B3548D0F
+38CEE61504EA26737EE2AC186040AB43732B83DFBAF183FFBBDA9EB41BDB425F6175865C00C0
+D8D91CE1481DCE2132160EB143EC76E45B9FBEEC7EB91320C7D6038985F57CCEC56ECBA5119D
+31CCDB75D42908C606D550818FA00F884291E359AA0D84CFCB3CE0A322D711AA40520C964BF6
+54081D0C3ABF19F36E614D67F0C27096E277F77C26498D6E7D2FBCD9BC765163AB5563354A64
+5EC13C93EF7B2009F00C533EBB14C6C8220E6FC2D41D248885D131F4E677D4021E5FEF1AC8EC
+742EE7EBE329BE95F3F1B4094CBA33B3283BFFF1DDDBC6BF61404F3C1BE8570D0B27C0318553
+5B4E685A312CF5E6EAEFDEA4658E7388132EE3DE6FE9E4FEA5E956E48B4A738E281AEC651B12
+A3417D6E1D6BF98326C0EF135194B5CA66682EBFAAEA521800DD38B686E451321744C866722C
+39AD0D5C4526B6176289D7D66A6473602E72734EC03E3B88F7CB9A82A8A4D1922E85B0679D19
+AE159993E9844008B3723491AAA066497E8739AFCBA1F6067A9E3A9EF4EBC3D18B1CA501B45F
+787199BF18141E58D73897605F0A5BB66001B941AD42C8175AB8ECBD77FFA213419D8730C7D7
+08A9AF0299650B2F40B07438AD2D286AD2365C71A3892A1B0ACD7F0942397426D68A09E564BD
+9F3DD9E4FF5ECBCDEA45D2C8A8FEF41150B0D390C9637ED26834D2C8AAB19680E50AD13729B5
+8F1FD1E60F4132575D0836C812C76608F6FAA47CA76CC744D9ED2B2FB504755E2BBFAD17E65D
+16E33C9BAF3CFEFB143E4CD102A6E1AE57221F4C9090983A61196CB7EED63538B8EC9EBF24CC
+59F79C200B8D87203CE7CC6D5AC0DA2008C5973422C593E8367E69CA0CCCA70BA930FD465DC2
+5B35C201C6165D5FA0B0B2CEEA6B02822B4B2DE99E0FA79B1F85D8ABC8E05B0151CEDC95A6F0
+762EF425F682D9F424A2FEDF438C0F545155B9A62EA64666E57646406425F59A6396DD449A64
+B4D4C7A9D94A15EFF6A1613A8C34DBE77108E9E653BB1D25900A6DB95B46E08906DF3D1355CC
+090FEE70B1A377747A45AFF889A69FCE8AD5B8BDD8C4B3BFF9437BC268695461614947C7750C
+7942D17243ACFBB8568BDB4051A0A796E4E0E83E2F59072A87BEF5A9A71D753AECD10A7E9A8D
+9FB9145200C541396E6176E0C33B3603D9C669FE983F6483B1F502D256E28DCC528660E57528
+07B524A4A1CA46C94A29CA1EE8FA77E3E145985EDE8233D57238480A8A65E77ED3D40A4F0C11
+E8FD582398B1BF0D6405716A4621AAE65491864AA035E6E5164191433D4739BE9B7216E1CF3A
+AEA646194F679CC0EBCCDE96665E55F2C7B5AA2538B59A39F3F969F12D4C5B193BA98CC998C6
+9B6C7B37578792208B2846D35CA15C3CE3CD487D92945EA59B3B25BDDA864514D8770E2EA69B
+27BA296103C56353AFF5913FF9D0A64B7F9AA68D4DA67851464DA2FD45230DB839580301B89B
+F1599F69E73984A957B8488D5A6C7B24A2C66A64CB3E6E57415BD7967FCC48334EEB4D54CE7A
+07FB080F99B3EFD39312B60E1AB2D3592A263C832BAB2C358B6DDC09B3DF748DAF2713599282
+5123BFACC654FC3015008D0793487C89462F5B0750DEA8D2DE0F71EB88B8470B6B69659522AD
+602C218B719F03311E963D9E88FE7B57B143EDC15FD6F32D1AA7DE8021D045CDC66A41115C0E
+FE10FEE11E5E4EE83FB5CC856EDF767200101483257C631C23B7D1F12422DD8225FEF419BB3E
+100303CC0DC516FF92301CD5C5B600A689EB58B55ED56F89BE67C3B3077A6E79BA76B21561A6
+14AB9F31F2D384D729C58B6BBD9A8669DD177545E19A2FB9FB11F0A82121CA198CDB58325D2A
+6ADA3F47DBFBB670A98FD82A0D2F4C8605B4F5B8A4114E3E054FA0C579A8704E822DC5ED27C7
+4B769D7A666ED48A1224E829A580E84EE8BE56CDD488913F5B5E0B7EFE59DD5C97627E55139C
+646279A2E57138CE98FD8FD979345CA0888A29270AD312CBE0D777FE99A1B738C4C91AA2AD5D
+995B77CD6C9D42FC6ECB456E1745CE6C95C4DF7B23E89244BAE6F524D1262EBBE631AFD39EC7
+9E4FFF0879195078CB88DB1610007AE087F9E326FE1D4E8BA4673141989FBE860BCFC561B199
+151722390367C65C6B1CE7B2298F2C6C6A0776C6C5B26FF726677BF04F6A99E56A3C436F0A09
+A469EC71E8A58F0211888F3FF770F5C589A8DA0E320AAD03A36555C1370DAB08FFC47189D84D
+52791D6CFCBBC9AA147286ACF782F594C314F4659CFA953E4E8E104B90957964338C39A97A6B
+440CAEF16B64E04DB2131DCCDD0FEDC418EABD3A9F102594757EF3E29E3CBF69A7BEA78F04BE
+300B5DF41BA52E12128E0953E6C2680C53870EE27B4D85BA64D673D03FB27DC1303947C7A1EA
+3419AA5EC56B2B47368378E8D2417BA5B0D9ED54F78EE3AC9740DD7E77DC2D0D6913C20619DE
+F8E160DC534E4FF87C0BFEDC2938101E55E2E44599F27AB1E344335352352188F9BBAF006F58
+082DF83632F1ED5D6EA677294720FAE0A5EEC7581762D4664743487B277C2124DB838B8D73E1
+3C62A6003C69CC7AF97EA4FACC316953DDC3770F3F1A5DB4E3AE71BCD1A5150E80BE1DCC1806
+8501E74CDCE299E094A489253FA140A5FF8859154767CA07A76A4FFE8CCB1E70C0CBDE5F9F99
+A59CD408532DBDC2A8481FA300A732A9BCDA01EED59914479249B335726475695BB218BD9D7A
+32B5783835BDCA8E2624917E8B39113245CEBE014CF060D4F583F2E6F00F0A708FC452DB04AB
+ED88D49290C6EBE8D06A553321282D3ADEC8DE2D712F6CB7EBBAA3C89E2E910DA121352A4FDC
+BBB8FB932B220ADE4EF01A41CB6EA32D10A05E10D152B0650F5712A035E6B4C98A575026A95F
+45BA6022E3AF9113246F541B7CB6D3037C9BA013816FCCCAC25FCBB186D8593FA293F9FB3972
+B4F240EEC4D60808547748F93C12D3541B058894A5BFA0DCCC08E587574F2F5E23EC21653DC1
+D65F6B79EE6FFB6BB4044838FB6BA3DEF1F3C11BBF80548C5B68102C513CA572EE12354280E5
+D2B67C1F475DD7C436DDBA9BDD0CA3BCAB62506B58039CE8151084E1D1C17F2B3977C58FE2FD
+4EE8590C288BA63AB2871D5BF04686F9B22D1E6DCE04A22FBECD1FC3971011F08CE7AC474229
+D659A8AF49AFCA7D70643D18B835063A38D80B11B5A01B5FB7AAA27A2999ED348DE62C49475F
+C1B285D4F8F29A658700D139D3E82CAFA027527DE3BA2FEB989F09CD9560AE6810F62D8F8421
+07011BD509DA46062894A14C5825937960A6424CC0868AC4912EBC4A13E00E10974729D7C9B5
+D2689F92F573546B29AD861900C33C6938E9DA4158D971CF1F82E9122D20E137EDDB812C7F83
+4E6C91BCEF7EC57BBBA041C5C7FCCF19CC1EB16C9CC1BC99E114F3C1B40278205C9FD46F111D
+786D3E09B54A399574A4E97F874CEE4BFA8277BFE16D9A914AD34C088EDC2A8461D84B4AA348
+97FC4A15706093EE21E599163273D9F3493E077E7925B1977F847F714DC62CB00972A47ED786
+49436F3909B908748BB1A1B6309A44E0F10D638DF86B62AFB18FA8F319B60CCE3A298094A565
+5340A7BCA2E97A12E339295EEDDF250DC8315ED5A0D27104800B2D7D19973C3756D02A5880D9
+DE861E82506D0210B1C41CCA79A08A077783DAC1F8CDD32B851EF07470DDE47FAEEE495A38C5
+4E33536CEDB7FD12F8FC1CE2733747651F8E877122312B79417824FE0EA42CA128E22D85C025
+AA8E2540387B6FF5FC627A25155D3DA30F2499CA76B7D8A1874E4B38D43231A6D4C74EC82047
+0B1A8112DC936841132DDACD87034DD0C420C7CD6A82242DADF8A664B43561C2C0F13D324018
+47580BC0FED0CD3637031FCA5F1EFFA8C1A838609EC2649CAA2A5608990AB64EBA24B7B2DECF
+A6070CCA859AD570D43ADA3EF24DF280DFBD86B4C89CB0709531E96CC969522F7E138D1A590C
+56AFD6F8039DADFA1FC3063E6F5B5421FACCF951418EFECA01A6504C6ECB5CD1471DDDB77DD7
+7D025A1AE6ADB381D5DEAFEF1E2D3CB7442C934F7D8CFE122858EDA43A324E6E09909068F9D3
+74BE10EB263494B7A1F9B29CFA91DC4E674BAC9C90121E083466DCFFED7DCFB8A124497C762B
+68677F949B8DFBD3F75E752A77E51D9FE3FC5C0AA6988E15C8D9181A0AFD43DD59AB01BEFED8
+3DEDDFE1F9624B1A23AE2ABEE75D74C2CE6983ECC17499C810744C626CCF72659306895F1181
+C37627351050C9D4250FD3543B315CF9438CFA0C2204544EACB38642403D630B13C5B8EC0D86
+27F1E530CE84F8CE9FD628A7DEBB55BCC0BE2E940ECCA659C377A9D61FDD8FACA3DBF8538728
+9FC85D7F822B4AD6ED303DFA2F0062031F5361EE92C88B0DDC3D0473A2C8C8D598B54B9E9BA5
+782D7BC7B6E756C13BE262CA6030E12AE1F98CE7FC060B3C75B3F9914EB1829806AF45C0E351
+A91B0889B407329BC735C74289273DB2D80A64D9E9926C6E7EE85B173CDCA5CA81C49A93405C
+6033E04145208C284F7DA7F9D8D7093D760A07FD48DD92855E0DF2E78347200D45C950A17F79
+56F932977F07E81DC01713DA0273ABA5F375FA35E5BACB9AB264B8C5B3CA5D85AC907B8EC1C7
+9232BDA1DAA755979BBBE971A9FE00B93ADA37038437FD3ADC8AB7AAB824532B50F34A41264D
+E0973DD8E70D9C7B688188AFE0A25B9C15E50990493BBBB36E68307D61F5673B4356F9C6AAD1
+167E1915F752EC2085763BA31F3ACD0AE57B1E88A89BC4AF0EB7F701038E1FBBB223E592AC81
+E67FE306DE7F9B7B5F7BDFA58DD338496922BD72D835992A660CDA654CB7C194BCFD39459B42
+B5C64B4D5BAC18F09DF2C656AFF2079B80EF1210B2A0593531074424FA98CB24626AFDB73FCA
+F5C0305C8EF1DE2B25BA906C6E5E08BF235889970C4D9DCF3D747051E1647152F67D386CC6EE
+DE511D78BF2929AB0563496E18BA42FDD22ED69224F2E118F97EFED47A407EAF593DCAEF17DF
+4748DD079D3E3C6CF2C9E7DE4C011F73BEFF6BFACE576F40A7FEE3F28096CC49B12AAA643AB3
+772D6571306276A3277C901F05A2DAC692465799A5A443019BF49CB9FC4885A29BC1141FC242
+B48394ADD9135C98C09AB3C4F95D70F9BABC3031DBEC15F0B884D73CFF0CA448B82C0C7D48C5
+D2A948DE4C44EB822046094EE9480B9F8C96933CD2D9DF248A4F79F7A6CD7B1F53805EDF365A
+99000FAA55DA74C8D00E7A4E68A49CDB94E872C8CD0AC1829AD471A63DF2CB485F6D40012481
+8047E2E9F001E9DF715D04FA4669730CD8AB1977A157920398C25FC326446494D410A7436382
+D7B4974B6D91F2CAC05C15F6E554B6FE9ACCD3AB3A6B0F143EC82774AE7DE962ED2C8CE1B2D8
+592640E73BA5DD9FD4743B7B982E65D1F1FF9FC418FFFC0878BDD2237FD99BB86750F17E5953
+60861F4094989F7B127A97B00820FF5B9E0208EAD330189561EB615B84E73F623D43A21AEA8B
+08133A09D7B0B50EF1F9439CA0ECFC17CE4CD0A7EFCB3A9534A372238CB9C48AB56032FA1BBE
+CBBDA02ABD4FCE5C74CF1A21DB2C56CA2546B68BE0062A6E1194C5243E1B51D1DA56A3B33772
+2372A504037C881311B0106C6DCEEF4F5E99F29E6BBCCF69E88FA6B4628091DF4005C7485452
+7717CEB0F771C5520D0E8A6E9E1BAEA2B8333056E41F1ED8638AE2B9502444ECAA492B53C847
+45D7F25A43DF8A637DBF4270FA0C6ED6E22351692DC37B2E89E73B217F8952E8175DB49CA80F
+FA20302D74838B145B0180A5EFEBB76A15EBEEF0620EAE4B599A2FDEA37D95B3AA6CBA4D841E
+E5CCEB5E62CF7AD26381AE2A67E114EF517C54ACABBDB05DD9A469D5D844B2D951B1250C9BC4
+3E78228FB255F2B7C1369E9CCFAF5F14197936F794E871EAC1773D915610A913C1BE747CA4D1
+F5BBD662A88DF31B50C62E60B096E603A38332BDD26199DEFF54025810B6129BA9112544FCC0
+447D6C2C04F7CB612F0346864947C0FF26A0C3FAC6CC931D7CC1694041B6D8B7EABB00C28AFB
+7E8211D06817A3D83DCB82AA90CBCB7205CAEA200414C77637FCA46BFC2A2D95CD3F970BAD20
+311C40B2758172153C56A078B0B4F51DEAD18D45D14F0571E5C7A1E9A52A4147B9616167C1C3
+D6FB50C633FD27256D31915924E2BBF53941D9D3695E1B8D2C967D2AE9595324070038162121
+308E95453F979916FA18A734D6E38063C14D62E681339714C3E9B118ECFE97C274BE2B1E49B3
+B3EF6DCA38A7FF8E4EBA868500CED102BBFA2584D707C584549405EC333E035656CBDE6270D2
+0F2544177588DBBBF22B24078711E3245BA1A5D8987B967DA1D2D24D52C664CC0C00BEB0DD7A
+FA2805058FA11D5A076692BEE5D9952A82F81A8A35A7B685FCA302614B43AFB7F28D650A4608
+4D081204F87C10B4E8F31C1534B3B3AE28439376DBC5B65DA91672AC4BC471CA97CC4FFAD1AC
+83F7FB60100CC47F7960AB9F50D6FCB9469BB07E4962785107EDC8A11D7C5939445E9B44F411
+4FCC4665FCF7D010BF8645F2BB0C4DB276FF547C051075456080522047A86204211B30D0DE14
+8BF9C99547E29880ACD58D180A3C1109827CE75C717FF54FFD0C7493D5E96FBB36305F7791B4
+5A491B6D10EF8582985A9917C42C6C3C35481B9874C482BDC942AF2315649518FE9E066F635E
+B6B47531A9FAA61D42CD1CC7BBF24D8DC8B85DD65A74DC3A51A8425F47B4A7B69B3679E7E770
+FFF200933C58D9ABDBA5DADC0968771F9E9D8DCC4DBF96A9D95101C9F83B6A4AA460E4B67A59
+6B7EC08BC4DC207C358352498BCA3CF64E92FDCF31D66481AFBD2FACD9A569FD8EB2F35506A0
+08E4C6C954604477495E7FE83CE48F4A1CF3775E10D3DAC8F894D95CA791965AF07F03C17612
+F0BAC9E681C9F90BE6A359816C27CF8A8AAB49E0726FAB1E4198AFF4B58944EA9209B9A61714
+8291EB523520F22A28CB7570E11F4FF47316A8E783BF55CD9D514068576524BE2BAA8AD1D4BD
+AFF26BAAFF65A7F10B913B2959D64E7E7BF01FD6A85850382A435C1044AE9C6C6092CE8CF511
+AF992911A3A056B2D1B968859A26DA0BA1931D7CA4E3A222256B52E3A7FCE13DA3A8B8D891BB
+6B3A471574D1CD94C08D3F331439DF0B3B628D69351BDEAA8EC7A1414492F2D21693C7599EDF
+513D3175AACF5B3D6229F1D47167838C93E2ABAB8519D754D6C49712BCCBAE9AF841758C72B6
+345B8FFA6A86C9416036430D0CF66BA152095F9445D30D6B04183E6422167FBADC1D100C3822
+3B302A173193F57DF346DAC5FF800F60D3F85C1D0CD61E7313CFB5A1D1A4EB68EA11DEDBABFF
+7DAB695EB90BCAC1B0C332C7C87986779F6E29BE75A2CCC572D8EEDE4CC03ED28EDB49FC5645
+58695EBDDEC86C2CCEEE1AD7515ECB254B62DC09808674836186516B927F4BF17E98456C89B7
+9B67455D3FB5FCAC47319474928015DCB0A7DA5976085E41068E56772E770101D07585780FAE
+00B6EF6E66D203B148EEC52A384638B00636B998FFBDEEA2041DB232CA9FD24D6B49E267C6E4
+F23DF648D83E5948A361CC3921B84172D727E6C75615A121CA60A6355D521744493C96BC38A4
+E9E29345A9FBC0E244E2EE8AD0554726465828E532F606983DA2A6F9A421AB1B9B149335395E
+9D49FB36A80C5D7A9E51F19D5A0568EBD9C01A2C989123F9CE33469329F8149914097EC3B84A
+1E557A614A455184C1CCDC17C45664BB1A8353EC6C9C04D219C4A58AD1E048027721E766E525
+EA9F2CA909E50D9E98731315F37D7A9EEA606E642997CA65D1867190476CD4735DFE89F9C080
+E2E21A9045AB22B89A49B9AE04D29EB7E86BCBC38347881656A7543B35B8A1CC1E9F36A5AF0F
+2B0686F0176FFE8A70DC8F0AEA7A8A602CD4668AA13EDAE3C7565823A2C3B8F255142AD41CA6
+E3849E1381DB533DD664C5CB43071AB7FB7235576029652669B50944F83C09D1312E68B443E7
+CAC21D3B44BBA90182DDFA6606181A40CE8A52ADE608DD6979C5BCF5B02663EB211029D1D896
+85A0945BD732B46E0DFD66D6D2B486F8A21181B562189D892BE877B146677259E25A855E971B
+C11246AC4756EECBCA899FEC5D0C938197C3F8426EB1EEC083B40BE472C925D4D91556AB253D
+39906F3447CFEE0DD4484A71DE323F69D694CFB85AAD9DD1F9B4701DA649A696E6396EA4F9B9
+B4F99FD84176B7ECACF20789226C65799CCB92BF1CE1008C7450CA1B985CB44062E0E86186E7
+AB9073F0AB92CC2F3809A42781AB3DD9C4614E23DD5C46C7F9B0FBEECC276328768B5430890D
+BC40B50B863E2BA756E9A44334A32CE75B1E9F81B88253BC2444E11DB1E3E09441D189FBFE44
+234B42F08FAA7E2BE38E153E030792716B3E2EA58A41FBB0E4383F8C20AC942BF4ED859B147B
+5811F4EDC16482C8D6CCC8F9200D0D9C2044F920B53639BE73CB1C007794CF2964FD703A6477
+44793F5CC0085B09E216B7E9E5DC415907EE3B0232B5CB2C624EC58B88AA23F70A77678BA96B
+AB458E65F53BF05556D804ACDF3A462DB96F9A3A88C53B9877EFCE00F34E99AB203AE7EB4403
+3DF3A682439E71021366564EA5B0D35B8CBDABB87423F9631334AA897AA643DA267DC012C933
+F98545990D3712C6D05171058FE57C856D01ED777E9AD97ADFD7753E390FC20E1594F385E617
+BDB39DAFD08AB3DF38B55C8553DFA0382E569FF0C7F0A5EADD9C390C1F7353AC0CAC68D5D36B
+E24991DC0BC9AC88087533A2F41BA32A17D6D70B112B761B3B2BE907CB80E0293CD898C7B4CE
+D1E23D76890FA9C2D6A7BE6CC78EE3A86FEABE7D9AB3DB2F2BF8480B0BE3147A82DD2CAF8288
+2EE7A8382E8CCACE81372F5BEF033AF074F21AB3704BCAB6622A8EAC63EA3F802C4099A4680E
+80E0207B4E8F4AAD94BA83C27D93F13B8DF59E548FB34944D36C12896D9D9BF72CF473CDA0A8
+20EFB2572F704C15CB1C96B8D54B27298DEBC877CBBE2D375995CCE8E5252685DE33E2F5FCF8
+C524FA590E5444977668C1BB92F92D91290EA0F869B45F78658D189C72804BB37658631005D5
+B6FF1AA7E2CA7B2CFA96277D353B04FA0AA2556CE136A4B4B360434CC37EC44AB995F5E03CF9
+258A5D5D35A9D1C33E51375D5B1048ACE95B3B7CE85195839A546AF8F2965701E9DDB41DE2B3
+BA34A61A0ABD02998AFFA17857149346BF4E75A42A750B6AF1D2B8D8DAAECA5FA8300D4C15F1
+38E62CC089C6312C16B6647EC9610EF0AF2C9C909E21F7C59F9F25D0232C681A127BBEE90D6C
+19E41F64789852DF921BE412438E422B7F43E167198E5DD670DC6F4072543E003C7D351FB5DA
+CEA72EA143ADA96EDCF91F3D672E178268BCD583FDC288B0771D1214C307232E7101FE8EE73D
+16019CD43C7D4E0BE13F730BECDF9EA87A67E128D4E60C2104A36AB5BC411097F89F12564E1D
+3BF17D9DD5D587C771D260CDCE41CE0F2F1DF995596651EEC623EA953EF8131D93BDF34DFA53
+D25A7E20161C6B509E6C0D1E3BA2E3735B2765D9A69A7B1030A735B55FEE7E3C1539F0198640
+59CED218174263933B3AFF5F4BBA7F651B365E27E7B0B36757D8EAE5E0D2EB01522D79193C93
+84F8F611FE0B448307555BAAE615D204A407C7D49ED5DA1C14866C5A57A1BF319A2AD0B2B9B3
+AC66F93514E87935BFD019FFF985CF0E57EFBC6F6A0E741B4E52623DCA9151ACBAC00D803E8C
+66B6608695D88B188365AAAE11F7D2AF4F5151A1697736F90AE78AF147DD43A23B086BB39495
+D5153BBBB1A3F1465DD219EB61D5C8E6F791EECAFC8D455BB423401B5DBE3F8A3C9E04198835
+751E51E2DA6BE766175519E7CF26CE946310940205FB9928C0FD909764758E215F13DA4EF6C3
+3BCA3E7F3EA96CE7C6CAC3CA449EC088BF3C8B54DCC433276DB76C33640CC4848FFCBC0BFD4B
+3B0D3A3EDF142EE977A20A10F00EC0C19053C11F4CCEDC0C169F8D06E48B1CDB6F7F6446284D
+951FD8E52F729CC16DA6BBD29F9DF9FAA96A023A7D039D4597D90E0E0B3C5A21BC26E4EA0956
+D92FBD3C5B657D31E030AA1548810CEF44E42CF2A147CBFA8D3ED2AD4887A5206AB95ECF2DB8
+3084CABB539BC368216B136B1808998D92467F3AD676035FAF715CA3A2D0E2813E8A3AC5FB71
+1B6506DF9BCAF6C590666FC7A6F950A292FEF40CD5715F88AF0FB4A3C5DA4A4AA1E13BA6BC61
+2F13A13D3A524DED5A78C3D73E389229E131D0BC3D58D179D925779E5836D4D0BB1349578EC2
+82C37046A87F626B365EE9C35219F317354C9204467E3112F7AA7163E29521CCE0F7F0BEEF19
+4DC68DA3409F33A55E86904E26AE8733B468BA029C6E71CB13239CD089710ACDB79F3DEC56D3
+FBA5939F5FBE03E822DEFE7CC96AFE87926CCA04F3FE24F5FB86FBA339D109BE03C911786781
+7C378D1D40A5670F97F17569E410654FDCDE83FC379B25FF051716E09FED8440BC435F79F8A5
+80A7BB94E03B406E41DD8FF58A30CBF30B80883149C18B82C1631FB5EBB5362AD0D78857560C
+08F3297BE612C4ED11B30435F99EF1D43611ED827DDAD258AD3E5B4C798420350A28BB23EC32
+39675CB65D0CE3E08CAAF16FD943071F19D84A6FF8CA090DBF9A24205ADEB6CF31972747659C
+58753B3438A0AF45D092705659BE42C74B5C38EAD7A65ED9E9AA99138FFA75E7F80953B90C5A
+0A3564402E0EC23407A8A98353F51C31734BD9B2F239FD65A0411E946F29755D9D1B91C8A587
+11CE35C158B28CA5C858F4807FDF26B972BD9E794324F2AFA43412F5EE8C804EAA5D1DB957DD
+82ACEB2492F78C175BE221B5AE9E0D7A99057F2FF2FB55D42CC9CCF5866EB09D7C091331998C
+693A9D1CE420069B24F0F982DF167372793E6A81EE2B9E844AA9C5EFC1E9B8FE8C05328050CE
+E5FC73F179057FEB7A2F843C0A96E22885EBD7ECFAE90EB0D59AE93728A3CB05C966F3D9ECB9
+FBD23A5C1288C7C5F75903CA85BCE7387B9C7E473946FB7D46A0E4C9C96B44AD611A4D208F90
+270C6F7298EAA515C370F751F8309EB588B8A67521918EE5D8282CE6E3DA1EA04A1C1AE24E2C
+C38E65C5ECE92DD0C982C54269EE1E963816422635BAEEC3458E86A821AB0092EA89538638D0
+1872AF55CCED338177113B25F3BFAD8A6853C7A4AB4608E95414462EC826139C1B52ECC756ED
+22AB7D50C8777736EB07586FA47A3ACCF9626A99011424D78664DA2C61AEE77356BC80EC0238
+CE51926DBD899168E8D2794B4F63A6559C03DACC59C4014991C8D7049F58FEA38C9FE012D2F6
+D344BC9BE54B40441229B6A8FB636CAA9188BD971E4892ED5EDED000F82610AB0E581FD0AE70
+6F5A7794FC75146C4B2E3183FB051942ACCC088EBC4855483642EEA9E1CD17A2DDF76EBBEF29
+B96D38769E444659688B63CE6116A0C9300190AAC8C3E31866B6F5D1048B8F4EC9263811B2F6
+458978BD8F7D788CB21FFC394F5755E7D90A99533170D4C2AFD113FCE91022580034782A6A14
+8391C7CCC4B8652E16AE26C00809DF6028BCA3E8F22774E493916EB9E0C3C3C2FC5752E0EAF6
+B6F233C4A5FD689110C4B22FDAC40674C69C00BCE9D5246E7B3579FA776D2DDA7A1D768326FD
+5D8B6F7E6083EF31025E17029631EEDC77EE0E3481FF180FC269C3525101577D145BE6C11A2E
+7B1EEDF78F003FB99CE7C185A5711D4150F7C3AF25E98F036B48678B443CE762B33326B63B73
+87E96878B084B3695B24FCC7FB49A6851EA40AB8BB7AE45C288C3CB4B1D9ACA0846BEC1E8955
+4D23942EE66E911426C4EB4422CD6B5F519CB91E969D3F475C80668D4AE5CEAB15DFE7F64029
+8178AC464AAE2C8198E1C12A2369D81E2CD1EFE2FB3E8C499D1F45BB2C1859F44DF0776EC3C5
+6E6D31E587E6DA50CA97AAD5D8AC1E9EA7E5E7460000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /minus put
+dup 162 /periodcentered put
+dup 163 /multiply put
+dup 164 /asteriskmath put
+dup 165 /divide put
+dup 166 /diamondmath put
+dup 167 /plusminus put
+dup 168 /minusplus put
+dup 169 /circleplus put
+dup 170 /circleminus put
+dup 173 /circlemultiply put
+dup 174 /circledivide put
+dup 175 /circledot put
+dup 176 /circlecopyrt put
+dup 177 /openbullet put
+dup 178 /bullet put
+dup 179 /equivasymptotic put
+dup 180 /equivalence put
+dup 181 /reflexsubset put
+dup 182 /reflexsuperset put
+dup 183 /lessequal put
+dup 184 /greaterequal put
+dup 185 /precedesequal put
+dup 186 /followsequal put
+dup 187 /similar put
+dup 188 /approxequal put
+dup 189 /propersubset put
+dup 190 /propersuperset put
+dup 191 /lessmuch put
+dup 192 /greatermuch put
+dup 193 /precedes put
+dup 194 /follows put
+dup 195 /arrowleft put
+dup 196 /spade put
+dup 0 /minus put
+dup 1 /periodcentered put
+dup 2 /multiply put
+dup 3 /asteriskmath put
+dup 4 /divide put
+dup 5 /diamondmath put
+dup 6 /plusminus put
+dup 7 /minusplus put
+dup 8 /circleplus put
+dup 9 /circleminus put
+dup 10 /circlemultiply put
+dup 11 /circledivide put
+dup 12 /circledot put
+dup 13 /circlecopyrt put
+dup 14 /openbullet put
+dup 15 /bullet put
+dup 16 /equivasymptotic put
+dup 17 /equivalence put
+dup 18 /reflexsubset put
+dup 19 /reflexsuperset put
+dup 20 /lessequal put
+dup 21 /greaterequal put
+dup 22 /precedesequal put
+dup 23 /followsequal put
+dup 24 /similar put
+dup 25 /approxequal put
+dup 26 /propersubset put
+dup 27 /propersuperset put
+dup 28 /lessmuch put
+dup 29 /greatermuch put
+dup 30 /precedes put
+dup 31 /follows put
+dup 32 /arrowleft put
+dup 33 /arrowright put
+dup 34 /arrowup put
+dup 35 /arrowdown put
+dup 36 /arrowboth put
+dup 37 /arrownortheast put
+dup 38 /arrowsoutheast put
+dup 39 /similarequal put
+dup 40 /arrowdblleft put
+dup 41 /arrowdblright put
+dup 42 /arrowdblup put
+dup 43 /arrowdbldown put
+dup 44 /arrowdblboth put
+dup 45 /arrownorthwest put
+dup 46 /arrowsouthwest put
+dup 47 /proportional put
+dup 48 /prime put
+dup 49 /infinity put
+dup 50 /element put
+dup 51 /owner put
+dup 52 /triangle put
+dup 53 /triangleinv put
+dup 54 /negationslash put
+dup 55 /mapsto put
+dup 56 /universal put
+dup 57 /existential put
+dup 58 /logicalnot put
+dup 59 /emptyset put
+dup 60 /Rfractur put
+dup 61 /Ifractur put
+dup 62 /latticetop put
+dup 63 /perpendicular put
+dup 64 /aleph put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /union put
+dup 92 /intersection put
+dup 93 /unionmulti put
+dup 94 /logicaland put
+dup 95 /logicalor put
+dup 96 /turnstileleft put
+dup 97 /turnstileright put
+dup 98 /floorleft put
+dup 99 /floorright put
+dup 100 /ceilingleft put
+dup 101 /ceilingright put
+dup 102 /braceleft put
+dup 103 /braceright put
+dup 104 /angbracketleft put
+dup 105 /angbracketright put
+dup 106 /bar put
+dup 107 /bardbl put
+dup 108 /arrowbothv put
+dup 109 /arrowdblbothv put
+dup 110 /backslash put
+dup 111 /wreathproduct put
+dup 112 /radical put
+dup 113 /coproduct put
+dup 114 /nabla put
+dup 115 /integral put
+dup 116 /unionsq put
+dup 117 /intersectionsq put
+dup 118 /subsetsqequal put
+dup 119 /supersetsqequal put
+dup 120 /section put
+dup 121 /dagger put
+dup 122 /daggerdbl put
+dup 123 /paragraph put
+dup 124 /club put
+dup 125 /diamond put
+dup 126 /heart put
+dup 127 /spade put
+dup 128 /arrowleft put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+/UniqueID 5000820 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BAC8CED9B09A275AB231194ECF82935205826F4E975D
+CECEC72B2CF3A18899CCDE1FD935D09D813B096CC6B83CDF4F23B9A60DB41F9976AC333263C9
+08DCEFCDBD4C8402ED00A36E7487634D089FD45AF4A38A56A4412C3B0BAFFAEB717BF0DE9FFB
+7A8460BF475A6718B0C73C571145D026957276530530A2FBEFC6C8F67052788E6703BB5EE495
+33870BCA1F113AD83750D597B842D8D96C423BA1273DDD32F3A54A912A443FCD44F7C3A6FE39
+56B0AA1E784AAEC6FCE08DAE0C76DA9D0A3EBA57B98A6233D9E9F0C3F00FCC6B2C6A9BA23AF3
+89E6DFFF4EFEC3DE05D6276C6BE417703CE508377F25960EF4ED83B49B01B873F3A639CE00F3
+56229B6477A081933FEF3BB80E2B9DFFA7F75567B1FA4D739B772F8D674E567534C6C5BBF1CF
+615372BE20B18472F7AA58BE8C216DBDDF81CC0A86B6D8318CA68FE22C8AF13B54D7576FE4CA
+5A7AF9005EA5CC4EDB79C0AB668E4FEC4B7F5A9EB5F0E4C088CD818ECC4FEB4B40EC8BD2981B
+F2336074B64C4302807FA25AFE29D1EDFF68FBD0141698DA0A0FD3FE352AEF6618408EBA8063
+0FBCF58909B21CA4B9514EB27F9FC7B78FF460D374798DABAB857F6DD422BC7983C7CA213870
+1652B6C3901B98B43B641F905F54AFBE00822DD60E2BCEB957BCE7CABFC51F153F3DE4095395
+28E20DEE4B8C15E2AEAEA9A46FFADE11A3EBFA3456633B298DEC6DDA6D6CA41DAE03F5C6B56F
+68E58C0706D3A97E34FD845F8F2C6126BB6FFB72FF4005A1385A1EF92F2BC0FE7441C157B1E4
+AFFA17A5D2057DC2BA87A77C45F8442A36BB895C4FC24FC83BE3831D0588E9D66DC2E71D11E8
+8E9F110493314AE48233D708568062829ECB94AF0441975CD8F1FDF4F626E6B0DB35683B790B
+EFD89B94894C3CCC5AE9A57EDE5B4C5F71CE1A7C5F34108EF589711E2E4572D90CB501068859
+E2E333876FC9251E6A574543E1C2E7A55E186CC9A194DBDA51724FFFE506B0B754666C59F449
+3D069431CDF764DD7E62720625B3E02C1403427A93362205A4BA5AA6727E3D486795D7EA749D
+AA5A46A7C3FF9EBE73DE35ED38DE2A0E9BA7FD370B5B702E21DDD6A69A6B2E2916A5A93849D9
+24B844C3A0334A0D2C95E089BF141DF55E25620BB31DA68962DD3C51A9336EB11FCB737E6906
+EABA756BF7B55EEADE38994C5FE146FDF725AC74CCACD70BBB292DAA5B1C60CD39AC60239B12
+33579444E8846826D3983B0D6A8C5BE07DFE43961897355ED8E72CC4A4257620EB7E113EE988
+D0E8F7947CC822D8563B7BD56D69F144159293E3E2CDED7068F6E3046F14AD559D712D7FED96
+740C962CD9EBA9CBDB0B45D5DD9A05C0CE28DD27D2FE6B7169B409BD1E080B32D6D9F2061BD1
+B9292D0506D482354F59DB8BD14F8D975B8A30B212F524C8664E5BD9C170BB0488CABFB0BDFD
+D18BD44D443B08FB2781840ADDC9BD22376AB814B0429D7B0664B96E183A2675A28B68F1FB6F
+88132C796CE2AAB0B9409396552D7C16F6ABF5B85E93B397A9E1CB74F610E81319CCDEEB6D31
+EA13F95F792841402245230868FF37BC57995ACA98FCA2DF474817BF96B0ECDD4F42DE20A007
+49A91297CB25EF1C7AD56C5D87256AB41195624F1977ECF9246D7B1DB6CDBFCC654AD428932E
+5C0DEE8CBAE5D2CDA5F56C16D62BCB93B05BC6CB5E13247F59F321B3B824A73D4261C6A85609
+ABCB95C4B14FB51FA0B8826A05696617A2DB092D909FFED178BA62599012D08EE433E800B54C
+77C15DCF02086B1F04935F7B79EF163384FD4137391F5E4936EC38677BFBA1B4204F5F80505F
+68CAA8F538EB157E9708306A9745D2E2855EF01450E3D2F8BD3C4C5B4F3697A51038011D41F1
+6E4C7781B4EECCCFB86EE892AD6E9A2C69C1AB0B11DE2BF88964E5DAE8A3389F18DF163B375D
+17895F0D91D4D52C3A5BE455196251EF12B8742CB54D14611BF5227EE52BF8F464EF8860579F
+B8BB6191E9AE46F27BE34D732C2DEC814D00FB9763848F847AA9FAA73CE9053719C781C3B3A5
+F27E614187D3F00A330C2F76496BF32E924E27ECFB6C459353845D446F642061864356CCAAA2
+BF7443515645B51F4DFF4E244F8B7A556EE38389EE3BBF9E69BD72D6BC0D134E134D6FF43608
+75EB8838A885DC681004EF4383CAFEEDC688FE4735F5AAA4A11B1BE4D956AE9CBF8D8FDDBC29
+A600215C189BC812A1F441FF1CA1FD6C5F3C4013528961E676FE3C9ACA3D44B913F51DEFD42D
+D4F67BE410C4152B675731F18315030FC2CA4BCFAF5C5BCADBBCBA4664FCE78984D5C8997B40
+088F68F31C8D54D44575ED23533BA3A504C1BC90794AB111F1C011BE57696786AE25551ED73C
+35F6A343579DE01675DCFE26ABDE7A3CF73C121B7C33CD3D42BBCFCED99CCFEC4AE08EBF2AF4
+FADEAB53F6A2076F8189503DD57F84AE53CAD55D97D3734E706D9442FB175B5CC032EC649776
+00A369007A47B17569E32C5BCF5722AB7CE03EDC4DB3C1B3D31A73D3BD274C53359C6BE06BB9
+3D0026080B9D76F51DC69AF96C8F73B83BC8CEB5D788E69571EDC574E71C06B3504141D47179
+24EFC2CDD8D0CB9645A06922CDE8EF7B297BCFDC0C9D8C65A0D0CE542BAD98B08BF75D814CAA
+C3C51877584EDD5412CAF5C69599666DB2E5571E5662B3DA510358234D553A54025C8DCE413A
+CD0B4FFB252BAEE591382C0C0A293011F3649508A2C7DAC8F153B869C77D148A0A81AAE057B8
+D32CFDA1750180C98F70A8D0FC62A976F785B6F67E9665D1A54C2F591E4B9BC1B8CD0B23E6B5
+3CE5EE85995417A8199F68DF12C88173F69D45D8E6208DF7E1315CD08C9F0945FA751B9400A4
+F44F1977355C5FAE4EA84342F04AE3E785DEC832DE82B9C6D57835734080DF60C2AA44702FC5
+BEA1AF1455DA321341F3613442D63F6B547FED5707EF114B654E0DA6ED340A9372DA4A99A987
+CBE785342FA9D2E98789417B87BFAACCD46C16D11B5C6ADBD5619770810A39D74BE2620CD99E
+49A9DC91E7E6D0B6AABE9AFDFA8D532FFF1310E0FCC91C0B103340E0F1371FE7801B9EEC0F67
+A7C7A26D18FDDADBEF951FCE20EF0558B9F32C560E41A87AD4A94DD0E0F1DC333F6667C22C65
+D995B27D25371579458748E078D5EDA6ED9F84ADB3D35547FED29BE03ADB683BA50A9E1CF955
+CDA99F95EC45B6B23F43A05D0607CAFDFB9E1D830613C22F1C583A65381CA5C8A736A8B34DBE
+70C116699E3144AAD48CFC32405F67614FEAFDAF0106B39EE47B8902B1511665BE23981ABC5C
+4E148F6685ECD9575C66DD36A22E41198227E7D7433ED856151154E478D51F5B093AB0A7A923
+197864F4FD6AFA7282DA51534B0F9BD0FF070795BF954E02204BCC3B0907CCCA5F3C478F7EA5
+402556883EDA2211C394C0D6E921F502368BA96DF89C39B9A36805BC76FA3C3FD390B0B75262
+7D8774F66D18A074BBD255B9FB2A2FE94BB30A928243B9F308BB789FA83E6BA7B94946DA5B70
+A5047B8D9BD59EEC2DE5A21A7AB0A826CF02CB675CB5C2EA3B774647962CF7DEB01554CAB8A7
+B949723EB847A544E8C839F36C10E9BAB10C3E4B05CF6CC46CC6A567D9BAC1DDA8825C726450
+68690EC820633567BB2275BD1271E284193C4402D5AE384669294AF99467162E790B3CE41F0B
+BADEEE07EE77BC47CFBAA76F28DF5F7B870F95B04A8DBD85454405DFCA87B6B4DC65B3D5F125
+65BAD0D22082001D0061F10991F3E1682527EFBC3EE8F072F4BF29F3EB210E403B142B82B97D
+6AB9A5CA512E448EFA90F8043495C2FC11730F67949E0F54544094592989D7A1CEB43AFD0BF5
+0EF49C81C996469F52451CA818176ED2AA6FF8276030EC931A9CA6BA331A4B463CFE77161410
+C4E8EFAF9395F51D13D1BCB2841DF7DB65FA51ECE17B5A321B37AF3215A69E72A74C4FDED676
+7930CEA4517DF9A7148A0041F4745E4E594B0219C9AFC5EE8059BA9BBF415302A9CDC48D0460
+516A270EBDA3A6997EC4335EDC0F20FF994C69A486316AEEB8584D0DDAFF255F7FFB07C77E29
+D58D32BEB7F337E28DA97B8C7C44F8452D9C629C38E03F402824B24CBCBC6B4980559921D69A
+A48F593C4791B32FF0C6DB1546E37F831A82E3EC733773310157F50DB7AF0684981345E7E23A
+7284029CB27BBC36D2D41EDD1CF0C3E30895D9DE0A2319A746127C37B6F08BB7F9A414FC9FCD
+2C17998F7E6CE30C395E2BFC589CC0FEDFE92C659E4078DC7F83E9418B340BBEB23B52D45983
+24238EA02C94591014A4D7C12451F7BF20F3F9DD26C515877D6C33A2166A4E433A1748AA192B
+C0D33F1C4FA89397E39AB886AC737440C31FAA635676A62E6D3F194A668FD0F8FE5B6A8BA3F4
+B4BA2198C837E4B9CA708754CD0804AC78C9218A770AB3EF5765E14A69D14C3367F842B72352
+3AB69E5E4FDE7893F99C88273DF486B4080089A0DA5136C59E1DDC48FC71C1E9C8C591E8BE5D
+3C9426A657E65FF430EB154E2DFDF4333FCAFC588B61F8071F65CC8D1CB15E27A425ABBB0D78
+BC366BFC4F88122C66DB571555B5D6E028912BFD89CF3E0E56C464392A4D505A4F7E23CBC169
+CEEAAD218C7553668F549AF2CBF9A297805B3453B7C61112BF8E6325B7569E38F635B2E13B28
+AA8F7188E4C94E3E047B6A6ECC050ED9F3A43B131193D84B32C0FF1406B9B66E3627719A781B
+676DDACC16915ED237D6B1342F3A9D981D9E96A1A8D5827BF165BB901800D6C900A53271C906
+D3D106D26636438E1B5A0C9C97CEF25F0C8B4B5C037C10A9295DA210CDD608ED6E0B77CF2EEA
+C5DC2FCB7B5FD0122A3C3A03DCFF782E3C877F210425F9FF99235A969ECA67AA7AA290130D3A
+64D6165CCE3AC29C5EE3B4B86EA3AB78373C664DBF6B99949EE56B0BF0F94838701D554B26BC
+45C4DF406D9015CD0B2147D338D1C71F7738E3B922291C96DAB5D9230190FE3299551698D8B1
+4EF02F5948BF5B5E4BE42849C001CCDBFC06DEE4FF6B12832575D1E5863F1190BCE902A650C1
+BF869CE7082C9388A1DAC4CA0E02967E3937BA91CDE0E931BDC07DBD87BF028F46CD00E7A7C2
+D26362E0FC0BF267D6DD23E1DB2CF41C3BDCC785F2A8D12067CCF81E1F113DA147CAE6B729AD
+E0F85369AD28239F35C7C5CAC87CDEBA07AB233B9321055B972A98CEF27C1B41EC063015E8D1
+A2DB01AFFBF0BE01C43DA54A86F199E68432106D252837759AE1618D7008D615AA436341DD35
+583DF423EACC1B48D568FF5985145CCC285B2803F03B5B046E7514A8024FD786D3033AF60962
+0004CBC2609766039EA8B28086019E4BDA30113CC40E854A159D86AC49E50D894595349E8B37
+97239DA96F55B565D5185E630DF0BDD44612DC4E83D31BD8A4372AFD5420F6B379EB8D7373AF
+3C91C999CDBF3AD418DB84AE6629D44EB28AA5EE9583686EE4F9435DF0971A3059BEAF8651E7
+4E33E7B712174BF952795561BE53B5926CDDE509665488354D5C3E288CA7B679B9B969C9C6B0
+44AD882905663D1F5AE476951A637D4125E26575B2CAF43DFE5C6181238D78E0F41F7F798F03
+FBE9390561CFAD3F29E9DBBE20EE524344A7E3A730C529A2BD8506FEF7D571AB99A36E136C67
+897F7C38582782BD04DC799F8F66432E0D5AFCD239185E95C8B6842CFF16F2CC128B8FEFEED6
+95C85E4FD702A60553A254E9EE2AF1A0313A5D2AB5EB559064480B13412085120CB6C90B1AA0
+8AE1FBEC261077B9FE65E3FACF4DF582E89B68A4422D0460DE7A8523B51928F1416A9AE025F9
+541FB5FD5A9AB5508ACF97EA891BC25EA5FB8C7C58310720CC40B8366A806DE9E4DED30426B1
+E7E9D9C145969B2B6D27CFD7F7BB7B2265E79B4BB865B0645209728891A88C68B20E681B4472
+CD3105C2238931FD048B43400A9819425A2071367B962C69374A22A06990EA59D0FDE438D552
+2432C1BDA7A54E52B594B662740FE6923CD04DC2E7B05748A8BEC182DD5079DD44C0FDE807B6
+BF4025992BC6B6F24C2CCFF8385CCD37167BFAC7934E521BB7327D8E88B018877D690F959245
+FB26551A75A06E6AD8E5B1C2363D2493FD947431050608AB63F15D1966D6BFE4F1A5AFDE5BCE
+8B08E91CF0514B4CE56E1C62BFF778159B77A5919DA5F4619F7A580D6053126AFBD8363082DC
+12A405201442BA72742E26C7C8D3430263C9A0EF34E0205065977E7952CBE0FDEFB3902D7716
+7F088103CB7D4A508C867077CEEA5D1FCBBC1AEE5F26AA7A85FAD4FA3C0D9207AF49B373F70D
+0FCBA87AEAFC7298793693865C156FC0E0E8E7B31AFA7C473275CD08B7BEC07BEEEE402AC272
+C666C61F5BA5C1C513DE5909D2998EF7C439ECF9926DB57E82772263979BEFB72DCCB5842BFB
+BA0EB1586CFDDFEF3A63F1B4FCCE3894E981D6268A62D1D39F918D4F296381D5AB356450FB31
+CAE01FD7F36718C7A54D503EBCB479CA191D5DBBBC08723B8279F2491931D2BF54BA9A93C214
+549F66C3C314EE37B5A9951D62A6776E6C7B4989BCA05ACDEAD7DEEC09BA97A0DFDAD7429E3F
+480806EB9C7A3865B5A0648530247CCB71AA31E1F8971D9649D6A430BD8753FFD295F30E4E7E
+CCAEB12F4A5D9B7902FF57B08B3ECB4593C988758CED4A394E412FD5A132CAC5DD3DA61CA3A1
+3E91703702388EAAD89443E70F7D037C9FA28BE7C8261EACBB7AF473EEDB0645BAF01C5F506B
+A85813FD1D5164F541E0E85D228E92E60D9BF5C108674C621D38E726D2E219411759E8063C2D
+2E64120C66BB2A8F6F00289C3BFADDDFAFADC3285CD6AE1E624A59D7621276362382D2156A49
+319A5B1E2B6B6D9B9346A59E1A4E9214C66E17C3EB5A31B394EE2F030C88FEBFF5C659E29FD0
+5F57C35B8C986ED1B6FE33ABAC7334FA0653DE6A935CD0CFB4F785F80DEE2D651BE3418CC83B
+18B5B4C176DE3263ED6B4F64D4395A48C2C5CF13B8D21D63D85E2228F6373BB766D288CE9D05
+AAF98D0848D1AAA42CA0629165C7417E47906AF4ACB4353CFE396B82BEE33EFCFA2531DB7237
+9E81F0389A72E0A1D423E1DF66772732EBCFF12D3F83DDF18C46A00297345166F3C3E7B11974
+D70AB02EC9629D4AF1F2857FE14D86C9B47B79AD89044CCE0AC09FFA4621608F7AABC07C0C76
+60B96C4EE1456B998F509F7D77C9C194A148C48B48738A6A0AC12E50137764914BF6696B7049
+C8F13763949F04D6A5302B9E266EB035A11FF5EAFD296F209A3FDDBEB62F1C7064CE0C449A70
+A29012E041EDFB71C9F93BEEF2A564FF2D8B248579769A81617ED8DE4F232577E0CD2CD650C2
+DD3329069017B0B427651E532CB6D7602A81BE2626EA6AB6D0C85D69BFD8772D62DF7F6C86EF
+67C8FBD17F2D2DF34DC52256C72181093E4C876D86C9A66C91A8AB1E01285763EA93EA6B7A4E
+6131497BFC536F69B7C02D28E4645CC6FE5D061495512429A1D3752BC565F769A4475E2C415E
+8CA4985CBB329D49B8AFD45498CA630C3CE56E7E26CC0C4FA9446D3A402D66E39E3E3210644F
+C9A9E0E4445180C672C32734872703910DAE90D102252EB56864F1CB6D1FB8E4A51335136989
+08C42B718DDFC4008264791D325E6633CAC13611B10672C263BACF0820F84B7134EDC9E2373A
+61C9C8665B25AB7A583A4983D30386AD84EA9C7E021F64C9E54F3F9B3A3D3267EDE3787DC949
+BFB2AAFF21B6CECB88129DE3200AD2693B8B454B18CAB17134A471540C009EE8DEFFD2C70AF0
+A98320EDFD6909B0B17C3F4B857D1FE5D963EDEEDD8CD3077A2980FD1AB6DD9AF5B151BBF7CD
+6B645FFC9C103E45552F43CB401BD5F084116D21C958E1C1450973C0C393F4BA75A9EB1C5438
+9CF6C840FEB5BFFF673E058D8738CE2BB8C07CF0B2B5A837948FED64FD7244D5B5C53303C50F
+1187FD6B085A9BB6E5DED081B78F4E486E0E17811A552AAFC50A69CDACF0838029D3DA87BFAA
+13D89DE7960E332650E5986F940C4493102DE366D8D574776E019205B25F16B6FFED5AEA7C87
+BB558497FD216D2937452B62D8A63D5EC72AF5B83E91BB72BD04CB724B4083C60D2CA9D125A6
+9DB5D2F4212BD48BAB37FCC933C471245AB99284671F9E3E7E6A9076117F5CCC8D469B929BD7
+C4B677DE5BD0272D78BC0434B4A1B4BFF267C4FB588631B1BC3DE1DCC912E3902D96F16B2A35
+0775BED06BEB2F1B7B530CE45337F744FE08822331E4D2913849A0890434088063B0307DB4EF
+A561810F9C2073B890C67108A95CA581632553F76DFCE780AA175675B186D24379074DBAE021
+89DCDFE396A8FC790699C3ED4B7799B30F119D60EA3754549A3CA44CC2F17744DA59E11550D2
+B0604AB45A2FFE69ADE126FF2F92CC75EB1D8FA6CF2C2FA2DFB49C1D16F8074A7D7115339E93
+C09265B38789A6816B12C803178A72C7C51CF78557D3BEB2D3D5F0A4C53511158145EFD256E7
+89DF517BAE8DA9B9B4C494AE42712EFECAB7A7D5BF4668F1FCC23EDAC598CC414BEE707C4C33
+1F02821C296725BD4F14F5BC97A15B8ACED9CF5EEA5BAAA216EC582692F7A210BE4F6A41E96C
+E3A8C65AFDDBE800E035BF0595C7AC0D12B87B4D409DD6772D125249F273108ABBA0973A7CEF
+4F1ECA5C9A17FE3071E54E68507DFD8EC6B787DBC547A90C43AD42856C26324178F2E6D2CA3E
+9043188372819D3F02A9125A3BFE766E7D19027CFE5980F5E1E1A7033A5BF236169FDBBFD2F7
+3EC6D56375B09FA750EB4741E101241CA191B49DE9C681E42849E23E17B81973E903F52B9AAE
+B07855AD04C30DF51C9D9B54F718C7A11038F8DF63DCFE6C2728E69E33AD933A517CB08D3DCC
+7681F673B2E17FC38DEF47E2A2F7FE7173C3B6922EB57CD9D7988F6D3A768E56B46AB8C7EB9C
+ADDACEFC45E1E245563C0A52F719FCC81C635F159013EFFD5432C697C105CDDCDE49CB5C5696
+3CFCC2BC4506BB906910876395C8239C8E5C161471B3A85A353ECA17FC9BC12B805B05D53AB5
+BEE2625109ED742C14ED2B08C5D19E7B4D9700D6D3191358D481D2C0C74EE8BDB1B7C40C36FB
+B823E5502F9ED6367AF146BC4E07B428F90B1E42E6D470958FFFB5C863E73B1904CE37B9A8E5
+90196BF43079DC61FA5BACA8F312E8E8A9B707DBF255BC5B3DC1DF58D374702DDB45265644A7
+BE315FCA2665192E5DAB08A6BEF085AC370FB81F2267D4D1E05BD8D69BD3D01A1498020A03CB
+BB8BB7A095F10C9D88DA27301FBA0AFBA4D3B056D38EE6A6BBC532B464630BDDBD4CCBA50C2D
+B04E49AB8E596923BA3495E7566268B226353E7DCA7B11F28E795CC39F974F426149E0C625A7
+EF0B4CEF3E3A5C0A964BEDDC2AB981E564817B963022BBBEC1BE0FAE2E05B6F5F41648FC17F7
+9A65162E31A88D0ADB71557142D8545CF2F2EA1A0362E2FDE496923A87C8578D5482C51C52BE
+0852326DE3D75F2C6C3EF3024EBEA779DD63F39BB8E2726A7B49A901E3BDDF9586DE02082B13
+86FB777D9F09DE377682E14AFDDDAC3E81F485B21CB2537130EB6F69A77B87A702E24BBC2070
+6467E82621211300687F18FC809E976FD8EF3932E5213EEBDB9D184D31433B353CAC68BDE9C9
+6DA802FACDD168E79491070754E5DE227FE2DBA96C51C16D8C8F0EA9B302A398B2F9491562DF
+08AA4C97324B6FF2FAC68A5D079AAC79CF77F0249A0D1C42F441BA372744951077F8DCF83A26
+575EC5A87AD6DD4F95EAA1B7F9393C27ACD5F79CE6031E808E13A55C3829D158D1E59E177FE5
+0E87F3CB39A81F14F35645FCAF56EB49F5EC78EDB848B396C72F5D928E3561240E2DEDACB37A
+994154940F412456119657381B52EAEBD728B026E87FEB8D7EA1EE49067C5D6BDBC56C578728
+820D583CAC747F243F6F4A59DCD5B91CFF0232F18183E8E25C76A2C7D53E6823899D43FDAC50
+4221799C56EA08F26BD03501FABFDCF4CAFB9E7E2ECF335D8C25F99D40D91B8C93BCEC6B11ED
+9671985B8BFCDACFD77CBBDEA246417FFCE021DE54FD0AE4CA7AA19A9458426161513A0F5D7D
+4BE2A6DFBB4D6D060E5EFB596F76083B53EBDFBBA1EEB78137466AEC283FFD78BDB6DFFF9748
+E47A24614104CEA06D88693EF2203D8792EA5333A697E7B7CB488C01FD76AE792AF0B8F88F02
+7CD4BC3EE5D4A09B968DE6B56DC55419A716DBDDB733F1B86A27CDFB8B3AC29DA7613E6D9042
+CE9F648A058E2321DDBC10E3374366D6BC4CD910DFF41037CC909580F4650338C9CDF3EB01CA
+E0D33DD1E1B41524E0F27A77337BEBB6E91542F599C9C7A1A4551D90537F985CA14DB562DC34
+A07F072202E86FCED29D1181A2B1D57CBB62BF6E5E7702A00592F8B018A12C826E569B7103B7
+8124D887F03A935B54255DCA6A01F433308A55A71B305EF69ED070CD7CDA1AED6BAB529BB506
+970B92DF62DE28C05F21C5FAB79AE4BF3A8B2865C408553CF4CC12E3DC69A0E3A683A637D2BA
+187CC5C615056B1853B349A1B88EEDCD9748FCBDDAE70100551ECF0B897A0CEC97A456FCB787
+49F74B25168181B75AD5F523F4408BBCCB011D55B83A63A0D96052FE523DD891664A613652AE
+3A979AF585C69FC4C34CE353AB52C5DF99D6908E1CC86D89CB6A138F42FA4D472C48E334F334
+9B2C47DBD9B6B6A92004B7D3C994EDF5B17F1FDDCAC72F8EF393838BF5280CEF41B803513605
+381637E38638004FF04BBE10C46A8135E0B5DB123C0F2F6453C0B648124CD0C7E379742950E4
+B7CF205BED93FF6C0439BB3BA0DA7B9C2C9FEC48B5E49E10F944D2F499C6FFD3250F8F7AC82C
+93EE7C6B63056D1278871FED6BDDE70B1530118D556696CCD90FA33010B35AC56176D0BAF342
+AA846BF7B1A95D98FB7C05D56B4FFCE922F6DF7A09BD8802CB536ECC23C89445544F922DE501
+700910AB28C892BFB1548C48FD3D9B0BA4B5F5CA44DFE67A8E2D42FDA79F9473FC6EA646483E
+CEFFFC0254E3F930C4732C8AA392E4AB4E26064CB1A185BE4CF0677CF1706C4DC8BADF32285D
+6D02D2C4806B6E0E2C5C2884F30EBF9BFA16BD7BC9E2B779173208C156927D2848DE30A5B3E8
+622528D9DAA63E06D14E2E368FF5331279680849F8D9B5FEB448633D444CE06BA1F3C8831018
+FE7BB9ADB9A896AA75F9E489E9B88342E424DFFE90976E4700E6C6EEDAE9BF6280AB78CC5805
+93347841BF10EECEDB86AF0CD461336515CE50989396665CE975D1F1CB0BDC36B619F67CBDB7
+B090B04F447463F62927FCD0E1EFA73BA22063732CB8557E27969D5945D8E82F4A5ADE094068
+6AC760EA8FFD127653F954F0287C74109997F1B26328FA9556C42C7B01F0A810194A9CF0D716
+D252504BFE2C2707456A4422E84AD233F4B32DE1A825F72C45083C7D7742B6168565D48AC1D5
+2F9192ABB0D491A9A0A9416420474D9EAF1E146B2EF1F703B2B33838C4163DFCF8242CA6578F
+37CDFD4144EFC3DBCE88D3754AF1765E677D670ADEB2FD2DF7882A4BBA95FDBAFCB9E09B7177
+CEF80B03DE222CB6070D7D7E09FA2297EC831D561A2069F6E95E9EEA70E41B126893ACB834B1
+778BF4CF338A63F53E4828D75ACC76E29EC822866AB6C5756BADDCE0E3181837E1F7DBAB1405
+DAA2231B88E176444594000F12C8351354F3A5722E9E4C376B983CD441D6D465F3865C8111E4
+7604C61A04CC59D185CDC89933B13B3A9A15360AAAFB18008FB2048000622905641874659693
+57164FD31ABAE5FFD1C7210275EF0198C74BD7F04BC02F9012A6BF7A8B9CCD76D4F449DFB3CE
+7CAA4FDB6E04DB1099861B53FE6A8497AE454438A0099C7F14AB799B9E8337128ABF5C523F79
+49E9931D233E8466029DD3B7CE86298700771876032656034991E213CFB22FFC1DCBD88EB6CF
+20EED29B983BEFC5889A4589428151A249BF85A7F38E5F70CB6F87A706A7A057F63CF366AFD6
+AA4A481FCF7F848B650CB9442EDC33673CD98F8F895F4D82DDEC9AB457CF21EBD339769292E1
+D17CA465997DCE5A6829C57392E08C8BE708ECED1A9AE4786EDA0095A05014D4AEB167C1D1E7
+83F9EBAEA78816BCD4AFE2E5D356A30828E11A5641344B3D46A3E8AADCAF22DB74FF57EBEA7B
+779B7C5DB027D6FDECBE1B0DA2EDF3219CEC627E64CB3142D303027F74E694A983B16B33FF62
+D1B0E114CA59B30D2261AC4337DFFD0273ABC09B955E740E6ACB4F20969DA27883B3C162810F
+194A9537F13E58865F2B4611D8B9A9C4A59586E583F9BCA6E8684C982FBB42AAFEB00F6A2428
+75A8D5246830E5D9FA8B479C36225D60C79390094C3820D9D20483BD8B28C5979DC27905528F
+F829C14E346511BEFCCB0CC2DDFAAFFC69FA01F2DD592B0A554C8BB1D3DDEB53D871DE3048FB
+9A816A40A5EBDC1EEF6725B59F6EFF26E4DA46360D4BFE49BF623955485875028F78DACE31A4
+B8F4771090B36B82E0E91C9F6B63DEFCA85E751F3A1E6D47FD674B6B75D34CF5D230012A2A02
+EA49017E9AE4E22440C836923450A7CBFE44FF5E90D9273FCE99A56CB0B4AE070410144DEA9C
+75282AC74C8D426C20B54D48BF5E893D9AED7CCD4EDE4B3EBBF29320E9F98E36571E545C09DF
+06B72ED2DFDF058446FE62D7F591326F7A0405718B97692CAC9B02D77A37662F0BB150102D5E
+820309D5E1D4DBD95606111A4C5D0E606F890732383B96D58065880C679C4FCC3F4FDEB870E0
+022EAA40D367A1CEE2E43C31B0ECE28481217A77201B361541D40C4C7ECBE26EE0263FA70942
+A9C4F90B986284113943E170F7C6283447E8862701E31BB28A72DEAA7669688BEE2939086378
+99339AD8C2C1BF9558B06446864DB50526FF514EBE3122A3059BF27307F10BA5B44ADE0EDB6E
+2693D7DC2B80E1A84F635126960FDD3B6110E84922D484261C92C8055314E5A2E8FB6DB0A904
+E291714B4B1D28E2F88734343E42C06ED7DFF193B1871B028E7A0AD51249B36258C0EF6A5165
+F5B7AA3061F0ABD6BE779D7E845D6606C9576314C04E98902DFC7CD027934BFE804B12F01E9B
+5438301E280AE84371CC2BECAA06AAC7A65BB6B3F7B642207D730AEFFD55ABB33B8FFE0FE0C7
+B16356E092BB0360FB94F1E8A2FE7FA999CA66B6675025CA605A65540F6D5619887D7E1A6869
+2B76EF901AABC5A15D529F5BFD446E04E95A1BE213EADB545806854ED5E346813ACC82C927E9
+DD5B45DAA1C1D57A2B451FE91CCCDDACEDE657B9E37D605CD4D6001FAAA843B9EA84917602A6
+7519B99DFCD39DA8DC60A1DF52A0A0C8CD35BF9069C1B8A534B4EFAAA4B42E932BC61FF11A84
+6190E9BB2111D13F08570DD9C9934D0C1DB1EC459A3BACC8F10BCCAC2BC8270B7774BD3065C4
+D146548D1959395266F420EA71C05EF4D37ED0EC391890BAD4D686D3D0994B98B9A2629C2B66
+88E453167FC651BC70DCC608B453FEA208329E9B93BCAC1A7C9C5575B43D32708079AD2FEA25
+DB03A13440388F8A4BF9C5D9CE42281284C0A1FEBE6B7BF94B58257DA32011484398DB2C2856
+23803D4E578F30BAE73A57D039A2CDF56BC2A625CBADAF7FDDC7744E8586D8CAE909162D2A56
+1FAF91099DF981C72617F43F1E8DBC986A1944B370DDEEA5CEDEA04C704BB45227680EE2A7A9
+1D5F71C8B429D5A1E22C557932A19B669A6F7D60BE8B5A1A08538D5396492500E8A30D8F085B
+9F1613E18FF8511D8F4ACEBC9DBD742C6F27AF4B62026BFCE268E3239ACF3CD0C54176F1839C
+9CE2618F5680353A0D234181172DB3A14523D69A204CC7A5EA4A9CF1D78275804D60D41C364A
+8725CB1B72759A30DC5E2920B76E1B486795CCFF14FE6615700ED97A1BD4CB16090CCD430640
+36FC003368B1E949D23BE8E7CCD7F4FC6F54BF25174B56B42B505E99BAD37A9868A92C29DDC3
+29F1D5A84806B9382870B3908CA87C3F840341E45731E5B7EF5B066AB120DB45D72B0E444BAA
+AF4E948B34D354C244263505EF3FA995E2DC1177B8EBC01A6E2C7AA5766CEE90D3AE7273D569
+87BB665A43B4697A0EB98C120EFAB3C61684520E148FB5227939D6208E30CA72FE0D661B9792
+C8656B44986ECDF77159F0ED52F695DCE64595A243B635A3B4D328F73D248E1F8D8244B2285C
+B5F6374E32B2FA7F2E29828E177F81938E2AA1C70EC9226DC45840F8F7CE4A377D32FE6C6550
+61389B70C4A5AC6D62FC03BDC16B1C15A79DBC46623501D263A948BCB2747E85EC1D0DAAC606
+206398A2FC008F369B673FE9C12A1D4D06D80D625F2412FD8912D625F182307FA2731435CDF2
+0C944C2ACD5094A89530A6CF54BA8D347B3819B31ED56C55AB6CFFA8C8C3C0D3C6034FBA9FBB
+373F08C76E79F50400FCF3D1F65CEEC11C3623706EEC7ACFE84B89510867C0B2FA6F25996733
+E4CC394872726138D7456CB398052F4C03705E27BD85EE755F1992D1C6D330A95B6D208ADC76
+D4CAE80A78C75AF6AE4976E564F859429ADC4DE87D26A9A6277E14016491D69C6B9368A6DBF7
+2C68EE9B4B32CDBB6A186728B354B347DF5D5F33DB9CC2F757B113EFC0FB491ACDBCBCD70D0E
+8E22322E6BD3336E642C6C48D6DD0DEC32C39D6E786A99702B83F644E3039DB0BC3BF91918E2
+41A1D20AF0CED35FBBCF8892858762FFDF4D855DC043CF348F64B9F0EC40B0D58F1A267C6567
+8609A29E8508F0F5367E0528845F666D3DEED15A880691675C9977278FE5A0C75C97F10E201E
+97D255C40BE2DF023F3842ECCC0F474782716CC0697D2305D2894B2149C94ACBD4DB97A8CC49
+317773662D6533D2E3BA293FF6EC3BF29B897723B200DA0875803B40FAD899E953168BDEDEC9
+75D3461618652733F9F1AE97FA05454DA0C39B27308F81D6624E7ADD0E909A721B0B5B87C735
+A0F81402E1BDD37437951BAE5735BD2D9C5A201DCFC832893AA343A6E4C8F879BF7ABA330F71
+AD22AA121C49015A6E1B4DE63337C3C9B4BFC3E8456D25309AFB76665AF8D3558841D95E1577
+87426288F3A108CC0388A47FC77672F9F837AAB1BB03395208BC7800F59D883023DE8DE4984D
+3550AC1E435A4A9EBFB9024FEBB3997847FFB5AC94EFAC7E480B15F49EDC4E1EA47CA691AF89
+E372FA1D51A68D417DF4D7011D8B129191F8CE9BFE2D80FC9391E51539A8EF2FACF34C91BCF3
+C5C81BB7A3050E0EC13E3CC2D03387335B307D3CDEC0D43A6C2F348C3820CDE916070CDCB485
+D1ED73B708BD083E4653EF4F4D1BEB104167E5C53243C72B5DA52CC360602297B86B012DAFA7
+BB0D762D78D7AC49D84DB797D4BC25A89309E3715BAC2970BB31C959221EE2656BDD93B51D43
+0644E3EE633EEDA51E1AFF403FAAF247B15DF007EEE990B21ED684D260AD6B76028F80D65884
+4D4E8BBE91DB43DF55819FC456B9402805DF67958AFD45DBE94E54968ABD3AFD2C456B785092
+7353FB25A936D9D554A21262A3CAE1692F978F58BA5DB38A55548529695BC0A455AFB4BE3128
+FE733C7234154F4BA0F00CE4ABC7C240C9283831E9A7E0BECA118792AFF6CADF3FA74A572F1D
+B4789FA83E7E9881E48568814E40E4235A2ED72E8FBDE71ED0FD40D348F66D08E56256B0EA0B
+46F54720DF7E39654B4B7B23CB4863AB341CB2045EF7A71A9AB550E1C14282FDA3B60D306906
+09B9A2F535670C9F7C6062684E1062BF1B1675288E002412AE17FB3D63125C4A577D3BB97C12
+F4CD925282737CE2DA3C2E11733BA9B5DCEAE115A0EDB3ACB8BDB1AC0F687C829EDA0022D654
+DC3D051BB7325CFB66F96C7ACD1A8BAEF2BF65C167DF291DF762720D39904AE50708552D754F
+8F43FC2D5B91B632D2BAF70C67D3AEA5CE731C380333E66A149E46B32412163C743D128F52C1
+24CADFB65399355B4BBD4C0A3FA7C02DE323911051DA20124B77AB931989A74D584C0F6126E4
+31C6DCCE725FE72F83CCD0CB35F2AC901501411270FE902BBA4E6A4C1DFDF12E2E857221702F
+F0749C495E170F01578BAB3827ABAD809BFED83F6FFB243F40DBED47F896DBD37CDB7D63FD08
+673E13DC24F4052E1551BCC080685ACE8D3184AF5A1818B4D48811F32DF210C8F36FB6A20C9E
+239FA888CF0EE5BD1A87F15C3C6A3E459BD006A69D2C027A09E83541D4ADDBE98FD665AECC35
+C311871A4A67FD59EFC06B2CDAE51F00659B4C4F9F79DD824485BC073CEA94DBD45CDE541355
+F7244F5B5BCC6C76D82FCD1CAD3E2D08175A375098DD8157B3E30184658EB500E224782ABBA1
+297432CC25FB54ABC54C8CD85667DD42BFABFDE7FB7A4E83107AF3AA508F9B20650AB6D01CCD
+AD374C67F31A666BC1F505A6D94C0C94E4E73EFF7D57FF69F4F145504F60A032109AD829EA90
+EC25B66869ED39434EBD3154E4CE7E044F01AB126454339B41193FA9618AD7B49CA2A9B2B595
+684A35A5534CC19A989D5F09DBE09830284F895A4876FC5F7920061B06CCDCCF168D5022CD6E
+AFEE4D796BE4B9BA38C0AEABB4B195B81B621843DB7DF74790FB46F5C07426C8A4FD0D9F99B6
+C0A26AECA5F89E36FA8DB06884AC9A3ABB1AFF9C6889BAEAF13CADEE3F0CE80E00EEA152BB64
+85BFA7B5AA02BEE1905EC4F666449CADC026BA91B9ABFCC5C2002950D35ED46575004D566225
+82500274E2ABD691D0013343966037685138B76C4218BA60855DD1A35E4505273C2CEA443018
+DB1CDBAE7DBBD948C96F5DB10BCA8127CCCAB09705EEC19399F31F3F8AA774BD4EF950ABD0C9
+1975B346E7CEE612B6A4FAB61E6CDCCDA47B51D499337B98B0B6EE8973317DEC69E6F1564868
+A50EFDC5086C806759EA40BA0F036E86C8E76A6346609A7D87C6FB2FD5FCBD9B1744FED5F412
+E3DC55E519A941C4193F66E6E4656D04BDBFAE608110803F9C72BA22DBEB7AF2068A1425EC76
+E6574311E3E1200DFDFCB4A0830AFFAC7809FFE3404AC5EE8ED43BE8425C1A13904B1F9D220C
+9A9A6B9295AD0B13BBD63E1AF6AEDFE6F54DA8AC585B2FD53AA94B2CB65377D10EE13460F6B3
+08BB6B3476DDA5FDC5EE7DA695EF118D79051184BBAC35EE74D6F046F17166E0F12604157979
+399734F16985182FF1BECD19131570B97A817C7467520EB148C3E2887020F8C09CEDE0A54A25
+4E0311A504A411407EA89C2E916F60F32C4BF8456EC370ABF03D1B2D95C991464EC963368441
+1664CB33186BF6F897706F7C500A9D0AAADAB811985D1B741AEBB6593FBA0E07E004E86D87CE
+A653B87CAB70900D1915CE3D19BE1969312EDBA894C541F1227586721DC33555FB28E81307EC
+F93F164399A58988FBECEFF7CB8D1A751B4FEE0AD6D2638B97016B2DBB034EBD0528BF06C08D
+E822804EECCD4C943ABAB45490FE47DE7584C569F9789E8C1F213C1924D196C63B3D57DF4385
+FDB9BB4D584F6C4B736D32F0D533C3699E90D1E54C3F4ED914A788A0C364F7D5571EE6F61D85
+E5CDF8315FDEC93DF38BC0C7E5BA9DAF885F99DFC9262F77BCD3137289B43D2C433111E8937B
+5CBF3941AED5FDF09ECD0971144E020FC64656C88A01F9B749770DA845D7F690D1C12141C7DC
+8724FEFBAE909D2E5383083402BF005598FA8B67301934E98FEED22625CC852AF51E7C647385
+A14B49EAD19C2BBAF578D35943A3B8CC943A863187AA79836CB71DD8DBDE642E1813FF3C21C0
+90F3A7BC39AAA1F5242E8BF68692A567578A4795ECF926CEA68CF77CD6B6520367BA3C98CF22
+D618A2764323297D1F2E210637FB6CC84674F01C04CBAB1295558A148F7F94F64900596F834E
+E0F333DF86C59200992C77DC32EB5091B7F5E1061F75EE9AC11D4F7C18D975FB2AF04245638F
+02FC7475556CC1BAC14F33D0F36CD94CA20CD24AB4B587B03D968175388ADA63FFC99E11B340
+AFC6C97381612C825A4EF6201B13C813BF36F5897E6FE3D95BAE2BCE401CAF0F9D7F1D0729D5
+0D6496CC99DBA29E2300A5307420DB31875196A26DCE6B59453A810B704FA8ED0E654B02C36D
+7D3D870DE8CE82532009C4E9F93921A7B088EE995060AC598E84F5E1248864269A2358FF4463
+A50134F113431776066909C2B52CE0114D3391142F298974219ECF3506BA1830359D186760DD
+C7E42E376A41B17ED88E6C429768C73F52095F491784661D89815ED8B71ABEEE1922DFAAC7DC
+FB2E427C480A235F533F523C7B4CCDF7D3E3E7C73BBE89CA8B04F89BF496310792B445122235
+F55AC0660CAD4476ECAB30D3FC774ECB381ABFF4BF4E50BD0954E240AA7DDF07924D53BEEC0F
+F8DC680A30F8CBE921F5BCDB02BA1CAB4C15143898C5C6E9DB4B88818299C4CE29F78E88052A
+A3D4F68DFD93BFDD1CD6328AB1D2C2888FAEE513E922320FF0C084E617BD1EEE5442DAE79108
+B34835214A330742AE9F99ECE561D29B09F611EEB154B1498929A4A6B3F09D63461489AD6EF3
+15AF77054026DE9F8120FDE0BA8012710C75266B9C310D06A842451C5A2B1AAC9433E08CEB23
+A872593F49C0397A1AE1A6443E4BB99C1E24AF85DFF91C97D4F400B3572BDF28174C5C358427
+ED6CF1645BDC283910C47C8C5B112802E549F1D60E96C7FB2CD6F0648F2189B7FC0FA2652152
+CDCFCB1B20367A2033AD1188576017E0F1272E701A5FC7BDEF08BC4104D728074573E40C87F1
+A2520B3D02EB8CB23CBAE6449EE78BB857E3EE7FA228F91E8007B848E309B38873EF3FE1212C
+1635404DB7A0BB06E21EC03E9BB358643F9E9972015362C58BB56BAFB7FAD31C60D0DDA2A30C
+5B5FA028896FAAF05A73AB8610BC521DF0226A922DA532FED3E6619E58D9F76F3693269506F9
+CAC08A56B7EBE8F9C8759D617BF44B03C2510C6235AE30109DF7DB6A7A391342AABE9D153366
+69F98D88DFB213F19140A52BD39E2E66BE39BEFE92B98D7271917610BCC240AA5EB2406570DA
+33CD0B66FB032241BB148A0F200E3937ABBACC878C934BB65A41D01805285754E9A3FD0DFAE2
+2C434D1D86783EE2693D3FFDDD895F8FA00F83417BDDD173E11F9E1E4119AF293F58B5DECA41
+B5D6F4AD983F668EC561EBD5F446B84FDCA10865202528F60BC54003413AFE4FE3E89FA6609F
+2F21DE8D5AE7D701FD349DFAE556D6EDBB906DCBD5B67EB59B2B22AA1C26726A069F08AE407B
+6AA179E313A4856F5878007837D6771DA41AFDC5F9C341F5505661DCF8D7E14A16E9AD360685
+7F67D8E9C62E41E5A505895FD0386DA34679735DEC0E3F71385009C45C1D2B9FC124FF7844AB
+CB056798CBDD336AC5462BFA9C012966FC34D9628F962285857C14FCD4FF243AA312F6177937
+3915880BB730E4F075DC14634C01317641C7E1C3994B40BB1BEB74DD2BED0D9D43DB000833A2
+ACC8A6F297DB5E7962430CC727C03462E63C2DBAB60F6221BF5DD3FFB0DDE89EF98BC1A5C6C5
+C59E6DA88A4DFA99F5DB8BAE29F26E34B421E7E74C2C05A8457F605FDB727DC1135AB363E3B3
+9CA32B2385BA24C78A1E0C83D42C513E3383B28D9554D2F5DD6F4BA1FFAEDFFB8923C183E35F
+75C57CF48893E4CCA18087CCF8C84795F8A31839EF6F6CA25CC154F6CA3970F60126B252465A
+76B1EAE8B240FD387AB315E1E710A25B339DC2C0706DA7B1C47AD15D5B6837F7DBF5A95E98D0
+EAEC6C121598076C6BA66E471C87F9947929E01B386BE55EFA5E6067CEDE9F54B0B278ACC43E
+56987848ACD559621B05C67228622540EABE7183DBC1305FCA26654D9BBB734355ABC4AF90AD
+7A7406D123A73695F77FB049B0CDD25170D8CF8F9A892D3636FB152688153F58E333849BE3E0
+45F8E18A4EEF42F191FEA6F2FB54206C981FFCF827757A22E75A7FCF21459E7C42FD5194DA16
+D0A33B32318FF5122EEF24C81D4C3B9391DC8D209EFF13FCB43FABF1FC67A712A53756EA65E8
+1AED88C0BAE56CE5DB00F2F3BBD89AB87B9D4C12F35FF1C95D8F3DBB7AAB138E3C387C135A32
+F00FED1C25B0F96895792B4F0276C3E2D702816D4A686DB2662E06451A3E1C3A5F6AE239B240
+505ACD4DCE12BFFFE205016956C6D6B986D2163AB20EF7B02F27F9E0F3518E5E51D7B8A81B6C
+6C0CE8A32956C435D20CC226D0F16C91662A32D05ED7F66B995F3753D05B91B030CDE048D7C8
+2885174A896F22FCBE7625412362C5D6A664D9BA41504DF972B79C442B5232B8EB90DE4C29CF
+BA9EBBDFE5B37F91A630559F797C22149AF8852C5EC4AB945C8A042E5DE43080684F4908BAD9
+69F290A1CA1FA0E916B6FB802C7B15D2A54C8AE8E4EDB91D926DC622DD5E42362B4BD9266222
+21607EB032181D92A5A0666424921456F2198580910938EBEC7902B759EC3B66A10C946E53EE
+98DD1D28970D44818C30C76FE735F2BEDE5526E47C64EF7D0D74C7564DBC64298D270B264658
+6835DD7E6255EA99C66AB9817F4093FD2E219FD9E67BBACBAC0A9D3E678111BC985151D46E06
+CB7B326E767512DCE309A0B40AEBDC854EE7A3060CF8418DCDEC028CE80577FCDCE3CDAB46CA
+F8A84A66E8860A034A390B444552D669C1C1BE764711367CC71152101FAF804C36E90D4E1BCA
+D89392929F998314FFEFAAC52FF96439F19C20D2EB9148BC6CD80C8B5624CBA39D84ACCD5525
+23A42A4301C7DE9AA5637F717C46D0E57350BDBD4F0ECF575F19FE94D69C213777FB5ADD543D
+485B47F3A76851E8C57AB9574A00E9A99641279642105707D75D97FD49E4FC53B79EEB0A8689
+E88097CCB46CF8497977406081C7EF28A2E7169589F595997348991FFBBBDD8DEE44ACCB0C98
+968A5814783927350D73DBFD9AC11A9F571AF46363E6709987C46EA207622FB319FD5519E7FC
+A3DFB9F784C1ECAD5472236CC2790015D4CF9F410004EC03AA9C247483F9134E742AFF8E3D7F
+62778DC6E9CC87469D083E9849490B66FBA43769044FDAD7F59EBAFD5B07A7FE75F064CBC81E
+F7023AEB4162A787F1C4D4005998D969DE4C7ECB3A67861CC5E13F56F1EA7A4EB7521CF0E282
+F513803658CFF5FA93EF5B15098FC2941FF4E0D6E2DD9CC056BEEF2C4E15DC0790291D385E09
+1D2CC377FF252EBB7214C2CDC948A9FCBAC418A93CEDC58375E3DC347F872DF735D0127274DE
+42F4E3709CD11CBB6A0320647CB97AE4531FDC8CE56ECA5CFE4DBB83B3C71BEF715ED3E0E001
+F497042D7D9859A0FCFFA87D37FF66BBD4C420913CF0600FA055C3CDD6379C8DAF78C8A03267
+EB381B64796CDC066833EAA949F74B0ADBE615F62C0517CE582A1DB047288C316A2B501D45A3
+62B46CC674C913B8980DED11D1462B8C03EB3D93BFD47D33661C4FC89E49ACDC09DDF08B32E1
+4F876BA1F0CE782F79DF52F10671BAE136A9B6D5120A011594F22864BC61600575D5D958678B
+94D71991D55E26263141A80C091A2E356B9DFC5E718D0833309431DD80F5DC39AE470E1120E3
+0A862464C96C1957C2CAA9DDB5FC3D1873C08A7726DECB5D73711461508D4F0EE3B3D9DE4BD4
+24D60787721A2AB50ABF2F02AD9FB20E483025AFE53CCA0A54331ADE5D5859D3621820CA0E2E
+3E7591BF4BC2004D0B5F7EC9A1141A36B0F1F9E32E46EA6C6730DE24D911748F83710F8A4F02
+A7F5CD663967DAFAA7BCAC3E29D900677EB2351CFAF46A773D363CB7D48943E1E245068B8F4B
+9434EE8F820B79832A8DCE28E3E36DBA17ECD3DC93F38F6BB4505BA7580B186C818A251E38CD
+7DC03FA7EA1AB8D290514909F1AB56E1B2C6584E86EF32741B58C79EAEBDD62F7864C19554A1
+9FFA1E73CF2C75D00C903BABA7E117E56B5EF27F53C94AE007DE0FA5726174D691F0CA7218BE
+E50892C6CEBED4CCE891EFA7714804AE54761D8F0379B063B8F8037A0B488A487FA3BD0D4B16
+B34FD4B3E52646AC3509C5D4C7C191189FCEF1D1131B4DD9799DF6E8A556049E28C5ABD4216B
+6CE52A1ECD99432D8316093235BE3D91885DBF346E18FA2BAFAE67B650467D23196FCEAEF414
+8A2D9BA1F44B3B43563450F006D5767D86D942710A820EEF0BF57028B1F1291C69118901B5CC
+99907C205C919C81E80ECEB1BEBDE1A67CB21D3D7AA431E0D1EDBC1F4DEE88E91FDA97DC4C2D
+49215DD18458B42106B452362956D407C064E29048513A2CD4A534062EB007216961ED4566D8
+CC190F990662F6C60703F35F0D8D643578E8205D1FCB0119C20D43BFD046842D885885127653
+65E7A007E770CE8E8F5B20FAF8B602E8291D93A7B56F8B2E5A952BD803C196AE98C27272BEC7
+9F806903EB3D3695782940138CCDBECFCC06B8A46907159095CCF0E792EAFC60435D33BC41C8
+A28617BD5A5228172CA784690311898BFCB7A7B22CDA56A53467E6421C413689CD41D59A3FD7
+FEFE1A8420695909716B8ED59AC6C3C83F5C0207463A369C369BCDBE4A9C35A49301C952664B
+AEF8BA31541DF5C1400B708EB3653AB8F8A7DFCBA52DB26A43CBAFAAC4960E4048EA7D164BA6
+ABE831276534750D13251D9421BFBDDAC7E3A6C61948333060390FDB5DD7AB5A42CBE7B00367
+5AADF5B52D8F709E45F66593B51519A4B37F8D0408554DD87783C103C31186E170788E8E4D5C
+2D1368D35C90BFC155335AA4585F371BA0D2D36C12F70CCB54DD316DF4A5B928CD36921BDCD2
+80996FF337E7AE9C4C0DA2ACB795614ACCA8BF9C5F5A270198A99B0BA923C041E65D34D346B2
+ACFABC9A68B059FB4EDB2AA741A93D768E5FF077C0CABECB321866513057B12B25613F5B1B34
+78334FC0FB18085E27A7361092F84F475BF19FC88CB9D9BA18AADC63AC383CB8266E01374F9E
+A36AADC06168E4772D6EF439FB8FFF2EFDDBAEDD8149168F8525EB7D8260A1E9165511AB194A
+91CF9358F1DF26499505F3F2DFE1FBDC2E28C0E5CB48BBCE6D03EAC7A02AAD6DEEC7FE18703E
+6DE77A677E9C2D6D56EE24769908189E8ACE09C55979830C1DEB6D7D00F931888C2450ADDFC4
+15C25DF4787597D0E6499D3ADB097738BD599479CC4E3488524983DBE2BF7CA9DA2DF888C2A2
+4A92B597FB8CB9B285A8201AA1BD6E3073C6B4828984E3EAAA4123A0C9053813FC43CD724BCA
+03CAD9E401ECD7FEBC2C9D28363BC8F058AFE54E479D1B518061EAB166EDA2B3A0BFCB5DC88E
+BA7AD44AB66A74099007FBEA682E45DFE3E6F36ED2F18527AC2A3443897F6E1CE8DBEE7E03A1
+C2D78D2BE6A6E7C6F43B828AF56BD8A86EDF9BFFFF971E1A9D56EB626AA2F112324A53AD874E
+1B3166EE3AECEB372893205D3F147209C9DE0BA3AADA432773E150617A6B7E4EA8E636F99BE7
+60B74902FEE6ECFFCFB1E039BFA7C15E9416CD2B5F0EE6EC50B42351B95B18BC1451F468092D
+4F08477516A287D8020C67C29D0CDDFC48838C99B8166C20202D3F5B8555AD9AD5DC2CB946B6
+B97FB0072EC9165EC95ACBEB8603D7DB6760B9011A68000687ABEF5966C357EA1E0F94767E2F
+601DBD9F9FC01699BB0743B4C369B7D2B009CAF12354D81F73F1B1FBA08623B38E106CB11FFD
+6E7A2B88F1F5C5C9380EA7159FF41591EB7E67FA45E4C4315B4708A5842A75B1B9C1CB4AC492
+C26178CB5DA50F0E9571F9DDDC6E223B34006EBEF59549CC34548F815BED1B123B012BD2A6EF
+67D97FD477B31C7F626FE9826107AA9ADEF80C1A36187E2453562217478157E3B0144158A69C
+658517D4CB79600C700A2509EF75A45AD060D0294AB4BD9A5D2CD590340B79D4D8408E856958
+D0F403F696B543195888A2DC7CF4CEC3A102814BAD5C169C3C911CF7AF7858ECC33716870D2E
+CCBA716B87B796159490F25C027D3F04717F355DAFD0DA4737B7F72DAB5D1CE95D11B4A8832A
+E3563F41BE06ADA6F45B38EC1BBF9FE0525FD46F0112B5CB0E947A701DAEE6664FD426271BB2
+B63E4ABA8FC1037F8BBDBF97D3F1EC8C98DB89B3AAFC6D597EAD9EF2347CD5B3874138BEBEAE
+BB2690B8539DBD000922A141A7A6A2A74BEFD03BC165CF3C7C3B3F49552193A9B453A37D4F4D
+0D9B8DB8896B27951EA7103EF7FCD483097A7997AAAC483762FDBED0FA53FCBFC245D32740B1
+759947C74E3B19CF333F30B131A65784863F93F8DFE7B7309BD5D5887E943804C3B3B8C3C4A8
+94BC3145AB7BDA6F33A0C72D5F70BD538EB8BDFA06FFDD053E6152B10A2CA929E9572783B01D
+307B50E86A189F747E690DB2D0B3AA5590FEF074A2515F9DA7635EA85771B45EDD4A5CAE324D
+81877E0B6E5C2157C03188725BD5924364E0A12350855E3B39C414127A33361DAA5BADDD1D50
+5F386ED72E80CDAC8B0D9CD6A92C687F913D617A9295F75DC3C4EB08AE11047AB7041DE8EDAF
+E7DE24796CCB9D44640ADA774FCDEB8244C6672A4AE9B282997C5606423E149C4553B9E3E23A
+2E03501A5A8BE7AEBC3C16B079C38D2A0690ADB258C414A44C2E080FEF8198107FE7B2A75D89
+B4B097E42AA237F789EA7727B2B4BE0378D5DEC71E7062B088A76E92AB2EA36CCA35E39D8364
+70B3FB7A7A1C07F37A9F37558C058582AE3F8EB48A11F9DF0A89796785D238393580ED4D425D
+B670687973E30EA79C5F778B42BAD782152CFC55E0D4E9B5F8F57E7627EEFBD9078A576A57B9
+5E676B0CBCBEACC8C685716E7A925BB69072C9C9F94724E389D723EFEA841DAC245B613A3AA0
+C6CADEE8CDC90C7881CE3D7657B16594740CC202D4E809F38F2CA4B219B928C335B51705B957
+2459489E1C176FA365D867A723B699BE25CE1B51DADBD150A5CFC7AF8F6FA901B7F32BD2758D
+A52601332EDD0E1C2D334B5BA3B85CCE0F17D8ED535A8E4A9E6DB4F279F081F2BD2BCB319DDF
+5E4A649EA13F6702A431E9C6509AE16F361E702BD804FEE570BD4FA7205B3B2531382FF34E8E
+F8C254253584CFFC2E955CA1BEC100A9A0A42D3F1CD1DAD265F9364D1CA695DF664856D6240A
+46CC6473F64BF2608E21A184A475AA145BD925B00ED5CF2D4E845B3764797F3BAEC5FAE70C5B
+AA6721A0C0571F5864C8B2B2B782A4EE2DA6A91BE91F0A90C6D906103B07CE270FE326711A37
+F52D3971C7B23EFFA647A2131980D6825B3DC2E2CDA81D696F9F84793FFA99C6B732939B09D8
+11DA361B87FF76CD0F93C965E5292B7033870C44A584B2D2D5725F3C3CAA3713BEB980741DA3
+DD6BBB035F2B998D8CB26FF81E3FD3BE87DF7501730B30ED40A1328B8608E0F0C50733EDCC10
+AFFC4960B25BA762068BC7F64F878E2641D6077EA532761DE0DC35195DF0F32E410C6BD0227F
+737E9167FCA17314BAF216B1A8FBA2DCEA54A863C384722376E8818D723F2EE9BF382652CE2F
+635A30498688A711DBD62E9E6E40899A848BF8C35F9D5D5646510113AB8630014D640EB1937D
+94654050B59DD22BF74B0C8A116EC54A108E6A6CC82E9874B0BE04191E9FA3E7F2072EB17F72
+3FAC1BC71006597B99794AD61A993C36D1E5250C996D380090366F1AE783704041FE9BE38195
+1C34150BE82DAFC805D10F73B6D0CF5103FC051DDCFC5AA91F5D7E8CE73C39EF9B7B0699CFB4
+0943BF950B5E6750C0DB54B476CEE4719AE515E40A8EBADD57F80A6DF09EDEA191B00DFF801B
+2BAB79C5657588ABB23584CEDB768DA618BD0B5D295A128DE877606D49A12FA73BC9DEA32310
+0F2960C76E6E8B30401572527611119C3EE06D3B34CCA355B4B202682277464C8B6B197BECFF
+0864FEB01BC53792AD1DF825A73E5F92B84AF103934A985D9C65A24FBDFA960325C7A73D2989
+ECAC24CB3F8EF1C57EF43DA81D0B64A5306837F4361D8BDD4CFFD94D6DBF7A5F5342464205F1
+B5EB6D724D9409ECC3166F3518B501750E89A9B7110FD7EFD43AF3C32E7B93BE8416B7A540DA
+EE25D1497DAFBE6D30995C0643431041D5B1272BBD2CE5FEEA317B42BA7E5910F75A91525C80
+DBDD061D053815C0B251F1BEEBEDFB1567632C46D647A745A2DE0AA08EE35FCBF4D3710C8F5A
+A6A9E0DB9BB0962CBB7E4177EF3FA776DCEFB988833B0CFC39C8C6B7C89A713DD018A5D35126
+4DF859AE5903A5757D5F039B3D65614F2597650BAAA3188D1AC6A8BB1DDE7DDBAD1EF9C4C980
+3A3148F3F4AEEF706A7094175DDFDAA29B5F8A012FB8CB301450B4E78B58259DE6503679955F
+5509F5025E4C799C55F0CF271717A296B096F03105E61DCEBF5D24698A96BB364AF38BA20D11
+7D59E86030C17A30AEB4B1794A6D72E2B62DA0DF92047D6985DF1BC950BDFB38AE13E612E183
+6DCFEFE4003A0F3CBC1A7C3398C0EC71A8AC8DB32BF58969635E46788A3DFD65EE12523B8FC6
+70A727016094B8381403F7762D6E4329319927DC1534CDB25F620D3FDE4383943D9942F75523
+CCAD080F5B1CA86159B6956CE56B5FB8A07B33451BADD7FB9ABABB37A10F04B58559BCE193DF
+AAD6A9F7763B11167E0B899B5B6E4591608E6B540A81CE22AE3C151A215F316E89D2D4F0FD87
+D0E803EF412DED542C369615852466961517B5C77DB3C39ABBDE32E1F503476A8326FBB08A4B
+C9F04C202CF5A1896BD05EA8BEA583B10E5B5AD45963FC490BB9A9636381DFA47B42132D80CE
+66F4BB1BF889DF9600B08038C1FC334E69A76D7FF65144B9E48D939E5497DC67D5374C4453BF
+B1A9FA6C6685F43B7BF9AC97298A3320DC74BBCD9A432B5D8F8F1CDCA9DCA04380A2D7B024A9
+B0E2B4EE3E1325B3C0C4EB2B8A20C97D5DBB73AB15166DE381F7F83283F69479EEE7CD091F8E
+4D6DD13C2E78E12FC59042701E7A3BEE3FBEC32693FA48EAC541B85465B9C62D21E71E463654
+1395D0EC9846F16D599B28E53BC109C34F17C2A85FAFFAEAFD20DD89D53CF5638F9978618B61
+0902E38A9E5A5D6C5B00264D30B4CBBAA2D511646B2CAEA65E716F31B1EF4F8CE618D9E61DED
+2BE5D247D4E5FD9C51819F2FFBF3C6702210EE5509C942E781DB52ADB4A65F2DB3688F419447
+0F33AA11384BB47EA644E48BC508F8C4F561FDE0B5879FC642A7A9E89F94B273892DDBC44E59
+DC35EED991B4F4EBF0C9CBC525C572CCE29F3C7EB313D067885368C2EE54760A151982FDEF76
+B90F50E763271B1FB242038148631DC2BA1A3204EF1206D0AFA7B78378AB031F9069B8639FC7
+40D165EBF123F69A5F0DBEC5D7EE2016E262FA4B611C383E2BDAC77812774DE0591248C23038
+B9CCD681FCB91DA754279FE274DEF1F3810617559F2EB5EB47FEDFDE4B5E6DCD68951E685AB5
+06EFEABB70343C619507C4B78CE07D198413323BD6A4A33517EEF599D6F71BBEF63FF166D35E
+9D2DBDEF74EBB3CC0A316D11167CE2F226F9F1FFDEBD612A2452934CDBC9AD1FE8FED8406FC8
+DFF39820D6F74FFE9B4B70DAC1FBB22F5ECEFBD7591DD4365CCFD300AD9544C492A899173611
+CBAEF46FFAF6F94367BA0FE02E198290BE926B80D9B626D15A0AC90D5C0B2A28D55D1323E0E7
+FB203AB131D783F6E3F878D1AD7FAD7FACE0A9A91566A636E6FC041986FC25E6D59FD6D535FA
+42C1952E7C0AB503A57DFBCA3ADCACF5AC748583F112F3EE9DE553112AD7ADDD4C15DB76F3A9
+10058AEC9DFD32C233D5B9498C33E7BD33611EE3DCCE65712DEECF4670B51AE23C42E2512B62
+A38D37201AD34EA9ABE5F0B99B223DAF1F96C3C1D4B2EF67FB0CE63B4E1C6EDE64A5D30DD3E1
+0A6D4B92CE81C7DC1EEAF96F1F1DA540F94D6C4FDFCB72D408647A4877B54BCFA2626D4E110D
+E46938DDD15B14A4AD6F8044B7AA6371CE2F2EA1CA4A13ED372CE415ED370F5C6B2EF218102C
+1A338C8C4D6004F4962065A028E68439AB20120B5846EE1B66B4396C8F3C73B9A65754D7CDC6
+A5AA7E5B4B7A179AC0AC55346E084A7BEB4E344B817E1131C2AE566AD6115AEB56C3169DEE98
+C52EE0AD6F4DDF4B05FB7A6B4D672D1328B539DADE8945E8E39873AC6331727D144AB149BEDE
+92D7CDA9FFEDC8821A61726ACD8326AE6EBE5FC4FDC885BC16B1D1C22C757B8B594B29AFFD48
+981DB54370FDA73FCFAA30DE3ED760B144404F38A4AC17817E52B0856ABE4459AA3721BDFF5D
+2751CC876C1BB1FB64C380DB6181E2F3729F4AEB99C49B3D128D2661B2050DB77992E189DC35
+5BCB9D15A819D60E831038FFD66708F50B2CD66B62BB8092A13D012FC70C815923E08297C7CC
+FAAC8EDEB41A52F041777881D67B19867C4B766C5BA0D18551CD1471D53489D807286A6BFAFA
+46271735B699E48807BDA0C057CB88AAB5279F5E6F7ADFE5F34BDF3C81A1C5C83DF44D07CBF5
+464A1E0A8F0CAFABFDA5992B64BDB9C13E743F44C2F4AF0C9A69503B14D0BB12D467F62EF24F
+8EC8BCA1A1D2E4FBDDC856104A67946D4A87C08F38AECAA481D401A98C488E622CF8CC0B3205
+1AF70DDDB4E73888FDCE173D8F5FA75062B974794E9FBD6C3499A3333DCA75C681C38345CBF0
+75F6B8F49788DB4C4DC96B93F7A166D33BBCF7BD27778ED38290A439C1974AB944D04FB6151F
+DDAE7C736F1B0A21DDED2DAD0AEDDDFEEAD170E750F81B750ADDA463B2DA2693BA21197C9625
+1CA59938E82E5BE892C6C659605C1558A6FEF114E30F0FDB712BF1DC93F2F3D876CF694C9FB3
+1622FED5C30CFECAE5A637013C3036CDE5CB296A8710EA0141C47635B6758756CAFAB2A04B92
+05564C82BFE89649B1DB5D5F255F925C754A4C3E81D0D040F6A5CD9B28D071687377437A47BD
+692AE6867C940BB2CBD3E93EC8BAE25406DCCC2ED43D1F3906E39FB01E1057A837F70FE104AF
+10E6AF578B8F557B4522D7BA0CF1C553438B7621921D297FABBBA97103E7F6BC35E48F745AF5
+A1383F71CD46EE88A33F3989795F802F0CADD26839DF33C849032D7ADF508880B4C1252BF9D2
+3F025344BEBEBAF35333E02DB37FD3F64CA9F17B789D55C7CE6DF7512660D4033C85C44B7144
+46D9EEF2839E3D953F81BBB8CCBF7F4496E197786F43CD1CDC39602C40B402B7698E2080FB9B
+217433D390BEF7A1B637EE1902D810B11BD1CA27DD4FBE2C58640A91B0229FA8F4C45D5660F4
+72F10704E9B9970CB77CB14036C4D8603098B893DD139735CB18945BE26755506995DCC27E9F
+94D1B63659B8399E9EDC933DE2E3DF9D113C1410898E2E7A2E40736A7FB7E9979FB0B5FFDCDB
+2BF0C4D699EEC0B3D55B26A3FAA6C9E9D06ADB9F4CC1F14B0708986DD9F86601CC4CBD392B36
+6F8B650B855919C8FA8BECC44E5B1DE3DE2453FF62E0EEC0F0CF86D2E165F1145D5E8C2EFBC0
+9D96F537505EB861BE6D21E9C054C39627C804F05966EC1DCC8FB8558696EE825C11BA95CE2A
+7EB40507EA5FA7DAB4DC07BB973B935DF8ECBE10DCE441B82E982FF92264975D92C6A4C7705E
+90585A308CDBEBAC9B467522015D492B0A705C10F6C195196AE3C532913ECF9BDF3389A957A1
+D6F552BFEE7B1F9648915AC3542FBB1A528CEC05370B2BDD7542685A8E4ED35BF2B8772EBC5D
+A1FB2E09782EA61A2B8772939F13531140277AC633BB0AB6F2D237399C78CA8DE0E2E271BA8D
+DEA24B3ECDB0F551107B3220E2C842F8082A75DFFF85DA55AA2D40518D7401179E6BC7E033C0
+92E5F71D8A48F571F7C7CA5B6D0F5E4A109F39AA559CD30EF032766F692E47BF0EA5723C7758
+A1392999A28F042005B7E667E62A09CD60F807BDADF794076F23211196024A47580DD9739FD1
+0E53D04EE4EFDDF89FFD6E07F107CCD9634874E156849CCCF624FDB9C85145CA2057FDE5CE44
+8E4510EF1B3FEF2A57E0125B37DF08CF935EE8FA0BAB7CE745C8CCFDAD35CA730A284C1DB31E
+F26ED4B5C397DDBB2A741049A120AC4D8FA9A2B91D3EEA75D61B28B19FA8789DC945588F17C1
+4A81BABD6E0E5487E2BA1AAB46994D69F7E5A928CEEC73DB5317B3D58033895595A1A2188E45
+7C1C8845CD7312029093574CFE59D8C25DFB577C949A5E4E56624BF9942AE6F8970A1BAED98F
+135CA7565393E6C4F80F1A81930FC3F90342EFCC0819DD02CF88343D4955670DF65B59AB5F55
+4BAFBF5A9404241A3274A7D2C90A1E49ACCFAE2FF5D9624E708A99A4C8104B76F8EFBA7A4753
+05BF47661FFB2FBE93858CC5039B3279626A7F7B9A1E210662EF101252FA4F38DF01407F143C
+007DFCE4FD95CA4FF7993FEB03B7CA5A6C1B6C770D684037AB195AD689100484E7D044834519
+7D16231C3C129A3372574B1D261B458247A6604A8C3842EC7C6FEA54AE1EB01B6E7E922F28D5
+6566CA27879BD0EC14C7DF9562BF8F934321335C26C8AD8477DB8CF0E267CF8BE322758CA333
+7F010D2CF9C2C9BF88B51ED703E036B0BDBBFC3F92D7E0B4601573A0218552C5215532E9DCCA
+D95BDD11A0A9ADAE050C87364075B8072F819F49464E1BFD5EAF51EA922287EE507223F017C9
+E898DF5E29F57AF38DD390F93F425BDFCA14492295773B5AAB849002C613A2B8BAF474C7FB1D
+BBF6B1599EFE3EC5A49F72A3B69F1F9073A5CC06E2B29FFFA1B689BD8FDDBA766254F68B1D85
+C822EC842B897CBBE246CE8CE8BD44E718B10E0535423DE475643472152C4C607486AAF92A52
+574BF6465DD6231305CC359045D3641076DBE7D55AD508D7383E5FAE63A768AC188DE72F7F29
+4211E87A36F2F18015A3DEF4CC333A25926989AD4CBFE49FB9CF9FD2D9BD167117882F707842
+DC72B1932492BCB7062D86EE51437B696BB597F657D482CA902E779B52C727F02010A21C3D17
+F1750D4669743288DAF186CF289C59BB4E0AE268FC305ED2CD69EAC3047C1AB6A6751DC634F3
+71841623B74EFC893094EAEBF841AC1F5A160427F3D810623098C1F36E0F553E51A11B0248E3
+2E1E9B3B092FE2A6B785BFFE8BEC4F8BCFC164B5D7623C123C8C2087F256E2F9D71C363CFDA9
+D097D8CA2A02E48FBCC9BFD5DE8ACA3D8461D78FC95CF53AC18EBD48E959E44B1039E84C7426
+576CAD6FD4F07A9A328E86061E8DABECD9D87328AC532096DCDFA647DE1C049FA27EE5BC7717
+22195AAA84338E6D63507BB45B560220FB24F93DECE0FF3B043D1912B28D4D913888E424E6A1
+E139FE7A7DE79DF5DE84E31075A132179ADBEE07F794B129DE7BF93E2B45BF0100949B359CC2
+EDF8B9701B4067DA2AFB6AE00EB03B79F2C0EF420B42D9FD22AF9FA5DC68BAF29DD90BC13826
+2563BBECB07781B9A9FC1A98A53F9036B10C49123CDAD4EF342C5C0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.1: CMCSC10 1.0
+%%CreationDate: 1991 Aug 18 17:46:49
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMCSC10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /arrowup put
+dup 175 /arrowdown put
+dup 176 /quotesingle put
+dup 177 /exclamdown put
+dup 178 /questiondown put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /arrowup put
+dup 12 /arrowdown put
+dup 13 /quotesingle put
+dup 14 /exclamdown put
+dup 15 /questiondown put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{14 -250 1077 750}readonly def
+/UniqueID 5000772 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACEE583A5C939393E012707B47E0C1FA47D284A1EDC
+9D01A497D772BCA8C543388E6DC0D1E2C4944740470E0914F65EFB0737B0851B2BA713A9A00B
+36D07DA6BCB52920B9B59EFE587734027A3C5E6566AAD332FE6FBCCED1417802822A3B81D618
+7875263D6BBDA04BBCF6E4870FEEAD60F104BB3C5A766610DD11AEA64A6B107B0B04439FA288
+8B8CC39232BB83F7695ABA81F0260CD5248B9E649CD800BCB325468C79FFACB9CD3037A11206
+69577889D67FFF57549064B985D67EDE2FB03272083723541051EBE936EFF01A4AB3CD845D56
+5DFDF25D9DDD2792DB17F52F894BEA484480F06C832140FDD6C3AF0EFEF0584C6B78B5E2BBB9
+A752F10581FD1C48CB498A822AFB18CDDEBBA34695B9B418010368FDFB7BF758D50F3AF03360
+B81C776325C33C9C81130B1E1BE840CF68C71FFD091DCCC0DF7B507FE8953DC3836AF0DA08FF
+9FF3E9CF7288D9EB8BAFFFAC546A0FD987AE8E0BCF7B759F4408E13524F478DE5896D816CB0A
+D2904271CBEC82A5CA50F0598502B434ECD94531B4A65181B5B3AFCB650904B15157737AA438
+6F1A7F1252CAF2ADBD5C8162BF3B065C01CA471D520C884EBBE1B29F9549134E285DEA2FE158
+C15A08A744CDDA00BB6C62158262E24702803D9E1DC1D3A31383085631154B077FC20488EE3A
+A03F47ED2766644330B94133F2F9389B99B896D3707D1C5BB227FD3BBDF3A6FF572BF0716410
+7C7A1C0710A5C7CFB67282F9C238100FA138B75C553D7CBEF17E2292A320D3D86A6210E6E3A1
+E590B10DAC6E177094D5DD163DB623D7B344478752F6F3D7D5B3FA92E6BC72DC6FC343D2F946
+9153E3D14C5A6D6B1D9CA52947B789CB4CF6196A02973AFF0B097333F8D615C0A1726AB7E31C
+378EAB77150FAA28CCE535AFE3AE5798402CA51CBD18DEDC2C435281D0781351DF30F4D11761
+579676449AE4A47A10F677CDD31CA9120FC2606A9025D3CC09D58856A9BBFB17669F706FF8C7
+EFE37A3656C9B20609CCCB58B3090595CA5666833F2BBF884AAC1CD632FCE69B4E0EA2E0A25B
+9C4D471F0E322E094CEFDA321359FCF0DDF32442A0321E628D1D3EADDD01986AD3A96710C071
+C973C626B510983F613094594116E0EAF9BE9014BD5085F4531548CE6223F7BAE2F714EBC7F4
+8409FB687B359734324F1F394EACECA21B577E347DEB31D178D42F11D8A7F953724BCE484E31
+B57BDBB70E868EC6AC77CD62C550BD7000B850768F1D5D2ED9BC5235FB2F12D9044517FE0896
+84DC795CDE4BF647535FFB85F222087852CE17EB8C6F9E0123A879CC52E5BD0775097DD340C6
+25ECBCD90EE5A190DAE0055F7127434EB0B7E868CC925B2506BB2D265902AFCBD6F0BB980755
+BF7EB02E30089FE6798F5876E3CAB370D813E476028A652AA40CE5D0431115B283E2A32C176C
+440032C3B1B019AA4B0E45335B845FA1606DFB85A7172A8913839E346F10E45D97491415DE39
+CA15D8D1960C52C1CC9A18DE77C1B52CFDE55EA7A5D3BDC5709CEAD600A33849B7783812D41F
+5C5606DA815B7196963C86983D13B45920BA02B6FDC87D23CE3F13A1A9E6B3E5905DF7940D25
+FBF2215CEE3A9B8537A14B7927AAEE1C5D4A694764D814DBA1CD3C3A20D36AF6590733C6677F
+94EE4652145931D14FE4B6BD00A701B18892D4C099576F800D8AB85071EB85645F7F2940B0A9
+6E1FA2FEEC7B5275F57F4C6F42602FF9D7BAB3B596FAE13246BA131A961B9DAFF651592BBB35
+EA680AA09E3E1C57F6BBFFB5DF147F1FBB9CCB6CBBB75E7B5B54BBDDDAB4A790334EF52B7110
+31E5DDA8EF33DE92D6F62C7DF58362A0B7D3B29E739C3459F6B0585928B7DDB2FC9CFFAF841B
+0B4A7122FC18A754D3C23CA0D31828BD1998A3951C4ABB8F6D2651F4EB97D5E5690CF19FD1A8
+1EE1AFE79A6A02DA0F42A516E97F11A58F1C2140B152490F7D66FD96D7A31C1713FD4153E46A
+D3D6A407257BCF51971CDDCE5EC460CAC1B81D6827AA5E31B6D1835C73DF21CEE441357FF14E
+726293B2DA2B7383715412A88BE158F16E35FCAF344946C4D65EA5C8FF5B9B84919533DA823C
+F2A257D2D40036EBB673AAB7A200F23E4FE29EB1B676902940A211BFE1DE9AA333B26B5A648B
+C785DDF9DF7D36B9F88AC42E3CE0CC873EAD8AE24460D97722AFB9F82D552BA88BEB2FEC9AA8
+722CB9A0508B5362790D733A6D038E7AA52B041D37FAC6D5769626B9D909E099C62242F5DA9E
+5E405F9A49A43E97023B4760F5105C5FC2AB70C8CBED371CB4D7511E5F8298552F60D2A82158
+90540CDF9804E8CB4BC40C5308DC19229A40B66105C8C85DB9F37005C6C5754A94AE459B587C
+223F1F5B5E2EF86B0F23A1D6C68A38EDE425FFFF05649B5297D78336974D688A47F58130499A
+D7FD157D95BFAEAC78EBA4121375F3CD783187A31E132C7A084D1B72D0A61A74B5AB6784E03B
+A0922C93055A8CA4C4B804025CF385103820D3D951F4050A92A0D075BF0CD7FCF56570B1A215
+B6DC1D77F2E3726EA406B6E6FE82598A12D57E125FFC4A4D9C75DFE12AD03B30C7261F74562C
+52D1BDE03DA438E98C57D1073B20899781D24A3514C7D8A4A9D9F78E54CBBF714C03010EEA3D
+0E37BA5BEFE9461ABE4E1B03E8EEA1BDBAEAE3B453808AE47F835B0E93C35816E043CF565F00
+4B273E2AC64F11A66497C1857DF20EDDD7DF49DE8B7770D9D15DA4D72B799994DDE3125C8610
+BE1D97F9DDC3A9ED584A6A4AD069B5E830761F21E30EDDEDC3D4B8F23E8F0D5C789C5F66E8EA
+F42E0C8C467E25AE11B6D35C3B00EF69D725835A24947F3E59A2302947D5DD2D891CE2EB8F1A
+DFE55C1FDB1C66F14C0432F043F5B4B26D6727C810006B2F02E03FD3D57FE64EF473277946EC
+75B7AB7F66DDB0C594DBCFE9021A1C20489E0946E28CF93A87559E80A52637CBEE7F36A22E26
+DDC5F3CB212A9ABAB501AF8C50508B4DB48C11F283A9B5E0227749C2B96320DA96B06FFB7015
+69A9A7B09E00ADB3DE4EDD763CFE778701512454E3A849190602A70953A0AE160B73B603E5ED
+C9CCAC5A84BF22650175A20AFB8A55A36E0856C77E5067D08DA5F0A2EA325FDF4587741B6C91
+C876B49A7BAFFF44496F9D025C5425B26DF3513A9DA3D297A15E7D9BA63C5D180999EDF3A4E5
+A76B17B42237C708AAFA0D8C8726F6115198D271B2CE203316EDEBFF92E109A83F70FA3EB53B
+ED8AB09A4C98F58A240408C81E6DED33FC2D27C9F8A0E0B8DDA975DC503647599E6E4BF9F965
+8A5138B5BCC19A15B1288CC743FD6B3B9B1FA44B771A26D63C104F8423419F809F687BDDE6BC
+048C49922117EAAA47958C1F348BF4F8E4F1C65F622BCFDB5F727246E10507337BE92E7B633D
+0859E2A07CC5F3C213E2368514295F026B920DB8BA3C4548D4077DAAB2B39E968D511EDE30ED
+7146C2F0BF080BFDB16460251467881DBD64556C166E8DC35DA022265B8C1B36FD118F649267
+90AFE840CAD382EEADCC2ABF4C81B591EB9ECF3753466E3ABA4EDDDE18D0617A999593DA5287
+0DE4581AFD46CD544AB5DB22354EE972B6814C93C0D043DB89629A183E9B1B30C2771C8F3C5F
+4D43AFF1AB7BAE35045949E5D9E72EFF1FAF730EB75F6FC04464E75F3F030F22338DCA6AC265
+32BFC0DB8E0E512C20174166D4CDDE92775058FDAEA1568AA7923002A0A208753C83E2892244
+F22EBF73A9599E945959F04ACF038BB6718D11A7A3DDF0A52F3492A8992184665E1A75EF7D66
+B40A13789B390596A300F89048A0CF9BE97525916D066926307FF3A4B917534FCB2E24AC4ED1
+C0B6F40370349554574D7AA4060A5392646B36056AC90651285F280278B67FD05D335F65396B
+ABC17BC82F96795E5748E3156787DFF415C94430A6CDE68366A355C537449A8C81F8E25A2A02
+1F9FE0A193CEEEE44CFF0975F3D7556AF10D0B350E7F165411D411D01E32082F42050B53FF4E
+E2D2BC51707282050709DEFABA9C5CA5467B6568657AA7342D648C02F554D4AD11212347D1A0
+32F9243409D42D1276062FFD0B2F494C0559C3A1D61956CD1DFD37060B9222E65F191013F8AA
+4E644690D723048B191769562E75ECCCDC4BF385A600D654059DB0BC4D062B01E8E4F9A3EE7E
+DC5E14397C0FC9530FEA2A22AA38F1FBF930BBE9A483F660520D48CDC76E55860FA0856C51AC
+28C22732D0F3A246ECB225E0BCE7AAA172C2F5996FA23D8A4AC4CB394830872A81669474903A
+AFE6BCDAD2BDEAB1E9A6DE2A2FBBA4C1574DC1B358A2D273CE3C743C9723B010504848D107BE
+3CC5BBD36F2D180A3FCF26A2F765B2A8DA684E2D4C2CBBC5DCA3E04E41F4A5D30F0D531B4499
+001176DC13EC2C861F51C6CA5F2B5F0A9A83F45AD508681BEF82EEAF85FA96D8BE427A0DD726
+C1D08CB21E5DFC3C08DDCACE9DD01E6D7B9FAF919C065569A82B7FAAAF2BA072157E8175188E
+627B3F547113AB7E8E02232A1D846300B8E62E3DF553B3B3FA1D4E50D7D3737E25E6DBBAF69D
+DFF940D45BD8528C20E81EA4E89EFAFCC2C57120DF6A777428BEC6A06416EAAF5A93303ABF80
+A6C3532A685101E3CB5D1E10A651CFE784B2184654A2DED9F0542B89893B167D8DAFDE378147
+923E76971BBBD928E40909CA71FF63089FD3971F63DDB4D5780EAAB2074EA1791C48C34D3406
+DC9FF786A242EB29BCD29A079076E479FB52D22CDFF2F7E6D5F5038824843AA9C2977E6C1BD9
+3E28938AB82205B7D8B59E010CBCF2D3F2C334FCA14FCEA8A215B5808D81434B0D4410EAB0AE
+74D3032A954FD205CEA711155FEBCA0BC242AB76A268086665011D8BBD0B2F23EAE6E9F43B8F
+968D06DB4F1252D166CB7189EE0070B284479CA661D0C31DB1FB7C5DEC67325A2BE79D813D21
+316BD22AC61BA74D0FE1E448820BA94516C2AE4612EF89F7232044362CD9A4DEEE98A4B09550
+EFEB8FCCDE8BA91B04E943317BB85D480A1613F903ECE66AF1BFE49A9B715B241F1C2B987EEA
+565E9AD334B9054D7164A8EE1F9903D930113590CE590BC87174A860D205DA1968216F3E1F6E
+D95D9B39095851DA32C59F74D3C6EE0480A4AA01E008C47D4E2B15668C1F26725ECDF00660C9
+5024B7F0BC046B99EBCB65258D1A972589BBB87125F3C5B5FDCDB63117525B37BCC4E55D30A8
+32F3161AE8E512EBD89DA60242F339D431B007E80A0F9EA3D916554997906E50B7DDB7DB65A6
+3D500BE03681C88199C46716EB409D7D81D32EB29340A3343CC4DBBDDD4EF0A218CD5875B52E
+054DDC2378585AA710BB0C2AB17C2CCD6119C562F9A72741288D7224F99EE1656D77D9ABA348
+A7C9CBA203538C665A1827511DBA615555493653453DE640BB37C25EC841F696020E6889AE09
+A2F27BDEC4866583B3CC6EC5A634ED6C5367E80A2AB7AB1D0EBEC692C0E19E23D992427F2D85
+9D308B96AB630C16EF11DF06D24AB84397BB31096286AE547BC9D992AA8A8CD5F04B032D0FD2
+3FD6C19BC8D11672CDA88E4E55CD5098432D42847CC25F066A0010F8098E3C218026F89A1CE1
+07866455799C9E67E53A1CD62CFF31293D1E50F5F3E98A035E4F0ABFBAB91671459A0FDF3B8E
+2CC0CC085A6AF07CCF21783FFA6C934F890DF09585A27452A782C3B806A04A59A15903369ED7
+E08918FADF02FFA419DBF8AF49423A3D68E76B63E71A294229275E8BF28D6FFEF46F6F74FBCA
+3A516D7EA5A8771EDA69DD417B324A81F30C51FB3C4E652807F3BC4FD35EC5D38071432D9421
+F6CE19FA36FB4CC60AAB77E4426A2006C6CA953DB110D90EE6F71414F0FCD6B7BBE55AE3BE7D
+8384D39C05A858FCE08AF690396D8E0239D1B43EDF9308F01816E471546EED2AB9583582BFA3
+C5DD1B3BA2E28C43484BAA75E6C4240D332511F107968F2394282C810DCE8454E9BFDB3ED702
+BD156CD9BDF22D045E02A65B82BB2B20B31D5FD5E8DE78149D4CC042BC739828B9B910829C02
+9C0EB05F1A4175CF00E11C63E76A5D82C99F9C05A51DE24CDF0F35DAD07017B149E98BB0C061
+999805FE301E1BAE97B31890C5A5CB8041BC2EE940FF0463BA531C57E2F5A8CA52E25B4356AA
+72A9BD890FC42DA8B5D2C7E5310045C856F67E7DF28426A7CA000509D1AAF141ADA652C805E7
+D469DB01EA25782960AF9141248F1F44C3FD56C150FBBA520FC55DEEF78D0698646EA3CD050F
+CF0AA2F159E5D11FEDA50198FFAA40EDAA4CBCB355F76EB1B82B451A8BE87140E684087EDF8A
+A135C33B8133B9513268A73AA8759EFA14DFB6FABEF25D27C8DEF81EC0E66E39B36FF615CBDF
+3BD3A0B8BFF3FB29BB73013D8238DB26A14561C166881EC52AB181417072BDEFB1FB1A20F842
+506D6540E2983333E3CC4B80EAC072EB36DE332AB7A6858795A8AE0D08937D88DA50C017B9BC
+4C4FBAAAE7C1AD8E690499D13DB25785D949098708F96901B089A3FD11E549B6460465F63502
+2363A5E4C05CB87F69736CADCE0F274A1470ECD4A0A4A40E8839511CAB64968B482C5631BAFA
+359A995260A3AA93FE08947D0CF649CC663AF14C04CDF6FB3204FC5A279724EACC701EBF5027
+E450874828ADB25D8F0DEEA69FDAD0782D4B43362F8E1282B9B28A48D55098ED7F1DB51213D0
+37B86E9BFC802FA0DB04812004804FB96501F2DAB1E9536731C933557A22A6C6358C335490DD
+D40287F67DF44580256A371D39FFB8CF44B0D863016F48AFA8E276C56536AD16BE6A48FF5DF7
+588CD3E7947E4F61C744E5416CAE7C60075669BC40F52CB75264E1F8CB053818057664B5F1C4
+CE750C8270D27395BBDC0DE614333138593BBEBF998B557BEE443C22723668AB0A51ACDD6A18
+34C296D2312CC88FC5D0AB34397F9A236A0D5DF8758B3DDBA6D3467C3CCC9E78AD4DEA02ADB8
+08FD5D8D17D6101B6CF23E199BDF3EAE743D2FD5379D57BB8F965987C88D2EEF0FD21AF54D8C
+A1F809CE22D79A4EC728E926C7C107E9322535E743C19004F1A591DF2009FD506D3C3D03013B
+7D5D94A1C1C9A37D22C91B64A7C6F57DC986286E7E9A060ACB80C692D9DA1F96D35C26D952B3
+6373C5A1A8A47ECA53FA25C13588439CB1B1B3ACFCB1CB1C572F3A52E11B61F359A8D85B3D35
+0CB24A84A0357BE76399D301432D64CD0F6D3F45761754F8E841F7491481BE04ED1F53AFA4E4
+C15395459699E438B051D2DCE9CAE8FCD6956C7B2B326082020B3B12FF413B466F74D3D4D7DE
+D070BF87B5AB7149068207BC5A83FFA8618B923F2EB4A69135DBFE89B9E837D8BEBB6BC35EA2
+FB8CED232801A50563C71C9E6F01025044C98C6B0E8C1B3A6A431DECB9E8B5AC9506021F0B0A
+BC7C0E8497F0930617A8C9108C0FDC6D6D9FE6129B7D58509C9E2A3C45026EF21A1B91EAACAE
+4F43739D7FDB1DAE60F3A870F79AAA5BE1C4994A964677184385B9447D33F6D7ADDAD33F90C3
+3392BAA505BBF99CB65D222FF31A575B59EB0F0C1DF916535C2997952FF2A0F5CEC9AAB219CF
+AF3D21A7E52CA6DEA32873E04ED9A1B087E53C48CA52944F10A2AEBA85A8605C3AF600C45C79
+8E2FE0826C1DF9F636EDF6AC897F175CEDA6362D2767B08A94E80D4033BDAE1EC7CE990259EB
+E41EF941B9562119AA74044408EB27A2AE5D2039258AA724F72964351C9716E7C002BCF4474C
+EBABBEFE6DDB1FD31A6AB299B08440C3D69EC3DA70C71B636A0A2015643A61EFEFAF137BF034
+F8F4FA3DBF51FC5F53D99E2218627873B4314F1CCFDE6CEF928DCFCF19D42B3C22038265ECE9
+69D9B2982904D7ECCC1307D2526B9284906B9997973C29030C6559EB137681AAB002D90A46E5
+38D51F2C174A6EE3AC6A660A523EE37FCEFA64474E8B5BF43EDB7B7D613FBF17901AEDDEA64E
+56C47DCA39C7C86500BD4ED1B409000FA5184503F7EB76376E7D570A1A3385FBF1FF6EC32A23
+E901D3E20953706E87551968B35C7E6C8CF9A74F5E022385D1F54F15C4CB0838E4C44B6D69CF
+983A3D482D29A6EF56672570517F97354234EDB115C646CA8BE831DA883402D9817FF1DC537F
+EF353809076618E27DC0391683E828D27F3D64A9159866B092859DABAE78ABCBF490DE3EBACA
+06897C875EE93B9CCEC9398139AE263A97E2F8C818F9A1325B5E2DC314EDE5399D51FBBD4461
+FF803324CFDF22BB18E16E7B5F3DA02A1D4440CD1D7F4D4E6ADC4357BEE45C12B57262EF833D
+3DC6075F5FC95ACFB8FCA464AF4AD3061D0741ACA09EE988F4E089FCEFCA762B30FD32ADF49F
+33682245746BD1C10DCBEAA9B6D592C25B98D0A6048A4445DA5049A1DC0E601CF6C7D43D3BA4
+3D07BB3209836127C162788F32B7511BDE9558E65DFFE318CF40CF60E161F26424AE398EDB9C
+99108CDFB93FA1A5466284A963906F24F0D3C0514EE2C0054045A8194365DFA742F7B2FE1AFA
+F01A98D3704EAFDE21BA1EC65224D3D246966D862C4A40CE9D33E480DBD60BA6338B369DC2CD
+B95F57E373EF6CAC66FFDA56F8EE0CFCE9B4D9D39E7566F27F0EBAF6B446D74014DA1EF62935
+354834E131D6BE680313C30B22D4A227788623D4C2F99E3FD5E5C78E2DF4F927D9023F40BBD3
+81B021BEB415D30F431BEDCFC2ABB6A782C417F27AEA1141D39D66684F21D5D9F30835C8E542
+162012BA594077597A2F2E4AA7A5E8846417C73F6B82D5FFB378776BEE46ABFDC7A10D5088E5
+3A52F17CE38E5CBAA425CF34B33A871B9AE9428A8DEEE6E2CC878C86D28F60979A5D4122D529
+70D9728A2D6A0C0E2893AF83CCED11FEB5A813451F5F43357B1F385A606F8676DE6A5190E3A1
+F81F5692DF881797CCB819C2857B295BDB299ACD0D8999DA0D9B450C07DC2005C470C61E7599
+C9E3D8D383292A4CBAE6E519A446918640AD6B982FFEDAAB69D169310170602C2A150F8C1BB6
+AFAA556EE8F7E33FC6F50CD7EC9D79480890F4DA054922685DFD90B73937A746A6AABBD60807
+5121884F084059FA5586592EEEEEA563B9928788E9E39DA6022A83ED313D8D3CABA23E3B6AE4
+427FB6AD3E4CCD1D4BC06215B9EF05B2AE1D9BD71F26A98F24C75507976CD34E1CAAC0DB5443
+A77926BE5816D730657A48FE35EBC0D7566610F58C9A9BBC158D355EBDCE4FB6FA42EC7B0A29
+7913369D76D6141245870E271D14D12FA7715AD8BC1F07837E9B99B52E55C95D28EACD4E42F5
+D380BECD0B7D17284D73BAEF34BFD7B007B2A7E239EC2022B81E9E799C571200A2738CAC5CFB
+003AEF499B36B321F3C1B78B89B78A6EC29E171AB6C011AEBEFEE5BB41E395157A0FCAEAD738
+F3EA027A7381FAD39800AE2D5965FBEC1B28CFDC0E674249D3ACBA41FB94605F59E1EE03DE70
+372F6E9BF0221F2C16D42D3A262DB621AC821177990299AA91BA508D7A3A5C5BFF0F3E052530
+09954265F2D5CD9320DE4D969ADFAA6A1E039A4980CCD6886C7A4B66B3776E22E01B89923B3A
+E07903B8C5B8106F356ACC2468156424A45BC70265A247349217DE229B529B23B5B62631E328
+3C8449CFC00F043069DFF1871CC3725052CDA61702368486570A0286744D7FDA38B07BB2E25E
+B860140DDD21392AD14E11EA781D30470CE1834036898674B202F124F7775830DFC09BC343DA
+1B1DE927699B0236635E3AB64D05C7F169233B41E23BE858A8CCB36A7EF63539666656F037AF
+44CA0D7DBA63BD5E5BFB4D6EC32B6C25CFC394863E81C68E8EEEA6DA6B702EE10D37BCF7985F
+D408648A33BC5469E835AB9734C87D94E9C1CFC135CFDB9FA3C216F5A1764BEEE682E4C2801B
+82DA9F0CBA9FFFA51757CCDC841C2A29A8F6EAAA2B5208CC0F3F1E6C71D07B60CAA41882CD46
+05049C9B9CA0130C44BE031CDC72AFA6DF2E2FD477D151FB5AD83CE7285F6A01E5B2DDE55F53
+D545A77678C425092B6E73AC793E6AB223E637DB10791505792DB121C6C9D7F8ED52789D311B
+689B2507A99B0ED310F7C86D4BE69837AA5E8F7308F3FF681A0ABF9A4CAE168083A7DAF6B22E
+8045CE03F144EB9845337D1AE62CC44CED9B19CCBABBCB15CA8042BE0E38D94FD54318AF0167
+4BB0DFC6533EFB2749A8068982C6AED0375C92D47FC214F5746913ED713B68E102A4F242F48C
+A62FC104958CFBF1803285AAF43422459558CAE9BF0A0E4C7B4F22E57ABF7DCA139EE6086A3D
+F65FD4775740A9BFED5CEE6D9359753E65318B9C24CE2EDCCD59184AF25D3CF265B38CBAB7DF
+66D1A36E5FC92CB165E69AD0F18986BF96B0187AAA7A5A8A7599C98AD2F9A67BD23EE47ECCE9
+8AE0A64362590AA31ED1B6365B4AB1335037102205D00DB77126EE65C830B47F99B9C7A8CD11
+8A06792160D8DE2F1D0B023F0E23C97CD4E1C482E5E97058663F20FB275AD3647054A8627BC2
+33AC05EBAC5D2BC0125484A79362C2BD25AE655397A5170E941C428472ADC6C70B9C1C3B0F99
+4F01DDDA7DA7C6745E990F42B2188FDE0EDD219C5BA5BA13847937A1A99865ADDC0BE9C3B5D0
+F4F984134C99F2F6EB28E58DB74B5A3EFB21B5FD67A095B58E1090C8B73FF68E17140A6649EF
+FB44BB4E46008DF79040553DFDFBE812551A994F22ABC8E88F73CD608746976EE88B58DA97B2
+29551F86B95FD15697C7B671FCFF4C26F159946C85B27288A5BA1FA6D08799C65AC64EDB5AEB
+648A84484DAF63D894EBF8F04FBD4DD0C9D313EA45C80CF3BD69E5827718ADC5D994CC6A3BA5
+8C86501BA90A403066EB78AC1493E450ACA1339E330EC133B6769B4E439398F81D07CF9F1219
+9F702243B1979090E3FF1C637685A6F2D35E96F1C2E07231D0BF0B4F1A3CD7C44F32B08CFFCA
+DFB2C0E88069FCC551AFA26120ED1A89EC4A391309871B916816F4EB15EAB4AFF50231DB906D
+7480FC9E9DE7492C386D68770BFC33370CD61131ED51AF6A92DDEE98044F791A1960D1B2795F
+673B13C323ED20E63A804E9738391ECE0EA5AFB1B9DB941DDAA7A16E712CAA8D200CEB6AF9FB
+7BD9D4E5C5500099F44A874810493FA5469D5E18CB226AC96513E790E788F9911B811BC8DC5C
+4407FFB4679D3579A3E7711BB09FAD1330E20DA1AECA520019EC7838D429B041DC863313F37E
+BE0E3A219D409CD3A58635DECAB34937B48BE30D4BD8576E857F94B73F13FC8A2DD50A5EFC2F
+C7B55451AD9D41FBC793B81D68089F7BF9621D8B068000C98A56B1C119DEA7FF745345002C75
+ABB3B6C8AD2432D7716683092077CD64D3837DC33216D9B8BF87A6AFC25A23B1CE9A97796C16
+034ACC1D1012B269EA3612ED0B43B79942F96A025F2C7F5390D5C92ADF1C2FB0BF4C0110AB55
+D37E47329016E6F8CF6B844943E9EEBECDD2DE6EE1711CA641EF3DE3AE9FDFC77C90FCB4E36B
+3AF5709E3C3467C884AB693F8D1221C166E2E5C174E6295FA5779E3083333304C55740C082AB
+AD2CF5498B8B1945A4284E1CA0C0C419C904CEA971D7B9BE5092A9A7FD4B42A22AFC6E83B86D
+F4F2F576C3D672B3E317B69D7A72DDFBDF3FDF6E7E97DFDA096CE251DE329FDDC2139368CB20
+40460E6B0BAAEBD700F37DFF8A710F07A65998AA3ED5591AC2F297D2894C6E89D761BA3910B9
+F92790DB88051269E7C8C4A8313BCE5A79D7A1E499CE1ED3117DEE2C28C956C9EC9FA203E389
+9A350C9DC2E217F6F54A038E3C1D5CAC463F6EF304CE8316251C274A9EFBD488C44D7A3A692D
+EDEE3FDA5B150A1E04625187355F5839A19B3F0A1E1772C8E8E1E202706DFDF8C3102D4F001A
+0047E0D1D012A7546011E738253DB97A9947BE7C84415A4F075F1078DA0E1155651E78D2C501
+1A9D6952BBED4EB228D0A3402C7C4C6EEE50FDF14FAC1CEB9685A3CFCCF4A83EB794501F4A5E
+A29573F7D26ED0656D73F73128727E8D2A0A9FECEB68118F3337575506A6775A02231E5D1FBB
+BC450168E3EFC36D213B51185CD35E77E4326A10805C931F3D8D1CF9F0F3A20896D7331D77ED
+3C602458497862CB1F147543FF70EF9A29DB7989C4BEE8F2F4A2503E98084AFEC9B78AF2F774
+C7CF6BD776D581280DBB2DCAF00B4335DDCF25F906C3720C36AAEAA2B1AAD745AEAF8461EE29
+6FFF3DF9E7F636B7099A2732799804B3A0B73BE6612D6C2EF71759AD709ECB81D5C1362ACE26
+89DFC024BEBE00B7D2D30FFCF4990686BA386D15DB9CE0E2A4C51F2574B270EB68956CDA9C2A
+4AEE30B4AA076803ADF478DB89D96DEA9F87EA9FD38CEDC885B36729AAE68DC08BA987121147
+7620FCE63F7FED8E77844293ECA86CE6058C1597D049D51A7F458E304C2189D30C714FA3C3C5
+75D7004300566B0ABAAD4590CFDCC458560E7241EB54946166D40F0E3598DA8700B6AFEBE231
+06937DFE568782E0AFB7B8F407BF35423D1259C166E3DDE4C75EADB0A231E914F3451A960B39
+742646F83A46F01978BCC4B25A0364413B92E6CEEDC15A256A25B18E3B100E88D1311948FE4F
+F21A4B1BC1FE3BD01DAD1DCEADEFAE38B245B7A016707A382BF34C3611DC5187D41ACED4CFE7
+51EA8ACEA48708DB0F0709F24AEEE9B1208BF321DD1C42EF7383F6A2F92EE2A9B80078C2AB98
+1152A057815AF539985C5E9B9E925E815FE3708065996CD445BBA32EED3984BCFFBF7405FCA4
+BD6A591196FE1AE818FD371870E9496ACF454C326ADB5C3DF679609DFDAA7D4B561E9241FD0A
+05C4742AFD157C9CBB56300CA5081A0472BAA77A4A3B0FEADEC1E221801352E1E18FEBC2DD10
+16A5BD13F6D4C5D2ADFB08AC7E5F5E76C1C8366F2F8AAB17FAEAA6F5A6B6DD74F16AA1C001E2
+4622029615FD66D101A9B2F72198A7A686CA10D09F126DDCF5D5B335B43976288C29D8A51CE5
+4819E6A2B703EACEF0ADB99B61F3181F93952197A220C3A22D368AD880DF462793A32759163C
+2E7E5256593BBF390C6F033D8D04857DCF62144967839BFAEEE484BC592AA26EA4B5173839D0
+2A6878BA44FC1A8154BE61E2A8FED95461B317E2C9C7428DF0BE31566B797F3392C52B582837
+8741086B6163AC992514E575C1AAC3385105B3BF8531295954CDE97E8C76E3BF50A9691ACBB8
+40E4B8D2FDC1726AB5D5D3A97B34BE8127AEAB16294058D7587A26B8B22573355C82F7C7D3DA
+8BF22E19A35E53306C998B7FDDE3209DB06ECE437C3BC021E3F6F7BDCE96A509B6F80B5BBA4D
+8B66BB196A55029112701218DA7219EA1194A8C8487A30619AA54643E5BA14D8EBAB9ADB3295
+02E7EE1906439E8845C81593FADFE79ED8BF2847B192219EFC3E882E3BB8C02ACFD71D9FEE05
+0A7EA73B81922FBBD314B81C9263BC52E3D0D9E9032C2BF4A74E5F6A8CF58AC36377776EDB3D
+4063DC346D9860A9FDFA433FDC79B1E3866FF1B262B5026C116D46E494184C9D2EA0F504B08D
+02D783B926D3C5A98EBDCAD1FAE3E8B0F91EDD8AC92D259AE4E1585E85B4744F868997FF2CCC
+68536AA3B1D4C986FB609799D7ABB2A6DEC77A0DE0F645ACA32F506EEA7437447FA5C1228B51
+B22068A46CCA5207EC29C9EE0CF81A14877218DB062B3BA700C7C6B81D5FB1D45682085EDEAF
+378CBB5D8300B8CF3640D4E5750900A2AB50A4E915EEBD615F5BABCAC8627A10260128900E0D
+AB4A5E8C4C8535802F5190CFB95CD7BB32ADE99D0AB9D727140B191CFC74E2E337D4C851F964
+8990E45626BFA43527BE6C6752DE7C165CF144399F6AD8F8ACC8853DEBF0A339ADB892B50F71
+DA4602839647EE123B3DDD0D2B4EDEA9FC565FCD73F922C77C63C283D6B05D812A3074CB7C02
+8081B1F15608C912E1D8B35EA15C6312FF7AD39391060286D0D1FB4DFA77CB98C6534FA9EE31
+830B155B2821732E21D795572B1BFE9C5E428D90675396BE337A19DF18F318E9E2175615E9DE
+A181BCAFAAA2B00712ACFBF388DB45F741FE92EA33BF5ED1C3840B1312BAE6663FB523F3372D
+A9BCFC61DD8305CC6199D13A4B3B1A1EEF7AD7321C6CB0CCE638014BAD0709E2AE5170B14DE7
+8B52AA7C0D43394035382DEE4ECD7A5AF07DB97515E1040131BFA91F52326489594ECE1EF673
+F16B38ABF65B148AAC77544F81678B23E421DDF5FEE83ADFC9B7FD0C0E52258C8C8A14B82CAB
+E439FD926F3523871E20B85A95B7777491B279E58326960F4C643FEE46FF45E64FDD26348348
+F5B1115C167AE41E5D154BFF4C1933B6AAF1BE95A9A9872CBEE32E3EBB5500F0C6EE183A1B00
+5546D9602D447AEAF9D6E045686940E2CBD97745A46D053AA5905F0B0F78D4378CD02C4227B8
+1BB7AACB1B5F1FA99CF45C1E356538DB716D1F030AE32B76042F88FBEF6B9C73061EC7B0F81E
+3FAE380BE0921CB30A4548D877D071231D7F016B8E63882A23239A0CB3551B8BB5112C73A6F7
+E9D531812C1E1BB8A83E49D04809C4F9F836E107CEA164051783685ABFC46E13670672BE62AB
+204CD3CC15CC5ACB9B4945E31BBF612C0D63EBA1F8384C2A0281287C48A5301633A0C2DEA1CC
+B950E8314376D08FF0CC3F4BEC32BB0D9BF5C0DF1F6F00603E38B8407F2054248F9543F1EDB2
+CDFC5E5F4546F1D0D833D21669E2BD980B1AD14A575507CE0B095134B5B434FC17E5C42F578D
+85159D25695535980801E197459947791BE29CFB6053BBCA9F75A1074FA853ACE8FB0F2004AD
+EC5FA2BD8EDFF2778A3106D01715BBB764A258F80CB9A6B45EEE0EC5A3BE2EAA16982203C868
+7473B38706F03FD9B5C5C04904C512C359FF66164ECBE141FC4AD61AE91CBE31D636E9645394
+8A97BA3E8A490925CFA979526B1452B1ED0E8CF5EB1DD9314A533D66C3EDFC09862B26EFEC36
+4D4BBD2960189DB100DA990586EF51B692134E0C03B78A2CA586F7D7F1CBC1FA2B532F4B016F
+46FC888E65F7E2304B8902E699334AAA5501E8E781AE22E2BA32183CAA9A45A5B8FFF7CD65B7
+A5FF8D478BC75732D7CDB424BA649A6D36162414F22C7F9B37D4CFCA0E7B4E1295F0477E4E75
+1401495E18A2DD8AF36070D80DE790A371EE272D46D47291CCEF641994469C779667367C2E03
+2DED522F710E6DA7B3731FFB65962C50298E835ACE9C80C0B7AFBD2F41A23871B60FB9C31BCE
+9A620753E162914FC7A91574CF5AB9EDC15EC69EAFBF7B0B559F92A2EA63E02724C8E3C07FD9
+F8229CB01370F6343146DEC4899D8AED9EB463B7CBC6B9143AD05A32D7ED963143A8DA73B882
+EE6E37362B257CA359FB103C2A655F105ADEB515F88C0296BD12884E73504477FFBA1160C354
+3F0FD7775C8A062722FA18FDCBCCB670F3CDCD0E602B67283E2D93A3FE63A27EC89B781C5B52
+34FE997E6291A7E42B4F27499A08869B00F619ED3872F14F2168018410E299F68F4DF8C459D2
+FB97894F6FB350F364EDFCC6E4E5D3342B1AD963985BB52A1013A92E9A9F00C8ABBC49431B69
+52DF84BE83E2F55B1B5CF9915FD1026488817F2F1F5A2BBC5A73045AF645DD47F8A46C4A2990
+24239E3CDEB5259ACA69DC5C5AF64929B77A3D2CA152D15A52026D0D03942A573B06584C2DD0
+8714C4B1C3ACAD7761AC7F040CB1FB7055CD4DC8E5F4AD82E40E2D5C418759BF2639E3842FE9
+CFE0CA8F0BC1E406F21D4BB809C09A33693230D561EFEE144F2BD35C5EAE8562248EDB7D7223
+9B210FA9FA7A698D856EBF1D9E8C5F4B55D990A8E3DA2FD5BD55BDA4A3656ACC14DE070A21F1
+C335F755D10DB6C164D6D9793A4D03905628C23881D562FE5B24F4B5AB70B71273DE01AD7E28
+6C4A8BE2333B6890116A1A68E8E03237F8A08254109A8C71E8AFA1FFB25E3E48F9FF18DD107B
+68403FEA568431ADC4A829E6F513880FD496BC8F5405D0F6530B8FEBA1F94515FC5BE575E806
+F7AC4A5E7B41DFD60A9D3FB74FB8822CCFC2AC3046935ABEBF201B4A498CDE32459BD60E7C75
+0F2070603C190356E76500EF672E161CFA7F4A14B62E8330E30B53961BB2494B87C9D11E12C3
+D951B10F101D977649A67C39E5D783BBE8D9F1D99F3AA772AEBD4EFC48031131914612FD268A
+EA96FE65698401B1AA8B2375A6F2881582681257BD6A483B9DF7B6684E99919E270CC5FA3D25
+92B5021737AA931F99F56EF34F4FD41E81C8E6D9BCF20625B096715E317047F4973A39CEDD82
+122B04219D72C082CADC0953A6BF367AFA76D14A97BABAA6A3B067BD076682B279F015CB1D95
+1D5AF69BA6F3D6F58019457403D7208D14919EDDC1D71C7458597950A09179DE5ED6A25D0F06
+0CFFDB221CDEE0E8121225B36CB3F8B509C35E2876ECE1CC2E7D84C0B133EC0D96A76C10D40A
+1C37F73CF4FA704AC188CD678DE2905CDD283385DC8B66DAC3C2744103B6C3E11D579E1EFB07
+CDBE94E629CAEF2EF74E8DBFCB16DB22097AFF9E31CF01BF2CDECEB6F10F2626873318A80724
+C915D643494D9428F177DE350C84549A3FE95C91667C089D753D8323123157FE4047DE6B3A63
+EE74E81EB365EE6503802C523B90007FCBF6C6E9CAD4259A1490CF246A53697C3206C39898AD
+FC239C1FBC0513A1DC99E119185DE4042BD364C6EF6703C143A4D6B6FF93E7634F99C6A76BDA
+16B0F95C1FFCDD8E1A13591D42AB095ECB451863C3C0E4B690D1045C8D8DF959BB5471AA0664
+C17B5B597F6AC036B283764C1AA5F3D6ECBB93040DD4337323CDECC623AD9CE89620FADD79C3
+F324A3563E575525E0D5B7F82DFD2BE00E8E8ED7CCD404E954C641E9CA403D49E7C29470A72C
+A7F23E2B592CEE90CA615F8ED025BF5FB6FE238B168068F221D6038B1DE77A9074CAD8D71299
+AD16BFFBBA877717D5FAB032BF53CCFFD215B8D6CB9BB99C82ECE64EFBD717B469C0462408D0
+4D6CD0CEAB86DE4B960D6320CF49C5FB43B7769E285B92139FD1598F60E62F5BDD2412926C93
+6AF797BD9FCC1517A468094F3AA8D5C21F76CB27F99B87F50010B904035D5F66CECC9DE97CC9
+D3269A0B1D42863F603F13C983EFB1D906CED117298E6EFFDF50CB4844279E47EF353FEE73B5
+23609A9E9E5A540D8C92878B3AE74F6634BE31E72D873D5CDBE0CD988E587F0AC14F1F59827A
+8E2D90A9EE1F6F02E8E4536E9796A921EC314E24A70679EE3FE6BF8B8C93332DC4C7EDF3A93B
+55B765006ACD12D38B0822FBB3584E4C2CAC9564CA812C887A8A6986427343696CC5DB9132DA
+AFB86C4E7E0064C15CC5FAB75C1B9613C80F279932A4C1A754BC2B149EFB06FCF08F295E5096
+311F1595D0A6864C4E495FA4302123C28B268EB54D2FA1F58C1A4E7C8649250162763B54DCB7
+76CBFC728EB4FAB660BBEC762AB44E60E3E3B98F450969B91F2F7494E2D5CEA41EF9E6B43207
+EE9FFECC315C8F7655F8B4A099DA9EB52BC9249889E262BDB0E68365EBFD8E3A38F6BCEC8443
+114F24A614542435D1D26ED5A803F5587C2BC03B8B5C2B78E0CC5D7543EA82E6378D2F881421
+D9DA43BDC5309832731B4CA33D112441EC317EBF722B3D9A4198E34FFA9EAC130143876BF62B
+9B3A9455FEF4579B43143E5E54C5F5DFCAF5351BC073D49F45EAEA399ED4DF86978C76659276
+71438A8CC0F85D96578ACBAB473FC45E936A4DF028580E7A5F57E91BDEC61096DD5F27755756
+D30760E9CFE44CAA7AB0F9954D1A001BE43BD2CA9494F899958BEDE43BEB0EDA4B7DF14D4503
+A4EC10549506A81E6F493D259E275571CBD62894B557BE6AD4F1D5A387D5D6E45CB4DF776A44
+58997F550D0F68433ED0397CFEAC9A714B19A2DE50330D9F1D325D99F2E82355A40FB388762D
+7EBD07329C4250F6C391DA4554EEF88D0501FC4908947F1D7CB8A9DA8ECEB50599CEE9FC1552
+1E39FAAAB8002794664873B9BD083A75E84E268D4715F3967F3EB86D9F4D7DBC40BC348858B6
+5F8758DBE75C503F1320457BDA58D153B4A38C443DFC026A8DB853215D9CA3C77314FE85B5BD
+1A1D84D16FB178F8B97E4678B36D52C87250E93C2E9F7A581A87B866656AA8E1BF0B39DC7E72
+6875402394FD34840685B921A23DB3670952F8FBE13D21F0B268A48DEFAEA3DF1F93F9C776D6
+53C272288E56FB3CABE480936FE38A3B6EB0F7D0C3972F88C175E2C1760192C421025F6FE339
+7BE9F8BBFD6FA891732CE3C1A64447496832916ADD025C2A09E69ACCBEDCB41BFC690F5C1E5D
+5A01D769A6C52801BA17738475D84BDA343075F32BD5765B268642623057718ED7A2D2F42849
+76693B95178C721B60220B6E9D730E5E8E56B0A7B7752F913ED76F7B6FCFB24A5D5DF9451FFE
+9798920D786F250C9C4A90DD49767656B95EA57C7913C4163F677E769CA2EA5A2704E64C5D53
+CFE6696D66395C0AE35453524F9EBF21C30D2414449C9BDDED7C2ABBC0B962A8278B6BEF81B5
+D397FA7110A7AFEFE1CD18DFF0371194A8CC900A3EF94028CFF1E267CD32B5A5533FAF7F7216
+16F432AB9D36446CD6635584B3324841CA3C2A92BED6CD2F6586E1717A749C743BE9A2E5E722
+55F7223A7FE241BF127187078EC91F078A0FDADF7E867C47FC95C2C924D3FA46C08986E97B5A
+3C5540456A1C52328C3E868548BE02F37B90ABB750B1DE4D1F37468DC250015BC0231C0DCE46
+7B9581C8090534CF1D3A52C2BA183FB005A2D48A3E506453FE81E23BE267C55E007238D2B52C
+55AC7027391877D839D0016BD838FA79FEC853CBD2E0B0EC9C724E34D159D01B905FC50AFDB7
+B7C1E178511C60E4F30A5F23D26FD1DDE6F0636BBF8D994AEAAF509E598EEF99331D5671971E
+0E364D91A420A62741EE628B3B252926239ADCE88FDF8F5E01ECF6E4267816FCD7D65460E408
+9CD24939972951199A3C5D3E4F26FD08503FA432547167686930C4C45D3737ECAC3DA70A2F3F
+33DD3BD0818A3C3EB83DC592A358FD03E7FB3053EB67593D2C773062449BCE8C47E1D7CD0DE2
+83D42D77D2DCBEC8CBCC8FB7BABC02B13B0031E104FBB4822669D3E5929341FE09F24D19D05A
+41DB8F56BB94ACE33F48E67AD0E93AFFE9D7BF1F1FEBA7F3D0D3541EE6A3CC7CCE0B4139572E
+2CE0BBDF86640110C4121289CBF9420540A9A4A46E27DADC9BCBF73EF95252F27E09F4B021C5
+BFC6791D972D58C2B3720FE246B69A8DAB376EBDFFE294389E92BEA4CA2F4C4C3AE8C93082F3
+4211BC61C3AC32AA73EF7F8225FE56203AA0024E05D2372C6F22A6609B537564223E5A16E6CA
+D3C33D7FF2A9E5602F4AAF22C9D40350EF3D5A8E6298AB63D2AA9444479CACB53DB645851BC3
+02996598F4B6057F3B2DD325AC4DDFC4563E5ADAB14ADBBAEA791CAFE27DA0869312E59B27F6
+89E519C40BAD1CDC24CA98E32C1A3EFF7603C1425FE41BE59EEEF102D87DD9968EE224A38F7E
+59A8F5852AB7E19380AE176BFCA21133400DDEA4C631180CAB7421155B138869C4AEDBB186BB
+C971187A34AB9CD7F02B0822AE4F619327EF2398BA7BAD10CA80FEEA775DF6645B1880A28C1B
+B8CC1F3EA66029813F9561810F8DAF8F77E4376760B0842C3EBA02329DA733EECF316BFC131E
+F11021AF0CBE70C0C15ECB7778BDC03A8133E283F7D1CB35A0BACF80B67E5C121844BC2B6666
+2F523231BB3883358C3FD77C5F58488C97C613C5AFB2108A7AAA49F0FA18F4789E14B3D4D67D
+2C049E498A64A94F1E50ECFFFD495E1FB45C27AFF5E3411B726B306A2D42DCC6873BCE48A45B
+C944A42E9FFC245FD44537634A38C1BC4CFCED55E4B2F641F1EFB0A7D430D497BBB734591360
+78A2A0C62F774A9E31A5C9D04B0298423B03D77335830D404C347023E77B27067348BC3724A2
+0680C3F99BD54A94D379F8AE62709E12AFE4DBE30C2EA7A935C0930E5D12B454DE0DD70B43C5
+A28362EE4E97C6D1BF38B8CA8B89CBE529E1A638DD5AD827A0C787BB87E7012F972E760EEB74
+246242E2E52DDB665100A127C03F0A8E1549439342224166B92039A6E7C80F8EBB194C3294D9
+3D5D9DEDFF1A024F34E0A582A7355C471E707D67E0568239C741370D1E65EF1715C0E5F13768
+188EF2C2EF0B10A773E8E9181EFB47417F05C10DAD0E1DB32EFCDFD8411A6E350A376C736D73
+1B53C12F9E8609255BFC626EB61D7F99AAF7AFD4C038C7EDEB2222751F643E16EEE4BEADEB36
+B64C780B39936EF1044E4C5942D6DBC0E263D25F2CE172C8F36634F3467A118408F36DFC58A6
+F90208CEF95FC87A6D24261601E6367133E2A8698E82E962598DE7A816F456B1542B1E7556B1
+03D9FF15131B4ADBB051B91032980BFC9BCA5F20A7B2D1F00334B5F453CC71D45234E0B5E152
+DCF60DD887244E54DB4F210AE4444FCFF332A6AA69D933977F22DEACC3ED1CCEB460739769BB
+24B9D7E5D5E6496F2F0D0E24D5D4E4FF9CA40A18422CC300DE6C552EC74AABC7B516411B63B1
+FFF3757183F130BBD9E1D1E4261032030EA55C5EE07D01AEE1BFF3F867AC6AA6CDD52E07CE06
+39BFA3B9AB2F241B5CCF91E475F9B25DE329E35F65E9ACE528BC932EEBDDCC65B58762318888
+64CFCE270C5B2E6225E774CAA8A87114462E69F5D1FABF7E36A99E08253F71DED5CCE31A87CA
+1F4C4773BA8A8BCCC74B13FD4B223C02B4018B41D47BF5BB50658A7FC4BAE337C2E820E270CC
+7CDB22C99FE181BAFE3AD8185C475763FE00081058149FFAA835CA36648A17D93169AFD28AD9
+7C1F48BFDD52C019D46D9FBBB4F5264B614033D050B2EFF1679D81236E03E3CC2708C0C5E35C
+F16935782CC4DC572480010D48E52FBBB03A700ABE3F2F842561C84E1681E92F1804030DE4A7
+7327927D702D6455AA22AAF6EE344EC4A28C36224D59AA08AD3E9FE98C43CB4E4C2114272B57
+24DE80E735AA31793DD119A28C9DB8613C182C2F0DD6AE64DDD072D0994B654B0B372EBBBA1E
+54B85F3FB4452DC5F425E2995289FA7921D05489489EFF8AC61BA27437B0C7132145E8D4053C
+1AD9BE6701A9141F27499ACDEF6192C8B1A584FC8773B57231CC8385F7DA1B4797DF1ED89EE1
+7CDBBECFE86A393BD67C6729C555244FAAF7DD761DFE6FB4EDAA7202306F4447F86DC9BD4E1F
+0B58E7C882A0E19FA5D4284023663EA4F04B672A408C47B87FF29B77DA43001256D9AC0C9453
+CA7D4E3B43704EF0B5AEB4F53431110F72B45A694A0E29347BCF791CB1BBC03F980505D496A9
+54C50B35AA8308D6A046519618CA077B0FDCE69E636FE4A04D1647F9B508AA97912330EEA1E2
+03486DCDD9529B3517ADB13657DB861EF0252EBE70F969E3B5E20589D4B73214A7755D083655
+2AD3A9EDC28C1B8F86596B2F41FFAB739038B057B437BEF29464FBAF15F7B03C010416254596
+B7CD496A46FD85FAC750F8AADF807CFCB406DCB87C8A238186F966636187C05C20C0A9C914A6
+C190D82AC506BABCCC737DFCCD8866840BA9552463833C2D0E7B34A45A5A0655DC227E9A0062
+AF20D02A40B46B1C102811E7D3010D2305873FD8ED8CC6C3413A8EEAD5A291DA0D607D98D4E1
+D36F3838DBD7CC72FB60FC690CC680B64985AB4E61B1DAEC4109AA1A24B365F7DCFCC5D6F49C
+1AFAACA490583165CE7A179D30EF8736B6A355AEFD9817B6EDD89F703594CC14ABE4B9229A62
+9D009902FBA6D455EA1C68FF0FA0736B1251261DD5AA3A92122C01E0F63277EF877F6CBE2290
+A12625DC2782FA1F0302D1D05C92CC9B49D31FFB9A5732225667C6837839425B0470DE2CA8B8
+9069127D35285C3CF9895CB8597F5FD70F99D753E055E9180ACCA0F13134A2AF23016010C630
+F9C13168C26D539B4438354CAAC426682E6277840353F8D7B5A03A79CCF03D4A8C9773347F49
+E12ACD399C97F3CDBC752AD1709E471B8CE052E356410E5CE483621C70E7017D5EAD62C65A24
+F667BAA834B1EAB672905E54DF144402DBFE809AE440C9B8ACD1C06BC391ADA86C622DA34A54
+2B7C4BB1CFA898712476DE9B930F6407414C4C16222781A9142A0B8662FAFBA56A63E047057E
+AEA04FFA1887532BA837B5A52876E166205CFBEAAF6E6BA007FF795BDF1B5688B25D9627E640
+EC4A8439DC14F1426F83B63FD2BDC41786CE56E049C9AFEF4E7274D4583033C4D8409E54A116
+A89F02B7F919F76E5860F3CD089617E2F54C0F3421B7BA8ED765D9D220D9CD68E331F9A6566E
+CB80F5252CC651E27391719AE61783E407D9274DDDB12DBE10CC0ABB3D48378B36122E162791
+97A153C7C93DE4B979D0A0DEBAC5E0233EB4D6DAEC242810072C6F8A73EF70DA6EF015C2A00E
+22C91A424A8F69F1A16F9A877311020974F025250F124E427801B4EA69897052632ABB650501
+85638DA5FB2BD261DE72267287F9662619CD2AD9235577B6D91360EB731E314D21310F5BC19E
+D9EF04B2833F43CFD82FB571F5B3FA93911E189ED474A521D3084B4EA464FB81BEE14C2D2937
+7FF0232804E837FF2D6A991726E41351E9413B3F245C053D5F0071747807CF518462A96C3574
+2C6EB7503AF1BE52017BB2E06D97AAE0E5A010590382B5A40EFCA3A659C1C275E7AF67F020C9
+A6AA48E3827EC05ECB3C1CD46030DCC38B52FAF2584A1359756DE54C71B8F5B5A7AD60A3E714
+F7B030C0AB5B670CCCFFE7D025DAFBAEDAABBD66D8D515524F0B3405626A42689960540D1E0A
+9D05AF92B54842F58575122D87BD2937460440F79FCABD1CE65D79A60BA8F7B0191E972E161B
+295FA0E99EA9B9190362E04A43A07BFECBFC39665F616026965C22E5E31CB9D1A35D94327565
+AB585A139C6A6BB21A36F2D7ABA1F33DA97266910B27E26E263B732EF0D8C7375054B2313E95
+5A1974ECC748CF7562B8CCA57E46F94182CC51BE1554FA07AEEE527453D5442ABA1E74A6D700
+7749D24B261C771260970C190360A7BC8CEBD764799060D34286854165B9ECE1A1259A5611BD
+1D94E60B7198B55DDFCA07F235075F55669B2FA650C15A1893F265997A7B48402D5F07A48677
+9E96893D97244DDCE5F1CBA3E3C401FF5820EA1A4D25E12CF6608D45C3975F1823204AEF7758
+A46CAB0F75D7E8B39035A488C91D024D95DC6E48D27F9622BE180FB171DDD82E3B4C087E0EE2
+B48BBC900367632833B1D47F29B2BFBFCFB1B7807E5B63923629D01F4BE2C0C151C8BEB1376A
+E17A0387B2BE7D0DC1DF768ECD1D01C28C24076F63191EFE35DD80501F62FC1BA10822916849
+DF93D33CA5D26A805FD97E282D72BD198929AE17F171356A18FC3A0CDD2CBBB2F3F0F1D4300B
+F233F4B354ECCA2AA86E3429AB01E0081325767634199F7DAA6D94CF7FAA898085BF8E020816
+02A66B985874948B278485C2E22D3A00D363D840A825F5DB4AA39D6BFEA1719ED8FB08A5F5F9
+0108EBAF99C958A2F7AE9E1976E93FC677FF0EE9D5B656CEFEB1F27F442605E569E90338E8A7
+47FAC0C9101D0C7240019E6704365460FC017CCAD75649D6F5B4BD2775F5C6DF54119A8AEB43
+B10F0860576F6ABA7157221071FC31D231A1BA5604A260E4C6FCC063C211D8191B4182AFA2D3
+6BA61A32BA66ECC4310368CB10B7BAE564C48CBF87B6B4F8C27A81A7E5BE0C5D2004E50EBF21
+EA75808CC2F8A0AFB8D28704C12B1EE0255EB819C5565B62BE449B537588078583FD75DEE364
+DA954FA967BD4A2BE3AF4F032A56618D66B4C3E3AA7310A3492DEDDC8B53A5C9626BE08CBC0A
+57DE886311C64B3F998C02A197DCD144499741E421E5CF3D24DB71ACE230CD0EA299E7CC5C7F
+F6152CD3F67E3C013EAD75B8CEB2D27016C6B5D15A839951EABEBBF51B83CC858132BF2DABCA
+104D50D50C94943555837DFD21A46672DE0ACB041FABA9272CACF2861BADA6315D444D565991
+121DE8E6D830883F94C9B9C376BDF85F27089AC44192F073D005153E50DA4282FBABB7E1C5EA
+FBABD36A5C7307AC9EA54CCC56C76DB5C1D3E2F0F4E32E41ACFA3B2E767D6A26E968785EE3B2
+23396357DD69F108023B66B25D2041F715CAF7A64EB211053DDEDCB6DD7007910FF538C9D6A4
+804CF8EDA600D76FD9F3D75A03EF872EB12270A08D12D823E59986EB91B761B38BDA0CF48A3F
+7DB2A8172AD3D9C4F5D34351B83CCE85BC7A3B9BD8C5F88A7F7AE6FE1978F99023780EAFDFB0
+14EBD2ED5F1702811BBA58614AD82AC25F6C53D63D42361FCDD5DA434B1292F0BF880993714B
+892AEAB89511CB20DC51018ED5D0C8EF0DDD07B809C381BB29C325CDF8B01AAB87EA307D27CA
+3956A35A21992FABA33CDE194BA4A401498058F34CAD24F390A39A0652953AA1F64F93E3F6AF
+7983E001B5DD90AED7A9F9F297D4E81E3FD8DA60DE8409347FC0F3155C9A9544994DAC58015F
+C5867458F17EDE746D54B73BB37BF26857CAAFE354AC79EDA3D878ADD572F884E0AE0081CBAD
+B12F66A4034BDBADAC5539D958F5105E9AE76A8351D6943C57229FA0688E6B30E84C1429327C
+1F13AD179380AD31575691E93837AF4206428524026F3F533900BDD27213EB0411707856E1D3
+CDA87A0B1A8AB0E3CEFA14D24C9156C3E3729F698988CCF38BD7311C3FEA1E3C4C43DA672F2A
+89448F5C035981A422F4B5B29A25323F2F4B31F7E2F6050D8BF57FB4AE6E0CDA84487ED8ACC4
+6F40D5A7BF1091FE72EBB8AAE98F232E3B384C2E04696DB8956837336125E6B2EF265235DAA1
+A242F8682EB8984E6BDF2A77F26F6D446C4B54989BD5305C406288BE97956D19DB24761911F5
+C7CEF2586B68586438B309E039C0CD1737D6124C4CA69A0F071F62602B9DD629C39631F2A842
+CD100B4992D89B62F5DD67E6FCDBF662FB4F09E551457408F8A6BE6889FFB3C41CF30F64B1D6
+76772070DFC8052DC568AF41E235C333248332F3606F9901A9B92BBBD932DA8B6E4DF4A6F484
+117654583925D629D70596A91E80FE01D5BDC077EA58F2A142D320A7DD3674C44175527FE095
+CE6F7C511E7586C27DD80BCB94F26651D0CB20D59BEB98CC2AB6E89A6548C4A31FECDE73DF10
+81E6C8C6744D8F5C5A6C9D6B8E93EC49454D1515021D22BB0728C9E5069E8C6E2B9E26426D7F
+AF225D41400CF79AEB278A60C9BCAD0E8E6CBF53A4EEBF07B2EB0B7D8F1C68A9CAD9D9FABFC7
+AD899249A6B068827C9F5AE65DF0037ECED221864C84945C4DECE36859F30B3E0B76CAABE9F3
+8443FE048A64CA81C6703B73B4B2ABB07A49DB40AAB6E87319CE740EFA709D12D1589071C86C
+F2DCD450A530F3D5097ED199E04FBB0D7D58E4F6ED3C3A09FBC53C9A5E9F2E23D59D92C27089
+BE30A050A9943B71C2E3491062B8F701CAB82A66F7E60DA59D3C2D6883E9D07524600D682DF5
+F90914E47DA1B098B410FEA420C7E0A41CB717F5E8930DB231976118F730E476DA8ED3907D98
+477220CCDE200B18EBAD46B18F36F2AD9D77C26E19323CAC694FC2551713405923D432578043
+BDA91F0869CEF19CDD95AD98113B50EC9B062382450E615BA8FA765BB46F357E7A52730EBAE7
+51E02AEEAD13606D727BF933EF5C1CC61034F4A297EAA6E1D5011817D5330670F2999767F12C
+624C6B8E2170010B4E55A807294A00785757E6F07117B0C5AA7D498DC280B00001E5409B6B82
+B8AF4B148985A781B320FC17DEBD609BCC84BEE616849EB0D5D4CB2AA612F1A65ED69DD2E11A
+EF7BF538D7C99445B32C438D3912E9234E867A1A5B6AEC945C0EDFECB09D9F5E71115FCB4246
+0AEBE26CB3F69DD60B6B2B4982612E7181655A643590771A8F88475D69A54A0AD569F1F7B4FF
+E2F8EF2F5A61D869565D6F2B85D8C3494F2FFDD2E32D8567F16F071C1CD1D694FABDE66B4ED5
+C0DD60765CC2F6B35CBE239508CFB1D719E0934E8A27B8D452611EF6B8A1AF277FB3A4CD5504
+841675D3800742ECFED2B3B6F57C7AB004BCF8338C0CA74CA0FF4A4350C9E776D7EA642BCEF8
+090032B03EA942EE12616948FB9B2658AD597E07110B519F4E3F20D44EBA85F0FABB05AD6574
+60B01A8893750965A33F7BE1EAD0E83A0858814AF429AB8E8E2C82AD58C8D2769D4A55F24C37
+C6B0D38EE470B3EF16D919E336FD5DE4A01B78F8F987545EB8F9FB8B6E279D3291F58DB0C4DB
+E3FE1E67575839608406B1904ABEDECA3AE4D2B0A3DF44FE63829ACE4A11C6ADF87C84E538DA
+0056E0AEF5B60387B4B7C5760D3BEF8D64FC26FE6BE38BDF0D0C3E23E671ADBFDB6E989CE34F
+D926759FF41C2843D65193EDCD1F6400615CB8E845C7E8EC8BA4A06DDD747F02C466DE449B8D
+6B0EB362F84E6060C0D49EEE77AF03CE2E2C5F74A1EC8965014FB2826B54C7B3D4DD8F787C1D
+7BF63BFFA62E33867538217128C978BAE1B12F302FAFD457DBBE510ACBE337F57ECA9A4153A6
+B414D478B3D722204DEAA9FE20FA794CEE4FC0508D81A97A294C6EFD47002C8BEF1614ABEB0F
+B72BC220D77988BAA91BBAB5B6040D844A9A5B67DFF7E4C93EB951C2D77283FD0125C2B1F04E
+51CD7CF2E0B97FAA59126E48594C707BDDF42C5ADA9D5C0BFA17F62CEC4D309E156A8644EA4A
+DF3678FF8BAE81DED7E11E0477DF2567205090C7EA924B6BAEDDD6CB5FC7590FE31E7E7ECA0C
+41616FCC4C96D4ECDB849A2F58DEA8FBAE70D17E3259C13D9677E9A8AE515F251DCD7199DF0A
+20B1858FEDDB8F43FAED39019E874F7C3518A617247A81C8C5792CC0B735CCB900C604D9211C
+302F46B280D63A8F48CFDFAD2C95B6D44DFE4B511D5D383E2FB468F7F56DF2080B18BC901C98
+C9ADF5B8988FF000F7A8E72DCCA7C420E45349CD5BCAB2146B889B31E6A8D1BE716F2ADC6448
+9189347C988A52A62C26B6632ADFC16237F3F40A905C839C3A956720F4DF6B97ED64207390B8
+3C71AB6D177117CCF59C391C1F83366903081EA16D9261544A1C7DA46719573E074D9B2199CC
+6EEBF03006E734CE8AC6210BC55A72C26F477B1D538BAA9AA09271AFF16E7B41A164722EE987
+D978B414CEEBA93E0382141775ED18CF1A9DA1C2A77233CAED1AA73432B1D2C04DFC2800686E
+865453B19D6E2E59B42EF4435F7FE980F56764D74A6923BED573DF98BFB1EE34329BE19D8F61
+54B397EBC8FC7C64230696258106A04FD830E8A488E05419903460BB56ACB7EEC0A162DFDC8A
+B835E65D60D347E5AD68796697C224EAB27A787F3FDF0C4AAD438DEAB000E118C13633ED4E7E
+176A8BBE163B8427D5B3090B05EF1BE96F5F1795CF14B1BF977ECDB3A10D5F60E083F5408A8C
+2AA4DE77609578F6D2E19239E92976D52E4FB0CA0331FE9E50F9BC8C28E76AACE09239CE9484
+697C1CAF0C41F336E67D6A10987C8203BD86345146409CA08DCF3560FC276654237668952517
+99B25AD05193E4B1180BC5214B9E9C9CA37FC9FF815B47B4E730291D60C816E75306E417625A
+645FFF6C31DC68B04741B5E17298E1BCFE0DAEF62F244BA6571E7632084CAB66926303465413
+C6E9BCD884F75F7F554CCF65EBA00E7491DCA94301CB52A2A6B88BBD9E6EFD20AAC8ED214B9A
+6359EA6DE1F5CE2C098C3D7740BD683E547FD6202D3BEC4C229CE9533BE44E7334CBCE69A2FA
+CC9F9C990A7AA3F61791F0493D4C5A1C359886DB07F5B1E79C8F9A2B696FE5F33CF187E070AC
+2AB9603C98CD58201131471A2BCFCB5D67439D12C502064C59D8CBDF2E32113FC2876A393A4A
+2697F43A15F05318946718310DCFEDB663D7F3B53E4E0E733C4911E23941F5182B02C57A34F4
+A50B385BB9EC2764307106324945C82A8F2E15165040919BD134C321A734E73147DC67F1F943
+4D1BB7F3A03FCD27A23E6DC439A5F6271C8FF7DFE011755C7C55F78717FD04E6EBBF5697FBD8
+5AAEC08BCA412F081FC7A9E06416984C597B5534D3EC7B858499858BB4F91A6F928A147AC264
+CD3B4431B808D3DEEE0C02808516DA8D1BEB659C9705FF93D01DBDE2FDFE401FC165C8A4A784
+35661B91DAC66E0F15DEB5158F9B3CD7E3686A276DE2236D91D9C5023EBB3865F0E5101BBD4A
+D659D7A70365324D4D391BAE6D90E4C368B8D2F13ABB2973EC4EB72A6F2D67404BAD309A7754
+8FE5F4A5C1E77A6FF3D87BC42FD991CDD9D813A90FE2DC81133D0B7A0C32BA2960E42A01D792
+0C9C22F49B9D22F04D929FFA894A549E1758F5E4EBC588518837F2A68DFBADB9E234E32ADCB3
+B22EA8EA7373E4A2F27499C3DF7E4EC94DBB3CA2C3110510E7DC5BDC3B4D8ACFE90626721248
+3DAD15315000EBF37D357390DE5016BB39AA6D1821AE0686EABE15F33E39D087AE9878F4A3F9
+21BAF0D7880DCEAD5BAA3B3AD5C11B156E8848625C1351CB29D8F231AECE117D63BE8BB2197F
+F1DB64B0802A37C9A53C1353B47A7A1016956651E629A3E4308D6B8B0DE4BB974A898A018879
+E2D0B6284A4682462354BCC25E40B584D68F627E7BEB3448AA15DC0EF0305D1C7EA07C0A3736
+3BE4AFE86186F3CE249BC23735D29D1FC94BE9A3E0BBD0E06DA8085B45D7493A61BA07045E13
+7A8816994B9B92DB410137E326A5BDE85B8E029D6D08FA76ADA25EA22B3AA44523A8B508E759
+2E73799C70B9DFBE92F4792D88DBC24E7A91DC40604AAE56270F428AB592E0ADC1858C317F3E
+5C9E41B04E0DFCABFF1DB931416A82713ED84F8E5E9589EE741211CFB2E85165E2772AC5000E
+1EBA7AC81EC561016076A1715BA4BD7984CB85B8FB54A1903489AB9693A86E6A23A29C74E395
+D85A5D0843C6C9D9EE331B674EB2445BB4B7D5FBCA0E456D810F97DFF0120376490F5745C14C
+A753BAE8CDF41419429566CAA6057FB62A0BDC1A33D6B3523747F88870D3DC1FE0FC96F2092B
+6AFC8876E6DFE34365731B445A4C47393458BDE21BD48491D5B884FB1D6705CE5F00B6E5B314
+99284ADC2CDE9F66B2CF8E640952246EF5C095E7B1B6CA4B330801B811160C3C11BA9790F626
+48269345E3AF769E343F1D07A9A7B5E9DCF2A677C1A6E95248C30C40A579521DA63A8DD28431
+B7A88E09847AE780109C6B60E1F0C60FE59EDA97090292E1366D7A6DDE92982C2B9EA8C0A3CE
+43974B2E01175584D4048309F166BEF4E38DDF320786358335CD601B60412813475CDFACFFE3
+D0145BF43BBB2FE7F82EA67DDD52590635A7762192C451497BCD97B9F4CEAC5794081FA5026C
+ACC5985F66792F354FBBFB68CBDC2C1A1AB52B8505430E2952512DB03CE17910FA77C73E16F5
+61247BA1FBE80D2C6D7019679EF7DCC1D148E0424D77A1DD6B7F5CBE5F430B71AA58AC7BB2C8
+916EDD3C5D551AAF02150489F213006181434B8312331F31A1CBB0C9693171377D599F19BE0B
+99F0852AE92CF01E22196AEAA288D6FBC4D069F96F92B6E4926FFBA5657E3252294D72E0BAFA
+2A1E3A660D84CA52CFEA790F693C56BF537EFAECB3BC1AFD00BA19B55E49BB17E3D468E76FD9
+1ACAD9ED23FDF218A06EE1F634F3F0076CC5555870CFEF5E36AAC3DBC7C669B96FC01FDB921D
+1FCA9FC7BE5DD2ACE448CC833AB3BD48A8A74B1068C1E5374C149622093B774A7C9FFE05180000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: LOGO8
+%!PS-AdobeFont-1.1: LOGO8 001.100
+%%CreationDate: 1997 Aug 08 18:04:11
+
+% Copyright (C) 1997 Y&Y, Inc. All Rights Reserved.
+
+11 dict begin
+/FontInfo 9 dict dup begin
+/version (001.100) readonly def
+/Notice (Copyright (c) 1991, 1997 Y&Y, Inc. All Right Reserved. http://www.YandY.com) readonly def
+/FullName (LOGO8) readonly def
+/FamilyName (LOGO) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /LOGO8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 32 /space put
+dup 65 /A put
+dup 69 /E put
+dup 70 /F put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 83 /S put
+dup 84 /T put
+readonly def
+/FontBBox{0 -10 765 610}readonly def
+/UniqueID 5092847 def
+currentdict end
+currentfile eexec
+
+80347982AB3942D930E069A70D0D48311D743B8793C40476B99911A1BE6C93CAA7FFC9533764
+A6A2A3EBCF0BEBC6668E399D80AD8B0E5E21D556D8FA71B95A1E01E6689C74F977A4BBEC6795
+AEC114D8507F237839F414EE4FBF8162C865260F923A63721852C7BFF69703F7E0AB99C3B85E
+83C62C13EA99442890E370376CCE7133CE8F3DE2F4C1DC78FB55DFF4EB737C195D266281ADEF
+5D56FBBC3B785B1B59D6EFEAB3B93E713F4B9105CF1642446D87545B76F8B9E129A039215E86
+F1ED20AD12869FB7878C031E1C274E59AAF0AA9C34E2BCC9D18009551ED98A1C602644FEC957
+30E0F1ED524DB1405BC42062C767E90C3FB712BE8FA073C1985D9D4BAFE2ECFD54CFB7417A1B
+E828AB45B616BE3F22B251180F648BE54BDBBB9EE5F5FB32B4ADC5EAFD7431E16208494A358F
+A19EA85C257915A7108EA280AD6268DA3395DEEEC1626C1C430FA1C5E10D6376CB721B25F4DC
+34D9D0BF51660DCCFCB528EC50FD62F25754D420305E39C7F46B8189A6B585513C22E726F806
+C67D9BB6669D457259EE4D61131AB646A69217B8728BB61FA7C46B3A8C76FE6093F5165D70AE
+8C67ED0BCAA52AA3073AFECB425AF6D626EACCFE25EC0BBBAC793C23B990A303A9D3FFE435A0
+7B6D0746F2059F59CA37C5B29F846A063535FCD33D82EEC255B763CDD633E448C17793FCF123
+E942A765B782D5839DA31826404559D4BD90F08A31301CFFA9A9AD3B727911BA25ED11019B71
+E0102022B4BB0FC4B90604686D740420891FB2C878082F0831FCF1ECF78118DBAFD48C5E7DAC
+30075BDC4A962A3E566D4629A91F13075AE1E81D4F3777908CA981E84AE0333AF956246AE7DE
+7F53D8F90EA0F7FB390F51BC23009C55F342AF06039A4AD57EDF9932F5FDAFB536ADDB258D96
+62CBCF7E387434F184AB9B9657A37E9691E64833B16F5BD0DAD19F52E223985525615AFCA792
+57A36DF7FEAC0256D2E8EA3D477C04339C112051896C2B4D0CA7D89ED2FAE817DF1A1AC4E0D6
+A262F06939700DB6B87C776E0F13B014617539DDF601C7B0C59037079F2348774CCDB657E66F
+FBFD70810C7E7E062867913F69E9AB92D8EE67BE817B9F590A33FE372BDBA57D86BDA587F9DD
+30008D2005D3429B27C5F90808A423A329D0DE3B89ACE1BD549F54D7729A97C7E2707BE81A3F
+0A70DA55C6F4EC96C9B8321FA54E8A92A79CBBE575F782868E41831BC47D98FE793EDDCDF1DC
+DC5356D408A6044226EA7CDCD8744F1CD4CFC7B4392D1101C0B5378273ECDFA383E36B0338B3
+9238E1527C8951BF17E9F83D3962F01E5455D0083E0EA1B5D51FA9411072D056E91D0F12DEF6
+58F9677FF768C2321947F4DB9899848460200DB9D07E8099CE1E66F8447BD8B81B223E55E673
+050BA18DF0101B9EE87084CCE95C79C1A004B7AE2AA0629B2BD1CC0B7E34705170064498B39F
+93497883A1ED14F18C197E8CF7347CEB53691688EB5E7EFA2D8E01D3A1A8886FAB1F8F7B1509
+C962C68860029BA4D8DC99E9A951FF4902C134B99289BB4846306FD6E716128032A098FE55FA
+4D47BB4A774F44BBD94A6BE8C32A60CE0B59C237E56600C8665E0DFBA015A63BF8589E4E333F
+7A96D14DE9CB89CD78E9646471993E95CED4CBA711FD10195236B71BCE2640C44324D7C7DA73
+3C47D27383B9CF3C1C191D72AB9740E50B28EAEB336EB832EA9EFDE5B56E3DADAF048A5E9748
+28EFB73C371D8DD081922E6550DAE24761E5D7B6421F1E628ABC0E8B85E457AAB1EE5E7A516D
+EC20952F9E2F3A65E0EADF77FB06162B577D4241B850B82DA6C4167725F7D342B728D34ACD8B
+814068FC2E2BF98A9B06CD1C1FB0EE0B762B3F52830BD47109924E38935445175129C59242D1
+FC8023EF8648C099328C468CBF1E6F1A83DFC04EFE293A04E2C1FB33B196633AA4405284E91F
+E780BFBF5B1D9EDD854ED4FADE2726A1466C97DEB61C595C37D126F8B6F02D85ECD31438BB68
+6037639AE483A150A74A991B86E70014E106558146726441D9F4B3A8F9B93A7D2D3CFFF4E98D
+7C78442EF8638CFC45DD1BBD88B27AE65A021D55203790BF42AE1AC9AA21F77E8C5F506C5CF8
+16CFAAE9A66BB345623FE3E0D8950332FF972F04798F51D21087695D963014AB340BF82900A5
+4F506AE67AC4DBF7766EE0CB0D0342F356CB95EA2903E2F5709E045FF6F504C34B5494630954
+5D1706E73ED18C16E1953C03B69D02A96E63351E17565852B24E12D80435063CC208F3D9BB8C
+32F5B7E555AB6785896B816B6F3F23B6A187E3F94B19B66BEF52B5540D1E8CAC7ECD817D111A
+AD1F0023A9F9716632C139EFBB64D2EB90C6D0A2E69BBE73AF5FA9B1C6EDD002E2FEB266A1EE
+B86BFF928355725B55E74CBE4568049DA89C55FACC3E49A2A1AF00ECF0A6BDA3DC27135BD41C
+2A24B5FC77B81391947BB8876F41A6F9FCEFC905F8FDC25ECC6AED433999FAAAB97EEAC10599
+14EF3BF8BCA0864BB2FB9BA6127FFFACAD21F0B693ACF1B711B3BDA46B94743372A6CFB25711
+2574655E5BF4AAF6ED71167B08F039E3CDEC591D5AC928B281E8AD287DFC10FBA801F3F9B2C6
+23607DF87BC799B8921C439B2EB13C25A56D18E58B02375ACF989219063B9274303494254669
+9C481A45026669C05E95FEEE6C669A66044C5394448FF3629910F1FBC72A114523A36C4F9CF4
+D782D54CDD0293633CF05794160CFF448C122156B8B8F85C4F18602427FFD7A3D7985E182DCA
+C2CCAEFDE6F5781C33C5C569848E2D3572FFBC89EFEF924414163ECF81E17B4F6B188A12A067
+294FE6CDA7123CC1252B5C3933824F9405E4F602E9F0E24C4E512B17676CCEE3FB570000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMTT8
+%!PS-AdobeFont-1.1: CMTT8 1.0
+%%CreationDate: 1991 Aug 20 16:46:05
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /arrowup put
+dup 175 /arrowdown put
+dup 176 /quotesingle put
+dup 177 /exclamdown put
+dup 178 /questiondown put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /visiblespace put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /arrowup put
+dup 12 /arrowdown put
+dup 13 /quotesingle put
+dup 14 /exclamdown put
+dup 15 /questiondown put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /visiblespace put
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+dup 127 /dieresis put
+dup 128 /visiblespace put
+dup 160 /space put
+readonly def
+/FontBBox{-5 -232 545 699}readonly def
+/UniqueID 5000830 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B4486BE533DE8DBE3CCD493EF4C9656D5D5B76
+D5319E704539DD76B065F45E6D6F62EC499C9AB91923A364237EF75E1D62D52DF3A943713CBC
+63B16C1880FEEDD1633766248FED9D060FF709951F2EC84ECDC06BBD9CC4A865E1F275455525
+E5AC7E2E6289615E98CF7CE3763B6914D3A4C5B75B29B8043DBD898CCD5BE448064CF1AF2F80
+F969A44B4F9B801C42F6D6A6D0C3FF42E0B1CFF748C1FC49B598EADDE0C2802DD591C54B802F
+FD24CB7A7639295713D54E639514AC78460672C9C51742AE2014E4137BA4303051C06F686395
+AAEF86C99D7F9A97009436C2FF55B770DE3E80CEF0D53F4DF46AACECC21632C0C676E2F5CA7B
+B101A239A0FF67EBD37A6B8C4C8246DC2C90B759DC03FB26BDE8F134F55223EF3D6496AA0C4A
+2D7B6398DE6E6A0474EE1B0D78B2D865614609F1DB92FC564AB5921078B4944E11A2162902F0
+E04F4B29448AAA22B4EA92FAC48F8DC47535D717DC7ACD08B25D391C97C6C540AE0A98BE5D6A
+8DA564AB73E8B5D3B5E1989D6E25C3A35EA44D596B5FD6B2373B30DE7D59C1831245EDB76D6A
+67816AB91A80A27A6597C6DFD274DB8B3E45CB01AEDEE59BA6EFA1428E41ED557F051012A389
+9B195EA44A4E4D0067398D9D40EA26195EFBFFD2CF785540BBEB8964F6391361904FA5E187E4
+AF3BAEB4E8CBE7558FB7049C94A1769A2FF0B44F679BF6F14D8A974BB8BDC737B2A55DC050BD
+6D0C2F54961944A0216D857168E4C999342171660197CDE7DFE1F30562C6E21AB81DFA80284B
+7C4294478B6C7E11C00B118342FC228F5875366EDEA7D4345D4298FA7CA990A180191BFD8DAD
+1598B47E90268D1730CA9ACEF70F7767F8F5DCBE924D265AB8A16663EE3B2777B6CF075F625B
+5AFA574A19EEDB55450C2DBA8EDEC92AA45BC0DEBFB3D233B4A8C7C5D836268004379D3A46BD
+4D3A6B86B780BDD09FEF1E62B51080CE8FAE8E7CF834483AC101DDBE3FBCA8EF4C8630F13826
+ACA4FFE105B3B20D342206C681BB6D6D07D67FC30FBCCF1FDC97474CBE0542A3AA94786E0341
+B5BBCBB7E6B5CBE3E30A0EA4F8490328696B7E8387178B524180476433784E67501244161054
+7AB62B364C52D7C75ED8EF1200EB2278AC4A67DEA16A9880F56F2A0E6863B3C85923B79CBD65
+70993EFA7D92C2F87761A6569AA9C0A45E925CB85AAA803E99708111341B685F087111BD2AD2
+86912E1488688DAE3F2AD3AB8E37F6022D5F6E330FB0D4BA52C8B5CCA2EF8C12B2EBD308E528
+854AC6B4F6E81B11B727597115D4074B2FF040D5CEED6409EF405D94985846EDC2F58DF6822A
+3F9259E1EC0D471A4DC0EBA1252F373B812833854567A89287505E7028F0BA674A2F8FA30BA2
+BFDC2ECD69EFCD9760C9B741BF8E8FD7D4D0F7F5AA4F000AB2D69ABA9C40F5C4834018E70A24
+92DA7392F3538789DB83040BAE824DA440C235369DD40518B81CD2C771391248FE78A95992C6
+9F3D2248977F9780307D9A3F4B615A74E0B77FC652386627C0C46BDF223860B218D7146C50D6
+F302577DBCEB89AD3C5A1370ACD4CC025B5B9DD6B9F81079CE7822D0E1AF97846D652BEEE925
+5766F17B350BD85B99B160B797619D2CF44224329E3520C03B38EA0EC96C57AA17A61B65A9D9
+A14FEEC92F543F4608004F89179504040A1AB02530F316BA8C8FF0C145C10328AD2AF7428967
+F523F82856759EB6596500A032C9CA68AF477342D50D16B4A8B3D8F5770A8FA9F37B115B4FD5
+909D2B4971591AF050077160DE45696B74CEF2ABC7B30A0069939ADA6A0A121999BF964363E6
+1B680E8A3D1A2F36A5A74C7E94738BD26776F9CF2EFB4452C6C360A55F23AB8AEC9A66FA4855
+E2BE69B8D3A1BADC5A6540724FC9733FDF557708E1DB60B4DA2DCADBF578080642BA605EB02E
+52F8C50F629428CB679AC22BF18D0C786986C194F1D67FA457CAA244B2283B3724A851BD07E5
+476DE94BE72B35E52F97C1B81EB9BB5C9510E6AB13DC264CF7B933A2FBAE8578431019560E1C
+1C5E25F15E326D686B0D856794821760E9D1239F79EADD0F1A241B29EA7B74E42FB0AF12A270
+31EA143E5C49534BAC566FA4475FF6F7E6FAB18CDE8FC169F4362994F37CB9ECF70FBE581E28
+2C8D21B54E4BFDD15FDE457D12621FFAD1AAC98DECCD3EB8BCA3860556C0716DE8873CC9CA80
+89B1AE177E3ED4D8818F4A9B9877085F20EBE331F4A8538E04CFB311B887C6B8D67579847877
+E31E5C3677B5F3CEBCAE783C58E62F14AE50DBE862BFB9D9BBD4CED5ACDEFF22D6896C1FBE70
+E36AB56DDB1DDC05F0E90C5A227CE89DFE5148E8333B63B6782D52C45A497A27DD9750A3F6A4
+0FE2E917EE28DCB21DD121B349655BC9E0F914EF3655B228AA795D7FCAD8593FAB2BADE0EB49
+867BD098EDBC436B340A187C351262DCF429099DA6C20CB20C7629C0442AD90E295021BD4E57
+3A9E8FBF2CA732F0881EBF201FAF0C1B0DA2F9006E7A4B1804F4958925A3C759C07794690E87
+63F358BBABB57460CCCFFC98FEDCF0E2DF51DE2F973573D848A3A0CDFCAF5B4A6AD757CE2DD4
+EFEC59261EDB7967B951CCBE2887B3BAE3DE0832B66D050624A6C8BAE4CD03FB01C4016E5656
+D9BEF33E2B331ED88CDEABF357542FEF0897FD6DD7CB7290288EC1A188F1E5B21B49C5A7463B
+1370045DC0D3E9EF7C3BE853446151AB50283EB84A2EF9A85C6D08FBDEDBFE335695E51390FA
+F18EE559FCBCCAA92972B3210388C77FC2BF1545B31BAD044A95C6F7CA7420AF2BE55785EC6B
+33EEE61BD2FEE31C1F0CD9FD84E91A8293D0F41141045FC4CD671082E0973AECEA3B67BD21C6
+9870447C4524A4D4C8CA5E047DED64FE806B0BAEF43485D965C5CC90C479C3842E7B0901111C
+3F28E182C602B2FEDBF8089BC930DEF52B86289C27A0C4A4BAA83E45C0C7F05B5E26DCF6EC1D
+CBF80A1272B7117170E3B60ECA7EE61B3F3DEB7205F225619839447A26F3ADFB2B5BFEBC8A55
+B7163F19CBB4FD28C17DB94CC5E5E69516E8B4E0C722F2C90E45579BDAD8A3851CBB73AF2756
+3DD688AC833CEC6449A2679BB6F2A1A31F4F5CA22BE4012CF9EB96C030B9253EF46BC189EAA3
+F929ABC4F23E2C6ACCC7C73D6E2D411D547C1254139E8A0E236F53942393D14C45EBB0451874
+2CC442F60B7C33144286519876D5D58FC22E21C3B2E689FB35C93DB811308110B66B532D1F97
+9EBDE895919DBDE0180AFEF5747CDF882762DFF5DC4828A639BB14AA417215E251C09559CC3E
+5ECF09142F16A6FF0706F5299558F4D4A0CD3A12F2819A4C16B8CCA1822CE49D87A42B07C9CC
+72647DAC4013A8F8F199925B2C8E1A95A41EA405BFC3474118B8BE09B716E0DFB67917C370B5
+0ACEB56479BFB66B0123E3FD7C9962ED08C3B9814BA21AB1B44C54B8CA987FFEAAE33906D8A0
+DB76DE5B70D4F3C7F36F0A27AD3B42071A43DF2B5C5136B90793A7502959C17D52E6AD677FC9
+3EE3CD2BE36476BCB4CE06CC7EF80427DA906FA32F4139C65291A43B6FDFF5967F02CE2EBCA0
+1E63F8F7A5284AD36FAC537923E4D4A8E2F3CE9B1026861D0D087A291A7C311FEDCED715519A
+B41682BC6A70409B3E315AE38F11ACA6C367B8BFDFF98466559EBFC10ED8F01A7122C96DAA97
+394509171C1A76264E521D3BEC429EE5FC481A6F84818427A687361092C0BB3CDAE1BCDF4D75
+1174A183AB509F2660CE4DA0FE44234D4E8BFE5A931E2F88B19DC4F7E02E53F17CC000E7DEBC
+BBD7E0E2B0F04DEC13D0490DB0570BB550337BA96B406EAEBFF16BE776E7364BB87F822FBF0F
+C1C6498332056601ECE254F80762E0A8D1D00505D7B65DCEDAD4C7057CA3CDDE0CEB49E6F277
+A1F380C9FA3F41BAF096E8604F25FE0CD1A464DD8456D925AFD3FF094D4B6D2EFBB0BE7E1677
+96046F9B63FE705CD9E02850E7922B4444E38C1798204AFC371789B691AFE7884E2C9CBCAD03
+C98E5FAEAC79D678635086F60E60A6F0BA7315521DFA4BDECFCB443BC40F977F64F7D8543DC9
+E4B0D04C80CD7C6FA5684BC6CA66BFA1C1D71B99D00FDECD854D228A6873A5B3A32C763E5CD2
+1E9E2DC4E8E29C5FCA0158E710789DEE64E4FC4AD3A9983D1A4BDA3B09D277AD7EBA6201E6B5
+1222EB7834D1C74211B60A4EB96DA19FF817768E90F55B8FBA5FE67A4E16BE7CA012B0AF0D2A
+124649FF53A2074D1231EC7D0DC967D7492DEB24216D0694D36AC6A7F90F19463F386852862A
+44876D59ABF8740267FF80B886CD84353C41D31EA0F4FCC7D4C5D74BC625902C24332C704BC8
+CCAE265D2E80078CE739E31DEEA18ADF5C1596062374B9771B442A1661F2F24CB8BF3D71AEEB
+7D91309B0A1380C8C81AE81439DC40E97AE2631A79ACA5F9196D2491C29AD7FCAD94125E1CCC
+F7BDD1B0379C97068C5352752E6FD2717D36725C62BF2771A5F656063887758E20B1697B0AD9
+05E775F5E0B6DFCC86A994CF98E3C6CB38DFF070D60809D49E03D8CA75C1B7B46A17D8DF0895
+768300C186B09141F9E4D4309B5B32F24AA4248008F915598ED6AB22FF30D2AF920F50BA067E
+059C2E4461623F1DAEBC0397CC6C8ECA0EBD59C157B352235FBDBF130196F603DA30CD97ADF0
+F3702665E1BF5815D6EA8A3E8D9266F47252A9FEEC1C7846BAFFEFE3EBF3623C59FE007158DF
+6C1779D2DA34FACFDDCAD824E522723E3ADF0D1AEBF111668E4E00A38B57FB15318C3C8EDB32
+4D1FDF8A379C43C033EC57C17136BA17152C5B44AACE44CA4F597AAEB9FFC761308EF74D5848
+30E167AF8163331CC492252478A14C7FD0C22FEA399FBE2ABD41412AFEEE28D327CAE48F96A5
+A58830F15BE6F06ABA7C65F7F69A2E60743A0EA558E2E1190128C1C18E7D24A723409A0DDA4E
+4D500D6AE79C581DE16277D5216FF6ACEE588ADB63C9B50889C5AD6CC914E61B2F7CB125F068
+8772A5F895BDCF2E6F1F4FA10CFA2CEE376FD1CB40D7C29AB61FA5A62A7D7946B05D48EFA754
+E7CB4EF3222644A4229D337A748A7A1E58A01E9D22EFE8F2ED818B28E911F3E75C3686939220
+23433C43C0E2CA444CAFB7C0A68BDE871C48152BDE83DFE6B8BDD719917DD3AD1E1D2FCA49B9
+60353A4E0AFF0F1AE0D88DCB93A950BE1CAFF41CB6B7EFA546EDD1592625A9D36EFEBA860114
+1D869E2CA03B7BEAFC7DCD6BD71A611D93EDA83379B611D1F061AC5FED2BFC105984B4BB0548
+14C7BAC226B096477702BFC9746F1F67FC8C37AAF288D73A5FE04E333241602BB6B6A109E643
+34C62C4E87982EFD0238848663B673B0EB70B167200ECA3765283D2B80E7F5A08B5A221C38C3
+F7432867BEBDF2EB2F2E135CFFBC2EBEBEB6E9939CF6CAE2E2F903AE16C084A777BED1A560D6
+B97DEBC19C84F659A9F8B9CE37748FE9CFD900827147D148DCED24996001373FB18153A2A62D
+2990017CACDF087880E8D8A15B14EDCACF19060B3035A8810B9AEEAEDA03DFD2DDFBCDE5A0F8
+E9631601C804FA1D131D19CA03EB8CA782CA98EE68413732DC8C3F69E1BCF1F0E12A0EE54157
+FD2E778BDD418AE6474BC0C7AD898983A8E2D163AB6D7BA893F7519785475696067948653470
+DDCA6DD36623740AEFF42C698C22109C0EF8CD9CCE4616C184859E97A9D112AF1831C175F7EB
+92FE0425D38C90F00EBBA0C1195E30D497ED50B6D86424D488AE738F7025E24641252ED152A6
+A27A108B3FED0C9002CB949056D4974396AF18DBAC644CED56BE4E32ECF12BB980C4338B6A0A
+99A0C3D5CDA29BD4AF329C724BB584E189BCA93D44024E45545561A07C87C8BB5E05D7755C92
+D61C9FE93A139D5A0E3F77807E41475FA81C1606530D6DB9BCCA56E64D5BA5CF830CCF141B39
+B50D97D86E9FD7AB71F8F41019C9E33DD5E10C417D60BEF34C1FF3126BC31DBF09611E2EA3EF
+B5BA83D0D4F0F1E259226D5BF34D0DB3F205E37307A1117A07A4CAA6A996D53EB2E29DA122CA
+A632E81591091A69C69C43126B9EE4CF160CA5A97EBADEF53606AC56677F16CE25D7A3B0D8AA
+56D174D7C0A70CB84F571B0F75B33B08EF89E17D53769516C4BE2A8F14FFEE0BEB0B0A4ADBB3
+8D4166C5334AD4F26030D32BB9835FA0A41B18F41EBBA723B84BF7D718FA3D24D95ECC6AD489
+0CBE8CD6A604D95268CDF02EDCB30F74CE2B8058DFE98B958BCB5AF5537D27240D7A20A978A7
+99666D4454FE46BC9F07C8066EBA3B3FADA2AB95782189A69B07B41461863048F80F96750994
+4843CC2A674E7F5AA6D118178FB845AC927A776F50190B5BB28A9C738A2EE0BCA790D2485BA8
+EA715E0E02FA3269C91C851AC5A0EE5133DF3756EFDE2DAE0317B36EB643AC5340D9F31D42E3
+D46C2780C9E4504168428ADB08AD0F84170276C0200944DE2F68B03133BB0BA745DD6ECE50FF
+9FB3CD121968B19F00EFAED3C7903F6F5E61D105993B3628C5DBEB4A20DC0EC03F7569992F4B
+D9CA3A60E2BEC5026F16A153493B26CB3970A9107AB4BE965792C158BE2827B519CAC46680A8
+6F17FB9B86C3399ED3DA0D1D9A7FB2C420124F4126F1906B89E1165A9B3D4F8C422D09634E2A
+43AB5F7295D88EE5508C257E771B292FB490E59361F15FA8E21EBAD08723BA26D799C771FCBE
+C01C201AABEBF751C6A1C163DECA2AE79607C8E809F67EEFA93ABD19506F5115137421A7AAD4
+3CFAB0025FC75132F5D669D371A0FB0438D60F1D0E1C439C3777CAD7C2075C3DD51FED06FF4A
+8BBF938884D377D60F72B0C589C2C15876A558A37F28CFD28798D28E7971BF0716D34A4581AE
+7981BFDEF8B413EC5CB471BD0A916C9DA41F02AB594C58D4400670E527D382F967D16D54480B
+8BED2D9F27CEB2A7FA77BD3D48B627D2F94F98C68934845F9576896F4968B7B9DBA1A6198A47
+FA0AEA1B4CFF24AC294EB85EBA0C90ACB263016B22F1340240B2A84595650FD4C4FE302B6181
+5496BCB7350844835A55AC6C66BABCEA55159D46DBABE9A337B4103AA919E3DE7C4F8C186BAC
+7BE4663E57D7B01A4223F2E35A860A0103C9BE527C92D40D15648C04075FFD743DD442D7EB0D
+F43B988B1AB83BB03684651BED5A2B264879EFD10253B851BF460020FB708DD5B8F5E02158E7
+B35DBA1C7E8BF0FBFC2D8F5690EBBE11956D837F67B793F38FD83084506F506DFE0E30D3F7ED
+37886FCA8F470AA2C2BED118BB6BE608D316E4E7B8E12C454FEE2EF9806F2470EB749C0A7344
+359B72D817D7BD1D952CA28E33111D2A6A330619D8B0E20250FAA6A2C8D8938101FE680EBCCE
+76B243C3EA4E07740C57C09F1D06BA0568E0B77DEEF4A5CB771635F68A67C9B8E3B4A4A20744
+59D0794166CAB89F7E2BF18405BA788E04A45F959C218CA6CFE88E95FC1E0C5565A2307A4190
+8814AFD7B599C85AAF484822F34B21AAF9628A2F6115F6255883B30EA20EE187B71D07A68F18
+76D1C5F54EC06EEA8BBE59D1A7B429B8E4CCDDA693AA7E3BAF568AAC8B21F24E700AA894F1E3
+4B00AE051E9B5F05ED1A7ED4189479EEDFE91A4CE71E681AEF24B4A897E6E11ECC97886C669E
+A370277F62CE711FFB49A0D54CE974EAF1A0142E1737425775A5E0BDA3D5641D47D7819B21DD
+341B3BBAEABE7B5DD5D020FBD8B6769B2D573AC3925D5CA21260FB0AFFBEB9F1B290839E0C66
+1DD7BB4BD593EBC9EFCE3A9AD413F550A6316BED81C5D77321AE7C63BD26AD0E61D6FBF0892D
+58961B3C224DA58A45932C5D660B4036819F7FC1CF6B4EBEA6C43861C01462F4E18D1450DB59
+9BC906EA751ABA0DB2FB49A72F327DBF04A811E62ABE7C2FE823652E3D48036BA33BD78958C0
+562E82DC486C6506EF7A09A3C4E34472085451C7B8BB1EF11E89DCF81E3FC0A956E20B92D490
+459B714B14A45DAD48BEB9771A70FE73E096B1543B19C8E83130C52AC9516871D4D9EC647A8F
+A05FE68523261C1EB6E931CC40E0150FEE8A0558BE99A60EAEB47F113FD08C8FE9578D0E3CBF
+A5582565D22985770D24C96898B104B12A5EA62A4F6F99F318E09873C55704E9CBB42926CF31
+4D6EBED3E650D17DA5BCC26BD15D02459A9E2AD530055A3BFE8A3083CF1F580A954D88096FFF
+B1F281C6DBA0D7466364358E6205A677F8CD54F89866AF20BDCC3C8E12F1CEAF65A1A486BDF7
+9F5ED1BE7849E79376FC7D438F54D9242AA37D24C8592C09D0E613F3380E995D1C9564BEE1A4
+27C3687F46CDE63686FF8E08AEA31FD564B007807C26C196FE839EF2B3A157CF68E2E1CBE1F5
+6D494620F11ED7A3B668B1CD6F6037FA9157C2C2DDA4836EC7255D6EC261A27548D905B3BEDC
+B7A2510844217FF837D6C19EC7158DCF486BE5A75805E50275A27038D88B8BC64C511B86F732
+E1759FE1CDBA01E8DB6818C6D89857C59356077F0635E9291702B9A71FC3A48E542316996029
+BE147B5C83B9AB7061A341B314B83D244196CE4CE05913BB0FA58A56033047DAB2E01EF958DC
+6F36F46C8B348A34078DB6D83D2C019CA0ED9DAA18A3BE0F056709D406A6272279404E102C8F
+20C4027B81DF0A1A5A7748FF7AF4165A421AB1A81FD119E4B6B1E39449299366A713CFF9FB0B
+6FBD48744667DC8F06112ED70D8E12FF1A1CB62F2EE2D0FECE505CF95C38F70FFC1D4D203EDF
+7CB5538937AF138D0367F39DC1F7A88CBA4E8EA60DFD72365EDBA0B2BF0E2365648461AACA15
+945D099552A23EBADED36BC1E5ADA67099174570C22F90F8890BB534204FE0AA6B57C337494E
+B2AFF9E04663744ED9DF02CB7C78BEC3E99DA78C7A9A6B44F6F93C4DBC175177B3173631702B
+42513E2A1B49F595A56677558E4A590DE1DA8CFCB403052B0071DE17D5CF00C0D4A55C8D4B80
+5128F44ADFDCF09FBDF2E3A31D74603F476B7E162EA2A2D4CC2373421DEF2ADC72488D80DF1D
+4E62BA005FBDF5C995FA17956A01F2D6B62C6D18EBCFD202672895696BEDDF2A88F0959AC17F
+7855996222266A2C1A293482A765D7DE6AC1A636D8B126B46348CD8F771E94CC360EE163B1E0
+37E57A22181C3CEE7D27CB246E91389BAE21B00C94FA9F2D00CEBA0422976AAAB42825AACF0C
+F27492DCB11B53DD5419759DC24514E8462A8EB0F40AD620498ACB5289008FEFCFA4D4F5B3D0
+929A9B955B86EB9136D154623F672B15608C3F10931895264FB4570FFF388DA8B4B783FFE423
+8D1F5F58F4157AC437D5472E80BB99496F494DDFA54C2B2CD57F5F22E4FA8F12081D6005A2CC
+3535076AB18483F5F6BADC4FB5BC2BBE2C94D2D21EBDC0C241AB5F6D0A999361D538B75746A0
+0BC0D7406F084B9729884AB70F41404835ED4FE2C3B04D99C5A3FA321CB4E4B8B862F1FA17BB
+300192DDD3B52FFD3BE3EE908D3CB2E2BD4A1F857247B722F624FF1032654F770D6FFD372147
+C517C985A293167FA7A58DDA46F34370BB9A3DC30CFB24E52D02831531058B306AB15A8669AF
+B3450B2A82383E899875A31E892A71C9E6AF9C60F2996A1FDC549A03283883434EBCE80D9AF1
+30DA7FD7D85894EA656CC049EE19F6975DF9182102F01EDE18F750840E80235994D92985CFF6
+9916EA8723C140020ED0DEBBE1608D1EED84294003D07B0D00C97A23CB4015426552CDEBD6D0
+78B8B608AF4CD4759F2C7E5B323B9324601ED9570CC72A5F4DBF271B94BBD5EFC7874A4B3D27
+AA2C8C880FE03F2394BEF0D39A5C05D56199FB56D851BB6DD41888A11346CB8FA758541B3B2D
+E61C493217D35B62341FABF7BCD1833FF0D45F011486EB87FD3D614F0B8A3CDD7E48CD00815F
+712052FFDF830C8C5DB18A1AFE3411B228AC073B37DC272E909759D1CDAB750588F827AEE711
+F9A13ECDAEFE8B03A8CC5CE760EF0894D43B431C2FC8EAB4E1B5BAC782E4D5C3231C678E0CA0
+7C93CC3E06B963BA62388D3EC7A585AA35513638BB6E616304E67873176FB153B6056F7935D1
+B81327A2BC46C4DE6F0C620CE62BED019C28FDEF224F56758D24318F9BA1E431898C387AC5BA
+F777ECD1AC7398CFBA06615F210CD8FD068C62D2252F89365B2DE4D89B959F700D9ACCA19EAD
+8389F75A5250A519DD7D9B67CA553C393BAF50DF4C9C3DD9075C7371A2829BD06D1F18BDE4BE
+929F71EE6878D218612A706F6C75E0FC19A67DF100033D26226D02D78BED4C9CAC796BA9BA8E
+6405827FD9B5DDD448D3DA8952FC5D61DE3C5986BAD2FEE78F4C1DADD57692D06C8DA517B21D
+1D036E6C6360F77445BEB4A1A498DFEE2625F2234519C884C49E329AB72AA7C99CB86BCF0A06
+3921B55782C3A005F7C4721A3E959C3392F4BF981ECFA71B9F42BD896AD598CBE011EB2B6BEB
+BDFA799137517DFE137DCB30CBF127D2854E88F0179DFFB2A8EF470708E5D6B8B383DABA0723
+755330D49249504C8720374115C37DDD88385A5B5B751BB9507CDED99451B02C3318DB20E9D1
+2BFA533A8C4B6FC328C695C3DD4132F4DB0640E81FB1FA27704E1CCA7980F63C6B1A1D7A8AF1
+722C78B39C8D2CDE140101A8265372EEDC7F6A8E079BC0E83B1EB88B549095621932796DC580
+7E674F4F34509595B48DA962D62C6635C3E4C2E7C0D6B4141172FD019EE3055A1AC08141B47F
+ACF16128E156D97352DF7E1D395AE5B6D5F379DF039BABB492F72B6C1C3F145800BC74A32523
+48D9CC5F90A1ACA922F7DDBBDDC72DF54DEC5E8FDC631966CDCCF55C6311925D01D0FC9F5925
+85A954CE3F9CD082930607FF2E89902F6C5F2F98DC84481751CD43C51AB242DBCDFA75337875
+01B3891E699026E2F26C1F47019B89AD1938185F7984ACE3B8C2003C4ACB65824A2869426F81
+6AB71CE6902DB859CFD2E50EE60F2F5E3D4E7A025EEEA265BBEDEE9F1EE933695BE78286E506
+1FC9908CAA8EDD889E7CD8F7687051080EEDF06CFA13BA05710F8FFE74D52D4E1D30F015D378
+C0C00189ADBB778D6B2D6A5ED3B534AAA70BADFBE58F936C257B03451AB0148F5A915D80B354
+55FC7FE99D469CC02DCC9BFFE526CC75A3724B476C9539C017D76CB7BEA36099D80E14ACBE01
+4074AEA0D9AB47AE608B9333E32BCCE78A6F1BFF6922C6ACE620ADD5403147E2C96CAD263E43
+2230456AD4361575FBF76A8811CA3871AC98E692199D673AA5FB9CC0CA00CF2CC13434EC7CAD
+855BD454B775500A1B0C6C126D0DB1C4F12D33181B50DC83DC1501CC11F2E02C45FCD0BF683E
+9CF33B103DA9AB0478086D34B5A764F5663F98E79D3796251B1C2CC05700FA9BA556E05CAF8F
+26891E749981EE3790830C5434E0D1065B5651188211D6B737135BC3020EFFDD92F8DE91A759
+21AB952C8B6E80A58DCB2612EDD0A6C96D0B9EC40667F70A4FA7599DF66AC85EBA754933D653
+BA0BF65D97AECD2BE56E6BE08B5986A0FA673F8590BDC89F15DC523AE16FE892799A1B31DEA2
+C2B751F9A7168A2070C09ABD164689B52A0862F7B4576E40F0EF6B75F99A7BE0246E718DBE90
+8CC5BC7CF75F8FA4DB376417FA2ABA2849E53BD3BCDFCE626E2D3A798BEBF28C8B2548F151FD
+7F97E1094DAEBCE17F6BC0CF8A119A938FD4C021DF408410CF1B58B94D2A8C4851822EEDF9EF
+96744A358479BB83D213B1BEFE13C71F74A8BDE8D4DDD167272FC9224E78F6F117B864A61A31
+FC1C159796D5435315C559D3E01A1C41A381B83BBB95285953E2FF8F58B4E6AA5B91A2A234B2
+2314BC38CBEA27A80601688153FD0E4FD3CDDFF259326BCBDCBC454A7AC106330D533307819C
+1C477C7C03DB10B88B2491ADCFFC86CE91148F2B189E93DFED40A52A3BCEE5BD4CC55B442A6B
+40EF8B1CCD08486C9B529C8E3F30D0A422B525D8253AFDBD43B2676064135165408AF5F1657A
+49C0ED75779EE6E960DB6FE47D1D36131A6015EAE19342E1886BAEDFE4F01A100579E526B9A5
+9CE82C6E85D6787EFC4A5EFB6AAD8612814FAF037297A64A4633764403F6C6B9D08137E8D786
+07C75CDA959DD0200A003779EEA07063E34C1BD220E6CA488C7AD7183E0D46355444DD649E7F
+BD72F783805914EBB1AF69222CE6E24777804A8B672E976A0AACD30220EA7EBB07FED9C2CED5
+883030AC10C5DE5F73062692CA320723A7EB024EDCF59407D4F8B291B398564CBF15159BEF70
+67C230D635565BD9D9F02E8F9AC0886983A0D9E0750840D4B212FEF4C7166E3F33B08D781AF7
+51DDB46233E9B66CCB93387E110B9F9568A1A2CAC55314F7E8FBF73101838188E94B2C67F5CA
+EDD2FB70F39E8149E4175524E155F84FAAF509DC691A67652F4020149943EC94F5E7EE47BE44
+49A9162CA228E025E591939FBF8CA8EF2419B120EA1DF597A5EDB87ED983FD2F58870C86DED2
+32FFB7DC2010DB460ED6496D645657FBC5F88F4AC477DED0A5B85C342BA264FA5D0C3E5FFDD3
+0B4CF9E1FB7066B8A337572FA9EE90BF8CC100020BFDAEDC283DCAC6E35709F0591DDC33C89C
+7491E921184F74BEB6D06425D8B9207AB2AA31302AE64179B8501BE192E76E9B61EC1A36CFAE
+36A2619E834934CE1DCFF1AB6A045E12B833C895A78193BE9201897A8FAFFACCD546129A639A
+57C7F681802675C1159A95FA641252EFA9C4CFF3EBD180E8CC18E75A0F19B06A8E8B9EE38FFA
+3371268383ADF2AB1C35744FAFD1A3E5AAAB8ABC5E61B7044FC4F507165A5A6A6E4F02BAEFA2
+0D7D66231FB07BBB451257C58347FD5B9DCEB4E728D3513F772E7A6BDC65663C576DF7F68BA4
+E49A7F2A1B6F9363044DC8D5AF7929375ABACF1546F4B76AB7DE69C837848B9D674E2EDF13AF
+0D577209661A6D0AB76144466880101ECB0C9AF049B898036CF83C1FBAD54FA4401E0DF518BC
+6B649268BFC5A007CBC4729200B14E968493C64EAF68DAEED2A5C0282788175191C68A8907A9
+C6A1815FB7207CB39DF26B9BC5EDB66C6389CEA08CDE39047015A15AAE756D17384EF3519385
+1FC1CE49DA947692B18764B4D34E7B9E8C54017136870D72A4316D88177B2F4F8837605EED5E
+58D7F6D2B98E5EBC6A65590A7BC1471465FB2266FC1112AC0BFEDD5E530434477E2D4A30FC71
+06287FEC0C3E48BE1440599F011267C67B77363557039A2A838445456D5DDB9EA26A90E67E2A
+411491C30F09ACC1C1DD2FDDD57C5FD34631A97024364133F480A590F98BDCC812FD6C467C88
+E68B3DB70C51E451AEF5D6532173828B1B4C03A018DFE86454F03C90E9F3CF2D04B2C662B249
+A88461067E6C8D430774AB80A92CE8E1D313612C6BC9D93358100408216FC2CE08CD84A9C4E3
+8E1D14CDF49C5EBE5A8B4F430DFBC4CC09C99FEB279070D88BDBC2DD8027C072DD107E36E7CE
+40DFC62C70B288493CE468176B0812DAD5C8FC4EAD2077F33BA5C5E28DE89FC963A5BE3BEC2D
+59238CA98989AE9D9A295290D0F655A7B76A4D59E671080822E0128077FFD2CB9F1849944C1C
+699A86DFCBB2C159CD60B2C784235849347303F77DBCEB1D8133CEC40F773D574183F793E2F8
+0A1A52E1F5032D13E4E6BF864087027FE4D88DB84318E0E35B42A7E2BD5DAA55EB67A65A1416
+76561EA1B72F13FCC770E1451682974F4135C228EC2D277E6C3C2F4DE9649214A752017B251A
+5D48CBA654A36F0A60A1992A8C447EF99D41E3ADE2F584392B21FA291017BAF99F72B47CCBDF
+BBC192E3A9A7329DA1642FC8F67958C12C100E7BF0BC2BBEBFDDDF96BBE53C78F0FA78BFD53A
+E02FE94681BB55E83730B531065273EEA068246F57C580F43F250C1400778E4E622A72F15469
+6F2FE205F6E576ECA4A902CCBC44787598798C3E463237EADBFD0AAE83FFD48A1F02C5B7226A
+7A838056E97386012082269AF10E06F21F23835ADBDF4DE01EE39DA87904B769E070C772C2CC
+3E000F8A3B2ACEBC5AA484DD7C11216C0519D5BC85887661FB48DEB0FCFBFF691D00466D7C1C
+32A36EB9BE8A88F50FCCF6BE870CD7AAC7E3F12CD641B39432922CFAD3C304F424BBF2A852A4
+35C7A0698FCCDB25D86E9CF0401B1A1EF33A93407F20311090E8099B6C72BB7F9BE72BCF6CF3
+540864C82C52D9379F22323C2C32E2690EFC302B104B8223C2FB1918DC01E04A1F4FD270BDE0
+1FC11CAC05B307F2DA74310D62CC6BEE9A74A9CEB7B5F73E651ACA77A8ACE1CF34BBDC97FA05
+E8E4E3492304BB5C8917B5858E33F63C87FAA02248E8511CD50CBC983A60811B34560827108D
+B77D41F13AA256E98F82A5B226AB573EE7D7E2D8B81A286B115F89A1012BC018FAB61C00637F
+117E0ED5ABA1DE6D713CC4685214F3C038B75E25EEE1E447BE7150EEE411D7C50A7B89D5B0FB
+1D82D6FD8C3DBAF4C65433E530A6EA8B6B976B85736481E67472B52FEAC8D29D49D1E3D86D1A
+37DED74D84DBCA9453BF983D153F2AC077A5CD8E1E91893B104889063906BE416BAE6F935A23
+ADD2FC21DE4CF5A4683E0F3A6F7A829D9DDA0F3BDB12F3845FCB5DDDE8F1981BEDD536AF7A17
+1E41BC6F834646C1A6DBF1F517D80E1E8A8E9353CE86B50ABDB7B4415E1C34AD268EF38623EF
+07A3380A083108E6AFF141D65718FB8F3B4ADE39E184468B0BC319424920C5D22CF047E7C264
+B7E0C80457D4CBF58DFF15AD4684F9F807D28DC5C8FF0F2E8336DE5391D52C9FC47EAD7EA04B
+411720D92C29E6B6F95F3C62E893899BFEFF82F23028F2DEC752BD4B1C15E22A688FB287F072
+93888DD7C1D46A0C7CE722E7687AF8142FBB1566707D85D4C481F846D3F7DBCD289F1AEA3C78
+24B406ADCEFF74358C986A23DDC88DF88A6B8E663FC165AC11C29E96890540F40A9529A2B23D
+F5CCD8490193F5F1971885E298ABCD07D5ABA1CF4695F2E69C335BFC81EEFAAD319398684A4C
+F928BB110BDC7E1A4263CE7F153A88590C56E00818EEB745EF2BD290D3BFF59E9CDF153243D8
+EC743656C828D08823647E4B439568D7B2CBF1CB66D05E6C89A0C64ACBBCAADB8A4E29427CB6
+5ABC24838C60CA7BD594AE6EED0B8E7145D7CE38EDBD8018662ACADB5F9A0466FBD8C8BF5524
+8D8F1E2C6BC68993CA49E744FD1C616B1091F086DCBEAA930B7C78B5D69944C7E7A2D7070851
+4B6C9B40EAEE58F3A71F3EE763F528ACF0EE0467666E052E37A9AF4D77A350E53466FAE6A66D
+B74C75585A3FF7BA41C54AB73D90FE904B9E6E66F93AF84585CA7EB2C9A6A6A3C94D3DE8B9CA
+D5023B61051E107054B9B6B6D201E407DDC8EE3AD2794D3F8D3C7CFC77B8B210E3B7A18C9284
+7E7F9A49AE340DEF0037A5863902B746AA0A57B9CC2C60A7094384381F89A7EE81C3394CC3BB
+1F36A1D4317FA211E615B9201C4C01ED84C4B7E6311D0DFF97FBE799E5390E76CC246C1673AD
+EF4211B8AB895605A0FDB7C99444B94537F0A63623C20CD08AAA3A80C4C6547D7AA6212C769E
+1764DC0A137666E09316A61BAD6F36C240FF3D352CA0220DE894E2F0ED0A5ABF467B264BE9BA
+BC4CCDD0D00E64456FA5AB14423283B40D2F8C3D764770BCE093BF990AD577FD72A10964F3F4
+DA1F78A207DED3DE28EFC8669790E48A7F3F8BCFE6FB0856D891706A75E989EE1345F5C7F47F
+338D440688A3B16255C7B3BADDDF23407F792653B81535B3A4A2A9B2E6C601E449AC842756D1
+677F809BC6051E2C81BB793CD1695FF5CB1FA5E221878211FA7DB37A9386E2B9F8D86233C74C
+6923DD906A3EEEF817C7110CFFB24D4841390F87E803ACC7926A064A30CB251C8779423A052D
+0AEB74C0F1B2064D8B4C84EABF5F06163667D857826F45AD998C35EEEC6E72A479EF85041BD9
+B57F10B6EAB0618CBBAAED980F9727D3FEF316CBA30CD5808B1B74A8EB929FBBF686737D85A4
+9AAB0CC948BD3F3B883EBE8421948A7731D7C304386EB70DEA937D7023EBCBE47BCFDA988AD8
+8ECEFB076AD7AF3986F3542E2AA0E7B8633F77F29F72649C6DAC3F32E5C038F84D5E8C9BD6F6
+0D35649CDF3E285DD815390D68B3765387FCD46F0180F141CAD0B5E692BB25CFB0ECD6542285
+55C6A01FFFBDF664A91086E2A515808D11A349FE2519B0A045A16F99E251EBECFB2FE97B07B3
+649698C5213F977EF27061A1B4042C7667D3873E43D2D0551A36AEDD86E2F9BA07070F1FB46F
+5F08F05E2B8F7F529B20F0C9AFD39801FDCB39AB678600CD6E6C24C7E98DE279C1CB7B48639F
+A6874D2AA197EC6DC51E00105E1DF7F8EA382DCB9ED81FF81BA2EBBA7C14E3BAECF55F3319FC
+1E6004096284F2E9047F35C37FA79049D170EBEC1C93652F4BBCC5DBCC98EF5E56B21F3392AE
+B20A83933C4AAD7A651238D02556F50FE4DEF6B8BB736B0834CBF56ED357D8CC5A56BD211FDC
+D508B6CE53EBE500F07AD4C9681251DAFD1401BA5733280E0418CA275EEEA8D0CCE93511D776
+E38E87705BA69F4A6EE0CDCEC7F5B968441543710E313C3D66A9F1B3BD39CBCF9408034D125B
+1DBEECF173E3D8C33A8ECF79A4DD1A2D097C5C6B15AF0307A17F4517C6F10DFADCF9A3E5A421
+DCCD6EAD31814338A5F3809A12464AA265917B9F239DF8C287F748E6D4B62EDD11E8BB87145D
+F05A164E9A85801F0DFC1A45F1FCA50B4B518C85F43F3FE63EBC7E36A5179E03DFB82F440825
+140D9043FE286F256ADC71D64FAF320EF5BC9FDFEB61DE5CD491705DE764E624BC22FC980309
+A00F9FD6DB77A14EC318531A8BB0425B500D6D4341D166A3770666C5CAB332BBFB0E2400ECB8
+A3EE5D6C6C8A72CC2613819939089F234AE4D8A98D02EFDED70677715053AC534C223813B461
+9B9152B007BA1B29676D8B3F5FC6313890593E7CC1D195D0AF131A17F55E54FDF25867CB165B
+30DBD477A9ACE305731B9519324B4EA635FAE26F4452CB0D760F3F15BD27579835781DF4D5F1
+E78A8E80F06D94C8BF5ED70C52FBF526E105F9F215654C427ECDE9B75E4A04DE4208A902FB6C
+4B5FEEABDF1269903AD478ADEB7F751FCB2AE8EF7F85536751117FB9FDA6B7776E52ACF87EE1
+AAAA2378F6EAAD76D002F17714A0D64F70669502ECB8113CA091AE2280BBE253B8D35B6A5F47
+4C201829B935DFA6422626772D81CF556309D03FB6E731E595A1FA4BB1FBCFBC9F4ECDDE3F71
+8A127569C816C0345536D55FF85811A24B9CD6C5FFB98404274925585C340B682399946D3689
+FCC32BB53C106DA4FE7B6E5FC229A90A30484D5BBF2C05138A7C81BC679EDD42B613DC866137
+1DA72340C3C8C093D8A090818BA6AF44ADA49D9F0F46F5C887A026994361446E9CD50D2B436B
+269F4E6712C9A213E3061E055DE02CDCD3CECDD80E91FF4529AF9E91FAAB6328B38D505F4748
+4196559B6B637856D8A1CCAE9E7D9AF357A8DD405D6171515BDC575D8A471A8F49AEE0BB095F
+154BD0E7307440A788C383032DD60CB377D803DA6626E6215B2CB899357B0DDF41B724C1D48F
+78B144DFB517A360DBD9528EA69F7C80EF38C397E9931B3E682AD100DA2250802C4A2CC763A2
+5B72F7D35FC2950D5DC1416CC294D9BCF550D879590CA5779E30830D9214E8F75E42189D3AC2
+D9F78B069DE8483252EFCBD83A91F9D24219A6B36C91A8E45202A8A5C1C36347FBBA74812C09
+AF893C155A77FEB605959F4B05F2B219C6B26238971AD05326B1106C90F7C03A1A19A5384E5E
+E423705E3C6A609B6EAF82759D696CB07FB55D8403B0829C11C7FF3FC881D8A78CEC164002A8
+C5EDE2D5E3C4EA4D89102E506BA8981E0EA15593B0F5C8BA8029C93FDB6FE700A64AD059ECA7
+7A2BA7931B842E57A31441C34CE88E469D10E693DBBFC98C545649E938A71BAC23CDC887D940
+A94A3C6DCD1F158566FE8F323B590265F68A2267661AB75565D5A297056DE5A003F5377DF7D9
+286C42CC3B8D2ECF8A479D47FDFD4DB7B7B226ED87CE52F5E7EF1F47190C4BAC27DDF4869A60
+4DEE3E64608F4B177F4E1392941DD42E831ABC59CA209A8CAD05CFEF11E88C201B0AF48DD852
+21D5DF9DA665ED07EB56514E0C450A4B7E9FB65EF0ED3D39F68113DA0370C7D243473B9186A8
+35B73B768003EF901215B4AC5CEC51E570F51AA498565148D297ADB80FD7234EA5A970D91A4F
+C9563227DB2D1952C4C1BF09F37CBAC460A975095086859B798BC66FE5B35D11716F314CE341
+0B91BC0A7426C4B789B2D69FEF76DE29AB5E98E539FB3D9781DB57D09DA71B16533FCDB085B3
+911DEC22972F30E1BA0537CCC419FE37BBC493E10685F239500A0B6B3DA9CAE4122ADB5DCB9C
+2A455ABD01E80254F07FCE443EF2E1AA3C3F4FB16FC0D9F4938B7598E9AA6832FEF1EC581ACC
+02BEA9B8D4C3787B6C7CBC840398453825D62D865ED5B0614EB3C122EA6CD3A43AF0134243AC
+C8CF6D0CE6754E40D2FF4610DB32E1A880D6D04520BF10F6B74599D0B04738C606251AFD9A6B
+46F79F076E6115BBE72941BC183318850B4FA849DC1D3000A5B77BB16E5398FDAF7387998EC0
+93CD0CEB481E75829DF2E8E7D0C2F12AD1025992DE0A5816E94B630DD5F86301D2790FE59029
+F2F5AE83045826B1475C5A73D31B1A5789765F795BAA698C8AED3EAAB6ACD391E6A60E9458F2
+EFDF4ED3066C7ECB8DCE3E0ACF16BE7AD6E9E4BE2D30FF1FA2E63C979C5542BEE068FBD416DB
+22C765F4746C164E6AE05F300D13B62A4131F65D63BAA7AC9066B3225E9F9CB3A0045AE9C8CB
+08EC2F352AFFB6278F1EE4B1BF9D7F18AEFC67251254F960C84AAABF70FBB15069A3C702E77A
+EA6F315E418B5374922CE7B885DC9D36BF3A1823293C90D0A306F4781CE037C35D6D4CA026A8
+7511EDB328B583B83CAB07384EAF380CEEB3E227745E47B6CA993625FEB9B611DFFE391E39C0
+58633B1F88044BB0E89DD2622A4C032B812540F212E7B5974B8301FEE739BACABFFC73338E1E
+E9162760E6B00F4523DF6939F052331BB531B3E5966BED770CE584F91AFB9A5791A420A554A5
+16B381E8FA3E0A9AEE4011E0BEB4C80C7C2CB22EBD83AC8DF6BA51C971F19BCBD29C589EF34C
+54F853BBBD42E2F7C9B84AA8B21909C291347C725D14A859F2A6042909C4531D256D0CFD9F35
+5CBE69F979A18BC624F43BEC53018F1BD8C601B091A9E6028F75BA992754CC24E751050E37CE
+48ABB983686A60652D212A0EE3CE0A54F4E0AB1D051A6159EB2673BFBBB8D0FF1AA7A2087E55
+24354C56B0F0FC7DB18BE87D01B178A2833316FD3AE72CBE1A1CFDBCC9A1F6268310448B7E1C
+F371627F1E218C12C766017CBAAF29B239508F32AE956A8F45B4AFEE9548059D2108163EB7CC
+9EC67D712B98F2EDDBAD51C82E4C0A2E88FE45880D21F5C6E9B9F894B111F676B7DBFD824934
+5A5B62BBF4DD0D9D4D17339ADD01EE14019AF5A1D5E9A1E990F0CCF5A2CDA506896FFCD723EF
+F02AD8AF9124DEF4B6418A2650F6B77D4202E16B1173F422323F79A6C6120C060F833904B312
+9198566F6BC417E2613E9FF69FD2BE62DE4BF5318386390113D8B964B28348F3DAF92784BF14
+2B4DBF63E1D0FE85E9399D639F5AE8184A66AC09C636651E32593C78F79AC1ED098C311535A1
+4F63835DB2D51D53B903344DEE40904B229D57ACEE6910A3C47C18802FAAC0F17684BBAE851C
+AC73E75CFEAB8002AC1E43689BA2C5FB2129B2219E63F8F3477BDEA102E44514EAA8874F1D7B
+76F78EC20E106FC94762190C0ADCA7CAE19B167A171F867E8CAA3144041CF7CA1B95DDE7E13F
+CAE6EEC65CA4E6D676282FBAA34D951B0034633F9F48B357AE9791CE71A18816243624C86F45
+62D94C1292A1B3B2760A0520EE9562F2B487F0551CCEECE756F90EBFA7EE869EB99D73EA9829
+A5D153D06AC3063C9B466FBAED3D19D6FC367DF863A9D0E827489D334BA410EB029AA429CB0F
+92E04BD52AFADEA726D63E5E322C04DB0FB6545F48B6FBD2E753951FF186473CD2726C1D9C2A
+30D2D81DC0B643E022413A70F49A32E67535AEE76CE668142F32C34DBE77296DBD8B382DF9CE
+1A9737BF15AEACD88C3B934F78A292050FB3D88C99839268163628F9612D8DA54A1A600E61CE
+6807CDE7370F6F84418C991A71D37DC2269E976E28FFA69B202B375D45F00383C24D93B45E1A
+F7B37F08C81B909F325D4832173057CE7FBD55C75AE46596746592A9840224CBE41B1723933E
+E08B260B81C64089612EDD94381441BBA08E3DFFF57387BBC37A130B16644CC97507DF193C00
+D36FF9635DA18397673D885CE4793D15A720F7AD54A1366A629197D41B9C07B95DDC2294C0EA
+F9BEF7EA8CB6ADF0F59A3F376810AF6AFE1B96F49A5051095B5B6E7433393BA41A29486C8084
+9BFB483E49878AA9EA274EFB23A53A9E642619467B3B69645E8EF21F77C30839A5F23479A42F
+3FC9F9E0205117D80485D421819363A8B5798C03EAAFE4C1F1A23A6B400A5814C5D0C1B2DD41
+418E7DBC9DD8A4CA83A6292E63CE45ADD123D2446B2A1D4BC201F407D636903FC8BDA69241D4
+ADF3D51D0220B928FC807F18E74A216E10DE9275B716CF079781FF49E12CA2F2DAA83DFFB60E
+775199988505F4DF3B8FA6E27441E361C4CC487D2B3A151DDBDA062E6C6F99ED9AF0A2BB5063
+B06BE06A0FEDFBA62AB8C94A8C2C09D7C7F105B1BA745425AC946A55FA03D687492CAA06E9F7
+38BCE51A9991DD3C16C6A9207B114AFB592D34EC2B1829573EA554300D6080E386CD07B6F5D6
+A121A3074FE2BD23DE31A33B5771669E0FC6C75594BE059DA7397FA7C8FCBAF4CB1ABD67BB38
+4614291B2B0E33934041B34A3ED39AFD96DDB2E8D3E60ECC97906ABF4857744A7CCEC796E102
+D063DAA3CAD921FE715E7EFEBD9F10CF5B6BFA9428C3D40C636A07C477E71873A5F0CFC68AA5
+88D09DA7D0576770FFC28E087A967DD5B33BF2925B63914EE379C5CE790F494E838CE0812FB7
+38311CDA93CF7DE66A31287CCA00CAF8FCED9A6194651F26FA1A9B8C7333A49167124A16EAEF
+281FB695BDADCCE78366DEBFDE0E7A6933EC0AEF8280A2E7592FCC5422BAEFB7BBBB9715F369
+455A353FFCAE1FFBD08CECF5FA02CA32FC7B36A259294FE575DD136F67953EA4F8EEB3AA9A3E
+E68353250F2F1B2FA02FE5120373AD0FCC3824EA3A20A6A8E815CAE691A05BB7BA0514421D91
+C829A3E8745D6B9E21041F2B5D7717C2F36916A1C23ED72DC9903573A0B3BCE4E09424582596
+D399FA2338F6BBB9EFF2B7D8051EBD85542725616BE1D16802B806773986D3D32820C5A202B4
+E102D460E110820F732EBDF83B235276B566737B142705A44F9F205424DF172FF72C011666B9
+6CAC3899FCA2660D95AC38EA8DC62A29AB8FC11C261938EBB20DAF8A22E448776283BEA030D3
+39560A37FC9ABEA275BC153000D35155442F201A403895A1EC7824656285D0FE587DBFCF18BE
+6C2A1020F7015A452971C7A5BCFFC06459288F20FD338AE3934AB64009B5805ED5015BA5E809
+CB7FD11CD3A7A1833B6B34488D168D548AAF05318ACA31183F6F22375253621137A53775CC9F
+CA5AF23C96DC5109912109FBBC3EE09665BDB45DF1CB0FE807808638A077313726C27C2AEB49
+DBBBD5311E451D228138FEA3B431EA92B84246F68666D34E94662A55E0C22817E78F1D2A4357
+73E440E941B961285AC15536A1FEEA82F251D86F52256441C6B89522D5AA7505CE1733A3EE57
+CC0DEEE8441BC325B6709E232A82E353861836BC0851FD91DC4E67454B9A0266D030E29D6A7E
+3DE9B3981667E5D6C470B5E6FC7D9C6998F96250AD8DC30BFDC369A9C4E13E5BA81AB617FD8B
+E186DF891195C67A19713C6E0EB413585549A58E0DF18797ED2EB3A17CA3F0EFA098051F74B0
+73245C77D47DF48BF2AAE560B2A8CD80FBA2FFF826F9F9B32139B82C23107241A6BD29D05509
+A9B87D7D8E328228B3B7862E8E806A2913422FE05B6420587ADEE632080D90A24D586C2F5EAC
+7A37EB3FC328564D0712CB19D2F2519AC43F0033D48A4E34EFF8A88C2CDAE784232EFD55BFA8
+F58073571E0A1F6F19384937CFE37E350FB63F2638577EA405C7A4569E4FA238F37AF13DDD97
+A333C4505C483873057FC58D4279B66AA65379954FAD145EFBC1802B4E881F46ED643560A10F
+446165F55526A42A9BD97BA650AC12646533CC8257955D9BFB918BDD218D1C741F30502EEDAF
+52D0604749B7FDA4C2A8181B8B0AE3D5276BD1C56B3D3AE651330D55964EC83F841D3C9ACFD7
+8ACD2B1CCBADE78F0F47F79AA78ABDC484470F4990B4ACFBC55F0E5F944486132B59366997AD
+ADAA9FA772C120DBA87A64FD11AE590E1BF97AF5CED09CD70533D1E44EC26CA20A1A53DC2464
+694DDA69CCB087038689ECC9B57C34FFC22368EA5B102790DF3FF8E80C70FCF2AA3635409D65
+DADE86CE7F06B3B9826894478C25C112B5AA3EA5F92447B49278041280F740F9FD72801775F6
+5FAF3B53996687C7075CDC5B572BC8FECAA785C7BDF94E1DA0B57A852D3FCC9BDEC23E3D6921
+0EF7F44E191D31D51B05F6598B3D22FF07763CAA8A318EC3407423F4538CFDE031EB57C3B20E
+9EAF8866E04A60281CBD1CC99BE9A5AFA37DCF1F32E1272E624236F3016EF6BC0D373FF5F407
+81AD9BE6DFDF1B69DAB9DCC4B7935DFAFDF84256047BFA5A503BFA3B038E743B34E352976833
+1D79DD6491FD8AFAC7123DDDE18D55BDA07E581661CE6A5FFFB2363187932D84B063614F3D88
+E3B26C87C81CDCDDD584FBA4C5BEE3A6CD4DE2F2DBDBA7BFC0CBCB167A2F4BE435F7977010D1
+ED0634184BD7A618AC25C5AF2BEF48CFEFCEAAFEC5559ECFABF3C8064872B01B1EB9FD2DFAE7
+7D8367FDA7F940487EC9C6DE52B7294D06E2B951ED03CAA2491CC367D5FE0FCE14FAEF8C1568
+89209E47E4970F89116E635716F5851FC23D99D14E946ECF682316A58C2705151BBE5371C2C9
+4BEC733E932336082B2390130C59EE9CBB211337C5CE01DB648131DFA4202BF04DE43032EABE
+6EF6CDCC32879B814ACD14B884891B8C14F79267BAA6F62C4FC1E644D617443716E1389F88F9
+1975956C289C9C12F2646726226066206151873E61974CBC71B8374DF60A0B490094807FF62A
+5622FEC2C376F497E5D87DF4F77E5AC716515F34C8CD7895E0EBBFA5E627EB14A40409624ADA
+3E17B6449192C1A4AF68C2F55541DC9FF82AABCBB23BC64C094D4DC3C10BA60F8468A05A5D82
+F880729B24D10A7502C2DB34EC3FC64B951ECBB2917581FC44B65B611E71385B9F41A427DAED
+BAE8F00C700EBA092BC46D3D1DEB717A94D1919C0293B9364F457A6363176EFF30104E2F9332
+4F3501CFF49A856DAC3E0DAE07594932C9822E4004DC511798C88A41C85185A113CAAF2317E4
+DA3FD78333FECACE1DCC309EA5F1AC1A78E4B1E7B86A66DD9E5CC3FACFF276038DFC24E9D940
+827CE7A3DA5E38544DB860C9048720473C14B3ADB97A281F61DDCA9E535312B419E28E3B44E9
+3B29AD8D08EC018E270594696A50CF8F3C97039CE1FA4CC8C81C471AC38734D961A4D4A98548
+1A71BA6CBDFB3F53C009C1E17A66FE342D63A576EEF6B31FFD5E4E56ECB0593F68E62D19B4EF
+2FA3CE86D3C371ABC65D195B3B92C138A06ABF6B3A1CFB1D74BEE67409C1A7BC544B0E08BDD3
+6981C7C0502EDF6919D736217502B83DB3F9A8197165EB87F54BA339746B5971343D28CA5681
+872AEE5B1DC23D064B9C2F1867755818A67078E8B8923670A536A467DDFA0958DE5673D60370
+63EFFE09051A27EFE76E315BFE68B558C68A6BC0281A635E98B5588885238C73EBEF4A37485A
+EAD33A2B3FD7BD21C774F57FB8E0DE8D5BE71CBBC806EF3DB0A5B2EF9A3B5E07472499F693A3
+A49901C43AE71783F462A4F5BB72BFBC8EA2FC9D8A4BA441802BEA1FB020CF85D1372AEDD373
+66752749B1F0049F3B2EF1BB0CB45AFFCAE12ADF3053D6DDC436DBB48869D60DF9515A9A1833
+80A8248115D92A1A73E1A693CA1684CAEC0450178A0FFBD83C298472B3917B2ADF88DF93B2D2
+7DC1CA752C31B79587EDB11FD08F9D34A1D3030DF14C674DDEBD5F49EA2355736F8B17A12981
+4BE8E5E3657C006516389E414B58A9683112F30741A551CAC5066BDD147B1EF5E07ACB8839AD
+4D691D2F31330213C5661A2E7D86A882927AB4E56BC1DD211526D1155DCD2AF394E20FE3597B
+3EB7E0306DE66FA44D6029B8B16A87D64A1A2BDB5B6D9CB1C90BA58BF9CB4ED47AD44C846B9F
+CEA6550B8C23F6F6F43E69BA1710F89237B4E6973444DF301BFFF9DB68DF42131EA7E10847D3
+A570358C6DC153EAD1E4923E58E611D0FC7AEB9E862F68B340C6B50E17FCA6EF1B2499E411C6
+44BBD968BC13B5EA1278E23E5F761AAFFD4737A2AFF6579C8C8358FBB8A5E5105A51460C101B
+3A5554E306E3002183F713AB3D0FFEF593A40FF4EB2C71CFC4466FBFE1CAD1CF9CCE24245173
+CD4F799CDBB045E2EB5C4900D6C21DC53720F8563D1F43571158CB6842BE79C5269A43AFBD4E
+25A0F78BF1B59F98410C117788F80646FDFDCB081989E142D6EC99FBD27C9E9BDADB3AF3609E
+B9D0E0A79CCF1B9715429133E4209E2865B264BAAA1741AD991D03CF13CA84D6C425A606A013
+AB4AF04C0AE643FE92C8A9041026F37089AC81214F1B7013C51E3E67BBBB98D0758B92FD0695
+E7920581EA1A40EA63CBFE30AB25BDE7FF93F460E809CCC2BDA316C75130839110CE61C949F1
+0D6200756B2812198297579630B57CF171173878A1DE02DD9DF327AFE917C9A7EE20F53F3DDF
+2D1EF9DFC0E8D125CB560C747636152CBFBEE9196B02FAFEF8849B1979636EE72C35C035345E
+ACBED211396BAA77AF9949CC3487508992C6795E5A8600BB3860656A0E882A319026D20DA8B1
+E06E9B64B0398200FD3DEAD580262AA1CB165DEADBB4321E132612EEBF523A77ADACA5F024CD
+DD132C554E3ACD33BD539D942D04D7BCA82A127ED0A6A83DED1C7FC1AFC33F4BD343C6E7A0A1
+26EB3A71163B2E567411F42FCEF9222BDC5CFD39E46E719436665BDD5F1677EC40E62611A72D
+9090AB02FC588720F367978674BBCABA2837DA463872CE3419CB185E4AD53254E647A36D6084
+AD5A42E32F2001AB311FF2CC28EF8ED480D0E243974AB282E9098B81926C93CAB1AD1EBF922C
+D6178D241F16EA755C52FA1EC574519DEF4B65B9AE4A159E8ED488B0D57B9714277171F25F5B
+32EACF20196D6DC62A064A94ED9B764FE6A09C55DCEB9FE199454B7F6B435C0B585873A83779
+E4AB2D8E845D9C527F91C6DAEB6182775B28B93BC8A9361EA7587E9D063FB19C552202F5D17A
+EF47F4B81670BB6B5981A14CB1803E3C4EC4C9999EA228E09ACC924354654DC0254DFC28F36D
+D0331333B24C332D83BB973A99631CF55168695F5F74C7479B152655A5D0EABA7576CDDC3EB4
+23AB5D10149043D7B9405829E50A326F408DF36B31D56931FA048391DC3D9CF159236092B2C5
+254209C8A3CB0A36F4C1CBF6F861041C5288A8CB00C1DC363588E758EAFB1AAAC48811D823C4
+584C6B2F85D3F2737AD408CF81F0CA3A6F3D10B5745D47B0A449AEA9CE5F7894F8B08A3D776F
+C5BDEE5BF42B1B97F80780CB41B622AA67984F60766A893E3452397073667FFAD996C19E1C5B
+3AA88B06C8836D4C3330C723554BDC172C7DA4BD6FD7A64DE879205AFA1349CF13804900C824
+E0D3F964075E6C5115CD9986D44A9EFBBE8A988590D144C544A0A84AC2579766CA7147AF4D3A
+51813B8E9B5D03A341DFF4F0379C983E45788D8D05A407EC844FC1DC1DB94102B64C8820C3C6
+8D3DA3FA960D120E09CB9DD9A6F14555F5E62F23058EB0184B48DEB00144FE243CDFC071F08B
+C8CF5E9E1EFF74BCC20EBD07CE8ADD23CBECE678580D76733E2D6120296F813259C511F4F007
+2FB26905B82F922B8F63DB4445DE6AE412EAA870D687A418F3FA72CC42E207BB643845DF4916
+B08BB928A42DDB228549705FA7BE5E8B2B8FF4759DFA9575E122E6DC1C35513D44874E62E0F0
+965300CEF2D5D88B6F974279E7ED098239EAE4B343566A5EFEC681EFBCE7B23A73D47FA4CE77
+DD385FF96D21BFB84314409446ABF7881C509A19E0AD6197010888B27CE1276D02CECEA47B60
+0CB7406BD627F5E3CB8A835A2E511DA516CBB9FE5381BB041297AEFD03C670E236FD8E42D72D
+B7EBF80832497A0964C8A98996A623E1040BEA507103E334C569E625CEA7C5D24A587D06872D
+273FA847C9A7E74A0C7A31B886ECBD021B748EDD1E1C2DDA4738E6774B2619FA1FF78CA8BCF0
+41DCF8D8984794FCCBBE308CF3D8D5E4EE0C57567C32C6EE87F58D0460293BB439340A974AC9
+86E23B090309EEB120AE223A0EF40E525065889F467C03B2416FE52B22BD59283F92BD4CED95
+F6CCBFE479E2E8B551C42B316FB683C114721CB47E15866EC07D64DB701EB6DF8D56B6E6D05B
+5E689DFB1D57AB9125E22009D5546F58711CDEBA353C879C1885DEF8F43E0316810E74BE31E2
+09B17ADF72DBC3527BEF4AD4195E39EAB8220D430B7F1D767461622F826A0C60F27151F54CFD
+9B8AC143A8F14EDC6649A2B5FBE1D2FD803C144AC969C9BDD203D4CE850883E82ACDD9FB5F47
+63CD0142E71613517D215B1EC8312FF8B64E296E6311A3B79777D1C3943C80F46E110078D18C
+35542F391FE6A52EE1AC1788BBFBF6CA4B1D3145D972CC228224EAF85232C35D75A81459AE7C
+CFE997B79AEC970FEC1A16DFF28FC4D28170B61DF970FF2290DACC88C45030A23745F310273B
+39A1B4C57E6372775D141DB88F82EF726B7AD3142023DAECC0B7ED6E6B2A580C88B7CCD18DF5
+54DD6B6B965C0214E00C274921D03D74D7621DF8EF2B2BAF0D96140CE9FAF9269E5B36F9F1F1
+3DE4BFEE67407F708BD5337DFF90C84670279CB9A0E2C0CDB991F1BB38FE5E2E5916BF196A58
+4CD33E4478B5E0D9278E48F82DD579C6DED9AE2345E8C0A977F2CCA548C564DC4BEFC38298C6
+B77C0B894A61620086690A511A7CB904C621588CD28F2817DCFD94E84F4B986269A3DE6B0569
+BB6F8368D79FCC88870F8E5CE5DF57B480D29F4DACAD08720AAF4AC4EC43EAD7C03CD7F036D2
+FB2C3351C9060919973C7CA236DCB9287DEE188A294172E2D15010EBE385D79983F7491A86A6
+6A06CD18E31F6ADAEF51985E86BED78D80E83D4E286CE9C17725B0C44E17CEFB730ADC56FD8C
+194131E2E909AAAD281667FDD3BAB2B41693C08EC051B1E5F33171A1AA804F0128FB18A6E947
+D73E38BE932C852294277B5290C4B8355987AAFEFFC0A4628300DF4EB5FB5AE8B75780E18C87
+BFE0048B1861CD42170A71636072A1B155AD86D08534FC65F6440B1607A1C528F691772A9E63
+EBD03A60EEE40344C0C11D7D956E892BBABCDD77A712FDDB052D9B3D65A8CE6B4696B0D7CE0D
+711822DB8A48C35553AFFB615EA1CA77257DD9F1FCE0F20FAB4FA57A132D868E1477BFC023AE
+EFC8193B0AEC0E916BB891F581EDCAFA1331D2990B9FFD0C547861B82DB1381AAF2C07AE9291
+3B91888DD4CB9BA0EEC31652768EE5966556A1A41B0F1198EA869641A3109AE68CFD3D6DECAE
+DB5401129642E2C76A4B049F8F38AF4A3DDBA0CD3CA4EAA84ADD6572587C86290583E89F4C31
+5FC36FC016DC309425C04EA6E89C7199ADC95CFD414F317B07A294661FD649E60BDB5D79BC78
+F00DDEA7BA4BB3F7A4028818FD4488ECB8C7F51EC18E3312028D2494B5FF70B4458DACCB7063
+9E7B1FCBE169B060E0EFDB8928EB935157B3D88906C9C13F36F2ED9AE3ECEDBAFD2C12DC5C9C
+23BDB87E3EE8E860A123426DCF62CA85E67C2BDD1FDF3C81994E2A688859F783C8DD1CBA9690
+EE0FDA1427FB963985BC4B97D29D66EA13C187F6725E978DAF0C51D9B0B37EE0F9B4F731F8E9
+3E700A4E415610755F98C3F63D74A593557C9E9E7D6999E9DFDE0C69356F849D9FDF73E756D2
+EF27AAF53DD146FF9D7E81C1F659C07755A68E0F4F7100646925963D3A2F5BBD07D77300C75C
+B475BDD6F4CD0D0D701513016012D38A65ECF674B6D6F314BFCAD9A52BF8C21E98DA06F889C5
+036AFD7F5E6F960D9B528A821C14BC33D7B53618C9D634363A2F17F2D2190C6D9C6F36CB98A9
+14D241C2DE1316303A077F226D9EA04F2F92262D48A20986EC6D19BD377D653DD50F3B29FB84
+BE140C3FBE7EB4F77CF71C22C6BC56D621634D26D5192EB407398F41585D6E562D131ECCB65F
+9413E5B9C21EE5C2C4DCBB631D9C7D9ACC3324B54C4FD6B1F59A73467116A2B36A1C26AA4FAB
+E02D70BF09B530C27CBA66C2DE187CE2E2535391328F80BD65C73B35C3A33D300FD1ADB66E0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMR8
+%!PS-AdobeFont-1.1: CMR8 1.0
+%%CreationDate: 1991 Aug 20 16:39:40
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-36 -250 1070 750}readonly def
+/UniqueID 5000791 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B4486858B2A4B5A0CC2E1BF4E2A4A0E748483C
+3BCF5DE47CC5260A3A967CAC70A7A35B88B54315191D0423B4065C7A432987938C6BEDAD3B72
+AD63C2918B6E5A2017457E0D4EBC204B094541F345EC367AE85CA9BD24568A01D3B9F8095F74
+20E6C423C414B3DCCE6DA48DD1C89A56D078E0D0E2F262A13640A06D17E44EE3866C3471FB58
+FEDF5A3B77294517651C16BDD7267D39A54E7171752DBDE63AC19BB4B3021CE95EB5FE67390B
+09AE4D9ED4D704A67443F55DCE17ACD996C1F5E023C9E5A18CBEECC3097F23763ACB86CDD7CD
+13381AE74E48495EC7FA520539D87F8A8DCB3C826275469B6800876A457E7D1E5BE867C7B1CC
+AD69742A8C9B0AD943482BF2A4AD0AED40BAEB69A0233BAD36B4CA2D2DA7322956C70375D152
+653500B2F22D2AB6990CADDE2DA14B4917F7515E64BC3D96BF775258FC7DAE4E42A4C9B6DA8E
+DDEC4A800C8AADC8D75E48CAE52137E05C03677F5D6A82FA46D9F2FC7F56D62E5C605A1B7898
+B8D1401C2CAC1A0122A2C8A7AAE09607F2C5F29293A09B9959399283BE89051452898238B777
+DB9830FF4318A298B221C4A820C700CA964FC99E6B1D9EB0BAFC39BE9AA9DFFA2FA326B2A466
+1E67261BB3DBC85844E76F9313AB533EE16BCB478166DE5502B68E6EC1EA6110F53206CF1CFE
+A419571B0243244B32EA38B828A01E62B03BCF476A32C2341CECB8A0FA2A3F3F339315D5F3AA
+7704408F6617D02462A058589B4FEAC5BB976C6B3AE317372686B1BCA18DE30D2D182553ACE2
+5C61478314E954B6395B87FE5D785DEC41CFE9156C730B8B2EE923E921B2A9D8EA7F0DAD2483
+077F3208C38A5DF9DFD5477FFB993B6219A8B2DD4249FB87D613121F07A75FB990864A3E3000
+66B22D0D4CD2908B2DA4B491736C976494D87C69A88A3FED1D179325FB28C5D3A89E6022A98F
+20DE1C232DE3DA0FCC7FA7904994B8C9DA982F68E3A75BD92860859D8052AF677F8CF937420B
+4BAAC07CCF01C5480725C696FDE80052C1AFBC0DB44FB7C5A10E442EE06333551FB0FB9F0BB4
+433C23EA481FE64772B91987D1B17F817469FCBEEF3E36D8082CB1198073E3D0FBD172B78930
+2B1D506081C1D8A373890B13C84FB09B4577E6F89874938CF4BF506AB5C8810E8763839EA8D5
+FA2CC899F0AD4BDE6429232C8966ED67F4AD57D8DC145459E3F598633A0626483517E6925045
+5C8E83C9ABF54794C3A02550F7E9FCED32F4463361B3D8B7C1F28D2028121C685925BD3A649F
+8B2039E43EA3B9DDA56FF4256EBA0B054BEE9CBE33E5CEDF2973A9B573B8780572EA8CA3C0B5
+B39A03D4728B5EDEEF715AC38ADBA0C0400DD4EDBD169C0DECF46CB16405A028EC9B29E94D4B
+C52D0E0E60563BD088D49AD7A56C7422F2DC4906BBC9DE186E0EF59251AA0DCE7BB5678CA2CC
+E2B2DD27F7E603237996FA4DC777CA7CA6678BC856EE5DC66E1CF82F3D97E233936539A08765
+02D05F8B6F0CF666A918FCF1B52DBC189847FAA5889637B1441173908472CDDC584EC335AE26
+0088E11FE413DA79C4208DE2336D0B562CD68CFF8B7CB75B035DA226D82FE5DBB9F03502042D
+F0B606AAAF1601A19B1CF53930FA8344EFB7CC7D35E8A04898877AEB59F58FF42086AE7E3A80
+D7599FF1F15647AD44C8FBA536A3DA566768A9ACD5A663A523ADEB21B0576E92D6F1685A2DE6
+FBC2D3E0200B28AF178F336731983FD6C4525C054557BBF0EFDA0E688B8B15A8C8E764420F2A
+B1FB6661109AC32672DD8797B2FE7638C03B94545B362674563795616140F19A271D3C9DF7F6
+93ACCA1A35A689396B13D41B4A5C65FA6223C8F09205B59BA0D50A73A2C65782697501507083
+73E50B8421ADBF6595ECC1D1C0C8E0B600161E000D1AD558708545FB47F8B60B7518C323A129
+2017BA2E0C14EA031CD83682D14AF8FE19A44FB02ACCD189B18B172427D145DF07C4FEA8899B
+85655BB8634CA535628FA1C6C1F35303DDC85611655BA2888FE4653CB23D502EC2B7D76EC9F6
+ADFCFE6A07B82B3C2F7D3020C84A56D73D6635113F64948A916EF0FF2309960BB0F6BCE4D9CA
+21443C1E9819D4E2DB41A107C571C3B186DF7034B0F6FA5E91AE45FD11C293BB64ED1C8DC441
+F0B6BD2A91D3140B9B4246434F34E8FE8F848A4C9E51C6CCCB93BC45EF723BBB3F091B6A040F
+55D9C38C63AA59601EAF905C89D28C9A621673C567DFEAE4634844C91693636AD4285BCA0B60
+CEF05ACCE4B5A20BACBE48FE420042758F26CE9497DF990370138EA5C389CED42A581CF04A1C
+D71B847A1A48DEF222A7D4EA7DD130188D42A886FA41822E489A25D86C99BCFED702198C849E
+C0A5BD6D40B1BD2EA749472F510601954828DAE77E29EF2D7A421674B6FE348ABF7D12FF4807
+6BAB30C8C631CA03BD98AE86434ABF760F39E0D75CC774139690F208F5A85A19C4D32672B067
+D580AFE555ADA638C055597F05AB0DB34255FE89EED026AD1643B0609AE2F8C8D284C2605C9A
+45DADFAD6324F09C8B02D41F4D391611360236BA3D0E6AD474DCB842060A1D389A00F62A98D5
+2EA6DBEF5DE250F3CE7EF7147728EAEC412B68547DF060FAB31F28C5F6F324C4910637D67CC3
+8AF7AD414E1396B129EBC8411CE8C7062FC178392418384A5DCAC09038FCEC9E32E30EA2EB69
+BE7ACA538C6240C672940BA4862BA68C9DDFDF907BBB8FD4DF794F37A53B605F42EDA33CAD9F
+A6C5B9B7E7B69D5CD4163C4C056B7665543425D4E6F5655287E2AFB442C40CEC29BFF0343018
+538276B7403576E78E9B8257D5BE31E384F2C72C21333BDB5D929A7D546610F4D1B928D96185
+1077F9E6AAA58B08A5A9B7A0EEFBB162CD62D2BB7936CB3D1C5895CAA28A5500DA21B8B89327
+B6269D88CA99661200E9CC867F848E4456EAEE99B4C315C88AABAEC708B16C6963E93E5041EF
+454F9B3AA7A7AFCD2D6B9E0420256BED6D20D3647B5E1FB8F43A7267991743D11E3DFE0462B5
+576226F9E5D1F028A263D9D6F90CCA3481352DE314FE39408175488D9A3DBEFFD0D91420ADA2
+CA4E9ED48B41E4ED72AE33602D140A5DB8E8EF7BF934694EB8FB3A6366278D053FC4DAF68981
+3478A6D43216DBDD1949EF64442776708BF32C80FEB2FFB6D893691A078B96BB928426310003
+3BB6790CA645FC4DCC73E6F2AD5FF4619AD53A5FA26F4DBCE2E7216F29C2527EF3BBA558ED25
+B0180F87E1E4C389E6CA8865825D12464F570CCA0B0AE11B125B3510E1D9C008AE04CE7A20A6
+36370CB2ADA145AA532CC3195CE9C690B002D70DFA3D52EF9FE7393A94EF97CFB3BCCED87FDA
+1C252718DDEF7CCD33FF26BE035C2EAA9DA8FFD48B8A1760FD9557255A82C87F2FB091462634
+44E9C7D4DDC561C949F10005D81357BE0A84C8D7052830BE77E2ADFCA059562622109B048F4D
+3A3EF26126ECEFDA884AD461329F44EFCE4D5CF0759FEBF50C826A634463A6ACBCD0BA8D267F
+E9EEE70F46F0BAF4CF89FB68D86D9CF61D164F07ED96E83DEC0965DF06AC119822E1CC0E0DB3
+22EA29883476A5F37D380FEF4ACBA611CA1698E1961BC34EFEE983F10D004943DD2CBBF7F6EE
+55BD5176CC2095575FBE9E1B81FAC37B168B93DA3C738357122B4DFC6E48B1A512D05BF5823D
+EAD06301A4C0FDBB33D4AC9B7BBBB2069D6308E8F4ECA675FDDB721830E63469C35FE0CC3D18
+B9E047AE83CF481620577D971E07B093B982B57241F82B12ABE4C4B5D63ECA37C8E19267CDAC
+819E305EE0A5A14A5BC2809CFF174066C331E293DA2A65CC88FC7C5CBB7ACAB36C2AC6D99F0A
+3B46A37A8321040D46E1DB19216F519D4C86CEDF455350C43360BDFE7362093947C3806134CF
+3B62978DE363C0678A8FC2D88F91599F43726CA8F7E96664EFD377EBE1A69A30E5749FD86ED2
+671BCD29D704FAB75A2431CBB0C650AA568F358327176775356F9248B0382248F8A6EAAA533F
+EEA32136C0E0B3A60898D331FD3CCE1E9E31811633D71A0A59CDBAF8A18E385F2ECAFEE87C64
+59C5EBF10929B1F06AA6A6DA13DE4C1832B388BF0EC4463A6036182EEC8E82AB89AFAF29B92C
+B20CB4888AF2E69646440DBFFD2738403986AB9669B22E9EC3790E293A8DD51B6E07E75CC7BA
+300FD2448002E168A031A8FDB831D768FAE6F02B1FB25229300787D1DA9FC6A4063B37181FA3
+18C94D1EB0CDA058238898353C12CB4C986C6637E5E6196D0FBEB533C62394384C8C63F75666
+87DFF6A9D86B4F39A7B113534D88ADBD831DEB17BF3D53D86FB4F75D7CCBBBF2D9B7EA192B39
+7E7FF6D99D491DAA967A200AEF392EB5D78285E10C06D3D45E77B1C99A96CDD0D118CDF88DD2
+18AECB19F37ADD787EEA063D0A4E508B8CF9D5F1F41D189AEF64B6933966865B2C1B598E9130
+D479E064A85B1187BDA04845DB6520ADB5C729A0F41BB4790547066CD7FC7496662CBF94A676
+5A2F402AD44BA5CA08006862A23958503C4343FEE1578488974B9C88575005124C1927B1F228
+CAB60979EFC6A7B67C97FCF9D6A3569A58315D8DC5B1B211E441AD48896629BD82443B6F7203
+522292B4E05823CCC881ACDD0904826C3B5B197F7226FC153023C45139C6B79A688015394586
+F6DBAB40A011E3FB751A677AF0F3B0AA5143E33B7C1349B53435550A2ADD2EA4FBCE0BB0D136
+A7B9F31796B285985DA642085FF687410846F8864C319DF9AA1A8CDA45BA19DB48818B8D7D31
+BE15A3C7DB12971E1F989B508EFF04284AC3DF07EF5C9AD6DD8E71ED0EA21E06C2F8A3195C94
+E55CCE84A96A1D95746EA4DE3EA06E9901AAE28E289FCD992AEBA64992F94E084800CBB7668D
+D13342AE31836B7AEF1929D9301590A1699286B211BE4FEF0AD9025410617D0177B225481BE4
+757EBF860C9DFDF830844A7E60880C354EED9B18E3617D69E36F65FFFD07C4B88AD3FBF59895
+435174F6614EF44ECB3C1491340EFD29A3C0B73E65D58FB030AC046A0AEC3F76E57C7DC3E81A
+5DEB683C6D5960199608D42626A9A961EEF94961BB416A34321DAB1D7C934903053AEE2A22B1
+5758FA42D50D773DD65524CCBD896711EC275F5949BB8C7CAC20CFAE3EDE952167E235834AF4
+9AAD10629B4BFF06115FC91D6826FCCBA64FA7E767446D856701317C43C0520BD470AD63E135
+B05BB61A41352C0456C677D5954B4445582617BC14458924EFB580B84BCFC1072F3A967B0F75
+CD738EB760DD679F127B0E29B2BC0295C2410C3B0FE374BC162D12415DC446CDDF6B41D157DE
+FB3D890DADFBCE3AD2E85657F372977B392DD794019AA2F60BD405D8357A430F5F240F4A0B53
+0704D96942C3BEA32F673BE3DC03BA68EC3A23A6917C98376D318B1B584611520838E6DF1169
+1160F17AA6F6FCD770B24022A2126902F1B59F81D43F77EB906DB9F946CE8D0D796015389E23
+D08DBE766F6F3990D563CCDD1100362452AD57D2EE8A79F1013FE184F86D29B75FCFCD020936
+4D35395378CF3369937633177F70B418F1F5665E492D9FA3854D8DFE6CE949258B30FD709421
+44C6F71BA4EF0966A059D05EAA32CDCC48EDE88F690734BEE59C2464D7D5E77BEA22CF9A015F
+DA90E1BB0753236AD5262A8C647FF2398B05C929FBA120EBE631990F323B8970C3772DC1A514
+32E2F898F46C145C817D4CFD0DC50F167F40ACD1A0CA601CC8FC78FA6C92F745A2A83CF9B946
+95D42957CE061659A3966A9054B67A016D3534A5676C0FFABC5EAF819A03A10C84890BA479D2
+791ED120782FFC2CDCC9DBB65064F39C75711744AD58D9E653F8F650EF3FA079CB4A7AA51B14
+750E53E6751E0DE4F81A2746D01BB8F6D28D17626907E26CE5ED22EBD396C782882C1CF842CB
+C12561083BFE65888C85F913307CFD0BE1159C4B018716B2D5734B3FD9F93B1B742A95B7DA6C
+7E565DD6C338B5B934E36E5F2C75930DA96A2AA72CD8A17A12AE2FD589357FC9D237EDBEBD4A
+72FAFAEE8E0E81D1FEE25CEA488E1F953EF574A0D0A6F7B6BA600760D12E75392FE4D0744DA7
+D20C3337B691612C61C28FF9A8F163B7C119DA771705C268EAC8DBD5EBBD6011F868062C45D0
+A717DADEE306A05400F70DFC17FDEB9758FFD837B305736ADE36665DC4867F1AADE11D7F1270
+C9E3F0771DC5D1D353113966598DB9B0FE3BF774F35856DAD07FABD7FB435E56F9303551773F
+CAAFCB14728000376B51AE5A3BD7894D4E5BBAFB85FE2E310C89FDFCBE53B2A3871AF103E64B
+C3E4034CFF11873CF2A024C35A674F56BB9A940A2FCA4D9182C911D8A70E4C89D9C1F26FE550
+343301A59FF812F848D5EB5F368D21AFA35AF0248C770AF8FEC0D35B73574C09115246BB8BD9
+2E2626B1B5D26FA1F279D34A74A8BF225961BA088DAC3E0D1F6CDCE0A31CBC3A71698A0AC2BB
+E5FEBF615CF83F45A6F489B8C8D2180489B1517208388EE4247AC1200AD7BE2CBD217A2009DE
+01BF8475736154BAA12DD2A13BB79CF23F7F0685920E86045D332212CD6BC0DE24831BCB869C
+C957F05A9B34E8E30D69B2F1D8DC1F6F715D9A72704900704CA0ACA8A2F1E69E5D341D37548D
+7F9781EDF1F835E6D74EC6BD4F51622EE742F7AEB1E038B0ECD8D044E9286CEF378B426F2D75
+83B59B727209734133BD2966B2DFAE60E2FA75ABEEF01526AED91E9B13BACEEDF746DD1DFB23
+F9BC9E8F142E4A64CF17718492F4820F9F7A6D8D6DD4B70D2FB9FEC0B4004D2EEF8687D87747
+9C6C76C6593EC9C6C3F13CDC1C9945D957F1AD96970099A8CDE95FE2AE87703EDE55FD3D1916
+AE3CCBA58B28CE8A17E636F26DF4A9F2D97BD968737976636F96629518F48E902E3346F2CE91
+066B135F00F823D1897EFBD62280E88CD7D94CB39D7BE7549D9F12ABAF4E05D40EBA5467248E
+D9F5B7F24787B3E4584F21F84D20B1B061693E1CCB47D27C2B9CB910B441812A0FD068D8CEB1
+3B74D7648D34DF01EF3A159EDE49D522456579F668D121A0A1FA4F905C7823517DB38B709430
+147B31ADC4082BFC9BB3E8B8E255B353A7568134AD4D2B7558FB6805B4A690AD84106ABC9186
+97F0A29FF273650E25151749F1D2DAB75485877D6A2431574FDB0DA2BBCD9AEAF2B53C9C44D0
+C61FD984149E9738DF8DAE42007777B6B11E61FF7FB9ED8425778F652CF780A76721336BFC84
+294F73402CDF3415564DD1A625F7E07768824B0A61C4468098A09EC610E49F3F386D1A1085FB
+740EC34E05775F4E15C04EC78DC7BA69AAA9B9623FBF9D2AD2C762301F2B9A38A01CEDDFD6EA
+DFF04905EE06FD862D4BB76C84A874372D1B8E05F2673E2A2E6D2E340DA24595BAAF998D8B8E
+28B056F8AAE93AC3DD30B2D4A55F9F29DA5A8E380A5BB827CEC521064935BD22DA2DC60C60A5
+5A29D624349660B8A79DFFAD28B795670F246B9E79A46E26F6C4AD633388E9F9B74E15389931
+D23DD27F8899A854D1A208C816EA1378EEF8D01571FD8D84271A70F857CACBD22519F41E180F
+49EF4FBD9DC7AC7AFA85D3A2BAC7E5E4A6077D97C20DBD9950EDC9373159279B63F33C3EC041
+434818912F952C872467FE30396DAD1CCB294E114823EE85003E19E7E50D6E4614F94732E794
+7269A596164E75BAF289DF397FD82925B8618DBFD4B50F35E49DD3AAE8FBACC3F841290D94AA
+1CE3BCFA22AA2F5A9C11FAC6F1C6D006E6E4E1DADCB73A0935737F8097F6289EFF0E71E40775
+7518D0BDE2A3226A0290B1A1C270467FDF89F75DE64635E527718F69D35B5A3D17EC6845FAB4
+0F3074720A79EC69C9EB160B07F12082D129732C794316057A215FED554DA3A6B5DE264E3DB6
+C65D576F1E796CF4C9D1778DF1A19BF1F931970CD4215494CE07D004908CC921186630A59238
+42BA7780E958D2086D4357F039F227BCE9DF0D5B3216487611088BF0E4D1968D8122A230331E
+EF553094E109BB8BD94FBEA7AE05970EB8329E6502C0003DE6D3CC8007CA714C0CB5ED0802CD
+D92B2152C7A1E112C219EF1BD832FF6CB055444A1267CF4CF5342B350F1B9CEB81C8B36028DD
+0FFB85A62B308D61E5E814778D2795A78E17AEF05C7DEC1B285246130EA22A5C66501E135F9F
+9C75E4AFE4DA46F25F503EF477360D98AF220740CEFF7BA8CFB269E952431C38F12788F3603A
+158966DC2A702B6BB81553FA29410D2CFF0D7B2D04965922097B9A29F02DA5845E957785EAE2
+782A960C234E7DD814238DCC2BBEDCA1C361180E7DD186382CAD3C37F2E98A0EE597EEAB1A92
+6432CD5349AE271A44BBB1A4DBBB8FA487CF5205B52E97D35B18C3674F63FD37F2C8D9391DAB
+65C2F5632F329C5E2EBB8F330A173809C3403D4D9D9F46B0B1A35C11F22914BBAF54C63B1922
+FC916CA1547AD3CF9D14C8C4D3D0C491444D9BD4CC261B4476C9AA053C5F292563107F9A1B9E
+684094D23EE400AA8DBBAE8B4A55458A7B64CE424B65406B5BCFBEF87CFC63017B2B24EB9DB5
+7CB7C5F34CA5C015BD7CE1233293A636E9C3780A1841EABCAF0E95B27DD58A361F285E808459
+9B3E9D45A6EC744978D3522741F405DC393C97290237F2A5C57E6654BACE9DEB1E188B630A1C
+3D6EE53C78432E868F65DFB8A98D7E70B5F47372A5C710044C6DC7A97544394E0C97022B0428
+B461A252B4092261E149675720FA054AB1381DBD90DD5D66DF4CBEB601446ACDACB7EF081C0D
+2BCB78EAFF5F4AA0E35503E6700E900D60E937B69E6A5D5387EF7FE0F9EFA8BF391DF347E266
+EC9AA0B53290D4379F7FD8E85B70D75D503092A1A1F1CF9AC27F373651D377EAD105582341D9
+959FB8217422A0DC51D625B52FC86DCC71DBD87DBC9FA19A28ADAEA69EB8DADA4C634BDC836D
+554A2DB4055B87CAAF748A86E46F4002E568DFE9EFEF5E458CEB3EEE38DB8CA8C2504C24298C
+AE7828E111FA88DA2EB0C0B89F4C33E19DE07FF6BE6B1DC3BB3E741B7962CB6D972CE5AC22D7
+385716AA3512FBC54562DAF8AD1A31DF0F27D69239BE9E69E631EEB385F58FE6415A79942F2E
+21DE6C234DB196B0CFCF402399F8FD23C927937AF9C04D212AFF84EF854C83F770DF33DD38CA
+6CC333899E53591651D529313A21E6160C514594949EB2EED1464CE8F94072E0A30DA6FF947A
+EAEC653D108B1562412C5628FC0343BD4C20660942A52C318C05FED691ECAA7A357E744BD74D
+1D63A624B78001B8FCCF25EF1D7D66AC77DF64FC897E18A2E09709BACDD2B9F7D28207A0DAAC
+E692F7DCFFB736F2B221EF0615C229FD7E2BFEB15292DB89A4AD75646C18208ADA06B8D1D460
+5E27134F7B8B3F4213AD94F2B859B76E27F956A2DE59134758E2311FBF1263E06557D8E60132
+72A83DFCFF3418AF0CC11EAE26A930A817D8F4A070E33E2113D628E1B60F0D3745899CAEB3DA
+47849DA317FD6E3E41B6FF083122A078BD7CD9B5E734DA2C5324F40E591DB3E6C7A4080D5867
+CB165B1F297165DD0D7E8298FD0DC49A875E5BA808864F77085D8BFF2FC7B0EB24FF76924883
+31DD00A9D559D335404F959FBF965EC7465D8D88DBBA774AB614F34C5539793AD285127BF561
+4B62B5A267FB2F0B19B2C321513819F4143CF8209DC46D7FA41A82A0FE630699C8BC8EC002D1
+9BCF20D7947C4160BA2477FDA33DCB3B7845110AE81FBC5D9E9E41680417379ED8B00E745963
+0B41FE131B6ED4CC23BEA4844D36B8D9C69812CDB5DF872374B74DB41BA549A35014FCAE7D84
+BD213099EBC8ACE36DCA75FB4528683BECC6C76884F7E9D1B2733404F716A190AFC5918C17E3
+9FF94A2E20786B0BA6295349D32F897D37B8BE8969C9E6082C7E4E7F0D362DFBB4CDEC1313D7
+A0EF7AFD8E5C836149D05CD9EE36D6B55E7B1AA0B4A5B717468C55945171C6EE16DB2690BC4E
+AAE05AD3A83306BD13E83E96CC47032D0B26904C2B0F1D8B46622A1AD31FB6A98E7699AB02D9
+B550AFC66BB053A4F187595E4EDB59204B9BAF60BB36302A062399AF3D3908A2BE4417DD61A9
+1F7EB5B46016826C56D89CE458F489429D18066EE241A5E90177BFC9B3FADC31EA7530FBDBB4
+736B2F50F1293FD0DD6A16FE2CE8502ED811F6A79A29A0018983372687691540272B9000CF3A
+F955A616E28846EAD7A881C48421FBA911FDC00988812C2A464E9CF4B39DB276F6E27674D386
+A2E1FD9F84310C65208B05997EC8FBD5ACCF3180D4825B966665511E3C3C4960DCCC0007087D
+D34D12E1E2A17F1FA728CDD86604D1B54CEC9C1456A367B38A860C737841FB8B9398B45BF92A
+ACE74CCE996454E25F60636E8963377B6225B75874754E98BC275A4123CD6A7FECF22ED29577
+716B77C5D02005BF12BA9F4FEBA9B9496CD8EC6BCF37D7EB97488E6D2527106A39678AFAB701
+2B1D09289CE5A8635615354043DF07FA012AB15AE99395E5B257EB0AF5DA3FCE40D6025B5B69
+7FBF8608A2AB29485B4B51DEBCB31E7AEE991A2AD7B3A6AA5C021B7771AF882D42E0635DAC51
+296E7396656BEC79C3BBF2F6E4A9A42B6D39DBF547583D2DD071AE814242CFA11EC3FE049D16
+737E95C7029E3F0DB1B55C43FBA4974BA2C1E6AEDBCD3FD27181B64B70719D45229907BBE323
+74BD80390D43AA4754D1773B6FB37986D4681311052A830F5FC5F2714E5B37E166D4CE6FECCC
+65E808786F1F21009F1F644B5A6C83CFC1E07FC5E354281D4D5E8AAF0614314F32F253077FCE
+348A27A9E77084653E214C67F2E84CAF157A86953CB2D3F779C98D00CEBF27518102FDB063FF
+80781BE5C9E04A7EAD723CFEA7EB295C6B19C5CF60B0A7F35F5D0C45659FBF21340178E8C8EF
+19BAF6A832154A6A75EBD98548525F60645FA5F8F055BABC2B763BA69BF8A25B7A89815607EC
+86E8D2AFAF7E9DEF9C6AD0D6228472B51D8A1F79BCD143697D87281F935A95AC2CC68264618D
+0BF20486C763532937C725A18718CBA641239B0CAC338957CF485BA46680E1D955F4CC300BE9
+96BE9DF331E7765198B703DD0FD3E0AB3098E0AE259F5F4B771D71BA9040623EB910AB23DB1B
+E4CF53640775EAF2D2EFCAD7D40096D9E61E0AAF082275329C91BDFC15D13509B7353B4BBA05
+BE9D6DBB6AD813030499EA6FFCEFB65F751EAEB57261E1CFE1596781A77794078272CB4B4503
+FB7EC38E1FF1C482593EACB002393984F97FDED6A6502642F2A2BA5A651C1156B2FA102AE383
+CC75131BBFC8630BF69117DDEBCEB09718F6707A4648C27E8F296C5854DED70211D676A496FF
+8B42D90A198DAB42111C546EEFDF8A5E80A958A82A55D00F281799DB1A4AFB4E056DCC67B04C
+3119B135D7D8509D24BC3F750188940602791C7B80F059724779B1D8F4E633B7AD36323BC7AA
+EC8AEDB88D8436B394B70421237B0668EBF19E1A3BEE48C68B6DA8D8AF2CACFC37F7260B9631
+BFD9C4D8B04204E318655F00ECE95185BA2A70F41A0B9FE02405F69B911EC26AAEEFBA08336A
+CB748C4F2EF98C89BC5A659EEBDFDE0F533EAC1102559040DF07DBBEE4CA7204C5C6CC0C4A2F
+A4A0459F2D56B02DB6BF4720666E63302326FA5821C4B383E374048FBB9BEFD871411FA4EF55
+4C66B1D84FE45856B6A3CA29F0807B2DF2577BB74E34691C3BFBAB37CD02171E7415D99B99A6
+7EC855E171BC3FD37C0ADF21E95CC8EC5CC2FFD02397D813CBE09DC77CA2517926B07C6272E7
+B13AA52E51D9716406002FCD87D8B1394CC395FDDCDF516F2217D9245070A0A66FE3FB3627E5
+79E69BAE9BE1C4F05B5C429FFFDC57528B367680D1326AFE7E2AC90664D8B00AB46015B889B7
+AFE99663516268E8CCC7D73CD6CAAD3048C26E17B2CFF9D2A90BD621E725307E5F806809DC30
+BFA0512A67E5FF9BA9D89919F42FAE667C4942FF499FD963AA31F6EC6BD13DD1A5CFCBBAD4D9
+0503407A8A783199C814C5D64D494987EBFECFA6D872771B17CA4B86620AB7C6F7F3140907C7
+751F658AC88EEFE6A11DF86DC2763179F43F0E70C9A2A0AF34D410B93726E0D8D0AA51634529
+30A655B18F0762AAE63B6118FB8F15402CB2508B690680C28D717C9ED2F1574C1EE736B6EA4C
+F3AC3DAEE3800C9DC2E964239050EA9F798C4C221E6669545789EFDCCA1C99681E5F46E080ED
+1FF29EBFDADC2A2E052016B05403ED338E30BD2E75D1D0EC8E69A8C5662BF5BF606608CFD000
+9EBA439299A1484F4A1B83CE56F771ACCD25F6CDD53F3AD0B10347A5D2807461EA476F99BE42
+E7D8ADB4187ACF81D37FD12C5043E89B434D608110B93F62B0DA92CA15C69DE0B2AF8134AB03
+4E0E2212056C6CD9F4A8BBE2CCE2739652F2B10B0E3C6823025D34024EE14275767943F2535B
+DAFD2A48354A3F857B47BE5C261784C9A28CE6D2C8CCDB11F5A1C645D414A66D42C04E44A362
+D5348C965AD2821A367B0B4409960AD6AD95675E901047326CCEFD6D5A6ACE1EC38431D5BFBD
+DA51DEC970E5C9D62D13BDC1DB2D21193023F62820925FAC9D18ED3B70D31D1E6DE644B82589
+F566A5E0BD4BBFE8D4458C093BAEF91341B0E5EAC448E117651D951D936E0AAC5C95DF94E2DE
+23DA401F456B8B87B06728EEF20B1C1241518B453E1E7A98E0D9DF0D80C13574DF581F1BAD7B
+DDB6FD8EEBFDD0745D9FDBB7635D52FB980FDEC50730E26E386FD3856D5F523314204C59DE51
+78A825925B380AE0CC15BE8F7075D91D3B25BF932966818EB96C8BA078B77046011366A664EC
+94F0608C70B7BF5E5064A463941ED70596872027BB9B52D30708571B8B7FEAB86BB78BFB9086
+03590951E7A2184F4CA4ECE102B0DB283EFAC4E895F50A3ABC74F709AAF6094E4DDCBE25035F
+E642D6541F19692A6DE2647226E19D02F03A070ACCEC0283F2B948831978C199B473A989C8FB
+56E90CD76DE2D620B0E079B8BF7DB49DB5259F3EB8657D44DCCC4413AE9D8586529297810B4D
+6AB61770B6A4794953700D3AAB30D5632103B32C8561216EA7870B7082AC23459AE125BAF8C2
+722250A616AB1DECDA20933CC23EDE0CBBF63939532654D72A03EEF34423A929A05B81FE5216
+A12CA1D72ACE7F607F1731B9D77E0AB6C939EB454D3B08035F3195E1C30DE06A113D7F59467B
+AD2AF5EAB05E7C18D72C230009ABD98945D14B98A01027C2A77042FE44B194763744AF4C0EF4
+0E56ACBCF0EBE17B89049235F883195F23FD2C99E9B73910EC6D74DAB321F73CB9A0D30E8222
+CE4E55CAC430919845B8E5372DE9C78C40DFCDC2672961664FDD7E7ED1C3431FA2CAE688C839
+979088A63096AD8FD317F72A3227D980217FCC7A5766D24CB5674431CA72603EF8974ED7712D
+72B27D8D9A09A2376A3C4D8FCEEA7DA8530640A2800B59F0940692D6CCE311131E2FAFB22CC1
+D78BC29A248E6810354BDA8FE3C5E33950E28C745C931A18631FC2F0BBA2D5346EFCEE2031D2
+69126639975EC36876B725A8DF106C67D8A1E01CC199D73D87A5D561DE5316420CF79832D9D1
+BE05460F40E4471FE9763B6AFBD4B279B3C5907D1D3E5352DE935E83F9730104026157E6E7C5
+79F579B122B34E9C0196DAA6D8069EBDB5417DDEA69A78F67A29D874286F476BF3538B5090E0
+0B2B478685D854880221550E5DC8362030C2E4D9296D27E437237E77C8479FCED1DDA6B6BEFC
+FF3DCEAB0FF6C3CA5182060530E7BC753CD6C253F4B0D0600637D83CF924F46B89102C528D7F
+E2932F29DE0FB540DA93F7942E570CC68D47395D13B05305FDA1947C4DFC51CA1C85D46ACEF5
+1551A2BF333F323122662404841955B4536E307F6617B5AED7C6D2F0485B6FE732A3E1C8BACD
+1A461C8CC6464A2792080D3465983FE4CB906142A4F27081009A0A05CF7C920F9B658B42F6D4
+B4D598833EADEFF61832DA30F823E66DBAF5C587B5BEE8072AF2A6C2078EA4C61AFFFD11F60E
+37FE2EDC0C82E25AAE539DE1D2C7AED6B1F646E55174E0AA5C0869ECA95E8143E6AE9CEB2F54
+5E4BB021C67DADC3F069BD74E3BEFCF9E922EAD3B95BDC4890A035CB7B0A3EC2A6F1EE4749A7
+357D42AF30E426453864A9358D57D1B627D9684186E8021001DBCF1D05912A3C9F91779A701F
+D1F25461062579B8F1DA485A977269B43E85A0F884CCB5B0313866061733F8B5C7CB2750223F
+36697D98FB9156F4CA6DC3C77500F5E2BD24EE972397DC3B44C7EFD7D4CE7E2A26A104B41045
+938190C624A8CE124532EF0D8C30D983CAFFBD5E0A3F2785D70AB7A3E2877D674B0E42193CB2
+B7927714CC27E9B41C051BF095BB16CDFD27A1E1FBBE1EC55ECBC27F8B6547A990DCA70C3434
+D90EE4EEE407C1EC4A70E5F338FB33AECDB331C819A44C73E1F2E32D985973E57B200D251509
+465CF9345695B1FF889E8D4524386D9E4BE7865B20204A851C3F452635FE96A5EE175D9405BB
+C5B890769BBBFEC3AAB9F676C39ABD15B165195EED75F1A1BC41E208AA717559F64C40B91C42
+460A7D2883510F1FFE7536369C4C8570CDC09086CD94B95648A7E368620517DE82E79821695C
+9E68FFBF23D2DEBEE114011DF080D8C2D071F1AA93D8FF3BC575D64DEF447C7C4715DD7A7C92
+8E38C162285E0C1B9C14F8DDB5B179A3D80C50085E9BB5CF1AC9F9FEB4CA63DE673838A49BB2
+67D19E974FD2CB6268D0D00347BC58E604BBAB1D3FB2D5038CA82018171F0BC45A8C76F59BE6
+3E04FBFCBB239107B8D847B7673E0368F5F930A5491F4467A24FFDD75531B00873D18BE85710
+8B6B92C46EBB11C3058CFA7F81928C9C689DA541444B2FDEF7D09591924314A48867C5F95314
+CFCF0BEC2CFF236FA4AD8EE80F6C5CC9D11B02ADCEA4D93FE45F08BAAD35DD1EDE63644E8630
+4948114B58AB5B1CB3A9AA1A971D74D827149161CC451C595087D45E0012AA3B84568D564C1E
+C251A566CA3B1CE29A79F1563C99253DC2010A8D93066E550EED86058A3080DEED8695D35271
+4DFF2F49C1EE50B70E2D0361CBC7B87108014E4E24949D8F7B0A8E6D34C7C7968EDA07B075A5
+E06DCB1195D69F3707289DE014E51A8C59294D8197C71C08977CFC0D3918AFD70D497C4034C2
+9B282FC91A86257F57F9FBED017AEF98B7503EFD40DCD0AF6EE0F9F6F9669CBDB76D6B348AA3
+30D794D69FF3E5B17C64D848725A496DA4AFCF47632D2B2A7E113B3534C1F8874DAD5F9652E3
+5E1B55C8F18013BD481641455A3BFF6107561E602B41927E2C9140E9CE1AA888E35B53A2783E
+159787A0655A82F1DE9252ECFDAE0ACC6C733FE048A4CAD4A3CD0047CD663B73C5BDCF680309
+DD661A87E9B06C982E444E2403418496F62C8E953372B384E229BADB583B97010B9E38EF32AB
+19CD5F370D9F10ED445A6DDBD0896D009CB8B41E9740E272FCD916C9F7968A22F1C331968468
+A1DE0E023B485C6E43D2A5B6FCAA776E8EDAAFCBA4B2D03D832D4CEC193C6951BF7B7CE9AA93
+DEAD21D0708842426F9CF10431B3A1661C2A5E01ACC8A4D35FD65C9B9D6BEF4F9021C0F61900
+992DD7EC016B9EE153C2D55AB4AA455536CC7503A9086CFAA6AF30AD23AB03C7131CFC8D2F7F
+DF9F549B9B63BBD8424936E98E2756FB2A8019852F99F542DAB78B09F271BB8309B45732D3AA
+98B061D0AC4266B20DCECB8DAA74F90F9D5145E64C8DF6B5D349301AB6611788CE1381A27546
+79F4931E1E57DE6E723AF26553C8F19362DA48B5D6BE3AF2FB5B3D8445421FAB4227D20FF107
+BC0C215F2F9BC72F121896BE0E9ADAE120A8AE0E15C58FF83438A85DF93FD234DA94EADDE7EF
+B05E40201057F9241A60D6FB6B4DE9A49135EB7B11FFD0E357DCF9271A101F32859270630FB2
+2386A91345FC510D17E3B1EFDFAEC388A6FB39814B90DCDEE9530E06864A3C2C791A2718FA6A
+5900A4520BDE40B44C0DD8E62BAF7150918A4D885BF2F7FF570D6CF9D50F813095A6E0A76B1D
+4BB6649C0F7B73FA28B13EF83442B812A5D809AF1F501321E9615D222BB8BE89505DE76D6528
+03335F8A466D27EE52D0090206B54244C020E4E1D104E5CA339A4D7F38CD112FA42B35394F03
+62397A77059E7521B3A8D5CDBD50BB3726839CA17D95125EA9EFD1AEC18B7CF38CDA15C28165
+E4D10FD8D997B16B57A9D68111C25B38F149704E15D285B6B3EFDF9A1375334C13D63BF50AB3
+6993D7451CBFDE7655BCA3364E6C2E054F19F4FA23CCB64F22F5EA69562F03E77CA265B5FB94
+C7A8BBA6A414826A05EDC6C5588BC3080661B6C2B041FE0F0CF45C66931AF69DFA5462CA0F01
+413B8D4CEE60A06FAB03EAF16A8DE1EDCC8BFC0A9D5ACD749300B466268F7FE8BACDBEA08D74
+98D371852A6CB40964F2C678098DA227DFD914EF2F4587EC2199F3A441FF96916A03DB3DB362
+CA99BD6A8B2FE189A444E8991BCFB9AA7BF3CD0ED8F55FF0427EAD09FBF6C9B9864B6847D166
+675085C09295FAAC2361D7270E4D7D202DDF89506774265C744C3C74CFDEC75F23851F1D9961
+9DF897F2E1416D88BB73C4DE4D7AF4609A33A24032FE7BDD64716804F5FB7F5E6D943D67A72C
+2D3380CD11DAFDDCCC52D1577E3F42801A1C2BC852989A985F31F123428D62E4E422077E67B2
+9720C7BEAA0CD2D6A1B3296C0011CA1DA764DB0DD6038DCAB552C4764DF3349C35BCAC50A5C3
+ED58F5EBF81215127929A168E287843FB068542F4A8E0DA821922E90176F3F200FFCA7BFCD2B
+CFFD1AC611D3021F2BE43D4200CC0080395F4CFE815161B1EFE4BC86E012018B1AACA3EC178E
+41B1324BEEF95F01AE5C7FCBEDD799A0F0673D7988F3098CCEFDD4131B95FE216F37621967CE
+EED39CFCD0E8ACFF3ED052E10B22EE910304B2C60CA8F1BC2347B886C15D222713EDB2CD0774
+8B49AA2A75640AA731A00E9ACF344EBF88EE94FA673A3E26ACBCD30A0F7FE98878DBE4ACD585
+16484276D8880EA5335884609E19F843910444D43BB77C64D4F2FDA0C42E71CBDA70D0C49086
+A5487E31A9B8EC5399F6D4087EBCBBFE631D6D57583055BDB9A90506A9D7D5F9E298B6989CF1
+51227C46A2E0C36AB1E2C91B5130102640B4A41C32D33E7B4D8381525F23CFB27AB236BDFE37
+DD2199E0CC951CC6F0BF9CCA0F42AB62242F78A89D9D303837E49D713C28FCE2618573A33C27
+2E5E77B8CA385950A24A3ACD3B178730DBD9615868ADAA5838C42A7DB016B81E092827060CF2
+3F330FDEDEC7C0AF990F6A3283C294BF824D14CB4FF79A31895A5F35A1B81F90C4465D142FC1
+BE27598E49F1CE9185A1F46793FCA94A7D7760C99C31E8D33D640CAB15AEBFDD9A5BD8A520B5
+D61CF9F893A0E5EA62D0A459F977559614600E65FCF5E06E9FC93304AF3E4F41D8021E625AED
+86C7762894AB6B065F9897624B044C60F194D68C01C7B958D493DDAB54019D0E52AEDF25CAEF
+50F2863406B9B04FED44611DA947FFEA887860182454B4C229316656A7C4639C475CC7126435
+19CEE03691104AF60A6F5530029585BF62255E7F19B52A5035BF6E70A02E3996F22CBA14177F
+E5AC5FE4B6C31B8B3EB1A3A5DF45CD6B300B028FBB2F9F7F790B42B37AE8F168CD4302F88D16
+FA16ACE7522A50DB92B20A8DE84038BF447E336D00C1BAAF2EBB4348E2ADAA12093241EEFDE1
+D7BD8FD415D8449E104CEBD9D9933CD1440C897509632C2787D06D279E08D81D924E3A47337E
+B29207BA9EBAF4AF52E137F33F2F40ACD7F932AEB8BEC328BD9FC7E20EE4C499522B933F8907
+0724BC735179910E0702472BA32F165710AF72F34FE861822409D7A6E1C2E7A040D08CE4D790
+E129072EAD4CDBD5C20C1E4D789FF5BB74AED8C721B5A0798D3F879FBC74E73922D5C031F295
+98E9C26A67A3261F20C7B5633AB76DC3CDE4535A78D31B615906B326B364DDEFCA3D1279C980
+DF1B607327B08EEA8172B879F7B974512A158E9BE93C925EE882D130A30FA3BED0184037C0CA
+BEE96554D1F4627F5BA4F9740BFAD28252473B2EE7B1CDB35CEFB2A7167159AFBDD8F5C1E110
+67112AE4FA45BFCA60FB2138FBD530FF80EC723A7B91EC6399D0A09C010159E0F990BCD6F0E8
+A87CA402859E9161BEB1174067EE22264222442524CEB6ADD108CD380773FE7CF53210F311CA
+C05873A86C384C297D9D7D0D0B9263623B1C96A0D67ED33914BAAD1D5F496B2E335F92C824DD
+EBACD11BFC8767F8DDF330E82DF1EF978A85E22E6F4F69D7C01B87B2DB876C31406D8ACCEEB5
+3355ED66693E71C98B7CA74E8FC4A3D4ED5D7A5A7A0B3A48DA7CAFE8491DCB1DA2B28DECC4F1
+DF70CB55FDAA7BE6BAF4C9F656865E84744F437310FF68785C86BC076D325FDAF143E29D71E0
+1B1A217CC1EF03BCF42557B293B044AABC8E526E7369EEE789C32559744FE85F3D1DD0B6F243
+61C7E98E46866F32AA576C174642DC4BC733CACA810F6BD48F43BB74C5F39B34881B3872DB8B
+2BC3E56A51CEFC665D79E810CD26C7DAFB8AA333C68951DB0AAED85B6428478CE4AFFDBFB73E
+4A534E177DC5B3386DEBD2D1779DDD361978F8A66B0C2415DA5D7110C9F84212D203B62185A5
+2934D48F9167D79EC5383C53164A4E304A9B3FE6E678C632A04E63246C212A5AF2D954E32C09
+8AF13AE7B6E24B1C4F1A6E75853522C53BF7B635D1E4722AEA1C8DA241BE48314B9C1C2651F1
+936AABEBC986482B997A672F9EBD08F1363562EC76412C17A16356EC2F8B9B9AFBC42ED04AD1
+E64A9284D84932E557D8F45C9851373A130467B8F184419BA1CD59D0321B78022736E66B6DAC
+E7F2DB0464B1608505161C8043F9DC14B8B0222D65BD266FE8548024E49C6DB0495FC7B3C53D
+A30B45CE76FF49567761F2A2BFBAE2476533A1D06E84A52A72F4D53B8A5A399B8A0F4E7094D5
+8DED07D9E3AF6FC7306F311C1B4CCB576874655EDDAA259E8B52B4B16A6D142C8A2719EC7284
+DD98624D745BC2BC6155178B97BF9097169239A61A2329E8A0EC84E5F87035F550B28CB69D02
+468B6F2E8F32CE0EB7939275BAEA470A92586473BC2584E8F70F1F42D9CB72B3F4A303A81FC5
+36C70D3280C356832ED101437ACA7FBA218C1E93A63D54C16644E75BE0F59FC03636A8400039
+492831766AED50AEDC061E2100D044229534C6FF8B9D8EE685547D511B8D6D3CB743AE02FF35
+F3D095A4F25CE66ADA8B2F574E2CDE7DDE3CD44883C7E2932AAF31B9FE3B06F331DFA2CD3A73
+958ADFD29EFE32721123DE67B0793056EE05461CEAAB6678FF32DE6785691D0ACECC89EB20B8
+25E5EFA4237EE8570010A4B66D36746E6FB9A12F9D1CEAE577ED14FF9ADDBDD4380B38377489
+650F024964C68940793E2AB479716264C96A28A75983579197EB04301A47E2670B2EDED6E6AA
+DB2E3EBDBD5193580C3006EB00BDBA268D695B8CD084900093C66F65D6B4A2E5E3CB9EBA935E
+EF0A1C90E72843BE124B24AE09C4FB2F67A3B021B6DB3997F5C2C58AC1CD24265814F25FADAF
+56D4019B63EA0867F2A4A746FCA84D008F0FEF1ABD87F662DA534EF59DB37FDC715148D52C2E
+4F3D110B8A0C097D6929022F9B4F41411C38EAF4A11DC7B1FF4C5FDEB1DA1DCB2518F464EB16
+514C93E1B4BCDAB6A0227A1E2446643FA6181BDA489B726B1C4BA4E1F721CFCF0413F4487DE5
+61035C52714824FB8A991AD2BAB5FEC9E342E1BB99602C891BCD505304FDA9A8038FFBB0280F
+05E7056DA44E3F726B36DF147DC9F408A5AF2F61040B1D843FE1DA8773AFBBD1399B0EF9C97C
+E83353E62D78120B176EC5CF579E4A4F6DEB0DC296C18BE1CFB25F5F7F2F7BB8A7F3365A0FC8
+D2D4503FFE62288EA33A5D2B6AB492D587451842B6A83BC4EDAB37D90846F111DA5DEE94932F
+66D3C6F0C7D515940FE6ED5EF717836F55BE04EE14CCC33E601D5F37ADD307512FF800BC2CD7
+2601E97070FB6312700E06908518C8A3BAFDDC2DD4A45F9E57342FE3B5198B860AD1243B1AC4
+E00527C8A74397AEB1930FD08D3B0A34612E747F12736C26764163C2F2AD10157DE6A8B0EEFA
+BC40752FD2F767FC337B4ACB8015C43CF76608B18C79C2E4433DF8CD1B2CE53897F970A615F8
+3ECAE566DEA55B366FCA70F3C63CC3AE60FE8807212B0BE4C7418EBFB583A03783C24CD0D299
+43E6B02A4569E99E77818A4BCECCB066C5C66DD1AB8121EE933E1FC8042A49ECE66FF1286D77
+1D27443D566397349F7DE05CEE81EC4E3E1D803E2C7520153B541E0A1F341F8C0A1EA6E6DF0F
+F20133EFC4AD274C26C4B41451F78B01FD488453FBD0C4C8C3F11545777A3B9E59560EDDF512
+2C376F3F3CB18DC114DDA9633E99F943DF6B5F2C8E077ADDBE9F4ECEC96A5564F2C0B496B10E
+3A0C7F1FC197F0248DBF05BFBE63BAE600BD9B82FBBA9A07EF929408DE62EEEAD7032437C635
+F7216FDAE5754FAEDDBA1A8F8D9A67FE3065840A7E2D088797FB306E6C6995DCF6901E6F4F1D
+925858CE94556488DFC28F2F704D891ECBBE0D83078757AA2ACC890DC6B1C7D59BB21755A3EB
+AF07BC61F1869C947B5D0640A1662E4FC84D4EBBA1E185FD74740462D1086DC731CFFA325D20
+04AAD7BBBD764A157469F11DDA236622F2D14A57C5B0927169173FB347E7DCEE4403DD9B0D93
+FF3E82761CF241911FD2783B25DBA8F54CE7B6CBB16E12749A043F9EA634F0741B35B37A6B09
+93A763E796336FB33D35318EA517A7E9DE777E0A7015460D68ED2A2C3996D5D374FDBDB88309
+FEC4F66FB2EB2D90CADC7435F3757B10AF1B1215F25F093FB26955EA22103BCC82FC7696F112
+29B6BEB2BA21D9D415F746A6B18A42D9CC3316388220230F31354953F80786311D2940B42C43
+3DEC8F126D91F4F2302F1240D55F132CDFAB90DBDFEBA8E49FBEE19DB7EB90B81D6511E64045
+955899B94D6EBE62F7DC06A47C531E52D396DC967B9C39E20D262ED3DC817258202B60F9F33E
+EA3A37783C74B088107A9B263AC63232D4899C4E5718622B40FAD50EEC80E10ACBFD8D007D2C
+41481D91ADB1DE1D17040160BF26BFC090270D539A040B9A8D3EA4A96341721DC1B86F592CCD
+3BC1C42672852FF6A9CB6C14CC49B244B5DAE3AF384BD79DF85E8DA20139964D231183262CB5
+CFAE5FBE67866AD6F44C185064222337027440979593B346933644B9B9D20922F1BBD7DA15CA
+0910790ABEED836845E47C49D2F0F8128908EA81772FA823B830E725B015CC07AD1FDF14B7EA
+FB78B7EA9B0BFAAEE914837539AF5209C3DDD962215212E055F97BFB1AEA72A91804E87D3EDF
+94DD1A6757F1BF7123B99392274A8DFA077CC8932538F776971C8D2E098B07ED29366D94F88C
+C5B96226CEDC18DDCF91D6FD40E7EBE662045ABF928D30327AAAF4323DB228A88D983A1AE202
+ED41A4DAF1EEB2129C629446D0C0269D00B2B68CFCA3650DD0F184513EF5589D6BD041727072
+FCAD10F72647F9558D901B80D3159CC6380E43FE53BFF227A0310D1D571F24675579383C5994
+FFDE1781E76224197AED6F0D1EEB09AB34C240F3DA63513F7D20E6CC46C61040943A05D9E9C6
+3D6FBECF348144246E70F46CA71CB7D050CE254A51D0B2EFFC25BDD6617DF05FAE99B49A593D
+B19EF6110DBF01579B7AAB8F918CD8B3AFC6A52CDC1F3896257AF1EDDEEAB6E2F082901BDAA1
+17D07BF5134F6454FE4D70CD6A14F055435F6C07DAE9DCD2301B9AB692BB2C55226F10024883
+15E067FB59BF0862C27AC2CC601B54CBE0E4E36CFACE2BB339D340AAF16E71256299A648ACCE
+D93CDE98E3904872F121664B5B5DB6A353707749BEBB7ACF97A9D3775543CC34EE3B933676B4
+DCCF500B76E674B18DD7DDC11BFFF012DFFE99A9EB564350A0AEA2F90E765E9ED3E6A2D1FEEE
+D4A0ED77BA3A18808272AF43376D47B738C62B9E59D65008B00AFD4A8012D97C4E322A0BF20F
+A8647588BE734708031B3FF0673F8DF0C7873ABBC98E6C3EA75253F66CF2B2131D50280AF892
+40B5BA40A2EF0BDCDF2355B62FFB1C3026A243528F35B111C80F7C7768D471B600B4714E2336
+E76ED013C6A2C1D6ACCB359AD2F9BEE8533DD1570289BCE268D529B85DEB189185DDF400CDD0
+384CB10D14DE57BED2F1A504753FA9342412590A3AA059EA9384913831B1CE239F689F5E3778
+179194E993D7F233F2DB5FA8E416BB861A2D0773C764F9D30B1AD046266B4BC1ECBD7ABD7450
+35C1A20798967099C2D318E2D3395391E5F9D68B9A3E3975183397EB6BD76A8E313CC208CEB9
+D759A0592473B515F533238EA720DA3DC56EA09293B20F0C68A7C820783F97CBB7CF064472DC
+3F1B518307A54066C851DC3DD57EA8F327ADC8D52A6C2CB848E60DE094F66270D52BA72A989D
+898B46631C08300867B8517F2297302374076288D529D37ECF0A66DCD39C5432D9B8C200E92E
+0A0DF4E9A75A49D7485EBBF5E2416C051402F6B11E916B02BFBCBFC19C5670C5273953C8CC5D
+22364F4EFCF141736FAF79F0E2AA008EA13B52378879B91AD928247175AB5C5532D99CB887D4
+97A9397B578516BF7C087F710A4ECDF0522EA79643CAA25A77C42AD6C6FCAE5759E5875652E4
+D2A5AD9C205B814C688930865C50C73AAD74F3C1F03845D34CE3B63561A16728DA5147F1FC0A
+A8D03BF94FFECD0556C1940A3752E44FF07E04D266D317466A801F50D7BF6CEF16FA9C027DC4
+8E75EF0CD7B3B168F6B5589D5D50C5CE5C2F0916A8B2011A5EB6108806697508D0E202985F0B
+CE2CD90AE1BE517ED29A181B907DF261F87ABE40604315DC0AEF297D8F0E2847D2859F96D074
+2087864E890CF3C72440EF481F630CC7D82CC4BEA21E8D312EA256EF406420DE7FF76FF3C14E
+706CECD2970DAECAA3B96B3C0DDAAB8FE72F99DC0D8809F7AB67BD3AB51EC174567E3B7C8679
+7E6F7C46E22ABFE919A5F70279082BE6609B919DBDC50EB4BF01C1DA386B0821FAD2369EDD1C
+F5CDEB2063F9A0DC033EE15312BC11FA73ABF2CBC15AC252EF8AF0E4CCB3887F9744691EAE27
+01B71B6D179D642930DDE788A412E9B93AEFC2A1A3D08489927DCBC8EB014C07774EC976B97A
+BB64859168358FEA0E66E763025866DAC885C992EDA6F53FD455CEC494B7D76CD1EEB555EA07
+71A8607382EA5E934904B64B10258D60470A28478EC03988FC221DC323BCC12247CCE2130129
+5C1878C60B523ABBEB9506B0B88B07C77A457140D813A04CB9E0928A309657465244F338BD17
+A15CC0960C755C8EB5DF34F0A4E3A1954FDA82040FF5C484E90DA96A618C3659DE9A4320EA63
+24E33CF0C76CD5D85A8A51DBD55B016EDB1AC824A814E3E158B1699A98BD927D58834011D09E
+423F04523402781F00972C0E399B2F24676E765A812CC6193D65D353C649EC25B92AC1D87484
+436F67744A44533296A819362D5FEC42726F242A1C9D898E26949F1B0AD072EB2DBD186DC326
+A091830F9311C68AA077914269E26815AF0A65AE44D38146C8DB96401EE0275AB3CA1AB578D8
+9FFC880D51E3E2604ABE30E0D536040A81F535607C627D7555C3C5761DA9E4B55106FBDEF4A1
+9E2AF9B67E04100D0BA2933B1938251B81B95A16D70A98CE18F2FF9F8075F63261337C79D209
+F85799D051C64C3979C06ECB3C0EFF5C4B88A8C41DE0E533CCB38C700D563108BF35216A132E
+E6B68F14A6F97EC4CF915BE5F9CEDBAB9519BC61D419251A8D6490EA7566C5A2D32B59D5F2BF
+3BA354321F38E1F42A7B204AA49B4312AC01C24E668A5DEC5062FA165B08AF954403868B3072
+4DA0FA8D96E9E460676469255781EF3DCA04D973F89A224DAA2033683358C90FED5447D95F84
+A2D83357F612AAE7CE77B75E049DEF29C58804030AC9DE20FD767097D69DFA818AAEE276B5FF
+16F83D143C4560BAC8FB7EC6744D126A9F6ED0F6AF01F776AA27E9215AA76BD6A656FC11B3B9
+B325D0476944B4F0319B3B4E4AA9DE1CD69300ED2E711360468602DE6D70858F7264DE7C1E8C
+7792ABF5CA3D77242D36819079A429EB1A6F52EED138A3D0581F74948964B639CF4732EF1963
+781A27AA4D0E41F9721E760E1D3DD339CFD01C23799846911C47273277D39375D205413F13B9
+12548B747E0BC01350EF6BC24E708AAF802DB81DE0F11F5A517DA13A6521401B7EE95E13411E
+0250159427D9AF4CED49143FE214FD4C8E60A0827A5402076A70E28BDA9702A4B50A195A5F12
+4ADB1DE49B4FF904B1115F9385C0FE5FE698AF968D87DE72CC5A042CE0D77CFFF66DE6492CAE
+B1EB0956B98975AF882D19AD7BC35477008FF1FB2F16E12B00BA622EA9D36003D003B06E2303
+516E37EA86FD6CB6DF3C0C4C88C972667C8EADBB55AF7B1BB5B63616730A34EB3531D754DC6C
+761D48C91604EA8BD809F81614AAEA4FBD71EA9275F9BD0CB3247038185621429DF649EE6307
+77F35957C6013330333B22390886470EFB75DD46D095232AD56D1AB73B8B285BF0DFCD9F3759
+60717C99DCA4E85063EE10804363AD83E034F7096844DD939C8F5AB2B15D8C54E43F0C781919
+6EC3EAC50BDCF240730C15E72D20D53D54CD94834504746B7B15614D0E49FA6188685A059372
+FFFA9690D6A2585A3C78980ABCF00B7BAE97223A9788C1237DE074ED3376B3E864473AA6C9A8
+2C4DECF82832CD4DC440F5F4FC71E71DB79CF6F44A5F5BFB754CA78AC361C60469429C3F2908
+E36A20AF935E5B28122027F772687670973BAE148EFD299C362128FFBB4F20EAEB3A4016C257
+FE852D86AD98FDCE4452364FDBECA4EFDE760C1C9C1478EC68F3577CBDD741576686229D1E55
+44A4E7BA2DBC1326F298941ED25BB0BA240C6E500826F48D57F6261ACBBC3D748DA02641F1CA
+59D2AB55F3D4864CF4DDD114A7E76E0CB8206D978B8483B6E47FD0560466F003B5FF85F561F3
+01026E0DDD816EEA60B26679192A2C1B4CC3612E0546492750768F838D3764B08201B8807806
+D6511B295BCB852D888756AF2306C75EF4EAB2BC2B35C93F88E7EA1CD24B6E1C2E409A9187D0
+51C8D98DAC097869AB13ABB7A3EE8A2A883C347F1D4C297C96F193D50327D230205BB1C997F9
+AD9C11707B19B49F289B4778A411F22399E401B437394E771E2B94D73BA650D9A1FB7F7733A8
+D4E2A10FA2F63863A6692CC612C564F42D8B1DE59146E42CEC5EADD19EF97601D3079827DEB5
+44D0C743E56529CED1AF3871F854E5E1DA4FAB5D61A1810808947A3B578A277FC4C85F446AAF
+6DFDA767F2B4289F97AED8FA1B03400CC79F6BF98944AF81949C70863684F22CDC2CE61EB07E
+4D79CFAC9D088B43FBC0D833F98B03376AAC61674DDEE39A7498F2669D91C26DE5B38EB7BD3B
+108DF6A55C0B0B8B73987934657C1FE75AF99247C770D2299A2AC2F56463D0FBEC4586610932
+3E41F482826CFD0AC3C09725E88CF849A77FCD001179F02794911B9A3EC4EC492243E5DA11AE
+D2DE28AADBF3714C017A533BF9B6E80ADE6921D418FA46CA09E66291F4C50A7A60454E02B211
+6ED7A53D0FB7C1A7C8FEE48133CC47EC8C9F17C8D5D96DB0CCB07994F0269CCF5E7BA08DE086
+63004D2E79DE05DBCB67E4C6408E07AC72DBF35ED62DACF37746111188D1573034D227AAFFDE
+9812EC5F32D4B4F1123B93BE2DBBE2C5D92BC24A0AB1047861A2B5C678BA8ACB01C919028196
+FA2A9DCF7499582573875ED638744AEFEFC7906847105D94735577BB8B20C0FA7287674E32FA
+9471480A21A2DCD6E7686286C30DBA19CB0EDC8D4441097E237C17414A9FCA533E239D8A6DB2
+06877E243C149E5A956C803878F529F2AF8FFDEF2796B6F0487BDD3FECF22B8725B9DA6A9FBB
+7FFDBFE0770A3E4C4375BCDD8EACE581491954700DECD136525AF7D01EF3776A382E23F510B2
+3F2FB4478818811F8485A1EF49350FDF10429D9267D1071361FA53176C9962BC9FC49488289F
+93780D38F5980F66328B1A066F723FCB8989A33758CE7A090AF733CAFD292E9068FD39727F1A
+563EA7EEF3E29005C3B54C7BFAAD968867D186A5BDEBED92C2E1DE7F4D614C7E7BA10D38CAC6
+05FF800FE1F28909B0736B4762707E8DB1E75F1805D41AA9FEEA89F52DFA3E14AFC44E8CC753
+8D88CEC3E74FD4DAE424F8D8E5A8742011B39F21F118D550C0B6CEA21E88A605FFA17B8E4462
+5D6B2E4C1E4D2B90DA3D4BE844459D3D3BF0272B81D301BB8595033267BAB4902C3D90FAFFCE
+743764B1E0D2A4BC64457F1669C6BF72483299C1A6A976E3C5C975D55ACE50FAD15A27693B1A
+E3713A028EBD33187E9A35B30665A32F8E23B37561D4856683DD2D99FD941524600C5A4075C3
+65DEB013DF4561E845877AB16027DDAEC4E543CCCB8127709E0BD78A0D06786DD5AA5E8435AA
+ABEADB6BA8D93BFC6422DA4D6EB8D6688FBFB85C383FB80325EB7E3C8027E0E3140E9A1EA001
+A70958F0D2AAE8D948FEE71B47D8BB5367116180C97DB48F0B6D72ED7951C5D2AD85CEBAEE7D
+F3A67FE10260FF901CB36249501343484A8E99378287D3017E828CA6A0A7ED377FF3D4863D01
+4DD0B81E4BCA76DCB20B243B1884049C54CD3D811F6EE4242BF75CF8E6375769715A21F6F018
+E225C5B8DEE383ED36479656B0700A4CD42910116ABD387DE79C542B01B2E966DE3926CAB980
+47949B5857604B61CF2C35E02DD94859C6CD3D84B647811ABB297C591F9657A468F7C01C55E7
+A6848BCDAD3EA11137959C93BAAFDF79569DCFA3D0554D34A9DD91FDD27C8FE17510070E2A7C
+5606CFAF9593B91E347696C937F9ABE7AD3813BDFCADA0844A7875080BCEF9CE30CB5318E26B
+37590414941C1C5861440F31F82CFE52DFB5C2E5F70EC8C6B7D3D28F246C6A9A3A3D2A743E37
+2809979B43F66A8263036ABF58A3D77B955B8651A490A83498838596D0D9726374763BE85D6C
+28E3A1AABE8692B02C9CDD93BD1A7E70FBDB0C48B0AE9B74849BEB4353FCABDA757FC03E313F
+89F23083EC01AA2A16F96DD05DC16910F2E58E9EF9054E8952C9474BBB916B894AFC91EBF6AC
+5503D3D026AAFD92760B7A8D4FD160D5511ADD7705925B32C194FC86AAABE152EFCDD059811D
+66CC3FE59B7AF178FD12F9A9F3B004994C41221AD2876265865D87242EF1EDE53B8313197A7C
+D59D239A293E0E6A2C3E4DDEEAAE685CB34125D4030398E67F1DE99EAF60F70F72CB18F14BD8
+A456BB8845D95E74D9AF94F011CCA1A66F6934FF5AF19ACD5F0DE1AF753598B5B73EDE6BCA2F
+B7DAA470F6751CACA86789A80BF146D4E55C4FE07E56E673C28457AD4CB41FE9667BE478DCC4
+0259CCDE65A93771B8060DCBFFE988F5FA689BCD1D818BDD9E975CAC4922ACB2FCCA08144087
+0255C4A1F5E1A600538518EFACFF09945B1140AE65CD51BCABEE1DD9F02D104B196035301454
+D88D455BC4906FB4B630323903B7B340A921BE0DD40B5EEE67E2DB724B5DB94F634B51DA8070
+A425B229A8F38FAA27EDD0BCDA4171C4453BDDD75C80C59D38D000A0E1A938B9FC9A411B1057
+123BD593BC9E94B9FB0A675E1E9FA30786D0B2FBA7503D9291433A81EEF85A544C20D6BBB411
+44F67BF7BBACC1629EBD882BF1FB1F371CBD3FC5FB0ABFE3C0DED921C46A782F983A6807B94C
+7641CD03F748343E6A9F8D4165A41A4ABE7356C68173A2AD8F01F1DCBDB25DC4499F25E6AC0E
+D8C060412E3CE35F4D6EB63EE2A5F37D6E59045D3D31C5CA76D7A556F0F7D169BD84008355FA
+C3A7290C969243C9EB19F3023A329A60B3F8419179DADEA384E5829EC35FDD0A6E287C7B47E6
+8EBBB7B2F212B40961FC5D8160BC566C0712D56C27BB3AB011E63D5C8F086F30BF1F38F1E6A1
+716FA1A57ED4CE22E37B783E22ED9BA9DA10268A88DCBE8CE83FC905173E143D621FD7C8AD65
+5026EF658C0981897D26B6149F510E940309153D0310DB254977C6358BEBDD52B876852FFA16
+D638FD9CAADA1B2B3CFCE4668CA1D6A9B7E17768FAFE86D52301D94B317C4C5C0FF293FFA437
+160FEBF933635A3DEE76813C122F461C0C086CF7B6D22218B46E20DC9168B9EDBCBCC54C9DB8
+D81382544C3B2DDAA4BC8F8301D4342F87C9129EE76E3B19D19198B358649A64CD97564379C9
+2DBD9F3BF2F83461A73606DD35C438B2BDFC9232AB362D65F7F200957E129294B6FBCFA77369
+DEE6BC2295C5772E26C80D6629401067E2ABD847ADF75EEDF2F23ED260D1625BA262DA871EC6
+04ED4B09E693227AEEF56FE1AD183FDC01E7128BF27CE53058724441CB1508D1B38314573B84
+0D36CF45E4C79CF9BC0155D8FDFE9798F5B214F393C4311236D83E7C334EB8BE5DCD338837F0
+06B8E58433613CA6C865457DE5981A48CCDEB8AE8D1F779B6CF0EFC318CCE90DA3A55574F753
+568DB629B5DB2E442B85BEAAC8F7ABBBDA5B7D057EBB1638F91E9C8F3CD4C31A78E8A658254D
+EC9B30B1B3BED3FCB4677258362448DDEB51FDE97C5362FB908B5A2A43E971E95974D389DAC3
+626D7403C6EEC87F9975FF34C520506B910242EEF3858AF95D2033A7654504EE312811FB6B84
+4CD32104DEF6B0C0269C4922AE89A4BCFE1F76537C7D255FB88AB1E8DD0D19B9FEEFABA58414
+77F4C178A737590DE343FF2F3F6F78903226079EE74C653E72ABFA7F4E2319292F20BC0CC03F
+A65457311644EB7FD01BC607A8864C86F67F1FF11FA0881A6F50253BA814FF8641F8E7C449CD
+5A20C2A66492767D2A5B9C455B4410508804DAFC454A04E24621BEB24C9098CA508543E1E202
+C0F5E9681F25D3D95122DD4CAFDBF1708C13EB989F753E38C46B4605C31420F33F80B7190D49
+2EA65215F9FCDA923D90DBB2881A1F7B85C7A7ABE8D436BA7C7A95743B0A05DDB02796D44AC3
+D6CBA2183C29A102EE0FF23A81B724ACA0B6A02DA31AA07AFFCBAA66268973FD7E2830F5B8BB
+9DFF12BEAD9EE1E7EF77E966F4101A544FA9B2603E019C26F40C471F7E0197B221E18E875475
+807E6EE6309081BB9256F7221B6B6ED384AD840FB33D7098AC6469485EEA5A6D788E4BC07E3B
+24A9619C47351DA760B0959C8015896D58E0E07EEA3EC1A2376F2EDCC34BA3314E9DDA39DAAC
+810E2DA2547290D79F6B483A82CF46EE3B41DE189E9EF46070B2870CD1E8CB3C7019B2C93EDE
+69B37A5939F7BE8F22CBD56D532860316F4F607EBCB9A3931AC02E7A44C275160E8B574375D9
+4CD346CC79A1CE4158DB0E90A727226934B963154FF4F5550509F4B956DCFAD74F0D4F16229C
+2FD62BAA41828C437AE3A00F5E1E6420426B7054C1436E8007FC86326C1036606B539F166024
+4AC4E2172E281D279532336BCACD45E9CED79853B3A52E0A202CC077105D42D821DA2FBE4141
+99A04CD35F6B09E154412C7BCFE4AF6E04754362A220D88076F7E1C6F8BF87C9288AC4DBE820
+7C28FC12C84BF01B1C49B65D58308C16C3231C78AAC46C77B2CEB07128ECB792381A79FF1B32
+53A18504666C7C368C1349643EBDF2282D945D6CD5DDEB57F78AE5A3A15E6093E6FE20C1EC4A
+EEE034868C37F78100B114E03BC443079F09C860C00BD93C471FDC04848E18E5AA02002FA8B7
+7DA968A4E781895C1A6EFDDA1247D1AC39E4E157375B67FDD03578412BC61F297BC1B363C287
+F1A17D193BDED6D525BD24C0C25D34B45B7F72BEB48F9C93A24E774F2533C331B86D09D315F4
+0B7214CB635CB4DDF9B15DA4124F7BB80351889A033846BAD31860D51BDC98181536B197E7C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMR6
+%!PS-AdobeFont-1.1: CMR6 1.0
+%%CreationDate: 1991 Aug 20 16:39:02
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR6) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR6 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-20 -250 1193 750}readonly def
+/UniqueID 5000789 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B4486858B2A4B5A0CC2E1BF4E2A4A0E748483C
+3BCF5DE47CC5260A3A967CAC70A7A35B88B54315191D0423B4065C7A432987938C6BEDAD3B72
+AD63C2918B6E5A2017457E0D4EBC204B031F3FC6C13D7DA7277A94BA018E9998B3DD888011A5
+D7C4204989F30F908B95533BDA845746B673AB71EA5765A0D14F4350707E47C8276305B28513
+CBE1BB0DBD269A53719BDA46E536685DDF78CA0146B6B93E760256B74D939D4E35B5E77238F0
+4C92298DFDD188FEEA30E053EEFBCBB52F2011772B3AAE39F5805597BBC1E8BB75A446CE0140
+30F4F2F0F49F9E962EE4A1024A746FA92A3628DB5270732B54E43FE5ECFA524F127E5FCC788E
+77E66098336AD67FE4CCCAF0253272D5DF79864BF4B734CB9A5859D557D8BC11B8E00221EBC1
+2E97DE4B1F466EAD83A4C894709363BCA9040410A52D592E34EE40CC7E5EFA920546B981AA65
+9513A24B1B85C221A1875B62D0B89E57A368321B8043A5B094E0379760A443D632892B14AD6D
+19DACC8C78093243AD67E6A308E56E6B68412EE690B10DAC6E17708754A00D51FC957B500EB8
+0175716EEF4B2CA1EF867614659BEE3F2B7319E97B6FDF1EFC847BF3CEE3156F72F21751DA8E
+5FB6898919E6799820D3DE0642D756E09D6FAE4FF08DD3DEDA3173BFF4BB11F79109C97DDC05
+897AF709EA199A90FCEE8CE4C7A3C15B18170C41C04DE2D3FBA8F34296A95B8E1E8DE3739B17
+273F8F2C85E914615C31FA0DDA3022E6C4280377C7FC05D7171BAF721953616AFF57C215B922
+C58A7EADCEFFF122216DF93857BB5CF4FDBC70A42B604EC02620E28530F2896C96EF1F89F205
+4BC547825E74D22A0E029F61A24352D29E63BC4D26CE4802E718056EEF9D2C9AD5D440844945
+17023CE9CEAF70CEB3AFA574C8BB8B778397072A13B9D13E4638A2C5A4EA6ECBCCED04122D1F
+FF56BCDED0B2CC5EA98882E0F801E665C38314E603DBB1A53BC7E2A9C858CF8BF7DE0B53CAEE
+93246DEFC55A08C6DA35C9D2D380E19AFE4B3EFDE32275CC1A98F6A6B7BFC2D87BC40DCAB876
+EACEF88528656E5B520CB780B5A7EFE48F3DAAA5C53465510320115D6B0A535D4FC517853728
+37238858AF9E07DE961647B8B768FDE8F86622AB37630BF0DD6114A6A465662E368FF60EF240
+512A6356FA1732E4F292E00A7210DCBDB3850DBA647150D3757EC8F79C7EAB1A4027E22DF1D7
+A2A07360ABF76753BC1FBFE5B9D5F6048E4848380B1CC5E7998A63A118AED949AF6FD702DEF5
+96AD934CB0D462E5F248DD691053E47EA698176EC6F7A18CA69DC6E3D646C3E4E89B30068E4E
+04E1399A36CFB42D51123C6DBC226708FEA1E8AE38C699A49F9289CC7F133347A301014AE436
+D7BBEF41200C2ABDCA5EB576887707A4AB7A62FB6484092BF2B944F00D0EEAFBDB36CB5F31EF
+36CA1A01DAD6C35FC63D175C461FDF98E57FC4A9835A4F3A26D9D789050A1DE31F5555D368BD
+CDB3E0D14491603AD6F603850161EB2B094458A17B7D5B268A1066E003BEB5FE3E2B5026F85A
+DF28582D4A390F30A46335B4920A97F98F96F87E46127501F9F2A5BFF9CF0DD0FF53413745BD
+685F573045D84CD1D435FDC9B6E37BB7F8A2B3521114DD5FA77CE938D44478D9CF3E4ACEEB48
+08797FF2998338C16326B1178B22A78D19ACABBE1F52F2399D1EB7B18F1699C978ED9E11ED60
+B71F26E3C411CC9DA0E0112ED45A9ECEC71EF6D9055B1ECD8BA74288E3AEE52A9BA8B4816E43
+06BB18089BBCAEF3AE42A57277FF1BC6CCB4D6F02C61474904FF1DF172B5FECBC641A95311A0
+47356B11EFE6EDC4415A16FFB86EA5ED193E5BFA78D42F5E2D3F39E630D934660351BD48FA5A
+62FACA95BC1B4ED7EFF27A796208FFCF13616CD9797A368C66BD9CD27698AF716CE1E3A7A9FF
+F1A50E7E46F07411E91FC4FE30D2338E4412E709226F29000A9DBDF55C16EA8F0C7717072201
+BDEEEF887415AA4283141CD661085E0FCF2D6880B03AE978E8D7B0F735D52A78DA3CEA4777C3
+CEAA4BFB62A4D15B0DB96BDE97A0CDD4DC0D5B1371760559CE42411C5C4F0428ECC4109E92B6
+117D63B4057125EF3FFE6B5B40639450300F0F98ACCC48B923015CEF850D943ABD5AD61D3216
+EDF2363E5D305D351DA0499827E2A6D32685CD8F03FFB30C90AA594F914E41EAFDF892012BEE
+0776E5809FFDECADC2AAD840446ACC20C36BBBB81509FD461EC2EC3D754FF89016987CB9D96D
+901E7F0311446531197A73F1B9F9DDA3F20C2AB162AA2AAE8329C83FF25613E55F2581ED496A
+B051ECC231BA8CBCE253B6797C4D7CC9EF2C0B9F298D06EF8A8BD5B86FC61D8A5C43F0D08C19
+1BAB04932AC6A8E17AAEDB9301F9A63FA4E240935A58517016C9C81AD821021CB10F81BBC2B9
+403AB735DA0AD1104B4BC8751C8683BF22F998BBF3F0BC319B93C54B1D1AA2D6598BCD6C47BE
+3911D705472A675164D7A84A301940159D5A812872A3610E01CFFC3E9A215837960733E651D8
+B976F5B634A638551E0BB6D33930A7ED7B33FB62F545E10CE512B15C80A256CE37F2427F5578
+086809028C46AB299F34F56D690068F7A9BCF6F5F576816099E6BDEDEA4A219F3420E3E187F2
+38227F67D50CD0B49A4943C71893CEE0C1D79E7C31E8139D0B78D1F84AAA50A643EB83FADBF3
+68FA219F422ED543B5D16386019D437B1B855C4949493BDD135AE276AAC181E60524CB92F86A
+CD9410B1406E115F32DEF16B22797803E8B7A8DEA28E356A2F4B3BF34C4EB44B6F5341D7657D
+64523DA0220B0A7AA4A852BB8BD235479902CF9972AE0D75D9D4BB032CF0A92EF920F01E102C
+2E625BE813930ACC811377B9830B9F64F1BB5E3B0BCA62746A93E58917C2854478F779CC30BA
+17C132B79A0EF5C6B89435C28E31514685FA3AE81BCA4A440D241C25EF91A486F510284F1B39
+144F17721958FE1FC40F63FAF05FF31A1B7FB06E211379FF045F4692204CB3F556217F888A26
+F3BE16496AB58C1FEBED7C055EAE7D799C2B21E1D2EEE0FB3A5F7B3D2037B06D25B7C78F90C0
+4320AFFA3E0563E6626BA15689C1D3F7384F265E207958D6929F46B82009B11919B2D76F7CB0
+5AF2325E6633CAF0599C152C94BE7F2AA1DE202F3F676FF46EB32D1D0730D2B67B69A2E3B40A
+C2AF72614525525FE42B33996E2036E3EB4C7EA04A42C675B044C71B612F4CC8B06A311416AC
+D9087AE8618F86E807CE2080EC38E62F3E099759A9AA0554C1863546970BC458B15B5F8E8E9F
+B2833D967230868848DFD1716D8E91D37CA307840EA487218E403E2F77007C9467E5418D6308
+906F16CD196A105CF2069F1C2480845A6C18809E07BBA1BEE955B27514A4C99FDAF19E92A70F
+29732FD46636D4C9EF5B151B14ACBFB424B90A281F3E0E8EC5E4613F1AD73BC89B4C56EF33A4
+61DBC803CA529104926FEAF0F1A133D54D9834C1F13CBD9D57A3F2A34B28F555443618ADC110
+4BEA2AD095E09E4C56FB0624451603DF33BDB7440DF13F34206B85174B4131F52B906310528A
+B74C7458BFCFCB5C613451BE6D139FF3B20ACC1D9F79F94E54110EBE128F227731EBF5A58350
+23BE82BC90679F38671D24E70B0AD79CAB6A25F25D2CE0908CA1E6A8A33BD3C7C8E3D4D805D3
+242F33EACDF18DD7D97DA7C6D1F8357B6D7FED22E045EF5EB6EA872CC67084FA0472BDBEFB19
+3C3D494FB26C2548D8C27A7AC9B7F5BFC07982AAAEFC7818323D0A4FABC0D748B8A9CF7EB882
+3D05CE71AC4C3A8CFE18111C865A1957A28ECC041F2D8D4EE37EA4CBA429443BC14AAAC9F50D
+DD460237163BC11C23E45ED061AA7906DC5D7FD3CE3771A7DB949FC818E6D4CB097F67C2C16E
+60AAD774A323DF923E8FFF13F71B3EC691A355B7457E7FBCCF89FC2A4CC444E691E4E37DFB66
+E70D3E75389EA4E869029228D6106D5D9EF41567BF9AA220D569CE6103E7DC737C7B0195D7C6
+20FBCCC0DE6476885F36CB3EF80591FAEC849F7C827E4F73B29F4300A28B0D5E63311390A324
+0CF31C838C26744A285B0AA596AAB377D2999B7941E99D233E879B678AF62997887D08F54246
+BF1F5430E984D6BAECF9059CFB08F261CD144C31A90A8B39BDB7626A0B716D2E7CD811B2B71C
+6F250366319B36EE2D27CC87278F31CA61E35496AD84F628B5E89176F40EB4E8DDD525C8829F
+7F8AA5F33A5B44D4B3BDB723A84DA15878BA19B01A52BBF6D8C77209BFA6B4E78A2AF9197BEC
+6F34FCD3757D2AB00DEE8785212E9FB7B72656593ED6CE707AEA70C51852B7878F9353E202AF
+2FEB35AD71A2FB898816D2EDCBE5C7BAC71F43885DEA4DE71C37C2B68EA7266ECEFEA1C31100
+7A819F822E8027F01C9F5EAECAB699CCDCEE52AD6D44D1E0251C63D914140C45851BC838F8F1
+955DCD0EA727BFA30A2B0B24FF993C971CEFAE7E4584FE64C3C04BF94AD831617C2803B54614
+32E6642450748DFC654A1131DFE92959BC04CCA28E46F2E89DC6DE210C00D107AFFC8910C975
+D7CF231923F30E086162AFD98128A334B4F9F5EFADE134F195CF0EE34972BE8D5C42596C0757
+EEAA0ED6EECBEBB4556C56F7E106A1B2AD69BB2362D6F042DB73AE4F906B50C70127F14B7807
+3B8ECE4827D40033E358BF1C078598A6DE6E381BFB13789C87E95B1CDBEE1532C9B890F9DBB9
+B9F5B4E88C2EB87045DA271A26F982541541EBB93245E5E79DFD6C6EDFB48AE1B1B4619D6B10
+2583788D363269A3DC2A265CE0E76796C99AFBD7846AD9ED23DFB8802109843C5F67E21541BC
+7367DBD8E2C76B7CEE44407D1CE964CEC96860B988E130F78A310734CBF9293BF0FB5A871187
+BA52C4B2129CA5ADAB1C8F61D833B9C231AF3B8003924772CAC46710A612F443C1DB6E0EB5F1
+7C333F46BEF7352FC5AD620DE199071951A1277A368D7ECC273E778AA7EA39FCB727C960A340
+28D2F080E3C7C2580DB81C57A4B581A41CB3460183F9A06DE0EEDF7ECF8D131839C9B36F416C
+096225FB88E1B04E37E002B50A101EB109FCC0C94701B8E69F97451DC6D3F6E027715541A70A
+A9A6DE4AC8A49122EA016FF43160ACF30A53482D9D0FBAE022B0F09663ABF6CE64F0E4AA3317
+0C909BE688967FE2B5A417FB11E4D9373BC89EEDB4EF0686AD6F0227F140C67A6915E6CBE4C6
+8EDEB48619BAC37FFC4F5C268EB2166A2A66E8F4E43B18AE31137F5E8E83771D677F98B9A975
+EE2B373C49C9B716AFBBE9DF2E43D5BFC622DDB1AA54D7C1D324C1067FC6C203E0244F975DD0
+337938DD4FFABFE7C8AE52576F6C97E68AAF0879FF75B512186174E7CE0E4EA6E778F2B756BC
+3EEF7A1936BD4C4E06E4AEC74EDD876EA3BA792F3CEDCB2906ED2314CF222840E69F90C33920
+C3222FFE70035C0E90C8F490829B85FBD818A6BE174F82BCFB12F260955F0F6B5DC20803376C
+5FF58F3374BE1EF8F1B5DAD5BB91A32369B83E5C0DAFECFEFF5ED82D1F31F593862C7411C0A3
+076872083AB327219AF9BA7C86197CE7EC3E36D80868681C4420920E8392B7C1C73F415CA94D
+EE900704F33A5028542919901A382EE01F4C7DEFBC9E4B2059F7385D3EED97425FB302ADD76F
+FC7271CF934E9DB0511C3A86D189D11AC71BCD1716E37CCEB279C8E775FE86670BD5F40C7FA4
+664A856139F567DE5992D1C0AAB36CE53D39D7FC57F7670E416BA5CFC361BA0E1ACC95594161
+DB7FC52E92F2B5E1CA6B7C98B5BE6F1687BE51870EE0D3356BA4EA2D8869E6A76FCD09CDF9E6
+9DF80A193CA4F361F3C11819F50919EC23CC01B0ABA9A5507DCA9B27520855CF6F0F6B27F3D3
+A0DE55336C0784D3E6A75D8F873E841CF6DEA7E297B5749257FB2C598847B90331EED218E23A
+8A151F973DF9777ACD8C5E4F2DF4C54E95E271653B63DBDC75B8A8BD4256B78A4C8B8B264AEB
+1F00B51713E7FBF6B8D1AA45CF94C6F89476BD28124B2ADB58D616DA5493F9694F856039B5CE
+801A2468FB29669805F731E48DF97CB5CEAFE1EB6D963DFD7391A3CC3B272151E20195E7E181
+99F361912253EB81DC9CC439AA20EE5065C553F15FD29D8AAEBF3B61FF8B721F6930742B17B7
+B6A04F622453A3557A58331972DBC436847B0465A5693C95F3C4C316C8EAE4BA464C7520FBC0
+6844B2BD46350EB29E380580E34D3BFD82A61BA3003AED19BF8B2C06AF1FF80DBE1B8198D920
+1F2F6A256C40E1FAD376BBACAA06919411E4C07B8D1027E2005B986745432B6C9CFFC13EB294
+DCB17B604FE12A9D233308D9A62926F3C8B0D0AF6CA2AC06FB17820D419D56F3E125FB50D679
+BF19EDE34B7870D33176036FEB4544B331DDBEC7482F8C0C5698890F83FA03295593BB254E0B
+2BE01825E5049A4381DA26AD13130C7231F67635CCF4E02909D8B5F1EF887E0DBBEEA26FD7F7
+836DF4CE154CA6C712195CCE21DD8094BEADB8964E12FD3F6E359FF822AE5D6B35E477263D38
+3C1A64171B731B22B3F2FC9B9DD1E7E3A5AEBE55A72FCD266E9DF0D7B29A7C89C5ECA9FEEFA1
+1ABDC05AACF9E561BFA1793A5DA13AC8A01F4F6E3921DCB95B8D1F317941F717DC9A94B9C5DA
+B50AD38041E1530FFB377CB391F3CF8D92D85421539180EC91857BB7F7AFE1FDFF71D39496D7
+8C88DD4C18842900D3D886B278D5024AEC128901394C23F6EED66F1E5AD8812AC16A32CDBC13
+593120F1DE685C66579B015B7F8116448E7BB5C96DB6F15675C9BAE44809912D678FBFC6602B
+DAB5B0CC87D76978BEC68B47F48D599423B57827715CE9C08F0136691AAB20197AE0F2211953
+454CA523002E0E47696DC4B74E02D0EAAF6275E4D07B99B8012BBE5DF158D77D38D8961DA320
+343343FE12408DDDDF6CB84CAC70E44D04C6E9ECFCE8F8D595BE1CCE9F5847F410E0DE250B75
+EC48A9EBDCFEA5F4E44697B3350C635086945BE544755823AFF7FCA4113E9DEF0F0F8BE4E58E
+1B2C2D3CDB2F38BF23B2ED94596790927F5C535117F2A522ED99700D9E0B2372FA1B2E4B09F2
+3240F51E35E269A824A8D0CCB286E6219A9BEB516FED7C247D7A6C6B12B9B2D42A5564C64257
+5F6A93406167C36ECE06CFB4F3371C80D3B7D459A5F8015771151A62E9DF015B7893E5D54241
+BE2CEEF584D6F5502B433A0654625C0EB71F2820D2C8B4F4A2362E603DBD104A821EF860C26F
+6068E63F6DCA31B85C0A0163F644049593E30E5C793D7304CCF9D749C35458F4748A3A5C89CC
+D6349FA0DEFF2D520070770C740E83BDE55C8B6D8DB5E853D1C9951C3A92DD0DF49E1F18EF91
+7169DF8EAFC35B7D8A9F9F546DE5E5BF27F2DD5B2B242D9DA9A37EDCB9B3F0D91726941CB2AA
+F60E51C36DCE821EDF1DC3B071EE86DB4B3E071E08328F6204FFE21A3DCE60D7FAB0BB8B15C3
+B7D2964F4F4DA6C07FD824D747FD70C4F9C88CC0B6B5A653921AB61302A78FB3D1CAFB10A956
+8CC195E4767C59A1280F735AF516E3DCF1BEBB500249DDC756851EB56EE5BAFA767C4B1418C7
+76F5EB5FE36C4CE286877BB0178C6FCBD91734A2B5C043355AED6C02777D4DCC1240862447EF
+B7A429B6A3CB5D44ACC72F05F1AD6295FEB6B013CD7BCEB970BECAEDA465E325832B0F3997D7
+1E524810EB7E7FC002FA0FBF9B3165792797D5E4C25EFBFFE0D22125A09C9804EA51F7C3023D
+753198FA2BE152F3C134B7FAC9DCD9159DA11AC352999E503AD93DD80E2DEA7781D95DFF18C3
+D77170B99E2604D60C57C906FF1777BDEC756866224EE13C40C0C8D3C4424CDF59DA148DDA9B
+117F961EB44AFDEA66B2FEA3B2D4B1A8E49C347AC693191BC67D7794530C7AC0461BA657151E
+C66295F2AE05CE660B09945480AE821EF1AD822FDF34C193184FFC54AE01DAC5599CCAB04039
+61CCBEC949B2E6FBB67E0100969C6B3C546825AE7A41BA05A525B47A774B955D3AD85863E954
+34C541D34FF9AA6ABF0B0431AC5CA1E103BBA6C672BE9EB6A7AB9E0FC4561453B6DA7723BE87
+DBDDE416318028B8F998C3D8F029196F997C62365E197F1B3D87A2FE08B2FE3EE64C71D8D584
+2E71990F4EEDDA0A8614361715B5DB83EA756D6337ED1708B3005537DAD6AC1DD1F3812D48D8
+F8C259FCBE6285F4002072B433977837371D6EFA8E3A07D126E1757B09638018884C0F45D977
+C9D44412CDA894F986226C62D40ECAECC05C141E522B1CFFDA2FA4038A062B5AEF8C511C7485
+56D8D73DB4A04C3B2581FBB2D6E3264CBD5DDC471E6AC973CEE1C72A5FF0B0689CA8A9422E55
+CFF66D1974DA6303DCF158A4D406781E61D5A8A7772A4372EBFA49DBCEA766FD3013D5474392
+DB3BD0DDF81BA91C1B15BDCEFEEBC9224AAD41621DCF01418D03586D7563DB3BF66FECAB2CB6
+8B98D37411D9AD9241A0664A160757FE5B4AAC793D8D89FB42A2F6CC02FFC69A70C8160860B2
+D1DC9263572F49A7B7EC780E03B8D7B084DA88410A62638034E3A149279B4E14F2B93A1CC5DA
+39EC1AC4F63B8DCA5DC50F27A21F1C59517A28396C719C0368458ECFFD0F76FF2D2E5E11B39D
+8430771DC3AFDECFCF4F6F2DC55030E9F584CC37435EEACFF0D208D246CCAB0A03A2CF47C4A2
+161B22B39E67B4F63CDBD166F85DEBD55C126DB2A431582C056BA62E6046A159BF636657F95F
+28A7C95CBD718BCFF1EB2673CCAA16958B40A8C853FD8753E9C8CDB1D1BD6A8D27F38F4A34D6
+70C7D0DB01A9E56C1B38BD831822CFF0C60D4CE0B7FA676E0D8B3425BB5428958F4C22DAA969
+FE2917211EB8A48FF3506AD193BDC48F62E41CBF01C53AE686987966A25CBC7C931433D7FCB9
+0204C93EAA7D58BD89F9DFBA683B0D9482A2792EE83CF72DF5596A065A26CD5919625BF86549
+EAAF1D0478E4E023459D747FA11C92BAE21399B435B4E4493BAA96C24E60AC2099DCE54CC78A
+720C5EF49019B52A6816CAC0E9425F52C4E78F2F5CF1B9517A8C069323881401DA0735D3C9E6
+87DF1696DCDFF01BA592A21C5B26E3B1866DA966B929253E3DAFF6F6245D1D4AF667B9EE5753
+D549E2FA1B634CA4AD4F607FB4DA16B99AF607452940777F817BAEBF8550215DE86DB2883C30
+05C721370E072CAEAAA60EC9471923872427A3BCFB47C045696498DACF29F383CB452899DF93
+FFEC5A95B9D647D9AD93D5C0C57128891EAB144916051D2625085D9182D0B3BD14ACBE369237
+67C89450CBBFEEC999ACF0BBD1997FC0028D0F35BA39F816A524446A551C45BF595A569A0279
+02B02C982269016839EECA6CDEC7E1AFE0A54500E35553390A5A83F71718729B76783CCAF83F
+68F1E640FA713A5423736E8AE37C43D19581AF2963A661D0683A06F4AA318D380427C2BE040C
+5FA3C08BF471C22BB980B38B3F36086E29BE00076055E61B28C85E2BBC843CCADEC358F70B8A
+1581927144752187117A0D803869907AA431BFF15ECC8F9DAC4ABB32D4143EFB16611C3B93E9
+B70FCC9EFE8D579F07AB5DE7CCAE230F95D94E1F6362391DB1028CA5792F499E4524B73B0C99
+36397F5539859AABDFA432D7B1A19639F3AB1730DE30EF1AAEE9C0D38A40720B7EC332BF158B
+0D04518E97A819E29EEB458524DE37D9FC8E46282E56E8E7DC7C97EDCEA00C1072CA101497A5
+B7695526452151EBB838C597EEEBF0C045F82C751B68B756352C745B211C81573941454C0108
+9EF856DE24C4A5C9378048EC7AA146D7C7BCF51B5EE0B60FBB1A18471629CDC5D6077EBCB190
+2D707D6C5FD755476677760ABB4D1ACBA85E7D4931A2AEE47FAF850B858D7BA8BD98693E067D
+A80D7600388FF2643DD0246A16279CEDE00A8ACD56AB3F80F46D9BA434462D71D3D5DEFB0E2D
+7DAFD54847CF47B5C54E27B34F19AE5D088EC8D8239E8B035230166CE9F75274BD54F4FE650F
+274CA53D51091510A022430A3904383850A7E2D102C6D29F88AE9DB0490D52519DB5E417E782
+DB711AE0A166DAC0EAD955ACF0738F59A6E7EA3C773BB38328C5361B8662ECF1C9B97BBDD050
+D910EADE82243D3E24887AC8E9CFA037D9EC4E158514EBEE11D9EB195ECE349454EDD04C233B
+5FBE7B5F0AC57A87142DB0379763A2AF5A1272C60DB7402E4BB7521F5C6602239381ED77DD2E
+8C0891AB913EA0B9B93A44F3A8247B493477C47C256BC600F775C3BB1A845FF1B23B2468D028
+21A5714211A1F2FE6C6F16011A21367F6C282374E8B41C4FA81C575A73141337FD2AD2B169FF
+F0DF66F4937E7200D7B9AB78BFF5976AF42658A44F68DBD3F45862C3D86C51F4F105473B578F
+3DFD5A970CBF671DE89798625850FD4919A4B86B40B7A034000319EEDAF25C0360A633FD4A67
+5A43F06405DA42931D0AADE616CE5BC0CCAFF8E99CE138CBAEC1CB455A52E2F1AF704EE218AB
+D2FF0558953910A726D4256CE6D328E25D3498F18352DA653AA617B1A5C05CCDA1EA3EB591A2
+DB9A1C5BEBAB22D60619D2E6B6B371956E99FDE940C3B9F2AEE0B5C4FA0C902CD93F9E095B0A
+8AE9A32F0360FA22D7BBE965B08DDB1A7A2130328F478D375CF3A734A99FFF582166310AF3B7
+9418093B979046D34CD50126608A5A843D6B708269B626BE70F0C04B046DBCCFD4537995608B
+7A8FB52F2A4CA6004F0789DF7EDC11F4BDE697169DEDAF3A029B755091B4124C83E35E818B8C
+957775BFEE9CBD4A8F7B98547F6DCD4697F5630295B779906608B0DD2CC875B1CF7F1E2E2F1D
+DB45C8936D44D1C27F9BD8BD8F34AE624AB5251DAA505DAEFD130560EF62CFD400DF4F040542
+463D72A00CA86AC84D18FA3F3C56401CFF3779C733C814A69A4DEC3E055BA0A5B25761FE9EC6
+9F17DAF9695A2D1602A41E2E912ACA588F87E99549D670464955B78FA8BBFB582D52C6A9AA72
+B075AA9F2EE7E66DED85340E60AA552389D41E38308577C164E66C03BDDFC4742AA25C5A9654
+44E779D5BAD9822AE25D08C05E9070AF64480C7BC4323B2DEF5BD78672DC58699F0B47ADC58E
+A397CD341EE81EB212CE34580EF980BA11C7BD014111C5F30F5E2AD8E3293BC199DC173A3DF0
+55E241A0B9AA021AD6273DBAE03A5E536E256F9336A752BF2B1352E7159C32504797007014FE
+BD4EC5EE9D8AF97AF7C0D87EC5FF79148F033A828675A173983EF4F018D9B8739AE9A3D2473D
+8CD8003E3E7E268DAD511402532C2BBF49E654FF4BF8D1119D9E3204B8A82120445E3AC554FA
+BD3B42684935C5CAE7E7FD391A38AFA7A2E3773731C517C23FFCA677DA93DEF41F52BBEFE748
+B2B8A35F6BE0BB16B35E7A6EC070A3BB3B3E996DC2E3D4B357626DBD3C44F4614C7725DA3877
+849C1B883E509663B07AE4E5C638072163F979F97DDA7183A8E755E1B1FD9D492555E2C1AB32
+EA67D6F481C9C9C4AB4A048E28FF3FDFD1C5A0890E7A45A4A3A110D9B7AC57EC6BE60ED6F7A2
+5C110ADADCE3401836FDD7A73A645AB0BF866A49F93E81FE06E01B8CF3FE2D415BA1BD2550E9
+53D8005B01DA3390ACCC4048697D0DC8814D35A7C894635DB482CA710CAB1BE9929A16663663
+68FC930973F1492F3E0FBFB23A47AD644C8B40292A7E4B9F41913CECFDE6431307426DB8CE20
+7C7F8E8E2E3252C3E4C414D0CE387C7294BB324A2C61F6412C14EBD4455FD13807639CB60BBA
+38DC1B55A3FB37F100399A9695AC8DEF1A870B753DE3B3BD76DC583C0A27324CA6CCAF7CB240
+5622FEB4A3E0712E4504D8B63063D15AD6D7AA0E91465EEE3AAA20B16BC5770EB10C1494F4EB
+B3AE2B5F6002AD9FB749C687DA4D43E45AC4549FEC2D18E0766EA47835992FB8C73B39FD38A8
+019D8BDAA8F08C510021065FA847091C4F82F73727ADF79F03941E37706460F517DFB7988E04
+92D7138AFC2B0EB7597481BCEB2CABE6D9D2D5D5F99DE33139853BC170642F1471331FA532B7
+6399B496B8633D7EE8B91E4E1377748FCF36165ECC639896F190FE5A4C5C58BC6655A46BC9E5
+26159E10B5C62816F217B43A77E875B8E00CB7C980DEDFBFFDC9530C716D5A06FC5D571E1B52
+01E6AA0D8C9F7E9FF20B969FE1900A5A8C52C329256A393D92B08E705C3684DE948973351AA6
+99738EA10C550B73A54DA15685000FAB0330CB6A508B23B0926405E383EF37D4C9F71A49E223
+3F46C61B718A516A1F3C77D28B1235881FF67B044FDEE408F03BD62B9EBC06965B378CF2DCDF
+34B3A8B15C783C2AE45AC758F55C0861F833F40D508E53A4E50E2A27F009DA0FBA790FF2DE70
+2EF2C43F606FF293F7FB7EEF9FC5125F2D8C9393074BAAB8B544BAF2D8FC48098F3E4E2F7B56
+D8B389ED066B29D9A561ED5B9362A54D48968DBA73EA1FECB371E34950EC27F8506051A8C7F9
+7A7BFF6E7A7D98AF3FC0F17B2FC4A77DB59DF49D2A71CA281CFE90EF0DF7821B791D4C83FAC2
+62CEBCB096EBCED235E157A332F6ED2744195AB30357DEA9F6C5B1B2BF7C8D43EC1ECF62D13E
+31CB68A1F8E9F5B3D4FF92458057AD1FF7583C2AC5C8466E691BCDE83F608D1B79EE6CAAC20D
+A4E4A643E4E2D60AE28535186CB6BC80784B521D2DC8101DD5908558BBEAEABFD021546D75EF
+19FA4BF86C85BBFD9ADFFB6E815A66D7A8ED467D44692D9DA81275D533592CB826656BBCF67F
+89FD3DA4A53DE256CBD06F7612848B2288E976A01352FFDD417505E5B97F19CA4E8FA3BED101
+64CD8AB3CB5305F3E0279B474594F2E1C915CB6B3E8E2A7358120BBAD2A3B2D2E199558CBFF7
+6BF4BEE99F3EECDA0BD7C0BC1D132142B7274878B2E653E33889926D5A6A25728964DAE20590
+F1E53C33941678EED838118842FE14F421254FDFB14A6CFBB04F02F582244EF0DEF80153AD9D
+21B2FAA95EAFF02137F478B8B3072BEE9539E8AA1050B29EBE4312636DA000E043888972ECE9
+95B6316883794727817AD23C253ED315E0199C0D4BBAFB88CB5FDBDB978526A3E2ACD9B14347
+46E856FEBF0F3827990BAA0E7BE9AF759930ED684D7096A14F9A615C322E923891787619F80F
+A08D0786DFCE88BC794F911E31B96D4B3519CE1A757FA47C2A3FD140CC16D338CDD237212BB4
+691D8FC2AADDB60A2C072AE0E7F9C00CA9BB7ABC46CC59878841E68783EB2FBF9DDAD5C6DFDD
+FA720CC52889C3FB350FF122A6C02F8EF8EAD218212BDB8E61B93E8736BF6B14828F47BBE949
+40708C5B40FF2DD68E2ED11065836C33252FF84AF4296A71E274099ABAB51C210B7AC3C3D533
+CB328246B0CBD32A6F69C334FBA87FC76B88579804D39F8029FA8EBBF0259B33F12E7C45DB13
+01FA1FAA91377DBF284BEFBFED3B9D5B7D70407D5997EBB50431A7280B6DEA61B9B090663B50
+5DA43B9DEAA25343F5D7167AE7F4810282BE0394E4B36C733AF5E31204C2A539AFEC75311018
+D4CDE08230CD713DCB0F7DFEEF153DED21DA3E46C1BAAE7C22285D383DC3BD1D96F786D1C444
+3424E310D7C3D46B7A6D84A43A8AEF51BB2EEA0614EAED6308E46C64B6006B75F21C805A363B
+5D5EEF527162FB86DD6F1BC51A28953B5E059201E02829C4984A6E0FEC9BE90E40826CEFD22F
+A7EB988033AE50C3132C3CBD4881D3E561D46DE04AFD4788A5EB64EB09E1C8282CF796A2305B
+66D8437F0555DA80E7BBB67C379ADEE0C345D9DFB4DF3D6DF75DD35F0412808AB4A77FC9B327
+8539F6D0C8031DB76287B7EF34C2A4574237FB35ED635E7EC4F220782D9934FA7C505F22013D
+5D20A363D66C3190A17A03F61B9E44C1411F68F6435D06871030D1BF3FA3C1C1C827B8DF8249
+B29411C39006F1E81A58667E0B9B59656E5F67FD0FE246791E9C3578AB2B9C9BE2EDE94B68E6
+5C86579F4A577A6C3A474DC9D24ED2F5E02FE5B83A105670BC4571508FEF80AFB27160B5A2A7
+6A6576712D542C93FF1FE503E5E129A85577452FBFE5E456F5D24A0B3CD3218EDDB5F73E883E
+53979E1429C4DF32772116BA7482906CE4ED29389FA68B3491845FFF6D333EDAF99D76904E45
+1762D3D8ACB70B923AE492C8CA5456106D874D1895E9272046D9422FF81EABA7A8F15F767849
+6C7B0D58F1DDB22597B137CF6E5BBF889B53502D97E4503EDD053C41EF961E0FAA8D0B2F0387
+84D47C790E40D8488B49D9451E8DE49592ECEDA64C6DD80916123C348BC81331C6CF3F29ACC9
+D07E2718E8A25D90139B5886EC6264853CEEE4B6DA9475D32679864027E4BB4342DF9AC0BD1C
+A08C8138A779944986791A62DF1C2903331918296FA754D96F53BF043D04EAEB7627F2863901
+10848CEE1CF2E2D04AD0B618F83D554856948F4FE7C8E5D13EFB6A0E5F7E3610A8258F00F808
+C1F4932C545E047BBB6377466D986607D17C7A262A6A7D87D931A491073C65C691FF8BDCDCFC
+859B8E029183B5CAF6228F6BF65CCB94471E5673F4E8AC4BF7F724C9069D7590A6E6F3C877DB
+42766FEC506068FE1A1B7ABA6EA04C20849BFBE18745621DE771B38BF907210241BF6E07DDE3
+2419EB87F987BA49A646A9EAEC8194D13F8EAE89EADC2010B7FEBBEE297F7A84EA329823349D
+0EA5A639514952679C7AC723244C61DD31D106779011DA488CAAADE06AF2E2E658BE0CF325AE
+79B2C917FA5C262022993ABB17198DAA595951E96C211B67897CFAC55E35427CA16FFF3C531C
+5F503B5DE720C0C688D95FE0EDA1D54D4E11FFDAD3A225A7C46448D1F2AF3BF9DC0C9D0BE10C
+EAB53820A8DFB0FA5BDCAFA31F6F0FA6A71D84CDD572B858976415A39FDA955429532C7EC088
+A61A55F042179993E25722CA2DB950DE988BE65949CBBF9FCC1B9D748E2190616F18D3957958
+E8334E37BCC847431E671026615623B1705E2E66E489217BF6A0CA7C1807F25C587D5257F843
+759023AD9824DB0997B0E77EC11A5935223AD1E1C7CB832149BADFBE4858E2E15D6EB37C401C
+152BC177CAA18A7F80BC246FA59AF489B5E5A8645491587701A387B381D71265B4D59817C028
+8446DFCBDE203D268F60DC5EE0702DDAF52775D16345B17559ABC10CACE2096C4C38C6ECD85D
+88303796FA774393D70BBD2C9F047EF17030FCE5DE99B86E63C767CB58CBE6126C3AE173A9DB
+C52CD1B5D65D70A70319D307D4A2B8411C53DCD6131AC3C0C005CE38CE96D9B15DBC21A12555
+B8BF25AE88A80A32273DA1CBF1F1BED926330195EC39E25B1879A743F77B1EEE61979DB1D38A
+080998F63A3FA9BCCC9D4ECA20AD7AF8685E778B6A69A456808BB1308F989435347D2FCC377E
+6C90465FD4BE1D2DDB7965D1B68A4ED00E08B88A8D2B4C581428E11D1E3C959B0574A98645B6
+7873460D07D34F3E047C65FAB7279EB24ECAD4A1FBB9157CF74228989A9DF1C1D2436075966C
+D10D84CF8044E5476E23858BADA387F9306A44BEA5E85E3C792378B98E38877F7E4E463CB42B
+2BA2B293980778BAE0FF70C6E60D7E1076238C0A74EBF7EB88B45B7640FB547272E4B03D166D
+5E61C34E2092B8D760D672E1D2444A37E58472523E4EB662E7FC7673ABD3407A9C52D895CA2E
+35268CEF7B7B34570F1751DE990AEA9FF081C263C8A4B125570F74590286E7D76BE286E870B4
+0B3765F3C78263B05BBF7E1F130497D4A7F7AB3BD3EA5B3A4AD82C16923D1A93258D68F74309
+88AEFEA49ECB5FD53BDC43AF89C2BF27D8C3F2E152C93AC60F1C7FAFCB9B7F799FF195D3E615
+9C95AF099D43D29E6BE83917231A31CF344427DBEBC8463AB4054D378B7CBC530D3FD253D3A6
+9BE363DB9B67B44224D56AEBBBAB0C66B2764984157F071397CC054BDB0522BDE61BC278F518
+40044B6F4407849AB68E5404AF50231643F923DF3CC5F416EF892241A9E5AE445BFFD891ADFE
+427469C8E7C6B550D47A9C77442F166D50E8220EB5D29D1A2A9EC810D770AE5C1A468EA57E92
+D97A5369CFE68E328985730D6141D23E8AAA0F759818BC2759E83E8FCA6D00314FF73BC11AA4
+32080686B3F228F7723031F50AB36993D4D984C348B35967856CBE4C62C150A5280955ABBA52
+04E0D84F44649D2ED9ADCDE1151B02713D58448BC541EC3E4FF151506B0C476B4B7D19AC936B
+8D7392ADEA338B41F91E64CBDED7D243EDAE76208415B9B959BB84CAED942BCFD4B92F4E5EB5
+8132AEFD3CFA0122FD475672BAB659B320230772F0413E2C568A13961452B675E147EC08864E
+2CAE1C9BED8E9A0A13CFFB1630D4EF9D5B05DC1DC310D963DA33D3E29FC9D0CE91DB257EB107
+BBB6E60FEFE505C8967B0034A96B5C9046DEF13AB3E93A48AA3CD6D35B3EEB7AA58580CDDD55
+3A8AFBF91B17745E364EED82D791F6A4428A4589029DB11B207FCF8052AC5B7EEEB56C1F7BEF
+716B9137D6355D2B6E0EE26B93F11D0F0F83515947F84DE7BBDC999F5423A53F3033307FE62C
+21C36E8E3AF912237DE0C9BCEF1679E78ADCDC42D8A5E3021033A0AE7AE0D2966D3FD30F8B56
+B26013CBA3FDF845E184A0E091DC17A5ED14C05CD787820F79BB674F220AF4A324A770746DEA
+CA11145995F651D8B8D6F56451F31CABF022E79321B42A35A65ADBFAF351EFC7A977C828F966
+D40CBB7B59089AE418BAC4929AA941DDD0D119D4317B9E19D6660E03966A7D573484F8437F9A
+F98D16995970D8F406EEE9AF27E729D2704EC871C6BD9C06541EBF11B98E8BF6700B8769FDE0
+ED0484B728A05D06D0E86241AB1A0C214C391133BBEFD6B15C89F34D77EA7700FA864046DB39
+49CEB6D13BF0047B6879A8EA774B9C8BC26C7630262225E91311C2C093E299B33AE78B5D5AED
+39E9C62EFA0E2957BEFC2AB67A3846AA5D27ACC99B6A6422D9C90D564E736771D216D0904536
+986573DD22CB3AC60346A4C8332472B2D8F7C0E6A7AA6003A6954B7F5C66D51E7767DA3AE06F
+8A3D161691F682715757471A392771872CAC03BE5010C7C71FC52AE83596234E01313F24E8A3
+8D232B9344E3AF185C005963C9E74FC76597D24902BDCB30A3634F46F248A6FF08F011571A79
+22AE598D6CFD5DC20095B2103F72D09D1918B765AD7BFBFD03A9C0F95681452007413C53C830
+C1DB02B66336DF334F3E4E2F7CCE7C8572A1BDEF36452FB3049508C029DA2EE1070097F2C727
+BFA40B31573E950A147E7F950080C8A9AF9456CA6DFECEAAF6FC1319870A3549A6AC00BA6F8A
+EE0151ACFADAE35ADB2C0257225AC4F59CD21273812CDCE31D6EF716B8B888AD40559BB01736
+3E8DDB9686A76EA618712C8721EFD4CBE1ABD2B77B1B1BF19FBE122A9D0F81CCC1731915918E
+F68488ED2F5F6538EC33CB143E4F9B4BA5A73D3A4B990AB1F1CC2BBA16A354BD4401403594F3
+52A76ED2B44B3DEB518D1463E6393B0417BA79038A5F780A5DC0AE275E1C97130B2DD51ECA4E
+26EC6FD1A35AFA5EE2A780F18E1648FE91F6C163BF6CDAE4E176DC8880F01B26A234C7C673E0
+83CE8763AB04A1651C5EC7950BAFB7FE02C7837DAB1B2FE0F9C2C9CEF2E698A249A08A9586E6
+C7C33FD71F43BD924D970ED67C7E0133816890D0F51E200DE5A0101B694D44A19825426FFFBA
+E22B3E28C5A33D6EA4A51396D69CA91479B2D23205B74D581EF27C8C56CAB2008D2BC95E7BB0
+80D7BF7559EC0F7FCB1C78543EBE0CFFA19C89AC3F1E7420863206639DD7DF622495AD004453
+ED2A83171A49BF88FE5D469C5F179E81E60AC6D8F851596814BF16B5642CAE0ACD1DC77B4880
+7F07B4FF9930E39581B96A9352C2666D66AE292480E677558E1B09DB49B892D8222AE45A9DB9
+2CD4BFE8C103BE198B992DEA07E5C92EEFDF508CF04D0CD49D13791F94FA13D168F589B4EF44
+3AD24D17BDDCDE98DE741580FEBA43C437871E87CE94D7DEB6B9E82FD578C9C9400B8C072257
+A1BB769CC935CB313CD847F2B262CD0F8DECD896248EC584F23D251E9C8E31DAA252BB54147D
+F0DC4FDE29B12EC68AA93F3459889970B8D1B5A0F1747A771C181FB303CC63844CBD80E4B521
+2681D3B43F5BC6F200803FFD34D56F7D2EECB7439945EB57853308D707CD127C95316F5C528F
+8E4E2A0CE2E85A303801F80E23B99F892926AB7EA3500E92DDF9DA90E4B3D0E0AAAF259FB424
+6CB8968C468FEBDA0B390231F39E989BD772DDF4B10D0C1671F2129F3A6071C8BC854DC78BE6
+1508E87A705E154A84B021F431BB7A464B02F32451BFAE15744EAAEADC79417AE6B468358955
+A993F80FE88D56DF31D2EF2D2C57A0E0651BDA19F77359ED59B6DFCD1BC0283FC7345D4040C4
+86FAE52F0B41E0DC1D8BC60D6D6D5B82D9E3D06D03B33AAD4ACBB84D54CED85B6C8BAD5EE4AF
+91442BC17C7EEB9BCC25318BB9D0EEAA203461DEE2262FAAE87A6DB296465025024BE97454D8
+CD01D476BE55081BB42FD509FE4F272510E5AB5B62C71D2DF7631D4157C05724EA13A135CBF0
+66DC44645D59F2319827C42128474BBB920093A11070408E987AAF15ECCCAF9ED7E050E2F1CB
+70E70E05CA2F76EC08BD3CA0FD94504862F08000B20930A58D3CC87C464313C0EF9958B6D31E
+3EE86879DC4922141F0342553BAECD158869C51DBF69F0EBAFABC1376FAF1C564B384A6283CE
+2A95DED0F011642AC66E8FB34DE6962E1963023F8AB90483B6548C574A8885F6C841400BB602
+C33E30D7BCE3B3B2A0362C2D32A25A8D7D73B5E84B7FE8EE556E20478816FE0177DF7C6CBBCB
+994AB8C6743CF7A89D672F402E174C6B7F3315D51870EA9118CA090F4CCC68A566A463D51928
+3F7DA5522058E4B0A92F8BADD87FC18F9AF4780F0AEB79BA798954FB57F880D9A7E950A7910E
+4E3F9DAA340EDE950B69879A0B711DF81112917E5A8B7E931E75D6C664E887F3F6C58F6979C4
+37D8DB70817852E4C483496D9823A799B19710B3B0CF3B1204FD81BD0A4EB1CBC4284312FDAB
+D2ABBD3D45CFC4A0B039B8BA975AFD201323FB949B5A3D690CFB24E003EFE01DF3727B194D82
+E0B95D874CEB4DE2D6F864E8BE17859A33E4F26DBF22C59FBBEF4CF411592141141032D86F9A
+651A1F76C33C55F66619DA688383143D856E5D44DD64364DFE9824A74B5CC1D2E29BDEC81E56
+13A1D336AD6ADF83519FD50531E3BBD935FA4E5619DB888AC69B77BB11638CD3C2144D01B4DB
+E7E4825C0B95CFEAAEC8B5B25A94222D4B3D265CC4E3034C9366856D7123E8FA1478EAD71794
+2B36B526A98D0E6360E312D5B7E5F215AAA996632F5CA0E10EA00AD34C1E097166475F34E078
+7532400ABE560A190C0DE8E7FA8165C742615F359E780AA017EC56ED82C6E4C018B73860A72A
+B49F1F137ABCF30F4F9354E193452A03B49F52FDAC58D3C7571342BC77D3C32B49340665E36F
+2F929C3892534FE6DA881179F8654826C26FF4EC63DAD1D497265D11DD5EA3AA4A88E0F168D4
+F701FB7BD854B2CF4DB842FF00F002C23F87F86A932018B2C71BBFE000F4FF456FC4DC0BE106
+EDBBE77DC6D3F144BFC52FCA00A6CFF17D954CC0D9DD1270BBB1BAD4882765882244216CA939
+E0DD9FFFADA36CC6BD40D2029EDAC77AE825F470704B30CA49FD4104B2EDB1C5DD1A585DA431
+A0A5A445497DC182C094F21B7C64CB67E4BF8A151204EBBA635DAFFD6EE9BBF0EFFC4C2F6E7A
+E800ABD4CF7B4BDE8F8B45CFC1501E1F7A7F8C942BF820BABCF4860922DAF7F0E7D690E2834D
+2E30AF7D09434B0111278452B88EF44D5EF8D91DE2A7AABD8246354CC7827B4D32A224508A4E
+D6783C2AB892B047A206CD99B23BAF3BD0C633CD0113F6079ED17E0E7D2DB9252FFF80066FC0
+3A2B6629E310C736F2AF128909BAE7A166CAE629494999F16B0D9040F15CD16561A3153AF664
+B13BB923B90CE0F09BBE93CEA4C621F713756F358276FC72EA3B19363C3C9EBAD5D599F4C5CE
+9F1A8D7C75605C0916ACA60F241F9A9FBF3D6665D75D6263BE9C9139BC61C31D4F7C2CE47E13
+7AFC13708294A9E27A86666A37F17386599ACE191C43E41D406D732701B99A00A79B99694D3C
+2D2B6939CB4054C00C0F2F09A849AE3E372115A5713CEB165C9BD209EE3DFEFA82B1BC1CAC03
+8FB692571E0D5D044DBFDBA07F7D199902CB79FC719A31EE2E4AD7F1D50FCAA7C3E84B55A080
+D9DA54E3EA5408DD50FADD87CFD923F699DA9EE4AEE91525E4347A0A26002B97F324EB716D4A
+12D0BD7324E2F881F61406E2947D65A112A32B5AE17F06806D174C08D306D68774129F340466
+53AFD9D38FC13069B3ECE8E68ABCC734AD4213801E1641B5B990615C7BAFADD52AFDEEE145C2
+2574847D0A21D37B61E01C70F488E91F85A07E633179951B5386FD12D581D76390EC478148B0
+D819BF2E090B2A40708257FA3A6E02CD3F37B1D785434A7BF98EDFE85A6DE1CCC52D55CEFA41
+F81BA9F5FEEC35967F2D82FA1B1904F9D50072A4A2EC937148FE1BA22086C11A162BEFF80ED0
+C80AF897A1D2BF1E84E4193EE94324C2B06F317E17DE934578E62ADC63E54774CF1C9D162B33
+6311E8AF5C5478FA1E40102EFD17ED7D83C8F55694E7CC531144156460D7FE4754766E5816CD
+016A70F38EC92A3A54899278985CB868A7E213B9191FFE6D1B368CD50C766F0A75EF883C49CA
+41B0476EC297A676C09617914DB7CEC4AFE8A0F4A956C39C73087064D991828C5D92CF811E6D
+1DCC9165AA29B54000F0698B9DE7744D081ECADC30F7E9630384FD7D8D44B348536777E0EEF1
+3B52EDB21778E4219D26548B673681718A2F8DD08677AE6AE9B0724F2B7199D128447CEECBA5
+B086BDAF71873B5EBCB73B91E107C69E2988F5CF17303677416B79DDAD040E07D354562474E3
+0E9E76D675A00AE0ED24002E4D55764BC91397ADDD1369C308176147C1DD0585ADF03D5FFCF2
+F41A279349E18BAF53C97BA1693E8C41AC05C17739DDC7F0029E1C9448C2497E90E2A298E284
+77B6AD2897E4BE7A4F9F26A64A2A068E0D3DEBE2075024ACEE796FA218EE80C54635592BA855
+0504A100940BDC6B93AB8F327AD57E0975532B4764F641C389E5AC73459EACC95B62AAE4198E
+0198EC9E7E0D3583E000BFF13B0A04B10EA2579E77DDE7D2641BB738A17B169A96EE96FD6BEE
+C960704D1B3619B11AD2EC17133A638809CC4B2A0CECE459518250FAD46E66FD2CF14681250D
+94C0BA32EF9D0354EC9C5E232993418BE49CCB016F56EC3088080D9B49021CE762C3D28DA82D
+C6062623DCE857C701A5E3CC2325B4F4F05AB5CB02395E487B56F961D894722747A00C6B0F29
+FF35DF2C983454AEB8E75C8A3F0747DB78315EF273BC330C27BE545CFBF5BB46E18DA81EAD24
+7CBAF56005088A9B2C7F31B870EC5CC8E6FB234764091E7F57F282CEBDA7306158FF93F49FF0
+9031EF7EE383931360D878397281D7547719DF3384D6BF59A794EDA7867D8AC4E100F629E12C
+CF17D6AED1C6EB469F34AC6DA65748C108E95860EE4930114561C41F8BED9433636FA317E13E
+64854AC20AD41EA757BE07701D25B307A6D31BEF19561874256998A20C9B9E64CF3094E56CE0
+724C6E371279FBD1A4F561B351DACD49AFE5FEF3A0F78597BB60501C14D03C4E8234075C0728
+36042491448815FD92DAF7BCCE928C15DDA6F9AF1DFAC3212C1520397B50B3F8041728D4453B
+557D35D0326C4B1B5A5D5597E3B570B499C7CB4A70D3ED07B25F555298A176892FB3BC0CB7F9
+938CC74D5DCC5BC3DBC069F72BDA550BEE55C2317E2714F6E638B23188E890A68FE50F4C42F8
+8A00FD372F5C1EDADC0D689830B03AA40700921E0028948632365E207CDC18EB85AD4DF5F208
+BB868B26625C69ECD06E3B37AFCEB9568D7D1EB7933C037E6E6EA8D96AC3F9B8959D4254DE25
+90B2D5A5A182C36BC8ECDA974F6B1D23D82024A965B2E24A756EF04802C9116F60152047D477
+3CC7E40D8DCDD32D2990C5493F372FB499B74649261C77062B73337AFC3FCF51192D5317D70D
+6BB0EDF7522120588E797E87366D753781D8ABF9C401C5B31B2E0327BE199894F8B86DD6E6D0
+5C43B5B6AA0311806AD8E78B1C1ED16D2CE04E1EFDF37443509430A71CED5A78DDC0AF38F745
+C70F23ACEEF34D042452B96C6FFCBCB00127CCE2AED99E5663D8C4F1E53DEBB34D82F354C5EB
+AFB6DD0D58F6773239F0B28DE378A3B348C22C70F56C482FD6B05C9FE406B67B40DC3555BF19
+026BEF4F9A8340EF317D7048F827D19D39862F0EE656EEF75E33093B020B729203D35168C198
+7B755CF81A2161FFE86AF5B476B8AB7FED510BBE5A15BC712B7D78364A8ECFC8D5C50FFA2047
+D3B94496A7C69B3F721C67DD8DDDD0C0883994DACDCBFEA6CCB352B029CEE13C2112B3C55C7F
+D1998D193008090EBE3A49CFB52723197390A1CF2EB419402A0D55B8071192C0D3EA740A6DA8
+DE7F1255BE8B78371731F78D0153819B9417662C43CEA058176C9F93B48E21129015AB2BE566
+E40E1FD01B56222C07E2DD9F8D18343BD778EC4D31035E73AF36635B3B3DFCC358A953651E34
+814A209802F6AE860011A48B94DF7FF2B69D91AA4312F60B3A095F512C1926B5D075B6F39594
+5BBEEB60AEC7DC50FF235AAF1CB0C45957EECAB42789EDABE8CF7AD14EF84613DFD43189A664
+72342E85260B0D53038035184379E11822B6F0FE10824630C2479F07447CBA11E49F0A27B4F0
+BFAB9261593FE6A8FC3B5B9835E60F3CB3282DDF0553D00A08031913BA73EA6BE91F5F89F80F
+5432A86C3C982EBF203AC33C9A8051EE677890EDB22FB9F6E30E65B73A159539FADCF57C53C5
+094C722F563756B69F0074BC8A3E53807888DC0EDE2BEACC9BC9D7F35BDA3F49A7C28461FF99
+8F466ABD69DC976CE81469E4055DA48CB1F23EE8B13B2EEC14E8C68EAE3F69CC937808B5BB84
+0847F92B275A90AC86F9101FA6B0DF3698D1664D7C79058486D258C271E867878B8E16AEC6FF
+F29F9F34F3AA1353694BE5AD123C088D20D662D2235E2D6E35443008216097F732882C7EC502
+7B37444373766C5D9F28062E4FAA5BC91B9B13CC54348C6781501DDACBD3A1D2850604F8E3FF
+DCCD639ECD9C94FEA58BF0E94B0914BB908CD3D9ED63B303CAC191AE0559292F6B3BCD2120F5
+50C07BF2F150996E272F81F07A4C92EC61B7E64A4B1044F5D02B558C224DCCF1565628383DBB
+E90EF8795CB27D8E860B5BC8ED8385044C4CEF02BFD42C61C21A2F3FDAC0DC52F7B891CF58A3
+8D6D1C9D7F16A9E74BA046D2A31A1E1164029F78B52E543DBAAFD1A962793F9580E2491778B1
+1C0D322888C0DE763CA2D8B450C1F581B45B0541375CAD8717977734014735502F6A3A08546F
+E4199C12DFCAD3230376EB850E699A185BBB984739102154B5AAEF6DEAE24866A161EC8736F4
+46C9FA9DAE18579178C80A5552CEC076B27F09E23ECA68150EE7A31C6C558E6316B0967BA4DA
+9A41B83AD557BD366272D5EE64852A4A472EA17B4847D81EE037AE14B97C8784E0F18E938FBF
+28C22F2861E2564CEACE610AF634D99A5135FF9257A42F544939BCEE157E19F61072B734F0F1
+C8199F92090B579E33852AB752E9A08C3DE0BA02E89BD63BA02ED24FB2826A6AE3E13373B38A
+3A9830CC7AB674FB1217F7E8C4B5D60461616AFC2E72226FA66AFA2E52382190EB366F9EE999
+E0C82DCC5A76E7EAC0F2DC751244717483D7218E69424E60B99AAAA4B438510D4071F9ADA47B
+DC74D54087858FD98BADE79B49A6538FA2811923AB5652BC7DD425AC6A36A39666F7E6501A2A
+90885F510C797F9E87A7B323ECCE8A6E6A950A32120F9B17273FB84807AAA12ACD4E74D512C8
+B0EF6C5C0CCB52CD52FB4F94129188688B5BC26BEB3F3230558AE7AE1A7285C99BA3020BD1E5
+E4E0EFCB6FFC688CE07FE45CAAAF9A4417B027AE633C80C9D481B451858CE03C2B5E362277D6
+02B02EE792D2BF7790A8D74C811E005B77F31B78488EC060CC78CEDA644F7DFBF69FF3F5A314
+C899212F67A8BD5FEDDF543489A7EDE6E1149E214D0E3A1BB1F809C823A569096DFC0EEC9DBB
+693CBD2F48F732ACCFCA8AF5C0C65A1D6C33F758E982B6F40653A287980FB6B2B59ED7576EE2
+ECABF8B73675B35E1047A9C9EF565D6297AC4B5C79981EB59FAA9902E49B03CC590E86D1F188
+A7FF89FFDECA92D1E153AD3CCC014167ACED079E68AF4153E19AED5EB8289AB5D9AF8DE7285C
+0FABC48AA30E225B184BAA45E077C587F342ED1C3445C9730FC73DC29C70B4D95FF7024120BF
+BE4D2DEFF83512745FB7787EBFD86C251CD384047EE755FA5EFA46DA5D90EC423C9CBE18FB1C
+FE0F19E6F17883267A2A4F0AE7B20CE0F487471E3E0A1DA05219E3CAC0A6D50ACDD33E92F020
+FE2B0FD693A624EB5475CBB448BF0A430D61830B2702C73988B32BBBE55C747FE951F18B65EE
+AE41D17070C0F64AA5F7761544ABDF3892CDEE824571D87871030A2C7E75248193BF1A933AB3
+C389727EDB22529C1FA19422259B699E344A5FC21DCA13AF2DF4882FE69BDC52B5C1497B6397
+4FB094B55745231B4655536FFDA23A85989700F89C4D8EFF5D8450CAB45342DA446325A97BDB
+F4F61B20F5C5D98973685256E8C7E3D6375B586F051FB4DB2F266FB81A1E58A1E57AE4DC2538
+2F4FDAAD9E90DFE1C177D662321C8A741F9DFF26A965DBE59C5697F3CFBDFF0B3BC6C6AD433C
+EADFDB48BDE662B56369280DE596A12BF14340B80DDD7E51F78ADAFDB607D7EDA8114CA43CBD
+329D6958CC6400FFB32982CE9757F2114888B7A1E7748848C7CEC66B47D84A4423E0DEF5A7B9
+41EE67B61B0D58B81AEE40E76A6BACB2BABCA8CB6EA41713E3E73B1EFE0E1F420A4D6394CFEC
+4D486B66D6AD7E008C32653EF7759E03A3102723E80BA273F14A2A184F6929F61BB9B799E6A8
+5BA5C308F1293E47E7FEA53D7B64E377A95AF58431377966F7AB43EE0770591917359F0056D6
+1220A973703644B6CE37E36AF597F26165D6FA044264636B819D2A4B303C5C027162EF450C67
+571731E14D2613C64521F3C3ECCF41C160816DF99F79BE24A6CB5F3ACA9F6E153BDF47994AA5
+91EF9B6716853014255F79B348102D559643E71A38BE93CCFAAD1C27A7C85F0EAFC650EB6A97
+E6D020C20842D760F2C8C1973E4689B29BBD2AEF53BC192AD97DCFD72B423427C61069A02533
+C75994F95DF2CBD5C36D534619BC5194AD45E029DA3AC44B6876823170AD02E80322530188DE
+D08F059200DE33B37079FFB9C4EB8916518699FFB95473FD794D81B04CDDEC62927753DA0937
+C4F4B040BA9713623174856243665936C076A6837B034B9377E7CB76906DDB6D5F863BB4518A
+EE11F9C8DFF3E01BA0031C5A93F6F9C4D600FB7AAFD2552E68B53AB3A80719EB3D3353512B27
+4B0C919CC45FDEB8818B0B0F3B68FED2F60842AEBE5E45C917A52A6124C52B8F2115763D2D59
+32C77E0587B65CB6EB11D906915F2169F442F8B3876FBB061AE215999A02826F50DA330EEEB4
+B8954F7B01D94696FD24A949707ECF7DD0743E264E3AB60075058AB7BD2DB0FA7D16366B76A7
+C6312F9881F8B78455B839C3583CBACC4FFB5C6F3A71411E94EFFB61CFA185A739DD89A97200
+6CBAB68E2CBBC1ACC9E615C478542FD0CBF9A0E67389E1FF48AADE08E527A5015336B7694F28
+DA4921066327F71E0F4872AF8E991271C5E943912368FFE9C8CE3C87C9ECD584B24057B40493
+2A40D5FF1A4F58304E2534B4FA3DD0965DD2ECDE9A1ED6B9DF3BA5029FD82DBDC45E00552A07
+8CC6B4C8BB8CA371FA347F9157506723A891CBC45709F2DAFA80546B87DA9BEF73C7D237CA28
+9EA2D7944109466AF7040D55A4C9BC7D9DD87BB9E24FEFED827B6B9A9C5CDA9719A86F112953
+7A878A141301019E7FF1364607AFA76FCDBE192C51406BFAAABC6945BDBFB791649A9B66C089
+C94A97DFAB07CB65EC96545D00909DE84369A45BFC5DEFD2CF31C4EF43103DE425BC32FF3D24
+FDC0B87FCC91E594A4B3105E7D35CA227C779159C38347A19CC792B45F7728596F1E7606E912
+23B7005F5CFD6D5085F2CA33C3F60A08381A05DD70F851122C7051CEEB0B0A347BCB3C267667
+DCD66312E4837327B5A10E8218987B308CE4E6CC2120CB0288079434AA9C7023EA1A2F83A238
+96541951712FAACCFDBF030AC4A11008E0DF0D4D31442F5AFA5CA4E7CF0567EA2CBCC1B5CBAD
+B3A96809C61222CAB6A5F40AB0B0365277604C78993E72DF89D24EBCAC37CCA52327A094512D
+FE805526BAB27CC28C54919B00CF80648D3128FDFEC4D75075397A2AE9110B540CECFFBB7D0E
+B7D16918B665A09BB237961EAA35BCB74766355AD322FACD53FD15D837EC22057994E36BC2DD
+B9A7FD782D1887B9E4FD8CE2905E134409408CC4D6F7F52ED71E418E9DA484DC742E93798285
+9FCEE98196F6C9A74D61ED49EEDC35775D759744AC9C7B0AE822B3ABCC2491C5FA08F2118472
+FAD31D279C1DB66420D6EF048332CBF8DFF8D23365A21D937CF2D6359ACFBCCD4395B91393E8
+F46A6EBE39FB518104FB9C9C06624ED523C52B3EE930C68E48C75AA7564E9EFE4FACD1823D0A
+456B9D05E4CE1676FCED6A06CABECE7B28808FE9C39170D7240A0DB0888A27B3AA0BAF65F5CF
+EA8033728969073F76EF6AF80E693B563064A0257F9B06E1B4FADD5531452B33C7718B6B0474
+39A8B4B6C23683254A70BFE71465E9D8BDF8BE4FBEB81C815FABE967704C6CA69DCE1253DD02
+6CB66773E30F0437C325BFDB3E492489D5F05EBC12A96B16F191F3777F42A884577809D9294F
+273E81DA495428075F82DADFF5C3D769103B4F2FFA0D4EFEEF35FDF060438B0DA75CB2783439
+D9E213420389F6B0D87BB24409E75FF522421E019B727CF7B458A3FC59FE06BEB34BABFEFAAF
+9E5EC723945F9921D55978EF0E80C12F6BF7A458BFBE57069B049A34F3988A276F3D9671791B
+19D36456EF3F8702F12AD65BEAB9A68702132B719466ADDC8A7717E458E83488873320704A8A
+6A49D148675060915F93C7FE7D94810D9AB4F0BFD103EAEB3F5C23D371FB9F45F12295699E04
+30C7AF1FB76B9EF2F567AF729A640CE18FF94BB33A356F8685486770FE6286FFE718C9CEEFD2
+8917759667816EF1AE5107B18E16702E4A74B0D2F3F970E6419B0EA3AEBDF3D6093C33AEA645
+13ABB2F30122FA7E54B6F1AB31D21411A318D553E937E38C601FEAD0FF4AB6DBE46564AF51B4
+C6062BACDE2E6F8A832C4A927B5DF081B378D65DAD239FADC2F6CB28DFDCFC1FF4AD9A33BF66
+4C8EFC5786AE4D377F63ADBE5348FEF187A22B594CB75D8997F75364FD5AD8000214069CB258
+64B1CB3FF5920C84C24E6110E83FCD84ACFBE721C4339D12DAB0E1BDD55200AD517922CE8ABC
+4CBB102BE5EB135FF9F300EDFC3E9973D39AD42F99B63130982F3D36807A86FC53F787126185
+87524EE15BA2F62C76C333CB9676CE92BFC7E316BB2D797A3242E7AF3F9CBB5A889E1783CFD3
+EE74DA113D732969F684192C2D3E6937C37E45DB3B145FD337F59E6F73488806C9512BCF09E7
+8CB7EFC1012B0CF45BF7D4170FA7D64F3326E2293B9C99353C489D935AA442523BD1E19461A6
+1BE62B7DEA55A3CA98A77994DF5BE543EEFA6C6C4F09DCA7E0909715ABC776EBFB2D11BF1BBD
+611D73DD7A482586141B34689B78614C0CA3CDD84419B0A8301C3F443E32C6A4FE48CA82E194
+10133FDDCC075F2CB35D4EE79CA0445A5F4039B64A193D7729C04855A6C1EA49E3433534BB1C
+A573565A7FF0C2667B84C0E341AEA64DB7F09E250FE056C94ACB17CC259038124C22E3C7B790
+07EBFBFD4ECAABEB16847B3ECC389AE626D8173F9DFAA8A30BB90C51B10013BE0494D4EE5E01
+503D175C71DF17FDA410E4147E057D264D80BA710470BBDEB2586BD0D067C50153D030C1F9B4
+49BC7B043FB72E6DA5F4706A6BFBD1ADB647935DB7CE7B32E94744E722F0C2F0E2793AB987D3
+AEB7E1447FE554A08586FFB95AD172FE17BCC391CF8A685E2DD7886DACE6BD000FD9EB6773BE
+D9CC8C6A1DF5AD71496AE894DE7AD2B9282F765E6B62B84CBBEF09FD50DFDDA4D1CD214B4183
+2867C1A9B8A6FBAAE2E195FDC6FAB4846D718E703F05C1C6CACBAB43B7A0C2A869C538955AEA
+B23EFCDDE65AE1F68FFD1F949B1255039CD7BD5108CA7D0DD46766E298847BD895DA8A8EB5C9
+1765D00CCAD4E995E823C1F6B8709E1C02788EB86A1DCC716F9F266E106F1DB40F58223E40EF
+D3BA9D5735BDB896A62C0532980E6C3A6403853D6BDE51085F3272115FC932ACA8AD50714F71
+E07001BDA30A4745AC6F660DF69C8E60AB716120548A51A294DC12F15B1823EC1A9F878219BB
+89B8D73A2F5BE60FA65821B9548953FE8FBAD23DC0F3DEB62DA78AEBFF91B9FE078CE6967F48
+224100C740AEC1B61AC9ACCB469DB757BA5A8622828F6DA0798D617580A4E82101D72C1690AA
+A54B16C9DE189619E483FB1F0CB5AA8EECB80EF87227A5D1D447C44FBB5E544EA6ABA872D742
+F8B6561EDFDC7FF321A9811D867583275FB7D64E7EF9B8635CA874E68A23C7246E00EBEDBE1A
+301E5CBBEC6BC9EF7F4835E882F8449EB54B3215F8E637A0AD4984FD94AA125263584A94FE64
+0EBC08FB9285D3A09C125F23165FC861C9FA28C3C317B27A5E91044C7E92A17DE34567D3F2B3
+39899EFC9F6481F1C102747326180C4E44F46F5F216EFA7BC42AAF603914DB49BE664E049F8C
+D8825743A695F97D537D407717A00FA7B428BFD9F1578E6358D5CE70664699A142AD54D61DB6
+8E38314642881E3574A3955EA75E24272F66233173C2837C3CEF43F8D9005E229B2998C41FD7
+DF8AD7B37F506749F566CA1B8B2C6641ADC478FD064A01A40C1F2AD167AD245DF7638FCCBCBA
+28F7C838D4092463798F1484995829DAD3E349AE4FC9E1CCF7AA124085E38870A6FCE3B934DA
+A1D76A089B7C76894231A9696D97F81F4281C13A7A2FCEB4CB01BC97A5465E5B8DA52EB81281
+AA6642771AA3A71DDE64F6822EEDA1C0049BED704666A0ACD2124DEA40AABF7F094E2E0B5D89
+92FDBF1E997A1284C7DFCA7D00CAFB0315D9CB1D08065B0A1F854439EC8B823DB4771F5967F5
+92C96B7F5D386ABDF7EBF17B80A404AA0A52B88393B9E4A786B2786AB21B5BC1D0BD1E64F79A
+302FDD33B553CEE84B1201A7A7916468456785CF4F8C55267D1E21440C517C87EBE61F21A203
+C8727FA15FED6D48A703C291980F3A789816168336C18787651420188064B75FFEE401A85773
+CDA4C4F957B2957F7B76EED3B2159F5A3EEAD725889C8265F58C43005EDD5284B418E04FCCC5
+A6C1329816E95F278FF6DA40C5D73568C5808721734508157CC8E23F2C25171F2E2EC0BC0D9C
+363255A4EC0EB4FDB11642A96D598D0E1A82BF2DBBB97EF226A8D00DB5097A89C10B3955BCFE
+6FDA37BA4FC9E9E9097C774146ED0CEB61A8018E464A809738A2D85D518936FDE5977943350D
+C642F458EECFC8B744830D04A2A65AA12FDE497DC181DC2564A7F137986C594D540129D4D176
+9D3E7E241EE8CAF4A901E7FF24F70855D020539125F45EC99CA447723D1DEE38C146D7625E3E
+81167A4D8054976FCA5A7396FC74DA7DB6CDC5EDFECCDD3B07117A96BBC883AB74A79E4EF382
+082B469BE06A44B16B35E551A92E4E714F2DDE08E109D93D1B333B487B7B323564922D9D8F18
+7F440BFEC0D8F2D70A1B0BE46AB21B5B8B43E0C5E9CD0093EF6BE6476F47F9E412799275D454
+DE125751DDDDE43E3A5A698682D0AE0C77DA60C64A3914A28312A5D3EB07700A8ECBA1D2D24A
+110F0E9A68FA203458A51BC1BFA6BBB1298362270979B1661FC20237BEEB75B5E1AAF8B66CFF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMR7
+%!PS-AdobeFont-1.1: CMR7 1.0
+%%CreationDate: 1991 Aug 20 16:39:21
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR7) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR7 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-27 -250 1122 750}readonly def
+/UniqueID 5000790 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACDD6500ABDA5ED9835F6A016CFC8F00B6C052ED76A
+87856B50F4D80DFAEB508C97F8281F3F88B17E4D3B90C0F65EC379791AACDC162A66CBBC5BE2
+F53AAD8DE72DD113B55A022FBFEE658CB95F5BB32BA0357B5E050FDDF264A07470BEF1C52119
+B6FBD5C77EBED964AC5A2BBEC9D8B3E48AE5BB003A63D545774B922B9D5FF6B0066ECE43645A
+131879B032137D6D823385FE55F3402D557FD3B448685940729E6E22F4BE0E08C6505CBA868F
+795093F556B64B808DD710EB936D3AC83E5783B5F7E56D363A59A026A5619A357D21C4E77BEA
+121EB24B09027D1AAD93158EDF912940E91CD2F17922B358858946447773730BB19AF9E70453
+E1B78D5EDC123B273A979891D6D5E624F4A388F3897E13B045E34B4EE2F5E4FC5E996D354964
+0010C671DE14D18B0B3CD300E57DAC0322E59BFBF7B29422230870F5897FCFAAD4B50C7C1C58
+EDCD119218163D6F6E5625CCB882DB7B6D09A1586508E8CB642A11C29A46915E4A96E282079C
+B21922C1C2E360B487A45302FD22EC8C5FAB63E54B5E844D4B17CA2FFF37C69C366DD72AD029
+22C14C0932F65ED03E4219C117962EDBAD2DCDEAA9C10CE8AF38A4AE52E2B377245B0BE19A77
+D6C936E7530CC4D0B78D0CC4A92698FA2870FA54F2D8503E2D17B3D52FB2FEBB09F2B2AF0C2A
+1892039EBE19A690098799A858E3D39631BD6925A154D161DF3918074ADA6BD52BADDD0ADC3F
+07E2D9F15E27CBF7FE8B98C407205C811121FA91E059F2F99322FED63F359AC9DA97AEC383F0
+67F23E5DE33151E80F0A88AB50FE8FDAE4A5DE93C1AE2FDCA06150B37246140C0E87CB2325A6
+0D2349162AE3AC93144EEE1E665A1289105318FDFE86B6E76251CB25ADC967D3D0B97FE5E279
+E1161736AB22B4CA510B964342383A840DEFD38F96A7280E6AC134E48D740607FF2E7804164A
+16D47735864DB8456CBE4233242EB3B447F7AD444DC16CFB69AB1E515B3C3579F0E847488107
+99D7F2833DB6E76F6AD8C924532F8F5AFBCFD939544BB7DA501D8511E37090F3A56D06FBC17A
+49C373426BC6D94E829A8CBFFF9A2502C915E2823AEAE70E39F00BA99F8E6094A024E3C48503
+2A061769D653CDB17A06D8EC2F407C4B9217671851529647D0B9F261E39564C79FA0D79AA7CA
+F3D08556C66F08EDABC27870CAFC00F0F1828E93929116DEA5F038FBF92837E804DC9CAA7EC9
+D967715C97C6D5770B5913C4513DD239F55EDB3D6E270E8D826F6B4D0E7192BF8A1200475AC8
+E1A30A8F6B7428C8D321F93421F8A2F707548CB12C6963A2CA8C47FD7FCC6C4FE8CBB31985A8
+9A0D0617119A892A61272ED8E264418418F2DFE0F5CE71FDF732F0DBE1DDCBCE2A7B6C2068D1
+EB733FFEDB0EF64F9BAD513D3267870E0E90147C6B4BB9F60F99074CE5675F7C4FE9A4735BE7
+E6D1081203DEE5A7DF96D68B2AAC736DF07BDD5BF994EC28EBE13D2ED5FF9EA89FC822339AA4
+5DFE008523F617DAA3DB055EC593372FC2752BE8FF2FD825B13BF7A2FE7A0FBA28212C389C62
+B64E9D156842356743272461B4B56B9FD5BB19AF45607E6E3424455A2ABBF21ECE6E2EAC5849
+9533299F5A70391C4B7E9E95AC00A7593334FF183B9515F642EA934DAE6FB630EDED6B80389F
+70ED5B3B96EC7C116B1124D4B6C90FE571E0A1339C714126128DBA4CAF5FC2C035579774D403
+AB3BFDC134145AD2FC303F8C1FD5ECBBE201B8C93DC26497335822455921DD3B07853CE5B859
+36F54745B3CF0AD0523D83B16C132E600FD7DC81B585E769207A4949ED024372D59254EB97AD
+F5990992CE479506FBE4A8BAF5B46C8FC13C7C0CC5270D37ED08FCADAE4AF27B0E64080FACF0
+558C85048A599D567054DFB290683577296CF1613299E7354B90C2EB4512E05B3350F681BF64
+12C688BB05C110110932935913B5F888C20546BD51E414DC04255FB51EC37CD47E975F97267F
+F78598952239F401E8704A903D9C8D7B3E72426FF13CDA6D912A4BAEBF04E9C2186290BD83D1
+040CF238D04CCE1A1D177529EB8A27731C81393BB96D0858277AD5D0AE1935F89638D528B1B9
+493532D7C81EA6020D0AAEDC98CC93F644EA5B5D134B8CD94A5E46B883E1F54A7A098F230C43
+7B71049C0B2CA37B72915638F7088666438DB22AAAAFB84590BD7EBE4AA544506E19E547F3CA
+E50348674B3CA185B542FBFB2594A687814F0C330BED938D482F6D55DB7746AF7D052BEAA978
+2E812369AB4AE39F0A9890DD75B6159731898692B986063985AFAFD8CA08714BD415180ED6AF
+DDE8D5719734C74A055FE635DB9B8908488EF1481D72A90C9E99614F973B243AE426DC24C4E8
+A9A12D6D5E73FBA4EAE1BA66CC5B5B54357095A72C84C4E5ACC4D90038BEEEEB23E058079B32
+05C0C4E0AFC015C650C4F4EB4578BF6DADC04E9228F5C304B2433F8D92FCCAFEDE671F2F1921
+8D070E622F0F5A6F3BD95BCE78DDF81FAC393757517FE2E9C02B025B151541060B87C1844B3B
+C754BBD0C9F9255A9FEB28B14AFD3B71BD0A916CA17957E3B78539480868375EA6ED93BDA275
+D793344BDE7E59DDA118414AD315BC177937E056EE85E41C94C370C5F5B8CC34D334A6085544
+A3A2C0AC9245A3AD03C278B39ABE17F945E0AFABEA8F9551460C19B7E667DBF2BBDE697AE880
+2196EA5205142720E966449D85FB59B9F711ECAEAEC9103D383F58EBD19E77837C42BC90E44F
+0397E073656282F8359362FFD450FA089C6911577705EFCF9537DCB916B7EFB30B4055A6DDB5
+03E2983D1BD53482600907D9160FAD04128F4DC6343242E0F33C22286E6C91819F2E760A1788
+6917A12E6346794AB66BFCF02043371E13D3F355A20C583E484C94BD407DC2266529CC993243
+D7708C22C4EE4EB9DC2AE1228961E6605299201CE90B1B0547B103C4854E186492F99623B8B2
+5264C6FEB01C3D9E86B2BF8DF607A5CB944FCFB174C233D843793E87801AAFD289B7FBA2E2D7
+0E3E08B121A872333FD4064A3BEFA3FC9DB8382F0286852E322CE17D6FB4B31858AAEAD12CBA
+FF2BE948CF19C1BB140114AE65D26101457B1CD95D1C9347528B09CEF9229913D349B5FF5F51
+869A7E7D929B82F9736797F4C49DF52B2BB98BD87BC5483ADF1C1F620F70BBAEA51D554A1664
+376C9FEAC4470E145C1138F27D16CF6C325A0A44C53A0ADEACB28CAFEF2A5A09FDB2968BB229
+16F47193AB3504E23F103A993D67D48F2EFF36C306FACE6870C0216091A42531FB07605C0DFB
+554E46660EB27A8503442812EA6AAE3D326A4F9EC58B6C732CCE096DD512A8BB8A8FA7CE09DE
+D476B24EDECD9E39F24E0A30BE0C7F0DE109CD0E66196F3D55BA8298C569C9FC1D36FED89E1D
+ACDCDD6A5E3E92D5201584982451C378F34EFA407B65F27235CDC570BB7965375902CC5E02C2
+354145FF97AC9278BFC4191A286BC58CF9351220C57FC9C4CB450AE57D46C2169999973EC040
+53F53FCBAB1681B17D6049F0F0786AEBB41B00C8CC615EB6A5FF5929283A93D22E28050D0D02
+BCD0BD18818ED6836CDDA8DCA69093E03658D26EF757319CB1E738D7AC4BE9EB6D1356D9B34B
+777E4FF4F2459288500E8564EA13633EAD85E614DD9CCA149CADE40F8D1DE3EAC49B16F9D954
+953C19C66334B456260CB46C84CDD7D098D39E90920DAEC6D7A4523E54F6229231F5B5935B4B
+BE67A3AB87C2C8C2E539376665FDA5E14AE5F6EC57D1340527026C7B73B99F13E7DD22FAA6CE
+A155B79CBE80733A40E24B62A1FB88FDB4154283B8C5C377ED6FF43C975A01366BE13B9A1ECE
+A1954C62EBF209D4A0761C6D7FF6F1BCD1196E4080030EB2A8C4DAF3C941F3CD5FDB6EE95FC9
+0824F9048296C56B3F787218F3D546BC2AFB2B2483E1ADDD112B7C892FD4BA8B158B579098EB
+B44BEFB1B312E0F42F08BF77B43B438A231C1110A56F89BB1E36CE90F5A5A69138B7A8D840EF
+ABBD0C63E459021227F62539C056E90C377C9563D1BAA4168EA5AABCDA5DED1BD8E58DAEC21E
+20E651E0B783BF605DDF8F786928F7DDB085AF660EC41C26EB4BB70B6071F5F63D7427E3D54A
+05F28178EA6A1C00EF8868D1FA78093A91D3E4BDCB4A40C814501456216D7D164C7A82B4BB5A
+16220F7BBF07B9D11AFBDE09CAAB3FDBB6203C667EF450B644B7E536B1C80BAFB4B5E5295B74
+7A08C4E843DFFE087DC105C9BDD9052BC2D86BEC218F9D49E2CB9618D9D4A3422F6849CCD5B2
+41C0D0115DA98661ACFE49E8A8CEBE1ABD00E6662A2D8A9C0FF1A6808BB04D5E46467904C168
+C65B7DBDD1A0B5456AEEA445CB22C77BF3F7350B13B4E2423CD11A84AB6834C1613B09BD7984
+23F2249B32EC8290D679D14D3E0935AB5CB188D4F845ACFF621EE3E0206E6CCF2AE120114496
+636F297929EA214D6416E639B5FF5B188F38C62FF67C969E3FC492237BC7D5D6BF16604C0C94
+F2469C67A225F6CFE49EB45DB9423874BE7AC48A009D68D028245BF895C1D00C40592B68FFB7
+642386887F137353293F9D506DBE742B322A5AF5677197B8DA6DBA4829F20A02E0F8A8CD140C
+76F9BD9C730097E0E140EE2EA2F3C71C714C669DCEB650E87C98EDEBBCEA6A5966D8965AC0F8
+DBBB858B77BFAC279AE094995CE9E7D78E387036652B0FB576EF90A777C664C80FD7C2C7B9FF
+EB52FFAD59629217F293F54552ECBCBD6F05B326AFEDB82B079D68104CA2660B9B43EEACFBA6
+20EFE2B1CFFC84AD5F98AE71D4CE28197A7AB40EDE026A9986F73DD0213C1523112F64FF23C4
+0A474FBC44E3266EE0AECAE9A823BF787861F3F9AE1BC0726A47D8F74B70D7899A5A2E40A2D0
+B5F8E229023ECC4E5B30F914F3EFFD4481FCBAB37D8ABF4AD3759D2357BF5B7416CF9AE72A9D
+0D9A10892A70FC0FA2F2C20CB2FD8D80CA9C7530CC1465D9115306EA5DD4F7D7FF60979628FD
+78B6F0D429B642E44CE21929AE076BA999B78DFBAEBD38B0C261BC566C5161119CAFE5C3D0CD
+02F149F5D24B241A9CEC58E9E2E9F72A2862E2103D86CE4D93E612CDB82AB33215C2AEBB8D30
+E34EDA53222FE67843FD747F9CB1D7C2B4E87D71498A1D5BA282EA5BFB3FA18719124FD46A98
+ACCE4BF97E480A13D5AB27689CEED619A8595E613201056C5E137F618E4F4B41B3B5F247D0A9
+E786904DCB1E2AF7AE330C11E4CE29B6C75CA748584E83B5621F2321B730221A0A6AE75FF564
+4FDF0FBDD7AF0627D4CA801D0EF9AD04C55C238013994B493B6E0CAA0C9EFB6A8FE46E8F120D
+1CF4F60453A6858D2F49FBEB90D21CC6A67D2616A506795AD9BEDC96532336BF65679ADEE667
+2E8FF95DA69F013D64D7121307B932BF2CA4FF2623DCFA5D8ADE618868D6FDF74FA9EB4B1D81
+2C0F8596C9C14B807345EFF6534001FB3BFA4B5CF929767ADE5C5B1628A1EA2D0805E85042F1
+E31099EFECF5A542BEADD11B41F1428FB471DEAD028B55BEE01F9429DFAC0A6BD3722C7EDF43
+D73A222B883D305847A200043DCAB3CCE0ED7A22A16210700D98EC416164F8C5A8B13150308F
+253797903F8515F065034EE7B5C42FA83CFFC6FFBA08BAB2969617C3D94213762C611E8DCD1A
+A82F90FFB2E2C0E570295EC8F36352583CC4C9DE7D1DF3E8774EA47EC79FB35FB6EB954E5733
+32F582F2679B13E218526451AE5B5C7F0154B8769119E88A6E93BDE1655287CFA8663EAFDF09
+C332666E2A14F562C146C9F5CB18BD22B70F98D3D0917AADC376463742BF897D7B1868EFB802
+73CD69F079790DC6EA395987786A1EE6D649D725026D34F8A15FB57EABE12757E49F30D2B7DA
+FA80AAE0723F905CB1D4FA4C21AA68025986A45A6FCB4812B7B2698910E5FB950F2280E3A60A
+0A7930270A93EF4F7929F2ADD145CA87872B8B713FAA428B10A1F419E985E740D2649A29A3A5
+E0D691EC7EED9A5251A0D76D6A6D1F455D308BB7324B29A92CD01006ECEB1128DCDF5730DBA6
+00B5881B7C3722C09074A51C45AA8C26A3D960944FB062A7BEE0B7FB1D06B5C3F0CE9F283625
+2201E0B3121DC1813D955A3D11A3B41B1B1E74A2EE1E84364D05FA9A68405CBABDE0009B221A
+BEA1146608A26B66FA93D382DA5ADF94BA248F14035AB0C03EC49458C7AF3D9867682D1B0DD0
+66136543EAD160500D49912C5EAC3B24CB12AB6504C837199186AAD6459B320D69265F230AF2
+39890F5BCD0720FE71D3CC95295982EDE49A9D4FEF248F7FC3566796769A2A4B205E93DBC034
+54162CD50442B11954667199F1C43FBBCA8C354F43DB19C1D096F9186A1B200DA03F81E08DDE
+8DCB88B2FB1886D246933B5497EF4782DD56F5A54BA4D8A5227E4E5DE31B2231A26C44103F7D
+556054A2D4CCB8F57D7F56DF346467CFAB794EE825F86F3C5E42339CA4415E8100715745C770
+705F3156F7C4ADC9AA98D5B72909815EB12B55DEC84724575BD716F0607DE90DADCF41ABED55
+CCA9CE2C075A851C9155523B109B6BA66A5DBBFE5159FDAA892BEB9BE909FA491B29A7395BC3
+AD8BE8605AA7B57D10BC5F96A02080F39B111CB1D23300D3B6269C3A696363156D3D0E99BDAC
+071BC920DA194859865F6AAFF48AE35E558B99E0E88D62F21B7C7A3640DF076EABB7B67025FB
+F9926E8C469BC5494D501DE9AA1565B428349511B5A2D3D9DDD67CC6E6F06D83B28857F46244
+5F32AF11D71946359A66C9D7E6F1EDCCC0A295688E239D18E6FBEC696C21F5B2FBF01AFDA3EC
+39F0A76E4B530528E302A73A75509A1035B4D55035475C984B66D0AEB7F423E4EDAF3F78BD97
+35FE8FF17CCAEA7D245C0257650246C90BB99E1433A867237BC222BA0B96D4E332BCF48B8565
+D9F00EAFD940C10F1EC44F4BABC9E4B74919039703BEEB805991F1CC3D9D7CC4CDAD755444A8
+CFA2AA908D66B88B63551B7196413AD3614CDF428EF48CEA5396B5777C39CD7CD285E9A75ECC
+5E028DD5C291E063326BE2421977DE683ECD670361645B6F4495ED0ADA49E2C3A341D1973B7E
+C21AB13BB4F8BBDAD0B31EC43B0F6A3268B1E667298D95B3BDA5DAD45D2241D851543FD03F1B
+26B6172B88ED6B3A1641D4125AF70CC3A4D425D7226CB034B2BC7476EF5E08A1A33626EC8B67
+6A9ED37CB0543443705BA5748BFD99EBAFE17085D1C20A85371481B1FE5F239986B5ED471B21
+5F821BEBBFB2FEBD4AF60B53A1ABA5FBBA118C0F121A1183E8D1297DA1882DFA5140469B2522
+5CDE835D18462BA08DAC0673A4FCC6172BEDE2FA38373DEBB9BBAB9CE158FBA3D831499928C4
+059C086B4CB70DC0F2E48EE03FB4887CBB0B45F8FA04D7EF316C864055D55FFA990419D9A83B
+C08AF43EFC14870BB40840D12CEC93306A2355188F9367C512B4D0FC1E039AF8A85E29BD8BF1
+BFA9476A3FA2876C58933F713F0B58CCDFC6914D7134E347F2816EEF956C6171B313BA58C7DE
+279178B9BFFB30972D6B8D963202E4DFC92E9DE0BAF43878FBFA9A13F30EBE1C9EFA118ACF87
+EDCA5E6DE8AD4F41C09F03465E20BE82CE8226395EAD99A8BB871D49E989E486626D73CF15BF
+A569F3CE25391F477047C402493A23B55F70462870EBA3A681A8F8D99CF7C2C81C70D705C392
+ABB88587EB849662B365F85C241DD765B3C295F0B7E7EF57C7CAD259577D8BA18DF21E664888
+EEF38DD5D9F984F9DF4B51E28563B787C8BA7A96BCC3EA9E3A26E9B0A9946E642CB59170A89D
+526FD1096B7C09108806EEBCF387FB03959D54B418E76A6A638407ACB5AE8FA4A7A5185F905D
+C9A61FF94929D3C2BF0D92717D81B575FFE8D17E5ED3E5197CEE88521AD4F87CD5F57E87BC33
+F077C90CD13297E91C49F226AC5A085B73254D5DD3871C97F873360FA05F8F7216C867C8411A
+DEB944B47BB5305C6E7B51A9E41916AACEE057976CF4BA417A67E68C4245E92953C609AF2B8F
+658DCDE16D328DEFE4CF9EB05DE0ABA6F076122CAE1110EA641D1D886775B5C5908D4C32DEB6
+F8537A35F6DC6A4F0E0216E93BBF3AC1EBB21EF00BD2D7CD787C17915788D0CB4062A0766593
+1A30C43B483FA325F9F92F45CE6CB060300B818637507FC323EB5C1958FF94C7372726A7B68C
+9F83B07036EF06FD57C4D174480FEEB0A6441FE2DE8243F4621B553FDAED2254E9EF5B848F63
+2CEA1A6B9F3D2E1EF7F770F5404AE0F4F3C912EE3281F9596B42E01325E8923923703CF60F76
+03B7FD89888FAD0ACAAAF1B1A6463A3E73525840E5616D5C8E7F66683F2135F3E4D0EE18FA84
+32AEFD05C3569A4CF8EFA471F0A1490B4A55093A64659B9D112EC90F42FA874F3F8188100EA2
+F157BB4F9F52A1B60C8ECEA96E222EE4AD0C6B70B2B43F367D4C933F425D49EEE4C7030EE050
+DFA7CC6D044CB9E20ACCA84A80B9F1571927E2A312E5A9991244FDB6EBAE1BFCA4820C193703
+951BACCF931B654D6BC3851324D3394A3BE41DE2523309D5FAE513F18CB65C9D135C5F8EFB7B
+2622B991D8ACEB91880B22944D26909B3544578C19C1DE4A16CB7CE5FD26EDABE394AC53B2F4
+66E27ED9FD7528B6F7CBE0C4EEDB4024C76EFA6EEE427598A18CAAABD3DAF43F462C138504AA
+D4517FE9A93E25D49314266CBE18585671EC97D8016DC14774CC105C2807E8D79E76613585EA
+738B346C49534442BD3E36ABED00E8A6FF0C7BDC021B721E2DDC00B6C3E6F42A2F3C98DCF7DA
+A873FADE66D8EE0A21A958C725026F4A439BE96A9405C808649E54177BF01D6026A6B759BAE9
+689995DE878DA4EC878A69BAF3C387CEDBD62092DEBE87A063E21D01F632C247EF3F07574282
+EC0E245DFEACFDC38AA46171D82616E121BA73B684F869908E65AF1C63A2EB7E812EEFE3C3F4
+954E10463359CC957EAEF32A49E1D341702F2DCBBF1522EDDF1DF96F8C679F752C130546594A
+5759E7944CA62474D30F5373801F323747F58A04A8FA115AC67309FAFAC362D6AF9548199389
+20277628E3771A03D50A13CF80031E63CD4834D0D47C5AC75B7B22182EB95D8DBF64E531E595
+A1DC9B5D7D093698CEF3614BEE91F73E5625F425CCC3C4A364BAB995CAFE438D8961A14E67D0
+C03D8CBDDC4CC8C34D7F9C2A815CCEAB4B398D21CD45423650D0A19A0AC8654175C7E9A43FD6
+599D2875518A431517726948BD9FA0C7FBD59D0A62E979FD9254AF03D216FD75734BDA875F66
+A31AAA8F131B49188AD3AEBF2DFCBADEC488DEE91589B08297A960E21B4C472B21BCF55E1430
+E313E1BB32EA42921A240917EA08C90AF9CD982444B563C1B823104D34F64DF37742F42D75C6
+D6B9214325CB6BEB0280F79723E9A975A499784C59F44FE5C8FBFC9FF7F5643A5BF9E6E0566D
+5C3134CE761811A725D9BE99CF34DC682243774E6A13B21459C2242ED68DEA64E24E8DA19F08
+99072C0CDB2A807283D5378CB7D087D1B01F92E47D1D96DB42B57FAB36CDBB73E1EBAA81D22C
+521A573C18067FC8EA38713C959046C985593AED0DF31989DEB783AAA57ECF01606C675E5ADF
+81D845A542D50AFD29C98CE67A38B210EE23C9A14D23043F91FBE77ED190B43EFBEEA41382FF
+8DDCA4ABEE4665B67816531F07EB8043DECB836794615F3C334B8734A579FA0BFBEDDFE32A95
+389C6110D09DE30091EF2F29A29206047E8378A870D9831DE115685B34066B9B507E8DCFD6F5
+A23B5CFE5E74527B30705D010CDC71BD90DB9A9A53053F6B24E65DC4AA0F7DA29D4D66D9DE8C
+11354821B14EE965F16597EDBC5BEE7D4683E20C06337CE21FD1A2A5D78FF1E945ED13ACB556
+C70F89A08202663F2622CBCF480336B8CE580275514B24430C139284EEBF9FE81CBDE98C00B2
+AB9F85BA64E2CFF0888DF49C600EBACADEEC43FC0A6E92C499416902CDF94B318AFF4F6F4923
+044EB2EF3A88D0D94CD274F40488309E2A08C10EBAEFEB2759D9DC7DBE2C0E647F36C21220F1
+1D88299117AC699EC7241EBB828A03D18A58F8C7AC0839E929F6F58CCB8613D8DDEF8FD6525E
+069613D644653F6702B0B097A177A31FCED5F7131F8A3E5A420D6C7684F2BBEF5AA88FD91243
+8F7F6D22263373CC04446A640953812419A21793A204146A1296565E9103C1DAA633DBC79BA9
+E5504EE0743946C1FFFAA5357ECCD3A269B6A63CBA0C0A9C76BABDFB28B0CEBB607CFFBAA692
+360697C69E1EDDA67E12874F3F1260753249307C4572F363033B902FA48FE237A4F65736BC9D
+A310CE406AB83059F02F94C8C9384F6811BF649506CAD6554912561ACEA6C1F4F1F2193643E7
+5457E7207C55D0160BF194743BA207D4431FC2159A4D593EDE6B1AA19F96ED07CA67505EA417
+C85A3AD0F87EABA0716C41BBBAF003881EE12CB4892184828BD1CDDC94AAE05C19999A6F1D2E
+1DCE2A94C4C2902522E44B22131192CED3D42A3584C98C2D9301DB14EAE7474014C04AA8D2DE
+A1755E5F9037D3E3821042366455AE23CAC2BE67E0A595A033E98462E1008294A00E463212A2
+6B4B941255523A3C9F39197151E388EDF193D510A23F3310E18FCD55019DE861208F9985BEDD
+65AE125204A6DF7E8233A25AF7AA151C3F8BAE7F6864386FD22EC8A3F5A179D7C70FF9E71237
+EBB2217D09DDCC061D57445E8B9665E22DDDFBA4CC18B5A9DFE15224697ECBF4E797E3042AE2
+754EF1BB9D4652DA69A07F57EC6162EA26D4650FEAA52F9B39AEE8767C125BD7782D3605E19D
+FD2266E7A37B58146615D5BAE6B16633D5280D2CF0234B0114A91DD87AB6987FF0BF4D8014A5
+24AE04E18813F88D00BECE288012E8A285214C8ACEB7A5EF665682D463462F04E4BA0852CDC9
+8D6982DE873D1EC644F44B7FCE18778B9D8F130584CC3F3A8D7A51035F10167B8E572BE50997
+EB738381421A763E96D785AE567981C1430CC18A79B8F57557588D3842795F2312C4D3E3DC3D
+55D54A358A9C0B031E91185DFA97E0F5474CC93CC71BA796B4A842C8340360BC584A1477608B
+D95481DEA6DB57D819A8F36BC70C09889E2614A2BFF7C74D0D1D09E1454C58F7CA672ADF64D0
+ACBD1F9D3AC9203D7D011658E361B499818B4BDAB372524A385E65D4882A442BF53DEF1FB2C7
+460DB0F59ECA306C74AED3E29A94796F525E2D5DF9BE7A97CE6F0013C0F39476A7BCF610F4BB
+5E83D2CF1A1D515F899C81BBB60646125408922B45689BDBD82F14A2B9BBE1F27254A5D1BAF1
+3B2128846E4DD8468CDAB44B9F847D31DEE079DFE5FE51870FFE9F18CAA25A2FCB978A46D747
+544F2FE51496D04EA5478B209FBE843025BC64B1CBB0DBD43DB01744C471327ACB3C77E4CB6F
+ADD41B9D4D1C0BD8CEB11AA2A239942C97D1F1594F6E4D9CC34285E4DC6F61E80CE1FEBAAD7F
+9BFF9C00E0F06091EE76794F0B859B46447CD627DB60142A462A7A3E4403E839DC6D4F08BC6B
+50E8300A76DE811EDD85431CCB895AF3045425F4099B1AECDEB7312E84DFDBB373309C9B1FF5
+72ADC905A41421A77699C8885879F4939E7EE8888E7CF88EA12401C1154525807F96C6F192DC
+5981ABBF512EC4B4092B515A14262519A630F20DC7CEB32AF0A2A10443EF54AC376851A23F6A
+AAC95DFC30D0E4CB5E14B5CC323CE4D95D3612D6B19A877973B42F32CC03EC67497E3D9AAB54
+573B36B1DD5D096618A4ADD3A1FD077C1B00C7E6BAE8A90C606C979A2523D5AFB67730416FDB
+1F28EB72E6F7079B84A903C68942C9A17B1D71C30CCD288ED9781E50212CD06E5EAC59D45034
+36E3DF8ACF1F63A8B9A44C8D159C1981168E5C4BF7CD5C5069EFA0FEE41BAC93B1C0E0BD9F12
+ABDBF5C8404B53C102DCD215889A49F23C435A962CAB0C48F763245F0BA1E3B61C6A6E305D8E
+D49FC181BB4E6DF8483102F70DA144937C8B5205D240D6616F1281E92C4CF018B5E26E74CA72
+9A09D355F97BD76563A4D62A3D643D5C7BA4931B5A3E3A8079286D4365DA4E4F63236E4C5E61
+F6743472B1AF5A5FC97BAD3D576865E55B3E4F214796C674C902691CF7FFFB9ADF45B6BFDE90
+964E83FAACF3C1FA70C53F3D6EF18A8E13FF85EB35843E983393C292D1C4890F83A33DCE96D8
+3C4D38B4AEB6B75B50E7EFFFFCCBEBA8EA3BDA064BDE07DC7726113C716FFA47A00D33F49115
+4228B6A20737895E365B3EAD997F7D2F9999EE6F4713DD02AF593E6C105A27B9001E1FC7C57A
+C408DB6309A6AB2C3C6FC6BBE62588AABC4EC9420A72C6DE5C0554547069E15962A141C4E2DC
+4B38BEAD55F8E08F14B9A455B81A5CA9191B588A5E587A1471E9F1B30A7A866B19BBADAF5AFD
+8674423D799F515D2B59E289843B98E57F6D5105CF14929DE24DCD833BBD7FC14CD0AF34A8F0
+7284049AED310B36D0C8559504248BA11B4C6697D5B74353375163290F23F63B2C611031295B
+2A5183036A4DFAF1DABFB1669E534A8BB28ADB16EA52EB238A242757B8BAAF53E90C258AF04F
+9DD1B00B100CC6A32390E6FE91F13F675A3B78F5E23646F1448F7D6421C38A58DAB20EF56170
+BE71AA9CFC5EECBE809138A9FE8B46B8B30538174C23E6B5DC725F3A0507F944963D9FB47C82
+58C4EF8F5D4AEA6A5860A95E0B96943452529441C4C6E8E299DB6CEA80CDF2DB74AC3A89911B
+55E225B3F20D3D605979045C72B672DF80FF1F78CF4992816E27D225A66CCDE49F357E2447AB
+C6A570003AABF2F770E2DA3F0FA89E9A01AF0BA430C925E8F764C77B59FF767851A7D6570106
+FB852F3047CB0AA041110529072160AD8EC569C8C1C5EAC5BA56EA030D104DA9C6D530C089DF
+3E37148F4B8B0A005616F946C83A391DD7E7E776FB9DD3D52F06BDBB5CAF1227C4BA74861BC3
+AA9A85055EFDBD275508DB8F68BC3CDF69DB4D1F825EED993B84FD63B237A38A4CBD9071D0CC
+DAD295F3947BCD1AB385BECC35725F4F287450A49F652347C9B836A8C46A58E044853760AB10
+FA647FA9862705641B5C411A2EB69086B3488F4319068C959E5D369FF0FEC606665B6C19A567
+9A96138A966AFC86F64F803F55829C8CFC184D20D97F1B625ADF7E260EE89F20987FF29DA9E0
+5A4C12AD48B56404D0B2BFC398D5991C8CE5F81E67D71F31CC8A4A6D1EAE0DD4834EAF3F7DDD
+6493DE2D1D31606241185A05EA75A6036AF2A4C60079A9E21A5F28502560FEBA1820361A4B0C
+2D313742A2E6CAD252169103FBDF7590B38A60C227446E944ED13D91D5B3DCC6BC8A4737D4EB
+AC8BCFBC78E243296A76639D2726D968463E03E3BBAEF4CACE746BA11DE8DE942E1AA4AA29E3
+993212FD27D3A23E55C731617AD58A98615DF3113A6537CCD5E4CA5EE7715F446C009F423622
+CAF9293D9C25EA96CDEA869C00821CCF8E0E146A6977AF4FD1D6CB46D3A96CE4559D7EF177E1
+9797615C95C51B2AC6DA1A3E700D4AAA84603E9E9B4B0F2C084CE4A17BB119B6C998045032C0
+4AA21B8B4D5A0262387F884D5B21AACC93F1FB74EBBAAC13E092A860F9875B83A4F2BD56ECE6
+B63CA3575EF0601F3D0FC09C5FE9D7B2523A88C37C3360FF2E8A3A0D6C6C9E448CA93728991E
+F2BE037DE5FB059A72ADB03B1FC85C49A84B2077D6ED25DDED1D0F9DF4F137E4556A9D066927
+217488D7ED62E22313109634EC5B291842369E376F2D2302A3D9DB199F0AC48B228C8218ABE6
+BE8503502672F984C8A7A97B8B6AF3EE1C15230C5DF8FBBD04D78B28C3CA61F568E0EEC6212C
+3DD622884AF4740BAE327F89485685C94503D1D86AAA538110D7C9E520FA19C129BB994E3765
+8B6F0D301C8899CB735BED20E929BA4E7B6F3592D5B945203639979C6A459BACD0B84B399828
+3F3F8CEE039A3E78C76DBB58EC4311BACB39E1AB2B8C1E65AD657CBA210CEE930CBCCE737216
+414A7CD90ABB953F27FDB0991D76A23B8122FE3A2CB26843A4DA6681ECF996E4AD7A1102F4B2
+44AC4F6E431BA1E9F0EDDDE9DB9399AA8484917776F256803BA5983A2575D9371A08F2330CC3
+44B89CBDFFC5004E00097A757C390984FDFDFFDC459EECB46A2A1C8AA6A1618C2B1B49224E76
+0AB2EAF6893219EDB7E107208D95D4D3F49E221994647667DBB63634E327C4DB6585ABB58D3E
+B338F272AE572E9217D63CFA8F10C87CAB078B68F124E0537050B7DC1A0D1094B9AC9FC21F5B
+B17756D65C05801D59E58AA02C509CCA118CEFD2C91D6735C1DFD01DBF1B36F267C4DB0C3651
+CC9F1B325915E23AA43EA1DA505179DC098A3DCB76DF83BE080B733DC252E0A00BD702BF57F1
+923A978FAC404F82BF4DDAD59B16883CE7C6A0F84E4A4E58A38FF675335E5CA5D59EA3DF82C9
+3BF0CDB775B533BFCE6237659D0B97476D2C14120A35BC6970EA9554FADAD6AA7EA674529B87
+603342FAEA220B9A0FFDC1236FEA243892289258940C2DE850FA7F4A14B6039EB93ABE2D6B60
+E78D92B66E53C40066138E63A10A3F5D8600A3974652D7EB79C12E16D5D83761AAEE32FBA99B
+762B564374B60F3074040D30343159EFBCBC67FD1B621181DDDA4EAE32E38003E45B1A21A04E
+C69A3C05EC4A7A91E5CBA3FDB856D8127D9ED6C8E23EC8887D79ABD2FC139B5CB04D181E14A7
+43AA5D5CE886607534117A5832DF964084FCE620A465CE886D1A23FF1CB0FB812117EDA34436
+5AB72AC5128FA0FBDC426672391C4B61D3E60AF0815DA6D908BC6201F800C705A18A2343FF3D
+485473FCA8DEB44D821066FE148D3CA23956C99D0BA4998A3E126A685B19585D7380354E8091
+EDFC4E684AD032CB0DEFC5CB076A5AD1E9581E68B3826D09A96156E144733907A23FE62AE723
+9871B1D7B790D74D7820F9A096399D9120D5A78E2EAD9D6BACC3DF32888E072021AF81166F6F
+EFF32EBAF11A8DECF4CEE3C07E9A30F175AA22C7C615ADA194480EEFF72FFF2E97BB0DCF5DC4
+85428B08F173549A0132B396E7FF53B578AE0939DC0CEF80A537B1D713B4D6BFFC987B34943E
+ED13E4B723C85252F9561031F3E2144C7B8C8B5F3794435E1293E4106E8C0114A14AF6B37C7B
+28F7EBE6D321C4BAB2DD04D08FF1D2EB4967092D52E8E5F1D04875FC7E00FFF8C3E9C7336CCC
+8D709EA09DEEF006E5E809CFD7F377FC4BB8992DA3DF88159F1241F927E4701DAAEE33394645
+B361BE7A137454A2150394309F69F41B8EAA3274D6E4AC2E9A94770BA1463A5B774AAD448F2B
+FCA1D220449D1D3D09BDE0F582E4C09E954ED577F7F9ECDC5023DDE9313D7E0AC83C496472BC
+35FF3367B62F1FBA6EBBE44892F0CA9F48FB4DF1C2E6D95F030305694C91E5D2A49CECFA8A89
+61877441513E02FE7700CC536BC6FD9622093892353F0A83AE630D5EFFAF0338924E2AC575AF
+4E644413C29EAD6C123FEA2ECB5B4B49CFA4042C31F3D6FF535D3F881AA9935E2B5AE265207F
+94254C9DAA2E7F8BC6FDB6662722CB19E35E4E10810C43B0A46450E0FF05236C08298E02667A
+7E2F4F1777DDEACB198D3E65FE34C78A3C71A542A0223828BD7B57A49337852A7E38BE96C8D6
+8B27947476892A6325597AF1607104A3AF0BD539A433B1CC09D23790DCE90812DF84BDBDD0F4
+56BE6404F2E59EB8882779554667D48C007C2B6E31FD3691E97F76C06C659FB96A417D2088FA
+984981311EC3217A9BF784E579CA42B4478F6530B3E9F0FA1D701D4D8F040B4173C8E1E0CE76
+006A644DAA1611446FFAB2B218867985ED06DDF3053684F60B912AB11CE7B3425FF389107859
+0A78768D85E21BBC09E3B315CF56F6F3532F3A6B1CA10034B80CAEF1E62C2D91FA0799ADBEE3
+240BAC2A24F35015700D938DC7036245230BC3DACAB9520AA950D153AA79A0570BAAC57452F2
+C958554992B0A965CCD7BD9C0971B6EE8357E3DD18CF5E6BEF5C74DA84CEE08E597A5DF7A21C
+17BED630CB74F2F21EEC8B3C2C6DF46E0FF5D571BEFA8398D3EE38E905222C8E94ACE8612170
+1195D40FCAAA271874A8E6AF62AC4D60558A485505F4301959417D3F996526A494A201C4CAF8
+4BCA877DA39E1338BFE9EE163E28993545B5B989D5E8A0BA1E1439EF7C6AC1747E272716A30C
+CCE34112B67CA53ED3D2379C99E4264C37BC4BCB70118298D281B8056D809B82FEA6994952CB
+5356BF3E41D19A2645A0139F44C7179B87174F4B5979B9B6E0ED55C00F4CF2299C6FB6C98010
+E01608176D6BFF74674124669EC3D9EC262BE00B9F265C1BEDAEB13895CB58CE214F2D7FE619
+762F2F1713A0829D3EB4E7FE6449A73C7C2EF52856226952B9EA375D9FE3E0FB79741ADACD2C
+056BE97B93F09BE46C97E2B15B2A3C067172B90F41A8FF1952787EB93ADFB5D139B6E68ECE12
+291B23AAF9EA86585AC48C85BF29259F01C2E158750E4FB1ED1F611669EBEFEDAFA8F1E8C285
+A1068D065953207897F63C142234B79230FD7DAEC8CF3C178FF691F2D22BC2E17FD20D527954
+B08837F88BAAA2878580E49A7D3D4B3BC91A228EA3B176020A049791F50F96266FAA79AA8551
+A4DB3913346113ECBB742944417DDF2529568492D96F06360D20D644BBBB0F7136A38B813E20
+8DE581E70648686C5C5C6E92FA752D8606B56143E6784E400411E2EAD4933F168C633812B2E8
+208B964791DE0951EB3FF55BF687EC958399B4B34F70A80971D269AB955D8413B68E69821086
+C71F87C1E60D5E78E721AFDE35380B930C41B72F4E8717393A013723C81497836A6D204368E0
+2C8BBE44521C82CA5F8E3120E7ED232779C0544183865CC259A047ECC3EE5E139880FC96F6CF
+ECCAC3EDE4858F312BDA343B23E19703A3C624D99361C6900DC9BD1134001F17295B0C2EB754
+4939E8572D50F04C0EB75EB20A88C91CFB5CD971A05876179FE794D4072D929423EA9CD398A8
+D31B3CB32262800CB5EE1266111E0504C14C1FC08E60441E89E4DF7C91CC5FFB4EACF83D065A
+F32AB2366B0C0A844D28C803E33F1679EBDA804AFC0EF4BF320E21919959BE7B060E914F49CF
+8A2CA28547DFB771DD7F78535FF95934CC749B5C7897EA9CB067F6D861064CAA233C3538F3E4
+D5EAB1E756EFAE9F305B03E70E6AC14E0355AA871DF0001FC80620160DF7D218B64AA8C12802
+CDC0CFD2E16E45FEB91D2A74E12031082E21A6CE76593E3C17A251E9B2EEE18A0E922DCEB758
+DC42DE114893C36AFD4A6E3F1370E3D66B0CF40DF7B05473DA0B2C446385870327C847A5A052
+81BAA0080C36EC65A10056619005B39D3BB17315EBE5187D1D69DBAEF5F89F280FB9F41F53C2
+EE00A400CA8EED8E74337FD737ACD8EFD0D361E4C516B11DBAE751B408CC54D49FEAEAA64523
+6FEA20CD8C326231E9131D003E74F1F8711C883E6AC50798C98758A226CA85949CE153D4F1F5
+002E5EDB1C5AFDB33A3D5E6A4FFE73FDC25AED83C1C83533A5464B5EC8C0DBF39C3785BCF147
+A4BC11648AAE5F2ABD1942B0412F5ED98A4B3A5BE1B679F66E0D0C43806A89A349F259DE095B
+8538C45A1A14B320ED0C662129C881C6C70487D7EE3EADBDE833C415B992F25AB94E1F6FBB8A
+FDE188FBDAE860368558C1049BCE0E400368BD094C1EA808230998645B88163F77C1DDFB63B2
+092FD1B772C7AC73B095AB8749E65C3DD040AE17206CA88B7507AB3321231CCF8B2144EA51EF
+CBDA013A011E1D18ECD5780A80C262BE5D6920178D2C129F87632A39289B032FA01FD6699ED2
+E79EB18B0990B86F00C440B4A6CCCD109288A177E366D21CB16A569DEA5D20A732B10576182F
+0EB68BF666B1004DC444960E579AA3FB762E529B6FE6D98E582B90EC73140BC67696DC49ED47
+64615760C58E9329C02FCA556E23B11CAB4F516E609F6044FBE97289D4269AE5F78399432A57
+5198596B1E19B201078C93D27BD18C8929F145415FE188C35DF3FD3A59A34AFA3C22CDC2757F
+29AEA7B1D0D983F4D029E4071896437C8AD90459DAF4FD1FD173925A007A845844C6666CCD14
+A9B4DAB72975E36B8C0CE9A63FA38AC0D0697F46180A06EFE2618B27FAE17F16A148792346AD
+9C2C55E9836845B2A33E0F03CAEF4850C440BA483230CB078A72DA8482FC959B4EDB01FE8488
+B7C5D7502F922ABF8A2195F17C2D3E974D2E5AD09E1E61FE5B723D5A4BD6336A259EA088E3E4
+4FCA4DA49E017ACBA3C0D58F16A3A00E21D44F1F26693449D5D382A12C70C7959965479CCB12
+5565DA2442641EA18B8DDD83D43F8177FD32298C0B3DA44D436C5AD9B85E47DF64BCA6898C1A
+0EE73195F323D8B4B2442F15C7A73DA62009A31A45339DE6C491A04B5E4C383EF66A3749F6FE
+7F53059F0A08C8DE4981D6A686B3503D0563A710D91B3D4587C3D12062ABC1210CADABC6F0BD
+9C6F46C87C5B4F0445E7253145EE26BA9D839BF45E9DBF635644F412DD4B1738030CDCCC82CD
+370587F4CBA6796A2727D3D4871BF0D8CCD867F2A0F32A3109F049AC032601BB5CCA0E6BA807
+50F88F1BBF77557CCAFE6FA24B5B5D8FC4941C4113C4042FAC0D2FDD50B304BF290C26ACCF79
+3E990B1A10520413679408F42399684D4ADA9CBD5C6660768DB2CE468DDF698D5BA1A73D3BBA
+49E96320D04B006B5F6B0387DB59F2E20250E5DFEA9160BCBF855801BF6998D481612D82F7D8
+D6AF0B2034C9AFD9BF26E8202D9E8DB1633167D0F073A013EEBF466A4FAA74B6A5055A74932E
+64AA1B75A8708C9C6825141E85714C48FAE391D02A0CC9E537A7E11D1E1E3CD08DC693355957
+7DF07821F6D6AA36154BD16E3D158DE669351A48CA71603C4CA0F364286D4A4EB1CB90CF20A9
+DD2BCD0BE17C8C04098D9720F7F7ACB02EE63EA496E690AF57B02643AE9301F23D42AB02D414
+5AFEA48D26118066FF99EF12C0EEFB4BABDCCDA95EB52AD64583C7EA5E54417C2805179F18F5
+7A0CDC2C3CB502D4A01E5149C072C732BDCE5CCFE8EC465BD66691E1841956D79BD027535412
+031A9603B1C24D3D16B0A3AA3F5E00FC84A30E28C617138828CFC30BC40AA24B94159AC5336E
+F47064572B18678738240635FD1DF47722DEA61933008B1022F9A258F47FA2AE762646EBD5C8
+6B0C7F1983E306E0F42508DFD5B463E91147B198E31D30BC4A84D45C0631886D42204C196C98
+01CD982ABC5387E9288CF00F0E5810C712DB51962982E3A91CAB88110C57FEF58D16621B3D6B
+34C7E3FD7FDE1177869BE84FABB95D8F054A96375CB59C4711E5830D5FD13A7F4C14E4F2912A
+2A4E8E3072776ABE39D3DEF4A62BB11A3A6006242437BF307DE502BF95EB193CE32BA6BB13A1
+F219CA0F7EE76257B74C4DA5F0D7985BBA1A8750808D741C6080C024E78FC0F3BCD2E0DC8396
+D434EC98BCC467F739AAC2E9BB78129CA55B53E08B20E35FC13B9AE4762BC784D49FDE8725AA
+EF34FEB464E3833F232F5D7B02BEB2D95B17949FB3624836CB344E64890D3BDCF5F459B1A1D9
+7E41798A7F5EFD69F9C5ABEADA042F4F42D3C5ED8D50123F7B92CCA9D2C5806A4486032E827A
+12F6F8D21A54CBBFF57088495FD86A7956D6C56C3D5B546F69ABAC67F386357E1C524679E62B
+AA462AE42B19754F8548C8F7BF74FA0192F53D408DC9C41AEDE772E28BC2D1FC39F5208257CC
+05DABEC5F019D5EB9B22AA825D57D1BA2480EF6F1DE82C18106C6047A4E2342A460EE99856DD
+DC84D76A3D081B2C31A7820CDF58BA8C1CA26FC6D607FA9EB0EE5D328362971EB10AED06B8FA
+23F49C996A1FF7D2A2224B4BB0F7E1E7297C4B330EFADC80A590C3F0C090F532678738380920
+7DF928C685C48AF18AD3A9CE962F6F0A0723C6A84D318CBBABC8F763B47CB66E1B349E7864A7
+A0BE27796467C403F9568070BF1D1A57EC7E97F22FF181FCA31C8FBBDFE1E4EA643FB5066D17
+4381BE4131107072B59A83AF99BEF336B8F72B8658738A84F71C4D7EAD13D28B4E49FF90A96D
+43B21A68979132CEADB2459B1107781A64073404D0F81A65EAC799E8E723E3C49CCA370F2A74
+572C4B755E1C4F92CB37143954BA6C748FCFD2BC5F780C745B1F0F965E63CF53400B78F84BE1
+0ACD20809DDD376D1A9B3C515D8F1781793CE9F8A4E769BB5AE25B36914932B1B0922212E4C2
+41DFE0E7C24233AF5BFDC3ECA9C81FFE34931643515273378D2190DE75A4AE5C1B8CBC4A5C76
+30008840DDA0E02E050CDFDB2BC5ED535A8E7698B4AB489313F7926AC1DEF01ED849ACEF2859
+870C7EE12DB2B0508F4E58268306E709842EAB264EDAF84C93C15FBE45CC0350571C6368DE76
+EDC307261C153B88D7605EA8F64EE7B1CAAFB5E6AA8606291D3198C1D3EC1725D7A8E97656AB
+5113198CF6FC2B2515BCAD112592FB7A4BE9A281326F045A70BF02188837BD474DA9BC46D195
+19267990A6DB0673901158567CE1D87C4FE76823076DE5B2A5C0225B7DB7BA7ED41F0AAEB535
+5D6F0AB463CA0C2E8FD24ADC4DB9C32C5A0E3698FED1AF65AFB0183CC582897ECC050D288C9E
+15EC7DA6C3EB200CDC2537DA19918D251D52F76E45075B02513A2DDA4548CD65AB129811EB12
+C2E0861123CAE229993E9E43346907A4C60DD7E4B73F8B0A5EDDB30CB3D9D5D63C153CA32451
+9843F9E9F22953C0916DB5E8D81DE8BC056030740772DF56F0E314D223C3B2836D34D61F77A1
+05C32B57F7F1791B119B1D98D5710D4C44977C7877DA90D37D82DD9669F81E913B8AEF9AE22E
+FADC30D27FB913B94F8540022EC0554D6DA7D0C510398E1185C2441AD678ACC49485A48E6923
+1139CE1D2626A2824FC04FCD35B8E52D9D3D9305C680B9BA341646FB2FCBCCA2B7787FA5DDC5
+CC8713D431621DEACC951ED554572AB8020D7CD4A9C946BDCD2F58FE9AB0305C670E92C7E80A
+079388C3FB1E85261BF22208A17E3E396D99324D215E85E282A47AEC771841BD13178FB8946B
+D6CE634A00D8BE0567C8735556194EBCD2D6B6AC3D5416597840A9FE2E231C8D92E044194C6A
+B8B4CA0301788FD2EE4747F48811341463DCD86F4B52F0AB5543FE931CED6D336D6DE4A2E1F9
+1878ED8D2C238296752A29201B9CB8C063454D959C8D5AEC04AD76570E9CF59650E2B44B7E48
+2B06C150C379EE272B7AF205F30CA1C2B6E30CB0D2E438DA4363A312BB1318C90EDEE938DB9F
+0359B90FD6284681FD3CE99BC434616EDB354A62CE2BD42D784B742911003F05BA8BE03D1F52
+FA8F0AC9F5879BC63B7829CCC64BE921E5CF2F6240FD6AD7A69D94B6340B818EE64A68FF894D
+0AF596DA0DEBE47F306F764548A450A418A1C88875B8964FA725B65C77CCB6BC5939FE0E7625
+74166CEF1839CDF76866B449AE2CFBD393E210EDD05D0526E454348059BF88B5AEED05841A10
+C894A0C49026E064E385BAF440D7B975AEA6BF1267D360308829BD81DE6DB3D5BD47B66742D5
+565607787CDB514F2C4B69FA22F053B22527B91FE4A3EBEDDA1352DBC0B4144DB5DC15AEB3C7
+8CCF0CE264C76682FC1B7D3AA2566C8DD47787092AD80185D867DB7891E0CE12A52C954EFD3B
+0CE23DC59C9B073685D14FC24A666DF88FCF20D0A93B4B28F8724F46D5368F2C195DC0EAB00A
+03ED7A0531408D90884792E82A8B0FFC7CC6D1C2E1AB00E466744407FB81F6B9B20B0EAF2B50
+A35EF6F78A9E9EC9D322515DDC6BF058B58CC6C036222F7434A1F27811CC551D36ED5169CF6F
+0AA6D58563C8792D5B74F08BFF06189566F1D0C9E497CD116393EEEA1B853B5852F9221967EC
+1DCFE14394C5A5C026093982FB19F166DC9F52053F1BC7F449E0285C1B9684D8853F587D408F
+1C97BD1D082ABF41AB80F47D189DA6CAAD9F0A416CF040553DCE2A9C853A71151EC50CCC71A7
+F6E0A0A9EFF458CCDCFB0D760AC0CB9B0BCE3D0979E898E42D43A78E17FAE3C33BAC5B4056FA
+D86567DBCEF75EEC322572144FC26D7F81DC9EA718D91B0892E5621BBAE940619EE3693E87FB
+A6BDBCD601FCAD972556DF2E1B0587A7BC8CBEDE01B02E19268F2D31C34712E4F4F29636E3A5
+06013A7FDA0EB8C78FE7C2A561CD4F09D162C17BB69A13AA242B8E5B189010058A3005C16BE5
+DE8975DC24D778EB03C2A59948C9BF3BB333AE0650E5DF0613C77A15F510ACB08C5C74519B79
+C527B36BCE33BF023C9CAA159995F2992CC9731B6AB100604195DC5A79AC4A02D803A18683D3
+9D25EBA9E584B3F3F64DF241E43B038C0D3111347CF2B421FB78FFCC03D3ED2A0C94D228AF07
+C5FECCBC460541802660C19C05A52CD6C1CFF8CC805D43AF3D23FC9EC8408E73A49C1DFF48B8
+6CD9B3104CA1515E98E41AB6496F4CF4218996692106BF443C933DB8A8CC275F5F1602881B68
+B787738070A1B547D6EA0520CF599B4E674FE930596C8DDC4D1454B1DF79F092608FFAD0AC38
+25A8A3EDB0C97C265B35EAA4A6D80C538BA24D209884A0BAB03847600E2623508DA7D8DA777A
+168150698A63F5EA4ECD54309B4989ED2C7DFF8A3940384E5FE0295840C33A078C2860B65BE8
+AA2B278185AA977110EB7B9A95BB0B52F1E124975D620E897FEBE57540103C873FDA64B37AA8
+F82C56B1AA233ADC9B8864B820A76092E2B17EBDA1876D27B49FB5A1619881935FA499EF75EA
+AB18E4496BF7493420750B13D06BFBE1326406C72112F6A497459952C412535CA38D41900180
+F41A47FF6859B2B8CC20C4243511BF0386261D45BDED1F8C15E01CEBB891A07128473972DE3C
+0EAF60856001E6C966FC1822C5613A8D2D3704AF91C363898BE178366FB56673B9600E2F7F2A
+7CAA391181D36880A86B5ED389C7FD49D231E3E82999932075696C52BA761EA299359837E712
+BDB5761E8D5FC3E8C5051E8BC673BC050CC0172B9676943426C646EC18C222514D9F21BB37D4
+2CF66168B74E6A4EE3CDDFA12A183697A121938BA5D51AD4C57A4BD603092DC42F6E8E15E986
+D1A0153977BC89AAC6AA7C5576B3905131D1889C33E313BC29D642F84D5B5DB5D301813407D8
+ECE2DE61207F07EE2F018E7CBF6C5C3B504C37400436B711756EA09327237F743D8111C9D78C
+A1186BF54B5487BED5F445857EF956C663F032EB59DFF3C4315F960E0F787F6553E11B34BAF3
+B0FB6215866C80F47F52F9B67E878024F4C3ADC4C9018428BD04C6824BB1457CD59BB16FEFE2
+AE1388FABE7B9C1C8ADA3491E64B6FABA0EB8EA80ACDA137CDEB8BCB39B5D1D038E7E664051B
+76E86E4EC718D8B8EED85E5AB8CF85B6872D4E94A76D78C4358E5744023B705FE01D0B1848C9
+2235AD874B45C4646E5C393157CBBBB6F08BCE4C6EA80A9A1276D9BD58E30015E20120CE473C
+AE89AD929A9AD4E6AA02F3090377853FF1190152E4D285B66B4CD78F29B18F856F460748A2F6
+D2B1454D4BB1EE72C4D90FBE896AC81690D77BDC2A0FB9655683131B97C44AD1BAF39A3D8E30
+16D847411668B1A56B8F34B40F48DE144330F7711EF447457D7FDC409D56E100D55A28CF188B
+D2DD182D29D5CE0050D6CD9EF549C9FEB628E20859C7E7C8D1D0A62D90E1AC0442B0B1AE7093
+DA6797BB069D6FA94270F60D63E0CC361E9D95168DBD7F8314D5A6EB083AB1B6B4972A2E32B6
+512AA3F8F4FBF5EBBC8EE7ECD5667F0DE7307C3642955FC083119BCC959BA8FF46D7608679F6
+CCA0616825AD959761F6E1B8B77C134C33D20B98DDCC20E5A98E49CCB4EB395E6F299A411814
+606AE676871914BEA847228F323852181EC68C2BE40A19F07B0617DB7E29DFBEF4DE984CC937
+5581ACB67CB727A2FD95AD7954C77282EF61E432353555BA81F4B9E55E4E2A6E1DA1D3265856
+769DE6AB519DCF2BB108D5D7A88C6ACA9B613134EA47198BCC2746A35E35281395A8D7E45036
+51EF887F28C9FA6981BDE859B5AD042E6FCD25CAF05622B269B9DDC55832267E3276D8A605AB
+8D0E690534CB1F5DDC8B22F05C2CD60D1020333CCE9F03E778E0C7F47A94DB9D692E80D19407
+E4F287A1FE21C5A507497C2589080836B31E9D0C92E29FFFC0CB3B936B9EC41F3789F900D591
+A8A7057284A64F16F5E280AF642A5257728F9667E9D977C7A9D2A4B5F0AA3DA9B8BF44D1F8CC
+5FAA51234EA419D31144B7DAA62D51899A57B5F625657809065D9985664404356F107CDC6E6A
+C2AAADAD1EAA1491B5196059D0826C85FC2F0CD9320ABF52960AEF7509CDBBAF288D348B84D6
+27AD28E4697D8888D5A8DDD5C3B6AE1DE6F24AF231265767089985766ACA72F5BDB495CFA767
+3A183BF5EE172AB5E6CB623074E036A315DB038F7F4FD1021C6DD6BA078AD3A374B898F90914
+E1E082C38EF669C2BEDA91F4262B350721D6AA0F6AD384ACC92A588FCB79941461FE8C336D85
+5E77CE41575CF1E7E233EB10F86A9B1666D5D2379222C5873AB2112A78F7FA5D5788017C94F5
+44152E703815C091213CB2DFB73B6D3107E708398B0B7E99E393DA14A2C5D7FBDC76B6DBB6F9
+355D1EBC6E8C27C58E0A5A0EBEDCE34B80F0276833B836C142FC8BF803331A9B442F346A3E60
+0A2BF964C6CC7ACEA399B2817DD63A886B62C7134D6725CB8D657B1F7628B013BF2BBEB523B4
+D8CD01A6D4DCACC87AD88D0FBF8565031728D473C1F56B920334F9BE3297D5D9D13BABEF159D
+95D044A594B0F9A5808319C56CE0D271F3655DCBEA72AAFB6275BB036864E9F5EB129ACDE00D
+BFCE57356F9C7348E6461043901A12664A19176214E442546CA0E2AD92B4A76F1D4FA8EE2E78
+2806429EFD99F730D0A0FC0B3D94146E3B8100A202D20B43EF01D2A7352B6C0D72F57FA0F9F2
+C80A84933C3233FB134E545F08F5203AD4E9A86AB08B80A78AC2E622507B6B2B7B3ED0432D6A
+515757B02D6E1F3C1508F00AADC3D2EE15B5CDDAE5A3E1E45D7DC3935CF05596147BFF56A180
+7F8F6A9C4A1A4780B9EBE18711BD28FE3AFCC7107368AE8F59ECC160AB493D58CA2A2BA7F17E
+8665BC548E998BF7666AC6F41D9308A60169FFCB69D4A35BEC6F95DD8322F5772B97A1450947
+44BCFBDFF1AA8C9900DB342E575ABC306CB00CF58AD5FC1640948A9659C9806DDD807331015C
+F9F35B8F662969B4043C3B2803C8FBF663DC427CC5EC8A3B5D19DC6248576274745B1315179A
+BB1A22BD3CD63BAA4C721F3D9E0B0851C71CD890A00B758FDCE1BA07BA757AF53A8AFC5DE21D
+0BB65F1FCAA506CE41AD64933FC3DC0105BA561469A752B393354EBE44B6285B262626F0CFD3
+89EF8BF3FBC27DDFCFE529F9A158D3DE78A900A9C075B1FBA4A9463279A06E45A9B54D9217C3
+6EFF1260E6E4BA1B7FD4CE0B06E60254D5B9112D17408245988E9814B4DA07C828BBE90F846D
+6926AE4133BBB22FA7A709B24A760182A3F135186AD6EEA89FC4E8E4CDD22328818C33F7B51D
+3872BC59958E2D8E9FB8812597031B800416981EA2BC3D906EDACAC2C3F7DB135DEA0C089E1D
+F29D3058649EF749F0615371EC5C33B236EDBCBFDC2703FBABF8AB149307CA265EA2F31020C7
+AB90FDE03717D7F9141806EB0F51D8044608ABB461363EDA2C51E2A03E4438164A1ED38BDA6A
+0963D5C58B5B8160E70EF06F5BBDFA56362902D8825B7D9909267F00CBCA118D06FCFA297F96
+BD2A217741A12C15A38E2C22A6C4075DD242807EC7C8833F0FE3D2CC1D192DD6DEF423BD89D9
+4D220BE67EBDC5E051E015E89BB4975B559EC47AB22734BBA890504D2A182C565258DCD6D9AF
+F99726742D7D4DCD54C8451288744684D3DEB5C16CAE4A3D5E712E64EF5462B09C2FAF1EE71E
+9A9E7D59A36FFBB2F3810CB5F57AF19B803DC7DD74C232A8C16E6CC952298CB0EC833519D900
+50A2EF37221DD3C2EF17BA91D449F5585CD67A61BA5E50924B7284EB313FA38E722E40FF8C22
+B85614D35EACFE3802E09FDEAE6BD67A8C9F258944C0274E7132188CAB333DA084FC83B01FEA
+6960C8523EEEACA46F8A81D5CD76018F26B29959D4586DF9F1D37B10D33C54D8993B64943300
+D58C20810D420A2FB777F989E9AF40F73F1A2FE89269BA0F8CF7028363548E20A0F09163AAC3
+110EC78996C2988BC20912BD04FE1BB3CD8516E4D1BBCDD2C258B03980C399914D9AB61E67FA
+273CAA1003D22A00B732DFFB659F634E236667085830535B9FA3A6FB09DA331E8EC879E5365A
+180911204568524F45E0D6777D38BED818968E664FCB5D9298BB69009EDF7D417AFF14DDBEE0
+07F23201A728B3E350825F7D30D82601908B47973995152E920E0FC4EB9C6C7F23FCC243D849
+3BBA1CC6C48C34F2BBA180D46AAC7CA557D8A470503891A08332F22CE1878AA462D32D0D5F86
+9FA4CEC032E385A311475FE853BDFA237D80A3765EDEEA4955C8AB844DBB144684EB1938B7B9
+37B6BBDB35C6A240399596AB1DA8B1F8B76E1A65A59AA53E7FE5D99EB4F53EB86B828007AE49
+1CBAAE32239ED78EC190CD7CDC81A0EC4B09E9C04DF92733DECF8984A0860D04EFFA220CD882
+D27B6E3999690179C4B102458F78F61AB29A339A79D8063F547A588C8FEE8D391A660EC06631
+FFF44042C125E6F2F2047022D78CDD3C2722B1CF366971B03CC722698D3342A6F92D39423D7B
+73C60ACB78B3846B419EEF24EF6F14F6DE77DB07460D74C31B6673682884BF269FCBE690016B
+C966E9A7A16DA643565E7ED417B0DFAFC844282EE2FC8EED142923B4AB007D7FB72A8CDEA682
+CF96051AA111B16579E0C9444486525F9CF12359A6BAE88E2CE869A75EBFAA6C35F5DFECC810
+B8508B7C4709EE0E8CDE730E984C199A673BA85F51ACBA7508920D5FAE52FCE5089C5439BCEE
+F79EB48D8D6701333ACD8FDD10E156FB7C2FFBE0A104F7128F868B16149C7A280C2F53CBE2BF
+22E3C342F11F49D2BBE5F7512BEF84FD218E97B1C0B7859F412155279BC80F1F6F1A54581496
+B77C2C713FBD5B20785C57A0F4641FC0DF448D5E79F7125EBB17918C60385B79EF4345CDD44A
+4AF266AC009BE62A9A6CD0752E266A9454FC1AC6F004704BC53D6414161F40CCB4F4CC2F2DA5
+0D860E9EE2274026B0E84E110BE5D7198DB7A3330F02B913E11CA291B73CD0F9BA34B8272143
+C96D13138F99C05A24D0F6A75C71D94A10ADBB1A47813307A5EDF32102AD9D25B89A64AB3A1E
+6C4B87EC7416573B5AB977D672D9F6DDB48F710D4A4C9CEC91997C655276F25A00A570728709
+2A79B33C5B79A43E44E5B175F576791ABCE72E9FCFDFD126649F8E59EC3248B15F262A00DB6E
+A3327FEA2F1F9F12DD23EBD73953F8593D303518F8E37E427C122E43A87803EB749C7C9899D3
+99E98C44EB1BAB1C0D0A334EC3F5659014F2693119CA3D0FF7E78D1F263E8737175EF80596F8
+7ABA98EBBA1BA57615D71C738DF9C2059916CAB7F2916ADE2CEF7F5962D1A2973E83DC17B803
+3666CB270942CAA780D57A8ED1255C13F2EBC68F41A850A20F69FA7598E3D978C700DAAEC71B
+45542712F6BCE8E043E94680BAE51345C254978AA287707499C7784EEF7212C2B6455F2C30EC
+1B0637D6AF1EB17E185D2B0C756CDF6C3FDF6EB8F734012971B13A0CD95F38DFC84C965AF61E
+C31CB1830445F84A252423547ECFDA493A2A9C0F75FF5B7844764864A2FA724AE3DDB141A946
+14D8B83C64F08DD9327357D58C3FB4B5AD4671866DAEAA3664514A1322D62AB645D4192112B3
+738ED3A84281447597A84E0E0D377F881E5E02445EA5652713B4326A29B99F3FD64756F4C25B
+CE52A6015538BB7FC519725BE94885A5FB18359EF03D764A04F1B67ABC3567DA01FDAF7C7ECE
+65A10B249BA50EA113D5B32C9B0044B01D74CCFB2638BA533E9BB53E257949FE1F29D7112A14
+0E0B766A2F3968F35CD0A6F497B2A4585E1A49D6EF91464B8A01412F4DC4D1703CCF5A9B03E1
+0B528FEE23FBAE3D419D11956B65D8E9D73298817C207981940C029C67246BD743AB4FC15EA9
+6BD451E6C1E599C554AB55BA921EA5FF370EEF85C70B5E877873B376B2734B8E5A855BF00D19
+F9B37D882840394CEB15AD2C7D8EE6F50E1DF3682BF863B7CDA4B491464E46E73BEC1BD2410C
+CFCED868896E83E230D69ED8E27673E5CF7628597BE47D05139DB3CEC1083AC21347C57D27CB
+8B4085CCD54D50E4E7B6F0CB07A26DBCDB7522B5197ADC31E908079961D9B2D5D3CC0EE8055A
+D31DF8546E4E417F1488B6477833A5A86AB95F495665B34AE46CF8CC4C33367F462F426662D4
+99BE68D634F025D8F712FBA6A4145E8FB090FF5B61CD70E5550209C92530AFE1BAB70B715893
+BC3532B9EDD957279FD92142798BA005E3D6C0BC95EB6E451B078FC6B1ABAE3FE77855BD7354
+F02EAAC338DBA19689823399BBFF119850CB442E5B7323B356341A4AD204E8E05489CDD464E7
+FEF19C5BBF5B495D91F70525675E5591FDB276576D6DF322A1085391F89941AE1216724D6C42
+704B2C920AAB2FD78BFB5481098939A0B2C7D1D5CB8AA7AA31507A117E2E9AAE05CE84BAF157
+91DF6D594D62C3857DBE27335AA79C909E4C2C571E0C3E1E6DF11B4996B8BC9EAF76575BEBEE
+A7C51B2EB327CA1BC7684FFD06919FACD345D01BC3E1FDBF8DB5CDFECF107F7F5D5BE5E7A108
+E189A0AC6DDA11749FF6EB3773DF65287E68C6F1FA8FFDBA58B9488186234E9D2B0F8A2EA96E
+3C521AC756405853000FCDFCEEA528AEDD5E15FC8598F416456F52EF917DA951A0EBE9E6E863
+F6CB778E0A5BE95D26A5D47C1EF7F07C10F2376D1869E05BE6DB2553126ACBCF4870385A1B1E
+2FC1625B311752431EDBEAC958BEEFC8576C0FF32A26EA29D228E4E8D3D2B926150D736F13C9
+1FABA41A9C3818775A536C2FE073D5830617559F2EAF8EAAEB3929AD970089443F934E1C937F
+FAF9CC5EF69DA9E747BAF74D1279C82D37CEE291ACA600DEA23514A55A54E5ACF8805D52DC78
+C7E4D0DDC1A3D02772D731BEE16F452D9398043275A551A097670645A2A4CF093EC252192FD5
+59A780F79EF21472A10ECAD1542577C352B54256E11B93F267D11515056267DCCDA2C5AC2134
+C32798F5706223409005EEC21998752034A3CBC845885933BFDEE7D1CB32FA84797FED209590
+2E36BB359E0E79E78E9162E8F8DFBC9796423BB4B98F9A9FBBCEA1DD5DB31D431706D80C5C29
+64532ED8AF6510441BE3757F5D9B53B8D9FF2DC6CB4E1F8D1B47F553C8D6D1962E9DF2A97FBA
+979FBFB52F4D4CBA08A5A268CDC5A9A6CC40738577EC1836BD04B3ACF76E899655CA496A1B9F
+5C9472A90F59DDED0D4C368306F5E3824CF013A7391EFC56986E179C79343B763DA88DE7F1B5
+1E2756031154F752F7BC2A858EAA35C549CC24C932DDF0459F4CA70925ACF39065440C6B2FE4
+8018D07A0F5F1975CC52CE85F8C7511AE1043B4CB421F5095AA0E1E588412DFA0D86CA55BFFD
+F223EFC18D56DC7197AA1E8E08D4BACD388719AFDA2915579868B6B756A929B928EFDA008691
+458FCA9FC5086D0FDFA6EDF122606C9ECA9C6D0163DE9F05F97E904BC6B1E0F538BDD9E1E5A3
+63969EB55B4CAF47B2A55F27E9DEB5007942D2CB6A61AF76F7E3128B918D8C561C9A0510D5DC
+8A8676DEEA7B0E5605F72BBBA35A6A24D6EA143CC8900D9A6F7755501969F25C3CC0F7928AA6
+0E70FBB364CFD14531BD0B6B327A3AEAE1FB48C708CEFB4E369195ACB18A9F21177F868965E2
+CA10074FEFFB10269E43C95B3BC7EEDE5DFA60998E7FEC6C568433F06EB48AE53D26C262E7C5
+B349C64B493FFE2EE11D3D8CA4FF6B9CE4D37F4AD6765D37B3559106E3E80F2946E207523349
+5048F3425505466F32FD35255978EA5467FC8FE4F6C147084E7A46C493876F647BD882CEE359
+0D5B3EADEB5A72689DD0DB1C3A8B89771CFDF77D9637CB915DF7E0F8B1356477B35EEE547362
+E97B58190EF9B3D4F442FAE6E7305DE0356CF604516912F4787EC315071578AC3DA58AD383D0
+4840891CB3FA113EC89A2FA43E7CE250176A5DBCB516147CD09F5C11B2FA2C2B2D00D69FBF26
+6D9B2E258ABA75883D48D100E04650F17DEFF97BF4C406DFEAE8A6202F56C18310BBA393553F
+9BBFB054F5939FCDB910ACC0FB10ED21D7CF7A7430CCF97BE7FC77714DC4A287544DF41DB14D
+B5FBF780CF8754FA7422C3F57E62CCEEAD9AA3470000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMMI10
+%!PS-AdobeFont-1.1: CMMI10 1.100
+%%CreationDate: 1996 Jul 23 07:53:57
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /alpha put
+dup 175 /beta put
+dup 176 /gamma put
+dup 177 /delta put
+dup 178 /epsilon1 put
+dup 179 /zeta put
+dup 180 /eta put
+dup 181 /theta put
+dup 182 /iota put
+dup 183 /kappa put
+dup 184 /lambda put
+dup 185 /mu put
+dup 186 /nu put
+dup 187 /xi put
+dup 188 /pi put
+dup 189 /rho put
+dup 190 /sigma put
+dup 191 /tau put
+dup 192 /upsilon put
+dup 193 /phi put
+dup 194 /chi put
+dup 195 /psi put
+dup 196 /tie put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /alpha put
+dup 12 /beta put
+dup 13 /gamma put
+dup 14 /delta put
+dup 15 /epsilon1 put
+dup 16 /zeta put
+dup 17 /eta put
+dup 18 /theta put
+dup 19 /iota put
+dup 20 /kappa put
+dup 21 /lambda put
+dup 22 /mu put
+dup 23 /nu put
+dup 24 /xi put
+dup 25 /pi put
+dup 26 /rho put
+dup 27 /sigma put
+dup 28 /tau put
+dup 29 /upsilon put
+dup 30 /phi put
+dup 31 /chi put
+dup 32 /psi put
+dup 33 /omega put
+dup 34 /epsilon put
+dup 35 /theta1 put
+dup 36 /pi1 put
+dup 37 /rho1 put
+dup 38 /sigma1 put
+dup 39 /phi1 put
+dup 40 /arrowlefttophalf put
+dup 41 /arrowleftbothalf put
+dup 42 /arrowrighttophalf put
+dup 43 /arrowrightbothalf put
+dup 44 /arrowhookleft put
+dup 45 /arrowhookright put
+dup 46 /triangleright put
+dup 47 /triangleleft put
+dup 48 /zerooldstyle put
+dup 49 /oneoldstyle put
+dup 50 /twooldstyle put
+dup 51 /threeoldstyle put
+dup 52 /fouroldstyle put
+dup 53 /fiveoldstyle put
+dup 54 /sixoldstyle put
+dup 55 /sevenoldstyle put
+dup 56 /eightoldstyle put
+dup 57 /nineoldstyle put
+dup 58 /period put
+dup 59 /comma put
+dup 60 /less put
+dup 61 /slash put
+dup 62 /greater put
+dup 63 /star put
+dup 64 /partialdiff put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /flat put
+dup 92 /natural put
+dup 93 /sharp put
+dup 94 /slurbelow put
+dup 95 /slurabove put
+dup 96 /lscript put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /dotlessi put
+dup 124 /dotlessj put
+dup 125 /weierstrass put
+dup 126 /vector put
+dup 127 /tie put
+dup 128 /psi put
+dup 160 /space put
+readonly def
+/FontBBox{-32 -250 1048 750}readonly def
+/UniqueID 5087385 def
+currentdict end
+currentfile eexec
+
+80347982AB3942D930E069A70D0D48311D725E830D1C76FBA12E12486E989C9874C2B527F092
+5722787027F44470D484262C360CDFDDDF3657533A57BB16F73048BFBBFCB73A650484015441
+FDC837ADD94AC8FBD2022E3EC8F115D4B4BB7B7F15388F22CC6198EFE768BD9FCEB3446EE4A8
+DC27D6CD152485384EF5F59381FFDA43F2D20C8FB08AA27AB2015B774DB10DACFDCD33E60F17
+8C461553146AB427BDD7DA12534BA078AD3D780414930DA4F8D58ABEFD45DB119B10EB409DD8
+97923C6E705479464A4B310B58348C4B42393988FEF4925CF984423AAF65FEA9F0E64629953B
+CF50B919D968D99BD185F83112B2759CC411764E9BDE677F57C5EE5AC555448D5F81A16259DE
+D1E11BF4119D53E8AB07A802DF900D3A2D5CCC1C6876D29C5E9EFFB7AF3EF83400B0910C0787
+3A8C56FA7B1EB1BA426043B00CC95DBEDC6E136CBBBCB3F67509964F9F281EBF81FE5B018122
+EAF66C4A838487E82E186E006093042848A903EFB3469AB6B4049767AADB95C30408DFD58D8A
+10F4CB22168DECD9F3EE100F07B49AA44C92139B669CC312BA20192454EB2375BE6284B02665
+9D964B96AE82D4942E758027FCF23C25ED01115AF27CE7F20EFE2A822BB684004F20243A49C9
+E93301FC21B80815C033C3E2BA58EF53DA2157D524B395F2B37ABCA13BC6A2F42E824AB7E471
+06176B0D6DB267FBB795AC7425582DF2E3DC55863468A9200742BD7B552C48F8CF58BC21343B
+D3B95ABFA140F33F37C6F3F78B0D8A5154EB7C1F62EC598267F13E841A3E64172663935AC8B6
+65D86540D316DDECE329C008049C5E74B27D59022C5515059BC3B89370B1BC6A169C888BB325
+E0B74282D6F053A50DA4024ED1E433271A32AB8C17D41C632B41CF9F3ECD5FE124DAF7AEA7CE
+8A63047B245822930D517DF7BAAAFA69D2D17F7D93CEBD47DEB85405D720DE0BB4DCAE731A8E
+27BDBB6E6BE38D168B7DAFF815ACFC32CE367374BF9FD98C0AE5BA1BCCDB84D94B5C173ABC92
+F7D18E19A68F64A2241A0A1639108DC46B8A04EAD17662B7BBFF3D3D9A95D5937698573BFAC6
+4973DC8D8B8D9F68C52D0C133119ECA4FAE72F7553D276C817003234A98337D7C037C0F1BCE8
+A80457113BCD97515C002D20F836FA086A3277727873EC2B64A92BEDB01193491134B6692A08
+DE4A201A3F11DBE070D797F7629AD487D2B8DBF89A0631956C93864A4460AA3BCC8EC6B98DB7
+5209AA1B4A2E2B1B9866CC7F3BEE4E0EB0DD68627A97A3FE6141FAF10A2CE00391796C5438DB
+AD93FBD065D1ED7E8B7879E0D1BE9AC145B9AA91756EB6EB81146048072303229CB8DCEB133E
+572EC8E2BC954BADCE75356EC8EA0C7F76CA08533E874BBAEAADB89D86CEB974A52DE0F9A434
+80E5076265AA6EE49ECC896182E6091EB30B7DA8CD0E3A26AE7FC03BA5C0D56526ECC6F2D6F6
+91D84DC9E7DF306863FE0B6DAB3CBC588C28292DF3F7A47D9C4E3652C72F6BBFB3F4983CAF59
+C7D877103DE7AD73F95A100AE860B4E55814F00A7026C306E85B8A48F8F69CA48AE710950A2A
+1F2892F31A3849CF917002086DCA5F66B84EFEECADAACEB33A0932E394A5E17628D52E725FC0
+C69E8B00C9DF81DFA32B2970756D947A9F56831B19FA3A2F2795017381C05919032FC19A6B8E
+D2D0188DC35923F486A62C8AE61E0A5BC681A57DC20223629C0339F67D689B63D842909188E2
+CB82A4E0471B9F17CB8FDC6A6D2C3AA6FEA17A756B4D4860FB72B50CC39CC7E5329DC202A5D9
+0160DCECB7ED07B9CFAEB7E766887C9B93727E5DF348FD2F5158A2424F443A8C72811CFC9CD9
+E2CE8219667D7364E85BB01D8CBD63CC11533CB0D14B793D5E1DA99278E636CFE6A34AB61D46
+44DFB5939746F67C71EA1632A43F457583D3478D159400E04CB7BFD0011048ECFE912EA5B72F
+6C01F941C78CE1FDFE23370848D6DB1C88D27C9118B3C8C8CF0BBF33FF12B509D3594E187F52
+05B9E96F9854002E8944B8126A8B2B41BD572E7FE727B10441F3B4B303FB576084008DF04128
+F28A3BA5BF987BDD3AD278F316615D70634C47E6C924A9CC634A249D1D57DF395AFFD6B0C524
+68061B62CCB46EC8CF95AE99EFA5DEAADC48F433ACE21B45CB502F37F06EF95B4D8880FCE2EA
+E511E2F7130A96097066127391923616B95EB7E3D70CAED613BAE4F2D65E6AB1F81D63745FCF
+A57A9BC5788BD1288607539A0EB5D7C139FCAC70436ABE12B7D57C1D915C3AE1575CC7EEDC26
+297231B8A510CEECD3F0B291782BB1C342BD44219F004AC2F1A869F1448354BE54DD59CC8CC8
+DEB38E3B8F4899845DA13CCB707CC10D715B01CF3D7D3BD1246A449F90E96D40BC79F879B7AF
+43B7A09D9DD4884F7563910E4CDA099284CF094D1D0246583B01F1E687F0A365B463E7C7B4F3
+70E924900712B02B20792D0DB404E08ED5ABBCA0F1F447292857A96F3F73CCCBC73F223C7FFB
+BC96E095E349CC72D2A37DC40D196FB55782050E83C7097617FE0D2C663D32A7F03460EBF9E1
+904A12877EE0D4A4053BD5B673B3B65BDBAF76D7BE76E4F49A0C0912A87BF7BFEE30BC1E91A9
+55729D55B0691D2E573B7CA693ADA3E865E87F4C48122AB163919CEDEEAB29E83020E4391D59
+00AE2FF0F086AB51FEA2FBE72549C4CD3A674C8EEC28AF24EE314876F4ECB7F161CB9F55A2FD
+8611C48F3E8396DF873D8EFD9141474A86B8906CC01736588436A3636933ED22C8B8D97611D6
+26BA7667B33BBB0DDD4EE1FDA2E89A3F03A18516456C029B96AB181F945C6C81990E19A732E9
+ADE2DC846D19386E874ECF08F33C48C812BD31E6056FB1ECB4049E6C66A5FC814A77709745E6
+9A645627D45362E798F3336BD9996C42B37134CCBD6A4BBE9D938DAF6EC6240A4C4F4DBD4E68
+1C77127B4D3DCBC7D770AF6FE20529F19FB6B332D0B6CC01B4E4B2ECFA05F2F768775B311574
+F662C4487683A979D3A65E824E55EECBF4789664EE971B374F62F34918524BF9671A57C8A7BE
+A7518A1D5FD3B27A5D116A6B0F9E3A9E4CE276A5D103FE6A4FA0E28B6F68F5A4D89C032B298C
+B03ECBB2E1D94A4199C6255D93BB029AFAA00B7D6E658713FAF433F2777FA3A0AF6F898D88A4
+D32FC6C3E0D8BFC67CA1AD7B9D6FEC4A2A99325D83CBF1F6165842FA8D033D7682EE635A5DC1
+185DE824BDB8EA5BC7F3BC046E83527228F17459BA440F783D08F1DD156DC0BEE9E8EAB6F8B9
+950C39DC03000F0488EA4071047ED99C550FB8AB843AA639B6289B7284EA8E69AC785AA88066
+D9F3D4090D01878D960DEAE07C2A13B8015556AB50AEF2BB8FA969764D3CB40AD44D5A9E548D
+E2BD511FB8E38AD40181ED288C8FF88B04120295677DC6228939DFC33B7764BA80C32D4664B6
+61D7407309CDDC605428A7F4CED1F86708466E0BA2F05D4DD7244A803341D0B0D86E48DECC59
+25A75DC331472BBF13E3D024B85ECF438073303ABCA65B8309BC57E64AA97C244F6B89E82B17
+F68D520E28182F101116F48A34E349107DCC6ADD53F2084CD42720E35946F520E56669BD5EAF
+BB02185D6EADF788D2AAF54D2E2C2ECACDFC7C91765BAF663BE838114B333687A1B7DBCD498C
+8A28876426B354E6B5556EA862DE3C0305645B75235A32A2AD5DA5C9B9CA573D6C88A3CB4CA8
+847F60F731454F264150DE6EFDB9BE02E6F5B868DEDC1E7C55F2C46F99F80AFE84260B4D94FC
+5947754F7D98E96D932DD3D13E78ADF22B9A06360B38E7395B7E2339C07FEA445F16C2022C0E
+B8CEA6EF469AEFBA3A398FBF747F271C26E1870A86732E4D23B9BD9A564CAB079620105583FA
+E5EEDA2B5395E39DAA46FE5865D29ECDBCAB4D5FFF236CA8834777B0D1CD347DEEA5EFA2F387
+006125E46AF358867E7CCA258AD4A5222373749041225381D44BDB3BFB3661FC5CB3EF365444
+B2D19559411E3861C3468AD08A3330D842F16439E1C7CC62F639EACE059BAD656B292C9D8C3F
+F72FB53CBFC7F942A57C78A9B4EE3C531413D57C2EBAABF4F32956626AFCE2BA1F7FECF1D36B
+B77BFA4DEC303C0F3B0B011BF3A079A32DE973D5198F82771ABE8017F9D0D40473B996CFAD73
+A36D4DC52BB211880E1924CF30E191C1BBA6FE59F54E0F0DC2471BF45830ECD99893A96E136B
+1A45EC4EA86E357A5A8BB49B2161AC9A7472454D5BF9748F34177036D448D14BE4171F0B81DA
+E7008F0C3ED828FEB647F0D06661ECD3997B3D87648CA02D3B6BC5AF94CBCFA12EA2B41DDE42
+B61DA7C83CD97B66C7C0EE10EF0A4EC5E063A24B5AE434C55753E6A8245A0F745669801755DE
+324CE91D1CEE35E5B44CA4D6CE8DC88E15057A20B14035DB0B84B4E9D938F68236992C1A5F3F
+7620D04972807F8C4FBB3A610B5E3C5295E2A34C14504E2DD400019A770A8F28344B981DC493
+976B115228E575B89406EAEB7FAE63933FD79FD29A1A489DC4B5C516F09830CF7DF23889ED50
+2457176F21D1D3D192EC42A5C39E7D301D4BD47CD9B56191C5CB0D1923AE941B336451EC95B9
+519326AC3014798A56C22A9CB24FDDC6C46184F14B6068854D0FDA7192F97F7B783B7F51053B
+3DCFF411F4C965649F7E61880B194037C6C69CB15907E7989F4188B1B1FA92CCB2EC1F43DD09
+6B3B1D991DE5882F43AF1E023F2A4437F684757EAFAA011EE65F1D9507E79C44873366253EB7
+84CDE128401BCFFCCCFC56DC8900376552F45397EF8F5D40D5D1BEE737C6C307A475819A5D33
+7F4B02BF28461EA571CDD79F39F9491B37108525EC550E9D8A90AE63D56A1A733CCA38407505
+C1A7690C67529EF6E51E117ED62274135F8744241CF456F827E15D512E78DFF679A117FCD7EB
+45D7818BFE675607F002E8902B6A179B4210296EB19A6B5BC646371784FF5137220B6FB81DE4
+5FCD8901A4A0FCEBFCED40F456F6F09D59C66B0BDE0EDFF2070D64B1EEEAB48C1885A939463C
+4ED7E10D194A31F9859D58F160C881C7E7679052EF3D0BD0037088C5BE74CF9CD8B441655AC4
+C21C063D5CF157E63D154E2A3C0FA0A1B796B7EE86207252EAB2A8F6BCED4901CFD178EF5B0C
+BF5EE7CD9270AD1B1055025C14AAA045A9C2D6F01A9AA133870EFE0A7FC63104EC2B4AFBC027
+7013E787E82B9581B38E70F585F4F2E01E4E7804ABE534F97D8F92C460A609492ABAE7D236E2
+70CA04C2E5ADAEC2BFF1F219208B2F8BF5CFB5F13EE94D3B9A601DCC6D9AB03EF624DDF287A3
+A950856F44B3A31E54D64468BF8BF92F4432937DE368FD31D7A2E0710CAAB3D479B52105E910
+787A4C6A97C11496550971442CD159755924C31ABDCEA68A874A9C6529DB2563BE8880576C07
+7C4C5A20262C89FF4391ABB2DFCF24500708D191BDE0FE49FF456AF3D8355E56B0729BFDEC11
+884ECCC7CC061B44F48766D6C2F31793A5898A8F5900587995A2A19FF4619131F5E665C98C19
+1C2D6F9511DA129C471823E78138C038B17314B37FED7AD3190C938F040BA89E65EA6DF47460
+6138937EB395AFFD6CCB55FC0371F8BA2650CF2846015A912D67A848D29B06563A76A65B5CDD
+EF34D1B76DDDB801B3CC0B910B8487BE26DAC3695DDDEFDED0347228D046AE30B64637C3DB66
+35E697493A0E72AE1C2CFC611BB42F9138F608DB7DE51CDE8520CAEBBEB05A29F7578395CBBA
+7B01DCF6AE7664EEA3DC1554A62028DBB478A18F6EB6EC084917427CF6D40689468406C923BE
+93E0A8DFC250DE798B7211E91855FF7CD3DFDC9D0F67E52DF1AC3C2020B593C77E8A5E6FC3D5
+7AF2957B4F876A90A9493941F316AC9C1CD05F73C1301537574A7EF78D73D23C31C1D4689387
+A2D4396185442858A745B98D81F2580586C88D6CF54AEE1517549241B59292C8DA1F6FAFC3F6
+1F2E82315ECF37E5E8306F4FD0FB4B4D0BBDEDD2BA55ACA3EA3EB02705571DBCDF339F326842
+0DA8A59DDBF5CF721D9BAC5A1BE8CB3C0B4FF98D6B15A2DF24215EF121CC06F4700F2609C817
+C7C4A0659AEF7C646DDF125E9ACE18348DA6770D3DFA3B9486D9971834A7EA6881368A9612F5
+293601FAE200974434D1C24354AC8E9335D5DCFC27D447CCAE4B0923CF15178484B24C944FBD
+847A64B146D0F77DEB7665247E855C600237B1E311FAAAB4E80A2B8058F6F26054D111E94142
+1A2A143F3C4106A506F844DCB8EEEE5ABB05C2D0B4563C1D1080B42EC330D3DEBE87B65D9FE0
+A684FB5D125F7EC7ADD81FA8D82E938BD2AD25E1DF6E473BFD81659317C91BD2256FB4164888
+73DD9D67CA6D52BD2C5524903C68989C3F5132F029EF0A078B8C2DB830186A2DC9CC47B9E6AD
+6AAC42FC7A12BF5FB5386C558A73DD4AD02D7DD4FDAB2152B138326D968EF837B79A3BA3C0FC
+A3A629D8143DD8B974F8326851AFE08BAEC65344751A2B076D71EF4F49148E6FC9F3CD520645
+604726239FCB202117EE1CAA906E37AD6CADB6AB92B1D31D277FA27F6930ACB68D128CD0AD70
+60C4960C4B409664C8580F1C5F3B93E673A74B8094284837117A644F0CA9398FDAE7CBB29DB6
+AAD38CE5CDF855E84B3794DEB9362E1DAFFF74ED1E87561A4D33A7B6C93D18F231ED180B0D11
+2D789C9E7B35B31EEF4D5FE50329D6AE3E9324DCD038EDF01F1B10E249CE33E8BC8E77E84483
+96FB9B74B316EE1A78F2463AF742CC468215923BFC5477A74A353A3CB7286AF8D782111B09CC
+436ED7E7126E5C70122E81142DA5F1056694F2CE5D5706C6C3DD6384CC42563E5BEA094392D2
+876486F313B8409A2A03CE6718B7F5A58A6BDC7D7E3967D6F7D2F2A1652D578C0C43438B67F2
+E67AFCEFE2F1A031330A1337D7442AA8D15A4B1B0DDF56AE3477599A1C04370BB06C5075A9CD
+D5D9A6BD26B3901F46D90B45098E5940B44BD1485840CB585B8B8BA7CD45625803FC1420C850
+F434E84DF2CDB1C6E2B48716DC287BDBDE64CF54C9EF6C3DF4BC3452798A72DF4C2AEA80415C
+9521648EBE5B65ED763B5A393AAAAC1227C1E017DF5FF4F2428423373BD6D5FD39D90599D30F
+8D39740D6255FB22ADECA70C5EC3A8F87A59EF93EBE91BFD0C9AA2BEE6B3748B3914752F0E5A
+34D2624FAABCD7EAE3D4051B088C9AE1105B541DC62EEBFB0161D05818A73DE9606A3BE82B2A
+37D1F7F22CA33F57AA00A40F3189FB57BB46658710E278833C08F3C5D428BCA99ED499E1B3AE
+16892C9ABAAF45E29C7036D1B0EF9F17FC51399EE7E7BD85EC424EC4AC17275D980FFD2EB1BB
+92E78B2B38868AE908740E0CC26F414334CEF4E8CF5222F46E1AA40E0032E59FFCBB395B4ECA
+2573730D1965B2D4939F24A154B6E44334BC0C465360BC2827B14E03E0F428DF065E9F36D256
+E9A76F41C0F81747DE63134EFC9CEE6DDFF528FD0FE979237FDDA7782127B2A44B2F97A2611E
+FB1B03BC3846CC19C86330F9D2B4B557D47B5367D597E4964257C0109A26DEB44CCA07186DF2
+D26769BBCD6BC499B3717D6DEC05675016943C69EF60BE9E2A004340202288D22D6476A05A27
+FFB9A4C7A2AB606619ADF733C05C38C80B1E2300CF34A1E32213B83735EF20991D4C487472B0
+571AF8F33EAC2B12E0F302C63371A42F1F27DF2027211D6ED6EF86766E35151B67AAABBA4B46
+9F5F2164CECB46FB0866EEA5480B615D6F9BEC31CFC9A898148363C039BA8DD87FE65F1F9C8F
+754A1D38B643BDED590D7E4B45DA77B64FDC835CB412C5CBA906DC46A7C9D3584B4EA5F7701F
+257DF04B12274B3833957D2869D52433EBD119E69278D93D7423C0AC9AF9DE81B6CB125C02E5
+723C495492060D6CC6B4BCBA6033601A6BB3131A474BB29FF433A1F3FA9EDADAB29F591F029F
+ECBFC5CBD578BF738D57F8AC962C6C4196FECD4CCE3B8679A2B805E736ED48F01E027151421D
+1AC18D5473F299FD612542DF45DF5E8CDE582D236BA5A3A7554C7111BD2D9AE4BFD5D53C025B
+BB737716686C68645C01327F7E91AAAC5FB9B31EC344CD1BE4427C612F3E397C8C9756C7B30C
+D4A31FFC6EA5C0BBB2453D2FC5AF8CECC5BF27F3D22E919E9B4C70BDE1E55A39461821B30266
+B8DD029B63683997CE276A28EB79E52DB38E3E00FC6C9F0C98A2ADE2A3FCCF651329F33E754A
+A2637EE13D8F0275BD9E3670E9B6DF5E5C7B60FF2E9BC284895179A6B54A6501B09C90CE1F53
+7B181DB63CFA3502B27699C0FA32BFAEF33560EAF17035A22B24AD1A92204835506F9AB0636C
+7E1C4B9BDE7B1E3C85A6746574082D5A66DD35BF0925B91BC10F973B607D990EA83AFE2B43D0
+D12B61D5246A4B2E6399C626A2215C6B477B33355DB9977D26F0F4E0E750EFD66855852780E4
+70DAE19BE56CCAD5DA484E8A1405860F582219BD238F18084A13DBA3BB6673190846660FD16F
+243A0188B6626FBE383F47C9D115AC75810B9FC34F56F4B223D6ECEC3CC04A64D56CC48029DB
+AD5CB5723F037904AA357A377635B0693F08BE60F7AE5E4825C939A53D481553C1E5A5D57DF6
+073D9E94E402AEC39387B6534B10D27E16A85F20F20D17627EE9CFBF60CE0B42C6472C7A21ED
+5FB251748D454C7B7FC51C447C6AEE85E84FD3112EAFB348EC75D99D8FE3F1942C261D1D8FE2
+1CF2D4A7350F05B983594E1F47BE21E1BA9A263273ED14B9161B494D50B9B9EB5FFBDFB088CC
+1CFE9A639A8E405BED650531A96D1C3313617FE5E0DAB14A2E3E95CD4A0B018A08AFFF8C5E0B
+9728642B9BB9905689CC6FEBD1072CC9881DB5BD7F102BD4CEAC2D861F3AEF8F1E24DEB48A0D
+E5C10011828BF7F0EFDA8992F6EC5C053F050790739D0D9D04272FE9FAC41B86562075AB2030
+C9329A89224DE27FA74F61FD49D8CF7F13F0A5E69600E075A6090AECB2DB740A6507AA28A7F1
+57B20558FFA64A4DE9DEC8F877EB9DF61ECE54E3281AE89C207005EA3C9F5E64F2966BAE9DB2
+21365367B95AD4107A842FA8AEDA660FE530D0B37E5B8E46A2956E7DAF0A5231E33FB6D96395
+CFC427B7F6866C1730BD33BF55A4C43A769585D54699B5B956751B6E441ADD82A2E5ABD2B9D3
+3608E9333F408B931E77D48258415A789435EAFB9A164E651162F587565CC912731A5F840D03
+9CB7EA0D281A34BBAB93238A449D8E8DDCF9B36DF3D8DD2DFDC5278B98F0BC3E070E3C354A3A
+39F9A97A92397D6D0F618F522A600035529518D6D90420A8D79AA2AA712CADAFBF5DCAB8E183
+D4AB84232717D60DA8C9711DD697F2F46A2223DC3E48008DCFC18618C35D237FC2D7A84F709F
+D570BAD4BA6D5BB74835E3540746B0535F04EAC2EF06A74134742AC32E0C4D2A726EB4155C23
+3275C7348BBA01064F695ADFC933B502006D654C2B21213918E177D3E4751908A3A6FEB3E612
+268DBF27A6C253738D34396F50EE834F075AA4AEF14FF3A3BD5CB25DF06253212F75ABFC9BDF
+7F480D66719C3A5619DABBE3EAD77F6AD80A6B7A6D83AF722BACC170293F9A5E51BF9B4152E6
+4DA40806AF4417E4FD9308A4D8EA2645EFAA35B30A6214DCAA83E2F531DBB02AFF7015EA1149
+A333CD619B7B614BA3B5069ACFD80C2D4DD5D19BAD17C3AC5FCDA1818719A9CAD9913E187027
+7B6383290E27702BD87E10AB54B531B0A7662398585F7B67CFA1EB1E252E5C477025D77AD4D9
+D7D943C3B5F6127EF5BF7F422CA9AF4A648E4213E1D6A9B6F02AE5119F91385B93F00C438A27
+ABA9D0D1E52AF1CAC6A56C9E2FE7D5D37B9EFC4BAC853C23D07531F8F7879313247F9A978468
+5048DB25AF1CC60602089DBA16F25E9AB0855D83BA874C00E28ED5633EB234EA457467BFC887
+27A17C570FFB595ED41AA2EAD4D68703D0D70EF899E43E3ABFAF95447349DC61EE1F070E8F5F
+580D691D80913A1DE2EED591859D684670E5CB9E3CD6354DBB51F66B5DB8469364E709033D02
+C5F13179E5400C71A9A82FD4FDCB5DC94E53B116506B41EBA9B34741D3B5BAC7468FC68527A1
+E51C12A45DC6A61C55B21CD9F8C3FCDBCD037044833BEF5B8EFEAE27A1C406DF2DF775BDBA2B
+055C86BDD754577C83632A70D63023D3A80ACFCF501D3407CD7B880D7BF5C9A6EF55F643AEFC
+6306BD9080505AB7395F809BA5BDC8CF5BF56BFF4D2F2DA56425FE88211CA111426425D4BD5D
+1D606C1377C2EB7014A6EC0392D74A059E5CA21BB6C505DF776AAC0704488DADC008DC89843F
+73806262ECB38180595CEAFC29311113C41E8FEC8A6BC75A4CD616A02607B1B0C3F4C2423C98
+F45B76ABB69CA4E43F37E2F3CBE32A0947B8FABB8664C0070D72B4A464381DCBAF741319E659
+7D5E648BA2A11F5B7CE3A45A83E094A1537E7E7DE0150210A675EA77F9B563423F71B2221AD3
+FFF529649172CCE6F6493AFA7D2FBCC812C269309C426E8570C6992255BB8CA8157C9F2958E4
+C63FC2CDCCA1A3EC1AF935CC9C35B71CF779E87B51A16DC602BFDB4C9CA1653E1BD1AA6DACB8
+C038276107AD61D6E33D65B6B98E28091D4568B49DEDB9E9023F2977B4FE952FECCB1ADE607E
+3C60D74DE8662C1A08C6C4F6A8E50F91C62D104A7812DFC67EAADB90E674686585680A0F2EB9
+8CC92A793F13DF552E6C695623CD5F161A15807FB396DE2C4B32E0E168D765EC0AC448089A24
+5B65FEE72EB77E1593EF910B1750BD29BD0DCF35890311254BE990D9E4B558753B34600C67F2
+6B24E701287462CF8A7CCBDA97CFE5060A8C36F8CFFC8A50555C576B443D6556E14541F7C5EF
+1B6E11CE520946F91918E10E90BA750FAEB158A82317039AB53ABFBE65B0D3989FE4128FCC22
+124E162D559F03AB07E2FF289087B48582428CB9B124BAEF00A16D4678C0708BB70F692F8ECD
+4D417B8DA0371716D3B5939D56D8AEC084CC07D0FF21A5F69C1EFCCE09FEE5466D7944B1598A
+8152EA86FD11F3FD1FFC2D0BE04EC6C36CFC39CD29DF6F32E4A030548333EC9C9ED69471A989
+368488364FA7C8D83992D35E01868114852B9BC5E66B43BDA19F82102261426FFA730C327C16
+A92C2D840BC951183A666C4761B2383EA8698B5740671142E07B5161B7988D39239AA04934A1
+928EE775D311C59F12D3BEEF3CE7EC9BF6DBC9DBBFFA124AD23568747DEE4AFE3310D19FD2F0
+31D782E4FC8980D315FED5BE69715AE90F45A26D5DEF008316DB5237B6254EC881F5F42B22A7
+70A9998430DFC54E223E1CB1F2C3CC21CC968C3A9CAD2F935699129A0B05E76D7850FA8F630A
+6A76B6B428F022C17F7E72A0AD107F044CE76574ECDE1F674DEB9DFCFA5C860F199490958B06
+18F599CFDAC6B2FC5040C32D1632428D250F97A5E5C686C2767808C71A3D6E86F619D651EE5F
+BEE3F6EBB220CF2E34E3D0B7B9EC38F2B0FC78085867579D98DFF2DEE6ED400B19E34237FCD7
+5BCB901F2E6A3DE5D721A239BFB003CB4F5C58DE63E8F7F8A6647C06275236ACB4C1199EF950
+EE7CC5FA7B0CBD4852B3062C1CB39137C29289A42CBAD2BEFB0116F948EFA5637F75C0325848
+86F85008300C3B12E01D9B15E5EFF2D44FBB3C6FF28694298FD8F8DFA6817138DD586FA00D0A
+D7EBF5CD8A63949B54AC4D90FC8863490561EACA5207259A76E3EF1890A2B59099C14BD58F42
+CF224C34F1305F4E30E9F12E7AF0519E80938035A2728D433D75211C73B9740EBA4926B9676D
+874E41953C4E59A48579D3ACC872952A65ADE2ABEDD6128CE9C40B058D126C68EA0D40B0A081
+CE1604CDD5EEA12AC901CC12AF8771E39B66487A9C94B35D882D46C5F3C43BE6AF8654CB09EA
+74A24A58CBFF5A25EBF7D98E08DB4CAE7D71F112503FE689A27D75DE94B94D7F0A8F6F4F9CC8
+29C1A441EBF4A22A85FF6479AFBB1A4252AFD7FABA9B1CAF518F1A2C67392B44FF9E173A6621
+8C1DA8CED86B17861052E3F9B758D06CF8864B7B8B7B55322A5E50629229FB515754697C0269
+41F7AAA8C6D0AD6682440A4908BDFF03C4D413C3A7353F6C9275788610F8C8340EA671506F17
+4EC79EB0EBEC7BE8E62470601B32ABAC9AA3E2678367063A57CD950349635726DB14DE55B488
+8E481DE009CCE2676EBC510CD94A12ACDA187D096ED6417AA1E8B781299CED175C4243EE8D51
+E1AC2382FFCBA41F49D19F60761052E59B75A2D0D4CD2EA45B1859CF449B7DB95FA7311F52EC
+28A8D028D2343A958DD54500756D2CC13BA81E72B69F01DBFB636C9299A2F0D3A147740AED1F
+D12C59B2D7D8F0761A86B140D3545F38A21A8D6205A57CB7160FD7C5971266FB21A518CFC331
+39AFB70DA7485350EE8FB0134762604617AF0ED255F06616DE76569F48A2474D7F56A1829DF3
+0034F290B30E3F2B34C433C11C1DBA265059490AD1704DA42526125EB03298F86C56495FF67E
+63B06416A7B4FA2C2D086FB7E9A7EC218DE891051219E566566FC1B9C16EDE9FD2293183CD29
+16E3572B0D770356EB2BDD7FD92794C270D364D12D14DB02C65A6E6D636C8DC0150372FAA09E
+488E28525048EE8A866FE1ECC868F6059597225BB1C588A12349996BFAD2F6D0131F04185E1E
+FD125A2B4C4B8F2C32B6A307874B0D94DAA68CCBBF71D8427FBE1ACC6B3B279A52AA66CD6F5A
+5B1E3DE70523ABA543F44074A6491ACEFBC6DAC617F805F99CFDC01BB5DD8500265878FEB2D4
+E75BC616D30F63D11EBAAB94EA65A4BF64A484210A08C0604BF0BC0275899F5AF6D217B914F6
+AC9AA108F921309F9580701530CA11E8B5AF77D22767151FC64BE8AA6E4EA7B595E7AD726ADF
+A2872D007EBBC41EDB3380CED9743A88424A665E37B941DE405DB5BDFCF89D4F8BFA6A636C97
+3254709C81BC54570266EE5FC66FE4717CCBCA5CC309755E8AA8915E16E4C3D032E2D295A2E3
+9F81AA5E712A29DF3D6F1DA12B51D414E60FFDA3499CBB74847210196C06FDC32A42E3417319
+8ED7A9EEE1CB52E97C221C79D0BE506C6C8B493EADA00E172112B0B525E9EBE24A081518432A
+F7BE557EF7F37D1CC2DF1E86AF4EF353E8DFD731EEA986E5C203B343320BC3D35F4FA4423FBF
+CBEEB1BC75F27A40F4D9F5F5282828E9545EF54F5BDED9915385E400BA937594325973069070
+71E72887D2C648989B7A4183FA3E750FECF13B04FDB5FFADA6DAC6DEFDF7CBEEA85EB154EBAC
+F8758A185B3EDE6F3BCC0CCF0A878DEC6D1121198361FEBE57819539E575A6E0CD675A3535A1
+A245CCE669B1C31D3E87998A956EE116369CAB04EF8506ACF9E8BD2E4E43BEBDC9A067C4F1AD
+A019503E9725E1C44BDCC4BE132F5BA29B56B7E281400019A9122D02D49C768346D1B7E30BDE
+6E184E0107507C10C132939A052E6084B66B3A30B6F4E855D489F12C9AFCE7714E68869683A5
+C74A5697CF1B4D4B9BFF4E9098E98FBBA712E4E717EBFE6BA439CECD1A99F6C372D264A4A255
+C3B99A41A2F04DFF796C9EECCC20AD43B5002E8E3CFD9F09831F4F02F9327E23F291C755D3A6
+E57D012F519FA46A63B32FF9A98C3640517D077EE1A472CD000A80467B28027AFFBC9904D19C
+EBA6FAC4F1EA359AF2F3142FCBD6C28C1F2B2DDFB1D6799888DAADFFAA52EDFEEEDA38F3F94A
+79C79507BDB7782C779374A9BF2B0CB7FC5A216CCE50B8446FE894E9419E3EC6F37817CFA6AD
+52434F2415369128209778A9BB1A81EE08E4F0842BC8CE8890636D6144E9BBB416344D9DEA5E
+65719B332F66F9CFEDA829FC0AEF7919253ED138C92C0FF7BA23BA9EE1841A4491ECC983B1C1
+162B30B75F8DB608CD41FB8FA402AC96CE57D6E27060CB88BCB47FFF9132B63814964E162EDC
+F06A2F9452EEE25E1DD7340FBB273F1759BF9FAA1B2D252563A97ADFB26412C605C2C87F5725
+753497293A53FE3B708D2394E19BC998AAE5580A62BA5924A00C90EEF883A69C3310C64E52BB
+C41B70B89DFEEF80B73556FAD1D947A079E8D0BE5BBDBBCC689E6C379F5F6430E44D937696CF
+99C6F3A226E27E567D945BAB4997BA2A7C04FE4D9C2CA4691B687B2EABE5188E302493326FAB
+C6B5876541C4666A26B3B65C228AADCAC6BC98760F3D3735B89B2A2E3D43FC4CF6ACD11C96FC
+6C3610ABDAAEB5FD4C7FEC50474BEAF06684A49B6B245956FC2936A68551DF931353C2939326
+36FDF56F0DA797EC113DCCFF2E3409557028151EEF5AC29077BB032800F10E47F79CCA5C6F5D
+D75FA56638FA4E59A085532C7D830808B122DCA20D9FE537A04F5279E6F96AF0F0D180EC5243
+0438E8CD1A7C79CA9340C0639367FB2AF768F36637D67F7DC6C71B14DB7A35C567A66E460EC7
+0B91357D13AC281D18617A861AC04A6B73608467999B1DB7D06A52832482FB4153D95E6AD9A9
+885137C837BCB0D9F2AF4BBAD66C9AD04265A9BFD47DF89D6E2E990DA21CAA3883B815F541A5
+9FCCD6DC47830E5E32AC631EB16E1784D94F5A31523D31509B4FDA3F13CB6D0535C7B9D5FC50
+EAE72B74C5596E271CFDFACCCBB66735C67C32560667A2AF34EC48F09C574B30D4510E8BEF41
+E6EC0DF52C2B26344B9EB25501BC1207C24B8844DB1852366A48A991C345A8B1484A19E7AC52
+BF541D2F95EFC749AAEB3859E9030FB12EA35ECE6739FFDFF7A6809848FE1C04A6046CADB0A1
+2F541366B97451BB8D3AE48E96B7E97B5BBE5ABA1B460820B24115A03DC01721F7A423650DAC
+1E6C305FA5178FCAB92386687B1D1ED0B07ABE6E80A7A46143C05D8A9C8976FE3D1761C05766
+12CB9AACB370ABB8352694514954D538CA0F19197EBB5A93A2BB940FC8B5256B183C769D382F
+61B0AF9C9A98FDE7BA8BF56C4F4882E0209FE14108BBBECBB8338A768692CE2499F2B612B6DE
+3D617D16B5AA3BF42ED95A2B2BBC438461FF8136420417E2CD2B1A8FF07F1FFE31A9DC926D59
+B968CDA1E6946260224CB22E598B1452AD408C56E8D085F90404DEE4FC07062C72BB12564162
+33385EEB99F2B67C5A0D6B1044D29D972567AB47FC55BC918A704DDC2F30F12A148E660CB724
+0A412C6FCDA1A34B7B8AC1025F384C41CBD2773FA11A868349DB8EB97AB311220261493A57E2
+D48A2492A23F0DD6DE1F1A3D84F4F665EED8A7163C7A339D669ABE07A854E4B614C126CFB10A
+E94E76E20C0B855AF9E96C46BE1DCEDAD02CA27692F792AD423135E4BB034395C71C6A87BB23
+A549D63823FA513320AA22C24CB1EB499F150BE279199BDBE09FA0E5D2B0394FED0CD68E13AB
+B329304424D14D1BF7C2DB7D5D78F7A857FF6FE7A9E121D3BC71D3E178779FEDB2F966A92EEB
+6CEAE29A21461DA66535E418972DA8337358AC715E50562508CD7330FFB465FCB613BF5AFEAA
+2D2E13CEF53DCCFEC3D7029CE1088E73174A9D226E174AC7A80EAF60CFADD4BC51F934F794BF
+24AEED2FDA5486D883BD597EC42D4201B49BA0F89401129B0094188B698D09B1E82E2898E1E1
+3FAFDE14F40E3F7B8E5CC25FBC45F123F48FA0D0A7846D4F94C27CD4635C8EB988C92C03F824
+FC4C0E7DF36F0E01D36B4349FEAF75EB5D8C23E513E65F247F0CB86709944007B62313F4BFD4
+E3499B67CD55A3DE0A1E030B74BC3A97B7D9AF2EDFA06A41BF4BBBA292BFB500255247026812
+4B13EF6135E45E213C46AB4BC40EC5F57FDFFC62233A1D294EF1A0984F4399C925B42A2F597A
+64044943D0DC84247E98D231C2D35986C58A0C62006C1E4C0D6FDC531BDF7FFF5183DF316D61
+185BF17326E745C5B533E0B7A51433FF5691D84DF17AFEBF80303F9D5F05C797B3E767D788A3
+BDD1191D7A6D576FE079784263E782CC6B284AE0D59EA5D60842BF0A7F55CE33067076597578
+60AB8F0609E46E9B4036DDD034F5AB39D1B0A639BC8BD55FD4C800CF360014D16BFD3828ECBF
+97409AF47EA32B61F162BFB3C58DCE3039692C566BF70B2A8B6F2CED7479DB7C0FE286EAE554
+B601025D57AA3F26F1F6E85D17FA279899FB61BE82B59F6C70E0ACC2E600652304FFEF3E6771
+C348E2C088F7837A7CF37CD1C74CF0B78299D26B5EC1AE192471FBD996FA3FFE6169087957C9
+50B70C7BD174722FA2EBB27F6542F526D3D0842F17449389F3E6CE0B5712CDC5B1CEAE6C7776
+0B8B41E8444FB992928844B224F4FFBE0A4EB44027E0A75E74DFADFAAF1566F957C1999F768C
+AC8A735F17DF653F58BB9BA4AF0985A0CB32FABBE787B9A133B8AE7D68C1B41FD3E138DD26AC
+083DFE79A8C879256E5BBBD14E7B31478E3DE8ABA60893ED06F2C6479445644E795F46A9C95F
+308867AFE83D0CB1DDA4C68E8634DA9E30694ACE6EA93AF1D1E9670616A7AD444F9B6CE89978
+062B81346D81DC0C058F3740FBD591408A8A4F6EEBAFB5D7772FEE8F467B83713448DBDDB5D0
+90E6481BBD8636BA2FD30B79E9AAE4A98E673094FA6A597A8F0DF0B74C9BB69AF42F5FD4DB7A
+0468409A39EA5CF8D4882B9606E881A59A729EECF60339D5225090157843A69CEE675AA56785
+8B49FAA306D8A8D6BD630D7E38C54E88CCD548F96B22E93F780CCC6FBAD75976AA2D966FD300
+429B03F166E241C575A0469C17E427ED8502CE6A49A8CE1AFA36D2BB914A2E0F2BE4B2794D3A
+E15C8E5914B36BF9880B575D65B86C1D620B3BD6F9587EEB090CCF1AC48C73930D76614BDB37
+BE7FF457AD7E07D812D10C2E425334E0E66F83F024F2FBC764F7E9C9D07A35EB9297BC7AA519
+14BAA5055D2034DDC15AEC3EAC9311D99A0B9DA9DF9642FC4D5CE51ACCFF41402B227B0528A3
+4B6FBBB1F9AFDCE1706BEACC566F054B3BFEF75D735D5C92656AA780E9F78D3D67933C74BB7B
+7E1A3BA96BC716BEFB31099771D1348611184BF76E78E0B75655C18C42DFD2B39F3377633FF4
+CBE887574EC8AF654E91294504A59D04417F01E8C6C0EC71802D74F55020B6D15AD0333F5F50
+4EAEE5C47BDA9E373C09581B8DE96B4E6FDC76A8DD8F7B4FDF62DC852973B828F2F4FCD97C90
+17EDC5E0A6BDF87511A896327E39267E86C851C08317E13B413C7FA7C4B180244D1A26524368
+621142189D70F26DCE33CE009EFCC33BC35B211C67C9FFD68DE3AFDE61BF54A485312D6D66E1
+6BA9022B97C73D77ED530E606F54ABE858F2210821328018168BC89B5D1F0EFA0C02E4C2CA7C
+C4B2BB366131DDC427504AD454F6E8A314D9A5A4994F21607A2991083331F559B29930DDF0E7
+CC86A2DA421AB5E26341F26B5C9B9F1772F0B244B62C4686A2813DE622267588C0E5DB3CB458
+D2C490768FD6A0AD83DF55504C3E791554FA56A474C44A26256BA539416ED3BDB54EDC8A3AC8
+61CE565A334ABC80B8DB73490595E01986B45B0D82693C41DA5BFAF12B9EFEE509F25EC7678C
+C1E4EF735FFEF5158E0AB72DC3939E4F361ECA40DA40368D5516A55444957866029259BC233F
+C3F000F54CA33E2B82C999674B22725990A9BA8DDDA889F8DCA18A64EE31C4C82DB2BD653E55
+5B147536E03C8D550CCDAE2E891D81772E10A1FC43DF9A600E025E028704D40AAF27750C81D3
+F0A8E2BA60FAA0F3F4F5BD7F66C690944EA6254A33DF2A503715510772F9D8822EB0DCD03FF9
+2500374920E0AB941100569ECC2C26C393DD56EE48BC914794696A4211212E8A77B1A653EE24
+A02BFC350E7E8577FFA1FF9F11B587E61C08EAE8D88B073B780F5FC2FA97F6B5DC9F7439D84D
+3ECC2C67B8100EAB30D6CD8F07F2F2426749A47C7EE77541FB716463F8703B6BCB80F5BD066E
+94CA265473CF95D4ACEE36D05CB22C83DCC8B27C7B6BCDAB943C899937C29FE456D9D71B748F
+1B57625597D7EF30813823DF79B8E368D864FFBB72251DF04F862AB1D808E25B506804443959
+3BC6A7DABE86E0793C0186D7DF54BBC6012FDE7E30C4FE5DC9FAC9171D62CE801C5B77540930
+F5604850AEB85A13E06620150AA55137F66E6DFC97EB36A16A9311A97039EFFBF3E5080760CC
+EB073475C1E9B07E1E23FE1F65ADD9F68EAE159984DC1BE07365EA94A90E2305A90D33C46245
+6CB031BB031F0D34B570F42507560AB26AE4B64772CDFF3034681B7E3CC6B610FCAA65187436
+00CD4889AC7551F101B927F16188792AA47EA95BB05E2EBE5C96E92CBD487106FBF63CC9DF2D
+D0E0C2339402875887CBF2DFB17C3E32E1DA3EABEEA3EE9CB461A7898A1AFE29609E67AD6DD5
+7C91964296FBC5F09F4DB2C8315B1F7D9D324A8F745BDFE3EC7903279D78DE6E129D81CFFC2E
+674714666791C5A6DA8484577531BED634A6F7EA50448E68D959F743279B9A80C8885CFEE79F
+47DF6B9196F79FA4383B8681ED4754F901BD36C5A63FB1582857254DF71516F53D04F8617898
+1F3E9D10558C4C7E613754D3CF26957E0AEE795F9DEE25EFA913D3623D98C1F96E0AF34F67B4
+306BF5F593A96ED074700673DBECDC9B2BB27558525BA7544029DD9DB5828C6D8E563B5BE801
+3E96131B9E2B11D67DAF49A1ADFAE1FC536F4DEC7C75DCBE0D6741697FCFB8EC8D2D3DC85FBE
+8225A86EAB86652E0D32A00E59985E495D975EFF48812495EFD19DD9CCD93141D361B0D1DEE4
+8ADC0611D1DE2E8EECD62FE9A162542BCAD738167AC417A156212A8229EF17605EE9A3E2AF8B
+5795784CB576C5D2C8688A849E2F04B7A2310958CEF0380AB87E39F1D0270E002A11B97F866E
+77C1CF7AAFAE209A57AD12DB90DB20026D92F123F3293ECA4AB07B86CE5A9EE650D3D1491156
+A6199132B271607782E30F03E4A333E5E0960F798EAA25418313DF13C5D4BB186C37DFBD0392
+459885CAC59FE71D22B1BA70083CC6D81F800F1033FE0A250DAF09E03CDE1865FBA52D2AF2D1
+FD4072AE40706C969C1BB778CC4EEB3FCF993DADCA323BA2C6B72FC9B2C4679B9868B19A7E58
+40041BAA7629877B130A05D1594C855B4853E70C8A1D1F58A20438C39C1E3800FDBEA47EC323
+831783457FB0BAF72C02F0EF8BECC7D5940CFDB008CD258C094980C358471A2C6102C83EAA60
+5523C535EDF3A96E699AC6627C5DABBBEDC9D06FA6906A3E524C2103CAE0E2DB5F926A1FB5A9
+ADEDF9AA8663B026115791B810FE0EF2CC1E1BE6E7FFF7DDDBD27CDA85A34B3548B2129A5DCD
+9071BCF917D9C6BFAE79F41DF7FFD4303525FCEE0F8D47179ACF13FF109E748B83584AE2C8C5
+7FE3392653DE7EC742918F68F86E4694A8C9C3115A9E459DC45557A492DAEBBC306B73DFBE5D
+27DE382E17AB54A77475A79E38BBC97FA60C738C9B017BFA6AB85960F34632C6010E321668EF
+6647698D00DA3407DE9599736E3106D8C30A13C63D8B447506768A6771A3C18C7028C1E28983
+1DBADBDDC8BABF7F5D2FE992594CE0F01ED186A4226F8B312329D30431148743E29A1C4E81B8
+DC2290CCCB1B1781A397D4510DD2D08C81862C66353CB95DC06C67F2D783F0826CE879CE8BB7
+6C93F57A64CA5EF9A563470B1143DB3ABEF694645337284C1EED1B94A8EB67F62AF99CCF1263
+EE69F09109AA7AAF5F39A9488C7F0A1B3B59CCCF641B0789305B3E27B6DBC105C385B06EEAB8
+CF7BB5A6A514BD597A401590DD3D8DA4E0C291621D9F2D9964A408FF77025134020215A605D7
+77D1E509789DDBB548DD22A7C5A0C9FC6F2B84F9B94067AFD956AFCA3DF219F51671692A7EB4
+8B0E91741BA2D2F3F533AA458F7C373ED76A155C18094E372F8C4766C93C33B142C87068E00F
+9CB93ABAE9291F33D1AF2560892C50A3EE480BC84C46DBAED662A4BD34774E36310D91BFC3ED
+B9BFF3D0061C5FB6207042680713CA4C272126A4D40352320CF87AA4C0AAB5B77E2B53792F62
+6048BDB646480C5FDC25725FB6A11424D3F521D72730490ACD0DB15B91E94B11CDB8350BE714
+1209FAFE5222129CA80113D1CAAFC9E5F84269080AD8ADD155BA2307F82D8DA59AF65A328A81
+EEABA59183F6F12B9AD4EC9A10EF0732ED2F05A3BEE8C396B3663E993B02D145A5EE5F66E30E
+CEAD5A7FEBC39BF46EC8F6C4CF2B31129084A58664C4A4B413F99B831807561415A15E5EEC49
+585CE724128F53C19786921430DD793960103153BC86F58C760132356E51BB62F093B97A4ECC
+7DEDD70427F00B45C644C523EFE1597912C4D9F53FA7E8FC6C3608338BAA4637D6EF1EEE30D1
+CFE8DF2545A07388D8376499566AEEA76CB191E8DB5FE05C9D91622F262BF5564ADC064A5B3C
+AA5569EC5233DE0A488CB544533FBAAF602CE67E0B09F9BBE7E0BADA637D26A7085E80BF5DF2
+E06690306186F13A400B726A9BC0021A34BA050079520CBA61CC3D3C61DB0E5909C2FCC82E31
+4DAEDD2228D3D4173163FAABFCCE8C4ED96829B0289799755C4484CBA8FEC61C3F53D2319010
+62677888699BDB42672629733D4FB910C73B307E8DCB837F53346759455702F04A42CC42325C
+29D16F4ADEC550CA0CF5C9B7EC60038D7F444883FEE1A93EE0673F67798AAA71AB3B1EDF95BA
+0DFF0F45DC9D6E0588089553A091962BDB39B2D19B9395380DE4D8615F054AE7A1D8B26A16B3
+A0611469ADA90C9A3818D08C89A7CA26B0CF98DEF23C8C123977F2087107A1550AC33C50F076
+A30B84519EB46669EDA19728C6F4455D41DE791CAC6DEDA07A108670972C428438719F847BD6
+FBA1CE8E7101E972A7D5924E749A2916FBED44BCDB2954510BA71142D7708B38DB6DF559823C
+AD34881594717BE8D205679137747AF78A8AFB389175B5826903CD5819726980A7981098B02B
+2F4B47DCDFD89653538327E431B843B4FBE0F0703BC3E211BA7BBD965B0407E31946757D1009
+BB2EFF7E611654857FC11756351C0E2732BC8B99B20EC5E520AC9CC638010215CD5D7AAC58C8
+BC907B6010F6CB74396B7486C0906F9B879B67814A23FA9E89C79F2019A935125EBCFBC931BB
+9EEAE79ED464065D458E49AA025660B1543B0588B97C0D755430EFB05154814F5FCF0E58F03D
+3DCF0C01197A4D4B1D94B0357CFCC6B6D9BED2F84C084AC953B3B247B46706C71E8BD717B93D
+602241B21096C3E6B271B758CC50F2657481ABFB0A80B54B0D2F0AC2B14D0F552815885B2EE6
+399ED0A9A2D3C133305339D97E44CA08D52C9071B8F34D06B2DEAD4549C591719BEF6194DEBF
+8E7064C18B15DF49A73FBD1B32C1F16413F462857A76345A462419B74DA65FFCFDA65075CF3C
+6201C6710BECB92696653C0B927000B26F5289CA6FDEE0EC2C39945ADFEAAFE397907A92D266
+EC4568635EC21FB10C18BB9FF8B975ECC778C77B7E8E66C9D508E23E136F7B1C2E6E03AAFF8C
+E77008005B13217B9293CE534416FBA358F1CD5CF26314E4E6880641D8B987DC504CD4F3E384
+06E63B8EC62CDF13D0C739F60799AE269706761BDC78A9F80F726739DB2C211949BF1CB2F947
+7E17227E18D43A875FE5ACE8446A887A14C77D01B5C9FF11C3AFCCD91C2411072632375C3F99
+8343651BC7F583ABE03439CEBD67BBB3335B94193CB3CF36210C431A202B12EBD03D1AF9C6DB
+B1F255D8C101BC17E301B4D37C8EC7DA0F797767C6EA0166C74411F7A5D54B7E7AA4CD62C856
+99F314E11014CEC46FD5BB0C0B69A397A60D4DFEDA87B095341DF659CE1BC3A151376C2E7BE1
+1A548D84F0F5777FA0C07DF33068C2EDB144719CEE27D1F6DB1FD83F254BE273BBA9CC1FB51D
+B3ACA31D8BBE5AEA00F61C23BA566415E9A0E1ABC230F46E40065C0D9F2F7245C138149BE9FE
+0FB69C0B945DC165176EDFFCABF56B9FAB33DFBE78966064DA91DB7706BB6C6F04AD34E042F4
+C6FA48B0B9F96BF5CF68253F9AF738CF671AB6B553E23F34B6771E4BF150E6B6B0B170DD494A
+8D1ACB6786CEF859F934CC7736A170BBA986EC19430D19B9F090ABADF9AC0943F36685966113
+9C7645141E8A7A2DFE554F8397FB10064996783310500165171D8420D1ED8BCE593C42805A2F
+9EFCB4B88D09AC7E6A4B23C21A84B94F823CB3AFE754E79B9C77D2C3E29D5D4BB0F29569875D
+71D142362E1FAD2AD2186258D1DF52692311F53A608A276F70AAFAB6E301FC586B0F4C6D364B
+C2F1815FDEE94EEE51BB72236F3D4B64DCECE6C7B21176CC09E6904DCC1FBDAB59260507D488
+5F24270FE2A6F133D47CC2AF2AB27637ECF40EF51D8CC1352EBA3EF27C745663350C4EE97B0C
+D24ED09A5BB618024436FAD4BC458A6B259BAE107DA6FDD814B646E95B1F39CA2C7E9EA5B156
+A44FCF514EF96C5865DA6D96FA8876325A9F83B75C5D156ACDA42A69ACDAA7BB306A5807B013
+38297F76D0CA3CA851F9178168CC5B1ED97E4723201DA85D59FA9E3EC837297AB2759B02F921
+CA65072573A35A942DA915675DE04A02E5221B62D9EF635444A37E1686A816BC71F496678378
+0A328F17D3F8D3754AD2606524C0FABD57F1D02676154BCE181F8B97CE2B0C0E0F06988F5AEB
+5AA15E7B3A5F2080F7347D950D3B005E462336AAFF1504378DEF84AA51AA528C2CD232EF2382
+63BFD3388D0FD290DC4558EAF24F56B0F74A674A3CB2E61A88F5F4E97CB9997B380B68572043
+4CFC4362BA7B23C804C22793341388502F4AA4ADABE34DE967FCB82E12616A22067947F4CD26
+AB2762ACE46046E73FAE30959005EB576A10FEAC6F307233BAC38DE2D70D037F56C0B0ECA2F3
+A48D4C0CF69CAE3CE44B08E5B10D3F938131F5F5E6F4A9E211312B04709E73B246639938CDAC
+FE24396907B7C5677335988E9D6EA7BE4D7F6850AD924E44D85D494023EF0AF57918EA99A779
+34F389A5EBCC42E26B85E47EF7BCC2375DF221BB5E0294E3FFA8A51838D9ED322FB0979FEB0D
+26D4E36244F5B0557EF0101B5C3D6241A1EFAB943FD5ADE870AF75E24F25772BB65B26CA14A7
+034C1F69CCD38DE4AC79A8D0311978A8134810437E5A04B3363F16D4EE6D23853BC1298853AA
+FD9C619279AB747475BD433D2186040A934A0F05B294D28FE45801A802DBD20AF0887B9B00BA
+5C4D885643B7A645E990A49A8111E6ABDDBFF944070678E003591249551C1FD79B40795C8CE6
+1F8FCF78D1BE0A44A2D32C199E46DF4A734206BD97A0954BB778C0BCA6EC76162FC4222AFEF0
+4DB282A73412FFC5EF9BAB16CFFA50A8A259BA0FA1BABDA8BBDE95A321AB4196D58C12D8AF91
+89EEDE485B3C951AFE3230189BADAF0652535CFEF04777F0C183489D90CADF9A6553473A18A9
+A36EAE70ACD5E815C03E9964703BDDC7706FD7D14B668EA1176E438E49350DC8807A6E4EE528
+33C6D110475AE6F96B6318A989B6BDC1D88D28C26606E3D71380CF186C2997E8194513D3F43F
+9F570BF9C3CBF688060A12885355038E9754F89DBBD90C25FCC2922F11FF1934AAFB0EA11F8B
+DB6C3257D7BA0F8E2AC7365A9FC76D3029325506AE25D8DE203D295617F85EBFA351FBCD7956
+11D6FDA7F3BF6E34DF41B13138ADAF0F570BEF6784FFB896388ECC95087E0B7F425B6758D8A5
+98D41A87B3F0075508B708675C56726022F450D6DAA8B60134BAD5328A36424C609E99B31480
+01DBC05881FD423B95EC9772B9AD22A992062736432C390F55D692C90AC64A1272F3414C537D
+FDEAF1BDBF157726C59083DD303A6E1DED50C6F5B94C61E81F9F138FD8AC67B673AB38E5CA16
+6611C6726DECC1C0647D6188085056CB939E2B1D66E25BEBEAECE4B97DD342078BAB4867B7E3
+CDBD2C68B9E7D88BE56D90573085C9DF10E10B19EBE83C8A1C41F58BE78B93040C928FED3B1E
+98F354823619ECF7C5764F2D98E958A375A5F0CA5D884389DE854F91A766295B01FF8CDD420B
+D2A52A41A0759ECED87DEAE73D27A1DACB0D0F7E4658FB724BCCEFA08B0C3D5BDC9CDD6A9463
+6F8B7B4EB66971E8C599D5F15BAFEB89258185E3E935C15CE57AA6CF4F2CF79BACD605747AC4
+EB081FC98BBF61D2623350375B860155B90EE6A159DEDCF7A33604D7E83C50AE7804E9A43462
+2239C5A7D891859D31CF7A37DF61BAB489D857E93D5C2C8CAEE4C61E7F4E3316DC35FF616189
+7D5529EB2656ABC3367ADAC4EA3342C2EF308DA183C6F40402E231586A37198970612951B383
+FBA8E8C375123429CEC97A52B455CA8B384913E1527E77EC48AE423B6BE28F3F8E0FE77F8D19
+7BC6FE350D817C8858CE5BABB5A6BC1276F905BA942A1601784CE8E8ED96DDEEE65D9EDE4FC7
+D5BC5BFF2FC3A966FD25961A430A063DF3D8766631774C9625F1CAC03C135B6B122D4B5F68C0
+659B1B2CB634D067218E127A589F87FD1EC9715443A08284837ED2BBDDE3325B7EC288992F1B
+5166EA175EFA6FDA164E8391DE99E4A88F43199C3DBD617667D6FCC2561A1642F45D76564EA5
+B0E925BC960CFCA1194F67743B854899EF834404C8596279150CC61909F367EB17924CA9FCEF
+E89FCB940710E470A5E7C9CFEBBB8B8EBB2CA8CABD973EC4D8F32DF8A39E6ED4C520BF932FD6
+7BA02EADA63CF55F33EC75216F75E29E2D6937379D61EFA2C7F83A187FF93E4F17A66CA3ECEB
+26B9199E1915922667CD1793FD0842E6648FF80150D7A0A447F5FFA2B8C36507F7DECDE7EB99
+2FEE6E9C8E32D9BD971771ED9D0B3E95190550058FF0E6F80576ECCE287AD895AD56DC8F78D1
+9FD04ED854529719471333B1C313A002D8166BB91B2983E99A09812E9BEB52F5EDA7391DA5A2
+FECE694761350B089DE41343F04DC45E1B4231F265844CBCD770EF5BE05B2F97434CAF711D61
+6613108312D08A9B4D3A55B2DEDAF47CD5BBC2718DA7D18A7079FAC6A7D4F7CB4F09D4B027E0
+5629C14EE77663D8B29EC009924B41F873E4024E092DF7343A1864C80B6EB8E4FABFAA90F5D3
+9154FC4D14438A502E60B5AF432A90C7A48C523B4267534F171FDC02E57B9EF3867758A97BBF
+9CDB99DC41758BAD49A7D780FA0BF66851B52D46BFA8B96E60BE89E4A5E78BAAB8736ABBE338
+C1283CC1D2BC3A07F982122A3289E35CB097BE9C27274BDF3ED19EE8628BDB48FD587159E7E4
+84F6F5005F22E636719F9327173693810F978816F739574DB0382222B9B717E394DA21A4F80D
+5A95C552264DFA0727FED213EEF886C149D392E900DC4DDD0CCEC84C5DE5DFA3DD5F903B93FC
+649FD661BF20618BCDAAEFBF9C71CFC11B8C68143068B78FCB3354FF5555A9774FAAE88328BE
+D4C4996679E9285A00C12B32757C74E8FEF1ED1EEACCEA315D56DF2E814F2C8D75E80D3836DB
+71C5D1CF0055A01C1EF725AB4858D73CD089B3A66968C2604F97C861A7484BE84BF95DBBA43E
+A6EA2C455574B715825DBCA643BB023B77D3CEC870FD30899E7788986813915FCD3F909E3D59
+6281B4D858A29465DBFA76EBA156B0761180BEBE2A6C218A51A67D400DCE29A3F19538DC28F2
+9971A8B01B4C27A42FD9AD8A89B7FA5F188D3135B5567C8E0B87912EEF813FB15C63BC9260EC
+3D7A6909D2295C0C31DC77B0A468CA4B7F801BB06A0486470201437ED678AFEC280DBF80C771
+823FB23A5AF549CFF74620AB2EE1EFC50EE09F4A0BB4AB05579670940D20F01C61C7461F08DD
+8560F5C1E0C73E0DBFC8532155A5F92162F05D19E6634446EEFFB764B9BF4B5E695E9B4D8037
+8EC8406C588C3EB7C919BF154BDA4A878B45479F6111798DD6FAE11A29EA1E44934C82E6A68B
+0025491A69037808D3FCBDCC7C80ED848EBEC3F7CA954CEC873F4E404A699A7A980BD66E9E81
+2BF39C85C55A010D95B9AA147E5826D0DC8EFFAC979ED602F7414DD64CBF2518A5B71AF4B6FF
+0F59657D2412B47391921252D0A723DCF2EEE67AB89F8C12D3EC1089DA75F364E4E6E1041007
+2144CB14352C56F9D8D180E45861FDD26B68A02B5A86560F3EADF5367D8B06876ED8F79BC79C
+3602569AECED48BE6423888D86C3DCD811CC26C29239210EAF574CE8730016A3AABF2BAA31F4
+8CE3BCC43DDC31DF81883CA92F2CD4A7B1E136AF70037AD22207F8F5E5EC06ECA4C9EE9B199E
+15590E9F59D11688D22CF11060E87423F3E01EF613FC230FDDF599D1277CB7FE6AAE4312282C
+4BA8A28D794628136FA0C5EEE83CC6ACFD043AE7FD985D226AE4D91D00218964C161C4A0B147
+E58A4D143917A592A8FBBA3215D1E3AF1CB952BF418C9B07A5ECA3457B591A0E9C49234DB043
+99EFCF129AEA7A96694BED7073AE4502979F2F0286085B799669DC8EC22ADCA51E92EB0E2633
+651E822F4910B716DE01CF09B631187A6B9935D43DCD1C68111B850B7F21EE142A7A48836D8D
+E7F4E63D72B515728D9AFA7B11118DAE383ADF97CDB92C17075F437FA0BDF5250C251013B612
+C593D93E8F9ADDEB8C03E1D38F56E6EC42C7FDE744866D4B873B725074754CDC10CB0262403B
+9740596A661A2DBF057144991F0A1A4FE3E316095978A88CF38BB1B5DD0FF4E8BCCF1C7D5636
+9CAD0C2EC29D56A6CD2535EF610026AD120B4BBD5151EDDC7F385B229E79B22121416E74463C
+4D5246501C7B6632ADD04F8C460C7D5A505F29BB3F45343ED5D576302FF9D8EC1F400B190922
+BBE646CD809A6BF2E0EB9E7AC66422EACFFA93876695B8E88ECA149CE738586A0CAF105CA587
+8572E58ACF6D523F2BF3D410A8E79507A0E480AF8C618FBB459AC768CFD240F32B0B69265332
+20552D8325D058C2D30B5A437AAC867CB5BB6C007717FF089C65FFA92C5C8D159E0833C54C53
+040D448B93FB48B5FF2395E4774BA3764B6EDFA7EEECDB2B9736E5D7E427CE883C67AAB05B08
+26CD91AF342E32F2179CB109F2228138978ABB9C8EB9B555C1269FBD12975929E91AEECF0915
+D6B2068C7B2DF726FEC9DA54ACBD64AA808FCE20A34EE78463C4A831E33F94A268C5454A1CD2
+E05A662786E7392B24EF94B7EDCF28428B52FD85DD03F7B38000F38C4C80BDBDA46F62B9A964
+FD0B5B33F3B8FABE28538632F1B229418E1AFD6FE9263CC220BAD30170816AAE06D54541F854
+B68CF72E08DFD272021DCE628962A7BD962564C054C0E6AB2742846899F9D0DC9424D820FB28
+9EC582BF3B56C48D32DB2768406491C837B125B62AEF198E85D6D579899EE59B53271EC329B2
+83DD4C498294A27DF14A783C517288E3B6B4CDEFD2489398B71A712AB154E55499E016D7862A
+14BFBCEE308D95509CCFFCED78FF3C55510CF91DA90F10D3203706F0592400847639F47C8A70
+D98F48339A3D7017A8C8462D6316BAC13DF9E12A49805E695A1C632C63E223A2799C84DAD656
+DA6ED692520DB379C727B8375DF9D548F693BFD9509B3028B1EA529AA6EB737380A4FDE879A6
+CC623AE8F5F992523E167791F3D33BFDDE0A516C6901A202A5C154A0E69CC5FECC0B75E61B9E
+D91834B659805E8B7BF32FBDC4DAF5520A27D508689F692F1D69D4E0B00DD7AA134C1357DE1B
+F8804FD534600ADA4790738325759F35D9DC3B077FE48817AA57CAF862713E617BF7BF09344A
+74BD13F118D26D30C1511B20327C460D270E5475371AA26BEFFEF03B66564E0E669724E38959
+73D98C7150F035FB52D8D328EEDB5C85E7EA7BE5373E514BCF881C4147DA0C1656523A95B63F
+86B3017B93AF76536DC19979B9F617CC855DC3B8FAF171780D352F93AA78C3F25A0AF51FAE91
+878FDA9DA3B094876526BF6D68A650008DC13D0F17F8445236FDCE4F725A82AA5403B568F65A
+087169993A3E81684234620F58568D2801F344F5667140F9DAF63DED0AE4AE391F717AAE8B56
+6347257987D49186C82B911A98F94DF8292DF7ECD76FF09EAC1400B6C34658B9025AC42B7DBC
+EFA9173258680D929ECBFAD99CE071C35DD8D34126A036DAB27B3F2A0F4B79A509433784D317
+7324A8DBD271401AC904E072ED118331DACC31CF4EE21D1A9D805971DBE8D17AD377FAB5450D
+1C0448C6C65FE4E8EC9B4BC1FFA74D7D0CDC6D0CBF0C1F905DB3F02B944281CCC10165CDD730
+2F4DDF57865D32D47C8C26FBD0D410E4DEC820B5D6EA0DD6B1769AC0550F15AE88C0EFEDBEE8
+4B75949453669DCF1B447821480ACFE750D13F8A3E574F7687949B525B278DB75C3102FD4706
+6AFC56C4588A258813C3C53DF147FA5F225E901A297E5E322920F131093304BB9B2895E46DBB
+1D020EE684B08C64E1A159A6829DE9510E5E985F53454EC367507D4B84B80E28133254B7B60A
+C194C776F734D6E8837CE23EDC94531AD2E46DC6BDC1E921CAB4FF785DCAE7B556706FDED6AB
+4763153EC5F4B2E10491E5E427DC327C21B26DB2AC272588FC41FC5490A102ED1C2AD82B0811
+C34CC8DB42CE97B4B24E194CAF230E58A04943934351805A9A0C5975E98C0F11CB0AE28C5ED9
+8E52CF035F823FD449436B20CC0A913B7606A6FB2CCF4C7A12714C99B60940CCFE9CE26B22D5
+DC1FFFA01C8E4A04AF28C9CA3F2A7CB2B33A725C456EFF23BB62B69878F8FB185F653F41C596
+C9BB7C7A17CD9B5A07FC405AE7E182567621FA75FFBCFEF42E7373B2B15CAE76D7C07BE16A23
+086500A789CCE988CAB9B321CF969A79132544B7D9503C7D30A4C86D8601743449D619A5CA87
+879AFCEDA5D16FE6B31E17529D17A95C027D481B6C11FE9477412DED852C15A026E36735239B
+F5063B7FDA776C1282B9F50F602526F355AC3516E5DF327C227EDD44E453B27D7074E0F9D9C1
+9FAA49D3DE5138498B0569B4FCFF2041977F69484CCB916856DF1F07E40B450C250BE68FFCF4
+D159FB8F1208EA8904567BD552116A28A95425CDA95D4FDC06E59449065B65DD2B7047BDACDC
+29A66C8FAC9BF2EFD6886FD859BB0F256B21EF2AA03E6EFA6A614B222B84B7E6BBF2824713CF
+D214DA92F04543AE0011D51A50FD08C4FE4BDFDB9E184EB32C399D3A2FA71059CFB9F6AE1CCC
+DB4CAADBAE20AE4F65BC58334164F127DE5C476EA5BBA3644F2F24F0DBADD3D1E80DA16A6483
+64C1BF86D0A76523317C7D4F46C419FA31BF86D5B700CFA640273BBB9D6C8AF13E7CAF3A2510
+01F06DC2D4C8F57AAE5A8B4E4379163D732756D3A7B97C778DC8637D06EC36A951DAC426C14A
+58DF97D2777E7B45EF2C3F9D35202015E420C5E35301AF195403F3ACE5FD4040ECAE467282C5
+1E7A6AFC69936F6D81216FB0B2E3B3DD942DB10D9BBCE24E186AD3D46B49414CE148AFAB9C95
+8E7339664510E2CC5624DB80A708A040C0EB2E48E8CC67EAEE7856DD36BA948C8A8AEB120BC3
+28BCA0A629FEAEC6419D70CB8469D82931C1B08B8EF46865819F4D6E3D2A9BA5EA2ED7E7221A
+ADB2660B474E576DA104AE298ABAD60F6607D9D03C9AF768707D5F2F299927D14BE80E258469
+066AD3C2BD0ECE20975A061977CD4A1246E6B545E7E9788BD51E04DFD285F9636C663D7C6AF3
+64ADDFD0336C6CD6A46A43EB252D2B72DF3B52050D4C2B20DA4F6CCCB1C1CA85EE1C9A5501FB
+22EB7FDFBFD0838F0359E295D3176EC8F0A2A7A262155DD2F20CD2632FFC30E4F274AF926570
+85147A75942D1611D5B0407504708CF782398C366A02AD6A8B103DF8E615126B33DA380BC2AA
+1160FA63665B883A5A4A7CE7514DDDAF8E65508B2B6FC341A00DE2E976C07A499BC758ADDA72
+B65780DD06133027E1D7FAFBD4CF7085091ED9DD98D91E4EB4BC0BD4DFBEBC947544A96F47C6
+4E1CA2BEA3E739A65BECDE6B2CF0713743B881F403AA40AEE5A726A8B54659852EA518675CAE
+5089758C77C82EFBA56DF329AB46166154F0780319347A050002319438096D4EF7F851876CE4
+07D436299F7D3A0FB6E8816C37A028D62426BC615FD635060F1C69E3E7FF6D9262E06679E415
+088687B4E65813C86D481C41B5D74E0C208882B13EF4EEAE0C60850DC1BF54075F41763705E3
+CFF0B9FFACB9E2922B40AA7209970FA5F3563D7E6E4D3D2249E7E946E97B5FA40291742EF9BF
+A2DC7D4E5EE1A25F6D0D930A50262F17F38744D7A07FA9B6DB3C4D7CC96DDA023AE2F3DDC571
+FF48135434E354979EAFDF625460CBEA8B65B63BC612E44D05CC3C3FB186403F994FD1919A62
+44E728857A54DF535AE149D405CE6C83C96A6DC117BF178E088556E12D3FD88017FD2C031059
+1A89077E0D6455E76A3C8AE37B8DF495083B9EDAFAC2E3322C07209A21B5C33AC6AF3DBB527D
+C1AE916CBA52E68C2A851EB073D09CDECF8C3AEC94F5728F202BEF1083215895FB76B791CA26
+6B925512AD89EBDB53AC81DCA3EF1796D1E91AE23E5C60DF72549D625AD1BA68D4B7B5C338B2
+1496653F61F735A9D60C437A6397899304B3EA36BA2AE138A700681EABB177D32CD0DCC8B226
+982EC3BB7EC84A831569BB9A3BF30FB4A56D947464B1F7B49DDA4621907F605A238D6C5A1F21
+439FB67080A3AA1864CDACED6A37D1FDA3E95EB8E70CB3B78D2CA77BAB36D6FBFF8CE6AB6EA9
+78C1C8FCA06C3112FA831E693BE7562B859AAE3AAFDBBD0B119392037F1658D9FF7473B2D4EC
+D67B80F2EC39CB32391E41E2F8466B9BDBE8E134186312F0C97F2ACD4EB52F835D00880928EE
+1DCA94DC6A6E25ECC61B5E549D1B8A2C130D61EA7A42465F0EF3E3AB242799D2639AE4B2CD23
+6F195D3EE06665DC3674C8CD681E0B49C7E5B95E4DDFBA0FC01DFEC2E17A77F16116AD14296C
+0825E9859CE22241EFC60ECDC3F4C56D22EE448F8263394CA1848F95AE78D46DA9FE03328476
+8058CC5A4CE269EBD36B01D04B772864E136FB076154A52C165A9A0ED6A9415474890E85738F
+C1E112B733B2CB78D73A294367C4A6B33D15CCAF851135BEABDA0AE764091A3EA5B65D0BFB32
+36760AB084F8C9C16F1E93A7531EAF2130CDB62A8DB7B42040D0A92F2B20DA2FA00A73738BF8
+AA9DB2581B00857BD6D781A2C78D83792012C83D4908012347ED651A2FDF54C70D53910D6DC6
+D2D278872C6E7D58019E8D04407A1A720FEFDDD6EBD79B98B77A4FAEE6EEE00F2985F8B674C6
+A27D04C992B7E8B53A1E621F9D3C66DEE950E1F705D02DDB78A081CFB94006AAC8105F5D3E46
+5796D2C10018F65869FF73D7A9ADB035FB37EDFFEB469D7670A13A43DF3CE14D277AEABA3833
+83D36460880D924138C8A8374AF1031AFA2654D5A118A82149072BCC38F87096D240B55679D8
+221041F2F7934C27D3F1B543B6761CD2D2D42BC27D7C16317D651C2E041ABFC027D3472514ED
+04642E58C1E729945761DE2758A438569DDB55505284045153837A29D3BFA889C6AABB26C108
+F27571D832CD930D39CFE96814370B2EA5A39376975E378B752E6E14FF1322942114E4119A30
+7CEF2711AF296AE3F88D550163EAD08B2B515364854990F25AABB23D975FC84DA81CF63A416B
+32AF608508DDFF86CC694A6B668B3F382E3E3AF223623A65AAB3EB16D000D86D663EC6031D2C
+DE50D54A55EDF6C7E47B4903C9922BAA00D2C00798CD367613F7549D9873AC4EDD3C2E8A044B
+AE53643AAE392DAC91F6D335112C2DD4B188C5F1EF1E5E42457E4C2F2D2A282EA3D2E9BCBCCC
+6DDA43161DF8F8985745E86461108E080F647C09B183ED67257381C512947CE954FD786F0B86
+A62E40327AAF77C3F5265A47BFEE2F3919A7073E84C49DB01295C730AD18F45364E2F19BEE93
+8B7C92235D9E32754139E8C2F64C738A5716EE5BF2C68D09DA48166FB2490EC874C723D6E72F
+AB7C597CCD0ED2398BB9D99159E2D4A3FE605ACF6F7A5D4A00BB9156FABAD02D727437448B75
+E6F08F1C5F17B251412C2E698CA1FD7D8D7A80AC6C7343CC7CEA23245812247F35F0F4480E10
+A1D8F9D8446EE41E435166DBA0CA3B29155146C96C05FF1FD2661DBFD9AD2A7341362BF8C2A6
+C10B91541D2E4CB6F8AA01F1C90E118E0DB81FC03048F54677CF96075EDA05B928E200E1620D
+EFCACFC777BC76E3C911229C64699560D630BADFFB00206E4DE61E3D06959B2C4486FF5DC7BB
+B22C634D8B136077E5062096D3C99B142E2D1AA6C26E58AFECDC55A8B90441C0459140363FFE
+8928C20BF64C8BCE4DD15EC806A2AC7CB1DD58E67B69A34B28C4164BB0262FF9267544A6A905
+AC3290DDA8F97CCAFC12083485AF20B6875B355D98CB5E45DFBAFD80FD63DD590A2EBE0B0429
+2A1D37C906FF3042E608B3D983DE1D829FAA8B658584600E5EEEE90FB0CB13EC9633B148B696
+30B8A4617527B0049E107F4F7E14BF421DF26B08BF193EF2650E7930F567BF3A05CF55F3BE9E
+651C2273F5DB3C4D08D9100CBF5F5672C702696D823A43082A79B159DFD315278DEDA56458D0
+B8208C7FE90808E0D0566CC2A176131AFCA80DC312C9F7E4C25A0E949AA384CE254B885CFD9F
+E74E88B40862238868C3F7D1B435DAA876B5875563C3C5BB3B962BAE3F9909BBB96997A76533
+95C7CBB41D74347B78547085368A5B2D18CFC3AC56DCD1D9D5A53EA63F4241F1B35C15913F4F
+773A48F42B4D04B594F33FF14C0B16989C4354C2DB18EFB3132AC64D02C86EA8198461F700B9
+8BE371A968C0865BEE44E8DF5A7AE98B738C034CCF07E1CAE4FBFB8A50C9C31362845BFB67E0
+0732FC33378066D3B8F1D69224E627103CB706AA5B6F3E4DEC74445625CB052F5AC48681CD3B
+204574A1041CEDB74A51D4D21B37D465593A7E8F7AC1184C5EC7AB9875852D88E15AA1C5203B
+BD9DA15C25BF2E908C97678DE40D9A8226BE09A735156D1AA028955ABFF46DA51C07E8E1234C
+9FD06F9B54C0E8ABB2AC28721F5CE5473077BC6A4AFD0EC98F4FC29BCFB29BDFE99D931BA28E
+200F5D58136F63C5D18B4917F79F9650343873C44F8F9F699A0F5495237E2E748B3E5C3DCCC5
+9DDAF98E1C4F5252F0C52D2BC4399510496E4844A6392F984204282ED84398E7C8862D9462FB
+AD609A8C85945B758B88E37A2A412380B6DC884BCE142DDEA569227FE306C6B4274C07CDCAB4
+B48EC1806E45A27109D0B142FB3C84019F4C1C275E8309696F966705B06292C8F8622FE8DE52
+6C591659D7780D424E8ED1D83F59A0289DC59556A84B5EE4BB34DAD12A92974CEF6901517285
+42E222B0C32B05B2C3D819A40C4BFAD0E080E60AA633D91ADEB117434C58A7BBB334503FB9D6
+85166DA7425F35097878325385C28C2F1B10CE6AF452AE0FE66C89A9426D1B25196D06CB9271
+C6E973F2FD6722B1EC18162175A9C00CD155FF3EE679FFECE6889B2EF40D682FA2972EA03622
+24A1C43282A08753A5205D3BAEC16DF17AB6F6162F9A61292F32F2D9DA34A45F3DFF377848B6
+E5CAADF938BBC92D8553556817316F4F8F8D54983D8D72C2145D4D83682CA5D528867E8CE66C
+050FE52B0269FDC98E5B48A185B979B45CCA3D99C870B1049461007CA15F4DBCE8A306D460D8
+F6B44A2506FD7217F11B69A0077D3B7C2F016ED954BA5E58C9B51750E4FBE8E88E4B0AD59B1B
+9969BB9494CC19C030DDF9F586D80CDD03FDA4D655D90AFCD4CFC93ED8B70C13FEB1B3F052DE
+FF4EAC734E8C1FA2B4AE1423E78E529443074F58E3F5D84DC1E8AF60866E49AC96210FB526F1
+B4DD10AA19C53B92973CA6E13B60D319FAD574A46301A80D69737B9F60B4466B94F4AC8DF508
+0C92A7359ECF6883D87D1BD45037F84CDFC93F9CF0B7D8D8795EA37B8A0CFDDB837D8F9A2327
+42995FF55E0C38E2CC9E57E10C5C5D6E9EC93650DC90A82F545E54C66133F9381262E21CBC52
+CD865192A781BEDB71AF318DC25239D64CF458839FC2C809EAF85AF1AD027E0BA8BC70AEB164
+8F345E7B6043BF59FE71C0B20F8BD21CC93C9A426E80D62AD487A60654EBF0E364D99B90574F
+072C52775B239A0DF62F256F44870302D077D114DBF83715E4A07069104876317FBAA1F7ADF9
+F99DDFEACEDADB48B397B7EB2A37E190729F6D31474F4F6E2644C697E0FD8836DE337E05A8B1
+B8CBB7A5A6BE292FDA3FEE754C5F9FCCD6E4528349392FAC86F7E6BFC953ED5378B7C5EA0D8B
+2AFA34DF6360198E5FC5ADFEB120D9FC498D8DAC8644E9643AF39DA434BDC546FD2BCAC23511
+AB1687B7943F299285D071115B4CBD650F356E75F478C5505A7FF036BEBE3682C3A00D047626
+1791CF08EAAEFA6F9333C66CCF5C9E59C14829B853A660F3FE3CCA0F1F869E3A31D089E373DD
+A04D765D25FB0B6BF205A9FD881F00E99113C5DBFD2FBD7ED608C32E9D51FDF6454557DC52D7
+2EECDEF0AC2D8E89706809648515BD4037379C6057BB89AC4B6768DBBBFB672329D3C21036A4
+804682C6CFAADDAC7723C715842B25B03FA1F12A2291125F34EF7DEDF897EF4A7506F804E337
+0814F4B62612B35ACD43A33A3ADC76815D29178EF7B6D2C170FCC1AF75A9157239DDC78A5FAD
+4B7B759755F63031B1A7A6F6C9FAD4CA3B4F36E065E3BC3ECE67C990411940787058AA52A00C
+51E29250B624EAF70C9E236898B1E2491256E9C4399ED8ED5B19F5941E76F51B8F16EB0A96A2
+9FB928E35ECFDCA1BED3B12D5B5CA1D55BB2E4AD69FA1BCEC3876142B7A194388538F5BFB028
+402E52505302F482BFA1D6C2492FFF4C7C882B6260215B52279E25E8D797222A2E4473CB30A4
+489A6F2C566A79E9FD940BA0E15C52C8044B4C725358C667522E784194F87C543D9F77342757
+2CEF02F46AACBB4EDEECC15C3E813C67E68EC8485112A1E19054AE9B877B857D9466E69E81F6
+C24BA540A3D716F2E92659D252692C1D5DEF79BBA8C6A7BBE9EAA7CFB7721810FEC93F176E8B
+9DBA3BEEEAEFDB577C14D52D2676566F0D04DE6931DC8ADCCB09022D30B84E9703CE37845966
+5946CA535D26B3094D1B493A5695DA6DCF79527B841194790AF65EA24FAB98EC08F519743248
+FC600029F2469C8FCCB2B27182928BE3F1AA4405E14C7AB842A370E45D48AB1EEEC9168825E9
+88147928854FCF974821B19B65D9FFD57333D3EC10B21588F04F652A218D8E5CEC3ED25BB6CD
+5EB1789E3CFAAACD95B72455C5BE8FFAEE0636C0788A587C992E6D1FA1E2D5EC8EEA82B6F75F
+413707DA0EC878352E92FBB1608506CC3A4D1F676D364524C8B72C3AD5867E03B7642F335B4E
+0DD6B59957CAA5C0131C8A58E0F95EC0DC6D75837291A7C1DADBE3F92642D2CD4C0EAB79CC23
+7BCB33E4631BB90B0CE4D63A936348B7CC37AA207BCA6410F010890F23F6B3F6DA3C7A0643A4
+44D2E3D226C754C1598D72AD25C25BF5FDC1895E6D23B9632646EF4F314BDFFA94971BF6FCCF
+20EC37B31520221BE10025C386A8A1B3280BB47FCE113BB4A5F29AB70059611EEAB412C0A969
+3E30993FC944B38B11211594B5AD84B0D622255A372F56A150BDA57451FCF52F3DBA2DF25BC4
+16759E32B7B19309C1FA25AE1C33D668145F2E645107CCAC86E741342CA4301685936E12234C
+8D612F9314090D5C9209F5D154E678BFA3985B03CE6635AB80B8ED2630B41D7D223E6ED1625B
+FCC417BBC3C9E5BCA6256260A06923EC1B9D2DA78C8B55B05CADB5785C838CFF582FE167CFFF
+88167D7FB3B90B276F5D6F78E919FEBE8F9B58915129CD7AE5CCA6CA9885D22CF7084994D101
+B81A675D0314C93041B5DA1899B36DA5DB30676B5F1FC0F3A98A33916B47E0496E3DDB771098
+9AAB7642A1F77E5CF5EA22F75432DCB7DD2AEA6FC7BF8C9FA07C7F28F7D37CC13D3586D4EB49
+CF579A95DD3ADE1DE06869687639267085352DAA0A19E8F95E4A7E31FF0D17CC87373690D263
+4852D465CE0FEC652FB6D710163C738CFB030BD4935EFF80F7DE7D7F06F0FDB1F4C10B07938A
+C60C74E442E1F3A6BCC8BBDC7814B6E710C41AE1E157538871AFE3518CA8834A4B4DBC59CCCB
+6DA74715ECFA03E98289479C36D00DD0D125B12F63B45E112C7AA1C5E60B986E74E56CF95C80
+198381207AF0CF5F17A6635E2AA89293E67D2C549D110A2A57C02C581166747BA758DE5D5F10
+686029D7F0A82E7E4889BA7160762431E00091524EA5B12C9D4493F0CDCE0B4DD38EC792B4A9
+2B0DC4539A51FF1D613E75D981BBB9C20B3D53400AEAC4970FF843EFCE5EB250C1283AEB8315
+73AE15427928CC2A9C0C3B04B7CEF0DBAE549AE82AD2FAB68F5D7463420EAC2CBDF421BDC88F
+2A6B10521913C6BFC6258598EE979570E9E555F475B1B26721F94A5462135E9705FA27259BB9
+564253D058772483B35A487ACD624B8D9FA02EE6BABD73D308EC29A30CC32BF271CF95B3B070
+160E31B8649192444A80DBEB812D1D4F4BE00FFEE6BF7E4CEA75A1142ACDC28EE252228DAD93
+7A69B3580830CA904CD6F5CD01977F6FBA3A13E89667DDFC777F48DB2736D78856BAEEFC2E41
+C82C82466D361AA2D02FE20568F584088F4038B72E10695253D8E095DE4288A48605FF431809
+8801CD4FCA473F8C3316E8FF9CEB463D3AC98EFD0E30EB743E250B974E758E86DF712E13453A
+E6882333F16696A670D28AA612FB9A03D46C4A866155D21AE216E7017F06C6459708EFAA13DC
+465BF43EC202C8F556945FDA8F0E06A527A368C577BD0E5857F35C0AE8D0401EC43D1FF17760
+A7D9893DBBCFFC86BE0747E7E6E07736EF0146BFF75DE5715E45F8EE823070433000BF015DD9
+44265CEE7BA9BDD434A1D78E419608A4B19C0F74CBBA354BBCCBC13D0BBE4BF95072C69762D2
+318D2E637A918ACA900ED1D59011198197E8DCD7D1CCC1F43890453AF9F70F821234C94E6F35
+5E494C38E279E28C60BCC6C4132405B8CD1523A1BD77A4CBFA12C6009F5669AE3363A405EEA2
+8E7A28044EC8B461B342654B2C24D50F43CBF0887C60C225409A289EA660B77F2286ACAFF8C4
+656D4A369D39875D0F10436857033D2C5AD5E2619557B4F2C88A753249C2DA0552BAF19916F4
+6F7F3A1F1356AD2F047B55F002D0509E266C184A77C6FD56071A28089B1082C0E80985242C8E
+3169E754E5CAE6AB2EC06B5D8F1189E325485950ADA8A30F12BE6872D8393BA32C1ECD6A80DB
+0FDF54919E9A7D9DA15C1BB823881033ACA8C21F3B806722F5277AACAB4A4E80222B3536E50A
+2E5BEE34484310CEA6573B48F992D2B361B13F3BBD14A1E65C58B6D71CE393C3F340FF9806B5
+4D82C04076AA5A4343E53785B3BED4C8A78593988BF3432A217AB637583E2898257BE5EAA11B
+84231F6C9761F74DC75FFCD351F3C4101A69C98877EE17AD11541D7F57F6F5293CB956A7633F
+541EAF253262699FC79E4A396C5D3289C3CAD0C31AC6CD59E794C80617E102B306EAD89EA036
+85508781C79645ABF8BE697710D4D5821D1512467B66DB602A2DA5E46F646D685E09E0528C47
+9C6E9D6A5503B99104E0A5535E0A62683E520063BF2698701896B39D26FE9D2FF2BA0BAACA77
+A75FF905B3CAF7C7C8A5243C54469EBA42D0ECB15AFF53770C93A32B18205D2FD601F88A36F5
+3B93CDB0A247C4E5750000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.1: CMTI10 1.00B
+%%CreationDate: 1992 Feb 19 19:56:16
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /sterling put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-163 -250 1146 969}readonly def
+/UniqueID 5000828 def
+currentdict end
+currentfile eexec
+
+8053514D28EC28DA1630165FAB262882D3FFD20326947B1065649B533EB5E9E3A88A87FE9879
+18A687950B26F647D6E08BF14D983ED1D4A8CA1E2DA8D985F9442EB916F5B6ED0697AC7C33E1
+E36A3BF460D34CE45F1631871097CB04F18E38894CF4AC1538EB19481311D24FE3BE7BEAA4A3
+730E8B4831FE59D6D9CE2E46116B629C7BA2F9CE3ECBA2F43BC162A5A077CA1B2882A42AFDCE
+C3F4B75B5D63E0BC8E5DC95257766D8EA467AD9CBAF47BE60F797580CCED6884B3A68F70C91F
+4FDF80FD00ED9139E7F480DC3A76AF72AD9B434187730BDFAEFE4CBFE5C7EDCAAF249204FD70
+3011932E5A3C27BE468B7DAB69DAA18DBBB6335AB8DDFDC607961C7C02582763FA069D43563B
+A17704029945CF42FCB19CF78C51DF0EC4D851086D43C1AB38E865EF36865FFF3A08B01CBCB0
+70BA4893F7482DC7819AD03D337E520E7D8CD83BB8AC7AFF4DF36751F4F12AAAEA2B6D7260C0
+9A26E987C904003E07237DBCC4A8E4E85CD3259F40D3CAF55C742CBB40AD0DB1044C20A4F122
+A63F7B811D945BFA69662189CE4D089464D2EAD9F6ED60B581B04114D5D45E97BE27A5763515
+4E9B8464F2A0DF18DA855EB51B8F64D3054B0B2E84621F025A0776D16FEDB988A43D2D64C327
+68DD106B9F541AE8E68AC0BB7399E16F4D4BA074B2152D0A4E9B5BFC21BFA0D531E28165E518
+FFC054DD4ED0D74ECA079D20E79670419F92E03BCBFEECF3554D661596F6F29E12170804D15A
+250D917FFE7A8B6E8FA530471ED97BA56481589A65CA13619129F1E26AFFE6C22F0C38540F8C
+E37EFB6E9E9B60B51A5A9CB4454FD7C7F92F2F9437159687AB590F35B946A54491A7739C9269
+E0F1FB48B129811C82EDB3171CBD5105FE65906974DB8A7DA92F4F43DC7F6B366981146D86D2
+3613A0B38D9D6191DB9FEA0172E982CB1CC50E382F69DA1B377C1BE9407F88A2A761B56F3984
+67A057F35D18C01CC377E006182C891EC80272E22E3A5C7123CD27ECCDC87392A9FDF63BB40F
+02B7649CFC53EF933C6518744CB89CBBD437830EF5B1D58B00B67BBCF4426DC1E6EF583B0B4A
+D3AEBD741E3FF0F729AE271F032019B1E7268043FD215BE590F9CF24DA14A90F1683AFCBA800
+6CEF5D5632C2481FBC1BD8224E8952DEBB7C4596A237E5505AC143180956CA1F603EEC70CDB4
+A33E1C4CA1744E08940CE778E246938429E09E84F5D90F2822272E697A2B4EC52EC64D678F49
+D5AB137C105A467B7C4FB2B599B8536726935A90145F426D2F022DAD53995B991E97744C027F
+A0427CD1117AE246514032F3FBAAF6FE9B496D6A2BC8BFB77040D26EAA434609FE89C1FFFC3D
+8081B8663582B893912B7C7C56E5753D23DC2FEF5C3AEFA09929F7470ABDDC99ECFCC44C9456
+5201A19B8AFCFF6C98BDC87E6A7900F980EA0020FDC7ADBC97FF99578B809932DB7B9B6A7832
+222855A0A586738DF9357FD3FE15B89218BDE940DC77842A8DDB973536AB81C2764AAEFED023
+A7F0A3090FB38CD8D51AE7A65300CFE08B3574C621CB1A9F8EDBF84BB034A399F6F4237171C2
+D38DA96707E2DAB287F025A8D50C192A6200C771DF9E79EFCF03E92C0EB5E66AA1D3A0AF1F40
+789D9EC825336FB0FFBA43BCE0F388E21485B432E9BC85AD56413AEF3AC49035CFC5D31ABA69
+7B505385DEC0D36F76849FC55012616820E4D2ECC1E05A16A98438A966526344DCBB7FD5A355
+2EF61AB1CB2027674AAB594074DC7B4DDF7C815529B9ECDF39A148D855940D0A60AAD8F7A4CB
+1B8C1402BFF8AB3EC10D088B6DC9B57E047CB7E1B66645986DC6C9736F707ACF15A687E04A8B
+D48189A4933945FB77522F1A4DF2A56479FD4EA1747671E0324590BAD27663DC32ADE591EC57
+A1414B1332BE3EDC56D6E354CF94C1D793A9BEE0646C69C414ED22905F413CFA73F9291BA0D0
+BCEC956B0F15FC29FA7B50C20CBFE3069F86439FD2454652C021183D3365EBB8A3632D338A85
+D22BBF99D4E26AF8F5E9DFD464C9CF24FB59A2F5D08CE669207684835106491628AB823F335E
+3D035C72FEEACF1B1957AA65F100480AD9D185E042E5732F86A8C1A74D3271741F115B15D54D
+47CA2091597340C5165DE89E3389292B62F4C38D90C19390AB221460976A3BFBEA7130829D3F
+749E5E555EDE6485F2045E6736617BAE92FD4B6286212DEDD3A130257A26C96B81B73059373A
+B37D1B5FEA8545E584B28D8D9C943AEC6D67C9C33BC448F42C56264CA8166302A6C58616C4E2
+418BDBA38DD8059838A708E92A1DEAC20FC598D6B1D59D910B8DD3C9D249D55B2B61880BF682
+A3DD3F28CE356CC554AEF00887EE102657670F51256DFD60B05937F2B4EDB62000588383AA24
+5AE98F52EBCA209BCA0146A1BC9151106661CDACE63C5F043BB7C17DE121CEDBB2CEAA3B7537
+7A842C58B8757196C529C828A5B1815D7FC80B98304A1FBAEDF32CD0C397F4469F42D36CB3B1
+CF29F93FF29F6E4208CB5505F08428508CBEF9C8820310277FCD3E3D69210029606738ADF321
+480B677B60D9AA7A1C3338B74CD5208B695EBE12824D05643257C55176931FEB01CDD048B787
+0F1CA60BCF68D3BBC0DBCE536137F191FBD51FA9C55170FC801F6DF907E12C7C84704481CF4C
+464C0014B93DC2B2F3346420FC8698B3397F567FD7B7A12A88BBDDF910BF6EA1EB7A1D45893D
+0D50A0DF8EFE2119BC1DE67AA1F8E37B685DAF05544796DB85043111C781F18F249D5C89F463
+3157B5375E46524DD71E1A373C984F7B273418F3CF69E085086B81F0CE832A74407D4BD3D57B
+B7692DC8313B5ACBF58288CF188509DECB393C91452BE861715591ED61BE38953264EE1FE854
+4EDB10BD57576A42F4ACBEE31709E75F4B5E19E61C9EB07D0912ACA3FF457E4B7DC75A7F176B
+5EE402CFEBD3F2AFEB06F55709AF93320CCF02343EB4E06A98200A4B8BC6A9B284771F239CAE
+3B24E69BF3580EE9530CB0E5821E2BD42BCF4DE01656F02EC010FB1436E9C7420E1C9800AF06
+C384BB3D13418B406330C755EFC0E390A25AB3EB067178D072BBD883ED6676BAEB11BB627D6E
+3AC6DFD4EFF8D1C74216ABBB2504E0BE03FA43574FB09D0639CF4E1466C799486EECC518663D
+2529AF8F9E9C01867962C5936AD3F34D9F62151A3EDFAC604859745C8BE54B96B9C9A766A589
+FE16FBCC9463243A24F769F16B4E0D979BBB27D1CC41ED8088B5D5D39065010AD56E130B529F
+BDBB67100EBB288CA74A4FF762FA0D4F4DC509D2E40E550A6164C20D89D9716E44ACADF72C0F
+75B44A025A3748BFD1C2413F444420DDD4BA0F451CBE8F70A848C7175530BA97BA140B88152B
+733E59842545B1058B3C9C3087045FBD7CA16C6A7D35EC93D9F4020AF5CD96164103C60A8FEA
+B77EA9589A6C57F0DDF087C37D2F908E3ED142614B468C2C55C1061507993ACD42357D8DB592
+260C6F387F3E68F346BDCC88AD2EC3F42BC9B8BF3923066623E6E7C603FA509FB89D3B6AEEAF
+2F5D8DBAF5883766FA5FFB70632D1DFEAA43BBDBB479C67CD9101C73364360E07F71CD82C0B4
+384A671FFC0B54192CC4E4D200BC108E94F27BE0D95E96B4A5E2A4EB1B8A1CD34D37BB15D3D8
+95A0E2E9D1FF377A2EEABFC9D79E37BB4526A97E25BE20ED47F48919D0C8FD08616F28E955BF
+C850A75BEB2D9C495904690A16E14F9C349717A60191C1E3597273C7725D1999CCE450EB4018
+7987D12A073A6F7B21504D6E352B005F0B76846D78EF496664B7688E340296E6409A0A514618
+19DF537F25411604DAE5ED05D2BE1C84FEECF8A4D1E6979A4267DE24650F91595F5CBD8A557E
+9D76BF0C0A012C697454B7923706970DAF97BEC8D19000FC6D9526896B0A7082A3E467DC78C2
+4592707204325A38889B381AC8AD33BEB76B0E6F065D86A6337E2252359860E2EB3DD8EB957C
+D853FE1397479DD2AC5AF33E26A3895CF08286760D20552A65C9559B99CD1003DDA16CB0EAA2
+35AA8894339CF6DADAE0AC5F0BADB255D9C9F9D480B9AC3810959E13D736AC95BA70B5B810A5
+7FD0B6E986DC38DBB70A6F81F90A5458716DB0D3E121B6357D36D75429F9587541D4493D5298
+354BB2745D6148314338C2761C4E84FB75EE364F44384D9B03B81C90F6D35FF36BA9296A7B1C
+03661D7C4BEDD5E88924692F98E3269ADC4368A47E3729CE298E0A86A3DF13AA3754D4A59048
+DA3AA3B2A48291FA5358F1FAE1E833E3FBF6EFFDDB6AA644BA2B7F1F4EA616A05AABAA9F7F05
+F9525964A3A82BBD155C22AC47D00A01A81F5B85C7DEDD04E707AF0B01BEA577224814281123
+93C8B2FF8181CAFFEBAEEF47FBE8D24B5E906011F1FD208B2A14AE81A0FACCCC85A7628FADCA
+B755A3BE8C0365485E2F8033FC40AF6F2F93A55366EDF457591FF993EA13BA6D12F31ED35385
+EDF1FD7A9273208B118D2F105F4B2FD0745026F3133F78F624FE464061CABD65C13D22F08CC7
+922E824F3244754E97AA93990FFE77D9ECA348DC30D7865A9AD09E67394A89536FFC851F486D
+541A52CA40BA74EE0B312CE09168116A7375A426218224E725A871EBAC32E672718803840A5D
+D03861B6CA4D6BF8850B5A328435D0DD7DAA9DE329F123C1B658FFBC41DBC48F5E3160BC6091
+3268DB289C3431B44DE07027E6FE9C079DD3FE1864A58AD2DB80F3E4BBC6897CE5BD288C2556
+B1B17D67021B259C4ACF6993304F6AE48AE0292E8769A5D6BC943970383715F2D03F8D5956CF
+8C86C0EAD6CCD278E4C415350AD8BB589466166B3EF12A36037BA29C14C387702C7EB301B4FC
+58E8660F3738949D98E6A5537C4310992D7B96D7045647D32B892273F5ECEBA013932F923BCA
+AAC00D62DEB318DFF3288D73A38DBDF8B40F690EC4F246056E8869193F03FD2EFB8860DE3BE1
+A30FE9D642A3DF5C59340394213CAC491A554C33A46898E797BE1BC70E04B586367D451D98D4
+3F48BA27E21A00DF8F0792967BC7B7F6483E55C7D917B11E973F65DD003D5C732163D291763A
+6C598628F789D4866B841B7E4321109277FB32DD682446363452F494CF0067D159C16352D9C2
+60AAC8673C74E10517FF30F4C0C4F51CE71D2126155E22ED3D52A523DF27E556B0C1B3523354
+6396F9921B62FE6BF3592222C9A868F6FF989C1E86C86575DA51D336CE9ABA13532A59C420AE
+9979EAEA4DC665ADAE56B7C1F4AF84E9C5454E17AB14C6FB7E4BC58019DEA386A294B2F4C8E4
+722BEF99833C5E7EEC04B49635496B5FC7D3D277B8AA40D9E87F154BAC8434B86332C628BF0F
+B2C5B0225DF39E5EB5760E19D21A7B899BECBD9C189C088F66651E5832DBE898DCD0B0D3E0C4
+C0A7A81AD20EFD8F2ABB15010856DB816C72FCB7518839DEE4B259C6E88B9FA2B7FF3DCF2016
+15D0047712D8EC796F99FA5D4FB2500F879B9EFCF03926C2F43C892FDE4B954FC5496E4D1A11
+66AC197783FA28F54063FA50EBD85DE2A5481C387E9DBC573D8604642F932775B37949E92410
+E339AE70A74BF7E83990E4A29649E2E4F9DCBF8E680F9B5E5D469924983D791217D043907B52
+F8D3B3A8F80D1BC70CC13A00A1D60619E886593CE96331EDA74F52C79ACD9321DFA9A2B14740
+6E937DE49ECCA2B605D7364AE9C9AD75DBAE4DE32033A8C7558ACFCF6B7B616DA13BBD800EFC
+CF68441503558C1E42B894FB730197B63D98F0FBB1573FF2DA8DDAE506FBD36F538FF7B84525
+0989B8EB42290238DD2FB897F223A92510F6BAE5240C620D32F408F41B5043074C267709B800
+EF5E78BC3A07083C74A7755DB20F73AB7EA69BE17674632CF4BD14DE5B5EE3CB2CAD485D7C57
+73055D8AC16862EB87A584BFF94DB2CB3ADD7B7A3BB91202FA30903B403D7052FA1A7EF796E1
+9C89229FC8E5B5457FD7FD56769A4A21A7A1D77EA6BE8FD42CE82D40F0FBD7DCB53E1DC0B2FA
+5F9E55646285019CA7A780D6B47820124A9340669C6E5DBBB42E5E4561D068D3EFCCF308499D
+3D4CBC3105FE9A03122E3E78518E6DB513AD56D20994794FAD9118EDB8964E24219E74CCF25B
+4FAEE0086E487D7FBAB394059CFB6695D22D58387D547BCBE98D88F259DCDF1B2C2B68FDB052
+FD1116D6B584970A7F8765E82BE89F08EDE9EBE22D24849593C2166A2F35CA1C5C423E0AB955
+A87168EBF31521A06D5E888F15A66ABF2678E55F5998E868A14967943252DCDA93AD962BEA97
+37A91E3AD4881A41F8D9ECA94B0A3F66A29DECF1A5154E2DA9E5F921484DE95A433354DD8F54
+48D6C84B7D8A8B4CCC5A9FD2812C40146E1E34F049E97D5FA12420025BEF27EE4EED347816B2
+F8BC817282011A9F467654D7D33F0ABC190634978931FAE58288F66A8D057AD853E6A1877239
+095332735001B0D3A387410D82F8B150F5757E7FED55008556F8DACD57376D64EF29D14F2606
+DFB3B35CC3AB3D78CE2D9FB33352D5CA2EBF74204CFDDBC3E2A4841934B14CBB3C1B55D6C68D
+61087C8860AB978530CD76AB5778D854EE0D480C0622876701E257081B1862A0311ED3CAC02C
+90CB20D0FE5ACD34A5BABE578D188E804FC6C27511A5C8D6AA7CC96E244598C7B9D6FDD0F731
+20926C4436B0D0E6D549DE336C308355BC338CD10A0F43CACDA8DE545FCC4B33EF64C1125E8C
+CF9CE2AE9FF75FD93EBF6FA54A53EC4D13613B6F26F8534B8C829956E73039B5146FD549129B
+40ADDE993CEFBBDBDBD029F96C5C4B68F9B2EEE6F9B5972053BDC16590FC6CFF24B8ED696BDA
+5019A47B2FE78D3BBA20AEAAF10626A4536B43A196B6709D03A0E46640B1003979192F3D3190
+458AB3FC9BA4E05E840409657C3D12D160C359BB902F7C090557AD37A72C04B7D39BC261FDB7
+ED03D1F72932A8E15897F4871E852967BE07A0A41636E6E860887DA67415764AAD5E5E1525E2
+4B6748823B012A0B7F78F686423382E18A8BB0908C9D6A3AC68759A8D5BF2BED2D55142C7F52
+4B2CF5C7E699CEC25525172363EAE0132284AFE68F36D39F52D5E25C111F68237B41B9F69539
+72E89CE7F43FF62938CE5D51D730D44CC79AF928D5FFCA2A27D679174D21ACB0C6F0B97BB119
+6658C28722FF78EBA6033756277B14352B7349D9DE3BCC97B990086227F002BE7E5A930581F7
+6A5712B0A8B4586F4149F2E46E5A7728B708BA5EB0388610EDED2B66C0B48AF87565CF9FC1C2
+BF488B141981B906A938DA0A1500A07D149C336B2563BF25F03103FC515224C45EB8D05C3AA2
+B9D1DD5A3753304FCAB6BA868C21D32E6D5B26ABDE7EAAB5B0250AF4F2F4E773FDF134EA6308
+1405DF0E1C3E3557C8F94B242D6027D3D186A2CBB0867291D7135A3A80106193EBB57157FEE6
+720B6E4E4E13AF432B1C197DCFA0BEAE1F6A7912EBC096D22E8B48D483A4DC1070FF8DFC422F
+A1971834C27FAB2CEFE8F811804DAD0E8A47566DDDB6157F766E21847A79698BC8616B68358B
+CBFAEBBCF88730E753EE02B2AB3C4D2F5D13E67C5F24F74C2D6B7C06FDCE184C7AB7478A3AF6
+9CD1600B258CFD04E29E8A8D90782CA96740AD6FD48590435C47394EB7F73D0B213757BF50E5
+5D9003B5F53E2E8DF40BCD0FA6B5A5B4A86E710161BE8FF0C0F4EE28A8119F1AF1A28F7638D0
+F76D86B2F99A3B5691C1C3106BB4A7E254B5422780751FA1D76D8EFEC2A1C3275B98B0E3D595
+24F933E4CFD96910E59082C59043AD8EF6802D99E07173F306290BB5CAD4B43B4F2786296359
+E445DCAC16FF085ECB5EF331CA1BE4FD7875DF302A589EB8BF11D1A85419FDF10708D0D4F5A8
+CDAB0C7F74D56296A3FB3C8D7CA5F80AA19122EADCFF9711E7CEC929B30B2ED69535CF3CF6A3
+D7373D65ED5FBA3E5E4CFD14BA54EDDF0AA35867CB7ACEB44D12C3CF2909176E6219A0478F72
+FE393C34B4C0B7F844AE17DB5AFFF0B216539365A8AFDA4616A202A10F148532BEC7DDB5C089
+64BEFAD32C3D240D8080E3948799A5C99EA538CE687DB7093F151C0DCD4C810A83733AC953BF
+F76A0988B356FE694FFD6371E8ABF826269EF1FE6E1814B09D99EBF4E5A6949726B1064F16A5
+D00AD8B86BB7A5F9B3252E4ACDA4DBA523F5D662E116C02C70088D8C6F93E3747D6E950D8BC2
+A10FE920854D32DCCD9CD1D07A730CB2D02FF7134155FB2216ECE0E586BC9ED91EADAE541C2D
+27F1E9FE1150F50E1860AC136674FDC9FC0C2BDA554269205458150EA28A3228E9A2A3372DE9
+4888D001087F64CFEFA4710735621D6EF35228EE3B257F2C69151F6E119038DF1643C44850BD
+C04FB362276EA0E4FA4FBB5D635F98F4B1A0F9B070F1A38453FD6C651F0F90EE471148628FBE
+FFA386BCB1E6F63366EB7FEE4920776995E90E0684E05AA0A7EC40D727F4E3484B02A3E66CEE
+07D18F115ECC0ED297F958E123298795150F427D12AC6BDD2EE0089FF6910AA577889C668AA8
+BB5076EAF7609FC498C6C51D4231AB6B2E2850A51B59F94FBBC89206CA91FE9FA81AA9AA5D81
+7AE5AA9A45A6FB85D5EF47492E95B9626C1FAA1F8DB33E8499712992CC43FBD7F2570B15EB0B
+F1DED971B2EBEABF24240034BFDABC06C5851E828980DDED018316093EA6988DA1F76DF79CFC
+90AB99CAE0330B7F2DC517F7745EC3BA7096D76013D53F093D1C21A5D475ACEF361501A97F1F
+034802DC3954294BFBD0F9BE301714D958D81EEF8A0872458529A155B0C79FB4685DDBFD2FBE
+E420EF4CE6442E3475211D10E50B9692DCD25E5C5473A817237552934848BFBE48347E38E0F4
+D851E0C3374EE6A7915C702C7273050BD74A118FD3E84E0B45B4F3EA30F0AC4BC4689DEACD67
+7DC7AA91E62889515D52AB416B38103308A7B301CA32E28EBFDF6FF2BB3D93E93AE5A40E9FA7
+CABA10B5F934387FB0CFE936F32274624A21E87D4556022CA7447531307DD5BC906A7457C696
+C7835FE81F3783AF019180AF5117B21ABF50EEA2195FB8C26738CFCF7065DE53F9E5C29EB097
+4B70E9DFAB6EE3A342DEBC28F95BFE393037D80B3E027E8435CE534DF47C97D9506889A22504
+4C018B53E519810AAE47E69F66BFF8545FC0EFDA675D3B0D9A4055CCE2FDBA4EFF27B2E638D3
+12FD1F49FED76FADEFA163E01D3C7C244363B57D78C871E9EC5579BFA2B0D9A220A172E6E850
+DED5D7B8D61ABBCB54540F23766DAC40293F129833995EFA7F52CADF88B7E00CE636CBEAC6EA
+4A8B00E7925B0D1AA5A4CB818BDCA2E70E37161F3E717FF40FD6F4FE77755F5107B3579F262F
+B59712C1B56324F8AD7028DAE5112926DB9ADA0C28D7E8615D96BB8ACF3FD6546E47FB2F9D00
+3C52C5175EBDE4DFC9E0DF447F4A8B5DE9370B4BF4DA5A84E435D53E28AB75966B41420D4D07
+98B8779E18141D042351179C8EDE08307509711EB00474B6E4B12446184F4AA94AC5327D5B0D
+2D3D20B4C4C135EE91B9E283ACE06DEB9C1715CA8B78CCE477131AB802E9F5514A82D55FD125
+A93FFCB4385843D91C56AC170D442098EB5F4CC728AC8034A1BADF5390F1D53923A0BCDBF36E
+55938B45F2D9BD8B10A7E5F5FB3245BACD83E9521CD85B194437A4CE9685570B3DA825A89657
+AFB6A68A7AE6ADF3EF5D92AEDAA420BBE86B7C671245CB98307159AF74BE629A8F46476BE63F
+FA1628377D256A86DB6F28C9BECC892C2406F04FE381BA5A253829F4C07EBA8AC16BE5CB46D3
+E63F1BAADCCE269C66133BE8CC60BCF6704721F6244CA012022BF3482C5B24C9DA23D9207557
+8EED35640056DE0BC4C36EAA208D6FF1CCEBC602603EDC85EEE05D4DBCD6791156F6C1731231
+E77AA5787240F70900CA7B8718CA1FE9BEC6F8EC59EADDAA18182181261815602583C85EBA52
+4C7C18DC27C3A4E3CC14C7DFFB2FD1670B36F2F4D38590460DBAA3B6A992AC133605603AFBFE
+7226049FE41E69F04C4A6B2A01D06F5519B55921F820D1A8D12F11A24C0323C35CA2025786D2
+CB09A5AF4E3C2DE113D18FFAED07A354B72F2190767FE9A06AB3E9A88F8B00CBFA3C12B82DAA
+7B436E20AFD8148006AE3E4968C2D8289F41CD7D4FFC61EAB1A12B60A3ADFDADCED9754F64A6
+48A458AE66F5A44737B8D16F436321069FEAAB9AE8B0C10750B3C400C5C827BF3674F0F34213
+2F9380ABB9A6EBD54E0E800840E24794EE8E3CF6C75AC62BFD288F05435340AA20425D1A9B75
+939C627F825DE6EC589F1E40632C49379345DCE3B3A4966BA4611DE2342E31E79B25B33DEA83
+08A96D57369CC8570E31DF0B9128B25A21B0FE44C4A61329DB4E50A43981686F9BB3FA50B4DC
+DFF19BA5B0EC564D94EE093D2DBBF135840EE31041AD4B3087FE733B9284B043E396535D0C2C
+8987563C94E25F0553E1656E0A120685FCD1042A292C68254F3BADD5931398A725A13641E94D
+7D4DD5445EC0C6B52194AF70E72BD7E1FC98418CDAB6C4C4684037976737FC783230E2812330
+FEE33D693C37806192F7320FD35A415E7ABE07BAD0E1835EE01BB1953F50B636077FEAC98734
+4DE0320EC693926A09A77712C8E01F1FC2E71FD4CBC088CFEBD6BFA203DDAD5F8F6D5CFE945A
+635AC949400167568329315A02EC5DA3EC974EB10BBE0A050FDA62F29509734DAB2732E32560
+9B85B7F6E72037375CC51C78304950215512966D69BBEC4575624074244219B2EFB7AFB8B5B7
+3E95E8DD8B71189EF22837411EF1E1FE4A3B07F7CE3C26557949035A54316349139CAD64E170
+B4301A92011EA16A3A5026E724F3D35923DD7F9595AD506B8D1ABBE47CE80846838A29BF7E0F
+6FB8ADBF7B27E1D03B98E487BE18D1F5E374647D0BFE3B7A5347586424980E645166D73B0DE4
+AC6EADB5680888D3E9D460C6831625FFC7C1FADE5AC680E00B6E5776680803A8FAB59DB1ED33
+2B48F8ED919AFEFBBAC7CF977CBF3B8D5EA42AE9D24AA6F61D86CF496473FEBCCFC23E618885
+D37D1F52D4AA63C1B0107F4444E85FE8D7A2F65E3183A026066444132CED223F436A33C0FE14
+30960114978F32EF956D22AA61A7C0AD7A31785CC40E7144482277145878AC842B2CAD5095E6
+1F1036C32E9DB8E771CDEFB32E1EE3D0ADCE43CB1BD8A4CAC9A68199AF84FF4185AB3E06C302
+DBA3AAC3BC39A8B34B9815955338C6768E90819FDE9BCA59951D8150356F659F666DC08DAE42
+B79D209CC2C305DA85B6E5BD4D471128D0A42A2FA4830C3E4BE1AB4E5754CB127766F80DE2F8
+DDEA4A5408C6D3D84C357E78A6D2F46C9A3E376D01A4CF5458559A0BF1BA8B74B444294C6B09
+7FF3EAF29A2853C30ADE3DCDF303AA4A3CAAF6728113EBD143B28EFCA63F6BC75E84DD59F823
+F62562ADC55EA78031A27E95195D79CCEB5197AB7CBEF883BE62FE3A9390A0F4EF2A2CE81679
+C8D73E5329A2C384A2E540DF0A88EA036835B03E17A605F1F350F0D5BAD65335863671CF5F08
+776239DD1B623897751C22EDA66DA46475D0420DADB20EBC5A7F325073D00AB388457C99FD0F
+90D1AF23394CC47CB8E520BAF775B53FD32573595AAB699FB443F766319AE602064858E50B29
+DEEB433427D44C06F7BB6F34F7F85F671B9BE353A477A6B79D8E03BD8418242D0E67161B453A
+5A28356BB9A8D9254DA9EA2847A26A8AF54640C65B2D84987038B16A232C40C4CD0A6C12B27B
+801AE135CDC3A3B383BD511B42B664110B632A822827C024B4E390319845CC062CE0C339C718
+C8179929DD3C590B8870B2CB4A1FB6B1D244DB5991783437AABC5E0D86C2E2BB4A57AE55C0FC
+76DFF34D9CE4F9DB23099AAC53901D436A4B0A8E067ED08737C79B75D9CACE67325006A9BF5B
+D158103C8078B901170FC86A95BA7671197527852E6FE1540D7F44F369CF1C204AC545A2E704
+AD937B06F5ED870623054CFBB8F04ACB4ADE6ADE3FF71525ECB8B0AD69D946E9CD1C160A39AC
+FEF4709AAB5F58FE637425B4C01F3AE3EA928F5A478481AF383CEF9EAC1BF1EA61A551DDCE84
+48791464BAD9554CE870FB1E85F8C40579BB4D3E2CBBABCD1566FE49A2E17F7AF5E6896C2737
+C8017829792CFCF9D753E0D328F96EFE2743CD3F351C7A5E7F76F7EF5C5974A172B7AB5EC867
+7FC561CF78E6A732FF636E46BCDFB88B2EF788908F55EAD2F0C7889A22DEE98E56324BD89952
+F6D389C98B3287FDCB14A6A45B3D9D3699297D97D69BD8CF7924D94FB0568043773A9A5ABA62
+09900F550E82CA6853EB148B537B4F75F33DF6CB3BB0DE3B9F4C117D9D24654235F5EEF54362
+4CC358DF759E9B9DDAA3E803C026B82E70A13FC633F0A6C3DCEF51F0B33E11045BEFCB233C5F
+9EF1672699EE26A19765210D4CA63AC280231E062393165C2A0E98A0EA1B68B17B88D7B98279
+6E8B943C3C889090CED654A29B0F6AF0ED78C8E36A5B753B18F5A571BCC68D3ECBCD50AC03C3
+1B888E5D3DE12CC4149983AECFE36E2C3ABA05A3FFB4D0D05676D7CEBBAD026905841F484B90
+E582E551638623876486AC664E131DAD613E02AB76F6F9E09390A864E045D567E67ED37B2076
+540FBEC8F8B10CE78F1902C3582D625EEF170BB657A7F47A9AE02584A15ABB2607151563ABB2
+0EA91FEDD2FAE81101CFFD5CEBB2B538AE0286BDF6C0144061C1283446AB96B4C1CDB8990B49
+4F347D3F776EEA433FAC0BC2EB05FE18D8E7457E1AA6E685126CB494B48F98399190D70BEF9F
+47573069D1664E4B0D8765A6C5081166C5A8BCED01B7EFA65EBF02839CA4123E9A8D565AA556
+4095483F605048606288F7A26CE3A6EDD7E9109C6078431536BF06F93345329B4C7EE3AFF383
+726341592756DAB03E82BE0B30059BEBEF482F3E2DE99CEE46421EA59EF355861E002A44E0FC
+A5A428336488F5B0B035989F7C569094E152EBCB52767A1296B72409391BFEE6185E10A29733
+226ABEF840D10B4F028F4EDE303D245601734B388CB9717C4AECA1C4391ED4054137F6ECE8A9
+33444E2A03F67985EDCB1B248E34C0EAE44F9C22AE1C4C57C8F6AAF83141744E81F86E3B952B
+0D5045E9C725B23F696B79A60F47F7106F53E331C19CA9B3E54EF5DA6478EC11537572947185
+3591F35BA2804F36982CD9A7E5A5963B79B15644CFC15913BE4186BB64BC08B0F4E7863E7A5C
+BBB251B2103B5E8322CDAA3A91D7C21455D7A02FC29EA9C9E1C8F021F39931A07080C140D8E8
+A4AB3476B4009CC66B8A51E7C161DC2E716472CEF21B68C2E5877FDA42F02895E3A7641FE80F
+2EED2B26682BAD62F860A9F149E17A7DE263437BC6335DF4979807EF19E4129459E2FE0136BA
+F9775D97A1DDD4DFC2D555695B59205105F096C80B52D4969551968FE51BA57A17F86177038C
+3E09E53B8BB5AD475EB70684CDD7FD7B7746609B4353AF0171434C8050CD2948EB7FCFBE73F7
+35BE287A5CA4E83AF8B4B26D9A939FD613AEF0F7B6D4126E15B0066F17DB8F57A513FE2C8F7D
+5AEECEE35912F25251E8853EE3B0E5A2FDBD9182A6B9C99BC19FFE8D85DBC7146C5F8A8859AA
+CF8935B1A0A2189FFA3A4118F1478BED18AD6FA6AE328FD6B6F9E0DA13682D4525623975AA54
+DE675E235A4E435ED2B9CB7248B0B1184D590988C9CC5C6C8C118540C67B7885FF522AB4880E
+6E6B9C2B6FF111908C62F656F99C6904B57A21C049B5CA876931B05BD1B554E818A1751F62C6
+7AE918082F25BB8B4AF8E9186EA7BB7769F924F8C189602BF190ECE0194A25277962C38E0321
+F3095A27FB7DA0614F717C2E0A575ED37EB80D6B38AB8C09470D64BB28194F05AA151B3A46B3
+71EF51E85C73FD3B9E3A7B476F9A21FFA3BAF12DC5F4AC4CD479795A2CDE98939AA074A317E0
+B553267028940A5375A7EAA9A1185EDCF27AA619301751477CC3F672A3D59F6BED11792008F7
+341A8DDA4F6BBF643A57ECECF19CC60884DEEA925C1EECAF3C024EF16B09BD5E0B6163CEFAE7
+94F61137C44F1FCEAF3140FC223BCF203F663269AD41DC27C04652FA4070B9BEFC9AD37EE79E
+AE5E9D703D1E05B9A1AF54D84D5F97607D147A77F9B90FCC5ED6626D18E2296654634CB36FE9
+44C321F1D1A10B1AFA8E7E158A32322B966B0F8ADA060308378FF18802BA6E8172D239D6C86B
+2D5F9A159B13A29C4DBDB19E2D6EF3502230A46D4468172D8C2497B4F03BC25647589252623F
+011CD0B852061893897DBD5FDF7F4282751267AD7D4914A199CB0F046B194C6277C4EFA5BF43
+05F8B9D6E97897397E359BDB4CAB04BCC2A69413ABD55545D4B47741FE9C55BA58B460C6554F
+00E57AB516B02EA6296E3B8A3D7CAC22D6807280F3E454708A2DF1F9037514CEAE8527659EA9
+EA852CB07CE6A14745384866B2DFF0AB77F6BE544DA12DAEA95824C7563A56F24BF8DAB88093
+31D11108CA50870DF03593C421D229497370BF92FCBCC0AC9B5F927322B896D96FF6437D6000
+6732B9DE9DC0AC9DDB2DE9D44F7E9B92A93F5E36F618EAC8CE21829C0C094FC061C8428DCE42
+C028B1CDD84980857A4DF74DE564B20FC20897E79A496DB3149848466B8A6BC493F3D4CC6D33
+5B57BD84C9DF116A6FA286F7EE401E7312D078AD606E8FD969B69891013FCD1FEC68ACA9E3B7
+9684EF7DE656DE419D92A46DED2C43EE1E3E23DA7FE60029E1F1511AD8DB52B2589C7618FE8F
+2242956F1976E5C174412EA691747B4F1BFCD3C23A60A298B99ABAF7F5B491F254D90D40209C
+23D0805128AD9506FE9ADD32562DBE0B81F2CA21592BD5E739EA8CC4D66690253BB5F9D3108B
+9591C3906EEAD0C837902E28D45A68E61971D1706F40BF09DBFAAEE3579F403FAC996449E1E6
+C75A24F8143D8A5B8BA6808555ADB90E32AF1039450F1A5ADB218825EBD38411EA7869AAC603
+E46E14D98ECE5432098714D5B26B353DC418DF386549353C4AB62BBC637FEFF4F3D37AFB618C
+6ABAC8F6F2DDE2EBABBC838E388BFF532938CFFD9EF0368A0601DD5FA4DAE6A9E866D9AD9EED
+A0FDB4767712518EBF3C7063FCDCACC116CD5D3585F52AC01B75DEAFA649A55FC114C2D6F568
+C23B54C519B19189868B74D5019C643032308066D410977D5866B582FB82D6FD8350B123EE17
+F24F2991C188F9C7B6F3B1A62F8F0BB3FDACBC48329898CCFF62A17D015336B0AB0D97BF3EC4
+6EAA032A9E68A8EC0F84519950FF3030F88DDFC9342B5804F3E2EEBC2364C6640A10C1727105
+AEF24B16F0CE008B4E9E669729CE5FFFB2124F4FE459AF66CBED05AAF92DF7008199A6904D52
+7B510E54CA090441DB1AE6AE16D07AC5FCA4B3CDE7F89AF905FF9F87B8B56F4A45F653026066
+34BEF03D3D5F3F24F655526CDCF2E897D9BEECEA419F0B8F36D83D42E14F51BF109A20E34E1C
+6BB749D94101F4A59D0B2325AA66769655AD84C98240920FF1637EE4F1C026D06A0FC596D08A
+637E8E87A48A8196AFDC361B0F84CAD1B2128B9AF38FB6B20B5979863DDFDD5673BF8F821D5F
+64071838BD74742548031F16D5B054425EB649CFF0D130381048C7AC73FD5D15727BE7218882
+19FF85A8B0654171835D937B61DCAE579F293CCDD51B0BFE7BCCB75E7EE1F2DF2CE6853539E7
+CD74B8B1DE9C1562897A4810689A246DEDF8D702094408F8B6C62233F5FA83A379B3376B1C52
+F35F15729BA9E65EEB7243A484CF7B1EAE66C20BF4FB6D95ABC1D72B3CB95D00934B8835D057
+6C7E75D2F4766296DA85E684F82368DCA018AD9BBB2724B4A30C9E82F52961B2309C158A4F57
+C85F898FE859375051A77A887FA4BDC0EA89CBF73DD8E6FD237B401424C2176D63B329909A50
+0DEE911C7DF297D9516E04444CF2323731AD408C2B1D16138404DFAFB9AE239B4DF5475078E4
+B8F201948C46776470C397C947B32215F5F4055803D382596310A776DC28D5B8F09EA2309A33
+5D97A4DE952B8406F0135F3C38546D9D0BA146088BE38DB7FC1E9FF3B70C21FCFAB4C6C9F9D3
+7D61EDAB276769538949DC39238D1EEF3DB92186EC56865DC0A9D69550547074A41C9A85080A
+DADD7FD96E23687898607A1AC8EDD58FEC4156587E7A41BDDA6377F0C436AD70C53663566C41
+478B8C41517A1540A0F9BDB924D64F07556892C569A372662641016E2321FF875FDFD236CF98
+1531AB156E2C793BE3E6354F074BCDD21EF4B7FBD9EDBA1D3DF52F80220D4C697497D6378817
+B40F6CBD2CF458B492356EC2F171D584055FBE7ED48223596B6E72EA9003F1219BD79E05329F
+564BFB6DE6A6F62C8838CFBAAA0054342DE83D409F7F29EE655D18DDC3DACD2A29B73C76F9E9
+67365D3CD235184A268791343E09B7A30098B3691D18568579B465B13FAC70F7392A8BC44173
+137E1F3D2748E0A67D7E9FD094E7AAEAE28D1FCC0D83FD68BDE7CCC21EC94E932D333B8A7623
+FF1C3F69E9212900BEE3656124D0856695096DBADEC466D3DC6A466D4F5D5C60BBF3CA100581
+36F453AD02474305F6427E6738C2728B446A0A6953C3E10BFE36DF5F3A3A447657FBAA426F0D
+BBCB0DEABC57F7EEE5D3CCB0937C7FD274192680DD79423CDCCA30BBF1EB2767178F8372ACCA
+A4E5E513D4D9BEFBD1C367BFB3588E396F0786C730D97F8BA01C5E060EEB124ADDFC8E68765A
+AF36768C1BBA0D7ABF871E43918D15636746D0F1E6AB2402DE58B57EF84AAE228D74A20D8340
+B210496D69C3A5201A3233C324B03E53F591B6238E7367895BCE63BE3A16504AF90C8C042C83
+A73F412A0B5EAB7F9A5BA7D112ED7D279A54066A8127F349053AC44E2F72E707D76CA68AD5FC
+15AC3C31C1681BDBDF289C1D0BC2148699D02DA09CA4051A71FDD63A772990E58D4E97AEAE7B
+20DB14643CA84604B4C692F23BC1630D516CE939EF865F7C44B8C7A182CF372A3B932B1D3014
+58797977C90B57C5E12DE0B62A8D664C699182EFC6B13BD762D4C713A85E7DF5BB9A8207DEE3
+C4959E4E4EA330CA2E5274725E735E485569D1EDA05F5997F16F7D5EB2947529CB70670698EC
+06FD3FCAEF47AAFFA1712F5A2FBB7362EEF33E66F0493C30C0383CA6C3BB1AAEA99BA3904BA7
+2C81F8E3D117B3A3603BA3BF9BEC83FD7820E3353D9666009922A40ACD570B752F58533C8996
+9B08308A96E11C4ED57380CFA055CCAFA9558CA0CFDF832F0090580C7BD5779F8C1A0A9F0561
+6384D9C885D1547F38986876971B2F5BB52871C05045E6514AF557EB57C5B2E86857FDD30F74
+958EED440E691F004F51A5A23EAF9C03B2AFB28A6E16005B928EE533AE50529FF4D58CEC733F
+C6D9D6B9E235D5C39A8EBE9668C7AF0DCDDB318020E802AB5B95871B644FEF014265A3536D3F
+4489C1A2BECF8D5D5D2D6EF984B5C4BA674C74ECA262FA2AA4A4B7164B04B9F4297482012336
+12157A6BCD92A7F3E5B6F642135F344351A94EAD13A912DAE64A132519C58D68AA11BA75ACCB
+A26F84E0CE0B8B2DB3788327C615003DE8F723C6C51549709FAFF2C7DC76F773C55A44A26884
+5D7968B52A7B495E93B22F128C569C23A29A5A662C939A16BE08DF74E525B40473EDADAC4DCF
+5226409F9982E3F9F28B9F0CD6AEEE91EA3E41453BDB07E84A01E165797B7E0C88399DCDCC66
+6581B746ED63D1B3FDB7731A98C2708DB56EDD25E6097A20094A11F79880CD47DEF83D4B0C0A
+BB991DB8C878B0874D099D7B5555CB668CD5B7BFCD2CBA76852F0874B906B1FC95616FE6237F
+40D3FD63E29F593A8842B151221E63CE8E9AA2080E5DFD5E8C1959F97A4E570FE6CF8234EC4A
+961BC15E46789446ADC12CF9D3E9DAE345230941F924FA7337C3585860A2870F388B14B29B76
+FCCE9BCC0233EE7CE39A242B0537594D14288C00AA67A08443E69521452AAB22575449C2EE80
+D0393ACD3F7C9378B4E49A5A4D0B707DAE8502791EBAAB3CEED7F2ED54585183AACFA76DC3CB
+ED28699CC8638293A2E885BCD88EB01C6E6C828C66F42F1D534A63B8606DFDF1CE4F8823D2B7
+1DC2E9CDD74703EF1D9D1EE0CB7241505366136E256BE79C31EE8990B0CA49CD2729A34A92ED
+BE12A7738CD2E4F4002C9F6DA211D57AA3D713850239DBEB9AB648BD9D195B1741AAE2F1386F
+E88AE159B9E996E7D803E0AF11008B345BD743433F080E70A1415BEC71CA6C331A22629F80A2
+880E7B112C9B6444E146566C9DC14C73C178D41F99CC78EC9D106F102A9C6435A507A2CC7C81
+B4FD18FB4099D61D0228B82BE3755659968DCC18005EC289BDE509D5A98A0317150A2C8D5CBA
+B353BF310C39459AF38B3B6532928C478C5012AF23CA4B834B3519575DDA13BAD7CE1BCFEFE1
+EEA9CDC76B5A076B14477C2EF875B310E9A3594A6DFE2A3AE2858049B280FECDFAF2AAF1AC77
+99757A833D0770974495D7094F1C1E4A91F51978E49014DF917E74310CA1C70CDD6B4DC90420
+33391B960FDC9E1945D256BC0F9DED7EE9235723A80BF0D51AD4F2F7E8AA91EC22CB53E485E9
+35FC169AB85BB1CFEC6BD3E7F234AA6FDF26042C90E6A3BE33B3845A1C9D8967A752CF387BD1
+7A76D07B7587E3AA378C07F47E452623FCD2C144723F5E40DEC0457C6E96C39D671484141AEE
+45579E097FDD98BBD391DBABEFC70054B0729AF2678687D9ADBB29FE3316D622B62C27C5CAF9
+4FE9843DE8ED1C21C9CE728C83248D77C6067EB67F12938759D82D41520A65668BCB3D45EBFA
+C664FFA0D2A0E7BBAFC03F8E849FD08727F06C24767CF30CAAD10F7F18F2E15E2AA8D3A3E49A
+020F70CC20919E8AA33F46681F33E1706CD396F9C7C93A19038E5930EE5104A48C3F9B308E8B
+88BA9CBE24BD3F26730CF157637DC8720BE68E01E4D511FB5C176C1C6EFD57E304A67FE102AC
+289B422D7CF3FBD39CE39BAEB79A0AB979506460A29DB8AE1A2D90E9571081D1FAD999AF409D
+632EE7B87E33157362DD18A086AE32C83AB8B960053B71D41D6B72523930794C2473DE9856D1
+F9E889FDFD70A1B7D9E887CE1FF10A2DCE4EDECDC9C0FA1F56CAB503F54461F3D3FA5CA082AA
+5E28D3CDCAD848BCE4C379276944C42AEC1D7E6C447ED4FD70BD545887F01CDC53C0E255246D
+7496B987383E162DBDC1DAEC6CE801DD3193DAF1DDC1DEB9D982E736226A601FBC0DDE4D7B56
+5BB1E87879443209517C058F68B9BBB48620B636846DEC19B8B2973B88A53F8B2E2C4EAD40CB
+EBC4C217612ECAAAEC2AC077E26E4FCDFDBB08DE8CABAB2C0FCFF66A040B9CC79752F1EBE58B
+6BDE30FA17EDA0AA8709CFEA344CD1AA650A08DF25D4D16F6ADBE2135FFF9E7C903D7B7E8944
+CD49F7612679C24DC4992DC27532CA3ACCED63CC6991F072875CDC4D1434FDC927FF15833CD6
+B195BC1286CF6C34E3E0E1C7B00309D7F5DE3E24FD3B4B3BE0EA637A337C831903AE4A0CC7AB
+6C8402333E66703FD34D1A67F580A4E63990C88AAFFC93CB6B4C9D985E39EA248AD715A853FD
+7DAD6D1CBAA35019A2BAE759FD04ECCD4AB9705C2D22522BFD7ECAFCBF5D185C841DCFF8F141
+458574398E865F5187A383B9172B85057D561B2515FF9FB9ECC617CDEC6F6572BDE8983939CA
+5F47607BF5A5F6017835C1265EAC50FCBB54D7E122A9F862DDC5FA00CA937D4DE4E0A385E752
+C1AB12570B0CB3B56AA751EFA9B06557BDC4C2634770B2DA7A4BFAB3FE332262BD6C49927CC7
+D433AAAE9D0E77A06A4954A3A1E75C0F037163D17C4984BE3930FA529833A3C6E12433EDC336
+24350B2EAA94A35C85FCCC1039C03145A77F811098013E850B768574E71287C35DE5DBADFAC8
+4B34BA3DB23DD1110956F415BABFFEC9B79A1360B67A9A22D75C5D2994A81DD54D38630F049E
+C4F0CF38C692E0F7A372EC2562648AA5B63ABB616DE6041CE69EBE2FBF2E1A4EDAF57DD3378F
+A1A445E64A7900073558888857FAB7F83CE9EAB5F020479F6206DABD5E756A481E4DDF0A6446
+34F63F796F3C062D4968BB1055279671DD762730FCCFF930CD60053C9F33A88C73F255254986
+B3055B66A36EC266D73DE57B2AB53A079031EA57E2B10B0FCB2843FD5A1B7AE569C351D7A28B
+0932EFC2F6FE1DB4C34569AFAE364BBE8C323FCE13190E6B21E6210B34D4892127D0EB8C617D
+BAD3AF3EA4CFEABA4E81AF57F6393C703006485397CF8C018A654ADE14BB99A8280028DFD8F2
+F1C97945EC437026E2000760D3FFB033AB8719AD5924F37E8D2ADB1AF1F3BD9D5FB84BDA304F
+E1A47F12A13E79FD0B268B309D784C6F874D5ED89C0B8C6107A704F61B9489EB1EE372285876
+83DC82FF74FD98CBDDF04BEDF35097E66154B7CC2130927C7A718F5F4B4338B2EB6FF0ADBA99
+0B5E94CD21265EB13FAC95B9E976D1DF8FF2496A60A81B9599B3A07E5B3F074E201C46D7EBC8
+C2B36F8011409D5D8430DB5267F2AA04EC5A000DE223D356574042C4FF128D902F1E1151A731
+E54D07DCD0ACF614B19AB51F651C324ADB3D8EFCE74B3493F0D6E56D4248CB06648C28FDE0A6
+341AE2792D29714C66C4BEBCA0A520FF3C312C67E442A9075375878C20EA6766369DD30647B9
+36191BBC344AF10636E49A4AC2E45D2680366CA41A21D0E5DC1EAD87A13E1A0C079F396230BA
+CCD2C4CE3AB39081651CA121F35B285CD7ADC2067E121C4F3EE2AE45FA8EFCB563C6DA895FBE
+84A0384AC9787D8C4A3BDB6E2E87A58B9FA4B595FCBA204488B377404DEE50823EEEF2221F1A
+C0AF2AB2761A265FE2C20D10E21B6E339A1D3A26F5B4B1A99D316C8CFEA7CCB52442D26C70E2
+2563062E982BC256947CCF59C3E09FB1941D7B54E0A42466CF642DCA91FF9816E6F406E0F0EA
+23ACC1959DAB7E7A8AEAAB05C2BBD5257B01CC8F0F111CF7360AC192C348BEAC6A273DAAF64D
+54AEA7D49D786F98D7358E483609319699A1FAAAAADE42826EE0B30D277025161130414ED914
+AF741854017A405F22CD4ACE4CDCA0833AD52F49142FB4C03924023CEE3F2489BB3CBE03B122
+19B9CAFD7AB8AA59AF3239248BC9EF6816351F9AABF77792D7197945F00CBAF769F00005A615
+B83447E173242A3BEA79E21FC28B383541388AB3D342EA87876F2CB55A02BC333A133FD05F47
+1A3AB493674F17AAC890F14450EC5708063591FE5E6912E41F971362180FE085706C880ABF1F
+BEC092828608D1EF6C52D01A9F16FC32C420279C559BE5C673D2439E0D774648EA9EBF4D9A84
+13E9AA815283E016FEBA6293838C81DE8C3E522AEAC857E4EA7891F81DEC06168B4A15E3668A
+61B924B8EA6FD11AB0589A5D2B6AB3E5F50BD72BD2C55471C19EF542E278F3874EACF4B2C2DE
+312C6100A3F6064EC98747C366874E2233E88F201098F75D4C275B2AE0CF6809BCE3892ED3FC
+DA718AE0F46EC1B624DCCBF6E84024AED20793FACF0D1FFD2775C6D6922F9377B1E79393F7C0
+775F2455EDE1A4DC311EECB9F57C20599E469C497FC23DDDA0D9DCE6C3B036EFAD121522C580
+31235EB8FB69FAEDAD0715E69EF1EC9701938DF927131C39848BEEB9FB862D13B8ADC13C86BD
+963108F816A3424FB414EE57B3C7D8ACC56E8AF2EE316DCD3E04C6271D733DC9277729683120
+30D87118E79006DD5AADF01BB94B308D6FECE272BCA13C7CFC41CE3C2FB964CA42599C73AC33
+71BF648083FAF1D58F55BEB093E4A941856836C7B5B8FA689996ACA0CE9EF5E14A88DFD61853
+2B692006A29EC8492F21910616731664C6629D5F0D6118BC6EF45536B987C0060A12BB18787C
+14174F7EA6A16759986D2A279842FEC752604D479B74DED432D712CD3EEE397B541521E21F7C
+3E5352CD5B98C4944FB08F9B1BC70F36288C273D1FD74B7A9A5565EA9E69FB3E4739A586858C
+865122210125AB07E4AABF35AF7D2948B8B13F69499AEC43242457B93FE382DB7DCE515849D8
+B91C96EE155BCBFB2F5160986EE46AE7EF74FF7870675B8E5D22FB8594F81D096A967185FD96
+32B2BB96190790E203EF5F2B0772E456F981AEC9DF29D7D5BC5AADFFD9D95D0446573859EE08
+6770C307B0A174DC9A5B9EF35D22DBF191FC1A2DFD554A0F8685A09D731509A80D2BAFE62989
+7CFF3B8476E6904A16A99393C66D11E8CF7A5B7B195752E0523A743AB8CC4F3283A544CE0D48
+5FDE0773B2E364D77519F7D1E9F822980C6593B1555F2BFC8398340C7C4A5D9711C20A2CCC91
+1D72A669737548CCE5871FF08BF72C8C38E4645E5D4E4A10687B7C81C55DAB8D7DBCDA0A1C70
+7AE4029DE0FC02378DA19CC5F818BAF6F88258430C122E6863238C0D3E027C3FE17E58083254
+83AC041EA5331368879ACCBE672677C0D91826F066853E5CD2542E035F6FEB730EE21EEB7983
+DFEEF31B1C803A4715E0BF3CCFCEDBEEC6F312F28F12C56739CE813F9F70649823E5A8AD5C3F
+5B06F82231F02D2DAAB589ADEA88520C2B5FC2AD7610C5069C0DFA2E4D74AF220E665869798B
+78C3E98EF345D16C60641B226F7A91AE700388A85F8933505BC0C3DE00944BF08A25B692C6C7
+D9F46EDB6ED4503B187530B3B80198623B4FE031CAB4102A3B99CF68123A38DACA0E49B2AF73
+362A601BE22299A166CACED06D3682820F3B97A546A093C9BAC6585CAB716611CEBC87841700
+88E5FD0D31596D6CFEB292EDADA2B6C3397041A8C972EDDB817ACA9139F6C4B82E0D39D11CCC
+87A191BD10E23EB94C55BC72F4758DC3240442DCB4A1D2C49A6A05256A22DF07703245443597
+9EF2993370A2EC7D6A46E832FDEC1F425F9850535E34000440D72420263103170EA306B15596
+086D2FB6DAF78202B2E7C7A82A74627613521CCCBC4F378E7C66F38F4947641FB07184F714D6
+AA5EA036256C686948FAB99043D6EC0E5F5458C376DC98264E8D38BA725CC94753F37DFBBB15
+57BB10F9B300BC91943220B4C2F20A43041A60C978F4A69A9536E02A8B088206391DCEC3B1D9
+76C0E18642B3BDD7513757CCC85FBA444D3C007CC7CF3F9CE68B75B8BB43D3CF74D68DE3F789
+19BF1DF0E6AD61BD6B3B57571C72E387B61077A28BD96087C28BFE4450696DE44EA50B375EDD
+76840AE0BF7DF126F2A96B1F2C22ECC06F49F3B737C89256961378D6A462A201AE88A3DD9930
+DEAFBFB4773AC710E922FD78328D0A7C1BD057381668A74F988BDBD94B3C8132C344C527FA5D
+27D5B50AF2D9F809D665E931C1C8DCDC9ACEA44D76C2F8AEB30798C16A2EB75847E1B39A59F0
+4D419F08F4281DEB5557A2D53492861C75D66F48DBD409B8DC951698FBC6BBE88D30E174784D
+46A6E11E49264D19767C2F3E2B192841FB15BC169F2E37E6532BA7C805FA51C62957851F1E85
+49C400B22DCE93ECF10861346A6532480A3D869186E42784FE0372B15FA990D9580A64910345
+2CAE1B433A32BBCADF600EF2DF4A313889CA84749149239CE69B1BFDD816D572C359A9D83ACD
+19EEBFB754D8A075876AA99E5C86751542329FC61D247D094094019E78B0101C865CB0F51EC0
+F1003D5F23F7BF8BE9A53DAF2B6A00B0C138AFD94412DB581316BCCB2E294A1CA794EA15263D
+C759B61BB45E14A2C207A1AA2577D1D64E2D0C515B10EA68CD9200401F750971E80D251A7487
+146A8AC453A5F809532354D3A36D612E3B8F7355D566F54AD4959D9207338987026DA48FC975
+E43F8EF1595A56FFD4066258AB215E1608867C2BAB3006D78D46BEC9774884B1A958DCA0B0F7
+FFA98C7B1BCFE8699E64A044502ABCE20B997A1B87B605DDB977CB7C66FB2B7496180390B6AA
+C711A63557163EEFB9F5C530451F70028D83509091497B388ABC1CEDBF30BB101EE4DC8AAB1C
+A4623FC6EAF5390F361E0DD80597C6BC9E8EAA52DFFB1FF652767AF4148D4F72C2B5239627F5
+2784D54145D325C9545670EBFAD118C0F16AC402DCBB299F204CF42B7017F0D3CAAEC74620D5
+AE7A2D66130B4202391E6FFFA18F3CC2A788127A185B4A9244E0E06F2EA056A3B377225229D6
+FCBB56DDCBD32DBA30C613FED48D9890BE8722FD441DA56545BA40853F12ED9B596F999BB145
+0F42423EC3ADA8DD8BBBA651DA6026397A46DFAD76888F612F6D1B7E1EEB959BBEC22AB7F4ED
+B6F8DBE76F162D394E61D225283BA461502306941DAEBA75FB6FBACAE056AF835B2FEDE6BE49
+6AFD3CE06BBD8A34F77DE79CAB805A1F88241990D2B71DDCD53FFB3E536A22A7460A57CB8909
+B1DB369CAE328564FC1E68E094A275B9D6A69156C1F1F52C251CB338D36BEE5B11A4DC3F83E5
+35F91A3264E5C8E4F086B42B613F575753EA3D708A5F1AC195960BBBEAEF4DE6D1C58C45E6A7
+C5AF1840CC3923B1A9DF2CFABCEBFD1F1386E0C61A1576CB7A348950F7556E315C255678D8AC
+27DF7503051883B79A00D40E8FCE7B14A09A66908B367882CC808B9DEFF822DCAA1E648AA63C
+D984A5055D931D0DD82C3C65ED0A3EE3DBA7D5516BACD60A2DB25633AF6F864B307BEC9356C4
+99422FED8B8449B142B4D12B0637EEB82BD5C3541537DB67B099B33A0407E988C0EED630D7D8
+9042D25761A26E3C0A3C143C037B43FD10E01B759B07F4E7E92177CEE9AD78CFD7509B7DF136
+EC05B5F373709D72B69EDD9FC4029479E77794D4A15C2DCD29A26AFB22D60185A9A57A4A0AD8
+3F09C516844299CBD4CE4159CD7F9C191A003ED211FD86EC3DCBE38C6C8DEBBEF252229570AE
+416387A4FC03ACD075EDB53989692FF3BDFED86E217EB9DE4F656B143773FB7326A2B44F1370
+7A2273B774E59DF0A6DCAB9DB93D305B7DDF8A73796F8CDBB683B44BC63C15F8913A12ECBDEE
+3920BD0E9A0FC81A97B59F5DC7E2B49C993A2D9CBA28D5704E15D702936934AAFC0CDC7447AB
+F7C2BC61F73C7BF1DBA55853A12705BE08AB6792ED0E84F07D86C53F2C22BAD9128013CC622E
+42AA03A1BDCCA293A04B5F73D7A76CBDBC1F32B428039C3739FA5A1D75A84C29894833E77792
+DD0FDE2C3CA782B634A2868D9C1218DD8F6B1806FE6D3DBF1CE9BE27674A3EBDDB38AED4C087
+6A8D08A578977BA685410084BE04CC507AEAD5EAF285BC6A6E18FA2D6127E38188791363079E
+E07BCD68F53372CDEA2F98B9EDF558124C7047DEFD116E81DF56ABCD1668038734DF84F293A3
+387777026646397E36F91B8E87D2DDADBC8E2738348E5B55815A5E060886AACD2515E71BDF94
+589618CDC6B17EC6BB957246BCAD2F01009A8CC370BB18F389E8B6C9B4588F4F6DAE619898AE
+0AFA7B359699E04DD41E73538D3CFA33437F3B97DDE51D5BDAD00C22E50E5D94315C45B569DD
+9C24F2ECA30144DBFADC451C508F0E85DD9A6EC2878F06225359649AB459D50072A2D11E4F59
+301CE94BD672640D3E3E6F58E335B7ECA974837CC0B5263E29D34C00B2FA9800E6CAD0D349C0
+BC1CFD584CBD648BB3EBC9ADA8456D0C097DCB81C55AC72ACD223AC258F221141B8CF5555B0E
+30DB348599139E6F9E7ABA032ACAEFED86735B6EC68A0CC9AF40911673896F8A53E68B442953
+0336E94DACD1024D022970466091FC2DC415D5F45DE6D9A92180E0EF69DA37E014054FA5B164
+155AA990E7461D372129C953413091580AA43605994E8FF02D5BC1E54F14F0A54E1CD7A51919
+5240B2D624DCFF13877BE38A668B1856A0FF96C95C863BF1A84CED2B5B8AD7E2BEF463D74660
+8B07BD3D0F3B315E0234EE06C78847FFBD738BC0C484F59A40E92F095C8EA0463A2F24275F8C
+A2ED85C86FC092B92F10B4A76E303C0F359C723FB5F2831178B35056DD45D01EFA8B73577467
+B9466EDC9E7D1A5984A7FEBA05A72F23DA9612A6330D9D26220F90366C564C1846571790656D
+ABB3E1E90C9E6F82D974464FDD45D0BB9013AFA07842297E5735976DF70A3CF4A87B1B02C96E
+4CFBD08A56391EBCD5453C9157199F006BE605A102B7E1F89199BF164B8BC15FA5AA18FCF3BC
+787C016AF848697318A7A84DD40FB4B790F619243A48E75BB637641B5BF5601A7FA5A28D716D
+11DCB9A2469FAF63F5448FDB8457FF2F30488A129F310982824DD303FB957DF6C783B8F19734
+2C8CE62019F2284AAF444C7D6DCCD74411CD84C6F18C07EA34388C1D0F15FBBCCEEF8605F731
+BAF5A006EB1E6B34CB567175C9FC0DED63DE0C466B4C35D3AA5F9FA84C50FE914A8F7321C7A6
+6AE9215D079A80E8FAAE17E030FFFD006C54FEA36DB19EEC4814E26CF875F4BA2005DE4EF84B
+ABBD55C667DEEB8D5D3D83550E55B98CB00FB45D2587B1DF1A7F428184A8ED78D11DD2D96805
+9B406C19303759E127397C65C4F546F7000100DD311AD2A38DED6B6C692F5431B34129EB9361
+C1D190BF753E807B09831E901DED093A88E6624CF0F46BA8D422D1750C43E4CFF9BA6F76BF66
+17CEB95FDF8F064CAA8996E5BF7B575EDA82D026BBA76D7DB5F54F097E7AE63663EC9938A2E6
+031F94B273BE9936E69992753B967A42020C6140C5FEECC5703E5A565A27CDBE67617FFC7912
+112B60C21262A92DCFFD31A4AEF1F00097958114317B153BF93F8C24B5AC9A6336E7D65BC42F
+5A68FFF36A3A56260E4B9E7B655C5B9709684ED04D8CBDEE8BAFC1879148BF81A180B0F533AA
+CDD1F402B7A82968117002AB1E7A4E4B4CDD5838D7C0572E0F5FBD13A1D36549A96A7C42EE8C
+4D6107E984285D89A18BDC711616A6C68B7A92A2A4DA76F295C99D2E5C754160EC9A51AE9F7A
+FFA41547B0EC4210B92D59193B81A973D9763C73661C1C7FD830EE2202A88CF2B6A79D438B53
+2E1714D9DC2E3F8298EDD522FC082AAD25C3CDDD50CD1F132AF308874C1A1904E258098CD371
+9BF236ABC9AD83F23BF276D48A13886F18857AC75105F0254205585BA1322F1DDA52C1A1A76C
+18685B5C3DF7B59EAE4E55D87266F67258F14B700CB20664FAA502CE8420088CE1A316BA16D8
+2ADBBCBCC4DC7F817DFCE3FB21FF498FB5CD956607775FE34B1FC20EC21676E3751A579B3FE9
+DC4B7F7F99238898EFA6B10495E64ED9804AFE667ACAE7E8E1D7EB245163D0DDB4B74F755EB3
+8B0C615B1B8FF6D1FB6830A1667810156129EA8A101B101046CAA3F7CD60E46D55BB2814D724
+1B2590E151A05F234A3737CC0DDB57A6E3C8A4ECF0DEB12A8E78FD22B6650FBDAA1D6B342B23
+1725B5E9B5C153FB08CC7B692FE7A2BBCE04651D3FD06DF84219655140F3A46CC167A9B56BED
+00EF6981864B99057438C58F476CC445D5A1D2A0DC2BEA86DF1C81704179CBF01B843BB8FE79
+CC5C6B1C966A49E61F6D453D448C9A6C1E5AC1356A67CD6C7E351D9857320BB6369A01F0D1EF
+ECC718940CAB37677E9F0E37E53FAA3DE8C0EED83071AE6499663CA8344F9359C2574672334A
+1255F39DA556F5DD732A4E5E071D62C136FB70AFFBFFB0F8AD749401ADBA3F45D810AC46F4AD
+4AC7201E1F15BAAB988A68C73E56A947E3C5DED28500C863AC2162A766771993D2C8D4BE69A3
+18DB19521A39A303F031601535DD9741B619ED86820D586618A9B44AB0BE6A4642F9E5A11551
+ABCEBB1068186B92AF140DD243645F3991B3553EFCBC10E47D13090E2F1D683584C29CFDB55B
+8792FD23A55553ACA2A0C0FDC8AF21DC1BBE322B59515CA5B41A72652FE904200CB5069A09FD
+A144F121E7626D14C5FFD64E347D9ECED3211E71D620D2D0BB417C35F7A3437A06B4D25C9C54
+0923ECAB9CF66234004827FD0904C52F477196FCD17638BCE24537545DF99148B19040C86C56
+D4117D17FF23E01608DF1CFFADCE5376B51E3F8CDC3E5E0426C1C7A18FB858EECE4DD124A6F3
+538E94B4B7F81BF87E676554DDEFE1ACFAD2B153676F15837EF9CA70678C77892ABEE7073CDD
+353D35C351CD6FAC1E018EB5E26F32414831DD937F54F259A37F0BE85E510C1DFA2E52AF5020
+B6CB17030ADB3DDC8B767CDAA84F78D00C92FC1EE4964E30A06E4B06CFDFD690F16BE59212EC
+78EDE080D967FFBE3E7DE247E26F95ED65C8F047F049F555CB44F62060DBAB74B02277FCE39F
+B093DE6FB2E043F7B9BB6CE4800C03804094E366F32379FA5C6C42B37D60C5864840E7101DDD
+D5FCA36C2C3608F8199BBBFF02F7240722A8B16E2976998F6242E71D9DA971A522689D74B379
+D0BA2059EF1105414082D60A09B518B36299EFA56432EF75FEF406CC7B81AEC55714C42AFF75
+0DEEABC6233244A88E374F91C0581B84CDE79BF2BCA66AD00BC6074F4B0641751BC98FC52F9A
+564B9B534E9FDA14A524956C12A4A74CDF8AC15371A4D4F75267FA5AC6F16ED895EA6811403E
+576228E4E09FB5FA4CC8275241D1AF5533A0C9E598B1022CF78DFC144AE402D957BBB5A47969
+BB7392DC9FCCB6D8947B5C5C2DDE1C98BFE6B3E26FB0B3618CCF74773388289D7943E144BFF9
+CB5A4F30B23ED5F5AE2DB62F08F6E50CF99218E9A33BB82ED72F12C62B5D7ED7AD7375A77CB4
+CE52AF221144BA7F9601EB8DFAA361FF21341432B8FD8B8226D1B5A2245F7356B3B84CE2D9CB
+9C5EEB1CECA976ADD0592F78BB8C4D85E2D5C6179B30B3175B32F0D1F07F37114CD475FE918E
+4DD983BF35C7F5CCB415CE41C071E10D5FA2C5B2277071539B6119028B41ABADDEAC18300A79
+25FE207ED0697582E76EC0A60D2B6A29F007F7243B94AAD34FB0C46711C15A2108ABF238581A
+5AC32FE07581261B47C375B57BC7F3AD6AFC71D80E6B5514CAF2C57BAE6D519F94BA2F95A9E7
+ED06933113D29F48E625EE414A22850E5C24C768BDABAC2F5E5C4F7024C42368B5E161F27590
+27D09A0F01177B756493BD4D453C4445C8A17CB42BF88B7ED5B0F34EC4D014EC373CD226299B
+CF096D059E8065FDDFBA19E58679EF30CFB577FF360E8C7BADE6303C599B8A5F5C1656BF651F
+8CB9CBF05912D1852419BA583F54FD5F63ED121871DC1A5E040715CE5DFEE5C7B412E65AF9FB
+D38A3DA859DDF75F512809920948CDC124BCECC6D1B18E67B75CA8CCEBB488BD8684153DD906
+6C7C92258D135BCC751607AD093BA50040A3CF04B7A5A53EC4A014D8B7FE016DE9481EB50F01
+3694AA4C9336E122783CC4E964BFF0638AC69D2A174C2A39C458FB49E024A057A4ECB0A243F9
+B33E2DEA9DCBED379CE14E8B66E72F3BF0598CD55B2A256F6B8419218E8D56512B57151B0FD8
+98BF7C38B8FA6A82CB4EB965C8DAB45E80302D6DDDBA72029AF77228FE296D50919A280723DF
+A247E0C636CF6D1FF3A7E8F827B5AD52EA6282E4019CF1F01A9D09833F191C2092A8DB728451
+F0B0FDA20EA34FA0F2DC3580AE0621A7303EECDC7CFAEEB307F2220199C01CBE42F27B67DB94
+DFFF4EABC96828A41440177C5DB6F190C0B6015273D7F28EA79383D33E58F20290EB14B7F7B8
+FCB6A4FF0AB89FCB001A26A356781AC30DE98F0F9A62F39EA367FBC1E4FA2FAC9A130B3357D4
+726083F18D5E8961C52F937712CCA680CCF6E361A951461DB1558535C9B5DE9F1C8E153F8815
+82B7EAC247BDF32D018129D6F95F9ED41E024D531C8EAFB376842C079E09EB9C44DC586EDEE0
+2E335028E89C9DA2ADA468E9695B0B5093E88A6957318B03815BE318DD109CAF3243914CEF32
+251EAA13815B23020312E3D17029F42D736A2D2CC20E8D64C5F0D0C49ECF4B1B769CC03EE45E
+64A41917EC9118B9307B0CFBD4B1B784CD58E2AA0481CA12567BCA6BD3BD016E2FBAD4C3B8B4
+FE9DCD1C5DABD829F6C908EF9B575F23D67AF3B52A3C7FE191BAECB8C3209D4E50E3A7445936
+8824AE7DC4B5DC52CC95C765B79ADD7C93968205707963FA987D90F33A41B7C3411E59A1D125
+BCE6B22F58A537899AFB2FFD2ABF4BE0A74FF60DA0046B0A5A641261FB23400CDBED14124988
+D8D39640B84E950B6E428113BE2838B81F99E09F8E432369DB29B68B7131DC489CD5AA958354
+12EA88CD6474C9FEEE3FC97AC2D22A583E52A2632865383DA3DFABD96C7FD5D564BF76B160BE
+F8B29737B6EA0A8CD493CF109A5F97BA1CF042958A0B5AAC40E42E963F331D7F63660233F45E
+3015FEB3FDE4F960B8FD7791B4608075AC660317BCDF368BC7A08A584546C27769E695F18704
+83BCA4E34D63F606CD3EA2CCD8DE3FFD00DDC952603A4D4BB6C3F35B3DBC3CBC0278A270FFF9
+C73189B8846D7F67C5FE81BBD38432030DC0D1B58D7B73E1D87880F96E295552EBFC732E6156
+2878B98575522DDB4D3BB3F2277BD1C822966465A8D6F9FEEC6CA0B925889DAA54C7D845C0C1
+699194E1D238A8FC90E0C61EF1F7D29F86AEDC494FC3721ED813691E781223F7CDD16BDF1819
+A11310696B6357E27EF4097E09ACA4641FB55D783591C72D0D51AD8695442FAA58A0C7B96C1E
+199C6EB3064A1024CAE27A318A9931D7DD37D983AF159F5B3CFD45F92F54F15DA5D1A3CCA367
+39E189C61436011974D89140209769E6B42BA729E115EFD02C6DF250818FE8FB91EE9E9698C7
+2757B030CE4FDE201A69FE087FC9258058BA9C4D3DAB0B2481B5457259AE608C114FC811E33F
+1514057F627556E6559354A8A660500CA2C95FC6608B4E067913C4FF08FDBC69740B2F2E2273
+2CF091AC243182B5E20BCD0F3E77AE13B129297E4EE30762CE27ED963F1797326A39F70C9D58
+EC4814F9922D19F8B12769831A710D7E825FB59C9C7DE4EC3ADD20D426A8356B1B7B03B48FC6
+3630B5335EB9B68D3009C7686BCC986308CF9F23E3E8A9CBA4EC9F232D24DE48FE83C99B5F46
+C0FA712EBB8AD4260E206BEEC28D55C1E26440EFEA87CC3A592B51E3C3415695D29ED1D3198A
+C2FC61330B0C123B279C265CCBE40C4F0B1242E94B354281F26A1BB0DD70A1D7AA7F2452F2EA
+3FE1DA9EE43ECC38FEE27F53DB6D5D3880154014ABB1023E4FB3BA5458FB0314176E2DFDF445
+0282C4F0D8778A5BB3619BCF34616339812956C733BDB6259ADFA887577840EBCDE82E3D4DBE
+B9294FB2A8713C1EA655EACE31249BE2431DE1D2E37154BF64BF99437DFE26DBEE3FA3051D10
+3C0FC6F10A51499AA220C7B9A23125DE41FEAC02B74933B0B1F328AEB4906239BB13E0B24F83
+075771870F01B4F4A970B075E5BFC1114552C22996286D9870F132FA9D64704BEB931F402B77
+EF645665DDAD5EFC9D6CAB2096CA7CA4B5F4647B091BC893A70A1AE7779DC004288DBB2326AC
+CC9FF6A71FD892C58C7D69786B6CA0F5FE35DED10AEDEEE6286481FDD88F044567F9F1E372EF
+832FA7C2906F96EFAB72DB5E62F8ADD0E7CD6523F6BE7FF913BEC986A00649D4E65049EB9502
+EE1B35D9B016DDD80AA2795F880F38BAABA202FECADA6F67A22A353CF65242E4C3A0967AE33D
+0C9660A7DBADB7364B8678B3196B1742DE4668942399A9214111010AE224D61FC53A1FF9975A
+FA8A588E434B69FEC33F33F1447DB75E2983795A3E2504FA3D59FB4462BCCC4DEA6A6797F792
+0E04CD8F1213B8C08FB7D5DAE0657C096D9C2310DA574391716DE57AEFE730CB13C22E560D33
+5C4708ADD66B789C08C9149F33D5D9D67FC6A6B98F92676D736C27D8CB351F85187BF845EB25
+E50F68DB14771A7EBE930BE6079970859780B3C04A291461D2F7F34E31AC0A99C8C7D5EF7A65
+0E067ADFF7DBBA16F8D987B35C5DABEC96EC16EF3657A9A67603C9B8DF5F5DBCA20E0C2542E9
+7223F83295A6758EF54074B4C178C502318F4ABA81FA3D5E4E42F30E959A7A6A7D472ABE014E
+5D3B6332C6CA5BAF3D028161E27FE8AD34811D12D394F08EBEF835F1D24EE4DBD8311398085C
+790D4FA6BEAE0E82136B78439ACB61085C19F97B083A3BAE74ECD65265023556D41B4DB72841
+B077F190BBB1BE10EE87FD812314C95A42490DFD9AF59B5F728A0CA112BFAB781323837664F8
+F61D370B86C7386AC024BBCBD7B8402396A9AF17A7B9A601E03EA98B2050374C3D8A5A393ADD
+B28449FCD667E09F541BB2AC3D8D9006D823C8CF4AF6D30F250115437A583CF815038BB1D47F
+BD82C3B2A666D947EB9155E6843E74B3EF92F7452EB2AAA6D7E381AA76934E018FF2A33A30CE
+C26663C1785344743A8853D0E198896C92858DF3A6894632817D7E8DC03FF8BC68DC355B7158
+1F6E9740A0CF7E06E12CFE531AE872FED8329C3C75FDD2B2B2FE2642342DC7AA1C1B4B404CBF
+BF22185C6C20239A075B7DEC651110A253AADF86E8D9A87F5C2C3B35BD60D7DBF44040EE96ED
+65E9C7A3E69E25695C55A197BEC858E2027A59D6C8057A63DFC276BA2716DA969ACEFA3CF837
+4BF4997692D00793E46AE663EB949E726CA39B42F999FCCB5D8C4586380AA5D7B7A2C6518603
+2B5CEBD8CA1D52EBF48B48F7A4E1EEE090796DD37973004F20C04785B232332880C0F845BBE4
+0E1AA7279DC85780B9EF863D9B6F036A2622684856CA0262484ADAFE8F19EBA3E1ACFDF56748
+4E8A50AFB36BDCFBDE2A2CEB59792B1124448CA7EE428DBBA56A46051014E950F0C4E9B1FD13
+5DD445AA9176C41576A9C94E03E91F4AD944876C917CF8A80927738CFB566CCA7C6D1E63F3BC
+E16F03F752B27F2446CC13E212A9A492C2B9D434EA054DD6CC5E5C896B2F326B0C356C0E15A6
+26AD11C953C62273FEDDF4249A1AD770FE2EE39E901B3F54853050C1055BDC69805127BF8327
+F99F5D1C3E10EEF3397280C7442F8304A3295C3D7EA1A965E1A3B5CA17FDAFE9BFFE9C1EAFF9
+796D4C1BACFFA065779164D28F4F09F29453D9165DE14F1CA1D2AD02CB51F05FA98D04877BC1
+59B0AAE4CF2DE93E26DEF60944D25E190746E5A661C25B33D9941C30CE1C99C9C471625A429C
+F69CFF9697383316A269E48B435EEFA2312D5E214E69E492A3E7BD429EDB4B56936A55CDE475
+B576A849B81D798B00FDB9A6AE9D3ADC6AA58922E59FE95044F8284FA5ADAFF30DE88D484F7A
+015B11D35DC50D9B454D6D169C3E251CA0E4FCCA8BD08D3B72B48E41EFBB7739DB1355A3B128
+6E604EFED37E2F6F1FB16B688CA0DE86CACE2B6C3A10881C1157B772C89D74B3E885D00806D2
+8C06429B9619DFB61A0492FFB491BC299E0EFE4EB37F61C4CFCE9819E0ABF678A02296233AE7
+A4EE46ABA2377A22CEC36C2B6942EE227AB674DDF0182F6E54246E40A82948C7783913AF87D0
+7EC0D21A82C0A3888E6F0913B2D41B64CA32667137A756691CBA4385F409B51150B43174FBE8
+E3D903AC09912FF4821DF6A4E415D849DFABE544652B7CCBFB11B1E076A1BFF75F80094CC71A
+178098082FE0AC069C234475FB052BDA47B65BE3860A05FB8E0CFAB1674D328F4B70408FE21E
+91D3AD01A300446624833076DF98407D002F0EE7D948CC5A76E0F595EE5F1E8AB7D712319F08
+FDD3B923870B0D4D0BDA7EDE7B8312522A2AC9CF50A0F4B50730AD4F64EF94F65F66D9D124D6
+50966912F48C010B27214C26D8E09888ECAF4033E17E0E57F2E2AD2D04A5197C292B281E6894
+9BAB3253BEFF0BC08B90097A93A1E6A077A54CA7958DE9491E10B6D272A5C76F9EF7B1A19320
+858DD866E1FF46E1EB4A73E8F4F54F35C5BB33236EADCA1223D8D4227510498EDED173D78332
+09665C9354DC9F58D837B666CE337C46AB0636B54793A5607E6603F5A807926EE0AC9CD2F138
+68379DF3580501049A315CFBD9A4969D274DFEECD0B14304958FD571FBE2E4017B8A27853897
+14BE4CA12EDBE0C0EB78BEFC76315AA8F60EACF53FFDB1D3F59BEFE9A89884484780772B6C24
+E5BCFB06480D174CEA4BB5A0EA9E09E05B0EA39D5AD05F76F58BC9B57E96AF05DB72087FEAFC
+32845684F0BCE34A303BCF991437990A1ABDA527256AE23AA1831D416958953226AC621F8430
+2197FE4FFFF024D04F142D820B4F04461E2D4EA6787AB2484338F5D685726C9A9A9208D0D9E0
+15588CEBC34190CA66556323C4EDDD2440480C205259A1B6F70CC95A0F0710EADDC72D4BE536
+E6564D30EFF592B069762F924BA012DA684306B055A03671DB9B0924472F26266EF11DF861E4
+DA81962856EF1BC4E989C72D475822734C1E3213CE7D7EB82CD1B8E9DA40D2CE26B476E9C716
+14EB2936471196B81168F8B325222E545BDA1592F2C3C84A4FB9F977A67EE586485152B9F7C0
+7D828C04E1C9B7ED189903FB44059FBD129491FBF6FE6B8124D666DE63A37263975174524E41
+93D0F27CED49AF87126A7F7FC4F3F91C967E8DF5EB14DDFEEAC7C928FCF2A825D7FFD37907B7
+46F313E5EEBBBE9B9BD9746FB41839CDC65BCD4DA7749A5B175D9D9CABDDF6A73ADE13261E53
+3D3CA5A7BFF53842F7CADA3B286CA81DC5910B1D9B397BF711354EC2AD02B59D64D91EC6D5D5
+FDC3A627C94D3E17F990B080F33CD206E690C05A8DC51684A659376FA6C3E411C24B701EEEA0
+F77D3B95526D4AD25AF4B8FE1341A6037C25B10AC4851C84BD0F3855BEBD6CD10AE91050B027
+02088E931CD96B6A99F3307CF11AD651B0FA04F917FB4B3739F66D63023E761611A9D300071D
+3422C85D7EEA134CE7F5FD6D5C202A97671D1C078B7CA8B3805DD21B22BD5518C6B803008973
+F42157EF1CB77174CBDE8823F80336BE2F5C01FA5A588802B245CCF6C1095E30AFFAE3D0E99C
+D7A1BCDE3582D2A3D355340E36943DDE7F764A7FE4B8321545BE04A8541830F50E58B7236438
+2179CA6393F5E819B1DC84FC5783C92746C614F5C91F5BC180A896AF5093F46790966AA2CB68
+5FFF37E7E3338997624D0F9DD447634C5DE26473606ACD6DBDCF1E8194D1596AF4505DDEE0D9
+64DF9F9D5FABE81773BDF623F3A03A7C40A6255B303EB9A9536E0711CBFC90F292F571988DED
+C33661685A49D19009525BFDC2FC4DE5889294F0D77C147D41A45BA4F8E43651154266C38839
+BE304F9DE6843AD2D6840138778056575BC410B21E7543654BF0DDDD0A732D540EAF7D5C383C
+B07F662F009CC862D9EE2B272ED4423EB4BBFEDFED2ACB7020369C996C612AEAF3447162F90C
+E2083977688AC315AEAD5C57F73CB8F54523296B261DB64F1ABF926C687B7AA5F7EC2472AD04
+98BB0D4382E57C8DEB9CEE5ED7D3493C7557AB9C0E875181750EBF307CA650A66F13FC03A49C
+CF2573279A9501B2C0457FF0920ADD1E10E33B3EAC850A43B7D3C8D98988BB5117117AC5CC78
+C434CF31F5074F2E2566CB519E0161FDA2BDF63F04E7E2BFF275208C2917923E0112EA910429
+76E26D50365E9DAF859E0C7BE9DB46ADC226F0AF37EF7668C4901B9E7F0AC68288AA765F78A1
+D2646C7E50DB75711941A21568E64AC109F5EAD56AB4AED35F881C6E24EF745D8F571C07C660
+6C54F63ED9F8547C0689F6C9EBB770424390DEB4C3F851F201AA87ADAA8394040522A55800D1
+CA8F6C9722994869623A94AACDC6D8EBEBC34EF82CAB787BF35F9AE176D96F2644A6CFE3FACE
+3EFF5F5D0119FA9231578CFA5775DEAD271C175498287AC58C7326CAE5E00015BC02188DF6E1
+471720F04818A47679ADBD5A6FEEF79CDF1242447427ABCF4A6557290F8ACAB7DA5F0F9F8C01
+33725D75728FB1855A84B7962ABAC055B47FEE71672EF81C3B04781ABEC2B6C22CCE2D680746
+14363903199A46C9D7ECFFFB73129E2FF044766A85B54F3EA13642713A0D27C6A83F61B9D31E
+BC98B29BEFC79DA3CB58230DC5CAC5D0F9C387835E0018403F0DCF8A18710388EBC37AA1C016
+F775ADAA6657BAD29C5DCF2CAC2CD9FCE27D64ED247EAEE7ABADCC655797E05D18EA60D434FB
+1C23228FBEAE9C973A3FC592C5C0E61FA72EB5F7221B4190B7337C9279F09D49E74BA3049071
+96990E9E9C2D4CE64BEA214732083FD9F7C4495A2BE3A63D40EAA12B7423B03104E9119EFFAA
+C0064D86828E5CF9BF9E14DF4369292F0A59AF841485AEBFBAF378E9B52803FD51DEA582AD40
+8E7CB1ACED2083F7C2E8CA017C4BA4E25CC46D7CB7E5895664A7B55CD0DA11BDDC6FDFC5E229
+B7C0219C939D857F5CE4FB70D643760DAA0CE0A7B3AFB658AA3C93C41604873FE471B7064383
+6DD1610B7CB9A045187E8EBA00DEAB7CBEED5ED430167519E1E8CB10D9E699987E0B71006D6A
+62E8A5DDF6476BB85574A752C555309B6C9B722D924AB1DEF08F835E7303E2DD99301D1FEF41
+74F4C098F282509C9D4B2C791399CB17D6060C1C0534A2FAF9F38678A59C28BBAE714899838B
+A844CC308BC59415A64CB477BE52E8F99B1D18152CF300844329E61B511846D5EE5F02A611A4
+CE11DC0F0F2E45FA9A3839479291C5AF0979FFE489CDAA1B42D28499AFD966A0A1FCA6740D5E
+E217E10C0175469504582CF44E633199C18636DE5924825C247348B6ECAA36EE8BC620DA7597
+0FAC33CD0E98904465D230B64E491637B7E6C3DB4D294CEFDFA02A23378DC81C5945AD36B8F2
+F81426C0AE1C46DA56D3DDB54A3908868E868E1CCEC945D6849357A6D196D9CC4FB967B3CE52
+3C95A84778DC7661B9E6C9D43B9DA85A8E706D71D5F8EB2FF2F5A84EB1B562608C0AAAC846BD
+71471D84FBEB5A0FCA36D8E3A0F640552A98793E84B4F5568281696DADBB48781F23B2E0E687
+DF38E4955D53F0FB3843489E826F7E20ED51D2A3EBCAF564740EC108AB27DC207271F7E63B37
+991FAE2BDD8744A6304AC446DCB28279450671A8B00558E04C7110F878910E3E7C9C61EC79C9
+65462D53F00AFCD3B4EF5AB74D5BE503A1FF7305796774B9BD429C7711505D53843F676371F5
+8A5F2F6AE8C16421AFF3A455FC414F0B4AB198B4A9F7B27534BA01DEAE761FF6506EE5899B42
+519BD46F91F6AD2DF528BC9736576BA9AC2D2FE8E2B4251E28BA44128A55EBA524F99F367B83
+F7BDA7AFB8C531D54A197916584547B79AE434BF9AF50C333821453E1D4841B9A576BE1E3687
+07B8637A493CFD11318797C931366B38AF77B9BF64D128A065BDA50725588C6E1AAE3F6EBDBA
+C8C7A3950B3FAF007C40A5D597D96580BD75FDAE0053CD8C62EA7CF631ECF3A643DE3DABE021
+2CB7670FCC158C57A78D180045DC5660362A3F17739584277EA1ABFB6181B1517395C5E5594A
+584E64A43DFEC71015F160886547F70A1D892DEC359CBB9DA5138AB29B5B1F8E56C136632A76
+97246EC79A8221061CB212FA3A2A03FC38F55FD8512E327A6F1CB8E72881EE1B2E9FE43A6F79
+424560F1D21B08B9F76873149DEAE9BE52ABFF904CFFB15CC603C7497F850B189ED11592B339
+926CD928F8AF76E69829B2FCE988C6613C36D09AB944370DE24FF0A448BBA58E0CB4C7B63B25
+20658143FFB8A042C40380FDB15693F4C49725C9C74ABA8C3C571DDA80545E2D92F721160877
+2F49DD3FB42465F31282DC0E62DA7CE2A1B40C0868BA63026BBB56D35A47AD9A0D0E230AA7BF
+FC4B4AB1B5069EEBEE9395E815EDDE1BA254A80D8D38C7073E8AC15478138ED4A22DB36D9B4F
+DB930ECD4A3FA98B87B9D542505E5D0C993A374D8223C40DE43BE22DBCFC425CEA189C212A02
+3874DDFAF5A1AC7F5F4F3A80C34269A6F5D7833C8F30E21D5BB548BE792F7D1149A94174C69E
+D90DA8B84F934634966B70D0465C1C2E4907A9AAA62459E010C1781A207CB49079A2BFD54372
+1D8721ABB895BCDC58B96BC6DCA23C3930F72D1E6A9A2E61713BC3F2B4E6652F75E9FC54EE24
+60DA11E071C968E00E9C706E5779D2601D97450D9FCE65BD1DFD4F5BD846625B6CA43877F2FE
+6963728412EFC91273AF66AC82E95C79B4E0A949DC88D958BCF50F052D620B1FB8D3425792E9
+C6388A42A31C799F31D29A4BAF8260E9A833C98153C80614F22E513BEB9430315878E6C3BB66
+0231109B6E98D2ABA44D759D8792CD01B86071C2BE8162E31EDDEDCD1A5270889CD0AF7EC1D2
+1D1A4AB2B6026BEE062673E1B74708088850395C7820935BD447898A1EA07F3D23BA73F662BE
+BBFB2F45ED608965D9E77432BDC514DF5F516D0316DDA35321F80C03926657E9A16132EF6290
+953ED59CDA152C0F2DC38C275A675E2578CF870A448FDE7D73E679AE61E6BC311BB313BF975A
+E7648EDF1D084FDB3D61DC14BA882D489B2E469BF4E31EE93ACA0A9083747EDAA559D59204F1
+CBD22778B5A2995F4328ABDA61E77708052B80F2F85FA83A3A3EB61C2114B597B787D286C9FC
+FC594D7E1B597CA3A19D95D7029B81AC8338FBB48A8C63D903B3BA18E17A4B3F4404B6CD6356
+9ECC2EC3BE18A5B5F435501841E8DB11637DBCE823E13F48D07732B991412F1043DE7323E4AD
+7FF80262A845491ED2D6F3305F4196E53AEBEEEB3D1D00EB1C8950B02BCFFC1E2AB41AB270B1
+969BC515D519A69CEAFE551F3A1C96E803EBCF2FCAA1945BC5256B774E298711ACF5B81AFE0C
+8051D3EA70579B2CA6476244BE68211DD20A9AAFCED929E0B817AA845E4C0F6A26F3119AEAE8
+B04555F5D6EA3F7A49D4D7470B6D29F1A2C64BA1622D7EDFFC622C119A50119B7319BF947765
+841871026085AE10C87D4F3D4BD5B837817FA725390E523F2E3F4E052F4DA11719D75F9416E6
+8B36CE1517494AFAD0E1768817D39E7BCE4700AB207086FC8230F40000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /arrowup put
+dup 175 /arrowdown put
+dup 176 /quotesingle put
+dup 177 /exclamdown put
+dup 178 /questiondown put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /visiblespace put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /arrowup put
+dup 12 /arrowdown put
+dup 13 /quotesingle put
+dup 14 /exclamdown put
+dup 15 /questiondown put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /visiblespace put
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+dup 127 /dieresis put
+dup 128 /visiblespace put
+dup 160 /space put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+/UniqueID 5000832 def
+currentdict end
+currentfile eexec
+
+8053514D28EC28DA1630165FAB262882D3FCA78881823C5537FE6C3DDA8EE5B897E17CB027F5
+C73FDBB56B0A7C25FC3512B55FE8F3ACFBFFCC7F4A382D8299CC8FD37D3CEA49DABDCA92847A
+F0560B404EF71134B0F3D99934FC9D0B4E602011B9CFB856C23F958F3C5A2FBE0EF8587D1F57
+74879C324E51FCB22888B74F241550D7401EB990D4F3A7AF635198422283CAC1B6CD446DDBCB
+D915DB9BFF88844E784C6BF7389803D9450B0C21756A017306462C563D51ECEFAACD079732F1
+2C29315E4B9623A5752C6F1D8145869E120D910B2644887CEA7E30B15676A92537C29D3AA80D
+C30082ABA94B40990B82FB1A877E805E0C8C48F61E9F2EDAC05B944EE4D8084EC1D5CC517AAE
+EC5B3EA379DD011EEB454CECAB3AD2443C887C58278972355673E503AFFE0394FC7DB31DE364
+E4F56C24033C7DF2265C56445EC63A1D5695A6041EA1B94407E1CDB7C5635603A4FD047E6EDC
+AEB2D0DA6C9E0E9396D51A4A58E8FDC1578730F992435560A6E2D3E3687703EE2F78F5896389
+AC8470BC806169EB01762E89B6DC9ADF857EAD656620E2589AAE722C37A2ED7A2941C360B067
+EE34D8D5CA3BF68DB725614D936BCB207781F4D4EC2AC67B13A5AD161F3F059ADD7B5E3D9048
+31E31C20C04546FAE83CA93A35989E65C201756888F727B97E5313C9870EC96E4CEC3901EA03
+A5C744754485E7D169BBC98BF872D0796E189D43B712950C3786257D8BE06AB6080B9D939231
+3298327549A8A41C00A2CEA3690B4A333E45AA815A64FACAE1C2B44640860B8B8687AFBEFDBD
+5B4A541A72514EE7D3E0752AF3E96A88C95D31FA16D34BA2F02FDB0088B165844F02611C734A
+DBCC2037BF741FDEA7E8BCDC130C70C33772F777D8BCDDF4611DB99001CCFF14D7AF2BB05DEF
+C3480BDAB312A0EFF2F375AFB4E0DF2F803C594B7C93F71CA4AF861AE1711932FEF19BFE2F9B
+7ADB69D68E5A70EA4D1A3D5BD85231B16993F65EFB37A0A823F0542F8C2340A073DC1BE4A834
+7F9D3068A6435CD8278B0DB1809E8AF9664C2C989B9F16873C009449B6284B85DA4DEE11C96A
+05BA83292F0EDBD92CF674AAD6AC1A5FF966FFC37E88A66048DEED053565B55EF6BDB8C2F2F6
+7832F8939A32442EA54F13D003494D6350A2864B427A9126A9C26A031909FE53FA8463B80C3F
+FD536C9A5DD29CEB03148DBC24C0033AEE72DDD159F2E8A6FC113F428070EB36CE5A38A72ED5
+BD94D81AB4DAF08EBD42C8E5BC695622E02AECD4004E6D4CFE72534CA56291FF5F2F83361BCD
+B9489A993F663289B6DD492499DD5713227210F89370928ADA0085E2AF277F53E4CEC34D6C4B
+8CD5F2E016052A04C20AAECE8B81AF9E9F33643C0FA69A5BA864D2A173221071A965F9970D72
+93DCDE8C3FF60A86A4D3706850CBC45440DCD22F307261E2F6FAA3EE156A58069DF979C9B5EA
+A326C5A36B6E0FC0333D7B4046D636461CA2EF70648C37A953F96FAED6266EC9022753EBC390
+BE93C0CCB7C318C4314D9F6E54274C8046A8C5CC7EEBE625BF59A03F5405733ED120841560CB
+93210EA1EAAF3402ADCF1FAB986521BDB7CBA72A2353942FBEA4A0D1B67ECDE589A65AF8E7A5
+FA4B87672AD55F57D783C66DE1D11E0A16BCF32530692380C730D12834777AC6750F85131D77
+B0F53B626635CAD3BB8E9F0454FA085CBCCB0339034F5FB2E225E62CE12E8C792F5B7E234688
+D2AA8F627A4670339E646399F91E94424263E5C12F9F3D411FA44449611EA9785A20FBA733FF
+2A7892D1641F836CD42C58CCB81E41D6E2A5AE30FA18DE9846AD981923604C799B16A99779FC
+CBA11044740BBCC78116E857B4B390DE0E66921376101D621E1FA003F01AE344FEA0215F2577
+E9C92C6AD07F2F4674A00FE42AC51FE5A9186C3C1956B535FF1DD64BA514534DDD73C0C61C54
+FBD6FAC3B4FD9010FC55DF2A37A111BD1402D4E90FD8B3601DD3E9FE25634D709C289E524A66
+DFC33CDA640D397269BD9ECB9D0EE84A7D7B93A97DC522A16B6965B7D5D7790A3002341ECB3E
+80985371A5169B38133B13FC5C1DEBE2D90C43BA5D2CEC7D3B972D32AA1A932B750D6CC83439
+73FBB9972D84670AC5CAC5D0B5E75CE021F99493CE29AE90BCA0CB75058BB0A47DFAE6C8D075
+043BFD738991C2A0B80BE18386D7A6FAF89FEBC4AD142A1B0EEA8884EBFA87817E22C222170C
+B6D04BC6DDB541284E16400028EEA275244B69B033D200AD997BE7D1DEBE13CF783BE1137278
+24006CE4B5E3F34D09FAB236749D3E72C033997A652982829376DF91ABF533F0100BF224C279
+D3515176DFD56C325B3D7A3EFE0BEFF84233B5A7EE262557F84D754F03817C900945DBD5DC59
+B46BE8847D1FBEDD70799DC42D0148841DE2F816F894ADD5EB2C0E1BF19F52558AF84DE5B693
+86020DF814DE7647FD41127459D65798B06EC5D132AC0F181BE211624E97F8096C0A22E6B216
+0878909D00A918E90B435C8C87D1033E40B56B4F15752D5A8AC019837604DB9E1AF709A2EA36
+4F174DC2EB1957F0E5F477CE06A0EB78026BD1B23D76102C6862156C47040EC259FF4E89F83A
+42D8DFE53F96127C8AB4037EFEF724ED011928C2CEECB4A8A4B5A480595A2AAF93228EE37205
+2428BCCCB4685246BF3E9FFDB2845CA05DFD4902E74483626C2FEBB4E76C78B2AD6A96372D0E
+AE47FDF4B8D1F068FF0D1EED01C6860C86275A2EE3C2A97AA6033AAAC489E1A540432BF92A75
+7205428AEE30CCD48DC234C521003D7EF7B88BDA8E72A12AD36C2BEAB1177CA82BB2458997A4
+B5094A9DABAAE0A83D7ACF4F7727223303D5D8ACB9B265B3326CFB1AAC4BDB80B28E828DA936
+BCA574722A73B05D447C9F7E506D78B33F582B3BBEA37BF8380CDD32B15E74ACFEA5BD635C2D
+FC3A6090E7D96DB7E9127A3660024258A3A7DA06D08C4691B19F88D0BC719B1414E953B26F09
+6A0379BD71ADCE16DA6EB552A50EC318456CFDE8FBED1DD92200A9EBE83849AE3FDE58B5400E
+0C173E01F5E23E883119421C7BF5F12ACAE87B3C3DF0D824A67A320273D41607306B14A63D46
+2C042A6C6A31B92D54E01D7AFEE232DDAC002D012B950A71C2F065BD478196779544093A5B61
+93247AAD7970AB5E306EDBDC24EB4C6B71A174ADC6565A99EBD7EC83E01ECEA533D364C2F07D
+8A48C84C0A3941DD6B75422FCB49AE7BB79245CFE9ADC2C9B3E6B48A46867CC72F26D8C82C2B
+F5E8F60763CB9B473473F521FB016CD1D07B3216C496CDC68F72C6E9AC5B8193CB3E20EA84C5
+A7CAE4905261B554D6BA006C787658463215646AE218972219EB34A5964F0A277A1D1A20CBBC
+94FBE359573A672EFD0019B2C0A6A02F4B15D14B961383630F0CC578168F9DF7D33D3509CE75
+D272141AC8EAD6C708227A193A5542A213E6435AB543754A75D066C000A1FA060053A862A013
+799F762B5403BEF0E52C8208D3E690393BD3FF71C8EAA08C49C77F33BFD9A6F9370A88CDC3E5
+B1012FB13C784E637A4891503B5FFB4A0BEB105458413D3FC880B92671E786BFD03F158429E1
+E80EE252159C6B61079092C2035748A3C0D1B7C400B88666F94601D53C2EB3308AA791F66E40
+DB8CD2CD53ABE4A018A2BEFF566806C6CA7108EFE8C70C7E4058853019425AA8EE77D3E75973
+1A80FFFB59CDECD15D099E336A63A605DCCCAAD3FC55300B12402FB10A9FA4292D61F8967C21
+8E008343617BE44D29AA7DD755609EBEEF555F8291543623BE6CDAD4F46CA20063DDE0EC4F24
+B9052D6092BA0FB03EC7277643F178CFDD5314F597B93139183823C2049FA4FE0E1F7913348E
+B83F151E13251C3C2ED100CB9C907969669D98C5F349FD064A677FB689671C27B658C3118B20
+6AFA9478A4F0AC3E6325139045C83C046D0F81BB002757DE25E9778A4D835E6D61E563293923
+CCF415FF132B34BA9ADC441B806151561C59662867F91CDDA7579CB77326D5C34BE9149E9629
+8787F98EAE3B5A2E2190D932581F36C547680C3266770786DF978FDFBF96D7DAD68969EFC46F
+5A39567D97CCF08BD361FE650629A6CEC31DDF856640E6A2842447A87264503B7917AF46D7D5
+14BDCC09B23E7DA51C47816EF27100FA60AE3FBDC320B6E792AF15CCE9412C8C80B3A46F5E31
+E380D93EE3D17A5F674684AE28C56381892B66AA5A37B67B6E7CB9D65D359791E8EE0A36A4B6
+537315C99505BF6264B6C3BDB62A368AA4C5784409166831B36AC6241C24C9EBEE261196E7C5
+B55480CDFADA76C0F979FBFC9F3AB5A53CAC4C6DE0BC8CC9BC93221347EC17FC024CEF796410
+67DE49A3460AE6C83464CE27DB329E16605DC22D727F578F14764720F4D6BDC24E171B27EAF1
+43EB293A70525452FEE8100DBB2D7ABCC5177C7BA96CD07A8667103312BC495FD7813A5DC7BD
+37C1C96B1DDD53841B9DE37C5BE008AD67706045EC1AB4F418F60A17C0786136A5B9617CAEA4
+BF319CA20636691BCA83918785CC15FA19B4E8CB5AFFA398DCB868AE139124E6DF8BC1CA29C4
+3E4F7D57AD6D625D570B498FD8D2B3FB7080E312D95DBED16A8FD3ADCFAC9FC0EDA131913647
+6EA4C0FA1B6EEAC95FFC35326124EB2DDA055EC0FF6A304EF0CBFB3DEA094810A52D5193F041
+D99872CC6A71DFE5B46ED2EFC3F45D6560276FDBA056A78F9D76EDA2467AD4C44930558DB88E
+ED42F6C88B0C1E3DD5101A6590ECBF56E32BE0BF76B515235D00121CF0ADC12346997AB62DC2
+A1FC37DA89CC3992BC1C6D5380D0D5AB94551833B65A2336EBC9923E58CB1E47444BC6E49BE3
+042C94624373B1C34F593E7C8E043A6DE75A27DE4E305272EC9996499517F1577DEE3F9ADC0E
+3C21B61F81D165E903E1457BF33830E5369CFED65ABC46089647B5C01CD089DDCC7CB8CBBE01
+EDD7BF01C3636CE3D274A7C59B937E4547BE0DDB0FE9616E0EBC5078ADF5D7C8984C5DC85FF5
+099A00B84E44178D78B293288F664F19C7FFB7C52C04ADCF8718DBC94021C28290E2E5808687
+5C2B23EDF938C52CF0274F8150CB577FA02A7BDDD290839B69F6D5AF1B70896ECBC07CA8F1F8
+6EA38CFC5F852A5F5249BCF04A878BB56EAB61A1F53B60697DB77FEE8327166B399D413C62B7
+42870C3D77544FBF9B63511669E778C3CB1C009D17EAA536B93EEB5D15DF014673A66B43A102
+02C424DB51D501610A59B01D5ADDB4A62B7E86688D86A3786B08F14D5BBB93C63C88D7F70D57
+4AD84DE70430799DB3C19FC1EBC35D44C8661ECC763B46445AED62F1BB25A6C7D1A7E8C685DD
+1ECC9660FE97CE2CDF6D259CF0869BB93F00D98D4BF87969636FB6DDAA09FD32F6F31DA2F1B2
+47ADFE919932298D32C8C96FE9DCE6F4A75F071EEA657935F7F30C32353DC4B25819F7070F6B
+518C909BE0CEE0FB262EAC59C893DCA6C2B69CB0147206BDD4ECA2C4C8A232FE1B1DDB9C9B7E
+EE10FD8A0259364B697AB94D2481FF1751FA9782EB84DD7B481D0FE16D09AA95C00861F081C4
+04B638F1086D8C108953B5828960BE46BAC02B635F7E4290EDECDE73860DDB2E987467C70E20
+D93CAD40AE9BE998D64B3BD4D600EA6C8E2F5155A9264F9D090567FB7ABE1B4E2E1EC5D4E298
+66D289B5647146B7989DBAFEFB7AC0DBEC9DE8D12749113212DA3C5E9CF4224825F9AAA5ABC1
+662AE3B3FABD40D17408BBCB0FFAA37EA2C05569ADAE243114BE87B6421590A440036A071E70
+B77968A4A6C6AA4FB68D32417DA597F5396A4ACDB74BDB1FDEA82BAD3B998B8399029F0726C8
+F83C65AD45D14A1AEBC019F885BA60B0B6A260899BECA00C0F01E1AC25490DD78CF40924901F
+E877E66F23C977B8754623D1D0F7ABD00753C3A0D124FC297D647F78380C139C2F82EFA9C9D6
+7600079805EA3BBB31C79716E3A4DACB2BB00A21F34220BE2A202FE29265024AAE48C23B0FCF
+6142EC6587DA235577B6E57345FCDF32B83F6532023F8A3DDF97B01FBFC8B853E90536165AC9
+29DF10E253D8C4569616F297F7E09C06489E67618FD7148E6A89E249C62898E64A03D958EB88
+F6E3361F0EF2148BE4576E4D97D320B4CB7F412FEDBAABBFAE057AC533AF9CF9627BBFAED3A6
+C6CA676148B005038149259589FE227CBB4B8576810EFACA8EBFB5B52ACD96B373462336D791
+9FE2D926C0B23BAFA3024F15EA433414CEA280F1E20650F1EFDD04959A61A5C362C98B855361
+F2971287F63D512AF98695C02A5473AC45088D478509C2BA84967AEC0FC1D538654523791773
+D8A5B9D73C2EB52FEE2586333FBF6241A829811E06C2CE93EE1F0FA3CE620AD06984347CB30C
+2AEC9CDB0F97CE991ADD184ABA3783B556662C833A874E5C38A64B6438CE5348ED802000631D
+B9B3B33F0D90941BA80E92D4F00C64E62A7A0520D94E76F782CC734DE498ECFF23A5F24BCAA9
+7150F721064114CCA8CD690993A1274A5BD3F15A6D6EE5C237D7823E18661667B593FEFA30EC
+07E974AC8C6629A8DCC41F3F02D14F620BD415841709E7296D2E606D040D29D501927F9CEE38
+A4FEEC83A2FF45814700D41437C65AE671A5A6E83964EE131D909E56926D3BE03871341FF7FB
+BD19437C7A0C3FFE3D6B50479B56D774F8D2EFB59006AF71B47C7BED0DBFA8E8D95CEB3E5B1C
+65111377CB66E0817B2AF45607708868976661C469D4C1A3719B90B43FAC9BD8F0FA5558DA8A
+158B31D4866017BD8E144C630CB3FB547A0C6035D3D4565536D88D219D98FE96580B651FE0B6
+4FF75E13BFB841137459E93A0779616B9F67865F5F72503E60EA30AC387ECB6BBB2039582DBD
+891BB344D685BD7B4A44C73B3ACAF4BFD4170B2A529E8181763CF0990EEC3310B321F4D6D5F8
+84824ACD20B409B7DAA1186B998DE184C41A1C815F09C5902EFA03BCD1AC9DB7B844353B399C
+184088DA2DE7A98D789F1F7B56FD8375ECF32AC7AE6B9645C3EBD42D333061835230C4068720
+4AB8AF146DB9E945A631AFA80CD3237A27C6ADA5DF3F1E65DD74289E58048A40AB6374A4F479
+13A872042CCA0CF0BC34A30ABB0AB215BB09AA2FEF09CD664AC1F76736CB236AACB271B9783E
+1A94EF666A52B5A56A0BC90DB43762B33CECA87E1C8BC43B6B1FC6F0D8D8829A1DDC6A87A8EC
+8287A7D9FA52C848A76BF04EB015DC3C79DE6AACDF7316415280AFF2DFD989F8C7887253E6AD
+B49D6C78C8350F6764BA14AD14ADE05C76D9BC480B394753468AE029865248C2C760E3BBF647
+178F10A294506950073262EAFF3E956E7484636D18F2F4B4AC01F7F3DBA5C647209C29CC0ECB
+195764FE2AF2DB0C9086B587EC51A76AF1590D67102AD6BCEBF7B6D845FAE94D6BDF6BD0E910
+14DD679F56DA651F747FD08494A136E401A8E23772D3EC931A7524673346AC575756E278AB36
+4A1055CC920294D276373C881D8AB49CEC190A4DC921BBEB75A413CBCC503F96B862F1F446F2
+CE232E45652292A02349D7856904B46F9606D6AC8446F91B03118E28ECB7DB4BFAA9D79A12ED
+57B1F9086541F1D2AD9C55834A5061B1434BDA4F001BB74A3EBC61CE7D8353B6C57A7DAD0FD2
+403CB55B1111DB56CA38D2F5BDF3FCB687B08BA9CA70380EF03E837B95CA0C7812EB9D7D0B51
+00E052493BCFCC91B26D64B3B95BEA68F7AB187F5BC4B15CD5B2182103FF8C21D7B23FE7E302
+69E19619103362EF40128B0E1A0285299853239D28EA3EAE1F32ADCC813FA4C2D2FE80D3124F
+4BB2BC57F386DE387454AADAFF1CE4FE5769DB0B7A53B49DAF9E6B501834A117988081D2AF14
+56160BDF52CE6E1EEB12FD7B4C8B4C8C71D766C71A99F768B16EF1574583006FBA51963655ED
+C565B7306093E356B223DBE43B25162600F4E0254F9D8BF36306ABAE55C77640A63F4F7EB19F
+091F533DAEF035E5F7BFEEB59AF6A3DC336D953CDC9B527B1E6CB4E75BC0D6704AB8AFF7C511
+35EE9EC739B4DB64B145E42D7CE5C33FA78310654E0E02359BD52B49074CDE8768741ACB2922
+4EB52BABE235547A693E94D591673F5070045973D20AA8B76A525F6F3BC6E456A1BB17DB2556
+04A60A8344A7CF57411CB1626CEB4E02375AD6F549E6B21AF25C18418908ED928057525C9C84
+71F15F7EB1A471F57C314ED9EC16CA55B2D2492EF44BD9104AF9C7283FD1B192457AC32F8760
+32F204BA71A9010FF71FA0A74E6649BC382F883FA09EC0C46410E3AA49A39CD0A56F30A74233
+844F786EB37AE9E0FF1891EA5A7BA07A826D3A543462B30F5DDB9398B3618D06AEFC7221C8C5
+D1313BDD8179E2C38571CE735ED88592E1464E0A27876F40C2AC6CDC00D6B6BB2093AB39C825
+57D0DF90654D57EB09E4978BD9F5AEF16B76F80154EDC4CB61A17E2DEA5EAB9032101B259058
+4600FE5F74E288B16B41B18D42410D91E391F31FBD5B9DBC1A42BBF529F33EDA35757560AC9A
+13336809D78CA855015D9B3254F54FA9047CCAC1A1DECD2359FD6C5388A54F21C009402E5E6C
+5B2E4A504FCFD286EB6448E94012BF6AEA62AB724D774589B1818D2372E76200C1E13194A2B3
+4C2445AF8E6A63E7E270F54694CD71967FECB36CB10F9B7C7EB9C53B98128FA6A2D8171FB911
+20FA46D522C6682030000BB239F8BF8D1D9A923AF7104DE7DE2125425951040FB14466EC2B77
+E04DADC9CFA4E13C52CF0E75237E3CA0500857930D1B5BFF827AAAB103F5E220D1FA7FC206F3
+6967E00346C436BF3D15B0DDED15E17A33EF57991C0727C12863177BE68654EB63B242CE4D8A
+B2992DDB37130156C9D380F721C6B954ED6062033A11291332F32763B7DE9A35CFD34DFE9D76
+8C5187FAB040057769D2E52AFB30F7D5372165827680E85C3BC7645AF4441B11712C9DD1935D
+32C58B92709B7ECAFB1F9008582C8E0FD93FDF6BA3F93E38666F37C79DA45E8A7F0017F3A887
+A4F54923C9C107801AC9736E344693D57BA6648B44B9F6ACF6A9D940CA7960F35E0734213EBC
+6745E5AB6424B0F1FADAEB69C35319266314003C80EF00DD1C373DB42EBCF5ABE5D16142B44D
+BAD5C8E9E291C912F828D2BAF4965CBE826AC4D2081C8C382752C3EE0BCFD391A46B2A304187
+3BD2B28D7038EADFC4B031D06E4150801DDAC8B18264BE969DFA3C80C4FF17D29BAF3AF53F93
+6DD506C33704055B0AC76E436F2D54F4AA3CBD545FF1B67CD57325D48F28F3F7FC171548C106
+8AF2AF4414B92A014FAC72BB51A0279CB33B881DD767DFEAB867D0069273EE9DE19FF1D63A59
+AE534DA02495E0E4E5AA0B52F923228AC819E084F4E94CA631BD44B01B3025D8CAAB06F57D23
+1652FEFE73803221E39F284150DC944B0D2CD9A1F208AB552CA3C6A23D5ED3E0A350FBC963A3
+16B37D2CDB610A9FCC069B7669E2CB7505DE6D003D7F4F695DB88BC696AB9F87CCCB1EB635BB
+CB1978F46F4D1EE5A5ACB380BB435E424A7FE8A20F6F3F1E8745781601D76567AD9C1076FA1A
+1EFBDFF6F9969DF3C0F337B805B1AE318124274C0D7E0EC6F43299EE7DC48AFE50D428430524
+73CCA6ECA462CE40CBD2ADDCE28D3676DD125D404EB2C2706170EB35DA0FF60C1A8A9E36A659
+00C02D19219C6AF5BC3DBE759153B27658663F7C6ABA6327031A37F58F948FA4F636FA989C95
+3FA91EE86B93617C3369C51841B3FC5A533FB1754ACFB5BC80E97B002B34388D365CE95067B7
+F31DF8D6BB61DB83C0FC5C3FB54350C9B3A2F69153620AA7D2639116DB4A06166BB58FA0B9EC
+87726935BC6324D503017B679F52840957DE5C018C4F02F86D2F555CBE67568AC075877B1B96
+A759556EF292881CC358114E60A1B72F589F749E64BE973B6BF41692AA93F7604AD7D8376A94
+37A13EBE498DEE73F6E22BACC58108C83791C496773240B7BCFE6702FEDB9C4A3BEC1CE45396
+C5E88A770A61BCFE8755519D7E4007CFEE9919D528C651E40E05D7D03B28839255B7182CFAAF
+FEEAB7B7BD2DF6C56F52F7201351BA2B7705054B418E691276A78984A2EA2E7D991721C368BA
+22A7C8B738F1A9266064FF5DC036A20C8570A2CC0BBF74B25D7A691A20A1C1A5FB1400C66AEB
+CD3013C43D1328F5F5D0635631A3A21AC4884F0306623EE1C2EAE491DCB845E34D749A6CE4CC
+80B2E2049C0907249284BBBDBDE08588D5D1FE1031B2A2FF3756E7E2F670FF768F638D83216A
+2270902867F072D9E4E6735CEDE427730B942FA67D89494D959D0FCCB923A85C07EA3272FE4D
+018F1EB2A34FA95FDB6D31650AC2D6355EC338D36DE42547A6432CB847D27C74834036DB59A9
+344F59C9F610091E2D5FA6157C8BA4232937DB379D43F922E2A7581819A4598B436C60510B95
+6450A6DD2AC04FEC337B443463B4336008DB2289A8F9B126F0A998431D8E503B1781F42443E4
+0BE700D6C47D1D65EDC74E665C0EA196767E46BB11BC0ED69199F32DA3F4398342DD22EFC529
+6CB169043C3C902DF485A8B50A94C307FC14A6274570F878C6CBF18AF910EC20B0726684ED02
+1F862FD1F9273F32826D6D9569BFCD3DAC8B6D9BEC14562E22031BD61B4CFDA7B2C95F25E78F
+045E616A6090417F1DFC14A7A168B1B121C229598FDB040B336E1959BE810C03401D601A63E2
+7F8D501F830A591884EDCFED1C2A44409DAB3CFCEF74FA27D44734D071E33EC9C23A525E4612
+32135D02388D032BB8B9B8C1C8F46EDB55C98EAE149619244642D2926D3180BB66CB7D0C0146
+561E452B59FC7437D42B5F3424D5F30509EF1914E75D4B73E483701026F269169934EA1AD0EE
+3D1DBD25DE247F866E6FF52999DEFE6F5D5DDE98E974FF9DB4D9B99688652D209EC49AA0E0EC
+F73574CCC419039056CDD2D2EB3290D0784E295400ABE8331D978DE83A2B4001D35F51E39034
+E0BF49945B9B7C4EA6CA382684B996F12EC9438567A20C6C7713D4A6CCB3389B2934E45A1796
+42CC9E65199AD61C07769C3030D87E9F23E85469C583DB065691EE228FC2AF56632E9EF15646
+67ABFDD20776425AE23D22C16C3C005518590DED8A5DB841CE25BFB4C1BEDA4FA6575726517A
+269274B1517662BDFEEC6018FF525B4604446520067198FFE83C950F3D2880B5C9FB91DAA169
+91BFE63CFB48A3EBF24B7A33F43E1C7827D81CA611DF3476CACCE15A7978271C3DE2B48E1929
+B4233CE6A62F54BAC964C9ACBD1DC4B64C5CFAD4682FFC880B8B6E14DBA2234D6CE8F0494E02
+9A2123FE0D63B39DF8DC30F65969B8A659C0C40DF04B603EDAE85E81E634E58D053FB8826603
+96B30790E8D2613B273B238365F35F21631335882693410ECFA8749E23D34371FD28F3CE9AE7
+192389D7162E3F180D161B3A46B371F27E4596209057C4EF994E2D63791F32B77F9ACCE54577
+A56B50B4FA026D6C1573F45542D9B9338BBD2D4695F124C83D489606103807B66385C5E70078
+5418C29853BEC2D18985AE0640DC7F2FEE566599EC473AB3E04052BCA6F6BB26C27D6CE87187
+A3D4C69845A242FCAD1B66F5CD67D7F70422577DF10B05CC54D9F7FB036C289948F0387CBCEA
+D3A91CDEB9C2D1547BC6CB7B4A2581F39DBB75EA08A22542A723CDFFE7CFDE9D9FD926D1003B
+A3137A003FEFBB9FC84B0665D5B2DA9B37A3951A3E6EE16CE6F2216575C7C53061E5D64250C0
+9E8EEA685306DD9F693CBBAFDEE2A6A188B21EC458230E078BF9C7CAFC1FD601449F647C4B59
+B37CF7DB2B3070356900B3056B9272B476277AA35B97486585983EB96361D26F6714B49E000D
+16007B397175B0AC21D7064AF77144D1C0800689468351A1605E21FE5175320701DFEFBAF066
+2B93D79B0E5E7CCCCF8CEA636AB27E0A852F67B2C5F201081335D3C2B4EE9BC5D7F342B49848
+E6DBC3D2BC0F4274C2C6F54DF2EB4A23D2D736BF0823581C1EB35C8C0471AD17FD0E177F4C85
+A33522F002954E8BFB33C0ACE5DCF7B8310D71678C0EEB45A6F0014F0080B4DAF40BE2D890BD
+3FD44E14F04AFF9FBA9D98466BDED50680BDFA0C95011E2026053FCF08E0C67AF107D50CE001
+C7AAAE3FE75F5C3505BE54CC683FC9660425C17C9740D27C0634F04B784F758A6947A4F69010
+8FACB2D6B08C7FAE8D40A4183CC6329F8B921660E54420E2FBC44E43724E8F30196888AECD45
+5CFF68E47E28F68A8D82E0E7FDA8CCCE35EBDE0D146D120B1044A6E0BBD91B29A38FCF4DC8BE
+9158C1C698DDEE07E0BB6D0AF5DFF5C1020E8406CD1449E012EEC3A82D6CDB42F8318BDFF262
+54F3B528F01E8D09C147934DF965ECE201038EE90F5982CDA85381C2431A2BBC8DD5BA1FDB8D
+9236B699215626F78172D3B4135716D592EC1DA0F30B6EFA498CC3192847C45F2019DC74F618
+A7414DE75988D8AB737EE75A0CC778B00D6A84A647105664A6D147715C2CD14B78F261C05464
+490115BEF6A00282BF422807BA6E62E5D6FDD7D838E8C39EC86970CC7D86BB6EF72E885987EC
+8D919C37112C63FBE1993071D9B5B467E0917B35BBACB4ED99D4DD7E037B9AF008A5F7EB8308
+037E0E5C6862864C9F77CE7054ECED04E93A1FE549E1200368F3702A95B519D50AC654CDE6ED
+297A3C6A60EF1BB36A036900D4BE955EB4D72CB719B08694DCFB3125386C7CDA2DADD0AFE974
+C974E18501F4A21AEFD4E0B4A9D2124EAD0F97C5F20F67C7100921B151E8D492B0D607D0A208
+ADD6F315FAF3F054CDBB8EB9C5D39B56752B0AF1187F076A7CB7FC79DD1D01394FA6529C309A
+77F74E0614E79A84FE47A6518F74376B4E4E76A6E0BBA7043066C177BC8B979A6F5EE3EB5BC3
+16FF17BA8C4026F9BC861D524B223208CF94D89633DEDC9D80E79C0B8A620A5AF902879CEBDF
+1E0EDE231BDBEF0BAB71952B8D04A1D572EC97FCA725883FB2D4CAB5572261FAC4BDF70615D1
+5A1B79B856F0B393F2A065555FD2522EA74FED08700EFA68270627E09B91ED5D02299E75B066
+C5908A5790E45376C149AD782BBC1DD01D49B555B7F3B4BE829E3D28878F575C778D26FA2CC1
+74683854E0FA65D3969A3F9200F91258F274CF60978E45534514703BD6F1B7D69B41526CB310
+2FC836D074C3FAD523CFE04EF705552C365A82E2376D208AC859E308CB61603C59C80FDBEE2D
+15E1950EC314F2039B03B0FC16F45B2579CE2D45AEB8B978872E19E55CB9841859BC72AEFE96
+BC6CD048DD1F2FDAF87E31AD8292B7BFB9623B1D1DF85325B5F757206F8228A5F81BB4D93A77
+550632DDD41E61DECC1441152D3743A5074B6381F5842D8C9B5B468AF871978DA6B8A7301640
+323C65FDDB483A6F7CC512D523AC9A2F47616BB4847A61D187408664C758A79904D81DD29127
+9E8134FE1EE90AC55B2DA653FFD91E2D9D0B3594D19FF546DB593C8A699046C0F841B5F19758
+749A14CFB0AB686D7E17C58468E950255FD299DC7E6435A303B5100FF844DCDF52E3FCDA4A20
+8F42CC3BB0960E28B8ED5906AEE9C176BA5FDD3EF8BEF2A6C00E01D44AF23ED706E740ABA3D6
+FE39A0E806A2FAC4E5D7BDF53322682A8D0DC5FE490815F388223B0316592FB2DA05434BF842
+29DFB33DB898A5CC233102E29AB9C0DDEC5163E8D8E5FECF77C3D829FC98099C1F43A56161BD
+DE9373A14F69D5C35FB258CB96508DDB7B35A191C49ECD2A14C1907107BFB583E7B9BFCA5C7E
+E6D72F573E067990572BBC240D4C828E61F6394B4A071608637338987115F7437A65DF30ABBF
+5DED1A9DD5059610EB306071E42F46A55EB396EA11832FEFD4BE1E6F8704E5124A162CF209D9
+27F725D8D528408E8CDDA8BB494EB5EF2EF90DADEAF45E8624E89FE5080A04D2625DE67AD601
+DFB2131AF164F8169239A4478434FC2C2D882FF899721938BD643A41298DF0BFE1EE3F3698C5
+128028FF6BE57E6700B20649CEB0FB3C78B2BEF03BA238615FB8AE5201B111607CBE45241AF2
+AD6473AA54E9739E20F3F84DDDE871F1C881705E2C75FD0143398D968F49BE08899FF79A6076
+B4F283588F2DB488B2B58275E6E28739D80D0B4D18EE94EA308C01EA16F856C94C95DAAAA0AC
+A857F66E40498FD7CC3A8A98DB095BF04C6411A90A534E5FCFAFB3A2EAF29D2C9B24863F1D9E
+12A63FEF41A06F1BA5D26962C6A12D1A73DA880AD379F14BF568C90F206CFB6D5D53FF552D15
+C261F08B12965ACC6D86C25C0D1278A0F929EB931436A24875A01CC6E793EBBE243D880F9D38
+9C96E63793DD75CECD3D86895117F3AE55D9921A1968AAC765AA2B99AA4B21B203EE68F644EC
+5C1E965BE0885CEFD3FD0A2E0537BD02EB24102C8F3B365E255AEEBBC1CEDC7BC2A8DD1EAEC5
+7EC0E642A22805F2BC745A778E25A9723B420C1FFCDD3E641445E18AE18097A7A8E54E1C9DDA
+53E7EBD84CE3C18D56BBDC54C180E899D4BCF87C1CED04E10C401FDB83C6F353A28688BA6317
+D51A09250E1C2C63A6F9E8707D4B578CC61CC39E60B29EC86FE27FE12CD893C0C4CE3EC5F88E
+837623E202D5CF939AD560888684DF0A6C0BEBC5478F588F5234EDC52384895A564AF2145FE1
+E11228F9BF5106D900011F9A9A953B768B5CFDD595987C6F5A1F2031261C2AAB5B5CEDB11F76
+BED3147F301F821662B24D3FEED7A7A2D08F1009BD80593A7B885A4998E59683EC88DEC130BF
+CA01BD0A9265D74CC75A2560280FEF13012351B99176CE25E7BBB0E3CFB46BD5D7C64494478C
+87E7060C80CA5D5AC356CFE128783D6513670E1574FB06F009BB2671F0201B847460A54C669D
+8059A0056B75EAA5236216911B9FF62DB67979DE3DF71977EA93B3626961CE1D174A10B675A5
+763B8126E0E7E9D862ED49D82F1CFAB85CE6C94AED40A3E28EC2C7130C1BB420AB7DB578EAF4
+D81E4FADECC7E639F154D90E1194E1FBA01F611AAF2D634CAC03A34E9E25CD247DA54A1FB27B
+2888342850824E004B167D9EE44BCFB4541344E4F7884591622DB99132B1AF86A261CA17DA15
+FD4A2584681C7189FE4CE25B2986CDDED549BB0DA8C06FDEBF64C80B0B1A89D2585B9190EF58
+847BA4559EFB7C7BAAE64D37D95549061A8064637238FE3DE8AE31F06AE4E7FA588F85C45766
+EED78D8E2D9E8D96E40CD161D820C00CB0312463FEDE8441E6CD3AA8777F8D4FA553FE9A747B
+416A83FA728A52AC033A2DC128EFAE88808CCC435F1FD45CBCF963B263E714CD8C11715B4BFD
+8E0F5613101E11720C2EBEED9879894FC85927DD8303B990A2062198CE7F3A0A48528FE25497
+0DDBEBCA2C1A2160548C1E97EF58769EB684598ABA001EC66A278D4E353CDCFFF720AFDE2481
+B9DBCAC57EE38D9C464FC1F331A45D1CEEB585388E00B139F638BAED8F6ADF8D11FBD0677716
+AB72017C1349B72739749FFD24D00D8435AFE78805E455DAD15F6F4500A041E25E4E890DC0FB
+A5E88B7354302F59D03203997948AEF1FD05116A2856CC2A44BD0C2147C7CFE5AE9A9575A49E
+1EDAFB0FE0C7F18D1466946398B8099D3CD61F38950BADDAB531B2757395B3718FD42651344F
+CBB9AE1783CEEBD9F1AE5260AFEE7A037D195E25C673BE0389CA160BBF2D117DDFCC409DDB63
+DCD48185ADF29955FDB42537EC1C19A0B5E51D8785F06769C0ADCC90F5632A9F58F89D333F04
+623ADC50F2C78661B84FADFC524445374F394EF24EBB0FCF338FE9F86B654F112E8C987BE7A9
+A23C0AE29841F69B6F936E22507882D1A557E36B4F9F2C3D5D054A0167CF2890EDC16E5D260F
+3D48E5117E6B8758DA5CB55694862564D0060AFB15641040F1BFC982926BDD21FAEA2264C8BC
+94F5E4F882DC8772C4A0E049AD5561F0F240C28F7F863AA572E1743E27C1E9C1FD00D0C501E3
+A90E9F86536B2695B38955C97095E1892ADFC6A6BE12A986F2C79F218B1F0BE6BF3364A29B20
+3FDDE896664EACA5D770C769A36BCB8AA57083B55E9A31457EA37E4B83EA4C28EAADF56256CC
+630EC37F5CA96952F816EC04A3797A8DD0A33CFF1C4171AE5163D786105B0AFC689BC96336B5
+B28396E0F56193E684163234A361A57C826E805477BFA84F78BED285E64C5C0B0173A82EEC75
+A897AA2739DB136529C9CA30E67832981685D75F7B51360A97256CF5CF87E2A0CD4FCB59E64B
+3B506871549892DE880F4C39D40865E1A643D72B5CF0AD4A56FF0A6E68B356E2FF10265B069E
+954D2E1C5F6D0BF4633F5CA75617C42D53A35AF4EA98654303B54BF58EA419F054E4786704AB
+99B67A3F293A027B6F3D6EC6ED3AAF74B7CFE18ACEFE143F65CD7774191CBB8F00B3027BA684
+194B6CBE20796A9A85E205D774C47EDD8D68D754C8EED1211044BB4DCC0E7E14A1F1EB857BB2
+5D4191E0984EEFDBB7CD70958673AD34A0D182687DADC837139F087F94F526B93189C2AD5495
+56621F38A8D492B144881C69C76E611DEEE5606E8D9A3620B946571711ABC30BD4C2BD2153D5
+E557F53B667F996199989CB477381AAF8B554E4B0D0B3B41CD2DA66E120856DDFBE6894484C8
+8EC36E804C598C9DE38490313ABFC3B2E9E67F6E304B347F537995416CF9B00CD0DA9045003D
+7D3F6C7F358C00BCF66C9924D4D0ABF8BA9EAB1F37ABC4FC276D18ABCD2CF5E583004A4787A1
+0DD260923D86CD83BCB52B8E1A7643EC39F4EAAE5F4C7FA0B93177D273492F0EE0688F63A0C7
+765168619C5793BFF01FB5E65557D3452BDB63377DEA0462A0294114C125D79A59BAA2DB0B61
+0E9A5DDBA3A298AB82E721674656EBADAF525861D924DD0BE6182B74B548ED0912E6D0216F94
+D2DE6103F81C8DFEE4E771DA478E303D5A19170CC4CCE2DECDFCE2260A491DC221A04CE42EA8
+2AC34011E8DF80DDDBB11D5CD87C77EFEB80179BB5834D4D4F84CD7ED478DC2D5D6C20E9F666
+B5345B4C34DA11391C607CB413BC8C7169ACB9C2BA5CD27436B274C5342B2AF7AF334A2D6307
+6DA21B66E87F86F916C03AE2D514931A8251DF60C4E50780F4622279B8A8612377401411A808
+2EE7A7363381C053BB136FBEF76B96B3AD7D1018C9991A4D17CE2F3B626169F606787B2A54EE
+FA97EDA191919F4C9511ADA863E93135BE665ADBE9C523813004175CDA72A880C72FE711ABC6
+7446CBD6DB20D7EE6C0EC8CE999A4E28B7125086B0600AB0F34C5AF47892FE3FB9403AF0EB4C
+7C8E39E2229A2512A6944119F10C7136F81385372B28D39F1850E77DDF02E7A0FE4063915E12
+BCCEFA52086840D7E26B6FB8BCE852311CAD8B0FECA03DC393B896B0EF334BD4A25D80EFCFAE
+9398CE495A8176810DF51AC2C7D6145DFCE312860248C802EA7373D7B1F59BAE9A8EBC594E2B
+11C184AD793E8F9F0C03F2BD30EB454101EE8ED0FB66B9AE0594897F908273E591849F822285
+35D122BEAED330283C76080394C89B534029B637E895A8F1A36B01CCDA7924FE2AC9F0442520
+47D9979C77F4F52442A806A9CC723EDAFC8B9AE8AB884E9AC1309C9E55AE8B5935AB1F70F413
+41E718E995262DAA8716A2BE97F1506441317E556690684E040D23A1B83A32B747E7C44F3046
+58E9B8A364028086EA8BB8E654B4612BA44D8E39A1163E7103912B98894A79BD5EAE70815A16
+8229B8965DF0D76B20B081B527F16039AD39FE609510F68BD48D8B6CFE02A9784E282FE64DC3
+061AC3094BF3BE7E9E7F7EC1807F0EEBB0225CB37A4443CD9E4B2F25DAC8196ADA984DC31CD3
+52424CAB7FD0497A3FBF2F02435B8E661F0F73D21DA704FA37C69407AE9DF10DB5723CF9AEF4
+0D3A860F9027D0B1431CD2A92409E1E4D986D34B64DE243CA561293D0569648D5BC9CAD90581
+C666709DED4565C386907F9397C442A2C0D358701AC2AF50D5F376B384D52E395D52BF6A741D
+18E6AD76914D68C7E3FE1246CEAE4BFFFFEFBD7178BD8EBD239EF6D5D59F2BD71E899E763A3B
+EE734080790DE33CD9D0FE3D1289E80C3EB0C8ACAFD4F3BD4DF6537B1ACD2BBCA186CE615A9D
+0F0735048268D370AE929E84D2953882F8762D3819F61C0ED85A115C6037BCB108B66C7CD1C8
+3673914FE883AE6331BF32C3E199F7235FEFF1895577D216C8ED6E77DC5708F4CBA32CF1EEB1
+3D9C0145713A954072637DB4FCC1C1FDF0B5FE965DB518500063090DA4BEB238EF9F67F92B1B
+ABD56D2D82975D246E6AFA021E0C23E88A70554C2B5F0A328BE693E22400BA163AEA84453BFB
+05396E1C1A90AE9EE51F5C8A98EACE0A0CCDFE699B5DD368CBC7F6FB25A237FF848C01414DE5
+63BC991CC1A0A5AE840E8EC328303206D4FDC06BC7D89EB8498B611A91DC1037378AFFBF21EE
+248D15C95BC9F07A856771546E28EF1954445155DF4689527EE4B72A3F54D2F66696371B6AB5
+848A50D4A3F5534BE82FF257BF014769B253DEE02AC57A1CC3325B5DC44895D210671E7C77B3
+0C8266A1C9D9552DBEB49177A44A6F5F018C1D6DAD19F65C5ABA1F7FE55D80E93507338B0F0B
+3FEFA0565E6BF4334D98AE53911433146731E6399A8E5783BDBEFA8EF739FEC5353E07E423DF
+FE5CAA3DA0A486E4DA42E84618ED89E60ECC6E103BE8E61ED5C396EE9D800CC83AFB6E532BFD
+DD96ADDAD7DD85146F410B40C43BF1F12BC27E07982099BC4718170D8043297DB95A571E1268
+638621D6E295CAA2739F9251E7644EEA31715A42FC9A56EC891B5366F3C4F26C77AAEBDC1BC1
+FDD5E1AF4A140D6AE1EAAF67C0C28B2B4F886F0D8674B7C0FA6E7AE7F05D56457D1A9E055C2B
+30B809E3A84E706CE981107FC33D61FB6B6BBC9FE5952EFAAB183C994A2C606AEDA95E949231
+926FA1CFEFF17B86469CB504ACAB435E8CDC732380E4B887DD9E08618BB8134F4E75417EE647
+8B9BFB11DA7595E042B8D1BA639A1606441872AC2BBF7065341604565B8D266D64340B9B1810
+8B9A065E9614107C3B2A6E1E7FC4C65331D63278F113D9724A92C0AE7A1F98D5C07DD09A7802
+A77F14A551508B77316E4DF79497DA97823812A6153D81DF7F172C96E5827A5BEC3BF2401009
+E212C8AD794D49548485B72C67DB2815DDDC3055ADB819C1461DBCF71FE60F7E0D5BBFD010ED
+BDB843603BF2DBF73B69A9685CB4D282B4B5CFBD47D805B9E9BF38949A59B4DBEE9FFFD200E1
+8E163866CFB2300DC446A7F7BFD22AA5474B706573FB73336840A60CD62906CACA961B801AF7
+8DE0CEF472C0B96413847AE7A911CD28638F44BD04E6D1A1F6847A50407CA9A351B914EC5906
+540B097448B4473F56E77E568DC0822CB54B312E4F9AE5742F6E61C1A5557BC04BC08F39AAA4
+2AB36A10996E1412D7B046EBE11C4131F1859178DFE84AC8CFBE05CC3B919D5BC91DF294640D
+4FD5835CC5CDA37E9062634745E5F3D3C310CF73F810100EF5945725FBF38496AC8763E28B9E
+69566C0F8032129D569ED8B93FB794473094700911A2090A9F6D8FC5186ED4DB8648C32BA583
+65D1DC247BA2FE69FE4A42F5423EC4A8D1B9B07A836B83201EC205D158A80A8918143CAED74A
+60A4D022EFEE3C44FA24FAAFD7E0B08106AC9B851DF68C1643D9BCDDC72905440C980113BD78
+91394313840F7B4ACFD26CA6C1FC757436AE7D499801FE39594393E0FB3699AE6A7F387AAA2A
+6D955739B2729CBD00BEFFE282E12D0E938D512C451E186E82703BFAC1FC85C57957B482CABD
+8D3032CEC83C3F75D981129A6B5736577CF55C417D11F26BA143D197B53FD97B7766971DBDC2
+BE12F9EFA47A0DAF683F504EF5726AAFDF01FF5B5D941722C6D1973FF92DEFA5DAAE8554DD48
+B01FF2660B6A31A210F504BEF75C1E8EA6E243972114DB296D19C790F1806E58CEF7F17673EE
+6254A4D8D14C3ECF591AEBBC869861604E181BC8E70E19A178F0118FA307C16778810FDBDA4B
+148BA33FF3A4B38F3175267E7924E7912C52CD78352688C45644794CBB843A501F6DCB88BAB4
+6CBBD6F36E31DD0FDFE755081BF4F0168AC57D32E63BCD9E95C6C55D9E56690B7ABCBFB535C8
+0AF3825F921CF6C3953E40BAEC3795A32B04328750932DDA02B0408EB74210EAA082D7E81C04
+DEFE9E7923DBC0A175EE616161F96FEA8BC29953EC47B82951DDFD4996A6573C40220A36355A
+C3E696C07F61D6C0B16D2124F2CAC8766C65BBC7B8BC8B8B0D5D766533868A1664E319719863
+F29BB802EEAEB5D384E95FB9A784F894CE477D8A41DF73E6B560447644F54EE71741AA8C3CFC
+F40547426B5D397F873D38051A1C37C05DC2BF7C77F4068D01DBB0E5FC2E3CF2524774C37525
+8AB840929F058BB06B958E6C9157425C3D7A2C047272C387E92ED820C92583E3624E6E498A5C
+23264DE1CD9000C7B97081E40023C071EC3968D22331DA058AB5DC1A4039B0A313D70255281A
+B7CDF91FCB32A991EEB82E6AFB4313D4E236E57819ED4739863997EFBF139624F650842DCF91
+A3782B41851EDA4B45FD9E46BD4002379C66F700AFCF7B04328948841749EDC07B03277B01DC
+DF1527F14E261788FBD4D326177246589B5D6003653154D8CF5B262FFEF2BC3C5A4F2C1000CF
+1E22408F1C4C972969EA4156B3B0DE2905EDCC99326C3F72438C659BCFE4E420C643BF6FE226
+5CE6EC9092859A20C8A8D0BBEE2FC3FB0D14217E973E4C7B318CB7A8F6ECE8021EFBA044B1FD
+CA1BB763C1E37D622F833FAC366C66CCB1C44D8EDD405087D720BAB0EC695D22D86272BFD95F
+35FEBDE770C397DA6D5B212AF2DBF1A16FF5F125F3F524F53B98BA064535346D0DCDD2CC02E1
+C55EA0E0F847F766720D6A9D45B9D9776F35B65DA3D8A3C78BB235B0E5FF8819217B77B86A46
+FA0ECC6ACA8C6A053562FAFFD3350F2A056D2622A3A4D673A6A586A03042815ABA31AEAA78F1
+09410D270DDE0CC99110A420B54AD9CE4B54D4687B07EB3AF950C1D4B88B0AFC37D792407D94
+50EC4D77EE6DDFF803CFD0F67354DE749FCCBFE296924AEC3A305857E94B65E91FDD9F11B289
+CA47B191C7613DF209896366E9D07431BEA6A229652AB7FE6A210277334784C8D6627D7D8ECA
+43D4B8E75E1E6AE21651E7B9942FC0E781D502D8D51D7ED6F9576A12A2CDC40F3781AB70437F
+9D958EB6477833B9B85F391AA10201E89C70C0A6B053E5D95A550BD380809C3D9249602F7EFD
+81EF86F7BEA0CEBEE78FF7E51FFDC2CAC7BC2692E3096A1642F40687ADC3CAB1626F7311CDC3
+B1EDBCF3BC8A56153580484B30875BD19B65F77320A26A4540C1079D23B07C48FE5D69EBD7E8
+AC5C11333D9837FD706D1C52FDCC2AE9D13B3CEAD494B7D0AF602A57E5032F872EF41C71BD1C
+53896529E6050BFB85998F489CDCEFFCF9B70E5D7371422F031AC9C00D00E8C436B6EC76C9A1
+1B9F92AEF7246D46EA779C051C539A5D0B537F05ACAB9C2C22BE43EEA3D56F52CC7087EBA41A
+894CF633481422F5E6270A4E6445496DD020BD3CD846F98CB64061BC16E6C7E5430EC1BBE8CA
+2A9390EC2B3EBF282226EB70D5AAB4B911EF1347299FDE67868D6C1ECD96B2A8377068808629
+E2BEF81138EE0966A059BB6058CDB7D418CD5F217DE21C03C596471AD4125FF448B5DE9D50EF
+DA9CCF04B3D4D74B452BD00C7AE549FD0F2F1E7919DEC06ACB53D39A38E75397296A32E61A43
+5D4554A1DB7757288ED367DC6989FAE7F428A8E28E806EF90C4CE040D1478FBE47E2CED9C3C2
+4716AB2E4A138046BF7F7C5C6ADBC75A3283CCB5F9F53E1FF05D09186C8EAD24CE641DF1844B
+A76AA15586A93049EA5C279CD92F070B162F59A7023B716D9901F332C7C05DF88C27BEB76A50
+4BFB2F9DD053627942AD6F04315B51140A6DD16A9CE1A4AF46AF3EEDEB07EFF17F6BCC85BD86
+6E763C64CE25F9F9D278F04AC4B12A03EA26BE39FEC35434A1A105DD410FFFE7B99C0AADA93C
+6A834BA7774BAA5C01D2A8D89812433D5AFA22507ECE5014737136641953F6B053E93500B069
+34C25D5F2E7F45B00D78A4702A086AD89A965EBFAEDE1CCB95DCB9B8F0BC376CF29EAB1288CE
+A94F572383D358AA48EE8DFF88B20A78262813BC1A2849716F6FE7295CC153069E511281DE2E
+1135B90F14A9AF09AB377E76A38D0A8C87AA352130228BE170E0845B1FD3C115E7BCD94A807D
+0B079CF9D0A4FBA455CA2CE547F24A5AF1A58EE39CA617E2C15ADFD2AF1B6625EB8310CF7831
+EA2744FB523816373E69139B2014771C6D7C9DE12CDC486943D716B9ED76F5500455641DBC52
+D5D20D43A41D28FBD23D557AFE215ED0E7B9ABED8A5F908CC8331E3FB61C9A9E73546AF3ED88
+A024607B738849BCF80112E995BEB93433174D2FA06F12B159979743EA404625BA7448F54DE4
+46C9252A6A2769506905F8448A938EC2BF8EEF3F73BD5C7B5B5DD81416DCE2EC74AA7ED2D510
+CC6F591D0C51F2DC4B8379D06775F0C2BEF70343097C44EC7FA8F711A745F3330DF7B8BB7742
+EDE598BED07CC879A10B0B34B20335A36383A01057A53A5243363855C70AFF48F259A5B2882B
+B302D320E533225326249E426BA07FBE02C76D5193DBDAA10FB23DFFEAC7E2AD096F324E86E5
+A6B76FCD07D6129338D14A893EE8D92F71A9DE75D6195F71DBB650F0AF3989A02002DC32D1EA
+DCDB40CA3ADB7B50286F2618EC285B822EBE484E9AD72591F5DDB07F3A31EA9FFC3B26039676
+D1BB14983439F0E7517674C9E36D1F86FF8032E6BF2801ADA6BD004454BC61FBDF33A2788CEA
+419B4BA1A0AC2E19660D6173F539E7EFE000AB18CE9F724E5CC641D6052A70F994A38E050030
+ED2CF32A037B56E9CB96C149A10F34932FEB06AAF48C2BD54D25B58412CA1FEC65891DB9064F
+3CAF93D6FCC90EDCB298BCD09ED00AB7B46F5E776DB5AE0E397F8E780C4F9F19A339CFF8C9D6
+6920AC9E95B3D90F335B7B5BBEA40082EE405AFEB3397A4090BF854F0A34DDBB7D80FC30BDF6
+DA9032106C0A090004D0DAD25B27B99470796E5C4402D05D82FE0533A2FC0641E06086D5A63D
+FB4C9E35A8A6ECAA9259F93B812796C4A331895EA2547ECEA1EB254B1AB777FD3EF87E583817
+4BD6919E04FA04FF349906D4AA7AD2CE33BA754276E5712F3EF752065019563446103EF6713F
+E9ABEEB69D73A66FE463A37EFBD1A37A53B42F445D13DC40C1042C38B09478E35901501053E5
+6E98C2EC86B364594FA23DEB6EC3D4B16C41A5FE34A13B880066B3DDFE51D5DD7C74CAE27085
+9934A57FDE18D4BCCEA46CF0B05C2EDED63629700526B0FC9B40A3ED89A3718DDF61A554FAC0
+6F4722CBCC8FAABD7960DD7D733A73E820787F5AE1F5B0526A76FE49057AFAA7D42654C95B39
+C9294C20F36694DEE69404A8F1FAE78CD75FBF9F59AA7D9887DF8783775F26CFACBA6CB01B30
+602446E1754E2F6BC3CA692B4A6F078736F9FC74312DD87AD5974C45B386CDC5E64205AFAEED
+297B40BEDD7630660FF644A7A9734113E58ED8893C3B93A73F183C1CCE12035FFEE9A515C349
+16A92220D07F065436313638617BF3780BE2C9173472B8A69E9EF800CD93709AAFECC61734D5
+DFBE4DF2AA1AF855786753A0CF176BF74CCB46D2CF239BFC37B2554F17C1DCBD693786A0B5EB
+82831F9E8A4B42EFAEA6B10E7942AD1B783B1D644DBA9B5EE4B45CFC496FDA6F98881689760F
+734AA938CDEA288427833C4F24999E85DC610EF3A484587266F72E1D9EC3ED7798DD3A9EFAD9
+854133875C0F42453C21287E5A4D1854CDD50DF26F572A5933CBF0944F611366C6E6E3B80D2C
+4C44DD99E80FB8351C9DFBF38CA541892804DC2FBD14B1CB344555FE484BF649C9308B751AE3
+F27D7FA779B59C3D796493D14426A31C4825DAE251B80D462C98F287C5E60B782153854E29FC
+3BF95B2C4B3A987909ED65D3345F947DF42A7C0249602EC342404301F2D1D1DF0CB61DDC5F38
+C3A967A0CBB707EF6D2458AC4F51388F803C2D4ABAE337F604D8508BF79A9A1BC185C5030DEF
+FAC72A16CB51EA6FA8DA134DEE3EF13226FC0C5C5A00573CCC71B7F414E93442B0558A328805
+786DBAF0E9470431002F0EA58A40AC74DBD1805734CEC67FF5B8E3AD354FCF9AAA26FC636EA3
+0B026DDB98B7749DE54C37EED9B0C614C1CC5F1DBFD618BE5728772E67F85AFE1DA3E907AD8A
+BF69F6CA96E5452DDE3C047E35FC55AE164729E59AE10FE733FE1B58FAB7EBAB46120ADFBE71
+3529D6B8728C772DCF0B43D42E9D7B7DE2FD45B042DABB9D573FD68BBDAFD6E26ECA6672A425
+5D591136049F9C2CD467299EEE7766880F5B174C2CD570011824C958D102EB97BDEEDADC9B07
+33BDDF99CF1C20136F34EE2461C6D5CD1A77DA5A901A66B2E3D57910CEBB30C60AB149336F2A
+91A9CCD9C6771D4A48DF99FA4683DB39A8161B83CD29E70D51E2ECDA3DD5A34455585899F61E
+7E4FC376111D29CAB945D3FFA57E7DB12B894948A37DCB2BA9E79537E3FF095C81CDC6A4B228
+19D7E579355B281A4F44C5F475AC8F984B78A91B20D4B11EB47BE5905059A211A6696DC066D2
+A5792F6AA667BD5AFE92C81CCE1753DD689FA80010DBC4E0BC917CD4FC8171C991D6FCBE5D42
+CCD8EA0017C0DA02CF307EF321A0F883FE33731655A5528AF87F05C406C7A05DDFD4D6889654
+99A3ACA7E82F3F2D85941653AC8E45C3956CFFDAF91CEF1F1AEBA26EE5495A3A28073D190A38
+1DF5F2384D12C1FDE082378B6FCEED74831C12A54337D64A6352E2EA85E67DE10B4CB5E09E5A
+B6A356F2345EB68EDE34CCCBFA9AA7DE38B5FBFDC6973531B20F85D127EAA05DF03AD933D546
+0C50933F551493AE28544F62D126F2964E834DAA0C652C2EB4DE3B0FEF10C974FCC7C10F0196
+AB56D47E268AF927A96EAFADA234F1030E58A257163B72793D8340957515D2E7FF6153923E5E
+3EE290B6284960967479B4D81BAEB242B327D6B2D0FF46F77E43B4A0F820F66204D507E7C1E7
+BBAF0927478F9F9F7121E11CA789C0E0418217CDAF10875F96FD05D49913091B920DCA3BB373
+99A1D88109D834742524CDA2FEC84E86F232E5DD433F924E9E01BF6E446A63DC40741D349420
+26DBFC8D3888A3A834BD4AEF3F5D38000FE075AFD4CB3DEC0415EFE16FA1820341A48EC4B3A1
+086BBF729E68EC9DA96296A4C9D551E099E3D3BD8F464FAA5735B99963DE4C2AC96BD0FAEC57
+E61C59133EF494085A9DD295B45B5B86307C7FA720F7170DEE2728CC31C58BA1360EF0733918
+D1663BD355295CB8363E9C53B1F271D5CAA6D53B80D8DAA29E9B834271422637CCBE92D7D9F2
+7B3D3BFB8B3FDE5C6959CD831B09948F92943A455E911801BB69CDC4AF15ED67529D529B9915
+2AB50B8ADA7690135C54465F46AA2D6E17FBC36E92E3C9A2EE01CA9693646DDBCCB439F3405E
+A6C6FB477B56BEF0FA5C5EBCC067C959C4453046959C4A9F1B166AACE020CA94F082899CD9B0
+FEC62E8B60851D872E56D48C6CD9D69D5540D1B3F1102E0B641BC40E17FD99A9FCF1048E44F6
+ABF60352446E3C8520273DED902ED39EB7BAE21995A6F48D89A74A31C40E585D6206D90434DF
+E9E3FD3DAF501AA292BDAE3040FCE06586D10B19612590DF6D9D60C086C9BE4D2467DFC042D3
+4BC7C37C93E58924BDF35C5380B84B5BB19F3658696D32AD3E48F95A0EBD2005E50423C9E3F5
+DF1DF53F001CF6A914D3F7545531E578422D99F9D914C7D83FAB83424C583F4A78C51B194E0C
+5A80BD051BB9C62553EC3443315DED169EA666119BF3C5730391FC08EBFE0F2B8D6B18EF38FE
+726E9EB4C41E11C9A22351C374341AB728D0224582689A104A8B3E7DE0FCAE31EE8BD13397DF
+DFD04211B18938BCA715A66A1C7AEC553A14C20C909AFD757241C62DCA34D6CF7ABA262066C6
+3BDA13D3ED508F90AC4CC8F34A3C7B8596A47A24B0C048898CA14D7DBE9C48B8D1DF2057BF83
+1C0C89C470F3E526DCC94D247E54757DE9AB8516A1EDE99EA0902025818A06C68064AA4A7706
+3908CCFFE4751E161EBB1F5BF09AB351D39D0FC2CB8021B73A8CBFC7BE80FF63577CD226554F
+A9DB429B058B02314ADC063D859740747B54961512B3160EA441AD31F6DC6A0D8AE9BA50B0DB
+545870A451690DADBE35FD8BF54D32C06BAC67C886516BDC7FC91CB9B6435525073E37CF4670
+708805243C6F9809C610CCA49C7D53A638B04B15FE1FDC4F6C2C6C274D18DE17284A4A6E871C
+22D1D525C23FFD924AAD6367E6F3E576667A2766102BA4754E6E3BF0F854B328874BEAE2065B
+5984E0FD540F228BC854E6DDE07788975FA64CB562656490CD30C95D4DDBD8171E4FB1A2B5C6
+D50755375446CDD0B405B47143538D4FDBDA098AF40A06B1CF7A0565009458CD116069C86746
+DAD2C0E2F24AF45B40BE740E7485BAA6B776D99ABA9BB0A25C53E3AA56EDAAC25BCA78BA2A7D
+0AE5DC30D2D80493F95AE152DC0C07946BC5B5EEC417E1903B3ADA7D1738A3EFCD223F743CDB
+75F34A83E3EE70339BE05C352D8A8C3D3BB7B3F934A43C26EB2A849A2B390D779C9989E57006
+AE913F406998391013A463175E9E4C8DFA17ADD0A743322734CE5BEA82CD7A4CC1115FB00D1B
+212C8A340B0AFE77568219B9A3C523090ECE0515CA21C05264BF1934F557AA0197934B8D27DC
+634A30C5C325309E6E7704E97BA8C06A8200B041FCBD0D539D972FFC6B1250F047C4D6C5D549
+7B3FDDC7DFC0AE135AF47C31446D8EBB91190847F870897CD034F87F76C4AB03901B37B18746
+0A32360B86D753C9FA87EFA92B79919BC2D181A81CEA92C438E05EB257839443FDB5E96A4CC9
+898801D4D69EABCE3B92AB3427930C462290300E334EC1DBC9E54453F466B9CE2374CAB66535
+DCF6312784A708A25165D6667088BEC143F05A827EBA0A9F6AB536B69F8EECC44CA548F7072D
+B51B6A189B4260ABF269B0A1869763ADA330A595CEBE655FAAD08D62415ED6587B393360DD36
+6E5350EBBBC3098317B97581BE36742DCC36CCDBB3B42420C791A20CD92FE82947EE6144787C
+4C3A6EAE1B13EB6BCF4D0BFDCF25DC941B47FEEBDF2D49293DAADE949AE1CE74037676E01A39
+C2AAC54ECE35A8630A1756AB03059A7456E1048033C7F1248324643395FA6FACAB5E915F76D4
+40CBF009E1AB1F39E87D9D5F2B5F6BEB9034A987A18F05A558C173B145BB865FBD5EEEAC935C
+70E207BFCD63C514FFEA2250B6EBB33EAFCDA4CCFD0503E5842D6B1E27E546BE5FBED519603A
+EE73CBF5B83C51C1BAE439A559477FD7BABE6B33AFF69EBBA394355679A1518928FBEED5A751
+6488EDC265BE1C1BAED666E33FC9CFFC35347FF8834489A916F048B25E96AD4E8DEE3AE05C75
+D3AECEB30547329D9FFC69BA98E2FBB7D1D78FB6355CCDA87826AACCE1AD13C39D718AE32310
+14EEEA3A5C79309FF453C8461A4C66C3751F1CBC06CB25B9DC60BF3583B142AFB8334EE23DF3
+C69F8AC7C2CBEE75CD7F4A33DAB9C8481B6282FC58ED195F1780E493541C208686B71EAAD9F5
+358C0DE284D54F0B6341807BE697E3D737BA6D7796529FC73843722507DFC1598C1B808BDC6B
+12A4259862FE387617B2E189B194D96AC95DA4DE3663FBB4770341BCEEF13C75D76C655B40FF
+EBC66713A3416E7BE641F5F8875D36495DE4E94A8B6508E6F3EDABAB9FF52829CC674340DB57
+B248864BB9365AEA3A6C84B6A1D0D6928D275B5A79ECADBC1836F4768A715556B98FAF6AB81B
+289831B71AAD06F5217610CD7BF4F92B48F7681EEC635B26E9DA602962E4BB9B3FC4E561E629
+767C0816DDF8073E7E387A125FD81592A714B58A03768A8309BFFE17F7BF45FC0C0820F0137B
+398E2DFA6376F9A7808E9F7987F7E8D4898CC8D16500BF4BBD6BE2B9A166DF05DA84AAA132EC
+B88A11BE7929811EAEA87299F26CCC439A374173B6AB3CACC2645781F787F3EEEDCE87427F6F
+FDCE837946A0D5171769FB3F150A51E16448C08B8F8D78CFAE3A98D5F18F26E745CF9DC64403
+91AECB0B61C713978EA17623CC5ECCD22F4BFA6E655BD0A3212B9E2ED3BA6E85D61F099983AA
+1EA8CF1D1D852C03B2BD92F0F51E09C154DA9EC5C879CF489BF99923DB4D9B68A6EC66EF1D37
+B8A1B27D50CB931B87E74B65A9130423C162E66AF90B61A32C63B1C92F9A01C4A3917407FE69
+A2F64FA60C808EEDD1825A02C9AC689641B6AD379D64F153D063CF3664751B06FAE88D17014E
+5E0B0DB0D41A5817149DF3773F81541EBA95093B338EA9CA58ADEE6578A540B59927384F0F08
+536A57686AAB0AD877E29AB626E9B14FA7B1C4710300583DD5AF73098E1CF1B807D647149523
+E1B64427E7E5D1CE78EE1E7025A34041E87D9F6A97CD1B37BE324571FF184EF3DB86EBF77894
+5F7277D0C194419CCE2546727552660115002034E6DA52BDF3FA669EA30318BEDDA7E7C02588
+8C1DEC52925AF96697919C162167E3746FDA83CBFEB79DF4D2E8576C8F186C31ED02BB428817
+B0F8BDA82D74DB4903CC1F7B18872EBE75C7EEF577BE9309DEA7ADA7565B6943A28BAB624C0E
+7FD1783314A82C41097031886D8D70FDF368E95BAD9CED5F620A11031ED312FFC1C2A587BB5A
+6570AD89CC3FFF6F5AF56C361BA367A5FAF9C1E4D9F2F799479730FAD7DDE0F1557225054646
+9C9C64EA50DD1071701D2E0CF69F227C2400F01B5ADBD34887C95CE68F26A6879CD224D2B1C1
+8F11E02E3CD42E35D3C3D30084688F798FF91EB3D0A82F11AC9212B2F7D9E135BD3411CC7188
+76775573497F2E5D97F5FD3D0C8AD2FEF53654D0E016A39D4E5717D09CCC87367E1F3193A4ED
+5714F783794436403209E50D8B96533F76CC66151CC6124CD63F33BD572D25FF824AD44D5163
+7BBB017453E4B3B37C0140075422BCAC441047654119577EC6ECFF0B580655C21772F99DE072
+503A7688E22BDD7723AE7E7537ABEDA2064A1C48424B0BFCE52607CAC741B762622E6BDE5B27
+794B4989FFE55F4F2EBF290B0FFB53C62A2BF670946C8CFD089242341637B237C37269FC32B3
+E61A27DDEDDAF2897844A3AAC99E2E23AD7EF3010D2AD92EA14FCA6D68448E961212AD79962F
+1608F0193E7C301F5117C3B7CA92DCD9613F4F90FE4235916F17598AE3CBD144CCFE9F2937FB
+44CE9CEA13CB7298B02621DDCDF2CCEAC48D2A22177E244592FDB96BC75B0D4D9C2108DE86A0
+1D197E13FDF277FEC5D59A04380AAEE76ED736324239FE2103240000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: LOGO10
+%!PS-AdobeFont-1.1: LOGO10 001.100
+%%CreationDate: 1997 Aug 08 18:04:11
+
+% Copyright (C) 1997 Y&Y, Inc. All Rights Reserved.
+
+11 dict begin
+/FontInfo 9 dict dup begin
+/version (001.100) readonly def
+/Notice (Copyright (c) 1991, 1997 Y&Y, Inc. All Right Reserved. http://www.YandY.com) readonly def
+/FullName (LOGO10) readonly def
+/FamilyName (LOGO) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/FontName /LOGO10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 32 /space put
+dup 65 /A put
+dup 69 /E put
+dup 70 /F put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 83 /S put
+dup 84 /T put
+readonly def
+/FontBBox{0 -11 722 611}readonly def
+/UniqueID 5092849 def
+currentdict end
+currentfile eexec
+
+80347982AB3942D930E069A70D0D48311D743B8793C40476B99911A1BE6C93CAA7FFC9533764
+A6A2A3EBCF0BEBC6668E399D80AD8B0E5E21D556D8FA71B95A1E01E6689C74F977A4BBEC6795
+AEC114D8507F237839F414EE4FBF8162C865260F923A63721852C7BFF69703F7E0AB99C3B85E
+83C62C13EA99442890E370376CCE7133CE8F3DE2F4C1DC78FB55DFF4EB737C195D266281ADEF
+5D56FBBC3B785B1B59D6EFEAB3B93E713F4B9105CF1642446D87545B76F8B9E129A039215E86
+F1ED20AD12869FB7878C031E1C274E59AAF0AA9C34E2BCC9D18009551ED98A1C602644FEC957
+30E0F1ED524DB1405BC42062C767E90C3FB712BE8FA073C1985D9D4BAFE2ECFD54CFB7417A1B
+E828AB45B616BE3F22B251180F648BE54BDBBB9EE5F5FB32B4ADC5EAFD7431E16208494A358F
+A19EA85C257915A7108EA280AD6268DA3395DEEECFAC41A438A05E7B4E39B542B6A65394C68E
+A70C4D34FC4B2330F8F4E353A5E09B43AEB4319AA5F486A43D997647E23CEBE06B47F8A2B2DB
+2E0E122D984B2796DB07F6286E974D445A215E28719252D5D5F55C4B1FC1CBDF051E16567AAD
+374F5D6CCCDC9BD1A055708495987ABED83E733E06A9F1161D88919707EA8F0C724930C7AC35
+A205D1AB48714796C4A6E846FA3ECC5CA061E91DC48C22E4B7B534B990AA43B249334C184760
+5A3C65A250C55F021414416C272EACECD1A5829A1F74329119A2CCECA9DE5A8511D695771C90
+43CCDCE473A43BB2EC53A781FC82A4FDA03C5AF90C659F6A3A84F93E703A473D7227AE1DBD5E
+5368CBB4F9F97C83280066199B173B5232DAB9234EFF0031F1DB06BC7E7C6492F6C9B8BCB361
+C44EA71DF17A9533ED17E3470B4B1AEFD7347979FC04CC5AC8D78DD06D3892211F2C244EF9CC
+F84C65D013425D119F60FD2131271C31318DDF05BF42F1E9C3D655C31E3F826ACDEBD77D4278
+6F055B8F3752C3BD610FE96851F00D027490629BFC92C026DC41AFE6EFF74F0DBFC0D4B64A47
+941844FC662898DBD4CFF8A6FD74F288C26DC81BA91F15FCDC536E0000989E71C53302A27106
+62D3999BBC32CBF16819DDCE0C1CCDB06E94D6A02BC5E5C8D7B8DF63B615D9AB774BAFCDE67D
+3F880DB49A1DD51102FB7B97ECECB6F6A76C8EDAC1980801023A89550FB9B06930E717C13B8D
+4B9F10823D8C3F756024FC3BB6DD0E1F8796500496315E509894FC5B63D7C8B759B9049DD675
+32FCA7B37FFC5C84CA5DE3069FE377EE92E28DA7ADA6BF4792F665EF289753AF70B3D636C3FE
+C7FBF2E7093E79C820A34DAB974A51470704121E2021278E3B66125DCEBEB454AD5C2278703B
+58ACD96A2F870A16D80494B37EFD3C9A905ED663F7404093E4598A6C19DCAA4D943CCD4B2B8A
+B0A68E68DCF502941DDC3B89CCA71B6E1B3D33BBD04C63B6106AB30A9D813F6A1C4B1EBED1BE
+6CD4D5A34A9E1F4B4658DFA868DAB5471CD3D407DCA4262F0D1F980F114182E2794AE5EE4A4B
+36624F26E7101711FCFCE5FE75C72C633569B6AA8169813A0AB805424E29151CE1FEA659B72F
+52DFA3FA8026AC1B4B76A0EAC70B08C97FDC07461A004D70A0A72ACD9C2713D1514A75AF1B41
+A26A4AB72758F77F9872F5C9BF5F3CE5A84CD6296C46208A0C31B408FA661D72F94E1A4833BD
+ACEC551B51C9F1022E6BFA3E988F1D961C268D3551819647E2D99993F0D2FAA2C229E834AE94
+593BBE7BFAF4D114076F6941F456DCC402827208523B8630470EEE4D08AF394B7FA77AE92922
+B65E3A089808CC2552822DB507E29BFFACDAC7D4FDEFA9B69F8D6DA3C5F27B82923E608ACD7B
+E05B7B479C7C0F8428EC53A85C3D9F46EA058F3E3076FE55D9644A3317B515DAC1F994E5E1E4
+1148EE0457F630D3F77387867733DE1458B8EEEC890E3F6E2EEEDD10F4D875E7910D2E024FC2
+9BC95B51FA508618FDEC8DF22D69DD74B25BE80AA30D8E8627123472B8A69E9EE8034CC9697F
+19331D40E8320A9618A134E6E26F8A620FA1598D2CE1989222F2864EDD373DA72584E5B43F42
+DB5241D09E1E62B9694471BAC1397FE4D839E0F8D54B1B0882A2D1218BCB3EF3253F7F37DE4D
+0BA3F855D2E5A7D4D86790B1F29D26C6952A81E8BE3EF5F942E1212ED4E82A3AD425DB483FB6
+279399018DDED60AABAFB918B5E976DB2E7CB8819E94B7A14605B7E147BB245E56DDC484E2DC
+84425AD1F439223744F76D1CC8A00D6EF4C0CA7310BC8C8FEFB8E08FF4681DA6961E3E3FBCE0
+7F1583B0EAD8A44109D887C42E1E9CC5CC8C1BD18D79D34E6D142380DFD02759564BD58AA4F3
+7AD28DC082EA0D3008AD3F1045FD7E0F2B4F71499C4277FEAC6451E1E363CED0945C9CAF5443
+2A5FCDA1BC22C11CFE0C94CFDF321AF32E9012900F6E0B2D32E4625646E0BB24159F79735913
+91B33690354B93B0A17648BF37751E766F7AC5E6F8DA6C72F20D6E06008C60DF00B424FD0BFA
+C39620D1624C61C28EC465C925FAB603ED118793CE8CFD7BC96E5D981F65F1BD02AE01D9DCDD
+AC8FFAEF9E993F9E306B44A79D66267416F4DDBD1B2CA6504B66434CE257655CBF676FE0D19C
+31153AA11C0B508DE54F8B3159FA4659D9D4D6B308E62274CC6EE4DB26B3C94E6F1814D4948D
+D19AA94B3CC9BBD5C11EF818A5442A994516772C2199502463DB820841DA14A13726F44CE0CC
+CC34C3268DF23C15E041B51C65AD9759F7AB455B3952BB6005A3094E39F6A6F0317AE3173914
+403E7832CC8A9AF57F226747BF2B422EBAC475558E607256C01499FAA87F269C63F1B68744CE
+A5EA132F84E4159C0A2C3623E8468B40FBB1B3AF9937F2E57CD45E62CA0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMBX10
+%!PS-AdobeFont-1.1: CMBX10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:06
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-301 -250 1164 946}readonly def
+/UniqueID 5000768 def
+currentdict end
+currentfile eexec
+
+8053514D28EC28DA1630165FAB262882D3FCA78881823C5537FE6C3DDA8EE5B897E17CB027F5
+C73FDBB56B0A7C25FC3512B55FE8F3ACFBFFCC7F4A382D8299CC8FD37D3CEA49DABDCA92847A
+F0560B404EF71134B0F3D99934FC9D0B4E602011B9CFB856C23F958F3C5A2FBE0EF8587D1F57
+74879C324E51FCB22888B74F241550D7401EB990D4F3A7AF635198422283CAC1B6CD446DDBCB
+D915DB9BFF88844E784C6BF7389803D9450B0C21756A017306462C563D51ECE66FCC9C831843
+ECAE1FEFC1A232E2724F7BAEE428AE03AADB95C3035345C15E9922FE49E1F2CFC98023731657
+2DBC57064EDAC9B0DB8913A5E2D45E97E19A91435CCF8ADFC835B58548E74B291446D689C7F2
+F8C4325E8356E974AE30C3E2977477BAEAA33D141FB780F59351E84BFC88C87B3A4A1D25E168
+B9D134554F6A581378C7D2D6ECA8AC09045CC3A5E0ED86F147133F094029E3483BEBC81CFDE6
+9942CF645EA20D0A2B645140CCC2F9CB4A3D969F4B0A79CD3329B440DFCFF5285494406F3DD0
+8D804C86DF191E57232F6F1F83DF6430F214E03FA5412B1E13D83C60C52A698BC9A3815919A6
+4162AF7B83A9468FAE9507C6CB55EA80DF8C696DFBC3296C663902D77E89A181502627281181
+AC8624F65BE9DE5FB32F056CC7DD7CBC7366A91717B5892A34EF6B441871C6993DA3A81AFC9B
+F70FF3842A21A29C0E49DA1CCBA37DD6B9202702DB510B8B1109ACF4C27EE8D676BDBD16ABE1
+89F34A9B61532EB777457698CEE0561838EAAB2D3939C5093AFBB215BAC433D1918C739B6256
+6906BB2187F3378521FB52E70C18886E1AA15F53A1F8A169528CF2DDD54C203613FF88E619F2
+6C9C50C2C3B8B8C868A88AFAB1DC8472E7B6F3F992A161723A3C0904865A7C423281601EEE91
+F35222C4A71F343739F102EB43145A47E4FAC3BD666E4C114A905950618ECB1BDC29F90F6EBE
+D1D8325FE6B52E14A8870E9B4BB088E585C71B91493C12845A101937E3473AC5E9AE24F7C358
+F06D590D7618E1A1D5834D87621FE3F5432B655EEBD4CA61A7B00DDE0AA740796CE88A43D1C6
+952F8D2CA63D30B6DCBADBB0DADF13150A442714675DBE51FF838F2E47EBE8CD44F1EAC6AE5B
+6CEB0B07AF03F5D3896FF935A198AA635E337E367E1E128D15E31AFE3FFCA8245E41A3E17011
+340E49D52FA1E322B435B4F7F2F49AE01F6A319F68D3D786C24BE8101E1C975A8FEB5DD7E492
+2E00E3A08CACAE5A945E1E8F8A20F1FE9534153307AA5AC7424759743E08AF90B9BCCA744737
+5222A66E2EDD1BFD423B1BC50BA0E54468EF45C89036A20C01E4A5F27F9FE3E02CAB3033C6D8
+7574BAB265C69D05AF1D48B6ADA1CD04622B62B82D646CFEEEA510FFFE46B3992356B9A78216
+DCEDA3751E3F6670D9AE871731741105C99A03B430EF00E0B34F4FDCAE50D7C66F358215ED65
+D1E1DE5E9285EE08F55DDE7EF0CAA04C7FC0EC30277726F6B0B135C2FBC093F5F4BEDC1AFE29
+61140E5B3E1708B31012AB40FD1436E203966F257E3C2C9CC578BA77D6C058611DFBBE14F575
+5392341F741657650AC3CE225C0FDA74E7B6598A42F97CF91B31EE8AF5FD0DF3BFCF0741C5DE
+5C6B4925892C8843513E0BFD2878D56DCF869C4B51076B549395F9FCF7BF6B18A32661029C9F
+C7C92C68C2E4078FB7338D7AD7884DB5DDCD106D87950817C27C84053C87036FB34AC069FFBB
+7E4C43538CB4E8CFB78E81DAE63839133741F7A2ED397B6B000A78F46D0862F01530AD954897
+5018588605A828C2C9339C7F2D5A33C208286C39954AF21014D5AC7C0C684DEA99C3F7F2B7B0
+51EEB6D83BCC83DAFFFD237CDA5188EAFE574E987097F433FF8D80812A0E86BFCF25AB3CAC49
+0D560E36AD9D248FA95286195919E4A6E2A5438539BB0DF1C249B8D3B41D993027ED32F22B48
+F010D46376FFADE9A584C6D29C1EBBF124BAD0481BF15E504D82BC1752CE4B5A6697D923DAC9
+6D1A35FF2E7B3D23ABB6DBDE1E376D824794597C8BA000F1AECA64B7A90BC4FA26B7742D493C
+BB064356750EA2D452C6D9E8D1E09C32470404853E833D21F6E408485309E5155D7824A352F5
+3C409C626D60422D1456EE0BD69DF3E7707FA34F668AF751EAFFBE26DAA96BFA4AC3EE85C4E9
+6B9BB1A63D85C13AF52E30A6CABC7C6A14598F7482944ACD81655AE028A977EAE1695ACE5FF1
+044D8B6F6AC8541D09C5011191AAA4B2CD1BF769071963895A7CA3853200B06C12A26B1239EF
+AF9273CF25D92DD183B1638B19B97F816CE6DE933DF968DBD6F3154883E12820D67FE36F5594
+AF153A40909E851230E5A3D13132FC762E413FCB9B617D7B200D5D7C3D570878144B83F0C15C
+41F26CA902E1513688EEAB09FA68F6BFB23856F54C975ACD1070A024D69B78DFA2C334ED030F
+835605AF62BBD5A0EC7681DCE19CE3F522FD25E287E66458D80D3ABCC6A225013F5D4BB24A9B
+F2A41C161D6CD2325947E2AF043B1CC260F0FF918EA39B44165A3776CC196E1E99EB0197FBB2
+324B823B53FEB9433AF2712D4B15B8F0FAB43B81CB4E4B3A563476106DC42299A49493CF9FCE
+72C0614C2512DDD4904F65966FBEE892E1952337113EA1C3F804EA3B495898D24DE279B88302
+F73BC41B463760EE57E29A166BCF39795C41F6EB8A980AEE8BE639D83B5E48A6B1A6097613E9
+0459BF8FB2E0BC3EDBEBAB9E4B695E681E5425E4B3B4C5E0A1293335C2B99FB4EF67D3A382AD
+596D04473907C943C50BBE746D5323300161C2C2B9F214D9FE500F47BD67CCFE0AD436F6FEDA
+C7ABEE72CE19FB3E36A60D7058A9F07F32D9CDA735B701534A6CBFBF0530C8A700D563DBD80E
+3E83B158A26FBA55E7D5579424622A0812D65A47E034391BFF8076FA883B298152B2EDBC0DD3
+81A2D5DC9C8823450985C12F2BA652D43FE97540DFAC2CD6135D63DB186BE8BC3C6044F41E0A
+547E793F2B6078FDF6251EB6D0B24A028B86B076B4F2F2F7902FF23ADD26AB554031ED8C218C
+5845488D0B3F513B65F612D592D032A363085A0C2ABA646CDB3B14D210801BF6818268796AA1
+190B0020BAF167CF7E2C9D36C885F5043173E3CDA4FD1DC7B074E4E1C19C2B66505784000154
+5C4F3F2612B1AC0ECF36C36A3A5D4BC770EC400E4C15BF9C4A33E5827C68D3730D21AE027204
+35715C20F8A2C7CDA81BA9A0F4CCA46CCEB863F25DEED8E6D2BA388AFBD318E8C9749A865865
+916908FF32AB9F4CCEC1D76265ACA5771BBCCB5300D6239480B084329424863686ACB41D1D50
+0A8E7CB4B23D2BC3ECBC207263BF368B56CEB028885AAE6EE481C72BA888F1CD551F7F816990
+6095786DEE21DFBE8E7419EE669120D6755A3BFED41AEF2DDAE8987FC2D58871366B6924F1F9
+7C3FF891479BDC6CD2FDDABA1C1E9C1A853D7F614F92E345FCA07C416EFB5BC41EBC6ABB46F6
+27A0E698000C22C61FA3DE3F553BB40F196CFFFB23038A0A249F0F5282928DF37BEC7DCF119F
+CA3AD365D8107B8E16077A6C05555B1C1D3464475B2A6B5B90E07AF01456F844F0277D79B4BB
+761440DE1ABDBBC657D8AD8ED65482BB6318B2C8D497A8F2F1003AE917DE89791FD981B06129
+7DE56CDFC8F2856C3EAD7F18BF5FEBC97FBDF160BBF655AE607E3302378ED650E313F88193E8
+9198E74401F174095ADE71C5EAB428B05A125DBD8E1863CE664663828463CC6254B427399462
+CC9554438BE1F01834A6082464F6E2B0D1EB21D9B81DE86BEED957B95861DC2927E09B417B73
+04172488CA2E48A8E15CE6297FD77CF17EA45BFB3AC59E85FB850669D4C803FF4044C017BEC5
+9C4D73E27E06763C0562CB497976DA3D6A69255A34C8CBB558F409AF62C203355BA65113240E
+29805248AB08646B34E7652C718879DBACD3655A937917437213A069D781395B5076A78291E2
+CFAA0FDB7E7F158DE83519B682B5D6A2B9F9439F3FFBC6C35FB9F42F766A2C1ECA15DAA30332
+D47F199BE8A0C664205143C6CED4836046FD5398CC0C68DF3DBB3FB9D7B482D774B4FB9E593D
+687C12BB650375D5558E982CE44291236A7CD87B0C6854A236869F577798D578003FD06E9A79
+F2CB53989844D12DDBA1CEF6868B8D8439C52696AE0E74036945FE0B5590A11BA981F6465216
+7EAF4F58012211157B32EAFD2F5E05FC0599F2E977ACE34C542BD9AEB999E816DEB7EDA590B3
+1E2F3D3BEDECC1B1E789EE2402C671FE4C58BE864FBF69E3EF46E72CD26EF5EE80EB1613FBB3
+95A0424DC76F987C8ABDB7FCB2B3F12C995ABBB3DC3AE80CC45972C131758403C1E155207764
+323191CF639B4A1363CE7E8EE8D57CCD456D09A2E098547900CE2C4C895645E8DC9924E0BE39
+FCB0CDD529A10476795606AF53554FCD648FE11272D65B8A2F06F22800D8144B1257DEC7F608
+2A92C31715FDCED6F49A46DD43BC9E9F22071583B73495246BB5D53A3C215F697B06D2229593
+A61C7681F62441DB6FAF7CA8A5802CDAA07BB7E08BFA399DF9EC999B393D3EA763141F03A52C
+C68B7E73E5E55CBAAE987996B3B103B22CEA395A72A4A0C3786BE0D9EAA6E9989A046FF2C054
+CFE190A2DD725573098F03CAE1DC313C23AC32CB4C4525268DF933DFACD84EF1EDBC49D906DD
+889FA6AFAAB6A911C6558EEDEC7033090847F8A39EC95CA0EF14D00050702826A5BD3933F53E
+B67B1B58562F699E34B18706F9106244FA607F927C88EB1B13357EA0F86A79CE2B9F8B7A746A
+80FAC4519B80E1A578CAA6153AAF2544005624ADDAA6411CA13A5F122074DDCB3B70EDCE572F
+C954BC31895F6A2030B045BEB62309316A1F275EFDADA8AACCA45A801B297402D1291662AA13
+BF026D4AF98B7A10CB68E2365AE5F8F13404556B35B52CDF620EF9541477FB751AE576D57ED4
+7839A24632AA7860B79FEFD8D2DBB2A2CE4329D26B05031B4F2B2FE02716F88DCC4139A0CA85
+7EDF9069551C11EB93F130EB5AB848AB29DAA7CB923FE9F0FF7E968AC0398CF25B5699B4B9AF
+A5999EE401FDEC2777720A3260B3E42D791924AE24B956260708DE1D4B73256607A7C984D7BD
+E6A8605938DD39C10986461C7898D49738A7BEF4067D875B812222FE1BFB03F51500C2CF25FC
+C37A329AAD222DD8A17131E41319349FC6ED0484E9E90454C44953177701BB196E6F6653AD80
+6368AF81B55EF703524B29F04408717AA728E8951915D5EA463792C90F234476B5A03FCF7C50
+3E0CBF6F1800025BD8B1DEBC3018D7F538DBFD7383079E871144EE948043AC515702656FAD16
+47A75BE7DDF71686CD3B5E85E3BE3478C36A573574569B188AD706991BC5DD5BFB793122908A
+C8330AB26CED8FC7237B65DB25337CE1B48CF6153F0C395B69C8FFE03A345DA1776733E3199A
+8A298EDB47F26D3172609797C2FA3DF6F04FDE5D3EB76D614ED643E711C8CAF9DD53379AA06D
+9DCB806131034C012550AEC09F631321089E197785613E89843E721E09C4EBBFD74A526F0D43
+88F4AC3F9FA173FDADA8A32AB2819C52AFE3ACF2F5A2FB2FC603C0E132BF25C89ED1764DBA35
+0BB967BE2C894B03A489494E6816E070A1B47F8CC10A0D6E70CA4E031F4787EAE53F03F5114F
+FAF187DD4C99A95E4F6B0F08EA8120370F808F01B3F97D5C7EF5B4E5B128822B239450CB696B
+FFBE7CB32150414F3C07EF544D0A5CF9FF1C53B3597401128092A85EEEBB73A61791574A82AD
+BF7F39F62FE338728E93495EDC175F6F420621D349ED8EA89E392F103326D14B2A806974C44E
+746D49DD55C116770D39B6893A46AD1E45536A569B4AD26C257063871EC0AB1523A066CF6C41
+062C07638313DC0599DC310135C54DA1F219F0CBDD1BF51B2933A0BD86737FBC73483A4839EE
+9745D415C9EB74AEE98F286F1B78C040029FA90903C77D5BBA4F4209592540435058AAA4C858
+B12BDBEE45EDC450C0467FC4317B0179249928E6E9CBA3CDE04E879E58E3EA5E4477119F5F09
+0904FD03AA9C38E2052743AD08C7FBD425CEBC75E51172EC5BE5522184652AC33489ECE26F50
+895BC5A722FFBEBA4A96545D1F966F7FD631E31F87E5636734340F24328E91082C3E46F9DCBF
+6954A79B32FBA17D76F0966D4001B7489F56D2A53150BB4716256DF0339BEDEB87D8713DF30C
+6E80C58C26A50A0D6B4DCE19B751E26C657304C4FDDB3A3C211E7FC018F2786777A9689F06F4
+40C9A792DF10E99659B4DDE53112B6EAF61D5D0D3F45EFF8FD85BAAE0A91F3AF5BEA56F1843C
+E421728D9E2AB652DD368FA8D4016F274682A68AFF9374F5153427B84467F86A3BC119CF08D6
+CC9F07260C6D74E13EE65105D569E254FF111614D3397C17B5553BEF40162ABE6A12CD9BBA1E
+BA1E91741CD45EF6EFC936591234104F32A4C01321D6B9B00FAB182B0757C3EF620F053F601B
+B5BDBB6185EE43AA87B62154CC626AC1E2D2B3A3488998390552414F3BC9F6E20F04BECC772C
+3120F8E28BEB0D387F206DD97BB022CD98230F881A1748BEEE4CDD98B0F2D34698B7BF0A9526
+A4D5A5F4F115854CCFC26113C22FA42765D8368AEA3DB68E678ABE69AA0F7C44A79E7BEF1798
+1B2B59A16499FB12E3B855E305A1519B136D8CA77952A1FE7FF2FCD7BB6CC3C85B6B190624F4
+67932705BCA16CA9B952053C342C16F486A92A3D4565D0E23F774101B4356B7EC3C8E04E7759
+76E0F170B15D1B9CCB5DA4D10739521D5A70F0A0372A0BCE4DCF132D3BB2FBE6136669820AC5
+B64C4F6576013984E66C7AC0A2A0D24B28CAB66E2C20140ED33E93ADE2DD45F980D11B90BD00
+C7EA035522A950088AAC6B9DDFA9CBB0CEDF9659C43391FFA9BE6C7B48AD6F116034111165E2
+C02878FC3C05B77ED79254F173758027786AD52C1C7C26057D14B7BDEE181F86E225DF1FDC86
+6A149A636815554B0F6B26B361ED8E6A552927C51C9B3D09A7842802EF6EEBCDF2E8EC8C8785
+9BF0C1859E8933A98C6473CFC5701F20C9E43914B99E0296C8CD9FE6C77B5830C99A375C6079
+0D32F7D4340371E4C5994AD72BB066AE1A1EB5F1B7589DE0C1E1EEDC6CD6F6EBAD8EF404ADCC
+49BDA52167E467AA791E9D528B68D12834AE3F204E33133044E73A82B343452423AC08D1A778
+FAA61EB7458535EAAAECD748B9B09C002C2532923EA94D881419A449F1610BF5FABE09B95AB5
+2663B1F58177AB704AAB78981BDD5871FA6AB86A76C37B0C9C0F7D10E397FC11120C39C73E8A
+46A3C66DDAD76858005EBB362FF814A714F720DAFE3BC30D246D161DDE5C811F1849C0EFC420
+C893ED3AFC22C24DE5CBCFD2F684C5DBC08EAEBDC818040D0C73D07FFE7B7BB37C234D33C45D
+F7DA592E3221AA59A8866572712FF6FA159A4CBC2F57A529D10FA2985F1DE0E96C6E6AE6C50A
+65ADDAF7AEB61B5F90DD9C2C0BC3B8A80E564ACC2F5845D3289DE062F7F61841378BC3063428
+68094FB009BD0A6E84018A995BFEA1CB6FEEA0DC8DE1F155FD285BD6D8A2C109E9BA9B0E993C
+D1201D6E6F32EF0C8E1E5F15A432F12DA6173EAEB47C3F6C81F7245EA71EDB648DC33F226EDE
+22E9F010CA5D1C5D99CA9E8E598035F25AF7687E1C6C15ED413ED347A44C819047E03271987D
+5FCCD1285CFB372E9A0FB7C8AA8AD9DD7B7CF566F0B50B3C15397F5E6D6FB0A7B0C316A5B284
+36291DE34D048AF1F4922B9EC5A49EADFF5E376DA933249D74AC46EAA06288F7FC1259C34770
+C9BCD3DF9072D225F48C930506E1298290BBBA2B39080A279EBCFC620D5F1C02447AA621596F
+04812FA83515F77F9DC9D4FC9A3A267CF90C7AFFCBAD0B54C94E4AF5F4D9139D70F872D3E7B6
+4B27FDA001E47C5BC3BAF47757DB139FEF866C23C6CFDED18501E76B809154F1C92700593F12
+8B0EE6519470931F3E8AF3A449473554AEA05D16CC830182600D67A20D23E52B5D9E4186C36D
+332308BE2DB76E5080E36A865B82EEA742656108085AE9A286089E0385874D281EEFDA463CB5
+5BB90A32EF2593AA57105775EC1710D0C952D5E7D4F2C7614D08EAC4D83CE8556956C9673689
+D234F1AF7C82A9D1C26650BFB145C4B9AEC7A58F0E81C5C4939C7F8C41DFE40F779C7D568E47
+B8272BF6F49E06BC8687AD674C1B5502E5F5C50369D7B88ED26D32E63CCE80D70645376393BD
+AE94AF977CDC892AC7484E7C178C1AC4A59BC422D78ED67B51DFBFF557635E881E472C6F91FA
+97B12D3D4511DCBCB209B6F0E25D0D91D67CD46FAE61BE3CAECADF732A5E2880EC6F31BC84F2
+C56E967037E2894822030544F4F54C7AFE396470F3CBB910D65CF5502346452481F763EEF510
+E72FAF2F1D1D34F960DCE88E34ECCCB04B99059B5534A1B92E7AE5A916DDD2AF50B81D3B13C0
+88F8BE7DD9490CF7FCB1360BD7BEB6C5F859F8A623F5984629DD184CE938A000F11FBE4767EC
+E8BFCBEEB6964A5F724D352203FF7CF813D4FC5241671872EE041CE5C3A30EE3A2512DB2946D
+312321BEDD6DE3995C4820F398332EBB11ABCB5785710B1DA5EB5562F4625CCA0EE4CF6BD4C5
+1C6B06788CB0812363F82D65127A450F2B372F24A829924705F4FC02594DFCE200A048C56BDE
+7CCD4F9EF589ADA6FE4F3A52E3D49CD234728944B1DA1C8274D18224AD447AB275DDECBCEBCE
+EC5A7234FCF9760220FB9EFA5AB2C119DEF2ED5B7C9B65965D00802725220319F5A2D0025372
+3F59240794FD8078C2217D21332F01C01247401286428DDE2463560A8570FB1CC682BCF69A3C
+C3012E077F053229D99EA007F228F8C65CF5B929CD31210A721F0889119E7ADD9C8008596A29
+44DE6E1F8BAA6355FD520BD7CA93F4F1AF2DDF694449F11178F8A41F005227722B4E0C66E478
+636F8B598E3661BE353DF34FE80E729E97BB4F98CB536269745CF2B976F42530BEB3C625B18F
+735E47AF5E5D1C9D5D11EFBDC18FDDA93A87DA7187DF1684253104BC4D07E228DD34AC6E4DE0
+FFDC669AEF57FCA5547A747F6FE45A91FC0425F22FCCEF3DDD2239A4933F1A1F7ABE9757BBBE
+A775258EDC458AA6F22D16EA82B4F1AC077EA07EBC3786BED89906A39BA8BCCC68A05E653915
+6BB7764378489B129B8D3492B340EC9FA698B4E75A3B7C7E0AB703A841CF7E0AAB0BBF27CED8
+EC0EC35DA485096E63E6EAF9C0B849AB401DF3E1D241B42EFFBFCA447808F9AB3CDAC78BDFB5
+E125109B09845B874D91CF1A42F8581B93CACC97013AD2D752D808FEDA6D640BB3B2175B16C7
+2683EAF4659913A4A01AFB25A413ED275255B0725B0AAEB8E14A69171967217D54D3D869B67D
+EAC3B13C303C5DF2135E1D1C7D4FC2F480FC9B2D05D48F5B4C75390D35448336F1BD30A154AB
+DCE824FAA21114FAD251D92444963080C9722C8495ECE06E489BE3B34563FB38ADC99FE1725F
+3D7AD19CA395BA8A9B7856D50A89B618405F93943686313593505896A57F39F034FBC4262A15
+29977264184680015D3E4D1A27D268480C0930335C397D44C8A67BDDDC7D65FF5F03CBE31D98
+EA973545FED133A201E8EED0B40892CB4957E85C183CC7F8C931DC2682A19A6FEB8E86C21E0D
+8F8AA289FFA8FC36CB9F4DC7A8A9F8912EA64100C5299069F92EB6E7C582797E25B0FC19DC56
+B80643B1DDF069566B15F32FA531942AAAD455561E47608759F44A5749653DF4A8CC400F237F
+BD643CE3268A4736C29BCB21EF4041BDE6F904259F778CC239325CDF33AAD88F3DC3009C068D
+D90B138CE79CB1CCA55BC77EB5FB21C7E91C7496BAE44842DDA118F6215936D75093FA90908D
+AAE77896C7FE98C9F0FD076E1DAE6639CD9C33BD5CE268D7820FB1538A4AEAACEBB10BDF4DB5
+888765346A9E06B0F4575CEF91F80BD4813B8DAF9E99F5F1A1701C570EB8A4E71BCDF665E00A
+2FEFCFE2E7FECAC58AEE58714C33C4DABA68854A32883EA09AC44F071DB8B4AE33038B39C454
+24128A4A4DC9D859A86194BAC21343BCEE3D778BF27ED4ACE63BB084A7C59596FF8FA0266E7C
+CA0EAAB7B3D470B1840B2045D1E281AA7C2E99A6E11613FAF90CABBAECE181396EFBE3E51633
+1D924CAF659DCA59E29FFAE3CA315354BFEC4D4792E42EAF5421E706FBC2CFF8B907535CE2D0
+2394C0D833820FC53BA119779BA3A6A6C8034663CBD834984D0C924B3A091D7295B66195569B
+8C15F3B130070F09F09810D3CF5B43BF44BF223DF1938D71B195A11C06482866135C3569B6B5
+BC266A9451D954A6070F801B08CEF42D1127C31493284DA3CB97FDB1EAB49C6690629E149233
+7C39D6F9923F0FF73884F92752B78EFA83092F6258EC9A151E0A9BFC89BD73C24B355EC1F0CE
+869F74CFFC6202BBF7C030B800E6F239D0B1B90B07940405E5F8A6AA5E5DB212F57B6CA4231D
+C4F9CAA94B0D192029CA9FCE819D1EDDAAECEA6CD4D59A821B427984109E70AAB92516DCBEA7
+92BDFEFF19636FE2D3577EB12F8DD563F5389AE01B262911423D2050A7D9D5A5EED07D76F2E8
+5CB378CB68E9E253CBD90B18B323AAB1504E48ECF08C30C5599FF5F6F92EF3803456360177F2
+13A63C6FBC0212DA83EF004C3EC1F3FD5F53DA63D0ACF8E9BACF2806A02E4428A06CD8ED7553
+86ED6ABB9A04539854E6739ED1EB7BA4870C468A5706F0D9D68AC0FF9013BFDB8073B59B0C0B
+8A608D898DF56513E0821C498DA9113D781482E620C02A08DDEC5016CB24006D6A00363C8F8E
+715E2E0C104E5F265D81BE1DA960843514AAA7F58B27C3D4424E805E5FCBD1C17D65CAB336D6
+D7670A13C7A118BB1ECD2AF24C298CFDC687C73BB18B9989370EE7305F7EEFF2165239688BDA
+FF0BBA533108467EEEF149B1ADD333C0AC843DD3915D26DBD787F458EDE234A261F6FCF357A2
+5FC44D3A288B4D06D8F6F4EBE51592237F8146EEC01117C8F4EB8D760A95996652D0A60E3D20
+40A7B99EDD6EEC26A84C11840F303E76E4084D50B9E38A25DEFF02785FC4B61F719F169A1FCE
+7424A88E7B3E566F39E093B8C05A321381F878ED50029A0E63E1D56861EFC6F396BF34291E3A
+8C089F1FA959652F5F13455D7496C10EF5818F9C4084B620E02257B3AD633A0CD41D4582761F
+53B8A41527E7EC079940044B83621C1254C7C3ACC34C4AAE94F7915A0D557C343EC6336FB597
+0CA6DC544B05E3DA70E9A2EF331C2DAC45AF3769EE36674454E518910D9689957B00F0D5DCB3
+21266C57C746C4B1F811304B94452B293C647381A5FCC35AE4FDA54C19F6EA4EF519F4C51B4B
+7D80935B28F0E43644A4A895DFF01755A05AD5060D3422C02ED1A726852ECFFBA8E6BC9255A6
+E337579A9833E24E528619A43BA3A3C989C2B4FC947B828A17016A5F0FCC0ABA9FA0673DF4B3
+6A710DC70F76CFFAB02E74C030E2940799DA7E6D80782E315B6C27D1E8F0D489825233322365
+3253DF7D67494DF8DB38B6781BD328CE7921282016FE194323C945A31D4DC2415F7ACB5C30C6
+940A3659B16333244FAB724EBFBAFC220C93A7157331991061147E4BF8D703B07E6194A025E3
+7A9E9345E20213FE7B1A48817AD956BABB7DB16556A8B95DD5A0D2149DD509FEC374E3C5CA5F
+DB81B3B20A172F786A299DE88F697A2B759BF69D2A166343F7FF832770E88B9783B70769FB1B
+0478EE61106937AA7792CEC1246A68362422F45DD5CF8A672BABDF9DC9DC70409035F794C28A
+64D521C378D09BD993AAD577A8D5A1E961AC7C1EF607B65375B99EF9D8083E8808B60DD84139
+BD592603C2CDB11EA68AB94FE4D9F51AA7A187177C2E4A46A986410FACD394619F6EC054ECF0
+15C0DD09C2D8C250B9958AA5CA9093E06373579F0E3FAC4C917E44210AA7A44E81E340DCD639
+E6256AF24E4FE1D694B1D2A3A58FF1E1518EB6958C6875871D510EE20978999EE033B59C776B
+1FECFCF535E15D9C4F0DB8A9FFB6FC7BF82D95A5E2A700FE9220B2F819F1849008270BFE3F5F
+915607C1B93F39708BCA9FF93C1E26687DBBC9892923A473C892EA736557466D029DF0B73DAD
+E6A986AFFF7A65C7385C6144C490914AED78C397858273A3C8FD779F61216CDAA87685987C6F
+DC1C22D197EBFF3FEE02FA9C21AA129EA6E42E22F67A6795CA82050D9E3704089DC5C40C77A0
+3A364C28C47A2B0D691CCA017A427C5D8E9769C7DF0F425D60F1E448494CC9C11662425754B6
+6DEFAE0782021FA50BDF815500A42C0D6A45CE556AC81B7F457AFDE477FCA79E808AFD49CC59
+8009E4A485BD1E2D3CB4209CB9F5836B05AE66E8F7C2C49DB7BCFE8E468FA671BEB899E2E46A
+8D31308C803FC23A781C43FC2C41796F166DF0BD8F88E9E5BDDF5247662639814DB9805A5138
+57960FEC5539109720A8353871B402387D447D3F26A6A5A99DD6BFA96FE6BBAC3495F9DEB9AF
+C66AF6B05D1489C66011947DEA9C0D0A5FD66405CFB8D1CFEDCB9352786BD73F18E2894C2C19
+33969FF417ECD9D02F12AC21952C77F340BE276EB54C500514FE7463DBA3E3EA0657DC230439
+64C4E89F1FEABF6D9C09A78BB48725E2517D23BA280A4ECA8F73A6C9FA708FCB5DDAE8E6FEB7
+F8DD6297000B075D286897661C663C30EDA59E509163D7E0BC5A2B6B42FF8DDDF99447AB7301
+C34EDC163B40600DD77CA89F0407E612F7E3732D03F07E934799FE9264B75D8241CED4D6C38F
+1911C947CDBFD8D28595388772B40CE6FFED372D303400BD97180A441A6E954A3DEB5954277B
+EF61A43B9977223FCCDA550CD933A14EB5F7AA990E6FE448D8BD66ABF2AE9912CF3384B2EA21
+DE17189B7F01EB5245293CB204FDC23920F35B01BF9332F540A084772AC575C4DAB3C7B7BFAA
+EF9D968ED528B2979DC38165778AA944E616351277883766071F85C034D455DA59D805072687
+620E642E0EF13E64A07412D565CCAA4F7FF0ACABA76D0B72D61392C6F3736C1D9CE7A97928D3
+C82EDC220122AC2253DCE1B5C8562940B67AC1FF8AF9BD512EB4C1BCE29411C49CC8F0E114A0
+8B6476C2DB8A9C9A1017D2A34A82190781BF529D3E8104F822AF6E0BBC1E40FA24E5C40B29AC
+0DD3989B578900EFBA37287E2C0BA836473E3A36D75FFF22B591B4ACE4EA103915354D7BEAD7
+B2EA2566522732CEE4F5F9B94251574B9541941F6DE967106463F5C2E1C487EE2DF469D4FBDA
+1623EBE7538E98D83F5D4961C04F76FFBE5B59D517734EE7B15920535C35BACC3B36B3FD4DFB
+BAF818577642E65AF945FE83249E98DFBD00E5EFC6C2D36A7A3FA7F6F5F02ADDB3849080E7C0
+DE46CB6592B365B4146B87375FFE9F78C7CF5FAAAAA151BCE52A7C13C4F30B4FB61A1A10C7B1
+6123C04C4BA919CF87ACF7B502D3E5017A1F308076DB169F06D7B38D1234EA9A606932C53074
+2DC8AD05238E9465751AFC86A1FB53567869882EA87FD25557F70388649E473B0D0DEBA07A1A
+3DAD13609F3263A0015DB798D936EB4CB06B5A7EC813B34EC1010C82F6016F22AEB726C41E19
+7342587172BD6DCA5C5DCC7B4674F22C8E84785171F21DC0975884AAE2F57AF56F873BAAB5CE
+3718E8B9BD266888AC98174D9375B656C1B714901F6FE62FA178C1A0666E11768A3B2BE6C2E6
+DC754C5CFFEEEE307DBDB8FE3F150349F5854EBDEE76D6693F8B1813636B17E3DC91CFB16F4B
+CB09CC4DC28AF7ECA5A9726F349644A7D497556CFB9563B680DC05D421EBAE74D9908C477D96
+98FB399DC9DC9FB907A0545E473264BB9EAF37616BD819F3F649C47A861F0D1E89F88F55103F
+C76AB03B53305A46572090BF4A53B7A761EEEE92E82A5CBE121C3800CED761BF8A901C189410
+E1EB33C80A05E7BA9B005244806801586807D36ECE85DD75313671855C1538946BBBC73278C1
+4ED167D3845B1D0F541784F67221D6C2D909FAE65E5ED9420136A868220C0A9BD7854D1E4A08
+5FA48242BCAFDFAEB87CF1A3B26182B1E85164A2872B821716E13DDA1A01D35A22675CC50EF2
+74D808168E20908C205218E7A599E99A529A64FBE639882B58C53EC1D42868A9BE2070A61AE3
+B61F26AB2FFE338BADECECABBF102993A9AD8D6337525ED86D0DACDF87A9805E41E9BDE1D792
+FFD82924083C77E01CE1FE9B69091C061A0C6A2CAEAF8064A43886783720926C443A4E07DFD1
+A1E882865B1BB86365041BF243D804265249C1B1861EA1E1F3CE82AD74397E74B16106637411
+288C6E30FBC6E64631A6E70BD6B92001CFCF748D3BA622967EBADB9DBF47786889BB8D3541F8
+0E01D34C90CDA0B13FDAC158E5C83ED99214CC6D17CA508D976E54E3503294A3516E914BF1A6
+724AD4B70800405EE0288EE0328996EBCC12EABEAA798F43E149B60805A750C6041C4D27A1B1
+DF98DD574C66E50E34C8DA847CB4107FE1BB03EBDF09ECCDE36647D5C1649F4C29DF2AA045DA
+AD1F332F1723789F448D38EFBDA596EDC311BE29140E5A0E6C091EB9BADC60270A8A73A6AB19
+D2A977ED2540048D54621A30CFED83ABCF91CCD79798D2C37BD3072990F3C43804BBA396CD67
+0DA9639C42984D71C384F0AC4028EDEE99CFDFF2E7464777702F3B537E7BC3D41C62BFD0DF21
+0037E2B9A62C76CEB580E701AEF67460D7CCC47816AFEFA16C3E4E76FBBAE2B7EC5E988114D1
+662FA9B062B088FD7ADECA2DBDCB936F2AEFB700D77D2A4D34EDB4CC77CB16E33EEFFAA3890A
+03C6FAF804228C8AFEEF2E9B37545721C6A1734045FC6E7FAFD00FDF067D120947ECD6E1B21F
+8A9315EEF67CF571FCA4F8A903DF5B687C3799E9879CAFF6853620926C4425A9864928F24AC0
+B1E7B45D0564EC604CA2D66D0A2DE4EEF91DECA525540687CB6E4DE5D3A24940ABF44453EFC5
+939DA3F98BB1599841CE898362317B2BFEADD8074DA7AAED6DB9DC23F3641E641EF0002E9BC0
+0C0189F92E4E03FE111C247A72AF9D00E29B0E3B436875B9C1C634EBDE25FFE984D0CAAE1848
+267FDBB1BE3D987CA4CFEA317605867772E3D6711A8842AF1E22326124396382226CB23D806B
+552A872D363A90D2F230D55AD1C6365B96173D3881FE0DE7C2DF58E09BD342C89C617E9CCB96
+320185EF090CC066D3A1DDB4395756563E45EAEE467BC4B63C817953722170EC74B60F1B9C15
+82C0349F8E4EF2A3150B9FE79E7AD89A47E3ED3572B182160D3DAB2FDA2EC29FE503FB7E2DBC
+62739DD15D960AC0DE0230DD35694D9B88FA6E63457D13658511FD56E0CD07C1F24D65ACE7E0
+615D08034C63841A39FCF3D082BDDE36D8708B72882EBFCD717AF77A6CF6728542BCB45E798B
+9138A4FCFD12BBA1F5C7F1F047A9C7CFF5A95AF940E0EAB983C3DF6AACAA46381EE8646F7194
+A2A259AD432E3A0E919B8418BB5876A4FB691C37F8004839D4E7341487C044058FB405EC3186
+F11E9B549B3DD31F038CB2FF939D672DCE89766CBDAAB5C646BBE233451BEFF7D001EC7AEC3C
+ECB7DD70762DB7AF34185C68C71B5F542394250DC2ACCDB1AB4328CDC12BCAB0040528FB3576
+FEF68A06E7A014841287CB53B2517F317F7B732E4AB7D0F044490432891A997F17AB8740AB53
+4016C31C86D51DB191FFD039A3D771C021904B177C9FA05DB97D82566D4AE3F7E64E8DBE17B6
+7E870CFB4CC7460CFEDFE882CA35B4FFE677B2EBB5E73AD6D7BD6A6E754AEB59BDD902ECAD0C
+EC5BE34C41E3C00933665956248BC62872A6971EDDC749B93CBC67EF07A2E0C6B6DD8A76B146
+70EBC0FF7EE6C128FF0F76C12E2045F2FC76BC1B6C47AFA64956FE3224E71548736F80D8661F
+2E4366CAA5BF6C0A6BF1E3E92EA09C0631DA84DC78CD1FAAF2F72ABAC18E49F057A3B6760708
+DA2C8E177B5C3E319CB0B2891374E5298FAE3850E3BB771A905B1138C96BCF3BF89466C0B517
+E33FF1CA0F1E29E073F480BDD4EE2CF51B61D4D3B47D7D70CDC147AA55CB11467F9CECF6B7C9
+9284AA066EE541675F12835F69077EE4A9A5430DF3903BF79BE3CE42FC704060B784A2E79739
+FA6B906085BFDB3376B5B48791DA15FF3C978BDE4FA89BA7080F42EF2343F96A8B038BC4E15D
+86FA4EDB92A312B360B7DE1525343A9755737C3324FED834403B90E544B9AFFB4D42B9B6461F
+A2579EBFF3FA963D5E4A6311E491DDEF70A1DC6043C78B6D821C29992206EC445996BC37CB18
+AE4C7E4E300675F4D659DA0AC8507DAD3C62EE60FFA8E30CF188F0E2157FDE17D535B48FA70F
+F26C6DEF09B0235486848DED6ABBFAEC0EADCA9B21365236565D0C2F128801F15C6DB3920587
+65BA5F48B03C7289F8A6CFE3EE5F37DC611F0B5DD0A8277E02155AAB230A8C69D45DE1794CD8
+91ACDA833D556381CCC9F45584FAB2CC176105A61971DF57D62609B0F700B99C67EEFC4318E0
+3B1088C443D0FB5D4F99F259DA316BA564F3987E7E2DACEF3C78E817224A3A4B1F603BB03B13
+A2F68D97A24F95E0389EDDC4A69E3B753F8AD91834AA713F7B088B51BBDFFFD3782C0A5A7CB1
+6565BDCD6A2C2EB5324E85CB1173F8E40D76ABDCC25EEC749F55F4F26C76A640CFDDCC9F6560
+2E8005B707EAB00B9CFB6BE3DD952D0976D061F0E5365A8AAF6AA9A0C9640463EA7819AA1E6C
+E62B20A95469F8A2937FBAA9589576161A66AA0C044FEC00356CDBE747B073B0201734D13AAE
+6894A0C6ECA119AC894EA2FE5D1F55605DF11A5921B2CBE50BB32090CB8D618D03203EF6F351
+37BD50099C9D100FD26465A3DB32726DCE8B6E4CED78DF6C4BD2071007136777106F94707640
+BF0059EB01BB566FEDEA11A8C4A9517308A382FEFE8A6849A4EFBA06A9DF3B6694CDFAD0B025
+7449228E52839C89357E5ED0E2AAEFB8E60351473167392FED505DAB8D7A24770007238E2A91
+36FD0494F962A1B62CF0F4A2353A1B2406D34980B73E213D82E168E43FF81D77FFDA5485780B
+45B9554365EE35E12CCAA6A1E0C8B362A44699CF98BF5245114625803CD685B92BE6ECA48232
+777EECFD52EA640A2B50880B8E4ADB233C3A3827C5F8BFA0C66AB03CA43692DBFEEC59238E2B
+FA21FB32290C196E6180EDCF9C908414C49D63465BEDEA5BB3185165E27B89C11C55A69D8303
+369B1841624825CE1924988467505F542BEBDC06C77789D35D3FDD47FF89B4D65F819281165F
+CAEDEE4C56CD0C278DE7C73A1E853A0CF5A9008C6CDD4926466FDCE4A5AF713FDA52BE17E042
+8E9A915C575CF54C29FF74FDBE87FFD4CC2321017973B3904E13562634F1B72DEE1009FC7510
+B8E56885DADB2032ECB5DB137D2A0041D7A8A987A02504554DFFC7F951A7C364EC6CEEEB38C1
+8FFD13A7062CAAD96A30233A4448B765491E096DEBDDFCD157D22F0B0F7C924DE71D1E69728C
+D04B50B8B26A8B170DBF8B1B57AF3976998D69EC1A78B361B14A215083C5EC25315AD051A1DE
+3723AE126AE5BBCBB38C791285E9BDC5EEF94F0B3CF661B11202C2A307E2D245C500F011D5BD
+80D4DFA8D58C34ECC51107A57237780A4108E00264AFE612160EC9E2944FACFAF167DD20E345
+58AE290CAE8F19C7236C420B5FB25D18448337E33A889E73A0B8EA8C33549D40BE031A26A25B
+B45A7EBA4270306D935E0207F6CBBD0F96FA802411E4F134AAFB3160ACF4FEA0DFA4896E5D62
+F98B657C35FF561A784FAF5D8730D78FEDD4F24CFFCD835CDB0F8F274D456E06555A79A08C2E
+3D08AD71D40BA4C20DE11F181F2339461DD5F400361BA1C00443F15FA3F8004887B8A6B556AB
+0D956D67C4EB9CEB699C0C96283592C0446B42488389BF62433D879E8762E4AE1F485B081E77
+689AEA3CDA1F72D4B7895E035F91D8F11D2732CE161A26A04B5D81363F88CD806767D3D4EB1A
+04E069FF3DD4D9A672B4F4E28A70260FEB93877170D8999BCCE9DAD726A95DBB3D3DF954D0AC
+BE1146ED1F5A918CF45914E3630D848008BA07136B0D141970B8E07544932CEA6920B29DBCDF
+1208D269026C198AE8C13E71239057307ECA4DB212567488A94D7A73DC140B3DEF366FD221CF
+AF43161D5C9E22A083E595A2798E3DD9CAC7C61C133E2557D3E4A578B28A54324CF15AA47913
+FCE3889E928A4872512CC4F8C0ACA907ACFD58BC3A434EE333842FD0A60FF093B6A7FF3D7054
+BD23A5309203FD074BFE8243A23130A76508707F22C88B8C17081146F08814C0FAFBC0828FE4
+9AF606CEF94CAB1F2B8AA12B666784B7674F36FAACD7F968A6A81F20FE7280072836BD17792D
+7B23365EF4D84CB6A73900E01279544CD91841BB97C59EB8A2F9BD01C812BACE5E3A61477C86
+1219AF12C0F2639FE0B03CC6A8F41476EBDE0F7AF9BCCBCF86E1073F838D773C45A46C4DE381
+51C0D3409474AB05D059AFF9BA785C6217D4CF21D73DD30BBF3420AEFDC139ACCC203319D24A
+6EFD97BBE16EB081944D2848AC628AA90E3A8FE5CD9C89D51F0268706AFF72C2C439C8375E18
+5C505AB6C23684D27AD8C4AE6C413089716601A0F1F2F51591C8BE75F227B1776E77CDE843AE
+D83342BCD35C381731A9C7D1D2E387C8D7353880E93BE465B8052439517C6C1E7DD15000B4F3
+BA67C08316F72397B046CE3D523DCE80F6FCFC02A8B6D439150B8DA87C4F1D24B78BAD952A4C
+9A09CEEE001BE15EE147A0AB6C44E7BBD59E22B0D20CA0B125B421A6202ACA856E1E2920FFBB
+DFAFFAEBE9ADCD375F97B353F93D74A5A9327BE770A42D97F679A535CE6A7A66F316147AA130
+02D47032FA008C1927D8D7A10FE426368223104F3C753C7D88D44C2DCFD8624FC491B99B88C9
+987AE6B08BAA53E738D31633A5A2A54709262A3886F4B458EC6D3232348DBDA4949CD410A6BB
+84C39FA8132DECC27078721F67C2707B2E587A7BBABFBBC0505E69E1223E29084171211324BD
+7DA0D4A86761F44122A43F9F66C99951E53788F4AF7A795E28EB4CFC3C3316B9F7BF2A839486
+21C6196F1E2722CC04FEE36DF7B07BA583F1D591399DC9F882712389CBA8841F8926D82C3AC9
+A36F6CB56347FC19DF4699856F12023C9660A878E221292CEB99B3031F9F7869C98B3AB24CCB
+C0CD8FD743C402AF81BE710CE4CB2B991DE6B143EF23C45364725813EB87581E01802C00A7D6
+ECB45774F8FE3D3A08774D471466770C1BE622D36C0B8DC605021710F987317131242349DDF0
+0A95C115E9478619AFAC4BE057E32509657EC365C0173B6DC1E105C2DC525248473634ED4840
+58F212F5578A34DAC00DF7E64B54D4764D1038037B54C7985A87766409C46B86493D95B3523D
+941F5F519476316E76D67178280EC4B681F99DB4E78CD5AD378FDD583FC8572FBC13F92436F4
+359B8642FBC0E00B65CA90337F0847DF0C11C207EAF0649299837421779ED163934418478C66
+77C907AF22ED452E73277BE8807D3BC592558B14387D948996AE6D046CF87D0A7A7A818FE8B2
+CDB03546608C63510F9B31EF328E432EA944BF5955B5B4C92AD77090EF3447FA2B827A4C67D3
+525372EB0852EE6A4058F7FCDA55E43BC0645EC27FF1E6CC155BB2A6CFA9DA5FACDEFB1EEA8C
+4CDFDBC0B60CB1D47A688CB461F9E50BD33440945CCA0FAAE780AFF70BCFC94DF6C3384BFBE0
+8128BE24F7E6DC20E654822A5849FB7F98E74AAE59FE69DBD34BDF8B1E2A6B999345B747BCAE
+805B26E67A7F25D3911734A7AC579741F50D1C4892BA04D4A8F45BCC71FF336DE86A31537D68
+769EB6B601F8B952DDE16E98115AD0711C9C916BE2D471E66462AD8E7E5D22E2710AEFB09545
+B4D0C293025E415DE7CD85AB44CE4F42FE6F962487F8B9D87DE92C9472D42262BA01121F4A98
+E27E7C676557B19462A007D714042668EDBB7DF37AF0D8DBD0C8AD10469E2E1CE929F1CBCE22
+7BAA8B1D95CCEE4B5AD50AE37E4C24DE7C85E7C207D1E8769CD403A1147F98A7461083D3C431
+C95C4F036D9A127B9B100F14D3EB385D31DDA2569D3E54C270E181408CBDF6AA9256AD191E71
+F3C349EC8B58C7DD2251B264FBBC67400CA0531D616285036123703941FDE54AC5066223312C
+CE4782D31E3F56354FD702E3A20F4C72CB426A6008A9AEE312988C6D434C7AB6C5F1A284224E
+5844DFBB3769247D0C49EE32BA91EEF41C40D21E14D02BA91E185C6685BBEA16B7B588F38DB1
+F9ECD4034A5757738148C13EE8F761E9FB0E779CC3DF2719273AB5645AF6D1EB7AF3B3158097
+02E0374B31FA7A32C0E14067482F07E7C306B717402F35FE25DF72BAB6290AB8102E3A0B048A
+FB61B507EEE44212CA4E7E14D6A41D184F801C91325B2C23F482EE1396882B3DE50B8B070389
+1F47B5E9D792A18CC047F26012F845138183016503649B704B026EF8CA5484D16934C11D8D74
+503228206F80C97C55BD8CCE9F9F061D505D69BEB8D48DAA8AB153A7FF59F82465051B4DB9AB
+597D22BDA07642F244C4F8841ACF028DFF164E783C759722A4EDB9E65236BC2F70A907E5DD1F
+FC351744B3BF62AD6B56B18F04BA3C412A85F9750E18C4825A37197EA321EE984BB404A80303
+5FAD21DB1306B2E5E7D18A5BB7FB71BE8ECF67D364D4E862AF4F093BDB23FE22F6BC08FF61AC
+096B03E05110E131903A1AB317AEB3135E9815D7B26AAE5F601A99F15EBD4DC71FE2F12D6273
+D162A35437B68C4FD60EF0E7EEC8C2797F4D9858DD736E3B218DEA394F8FC6FCEE2AB3B52999
+52887A10F27352DED38B5D80BDA89D211CA339B3D7A3E726896366A17BC228BFA019ADA69FD4
+1ED751C8165F6A434403DC1471000B97187BFF583921E7A2E2374E3DAA95FCB3FD02747BEC00
+D2D1F823741EAD5326726A01A282C31251D38716824E45C866887185348A73598214564F0233
+C2C52305179C1DF76AB4981F2490B46E9B370A2CA5620E2C81A86719303FEAED0E8BEF287930
+EEEAA1AB617E6D43CA52215895F39319863816F05E385CE030850FA110A830EEB7AC2520BCF9
+E6B011E6BF0EC99A80CE2B8FA2DB6D41DBF9A7BA7F77BA6600106071A3C9632DBA8CFE6645E8
+A4BBF5421BC60D4DC32D4E322D284178A6FEBA2547C00853958EDA4118B13AA30BC197C9A853
+352CF9C9127A3384AA8AF51C2BCC081692FC433E9ED1947630DA84B0680B5CE7E682D8949C11
+0048404D7D4AEFF2A502BEA576271FF0B7A8DB81F218600754BB02271DC8325448ED4B4AACCE
+A971DD113152ED440FD755D07B10883E5C3978CB4CE5C03A02C81E09792A88B5C6302D57E9AA
+591DEFF01D3D236AE0A0D667AC44FCA618A633E6C98800A9282AD145CFB1336FF644FEB54CF5
+8C489F87B2D90AD8A471C7E31FB593F8437E4E1DE1AC00FB0104DEEF2AFC85A8042100390C43
+2E985C4B92A0C6AFAEFA118AEB92EBC9B0B41CE9F6EA8AF731F1C3CDC9F43EBEFAD76975B99D
+96FA9A966C8508BE5733C2B8B1B8FB813826D7CDDF8A0820A9D87BE615C9B7E825C52AA928DF
+D6EE9FD636322B206E09D9E2BD86DC3ADF67837BEFD4583105E89AFEB031EC1BC79AAF8192E6
+107A44823A273EFB0765037AFA695B9F17990A174B8385504BE3CB3A939C69831FAEFE0A9A08
+7035C7BE487E49B4B8237F4CCA0F1FA9122925C67B63CED6F37F7214981A062C73A3A1CEECCA
+D61FB4724E6553DB6D38D05FE81123ECDA0ABC2098C60067B68AD205713113CBC88503630C79
+4694A0D451BBBAB45288C275A9AC6AEB5A7952AA058FE37533723A68D0EDF92FCF5ADD3C23F1
+EF1A71CCF675E6225CC5A9636E74EADC77072818382B4EC40FB8F7C3EC02FFC3E33059673F80
+21774D73DE129EACFC4B77151DD18011AA2648A46F43BC5B43B42AE627AD4ADADAC19D1C8177
+1936049A560B82BB84081431B886118FF0E8FFA492CC1271C0FC6E5B456A9A6125D596F52612
+30A1B5A34E4A5D1FB25695CD47F2B5B6DEF693FE78FFDF13A698E9EFF7BA007B50422274FDA6
+3103E10902723023C13923948627E1255EBA101BFAE476ADCA4784F63DFC27333F5524BC0B4C
+A853968F5DAC8BCFD7CE5D4BA3E782173933592DCBD9709318DE3D0DB3E73BD9EB64BCF4492E
+427D0C06D01475E2BC53FF2E663490762A099AD8D052504535B75AE84196E64A5A2A542A5DDC
+71D60B9117B94F4294C86C1CBA2F0D4851D3AFB90817B084F46867A4C3912DDA7EE4C33494E5
+253F10FA6DC470D7265EFF68F150B54C4E776167FD4266C700058AA0690A1F499CCB9DF2F0E2
+846FDDCA67AA26D4867CCE508E3663AD6C58DC8D3E4E1E8EF63D67AF8CB3A87C4FCFB5218FBF
+C6920E58DCB84BCDE3546764AB5A8E5869BC228FCD7BE4AC9D4C5B8BB4ABC66A1CB748750D38
+95D1D414E84FCD1AEDE5103D74B0BA53A767820626D07BB07E874B22B3E5227D40DD4502C692
+FC9AFB74F963FC6431166A9203D5730ECC2799DE2F343B5F67DD51E84B2DF96CE07B67B954F8
+F3D0E2379BBB222D9087B7CCA7EB18190D0C6E2C5FC5F7D9DCFD4128622B4AA10988E6F7CD9E
+B880385A37075A9289DA12E3D9D4FD979A76B08A0863F51743F4871B8D27D3BDBAEA75D32D1E
+C289CD6583E1DA5C73081614A4DBCD5319DD7C0D3511707250F41645FF3C1AB3CA982A302589
+950FC5AEC9DB66F6ABC91475B979012E7FE35CBF9898A379685F1C622B49DCD15341BBA17C9D
+9090F275D2F5898C4B481C1D554AD46BFF35C90C06D12E3F3EE239FE8BE864A71FAFB749C44C
+C92A0D3D6C2047A83F7D7E642483DCB45236262D059302573CFA2D63D9567633C003B2C2286B
+D474F85547B82E836FAA01DF3A9613B37CA635ECF9E76E572E699A65680BD61AA1CCAF72CAA5
+9165FA98FD8C8F26148348E498565635EA810602D00FA161E52E3A26F41CDB3860454D8BC824
+B833930E27746C2ABCD39819D9542689E92C2776DB02C9A32D78EA9E111B51636057784BBB60
+CCF9C9ABA40172E39EDBB8B781DE109811AE2AD021073790FB3222810848C4B02624589DC04B
+F852A6FA4686BD1E7745AA69C7B00361D87B3C5561AD8AB699ADC333968A2B921668F7801E77
+26D3E49609C7B3C6D960A9E6FB7167E7738989ABB5F3ACDBAC6E08468AAE4CD9B37C86863CA0
+DD26692AA90E8327F8CA74735C216E8C98B32A449389A2282F703B6406D5A5206AF4EC7776A1
+74B24E3A016AD41172DB7B5FE6BAD3B17AC30619A453D5B9AE32A1DD547EA980E3F89C6A828B
+8718BFF753DB456C24D77DC258EF51FA6086465B54DC258D3184F535685EB9A4083324AEAA16
+5F4173469830D6873EB00AA7FFA8DA8E8A61CA939CE663AF9754A6D1DD067D1D4EFB59A6B12F
+B5DE004DDBBE394763BA68C3356691C9717C2D58713FF198C16A5D9099D25BD7944598D570B0
+384C404F33425CC819963DAF58078060FB0DBBE642AC864903F8E12F85CB68365A5A13CE81EE
+8F6E05344053B1A81E41231F7AB1B9EE1C4B728D075CC977CF645AD8825B8CEA141143DF90C3
+7937567120C997A6FEDA7076068488DBCF063697BC54B28549030D378B0990E9CE5D280FBDA0
+5104C939196668F8A3F0E755C24B4D1EC66AD429EF18896C04559D16F2D487D6E1468570F572
+EE55BD480E844AE02045EB9187BC582F2E782A851E2F64A6169A198AAABFE9DB4018C74A2DA3
+5947C578A95FF7F870416A705406A33E56E69CFFF0069832E1000D2F9B0BE21153399735347E
+A569D769AEF850CD7A6DBB84A0EE2364E489B97863111D8BE08E9F2F2E3D64977AB32A11BF4A
+2C7E3C7C00888D030CBB282A9F90486BAB554CC9B7390DCA77D33CECB77C012E08B2EFF2EC8E
+1A029278489BCBDA11D78CF7219AF42BE11310B07662BD7E673C30171A09F03206E76FC5959E
+3581AC1B23C5ADE719B9DBBD9DB0E00061B99EBB8AA208E7B994D485DC3FFDF6241663178542
+C5093A1F6E3938459BAAB14970D7FB4568896456D3C3C02C232A8A77A2441E0E8B6B886AC676
+84B7FD9A083AC8AAAD6B0D995DA9118BA0EC41F2F07B0BA2505AC576EA0C4C5FDC79A06E38DE
+529242AE634E032AD7BF9A8C9AB6E2F9B8F40F10E61868DB5E5B5FF832F4E3BEE15C4FC8CBA7
+4086EFC399470E362F22C8CA54CEEFD9AF432406C0FB937131C66D2EE12E4A213CFC9B3C3F09
+4B16379FE8C2D14A5BB56519AFEF7BC1977997FFB47EEAF8C3459911C22D6E8B42E4488D2A2B
+005365D4D123D452C96040EEF39026EF60794140CE04960E60799057E510D72B7C6D8B4803AF
+22B78AB2538FB25F09B99A0B17FF6D1B8C42DBCF4BDA78CA4E14CC0A363A51D451A583D87705
+AC376EFCF25886880743D0D440F70E182B299CD7B144B43D265BC344ABFEA0D54BC1518910F4
+28518B967F4E780215EFC4E9FFE90592B139A94D57055394080DF92BCD4B5EED00193C74C062
+E4109D5E6703FF169FAD0B52BF9B31828B433B8A1C7A40648B534A91237AF35D328C8253E6EE
+E04DDED90D7FD451F7958BEF478B7549D82C7AA3A214D353F474CF81EC6CE0A5D6FC9C0CE113
+AEEC11C884AFB672680142A67E01F727F72E5941DC547CC2D2498174AFE7A967C7C2A898FF65
+185C336A6A5DA1C9609A0568017F912EB3EAAFDF24702EE42586D47C2D87D65AE47AF9789F52
+37A629EE97292C0C7DB71E2F9F1637940747042E70FF94B6C4EC2328DF72D0FAC34E37EA2A7F
+E655F95FE1BC3957392809EB96C0256C6DF316C1360B3B349F82F9037EED6FFB1305824217D4
+F2C5F175912A50FB3048FD84E179D6039F7E5CA8B3F91263354E41CDA42BED408753AD04EEF0
+72E0821A62585329FE62D3BF107B7CD3ED09F8D47B9902FF8FF1A1EF44B4D226F829B385022A
+E36F2F29DCF11CF10C6AFBB9A796C30EF40A24929B9233375AD1BA94C0E8BBDAFEEE8D28C478
+FB1D5169C3973389732404ACA82E026D48B404E4DAE53681911A3CD59AC87FEAAF58BE8BDC78
+06975C3B1A8DABD797C399883EC70E3DEAE043DB211286B89001CC685CB4260F91E0260C2BA2
+3617612FC8E0EB36F056E5719D43CA052F6FFCF88BAAA51EC38E6E87BD78E96658A75484E53C
+D2ECF493621D9DE9E8C603E06FF072FCCB6EB65A5D50123F9243B895546A3F04D977945824A0
+47511845B3CF3B21553EC273878D9873590EBBA1B083B5FD477A48510265B0ED6E42ED467399
+518D1BEA2CC3D86452938C905739717C1DCBC049E62B95343CDCBAE8DB4601CD6BC7086B877C
+DDF5D30CA16FB7D63CAD9B1FC90C5D245B65B4502281B804D703E3FC8D75B72A41D9108BD99C
+27EAA004E569F01FCAA503F6E657F26211E55A7D9C232608710C3CC374AC93D51B2E0069641C
+0A3B0DE736AF941214AE3DACEB378EEB6154AFE98DE3E18EF18D8E94E8B1C63280A7329E581F
+492A24EF0A3B79BE935D4DFCF3E1E7C332FE395DC07672549DB7E9B92232F43DA4099A78AA92
+B0BFFD7813E81F94D869DBF87E0CF991DFBE9D463367D03C3CB5D72A60225BEAEB02F10208C7
+BBE0A35F42410C79A5C7DA971A17178DB9FF1DB77F09995B8757AA95DEFD976E263E8FE381F4
+11CB8E7ACA2967658D309DE53814BB9FD4C312B46F6301BB11E615BD7A01F18BA9800B66C5CE
+9FC74D3D0183181391CFEBD3B511E7DA572D9EA78654A1C056C12BA32185363F4CE492A8B228
+76D3E200ABC892C4CF7857DBEB3C68564F6D96FE6A36792360F3FC6914DB110EC6EE915D9280
+369422A97A4C536BF7609D71C73AF9A3ABE23DC3D77266D33F27209E8A3E26B126B2A607D7F1
+73820C682F24948661BAA7C7CB8D5F4C1A8CA978DFEA1D16E271FB562D4E465B980E1009F9A3
+196904D99051ADCCE8ADBE4DF1546BA834D8499677B6D4F45DEF81FC71F5EFAA111196E34204
+218234F24B6D60901B7BEFEB127BE3148FA0E0D5A0D2335AD1768314F6F6C1A00DFEB337F2DC
+F664EA80E459BD9E67E5DAAD9DDBA9F445F44C0187E80B65DE5783BDF98EBE3588BA44395017
+0B74BB783719B430C0D6D98B414C3B1C84552F96BE5E05448BAF957E66C0B08FFE4692C272F7
+25CD2C52F779081BE922B8D5F86508C9A977240A22EFCC9AE33DC9CD6A4A7EF94A3B1838613C
+E94A22883CA527F305986DD130ADC045DD6A19C8DC63A8991C07DDAF36C103D3CC91F56F0E92
+378B5BABA33819B0BDCEB7F4F0AC8773271EBB6C3F7788CDB857067C36B9E1CD5E3E7B504700
+B29F27B3CB24AA146947236A714CA52442662B0E29DBBFE96BE16921BA03D9350024AC8796D2
+71239680A09D652F831B9793FBFDC653C15849FEB4605A013F6DEF08411C0F8749E5ED75D879
+224360EEABAEC70E35E4A1B57B2FED28010346CAF0D7104AB10B1AFE6D852424CA167C33C98D
+1F0B751A316DF2388069F3161EE8EDFE75CB8F7E989C798B21E7E68D2242548C3068655492E7
+EE7C2DB61513B70B5756E696EE3A69DCB7E8ABF5453B5FD5D1CC3843B7D54F87C031F9C7C149
+16DBC62A808877669278ADCF3C3A9B565712EFE559FDB95400A1B9678E2C809371A969FB0C87
+76B47991EE3507865072E6FFD7FA6930833EC0C75C316933061577A6A438C9F11AFBE2520F16
+9D8D0845EBF63E6F712F0EF4552B66B658A8BA144F4196E6D729F3EDF51A1B32830814CAC92E
+B6B415D858B0E05356BD997BC52C82FDDFDC5EE16B59633A36F4F8381E9B072606A620823330
+AE72945E7BC98FD308B9A8848646006D6C93DE7B8264BB550C5B818231BEF57D959AAC5041AA
+B41C41FD304EF1444251A300EB0948B5C1F6EB0FC6C5DB3D02489378F388536BF6ACDD4B1A9C
+9C9E3DAB919F9F68BFD65E4D9D43CF1193832204AE0BEC07858A4928D28B903BDDF2F4FF83AC
+3A63BD3722812507B970E95C3BBD965073927319AA5E142398A1242B19105795BEDD910AA209
+2A6AED6274A3E4069D0BB89D67A9FC2EC5B96607C9B36A6EFCE5C327D29B620D76437DBF4CAC
+D82B38A54AAB522F2B2411A82A36C545DE0555368282895A6A9076AFB2A8D9F323FB9B84B923
+F6FB1861D6657A46B451D34CA71D20ACD0810C978AF69EAA8A822073BC34229006DD801D50BC
+0D9CDEE292E2B8A8A29A664786BAB535539B392DDBA1D48E8C5FC6B859377234640C48776B95
+7927B44C53AD2D127F4B3167E0B5EBA3A3E9BEF27983464191103F93A7ECA734D1EEA17EE392
+143E35C11F64A49DAF860B09FA44C947C179135949B7C15B85891AA704877FE9CD081454D180
+34E5331BD3B6AFC7371F1E298F5B7AAF3E6C433A4FF64CEDCA2FD397915E7AF8213DD848382A
+665F6CC70386CA8FB8FD00E1450FCD91B69847B6ECBE517E234352389B317BCF98912BF80D94
+56BB330A4E91893088074B36E87D5DD9F50A77B3559D3C58A87CEF637B70F6B0851E430320DF
+62F12779962800A6D9904577361677371E1469B5D3731757E051B0EA8C629D275D97C4C9DBAB
+AB800689EC8A6E6BA25A027DF9175FCC582803A0469120A786503377185A87991A6F9D17D1BB
+0ECE2F93E8353ABD1403A7D61B3824E15C1079CDA751492AF9E5D8BF8DFBEDC87D5C42D5260E
+A3D4BB003053CA7097990AA89D7CAE4A835FE96F66D0D89D9B9187615FDCAD63254A6ACDFDB6
+8911DAEA8FB0B517CAB5A7C2563D387D62498CF18EFECB0AC6D3E65AAF43B6F02FB8CD411253
+1510FB2382A3ED16D2269FE29CD3442B3702D5FCF37FDC9AB5261B28577314FB3D7FD1D8E56E
+BCE8306B9992BAE4867A58D1CCFD3AB1FA6FDB7E70881ABDF8AF52C4756177F5D5684443C4E1
+60956AD1395D4B34B3463FBA2919BE179163B64C1B97B43F198A50CD5BA5349A3FA9E52832D6
+474586344F46D6142E48B1D5D1AF1BD94D4AA84B46A969F0A14015254A344705BBE917048281
+47D777DDC5EABD47DC0611216762FAE75D2C4E013CC6DD45D94386BE67B32175533958D0C835
+74F14400CEBE7E8B303F7A4DECA08CF396EF499DBFBFB81C2DE5AE41A8DA10F0E035789DEDA4
+C1FF611150A45BD4039CD166A44B5E9DFB2386B5DE885B9233B26473168BFBA19D69CA867429
+6F1CB9CD0C483BFA0450BB492E8FE8AD98114D2C40DEC3299B7F9753721A358EB511566F8F5B
+38B1D337FF8A67CE3E3C4B43FAF04079E7519D6D2368AAA5DC2E11260BD9A36EF2F8A60EC7DC
+4B969A2BE14252C139FCFA943098D8119CBBE6A456C438409BF4F0D64E13D024829C9239800E
+67675B156F6BBEE55DA163FD3AA1A9CA4BD4BB1BD513263B03C3A4F0D17FEAA4E3A0373182F8
+B6E8F1039C09AF65E0CD65C19EBD1E17F97FB7876D3889E8788352D7B21ED20892A75A273E54
+940691EA0E437C23023B1484F6E043E7CB4E21D36B673F1A1DE6A3B30F43F1B69AEAF500719F
+C39123900272EDE09B9568E49FE8E3A1963489B4244AC36E0F32972F556805B78CC92CF996EA
+89D3FB0A663DC6A0B1DE59A2CEE7A2AFC39A75054F8526262FC8E8978784BC5D57A9359AD089
+46560BAB7FDB79CDF91BF8A0566F359287E4A0FF47E6B21770A702BD68EE876869F882FC7A70
+0AB804E853D93A6F04F90C0053D349D68D86EB50BA377B487AA6944CD720AA6FE2BE538FF4FC
+3096CAFA16251CF3907034D9CAC459A470A43B79C40DCA3E01851D749CED4D8D05C72E9A971D
+60BA4145C79576904AACA89405911C735F511999C158E710831D4BB904B8FFF955186877D3E3
+315FF7B3CBDB784DE0B070171EC715CED6E3FBB0E7367D2679101ACDE299FB010072EC766406
+9635A1713DFA949880F37F4D94EFB08AB1307C116873B68EA78CE5CDBF0543B29FD6EC3087C9
+B83CDB3904BC8959056D6752C993F42BBBAE9C7AB6D8170EACD2267170C44623DDD7F241F9BF
+C48C06248F7DF7E6FDE692E0F171C5ACD8CDEA4027608EC0FEAD4C51DB5D3B90C16124866BF9
+907FE1C0685473463D6AF79B0B2F2FA5E2CB592AE366F7824ED4D3DBEA371C163AEF46791C1F
+961189C217E331A9DB23A2B652A7CF8AE97B068E0FB0EB1584D8238A2B7E1F073A9DC2F56BF2
+3CF942E4F3CEC2824000C1229AFA32EFFD89C8AD14DB65ACE029F43A69DAB1915D86D7E8E7ED
+C05DE994A8CCE0FEFB68625240209A542D72384864632B3B16A7B185717A789B9A7F9B1339E9
+98C57EBE1425B9322CDA794C02244B58C97AE1403EE3C8123FB82B71C15F06831E842AC49AD7
+1A9D88896ED04065E9F356229FB73CDDAA7B4E60DA3C2D15521013E80C392BD572C96334AB86
+C99188FED6A0B39A98AFA96068503B4E0EF4088C837F4108AA30DC716C21FFD182606B427839
+E8D8FA323BBE4FDFC6459BCED652CD0821AEF1C3DE77959E9F8B6861352688AFE458104D6AA7
+2D950669638641A7E689657ECC71A29ABAEFA6028B6BB3F0B8A9EF289573C6F1D8CB4C34C92E
+190CE2BAC77C95546286256E5C047120896B301AF3A127C99A141B4317B81C4E91F9BF025E51
+9DCC96E16B82D6B05DE4823A8AAFC1AC42B72BAB55B707BEC80C491A3F295C8F25E724F9B0A6
+DB5619747EFFBE0F3FC85641D859D17B8D070AA6599C85AFC26B6B4A80E09270DC87152EB84E
+685442B0141115B64CA13EC442B9031FA781C71CDDF020B84B2E22A9853E41685D1E72C809F2
+00A7AB4C0F78DE55FB14DA87B1B7EAF7673E7B19976F900BB0DB4052B3F3561ECD2744BF5756
+5C4F155E37645EFE66571E94BF752BFB01DC629C40286209B5CEE19D44782C2D449BD37B934C
+A5B2A738258E060E56FFC8882445CF91259F144860D586DF44BAF1B79CA5D524B3E6275DA544
+952A59A2741C5F32D4B31AA8520CAFC6C43B4E2AAEB4539229C9DAD871AEC6FF9AC3BE71D49E
+89CB366DBEF22D720BD91C19167535044E64B782C058D3936502378F6AA7B0FD69324311458D
+F30B73E1BFF914E65F149B06A2E6DAC0150C8E939F9D9B2A8022E97011A97E8B236AAB0C9749
+1D76E14FE0B27EBD9491F04380B147C0CCF62B6024FBA977E6BCABEBE68DA327ACE39979CC61
+FD91C88AB85C84DD615A2F4030AB4636636EAED61DFDF4A4AABA517772F6734D0FD5AAFD61DB
+44DF6EB72FBF862563E65071118EFD3A8957C565534E239ABD9C6B7FDA06B23CB5E15875A4F3
+0B0ABD95B0F7EDC71705CC03F5DE7B5214C84E762C82472BC35622E75CF4520CD7FA9110CD52
+1F71D346A1B53B2D4AAB96F8043B7BFEF7D52541181C6B37E5D94F6B62EC58CF4A92DE51B22C
+549659AD141DE7D8C5F5A54A3BE0E00152AA218FF7A1606D157E82D50EE7B49A221574FDBE8F
+AABBBAC0EB2760624E94B811D773DB19040C7BC32A0D437830B1B29479E33054970BC5C27EB1
+86311E49899C5EA15EBCD634706EA0E91CD9CE9F28CEF16894D750AFFE688565CAB2D72D0701
+38070BA17DF3847FC352EC7102AEA080B2EB2744B9F5AFF07C87FFC5B5D06E6CA18AD11F147A
+F3E970702CF556803A79501EECB80D73DFDF5C95489A72F82DE74D0C636C1396FD899441AAE8
+F1F37190E26EF7ABAE8F66CD22D0A37ACDC65AA2BCBA139E861331EBCE869B8EBB222CBBFA53
+CA3F027D2D7F12A133EF24925858535B66F640352A8711D70D3167BF319C086A62FA6AAF29DD
+93926381D56649834625778B7DC48FBE94748A484871EF3344BA5B97FC3C319BC656071689E0
+C3AFE44CF2BCF167DD47C0A9B6B3201C706B24D86413EC9D03DFF262EE29C710F6389DE10467
+83905DE6FD6A3AAEEA726C15F25F1DA4266BD2D0CA72A4DEF26AC959F3D83FB5D5191875A7FD
+DDA05E0BFB79EFC209C25E026716363A42C8636519509760195F48A6F5A71FFD67AE7F3165BC
+EAA51F85EDE795456B14514959BA76AC179B03955F144F2F772335F2863A037835EB71CBD51D
+A35902EB67958E8FB430028A8C2D4D3492EC02F9F8A1D27CB4C09664303C40CD10B2A695D28E
+3A7D2A74592FC4B4807B1E10D5FB34ECD464D1B1B7AD58D5B71F4E7053B3904C0E8B4EE3B07E
+1C5BDFF4113856F644EAC054BB369D86BCE83C8E249D910D320C988D4DAFDBDE23F599339D4F
+082C3888EDBC0096DD8EF16414729392B7AD90F44605F293C1BAC5C3D8472ADDBD44E968E81C
+ACA8522BB93D0A628F905AECE75A370A31B62424A3572DFEF8F9307C306E3ED07C17C2322551
+43B4D7C04B46FC1404EA4C71B5277E4F2486D6ADDBB928637A1DC04148EC57CF6C8B7CE828A3
+ACD56980B4A061A339549C55DF0105D639B20E5FCCB663AEEE81564417F61BB585E28FA6B61B
+819C068733DE88F9879444337C5190E56328C1824BA40D6F88B852A1A3BF88758AC5FDE35DE0
+8E8641A4164ACE0BD50FCB77A0E551BF077EB0F20D22867F8C71EC3A02759A208B8BD6244828
+96416E7C51915E676DB57EADF40E6AC0FDDD5CA91288F65A450130081E288B7D3BBA3232C958
+30999ECAC7EF17C3F657DC5B6D945B6BF9E29D126A48EB8439A13DB40D914404FFDF87936B6C
+5EB4FD47225F6DE77AF6952390F299D0A58ADEFF28B80863BBBD61F10764CCC0B20C8ED6D4C4
+764F89C2F56841B262779D8AE1B6240417D24CECF0041DA0ABAA05A6197F75E28CAE96E7F5A3
+6DDCE594C95CF8FF0DE6CDCB4BF8E492E55C2E9F16735E3BBBEABF0C960C600B8D2615101404
+68AB125426E5879131BEE7CF29ECC0057DB44FADBC2472E9CF714C6BDD0F9BA77E06E6E973B6
+1559AE4F3B170D61D28D39B17BBDA8D85771D57CFCB31038DDBB3171EF85753F066F0E67B852
+479AEB32BF579E294559E6BD06A3076321C93F48EC0E53E3EE2251103D4DA6C0E44773DB0DC4
+AC064405DC8F6374B818A7EF90CEADC09D30610229B3BA14FE3568150000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMSSBX10
+%!PS-AdobeFont-1.1: CMSSBX10 1.0
+%%CreationDate: 1991 Aug 20 16:43:06
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSSBX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSSBX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-71 -250 1099 780}readonly def
+/UniqueID 5000806 def
+currentdict end
+currentfile eexec
+
+9B9C1569015F2C1D2BF560F4C0D52257BACEE583A5C939393E012707B47E0C1FA47D284A1EDC
+9D01A497D772BCA8C543388E6DC0D1E2C4944740470E0914F65EFB0737B0851B2BA713A9A00B
+36D07DA6BCB52920B9B59EFE587734027A3C5E6566AAD332FE6FBCCED1417802822A3B81D618
+7875263D6BBDA04BBCF6E4870FEEAD60F104BB3C5A766610DD11AEA64A6B107B0B04439FA288
+8B8CC39232BB83F7695ABA81F0260CD5248B9E649CD800BCB325468D2C43F9469C605847B026
+BCD21CBF124128E8EE31AA6D4286FA6D465315407A865001DBF5F9A84D3C7974880B04BB3FDC
+C784BEA5FDD113F8FBD8A454347AA30BF2F5369ABF0829DCD5378296A42091F24AF75E9E8310
+E61E74704D7D88F586944710AD7ADB098AD4EF8FB0F634873391837C2456F1126B8B6F2A19C5
+F43E5C47B746FBFBE14DB596BD4A5000ADABA65A30556845AE06C6E20EFC20647FD0CC730D58
+7DDCEA79C40388105B0C20782FEE3F0F2257B942DE0853A1EE99805FE77E1796C3D2420F5658
+FDF307660C5525634B2B530A17B104E9A21ECC2F6A30E22520EEFDB6A62600ACC6B6E6903580
+36A18B2F414AE204FD429694FD212BE6EDE4BF941E3257F88A03A75AABA159AAC9D0BA10CBBB
+4D4458C8BB0B3894D367D6256D5577E71A7C409A6F955909E0F05B89175E89E50D833178E230
+F23553979497371147F764D7D5F8C7060278D4FF7B299631604CF2B13E03038C1D2F8A726CFF
+45122F37597DBB6EB8DAB326F200ECCBB85C7E45D16C0AEF3213E6B9C6190F6CBD1D0C9B2489
+2FE97E57F2F3A35A9EF6F0564AE852620BBD8D333C1FE8F6423157AD465809C536E9BF60700A
+6D86AA05BC4257A31CFF4282186A1540D0C9F91526C436DEF5A58CAF23890BD1E4F862076A77
+FF2339272D758ADE8CE76D712D09A66A492EC3ACA758DA106A9747916EFAFECC8BE299B379BD
+CC15FCAD983A56B59AE4402A252C11CDEDF020EE04619A7F0FA073A6AE3EEB92FC280F39541F
+88F1846293F4F56E86C0C82C603742748CC75B2194059C4778ED1E2057402F956806C49C1636
+9657187106F7CE0226917D674ED24FC373E02A43FD9C340F5DDE9B9AD5190C264692B43765E3
+E7FA42EDFE7664A8824C3BA8E9E9D55CED004A622CBF00B3609BD8A4D5659014987D0C2891C8
+F2D5CCA0EECBC1605A6CD9D07CA27C1911946B5800D9786E290954C6DF397EC9B91590D17DB1
+6CB98D035F55E37563AF0AC20213DC1FA8CA6C66F0FBC910B803629BEEACEAEF2FBF8B1F1814
+0AD8B7BB32D1E1E3E3EEBC7A702DA9179EB3A6E1340B6663CAE5F2D3BB639CC166E696D6B9C7
+C33E5CF4279DD249C24A6760093137F74877657C6C4AE4331F830209309DEC6F218EA37DF178
+A9C06834F08AA29BCDA0C58FAEEEF78C01137644CFD2C42F2D522F32DB42A00A1206BA109853
+6B734F7B56CA0C43A804066E13C467E87F07AE1C1161014A18F73A316A512709876207833771
+56A189F6D7CA9CF067DCB48B7E2AA8A79DD7E4AD0713B415594ADB784F0A41470EEBC59AA0FD
+6B7FFC07E3B58833B66CCBF5C3EFA22D6E0EC43FC135C4AA78A352C14F7CA5C9C320A962A480
+6BBEE1C3EC474FF23DC6421DA9577D7B9787DFAE1939FAE69E17A8D81400058D314298E6C782
+B1719E998D8921C0D114AD6A5E8AD6EC7F175D66870285643B18A8ED5BB61B82AD4868D51E2F
+3D3C9A3CBAB6120675D769E3C4212C697D9BB93FB28490B4D1565C7994A12D6BDCB0408CA455
+13556B7D1F1A398C38A48E7AC507B10F425F2D85444F0FF523CDB07E4B934E767768FE9847FB
+EC257557963B4026C12C530F13DECAA240E7867F4C2D2034E0CFF80508255436B739FD8874B9
+9B206930CE5A9110F10FC76AEFFBDE4CD48B80D834BA017F0068EB9AE0980F6004E5481FA8FC
+1F49EC30B794141563ABB27074E0EF770B8950BA3D3E5811F52FDD192411335A6339FE03EFF7
+5D9E3FD4F8E4905E07429EC7098F3D24EDEA68CA06D6C58603128E92CF710E735BD0DD98FABD
+1339D927951E43CA2BD29EC2FC69A6F5E97A62B51C1DFD1BA5B48424D022899B1C89A81C64EB
+1F70C3E6D0D7CB101F2822CC8F52F03CD375905BBECBBBCC0B9F6E9262BD7DA89159708DF33D
+9167F4900205B3548BE5E67DBAB1DF5AB185055D744BEC6DDBE1B11748007EC9B5883B1029DE
+9C473BDCE918C98527AA5B9EB2EF18A0FE626B8FBDD50A208A80C3A379CAD54CC01638C14366
+BDBAFB6C7979FE0A0C3C89D5E38770C35F2E066902B071503199660F2F0234FE0A002440338F
+66A612BD55C8F9CA89520F203E556E0051A287D7BAC7CFCF3E61A461DD5C06D523D2C34DFE0B
+1F9612ABD69176B302977095511F68B4F1B75698FD6D2423FAF4D0587F394B01A8FA3D27AEE0
+6C74ED64136D4F8265B1E2CC101E4A5D514AFA2380E0A4B7F72CC0E211B73D16CD87D81D7E6E
+49F819ECAB6EB0649F7E84C0C5A4DA354E5751B2521B8765429559BAE4FD3ADD99C135D33317
+BA069B15F823757547A3E51ED65CED0F359B63E7D0BCCA63719DF7B647322945F0BF5164295E
+A293D4BD2EBF308DB049DE8E2ECBE66B2B6C584C523724BF1CFA0E8B4C060489EE4B5CE70A1C
+6A41AA2D34EB59381244F2961601AEDCB8936AA38DBE07EB82AC8C1367268C7059816CCD3774
+E81CFE6E75320B79AB29DD7FD799AC3BD28A6C751DDB9CB9184DB2B6464111881CE615D8BF47
+855659AE54D608ED3749D9BCF95DE4A649EB48F3FCB6F0D7F17FBC36FA4F3A37882FD2CD209F
+A4A0664F54BD2B4D839593668EF0C74CA32B2797A4E09C93E37297B87C8CA09719AB22B68A53
+BD05B92EED1A6B8BD82DE6DA39C8C339E7633C9BF358CD111E09BE3416E6BE7D6405910F63C7
+1676BB7F511C58185FF57BA4D7440BB86E71016C7B784FF011994BEE227455BA7D2961EE436F
+152ECEEED9B12375AD875DF6701107F0920778EDA1CA51D94DA8A3E9C04AF4F0731316533DDD
+800110EF355ACFA97251332212CD72A27B6A9A58BBF32F79E9BA5D1EB7B59E581C72472D194D
+203B0E479BDA982F6D2B557E27F01263342B2994DFE22A34FA7E4C819FA7F9A9DBF770D09F6E
+F1648D9E7CEFA0FB5274E8CE452B36D9962D9D4CC255CA911CC5AABE4A1F67CC755A39697D5B
+9DDC891A7AEF0E530D18A945FCD62FE502DE02FA4A821FDD7213200878B5CFF62BD193748C57
+2C38E6E8B9A999915569A7BE353EDE76717CA70031429023DFAEF6944CD0551AAD008B8D3065
+620663B26763425B5AB0BF269ABC27F85E71984646D2F1D2ADD37EC0E592EF27FED7D892959A
+D8EF63E715482C7C45FD423B798A1259081E64AFD3DBB003482702CF2EE5390B16C1372EE4B2
+14F7CF5D3B6180BD375A6525F66642825AE040D8D461AAB54CCB265953EF1B7324765EB787D8
+5B1082AEB474D7CF6D4A09C918E97354900421FBC4C20902F4B3CEB12ACB08D220CFF131B889
+334A57F5740CCD40DF8E97B20FA3BCAF6DC1A26D455A18B471667A1929BD93D4257B74AF4BB3
+5BD966E8E52AE73A3D37E59E6F1918134D7789C918303742508F9E6DE3A6E3C52A29C6B7D94D
+617B1356E2E58EE5EF5DE2C8155D64207FC7219A032617015A6D19CF27B04E6BC4CF9DA2296C
+10532379F421FF0B08F5CBE2C70A147880721DFCB33756D8DA62B1A25AC28DD238825C9E416B
+145B9ED47289A9992032005D00ECFE3B4A82D62E1FF0B9C9B2683C7A20CD5AEAEEB9DC8DE87D
+0D9B1F7552D29D1C696518C0968DAD3C4745D949A87F1587A4AE91123ABA98FFFCC0EE2F9620
+120189D0FFB316C796DE1C1238E3F1C72B7642D7E8624B721064FCED98E875A455A4512302E8
+1BC17366D2FF232982AE7CD35B27642A2AF0D5CD15F504C7C3C3E114E68B65B2134894475D3A
+F3004B00330656FAE42A58156FB4D6159639E2E638088430479647F4BD632A1B6419E7F8BA8B
+830450A689546D6A5E916E458E9F88E49AE2BD59850722D7A6A950858EA014B920532F8AABE2
+DE68A2344C9022500B1575993C71EDEF8170B3EBD2965DF73A498BED00E55DEFD15A8D6DABC2
+DCA80192530C4BAE863D7D2E4361DBB75867EF08F0465DB40ACDE824D8392B96596F57CF4F0C
+8A8BA41AC8E5AB5D06979D9ADF1E48E821B84BC3E1AF1A4512B5AA143C441F125FB6588DFAA9
+7597FFF116AC9E7364658EE4462657AC7397EC75C3B58C5BB0B5425C5F1ED1350838855FD662
+AE87C3972A6E292CA4EF8CA4AE56C0DCF74A001083D7166DEBBBF93B76CD9F451085FC3FE6DC
+FBE3F0F677F11BC22639358418B15F448C538051484AF4049AD23311E039426E14F8A18A98B4
+535EA61E8173543E61B64B56D90BACFEE6D355BB6B341E2BA115AF944288ABCBA97B3DEA1743
+8DC72901D5E52DB39FDAE737D72AD753EF200BE7DF0B250D131E5F97217068353A8EC36E83E8
+EC0EF5A85123136C28F5D92F0D75F1659FB58AEA5197A455D31032024867A274CD6A998EB0CD
+453CFE37DB1F8F4F8106AE184DD0CBEC614E8BAEE191A951363892EA0E9D4245BBFF8E0757C5
+60C309F6BFC80CD4298484AA17770C1A9B92DC7131E3AF79BBE38A64FCE4127ABD3983BDAE23
+B4BD2D67FE0A39A861C398CC0A27E93142C01E4606336C442B4EC17DDFB576E8455976AB2B22
+3EA23323C1EF7C340D1B40DB7DFC1959CB82C6D3642F2DD0824C7EF4580A767751AD68F7FE18
+42ABCFC06F2B8D94ED727F01E3412FCC310DA1F3BEA8BD7E3A0B66A9FBC1214DB48CF5546C42
+C433570E996462E8B7D7B25D7631144DB6671675AE9C7203A28260D6037D375679726F9395C7
+BC503ABE6B13ADE23CFD1D6DBCB8390994D28B052E10BF128A8DA71F8233606569E27D6907E7
+F6B4A5200FE2031793A48B3FF7157D625E01324221AB98E1DDB867E6D9576CEB9F2480CDC248
+8ED57A677EBBD3C3DD973A2214D0314A1CA9EA5CA4C2B48AA76E5CC586A0A2AA6FC09A8DE5E4
+4C7C6E2B3D3EE58D6433FC3B097059C39BC86B37ADE31AC1D3649AB5C4A0BCF12EB1E0179B04
+D8E0EF23FF825CFF7A6B6A3CB263732FCC5E8062890226EBD184E420D00F9F14B5E487B5A76E
+0A51A2EAE89BBA6F981A2D5F3F0268174625BB10B6F9A21E60D03C56B4CBA0AF573D8F573F72
+6E26CB81C81A5D3501D355519470627E6EA81D6747F9B52C672A33F1C838B2625115C965C210
+48957995982F0D6854AC5239BACD117A9C5D69BD88586B48549C922C0A6875D5E21453668036
+4E1D07D88C2A2F77B43E53A0EACF1625939F4AC4B5F91AD2ABE85CE12A1E53B0678DB089FA25
+59DA9F5C39290B231D673634248BB2D9B093BFDBF7CD7727112E757B602C053825768E48C94A
+3B554438C0D4A4269DD2D365DCB9FA0EFC552C2A833B1D45F1C60F27CF5E7D63FD8595CBB69A
+1277B7D5DB792CA37B641ED2DF88CDF3B38796EE9F0E9DE14438572E8041371F27FF36C375FE
+FC6B055B591E9E54DE76C71BC52F1B03BA51AE07B71C606E8DDF2F9A7BC21C3C534544755572
+E8B8CA7F1202BAA601539C23C87331A8CE14C66A74B84BDAF5FD67547680E0C36B792B941157
+0ED2DCBFE813D12B4499379C452470A3B22D650E6599D408D859AB3515312BBF6F901999039F
+93126CB8F2E85869133F139CEF5CF0C2541B0E6AC44D2930466E4A31CDA80A676118F53246ED
+726CADBBFA441B7560C4708FE61212DFBF18512552389357D68C9E199555F58D2160FC9DF779
+BD82A5CD7AAAC13C25712A5983BCBA2A284388B46D700231CCC201464C2D8C0AC4823D471504
+F463B999C8630BA6C921A8BDF502C0D1F7B11A16396E6391480D4513D5B899133F7ECBC3DAE6
+F3F23DEE02E9E04D2AA54F9F968241FB366F06EF4F1514831C5DB69CC42C8FCC5660C111ED6A
+9D663FCE1C93F55EA3CA92DF9C605F46C81AF87AA5B51AB73867D11FF1D9C729C749A61CC802
+E65D6F3F173528A41887AC42D8F4E6CB8889E29C9BD7E1EE93510062A3F4233490A1497D5BBF
+44A7991F4898634D22334BDB19E8F1E403CA658F87F71421E75C876C80D73373C70B6DFCBCE3
+D81E4989C5BD87A3EE2B6B7EB26F5696650CE262BB145B44EDF017F543DA674F7D5C0325CC69
+6ADB6A3C39C5D185FF1A5CF74F916AA2347E56C54828BDB62362FCFBE96EAA8769A988CC91EF
+AC082EA2B6E8259FBF28601CD6F9D1858A104FABBFB5CFD3232E75090B96ECA7E0C8DE886ED1
+985BD592FC042700FDC61A931EB0A6F2A5A92F5E34CE27661F2000BD28FD473A58739955D500
+CD08FAEE914EB5688794274678FBC21A3B8E94B2CFE27DD70FCF215990AA63A6F8FA1D3E86F5
+507F6101A3C8480D21249A1347A58AB8E25DBE0DA018D090E674EC269F1B8B2C287F42F70323
+89683F002296307E9C6490395456B9B9833A22D0B02FEAA0246C98F4D77FF3B7F31EF2B25645
+C247CAC9F72E405F559F8405A967BF37406C06A24DA5F377AF7F385F2F141FEEF34E035120A1
+31430056260119BD22B3791E485B61FF9820E4D286E53946270A824DC25622212D2442196B3B
+B76193ECD38E31C60BE633E9935C2B0D498E48B1CE279528AE909D26E117945909791CCDB8B4
+EFDE26649C7E998694454D561BE3DA95B5D07803E752A6DA401BE08C9B183636EB9F9AF9A800
+96E491EC43C411114210310741A6F2449FB2F59FFF3D505942242D473479911AD3579790CE29
+B450CB976E0C22B0CFA1008ED1B4832D616116F3B548460E99DFA1266C73B1A51F2F8E40F0D8
+B09B73B689DCEFB11D6B49E65E54104DC11C5DCB5AB31EC4ADF5EDCB8BEAF85B03CF50722CE0
+9F7B81F6F76310A5B87906A73B8E7C7F2234351D9C61378865AB015394F30C80A00AD10DBF18
+5231E84AEF3EA143F888C18AD917F1C925EEF4858D2376C1B4F4C3F1F6AF6A3D42246B07F271
+D5DC85FA4BA5F9BE4ED5E5D1F9C9FE2D94855723317E16B6EA54960F68178AEF86E81B197459
+504822772C3A228A9A4923F6CED4A32420AA029AA09A65B2DB2FCC08B6A1206C1707B1401DFF
+4731C85625A560A8E2E42EE3C4B5C09FF8FB1985C696E0F9F5E933752B6402FA5D3846C7AC98
+C1118CF89CF7A9F6E67615CCC0E6DFAA20D1B9BF3D275F293E373609A170730BB2BBBAD18B40
+198F969BA91490D8FBD91FDBC4451E85973ED158264E5BEE05A782E8F4FD2A06E7916CC65B09
+29AE23C974791568D04D706FA4BFDD12AA5F8D6D018EAF72BB41B12B631D8A33327B4DEA8BA0
+EE7856C4B03F0F4DF5E16CF8E6F9E29C1ED1114251A967B054BBCD6000F5EF4C479B8944314D
+FB2180A18758463288CFBEA30489E9C3826DEF55BCB284EFA8047229B0A4F3A6314819668A92
+E7E26E2BDCE1953A82E3D7DA1ED7421C4DB8C4B34E655310F2E03646FD5D23628762C82CA476
+CAE188B9A45D83C496F9E791156564EABEFABB5611648E9C30C3D3BE160052E9131A2D16E799
+EE0048FB0218F28690FF8BFB38586BF7701F70B672744BA8E30AC67DE9AFD789B15391E93BEA
+A2ACF71788C5CD28FE8F5F9D71DDB96664B17EDCD78B8A42AD2E193F697AA5C3F814B820F9BD
+0517C1D458528E182255EFA528A407F5D4108D296D373FEE84855217CF38DF076CB6BA4629AD
+5D4D2A02DAE8532F7DE46E2A435F1D9A593E1B43E4DEBD8E5D59DD047B64CC9DD905BA8809EF
+9A53F6786AF63CB2B68FA283875E4CB1D82E0924686ADFC94FDF338CD936306A2B0F980E794E
+4261917A47885D2284CD98F6384F6D935672BCBF58D33D168133A67B620697DE269F4ABF79A7
+6D4261E930D92DA64DC334B26EBEAD05B77DB2691742D891347B7C1614B65AF9C94D11A10EF3
+56F778809119F2F87087E85C623802E3711EC6844F379CA1604E0C1CC0DC192E8353B78AAE72
+9208AA5D45F092C31C32026D35B860954CF6700768EA52657E9F586FCF750E27071E521E63D8
+3872B0B5137AFE33731D22E15C0440BA5A0A9E5A07F9C1DC14B673FCB31AFD0C597DA1478C7F
+5BCBE2A4E4FC78792850521ED6CD89A340927B89116498F29F6DC164932738A219438DCCE1A1
+698E06E741DFD525C9CE595AA1D7E596830EDFCC63107A3A38D9C5E8C616E5941FFCDFCF1451
+9B2E45B6B2B90A572736E18F95E22CEF6B7F0AA3C5597646F336487A5DF2678C2D9561DAD373
+4FCFFBFC67893CF2FB40150F1004470FB80C8EB4C0C5600703B4DD9FB533514F21AEB11784E6
+D0D1450773BE769E8CBD1CA034A772063F3B7119E9883DF299A4DA36CAD6DB8C2B21D455FBBF
+8370286A24AC9F381EC45AF14596197DE030E628A495A4AD4BBAB62B76A65A0FA050DB098E36
+20520C9D0E5479CDC7603826C71020F7E01281E8224D049BDD8B1073F987FC948924BFAD758D
+9DB3246CCE713374364E081CC56505BFC2E2C8B980BC29DFC1F99EB4AEC89A51FC3E85C8DCD3
+00913DA93469B03401C55F2B173BDD909B0E66E5B35F9E9CFE19EB5F15B170BCE6E2B5BB2C37
+B9A03522AB2E06607829C6C9AF6DA6405D8E0F8EB5CEE3BB0146B66D2B195C34B814753A113E
+4A1F7E95390920C10AB065228F815F31EE06F6F2D07ABBBD564865664D85EEFD4DB4D88E6E91
+4C8E335703EF06A11E1A8245B652E29A1E92FA2199EC977511150836CC34AAA8A7409494815E
+BAA718D13897AD64BBCA52DCF18A0EEFB190925B1F24D947D675F9BE08BB52365576231E66EB
+8B8FF47335A80C4B3E935967502EFA5D6925A80FDFD1FB700F7BB680CD7652093C157F45988B
+91B145A936A465F866153A839F21F051E8683FF9612F0E8E9BCCAFF380544DF74EDA4A46807F
+F7605CCEC36405597F434BF0E5CD9B3AAB417D90593D247A962864DE56969B665A992C3CA80F
+C2D71D0FC89E1A50D2E7CDF8900CF9FC329C2A40ECD265ABBF451368D2AFD0F0C7323A52A8D2
+4204044454C9595319064B21A5E0006D72A06A379AC11BFBDD85705EB23F2083549E00868220
+D03D23F7B7BEC41E52E597A1AE97659D9C51686DE798497069E6442E299A7EAC73FFF761EFC5
+5B9573B46692535AEB2DCA4A8B879ED7FADE557CFFD3DD691BAF9B756A338B30BA14E821259D
+B083B870DE139CE14C40E68F40318D2CCE636A33CBAB2052577239FACC187EB1E7228DD4990D
+280C0692E1EAC387828252AA45C069AA01F14E66AAC8EAECCD303328CEDF68BFEFEC9D4CD132
+47C88DBEEC3FDB4F1080DB2AB869EC96657006A864F1C730537D586B6F1B42063B22B16640C9
+AEA67B53002FDBAC403FEFBC9E2A26A446E3872033D94252205B3DDE65C256A5E6A970A2920D
+7F4324D6919A6A26A0E544C8B3BF12B3CD13908485ADC406910F1DB0BEF9823A6749035A038E
+5789E2F28041A1882DD20D900C92B2514CD56D9535F923CE1EEC8E837DE65A1A8F292915BA63
+4F6DFD9638AC6AED0243AC0EB7A70BD36F0EAFD278974D5B0A50FDAC2DCB13481102D5A858B7
+25E00DC1DFD6DC3D1839A3F5170E2E9877644457E209C4DAC5477A18708A4B96B17ECBFE863E
+BEBE200F60AB294EB219E65437D444E506838AA783116507FABEFCF755FA08E4100D3B149C2F
+7B7907D8468CB2D5876A4BA4B631583E3512C85244F0EE2E15343B34CA8BC507FC51C913F0A4
+1551A957F778AFACAE521E6589D8A262315B67AF154CF83AE3C5DD355FD94C13C55D2D77F309
+ACF6B74987EC16015D7291901AC07D2821619BB126F3DFDF5712AD2A3E2CB73310B3729A921B
+06134C717654CAC75F88F5E510721B9225ED7E4E51775E7A33ECDC2ACD1FCCEC44AC168C9969
+A16C08CD5461B48B38704FEC5E0B9FED460C037BFCD961EA2B67DB80510129BB7A7A6D96D0E0
+2B39B04AA46737C2D27AF9D9116505B230BC3E875AE5946A669B24BF65A422D83A7951D9FF20
+58408EA0F8CCBCBA801292A2A2F570320C30414A02DAE9223DE0C328B8EDD6AF0509C5836748
+78774730878FFCC90BB1E75C5B7C09DDFA52FA281E9C86CF026D3FFC397FC41D9C9D3F3268CE
+327B7D03B39B2D7E60215DA05CECC991108786EF06B9B1E4D5830A328CDF41E64E55D90FDB62
+9004ABA1303D9496921300664D9A181361CB09287FB318C67C7B2578F7E27581387077102D3A
+97DE40033AE11CE71CE5067AE40589953344A091DA512296192A16A28B6579DAF6AE58797069
+7E07226787C0702CDD695397F850EF6DDD146C799A15C511832A935B362453EE2B4806555875
+D3F914AB5CB911072E4E51CA91ADAF37AF66B55BF97BF3F6BA135A86C607A8640353417F946D
+E09C65955ED413303BEE7EFED8FCB9937EF8965AA72602265FEEEFE31526CF8F57794A07CCB1
+C147388D65A10A37DD02CF397047E7902BBB829D9977965D03AFFAE55001C8773E6E669C0043
+AF426C4D68548E10246047048961629411EC7ECFF8313B7C1FD4356C142DCBB94C0B6568EDD5
+B50837DCAB6FCF79F210C053EAEA98D52C1CFC41711848323E11987366DF7BCB9656AD3C7576
+292A791A628F6281C080BE2FF502D2E2B08099C80BF34933CE9A3158D33D4EC90C4024E40CB5
+9275FCC91B28BF6E8ACA902052CBBBB7873095D44BCC4BF4336C18F95FB58EFD9B9F3A53A94B
+FBEB89F8DD7A95DC44531A39685CB1F65836664436147C4C4D1BF3067E465AF9F1C73B1FD847
+703EEABCAA0F0DCD9D5A363888785D4C6F7917D40798C3214FD0589091CF5B00006099102CCD
+D9D6B9E233CBBD0578781EA3E96AB955D995E064F1134C35F09C383EA5BCA62E10F3A4C97583
+883315C457612A25B66228F0DAD951235506789F7A28FF56F1C508A59E902BBB1D7991F3AB23
+9929A9A2F685BB3E118B6E5793E02F0E2736906D55066F3FABAF1496701E222F8A375071A105
+F7B099FE89AE315C1055A6FA8DE3236FE289663343C505C3242065F98B70E09CAAE234F190ED
+1D390D7B828E84661CEE27D06457BF17775461CB2584A3BD4F77DDDBCCF2BE6332EC91594F9D
+302220C0A86700A03B5E9FF1D855B4230368DD9AFFBB079F5995DED784B263CD473301106B31
+004B7508BB89AF3DB9A5EAAEF43AEFEE5E7EF932D938F1261EEB54CBE6B2BEE373B8A0240875
+3CBF9B82D69A8175012C797D7D5AC00CB30900107A6F9A11C26547671E9ED6781B052CBB57E5
+406E4BAAAD4BA5AB8028C0099390F601C2E35A037EE2A43EDE75793EEE8C022783F6C8C963F5
+ED3AFB11456947E432F5EECEB8F574BAFD118F57E3CB87E32D38660B641B2F56F037562D38C4
+0C59D856F8C16AB4C31E130035D66D2440825F1E31C8219D0FC5AF9144F0C7239589022B4BB7
+B8A05963CF170966DAC808A353D453648E22C7991EE9946F4CDCB07E59C2830D13CB3A633A2E
+0E1581DC273970CB647E53E35606C735F71F84E1EC21A9063D63E336BF8821AE4684FB2ED79A
+33D944275AB63DBE9A153B9F9AB0C6E1E8D0F36E9E5F18502B651C605F5A26098B8B75959ADA
+D22A32A14867B1F9E7C54638C274D339DECE661C408D7905D6A123202E65BBAF0990B9AC34E6
+57185EAA501185C2886BF1F7C4D4A3F9EE03E0FC2FD643A798025348786A1A32F1BC119BD993
+808C276E4C9FB98325E80F7DAEAFEBD1A3390C4EBCEDC4FA59BAD19C7FD74215C20EC2B3CB60
+6C59E99C99CBD8CDF7CD332655DA577E1932AFB5860066331385ABED1E9A626EE1CDB415309E
+09EDF9DEB61C609D101346D2EA92A4F3124E3C908857E6E9D5281FDD7739532631050F42BBED
+1BA4B5E9FC8BEC783589F51E457437BEC87D7F3A0B540A8AF5303BCECE13CA4033B1E0ED6959
+63B3170BBD6E78A476C78CE1455D876B1C2E409B7692EEB85EFBA889E8D281FD401D3C040536
+78787583C2E2A896011FAADDB9F975FD4F63CBBBC1582ED45B2725DD243A9E497174E6BC2F72
+89F4647CCFF057536BC69CA12BFAD69BAE19985C907AFBCDDBD2C27EAFBA6B12508DEFE05C55
+DF5FBE0F087BBF51A9EC3771A86C6D2FA51598FE9C866D2000A260BA73D2642E2EF96B48B432
+B23B31556DCDED2064B6EE82B65B51E7A7ED6C7F53033E56584EAFF32B3B14F9564066B548DD
+B8C5F1CD9D1479C3E827271761D3DE59BBE5BE4C2CC1D76678B635D38F09BF91C445403C5B46
+BBDA656ACA060F44CF19F32DA5BDF05957E2077FF500E8C3D76CBABD23016BE639DD9C44A4A6
+3A1A3C2145A5B8D80C04D21AA8D4D2748C3BABF678A0BE0CDFA5B8AA800675C670A4D450D457
+444966DA6D266FEF1E5B28C00D58E66D5CC5C0AB2AD9F452406AF15FBCA7DB994B141DCB192B
+8C738351DF5EEB0B8590AC01139E1018B65894C90DF15AE82A906FDE3DCB71E8CA4317EAE8CA
+9F47C813DC2E649A4765E69CD2A9AB385D0E67F57195AD4B8FEB7A85487004D5BAA4A7DD4753
+AF15E6F60835D1015AFE59B8359F9D853AEC3529CE3825D0CDA6227F0B3BC51D2ADB49F7942E
+AA4C6DDA26EEAE688C92FF2F3FE853DBBB602D0DA8393F684A68439E5BBACED586D4C65E058E
+03EDD39E519593F2F7DAEC6D76064B0F41130458B778FF8270FF86D1E28617B9247256454B6D
+795B84F10EC1C129BC3DFEC6E38313B1A75EA244B2CBB5890F8BC555F9619C349B0BF2AB6699
+E7D28D47345156F96D9C027BF5F5454FB1A0120B4BBD5A891A80CD60780F6F8A28C51DD359D6
+428F9D3E7783F34A448584FB4B8375F57A8388A77872EDE6946B633262761AE0A13C2E1644EA
+2426A1AE6E4A1D166DD14A646E59BD7F4A2E2942574750FE66AB557430CF7DB217902A1BDD94
+D809E1C98EA12211C3A5DA0C729ED67B169D885E5ABBA823F4362C3511BBD3CAA38BAE3B0AE2
+DEE815F2425556C17E83543F4C02C6F218E02B990AA9BA3960F983C8CAC5BCAFC501D7429779
+40A7587661C0B01FC3561ADF3AF2158DB6458F4C96E720C9F3D68824CB095662865E398A64B8
+60CFF5A7489FA226296980355E818AFCE003BB27E329C5D1C041DAD50148F24DE287B0BBB58D
+4EAE3FCCF764CDD4E9FA7E429CC41C34D18015871C1E7529989C38FBC7801E6550A4D34184AF
+99B88A1EF81775EA47178360EFCF62F3FB4C94B19407D5501AA1A8EF92132E3B113EC7FAFEC7
+2217EE7E818308E81AE033268A6D6E61DFB25514C1D1C1CC58FD9C58716641A469DE902ACBD9
+87A8F0D18EEC197765E9B3A4DF53ADB2876F441B87546D9B07FBA76F81C1DA62097B5ABB63FB
+0B7EF64AA577F470AD3B2A837C03C46265536EE6E92036CFE5CD507DCD56997FE1A6E33412C7
+DBA6FE2ED03692B47372699A60F02BA8830C2DFF1127F47851CFDFDE7DDB31D4ED01DA67AD04
+6719EEC35C8D5BB148AA5DC34C5406FBC9371ED5B6AE557C26230CB3B35321206AB15A2EC389
+4DC048D917DFEE5925064F0C849E68D9F38708CDE398DA8BFFD15F248E22420D43CAFBD3554A
+A83F147AB6EEA9D136C2A4CD42F5D981774322E5265C1F932334C8FCA77F39153458AE50C0F0
+4771EA464F0BAC3BB3EFC36E1FEE3D156E5BEBB9B586FFB1FCB7A9421E877FECD53D0EAAABCB
+0FCFD7913417E344B9C6CAC979DF712724347D90161314BB20DB53F8FA858CE45962E4200A64
+FF72E2A3ED4F20D20C9A8E7E1858B5A4CB429982F2CAA97551949932B38EE70EA75D7C8998B5
+181333486C6C7851A53249106FE6B0AD44D3AED0E73C6CB198981D6381718AE017949A5634A6
+F74D69A19F1CFBF9DF6469A9CBB324B122E78E2A67D2C264A93D6BE70AD5F636294C25E154A2
+8287D844C2302AD7BC4A15E5C72EC71FB87B329C17CC85336022431D211F608E795C0EB8A2FE
+D1FFE514A46C3E43BB2D221ECD8E3969461AD71C9E49A70B7C4186681C860A4F0AF05C88A378
+C6CF3929DA01DAAA4EA65CD8506BEDEFE7CB57C3657F1DF237CAEDA6E78B53D92BCC1D853C94
+9B896A657ECEFFE27C7CA9FB9123FE085FBF19C91708DAE8DA4B5A2EE58484DB89B5F2049CD9
+EEBE8327E8933BB5F1BDB61A87A67DB98A18CAB2F457772E80791836ED9D2C917419752A4439
+6340F13EC95FEDAC99D3433148E6761C5BFBCFFA50F2641EA83EC587CA2FCCB58D3C9DFA0CC4
+6406EB1A08AD493D2C9A93687EA2D23686A6325EC55FD17FEBEDF4B356863FCD5D1B197D7723
+500F7B3503E97FBD1599F104BDA36DB83C5EC15301EEE7F558D5841771947421A7FC277BE480
+C4CF90A63DDFC96D8FA638F66FFBE5B617F976C0A79FB69EE7012575368390E80AFCD8EF62A6
+C68DFF9F18AE335427D8E573FA0951F3F4DC1AD54FC96D1BD81D0CD6A2AE31261F5038E8D10D
+324CC95E0E45B7A603FAEBF4D5514CBA354EF5A26733F6C2001725880D6118EFE2B93CFC88F3
+2C1D415BCDBA39D7B6C46DB704E1A86DE3A3EDC5A8DEEF8BBA5699E4856EA9F1280CDCFB0CC3
+2974894EEE27713DC5A50A28CD08CFC7F3F2469C61F1C30D1BDA0C60A5CCAD000A6F7343A2D7
+618E020288AD4E795AA291F7655AFD4827F4B50CD8DEBDD8C069EC960FE4A8C6EE39016FB670
+A51F9E9B3F2CA485B584588D4CE08473C51A488823D6C2C89FA8AAC5B84FCC1538C93DE5DF81
+C999B266DBD44574F7084690C637712F550B79FC2F13874C96952C041AA828290EBBC3D1AE9D
+C370F6F941F10C52DC148CC8ECFFD29F6BC077B29BCE07D977846AE559DD8A0D269ACBE10387
+74D9A0C1A6EF1E4F52ECF543571ACD113AB97C1A9427D61E2BD885CABAF18F6E7DE8D5447DB3
+1DDC885787C49DCD1D0FA7EDEBEDA9560B5F3A92AD7019F3CD0EA751585B445E946BD78DFCB8
+DF07CDCAC433614655E9EA8B543F1EEF2818D2D84CE5E3128E205CDE3B79B90FA027428CBB92
+8DBBE35738109C7398BA862ED99E1AC8AE3CCA54D99A7D478C8BA01E44A29609E2CA6B5D2A80
+8EF5555F03BC6B1A2DBB3BA3FB9AF564FAC11FAA4F6259B266C0037094C26177FAD04E27BBAB
+136D3DE649B490C5B402E709382F12E250E049398898AF33D699AD0A8A0A61DBDD4831AEAF3C
+CCB8E816BE33B9F5361288D04DC87D595A9EFCC51566876DC412E162E27CC90C8A468BA2A383
+21CF2788DADF40F343C0FFF7FD53B1CD89ECF804C0BB9522B91745A8A20053ECAFFDFB96EA6C
+CC9B55E9C92A6908A366C33E613905652FF1C7B8FFFB2F628A3FCA7467D02D61069AD98B2774
+AF69B822035A529C3AA02B1EA3B32AE73CB775E6B58AD3D7AE88BF70ECAA1F0B933CA53FE12B
+6881276E2F3376A24B486D86DCCB33BEAEBE4DA424122E01F85B435D1C2F137BB9D792954759
+B45E34E08764CFE662D2D278AA341E6F5A132DF106F965E85FD782BE6F0EDB107BB475F045DF
+299C33856F7047994B8B56B57DCAA3B619B65B6EF2C13934191436301DB81410A18B893A1C14
+761C29FB2183F5C9839CA7BDBBF771458BFD9187209B1E601F8F71C868A056F064ADE58D42CC
+2F5D502E2BFAC619F8F97E6831B5FF2565B1E471A6ED6ACF5D6D9A90D5B1E03E0F97C0B32124
+DBFD433EDAE6349BB67775A3AF6F4B16292082E1FABCDD8A1EA6472BF6D2705EBCE602C6CE01
+F95B0B50F71F8B9AFE4284F24153438C58F2D2A991FD12212405D1A013FD2BE13BA4D0C367BB
+50DB47B4876150F9D7741E382AAF2C9BF1F6D60FE69BFA031BF97FD5FB5C90DAF0C943D1B5C7
+89E39D3A810F817FBAC8B829EFFCDEE17C29EAF3A434806801A8D91E4B0D4B729386BD6A3BFD
+DBC9F5E829E3C83A1058A7CB6F9CCE07EB0E1CFAB6EBF2099A2ED4DC9CFAAE522894482D2052
+DD39E514C1CE6425B249680FB61A73512A4CD87A17C8166C71ADB14951909E6BDBCEA33E6303
+290C1312EBEF61EE1C6941E10629129A9CC329292F3C8C4F04B8E9AACB0B58CE498861261A0D
+B3C0D72809BCDBB7C609AD258609FFB7A289FEFB53EA02548DEA2861361C557FD6E791581F04
+2E01824912002E87275D0579AB6992F75AB3C05A9FEFC2B124003737B3DAB8DFABB5DDA0851E
+5DD9BB023D2B1008BC26DEB70E1B7C08A31D97CB70702848BEFB2B4E93F5482320A1EDAB6696
+EA3341354FE816223AC3E19D22D66A2C37B3308FD061159DA7435B23D8CD8802F798585BBE18
+2A5FDEA538F6DCE9A0F2F325C7BAA92BA81AC66C0CA474D6EC6582FAF83583EE695815E425DE
+E6108A29CBD94CFBCD588088C5999195C16BDFC04C591EB1F2D2F5B2AEE6B20AF45B7F8FB22B
+D79EDA12D9D4747C2E67071F5152A8A9BFF3C967ABBE27398BA99E2C04ABC53AB4A6A2843945
+9CA8771570A704106EAC90E94A08B2201DA4F8AD77AA5F374C0BD97C3A4020D4DF5FB4567FBB
+D0B0A5E8E41E9BF43DF6BC692E44E59349C70BE530CE11E648D272F916BBE4E0BF8D4C1EA713
+7E9C352E2F7EDD2F95A23A55A876463AFB90FE4423695407697A9385EDE57F685D3BEB60183E
+EDB54B15E7420F884D2E3456F31304A085AA121749CBEB653F7D0279F23FC5264CCD885017D9
+1D0D44CA0FDCD89711B126F79C5D1F1744730240D13DCA56034315C0CC87A96454D0319C45BC
+1B0AA8385D05526009260CFD3B5021189E579140E665DD48CC343610C8D1C6177FE5EB331178
+28A2DB1B08969A7BFF8BA1E63EBCD87D747281A7D932B49CF80C5FEF9EB020C56115894240D7
+49C0B69B9E6D4EAA59398033FD9A67EF434A08E68B5A25E41C20FBAF9052CF3575271F5478B0
+DB4331D6E6BCDEC5D7EC3E50BDFF1FDA94C88FADCD6F429DA4385A05024043014EC0166E1E7D
+66B20D76994B4B5DD9581F4907BF5A4D5AA4E85CCD8E7FDC0670034D6065E777BB1A59312E62
+884DCB30FBE50586F814FE16FF03CB7F2EF87B7832B53B01A7A90279F78CEFB509DF69ABB81C
+D4281BB3750A98BB8F7DC8DE58155288D497B7A8E2C73E1A5F02618AE6A91E25856B9663F596
+1C10605924DE652EB20D2AEDA877FC40A4EE55E671EDBD5870BE823E943404084EEDA29E903D
+CD9104F57E6E6CB116C5528E978B01E58ECE591503B89F95BDEC6491CEFEEC5F68E71E22B65E
+67A2A5FE5442EBD127135BB59EECE20584959F575217C2D1CDEA62F9460159B296FDC95F5D8E
+FFB8C6DA8D9393E1443938AB5CCADA399BD217B11B683BD374B5F4C343C918012648333A929B
+CBB8FD7CA81C537E1F6B482C96861148A915496F5FD3DB52314801BEF4DC77D7E18016DA85BF
+3015CCDC76DF380C746F719C548C320D58F32EF09EFBB55D484CBCBB6985B693750BF1BDDD22
+74F856B203B6E9B88BEF7AED198A6319D082895D7D24FE534363849E152B647872EFF375A9FB
+1510EB124DCA62D4B0312369062D4515632E0CD2F2A7A85926CBA67BAE77765B5EB0DA797715
+1A9CCCBC46DCAA431C97900944A8E884E6742A71DA6A1ADEB18F83C560F4054A30AF77927C89
+FE3D2BA126DE8F7F1EBDCB3FE41048F0046FBEC09D21B1B00A15FF872EBC39AEFDBD9653D4C2
+65B9500F08B7529B8C78D680E6ADAD9D71EE9C25F5189427D6671BCA1BFD24055737BFEB165E
+E5998EE525B84FB77BC6E4D3CC9F5C28E600C255C07354046DA33F6A7F3CBBE766B4B888737E
+191CC37732468B4EE9A5DE25D2332BE895278B5D779BDA69A7C45A7019971870F0E51E2F1694
+619E7BCFDC26632C45BB6230A74FE55884AC15E53DF268E7C1D9E5C2C2A4E5D7EABB91915ADE
+B9AAB6D17DE98EBCF263B6CE9CDC38C59924C474B728B7BA908421675C2FF02C97268353C4BE
+E72F8DB5E360315A6B33818426DBECC9B7E09D28CC760A87031454E37EABFB8FC75F140E3A52
+36457DB778E31B6A4A64E46F1C566F1EAF032E94377960E27F68A9320FB7A765B880E1D69D32
+619CE7415536D4C92C874A9BFEDF05D8D8FAAEB078C2C9805BF5C538CFF09BD4EF4779281AC2
+7F6F148B23BEA8B6C6867696A05889F495099A0DB25DB434782EBE5564704A92C2E2F9EB3D46
+CB6D175EF70AD23D24D92429B92EC72F3FE7D564F805A24A92ECC1D1E356C2B13D6B9A65EA36
+F9859102462F9AD70216730025DBA11179E7F1CF210DBFB107E17E777DAE95E4FB05538912CC
+60A76F3D9A147E665E182EB22BD71BDAC9F3854CB81215DBEE43DA830D6630FD3563E91C832B
+3F4749A24980D69BC656AD0BFAA6BF4B953A8EA02706AAE120C3561864202FC0AC8E97C72418
+015D6FEC3B46A88573B351221C4C290DE5A7EECCC5831E88E008EDD5650EEC8131508E4F95C2
+F0953C3092392C9F48434F1B7CC1841CE4166106BD2FB221B4FD29C3BB7473E9D6E2F376493A
+2E2E28E87268E069EFB8C9D9DEBAFE008D10C669EF5F5B0521A150AC1C317487730C5EC90A8C
+9FD382357CFEB61ED6ADE19C5A16379877EFE5217A8588208D96E6505C46E9742DF2FF6C8CA0
+AFD86023BEF8AC470FDE0280EE9BAB04F0B4ABE0369952BB8A7151D3E7284A3739E576918ECE
+3819202AB5462E7B7660F4140FEB4E8C3BD8B5A3ED1095FAE7262CAD95C818A00F991E6193E2
+C540267AFB1D5B11040D61CA0D3B94FC9304A23461316DF98C9FB20C8AE7C6FFB30342608686
+468F6837DBDCBD0D986C668C036F4D1535A517F84A327916041B56364B1CF27CB865F752D9BC
+B337900A7DAC96BFC00745977DEA59A4F58D4E97F14A590B7A96E9C50548A9CC00F4DAEA4CE2
+2F7214BF8FC1B3DDE237B1D7308AD69BB305094CA73E9333AA357942EE251915FD9109A705F7
+BE4012E8261823C95425BEDA026CD64564CD86DAAB7DEB969DD78A4657CF3AA476853EE2297E
+BA8E5FB9C408BE433C67BD6002DA976AF7364D1D86149F469B5E1A48CDD5F8CCE1030F185B10
+9F793914C738C3E0EBF5C918A5ABD91DA9CC990F025150E9317053F8DB8DC15BF089DA0D961C
+CC914D854115984CB7F3A9AB5F8CFAF10ED7E70637ECEABD9EF67A14697A2896F6B6600D8290
+3CE19651E71EF8C2B62038ECF1B404F7107C56C82D48EAB0B649875EE58A47882DC774BD2D94
+17C2C7412D9C69FFE30F9F954E5F9D605EDB995DCA4D94DE86A6BDBDF7675639A8179FE2B990
+E0941701818E1121AB7E0908744251B7B94D4D9418258ADA05AB4C4019F188732B8F2C91B79B
+BDFEB8BE5157F11971AD705427F7F1DCFA1D18C903127E7ED8F9AE2437E7B6ABB3091D3FC9E8
+D0AF0FDD342DB3A863FA0D38EF59A6DF5A3603B05E1D9F6601CA6216EF5D357C4A703F1EB08A
+35463E5BB5FD20D92E59FAA8A71EB4271C48AC7CF9B5AA3A465AD7CC3D39A478F3E41B7CEFDE
+FF5859BA22A4792DE4113702AD24EB4FFADACEE34F458ACF49C0145941DCB58FF7F05E621B39
+9F85BB3423D913235C8D5F715F5D702CEC5D0574A5C55F45BED0D6B6E1A9CAD7C7FD593406DC
+1BF3F29F49C3C740C6E4ACA8CFBD149A01E11198CB6205CE6B8E49A5B75836F8F69DD9EEC1B9
+43EDA946082D45444F656019C8EF2C07E77FF5A0D98A5A7EF5AED2163ED0F7525404F89C1BBC
+CA903DACD8F99B3E2930A106B1790488685021508F0C95D7C68212C92A1BCFC84E1D28E52791
+77DACF3BA98E3CCB7FC84BF0CE96BB729FC7F56C5361660EC8D6FB766337CE8AB83116372D4B
+9E74F5396964019E920E8909797221D937C0AD6EA47111CA7DC7A7F819FA4ECE0D9B67F6CABB
+CDEC65C362174C36C1CECC3CBB4BEB1BD2818AA8CBEA349CE715687A417F050ACE31C842E177
+EB0FB416A36921DD0B4328C5FFA724C9B4DFA784151EF7B90A3901E5E453D668F3F3E385322E
+CE5E3465707C5025C622CF651DFB7EDBEAD4818C5756CDAE6B3056B2A23D503EF88293EA63BA
+A265C63EABFC6F316ECA6470652CC4913E5E3B44FD154D380EF74066A5E5D9F76EEEE2338B1A
+276057839530D232D4EFD7FC47E5A965C29204EF3CA7335F6C4A7DD37308F622096CE55BACB3
+A8AD48BF527E89DA9A9BB2E01825CBC4EF0699C95B3E2586BDAF90109BEEF335681CFDB20C03
+A12763EA02126FB9DD29EF40F4499BECEE99D9C81F1735F5D228231D3F1F7F009A84E6B7EFB9
+AD8C951243958D79BE9FAA0439DB7CBA884A55583DED7281D0FF710974811EACC9888D6D2F41
+302E36DB522CFF17D269021D2983B358D2A43B608F80233057785F6598E4424F2CC9B8DC8FA8
+A5DB6E5B79F4C69C8011E673502CAC28CAB5C7769D8C1FE73118382D17A3BD983049CB9055A2
+2C9382D714448FB3FBD54A3BC94989251121C07BFC9C44E236EA02A231F834B10E6F57B2E377
+DBD7F89B8224F054D23F622519818AEAA5AEA5EC840769CEE6EFB1041899C2D19E14EF22DFE7
+3E1140631D4D19925325453DDDD36A0A745B99D8B6CBC7ACE830EA717E05270834B2EE7F1C7F
+9CCDDAED479D5886FA50E9AD6C7B913D3954AC5DA31C3060C06B881CF6C565395BEAFA871EF3
+9335C7818B19F4A3AF2A4C47932B0CE53EB1DE4185383B22CACE28E3956A6D9746B9FD12BB78
+59834EFA16918E73D2CFA07D1BAC41285F3A99C1085B03444303F53E7AA501AC7B41A9FE6A4A
+68B0650BB4C34906796728D1C5E1BF448113F43E3CC26C3A8C01DE252AA840F317503510ACEE
+3916D3D064C4A56EB9F2131E43EE3593C7EE90D56542FBB25386C057BE0E7149E32AB9893AB2
+36E43AC57D93B65DCB42ABCF364728FD8E99DF6D5DF1E1C09E7E3731308009503F5470FF6AA7
+5EB5C2D92CF33E240481099FF50A993BA5AE2C2EE0BCDA4EFAF1210B1828063E8FB770B22BB5
+E30904A0E2EE82350A1268BC31FDD250DFD202E19057540E74EB26886831625173A44CEB0CD8
+5AAEBB57173FDDECF40E56E31112D069FED12FEA970BAC9B911DF107005FB653D8BB23FDFAD9
+382D34E238A270CBCC9961C4708A0B349695DA4D724454449A3454FE6A4FD1C7FB7D0B277DEF
+7E95235622D76A20BE62FEBED014819C6328CDE5355755E18CDB20CCD0C31D2C3C7384CF52F7
+7EEBCFAE17DD95A3BCE9636D05E8EE111163B6040F1C77D116E26A075EA7DDA95AB5293E5010
+00B67E3A3CA0010266865E37EEF79D8998D60D9C35D35623B11E753B5BA51BEA5C7A9CA53D75
+DFFE45EBF3F6D7CBF673525CBF66F66D2A65847689D8E7B1467C0E4CE5C62AD743AF8CD2A306
+07A8C7628B281FF22B342BAD00496C0D8BF7F188E7D86BE52489F7737892FE258589767E5D4A
+9EA2D865F3C684060803966CC25B66F4397DFF38350927B25C8B1641FDCA8F44F7D94C856DCC
+989C38336E155A5ECA026665FF423D2A61170BC9DD8D2356BCA556C6214E3136ECCD73BABF78
+ABE1FE3C438F83FB25A87840EA8F2F7A13006192CD837BDAC335FE4D4DF7C31BACE332F5F666
+955C6CB83A377834C85083C2535F76171C6CF68BABCE4CFA6251D44B73A32A27A802C0A92E0E
+35153C33422C4B558D0BA7452D3E15B42ECACA6137F4C935B6C9DB5373B060E8E339D3415118
+2B7F482F0DA57D63EED98C6EF65A47A635A7296287DDFF7B053AA28AAB99FCBBA2B3C4D81626
+4ED7B22AA5BC05B5AF9E24D153F255445E4D9A7D51AB56B74E9D264E38406FDB071CCD9D0E4C
+2A7A05C27F30A6F8FB1C4F19DFB8363FDCB8F7279148652C529915CD751B4DDDFD9F527DB50F
+1D66EF07D4D6F1D2329414172338D9C20DB300B2051DE1CECAB6C504C0ACA76A1851E337EFFD
+4D037488EBE7BBA809FE341667B3A63597D19CB1BD35E21654E120E9609C139400999F58FAB5
+0D97640649BB4C33BCA45619C0D5875634EC3F1757CD071EDA5E21B9596C14076D0F487CC9C9
+4A9EC7ACD1DDB5F2AD0FB5547F6C7B239F635F05BC63FB598BC94D17ECC505BFCDFEE50EEFC3
+A35C9C42350A8B3921C90D8361D530A3E96F8BED354EE2B1CE41CA2BCFFB4960CCB60D18F190
+B1CBAE9EA71281D500AEFE62CA3514F0DB65115FE04930BFA0512A75F36B601D6C248A222CD8
+0209BF0DA5C083DCDBDE92C16E2C2115555797D9C08EBDE88C54CEEF0C55F5AA56822A896BDF
+D676A3F40A934B498CB87F8AA7490227D0FFB00B236E6C8D7DA47CB29CA3D4D480FACE647EEB
+D3C1326CFDA0A70A7B1C76CE01D64864F4C58DECF5755B4A47784F352CD3ACA44B9D97E837FC
+BE85A22615D030A045557CD77F00CEED50B113D055FCC977006CA7E9921F5914BCBE724BFF1B
+AFA2CFAC43C51B79B6D2A20CD260517668B2F1E03DADCEDAFB66301779EE57E5D47DC5722AD1
+136EDE900AE1FC2C18E6B9A478CEB84E1D003638D72B910AB7B1A658B587B0CB0F89E7B4815A
+04BEE8E5967F111D0674A90BB280DDBA29220FA581A7696E5A58940E032B604333A6FCECE6D4
+4A0AE57C3284B561FB7AB57B52AA186C54112AF36749B9B20B4EA8137E903DE53DA31AD92FF4
+63734BA90AD1E00C372D179EC120A06F7664570C8DB5B7DCBE8A64D04DC067418C38403B67BF
+40817BD1FB7E04C544A062CB0B577DA87ED73A48BCD479E8673021A43E57B9273C93D96A595A
+D7DDBB3CB7E98700D450220D3FD36CA6F36D244531820C14F1EBCDE43E0511AC5C41CDAD43B4
+9813A7A219288001E09883167AD8CF20BDC3EE0CBB41E903F50AA6BC09D93CDB23ED10DB4899
+1D8143F00E5B3A4D57BFFDAFD6701A5E8184CD1DA59AC9BC11CFFB0F5F672138505EDD28BDCE
+63CFB45E66DC501FA87C91E739E1240465530628CC0A6DF20D2D22664108026551612E67B990
+378FAF0240CE78080E4880321F364C5648FB2DCC983DB8BD56E2494804D3E480ACBD52C56C66
+C848E0F9C00D0867A28BC61B182D056AABF530158454E29217C227D9BFE605A23877384C1D14
+79B577D16E00617ADC22EA11CBE99B8A8A43A5D45EE1FDEC3C71FACED9DD35651F40C691BFC7
+8144B835A2F3F31D09E0C6ADD2274708C30A05F6CDDDEE71CFCCA670C5E5F53D2B121A58905D
+C7E8BA93FFB7F610754054F291F3005669B8C54492F509FD0343A344DA511F71FFAA705B9631
+E3B99D0C1C43F04BCBACB678F453D6C18F2E43BD6B7B98FE883576A907FBBE930846E190F1AA
+576154D647C78F99E671103CF161327D6527FA404C21ADD7A160B01DB881BFCC3413168F6A04
+4ED5CD6F2396D1D2512C47E5A4B4BA7EB8B4B61529496A18C8B64B0D52E73B4B53F4732381C0
+2E71061EE7C2006C1349C9ADC96C51B155F2C5C7C9C311EFF4E3BDCCF2F68D4367E91281B446
+4C786E6333A32DC3CEA8AB9B69CEE05FFAA6B3175BC2A43EE6E3C38AC8C1E0DB58CD4A4AC88E
+3970B01C6FC14DB26491F15AE66C2A8CB847AB17190B135F1F307E504FDBA12F13D1F3BCEE33
+83308E41BBA79F20D3077209F744C6E875D50D0FC830E886C4444F9598F183FC5751BD96A79A
+7647BF3D75F8C332515B6F68AF8DF63CCB119CE341287D9027FA4B9B2A34153928AD3248F994
+8BE27DCC5D118C2267659A42DC7E38AFAAC03E91F16B913A8541FAEEB7BB460D4014F607AE96
+63133C8B67FE9B63748806156DBE52BB651D759DF4F80610530FE195C397BD2F4BF2D202B840
+2B98D796372571738F388C71FEA408881EA131FF7BD3DD89E44B8962FE0BABBBB6AB308DB487
+E18147EABB4C3089271E4E12C03704F2D56555A84C875147C809A19849C4A247EA9B461AC3DE
+8E6222FE7F6388355C0007F940FB9A53FB2AFE2D8832A3230B6F8EF06F91423C947AA1624540
+91C4BB73839CF35F039F89B64243DF6E619C73A7D7030C216F5072E2C6697E59F7538D6B6A2B
+EF4A9603E1019F81FD668F97A83D04DC075D90F111CBC54873A85D41F5D3C622ED39C5835AB4
+7C8026E070F5F0F21017CAEE9E531752101D2EDF2157CD18546A6108CC952F81B49C8931732C
+77A15C7C912AD52167992992FFBB1384CFF93A5DC96171DED44C94A9682E4DC6D43F4E65BC55
+466A1FE60C8479A6517F5143059A939BDD758E486F68D202EC1F9282C87CA6CCB90E8B7DD31F
+0F8D5C3EF5E39E3DBCB430BD20A2E6EE920FBCA0F45AC04F9728FA5BB51991E57AF60C86DCEE
+08DDEB28338B18B26FFCFF2E00F2E08E601FC3C5856553FE1099EA3DDE8F38A5379D4572F874
+1DF40A879032463D853EBFBB9F33A6F7202D342E37208AABE52990DF698E5AF7C649A39B4843
+D8C90738EBBD3024AC018A74FB45F4005CE2CDF90BCEBE57B5895150FC7C70B65E805A16C9DD
+B3B5BC056CE822EA9B73624310DFF7B8D5DA359E40DA626E082AE237DAB20630D0DC5307F252
+225A0D68CEA6BEF3B110D27E33A80500D6C36D650BAF58FD5B349A3C27B0061038BE52085CF4
+34E3651D5B82D82F6A66800CF50AB36993F9EFF1DF41D45C24F1FDE8028B92A82A6637487065
+9FE5D931CEF9AE89F6B5F8191A9306D221482B2D7C7E498C7C2A69CA0DE587D6C289C9D8DE6C
+FB7463D4A94E5AA283AC13D9E1F6FABBAAF3F8EA237FB69732FC6294F741F545FA910293C6AA
+320A91704CFCDE65C8D096CE49450C4563F1C6F7D05FA1CAAEE31E11A8865CAC0DDB5B4DCDB4
+8BE24C514438F99CDB3424D623D90591D0308D63DF28E577DD52F13E262D4B71589CF4586F77
+4169C2B11F552E967C91AB07493A4248D31601F1BBC70E7E132C6D00A5756612EC7BEBC60E71
+E745346662EECEC920C81285F41BC79C73845BEEFA19D24DE9677186E08C011BCAF8641FE51F
+CF8181863EDE318FA2348A7C9657A7EAC016FAB8E7D0FD24DDCE8C156054728508306E47FBE5
+5131C59279A69337C7ED16BC5E8EA24E3B66B0D90D43B5C8C8626DCD8D20912523EF674FC5F1
+ADB07434BB4407223487A81D3908DBCD2AA0A422377F8C2EEB31DC7DF6F1A07A4114841BBA75
+1E1076BFED2A8A63F106033A4C3144BC859EF9DA9CF66A0A523AB327C91B39D31C55BBDE1A64
+972059030151DF7912280213974DE6AA50864F14DF0499A1EE6E44056097B07B5FDCE23EEB1F
+FF7FCC4D1E53C3CED5B91656FD59AD4D489655FB80B79DE15AF47C0642408ACA33909DD114EC
+EA874DB8CC24AD7991BE588481EBEF9EFBE250E5EA40044DCADBC61EDFFEE9779374B3928A25
+6F4BD960DA24A4777654EC08BF07703511561FCDF8FD7FD12E785FE69163536FF0234448C4BA
+D2015A73C7FE2DF367B6E7176D701BC58FD370EB328419A3282525B5D1F11E171A9CA9C817B4
+287BE9AE9160A45C9387E64651FC965C4595EC42585D1EF2A8BF3902AAF30C7BDC021362DDB1
+C9241FA1A7345F8506199566255CE06F516150B261D6E725D00ADC0DFB1194C70588084653F5
+35902B9C7C2010AFDE5C28269E89433C4BDA53CB4D9631CB209391105114B1CCA9B974D4B828
+658C9A29F7D8801CC625546B1779CE3DA272E629F31EA96758A0A26229BEA17C4EA237E463EF
+9E57002436C568E35E08BE1A85C70EC4FAECB33450B7DC1A0D079CDD4F337E7489C15B4974A0
+75665EFC2775855376497F98B31FC41AF0933C9C5B724588FFCF051489F09AD0E81D23E94FC4
+29AD1498DB1BA6A4741C0C78D8109DBF03EC6E744A08D62D928358C863182DB2AC077FDC2823
+7D0E02713E1A51FAAE358F830876E2AE5FDD65FCAE3F360A3824F99A4C1266FF73315D255768
+86F0155FA323CE199EC91B6BCE788D94CA8BB019C41B75F80F620BA0A0D446C697490DDF7EC8
+2BE8A4AE11492783638D9917B852098D7C5D8BDBE6EC2F240F998FDC48A52CD2781D8D117B71
+13636284E7B1F9426E832096C14E0CBD5B650A56E3717F6173FFE12CA28B63F4AE026CB08CF7
+8232D33B78901399062A7F781CF0334CC662B0D66CEDB1C533FA8AA604431A2E9CAE351546E7
+9BCC3A94307719BE9C5517AA728FFA84C9806BCD43F30FA7DD35540D0F2F1DAE38629E20D84F
+6CFEA1045B36B9BE15FDF13F2EA336BC81A25A7A5FBFE011EDC8814183331366F44DA4CB608B
+0C35C071DC687369D1F08391503B17C2E1A82BDCE9333DFA28E354640536C91FC9DC42C159D2
+FAB84EB5DEE14D2EE7D623FAC19F496D92E61149D8D2005203E551879FD015F342A3C0BBABA7
+C4F640C6A7D696CE34C74259371910DF3185F3F35F3097B28EE421CD09E76ACC26A63683D620
+5BB1434E1202B8769E11F6AB0FA1928357EE8752132E28158301C137B41DF2A163FA6C958A4B
+3E1B045B5C71E6E0CF458ABFF701D3965B01BD1804D3BD09D5643FE6A1C97F2EF0BF24C0F658
+512F29C71E8D1928E1B86C259261481D9B3708790378D975A6C332C69F8ECD76FC1C83B0DC10
+DAD8297E937B53F968244018675A7330048E952B57542314487BEF7AFC39C60DF0FFECA45617
+12D5D1AEC9B3C3704182AFFFC388E8DC0264E40E840820D0C8AD91D01C990E73D066F8E195B0
+24D8B26630D8D81509332FB73170858C5FFFE37359792796C95F1F7E9A09838CD52065496118
+D4D914508DB95841C72F0E497B8F5935B9534873AC2E27626763A3AF3253571D624D681EB918
+7A3331CD50EE937DC2944507A7A6C231E5A338A8404BC66A5663112E159E450F22909BC0545D
+4A8E4158539A015B33CFBBC6F5A5E669B0F849839C47B5207BA9FF25714BCF6E19EEFE7DB796
+4E436E60335C5A44D996FC3822AB770FDCCB8DAF0CD94D36B8C85170A435B5E7504727D1A014
+1F6F3259073F6F1DBF4F291D8D323F727176246231728B5E86EAEF55B4F752F67ACC96C119D7
+1196D6C906D910B60413F2EE5A0EBDF5D002C251CC63890A1DF88F4AB550BC81638CF05E63CE
+2749E49232D640595B071FE96E7E20DD50A7539FA61AE3157C1DED1864731738CBDDE05AAEB9
+1444766AF81B32A41DB0DF19E48868BFEF71C6F8529B0B1A9ABE99799EE6ACF096ED7D4D86F8
+80EB51529AD53A330B47E40AAC9BD0385EB0C3700BADF83D6F0FD46FABB35FD5B309B54F71EF
+8C43D781D9834690DCA79E4362B72B92C3A49243270F41EA3D97B756DD7628E9842B60375220
+B1C219ABE3A63C7B96B8D583378AC9044288EB4304E258779600FB3ECF995147927DA7A43A60
+ABCB90BFC5C8C4A6E6474C365421F89393BED828C29C8354F649B94EBA27BE4E7A35895EDCE8
+6027B7B021E103B7EA2BC5B70D6AAADED5DC78F437692B5F2A1F75277FC103AB903AD7F39C2A
+3F18091B3FBAE4E90E86538E4DEA6F519DF4F8CA16D195CAB7C3262A055E9353605BFC82694C
+D39C35826BC42DC0AB7EFD1C9E047923B2623B0EA4BF9BEB9FEA18541F979948F2D34037A8D6
+FB053301265A5F1C0481F2DC8952D5146256C23AA0E11C299522462DD823FA3FA293ED5C6E9D
+6828F8B4B958FD20BE2BB93AB2C0BAEE2AD895CF61066FE22A6CADFBE7B549EC860FE43448F5
+D179EAB4204172175A9615622E0AF462006B589C689B42FDA4BF5647A0EC71F4DA2131A0C927
+1732EF9AA017BFE5AE5E2A7AC540B3CAC53C70FBA6E2F1F4A0D458ECA80A182720303FC4A345
+EC34E90A88DAC1D6305534EFD0A919AC1881AD7390DFDBE624E741F53275391B954051AB2775
+B3D119F6AFD6772F1F58388E2BCDB0F10BC5B29EF29F341FC8D98DBB28E22CFFDB9833182C60
+A9862261C55149D5795DA18D3CEFE9C5F5FA51D6EE292F60815F809EE1A5FF5B0EFB49041005
+9A24EC48173693CA6C4D6A2312EA510421B0D6C844E831875219B249B94C8BEA53614796A284
+A20C7FBA517811E9601415B5E69A82C05FA6C8132318EDCFB87D3456CCF1ED3DC83383EC2310
+BDD807DAF58A4A97B6D4DF6DD896F1004D70B2EEBADF5FA1AA7AD5D93B4196D3306A74488925
+A20B7F703078E30F9FA68CDD5083BEBA6CC7417813FF375E7B9A7DB7DCC137EE043FBE282DFB
+745FFC7B44CEB5C4BDE89C2D11CDCCECC829DCE6296077BA20005893173B392491039919F4EF
+7B0B1651FAA18E244137FEAA0FF9DE7E3B4894953D60BE64A570273A06CEE6C04C531BB2FCA5
+D321127B7440221C4BDC144987249D230934E324F3F7052BDD6AD95787E54E7EE718C8FD8AEA
+F99350DE589443A38093254F9667535398A3DC56A9D37646948F5E4E1E7F5B609B46A6B14ADE
+3BB13614D2DB0AFD35C2A3DBAA1848AB88EBBEC03310DF30F4D00D7CE13C29816C76EE52156F
+109C7B61058CBFEAAC1327DC2460905F846D9B2BDA6FD43736B2C2A8FF5E786E35066B46A8AD
+1AA8CA2186EBB59C26B5AE6C75C75680A5A9B0E76CA4B196550000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 161 /Gamma put
+dup 162 /Delta put
+dup 163 /Theta put
+dup 164 /Lambda put
+dup 165 /Xi put
+dup 166 /Pi put
+dup 167 /Sigma put
+dup 168 /Upsilon put
+dup 169 /Phi put
+dup 170 /Psi put
+dup 173 /Omega put
+dup 174 /ff put
+dup 175 /fi put
+dup 176 /fl put
+dup 177 /ffi put
+dup 178 /ffl put
+dup 179 /dotlessi put
+dup 180 /dotlessj put
+dup 181 /grave put
+dup 182 /acute put
+dup 183 /caron put
+dup 184 /breve put
+dup 185 /macron put
+dup 186 /ring put
+dup 187 /cedilla put
+dup 188 /germandbls put
+dup 189 /ae put
+dup 190 /oe put
+dup 191 /oslash put
+dup 192 /AE put
+dup 193 /OE put
+dup 194 /Oslash put
+dup 195 /suppress put
+dup 196 /dieresis put
+dup 0 /Gamma put
+dup 1 /Delta put
+dup 2 /Theta put
+dup 3 /Lambda put
+dup 4 /Xi put
+dup 5 /Pi put
+dup 6 /Sigma put
+dup 7 /Upsilon put
+dup 8 /Phi put
+dup 9 /Psi put
+dup 10 /Omega put
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 15 /ffl put
+dup 16 /dotlessi put
+dup 17 /dotlessj put
+dup 18 /grave put
+dup 19 /acute put
+dup 20 /caron put
+dup 21 /breve put
+dup 22 /macron put
+dup 23 /ring put
+dup 24 /cedilla put
+dup 25 /germandbls put
+dup 26 /ae put
+dup 27 /oe put
+dup 28 /oslash put
+dup 29 /AE put
+dup 30 /OE put
+dup 31 /Oslash put
+dup 32 /suppress put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /exclamdown put
+dup 61 /equal put
+dup 62 /questiondown put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 94 /circumflex put
+dup 95 /dotaccent put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+dup 125 /hungarumlaut put
+dup 126 /tilde put
+dup 127 /dieresis put
+dup 128 /suppress put
+dup 160 /space put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+/UniqueID 5000793 def
+currentdict end
+currentfile eexec
+
+8053514D28EC28DA1630165FAB262882D3FCA78881823C5537FE6C3DDA8EE5B897E17CB027F5
+C73FDBB56B0A7C25FC3512B55FE8F3ACFBFFCC7F4A382D8299CC8FD37D3CEA49DABDCA92847A
+F0560B404EF71134B0F3D99934FC9D0B4E602011B9CFB856C23F958F3C5A2FBE0EF8587D1F57
+74879C324E51FCB22888B74F241550D7401EB990D4F3A7AF635198422283CAC1B6CD446DDBCB
+D915DB9BFF88844E784C6BF7389803D9450B0C21756A017306457C7E62C1D269F306BD3402E2
+66DEFC3B5E7D8A8D2F5BF0FE6DDD40D07391DF4FAD4A6018DCE29A2B8F692B29F2023A7C0E66
+DE8ED85C14F1F8492167357F51A7E84CC5D92E0FEE4D81CF7FBC8DE52D2E7BB57142033993F9
+C08C315ABADE8DBC4A732E84E142D3BEE51557910E12CD8AA37C459A5E6B7F5269F59078ABA3
+BE4641A11AC48D0B625C8325B38EC08E4C9E5E7FED976A5650D99D82114F449B9CA14C4EC957
+702295A39A93EF93F61899B8EA06B092C3C1E503E6E436E0A9FA22576C8930AB3DC8C20F5D82
+B69CDDF8FF4DACFA9C54BED5A3AA3EA5B129FE96BE632843B9B6BC91B615581A985DB56B1E01
+CA60EE69CA92CF5C0882ECE62EDAD3E106D835348822400F0B66AF658F2AE56ED08F8B001057
+1807009B73AB12A8CF14CA6C71F03C2A48C500F9D62266AF154A6375FF600D9BAC3F05CE3414
+2D6867A79581C533176BB2F3117336671E2E44638A97167E2EA9644E31EA16C2AD2990EA33C5
+4001E0C8156E6DE8AB6A4D40A7137BA275F39589FEA2E2DB8256ADC103D6F9CC038037A47E8F
+D469C5F98A5E3C15BD4ACE40D340018B1CFF7D1ED8ABB0AC57B5B5A2C20A51957B96C453EDB7
+DAE5AFFD91A46D938FE0A13363001D844DED4323F1EE6D30012AEA19B024A552315505535C85
+DC26BAD31E09C50E6512802976D298C4E90D0044C362E6BF3AB362A454EE93DE25CE54411090
+C29E9D75C80CE26A84404BD9DE3AEE0E3F921AC587F907572B8354A5C3165EEA7E8B2BA4E333
+802132F760B41A900C698EB3D2738BEA0AAF7AAE96A558F08B61AEC7C7D65B2889BB7B99800C
+FFEE5BA19AC90FCE11437BE1DDFCF0BCA5670B543B9644A71C8726D0C1005ABDB96F6E0CF7CA
+AA3195017CA81519151C2C0B04F81E717C0691B63A76E9B25329CE2625B711CB7BF99D23EC2B
+B5EC8AEFB8C1A3B422AD617B3DA4D49685FD44CC21A1FE5E1541163AB3E1594601D63C7E9880
+1D7746474377CE93F81404F3570AFBD5DBFE77578605917AB96963987E6EFC2D3F99FA56ECAE
+6422579852567F90CC90E4EF6D6F71D1858270205477E221018A375CA83C572B3F972C5181D1
+8643CECB04909D84CF767174B3C0C8EC69BF1E9FDFBC0FC7ED97EC67D878EA4DDAC8CAA522FD
+C6932DF721B81AF837AB56B547D4799241310D6692918FCF8A46189A78D6638AAD7CB4462D87
+74EC73D184076595C94C0B4A8233CD34F2D92F6FF94F941DFD589DEF2CE790D5CB2159B95333
+8C7384CB68C11779120A68BFA20B993D8C0313987EB96A2EAA2C11CFD838E6AA48A89E6DDEF3
+FAE1A1B078BE9787140270556A96E2725A8CF1AD46FB52938900730154AEC60F544C3D49F176
+3861F54B46A3B70315B46EBE51C42FABEA87A5339ECE2B64270749188D73A07E0E3866EF9AAE
+A996FA92AB443C08FB8A840DED26BA68E94CC23CC1F6968B0F3C7E8F4FC0C5CAD0F7A332E7F9
+55287ACF2485539C7B652F7A29D9E4AEC20A8E023AEDE26BD4C761BD3561269FAAC6FD5A651F
+FFF9211F8DF220994DAD6D105A92D5794CF2AA526B2143C7150BA584A2B597F6982403D93073
+CB066B569BACF95DA04B4202BD24059A8DBDD3ED8AA9E89B2788F3B078A81A557BC743C12A1E
+00FDEFFD030C032E81DE3142A106C0EDE1BC9D566440BCEC4260295CEACDD54BD0E25F6B9DD8
+FAC41F453BCC731777E1E6ACAF37A8178D11BE1BEDD6681815F3D5EE8D240B7CE9B14FCFAFD5
+04216F26DC2827FB0F6158416EB24F8BD7616EBBFE9378718824CC6E51135F8F489E9A55A0F8
+40608A99A32EADE4251F27FF86EC7F324DC9B534D7135E30F2EC1B6D93D7DB919651E03F30A8
+82F2DFA457D307F17751532AD70E632A04A63CA1A507FC6AF4073126BE0127D86974B426F489
+FF62A53C1986FD048AD76454D42BE16A6060101239B138BB638765C46EB006F7F8DD312337BE
+08D4381272FCEFBD74B7B2EC098B436365586A832721A0113B2BF1D853FA8B062BEEA25CABC6
+0998CF4D38B49A3F4BCB372198A196C9EB6DF2CBE59A59858AE212031C9AD7FBB9C3E8E9E6DE
+45DCCA521F3AF361282F7B3EC507C8B3AFCF18B9678EBB2F11C01C9DC3C4FD3134C5A3DF6B6F
+4C75EC985466C4F505847F1475C91E5D83A6BF754837DA02F9E868EB0DD76EC4D31C8B1ED935
+ACCA73E1CB9B4192BB0A853F947228C3064E8F923A9133EEC9C52C626E29689DD54FA433B970
+2636FBD87C5D81C4F278168783509D5F4256C77A855C97A48D18DE6EE1D47C7C33E9AD227ED7
+02F120303731BEA6F3055D764046EED36A06C75855A928084C5773168AB985DEA7CD767C780A
+91E740E6E088CB93D43A489145030221DE0E1B2DBE954EF414B9568F3B1C5329F5FCBEE927AA
+23309AD22E10F9349B6CADE7A090D19B9460405CDEB89BF1617B2C297AF5629458235F1B8C95
+F5BC442DEBB34DA5D20B11E96660CE9E5CD19A84AA54F42B106FC87C7C0405B0CBBC249950D3
+A7C353D691D77BA031C840C8F43A220CFC749CE34C2791DD627CA074753963D2E59794496D55
+AEC96FFD48EAFDB29F8ABC8D91932DD5B01F65EBDA034BEF3C7219E097670621058662C5BBFA
+A939DEBF999E9F68E5C4E64CBB0774A9A186E741346103865FEFB088AF547545CF7763DA0664
+96986377B587EFCA5C9EDF22EC13D1AA6F483C4A0ADDFE395F83534D7BE5285E6A207D53A8A9
+60ED89E9BD27AFCBBDA23B2D9876A8D8CFCC299990D521E076CF8387D514570871376C21509B
+95EA15CCFC7278851F14DE8308B72E111893F0338488BCEDD0F2F8EAF07326BF97C3727459EC
+89F8121C96A45E3DB1C63D478D0A6DA5F5E6834938EF1CA41B910F25A82F2774E3CAE9F1909D
+BE21EE8E003E27B84C43B39FE247B8E19538648F246D325357A246365B9B2B13DC68CDD7E44D
+99D86C642565B1FC376D2E530048B27A7C44B6811719054D3AC99CBBF5665AE76F11E2781B8C
+040F73454BC794B1432E6C3A58BBB8CBEF345D3178C8D01D6B26BF7F485A5C3BD36DD01F39B0
+34E536ABDC6632EB4038FCCAE0453E85B3BED8C3D4620A2AA2DABD0CD93090E9B8E964C491C3
+AEE45B592E4EB12970647E2A5E68BDA429F53074257C02975268F8C28F06350C26646D658008
+FAB0562F40644EDB0FBAB79826B16CFFEF1302C8A13173CC9CF7C8FC906693E486FF096B2D18
+E96841A5FA8A34A5B4B68462BFFA48102464DC22EB50F1F80A26E929D4CDC4B90589266915E8
+433D46D433ED8920543777360D25546794CD9A3A1EACE8AF188CC18DDB9DD1659F9FA462A5AC
+E6A6AD068140356E8C1E48DEFD171947F78F086C6E267FEF13D16EE68D0FB0AAE589F7E090F0
+88FE80BD6CF8EC0EDD28C735748FC6E7FD421E33B16EA6319937D2D63A94AD76F95B61813DB1
+81A113274D5F3B4DF5EE90E69FAFCAFBE4466F5D5F48EEA62A7CDCD4F9418437707F706B290B
+86C30FEED99522875EF5E2D491920983BF4E9F1C71F20F1B9645E30521EBF2F1C9010103C60A
+9A6DB7E6297F7C3E29CB150307FB7A1A1A94710EDDC6AE88742CC7044492DD7A217583C99A6B
+E7B720246FDAA00683A3B82EF6BFA87F2FCD741AD8BBA68B751740435DC6AFB1BB88D1593DB1
+52CE92C19E1AB29C8E8FE89477CDDBBE29B8DCF1EA6F70990BE9A0425000404F2F5DFBAFA35E
+70BB87066464C992343E8BEC66EF483DCE474F3ED7953DC1F6BBC14EB3495704D1765D0B3285
+A05AE494342F6B70D9A4241291B3147C77A8AC0E08E5BFE60C8B6E2048876A6CBFAD8EFE4860
+95DA764F4AB9E4D8153F89BFA2D9BF2759826EC18F64F1AB083949F4BC127411A477D4C24D7E
+0FB0C96A96A31386CC5892B398D48750FD09638BA6D62CC685688E79AF31F13B744F395984B2
+0AA483FDA558C6A91CB9AAE9053E7A5B5B8659BF0631C543F4C370FFB006290353908786BB5D
+B373233C12F3506E2C4DB0D59C1EA8EA75A7662B90C4AC1561303F4FB8536C1534FEAE4ED772
+DCB49734F5285FAFC99FBB081ABC3DBE87180D9BDE2A844B054D8BBBBEF5CEB39F5CADE252EC
+6164A74E75625050CEAB8FD8D8513550D4420FDFE6FDDCBB816E204115614FE82CEF36DB23A7
+DD31CE6FC923B575EAABEBB5820BB2739CCBB41BE2A4A95CFFEC9332DACF05936A3194AB4F77
+39E5B4A868A7CAD3B1D940056F84B41E81B072C02C0D0BDE7C64DEF54B1097F68368AC0B39E0
+DF5E5733FEACF02EF12A1CD0ABB0805C2F7E7FD7C824D9B348E893D68F3F31B807829015C54B
+8D2AA7E8DAA14A364428F3E706FC649E274E47914452704B1BC56A41CAAC736C8826B7BACA1D
+4FAEBFEDDD0EE8FE3BCB53EE291356B7A4B699C33CD7EAAC34E3B92E7F3ABC32852453259908
+74E34513647D521ADA13F83584CEF20DC503EB352BF881AAD4C00894CC581A819CA7CDE96A9F
+8DBFC22767B215141C8677BFE6F1F0DEE4254986AE871F87BCCDCC10E2298BBD90A625337936
+3FFB2B093C2F54001070E655E9C4CD389266DE373971BB763279F9EFC4E5A223990153618C66
+54B5740049A3DE2A80D613CD5AC5BACD34315C43996D1A420DDDFE7365060EAC81AF060B8344
+3FA8176CBE3F4C2EA819B493FB5B4A2E4A0039F028CAB0B47FC70F178DF04C7CD4DA22BFBBE5
+344C9E9CDF1020AC1A43C8E5B9D19B621565A6DAB2B1CB6CDE2524B33FB1DA6B5988F5BE4E73
+08A17C73E406DBCB51FEB3D79B84FF8B0284F7EA92BEB9CBA6CD5999CA7DD20EC02E000FB48C
+DCA51B8E747C0E25B28431543D9095482657364ACC1C647B2140C502623F7B9E3F335C2E44DB
+33DB82C01AE27AF66BC2284971A5249911D897263210DE4A9A65232738D83D10AEA8C5D3C687
+128B64EAE94D6FB30B7BA9105BA8E01BC9925C312CCD8BD273E904D8FF13F4DF7EDD21C23D0C
+09A32A4C90B0577ABE7AAA53E836CA60B1697621049BB36F8013026D77910193742725574222
+DDD3ADF4E872E6D57C1DED571A1636893DD7F49D8280233CFF4339B075628AB591783783548F
+17134E69EC5EC25B3B8036039DA276BA1507649E7DF1EF9E29F0AF07BEEEA346D470B4F1DF92
+5040602539BD1D8218384B53BDF16C74A1A6BA2A7871B67E06CCC015BECF2F020295E27CFAD6
+2D3EB7831922FAB24780FB158C21E769875373606E1BA9BDA9F15352EB5413FFE162EB2AC194
+4BD7D980D232A2F3DB3CD38390E0DCE3241113CEAAC83EE29B2980EA6DDDD4EF5727024E4343
+AFF44318AA1382662A78A41BFD6ED98264A6B0BC629CF924EA0A635B0885D682C26819043E39
+ED44241D4E8B50AB92256F9431A8123117D77891AFFE4E2833BC0517DE287A747E88409CC30D
+7D098A4FC80C6D91534304E7FDA873FEFF704EC1F7450226F09D5E89E245622973D9A789736C
+71E6651182BABE81ACA969C62E1458FA67A3B9D38CF364F383E719F7066D2839D95F262F8A5A
+F87DEF903EC3269466519E68E857088D318839FD0B0E51A6D358A93A543E2401F57FF7E970F8
+BB7BEB37BEACAA000EC58DF62D2064EB45A81144C146B744B10406EAC2C1E350E2DC328B6A83
+9DF820B289A84167B404BA1FC63E453DE7B58A9EF959D7E2FC1DAEB5CE90A1DD935E8C5D7DE7
+E2684FF0502901BB451FAF9ACB439F548657E3BE938E7A2B5924DDA2E7010CD26A181D84A5D7
+5294F6E56DFF88F3C207C9D457CDDBF2D3037AC9A93CE9D53FA0CAA4F21057762954580F0F2D
+47AF43D5D7679A9D44D45D682EE73493A2B8C390E24EF27C84E701C879BBB1FAD6BC8B89BB27
+959EE86BE486786D1C81612D9546AB59D5216367C027B5B0F51A41C9AE2778A04965A846990D
+1727F3F3E09AD0B913C9742371AB5669A2CF4863833A19CE69FF161B1D6BB0CD61272CF94526
+4584ECDCD290E2767F087A836F12AACBECAC49C3FB28A605C6220E8233EA2C9AEFDA87EA2CF9
+D3D52FD6D16612AD07279DDFC4F20B59C905A146B1F4A51547DB82758886E9D3609B495BD941
+616057E460B94856191791A2D16B90A7C33534A9DBAE17C96D68E009219857FBC92EBE189875
+EFABA56704CC9305DE0D32C4CA5293B306A4EE9DCBB131C128626C4171EBCB2DEE830B9BCB98
+B4FE23BC63C9186C21EB7D9CDFE2E685399D57D6D1A857C11FFE47F6D0BB79839B6C88702EAF
+6A59BEFDC8B35A03768AF411EA16C277F7EFBADA006619B31CD2EAB657BBC8CD4A44340F4D9F
+D34007ADDDF2DCAC3058D22267490E90657808CC716B7EC3444638215495A7BF077956F16EE3
+053864EBD2EAE7B210EA370D71414952F2076D689ABD98E76030D92E4D49A79734FEA3F05719
+8F8DE62F64468D06D0E6443EEE3F2677049B08E8A09907A2785D91C009F8FAF6F1DF1CC39D0A
+E11E8F1C939A0C13E49A448E89B0EDA7CCEF06166A8449B358B0C661E40A7935A6E4F866ECE4
+23CE4C978CF749F3B2B8AAB56AEEEDD498DB77143F77B4FEDF5C6502A3D2AB4D0BDB8EE456D7
+DA3B9CC800DA8D0CCAAD981DA5193A528C7B5628F065B7FD1DDB0FBC4A74C32751E8B4747206
+8A3A6F380CE2258D33FC49780EF2570FD279BBB54D4246F40CFA9F13AA9E13C6CC030DC19960
+115C2DAECF52027F917D3D9D44C60B0B2D1030EDC6BB055926CCC512AC2BAFAE7C12D8ED487D
+D3901FC2842D3A7A69117A8B82292FEA44FBD40BF6C27686EAB94A520F63B77B82D5425478D7
+4B5E4E81A8439F560B1CE7C626E51CC3EFB877A9AF37BFCC1A72D40855995DF53B3F4451CC29
+A5600CEA6B2FD2BD9DDF106FB7B6B6E19477426212F3B5C25DCB1B777B643A318046E02ABBEB
+67201DD98D892D6E13B0853CC206B62AC7E7D386A77C6C9A3817FFD5009D515EB5F770DCA0BC
+4D9DE562EFDAAACEDE34096EF6DCEE08C735DA36893C41592443E0B69446B93EE9F758EB75C2
+4FCC4E8193A1F77999F2D4395E1BD24909CB805CE3A26A47ECF376A79F480C9402DCF3A86BFA
+971DB7C977F813C21AC8C071B6F210B251695A40B735D7F8E27F9DA47AF7FDE2A6E7321488DB
+E7555BA82E23FA2DE3092227E1A21C5E6DF4EC83A0578B4E99FF377C9E655D7D6DE412CF0F67
+D3ECA45624BD1AD4EE76AAA5F99C73A1FB470C8C7EA472890E1436BB51FE764F95810DA0C3FF
+D1C3136223F6610F3B226978B8F9E35C9B09DC863C05DF439717251910A64E4AFAF2323CE1D2
+A168DC57CB1F4F2F9D24071F49444B1A5C6956F236734816FA3147656FD7C5F547748AF983E5
+529FA4787E540BDC4023377A7B7E248A37550CB0FD519F30F1BA3A323D171612F802068AE4FE
+FF8D067185F9E5211B1218656EFFB8762824E05EDBD304B71678B3C4808F7819AF193B247D3D
+7A3EE51986157E6D101C07A521379A097751CC6C53FC6AA6519E2D0093AD0CCC5145F4D788F0
+46EABE997100DEFFC6B7D79BEE09A92E34BCC15124D2405BB614B4E265378126544D041C4A16
+71E65832930D6F15E11387F39862F9BCD513CC611A9F9ECDFA53175DADF03BAAF5C32FCCAEFF
+3446E67A62D3B15294E426310F64B6509E88D3225DF909BE2C73A9CC8CC643645B394CC3F5C6
+1FEB91F1522CE9882A60504C14C69CE7089F3EE5B3202D3E5C2C2A98B8A4C8655A911EE03DBE
+72E474EFE0A0B1FB9062E474DDAE008B0ACE5016AEFBB40F157B9BF07ACBCA319380105AFD61
+5DA19C9F932BC8D14480F6AC4E607FD4A7C34AAC43CD26301EAACAB8A4DC8584EFEB56A2E569
+5E84030F39501223DF87FD3F16D3950713C483D8164FE2A180AFD985C11D55A9E22A61F0C5FD
+3A0036DC51904A84B07D409388B897FC92C1C91A971B2482E668A27386B33494F751B5B9EC4C
+5ED765A88F5A675960AA7F644E77696BEE684E098C69A8119BCA27067E52E1FA95C3E54CFA56
+8FEB54B92C3A8A2DA2CB44C9DA1DA7BAE1B05087D025F767658D885E89D654620C2827013ECC
+B38C7021F83863313BF35116AEB2669FFABD5F1F035C23BF0244099A32D2FD13EE00C09E30EA
+3BFE334227C6A143CB716A3C584B6ADD52C6370F7BA917855F2295B9DFF2BCA64A0504D0E557
+861EFB856A19CE99B64EB7EAD11C2474E79D5EC30DE5DDD094AC37D8EE50C4F4D39E32E284B2
+F347848ACACCF519272AA1FEE3000AC3A495B54385CB50373AB7B790B473D0449B7622AD526A
+1BAC985945964D6D2B05089ADCF9DB30F1032639205877D7E78DB7F9B136055C1451663CE4D3
+9FE864E02B1339006A1065FB76C6E438EB132629AF5E1FCF6022E608674E3546CB02A893B558
+F3B2C76BD0A897B4EDE61A21B8F6C34FFE820D66F3B89EDEA86E13EF5CF0E33E82BAC2B4CE6C
+DDDB572ED1C9AD69FF853ABC58C0CACFFC0D86D80D7C8D10139ED4C9DDA73C4B56E375CA70FC
+E18EB1E322F046A4A44AD7F2731BC2059E391688C03B86B305E9BD9BAB8F3D1B6EE52789D559
+A5200AC84183FEE544DB210122C74BB2CA648599DB3CD1AF261567B84AEB332F0647288F8F8B
+01D5068D74D7E89472D8DF3E901F6B523FE04C519843E0B730F403BB99CAD493201F950E943D
+B95FC52B13A3AD8CCC6478D5CBE5DD019BED1ACE4D02E09353E6E31B9A9EA9C76D89D9490D71
+3CA451693D235A0C8B0A3DED5CF2A846ECE5CAF52627ACDBE76CF57A09CF6768D0A53906B15A
+FC5183B9DE1029D19E64B64BC2E075B536663C524BFE35C9E412A7C0D23D316E0645BAA41DF9
+ABA61284F801F7CB852F49B24A96CD4C743F9B1D1A69F3E30808282C32C2C4655715D8F3AD53
+F3FDE97823989864479EABAB5876C77CC134EB66C688BE3777C74B3A87EF1616DDE5A8A46185
+997DF2FAFF5518EA7AEC3379730BC509D09C5C378B47DA67F9F5740B641DC790766896352D0B
+E0EE84D686496066469C995583EDA0BFA51178091918D2B9EE8CED4163E45FA312885A64F177
+F03E6D77DD649C7D71B47FE885D72887927AC070CC64E825917776264E722AA6157C22A429BC
+0D38B56E5A0D6473FCCAFCC17B4BD8860ADDB9BC33E2FDED66EF95205FFF084578C37913E205
+9CB3C1ECFA4142C0A2AD1781C373CB6FE9819F4CF8E5B5774D7A6BABB1FAA71D0C96175B9DFC
+08A3154C2F1AD566E0D03E6A01D3848F0C6C06755A0511948D51FE8626A32AE97CEE9C01E15E
+A61A556170E7E4D3697783BD42D586535C38CCA8D543A9AAA828C4813E89BC30B686049910A6
+C01D7FDCC55895A3F7019B0CC78C23925D8CC1207C51FA19E6B8992A289EDD5669C33186A7E8
+38D5A0A3C101C82558785010F877B05D943C5F874D0524622D43EEE25CA87C2AA4553804CB6A
+D1508B9406BB1CDF868DCFFD19483BF1D8EE2844E62A2E1CD09807983B7742A841BA2A03D8A9
+2568624EF3C504F9B2F4389E23E323D1FA1F4F0670711DA7D827400F36C9FC870EA2553C7E25
+45E2A5086FED5BF966114D5FB48721AF70E04393326BDE080D3082C292C9C251E2D82C0C3F03
+04E9A46203E0E5E76829E21A3B961F02AFAEA15397F0060E5059A5FC66A2B622AF1D62FCAC51
+6EC3327C95A0C2810EB42A7209D12E90D1D41EF442D0F3DE55493615D4135B4F44BD09759657
+58B16A8DF9D39E78A73DF41C2EFBACC2C91ABF75C849E2BBCBAD263F8577E16D60BB6BD463DF
+3A4BAC62F28B44CE08BF52A268AC27779E3A317B965A44321615891B627541C53768F33694D6
+EE76903BBED8ACC45FA00EEFD20224E09D95E93605987839D92C4E0E1853D8C3F25FDF0A8268
+B38A6B8D9286535A49B25631BF31451F81B5ABCBA66A07056EE34EC320367DCE6CFA97113291
+32E1155535F8094570639F9FC72E1ADBB4EA99EF7C7CFCEE8D74C2AC70927CA9973C4E1C4DB1
+13613466EAB58C0037BA93230A3D6EF41739122912A15319374C6A6D7FEDA8B1DC15EDD2F286
+12EDD846D8AA051F24523BF92C6920C2AE3CEED5868BDA6ECD483ED181AB69CCE78668A087DE
+0A00A960810675F75412A8EB6018C638583DFB07B4B4CA48C2D3A7CD407F552DDD7A91556004
+2B173D2DFE64EAA41500FDB64FE572E09D06BEE892AAF0CD711F3D6752302EA4F69AEA675A48
+EE69C2416805E7E6EAD9889FE072F1C2F5D3A89D277A90DC9EA38271DA1A455CCB3598FA99C5
+5A788073DC12B2265D409DE2DE24FB4399E911CA80169AD5812BCAB83BD0692C37A1B8053585
+BD7303C20B6A06BDE9873823DE9E9EDD9F403E78E7C386341919035561CB94379210A5E14CB7
+43687CD843FB306B6946D8BB1C290D802EE3F096F54D70743B22E661F81C89F190971F27FF9B
+0E6C273CE3B35E6F5A586B411F6CF55C2909AD70D348C6F6322EF1DD08EA36F1B99ED590D012
+3DB978BCFF31E5EE9EC3FB969E71C0864757AEEF1750ACD6A6F08A086CCF15E65A712ED37564
+B73DCF2A5E86E05C7725DE9F13DF59ED3E92438D9017754365735E5731853520D9771223DE22
+52388C4C6F7FF44614112780B14180C0CE01C50F94BDE65F4692CFF4B52F6D9D1FB562475BF9
+E94120A510389E9B3574C62FE0CD45E19615971BECB8C2388B4D5D095B914E6F887F3F708D7A
+65B516758CF5EEEE4DD127315FC3EF04CD5915978141B2CEFB3D2C0FB5DD64E25EEFC85CB2F8
+80CC6AD20B9C9F0C1256A9C4E8CEB2B400C8D50079E6F58F7A064CCA9FC3EEAA7F7C34BC51D6
+799520C5534EEC1A1EFCC52B9ED43E7695ACAF3EC4590D9C0BC16915769DEEF8F39BF7992449
+4888D4DCA2484053A29598DEC70C2BF94BC2494BE4841F9676DE13196AF9B9A329DA016F17F6
+2ED26A75CA3089750BE5DE919429B989EEB4C10C20AB764BA2C4035F14264B055771B6AB98E0
+D673580FDEBADD2719C80E9B8322112C9AAA9AD2329B045EFFA948AF1EF7B0038B4D3C068CDE
+62E5F808213F4A04D4979BFDFFFAC94483C546B35E965D4D0625FC01856623E146EF193A5538
+09C0D1E182E8D7759CD2B467A84254A2EABCEAF9E764A05BBB84522353B2505C56115F489E4A
+906064C9C5266F823741A1BD1695796BCDAD01B38003522EEF9FFB7FB7F79F8D6C43B6685C17
+F72F06060993C9A30F8E31AE8CAE4F3BAD51D8262688A6443CE6A07C1CF676CC4F755849E2F9
+DA19B14130FC72E31BC6E4E062C041EAC5EAC486032535FEDC0DA2F8BDFEE2B72C1BF0BE510D
+BA08E0A5700FAF1686EAA93420F20F92C0516609ADAC4F7EAFB5FB2CCDA18BB3FEE2702A462F
+8AE39A733B0699D29FDA1E821FB03964F477A2FF5580FA4874F60D6F3505A4287E17AC2BF565
+9E42FD41F257EF45798CE2D8E09C0593FE7C41E67D79316E8D61CDEEEEEEC60EFC9BF26E803F
+5C3EE7404D05ED2018F8C9DD0EBEC3BD39E20AFFB51582BD5049DE9AD7437849330674FD17CE
+6B9B6F646F9CB66CB5DE5457BD512BECCAED183FD5C5D834846E6F8BE301FB267A4A67758590
+3CE45864294FEACC65B46D604D84D846098339D20FE034B77A49DDF85718CF9DE18D10028B37
+15994C5F2571EA3DC7E98F66601C647C80839E3F3477D78584870837F653243BEF6FF49C347C
+5FE9C7F45A28F7BAC5AD9929D508628CDBBD4EED3295F06CEB89D378632C34D514A0B22BEFA7
+E090AFBE45EA64C03BD1367B63763F4570D25F59E83D344E8DDCD26CA66C1787FF09EFB314E4
+CDAA3BCAF8C94372828623E973768B6FAB1327C6CF5BEDCD37972CC2505B12D2A26F7D5AC9E3
+F623024A9370A44BC95FB17C035F71BB43853DC7CA66BBA610CC29FAE5636B21C2366F88675E
+C0EB2BE3C127BFD579CF818ED98D657779430F5C75A0CB97A52F3547907BFE2AD55A59B0B5A0
+DF0D25000907FDB6D5781EA549FA89078516665CBEF095D9411A2DD1CF6A355BC77E2447ABDD
+21DA230AA18D5E130DFEC1B75E5C1F6CB9D3C860A95E9FD960EB8D73EED1E168E357CF305786
+A8F01B63EA2D9301A6A3F886CBE4F678BF1BA1CAD67F3924B6408561A435E0720DCDD29C53AA
+53C1747BA074E6588B3AB7B66B5686AA58EC9BFE7DC107D97B8EE627C9E79601B95791704FCE
+469944BC90EC77AE5A9A5F2A73A4894712899DEF4BA334DB850A7187988BFC315A5E207AA6D5
+76741B3068F18C7AD741B6A4B6DEBF5A3C3E178D10E25FDDE0A01AFD5EEF225849E3B5BF1846
+28EE473A34303C2524D78B8E7B8D9308F1A90852C8463AC1997C91DD233CCB7E4A16E95CCAA0
+E4AD48E2C499397A4F558C23360EDE957D872238A446C39024A369429B2CE348AA5FAB425897
+EE02B71F085DE26264002AD168130598150C4F560E0510A135014E55A74F65B4CE7E1A96146C
+609280B49F0AF1830C3C8A6045BC7774D3895348962A7AEE947AC962547AA28B02608CE2F91F
+EC34848EC86C4BF8507A9C0AE9A0697699531E11ED9E85CCF52231672F0879B801860B013181
+5CCFC49012F03305D6D382E4E4565BD1D2F860EA8BD636D8582FD332972F1CBE62844355C933
+786BE37490A7EE43217854DF7797EB8680B93D9220F643DD70B2993A7A0A194159A9BE04441F
+478A77B3D2CC38302701166DEA70D72224C9481BE0E68BB6802BC6E9D131C3B3FED642779139
+5CB3393D4817AAAEDD39AFD6508C9CB4FD67FD3BC18C65F27203AE022A522C1B750960B7A745
+0EEB8718DC911D645198227B2E729B6CA4149EB9D21369500208D94593A087C76205D1046B91
+4C31FB5F5D6FA1EFC908532B27AFBF73C27E2FC9228ABF72920CE48C03E3381A952A0B1F25A9
+9EDCD216B154AE6279B33315E822EACF095C00D7359EA834885DB0E6D07BAA9091FB364CFD43
+E378ED0C06B9A1F7C3A7922C85DAF6CAC5FC111A51292D4C7D43E9773F262AA032782252CEBF
+2274842EA390B0056C3E0BBAF1DFE11D91679F6313316735FF6820166D4FDDD7E76A72469529
+1E224466ED210C82AE79C44A828E7B625F872C5A3723FF9A09E7D77D0555C9984F7EFCBF3B9A
+1B156E5047E312C8CB86D26B0E6345FCE3BCF8D0196C95C5AEDED0403733EB6BDE2F6A65CD1A
+0FE13DE66A2DDB3F912ABBFE0CD59D4A6D9299E1309CF7494C93896FE76C132FFB98E3315B28
+950E21CACA613DA51EA612678FE24DB3B04BA25EAD7E2A020318D2C79619B78BAEB21AEE2E60
+69D8470392695EDFBFE2DFBC2274D8BC8BB3551CA84E341419C7E718187260497EDCAFB7F588
+D1C7663CCBF8DDF1FE23C48D1A9B211BB0C75871CF8DE53C45A00E601F87BD65B9471CCC46D4
+481C5E83BA65153CE608D5FF6595FCED940CC0999FAFB2F44E0055E57E59C73BF3AD6FF70CC5
+A0F32A97D61CDCBEDDD34A295A3A7A9DF1EDD9169616D1F8D4C5E20A86DD2FA590B46A974D11
+45FE89D1F0664C3E0FEF70DF6D393AE7CF0B662E285C02E9C447672F73E90138E68F216C0072
+F5BBAB3943B40D24FB09841E142889A4B927E4A7F762E0ABDE430D6C4D8026F76A62B3B35BF9
+53B1EC19932E8E24EF20D2A50BD0EC86D6C0A61D1B206AFDB625353E1FDC15F96F3A48303DC6
+CDB7E4131FB3B6E7D80B1B332673F6D1DDA6BCD90F359014D59EB5445FB90E31E51D9E1962D8
+20792C2AC64E60125B0EE5CBBE02AC8BB9CA43A2961A5012E0BAFB42DA92DCC8948B043F0F98
+C522149E57FE699C9BCA6DF84D5FEB2F55C49407AA52345AF0F2B39C360876D5A6FD1C3C6D42
+82F070B8AE2DD3BB78DD78C7801A235EEF4A700128A9CFC7CC3B122CE69DBF577F6531B7898B
+A31A1B915CCACC4B3B1226104877EF805795A93A2F2EB41CCB759441A17E6B7B033094D0861A
+5A55F80D94B203FEC9582926A9CB5F8CB395C110ECE72754485D674DF6CC0BB84882BA26FC17
+01E3B2530A2D44DB5E8702DF2CDC597A8BD9CC12E95B7D274A51136B61E49C7F920BE8E6E17F
+1B20EFD1F6F84ECF575B2CCB40AD7876E8B8C7B083E2CF8253D06CC4F6CC2A5FDBBD8CE6986E
+18F759ABB35F7E77AEF16D5BB2DFBB457DA2ABDB2148EEBD4F88DE2B9B3244FF78BCEF9F98D9
+3AFEF587269D7952B9557D0EC61FB268980730EF3B6C5CF569EA19DEDD3AAFEC29D8FB9DBC80
+43E7C702920C678DEFE3017BD9791D74A6CE7A6BA312EC7407D2771A6F22E3E81EA35351C3CB
+BDA7A7A5256C67AB65C84F0193D75209307DA141DC60D87B33684BCAAEAC9047A0F3861EC185
+132A14F5F48F19E38E132FEE76B5D7C70AFD29FE30411C5B7D624BD75FBF27D89844B1845F02
+7B866433344AF2DBF37587F2144E40358096A2F6CB884595E57C3A21A1B5FD1A9E007C530FBB
+2FA384169531124511C0E643D093478AAFD5CBDEC5EB0EF47546A893EF0D04E30A89BC3D4516
+351662F937F26C80CA874E471EABA85AB541F51FE6F94E01BA628A0EA320FF000A2C3B93162B
+40E33F49C81F759B0CDFC167B5E06A6B2592D78794A4A91A03F9F95AAB96850F726DE1782B03
+F66CF1C647872FE423AB0DAD21098C19A267859AB150D8CEE49EA83C0984C348D06E99EDB60D
+797683B4B5255E3C521619DA2C26038BEEA2C6C013383A30D6155C3C6FECB3FEBF3205D291B3
+E26CB6F76AB6E222FAE350EF49B9C15AB1DBCAE734E377610A27B1013F0AC3B11E9235E952F6
+C65DAEB43581FE06E04BD94DBDD42AADE4CD6B475DA642910A0240BCFBB2848039B614F11B5C
+0DE8B157BA49EC715748F2857009BBB3A0B550B4EB88631B53A69F025F61E4F0A1BF13265E20
+78C6291C114B8ED63A7F3A2D3FA6EA7BDA7445CE3DFA913FAB9FC964D6A5599175CE8EDE602C
+7F17CC5E9390AF0D3148FBE8E7D5C8780DF83D34E4C1CFC0BA9DB11975A171928147D4053086
+BB7A29B4CB6620278E5D7D42B5778DB639D37D3149B525FA9A2B972D3F33A2E6735130446448
+EABC73AD3E00E0B2F5E774ADC1AA4E9ECA4C0E5DC2AEF0F7DAA42D37CAFBCF8FE67CDD3E7C02
+413E617562850E2EE2E68744895071D192B4505470D228C8CE86FF4B650F07E454F8DF8F5376
+8226231441DC5A026FB268E920C71680BB1426E4FFB38B27A019398C3CBBBEBA91C4988E10E3
+D873D3A7C8FC4FAA207B94A23E653BD646505B8688530D3DD734EB22AEDEAEE8274FB964378E
+744E82C76A1E65E40A60DA47189ADB7FEF7006F180C2AEDE96672B55E12700D795951BFE14DF
+F7EAFCF483E8036C07226D1259883EC8380404BA3523D786E55685878EA1CC6F9D2B32DD91AE
+126BECFDC77B9825D602E3F18EA08021413BC95E5F64A120D41C719CD786BF2EF3E1A9B5CF28
+D80F65B01191653515BE6B53E59834541465F45839682F587530B63A3BA92D74062042AAA119
+12B071EC81BF6667D22DC7302F0A5299F3F3432FD03820E43BCE1007BBF0620163A0AE9C1A62
+B6FF44204FFA819F9D85849D450ABEFF5F3EE19B3FCA8EEB405ADB8A05C4809BCA050F846975
+C56B5079AE720299A7ECC8D846776048693005704658E43640CD89E6149093B4778AB677B379
+7DE560AEB7E09DBE57D723A4AA62EE8C42A83C10418133D262E5E9CBD39532F3881662FB84C3
+8F33ED685443965795C725956506FB106FE0960832A2C292560D3A43EEB72F4355B836CF5044
+767477AAD5346469F8E4E90F712DF820A0B7183C0FF090444A994D81E2941EA3C373282BF57B
+9952FEE56B1B0B7AD89AEC79A85DC03FD2A35F5B87E061D15B65A48398F836788F6B41C749DB
+F425391D99F0B31420DEB5C800EE281A427DB0C1FF7E03105C434F95907BD74775C980B4AB46
+A88652C8D59BE6CDB3531123CB25E9AF5CDADC324AAEFB9F8DC7E1EF4D288C6DA52487B922A9
+C9526875CB3E528AB79122F9886517E892115104A20A8EB4CA7628083B24C0B0F0DD2BB0D35E
+3E1D3BD0D50135F7B7F1F5FA5349C9953C4F61F00EF5F11E662AD12E8D9F156E32B845FB8E12
+1297658DBFCD943F1AAA74F38D43EBD080C41DDC92101722D829DFD3EA37DD5120803EB06734
+6B636815A8738403DBC18BB8D8164A8E450A7273F8164031290B465A44A268CAA510E9EFBB71
+114E603718BBE415F2426ED24BA413B286C42902D8C5E483070D3A3C57058E6D640369797383
+5C78166A00C235F8B4A4D155E723010F7500A7179625D248F2DCD8A368AA5FC85600143AE81E
+BE8D901EF42702D30AA628595AD111ABF0E1E06A7939420D648F03FC840A51919C588BE0F7B3
+BF71B51EC7DED081D0E2FACC72D65C77FD6864A2A30748803D0558ED2BEC1FC3A91710CC9F6B
+2C8A66F8C4EB43635926CB75B89AF438F224DCC5A542C653790E2CB2831E6AC5590BA51EFF51
+40C5F620102ADA7E964D21ED4E7AA39B2735E67E1862227C6E1DA2210EA7080000E90162F5F5
+2677F188D75022B9A6173AA3F4E45449348EFA7A4D119A8C4682A1E205DD922BD9D65A5620A8
+D9D103B853D56B872122F3B649565C904E6284D66979793B16C853BECCF478864EB043CFB096
+42F0675D88E62AAA8088291E844F34AE84CE4A93721B4F262E0BFE50BC17184D4A2A469FFA94
+8671A565C708A79A8DA61041C5F60B1D82A50C52A6E145FEBDBC69CD0F32D81382EAB87FE7EA
+2EBAB016E169E5092C277D28A0C1197B760AE2EE5E307FE6B23D120605E03374AFA65DE773C9
+B543D6B6321732A158873823AACEDAC38B2AE5DC0DD9EC0BC159C6861C99B18722B6C84CE819
+07EA32F1D8434B6CD6C68523720859F1C1663A921B7DA0DE2A9775B181AFF992AB12E1A1F3E4
+54E7342B9947D893557DEA500F36598D00064657C8B952E299D679BA20D0583FD6869F131495
+6CF2D1D8E81A0C20556F28F8729ADC075535CF1006D8F1750E479AC6066823B31E969ACDC75F
+62EF2704DB581A7B4FBCD22ED0A794B52494A69F4D57816E604BEDB0C1CEECCD3F80B6B50C76
+065503F13C1DD3834D7DB2BF297B0C8B4875985310DDF076F0D6721FC205C9C0957E43E07EE2
+CFE21647A2BFBAB8136866C9C4EC51706D04E2408E72B6106F02085E5213C5D88BA0B90E0078
+FCD4A4214120820F0809736F4E3C06C6E0E6B4468A4089236565AD25A85730BFC3E476E5F0A4
+DE180BE7A504ED02596543DF24359B7EAB8E5CB1AF98528D4F0FA8DF2EDF90C2C6D75600BC94
+61924029635FA8E2BF07BE105288333A93A0A70A6C4A7F6D8D5F3EE677A017478747CAC65A57
+A0FAE14371CB16FD6C39BAAFEC9AEA1CEED0E66F30E5F4B5D0E8D9D56DAC6D552163270CEDDA
+49E5272BC389831BF07FCE638F7299F5C0FE332B7E29089D77B0140604B8AC0377C10C002046
+8F250B3F03BBB37DC29F5B1CB2189063B8BB0F278AFF414A86A2F8A18FF13EBEFF00B4D723E4
+90B2947195648367E0A7DFBCED6EFAA53EF849C79DEE21E5665409A44422C3A36FFB74FDFD10
+17D31C32F9E269640AC36C3A519DB5F76198F1AF12F71ABBDF8CE85E7E6C2ADABE4B47897CF2
+4A1C7B5934494F07790965C18296B977E332BD853232F2E2BE755F36AB8B1773964A689E1BA8
+48F9F7F01BC585E125F00B90576FF82BB1BF90557D064D38079520D19DAE87A298514BAF1ED0
+0B89467F5FD445762B80F1EE8E67FEBE8B5B2558B32CE738201712612A56D824983EB5403A70
+6383D135BA5F1EDCE9833B81465B34244901802B7684AB914548C88C32FE91DFB0917751D843
+5058ACBF0BB78D11118F14A0B9411BAA1A6E04088543E99B70130884BA971F4DD03F1AA3F9DE
+4B1935663AAC294C9597AE21EB145DB431FFFDBF163B23F3C2675662C37CA63569A818D47B85
+3B59983C8B6EE24560B2C7D426283995D86A7DFEC4B6558BCDED8A74D214BB6C86CFB902CEAD
+F6C5FEFFCD06777DD761F9F9EEF09E9A510E0DA31C3B847130961459642DB3E533407A19AE36
+00973E4F70EF0912C462769AE399EC9861AE5D2A243CA6538943520DCDB2A86633F3D95F1F14
+E6D63126FF361FD287539C686CA9A6E4B46154467CE9CF10EAA3DE0EFEFDD09BF305A5584C29
+DAC82DF9418734B01CCCB57666E0EB5E5617EFFA3059FBEC27D3DFF8DAAD45EEBDADBD272AE7
+9909A4CD3476F9E1275298429DDA620C15B1E229135A472B013F5457269B9682A3D41E20C66E
+EB7B874F26FA9CE0B2C8658937711366BD4BEC4F30A14BB1FECA238CE9476D66D1BF4259941F
+61A7DE0FEBA45E5002A9AC44A7587FB206277C01F479D7CFCE8809687AAED92F7D148432CE8B
+AC0AD62DFF7640554D59E88CD83022A8A42D2CAD6EC197BEFB73669DB969D468E7519943F53D
+D324F2E9795526537393C3E5298B9F4E9961A182A324DE0D8109539FD483E1C6B0588584A30C
+B5052487BA59B78E2959B3A2BF30DB1374D585BDDA52E088AA672AF40A933C94CE9B9F63FC83
+ED72B19AB818CBF269FC03F38DD982A48B8206307A10E6833B3CD33869526F10FE1C92F7D0DD
+56C163CE8F04442CB0DF0E496F2A1DCCBA88D0BF260C0EB856E081EED167C6EC1D8105B2D3F1
+73D367CC27D0F26FD89995A2EDC6D1A215F57847F7236753FBEAB4954510CA68688E51034121
+F2CD0D46C7B8E89E138FC4EE229245D537F8F5009B76D6117403E10DB46109C7B58A67E0C14E
+6347DDE8242030734D02A5C3986148528BF20973DF3D17DA67E53334B678643F09B7F887CD90
+87A6F635FA5FAD0A2EE43668A8B1973A42866A399B280787809820D0AB51787DF2A3907A564D
+10FACA4D9B6349C60852C06444FA49F8E2563ADBB0EFE7B8250142BB06FC4C93C81BD8B51F85
+86AFCE9678D4373ECF051908E3435470C360935180B80B2C03B5033E2AE1B256B426E09FEC5F
+902F7A8878B3ADE833EA39EF3D0AAC1160E1AC3FC15170DC3FAF6D17664E6292C51B268666DA
+DB416E5738176D6CEF2152B529C6DBEA6E563B5F7DEBDA3E49EE6EFCB88677EA2AAD003CF528
+6B21E648EC332F0F0579EE648925B05D50261FCEC1BD57A22E58595CF326B5FDB2FFD9B8DC79
+4C5E7854EF9EA34411546D28C5112B9DE1C25B861233341B2CC117C9C310160F612AC6F13F53
+4DFAAEC92D6B2CBD9C3F3C0CED06B910260F7A2DD09B1B9D44346CC5A7D10B4D637275D505D1
+301078EC936B96BCCD9A2B783A93019C5B769C15636CD94E9D4A24BEA9521A41703FD6F4EE8E
+362FE33E21EAFF8AE02DEBBE9D9B379B7AA0AA0FE94C3320CA64F41FE488FB58CCC5F13314A9
+F8A8428DD1D713C07489BB76A462E9C0E237FA5FCDFD3A0349B6B77067F055B7FB0F28953384
+537535177D190465C354DFA1280FB3E804D3FC0D6E2FA88A5F2829E9AE07E9F7844463AB695D
+A17806C271E20C58939A04B5F8DF439659990D8D8F885F3A7A43A4BE49C7ABD03DAF5DC78CE6
+6ACDE634AD08C33363EB642ABA7D9C34C71C74CCCBF7F4ADF9A201E203F6540BC467DB200646
+9FCA0ED2234AB1A31E73FC05E8D8D906E40B3055B3696D72C48080934CC62E8E850350E70CB9
+558CEBAE7EDDF38DFE79FB501A6EE6676F9B7697FB4A90B84CE04808434D244ED68AE441F19F
+FCB2E0E62DB832C31F7EE26D90CB6FEA5DAA44C297E51E6F9952C794562BF286BE8727262E51
+5DF58D26BD9B97A5ECB5641D517DE35941143757645D511409808347297FD5D84E4BC1595158
+9C4E272C6DB003B51628D3753DCE430C6154F4A7C5009CF5AA61D9CD61CFE3398701B65CAFC9
+372339E6642D01C461EC04840A4F37E8289A232B1C06D659AB081C25CC56DCB1B914EDF4C7F2
+3CA7598B264309A0CA15F079ACA4F69630C6AB6192EDD8A2350D3D1F239FCE30CEC5C7597971
+6E22A6B3917E8F0A05D75F8D1EFE57E71836EF46D41E4CD87F11CD8857A3821E6A7E4D596C39
+739424E37535699B423A22CB07CC47041D7B97260181794435F38CFAB11A7F571A725D084101
+07FE3E53B16CAFF56F14B35CEB1363EF20271620260552B0B9FF5ACC9E8C508A0F07A4768AD1
+77975F80D7EB3FB92B04A9AC5FCDD9738982DFE4B8DBD646D0F1035589116E961E1000B677DF
+7B598EF17FB7442E07F625CC07E7B7BD4FDFED5CBA26EF286DB92F99CED631ADA9B6E4AB3654
+C549D5539A2C6B2BEF7D9685F6C5BA2AE5273D15CA66EFC6FC14B3DC2FD47B50E6FE3678531F
+E11B861DA29708943D8914EC5B164EDBD2B04DA634314AA7EF8158C3F4311CE9FFD5973DA940
+22C33E3A69931930572FD8DA9DCF8AB915CFF613E7628C5773652D55C64E1DCEAE37C879FC17
+A35028F33B8D14731DC832193B35D6EAE7B2B5BBEAE7DAF05B3B34CA3235D81FA537EADC80DD
+C32567E15F80BB2A484CA51AA8F3C853696A740C271E1FB34D3DFA72394B88ECABC1F4E92CDE
+907A139A5B57406DAA97AEA576412937FFE4E2689853C7B86FD869270B2FED848BDB95AB3E04
+C77836021AE12BBDFB0BC68C09AA4F5B607D8B724C24CF6DCF4F54222CEE4EC643F1D4024C39
+8ABD99169DE91191911AEFA67675C21D539DB7C39462FE640C5F9C9EB684C6037315B548DD49
+F0C35252F2E9D5D4571880E66CDE49FA9653949D2F28AD44426978A2127122CD77B607E9D03C
+74D9DD7D11E4A9AC2E3457FA9C79DB76AD398AD5743F6E077C36423E0DAFADD1D391EE4451D3
+F94EC65470BC74FE2D2252F0540BED609F760145914E9437D9CAAC61BE91F76C5F1979C9C6A6
+F73E690DDADE3B1295251F0E9DC3100CACBC3EC17689A8CE1AA3089A387B2727035514F69E27
+048AAC20A38EE49ABC7928D0109D3B230B37F6092388AB62CA5B382DB76922CBBDA2D61B5745
+6880763654B4D83478DB9C0F63790EA68F5C154EA4853D02B9A849FFD65684C368E68C6CEDCD
+85BF1F041EBA86E9BDB490CD8CEF298DBA42ED4FAFD561C2CBA47869505575220B8E3390BA7D
+411C2BB7B16578A834BB1504CFE2644713BB30F2C76D9DB397F45967B8F146E7C4782B203A97
+BE20412D4B2B6D53511525292E48896BC91D3891300E48DB9B7A650DB26FDF8992063729A8FE
+4E8C6F786FF4F4BCA2018C2861DE6002A8D4954BD7EC80CEAB7DAE6CD07586E733B1E862DA8B
+1D4D2B0381058A810522C303C06AE34D5EA6F05C97B4FDB3FB1DEE799511F2EA9750D53E2A1E
+CB6058C9988B55BE1E6F1B682C689C996749691B6057DBCEEF6AB5EFCD604DF7420EB44763FC
+30B4812891FB2B67402A24DEC15BA326BC89E6C574597178EC7CC644FBDAB6493E545D89CC86
+BDF8826284E8697D2417FBC5630CFFF686E9F8F6C5F7788E975FA9F201FFD1E99B75E69C2395
+F2EB3CD74E2E61B44049DF0B65F91195233228490EA9B9380800C1B43905B862770DD378C920
+CC3EEA51351DDD3EF6C68302F96DCBE3D740F4A3E359419599817FE10E5EE241B516A7AB852D
+01B570CA085D306C75BA899A5BE0F5BD883B1A6EDFA8EA72E5F66878BFE1208151032ADE4804
+2F2C7DD0D66220F5EF66F4D3BEA1014EE7327242F8A8D948750934D22B7C36B2CBC01971D5CA
+B439BB320D7831FEF3C9785645D9996615DB538084C5072F2D20F6A8909C248AA6D34DEE11C9
+1E5C41C931DD5076C9CE87398A58AB06A1AA7A07DDAC01B730957DFA34FCD86188DBCC7C8A94
+101F09209E7B123FA9D671222BB65EAB845F7787EBF82A0F59A7EAC3CCD936F54A048AA9E36C
+983FA1376E1F825FE112D4FAC62BCE3DCB285C5138215EEADC3FF9504496AEB0C443DC9EB28C
+1C3F27BD1C449FB7ECC661697186F9C31CCB922F2B9C9CD4AFD63BA3CD71A95A52CCCD50C9C9
+BE17A47D3123DB4898A75275D93D74EADFE72B7BE3679FDD9DAD4C885196194DBA0D297F8033
+1B1471EF61A839DFB26FFF95487496B4280D02CBD88C1DFABB04F98207ACB5E5AD8B4D4D26FC
+232FE653E9B30BD50930833E2B9D72A7A3C57C9744A0992131CF0AE770788FC6376FB187EB6F
+1605CAD55B40D0B9132B1799170BA18EBB01A6B92D5CE2580E5D5BC15B14113CC32643C74805
+17AC33E95FA1B318328613709D3B05296982772B4784B762103E906EABC30A8C542598B970BE
+13D8F79EC2D4229118B8A71E708F049B728205008B75CC96661B1F19CB27320E6231644CABB8
+E8A3C07ADD08A88F5BD1448FAECE9C2E9E959FF42AB856C9F0C45B170D4BD63743867FF08D0B
+C568D473801E2B40F9E99DA8DF577732784B52FAAD05893033ED069CC2996540E9BAE9916E13
+9276031E66E1ED34CAC0228B8C7B8E0E0A8C9CBDEDFB20E406D5C2698733F1912BE83FC517C9
+268D3287C66D5059D84F52604387E0684850DA394D1F2B4BBFBFDECD45BF88738074512A1905
+70057E2275BA2803036A91F9A32E64CD7429AAAE7DD6D28C3159694901450896D483717E9ECC
+4820349ED3E5FDEA88B1F9AE1A7E9A9090DADB0DEC035EA6EA90399F3A942E3401EBE5B483CF
+0779ECA7685E8D278CDF6EA2FBD2A7CBF18314F5257756CD3E342479E3AB75A6DFD4F9D7C3B3
+5AE5042A2B7FD3CF5C93ACBC3167BDC9A7F0D25D0CEC8F73D79A98EE89A769E5A41AAFE97D55
+688F39C661B575A6601ADB6399B43DC5064D54F07E8299627A114254B11F1E8DDD1E7783CC7C
+ADB44A96E8E54CB72A448CD387FACC2BE66A5D9A4583EA6B1C0E4E7685739E22F50E52488EE8
+D38903E9BDF9CED151FFBAB79C1E159A06C11C70D91E114ADD520627460CAF3E57F77063FCAD
+E73F05C563FB50CBF0F2913B6899926A6BFD891E986FC06001C9D8073A781F0981FE9D4C4D17
+E49D1793608913238CBE6B973F9493DF8C7123702646446944399EE25B1E5A40D3AE74728879
+203E2D5F005C3955382FA450B86A58C68BDAD3FE1793D8E184CE250070CC6F8C21E277DD506D
+4C8064374CDB89D4C5EF1859FF45BCA98BB91FFF5E52BC1458991E9C296CE2F8BE62B7A34D2A
+DE95004D86ABB1925B24296C39130971B68A2B1228EBA1575447FEFF25F6D887EF14B66FEB4A
+377F60681A4B44F63B6A067E367E379628CD7342D80B79913F4797FEA6506A56D47DDD7E0AE0
+B06D1E9D52359EC8D1FFF0502D3D7898ED4642974DA2483F6D5F4F48FBA2862B9684DAD5F1FE
+7434786F28446523FA121E0445942EA29694E03F2CE367B6EF118288033B36F87CD456F566A4
+767D31794A827595EA4E03E805A5D0255463FFA40893B34EE0107FBC6CC1D25215A70FE0F9B5
+526E65C3E50376D9555BCC9F60BDD3DDBAFAECEFE4659ABCE230EFCC3BF8BD7F7AC3F5CFEE3E
+AD7E09C9F2027DD12F7D85837C9A693A330281D730982A1A2B854D5BB19879DC69A0FDD1033A
+7A858BF14C949B17D26B491B123F3DC89E67100412DD9DC767EC66FB690EA83850B80DCFAE83
+EB437F5A5F4D22517DA8A21075D6A0CB1FCA94446C8138FE3F28B8BDBEEB3DCD67E4D6C9AB24
+9F3BCAABF7EFFCF8162C37F3DDB6DBEA59D74D515BF19507880F19F99EC7AF622FD9ACE7BC07
+5D853517B494438AD1B7BA2F0C696E77543EA59F951D5B8C2D364DA095F4B174C878FAB8CE90
+B0312FC2D3C62B4A9F02166FA0EABC1FDFA7839A250BF3627D3AD5ADD5BDBCF75B271157E012
+F723A51A76ECCACCCD693F81590D99FFF80B21C7FEBAAFB921C0A91AE44E8C3A870FDB69B2E7
+7A65D13626A3113B069A1382AEA90C6076D4D4B553153B3CE24D1382117307E0D1195E39AB80
+58E44DDB927058A8D71AE41B86ADD4692AF0E852F0C1C92A6B5CD4E7C49C7774BCE30E0F5256
+4437E6553B1E6486FE7F8DC97451C934C3939EB137A8EC09486F10F2A7FC4BD3ACFF77F03B1D
+92F19A015FF6F515E9963C870DB70977F9B697E07CEB75B9AE87B03FD70CE2008B941924DEF6
+27DE71F750EF0F378CB2648EA07174E62FCA3FCBD6C6F1F91C9BA4EAB493E28751FBC57D6897
+8F553DBD6759FA9CCA70AE9A7372A70CC6CE35137CBE4C289575555D92083E92DAA3845FB214
+DAC0FDCB355A5C08A1F3647C85E3B747F1FEA12CF8AA1D2162E03221BDCDFDCAF4B74DC3ECE1
+657CD9819BC34ECA91FE1E7987FD75D3E434307B208F2077457E99134E108E38B99B6D1D8DBB
+530D3AC7CC5811A7FA92BB080D8E2A3A09CF3F6452941D063D275E2AC849E0B35B39C63551C1
+90A43F3C3564AD6F153C44F67E6D50E311ED225861B94CD108D278A4785632CF7E47E89C8FF4
+3114044CA9D48BC15C5EB1E9D1DD3965B84A20522340F81FD0EA60D7B763BDE818B5F9522634
+7A5220F043B89DBC6A41DF825DDBBBB05736F7709B752B42A1FC78B1DC61EF6DFDE867C1EBBE
+0E7F332C0BDCF86B706C2089EFCB1896B62ADBACD8E2358C75060046A54784A41F66B5DDE678
+06625477FCA24396747DB263092F82314E7440FEA9CE8630FCC10D7F4BA6821613F64A16D00E
+4BD9BCBB0EBF087C2A88720504CAC249D2B2E67A823C4F34260A7672E8D6E7AD168806779B39
+ED0847E82037AF28416AD3B5C5C6823ED9D1912A6B45874E5C67B258DACDDF6BACF5D735899E
+A6C62DE3BCF40145859A58C0D744588D070AB252A26E87FBBF2CE51E95E5AF46AF3EEDEB147F
+75EA1F698B2D3F582B76381780E2BA8F6F2AA75A0DF480A0B5BCE7C3EF61755A4D9BFD0E9AC8
+5CF716407021CC32CB84C16A90C37E83EB5F0D6B7BEB221FDCE3F9A6701F6BA690748F767AAC
+D6F886F1B2A54037AE8D8B8546E9DD0ED71C2E03B1148BC4763F95CE2A92F2E29E3820F8BC5E
+610200FBCA96221AC7CE0E8DE251618EBA754542FB8EDE1632D48C0D20E882F915BE1F742ECA
+7FFEE8F323B05EACF81846F87CF833E6FD877E01172686BF92B875FC6977B3D524E8D8BF0215
+C3D72182BF368C7F89506B058A2A6042CF86D8DE16BB8210321B5CB1CF42CC5DD52E29D82D9E
+84C957E52BAE129068A6417FAC32427F8C1AF08E2CB44F7CBF3E8B1451DEB7B2CBC772227117
+736D41FF4A6772569A4B2C2C48908A1E36FE12D950521F269A0DCC4449DB961E101D3203E88F
+7910663B7C672EB85F26562A35A26871947B14D69F7E09153F1CC980F0663644C9EBE030EA87
+1399577ECE5CFFD2B7490AC8CBC565359683207E92D072854E094E718CE9D4DF1117A46C223A
+5F095DFF3C1721B52502F7366170444898620985ADD2CD198B292433C88ACF33C022AC15E910
+E56EB3B821341BF3ADC6FBCF1CB7BA72A2318D1C6D36810768674C325CEC8B2F86E19A0CEB06
+64AEC6E1F57BA2952DE44C1DC85FA8AFBA808459222C7608842D4DADE3C8D21210F366BCC222
+BA7BA907328AF3304F9AE2A542FE84DCE9B4B3E13C23E687BC3360E578F660F31F948694ECB1
+766365C13BEABAC7B589D2ECBA799491735B417532E392D56C9DE2B503C2A49CADA4280C863E
+D36CDF747D1BADF31AA0F4C6AB910BFB708F2B3D763C041836C9C4792C8CCCF39519F3B80BB2
+0C7767314CFE03C5BE8FC81AEDF28ADA7C576135618BCE77ED1ED0ED1F8804D4DAFC126B4E94
+83E61917775578AEBC58EE5823CCE006610FF2108E5EC5E9F6EE0B7B09BCD064A2EFCDF71CAB
+DBA10D0FE3DF95A68F85965CF756B19A9664A167263B2751A9B7CA9CD76905A9A16D070912C5
+FD49959C93601DE4998FD65F6B506B9F54A16C92BB88C6CA8751CEFE60731952B2B9550251D0
+612901121CCA0D3A8A51D7F1F5D9C771EB86BDCE40ACC8F35831C9E5ED6F5D5332275D01748F
+88428E97DDD24A036CF030A8D04E3EEB7E86E6B6E6F01BBA6ECDA8B4806DB2DB9D053CA1299F
+5C6D43A64ADE6A7A6F19AC608CEC86FD93407D6BD802EA487D7C46E5190B6B34266184235859
+250E09C49583F8B856EC06E4C120A0E12E4E305540AC662E171DFE00F687EECB571D2DE79473
+E7D22FE4BDB30B9A526F8D68B4129D71FB1620CB3182FAE6B55625F9C2664AAA3FFBF9B799E2
+FC92EE7A19C5E37F0EF4B3A6A902CBED35E34E86D9B7E5E41E5ECAE9876A83B2F2BFB7038EA9
+0A232AF9F300BFB6A45F55D73BCC6B9E5852395D5CD5C77819C568741A7FDBA3A2FFC81FB1B1
+EA0D4D9B450199617FFA0BA8CE26FEAA16F62CBD663798FBB3CD164D6EE6E4F505067C0EC75C
+1C5F81C699DF4165633E0708F8CD2BE2280350C902890FADE818E5B31A6FDB45F7A6F8E5F924
+B4D670B9E3D4EFE00D2B04D6F433753454B3D3EFA16276577DE3F28D146907CB6C05570A6D4E
+DC284093A4B2588162BE6BC867A00CA1A9254234766503FCD3A0E29D9C5676EEABBB3E26FF09
+1E21CA21FEB29365A56B6960E1E76796C097D80454261FB63D5F941B66D9DEDFF932793F1569
+75004F36E2D91D2203049E5D9DE711D832E78CFA18E2B5348B74AA8605E6425D8099C6B10EF3
+E4A299FB76F028BDCAF8ADEA2E908E3535BBA4B42A905F30D13129209DF390139E3C548087BB
+BB46621E71CDE60F450A8C61B247CEBEF47B5F311B3CDC843790CA79DD6C72AE76A679AF24D3
+6D0B1B5388485F880096057CB6287845EE438CE1E6404C5BE7371EB6C060092ACC76AE336835
+1D481984240E51E33061F1D9FCE34A4C65C441F5B4E4D0781103AE0B0CF637CA2FF26182B855
+B696605FE114AB2F7DE5F016E396B5A4FEC79F05ED451EB3EA7CF718936E0CFD2F9CE7781162
+825FD98BE70C3B16123F8D9B0C970DCB545A7CF6A8CA6B4FCAA319C6C4256B10D6D7AAD98931
+40122431F2B0068C10D0398F55FB91DAF2C624A716726513EAADC369BB29FBD1B2B7DC5324D4
+08B0B02E46ACCA565D1413D1F65F545603B06E28637C326053DDD2B78DA99BF320DA2A565258
+CC9F548B2F87511C628610AA00A6C8F5CC5BA2CCB13BB9EC7F123EA7FC49EFBEAF5D7244EACA
+D013A08D3FE370767128687A488302AD3D95067AF108B76886ED16B59E7345DFD143A24CBD75
+E828AE300CA7D24437D4A5F0038DD5265D82CBF39A4F8F542D491486F5BC3566931665909986
+41510AC914312D22803F242311DFBA932BBBCA9DF24B56EB52209A5A9CC8AF2688B59F348E7B
+8FB08281143B2C849BDA4FBDE9D8819E97589EC110FA9F31FF85D07B6D58D58CE5DAC7F22D0F
+97468FC790D913622007DC8045E2D05DCCAF592A540870FB4EBBCE3B5AB9818D49B4E40FC919
+FB8FD87617733360FCE02FDBA5E57B33461D5E085569129B5B7B657DB36D29E3F87E17E9C7B3
+8F6F1FEFD369D314E329440BD0AC26697B34D4E87048EC54F7C381E66C908A658BA83A811285
+E93E32BBC6C641BF0F2412C276B85CB18FED61F22ACA7FFDBD37B994314CE4B711B82402DD26
+632B7DC376AFD3C4D66BE5E40E282B74FB120F6E4E144D90404C7A4513F2AB180E00FD410AB9
+C10CE9B1C2A8EE695E4CEB0F1472A959E70899B1A07DCCB20546431FE6B541A05291D5DDA490
+991BD3560490CAC148A2D623903B630DE49F10DDA865A74AF0866C2FCC595F6FD0A0CDC0A146
+5398818C46554C37A4CB1E543C4760E804B39564BB853400D0E1E9DAAC58D0577AE177726D1B
+9075BBC70B2AECC2F7F44D34F4C691485BBAE03E43E8BC5535CCDFB1CAD1D66F38A49001C4CE
+CBD71202FCC47BBD3B224812C677F4F9E4FD523D44EFCFB05A57E45AE2078E3E16DC785125D9
+55D3B941F4FD72FF547B069EAB30BFD33E3EFF0686FC7E582CF73EEF9866D6E62C19AA005F73
+4CD8FCC0A012F41F38107E135CE4C0AD8A8B81101FE4EF8F32065B2C279A435CF5A032DDCD52
+9628509FB6773B475DC13517625705B5D3A9D9EF6995A37DD3F0D6CE5451845CF9151C40F990
+60ED58E0F2CF5D6DD71944731CC4ED0FC72641E287E295CBB53AEEFC3FF3EC0A5DBAB8C3AD31
+E5F6B339C1748A9E58851F6CDD6BF091227B2835761B7D9A10DF0242A7B61B39AEC0A0697F43
+794FBD2A51A66F860FEA136A9D7DD82B42B61710909104E0FABABE3F5485CF1474D494B97508
+DFF80A698BFA58ECB590D8C38873724BFBA60FB1150B04282AC1022A1214E9513D27C5D45DFB
+C47631BB27CFA2806C2CBB130DDA940B65E75F956846F4E6438773C94E8EAED71EBA5E87A886
+DA7A846EE29A43CFC2D130A3FEB4762091B6AC357C973487573A230DFF74A29E203BD78B89E1
+729B747FF9B58BF1FE5FAE6DD70E9DA091A330078845363681AC2BA501286DDA2038A0FE2235
+C10656143783D50129A728B4EC2C64405B7C97AE562AFA240D35FD9E3A6E034683C60F32AC09
+968A76C775D5547D85D7A3168D6F19F12FE132DEEF497E90951A56CB17E543A76F8A526B1B7C
+481CEEA4F5FFC637DA5CE954A742BF39837F08DFD7156A4F4E4805494C1957B2577ADACC0D3B
+F9B0EFFA5860F454EC947625E70D7E4E652ACF276F57F2137F451540ADC35D501CFC1F7597A1
+502A198EA502D67E7886790A84DD9D225E83D9ECAA18FF9EFFA77AAC3AE57D034E67CBA014C5
+FE1E3403AE4277D864856FEFADD2EDDB1161E8595DB1B2CA6CCADC4253B95300ACEFFBF9C3B3
+32E1FFD71B91898CD0EF1B9F64C3969FFBA7929BAFBDCCCB943373EFDBA057003069C4ACCBBD
+82DF6ED1624FB8D0D4B3E561A05B13550A7EEE9AB35E47E9A96FE49EC2716AA68224E3A65AE1
+E96D530FEE45054DDDCF949E7F3977334E3A9AE459085F366393D232B2CAA244B029F2BC602D
+05B421E14C08563C4296D3E9AD328DC324EA5685E2FED03DFA3D3AFF2482EBB368484FF8D015
+53CB8D5686067F99C5617FA2A7F6F183F4BEA8C1AC39AF726341501AC8875104D11DBF241B9D
+C9929A8B70ED71BD62AFAB7981E452086163DA2DE543E52D57AFD080AFE373E8E321670F8A47
+4E9DFF36441F6C1A4D2AC6DA6E5C9FFC0C4EC9CDD8614C2D65D55019378D678CF46F483FA9EA
+0152D9D3A12175774B56B11BE03362D2A36BA13945979C64163A696B0A6CC760BB6111EC47D0
+A5260DFA7FD147FF35AB84DA889DCF4BA4146647D5BF8773096FAD1EC8001A6085C4F4721428
+F4D4B85F1C03C71576F497D3A5A99392C647DD42F8804DA5D33CCDCE19DF1A16C143C449F1F9
+37F6F75B05ABD0CE90E4EF696E1BCEFCD950634E414DC724B0084BCB515CD4ACD71A6CD3784A
+402C3CF3ADAAFFB763C5F7E17BBBE19172E4455923BA48869B4D9D0C1EAA623D9C728D887C15
+BB8377AC74239EFEF6389EA10C7C8820AAF857BF8EF2B64EAACF096B742ADB9B666D96715364
+CF18D88AD8DA6A0CD303557F04908CD28D11ACB9A730AA3A37B6028914674816E6AC076C4559
+A84880E82D433A5F5722531B0287F11B24AB4CECC2264BAB4E6601C990E32E1C5F9AEA52CA22
+2D2698507A4B235531C3FB7E9FDF6FDA186888A74B902A0EF3457537233376E8667035C092CC
+C3797AD2FDFE1CC8BD71C49B91E4520091922CE87856F1DC60A209A9BC9D97B0141D8820E1F3
+B86BFF25CD1BA07E5664D32C09CDAF569EC7815F41E0E8731E2FCE769BAFB3A751B3EB7082C4
+992A4FD8BA363D0888FF39FF986B80D5568CDFE1DEEFF98CC54F05B842694BE023E0E0507DE4
+7AC1B53BE427D31E0DC9CD5963BC3A5183C54D8C9046068BD6F300F4C0CDB8CB779E6828271D
+BB9EE44B70BDD1C1B5A345AF01E5E9A74260781AA473199CEFB232EE9C60D14DA8C5D3D22291
+A33E592BB7FBE5E9B28F18EF70DD0877DBEB43EBCD12F9AC95B7D46A2E0DC88E3B7D34C6FB32
+1593E7FD7C070D44037B2EB5C5E7F40C2BFA3A282D85932C19D3C3D07F5BD37C5CAB34816E9B
+008BB5988A1703DD971AC36A0F1C61DE0828A6108A1454A17E63F68FC5604101184FAF38061C
+515C0439010551A933CE9701EA75A59D88310C564CA3C4D9BAB34668C6ADA1792C550D08B029
+5E6A2AC490B06A3BA9118ACA61A951BDC06EB5EA612992BAD973AD703F5B25D1007F47CD92E7
+4D824140CE1A827616DF813898FBFE32C87E692FD324FE78FE9101B1789C8C094207BF77C290
+16ECC3734E103ADE9FC7717ED2E6979BE347F72A514B943A7F1101ED25B0AFDCD6C8374182ED
+E624911F458A5EA76FA982C3CEDA0195275DD50BE2AB3FA62F5545F802CE3784159E281A810B
+87DACB95D4D75AE2EED997DAD39BA7346083A046660F0D63D4416EC1AFBCDBFE18966B4C4C10
+9D5C9E9DD7B1202D6AA73AFAFBC169E752DB200656FA28A29A9AEBFA1D4EAED03478778AFE82
+E0AA2DB79ED37AF8C5B940ECC6A5FBF38762505235415B285C72DA21F4FF986376E407C04843
+24B3A2ACFC6D796FF53B5412A1A73DBDAD921F402308041C18C5D7FD9705959A8C0F5EEA851B
+5AB726748A6F0BAE196F879A3A1A5A87F7FC723B7A6E85189914EA451E2BE92B908AFCD4BE5D
+3D2C6C1C40984D10483A9F85648CA31977A4CD0F9781CEA0EBFB97B8B07DA6FE5694C32F0B5D
+23D58CB259E54C46DDABEAEC138EC1C5922337B8CB2741341E3DE7D141E7316B2F0DC75C1A62
+ECD7106141548C31F7B90C0F70106E4E788FCE549DACF492225530F427A6BDFF5ACBAE8913C0
+BBD9E3DEA41EE41FC7C13796A4A7D32AA56305F2420AA9BA5C0A0425861F97FC2B0D586678B9
+5F28A395FC340E5CB4D0DE633E406347BB83E56126872B389CBD57C359807E3AE6CE23C5F1EF
+746BE92625E161BAC1584CB79940DB009844EA870326A7BB6CC8FE67084726E36EACCDD1A5E1
+87D49E1CAD01037E58EEA820171B29968A2E4A08352959052EF9CA920E736C7337D85A44A3DB
+0DA96FB9BFC14177AFE17AAA27B79E1C92B4D53F4CB9C277BAB838C640EFAF3EF4D95CF7BC61
+4F3EECEED6A657E1FB361302500E5DEA28E5B5EE4F3886C23F670090FCA5D2EBA7A5E4B3ED0F
+AEEA8A7E6DC041F9988D43F645BB388FBE848EE495B391FBA4C0C3939F3B5B3203A5527F397E
+D758BEE1E0F0FFE9A379DE0FD8CA3DB83B767C3BAA6214BE3FB012708F1327E1C96B8FE26597
+A0B8403DE77750565067F42F1587B5EEB69D5024A807E98A3BEAF5FE5F88DECEF57F2FAD58E5
+20D282ADEBD2051F086B3B871F0839C71379E6A0F800C7022978C84EF6363B7A79B10386E38E
+8C7DDF0606ED85B780145FA4428DA212AE5386205BA129AD33D28BCC36A0B6CDEE13C37A6C2B
+7456F0C3402FD5B3E3DCE43B479EF0F81DC571FD102BE21029C721E4148729755F19CFF14B1E
+0E30CEFCC09D175AF0811BE99498F4A8632B85879AF0E005495FEF5548F2A1F8C989140726D5
+4BA1FB448E54549A2434A1FBD152E7DF166EA70953C6595CF824CC77984DCB8F8807B7347131
+CB727A589B651697C32E0D52BFC2B36B4C050CF9A1CE072746992EA2ED9B052DE1B2B9A21A89
+682B2BE4A1328C769DBC40BD71202D0287D1F8B909AD0E95E5D80BF8314B457A042F304CA330
+14D4578D50158EECDE6821D1B672B1973393FCFCD432EEB0EB4FB362DCD9B4B280EB5EE2091F
+A3853D779EDAC21A120FA7E03B339CED20115F404C3A086EED187281EC31F25A664811E2B712
+351528C4F0ABCE55D29BDBC1E067C01CB44F8A3E094F104097C5A36DCD1CC621E32747176643
+18D99F5F5D1EA11959CC751FF9F3739F735A12612629BD3346A840DADF0A61567D880597EDC2
+2C70DD8EE5DA9171AE46A8D1D78A64DD2E0F01042CA59FF7F83EC74E1CC0E786DC17A112A062
+7640B89D5F3EA4A57DAA15E9965A81021CF737E0108267C404ABED66D9CFFA22E05C351194A4
+1913A0D12931F26477A06773829D8AEFB25184755DA27F5DF42B23F493D024CF38C544257830
+1EE65AE593127DE8B9E0F19287015892DD881BBF034DF3C789470B567B7AE5130E821870E504
+F893CF1844FE400752C5CA00371433A36DE4C96938F6B7FC81D26DEDCBB7AD4F2519857A81D4
+F06F6A23A74825477C912968FC03B13DE8517BE24831C0E223A601AD7834A3CE0C7059822D1B
+663094AA1D7DE8C524D1E0E5558C664655454A3AA0A5034B50429C5A2AF0C3C862C6D63C415D
+92B2B720CEFCEA0D0C6CDEB5CD89EB701CB49CD568E39059E7B7DA7A85B44213F1060598CAA5
+8D8830DF46C628B18F908DE0C7360B9175F698FF66C5E4EECBCC0010F43C251001F06C45AAA3
+174C8841237E204AD5D7E1C403DFC40F9FD5F469C65625EBA0BC5DF2344228399846C285D9A9
+6E21EEBCD9EA38F25584C5D4B7893E64AF5261656E3FFA0CB1FC10CB512328E87AE3C83CA38E
+9CCF96AED112B93EF8E4D5CE7BF47E8A800E00C4A0AB624DC3C03089BD5C415E8BA33DB289F0
+8E151E5E45865E9CE2EE9E160CF3646726DD25D5EABC96B72A7D2C89178FB92F0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+
+
+%%EndFont
+TeXDict begin 40258437 52099154 1000 600 600 (tb57roeg.dvi)
+@start /Fa 129[39 6[39 2[39 1[39 1[39 39 2[39 2[39 39
+39 39 39 3[39 32[39 5[39 10[39 39 46[{}17 74.7198 /CMTT9
+rf /Fb 134[41 2[41 43 30 30 30 41 1[38 43 64 21 2[21
+43 38 23 34 43 34 1[38 2[38 7[58 3[57 1[52 60 58 1[48
+2[28 2[50 52 59 55 54 58 6[21 38 2[38 38 38 38 38 1[38
+2[26 3[30 30 12[60 8[38 18[{}46 74.7198 /CMR9 rf /Fc
+250[38 5[{}1 74.7198 /CMSY9 rf /Fd 155[120 100[{}1 83.022
+/CMEX10 rf /Fe 190[50 65[{}1 58.1154 /CMTI7 rf /Ff 133[32
+34 38 7[34 1[41 2[35 27 23 105[{}8 58.1154 /CMMI7 rf
+/Fg 148[42 1[32 32 40[65 29[83 17[42 14[65{}7 83.022
+/CMSY10 rf /Fh 140[30 6[34 8[39 1[41 16[49 80[{}5 66.4176
+/CMCSC10 rf /Fi 171[43 46 2[46 49 1[58 7[46 3[49 65[{}7
+66.4176 /LOGO8 rf /Fj 138[35 35 35 35 1[35 35 35 35 35
+2[35 35 35 1[35 35 35 35 35 12[35 6[35 5[35 35 18[35
+3[35 47[{}23 66.4176 /CMTT8 rf /Fk 133[31 37 37 51 37
+39 27 28 28 37 39 35 39 59 20 37 1[20 39 35 22 31 39
+31 39 35 9[72 1[53 51 1[52 2[55 53 1[44 55 1[25 5[51
+1[53 7[35 35 6[35 35 1[20 24 20 2[27 27 20 39[{}46 66.4176
+/CMR8 rf /Fl 204[30 30 30 49[{}3 49.8132 /CMR6 rf /Fm
+204[33 33 33 49[{}3 58.1154 /CMR7 rf /Fn 129[42 1[32
+27 39 41 47 59 40 48 30 39 2[42 40 50 73 1[43 34 29 48
+1[41 1[43 36 36 44 17[63 17[42 1[23 23 25[54 1[49 11[39
+6[53 11[{}32 83.022 /CMMI10 rf /Fo 135[39 55 38 45 28
+34 35 1[42 42 47 68 21 1[25 25 42 38 25 38 42 38 38 42
+8[62 1[62 1[59 47 2[56 64 62 1[52 3[62 64 54 56 1[59
+58 62 13[42 42 42 3[30 25 44[{}42 83.022 /CMTI10 rf /Fp
+129[44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+44 44 3[44 44 44 44 44 1[44 44 44 44 1[44 44 44 1[44
+44 44 44 44 44 44 2[44 44 44 44 44 44 44 44 44 44 44
+44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+44 33[{}86 83.022 /CMTT10 rf /Fq 171[48 52 2[52 55 55
+66 6[52 52 3[55 65[{}9 83.022 /LOGO10 rf
+%DVIPSBitmapFont: Fr logod10 10 7
+/Fr 7 85 df<91B5FC010F14F0013F14FC90B7FC4816804816C04816E04816F0ECC003D8
+1FFCC7EA3FF849141F4848EC0FFC491407007F16FE491403A400FF16FF4980A690B8FCA8
+0180C71201B16CC912FE003E167C30347BB23A>65 D<001FB712E0007F16F017F8B8FCA3
+17F017E00180C9FCB090B612FC8282A45E5E0180C9FCAA90B712E017F017F8A37E17F000
+1F16E02D327BB136>69 D<003EEF07C0007FEF0FE0486CEE1FF0A26D163F6D167FA26D16
+FF6D5DA26D5D6D5DA26D5D6E5CA26E5CA26E5CD9BFF0ECFFDFA2D99FF849139F6E5B018F
+161FD987FEEB07FE6E130F018315FC01819038801FF8EDC03F018015F091397FE07FE0ED
+F0FF023F14C0DA1FF9138092B5FC6E14006E5BA26E5B6E5BA26E5B6F5AA26F5AA2030FC7
+FC92C8FCA36CCAEA0FE0003EEF07C03C347BB246>77 D<91383FFFFC0103B612C0010F15
+F0013F15FC90B8FC4817804817C04817E0489026F0000F13F091C8FCD81FFCED3FF84915
+1F4848ED0FFC491507007F17FE491503A400FF17FF4981B06D5D007F17FEA36D15076C6C
+ED0FFC01FC153F261FFFC0903803FFF891B7FC6C17F06C17E06C17C0C61700013F15FC01
+0F15F0010092C7FC38347FB23A>79 D<001FB612E0007F15FC16FFB812C017E017F017F8
+A20180C7EA7FFC160F160717FE1603A8160717FC160F167F90B712F8A217F017E017C017
+0016FC16E00180C9FCB16CCAFC123E2F337BB136>I<013FB612C048B712E0000716F05A
+5A5A17E04816C001F0C9FC13C012FF5BAA7F127F13F090B612F06C15FEEEFF806C16E06C
+16F06C16F81201D8003F15FC90C8123FEE07FE1603A61607EE3FFC001FB7FC007F16F8A2
+B812F017E06C1680EEFE00001F15F02F327BB136>83 D<003FB812804817C0B912E0A46C
+17C06C1780C7D807FCC8FCB3B3A56E5A6E5A333380B133>I E
+%EndDVIPSBitmapFont
+/Fs 133[42 50 50 69 50 53 37 38 39 1[53 48 53 80 27 50
+29 27 53 48 29 44 53 42 53 46 10[72 1[66 53 72 1[65 72
+75 1[57 2[36 2[60 1[73 69 68 72 9[48 48 48 48 48 48 48
+4[27 31[53 56 11[{}49 83.022 /CMBX10 rf /Ft 139[58 60
+53 1[80 79 80 1[37 2[37 80 4[70 1[75 25[105 5[105 65[{}13
+143.462 /CMSSBX10 rf /Fu 128[42 2[83 1[37 44 44 60 44
+46 32 33 33 44 46 42 46 69 23 44 25 23 46 42 25 37 46
+37 46 42 4[42 2[62 62 85 62 62 60 46 61 1[57 65 62 76
+52 65 43 30 62 65 54 57 63 60 59 62 3[65 1[23 23 42 42
+42 42 42 42 42 42 42 42 42 23 28 23 65 1[32 32 23 65
+3[42 1[23 12[42 4[69 1[46 48 11[{}81 83.022 /CMR10 rf(cmmi10)cvn
+9.96265 /Fn 1 fstore(cmsy10)cvn 9.96265 /Fg 1 fstore(cmr10)cvn
+9.96265 /Fu 1 fstore(cmmi7)cvn 6.97385 /Ff 1 fstore end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 274 1
+274 0 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(274)2470
+b(TUGb)r(oat,)28 b(V)-7 b(olume)27 b(18)g(\(1997\),)f(No.)i(4)p
+0 22 1868 5 v 0 320 5 299 v 239 221 a Ft(Graphics)i(Applications)p
+1863 320 V 0 325 1868 5 v 0 491 a Fs(Creating)i(3D)f(animations)g(with)
+h Fr(MET)n(AP)t(OST)166 624 y Fu(Denis)c(Ro)r(egel)0
+790 y Fs(Abstract)0 923 y Fq(MET)n(AP)t(OST)33 b Fu(can)e(b)r(e)h(used)
+g(to)f(create)g(animations.)48 b(W)-7 b(e)0 1022 y(sho)n(w)38
+b(here)g(an)g(example)h(of)f(animation)g(of)h(p)r(olyhedra,)0
+1122 y(in)n(tro)r(ducing)27 b(the)h Fp(3d)f Fu(pac)n(k)-5
+b(age.)0 1288 y Fs(In)m(tro)s(duction)0 1421 y Fq(MET)n(AP)t(OST)27
+b Fu(\(Hobb)n(y)f(\(1992\);)f(see)g(also)g(the)h(description)0
+1521 y(in)c(Go)r(ossens)f(et)14 b(al.)21 b(\(1997\)\))g(is)g(a)h(dra)n
+(wing)e(language)g(v)n(ery)0 1620 y(similar)37 b(to)h
+Fq(MET)n(AF)l(ONT)r Fu(,)j(but)e(whose)e(output)h(is)g(P)n(ost-)0
+1720 y(Script.)43 b Fq(MET)n(AP)t(OST)31 b Fu(is)f(esp)r(ecially)f
+(suited)h(for)f(geomet-)0 1819 y(rical)34 b(and)g(tec)n(hnical)h(dra)n
+(wings,)g(where)f(a)g(dra)n(wing)f(can)0 1919 y(naturally)24
+b(b)r(e)h(decomp)r(osed)g(in)g(sev)n(eral)e(parts,)i(related)f(in)0
+2019 y(some)19 b(logical)g(w)n(a)n(y)-7 b(.)33 b(Kn)n(uth)20
+b(is)g(using)h Fq(MET)n(AP)t(OST)g Fu(for)f(the)0 2118
+y(revisions)28 b(of)h(and)g(additions)g(to)g Fo(The)j(A)n(rt)e(Of)h
+(Computer)0 2218 y(Pr)l(o)l(gr)l(amming)40 b Fu(\(Kn)n(uth,)34
+b(1997\),)e(and)g(it)h(is)f(or)f(will)i(b)r(e)f(a)0 2318
+y(comp)r(onen)n(t)27 b(of)h(ev)n(ery)e(standard)h(T)1131
+2333 y(E)1177 2318 y(X)h(distribution.)166 2417 y(Unfortunately)-7
+b(,)46 b Fq(MET)n(AP)t(OST)e Fu(is)e(still)g(quite)h(bare)0
+2517 y(and)26 b(the)g(user)f(is)h(only)f(o\013ered)h(the)g(ra)n(w)e(p)r
+(o)n(w)n(er)13 b(|)h(a)25 b(little)0 2616 y(bit)40 b(lik)n(e)f(the)g(T)
+505 2632 y(E)552 2616 y(X)g(user)g(who)g(only)f(has)h(plain)g(T)1646
+2632 y(E)1693 2616 y(X)g(at)0 2716 y(his/her)c(disp)r(osal.)62
+b(The)37 b(lac)n(k)e(of)h(libraries)f(is)h(certainly)0
+2816 y(due)g(to)f(the)h(infancy)g(of)42 b Fq(MET)n(AP)t(OST)c
+Fu(\(whic)n(h)e(came)f(in)0 2915 y(the)41 b(public)f(domain)g(at)g(the)
+h(b)r(eginning)f(of)h(1995\))d(and)0 3015 y(th)n(us)28
+b(to)f(the)h(small)f(n)n(um)n(b)r(er)h(of)f(its)h(users.)166
+3115 y(In)45 b(this)g(pap)r(er,)k(w)n(e)44 b(presen)n(t)g(a)g(w)n(a)n
+(y)g(to)g(pro)r(duce)0 3214 y(animations)i(using)h Fq(MET)n(AP)t(OST)r
+Fu(.)94 b(The)47 b(tec)n(hnique)f(is)0 3314 y(quite)c(general)e(and)h
+(w)n(e)g(illustrate)g(it)g(through)g(the)h Fp(3d)0 3413
+y Fu(pac)n(k)-5 b(age.)0 3579 y Fs(Animations)0 3712
+y Fu(The)25 b(W)-7 b(orld)25 b(Wide)g(W)-7 b(eb)26 b(has)e(accustomed)g
+(us)h(to)g(v)-5 b(arious)0 3812 y(animations,)39 b(esp)r(ecially)e
+Fp(java)e Fu(animations.)65 b(Common)0 3912 y(comp)r(onen)n(ts)23
+b(of)h(w)n(eb)g(pages)e(are)h(animated)h(GIF)g(images.)166
+4011 y(Pro)r(ducing)37 b(animations)g(in)i Fq(MET)n(AP)t(OST)h
+Fu(is)e(actu-)0 4111 y(ally)46 b(quite)i(easy)-7 b(.)93
+b(A)48 b(n)n(um)n(b)r(er)e(of)h Fn(n)g Fu(images)f(will)h(b)r(e)0
+4210 y(computed)35 b(and)f(their)g(sequence)g(pro)r(duces)f(the)i
+(anima-)0 4310 y(tion.)83 b(The)43 b(animation)g(will)g(b)r(e)g
+(similar)f(to)h(a)g(mo)n(vie,)0 4410 y(with)28 b(no)g(in)n(teraction.)
+37 b(More)27 b(precisely)-7 b(,)27 b(if)i Fp(an_image\()p
+Fn(i)p Fp(\))0 4509 y Fu(pro)r(duces)d(a)h(picture)g(parameterized)e(b)
+n(y)i Fn(i)p Fu(,)f(it)i(su\016ces)e(to)0 4609 y(wrap)h(this)h(macro)e
+(b)r(et)n(w)n(een)i Fp(beginfig)c Fu(and)j Fp(endfig)p
+Fu(:)0 4739 y Fp(def)42 b(one_image_out\(exp)o(r)37 b(i\)=)87
+4838 y(beginfig\(<figure)g(number>\);)174 4938 y(an_image\(i\);)87
+5037 y(endfig;)0 5137 y(enddef;)0 5267 y Fu(and)27 b(to)h(lo)r(op)f(o)n
+(v)n(er)f Fp(one_image_out)p Fu(:)0 5396 y Fp(for)42
+b(j:=1)g(upto)g(100:one_image_out)o(\(j)o(\);e)o(nd)o(fo)o(r;)2183
+100 y Fu(Assuming)i(that)h Fp(<figure)c(number>)g Fu(is)j(equal)g(to)
+2017 199 y(the)30 b(parameter)d(of)i Fp(an_image)p Fu(,)d(the)k
+(compilation)e(of)h(this)2017 299 y(program)17 b(will)j(pro)r(duce)e(a)
+h(h)n(undred)g(\014les)g(with)g(extensions)2017 399 y
+Fp(.1)p Fu(,)27 b Fp(.2)p Fu(,)g(.)14 b(.)g(.)g(,)27
+b Fp(.100)p Fu(.)35 b(All)28 b(these)g(\014les)f(are)f(P)n(ostScript)h
+(\014les)2017 498 y(and)39 b(all)f(w)n(e)h(need)g(to)f(do)h(is)f(to)h
+(\014nd)g(a)f(w)n(a)n(y)g(to)g(collate)2017 598 y(them)33
+b(in)e(one)h(piece.)48 b(Ho)n(w)31 b(to)h(do)f(this)h(dep)r(ends)g(on)f
+(the)2017 697 y(op)r(erating)i(system.)55 b(On)33 b(UNIX)i(for)e
+(instance,)i(one)e(can)2017 797 y(use)26 b Fp(Ghostscript)21
+b Fu(to)k(transform)g(a)g(P)n(ostScript)f(\014le)i(in)n(to)2017
+897 y Fp(ppm)g Fu(and)g(then)i(transform)d(eac)n(h)h
+Fp(ppm)g Fu(\014le)g(in)n(to)h(GIF)g(with)2017 996 y
+Fp(ppmtogif)p Fu(.)46 b(These)31 b(programs)f(are)g(part)h(of)h(the)g
+Fp(NETPBM)2017 1096 y Fu(pac)n(k)-5 b(age)30 b(\(Da)n(vidsen,)h
+(1993\).)44 b(Finally)-7 b(,)32 b(a)e(program)f(suc)n(h)2017
+1196 y(as)46 b Fp(gifmerge)c Fu(\(M)r(\177)-44 b(uller,)51
+b(1996\))44 b(creates)g(an)i(animated)2017 1295 y(GIF)c(\014le)g
+(\(GIF89A\))g(out)g(of)f(the)h(h)n(undred)f(individual)2017
+1395 y(simple)19 b(GIFs.)34 b(Ho)n(w)n(ev)n(er,)19 b(v)-5
+b(arious)17 b(details)h(m)n(ust)h(b)r(e)g(tak)n(en)2017
+1494 y(care)27 b(of.)38 b(F)-7 b(or)27 b(instance,)h(only)f(a)h(part)f
+(of)34 b Fp(Ghostscript)p Fu('s)2017 1594 y(output)40
+b(is)e(needed)h(and)g(selection)f(can)g(b)r(e)h(made)g(with)2017
+1694 y Fp(pnmcut)p Fu(.)2183 1793 y(The)47 b(whole)f(pro)r(cess)g(of)g
+(creating)g(an)g(animation)2017 1893 y(out)30 b(of)36
+b Fq(MET)n(AP)t(OST)r Fu('s)30 b(outputs)g(can)f(b)r(e)h(summed)g(up)g
+(in)2017 1993 y(a)41 b(shell)g(script,)i(similar)d(to)h(the)g(one)f(in)
+h(\014gure)f(1.)76 b(As)2017 2092 y(w)n(e)32 b(will)f(see,)h(this)g
+(script)g(\(including)f(the)h(argumen)n(ts)f(of)2017
+2192 y Fp(awk)23 b Fu(and)g Fp(pnmcut)p Fu(\))f(can)h(b)r(e)h
+(generated)e(automatically)h(b)n(y)2017 2291 y Fq(MET)n(AP)t(OST)30
+b Fu(itself.)2017 2457 y Fs(Ob)5 b(jects)32 b(in)g(space)2017
+2590 y(In)m(tro)s(duction)45 b Fu(The)30 b(author)f(applied)h(this)g
+(idea)g(to)g(the)2017 2690 y(animation)36 b(of)f(ob)5
+b(jects)36 b(in)g(space.)60 b(The)36 b(macros)e(in)i(the)2017
+2790 y Fp(3d.mp)31 b Fu(pac)n(k)-5 b(age)2551 2759 y
+Fm(1)2620 2790 y Fu(pro)n(vide)32 b(a)g(basis)h(for)f(the)i(represen)n
+(ta-)2017 2889 y(tion)i(of)f(three-dimensional)g(ob)5
+b(jects.)60 b(The)35 b(basic)g(com-)2017 2989 y(p)r(onen)n(ts)26
+b(of)g(the)g(ob)5 b(jects)25 b(are)g(the)h(p)r(oin)n(ts)g(or)f(the)h(v)
+n(ectors.)2017 3088 y(Both)h(are)f(stored)g(as)h(triplets.)37
+b(More)26 b(precisely)-7 b(,)26 b(w)n(e)h(ha)n(v)n(e)2017
+3188 y(three)h(arra)n(ys)2455 3158 y Fm(2)2517 3188 y
+Fu(of)g(t)n(yp)r(e)f Fp(numeric)p Fu(:)2017 3331 y Fp(numeric)41
+b(vect[]x,vect[]y,v)o(ec)o(t[)o(]z;)2183 3474 y Fu(V)-7
+b(ector)30 b Fn(i)p Fu('s)g(comp)r(onen)n(ts)f(are)g
+Fp(vect[)p Fn(i)p Fp(]x)p Fu(,)f Fp(vect[)p Fn(i)p Fp(]y)2017
+3573 y Fu(and)34 b Fp(vect[)p Fn(i)p Fp(]z)p Fu(.)51
+b(It)33 b(is)h(then)g(straigh)n(tforw)n(ard)c(to)j(de\014ne)2017
+3673 y(the)j(usual)f(op)r(erations)e(on)i(v)n(ectors)f(using)h(this)g
+(con)n(v)n(en-)2017 3772 y(tion.)i(F)-7 b(or)27 b(instance,)h(v)n
+(ector)e(addition)i(is)f(de\014ned)h(as:)2017 3915 y
+Fp(def)43 b(vect_sum\(expr)38 b(k,i,j\)=)2105 4015 y(vect[k]x:=vect[)o
+(i]x)o(+v)o(ect)o([j)o(]x)o(;)2105 4115 y(vect[k]y:=vect[)o(i]y)o(+v)o
+(ect)o([j)o(]y)o(;)2105 4214 y(vect[k]z:=vect[)o(i]z)o(+v)o(ect)o([j)o
+(]z)o(;)2017 4314 y(enddef;)p 2017 4451 748 4 v 2124
+4505 a Fl(1)2178 4529 y Fk(On)27 b(CT)-6 b(AN,)26 b(under)h
+Fj(graphics/metapost/macr)q(os/)q(3d)p Fk(.)47 b(The)2017
+4607 y(co)r(de)30 b(is)d(do)r(cumen)n(ted)j(with)e Fj(MFT)h
+Fk(\(Kn)n(uth,)h(1989\))g(and)e(illustrated)2017 4686
+y(with)33 b Fi(MET)n(AP)s(OST)r Fk(.)53 b(This)32 b(pap)r(er)g(describ)
+r(es)h(v)n(ersion)f(1.0)g(of)f(the)2017 4765 y(macros.)2124
+4821 y Fl(2)2178 4844 y Fi(MET)n(AP)s(OST)h Fk(has)h(a)g(few)f(simple)g
+(t)n(yp)r(es)i(suc)n(h)f(as)g Fj(numeric)p Fk(,)2017
+4923 y Fj(boolean)p Fk(,)41 b Fj(string)p Fk(,)f Fj(path)p
+Fk(,)g(.)11 b(.)g(.)h(.)67 b(It)37 b(also)f(has)g(pairs)f(\()p
+Fj(pair)p Fk(\))j(and)2017 5002 y(triples)32 b(\()p Fj(color)p
+Fk(\).)60 b(W)-6 b(e)34 b(migh)n(t)e(ha)n(v)n(e)i(c)n(heated)h(and)e
+(stored)g(p)r(oin)n(ts)2017 5081 y(as)27 b(colors,)f(but)h(instead,)h
+(w)n(e)f(found)f(it)h(in)n(teresting)g(to)g(illustrate)f(a)2017
+5160 y(construction)21 b(equiv)l(alen)n(t)f(to)f Fh(P)-6
+b(ascal)p Fk('s)19 b(records)f(or)g(C's)g(structures.)2017
+5239 y(In)44 b Fi(MET)n(AP)s(OST)r Fk(,)i(instead)e(of)f(ha)n(ving)h(a)
+g(list)f(or)g(an)g(arra)n(y)h(of)2017 5318 y(structures,)37
+b(w)n(e)d(use)g(sev)n(eral)g(lists)f(or)g(arra)n(ys,)j(so)d(that)i(a)f
+(record)2017 5396 y(is)23 b(a)h(cross-section)g(o)n(v)n(er)g(sev)n
+(eral)g(arra)n(ys.)p eop
+%%Page: 275 2
+275 1 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(TUGb)r(oat,)28
+b(V)-7 b(olume)28 b(18)e(\(1997\),)h(No.)g(4)2471 b(275)0
+74 y Fp(#!)43 b(/bin/sh)0 274 y(/bin/rm)e(-f)h(animpoly.log)0
+373 y(for)g(i)i(in)e(`ls)h(animpoly.*|)c(grep)j('animpoly.[0-9])o('`;)o
+(do)0 473 y(echo)g($i)0 572 y(echo)g('==============')0
+672 y(#)h(shift)f(each)g(picture)e(so)j(that)f(it)h(lies)f(in)g(the)h
+(page:)0 772 y(awk)86 b(<)43 b($i)g('{print})d(/^\045\045Page:)g
+(/{print)h("172)h(153)g(translate\\n"}')c(>)43 b($i.ps)0
+871 y(#)g(produce)e(ppm)h(format:)0 971 y(gs)h(-sDEVICE=ppmraw)37
+b(-sPAPERSIZE=a4)h(-dNOPAUSE)i(-r36)i(-sOutputFile=$i.)o(pp)o(m)37
+b(-q)43 b(--)g($i.ps)0 1071 y(/bin/rm)e(-f)h($i.ps)0
+1170 y(#)h(produce)e(gif:)0 1270 y(ppmquant)f(32)j($i.ppm)e(|)i(pnmcut)
+e(15)i(99)g(141)f(307)h(|)g(ppmtogif)d(>)j(`expr)f($i.ppm)f(:)i
+('\\\(.*\\\)ppm'`gif)0 1369 y(/bin/rm)e(-f)h($i.ppm)0
+1469 y(done)0 1569 y(/bin/rm)f(-f)h(animpoly.gif)0 1668
+y(#)h(merge)f(the)g(gif)g(files:)0 1768 y(gifmerge)e(-10)j(-l1000)e
+(animpoly.*.gif)d(>)43 b(animpoly.gif)0 1868 y(/bin/rm)e(-f)h
+(animpoly.*.gif)574 2075 y Fs(Figure)31 b(1)p Fu(:)37
+b(Script)28 b(created)e(b)n(y)j Fq(MET)n(AP)t(OST)g Fu(\(with)g(some)e
+(additional)g(commen)n(ts\))166 2345 y(Often,)h(w)n(e)f(need)h(some)f
+(scratc)n(h)f(v)n(ectors)g(or)h(v)n(ectors)0 2445 y(lo)r(cal)j(to)g(a)g
+(macro.)43 b(A)31 b(simple)f(v)n(ector)f(allo)r(cation)h(mec)n(h-)0
+2544 y(anism)d(solv)n(es)f(the)h(problem:)36 b(w)n(e)27
+b(use)g(a)g(stac)n(k)f(of)i(v)n(ectors)0 2644 y(and)k(w)n(e)g(reserv)n
+(e)f(and)h(free)h(v)n(ectors)d(only)j(on)f(top)g(of)h(the)0
+2743 y(stac)n(k.)76 b(F)-7 b(or)40 b(instance,)k(the)d(allo)r(cation)f
+(of)g(a)h(v)n(ector)e(is)0 2843 y(de\014ned)28 b(b)n(y:)0
+2981 y Fp(def)42 b(new_vect=incr\(las)o(t_)o(vec)o(t_)o(\))c(enddef;)0
+3118 y Fu(where)i Fp(last_vect_)d Fu(is)k(the)g(index)g(of)g(the)g(top)
+g(of)g(the)0 3218 y(stac)n(k.)49 b(Hence,)33 b(a)f(v)n(ector)e(is)i
+(manipulated)g(b)n(y)g(its)g(index)0 3317 y(on)h(the)h(stac)n(k.)53
+b(W)-7 b(riting)33 b Fp(v:=new_vect;)c Fu(lets)k Fp(v)g
+Fu(b)r(e)h(the)0 3417 y(index)28 b(of)f(the)h(newly)g(allo)r(cated)f(v)
+n(ector.)166 3517 y(F)-7 b(reeing)23 b(a)g(v)n(ector)g(is)g(also)g
+(easy)f(and)i(is)f(only)g(allo)n(w)n(ed)0 3616 y(at)k(the)h(top)g(of)g
+(the)g(stac)n(k:)0 3754 y Fp(def)42 b(free_vect\(expr)c(i\)=)87
+3853 y(if)43 b(i=last_vect_:)218 3953 y(last_vect_:=last)o(_v)o(ect)o
+(_-)o(1;)87 4053 y(else:)f(errmessage\("Vec)o(tor)37
+b(")43 b(&)218 4152 y(decimal)e(i)i(&)g(")g(can't)f(be)g(freed!"\);)87
+4252 y(fi;)0 4352 y(enddef;)166 4489 y Fu(Ho)n(w)30 b(these)h(macros)d
+(are)i(used)g(is)h(made)f(explicit)h(in)0 4589 y(the)f
+Fp(vect_rotate)c Fu(macro)j(whic)n(h)h(do)r(es)g(a)f(rotation)g(of)h(a)
+0 4688 y(v)n(ector)j Fp(v)g Fu(around)g(a)h(v)n(ector)e
+Fp(axis)h Fu(b)n(y)g(an)h(angle)f Fp(alpha)p Fu(.)0 4788
+y(This)20 b(rotation)f(is)h(illustrated)g(in)h(\014gure)e(2.)31
+b Fn(~)-39 b(v)23 b Fu(is)d(written)h(as)0 4888 y(the)i(sum)g(of)393
+4866 y Fn(~)398 4888 y(h)g Fu(and)17 b Fn(~)-37 b(a)23
+b Fu(where)922 4866 y Fn(~)927 4888 y(h)g Fg(?)17 b Fn(~)-36
+b(a)o Fu(.)36 b(If)1256 4866 y Fn(~)1266 4888 y(b)22
+b Fu(is)1403 4841 y Fg(\000)-27 b(\000)g(!)1403 4888
+y Fn(axis=)p Fg(k)1646 4841 y(\000)f(\000)g(!)1646 4888
+y Fn(axis)n Fg(k)p Fu(,)-5 4998 y Fn(~)-37 b(c)28 b Fu(is)g(computed)h
+(as)f(the)g(v)n(ector)f(pro)r(duct)i(of)1427 4976 y Fn(~)1436
+4998 y(b)f Fu(and)23 b Fn(~)-37 b(a)28 b Fu(and)-5 5098
+y Fn(~)-37 b(a)28 b Fu(is)f(then)h(rotated)f(in)h(a)f(simple)h(w)n(a)n
+(y)e(resulting)h(in)1678 5076 y Fn(~)1667 5098 y(f)9
+b Fu(.)166 5197 y(The)34 b(v)n(ectors)f(declared)g(with)i
+Fp(new_vect)c Fu(are)i(freed)0 5297 y(in)21 b(the)f(in)n(v)n(erse)f
+(order.)34 b(The)20 b Fp(vect_rotate)c Fu(macro)j(mak)n(es)0
+5396 y(use)29 b(of)h(a)f(few)h(other)f(macros:)40 b Fp(vect_mod)26
+b Fu(computes)k(the)2017 2345 y(mo)r(dulus)38 b(of)e(a)h(v)n(ector;)j
+Fp(vect_dprod\(a,b\))31 b Fu(is)36 b(the)i(dot)2017 2445
+y(pro)r(duct)28 b(of)g(v)n(ectors)f Fp(a)g Fu(and)h Fp(b)p
+Fu(;)g Fp(vect_mult\(b,a,x\))21 b Fu(lets)2017 2544 y(v)n(ector)45
+b Fp(b)h Fu(equal)f(v)n(ector)g Fp(a)g Fu(m)n(ultiplied)i(b)n(y)f(the)g
+(scalar)2017 2644 y Fp(x)p Fu(;)35 b Fp(vect_sum)29 b
+Fu(and)j Fp(vect_diff)d Fu(compute)j(as)g(their)g(\014rst)2017
+2743 y(argumen)n(t)24 b(the)i(sum)f(or)g(the)g(di\013erence)g(of)g(the)
+h(t)n(w)n(o)e(other)2017 2843 y(v)n(ectors;)34 b Fp(vect_prod\(c,a,b)o
+(\))26 b Fu(lets)33 b(v)n(ector)d Fp(c)i Fu(equal)g(the)2017
+2943 y(v)n(ectorial)c(pro)r(duct)g(of)h(v)n(ectors)e
+Fp(a)i Fu(and)f Fp(b)p Fu(.)41 b(These)28 b(macros)2017
+3042 y(are)f(describ)r(ed)g(in)h(app)r(endix)g(A.)2017
+3223 y Fp(vardef)42 b(vect_rotate\(exp)o(r)c(v,axis,alpha\)=)2105
+3323 y(save)k(v_a,v_b,v_c,v_d)o(,v_)o(e,)o(v_)o(f;)2105
+3422 y(v_a:=new_vect;v)o(_b:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3522 y(v_c:=new_vect;v)o(_d:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3622 y(v_e:=new_vect;v)o(_f:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3721 y(v_g:=new_vect;v)o(_h:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3821 y(vect_mult\(v_b,a)o(xis)o(,1)o(/ve)o(ct)o(_m)o(od\()o(ax)o(is\))o
+(\);)2105 3920 y(vect_mult\(v_h,v)o(_b,)o(ve)o(ct_)o(dp)o(ro)o(d\(v)o
+(_b)o(,v\))o(\);)2105 4020 y(vect_diff\(v_a,v)o(,v_)o(h\))o(;)2105
+4120 y(vect_prod\(v_c,v)o(_b,)o(v_)o(a\);)2105 4219 y(vect_mult\(v_d,v)
+o(_a,)o(co)o(sd\()o(al)o(ph)o(a\)\))o(;)2105 4319 y(vect_mult\(v_e,v)o
+(_c,)o(si)o(nd\()o(al)o(ph)o(a\)\))o(;)2105 4419 y(vect_sum\(v_f,v_)o
+(d,v)o(_e)o(\);)2105 4518 y(vect_sum\(v,v_f,)o(v_h)o(\);)2105
+4618 y(free_vect\(v_h\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(g\);)2105
+4717 y(free_vect\(v_f\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(e\);)2105
+4817 y(free_vect\(v_d\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(c\);)2105
+4917 y(free_vect\(v_b\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(a\);)2017
+5016 y(enddef;)2183 5197 y Fu(The)35 b Fp(3d)f Fu(pac)n(k)-5
+b(age)33 b(de\014nes)i(other)f(macros)f(in)i(order)2017
+5297 y(to)30 b(set)h(the)f(observ)n(er,)f(to)h(compute)g(a)g(reference)
+f(matrix,)2017 5396 y(etc.)37 b(Pro)n(vision)26 b(is)h(giv)n(en)g(for)g
+(manipulating)g(ob)5 b(jects.)p eop
+%%Page: 276 3
+276 2 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(276)2470
+b(TUGb)r(oat,)28 b(V)-7 b(olume)27 b(18)g(\(1997\),)f(No.)i(4)850
+883 y @beginspecial -23 @llx -6 @lly 112 @urx 86 @ury
+1350 @rwi @setspecial
+%%BeginDocument: vect-fig.9
+%!PS
+%%BoundingBox: -23 -6 112 86
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 61:81802504
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+111.6626 19.68887 lineto stroke
+newpath 107.90381 18.32079 moveto
+111.6626 19.68887 lineto
+107.66257 19.68886 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 38.19089 lineto stroke
+newpath 52.97243 35.39383 moveto
+55.8313 38.19089 lineto
+52.18819 36.54028 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 28.34645 moveto
+55.8313 38.19089 lineto stroke
+ [] 0 setdash
+newpath 52.07251 36.8228 moveto
+55.8313 38.19089 lineto
+51.83127 38.19087 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath 55.8313 9.84444 moveto
+55.8313 38.19089 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath 56.5259 34.2516 moveto
+55.8313 38.19089 lineto
+55.1367 34.2516 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 28.34645 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 24.40717 moveto
+0 28.34645 lineto
+-0.6946 24.40717 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 52.07251 8.47635 moveto
+55.8313 9.84444 lineto
+51.83127 9.84442 lineto
+ closepath
+gsave fill grestore stroke
+-22.0623 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-17.5124 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 56.98946 moveto
+(!) cmsy10 9.96265 fshow
+-22.0623 50.58485 moveto
+(axis) cmmi10 9.96265 fshow
+-9.4037 11.92883 moveto
+(~) cmmi10 9.96265 fshow
+-8.7401 9.29984 moveto
+(h) cmmi10 9.96265 fshow
+24.6588 -5.19548 moveto
+(~) cmmi10 9.96265 fshow
+25.2826 -5.19548 moveto
+(a) cmmi10 9.96265 fshow
+20.24216 21.19543 moveto
+(~) cmmi10 9.96265 fshow
+20.62906 21.19543 moveto
+(v) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1361 w @beginspecial -13 @llx -18 @lly 86
+@urx 86 @ury 990 @rwi @setspecial
+%%BeginDocument: vect-fig.10
+%!PS
+%%BoundingBox: -13 -18 86 86
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000039000001
+%%EndProlog
+%%Page: 1 1
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+85.03935 0 lineto stroke
+newpath 81.09966 -0.69467 moveto
+85.03935 0 lineto
+81.09966 0.69467 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 56.6929 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 52.75362 moveto
+0 56.6929 lineto
+-0.6946 52.75362 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+56.6929 0 lineto stroke
+newpath 52.75362 -0.6946 moveto
+56.6929 0 lineto
+52.75362 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+43.42886 36.44173 lineto stroke
+newpath 40.85773 33.37752 moveto
+43.42886 36.44173 lineto
+39.96478 34.44167 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 4.2518 0 moveto
+4.2518 1.1277 3.80376 2.20908 3.00641 3.00641 curveto
+2.20908 3.80376 1.1277 4.2518 0 4.2518 curveto
+-1.1277 4.2518 -2.20908 3.80376 -3.00641 3.00641 curveto
+-3.80376 2.20908 -4.2518 1.1277 -4.2518 0 curveto
+-4.2518 -1.1277 -3.80376 -2.20908 -3.00641 -3.00641 curveto
+-2.20908 -3.80376 -1.1277 -4.2518 0 -4.2518 curveto
+1.1277 -4.2518 2.20908 -3.80376 3.00641 -3.00641 curveto
+3.80376 -2.20908 4.2518 -1.1277 4.2518 0 curveto closepath stroke
+newpath 0.99626 0 moveto
+0.99626 0.26422 0.8913 0.51764 0.70447 0.70447 curveto
+0.51764 0.8913 0.26422 0.99626 0 0.99626 curveto
+-0.26422 0.99626 -0.51764 0.8913 -0.70447 0.70447 curveto
+-0.8913 0.51764 -0.99626 0.26422 -0.99626 0 curveto
+-0.99626 -0.26422 -0.8913 -0.51764 -0.70447 -0.70447 curveto
+-0.51764 -0.8913 -0.26422 -0.99626 0 -0.99626 curveto
+0.26422 -0.99626 0.51764 -0.8913 0.70447 -0.70447 curveto
+0.8913 -0.51764 0.99626 -0.26422 0.99626 0 curveto closepath fill
+ [3 3 ] 0 setdash
+newpath 0 36.44173 moveto
+43.42886 36.44173 lineto
+43.42886 0 lineto stroke
+ [] 0 setdash
+newpath 56.6929 0 moveto
+56.6929 13.32878 51.99652 26.23135 43.42886 36.44173 curveto
+32.65703 49.2789 16.75783 56.6929 0 56.6929 curveto stroke
+newpath 17.00804 0 moveto
+17.00804 3.99867 15.59912 7.86949 13.0288 10.93263 curveto stroke
+newpath 15.76941 8.01904 moveto
+14.979 9.08745 14.06085 10.06664 13.0288 10.93263 curveto
+13.70242 9.76588 14.23032 8.53172 14.60764 7.25742 curveto
+ closepath
+gsave fill grestore stroke
+-7.8591 53.13405 moveto
+(~) cmmi10 9.96265 fshow
+-7.3114 53.13405 moveto
+(c) cmmi10 9.96265 fshow
+-13.16432 -14.88742 moveto
+(~) cmmi10 9.96265 fshow
+-12.04523 -17.51642 moveto
+(b) cmmi10 9.96265 fshow
+25.0896 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+25.7134 -10.1177 moveto
+(a) cmmi10 9.96265 fshow
+15.04314 24.88705 moveto
+(~) cmmi10 9.96265 fshow
+13.66454 22.25806 moveto
+(f) cmmi10 9.96265 fshow
+24.30934 5.6113 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1461 1091 a Fs(Figure)j(2)p Fu(:)37 b(V)-7
+b(ector)27 b(rotation)0 1356 y Fs(Ob)5 b(jects)32 b(and)g(classes)41
+b Fu(The)22 b Fp(3d)g Fu(pac)n(k)-5 b(age)21 b(understands)0
+1456 y(a)k(notion)g(of)h Fo(class)p Fu(.)37 b(A)26 b
+Fo(class)33 b Fu(is)25 b(a)g(parameterized)f(ob)5 b(ject.)0
+1555 y(F)-7 b(or)20 b(instance,)h(w)n(e)f(ha)n(v)n(e)f(the)i(class)e
+(of)i(regular)d(tetrahedra,)0 1655 y(the)32 b(class)f(of)h(regular)e
+(cub)r(es,)j(etc.)49 b(Our)31 b(classes)g(are)g(the)0
+1755 y(lo)n(w)n(est)38 b(lev)n(el)g(of)h(abstraction)e(and)i(classes)e
+(can)i(not)g(b)r(e)0 1854 y(comp)r(osed.)34 b(They)21
+b(can)g(only)g(b)r(e)g Fo(instanciate)l(d)p Fu(.)36 b(When)21
+b(w)n(e)0 1954 y(need)32 b(a)f(sp)r(eci\014c)h(tetrahedron,)f(w)n(e)h
+(call)f(a)g(generic)g(func-)0 2053 y(tion)g(to)g(create)f(a)h
+(tetrahedron,)g(but)h(with)f(an)g(iden)n(ti\014er)0 2153
+y(sp)r(eci\014c)d(to)f(one)g(instance.)166 2253 y(A)39
+b(class)e(is)h(a)g(set)g(of)g(v)n(ertices)f(in)i(space,)h(together)0
+2352 y(with)50 b(a)g(w)n(a)n(y)e(to)i(dra)n(w)e(faces,)55
+b(and)50 b(therefore)f(edges.)0 2452 y(The)43 b(author's)f(fo)r(cus)h
+(w)n(as)e(to)i(manipulate)g(\(and)g(later)0 2552 y(animate\))35
+b(p)r(olyhedra.)59 b(As)35 b(an)g(example,)i(the)f Fp(poly.mp)0
+2651 y Fu(pac)n(k)-5 b(age)35 b(pro)n(vides)h(the)h(de\014nition)h(of)f
+(eac)n(h)f(of)h(the)g(\014v)n(e)0 2751 y(regular)26 b(con)n(v)n(ex)g(p)
+r(olyhedra.)166 2850 y(Eac)n(h)k(class)h(consists)g(of)h(t)n(w)n(o)e
+(macros:)44 b(one)31 b(de\014nes)0 2950 y(the)21 b(p)r(oin)n(ts,)h(the)
+f(other)f(calls)f(the)i(\014rst)g(macro)e(and)h(de\014nes)0
+3050 y(the)41 b(faces.)75 b(Eac)n(h)39 b(macro)g(has)h(a)g(parameter)f
+(whic)n(h)h(is)0 3149 y(a)35 b(string)f(iden)n(tifying)i(the)g
+(particular)e(instance)h(of)g(that)0 3249 y(class.)166
+3349 y(The)47 b(p)r(oin)n(ts)g(of)f(a)h(regular)e(tetrahedron)g(are)h
+(de-)0 3448 y(\014ned)62 b(in)g Fp(set_tetrahedron_p)o(oin)o(ts)o
+Fu(,)j(an)c(example)0 3548 y(of)54 b(the)g(general)e(macro)g(name)h
+Fp(set_)p Fg(h)p Fo(class)7 b Fg(i)p Fp(_points)p Fu(.)0
+3647 y(Fiv)n(e)75 b(p)r(oin)n(ts)g(are)g(de\014ned,)87
+b(four)75 b(of)h(them)g(with)0 3747 y Fp(set_obj_point)p
+Fu(,)25 b(a)30 b(macro)f(whic)n(h)h(de\014nes)g(p)r(oin)n(ts)g
+Fo(lo)l(c)l(al)0 3847 y Fu(to)44 b(an)g(ob)5 b(ject.)86
+b(The)45 b(\014rst)f(four)f(p)r(oin)n(ts)i(are)e(the)h(v)n(er-)0
+3946 y(tices)32 b(and)f(the)i(\014fth)f(is)g(the)g(cen)n(ter)f(of)h
+(the)g(tetrahedron.)0 4046 y Fp(set_obj_point)p Fu('s)25
+b(\014rst)31 b(parameter)e(is)i(the)g(p)r(oin)n(t)g(n)n(um-)0
+4146 y(b)r(er)41 b(and)f(the)h(other)f(three)g(are)g(the)h(cartesian)e
+(co)r(ordi-)0 4245 y(nates.)g(The)29 b(\014rst)f(three)h(p)r(oin)n(ts)f
+(are)g(in)h(a)f(plane)g(and)h(the)0 4345 y(fourth)24
+b(is)f(obtained)h(with)g(the)g Fp(new_face_point)18 b
+Fu(macro,)0 4444 y(whic)n(h)32 b(folds)f(a)h(face)f(\(see)h(the)g
+(description)f(in)h(app)r(endix)0 4544 y(A)39 b(for)e(more)h
+(details\).)69 b(The)38 b Fp(new_face_point)32 b Fu(macro)0
+4644 y(is)45 b(used)g(with)h(the)f(angle)g Fp(an)f Fu(whic)n(h)h(is)g
+(computed)h(in)0 4743 y(adv)-5 b(ance.)36 b(Once)28 b(the)g(four)f(p)r
+(oin)n(ts)g(are)g(set,)h(the)g(ob)5 b(ject)27 b(is)0
+4843 y(normalized,)c(whic)n(h)g(means)g(that)h(it)f(is)g(cen)n(tered)g
+(with)h(re-)0 4943 y(sp)r(ect)h(to)g(the)g(list)g(of)f(v)n(ertices)g
+(giv)n(en)g(as)g(parameter)f(\(here)0 5042 y Fp(1,2,3,4)p
+Fu(\))29 b(and)j(the)h(last)e(v)n(ertex)g(is)h(put)h(on)e(a)h(sphere)f
+(of)0 5142 y(radius)d(1,)h(cen)n(tered)f(on)g(the)h(origin.)40
+b(Therefore,)28 b(p)r(oin)n(t)g(5)0 5241 y(is)21 b(the)h(cen)n(ter)f
+(of)h(the)f(tetrahedron,)h(and)f(the)h(tetrahedron)0
+5341 y(is)27 b(set)h(symmetrically)f(with)h(resp)r(ect)f(to)h(the)g
+(origin.)2183 1356 y(All)d(\014v)n(e)g(con)n(v)n(ex)e(regular)f(p)r
+(olyhedra)i(are)f(de\014ned)i(in)2017 1456 y(this)i(w)n(a)n(y)d(and)i
+(ma)n(y)f(therefore)g(b)r(e)h(inscrib)r(ed)g(in)g(a)f(sphere)2017
+1555 y(of)j(radius)f(1.)2017 1714 y Fp(def)43 b(set_tetrahedron_)o(po)o
+(int)o(s\()o(ex)o(pr)37 b(inst\)=)2105 1813 y(set_obj_point\(1)o(,0,)o
+(0,)o(0\);)2105 1913 y(set_obj_point\(2)o(,1,)o(0,)o(0\);)2105
+2013 y(set_obj_point\(3)o(,co)o(sd)o(\(60)o(\),)o(si)o(nd\()o(60)o
+(\),0)o(\);)2105 2112 y(sinan=1/sqrt\(3\))o(;)2105 2212
+y(cosan=sqrt\(1-si)o(nan)o(**)o(2\);)2105 2312 y(an=180-2*angle\()o
+(\(co)o(sa)o(n,s)o(in)o(an)o(\)\);)2105 2411 y(new_face_point\()o(4,1)o
+(,2)o(,3,)o(an)o(\);)2105 2511 y(normalize_obj\(i)o(nst)o(\)\()o(1,2)o
+(,3)o(,4)o(\);)2105 2610 y(set_obj_point\(5)o(,0,)o(0,)o(0\);)2017
+2710 y(enddef;)2183 2868 y Fu(The)43 b(second)g(macro,)i
+Fp(def_tetrahedron)37 b Fu(de\014nes)2017 2968 y(the)26
+b(n)n(um)n(b)r(er)e(of)h(p)r(oin)n(ts)f(and)h(faces)f(of)h(the)g
+(instance,)g(calls)2017 3068 y(the)36 b(previous)f(macro)f(and)h
+(de\014nes)g(the)h(faces)f(with)h(the)2017 3167 y(macro)g
+Fp(set_obj_face)p Fu(.)60 b(The)38 b(\014rst)e(argumen)n(t)g(of)h(that)
+2017 3267 y(macro)28 b(is)g(a)g Fo(lo)l(c)l(al)38 b Fu(face)28
+b(n)n(um)n(b)r(er,)h(the)g(second)e(is)i(a)f(list)h(of)2017
+3367 y(v)n(ertices)j(suc)n(h)h(that)g(the)g(list)g(go)r(es)e(clo)r(c)n
+(kwise)h(when)h(the)2017 3466 y(face)27 b(is)f(visible.)36
+b(The)27 b(last)f(argumen)n(t)f(is)h(the)h(color)e(of)h(the)2017
+3566 y(face)i(in)g(R)n(GB.)2017 3724 y Fp(vardef)42 b(def_tetrahedron)o
+(\(ex)o(pr)37 b(inst\)=)2105 3824 y(new_obj_points\()o(ins)o(t,)o(5\);)
+2105 3924 y(new_obj_faces\(i)o(nst)o(,4)o(\);)2105 4023
+y(set_tetrahedron)o(_po)o(in)o(ts\()o(in)o(st)o(\);)2105
+4123 y(set_obj_face\(1,)o("1,)o(2,)o(4",)o("b)o(4f)o(efe)o("\))o(;)2105
+4222 y(set_obj_face\(2,)o("2,)o(3,)o(4",)o("b)o(49)o(bc0)o("\))o(;)2105
+4322 y(set_obj_face\(3,)o("1,)o(4,)o(3",)o("b)o(4c)o(8fe)o("\))o(;)2105
+4422 y(set_obj_face\(4,)o("1,)o(3,)o(2",)o("b)o(4f)o(e40)o("\))o(;)2017
+4521 y(enddef;)2183 4680 y Fu(The)28 b(result)f(of)h(the)g(dra)n(wing)e
+(is:)2681 5396 y @beginspecial -42 @llx 8 @lly 23 @urx
+84 @ury 650 @rwi @setspecial
+%%BeginDocument: tetra.ps
+%!PS
+%%BoundingBox: -42 8 23 84
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath fill
+ 0 setgray
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial eop
+%%Page: 277 4
+277 3 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(TUGb)r(oat,)28
+b(V)-7 b(olume)28 b(18)e(\(1997\),)h(No.)g(4)2471 b(277)166
+100 y(A)45 b(more)f(complex)g(example)g(is)h(the)g(icosahedron)0
+199 y(whic)n(h)28 b(is)f(de\014ned)h(b)r(elo)n(w.)0 338
+y Fp(def)42 b(set_icosahedron_p)o(oi)o(nts)o(\(e)o(xpr)37
+b(inst\)=)87 437 y(set_obj_point\(1,0)o(,0)o(,0)o(\);)87
+537 y(set_obj_point\(2,1)o(,0)o(,0)o(\);)87 637 y(set_obj_point\(3,c)o
+(os)o(d\()o(60\))o(,s)o(ind)o(\(6)o(0\),)o(0\))o(;)87
+736 y(cosan=1-8/3*cosd\()o(36)o(\)*)o(cos)o(d\()o(36\))o(;)87
+836 y(sinan=sqrt\(1-cosa)o(n*)o(co)o(san)o(\);)87 935
+y(an=180-angle\(\(cos)o(an)o(,s)o(ina)o(n\))o(\);)87
+1035 y(new_face_point\(4,)o(1,)o(2,)o(3,a)o(n\))o(;)87
+1135 y(new_face_point\(5,)o(2,)o(3,)o(1,a)o(n\))o(;)87
+1234 y(new_face_point\(6,)o(3,)o(1,)o(2,a)o(n\))o(;)87
+1334 y(new_face_point\(7,)o(2,)o(4,)o(3,a)o(n\))o(;)87
+1434 y(new_face_point\(8,)o(3,)o(5,)o(1,a)o(n\))o(;)87
+1533 y(new_face_point\(9,)o(1,)o(6,)o(2,a)o(n\))o(;)87
+1633 y(new_face_point\(10)o(,3)o(,4)o(,7,)o(an)o(\);)87
+1732 y(new_face_point\(11)o(,3)o(,7)o(,5,)o(an)o(\);)87
+1832 y(new_face_point\(12)o(,1)o(,8)o(,6,)o(an)o(\);)87
+1932 y(\045)43 b(1)h(and)e(10)h(are)f(opposite)e(vertices)87
+2031 y(normalize_obj\(ins)o(t\))o(\(1)o(,10)o(\);)87
+2131 y(\045)j(center)e(of)i(icosahedron)87 2231 y(set_obj_point\(13,)o
+(0,)o(0,)o(0\);)0 2330 y(enddef;)0 2469 y(vardef)e(def_icosahedron\()o
+(exp)o(r)c(inst\)=)87 2568 y(save)42 b(cosan,sinan,an;)87
+2668 y(new_obj_points\(in)o(st)o(,1)o(3\);)87 2767 y
+(new_obj_faces\(ins)o(t,)o(20)o(\);)87 2867 y(set_icosahedron_p)o(oi)o
+(nt)o(s\(i)o(ns)o(t\);)87 2967 y(set_obj_face\(1,"3)o(,2)o(,1)o(",")o
+(b4)o(000)o(0")o(\);)87 3066 y(set_obj_face\(2,"2)o(,3)o(,4)o(",")o(ff)
+o(0fa)o(1")o(\);)87 3166 y(set_obj_face\(3,"3)o(,7)o(,4)o(",")o(b4)o
+(9b4)o(9")o(\);)87 3266 y(set_obj_face\(4,"3)o(,5)o(,7)o(",")o(b4)o
+(9bc)o(0")o(\);)87 3365 y(set_obj_face\(5,"3)o(,1)o(,5)o(",")o(b4)o
+(c8f)o(e")o(\);)87 3465 y(set_obj_face\(6,"1)o(,8)o(,5)o(",")o(b4)o
+(fef)o(e")o(\);)87 3564 y(set_obj_face\(7,"1)o(,6)o(,8)o(",")o(b4)o
+(fe4)o(0")o(\);)87 3664 y(set_obj_face\(8,"1)o(,2)o(,6)o(",")o(45)o
+(d04)o(0")o(\);)87 3764 y(set_obj_face\(9,"2)o(,9)o(,6)o(",")o(45)o
+(a11)o(4")o(\);)87 3863 y(set_obj_face\(10,")o(2,)o(4,)o(9",)o("4)o
+(5a1)o(d4)o("\);)87 3963 y(set_obj_face\(11,")o(9,)o(4,)o(10")o(,")o
+(456)o(9d)o(4"\))o(;)87 4063 y(set_obj_face\(12,")o(4,)o(7,)o(10")o(,")
+o(112)o(da)o(1"\))o(;)87 4162 y(set_obj_face\(13,")o(7,)o(5,)o(11")o
+(,")o(b4f)o(ef)o(e"\))o(;)87 4262 y(set_obj_face\(14,")o(5,)o(8,)o(11")
+o(,")o(b49)o(bc)o(0"\))o(;)87 4361 y(set_obj_face\(15,")o(8,)o(6,)o
+(12")o(,")o(45a)o(11)o(4"\))o(;)87 4461 y(set_obj_face\(16,")o(6,)o(9,)
+o(12")o(,")o(b49)o(b4)o(9"\))o(;)87 4561 y(set_obj_face\(17,")o(8,)o
+(12)o(,11)o(",)o("b4)o(00)o(00")o(\);)87 4660 y(set_obj_face\(18,")o
+(7,)o(11)o(,10)o(",)o("45)o(a1)o(d4")o(\);)87 4760 y
+(set_obj_face\(19,")o(12)o(,1)o(0,1)o(1")o(,"b)o(4c)o(8fe)o("\))o(;)87
+4860 y(set_obj_face\(20,")o(9,)o(10)o(,12)o(",)o("ff)o(0f)o(a1")o(\);)0
+4959 y(enddef;)166 5098 y Fu(Since)36 b(all)f(p)r(oin)n(ts)h(of)f(the)h
+(ob)5 b(jects)35 b(are)g(stored)g(in)g(a)0 5197 y(unique)29
+b(global)e(arra)n(y)-7 b(,)26 b(they)i(are)g(in)n(ternally)f(accessed)g
+(b)n(y)0 5297 y(the)20 b(lo)r(cal)g(n)n(um)n(b)r(ers)f(and)h(an)g
+(o\013set)g(de\014ned)g(b)n(y)g(the)g(macro)0 5396 y
+Fp(new_obj_points)p Fu(.)50 b(The)35 b(icosahedron)d(example)h(sho)n
+(ws)2017 100 y(a)h(systematic)g(use)h(of)f(the)h Fp(new_face_point)29
+b Fu(macro)k(to)2017 199 y(compute)39 b(a)g(p)r(oin)n(t)f(on)h(an)f
+(adjacen)n(t)g(face.)70 b(Displa)n(ying)2017 299 y(suc)n(h)28
+b(an)f(icosahedron)f(results)h(in)h(the)g(\014gure)e(3.)2576
+1245 y @beginspecial -45 @llx -9 @lly 45 @urx 74 @ury
+900 @rwi @setspecial
+%%BeginDocument: icosa.ps
+%!PS
+%%BoundingBox: -45 -9 45 74
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.9 0 0.2 setrgbcolor
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath stroke
+ 0.5 0.3 0 setrgbcolor
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 0.3 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 1 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath stroke
+ 0.4 0 0.6 setrgbcolor
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 0.4 0.2 setrgbcolor
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 0.2 1 0.3 setrgbcolor
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath stroke
+ 0.1 0.2 0.9 setrgbcolor
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 1 0.2 setrgbcolor
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2466 1453 a Fs(Figure)31 b(3)p Fu(:)37 b(An)28
+b(icosahedron)2183 1791 y(The)g(other)f(three)h(regular)d(con)n(v)n(ex)
+h(p)r(olyhedra)h(are:)2689 2451 y @beginspecial -33 @llx
+0 @lly 30 @urx 65 @ury 630 @rwi @setspecial
+%%BeginDocument: cube.ps
+%!PS
+%%BoundingBox: -33 0 30 65
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath fill
+ 0 setgray
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2017 3320 a @beginspecial -39 @llx -8 @lly
+36 @urx 84 @ury 750 @rwi @setspecial
+%%BeginDocument: octa.ps
+%!PS
+%%BoundingBox: -39 -8 36 84
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath fill
+ 0 setgray
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1102 w @beginspecial -46 @llx -8 @lly 46
+@urx 74 @ury 920 @rwi @setspecial
+%%BeginDocument: dodeca.ps
+%!PS
+%%BoundingBox: -46 -8 46 74
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath fill
+ 0 setgray
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath fill
+ 0 setgray
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath fill
+ 0 setgray
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2183 3514 a(The)37 b(do)r(decahedron)d(co)r(de)i(is)g(a)f
+(bit)i(sp)r(ecial,)h(since)2017 3614 y(the)45 b(v)n(ertices)d(are)h
+(built)i(using)e(ten)h(additional)g(p)r(oin)n(ts)2017
+3713 y(corresp)r(onding)h(to)h(face)h(cen)n(ters.)93
+b(These)46 b(p)r(oin)n(ts)h(are)2017 3813 y(de\014ned)36
+b(as)f(an)g(arra)n(y)e(of)i(v)-5 b(ariables)34 b Fp(fc1)g
+Fu(through)h Fp(fc10)2017 3913 y Fu(with)30 b Fp(new_points\(fc\)\(1)o
+(0\))p Fu(.)35 b Fp(free_points\(fc\)\(1)o(0\))2017 4012
+y Fu(frees)e(them)h(when)f(they)g(are)g(no)f(longer)g(necessary)-7
+b(.)52 b(An)2017 4112 y(excerpt)28 b(of)f(the)h(do)r(decahedron)e(co)r
+(de)i(is:)2017 4306 y Fp(def)43 b(set_dodecahedron)o(_p)o(oin)o(ts)o
+(\(e)o(xpr)37 b(inst\)=)2105 4406 y(new_points\(fc\)\()o(10\))o(;\045)g
+(face)42 b(centers)2105 4505 y(set_point\(fc1,0)o(,0,)o(0\))o(;)2105
+4605 y(set_obj_point\(1)o(,1,)o(0,)o(0\);)2105 4704 y(set_obj_point\(2)
+o(,co)o(sd)o(\(72)o(\),)o(si)o(nd\()o(72)o(\),0)o(\);)2105
+4804 y(rotate_in_plane)o(\(3,)o(fc)o(1,1)o(,2)o(\);)2105
+4904 y(...)2105 5003 y(free_points\(fc\))o(\(10)o(\);)2017
+5103 y(enddef;)2183 5297 y Fu(Finally)-7 b(,)32 b(wire)e(dra)n(wings)f
+(can)i(b)r(e)g(obtained)f(b)n(y)h(set-)2017 5396 y(ting)d(the)g(b)r(o)r
+(olean)f Fp(filled_faces)c Fu(to)k(false:)p eop
+%%Page: 278 5
+278 4 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(278)2470
+b(TUGb)r(oat,)28 b(V)-7 b(olume)27 b(18)g(\(1997\),)f(No.)i(4)192
+1358 y @beginspecial -117 @llx -31 @lly 61 @urx 130 @ury
+1780 @rwi @setspecial
+%%BeginDocument: icosa-w.ps
+%!PS
+%%BoundingBox: -117 -31 61 130
+%%Creator: MetaPost
+%%CreationDate: 1997.04.25:1731
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 1 setgray 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash 1 setlinecap
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-83.98907 15.99922 lineto
+-116.7492 70.0534 lineto
+ closepath stroke
+newpath -77.9753 -13.86514 moveto
+-0.19029 -30.73163 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+20.03435 55.02917 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+60.1313 36.75247 lineto
+20.03435 55.02917 lineto
+ closepath stroke
+newpath -116.7492 70.0534 moveto
+-83.98907 15.99922 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath -83.98907 15.99922 moveto
+20.03435 55.02917 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+60.1313 36.75247 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+28.53722 127.19768 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 28.53722 127.19768 moveto
+-51.86171 129.12445 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 0 1524 a Fs(Animating)j(ob)5 b(jects)42
+b Fu(The)29 b(animation)e(of)i(one)e(or)h(sev-)0 1624
+y(eral)h(ob)5 b(jects)30 b(in)n(v)n(olv)n(es)e(the)j(ob)5
+b(ject\(s\))30 b(and)g(an)g(observ)n(er.)0 1724 y(The)25
+b(animation)f(is)g(a)h(set)f(of)h(images)f(and)g(from)g(an)h(image)0
+1823 y(to)k(the)h(next)g(one,)f(the)h(observ)n(er)d(as)i(w)n(ell)g(as)g
+(the)h(ob)5 b(jects)0 1923 y(can)40 b(mo)n(v)n(e.)74
+b(F)-7 b(or)40 b(instance)g(the)h(macro)e Fp(one_image)e
+Fu(in)0 2022 y Fp(3d.mp)26 b Fu(is:)0 2165 y Fp(def)42
+b(one_image\(expr)c(name,i,a,rd,ang\)=)87 2265 y(beginfig\(i\);)174
+2364 y(set_point\(Obs,)218 2464 y(-rd*cosd\(a*ang\),)o(-r)o(d*s)o(in)o
+(d\(a)o(*a)o(ng\))o(,1)o(\);)174 2564 y(Obs_phi:=90;Obs_d)o(is)o(t:=)o
+(2;)174 2663 y(\045)44 b(fix)e(point)f(1)j(of)e(object)f(|name|)174
+2763 y(point_of_view_obj)o(\(n)o(ame)o(,1)o(,Ob)o(s_)o(phi)o(\);)174
+2863 y(draw_obj\(name\);)174 2962 y(rotate_obj_pv\(nam)o(e,)o(1,v)o(ec)
+o(t_I)o(,a)o(ng\))o(;)174 3062 y(\045)j(show)d(the)i(rotation)d(point)
+174 3161 y(draw_point\(name,1)o(\);)174 3261 y(draw_axes\(red,gre)o(en)
+o(,bl)o(ue)o(\);)87 3361 y(endfig;)0 3460 y(enddef;)166
+3603 y Fu(The)26 b(parameters)e(of)i(this)g(macro)f(are)f(a)i(name)g
+(of)f(an)0 3703 y(ob)5 b(ject)27 b(\()p Fp(name)p Fu(\),)f(an)h(image)f
+(index)h(\()p Fp(i)p Fu(\),)h(and)f(three)f(v)-5 b(alues)0
+3802 y(de\014ning)30 b(the)h(p)r(osition)f(of)h(the)g(observ)n(er.)43
+b(The)30 b(observ)n(er)0 3902 y(\()p Fp(Obs)48 b Fu(is)g(a)g(global)g
+(p)r(oin)n(t)h(and)f(set)h(with)g Fp(set_point)p Fu(,)0
+4002 y(not)32 b(with)g Fp(set_obj_point)p Fu(\))27 b(follo)n(ws)k(a)g
+(circle)g(of)h(radius)0 4101 y Fp(rd)p Fu(.)62 b(The)36
+b(parameter)e Fp(a)p Fu(,)k(whic)n(h)e(is)g(usually)g(a)f(function)0
+4201 y(of)43 b Fp(i)p Fu(,)j(determines)d(the)g(n)n(um)n(b)r(er)f(of)h
+(rotation)e(steps)i(of)0 4301 y(the)f(observ)n(er,)h(eac)n(h)e(step)h
+(b)r(eing)f(a)h(rotation)e(of)i(angle)0 4400 y Fp(ang)p
+Fu(.)74 b(The)40 b(distance)g(b)r(et)n(w)n(een)h(the)f(observ)n(er)f
+(and)h(the)0 4500 y(pro)5 b(jection)27 b(plane)g(is)g(2)h(\(see)f
+(\014gure)g(4\).)166 4599 y(The)40 b(orien)n(tation)f(of)g(the)i
+(observ)n(er)c(is)j(de\014ned)g(b)n(y)0 4699 y(three)d(angles)g(\(see)g
+(\014gure)g(5\).)66 b(The)38 b Fp(Obs_phi)d Fu(angle)h(is)0
+4799 y(giv)n(en)20 b(and)h(the)h(t)n(w)n(o)e(others)g(are)g(computed)h
+(with)h(a)f(call)f(to)0 4898 y Fp(point_of_view_ob)o(j\(n)o(am)o(e,)o
+(1,O)o(bs)o(_ph)o(i\))27 b Fu(whic)n(h)34 b(con-)0 4998
+y(strains)19 b(the)i(observ)n(er)d(to)i(lo)r(ok)f(to)n(w)n(ards)f(p)r
+(oin)n(t)j(1)e(of)h(ob)5 b(ject)0 5098 y Fp(name)p Fu(.)54
+b(Therefore,)34 b(this)g(p)r(oin)n(t)g(will)h(seem)e(\014xed)h(on)g
+(the)0 5197 y(animation)c(and)g Fp(draw_point\(name,1)o(\))25
+b Fu(dra)n(ws)k(it)i(later)0 5297 y(so)26 b(that)g(this)g(feature)g
+(can)g(b)r(e)h(observ)n(ed.)35 b(There)25 b(is)h(noth-)0
+5396 y(ing)h(sp)r(ecial)g(ab)r(out)g(that)g(p)r(oin)n(t,)h(except)f
+(that)g(it)h(remains)2017 100 y(\014x)g(when)g(the)h(ob)5
+b(ject)27 b(is)h(rotated.)37 b(The)28 b(ob)5 b(ject)28
+b(is)g(dra)n(wn)2017 199 y(with)37 b Fp(draw_obj\(name\))31
+b Fu(and)36 b Fp(rotate_obj_pv)c Fu(rotates)2017 299
+y(the)23 b(ob)5 b(ject)21 b Fp(name)f Fu(b)n(y)i Fp(ang)e
+Fu(degrees)h(around)f(an)i(axis)f(going)2017 399 y(through)30
+b(p)r(oin)n(t)g(1)g(and)g(directed)g(b)n(y)g(v)n(ector)e
+Fp(vect_I)g Fu(\()-11 b Fn(~)-31 b({)p Fu(\).)2017 509
+y(The)29 b(reference)e(v)n(ectors)f(\()-11 b Fn(~)-31
+b({)p Fu(,)24 b Fn(~)-38 b(|)28 b Fu(and)3148 487 y Fn(~)3152
+509 y(k)s Fu(\))g(are)g(dra)n(wn)f(in)h(red,)2017 608
+y(green)f(and)g(blue)h(with)g Fp(draw_axes)p Fu(.)2183
+708 y(Finally)-7 b(,)22 b(a)e(complete)g(animation)f(of)i(an)e
+(icosahedron)2017 808 y(is)28 b(obtained)f(with)2017
+956 y Fp(animate_object\("i)o(cos)o(ah)o(edr)o(on)o(",)o(1,1)o(00)o
+(,10)o(0\))o(;)2017 1105 y Fu(whic)n(h)g(generates)e(\014les)h
+Fp(anim.101)p Fu(,)d(.)14 b(.)g(.)g(,)27 b Fp(anim.200)c
+Fu(from)2017 1204 y(the)52 b(main)f(\014le)h Fp(anim.mp)p
+Fu(.)105 b(The)51 b(\014rst)g(parameter)f(of)2017 1304
+y Fp(animate_object)32 b Fu(is)37 b(the)g(name)g(of)h(the)f(ob)5
+b(ject)37 b(to)g(an-)2017 1403 y(imate,)25 b(the)e(second)g(and)g
+(third)g(parameters)f(are)g(minimal)2017 1503 y(and)g(maximal)f(v)-5
+b(alues)22 b(of)g(the)g(index)g(lo)r(op)g(and)f(the)i(fourth)2017
+1603 y(parameter)36 b(is)i(an)f(o\013set)g(added)h(to)f(the)h(index)f
+(lo)r(op)g(in)2017 1702 y(order)24 b(to)i(get)f(the)g(\014le)h
+(extension,)f(whic)n(h)h(m)n(ust)f(lie)h(in)f(the)2017
+1802 y(in)n(terv)-5 b(al)27 b(0)p Fn(::)p Fu(4096.)2183
+1902 y(After)20 b(eac)n(h)f(image)g(is)g(dra)n(wn,)i(the)f(v)-5
+b(alues)19 b(of)g(the)h(cur-)2017 2001 y(ren)n(t)28 b(b)r(ounding)g(b)r
+(o)n(x)g(are)f(used)h(to)g(compute)g(the)g(b)r(ound-)2017
+2101 y(ing)42 b(b)r(o)n(x)f(of)g(the)h(sequence)f(of)h(images.)78
+b(The)41 b(in)n(ternal)2017 2201 y(v)-5 b(alues)45 b
+Fp(xmin_)p Fu(,)j Fp(ymin_)p Fu(,)f Fp(xmax_)c Fu(and)i
+Fp(ymax_)e Fu(hold)i(the)2017 2300 y(minimal)36 b(and)f(maximal)f(v)-5
+b(alues)35 b(of)g(the)g(co)r(ordinates)f(of)2017 2400
+y(the)41 b(past)f(images')g(corners.)73 b(They)41 b(are)e(up)r(dated)i
+(just)2017 2499 y(b)r(efore)28 b(eac)n(h)f(image)f(is)i(shipp)r(ed)g
+(out.)2017 2665 y Fs(Putting)k(the)g(pieces)f(together)44
+b Fu(Once)31 b(all)g(the)g(views)2017 2765 y(ha)n(v)n(e)36
+b(b)r(een)h(computed,)i(they)e(can)f(b)r(e)h(used)g(separately)2017
+2865 y(\(see)30 b(for)g(instance)f(the)i(\014v)n(e)e(views)h(of)f
+(\014gure)h(6\))f(or)g(more)2017 2964 y(in)n(terestingly)-7
+b(,)51 b(they)c(can)g(b)r(e)g(merged.)94 b(This)46 b(task)h(is)2017
+3064 y(made)32 b(almost)f(straigh)n(tforw)n(ard)e(b)n(y)k
+Fq(MET)n(AP)t(OST)h Fu(itself.)2017 3164 y(Indeed,)29
+b(ev)n(ery)d(time)i Fp(animate_object)23 b Fu(is)k(used,)h(a)g(shell)
+2017 3263 y(script)42 b(named)f Fp(create_animation.)o(sh)35
+b Fu(is)42 b(generated,)2017 3363 y(as)33 b(a)h(side-e\013ect)f(of)h(a)
+f(call)h(to)f Fp(show_animation_bb)o(ox)o Fu(.)2017 3462
+y(The)49 b(script)e(is)h(similar)g(to)g(that)g(sho)n(wn)f(in)i
+(\014gure)e(1.)2017 3562 y(This)29 b(script)g(uses)g(the)g(v)-5
+b(alues)29 b(computed)g(for)f(the)i(global)2017 3662
+y(b)r(ounding)35 b(b)r(o)n(x)f(of)h(the)g(sequence)f(of)h(images,)g
+(for)f(these)2017 3761 y(v)-5 b(alues)40 b(are)f(necessary)f(in)i
+(order)f(to)h(extract)f(the)h(righ)n(t)2017 3861 y(parts)29
+b(of)g(the)g(images)f(and)h(get)g(correct)e(alignmen)n(ts;)i(the)2017
+3961 y(parts)k(are)f(extracted)g(with)i Fp(pnmcut)p Fu(.)3234
+3930 y Fm(3)3322 3961 y Fu(If)g(y)n(ou)e(ha)n(v)n(e)g(the)2017
+4060 y(programs)38 b(used)i(in)g(this)g(script)f(\()p
+Fp(Ghostscript)p Fu(,)g(etc.\),)2017 4160 y(y)n(ou)29
+b(can)g(just)h(run)g(it)g(with)g Fp(sh)42 b(create_animation.)o(sh)2017
+4259 y Fu(on)29 b(UNIX.)g(Y)-7 b(ou)28 b(ma)n(y)g(need)h(to)f(adapt)g
+(it)h(to)f(y)n(our)g(needs,)2017 4359 y(and)41 b(for)g(that)g(purp)r
+(ose,)k(y)n(ou)40 b(can)h(mo)r(dify)g(the)h(macro)2017
+4459 y Fp(write_script)23 b Fu(in)28 b Fp(3d.mp)p Fu(.)2183
+4558 y(Some)39 b(examples)g(are)f(included)h(in)g(the)h
+Fp(3d)e Fu(distri-)2017 4658 y(bution,)j(and)d(they)g(can)f(b)r(e)i
+(view)n(ed)e(for)g(instance)h(with)2017 4758 y Fp(netscape)25
+b Fu(or)i(sp)r(ecial)g(programs)e(suc)n(h)i(as)g Fp(xanim)p
+Fu(.)p 2017 4925 748 4 v 2124 4979 a Fl(3)2178 5002 y
+Fk(One)20 b(migh)n(t)f(think)h(of)f(using)h Fj(Ghostscript)j
+Fk(for)18 b(generating)j(an)2017 5081 y(excerpt)28 b(of)e(an)h(image,)g
+(but)h(if)i Fj(Ghostscript)g Fk(is)c(used)h(to)g(generate)2017
+5160 y(the)40 b(b)r(ounding)g(b)r(o)n(x)f(of)g(an)g(image,)j(it)d(will)
+f(in)g(general)h(not)h(b)r(e)2017 5239 y(p)r(ossible)28
+b(to)g(ha)n(v)n(e)h(a)f(go)r(o)r(d)g(alignmen)n(t)g(b)r(et)n(w)n(een)i
+(all)d(images.)43 b(The)2017 5318 y(sizes)32 b(of)f(the)h(excerpts)h
+(are)f(only)f(kno)n(wn)i(when)f(all)f(images)g(ha)n(v)n(e)2017
+5396 y(b)r(een)25 b(pro)r(duced.)p eop
+%%Page: 279 6
+279 5 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(TUGb)r(oat,)28
+b(V)-7 b(olume)28 b(18)e(\(1997\),)h(No.)g(4)2471 b(279)564
+1500 y @beginspecial -25 @llx -25 @lly 306 @urx 150 @ury
+3310 @rwi @setspecial
+%%BeginDocument: vect-fig.8
+%!PS
+%%BoundingBox: -25 -25 306 150
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 4f:800014224c6
+%*Font: cmr10 9.96265 9.96265 61:a8d75
+%*Font: cmmi7 6.97385 6.97385 69:e1
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+%%EndProlog
+%%Page: 1 1
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 45.35449 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 41.4152 moveto
+0 45.35449 lineto
+-0.6946 41.4152 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+35.96683 -16.77173 lineto stroke
+newpath 32.10292 -15.7364 moveto
+35.96683 -16.77173 lineto
+32.69005 -14.47731 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+53.27417 19.39043 lineto stroke
+newpath 49.81003 17.3904 moveto
+53.27417 19.39043 lineto
+49.3349 18.69582 lineto
+ closepath
+gsave fill grestore stroke
+newpath 159.82251 148.88026 moveto
+159.82251 58.17128 lineto
+231.75616 24.62782 lineto stroke
+ [3 3 ] 0 setdash
+newpath 53.27417 19.39043 moveto
+159.82251 58.17128 lineto stroke
+newpath 0 0 moveto
+267.72299 143.91957 lineto stroke
+ [0 5 ] 2.5 setdash
+newpath 187.40527 100.74326 moveto
+159.8223 113.60522 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 187.40527 100.74326 moveto
+187.40549 45.30931 lineto stroke
+147.3327 112.88567 moveto
+(y) cmmi10 9.96265 fshow
+152.21721 111.39127 moveto
+(p) cmmi7 6.97385 fshow
+182.25598 38.0198 moveto
+(x) cmmi10 9.96265 fshow
+187.94987 36.5254 moveto
+(p) cmmi7 6.97385 fshow
+-24.0194 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-18.49089 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 24.57285 moveto
+(!) cmsy10 9.96265 fshow
+-24.0194 17.82045 moveto
+(O) cmmi10 9.96265 fshow
+-16.14339 17.82045 moveto
+(bs) cmmi10 9.96265 fshow
+-7.1978 16.32605 moveto
+(j) cmmi7 6.97385 fshow
+-5.83998 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+0.04042 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+5.92082 -16.29745 moveto
+(!) cmsy10 9.96265 fshow
+-5.83998 -23.04985 moveto
+(O) cmmi10 9.96265 fshow
+2.03603 -23.04985 moveto
+(bs) cmmi10 9.96265 fshow
+10.98161 -24.54425 moveto
+(k) cmmi7 6.97385 fshow
+28.73708 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+33.82507 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+38.91287 1.78363 moveto
+(!) cmsy10 9.96265 fshow
+28.73708 -4.96877 moveto
+(O) cmmi10 9.96265 fshow
+36.61308 -4.96877 moveto
+(bs) cmmi10 9.96265 fshow
+45.55867 -6.46317 moveto
+(i) cmmi7 6.97385 fshow
+75.05598 12.73616 moveto
+(O) cmmi10 9.96265 fshow
+82.93199 12.73616 moveto
+(bs) cmmi10 9.96265 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 92.47539 12.93536 moveto
+95.46419 12.93536 lineto stroke
+95.46419 12.73616 moveto
+(dist) cmmi10 9.96265 fshow
+184.89902 93.45375 moveto
+(p) cmmi10 9.96265 fshow
+270.72299 141.77481 moveto
+(m) cmmi10 9.96265 fshow
+newpath 188.40154 100.74326 moveto
+188.40154 101.00748 188.29657 101.2609 188.10974 101.44772 curveto
+187.92291 101.63455 187.6695 101.73952 187.40527 101.73952 curveto
+187.14105 101.73952 186.88763 101.63455 186.7008 101.44772 curveto
+186.51398 101.2609 186.40901 101.00748 186.40901 100.74326 curveto
+186.40901 100.47903 186.51398 100.22562 186.7008 100.03879 curveto
+186.88763 99.85196 187.14105 99.747 187.40527 99.747 curveto
+187.6695 99.747 187.92291 99.85196 188.10974 100.03879 curveto
+188.29657 100.22562 188.40154 100.47903 188.40154 100.74326 curveto closepath
+ fill
+newpath 268.71925 143.91957 moveto
+268.71925 144.18379 268.61429 144.43721 268.42746 144.62404 curveto
+268.24063 144.81087 267.98721 144.91583 267.72299 144.91583 curveto
+267.45877 144.91583 267.20535 144.81087 267.01852 144.62404 curveto
+266.8317 144.43721 266.72673 144.18379 266.72673 143.91957 curveto
+266.72673 143.65535 266.8317 143.40193 267.01852 143.2151 curveto
+267.20535 143.02827 267.45877 142.92331 267.72299 142.92331 curveto
+267.98721 142.92331 268.24063 143.02827 268.42746 143.2151 curveto
+268.61429 143.40193 268.71925 143.65535 268.71925 143.91957 curveto closepath
+ fill
+newpath 188.40175 45.30931 moveto
+188.40175 45.57353 188.29678 45.82695 188.10995 46.01378 curveto
+187.92313 46.2006 187.66971 46.30557 187.40549 46.30557 curveto
+187.14127 46.30557 186.88785 46.2006 186.70102 46.01378 curveto
+186.51419 45.82695 186.40923 45.57353 186.40923 45.30931 curveto
+186.40923 45.04509 186.51419 44.79167 186.70102 44.60484 curveto
+186.88785 44.41801 187.14127 44.31305 187.40549 44.31305 curveto
+187.66971 44.31305 187.92313 44.41801 188.10995 44.60484 curveto
+188.29678 44.79167 188.40175 45.04509 188.40175 45.30931 curveto closepath fill
+newpath 160.81856 113.60522 moveto
+160.81856 113.86945 160.7136 114.12286 160.52676 114.3097 curveto
+160.33994 114.49652 160.08652 114.60149 159.8223 114.60149 curveto
+159.55807 114.60149 159.30466 114.49652 159.11783 114.3097 curveto
+158.931 114.12286 158.82603 113.86945 158.82603 113.60522 curveto
+158.82603 113.341 158.931 113.08759 159.11783 112.90076 curveto
+159.30466 112.71393 159.55807 112.60896 159.8223 112.60896 curveto
+160.08652 112.60896 160.33994 112.71393 160.52676 112.90076 curveto
+160.7136 113.08759 160.81856 113.341 160.81856 113.60522 curveto closepath fill
+-18.92159 -9.0185 moveto
+(O) cmmi10 9.96265 fshow
+-11.04558 -9.0185 moveto
+(bs) cmmi10 9.96265 fshow
+234.75616 22.13716 moveto
+(pro) cmr10 9.96265 fshow
+249.72786 22.13716 moveto
+(jection) cmr10 9.96265 fshow
+282.10646 22.13716 moveto
+(plane) cmr10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1295 1708 a Fs(Figure)31 b(4)p Fu(:)37 b(Pro)5
+b(jection)26 b(on)h(the)h(screen)976 3274 y @beginspecial
+-110 @llx -56 @lly 122 @urx 116 @ury 2320 @rwi @setspecial
+%%BeginDocument: vect-fig.16
+%!PS
+%%BoundingBox: -110 -56 122 116
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 12:800a000000000004000080005f8
+%*Font: cmmi7 6.97385 6.97385 78:e
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+-106.54832 -38.78087 lineto stroke
+newpath -103.08418 -36.78084 moveto
+-106.54832 -38.78087 lineto
+-102.60905 -38.08626 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+82.14182 -22.00984 lineto stroke
+newpath 78.15659 -21.66115 moveto
+82.14182 -22.00984 lineto
+78.51617 -20.31917 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+80.17596 80.17596 lineto stroke
+newpath 77.88162 76.89932 moveto
+80.17596 80.17596 lineto
+76.89932 77.88162 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-80.17596 80.17596 lineto stroke
+newpath -76.89932 77.88162 moveto
+-80.17596 80.17596 lineto
+-77.88162 76.89932 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+83.46436 -48.18889 lineto stroke
+ [] 0 setdash
+newpath 79.70563 -46.82079 moveto
+83.46436 -48.18889 lineto
+80.4002 -45.61775 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+106.54832 38.78087 lineto stroke
+ [] 0 setdash
+newpath 103.08418 36.78084 moveto
+106.54832 38.78087 lineto
+102.60905 38.08626 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+-29.34647 109.52243 lineto stroke
+ [] 0 setdash
+newpath -27.65599 105.89716 moveto
+-29.34647 109.52243 lineto
+-28.99785 105.53763 lineto
+ closepath
+gsave fill grestore stroke
+-109.39528 -46.07037 moveto
+(x) cmmi10 9.96265 fshow
+80.61275 -55.4784 moveto
+(u) cmmi10 9.96265 fshow
+71.22307 -31.92834 moveto
+(O) cmmi10 9.96265 fshow
+79.09908 -31.92834 moveto
+(bs) cmmi10 9.96265 fshow
+88.04466 -33.42274 moveto
+(x) cmmi7 6.97385 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+83.17596 78.1419 moveto
+(O) cmmi10 9.96265 fshow
+91.05197 78.1419 moveto
+(bs) cmmi10 9.96265 fshow
+99.99756 76.6475 moveto
+(y) cmmi7 6.97385 fshow
+-8.0713 111.24104 moveto
+(z) cmmi10 9.96265 fshow
+-104.58806 77.4639 moveto
+(O) cmmi10 9.96265 fshow
+-96.71205 77.4639 moveto
+(bs) cmmi10 9.96265 fshow
+-87.76646 75.9695 moveto
+(z) cmmi7 6.97385 fshow
+109.54832 36.63611 moveto
+(v) cmmi10 9.96265 fshow
+-39.74696 107.37767 moveto
+(w) cmmi10 9.96265 fshow
+newpath -21.30934 -7.75606 moveto
+-9.00943 -12.23291 4.40096 -14.11148 16.69261 -9.63763 curveto stroke
+newpath 13.13445 -11.46506 moveto
+14.3417 -10.9175 15.52881 -10.30956 16.69261 -9.63763 curveto
+15.36917 -9.87099 14.04575 -10.03627 12.72401 -10.13791 curveto
+ closepath
+gsave fill grestore stroke
+newpath 41.73218 -24.09445 moveto
+42.8361 -19.97456 43.169 -15.68611 42.7141 -11.4452 curveto stroke
+newpath 43.60097 -15.34569 moveto
+43.38118 -14.0319 43.08534 -12.72954 42.7141 -11.4452 curveto
+42.6237 -12.77907 42.45625 -14.10408 42.21346 -15.4138 curveto
+ closepath
+gsave fill grestore stroke
+newpath 21.30934 7.75606 moveto
+20.17679 10.86769 18.3764 13.69347 16.03494 16.03494 curveto stroke
+newpath 19.09639 13.46066 moveto
+18.1564 14.40456 17.1324 15.26648 16.03494 16.03494 curveto
+16.80339 14.93747 17.47086 13.7773 18.03133 12.56885 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 34.01608 moveto
+-2.97272 34.01608 -5.93262 33.62646 -8.80403 32.85707 curveto stroke
+newpath -5.08572 34.33142 moveto
+-6.35167 33.91377 -7.5933 33.42163 -8.80403 32.85707 curveto
+-7.47322 32.97351 -6.13814 33.0113 -4.8057 32.9708 curveto
+ closepath
+gsave fill grestore stroke
+-8.34605 47.58096 moveto
+(\022) cmmi10 9.96265 fshow
+-8.04022 -27.3122 moveto
+( ) cmmi10 9.96265 fshow
+52.68236 -24.51909 moveto
+(\022) cmmi10 9.96265 fshow
+30.10892 21.88089 moveto
+(\036) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1246 3481 a Fs(Figure)j(5)p Fu(:)37 b(Orien)n(tation)26
+b(of)i(the)g(observ)n(er)0 5173 y @beginspecial -64 @llx
+-9 @lly 60 @urx 353 @ury 620 @rwi @setspecial
+%%BeginDocument: anim.1
+%!PS
+%%BoundingBox: -64 -9 60 353
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+newpath 2.49242 -0.00175 moveto
+2.49242 0.65881 2.23 1.29231 1.76291 1.7594 curveto
+1.29582 2.22649 0.66232 2.4889 0.00175 2.4889 curveto
+-0.65881 2.4889 -1.29231 2.22649 -1.7594 1.7594 curveto
+-2.22649 1.29231 -2.4889 0.65881 -2.4889 -0.00175 curveto
+-2.4889 -0.66232 -2.22649 -1.29582 -1.7594 -1.76291 curveto
+-1.29231 -2.23 -0.65881 -2.49242 0.00175 -2.49242 curveto
+0.66232 -2.49242 1.29582 -2.23 1.76291 -1.76291 curveto
+2.23 -1.29582 2.49242 -0.66232 2.49242 -0.00175 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -2.20303 43.50117 moveto
+1.35403 47.26656 lineto stroke
+ [] 0 setdash
+newpath -0.07095 43.52895 moveto
+1.35403 47.26656 lineto
+-2.29651 45.63136 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-62.25195 43.74171 lineto stroke
+ [] 0 setdash
+newpath -58.55077 45.25749 moveto
+-62.25195 43.74171 lineto
+-58.56303 42.19633 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-2.21994 104.30948 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -0.68816 100.6144 moveto
+-2.21994 104.30948 lineto
+-3.74968 100.61354 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 829 w @beginspecial -68 @llx -12 @lly 57
+@urx 349 @ury 625 @rwi @setspecial
+%%BeginDocument: anim.2
+%!PS
+%%BoundingBox: -68 -12 57 349
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+newpath 2.4792 0.00705 moveto
+2.4792 0.66762 2.21678 1.30112 1.7497 1.7682 curveto
+1.28261 2.23529 0.64911 2.49771 -0.01146 2.49771 curveto
+-0.67203 2.49771 -1.30553 2.23529 -1.77261 1.7682 curveto
+-2.2397 1.30112 -2.50212 0.66762 -2.50212 0.00705 curveto
+-2.50212 -0.65352 -2.2397 -1.28702 -1.77261 -1.7541 curveto
+-1.30553 -2.22119 -0.67203 -2.48361 -0.01146 -2.48361 curveto
+0.64911 -2.48361 1.28261 -2.22119 1.7497 -1.7541 curveto
+2.21678 -1.28702 2.4792 -0.65352 2.4792 0.00705 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -6.61095 43.56754 moveto
+4.01413 47.28503 lineto stroke
+ [] 0 setdash
+newpath 1.0315 44.6197 moveto
+4.01413 47.28503 lineto
+0.02042 47.50948 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-65.25195 44.28316 lineto stroke
+ [] 0 setdash
+newpath -61.53806 45.76872 moveto
+-65.25195 44.28316 lineto
+-61.57541 42.70741 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-6.66168 104.37543 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -5.12784 100.68123 moveto
+-6.66168 104.37543 lineto
+-8.18936 100.67867 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 832 w @beginspecial -70 @llx -15 @lly 56
+@urx 350 @ury 630 @rwi @setspecial
+%%BeginDocument: anim.3
+%!PS
+%%BoundingBox: -70 -15 56 350
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+newpath 2.49773 -0.00089 moveto
+2.49773 0.65968 2.2353 1.29318 1.76822 1.76027 curveto
+1.30113 2.22736 0.66763 2.48978 0.00706 2.48978 curveto
+-0.6535 2.48978 -1.287 2.22736 -1.75409 1.76027 curveto
+-2.22118 1.29318 -2.4836 0.65968 -2.4836 -0.00089 curveto
+-2.4836 -0.66145 -2.22118 -1.29495 -1.75409 -1.76204 curveto
+-1.287 -2.22913 -0.6535 -2.49155 0.00706 -2.49155 curveto
+0.66763 -2.49155 1.30113 -2.22913 1.76822 -1.76204 curveto
+2.2353 -1.29495 2.49773 -0.66145 2.49773 -0.00089 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -10.89844 43.68222 moveto
+6.65823 47.29353 lineto stroke
+ [] 0 setdash
+newpath 3.34695 45.04964 moveto
+6.65823 47.29353 lineto
+2.73013 48.04836 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-67.24995 44.8544 lineto stroke
+ [] 0 setdash
+newpath -63.52336 46.30801 moveto
+-67.24995 44.8544 lineto
+-63.58702 43.2471 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-10.98207 104.49692 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -9.44606 100.80312 moveto
+-10.98207 104.49692 lineto
+-12.50792 100.7989 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 837 w @beginspecial -73 @llx -18 @lly 54
+@urx 350 @ury 635 @rwi @setspecial
+%%BeginDocument: anim.4
+%!PS
+%%BoundingBox: -73 -18 54 350
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+newpath 2.49155 0.00531 moveto
+2.49155 0.66588 2.22913 1.29938 1.76204 1.76646 curveto
+1.29495 2.23355 0.66145 2.49597 0.00089 2.49597 curveto
+-0.65968 2.49597 -1.29318 2.23355 -1.76027 1.76646 curveto
+-2.22736 1.29938 -2.48978 0.66588 -2.48978 0.00531 curveto
+-2.48978 -0.65526 -2.22736 -1.28876 -1.76027 -1.75584 curveto
+-1.29318 -2.22293 -0.65968 -2.48535 0.00089 -2.48535 curveto
+0.66145 -2.48535 1.29495 -2.22293 1.76204 -1.75584 curveto
+2.22913 -1.28876 2.49155 -0.65526 2.49155 0.00531 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -15.05333 43.85922 moveto
+9.20341 47.31767 lineto stroke
+ [] 0 setdash
+newpath 5.76093 45.2806 moveto
+9.20341 47.31767 lineto
+5.3288 48.31151 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-68.28326 45.46832 lineto stroke
+ [] 0 setdash
+newpath -64.54356 46.8866 moveto
+-68.28326 45.46832 lineto
+-64.63606 43.82675 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-15.16887 104.67435 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -13.63092 100.98135 moveto
+-15.16887 104.67435 lineto
+-16.69278 100.97552 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 842 w @beginspecial -74 @llx -22 @lly 57
+@urx 352 @ury 655 @rwi @setspecial
+%%BeginDocument: anim.5
+%!PS
+%%BoundingBox: -74 -22 57 352
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+newpath 2.49864 0.00887 moveto
+2.49864 0.66943 2.23622 1.30293 1.76913 1.77002 curveto
+1.30205 2.2371 0.66855 2.49953 0.00798 2.49953 curveto
+-0.65259 2.49953 -1.28609 2.2371 -1.75317 1.77002 curveto
+-2.22026 1.30293 -2.48268 0.66943 -2.48268 0.00887 curveto
+-2.48268 -0.6517 -2.22026 -1.2852 -1.75317 -1.75229 curveto
+-1.28609 -2.21938 -0.65259 -2.4818 0.00798 -2.4818 curveto
+0.66855 -2.4818 1.30205 -2.21938 1.76913 -1.75229 curveto
+2.23622 -1.2852 2.49864 -0.6517 2.49864 0.00887 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -18.98454 44.09567 moveto
+11.65569 47.35223 lineto stroke
+ [] 0 setdash
+newpath 8.14252 45.43936 moveto
+11.65569 47.35223 lineto
+7.81891 48.48389 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-68.329 46.1137 lineto stroke
+ [] 0 setdash
+newpath -64.57408 47.49214 moveto
+-68.329 46.1137 lineto
+-64.6992 44.43321 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-19.13023 104.91757 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -17.59064 101.22575 moveto
+-19.13023 104.91757 lineto
+-20.65216 101.21843 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1247 5355 a Fs(Figure)j(6)p Fu(:)37 b(Fiv)n(e)27
+b(views)g(of)h(an)f(animation)p eop
+%%Page: 280 7
+280 6 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(280)2470
+b(TUGb)r(oat,)28 b(V)-7 b(olume)27 b(18)g(\(1997\),)f(No.)i(4)0
+100 y Fs(F)-8 b(uture)0 232 y Fu(It)22 b(is)g(quite)g(easy)e(to)i
+(impro)n(v)n(e)e(and)i(extend)g(the)g Fp(3d)f Fu(macros)0
+332 y(but)46 b(the)f(author)f(decided)h(to)g(go)f(no)g(further)h(for)g
+(the)0 432 y(momen)n(t.)k(Other)32 b(ob)5 b(jects)31
+b(can)g(b)r(e)i(implemen)n(ted)f(easily)0 531 y(and)g(new)f(algorithms)
+g(can)g(b)r(e)h(added.)49 b(F)-7 b(or)31 b(instance)h(in)0
+631 y(order)25 b(to)i(tak)n(e)f(ligh)n(t)g(sources)g(or)f(shado)n(ws)g
+(in)n(to)i(accoun)n(t,)0 731 y(one)46 b(can)g(compute)h(the)g(angles)e
+(under)i(whic)n(h)f(a)g(face)0 830 y(gets)33 b(its)h(ligh)n(t,)h(and)e
+(the)h(angle)f(under)h(whic)n(h)f(this)h(v)n(ery)0 930
+y(face)40 b(is)g(seen,)k(in)c(order)f(to)i(decide)f(ho)n(w)g(m)n(uc)n
+(h)g(dark)n(er)0 1029 y(or)f(ligh)n(ter)g(it)h(m)n(ust)g(b)r(e)g
+(rendered.)72 b(Another)40 b(problem)0 1129 y(is)46 b(to)g(represen)n
+(t)f(o)n(v)n(erlapping)f(ob)5 b(jects)46 b(correctly)-7
+b(.)92 b(In)0 1229 y(the)40 b(curren)n(t)f(implemen)n(tation,)j(eac)n
+(h)d(ob)5 b(ject)40 b(is)f(dra)n(wn)0 1328 y(indep)r(enden)n(tly)f
+(from)f(the)h(other)e(ob)5 b(jects,)40 b(so)c(that)i(the)0
+1428 y(o)n(v)n(erlapping)48 b(ma)n(y)h(b)r(e)h(wrong.)103
+b(One)50 b(solution)f(is)h(to)0 1528 y(sort)30 b(all)g(the)h(faces)g
+(according)d(to)j(their)g(distance)f(to)h(the)0 1627
+y(observ)n(er)18 b(and,)j(if)f(t)n(w)n(o)g(faces)f(can)h(not)f(b)r(e)i
+(ordered,)f(to)g(split)0 1727 y(them.)53 b(Then,)34 b(the)f(faces)f
+(can)g(b)r(e)h(dra)n(wn)f(starting)g(with)0 1826 y(the)i(most)f(distan)
+n(t,)h(and)f(ending)h(with)f(the)h(closest)e(one.)0 1926
+y(App)r(endix)g(B)f(explains)f(the)i(in)n(ternal)e(represen)n(tation)f
+(of)0 2026 y(the)38 b(ob)5 b(jects)38 b(and)g(sho)n(ws)f(that)h(this)g
+(algorithm)f(can)h(b)r(e)0 2125 y(implemen)n(ted)e(without)g(m)n(uc)n
+(h)f(surgery)f(to)h(the)h(presen)n(t)0 2225 y(co)r(de.)0
+2391 y Fs(Ac)m(kno)m(wledgmen)m(ts)0 2524 y Fu(Thanks)30
+b(to)h(John)f(Hobb)n(y)g(who)g(alw)n(a)n(ys)f(answ)n(ers)g(all)h(m)n(y)
+0 2623 y(queries)h(on)g(the)h Fq(MET)n(AF)l(ONT)j Fu(mailing)c(list.)49
+b(Thanks)31 b(to)0 2723 y(Alain)37 b(Filb)r(ois)f(who)g(help)r(ed)h(me)
+g(with)g(the)g(shell)f(script)0 2823 y(syn)n(tax,)j(to)f(Thomas)f(Lam)n
+(b)r(olais)f(and)i(Thomas)f(Genet)0 2922 y(who)d(ga)n(v)n(e)e(some)i
+(feedbac)n(k)f(on)h(this)g(w)n(ork,)h(and)e(to)h(Do-)0
+3022 y(minique)29 b(Larc)n(hey)d(who)i(p)r(oin)n(ted)h(out)f(a)g
+(shortcoming)f(in)0 3122 y(the)34 b(conclusion.)55 b(Thanks)33
+b(to)g(Denis)h(Barbier)f(who)g(w)n(as)0 3221 y(one)19
+b(of)h(the)g(\014rst)g(users)f(of)h(these)f(macros)g(and)g(con)n
+(tributed)0 3321 y(the)k(animated)f(cra)n(y)n(ons)d(in)k(the)f
+(distribution.)36 b(Thanks)21 b(to)0 3421 y(Bogus )-23
+b(la)n(w)31 b(Jac)n(k)n(o)n(wski)f(who)i(made)h(v)-5
+b(aluable)32 b(commen)n(ts)0 3520 y(on)49 b(some)g(p)r(eculiarities)g
+(of)h(the)g(co)r(de.)102 b(And)50 b(\014nally)-7 b(,)0
+3620 y(sp)r(ecial)31 b(thanks)f(to)h(Ulrik)f(Vieth)i(who)f(not)f(only)h
+(pushed)0 3719 y(me)k(to)g(p)r(olish)g(m)n(y)f(co)r(de)h(and)f(this)i
+(pap)r(er)e(more)g(than)h(I)0 3819 y(had)30 b(\014rst)f(in)n(tended,)i
+(but)f(also)f(made)h(it)g(p)r(ossible)g(to)f(use)0 3919
+y Fq(MET)n(AP)t(OST)g Fu(under)f Fp(web2c)p Fu(.)0 4085
+y Fs(References)0 4218 y Fu(Da)n(vidsen,)56 b(Bill.)51
+b(\\NETPBM".)f(1993.)f(Av)-5 b(ailable)51 b(for)125 4317
+y(instance)j(at)h Fp(ftp://ftp.wustl.)o(edu)o(/g)o(ra)o(phi)o(cs)o(/)
+125 4417 y(graphics/packag)o(es)o(/Ne)o(tP)o(BM)p Fu(.)0
+4577 y(Go)r(ossens,)f(Mic)n(hel,)i(S.)50 b(Rah)n(tz,)55
+b(and)50 b(F.)g(Mittelbac)n(h.)125 4677 y Fo(The)36 b(L)327
+4660 y Fe(A)354 4677 y Fo(T)399 4692 y(E)445 4677 y(X)f(Gr)l(aphics)j
+(Comp)l(anion)p Fu(.)e(Addison-W)-7 b(es-)125 4777 y(ley)g(,)27
+b(Reading,)g(MA,)h(USA,)h(1997.)0 4937 y(Hobb)n(y)-7
+b(,)36 b(John)e(D.)h(\\A)f(User's)g(Man)n(ual)g(for)g(MetaP)n(ost".)125
+5037 y(T)-7 b(ec)n(hnical)27 b(Rep)r(ort)h(162,)f(A)-7
+b(T&T)28 b(Bell)g(Lab)r(oratories,)125 5136 y(Murra)n(y)d(Hill,)k(New)e
+(Jersey)-7 b(,)27 b(1992.)0 5297 y(Kn)n(uth,)j(Donald)g(E.)f(\\MFT,)g
+(v)n(ersion)f(2.0".)h(1989.)e(Stan-)125 5396 y(dard)f(T)364
+5412 y(E)411 5396 y(X)i(distribution.)2017 100 y(Kn)n(uth,)37
+b(Donald)d(E.)g Fo(The)j(A)n(rt)e(of)i(Computer)f(Pr)l(o)l(gr)l(am-)
+2142 199 y(ming,)29 b(volumes)f(1,)i(2)e(and)g(3)p Fu(.)f(Addison-W)-7
+b(esley)25 b(Pub-)2142 299 y(lishing)i(Compan)n(y)-7
+b(,)27 b(1997.)f(New)i(editions.)2017 404 y(M)r(\177)-44
+b(uller,)95 b(Ren)n(\023)-39 b(e)81 b(K.)g(\\GIFMerge,)93
+b(v)n(ersion)80 b(1.33".)2142 504 y(1996.)45 b(Av)-5
+b(ailable)47 b(at)g Fp(http://www.iis.e)o(e.)o(eth)o(z.)2142
+604 y(ch/~kiwi/GIFMerg)o(e/)p Fu(.)2017 770 y Fs(App)s(endix)32
+b(A)2017 869 y(Summary)h(of)e(the)h Fp(3d)f Fs(pac)m(k)-5
+b(age)2017 1002 y(T)m(yp)s(es)47 b Fu(The)32 b(commands)f(in)h(the)g
+Fp(3d)g Fu(pac)n(k)-5 b(age)30 b(tak)n(e)h(pa-)2017 1102
+y(rameters)k(of)h(sev)n(eral)f(di\013eren)n(t)h(t)n(yp)r(es.)63
+b(The)36 b(t)n(yp)r(es)h(are)2017 1201 y(describ)r(ed)28
+b(here.)2100 1324 y Fg(\017)41 b Fu(An)34 b Fg(h)p Fo(avn)6
+b Fg(i)34 b Fu(\()p Fo(A)n(bsolute)h(V)-6 b(e)l(ctor)34
+b(Numb)l(er)9 b Fu(\))32 b(is)h(the)h(in-)2183 1423 y(ternal)c(n)n(um)n
+(b)r(er)f(iden)n(tifying)h(a)f(v)n(ector)f(in)i(the)g
+Fp(vect)2183 1523 y Fu(arra)n(y)c(\(an)h(in)n(teger\).)2100
+1634 y Fg(\017)41 b Fu(An)32 b Fg(h)p Fo(apn)6 b Fg(i)32
+b Fu(\()p Fo(A)n(bsolute)h(Point)g(Numb)l(er)9 b Fu(\))30
+b(refers)g(to)h(a)2183 1734 y(v)n(ector)20 b(in)i(the)g(same)e(w)n(a)n
+(y)h(as)f(an)h Fg(h)p Fo(avn)6 b Fg(i)23 b Fu(\(an)e(in)n(teger\).)2100
+1846 y Fg(\017)41 b Fu(A)21 b Fg(h)p Fo(lpn)6 b Fg(i)22
+b Fu(\()p Fo(L)l(o)l(c)l(al)i(Point)g(Numb)l(er)9 b Fu(\))20
+b(is)g(a)g(n)n(um)n(b)r(er)h(iden-)2183 1945 y(tifying)40
+b(a)e(p)r(oin)n(t)h Fo(within)47 b Fu(an)38 b(ob)5 b(ject)39
+b(\(an)g(in)n(teger\).)2183 2045 y(Tw)n(o)23 b Fg(h)p
+Fo(lpn)6 b Fg(i)p Fu(s)25 b(with)f(the)g(same)f(v)-5
+b(alue)23 b(can)g(corresp)r(ond)2183 2144 y(to)28 b(di\013eren)n(t)g(p)
+r(oin)n(ts)f(in)h(di\013eren)n(t)g(ob)5 b(jects.)2100
+2256 y Fg(\017)41 b Fu(An)19 b Fg(h)p Fo(afn)6 b Fg(i)20
+b Fu(\()p Fo(A)n(bsolute)i(F)-6 b(ac)l(e)21 b(Numb)l(er)9
+b Fu(\))18 b(is)g(the)h(in)n(ternal)2183 2356 y(n)n(um)n(b)r(er)28
+b(iden)n(tifying)g(a)f(face.)2100 2467 y Fg(\017)41 b
+Fu(A)28 b Fg(h)p Fo(lfn)6 b Fg(i)29 b Fu(\()p Fo(L)l(o)l(c)l(al)h(F)-6
+b(ac)l(e)30 b(Numb)l(er)9 b Fu(\))27 b(is)g(a)g(n)n(um)n(b)r(er)g
+(iden-)2183 2567 y(tifying)47 b(a)e(face)h Fo(within)53
+b Fu(an)46 b(ob)5 b(ject)45 b(\(an)h(in)n(teger\).)2183
+2666 y(As)37 b(for)e(p)r(oin)n(ts,)k(t)n(w)n(o)c Fg(h)p
+Fo(lfn)6 b Fg(i)p Fu(s)38 b(with)e(the)h(same)f(v)-5
+b(alue)2183 2766 y(can)44 b(corresp)r(ond)f(to)h(di\013eren)n(t)g
+(faces)g(in)g(di\013eren)n(t)2183 2866 y(ob)5 b(jects.)2100
+2977 y Fg(\017)41 b Fu(A)34 b Fg(h)p Fo(cl)9 b Fg(i)34
+b Fu(\()p Fo(Class)7 b Fu(\))34 b(is)g(a)e(string)h(represen)n(ting)f
+(a)g(class,)2183 3077 y(for)e(instance)g Fp("tetrahedron")p
+Fu(.)39 b(It)31 b(ma)n(y)e(only)h(con-)2183 3176 y(tain)e(letters)g
+(and)f(underscores.)2100 3288 y Fg(\017)41 b Fu(An)f
+Fg(h)p Fo(obj)12 b Fg(i)42 b Fu(\()p Fo(Obje)l(ct)8 b
+Fu(\))40 b(is)f(a)g(string)g(represen)n(ting)f(an)2183
+3388 y(ob)5 b(ject,)38 b(that)e(is)g(an)g(instance)f(of)h(a)f(class.)61
+b(Suc)n(h)36 b(a)2183 3487 y(string)19 b(ma)n(y)g(only)g(con)n(tain)g
+(letters)g(and)g(underscores.)2100 3599 y Fg(\017)41
+b Fu(A)31 b Fg(h)p Fo(vl)9 b Fg(i)30 b Fu(\()p Fo(V)-6
+b(ertex)31 b(List)8 b Fu(\))30 b(is)g(a)g(list)g(of)g(in)n(tegers,)f
+(where)2183 3698 y(eac)n(h)36 b(in)n(teger)g(iden)n(ti\014es)g(a)g(v)n
+(ertex.)63 b(F)-7 b(or)36 b(instance,)2183 3798 y Fp(1,7)27
+b Fu(is)g(the)h(list)g(of)g(v)n(ertices)e(1)h(and)h(7.)2100
+3910 y Fg(\017)41 b Fu(A)c Fg(h)p Fo(vsl)9 b Fg(i)38
+b Fu(\()p Fo(V)-6 b(ertex)37 b(String)g(List)8 b Fu(\))37
+b(is)f(a)h(string)e(corre-)2183 4009 y(sp)r(onding)20
+b(to)g(a)f(list)i(of)f(in)n(tegers,)g(where)f(eac)n(h)g(in)n(teger)2183
+4109 y(iden)n(ti\014es)32 b(a)e(v)n(ertex.)47 b(F)-7
+b(or)30 b(instance,)i Fp("1,2,6,5")c Fu(is)2183 4208
+y(the)g(list)g(of)g(v)n(ertices)e(1,)i(2,)f(6)g(and)g(5.)2100
+4320 y Fg(\017)41 b(h)p Fo(hc)5 b Fg(i)23 b Fu(\()p Fo(Hex)h(Color)9
+b Fu(\))23 b(is)f(a)f(string)g(represen)n(ting)f(a)h(color)2183
+4420 y(with)41 b(the)g(three)g(R)n(GB)f(comp)r(onen)n(ts)g(in)g
+(hexadec-)2183 4519 y(imal)45 b(and)f(in)g(the)h(range)e(0)p
+Fn(::)p Fu(255.)85 b(F)-7 b(or)44 b(instance,)2183 4619
+y Fp("b4fe40")p Fu(.)2100 4730 y Fg(\017)d(h)p Fo(c)l(ol)9
+b Fg(i)24 b Fu(\()p Fo(Color)9 b Fu(\))25 b(is)e(a)f(standard)g
+Fq(MET)n(AP)t(OST)i Fu(color)e(\(a)2183 4830 y(triplet)33
+b(of)g(R)n(GB)g(comp)r(onen)n(ts)f(in)h(the)g(range)e(0)p
+Fn(::)p Fu(1\),)2183 4930 y(suc)n(h)d(as)f Fp(red)p Fu(.)2100
+5041 y Fg(\017)41 b(h)p Fo(str)9 b Fg(i)28 b Fu(\()p
+Fo(String)7 b Fu(\))28 b(is)g(a)f(string.)2100 5153 y
+Fg(\017)41 b(h)p Fo(p)l(air)9 b Fg(i)30 b Fu(\()p Fo(Pair)9
+b Fu(\))29 b(is)f(a)f(pair)g(of)g(n)n(umerics.)2100 5264
+y Fg(\017)41 b(h)p Fo(num)6 b Fg(i)28 b Fu(\()p Fo(Numeric)5
+b Fu(\))28 b(is)g(a)f(n)n(um)n(b)r(er.)2100 5376 y Fg(\017)41
+b(h)p Fo(b)l(o)l(ol)9 b Fg(i)29 b Fu(\()p Fo(Bo)l(ole)l(an)6
+b Fu(\))30 b(is)e(a)f(b)r(o)r(olean.)p eop
+%%Page: 281 8
+281 7 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(TUGb)r(oat,)28
+b(V)-7 b(olume)28 b(18)e(\(1997\),)h(No.)g(4)2471 b(281)0
+100 y Fs(Lo)m(w)32 b(lev)m(el)f(v)m(ector)i(commands)47
+b Fu(The)32 b(lo)n(w)h(lev)n(el)f(v)n(ec-)0 199 y(tor)24
+b(commands)f(de\014ne)i(the)g(classical)d(op)r(erations)h(in)i(v)n(ec-)
+0 299 y(tor)i(algebra.)83 428 y Fg(\017)41 b Fp(vect_def\()p
+Fg(h)p Fo(avn)6 b Fg(i)p Fp(,)p Fn(x)p Fp(,)p Fn(y)s
+Fp(,)p Fn(z)t Fp(\))p Fu(:)44 b(de\014nes)34 b(v)n(ector)e
+Fg(h)p Fo(avn)6 b Fg(i)166 528 y Fu(as)27 b(\()p Fn(x;)14
+b(y)s(;)g(z)t Fu(\);)83 653 y Fg(\017)41 b Fp(set_point)p
+Fu(;)c(synon)n(ym)f(of)g Fp(vect_def)p Fu(:)51 b(a)36
+b(p)r(oin)n(t)g(is)166 753 y(stored)27 b(in)h(the)g(same)f(arra)n(y)e
+(as)i(v)n(ectors.)83 878 y Fg(\017)41 b Fp(set_obj_point\()p
+Fg(h)p Fo(lpn)6 b Fg(i)p Fp(,)p Fn(x)p Fp(,)p Fn(y)s
+Fp(,)p Fn(z)t Fp(\))o Fu(:)30 b(this)25 b(de\014nes)g(the)166
+978 y(p)r(oin)n(t)j Fg(h)p Fo(lpn)6 b Fg(i)29 b Fu(as)e(\()p
+Fn(x;)14 b(y)s(;)g(z)t Fu(\);)83 1104 y Fg(\017)41 b
+Fp(vect_def_vect\()p Fg(h)p Fo(avn)6 b Fg(i)979 1116
+y Fm(1)1012 1104 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1253 1116
+y Fm(2)1291 1104 y Fp(\))p Fu(:)33 b(v)n(ector)19 b Fg(h)p
+Fo(avn)6 b Fg(i)1830 1116 y Fm(1)166 1203 y Fu(b)r(ecomes)27
+b(equal)g(to)h(v)n(ector)e Fg(h)p Fo(avn)6 b Fg(i)1263
+1215 y Fm(2)1302 1203 y Fu(;)83 1329 y Fg(\017)41 b Fp(vect_sum\()p
+Fg(h)p Fo(avn)6 b Fg(i)759 1341 y Fm(1)794 1329 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1035 1341 y Fm(2)1073 1329 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1314 1341 y Fm(3)1352 1329 y Fp(\))p
+Fu(:)68 b(the)44 b(v)n(ector)166 1428 y Fg(h)p Fo(avn)6
+b Fg(i)363 1440 y Fm(1)432 1428 y Fu(b)r(ecomes)29 b(the)h(sum)g(of)g
+(v)n(ectors)f Fg(h)p Fo(avn)6 b Fg(i)1666 1440 y Fm(2)1734
+1428 y Fu(and)166 1528 y Fg(h)p Fo(avn)g Fg(i)363 1540
+y Fm(3)402 1528 y Fu(.)83 1654 y Fg(\017)41 b Fp(vect_translate\()p
+Fg(h)p Fo(avn)6 b Fg(i)1023 1666 y Fm(1)1055 1654 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1296 1666 y Fm(2)1334 1654 y Fp(\))p
+Fu(:)68 b(add)43 b(v)n(ector)166 1753 y Fg(h)p Fo(avn)6
+b Fg(i)363 1765 y Fm(2)430 1753 y Fu(to)29 b(v)n(ector)e
+Fg(h)p Fo(avn)6 b Fg(i)980 1765 y Fm(1)1019 1753 y Fu(;)29
+b(v)n(ector)f Fg(h)p Fo(avn)6 b Fg(i)1519 1765 y Fm(2)1586
+1753 y Fu(remains)166 1853 y(unc)n(hanged.)83 1979 y
+Fg(\017)41 b Fp(vect_diff\()p Fg(h)p Fo(avn)6 b Fg(i)803
+1991 y Fm(1)837 1979 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1078
+1991 y Fm(2)1116 1979 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1357
+1991 y Fm(3)1396 1979 y Fp(\))p Fu(:)39 b(the)29 b(v)n(ector)166
+2078 y Fg(h)p Fo(avn)6 b Fg(i)363 2090 y Fm(1)433 2078
+y Fu(b)r(ecomes)31 b(the)h(di\013erence)f(b)r(et)n(w)n(een)h(v)n
+(ectors)166 2178 y Fg(h)p Fo(avn)6 b Fg(i)363 2190 y
+Fm(2)429 2178 y Fu(and)28 b Fg(h)p Fo(avn)6 b Fg(i)788
+2190 y Fm(3)826 2178 y Fu(.)83 2303 y Fg(\017)41 b Fp(vect_dprod\()p
+Fg(h)p Fo(avn)6 b Fg(i)847 2315 y Fm(1)881 2303 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1122 2315 y Fm(2)1160 2303 y Fp(\))18
+b Fg(!)h(h)p Fo(num)6 b Fg(i)p Fu(:)32 b(returns)166
+2403 y(the)c(dot)g(pro)r(duct)f(of)h(v)n(ectors)e Fg(h)p
+Fo(avn)6 b Fg(i)1342 2415 y Fm(1)1408 2403 y Fu(and)27
+b Fg(h)p Fo(avn)6 b Fg(i)1766 2415 y Fm(2)1805 2403 y
+Fu(.)83 2529 y Fg(\017)41 b Fp(vect_mod\()p Fg(h)p Fo(avn)6
+b Fg(i)p Fp(\))29 b Fg(!)i(h)p Fo(num)6 b Fg(i)p Fu(:)45
+b(returns)30 b(the)i(mo)r(d-)166 2628 y(ulus)c(of)f(v)n(ector)g
+Fg(h)p Fo(avn)6 b Fg(i)p Fu(.)83 2754 y Fg(\017)41 b
+Fp(vect_prod\()p Fg(h)p Fo(avn)6 b Fg(i)803 2766 y Fm(1)837
+2754 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1078 2766 y Fm(2)1116
+2754 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1357 2766 y Fm(3)1396
+2754 y Fp(\))p Fu(:)39 b(the)29 b(v)n(ector)166 2853
+y Fg(h)p Fo(avn)6 b Fg(i)363 2865 y Fm(1)439 2853 y Fu(b)r(ecomes)36
+b(the)h(v)n(ector)f(pro)r(duct)h(of)g(v)n(ectors)166
+2953 y Fg(h)p Fo(avn)6 b Fg(i)363 2965 y Fm(2)429 2953
+y Fu(and)28 b Fg(h)p Fo(avn)6 b Fg(i)788 2965 y Fm(3)826
+2953 y Fu(.)83 3079 y Fg(\017)41 b Fp(vect_mult\()p Fg(h)p
+Fo(avn)6 b Fg(i)803 3091 y Fm(1)837 3079 y Fp(,)p Fg(h)p
+Fo(avn)g Fg(i)1078 3091 y Fm(2)1116 3079 y Fp(,)p Fg(h)p
+Fo(num)g Fg(i)p Fp(\))p Fu(:)36 b Fg(h)p Fo(avn)6 b Fg(i)1690
+3091 y Fm(1)1755 3079 y Fu(b)r(e-)166 3178 y(comes)27
+b(v)n(ector)f Fg(h)p Fo(avn)6 b Fg(i)857 3190 y Fm(2)923
+3178 y Fu(scaled)27 b(b)n(y)h Fg(h)p Fo(num)6 b Fg(i)p
+Fu(.)83 3304 y Fg(\017)41 b Fp(mid_point\()p Fg(h)p Fo(avn)6
+b Fg(i)803 3316 y Fm(1)837 3304 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1078 3316 y Fm(2)1116 3304 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1357 3316 y Fm(3)1396 3304 y Fp(\))p Fu(:)45 b(v)n(ector)31
+b(\(or)166 3403 y(p)r(oin)n(t\))26 b Fg(h)p Fo(avn)6
+b Fg(i)610 3415 y Fm(1)673 3403 y Fu(b)r(ecomes)25 b(the)g(mid-p)r(oin)
+n(t)h(of)f(v)n(ectors)166 3503 y(\(or)37 b(of)g(the)h(line)f(joining)g
+(the)h(p)r(oin)n(ts\))f Fg(h)p Fo(avn)6 b Fg(i)1658 3515
+y Fm(2)1734 3503 y Fu(and)166 3603 y Fg(h)p Fo(avn)g
+Fg(i)363 3615 y Fm(3)402 3603 y Fu(.)83 3728 y Fg(\017)41
+b Fp(vect_rotate\()p Fg(h)p Fo(avn)6 b Fg(i)891 3740
+y Fm(1)925 3728 y Fp(,)p Fg(h)p Fo(avn)g Fg(i)1166 3740
+y Fm(2)1204 3728 y Fp(,)p Fn(a)p Fp(\))p Fu(:)32 b(v)n(ector)19
+b Fg(h)p Fo(avn)6 b Fg(i)1830 3740 y Fm(1)166 3828 y
+Fu(is)26 b(rotated)g(around)g(v)n(ector)f Fg(h)p Fo(avn)6
+b Fg(i)1264 3840 y Fm(2)1329 3828 y Fu(b)n(y)26 b(the)h(angle)f
+Fn(a)p Fu(.)0 3994 y Fs(Op)s(erations)31 b(on)g(ob)5
+b(jects)47 b Fu(Sev)n(eral)32 b(op)r(erations)f(apply)0
+4094 y(globally)26 b(on)i(ob)5 b(jects:)83 4223 y Fg(\017)41
+b Fp(assign_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p
+Fg(h)p Fo(cl)d Fg(i)p Fp(\))p Fu(:)80 b(create)50 b Fg(h)p
+Fo(obj)12 b Fg(i)52 b Fu(as)e(an)166 4322 y(instance)27
+b(of)h(class)f Fg(h)p Fo(cl)9 b Fg(i)p Fu(.)83 4448 y
+Fg(\017)41 b Fp(reset_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p
+Fp(\))p Fu(:)31 b(put)23 b Fg(h)p Fo(obj)12 b Fg(i)23
+b Fu(bac)n(k)e(where)h(it)g(w)n(as)166 4548 y(just)28
+b(after)f(it)i(w)n(as)d(initialized.)83 4673 y Fg(\017)41
+b Fp(put_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p
+Fo(avn)6 b Fg(i)p Fp(,)p Fn(s)p Fp(,)p Fn( )s Fp(,)p
+Fn(\022)r Fp(,)p Fn(\036)p Fp(\))p Fu(:)55 b(ob)5 b(ject)37
+b Fg(h)p Fo(obj)12 b Fg(i)166 4773 y Fu(is)49 b(scaled)f(b)n(y)g
+Fn(s)p Fu(,)54 b(shifted)49 b(b)n(y)g(v)n(ector)e Fg(h)p
+Fo(avn)6 b Fg(i)50 b Fu(and)166 4872 y(orien)n(ted)43
+b(with)h(the)g(angles)e Fn( )s Fu(,)48 b Fn(\022)r Fu(,)g
+Fn(\036)p Fu(,)g(as)43 b(for)g(the)166 4972 y(observ)n(er)25
+b(orien)n(tation)i(\(\014gure)g(5\).)83 5098 y Fg(\017)41
+b Fp(rotate_obj_pv\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p
+Fg(h)p Fo(lpn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(avn)g Fg(i)p
+Fp(,)p Fn(a)p Fp(\))p Fu(:)61 b(ob)5 b(ject)166 5197
+y Fg(h)p Fo(obj)12 b Fg(i)36 b Fu(is)d(rotated)h(around)e(an)i(axis)f
+(going)g(through)166 5297 y(lo)r(cal)c(p)r(oin)n(t)h
+Fg(h)p Fo(lpn)6 b Fg(i)31 b Fu(and)e(directed)h(b)n(y)f(v)n(ector)g
+Fg(h)p Fo(avn)6 b Fg(i)p Fu(;)166 5396 y(the)28 b(rotation)f(is)g(b)n
+(y)g Fn(a)h Fu(degrees.)2100 100 y Fg(\017)41 b Fp(rotate_obj_abs_pv)o
+(\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(apn)6
+b Fg(i)p Fp(,)p Fg(h)p Fo(avn)g Fg(i)p Fp(,)p Fn(a)p
+Fp(\))p Fu(:)2183 199 y(the)24 b(ob)5 b(ject)23 b Fg(h)p
+Fo(obj)12 b Fg(i)25 b Fu(is)d(rotated)h(around)f(an)g(axis)h(going)2183
+299 y(through)35 b(absolute)g(p)r(oin)n(t)g Fg(h)p Fo(apn)6
+b Fg(i)37 b Fu(and)e(directed)g(b)n(y)2183 399 y(v)n(ector)27
+b Fg(h)p Fo(avn)6 b Fg(i)p Fu(;)29 b(the)f(rotation)e(is)i(b)n(y)f
+Fn(a)h Fu(degrees.)2100 508 y Fg(\017)41 b Fp(rotate_obj_pp\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(lpn)6 b Fg(i)3204
+520 y Fm(1)3238 508 y Fp(,)p Fg(h)p Fo(lpn)g Fg(i)3462
+520 y Fm(2)3501 508 y Fp(,)p Fn(a)p Fp(\))p Fu(:)47 b
+Fg(h)p Fo(obj)12 b Fg(i)2183 608 y Fu(is)36 b(rotated)f(around)g(an)h
+(axis)f(going)g(through)g(lo)r(cal)2183 708 y(p)r(oin)n(ts)h
+Fg(h)p Fo(lpn)6 b Fg(i)2621 720 y Fm(1)2696 708 y Fu(and)36
+b Fg(h)p Fo(lpn)6 b Fg(i)3046 720 y Fm(2)3084 708 y Fu(;)41
+b(the)36 b(rotation)f(is)h(b)n(y)g Fn(a)2183 807 y Fu(degrees.)2100
+917 y Fg(\017)41 b Fp(translate_obj\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(avn)6 b Fg(i)p Fp(\))p Fu(:)57
+b(ob)5 b(ject)39 b Fg(h)p Fo(obj)12 b Fg(i)41 b Fu(is)2183
+1017 y(translated)27 b(b)n(y)h(v)n(ector)e Fg(h)p Fo(avn)6
+b Fg(i)p Fu(.)2100 1127 y Fg(\017)41 b Fp(scale_obj\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fn(v)s Fp(\))p Fu(:)30
+b(ob)5 b(ject)18 b Fg(h)p Fo(obj)12 b Fg(i)20 b Fu(is)e(scaled)g(b)n(y)
+g Fn(v)s Fu(.)2017 1293 y Fs(Building)31 b(new)g(p)s(oin)m(ts)g(in)h
+(space)41 b Fu(Three)21 b(macros)g(are)2017 1392 y(esp)r(ecially)j
+(useful)g(for)f(the)h(de\014nition)g(of)g(regular)e(p)r(olyhe-)2017
+1492 y(dra:)2100 1613 y Fg(\017)41 b Fp(rotate_in_plane\()p
+Fn(k)s Fp(,)o Fn(o)p Fp(,)p Fn(i)p Fp(,)o Fn(j)5 b Fp(\))p
+Fu(:)39 b(get)31 b(p)r(oin)n(t)g Fn(k)k Fu(from)2183
+1713 y(p)r(oin)n(t)28 b Fn(j)33 b Fu(b)n(y)27 b(rotation)f(around)h(p)r
+(oin)n(t)g Fn(o)h Fu(b)n(y)f(an)g(angle)2183 1813 y Fn(\013)i
+Fu(equal)e(to)h(the)h(angle)e(from)g Fn(i)h Fu(to)g Fn(j)5
+b Fu(;)28 b Fn(i)p Fu(,)g Fn(j)33 b Fu(and)28 b Fn(k)j
+Fu(are)2183 1912 y(of)d(t)n(yp)r(e)g Fg(h)p Fo(lpn)6
+b Fg(i)p Fu(,)29 b(whereas)d Fn(o)i Fu(is)g(of)f(t)n(yp)r(e)h
+Fg(h)p Fo(apn)6 b Fg(i)p Fu(.)2764 2501 y @beginspecial
+-7 @llx -7 @lly 58 @urx 57 @ury 650 @rwi @setspecial
+%%BeginDocument: vect-fig.11
+%!PS
+%%BoundingBox: -7 -7 58 57
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000000388
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 0 0 moveto
+43.42923 36.44121 lineto stroke
+newpath 0 0 moveto
+19.3903 53.27371 lineto stroke
+newpath 22.33218 3.93771 moveto
+21.64098 7.85783 19.93013 11.52698 17.37143 14.57626 curveto stroke
+newpath 20.19688 11.74487 moveto
+19.34358 12.76617 18.39877 13.71422 17.37143 14.57626 curveto
+18.04199 13.41484 18.60558 12.20084 19.05812 10.94928 curveto
+ closepath
+gsave fill grestore stroke
+newpath 17.37143 14.57626 moveto
+14.81273 17.62555 11.49652 19.94771 7.756 21.30916 curveto stroke
+newpath 11.6186 20.26982 moveto
+10.36897 20.72763 9.07674 21.07628 7.756 21.30916 curveto
+8.91743 20.6386 10.0125 19.86902 11.0302 19.01143 curveto
+ closepath
+gsave fill grestore stroke
+25.05493 11.03316 moveto
+(\013) cmmi10 9.96265 fshow
+14.67989 23.39748 moveto
+(\013) cmmi10 9.96265 fshow
+-6.9291 -6.3895 moveto
+(o) cmmi10 9.96265 fshow
+54.11514 0.27383 moveto
+(i) cmmi10 9.96265 fshow
+45.52922 27.77061 moveto
+(j) cmmi10 9.96265 fshow
+10.8901 49.81445 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2100 2628 a Fg(\017)41 b Fp(new_face_point\()p
+Fn(c)p Fp(,)p Fn(o)p Fp(,)p Fn(i)o Fp(,)p Fn(j)5 b Fp(,)o
+Fn(\013)p Fp(\))p Fu(:)30 b(the)25 b(middle)h Fn(m)f
+Fu(of)2183 2743 y(p)r(oin)n(ts)34 b Fn(i)f Fu(and)h Fn(j)39
+b Fu(is)33 b(suc)n(h)g(that)3312 2717 y Fd(d)3210 2743
+y Fu(\()3242 2716 y Fg(\000)-34 b(!)3242 2743 y Fn(om)q(;)3393
+2716 y Fg(\000)-40 b(!)3393 2743 y Fn(mc)o Fu(\))34 b(=)f
+Fn(\013)h Fu(and)2183 2816 y Fg(\000)-39 b(!)2183 2843
+y Fn(mc)32 b Fu(is)2411 2816 y Fg(\000)-35 b(!)2411 2843
+y Fn(om)32 b Fu(rotated)f(around)3136 2797 y Fg(\000)-65
+b(!)3144 2843 y Fn(j)5 b(i)i Fu(.)49 b Fn(c)p Fu(,)33
+b Fn(o)p Fu(,)f Fn(i)g Fu(and)f Fn(j)37 b Fu(are)2183
+2943 y(of)28 b(t)n(yp)r(e)g Fg(h)p Fo(lpn)6 b Fg(i)p
+Fu(.)2676 3515 y @beginspecial -8 @llx -9 @lly 78 @urx
+53 @ury 860 @rwi @setspecial
+%%BeginDocument: vect-fig.7
+%!PS
+%%BoundingBox: -8 -9 78 53
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008308
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+34.97847 18.22087 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 0 0 moveto
+45.83568 9.11044 lineto
+75.09138 45.55219 lineto stroke
+newpath 45.83568 9.11044 moveto
+68.75352 13.66566 lineto stroke
+ [] 0 setdash
+newpath 57.2946 11.38806 moveto
+57.2946 14.34955 55.87602 17.22853 53.1496 18.22089 curveto stroke
+65.54852 16.66566 moveto
+(\013) cmmi10 9.96265 fshow
+-7.8291 -2.14476 moveto
+(o) cmmi10 9.96265 fshow
+28.20547 22.25806 moveto
+(j) cmmi10 9.96265 fshow
+58.7929 -8.6706 moveto
+(i) cmmi10 9.96265 fshow
+72.93568 48.55219 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2100 3642 a Fg(\017)41 b Fp(new_abs_face_poin)o(t\()p
+Fn(c)p Fp(,)o Fn(o)p Fp(,)p Fn(i)p Fp(,)o Fn(j)5 b Fp(,)p
+Fn(\013)p Fp(\))p Fu(:)65 b(similar)45 b(to)2183 3741
+y(the)28 b(previous)f(de\014nition,)h(but)g Fn(c)f Fu(and)h
+Fn(o)f Fu(are)g(of)g(t)n(yp)r(e)2183 3841 y Fg(h)p Fo(apn)6
+b Fg(i)p Fu(.)2017 4007 y Fs(Dra)m(wing)33 b(p)s(oin)m(ts,)d(axes,)i
+(ob)5 b(jects)2100 4128 y Fg(\017)41 b Fp(draw_point\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(lpn)6 b Fg(i)p
+Fp(\))p Fu(:)39 b(dra)n(w)29 b(p)r(oin)n(t)h Fg(h)p Fo(lpn)6
+b Fg(i)31 b Fu(in)2183 4228 y(ob)5 b(ject)28 b Fg(h)p
+Fo(obj)12 b Fg(i)p Fu(.)2100 4338 y Fg(\017)41 b Fp(draw_axes\()p
+Fg(h)p Fo(c)l(ol)9 b Fg(i)2793 4350 y Fm(1)2827 4338
+y Fp(,)p Fg(h)p Fo(c)l(ol)g Fg(i)3041 4350 y Fm(2)3079
+4338 y Fp(,)p Fg(h)p Fo(c)l(ol)g Fg(i)3293 4350 y Fm(3)3330
+4338 y Fp(\))p Fu(:)34 b(dra)n(w)21 b(v)n(ectors)2172
+4448 y Fn(~)-31 b({)p Fu(,)24 b Fn(~)-38 b(|)28 b Fu(and)2478
+4426 y Fn(~)2482 4448 y(k)i Fu(in)e(colors)e Fg(h)p Fo(c)l(ol)9
+b Fg(i)3058 4460 y Fm(1)3096 4448 y Fu(,)28 b Fg(h)p
+Fo(c)l(ol)9 b Fg(i)3317 4460 y Fm(2)3383 4448 y Fu(and)27
+b Fg(h)p Fo(c)l(ol)9 b Fg(i)3714 4460 y Fm(3)3752 4448
+y Fu(.)2100 4558 y Fg(\017)41 b Fp(draw_obj\()p Fg(h)p
+Fo(obj)12 b Fg(i)p Fp(\))p Fu(:)35 b(dra)n(w)26 b(ob)5
+b(ject)28 b Fg(h)p Fo(obj)12 b Fg(i)p Fu(.)2017 4724
+y Fs(Setting)32 b(faces)2100 4846 y Fg(\017)41 b Fp(set_face\()p
+Fg(h)p Fo(afn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(vsl)j Fg(i)p
+Fp(,)p Fg(h)p Fo(hc)c Fg(i)p Fp(\))p Fu(:)45 b(set)32
+b(absolute)g(face)2183 4945 y Fg(h)p Fo(afn)6 b Fg(i)27
+b Fu(as)d(delimited)i(b)n(y)f(the)g(v)n(ertex)f(list)h
+Fg(h)p Fo(vsl)9 b Fg(i)26 b Fu(\(lo)r(cal)2183 5045 y(p)r(oin)n(t)i(n)n
+(um)n(b)r(ers\))g(and)f(colored)f(b)n(y)i(color)e Fg(h)p
+Fo(hc)5 b Fg(i)p Fu(.)2100 5155 y Fg(\017)41 b Fp(set_obj_face\()p
+Fg(h)p Fo(lfn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(vsl)j Fg(i)p
+Fp(,)p Fg(h)p Fo(hc)c Fg(i)p Fp(\))p Fu(:)33 b(set)27
+b(lo)r(cal)f(face)2183 5254 y Fg(h)p Fo(lfn)6 b Fg(i)29
+b Fu(as)e(delimited)i(b)n(y)e(the)h(v)n(ertex)f(list)h
+Fg(h)p Fo(vsl)9 b Fg(i)28 b Fu(\(lo)r(cal)2183 5354 y(p)r(oin)n(t)g(n)n
+(um)n(b)r(ers\))g(and)f(colored)f(b)n(y)i(color)e Fg(h)p
+Fo(hc)5 b Fg(i)p Fu(.)p eop
+%%Page: 282 9
+282 8 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(282)2470
+b(TUGb)r(oat,)28 b(V)-7 b(olume)27 b(18)g(\(1997\),)f(No.)i(4)0
+100 y Fs(View)j(p)s(oin)m(ts,)g(distance)83 226 y Fg(\017)41
+b Fp(compute_referenc)o(e\()p Fn( )s Fp(,)o Fn(\022)r
+Fp(,)p Fn(\036)p Fp(\))p Fu(:)50 b(de\014nes)38 b(the)f(ori-)166
+325 y(en)n(tation)29 b(of)f(the)i(observ)n(er)c(b)n(y)j(the)g(three)g
+(angles)f Fn( )s Fu(,)166 425 y Fn(\022)i Fu(and)d Fn(\036)p
+Fu(.)38 b(See)27 b(\014gure)g(5.)83 544 y Fg(\017)41
+b Fp(point_of_view_ob)o(j\()p Fg(h)p Fo(obj)12 b Fg(i)p
+Fp(,)p Fg(h)p Fo(lpn)6 b Fg(i)p Fp(,)p Fn(\036)p Fp(\))p
+Fu(:)63 b(the)43 b(ori-)166 644 y(en)n(tation)38 b(of)h(the)g(observ)n
+(er)d(is)i(de\014ned)h(as)f(lo)r(oking)166 744 y(lo)r(cal)28
+b(p)r(oin)n(t)h Fg(h)p Fo(lpn)6 b Fg(i)29 b Fu(of)g(ob)5
+b(ject)28 b Fg(h)p Fo(obj)12 b Fg(i)p Fu(,)31 b(with)e(an)f(angle)166
+843 y(of)g Fn(\036)p Fu(;)83 963 y Fg(\017)41 b Fp(point_of_view_ab)o
+(s\()p Fg(h)p Fo(apn)6 b Fg(i)p Fp(,)p Fn(\036)p Fp(\))p
+Fu(:)44 b(the)34 b(observ)n(er's)166 1062 y(orien)n(tation)26
+b(is)i(de\014ned)g(as)f(lo)r(oking)g(absolute)g(p)r(oin)n(t)166
+1162 y Fg(h)p Fo(apn)6 b Fg(i)p Fu(,)29 b(with)f(an)g(angle)e(of)i
+Fn(\036)p Fu(;)83 1281 y Fg(\017)41 b Fp(obs_distance\()p
+Fn(v)s Fp(\)\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p
+Fo(lpn)6 b Fg(i)p Fp(\))p Fu(:)29 b(let)19 b Fn(v)j Fu(equal)c(the)166
+1381 y(distance)34 b(b)r(et)n(w)n(een)g(the)h(observ)n(er)d(and)i(lo)r
+(cal)g(p)r(oin)n(t)166 1480 y Fg(h)p Fo(lpn)6 b Fg(i)29
+b Fu(in)f(ob)5 b(ject)27 b Fg(h)p Fo(obj)12 b Fg(i)p
+Fu(.)0 1647 y Fs(V)-8 b(ector)32 b(and)h(p)s(oin)m(t)e(allo)s(cation)83
+1773 y Fg(\017)41 b Fp(new_vect)p Fg(!)24 b(h)p Fo(avn)6
+b Fg(i)p Fu(:)39 b(return)27 b(a)g(new)h(v)n(ector;)83
+1892 y Fg(\017)41 b Fp(new_point)p Fu(:)33 b(synon)n(ym)27
+b(of)h Fp(new_vect)p Fu(;)83 2011 y Fg(\017)41 b Fp(new_points\()p
+Fn(v)s Fp(\)\()p Fn(n)p Fp(\))p Fu(:)27 b(de\014nes)20
+b(the)h(absolute)e(p)r(oin)n(ts)166 2111 y Fn(v)206 2123
+y Fm(1)244 2111 y Fn(;)14 b(:)g(:)g(:)f(;)h(v)468 2123
+y Ff(n)513 2111 y Fu(,)28 b(using)f Fp(new_point)p Fu(;)83
+2230 y Fg(\017)41 b Fp(free_vect\()p Fg(h)p Fo(avn)6
+b Fg(i)p Fp(\))p Fu(:)34 b(free)27 b(v)n(ector)f Fg(h)p
+Fo(avn)6 b Fg(i)p Fu(;)83 2350 y Fg(\017)41 b Fp(free_point\()p
+Fg(h)p Fo(apn)6 b Fg(i)p Fp(\))p Fu(:)34 b(free)27 b(p)r(oin)n(t)h
+Fg(h)p Fo(apn)6 b Fg(i)p Fu(;)83 2469 y Fg(\017)41 b
+Fp(free_points\()p Fn(v)s Fp(\)\()p Fn(n)p Fp(\))p Fu(:)35
+b(frees)29 b(the)h(absolute)f(p)r(oin)n(ts)166 2569 y
+Fn(v)206 2581 y Fm(1)244 2569 y Fn(;)14 b(:)g(:)g(:)f(;)h(v)468
+2581 y Ff(n)513 2569 y Fu(,)28 b(using)f Fp(free_point)p
+Fu(.)0 2735 y Fs(Debugging)83 2861 y Fg(\017)41 b Fp(show_vect\()p
+Fg(h)p Fo(str)9 b Fg(i)p Fp(,)p Fg(h)p Fo(avn)d Fg(i)p
+Fp(\))p Fu(:)54 b(sho)n(ws)37 b(v)n(ector)g Fg(h)p Fo(avn)6
+b Fg(i)p Fu(,)166 2961 y(with)28 b(string)f Fg(h)p Fo(str)9
+b Fg(i)p Fu(.)83 3080 y Fg(\017)41 b Fp(show_point)p
+Fu(:)33 b(synon)n(ym)27 b(of)g Fp(show_vect)83 3199 y
+Fg(\017)41 b Fp(show_pair\()p Fg(h)p Fo(str)9 b Fg(i)p
+Fp(,)p Fg(h)p Fo(p)l(air)g Fg(i)p Fp(\))p Fu(:)30 b(this)21
+b(sho)n(ws)f(a)g(n)n(umeric)166 3299 y(pair,)27 b(with)h(string)f
+Fg(h)p Fo(str)9 b Fg(i)p Fu(.)0 3465 y Fs(Normalization)83
+3591 y Fg(\017)41 b Fp(normalize_obj\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(vl)d Fg(i)p Fp(\))p Fu(:)51
+b(normalize)35 b(ob)5 b(ject)166 3691 y Fg(h)p Fo(obj)12
+b Fg(i)29 b Fu(with)f(resp)r(ect)g(to)f(the)h(list)g(of)g(v)n(ertices)e
+Fg(h)p Fo(vl)9 b Fg(i)p Fu(.)0 3857 y Fs(P)m(arameters)83
+3983 y Fg(\017)41 b Fp(Obs_dist)28 b Fg(!)j(h)p Fo(num)6
+b Fg(i)p Fu(:)43 b(distance)31 b(b)r(et)n(w)n(een)f(the)i(ob-)166
+4082 y(serv)n(er)26 b(and)h(the)h(pro)5 b(jection)27
+b(plane.)83 4202 y Fg(\017)41 b Fp(h_field)k Fg(!)j(h)p
+Fo(num)6 b Fg(i)p Fu(:)77 b(horizon)n(tal)46 b(\014eld)i(of)f(view)166
+4301 y(\(default:)38 b(100)26 b(degrees\))83 4421 y Fg(\017)41
+b Fp(v_field)33 b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)53
+b(v)n(ertical)34 b(\014eld)i(of)g(view)f(\(de-)166 4520
+y(fault:)i(70)27 b(degrees\))83 4640 y Fg(\017)41 b Fp(Obs_phi)26
+b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)39 b(angle)29 b Fn(\036)g
+Fu(for)f(the)h(orien)n(tation)166 4739 y(of)f(the)g(observ)n(er;)83
+4859 y Fg(\017)41 b Fp(Obs_theta)30 b Fg(!)j(h)p Fo(num)6
+b Fg(i)p Fu(:)49 b(angle)32 b Fn(\022)k Fu(for)d(the)h(orien)n(ta-)166
+4958 y(tion)28 b(of)f(the)h(observ)n(er;)83 5078 y Fg(\017)41
+b Fp(Obs_psi)25 b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)38
+b(angle)27 b Fn( )k Fu(for)c(the)h(orien)n(tation)166
+5177 y(of)g(the)g(observ)n(er;)83 5297 y Fg(\017)41 b
+Fp(drawing_scale)24 b Fg(!)29 b(h)p Fo(num)6 b Fg(i)p
+Fu(:)39 b(scale)28 b(factor)g(applied)166 5396 y(for)f(dra)n(wing;)2100
+100 y Fg(\017)41 b Fp(filled_faces)24 b Fg(!)29 b(h)p
+Fo(b)l(o)l(ol)9 b Fg(i)p Fu(:)40 b(if)c Fp(true)p Fu(,)27
+b(the)i(faces)g(are)2183 199 y(dra)n(wn)19 b(\014lled;)k(if)j
+Fp(false)p Fu(,)20 b(only)f(the)h(edges)f(are)f(dra)n(wn,)2183
+299 y(and)28 b(hidden)g(edges)f(are)f(dra)n(wn)h(dashed;)2100
+406 y Fg(\017)41 b Fp(draw_contours)17 b Fg(!)22 b(h)p
+Fo(b)l(o)l(ol)9 b Fg(i)p Fu(:)35 b(if)29 b Fp(true)p
+Fu(,)22 b(the)g(con)n(tours)2183 505 y(of)51 b(the)h(faces)e(are)g(dra)
+n(wn,)56 b(and)51 b(the)g(lines)g(ha)n(v)n(e)2183 605
+y(the)e(thic)n(kness)f Fp(contour_width)p Fu(;)53 b(if)j
+Fp(false)p Fu(,)51 b(the)2183 705 y(con)n(tours)27 b(are)f(not)i(dra)n
+(wn;)2100 811 y Fg(\017)41 b Fp(contour_width)27 b Fg(!)32
+b(h)p Fo(num)6 b Fg(i)p Fu(:)45 b(dimension)32 b(used)g(for)2183
+911 y(dra)n(wing)27 b(con)n(tours)f(of)h(faces)g(\(default:)38
+b(1pt\).)2017 1077 y Fs(Constan)m(ts)65 b Fu(These)50
+b(v)-5 b(alues)50 b(represen)n(t)f(constan)n(t)h(ob-)2017
+1177 y(jects)37 b(suc)n(h)g(as)f(reference)g(v)n(ectors,)h(and)g
+(should)f(not)h(b)r(e)2017 1276 y(c)n(hanged.)2100 1396
+y Fg(\017)k Fp(vect_null)24 b Fg(!)k(h)p Fo(avn)6 b Fg(i)p
+Fu(:)38 b(in)n(ternal)27 b(index)h(for)3624 1378 y Fn(~)3630
+1396 y Fu(0.)2100 1503 y Fg(\017)41 b Fp(vect_I)26 b
+Fg(!)h(h)p Fo(avn)6 b Fg(i)p Fu(:)39 b(in)n(ternal)27
+b(index)g(for)16 b Fn(~)-31 b({)p Fu(.)2100 1609 y Fg(\017)41
+b Fp(vect_J)26 b Fg(!)h(h)p Fo(avn)6 b Fg(i)p Fu(:)39
+b(in)n(ternal)27 b(index)g(for)c Fn(~)-38 b(|)p Fu(.)2100
+1727 y Fg(\017)41 b Fp(vect_K)26 b Fg(!)h(h)p Fo(avn)6
+b Fg(i)p Fu(:)39 b(in)n(ternal)27 b(index)g(for)3495
+1705 y Fn(~)3499 1727 y(k)s Fu(.)2100 1834 y Fg(\017)41
+b Fp(point_null)24 b Fg(!)k(h)p Fo(apn)6 b Fg(i)p Fu(:)38
+b(in)n(ternal)27 b(index)h(for)3671 1816 y Fn(~)3678
+1834 y Fu(0)o(.)2100 1940 y Fg(\017)41 b Fp(Obs)20 b
+Fg(!)i(h)p Fo(apn)6 b Fg(i)p Fu(:)35 b(observ)n(er's)19
+b(in)n(ternal)h(p)r(oin)n(t)i(n)n(um)n(b)r(er.)2017 2106
+y Fs(De\014ning)32 b(new)f(ob)5 b(ject)33 b(p)s(oin)m(ts)e(and)h(faces)
+2100 2226 y Fg(\017)41 b Fp(new_obj_points\()p Fg(h)p
+Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(num)6 b Fg(i)p Fp(\))p
+Fu(:)30 b(de\014nes)24 b(p)r(oin)n(ts)2183 2326 y(1)f(to)g
+Fg(h)p Fo(num)6 b Fg(i)24 b Fu(in)f(ob)5 b(ject)23 b
+Fg(h)p Fo(obj)12 b Fg(i)p Fu(;)27 b(m)n(ust)c(b)r(e)h(used)f(b)r(efore)
+2183 2425 y(setting)28 b(the)g(p)r(oin)n(ts;)2100 2532
+y Fg(\017)41 b Fp(new_obj_faces\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(num)6 b Fg(i)p Fp(\))p Fu(:)52
+b(de\014nes)37 b Fg(h)p Fo(num)6 b Fg(i)2183 2632 y Fu(faces)31
+b(in)h(ob)5 b(ject)31 b Fg(h)p Fo(obj)12 b Fg(i)p Fu(;)35
+b(m)n(ust)d(b)r(e)f(used)h(b)r(efore)f(set-)2183 2731
+y(ting)d(the)g(faces;)2017 2897 y Fs(O\013sets)2100 3017
+y Fg(\017)41 b Fp(pnt\()p Fg(h)p Fo(lpn)6 b Fg(i)p Fp(\))19
+b Fg(!)h(h)p Fo(apn)6 b Fg(i)p Fu(:)34 b(returns)19 b(the)h(absolute)e
+(p)r(oin)n(t)2183 3117 y(n)n(um)n(b)r(er)28 b(for)f(a)g(giv)n(en)g(lo)r
+(cal)g(p)r(oin)n(t)h(index.)2100 3224 y Fg(\017)41 b
+Fp(face\()p Fg(h)p Fo(lfn)6 b Fg(i)p Fp(\))26 b Fg(!)g(h)p
+Fo(afn)6 b Fg(i)p Fu(:)38 b(returns)26 b(the)h(absolute)f(face)2183
+3323 y(n)n(um)n(b)r(er)i(for)f(a)g(giv)n(en)g(lo)r(cal)g(face)g(index.)
+2017 3489 y Fs(Standard)34 b(classes)60 b Fu(Fiv)n(e)47
+b(standard)f(classes)g(are)g(de-)2017 3589 y(\014ned)22
+b(in)g Fp(poly.mp)p Fu(:)31 b(they)22 b(de\014ne)g(the)g(\014v)n(e)f
+(regular)f(con)n(v)n(ex)2017 3689 y(p)r(olyhedra.)84
+b(F)-7 b(or)42 b(eac)n(h)h(class)f Fg(h)p Fo(class)7
+b Fg(i)p Fu(,)49 b(there)43 b(are)f(t)n(w)n(o)2017 3788
+y(macros:)2100 3908 y Fg(\017)f Fp(set_)p Fg(h)p Fo(class)7
+b Fg(i)p Fp(_points)25 b Fu(\(e.g.)36 b Fp(set_cube_points)p
+Fu(\))2100 4015 y Fg(\017)41 b Fp(def_)p Fg(h)p Fo(class)7
+b Fg(i)28 b Fu(\(e.g.)36 b Fp(def_cube)p Fu(\))2183 4134
+y(Eac)n(h)25 b(of)g(these)h(macros)e(is)h(de\014ned)h(with)g(a)f
+(parame-)2017 4234 y(ter)j(whic)n(h)f(is)h(the)g(instance)f(name.)2017
+4400 y Fs(Standard)34 b(animations)56 b Fu(The)44 b Fp(3d)f
+Fu(pac)n(k)-5 b(age)42 b(pro)n(vides)2017 4500 y(a)36
+b(few)h(standard)e(animations)h(using)f(the)i(con)n(v)n(ex)e(p)r(oly-)
+2017 4599 y(hedra.)74 b(In)40 b(eac)n(h)g(of)g(these)g(animations,)i
+(the)f(observ)n(er)2017 4699 y(follo)n(ws)c(a)g(circular)e(path)j
+(pictured)f(in)h(\014gure)e(7.)66 b(Eac)n(h)2017 4799
+y(standard)22 b(animation)h(is)g(divided)g(in)n(to)g(t)n(w)n(o)f
+(macros.)33 b(The)2017 4898 y(\014rst,)c(suc)n(h)f(as)g
+Fp(animate_object)p Fu(,)c(de\014nes)k(the)h(class\(es\))2017
+4998 y(that)23 b(are)e(used)h(and)g(sets)g(the)g(ob)5
+b(jects.)35 b(The)22 b(second,)h(suc)n(h)2017 5098 y(as)f
+Fp(one_image)p Fu(,)e(sets)h(the)i(observ)n(er,)e(dra)n(ws)g(the)h(ob)5
+b(ject\(s\))2017 5197 y(and)46 b(mo)n(v)n(es)e(the)h(ob)5
+b(ject\(s\))46 b(and)f(the)h(observ)n(er.)87 b(The)2017
+5297 y(\014le)38 b Fp(animpoly.mp)32 b Fu(giv)n(es)k(examples)g(of)h
+(the)g(use)g(of)g(the)2017 5396 y(standard)27 b(animations.)p
+eop
+%%Page: 283 10
+283 9 bop 1942 6017 2 100 v 0 6019 300 2 v 1643 6019
+V 1943 6019 V 3585 6019 V 0 -579 V 1643 -579 V 1943 -579
+V 3585 -579 V 1942 -478 2 102 v 0 -149 a Fu(TUGb)r(oat,)28
+b(V)-7 b(olume)28 b(18)e(\(1997\),)h(No.)g(4)2471 b(283)1047
+1450 y @beginspecial -93 @llx -51 @lly 122 @urx 121 @ury
+2150 @rwi @setspecial
+%%BeginDocument: vect-fig.17
+%!PS
+%%BoundingBox: -93 -51 122 121
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 6b:8007d
+%%EndProlog
+%%Page: 1 1
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 50.07999 62.92972 moveto
+36.41684 62.92972 22.81273 61.40129 9.35458 59.05609 curveto
+-5.27846 56.50616 -19.72882 52.99411 -33.87776 48.4729 curveto
+-45.68634 44.69954 -57.29236 40.2167 -68.03217 34.01608 curveto
+-74.78679 30.1163 -83.48495 27.2732 -83.95775 19.55927 curveto
+-84.22949 15.12558 -81.22559 11.34346 -77.38675 8.97607 curveto
+-69.35762 4.02454 -59.47366 5.10245 -50.07999 5.10245 curveto
+-36.41684 5.10245 -22.81273 6.63087 -9.35458 8.97607 curveto
+5.27846 11.526 19.72882 15.03806 33.87776 19.55927 curveto
+45.68634 23.33263 57.29236 27.81546 68.03217 34.01608 curveto
+74.78679 37.91586 83.48495 40.75897 83.95775 48.4729 curveto
+84.22949 52.90659 81.22559 56.6887 77.38675 59.05609 curveto
+69.35762 64.00763 59.47366 62.92972 50.07999 62.92972 curveto stroke
+ [] 0 setdash
+newpath 54.01132 63.66803 moveto
+52.697 63.41296 51.38556 63.15993 50.07999 62.92972 curveto
+51.38556 62.69951 52.70445 62.48877 54.02676 62.27893 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-25.04 -14.45682 lineto stroke
+newpath -21.97597 -11.88579 moveto
+-25.04 -14.45682 lineto
+-21.28142 -13.08879 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+34.01608 0 lineto stroke
+newpath 30.07712 -0.69453 moveto
+34.01608 0 lineto
+30.07712 0.69453 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 34.01608 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.69453 30.07712 moveto
+0 34.01608 lineto
+-0.69453 30.07712 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+-83.46582 -48.18889 lineto stroke
+newpath -80.40158 -45.61774 moveto
+-83.46582 -48.18889 lineto
+-79.707 -46.8208 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.3985 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+-92.15971 -50.33365 moveto
+(x) cmmi10 9.96265 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+-2.53566 116.3858 moveto
+(z) cmmi10 9.96265 fshow
+-24.3139 -23.67451 moveto
+(~) cmmi10 9.96265 fshow
+-22.94 -23.67451 moveto
+({) cmmi10 9.96265 fshow
+31.58937 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+32.10307 -10.1177 moveto
+(|) cmmi10 9.96265 fshow
+-9.007 31.77168 moveto
+(~) cmmi10 9.96265 fshow
+-8.5002 29.14268 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1324 1657 a Fs(Figure)32 b(7)p Fu(:)k(Motion)28
+b(of)f(the)h(observ)n(er)0 1923 y Fs(App)s(endix)j(B)0
+2022 y(Co)s(ding)g(an)h(ob)5 b(ject)0 2155 y Fu(In)25
+b(order)f(to)i(extend)f(the)h Fp(3d)e Fu(pac)n(k)-5 b(age,)25
+b(it)g(is)h(necessary)d(to)0 2255 y(understand)f(ho)n(w)f(the)h(ob)5
+b(jects)22 b(are)f(co)r(ded.)35 b(W)-7 b(e)22 b(giv)n(e)g(here)0
+2354 y(an)h(o)n(v)n(erview)f(of)h(this)h(co)r(ding,)g(but)g(the)f
+(reader)f(is)i(advised)0 2454 y(to)f(p)r(eek)g(in)g(the)g(co)r(de)g(to)
+g(get)f(a)h(b)r(etter)g(understanding)f(on)0 2554 y(ho)n(w)27
+b(all)g(the)h(functions)g(in)n(teract.)166 2653 y(First,)23
+b(an)f(ob)5 b(ject)21 b(has)h(a)f(name,)i(for)e(instance)h
+Fp("box")p Fu(.)0 2753 y(The)41 b(macro)f Fp(box_class)e
+Fu(\(whic)n(h)k(can)f(b)r(e)h(called)f(with)0 2853 y
+Fp(obj_class_\("box")o(\))p Fu(\))21 b(is)27 b(the)h(string)e(corresp)r
+(onding)f(to)0 2952 y(the)20 b(class)e(of)h Fp("box")p
+Fu(,)g(for)g(instance)g Fp("cube")p Fu(.)32 b(The)19
+b(v)-5 b(ariable)0 3052 y Fp(cube_point_offse)o(tbo)o(x)p
+Fu(,)29 b(of)k(t)n(yp)r(e)g Fp(numeric)p Fu(,)g(and)g(ob-)0
+3151 y(tained)40 b(with)h Fp(obj_point_offset)o(_\(")o(bo)o(x")o(\))p
+Fu(,)d(is)i(equal)0 3251 y(to)35 b(the)h(absolute)f(index)h(of)f(the)h
+(last)g(p)r(oin)n(t)f(of)h(the)g(pre-)0 3351 y(vious)d(ob)5
+b(ject.)55 b(A)33 b(cub)r(e)h(is)g(de\014ned)g(with)g(8)22
+b(+)g(1)33 b(p)r(oin)n(ts.)0 3450 y(Assuming)22 b(it)g(w)n(as)e
+(de\014ned)j(after)e(an)g(icosahedron)f(\(12)7 b(+)g(1)0
+3550 y(p)r(oin)n(ts\))33 b(named)f Fp("ico")p Fu(,)g
+Fp(cube_point_offset)o(box)26 b Fu(will)0 3650 y(b)r(e)40
+b(a)e Fp(numeric)f Fu(equal)h(to)h(13.)71 b Fp(cube_pointsbox)33
+b Fu(\(ob-)0 3749 y(tained)26 b(with)g Fp(obj_points_\("bo)o(x"\))o
+Fu(\))20 b(is)25 b(a)g(macro)g(equal)0 3849 y(to)36 b(9.)60
+b(The)36 b(v)-5 b(ariable)35 b Fp(cube_face_offset)o(bo)o(x)p
+Fu(,)d(similar)0 3948 y(to)e Fp(cube_point_offset)o(box)o
+Fu(,)c(obtained)k(with)h(a)f(call)g(to)0 4048 y Fp(obj_face_offset_)o
+(\("b)o(ox)o("\))o Fu(,)e(equals)j(20.)49 b(The)32 b(macro)0
+4148 y Fp(cube_facesbox)26 b Fu(\(obtained)32 b(b)n(y)f
+Fp(obj_faces_\("box")o(\))p Fu(\))0 4247 y(is)c(equal)h(to)f(6.)166
+4347 y(The)35 b Fp(obj_name)d Fu(macro)i(is)g(extended)i(eac)n(h)e
+(time)h(a)0 4447 y(new)29 b(ob)5 b(ject)29 b(is)f(de\014ned.)41
+b(T)-7 b(o)29 b(an)f(absolute)h(face)f(n)n(um)n(b)r(er,)0
+4546 y(it)34 b(asso)r(ciates)e(an)h(ob)5 b(ject)34 b(name.)54
+b(Hence,)36 b(it)e(is)f(p)r(ossible)0 4646 y(to)g(go)g(through)g(all)g
+(faces.)54 b Fp(last_point_offse)o(t_)27 b Fu(and)0 4745
+y Fp(last_face_offset)o(_)12 b Fu(are)18 b(the)h(absolute)e(n)n(um)n(b)
+r(ers)h(of)h(the)0 4845 y(last)27 b(p)r(oin)n(ts)h(and)f(faces)g
+(de\014ned)h(up)g(to)g(no)n(w.)0 4998 y Fp(def)42 b(obj_name\(expr)d
+(i\)=)87 5098 y(if)k(i<1:)f(elseif)f(i<=20:"ico")436
+5197 y(elseif)g(i<=26:"box")87 5297 y(fi;)0 5396 y(enddef;)2183
+1923 y(pnt\(i\))22 b Fu(giv)n(es)h(the)i(absolute)f(v)n(ector)e
+(corresp)r(onding)2017 2022 y(to)42 b(lo)r(cal)g(p)r(oin)n(t)g
+Fn(i)p Fu(.)80 b Fp(ipnt_\(i\))39 b Fu(is)j(the)h(absolute)e(p)r(oin)n
+(t)2017 2122 y(n)n(um)n(b)r(er,)28 b(that)g(is)f Fn(i)g
+Fu(plus)h(the)g(n)n(um)n(b)r(er)f(of)h(p)r(oin)n(ts)f(de\014ned)2017
+2222 y(b)r(eforehand)46 b(in)g(other)f(ob)5 b(jects.)92
+b Fp(points_[j])41 b Fu(is)46 b(the)2017 2321 y(absolute)i(v)n(ector)f
+(corresp)r(onding)g(to)h(absolute)g(ob)5 b(ject)2017
+2421 y(p)r(oin)n(t)45 b Fn(j)5 b Fu(.)87 b(Similarly)-7
+b(,)48 b Fp(face\(i\))42 b Fu(is)i(the)h(absolute)f(face)2017
+2520 y(corresp)r(onding)26 b(to)i(lo)r(cal)f(face)g Fn(i)p
+Fu(.)2183 2620 y(The)38 b(list)f(of)g(v)n(ertices)f(of)h(absolute)f
+(face)h(n)n(um)n(b)r(er)g Fn(i)2017 2720 y Fu(is)45 b
+Fp(face_points_[i])o Fu(.)82 b(The)44 b(color)f(of)h(absolute)g(face)
+2017 2819 y(n)n(um)n(b)r(er)28 b Fn(i)f Fu(is)h Fp(face_color_[i])p
+Fu(.)2183 2919 y(When)k(the)g(macros)e Fp(pnt)g Fu(or)h
+Fp(face)f Fu(are)g(to)i(b)r(e)f(used,)2017 3019 y(the)36
+b(calls)e Fp(define_current_p)o(oi)o(nt_)o(of)o(fse)o(t_)o(\(")o(box)o
+("\))2017 3118 y Fu(and)j Fp(define_current_fa)o(ce)o(_of)o(fs)o(et_)o
+(\(")o(bo)o(x"\))30 b Fu(m)n(ust)2017 3218 y(b)r(e)e(issued.)2613
+3378 y Fc(\005)39 b Fb(Denis)26 b(Ro)r(egel)2690 3469
+y(CRIN)f(\(Cen)n(tre)g(de)h(Rec)n(herc)n(he)f(en)2790
+3560 y(Informatique)g(de)h(Nancy\))2690 3652 y(B^)-38
+b(atimen)n(t)26 b(LORIA)2690 3743 y(BP)g(239)2690 3834
+y(54506)h(V)-6 b(and\033uvre-l)n(\022)-36 b(es-Nancy)2690
+3926 y(FRANCE)2690 4017 y Fa(roegel@loria.fr)2690 4108
+y Fk(URL)p Fb(:)38 b Fa(http://www.loria.fr/)2790 4200
+y(~roegel)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/tb57roegel.ltx b/graphics/metapost/contrib/macros/mp3d/doc/tb57roegel.ltx
new file mode 100644
index 0000000000..9ff0153aea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/tb57roegel.ltx
@@ -0,0 +1,1149 @@
+% D. Roegel, 25/2/1997 : first draft
+% 26/2/1997
+% 23/4/1997 : appendix, types added
+% 24/4/1997 : better formatting of appendix
+% 25/4/1997 : two columns
+% 27/4/1997 : some improvements
+% 28/4/1997 : changes to take new syntax into account
+% 30/4/1997 : cleaning and additions
+% 1/5/1997 : ltugboat macros
+% addition of appendix b
+% all overfull hboxes removed; this needed a lot
+% of rephrasing!
+% lots of cleaning
+% 2/5/1997 : extension of future part
+% 12/5/1997 : several small improvements to take Ulrik Vieth's
+% comments into account.
+% 17/5/1997 : some corrections to take modifications in
+% the source code into account
+% 18/5/1997 : commas in the syntax have been put in \texttt
+% some renamings in order to get rid of the overfull
+% hboxes resulting from the comma changes ...
+% 29/5/1997 : some renamings of ``object'' into ``obj'' to
+% be in accordance with the code (version 0.993)
+% some reformatting of pieces of code with respect
+% to the indentation
+% 19/6/1997 : - the `future' part has been corrected with respect
+% to the general algorithm for drawing the faces
+% (thanks to Dominique Larchey)
+% - reference to the ``LaTeX Graphics Companion''
+% 11/2/1998 : - description of draw_contours and contour_width
+% - acknowledgment of Denis Barbier and Boguslaw
+% Jackowski
+% - one_image changed to an_image at the beginning
+% of the paper, in order to avoid being misleading
+% by comparison with the real one_image macro
+% - a few more lines describing the parameters of
+% one_image
+% - ghostscript -> Ghostscript
+% - footnote added to explain why Ghostscript
+% has not been used to generate the excerpts
+% of the images.
+% - some lines to explain why the color type
+% was not used for 3d vectors
+% 12/2/1998 : - rewording to avoid overfull hboxes
+% 19/2/1998 : - minor ``english'' editing (RF)
+% and file sent to author for review (mb)
+% 04/03/1998: - EM fonts removed/ not to be used this issue
+% 04/08/1998: - TUB-specific inputs modified for portability to
+% CTAN archives (mb)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\documentclass[nonumber,harvardcite]{ltugboat}
+\usepackage{mflogo}
+
+\usepackage{url}
+\usepackage[dvips]{graphicx}
+
+\newcommand{\AVN}{\meta{avn}}
+\newcommand{\LVN}{\meta{lvn}}
+\newcommand{\APN}{\meta{apn}}
+\newcommand{\LPN}{\meta{lpn}}
+\newcommand{\AFN}{\meta{afn}}
+\newcommand{\LFN}{\meta{lfn}}
+\newcommand{\CN}{\meta{cl}}
+\newcommand{\IN}{\meta{obj}}
+\newcommand{\VL}{\meta{vl}}
+\newcommand{\VSL}{\meta{vsl}}
+\newcommand{\HEXCOL}{\meta{hc}}
+\newcommand{\COL}{\meta{col}}
+\newcommand{\STR}{\meta{str}}
+\newcommand{\PAIR}{\meta{pair}}
+\newcommand{\NUM}{\meta{num}}
+\newcommand{\BOOL}{\meta{bool}}
+
+\newcommand{\tc}{\texttt{,}}
+
+\newenvironment{todo}{\begin{bfseries}}{\end{bfseries}}
+
+%% this command is already defined in ltugboat.cls and is more robust
+%% I think....
+%\newcommand\meta[1]{$\langle$\mbox{\textit{#1}}$\rangle$}
+%%% the following is the ltugboat.cls definition
+%\DeclareRobustCommand\meta[1]{%
+% \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+
+\let\m=\meta % <-- this command is never used.
+
+%%%%%TUGboat production-specific files
+\vol 18, 4. % volume, issue.
+\issueseqno=57 % sequential issue number
+\issdate December 1997. % month, year of publication
+\setcounter{page}{274}
+\NoBlackBoxes
+\PrelimDraftfalse
+
+\widowpenalty=10000
+\clubpenalty=10000
+\renewcommand{\topfraction}{0.9}
+\renewcommand{\bottomfraction}{0.5}
+\renewcommand{\floatpagefraction}{0.8}
+\renewcommand{\textfraction}{0.1}
+\setcounter{bottomnumber}{2}
+\setcounter{totalnumber}{4}
+\renewcommand{\dbltopfraction}{0.9}
+\renewcommand{\dblfloatpagefraction}{0.8}
+\pretolerance=500
+\tolerance=1000
+\hbadness=3000
+\vbadness=3000
+\hyphenpenalty=400
+%%%%%%%END of TUGboat production-specific files
+
+\begin{document}
+
+\sectitle{Graphics Applications}
+
+\title{Creating 3D animations with \MP}
+\author{Denis Roegel}
+\address{CRIN (Centre de Recherche en Informatique de Nancy)\\
+ B\^atiment LORIA\\
+ BP 239\\
+ 54506 Vand\oe uvre-l\`es-Nancy\\
+ FRANCE}
+\netaddress{roegel@loria.fr}
+\personalURL{http://www.loria.fr/~roegel}
+
+
+
+\maketitle
+
+\begin{abstract}
+\MP{} can be used to create animations. We show here an example
+of animation of polyhedra, introducing the \texttt{3d} package.
+\end{abstract}
+
+\section{Introduction}
+
+%%%RF 1998/02/19: N-forms of cite
+\MP{} (\citeN{hobby1992}; see also the description in
+\shortciteN{Goossens:LGC97})
+is a drawing language very similar to \MF,
+but whose output is \PS. \MP{} is especially suited for geometrical
+and technical drawings, where a drawing can naturally be decomposed
+in several parts, related in some logical way.
+%%%RF 1998/02/19: active voice for passive
+Knuth is using \MP{} for the revisions of and additions to
+\emph{The Art Of Computer Programming}~\cite{knuth1997},
+and it is or will be a component of every standard \TeX{} distribution.
+
+Unfortunately, \MP{} is still quite bare and the user is only offered
+%%%RF 1998/02/19: revamped a bit
+the raw power\Dash a little bit like the \TeX{} user who only has
+plain \TeX{} at his/her disposal. The lack of libraries is certainly
+due to the infancy of \MP{} (which came in the public domain at the
+beginning of 1995) and thus to the small number of its users.
+
+In this paper, we present a way to produce animations using \MP.
+The technique is quite general and we illustrate it through the \texttt{3d}
+package.
+
+\section{Animations}
+
+The World Wide Web has accustomed us to various animations,
+especially \texttt{java} animations.
+Common components of web pages are animated GIF images.
+
+Producing animations in \MP{} is actually quite easy. A number of
+$n$ images will be computed and their sequence produces the animation.
+The animation will be similar to a movie, with no interaction. More precisely,
+if \verb|an_image(|$i$\verb|)|
+produces a picture parameterized by $i$,
+it suffices to wrap this macro
+between \verb|beginfig| and \verb|endfig|:
+
+\begin{verbatim}
+def one_image_out(expr i)=
+ beginfig(<figure number>);
+ an_image(i);
+ endfig;
+enddef;
+\end{verbatim}
+
+\noindent and to loop over \verb|one_image_out|:
+
+\begin{verbatim}
+for j:=1 upto 100:one_image_out(j);endfor;
+\end{verbatim}
+
+Assuming that \verb|<figure number>|
+is equal to the parameter of \verb|an_image|,
+the compilation of this program will produce
+a hundred files with extensions \verb|.1|, \verb|.2|, \ldots, \verb|.100|.
+All these files are \PS{} files and all we need to do is to find a way
+to collate them in one piece. How to do this depends on the operating
+system. On UNIX for instance, one can use \texttt{Ghostscript}
+to transform a \PS{} file
+into \texttt{ppm} and then transform each \texttt{ppm} file into
+GIF with \texttt{ppmtogif}. These programs are part of the
+\texttt{NETPBM} package~\cite{netpbm}. Finally, a program such as
+\texttt{gifmerge}~\cite{gifmerge}
+creates an animated GIF file (GIF89A)
+out of the hundred individual simple GIFs.
+However, various details must be taken care of. For instance,
+%%%RF 1998/02/19: reorganised around `grabbed'->`needed'
+only a part of \texttt{Ghostscript}'s output is needed
+and selection can be made with \texttt{pnmcut}.
+%(which is also part of \texttt{NETPBM}).
+
+The whole process of creating an animation out of \MP's outputs can
+be summed up in a shell script, similar to the one
+in figure~\ref{animation-script}. As we will see, this script (including
+the arguments of \texttt{awk} and \texttt{pnmcut}) can be generated
+automatically by \MP{} itself.
+
+%%fig 1
+\begin{figure*}
+\begin{verbatim}
+#! /bin/sh
+
+/bin/rm -f animpoly.log
+for i in `ls animpoly.*| grep 'animpoly.[0-9]'`;do
+echo $i
+echo '=============='
+# shift each picture so that it lies in the page:
+awk < $i '{print} /^%%Page: /{print "172 153 translate\n"}' > $i.ps
+# produce ppm format:
+gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE -r36 -sOutputFile=$i.ppm -q -- $i.ps
+/bin/rm -f $i.ps
+# produce gif:
+ppmquant 32 $i.ppm | pnmcut 15 99 141 307 | ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif
+/bin/rm -f $i.ppm
+done
+/bin/rm -f animpoly.gif
+# merge the gif files:
+gifmerge -10 -l1000 animpoly.*.gif > animpoly.gif
+/bin/rm -f animpoly.*.gif
+\end{verbatim}
+\caption{Script created by \MP{} (with some additional comments)}
+\label{animation-script}
+\end{figure*}
+
+
+\section{Objects in space}
+
+\subsection{Introduction}
+
+The author applied this idea to the animation of objects
+in space. The macros in the \texttt{3d.mp} package\footnote{On CTAN,
+under \texttt{graphics/metapost/macros/3d}. The code is documented
+with \texttt{MFT}~\cite{knuth1989}
+and illustrated with \MP. This paper describes version 1.0 of the macros.}
+provide a basis for the
+representation of three-dimensional objects. The basic components of
+the objects are the points or the vectors. Both are stored as triplets.
+More precisely, we have three
+arrays\footnote{\MP{} has a few simple types such as \texttt{numeric},
+\texttt{boolean}, \texttt{string}, \texttt{path}, \ldots.
+It also has pairs (\texttt{pair}) and triples (\texttt{color}). We might
+have cheated and stored points as colors, but instead, we found it
+interesting to illustrate a construction equivalent
+to \textsc{Pascal}'s records or C's structures. In \MP, instead of
+having a list or an array of structures, we use several lists or arrays,
+so that a record is a cross-section over several arrays.}
+of type \verb|numeric|:
+
+\begin{verbatim}
+numeric vect[]x,vect[]y,vect[]z;
+\end{verbatim}
+
+Vector $i$'s components are \verb|vect[|$i$\verb|]x|, \verb|vect[|$i$\verb|]y|
+and \verb|vect[|$i$\verb|]z|. It is then straightforward to define the usual
+operations on vectors using this convention. For instance,
+vector addition is defined as:
+
+\begin{verbatim}
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+\end{verbatim}
+
+Often, we need some scratch vectors or vectors local to a macro.
+A simple vector allocation mechanism solves the problem: we use a stack
+of vectors and we reserve and free vectors only on top of the stack.
+For instance, the allocation of a vector is defined by:
+
+\begin{verbatim}
+def new_vect=incr(last_vect_) enddef;
+\end{verbatim}
+
+\noindent where \verb|last_vect_| is the index of the top of the stack.
+Hence, a vector is manipulated by its index on the stack.
+Writing \verb|v:=new_vect;| lets \verb|v| be the index of the newly allocated
+vector.
+
+Freeing a vector is also easy and is only allowed at the top of the stack:
+
+\begin{verbatim}
+def free_vect(expr i)=
+ if i=last_vect_:
+ last_vect_:=last_vect_-1;
+ else: errmessage("Vector " &
+ decimal i & " can't be freed!");
+ fi;
+enddef;
+\end{verbatim}
+
+How these macros are used is made explicit in the \verb|vect_rotate| macro
+which does a rotation of a vector \verb|v| around a vector \verb|axis|
+by an angle \verb|alpha|. This rotation is illustrated
+in figure~\ref{vector-rotation}.
+$\vec{v}$ is written as the sum of $\vec{h}$ and $\vec{a}$ where
+$\vec{h} \perp \vec{a}$. If $\vec{b}$ is
+$\overrightarrow{axis}/{\|\overrightarrow{axis}\|}$, $\vec{c}$ is computed
+as the vector product of $\vec{b}$ and $\vec{a}$ and $\vec{a}$ is then
+rotated in a simple way resulting in $\vec{f}$.
+
+The vectors declared with \verb|new_vect| are freed in the inverse order.
+The \verb|vect_rotate| macro makes use of a few other macros:
+\verb|vect_mod| computes the modulus of a vector; \verb|vect_dprod(a,b)| is
+the dot product of vectors \texttt{a} and \texttt{b}; \verb|vect_mult(b,a,x)|
+lets vector \texttt{b} equal vector \texttt{a} multiplied by the scalar
+\texttt{x}; \verb|vect_sum| and \verb|vect_diff| compute as their first
+argument the sum or the difference of the two other vectors;
+\verb|vect_prod(c,a,b)| lets vector \texttt{c} equal the vectorial
+product of vectors \texttt{a} and \texttt{b}. These macros are
+described in appendix A.
+
+%% fig2
+\begin{figure*}
+\begin{center}
+\includegraphics{vect-fig.9}\hspace{1cm}\includegraphics{vect-fig.10}
+\end{center}
+\caption{Vector rotation}\label{vector-rotation}
+\end{figure*}
+
+\begin{verbatim}
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;v_d:=new_vect;
+ v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v));
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);
+ free_vect(v_d);free_vect(v_c);
+ free_vect(v_b);free_vect(v_a);
+enddef;
+\end{verbatim}
+
+The \verb|3d| package defines other macros in order to set the observer,
+%%%RF 1998/02/19: was `to manipulate'
+to compute a reference matrix, etc. Provision is given for
+manipulating objects.
+
+\subsection{Objects and classes}
+
+The \texttt{3d} package understands a notion of \emph{class}.
+A \emph{class} is a parameterized object. For instance, we have the class
+of regular tetrahedra, the class of regular cubes, etc. Our classes
+%%%RF 1998/02/19: `first level of genericity'->... abstraction
+are the lowest level of abstraction and classes can not be composed.
+They can only be \emph{instanciated}. When we need a specific tetrahedron,
+we call a generic function to create a tetrahedron, but with an identifier
+specific to one instance.
+
+A class is a set of vertices in space, together with a way to draw
+faces, and therefore edges.
+The author's focus was to manipulate (and later animate) polyhedra.
+As an example, the \verb|poly.mp| package provides the definition of
+each of the five regular convex polyhedra.
+
+%%%RF 1998/02/19: `is defining'->defines, etc, `both macros'->`each macro'
+Each class consists of two macros: one defines the points,
+the other calls the first macro and defines the faces.
+Each macro has a parameter which is a string identifying
+the particular instance of that class.
+
+\tolerance=4500
+The points of a regular tetrahedron are defined in
+\verb|set_tetrahedron_points|,
+%%%RF 1998/02/19: second half sentence rewritten
+an example of the general macro name \verb|set_|\meta{class}\verb|_points|.
+Five points are defined, four of
+them with \verb|set_obj_point|, a macro which defines points \emph{local}
+to an object. The first four points are the vertices and the fifth
+is the center of the tetrahedron. \verb|set_obj_point|'s first parameter
+is the point number and the other three are the cartesian coordinates.
+The first three points are in a plane and the fourth is obtained with
+the \verb|new_face_point| macro, which folds a face
+%%%RF 1998/02/19: tagged reference sentence on to end in parens
+(see the description in appendix A for more details).
+The \verb|new_face_point| macro
+is used with the angle \verb|an| which is computed in advance.
+Once the four points are set, the object is normalized, which means
+that it is centered with respect to the list of vertices given
+as parameter (here \verb|1,2,3,4|) and the last vertex is put on a sphere
+of radius 1, centered on the origin. Therefore, point 5 is the center
+of the tetrahedron, and the tetrahedron is set symmetrically
+with respect to the origin.
+
+\tolerance=1000
+%%%RF 1998/02/19: was `are hence inscriptible'
+All five convex regular polyhedra are defined in this way and may
+therefore be inscribed in a sphere of radius 1.
+
+\begin{verbatim}
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ sinan=1/sqrt(3);
+ cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);
+enddef;
+\end{verbatim}
+
+The second macro, \verb|def_tetrahedron| defines the number of points and
+faces of the instance, calls the previous macro and defines the faces
+with the macro \verb|set_obj_face|.
+The first argument of that macro is a \emph{local}
+face number, the second is a list of vertices such that the list goes clockwise
+when the face is visible. The last argument is the color of the face in RGB.
+
+\begin{verbatim}
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);
+ new_obj_faces(inst,4);
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+\end{verbatim}
+
+The result of the drawing is:
+
+\begin{center}
+\includegraphics{tetra.ps}
+\end{center}
+
+A more complex example is the icosahedron which is defined below.
+
+\begin{verbatim}
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ cosan=1-8/3*cosd(36)*cosd(36);
+ sinan=sqrt(1-cosan*cosan);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ % 1 and 10 are opposite vertices
+ normalize_obj(inst)(1,10);
+ % center of icosahedron
+ set_obj_point(13,0,0,0);
+enddef;
+\end{verbatim}
+
+\begin{verbatim}
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);
+ new_obj_faces(inst,20);
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+\end{verbatim}
+
+Since all points of the objects are stored in a unique global array,
+they are internally
+accessed by the local numbers and an offset defined by the
+macro \verb|new_obj_points|.
+The icosahedron example shows a systematic use of the
+\verb|new_face_point| macro to compute a point on an adjacent face.
+Displaying such an icosahedron results in the figure~\ref{icosahedron}.
+%% fig3
+\begin{figure}[h]
+\begin{center}
+\includegraphics{icosa.ps}
+\end{center}
+\caption{An icosahedron}\label{icosahedron}
+\end{figure}
+
+The other three regular convex polyhedra are:
+\begin{center}
+\includegraphics{cube.ps}
+\end{center}
+
+\begin{center}
+\includegraphics{octa.ps}\hfill\includegraphics{dodeca.ps}
+\end{center}
+
+The dodecahedron code is a bit special, since the vertices are built
+using ten additional points corresponding to face centers. These points
+are defined as an array of variables \verb|fc1| through \verb|fc10|
+with \verb|new_points(fc)(10)|.
+\verb|free_points(fc)(10)| frees them when they are no longer
+necessary. An excerpt of the dodecahedron code is:
+
+\begin{verbatim}
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);
+ set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);
+ rotate_in_plane(3,fc1,1,2);
+ ...
+ free_points(fc)(10);
+enddef;
+\end{verbatim}
+
+
+Finally, wire drawings can be obtained by setting the boolean
+\verb|filled_faces| to false:
+
+\begin{center}
+\includegraphics{icosa-w.ps}
+\end{center}
+
+\subsection{Animating objects}
+
+The animation of one or several objects involves the object(s) and an observer.
+The animation is a set of images and from an image to the next one,
+the observer as well as the objects can move. For instance
+the macro \verb|one_image| in \verb|3d.mp| is:
+
+\begin{verbatim}
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,
+ -rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ % fix point 1 of object |name|
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ % show the rotation point
+ draw_point(name,1);
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+\end{verbatim}
+
+The parameters of this macro are a name of an object (\verb|name|),
+an image index (\verb|i|), and three values defining the position
+of the observer.
+The observer (\verb|Obs| is a global point and set with \verb|set_point|,
+not with \verb|set_obj_point|)
+follows a circle of radius \verb|rd|.
+%%%RF 1998/02/19: reversed `usually is'
+The parameter \verb|a|, which is usually a function of \verb|i|,
+determines the number of rotation steps
+of the observer, each step being a rotation of angle \verb|ang|.
+The distance between the observer and the
+projection plane is $2$ (see figure~\ref{proj-screen}).
+
+%% fig4
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.8}
+\end{center}
+\caption{Projection on the screen}\label{proj-screen}
+\end{figure*}
+
+%% fig5
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.16}
+\end{center}
+\caption{Orientation of the observer}\label{obs-orientation}
+\end{figure*}
+
+
+The orientation of the observer is defined by three angles
+(see figure~\ref{obs-orientation}). The \verb|Obs_phi| angle
+is given and the two others are computed with a call to
+\verb|point_of_view_obj(name,1,Obs_phi)| which constrains the observer
+to look towards point 1 of object \verb|name|. Therefore, this
+point will seem fixed on the animation and \verb|draw_point(name,1)|
+draws it later so that this feature can be observed.
+There is nothing special about that point, except that it
+remains fix when the object is rotated. The object is drawn
+with \verb|draw_obj(name)| and
+%%%RF 1998/02/19: `does rotate'->rotates -- these arguments aren't
+%%% described here, which seems wrong, but i don't think
+%%% it's easy to do better....
+\verb|rotate_obj_pv| rotates the object \verb|name|
+by \verb|ang| degrees around an axis going through point 1
+and directed by vector \verb|vect_I| ($\vec{\imath}$).
+The reference vectors ($\vec\imath$,
+$\vec\jmath$ and $\vec k$) are drawn in red, green and blue with
+\verb|draw_axes|.
+
+Finally, a complete animation of an icosahedron is obtained
+with
+
+\begin{verbatim}
+animate_object("icosahedron",1,100,100);
+\end{verbatim}
+
+%%%RF 1998/02/19: `and this'->`which'
+\noindent which generates files \verb|anim.101|,
+%%%RF 1998/02/19: `if ... is'->`from ...'
+\ldots, \verb|anim.200| from the main file \verb|anim.mp|.
+The first parameter of \verb|animate_object| is the name of the object
+to animate, the second and third parameters are minimal and maximal
+values of the index loop and the fourth parameter is an offset added
+to the index loop in order to get the file extension, which must lie
+in the interval $0..4096$.
+
+After each image is drawn, the values of the current bounding box
+are used to compute the bounding box of the sequence of images.
+The internal values \verb|xmin_|, \verb|ymin_|, \verb|xmax_|
+and \verb|ymax_| hold the minimal and maximal values of the coordinates
+of the past images' corners.
+They are updated just before each image is shipped out.
+
+\subsection{Putting the pieces together}
+
+Once all the views have been computed, they can be used separately
+(see for instance the five views of figure~\ref{anim-five-views})
+or more interestingly, they can be merged.
+This task is made almost straightforward by \MP{} itself.
+Indeed, every time \verb|animate_object| is used, a shell script
+named \verb|create_animation.sh|
+is generated, as a side-effect of a call to
+\verb|show_animation_bbox|. The script is
+similar to that shown in figure~\ref{animation-script}.
+This script uses the values
+computed for the global bounding box of the sequence of images,
+for these values are necessary in order to extract the right parts
+of the images and get correct alignments; the parts are extracted
+with \texttt{pnmcut}.\footnote{One might think of using
+\texttt{Ghostscript} for generating an excerpt of an image,
+but if \texttt{Ghostscript} is used to generate the bounding box
+of an image, it will in general not be possible to have a good alignment
+between all images. The sizes of the excerpts are only known when all images
+have been produced.}
+If you have the programs
+used in this script (\texttt{Ghostscript}, etc.), you can just run
+it with \verb|sh create_animation.sh| on UNIX. You may need
+to adapt it to your needs, and for that purpose, you can modify the macro
+\verb|write_script| in \verb|3d.mp|.
+
+Some examples are included in the \verb|3d| distribution, and they
+can be viewed for instance with \texttt{netscape} or
+special programs such as \verb|xanim|.
+
+%% fig6
+\begin{figure*}
+\includegraphics[scale=0.5]{anim.1}\hfill
+\includegraphics[scale=0.5]{anim.2}\hfill
+\includegraphics[scale=0.5]{anim.3}\hfill
+\includegraphics[scale=0.5]{anim.4}\hfill
+\includegraphics[scale=0.5]{anim.5}
+
+\caption{Five views of an animation}\label{anim-five-views}
+\end{figure*}
+
+\section{Future}
+
+It is quite easy to improve and extend the \verb|3d| macros but the
+author decided to go no further for the moment. Other objects can
+be implemented easily and new algorithms can be added. For instance
+in order to take light sources or shadows into account, one can compute
+the angles under which a face gets its light, and the angle under which
+this very face is seen, in order to decide how much darker or lighter
+it must be rendered. Another problem is to represent
+overlapping objects correctly. In the current implementation, each
+object is drawn
+independently from the other objects, so that the overlapping may be wrong.
+One solution is to sort all the faces according to their distance
+to the observer and, if two faces can not be ordered, to split them.
+Then, the faces can be drawn starting with the most distant, and
+ending with the closest one.
+Appendix B explains the internal representation of the objects and
+shows that this algorithm can be implemented without much surgery to
+the present code.
+
+\section{Acknowledgments}
+
+Thanks to John Hobby who always answers all my queries on the \MF{} mailing
+list. Thanks to Alain Filbois who helped me with the shell script
+syntax, to Thomas Lambolais and Thomas Genet who gave some feedback
+on this work, and to Dominique Larchey who pointed out a shortcoming
+in the conclusion. Thanks to Denis Barbier who
+was one of the first users of these
+macros and contributed the animated crayons in the distribution. Thanks to
+Bogus\l aw Jackowski who made valuable comments on some peculiarities of
+the code.
+And finally, special thanks to Ulrik Vieth who not only
+pushed me to polish my code and this paper more than I had first intended,
+but also made it possible to use \MP{} under \texttt{web2c}.
+
+\bibliography{paper}
+
+\appendix
+
+\section{Appendix A\\
+Summary of the \texttt{3d} package}
+
+\subsection{Types}
+
+The commands in the \texttt{3d} package take parameters
+of several different types. The types are described here.
+
+\begin{itemize}
+\item An \AVN{} (\emph{Absolute Vector Number}) is the internal
+number identifying a vector in the \verb|vect| array (an integer).
+\item An \APN{} (\emph{Absolute Point Number}) refers to a vector
+in the same way as an \AVN{} (an integer).
+\item A \LPN{} (\emph{Local Point Number}) is a number identifying a
+point \emph{within} an object (an integer). Two \LPN{}s with the same value
+can correspond to different points in different objects.
+\item An \AFN{} (\emph{Absolute Face Number}) is the internal
+number identifying a face.
+\item A \LFN{} (\emph{Local Face Number}) is a number identifying a face
+\emph{within} an object (an integer). As for points, two \LFN{}s with
+the same value
+can correspond to different faces in different objects.
+\item A \CN{} (\emph{Class}) is a string representing a class,
+for instance \verb|"tetrahedron"|. It may only contain
+letters and underscores.
+\item An \IN{} (\emph{Object}) is a string representing an object, that is
+an instance of a class. Such a string may only contain
+letters and underscores.
+\item A \VL{} (\emph{Vertex List}) is a list
+of integers, where each integer identifies a vertex. For instance, \verb|1,7|
+is the list of vertices 1 and 7.
+\item A \VSL{} (\emph{Vertex String List}) is a string corresponding to a list
+of integers, where each integer identifies a vertex. For instance,
+\verb|"1,2,6,5"| is the list of vertices 1, 2, 6 and 5.
+\item \HEXCOL{} (\emph{Hex Color}) is a string representing a color with
+the three RGB components in hexadecimal and in the range
+$0..255$. For instance, \verb|"b4fe40"|.
+\item \COL{} (\emph{Color}) is a standard \MP{} color
+(a triplet of RGB components in the range $0..1$),
+such as \verb|red|.
+\item \STR{} (\emph{String}) is a string.
+\item \PAIR{} (\emph{Pair}) is a pair of numerics.
+\item \NUM{} (\emph{Numeric}) is a number.
+\item \BOOL{} (\emph{Boolean}) is a boolean.
+\end{itemize}
+
+\subsection{Low level vector commands}
+
+The low level vector commands define the classical operations in vector
+algebra.
+
+\begin{itemize}
+%\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|; defines vector \AVN{}
+\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|: defines vector \AVN{}
+as $(x,y,z)$;
+
+%\item \verb|set_point|: synonym of \verb|vect_def|; a point is stored in the
+\item \verb|set_point|; synonym of \verb|vect_def|: a point is stored in the
+same array as vectors.
+
+%\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|;
+\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|:
+this defines the point \LPN{} as $(x,y,z)$;
+
+%\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|;
+\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+vector \AVN$_1$ becomes equal to vector \AVN$_2$;
+
+\item \verb|vect_sum(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$ becomes the sum of vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_translate(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+add vector \AVN$_2$
+to vector \AVN$_1$; vector \AVN$_2$ remains unchanged.
+
+\item \verb|vect_diff(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the difference between vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_dprod(|\AVN$_1$\tc\AVN$_2$\verb|)| $\rightarrow $ \NUM{}:
+returns the dot product of vectors \AVN$_1$ and \AVN$_2$.
+
+\item \verb|vect_mod(|\AVN\verb|)| $\rightarrow $ \NUM{}: returns the
+modulus of vector \AVN.
+
+\item \verb|vect_prod(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the vector product of vectors \AVN$_2$ and \AVN$_3$.
+
+\tolerance=1000
+\item \verb|vect_mult(|\AVN$_1$\tc\AVN$_2$\tc\NUM\verb|)|: \AVN$_1$
+becomes vector \AVN$_2$ scaled by \NUM.
+
+\item \verb|mid_point(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+vector (or point) \AVN$_1$ becomes the mid-point of vectors (or of the
+line joining the points)
+\AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_rotate(|\AVN$_1$\tc\AVN$_2$\tc$a$\verb|)|: vector \AVN$_1$ is
+rotated around vector \AVN$_2$ by the angle $a$.
+\end{itemize}
+
+\tolerance=1000
+\subsection{Operations on objects}
+
+Several operations apply globally on objects:
+
+\begin{itemize}
+\item \verb|assign_obj(|\IN\tc\CN\verb|)|:
+ create \IN{} as an instance of class \CN.
+\item \verb|reset_obj(|\IN\verb|)|: put \IN{} back where it
+ was just after it was initialized.
+\item \verb|put_obj(|\IN\tc\AVN\tc$s$\tc$\psi$\tc$\theta$\tc$\phi$\verb|)|:
+ object \IN{} is scaled by $s$, shifted by vector \AVN{} and
+ oriented with the angles $\psi$, $\theta$, $\phi$,
+ as for the observer orientation (figure~\ref{obs-orientation}).
+\item \verb|rotate_obj_pv(|\IN\tc\LPN\tc\AVN\tc$a$\verb|)|:
+ object \IN{} is rotated
+ around an axis going through local point \LPN{}
+ and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_abs_pv(|\IN\tc\APN\tc\AVN\tc$a$\verb|)|:\break
+ the object \IN{} is rotated around an axis going through absolute
+ point \APN{} and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_pp(|\IN\tc\LPN$_1$\tc\LPN$_2$\tc$a$\verb|)|:
+ \IN{} is rotated around an axis going through local points
+ \LPN$_1$ and \LPN$_2$; the rotation is by $a$ degrees.
+\item \verb|translate_obj(|\IN\tc\AVN\verb|)|: object \IN{} is translated
+ by vector \AVN.
+\item \verb|scale_obj(|\IN\tc$v$\verb|)|: object~\IN{}~is~scaled~by~$v$.
+\end{itemize}
+
+\subsection{Building new points in space}
+
+Three macros are especially useful for the definition of regular polyhedra:
+
+\begin{itemize}
+\item \verb|rotate_in_plane(|$k$\tc$o$\tc$i$\tc$j$\verb|)|:
+get point $k$ from point $j$ by rotation
+around point $o$ by an angle $\alpha$ equal to the angle from $i$ to $j$;
+$i$, $j$ and $k$ are of type \LPN, whereas $o$ is of type \APN.
+
+\begin{center}
+ \includegraphics{vect-fig.11}
+\end{center}
+
+\item \verb|new_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+the middle $m$ of points $i$ and $j$ is such that
+$\widehat{(\overrightarrow{om},\overrightarrow{mc})}=\alpha$
+and $\overrightarrow{mc}$ is $\overrightarrow{om}$ rotated around
+$\overrightarrow{ji}$. $c$, $o$, $i$ and $j$ are of type \LPN.
+
+\begin{center}
+ \includegraphics{vect-fig.7}
+\end{center}
+
+\item \verb|new_abs_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+similar to the previous definition, but $c$ and $o$ are of type \APN.
+
+\end{itemize}
+
+\subsection{Drawing points, axes, objects}
+
+\begin{itemize}
+\item \verb|draw_point(|\IN\tc\LPN\verb|)|: draw point \LPN{} in
+ object \IN.
+\item \verb|draw_axes(|\COL$_1$\tc\COL$_2$\tc\COL$_3$\verb|)|:
+ draw vectors $\vec\imath$, $\vec\jmath$ and $\vec{k}$ in colors
+ \COL$_1$, \COL$_2$ and \COL$_3$.
+\item \verb|draw_obj(|\IN\verb|)|: draw object \IN.
+\end{itemize}
+
+\subsection{Setting faces}
+
+\begin{itemize}
+\item \verb|set_face(|\AFN\tc\VSL\tc\HEXCOL\verb|)|:
+set absolute face \AFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+\item \verb|set_obj_face(|\LFN\tc\VSL\tc\HEXCOL\verb|)|:
+set local face \LFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+
+\end{itemize}
+
+\break
+
+\subsection{View points, distance}
+
+\begin{itemize}
+\item \verb|compute_reference(|$\psi$\tc$\theta$\tc$\phi$\verb|)|: defines
+the orientation of the observer by the three angles $\psi$,
+$\theta$ and $\phi$. See figure~\ref{obs-orientation}.
+
+\item \verb|point_of_view_obj(|\IN\tc\LPN\tc$\phi$\verb|)|: the orientation
+of the observer is defined as looking local point \LPN{} of object \IN,
+with an angle of $\phi$;
+\item \verb|point_of_view_abs(|\APN\tc$\phi$\verb|)|: the observer's
+orientation is defined as looking absolute point \APN{},
+with an angle of $\phi$;
+\item \verb|obs_distance(|$v$\verb|)(|\IN\tc\LPN\verb|)|: let $v$ equal
+the distance between the observer and local point \LPN{} in object \IN{}.
+\end{itemize}
+
+\subsection{Vector and point allocation}
+
+\begin{itemize}
+\item \verb|new_vect|$\rightarrow $ \AVN{}: return a new vector;
+\item \verb|new_point|: synonym of \verb|new_vect|;
+\item \verb|new_points(|$v$\verb|)(|$n$\verb|)|: defines the absolute points
+ $v_1, \ldots, v_n$, using \verb|new_point|;
+\item \verb|free_vect(|\AVN\verb|)|: free vector \AVN;
+\item \verb|free_point(|\APN\verb|)|: free point \APN;
+\item \verb|free_points(|$v$\verb|)(|$n$\verb|)|: frees the absolute points
+ $v_1, \ldots, v_n$, using \verb|free_point|.
+\end{itemize}
+
+\subsection{Debugging}
+
+\begin{itemize}
+\item \verb|show_vect(|\STR\tc\AVN\verb|)|:
+shows vector \AVN, with string \STR.
+\item \verb|show_point|: synonym of \verb|show_vect|
+\item \verb|show_pair(|\STR\tc\PAIR\verb|)|: this shows a numeric pair,
+ with string \STR.
+\end{itemize}
+
+\subsection{Normalization}
+
+\begin{itemize}
+\item \verb|normalize_obj(|\IN\tc\VL\verb|)|: normalize object \IN{}
+with respect to the list of vertices \VL.
+\end{itemize}
+
+\subsection{Parameters}
+
+\begin{itemize}
+\item \verb|Obs_dist| $\rightarrow$ \NUM: distance between the observer
+ and the projection plane.
+\item \verb|h_field| $\rightarrow$ \NUM: horizontal field of view
+ (default: 100 degrees)
+\item \verb|v_field| $\rightarrow$ \NUM: vertical field of view
+ (default: 70 degrees)
+\item \verb|Obs_phi| $\rightarrow$ \NUM: angle $\phi$ for the orientation
+ of the observer;
+\item \verb|Obs_theta| $\rightarrow$ \NUM: angle $\theta$ for the orientation
+ of the observer;
+\item \verb|Obs_psi| $\rightarrow$ \NUM: angle $\psi$ for the orientation
+ of the observer;
+\item \verb|drawing_scale| $\rightarrow$ \NUM: scale factor applied for
+ drawing;
+\item \verb|filled_faces| $\rightarrow$ \BOOL: if \texttt{true}, the faces
+ are drawn filled; if \texttt{false}, only the edges are drawn,
+ and hidden edges are drawn dashed;
+\item \verb|draw_contours| $\rightarrow$ \BOOL: if \texttt{true}, the contours
+ of the faces are drawn, and the lines have the thickness
+ \verb|contour_width|; if \texttt{false}, the contours are not drawn;
+\item \verb|contour_width| $\rightarrow$ \NUM: dimension used for drawing
+ contours of faces (default: 1pt).
+\end{itemize}
+
+\subsection{Constants}
+
+These values represent constant objects such
+as reference vectors, and should not be changed.
+
+\begin{itemize}
+\item \verb|vect_null| $\rightarrow$ \AVN: internal index for $\vec0$.
+\item \verb|vect_I| $\rightarrow$ \AVN: internal index for $\vec\imath$.
+\item \verb|vect_J| $\rightarrow$ \AVN: internal index for $\vec\jmath$.
+\item \verb|vect_K| $\rightarrow$ \AVN: internal index for $\vec k$.
+\item \verb|point_null| $\rightarrow$ \APN: internal index for $\vec0$.
+\item \verb|Obs| $\rightarrow$ \APN: observer's internal point number.
+\end{itemize}
+
+\subsection{Defining new object points and faces}
+
+\begin{itemize}
+\item \verb|new_obj_points(|\IN\tc\NUM\verb|)|:
+ defines points $1$ to \NUM{} in object \IN; must be used before setting
+ the points;
+\item \verb|new_obj_faces(|\IN\tc\NUM\verb|)|:
+ defines \NUM{} faces in object \IN; must be used before setting
+ the faces;
+\end{itemize}
+
+\subsection{Offsets}
+
+\begin{itemize}
+\item \verb|pnt(|\LPN\verb|)| $\rightarrow$ \APN: returns the absolute point
+number for a given local point index.
+\item \verb|face(|\LFN\verb|)| $\rightarrow$ \AFN: returns the absolute face
+number for a given local face index.
+\end{itemize}
+
+\subsection{Standard classes}
+
+Five standard classes are defined in \texttt{poly.mp}:
+they define the five regular convex polyhedra. For each class \meta{class},
+there are two macros:
+
+\begin{itemize}
+
+\item \verb|set_|\meta{class}\verb|_points|
+ (e.g. \verb|set_cube_points|)
+
+\item \verb|def_|\meta{class} (e.g. \verb|def_cube|)
+
+\end{itemize}
+
+Each of these macros is defined with a parameter which is the instance
+name.
+
+\subsection{Standard animations}
+
+The \texttt{3d} package provides a few standard animations using
+the convex polyhedra. In each of these animations, the observer
+follows a circular path pictured in figure~\ref{observer-motion}.
+Each standard animation is divided into two macros. The first,
+such as \verb|animate_object|, defines the class(es) that are used
+and sets the objects. The second, such as \verb|one_image|, sets
+the observer, draws the object(s) and moves the object(s) and the
+observer. The file \verb|animpoly.mp| gives examples of the use
+of the standard animations.
+
+\iffalse
+\begin{itemize}
+\item \verb|one_image(name,i,a)|
+\item \verb|one_image_two_objects(name_a,name_b,i,a)|
+\item \verb|one_image_three_objects(name_a,name_b,name_c,i,a)|
+\item \verb|one_image_two_identical_objects(name_a,name_b,i,a)|
+\item \verb|animate_object(name,imin,imax,index)|
+\item \verb|animate_two_objects(name_a,name_b,imin,imax,index)|
+\item \verb|animate_three_objects(name_a,name_b,name_c,imin,imax,index)|
+\item \verb|animate_two_identical_objects(name,imin,imax,index)|
+\end{itemize}
+\fi
+
+%% fig7
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.17}
+\end{center}
+\caption{Motion of the observer}\label{observer-motion}
+\end{figure*}
+
+\section{Appendix B\\
+Coding an object}
+
+In order to extend the \texttt{3d} package, it is necessary to
+understand how the objects are coded. We give here an overview of
+this coding, but the reader is advised to peek in the code to get
+a better understanding on how all the functions interact.
+
+First, an object has a name, for instance \verb|"box"|.
+The macro \verb|box_class| (which can be called with \verb|obj_class_("box")|)
+is the string corresponding to the class of
+\verb|"box"|, for instance \verb|"cube"|.
+The variable \verb|cube_point_offsetbox|, of type \texttt{numeric},
+and obtained with \verb|obj_point_offset_("box")|,
+is equal to the absolute index of the last
+point of the previous object. A cube is defined with $8+1$ points. Assuming
+it was defined after an icosahedron ($12+1$ points) named
+\verb|"ico"|, \verb|cube_point_offsetbox| will be a \verb|numeric|
+equal to $13$. \verb|cube_pointsbox|
+(obtained with \verb|obj_points_("box")|)
+is a macro equal to $9$.
+%(\verb|current_point_offset_| is equal to \verb|cube_point_offsetbox|.)
+The variable \verb|cube_face_offsetbox|,
+similar to \verb|cube_point_offsetbox|,
+obtained with a call to \verb|obj_face_offset_("box")|,
+equals $20$.
+The macro \verb|cube_facesbox|
+(obtained by \verb|obj_faces_("box")|)
+is equal to $6$.
+%(\verb|current_face_offset_| is equal to \verb|cube_face_offsetbox|.)
+
+The \verb|obj_name| macro is extended each time a new object is defined.
+To an absolute face number, it associates an object name. Hence, it is possible
+to go through all faces. \verb|last_point_offset_| and
+\verb|last_face_offset_| are the absolute numbers of the last points and faces
+defined up to now.
+
+\begin{verbatim}
+def obj_name(expr i)=
+ if i<1: elseif i<=20:"ico"
+ elseif i<=26:"box"
+ fi;
+enddef;
+\end{verbatim}
+
+\verb|pnt(i)| gives the absolute vector corresponding to local point $i$.
+\verb|ipnt_(i)| is the absolute point number, that is $i$ plus the number
+of points defined beforehand in other objects.
+\verb|points_[j]| is the absolute vector corresponding to absolute object
+point $j$. Similarly, \verb|face(i)|
+is the absolute face corresponding to local face $i$.
+
+The list of vertices of absolute face number $i$ is \verb|face_points_[i]|.
+The color of absolute face number $i$ is \verb|face_color_[i]|.
+
+
+When the macros \verb|pnt| or \verb|face| are to be used, the calls
+\verb|define_current_point_offset_("box")| and
+\verb|define_current_face_offset_("box")| must be issued.
+
+
+\makesignature
+
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/mp3d/doc/tugboat-geometry-space.pdf b/graphics/metapost/contrib/macros/mp3d/doc/tugboat-geometry-space.pdf
new file mode 100644
index 0000000000..bf7e2d0fff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/doc/tugboat-geometry-space.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube10.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube10.mp
new file mode 100644
index 0000000000..f84f156c46
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube10.mp
@@ -0,0 +1,88 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+% Oblique projections of the cube
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+new_plane_(horizontal_plane)(point_null,vec_I,vec_J);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_line(3,7);draw_lines(8,7,5);
+ draw_line(2,6);draw_line(4,8);
+ draw_lines(5,6,8);draw_lines(4,3);draw_lines(2,4);
+ drawoptions(dashed evenly);
+ draw_lines(1,2);draw_lines(3,1);draw_line(1,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+point_of_view_obj("cube",8,Obs_phi);
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CAVALIER,30,50); % 30
+
+beginfig(100);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CABINET,30,20); % 30
+
+beginfig(101);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,20,20); % 20
+
+beginfig(102);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+new_point(hp);
+set_point_(hp)(0,1,1);
+
+set_plane_(horizontal_plane)(hp,vec_I,vec_K);
+% such a plane and a second angle of 90 degrees produces a
+% ``planometric'' view.
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,90,20); % 20
+
+vardef draw_C(expr inst)=
+ draw_lines(8,7);draw_line(3,7);draw_lines(7,5);
+ draw_lines(1,2);draw_lines(3,1);
+ draw_line(1,5);
+ draw_lines(4,3);draw_lines(2,4);draw_line(4,8);
+ drawoptions(dashed evenly);
+ draw_lines(5,6);
+ draw_line(2,6);draw_lines(6,8);
+ drawoptions();
+enddef;
+
+beginfig(103);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube4-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube4-eng.mp
new file mode 100644
index 0000000000..69944ad25b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube4-eng.mp
@@ -0,0 +1,124 @@
+verbatimtex
+%&latex
+\documentclass{article}
+
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=20cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,21); % 21 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+
+ % corners of the projection plane
+ %set_point(9)(12.92993,12.37372,6.83334);
+ %set_point(10)(15.68588,8.48413,6.8334);
+ %set_point(11)(16.27899,8.90436,4.12851);
+ %set_point(12)(13.52304,12.79395,4.12845);
+
+ %set_point(9)(13.76718,11.50638,6.15714);
+ %set_point(10)(15.14517,9.56158,6.15717);
+ %set_point(11)(15.44174,9.7717,4.80472);
+ %set_point(12)(14.06375,11.71649,4.80469);
+
+ set_point(9)(0.80682,2.27571,1.939);
+ set_point(10)(2.03946,0.2357,1.93903);
+ set_point(11)(2.46796,0.49461,0.63113);
+ set_point(12)(1.23532,2.53462,0.6311);
+
+ % shown observator
+ set_point(13)(3.23608,2.35114,2);
+
+ % intersections with the projection plane
+ new_plane(pl)(9,10,11);
+ new_line(l)(1,13);
+ if not def_inter_p_l_pl(14)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(2,13);
+ if not def_inter_p_l_pl(15)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(3,13);
+ if not def_inter_p_l_pl(16)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(4,13);
+ if not def_inter_p_l_pl(17)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(5,13);
+ if not def_inter_p_l_pl(18)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(6,13);
+ if not def_inter_p_l_pl(19)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(7,13);
+ if not def_inter_p_l_pl(20)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(8,13);
+ if not def_inter_p_l_pl(21)(l)(pl):
+ message "PROBLEM ";
+ fi;
+
+ free_line(l);
+ free_plane(pl);
+
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ draw_lines(9,10,11,12,9);
+ pickup pencircle scaled 2pt;
+ draw_line(13,13);draw_line(1,1);draw_line(2,2);draw_line(3,3);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw fullcircle scaled 6pt shifted z[ipnt_(8)];
+ label_obj.lft(btex \textit{Obs}$(3.23,2.35,2)$ etex,13);
+ label_obj.rt(btex $(0,0,0)$ etex,1);
+ label_obj.rt(btex $(0,0,1)$ etex,2);
+ label_obj.bot(btex $(0,1,0)$ etex,3);
+ label_obj.llft(btex $(1,1,0)$ etex,7);
+
+ drawoptions(dashed withdots);
+ draw_line(1,13);draw_line(2,13);draw_line(3,13);draw_line(4,13);
+ draw_line(5,13);draw_line(6,13);draw_line(7,13);draw_line(8,13);
+ drawoptions();
+ draw_line(14,15,17,16,14);draw_lines(18,19,21,20,18);
+ draw_line(14,18);draw_line(15,19);draw_line(16,20);draw_line(17,21);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=28 upto 28:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),4);
+ show_point("Obs",Obs);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",14,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube5.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube5.mp
new file mode 100644
index 0000000000..5f8bba41bb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube5.mp
@@ -0,0 +1,86 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,11); % 11 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field because we are very close
+h_field:=120; % degrees
+v_field:=120; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube6.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube6.mp
new file mode 100644
index 0000000000..2248d84806
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube6.mp
@@ -0,0 +1,94 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ if z[ipnt_(12)]=(10,10):draw_line(12,12);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);draw_line(12,12);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% on change le champ car on est très près
+h_field:=160; % degrees
+v_field:=160; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube7.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube7.mp
new file mode 100644
index 0000000000..886ca81ae1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube7.mp
@@ -0,0 +1,133 @@
+% The nine vanishing points of a cube
+% D. Roegel, 22 January 2001
+% Warning: this figure is very sensitive to small motions!
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=1cm;
+
+def draw_arrowline_extra(expr i,j)(expr exi,exj)=
+ drawarrow exi[z[ipnt_(i)],z[ipnt_(j)]]--exj[z[ipnt_(i)],z[ipnt_(j)]];
+enddef;
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ set_line(l)(5,3);
+ if not def_vanishing_point_p_l_pl(13)(l)(screen):
+ message "no vanishing point 5";
+ set_point(13)(0,0,0);
+ fi;
+ set_line(l)(5,8);
+ if not def_vanishing_point_p_l_pl(14)(l)(screen):
+ message "no vanishing point 6";
+ set_point(14)(0,0,0);
+ fi;
+ set_line(l)(6,7);
+ if not def_vanishing_point_p_l_pl(15)(l)(screen):
+ message "no vanishing point 7";
+ set_point(15)(0,0,0);
+ fi;
+ set_line(l)(5,2);
+ if not def_vanishing_point_p_l_pl(16)(l)(screen):
+ message "no vanishing point 8";
+ set_point(16)(0,0,0);
+ fi;
+ set_line(l)(6,1);
+ if not def_vanishing_point_p_l_pl(17)(l)(screen):
+ message "no vanishing point 9";
+ set_point(17)(0,0,0);
+ fi;
+
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ for i:=9 upto 17:
+ if z[ipnt_(i)]=(10,10):draw_line(i,i);
+ fi;
+ endfor;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ for i:=9 upto 17:draw_line(i,i);endfor;
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=5,6:draw_line(j,13);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=1,5:draw_line(j,14);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor blue);
+ for j:=2,6:draw_line(j,15);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=2,4:draw_line(j,16);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=6,8:draw_line(j,17);endfor;
+
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field, because we are very close
+h_field:=170; % degrees
+v_field:=170; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=96;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.7*cosd(3.6*i),1.8*sind(3.6*i),1.8);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube8.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube8.mp
new file mode 100644
index 0000000000..177313ca9d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube8.mp
@@ -0,0 +1,48 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+% oblique projections
+
+input 3danim
+output_res:=72;
+drawing_scale:=3cm;
+
+projection_type:=2;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=0 upto 20:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/cube9.mp b/graphics/metapost/contrib/macros/mp3d/examples/cube9.mp
new file mode 100644
index 0000000000..3004a063f0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/cube9.mp
@@ -0,0 +1,66 @@
+% Cube projections
+% D. Roegel 23 January 2001
+% roegel@loria.fr
+
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+projection_type:=1;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+%set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);
+ draw_line(2,6);draw_line(4,8);draw_line(1,5);
+ draw_lines(5,6,8);
+ drawoptions(dashed evenly);
+ draw_line(3,7);draw_lines(8,7,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+
+% Trimetric projection
+i:=67;
+beginfig(167);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+endfig;
+
+% Isometric projection
+isometric_projection(vec_I,vec_J,vec_K,pnt_obj("cube",8),Obs_dist,90);
+
+beginfig(168);
+ draw_obj("cube");
+endfig;
+
+% Dimetric projection
+dimetric_projection(vec_I,vec_J,vec_K,0.5,pnt_obj("cube",8),3*Obs_dist,90);
+
+beginfig(169);
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp1-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp1-eng.mp
new file mode 100644
index 0000000000..da12a8543f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp1-eng.mp
@@ -0,0 +1,75 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp1.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp1.mp
new file mode 100644
index 0000000000..6caaf5ad43
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp1.mp
@@ -0,0 +1,76 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp2-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp2-eng.mp
new file mode 100644
index 0000000000..870cb94af3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp2-eng.mp
@@ -0,0 +1,90 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp2.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp2.mp
new file mode 100644
index 0000000000..a05c21dfac
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp2.mp
@@ -0,0 +1,91 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp3-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp3-eng.mp
new file mode 100644
index 0000000000..d1da0745a2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp3-eng.mp
@@ -0,0 +1,98 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp3.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp3.mp
new file mode 100644
index 0000000000..db29e5a8c2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp3.mp
@@ -0,0 +1,99 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp4-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp4-eng.mp
new file mode 100644
index 0000000000..86e7beba68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp4-eng.mp
@@ -0,0 +1,112 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp4.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp4.mp
new file mode 100644
index 0000000000..0e24599c9b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp4.mp
@@ -0,0 +1,113 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp5-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp5-eng.mp
new file mode 100644
index 0000000000..f9858e207d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp5-eng.mp
@@ -0,0 +1,84 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp5.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp5.mp
new file mode 100644
index 0000000000..0f479b7527
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp5.mp
@@ -0,0 +1,85 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp6-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp6-eng.mp
new file mode 100644
index 0000000000..8e91ed33b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp6-eng.mp
@@ -0,0 +1,100 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp6.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp6.mp
new file mode 100644
index 0000000000..ed9365675c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp6.mp
@@ -0,0 +1,101 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp7-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp7-eng.mp
new file mode 100644
index 0000000000..569b2c9506
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp7-eng.mp
@@ -0,0 +1,102 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp7.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp7.mp
new file mode 100644
index 0000000000..d1d2b39d82
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp7.mp
@@ -0,0 +1,103 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp8-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp8-eng.mp
new file mode 100644
index 0000000000..dd4bc81fef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp8-eng.mp
@@ -0,0 +1,120 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp8.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp8.mp
new file mode 100644
index 0000000000..a3a4b11c36
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp8.mp
@@ -0,0 +1,121 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/gutmp9.mp b/graphics/metapost/contrib/macros/mp3d/examples/gutmp9.mp
new file mode 100644
index 0000000000..2b17d824be
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/gutmp9.mp
@@ -0,0 +1,63 @@
+% D. Roegel, 9 January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=15cm;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(1,0,0);
+ set_point(3)(1,1,0);
+ set_point(4)(0,1,0);
+ set_point(5)(0,0,1);
+ set_point(6)(1,0,1);
+ set_point(7)(1,1,1);
+ set_point(8)(0,1,1);
+ new_vec(v);
+ vec_diff_(v,pnt(1),pnt(4));
+ vec_sum_(pnt(9),pnt(1),v);
+ mid_point(10,1,2);
+ vec_sum_(pnt(11),pnt(2),v);
+ mid_point(12,7,8);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(2,3);
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);
+ draw_line(9,10);draw_line(10,11);draw_line(11,9);
+ draw_line(5,12);draw_line(12,6);draw_line(6,5);
+ drawoptions(dashed evenly);
+ draw_line(3,4);draw_line(4,1);draw_line(4,8);
+ draw_line(5,9);draw_line(10,12);draw_line(6,11);
+ drawoptions();
+ fill z[ipnt_(9)]--z[ipnt_(10)]--z[ipnt_(11)]--cycle withcolor 0.8white;
+ fill z[ipnt_(5)]--z[ipnt_(12)]--z[ipnt_(6)]--cycle withcolor 0.8white;
+ draw_equal_marks(1,4,2);
+ draw_equal_marks(1,5,2);
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 30:
+i=23;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(10*cosd(3.6*i-150),10*sind(3.6*i-150),3);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/monge-eng.mp b/graphics/metapost/contrib/macros/mp3d/examples/monge-eng.mp
new file mode 100644
index 0000000000..29fa032ad6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/monge-eng.mp
@@ -0,0 +1,148 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/examples/monge.mp b/graphics/metapost/contrib/macros/mp3d/examples/monge.mp
new file mode 100644
index 0000000000..55093df41a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/examples/monge.mp
@@ -0,0 +1,149 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/3d.mp b/graphics/metapost/contrib/macros/mp3d/inputs/3d.mp
new file mode 100644
index 0000000000..7335a384d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/3d.mp
@@ -0,0 +1,1259 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3D.MP: 3-DIMENSIONAL REPRESENTATIONS IN METAPOST}}
+
+%% version 1.34, 17 August 2003
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+%% This package provides definitions enabling the manipulation
+%% and animation of 3-dimensional objects.
+%% Such objects can be included in a \TeX{} file or used on web pages
+%% for instance. See the documentation enclosed in the distribution for
+%% more details.
+
+%% Thanks to John Hobby and Ulrik Vieth for helpful hints.
+
+%% PROJECTS FOR THE FUTURE:
+
+%% $-$ take light sources into account and show shadows and darker faces
+
+%% $-$ handle overlapping of objects ({\it obj\_name\/} can be used when
+%% going through all faces)
+
+if known three_d_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3d, v1.34 (c) D. Roegel, 17 August 2003 ***";
+numeric three_d_version;
+three_d_version=1.34;
+
+% This package needs |3dgeom| in a few places. |3dgeom| also loads |3d|
+% but that's not a problem.
+%
+input 3dgeom;
+
+%%\newpage
+%%\title{Vector operations}
+
+% components of vector |i|
+def xval(expr i)=vec[i]x enddef;
+def yval(expr i)=vec[i]y enddef;
+def zval(expr i)=vec[i]z enddef;
+
+% vector (or point) equality (absolute version)
+def vec_eq_(expr i,j)=
+ ((xval(i)=xval(j)) and (yval(i)=yval(j)) and (zval(i)=zval(j)))
+enddef;
+
+% vector (or point) equality (local version)
+def vec_eq(expr i,j)=vec_eq_(pnt(i),pnt(j)) enddef;
+
+% vector inequality (absolute version)
+def vec_neq_(expr i,j)=(not vec_eq_(i,j)) enddef;
+
+% vector inequality (local version)
+def vec_neq(expr i,j)=(not vec_eq(i,j)) enddef;
+
+% definition of vector |i| by its coordinates (absolute version)
+def vec_def_(expr i,xi,yi,zi)= vec[i]x:=xi;vec[i]y:=yi;vec[i]z:=zi; enddef;
+
+% definition of vector |i| by its coordinates (local version)
+def vec_def(expr i,xi,yi,zi)= vec_def_(pnt(i),xi,yi,zi) enddef;
+
+% a point is stored as a vector (absolute version)
+let set_point_ = vec_def_;
+
+% a point is stored as a vector (local version)
+let set_point = vec_def;
+
+def set_point_vec_(expr i,v)=
+ set_point_(i,xval(v),yval(v),zval(v))
+enddef;
+
+def set_point_vec(expr i,v)=set_point_vec_(pnt(i),v) enddef;
+
+let vec_def_vec_=set_point_vec_;
+let vec_def_vec=set_point_vec;
+
+% vector sum: |vec[k]| $\leftarrow$ |vec[i]|$+$|vec[j]| (absolute version)
+def vec_sum_(expr k,i,j)=
+ vec[k]x:=vec[i]x+vec[j]x;
+ vec[k]y:=vec[i]y+vec[j]y;
+ vec[k]z:=vec[i]z+vec[j]z;
+enddef;
+
+% vector sum: |vec[k]| $\leftarrow$ |vec[i]|$+$|vec[j]| (local version)
+def vec_sum(expr k,i,j)=vec_sum_(pnt(k),pnt(i),pnt(j)) enddef;
+
+% vector translation: |vec[i]| $\leftarrow$ |vec[i]|$+$|vec[v]|
+def vec_translate_(expr i,v)=vec_sum_(i,i,v) enddef;
+
+% Here, the second parameter is absolute, because this is probably
+% the most common case.
+def vec_translate(expr i,v)=vec_translate_(pnt(i),v) enddef;
+
+% vector difference: |vec[k]| $\leftarrow$ |vec[i]|$-$|vec[j]|
+def vec_diff_(expr k,i,j)=
+ vec[k]x:=vec[i]x-vec[j]x;
+ vec[k]y:=vec[i]y-vec[j]y;
+ vec[k]z:=vec[i]z-vec[j]z;
+enddef;
+
+def vec_diff(expr k,i,j)=vec_diff_(pnt(k),pnt(i),pnt(j)) enddef;
+
+% dot product of |vec[i]| and |vec[j]|
+vardef vec_dprod_(expr i,j)=
+ (vec[i]x*vec[j]x+vec[i]y*vec[j]y+vec[i]z*vec[j]z)
+enddef;
+
+vardef vec_dprod(expr i,j)=vec_dprod_(pnt(i),pnt(j)) enddef;
+
+% modulus of |vec[i]|, absolute version
+% In the computation, we try to avoid overflows or underflows;
+% we perform a scaling in order to avoid losing too much
+% information in certain cases
+vardef vec_mod_(expr i)=
+ save prod,m_;
+ hide(
+ new_vec(v_a);
+ m_=max(abs(xval(i)),abs(yval(i)),abs(zval(i)));
+ if m_>0:vec_mult_(v_a,i,1/m_);else:vec_def_vec_(v_a,vec_null);fi;
+ prod=m_*sqrt(vec_dprod_(v_a,v_a));
+ free_vec(v_a);
+ )
+ prod
+enddef;
+
+% modulus of |vec[i]|, local version
+% If the return value must be compared to 0,
+% use |vec_eq| with |vec_null| instead.
+vardef vec_mod(expr i)= vec_mod_(pnt(i)) enddef;
+
+% unit vector |vec[i]| corresponding to vector |vec[j]|
+% only non-null vectors are changed
+def vec_unit_(expr i,j)=
+ if vec_mod_(j)>0: vec_mult_(i,j,1/vec_mod_(j));
+ else:vec_def_vec_(i,j);
+ fi;
+enddef;
+
+def vec_unit(expr i,j)=vec_unit_(pnt(i),pnt(j)) enddef;
+
+% vector product: |vec[k]| $\leftarrow$ |vec[i]| $\land$ |vec[j]|
+def vec_prod_(expr k,i,j)=
+ vec[k]x:=vec[i]y*vec[j]z-vec[i]z*vec[j]y;
+ vec[k]y:=vec[i]z*vec[j]x-vec[i]x*vec[j]z;
+ vec[k]z:=vec[i]x*vec[j]y-vec[i]y*vec[j]x;
+enddef;
+
+def vec_prod(expr k,i,j)=vec_prod_(pnt(k),pnt(i),pnt(j)) enddef;
+
+% scalar multiplication: |vec[j]| $\leftarrow$ |vec[i]*v| (absolute version)
+def vec_mult_(expr j,i,v)=
+ vec[j]x:=v*vec[i]x;vec[j]y:=v*vec[i]y;vec[j]z:=v*vec[i]z;
+enddef;
+
+% scalar multiplication: |vec[j]| $\leftarrow$ |vec[i]*v| (local version)
+def vec_mult(expr j,i,v)=vec_mult_(pnt(j),pnt(i),v) enddef;
+
+% middle of two points (absolute version)
+def mid_point_(expr k,i,j)= vec_sum_(k,i,j);vec_mult_(k,k,.5); enddef;
+
+% middle of two points (local version)
+def mid_point(expr k,i,j)= mid_point_(pnt(k),pnt(i),pnt(j)); enddef;
+
+%%\newpage
+%%\title{Vector rotation}
+% Rotation of |vec[v]| around |vec[axis]| by an angle |alpha|
+
+%% The vector $\vec{v}$ is first projected on the axis
+%% giving vectors $\vec{a}$ and $\vec{h}$:
+%%\figure{vect-fig.9}
+%% If we set
+%% $\vec{b}={\ora{axis}\over \left\Vert\vcenter{\ora{axis}}\right\Vert}$,
+%% the rotated vector $\vec{v'}$ is equal to $\vec{h}+\vec{f}$
+%% where $\vec{f}=\cos\alpha \cdot \vec{a} + \sin\alpha\cdot \vec{c}$.
+%% and $\vec{h}=(\vec{v}\cdot\vec{b})\vec{b}$
+%%\figure{vect-fig.10}
+
+% The rotation is independent of |vec[axis]|'s module.
+% |v| = old and new vector
+% |axis| = rotation axis
+% |alpha| = rotation angle
+%
+vardef vec_rotate_(expr v,axis,alpha)=
+ new_vec(v_a);new_vec(v_b);new_vec(v_c);
+ new_vec(v_d);new_vec(v_e);new_vec(v_f);
+ new_vec(v_g);new_vec(v_h);
+ vec_mult_(v_b,axis,1/vec_mod_(axis));
+ vec_mult_(v_h,v_b,vec_dprod_(v_b,v)); % projection of |v| on |axis|
+ vec_diff_(v_a,v,v_h);
+ vec_prod_(v_c,v_b,v_a);
+ vec_mult_(v_d,v_a,cosd(alpha));
+ vec_mult_(v_e,v_c,sind(alpha));
+ vec_sum_(v_f,v_d,v_e);
+ vec_sum_(v,v_f,v_h);
+ free_vec(v_h);free_vec(v_g);
+ free_vec(v_f);free_vec(v_e);free_vec(v_d);
+ free_vec(v_c);free_vec(v_b);free_vec(v_a);
+enddef;
+
+% The second parameter is left absolute because this is probably the most
+% common case.
+vardef vec_rotate(expr v,axis,alpha)=vec_rotate_(pnt(v),axis,alpha) enddef;
+
+%%\newpage
+%%\title{Operations on objects}
+% |iname| is the handler for an instance of an object of class |name|
+% |iname| must be a letter string
+% |vardef| is not used because at some point we give other names
+% to |assign_obj| with |let| and this cannot be done with |vardef|.
+% (see MFbook for details)
+def assign_obj(expr iname,name)=
+ begingroup
+ save tmpdef;
+ string tmpdef; % we need to add double quotes (char 34)
+ tmpdef="def " & iname & "_class=" & ditto & name & ditto & " enddef";
+ scantokens tmpdef;
+ def_obj(iname);
+ endgroup
+enddef;
+
+% |name| is the the name of an object instance
+% It must be made only of letters (or underscores), but no digits.
+def def_obj(expr name)=
+ scantokens begingroup
+ save tmpdef;string tmpdef;
+ tmpdef="def_" & obj_class_(name) & "(" & ditto & name & ditto & ")";
+ tmpdef
+ endgroup
+enddef;
+
+% This macro puts an object back where it was right at the beginning,
+% or rather, where the |set| definition puts it (which may be different
+% than the initial position, in case it depends on parameters).
+% |iname| is the name of an object instance.
+vardef reset_obj(expr iname)=
+ save tmpdef;
+ string tmpdef;
+ define_current_point_offset_(iname);
+ tmpdef="set_" & obj_class_(iname) & "_points";
+ scantokens tmpdef(iname);
+enddef;
+
+% Put an object at position given by |pos| (a vector) and
+% with orientations given by angles |psi|, |theta|, |phi|.
+% The object is scaled by |scale|.
+% |iname| is the name of an object instance.
+% If the shape of the object has been changed since it was
+% created, these changes are lost.
+vardef put_obj(expr iname,pos,scale,psi,theta,phi)=
+ reset_obj(iname);scale_obj(iname,scale);
+ new_vec(v_x);new_vec(v_y);new_vec(v_z);
+ vec_def_vec_(v_x,vec_I);
+ vec_def_vec_(v_y,vec_J);
+ vec_def_vec_(v_z,vec_K);
+ rotate_obj_abs_pv(iname,point_null,v_z,psi);
+ vec_rotate_(v_x,v_z,psi);vec_rotate_(v_y,v_z,psi);
+ rotate_obj_abs_pv(iname,point_null,v_y,theta);
+ vec_rotate_(v_x,v_y,theta);vec_rotate_(v_z,v_y,theta);
+ rotate_obj_abs_pv(iname,point_null,v_x,phi);
+ vec_rotate_(v_y,v_x,phi);vec_rotate_(v_z,v_x,phi);
+ free_vec(v_z);free_vec(v_y);free_vec(v_x);
+ translate_obj(iname,pos);
+enddef;
+
+%%\newpage
+%%\title{Rotation, translation and scaling of objects}
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector |vec[v]|. The angle of rotation is |a|.
+vardef rotate_obj_pv(expr name,p,v,a)=
+ define_current_point_offset_(name);
+ rotate_obj_abs_pv(name,pnt(p),v,a);
+enddef;
+
+vardef rotate_obj_abs_pv(expr name,p,v,a)=
+ define_current_point_offset_(name);
+ new_vec(v_a);
+ for i:=1 upto obj_points_(name):
+ vec_diff_(v_a,pnt(i),p);
+ vec_rotate_(v_a,v,a);
+ vec_sum_(pnt(i),v_a,p);
+ endfor;
+ free_vec(v_a);
+enddef;
+
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector $\ora{pq}$. The angle of rotation is |a|.
+vardef rotate_obj_pp(expr name,p,q,a)=
+ define_current_point_offset_(name);
+ new_vec(v_a);new_vec(axis);
+ vec_diff_(axis,pnt(q),pnt(p));
+ for i:=1 upto obj_points_(name):
+ vec_diff_(v_a,pnt(i),pnt(p));
+ vec_rotate_(v_a,axis,a);
+ vec_sum_(pnt(i),v_a,pnt(p));
+ endfor;
+ free_vec(axis);free_vec(v_a);
+enddef;
+
+% Translation of an object instance |name| by a vector |vec[v]|.
+vardef translate_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vec_sum_(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+% Scalar multiplication of an object instance |name| by a scalar |v|.
+vardef scale_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vec_mult(i,i,v);
+ endfor;
+enddef;
+
+
+%%\newpage
+%%\title{Functions to build new points in space}
+% Rotation in a plane: this is useful to define a regular polygon.
+% |k| is a new point obtained from point |j| by rotation around |o|
+% by a angle $\alpha$ equal to the angle from |i| to |j|.
+%%\figure{vect-fig.11}
+vardef rotate_in_plane_(expr k,o,i,j)=
+ save cosalpha,sinalpha,alpha;
+ new_vec(v_a);new_vec(v_b);new_vec(v_c);
+ vec_diff_(v_a,i,o);vec_diff_(v_b,j,o);vec_prod_(v_c,v_a,v_b);
+ cosalpha=vec_dprod_(v_a,v_b)/vec_mod_(v_a)/vec_mod_(v_b);
+ sinalpha=sqrt(1-cosalpha**2);
+ alpha=angle((cosalpha,sinalpha));
+ vec_rotate_(v_b,v_c,alpha);
+ vec_sum_(k,o,v_b);
+ free_vec(v_c);free_vec(v_b);free_vec(v_a);
+enddef;
+
+vardef rotate_in_plane(expr k,o,i,j)=
+ rotate_in_plane_(pnt(k),o,pnt(i),pnt(j))
+enddef;
+
+% Build a point on a adjacent face.
+%% The middle $m$ of points $i$ and $j$ is such that
+%% $\widehat{(\ora{om},\ora{mc})}=\alpha$
+%% This is useful to define regular polyhedra
+%%\figure{vect-fig.7}
+vardef new_face_point_(expr c,o,i,j,alpha)=
+ new_vec(v_a);new_vec(v_b);new_vec(v_c);new_vec(v_d);new_vec(v_e);
+ vec_diff_(v_a,i,o);vec_diff_(v_b,j,o);
+ vec_sum_(v_c,v_a,v_b);
+ vec_mult_(v_d,v_c,.5);
+ vec_diff_(v_e,i,j);
+ vec_sum_(c,v_d,o);
+ vec_rotate_(v_d,v_e,alpha);
+ vec_sum_(c,v_d,c);
+ free_vec(v_e);free_vec(v_d);free_vec(v_c);free_vec(v_b);free_vec(v_a);
+enddef;
+
+vardef new_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(pnt(c),pnt(o),pnt(i),pnt(j),alpha)
+enddef;
+
+vardef new_abs_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(c,o,pnt(i),pnt(j),alpha)
+enddef;
+
+%%\newpage
+%%\title{Computation of the projection of a point on the ``screen''}
+% |p| is the projection of |m|
+% |m| = point in space (3 coordinates)
+% |p| = point of the intersection plane
+%%\figure{vect-fig.8}
+vardef project_point(expr p,m)=
+ save tmpalpha;
+ new_vec(v_a);new_vec(v_b);
+ if projection_type=2: % oblique
+ if point_in_plane_p_pl_(m)(projection_plane):
+ % |m| is on the projection plane
+ vec_diff_(v_a,m,ObliqueCenter_);
+ y[p]:=drawing_scale*vec_dprod_(v_a,ProjJ_);
+ x[p]:=drawing_scale*vec_dprod_(v_a,ProjK_);
+ else: % |m| is not on the projection plane
+ new_line_(l)(m,ObliqueCenter_);
+ vec_diff_(l2,l2,Obs);
+ vec_sum_(l2,l2,m);
+ % (the direction does not depend on Obs)
+ if def_inter_p_l_pl_(v_a)(l)(projection_plane):
+ vec_diff_(v_a,v_a,ObliqueCenter_);
+ y[p]:=drawing_scale*vec_dprod_(v_a,ProjJ_);
+ x[p]:=drawing_scale*vec_dprod_(v_a,ProjK_);
+ else: message "Point " & decimal m & " cannot be projected";
+ x[p]:=too_big_;y[p]=too_big_;
+ fi;
+ free_line(l);
+ fi;
+ else:
+ vec_diff_(v_b,m,Obs); % vector |Obs|-|m|
+ % |vec[v_a]| is |vec[v_b]| expressed in (|ObsI_|,|ObsJ_|,|ObsK_|)
+ % coordinates.
+ vec[v_a]x:=vec[IObsI_]x*vec[v_b]x
+ +vec[IObsJ_]x*vec[v_b]y+vec[IObsK_]x*vec[v_b]z;
+ vec[v_a]y:=vec[IObsI_]y*vec[v_b]x
+ +vec[IObsJ_]y*vec[v_b]y+vec[IObsK_]y*vec[v_b]z;
+ vec[v_a]z:=vec[IObsI_]z*vec[v_b]x
+ +vec[IObsJ_]z*vec[v_b]y+vec[IObsK_]z*vec[v_b]z;
+ if vec[v_a]x<Obs_dist: % then, point |m| is too close
+ message "Point " & decimal m & " too close -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ if (angle(vec[v_a]x,vec[v_a]z)>h_field/2)
+ or (angle(vec[v_a]x,vec[v_a]y)>v_field/2):
+ message "Point " & decimal m & " out of screen -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ if projection_type=0: % central perspective
+ tmpalpha:=Obs_dist/vec[v_a]x;
+ else:
+ tmpalpha:=1; % parallel
+ fi;
+ y[p]:=drawing_scale*tmpalpha*vec[v_a]y;
+ x[p]:=drawing_scale*tmpalpha*vec[v_a]z;
+ fi;
+ fi;
+ fi;
+ free_vec(v_b);free_vec(v_a);
+enddef;
+
+% At some point, we may need to do an oblique projection
+% of vectors |ObsK_| and |ObsI_| on a plane, and to normalize
+% and orthogonalize the projections (with the projection of |ObsK_|
+% keeping the same direction). This is done here,
+% where we take two vectors, a direction (line) and
+% a plane, and return two vectors. This function assumes
+% there is an intersection between line |l| and plane |p|.
+% We do not test it here.
+
+vardef project_vectors(expr va,vb)(expr k,i)(text l)(text p)=
+ save vc;new_vec(vc);
+ if proj_v_v_l_pl_(va,k)(l)(p): % |va| is the projection of vector |k|
+ else: message "THIS SHOULD NOT HAPPEN";
+ fi;
+ if proj_v_v_l_pl_(vb,i)(l)(p): % |vb| is the projection of vector |i|
+ else: message "THIS SHOULD NOT HAPPEN";
+ fi;
+ % now, we orthonormalize these vectors:
+ vec_prod_(vc,va,vb);
+ vec_unit_(va,va);vec_unit_(vc,vc);vec_prod_(vb,vc,va);
+ free_vec(vc);
+enddef;
+
+% Object projection
+% This is a mere iteration on |project_point|
+def project_obj(expr name)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ project_point(ipnt_(i),pnt(i));endfor;
+enddef;
+
+% Projection screen
+vardef show_projection_screen=
+ save dx,dy;
+ dx=Obs_dist*sind(h_field/2)/cosd(h_field/2);
+ dy=Obs_dist*sind(v_field/2)/cosd(v_field/2);
+ new_vec(pa);new_vec(pb);new_vec(pc);new_vec(pd);new_vec(op);
+ new_vec(w);new_vec(h);
+ vec_mult_(op,ObsI_,Obs_dist);vec_sum_(op,op,Obs); % center of screen
+ vec_mult_(w,ObsK_,dx);vec_mult_(h,ObsJ_,dy);
+ vec_sum_(pa,op,w);vec_sum_(pa,pa,h); % upper right corner
+ vec_mult_(w,w,-2);vec_mult_(h,h,-2);
+ vec_sum_(pb,pa,w);vec_sum_(pc,pb,h);vec_sum_(pd,pa,h);
+ message "Screen at corners:";
+ show_point("urcorner: ",pa);
+ show_point("ulcorner: ",pb);
+ show_point("llcorner: ",pc);
+ show_point("lrcorner: ",pd);
+ show_point("Obs:",Obs);
+ free_vec(h);free_vec(w);
+ free_vec(op);free_vec(pd);free_vec(pc);free_vec(pb);free_vec(pa);
+enddef;
+
+
+%%\newpage
+%%\title{Draw one face, hiding it if it is hidden}
+% The order of the vertices determines what is the visible side
+% of the face. The order must be clockwise when the face is seen.
+% |drawhidden| is a boolean; if |true| only hidden faces are drawn; if |false|,
+% only visible faces are drawn. Therefore, |draw_face| is called twice
+% by |draw_faces|.
+vardef draw_face(text vertices)(expr col,drawhidden)=
+ save p,num,overflow,i,j,k,nv;
+ path p;boolean overflow;
+ overflow=false;
+ forsuffixes $=vertices:
+ if z[ipnt_($)]=(too_big_,too_big_):overflow:=true; fi;
+ exitif overflow;
+ endfor;
+ if overflow: message "Face can not be drawn, due to overflow";
+ else:
+ p=forsuffixes $=vertices:z[ipnt_($)]--endfor cycle;
+ % we do now search for three distinct and non-aligned suffixes:
+ % usually, the first three suffixes do
+ new_vec(normal_vec);new_vec(v_a);new_vec(v_b);new_vec(v_c);
+ % first, we copy all the indexes in an array, so that
+ % it is easier to go through them
+ i=1; % num0 is not used
+ forsuffixes $=vertices:num[i]=$;i:=i+1;endfor;
+ nv=i-1;
+ for $:=1 upto nv:
+ for $$:=$+1 upto nv:
+ for $$$:=$$+1 upto nv:
+ vec_diff_(v_a,pnt(num[$$]),pnt(num[$]));
+ vec_diff_(v_b,pnt(num[$$$]),pnt(num[$$]));
+ vec_prod_(normal_vec,v_a,v_b);
+ exitif vec_neq_(normal_vec,vec_null);
+ % |vec_mod_| must not be used for such a test
+ endfor;
+ exitif vec_neq_(normal_vec,vec_null);
+ endfor;
+ exitif vec_neq_(normal_vec,vec_null);
+ endfor;
+ if projection_type=0: % perspective
+ vec_diff_(v_c,pnt(num1),Obs);
+ else: % parallel
+ vec_def_vec_(v_c,ObsI_);
+ fi;
+ if filled_faces:
+ if vec_dprod_(normal_vec,v_c)<0:
+ fill p withcolor col;drawcontour(p,contour_width,contour_color)();
+ else: % |draw p dashed evenly;| if this is done, you must ensure
+ % that hidden faces are (re)drawn at the end
+ fi;
+ else:
+ if vec_dprod_(normal_vec,v_c)<0:%visible
+ if not drawhidden:drawcontour(p,contour_width,contour_color)();fi;
+ else: % hidden
+ if drawhidden:
+ drawcontour(p,contour_width,contour_color)(dashed evenly);
+ fi;
+ fi;
+ fi;
+ free_vec(v_c);free_vec(v_b);free_vec(v_a);free_vec(normal_vec);
+ fi;
+enddef;
+
+% |p| is the path to draw (a face contour), |thickness| is the pen width
+% |col| is the color and |type| is a line modifier.
+def drawcontour(expr p,thickness,col)(text type)=
+ if draw_contours and (thickness>0):
+ pickup pencircle scaled thickness;
+ draw p withcolor background; % avoid strange overlapping dashes
+ draw p type withcolor col;
+ pickup pencircle scaled .4pt;
+ fi;
+enddef;
+
+%%\newpage
+% Variables for face handling. First, we have an array for lists of vertices
+% corresponding to faces.
+string face_points_[];% analogous to |vec| arrays
+
+% Then, we have an array of colors. A color needs to be a string
+% representing an hexadecimal RGB coding of a color.
+string face_color_[];
+
+% |name| is the name of an object instance
+vardef draw_faces(expr name)=
+ save tmpdef;string tmpdef;
+ define_current_face_offset_(name);
+ % first the hidden faces (dashes must be drawn first):
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),true)";scantokens tmpdef;
+ endfor;
+ % then, the visible faces:
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),false)";scantokens tmpdef;
+ endfor;
+enddef;
+
+% Draw point |n| of object instance |name|
+vardef draw_point(expr name,n)=
+ define_current_point_offset_(name);
+ project_point(ipnt_(n),pnt(n));
+ if z[ipnt_(n)] <> (too_big_,too_big_):
+ pickup pencircle scaled 5pt;
+ drawdot(z[ipnt_(n)]);
+ pickup pencircle scaled .4pt;
+ fi;
+enddef;
+
+vardef draw_axes(expr r,g,b)=
+ project_point(1,vec_null);
+ project_point(2,vec_I);
+ project_point(3,vec_J);
+ project_point(4,vec_K);
+ if (z1<>(too_big_,too_big_)):
+ if (z2<>(too_big_,too_big_)):
+ drawarrow z1--z2 dashed evenly withcolor r;
+ fi;
+ if (z3<>(too_big_,too_big_)):
+ drawarrow z1--z3 dashed evenly withcolor g;
+ fi;
+ if (z4<>(too_big_,too_big_)):
+ drawarrow z1--z4 dashed evenly withcolor b;
+ fi;
+ fi;
+enddef;
+
+% Draw a polygonal line through the list of points
+% This implementation does not work if you call
+% |draw_lines(i,i+4)| because \MP{} adds parentheses around
+% the value of |i|.
+def draw_lines(text vertices)=
+ begingroup % so that we can |let| |draw_lines|
+ save j,num,np;
+ % first, we copy all the indexes in an array, so that
+ % it is easier to go through them
+ j=1;
+ for $=vertices:num[j]=$;j:=j+1;endfor;
+ np=j-1;
+ for j:=1 upto np-1:
+ draw z[ipnt_(num[j])]--z[ipnt_(num[j+1])];
+ endfor;
+ endgroup
+enddef;
+
+let draw_line=draw_lines;
+
+% Draw an arrow between points |i| and |j| of current object
+% This is used from the |draw| definition of an object.
+def draw_arrow(expr i,j)=
+ drawarrow z[ipnt_(i)]--z[ipnt_(j)];
+enddef;
+
+% Draw a line between points |i| of object |obja| and |j| of |objb|
+% This is used when outside an object (i.e., we can't presuppose
+% any object offset)
+vardef draw_line_inter(expr obja, i, objb, j)=
+ project_point(1,pnt_obj(obja,i));
+ project_point(2,pnt_obj(objb,j));
+ draw z1--z2;
+enddef;
+
+% Draw an arrow between points |i| of object |obja| and |j| of |objb|
+% This is used when outside an object (i.e., we can't presuppose
+% any object offset)
+vardef draw_arrow_inter(expr obja, i, objb, j)=
+ project_point(1,pnt_obj(obja,i));
+ project_point(2,pnt_obj(objb,j));
+ draw z1--z2;
+enddef;
+
+%%\newpage
+% Definition of a macro |obj_name| returning an object name
+% when given an absolute
+% face number. This definition is built incrementally through a string,
+% everytime a new object is defined.
+% |obj_name| is defined by |redefine_obj_name_|.
+
+% Initial definition
+string index_to_name_;
+index_to_name_="def obj_name(expr i)=if i<1:";
+
+% |name| is the name of an object instance
+% |n| is the absolute index of its last face
+def redefine_obj_name_(expr name,n)=
+ index_to_name_:=index_to_name_ & "elseif i<=" & decimal n & ":" & ditto
+ & name & ditto;
+ scantokens begingroup index_to_name_ & "fi;enddef;" endgroup;
+enddef;
+
+% |i| is an absolute face number
+% |vertices| is a string representing a list of vertices
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_face(expr i,vertices,rgbcolor)=
+ face_points_[i]:=vertices;face_color_[i]:=rgbcolor;
+enddef;
+
+% |i| is a local face number
+% |vertices| is a string representing a list of vertices
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_obj_face(expr i,vertices,rgbcolor)=set_face(face(i),vertices,rgbcolor)
+enddef;
+
+% |i| is a local face number of object |inst|
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_obj_face_color(expr inst,i,rgbcolor)=
+ face_color_[face_obj(inst,i)]:=rgbcolor;
+enddef;
+
+
+%%\newpage
+%%\title{Compute the vectors corresponding to the observer's viewpoint}
+% (vectors |ObsI_|,|ObsJ_| and |ObsK_| in the |vec_I|,|vec_J|,
+% |vec_K| reference; and vectors |IObsI_|,|IObsJ_| and |IObsK_|
+% which are |vec_I|,|vec_J|,|vec_K|
+% in the |ObsI_|,|ObsJ_|,|ObsK_| reference)
+%%\figure{vect-fig.16}
+%% (here, $\psi>0$, $\theta<0$ and $\phi>0$; moreover,
+%% $\vert\theta\vert \leq 90^\circ$)
+
+def compute_reference(expr psi,theta,phi)=
+ % |ObsI_| defines the direction of observation;
+ % |ObsJ_| and |ObsK_| the orientation
+ % (but one of these two vectors is enough,
+ % since |ObsK_| = |ObsI_| $\land$ |ObsJ_|)
+ % The vectors are found by rotations of |vec_I|,|vec_J|,|vec_K|.
+ vec_def_vec_(ObsI_,vec_I);vec_def_vec_(ObsJ_,vec_J);
+ vec_def_vec_(ObsK_,vec_K);
+ vec_rotate_(ObsI_,ObsK_,psi);
+ vec_rotate_(ObsJ_,ObsK_,psi);% gives ($u$,$v$,$z$)
+ vec_rotate_(ObsI_,ObsJ_,theta);
+ vec_rotate_(ObsK_,ObsJ_,theta);% gives ($Obs_x$,$v$,$w$)
+ vec_rotate_(ObsJ_,ObsI_,phi);
+ vec_rotate_(ObsK_,ObsI_,phi);% gives ($Obs_x$,$Obs_y$,$Obs_z$)
+ % The passage matrix $P$ from |vec_I|,|vec_J|,|vec_K|
+ % to |ObsI_|,|ObsJ_|,|ObsK_| is the matrix
+ % composed of the vectors |ObsI_|,|ObsJ_| and |ObsK_| expressed
+ % in the base |vec_I|,|vec_J|,|vec_K|.
+ % We have $X=P X'$ where $X$ are the coordinates of a point
+ % in |vec_I|,|vec_J|,|vec_K|
+ % and $X'$ the coordinates of the same point in |ObsI_|,|ObsJ_|,|ObsK_|.
+ % In order to get $P^{-1}$, it suffices to build vectors using
+ % the previous rotations in the inverse order.
+ vec_def_vec_(IObsI_,vec_I);vec_def_vec_(IObsJ_,vec_J);
+ vec_def_vec_(IObsK_,vec_K);
+ vec_rotate_(IObsK_,IObsI_,-phi);vec_rotate_(IObsJ_,IObsI_,-phi);
+ vec_rotate_(IObsK_,IObsJ_,-theta);vec_rotate_(IObsI_,IObsJ_,-theta);
+ vec_rotate_(IObsJ_,IObsK_,-psi);vec_rotate_(IObsI_,IObsK_,-psi);
+enddef;
+
+%%\newpage
+%%\title{Point of view}
+% This macro computes the three angles necessary for |compute_reference|
+% |name| = name of an instance of an object
+% |target| = target point (local to object |name|)
+% |phi| = angle
+vardef point_of_view_obj(expr name,target,phi)=
+ define_current_point_offset_(name);% enables |pnt|
+ point_of_view_abs(pnt(target),phi);
+enddef;
+
+% Compute absolute perspective. |target| is an absolute point number
+% |phi| = angle
+% This function also computes two vectors needed in case
+% of an oblique projection.
+vardef point_of_view_abs(expr target,phi)=
+ save psi,theta;
+ new_vec(v_a);
+ vec_diff_(v_a,target,Obs);
+ vec_mult_(v_a,v_a,1/vec_mod_(v_a));
+ psi=angle((vec[v_a]x,vec[v_a]y));
+ theta=-angle((vec[v_a]x++vec[v_a]y,vec[v_a]z));
+ compute_reference(psi,theta,phi);
+ if projection_type=2: % oblique
+ % we start by checking that at a minimum the three points defining
+ % the projection plane have different indexes; it doesn't mean
+ % the plane if well defined, but if two values are identical,
+ % the plane can't be well defined.
+ if ((projection_plane1<>projection_plane2) and
+ (projection_plane1<>projection_plane3) and
+ (projection_plane2<>projection_plane3)):
+ new_line_(l)(Obs,Obs);
+ vec_sum_(l2,ObsI_,Obs);
+ if def_inter_p_l_pl_(ObliqueCenter_)(l)(projection_plane):
+ project_vectors(ProjK_,ProjJ_)(ObsK_,ObsJ_)(l)(projection_plane);
+ % define the projection direction
+ set_line_(projection_direction)(Obs,ObliqueCenter_);
+ else:
+ message "Anomalous oblique projection:";
+ message " the observer is watching parallely to the plane";
+ fi;
+ free_line(l);
+ else:
+ message "Anomalous projection plane; did you define it?";
+ fi;
+ fi;
+ free_vec(v_a);
+enddef;
+
+
+% Distance between the observer and point |n| of object |name|
+% Result is put in |dist|
+vardef obs_distance(text dist)(expr name,n)=
+ new_vec(v_a);
+ define_current_point_offset_(name);% enables |pnt|
+ dist:=vec_mod_(v_a,pnt(n),Obs);
+ free_vec(v_a);
+enddef;
+
+%%\newpage
+%%\title{Vector and point allocation}
+% Allocation is done through a stack of vectors
+numeric last_vec_;
+last_vec_=0;
+
+% vector allocation
+% (this must not be a |vardef| because the vector |v| saved is not saved
+% in this macro, but in the calling context)
+def new_vec(text v)=
+ save v;
+ new_vec_(v);
+enddef;
+
+def new_vec_(text v)=
+ v:=incr(last_vec_);
+ %|message "Vector " & decimal (last_vec_+1) & " allocated";|
+enddef;
+
+let new_point = new_vec;
+let new_point_ = new_vec_;
+
+def new_points(text p)(expr n)=
+ save p;
+ numeric p[];
+ for i:=1 upto n:new_point_(p[i]);endfor;
+enddef;
+
+% Free a vector
+% A vector can only be freed safely when it was the last vector created.
+def free_vec(expr i)=
+ if i=last_vec_: last_vec_:=last_vec_-1;
+ %|message "Vector " & decimal i & " freed";|
+ else: errmessage("Vector " & decimal i & " can't be freed!");
+ fi;
+enddef;
+
+let free_point = free_vec;
+
+def free_points(text p)(expr n)=
+ for i:=n step-1 until 1:free_point(p[i]);endfor;
+enddef;
+
+%%\title{Debugging}
+
+def show_vec(expr t,i)=
+ message "Vector " & t & "="
+ & "(" & decimal vec[i]x & "," & decimal vec[i]y & ","
+ & decimal vec[i]z & ")";
+enddef;
+
+% One can write |show_point("2",pnt_obj("obj",2));|
+let show_point=show_vec;
+
+def show_pair(expr t,zz)=
+ message t & "=(" & decimal xpart(zz) & "," & decimal ypart(zz) & ")";
+enddef;
+
+%%\newpage
+%%\title{Access to object features}
+% |a| must be a string representing a class name, such as |"dodecahedron"|.
+% |b| is the tail of a macro name.
+
+def obj_(expr a,b,i)=
+ scantokens
+ begingroup save n;string n;n=a & b & i;n
+ endgroup
+enddef;
+
+def obj_points_(expr name)=
+ obj_(obj_class_(name),"_points",name)
+enddef;
+
+def obj_faces_(expr name)=
+ obj_(obj_class_(name),"_faces",name)
+enddef;
+
+vardef obj_point_offset_(expr name)=
+ obj_(obj_class_(name),"_point_offset",name)
+enddef;
+
+vardef obj_face_offset_(expr name)=
+ obj_(obj_class_(name),"_face_offset",name)
+enddef;
+
+def obj_class_(expr name)=obj_(name,"_class","") enddef;
+
+%%\newpage
+def define_point_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_point_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_point_offset_;
+ last_point_offset_:=last_point_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_points" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_face_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_face_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_face_offset_;
+ last_face_offset_:=last_face_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_faces" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_current_point_offset_(expr name)=
+ save current_point_offset_;
+ numeric current_point_offset_;
+ current_point_offset_:=obj_point_offset_(name);
+enddef;
+
+def define_current_face_offset_(expr name)=
+ save current_face_offset_;
+ numeric current_face_offset_;
+ current_face_offset_:=obj_face_offset_(name);
+enddef;
+
+
+%%\newpage
+%%\title{Drawing an object}
+% |name| is an object instance
+vardef draw_obj(expr name)=
+ save tmpdef;
+ string tmpdef;
+ current_obj:=name;
+ tmpdef="draw_" & obj_class_(name);
+ project_obj(name);% compute screen coordinates
+ save overflow; boolean overflow; overflow=false;
+ for $:=1 upto obj_points_(name):
+ if z[ipnt_($)]=(too_big_,too_big_):overflow:=true;
+ x[ipnt_($)] := 10; % so that the figure can be drawn anyway
+ y[ipnt_($)] := 10;
+ % why can't I write z[ipnt_($)]:=(10,10); ?
+ fi;
+ exitif overflow;
+ endfor;
+ if overflow:
+ message "Figure has overflows";
+ message " (at least one point is not visible ";
+ message " and had to be drawn at a wrong place)";
+ fi;
+ scantokens tmpdef(name);
+enddef;
+
+%%\title{Normalization of an object}
+% This macro translates an object so that a list of vertices is centered
+% on the origin, and the last vertex is put on a sphere whose radius is 1.
+% |name| is the name of the object and |vertices| is a list
+% of points whose barycenter will define the center of the object.
+% (|vertices| need not be the list of all vertices)
+vardef normalize_obj(expr name)(text vertices)=
+ save nvertices,last;
+ nvertices=0;
+ new_vec(v_a);vec_def_(v_a,0,0,0)
+ forsuffixes $=vertices:
+ vec_sum_(v_a,v_a,pnt($));
+ nvertices:=nvertices+1;
+ last:=$;
+ endfor;
+ vec_mult_(v_a,v_a,-1/nvertices);
+ translate_obj(name,v_a);% object centered on the origin
+ scale_obj(name,1/vec_mod(last));
+ free_vec(v_a);
+enddef;
+
+
+%%\newpage
+%%\title{General definitions}
+% Vector arrays
+numeric vec[]x,vec[]y,vec[]z;
+
+% Reference vectors $\vec{0}$, $\vec{\imath}$, $\vec{\jmath}$ and $\vec{k}$
+% and their definition
+new_vec(vec_null);new_vec(vec_I);new_vec(vec_J);new_vec(vec_K);
+vec_def_(vec_null,0,0,0);
+vec_def_(vec_I,1,0,0);vec_def_(vec_J,0,1,0);vec_def_(vec_K,0,0,1);
+numeric point_null;
+point_null=vec_null;
+
+% Observer
+new_point(Obs);
+% default value:
+set_point_(Obs,0,0,20);
+
+% Observer's vectors
+new_vec(ObsI_);new_vec(ObsJ_);new_vec(ObsK_);
+% default values:
+vec_def_vec_(ObsI_,vec_I);
+vec_def_vec_(ObsJ_,vec_J);
+vec_def_vec_(ObsK_,vec_K);
+
+new_vec(IObsI_);new_vec(IObsJ_);new_vec(IObsK_);
+
+% These vectors will be vectors of the projection plane,
+% in case of oblique projections:
+new_vec(ProjK_);new_vec(ProjJ_); % there is no |ProjI_|
+
+% This will be the center of the projection plane, in oblique projections
+new_point(ObliqueCenter_);
+
+
+% distance observer/plane (must be $>0$)
+numeric Obs_dist; % represents |Obs_dist| $\times$ |drawing_scale|
+% default value:
+Obs_dist=2; % means |Obs_dist| $\times$ |drawing_scale|
+
+% current object being drawn
+string current_obj;
+
+% kind of projection: 0 for linear (or central) perspective, 1 for parallel,
+% 2 for oblique projection
+% (default is 0)
+numeric projection_type;
+projection_type:=0;
+
+% Definition of a projection plane (only used in oblique projections)
+%
+new_plane_(projection_plane)(1,1,1); % the initial value is irrelevant
+
+% Definition of a projection direction (only used in oblique projections)
+new_line_(projection_direction)(1,1); % the initial value is irrelevant
+
+% this positions the observer at vector |p| (the point observed)
+% + |d| (distance) * (k-(i+j))
+def isometric_projection(expr i,j,k,p,d,phi)=
+ trimetric_projection(i,j,k,1,1,1,p,d,phi);
+enddef;
+
+% this positions the observer at vector |p| (the point observed)
+% + |d| (distance) * (ak-(i+j))
+def dimetric_projection(expr i,j,k,a,p,d,phi)=
+ trimetric_projection(i,j,k,1,1,a,p,d,phi);
+enddef;
+
+% this positions the observer at vector |p| (the point observed)
+% + |d| (distance) * (k-(i+j))
+% |a|, |b| and |c| are multiplicative factors to vectors |i|, |j| and |k|
+vardef trimetric_projection(expr i,j,k,a,b,c,p,d,phi)=
+ save v_a,v_b,v_c;
+ new_vec(v_a);new_vec(v_b);new_vec(v_c);
+ vec_mult_(v_a,i,a);vec_mult_(v_b,j,b);vec_mult_(v_c,k,c);
+ vec_sum_(Obs,v_a,v_b);
+ vec_diff_(Obs,v_c,Obs);
+ vec_mult_(Obs,Obs,d);
+ vec_sum_(Obs,Obs,p);
+ point_of_view_abs(p,phi);
+ projection_type:=1;
+ free_vec(v_c);free_vec(v_b);free_vec(v_a);
+enddef;
+
+% |hor| is an horizontal plane (in the sense that it will represent
+% the horizontal for the observer)
+% |p| is the point in space that the observer targets (center of screen)
+% |a| is an angle (45 degrees corresponds to cavalier drawing)
+% |b| is an angle (see examples defined below)
+% |d| is the distance of the observer
+vardef oblique_projection(text hor)(expr p,a,b,d)=
+ save _l,v_a,v_b,v_c,xxx_,obsJangle_;
+ new_vec(v_a);new_vec(v_b);new_vec(v_c);
+ % we first compute a horizontal line:
+ new_line_(_l)(1,1);
+ if def_inter_l_pl_pl(_l)(hor)(projection_plane):
+ vec_diff_(v_a,_l2,_l1); % horizontal vector
+ % then, we find a normal to the projection plane:
+ def_normal_p_(v_b)(projection_plane);
+ % complete the line and the vector by a third vector (=vertical)
+ vec_prod_(v_c,v_a,v_b);
+ % we make |v_a| a copy of |v_b| since we no longer need |v_b|
+ vec_def_vec_(v_a,v_b);
+ % we rotate |v_b| by an angle |a| around |v_c|
+ vec_rotate_(v_b,v_c,a);
+ % we rotate |v_b| by an angle |b| around |v_a|
+ vec_rotate_(v_b,v_a,b);
+ % we put the observer at the distance |d| of |p| in
+ % the direction of |v_b|:
+ vec_unit_(v_b,v_b);
+ vec_mult_(v_b,v_b,d);vec_sum_(Obs,p,v_b);
+ % We now have to make sure that point |p| and point |Obs|
+ % are on different sides of the projection plane. For this,
+ % we compute two dot products:
+ new_vec(v_d);new_vec(v_e);
+ vec_diff_(v_d,p,_l1);vec_diff_(v_e,Obs,_l1);
+ if vec_dprod_(v_d,v_a)*vec_dprod_(v_e,v_a)>=0:
+ % |p| and |Obs| are on the same side of the projection plane
+ % |Obs| needs to be recomputed.
+ vec_mult_(v_b,v_b,-1);
+ vec_sum_(Obs,p,v_b);
+ fi;
+ free_vec(v_e);free_vec(v_d);
+ projection_type:=2; % needs to be set before |point_of_view_abs|
+ point_of_view_abs(p,90); % this computes |ObliqueCenter_|
+ % and now, make sure the vectors defining the observer are right:
+ % Create the plane containing lines _l and projection_direction
+ % (defined by point_of_view_abs):
+ new_plane_(xxx_)(1,1,1);
+ def_plane_pl_l_l(xxx_)(_l)(projection_direction);
+ % Compute the angle of |ObsK_| with this plane:
+ obsJangle_=vangle_v_pl_(ObsK_)(xxx_);
+ % rotate |ObsJ_| and |ObsK_| by |obsJangle_| around |ObsI_|
+ vec_rotate_(ObsJ_,ObsI_,obsJangle_);
+ vec_rotate_(ObsK_,ObsI_,obsJangle_);
+ if abs(vangle_v_pl_(ObsK_)(xxx_))>1: % the rotation was done
+ % in the wrong direction
+ vec_rotate_(ObsJ_,ObsI_,-2obsJangle_);
+ vec_rotate_(ObsK_,ObsI_,-2obsJangle_);
+ fi;
+ % |vec_rotate_(ObsJ_,ObsI_,45);| % planometric test
+ % |vec_rotate_(ObsK_,ObsI_,45);| % planometric test
+ free_plane(xxx_);
+ % and now, |ProjJ_| and |ProjK_| must be recomputed:
+ project_vectors(ProjK_,ProjJ_)(ObsK_,ObsJ_)%
+ (projection_direction)(projection_plane);
+ else:
+ message "Error: the ``horizontal plane'' cannot be";
+ message " parallel to the projection plane.";
+ fi;
+ free_line(_l);
+ free_vec(v_c);free_vec(v_b);free_vec(v_a);
+enddef;
+
+% These two are the most common values for the third parameter
+% of |oblique_projection|
+numeric CAVALIER;CAVALIER=45;
+numeric CABINET;CABINET=angle((1,.5)); % atn(.5)
+
+% Screen Size
+% The screen size is defined through two angles: the horizontal field
+% and the vertical field
+numeric h_field,v_field;
+h_field=100; % degrees
+v_field=70; % degrees
+
+% Observer's orientation, defined by three angles
+numeric Obs_psi,Obs_theta,Obs_phi;
+% default value:
+Obs_psi=0;Obs_theta=90;Obs_phi=0;
+
+% This array relates an absolute object point number to the
+% absolute point number (that is, to the |vec| array).
+% The absolute object point number is the rank of a point
+% with respect to all object points. The absolute point number
+% considers in addition the extra points, such as |Obs|, which do
+% not belong to an object.
+% If |i| is an absolute object point number, |points_[i]|
+% is the absolute point number.
+numeric points_[];
+
+% |name| is the name of an object instance
+% |npoints| is its number of defining points
+def new_obj_points(expr name,npoints)=
+ define_point_offset_(name,npoints);define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):new_point_(pnt(i));endfor;
+enddef;
+
+% |name| is the name of an object instance
+% |nfaces| is its number of defining faces
+def new_obj_faces(expr name,nfaces)=
+ define_face_offset_(name,nfaces);define_current_face_offset_(name);
+ redefine_obj_name_(name,current_face_offset_+nfaces);
+enddef;
+
+%%\newpage
+% Absolute point number corresponding to object point number |i|
+% This macro must only be used within the function defining an object
+% (such as |def_cube|) or the function drawing an object (such as
+% |draw_cube|).
+def ipnt_(expr i)=i+current_point_offset_ enddef;
+def pnt(expr i)=points_[ipnt_(i)] enddef;
+
+def face(expr i)=(i+current_face_offset_) enddef;
+
+% Absolute point number corresponding to local point |n|
+% in object instance |name|
+vardef pnt_obj(expr name,n)=
+ points_[n+obj_point_offset_(name)]
+ %hide(define_current_point_offset_(name);) pnt(n) % HAS SIDE EFFECTS
+enddef;
+
+% Absolute face number corresponding to local face |n|
+% in object instance |name|
+vardef face_obj(expr name,n)=
+ (n+obj_face_offset_(name))
+ %hide(define_current_face_offset_(name);) face(n) % HAS SIDE EFFECTS
+enddef;
+
+
+% Scale
+numeric drawing_scale;
+drawing_scale=2cm;
+
+% Color
+% This function is useful when a color is expressed in hexadecimal.
+% This does the opposite from |tohexcolor|
+def hexcolor(expr s)=
+ (hex(substring (0,2) of s)/255,hex(substring (2,4) of s)/255,
+ hex(substring (4,6) of s)/255)
+enddef;
+
+% Convert a color triple into a hexadecimal color string.
+% |rv|, |gv| and |bv| are values between 0 and 1.
+% This does the opposite from |hexcolor|
+vardef tohexcolor(expr rv,gv,bv)=
+ save dig;numeric dig[];
+ hide(
+ dig2=floor(rv*255);dig1=floor((dig2)/16);dig2:=dig2-16*dig1;
+ dig4=floor(gv*255);dig3=floor((dig4)/16);dig4:=dig4-16*dig3;
+ dig6=floor(bv*255);dig5=floor((dig6)/16);dig6:=dig6-16*dig5;
+ for i:=1 upto 6:
+ if dig[i]<10:dig[i]:=dig[i]+48;
+ else:dig[i]:=dig[i]+87;
+ fi;
+ endfor;
+ )
+ char(dig1)&char(dig2)&char(dig3)&char(dig4)&char(dig5)&char(dig6)
+enddef;
+
+% Conversions
+
+% Returns a string encoding the integer |n| as follows:
+% if $n=10*a+b$ with $b<10$,
+% |alphabetize|(|n|)=|alphabetize|(|a|) |&| |char (65+b)|
+% For instance, alphabetize(3835) returns "DIDF"
+% This function is useful in places where digits are not allowed.
+def alphabetize(expr n)=
+ if (n>9):
+ alphabetize(floor(n/10)) & fi
+ char(65+n-10*floor(n/10))
+enddef;
+
+% Filling and contours
+boolean filled_faces,draw_contours;
+filled_faces=true;
+draw_contours=true;
+numeric contour_width; % thickness of contours
+contour_width=1pt;
+color contour_color; % face contours
+contour_color=black;
+
+% Overflow control
+% An overflow can occur when an object is too close from the observer
+% or if an object is out of sight. We use a special value to mark
+% coordinates which would lead to an overflow.
+numeric too_big_;
+too_big_=4000;
+
+
+% Object offset (the points defining an object are arranged
+% in a single array, and the objects are easier to manipulate
+% if the point numbers are divided into a number and an offset).
+numeric last_point_offset_,last_face_offset_;
+last_point_offset_=0;last_face_offset_=0;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/3danim.mp b/graphics/metapost/contrib/macros/mp3d/inputs/3danim.mp
new file mode 100644
index 0000000000..3e49922a69
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/3danim.mp
@@ -0,0 +1,269 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3DANIM.MP: STANDARD ANIMATION DEFINITIONS IN METAPOST}}
+
+%% version 1.34, 17 August 2003
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+%%
+%%This package provides standard animation definitions and
+%%must be used with the {\bf 3d} package.
+
+if known three_d_anim_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+% First, we load the 3D package
+input 3d
+
+message "*** 3danim, v1.34 (c) D. Roegel, 17 August 2003 ***";
+numeric three_d_anim_version;
+three_d_anim_version=1.34;
+
+%%\newpage
+%%\title{Computation of field parameters of an animation}
+numeric xmin_,ymin_,xmax_,ymax_;
+
+def compute_bbox=
+ if known xmin_:
+ xmin_:=min(xmin_,xpart(llcorner(currentpicture)));
+ ymin_:=min(ymin_,ypart(llcorner(currentpicture)));
+ xmax_:=max(xmax_,xpart(urcorner(currentpicture)));
+ ymax_:=max(ymax_,ypart(urcorner(currentpicture)));
+ else:
+ xmin_=xpart(llcorner(currentpicture));
+ ymin_=ypart(llcorner(currentpicture));
+ xmax_=xpart(urcorner(currentpicture));
+ ymax_=ypart(urcorner(currentpicture));
+ fi;
+enddef;
+
+extra_endfig:=extra_endfig & "compute_bbox;";
+
+boolean show_animation_parameters;
+show_animation_parameters=false;
+% The paper height is purely virtual; it is a paper size
+% such that the full animation can rest on it.
+% It must be compatible with the |PAPERSIZE| option
+% of |gs| in |write_script|.
+% If the size (i.e. the bounding box) of the animation is too large,
+% you may have to change the |paper_height| and the |gs| parameter.
+% The ratio between the paper height and width is assumed to be sqrt(2).
+numeric paper_height;
+paper_height=29.7; % A4 paper height in cm
+numeric output_res;
+output_res=36; % default output resolution of bitmap: 36 dots per inch
+
+% show bounding box of an animation, in PostScript points
+% and parameters for animation script
+vardef show_animation_bbox=
+ save trx,try,h,w,delta,pnmx,pnmy,pnmw,pnmh,phbp,pwbp;
+ w=xmax_-xmin_;h=ymax_-ymin_;
+ if show_animation_parameters:
+ message "animation bbox: (llx=" & decimal round(xmin_)
+ & ",lly=" & decimal round(ymin_)
+ & ",w=" & decimal round(w) & ",h=" & decimal round(h) & ")";
+ fi;
+ % the lower left corner is put at position (20,20)
+ trx=20-xmin_;
+ try=20-ymin_;
+ if show_animation_parameters:
+ message "translate parameters: "
+ & decimal round(trx) & " " & decimal round(try);
+ fi;
+ xmin_:=xmin_+trx;ymin_:=ymin_+try;
+ delta=10; % extra space
+ phbp=paper_height/2.54*72; % paper height in PostScript points
+ pwbp=phbp/sqrt(2); % paper width in PostScript points
+ % (assuming a sqrt(2) ratio)
+ pnmx=round(xmin_*(output_res/72)-delta);
+ pnmy=round((paper_height/2.54*72-ymin_-h)*(output_res/72)-delta);
+ pnmw=round(w*(output_res/72)+2*delta);
+ pnmh=round(h*(output_res/72)+2*delta);
+ if show_animation_parameters:
+ message "pnmcut parameters (with -r" & decimal output_res & "): "
+ & decimal pnmx & " " & decimal pnmy & " "
+ & decimal pnmw & " " & decimal pnmh;
+ fi;
+ if (pnmx<0) or (pnmy<0) or (pnmx+pnmw>=pwbp) or (pnmy+pnmh>=phbp):
+ message "!! paper size overflow: you may need to reduce the size of";
+ message "!! the animation, or to change the paper size";
+ fi;
+ write_script(round(trx),round(try),
+ pnmx,pnmy,pnmw,pnmh,output_res,jobname,"create_animation.sh");
+enddef;
+
+%%\newpage
+%%\title{Creation of a shell script to automate the animation}
+% This is UNIX targetted and may need to be customized.
+
+vardef write_script(expr trx,try,xmin,ymin,w,h,res,output,file)=
+ save s;
+ string s;
+ def write_to_file(text arg)=write arg to file; enddef;
+ write_to_file("#! /bin/sh");
+ write_to_file("");
+ write_to_file("/bin/rm -f "&output&".log");
+ write_to_file("for i in `ls "&output&".*| grep '"&output&".[0-9]'`;do");
+ if false: "endfor" fi % indentation hack for meta-mode.el
+ write_to_file("echo $i");
+ write_to_file("echo '=============='");
+ s:="awk < $i '{print} /^%%Page: /{print "&ditto;
+ s:=s&decimal trx&" "&decimal try&" translate\n"&ditto&"}' > $i.ps";
+ write_to_file(s);
+ % ghostscript PostScript into ppm
+ % (the paper size must be compatible with the definition of |paper_height|)
+ s:="gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE ";
+ s:=s&"-r"&decimal res &" -sOutputFile=$i.ppm -q -- $i.ps";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ps");
+ % possible alternative:
+ % |s:="mogrify -compress -crop " & decimal(w) & "x" & decimal(h);|
+ % |s:=s&"+"& decimal(xmin) &"+"&decimal(ymin);|
+ % |s:=s&" -colors 32 -format gif $i.ppm";|
+ s:="ppmquant 32 $i.ppm | pnmcut "& decimal(xmin) &" "&decimal(ymin);
+ s:=s&" "&decimal(w)&" "&decimal(h) &" | ";
+ s:=s&"ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ppm");
+ write_to_file("done");
+ write_to_file("/bin/rm -f "&output&".gif");
+ s:="gifmerge -10 -l1000 ";
+ s:=s&output&".*.gif > "&output&".gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f "&output&".*.gif");
+ write_to_file(EOF);% end of file
+enddef;
+
+% These definitions produce {\it one\/} image of some kind.
+
+% In the standard animations, the observer follows a circle, shown below:
+%%\figure{vect-fig.17}
+
+% Standard image 1: this is an example and may be adapted.
+% |name| is an object instance
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point_(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name,1,Obs_phi);% fix point 1 of object |name|
+ draw_obj(name);
+ rotate_obj_pv(name,1,vec_I,ang);
+ draw_point(name,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 2: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point_(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vec_I,ang);
+ rotate_obj_pv(name_b,13,vec_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+%%\newpage
+% Standard image 3: this is an example and may be adapted.
+% |name_a|, |name_b| and |name_c| are object instances.
+def one_image_three_objects(expr name_a,name_b,name_c,i,a,rd,ang)=
+ beginfig(i);
+ set_point_(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;h_field:=100;v_field:=150;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);draw_obj(name_c);
+ new_vec(v_a);
+ vec_def_(v_a,.03*cosd(-a*ang+90),.03*sind(-a*ang+90),0);
+ translate_obj(name_c,v_a);
+ free_vec(v_a);
+ rotate_obj_pv(name_a,1,vec_I,ang);
+ rotate_obj_pv(name_b,13,vec_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 4: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_identical_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point_(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),2);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vec_I,ang);
+ rotate_obj_pv(name_b,13,vec_J,-ang);
+ %|rotate_obj_pp(name_a,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+
+%%\newpage
+% An animation is a series of images, and these series are produced here.
+
+% Standard animation 1
+% |name| is a class name
+def animate_object(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obj",name);
+ for i:=imin upto imax:one_image("obj",i+index,i,5,ang);endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 2
+% |name_a| and |name_b| are class names
+def animate_two_objects(expr name_a,name_b,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ translate_obj("objb",vec_K);translate_obj("objb",vec_K);
+ for i:=imin upto imax:
+ one_image_two_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 3
+% |name_a|, |name_b| and |name_c| are class names
+vardef animate_three_objects(expr name_a,name_b,name_c,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ assign_obj("objc",name_c);
+ scale_obj("objb",.7);
+ new_vec(v_a);
+ vec_def_vec_(v_a,vec_K);vec_mult_(v_a,v_a,4);put_obj("objb",v_a,1,0,0,0);
+ free_vec(v_a);
+ scale_obj("objc",.5);
+ translate_obj("objc",vec_K);translate_obj("objc",vec_K);
+ for i:=imin upto imax:
+ one_image_three_objects("obja","objb","objc",i+index,i,7,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 4
+% |name| is a class name
+def animate_two_identical_objects(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name);assign_obj("objb",name);
+ translate_obj("objb",vec_K);translate_obj("objb",vec_K);
+ for i:=imin upto imax:
+ one_image_two_identical_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/3dgeom.mp b/graphics/metapost/contrib/macros/mp3d/inputs/3dgeom.mp
new file mode 100644
index 0000000000..22a30315b6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/3dgeom.mp
@@ -0,0 +1,931 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3DGEOM.MP: 3D GEOMETRY IN METAPOST}}
+
+%% version 1.34, 17 August 2003
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+% This package provides useful definitions for geometrical drawings.
+% It contains functions dealing with lines, planes, etc.
+
+if known three_d_geom_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+% First, we load the 3D package
+input 3d
+% and some utilities
+input 3dutil
+
+message "*** 3dgeom, v1.34 (c) D. Roegel 17 August 2003 ***";
+numeric three_d_geom_version; three_d_geom_version:=1.34;
+
+% WARNING:
+% Known bugs: unnecessary overflows can occur, especially when
+% computing the intersection of two planes.
+
+
+% Among other things, this file defines so-called ``structures.''
+% These structures are different from the ``objects'' manipulated
+% by the main 3d package. For some explanations, see the article
+%
+% Denis Roegel: La géométrie dans l'espace avec METAPOST,
+% Cahiers GUTenberg number 39-40, 2001, pages 107-138.
+% (in French, conference proceedings of GUT2001)
+%
+%
+%
+% Future versions of this module will consider the following structures,
+% not all of which are currently implemented:
+%
+% structure name standard abreviation
+% point p
+% line l
+% plane pl
+% circle c
+% triangle tr
+% sphere s
+% cone co
+% cylinder cy
+% tetrahedron te
+%
+% These names are considered reserved and should not be used for classes.
+%
+% The left column names are used when defining a structure with |def|,
+% |set| or freeing it with |free|.
+%
+% When a function using parameters of these types is defined,
+% the abreviations of the types are part of the function name.
+% For instance, the function giving the intersection between a
+% line and a plane is named |def_inter_l_pl|.
+%
+% Functions computing intersections should be named |def_inter|
+% and should be followed by the resulting type. For instance,
+% the intersection of two lines is |def_inter_p_l_l|,
+% the intersection of two planes is |def_inter_l_pl_pl|
+%
+% Functions computing inscriptions (like a circle inscribed
+% in a triangle) should be named |def_ins|.
+% For instance, |def_ins_c_tr|.
+%
+% Functions computing circumscriptions (like a circle circumscribing
+% a triangle) should be named |def_circums|.
+% For instance, |def_circums_c_tr|.
+%
+% Functions computing exinscriptions (like a circle exinscribed
+% in a triangle) should be named |def_exins|.
+% For instance, |def_exins_c_tr|.
+%
+% Functions computing tangencies (like a tangent to a circle)
+% should be named |def_tang|.
+% For instance, |def_tang_l_c|.
+%
+% Functions computing orthogonal planes, lines, etc. should
+% be named |def_orth|.
+%
+% All these functions can have more parameters than what the name
+% implies.
+%
+% These rules are guidelines, not a standard. If you have some idea
+% on naming conventions, please let me know at roegel@loria.fr.
+%
+% Possibly, more thought should be given in
+% order to distinguish pseudo-objects like ``circle''
+% from the other objects of 3d.mp (like the polyhedra, etc.).
+
+
+% Structures can be allocated, set and freed.
+
+% Our first structure is the line. A line is defined by two points.
+% This is not an object in the usual sense of the 3d package.
+% It is just made of two points.
+% |l| is the line name: it must be different from already known variables
+% |i| and |j| are point numbers
+% (absolute version)
+def new_line_(text l)(expr i,j)=
+ new_points(l)(2);
+ set_line_(l)(i,j);
+enddef;
+
+% The following version takes local point numbers instead of absolute ones.
+def new_line(text l)(expr i,j)=new_line_(l)(pnt(i),pnt(j)) enddef;
+
+% This is used to set a line:
+% (absolute version)
+def set_line_(text l)(expr i,j)=
+ vec_def_vec_(l1,i);
+ vec_def_vec_(l2,j); % l[2]=l[1]+1 (this is assumed elsewhere,
+ % so should never change)
+enddef;
+
+% (local version)
+def set_line(text l)(expr i,j)=set_line_(l)(pnt(i),pnt(j)) enddef;
+
+def free_line(text l)=
+ free_points(l)(2);
+enddef;
+
+% A circle |c| of center |i|, radius |r| and in plane |p|.
+% We store the center as a point, and (r,p[1]) in another point.
+def new_circle(text c)(expr i,r)(text p)=
+ new_points(c)(2);
+ vec_def_vec(c1,i);
+ vec_def(c2,r,p1,0);
+enddef;
+
+% should |set_circle| be defined?
+
+def free_circle(text c)=
+ free_points(c)(2);
+enddef;
+
+% Planes are similar to lines. A plane is just a triple of points.
+% (absolute version)
+def new_plane_(text p)(expr i,j,k)=
+ new_points(p)(3);
+ set_plane_(p)(i,j,k);
+enddef;
+
+% (local version)
+def new_plane(text p)(expr i,j,k)=new_plane_(p)(pnt(i),pnt(j),pnt(k)) enddef;
+
+% (absolute version)
+def set_plane_(text p)(expr i,j,k)=
+ vec_def_vec_(p1,i);
+ vec_def_vec_(p2,j); % p[2]=p[1]+1 (this is assumed elsewhere,
+ % so should never change)
+ vec_def_vec_(p3,k); % p[3]=p[3]+1 (this is assumed elsewhere,
+ % so should never change)
+enddef;
+
+% (local version)
+def set_plane(text p)(expr i,j,k)=set_plane_(p)(pnt(i),pnt(j),pnt(k)) enddef;
+
+def free_plane(text p)=
+ free_points(p)(3);
+enddef;
+
+% Spheres are not yet used, but here is how they will be allocated and freed.
+
+% A sphere is defined with a center |c| and a radius |r|.
+% We store it using two points.
+def new_sphere(text s)(expr c,r)=
+ new_points(s)(2);
+ vec_def_vec(s1,c);
+ vec_def(s2,r,0,0);
+enddef;
+
+% Should |set_sphere| be defined?
+
+def free_sphere(text s)=
+ free_points(s)(2);
+enddef;
+
+% Lines and planes may be used locally or globally to define
+% new points or new lines.
+
+% In order to define a line which is given by a point and a vector,
+% compute a second point before defining the line.
+% In order to define a line which is given by two planes,
+% define the planes and compute the intersection.
+
+% If a plane is given by a parametric equation (1 point, 2 vectors),
+% compute two additional points and define the plane.
+% If a plane is given by an equation ax+by+cz+d=0, compute three
+% points and define the plane.
+
+% Currently, plane equations are not handled separately.
+
+% Projection of a vector |j| on a plane |p|, along a line |l|.
+% The projection, if it exists, is vector |i|.
+% Returns |true| is there is a projection, and |false| if there is none.
+vardef proj_v_v_l_pl_(expr i,j)(text l)(text p)=
+ save pa,pb,int; boolean int;
+ hide(
+ new_point(pa);new_point(pb);
+ % we project two points: the origin, and origin+v(j):
+ if def_proj_pl_(pa)(p)(point_null)(l):
+ if def_proj_pl_(pb)(p)(j)(l):
+ vec_diff_(i,pb,pa);
+ int=true;
+ else:
+ message "Second point can not be projected";
+ int=false;
+ fi;
+ else: int=false;
+ message "Origin can not be projected";
+ fi;
+ free_point(pb);free_point(pa);
+ )
+ int
+enddef;
+
+% The next function checks if a point is part of a plane.
+% Returns |true| is point |i| is in the plane |p|.
+vardef point_in_plane_p_pl_(expr i)(text p)=
+ save v_a;boolean res;
+ hide(
+ new_vec(v_a);new_vec(v_b);
+ def_normal_p_(v_a)(p);
+ vec_diff_(v_b,p1,i);
+ if vec_dprod_(v_a,v_b)=0: res=true;else: res=false;fi;
+ free_vec(v_b);free_vec(v_a);
+ )
+ res
+enddef;
+
+% The next function finds the angle of a vector with respect to a plane.
+% Returns the angle of a vector |v| with respect to a plane |p|.
+vardef vangle_v_pl_(expr v)(text p)=
+ save v_a,an_;
+ hide(
+ new_vec(v_a);
+ % we compute a vector normal to the plane:
+ def_normal_p_(v_a)(p);
+ an_=90-vangle_v_v_(v,v_a);
+ free_vec(v_a);
+ )
+ an_
+enddef;
+
+% Compute the angle between two vectors
+% The angle is always between 0 and 180,
+% since this is the best one can do with two vectors.
+% If we had a third vector, we could be more accurate.
+vardef vangle_v_v_(expr va,vb)=
+ save cosa_,sina_;
+ hide(
+ cosa_=vec_dprod_(va,vb)/vec_mod_(va)/vec_mod_(vb);
+ if cosa_>1: % sometimes, this happens with rounding errors
+ sina_=0;
+ else:
+ sina_= 1 +-+ cosa_; % sqrt(1-cosa_**2)
+ fi;
+ )
+ angle((cosa_,sina_))
+enddef;
+
+% Define a plane with two lines:
+def def_plane_pl_l_l(text p)(text l)(text m)=
+ set_plane_(p)(l1,l2,1); % the last value is irrelevant
+ vec_diff_(p3,m2,m1);vec_sum_(p3,p3,l1);
+enddef;
+
+% Define the plane orthogonal to a line and going through a point
+% (not necessarily belonging to the plane):
+% the plane must already have been defined
+% |p|=plane, |l|=line, |i|=point
+%...
+% (absolute version)
+vardef def_orth_pl_l_p_(text p)(text l)(expr i)=
+ new_vec(va);new_vec(vb);new_vec(vc);new_vec(h);
+ vec_def_vec_(p1,i); % this is the first point of the plane
+ vec_diff_(va,l2,l1);
+ vec_def_vec_(vb,i);
+ if abs(xval(va))<absmin(yval(va),zval(va)):
+ vec_sum_(vb,vb,vec_I);
+ elseif abs(yval(va))<absmin(xval(va),zval(va)):
+ vec_sum_(vb,vb,vec_J);
+ else:vec_sum_(vb,vb,vec_K);
+ fi;
+ % now, |vb| is a point not on the line and not too close to it
+ % we compute a vertical to the line
+ def_vert_l_(h,vb)(l);
+ vec_diff_(vb,vb,h);vec_unit_(vb,vb);
+ vec_sum_(p2,vb,p1);
+ % |p[2]| is now a point of the plane
+ % a third point is obtained by cross product
+ vec_prod_(vc,va,vb);vec_unit_(vc,vc);vec_sum_(p3,vc,p1);
+ free_vec(h);free_vec(vc);free_vec(vb);free_vec(va);
+enddef;
+
+% (local version)
+vardef def_orth_pl_l_p(text p)(text l)(expr i)=
+ def_orth_pl_l_p_(p)(l)(pnt(i))
+enddef;
+
+% Line orthogonal to a plane and going through a point
+% (not necessarily belonging to the plane);
+% from the three points defining the plane, compute a normal,
+% and add it to the point, this gives a second point,
+% and make a line out of it
+% (absolute version)
+vardef def_orth_l_pl_p_(text l)(text p)(expr i)=
+ new_vec(va);new_vec(vb);
+ vec_def_vec_(l1,i);
+ def_normal_p_(l2)(p);
+ vec_sum_(l2,l2,l1);
+ free_vec(vb);free_vec(va);
+enddef;
+
+% (local version)
+vardef def_orth_l_pl_p(text l)(text p)(expr i)=
+ def_orth_l_pl_p_(l)(p)(pnt(i))
+enddef;
+
+% Unitary vector normal to a plane.
+% |v| is a vector that must have been defined
+% (absolute version)
+vardef def_normal_p_(expr v)(text p)=
+ new_vec(va);new_vec(vb);
+ vec_diff_(va,p2,p1);vec_diff_(vb,p3,p1);vec_prod_(v,va,vb);
+ vec_unit_(v,v);
+ free_vec(vb);free_vec(va);
+enddef;
+
+% Unitary vector normal to a plane (local version)
+vardef def_normal_p(expr v)(text p)=def_normal_p_(pnt(v))(p) enddef;
+
+% The following two functions are old versions of the
+% line/plane intersection. They are not used anymore.
+%
+% Intersection line/plane
+% Point |i| is the intersection
+% The return value is |true| if the intersection is a point,
+% |false| otherwise
+% (absolute version)
+vardef old_def_inter_p_l_pl_(expr i)(text l)(text p)=
+ save d,t,int;boolean int;
+ hide(
+ new_vec(va);new_vec(vb);new_vec(vc);
+ % first, we compute a vector normal to the plane
+ vec_diff_(va,p2,p1);
+ vec_diff_(vb,p3,p2);
+ vec_prod_(vc,va,vb);
+ % we want the plane equation as ax+by+cz+d=0
+ % the normal vector gives us (a,b,c)
+ % d is then easy to compute
+ d=-xval(vc)*xval(p1)-yval(vc)*yval(p1)-zval(vc)*zval(p1);
+ vec_diff_(i,l2,l1);
+ if vec_dprod_(i,vc)=0: % the line is parallel to the plane
+ int:=false;
+ else:
+ int:=true;
+ t=-(d+xval(vc)*xval(l1)+yval(vc)*yval(l1)+zval(vc)*zval(l1))
+ /vec_dprod_(i,vc);
+ vec_mult_(i,i,t);vec_sum_(i,i,l1);
+ fi;
+ free_vec(vc);free_vec(vb);free_vec(va);
+ )
+ int
+enddef;
+
+% same (local version)
+vardef old_def_inter_p_l_pl(expr i)(text l)(text p)=
+ def_inter_p_l_pl_(pnt(i))(l)(p)
+enddef;
+
+% Intersection line/plane (absolute version)
+% Point |i| is the intersection.
+% The return value is |true| if the intersection is a point,
+% |false| otherwise
+vardef def_inter_p_l_pl_(expr i)(text l)(text p)=
+ save int;boolean int;
+ hide(
+ new_points(loc)(3);
+ vec_diff_(loc1,p2,p1);vec_diff_(loc2,p3,p1);vec_prod_(loc3,loc1,loc2);
+ vec_diff_(loc1,p1,l1);vec_diff_(loc2,l2,l1);
+ if vec_dprod_(loc2,loc3)<>0:
+ vec_mult_(loc2,loc2,vec_dprod_(loc1,loc3)/vec_dprod_(loc2,loc3));
+ vec_sum_(i,l1,loc2);
+ int:=true;
+ % Remark: in order to prove that point |i| is on the plane, it
+ % suffices to compute vec(ci).(vec(cd) /\ vec(ce))
+ % =(-vec(ac)+vec(ai)).(vec(cd) /\ vec(ce))
+ % =-vec(ac).(vec(cd) /\ vec(ce))
+ % +(vec(ab).(vec(cd) /\ vec(ce))) vec(ac).(vec(cd) /\ vec(ce))
+ % ----------------------------
+ % vec(ab).(vec(cd) /\ vec(ce))
+ % =0
+ else: % the line is parallel to the plane
+ int:=false;
+ fi;
+ free_points(loc)(3);
+ )
+ int
+enddef;
+
+% Intersection line/plane (local version)
+vardef def_inter_p_l_pl(expr i)(text l)(text p)=
+ def_inter_p_l_pl_(pnt(i))(l)(p)
+enddef;
+
+% The following function is used in |def_inter_l_pl_pl|.
+% We could simplify it by breaking it in two.
+vardef def_inter_l_pl_pl_base_case_(text l)(expr pa,pb,pc)(text q)=
+ save trial;
+ new_line_(trial)(pa,pb);
+ if def_inter_p_l_pl_(l1)(trial)(q):
+ else: % there is no intersection or the intersection is the line
+ vec_def_vec_(trial1,pa);
+ mid_point_(trial2,pb,pc);
+ if def_inter_p_l_pl_(l1)(trial)(q):
+ else:
+ message "THIS SHOULD NOT HAPPEN, PLEASE REPORT THIS PROBLEM";
+ fi;
+ fi;
+ set_line_(trial)(pa,pc);
+ if def_inter_p_l_pl_(l2)(trial)(q):
+ else: % there is no intersection or the intersection is the line
+ vec_def_vec_(trial1,pa);
+ mid_point_(trial2,pb,pc);
+ if def_inter_p_l_pl_(l2)(trial)(q):
+ else:
+ message "THIS SHOULD NOT HAPPEN, PLEASE REPORT THIS PROBLEM";
+ fi;
+ fi;
+ free_line(trial);
+enddef;
+
+% Intersection of two planes.
+% TO DO: this function is not yet robust enough, because
+% unnecessary overflows can occur.
+% A boolean is set if there is no intersection.
+% The line |l| must already have been defined.
+vardef def_inter_l_pl_pl(text l)(text p)(text q)=
+ save trial,da,db,dc,int;boolean int;
+ hide(
+ % we first search the point of p1, p2, p3 which is the farthest
+ % from q;
+ da=dist_pl_(p1)(q);db=dist_pl_(p2)(q);dc=dist_pl_(p3)(q);
+ if (da=db) and (db=dc): % the two planes are parallel
+ int:=false;
+ else:
+ int:=true;
+ if (da>=db) and (da>=dc):
+ def_inter_l_pl_pl_base_case_(l)(p1,p2,p3)(q);
+ elseif (db>=da) and (db>=dc):
+ def_inter_l_pl_pl_base_case_(l)(p2,p1,p3)(q);
+ else:
+ def_inter_l_pl_pl_base_case_(l)(p3,p1,p2)(q);
+ fi;
+ fi;
+ )
+ int
+enddef;
+
+% Visual intersection between lines (jk) and (lm).
+% The computed intersection lies on (jk).
+% Returns true if there is an intersection, false otherwise.
+% (absolute version)
+vardef def_visual_inter_(expr i)(expr j,k,l,m)=
+ save pla,plb,la,lb,d,int;boolean int;
+ hide(
+ new_plane_(pla)(Obs,l,m);new_plane_(plb)(Obs,j,k);
+ new_line_(la)(0,0);new_line_(lb)(j,k);
+ if def_inter_l_pl_pl(la)(pla)(plb):
+ int:=true;
+ % |d| is the closest distance between lines |la| and |lb|
+ % We don't use |d| here, and are only interested in point |i|.
+ d=def_inter_p_l_l_(i)(la)(lb);
+ else:
+ int:=false;
+ fi;
+ free_line(lb);free_line(la);free_plane(plb);free_plane(pla);
+ ) int
+enddef;
+
+% same (local version)
+vardef def_visual_inter(expr i)(expr j,k,l,m)=
+ def_visual_inter_(pnt(i),pnt(j),pnt(k),pnt(l),pnt(m))
+enddef;
+
+% Point of a line at a given distance from a given point.
+% |i| = new point |d|=distance |j|=point |l|=line
+% $|d|>0$ or $|d|<0$ give two different points.
+% If there is an intersection, the function returns |true|;
+% otherwise it returns |false|.
+% (absolute version)
+vardef def_point_at_(expr i)(expr d)(expr j)(text l)=
+ save dj,ld,int;boolean int;
+ hide(
+ new_point(h);new_point(hc);
+ def_vert_l_(h,j)(l);
+ vec_diff_(hc,j,h);
+ if d*d-vec_dprod_(hc,hc)>=0: int:=true;
+ ld=sign(d)*sqrt(d*d-vec_dprod_(hc,hc));
+ vec_diff_(i,l1,l2);
+ vec_unit_(i,i);
+ vec_mult_(i,i,ld);
+ vec_sum_(i,i,h);
+ else: int:=false;
+ fi;
+ free_point(hc);
+ free_point(h);
+ )
+ int
+enddef;
+
+% same (local version)
+vardef def_point_at(expr i)(expr d)(expr j)(text l)=
+ def_point_at_(pnt(i))(d)(pnt(j))(l)
+enddef;
+
+% Define a vertical of a line.
+% Point |i| is obtained as the intersection of a vertical
+% starting from point |j| and reaching the line |l|.
+vardef def_vert_l_(expr i,j)(text l)=
+ new_points(loc)(3);
+ vec_diff_(loc1,j,l1);vec_diff_(loc2,l2,l1);
+ vec_mult_(loc3,loc2,vec_dprod_(loc1,loc2)/vec_dprod_(loc2,loc2));
+ vec_sum_(i,loc3,l1);
+ free_points(loc)(3);
+enddef;
+
+% Define a vertical. (local version)
+vardef def_vert_l(expr i,j)(text l)=
+ def_vert_l_(pnt(i),pnt(j))(l);
+enddef;
+
+% Vertical falling on a plane.
+% Point |j| falls on plane |p| at point |i| (absolute version)
+vardef def_vert_pl_(expr i)(expr j)(text p)=
+ save d;
+ new_vec(va);new_vec(vb);
+ def_normal_p_(va)(p);
+ vec_diff_(vb,j,p1);
+ d=-vec_dprod_(vb,va);
+ vec_mult_(va,va,d);
+ vec_sum_(vb,vb,va);
+ vec_sum_(i,p1,vb);
+ free_vec(vb);free_vec(va);
+enddef;
+
+% same (local version)
+vardef def_vert_pl(expr i)(expr j)(text p)=
+ def_vert_pl_(pnt(i))(pnt(j))(p)
+enddef;
+
+% Distance to a plane.
+% (absolute version)
+vardef dist_pl_(expr i)(text p)=
+ save d;
+ hide(
+ new_vec(va);
+ def_vert_pl_(va)(i)(p);
+ vec_diff_(va,va,i);
+ d=vec_mod_(va);
+ free_vec(va);
+ )
+ d
+enddef;
+
+% (local version)
+def dist_pl(expr i)(text p)=dist_pl_(pnt(i))(p) enddef;
+
+% Projections on planes or lines, according to a direction.
+% This one is very hazardous: use epsilon
+% Find point |i| on |l| from point |j| using direction |d|
+
+def def_proj_l_(expr i)(text l)(expr j)(text d)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_proj_l(expr i)(text l)(expr j)(text d)=
+ def_proj_l_(pnt(i))(l)(pnt(j))(d)
+enddef;
+
+% Find point |i| on |p| from point |j| using direction |d|.
+vardef def_proj_pl_(expr i)(text p)(expr j)(text d)=
+ save l_,int; boolean int;
+ hide(
+ % we compute the intersection between line (|j|+|d|) and plane |p|
+ new_line_(l_)(1,1); % we must take a name that cannot
+ % conflict with the text replacement of |d|
+ vec_diff_(l_2,d2,d1);vec_sum_(l_2,l_2,j);
+ vec_def_vec_(l_1,j);
+ if def_inter_p_l_pl_(i)(l_)(p):int=true;
+ else: int=false;
+ fi;
+ free_line(l_);
+ )
+ int
+enddef;
+
+def def_proj_pl(expr i)(text p)(expr j)(text d)=
+ def_proj_pl_(pnt(i))(p)(pnt(j))(d)
+enddef;
+
+% Central projection on a plane.
+def def_cproj_pl_(expr i)(text p)(expr j)(expr k)=
+% use |def_proj_p|
+ NOT YET IMPLEMENTED
+enddef;
+
+% Central projection on a plane.
+def def_cproj_pl(expr i)(text p)(expr j)(expr k)=
+ def_cproj_pl_(pnt(i))(p)(pnt(j))(pnt(k))
+enddef;
+
+
+% Intersection of two lines (hazardous).
+% Due to rounding errors, two lines that should intersect
+% may not do so in reality. Therefore,
+% we compute the point which is the middle of the two
+% closest points between the lines and return the distance
+% between the two lines. If the lines are parallel (possibly
+% identical), we return -1.
+vardef def_inter_p_l_l_(expr i)(text l)(text m)=
+ save ga,gb,gc,gd,ge,gf,t,u,d,mx;
+ hide(
+ new_point(va);new_point(vb);new_point(vc);new_point(h);new_point(k);
+ vec_diff_(va,m1,l1);
+ vec_diff_(vb,l2,l1);
+ vec_diff_(vc,m2,m1);
+ ga=vec_dprod_(vc,vb);gb=-vec_dprod_(vb,vb);
+ gc=vec_dprod_(va,vb);gd=vec_dprod_(vc,vc);
+ ge=-ga;gf=vec_dprod_(va,vc);
+ % compute the max of ga,gb,...
+ mx:=absmax(ga,gb);mx:=absmax(mx,gc);mx:=absmax(mx,gd);mx:=absmax(mx,ge);
+ mx:=absmax(mx,gf);
+ ga:=ga/mx;gb:=gb/mx;gc:=gc/mx;gd:=gd/mx;ge:=ge/mx;gf:=gf/mx;
+ if ga*ge=gb*gd: % the lines are parallel
+ % we return -1
+ d=-1;
+ else:
+ t=(gc*gd-ga*gf)/(ga*ge-gb*gd);u=(gb*gf-gc*ge)/(ga*ge-gb*gd);
+ vec_diff_(h,l2,l1);vec_mult_(h,h,t);vec_sum_(h,h,l1);
+ vec_diff_(k,m2,m1);vec_mult_(k,k,u);vec_sum_(k,k,m1);
+ % |h| and |k| are now the closest points
+ % we set |i| to the middle of |h| and |k| and return the distance |hk|
+ mid_point_(i,h,k);
+ vec_diff_(h,h,k);d=vec_mod_(h);
+ fi;
+ free_point(k);free_point(h);free_point(vc);free_point(vb);free_point(va);
+ )
+ d
+enddef;
+
+def def_inter_p_l_l(expr i)(text l)(text m)=
+ def_inter_p_l_l_(pnt(i))(l)(m)
+enddef;
+
+% Find point |i| symmetric of point |j| with respect to point |k|
+def def_sym_(expr i)(expr j)(expr k)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_sym(expr i)(expr j)(expr k)=
+ def_sym_(pnt(i))(pnt(j))(pnt(k))
+enddef;
+
+% Find point |i| symmetric of point |j| with respect to plane |p|
+def def_sym_pl_(expr i)(expr j)(text p)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_sym_pl(expr i)(expr j)(text p)=
+ def_sym_pl_(pnt(i))(pnt(j))(p)
+enddef;
+
+% Find point |i| symmetric of point |j| with respect to line |l|.
+% That's a mere 180 degrees rotation around the line.
+def def_sym_l_(expr i)(expr j)(text l)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_sym_l(expr i)(expr j)(text l)=
+ def_sym_l_(pnt(i))(pnt(j))(l)
+enddef;
+
+
+% Intersection circle/line (hazardous).
+% If some intersection does not exist, |infty| is put for its values
+def def_inter_p_p_c_l_(expr i,j)(text c)(text l)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_inter_p_p_c_l(expr i,j)(text c)(text l)=
+ def_inter_p_p_c_l_(pnt(i),pnt(j))(c)(l)
+enddef;
+
+% circle/plane
+% A similar coding will distinguish the four cases:
+% one point, two points, the full circle, nothing
+def def_inter_p_p_c_pl_(expr i,j)(text c)(text p)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_inter_p_p_c_pl(expr i,j)(text c)(text p)=
+ def_inter_p_p_c_pl_(pnt(i),pnt(j))(c)(p)
+enddef;
+
+% circle/circle
+% A similar coding will distinguish the four cases:
+% one point, two points, the full circle, nothing
+def def_inter_p_p_c_c_(expr i,j)(text ca)(text cb)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_inter_p_p_c_c(expr i,j)(text ca)(text cb)=
+ def_inter_p_p_c_c_(pnt(i),pnt(j))(ca)(cb)
+enddef;
+
+% Computation of tangent lines and planes.
+
+% Tangent line to a circle at a given point.
+def def_tang_l_c_p_(text l)(text c)(expr i)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_tang_l_c_p(text l)(text c)(expr i)=
+ def_tang_l_c_p_(l)(c)(pnt(i))
+enddef;
+
+% Tangent plane to a sphere at a given point.
+def def_tang_pl_s_p_(text p)(text s)(expr i)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_tang_pl_s_p(text p)(text s)(expr i)=
+ def_tang_pl_s_p_(p)(s)(pnt(i))
+enddef;
+
+% Sphere defined by four non-coplanar points.
+def def_sphere_through_(text s)(expr i,j,k,l)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_sphere_through(text s)(expr i,j,k,l)=
+ def_sphere_through_(s)(pnt(i),pnt(j),pnt(k),pnt(l))
+enddef;
+
+% Line going through a point and parallel to another line.
+def def_parallel_l_p_pl_(text l)(expr i)(text m)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_parallel_l_p_pl(text l)(expr i)(text m)=
+ def_parallel_l_p_pl_(l)(pnt(i))(m)
+enddef;
+
+% Plane going through a point and parallel to another plane.
+def def_parallel_pl_p_pl_(text p)(expr i)(text q)=
+ NOT YET IMPLEMENTED
+enddef;
+
+def def_parallel_pl_p_pl(text p)(expr i)(text q)=
+ def_parallel_pl_p_pl_(p)(pnt(i))(q)
+enddef;
+
+def def_rectangle_one_side_(expr p)(text l)(text pa)(text pb)(text pc)=
+ if def_inter_l_pl_pl(l)(pb)(pc):
+ else:
+ message "YOUR PLANES ARE NOT WELL SPECIFIED 1";
+ fi;
+ if def_inter_p_l_pl_(p)(l)(pa):
+ else:
+ message "YOUR PLANES ARE NOT WELL SPECIFIED 2";
+ fi;
+enddef;
+
+% A rectangle (for instance representing a plane) can be defined
+% from five planes; the rectangle is made of four points (corners)
+% |pa| is the plane containing the rectangle
+vardef def_rectangle_pl_pl_pl_pl_pl_(expr ca,cb,cc,cd)
+ (text pa)(text pb)(text pc)(text pd)(text pe)=
+ save l;
+ new_line_(l)(1,1);
+ def_rectangle_one_side_(ca)(l)(pa)(pb)(pc);
+ def_rectangle_one_side_(cb)(l)(pa)(pc)(pd);
+ def_rectangle_one_side_(cc)(l)(pa)(pd)(pe);
+ def_rectangle_one_side_(cd)(l)(pa)(pe)(pb);
+ free_line(l);
+enddef;
+
+% Instead of using four additional planes, one can also use eight points:
+% the order of the point is important.
+vardef def_rectangle_pl_(expr ca,cb,cc,cd)
+ (text pa)(expr pta,ptb,ptc,ptd,pte,ptf,ptg,pth)=
+ save pb,pc,pd,pe;
+ % we create the four additionnal planes
+ new_plane_(pb)(pta,ptb,pte);new_plane_(pc)(ptb,ptc,ptf);
+ new_plane_(pd)(ptc,ptd,ptg);new_plane_(pe)(ptd,pta,pth);
+ def_rectangle_pl_pl_pl_pl_pl_(ca,cb,cc,cd)(pa)(pb)(pc)(pd)(pe);
+ free_plane(pe);free_plane(pd);free_plane(pc);free_plane(pb);
+enddef;
+
+def draw_rectangle(expr i,j,k,l)=
+ draw_line(i,j);draw_line(j,k);draw_line(k,l);draw_line(l,i);
+enddef;
+
+numeric mark_h,mark_l;mark_h=2mm;mark_l=1mm;
+
+def draw_one_mark(expr p,a)=
+ draw (p+unitvector(dir(a))*mark_h/2)--(p-unitvector(dir(a))*mark_h/2);
+enddef;
+
+% Draw |n| marks between points |i| and |j|.
+% |i| and |j| are local points and there is no absolute version
+% since this is a drawing function.
+vardef draw_equal_marks(expr i,j,n)=
+ save a,k,l,start;
+ a=angle(z[ipnt_(j)]-z[ipnt_(i)])+90;
+ l=(x[ipnt_(j)]-x[ipnt_(i)])++(y[ipnt_(j)]-y[ipnt_(i)]);
+ if n=1:
+ draw_one_mark(.5[z[ipnt_(i)],z[ipnt_(j)]],a);
+ elseif n>1:
+ start=0.5-(n-1)*mark_l/(2*l);
+ for k:=0 upto n-1:
+ draw_one_mark((start+k*mark_l/l)[z[ipnt_(i)],z[ipnt_(j)]],a);
+ endfor;
+ else: message "parameter " & decimal n & " should be positive";
+ fi;
+enddef;
+
+numeric square_angle_size;
+square_angle_size=0.2;
+
+% (absolute version)
+def def_right_angle_(expr pi,pj,pk,i,j,k)=
+ vec_diff_(pj,j,i);vec_diff_(pk,k,i);
+ if vec_mod_(pj)>0:
+ vec_mult_(pj,pj,square_angle_size/vec_mod_(pj));
+ fi;
+ if vec_mod_(pk)>0:
+ vec_mult_(pk,pk,square_angle_size/vec_mod_(pk));
+ fi;
+ vec_sum_(pi,i,pj);vec_sum_(pi,pi,pk);
+ vec_sum_(pj,pj,i);vec_sum_(pk,pk,i);
+enddef;
+
+% (local version)
+def def_right_angle(expr pi,pj,pk,i,j,k)=
+ def_right_angle_(pnt(pi),pnt(pj),pnt(pk),pnt(i),pnt(j),pnt(k));
+enddef;
+
+% Right angle on a plane projection.
+% Similar to |def_right_angle_|.
+% This also defines the vertical projection as |vp|.
+vardef def_right_angle_p_(expr pi,pj,pk,vp)(expr i)(text p)=
+ def_vert_pl_(vp)(i)(p);
+ new_vec(va);
+ vec_diff_(va,p1,p2);
+ vec_sum_(va,va,vp); % va is now a second point on the plane,
+ % different from the projection
+ def_right_angle_(pi,pj,pk,vp,va,i);
+ free_vec(va);
+enddef;
+
+def draw_right_angle(expr pi,pj,pk)=
+ draw z[ipnt_(pj)]--z[ipnt_(pi)]--z[ipnt_(pk)];
+enddef;
+
+def draw_double_right_angle(expr pi,pj,pk,pl)=
+ draw z[ipnt_(pj)]--z[ipnt_(pi)]--z[ipnt_(pk)]--z[ipnt_(pl)]--cycle;
+enddef;
+
+% |draw_line| with extra drawing in either directions
+def draw_line_extra(expr i,j)(expr exi,exj)=
+ draw exi[z[ipnt_(i)],z[ipnt_(j)]]--exj[z[ipnt_(i)],z[ipnt_(j)]];
+enddef;
+
+% defines point |i| at position |t| on segment |a|-|b| (absolute version)
+def set_extra_point_(expr i,a,b,t)=
+ vec_diff_(i,b,a);vec_mult_(i,i,t);vec_sum_(i,i,a);
+enddef;
+
+% defines point |i| at position |t| on segment |a|-|b| (local version)
+def set_extra_point(expr i,a,b,t)=
+ set_extra_point_(pnt(i),pnt(a),pnt(b),t);
+enddef;
+
+% labels with local points
+vardef thelabel_obj@#(expr s,n) =
+ thelabel.@#(s,z[ipnt_(n)])
+enddef;
+
+def label_obj = draw thelabel_obj enddef;
+
+% The plane |p| (which must have been initialized) is defined
+% as the screen plane. This is useful for computing vanishing points
+def def_screen_pl(text p)=
+ vec_mult_(p1,ObsI_,Obs_dist);vec_sum_(p1,p1,Obs); % center of screen
+ vec_sum_(p2,p1,ObsJ_);vec_sum_(p3,p1,ObsK_);
+enddef;
+
+% |i| is the resulting point, |l| defines a line in space,
+% |s| is the screen plane
+% Returns |true| is there is a vanishing point, otherwise |false|.
+vardef def_vanishing_point_p_l_pl_(expr i)(text l)(text s)=
+ save vp;boolean vp;
+ hide(
+ new_vec(v);
+ vec_diff_(v,l2,l1);vec_sum_(v,Obs,v);
+ new_line_(obsl)(Obs,v);
+ if def_inter_p_l_pl_(i)(obsl)(s):vp=true;else:vp=false;fi;
+ free_line(obsl);
+ free_vec(v);
+ )
+ vp
+enddef;
+
+def def_vanishing_point_p_l_pl(expr i)(text l)(text s)=
+ def_vanishing_point_p_l_pl_(pnt(i))(l)(s)
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/3dpoly.mp b/graphics/metapost/contrib/macros/mp3d/inputs/3dpoly.mp
new file mode 100644
index 0000000000..5d3b8f5f2f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/3dpoly.mp
@@ -0,0 +1,294 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\def\vc#1{$\vcenter{#1}$}
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3DPOLY.MP: DEFINITION OF REGULAR CONVEX POLYHEDRA IN METAPOST}}
+
+%% version 1.34, 17 August 2003
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+%%
+%%This package defines the five regular convex polyhedra classes and
+%%must be used with the {\bf 3d} package.
+
+if known three_d_poly_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3dpoly, v1.34 (c) D. Roegel, 17 August 2003 ***";
+numeric three_d_poly_version;
+three_d_poly_version=1.34;
+
+%%Each object definition is parameterized by
+%%an instance identification.
+
+%%All polyhedra are normalized (centered on the origin and inscriptible
+%%in a sphere of radius 1).
+
+%%The polyhedra are defined with a certain number of points and faces.
+%%The points comprise both the vertices and the center of the object.
+
+%%It might be useful to remind the Euler formula linking
+%%the number of faces $f$,
+%%vertices $v$ and edges $e$ in polyhedra with no hole in dimension 3:
+%%$f+v-e=2$. This can be verified in the following table:
+
+%%\centerline{\vbox{\halign{\quad#\hfil\quad&&\quad\hfil#\quad\cr
+%% \omit \hfil type\hfil&\omit\hfil faces\hfil
+%% &\omit\hfil vertices\hfil&\omit\hfil edges\hfil\cr
+%% tetrahedron&4&4&6\cr
+%% cube&6&8&12\cr
+%% octahedron&8&6&12\cr
+%% dodecahedron&12&20&30\cr
+%% icosahedron&20&12&30\cr}}}
+
+%%For more details, see the documentation enclosed in the distribution.
+
+%%\newpage\title{TETRAHEDRON (4 faces)\kern1cm\epsfbox{tetra.ps}}
+
+%% Construction of a tetrahedron:
+
+%% One face is \vc{\epsfbox{vect-fig.1}} with $h=c\sqrt{3}/2$
+
+%% The angle $\alpha$ between two faces is given by
+%% $\sin(\alpha/2)={\displaystyle c/2\over \displaystyle c\sqrt{3}/2}=1/\sqrt3$
+
+%% \figure{vect-fig.2}
+
+def set_tetrahedron_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(1,0,0);
+ set_point(3)(cosd(60),sind(60),0);% $60=360/6$
+ sinan=1/sqrt(3);cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_point(5)(0,0,0);% center of tetrahedron
+enddef;
+
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);% 4 vertices and the center
+ new_obj_faces(inst,4);% 4 faces in the definition
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+
+%%\newpage\title{CUBE (HEXAHEDRON) (6 faces)\kern1cm\epsfbox{cube.ps}}
+
+%%The definition of a cube is straightforward.
+
+def set_cube_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(1,0,0);
+ set_point(3)(1,1,0);
+ set_point(4)(0,1,0);
+ set_point(5)(0,0,1);
+ set_point(6)(1,0,1);
+ set_point(7)(1,1,1);
+ set_point(8)(0,1,1);
+ normalize_obj(inst)(1,7);% 1 and 7 are opposite vertices
+ set_point(9)(0,0,0);% center of cube
+enddef;
+
+vardef def_cube(expr inst)=
+ new_obj_points(inst,9);% 8 vertices and the center
+ new_obj_faces(inst,6);% 6 faces in the definition
+ set_cube_points(inst);
+ set_obj_face(1,"1,2,6,5","b4fe40");
+ set_obj_face(2,"2,3,7,6","45d040");
+ set_obj_face(3,"4,8,7,3","45a114");
+ set_obj_face(4,"1,5,8,4","45a1d4");
+ set_obj_face(5,"5,6,7,8","4569d4");
+ set_obj_face(6,"4,3,2,1","112da1");
+enddef;
+
+
+%%\newpage\title{OCTAHEDRON (8 faces)\kern1cm\epsfbox{octa.ps}}
+
+%% A section of a pyramid is: \vc{\epsfbox{vect-fig.3}}
+
+%% The height of this pyramid is given
+%% by $H^2={(c\sqrt3/2)}^2-{(c/2)}^2=c^2/2$, hence $H=c/\sqrt2$
+
+def set_octahedron_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(1,0,0);
+ set_point(3)(1,1,0);
+ set_point(4)(0,1,0);
+ set_point(5)(.5,.5,1/sqrt(2));
+ set_point(6)(.5,.5,-1/sqrt(2));
+ normalize_obj(inst)(5,6);% 5 and 6 are opposite vertices
+ set_point(7)(0,0,0);% center of octahedron
+enddef;
+
+vardef def_octahedron(expr inst)=
+ new_obj_points(inst,7);% 6 vertices and the center
+ new_obj_faces(inst,8);% 8 faces in the definition
+ set_octahedron_points(inst);
+ set_obj_face(1,"1,2,5","b4fefe");
+ set_obj_face(2,"2,3,5","45d040");
+ set_obj_face(3,"3,4,5","4569d4");
+ set_obj_face(4,"4,1,5","b49bc0");
+ set_obj_face(5,"6,1,4","45a1d4");
+ set_obj_face(6,"6,2,1","b4c8fe");
+ set_obj_face(7,"6,3,2","b49b49");
+ set_obj_face(8,"6,4,3","112da1");
+enddef;
+
+
+%%\newpage\title{DODECAHEDRON (12 faces)\kern1cm\epsfbox{dodeca.ps}}
+
+%% Two adjacent faces (pentagons) of the dodecahedron are as follows:
+%%\figure{vect-fig.13}
+%% The angle between the faces is the angle between $\overrightarrow{OA}$
+%% and $\overrightarrow{OB}$.
+%% $OA=OB=d_3$ as defined in \figure{vect-fig.14}
+%% $d_1=2r\sin(\pi/5)$, $d_2=2r\sin(2\pi/5)$
+%% and $d_3=d_1\sin(2\pi/5)=2r\sin(\pi/5)\sin(2\pi/5)$
+%%
+%% The angle $\alpha$ is defined by the following conditions:
+%% \figure{vect-fig.15}
+%% Thus $d_2^2=d_3^2+d_3^2-2d_3^2\cos\alpha$, which leads to
+%% $\cos\alpha=1-{\displaystyle d_2^2\over\displaystyle2d_3^2}
+%% =-{\displaystyle\cos(2\pi/5)\over\displaystyle2\sin^2(\pi/5)}$
+%%\newpage
+
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point_(fc1,0,0,0);set_point(1)(1,0,0);
+ set_point(2)(cosd(72),sind(72),0);% 72=360/5
+ rotate_in_plane(3,fc1,1,2);
+ rotate_in_plane(4,fc1,2,3);
+ rotate_in_plane(5,fc1,3,4);
+ cosan=-cosd(72)/(2*sind(36)*sind(36));sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_abs_face_point(fc2,fc1,1,2,an);
+ new_abs_face_point(fc3,fc1,2,3,an);
+ new_abs_face_point(fc4,fc1,3,4,an);
+ new_abs_face_point(fc5,fc1,4,5,an);
+ new_abs_face_point(fc6,fc1,5,1,an);
+ rotate_in_plane(6,fc2,2,1);
+ rotate_in_plane(7,fc2,1,6);
+ rotate_in_plane(8,fc2,6,7);
+ rotate_in_plane(9,fc3,2,8);
+ rotate_in_plane(10,fc3,8,9);
+ rotate_in_plane(11,fc4,3,10);
+ rotate_in_plane(12,fc4,10,11);
+ rotate_in_plane(13,fc5,4,12);
+ rotate_in_plane(14,fc5,12,13);
+ rotate_in_plane(15,fc6,5,14);
+ new_abs_face_point(fc7,fc2,6,7,an);
+ new_abs_face_point(fc8,fc3,8,9,an);
+ new_abs_face_point(fc9,fc4,10,11,an);
+ new_abs_face_point(fc10,fc5,12,13,an);
+ rotate_in_plane(16,fc7,6,15);
+ rotate_in_plane(17,fc7,15,16);
+ rotate_in_plane(18,fc8,7,17);
+ rotate_in_plane(19,fc9,9,18);
+ rotate_in_plane(20,fc10,11,19);
+ normalize_obj(inst)(2,20);% opposite vertices
+ set_point(21)(0,0,0);% center of dodecahedron
+ free_points(fc)(10);
+enddef;
+%%\newpage
+vardef def_dodecahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,21);% 21 points in the definition
+ new_obj_faces(inst,12);% 12 faces in the definition
+ set_dodecahedron_points(inst);
+ set_obj_face(1,"5,4,3,2,1","ff0fa1");
+ set_obj_face(2,"8,7,6,1,2","b40000");
+ set_obj_face(3,"10,9,8,2,3","b49b49");
+ set_obj_face(4,"12,11,10,3,4","b49bc0");
+ set_obj_face(5,"14,13,12,4,5","b4c8fe");
+ set_obj_face(6,"6,15,14,5,1","b4fefe");
+ set_obj_face(7,"6,7,17,16,15","b4fe40");
+ set_obj_face(8,"8,9,18,17,7","45d040");
+ set_obj_face(9,"10,11,19,18,9","45a114");
+ set_obj_face(10,"11,12,13,20,19","45a1d4");
+ set_obj_face(11,"14,15,16,20,13","4569d4");
+ set_obj_face(12,"16,17,18,19,20","112da1");
+enddef;
+
+%%\newpage\title{ICOSAHEDRON (20 faces)\kern1cm\epsfbox{icosa.ps}}
+
+%%Two faces of an icosahedron are linked in the following way:
+
+%% \vc{\epsfbox{vect-fig.4}} where $h=c\sqrt3/2$
+
+%% $d$ is also a diagonal in a pentagon: \vc{\epsfbox{vect-fig.5}}
+
+%% $c=2r\sin(\pi/5)$,
+%% $d=2r\sin(2\pi/5)=2c\cos(\pi/5)$
+
+%% The angle between two faces is computed as follows:
+%% \vc{\epsfbox{vect-fig.6}}
+
+%% We have ${(2\cos(\pi/5))}^2=2{(\sqrt3/2)}^2-2{(\sqrt3/2)}^2\cos\alpha$
+
+%% Thus $cos\alpha=1-{8\over3}\cos^2(\pi/5)$
+%%\newpage
+
+def set_icosahedron_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(1,0,0);
+ set_point(3)(cosd(60),sind(60),0);% 60=360/6
+ cosan=1-8/3*cosd(36)*cosd(36);sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ normalize_obj(inst)(1,10);% opposite vertices
+ set_point(13)(0,0,0);% center of icosahedron
+enddef;
+
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);% 12 vertices and the center
+ new_obj_faces(inst,20);% 20 faces in the definition
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+
+%%\newpage\title{General draw functions}
+
+def draw_polyhedron(expr name)=
+ draw_faces(name);
+enddef;
+
+let draw_tetrahedron=draw_polyhedron;
+let draw_cube=draw_polyhedron;
+let draw_octahedron=draw_polyhedron;
+let draw_dodecahedron=draw_polyhedron;
+let draw_icosahedron=draw_polyhedron;
+
+let new_poly=assign_obj;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/3dutil.mp b/graphics/metapost/contrib/macros/mp3d/inputs/3dutil.mp
new file mode 100644
index 0000000000..e83f5f18c0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/3dutil.mp
@@ -0,0 +1,37 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3DUTIL.MP: 3D UTILITIES IN METAPOST}}
+
+%% version 1.34, 17 August 2003
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+% This package provides some basic functions used in certain
+% files of the 3d package.
+
+if known three_d_util_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3dutil, v1.34 (c) D. Roegel 17 August 2003 ***";
+numeric three_d_util_version; three_d_util_version:=1.34;
+
+% maybe this exists?
+def sign(expr n)=
+ (if n>=0: 1 else: -1 fi)
+enddef;
+
+%
+def absmin(expr v,w)=
+ (if abs(v)<=abs(w):abs(v) else: abs(w) fi)
+enddef;
+
+%
+def absmax(expr v,w)=
+ (if abs(v)>abs(w):abs(v) else: abs(w) fi)
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/animpoly.mp b/graphics/metapost/contrib/macros/mp3d/inputs/animpoly.mp
new file mode 100644
index 0000000000..9930095005
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/animpoly.mp
@@ -0,0 +1,35 @@
+% Animation of polyhedra
+% Example of use of 3d and poly packages
+% METAPOST
+% Denis Roegel, 17 August 2003
+
+% package 3d
+input 3d
+
+% polyhedra definitions
+input 3dpoly
+
+% animations
+input 3danim
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+%
+%show_animation_parameters:=true; % default value is |false|
+
+% animations
+%animate_object("tetrahedron",1,100,100);
+%animate_object("cube",1,100,100);
+%animate_object("octahedron",1,100,100);
+%animate_object("dodecahedron",1,100,100);
+%animate_object("icosahedron",1,100,100);
+%animate_two_objects("dodecahedron","icosahedron",1,100,100);
+animate_three_objects("dodecahedron","icosahedron","octahedron",1,100,100);
+%animate_two_identical_objects("dodecahedron",1,100,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/inputs/create_animation.sh b/graphics/metapost/contrib/macros/mp3d/inputs/create_animation.sh
new file mode 100644
index 0000000000..e99ca7383c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/inputs/create_animation.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+/bin/rm -f animpoly.log
+for i in `ls animpoly.*| grep 'animpoly.[0-9]'`;do
+echo $i
+echo '=============='
+awk < $i '{print} /^%%Page: /{print "142 123 translate\n"}' > $i.ps
+gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE -r36 -sOutputFile=$i.ppm -q -- $i.ps
+/bin/rm -f $i.ps
+ppmquant 32 $i.ppm | pnmcut 0 114 141 307 | ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif
+/bin/rm -f $i.ppm
+done
+/bin/rm -f animpoly.gif
+gifmerge -10 -l1000 animpoly.*.gif > animpoly.gif
+/bin/rm -f animpoly.*.gif
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/Changes b/graphics/metapost/contrib/macros/mp3d/v1.0/Changes
new file mode 100644
index 0000000000..ba0d5a638d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/Changes
@@ -0,0 +1,139 @@
+% 3d.mp, poly.mp : changes
+% ----------------------------------------------------------------------------
+% D. Roegel, 12/2/1997: tetrahedron animation
+% 17/2/1997: cleaning, introduction of local vectors
+% dodecahedron animation
+% 18/2/1997: correction of a bug in |set_point|
+% hidden faces implemented
+% 19/2/1997: icosahedron animation
+% 20/2/1997: cube and octahedron animation
+% code cleaned and simplified
+% |rotate_vect| made more general
+% rotation and translation of an object
+% addition of figures for the polyhedra
+% 21/2/1997: addition of figures explaining the computations
+% 23/2/1997: cleaning and corrections
+% 24/2/1997: additionnal figures
+% |rotate_vect| renamed in |vect_rotate|
+% |pnt| can now only be used locally.
+% several variables made private
+% computation of the bounding box of an animation
+% |beginview| and |endview|
+% |set_points| renamed |project_object|
+% |set_point| renamed |project_point|
+% parameters for PS translation and pnmcut
+% |mult_object| added
+% The standard convex polyhedra are now centered
+% and normalized.
+% Automatic generation of a shell script
+% 25/2/1997: |normalize_object| corrected to take into
+% account a set of points, and not all the points
+% of an object.
+% Introduction of |hexcolor|.
+% Code splitted in three files: 3d.mp, poly.mp
+% and driver.
+% Additional figures for the dodecahedron
+% 26/2/1997: list of object points removed and replaced
+% by the last number.
+% |errmessage| added
+% |vtmp| changed in |v_|
+% |write_script| slightly simplified
+% Code and documentation cleaned.
+% 27/2/1997: |write_script| made more general
+% new figure for the observer's orientation
+% Euler angles are now no longer mentioned.
+% Angle parameters added to |compute_reference|
+% |compute_perspective| added
+% |draw_point| added
+% |draw_axes| added
+% v 0.96 28/2/1997: sign of theta in |compute_perspective| changed
+% v 0.97 correction to |write_script|
+% addition of |pnt_obj|
+% addition of |def_object|
+% |rotate_object| renamed in |rotate_object_p_v|
+% addition of |rotate_object_p_p|
+% addition of |animate_two_objects|
+% generation of dodecahedron+icosahedron animation
+% v 0.972 3-4/3/1997: objects have now been elevated to classes;
+% poly.mp contains parameterized definitions
+% of classes of polyhedra.
+% Many macros have been adapted. It is now possible
+% to use several instances of the same class of
+% objects.
+% v 0.973 5/3/1997: faces are now declared in arrays, which makes
+% their manipulation easier. Also, color arrays.
+% Introduction of |set_face| and |draw_faces|
+% v 0.974 10/3/1997: faces and color arrays have been extended to keep
+% the informations of all faces of all objects
+% v 0.975 11/3/1997: various simplifications, addition of |obj_name|
+% computing an object name from an index.
+% Addition of |obs_distance|
+% |draw_...| functions removed in poly.mp
+% v 0.976 12/3/1997: an example with three objects
+% v 0.977 14/3/1997: ppmquant, pnmcut and ppmtogif replaced by mogrify
+% v 0.978 17/3/1997: |reset_object|, |put_object|,
+% and |rotate_object_abs_p_v| introduced
+% |def_object| merged in |assign_object|
+% drawing of points separated in the polyhedra,
+% in order to be able to reset the positions.
+% v 0.979 20/3/1997: overflow handling added,
+% introduction of field of view parameters (|h_field| and
+% |v_field|)
+% v 0.98 21/3/1997: new figure and some slight corrections
+% v 0.981 25/4/1997: when |filled_faces| is false, hidden edges are
+% drawn dashed.
+% v 0.982 25/4/1997: |drawhidden| parameter added to |draw_face|
+% v 0.983 28/4/1997: |set_face| uses now local points
+% |set_obj_point| for local points
+% |rotate_in_plane| uses now local points
+% |get_next_face_point| renamed in |next_face_point|
+% |next_face_point| uses now local points
+% |pnt| and |face| removed from poly.mp
+% |set_face| renamed |set_obj_face| to be consistent
+% with |set_obj_point|
+% v 0.984 1/5/1997: |rotate_object_abs_p_v| renamed |rotate_object_abs_pv|
+% |rotate_object_p_v| renamed |rotate_object_pv|
+% (reason: avoid overfull hboxes in paper)
+% All |_inst| macros removed since they were not
+% necessary.
+% |next_face_point| renamed in |new_face_point|
+% v 0.985 2/5/1997: |three_d_loaded| renamed |three_d_version|
+% and holds the version number.
+% v 0.986 2/5/1997: code cleaned.
+% v 0.987 12/5/1997: various small improvements suggested by Ulrik Vieth
+% v 0.988 13/5/1997: introduction of 10 ancillary points in the dodecahedron
+% only 21 points are now available (20 vertices + center)
+% |free_point| introduced, as well as variants
+% of |new_face_point| and |rotate_in_plane| to cope
+% with the ancillary points.
+% v 0.989 16/5/1997: |new_tmp_points|, |free_tmp_points|
+% |new_face_point_abs| renamed into |new_abs_face_point|
+% |rotate_in_plane| removed
+% |rotate_in_plane_abs| renamed into |rotate_in_plane|
+% paper.tex brought up to date.
+% v 0.990 17/5/1997: |new_points| renamed |new_obj_points|
+% |new_faces| renamed |new_obj_faces|
+% |new_tmp_points| renamed |new_points|
+% |free_tmp_points| renamed |free_points|
+% paper.tex brought up to date.
+% v 0.991 18/5/1997: the following changes were done to for formatting
+% reasons in the TUGboat paper.
+% |middle_point| renamed |mid_point|
+% |rotate_object...| renamed |rotate_obj...|
+% |assign_object| renamed |assign_obj|
+% |reset_object| renamed |reset_obj|
+% |put_object| renamed |put_obj|
+% |scale_object| renamed |scale_obj|
+% |translate_object| renamed |translate_obj|
+% syntax of |obs_distance| changed to take a first
+% `text' parameter.
+% v 0.992 23/5/1997: some cosmetic changes by Ulrik Vieth,
+% for better formatting with mft.
+% |def_object| renamed |def_obj|.
+% Code formatted with the meta-mode.el emacs package.
+%
+% v 0.993 29/5/1997: several "object" renamed "obj"; corrected in the paper.
+% slight changes in the paper.
+% v 0.994 30/10/1997: |draw_contours| added after suggestion by Denis Barbier
+% v 1.0 8/ 4/1998: final spit for TUGboat article
+% ----------------------------------------------------------------------------
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/README b/graphics/metapost/contrib/macros/mp3d/v1.0/README
new file mode 100644
index 0000000000..f6622dc279
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/README
@@ -0,0 +1,86 @@
+ 3D animations in METAPOST (version 1.0, superseded)
+ ===================================================
+
+This directory contains a set of files allowing the creation
+of animations in metapost, and especially animations of 3-dimensional
+objects, such as polyhedra.
+
+The files contained in this distribution are:
+
+Changes History of the macros
+
+inputs:
+ 3d.mp 3D macros
+ poly.mp Polyhedra definitions
+ animpoly.mp Example of animation driver
+
+contrib Contributions (currently only by Denis Barbier)
+
+doc Subdirectory containing the formatted metapost files
+ as well as the code for the figures
+ It uses Ulrik Vieth's formatting macros for mft.
+ There is also a paper describing
+ how an animation can be created.
+
+examples Some animations produced with the 3d package
+ (other examples are in the contrib directory)
+
+tugboat Files used for the production of the TUGboat paper.
+ (Courtesy of Mimi Burbank.)
+
+README This file
+
+README.bin Explains where to find the binaries.
+
+
+HOW TO CREATE AN ANIMATION
+--------------------------
+
+Details are given to produce the standard animation
+under UNIX, with the binaries listed in README.bin.
+For other architectures, you may have to adapt the
+write_script macro in the 3d.mp file.
+
+ 1) create a directory and copy the three .mp files from the
+ inputs directory to it.
+ 2) apply metapost to animpoly.mp ; this will create 100 files
+ named animpoly.101, animpoly.102, ..., animpoly.200.
+ It will also have created a script file named
+ create_animation.sh
+ 3) copy the gifmerge utility (as well as programs such as pnmcut,...)
+ in this directory or let it be reachable through PATH.
+ 4) apply sh to create_animation.sh; this will create the animation;
+ first the metapost outputs are converted to gif, then
+ they are collated with gifmerge.
+ 5) the result is animpoly.gif which is a GIF89A animation file;
+ it can be viewed under netscape or simply with a program like xanim.
+
+Denis Roegel (roegel@loria.fr) 8 April 1998
+============================================================================
+
+ Binaries required by the 3D package
+ -----------------------------------
+
+As it is, the generation of animated gifs requires the following
+programs:
+
+ awk
+ gs (ghostscript)
+ pnmcut
+ ppmquant
+ ppmtogif
+ gifmerge
+
+These executables are not part of that distribution.
+
+The first two are widely available on UNIX.
+The three p* programs are part of the NETPBM toolkit.
+You can find this toolkit on the web through any search tool.
+And gifmerge can be found at http://www.iis.ee.ethz.ch/~kiwi/GIFMerge.
+
+I have no idea how to port all this on other architectures,
+but I assume there are similar tools for PCs or Macs.
+I'd be interested to get feedback and details so that i can
+include instructions in future releases of my package.
+
+Denis Roegel, 8 April 1998
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/3d-1.0.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/3d-1.0.mp
new file mode 100644
index 0000000000..0bffe5dafb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/3d-1.0.mp
@@ -0,0 +1,1040 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3D.MP : 3-DIMENSIONAL REPRESENTATIONS
+%% AND ANIMATIONS IN METAPOST}}
+
+%% version 1.0, 8 April 1998
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+%% This package provides definitions enabling the manipulation
+%% and animation of 3-dimensional objects.
+%% Such objects can be included in a \TeX{} file or used on web pages
+%% for instance. See the documentation enclosed in the distribution for
+%% more details.
+
+%% Thanks to John Hobby and Ulrik Vieth for helpful hints.
+
+%% LIMITATIONS:
+
+%% $-$ an object can not include \TeX{} labels; to overcome this limitation
+%% would need to wrap the metapost output with dvips so that the
+%% necessary fonts are loaded (easy to do, but not done here)
+
+%% PROJECTS FOR THE FUTURE:
+
+%% $-$ take light sources into account and show shadows and darker faces
+
+%% $-$ handle overlapping of objects ({\it obj\_name\/} can be used when
+%% going through all faces)
+
+if known three_d_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3d, version 1.0 (c) D. Roegel, 8 April 1998 ***";
+numeric three_d_version;
+three_d_version=1.0;
+
+%%\newpage
+%%\title{Vector operations}
+
+% definition of vector |i| by its coordinates
+def vect_def(expr i,xi,yi,zi)= vect[i]x:=xi;vect[i]y:=yi;vect[i]z:=zi; enddef;
+
+% a point is stored as a vector
+let set_point = vect_def;
+
+% |set_obj_point| is like |set_point|, but the first parameter
+% is a local point number
+def set_obj_point(expr i,xi,yi,zi)=set_point(pnt(i),xi,yi,zi) enddef;
+
+% definition of a vector by an other vector
+def vect_def_vect(expr i,j)=
+ vect[i]x:=vect[j]x;vect[i]y:=vect[j]y;vect[i]z:=vect[j]z;
+enddef;
+
+% vector sum: |vect[k]| $\leftarrow$ |vect[i]|$+$|vect[j]|
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+
+% vector translation: |vect[i]| $\leftarrow$ |vect[i]|$+$|vect[v]|
+def vect_translate(expr i,v)=vect_sum(i,i,v) enddef;
+
+% vector difference: |vect[k]| $\leftarrow$ |vect[i]|$-$|vect[j]|
+def vect_diff(expr k,i,j)=
+ vect[k]x:=vect[i]x-vect[j]x;
+ vect[k]y:=vect[i]y-vect[j]y;
+ vect[k]z:=vect[i]z-vect[j]z;
+enddef;
+
+% dot product of |vect[i]| and |vect[j]|
+vardef vect_dprod(expr i,j)=
+ (vect[i]x*vect[j]x+vect[i]y*vect[j]y+vect[i]z*vect[j]z)
+enddef;
+
+% modulus of |vect[i]|
+vardef vect_mod(expr i)= sqrt(vect_dprod(i,i)) enddef;
+
+% vector product: |vect[k]| $\leftarrow$ |vect[i]| $\land$ |vect[j]|
+def vect_prod(expr k,i,j)=
+ vect[k]x:=vect[i]y*vect[j]z-vect[i]z*vect[j]y;
+ vect[k]y:=vect[i]z*vect[j]x-vect[i]x*vect[j]z;
+ vect[k]z:=vect[i]x*vect[j]y-vect[i]y*vect[j]x;
+enddef;
+
+% scalar multiplication: |vect[j]| $\leftarrow$ |vect[i]*v|
+def vect_mult(expr j,i,v)=
+ vect[j]x:=v*vect[i]x;vect[j]y:=v*vect[i]y;vect[j]z:=v*vect[i]z;
+enddef;
+
+% middle of two points
+def mid_point(expr k,i,j)= vect_sum(k,i,j);vect_mult(k,k,.5); enddef;
+
+%%\newpage
+%%\title{Vector rotation}
+% Rotation of |vect[v]| around |vect[axis]| by an angle |alpha|
+
+%% The vector $\vec{v}$ is first projected on the axis
+%% giving vectors $\vec{a}$ and $\vec{h}$:
+%%\figure{vect-fig.9}
+%% If we set
+%% $\vec{b}={\ora{axis}\over \left\Vert\vcenter{\ora{axis}}\right\Vert}$,
+%% the rotated vector $\vec{v'}$ is equal to $\vec{h}+\vec{f}$
+%% where $\vec{f}=\cos\alpha \cdot \vec{a} + \sin\alpha\cdot \vec{c}$.
+%% and $\vec{h}=(\vec{v}\cdot\vec{b})\vec{b}$
+%%\figure{vect-fig.10}
+
+% The rotation is independent of |vect[axis]|'s module.
+% |v| = old and new vector
+% |axis| = rotation axis
+% |alpha| = rotation angle
+%
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ v_d:=new_vect;v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v)); % projection of |v| on |axis|
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);free_vect(v_d);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Operations on objects}
+% |iname| is the handler for an instance of an object of class |name|
+% |iname| must be a letter string
+vardef assign_obj(expr iname,name)=
+ save tmpdef;
+ string tmpdef; % we need to add double quotes (char 34)
+ tmpdef="def " & iname & "_class=" & ditto & name & ditto & " enddef";
+ scantokens tmpdef;
+ def_obj(iname);
+enddef;
+
+% |name| is the the name of an object instance
+% It must be made only of letters (or underscores), but no digits.
+def def_obj(expr name)=
+ scantokens begingroup
+ save tmpdef;string tmpdef;
+ tmpdef="def_" & obj_class_(name) & "(" & ditto & name & ditto & ")";
+ tmpdef
+ endgroup
+enddef;
+
+% This macro puts an object back where it was right at the beginning.
+% |iname| is the name of an object instance.
+vardef reset_obj(expr iname)=
+ save tmpdef;
+ string tmpdef;
+ define_current_point_offset_(iname);
+ tmpdef="set_" & obj_class_(iname) & "_points";
+ scantokens tmpdef(iname);
+enddef;
+
+% Put an object at position given by |pos| (a vector) and
+% with orientations given by angles |psi|, |theta|, |phi|.
+% The object is scaled by |scale|.
+% |iname| is the name of an object instance.
+vardef put_obj(expr iname,pos,scale,psi,theta,phi)=
+ reset_obj(iname);scale_obj(iname,scale);
+ v_x:=new_vect;v_y:=new_vect;v_z:=new_vect;
+ vect_def_vect(v_x,vect_I);
+ vect_def_vect(v_y,vect_J);
+ vect_def_vect(v_z,vect_K);
+ rotate_obj_abs_pv(iname,point_null,v_z,psi);
+ vect_rotate(v_x,v_z,psi);vect_rotate(v_y,v_z,psi);
+ rotate_obj_abs_pv(iname,point_null,v_y,theta);
+ vect_rotate(v_x,v_y,theta);vect_rotate(v_z,v_y,theta);
+ rotate_obj_abs_pv(iname,point_null,v_x,phi);
+ vect_rotate(v_y,v_x,phi);vect_rotate(v_z,v_x,phi);
+ free_vect(v_z);free_vect(v_y);free_vect(v_x);
+ translate_obj(iname,pos);
+enddef;
+
+%%\newpage
+%%\title{Rotation, translation and scaling of objects}
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector |vect[v]|. The angle of rotation is |a|.
+vardef rotate_obj_pv(expr name,p,v,a)=
+ define_current_point_offset_(name);
+ rotate_obj_abs_pv(name,pnt(p),v,a);
+enddef;
+
+vardef rotate_obj_abs_pv(expr name,p,v,a)=
+ save v_a;
+ define_current_point_offset_(name);
+ v_a:=new_vect;
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),p);
+ vect_rotate(v_a,v,a);
+ vect_sum(pnt(i),v_a,p);
+ endfor;
+ free_vect(v_a);
+enddef;
+
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector $\ora{pq}$. The angle of rotation is |a|.
+vardef rotate_obj_pp(expr name,p,q,a)=
+ save v_a,axis;
+ define_current_point_offset_(name);
+ v_a:=new_vect;axis:=new_vect;
+ vect_diff(axis,pnt(q),pnt(p));
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),pnt(p));
+ vect_rotate(v_a,axis,a);
+ vect_sum(pnt(i),v_a,pnt(p));
+ endfor;
+ free_vect(axis);free_vect(v_a);
+enddef;
+
+% Translation of an object instance |name| by a vector |vect[v]|.
+vardef translate_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_sum(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+% Scalar multiplication of an object instance |name| by a scalar |v|.
+vardef scale_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_mult(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+
+%%\newpage
+%%\title{Functions to build new points in space}
+% Rotation in a plane: this is useful to define a regular polygon.
+% |k| is a new point obtained from point |j| by rotation around |o|
+% by a angle $\alpha$ equal to the angle from |i| to |j|.
+%%\figure{vect-fig.11}
+vardef rotate_in_plane_(expr k,o,i,j)=
+ save cosalpha,sinalpha,alpha,v_a,v_b,v_c;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);vect_prod(v_c,v_a,v_b);
+ cosalpha=vect_dprod(v_a,v_b)/vect_mod(v_a)/vect_mod(v_b);
+ sinalpha=sqrt(1-cosalpha**2);
+ alpha=angle((cosalpha,sinalpha));
+ vect_rotate(v_b,v_c,alpha);
+ vect_sum(k,o,v_b);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+vardef rotate_in_plane(expr k,o,i,j)=
+ rotate_in_plane_(pnt(k),o,pnt(i),pnt(j))
+enddef;
+
+% Build a point on a adjacent face.
+%% The middle $m$ of points $i$ and $j$ is such that
+%% $\widehat{(\ora{om},\ora{mc})}=\alpha$
+%% This is useful to define regular polyhedra
+%%\figure{vect-fig.7}
+vardef new_face_point_(expr c,o,i,j,alpha)=
+ save v_a,v_b,v_c,v_d,v_e;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;v_d:=new_vect;v_e:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);
+ vect_sum(v_c,v_a,v_b);
+ vect_mult(v_d,v_c,.5);
+ vect_diff(v_e,i,j);
+ vect_sum(c,v_d,o);
+ vect_rotate(v_d,v_e,alpha);
+ vect_sum(c,v_d,c);
+ free_vect(v_e);free_vect(v_d);free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+
+vardef new_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(pnt(c),pnt(o),pnt(i),pnt(j),alpha)
+enddef;
+
+vardef new_abs_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(c,o,pnt(i),pnt(j),alpha)
+enddef;
+
+%%\newpage
+%%\title{Computation of the projection of a point on the ``screen''}
+% |p| is the projection of |m|
+% |m| = point in space (3 coordinates)
+% |p| = point of the intersection plane
+%%\figure{vect-fig.8}
+vardef project_point(expr p,m)=
+ save tmpalpha,v_a,v_b;
+ v_a:=new_vect;v_b:=new_vect;
+ vect_diff(v_b,m,Obs); % vector |Obs|-|m|
+ % |vect[v_a]| is |vect[v_b]| expressed in (|ObsI|,|ObsJ|,|ObsK|)
+ % coordinates.
+ vect[v_a]x:=vect[IObsI_]x*vect[v_b]x
+ +vect[IObsJ_]x*vect[v_b]y+vect[IObsK_]x*vect[v_b]z;
+ vect[v_a]y:=vect[IObsI_]y*vect[v_b]x
+ +vect[IObsJ_]y*vect[v_b]y+vect[IObsK_]y*vect[v_b]z;
+ vect[v_a]z:=vect[IObsI_]z*vect[v_b]x
+ +vect[IObsJ_]z*vect[v_b]y+vect[IObsK_]z*vect[v_b]z;
+ if vect[v_a]x<Obs_dist: % then, point |m| is too close
+ message "Point " & decimal m & " too close -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ if (angle(vect[v_a]x,vect[v_a]z)>h_field/2)
+ or (angle(vect[v_a]x,vect[v_a]y)>v_field/2):
+ message "Point " & decimal m & " out of screen -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ tmpalpha:=Obs_dist/vect[v_a]x;
+ y[p]:=drawing_scale*tmpalpha*vect[v_a]y;
+ x[p]:=drawing_scale*tmpalpha*vect[v_a]z;
+ fi;
+ fi;
+ free_vect(v_b);free_vect(v_a);
+enddef;
+
+% Object projection
+% This is a mere iteration on |project_point|
+def project_obj(expr name)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):project_point(ipnt_(i),pnt(i));endfor;
+enddef;
+
+%%\newpage
+%%\title{Draw one face, hiding it if it is hidden}
+% The order of the vertices determines what is the visible side
+% of the face. The order must be clockwise when the face is seen.
+% |drawhidden| is a boolean; if |true| only hidden faces are drawn; if |false|,
+% only visible faces are drawn. Therefore, |draw_face| is called twice
+% by |draw_faces|.
+vardef draw_face(text vertices)(expr col,drawhidden)=
+ save p,num,normal_vect,v_a,v_b,v_c,overflow;
+ path p;boolean overflow;
+ overflow=false;
+ forsuffixes $=vertices:
+ if z[ipnt_($)]=(too_big_,too_big_):overflow:=true; fi;
+ exitif overflow;
+ endfor;
+ if overflow: message "Face can not be drawn, due to overflow";
+ else:
+ p=forsuffixes $=vertices:z[ipnt_($)]--endfor cycle;
+ num0:=0;num1:=0;num2:=0;
+ % get the three last suffixes:
+ forsuffixes $=vertices:num0:=num1;num1:=num2;num2:=$;endfor;
+ normal_vect:=new_vect;v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;
+ vect_diff(v_a,pnt(num1),pnt(num0));
+ vect_diff(v_b,pnt(num2),pnt(num1));
+ vect_prod(normal_vect,v_a,v_b);
+ vect_diff(v_c,pnt(num1),Obs);
+ if filled_faces:
+ if vect_dprod(normal_vect,v_c)<0:
+ fill p withcolor col;if draw_contours:drawcontour(p,contourwidth);fi;
+ else: % |draw p dashed evenly;| if this is done, you must ensure
+ % that hidden faces are (re)drawn at the end
+ fi;
+ else:
+ if vect_dprod(normal_vect,v_c)<0:%visible
+ if not drawhidden:draw p;fi;
+ else: % hidden
+ if drawhidden:
+ draw p withcolor background;% avoid strange overlapping dashes
+ draw p dashed evenly;
+ fi;
+ fi;
+ fi;
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);free_vect(normal_vect);
+ fi;
+enddef;
+
+% |p| is the path to draw (a face contour) and |thickness| is the pen width
+def drawcontour(expr p,thickness)=
+ pickup pencircle scaled thickness;
+ draw p;
+ pickup pencircle scaled .4pt;
+enddef;
+
+%%\newpage
+% Variables for face handling. First, we have an array for lists of vertices
+% corresponding to faces.
+string face_points_[];% analogous to |vect| arrays
+
+% Then, we have an array of colors. A color needs to be a string
+% representing an hexadecimal RGB coding of a color.
+string face_color_[];
+
+% |name| is the name of an object instance
+vardef draw_faces(expr name)=
+ save tmpdef;string tmpdef;
+ define_current_face_offset_(name);
+ % first the hidden faces (dashes must be drawn first):
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),true)";scantokens tmpdef;
+ endfor;
+ % then, the visible faces:
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),false)";scantokens tmpdef;
+ endfor;
+enddef;
+
+% Draw point |n| of object instance |name|
+vardef draw_point(expr name,n)=
+ define_current_point_offset_(name);
+ project_point(ipnt_(n),pnt(n));
+ if z[ipnt_(n)] <> (too_big_,too_big_):
+ pickup pencircle scaled 5pt;
+ drawdot(z[ipnt_(n)]);
+ pickup pencircle scaled .4pt;
+ fi;
+enddef;
+
+vardef draw_axes(expr r,g,b)=
+ project_point(1,vect_null);
+ project_point(2,vect_I);
+ project_point(3,vect_J);
+ project_point(4,vect_K);
+ if (z1<>(too_big_,too_big_)):
+ if (z2<>(too_big_,too_big_)):
+ drawarrow z1--z2 dashed evenly withcolor r;
+ fi;
+ if (z3<>(too_big_,too_big_)):
+ drawarrow z1--z3 dashed evenly withcolor g;
+ fi;
+ if (z4<>(too_big_,too_big_)):
+ drawarrow z1--z4 dashed evenly withcolor b;
+ fi;
+ fi;
+enddef;
+
+
+%%\newpage
+% Definition of a macro |obj_name| returning an object name
+% when given an absolute
+% face number. This definition is built incrementally through a string,
+% everytime a new object is defined.
+% |obj_name| is defined by |redefine_obj_name_|.
+
+% Initial definition
+string index_to_name_;
+index_to_name_="def obj_name(expr i)=if i<1:";
+
+% |name| is the name of an object instance
+% |n| is the absolute index of its last face
+def redefine_obj_name_(expr name,n)=
+ index_to_name_:=index_to_name_ & "elseif i<=" & decimal n & ":" & ditto
+ & name & ditto;
+ scantokens begingroup index_to_name_ & "fi;enddef;" endgroup;
+enddef;
+
+% |i| is an absolute face number
+% |vertices| is a string representing a list of vertices
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_face(expr i,vertices,rgbcolor)=
+ face_points_[i]:=vertices;face_color_[i]:=rgbcolor;
+enddef;
+
+% |i| is a local face number
+%|vertices| is a string representing a list of vertices
+%|rgbcolor| is a string representing a color in rgb hexadecimal
+def set_obj_face(expr i,vertices,rgbcolor)=set_face(face(i),vertices,rgbcolor)
+enddef;
+
+%%\newpage
+%%\title{Compute the vectors corresponding to the observer's viewpoint}
+% (vectors |ObsI_|,|ObsJ_| and |ObsK_| in the |vect_I|,|vect_J|,
+% |vect_K| reference; and vectors |IObsI_|,|IObsJ_| and |IObsK_|
+% which are |vect_I|,|vect_J|,|vect_K|
+% in the |ObsI_|,|ObsJ_|,|ObsK_| reference)
+%%\figure{vect-fig.16}
+%% (here, $\psi>0$, $\theta<0$ and $\phi>0$; moreover,
+%% $\vert\theta\vert \leq 90^\circ$)
+
+def compute_reference(expr psi,theta,phi)=
+ % |ObsI_| defines the direction of observation;
+ % |ObsJ_| and |ObsK_| the orientation
+ % (but one of these two vectors is enough,
+ % since |ObsK_| = |ObsI_| $\land$ |ObsJ_|)
+ % The vectors are found by rotations of |vect_I|,|vect_J|,|vect_K|.
+ vect_def_vect(ObsI_,vect_I);vect_def_vect(ObsJ_,vect_J);
+ vect_def_vect(ObsK_,vect_K);
+ vect_rotate(ObsI_,ObsK_,psi);
+ vect_rotate(ObsJ_,ObsK_,psi);% gives ($u$,$v$,$z$)
+ vect_rotate(ObsI_,ObsJ_,theta);
+ vect_rotate(ObsK_,ObsJ_,theta);% gives ($Obs_x$,$v$,$w$)
+ vect_rotate(ObsJ_,ObsI_,phi);
+ vect_rotate(ObsK_,ObsI_,phi);% gives ($Obs_x$,$Obs_y$,$Obs_z$)
+ % The passage matrix $P$ from |vect_I|,|vect_J|,|vect_K|
+ % to |ObsI_|,|ObsJ_|,|ObsK_| is the matrix
+ % composed of the vectors |ObsI_|,|ObsJ_| and |ObsK_| expressed
+ % in the base |vect_I|,|vect_J|,|vect_K|.
+ % We have $X=P X'$ where $X$ are the coordinates of a point
+ % in |vect_I|,|vect_J|,|vect_K|
+ % and $X'$ the coordinates of the same point in |ObsI_|,|ObsJ_|,|ObsK_|.
+ % In order to get $P^{-1}$, it suffices to build vectors using
+ % the previous rotations in the inverse order.
+ vect_def_vect(IObsI_,vect_I);vect_def_vect(IObsJ_,vect_J);
+ vect_def_vect(IObsK_,vect_K);
+ vect_rotate(IObsK_,IObsI_,-phi);vect_rotate(IObsJ_,IObsI_,-phi);
+ vect_rotate(IObsK_,IObsJ_,-theta);vect_rotate(IObsI_,IObsJ_,-theta);
+ vect_rotate(IObsJ_,IObsK_,-psi);vect_rotate(IObsI_,IObsK_,-psi);
+enddef;
+
+%%\newpage
+%%\title{Point of view}
+% This macro computes the three angles necessary for |compute_reference|
+% |name| = name of an instance of an object
+% |target| = target point (local to object |name|)
+% |phi| = angle
+vardef point_of_view_obj(expr name,target,phi)=
+ define_current_point_offset_(name);% enables |pnt|
+ point_of_view_abs(pnt(target),phi);
+enddef;
+
+% Compute absolute perspective. |target| is an absolute point number
+vardef point_of_view_abs(expr target,phi)=
+ save v_a,psi,theta;
+ v_a:=new_vect;
+ vect_diff(v_a,target,Obs);
+ vect_mult(v_a,v_a,1/vect_mod(v_a));
+ psi=angle((vect[v_a]x,vect[v_a]y));
+ theta=-angle((vect[v_a]x++vect[v_a]y,vect[v_a]z));
+ compute_reference(psi,theta,phi);
+ free_vect(v_a);
+enddef;
+
+
+
+% Distance between the observer and point |n| of object |name|
+% Result is put in |dist|
+vardef obs_distance(text dist)(expr name,n)=
+ save v_a;
+ v_a:=new_vect;
+ define_current_point_offset_(name);% enables |pnt|
+ dist:=vect_mod(v_a,pnt(n),Obs);
+ free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Vector and point allocation}
+% Allocation is done through a stack of vectors
+numeric last_vect_;
+last_vect_=0;
+
+% vector allocation
+def new_vect=incr(last_vect_)
+ % |message "Vector " & decimal last_vect_ & " allocated";|
+enddef;
+
+let new_point = new_vect;
+
+def new_points(text p)(expr n)=
+ save p;
+ numeric p[];
+ for i:=1 upto n:p[i]:=new_point;endfor;
+enddef;
+
+% Free a vector
+% A vector can only be freed safely when it was the last vector created.
+def free_vect(expr i)=
+ if i=last_vect_: last_vect_:=last_vect_-1;
+ else: errmessage("Vector " & decimal i & " can't be freed!");
+ fi;
+enddef;
+
+let free_point = free_vect;
+
+def free_points(text p)(expr n)=
+ for i:=10 step-1 until 1:free_point(p[i]);endfor;
+enddef;
+
+%%\title{Debugging}
+
+def show_vect(expr t,i)=
+ message "Vector " & t & "="
+ & "(" & decimal vect[i]x & "," & decimal vect[i]y & ","
+ & decimal vect[i]z & ")";
+enddef;
+
+let show_point=show_vect;
+
+def show_pair(expr t,zz)=
+ message t & "=(" & decimal xpart(zz) & "," & decimal ypart(zz) & ")";
+enddef;
+
+
+%%\newpage
+%%\title{Access to object features}
+% |a| must be a string representing an class name, such as |"dodecahedron"|.
+% |b| is the tail of a macro name.
+
+def obj_(expr a,b,i)=
+ scantokens
+ begingroup save n;string n;n=a & b & i;n
+ endgroup
+enddef;
+
+def obj_points_(expr name)=
+ obj_(obj_class_(name),"_points",name)
+enddef;
+
+def obj_faces_(expr name)=
+ obj_(obj_class_(name),"_faces",name)
+enddef;
+
+vardef obj_point_offset_(expr name)=
+ obj_(obj_class_(name),"_point_offset",name)
+enddef;
+
+vardef obj_face_offset_(expr name)=
+ obj_(obj_class_(name),"_face_offset",name)
+enddef;
+
+def obj_class_(expr name)=obj_(name,"_class","") enddef;
+
+%%\newpage
+def define_point_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_point_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_point_offset_;
+ last_point_offset_:=last_point_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_points" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_face_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_face_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_face_offset_;
+ last_face_offset_:=last_face_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_faces" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_current_point_offset_(expr name)=
+ save current_point_offset_;
+ numeric current_point_offset_;
+ current_point_offset_:=obj_point_offset_(name);
+enddef;
+
+def define_current_face_offset_(expr name)=
+ save current_face_offset_;
+ numeric current_face_offset_;
+ current_face_offset_:=obj_face_offset_(name);
+enddef;
+
+
+%%\newpage
+%%\title{Drawing an object}
+% |name| is an object instance
+def draw_obj(expr name)=project_obj(name);draw_faces(name);enddef;
+
+%%\title{Normalization of an object}
+% This macro translates an object so that a list of vertices is centered
+% on the origin, and the last vertex is put on a sphere whose radius is 1.
+% |name| is the name of the object and |vertices| is a list
+% of points whose barycenter will define the center of the object.
+% (|vertices| need not be the list of all vertices)
+vardef normalize_obj(expr name)(text vertices)=
+ save v_a,nvertices,last;
+ numeric v_a,last;
+ nvertices=0;
+ v_a=new_vect;vect_def(v_a,0,0,0)
+ forsuffixes $=vertices:
+ vect_sum(v_a,v_a,pnt($));
+ nvertices:=nvertices+1;
+ last:=$;
+ endfor;
+ vect_mult(v_a,v_a,-1/nvertices);
+ translate_obj(name,v_a);% object centered on the origin
+ scale_obj(name,1/vect_mod(pnt(last)));
+ free_vect(v_a);
+enddef;
+
+
+%%\newpage
+%%\title{General definitions}
+% Vector arrays
+numeric vect[]x,vect[]y,vect[]z;
+
+% Observer
+numeric Obs;
+Obs=new_point;
+% default value:
+set_point(Obs,0,0,20);
+
+% Observer's vectors
+ObsI_=new_vect;ObsJ_=new_vect;ObsK_=new_vect;
+IObsI_=new_vect;IObsJ_=new_vect;IObsK_=new_vect;
+
+% distance observer/plane (must be $>0$)
+numeric Obs_dist; % represents |Obs_dist| $\times$ |drawing_scale|
+% default value:
+Obs_dist=2; % means |Obs_dist| $\times$ |drawing_scale|
+
+% Screen Size
+% The screen size is defined through two angles: the horizontal field
+% and the vertical field
+numeric h_field,v_field;
+h_field=100; % degrees
+v_field=70; % degrees
+
+% Reference vectors $\vec{0}$, $\vec{\imath}$, $\vec{\jmath}$ and $\vec{k}$
+% and their definition
+numeric vect_null,vect_I,vect_J,vect_K;
+vect_null=new_vect;vect_I=new_vect;vect_J=new_vect;vect_K=new_vect;
+vect_def(vect_null,0,0,0);
+vect_def(vect_I,1,0,0);vect_def(vect_J,0,1,0);vect_def(vect_K,0,0,1);
+numeric point_null;
+point_null=vect_null;
+
+% Observer's orientation, defined by three angles
+numeric Obs_psi,Obs_theta,Obs_phi;
+% default value:
+Obs_psi=0;Obs_theta=90;Obs_phi=0;
+
+% Points for the figures
+numeric points_[];
+
+% |name| is the name of an object instance
+% |npoints| is its number of defining points
+def new_obj_points(expr name,npoints)=
+ define_point_offset_(name,npoints);define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):pnt(i):=new_point;endfor;
+enddef;
+
+% |name| is the name of an object instance
+% |nfaces| is its number of defining faces
+def new_obj_faces(expr name,nfaces)=
+ define_face_offset_(name,nfaces);define_current_face_offset_(name);
+ redefine_obj_name_(name,current_face_offset_+nfaces);
+enddef;
+
+%%\newpage
+% Absolute point number corresponding to object point number |i|
+% This macro must only be used within the function defining an object
+% (such as |def_cube|) or the function drawing an object (such as
+% |draw_cube|).
+def ipnt_(expr i)=i+current_point_offset_ enddef;
+def pnt(expr i)=points_[ipnt_(i)] enddef;
+
+def face(expr i)=(i+current_face_offset_) enddef;
+
+% Absolute point number corresponding to local point |n|
+% in object instance |name|
+vardef pnt_obj(expr name,n)=
+ hide(define_current_point_offset_(name);) pnt(n)
+enddef;
+
+% Absolute face number corresponding to local face |n|
+% in object instance |name|
+vardef face_obj(expr name,n)=
+ hide(define_current_face_offset_(name);) face(n)
+enddef;
+
+
+% Scale
+numeric drawing_scale;
+drawing_scale=2cm;
+
+% Color
+% This function is useful when a color is expressed in hexadecimal.
+def hexcolor(expr s)=
+ (hex(substring (0,2) of s)/255,hex(substring (2,4) of s)/255,
+ hex(substring (4,6) of s)/255)
+enddef;
+
+% Filling and contours
+boolean filled_faces,draw_contours;
+filled_faces=true;
+draw_contours=true;
+numeric contourwidth; % thickness of contours
+contourwidth=1pt;
+
+% Overflow control
+% An overflow can occur when an object is too close from the observer
+% or if an object is out of sight. We use a special value to mark
+% coordinates which would lead to an overflow.
+numeric too_big_;
+too_big_=4000;
+
+
+% Object offset (the points defining an object are arranged
+% in a single array, and the objects are easier to manipulate
+% if the point numbers are divided into a number and an offset).
+numeric last_point_offset_,last_face_offset_;
+last_point_offset_=0;last_face_offset_=0;
+
+
+%%\newpage
+%%\title{Computation of field parameters of an animation}
+numeric xmin_,ymin_,xmax_,ymax_;
+
+def compute_bbox=
+ if known xmin_:
+ xmin_:=min(xmin_,xpart(llcorner(currentpicture)));
+ ymin_:=min(ymin_,ypart(llcorner(currentpicture)));
+ xmax_:=max(xmax_,xpart(urcorner(currentpicture)));
+ ymax_:=max(ymax_,ypart(urcorner(currentpicture)));
+ else:
+ xmin_=xpart(llcorner(currentpicture));
+ ymin_=ypart(llcorner(currentpicture));
+ xmax_=xpart(urcorner(currentpicture));
+ ymax_=ypart(urcorner(currentpicture));
+ fi;
+enddef;
+
+boolean show_animation_parameters;
+show_animation_parameters=false;
+numeric paper_height;
+paper_height=29.7; % paper height in cm
+
+% show bounding box of an animation, in PostScript points
+% and parameters for animation script
+vardef show_animation_bbox=
+ save trx,try,h,w,delta,pnmx,pnmy,pnmw,pnmh,res;
+ res=36; % 36 dots per inch in bitmap
+ w=xmax_-xmin_;h=ymax_-ymin_;
+ if show_animation_parameters:
+ message "animation bbox: (llx=" & decimal round(xmin_)
+ & ",lly=" & decimal round(ymin_)
+ & ",w=" & decimal round(w) & ",h=" & decimal round(h) & ")";
+ fi;
+ if xmin_ <=20: trx=50-xmin_;else: trx=0;fi;
+ if ymin_ <=20: try=50-ymin_;else: try=0;fi;
+ if show_animation_parameters:
+ message "translate parameters: "
+ & decimal round(trx) & " " & decimal round(try);
+ fi;
+ xmin_:=xmin_+trx;ymin_:=ymin_+try;
+ delta=10;
+ pnmx=round(xmin_*(res/72)-delta);
+ pnmy=round((paper_height/2.54*72-ymin_-h)*(res/72)-delta);
+ pnmw=round(w*(res/72)+2*delta);
+ pnmh=round(h*(res/72)+2*delta);
+ if show_animation_parameters:
+ message "pnmcut parameters (with -r36): "
+ & decimal pnmx & " " & decimal pnmy & " "
+ & decimal pnmw & " " & decimal pnmh;
+ fi;
+ write_script(round(trx),round(try),
+ pnmx,pnmy,pnmw,pnmh,res,jobname,"create_animation.sh");
+enddef;
+
+%%\newpage
+%%\title{Creation of a shell script to automate the animation}
+% This is UNIX targetted and may need to be customized.
+
+vardef write_script(expr trx,try,xmin,ymin,w,h,res,output,file)=
+ save s;
+ string s;
+ def write_to_file(text arg)=write arg to file; enddef;
+ write_to_file("#! /bin/sh");
+ write_to_file("");
+ write_to_file("/bin/rm -f "&output&".log");
+ write_to_file("for i in `ls "&output&".*| grep '"&output&".[0-9]'`;do");
+ if false: "endfor" fi % indentation hack for meta-mode.el
+ write_to_file("echo $i");
+ write_to_file("echo '=============='");
+ s:="awk < $i '{print} /^%%Page: /{print "&ditto;
+ s:=s&decimal trx&" "&decimal try&" translate\n"&ditto&"}' > $i.ps";
+ write_to_file(s);
+ % ghostscript PostScript into ppm
+ s:="gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE ";
+ s:=s&"-r"&decimal res &" -sOutputFile=$i.ppm -q -- $i.ps";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ps");
+ % possible alternative:
+ % |s:="mogrify -compress -crop " & decimal(w) & "x" & decimal(h);|
+ % |s:=s&"+"& decimal(xmin) &"+"&decimal(ymin);|
+ % |s:=s&" -colors 32 -format gif $i.ppm";|
+ s:="ppmquant 32 $i.ppm | pnmcut "& decimal(xmin) &" "&decimal(ymin);
+ s:=s&" "&decimal(w)&" "&decimal(h) &" | ";
+ s:=s&"ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ppm");
+ write_to_file("done");
+ write_to_file("/bin/rm -f "&output&".gif");
+ s:="gifmerge -10 -l1000 ";
+ s:=s&output&".*.gif > "&output&".gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f "&output&".*.gif");
+ write_to_file(EOF);% end of file
+enddef;
+
+%%\newpage
+%%\title{Standard animation definitions}
+% These definitions produce {\it one\/} image of some kind.
+
+extra_endfig:="compute_bbox";
+
+% In the standard animations, the observer follows a circle, shown below:
+%%\figure{vect-fig.17}
+
+% Standard image 1: this is an example and may be adapted.
+% |name| is an object instance
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name,1,Obs_phi);% fix point 1 of object |name|
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ draw_point(name,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 2: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+%%\newpage
+% Standard image 3: this is an example and may be adapted.
+% |name_a|, |name_b| and |name_c| are object instances.
+def one_image_three_objects(expr name_a,name_b,name_c,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;h_field:=100;v_field:=150;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);draw_obj(name_c);
+ v_a:=new_vect;
+ vect_def(v_a,.03*cosd(-a*ang+90),.03*sind(-a*ang+90),0);
+ translate_obj(name_c,v_a);
+ free_vect(v_a);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 4: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_identical_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),2);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_a,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+
+%%\newpage
+% An animation is a series of images, and these series are produced here.
+
+% Standard animation 1
+% |name| is a class name
+def animate_object(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obj",name);
+ for i:=imin upto imax:one_image("obj",i+index,i,5,ang);endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 2
+% |name_a| and |name_b| are class names
+def animate_two_objects(expr name_a,name_b,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_objects("obja","objb",i+index,i,5,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 3
+% |name_a|, |name_b| and |name_c| are class names
+vardef animate_three_objects(expr name_a,name_b,name_c,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ assign_obj("objc",name_c);
+ scale_obj("objb",.7);
+ numeric v_a;v_a:=new_vect;
+ vect_def_vect(v_a,vect_K);vect_mult(v_a,v_a,4);put_obj("objb",v_a,1,0,0,0);
+ free_vect(v_a);
+ scale_obj("objc",.5);
+ translate_obj("objc",vect_K);translate_obj("objc",vect_K);
+ for i:=imin upto imax:
+ one_image_three_objects("obja","objb","objc",i+index,i,7,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 4
+% |name| is a class name
+def animate_two_identical_objects(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name);assign_obj("objb",name);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_identical_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/README b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/README
new file mode 100644
index 0000000000..fcf345eaa2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/README
@@ -0,0 +1,22 @@
+The files in this directory have been contributed by Denis Barbier.
+
+Sources files: crayon-3d-1.mp,...,crayon-3d-4.mp
+ pointe-b.mp, pointe-d.mp, pointe-g.mp, pointe-h.mp.
+ (these files correspond to animpoly.mp in the standard
+ distribution)
+
+ All these files have been tested with 3d.mp version 1.0.
+
+Macros: arcenciel.mp, arcenciel2.mp, crayonmine.mp
+
+Animations: gif files
+
+Some of the animations can be seen on
+
+ http://blanche.polytechnique.fr/users/www.barbier/animations.html
+
+
+
+
+Denis Roegel, 9 April 1998
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel.mp
new file mode 100644
index 0000000000..79d6b73c24
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel.mp
@@ -0,0 +1,50 @@
+% arc-en ciel
+% Il faut decouper en 3 zones de couleurs :
+% 1 -> rouge --> rouge+vert
+% 2 -> rouge+vert --> vert+bleu
+% 3 -> vert+bleu --> vert
+% Ensuite, on symetrise
+
+string tablecouleur[];
+
+numeric r,g,b,ntmp;
+
+% On commence par ranger les couleurs dans un tableau trop grand ; on le
+% dimensionne ensuite.
+% nbppf est le nombre de points sur les extremites du crayon, et par
+% consequent est aussi le nombre de faces sur le corps du crayon.
+ntmp := 6*(1+floor(nbppf/6));
+
+% J'ai besoin de transformer un nombre 0<=j<=255 en sa
+% representation hexadecimale.
+def dec_to_hex(expr j)=
+ res_dec_to_hex(j div 16) & res_dec_to_hex(j mod 16)
+enddef;
+def res_dec_to_hex(expr j)=
+ if j<10: decimal j
+ else: char(55+j)
+ fi
+enddef;
+
+for i:= 1 upto ntmp/6:
+ g := round(255*6*i/ntmp);
+ tablecouleur[i] := "FF" & dec_to_hex(g) & "00";
+ tablecouleur[ntmp+1-i] := tablecouleur[i];
+endfor;
+for i:= 1 upto ntmp/6:
+ r := round(255*(ntmp-6*i)/ntmp);
+ b := round(255*6*i/ntmp);
+ j := i+ntmp/6;
+ tablecouleur[j] := dec_to_hex(r) & "FF" & dec_to_hex(b);
+ tablecouleur[ntmp+1-j] := tablecouleur[j];
+endfor;
+for i:= 1 upto ntmp/6:
+ g := round(255*(ntmp-6*i)/ntmp);
+ j := i+ntmp/3;
+ tablecouleur[j] := "00" & dec_to_hex(g) & "FF";
+ tablecouleur[ntmp+1-j] := tablecouleur[j];
+endfor;
+
+for i:=1 upto nbppf:
+ tablecouleur[i]:=tablecouleur[floor(i*ntmp/nbppf)];
+endfor;
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel2.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel2.mp
new file mode 100644
index 0000000000..8b281be679
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/arcenciel2.mp
@@ -0,0 +1,46 @@
+% degrade de couleurs
+% 1 -> bleu+rouge --> rouge+vert
+% 2 -> rouge+vert --> vert+bleu
+% 3 -> vert+bleu --> vert+rouge
+
+string tablecouleur[];
+
+numeric r,g,b,ntmp;
+
+% On commence par ranger les couleurs dans un tableau trop grand ; on le
+% dimensionne ensuite.
+% nbppf est le nombre de points sur les extremites du crayon, et par
+% consequent est aussi le nombre de faces sur le corps du crayon.
+
+ntmp := 3*(1+floor(nbppf/3));
+
+% J'ai besoin de transformer un nombre 0<=j<=255 en sa
+% representation hexadecimale.
+def dec_to_hex(expr j)=
+ res_dec_to_hex(j div 16) & res_dec_to_hex(j mod 16)
+enddef;
+def res_dec_to_hex(expr j)=
+ if j<10: decimal j
+ else: char(55+j)
+ fi
+enddef;
+
+for i:= 1 upto ntmp/3:
+ g := round(255*3*i/ntmp);
+ b := round(255*(ntmp-3*i)/ntmp);
+ tablecouleur[i] := "FF" & dec_to_hex(g) & dec_to_hex(b);
+endfor;
+for i:= 1 upto ntmp/3:
+ r := round(255*(ntmp-3*i)/ntmp);
+ b := round(255*3*i/ntmp);
+ tablecouleur[i+ntmp/3] := dec_to_hex(r) & "FF" & dec_to_hex(b);
+endfor;
+for i:= 1 upto ntmp/3:
+ r := round(255*3*i/ntmp);
+ g := round(255*(ntmp-3*i)/ntmp);
+ tablecouleur[i+2*ntmp/3] := dec_to_hex(r) & dec_to_hex(g) & "FF";
+endfor;
+
+for i:=1 upto nbppf:
+ tablecouleur[i]:=tablecouleur[floor(i*ntmp/nbppf)];
+endfor;
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/barre-arcenciel.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/barre-arcenciel.gif
new file mode 100644
index 0000000000..a0cfa29b0b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/barre-arcenciel.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.gif
new file mode 100644
index 0000000000..aab9816311
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.log b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.log
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.log
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.mp
new file mode 100644
index 0000000000..e4b5b8679c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-1.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+input arcenciel
+%input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-20*cosd(a*ang),-20*sind(a*ang),20);
+ Obs_phi:=0;Obs_dist:=2;
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,40,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.gif
new file mode 100644
index 0000000000..bfa0ba5852
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.mp
new file mode 100644
index 0000000000..3aefe7497d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-2.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+%input arcenciel
+input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-20*cosd(a*ang),-20*sind(a*ang),4);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name,nbppf,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,2,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,60,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.gif
new file mode 100644
index 0000000000..53520ab530
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.mp
new file mode 100644
index 0000000000..e74d60a81c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-3.mp
@@ -0,0 +1,60 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+nbppf:=6;
+
+% Choix des couleurs
+%input arcenciel
+input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%filled_faces:=false; % default value is |true|
+
+draw_contours:=false;
+
+% show_animation_parameters:=true; % default value is |false|
+
+def animate_two_identical_objects(expr name,imin,imax,index)=
+ save v_a;
+ numeric v_a;
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name);assign_obj("objb",name);
+ v_a=new_vect;
+ rotate_obj_pv("objb",1,vect_J,45);
+ vect_mult(v_a,vect_K,rapp*(1+lgmine));
+ translate_obj("objb",v_a);
+ free_vect(v_a);
+ for i:=imin upto imax:
+ one_image_two_identical_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+def one_image_two_identical_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-20,4);
+ Obs_phi:=90;Obs_dist:=1;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pp(name_b,1,2,ang);
+ rotate_obj_abs_pv(name_a,point_null,vect_K,2*ang);
+ rotate_obj_abs_pv(name_b,point_null,vect_J,ang);
+ endfig;
+enddef;
+
+% animations
+animate_two_identical_objects("crayonmine",1,60,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.gif
new file mode 100644
index 0000000000..aeb38d81d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.mp
new file mode 100644
index 0000000000..327e524aad
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-3d-4.mp
@@ -0,0 +1,96 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+nbppf:=6;
+
+% Choix des couleurs
+%input arcenciel
+input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%filled_faces:=false; % default value is |true|
+
+draw_contours:=false;
+
+% show_animation_parameters:=true; % default value is |false|
+
+def affiche_un(expr name, n,a) =
+ numeric v_a;v_a:=new_vect;
+ vect_def_vect(v_a,vect_K);
+ vect_mult(v_a,v_a,n);
+ rotate_obj_abs_pv(name,v_a,vect_K,a);
+ free_vect(v_a);
+enddef;
+
+numeric angleb,anglec;
+angleb=anglec=0;
+
+def one_image_three_objects(expr name_a,name_b,name_c,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-rd,10);
+ Obs_phi:=90;Obs_dist:=1;
+ point_of_view_obj(name_a,1,Obs_phi);
+ angleb := (angleb+2*ang) mod 360;
+ anglec := (anglec-ang) mod 360;
+ rotate_obj_pv(name_a,1,vect_K,ang);
+ rotate_obj_pp(name_b,1,2,ang);
+ rotate_obj_pp(name_c,1,2,ang);
+ affiche_un(name_b,2,2*ang);
+ affiche_un(name_c,6,-ang);
+ if (anglec<180):
+ draw_obj(name_c);
+ if (angleb<180):
+ draw_obj(name_b);
+ draw_obj(name_a);
+ else:
+ draw_obj(name_a);
+ draw_obj(name_b);
+ fi;
+ else:
+ if (angleb<180):
+ draw_obj(name_b);
+ draw_obj(name_a);
+ else:
+ draw_obj(name_a);
+ draw_obj(name_b);
+ fi;
+ draw_obj(name_c);
+ fi;
+ endfig;
+enddef;
+
+vardef animate_three_identical_objects(expr name_a,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_a);
+ assign_obj("objc",name_a);
+ numeric v_a;v_a:=new_vect;
+ put_obj("obja",vect_null,1,0,-90,0);
+ vect_def_vect(v_a,vect_K);vect_sum(v_a,v_a,vect_I);
+ vect_mult(v_a,v_a,2);
+ put_obj("objb",v_a,1,0,0,0);
+ vect_def_vect(v_a,vect_K); vect_mult(v_a,v_a,6);
+ vect_sum(v_a,v_a,vect_I);
+ vect_sum(v_a,v_a,vect_I);
+ put_obj("objc",v_a,1,0,0,0);
+ free_vect(v_a);
+ for i:=imin upto imax:
+ one_image_three_objects("obja","objb","objc",i+index,i,20,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+animate_three_identical_objects("crayonmine",1,50,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel.gif
new file mode 100644
index 0000000000..e98fc4405b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel2.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel2.gif
new file mode 100644
index 0000000000..9b7bff11c8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-d-arcenciel2.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel.gif
new file mode 100644
index 0000000000..a1b4d3c960
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel2.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel2.gif
new file mode 100644
index 0000000000..7c3046e51c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayon-g-arcenciel2.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayonmine.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayonmine.mp
new file mode 100644
index 0000000000..d99500ae95
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/crayonmine.mp
@@ -0,0 +1,120 @@
+% Definition des crayons de papier colores
+% A utiliser avec 3d.mp 1.0
+% D. Barbier
+% Version 0.2 (5 novembre 1997)
+%
+% Changements :
+% la numerotation des points a change
+% 1 : origine
+% 2 : pointe de la mine
+% 3 --> 4*nbppf+2 : autres points
+%
+% Ces changements modifient bien sur le resultat des animations.
+%
+% nbppf : nombre de points sur l extremite plate du crayon
+% rapp : rapport largeur du cylindre/rayon du cylindre
+% lgmine: longueur de la mine/longueur du corps du crayon
+% fcmine: fraction de la mine qui est occupee par le graphite
+%
+% Apres mise a l'echelle, le corps du crayon a un rayon 1,
+% l'extremite plane a pour abscisse 0, le debut de la mine
+% l'abscisse rapp et la pointe rapp*(1+lgmine)
+%
+% Valeurs par defaut ; peuvent etre modifiees par
+% l utilisateur avant input crayonmine.
+%
+numeric nbppf,rapp,lgmine,fcmine;
+ nbppf := 12;
+ rapp := 8;
+ lgmine := 0.4;
+ fcmine := 0.4;
+
+def set_crayonmine_points(expr inst)=
+ begingroup
+ save an,rext,rint,abscmine; numeric an,rext,rint,abscmine;
+% an : angle entre 2 faces
+% rext : rayon du corps du crayon
+% rint : rayon de la mine de graphite
+% abscmine: abscisse du debut de la mine
+ an:=360/nbppf;
+ rext := 1/(sind (an/2));
+ rint := fcmine/(sind (an/2));
+ abscmine := rapp*rext;
+% origine
+ set_obj_point(1,0,0,0);
+% pointe de la mine
+ set_obj_point(2,abscmine*(1+lgmine),0,0);
+% points sur le corps du crayon
+ set_obj_point(3,0,-1,-rext);set_obj_point(4,abscmine,-1,-rext);
+ set_obj_point(5,0, 1,-rext);set_obj_point(6,abscmine, 1,-rext);
+ for i:=1 upto nbppf-2:
+ new_face_point(5+2*i,2+2*i,4+2*i,3+2*i,an);
+ new_face_point(6+2*i,1+2*i,4+2*i,3+2*i,an);
+ endfor;
+% points sur la mine de graphite
+ set_obj_point(3+2*nbppf,0,-fcmine,-rint);
+ set_obj_point(4+2*nbppf,abscmine*(1+lgmine*(1-rint/rext)),-fcmine,-rint);
+ set_obj_point(5+2*nbppf,0, fcmine,-rint);
+ set_obj_point(6+2*nbppf,abscmine*(1+lgmine*(1-rint/rext)), fcmine,-rint);
+ for i:=nbppf+1 upto 2*nbppf-2:
+ new_face_point(5+2*i,2+2*i,4+2*i,3+2*i,an);
+ new_face_point(6+2*i,1+2*i,4+2*i,3+2*i,an);
+ endfor;
+% Facteur d'echelle
+% A la sortie, le rayon du corps du crayon est 1.
+ scale_obj(inst,1/rext);
+ endgroup
+enddef;
+
+vardef def_crayonmine(expr inst)=
+ string tmpstr;
+ new_obj_points(inst,4*nbppf+2);
+ new_obj_faces(inst,3*nbppf+2);
+ set_crayonmine_points(inst);
+ for i=1 upto nbppf-1:
+% corps du crayon
+ tmpstr := decimal (2+2*i) & "," & decimal (1+2*i) & "," &
+ decimal (3+2*i) & "," & decimal (4+2*i);
+ set_obj_face(i,tmpstr,tablecouleur[i]);
+% mine : bois
+ j := i+nbppf;
+ tmpstr := decimal (2+2*j) & "," & decimal (2+2*i) & "," &
+ decimal (4+2*i) & "," & decimal (4+2*j);
+ set_obj_face(j,tmpstr,"FFCC88");
+% mine : graphite
+ tmpstr := decimal (2+2*j) & "," & decimal (4+2*j) & "," &
+ decimal (2);
+ set_obj_face(j+nbppf,tmpstr,"000000");
+ endfor;
+% Il faut un traitement particulier quand on revient sur la 1ere arete.
+ tmpstr := decimal (2+2*nbppf) & "," &
+ decimal (1+2*nbppf) & ",3,4";
+ set_obj_face(nbppf,tmpstr,tablecouleur[nbppf]);
+ tmpstr := decimal (2+4*nbppf) & "," &
+ decimal (2+2*nbppf) & ",4," & decimal(4+2*nbppf);
+ set_obj_face(2*nbppf,tmpstr,"FFCC88");
+ tmpstr := decimal (2+4*nbppf) & "," &
+ decimal(4+2*nbppf) & "," & decimal(2);
+ set_obj_face(3*nbppf,tmpstr,"000000");
+% face arriere du crayon : bois
+ tmpstr := decimal(1+2*nbppf)
+ for i := nbppf-1 downto 1: & "," & decimal (1+2*i) endfor;
+ set_obj_face(3*nbppf+1,tmpstr,"FFCC88");
+% face arriere du crayon : graphite
+ tmpstr := decimal(1+4*nbppf)
+ for i := nbppf-1 downto 1: & "," & decimal (1+2*(i+nbppf)) endfor;
+ set_obj_face(3*nbppf+2,tmpstr,"000000");
+ %show_obj(inst);
+enddef;
+
+def show_obj(expr inst) =
+ message "Nombre de points : " & decimal(obj_points_(inst));
+ for i:=1 upto obj_points_(inst):
+ show_point(decimal(i) & " : ",pnt(i))
+ endfor;
+ message "Nombre de faces : " & decimal(obj_faces_(inst));
+ for i:=1 upto obj_faces_(inst):
+ message "Face " & decimal(i) & " : " & face_points_[face(i)];
+ message "Couleur : " & face_color_[face(i)];
+ endfor;
+enddef;
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/essai.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/essai.gif
new file mode 100644
index 0000000000..3eefc3f951
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/essai.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif
new file mode 100644
index 0000000000..c00cb34991
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif_old b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif_old
new file mode 100644
index 0000000000..c00cb34991
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-d.gif_old
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-g.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-g.gif
new file mode 100644
index 0000000000..ba138f3f62
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/fleche-col-g.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-d.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-d.gif
new file mode 100644
index 0000000000..cfa1a2fe57
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-d.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-g.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-g.gif
new file mode 100644
index 0000000000..fad0969c35
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/groscrayon-g.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-1.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-1.gif
new file mode 100644
index 0000000000..ba20a109bf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-1.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-2.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-2.gif
new file mode 100644
index 0000000000..8f86f0981f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-2.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-3.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-3.gif
new file mode 100644
index 0000000000..6a71390a1c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-3.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-4.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-4.gif
new file mode 100644
index 0000000000..7fece8052a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/petit-crayon-3d-4.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.gif
new file mode 100644
index 0000000000..bc5d8694c7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.mp
new file mode 100644
index 0000000000..2602c4b88a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-b.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+input arcenciel
+%input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-100,0);
+ Obs_phi:=0;Obs_dist:=10;
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,30,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.gif
new file mode 100644
index 0000000000..0e8cfc7442
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.mp
new file mode 100644
index 0000000000..f0d68d72df
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-d.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+input arcenciel
+%input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-100,0);
+ Obs_phi:=90;Obs_dist:=10;
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,30,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.gif
new file mode 100644
index 0000000000..21139da78a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.mp
new file mode 100644
index 0000000000..ee0a9e8986
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-g.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+input arcenciel
+%input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-100,0);
+ Obs_phi:=270;Obs_dist:=10;
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,30,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.gif
new file mode 100644
index 0000000000..1ab5edf28d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.mp
new file mode 100644
index 0000000000..f081492d1e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/contrib/denis-barbier/pointe-h.mp
@@ -0,0 +1,43 @@
+% Example d'utilisation de 3d.mp
+% Crayon a papier colores
+% METAPOST
+% D. Barbier 5 novembre 1997
+% Utilise 3d.mp v1.0
+% crayonmine.mp v0.2
+
+% package 3d
+input 3d-1.0
+
+% Definition des crayons
+input crayonmine
+
+% Choix des couleurs
+input arcenciel
+%input arcenciel2
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+draw_contours:=false;
+
+%
+show_animation_parameters:=true; % default value is |false|
+
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,0,-100,0);
+ Obs_phi:=180;Obs_dist:=10;
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ endfig;
+enddef;
+
+% animations
+animate_object("crayonmine",1,30,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.dvi b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.dvi
new file mode 100644
index 0000000000..f11a85d0ec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.log b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.log
new file mode 100644
index 0000000000..7e4f86891b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.log
@@ -0,0 +1,19 @@
+This is TeX, Version 3.14159 (C version 6.1) (format=tex 97.10.9) 9 APR 1998 14:12
+**3d \end
+(3d.tex
+Babel <v3.6h> and hyphenation patterns for american, german, loaded.
+(/usr/local/pkg/teTeX/texmf/tex/plain/base/mftmac.tex
+\shorthyf=\box16
+)
+(/usr/local/pkg/teTeX/texmf/tex/generic/dvips/epsf.tex
+\epsffilein=\read0
+\epsfxsize=\dimen16
+\epsfysize=\dimen17
+\epsftsize=\dimen18
+\epsfrsize=\dimen19
+\epsftmp=\dimen20
+\pspoints=\dimen21
+) [1] [2] [3] [4]
+[5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]
+[21] [22]) [23]
+Output written on 3d.dvi (23 pages, 89956 bytes).
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.mp
new file mode 100644
index 0000000000..0bffe5dafb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.mp
@@ -0,0 +1,1040 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3D.MP : 3-DIMENSIONAL REPRESENTATIONS
+%% AND ANIMATIONS IN METAPOST}}
+
+%% version 1.0, 8 April 1998
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+%% This package provides definitions enabling the manipulation
+%% and animation of 3-dimensional objects.
+%% Such objects can be included in a \TeX{} file or used on web pages
+%% for instance. See the documentation enclosed in the distribution for
+%% more details.
+
+%% Thanks to John Hobby and Ulrik Vieth for helpful hints.
+
+%% LIMITATIONS:
+
+%% $-$ an object can not include \TeX{} labels; to overcome this limitation
+%% would need to wrap the metapost output with dvips so that the
+%% necessary fonts are loaded (easy to do, but not done here)
+
+%% PROJECTS FOR THE FUTURE:
+
+%% $-$ take light sources into account and show shadows and darker faces
+
+%% $-$ handle overlapping of objects ({\it obj\_name\/} can be used when
+%% going through all faces)
+
+if known three_d_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3d, version 1.0 (c) D. Roegel, 8 April 1998 ***";
+numeric three_d_version;
+three_d_version=1.0;
+
+%%\newpage
+%%\title{Vector operations}
+
+% definition of vector |i| by its coordinates
+def vect_def(expr i,xi,yi,zi)= vect[i]x:=xi;vect[i]y:=yi;vect[i]z:=zi; enddef;
+
+% a point is stored as a vector
+let set_point = vect_def;
+
+% |set_obj_point| is like |set_point|, but the first parameter
+% is a local point number
+def set_obj_point(expr i,xi,yi,zi)=set_point(pnt(i),xi,yi,zi) enddef;
+
+% definition of a vector by an other vector
+def vect_def_vect(expr i,j)=
+ vect[i]x:=vect[j]x;vect[i]y:=vect[j]y;vect[i]z:=vect[j]z;
+enddef;
+
+% vector sum: |vect[k]| $\leftarrow$ |vect[i]|$+$|vect[j]|
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+
+% vector translation: |vect[i]| $\leftarrow$ |vect[i]|$+$|vect[v]|
+def vect_translate(expr i,v)=vect_sum(i,i,v) enddef;
+
+% vector difference: |vect[k]| $\leftarrow$ |vect[i]|$-$|vect[j]|
+def vect_diff(expr k,i,j)=
+ vect[k]x:=vect[i]x-vect[j]x;
+ vect[k]y:=vect[i]y-vect[j]y;
+ vect[k]z:=vect[i]z-vect[j]z;
+enddef;
+
+% dot product of |vect[i]| and |vect[j]|
+vardef vect_dprod(expr i,j)=
+ (vect[i]x*vect[j]x+vect[i]y*vect[j]y+vect[i]z*vect[j]z)
+enddef;
+
+% modulus of |vect[i]|
+vardef vect_mod(expr i)= sqrt(vect_dprod(i,i)) enddef;
+
+% vector product: |vect[k]| $\leftarrow$ |vect[i]| $\land$ |vect[j]|
+def vect_prod(expr k,i,j)=
+ vect[k]x:=vect[i]y*vect[j]z-vect[i]z*vect[j]y;
+ vect[k]y:=vect[i]z*vect[j]x-vect[i]x*vect[j]z;
+ vect[k]z:=vect[i]x*vect[j]y-vect[i]y*vect[j]x;
+enddef;
+
+% scalar multiplication: |vect[j]| $\leftarrow$ |vect[i]*v|
+def vect_mult(expr j,i,v)=
+ vect[j]x:=v*vect[i]x;vect[j]y:=v*vect[i]y;vect[j]z:=v*vect[i]z;
+enddef;
+
+% middle of two points
+def mid_point(expr k,i,j)= vect_sum(k,i,j);vect_mult(k,k,.5); enddef;
+
+%%\newpage
+%%\title{Vector rotation}
+% Rotation of |vect[v]| around |vect[axis]| by an angle |alpha|
+
+%% The vector $\vec{v}$ is first projected on the axis
+%% giving vectors $\vec{a}$ and $\vec{h}$:
+%%\figure{vect-fig.9}
+%% If we set
+%% $\vec{b}={\ora{axis}\over \left\Vert\vcenter{\ora{axis}}\right\Vert}$,
+%% the rotated vector $\vec{v'}$ is equal to $\vec{h}+\vec{f}$
+%% where $\vec{f}=\cos\alpha \cdot \vec{a} + \sin\alpha\cdot \vec{c}$.
+%% and $\vec{h}=(\vec{v}\cdot\vec{b})\vec{b}$
+%%\figure{vect-fig.10}
+
+% The rotation is independent of |vect[axis]|'s module.
+% |v| = old and new vector
+% |axis| = rotation axis
+% |alpha| = rotation angle
+%
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ v_d:=new_vect;v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v)); % projection of |v| on |axis|
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);free_vect(v_d);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Operations on objects}
+% |iname| is the handler for an instance of an object of class |name|
+% |iname| must be a letter string
+vardef assign_obj(expr iname,name)=
+ save tmpdef;
+ string tmpdef; % we need to add double quotes (char 34)
+ tmpdef="def " & iname & "_class=" & ditto & name & ditto & " enddef";
+ scantokens tmpdef;
+ def_obj(iname);
+enddef;
+
+% |name| is the the name of an object instance
+% It must be made only of letters (or underscores), but no digits.
+def def_obj(expr name)=
+ scantokens begingroup
+ save tmpdef;string tmpdef;
+ tmpdef="def_" & obj_class_(name) & "(" & ditto & name & ditto & ")";
+ tmpdef
+ endgroup
+enddef;
+
+% This macro puts an object back where it was right at the beginning.
+% |iname| is the name of an object instance.
+vardef reset_obj(expr iname)=
+ save tmpdef;
+ string tmpdef;
+ define_current_point_offset_(iname);
+ tmpdef="set_" & obj_class_(iname) & "_points";
+ scantokens tmpdef(iname);
+enddef;
+
+% Put an object at position given by |pos| (a vector) and
+% with orientations given by angles |psi|, |theta|, |phi|.
+% The object is scaled by |scale|.
+% |iname| is the name of an object instance.
+vardef put_obj(expr iname,pos,scale,psi,theta,phi)=
+ reset_obj(iname);scale_obj(iname,scale);
+ v_x:=new_vect;v_y:=new_vect;v_z:=new_vect;
+ vect_def_vect(v_x,vect_I);
+ vect_def_vect(v_y,vect_J);
+ vect_def_vect(v_z,vect_K);
+ rotate_obj_abs_pv(iname,point_null,v_z,psi);
+ vect_rotate(v_x,v_z,psi);vect_rotate(v_y,v_z,psi);
+ rotate_obj_abs_pv(iname,point_null,v_y,theta);
+ vect_rotate(v_x,v_y,theta);vect_rotate(v_z,v_y,theta);
+ rotate_obj_abs_pv(iname,point_null,v_x,phi);
+ vect_rotate(v_y,v_x,phi);vect_rotate(v_z,v_x,phi);
+ free_vect(v_z);free_vect(v_y);free_vect(v_x);
+ translate_obj(iname,pos);
+enddef;
+
+%%\newpage
+%%\title{Rotation, translation and scaling of objects}
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector |vect[v]|. The angle of rotation is |a|.
+vardef rotate_obj_pv(expr name,p,v,a)=
+ define_current_point_offset_(name);
+ rotate_obj_abs_pv(name,pnt(p),v,a);
+enddef;
+
+vardef rotate_obj_abs_pv(expr name,p,v,a)=
+ save v_a;
+ define_current_point_offset_(name);
+ v_a:=new_vect;
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),p);
+ vect_rotate(v_a,v,a);
+ vect_sum(pnt(i),v_a,p);
+ endfor;
+ free_vect(v_a);
+enddef;
+
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector $\ora{pq}$. The angle of rotation is |a|.
+vardef rotate_obj_pp(expr name,p,q,a)=
+ save v_a,axis;
+ define_current_point_offset_(name);
+ v_a:=new_vect;axis:=new_vect;
+ vect_diff(axis,pnt(q),pnt(p));
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),pnt(p));
+ vect_rotate(v_a,axis,a);
+ vect_sum(pnt(i),v_a,pnt(p));
+ endfor;
+ free_vect(axis);free_vect(v_a);
+enddef;
+
+% Translation of an object instance |name| by a vector |vect[v]|.
+vardef translate_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_sum(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+% Scalar multiplication of an object instance |name| by a scalar |v|.
+vardef scale_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_mult(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+
+%%\newpage
+%%\title{Functions to build new points in space}
+% Rotation in a plane: this is useful to define a regular polygon.
+% |k| is a new point obtained from point |j| by rotation around |o|
+% by a angle $\alpha$ equal to the angle from |i| to |j|.
+%%\figure{vect-fig.11}
+vardef rotate_in_plane_(expr k,o,i,j)=
+ save cosalpha,sinalpha,alpha,v_a,v_b,v_c;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);vect_prod(v_c,v_a,v_b);
+ cosalpha=vect_dprod(v_a,v_b)/vect_mod(v_a)/vect_mod(v_b);
+ sinalpha=sqrt(1-cosalpha**2);
+ alpha=angle((cosalpha,sinalpha));
+ vect_rotate(v_b,v_c,alpha);
+ vect_sum(k,o,v_b);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+vardef rotate_in_plane(expr k,o,i,j)=
+ rotate_in_plane_(pnt(k),o,pnt(i),pnt(j))
+enddef;
+
+% Build a point on a adjacent face.
+%% The middle $m$ of points $i$ and $j$ is such that
+%% $\widehat{(\ora{om},\ora{mc})}=\alpha$
+%% This is useful to define regular polyhedra
+%%\figure{vect-fig.7}
+vardef new_face_point_(expr c,o,i,j,alpha)=
+ save v_a,v_b,v_c,v_d,v_e;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;v_d:=new_vect;v_e:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);
+ vect_sum(v_c,v_a,v_b);
+ vect_mult(v_d,v_c,.5);
+ vect_diff(v_e,i,j);
+ vect_sum(c,v_d,o);
+ vect_rotate(v_d,v_e,alpha);
+ vect_sum(c,v_d,c);
+ free_vect(v_e);free_vect(v_d);free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+
+vardef new_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(pnt(c),pnt(o),pnt(i),pnt(j),alpha)
+enddef;
+
+vardef new_abs_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(c,o,pnt(i),pnt(j),alpha)
+enddef;
+
+%%\newpage
+%%\title{Computation of the projection of a point on the ``screen''}
+% |p| is the projection of |m|
+% |m| = point in space (3 coordinates)
+% |p| = point of the intersection plane
+%%\figure{vect-fig.8}
+vardef project_point(expr p,m)=
+ save tmpalpha,v_a,v_b;
+ v_a:=new_vect;v_b:=new_vect;
+ vect_diff(v_b,m,Obs); % vector |Obs|-|m|
+ % |vect[v_a]| is |vect[v_b]| expressed in (|ObsI|,|ObsJ|,|ObsK|)
+ % coordinates.
+ vect[v_a]x:=vect[IObsI_]x*vect[v_b]x
+ +vect[IObsJ_]x*vect[v_b]y+vect[IObsK_]x*vect[v_b]z;
+ vect[v_a]y:=vect[IObsI_]y*vect[v_b]x
+ +vect[IObsJ_]y*vect[v_b]y+vect[IObsK_]y*vect[v_b]z;
+ vect[v_a]z:=vect[IObsI_]z*vect[v_b]x
+ +vect[IObsJ_]z*vect[v_b]y+vect[IObsK_]z*vect[v_b]z;
+ if vect[v_a]x<Obs_dist: % then, point |m| is too close
+ message "Point " & decimal m & " too close -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ if (angle(vect[v_a]x,vect[v_a]z)>h_field/2)
+ or (angle(vect[v_a]x,vect[v_a]y)>v_field/2):
+ message "Point " & decimal m & " out of screen -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ tmpalpha:=Obs_dist/vect[v_a]x;
+ y[p]:=drawing_scale*tmpalpha*vect[v_a]y;
+ x[p]:=drawing_scale*tmpalpha*vect[v_a]z;
+ fi;
+ fi;
+ free_vect(v_b);free_vect(v_a);
+enddef;
+
+% Object projection
+% This is a mere iteration on |project_point|
+def project_obj(expr name)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):project_point(ipnt_(i),pnt(i));endfor;
+enddef;
+
+%%\newpage
+%%\title{Draw one face, hiding it if it is hidden}
+% The order of the vertices determines what is the visible side
+% of the face. The order must be clockwise when the face is seen.
+% |drawhidden| is a boolean; if |true| only hidden faces are drawn; if |false|,
+% only visible faces are drawn. Therefore, |draw_face| is called twice
+% by |draw_faces|.
+vardef draw_face(text vertices)(expr col,drawhidden)=
+ save p,num,normal_vect,v_a,v_b,v_c,overflow;
+ path p;boolean overflow;
+ overflow=false;
+ forsuffixes $=vertices:
+ if z[ipnt_($)]=(too_big_,too_big_):overflow:=true; fi;
+ exitif overflow;
+ endfor;
+ if overflow: message "Face can not be drawn, due to overflow";
+ else:
+ p=forsuffixes $=vertices:z[ipnt_($)]--endfor cycle;
+ num0:=0;num1:=0;num2:=0;
+ % get the three last suffixes:
+ forsuffixes $=vertices:num0:=num1;num1:=num2;num2:=$;endfor;
+ normal_vect:=new_vect;v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;
+ vect_diff(v_a,pnt(num1),pnt(num0));
+ vect_diff(v_b,pnt(num2),pnt(num1));
+ vect_prod(normal_vect,v_a,v_b);
+ vect_diff(v_c,pnt(num1),Obs);
+ if filled_faces:
+ if vect_dprod(normal_vect,v_c)<0:
+ fill p withcolor col;if draw_contours:drawcontour(p,contourwidth);fi;
+ else: % |draw p dashed evenly;| if this is done, you must ensure
+ % that hidden faces are (re)drawn at the end
+ fi;
+ else:
+ if vect_dprod(normal_vect,v_c)<0:%visible
+ if not drawhidden:draw p;fi;
+ else: % hidden
+ if drawhidden:
+ draw p withcolor background;% avoid strange overlapping dashes
+ draw p dashed evenly;
+ fi;
+ fi;
+ fi;
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);free_vect(normal_vect);
+ fi;
+enddef;
+
+% |p| is the path to draw (a face contour) and |thickness| is the pen width
+def drawcontour(expr p,thickness)=
+ pickup pencircle scaled thickness;
+ draw p;
+ pickup pencircle scaled .4pt;
+enddef;
+
+%%\newpage
+% Variables for face handling. First, we have an array for lists of vertices
+% corresponding to faces.
+string face_points_[];% analogous to |vect| arrays
+
+% Then, we have an array of colors. A color needs to be a string
+% representing an hexadecimal RGB coding of a color.
+string face_color_[];
+
+% |name| is the name of an object instance
+vardef draw_faces(expr name)=
+ save tmpdef;string tmpdef;
+ define_current_face_offset_(name);
+ % first the hidden faces (dashes must be drawn first):
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),true)";scantokens tmpdef;
+ endfor;
+ % then, the visible faces:
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),false)";scantokens tmpdef;
+ endfor;
+enddef;
+
+% Draw point |n| of object instance |name|
+vardef draw_point(expr name,n)=
+ define_current_point_offset_(name);
+ project_point(ipnt_(n),pnt(n));
+ if z[ipnt_(n)] <> (too_big_,too_big_):
+ pickup pencircle scaled 5pt;
+ drawdot(z[ipnt_(n)]);
+ pickup pencircle scaled .4pt;
+ fi;
+enddef;
+
+vardef draw_axes(expr r,g,b)=
+ project_point(1,vect_null);
+ project_point(2,vect_I);
+ project_point(3,vect_J);
+ project_point(4,vect_K);
+ if (z1<>(too_big_,too_big_)):
+ if (z2<>(too_big_,too_big_)):
+ drawarrow z1--z2 dashed evenly withcolor r;
+ fi;
+ if (z3<>(too_big_,too_big_)):
+ drawarrow z1--z3 dashed evenly withcolor g;
+ fi;
+ if (z4<>(too_big_,too_big_)):
+ drawarrow z1--z4 dashed evenly withcolor b;
+ fi;
+ fi;
+enddef;
+
+
+%%\newpage
+% Definition of a macro |obj_name| returning an object name
+% when given an absolute
+% face number. This definition is built incrementally through a string,
+% everytime a new object is defined.
+% |obj_name| is defined by |redefine_obj_name_|.
+
+% Initial definition
+string index_to_name_;
+index_to_name_="def obj_name(expr i)=if i<1:";
+
+% |name| is the name of an object instance
+% |n| is the absolute index of its last face
+def redefine_obj_name_(expr name,n)=
+ index_to_name_:=index_to_name_ & "elseif i<=" & decimal n & ":" & ditto
+ & name & ditto;
+ scantokens begingroup index_to_name_ & "fi;enddef;" endgroup;
+enddef;
+
+% |i| is an absolute face number
+% |vertices| is a string representing a list of vertices
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_face(expr i,vertices,rgbcolor)=
+ face_points_[i]:=vertices;face_color_[i]:=rgbcolor;
+enddef;
+
+% |i| is a local face number
+%|vertices| is a string representing a list of vertices
+%|rgbcolor| is a string representing a color in rgb hexadecimal
+def set_obj_face(expr i,vertices,rgbcolor)=set_face(face(i),vertices,rgbcolor)
+enddef;
+
+%%\newpage
+%%\title{Compute the vectors corresponding to the observer's viewpoint}
+% (vectors |ObsI_|,|ObsJ_| and |ObsK_| in the |vect_I|,|vect_J|,
+% |vect_K| reference; and vectors |IObsI_|,|IObsJ_| and |IObsK_|
+% which are |vect_I|,|vect_J|,|vect_K|
+% in the |ObsI_|,|ObsJ_|,|ObsK_| reference)
+%%\figure{vect-fig.16}
+%% (here, $\psi>0$, $\theta<0$ and $\phi>0$; moreover,
+%% $\vert\theta\vert \leq 90^\circ$)
+
+def compute_reference(expr psi,theta,phi)=
+ % |ObsI_| defines the direction of observation;
+ % |ObsJ_| and |ObsK_| the orientation
+ % (but one of these two vectors is enough,
+ % since |ObsK_| = |ObsI_| $\land$ |ObsJ_|)
+ % The vectors are found by rotations of |vect_I|,|vect_J|,|vect_K|.
+ vect_def_vect(ObsI_,vect_I);vect_def_vect(ObsJ_,vect_J);
+ vect_def_vect(ObsK_,vect_K);
+ vect_rotate(ObsI_,ObsK_,psi);
+ vect_rotate(ObsJ_,ObsK_,psi);% gives ($u$,$v$,$z$)
+ vect_rotate(ObsI_,ObsJ_,theta);
+ vect_rotate(ObsK_,ObsJ_,theta);% gives ($Obs_x$,$v$,$w$)
+ vect_rotate(ObsJ_,ObsI_,phi);
+ vect_rotate(ObsK_,ObsI_,phi);% gives ($Obs_x$,$Obs_y$,$Obs_z$)
+ % The passage matrix $P$ from |vect_I|,|vect_J|,|vect_K|
+ % to |ObsI_|,|ObsJ_|,|ObsK_| is the matrix
+ % composed of the vectors |ObsI_|,|ObsJ_| and |ObsK_| expressed
+ % in the base |vect_I|,|vect_J|,|vect_K|.
+ % We have $X=P X'$ where $X$ are the coordinates of a point
+ % in |vect_I|,|vect_J|,|vect_K|
+ % and $X'$ the coordinates of the same point in |ObsI_|,|ObsJ_|,|ObsK_|.
+ % In order to get $P^{-1}$, it suffices to build vectors using
+ % the previous rotations in the inverse order.
+ vect_def_vect(IObsI_,vect_I);vect_def_vect(IObsJ_,vect_J);
+ vect_def_vect(IObsK_,vect_K);
+ vect_rotate(IObsK_,IObsI_,-phi);vect_rotate(IObsJ_,IObsI_,-phi);
+ vect_rotate(IObsK_,IObsJ_,-theta);vect_rotate(IObsI_,IObsJ_,-theta);
+ vect_rotate(IObsJ_,IObsK_,-psi);vect_rotate(IObsI_,IObsK_,-psi);
+enddef;
+
+%%\newpage
+%%\title{Point of view}
+% This macro computes the three angles necessary for |compute_reference|
+% |name| = name of an instance of an object
+% |target| = target point (local to object |name|)
+% |phi| = angle
+vardef point_of_view_obj(expr name,target,phi)=
+ define_current_point_offset_(name);% enables |pnt|
+ point_of_view_abs(pnt(target),phi);
+enddef;
+
+% Compute absolute perspective. |target| is an absolute point number
+vardef point_of_view_abs(expr target,phi)=
+ save v_a,psi,theta;
+ v_a:=new_vect;
+ vect_diff(v_a,target,Obs);
+ vect_mult(v_a,v_a,1/vect_mod(v_a));
+ psi=angle((vect[v_a]x,vect[v_a]y));
+ theta=-angle((vect[v_a]x++vect[v_a]y,vect[v_a]z));
+ compute_reference(psi,theta,phi);
+ free_vect(v_a);
+enddef;
+
+
+
+% Distance between the observer and point |n| of object |name|
+% Result is put in |dist|
+vardef obs_distance(text dist)(expr name,n)=
+ save v_a;
+ v_a:=new_vect;
+ define_current_point_offset_(name);% enables |pnt|
+ dist:=vect_mod(v_a,pnt(n),Obs);
+ free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Vector and point allocation}
+% Allocation is done through a stack of vectors
+numeric last_vect_;
+last_vect_=0;
+
+% vector allocation
+def new_vect=incr(last_vect_)
+ % |message "Vector " & decimal last_vect_ & " allocated";|
+enddef;
+
+let new_point = new_vect;
+
+def new_points(text p)(expr n)=
+ save p;
+ numeric p[];
+ for i:=1 upto n:p[i]:=new_point;endfor;
+enddef;
+
+% Free a vector
+% A vector can only be freed safely when it was the last vector created.
+def free_vect(expr i)=
+ if i=last_vect_: last_vect_:=last_vect_-1;
+ else: errmessage("Vector " & decimal i & " can't be freed!");
+ fi;
+enddef;
+
+let free_point = free_vect;
+
+def free_points(text p)(expr n)=
+ for i:=10 step-1 until 1:free_point(p[i]);endfor;
+enddef;
+
+%%\title{Debugging}
+
+def show_vect(expr t,i)=
+ message "Vector " & t & "="
+ & "(" & decimal vect[i]x & "," & decimal vect[i]y & ","
+ & decimal vect[i]z & ")";
+enddef;
+
+let show_point=show_vect;
+
+def show_pair(expr t,zz)=
+ message t & "=(" & decimal xpart(zz) & "," & decimal ypart(zz) & ")";
+enddef;
+
+
+%%\newpage
+%%\title{Access to object features}
+% |a| must be a string representing an class name, such as |"dodecahedron"|.
+% |b| is the tail of a macro name.
+
+def obj_(expr a,b,i)=
+ scantokens
+ begingroup save n;string n;n=a & b & i;n
+ endgroup
+enddef;
+
+def obj_points_(expr name)=
+ obj_(obj_class_(name),"_points",name)
+enddef;
+
+def obj_faces_(expr name)=
+ obj_(obj_class_(name),"_faces",name)
+enddef;
+
+vardef obj_point_offset_(expr name)=
+ obj_(obj_class_(name),"_point_offset",name)
+enddef;
+
+vardef obj_face_offset_(expr name)=
+ obj_(obj_class_(name),"_face_offset",name)
+enddef;
+
+def obj_class_(expr name)=obj_(name,"_class","") enddef;
+
+%%\newpage
+def define_point_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_point_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_point_offset_;
+ last_point_offset_:=last_point_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_points" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_face_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_face_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_face_offset_;
+ last_face_offset_:=last_face_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_faces" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_current_point_offset_(expr name)=
+ save current_point_offset_;
+ numeric current_point_offset_;
+ current_point_offset_:=obj_point_offset_(name);
+enddef;
+
+def define_current_face_offset_(expr name)=
+ save current_face_offset_;
+ numeric current_face_offset_;
+ current_face_offset_:=obj_face_offset_(name);
+enddef;
+
+
+%%\newpage
+%%\title{Drawing an object}
+% |name| is an object instance
+def draw_obj(expr name)=project_obj(name);draw_faces(name);enddef;
+
+%%\title{Normalization of an object}
+% This macro translates an object so that a list of vertices is centered
+% on the origin, and the last vertex is put on a sphere whose radius is 1.
+% |name| is the name of the object and |vertices| is a list
+% of points whose barycenter will define the center of the object.
+% (|vertices| need not be the list of all vertices)
+vardef normalize_obj(expr name)(text vertices)=
+ save v_a,nvertices,last;
+ numeric v_a,last;
+ nvertices=0;
+ v_a=new_vect;vect_def(v_a,0,0,0)
+ forsuffixes $=vertices:
+ vect_sum(v_a,v_a,pnt($));
+ nvertices:=nvertices+1;
+ last:=$;
+ endfor;
+ vect_mult(v_a,v_a,-1/nvertices);
+ translate_obj(name,v_a);% object centered on the origin
+ scale_obj(name,1/vect_mod(pnt(last)));
+ free_vect(v_a);
+enddef;
+
+
+%%\newpage
+%%\title{General definitions}
+% Vector arrays
+numeric vect[]x,vect[]y,vect[]z;
+
+% Observer
+numeric Obs;
+Obs=new_point;
+% default value:
+set_point(Obs,0,0,20);
+
+% Observer's vectors
+ObsI_=new_vect;ObsJ_=new_vect;ObsK_=new_vect;
+IObsI_=new_vect;IObsJ_=new_vect;IObsK_=new_vect;
+
+% distance observer/plane (must be $>0$)
+numeric Obs_dist; % represents |Obs_dist| $\times$ |drawing_scale|
+% default value:
+Obs_dist=2; % means |Obs_dist| $\times$ |drawing_scale|
+
+% Screen Size
+% The screen size is defined through two angles: the horizontal field
+% and the vertical field
+numeric h_field,v_field;
+h_field=100; % degrees
+v_field=70; % degrees
+
+% Reference vectors $\vec{0}$, $\vec{\imath}$, $\vec{\jmath}$ and $\vec{k}$
+% and their definition
+numeric vect_null,vect_I,vect_J,vect_K;
+vect_null=new_vect;vect_I=new_vect;vect_J=new_vect;vect_K=new_vect;
+vect_def(vect_null,0,0,0);
+vect_def(vect_I,1,0,0);vect_def(vect_J,0,1,0);vect_def(vect_K,0,0,1);
+numeric point_null;
+point_null=vect_null;
+
+% Observer's orientation, defined by three angles
+numeric Obs_psi,Obs_theta,Obs_phi;
+% default value:
+Obs_psi=0;Obs_theta=90;Obs_phi=0;
+
+% Points for the figures
+numeric points_[];
+
+% |name| is the name of an object instance
+% |npoints| is its number of defining points
+def new_obj_points(expr name,npoints)=
+ define_point_offset_(name,npoints);define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):pnt(i):=new_point;endfor;
+enddef;
+
+% |name| is the name of an object instance
+% |nfaces| is its number of defining faces
+def new_obj_faces(expr name,nfaces)=
+ define_face_offset_(name,nfaces);define_current_face_offset_(name);
+ redefine_obj_name_(name,current_face_offset_+nfaces);
+enddef;
+
+%%\newpage
+% Absolute point number corresponding to object point number |i|
+% This macro must only be used within the function defining an object
+% (such as |def_cube|) or the function drawing an object (such as
+% |draw_cube|).
+def ipnt_(expr i)=i+current_point_offset_ enddef;
+def pnt(expr i)=points_[ipnt_(i)] enddef;
+
+def face(expr i)=(i+current_face_offset_) enddef;
+
+% Absolute point number corresponding to local point |n|
+% in object instance |name|
+vardef pnt_obj(expr name,n)=
+ hide(define_current_point_offset_(name);) pnt(n)
+enddef;
+
+% Absolute face number corresponding to local face |n|
+% in object instance |name|
+vardef face_obj(expr name,n)=
+ hide(define_current_face_offset_(name);) face(n)
+enddef;
+
+
+% Scale
+numeric drawing_scale;
+drawing_scale=2cm;
+
+% Color
+% This function is useful when a color is expressed in hexadecimal.
+def hexcolor(expr s)=
+ (hex(substring (0,2) of s)/255,hex(substring (2,4) of s)/255,
+ hex(substring (4,6) of s)/255)
+enddef;
+
+% Filling and contours
+boolean filled_faces,draw_contours;
+filled_faces=true;
+draw_contours=true;
+numeric contourwidth; % thickness of contours
+contourwidth=1pt;
+
+% Overflow control
+% An overflow can occur when an object is too close from the observer
+% or if an object is out of sight. We use a special value to mark
+% coordinates which would lead to an overflow.
+numeric too_big_;
+too_big_=4000;
+
+
+% Object offset (the points defining an object are arranged
+% in a single array, and the objects are easier to manipulate
+% if the point numbers are divided into a number and an offset).
+numeric last_point_offset_,last_face_offset_;
+last_point_offset_=0;last_face_offset_=0;
+
+
+%%\newpage
+%%\title{Computation of field parameters of an animation}
+numeric xmin_,ymin_,xmax_,ymax_;
+
+def compute_bbox=
+ if known xmin_:
+ xmin_:=min(xmin_,xpart(llcorner(currentpicture)));
+ ymin_:=min(ymin_,ypart(llcorner(currentpicture)));
+ xmax_:=max(xmax_,xpart(urcorner(currentpicture)));
+ ymax_:=max(ymax_,ypart(urcorner(currentpicture)));
+ else:
+ xmin_=xpart(llcorner(currentpicture));
+ ymin_=ypart(llcorner(currentpicture));
+ xmax_=xpart(urcorner(currentpicture));
+ ymax_=ypart(urcorner(currentpicture));
+ fi;
+enddef;
+
+boolean show_animation_parameters;
+show_animation_parameters=false;
+numeric paper_height;
+paper_height=29.7; % paper height in cm
+
+% show bounding box of an animation, in PostScript points
+% and parameters for animation script
+vardef show_animation_bbox=
+ save trx,try,h,w,delta,pnmx,pnmy,pnmw,pnmh,res;
+ res=36; % 36 dots per inch in bitmap
+ w=xmax_-xmin_;h=ymax_-ymin_;
+ if show_animation_parameters:
+ message "animation bbox: (llx=" & decimal round(xmin_)
+ & ",lly=" & decimal round(ymin_)
+ & ",w=" & decimal round(w) & ",h=" & decimal round(h) & ")";
+ fi;
+ if xmin_ <=20: trx=50-xmin_;else: trx=0;fi;
+ if ymin_ <=20: try=50-ymin_;else: try=0;fi;
+ if show_animation_parameters:
+ message "translate parameters: "
+ & decimal round(trx) & " " & decimal round(try);
+ fi;
+ xmin_:=xmin_+trx;ymin_:=ymin_+try;
+ delta=10;
+ pnmx=round(xmin_*(res/72)-delta);
+ pnmy=round((paper_height/2.54*72-ymin_-h)*(res/72)-delta);
+ pnmw=round(w*(res/72)+2*delta);
+ pnmh=round(h*(res/72)+2*delta);
+ if show_animation_parameters:
+ message "pnmcut parameters (with -r36): "
+ & decimal pnmx & " " & decimal pnmy & " "
+ & decimal pnmw & " " & decimal pnmh;
+ fi;
+ write_script(round(trx),round(try),
+ pnmx,pnmy,pnmw,pnmh,res,jobname,"create_animation.sh");
+enddef;
+
+%%\newpage
+%%\title{Creation of a shell script to automate the animation}
+% This is UNIX targetted and may need to be customized.
+
+vardef write_script(expr trx,try,xmin,ymin,w,h,res,output,file)=
+ save s;
+ string s;
+ def write_to_file(text arg)=write arg to file; enddef;
+ write_to_file("#! /bin/sh");
+ write_to_file("");
+ write_to_file("/bin/rm -f "&output&".log");
+ write_to_file("for i in `ls "&output&".*| grep '"&output&".[0-9]'`;do");
+ if false: "endfor" fi % indentation hack for meta-mode.el
+ write_to_file("echo $i");
+ write_to_file("echo '=============='");
+ s:="awk < $i '{print} /^%%Page: /{print "&ditto;
+ s:=s&decimal trx&" "&decimal try&" translate\n"&ditto&"}' > $i.ps";
+ write_to_file(s);
+ % ghostscript PostScript into ppm
+ s:="gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE ";
+ s:=s&"-r"&decimal res &" -sOutputFile=$i.ppm -q -- $i.ps";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ps");
+ % possible alternative:
+ % |s:="mogrify -compress -crop " & decimal(w) & "x" & decimal(h);|
+ % |s:=s&"+"& decimal(xmin) &"+"&decimal(ymin);|
+ % |s:=s&" -colors 32 -format gif $i.ppm";|
+ s:="ppmquant 32 $i.ppm | pnmcut "& decimal(xmin) &" "&decimal(ymin);
+ s:=s&" "&decimal(w)&" "&decimal(h) &" | ";
+ s:=s&"ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ppm");
+ write_to_file("done");
+ write_to_file("/bin/rm -f "&output&".gif");
+ s:="gifmerge -10 -l1000 ";
+ s:=s&output&".*.gif > "&output&".gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f "&output&".*.gif");
+ write_to_file(EOF);% end of file
+enddef;
+
+%%\newpage
+%%\title{Standard animation definitions}
+% These definitions produce {\it one\/} image of some kind.
+
+extra_endfig:="compute_bbox";
+
+% In the standard animations, the observer follows a circle, shown below:
+%%\figure{vect-fig.17}
+
+% Standard image 1: this is an example and may be adapted.
+% |name| is an object instance
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name,1,Obs_phi);% fix point 1 of object |name|
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ draw_point(name,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 2: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+%%\newpage
+% Standard image 3: this is an example and may be adapted.
+% |name_a|, |name_b| and |name_c| are object instances.
+def one_image_three_objects(expr name_a,name_b,name_c,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;h_field:=100;v_field:=150;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);draw_obj(name_c);
+ v_a:=new_vect;
+ vect_def(v_a,.03*cosd(-a*ang+90),.03*sind(-a*ang+90),0);
+ translate_obj(name_c,v_a);
+ free_vect(v_a);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 4: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_identical_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),2);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_a,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+
+%%\newpage
+% An animation is a series of images, and these series are produced here.
+
+% Standard animation 1
+% |name| is a class name
+def animate_object(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obj",name);
+ for i:=imin upto imax:one_image("obj",i+index,i,5,ang);endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 2
+% |name_a| and |name_b| are class names
+def animate_two_objects(expr name_a,name_b,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_objects("obja","objb",i+index,i,5,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 3
+% |name_a|, |name_b| and |name_c| are class names
+vardef animate_three_objects(expr name_a,name_b,name_c,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ assign_obj("objc",name_c);
+ scale_obj("objb",.7);
+ numeric v_a;v_a:=new_vect;
+ vect_def_vect(v_a,vect_K);vect_mult(v_a,v_a,4);put_obj("objb",v_a,1,0,0,0);
+ free_vect(v_a);
+ scale_obj("objc",.5);
+ translate_obj("objc",vect_K);translate_obj("objc",vect_K);
+ for i:=imin upto imax:
+ one_image_three_objects("obja","objb","objc",i+index,i,7,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 4
+% |name| is a class name
+def animate_two_identical_objects(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name);assign_obj("objb",name);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_identical_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.ps
new file mode 100644
index 0000000000..60eccb0701
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.ps
@@ -0,0 +1,3695 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: 3d.dvi
+%%Pages: 23
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentPaperSizes: A4
+%%EndComments
+%DVIPSCommandLine: dvips -Z -t a4 -o 3d.ps 3d.dvi
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1998.04.09:1412
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: finclude.pro
+/fstore{dup dict exch{dup 4 2 roll put}repeat def}bind def /fshow{gsave
+72 TeXDict /Resolution get div -72 TeXDict /VResolution get div scale 1
+DVImag div dup scale get cvx exec show grestore}bind def
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale true def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (3d.dvi)
+@start /Fa 5 53 df<EB3F803801FFF03803E0F83807803C48487E001E7F003E1480A2
+003C1307007C14C0A400FC14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A3803
+E0F86CB45A38003F801B277EA521>48 D<13381378EA01F8121F12FE12E01200B3AB487E
+B512F8A215267BA521>I<13FF000313E0380E03F0381800F848137C48137E00787F12FC
+6CEB1F80A4127CC7FC15005C143E147E147C5C495A495A5C495A010EC7FC5B5B90387001
+8013E0EA0180390300030012065A001FB5FC5A485BB5FCA219267DA521>I<13FF000313
+E0380F01F8381C007C0030137E003C133E007E133FA4123CC7123E147E147C5C495AEB07
+E03801FF8091C7FC380001E06D7E147C80143F801580A21238127C12FEA21500485B0078
+133E00705B6C5B381F01F03807FFC0C690C7FC19277DA521>I<1438A2147814F81301A2
+130313071306130C131C131813301370136013C012011380EA03005A120E120C121C5A12
+305A12E0B612E0A2C7EAF800A7497E90383FFFE0A21B277EA621>I
+E /Fb 7 123 df<130E131F5BA2133E131C90C7FCA7EA03E0487EEA0C78EA187C1230A2
+12605B12C0A2EA01F0A3485AA2485AA2EBC180EA0F81A2381F0300A213066C5A131CEA07
+F06C5A11287DA617>105 D<1407EC0F80141FA21500140E91C7FCA7EB03E0EB07F8EB0C
+3C1318EB303E136013C0A248485AA2C7FCA25CA4495AA4495AA4495AA4495AA21238D87C
+1FC7FC12FC133E485AEA70F8EA7FE0EA1F80193380A61B>I<133EEA07FEA2EA007CA213
+FCA25BA21201A25BA21203EC07809038E01FC0EC38600007EB61E014C3EBC187EBC307D8
+0FC613C09038CC038001B8C7FC13E0487E13FEEB3F80EB0FC0486C7E1303003E1460A212
+7EECC0C0127CECC18012FC903801E30038F800FE0070137C1B297CA723>I<9038F007C0
+3901FC1FF039031E78780006EBE03C90381FC01C000CEB801E14005B0018141F133E1200
+137E153E137CA213FC157C5B1578000114F0A2EC01E0EC03C03903FC07809038FE1F00EB
+E7FCEBE1F0D807E0C7FCA25BA2120FA25B121FEAFFF8A22025809922>112
+D<90387C03C03901FF0FF03907079C30390E03B078000CEBF0F8001813E1123015F03960
+07C0E015001200A2495AA449C7FC15301238007C1460EAFC3E15C0EAF87E39F06F038039
+70C70700383F83FE381F01F81D1B7D9926>120 D<EA03E0486C1370D80C7813F8EA187C
+0030EB01F0A2126013F800C0EB03E0A2EA01F0A2EC07C0EA03E0A33907C00F80A4EC1F00
+A25C00035B3801E0FE3800FFBEEB3F3E13005C121E003F5B5C387E01E0383C03C0383007
+80D81C1FC7FCEA0FFCEA07F01D267D9922>I<013E13C0137F9038FF818048EBC3004813
+FF380701FE3806000C00045BC75A5C5CEB03800106C7FC5B5B5B5B9038C00180EA038039
+060003005C380FF81E381FFFFE38383FFC38601FF86D5A38C007C01A1B7D9920>I
+E /Fc 1 101 df<197C953807FFC0067F13FC0507B612C0057F15FC040FB50083EBFFE0
+93B526F0001F13FE030F01FCC8387FFFE092B50080030313FE020F01F0CA381FFFE0DAFF
+FCCCEA7FFE011F0180963803FFF02601FFF0CEEA1FFFD81FFED013F0D8FF80F503FE00F0
+D2121E771080BF78>100 D E /Fd 3 49 df<B712FEA327037A8F34>0
+D<137F3801FFC0000713F0380FC1F8381F007C003C131E0038130E0078130F00707F00F0
+1480481303A56C13070070140000785B0038130E003C131E001F137C380FC1F86CB45A00
+0113C06C6CC7FC19197C9A22>14 D<13E0EA01F0EA03F8A3EA07F0A313E0A2120F13C0A3
+EA1F80A21300A25A123EA35AA3127812F8A25A12100D1E7D9F13>48
+D E /Fe 39 127 df<EC3FC0ECFFF8903807E07C90380F801FD93F00EB800C017E130F49
+903807C01C4848ECE018485A484801031338000FEDF0305B001F16704848156017E0007F
+16C090C713F1178016F34816004815F716FE5EA2485D5EA4007E1407150F003E91381DF8
+18003F14796C02E11338270F8007C013303B07E03F007CF02601FFF8EB3FC026003FC0EB
+0F802E267DA435>11 D<EC03F0EC0FFCEC3E1EEC780F14F001011480903803E007D907C0
+13C0EB0F80131F14004914E0137EA25BA2485A1203A249130F1207A2485AA2ED1FC0121F
+5BA290B6FC481580A3903880007F007F150090C7FCA215FEA2127E4A5AA200FE5C1403A2
+007C5C4A5AA24A5AA24A5A92C7FC5C6C137E147C001E5B495A6C485A380787806CB4C8FC
+EA00F8233C7EBA27>18 D<1503A35DA21506A2150EA2150CA2151CA21518A21538A21530
+A21570A2EC07FE91383FFFC0903901FCE3F0903907E0E0F890391F80C03ED93E007FEB7C
+01D801F8EC0F80D803F0018013C0D807E014071403D80FC015E0D81F801300A248485AA2
+007E1306A2020E130F12FE48010C14C0A2021CEB1F80A20218EB3F00A20238137E007C5D
+1430007E4A5A003E90387003F06CEC07C09138600F80D80F80013FC7FC3903E0E0FC3901
+F8E7F039007FFF80D90FFCC8FCEB01C0A25CA21303A291C9FCA25BA21306A2130EA2130C
+A22B4B7CB931>30 D<160C161C1618A316381630A316701660A316E05EA315015EA301F8
+0103130FD803FE9138001F80D8070F153F000E018015C0001C5C001814060038161F0030
+160FD8701F010E13070060140C1703D8E03F168000C0EB001C491318EA007E180001FE13
+384913305F000116064913700360130E5F000316184901E013384B133017705F0201495A
+D801F849485A4CC7FC160E2600FC035B017EEB0078013FEB01E090390FE30F80902603FF
+FEC8FC9038003FF00206C9FCA2140E140CA3141C1418A314381430A314701460324B7EB9
+36>32 D<121C127FEAFF80A5EA7F00121C0909798817>58 D<121C127FEAFF80A213C0A3
+127F121C1200A412011380A2120313005A1206120E5A5A5A12600A19798817>I<EF0380
+EF0FC0173FEFFF80933803FE00EE0FF8EE3FE0EEFF80DB03FEC7FCED0FF8ED3FE0EDFF80
+DA03FEC8FCEC0FF8EC3FE0ECFF80D903FEC9FCEB0FF8EB3FE0EBFF80D803FECAFCEA0FF8
+EA3FE0EA7F8000FECBFCA2EA7F80EA3FE0EA0FF8EA03FEC66C7EEB3FE0EB0FF8EB03FE90
+3800FF80EC3FE0EC0FF8EC03FE913800FF80ED3FE0ED0FF8ED03FE923800FF80EE3FE0EE
+0FF8EE03FE933800FF80EF3FC0170FEF0380323279AD41>I<150C151E153EA2153C157C
+A2157815F8A215F01401A215E01403A215C01407A21580140FA215005CA2141E143EA214
+3C147CA2147814F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C
+137CA2137813F8A25B1201A25B1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C
+127CA2127812F8A25A12601F537BBD2A>I<126012FCB4FCEA7FC0EA1FF0EA07FCEA01FF
+38007FC0EB1FF0EB07FCEB01FF9038007FC0EC1FF0EC07FCEC01FF9138007FC0ED1FF0ED
+07FCED01FF9238007FC0EE1FF0EE07FCEE01FF9338007F80EF1FC0A2EF7F80933801FF00
+EE07FCEE1FF0EE7FC04B48C7FCED07FCED1FF0ED7FC04A48C8FCEC07FCEC1FF0EC7FC049
+48C9FCEB07FCEB1FF0EB7FC04848CAFCEA07FCEA3FF0EA7FC048CBFC12FC1270323279AD
+41>I<4BB4FC031F13F09238FE01FC913903F0007EDA07C0EB1F80DA1F80EB0FC0023EC7
+EA07E002FCEC03F0495A4948EC01F8495A4948EC00FC495A49C912FE49167E13FE49167F
+1201485AA2485AA2120F5B001F17FFA2485AA34848ED01FEA400FFEE03FC90C9FCA2EF07
+F8A2EF0FF0A218E0171F18C0EF3F806C167F180017FE4C5A6C6C5D1603001F4B5A6D4A5A
+000FED1F806C6C4AC7FC6D147E0003EC01F8D801FC495AD8007EEB0FC090263F807FC8FC
+903807FFF801001380383D7CBA3F>79 D<0103B7FC4916E018F8903B0007F80007FC4BEB
+00FE187F020FED3F80F01FC05DA2021F16E0A25DA2143FF03FC05DA2027FED7F80A292C8
+130018FE4A4A5A604AEC07F04D5A0101ED3FC04CB4C7FC91B612FC17E0D903FCCAFCA25C
+A21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA291CBFC497EB6FCA33B397DB8
+35>I<49B500F890387FFFF095B5FC1AE0D90003018090380FFC004BC713E00201ED0780
+4EC7FC6E6C140E606F5C705B606F6C485A4D5A031F91C8FCEEE0065F6F6C5A5F03075B70
+5A16F96FB45A94C9FC6F5AA36F7EA34B7FED037F9238063FC0150E4B6C7E1538ED700F03
+E07F15C04A486C7EEC0300020613034A805C4A6D7E14704A1300494880495A49C86C7E13
+0E011E153F017E4B7ED803FF4B7E007F01E0011FEBFFC0B5FC6144397EB845>88
+D<147E903803FF8090390FC1C38090391F00EFC0017E137F49133F485A4848EB1F801207
+5B000F143F48481400A2485A5D007F147E90C7FCA215FE485C5AA214015D48150CA21403
+EDF01C16181407007C1538007E010F1330003E131F027B13706C01E113E03A0F83C0F9C0
+3A03FF007F80D800FCEB1F0026267DA42C>97 D<133FEA1FFFA3C67E137EA313FE5BA312
+015BA312035BA31207EBE0FCEBE3FF9038E707C0390FFE03E09038F801F001F013F8EBE0
+00485A15FC5BA2123F90C7FCA214015A127EA2140312FE4814F8A2140715F05AEC0FE0A2
+15C0EC1F80143F00781400007C137E5C383C01F86C485A380F07C06CB4C7FCEA01FC1E3B
+7CB924>I<EC3FC0903801FFF0903807E03C90380F800E90383F0007017E131F49137F48
+4813FF485A485A120F4913FE001F143848481300A2127F90C8FCA35A5AA45AA315031507
+007E1406150E003E143C003F14706C14E0390F8007C03907C03F003801FFF838003FC020
+267DA424>I<163FED1FFFA3ED007F167EA216FEA216FCA21501A216F8A21503A216F0A2
+1507A2027E13E0903803FF8790380FC1CF90381F00EF017EEB7FC049133F485A4848131F
+000715805B000F143F485A1600485A5D127F90C7127EA215FE5A485CA21401A248ECF80C
+A21403161CEDF0181407007C1538007E010F1330003E131F027B13706C01E113E03A0F83
+C0F9C03A03FF007F80D800FCEB1F00283B7DB92B>I<16F8ED03FEED0F8792381F0F80ED
+3E3F167F157CA215FC1700161C4A48C7FCA414035DA414075DA20107B512F0A39026000F
+E0C7FC5DA4141F5DA4143F92C8FCA45C147EA514FE5CA413015CA4495AA45C1307A25C12
+1E123F387F8F80A200FF90C9FC131E12FEEA7C3CEA7878EA1FF0EA07C0294C7CBA29>
+102 D<EC07E0EC1FF891387C1C38903901F80EFC903803F007903807E003EB0FC090381F
+8001D93F0013F85B017E130313FE16F0485A150712034914E0A2150F12074914C0A2151F
+A2491480A2153FA2160000035C6D5B00015B4A5A3900F8077E90387C1EFEEB1FF8903807
+E0FC90C7FC1401A25DA21403001E5C123F387F80075D00FF495A49485A4849C7FC007C13
+7E383C01F8381FFFE0000390C8FC26367FA428>I<EB03F0EA01FFA3EA00075CA3130F5C
+A3131F5CA3133F91C9FCA35B90387E03F8EC0FFF91383C0F809039FEF007C0D9FDC07FEB
+FF80EC0003485A5BA249130712035BA2150F00075D5BA2151F000F5D5B153F93C7FC121F
+4990387F0180157EEDFE03003F02FC130090C7FC5EEDF80648150E007E150C161C5E00FE
+EC787048EC3FE00038EC0F80293B7CB930>I<14E0EB03F8A21307A314F0EB01C090C7FC
+AB13F8EA03FEEA070F000E1380121C121812381230EA701F1260133F00E0130012C05BEA
+007EA213FE5B1201A25B12035BA20007131813E01438000F133013C01470EB806014E014
+C01381EB838038078700EA03FEEA00F815397EB71D>I<150FED3F80A2157FA31600151C
+92C7FCABEC0F80EC3FE0ECF0F0903801C0F849487E14005B130E130C131CEB1801133801
+305BA2EB0003A25DA21407A25DA2140FA25DA2141FA25DA2143FA292C7FCA25CA2147EA2
+14FEA25CA21301001E5B123F387F83F0A238FF87E0495A00FE5BD87C1FC8FCEA707EEA3F
+F8EA0FC0214981B722>I<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C8FC
+A35B017EEB07C0ED1FF0ED783801FEEBE0F89039FC01C1FCEC0383EC07070001130ED9F8
+1C13F891383803F091387001E0000349C7FCEBF1C0EBF38001F7C8FCEA07FEA2EBFFE0EB
+E7F8380FE0FEEBC07F6E7E141F001F80D9800F1330A21670003F011F136001001380A216
+E04815C0007E1481020F1380158300FE903807870048EB03FE0038EB00F8263B7CB92B>
+I<D803E0017F14FE3D07F801FFE003FFC03D0E3C0781F00F03E03D1C3E1E00F83C01F026
+383F38D9FC707F00304914E04A90387DC000007049EB7F8000604991C7FCA200E090C700
+FE1301485A017E5CA200000201140301FE5F495CA203031407000160495C180F03075D12
+03494A011F13601980030F023F13E00007F000C0495C1901031F023E1380000F1803494A
+150061033F150E001FEF1E1C4991C7EA0FF80007C7000EEC03E043267EA449>109
+D<D803E0137F3A07F801FFE03A0E3C0781F03A1C3E1E00F826383F387F00305B4A137C00
+705B00605BA200E090C712FC485A137EA20000140101FE5C5BA2150300015D5B15075E12
+0349010F133016C0031F13700007ED80605B17E0EE00C0000F15014915801603EE070000
+1FEC0F0E49EB07FC0007C7EA01F02C267EA432>I<EC1FC0ECFFF8903807E07E90380F80
+1F90393F000F80017E14C0491307484814E0485A4848EB03F0120F5B121F48481307A212
+7F90C7FCA2150F5A4815E0A2151F16C0A248EC3F8016005D157E007E5C4A5A003E495A00
+3F495A6C495A6C6C48C7FC3807E07E3801FFF038003F8024267DA428>I<90390F8003F0
+90391FE00FFC903939F03C1F903A70F8700F80903AE0FDE007C09038C0FF80030013E000
+01491303018015F05CEA038113015CA2D800031407A25CA20107140FA24A14E0A2010F14
+1F17C05CEE3F80131FEE7F004A137E16FE013F5C6E485A4B5A6E485A90397F700F80DA38
+3FC7FC90387E1FFCEC07E001FEC9FCA25BA21201A25BA21203A25B1207B512C0A32C3583
+A42A>I<02FC13C0903803FF0190380F838390383F01C790397E00EF8049137F485A4848
+133F000715005B485A001F5C157E485AA2007F14FE90C75AA3481301485CA31403485CA3
+14075D140F127C141F007E495A003E137F381F01EF380F839F3903FF1F80EA00FC130014
+3F92C7FCA35C147EA314FE5C130190387FFFF0A322357DA425>I<3903E001F83907F807
+FE390E3C1E07391C3E381F3A183F703F800038EBE07F0030EBC0FF00705B00601500EC00
+7E153CD8E07F90C7FCEAC07EA2120013FE5BA312015BA312035BA312075BA3120F5BA312
+1F5B0007C9FC21267EA425>I<14FF010313C090380F80F090383E00380178131C153C49
+13FC0001130113E0A33903F000F06D13007F3801FFE014FC14FF6C14806D13C0011F13E0
+13039038003FF014071403001E1301127FA24814E0A348EB03C012F800E0EB07800070EB
+0F006C133E001E13F83807FFE0000190C7FC1E267CA427>I<EB01C0497E1307A4130F5C
+A3131F5CA3133F91C7FC007FB51280A2B6FCD8007EC7FCA313FE5BA312015BA312035BA3
+12075BA3120FEBC006A2140E001F130CEB801C141814385C146014E0380F81C038078780
+D803FEC7FCEA00F819357EB31E>I<13F8D803FE1438D8070F147C000E6D13FC121C1218
+003814011230D8701F5C12601503EAE03F00C001005B5BD8007E1307A201FE5C5B150F12
+01495CA2151F120349EC80C0A2153F1681EE0180A2ED7F0303FF130012014A5B3A00F807
+9F0E90397C0E0F1C90393FFC07F8903907F001F02A267EA430>I<01F8EB03C0D803FEEB
+07E0D8070F130F000E018013F0121C12180038140700301403D8701F130112601500D8E0
+3F14E000C090C7FC5BEA007E16C013FE5B1501000115805B150316001203495B1506150E
+150C151C151815385D00015C6D485A6C6C485AD97E0FC7FCEB1FFEEB07F024267EA428>
+I<01F816F0D803FE9138E001F8D8070F903801F003000ED9800314FC121C121800380207
+13010030EDE000D8701F167C1260030F143CD8E03F163800C001005B5BD8007E131F1830
+01FE5C5B033F1470000117604991C7FCA218E000034A14C049137E17011880170318005F
+03FE1306170E000101015C01F801BF5B3B00FC039F8070903A7E0F0FC0E0903A1FFC03FF
+C0902703F0007FC7FC36267EA43B>I<903907E001F090391FF807FC9039783E0E0F9039
+E01F1C1FD801C09038383F803A03800FF07F0100EBE0FF5A000E4A1300000C157E021F13
+3C001C4AC7FC1218A2C7123FA292C8FCA25CA2147EA214FEA24A130CA20101141C001E15
+18003F5BD87F81143801835C00FF1560010714E03AFE0E7C01C0D87C1C495A2778383E0F
+C7FC391FF00FFC3907C003F029267EA42F>I<13F8D803FE1470D8070F14F8000EEB8001
+121C121800381403003015F0EA701F1260013F130700E0010013E012C05BD8007E130F16
+C013FE5B151F000115805BA2153F000315005BA25D157EA315FE5D1401000113033800F8
+0790387C1FF8EB3FF9EB0FE1EB00035DA2000E1307D83F805B007F495AA24A5A92C7FCEB
+003E007C5B00705B6C485A381E07C06CB4C8FCEA01FC25367EA429>I<D901E01360D90F
+F813E0496C13C090383FFE0190397FFF038090B5EA07009038F81FFF3901E003FE9038C0
+001C495B5DC85A4A5A4A5A4AC7FC140E5C5C14F0495AEB038049C8FC130E5B4913035B49
+5B484813064848130E48C75AD80FFC137C391FFF81F8381E0FFFD838075B486C5B00605C
+D8E00190C7FC38C0007C23267DA427>I<13F8EA03FEEA070F000E1380121C1218123812
+30EA701F1260133F00E0130012C05BEA007EA213FE5B1201A25B12035BA20007131813E0
+1438000F133013C01470EB806014E014C01381EB838038078700EA03FEEA00F815267EA4
+1B>I<EC0F80EC3FE0ECF0F0903801C0F890380380FC14005B130E130C131CEB18011338
+013013F8A2EB0003A215F0A21407A215E0A2140FA215C0A2141FA21580A2143FA21500A2
+5CA2147EA214FEA25CA21301001E5B123F387F83F0A238FF87E0EB07C048485AD87C1FC7
+FCEA783EEA1FF8EA07E01E3681A420>I<1504151E151FA2ED0F8016C0ED07E0007FB612
+F0B712F8A26C15F0C8EA1FC0ED3F00157E5D5D5D1560251271BB2A>126
+D E /Ff 75 126 df<121C127FEAFF80B1EA7F00AF123EC7FCA8121C127FA2EAFF80A3EA
+7F00A2121C09346FB32C>33 D<003C131E007F137F481480A66C1400A6007E7FA6003E13
+3EA3003C131E001C131C191977B32C>I<010F133C90381F807EA8013F13FE4A5AA4007F
+B612F0B712F8A4003F15F03A007E01F800A5EBFE0301FC5BA6003FB612F0B712F8A46C15
+F03A01F807E000A30003130F01F05BA86C486C5A25337DB22C>I<EB01C0497EA6EB0FFC
+90387FFF8048B512E00007804880391FFBEFFC393FC3E1FE903803E07F007E80127C00FC
+158012F8157FA300FCEC3F00A2007E91C7FC127FEA3FC313FBEA1FFF6C13FC6C13FF0001
+14C06C6C7F011F13F801037F14E7ECE1FEECE07F81001880007E1580150F12FFA312FE15
+1F1600007E5C007F143ED83F8313FE9038C3E1FC391FFBEFF86CB55A6C5C6C5CC691C7FC
+EB1FF8EB03E0A66D5A21417BB92C>I<D807801307D81FE0EB0F80151F487E486C133F16
+00007C5CD8FCFC137EEAF87C15FE5D14015DA21403D8FCFC5BEA7CF8007F13075D383FF0
+0FD81FE05BA23807801FC75B143F92C7FCA25C147E14FE5CA213015CA213035C13075CA2
+130F5C131FEC800FED3FC0013FEB7FE0140049EBFFF0017E13F9A2D9FE0113F801FC13F0
+A2120113F8120313F015F90007010013F05B000F14FF49EB7FE0A20007EC3FC06C48EB0F
+0025417DB92C>I<EA0F80EA1FC0EA3FE013F0A213F8A2121F120F1200A4120113F0A212
+0313E01207EA0FC0121FEA3F80EA7F0012FE5A5A12700D1B71B22C>39
+D<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F
+5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F
+12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C>
+I<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0
+A214F01303A214F81301A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F
+1480133F14005B13FE485A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<
+EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14
+E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB
+07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>I<147814FCAF007FB6
+12F0B712F8A46C15F0C700FCC7FCAF147825267DAB2C>I<EA0F80EA1FE0EA3FF0EA7FF8
+A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12
+700E17718A2C>I<007FB6FCB71280A46C150021067B9B2C>I<121FEA3F80EA7FC0EAFFE0
+A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507ED0F80151FA2153F16005D157E15FE5D14
+015D14035DA214075D140F5D141F5D143F92C7FC5C147E14FE5CA213015C13035C13075C
+130F5C131F5CA2133F91C8FC5B137E13FE5B12015B12035B12075BA2120F5B121F5B123F
+90C9FC5A127E12FE5AA25A127821417BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E
+3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248C7EA1F80A2003E140F
+007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C13
+7E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F82335
+7CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3
+AE007FB512E0B612F0A36C14E01C3477B32C>I<EB0FF890387FFF8048B512E000078048
+14FC391FF80FFE393FE001FF903880007F48C7EA3F80007E141F00FE15C0150F6C15E015
+07A3127E123CC8FCA2150F16C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5A
+ECFF804948C7FC495A495A495AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1F
+E0485A48B6FCB7FCA36C15C023347CB32C>I<EB0FFC90387FFF8048B512E0000714F848
+80391FF807FEEBC0004848137F6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE1401
+4A5AEC1FF890381FFFF0495BA215F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA216
+E01507A2123C127EB4FC150F16C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE6C
+B55A6C5C6C14E0C66C1380D90FFCC7FC23357CB32C>I<EC07F04A7E141F143FA2147EA2
+14FCEB01F8A2EB03F0EB07E0A2EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B120748
+5AA2485A48C7FCA2127E5AB712FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E
+13F027347EB32C>I<EC3FC0903801FFF801077F011F7F497F90387FE07F9039FF003F80
+4848137FEA03F8485A5B000FEC3F004848131E4990C7FC123F90C9FCA25A127EEB03FE90
+381FFF80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE9038C0007F49EB3F8090C7
+121F16C048140F16E01507A3127EA47E150F6D14C0001F141F6D1480000F143F6DEB7F00
+3907F801FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7FC23357CB32C>54
+D<EB07FC90383FFF8090B512E0000314F84880390FFC07FE391FF001FF9038C0007F4848
+EB3F8090C7121F4815C0007E140FA56CEC1F80A26C6CEB3F006D5B390FF001FE3903FC07
+F86CB55A6C6C13C0D907FCC7FC90387FFFC048B512F03903FC07F8390FF001FE391FC000
+7F497F48C7EA1F80007EEC0FC0A248EC07E0A7007EEC0FC0A2007F141F6C6CEB3F806C6C
+EB7F009038F001FF390FFC07FE6CB55A6C5CC614E0013F1380D907FCC7FC23357CB32C>
+56 D<EB07FCEB3FFF90B512C0488048803907FC07F8390FF001FC48486C7ED83F80137E
+157F48C77E007EEC1F8012FE5AED0FC0A416E0A37E127E007F141F7E6D133F6C6C137F39
+0FF001FF3807FC0F6CB6FC6C14F76C14C7013F130FD90FF813C090C7FCA2151F1680153F
+1600000F5C486C137E486C13FE4A5A4A5A14079038801FF0391FE07FE090B55A6C91C7FC
+6C5B000113F838007FC023357CB32C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA
+1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F80
+EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA0F80EA1FC0EA3FE0127F13F0A4
+123F121F120F1201120313E01207EA0FC0A2EA3F80EA7F005A5A12F812700C3071A32C>
+I<1507ED1F80153F15FF14034A1300EC1FFC4A5AECFFE0491380010790C7FCEB0FFCEB3F
+F8EB7FE048485A4890C8FCEA0FFEEA1FF8EA7FF0EAFFC05BA27FEA7FF0EA1FF8EA0FFEEA
+03FF6C13C06C6C7EEB3FF8EB0FFC6DB4FC01017F6D13E0EC3FF86E7EEC07FF6E13801400
+153F151FED0700212A7BAD2C>I<007FB612F0B712F8A4003F15F0CAFCA8003FB612F0B7
+12F8A46C15F025147DA22C>I<127012FC7E6C7E13E06C7EEA1FFC6C7E3803FF80C67FEB
+7FF0EB1FF8EB0FFEEB03FF6D13C06D6C7EEC3FF8EC0FFC6EB4FC0201138080A25C020713
+00EC0FFCEC3FF8EC7FE049485A4990C7FCEB0FFEEB1FF8EB7FF0EBFFC000035BD80FFEC8
+FC485AEA7FF0485A138048C9FC5A1270212A7BAD2C>I<14FE497EA4497FA214EFA21307
+81A214C7A2010F7FA314C390381F83F0A590383F01F8A490387E00FCA549137E90B512FE
+A34880A29038F8003FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C15
+FC497E27347EB32C>65 D<02FF13700107EBE0F84913F9013F13FD4913FFEBFF813901FE
+007F4848131FD807F0130F1507485A491303485A150148C7FCA25A007EEC00F01600A212
+FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C13036D14F06C6C130716E0D803FC13
+1F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13F00100138025357DB32C>67
+D<007FB5FCB612C015F0816C803907E003FEEC00FFED7F80153FED1FC0ED0FE0A2150716
+F0150316F81501A4ED00FCACED01F8A3150316F0A2150716E0150FED1FC0153FED7F80ED
+FF00EC03FE007FB55AB65A5D15C06C91C7FC26337EB22C>I<007FB612F0B712F8A37E39
+03F00001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8
+007FB612FEB7FCA36C15FC27337EB22C>I<007FB612F8B712FCA37ED803F0C7FCA71678
+1600A515F04A7EA490B5FCA5EBF001A46E5A92C7FCAD387FFFE0B5FC805C7E26337EB22C
+>I<007FB512F8B612FCA36C14F839000FC000B3B3A5007FB512F8B612FCA36C14F81E33
+79B22C>73 D<D87FF0EB7FFC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13
+CFA2148013C714C0A213C314E0A213C114F0A213C014F8A2147CA3143EA2141E141FA214
+0F1587A2140715C7A2140315E71401A215F71400A215FFD87FFC137F487E153FA26C48EB
+1F8027337EB22C>78 D<EB7FFF0003B512E0000F14F848804880EBE003EB800048C7127F
+A2007E80A300FE158048141FB3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5
+FC6C5C6C5C000314E0C66C90C7FC21357BB32C>I<007FB512C0B612F88115FF6C158026
+03F00013C0153FED0FE0ED07F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF
+90B61280160015FC5D15C001F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<387FFFFC
+B67E15E015F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01
+FE140790B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1F
+BFB5ECFF00815E6C486D5AC8EA01F029347EB22C>82 D<90381FF80790B5EA0F804814CF
+000714FF5A381FF01F383FC003497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E
+91C7FC127F7FEA3FE0EA1FFCEBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007F
+FEEC07FF02001380153FED1FC0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D13
+3F01E0EB7F009038FE01FF90B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>
+I<3B7FFF803FFFC0B56C4813E0A36C496C13C03B03F00001F800B3AF6D130300015DA26D
+130700005D6D130F017F495A6D6C485AECE0FF6DB5C7FC6D5B010313F86D5B9038003F80
+2B3480B22C>85 D<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F0007
+15C0A36D131F00031580A36D133F00011500A36D5B0000147EA4017E5BA46D485AA49038
+1F83F0A4010F5B14C7A301075BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB22C
+>I<003FB612C04815E0A4007EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC71203
+4A5AA24A5A4A5AA24A5A4AC7FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213
+FE485AA24848EB03C049EB07E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB2
+2C>90 D<387FFFFCB512FEA314FC00FCC7FCB3B3B3B512FC14FEA36C13FC17416FB92C>
+I<127812F87EA27E127E127F7E7F121F7F120F7F1207A27F12037F12017F12007F137E13
+7F7F80131FA280130F801307801303801301801300A280147E147F8081141F81140F8114
+07811403A281140181140081157E157F811680151FA2150FED070021417BB92C>I<387F
+FFFCB512FEA37EC7127EB3B3B3387FFFFEB5FCA36C13FC17417DB92C>I<130EEB3F80EB
+FFE0000313F8000F13FE487FD87FF113C0D8FFE013E0EB803F38FE000F007CEB07C00030
+EB01801B0C78B22C>I<007FB6FCB71280A46C150021067B7D2C>I<137013F812011203EA
+07F0EA0FE0EA1FC01380EA3F00123E127E127CA212FC5AA4EAFF8013C013E0A2127FA212
+3FEA1FC0EA0F800D1B71B82C>I<3801FFF0000713FE001F6D7E15E048809038C01FF814
+07EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800
+EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE
+1F3A003FF007FC27247CA32C>I<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90
+B6FC16809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA8
+16FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB
+5B01F813F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC488048
+48C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F80
+6C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA3
+2C>I<EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF003
+48487E497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0
+073807FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90
+381FFFC0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090
+C7120F5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7E
+D80FF0130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023
+247CA32C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7
+FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>
+I<ED03F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003
+133E3A0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC
+0FF048B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF80
+4815E04815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E
+007E15FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13
+F8010713C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB
+7F90B6FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C
+01E0140029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080
+B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7F
+C0A3EC3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E
+133FB414005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE0487EA3
+127F1201AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7
+FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400
+157E811680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFFE0B5
+7EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039
+CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013
+E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F
+137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F
+80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA3
+2C>I<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E018013
+3F003F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D
+133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23
+247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC0913880
+1FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D1303
+6DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD
+387FFFE0B57EA36C5B27367FA32C>I<903903FC078090391FFF0FC0017F13CF48B512EF
+4814FF3807FE07380FF00148487E49137F4848133F90C7FC48141F127E150F5AA87E007E
+141FA26C143F7F6C6C137F6D13FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D130FEB
+07F890C7FCAD0203B5FC4A1480A36E140029367DA32C>I<D87FFEEB3FC0B53801FFF002
+0713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FC
+AF007FB512E0B67EA36C5C26247EA32C>I<90387FF8700003B512F8120F5A5A387FC00F
+387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C
+13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F0
+07FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB712
+80A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001
+035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000F
+B3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA3
+2C>I<3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B
+0000143EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C7
+01075BA214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5
+FCB515806C16004A7ED807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214
+F7A201F113C700005D9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F
+5B90381F007C29247FA32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E00
+5D90387E01F8013F5BEB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A14
+7C14FE130180903803EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C13
+7C49137E0001803A7FFF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFC
+B5008113FE148314816C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C01
+7E137E013E137CA2013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114
+F75DEB00FFA292C7FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA
+7E0F495A387FFF806C90C8FC6C5A6C5AEA07E027367EA32C>I<15FF02071380141F147F
+91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F5BB55A49C8FC6D7E6C7FC67F
+131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F14070200130021417BB92C>
+123 D<127812FCB3B3B3A9127806416DB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131F
+EB07F01303B380EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F8
+5CB31307EB1FE013FF007F5BB55A49C8FC13F8EA7FC021417BB92C>I
+E /Fg 34 123 df<04FFEB03F003039038E00FFC923A0FC0F01F1E923A3F00783E0F923A
+7E01F87C3FDB7C03EBFC7F03FC14F8DA01F813F905F1137EDC01E1133C913B03F00003F0
+00A314074B130760A3140F4B130F60A3010FB812C0A3903C001F80001F8000A3023F143F
+92C790C7FCA44A5C027E147EA402FE14FE4A5CA413014A13015FA313034A13035FA31307
+4A495AA44948495AA44948495AA3001CD9038090C8FC007E90380FC03F013E143E00FE01
+1F5B133C017C5C3AF8780F01E0D878F0EB07C0273FE003FFC9FC390F8000FC404C82BA33
+>11 D<EE3FFC4BB51280923907E007C092391F8001E0DB3F0013F0037E13034B1307A24A
+5A18E04A48EB038094C7FCA314075DA4140F5DA3010FB7FCA25F903A001F80007EA217FE
+023F5C92C7FCA216015F5C147E16035FA214FE4A13075FA30101140F5F4AECC1C0A2161F
+1783010316805CA2EF870013074A5CEE0F8EEE079EEE03FC010FEC00F04A91C7FCA35C13
+1FA2001C90CAFC127E5BEAFE3E133C137CEAF878EA78F0EA3FE0EA0F80344C82BA2F>I<
+EE7FE0923903FFFC7E92380FC03E92381F000F033EEB3FFE4B137F03FC14FC5D1401173D
+4A48EB01F8A21703A24A4814F0A21707A2020F15E05D170FA218C0010FB7FCA3903B001F
+80001F80A2173F143F92C71300A25FA24A147E147E17FEA25F14FE4A1301A25FA2010114
+035CEFF070A21607010316F04AECE0E0A3EFE1C013074A14C3933803E380EE01E7933800
+FF004948143C94C7FCA3495AA3001C90CAFC127E133E12FE133C137CEAF878EA78F0EA3F
+E0EA0F80374C82BA31>I<0107B8FCA3903A000FF000034BEB007F183E141F181E5DA214
+3FA25D181C147FA29238000380A24A130718004A91C7FC5E13015E4A133E167E49B512FE
+A25EECF8000107147C163C4A1338A2010F147818E04A13701701011F16C016004A140318
+80013F150718004A5CA2017F151E173E91C8123C177C4915FC4C5A4914070001ED7FF0B8
+FCA25F38397BB838>69 D<0107B712FEA3903A000FF000074B1300187C021F153CA25DA2
+143FA25D1838147FA292C8FCEE03804A130718004A91C7FCA201015CA24A131E163E0103
+14FE91B5FC5EA2903807F800167C4A1378A2130FA24A1370A2011F14F0A24A90C8FCA213
+3FA25CA2137FA291CAFCA25BA25B487EB6FCA337397BB836>I<0103B512F8A390390007
+F8005DA2140FA25DA2141FA25DA2143FA25DA2147FA292C7FCA25CA25CA21301A25CA213
+03A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA291C8FC497EB6FCA25C
+25397CB820>73 D<0207B512F0A391390007FC006F5AA215075EA3150F5EA3151F5EA315
+3F5EA3157F93C7FCA35D5DA314015DA314035DA31407A25DA2140FA2003F5C5A141F485C
+A24A5A12FC00E049C8FC14FE00705B495A6C485A381E0FC06CB4C9FCEA01F82C3B78B82C
+>I<0103B500F890387FFFE0A21AC090260007F8C7380FFC004B15E061020F4BC7FC183E
+4B5C18F0021F4A5A4D5A4BEB0F804DC8FC023F143C5F4B5B4C5A027FEB07C04CC9FCED00
+1E5E4A5BED01FCECFE0315070101497E151FECFC7C4B7E903903FDE07FDAFFC07F1580ED
+003F49488014F84A131F83130F160F4A801607011F81A24A130383133F16014A80A2017F
+6E7EA291C8FC494A7F007F01FE011F13FCB55CA243397CB840>I<ED03FE92383FFFC092
+38FC07F0913903E001F891390F80007C023FC77E027E8002F815804948EC0FC0EB07E049
+48EC07E0131F4A15F049C81203137E01FE16F8485AA2485AA2485AA2120F5B001F16075B
+123FA34848ED0FF0A448C9EA1FE0A3EF3FC0A21880177F18005F5F16015F6C4B5A4C5AA2
+4C5A6C4B5A6D4A5A001F93C7FC6D147E000F5D6C6CEB03F06C6C495A6C6CEB0F806C6C01
+3FC8FC90383F01FC90381FFFE0010190C9FC353D74BA40>79 D<14F8EB07FE90381F871C
+90383E03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F801403007F5C13
+00A21407485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F1300ECFF076C
+485B9038038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97
+D<133FEA1FFFA3C67E137EA313FE5BA312015BA312035BA31207EBE0F8EBE7FE9038EF0F
+80390FFC07C013F89038F003E013E0D81FC013F0A21380A2123F1300A214075A127EA214
+0F12FE4814E0A2141F15C05AEC3F80A215005C147E5C387801F8007C5B383C03E0383E07
+C0381E1F80D80FFEC7FCEA01F01C3B77B926>I<147F903803FFC090380FC1E090381F00
+70017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC485AA2127F
+90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00
+380F81F83803FFE0C690C7FC1D2677A426>I<ED01F815FFA3150316F0A21507A216E0A2
+150FA216C0A2151FA21680A2153FA202F81300EB07FE90381F877F90383E03FF017C5BEB
+F80112013803F00048485B120FEBC001121F5DEA3F801403127F01005BA214075A485CA2
+140FA248ECC1C0A2141F15C3ED8380143F1587007C017F1300ECFF076C485B9038038F8E
+391F0F079E3907FE03FC3901F000F0253B77B92A>I<147F903803FFC090380FC1E09038
+3F00F0017E13785B485A485A485A120F4913F8001F14F0383F8001EC07E0EC1F80397F81
+FF00EBFFF891C7FC90C8FC5A5AA55AA21530007C14381578007E14F0003EEB01E0EC03C0
+6CEB0F806CEB3E00380781F83803FFE0C690C7FC1D2677A426>I<ED07C0ED1FF0ED3E38
+ED7C3CEDF8FC15F9140115F1020313F8EDF0F0160014075DA4140F5DA4141F5D010FB512
+C05B16809039003F800092C7FCA45C147EA414FE5CA413015CA413035CA413075CA4130F
+5CA3131F5CA391C8FC5B121CEA7E3EA2EAFE3C137C1378EAF8F01278EA3FC0EA0F80264C
+82BA19>I<EC07C0EC3FF09138FC38E0903901F01FF0EB03E0903807C00FEB0F80011F13
+07D93F0013E05B017E130F13FE4914C01201151F1203491480A2153F1207491400A25DA2
+49137EA215FEA25D00031301140314076C6C485A0000131FEB787BEB3FF390380FC3F0EB
+00031407A25DA2140F5D121C007E131F5D00FE49C7FC147E5C387801F8387C07E0381FFF
+80D803FEC8FC24367CA426>I<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91
+C8FCA35B90387E07F0EC1FFCEC783E9038FFE01F02C01380EC800F1400485A16C05B49EB
+1F8012035BA2153F000715005BA25D000F147E5B15FE5D121FD98001131C15F8163C003F
+01031338010013F0A216704814E0007E15F016E0EDE1C000FE903801E38048903800FF00
+0038143C263B7BB92A>I<EB01C0EB07E014F0130F14E01307EB038090C7FCAB13F0EA03
+FCEA071EEA0E1F121CA212385B1270A25BEAF07E12E013FEC65AA212015B1203A25B1207
+5BA2000F13E013C013C1001F13C01381A2EB83801303EB0700A2130E6C5AEA07F8EA01E0
+143879B619>I<150E153F157FA3157E151C1500ABEC1F80EC7FC0ECF1F0EB01C0903803
+80F813071401130F130E131EEB1C03133C013813F0A2EB0007A215E0A2140FA215C0A214
+1FA21580A2143FA21500A25CA2147EA214FEA25CA21301A25CA213035C121C387E07E0A2
+38FE0FC05C49C7FCEAF83EEA787CEA3FF0EA0FC0204883B619>I<EB03F0EA01FFA3EA00
+075CA3130F5CA3131F5CA3133F91C8FCA35B017EEB0F80ED3FE015F09039FE01C1F09038
+FC0387EC0707140E0001011C13E0EBF83891383003800270C7FC00035BEBF1C0EBF38001
+FFC8FCEA07FC7FEBFFC0EBE7F8380FE1FCEBC07E147F80001F809039801F81C0A2158300
+3F013F138001001303A21507481500007E133EEC1E0E151E00FE6D5A48EB07F80038EB01
+E0243B7BB926>I<EB0FC0EA07FFA3EA001F1480A2133FA21400A25BA2137EA213FEA25B
+A21201A25BA21203A25BA21207A25BA2120FA25BA2121FA25BA2123FA290C7FCA25AA2EA
+7E0EA212FE131EEAFC1CA2133C133812F81378EA7870EA7CE0121FEA0F80123B79B915>
+I<D801E001FEEB07F03C07F803FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F
+78D9F3C013803C383FF001F7800F02E01400007801C013FE007018C002805B4A4848EB1F
+80EAF07FD8E07E5CA200000207143F01FE1700495CA2030F5C0001177E495C18FE031F5C
+120349DA8001131C18F8033F153C00070403133849020013F0A24B1570000F17E049017E
+15F019E003FEECE1C0001FEE01E34949903800FF000007C70038143C3E2679A444>I<D8
+01E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F787F39383FF00114E00078
+13C000708114804A485AEAF07FEAE07EA20000140701FE5C5BA2150F00015D5B151F5E12
+034990383F8380160316070007027F130049137EA2160E000F147C49141E161C5E001FEC
+3C7849EB1FE00007C7EA0780292679A42F>I<147F903803FFC090380FC1F090381F00F8
+017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7FCA215FF5A
+4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003EEB3F00147E
+6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391FE03FF09039
+3CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA01E113C15C
+A2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E013F495A
+6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201A25BA212
+03A25B1207B512C0A3293580A42A>I<3903C003F0390FF01FFC391E783C0F381C7C703A
+3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FCEAE0FE5BA2120012
+015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E212679A423>114
+D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F00001130313F0A2
+15E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C01300143F141F14
+0F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB45AD801FEC7FC
+1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E007FB5FCA2B6FC
+3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C003F1338EB0078
+147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B31C>I<13F8D8
+03FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C01270013F131F
+00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE120349EBFC0EA2
+0201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A00F83C78E090
+393FF03FC090390FC00F00272679A42D>I<01F0130ED803FC133FD8071EEB7F80EA0E1F
+121C123C0038143F49131F0070140FA25BD8F07E140000E08013FEC6485B150E12015B15
+1E0003141C5BA2153C000714385B5DA35DA24A5A140300035C6D48C7FC0001130E3800F8
+3CEB7FF8EB0FC0212679A426>I<01F01507D803FC903903801F80D8071E903907C03FC0
+D80E1F130F121C123C0038021F131F49EC800F00701607A249133FD8F07E168000E0ED00
+0313FEC64849130718000001147E5B03FE5B0003160E495BA2171E00070101141C01E05B
+173C1738A217781770020314F05F0003010713016D486C485A000190391E7C07802800FC
+3C3E0FC7FC90393FF81FFE90390FE003F0322679A437>I<903907E007C090391FF81FF8
+9039787C383C9038F03E703A01E01EE0FE3803C01F018013C0D8070014FC481480000E15
+70023F1300001E91C7FC121CA2C75AA2147EA214FEA25CA21301A24A1370A2010314F016
+E0001C5B007E1401010714C000FEEC0380010F1307010EEB0F0039781CF81E9038387C3C
+393FF03FF03907C00FC027267CA427>I<13F0D803FCEB01C0D8071EEB03E0D80E1F1307
+121C123C0038140F4914C01270A249131FD8F07E148012E013FEC648133F160012015B5D
+0003147E5BA215FE00075C5BA214015DA314035D14070003130FEBF01F3901F87FE03800
+7FF7EB1FC7EB000F5DA2141F003F5C48133F92C7FC147E147C007E13FC387001F8EB03E0
+6C485A383C1F80D80FFEC8FCEA03F0233679A428>I<903903C0038090380FF007D91FF8
+1300496C5A017F130E9038FFFE1E9038F83FFC3901F007F849C65A495B1401C7485A4A5A
+4AC7FC141E5C5C5C495A495A495A49C8FC131E5B49131C5B4848133C4848133849137800
+0714F8390FF801F0391FFF07E0383E1FFFD83C0F5B00785CD8700790C7FC38F003FC38E0
+00F021267BA422>I E /Fh 11 108 df<007FB81280B912C0A26C17803204799641>0
+D<121C127FEAFF80A5EA7F00121C0909799917>I<0060150600F8150F6C151F007E153F
+6C157E6C6C14FC6C6CEB01F86C6CEB03F06C6CEB07E06C6CEB0FC06C6CEB1F80017EEB3F
+006D137E6D6C5A90380FC1F8903807E3F0903803F7E06DB45A6D5B6EC7FCA24A7E497F90
+3803F7E0903807E3F090380FC1F890381F80FC90383F007E017E7F49EB1F804848EB0FC0
+4848EB07E04848EB03F04848EB01F84848EB00FC48C8127E007E153F48151F48150F0060
+1506282874A841>I<EB0380497EA7397803803C00FC147E00FE14FE397F8383FC393FC3
+87F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE3903FBBF8039
+0FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007C000A76D5A1F
+247BA62A>I<EF0180EF07C0171FEF7F80933801FF00EE07FCEE1FF0EE7FC04B48C7FCED
+07FCED1FF0ED7FC04A48C8FCEC07FCEC1FF0EC7FC04948C9FCEB07FCEB1FF0EB7FC04848
+CAFCEA07FCEA3FF0EA7FC048CBFC5AEA7F80EA3FE0EA0FF8EA03FEC66C7EEB3FE0EB0FF8
+EB03FE903800FF80EC3FE0EC0FF8EC03FE913800FF80ED3FE0ED0FF8ED03FE923800FF80
+EE3FE0EE0FF8EE03FE933800FF80EF3FC0170FEF038094C7FCAE007FB81280B912C0A26C
+1780324479B441>20 D<1478A414F85CA213015C1303495AA2495A49CCFC5B137E5B485A
+485AEA0FE0003FBA12FEBCFCA2003F19FED80FE0CCFCEA03F06C7E6C7E137E7F7F6D7E6D
+7EA26D7E1301801300A2801478A4482C7BAA53>32 D<181EA4181F84A285180785727EA2
+727E727E85197E85F11F80F10FC0F107F0007FBA12FCBCFCA26C19FCCCEA07F0F10FC0F1
+1F80F13F00197E61614E5A4E5AA24E5A61180F96C7FCA260181EA4482C7BAA53>I<EE01
+80EE03C01607A2EE0F80A2EE1F00A2163EA25EA25EA24B5AA24B5AA24B5A150F5E4BC7FC
+A2153EA25DA25DA24A5AA24A5AA24A5AA24A5AA24AC8FCA2143EA25CA25CA2495AA2495A
+A2495AA2495AA249C9FCA2133EA25B13FC5B485AA2485AA2485AA2485AA248CAFCA2123E
+A25AA25AA25A12602A4E75BB00>54 D<14034A7E4A7EA24A7EA34A7EA2EC7CF8A2ECF87C
+A2ECF03C0101133EA249487EA249486C7EA249486C7EA2EC00034980A2013E6D7EA2496D
+7EA20178147801F8147CA2484880A2484880A24848EC0F80A2491407000F16C0A248C8EA
+03E0A2003EED01F0A2003C1500007C16F8A248167CA248163C006016182E347CB137>94
+D<126012F0B3B3B3B3A91260045377BD17>106 D<0070131C00F0131EB3B3B3B3A80070
+131C175277BD2A>I E /Fi 10 115 df<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA
+1F000B0B708A2C>46 D<EC7F80903803FFE0010F7F013F7F497F9038FFC0FE3901FE007F
+D803F87F4848EB1F809038E00FCF390FC03FFF48484813C091B5FCEA3F01393E03F87F90
+3907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A900FCEB8007D87C0F
+14C0A2ECC00F3A7E07E01F80003EEBF03F903903F87F00393F01FFFED81F805B6E5A6C6C
+6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF6DB512C06D148001
+0FEBFE00010313F89038007FC023337CB22C>64 D<3801FFF0000713FE001F6D7E15E048
+809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48
+EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE
+6C14BF0001EBFE1F3A003FF007FC27247CA32C>97 D<EB03FE90381FFFC0017F13F048B5
+7E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E15E01507
+5AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC0
+01FF13FF000190B512806C1500013F13FC010F13F00101138023247CA32C>101
+D<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA6007FB5
+12FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03F890
+3907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A0FE0
+01FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048B5FC
+5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E04815
+F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15FCD8
+7F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F8010713C0
+28387EA42C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2
+EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>105 D<387FFFE0B57EA37EEA00
+03B3B3A5007FB61280B712C0A36C158022337BB22C>108 D<EB07FCEB1FFF017F13C048
+B512F048803907FC07FC390FF001FE48486C7E0180133F003F158090C7121F007EEC0FC0
+A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C6CEB7F006D5B6C6C485A39
+07FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA32C>111
+D<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A
+13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C26247EA32C>114
+D E /Fj 80 123 df<DA0FF813FC91397FFF07FF903B01F807DF83C0903A07E001FF0F90
+3B1F8007FE1FE090393F000FFC137E16F85B9338F007804848010790C7FC1503ACB812F8
+A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7FBA30>11
+D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E497EA25B
+A2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E267FFFE0B5
+12C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0903807E00790381F800FEB3F
+00137EA25B150748481303ADB7FCA33901F80003B3AB486C497E267FFFE0B512C0A32A3B
+7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC00380903C
+1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A03030203
+C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267FFFE0B500
+C1B51280A3413B7FBA45>I<001C131C007F137F39FF80FF80A26D13C0A3007F137F001C
+131C00001300A40001130101801380A20003130301001300485B00061306000E130E485B
+485B485B006013601A197DB92A>34 D<EB0380A3EB0FF0EB7FFE48B512803903F38FC039
+07C381E0390F8380F0D81F031338123E003C141C007C140C150E0078143E00F814FE1481
+A400FCEB80FC157800FE140012FF127F13C313E3EA3FFF6C7F14F86C13FE6CEBFF800001
+14C06C14E0013F13F01303ECBFF8148FEC83FC1481A2EC80FE157E123C12FF153EA412FE
+00F8143C00E0147C12600070147815F8003814F0003C1381001EEB83E0000FEB87C03907
+E39F803901FFFE006C5BEB1FE0EB0380A41F437BBD2A>36 D<017C166048B416F02607C3
+801401260F81C01403D900E04A5A001E01784A5A003E6D141F003C013FEC7F80007C9027
+1BE003FFC7FC0218B512BF007891381FFC3E00F8011CC75A020C14FC5F4C5A16035F4C5A
+160F5F4CC8FC021C5B00780118133E007C5D16FC003C01385B003E90383001F0001EEB70
+036C01E05B903981C007C03907C3800F2601FF005BD8007C49C9FC90C748EB07C0033EEB
+1FF04BEB3C3803FCEBF81C4B497E913A01F001E00602030103130703E0497E912607C007
+1480020F15011580DA1F00018013C04A010F1300143E5C14FC5C495A13035C495A130F4A
+0107130149C701C013805B013E1603490203140001FC6F5A49020113064848913800F00E
+0003705A49ED3C3849ED1FF06C48ED07C03A437BBD45>I<141FEC7FC0903801F0E09038
+03C0600107137090380F803090381F00381518A25BA2133E133F15381530A215705D5D14
+0190381F838092CAFC1487148E02DC49B51280EB0FF85C4A9039003FF8000107ED0FC06E
+5D71C7FC6E140E010F150CD91DFC141C01391518D970FE143801E015302601C07F1470D8
+03805D00076D6C5BD80F00EBC00148011F5C4890380FE003003E6E48C8FC007E903807F8
+060203130E00FE6E5A6E6C5A1400ED7F706C4B13036F5A6F7E6C6C6D6C5B7013066C6C49
+6C130E6DD979FE5B281FF001F07F133C3C07F80FE03FC0F86CB539800FFFF0C69026FE00
+0313C0D91FF0D9007FC7FC393E7DBB41>I<121C127FEAFF80A213C0A3127F121C1200A4
+12011380A2120313005A1206120E5A5A5A12600A1979B917>I<146014E0EB01C0EB0380
+EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA35AA65A
+B2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380
+EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA213
+78A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400
+A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527C
+BD20>I<15301578B3A6007FB812F8B912FCA26C17F8C80078C8FCB3A6153036367BAF41>
+43 D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A
+5A5A12600A19798817>I<B512FCA516057F941C>I<121C127FEAFF80A5EA7F00121C0909
+798817>I<150C151E153EA2153C157CA2157815F8A215F01401A215E01403A215C01407
+A21580140FA215005CA2141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA2
+5C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A2
+5B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F537BBD2A>I<EB03
+F8EB1FFF90387E0FC09038F803E03901E000F0484813780007147C48487FA248C77EA248
+1580A3007EEC0FC0A600FE15E0B3007E15C0A4007F141F6C1580A36C15006D5B000F143E
+A26C6C5B6C6C5B6C6C485A6C6C485A90387E0FC0D91FFFC7FCEB03F8233A7DB72A>I<EB
+01C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C3879B72A>I<EB
+0FF0EB7FFE48B57E3903E03FE0390F000FF0000E6D7E486D7E486D7E123000706D7E1260
+12FCB4EC7F807FA56CC7FC121CC8FCEDFF00A34A5A5D14035D4A5A5D140F4A5A4A5A92C7
+FC147C5C495A495A495A495A91C8FC011EEB01805B5B49130348481400485A485A000EC7
+5A000FB6FC5A5A485CB6FCA321387CB72A>I<EB07F8EB3FFF4913C03901F80FF03903C0
+07F848486C7E380E0001000F80381FE0006D7FA56C5A6C5AC85A1401A25D4A5AA24A5A5D
+EC0F80027EC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0A2153F16
+E0A2121EEA7F80487EA416C049137F007F1580007EC7FC0070ECFF006C495A121E390F80
+03F83907F00FF00001B512C06C6C90C7FCEB0FF8233A7DB72A>I<1538A2157815F8A214
+0114031407A2140F141F141B14331473146314C313011483EB030313071306130C131C13
+1813301370136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3C73803
+F800AB4A7E0103B512F8A325397EB82A>I<0006140CD80780133C9038F003F890B5FC5D
+5D158092C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F803907E007E090388003
+F0496C7E12066E7EC87EA28181A21680A4123E127F487EA490C71300485C12E000605C12
+700030495A00385C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1FE0
+213A7CB72A>I<EC3FC0903801FFF0010713FC90380FE03E90383F800790387E001F49EB
+3F804848137F485AA2485A000FEC3F0049131E001F91C7FCA2485AA3127F90C9FCEB01FC
+903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497FA249148016C0151FA2
+90C713E0A57EA56C7E16C0A2121FED3F807F000F15006C6C5B15FE6C6C5B6C6C485A3900
+FE07F090383FFFC06D90C7FCEB03FC233A7DB72A>I<12301238123E003FB612E0A316C0
+5A168016000070C712060060140E5D151800E01438485C5D5DC712014A5A92C7FC5C140E
+140C141C5CA25CA214F0495AA21303A25C1307A2130FA3495AA3133FA5137FA96DC8FC13
+1E233B7BB82A>I<EB03F8EB1FFF017F13C09038FC07F03901E001F848486C7E4848137C
+90C77E48141E000E141F001E80A3121FA27F5D01E0131E6C6C133E01FC133C6D5B6C6C6C
+5AECC1E06CEBF3C06C01FFC7FC6C5BEB3FFF6D13C081017F13F801F07F3903E07FFE3907
+801FFF48486C1380481303003E6D13C0003CEB007F007C143F0078EC0FE000F814075A15
+03A21501A36C15C012781503007C15806CEC07006C5C6C6C131ED807E0137C3903F803F0
+C6B55A013F1380D907FCC7FC233A7DB72A>I<EB03F8EB1FFF017F13C09038FC07E03903
+F803F048486C7E48486C7E49137E121F48487FA2007F158090C7FCA248EC1FC0A616E0A5
+6C143FA27F123F001F147FA26C6C13FF6C6C13DF000313013901F0039F3900FC0F1FD93F
+FC13C0EB07F090C7FC153F1680A316005D000F147E487E486C5BA24A5A4A5A49485A6C48
+485A001C495A260F807FC7FC3807FFFC000113F038003FC0233A7DB72A>I<121C127FEA
+FF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<121C127FEA
+FF80A5EA7F00121CC7FCB2121C127F5A1380A4127F121D1201A412031300A25A1206A212
+0E5A121812385A1260093479A317>I<007FB812F8B912FCA26C17F8CCFCAE007FB812F8
+B912FCA26C17F836167B9F41>61 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC06
+3FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2
+D901807F81A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3
+496E7EA213E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>65
+D<B712E016FC16FF0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16
+035F4C5A4C5A4C5A4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83
+707EA21880177F18C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7
+FC16F832397DB83B>I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03
+FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F48
+48150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A312
+3F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE0
+5C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D
+7BBA3C>I<B712C016F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E
+177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F
+18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397D
+B83F>I<B812FCA30001903880000F6C90C71201EE007E173E171E170EA31706A3170783
+16C0A394C7FCA31501A21503150F91B5FCA3EC000F15031501A21500A21860A318E093C7
+12C0A41701A3EF0380A21707A2170F173F177F486D903807FF00B9FCA333397DB839>I<
+B812F8A30001903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706A2ED01
+80A21700A41503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612
+C0A32F397DB836>I<DBFF8013C0020FEBF001023F13FC9139FF803F03903A03FC000787
+D90FF0EB03CF4948EB00EF4948147F4948143F49C8121F485A4848150F48481507A24848
+1503A2485A1701123F5B007F1600A448481600AB93B6FCA26C7E9338007FE0EF3FC0A212
+3F7F121FA26C7EA26C7EA26C7E6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D9
+03FEEB0783903A00FFC03F0191393FFFFC00020F01F0130002001380383D7CBA41>I<B6
+48B512FEA30001902680000313006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB6
+48B512FEA337397DB83E>I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>
+I<013FB512E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B
+0070131F6C5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I<B612E0A3
+000101C0C8FC6C90C9FCB3AD1718A517381730A31770A317F0A216011603160FEE1FE048
+6D13FFB8FCA32D397DB834>76 D<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2
+D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406
+A36E6C130CA36E6C1318A26E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900
+FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C0
+0203B512F8A2ED018045397DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DF
+F0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E81
+14036E7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE
+7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E486C153E487ED80FFC151E
+B500C0140EA2170637397DB83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0
+EB1F8049486D7ED93F80EB07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F
+80A24848ED1FC0A2001F17E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17
+F86D150FA3003F17F0A26C6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FE
+A26C6C4A5A017F4A5A6D6C495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC
+91381FFFE0020390C8FC363D7BBA41>I<B712C016F816FE000190398001FF806C90C7EA
+3FC0EE0FE0EE07F0EE03F817FC17FE1601A217FFA717FEA2EE03FCA2EE07F817F0EE0FE0
+EE3FC0923801FF0091B512FC16F091C9FCB3A5487FB6FCA330397DB839>I<B612FEEDFF
+E016F8000190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C
+5A4C5AEE3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA216
+1F83A583A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA
+3FFCEF07F0393B7DB83D>82 D<D90FF813C090383FFE0190B512813903F807E33907E000
+F74848137F4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E
+6D14006C7E7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0
+EB007F020713E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E1503
+6C15E06C14076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0
+D8C00190C7FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F0
+0078160000701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612
+E0A335397DB83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706
+B3B2170E6D150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D
+6C49C7FC91387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387F
+FF80A30003018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F15
+06A26E140E011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2
+ED8003027F91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02
+035BA2EDFEE002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<B5D8FC07B5
+D8F001B5FCA30007902780001FFEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B80
+7F6C6F6C1500A26E5F017F6E6C1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C01
+0E6D5BEE0C3FA26D6C011C6D5BEE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C
+4CC7FC9338C003FCA203805D913B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E315
+1CDA1FE6EC7F98A215F6DA0FFCEC3FF0A302075E4B141FA202035E4B140FA202015E4B14
+07A2020093C8FC4B80503B7EB855>I<007FB590383FFFFCA3C601F801071380D97FE0D9
+03FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C1306160E6D6C5B6DEB8018
+163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D14036E7EA26E7F6F7E
+A24B7E15DF9138019FF09138038FF8150F91380607FC91380E03FE140C4A6C7EEC380002
+30804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C6E7E011C1401013C
+8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E>I<EAFFF8A4EAF000B3
+B3B3B3A3EAFFF8A40D5378BD17>91 D<3901800180000313033907000700000E130E485B
+0018131800381338003013300070137000601360A200E013E0485BA400CE13CE39FF80FF
+806D13C0A3007F137FA2393F803F80390E000E001A1974B92A>I<EAFFF8A4EA0078B3B3
+B3B3A3EAFFF8A40D537FBD17>I<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C
+6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0
+123F485A90C7FC160C12FEA31401A26C13036CEB077C903980063E18383FC01E3A0FE078
+1FF03A03FFF00FE03A007F8007C026277DA52A>97 D<EA03F012FFA3120F1203B0EC1FE0
+EC7FF89038F1E03E9039F3801F809039F7000FC001FEEB07E049EB03F049EB01F85BED00
+FCA216FEA2167E167FAA167E16FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB0FC0
+9039C7801F00903881E07E903800FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF8090
+387E03E03901F80070484813F83907E001FC380FC003A2EA1F80123F90380001F848EB00
+F01500A2127E12FEAA127E127FA26C14067F001F140E6D130C000F141C6C6C13386C6C13
+706C6C13E039007C07C090381FFF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC003F15
+0FB0EB03F8EB1FFF90387E078F9038F801EF3903F0007F4848133F4848131FA24848130F
+123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C131FA26C6C133F6C6C137F6C6CEBEF
+F03A01F801CFFF39007C078F90381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1FFF90
+387C0FC03901F803E03903F001F0D807E013F8380FC0004848137CA248C7127E153E5A15
+3F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14037F001F14076C6C13060007140E6D
+131CD801F013386C6C137090387E03E090381FFF80903803FC0020277EA525>I<147E90
+3803FF8090380FC1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3
+D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I<ED03F090390FF00FF890393FFC3C3C
+9039F81F707C3901F00FE03903E007C03A07C003E010000FECF000A248486C7EA86C6C48
+5AA200075C6C6C485A6D485A6D48C7FC38073FFC38060FF0000EC9FCA4120FA213C06CB5
+12C015F86C14FE6CECFF804815C03A0F80007FE048C7EA0FF0003E140348140116F84814
+00A56C1401007C15F06CEC03E0003F1407D80F80EB0F80D807E0EB3F003901FC01FC3900
+7FFFF0010790C7FC26387EA52A>I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F90
+39F1C01F809039F3800FC0EBF70013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3
+293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA
+487EB512C0A312387EB717>I<EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB01F8
+13FFA313071301B3B3A2123C127E00FF13F01303A214E038FE07C0127C383C0F00EA0FFE
+EA03F8154984B719>I<EA03F012FFA3120F1203B1913801FFFCA39138007FC01600157C
+15705D4A5A4A5A4AC7FC141E1438147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E81
+14076E7E6E7E811400157E157F811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>
+I<EA03F012FFA3120F1203B3B3AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000
+FFD93FFCEB7FF8913AF03F01E07E903BF1C01F83803F3D0FF3800FC7001F802603F70013
+CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA3
+40257EA445>I<3903F00FF000FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F700
+13FE496D7EA25BA35BB3A3486C497EB500C1B51280A329257EA42E>I<EB03FE90380FFF
+8090383E03E09038F800F84848137C48487F48487F4848EB0F80001F15C090C712074815
+E0A2007EEC03F0A400FE15F8A9007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D
+131F6C6CEB3F006C6C137EC66C13F890387E03F090381FFFC0D903FEC7FC25277EA52A>
+I<3903F01FE000FFEB7FF89038F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB
+03F04914F849130116FC150016FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB
+0FE001F614C09039F7803F009038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328
+357EA42E>I<D903F813C090381FFE0190387E07819038FC01C33903F000E30007147748
+48133749133F001F141F485A150F48C7FCA312FEAA127FA37E6D131F121F6D133F120F6C
+6C137F6C6C13EF3901F801CF39007E078F90381FFE0FEB07F890C7FCABED1FE00203B5FC
+A328357DA42C>I<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE
+9038EC03E09038FC0080491300A45BB3A2487EB512F0A31C257EA421>I<EBFF03000313
+E7380F80FF381E003F487F487F00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C
+13F86C7F00037FC67F01071380EB007F141F00C0EB0FC01407A26C1303A37E15806C1307
+7EEC0F00B4131E38F3C07C38E1FFF038C03F801A277DA521>I<1318A51338A31378A313
+F8120112031207001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E1300
+6D5AEB0FFEEB01F81A347FB220>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407
+B3A4150FA3151F12016D133F0000EC77F86D9038E7FF8090383F03C790381FFF87903A03
+FC07E00029267EA42E>I<B538803FFEA33A0FF8000FF06C48EB07E00003EC03C06D1480
+00011500A26C6C1306A26D130E017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001
+075BA2903803F180A3D901FBC7FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1F
+FFE03FFEA3260FF8009038000FF86C48017EEB03E018C00003023EEB0180A26C6C013FEB
+0300A36C6CEC8006156FA2017E9038EFC00C15C7A2D93F016D5A15830281EBF038D91F83
+1430150102C3EBF87090260FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133F
+A2010192C7FC4A7FA20100141E4A130E0260130C37257EA33C>I<B538807FFFA33A03FE
+003FF00001EC1F80000092C7FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB
+03FB6DB4C8FC6D5AA2147F804A7E8114CF903801C7E090380383F090380703F8EB060149
+6C7E011C137E49137F01787F496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C
+>I<B538803FFEA33A0FF8000FF06C48EB07C00003EC03806C7E16007F00001406A2017E
+5BA2137F6D5BA26D6C5AA2ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214
+FF6D5AA2147CA31438A21430A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0E
+EA701C6C5AEA1FF0EA0FC027357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07
+F00038EB0FE012300070EB1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A49
+5A495AA290387F000613FEA2485A485A0007140E5B4848130C4848131CA24848133C48C7
+127C48EB03FC90B5FCA21F247EA325>I E /Fk 41 121 df<913803FFC0027F13F00103
+B512FC010FEB00FED93FF8133FD97FE0EBFF8049485A5A1480484A13C04A6C1380A36F13
+00167E93C7FCA592383FFFC0B8FCA4000390C7FCB3ABB5D8FC3F13FFA4303A7EB935>12
+D<912603FFC0EB7FF8027F9039F00FFFFE49B5D8FC7F6D7E010F903B007FFFE01FC0D91F
+F8011F90380007E0D97FE0D97FFCEB1FF049484948133F485C02805C484E7E02004A6D5A
+A281735A047F6E5A96C8FCA5953807FFF8BBFCA4000390C7397FE0001FB3ABB5D8FC1FB5
+0087B512E0A44B3A7EB950>14 D<B61280A819087F9620>45 D<EA0F80EA3FE0EA7FF0A2
+EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>I<EB03FF011F13F0017F13FC3901FC07
+FF2603F003138048486C13C0496C13E0EA0FF001FC14F0121F7FA56C4814E0A23803F001
+C714C04A138016004A5A4A5AEC3FF090380FFFC092C7FC15F090380007FE913801FF806E
+13C016E0ED7FF016F816FC153FA216FEEA1FC0487E487E487EA416FCA249EB7FF8127F01
+C0EBFFF06C4814E06C6C4813C0260FFC0713806CB61200000114FC6C6C13F0010790C7FC
+27387CB630>51 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F80C7FCABEA
+0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D2579A41B>58
+D<ED03E04B7EA24B7EA34B7EA24B7EA34B7EA292B57EA34A8015F302038015E1A2020780
+15C0020F80ED807FA2021F80ED003F4A80023E131FA2027E80027C7F02FC814A7FA20101
+824A7F49B77EA3498202C0C7FC010F824A147FA2011F8291C8123F4982013E151FA2017E
+82017C8101FE83B500F80107B61280A4413A7DB948>65 D<B87E17F817FF18C028007FF8
+000713F09338007FF8EF1FFE717E050313807113C0A27113E0F07FF0A2F03FF8A219FC18
+1FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0FFE0A24D13C04D13804D1300EF
+1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397DB849>68
+D<B912F0A426007FF8C7FCEF1FF8170717031701A21700A21878A3043C137C183CA41800
+167CA216FC150391B5FCA4ECF8031500167CA2163C180FA3181EA293C7FCA2183EA2183C
+187CA218FCA2EF01F81703170F173FEE01FFB9FC18F0A338397DB83F>I<B612FCA43900
+7FF800B3B3ADB612FCA41E397DB824>73 D<B7FCA426007FF8C9FCB3ACEF0780A5170F18
+00A35FA25FA25F5F5E5EEE0FFE167FB8FCA431397DB839>76 D<B500F80403B512F06E5E
+A26E5ED8007FF1E000A2D97BFF161EA201796D5DA201786D5DA26E6C5DA36E6C4A5AA26E
+6C4A5AA26E6C4A5AA26E6C4A5AA26E6C141EA36E6D5BA26E6D5BA26F6C5BA26F6C485AA3
+6F6C485AA26F6C485AA26F6C48C7FCA2923803FF1EA36F13BCA26F13F8A2705AA2705AA2
+13FCB500FC6D4848B612F0A2EE0F80EE070054397DB85B>I<B500FC0203B512F0A28080
+C66C6D90390003F0006F6E5A81017B7F13798101787F6E7E6E7E6E7F6E7FA26E7F6E7F6E
+7F6E7F6F7E153F826F13806F13C06F13E06F13F06F13F88117FCEE7FFEEE3FFF70138170
+13C17013E18218F17013F97013FDEF7FFF8383A28383838383187FA2183F181F01FC160F
+B500FC150718031801A244397DB84B>I<EDFFF8020FEBFF80027F14F0903A01FFC01FFC
+010790380007FFD91FFC010113C0D93FF06D6C7E49486E7E49486E7E48496E7E48834890
+C86C7EA248486F1380A248486F13C0A2003F18E0A348486F13F0A400FF18F8AC007F18F0
+6D5DA3003F18E0A26D5D001F18C0A26C6C4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A6D
+6C4A5AD93FFC49485A6DB401075B0107D9C01F90C7FC010190B512FC6D6C14F0020F1480
+020001F8C8FC3D3B7BB948>I<B8FC17F017FEEFFF8028007FF8000F13C0040113E07013
+F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFFF04C13E0040F13C091
+B7120017FC17E002F8C9FCB3A4B612FCA438397DB841>I<B712FCEEFFE017FC17FF2800
+7FF8000F13C004017F707F717E717EA2717EA284A760A24D5A604D5A4D5A04035B041F90
+C8FC91B612FC17E0839139F8003FFCEE0FFF707F707F8284A2707FA584A51A601AF08417
+7F1901DD3FFE13E0B600FC011F130394390FFF87C071EBFF8005011400CBEA1FFC443A7D
+B848>82 D<D907FF130E013FEBE01E90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0001F
+4848130F48481303491301007F140090C8FC167E5A163EA27F161E7F7F6D91C7FC13FC38
+7FFFE014FEECFFF06C14FE6F7E6C816C15F06C816C81C681133F010F801301D9000F1480
+EC007F030F13C01503818100F0157FA3163FA27E17807E167F6C16007E6D14FE01E0495A
+01F813039039FF801FF800FC90B512E0D8F83F5CD8F00749C7FC39E0007FF02A3B7BB935
+>I<003FB91280A4D9F800EBF003D87FC09238007FC049161F007EC7150FA2007C1707A2
+00781703A400F818E0481701A4C892C7FCB3AE010FB7FCA43B387DB742>I<EB3FFE0003
+B512E0000F14F8391FF00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2
+EC3FFF010FB5FC137F3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A
+127F263FF00713F83B1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>
+97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804AEB7F
+C00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F6EEB
+7FE06E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390C7FC
+2F3A7EB935>I<903801FFC0010F13FC017F13FFD9FF8013802603FE0013C048485AEA0F
+F8121F13F0123F6E13804848EB7F00151C92C7FC12FFA9127FA27F123FED01E06C7E1503
+6C6CEB07C06C6C14806C6C131FC69038C07E006DB45A010F13F00101138023257DA42A>
+I<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC07F0003EB001FD8
+07FC1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C5B000F5C6C6C5B
+6C6C4913C02701FF80FD13FE39007FFFF9011F13E1010313012F3A7DB935>I<903803FF
+80011F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC1FE05B003F
+EC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14F86D
+14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025257DA42C>
+I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0A2481381A24813
+016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7DB91D>I<161FD9
+07FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C138F003F15CF
+4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC3907FE07FE48B5
+12F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016E06C15F86C81
+6C815A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C6C6C495AD81F
+F0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<13FFB5FCA4
+12077EAFED7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A7E4A14C05CA25C
+A291C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07FC487EA2487EA56C5AA26C
+5AEA01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<141FEC7FC0ECFFE0
+A24913F0A56D13E0A2EC7FC0EC1F0091C7FCA9EC0FF0EB0FFFA4EB007F143FB3B0121FEA
+3F80EA7FC0EAFFE0EC7FE0A215C014FF6C481380903883FE006CB45A000F13F000011380
+1C4B86BA1D>I<13FFB5FCA412077EAF92380FFFE0A4923803FC0016F0ED0FE0ED1F804B
+C7FC157E5DEC03F8EC07E04A5A141FEC7FE04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E
+7F82157F6F7E6F7E82150F82B5D8F83F13F8A42D3A7EB932>I<13FFB5FCA412077EB3B3
+ACB512FCA4163A7DB91B>I<01FED97FE0EB0FFC00FF902601FFFC90383FFF80020701FF
+90B512E0DA1F81903983F03FF0DA3C00903887801F000749DACF007F00034914DE6D48D9
+7FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0A44C257DA451>I<01FEEB
+7FC000FF903803FFF8020F13FE91381F03FFDA3C011380000713780003497E6D4814C05C
+A25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801FFC0010F13F8017F13FFD9
+FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F81491303007F81A300FF1680
+A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5
+C7FC011F13FC010113C029257DA430>I<9039FF01FF80B5000F13F0023F13FC9138FE07
+FFDAF00113800003496C13C00280EB7FE091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC16
+1FA217F8163F17F06E137F6E14E06EEBFFC0DAF00313809139FC07FE0091383FFFF8020F
+13E0020390C7FC91C9FCACB512FCA42F357EA435>I<9038FE03F000FFEB0FFEEC3FFF91
+387C7F809138F8FFC000075B6C6C5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B5
+12FEA422257EA427>114 D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E
+1301007C130012FC15787E7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F812
+03C614FC131F9038007FFE140700F0130114007E157E7E157C6C14FC6C14F8EB80019038
+F007F090B512C000F8140038E01FF81F257DA426>I<130FA55BA45BA25B5BA25A120700
+1FEBFFE0B6FCA3000390C7FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380
+903803FE001D357EB425>I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C
+6E4813E06CD9C03E13FF90387FFFFC011F13F00103138030257DA435>I<B539F001FFF8
+A4000390C7EA3F00161E6E133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8
+011F495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5A
+A26E5AA26E5AA26E5AA22D257EA432>I<B500F1B538803FFFA43D07FE000FF80003E06C
+6C010715C082028015076C6E6C148015076C01C0ED0F00826E485C017FED801E5D90273F
+F01E7F5B17C0DAF83E147C011F90393C3FE078037C14F8903B0FFC781FF0F0A29139FEF0
+0FF10107EDF9E002FF14FB6D496CB45AA24B7E6D5EA26D496C90C7FCA292C7FC6E5CA202
+3E147C023C143C40257EA445>I<B539F01FFFF0A4000390398003F8006C01C013E06C14
+07D97FE05B6D6C485A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E
+6E7E814A7EA24A7E903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D
+7E49130F00016E7EB590383FFFF8A42D257EA432>I E(cmmi10)cvn
+9.96265 /Fe 1 fstore(cmsy10)cvn 9.96265 /Fh 1 fstore(cmr10)cvn
+9.96265 /Fj 1 fstore(cmmi7)cvn 6.97385 /Fb 1 fstore end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 0 83 3900 4 v 0 164 a Fk(3D.MP)31 b(:)h(3-DIMENSIONAL)f
+(REPRESENT)-8 b(A)g(TIONS)31 b(AND)h(ANIMA)-8 b(TIONS)32
+b(IN)f(MET)-8 b(APOST)p 0 191 V 0 421 a Fj(v)n(ersion)26
+b(1.0,)h(8)g(April)h(1998)d Fk(Denis)31 b(Ro)s(egel)26
+b Fj(\()p Fi(roegel@loria.fr)p Fj(\))0 570 y(This)j(pac)n(k)-5
+b(age)28 b(pro)n(vides)g(de\014nitions)i(enabling)f(the)g(manipulation)
+h(and)f(animation)g(of)g(3-dimensional)f(ob)5 b(jects.)42
+b(Suc)n(h)0 670 y(ob)5 b(jects)27 b(can)g(b)r(e)h(included)g(in)g(a)f
+(T)1093 688 y(E)1139 670 y(X)h(\014le)f(or)g(used)g(on)g(w)n(eb)h
+(pages)e(for)h(instance.)37 b(See)27 b(the)h(do)r(cumen)n(tation)f
+(enclosed)g(in)0 769 y(the)h(distribution)g(for)f(more)g(details.)0
+919 y(Thanks)g(to)g(John)h(Hobb)n(y)f(and)g(Ulrik)h(Vieth)g(for)f
+(helpful)h(hin)n(ts.)0 1068 y(LIMIT)-7 b(A)g(TIONS:)0
+1218 y Fh(\000)22 b Fj(an)h(ob)5 b(ject)22 b(can)g(not)h(include)g(T)
+1061 1236 y(E)1107 1218 y(X)g(lab)r(els;)i(to)d(o)n(v)n(ercome)f(this)i
+(limitation)f(w)n(ould)h(need)f(to)h(wrap)f(the)h(metap)r(ost)g(output)
+0 1317 y(with)28 b(dvips)g(so)f(that)g(the)h(necessary)e(fon)n(ts)i
+(are)e(loaded)h(\(easy)g(to)h(do,)f(but)h(not)g(done)f(here\))0
+1467 y(PR)n(OJECTS)f(F)n(OR)h(THE)g(FUTURE:)0 1616 y
+Fh(\000)g Fj(tak)n(e)g(ligh)n(t)h(sources)e(in)n(to)h(accoun)n(t)g(and)
+g(sho)n(w)g(shado)n(ws)f(and)h(dark)n(er)f(faces)0 1766
+y Fh(\000)h Fj(handle)h(o)n(v)n(erlapping)d(of)j(ob)5
+b(jects)27 b(\()p Fg(obj)p 1326 1766 26 4 v 32 w(name)34
+b Fj(can)27 b(b)r(e)h(used)g(when)f(going)g(through)g(all)g(faces\))0
+1915 y Fk(if)37 b Fj(kno)n(wn)22 b Fg(thr)l(e)l(e)p 535
+1915 V 37 w(d)p 617 1915 V 39 w(version)7 b Fj(:)166
+2015 y Fk(expandafter)29 b(endinput)p Fj(\045)f(a)n(v)n(oids)e(loading)
+g(this)i(pac)n(k)-5 b(age)26 b(t)n(wice)0 2114 y Fk(\014)5
+b Fj(;)0 2264 y Fk(message)25 b Ff("***)42 b(3d,)h(version)d(1.0)j
+(\(c\))f(D.)h(Roegel,)d(8)k(April)d(1998)h(***")n Fj(;)0
+2363 y Fk(n)m(umeric)27 b Fg(thr)l(e)l(e)p 547 2363 V
+37 w(d)p 629 2363 V 39 w(version)7 b Fj(;)0 2463 y Fg(thr)l(e)l(e)p
+184 2463 V 37 w(d)p 266 2463 V 39 w(version)35 b Fj(=)27
+b(1)p Fe(:)p Fj(0;)1929 6139 y(1)p eop
+%%Page: 2 2
+2 1 bop 0 83 3900 4 v 0 163 a Fj(V)-7 b(ector)27 b(op)r(erations)p
+0 206 V 0 437 a(\045)h(de\014nition)g(of)f(v)n(ector)g
+Fe(i)g Fj(b)n(y)g(its)h(co)r(ordinates)0 536 y Fk(def)37
+b Fg(ve)l(ct)p 314 536 26 4 v 38 w(def)19 b Fj(\()p Fk(expr)29
+b Fe(i;)22 b Fg(xi)9 b Fe(;)23 b Fg(yi)9 b Fe(;)23 b
+Fg(zi)9 b Fj(\))28 b(=)f Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(x)28 b Fj(:=)f Fg(xi)9 b Fj(;)50 b Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])p Fe(y)30 b Fj(:=)e Fg(yi)9 b Fj(;)51
+b Fg(ve)l(ct)7 b Fj([)p Fe(i)p Fj(])p Fe(z)31 b Fj(:=)c
+Fg(zi)9 b Fj(;)46 b Fk(enddef)9 b Fj(;)0 686 y(\045)28
+b(a)f(p)r(oin)n(t)h(is)f(stored)g(as)g(a)g(v)n(ector)0
+785 y Fk(let)g Fg(set)p 248 785 V 38 w(p)l(oint)36 b
+Fj(=)28 b Fg(ve)l(ct)p 733 785 V 38 w(def)19 b Fj(;)0
+935 y(\045)28 b Fg(set)p 210 935 V 38 w(obj)p 358 935
+V 44 w(p)l(oint)36 b Fj(is)27 b(lik)n(e)g Fg(set)p 948
+935 V 38 w(p)l(oint)9 b Fj(,)27 b(but)i(the)f(\014rst)f(parameter)0
+1034 y(\045)h(is)f(a)h(lo)r(cal)f(p)r(oin)n(t)g(n)n(um)n(b)r(er)0
+1134 y Fk(def)37 b Fg(set)p 276 1134 V 38 w(obj)p 424
+1134 V 44 w(p)l(oint)8 b Fj(\()p Fk(expr)29 b Fe(i;)22
+b Fg(xi)9 b Fe(;)23 b Fg(yi)9 b Fe(;)23 b Fg(zi)9 b Fj(\))28
+b(=)f Fg(set)p 1531 1134 V 38 w(p)l(oint)9 b Fj(\()p
+Fg(pnt)e Fj(\()p Fe(i)p Fj(\))p Fe(;)24 b Fg(xi)8 b Fe(;)23
+b Fg(yi)10 b Fe(;)23 b Fg(zi)8 b Fj(\))24 b Fk(enddef)9
+b Fj(;)0 1283 y(\045)28 b(de\014nition)g(of)f(a)h(v)n(ector)e(b)n(y)h
+(an)g(other)h(v)n(ector)0 1383 y Fk(def)37 b Fg(ve)l(ct)p
+314 1383 V 38 w(def)p 468 1383 V 49 w(ve)l(ct)8 b Fj(\()p
+Fk(expr)29 b Fe(i;)23 b(j)5 b Fj(\))27 b(=)166 1483 y
+Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(x)28 b Fj(:=)f
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(x)p Fj(;)51 b
+Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(y)30 b Fj(:=)d
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(y)s Fj(;)51 b
+Fg(ve)l(ct)7 b Fj([)p Fe(i)p Fj(])p Fe(z)31 b Fj(:=)c
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(z)t Fj(;)0 1582
+y Fk(enddef)k Fj(;)0 1732 y(\045)28 b(v)n(ector)e(sum:)37
+b Fg(ve)l(ct)8 b Fj([)p Fe(k)s Fj(])28 b Fh( )f Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(]+)p Fg(ve)l(ct)f Fj([)p Fe(j)e Fj(])0
+1831 y Fk(def)37 b Fg(ve)l(ct)p 314 1831 V 38 w(sum)6
+b Fj(\()p Fk(expr)29 b Fe(k)s(;)23 b(i;)f(j)5 b Fj(\))28
+b(=)166 1931 y Fg(ve)l(ct)8 b Fj([)p Fe(k)s Fj(])p Fe(x)28
+b Fj(:=)f Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(x)19
+b Fj(+)f Fg(ve)l(ct)7 b Fj([)p Fe(j)e Fj(])p Fe(x)p Fj(;)166
+2031 y Fg(ve)l(ct)j Fj([)p Fe(k)s Fj(])p Fe(y)30 b Fj(:=)d
+Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(y)21 b Fj(+)d
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(y)s Fj(;)166 2130
+y Fg(ve)l(ct)j Fj([)p Fe(k)s Fj(])p Fe(z)31 b Fj(:=)c
+Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(z)21 b Fj(+)d
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(z)t Fj(;)0 2230
+y Fk(enddef)k Fj(;)0 2379 y(\045)28 b(v)n(ector)e(translation:)36
+b Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])27 b Fh( )h Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(]+)p Fg(ve)l(ct)f Fj([)p Fe(v)s Fj(])0
+2479 y Fk(def)37 b Fg(ve)l(ct)p 314 2479 V 38 w(tr)l(anslate)6
+b Fj(\()p Fk(expr)29 b Fe(i;)23 b(v)s Fj(\))28 b(=)f
+Fg(ve)l(ct)p 1324 2479 V 38 w(sum)6 b Fj(\()p Fe(i;)23
+b(i;)g(v)s Fj(\))g Fk(enddef)9 b Fj(;)0 2628 y(\045)28
+b(v)n(ector)e(di\013erence:)37 b Fg(ve)l(ct)8 b Fj([)p
+Fe(k)s Fj(])27 b Fh( )h Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fh(\000)p Fg(ve)l(ct)f Fj([)p Fe(j)e Fj(])0 2728
+y Fk(def)37 b Fg(ve)l(ct)p 314 2728 V 38 w(di\013)19
+b Fj(\()p Fk(expr)28 b Fe(k)s(;)23 b(i;)g(j)5 b Fj(\))28
+b(=)166 2828 y Fg(ve)l(ct)8 b Fj([)p Fe(k)s Fj(])p Fe(x)28
+b Fj(:=)f Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(x)19
+b Fh(\000)f Fg(ve)l(ct)7 b Fj([)p Fe(j)e Fj(])p Fe(x)p
+Fj(;)166 2927 y Fg(ve)l(ct)j Fj([)p Fe(k)s Fj(])p Fe(y)30
+b Fj(:=)d Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(y)21
+b Fh(\000)d Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(y)s
+Fj(;)166 3027 y Fg(ve)l(ct)j Fj([)p Fe(k)s Fj(])p Fe(z)31
+b Fj(:=)c Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(z)21
+b Fh(\000)d Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(z)t
+Fj(;)0 3127 y Fk(enddef)k Fj(;)0 3276 y(\045)28 b(dot)f(pro)r(duct)h
+(of)g Fg(ve)l(ct)7 b Fj([)p Fe(i)p Fj(])28 b(and)f Fg(ve)l(ct)8
+b Fj([)p Fe(j)d Fj(])0 3376 y Fk(v)-5 b(ardef)38 b Fg(ve)l(ct)p
+445 3376 V 38 w(dpr)l(o)l(d)10 b Fj(\()p Fk(expr)28 b
+Fe(i;)23 b(j)5 b Fj(\))28 b(=)166 3475 y(\()p Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])p Fe(x)19 b Fh(\003)f Fg(ve)l(ct)7
+b Fj([)p Fe(j)e Fj(])p Fe(x)19 b Fj(+)f Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])p Fe(y)21 b Fh(\003)d Fg(ve)l(ct)8
+b Fj([)p Fe(j)d Fj(])p Fe(y)21 b Fj(+)d Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])p Fe(z)21 b Fh(\003)d Fg(ve)l(ct)8
+b Fj([)p Fe(j)d Fj(])p Fe(z)t Fj(\))0 3575 y Fk(enddef)k
+Fj(;)0 3724 y(\045)28 b(mo)r(dulus)g(of)f Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])0 3824 y Fk(v)-5 b(ardef)38 b Fg(ve)l(ct)p
+445 3824 V 38 w(mo)l(d)9 b Fj(\()p Fk(expr)29 b Fe(i)p
+Fj(\))e(=)h(sqrt)o(\()p Fg(ve)l(ct)p 1379 3824 V 39 w(dpr)l(o)l(d)9
+b Fj(\()p Fe(i;)23 b(i)p Fj(\)\))h Fk(enddef)8 b Fj(;)0
+3973 y(\045)28 b(v)n(ector)e(pro)r(duct:)37 b Fg(ve)l(ct)8
+b Fj([)p Fe(k)s Fj(])27 b Fh( )h Fg(ve)l(ct)8 b Fj([)p
+Fe(i)p Fj(])27 b Fh(^)h Fg(ve)l(ct)8 b Fj([)p Fe(j)d
+Fj(])0 4073 y Fk(def)37 b Fg(ve)l(ct)p 314 4073 V 38
+w(pr)l(o)l(d)10 b Fj(\()p Fk(expr)28 b Fe(k)s(;)23 b(i;)g(j)5
+b Fj(\))28 b(=)166 4173 y Fg(ve)l(ct)8 b Fj([)p Fe(k)s
+Fj(])p Fe(x)28 b Fj(:=)f Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(y)21 b Fh(\003)d Fg(ve)l(ct)8 b Fj([)p Fe(j)d
+Fj(])p Fe(z)21 b Fh(\000)d Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(z)22 b Fh(\003)c Fg(ve)l(ct)7 b Fj([)p Fe(j)e
+Fj(])p Fe(y)s Fj(;)166 4272 y Fg(ve)l(ct)j Fj([)p Fe(k)s
+Fj(])p Fe(y)30 b Fj(:=)d Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(z)22 b Fh(\003)c Fg(ve)l(ct)7 b Fj([)p Fe(j)e
+Fj(])p Fe(x)19 b Fh(\000)f Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(x)19 b Fh(\003)f Fg(ve)l(ct)8 b Fj([)p Fe(j)d
+Fj(])p Fe(z)t Fj(;)166 4372 y Fg(ve)l(ct)j Fj([)p Fe(k)s
+Fj(])p Fe(z)31 b Fj(:=)c Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(x)18 b Fh(\003)g Fg(ve)l(ct)8 b Fj([)p Fe(j)d
+Fj(])p Fe(y)21 b Fh(\000)d Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])p Fe(y)21 b Fh(\003)d Fg(ve)l(ct)8 b Fj([)p Fe(j)d
+Fj(])p Fe(x)p Fj(;)0 4472 y Fk(enddef)k Fj(;)0 4621 y(\045)28
+b(scalar)e(m)n(ultiplication:)37 b Fg(ve)l(ct)8 b Fj([)p
+Fe(j)d Fj(])27 b Fh( )h Fg(ve)l(ct)8 b Fj([)p Fe(i)p
+Fj(])18 b Fh(\003)g Fe(v)0 4721 y Fk(def)37 b Fg(ve)l(ct)p
+314 4721 V 38 w(mult)7 b Fj(\()p Fk(expr)29 b Fe(j;)23
+b(i;)g(v)s Fj(\))28 b(=)166 4820 y Fg(ve)l(ct)8 b Fj([)p
+Fe(j)d Fj(])p Fe(x)28 b Fj(:=)f Fe(v)22 b Fh(\003)c Fg(ve)l(ct)8
+b Fj([)p Fe(i)p Fj(])p Fe(x)p Fj(;)51 b Fg(ve)l(ct)7
+b Fj([)p Fe(j)e Fj(])p Fe(y)31 b Fj(:=)c Fe(v)22 b Fh(\003)c
+Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(y)s Fj(;)50 b
+Fg(ve)l(ct)8 b Fj([)p Fe(j)d Fj(])p Fe(z)31 b Fj(:=)c
+Fe(v)22 b Fh(\003)c Fg(ve)l(ct)7 b Fj([)p Fe(i)p Fj(])p
+Fe(z)t Fj(;)0 4920 y Fk(enddef)i Fj(;)0 5069 y(\045)28
+b(middle)g(of)g(t)n(w)n(o)e(p)r(oin)n(ts)0 5169 y Fk(def)37
+b Fg(mid)p 312 5169 V 40 w(p)l(oint)8 b Fj(\()p Fk(expr)29
+b Fe(k)s(;)23 b(i;)f(j)5 b Fj(\))28 b(=)f Fg(ve)l(ct)p
+1281 5169 V 39 w(sum)6 b Fj(\()p Fe(k)s(;)23 b(i;)g(j)5
+b Fj(\);)51 b Fg(ve)l(ct)p 1955 5169 V 38 w(mult)7 b
+Fj(\()p Fe(k)s(;)23 b(k)s(;)g(:)p Fj(5\);)46 b Fk(enddef)9
+b Fj(;)1929 6139 y(2)p eop
+%%Page: 3 3
+3 2 bop 0 83 3900 4 v 0 163 a Fj(V)-7 b(ector)27 b(rotation)p
+0 190 V 0 371 a(\045)h(Rotation)f(of)g Fg(ve)l(ct)8 b
+Fj([)p Fe(v)s Fj(])28 b(around)f Fg(ve)l(ct)8 b Fj([)p
+Fg(axis)f Fj(])28 b(b)n(y)f(an)g(angle)g Fg(alpha)0 531
+y Fj(The)h(v)n(ector)23 b Fe(~)-39 b(v)31 b Fj(is)c(\014rst)h(pro)5
+b(jected)27 b(on)g(the)h(axis)f(giving)f(v)n(ectors)21
+b Fe(~)-37 b(a)28 b Fj(and)2296 509 y Fe(~)2301 531 y(h)p
+Fj(:)1388 1322 y @beginspecial -23 @llx -6 @lly 112 @urx
+86 @ury 1350 @rwi @setspecial
+%%BeginDocument: vect-fig.9
+%*Font: cmmi10 9.96265 9.96265 61:81802504
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+111.6626 19.68887 lineto stroke
+newpath 107.90381 18.32079 moveto
+111.6626 19.68887 lineto
+107.66257 19.68886 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 38.19089 lineto stroke
+newpath 52.97243 35.39383 moveto
+55.8313 38.19089 lineto
+52.18819 36.54028 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 28.34645 moveto
+55.8313 38.19089 lineto stroke
+ [] 0 setdash
+newpath 52.07251 36.8228 moveto
+55.8313 38.19089 lineto
+51.83127 38.19087 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath 55.8313 9.84444 moveto
+55.8313 38.19089 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath 56.5259 34.2516 moveto
+55.8313 38.19089 lineto
+55.1367 34.2516 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 28.34645 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 24.40717 moveto
+0 28.34645 lineto
+-0.6946 24.40717 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 52.07251 8.47635 moveto
+55.8313 9.84444 lineto
+51.83127 9.84442 lineto
+ closepath
+gsave fill grestore stroke
+-22.0623 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-17.5124 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 56.98946 moveto
+(!) cmsy10 9.96265 fshow
+-22.0623 50.58485 moveto
+(axis) cmmi10 9.96265 fshow
+-9.4037 11.92883 moveto
+(~) cmmi10 9.96265 fshow
+-8.7401 9.29984 moveto
+(h) cmmi10 9.96265 fshow
+24.6588 -5.19548 moveto
+(~) cmmi10 9.96265 fshow
+25.2826 -5.19548 moveto
+(a) cmmi10 9.96265 fshow
+20.24216 21.19543 moveto
+(~) cmmi10 9.96265 fshow
+20.62906 21.19543 moveto
+(v) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 1440 a(If)g(w)n(e)e(set)324 1418 y Fe(~)333
+1440 y(b)i Fj(=)540 1361 y Fh(\000)-26 b(\000)e(!)540
+1407 y Fe(axis)p 499 1421 242 4 v 499 1486 a Fh(k)540
+1458 y(\000)i(\000)e(!)540 1504 y Fe(axis)699 1486 y
+Fh(k)751 1440 y Fj(,)27 b(the)h(rotated)e(v)n(ector)1489
+1419 y Fe(~)1483 1440 y(v)1526 1416 y Fd(0)1577 1440
+y Fj(is)h(equal)f(to)1974 1418 y Fe(~)1979 1440 y(h)18
+b Fj(+)2138 1418 y Fe(~)2127 1440 y(f)36 b Fj(where)2455
+1418 y Fe(~)2443 1440 y(f)g Fj(=)28 b(cos)22 b Fe(\013)c
+Fh(\001)12 b Fe(~)-37 b(a)18 b Fj(+)f(sin)23 b Fe(\013)18
+b Fh(\001)13 b Fe(~)-38 b(c)p Fj(.)37 b(and)3490 1418
+y Fe(~)3495 1440 y(h)28 b Fj(=)f(\()m Fe(~)-39 b(v)21
+b Fh(\001)3787 1418 y Fe(~)3796 1440 y(b)p Fj(\))3855
+1418 y Fe(~)3864 1440 y(b)1538 2382 y @beginspecial -13
+@llx -18 @lly 86 @urx 86 @ury 990 @rwi @setspecial
+%%BeginDocument: vect-fig.10
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000039000001
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+85.03935 0 lineto stroke
+newpath 81.09966 -0.69467 moveto
+85.03935 0 lineto
+81.09966 0.69467 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 56.6929 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 52.75362 moveto
+0 56.6929 lineto
+-0.6946 52.75362 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+56.6929 0 lineto stroke
+newpath 52.75362 -0.6946 moveto
+56.6929 0 lineto
+52.75362 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+43.42886 36.44173 lineto stroke
+newpath 40.85773 33.37752 moveto
+43.42886 36.44173 lineto
+39.96478 34.44167 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 4.2518 0 moveto
+4.2518 1.1277 3.80376 2.20908 3.00641 3.00641 curveto
+2.20908 3.80376 1.1277 4.2518 0 4.2518 curveto
+-1.1277 4.2518 -2.20908 3.80376 -3.00641 3.00641 curveto
+-3.80376 2.20908 -4.2518 1.1277 -4.2518 0 curveto
+-4.2518 -1.1277 -3.80376 -2.20908 -3.00641 -3.00641 curveto
+-2.20908 -3.80376 -1.1277 -4.2518 0 -4.2518 curveto
+1.1277 -4.2518 2.20908 -3.80376 3.00641 -3.00641 curveto
+3.80376 -2.20908 4.2518 -1.1277 4.2518 0 curveto closepath stroke
+newpath 0.99626 0 moveto
+0.99626 0.26422 0.8913 0.51764 0.70447 0.70447 curveto
+0.51764 0.8913 0.26422 0.99626 0 0.99626 curveto
+-0.26422 0.99626 -0.51764 0.8913 -0.70447 0.70447 curveto
+-0.8913 0.51764 -0.99626 0.26422 -0.99626 0 curveto
+-0.99626 -0.26422 -0.8913 -0.51764 -0.70447 -0.70447 curveto
+-0.51764 -0.8913 -0.26422 -0.99626 0 -0.99626 curveto
+0.26422 -0.99626 0.51764 -0.8913 0.70447 -0.70447 curveto
+0.8913 -0.51764 0.99626 -0.26422 0.99626 0 curveto closepath fill
+ [3 3 ] 0 setdash
+newpath 0 36.44173 moveto
+43.42886 36.44173 lineto
+43.42886 0 lineto stroke
+ [] 0 setdash
+newpath 56.6929 0 moveto
+56.6929 13.32878 51.99652 26.23135 43.42886 36.44173 curveto
+32.65703 49.2789 16.75783 56.6929 0 56.6929 curveto stroke
+newpath 17.00804 0 moveto
+17.00804 3.99867 15.59912 7.86949 13.0288 10.93263 curveto stroke
+newpath 15.76941 8.01904 moveto
+14.979 9.08745 14.06085 10.06664 13.0288 10.93263 curveto
+13.70242 9.76588 14.23032 8.53172 14.60764 7.25742 curveto
+ closepath
+gsave fill grestore stroke
+-7.8591 53.13405 moveto
+(~) cmmi10 9.96265 fshow
+-7.3114 53.13405 moveto
+(c) cmmi10 9.96265 fshow
+-13.16432 -14.88742 moveto
+(~) cmmi10 9.96265 fshow
+-12.04523 -17.51642 moveto
+(b) cmmi10 9.96265 fshow
+25.0896 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+25.7134 -10.1177 moveto
+(a) cmmi10 9.96265 fshow
+15.04314 24.88705 moveto
+(~) cmmi10 9.96265 fshow
+13.66454 22.25806 moveto
+(f) cmmi10 9.96265 fshow
+24.30934 5.6113 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2531 a Fj(\045)28 b(The)g(rotation)e(is)h(indep)r(enden)
+n(t)i(of)e Fg(ve)l(ct)8 b Fj([)p Fg(axis)g Fj(]'s)27
+b(mo)r(dule.)0 2631 y(\045)h Fe(v)j Fj(=)c(old)g(and)h(new)f(v)n(ector)
+0 2731 y(\045)h Fg(axis)35 b Fj(=)27 b(rotation)f(axis)0
+2830 y(\045)i Fg(alpha)36 b Fj(=)27 b(rotation)g(angle)0
+2930 y(\045)0 3030 y Fk(v)-5 b(ardef)38 b Fg(ve)l(ct)p
+445 3030 26 4 v 38 w(r)l(otate)6 b Fj(\()p Fk(expr)29
+b Fe(v)s(;)23 b Fg(axis)7 b Fe(;)23 b Fg(alpha)9 b Fj(\))28
+b(=)166 3129 y Fk(sa)m(v)m(e)h Fg(v)p 419 3129 V 39 w(a)7
+b Fe(;)23 b Fg(v)p 592 3129 V 40 w(b)6 b Fe(;)23 b Fg(v)p
+759 3129 V 39 w(c)5 b Fe(;)23 b Fg(v)p 926 3129 V 40
+w(d)9 b Fe(;)23 b Fg(v)p 1100 3129 V 40 w(e)6 b Fe(;)23
+b Fg(v)p 1269 3129 V 40 w(f)18 b Fj(;)166 3229 y Fg(v)p
+218 3229 V 40 w(a)34 b Fj(:=)28 b Fg(new)p 590 3229 V
+39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p 887 3229 V 39 w(b)33
+b Fj(:=)28 b Fg(new)p 1253 3229 V 39 w(ve)l(ct)8 b Fj(;)51
+b Fg(v)p 1550 3229 V 39 w(c)33 b Fj(:=)27 b Fg(new)p
+1915 3229 V 40 w(ve)l(ct)8 b Fj(;)166 3328 y Fg(v)p 218
+3328 V 40 w(d)36 b Fj(:=)28 b Fg(new)p 592 3328 V 39
+w(ve)l(ct)8 b Fj(;)51 b Fg(v)p 889 3328 V 39 w(e)35 b
+Fj(:=)27 b Fg(new)p 1256 3328 V 39 w(ve)l(ct)8 b Fj(;)51
+b Fg(v)p 1553 3328 V 40 w(f)45 b Fj(:=)28 b Fg(new)p
+1919 3328 V 39 w(ve)l(ct)8 b Fj(;)166 3428 y Fg(v)p 218
+3428 V 40 w(g)35 b Fj(:=)27 b Fg(new)p 586 3428 V 40
+w(ve)l(ct)8 b Fj(;)50 b Fg(v)p 884 3428 V 40 w(h)34 b
+Fj(:=)28 b Fg(new)p 1255 3428 V 39 w(ve)l(ct)8 b Fj(;)166
+3528 y Fg(ve)l(ct)p 317 3528 V 38 w(mult)g Fj(\()p Fg(v)p
+596 3528 V 39 w(b)e Fe(;)23 b Fg(axis)7 b Fe(;)23 b Fj(1)p
+Fe(=)p Fg(ve)l(ct)p 1139 3528 V 38 w(mo)l(d)9 b Fj(\()p
+Fg(axis)e Fj(\)\);)166 3627 y Fg(ve)l(ct)p 317 3627 V
+38 w(mult)h Fj(\()p Fg(v)p 596 3627 V 39 w(h)f Fe(;)23
+b Fg(v)p 769 3627 V 40 w(b)5 b Fe(;)24 b Fg(ve)l(ct)p
+1035 3627 V 38 w(dpr)l(o)l(d)10 b Fj(\()p Fg(v)p 1349
+3627 V 40 w(b)5 b Fe(;)23 b(v)s Fj(\)\);)29 b(\045)f(pro)5
+b(jection)26 b(of)i Fe(v)j Fj(on)c Fg(axis)166 3727 y(ve)l(ct)p
+317 3727 V 38 w(di\013)19 b Fj(\()p Fg(v)p 563 3727 V
+40 w(a)7 b Fe(;)23 b(v)s(;)g Fg(v)p 825 3727 V 40 w(h)7
+b Fj(\);)166 3827 y Fg(ve)l(ct)p 317 3827 V 38 w(pr)l(o)l(d)j
+Fj(\()p Fg(v)p 589 3827 V 40 w(c)5 b Fe(;)23 b Fg(v)p
+756 3827 V 39 w(b)6 b Fe(;)23 b Fg(v)p 923 3827 V 40
+w(a)6 b Fj(\);)166 3926 y Fg(ve)l(ct)p 317 3926 V 38
+w(mult)i Fj(\()p Fg(v)p 596 3926 V 39 w(d)h Fe(;)24 b
+Fg(v)p 771 3926 V 39 w(a)7 b Fe(;)23 b Fj(cosd)o(\()p
+Fg(alpha)9 b Fj(\)\);)166 4026 y Fg(ve)l(ct)p 317 4026
+V 38 w(mult)f Fj(\()p Fg(v)p 596 4026 V 39 w(e)f Fe(;)23
+b Fg(v)p 764 4026 V 40 w(c)5 b Fe(;)23 b Fj(sind\()p
+Fg(alpha)8 b Fj(\)\);)166 4125 y Fg(ve)l(ct)p 317 4125
+V 38 w(sum)e Fj(\()p Fg(v)p 580 4125 V 40 w(f)18 b Fe(;)23
+b Fg(v)p 747 4125 V 40 w(d)9 b Fe(;)23 b Fg(v)p 921 4125
+V 40 w(e)6 b Fj(\);)166 4225 y Fg(ve)l(ct)p 317 4225
+V 38 w(sum)g Fj(\()p Fe(v)s(;)24 b Fg(v)p 669 4225 V
+39 w(f)19 b Fe(;)k Fg(v)p 836 4225 V 39 w(h)7 b Fj(\);)166
+4325 y Fg(fr)l(e)l(e)p 305 4325 V 37 w(ve)l(ct)h Fj(\()p
+Fg(v)p 561 4325 V 40 w(h)f Fj(\);)51 b Fg(fr)l(e)l(e)p
+881 4325 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 1137 4325
+V 40 w(g)f Fj(\);)166 4424 y Fg(fr)l(e)l(e)p 305 4424
+V 37 w(ve)l(ct)h Fj(\()p Fg(v)p 561 4424 V 40 w(f)18
+b Fj(\);)51 b Fg(fr)l(e)l(e)p 875 4424 V 37 w(ve)l(ct)8
+b Fj(\()p Fg(v)p 1132 4424 V 40 w(e)e Fj(\);)51 b Fg(fr)l(e)l(e)p
+1446 4424 V 38 w(ve)l(ct)7 b Fj(\()p Fg(v)p 1703 4424
+V 40 w(d)i Fj(\);)166 4524 y Fg(fr)l(e)l(e)p 305 4524
+V 37 w(ve)l(ct)f Fj(\()p Fg(v)p 561 4524 V 40 w(c)d Fj(\);)51
+b Fg(fr)l(e)l(e)p 875 4524 V 37 w(ve)l(ct)8 b Fj(\()p
+Fg(v)p 1131 4524 V 40 w(b)d Fj(\);)51 b Fg(fr)l(e)l(e)p
+1445 4524 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 1702 4524
+V 40 w(a)f Fj(\);)0 4624 y Fk(enddef)i Fj(;)1929 6139
+y(3)p eop
+%%Page: 4 4
+4 3 bop 0 83 3900 4 v 0 164 a Fj(Op)r(erations)26 b(on)i(ob)5
+b(jects)p 0 207 V 0 388 a(\045)28 b Fg(iname)34 b Fj(is)28
+b(the)g(handler)f(for)g(an)g(instance)h(of)f(an)g(ob)5
+b(ject)28 b(of)f(class)g Fg(name)0 487 y Fj(\045)h Fg(iname)34
+b Fj(m)n(ust)28 b(b)r(e)g(a)f(letter)h(string)0 587 y
+Fk(v)-5 b(ardef)38 b Fg(assign)p 525 587 26 4 v 37 w(obj)13
+b Fj(\()p Fk(expr)29 b Fg(iname)7 b Fe(;)23 b Fg(name)6
+b Fj(\))28 b(=)166 687 y Fk(sa)m(v)m(e)h Fg(tmp)l(def)18
+b Fj(;)166 786 y Fk(string)29 b Fg(tmp)l(def)18 b Fj(;)28
+b(\045)g(w)n(e)f(need)g(to)h(add)f(double)h(quotes)f(\(c)n(har)g(34\))
+166 886 y Fg(tmp)l(def)46 b Fj(=)27 b Ff("def)42 b(")18
+b Fj(&)g Fg(iname)26 b Fj(&)18 b Ff("_class=")c Fj(&)k
+Fg(ditto)25 b Fj(&)18 b Fg(name)24 b Fj(&)19 b Fg(ditto)24
+b Fj(&)18 b Ff(")43 b(enddef")m Fj(;)166 986 y Fk(scan)m(tok)m(ens)29
+b Fg(tmp)l(def)18 b Fj(;)166 1085 y Fg(def)p 295 1085
+V 49 w(obj)13 b Fj(\()p Fg(iname)8 b Fj(\);)0 1185 y
+Fk(enddef)h Fj(;)0 1334 y(\045)28 b Fg(name)34 b Fj(is)27
+b(the)h(the)g(name)g(of)f(an)h(ob)5 b(ject)27 b(instance)0
+1434 y(\045)h(It)g(m)n(ust)g(b)r(e)g(made)f(only)g(of)h(letters)f(\(or)
+g(underscores\),)f(but)i(no)g(digits.)0 1533 y Fk(def)37
+b Fg(def)p 292 1533 V 49 w(obj)13 b Fj(\()p Fk(expr)29
+b Fg(name)6 b Fj(\))28 b(=)166 1633 y Fk(scan)m(tok)m(ens)h(b)s
+(egingroup)332 1733 y(sa)m(v)m(e)g Fg(tmp)l(def)18 b
+Fj(;)51 b Fk(string)29 b Fg(tmp)l(def)18 b Fj(;)332 1832
+y Fg(tmp)l(def)46 b Fj(=)27 b Ff("def_")16 b Fj(&)i Fg(obj)p
+1196 1832 V 44 w(class)p 1402 1832 V 38 w Fj(\()p Fg(name)7
+b Fj(\))19 b(&)f Ff("\(")f Fj(&)h Fg(ditto)24 b Fj(&)18
+b Fg(name)25 b Fj(&)18 b Fg(ditto)24 b Fj(&)18 b Ff("\)")o
+Fj(;)332 1932 y Fg(tmp)l(def)166 2032 y Fk(endgroup)0
+2131 y(enddef)9 b Fj(;)0 2281 y(\045)28 b(This)f(macro)g(puts)h(an)f
+(ob)5 b(ject)27 b(bac)n(k)g(where)g(it)h(w)n(as)f(righ)n(t)g(at)g(the)h
+(b)r(eginning.)0 2380 y(\045)g Fg(iname)34 b Fj(is)28
+b(the)g(name)f(of)h(an)f(ob)5 b(ject)28 b(instance.)0
+2480 y Fk(v)-5 b(ardef)38 b Fg(r)l(eset)p 476 2480 V
+38 w(obj)13 b Fj(\()p Fk(expr)29 b Fg(iname)6 b Fj(\))28
+b(=)166 2580 y Fk(sa)m(v)m(e)h Fg(tmp)l(def)18 b Fj(;)166
+2679 y Fk(string)29 b Fg(tmp)l(def)18 b Fj(;)166 2779
+y Fg(de\014ne)p 389 2779 V 37 w(curr)l(ent)p 690 2779
+V 37 w(p)l(oint)p 907 2779 V 39 w(o\013set)p 1139 2779
+V 39 w Fj(\()p Fg(iname)7 b Fj(\);)166 2878 y Fg(tmp)l(def)46
+b Fj(=)27 b Ff("set_")16 b Fj(&)i Fg(obj)p 1029 2878
+V 44 w(class)p 1236 2878 V 38 w Fj(\()p Fg(iname)7 b
+Fj(\))19 b(&)f Ff("_points")l Fj(;)166 2978 y Fk(scan)m(tok)m(ens)29
+b Fg(tmp)l(def)18 b Fj(\()p Fg(iname)7 b Fj(\);)0 3078
+y Fk(enddef)i Fj(;)0 3227 y(\045)28 b(Put)f(an)h(ob)5
+b(ject)27 b(at)h(p)r(osition)f(giv)n(en)g(b)n(y)g Fg(p)l(os)35
+b Fj(\(a)28 b(v)n(ector\))e(and)0 3327 y(\045)i(with)g(orien)n(tations)
+e(giv)n(en)h(b)n(y)g(angles)g Fg(psi)9 b Fj(,)28 b Fg(theta)6
+b Fj(,)28 b Fg(phi)10 b Fj(.)0 3426 y(\045)28 b(The)g(ob)5
+b(ject)27 b(is)g(scaled)g(b)n(y)h Fg(sc)l(ale)7 b Fj(.)0
+3526 y(\045)28 b Fg(iname)34 b Fj(is)28 b(the)g(name)f(of)h(an)f(ob)5
+b(ject)28 b(instance.)0 3626 y Fk(v)-5 b(ardef)38 b Fg(put)p
+422 3626 V 38 w(obj)13 b Fj(\()p Fk(expr)28 b Fg(iname)7
+b Fe(;)23 b Fg(p)l(os)8 b Fe(;)23 b Fg(sc)l(ale)7 b Fe(;)23
+b Fg(psi)9 b Fe(;)23 b Fg(theta)7 b Fe(;)23 b Fg(phi)10
+b Fj(\))28 b(=)166 3725 y Fg(r)l(eset)p 348 3725 V 38
+w(obj)13 b Fj(\()p Fg(iname)7 b Fj(\);)51 b Fg(sc)l(ale)p
+1036 3725 V 38 w(obj)13 b Fj(\()p Fg(iname)7 b Fe(;)23
+b Fg(sc)l(ale)7 b Fj(\);)166 3825 y Fg(v)p 218 3825 V
+40 w(x)37 b Fj(:=)27 b Fg(new)p 589 3825 V 40 w(ve)l(ct)8
+b Fj(;)50 b Fg(v)p 887 3825 V 40 w(y)35 b Fj(:=)28 b
+Fg(new)p 1257 3825 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p
+1554 3825 V 39 w(z)38 b Fj(:=)28 b Fg(new)p 1921 3825
+V 39 w(ve)l(ct)8 b Fj(;)166 3924 y Fg(ve)l(ct)p 317 3924
+V 38 w(def)p 471 3924 V 50 w(ve)l(ct)f Fj(\()p Fg(v)p
+727 3924 V 40 w(x)j Fe(;)23 b Fg(ve)l(ct)p 998 3924 V
+38 w(I)13 b Fj(\);)166 4024 y Fg(ve)l(ct)p 317 4024 V
+38 w(def)p 471 4024 V 50 w(ve)l(ct)7 b Fj(\()p Fg(v)p
+727 4024 V 40 w(y)h Fe(;)23 b Fg(ve)l(ct)p 997 4024 V
+38 w(J)12 b Fj(\);)166 4124 y Fg(ve)l(ct)p 317 4124 V
+38 w(def)p 471 4124 V 50 w(ve)l(ct)7 b Fj(\()p Fg(v)p
+727 4124 V 40 w(z)k Fe(;)23 b Fg(ve)l(ct)p 994 4124 V
+38 w(K)12 b Fj(\);)166 4223 y Fg(r)l(otate)p 386 4223
+V 37 w(obj)p 535 4223 V 43 w(abs)p 686 4223 V 38 w(pv)e
+Fj(\()p Fg(iname)d Fe(;)23 b Fg(p)l(oint)p 1300 4223
+V 39 w(nul)t(l)9 b Fe(;)23 b Fg(v)p 1571 4223 V 39 w(z)10
+b Fe(;)24 b Fg(psi)9 b Fj(\);)166 4323 y Fg(ve)l(ct)p
+317 4323 V 38 w(r)l(otate)e Fj(\()p Fg(v)p 642 4323 V
+40 w(x)i Fe(;)23 b Fg(v)p 814 4323 V 40 w(z)10 b Fe(;)23
+b Fg(psi)9 b Fj(\);)52 b Fg(ve)l(ct)p 1298 4323 V 38
+w(r)l(otate)6 b Fj(\()p Fg(v)p 1623 4323 V 40 w(y)i Fe(;)23
+b Fg(v)p 1794 4323 V 40 w(z)10 b Fe(;)23 b Fg(psi)9 b
+Fj(\);)166 4423 y Fg(r)l(otate)p 386 4423 V 37 w(obj)p
+535 4423 V 43 w(abs)p 686 4423 V 38 w(pv)h Fj(\()p Fg(iname)d
+Fe(;)23 b Fg(p)l(oint)p 1300 4423 V 39 w(nul)t(l)9 b
+Fe(;)23 b Fg(v)p 1571 4423 V 39 w(y)8 b Fe(;)23 b Fg(theta)7
+b Fj(\);)166 4522 y Fg(ve)l(ct)p 317 4522 V 38 w(r)l(otate)g
+Fj(\()p Fg(v)p 642 4522 V 40 w(x)i Fe(;)23 b Fg(v)p 814
+4522 V 40 w(y)8 b Fe(;)23 b Fg(theta)6 b Fj(\);)51 b
+Fg(ve)l(ct)p 1375 4522 V 39 w(r)l(otate)6 b Fj(\()p Fg(v)p
+1700 4522 V 40 w(z)k Fe(;)23 b Fg(v)p 1868 4522 V 40
+w(y)7 b Fe(;)24 b Fg(theta)6 b Fj(\);)166 4622 y Fg(r)l(otate)p
+386 4622 V 37 w(obj)p 535 4622 V 43 w(abs)p 686 4622
+V 38 w(pv)k Fj(\()p Fg(iname)d Fe(;)23 b Fg(p)l(oint)p
+1300 4622 V 39 w(nul)t(l)9 b Fe(;)23 b Fg(v)p 1571 4622
+V 39 w(x)10 b Fe(;)23 b Fg(phi)10 b Fj(\);)166 4722 y
+Fg(ve)l(ct)p 317 4722 V 38 w(r)l(otate)d Fj(\()p Fg(v)p
+642 4722 V 40 w(y)g Fe(;)23 b Fg(v)p 814 4722 V 40 w(x)10
+b Fe(;)23 b Fg(phi)9 b Fj(\);)52 b Fg(ve)l(ct)p 1310
+4722 V 38 w(r)l(otate)6 b Fj(\()p Fg(v)p 1635 4722 V
+40 w(z)k Fe(;)23 b Fg(v)p 1803 4722 V 40 w(x)10 b Fe(;)23
+b Fg(phi)9 b Fj(\);)166 4821 y Fg(fr)l(e)l(e)p 305 4821
+V 37 w(ve)l(ct)f Fj(\()p Fg(v)p 561 4821 V 40 w(z)i Fj(\);)51
+b Fg(fr)l(e)l(e)p 876 4821 V 37 w(ve)l(ct)8 b Fj(\()p
+Fg(v)p 1133 4821 V 40 w(y)g Fj(\);)51 b Fg(fr)l(e)l(e)p
+1451 4821 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 1707 4821
+V 40 w(x)h Fj(\);)166 4921 y Fg(tr)l(anslate)p 488 4921
+V 37 w(obj)k Fj(\()p Fg(iname)7 b Fe(;)23 b Fg(p)l(os)7
+b Fj(\);)0 5020 y Fk(enddef)i Fj(;)1929 6139 y(4)p eop
+%%Page: 5 5
+5 4 bop 0 83 3900 4 v 0 164 a Fj(Rotation,)27 b(translation)g(and)g
+(scaling)g(of)g(ob)5 b(jects)p 0 207 V 0 388 a(\045)28
+b(Rotation)f(of)g(an)h(ob)5 b(ject)27 b(instance)g Fg(name)35
+b Fj(around)26 b(an)h(axis)0 487 y(\045)h(going)e(through)h(a)g(p)r
+(oin)n(t)h Fe(p)g Fj(\(lo)r(cal)f(to)g(the)h(ob)5 b(ject\))0
+587 y(\045)28 b(and)f(directed)h(b)n(y)f(v)n(ector)f
+Fg(ve)l(ct)8 b Fj([)p Fe(v)s Fj(].)37 b(The)28 b(angle)f(of)g(rotation)
+g(is)g Fe(a)p Fj(.)0 687 y Fk(v)-5 b(ardef)38 b Fg(r)l(otate)p
+514 687 26 4 v 36 w(obj)p 663 687 V 44 w(pv)10 b Fj(\()p
+Fk(expr)28 b Fg(name)7 b Fe(;)23 b(p;)g(v)s(;)g(a)p Fj(\))28
+b(=)166 786 y Fg(de\014ne)p 389 786 V 37 w(curr)l(ent)p
+690 786 V 37 w(p)l(oint)p 907 786 V 39 w(o\013set)p 1139
+786 V 39 w Fj(\()p Fg(name)6 b Fj(\);)166 886 y Fg(r)l(otate)p
+386 886 V 37 w(obj)p 535 886 V 43 w(abs)p 686 886 V 38
+w(pv)k Fj(\()p Fg(name)d Fe(;)23 b Fg(pnt)7 b Fj(\()p
+Fe(p)p Fj(\))p Fe(;)24 b(v)s(;)f(a)p Fj(\);)0 986 y Fk(enddef)9
+b Fj(;)0 1135 y Fk(v)-5 b(ardef)38 b Fg(r)l(otate)p 514
+1135 V 36 w(obj)p 663 1135 V 44 w(abs)p 814 1135 V 38
+w(pv)10 b Fj(\()p Fk(expr)28 b Fg(name)7 b Fe(;)23 b(p;)g(v)s(;)g(a)p
+Fj(\))28 b(=)166 1235 y Fk(sa)m(v)m(e)h Fg(v)p 419 1235
+V 39 w(a)7 b Fj(;)166 1334 y Fg(de\014ne)p 389 1334 V
+37 w(curr)l(ent)p 690 1334 V 37 w(p)l(oint)p 907 1334
+V 39 w(o\013set)p 1139 1334 V 39 w Fj(\()p Fg(name)f
+Fj(\);)166 1434 y Fg(v)p 218 1434 V 40 w(a)34 b Fj(:=)28
+b Fg(new)p 590 1434 V 39 w(ve)l(ct)8 b Fj(;)166 1533
+y Fk(for)28 b Fe(i)f Fj(:=)h(1)18 b Fk(upto)g Fg(obj)p
+874 1533 V 44 w(p)l(oints)p 1126 1533 V 37 w Fj(\()p
+Fg(name)7 b Fj(\):)332 1633 y Fg(ve)l(ct)p 483 1633 V
+38 w(di\013)19 b Fj(\()p Fg(v)p 729 1633 V 40 w(a)7 b
+Fe(;)23 b Fg(pnt)7 b Fj(\()p Fe(i)p Fj(\))p Fe(;)24 b(p)p
+Fj(\);)332 1733 y Fg(ve)l(ct)p 483 1733 V 38 w(r)l(otate)7
+b Fj(\()p Fg(v)p 808 1733 V 40 w(a)f Fe(;)24 b(v)s(;)f(a)p
+Fj(\);)332 1832 y Fg(ve)l(ct)p 483 1832 V 38 w(sum)6
+b Fj(\()p Fg(pnt)i Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b Fg(v)p
+1010 1832 V 40 w(a)7 b Fe(;)23 b(p)p Fj(\);)166 1932
+y Fk(endfor)p Fj(;)166 2032 y Fg(fr)l(e)l(e)p 305 2032
+V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 561 2032 V 40 w(a)f
+Fj(\);)0 2131 y Fk(enddef)i Fj(;)0 2281 y(\045)28 b(Rotation)f(of)g(an)
+h(ob)5 b(ject)27 b(instance)g Fg(name)35 b Fj(around)26
+b(an)h(axis)0 2380 y(\045)h(going)e(through)h(a)g(p)r(oin)n(t)h
+Fe(p)g Fj(\(lo)r(cal)f(to)g(the)h(ob)5 b(ject\))0 2480
+y(\045)28 b(and)f(directed)h(b)n(y)f(v)n(ector)941 2452
+y Fh(\000)-65 b(!)942 2480 y Fe(pq)s Fj(.)37 b(The)28
+b(angle)f(of)g(rotation)g(is)g Fe(a)p Fj(.)0 2580 y Fk(v)-5
+b(ardef)38 b Fg(r)l(otate)p 514 2580 V 36 w(obj)p 663
+2580 V 44 w(pp)6 b Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)23
+b(p;)g(q)s(;)g(a)p Fj(\))28 b(=)166 2679 y Fk(sa)m(v)m(e)h
+Fg(v)p 419 2679 V 39 w(a)7 b Fe(;)23 b Fg(axis)8 b Fj(;)166
+2779 y Fg(de\014ne)p 389 2779 V 37 w(curr)l(ent)p 690
+2779 V 37 w(p)l(oint)p 907 2779 V 39 w(o\013set)p 1139
+2779 V 39 w Fj(\()p Fg(name)e Fj(\);)166 2878 y Fg(v)p
+218 2878 V 40 w(a)34 b Fj(:=)28 b Fg(new)p 590 2878 V
+39 w(ve)l(ct)8 b Fj(;)51 b Fg(axis)34 b Fj(:=)28 b Fg(new)p
+1279 2878 V 39 w(ve)l(ct)8 b Fj(;)166 2978 y Fg(ve)l(ct)p
+317 2978 V 38 w(di\013)19 b Fj(\()p Fg(axis)7 b Fe(;)23
+b Fg(pnt)8 b Fj(\()p Fe(q)s Fj(\))p Fe(;)24 b Fg(pnt)7
+b Fj(\()p Fe(p)p Fj(\)\);)166 3078 y Fk(for)28 b Fe(i)f
+Fj(:=)h(1)18 b Fk(upto)g Fg(obj)p 874 3078 V 44 w(p)l(oints)p
+1126 3078 V 37 w Fj(\()p Fg(name)7 b Fj(\):)332 3177
+y Fg(ve)l(ct)p 483 3177 V 38 w(di\013)19 b Fj(\()p Fg(v)p
+729 3177 V 40 w(a)7 b Fe(;)23 b Fg(pnt)7 b Fj(\()p Fe(i)p
+Fj(\))p Fe(;)24 b Fg(pnt)7 b Fj(\()p Fe(p)p Fj(\)\);)332
+3277 y Fg(ve)l(ct)p 483 3277 V 38 w(r)l(otate)g Fj(\()p
+Fg(v)p 808 3277 V 40 w(a)f Fe(;)24 b Fg(axis)7 b Fe(;)23
+b(a)p Fj(\);)332 3377 y Fg(ve)l(ct)p 483 3377 V 38 w(sum)6
+b Fj(\()p Fg(pnt)i Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b Fg(v)p
+1010 3377 V 40 w(a)7 b Fe(;)23 b Fg(pnt)8 b Fj(\()p Fe(p)p
+Fj(\)\);)166 3476 y Fk(endfor)p Fj(;)166 3576 y Fg(fr)l(e)l(e)p
+305 3576 V 37 w(ve)l(ct)g Fj(\()p Fg(axis)f Fj(\);)52
+b Fg(fr)l(e)l(e)p 902 3576 V 37 w(ve)l(ct)7 b Fj(\()p
+Fg(v)p 1158 3576 V 40 w(a)g Fj(\);)0 3675 y Fk(enddef)i
+Fj(;)0 3825 y(\045)28 b(T)-7 b(ranslation)26 b(of)i(an)f(ob)5
+b(ject)27 b(instance)h Fg(name)34 b Fj(b)n(y)27 b(a)g(v)n(ector)f
+Fg(ve)l(ct)8 b Fj([)p Fe(v)s Fj(].)0 3924 y Fk(v)-5 b(ardef)38
+b Fg(tr)l(anslate)p 616 3924 V 36 w(obj)13 b Fj(\()p
+Fk(expr)29 b Fg(name)6 b Fe(;)24 b(v)s Fj(\))k(=)166
+4024 y Fg(de\014ne)p 389 4024 V 37 w(curr)l(ent)p 690
+4024 V 37 w(p)l(oint)p 907 4024 V 39 w(o\013set)p 1139
+4024 V 39 w Fj(\()p Fg(name)6 b Fj(\);)166 4124 y Fk(for)28
+b Fe(i)f Fj(:=)h(1)18 b Fk(upto)g Fg(obj)p 874 4124 V
+44 w(p)l(oints)p 1126 4124 V 37 w Fj(\()p Fg(name)7 b
+Fj(\):)332 4223 y Fg(ve)l(ct)p 483 4223 V 38 w(sum)f
+Fj(\()p Fg(pnt)i Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b Fg(pnt)8
+b Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b(v)s Fj(\);)166 4323
+y Fk(endfor)p Fj(;)0 4423 y Fk(enddef)9 b Fj(;)0 4572
+y(\045)28 b(Scalar)e(m)n(ultiplication)i(of)f(an)h(ob)5
+b(ject)27 b(instance)g Fg(name)35 b Fj(b)n(y)27 b(a)g(scalar)f
+Fe(v)s Fj(.)0 4672 y Fk(v)-5 b(ardef)38 b Fg(sc)l(ale)p
+474 4672 V 37 w(obj)13 b Fj(\()p Fk(expr)29 b Fg(name)6
+b Fe(;)23 b(v)s Fj(\))29 b(=)166 4771 y Fg(de\014ne)p
+389 4771 V 37 w(curr)l(ent)p 690 4771 V 37 w(p)l(oint)p
+907 4771 V 39 w(o\013set)p 1139 4771 V 39 w Fj(\()p Fg(name)6
+b Fj(\);)166 4871 y Fk(for)28 b Fe(i)f Fj(:=)h(1)18 b
+Fk(upto)g Fg(obj)p 874 4871 V 44 w(p)l(oints)p 1126 4871
+V 37 w Fj(\()p Fg(name)7 b Fj(\):)332 4971 y Fg(ve)l(ct)p
+483 4971 V 38 w(mult)h Fj(\()p Fg(pnt)f Fj(\()p Fe(i)p
+Fj(\))p Fe(;)24 b Fg(pnt)7 b Fj(\()p Fe(i)p Fj(\))p Fe(;)24
+b(v)s Fj(\);)166 5070 y Fk(endfor)p Fj(;)0 5170 y Fk(enddef)9
+b Fj(;)1929 6139 y(5)p eop
+%%Page: 6 6
+6 5 bop 0 83 3900 4 v 0 164 a Fj(F)-7 b(unctions)28 b(to)f(build)h(new)
+g(p)r(oin)n(ts)g(in)g(space)p 0 207 V 0 388 a(\045)g(Rotation)f(in)h(a)
+f(plane:)37 b(this)28 b(is)f(useful)h(to)g(de\014ne)f(a)h(regular)d(p)r
+(olygon.)0 487 y(\045)j Fe(k)i Fj(is)e(a)f(new)h(p)r(oin)n(t)f
+(obtained)h(from)f(p)r(oin)n(t)h Fe(j)k Fj(b)n(y)c(rotation)e(around)h
+Fe(o)0 587 y Fj(\045)h(b)n(y)f(a)g(angle)g Fe(\013)h
+Fj(equal)f(to)h(the)g(angle)f(from)g Fe(i)g Fj(to)h Fe(j)5
+b Fj(.)1679 1145 y @beginspecial -7 @llx -7 @lly 58 @urx
+57 @ury 650 @rwi @setspecial
+%%BeginDocument: vect-fig.11
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000000388
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 0 0 moveto
+43.42923 36.44121 lineto stroke
+newpath 0 0 moveto
+19.3903 53.27371 lineto stroke
+newpath 22.33218 3.93771 moveto
+21.64098 7.85783 19.93013 11.52698 17.37143 14.57626 curveto stroke
+newpath 20.19688 11.74487 moveto
+19.34358 12.76617 18.39877 13.71422 17.37143 14.57626 curveto
+18.04199 13.41484 18.60558 12.20084 19.05812 10.94928 curveto
+ closepath
+gsave fill grestore stroke
+newpath 17.37143 14.57626 moveto
+14.81273 17.62555 11.49652 19.94771 7.756 21.30916 curveto stroke
+newpath 11.6186 20.26982 moveto
+10.36897 20.72763 9.07674 21.07628 7.756 21.30916 curveto
+8.91743 20.6386 10.0125 19.86902 11.0302 19.01143 curveto
+ closepath
+gsave fill grestore stroke
+25.05493 11.03316 moveto
+(\013) cmmi10 9.96265 fshow
+14.67989 23.39748 moveto
+(\013) cmmi10 9.96265 fshow
+-6.9291 -6.3895 moveto
+(o) cmmi10 9.96265 fshow
+54.11514 0.27383 moveto
+(i) cmmi10 9.96265 fshow
+45.52922 27.77061 moveto
+(j) cmmi10 9.96265 fshow
+10.8901 49.81445 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 1244 a Fk(v)-5 b(ardef)38 b Fg(r)l(otate)p
+514 1244 26 4 v 36 w(in)p 622 1244 V 38 w(plane)p 850
+1244 V 37 w Fj(\()p Fk(expr)29 b Fe(k)s(;)23 b(o;)g(i;)g(j)5
+b Fj(\))28 b(=)166 1344 y Fk(sa)m(v)m(e)h Fg(c)l(osalpha)8
+b Fe(;)24 b Fg(sinalpha)8 b Fe(;)23 b Fg(alpha)8 b Fe(;)24
+b Fg(v)p 1366 1344 V 39 w(a)7 b Fe(;)23 b Fg(v)p 1538
+1344 V 40 w(b)5 b Fe(;)23 b Fg(v)p 1706 1344 V 40 w(c)5
+b Fj(;)166 1444 y Fg(v)p 218 1444 V 40 w(a)34 b Fj(:=)28
+b Fg(new)p 590 1444 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p
+887 1444 V 39 w(b)33 b Fj(:=)28 b Fg(new)p 1253 1444
+V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p 1550 1444 V 39 w(c)33
+b Fj(:=)27 b Fg(new)p 1915 1444 V 40 w(ve)l(ct)8 b Fj(;)166
+1543 y Fg(ve)l(ct)p 317 1543 V 38 w(di\013)19 b Fj(\()p
+Fg(v)p 563 1543 V 40 w(a)7 b Fe(;)23 b(i;)f(o)p Fj(\);)52
+b Fg(ve)l(ct)p 1056 1543 V 38 w(di\013)18 b Fj(\()p Fg(v)p
+1302 1543 V 40 w(b)6 b Fe(;)23 b(j;)g(o)p Fj(\);)52 b
+Fg(ve)l(ct)p 1795 1543 V 38 w(pr)l(o)l(d)10 b Fj(\()p
+Fg(v)p 2067 1543 V 39 w(c)5 b Fe(;)23 b Fg(v)p 2234 1543
+V 40 w(a)7 b Fe(;)23 b Fg(v)p 2406 1543 V 40 w(b)5 b
+Fj(\);)166 1643 y Fg(c)l(osalpha)36 b Fj(=)28 b Fg(ve)l(ct)p
+745 1643 V 38 w(dpr)l(o)l(d)10 b Fj(\()p Fg(v)p 1059
+1643 V 40 w(a)d Fe(;)23 b Fg(v)p 1232 1643 V 39 w(b)6
+b Fj(\))p Fe(=)p Fg(ve)l(ct)p 1526 1643 V 38 w(mo)l(d)j
+Fj(\()p Fg(v)p 1793 1643 V 40 w(a)e Fj(\))p Fe(=)p Fg(ve)l(ct)p
+2092 1643 V 38 w(mo)l(d)i Fj(\()p Fg(v)p 2358 1643 V
+40 w(b)c Fj(\);)166 1743 y Fg(sinalpha)36 b Fj(=)27 b(sqrt\(1)18
+b Fh(\000)g Fg(c)l(osalpha)27 b Fh(\003\003)18 b Fj(2\);)166
+1842 y Fg(alpha)36 b Fj(=)27 b(angle)o(\(\()p Fg(c)l(osalpha)10
+b Fe(;)23 b Fg(sinalpha)8 b Fj(\)\);)166 1942 y Fg(ve)l(ct)p
+317 1942 V 38 w(r)l(otate)f Fj(\()p Fg(v)p 642 1942 V
+40 w(b)e Fe(;)23 b Fg(v)p 809 1942 V 40 w(c)5 b Fe(;)23
+b Fg(alpha)8 b Fj(\);)166 2041 y Fg(ve)l(ct)p 317 2041
+V 38 w(sum)e Fj(\()p Fe(k)s(;)23 b(o;)h Fg(v)p 758 2041
+V 39 w(b)6 b Fj(\);)166 2141 y Fg(fr)l(e)l(e)p 305 2141
+V 37 w(ve)l(ct)i Fj(\()p Fg(v)p 561 2141 V 40 w(c)d Fj(\);)51
+b Fg(fr)l(e)l(e)p 875 2141 V 37 w(ve)l(ct)8 b Fj(\()p
+Fg(v)p 1131 2141 V 40 w(b)d Fj(\);)51 b Fg(fr)l(e)l(e)p
+1445 2141 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 1702 2141
+V 40 w(a)f Fj(\);)0 2241 y Fk(enddef)i Fj(;)0 2390 y
+Fk(v)-5 b(ardef)38 b Fg(r)l(otate)p 514 2390 V 36 w(in)p
+622 2390 V 38 w(plane)7 b Fj(\()p Fk(expr)28 b Fe(k)s(;)23
+b(o;)h(i;)e(j)5 b Fj(\))28 b(=)166 2490 y Fg(r)l(otate)p
+386 2490 V 37 w(in)p 495 2490 V 37 w(plane)p 722 2490
+V 38 w Fj(\()p Fg(pnt)7 b Fj(\()p Fe(k)s Fj(\))p Fe(;)24
+b(o;)f Fg(pnt)8 b Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b Fg(pnt)8
+b Fj(\()p Fe(j)d Fj(\)\))0 2589 y Fk(enddef)k Fj(;)0
+2739 y(\045)28 b(Build)g(a)f(p)r(oin)n(t)h(on)f(a)g(adjacen)n(t)g
+(face.)0 2852 y(The)h(middle)g Fe(m)f Fj(of)h(p)r(oin)n(ts)f
+Fe(i)h Fj(and)f Fe(j)33 b Fj(is)27 b(suc)n(h)h(that)1729
+2826 y Fc(d)1622 2852 y Fj(\()1654 2825 y Fh(\000)-34
+b(!)1654 2852 y Fe(om)q(;)1814 2825 y Fh(\000)-39 b(!)1814
+2852 y Fe(mc)p Fj(\))28 b(=)f Fe(\013)h Fj(This)g(is)f(useful)h(to)g
+(de\014ne)f(regular)f(p)r(olyhedra)1592 3398 y @beginspecial
+-8 @llx -9 @lly 78 @urx 53 @ury 860 @rwi @setspecial
+%%BeginDocument: vect-fig.7
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008308
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+34.97847 18.22087 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 0 0 moveto
+45.83568 9.11044 lineto
+75.09138 45.55219 lineto stroke
+newpath 45.83568 9.11044 moveto
+68.75352 13.66566 lineto stroke
+ [] 0 setdash
+newpath 57.2946 11.38806 moveto
+57.2946 14.34955 55.87602 17.22853 53.1496 18.22089 curveto stroke
+65.54852 16.66566 moveto
+(\013) cmmi10 9.96265 fshow
+-7.8291 -2.14476 moveto
+(o) cmmi10 9.96265 fshow
+28.20547 22.25806 moveto
+(j) cmmi10 9.96265 fshow
+58.7929 -8.6706 moveto
+(i) cmmi10 9.96265 fshow
+72.93568 48.55219 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 3497 a Fk(v)-5 b(ardef)38 b Fg(new)p 448
+3497 V 39 w(fac)l(e)p 623 3497 V 38 w(p)l(oint)p 843
+3497 V 39 w Fj(\()p Fk(expr)28 b Fe(c;)23 b(o;)h(i;)f(j;)g
+Fg(alpha)8 b Fj(\))28 b(=)166 3597 y Fk(sa)m(v)m(e)h
+Fg(v)p 419 3597 V 39 w(a)7 b Fe(;)23 b Fg(v)p 592 3597
+V 40 w(b)6 b Fe(;)23 b Fg(v)p 759 3597 V 39 w(c)5 b Fe(;)23
+b Fg(v)p 926 3597 V 40 w(d)9 b Fe(;)23 b Fg(v)p 1100
+3597 V 40 w(e)6 b Fj(;)166 3697 y Fg(v)p 218 3697 V 40
+w(a)34 b Fj(:=)28 b Fg(new)p 590 3697 V 39 w(ve)l(ct)8
+b Fj(;)51 b Fg(v)p 887 3697 V 39 w(b)33 b Fj(:=)28 b
+Fg(new)p 1253 3697 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p
+1550 3697 V 39 w(c)33 b Fj(:=)27 b Fg(new)p 1915 3697
+V 40 w(ve)l(ct)8 b Fj(;)50 b Fg(v)p 2213 3697 V 40 w(d)37
+b Fj(:=)27 b Fg(new)p 2586 3697 V 40 w(ve)l(ct)7 b Fj(;)51
+b Fg(v)p 2883 3697 V 40 w(e)34 b Fj(:=)27 b Fg(new)p
+3250 3697 V 40 w(ve)l(ct)8 b Fj(;)166 3796 y Fg(ve)l(ct)p
+317 3796 V 38 w(di\013)19 b Fj(\()p Fg(v)p 563 3796 V
+40 w(a)7 b Fe(;)23 b(i;)f(o)p Fj(\);)52 b Fg(ve)l(ct)p
+1056 3796 V 38 w(di\013)18 b Fj(\()p Fg(v)p 1302 3796
+V 40 w(b)6 b Fe(;)23 b(j;)g(o)p Fj(\);)166 3896 y Fg(ve)l(ct)p
+317 3896 V 38 w(sum)6 b Fj(\()p Fg(v)p 580 3896 V 40
+w(c)f Fe(;)23 b Fg(v)p 746 3896 V 40 w(a)7 b Fe(;)23
+b Fg(v)p 919 3896 V 39 w(b)6 b Fj(\);)166 3996 y Fg(ve)l(ct)p
+317 3996 V 38 w(mult)i Fj(\()p Fg(v)p 596 3996 V 39 w(d)h
+Fe(;)24 b Fg(v)p 771 3996 V 39 w(c)5 b Fe(;)23 b(:)p
+Fj(5\);)166 4095 y Fg(ve)l(ct)p 317 4095 V 38 w(di\013)c
+Fj(\()p Fg(v)p 563 4095 V 40 w(e)6 b Fe(;)23 b(i;)g(j)5
+b Fj(\);)166 4195 y Fg(ve)l(ct)p 317 4195 V 38 w(sum)h
+Fj(\()p Fe(c;)23 b Fg(v)p 662 4195 V 40 w(d)9 b Fe(;)23
+b(o)p Fj(\);)166 4294 y Fg(ve)l(ct)p 317 4294 V 38 w(r)l(otate)7
+b Fj(\()p Fg(v)p 642 4294 V 40 w(d)i Fe(;)23 b Fg(v)p
+817 4294 V 39 w(e)7 b Fe(;)23 b Fg(alpha)8 b Fj(\);)166
+4394 y Fg(ve)l(ct)p 317 4394 V 38 w(sum)e Fj(\()p Fe(c;)23
+b Fg(v)p 662 4394 V 40 w(d)9 b Fe(;)23 b(c)p Fj(\);)166
+4494 y Fg(fr)l(e)l(e)p 305 4494 V 37 w(ve)l(ct)8 b Fj(\()p
+Fg(v)p 561 4494 V 40 w(e)e Fj(\);)51 b Fg(fr)l(e)l(e)p
+876 4494 V 38 w(ve)l(ct)7 b Fj(\()p Fg(v)p 1133 4494
+V 40 w(d)i Fj(\);)51 b Fg(fr)l(e)l(e)p 1454 4494 V 38
+w(ve)l(ct)7 b Fj(\()p Fg(v)p 1711 4494 V 40 w(c)e Fj(\);)51
+b Fg(fr)l(e)l(e)p 2024 4494 V 37 w(ve)l(ct)8 b Fj(\()p
+Fg(v)p 2281 4494 V 40 w(b)e Fj(\);)51 b Fg(fr)l(e)l(e)p
+2595 4494 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 2851 4494
+V 40 w(a)e Fj(\);)0 4593 y Fk(enddef)j Fj(;)0 4793 y
+Fk(v)-5 b(ardef)38 b Fg(new)p 448 4793 V 39 w(fac)l(e)p
+623 4793 V 38 w(p)l(oint)8 b Fj(\()p Fk(expr)29 b Fe(c;)23
+b(o;)g(i;)g(j;)g Fg(alpha)9 b Fj(\))28 b(=)166 4892 y
+Fg(new)p 320 4892 V 40 w(fac)l(e)p 496 4892 V 37 w(p)l(oint)p
+715 4892 V 39 w Fj(\()p Fg(pnt)8 b Fj(\()p Fe(c)p Fj(\))p
+Fe(;)24 b Fg(pnt)7 b Fj(\()p Fe(o)p Fj(\))p Fe(;)24 b
+Fg(pnt)8 b Fj(\()p Fe(i)p Fj(\))p Fe(;)23 b Fg(pnt)8
+b Fj(\()p Fe(j)d Fj(\))p Fe(;)23 b Fg(alpha)9 b Fj(\))0
+4992 y Fk(enddef)g Fj(;)0 5141 y Fk(v)-5 b(ardef)38 b
+Fg(new)p 448 5141 V 39 w(abs)p 599 5141 V 38 w(fac)l(e)p
+775 5141 V 38 w(p)l(oint)8 b Fj(\()p Fk(expr)29 b Fe(c;)23
+b(o;)g(i;)g(j;)g Fg(alpha)9 b Fj(\))28 b(=)166 5241 y
+Fg(new)p 320 5241 V 40 w(fac)l(e)p 496 5241 V 37 w(p)l(oint)p
+715 5241 V 39 w Fj(\()p Fe(c;)23 b(o;)h Fg(pnt)7 b Fj(\()p
+Fe(i)p Fj(\))p Fe(;)24 b Fg(pnt)7 b Fj(\()p Fe(j)e Fj(\))p
+Fe(;)24 b Fg(alpha)8 b Fj(\))0 5340 y Fk(enddef)h Fj(;)1929
+6139 y(6)p eop
+%%Page: 7 7
+7 6 bop 0 83 3900 4 v 0 164 a Fj(Computation)27 b(of)h(the)g(pro)5
+b(jection)26 b(of)i(a)f(p)r(oin)n(t)h(on)f(the)h(\\screen")p
+0 207 V 0 388 a(\045)g Fe(p)f Fj(is)h(the)g(pro)5 b(jection)26
+b(of)i Fe(m)0 487 y Fj(\045)g Fe(m)f Fj(=)h(p)r(oin)n(t)f(in)h(space)f
+(\(3)h(co)r(ordinates\))0 587 y(\045)g Fe(p)f Fj(=)h(p)r(oin)n(t)f(of)h
+(the)g(in)n(tersection)f(plane)571 2070 y @beginspecial
+-25 @llx -25 @lly 306 @urx 150 @ury 3310 @rwi @setspecial
+%%BeginDocument: vect-fig.8
+%*Font: cmmi10 9.96265 9.96265 4f:800014224c6
+%*Font: cmr10 9.96265 9.96265 61:a8d75
+%*Font: cmmi7 6.97385 6.97385 69:e1
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 45.35449 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 41.4152 moveto
+0 45.35449 lineto
+-0.6946 41.4152 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+35.96683 -16.77173 lineto stroke
+newpath 32.10292 -15.7364 moveto
+35.96683 -16.77173 lineto
+32.69005 -14.47731 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+53.27417 19.39043 lineto stroke
+newpath 49.81003 17.3904 moveto
+53.27417 19.39043 lineto
+49.3349 18.69582 lineto
+ closepath
+gsave fill grestore stroke
+newpath 159.82251 148.88026 moveto
+159.82251 58.17128 lineto
+231.75616 24.62782 lineto stroke
+ [3 3 ] 0 setdash
+newpath 53.27417 19.39043 moveto
+159.82251 58.17128 lineto stroke
+newpath 0 0 moveto
+267.72299 143.91957 lineto stroke
+ [0 5 ] 2.5 setdash
+newpath 187.40527 100.74326 moveto
+159.8223 113.60522 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 187.40527 100.74326 moveto
+187.40549 45.30931 lineto stroke
+147.3327 112.88567 moveto
+(y) cmmi10 9.96265 fshow
+152.21721 111.39127 moveto
+(p) cmmi7 6.97385 fshow
+182.25598 38.0198 moveto
+(x) cmmi10 9.96265 fshow
+187.94987 36.5254 moveto
+(p) cmmi7 6.97385 fshow
+-24.0194 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-18.49089 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 24.57285 moveto
+(!) cmsy10 9.96265 fshow
+-24.0194 17.82045 moveto
+(O) cmmi10 9.96265 fshow
+-16.14339 17.82045 moveto
+(bs) cmmi10 9.96265 fshow
+-7.1978 16.32605 moveto
+(j) cmmi7 6.97385 fshow
+-5.83998 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+0.04042 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+5.92082 -16.29745 moveto
+(!) cmsy10 9.96265 fshow
+-5.83998 -23.04985 moveto
+(O) cmmi10 9.96265 fshow
+2.03603 -23.04985 moveto
+(bs) cmmi10 9.96265 fshow
+10.98161 -24.54425 moveto
+(k) cmmi7 6.97385 fshow
+28.73708 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+33.82507 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+38.91287 1.78363 moveto
+(!) cmsy10 9.96265 fshow
+28.73708 -4.96877 moveto
+(O) cmmi10 9.96265 fshow
+36.61308 -4.96877 moveto
+(bs) cmmi10 9.96265 fshow
+45.55867 -6.46317 moveto
+(i) cmmi7 6.97385 fshow
+75.05598 12.73616 moveto
+(O) cmmi10 9.96265 fshow
+82.93199 12.73616 moveto
+(bs) cmmi10 9.96265 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 92.47539 12.93536 moveto
+95.46419 12.93536 lineto stroke
+95.46419 12.73616 moveto
+(dist) cmmi10 9.96265 fshow
+184.89902 93.45375 moveto
+(p) cmmi10 9.96265 fshow
+270.72299 141.77481 moveto
+(m) cmmi10 9.96265 fshow
+newpath 188.40154 100.74326 moveto
+188.40154 101.00748 188.29657 101.2609 188.10974 101.44772 curveto
+187.92291 101.63455 187.6695 101.73952 187.40527 101.73952 curveto
+187.14105 101.73952 186.88763 101.63455 186.7008 101.44772 curveto
+186.51398 101.2609 186.40901 101.00748 186.40901 100.74326 curveto
+186.40901 100.47903 186.51398 100.22562 186.7008 100.03879 curveto
+186.88763 99.85196 187.14105 99.747 187.40527 99.747 curveto
+187.6695 99.747 187.92291 99.85196 188.10974 100.03879 curveto
+188.29657 100.22562 188.40154 100.47903 188.40154 100.74326 curveto closepath
+ fill
+newpath 268.71925 143.91957 moveto
+268.71925 144.18379 268.61429 144.43721 268.42746 144.62404 curveto
+268.24063 144.81087 267.98721 144.91583 267.72299 144.91583 curveto
+267.45877 144.91583 267.20535 144.81087 267.01852 144.62404 curveto
+266.8317 144.43721 266.72673 144.18379 266.72673 143.91957 curveto
+266.72673 143.65535 266.8317 143.40193 267.01852 143.2151 curveto
+267.20535 143.02827 267.45877 142.92331 267.72299 142.92331 curveto
+267.98721 142.92331 268.24063 143.02827 268.42746 143.2151 curveto
+268.61429 143.40193 268.71925 143.65535 268.71925 143.91957 curveto closepath
+ fill
+newpath 188.40175 45.30931 moveto
+188.40175 45.57353 188.29678 45.82695 188.10995 46.01378 curveto
+187.92313 46.2006 187.66971 46.30557 187.40549 46.30557 curveto
+187.14127 46.30557 186.88785 46.2006 186.70102 46.01378 curveto
+186.51419 45.82695 186.40923 45.57353 186.40923 45.30931 curveto
+186.40923 45.04509 186.51419 44.79167 186.70102 44.60484 curveto
+186.88785 44.41801 187.14127 44.31305 187.40549 44.31305 curveto
+187.66971 44.31305 187.92313 44.41801 188.10995 44.60484 curveto
+188.29678 44.79167 188.40175 45.04509 188.40175 45.30931 curveto closepath fill
+newpath 160.81856 113.60522 moveto
+160.81856 113.86945 160.7136 114.12286 160.52676 114.3097 curveto
+160.33994 114.49652 160.08652 114.60149 159.8223 114.60149 curveto
+159.55807 114.60149 159.30466 114.49652 159.11783 114.3097 curveto
+158.931 114.12286 158.82603 113.86945 158.82603 113.60522 curveto
+158.82603 113.341 158.931 113.08759 159.11783 112.90076 curveto
+159.30466 112.71393 159.55807 112.60896 159.8223 112.60896 curveto
+160.08652 112.60896 160.33994 112.71393 160.52676 112.90076 curveto
+160.7136 113.08759 160.81856 113.341 160.81856 113.60522 curveto closepath fill
+-18.92159 -9.0185 moveto
+(O) cmmi10 9.96265 fshow
+-11.04558 -9.0185 moveto
+(bs) cmmi10 9.96265 fshow
+234.75616 22.13716 moveto
+(pro) cmr10 9.96265 fshow
+249.72786 22.13716 moveto
+(jection) cmr10 9.96265 fshow
+282.10646 22.13716 moveto
+(plane) cmr10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2169 a Fk(v)-5 b(ardef)38 b Fg(pr)l(oje)l(ct)p
+547 2169 26 4 v 39 w(p)l(oint)8 b Fj(\()p Fk(expr)29
+b Fe(p;)23 b(m)p Fj(\))28 b(=)166 2269 y Fk(sa)m(v)m(e)h
+Fg(tmp)l(alpha)8 b Fe(;)23 b Fg(v)p 796 2269 V 40 w(a)6
+b Fe(;)24 b Fg(v)p 969 2269 V 39 w(b)6 b Fj(;)166 2369
+y Fg(v)p 218 2369 V 40 w(a)34 b Fj(:=)28 b Fg(new)p 590
+2369 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p 887 2369 V 39
+w(b)33 b Fj(:=)28 b Fg(new)p 1253 2369 V 39 w(ve)l(ct)8
+b Fj(;)166 2468 y Fg(ve)l(ct)p 317 2468 V 38 w(di\013)19
+b Fj(\()p Fg(v)p 563 2468 V 40 w(b)5 b Fe(;)23 b(m;)g
+Fg(Obs)7 b Fj(\);)28 b(\045)g(v)n(ector)e Fg(Obs)7 b
+Fj(-)p Fe(m)332 2568 y Fj(\045)28 b Fg(ve)l(ct)8 b Fj([)p
+Fg(v)p 650 2568 V 39 w(a)f Fj(])28 b(is)f Fg(ve)l(ct)8
+b Fj([)p Fg(v)p 1080 2568 V 40 w(b)d Fj(])28 b(expressed)f(in)g(\()p
+Fg(ObsI)14 b Fj(,)p Fg(ObsJ)d Fj(,)p Fg(ObsK)h Fj(\))332
+2668 y(\045)28 b(co)r(ordinates.)166 2767 y Fg(ve)l(ct)8
+b Fj([)p Fg(v)p 387 2767 V 40 w(a)e Fj(])p Fe(x)29 b
+Fj(:=)e Fg(ve)l(ct)8 b Fj([)p Fg(IObsI)p 1062 2767 V
+43 w Fj(])p Fe(x)19 b Fh(\003)f Fg(ve)l(ct)8 b Fj([)p
+Fg(v)p 1457 2767 V 40 w(b)d Fj(])p Fe(x)184 2867 y Fj(+)19
+b Fg(ve)l(ct)7 b Fj([)p Fg(IObsJ)p 664 2867 V 42 w Fj(])p
+Fe(x)19 b Fh(\003)f Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1060
+2867 V 39 w(b)e Fj(])p Fe(y)21 b Fj(+)d Fg(ve)l(ct)8
+b Fj([)p Fg(IObsK)p 1715 2867 V 42 w Fj(])p Fe(x)19 b
+Fh(\003)f Fg(ve)l(ct)8 b Fj([)p Fg(v)p 2110 2867 V 40
+w(b)d Fj(])p Fe(z)t Fj(;)166 2966 y Fg(ve)l(ct)j Fj([)p
+Fg(v)p 387 2966 V 40 w(a)e Fj(])p Fe(y)31 b Fj(:=)c Fg(ve)l(ct)8
+b Fj([)p Fg(IObsI)p 1058 2966 V 43 w Fj(])p Fe(y)22 b
+Fh(\003)c Fg(ve)l(ct)7 b Fj([)p Fg(v)p 1450 2966 V 40
+w(b)f Fj(])p Fe(x)184 3066 y Fj(+)19 b Fg(ve)l(ct)7 b
+Fj([)p Fg(IObsJ)p 664 3066 V 42 w Fj(])p Fe(y)21 b Fh(\003)d
+Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1056 3066 V 40 w(b)d Fj(])p
+Fe(y)21 b Fj(+)d Fg(ve)l(ct)8 b Fj([)p Fg(IObsK)p 1711
+3066 V 42 w Fj(])p Fe(y)22 b Fh(\003)c Fg(ve)l(ct)7 b
+Fj([)p Fg(v)p 2103 3066 V 40 w(b)e Fj(])p Fe(z)t Fj(;)166
+3166 y Fg(ve)l(ct)j Fj([)p Fg(v)p 387 3166 V 40 w(a)e
+Fj(])p Fe(z)31 b Fj(:=)d Fg(ve)l(ct)7 b Fj([)p Fg(IObsI)p
+1057 3166 V 44 w Fj(])p Fe(z)22 b Fh(\003)c Fg(ve)l(ct)8
+b Fj([)p Fg(v)p 1447 3166 V 39 w(b)e Fj(])p Fe(x)184
+3265 y Fj(+)19 b Fg(ve)l(ct)7 b Fj([)p Fg(IObsJ)p 664
+3265 V 42 w Fj(])p Fe(z)22 b Fh(\003)c Fg(ve)l(ct)7 b
+Fj([)p Fg(v)p 1055 3265 V 40 w(b)f Fj(])p Fe(y)21 b Fj(+)d
+Fg(ve)l(ct)8 b Fj([)p Fg(IObsK)p 1709 3265 V 42 w Fj(])p
+Fe(z)22 b Fh(\003)c Fg(ve)l(ct)7 b Fj([)p Fg(v)p 2100
+3265 V 40 w(b)f Fj(])p Fe(z)t Fj(;)166 3365 y Fk(if)37
+b Fg(ve)l(ct)7 b Fj([)p Fg(v)p 480 3365 V 40 w(a)g Fj(])p
+Fe(x)28 b(<)f Fg(Obs)p 892 3365 V 38 w(dist)8 b Fj(:)28
+b(\045)f(then,)i(p)r(oin)n(t)e Fe(m)h Fj(is)f(to)r(o)h(close)332
+3465 y Fk(message)d Ff("Point)42 b(")18 b Fj(&)g(decimal)k
+Fe(m)d Fj(&)f Ff(")43 b(too)f(close)g(->)h(not)f(drawn")m
+Fj(;)332 3564 y Fe(x)p Fj([)p Fe(p)p Fj(])28 b(:=)f Fg(to)l(o)p
+728 3564 V 36 w(big)p 867 3564 V 39 w Fj(;)51 b Fe(y)s
+Fj([)p Fe(p)p Fj(])27 b(=)g Fg(to)l(o)p 1337 3564 V 36
+w(big)p 1476 3564 V 39 w Fj(;)166 3664 y Fk(else)t Fj(:)332
+3763 y Fk(if)14 b Fj(\(angle)o(\()p Fg(ve)l(ct)8 b Fj([)p
+Fg(v)p 876 3763 V 40 w(a)f Fj(])p Fe(x;)23 b Fg(ve)l(ct)8
+b Fj([)p Fg(v)p 1288 3763 V 40 w(a)f Fj(])p Fe(z)t Fj(\))27
+b Fe(>)g Fg(h)p 1633 3763 V 37 w(\014eld)10 b Fe(=)p
+Fj(2\))517 3863 y(or)17 b(\(angle)o(\()p Fg(ve)l(ct)9
+b Fj([)p Fg(v)p 1084 3863 V 39 w(a)e Fj(])p Fe(x;)24
+b Fg(ve)l(ct)7 b Fj([)p Fg(v)p 1496 3863 V 40 w(a)g Fj(])p
+Fe(y)s Fj(\))28 b Fe(>)f Fg(v)p 1841 3863 V 40 w(\014eld)9
+b Fe(=)p Fj(2\):)498 3963 y Fk(message)26 b Ff("Point)41
+b(")18 b Fj(&)g(decimal)k Fe(m)d Fj(&)f Ff(")43 b(out)f(of)h(screen)e
+(->)i(not)f(drawn")n Fj(;)498 4062 y Fe(x)p Fj([)p Fe(p)p
+Fj(])28 b(:=)f Fg(to)l(o)p 894 4062 V 36 w(big)p 1033
+4062 V 39 w Fj(;)51 b Fe(y)s Fj([)p Fe(p)p Fj(])27 b(=)g
+Fg(to)l(o)p 1503 4062 V 36 w(big)p 1642 4062 V 39 w Fj(;)332
+4162 y Fk(else)t Fj(:)498 4262 y Fg(tmp)l(alpha)36 b
+Fj(:=)27 b Fg(Obs)p 1120 4262 V 37 w(dist)9 b Fe(=)p
+Fg(ve)l(ct)e Fj([)p Fg(v)p 1545 4262 V 40 w(a)f Fj(])p
+Fe(x)p Fj(;)498 4361 y Fe(y)s Fj([)p Fe(p)p Fj(])27 b(:=)h
+Fg(dr)l(awing)p 1065 4361 V 39 w(sc)l(ale)d Fh(\003)18
+b Fg(tmp)l(alpha)27 b Fh(\003)17 b Fg(ve)l(ct)8 b Fj([)p
+Fg(v)p 1977 4361 V 40 w(a)f Fj(])p Fe(y)s Fj(;)498 4461
+y Fe(x)p Fj([)p Fe(p)p Fj(])28 b(:=)f Fg(dr)l(awing)p
+1068 4461 V 39 w(sc)l(ale)f Fh(\003)18 b Fg(tmp)l(alpha)26
+b Fh(\003)18 b Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1980 4461
+V 40 w(a)f Fj(])p Fe(z)t Fj(;)332 4560 y Fk(\014)e Fj(;)166
+4660 y Fk(\014)g Fj(;)166 4760 y Fg(fr)l(e)l(e)p 305
+4760 V 37 w(ve)l(ct)j Fj(\()p Fg(v)p 561 4760 V 40 w(b)d
+Fj(\);)51 b Fg(fr)l(e)l(e)p 875 4760 V 38 w(ve)l(ct)7
+b Fj(\()p Fg(v)p 1132 4760 V 40 w(a)g Fj(\);)0 4859 y
+Fk(enddef)i Fj(;)0 5009 y(\045)28 b(Ob)5 b(ject)27 b(pro)5
+b(jection)0 5108 y(\045)28 b(This)f(is)h(a)f(mere)g(iteration)g(on)h
+Fg(pr)l(oje)l(ct)p 1348 5108 V 39 w(p)l(oint)0 5208 y
+Fk(def)37 b Fg(pr)l(oje)l(ct)p 416 5208 V 39 w(obj)13
+b Fj(\()p Fk(expr)29 b Fg(name)6 b Fj(\))28 b(=)166 5308
+y Fg(de\014ne)p 389 5308 V 37 w(curr)l(ent)p 690 5308
+V 37 w(p)l(oint)p 907 5308 V 39 w(o\013set)p 1139 5308
+V 39 w Fj(\()p Fg(name)6 b Fj(\);)166 5407 y Fk(for)28
+b Fe(i)f Fj(:=)h(1)18 b Fk(upto)g Fg(obj)p 874 5407 V
+44 w(p)l(oints)p 1126 5407 V 37 w Fj(\()p Fg(name)7 b
+Fj(\):)28 b Fg(pr)l(oje)l(ct)p 1721 5407 V 39 w(p)l(oint)9
+b Fj(\()p Fg(ipnt)p 2123 5407 V 38 w Fj(\()p Fe(i)p Fj(\))p
+Fe(;)24 b Fg(pnt)7 b Fj(\()p Fe(i)p Fj(\)\);)47 b Fk(endfor)p
+Fj(;)0 5507 y Fk(enddef)9 b Fj(;)1929 6139 y(7)p eop
+%%Page: 8 8
+8 7 bop 0 83 3900 4 v 0 164 a Fj(Dra)n(w)27 b(one)g(face,)g(hiding)h
+(it)g(if)g(it)g(is)g(hidden)p 0 207 V 0 388 a(\045)g(The)g(order)e(of)h
+(the)h(v)n(ertices)f(determines)g(what)h(is)f(the)h(visible)g(side)0
+487 y(\045)g(of)f(the)h(face.)37 b(The)28 b(order)e(m)n(ust)i(b)r(e)g
+(clo)r(c)n(kwise)e(when)i(the)g(face)f(is)h(seen.)0 587
+y(\045)g Fg(dr)l(awhidden)36 b Fj(is)28 b(a)f(b)r(o)r(olean;)g(if)h
+Fk(true)g Fj(only)f(hidden)h(faces)g(are)e(dra)n(wn;)h(if)h
+Fk(false)o Fj(,)0 687 y(\045)g(only)f(visible)g(faces)h(are)e(dra)n
+(wn.)36 b(Therefore,)27 b Fg(dr)l(aw)p 1743 687 26 4
+v 40 w(fac)l(e)35 b Fj(is)27 b(called)g(t)n(wice)0 786
+y(\045)h(b)n(y)f Fg(dr)l(aw)p 397 786 V 40 w(fac)l(es)8
+b Fj(.)0 886 y Fk(v)-5 b(ardef)38 b Fg(dr)l(aw)p 478
+886 V 40 w(fac)l(e)7 b Fj(\()p Fk(text)29 b Fg(vertic)l(es)7
+b Fj(\)\()p Fk(expr)29 b Fg(c)l(ol)9 b Fe(;)23 b Fg(dr)l(awhidden)9
+b Fj(\))28 b(=)166 986 y Fk(sa)m(v)m(e)h Fe(p;)23 b Fg(num)5
+b Fe(;)23 b Fg(normal)p 935 986 V 40 w(ve)l(ct)8 b Fe(;)23
+b Fg(v)p 1205 986 V 40 w(a)6 b Fe(;)24 b Fg(v)p 1378
+986 V 39 w(b)6 b Fe(;)23 b Fg(v)p 1545 986 V 40 w(c)t
+Fe(;)h Fg(over\015ow)10 b Fj(;)166 1085 y Fk(path)29
+b Fe(p)p Fj(;)50 b Fk(b)s(o)s(olean)26 b Fg(over\015ow)11
+b Fj(;)166 1185 y Fg(over\015ow)38 b Fj(=)27 b Fk(false)p
+Fj(;)166 1284 y Fk(forsu\016xes)g Fj($)g(=)h Fg(vertic)l(es)7
+b Fj(:)332 1384 y Fk(if)37 b Fe(z)t Fj([)p Fg(ipnt)p
+646 1384 V 38 w Fj(\($\)])27 b(=)h(\()p Fg(to)l(o)p 1070
+1384 V 36 w(big)p 1209 1384 V 39 w Fe(;)23 b Fg(to)l(o)p
+1400 1384 V 36 w(big)p 1539 1384 V 39 w Fj(\):)28 b Fg(over\015ow)37
+b Fj(:=)28 b Fk(true)p Fj(;)51 b Fk(\014)5 b Fj(;)332
+1484 y Fk(exitif)36 b Fg(over\015ow)11 b Fj(;)166 1583
+y Fk(endfor)p Fj(;)166 1683 y Fk(if)37 b Fg(over\015ow)10
+b Fj(:)28 b Fk(message)d Ff("Face)41 b(can)i(not)f(be)h(drawn,)e(due)h
+(to)h(overflow")l Fj(;)166 1783 y Fk(else)t Fj(:)332
+1882 y Fe(p)28 b Fj(=)f Fk(forsu\016xes)g Fj($)g(=)g
+Fg(vertic)l(es)8 b Fj(:)27 b Fe(z)t Fj([)p Fg(ipnt)p
+1650 1882 V 38 w Fj(\($\)])h(-)14 b(-)k Fk(endfor)23
+b Fj(cycle;)332 1982 y Fg(num)498 1994 y Fa(0)563 1982
+y Fj(:=)k(0;)50 b Fg(num)959 1994 y Fa(1)1024 1982 y
+Fj(:=)27 b(0;)50 b Fg(num)1420 1994 y Fa(2)1485 1982
+y Fj(:=)27 b(0;)498 2081 y(\045)h(get)f(the)h(three)g(last)f
+(su\016xes:)332 2181 y Fk(forsu\016xes)g Fj($)g(=)h Fg(vertic)l(es)7
+b Fj(:)28 b Fg(num)1433 2193 y Fa(0)1498 2181 y Fj(:=)f
+Fg(num)1779 2193 y Fa(1)1816 2181 y Fj(;)51 b Fg(num)2055
+2193 y Fa(1)2120 2181 y Fj(:=)28 b Fg(num)2401 2193 y
+Fa(2)2438 2181 y Fj(;)51 b Fg(num)2678 2193 y Fa(2)2743
+2181 y Fj(:=)27 b($;)46 b Fk(endfor)p Fj(;)332 2281 y
+Fg(normal)p 601 2281 V 40 w(ve)l(ct)35 b Fj(:=)28 b Fg(new)p
+1070 2281 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(v)p 1367 2281
+V 39 w(a)35 b Fj(:=)27 b Fg(new)p 1738 2281 V 40 w(ve)l(ct)8
+b Fj(;)50 b Fg(v)p 2036 2281 V 40 w(b)33 b Fj(:=)27 b
+Fg(new)p 2401 2281 V 40 w(ve)l(ct)8 b Fj(;)332 2380 y
+Fg(v)p 384 2380 V 40 w(c)32 b Fj(:=)c Fg(new)p 750 2380
+V 39 w(ve)l(ct)8 b Fj(;)332 2480 y Fg(ve)l(ct)p 483 2480
+V 38 w(di\013)19 b Fj(\()p Fg(v)p 729 2480 V 40 w(a)7
+b Fe(;)23 b Fg(pnt)7 b Fj(\()p Fg(num)1172 2492 y Fa(1)1209
+2480 y Fj(\))p Fe(;)24 b Fg(pnt)7 b Fj(\()p Fg(num)1610
+2492 y Fa(0)1647 2480 y Fj(\)\);)332 2580 y Fg(ve)l(ct)p
+483 2580 V 38 w(di\013)19 b Fj(\()p Fg(v)p 729 2580 V
+40 w(b)5 b Fe(;)23 b Fg(pnt)8 b Fj(\()p Fg(num)1167 2592
+y Fa(2)1204 2580 y Fj(\))p Fe(;)23 b Fg(pnt)8 b Fj(\()p
+Fg(num)1605 2592 y Fa(1)1642 2580 y Fj(\)\);)332 2679
+y Fg(ve)l(ct)p 483 2679 V 38 w(pr)l(o)l(d)i Fj(\()p Fg(normal)p
+972 2679 V 40 w(ve)l(ct)e Fe(;)23 b Fg(v)p 1242 2679
+V 39 w(a)7 b Fe(;)23 b Fg(v)p 1415 2679 V 40 w(b)6 b
+Fj(\);)332 2779 y Fg(ve)l(ct)p 483 2779 V 38 w(di\013)19
+b Fj(\()p Fg(v)p 729 2779 V 40 w(c)5 b Fe(;)23 b Fg(pnt)7
+b Fj(\()p Fg(num)1166 2791 y Fa(1)1203 2779 y Fj(\))p
+Fe(;)24 b Fg(Obs)6 b Fj(\);)332 2878 y Fk(if)37 b Fg(\014l)t(le)l(d)p
+608 2878 V 40 w(fac)l(es)7 b Fj(:)498 2978 y Fk(if)37
+b Fg(ve)l(ct)p 742 2978 V 38 w(dpr)l(o)l(d)10 b Fj(\()p
+Fg(normal)p 1273 2978 V 40 w(ve)l(ct)e Fe(;)23 b Fg(v)p
+1543 2978 V 40 w(c)t Fj(\))28 b Fe(<)g Fj(0:)664 3078
+y Fk(\014ll)f Fe(p)c Fk(withcolor)k Fg(c)l(ol)9 b Fj(;)51
+b Fk(if)37 b Fg(dr)l(aw)p 1738 3078 V 40 w(c)l(ontours)6
+b Fj(:)28 b Fg(dr)l(awc)l(ontour)9 b Fj(\()p Fe(p;)24
+b Fg(c)l(ontourwidth)7 b Fj(\);)51 b Fk(\014)5 b Fj(;)498
+3177 y Fk(else)t Fj(:)27 b(\045)h Fk(dra)m(w)i Fe(p)23
+b Fk(dashed)28 b Fg(evenly)8 b Fj(;)28 b(if)g(this)g(is)f(done,)h(y)n
+(ou)f(m)n(ust)g(ensure)1162 3277 y(\045)h(that)g(hidden)g(faces)f(are)g
+(\(re\)dra)n(wn)f(at)i(the)g(end)498 3377 y Fk(\014)5
+b Fj(;)332 3476 y Fk(else)t Fj(:)498 3576 y Fk(if)37
+b Fg(ve)l(ct)p 742 3576 V 38 w(dpr)l(o)l(d)10 b Fj(\()p
+Fg(normal)p 1273 3576 V 40 w(ve)l(ct)e Fe(;)23 b Fg(v)p
+1543 3576 V 40 w(c)t Fj(\))28 b Fe(<)g Fj(0:)f(\045visible)664
+3675 y Fk(if)37 b Fj(not)23 b Fg(dr)l(awhidden)9 b Fj(:)27
+b Fk(dra)m(w)j Fe(p)p Fj(;)51 b Fk(\014)5 b Fj(;)498
+3775 y Fk(else)t Fj(:)27 b(\045)h(hidden)664 3875 y Fk(if)37
+b Fg(dr)l(awhidden)9 b Fj(:)830 3974 y Fk(dra)m(w)30
+b Fe(p)23 b Fk(withcolor)28 b Fg(b)l(ackgr)l(ound)9 b
+Fj(;)28 b(\045)g(a)n(v)n(oid)e(strange)g(o)n(v)n(erlapping)f(dashes)830
+4074 y Fk(dra)m(w)30 b Fe(p)23 b Fk(dashed)28 b Fg(evenly)8
+b Fj(;)664 4174 y Fk(\014)d Fj(;)498 4273 y Fk(\014)g
+Fj(;)332 4373 y Fk(\014)g Fj(;)332 4472 y Fg(fr)l(e)l(e)p
+471 4472 V 37 w(ve)l(ct)j Fj(\()p Fg(v)p 728 4472 V 40
+w(c)d Fj(\);)51 b Fg(fr)l(e)l(e)p 1041 4472 V 37 w(ve)l(ct)8
+b Fj(\()p Fg(v)p 1297 4472 V 40 w(b)d Fj(\);)51 b Fg(fr)l(e)l(e)p
+1611 4472 V 38 w(ve)l(ct)7 b Fj(\()p Fg(v)p 1868 4472
+V 40 w(a)g Fj(\);)51 b Fg(fr)l(e)l(e)p 2187 4472 V 37
+w(ve)l(ct)8 b Fj(\()p Fg(normal)p 2660 4472 V 40 w(ve)l(ct)g
+Fj(\);)166 4572 y Fk(\014)d Fj(;)0 4672 y Fk(enddef)k
+Fj(;)0 4821 y(\045)28 b Fe(p)f Fj(is)h(the)g(path)f(to)h(dra)n(w)e(\(a)
+i(face)f(con)n(tour\))g(and)g Fg(thickness)35 b Fj(is)28
+b(the)g(p)r(en)g(width)0 4921 y Fk(def)37 b Fg(dr)l(awc)l(ontour)9
+b Fj(\()p Fk(expr)29 b Fe(p;)23 b Fg(thickness)7 b Fj(\))28
+b(=)166 5020 y Fk(pic)m(kup)h(p)s(encircle)18 b Fj(scaled)f
+Fg(thickness)8 b Fj(;)166 5120 y Fk(dra)m(w)30 b Fe(p)p
+Fj(;)166 5220 y Fk(pic)m(kup)f(p)s(encircle)18 b Fj(scaled)f
+Fe(:)p Fj(4)p Fg(pt)8 b Fj(;)0 5319 y Fk(enddef)h Fj(;)1929
+6139 y(8)p eop
+%%Page: 9 9
+9 8 bop 0 83 a Fj(\045)28 b(V)-7 b(ariables)26 b(for)h(face)h
+(handling.)36 b(First,)28 b(w)n(e)f(ha)n(v)n(e)g(an)g(arra)n(y)e(for)i
+(lists)h(of)f(v)n(ertices)0 183 y(\045)h(corresp)r(onding)e(to)h
+(faces.)0 282 y Fk(string)i Fg(fac)l(e)p 421 282 26 4
+v 37 w(p)l(oints)p 673 282 V 38 w Fj([];)f(\045)g(analogous)d(to)j
+Fg(ve)l(ct)35 b Fj(arra)n(ys)0 432 y(\045)28 b(Then,)g(w)n(e)f(ha)n(v)n
+(e)f(an)i(arra)n(y)d(of)i(colors.)36 b(A)28 b(color)e(needs)h(to)h(b)r
+(e)g(a)f(string)0 531 y(\045)h(represen)n(ting)e(an)h(hexadecimal)g(R)n
+(GB)g(co)r(ding)h(of)f(a)g(color.)0 631 y Fk(string)i
+Fg(fac)l(e)p 421 631 V 37 w(c)l(olor)p 636 631 V 41 w
+Fj([];)0 780 y(\045)f Fg(name)34 b Fj(is)27 b(the)h(name)g(of)f(an)h
+(ob)5 b(ject)27 b(instance)0 880 y Fk(v)-5 b(ardef)38
+b Fg(dr)l(aw)p 478 880 V 40 w(fac)l(es)8 b Fj(\()p Fk(expr)28
+b Fg(name)7 b Fj(\))28 b(=)166 980 y Fk(sa)m(v)m(e)h
+Fg(tmp)l(def)18 b Fj(;)51 b Fk(string)29 b Fg(tmp)l(def)18
+b Fj(;)166 1079 y Fg(de\014ne)p 389 1079 V 37 w(curr)l(ent)p
+690 1079 V 37 w(fac)l(e)p 864 1079 V 38 w(o\013set)p
+1097 1079 V 39 w Fj(\()p Fg(name)6 b Fj(\);)332 1179
+y(\045)28 b(\014rst)f(the)h(hidden)g(faces)g(\(dashes)f(m)n(ust)g(b)r
+(e)h(dra)n(wn)f(\014rst\):)166 1279 y Fk(for)h Fe(i)f
+Fj(:=)h(1)18 b Fk(upto)g Fg(obj)p 874 1279 V 44 w(fac)l(es)p
+1085 1279 V 38 w Fj(\()p Fg(name)7 b Fj(\):)332 1378
+y Fg(tmp)l(def)46 b Fj(:=)27 b Ff("draw_face\(")14 b
+Fj(&)k Fg(fac)l(e)p 1507 1378 V 38 w(p)l(oints)p 1760
+1378 V 37 w Fj([)p Fg(fac)l(e)8 b Fj(\()p Fe(i)p Fj(\)])517
+1478 y(&)18 b Ff("\)\(hexcolor\(")13 b Fj(&)18 b Fg(ditto)24
+b Fj(&)18 b Fg(fac)l(e)p 1690 1478 V 38 w(c)l(olor)p
+1906 1478 V 40 w Fj([)p Fg(fac)l(e)8 b Fj(\()p Fe(i)p
+Fj(\)])18 b(&)g Fg(ditto)517 1577 y Fj(&)g Ff("\),true\)")l
+Fj(;)51 b Fk(scan)m(tok)m(ens)28 b Fg(tmp)l(def)19 b
+Fj(;)166 1677 y Fk(endfor)p Fj(;)332 1777 y(\045)28 b(then,)g(the)g
+(visible)g(faces:)166 1876 y Fk(for)g Fe(i)f Fj(:=)h(1)18
+b Fk(upto)g Fg(obj)p 874 1876 V 44 w(fac)l(es)p 1085
+1876 V 38 w Fj(\()p Fg(name)7 b Fj(\):)332 1976 y Fg(tmp)l(def)46
+b Fj(:=)27 b Ff("draw_face\(")14 b Fj(&)k Fg(fac)l(e)p
+1507 1976 V 38 w(p)l(oints)p 1760 1976 V 37 w Fj([)p
+Fg(fac)l(e)8 b Fj(\()p Fe(i)p Fj(\)])517 2076 y(&)18
+b Ff("\)\(hexcolor\(")13 b Fj(&)18 b Fg(ditto)24 b Fj(&)18
+b Fg(fac)l(e)p 1690 2076 V 38 w(c)l(olor)p 1906 2076
+V 40 w Fj([)p Fg(fac)l(e)8 b Fj(\()p Fe(i)p Fj(\)])18
+b(&)g Fg(ditto)517 2175 y Fj(&)g Ff("\),false\)")-5 b
+Fj(;)51 b Fk(scan)m(tok)m(ens)29 b Fg(tmp)l(def)18 b
+Fj(;)166 2275 y Fk(endfor)p Fj(;)0 2374 y Fk(enddef)9
+b Fj(;)0 2524 y(\045)28 b(Dra)n(w)f(p)r(oin)n(t)g Fe(n)h
+Fj(of)f(ob)5 b(ject)28 b(instance)f Fg(name)0 2623 y
+Fk(v)-5 b(ardef)38 b Fg(dr)l(aw)p 478 2623 V 40 w(p)l(oint)8
+b Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)23 b(n)p Fj(\))28
+b(=)166 2723 y Fg(de\014ne)p 389 2723 V 37 w(curr)l(ent)p
+690 2723 V 37 w(p)l(oint)p 907 2723 V 39 w(o\013set)p
+1139 2723 V 39 w Fj(\()p Fg(name)6 b Fj(\);)166 2823
+y Fg(pr)l(oje)l(ct)p 419 2823 V 39 w(p)l(oint)i Fj(\()p
+Fg(ipnt)p 820 2823 V 39 w Fj(\()p Fe(n)p Fj(\))p Fe(;)24
+b Fg(pnt)7 b Fj(\()p Fe(n)p Fj(\)\);)166 2922 y Fk(if)37
+b Fe(z)t Fj([)p Fg(ipnt)p 480 2922 V 38 w Fj(\()p Fe(n)p
+Fj(\)])28 b Fh(6)p Fj(=)f(\()p Fg(to)l(o)p 912 2922 V
+36 w(big)p 1051 2922 V 39 w Fe(;)c Fg(to)l(o)p 1242 2922
+V 36 w(big)p 1381 2922 V 39 w Fj(\):)332 3022 y Fk(pic)m(kup)29
+b(p)s(encircle)18 b Fj(scaled)f(5)p Fg(pt)8 b Fj(;)332
+3122 y Fk(dra)m(wdot)e Fj(\()p Fe(z)t Fj([)p Fg(ipnt)p
+933 3122 V 38 w Fj(\()p Fe(n)p Fj(\)]\);)332 3221 y Fk(pic)m(kup)29
+b(p)s(encircle)18 b Fj(scaled)f Fe(:)p Fj(4)p Fg(pt)8
+b Fj(;)166 3321 y Fk(\014)d Fj(;)0 3421 y Fk(enddef)k
+Fj(;)0 3570 y Fk(v)-5 b(ardef)38 b Fg(dr)l(aw)p 478 3570
+V 40 w(axes)7 b Fj(\()p Fk(expr)28 b Fe(r)n(;)c(g)s(;)e(b)p
+Fj(\))28 b(=)166 3670 y Fg(pr)l(oje)l(ct)p 419 3670 V
+39 w(p)l(oint)8 b Fj(\(1)p Fe(;)23 b Fg(ve)l(ct)p 904
+3670 V 39 w(nul)t(l)8 b Fj(\);)166 3769 y Fg(pr)l(oje)l(ct)p
+419 3769 V 39 w(p)l(oint)g Fj(\(2)p Fe(;)23 b Fg(ve)l(ct)p
+904 3769 V 39 w(I)13 b Fj(\);)166 3869 y Fg(pr)l(oje)l(ct)p
+419 3869 V 39 w(p)l(oint)8 b Fj(\(3)p Fe(;)23 b Fg(ve)l(ct)p
+904 3869 V 39 w(J)11 b Fj(\);)166 3968 y Fg(pr)l(oje)l(ct)p
+419 3968 V 39 w(p)l(oint)d Fj(\(4)p Fe(;)23 b Fg(ve)l(ct)p
+904 3968 V 39 w(K)12 b Fj(\);)166 4068 y Fk(if)i Fj(\()p
+Fe(z)307 4080 y Fa(1)371 4068 y Fh(6)p Fj(=)28 b(\()p
+Fg(to)l(o)p 614 4068 V 36 w(big)p 753 4068 V 39 w Fe(;)23
+b Fg(to)l(o)p 944 4068 V 36 w(big)p 1083 4068 V 38 w
+Fj(\)\):)332 4168 y Fk(if)14 b Fj(\()p Fe(z)473 4180
+y Fa(2)537 4168 y Fh(6)p Fj(=)28 b(\()p Fg(to)l(o)p 780
+4168 V 36 w(big)p 919 4168 V 39 w Fe(;)23 b Fg(to)l(o)p
+1110 4168 V 36 w(big)p 1249 4168 V 39 w Fj(\)\):)498
+4267 y Fk(dra)m(w)m(arro)m(w)32 b Fe(z)1008 4279 y Fa(1)1072
+4267 y Fj(-)14 b(-)23 b Fe(z)1204 4279 y Fa(2)1264 4267
+y Fk(dashed)28 b Fg(evenly)j Fk(withcolor)c Fe(r)r Fj(;)332
+4367 y Fk(\014)5 b Fj(;)332 4467 y Fk(if)14 b Fj(\()p
+Fe(z)473 4479 y Fa(3)537 4467 y Fh(6)p Fj(=)28 b(\()p
+Fg(to)l(o)p 780 4467 V 36 w(big)p 919 4467 V 39 w Fe(;)23
+b Fg(to)l(o)p 1110 4467 V 36 w(big)p 1249 4467 V 39 w
+Fj(\)\):)498 4566 y Fk(dra)m(w)m(arro)m(w)32 b Fe(z)1008
+4578 y Fa(1)1072 4566 y Fj(-)14 b(-)23 b Fe(z)1204 4578
+y Fa(3)1264 4566 y Fk(dashed)28 b Fg(evenly)j Fk(withcolor)c
+Fe(g)s Fj(;)332 4666 y Fk(\014)5 b Fj(;)332 4765 y Fk(if)14
+b Fj(\()p Fe(z)473 4777 y Fa(4)537 4765 y Fh(6)p Fj(=)28
+b(\()p Fg(to)l(o)p 780 4765 V 36 w(big)p 919 4765 V 39
+w Fe(;)23 b Fg(to)l(o)p 1110 4765 V 36 w(big)p 1249 4765
+V 39 w Fj(\)\):)498 4865 y Fk(dra)m(w)m(arro)m(w)32 b
+Fe(z)1008 4877 y Fa(1)1072 4865 y Fj(-)14 b(-)23 b Fe(z)1204
+4877 y Fa(4)1264 4865 y Fk(dashed)28 b Fg(evenly)j Fk(withcolor)c
+Fe(b)p Fj(;)332 4965 y Fk(\014)5 b Fj(;)166 5064 y Fk(\014)g
+Fj(;)0 5164 y Fk(enddef)k Fj(;)1929 6139 y(9)p eop
+%%Page: 10 10
+10 9 bop 0 83 a Fj(\045)28 b(De\014nition)g(of)g(a)f(macro)f
+Fg(obj)p 1019 83 26 4 v 44 w(name)34 b Fj(returning)27
+b(an)g(ob)5 b(ject)27 b(name)0 183 y(\045)h(when)g(giv)n(en)e(an)i
+(absolute)0 282 y(\045)g(face)f(n)n(um)n(b)r(er.)37 b(This)27
+b(de\014nition)h(is)g(built)g(incremen)n(tally)f(through)g(a)g(string,)
+0 382 y(\045)h(ev)n(erytime)f(a)g(new)g(ob)5 b(ject)28
+b(is)f(de\014ned.)0 482 y(\045)h Fg(obj)p 220 482 V 44
+w(name)34 b Fj(is)27 b(de\014ned)h(b)n(y)f Fg(r)l(e)l(de\014ne)p
+1247 482 V 37 w(obj)p 1396 482 V 44 w(name)p 1628 482
+V 37 w Fj(.)0 631 y(\045)h(Initial)g(de\014nition)0 731
+y Fk(string)h Fg(index)p 477 731 V 40 w(to)p 582 731
+V 36 w(name)p 814 731 V 37 w Fj(;)0 830 y Fg(index)p
+206 830 V 41 w(to)p 312 830 V 36 w(name)p 544 830 V 64
+w Fj(=)f Ff("def)41 b(obj_name\(expr)e(i\)=if)i(i<1:")n
+Fj(;)0 980 y(\045)28 b Fg(name)34 b Fj(is)27 b(the)h(name)g(of)f(an)h
+(ob)5 b(ject)27 b(instance)0 1079 y(\045)h Fe(n)f Fj(is)h(the)g
+(absolute)f(index)g(of)h(its)g(last)f(face)0 1179 y Fk(def)37
+b Fg(r)l(e)l(de\014ne)p 451 1179 V 37 w(obj)p 600 1179
+V 43 w(name)p 831 1179 V 37 w Fj(\()p Fk(expr)29 b Fg(name)6
+b Fe(;)23 b(n)p Fj(\))28 b(=)166 1279 y Fg(index)p 372
+1279 V 41 w(to)p 478 1279 V 36 w(name)p 710 1279 V 64
+w Fj(:=)g Fg(index)p 1085 1279 V 40 w(to)p 1190 1279
+V 36 w(name)p 1422 1279 V 56 w Fj(&)18 b Ff("elseif)40
+b(i<=")17 b Fj(&)h(decimal)23 b Fe(n)18 b Fj(&)g Ff(":")g
+Fj(&)g Fg(ditto)517 1378 y Fj(&)g Fg(name)24 b Fj(&)19
+b Fg(ditto)5 b Fj(;)166 1478 y Fk(scan)m(tok)m(ens)29
+b(b)s(egingroup)d Fg(index)p 1340 1478 V 41 w(to)p 1445
+1478 V 36 w(name)p 1677 1478 V 55 w Fj(&)18 b Ff("fi;enddef;")g
+Fk(endgroup)p Fj(;)0 1577 y Fk(enddef)9 b Fj(;)0 1727
+y(\045)28 b Fe(i)f Fj(is)h(an)f(absolute)g(face)g(n)n(um)n(b)r(er)0
+1826 y(\045)h Fg(vertic)l(es)35 b Fj(is)27 b(a)h(string)e(represen)n
+(ting)h(a)g(list)h(of)f(v)n(ertices)0 1926 y(\045)h Fg(r)l(gb)l(c)l
+(olor)37 b Fj(is)28 b(a)f(string)g(represen)n(ting)f(a)h(color)f(in)i
+(rgb)f(hexadecimal)0 2026 y Fk(def)37 b Fg(set)p 276
+2026 V 38 w(fac)l(e)7 b Fj(\()p Fk(expr)29 b Fe(i;)23
+b Fg(vertic)l(es)7 b Fe(;)23 b Fg(r)l(gb)l(c)l(olor)10
+b Fj(\))28 b(=)166 2125 y Fg(fac)l(e)p 316 2125 V 38
+w(p)l(oints)p 569 2125 V 38 w Fj([)p Fe(i)p Fj(])f(:=)g
+Fg(vertic)l(es)8 b Fj(;)50 b Fg(fac)l(e)p 1313 2125 V
+38 w(c)l(olor)p 1529 2125 V 41 w Fj([)p Fe(i)p Fj(])27
+b(:=)g Fg(r)l(gb)l(c)l(olor)10 b Fj(;)0 2225 y Fk(enddef)f
+Fj(;)0 2374 y(\045)28 b Fe(i)f Fj(is)h(a)f(lo)r(cal)g(face)g(n)n(um)n
+(b)r(er)0 2474 y(\045)p Fg(vertic)l(es)35 b Fj(is)28
+b(a)f(string)g(represen)n(ting)f(a)h(list)h(of)f(v)n(ertices)0
+2574 y(\045)p Fg(r)l(gb)l(c)l(olor)38 b Fj(is)27 b(a)g(string)g
+(represen)n(ting)f(a)i(color)e(in)i(rgb)e(hexadecimal)0
+2673 y Fk(def)37 b Fg(set)p 276 2673 V 38 w(obj)p 424
+2673 V 44 w(fac)l(e)7 b Fj(\()p Fk(expr)29 b Fe(i;)22
+b Fg(vertic)l(es)8 b Fe(;)23 b Fg(r)l(gb)l(c)l(olor)10
+b Fj(\))28 b(=)f Fg(set)p 1793 2673 V 38 w(fac)l(e)7
+b Fj(\()p Fg(fac)l(e)h Fj(\()p Fe(i)p Fj(\))p Fe(;)23
+b Fg(vertic)l(es)7 b Fe(;)24 b Fg(r)l(gb)l(c)l(olor)9
+b Fj(\))0 2773 y Fk(enddef)g Fj(;)1908 6139 y(10)p eop
+%%Page: 11 11
+11 10 bop 0 83 3900 4 v 0 164 a Fj(Compute)28 b(the)g(v)n(ectors)e
+(corresp)r(onding)f(to)j(the)g(observ)n(er's)d(viewp)r(oin)n(t)p
+0 207 V 0 388 a(\045)j(\(v)n(ectors)e Fg(ObsI)p 597 388
+26 4 v 44 w Fj(,)p Fg(ObsJ)p 842 388 V 69 w Fj(and)h
+Fg(ObsK)p 1273 388 V 70 w Fj(in)h(the)g Fg(ve)l(ct)p
+1717 388 V 38 w(I)14 b Fj(,)p Fg(ve)l(ct)p 1962 388 V
+38 w(J)d Fj(,)0 487 y(\045)28 b Fg(ve)l(ct)p 248 487
+V 38 w(K)40 b Fj(reference;)27 b(and)g(v)n(ectors)f Fg(IObsI)p
+1410 487 V 43 w Fj(,)p Fg(IObsJ)p 1687 487 V 70 w Fj(and)h
+Fg(IObsK)p 2150 487 V 0 587 a Fj(\045)h(whic)n(h)f(are)g
+Fg(ve)l(ct)p 624 587 V 38 w(I)13 b Fj(,)p Fg(ve)l(ct)p
+868 587 V 39 w(J)e Fj(,)p Fg(ve)l(ct)p 1123 587 V 38
+w(K)0 687 y Fj(\045)28 b(in)g(the)g Fg(ObsI)p 523 687
+V 43 w Fj(,)p Fg(ObsJ)p 767 687 V 42 w Fj(,)p Fg(ObsK)p
+1033 687 V 70 w Fj(reference\))983 2149 y @beginspecial
+-110 @llx -56 @lly 122 @urx 116 @ury 2320 @rwi @setspecial
+%%BeginDocument: vect-fig.16
+%*Font: cmmi10 9.96265 9.96265 12:800a000000000004000080005f8
+%*Font: cmmi7 6.97385 6.97385 78:e
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+-106.54832 -38.78087 lineto stroke
+newpath -103.08418 -36.78084 moveto
+-106.54832 -38.78087 lineto
+-102.60905 -38.08626 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+82.14182 -22.00984 lineto stroke
+newpath 78.15659 -21.66115 moveto
+82.14182 -22.00984 lineto
+78.51617 -20.31917 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+80.17596 80.17596 lineto stroke
+newpath 77.88162 76.89932 moveto
+80.17596 80.17596 lineto
+76.89932 77.88162 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-80.17596 80.17596 lineto stroke
+newpath -76.89932 77.88162 moveto
+-80.17596 80.17596 lineto
+-77.88162 76.89932 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+83.46436 -48.18889 lineto stroke
+ [] 0 setdash
+newpath 79.70563 -46.82079 moveto
+83.46436 -48.18889 lineto
+80.4002 -45.61775 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+106.54832 38.78087 lineto stroke
+ [] 0 setdash
+newpath 103.08418 36.78084 moveto
+106.54832 38.78087 lineto
+102.60905 38.08626 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+-29.34647 109.52243 lineto stroke
+ [] 0 setdash
+newpath -27.65599 105.89716 moveto
+-29.34647 109.52243 lineto
+-28.99785 105.53763 lineto
+ closepath
+gsave fill grestore stroke
+-109.39528 -46.07037 moveto
+(x) cmmi10 9.96265 fshow
+80.61275 -55.4784 moveto
+(u) cmmi10 9.96265 fshow
+71.22307 -31.92834 moveto
+(O) cmmi10 9.96265 fshow
+79.09908 -31.92834 moveto
+(bs) cmmi10 9.96265 fshow
+88.04466 -33.42274 moveto
+(x) cmmi7 6.97385 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+83.17596 78.1419 moveto
+(O) cmmi10 9.96265 fshow
+91.05197 78.1419 moveto
+(bs) cmmi10 9.96265 fshow
+99.99756 76.6475 moveto
+(y) cmmi7 6.97385 fshow
+-8.0713 111.24104 moveto
+(z) cmmi10 9.96265 fshow
+-104.58806 77.4639 moveto
+(O) cmmi10 9.96265 fshow
+-96.71205 77.4639 moveto
+(bs) cmmi10 9.96265 fshow
+-87.76646 75.9695 moveto
+(z) cmmi7 6.97385 fshow
+109.54832 36.63611 moveto
+(v) cmmi10 9.96265 fshow
+-39.74696 107.37767 moveto
+(w) cmmi10 9.96265 fshow
+newpath -21.30934 -7.75606 moveto
+-9.00943 -12.23291 4.40096 -14.11148 16.69261 -9.63763 curveto stroke
+newpath 13.13445 -11.46506 moveto
+14.3417 -10.9175 15.52881 -10.30956 16.69261 -9.63763 curveto
+15.36917 -9.87099 14.04575 -10.03627 12.72401 -10.13791 curveto
+ closepath
+gsave fill grestore stroke
+newpath 41.73218 -24.09445 moveto
+42.8361 -19.97456 43.169 -15.68611 42.7141 -11.4452 curveto stroke
+newpath 43.60097 -15.34569 moveto
+43.38118 -14.0319 43.08534 -12.72954 42.7141 -11.4452 curveto
+42.6237 -12.77907 42.45625 -14.10408 42.21346 -15.4138 curveto
+ closepath
+gsave fill grestore stroke
+newpath 21.30934 7.75606 moveto
+20.17679 10.86769 18.3764 13.69347 16.03494 16.03494 curveto stroke
+newpath 19.09639 13.46066 moveto
+18.1564 14.40456 17.1324 15.26648 16.03494 16.03494 curveto
+16.80339 14.93747 17.47086 13.7773 18.03133 12.56885 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 34.01608 moveto
+-2.97272 34.01608 -5.93262 33.62646 -8.80403 32.85707 curveto stroke
+newpath -5.08572 34.33142 moveto
+-6.35167 33.91377 -7.5933 33.42163 -8.80403 32.85707 curveto
+-7.47322 32.97351 -6.13814 33.0113 -4.8057 32.9708 curveto
+ closepath
+gsave fill grestore stroke
+-8.34605 47.58096 moveto
+(\022) cmmi10 9.96265 fshow
+-8.04022 -27.3122 moveto
+( ) cmmi10 9.96265 fshow
+52.68236 -24.51909 moveto
+(\022) cmmi10 9.96265 fshow
+30.10892 21.88089 moveto
+(\036) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2249 a(\(here,)f Fe( )k(>)c Fj(0,)h Fe(\022)i(<)d
+Fj(0)g(and)h Fe(\036)g(>)f Fj(0;)g(moreo)n(v)n(er,)e
+Fh(j)p Fe(\022)r Fh(j)j(\024)f Fj(90)1830 2219 y Fd(\016)1868
+2249 y Fj(\))0 2398 y Fk(def)37 b Fg(c)l(ompute)p 471
+2398 V 37 w(r)l(efer)l(enc)l(e)6 b Fj(\()p Fk(expr)29
+b Fg(psi)9 b Fe(;)23 b Fg(theta)7 b Fe(;)23 b Fg(phi)10
+b Fj(\))28 b(=)249 2498 y(\045)g Fg(ObsI)p 532 2498 V
+71 w Fj(de\014nes)g(the)g(direction)f(of)g(observ)-5
+b(ation;)249 2597 y(\045)28 b Fg(ObsJ)p 542 2597 V 69
+w Fj(and)g Fg(ObsK)p 973 2597 V 70 w Fj(the)f(orien)n(tation)249
+2697 y(\045)h(\(but)g(one)g(of)f(these)h(t)n(w)n(o)f(v)n(ectors)f(is)h
+(enough,)249 2797 y(\045)h(since)f Fg(ObsK)p 766 2797
+V 70 w Fj(=)g Fg(ObsI)p 1097 2797 V 72 w Fh(^)h Fg(ObsJ)p
+1430 2797 V 41 w Fj(\))249 2896 y(\045)g(The)g(v)n(ectors)e(are)g
+(found)i(b)n(y)f(rotations)g(of)g Fg(ve)l(ct)p 1882 2896
+V 39 w(I)13 b Fj(,)p Fg(ve)l(ct)p 2127 2896 V 38 w(J)e
+Fj(,)p Fg(ve)l(ct)p 2381 2896 V 39 w(K)h Fj(.)166 2996
+y Fg(ve)l(ct)p 317 2996 V 38 w(def)p 471 2996 V 50 w(ve)l(ct)7
+b Fj(\()p Fg(ObsI)p 861 2996 V 44 w Fe(;)23 b Fg(ve)l(ct)p
+1083 2996 V 39 w(I)13 b Fj(\);)51 b Fg(ve)l(ct)p 1411
+2996 V 38 w(def)p 1565 2996 V 49 w(ve)l(ct)8 b Fj(\()p
+Fg(ObsJ)p 1965 2996 V 42 w Fe(;)23 b Fg(ve)l(ct)p 2187
+2996 V 38 w(J)12 b Fj(\);)166 3095 y Fg(ve)l(ct)p 317
+3095 V 38 w(def)p 471 3095 V 50 w(ve)l(ct)7 b Fj(\()p
+Fg(ObsK)p 891 3095 V 43 w Fe(;)23 b Fg(ve)l(ct)p 1114
+3095 V 38 w(K)12 b Fj(\);)166 3195 y Fg(ve)l(ct)p 317
+3195 V 38 w(r)l(otate)7 b Fj(\()p Fg(ObsI)p 776 3195
+V 43 w Fe(;)23 b Fg(ObsK)p 1064 3195 V 43 w Fe(;)g Fg(psi)9
+b Fj(\);)166 3295 y Fg(ve)l(ct)p 317 3295 V 38 w(r)l(otate)e
+Fj(\()p Fg(ObsJ)p 786 3295 V 41 w Fe(;)24 b Fg(ObsK)p
+1074 3295 V 42 w Fe(;)f Fg(psi)9 b Fj(\);)28 b(\045)g(giv)n(es)f(\()p
+Fe(u)p Fj(,)p Fe(v)s Fj(,)p Fe(z)t Fj(\))166 3394 y Fg(ve)l(ct)p
+317 3394 V 38 w(r)l(otate)7 b Fj(\()p Fg(ObsI)p 776 3394
+V 43 w Fe(;)23 b Fg(ObsJ)p 1044 3394 V 42 w Fe(;)g Fg(theta)7
+b Fj(\);)166 3494 y Fg(ve)l(ct)p 317 3494 V 38 w(r)l(otate)g
+Fj(\()p Fg(ObsK)p 807 3494 V 42 w Fe(;)23 b Fg(ObsJ)p
+1074 3494 V 42 w Fe(;)g Fg(theta)7 b Fj(\);)28 b(\045)f(giv)n(es)g(\()p
+Fe(O)r(bs)1886 3506 y Fb(x)1928 3494 y Fj(,)p Fe(v)s
+Fj(,)p Fe(w)r Fj(\))166 3594 y Fg(ve)l(ct)p 317 3594
+V 38 w(r)l(otate)7 b Fj(\()p Fg(ObsJ)p 786 3594 V 41
+w Fe(;)24 b Fg(ObsI)p 1044 3594 V 43 w Fe(;)f Fg(phi)10
+b Fj(\);)166 3693 y Fg(ve)l(ct)p 317 3693 V 38 w(r)l(otate)d
+Fj(\()p Fg(ObsK)p 807 3693 V 42 w Fe(;)23 b Fg(ObsI)p
+1064 3693 V 44 w Fe(;)g Fg(phi)10 b Fj(\);)28 b(\045)g(giv)n(es)e(\()p
+Fe(O)r(bs)1810 3705 y Fb(x)1852 3693 y Fj(,)p Fe(O)r(bs)2015
+3705 y Fb(y)2055 3693 y Fj(,)p Fe(O)r(bs)2218 3705 y
+Fb(z)2257 3693 y Fj(\))249 3793 y(\045)i(The)g(passage)d(matrix)i
+Fe(P)40 b Fj(from)27 b Fg(ve)l(ct)p 1527 3793 V 38 w(I)14
+b Fj(,)p Fg(ve)l(ct)p 1772 3793 V 38 w(J)d Fj(,)p Fg(ve)l(ct)p
+2026 3793 V 39 w(K)249 3892 y Fj(\045)28 b(to)f Fg(ObsI)p
+633 3892 V 44 w Fj(,)p Fg(ObsJ)p 878 3892 V 41 w Fj(,)p
+Fg(ObsK)p 1143 3892 V 70 w Fj(is)h(the)g(matrix)249 3992
+y(\045)g(comp)r(osed)f(of)g(the)h(v)n(ectors)e Fg(ObsI)p
+1432 3992 V 44 w Fj(,)p Fg(ObsJ)p 1677 3992 V 69 w Fj(and)i
+Fg(ObsK)p 2108 3992 V 70 w Fj(expressed)249 4092 y(\045)g(in)g(the)g
+(base)f Fg(ve)l(ct)p 922 4092 V 38 w(I)13 b Fj(,)p Fg(ve)l(ct)p
+1166 4092 V 39 w(J)e Fj(,)p Fg(ve)l(ct)p 1421 4092 V
+38 w(K)h Fj(.)249 4191 y(\045)28 b(W)-7 b(e)28 b(ha)n(v)n(e)e
+Fe(X)34 b Fj(=)28 b Fe(P)12 b(X)1017 4161 y Fd(0)1067
+4191 y Fj(where)27 b Fe(X)34 b Fj(are)26 b(the)i(co)r(ordinates)e(of)i
+(a)f(p)r(oin)n(t)249 4291 y(\045)h(in)g Fg(ve)l(ct)p
+594 4291 V 38 w(I)13 b Fj(,)p Fg(ve)l(ct)p 838 4291 V
+39 w(J)e Fj(,)p Fg(ve)l(ct)p 1093 4291 V 38 w(K)249 4391
+y Fj(\045)28 b(and)f Fe(X)583 4360 y Fd(0)634 4391 y
+Fj(the)h(co)r(ordinates)e(of)h(the)h(same)f(p)r(oin)n(t)h(in)g
+Fg(ObsI)p 2163 4391 V 43 w Fj(,)p Fg(ObsJ)p 2408 4391
+V 42 w Fj(,)p Fg(ObsK)p 2673 4391 V 42 w Fj(.)249 4490
+y(\045)g(In)g(order)e(to)h(get)h Fe(P)972 4460 y Fd(\000)p
+Fa(1)1061 4490 y Fj(,)f(it)i(su\016ces)e(to)g(build)h(v)n(ectors)e
+(using)249 4590 y(\045)i(the)g(previous)e(rotations)h(in)g(the)h(in)n
+(v)n(erse)f(order.)166 4689 y Fg(ve)l(ct)p 317 4689 V
+38 w(def)p 471 4689 V 50 w(ve)l(ct)7 b Fj(\()p Fg(IObsI)p
+893 4689 V 44 w Fe(;)23 b Fg(ve)l(ct)p 1115 4689 V 39
+w(I)13 b Fj(\);)51 b Fg(ve)l(ct)p 1443 4689 V 38 w(def)p
+1597 4689 V 49 w(ve)l(ct)8 b Fj(\()p Fg(IObsJ)p 2029
+4689 V 42 w Fe(;)23 b Fg(ve)l(ct)p 2251 4689 V 39 w(J)11
+b Fj(\);)166 4789 y Fg(ve)l(ct)p 317 4789 V 38 w(def)p
+471 4789 V 50 w(ve)l(ct)c Fj(\()p Fg(IObsK)p 923 4789
+V 43 w Fe(;)23 b Fg(ve)l(ct)p 1146 4789 V 38 w(K)12 b
+Fj(\);)166 4889 y Fg(ve)l(ct)p 317 4889 V 38 w(r)l(otate)7
+b Fj(\()p Fg(IObsK)p 839 4889 V 42 w Fe(;)23 b Fg(IObsI)p
+1128 4889 V 44 w Fe(;)g Fh(\000)p Fg(phi)9 b Fj(\);)51
+b Fg(ve)l(ct)p 1640 4889 V 39 w(r)l(otate)6 b Fj(\()p
+Fg(IObsJ)p 2141 4889 V 42 w Fe(;)23 b Fg(IObsI)p 2431
+4889 V 43 w Fe(;)g Fh(\000)p Fg(phi)10 b Fj(\);)166 4988
+y Fg(ve)l(ct)p 317 4988 V 38 w(r)l(otate)d Fj(\()p Fg(IObsK)p
+839 4988 V 42 w Fe(;)23 b Fg(IObsJ)p 1138 4988 V 42 w
+Fe(;)g Fh(\000)p Fg(theta)6 b Fj(\);)51 b Fg(ve)l(ct)p
+1716 4988 V 39 w(r)l(otate)6 b Fj(\()p Fg(IObsI)p 2207
+4988 V 44 w Fe(;)23 b Fg(IObsJ)p 2507 4988 V 41 w Fe(;)g
+Fh(\000)p Fg(theta)7 b Fj(\);)166 5088 y Fg(ve)l(ct)p
+317 5088 V 38 w(r)l(otate)g Fj(\()p Fg(IObsJ)p 818 5088
+V 41 w Fe(;)24 b Fg(IObsK)p 1138 5088 V 42 w Fe(;)f Fh(\000)p
+Fg(psi)9 b Fj(\);)51 b Fg(ve)l(ct)p 1642 5088 V 38 w(r)l(otate)6
+b Fj(\()p Fg(IObsI)p 2133 5088 V 44 w Fe(;)23 b Fg(IObsK)p
+2453 5088 V 43 w Fe(;)g Fh(\000)p Fg(psi)9 b Fj(\);)0
+5188 y Fk(enddef)g Fj(;)1908 6139 y(11)p eop
+%%Page: 12 12
+12 11 bop 0 83 3900 4 v 0 164 a Fj(P)n(oin)n(t)27 b(of)g(view)p
+0 191 V 0 372 a(\045)h(This)f(macro)g(computes)g(the)h(three)g(angles)e
+(necessary)g(for)h Fg(c)l(ompute)p 2313 372 26 4 v 37
+w(r)l(efer)l(enc)l(e)0 471 y Fj(\045)h Fg(name)34 b Fj(=)27
+b(name)h(of)f(an)g(instance)h(of)f(an)h(ob)5 b(ject)0
+571 y(\045)28 b Fg(tar)l(get)35 b Fj(=)27 b(target)g(p)r(oin)n(t)h
+(\(lo)r(cal)f(to)h(ob)5 b(ject)27 b Fg(name)6 b Fj(\))0
+670 y(\045)28 b Fg(phi)37 b Fj(=)28 b(angle)0 770 y Fk(v)-5
+b(ardef)38 b Fg(p)l(oint)p 487 770 V 38 w(of)p 603 770
+V 49 w(view)p 800 770 V 41 w(obj)13 b Fj(\()p Fk(expr)29
+b Fg(name)6 b Fe(;)23 b Fg(tar)l(get)8 b Fe(;)23 b Fg(phi)10
+b Fj(\))28 b(=)166 870 y Fg(de\014ne)p 389 870 V 37 w(curr)l(ent)p
+690 870 V 37 w(p)l(oint)p 907 870 V 39 w(o\013set)p 1139
+870 V 39 w Fj(\()p Fg(name)6 b Fj(\);)28 b(\045)g(enables)f
+Fg(pnt)166 969 y(p)l(oint)p 359 969 V 39 w(of)p 475 969
+V 49 w(view)p 672 969 V 40 w(abs)8 b Fj(\()p Fg(pnt)g
+Fj(\()p Fg(tar)l(get)f Fj(\))p Fe(;)24 b Fg(phi)10 b
+Fj(\);)0 1069 y Fk(enddef)f Fj(;)0 1218 y(\045)28 b(Compute)g(absolute)
+f(p)r(ersp)r(ectiv)n(e.)36 b Fg(tar)l(get)f Fj(is)28
+b(an)f(absolute)g(p)r(oin)n(t)h(n)n(um)n(b)r(er)0 1318
+y Fk(v)-5 b(ardef)38 b Fg(p)l(oint)p 487 1318 V 38 w(of)p
+603 1318 V 49 w(view)p 800 1318 V 41 w(abs)7 b Fj(\()p
+Fk(expr)29 b Fg(tar)l(get)8 b Fe(;)23 b Fg(phi)10 b Fj(\))27
+b(=)166 1418 y Fk(sa)m(v)m(e)i Fg(v)p 419 1418 V 39 w(a)7
+b Fe(;)23 b Fg(psi)10 b Fe(;)23 b Fg(theta)6 b Fj(;)166
+1517 y Fg(v)p 218 1517 V 40 w(a)34 b Fj(:=)28 b Fg(new)p
+590 1517 V 39 w(ve)l(ct)8 b Fj(;)166 1617 y Fg(ve)l(ct)p
+317 1617 V 38 w(di\013)19 b Fj(\()p Fg(v)p 563 1617 V
+40 w(a)7 b Fe(;)23 b Fg(tar)l(get)7 b Fe(;)23 b Fg(Obs)7
+b Fj(\);)166 1717 y Fg(ve)l(ct)p 317 1717 V 38 w(mult)h
+Fj(\()p Fg(v)p 596 1717 V 39 w(a)f Fe(;)23 b Fg(v)p 769
+1717 V 40 w(a)7 b Fe(;)23 b Fj(1)p Fe(=)p Fg(ve)l(ct)p
+1124 1717 V 37 w(mo)l(d)9 b Fj(\()p Fg(v)p 1390 1717
+V 40 w(a)e Fj(\)\);)166 1816 y Fg(psi)37 b Fj(=)27 b(angle)o(\(\()p
+Fg(ve)l(ct)9 b Fj([)p Fg(v)p 871 1816 V 39 w(a)e Fj(])p
+Fe(x;)24 b Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1283 1816 V 39
+w(a)f Fj(])p Fe(y)s Fj(\)\);)166 1916 y Fg(theta)34 b
+Fj(=)28 b Fh(\000)22 b Fj(angle)o(\(\()p Fg(ve)l(ct)9
+b Fj([)p Fg(v)p 1033 1916 V 39 w(a)e Fj(])p Fe(x)19 b
+Fj(++)f Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1565 1916 V 39 w(a)f
+Fj(])p Fe(y)s(;)23 b Fg(ve)l(ct)8 b Fj([)p Fg(v)p 1973
+1916 V 39 w(a)f Fj(])p Fe(z)t Fj(\)\);)166 2015 y Fg(c)l(ompute)p
+474 2015 V 37 w(r)l(efer)l(enc)l(e)f Fj(\()p Fg(psi)k
+Fe(;)23 b Fg(theta)7 b Fe(;)23 b Fg(phi)10 b Fj(\);)166
+2115 y Fg(fr)l(e)l(e)p 305 2115 V 37 w(ve)l(ct)e Fj(\()p
+Fg(v)p 561 2115 V 40 w(a)f Fj(\);)0 2215 y Fk(enddef)i
+Fj(;)0 2464 y(\045)28 b(Distance)f(b)r(et)n(w)n(een)h(the)g(observ)n
+(er)d(and)j(p)r(oin)n(t)g Fe(n)f Fj(of)h(ob)5 b(ject)27
+b Fg(name)0 2563 y Fj(\045)h(Result)g(is)f(put)h(in)g
+Fg(dist)0 2663 y Fk(v)-5 b(ardef)38 b Fg(obs)p 420 2663
+V 38 w(distanc)l(e)7 b Fj(\()p Fk(text)28 b Fg(dist)8
+b Fj(\)\()p Fk(expr)29 b Fg(name)7 b Fe(;)23 b(n)p Fj(\))28
+b(=)166 2763 y Fk(sa)m(v)m(e)h Fg(v)p 419 2763 V 39 w(a)7
+b Fj(;)166 2862 y Fg(v)p 218 2862 V 40 w(a)34 b Fj(:=)28
+b Fg(new)p 590 2862 V 39 w(ve)l(ct)8 b Fj(;)166 2962
+y Fg(de\014ne)p 389 2962 V 37 w(curr)l(ent)p 690 2962
+V 37 w(p)l(oint)p 907 2962 V 39 w(o\013set)p 1139 2962
+V 39 w Fj(\()p Fg(name)e Fj(\);)28 b(\045)g(enables)f
+Fg(pnt)166 3062 y(dist)36 b Fj(:=)27 b Fg(ve)l(ct)p 597
+3062 V 39 w(mo)l(d)9 b Fj(\()p Fg(v)p 864 3062 V 40 w(a)e
+Fe(;)23 b Fg(pnt)7 b Fj(\()p Fe(n)p Fj(\))p Fe(;)24 b
+Fg(Obs)6 b Fj(\);)166 3161 y Fg(fr)l(e)l(e)p 305 3161
+V 37 w(ve)l(ct)i Fj(\()p Fg(v)p 561 3161 V 40 w(a)f Fj(\);)0
+3261 y Fk(enddef)i Fj(;)1908 6139 y(12)p eop
+%%Page: 13 13
+13 12 bop 0 83 3900 4 v 0 164 a Fj(V)-7 b(ector)27 b(and)h(p)r(oin)n(t)
+f(allo)r(cation)p 0 207 V 0 388 a(\045)h(Allo)r(cation)f(is)h(done)f
+(through)g(a)g(stac)n(k)g(of)g(v)n(ectors)0 487 y Fk(n)m(umeric)g
+Fg(last)p 501 487 26 4 v 38 w(ve)l(ct)p 677 487 V 39
+w Fj(;)0 587 y Fg(last)p 138 587 V 39 w(ve)l(ct)p 315
+587 V 66 w Fj(=)g(0;)0 736 y(\045)h(v)n(ector)e(allo)r(cation)0
+836 y Fk(def)37 b Fg(new)p 317 836 V 39 w(ve)l(ct)f Fj(=)27
+b Fk(incr)5 b Fj(\()p Fg(last)p 944 836 V 39 w(ve)l(ct)p
+1121 836 V 38 w Fj(\))581 936 y(\045)28 b Fk(message)d
+Ff("Vector)41 b(")18 b Fj(&)g(decimal)23 b Fg(last)p
+1974 936 V 39 w(ve)l(ct)p 2151 936 V 56 w Fj(&)18 b Ff(")44
+b(allocated")-5 b Fj(;)0 1035 y Fk(enddef)9 b Fj(;)0
+1185 y Fk(let)27 b Fg(new)p 289 1185 V 40 w(p)l(oint)36
+b Fj(=)27 b Fg(new)p 777 1185 V 39 w(ve)l(ct)8 b Fj(;)0
+1334 y Fk(def)37 b Fg(new)p 317 1334 V 39 w(p)l(oints)7
+b Fj(\()p Fk(text)29 b Fe(p)p Fj(\)\()p Fk(expr)g Fe(n)p
+Fj(\))e(=)166 1434 y Fk(sa)m(v)m(e)i Fe(p)p Fj(;)166
+1533 y Fk(n)m(umeric)e Fe(p)p Fj([];)166 1633 y Fk(for)h
+Fe(i)f Fj(:=)h(1)18 b Fk(upto)g Fe(n)p Fj(:)28 b Fe(p)p
+Fj([)p Fe(i)p Fj(])f(:=)g Fg(new)p 1265 1633 V 40 w(p)l(oint)8
+b Fj(;)46 b Fk(endfor)p Fj(;)0 1733 y Fk(enddef)9 b Fj(;)0
+1882 y(\045)28 b(F)-7 b(ree)27 b(a)g(v)n(ector)0 1982
+y(\045)h(A)g(v)n(ector)e(can)h(only)g(b)r(e)h(freed)g(safely)f(when)h
+(it)g(w)n(as)e(the)i(last)g(v)n(ector)e(created.)0 2081
+y Fk(def)37 b Fg(fr)l(e)l(e)p 302 2081 V 37 w(ve)l(ct)8
+b Fj(\()p Fk(expr)28 b Fe(i)p Fj(\))g(=)166 2181 y Fk(if)37
+b Fe(i)27 b Fj(=)g Fg(last)p 545 2181 V 39 w(ve)l(ct)p
+722 2181 V 38 w Fj(:)h Fg(last)p 936 2181 V 38 w(ve)l(ct)p
+1112 2181 V 66 w Fj(:=)g Fg(last)p 1419 2181 V 38 w(ve)l(ct)p
+1595 2181 V 57 w Fh(\000)18 b Fj(1;)166 2281 y Fk(else)t
+Fj(:)27 b Fk(errmessage)s Fj(\()p Ff("Vector)41 b(")18
+b Fj(&)g(decimal)23 b Fe(i)18 b Fj(&)g Ff(")43 b(can't)f(be)g(freed!")m
+Fj(\);)166 2380 y Fk(\014)5 b Fj(;)0 2480 y Fk(enddef)k
+Fj(;)0 2629 y Fk(let)27 b Fg(fr)l(e)l(e)p 274 2629 V
+37 w(p)l(oint)36 b Fj(=)28 b Fg(fr)l(e)l(e)p 748 2629
+V 37 w(ve)l(ct)7 b Fj(;)0 2779 y Fk(def)37 b Fg(fr)l(e)l(e)p
+302 2779 V 37 w(p)l(oints)7 b Fj(\()p Fk(text)29 b Fe(p)p
+Fj(\)\()p Fk(expr)f Fe(n)p Fj(\))g(=)166 2878 y Fk(for)g
+Fe(i)f Fj(:=)h(10)22 b Fk(step)27 b Fh(\000)p Fj(1)18
+b Fk(un)m(til)g Fj(1:)27 b Fg(fr)l(e)l(e)p 1355 2878
+V 37 w(p)l(oint)8 b Fj(\()p Fe(p)p Fj([)p Fe(i)p Fj(]\);)47
+b Fk(endfor)p Fj(;)0 2978 y Fk(enddef)9 b Fj(;)p 0 3047
+3900 4 v 0 3129 a(Debugging)p 0 3172 V 0 3402 a Fk(def)37
+b Fg(show)p 351 3402 26 4 v 40 w(ve)l(ct)8 b Fj(\()p
+Fk(expr)29 b Fe(t;)23 b(i)p Fj(\))k(=)166 3502 y Fk(message)e
+Ff("Vector)41 b(")18 b Fj(&)g Fe(t)h Fj(&)f Ff("=")184
+3601 y Fj(&)h Ff("\(")e Fj(&)h(decimal)23 b Fg(ve)l(ct)7
+b Fj([)p Fe(i)p Fj(])p Fe(x)19 b Fj(&)f Ff(",")f Fj(&)h(decimal)23
+b Fg(ve)l(ct)8 b Fj([)p Fe(i)p Fj(])p Fe(y)21 b Fj(&)d
+Ff(",")351 3701 y Fj(&)g(decimal)k Fg(ve)l(ct)8 b Fj([)p
+Fe(i)p Fj(])p Fe(z)22 b Fj(&)c Ff("\)")n Fj(;)0 3800
+y Fk(enddef)9 b Fj(;)0 3950 y Fk(let)27 b Fg(show)p 323
+3950 V 41 w(p)l(oint)36 b Fj(=)27 b Fg(show)p 845 3950
+V 40 w(ve)l(ct)8 b Fj(;)0 4099 y Fk(def)37 b Fg(show)p
+351 4099 V 40 w(p)l(air)10 b Fj(\()p Fk(expr)29 b Fe(t;)23
+b Fg(zz)10 b Fj(\))28 b(=)166 4199 y Fk(message)d Fe(t)19
+b Fj(&)f Ff("=\(")f Fj(&)h(decimal)k(xpart\()p Fg(zz)10
+b Fj(\))19 b(&)f Ff(",")f Fj(&)h(decimal)23 b(ypart)o(\()p
+Fg(zz)11 b Fj(\))18 b(&)g Ff("\)")o Fj(;)0 4299 y Fk(enddef)9
+b Fj(;)1908 6139 y(13)p eop
+%%Page: 14 14
+14 13 bop 0 83 3900 4 v 0 164 a Fj(Access)27 b(to)h(ob)5
+b(ject)27 b(features)p 0 207 V 0 388 a(\045)h Fe(a)f
+Fj(m)n(ust)h(b)r(e)g(a)f(string)g(represen)n(ting)f(an)i(class)e(name,)
+i(suc)n(h)f(as)g Ff("dodecahedron")-6 b Fj(.)0 487 y(\045)28
+b Fe(b)f Fj(is)h(the)g(tail)f(of)h(a)f(macro)f(name.)0
+637 y Fk(def)37 b Fg(obj)p 286 637 26 4 v 44 w Fj(\()p
+Fk(expr)28 b Fe(a;)23 b(b;)g(i)p Fj(\))k(=)166 736 y
+Fk(scan)m(tok)m(ens)166 836 y(b)s(egingroup)g(sa)m(v)m(e)h
+Fe(n)p Fj(;)51 b Fk(string)28 b Fe(n)p Fj(;)51 b Fe(n)28
+b Fj(=)f Fe(a)18 b Fj(&)g Fe(b)g Fj(&)g Fe(i)p Fj(;)51
+b Fe(n)166 936 y Fk(endgroup)0 1035 y(enddef)9 b Fj(;)0
+1185 y Fk(def)37 b Fg(obj)p 286 1185 V 44 w(p)l(oints)p
+538 1185 V 37 w Fj(\()p Fk(expr)29 b Fg(name)6 b Fj(\))28
+b(=)166 1284 y Fg(obj)p 289 1284 V 44 w Fj(\()p Fg(obj)p
+470 1284 V 44 w(class)p 677 1284 V 38 w Fj(\()p Fg(name)6
+b Fj(\))p Fe(;)24 b Ff("_points")l Fe(;)f Fg(name)7 b
+Fj(\))0 1384 y Fk(enddef)i Fj(;)0 1533 y Fk(def)37 b
+Fg(obj)p 286 1533 V 44 w(fac)l(es)p 497 1533 V 38 w Fj(\()p
+Fk(expr)28 b Fg(name)7 b Fj(\))28 b(=)166 1633 y Fg(obj)p
+289 1633 V 44 w Fj(\()p Fg(obj)p 470 1633 V 44 w(class)p
+677 1633 V 38 w Fj(\()p Fg(name)6 b Fj(\))p Fe(;)24 b
+Ff("_faces")m Fe(;)f Fg(name)6 b Fj(\))0 1733 y Fk(enddef)j
+Fj(;)0 1882 y Fk(v)-5 b(ardef)38 b Fg(obj)p 417 1882
+V 43 w(p)l(oint)p 635 1882 V 39 w(o\013set)p 867 1882
+V 39 w Fj(\()p Fk(expr)28 b Fg(name)7 b Fj(\))28 b(=)166
+1982 y Fg(obj)p 289 1982 V 44 w Fj(\()p Fg(obj)p 470
+1982 V 44 w(class)p 677 1982 V 38 w Fj(\()p Fg(name)6
+b Fj(\))p Fe(;)24 b Ff("_point_offset")-6 b Fe(;)23 b
+Fg(name)6 b Fj(\))0 2081 y Fk(enddef)j Fj(;)0 2231 y
+Fk(v)-5 b(ardef)38 b Fg(obj)p 417 2231 V 43 w(fac)l(e)p
+592 2231 V 38 w(o\013set)p 825 2231 V 39 w Fj(\()p Fk(expr)28
+b Fg(name)7 b Fj(\))28 b(=)166 2330 y Fg(obj)p 289 2330
+V 44 w Fj(\()p Fg(obj)p 470 2330 V 44 w(class)p 677 2330
+V 38 w Fj(\()p Fg(name)6 b Fj(\))p Fe(;)24 b Ff("_face_offset")-6
+b Fe(;)23 b Fg(name)7 b Fj(\))0 2430 y Fk(enddef)i Fj(;)0
+2580 y Fk(def)37 b Fg(obj)p 286 2580 V 44 w(class)p 493
+2580 V 38 w Fj(\()p Fk(expr)28 b Fg(name)7 b Fj(\))28
+b(=)f Fg(obj)p 1242 2580 V 44 w Fj(\()p Fg(name)6 b Fe(;)23
+b Ff("_class")m Fe(;)g Ff("")o Fj(\))h Fk(enddef)9 b
+Fj(;)1908 6139 y(14)p eop
+%%Page: 15 15
+15 14 bop 0 83 a Fk(def)37 b Fg(de\014ne)p 386 83 26
+4 v 37 w(p)l(oint)p 605 83 V 39 w(o\013set)p 837 83 V
+38 w Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)23 b(o)p Fj(\))28
+b(=)166 183 y Fk(b)s(egingroup)f(sa)m(v)m(e)h Fe(n;)23
+b Fg(tmp)l(def)c Fj(;)332 282 y Fk(string)29 b Fe(n;)23
+b Fg(tmp)l(def)18 b Fj(;)332 382 y Fe(n)28 b Fj(=)f Fg(obj)p
+625 382 V 43 w(class)p 831 382 V 39 w Fj(\()p Fg(name)6
+b Fj(\))19 b(&)f Ff("_point_offset")12 b Fj(&)18 b Fg(name)7
+b Fj(;)332 482 y Fk(expandafter)29 b Fj(n)n(umeric)23
+b Fk(scan)m(tok)m(ens)29 b Fe(n)p Fj(;)332 581 y Fk(scan)m(tok)m(ens)g
+Fe(n)e Fj(:=)h Fg(last)p 1135 581 V 38 w(p)l(oint)p 1353
+581 V 39 w(o\013set)p 1585 581 V 39 w Fj(;)332 681 y
+Fg(last)p 470 681 V 39 w(p)l(oint)p 689 681 V 38 w(o\013set)p
+920 681 V 67 w Fj(:=)f Fg(last)p 1227 681 V 39 w(p)l(oint)p
+1446 681 V 38 w(o\013set)p 1677 681 V 57 w Fj(+)18 b
+Fe(o)p Fj(;)332 780 y Fg(tmp)l(def)46 b Fj(=)27 b Ff("def)42
+b(")18 b Fj(&)g Fg(obj)p 1196 780 V 44 w(class)p 1402
+780 V 38 w Fj(\()p Fg(name)7 b Fj(\))19 b(&)f Ff("_points")c
+Fj(&)k Fg(name)7 b Fj(&)498 880 y Ff("=")17 b Fj(&)h(decimal)23
+b Fe(o)c Fj(&)f Ff(")43 b(enddef")m Fj(;)332 980 y Fk(scan)m(tok)m(ens)
+29 b Fg(tmp)l(def)18 b Fj(;)166 1079 y Fk(endgroup)0
+1179 y(enddef)9 b Fj(;)0 1328 y Fk(def)37 b Fg(de\014ne)p
+386 1328 V 37 w(fac)l(e)p 562 1328 V 38 w(o\013set)p
+795 1328 V 38 w Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)23
+b(o)p Fj(\))29 b(=)166 1428 y Fk(b)s(egingroup)e(sa)m(v)m(e)h
+Fe(n;)23 b Fg(tmp)l(def)c Fj(;)332 1528 y Fk(string)29
+b Fe(n;)23 b Fg(tmp)l(def)18 b Fj(;)332 1627 y Fe(n)28
+b Fj(=)f Fg(obj)p 625 1627 V 43 w(class)p 831 1627 V
+39 w Fj(\()p Fg(name)6 b Fj(\))19 b(&)f Ff("_face_offset")13
+b Fj(&)18 b Fg(name)6 b Fj(;)332 1727 y Fk(expandafter)29
+b Fj(n)n(umeric)23 b Fk(scan)m(tok)m(ens)29 b Fe(n)p
+Fj(;)332 1826 y Fk(scan)m(tok)m(ens)g Fe(n)e Fj(:=)h
+Fg(last)p 1135 1826 V 38 w(fac)l(e)p 1310 1826 V 38 w(o\013set)p
+1543 1826 V 39 w Fj(;)332 1926 y Fg(last)p 470 1926 V
+39 w(fac)l(e)p 646 1926 V 38 w(o\013set)p 879 1926 V
+66 w Fj(:=)f Fg(last)p 1185 1926 V 39 w(fac)l(e)p 1361
+1926 V 37 w(o\013set)p 1593 1926 V 57 w Fj(+)18 b Fe(o)p
+Fj(;)332 2026 y Fg(tmp)l(def)46 b Fj(=)27 b Ff("def)42
+b(")18 b Fj(&)g Fg(obj)p 1196 2026 V 44 w(class)p 1402
+2026 V 38 w Fj(\()p Fg(name)7 b Fj(\))19 b(&)f Ff("_faces")d
+Fj(&)j Fg(name)6 b Fj(&)498 2125 y Ff("=")17 b Fj(&)h(decimal)23
+b Fe(o)c Fj(&)f Ff(")43 b(enddef")m Fj(;)332 2225 y Fk(scan)m(tok)m
+(ens)29 b Fg(tmp)l(def)18 b Fj(;)166 2325 y Fk(endgroup)0
+2424 y(enddef)9 b Fj(;)0 2574 y Fk(def)37 b Fg(de\014ne)p
+386 2574 V 37 w(curr)l(ent)p 687 2574 V 37 w(p)l(oint)p
+904 2574 V 39 w(o\013set)p 1136 2574 V 38 w Fj(\()p Fk(expr)29
+b Fg(name)7 b Fj(\))27 b(=)166 2673 y Fk(sa)m(v)m(e)i
+Fg(curr)l(ent)p 642 2673 V 37 w(p)l(oint)p 859 2673 V
+39 w(o\013set)p 1091 2673 V 38 w Fj(;)166 2773 y Fk(n)m(umeric)e
+Fg(curr)l(ent)p 804 2773 V 37 w(p)l(oint)p 1021 2773
+V 39 w(o\013set)p 1253 2773 V 39 w Fj(;)166 2873 y Fg(curr)l(ent)p
+441 2873 V 37 w(p)l(oint)p 658 2873 V 39 w(o\013set)p
+890 2873 V 66 w Fj(:=)h Fg(obj)p 1182 2873 V 43 w(p)l(oint)p
+1400 2873 V 39 w(o\013set)p 1632 2873 V 39 w Fj(\()p
+Fg(name)6 b Fj(\);)0 2972 y Fk(enddef)j Fj(;)0 3122 y
+Fk(def)37 b Fg(de\014ne)p 386 3122 V 37 w(curr)l(ent)p
+687 3122 V 37 w(fac)l(e)p 861 3122 V 38 w(o\013set)p
+1094 3122 V 39 w Fj(\()p Fk(expr)28 b Fg(name)7 b Fj(\))28
+b(=)166 3221 y Fk(sa)m(v)m(e)h Fg(curr)l(ent)p 642 3221
+V 37 w(fac)l(e)p 816 3221 V 38 w(o\013set)p 1049 3221
+V 39 w Fj(;)166 3321 y Fk(n)m(umeric)e Fg(curr)l(ent)p
+804 3321 V 37 w(fac)l(e)p 978 3321 V 38 w(o\013set)p
+1211 3321 V 39 w Fj(;)166 3421 y Fg(curr)l(ent)p 441
+3421 V 37 w(fac)l(e)p 615 3421 V 38 w(o\013set)p 848
+3421 V 66 w Fj(:=)h Fg(obj)p 1140 3421 V 43 w(fac)l(e)p
+1315 3421 V 38 w(o\013set)p 1548 3421 V 39 w Fj(\()p
+Fg(name)6 b Fj(\);)0 3520 y Fk(enddef)j Fj(;)1908 6139
+y(15)p eop
+%%Page: 16 16
+16 15 bop 0 83 3900 4 v 0 164 a Fj(Dra)n(wing)26 b(an)i(ob)5
+b(ject)p 0 207 V 0 388 a(\045)28 b Fg(name)34 b Fj(is)27
+b(an)h(ob)5 b(ject)27 b(instance)0 487 y Fk(def)37 b
+Fg(dr)l(aw)p 348 487 26 4 v 40 w(obj)13 b Fj(\()p Fk(expr)29
+b Fg(name)6 b Fj(\))28 b(=)g Fg(pr)l(oje)l(ct)p 1345
+487 V 39 w(obj)13 b Fj(\()p Fg(name)7 b Fj(\);)51 b Fg(dr)l(aw)p
+2013 487 V 40 w(fac)l(es)8 b Fj(\()p Fg(name)e Fj(\);)47
+b Fk(enddef)9 b Fj(;)p 0 561 3900 4 v 0 643 a(Normalization)26
+b(of)i(an)f(ob)5 b(ject)p 0 686 V 0 866 a(\045)28 b(This)f(macro)g
+(translates)f(an)h(ob)5 b(ject)28 b(so)f(that)h(a)f(list)h(of)f(v)n
+(ertices)g(is)g(cen)n(tered)0 966 y(\045)h(on)f(the)h(origin,)f(and)g
+(the)h(last)f(v)n(ertex)g(is)g(put)i(on)e(a)g(sphere)g(whose)g(radius)g
+(is)g(1.)0 1065 y(\045)h Fg(name)34 b Fj(is)27 b(the)h(name)g(of)f(the)
+h(ob)5 b(ject)28 b(and)f Fg(vertic)l(es)35 b Fj(is)28
+b(a)f(list)0 1165 y(\045)h(of)f(p)r(oin)n(ts)h(whose)f(barycen)n(ter)f
+(will)i(de\014ne)f(the)h(cen)n(ter)f(of)h(the)g(ob)5
+b(ject.)0 1265 y(\045)28 b(\()p Fg(vertic)l(es)35 b Fj(need)28
+b(not)f(b)r(e)h(the)g(list)g(of)g(all)f(v)n(ertices\))0
+1364 y Fk(v)-5 b(ardef)38 b Fg(normalize)p 657 1364 26
+4 v 38 w(obj)13 b Fj(\()p Fk(expr)28 b Fg(name)7 b Fj(\)\()p
+Fk(text)29 b Fg(vertic)l(es)7 b Fj(\))28 b(=)166 1464
+y Fk(sa)m(v)m(e)h Fg(v)p 419 1464 V 39 w(a)7 b Fe(;)23
+b Fg(nvertic)l(es)7 b Fe(;)24 b Fg(last)8 b Fj(;)166
+1563 y Fk(n)m(umeric)27 b Fg(v)p 581 1563 V 40 w(a)6
+b Fe(;)24 b Fg(last)8 b Fj(;)166 1663 y Fg(nvertic)l(es)35
+b Fj(=)27 b(0;)166 1763 y Fg(v)p 218 1763 V 40 w(a)34
+b Fj(=)27 b Fg(new)p 567 1763 V 40 w(ve)l(ct)8 b Fj(;)51
+b Fg(ve)l(ct)p 963 1763 V 38 w(def)19 b Fj(\()p Fg(v)p
+1196 1763 V 40 w(a)6 b Fe(;)23 b Fj(0)p Fe(;)g Fj(0)p
+Fe(;)g Fj(0\))166 1862 y Fk(forsu\016xes)k Fj($)g(=)h
+Fg(vertic)l(es)7 b Fj(:)332 1962 y Fg(ve)l(ct)p 483 1962
+V 38 w(sum)f Fj(\()p Fg(v)p 746 1962 V 40 w(a)h Fe(;)23
+b Fg(v)p 918 1962 V 40 w(a)7 b Fe(;)23 b Fg(pnt)7 b Fj(\($\)\);)332
+2062 y Fg(nvertic)l(es)35 b Fj(:=)27 b Fg(nvertic)l(es)f
+Fj(+)18 b(1;)332 2161 y Fg(last)36 b Fj(:=)27 b($;)166
+2261 y Fk(endfor)p Fj(;)166 2360 y Fg(ve)l(ct)p 317 2360
+V 38 w(mult)8 b Fj(\()p Fg(v)p 596 2360 V 39 w(a)f Fe(;)23
+b Fg(v)p 769 2360 V 40 w(a)7 b Fe(;)23 b Fh(\000)p Fj(1)p
+Fe(=)p Fg(nvertic)l(es)6 b Fj(\);)166 2460 y Fg(tr)l(anslate)p
+488 2460 V 37 w(obj)13 b Fj(\()p Fg(name)6 b Fe(;)24
+b Fg(v)p 964 2460 V 39 w(a)7 b Fj(\);)28 b(\045)g(ob)5
+b(ject)27 b(cen)n(tered)g(on)h(the)g(origin)166 2560
+y Fg(sc)l(ale)p 346 2560 V 38 w(obj)13 b Fj(\()p Fg(name)6
+b Fe(;)24 b Fj(1)p Fe(=)p Fg(ve)l(ct)p 1006 2560 V 37
+w(mo)l(d)9 b Fj(\()p Fg(pnt)f Fj(\()p Fg(last)g Fj(\)\)\);)166
+2659 y Fg(fr)l(e)l(e)p 305 2659 V 37 w(ve)l(ct)g Fj(\()p
+Fg(v)p 561 2659 V 40 w(a)f Fj(\);)0 2759 y Fk(enddef)i
+Fj(;)1908 6139 y(16)p eop
+%%Page: 17 17
+17 16 bop 0 83 3900 4 v 0 164 a Fj(General)27 b(de\014nitions)p
+0 191 V 0 372 a(\045)h(V)-7 b(ector)27 b(arra)n(ys)0
+471 y Fk(n)m(umeric)g Fg(ve)l(ct)8 b Fj([])p Fe(x;)23
+b Fg(ve)l(ct)8 b Fj([])p Fe(y)s(;)23 b Fg(ve)l(ct)8 b
+Fj([])p Fe(z)t Fj(;)0 621 y(\045)28 b(Observ)n(er)0 720
+y Fk(n)m(umeric)f Fg(Obs)6 b Fj(;)0 820 y Fg(Obs)34 b
+Fj(=)28 b Fg(new)p 417 820 26 4 v 39 w(p)l(oint)8 b Fj(;)0
+920 y(\045)28 b(default)g(v)-5 b(alue:)0 1019 y Fg(set)p
+113 1019 V 38 w(p)l(oint)8 b Fj(\()p Fg(Obs)f Fe(;)23
+b Fj(0)p Fe(;)g Fj(0)p Fe(;)g Fj(20\);)0 1169 y(\045)28
+b(Observ)n(er's)d(v)n(ectors)0 1268 y Fg(ObsI)p 186 1268
+V 71 w Fj(=)i Fg(new)p 485 1268 V 40 w(ve)l(ct)8 b Fj(;)50
+b Fg(ObsJ)p 927 1268 V 70 w Fj(=)27 b Fg(new)p 1226 1268
+V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(ObsK)p 1688 1268 V 70
+w Fj(=)27 b Fg(new)p 1987 1268 V 40 w(ve)l(ct)8 b Fj(;)0
+1368 y Fg(IObsI)p 218 1368 V 71 w Fj(=)27 b Fg(new)p
+517 1368 V 40 w(ve)l(ct)8 b Fj(;)50 b Fg(IObsJ)p 991
+1368 V 70 w Fj(=)27 b Fg(new)p 1290 1368 V 40 w(ve)l(ct)7
+b Fj(;)51 b Fg(IObsK)p 1784 1368 V 70 w Fj(=)27 b Fg(new)p
+2083 1368 V 40 w(ve)l(ct)8 b Fj(;)0 1517 y(\045)28 b(distance)f(observ)
+n(er/plane)e(\(m)n(ust)j(b)r(e)g Fe(>)f Fj(0\))0 1617
+y Fk(n)m(umeric)g Fg(Obs)p 511 1617 V 37 w(dist)8 b Fj(;)28
+b(\045)g(represen)n(ts)e Fg(Obs)p 1360 1617 V 37 w(dist)36
+b Fh(\002)27 b Fg(dr)l(awing)p 1934 1617 V 39 w(sc)l(ale)0
+1717 y Fj(\045)h(default)g(v)-5 b(alue:)0 1816 y Fg(Obs)p
+148 1816 V 37 w(dist)36 b Fj(=)27 b(2;)h(\045)f(means)h
+Fg(Obs)p 1022 1816 V 37 w(dist)36 b Fh(\002)27 b Fg(dr)l(awing)p
+1596 1816 V 39 w(sc)l(ale)0 1966 y Fj(\045)h(Screen)f(Size)0
+2065 y(\045)h(The)g(screen)e(size)i(is)f(de\014ned)h(through)f(t)n(w)n
+(o)g(angles:)36 b(the)27 b(horizon)n(tal)f(\014eld)0
+2165 y(\045)i(and)f(the)h(v)n(ertical)f(\014eld)0 2265
+y Fk(n)m(umeric)g Fg(h)p 416 2265 V 37 w(\014eld)9 b
+Fe(;)23 b Fg(v)p 698 2265 V 40 w(\014eld)9 b Fj(;)0 2364
+y Fg(h)p 53 2364 V 37 w(\014eld)37 b Fj(=)27 b(100;)g(\045)g(degrees)0
+2464 y Fg(v)p 52 2464 V 40 w(\014eld)36 b Fj(=)28 b(70;)e(\045)i
+(degrees)0 2613 y(\045)g(Reference)f(v)n(ectors)750 2595
+y Fe(~)756 2613 y Fj(0,)16 b Fe(~)-31 b({)p Fj(,)24 b
+Fe(~)-38 b(|)28 b Fj(and)1143 2591 y Fe(~)1147 2613 y(k)0
+2713 y Fj(\045)g(and)f(their)h(de\014nition)0 2812 y
+Fk(n)m(umeric)f Fg(ve)l(ct)p 514 2812 V 38 w(nul)t(l)9
+b Fe(;)23 b Fg(ve)l(ct)p 883 2812 V 38 w(I)13 b Fe(;)23
+b Fg(ve)l(ct)p 1150 2812 V 39 w(J)11 b Fe(;)23 b Fg(ve)l(ct)p
+1428 2812 V 38 w(K)12 b Fj(;)0 2912 y Fg(ve)l(ct)p 151
+2912 V 38 w(nul)t(l)36 b Fj(=)28 b Fg(new)p 597 2912
+V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(ve)l(ct)p 993 2912 V
+38 w(I)41 b Fj(=)27 b Fg(new)p 1337 2912 V 40 w(ve)l(ct)8
+b Fj(;)50 b Fg(ve)l(ct)p 1733 2912 V 39 w(J)39 b Fj(=)27
+b Fg(new)p 2088 2912 V 39 w(ve)l(ct)8 b Fj(;)51 b Fg(ve)l(ct)p
+2484 2912 V 38 w(K)40 b Fj(=)27 b Fg(new)p 2859 2912
+V 40 w(ve)l(ct)7 b Fj(;)0 3012 y Fg(ve)l(ct)p 151 3012
+V 38 w(def)19 b Fj(\()p Fg(ve)l(ct)p 483 3012 V 39 w(nul)t(l)8
+b Fe(;)23 b Fj(0)p Fe(;)g Fj(0)p Fe(;)g Fj(0\);)0 3111
+y Fg(ve)l(ct)p 151 3111 V 38 w(def)c Fj(\()p Fg(ve)l(ct)p
+483 3111 V 39 w(I)13 b Fe(;)23 b Fj(1)p Fe(;)g Fj(0)p
+Fe(;)f Fj(0\);)51 b Fg(ve)l(ct)p 1074 3111 V 38 w(def)19
+b Fj(\()p Fg(ve)l(ct)p 1406 3111 V 38 w(J)12 b Fe(;)23
+b Fj(0)p Fe(;)f Fj(1)p Fe(;)h Fj(0\);)51 b Fg(ve)l(ct)p
+2007 3111 V 38 w(def)19 b Fj(\()p Fg(ve)l(ct)p 2339 3111
+V 38 w(K)12 b Fe(;)23 b Fj(0)p Fe(;)g Fj(0)p Fe(;)g Fj(1\);)0
+3211 y Fk(n)m(umeric)k Fg(p)l(oint)p 556 3211 V 39 w(nul)t(l)8
+b Fj(;)0 3311 y Fg(p)l(oint)p 193 3311 V 39 w(nul)t(l)36
+b Fj(=)27 b Fg(ve)l(ct)p 636 3311 V 39 w(nul)t(l)8 b
+Fj(;)0 3460 y(\045)28 b(Observ)n(er's)d(orien)n(tation,)h(de\014ned)i
+(b)n(y)g(three)f(angles)0 3560 y Fk(n)m(umeric)g Fg(Obs)p
+511 3560 V 37 w(psi)9 b Fe(;)23 b Fg(Obs)p 840 3560 V
+38 w(theta)6 b Fe(;)23 b Fg(Obs)p 1244 3560 V 37 w(phi)10
+b Fj(;)0 3659 y(\045)28 b(default)g(v)-5 b(alue:)0 3759
+y Fg(Obs)p 148 3759 V 37 w(psi)37 b Fj(=)27 b(0;)51 b
+Fg(Obs)p 667 3759 V 37 w(theta)34 b Fj(=)27 b(90;)50
+b Fg(Obs)p 1301 3759 V 37 w(phi)38 b Fj(=)27 b(0;)0 3908
+y(\045)h(P)n(oin)n(ts)e(for)h(the)h(\014gures)0 4008
+y Fk(n)m(umeric)f Fg(p)l(oints)p 589 4008 V 38 w Fj([];)0
+4157 y(\045)h Fg(name)34 b Fj(is)27 b(the)h(name)g(of)f(an)h(ob)5
+b(ject)27 b(instance)0 4257 y(\045)h Fg(np)l(oints)34
+b Fj(is)28 b(its)g(n)n(um)n(b)r(er)f(of)g(de\014ning)h(p)r(oin)n(ts)0
+4357 y Fk(def)37 b Fg(new)p 317 4357 V 39 w(obj)p 466
+4357 V 44 w(p)l(oints)7 b Fj(\()p Fk(expr)29 b Fg(name)6
+b Fe(;)23 b Fg(np)l(oints)7 b Fj(\))28 b(=)166 4456 y
+Fg(de\014ne)p 389 4456 V 37 w(p)l(oint)p 608 4456 V 39
+w(o\013set)p 840 4456 V 38 w Fj(\()p Fg(name)7 b Fe(;)23
+b Fg(np)l(oints)7 b Fj(\);)51 b Fg(de\014ne)p 1742 4456
+V 37 w(curr)l(ent)p 2043 4456 V 37 w(p)l(oint)p 2260
+4456 V 39 w(o\013set)p 2492 4456 V 39 w Fj(\()p Fg(name)6
+b Fj(\);)166 4556 y Fk(for)28 b Fe(i)f Fj(:=)h(1)18 b
+Fk(upto)g Fg(obj)p 874 4556 V 44 w(p)l(oints)p 1126 4556
+V 37 w Fj(\()p Fg(name)7 b Fj(\):)28 b Fg(pnt)8 b Fj(\()p
+Fe(i)p Fj(\))28 b(:=)f Fg(new)p 1983 4556 V 39 w(p)l(oint)9
+b Fj(;)46 b Fk(endfor)p Fj(;)0 4656 y Fk(enddef)9 b Fj(;)0
+4805 y(\045)28 b Fg(name)34 b Fj(is)27 b(the)h(name)g(of)f(an)h(ob)5
+b(ject)27 b(instance)0 4905 y(\045)h Fg(nfac)l(es)35
+b Fj(is)27 b(its)h(n)n(um)n(b)r(er)g(of)f(de\014ning)h(faces)0
+5004 y Fk(def)37 b Fg(new)p 317 5004 V 39 w(obj)p 466
+5004 V 44 w(fac)l(es)8 b Fj(\()p Fk(expr)28 b Fg(name)7
+b Fe(;)23 b Fg(nfac)l(es)7 b Fj(\))28 b(=)166 5104 y
+Fg(de\014ne)p 389 5104 V 37 w(fac)l(e)p 565 5104 V 38
+w(o\013set)p 798 5104 V 38 w Fj(\()p Fg(name)7 b Fe(;)23
+b Fg(nfac)l(es)8 b Fj(\);)51 b Fg(de\014ne)p 1660 5104
+V 37 w(curr)l(ent)p 1961 5104 V 37 w(fac)l(e)p 2135 5104
+V 38 w(o\013set)p 2368 5104 V 38 w Fj(\()p Fg(name)7
+b Fj(\);)166 5203 y Fg(r)l(e)l(de\014ne)p 454 5203 V
+37 w(obj)p 603 5203 V 43 w(name)p 834 5203 V 37 w Fj(\()p
+Fg(name)g Fe(;)23 b Fg(curr)l(ent)p 1415 5203 V 38 w(fac)l(e)p
+1590 5203 V 37 w(o\013set)p 1822 5203 V 57 w Fj(+)18
+b Fg(nfac)l(es)8 b Fj(\);)0 5303 y Fk(enddef)h Fj(;)1908
+6139 y(17)p eop
+%%Page: 18 18
+18 17 bop 0 83 a Fj(\045)28 b(Absolute)g(p)r(oin)n(t)f(n)n(um)n(b)r(er)
+h(corresp)r(onding)d(to)j(ob)5 b(ject)27 b(p)r(oin)n(t)h(n)n(um)n(b)r
+(er)f Fe(i)0 183 y Fj(\045)h(This)f(macro)g(m)n(ust)g(only)h(b)r(e)g
+(used)f(within)h(the)g(function)h(de\014ning)e(an)h(ob)5
+b(ject)0 282 y(\045)28 b(\(suc)n(h)f(as)g Fg(def)p 547
+282 26 4 v 50 w(cub)l(e)6 b Fj(\))28 b(or)e(the)i(function)h(dra)n
+(wing)d(an)h(ob)5 b(ject)27 b(\(suc)n(h)h(as)0 382 y(\045)g
+Fg(dr)l(aw)p 282 382 V 40 w(cub)l(e)6 b Fj(\).)0 482
+y Fk(def)37 b Fg(ipnt)p 318 482 V 38 w Fj(\()p Fk(expr)29
+b Fe(i)p Fj(\))f(=)f Fe(i)18 b Fj(+)g Fg(curr)l(ent)p
+1176 482 V 37 w(p)l(oint)p 1393 482 V 39 w(o\013set)p
+1625 482 V 62 w Fk(enddef)9 b Fj(;)0 581 y Fk(def)37
+b Fg(pnt)7 b Fj(\()p Fk(expr)29 b Fe(i)p Fj(\))f(=)f
+Fg(p)l(oints)p 941 581 V 38 w Fj([)p Fg(ipnt)p 1145 581
+V 38 w Fj(\()p Fe(i)p Fj(\)])c Fk(enddef)9 b Fj(;)0 731
+y Fk(def)37 b Fg(fac)l(e)7 b Fj(\()p Fk(expr)29 b Fe(i)p
+Fj(\))e(=)h(\()p Fe(i)18 b Fj(+)g Fg(curr)l(ent)p 1174
+731 V 37 w(fac)l(e)p 1348 731 V 38 w(o\013set)p 1581
+731 V 39 w Fj(\))23 b Fk(enddef)9 b Fj(;)0 880 y(\045)28
+b(Absolute)g(p)r(oin)n(t)f(n)n(um)n(b)r(er)h(corresp)r(onding)d(to)j
+(lo)r(cal)f(p)r(oin)n(t)h Fe(n)0 980 y Fj(\045)g(in)g(ob)5
+b(ject)27 b(instance)g Fg(name)0 1079 y Fk(v)-5 b(ardef)38
+b Fg(pnt)p 424 1079 V 38 w(obj)13 b Fj(\()p Fk(expr)29
+b Fg(name)6 b Fe(;)23 b(n)p Fj(\))28 b(=)166 1179 y Fg(hide)8
+b Fj(\()p Fg(de\014ne)p 576 1179 V 37 w(curr)l(ent)p
+877 1179 V 37 w(p)l(oint)p 1094 1179 V 39 w(o\013set)p
+1326 1179 V 39 w Fj(\()p Fg(name)e Fj(\);)51 b(\))p Fg(pnt)8
+b Fj(\()p Fe(n)p Fj(\))0 1279 y Fk(enddef)h Fj(;)0 1428
+y(\045)28 b(Absolute)g(face)f(n)n(um)n(b)r(er)g(corresp)r(onding)f(to)h
+(lo)r(cal)g(face)h Fe(n)0 1528 y Fj(\045)g(in)g(ob)5
+b(ject)27 b(instance)g Fg(name)0 1627 y Fk(v)-5 b(ardef)38
+b Fg(fac)l(e)p 444 1627 V 37 w(obj)14 b Fj(\()p Fk(expr)28
+b Fg(name)7 b Fe(;)23 b(n)p Fj(\))28 b(=)166 1727 y Fg(hide)8
+b Fj(\()p Fg(de\014ne)p 576 1727 V 37 w(curr)l(ent)p
+877 1727 V 37 w(fac)l(e)p 1051 1727 V 38 w(o\013set)p
+1284 1727 V 39 w Fj(\()p Fg(name)e Fj(\);)52 b(\))p Fg(fac)l(e)7
+b Fj(\()p Fe(n)p Fj(\))0 1826 y Fk(enddef)i Fj(;)0 2026
+y(\045)28 b(Scale)0 2125 y Fk(n)m(umeric)f Fg(dr)l(awing)p
+655 2125 V 39 w(sc)l(ale)7 b Fj(;)0 2225 y Fg(dr)l(awing)p
+292 2225 V 39 w(sc)l(ale)35 b Fj(=)27 b(2)p Fg(cm)6 b
+Fj(;)0 2374 y(\045)28 b(Color)0 2474 y(\045)g(This)f(function)i(is)e
+(useful)h(when)g(a)f(color)f(is)i(expressed)e(in)i(hexadecimal.)0
+2574 y Fk(def)37 b Fg(hexc)l(olor)10 b Fj(\()p Fk(expr)29
+b Fe(s)p Fj(\))e(=)166 2673 y(\(hex\()p Fk(substring)6
+b Fj(\(0)p Fe(;)23 b Fj(2\))f Fk(of)37 b Fe(s)p Fj(\))p
+Fe(=)p Fj(255)p Fe(;)22 b Fj(hex)o(\()p Fk(substring)6
+b Fj(\(2)p Fe(;)23 b Fj(4\))g Fk(of)37 b Fe(s)p Fj(\))p
+Fe(=)p Fj(255)p Fe(;)332 2773 y Fj(hex\()p Fk(substring)5
+b Fj(\(4)p Fe(;)23 b Fj(6\))g Fk(of)37 b Fe(s)p Fj(\))p
+Fe(=)p Fj(255\))0 2873 y Fk(enddef)9 b Fj(;)0 3022 y(\045)28
+b(Filling)g(and)f(con)n(tours)0 3122 y Fk(b)s(o)s(olean)f
+Fg(\014l)t(le)l(d)p 534 3122 V 40 w(fac)l(es)8 b Fe(;)23
+b Fg(dr)l(aw)p 972 3122 V 40 w(c)l(ontours)7 b Fj(;)0
+3221 y Fg(\014l)t(le)l(d)p 183 3221 V 40 w(fac)l(es)35
+b Fj(=)28 b Fk(true)p Fj(;)0 3321 y Fg(dr)l(aw)p 185
+3321 V 40 w(c)l(ontours)34 b Fj(=)28 b Fk(true)p Fj(;)0
+3421 y Fk(n)m(umeric)f Fg(c)l(ontourwidth)7 b Fj(;)28
+b(\045)g(thic)n(kness)f(of)g(con)n(tours)0 3520 y Fg(c)l(ontourwidth)35
+b Fj(=)27 b(1)p Fg(pt)7 b Fj(;)0 3670 y(\045)28 b(Ov)n(er\015o)n(w)d
+(con)n(trol)0 3769 y(\045)j(An)g(o)n(v)n(er\015o)n(w)d(can)i(o)r(ccur)g
+(when)h(an)f(ob)5 b(ject)28 b(is)f(to)r(o)g(close)g(from)g(the)h
+(observ)n(er)0 3869 y(\045)g(or)f(if)h(an)f(ob)5 b(ject)27
+b(is)h(out)f(of)h(sigh)n(t.)36 b(W)-7 b(e)28 b(use)g(a)f(sp)r(ecial)g
+(v)-5 b(alue)28 b(to)f(mark)0 3968 y(\045)h(co)r(ordinates)e(whic)n(h)i
+(w)n(ould)f(lead)g(to)g(an)h(o)n(v)n(er\015o)n(w.)0 4068
+y Fk(n)m(umeric)f Fg(to)l(o)p 481 4068 V 36 w(big)p 620
+4068 V 39 w Fj(;)0 4168 y Fg(to)l(o)p 118 4168 V 36 w(big)p
+257 4168 V 66 w Fj(=)h(4000;)0 4367 y(\045)g(Ob)5 b(ject)27
+b(o\013set)h(\(the)g(p)r(oin)n(ts)g(de\014ning)f(an)h(ob)5
+b(ject)27 b(are)g(arranged)0 4467 y(\045)h(in)g(a)f(single)g(arra)n(y)
+-7 b(,)25 b(and)j(the)g(ob)5 b(jects)27 b(are)g(easier)f(to)h
+(manipulate)0 4566 y(\045)h(if)g(the)g(p)r(oin)n(t)g(n)n(um)n(b)r(ers)f
+(are)f(divided)i(in)n(to)g(a)f(n)n(um)n(b)r(er)g(and)h(an)f
+(o\013set\).)0 4666 y Fk(n)m(umeric)g Fg(last)p 501 4666
+V 38 w(p)l(oint)p 719 4666 V 39 w(o\013set)p 951 4666
+V 39 w Fe(;)c Fg(last)p 1161 4666 V 38 w(fac)l(e)p 1336
+4666 V 38 w(o\013set)p 1569 4666 V 39 w Fj(;)0 4765 y
+Fg(last)p 138 4765 V 39 w(p)l(oint)p 357 4765 V 38 w(o\013set)p
+588 4765 V 67 w Fj(=)k(0;)50 b Fg(last)p 987 4765 V 39
+w(fac)l(e)p 1163 4765 V 38 w(o\013set)p 1396 4765 V 66
+w Fj(=)27 b(0;)1908 6139 y(18)p eop
+%%Page: 19 19
+19 18 bop 0 83 3900 4 v 0 164 a Fj(Computation)27 b(of)h(\014eld)g
+(parameters)e(of)h(an)h(animation)p 0 207 V 0 383 a Fk(n)m(umeric)f
+Fg(xmin)p 553 383 26 4 v 36 w Fe(;)c Fg(ymin)p 815 383
+V 38 w Fe(;)g Fg(xmax)p 1090 383 V 40 w Fe(;)g Fg(ymax)p
+1366 383 V 41 w Fj(;)0 533 y Fk(def)37 b Fg(c)l(ompute)p
+471 533 V 37 w(bb)l(ox)g Fj(=)166 632 y Fk(if)g Fj(kno)n(wn)22
+b Fg(xmin)p 707 632 V 36 w Fj(:)332 732 y Fg(xmin)p 522
+732 V 64 w Fj(:=)28 b(min\()p Fg(xmin)p 1051 732 V 37
+w Fe(;)23 b Fj(xpart)o(\(llcorner)o(\()p Fg(curr)l(entpictur)l(e)6
+b Fj(\)\)\);)332 831 y Fg(ymin)p 523 831 V 65 w Fj(:=)27
+b(min)q(\()p Fg(ymin)p 1054 831 V 37 w Fe(;)c Fj(ypart\(llcorner)o(\()p
+Fg(curr)l(entpictur)l(e)5 b Fj(\)\)\);)332 931 y Fg(xmax)p
+535 931 V 68 w Fj(:=)27 b(max)o(\()p Fg(xmax)p 1092 931
+V 41 w Fe(;)c Fj(xpart)o(\(urcorner)n(\()p Fg(curr)l(entpictur)l(e)6
+b Fj(\)\)\);)332 1031 y Fg(ymax)p 536 1031 V 68 w Fj(:=)28
+b(max)o(\()p Fg(ymax)p 1096 1031 V 41 w Fe(;)23 b Fj(ypart\(urcorner)n
+(\()p Fg(curr)l(entpictur)l(e)6 b Fj(\)\)\);)166 1130
+y Fk(else)t Fj(:)332 1230 y Fg(xmin)p 522 1230 V 64 w
+Fj(=)27 b(xpart\(llcorner)o(\()p Fg(curr)l(entpictur)l(e)5
+b Fj(\)\);)332 1330 y Fg(ymin)p 523 1330 V 65 w Fj(=)27
+b(ypart\(llcorner)n(\()p Fg(curr)l(entpictur)l(e)6 b
+Fj(\)\);)332 1429 y Fg(xmax)p 535 1429 V 68 w Fj(=)27
+b(xpart)o(\(urcorner)o(\()p Fg(curr)l(entpictur)l(e)5
+b Fj(\)\);)332 1529 y Fg(ymax)p 536 1529 V 68 w Fj(=)28
+b(ypart)o(\(urcorner)n(\()p Fg(curr)l(entpictur)l(e)6
+b Fj(\)\);)166 1628 y Fk(\014)f Fj(;)0 1728 y Fk(enddef)k
+Fj(;)0 1878 y Fk(b)s(o)s(olean)26 b Fg(show)p 539 1878
+V 41 w(animation)p 942 1878 V 38 w(p)l(ar)l(ameters)7
+b Fj(;)0 1977 y Fg(show)p 188 1977 V 40 w(animation)p
+590 1977 V 38 w(p)l(ar)l(ameters)36 b Fj(=)27 b Fk(false)o
+Fj(;)0 2077 y Fk(n)m(umeric)g Fg(p)l(ap)l(er)p 569 2077
+V 40 w(height)10 b Fj(;)0 2176 y Fg(p)l(ap)l(er)p 206
+2176 V 40 w(height)37 b Fj(=)28 b(29)p Fe(:)p Fj(7;)e(\045)i(pap)r(er)f
+(heigh)n(t)g(in)h(cm)0 2326 y(\045)g(sho)n(w)f(b)r(ounding)g(b)r(o)n(x)
+g(of)h(an)f(animation,)g(in)h(P)n(ostScript)f(p)r(oin)n(ts)0
+2425 y(\045)h(and)f(parameters)f(for)h(animation)g(script)0
+2525 y Fk(v)-5 b(ardef)38 b Fg(show)p 482 2525 V 40 w(animation)p
+884 2525 V 38 w(bb)l(ox)g Fj(=)166 2625 y Fk(sa)m(v)m(e)29
+b Fg(trx)9 b Fe(;)23 b Fg(try)7 b Fe(;)23 b(h;)g(w)r(;)h
+Fg(delta)7 b Fe(;)23 b Fg(pnmx)10 b Fe(;)23 b Fg(pnmy)8
+b Fe(;)23 b Fg(pnmw)9 b Fe(;)23 b Fg(pnmh)7 b Fe(;)23
+b Fg(r)l(es)7 b Fj(;)166 2724 y Fg(r)l(es)34 b Fj(=)28
+b(36;)e(\045)i(36)f(dots)g(p)r(er)h(inc)n(h)f(in)h(bitmap)166
+2824 y Fe(w)i Fj(=)e Fg(xmax)p 550 2824 V 58 w Fh(\000)18
+b Fg(xmin)p 867 2824 V 36 w Fj(;)51 b Fe(h)28 b Fj(=)f
+Fg(ymax)p 1338 2824 V 59 w Fh(\000)18 b Fg(ymin)p 1656
+2824 V 37 w Fj(;)166 2924 y Fk(if)37 b Fg(show)p 447
+2924 V 40 w(animation)p 849 2924 V 38 w(p)l(ar)l(ameters)8
+b Fj(:)332 3023 y Fk(message)25 b Ff("animation)40 b(bbox:)h(\(llx=")16
+b Fj(&)i(decimal)23 b(round\()p Fg(xmin)p 2535 3023 V
+36 w Fj(\))517 3123 y(&)18 b Ff(",lly=")d Fj(&)j(decimal)23
+b(round)o(\()p Fg(ymin)p 1741 3123 V 38 w Fj(\))517 3223
+y(&)18 b Ff(",w=")e Fj(&)i(decimal)23 b(round)o(\()p
+Fe(w)r Fj(\))d(&)e Ff(",h=")e Fj(&)i(decimal)23 b(round\()p
+Fe(h)p Fj(\))18 b(&)g Ff("\)")o Fj(;)166 3322 y Fk(\014)5
+b Fj(;)166 3422 y Fk(if)37 b Fg(xmin)p 449 3422 V 64
+w Fh(\024)27 b Fj(20:)g Fg(trx)37 b Fj(=)27 b(50)17 b
+Fh(\000)h Fg(xmin)p 1333 3422 V 37 w Fj(;)51 b Fk(else)s
+Fj(:)28 b Fg(trx)37 b Fj(=)27 b(0;)50 b Fk(\014)5 b Fj(;)166
+3521 y Fk(if)37 b Fg(ymin)p 450 3521 V 65 w Fh(\024)27
+b Fj(20:)g Fg(try)34 b Fj(=)28 b(50)17 b Fh(\000)h Fg(ymin)p
+1335 3521 V 37 w Fj(;)51 b Fk(else)t Fj(:)27 b Fg(try)35
+b Fj(=)28 b(0;)50 b Fk(\014)5 b Fj(;)166 3621 y Fk(if)37
+b Fg(show)p 447 3621 V 40 w(animation)p 849 3621 V 38
+w(p)l(ar)l(ameters)8 b Fj(:)332 3721 y Fk(message)25
+b Ff("translate)40 b(parameters:)f(")351 3820 y Fj(&)18
+b(decimal)k(round\()p Fg(trx)9 b Fj(\))19 b(&)f Ff(")43
+b(")18 b Fj(&)g(decimal)23 b(round)o(\()p Fg(try)8 b
+Fj(\);)166 3920 y Fk(\014)d Fj(;)166 4020 y Fg(xmin)p
+356 4020 V 64 w Fj(:=)27 b Fg(xmin)p 714 4020 V 55 w
+Fj(+)18 b Fg(trx)10 b Fj(;)50 b Fg(ymin)p 1217 4020 V
+65 w Fj(:=)28 b Fg(ymin)p 1578 4020 V 55 w Fj(+)18 b
+Fg(try)8 b Fj(;)166 4119 y Fg(delta)35 b Fj(=)27 b(10;)166
+4219 y Fg(pnmx)37 b Fj(=)27 b(round\()p Fg(xmin)p 926
+4219 V 55 w Fh(\003)18 b Fj(\()p Fg(r)l(es)7 b Fe(=)p
+Fj(72\))17 b Fh(\000)h Fg(delta)8 b Fj(\);)166 4318 y
+Fg(pnmy)35 b Fj(=)28 b(round)o(\(\()p Fg(p)l(ap)l(er)p
+974 4318 V 41 w(height)9 b Fe(=)p Fj(2)p Fe(:)p Fj(54)17
+b Fh(\003)h Fj(72)f Fh(\000)h Fg(ymin)p 1864 4318 V 56
+w Fh(\000)g Fe(h)p Fj(\))h Fh(\003)f Fj(\()p Fg(r)l(es)7
+b Fe(=)p Fj(72\))17 b Fh(\000)h Fg(delta)7 b Fj(\);)166
+4418 y Fg(pnmw)37 b Fj(=)27 b(round)o(\()p Fe(w)22 b
+Fh(\003)c Fj(\()p Fg(r)l(es)7 b Fe(=)p Fj(72\))17 b(+)h(2)g
+Fh(\003)g Fg(delta)7 b Fj(\);)166 4518 y Fg(pnmh)35 b
+Fj(=)27 b(round)o(\()p Fe(h)19 b Fh(\003)f Fj(\()p Fg(r)l(es)7
+b Fe(=)p Fj(72\))17 b(+)h(2)g Fh(\003)g Fg(delta)7 b
+Fj(\);)166 4617 y Fk(if)37 b Fg(show)p 447 4617 V 40
+w(animation)p 849 4617 V 38 w(p)l(ar)l(ameters)8 b Fj(:)332
+4717 y Fk(message)25 b Ff("pnmcut)41 b(parameters)f(\(with)h(-r36\):)g
+(")351 4817 y Fj(&)18 b(decimal)k Fg(pnmx)28 b Fj(&)18
+b Ff(")44 b(")18 b Fj(&)g(decimal)k Fg(pnmy)k Fj(&)19
+b Ff(")43 b(")351 4916 y Fj(&)18 b(decimal)k Fg(pnmw)28
+b Fj(&)18 b Ff(")43 b(")18 b Fj(&)g(decimal)23 b Fg(pnmh)7
+b Fj(;)166 5016 y Fk(\014)e Fj(;)166 5115 y Fg(write)p
+358 5115 V 37 w(script)k Fj(\(round)o(\()p Fg(trx)h Fj(\))p
+Fe(;)23 b Fj(round\()p Fg(try)7 b Fj(\))p Fe(;)332 5215
+y Fg(pnmx)j Fe(;)23 b Fg(pnmy)7 b Fe(;)24 b Fg(pnmw)9
+b Fe(;)23 b Fg(pnmh)7 b Fe(;)23 b Fg(r)l(es)6 b Fe(;)23
+b Fk(jobname)o Fe(;)g Ff("create_animation)o(.s)o(h")-6
+b Fj(\);)0 5315 y Fk(enddef)9 b Fj(;)1908 6139 y(19)p
+eop
+%%Page: 20 20
+20 19 bop 0 83 3900 4 v 0 164 a Fj(Creation)27 b(of)g(a)g(shell)h
+(script)f(to)h(automate)f(the)h(animation)p 0 207 V 0
+388 a(\045)g(This)f(is)h(UNIX)g(targetted)f(and)h(ma)n(y)f(need)g(to)h
+(b)r(e)g(customized.)0 537 y Fk(v)-5 b(ardef)38 b Fg(write)p
+486 537 26 4 v 37 w(script)8 b Fj(\()p Fk(expr)29 b Fg(trx)9
+b Fe(;)23 b Fg(try)7 b Fe(;)24 b Fg(xmin)5 b Fe(;)24
+b Fg(ymin)6 b Fe(;)23 b(w)r(;)h(h;)f Fg(r)l(es)7 b Fe(;)23
+b Fg(output)7 b Fe(;)23 b Fg(\014le)6 b Fj(\))28 b(=)166
+637 y Fk(sa)m(v)m(e)h Fe(s)p Fj(;)166 736 y Fk(string)g
+Fe(s)p Fj(;)166 836 y Fk(def)37 b Fg(write)p 521 836
+V 37 w(to)p 627 836 V 36 w(\014le)6 b Fj(\()p Fk(text)29
+b Fg(ar)l(g)7 b Fj(\))28 b(=)g Fk(write)f Fg(ar)l(g)f
+Fk(to)19 b Fg(\014le)6 b Fj(;)46 b Fk(enddef)9 b Fj(;)166
+936 y Fg(write)p 358 936 V 37 w(to)p 464 936 V 36 w(\014le)d
+Fj(\()p Ff("#!)43 b(/bin/sh")m Fj(\);)166 1035 y Fg(write)p
+358 1035 V 37 w(to)p 464 1035 V 36 w(\014le)6 b Fj(\()p
+Ff("")p Fj(\);)166 1135 y Fg(write)p 358 1135 V 37 w(to)p
+464 1135 V 36 w(\014le)g Fj(\()p Ff("/bin/rm)41 b(-f)i(")18
+b Fj(&)g Fg(output)25 b Fj(&)18 b Ff(".log")n Fj(\);)166
+1235 y Fg(write)p 358 1235 V 37 w(to)p 464 1235 V 36
+w(\014le)6 b Fj(\()p Ff("for)43 b(i)g(in)g(`ls)f(")18
+b Fj(&)g Fg(output)25 b Fj(&)18 b Ff(".*|)42 b(grep)g('")18
+b Fj(&)g Fg(output)25 b Fj(&)18 b Ff(".[0-9]'`;do")-5
+b Fj(\);)332 1334 y Fk(if)37 b(false)o Fj(:)28 b Ff("endfor")20
+b Fk(\014)t Fj(\045)28 b(inden)n(tation)g(hac)n(k)f(for)g(meta-mo)r
+(de.el)166 1434 y Fg(write)p 358 1434 V 37 w(to)p 464
+1434 V 36 w(\014le)6 b Fj(\()p Ff("echo)42 b($i")o Fj(\);)166
+1533 y Fg(write)p 358 1533 V 37 w(to)p 464 1533 V 36
+w(\014le)6 b Fj(\()p Ff("echo)42 b('=============='")-7
+b Fj(\);)166 1633 y Fe(s)28 b Fj(:=)f Ff("awk)42 b(<)h($i)g('{print})d
+(/^\045\045Page:)g(/{print)h(")18 b Fj(&)g Fg(ditto)5
+b Fj(;)166 1733 y Fe(s)28 b Fj(:=)f Fe(s)18 b Fj(&)g(decimal)23
+b Fg(trx)28 b Fj(&)18 b Ff(")43 b(")18 b Fj(&)g(decimal)23
+b Fg(try)i Fj(&)18 b Ff(")44 b(translate\\n")13 b Fj(&)18
+b Fg(ditto)24 b Fj(&)18 b Ff("}')43 b(>)g($i.ps")m Fj(;)166
+1832 y Fg(write)p 358 1832 V 37 w(to)p 464 1832 V 36
+w(\014le)6 b Fj(\()p Fe(s)p Fj(\);)332 1932 y(\045)28
+b(ghostscript)e(P)n(ostScript)h(in)n(to)g(ppm)166 2032
+y Fe(s)h Fj(:=)f Ff("gs)42 b(-sDEVICE=ppmraw)c(-sPAPERSIZE=a4)f
+(-dNOPAUSE)j(")p Fj(;)166 2131 y Fe(s)28 b Fj(:=)f Fe(s)18
+b Fj(&)g Ff("-r")f Fj(&)h(decimal)23 b Fg(r)l(es)i Fj(&)18
+b Ff(")43 b(-sOutputFile=$i.p)o(pm)37 b(-q)43 b(--)g($i.ps")m
+Fj(;)166 2231 y Fg(write)p 358 2231 V 37 w(to)p 464 2231
+V 36 w(\014le)6 b Fj(\()p Fe(s)p Fj(\);)166 2330 y Fg(write)p
+358 2330 V 37 w(to)p 464 2330 V 36 w(\014le)g Fj(\()p
+Ff("/bin/rm)41 b(-f)i($i.ps")m Fj(\);)332 2430 y(\045)28
+b(p)r(ossible)f(alternativ)n(e:)332 2530 y(\045)h Fe(s)g
+Fj(:=)f Ff("mogrify)40 b(-compress)g(-crop)h(")19 b Fj(&)f(decimal)o
+(\()p Fe(w)r Fj(\))i(&)e Ff("x")f Fj(&)h(decimal\()p
+Fe(h)p Fj(\);)332 2629 y(\045)28 b Fe(s)g Fj(:=)f Fe(s)18
+b Fj(&)g Ff("+")f Fj(&)h(decimal\()p Fg(xmin)6 b Fj(\))19
+b(&)f Ff("+")f Fj(&)h(decimal\()p Fg(ymin)7 b Fj(\);)332
+2729 y(\045)28 b Fe(s)g Fj(:=)f Fe(s)18 b Fj(&)g Ff(")43
+b(-colors)e(32)i(-format)e(gif)h($i.ppm")m Fj(;)166 2829
+y Fe(s)28 b Fj(:=)f Ff("ppmquant)40 b(32)j($i.ppm)e(|)i(pnmcut)e(")18
+b Fj(&)g(decimal\()p Fg(xmin)6 b Fj(\))19 b(&)f Ff(")43
+b(")18 b Fj(&)g(decimal\()p Fg(ymin)7 b Fj(\);)166 2928
+y Fe(s)28 b Fj(:=)f Fe(s)18 b Fj(&)g Ff(")44 b(")18 b
+Fj(&)g(decimal)o(\()p Fe(w)r Fj(\))i(&)e Ff(")43 b(")18
+b Fj(&)g(decimal\()p Fe(h)p Fj(\))h(&)f Ff(")43 b(|)g(")p
+Fj(;)166 3028 y Fe(s)28 b Fj(:=)f Fe(s)18 b Fj(&)g Ff("ppmtogif)40
+b(>)j(`expr)f($i.ppm)f(:)i('\\\(.*\\\)ppm'`gif")-6 b
+Fj(;)166 3127 y Fg(write)p 358 3127 V 37 w(to)p 464 3127
+V 36 w(\014le)6 b Fj(\()p Fe(s)p Fj(\);)166 3227 y Fg(write)p
+358 3227 V 37 w(to)p 464 3227 V 36 w(\014le)g Fj(\()p
+Ff("/bin/rm)41 b(-f)i($i.ppm")m Fj(\);)166 3327 y Fg(write)p
+358 3327 V 37 w(to)p 464 3327 V 36 w(\014le)6 b Fj(\()p
+Ff("done")n Fj(\);)166 3426 y Fg(write)p 358 3426 V 37
+w(to)p 464 3426 V 36 w(\014le)g Fj(\()p Ff("/bin/rm)41
+b(-f)i(")18 b Fj(&)g Fg(output)25 b Fj(&)18 b Ff(".gif")n
+Fj(\);)166 3526 y Fe(s)28 b Fj(:=)f Ff("gifmerge)40 b(-10)i(-l1000)f(")
+p Fj(;)166 3626 y Fe(s)28 b Fj(:=)f Fe(s)18 b Fj(&)g
+Fg(output)26 b Fj(&)18 b Ff(".*.gif)41 b(>)i(")18 b Fj(&)g
+Fg(output)25 b Fj(&)18 b Ff(".gif")n Fj(;)166 3725 y
+Fg(write)p 358 3725 V 37 w(to)p 464 3725 V 36 w(\014le)6
+b Fj(\()p Fe(s)p Fj(\);)166 3825 y Fg(write)p 358 3825
+V 37 w(to)p 464 3825 V 36 w(\014le)g Fj(\()p Ff("/bin/rm)41
+b(-f)i(")18 b Fj(&)g Fg(output)25 b Fj(&)18 b Ff(".*.gif")m
+Fj(\);)166 3924 y Fg(write)p 358 3924 V 37 w(to)p 464
+3924 V 36 w(\014le)6 b Fj(\()p Fg(EOF)12 b Fj(\);)28
+b(\045)g(end)g(of)f(\014le)0 4024 y Fk(enddef)9 b Fj(;)1908
+6139 y(20)p eop
+%%Page: 21 21
+21 20 bop 0 83 3900 4 v 0 164 a Fj(Standard)27 b(animation)g
+(de\014nitions)p 0 191 V 0 372 a(\045)h(These)f(de\014nitions)h(pro)r
+(duce)f Fg(one)34 b Fj(image)27 b(of)h(some)f(kind.)0
+521 y Fg(extr)l(a)p 189 521 26 4 v 36 w(end\014g)36 b
+Fj(:=)27 b Ff("compute_bbox")-6 b Fj(;)0 670 y(\045)28
+b(In)g(the)g(standard)e(animations,)h(the)h(observ)n(er)d(follo)n(ws)i
+(a)g(circle,)g(sho)n(wn)g(b)r(elo)n(w:)1054 2128 y @beginspecial
+-93 @llx -51 @lly 122 @urx 121 @ury 2150 @rwi @setspecial
+%%BeginDocument: vect-fig.17
+%*Font: cmmi10 9.96265 9.96265 6b:8007d
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 50.07999 62.92972 moveto
+36.41684 62.92972 22.81273 61.40129 9.35458 59.05609 curveto
+-5.27846 56.50616 -19.72882 52.99411 -33.87776 48.4729 curveto
+-45.68634 44.69954 -57.29236 40.2167 -68.03217 34.01608 curveto
+-74.78679 30.1163 -83.48495 27.2732 -83.95775 19.55927 curveto
+-84.22949 15.12558 -81.22559 11.34346 -77.38675 8.97607 curveto
+-69.35762 4.02454 -59.47366 5.10245 -50.07999 5.10245 curveto
+-36.41684 5.10245 -22.81273 6.63087 -9.35458 8.97607 curveto
+5.27846 11.526 19.72882 15.03806 33.87776 19.55927 curveto
+45.68634 23.33263 57.29236 27.81546 68.03217 34.01608 curveto
+74.78679 37.91586 83.48495 40.75897 83.95775 48.4729 curveto
+84.22949 52.90659 81.22559 56.6887 77.38675 59.05609 curveto
+69.35762 64.00763 59.47366 62.92972 50.07999 62.92972 curveto stroke
+ [] 0 setdash
+newpath 54.01132 63.66803 moveto
+52.697 63.41296 51.38556 63.15993 50.07999 62.92972 curveto
+51.38556 62.69951 52.70445 62.48877 54.02676 62.27893 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-25.04 -14.45682 lineto stroke
+newpath -21.97597 -11.88579 moveto
+-25.04 -14.45682 lineto
+-21.28142 -13.08879 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+34.01608 0 lineto stroke
+newpath 30.07712 -0.69453 moveto
+34.01608 0 lineto
+30.07712 0.69453 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 34.01608 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.69453 30.07712 moveto
+0 34.01608 lineto
+-0.69453 30.07712 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+-83.46582 -48.18889 lineto stroke
+newpath -80.40158 -45.61774 moveto
+-83.46582 -48.18889 lineto
+-79.707 -46.8208 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.3985 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+-92.15971 -50.33365 moveto
+(x) cmmi10 9.96265 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+-2.53566 116.3858 moveto
+(z) cmmi10 9.96265 fshow
+-24.3139 -23.67451 moveto
+(~) cmmi10 9.96265 fshow
+-22.94 -23.67451 moveto
+({) cmmi10 9.96265 fshow
+31.58937 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+32.10307 -10.1177 moveto
+(|) cmmi10 9.96265 fshow
+-9.007 31.77168 moveto
+(~) cmmi10 9.96265 fshow
+-8.5002 29.14268 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2278 a(\045)h(Standard)f(image)g(1:)36
+b(this)28 b(is)g(an)f(example)g(and)g(ma)n(y)g(b)r(e)h(adapted.)0
+2377 y(\045)g Fg(name)34 b Fj(is)27 b(an)h(ob)5 b(ject)27
+b(instance)0 2477 y Fk(def)37 b Fg(one)p 301 2477 V 37
+w(image)7 b Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)24
+b(i;)e(a;)h Fg(r)l(d)9 b Fe(;)23 b Fg(ang)8 b Fj(\))28
+b(=)166 2577 y Fk(b)s(egin\014g)5 b Fj(\()p Fe(i)p Fj(\);)332
+2676 y Fg(set)p 445 2676 V 38 w(p)l(oint)j Fj(\()p Fg(Obs)f
+Fe(;)23 b Fh(\000)p Fg(r)l(d)k Fh(\003)18 b Fj(cosd)o(\()p
+Fe(a)h Fh(\003)f Fg(ang)8 b Fj(\))p Fe(;)23 b Fh(\000)p
+Fg(r)l(d)k Fh(\003)18 b Fj(sind\()p Fe(a)h Fh(\003)f
+Fg(ang)7 b Fj(\))p Fe(;)24 b Fj(1\);)332 2776 y Fg(Obs)p
+480 2776 V 37 w(phi)38 b Fj(:=)27 b(90;)50 b Fg(Obs)p
+1072 2776 V 37 w(dist)36 b Fj(:=)27 b(2;)332 2875 y Fg(p)l(oint)p
+525 2875 V 39 w(of)p 641 2875 V 49 w(view)p 838 2875
+V 40 w(obj)13 b Fj(\()p Fg(name)7 b Fe(;)23 b Fj(1)p
+Fe(;)g Fg(Obs)p 1497 2875 V 37 w(phi)10 b Fj(\);)28 b(\045)g(\014x)f(p)
+r(oin)n(t)h(1)f(of)h(ob)5 b(ject)27 b Fg(name)332 2975
+y(dr)l(aw)p 517 2975 V 40 w(obj)13 b Fj(\()p Fg(name)7
+b Fj(\);)332 3075 y Fg(r)l(otate)p 552 3075 V 37 w(obj)p
+701 3075 V 44 w(pv)i Fj(\()p Fg(name)e Fe(;)23 b Fj(1)p
+Fe(;)g Fg(ve)l(ct)p 1335 3075 V 38 w(I)13 b Fe(;)23 b
+Fg(ang)8 b Fj(\);)332 3174 y Fg(dr)l(aw)p 517 3174 V
+40 w(p)l(oint)h Fj(\()p Fg(name)d Fe(;)23 b Fj(1\);)28
+b(\045)g(sho)n(w)f(the)h(rotation)e(p)r(oin)n(t)332 3274
+y Fg(dr)l(aw)p 517 3274 V 40 w(axes)7 b Fj(\()p Fg(r)l(e)l(d)i
+Fe(;)23 b Fg(gr)l(e)l(en)7 b Fe(;)23 b Fg(blue)6 b Fj(\);)166
+3374 y Fk(end\014g)q Fj(;)0 3473 y Fk(enddef)j Fj(;)0
+3623 y(\045)28 b(Standard)f(image)g(2:)36 b(this)28 b(is)g(an)f
+(example)g(and)g(ma)n(y)g(b)r(e)h(adapted.)0 3722 y(\045)g
+Fg(name)p 303 3722 V 37 w(a)34 b Fj(and)28 b Fg(name)p
+773 3722 V 37 w(b)33 b Fj(are)26 b(ob)5 b(ject)28 b(instances.)0
+3822 y Fk(def)37 b Fg(one)p 301 3822 V 37 w(image)p 549
+3822 V 38 w(two)p 711 3822 V 36 w(obje)l(cts)7 b Fj(\()p
+Fk(expr)29 b Fg(name)p 1436 3822 V 37 w(a)7 b Fe(;)23
+b Fg(name)p 1763 3822 V 37 w(b)5 b Fe(;)24 b(i;)e(a;)h
+Fg(r)l(d)9 b Fe(;)23 b Fg(ang)8 b Fj(\))28 b(=)166 3922
+y Fk(b)s(egin\014g)5 b Fj(\()p Fe(i)p Fj(\);)332 4021
+y Fg(set)p 445 4021 V 38 w(p)l(oint)j Fj(\()p Fg(Obs)f
+Fe(;)23 b Fh(\000)p Fg(r)l(d)k Fh(\003)18 b Fj(cosd)o(\()p
+Fe(a)h Fh(\003)f Fg(ang)8 b Fj(\))p Fe(;)23 b Fh(\000)p
+Fg(r)l(d)k Fh(\003)18 b Fj(sind\()p Fe(a)h Fh(\003)f
+Fg(ang)7 b Fj(\))p Fe(;)24 b Fj(1\);)332 4121 y Fg(Obs)p
+480 4121 V 37 w(phi)38 b Fj(:=)27 b(90;)50 b Fg(Obs)p
+1072 4121 V 37 w(dist)36 b Fj(:=)27 b(2;)332 4220 y Fg(p)l(oint)p
+525 4220 V 39 w(of)p 641 4220 V 49 w(view)p 838 4220
+V 40 w(obj)13 b Fj(\()p Fg(name)p 1219 4220 V 38 w(a)7
+b Fe(;)23 b Fj(1)p Fe(;)f Fg(Obs)p 1576 4220 V 37 w(phi)10
+b Fj(\);)28 b(\045)g(\014x)g(p)r(oin)n(t)g(1)f(of)g(ob)5
+b(ject)28 b Fg(name)p 2856 4220 V 37 w(a)332 4320 y(dr)l(aw)p
+517 4320 V 40 w(obj)13 b Fj(\()p Fg(name)p 898 4320 V
+38 w(a)7 b Fj(\);)51 b Fg(dr)l(aw)p 1264 4320 V 40 w(obj)13
+b Fj(\()p Fg(name)p 1646 4320 V 37 w(b)6 b Fj(\);)332
+4420 y Fg(r)l(otate)p 552 4420 V 37 w(obj)p 701 4420
+V 44 w(pv)j Fj(\()p Fg(name)p 1054 4420 V 37 w(a)e Fe(;)23
+b Fj(1)p Fe(;)g Fg(ve)l(ct)p 1414 4420 V 38 w(I)13 b
+Fe(;)23 b Fg(ang)8 b Fj(\);)332 4519 y Fg(r)l(otate)p
+552 4519 V 37 w(obj)p 701 4519 V 44 w(pv)h Fj(\()p Fg(name)p
+1054 4519 V 37 w(b)d Fe(;)23 b Fj(13)p Fe(;)f Fg(ve)l(ct)p
+1450 4519 V 38 w(J)12 b Fe(;)23 b Fh(\000)p Fg(ang)7
+b Fj(\);)498 4619 y(\045)p Fg(r)l(otate)p 787 4619 V
+37 w(obj)p 936 4619 V 44 w(pp)f Fj(\()p Fg(name)p 1290
+4619 V 37 w(b)g Fe(;)23 b Fj(13)p Fe(;)f Fj(7)p Fe(;)g
+Fh(\000)p Fg(ang)8 b Fj(\);)332 4719 y Fg(dr)l(aw)p 517
+4719 V 40 w(p)l(oint)h Fj(\()p Fg(name)p 969 4719 V 37
+w(a)e Fe(;)23 b Fj(1\);)k(\045)h(sho)n(w)f(the)h(rotation)e(p)r(oin)n
+(t)332 4818 y Fg(dr)l(aw)p 517 4818 V 40 w(axes)7 b Fj(\()p
+Fg(r)l(e)l(d)i Fe(;)23 b Fg(gr)l(e)l(en)7 b Fe(;)23 b
+Fg(blue)6 b Fj(\);)166 4918 y Fk(end\014g)q Fj(;)0 5017
+y Fk(enddef)j Fj(;)1908 6139 y(21)p eop
+%%Page: 22 22
+22 21 bop 0 83 a Fj(\045)28 b(Standard)f(image)g(3:)36
+b(this)28 b(is)g(an)f(example)g(and)g(ma)n(y)g(b)r(e)h(adapted.)0
+183 y(\045)g Fg(name)p 303 183 26 4 v 37 w(a)7 b Fj(,)27
+b Fg(name)p 634 183 V 37 w(b)33 b Fj(and)28 b Fg(name)p
+1099 183 V 37 w(c)k Fj(are)27 b(ob)5 b(ject)27 b(instances.)0
+282 y Fk(def)37 b Fg(one)p 301 282 V 37 w(image)p 549
+282 V 38 w(thr)l(e)l(e)p 760 282 V 37 w(obje)l(cts)7
+b Fj(\()p Fk(expr)29 b Fg(name)p 1485 282 V 37 w(a)7
+b Fe(;)23 b Fg(name)p 1812 282 V 37 w(b)5 b Fe(;)23 b
+Fg(name)p 2133 282 V 37 w(c)5 b Fe(;)23 b(i;)g(a;)g Fg(r)l(d)9
+b Fe(;)23 b Fg(ang)8 b Fj(\))27 b(=)166 382 y Fk(b)s(egin\014g)5
+b Fj(\()p Fe(i)p Fj(\);)332 482 y Fg(set)p 445 482 V
+38 w(p)l(oint)j Fj(\()p Fg(Obs)f Fe(;)23 b Fh(\000)p
+Fg(r)l(d)k Fh(\003)18 b Fj(cosd)o(\()p Fe(a)h Fh(\003)f
+Fg(ang)8 b Fj(\))p Fe(;)23 b Fh(\000)p Fg(r)l(d)k Fh(\003)18
+b Fj(sind\()p Fe(a)h Fh(\003)f Fg(ang)7 b Fj(\))p Fe(;)24
+b Fj(1\);)332 581 y Fg(Obs)p 480 581 V 37 w(phi)38 b
+Fj(:=)27 b(90;)50 b Fg(Obs)p 1072 581 V 37 w(dist)36
+b Fj(:=)27 b(2;)51 b Fg(h)p 1546 581 V 37 w(\014eld)37
+b Fj(:=)27 b(100;)49 b Fg(v)p 2123 581 V 40 w(\014eld)37
+b Fj(:=)27 b(150;)332 681 y Fg(p)l(oint)p 525 681 V 39
+w(of)p 641 681 V 49 w(view)p 838 681 V 40 w(obj)13 b
+Fj(\()p Fg(name)p 1219 681 V 38 w(a)7 b Fe(;)23 b Fj(1)p
+Fe(;)f Fg(Obs)p 1576 681 V 37 w(phi)10 b Fj(\);)28 b(\045)g(\014x)g(p)r
+(oin)n(t)g(1)f(of)g(ob)5 b(ject)28 b Fg(name)p 2856 681
+V 37 w(a)332 780 y(dr)l(aw)p 517 780 V 40 w(obj)13 b
+Fj(\()p Fg(name)p 898 780 V 38 w(a)7 b Fj(\);)51 b Fg(dr)l(aw)p
+1264 780 V 40 w(obj)13 b Fj(\()p Fg(name)p 1646 780 V
+37 w(b)6 b Fj(\);)51 b Fg(dr)l(aw)p 2007 780 V 40 w(obj)13
+b Fj(\()p Fg(name)p 2388 780 V 37 w(c)5 b Fj(\);)332
+880 y Fg(v)p 384 880 V 40 w(a)34 b Fj(:=)28 b Fg(new)p
+756 880 V 39 w(ve)l(ct)8 b Fj(;)332 980 y Fg(ve)l(ct)p
+483 980 V 38 w(def)19 b Fj(\()p Fg(v)p 717 980 V 40 w(a)7
+b Fe(;)23 b(:)p Fj(03)18 b Fh(\003)f Fj(cosd\()p Fh(\000)p
+Fe(a)h Fh(\003)g Fg(ang)26 b Fj(+)18 b(90\))p Fe(;)k(:)p
+Fj(03)c Fh(\003)g Fj(sind\()p Fh(\000)p Fe(a)g Fh(\003)g
+Fg(ang)26 b Fj(+)18 b(90\))p Fe(;)23 b Fj(0\);)332 1079
+y Fg(tr)l(anslate)p 654 1079 V 37 w(obj)13 b Fj(\()p
+Fg(name)p 1036 1079 V 37 w(c)5 b Fe(;)23 b Fg(v)p 1203
+1079 V 40 w(a)7 b Fj(\);)332 1179 y Fg(fr)l(e)l(e)p 471
+1179 V 37 w(ve)l(ct)h Fj(\()p Fg(v)p 728 1179 V 40 w(a)f
+Fj(\);)332 1279 y Fg(r)l(otate)p 552 1279 V 37 w(obj)p
+701 1279 V 44 w(pv)i Fj(\()p Fg(name)p 1054 1279 V 37
+w(a)e Fe(;)23 b Fj(1)p Fe(;)g Fg(ve)l(ct)p 1414 1279
+V 38 w(I)13 b Fe(;)23 b Fg(ang)8 b Fj(\);)332 1378 y
+Fg(r)l(otate)p 552 1378 V 37 w(obj)p 701 1378 V 44 w(pv)h
+Fj(\()p Fg(name)p 1054 1378 V 37 w(b)d Fe(;)23 b Fj(13)p
+Fe(;)f Fg(ve)l(ct)p 1450 1378 V 38 w(J)12 b Fe(;)23 b
+Fh(\000)p Fg(ang)7 b Fj(\);)498 1478 y(\045)p Fg(r)l(otate)p
+787 1478 V 37 w(obj)p 936 1478 V 44 w(pp)f Fj(\()p Fg(name)p
+1290 1478 V 37 w(b)g Fe(;)23 b Fj(13)p Fe(;)f Fj(7)p
+Fe(;)g Fh(\000)p Fg(ang)8 b Fj(\);)332 1577 y Fg(dr)l(aw)p
+517 1577 V 40 w(p)l(oint)h Fj(\()p Fg(name)p 969 1577
+V 37 w(a)e Fe(;)23 b Fj(1\);)k(\045)h(sho)n(w)f(the)h(rotation)e(p)r
+(oin)n(t)332 1677 y Fg(dr)l(aw)p 517 1677 V 40 w(axes)7
+b Fj(\()p Fg(r)l(e)l(d)i Fe(;)23 b Fg(gr)l(e)l(en)7 b
+Fe(;)23 b Fg(blue)6 b Fj(\);)166 1777 y Fk(end\014g)q
+Fj(;)0 1876 y Fk(enddef)j Fj(;)0 2026 y(\045)28 b(Standard)f(image)g
+(4:)36 b(this)28 b(is)g(an)f(example)g(and)g(ma)n(y)g(b)r(e)h(adapted.)
+0 2125 y(\045)g Fg(name)p 303 2125 V 37 w(a)34 b Fj(and)28
+b Fg(name)p 773 2125 V 37 w(b)33 b Fj(are)26 b(ob)5 b(ject)28
+b(instances.)0 2225 y Fk(def)37 b Fg(one)p 301 2225 V
+37 w(image)p 549 2225 V 38 w(two)p 711 2225 V 36 w(identic)l(al)p
+1053 2225 V 40 w(obje)l(cts)8 b Fj(\()p Fk(expr)29 b
+Fg(name)p 1779 2225 V 37 w(a)6 b Fe(;)24 b Fg(name)p
+2106 2225 V 36 w(b)6 b Fe(;)23 b(i;)g(a;)g Fg(r)l(d)9
+b Fe(;)23 b Fg(ang)7 b Fj(\))28 b(=)166 2325 y Fk(b)s(egin\014g)5
+b Fj(\()p Fe(i)p Fj(\);)332 2424 y Fg(set)p 445 2424
+V 38 w(p)l(oint)j Fj(\()p Fg(Obs)f Fe(;)23 b Fh(\000)p
+Fg(r)l(d)k Fh(\003)18 b Fj(cosd)o(\()p Fe(a)h Fh(\003)f
+Fg(ang)8 b Fj(\))p Fe(;)23 b Fh(\000)p Fg(r)l(d)k Fh(\003)18
+b Fj(sind\()p Fe(a)h Fh(\003)f Fg(ang)7 b Fj(\))p Fe(;)24
+b Fj(2\);)332 2524 y Fg(Obs)p 480 2524 V 37 w(phi)38
+b Fj(:=)27 b(90;)50 b Fg(Obs)p 1072 2524 V 37 w(dist)36
+b Fj(:=)27 b(2;)332 2623 y Fg(p)l(oint)p 525 2623 V 39
+w(of)p 641 2623 V 49 w(view)p 838 2623 V 40 w(obj)13
+b Fj(\()p Fg(name)p 1219 2623 V 38 w(a)7 b Fe(;)23 b
+Fj(1)p Fe(;)f Fg(Obs)p 1576 2623 V 37 w(phi)10 b Fj(\);)28
+b(\045)g(\014x)g(p)r(oin)n(t)g(1)f(of)g(ob)5 b(ject)28
+b Fg(name)p 2856 2623 V 37 w(a)332 2723 y(dr)l(aw)p 517
+2723 V 40 w(obj)13 b Fj(\()p Fg(name)p 898 2723 V 38
+w(a)7 b Fj(\);)51 b Fg(dr)l(aw)p 1264 2723 V 40 w(obj)13
+b Fj(\()p Fg(name)p 1646 2723 V 37 w(b)6 b Fj(\);)332
+2823 y Fg(r)l(otate)p 552 2823 V 37 w(obj)p 701 2823
+V 44 w(pv)j Fj(\()p Fg(name)p 1054 2823 V 37 w(a)e Fe(;)23
+b Fj(1)p Fe(;)g Fg(ve)l(ct)p 1414 2823 V 38 w(I)13 b
+Fe(;)23 b Fg(ang)8 b Fj(\);)332 2922 y Fg(r)l(otate)p
+552 2922 V 37 w(obj)p 701 2922 V 44 w(pv)h Fj(\()p Fg(name)p
+1054 2922 V 37 w(b)d Fe(;)23 b Fj(13)p Fe(;)f Fg(ve)l(ct)p
+1450 2922 V 38 w(J)12 b Fe(;)23 b Fh(\000)p Fg(ang)7
+b Fj(\);)498 3022 y(\045)p Fg(r)l(otate)p 787 3022 V
+37 w(obj)p 936 3022 V 44 w(pp)f Fj(\()p Fg(name)p 1290
+3022 V 37 w(a)h Fe(;)23 b Fj(13)p Fe(;)f Fj(7)p Fe(;)h
+Fh(\000)p Fg(ang)7 b Fj(\);)332 3122 y Fg(dr)l(aw)p 517
+3122 V 40 w(p)l(oint)i Fj(\()p Fg(name)p 969 3122 V 37
+w(a)e Fe(;)23 b Fj(1\);)k(\045)h(sho)n(w)f(the)h(rotation)e(p)r(oin)n
+(t)332 3221 y Fg(dr)l(aw)p 517 3221 V 40 w(axes)7 b Fj(\()p
+Fg(r)l(e)l(d)i Fe(;)23 b Fg(gr)l(e)l(en)7 b Fe(;)23 b
+Fg(blue)6 b Fj(\);)166 3321 y Fk(end\014g)q Fj(;)0 3421
+y Fk(enddef)j Fj(;)1908 6139 y(22)p eop
+%%Page: 23 23
+23 22 bop 0 83 a Fj(\045)28 b(An)g(animation)f(is)g(a)h(series)e(of)i
+(images,)e(and)i(these)f(series)g(are)g(pro)r(duced)g(here.)0
+232 y(\045)h(Standard)f(animation)g(1)0 332 y(\045)h
+Fg(name)34 b Fj(is)27 b(a)h(class)e(name)0 432 y Fk(def)37
+b Fg(animate)p 464 432 26 4 v 37 w(obje)l(ct)9 b Fj(\()p
+Fk(expr)29 b Fg(name)6 b Fe(;)23 b Fg(imin)7 b Fe(;)23
+b Fg(imax)10 b Fe(;)24 b Fg(index)10 b Fj(\))28 b(=)166
+531 y Fk(n)m(umeric)f Fg(ang)8 b Fj(;)50 b Fg(ang)36
+b Fj(=)27 b(360)p Fe(=)p Fj(\()p Fg(imax)g Fh(\000)18
+b Fg(imin)25 b Fj(+)18 b(1\);)166 631 y Fg(assign)p 397
+631 V 38 w(obj)13 b Fj(\()p Ff("obj")n Fe(;)23 b Fg(name)6
+b Fj(\);)166 731 y Fk(for)28 b Fe(i)f Fj(:=)h Fg(imin)d
+Fk(upto)18 b Fg(imax)11 b Fj(:)27 b Fg(one)p 1254 731
+V 38 w(image)7 b Fj(\()p Ff("obj")n Fe(;)23 b(i)18 b
+Fj(+)g Fg(index)11 b Fe(;)23 b(i;)f Fj(5)p Fe(;)h Fg(ang)8
+b Fj(\);)46 b Fk(endfor)p Fj(;)166 830 y Fg(show)p 354
+830 V 41 w(animation)p 757 830 V 37 w(bb)l(ox)11 b Fj(;)0
+930 y Fk(enddef)e Fj(;)0 1079 y(\045)28 b(Standard)f(animation)g(2)0
+1179 y(\045)h Fg(name)p 303 1179 V 37 w(a)34 b Fj(and)28
+b Fg(name)p 773 1179 V 37 w(b)33 b Fj(are)26 b(class)h(names)0
+1279 y Fk(def)37 b Fg(animate)p 464 1279 V 37 w(two)p
+625 1279 V 36 w(obje)l(cts)8 b Fj(\()p Fk(expr)28 b Fg(name)p
+1350 1279 V 37 w(a)7 b Fe(;)23 b Fg(name)p 1677 1279
+V 37 w(b)6 b Fe(;)23 b Fg(imin)7 b Fe(;)23 b Fg(imax)10
+b Fe(;)23 b Fg(index)11 b Fj(\))28 b(=)166 1378 y Fk(n)m(umeric)f
+Fg(ang)8 b Fj(;)50 b Fg(ang)36 b Fj(=)27 b(360)p Fe(=)p
+Fj(\()p Fg(imax)g Fh(\000)18 b Fg(imin)25 b Fj(+)18 b(1\);)166
+1478 y Fg(assign)p 397 1478 V 38 w(obj)13 b Fj(\()p Ff("obja")n
+Fe(;)23 b Fg(name)p 1088 1478 V 37 w(a)6 b Fj(\);)52
+b Fg(assign)p 1500 1478 V 37 w(obj)13 b Fj(\()p Ff("objb")n
+Fe(;)23 b Fg(name)p 2190 1478 V 37 w(b)6 b Fj(\);)166
+1577 y Fg(tr)l(anslate)p 488 1577 V 37 w(obj)13 b Fj(\()p
+Ff("objb")n Fe(;)23 b Fg(ve)l(ct)p 1123 1577 V 38 w(K)12
+b Fj(\);)51 b Fg(tr)l(anslate)p 1652 1577 V 37 w(obj)13
+b Fj(\()p Ff("objb")n Fe(;)23 b Fg(ve)l(ct)p 2287 1577
+V 38 w(K)12 b Fj(\);)166 1677 y Fk(for)28 b Fe(i)f Fj(:=)h
+Fg(imin)d Fk(upto)18 b Fg(imax)11 b Fj(:)332 1777 y Fg(one)p
+470 1777 V 37 w(image)p 718 1777 V 38 w(two)p 880 1777
+V 36 w(obje)l(cts)d Fj(\()p Ff("obja")m Fe(;)24 b Ff("objb")m
+Fe(;)f(i)18 b Fj(+)g Fg(index)11 b Fe(;)23 b(i;)f Fj(5)p
+Fe(;)h Fg(ang)8 b Fj(\);)166 1876 y Fk(endfor)p Fj(;)166
+1976 y Fg(show)p 354 1976 V 41 w(animation)p 757 1976
+V 37 w(bb)l(ox)j Fj(;)0 2076 y Fk(enddef)e Fj(;)0 2225
+y(\045)28 b(Standard)f(animation)g(3)0 2325 y(\045)h
+Fg(name)p 303 2325 V 37 w(a)7 b Fj(,)27 b Fg(name)p 634
+2325 V 37 w(b)33 b Fj(and)28 b Fg(name)p 1099 2325 V
+37 w(c)k Fj(are)27 b(class)g(names)0 2424 y Fk(v)-5 b(ardef)38
+b Fg(animate)p 595 2424 V 37 w(thr)l(e)l(e)p 805 2424
+V 37 w(obje)l(cts)7 b Fj(\()p Fk(expr)29 b Fg(name)p
+1530 2424 V 37 w(a)7 b Fe(;)23 b Fg(name)p 1857 2424
+V 37 w(b)5 b Fe(;)23 b Fg(name)p 2178 2424 V 37 w(c)5
+b Fe(;)23 b Fg(imin)7 b Fe(;)23 b Fg(imax)11 b Fe(;)23
+b Fg(index)10 b Fj(\))28 b(=)166 2524 y Fk(n)m(umeric)f
+Fg(ang)8 b Fj(;)50 b Fg(ang)36 b Fj(=)27 b(360)p Fe(=)p
+Fj(\()p Fg(imax)g Fh(\000)18 b Fg(imin)25 b Fj(+)18 b(1\);)166
+2623 y Fg(assign)p 397 2623 V 38 w(obj)13 b Fj(\()p Ff("obja")n
+Fe(;)23 b Fg(name)p 1088 2623 V 37 w(a)6 b Fj(\);)52
+b Fg(assign)p 1500 2623 V 37 w(obj)13 b Fj(\()p Ff("objb")n
+Fe(;)23 b Fg(name)p 2190 2623 V 37 w(b)6 b Fj(\);)166
+2723 y Fg(assign)p 397 2723 V 38 w(obj)13 b Fj(\()p Ff("objc")n
+Fe(;)23 b Fg(name)p 1088 2723 V 37 w(c)5 b Fj(\);)166
+2823 y Fg(sc)l(ale)p 346 2823 V 38 w(obj)13 b Fj(\()p
+Ff("objb")m Fe(;)24 b(:)p Fj(7\);)166 2922 y Fk(n)m(umeric)j
+Fg(v)p 581 2922 V 40 w(a)6 b Fj(;)51 b Fg(v)p 781 2922
+V 40 w(a)34 b Fj(:=)28 b Fg(new)p 1153 2922 V 39 w(ve)l(ct)8
+b Fj(;)166 3022 y Fg(ve)l(ct)p 317 3022 V 38 w(def)p
+471 3022 V 50 w(ve)l(ct)f Fj(\()p Fg(v)p 727 3022 V 40
+w(a)g Fe(;)23 b Fg(ve)l(ct)p 998 3022 V 39 w(K)12 b Fj(\);)51
+b Fg(ve)l(ct)p 1357 3022 V 38 w(mult)7 b Fj(\()p Fg(v)p
+1636 3022 V 40 w(a)g Fe(;)23 b Fg(v)p 1808 3022 V 40
+w(a)6 b Fe(;)24 b Fj(4\);)50 b Fg(put)p 2204 3022 V 38
+w(obj)13 b Fj(\()p Ff("objb")n Fe(;)23 b Fg(v)p 2739
+3022 V 40 w(a)7 b Fe(;)23 b Fj(1)p Fe(;)f Fj(0)p Fe(;)h
+Fj(0)p Fe(;)g Fj(0\);)166 3122 y Fg(fr)l(e)l(e)p 305
+3122 V 37 w(ve)l(ct)8 b Fj(\()p Fg(v)p 561 3122 V 40
+w(a)f Fj(\);)166 3221 y Fg(sc)l(ale)p 346 3221 V 38 w(obj)13
+b Fj(\()p Ff("objc")m Fe(;)24 b(:)p Fj(5\);)166 3321
+y Fg(tr)l(anslate)p 488 3321 V 37 w(obj)13 b Fj(\()p
+Ff("objc")n Fe(;)23 b Fg(ve)l(ct)p 1123 3321 V 38 w(K)12
+b Fj(\);)51 b Fg(tr)l(anslate)p 1652 3321 V 37 w(obj)13
+b Fj(\()p Ff("objc")n Fe(;)23 b Fg(ve)l(ct)p 2287 3321
+V 38 w(K)12 b Fj(\);)166 3421 y Fk(for)28 b Fe(i)f Fj(:=)h
+Fg(imin)d Fk(upto)18 b Fg(imax)11 b Fj(:)332 3520 y Fg(one)p
+470 3520 V 37 w(image)p 718 3520 V 38 w(thr)l(e)l(e)p
+929 3520 V 37 w(obje)l(cts)c Fj(\()p Ff("obja")n Fe(;)23
+b Ff("objb")n Fe(;)g Ff("objc")m Fe(;)h(i)18 b Fj(+)g
+Fg(index)10 b Fe(;)23 b(i;)g Fj(7)p Fe(;)f Fg(ang)8 b
+Fj(\);)166 3620 y Fk(endfor)p Fj(;)166 3719 y Fg(show)p
+354 3719 V 41 w(animation)p 757 3719 V 37 w(bb)l(ox)j
+Fj(;)0 3819 y Fk(enddef)e Fj(;)0 3968 y(\045)28 b(Standard)f(animation)
+g(4)0 4068 y(\045)h Fg(name)34 b Fj(is)27 b(a)h(class)e(name)0
+4168 y Fk(def)37 b Fg(animate)p 464 4168 V 37 w(two)p
+625 4168 V 36 w(identic)l(al)p 967 4168 V 41 w(obje)l(cts)7
+b Fj(\()p Fk(expr)29 b Fg(name)6 b Fe(;)24 b Fg(imin)6
+b Fe(;)24 b Fg(imax)10 b Fe(;)23 b Fg(index)10 b Fj(\))28
+b(=)166 4267 y Fk(n)m(umeric)f Fg(ang)8 b Fj(;)50 b Fg(ang)36
+b Fj(=)27 b(360)p Fe(=)p Fj(\()p Fg(imax)g Fh(\000)18
+b Fg(imin)25 b Fj(+)18 b(1\);)166 4367 y Fg(assign)p
+397 4367 V 38 w(obj)13 b Fj(\()p Ff("obja")n Fe(;)23
+b Fg(name)6 b Fj(\);)51 b Fg(assign)p 1420 4367 V 38
+w(obj)13 b Fj(\()p Ff("objb")n Fe(;)23 b Fg(name)6 b
+Fj(\);)166 4467 y Fg(tr)l(anslate)p 488 4467 V 37 w(obj)13
+b Fj(\()p Ff("objb")n Fe(;)23 b Fg(ve)l(ct)p 1123 4467
+V 38 w(K)12 b Fj(\);)51 b Fg(tr)l(anslate)p 1652 4467
+V 37 w(obj)13 b Fj(\()p Ff("objb")n Fe(;)23 b Fg(ve)l(ct)p
+2287 4467 V 38 w(K)12 b Fj(\);)166 4566 y Fk(for)28 b
+Fe(i)f Fj(:=)h Fg(imin)d Fk(upto)18 b Fg(imax)11 b Fj(:)332
+4666 y Fg(one)p 470 4666 V 37 w(image)p 718 4666 V 38
+w(two)p 880 4666 V 36 w(identic)l(al)p 1222 4666 V 41
+w(obje)l(cts)c Fj(\()p Ff("obja")n Fe(;)23 b Ff("objb")n
+Fe(;)g(i)18 b Fj(+)g Fg(index)10 b Fe(;)23 b(i;)g Fj(10)p
+Fe(;)f Fg(ang)8 b Fj(\);)166 4765 y Fk(endfor)p Fj(;)166
+4865 y Fg(show)p 354 4865 V 41 w(animation)p 757 4865
+V 37 w(bb)l(ox)j Fj(;)0 4965 y Fk(enddef)e Fj(;)0 5114
+y Fk(endinput)1908 6139 y Fj(23)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.tex b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.tex
new file mode 100644
index 0000000000..efb5de4d8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/3d-1.0.tex
@@ -0,0 +1,1257 @@
+\input mftmac
+\def\9{$\futurelet\next\doit}
+\let\[=\relax
+\def\doit{\ifx\next\[\def\next{\hfill{\rm\%}}%
+ \else\ifx\next\ \def\next{\qquad{\rm\%}}%
+ \else\def\next{{\rm\%}}\fi\fi\next}
+\input epsf
+\def\newpage{\vfill\eject}
+\advance\vsize1in
+\let\ora\overrightarrow
+\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+\def\figure#1{\par\centerline{\epsfbox{#1}}}
+\title{{\bf 3D.MP : 3-DIMENSIONAL REPRESENTATIONS
+ AND ANIMATIONS IN METAPOST}}
+\BL
+ version 1.0, 8 April 1998
+ {\bf Denis Roegel} ({\tt roegel@loria.fr})
+\BL
+ This package provides definitions enabling the manipulation
+ and animation of 3-dimensional objects.
+ Such objects can be included in a \TeX{} file or used on web pages
+ for instance. See the documentation enclosed in the distribution for
+ more details.
+\BL
+ Thanks to John Hobby and Ulrik Vieth for helpful hints.
+\BL
+ LIMITATIONS:
+\BL
+ $-$ an object can not include \TeX{} labels; to overcome this limitation
+ would need to wrap the metapost output with dvips so that the
+ necessary fonts are loaded (easy to do, but not done here)
+\BL
+ PROJECTS FOR THE FUTURE:
+\BL
+ $-$ take light sources into account and show shadows and darker faces
+\BL
+ $-$ handle overlapping of objects ({\it obj\_name\/} can be used when
+ going through all faces)
+\BL
+$\2{if}\1{known}\\{three\_d\_version}\?:$\par
+\quad\quad$\2{expandafter}\5{endinput}\9 avoids loading this package twice\par
+$\2{fi};$\par
+\BL
+$\2{message}\7"*** 3d, version 1.0 (c) D. Roegel, 8 April 1998 ***";$\par
+$\2{numeric}\\{three\_d\_version};$\par
+$\\{three\_d\_version}=1.0;$\par
+\BL
+\newpage
+\title{Vector operations}
+\BL
+$\9 definition of vector $i$ by its coordinates\par
+$\2{def}\\{vect\_def}(\2{expr}i,\\{xi},\\{yi},\\{zi})=\\{vect}[i]x:=\\{xi};\ %
+\\{vect}[i]y:=\\{yi};\ \\{vect}[i]z:=\\{zi};\3{enddef};$\par
+\BL
+$\9 a point is stored as a vector\par
+$\2{let}\\{set\_point}=\\{vect\_def};$\par
+\BL
+$\9 $\\{set\_obj\_point}$ is like $\\{set\_point}$, but the first parameter\par
+$\9 is a local point number\par
+$\2{def}\\{set\_obj\_point}(\2{expr}i,\\{xi},\\{yi},\\{zi})=\\{set\_point}(%
+\\{pnt}(i),\\{xi},\\{yi},\\{zi})\3{enddef};$\par
+\BL
+$\9 definition of a vector by an other vector\par
+$\2{def}\\{vect\_def\_vect}(\2{expr}i,j)=$\par
+\quad\quad$\\{vect}[i]x:=\\{vect}[j]x;\ \\{vect}[i]y:=\\{vect}[j]y;\ %
+\\{vect}[i]z:=\\{vect}[j]z;$\par
+$\!\3{enddef};$\par
+\BL
+$\9 vector sum: $\\{vect}[k]$ $\leftarrow$ $\\{vect}[i]$$+$$\\{vect}[j]$\par
+$\2{def}\\{vect\_sum}(\2{expr}k,i,j)=$\par
+\quad\quad$\\{vect}[k]x:=\\{vect}[i]x+\\{vect}[j]x;$\par
+\quad\quad$\\{vect}[k]y:=\\{vect}[i]y+\\{vect}[j]y;$\par
+\quad\quad$\\{vect}[k]z:=\\{vect}[i]z+\\{vect}[j]z;$\par
+$\!\3{enddef};$\par
+\BL
+$\9 vector translation: $\\{vect}[i]$ $\leftarrow$ $\\{vect}[i]$$+$$%
+\\{vect}[v]$\par
+$\2{def}\\{vect\_translate}(\2{expr}i,v)=\\{vect\_sum}(i,i,v)\3{enddef};$\par
+\BL
+$\9 vector difference: $\\{vect}[k]$ $\leftarrow$ $\\{vect}[i]$$-$$\\{vect}[j]$%
+\par
+$\2{def}\\{vect\_diff}(\2{expr}k,i,j)=$\par
+\quad\quad$\\{vect}[k]x:=\\{vect}[i]x-\\{vect}[j]x;$\par
+\quad\quad$\\{vect}[k]y:=\\{vect}[i]y-\\{vect}[j]y;$\par
+\quad\quad$\\{vect}[k]z:=\\{vect}[i]z-\\{vect}[j]z;$\par
+$\!\3{enddef};$\par
+\BL
+$\9 dot product of $\\{vect}[i]$ and $\\{vect}[j]$\par
+$\2{vardef}\\{vect\_dprod}(\2{expr}i,j)=$\par
+\quad\quad$(\\{vect}[i]x\ast \\{vect}[j]x+\\{vect}[i]y\ast \\{vect}[j]y+%
+\\{vect}[i]z\ast \\{vect}[j]z)$\par
+$\!\3{enddef};$\par
+\BL
+$\9 modulus of $\\{vect}[i]$\par
+$\2{vardef}\\{vect\_mod}(\2{expr}i)=\1{sqrt}(\\{vect\_dprod}(i,i))\3{enddef};$%
+\par
+\BL
+$\9 vector product: $\\{vect}[k]$ $\leftarrow$ $\\{vect}[i]$ $\land$ $%
+\\{vect}[j]$\par
+$\2{def}\\{vect\_prod}(\2{expr}k,i,j)=$\par
+\quad\quad$\\{vect}[k]x:=\\{vect}[i]y\ast \\{vect}[j]z-\\{vect}[i]z\ast %
+\\{vect}[j]y;$\par
+\quad\quad$\\{vect}[k]y:=\\{vect}[i]z\ast \\{vect}[j]x-\\{vect}[i]x\ast %
+\\{vect}[j]z;$\par
+\quad\quad$\\{vect}[k]z:=\\{vect}[i]x\ast \\{vect}[j]y-\\{vect}[i]y\ast %
+\\{vect}[j]x;$\par
+$\!\3{enddef};$\par
+\BL
+$\9 scalar multiplication: $\\{vect}[j]$ $\leftarrow$ $\\{vect}[i]\ast v$\par
+$\2{def}\\{vect\_mult}(\2{expr}j,i,v)=$\par
+\quad\quad$\\{vect}[j]x:=v\ast \\{vect}[i]x;\ \\{vect}[j]y:=v\ast \\{vect}[i]y;%
+\ \\{vect}[j]z:=v\ast \\{vect}[i]z;$\par
+$\!\3{enddef};$\par
+\BL
+$\9 middle of two points\par
+$\2{def}\\{mid\_point}(\2{expr}k,i,j)=\\{vect\_sum}(k,i,j);\ \\{vect%
+\_mult}(k,k,.5);\3{enddef};$\par
+\BL
+\newpage
+\title{Vector rotation}
+$\9 Rotation of $\\{vect}[v]$ around $\\{vect}[\\{axis}]$ by an angle $%
+\\{alpha}$\par
+\BL
+ The vector $\vec{v}$ is first projected on the axis
+ giving vectors $\vec{a}$ and $\vec{h}$:
+\figure{vect-fig.9}
+ If we set
+ $\vec{b}={\ora{axis}\over \left\Vert\vcenter{\ora{axis}}\right\Vert}$,
+ the rotated vector $\vec{v'}$ is equal to $\vec{h}+\vec{f}$
+ where $\vec{f}=\cos\alpha \cdot \vec{a} + \sin\alpha\cdot \vec{c}$.
+ and $\vec{h}=(\vec{v}\cdot\vec{b})\vec{b}$
+\figure{vect-fig.10}
+\BL
+$\9 The rotation is independent of $\\{vect}[\\{axis}]$'s module.\par
+$\9 $v$ = old and new vector\par
+$\9 $\\{axis}$ = rotation axis\par
+$\9 $\\{alpha}$ = rotation angle\par
+$\9\par
+$\2{vardef}\\{vect\_rotate}(\2{expr}v,\\{axis},\\{alpha})=$\par
+\quad\quad$\2{save}\\{v\_a},\\{v\_b},\\{v\_c},\\{v\_d},\\{v\_e},\\{v\_f};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};\ \\{v\_b}:=\\{new\_vect};\ \\{v\_c}:=\\{new%
+\_vect};$\par
+\quad\quad$\\{v\_d}:=\\{new\_vect};\ \\{v\_e}:=\\{new\_vect};\ \\{v\_f}:=\\{new%
+\_vect};$\par
+\quad\quad$\\{v\_g}:=\\{new\_vect};\ \\{v\_h}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_mult}(\\{v\_b},\\{axis},1/\\{vect\_mod}(\\{axis}));$\par
+\quad\quad$\\{vect\_mult}(\\{v\_h},\\{v\_b},\\{vect\_dprod}(\\{v\_b},v));\ \9
+projection of $v$ on $\\{axis}$\par
+\quad\quad$\\{vect\_diff}(\\{v\_a},v,\\{v\_h});$\par
+\quad\quad$\\{vect\_prod}(\\{v\_c},\\{v\_b},\\{v\_a});$\par
+\quad\quad$\\{vect\_mult}(\\{v\_d},\\{v\_a},\1{cosd}(\\{alpha}));$\par
+\quad\quad$\\{vect\_mult}(\\{v\_e},\\{v\_c},\1{sind}(\\{alpha}));$\par
+\quad\quad$\\{vect\_sum}(\\{v\_f},\\{v\_d},\\{v\_e});$\par
+\quad\quad$\\{vect\_sum}(v,\\{v\_f},\\{v\_h});$\par
+\quad\quad$\\{free\_vect}(\\{v\_h});\ \\{free\_vect}(\\{v\_g});$\par
+\quad\quad$\\{free\_vect}(\\{v\_f});\ \\{free\_vect}(\\{v\_e});\ \\{free%
+\_vect}(\\{v\_d});$\par
+\quad\quad$\\{free\_vect}(\\{v\_c});\ \\{free\_vect}(\\{v\_b});\ \\{free%
+\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Operations on objects}
+$\9 $\\{iname}$ is the handler for an instance of an object of class $\\{name}$%
+\par
+$\9 $\\{iname}$ must be a letter string\par
+$\2{vardef}\\{assign\_obj}(\2{expr}\\{iname},\\{name})=$\par
+\quad\quad$\2{save}\\{tmpdef};$\par
+\quad\quad$\2{string}\\{tmpdef};\ \9 we need to add double quotes (char 34)\par
+\quad\quad$\\{tmpdef}=\7"def "\AM \\{iname}\AM \7"_class="\AM \\{ditto}\AM %
+\\{name}\AM \\{ditto}\AM \7" enddef";$\par
+\quad\quad$\2{scantokens}\\{tmpdef};$\par
+\quad\quad$\\{def\_obj}(\\{iname});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 $\\{name}$ is the the name of an object instance\par
+$\9 It must be made only of letters (or underscores), but no digits.\par
+$\2{def}\\{def\_obj}(\2{expr}\\{name})=$\par
+\quad\quad$\2{scantokens}\2{begingroup}$\par
+\quad\quad\quad\quad$\2{save}\\{tmpdef};\ \2{string}\\{tmpdef};$\par
+\quad\quad\quad\quad$\\{tmpdef}=\7"def_"\AM \\{obj\_class\_}(\\{name})\AM \7"("%
+\AM \\{ditto}\AM \\{name}\AM \\{ditto}\AM \7")";$\par
+\quad\quad\quad\quad$\\{tmpdef}$\par
+\quad\quad$\!\3{endgroup}$\par
+$\!\3{enddef};$\par
+\BL
+$\9 This macro puts an object back where it was right at the beginning.\par
+$\9 $\\{iname}$ is the name of an object instance.\par
+$\2{vardef}\\{reset\_obj}(\2{expr}\\{iname})=$\par
+\quad\quad$\2{save}\\{tmpdef};$\par
+\quad\quad$\2{string}\\{tmpdef};$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{iname});$\par
+\quad\quad$\\{tmpdef}=\7"set_"\AM \\{obj\_class\_}(\\{iname})\AM \7"_points";$%
+\par
+\quad\quad$\2{scantokens}\\{tmpdef}(\\{iname});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Put an object at position given by $\\{pos}$ (a vector) and\par
+$\9 with orientations given by angles $\\{psi}$, $\\{theta}$, $\\{phi}$.\par
+$\9 The object is scaled by $\\{scale}$.\par
+$\9 $\\{iname}$ is the name of an object instance.\par
+$\2{vardef}\\{put\_obj}(\2{expr}\\{iname},\\{pos},\\{scale},\\{psi},\\{theta},%
+\\{phi})=$\par
+\quad\quad$\\{reset\_obj}(\\{iname});\ \\{scale\_obj}(\\{iname},\\{scale});$\par
+\quad\quad$\\{v\_x}:=\\{new\_vect};\ \\{v\_y}:=\\{new\_vect};\ \\{v\_z}:=\\{new%
+\_vect};$\par
+\quad\quad$\\{vect\_def\_vect}(\\{v\_x},\\{vect\_I});$\par
+\quad\quad$\\{vect\_def\_vect}(\\{v\_y},\\{vect\_J});$\par
+\quad\quad$\\{vect\_def\_vect}(\\{v\_z},\\{vect\_K});$\par
+\quad\quad$\\{rotate\_obj\_abs\_pv}(\\{iname},\\{point\_null},\\{v\_z},%
+\\{psi});$\par
+\quad\quad$\\{vect\_rotate}(\\{v\_x},\\{v\_z},\\{psi});\ \\{vect\_rotate}(\\{v%
+\_y},\\{v\_z},\\{psi});$\par
+\quad\quad$\\{rotate\_obj\_abs\_pv}(\\{iname},\\{point\_null},\\{v\_y},%
+\\{theta});$\par
+\quad\quad$\\{vect\_rotate}(\\{v\_x},\\{v\_y},\\{theta});\ \\{vect\_rotate}(%
+\\{v\_z},\\{v\_y},\\{theta});$\par
+\quad\quad$\\{rotate\_obj\_abs\_pv}(\\{iname},\\{point\_null},\\{v\_x},%
+\\{phi});$\par
+\quad\quad$\\{vect\_rotate}(\\{v\_y},\\{v\_x},\\{phi});\ \\{vect\_rotate}(\\{v%
+\_z},\\{v\_x},\\{phi});$\par
+\quad\quad$\\{free\_vect}(\\{v\_z});\ \\{free\_vect}(\\{v\_y});\ \\{free%
+\_vect}(\\{v\_x});$\par
+\quad\quad$\\{translate\_obj}(\\{iname},\\{pos});$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Rotation, translation and scaling of objects}
+$\9 Rotation of an object instance $\\{name}$ around an axis\par
+$\9 going through a point $p$ (local to the object)\par
+$\9 and directed by vector $\\{vect}[v]$. The angle of rotation is $a$.\par
+$\2{vardef}\\{rotate\_obj\_pv}(\2{expr}\\{name},p,v,a)=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\\{rotate\_obj\_abs\_pv}(\\{name},\\{pnt}(p),v,a);$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{rotate\_obj\_abs\_pv}(\2{expr}\\{name},p,v,a)=$\par
+\quad\quad$\2{save}\\{v\_a};$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{vect\_diff}(\\{v\_a},\\{pnt}(i),p);$\par
+\quad\quad\quad\quad$\\{vect\_rotate}(\\{v\_a},v,a);$\par
+\quad\quad\quad\quad$\\{vect\_sum}(\\{pnt}(i),\\{v\_a},p);$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Rotation of an object instance $\\{name}$ around an axis\par
+$\9 going through a point $p$ (local to the object)\par
+$\9 and directed by vector $\ora{pq}$. The angle of rotation is $a$.\par
+$\2{vardef}\\{rotate\_obj\_pp}(\2{expr}\\{name},p,q,a)=$\par
+\quad\quad$\2{save}\\{v\_a},\\{axis};$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};\ \\{axis}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_diff}(\\{axis},\\{pnt}(q),\\{pnt}(p));$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{vect\_diff}(\\{v\_a},\\{pnt}(i),\\{pnt}(p));$\par
+\quad\quad\quad\quad$\\{vect\_rotate}(\\{v\_a},\\{axis},a);$\par
+\quad\quad\quad\quad$\\{vect\_sum}(\\{pnt}(i),\\{v\_a},\\{pnt}(p));$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{free\_vect}(\\{axis});\ \\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Translation of an object instance $\\{name}$ by a vector $\\{vect}[v]$.\par
+$\2{vardef}\\{translate\_obj}(\2{expr}\\{name},v)=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{vect\_sum}(\\{pnt}(i),\\{pnt}(i),v);$\par
+\quad\quad$\!\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Scalar multiplication of an object instance $\\{name}$ by a scalar $v$.\par
+$\2{vardef}\\{scale\_obj}(\2{expr}\\{name},v)=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{vect\_mult}(\\{pnt}(i),\\{pnt}(i),v);$\par
+\quad\quad$\!\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+\title{Functions to build new points in space}
+$\9 Rotation in a plane: this is useful to define a regular polygon.\par
+$\9 $k$ is a new point obtained from point $j$ by rotation around $o$\par
+$\9 by a angle $\alpha$ equal to the angle from $i$ to $j$.\par
+\figure{vect-fig.11}
+$\2{vardef}\\{rotate\_in\_plane\_}(\2{expr}k,o,i,j)=$\par
+\quad\quad$\2{save}\\{cosalpha},\\{sinalpha},\\{alpha},\\{v\_a},\\{v\_b},\\{v%
+\_c};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};\ \\{v\_b}:=\\{new\_vect};\ \\{v\_c}:=\\{new%
+\_vect};$\par
+\quad\quad$\\{vect\_diff}(\\{v\_a},i,o);\ \\{vect\_diff}(\\{v\_b},j,o);\ %
+\\{vect\_prod}(\\{v\_c},\\{v\_a},\\{v\_b});$\par
+\quad\quad$\\{cosalpha}=\\{vect\_dprod}(\\{v\_a},\\{v\_b})/\\{vect\_mod}(\\{v%
+\_a})/\\{vect\_mod}(\\{v\_b});$\par
+\quad\quad$\\{sinalpha}=\1{sqrt}(1-\\{cosalpha}\6{\ast \ast }2);$\par
+\quad\quad$\\{alpha}=\1{angle}((\\{cosalpha},\\{sinalpha}));$\par
+\quad\quad$\\{vect\_rotate}(\\{v\_b},\\{v\_c},\\{alpha});$\par
+\quad\quad$\\{vect\_sum}(k,o,\\{v\_b});$\par
+\quad\quad$\\{free\_vect}(\\{v\_c});\ \\{free\_vect}(\\{v\_b});\ \\{free%
+\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{rotate\_in\_plane}(\2{expr}k,o,i,j)=$\par
+\quad\quad$\\{rotate\_in\_plane\_}(\\{pnt}(k),o,\\{pnt}(i),\\{pnt}(j))$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Build a point on a adjacent face.\par
+ The middle $m$ of points $i$ and $j$ is such that
+ $\widehat{(\ora{om},\ora{mc})}=\alpha$
+ This is useful to define regular polyhedra
+\figure{vect-fig.7}
+$\2{vardef}\\{new\_face\_point\_}(\2{expr}c,o,i,j,\\{alpha})=$\par
+\quad\quad$\2{save}\\{v\_a},\\{v\_b},\\{v\_c},\\{v\_d},\\{v\_e};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};\ \\{v\_b}:=\\{new\_vect};\ \\{v\_c}:=\\{new%
+\_vect};\ \\{v\_d}:=\\{new\_vect};\ \\{v\_e}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_diff}(\\{v\_a},i,o);\ \\{vect\_diff}(\\{v\_b},j,o);$\par
+\quad\quad$\\{vect\_sum}(\\{v\_c},\\{v\_a},\\{v\_b});$\par
+\quad\quad$\\{vect\_mult}(\\{v\_d},\\{v\_c},.5);$\par
+\quad\quad$\\{vect\_diff}(\\{v\_e},i,j);$\par
+\quad\quad$\\{vect\_sum}(c,\\{v\_d},o);$\par
+\quad\quad$\\{vect\_rotate}(\\{v\_d},\\{v\_e},\\{alpha});$\par
+\quad\quad$\\{vect\_sum}(c,\\{v\_d},c);$\par
+\quad\quad$\\{free\_vect}(\\{v\_e});\ \\{free\_vect}(\\{v\_d});\ \\{free%
+\_vect}(\\{v\_c});\ \\{free\_vect}(\\{v\_b});\ \\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+$\2{vardef}\\{new\_face\_point}(\2{expr}c,o,i,j,\\{alpha})=$\par
+\quad\quad$\\{new\_face\_point\_}(\\{pnt}(c),\\{pnt}(o),\\{pnt}(i),\\{pnt}(j),%
+\\{alpha})$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{new\_abs\_face\_point}(\2{expr}c,o,i,j,\\{alpha})=$\par
+\quad\quad$\\{new\_face\_point\_}(c,o,\\{pnt}(i),\\{pnt}(j),\\{alpha})$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Computation of the projection of a point on the ``screen''}
+$\9 $p$ is the projection of $m$\par
+$\9 $m$ = point in space (3 coordinates)\par
+$\9 $p$ = point of the intersection plane\par
+\figure{vect-fig.8}
+$\2{vardef}\\{project\_point}(\2{expr}p,m)=$\par
+\quad\quad$\2{save}\\{tmpalpha},\\{v\_a},\\{v\_b};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};\ \\{v\_b}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_diff}(\\{v\_b},m,\\{Obs});\ \9 vector $\\{Obs}$-$m$\par
+\quad\quad\quad\quad$\9 $\\{vect}[\\{v\_a}]$ is $\\{vect}[\\{v\_b}]$ expressed
+in ($\\{ObsI}$,$\\{ObsJ}$,$\\{ObsK}$)\par
+\quad\quad\quad\quad$\9 coordinates.\par
+\quad\quad$\\{vect}[\\{v\_a}]x:=\\{vect}[\\{IObsI\_}]x\ast \\{vect}[\\{v\_b}]x$%
+\par
+\quad\quad${}+\\{vect}[\\{IObsJ\_}]x\ast \\{vect}[\\{v\_b}]y+\\{vect}[\\{IObsK%
+\_}]x\ast \\{vect}[\\{v\_b}]z;$\par
+\quad\quad$\\{vect}[\\{v\_a}]y:=\\{vect}[\\{IObsI\_}]y\ast \\{vect}[\\{v\_b}]x$%
+\par
+\quad\quad${}+\\{vect}[\\{IObsJ\_}]y\ast \\{vect}[\\{v\_b}]y+\\{vect}[\\{IObsK%
+\_}]y\ast \\{vect}[\\{v\_b}]z;$\par
+\quad\quad$\\{vect}[\\{v\_a}]z:=\\{vect}[\\{IObsI\_}]z\ast \\{vect}[\\{v\_b}]x$%
+\par
+\quad\quad${}+\\{vect}[\\{IObsJ\_}]z\ast \\{vect}[\\{v\_b}]y+\\{vect}[\\{IObsK%
+\_}]z\ast \\{vect}[\\{v\_b}]z;$\par
+\quad\quad$\2{if}\\{vect}[\\{v\_a}]x<\\{Obs\_dist}\?:\9 then, point $m$ is too
+close\par
+\quad\quad\quad\quad$\2{message}\7"Point "\AM \1{decimal}m\AM \7" too close ->
+not drawn";$\par
+\quad\quad\quad\quad$x[p]:=\\{too\_big\_};\ y[p]=\\{too\_big\_};$\par
+\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad$\2{if}(\1{angle}(\\{vect}[\\{v\_a}]x,\\{vect}[\\{v\_a}]z)>%
+\\{h\_field}/2)$\par
+\quad\quad\quad\quad\quad\quad${}\6{or}(\1{angle}(\\{vect}[\\{v\_a}]x,\\{vect}[%
+\\{v\_a}]y)>\\{v\_field}/2)\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{message}\7"Point "\AM \1{decimal}m\AM \7" out
+of screen -> not drawn";$\par
+\quad\quad\quad\quad\quad\quad$x[p]:=\\{too\_big\_};\ y[p]=\\{too\_big\_};$\par
+\quad\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{tmpalpha}:=\\{Obs\_dist}/\\{vect}[\\{v%
+\_a}]x;$\par
+\quad\quad\quad\quad\quad\quad$y[p]:=\\{drawing\_scale}\ast \\{tmpalpha}\ast %
+\\{vect}[\\{v\_a}]y;$\par
+\quad\quad\quad\quad\quad\quad$x[p]:=\\{drawing\_scale}\ast \\{tmpalpha}\ast %
+\\{vect}[\\{v\_a}]z;$\par
+\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad$\2{fi};$\par
+\quad\quad$\\{free\_vect}(\\{v\_b});\ \\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Object projection\par
+$\9 This is a mere iteration on $\\{project\_point}$\par
+$\2{def}\\{project\_obj}(\2{expr}\\{name})=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:\\{project\_point}(%
+\\{ipnt\_}(i),\\{pnt}(i));\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Draw one face, hiding it if it is hidden}
+$\9 The order of the vertices determines what is the visible side\par
+$\9 of the face. The order must be clockwise when the face is seen.\par
+$\9 $\\{drawhidden}$ is a boolean; if $\5{true}$ only hidden faces are drawn;
+if $\5{false}$,\par
+$\9 only visible faces are drawn. Therefore, $\\{draw\_face}$ is called twice%
+\par
+$\9 by $\\{draw\_faces}$.\par
+$\2{vardef}\\{draw\_face}(\2{text}\\{vertices})(\2{expr}\\{col},%
+\\{drawhidden})=$\par
+\quad\quad$\2{save}p,\\{num},\\{normal\_vect},\\{v\_a},\\{v\_b},\\{v\_c},%
+\\{overflow};$\par
+\quad\quad$\2{path}p;\ \2{boolean}\\{overflow};$\par
+\quad\quad$\\{overflow}=\5{false};$\par
+\quad\quad$\2{forsuffixes}\$=\\{vertices}\?:$\par
+\quad\quad\quad\quad$\2{if}z[\\{ipnt\_}(\$)]=(\\{too\_big\_},\\{too\_big\_})\?:%
+\\{overflow}:=\5{true};\ \2{fi};$\par
+\quad\quad\quad\quad$\2{exitif}\\{overflow};$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\2{if}\\{overflow}\?:\2{message}\7"Face can not be drawn, due to
+overflow";$\par
+\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad$p=\2{forsuffixes}\$=\\{vertices}\?:z[\\{ipnt\_}(\$)]\8{--}%
+\3{endfor}\1{cycle};$\par
+\quad\quad\quad\quad$\\{num}_{0}:=0;\ \\{num}_{1}:=0;\ \\{num}_{2}:=0;$\par
+\quad\quad\quad\quad\quad\quad$\9 get the three last suffixes:\par
+\quad\quad\quad\quad$\2{forsuffixes}\$=\\{vertices}\?:\\{num}_{0}:=\\{num}_{1};%
+\ \\{num}_{1}:=\\{num}_{2};\ \\{num}_{2}:=\$;\3{endfor};$\par
+\quad\quad\quad\quad$\\{normal\_vect}:=\\{new\_vect};\ \\{v\_a}:=\\{new\_vect};%
+\ \\{v\_b}:=\\{new\_vect};$\par
+\quad\quad\quad\quad$\\{v\_c}:=\\{new\_vect};$\par
+\quad\quad\quad\quad$\\{vect\_diff}(\\{v\_a},\\{pnt}(\\{num}_{1}),\\{pnt}(%
+\\{num}_{0}));$\par
+\quad\quad\quad\quad$\\{vect\_diff}(\\{v\_b},\\{pnt}(\\{num}_{2}),\\{pnt}(%
+\\{num}_{1}));$\par
+\quad\quad\quad\quad$\\{vect\_prod}(\\{normal\_vect},\\{v\_a},\\{v\_b});$\par
+\quad\quad\quad\quad$\\{vect\_diff}(\\{v\_c},\\{pnt}(\\{num}_{1}),\\{Obs});$\par
+\quad\quad\quad\quad$\2{if}\\{filled\_faces}\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{if}\\{vect\_dprod}(\\{normal\_vect},\\{v%
+\_c})<0\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad$\2{fill}p\2{withcolor}\\{col};\ \2{if}%
+\\{draw\_contours}\?:\\{drawcontour}(p,\\{contourwidth});\ \2{fi};$\par
+\quad\quad\quad\quad\quad\quad$\2{else}\?:\9 $\2{draw}p\2{dashed}\\{evenly};$
+if this is done, you must ensure\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\9 that
+hidden faces are (re)drawn at the end\par
+\quad\quad\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{if}\\{vect\_dprod}(\\{normal\_vect},\\{v%
+\_c})<0\?:\9visible\par
+\quad\quad\quad\quad\quad\quad\quad\quad$\2{if}\1{not}\\{drawhidden}\?:%
+\2{draw}p;\ \2{fi};$\par
+\quad\quad\quad\quad\quad\quad$\2{else}\?:\9 hidden\par
+\quad\quad\quad\quad\quad\quad\quad\quad$\2{if}\\{drawhidden}\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\2{draw}p\2{withcolor}%
+\\{background};\ \9 avoid strange overlapping dashes\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\2{draw}p\2{dashed}%
+\\{evenly};$\par
+\quad\quad\quad\quad\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad$\\{free\_vect}(\\{v\_c});\ \\{free\_vect}(\\{v\_b});\ %
+\\{free\_vect}(\\{v\_a});\ \\{free\_vect}(\\{normal\_vect});$\par
+\quad\quad$\2{fi};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 $p$ is the path to draw (a face contour) and $\\{thickness}$ is the pen
+width\par
+$\2{def}\\{drawcontour}(\2{expr}p,\\{thickness})=$\par
+\quad\quad$\2{pickup}\5{pencircle}\6{scaled}\\{thickness};$\par
+\quad\quad$\2{draw}p;$\par
+\quad\quad$\2{pickup}\5{pencircle}\6{scaled}.4\\{pt};$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+$\9 Variables for face handling. First, we have an array for lists of vertices%
+\par
+$\9 corresponding to faces.\par
+$\2{string}\\{face\_points\_}[];\ \9 analogous to $\\{vect}$ arrays\par
+\BL
+$\9 Then, we have an array of colors. A color needs to be a string\par
+$\9 representing an hexadecimal RGB coding of a color.\par
+$\2{string}\\{face\_color\_}[];$\par
+\BL
+$\9 $\\{name}$ is the name of an object instance\par
+$\2{vardef}\\{draw\_faces}(\2{expr}\\{name})=$\par
+\quad\quad$\2{save}\\{tmpdef};\ \2{string}\\{tmpdef};$\par
+\quad\quad$\\{define\_current\_face\_offset\_}(\\{name});$\par
+\quad\quad\quad\quad$\9 first the hidden faces (dashes must be drawn first):\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_faces\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{tmpdef}:=\7"draw_face("\AM \\{face\_points\_}[%
+\\{face}(i)]$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7")(hexcolor("\AM \\{ditto}\AM \\{face%
+\_color\_}[\\{face}(i)]\AM \\{ditto}$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7"),true)";\ \2{scantokens}\\{tmpdef};$%
+\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad\quad$\9 then, the visible faces:\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_faces\_}(\\{name})\?:$\par
+\quad\quad\quad\quad$\\{tmpdef}:=\7"draw_face("\AM \\{face\_points\_}[%
+\\{face}(i)]$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7")(hexcolor("\AM \\{ditto}\AM \\{face%
+\_color\_}[\\{face}(i)]\AM \\{ditto}$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7"),false)";\ \2{scantokens}\\{tmpdef};$%
+\par
+\quad\quad$\!\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Draw point $n$ of object instance $\\{name}$\par
+$\2{vardef}\\{draw\_point}(\2{expr}\\{name},n)=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\\{project\_point}(\\{ipnt\_}(n),\\{pnt}(n));$\par
+\quad\quad$\2{if}z[\\{ipnt\_}(n)]\ne (\\{too\_big\_},\\{too\_big\_})\?:$\par
+\quad\quad\quad\quad$\2{pickup}\5{pencircle}\6{scaled}5\\{pt};$\par
+\quad\quad\quad\quad$\2{drawdot}(z[\\{ipnt\_}(n)]);$\par
+\quad\quad\quad\quad$\2{pickup}\5{pencircle}\6{scaled}.4\\{pt};$\par
+\quad\quad$\2{fi};$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{draw\_axes}(\2{expr}r,g,b)=$\par
+\quad\quad$\\{project\_point}(1,\\{vect\_null});$\par
+\quad\quad$\\{project\_point}(2,\\{vect\_I});$\par
+\quad\quad$\\{project\_point}(3,\\{vect\_J});$\par
+\quad\quad$\\{project\_point}(4,\\{vect\_K});$\par
+\quad\quad$\2{if}(z_{1}\ne (\\{too\_big\_},\\{too\_big\_}))\?:$\par
+\quad\quad\quad\quad$\2{if}(z_{2}\ne (\\{too\_big\_},\\{too\_big\_}))\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{drawarrow}z_{1}\8{--}z_{2}\2{dashed}%
+\\{evenly}\2{withcolor}r;$\par
+\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad$\2{if}(z_{3}\ne (\\{too\_big\_},\\{too\_big\_}))\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{drawarrow}z_{1}\8{--}z_{3}\2{dashed}%
+\\{evenly}\2{withcolor}g;$\par
+\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad\quad\quad$\2{if}(z_{4}\ne (\\{too\_big\_},\\{too\_big\_}))\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{drawarrow}z_{1}\8{--}z_{4}\2{dashed}%
+\\{evenly}\2{withcolor}b;$\par
+\quad\quad\quad\quad$\2{fi};$\par
+\quad\quad$\2{fi};$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+$\9 Definition of a macro $\\{obj\_name}$ returning an object name\par
+$\9 when given an absolute\par
+$\9 face number. This definition is built incrementally through a string,\par
+$\9 everytime a new object is defined.\par
+$\9 $\\{obj\_name}$ is defined by $\\{redefine\_obj\_name\_}$.\par
+\BL
+$\9 Initial definition\par
+$\2{string}\\{index\_to\_name\_};$\par
+$\\{index\_to\_name\_}=\7"def obj_name(expr i)=if i<1:";$\par
+\BL
+$\9 $\\{name}$ is the name of an object instance\par
+$\9 $n$ is the absolute index of its last face\par
+$\2{def}\\{redefine\_obj\_name\_}(\2{expr}\\{name},n)=$\par
+\quad\quad$\\{index\_to\_name\_}:=\\{index\_to\_name\_}\AM \7"elseif i<="\AM %
+\1{decimal}n\AM \7":"\AM \\{ditto}$\par
+\quad\quad\quad\quad\quad\quad${}\AM \\{name}\AM \\{ditto};$\par
+\quad\quad$\2{scantokens}\2{begingroup}\\{index\_to\_name\_}\AM \7"fi;enddef;"%
+\3{endgroup};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 $i$ is an absolute face number\par
+$\9 $\\{vertices}$ is a string representing a list of vertices\par
+$\9 $\\{rgbcolor}$ is a string representing a color in rgb hexadecimal\par
+$\2{def}\\{set\_face}(\2{expr}i,\\{vertices},\\{rgbcolor})=$\par
+\quad\quad$\\{face\_points\_}[i]:=\\{vertices};\ \\{face\_color\_}[i]:=%
+\\{rgbcolor};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 $i$ is a local face number\par
+$\9$\\{vertices}$ is a string representing a list of vertices\par
+$\9$\\{rgbcolor}$ is a string representing a color in rgb hexadecimal\par
+$\2{def}\\{set\_obj\_face}(\2{expr}i,\\{vertices},\\{rgbcolor})=\\{set\_face}(%
+\\{face}(i),\\{vertices},\\{rgbcolor})$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Compute the vectors corresponding to the observer's viewpoint}
+$\9 (vectors $\\{ObsI\_}$,$\\{ObsJ\_}$ and $\\{ObsK\_}$ in the $\\{vect\_I}$,$%
+\\{vect\_J}$,\par
+$\9 $\\{vect\_K}$ reference; and vectors $\\{IObsI\_}$,$\\{IObsJ\_}$ and $%
+\\{IObsK\_}$\par
+$\9 which are $\\{vect\_I}$,$\\{vect\_J}$,$\\{vect\_K}$\par
+$\9 in the $\\{ObsI\_}$,$\\{ObsJ\_}$,$\\{ObsK\_}$ reference)\par
+\figure{vect-fig.16}
+ (here, $\psi>0$, $\theta<0$ and $\phi>0$; moreover,
+ $\vert\theta\vert \leq 90^\circ$)
+\BL
+$\2{def}\\{compute\_reference}(\2{expr}\\{psi},\\{theta},\\{phi})=$\par
+\quad\quad\quad$\9 $\\{ObsI\_}$ defines the direction of observation;\par
+\quad\quad\quad$\9 $\\{ObsJ\_}$ and $\\{ObsK\_}$ the orientation\par
+\quad\quad\quad$\9 (but one of these two vectors is enough,\par
+\quad\quad\quad$\9 since $\\{ObsK\_}$ = $\\{ObsI\_}$ $\land$ $\\{ObsJ\_}$)\par
+\quad\quad\quad$\9 The vectors are found by rotations of $\\{vect\_I}$,$\\{vect%
+\_J}$,$\\{vect\_K}$.\par
+\quad\quad$\\{vect\_def\_vect}(\\{ObsI\_},\\{vect\_I});\ \\{vect\_def\_vect}(%
+\\{ObsJ\_},\\{vect\_J});$\par
+\quad\quad$\\{vect\_def\_vect}(\\{ObsK\_},\\{vect\_K});$\par
+\quad\quad$\\{vect\_rotate}(\\{ObsI\_},\\{ObsK\_},\\{psi});$\par
+\quad\quad$\\{vect\_rotate}(\\{ObsJ\_},\\{ObsK\_},\\{psi});\ \9 gives
+($u$,$v$,$z$)\par
+\quad\quad$\\{vect\_rotate}(\\{ObsI\_},\\{ObsJ\_},\\{theta});$\par
+\quad\quad$\\{vect\_rotate}(\\{ObsK\_},\\{ObsJ\_},\\{theta});\ \9 gives
+($Obs_x$,$v$,$w$)\par
+\quad\quad$\\{vect\_rotate}(\\{ObsJ\_},\\{ObsI\_},\\{phi});$\par
+\quad\quad$\\{vect\_rotate}(\\{ObsK\_},\\{ObsI\_},\\{phi});\ \9 gives
+($Obs_x$,$Obs_y$,$Obs_z$)\par
+\quad\quad\quad$\9 The passage matrix $P$ from $\\{vect\_I}$,$\\{vect\_J}$,$%
+\\{vect\_K}$\par
+\quad\quad\quad$\9 to $\\{ObsI\_}$,$\\{ObsJ\_}$,$\\{ObsK\_}$ is the matrix\par
+\quad\quad\quad$\9 composed of the vectors $\\{ObsI\_}$,$\\{ObsJ\_}$ and $%
+\\{ObsK\_}$ expressed\par
+\quad\quad\quad$\9 in the base $\\{vect\_I}$,$\\{vect\_J}$,$\\{vect\_K}$.\par
+\quad\quad\quad$\9 We have $X=P X'$ where $X$ are the coordinates of a point\par
+\quad\quad\quad$\9 in $\\{vect\_I}$,$\\{vect\_J}$,$\\{vect\_K}$\par
+\quad\quad\quad$\9 and $X'$ the coordinates of the same point in $\\{ObsI\_}$,$%
+\\{ObsJ\_}$,$\\{ObsK\_}$.\par
+\quad\quad\quad$\9 In order to get $P^{-1}$, it suffices to build vectors using%
+\par
+\quad\quad\quad$\9 the previous rotations in the inverse order.\par
+\quad\quad$\\{vect\_def\_vect}(\\{IObsI\_},\\{vect\_I});\ \\{vect\_def\_vect}(%
+\\{IObsJ\_},\\{vect\_J});$\par
+\quad\quad$\\{vect\_def\_vect}(\\{IObsK\_},\\{vect\_K});$\par
+\quad\quad$\\{vect\_rotate}(\\{IObsK\_},\\{IObsI\_},-\\{phi});\ \\{vect%
+\_rotate}(\\{IObsJ\_},\\{IObsI\_},-\\{phi});$\par
+\quad\quad$\\{vect\_rotate}(\\{IObsK\_},\\{IObsJ\_},-\\{theta});\ \\{vect%
+\_rotate}(\\{IObsI\_},\\{IObsJ\_},-\\{theta});$\par
+\quad\quad$\\{vect\_rotate}(\\{IObsJ\_},\\{IObsK\_},-\\{psi});\ \\{vect%
+\_rotate}(\\{IObsI\_},\\{IObsK\_},-\\{psi});$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Point of view}
+$\9 This macro computes the three angles necessary for $\\{compute\_reference}$%
+\par
+$\9 $\\{name}$ = name of an instance of an object\par
+$\9 $\\{target}$ = target point (local to object $\\{name}$)\par
+$\9 $\\{phi}$ = angle\par
+$\2{vardef}\\{point\_of\_view\_obj}(\2{expr}\\{name},\\{target},\\{phi})=$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});\ \9 enables $%
+\\{pnt}$\par
+\quad\quad$\\{point\_of\_view\_abs}(\\{pnt}(\\{target}),\\{phi});$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Compute absolute perspective. $\\{target}$ is an absolute point number\par
+$\2{vardef}\\{point\_of\_view\_abs}(\2{expr}\\{target},\\{phi})=$\par
+\quad\quad$\2{save}\\{v\_a},\\{psi},\\{theta};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_diff}(\\{v\_a},\\{target},\\{Obs});$\par
+\quad\quad$\\{vect\_mult}(\\{v\_a},\\{v\_a},1/\\{vect\_mod}(\\{v\_a}));$\par
+\quad\quad$\\{psi}=\1{angle}((\\{vect}[\\{v\_a}]x,\\{vect}[\\{v\_a}]y));$\par
+\quad\quad$\\{theta}=-\1{angle}((\\{vect}[\\{v\_a}]x\6{++}\\{vect}[\\{v\_a}]y,%
+\\{vect}[\\{v\_a}]z));$\par
+\quad\quad$\\{compute\_reference}(\\{psi},\\{theta},\\{phi});$\par
+\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\BL
+$\9 Distance between the observer and point $n$ of object $\\{name}$\par
+$\9 Result is put in $\\{dist}$\par
+$\2{vardef}\\{obs\_distance}(\2{text}\\{dist})(\2{expr}\\{name},n)=$\par
+\quad\quad$\2{save}\\{v\_a};$\par
+\quad\quad$\\{v\_a}:=\\{new\_vect};$\par
+\quad\quad$\\{define\_current\_point\_offset\_}(\\{name});\ \9 enables $%
+\\{pnt}$\par
+\quad\quad$\\{dist}:=\\{vect\_mod}(\\{v\_a},\\{pnt}(n),\\{Obs});$\par
+\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Vector and point allocation}
+$\9 Allocation is done through a stack of vectors\par
+$\2{numeric}\\{last\_vect\_};$\par
+$\\{last\_vect\_}=0;$\par
+\BL
+$\9 vector allocation\par
+$\2{def}\\{new\_vect}=\2{incr}(\\{last\_vect\_})$\par
+\quad\quad\quad\quad\quad\quad\quad$\9 $\2{message}\7"Vector "\AM \1{decimal}%
+\\{last\_vect\_}\AM \7" allocated";$\par
+$\!\3{enddef};$\par
+\BL
+$\2{let}\\{new\_point}=\\{new\_vect};$\par
+\BL
+$\2{def}\\{new\_points}(\2{text}p)(\2{expr}n)=$\par
+\quad\quad$\2{save}p;$\par
+\quad\quad$\2{numeric}p[];$\par
+\quad\quad$\2{for}i:=1\4{upto}n\?:p[i]:=\\{new\_point};\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Free a vector\par
+$\9 A vector can only be freed safely when it was the last vector created.\par
+$\2{def}\\{free\_vect}(\2{expr}i)=$\par
+\quad\quad$\2{if}i=\\{last\_vect\_}\?:\\{last\_vect\_}:=\\{last\_vect\_}-1;$\par
+\quad\quad$\2{else}\?:\2{errmessage}(\7"Vector "\AM \1{decimal}i\AM \7" can't
+be freed!");$\par
+\quad\quad$\2{fi};$\par
+$\!\3{enddef};$\par
+\BL
+$\2{let}\\{free\_point}=\\{free\_vect};$\par
+\BL
+$\2{def}\\{free\_points}(\2{text}p)(\2{expr}n)=$\par
+\quad\quad$\2{for}i:=10\2{step}-1\4{until}1\?:\\{free\_point}(p[i]);%
+\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+\title{Debugging}
+\BL
+$\2{def}\\{show\_vect}(\2{expr}t,i)=$\par
+\quad\quad$\2{message}\7"Vector "\AM t\AM \7"="$\par
+\quad\quad${}\AM \7"("\AM \1{decimal}\\{vect}[i]x\AM \7","\AM \1{decimal}%
+\\{vect}[i]y\AM \7","$\par
+\quad\quad\quad\quad${}\AM \1{decimal}\\{vect}[i]z\AM \7")";$\par
+$\!\3{enddef};$\par
+\BL
+$\2{let}\\{show\_point}=\\{show\_vect};$\par
+\BL
+$\2{def}\\{show\_pair}(\2{expr}t,\\{zz})=$\par
+\quad\quad$\2{message}t\AM \7"=("\AM \1{decimal}\1{xpart}(\\{zz})\AM \7","\AM %
+\1{decimal}\1{ypart}(\\{zz})\AM \7")";$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+\title{Access to object features}
+$\9 $a$ must be a string representing an class name, such as $%
+\7"dodecahedron"$.\par
+$\9 $b$ is the tail of a macro name.\par
+\BL
+$\2{def}\\{obj\_}(\2{expr}a,b,i)=$\par
+\quad\quad$\2{scantokens}$\par
+\quad\quad$\2{begingroup}\2{save}n;\ \2{string}n;\ n=a\AM b\AM i;\ n$\par
+\quad\quad$\!\3{endgroup}$\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{obj\_points\_}(\2{expr}\\{name})=$\par
+\quad\quad$\\{obj\_}(\\{obj\_class\_}(\\{name}),\7"_points",\\{name})$\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{obj\_faces\_}(\2{expr}\\{name})=$\par
+\quad\quad$\\{obj\_}(\\{obj\_class\_}(\\{name}),\7"_faces",\\{name})$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{obj\_point\_offset\_}(\2{expr}\\{name})=$\par
+\quad\quad$\\{obj\_}(\\{obj\_class\_}(\\{name}),\7"_point_offset",\\{name})$\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{obj\_face\_offset\_}(\2{expr}\\{name})=$\par
+\quad\quad$\\{obj\_}(\\{obj\_class\_}(\\{name}),\7"_face_offset",\\{name})$\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{obj\_class\_}(\2{expr}\\{name})=\\{obj\_}(\\{name},\7"_class",\7"")%
+\3{enddef};$\par
+\BL
+\newpage
+$\2{def}\\{define\_point\_offset\_}(\2{expr}\\{name},o)=$\par
+\quad\quad$\2{begingroup}\2{save}n,\\{tmpdef};$\par
+\quad\quad\quad\quad$\2{string}n,\\{tmpdef};$\par
+\quad\quad\quad\quad$n=\\{obj\_class\_}(\\{name})\AM \7"_point_offset"\AM %
+\\{name};$\par
+\quad\quad\quad\quad$\2{expandafter}\1{numeric}\2{scantokens}n;$\par
+\quad\quad\quad\quad$\2{scantokens}n:=\\{last\_point\_offset\_};$\par
+\quad\quad\quad\quad$\\{last\_point\_offset\_}:=\\{last\_point\_offset\_}+o;$%
+\par
+\quad\quad\quad\quad$\\{tmpdef}=\7"def "\AM \\{obj\_class\_}(\\{name})\AM %
+\7"_points"\AM \\{name}\AM $\par
+\quad\quad\quad\quad\quad\quad$\7"="\AM \1{decimal}o\AM \7" enddef";$\par
+\quad\quad\quad\quad$\2{scantokens}\\{tmpdef};$\par
+\quad\quad$\!\3{endgroup}$\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{define\_face\_offset\_}(\2{expr}\\{name},o)=$\par
+\quad\quad$\2{begingroup}\2{save}n,\\{tmpdef};$\par
+\quad\quad\quad\quad$\2{string}n,\\{tmpdef};$\par
+\quad\quad\quad\quad$n=\\{obj\_class\_}(\\{name})\AM \7"_face_offset"\AM %
+\\{name};$\par
+\quad\quad\quad\quad$\2{expandafter}\1{numeric}\2{scantokens}n;$\par
+\quad\quad\quad\quad$\2{scantokens}n:=\\{last\_face\_offset\_};$\par
+\quad\quad\quad\quad$\\{last\_face\_offset\_}:=\\{last\_face\_offset\_}+o;$\par
+\quad\quad\quad\quad$\\{tmpdef}=\7"def "\AM \\{obj\_class\_}(\\{name})\AM %
+\7"_faces"\AM \\{name}\AM $\par
+\quad\quad\quad\quad\quad\quad$\7"="\AM \1{decimal}o\AM \7" enddef";$\par
+\quad\quad\quad\quad$\2{scantokens}\\{tmpdef};$\par
+\quad\quad$\!\3{endgroup}$\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{define\_current\_point\_offset\_}(\2{expr}\\{name})=$\par
+\quad\quad$\2{save}\\{current\_point\_offset\_};$\par
+\quad\quad$\2{numeric}\\{current\_point\_offset\_};$\par
+\quad\quad$\\{current\_point\_offset\_}:=\\{obj\_point\_offset\_}(\\{name});$%
+\par
+$\!\3{enddef};$\par
+\BL
+$\2{def}\\{define\_current\_face\_offset\_}(\2{expr}\\{name})=$\par
+\quad\quad$\2{save}\\{current\_face\_offset\_};$\par
+\quad\quad$\2{numeric}\\{current\_face\_offset\_};$\par
+\quad\quad$\\{current\_face\_offset\_}:=\\{obj\_face\_offset\_}(\\{name});$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+\title{Drawing an object}
+$\9 $\\{name}$ is an object instance\par
+$\2{def}\\{draw\_obj}(\2{expr}\\{name})=\\{project\_obj}(\\{name});\ \\{draw%
+\_faces}(\\{name});\3{enddef};$\par
+\BL
+\title{Normalization of an object}
+$\9 This macro translates an object so that a list of vertices is centered\par
+$\9 on the origin, and the last vertex is put on a sphere whose radius is 1.\par
+$\9 $\\{name}$ is the name of the object and $\\{vertices}$ is a list\par
+$\9 of points whose barycenter will define the center of the object.\par
+$\9 ($\\{vertices}$ need not be the list of all vertices)\par
+$\2{vardef}\\{normalize\_obj}(\2{expr}\\{name})(\2{text}\\{vertices})=$\par
+\quad\quad$\2{save}\\{v\_a},\\{nvertices},\\{last};$\par
+\quad\quad$\2{numeric}\\{v\_a},\\{last};$\par
+\quad\quad$\\{nvertices}=0;$\par
+\quad\quad$\\{v\_a}=\\{new\_vect};\ \\{vect\_def}(\\{v\_a},0,0,0)$\par
+\quad\quad$\2{forsuffixes}\$=\\{vertices}\?:$\par
+\quad\quad\quad\quad$\\{vect\_sum}(\\{v\_a},\\{v\_a},\\{pnt}(\$));$\par
+\quad\quad\quad\quad$\\{nvertices}:=\\{nvertices}+1;$\par
+\quad\quad\quad\quad$\\{last}:=\$;$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{vect\_mult}(\\{v\_a},\\{v\_a},-1/\\{nvertices});$\par
+\quad\quad$\\{translate\_obj}(\\{name},\\{v\_a});\ \9 object centered on the
+origin\par
+\quad\quad$\\{scale\_obj}(\\{name},1/\\{vect\_mod}(\\{pnt}(\\{last})));$\par
+\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+\title{General definitions}
+$\9 Vector arrays\par
+$\2{numeric}\\{vect}[]x,\\{vect}[]y,\\{vect}[]z;$\par
+\BL
+$\9 Observer\par
+$\2{numeric}\\{Obs};$\par
+$\\{Obs}=\\{new\_point};$\par
+$\9 default value:\par
+$\\{set\_point}(\\{Obs},0,0,20);$\par
+\BL
+$\9 Observer's vectors\par
+$\\{ObsI\_}=\\{new\_vect};\ \\{ObsJ\_}=\\{new\_vect};\ \\{ObsK\_}=\\{new%
+\_vect};$\par
+$\\{IObsI\_}=\\{new\_vect};\ \\{IObsJ\_}=\\{new\_vect};\ \\{IObsK\_}=\\{new%
+\_vect};$\par
+\BL
+$\9 distance observer/plane (must be $>0$)\par
+$\2{numeric}\\{Obs\_dist};\ \9 represents $\\{Obs\_dist}$ $\times$ $\\{drawing%
+\_scale}$\par
+$\9 default value:\par
+$\\{Obs\_dist}=2;\ \9 means $\\{Obs\_dist}$ $\times$ $\\{drawing\_scale}$\par
+\BL
+$\9 Screen Size\par
+$\9 The screen size is defined through two angles: the horizontal field\par
+$\9 and the vertical field\par
+$\2{numeric}\\{h\_field},\\{v\_field};$\par
+$\\{h\_field}=100;\ \9 degrees\par
+$\\{v\_field}=70;\ \9 degrees\par
+\BL
+$\9 Reference vectors $\vec{0}$, $\vec{\imath}$, $\vec{\jmath}$ and $\vec{k}$%
+\par
+$\9 and their definition\par
+$\2{numeric}\\{vect\_null},\\{vect\_I},\\{vect\_J},\\{vect\_K};$\par
+$\\{vect\_null}=\\{new\_vect};\ \\{vect\_I}=\\{new\_vect};\ \\{vect\_J}=\\{new%
+\_vect};\ \\{vect\_K}=\\{new\_vect};$\par
+$\\{vect\_def}(\\{vect\_null},0,0,0);$\par
+$\\{vect\_def}(\\{vect\_I},1,0,0);\ \\{vect\_def}(\\{vect\_J},0,1,0);\ \\{vect%
+\_def}(\\{vect\_K},0,0,1);$\par
+$\2{numeric}\\{point\_null};$\par
+$\\{point\_null}=\\{vect\_null};$\par
+\BL
+$\9 Observer's orientation, defined by three angles\par
+$\2{numeric}\\{Obs\_psi},\\{Obs\_theta},\\{Obs\_phi};$\par
+$\9 default value:\par
+$\\{Obs\_psi}=0;\ \\{Obs\_theta}=90;\ \\{Obs\_phi}=0;$\par
+\BL
+$\9 Points for the figures\par
+$\2{numeric}\\{points\_}[];$\par
+\BL
+$\9 $\\{name}$ is the name of an object instance\par
+$\9 $\\{npoints}$ is its number of defining points\par
+$\2{def}\\{new\_obj\_points}(\2{expr}\\{name},\\{npoints})=$\par
+\quad\quad$\\{define\_point\_offset\_}(\\{name},\\{npoints});\ \\{define%
+\_current\_point\_offset\_}(\\{name});$\par
+\quad\quad$\2{for}i:=1\4{upto}\\{obj\_points\_}(\\{name})\?:\\{pnt}(i):=\\{new%
+\_point};\3{endfor};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 $\\{name}$ is the name of an object instance\par
+$\9 $\\{nfaces}$ is its number of defining faces\par
+$\2{def}\\{new\_obj\_faces}(\2{expr}\\{name},\\{nfaces})=$\par
+\quad\quad$\\{define\_face\_offset\_}(\\{name},\\{nfaces});\ \\{define\_current%
+\_face\_offset\_}(\\{name});$\par
+\quad\quad$\\{redefine\_obj\_name\_}(\\{name},\\{current\_face\_offset\_}+%
+\\{nfaces});$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+$\9 Absolute point number corresponding to object point number $i$\par
+$\9 This macro must only be used within the function defining an object\par
+$\9 (such as $\\{def\_cube}$) or the function drawing an object (such as\par
+$\9 $\\{draw\_cube}$).\par
+$\2{def}\\{ipnt\_}(\2{expr}i)=i+\\{current\_point\_offset\_}\3{enddef};$\par
+$\2{def}\\{pnt}(\2{expr}i)=\\{points\_}[\\{ipnt\_}(i)]\3{enddef};$\par
+\BL
+$\2{def}\\{face}(\2{expr}i)=(i+\\{current\_face\_offset\_})\3{enddef};$\par
+\BL
+$\9 Absolute point number corresponding to local point $n$\par
+$\9 in object instance $\\{name}$\par
+$\2{vardef}\\{pnt\_obj}(\2{expr}\\{name},n)=$\par
+\quad\quad$\\{hide}(\\{define\_current\_point\_offset\_}(\\{name});\ )%
+\\{pnt}(n)$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Absolute face number corresponding to local face $n$\par
+$\9 in object instance $\\{name}$\par
+$\2{vardef}\\{face\_obj}(\2{expr}\\{name},n)=$\par
+\quad\quad$\\{hide}(\\{define\_current\_face\_offset\_}(\\{name});\ )%
+\\{face}(n)$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+$\9 Scale\par
+$\2{numeric}\\{drawing\_scale};$\par
+$\\{drawing\_scale}=2\\{cm};$\par
+\BL
+$\9 Color\par
+$\9 This function is useful when a color is expressed in hexadecimal.\par
+$\2{def}\\{hexcolor}(\2{expr}s)=$\par
+\quad\quad$(\1{hex}(\2{substring}(0,2)\2{of}s)/255,\1{hex}(\2{substring}(2,4)%
+\2{of}s)/255,$\par
+\quad\quad\quad\quad$\1{hex}(\2{substring}(4,6)\2{of}s)/255)$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Filling and contours\par
+$\2{boolean}\\{filled\_faces},\\{draw\_contours};$\par
+$\\{filled\_faces}=\5{true};$\par
+$\\{draw\_contours}=\5{true};$\par
+$\2{numeric}\\{contourwidth};\ \9 thickness of contours\par
+$\\{contourwidth}=1\\{pt};$\par
+\BL
+$\9 Overflow control\par
+$\9 An overflow can occur when an object is too close from the observer\par
+$\9 or if an object is out of sight. We use a special value to mark\par
+$\9 coordinates which would lead to an overflow.\par
+$\2{numeric}\\{too\_big\_};$\par
+$\\{too\_big\_}=4000;$\par
+\BL
+\BL
+$\9 Object offset (the points defining an object are arranged\par
+$\9 in a single array, and the objects are easier to manipulate\par
+$\9 if the point numbers are divided into a number and an offset).\par
+$\2{numeric}\\{last\_point\_offset\_},\\{last\_face\_offset\_};$\par
+$\\{last\_point\_offset\_}=0;\ \\{last\_face\_offset\_}=0;$\par
+\BL
+\BL
+\newpage
+\title{Computation of field parameters of an animation}
+$\2{numeric}\\{xmin\_},\\{ymin\_},\\{xmax\_},\\{ymax\_};$\par
+\BL
+$\2{def}\\{compute\_bbox}=$\par
+\quad\quad$\2{if}\1{known}\\{xmin\_}\?:$\par
+\quad\quad\quad\quad$\\{xmin\_}:=\1{min}(\\{xmin\_},\1{xpart}(\1{llcorner}(%
+\\{currentpicture})));$\par
+\quad\quad\quad\quad$\\{ymin\_}:=\1{min}(\\{ymin\_},\1{ypart}(\1{llcorner}(%
+\\{currentpicture})));$\par
+\quad\quad\quad\quad$\\{xmax\_}:=\1{max}(\\{xmax\_},\1{xpart}(\1{urcorner}(%
+\\{currentpicture})));$\par
+\quad\quad\quad\quad$\\{ymax\_}:=\1{max}(\\{ymax\_},\1{ypart}(\1{urcorner}(%
+\\{currentpicture})));$\par
+\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad$\\{xmin\_}=\1{xpart}(\1{llcorner}(\\{currentpicture}));$%
+\par
+\quad\quad\quad\quad$\\{ymin\_}=\1{ypart}(\1{llcorner}(\\{currentpicture}));$%
+\par
+\quad\quad\quad\quad$\\{xmax\_}=\1{xpart}(\1{urcorner}(\\{currentpicture}));$%
+\par
+\quad\quad\quad\quad$\\{ymax\_}=\1{ypart}(\1{urcorner}(\\{currentpicture}));$%
+\par
+\quad\quad$\2{fi};$\par
+$\!\3{enddef};$\par
+\BL
+$\2{boolean}\\{show\_animation\_parameters};$\par
+$\\{show\_animation\_parameters}=\5{false};$\par
+$\2{numeric}\\{paper\_height};$\par
+$\\{paper\_height}=29.7;\ \9 paper height in cm\par
+\BL
+$\9 show bounding box of an animation, in PostScript points\par
+$\9 and parameters for animation script\par
+$\2{vardef}\\{show\_animation\_bbox}=$\par
+\quad\quad$\2{save}\\{trx},\\{try},h,w,\\{delta},\\{pnmx},\\{pnmy},\\{pnmw},%
+\\{pnmh},\\{res};$\par
+\quad\quad$\\{res}=36;\ \9 36 dots per inch in bitmap\par
+\quad\quad$w=\\{xmax\_}-\\{xmin\_};\ h=\\{ymax\_}-\\{ymin\_};$\par
+\quad\quad$\2{if}\\{show\_animation\_parameters}\?:$\par
+\quad\quad\quad\quad$\2{message}\7"animation bbox: (llx="\AM \1{decimal}%
+\1{round}(\\{xmin\_})$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7",lly="\AM \1{decimal}\1{round}(\\{ymin%
+\_})$\par
+\quad\quad\quad\quad\quad\quad${}\AM \7",w="\AM \1{decimal}\1{round}(w)\AM %
+\7",h="\AM \1{decimal}\1{round}(h)\AM \7")";$\par
+\quad\quad$\2{fi};$\par
+\quad\quad$\2{if}\\{xmin\_}\le 20\?:\\{trx}=50-\\{xmin\_};\ \2{else}\?:%
+\\{trx}=0;\ \2{fi};$\par
+\quad\quad$\2{if}\\{ymin\_}\le 20\?:\\{try}=50-\\{ymin\_};\ \2{else}\?:%
+\\{try}=0;\ \2{fi};$\par
+\quad\quad$\2{if}\\{show\_animation\_parameters}\?:$\par
+\quad\quad\quad\quad$\2{message}\7"translate parameters: "$\par
+\quad\quad\quad\quad${}\AM \1{decimal}\1{round}(\\{trx})\AM \7" "\AM %
+\1{decimal}\1{round}(\\{try});$\par
+\quad\quad$\2{fi};$\par
+\quad\quad$\\{xmin\_}:=\\{xmin\_}+\\{trx};\ \\{ymin\_}:=\\{ymin\_}+\\{try};$\par
+\quad\quad$\\{delta}=10;$\par
+\quad\quad$\\{pnmx}=\1{round}(\\{xmin\_}\ast (\\{res}/72)-\\{delta});$\par
+\quad\quad$\\{pnmy}=\1{round}((\\{paper\_height}/2.54\ast 72-\\{ymin\_}-h)\ast
+(\\{res}/72)-\\{delta});$\par
+\quad\quad$\\{pnmw}=\1{round}(w\ast (\\{res}/72)+2\ast \\{delta});$\par
+\quad\quad$\\{pnmh}=\1{round}(h\ast (\\{res}/72)+2\ast \\{delta});$\par
+\quad\quad$\2{if}\\{show\_animation\_parameters}\?:$\par
+\quad\quad\quad\quad$\2{message}\7"pnmcut parameters (with -r36): "$\par
+\quad\quad\quad\quad${}\AM \1{decimal}\\{pnmx}\AM \7" "\AM \1{decimal}\\{pnmy}%
+\AM \7" "$\par
+\quad\quad\quad\quad${}\AM \1{decimal}\\{pnmw}\AM \7" "\AM \1{decimal}%
+\\{pnmh};$\par
+\quad\quad$\2{fi};$\par
+\quad\quad$\\{write\_script}(\1{round}(\\{trx}),\1{round}(\\{try}),$\par
+\quad\quad\quad\quad$\\{pnmx},\\{pnmy},\\{pnmw},\\{pnmh},\\{res},\5{jobname},%
+\7"create_animation.sh");$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Creation of a shell script to automate the animation}
+$\9 This is UNIX targetted and may need to be customized.\par
+\BL
+$\2{vardef}\\{write\_script}(\2{expr}\\{trx},\\{try},\\{xmin},\\{ymin},w,h,%
+\\{res},\\{output},\\{file})=$\par
+\quad\quad$\2{save}s;$\par
+\quad\quad$\2{string}s;$\par
+\quad\quad$\2{def}\\{write\_to\_file}(\2{text}\\{arg})=\2{write}\\{arg}\4{to}%
+\\{file};\3{enddef};$\par
+\quad\quad$\\{write\_to\_file}(\7"#! /bin/sh");$\par
+\quad\quad$\\{write\_to\_file}(\7"");$\par
+\quad\quad$\\{write\_to\_file}(\7"/bin/rm -f "\AM \\{output}\AM \7".log");$\par
+\quad\quad$\\{write\_to\_file}(\7"for i in `ls "\AM \\{output}\AM \7".*| grep
+'"\AM \\{output}\AM \7".[0-9]'`;do");$\par
+\quad\quad\quad\quad$\2{if}\5{false}\?:\7"endfor"\2{fi}\9 indentation hack for
+meta-mode.el\par
+\quad\quad$\\{write\_to\_file}(\7"echo $i");$\par
+\quad\quad$\\{write\_to\_file}(\7"echo '=============='");$\par
+\quad\quad$s:=\7"awk < $i '{print} /^%%Page: /{print "\AM \\{ditto};$\par
+\quad\quad$s:=s\AM \1{decimal}\\{trx}\AM \7" "\AM \1{decimal}\\{try}\AM \7"
+translate\n"\AM \\{ditto}\AM \7"}' > $i.ps";$\par
+\quad\quad$\\{write\_to\_file}(s);$\par
+\quad\quad\quad\quad$\9 ghostscript PostScript into ppm\par
+\quad\quad$s:=\7"gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE ";$\par
+\quad\quad$s:=s\AM \7"-r"\AM \1{decimal}\\{res}\AM \7" -sOutputFile=$i.ppm -q
+-- $i.ps";$\par
+\quad\quad$\\{write\_to\_file}(s);$\par
+\quad\quad$\\{write\_to\_file}(\7"/bin/rm -f $i.ps");$\par
+\quad\quad\quad\quad$\9 possible alternative:\par
+\quad\quad\quad\quad$\9 $s:=\7"mogrify -compress -crop "\AM \1{decimal}(w)%
+\AM \7"x"\AM \1{decimal}(h);$\par
+\quad\quad\quad\quad$\9 $s:=s\AM \7"+"\AM \1{decimal}(\\{xmin})\AM \7"+"\AM %
+\1{decimal}(\\{ymin});$\par
+\quad\quad\quad\quad$\9 $s:=s\AM \7" -colors 32 -format gif $i.ppm";$\par
+\quad\quad$s:=\7"ppmquant 32 $i.ppm | pnmcut "\AM \1{decimal}(\\{xmin})\AM \7"
+"\AM \1{decimal}(\\{ymin});$\par
+\quad\quad$s:=s\AM \7" "\AM \1{decimal}(w)\AM \7" "\AM \1{decimal}(h)\AM \7" |
+";$\par
+\quad\quad$s:=s\AM \7"ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif";$\par
+\quad\quad$\\{write\_to\_file}(s);$\par
+\quad\quad$\\{write\_to\_file}(\7"/bin/rm -f $i.ppm");$\par
+\quad\quad$\\{write\_to\_file}(\7"done");$\par
+\quad\quad$\\{write\_to\_file}(\7"/bin/rm -f "\AM \\{output}\AM \7".gif");$\par
+\quad\quad$s:=\7"gifmerge -10 -l1000 ";$\par
+\quad\quad$s:=s\AM \\{output}\AM \7".*.gif > "\AM \\{output}\AM \7".gif";$\par
+\quad\quad$\\{write\_to\_file}(s);$\par
+\quad\quad$\\{write\_to\_file}(\7"/bin/rm -f "\AM \\{output}\AM \7".*.gif");$%
+\par
+\quad\quad$\\{write\_to\_file}(\\{EOF});\ \9 end of file\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+\title{Standard animation definitions}
+$\9 These definitions produce {\it one\/} image of some kind.\par
+\BL
+$\\{extra\_endfig}:=\7"compute_bbox";$\par
+\BL
+$\9 In the standard animations, the observer follows a circle, shown below:\par
+\figure{vect-fig.17}
+\BL
+$\9 Standard image 1: this is an example and may be adapted.\par
+$\9 $\\{name}$ is an object instance\par
+$\2{def}\\{one\_image}(\2{expr}\\{name},i,a,\\{rd},\\{ang})=$\par
+\quad\quad$\2{beginfig}(i);$\par
+\quad\quad\quad\quad$\\{set\_point}(\\{Obs},-\\{rd}\ast \1{cosd}(a\ast %
+\\{ang}),-\\{rd}\ast \1{sind}(a\ast \\{ang}),1);$\par
+\quad\quad\quad\quad$\\{Obs\_phi}:=90;\ \\{Obs\_dist}:=2;$\par
+\quad\quad\quad\quad$\\{point\_of\_view\_obj}(\\{name},1,\\{Obs\_phi});\ \9 fix
+point 1 of object $\\{name}$\par
+\quad\quad\quad\quad$\\{draw\_obj}(\\{name});$\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name},1,\\{vect\_I},\\{ang});$\par
+\quad\quad\quad\quad$\\{draw\_point}(\\{name},1);\ \9 show the rotation point%
+\par
+\quad\quad\quad\quad$\\{draw\_axes}(\\{red},\\{green},\\{blue});$\par
+\quad\quad$\!\3{endfig};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Standard image 2: this is an example and may be adapted.\par
+$\9 $\\{name\_a}$ and $\\{name\_b}$ are object instances.\par
+$\2{def}\\{one\_image\_two\_objects}(\2{expr}\\{name\_a},\\{name\_b},i,a,%
+\\{rd},\\{ang})=$\par
+\quad\quad$\2{beginfig}(i);$\par
+\quad\quad\quad\quad$\\{set\_point}(\\{Obs},-\\{rd}\ast \1{cosd}(a\ast %
+\\{ang}),-\\{rd}\ast \1{sind}(a\ast \\{ang}),1);$\par
+\quad\quad\quad\quad$\\{Obs\_phi}:=90;\ \\{Obs\_dist}:=2;$\par
+\quad\quad\quad\quad$\\{point\_of\_view\_obj}(\\{name\_a},1,\\{Obs\_phi});\ \9
+fix point 1 of object $\\{name\_a}$\par
+\quad\quad\quad\quad$\\{draw\_obj}(\\{name\_a});\ \\{draw\_obj}(\\{name\_b});$%
+\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_a},1,\\{vect\_I},\\{ang});$%
+\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_b},13,\\{vect\_J},-\\{ang});$%
+\par
+\quad\quad\quad\quad\quad\quad$\9$\\{rotate\_obj\_pp}(\\{name\_b},13,7,-%
+\\{ang});$\par
+\quad\quad\quad\quad$\\{draw\_point}(\\{name\_a},1);\ \9 show the rotation
+point\par
+\quad\quad\quad\quad$\\{draw\_axes}(\\{red},\\{green},\\{blue});$\par
+\quad\quad$\!\3{endfig};$\par
+$\!\3{enddef};$\par
+\BL
+\newpage
+$\9 Standard image 3: this is an example and may be adapted.\par
+$\9 $\\{name\_a}$, $\\{name\_b}$ and $\\{name\_c}$ are object instances.\par
+$\2{def}\\{one\_image\_three\_objects}(\2{expr}\\{name\_a},\\{name\_b},\\{name%
+\_c},i,a,\\{rd},\\{ang})=$\par
+\quad\quad$\2{beginfig}(i);$\par
+\quad\quad\quad\quad$\\{set\_point}(\\{Obs},-\\{rd}\ast \1{cosd}(a\ast %
+\\{ang}),-\\{rd}\ast \1{sind}(a\ast \\{ang}),1);$\par
+\quad\quad\quad\quad$\\{Obs\_phi}:=90;\ \\{Obs\_dist}:=2;\ \\{h\_field}:=100;\ %
+\\{v\_field}:=150;$\par
+\quad\quad\quad\quad$\\{point\_of\_view\_obj}(\\{name\_a},1,\\{Obs\_phi});\ \9
+fix point 1 of object $\\{name\_a}$\par
+\quad\quad\quad\quad$\\{draw\_obj}(\\{name\_a});\ \\{draw\_obj}(\\{name\_b});\ %
+\\{draw\_obj}(\\{name\_c});$\par
+\quad\quad\quad\quad$\\{v\_a}:=\\{new\_vect};$\par
+\quad\quad\quad\quad$\\{vect\_def}(\\{v\_a},.03\ast \1{cosd}(-a\ast %
+\\{ang}+90),.03\ast \1{sind}(-a\ast \\{ang}+90),0);$\par
+\quad\quad\quad\quad$\\{translate\_obj}(\\{name\_c},\\{v\_a});$\par
+\quad\quad\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_a},1,\\{vect\_I},\\{ang});$%
+\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_b},13,\\{vect\_J},-\\{ang});$%
+\par
+\quad\quad\quad\quad\quad\quad$\9$\\{rotate\_obj\_pp}(\\{name\_b},13,7,-%
+\\{ang});$\par
+\quad\quad\quad\quad$\\{draw\_point}(\\{name\_a},1);\ \9 show the rotation
+point\par
+\quad\quad\quad\quad$\\{draw\_axes}(\\{red},\\{green},\\{blue});$\par
+\quad\quad$\!\3{endfig};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Standard image 4: this is an example and may be adapted.\par
+$\9 $\\{name\_a}$ and $\\{name\_b}$ are object instances.\par
+$\2{def}\\{one\_image\_two\_identical\_objects}(\2{expr}\\{name\_a},\\{name%
+\_b},i,a,\\{rd},\\{ang})=$\par
+\quad\quad$\2{beginfig}(i);$\par
+\quad\quad\quad\quad$\\{set\_point}(\\{Obs},-\\{rd}\ast \1{cosd}(a\ast %
+\\{ang}),-\\{rd}\ast \1{sind}(a\ast \\{ang}),2);$\par
+\quad\quad\quad\quad$\\{Obs\_phi}:=90;\ \\{Obs\_dist}:=2;$\par
+\quad\quad\quad\quad$\\{point\_of\_view\_obj}(\\{name\_a},1,\\{Obs\_phi});\ \9
+fix point 1 of object $\\{name\_a}$\par
+\quad\quad\quad\quad$\\{draw\_obj}(\\{name\_a});\ \\{draw\_obj}(\\{name\_b});$%
+\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_a},1,\\{vect\_I},\\{ang});$%
+\par
+\quad\quad\quad\quad$\\{rotate\_obj\_pv}(\\{name\_b},13,\\{vect\_J},-\\{ang});$%
+\par
+\quad\quad\quad\quad\quad\quad$\9$\\{rotate\_obj\_pp}(\\{name\_a},13,7,-%
+\\{ang});$\par
+\quad\quad\quad\quad$\\{draw\_point}(\\{name\_a},1);\ \9 show the rotation
+point\par
+\quad\quad\quad\quad$\\{draw\_axes}(\\{red},\\{green},\\{blue});$\par
+\quad\quad$\!\3{endfig};$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage
+$\9 An animation is a series of images, and these series are produced here.\par
+\BL
+$\9 Standard animation 1\par
+$\9 $\\{name}$ is a class name\par
+$\2{def}\\{animate\_object}(\2{expr}\\{name},\\{imin},\\{imax},\\{index})=$\par
+\quad\quad$\2{numeric}\\{ang};\ \\{ang}=360/(\\{imax}-\\{imin}+1);$\par
+\quad\quad$\\{assign\_obj}(\7"obj",\\{name});$\par
+\quad\quad$\2{for}i:=\\{imin}\4{upto}\\{imax}\?:\\{one\_image}(\7"obj",i+%
+\\{index},i,5,\\{ang});\3{endfor};$\par
+\quad\quad$\\{show\_animation\_bbox};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Standard animation 2\par
+$\9 $\\{name\_a}$ and $\\{name\_b}$ are class names\par
+$\2{def}\\{animate\_two\_objects}(\2{expr}\\{name\_a},\\{name\_b},\\{imin},%
+\\{imax},\\{index})=$\par
+\quad\quad$\2{numeric}\\{ang};\ \\{ang}=360/(\\{imax}-\\{imin}+1);$\par
+\quad\quad$\\{assign\_obj}(\7"obja",\\{name\_a});\ \\{assign\_obj}(\7"objb",%
+\\{name\_b});$\par
+\quad\quad$\\{translate\_obj}(\7"objb",\\{vect\_K});\ \\{translate\_obj}(%
+\7"objb",\\{vect\_K});$\par
+\quad\quad$\2{for}i:=\\{imin}\4{upto}\\{imax}\?:$\par
+\quad\quad\quad\quad$\\{one\_image\_two\_objects}(\7"obja",\7"objb",i+%
+\\{index},i,5,\\{ang});$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{show\_animation\_bbox};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Standard animation 3\par
+$\9 $\\{name\_a}$, $\\{name\_b}$ and $\\{name\_c}$ are class names\par
+$\2{vardef}\\{animate\_three\_objects}(\2{expr}\\{name\_a},\\{name\_b},\\{name%
+\_c},\\{imin},\\{imax},\\{index})=$\par
+\quad\quad$\2{numeric}\\{ang};\ \\{ang}=360/(\\{imax}-\\{imin}+1);$\par
+\quad\quad$\\{assign\_obj}(\7"obja",\\{name\_a});\ \\{assign\_obj}(\7"objb",%
+\\{name\_b});$\par
+\quad\quad$\\{assign\_obj}(\7"objc",\\{name\_c});$\par
+\quad\quad$\\{scale\_obj}(\7"objb",.7);$\par
+\quad\quad$\2{numeric}\\{v\_a};\ \\{v\_a}:=\\{new\_vect};$\par
+\quad\quad$\\{vect\_def\_vect}(\\{v\_a},\\{vect\_K});\ \\{vect\_mult}(\\{v\_a},%
+\\{v\_a},4);\ \\{put\_obj}(\7"objb",\\{v\_a},1,0,0,0);$\par
+\quad\quad$\\{free\_vect}(\\{v\_a});$\par
+\quad\quad$\\{scale\_obj}(\7"objc",.5);$\par
+\quad\quad$\\{translate\_obj}(\7"objc",\\{vect\_K});\ \\{translate\_obj}(%
+\7"objc",\\{vect\_K});$\par
+\quad\quad$\2{for}i:=\\{imin}\4{upto}\\{imax}\?:$\par
+\quad\quad\quad\quad$\\{one\_image\_three\_objects}(\7"obja",\7"objb",%
+\7"objc",i+\\{index},i,7,\\{ang});$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{show\_animation\_bbox};$\par
+$\!\3{enddef};$\par
+\BL
+$\9 Standard animation 4\par
+$\9 $\\{name}$ is a class name\par
+$\2{def}\\{animate\_two\_identical\_objects}(\2{expr}\\{name},\\{imin},%
+\\{imax},\\{index})=$\par
+\quad\quad$\2{numeric}\\{ang};\ \\{ang}=360/(\\{imax}-\\{imin}+1);$\par
+\quad\quad$\\{assign\_obj}(\7"obja",\\{name});\ \\{assign\_obj}(\7"objb",%
+\\{name});$\par
+\quad\quad$\\{translate\_obj}(\7"objb",\\{vect\_K});\ \\{translate\_obj}(%
+\7"objb",\\{vect\_K});$\par
+\quad\quad$\2{for}i:=\\{imin}\4{upto}\\{imax}\?:$\par
+\quad\quad\quad\quad$\\{one\_image\_two\_identical\_objects}(\7"obja",%
+\7"objb",i+\\{index},i,10,\\{ang});$\par
+\quad\quad$\!\3{endfor};$\par
+\quad\quad$\\{show\_animation\_bbox};$\par
+$\!\3{enddef};$\par
+\BL
+$\5{endinput}$\par
+\BL
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.1 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.1
new file mode 100644
index 0000000000..e87ad97ac9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.1
@@ -0,0 +1,477 @@
+%!PS
+%%BoundingBox: -64 -9 60 353
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+newpath 2.49242 -0.00175 moveto
+2.49242 0.65881 2.23 1.29231 1.76291 1.7594 curveto
+1.29582 2.22649 0.66232 2.4889 0.00175 2.4889 curveto
+-0.65881 2.4889 -1.29231 2.22649 -1.7594 1.7594 curveto
+-2.22649 1.29231 -2.4889 0.65881 -2.4889 -0.00175 curveto
+-2.4889 -0.66232 -2.22649 -1.29582 -1.7594 -1.76291 curveto
+-1.29231 -2.23 -0.65881 -2.49242 0.00175 -2.49242 curveto
+0.66232 -2.49242 1.29582 -2.23 1.76291 -1.76291 curveto
+2.23 -1.29582 2.49242 -0.66232 2.49242 -0.00175 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -2.20303 43.50117 moveto
+1.35403 47.26656 lineto stroke
+ [] 0 setdash
+newpath -0.07095 43.52895 moveto
+1.35403 47.26656 lineto
+-2.29651 45.63136 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-62.25195 43.74171 lineto stroke
+ [] 0 setdash
+newpath -58.55077 45.25749 moveto
+-62.25195 43.74171 lineto
+-58.56303 42.19633 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-2.21994 104.30948 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -0.68816 100.6144 moveto
+-2.21994 104.30948 lineto
+-3.74968 100.61354 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.2 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.2
new file mode 100644
index 0000000000..78fc50a540
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.2
@@ -0,0 +1,497 @@
+%!PS
+%%BoundingBox: -68 -12 57 349
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+newpath 2.4792 0.00705 moveto
+2.4792 0.66762 2.21678 1.30112 1.7497 1.7682 curveto
+1.28261 2.23529 0.64911 2.49771 -0.01146 2.49771 curveto
+-0.67203 2.49771 -1.30553 2.23529 -1.77261 1.7682 curveto
+-2.2397 1.30112 -2.50212 0.66762 -2.50212 0.00705 curveto
+-2.50212 -0.65352 -2.2397 -1.28702 -1.77261 -1.7541 curveto
+-1.30553 -2.22119 -0.67203 -2.48361 -0.01146 -2.48361 curveto
+0.64911 -2.48361 1.28261 -2.22119 1.7497 -1.7541 curveto
+2.21678 -1.28702 2.4792 -0.65352 2.4792 0.00705 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -6.61095 43.56754 moveto
+4.01413 47.28503 lineto stroke
+ [] 0 setdash
+newpath 1.0315 44.6197 moveto
+4.01413 47.28503 lineto
+0.02042 47.50948 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-65.25195 44.28316 lineto stroke
+ [] 0 setdash
+newpath -61.53806 45.76872 moveto
+-65.25195 44.28316 lineto
+-61.57541 42.70741 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-6.66168 104.37543 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -5.12784 100.68123 moveto
+-6.66168 104.37543 lineto
+-8.18936 100.67867 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.3 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.3
new file mode 100644
index 0000000000..a666f4210c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.3
@@ -0,0 +1,449 @@
+%!PS
+%%BoundingBox: -70 -15 56 350
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+newpath 2.49773 -0.00089 moveto
+2.49773 0.65968 2.2353 1.29318 1.76822 1.76027 curveto
+1.30113 2.22736 0.66763 2.48978 0.00706 2.48978 curveto
+-0.6535 2.48978 -1.287 2.22736 -1.75409 1.76027 curveto
+-2.22118 1.29318 -2.4836 0.65968 -2.4836 -0.00089 curveto
+-2.4836 -0.66145 -2.22118 -1.29495 -1.75409 -1.76204 curveto
+-1.287 -2.22913 -0.6535 -2.49155 0.00706 -2.49155 curveto
+0.66763 -2.49155 1.30113 -2.22913 1.76822 -1.76204 curveto
+2.2353 -1.29495 2.49773 -0.66145 2.49773 -0.00089 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -10.89844 43.68222 moveto
+6.65823 47.29353 lineto stroke
+ [] 0 setdash
+newpath 3.34695 45.04964 moveto
+6.65823 47.29353 lineto
+2.73013 48.04836 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-67.24995 44.8544 lineto stroke
+ [] 0 setdash
+newpath -63.52336 46.30801 moveto
+-67.24995 44.8544 lineto
+-63.58702 43.2471 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-10.98207 104.49692 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -9.44606 100.80312 moveto
+-10.98207 104.49692 lineto
+-12.50792 100.7989 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.4 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.4
new file mode 100644
index 0000000000..b861e3f5e2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.4
@@ -0,0 +1,497 @@
+%!PS
+%%BoundingBox: -73 -18 54 350
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+newpath 2.49155 0.00531 moveto
+2.49155 0.66588 2.22913 1.29938 1.76204 1.76646 curveto
+1.29495 2.23355 0.66145 2.49597 0.00089 2.49597 curveto
+-0.65968 2.49597 -1.29318 2.23355 -1.76027 1.76646 curveto
+-2.22736 1.29938 -2.48978 0.66588 -2.48978 0.00531 curveto
+-2.48978 -0.65526 -2.22736 -1.28876 -1.76027 -1.75584 curveto
+-1.29318 -2.22293 -0.65968 -2.48535 0.00089 -2.48535 curveto
+0.66145 -2.48535 1.29495 -2.22293 1.76204 -1.75584 curveto
+2.22913 -1.28876 2.49155 -0.65526 2.49155 0.00531 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -15.05333 43.85922 moveto
+9.20341 47.31767 lineto stroke
+ [] 0 setdash
+newpath 5.76093 45.2806 moveto
+9.20341 47.31767 lineto
+5.3288 48.31151 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-68.28326 45.46832 lineto stroke
+ [] 0 setdash
+newpath -64.54356 46.8866 moveto
+-68.28326 45.46832 lineto
+-64.63606 43.82675 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-15.16887 104.67435 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -13.63092 100.98135 moveto
+-15.16887 104.67435 lineto
+-16.69278 100.97552 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.5 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.5
new file mode 100644
index 0000000000..fa3455e624
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/anim.5
@@ -0,0 +1,497 @@
+%!PS
+%%BoundingBox: -74 -22 57 352
+%%Creator: MetaPost
+%%CreationDate: 1997.05.01:1712
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+newpath 2.49864 0.00887 moveto
+2.49864 0.66943 2.23622 1.30293 1.76913 1.77002 curveto
+1.30205 2.2371 0.66855 2.49953 0.00798 2.49953 curveto
+-0.65259 2.49953 -1.28609 2.2371 -1.75317 1.77002 curveto
+-2.22026 1.30293 -2.48268 0.66943 -2.48268 0.00887 curveto
+-2.48268 -0.6517 -2.22026 -1.2852 -1.75317 -1.75229 curveto
+-1.28609 -2.21938 -0.65259 -2.4818 0.00798 -2.4818 curveto
+0.66855 -2.4818 1.30205 -2.21938 1.76913 -1.75229 curveto
+2.23622 -1.2852 2.49864 -0.6517 2.49864 0.00887 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -18.98454 44.09567 moveto
+11.65569 47.35223 lineto stroke
+ [] 0 setdash
+newpath 8.14252 45.43936 moveto
+11.65569 47.35223 lineto
+7.81891 48.48389 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-68.329 46.1137 lineto stroke
+ [] 0 setdash
+newpath -64.57408 47.49214 moveto
+-68.329 46.1137 lineto
+-64.6992 44.43321 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-19.13023 104.91757 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -17.59064 101.22575 moveto
+-19.13023 104.91757 lineto
+-20.65216 101.21843 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/animpoly.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/animpoly.mp
new file mode 100644
index 0000000000..729637050b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/animpoly.mp
@@ -0,0 +1,32 @@
+% Animation of polyhedra
+% Example of use of 3d and poly packages
+% METAPOST
+% Denis Roegel, 8 April 1998
+
+% package 3d
+input 3d-1.0
+
+% polyhedra definitions
+input poly
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+%
+%show_animation_parameters:=true; % default value is |false|
+
+% animations
+%animate_object("tetrahedron",1,100,100);
+%animate_object("cube",1,100,100);
+%animate_object("octahedron",1,100,100);
+%animate_object("dodecahedron",1,100,100);
+%animate_object("icosahedron",1,100,100);
+%animate_two_objects("dodecahedron","icosahedron",1,100,100);
+animate_three_objects("dodecahedron","icosahedron","octahedron",1,100,100);
+%animate_two_identical_objects("dodecahedron",1,100,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/cube.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/cube.ps
new file mode 100644
index 0000000000..fc07184f17
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/cube.ps
@@ -0,0 +1,34 @@
+%!PS
+%%BoundingBox: -33 0 30 65
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath fill
+ 0 setgray
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/dodeca.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/dodeca.ps
new file mode 100644
index 0000000000..2a3cc49ffe
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/dodeca.ps
@@ -0,0 +1,80 @@
+%!PS
+%%BoundingBox: -46 -8 46 74
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath fill
+ 0 setgray
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath fill
+ 0 setgray
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath fill
+ 0 setgray
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa-w.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa-w.ps
new file mode 100644
index 0000000000..3715f0ef97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa-w.ps
@@ -0,0 +1,157 @@
+%!PS
+%%BoundingBox: -117 -31 61 130
+%%Creator: MetaPost
+%%CreationDate: 1997.04.25:1731
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 1 setgray 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash 1 setlinecap
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-83.98907 15.99922 lineto
+-116.7492 70.0534 lineto
+ closepath stroke
+newpath -77.9753 -13.86514 moveto
+-0.19029 -30.73163 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+20.03435 55.02917 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+60.1313 36.75247 lineto
+20.03435 55.02917 lineto
+ closepath stroke
+newpath -116.7492 70.0534 moveto
+-83.98907 15.99922 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath -83.98907 15.99922 moveto
+20.03435 55.02917 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+60.1313 36.75247 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+28.53722 127.19768 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 28.53722 127.19768 moveto
+-51.86171 129.12445 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa.ps
new file mode 100644
index 0000000000..7ffa8b6242
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/icosa.ps
@@ -0,0 +1,100 @@
+%!PS
+%%BoundingBox: -45 -9 45 74
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.9 0 0.2 setrgbcolor
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath stroke
+ 0.5 0.3 0 setrgbcolor
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 0.3 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 1 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath stroke
+ 0.4 0 0.6 setrgbcolor
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 0.4 0.2 setrgbcolor
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 0.2 1 0.3 setrgbcolor
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath stroke
+ 0.1 0.2 0.9 setrgbcolor
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 1 0.2 setrgbcolor
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugbib.bst b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugbib.bst
new file mode 100644
index 0000000000..19b89fd270
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugbib.bst
@@ -0,0 +1,1154 @@
+%%
+%% This is file `ltugbib.bst',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tugboat.dtx (with options: `tugbib')
+%%
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ {}
+ { label extra.label sort.label long.label short.label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem[" write$
+ "\protect\citeauthoryear{" long.label * "}{" * write$
+ short.label write$
+ "}{" year duplicate$ empty$
+ { pop$ "????" }
+ 'skip$
+ if$
+ * extra.label * "}]{" * write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {bolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ nameptr #1 =
+ { "{vv~}{ll}{, jj}{, ff}" format.name$ }
+ { "{f.~}{vv~}{ll}{, jj}" format.name$ }
+ if$
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " \etal{}" * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.names.ed}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{f.~}{vv~}{ll}{, jj}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " \etal{}" * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.editors}
+{ editor empty$
+ { "" }
+ { editor format.names.ed
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title
+ "``" swap$ * "''" *
+ }
+ if$
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{ "In " }
+
+FUNCTION {format.date}
+{ year duplicate$ empty$
+ { "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????" }
+ 'skip$
+ if$
+ extra.label *
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "volume" volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ bolden
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ", " * pages n.dashify * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "chapter" }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { word.in booktitle emphasize * }
+ { word.in booktitle emphasize * ", edited by " *
+ format.in.editors * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ word.in
+ "\cite{" * crossref * "}" *
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ word.in
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "\cite{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ word.in
+ "\cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ " " * before.all 'output.state :=
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ {
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ address output
+ new.sentence
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ new.block
+ format.title output
+ new.block
+ howpublished output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "Ph.D.\ thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address output
+ new.sentence
+ organization output
+ publisher output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+
+READ
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ % 2nd number of names
+ " \etal{}" *
+ }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " \etal{}" * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.long.lab.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv~}{ll}" format.name$ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " \etal{}" * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {author.key}
+{ author empty$
+ { "{"
+ key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$ *
+ "}" *
+ }
+ 'author
+ if$
+}
+
+FUNCTION {author.editor.key}
+{ author empty$
+ { editor empty$
+ { "{"
+ key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$ *
+ "}" *
+ }
+ 'editor
+ if$
+ }
+ 'author
+ if$
+}
+
+FUNCTION {editor.key}
+{ editor empty$
+ { "{"
+ key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$ *
+ "}" *
+ }
+ 'editor
+ if$
+}
+
+FUNCTION {maybe.other.name.field}
+{ swap$ % [stack: other.field name]
+ duplicate$ empty$ % is the name empty?
+ { pop$ % discard it [stack: other.field]
+ #1 swap$ 'skip$ if$ % try the other one
+ }
+ { swap$ pop$ % discard other.field
+ }
+ if$
+}
+
+FUNCTION {calc.label.names}
+{ type$ "proceedings" =
+ 'editor
+ 'author
+ if$
+ 'editor maybe.other.name.field
+ 'organization maybe.other.name.field
+ 'key maybe.other.name.field
+ { "Cannot create a label name in " cite$ * warning$
+ cite$ #1 #3 substring$ } maybe.other.name.field
+}
+
+FUNCTION {calc.short.label}
+{ calc.label.names format.lab.names
+ 'short.label :=
+}
+
+FUNCTION {calc.label}
+{ calc.short.label
+ short.label ", " *
+ year duplicate$ empty$
+ { pop$ "????" }
+ { purify$ #-1 #4 substring$ }
+ if$
+ *
+ 'label :=
+}
+
+FUNCTION {calc.long.label}
+{ calc.label.names format.long.lab.names
+ 'long.label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$
+ s nameptr
+ "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
+ format.name$ 't :=
+ nameptr numnames = t "others" = and
+ { "et al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.label :=
+ sort.label
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT
+
+STRINGS { last.label next.extra }
+
+INTEGERS { last.extra.num }
+
+FUNCTION {initialize.extra.label.stuff}
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION {forward.pass}
+{ last.label label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ label 'last.label :=
+ }
+ if$
+}
+
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {bib.sort.order}
+{ sort.label
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+ calc.long.label
+}
+
+ITERATE {bib.sort.order}
+
+SORT
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+%%
+%%
+%% End of file `ltugbib.bst'.
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugboat.cls b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugboat.cls
new file mode 100644
index 0000000000..3079481d07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/ltugboat.cls
@@ -0,0 +1,1105 @@
+% slight correction by D. Roegel, october 28, 1997 (see under my name)
+%%
+%% This is file `ltugboat.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tugboat.dtx (with options: `latex,classtop,common,classtail,latex2e,ltugboatcls')
+%%
+%% Copyright (C) 1994,1995,1996 TeX Users Group
+%% All rights reserved.
+%%
+%% This file is part of the Tugboat package.
+%% -----------------------------------------
+%%
+%% This is a generated file. Permission is granted to to customize the
+%% declarations in this file to serve the needs of your installation.
+%% However, no permission is granted to distribute a modified version of
+%% this file under its original name.
+%%
+%%
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesClass {ltugboat}
+ [1996/10/14 v1.4b
+ TUGboat journal class%
+ ]
+\csname tugstyloaded@\endcsname
+\def\tugstyloaded@{\tugstyinit\endinput}
+\providecommand{\@tugclass}{ltugboat}
+\def\TBInfo{\ClassInfo{\@tugclass}}
+\def\TBError{\ClassError{\@tugclass}}
+\def\TBWarning{\ClassWarning{\@tugclass}}
+\newif\ifpreprint
+\def\preprint{\preprinttrue}
+\DeclareOption{draft}{%
+ \AtEndOfClass{%
+ \setcounter{page}{1001}%
+ \BlackBoxes
+ \def\MakeRegistrationMarks{}%
+ \PrelimDrafttrue
+ }%
+}
+\DeclareOption{preprint}{%
+ \preprinttrue
+}
+\DeclareOption{final}{%
+ \AtEndOfClass{%
+ \UseTrimMarks
+ \NoBlackBoxes
+ \PrelimDraftfalse % was False (typo corrected, D. Roegel, october 28, 1997)
+ }%
+}
+\DeclareOption{11pt}{%
+ \TBWarning{The \@tugclass\space class only supports 10pt fonts:
+ \MessageBreak option \CurrentOption\space ignored}%
+}
+\DeclareOption{12pt}{\csname ds@11pt\endcsname}
+\DeclareOption{oneside}{Option \CurrentOption\space ignored}
+\DeclareOption{twoside}{\ds@oneside}
+\DeclareOption{onecolumn}{\ds@oneside}
+\DeclareOption{twocolumn}{\ds@oneside}
+\DeclareOption{tugproc}{%
+ \TBWarning{Option \CurrentOption\space ignored: use class ltugproc
+ instead of \@tugclass}%
+}
+\DeclareOption{rawcite}{\let\if@Harvardcite\iffalse}
+\DeclareOption{harvardcite}{\let\if@Harvardcite\iftrue}
+\DeclareOption{numbersec}{\let\if@numbersec\iftrue}
+\DeclareOption{nonumber}{\let\if@numbersec\iffalse}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ExecuteOptions{draft,numbersec,rawcite}
+\ProcessOptions
+\LoadClass[twoside]{article}
+\def\sectitlefont{\fontfamily\sfdefault\fontseries{bx}\fontshape{n}%
+ \fontsize\@xviipt\stbaselineskip\selectfont}
+\def\tensl{\fontseries{m}\fontshape{sl}\fontsize\@xpt\@xiipt
+ \selectfont}
+\def\EdNoteFont{\fontfamily{cmr}\fontseries{m}\fontshape{ui}%
+ \fontsize\@xpt\@xiipt\selectfont}
+\IfFileExists{mflogo.sty}%
+ {\RequirePackage{mflogo}}%
+ {\TBWarning
+ {Package mflogo.sty not available --\MessageBreak
+ Proceeding to emulate mflogo.sty}
+ \DeclareRobustCommand\logofamily{%
+ \not@math@alphabet\logofamily\relax
+ \fontencoding{U}\fontfamily{logo}\selectfont}
+ \DeclareTextFontCommand{\textlogo}{\logofamily}
+ \def\MF{\textlogo{META}\-\textlogo{FONT}\@}
+ \def\MP{\textlogo{META}\-\textlogo{POST}\@}
+ \DeclareFontFamily{U}{logo}{}
+ \DeclareFontShape{U}{logo}{m}{n}{
+ <8> <9> gen * logo
+ <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> logo10
+ }{}
+ \DeclareFontShape{U}{logo}{m}{sl}{
+ <8> <9> gen * logosl
+ <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> logosl10
+ }{}
+ \DeclareFontShape{U}{logo}{m}{it}{
+ <-> ssub * logo/m/sl
+ }{}%
+ }
+\def\makeescape#1{\catcode`#1=\z@}
+\def\makebgroup#1{\catcode`#1=\@ne}
+\def\makeegroup#1{\catcode`#1=\tw@}
+\def\makemath #1{\catcode`#1=\thr@@}
+\def\makealign #1{\catcode`#1=4 }
+\def\makeeol #1{\catcode`#1=5 }
+\def\makeparm #1{\catcode`#1=6 }
+\def\makesup #1{\catcode`#1=7 }
+\def\makesub #1{\catcode`#1=8 }
+\def\makeignore#1{\catcode`#1=9 }
+\def\makespace #1{\catcode`#1=10 }
+\def\makeletter#1{\catcode`#1=11 }
+\chardef\other=12
+\let\makeother\@makeother
+\def\makeactive#1{\catcode`#1=13 }
+\def\makecomment#1{\catcode`#1=14 }
+\def\savecat#1{%
+ \expandafter\xdef\csname\string#1savedcat\endcsname{\the\catcode`#1}}
+\def\restorecat#1{\catcode`#1=\csname\string#1savedcat\endcsname}
+\def\SaveCS#1{\expandafter\let\csname saved@@#1\expandafter\endcsname
+ \csname#1\endcsname}
+\def\RestoreCS#1{\expandafter\let\csname#1\expandafter\endcsname
+ \csname saved@@#1\endcsname}
+\def\plaintubstyle{plain}
+\def\latextubstyle{latex}
+\providecommand\hb@xt@{\hbox to}
+\providecommand\textsuperscript[1]{\ensuremath{\m@th
+ ^{\mbox{\fontsize\sf@size\z@
+ \selectfont #1}}}}
+\def\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}
+\def\AMS{American Mathematical Society}
+\def\AmS{$\mathcal{A}$\kern-.1667em\lower.5ex\hbox
+ {$\mathcal{M}$}\kern-.125em$\mathcal{S}$}
+\def\AmSLaTeX{\AmS-\LaTeX}
+\def\AmSTeX{\AmS-\TeX}
+\def\aw{A\kern.1em-W}
+\def\AW{Addison\kern.1em-\penalty\z@\hskip\z@skip Wesley}
+\def\BibTeX{\textsc{Bib}\kern-.08em\TeX}
+\def\CandT{\textsl{Computers \& Typesetting}}
+\def\CTAN{\acro{CTAN}}
+\def\DTD{\acro{DTD}}
+\def\DVItoVDU{DVIto\kern-.12em VDU}
+\DeclareRobustCommand\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+\def\HTML{\acro{HTML}}
+\def\ISBN{\acro{ISBN}}
+\def\ISSN{\acro{ISSN}}
+\def\JTeX{\leavevmode\hbox{\lower.5ex\hbox{J}\kern-.18em\TeX}}
+\def\JoT{\textsl{The Joy of \TeX}}
+\def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em
+ $\m@th$\fontsize\sf@size\z@\selectfont
+ $\m@th\mathcal{A}$}%
+ \kern-.2em\lower.376ex\hbox{$\m@th\mathcal{M}$}\kern-.125em
+ {$\m@th\mathcal{S}$}-\TeX}
+\newcommand{\La}%
+ {L\kern-.36em
+ {\setbox0\hbox{T}%
+ \vbox to\ht0{\hbox{$\m@th$%
+ \csname S@\f@size\endcsname
+ \fontsize\sf@size\z@
+ \math@fontsfalse\selectfont
+ A}%
+ \vss}%
+ }}
+\def\Mc{\setbox\TestBox=\hbox{M}M\vbox
+ to\ht\TestBox{\hbox{c}\vfil}} % for Robert McGaffey
+\def\mf{\textsc{Metafont}}
+\def\MFB{\textsl{The \MF book}}
+\def\mp{MetaPost}
+\DeclareTextSymbol{\textohm}{OT1}{'012}
+\DeclareTextSymbolDefault{\textohm}{OT1}
+\newcommand\OMEGA{\textohm}
+\DeclareRobustCommand{\OTP}{\OMEGA\acro{TP}}
+\def\mtex{T\kern-.1667em\lower.424ex\hbox{\^E}\kern-.125emX\@}
+\DeclareRobustCommand\NTS{$\mathcal{N}$\lower.5ex\hbox
+ {$\mathcal{T}$}$\mathcal{S}$\@}
+\def\pcMF{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}MF\@}
+\def\PCTeX{PC\thinspace\TeX}
+\def\pcTeX{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}\TeX}
+\def\Pas{Pascal}
+\def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\@}
+\def\PiCTeX{\PiC\kern-.11em\TeX}
+\def\plain{\texttt{plain}}
+\def\POBox{P.\thinspace O.~Box }
+\def\PS{{Post\-Script}}
+\def\SC{Steering Committee}
+\def\SGML{\acro{SGML}}
+\def\SliTeX{\textrm{S\kern-.06em\textsc{l\kern-.035emi}%
+ \kern-.06em\TeX}}
+ \def\slMF{\textsl{\MF}} % should never be used
+ \def\stTeX{\textsc{st}\kern-0.13em\TeX}
+\def\TANGLE{\texttt{TANGLE}\@}
+\def\TB{\textsl{The \TeX book}}
+\def\TP{\textsl{\TeX}: \textsl{The Program}}
+\DeclareRobustCommand\TeX{T\kern-.1667em\lower.424ex\hbox{E}\kern-.125emX\@}
+\def\TeXhax{\TeX hax}
+\def\TeXMaG{\TeX M\kern-.1667em\lower.5ex\hbox{A}%
+ \kern-.2267emG\@}
+\def\TeXtures{\textit{Textures}}
+\let\Textures=\TeXtures
+\def\TeXXeT{\TeX-{}-\XeT}
+\def\ttn{\textsl{TTN}\@}
+\def\TTN{\textsl{\TeX{} and TUG News}\@}
+\let\texttub\textsl % redefined in other situations
+\def\TUB{\texttub{TUGboat}}
+\def\TUG{\TeX\ \UG}
+\def\tug{\acro{TUG}}
+\def\UG{Users Group}
+\def\UNIX{\acro{UNIX}}
+\def\VAX{V\kern-.12em A\kern-.1em X\@}
+\def\VorTeX{V\kern-2.7\p@\lower.5ex\hbox{O\kern-1.4\p@ R}\kern-2.6\p@\TeX}
+\def\XeT{X\kern-.125em\lower.424ex\hbox{E}\kern-.1667emT\@}
+\def\WEB{\texttt{WEB}\@}
+\def\WEAVE{\texttt{WEAVE}\@}
+\newlinechar=`\^^J
+\normallineskiplimit=\p@
+\clubpenalty=10000
+\widowpenalty=10000
+\def\NoParIndent{\parindent=\z@}
+\newdimen\normalparindent
+\normalparindent=20\p@
+\def\NormalParIndent{\global\parindent=\normalparindent}
+\NormalParIndent
+\def\BlackBoxes{\overfullrule=5\p@}
+\def\NoBlackBoxes{\overfullrule=\z@}
+\def\newline{\hskip\z@\@plus\pagewd\break}
+\edef\allowhyphens{\noexpand\hyphenpenalty\the\hyphenpenalty\relax
+ \noexpand\exhyphenpenalty\the\exhyphenpenalty\relax}
+\def\nohyphens{\hyphenpenalty\@M\exhyphenpenalty\@M}
+\newbox\T@stBox \newbox\TestBox
+\newcount\T@stCount \newcount\TestCount
+\newdimen\T@stDimen \newdimen\TestDimen
+\newif\ifT@stIf \newif\ifTestIf
+\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax }
+\newif\iftop@ \newif\ifbot@
+\def\topsmash{\top@true\bot@false\smash@}
+\def\botsmash{\top@false\bot@true\smash@}
+\def\smash{\top@true\bot@true\smash@}
+\def\smash@{\relax\ifmmode\def\next{\mathpalette\mathsm@sh}%
+ \else\let\next\makesm@sh\fi \next }
+\def\finsm@sh{\iftop@\ht\z@\z@\fi\ifbot@\dp\z@\z@\fi\box\z@}
+\long\def\ulap#1{\vbox to \z@{\vss#1}}
+\long\def\dlap#1{\vbox to \z@{#1\vss}}
+\def\xlap#1{\hb@xt@\z@{\hss#1\hss}}
+\long\def\ylap#1{\vbox to \z@{\vss#1\vss}}
+\long\def\zlap#1{\ylap{\xlap{#1}}}
+\def\basezero{\baselineskip\z@skip \lineskip\z@skip}
+\def\nullhrule{\hrule \@height\z@ \@depth\z@ \@width\z@ }
+\def\nullvrule{\vrule \@height\z@ \@depth\z@ \@width\z@ }
+\def\makestrut[#1;#2]{\vrule \@height#1 \@depth#2 \@width\z@ }
+\def\drawoutlinebox[#1;#2;#3]{\T@stDimen=#3
+ \vbox to#1{\hrule \@height\T@stDimen \@depth\z@
+ \vss\hb@xt@#2{\vrule \@width\T@stDimen
+ \hfil\makestrut[#1;\z@]%
+ \vrule \@width\T@stDimen}\vss
+ \hrule \@height\T@stDimen \@depth\z@}}
+\newcount\hours
+\newcount\minutes
+\def\SetTime{\hours=\time
+ \global\divide\hours by 60
+ \minutes=\hours
+ \multiply\minutes by 60
+ \advance\minutes by-\time
+ \global\multiply\minutes by-1 }
+\SetTime
+\def\now{\number\hours:\ifnum\minutes<10 0\fi\number\minutes}
+\def\Now{\today\ \now}
+\newif\ifPrelimDraft
+\def\midrtitle{\ifPrelimDraft {\textsl{preliminary draft, \Now}}\fi}
+\newdimen\raggedskip \raggedskip=\z@
+\newdimen\raggedstretch \raggedstretch=5em % ems of font set now (10pt)
+\newskip\raggedparfill \raggedparfill=\z@\@plus 1fil
+\def\raggedspaces{\spaceskip=.3333em \relax \xspaceskip=.5em \relax }
+\def\raggedright{%
+ \nohyphens
+ \rightskip=\raggedskip\@plus\raggedstretch \raggedspaces
+ \parfillskip=\raggedparfill }
+\def\raggedleft{%
+ \nohyphens
+ \leftskip=\raggedskip\@plus\raggedstretch \raggedspaces
+ \parfillskip=\z@skip }
+\def\raggedcenter{%
+ \nohyphens
+ \leftskip=\raggedskip\@plus\raggedstretch
+ \rightskip=\leftskip \raggedspaces
+ \parindent=\z@ \parfillskip=\z@skip }
+\def\normalspaces{\spaceskip\z@skip \xspaceskip\z@skip }
+\def~{\unskip\nobreak\ \ignorespaces}
+\def\boxcs#1{\box\csname#1\endcsname}
+\def\setboxcs#1{\setbox\csname#1\endcsname}
+\def\newboxcs#1{\expandafter\newbox\csname#1\endcsname}
+\let\gobble\@gobble
+\def\vellipsis{%
+ \leavevmode\kern0.5em
+ \raise\p@\vbox{\baselineskip6\p@\vskip7\p@\hbox{.}\hbox{.}\hbox{.}}
+ }
+\def\bull{\vrule \@height 1ex \@width .8ex \@depth -.2ex }
+\def\cents{{\rm\raise.2ex\rlap{\kern.05em$\scriptstyle/$}c}}
+\def\Dag{\raise .6ex\hbox{$\scriptstyle\dagger$}}
+\def\careof{\leavevmode\hbox{\raise.75ex\hbox{c}\kern-.15em
+ /\kern-.125em\smash{\lower.3ex\hbox{o}}} \ignorespaces}
+\DeclareRobustCommand\sfrac[1]{\@ifnextchar/{\@sfrac{#1}}%
+ {\@sfrac{#1}/}}
+\def\@sfrac#1/#2{\leavevmode\kern.1em\raise.5ex
+ \hbox{$\m@th\mbox{\fontsize\sf@size\z@
+ \selectfont#1}$}\kern-.1em
+ /\kern-.15em\lower.25ex
+ \hbox{$\m@th\mbox{\fontsize\sf@size\z@
+ \selectfont#2}$}}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+\def\thinskip{\hskip 0.16667em\relax}
+\def\endash{--}
+\def\emdash{\endash-}
+\def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces}
+\def\dash{\d@sh\nobreak\endash}
+\def\Dash{\d@sh\nobreak\emdash}
+\def\ldash{\d@sh\empty{\hbox{\endash}\nobreak}}
+\def\rdash{\d@sh\nobreak\endash}
+\def\Ldash{\d@sh\empty{\hbox{\emdash}\nobreak}}
+\def\Rdash{\d@sh\nobreak\emdash}
+\def\hyph{-\penalty\z@\hskip\z@skip }
+\def\slash{/\penalty\z@\hskip\z@skip }
+\def\nth#1{%
+ \def\reserved@a##1##2\@nil{\ifcat##1n%
+ 0%
+ \let\reserved@b\ensuremath
+ \else##1##2%
+ \let\reserved@b\relax
+ \fi}%
+ \TestCount=\reserved@a#1\@nil\relax
+ \ifnum\TestCount <0 \multiply\TestCount by\m@ne \fi % subdue negatives
+ \T@stCount=\TestCount
+ \divide\T@stCount by 100 \multiply\T@stCount by 100
+ \advance\TestCount by-\T@stCount % n mod 100
+ \ifnum\TestCount >20 \T@stCount=\TestCount
+ \divide\T@stCount by 10 \multiply\T@stCount by 10
+ \advance\TestCount by-\T@stCount % n mod 10
+ \fi
+ \reserved@b{#1}%
+ \textsuperscript{\ifcase\TestCount th% 0th
+ \or st% 1st
+ \or nd% 2nd
+ \or rd% 3rd
+ \else th% nth
+ \fi}%
+ }
+\def\Review{\@ifnextchar:{\@Review}{\@Review:}}
+\def\@Review:{\@ifnextchar[%]
+ {\@Rev}%
+ {\@Rev[Book review]}}
+\def\@Rev[#1]#2{{\ignorespaces#1\unskip:\enspace\ignorespaces
+ \slshape\mdseries#2}}
+\def\reviewitem{\addvspace{\BelowTitleSkip}%
+ \def\revauth##1{\def\therevauth{##1, }\ignorespaces}%
+ \def\revtitle##1{\def\therevtitle{{\slshape##1}. }\ignorespaces}%
+ \def\revpubinfo##1{\def\therevpubinfo{##1.}\ignorespaces}%
+ }
+\def\endreviewitem{{\noindent\interlinepenalty=10000
+ \therevauth\therevtitle\therevpubinfo\endgraf}%
+ \vskip\medskipamount
+ }
+\def\booktitle#1{{\slshape#1\/}}
+\newcount\issueseqno \issueseqno=-1
+\def\v@lx{\gdef\volx{Volume~\volno~(\volyr), No.~\issno}}
+\def\volyr{}
+\def\volno{}
+\def\vol #1,#2.{\gdef\volno{#1\unskip}%
+ \gdef\issno{\ignorespaces#2\unskip}%
+ \setbox\TestBox=\hbox{\volyr}%
+ \ifdim \wd\TestBox > .2em \v@lx \fi }
+\def\issdate #1#2 #3.{\gdef\issdt{#1#2 #3}\gdef\volyr{#3}%
+ \gdef\bigissdt{#1{\smc\uppercase{#2}} #3}%
+ \setbox\TestBox=\hbox{\volno}%
+ \ifdim \wd\TestBox > .2em \v@lx \fi }
+\vol 0, 0.
+\issdate Thermidor, 2001.
+\def\tubissue#1{\@ifnextchar(%)
+ {\@tubissue@b{#1}}
+ {\@tubissue@a{#1}}}
+\def\@tubissue@b#1(#2){\@tubissue@a{#1}{#2}}
+\def\@tubissue@a#1#2%
+ {\TUB~#1, no.~#2}
+\def\infil@{\jobname}
+\def\Input #1 {\ifnum\issueseqno<0
+ \def\infil@{#1}%
+ \else
+ \def\infil@{tb\number\issueseqno#1}
+ \fi
+ \edef\jobname{\infil@}\@readFLN
+ \@@input \infil@\relax
+ \if@RMKopen
+ \immediate\closeout\@TBremarkfile\@RMKopenfalse
+ \fi
+}
+\newif\if@RMKopen \@RMKopenfalse
+\newwrite\@TBremarkfile
+\def\@TBremark#1{%
+ \if@RMKopen
+ \else
+ \@RMKopentrue\immediate\openout\@TBremarkfile=\infil@.rmk
+ \fi
+ \toks@={#1}%
+ \immediate\write\@TBremarkfile{^^J\the\toks@}%
+ \immediate\write16{^^JTBremark:: \the\toks@^^J}%
+}
+\let\TBremark=\gobble
+\def\TBEnableRemarks{\let\TBremark\@TBremark}
+\def\TUBedit#1{}
+\def\TUBfilename#1#2{\expandafter\def\csname file@@#1\endcsname{#2}}
+\InputIfFileExists{\jobname.fln}%
+ {\TBInfo{Reading alternative file file \jobname.fln}}{}
+\def\@tubfilename#1{\expandafter\ifx\csname file@@#1\endcsname\relax
+ #1\else\csname file@@#1\endcsname\fi}
+\def\fileinput#1{\@@input\@tubfilename{#1} }
+\def\pagexrefON#1{%
+ \write-1{\def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}%
+ \write\ppoutfile{%
+ \def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}%
+ }
+\def\PageXrefON#1{%
+ \immediate\write-1{\def\expandafter
+ \noexpand\csname#1\endcsname{\number\c@page}}%
+ \immediate\write\ppoutfile{\def\expandafter
+ \noexpand\csname#1\endcsname{\number\c@page}}}
+\def\pagexrefOFF#1{}
+\let\pagexref=\pagexrefOFF
+\def\PageXrefOFF#1{}
+\let\PageXref=\PageXrefOFF
+\def\xreftoON#1{%
+ \ifundefined{#1}%
+ ???\TBremark{Need cross reference for #1.}%
+ \else\csname#1\endcsname\fi}
+\def\xreftoOFF#1{???}
+\let\xrefto=\xreftoOFF
+\let\TBdriver\gobble
+\hyphenation{Eijk-hout Hara-lam-bous man-u-script man-u-scripts}
+\PrelimDrafttrue
+\textheight 54pc
+\textwidth 39pc
+\columnsep 1.5pc
+\columnwidth 18.75pc
+\parindent \normalparindent
+\parskip \z@ % \@plus\p@
+\leftmargini 2em
+\leftmarginv .5em
+\leftmarginvi .5em
+\oddsidemargin \z@
+\evensidemargin \z@
+\topmargin -2.5pc
+\headheight 12\p@
+\headsep 20\p@
+\marginparwidth 48\p@
+\marginparsep 10\p@
+\partopsep=\z@
+\topsep=3\p@\@plus\p@\@minus\p@
+\parsep=3\p@\@plus\p@\@minus\p@
+\itemsep=\parsep
+\twocolumn
+\newdimen\pagewd \pagewd=39pc
+\newdimen\trimwd \trimwd=\pagewd
+\newdimen\trimlgt \trimlgt=11in
+\newdimen\headmargin \headmargin=3.5pc
+\newcommand\DeclareLaTeXLogo[5]{\expandafter\def
+ \csname @LaTeX@#1/#2/#3\endcsname{{#4}{#5}}}
+\def\@LaTeX@default{{.36}{.15}}
+\DeclareLaTeXLogo{cmss}{bx}n{.3}{.15}
+\DeclareLaTeXLogo{cmr}m{it}{.3}{.27}
+\DeclareLaTeXLogo{cmr}{bx}{it}{.3}{.27}
+\DeclareRobustCommand\LaTeX{\expandafter\let\expandafter\reserved@a
+ \csname @LaTeX@\f@family/\f@series/\f@shape\endcsname
+ \ifx\reserved@a\relax\let\reserved@a\@LaTeX@default\fi
+ \expandafter\@LaTeX\reserved@a}
+\newcommand\@LaTeX[2]{L\kern-#1em
+ {\sbox\z@ T%
+ \vbox to\ht0{\hbox{$\m@th$%
+ \csname S@\f@size\endcsname
+ \fontsize\sf@size\z@
+ \math@fontsfalse\selectfont
+ A}%
+ \vss}%
+ }%
+ \kern-#2em%
+ \TeX}
+\def\theauthor#1{\csname theauthor#1\endcsname}
+\def\theaddress#1{\csname theaddress#1\endcsname}
+\def\thenetaddress#1{\csname thenetaddress#1\endcsname}
+\def\thePersonalURL#1{\csname thePersonalURL#1\endcsname}
+\def\@defaultauthorlist{%
+ \count@\authornumber
+ \advance\count@ by -2
+ \@tempcnta0
+ \loop
+ \ifnum\count@>0
+ \advance\@tempcnta by \@ne
+ \ignorespaces\theauthor{\number\@tempcnta}\unskip,
+ \advance\count@ by \m@ne
+ \repeat
+ \count@\authornumber
+ \advance\count@ by -\@tempcnta
+ \ifnum\authornumber>0
+ \ifnum\count@>1
+ \count@\authornumber
+ \advance\count@ by \m@ne
+ \ignorespaces\theauthor{\number\count@}\unskip\ and
+ \fi
+ \ignorespaces\theauthor{\number\authornumber}\unskip
+ \fi
+ }
+\def\signature#1{\def\@signature{#1}}
+\def\@signature{\@defaultsignature}
+\def\@defaultsignature{%
+ \count@=0
+ \loop
+ \ifnum\count@<\authornumber
+ \medskip
+ \advance\count@ by \@ne
+ \signaturemark
+ \theauthor{\number\count@}\\
+ \theaddress{\number\count@}\\
+ {%
+ \allowhyphens
+ \thenetaddress{\number\count@}\\
+ \thePersonalURL{\number\count@}\\
+ }%
+ \repeat
+ }
+\newdimen\signaturewidth \signaturewidth=12pc
+\def\makesignature{%
+ \par
+ \penalty9000
+ \medskip
+ \rightline{%
+ \vbox{\hsize\signaturewidth \ninepoint \raggedright
+ \parindent \z@ \everypar={\hangindent 1pc }
+ \parskip \z@skip
+ \def\|{\unskip\hfil\break}%
+ \def\\{\endgraf}%
+ \def\phone{\rm Phone: }
+ \rm\@signature}}
+ }
+\def\signaturemark{\leavevmode\llap{$\diamond$\enspace}}
+\newcount\authornumber
+\authornumber=0
+\def\author#1{%
+ \global\advance\authornumber\@ne
+ \expandafter\def\csname theauthor\number\authornumber\endcsname
+ {\ignorespaces#1\unskip}%
+ \expandafter\def\csname theaddress\number\authornumber\endcsname
+ {\TBWarning{Address for #1\space missing}\@gobble}%
+ \expandafter\def\csname thenetaddress\number\authornumber\endcsname
+ {\TBWarning{Net address for #1\space missing}\@gobble}%
+ \expandafter\let\csname thePersonalURL\number\authornumber\endcsname
+ \@gobble
+ }
+\def\address#1{%
+ \expandafter\def\csname theaddress\number\authornumber\endcsname
+ {\leavevmode\ignorespaces#1\unskip}}
+\def\network#1{\def\@network{#1: }}
+\newcommand\netaddress[1][\relax]{%
+ \begingroup
+ \def\@network{}%
+ #1\@sanitize\makespace\ \makeactive\@
+ \makeactive\.\makeactive\%\@relay@netaddress}%
+\def\@relay@netaddress#1{%
+ \ProtectNetChars
+ \expandafter\protected@xdef
+ \csname thenetaddress\number\authornumber\endcsname
+ {\protect\leavevmode\textrm{\@network}%
+ {\protect\NetAddrChars\net
+ \ignorespaces#1\unskip}}%
+ \endgroup
+ }
+\def\personalURL{\begingroup
+ \@sanitize\makespace\ \makeactive\@
+ \makeactive\.\makeactive\%\makeactive\/\@personalURL}%
+\def\@personalURL#1{%
+ \ProtectNetChars
+ \expandafter\protected@xdef
+ \csname thePersonalURL\number\authornumber\endcsname
+ {\protect\leavevmode\textrm{\acro{URL}: }%
+ {\protect\URLchars\net
+ \ignorespaces#1\unskip}}%
+ \endgroup
+ }
+{%
+ \makecomment\*
+ \makeactive\@
+ \gdef\netaddrat{\makeactive\@*
+ \def@{\discretionary{\char"40}{}{\char"40}}}
+ \makeactive\%
+ \gdef\netaddrpercent{\makeactive\%*
+ \def%{\discretionary{\char"25}{}{\char"25}}}
+ \makeactive\.
+ \gdef\netaddrdot{\makeactive\.*
+ \def.{\discretionary{\char"2E}{}{\char"2E}}}
+ \gdef\NetAddrChars{\netaddrat \netaddrpercent \netaddrdot}
+ \makeactive\/
+ \gdef\URLchars{*
+ \NetAddrChars
+ \makeactive\/*
+ \def/{\discretionary{\char"2F}{}{\char"2F}}}
+ \gdef\ProtectNetChars{*
+ \def@{\protect@}*
+ \def%{\protect%}*
+ \def.{\protect.}*
+ \def/{\protect/}*
+ }
+}
+\if@compatibility
+ \DeclareRobustCommand\net{\normalfont\ttfamily\mathgroup\symtypewriter}
+\else
+ \DeclareOldFontCommand{\net}{\ttfamily\upshape\mdseries}{\mathtt}
+\fi
+\def\authorlist#1{\def\@author{#1}}
+\def\@author{\@defaultauthorlist}
+\def\maketitle{\par
+ \ifdim\PreTitleDrop > \z@
+ \loop
+ \ifdim \PreTitleDrop > \textheight
+ \vbox{}\vfil\eject
+ \advance\PreTitleDrop by -\textheight
+ \repeat
+ \vbox to \PreTitleDrop{}
+ \global\PreTitleDrop=\z@
+ \fi
+ \begingroup
+ \setcounter{footnote}{0}
+ \def\thefootnote{\fnsymbol{footnote}}
+ \@maketitle
+ \@thanks
+ \endgroup
+ \setcounter{footnote}{0}
+ \gdef\@thanks{}
+ }
+\def\secsep{\vskip 5\baselineskip}
+\newdimen\stbaselineskip \stbaselineskip=18\p@
+\newdimen\stfontheight
+ \settoheight{\stfontheight}{\sectitlefont O}
+\newif\ifSecTitle
+\SecTitlefalse
+\def \sectitle#1{%
+ \SecTitletrue
+ \def\s@ctitle{#1}}
+\newdimen\PreTitleDrop \PreTitleDrop=\z@
+\newskip\AboveTitleSkip \AboveTitleSkip=12\p@
+\newskip\BelowTitleSkip \BelowTitleSkip=8\p@
+\newdimen\strulethickness \strulethickness=.6\p@
+\def\@sectitle #1{%
+ \par
+ \penalty-1000
+ \secsep
+ {%
+ \fboxrule\strulethickness
+ \fboxsep\z@
+ \noindent\framebox[\hsize]{%
+ \raggedcenter
+ \def\\{\unskip\break}%
+ \sectitlefont
+ \makestrut[2\stfontheight;\z@]%
+ #1%
+ \makestrut[\z@;\stfontheight]\endgraf
+ }%
+ }%
+ \nobreak
+ \vskip\baselineskip
+}
+\newif\ifWideSecTitle
+\def\@maketitle{\ifSecTitle \global\SecTitlefalse
+ \T@stDimen=\hsize
+ \ifWideSecTitle \hsize=\textwidth \global\WideSecTitlefalse \fi
+ \@sectitle{\s@ctitle}%
+ \hsize=\T@stDimen
+ \else \vskip\AboveTitleSkip
+ \kern\topskip
+ \hrule \@height\z@ \@depth\z@ \@width 10\p@
+ \kern-\topskip
+ \kern-\strulethickness
+ \hrule \@height\strulethickness \@depth\z@
+ \kern\medskipamount
+ \nobreak
+ \fi
+ {\nohyphens \interlinepenalty\@M
+ \setbox0=
+ \hbox{\let\thanks\@gobble
+ \let\\=\quad
+ \let\and=\quad
+ \ignorespaces\@author}%
+ {\noindent\bf\raggedright\ignorespaces\@title\endgraf}%
+ \ifdim \wd0 < 5\p@ % omit if author is null
+ \else \nobreak \vskip 4\p@ % 4pt + \BelowTitleSkip = \baselineskip
+ {\leftskip=\normalparindent
+ \raggedright
+ \def\and{\unskip\\}%
+ \noindent\@author\endgraf}%
+ \fi \nobreak \vskip\BelowTitleSkip}%
+ \global\@afterindentfalse\aftergroup\@afterheading
+}
+\newenvironment{dedication}%
+ {\raggedright\noindent\itshape\ignorespaces}%
+ {\endgraf\medskip}
+\renewenvironment{abstract}%
+ {\section*{Abstract}}%
+ {}
+\newenvironment{longabstract}%
+ {\section*{Abstract}
+ \bgroup\small}%
+ {\endgraf\egroup
+ \vspace{.25\baselineskip}
+ \begin{center}
+ {$--*--$}
+ \end{center}
+ \vspace{.5\baselineskip}}
+\if@numbersec
+ \def\section{\@startsection {section}%
+ 1%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}
+ \def\subsection{\TB@startsection{{subsection}%
+ 2%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsubsection{\TB@startsection{{subsubsection}%
+ 3%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\paragraph{\TB@startsection{{paragraph}%
+ 4%
+ \z@
+ {2.5ex\@plus 1ex}%
+ {-1em}%
+ {\normalsize\bf}}}
+\else
+ \setcounter{secnumdepth}0
+ \def\section{\TB@nolimelabel
+ \TB@startsection{{section}%
+ 1%
+ \z@
+ {-8\p@}%
+ {4\p@}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsection{\TB@nolimelabel
+ \TB@startsection{{subsection}%
+ 2%
+ \z@
+ {-8\p@}%
+ {-0.5em\@plus-\fontdimen3\font}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ \def\subsubsection{\TB@nolimelabel
+ \TB@startsection{{subsubsection}%
+ 3%
+ \parindent
+ {-8\p@}%
+ {-0.5em\@plus-\fontdimen3\font}%
+ {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+\fi
+\def\TB@startsection#1{\@ifstar
+ {\TBWarning{*-form of \expandafter\string\csname\@firstofsix#1%
+ \endcsname\space inappropriate}%
+ \@startsection#1}%
+ {\@startsection#1}}
+\def\@firstofsix#1#2#3#4#5#6{#1}
+\def\TB@safe@startsection#1{\@startsection#1}
+\if@numbersec
+ \def\subparagraph{\TB@nosection\subparagraph\paragraph}
+\else
+ \def\paragraph{\TB@nosection\paragraph\subsubectgion}
+ \def\subparagraph{\TB@nosection\subparagraph\subsubsection}
+\fi
+\def\chapter{\TB@nosection\chapter\section}
+\def\part{\TB@nosection\part\section}
+\def\TB@nosection#1#2{\TBWarning{class does not support \string#1,
+ \string#2\ used instead}#2}
+\def\l@section#1#2{\addpenalty{\@secpenalty}%
+ \addvspace{1.0em\@plus\p@}%
+ \@tempdima 1.5em
+ \begingroup
+ \parindent\z@ \rightskip\z@ % article style makes \rightskip > 0
+ \parfillskip\z@
+ \bf\leavevmode\advance\leftskip\@tempdima\hskip-\leftskip#1\nobreak\hfil
+ \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+ \endgroup}
+\def\TB@nolimelabel{\def\@currentlabel{\protect\TBWarning
+ {Invalid label on page \thepage\space used}%
+ \textbf{?!?}}}
+\long\def\@makecaption#1#2{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1: #2}%
+ \ifdim \wd\@tempboxa >\hsize
+ \raggedright\hyphenpenalty=\@M
+ #1: #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip}
+\renewcommand\normalsize{%
+ \@setfontsize\normalsize\@xpt\@xiipt
+ \abovedisplayskip=3\p@\@plus 3\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 3\p@
+ \belowdisplayshortskip=\p@\@plus 3\p@\@minus\p@
+}
+
+\renewcommand\small{%
+ \@setfontsize\small\@ixpt{11}%
+ \abovedisplayskip=2.5\p@\@plus 2.5\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 2\p@
+ \belowdisplayshortskip=\p@\@plus 2\p@\@minus\p@
+}
+\renewcommand\footnotesize{%
+ \@setfontsize\footnotesize\@viiipt{9.5}%
+ \abovedisplayskip=3\p@\@plus 3\p@\@minus\p@
+ \belowdisplayskip=\abovedisplayskip
+ \abovedisplayshortskip=\z@\@plus 3\p@
+ \belowdisplayshortskip=\p@\@plus 3\p@\@minus\p@
+}
+\def\@listi{%
+ \leftmargin\leftmargini\parsep=\p@\@plus\p@\@minus\p@
+ \itemsep=\parsep
+ \listparindent=1em
+ }
+
+\def\@listii{%
+ \leftmargin\leftmarginii
+ \labelwidth=\leftmarginii \advance\labelwidth-\labelsep
+ \topsep=2\p@\@plus\p@\@minus\p@
+ \parsep=\p@\@plus\p@\@minus\p@
+ \itemsep=\parsep
+ \listparindent=1em
+ }
+
+\def\@listiii{%
+ \leftmargin=\leftmarginiii
+ \labelwidth=\leftmarginiii \advance\labelwidth-\labelsep
+ \topsep=\p@\@plus\p@\@minus\p@
+ \parsep=\z@
+ \itemsep=\topsep
+ \listparindent=1em
+ }
+\def\quote{\list{}{\rightmargin.5\leftmargin}\item[]}
+\renewcommand{\quotation}{\list{}{\listparindent 1.5em
+ \rightmargin.5\leftmargin\parsep \z@\@plus\p@}\item[]}
+\let\@TBverbatim\verbatim
+\let\@TBendverbatim\endverbatim
+\def\verbatim{\futurelet\reserved@a\@switch@sqbverbatim}
+\def\@switch@sqbverbatim{\ifx\reserved@a[%]
+ \expandafter\@sqbverbatim\else
+ \def\reserved@b{\@sqbverbatim[]}\expandafter\reserved@b\fi}
+\def\@sqbverbatim[#1]{%
+ \def\ruled{\let\if@ruled\iftrue}%
+ #1\@TBverbatim}
+\def\@verbatim{%
+ \if@ruled\trivlist\item\hrule\kern5\p@\nobreak\fi
+ \trivlist \item\relax
+ \if@minipage\else\vskip\parskip\fi
+ \leftskip\@totalleftmargin\rightskip\z@skip
+ \parindent\z@\parfillskip\@flushglue\parskip\z@skip
+ \@@par
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines \verbatim@font \@noligs
+ \let\do\@makeother \dospecials
+ \everypar \expandafter{\the\everypar \unpenalty}%
+}%
+\def\endverbatim{\@TBendverbatim
+ \if@ruled\kern5\p@\hrule\endtrivlist\fi}
+{\makeactive<
+ \gdef<#1>{{\reset@font\ensuremath{\langle}%
+ \textit{#1}%
+ \ensuremath{\rangle}}}
+}
+\let\if@ruled\iffalse
+\if@Harvardcite
+\let\@internalcite\cite
+\def\cite{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+\def\citeNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+\def\citeN{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
+ \def\citeauthoryear##1##2##3{##1 (##3}\@citedata}
+\def\citeA{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##1}\@internalcite}
+\def\citeANP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##1}\@internalcite}
+\def\shortcite{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+\def\shortciteNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+\def\shortciteN{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
+ \def\citeauthoryear##1##2##3{##2 (##3}\@citedata}
+\def\shortciteA{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##2}\@internalcite}
+\def\shortciteANP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##2}\@internalcite}
+\def\citeyear{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
+ \def\citeauthoryear##1##2##3{##3}\@citedata}
+\def\citeyearNP{\def\@citeseppen{-1000}%
+ \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
+ \def\citeauthoryear##1##2##3{##3}\@citedata}
+\def\@citedata{%
+ \@ifnextchar [{\@tempswatrue\@citedatax}%
+ {\@tempswafalse\@citedatax[]}%
+}
+
+\def\@citedatax[#1]#2{%
+\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
+ \def\@citea{}\@cite{\@for\@citeb:=#2\do%
+ {\@citea\def\@citea{, }\@ifundefined% by Young
+ {b@\@citeb}{{\bf ?}%
+ \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
+{\csname b@\@citeb\endcsname}}}{#1}}%
+\def\@citex[#1]#2{%
+\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
+ \def\@citea{}\@cite{\@for\@citeb:=#2\do%
+ {\@citea\def\@citea{; }\@ifundefined% by Young
+ {b@\@citeb}{{\bf ?}%
+ \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
+{\csname b@\@citeb\endcsname}}}{#1}}%
+\def\@biblabel#1{}
+\newlength{\bibhang}
+\setlength{\bibhang}{2em}
+\newdimen\bibindent
+\bibindent=1.5em
+\@ifundefined{refname}%
+ {\newcommand{\refname}{References}}%
+ {}%
+\def\thebibliography#1{\let\TB@startsection\TB@safe@startsection
+ \section*{\refname\@mkboth
+ {\uppercase{\refname}}{\uppercase{\refname}}}\list
+ {[\arabic{enumi}]}{%
+ \labelwidth\z@ \labelsep\z@
+ \leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ \usecounter{enumi}}
+ \def\newblock{}
+ \sloppy
+ \sfcode`\.=1000\relax}
+\def\etal{et\,al.\@}
+\def\bibentry{\smallskip
+ \hangindent=\parindent
+ \hangafter=1
+ \noindent
+ \sloppy
+ \clubpenalty500 \widowpenalty500
+ \frenchspacing}
+\def\bibliography#1{%
+ \if@filesw\immediate\write\@auxout{\string\bibdata{\@tubfilename{#1}}}\fi
+ \@input{\jobname.bbl}}
+
+\def\bibliographystyle#1{\if@filesw\immediate\write\@auxout
+ {\string\bibstyle{\@tubfilename{#1}}}\fi}
+\else
+\let\TB@save@thebibliography\thebibliography
+\def\thebibliography{\let\TB@startsection\TB@safe@startsection
+ \TB@save@thebibliography}
+\fi
+\def\HorzR@gisterRule{\vrule \@height 0.2\p@ \@depth\z@ \@width 0.5in }
+\def\DownShortR@gisterRule{\vrule \@height 0.2\p@ \@depth 1pc \@width 0.2\p@ }
+\def\UpShortR@gisterRule{\vrule \@height 1pc \@depth\z@ \@width 0.2\p@ }
+\def\ttopregister{\dlap{%
+ \hb@xt@\trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
+ \HorzR@gisterRule \hfil \HorzR@gisterRule}%
+ \hb@xt@\trimwd{\hfil \DownShortR@gisterRule \hfil}}}
+\def\tbotregister{\ulap{%
+ \hb@xt@\trimwd{\hfil \UpShortR@gisterRule \hfil}%
+ \hb@xt@\trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
+ \HorzR@gisterRule \hfil \HorzR@gisterRule}}}
+\def\topregister{\ttopregister}
+\def\botregister{\tbotregister}
+\def \rtitlex{\def\texttub##1{{\normalsize\textrm{##1}}}\TUB, \volx }
+
+\def\PrelimDraftfooter{%
+ \dlap{\kern\textheight\kern3pc
+ \rlap{\hb@xt@\pagewd{\midrtitle\hfil\midrtitle}}
+ }}
+
+\def\MakeRegistrationMarks{}
+\def\UseTrimMarks{%
+ \def\MakeRegistrationMarks{%
+ \ulap{\rlap{%
+ \vbox{\dlap{\vbox to\trimlgt{\vfil\botregister}}%
+ \topregister\vskip \headmargin \vskip 10\p@}}}}%
+ }
+
+\def\@oddhead{\MakeRegistrationMarks\PrelimDraftfooter
+ \normalsize\csname normalshape\endcsname\rm
+ \rtitlex\qquad\midrtitle \hfil \thepage}
+\def\@evenhead{\MakeRegistrationMarks\PrelimDraftfooter
+ \normalsize\csname normalshape\endcsname\rm
+ \thepage\hfil\midrtitle\qquad\rtitlex}
+\def\@oddfoot{}
+\def\@evenfoot{}
+\def\ps@headings{}
+\pagestyle{headings}
+\def\@outputdblcol{\if@firstcolumn \global\@firstcolumnfalse
+ \global\setbox\@leftcolumn\box\@outputbox
+ \global\brokenpenalty10000
+ \else \global\@firstcolumntrue
+ \global\brokenpenalty100
+ \setbox\@outputbox\vbox{\hb@xt@\textwidth{\hb@xt@\columnwidth
+ {\box\@leftcolumn \hss}\hfil \vrule \@width\columnseprule\hfil
+ \hb@xt@\columnwidth{\box\@outputbox \hss}}}\@combinedblfloats
+ \@outputpage \begingroup \@dblfloatplacement \@startdblcolumn
+ \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}\endgroup
+ \fi}
+\newif\ifFirstPar \FirstParfalse
+\def\smc{\sc}
+\def\ninepoint{\small}
+\DeclareRobustCommand\SMC{%
+ \ifx\@currsize\normalsize\small\else
+ \ifx\@currsize\small\footnotesize\else
+ \ifx\@currsize\footnotesize\scriptsize\else
+ \ifx\@currsize\large\normalsize\else
+ \ifx\@currsize\Large\large\else
+ \ifx\@currsize\LARGE\Large\else
+ \ifx\@currsize\scriptsize\tiny\else
+ \ifx\@currsize\tiny\tiny\else
+ \ifx\@currsize\huge\LARGE\else
+ \ifx\@currsize\Huge\huge\else
+ \small\SMC@unknown@warning
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+}
+\newcommand\SMC@unknown@warning{\TBWarning{\string\SMC: unrecognised
+ text font size command -- using \string\small}}
+\newcommand\textSMC[1]{{\SMC #1}}
+\newcommand\acro[1]{\textSMC{#1}\@}
+\def\xEdNote{{\EdNoteFont Editor's note:\enspace }}
+\def \EdNote{\@ifnextchar[%]
+ {%
+ \ifvmode
+ \smallskip\noindent\let\@EdNote@\@EdNote@v
+ \else
+ \unskip\quad\def\@EdNote@{\unskip\quad}%
+ \fi
+ \@EdNote
+ }%
+ \xEdNote
+}
+\long\def\@EdNote[#1]{%
+ [\thinspace\xEdNote\ignorespaces
+ #1%
+ \unskip\thinspace]%
+ \@EdNote@
+}
+\def\@EdNote@v{\par\smallskip}
+\def\SelfDocumenting{%
+ \setlength\textwidth{31pc}
+ \onecolumn
+ \parindent \z@
+ \parskip 2\p@\@plus\p@\@minus\p@
+ \oddsidemargin 8pc
+ \evensidemargin 8pc
+ \marginparwidth 8pc
+ \toks@\expandafter{\@oddhead}%
+ \xdef\@oddhead{\hss\hb@xt@\pagewd{\the\toks@}}%
+ \toks@\expandafter{\@evenhead}%
+ \xdef\@evenhead{\hss\hb@xt@\pagewd{\the\toks@}}%
+ \def\ps@titlepage{}%
+}
+\def\ps@titlepage{}
+
+\long\def\@makefntext#1{\parindent 1em\noindent\hb@xt@2em{}%
+ \llap{\@makefnmark}\null$\mskip5mu$#1}
+
+\def\fnum@figure{{\bf Figure \thefigure}}
+\if@Harvardcite
+ \AtBeginDocument{%
+ \bibliographystyle{ltugbib}%
+ }
+\fi
+\authornumber\z@
+\let\@signature\@defaultsignature
+\InputIfFileExists{ltugboat.cfg}{\TBInfo{Loading ltugboat
+ configuration information}}{}
+\endinput
+%%
+%% End of file `ltugboat.cls'.
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/makedoc.sh b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/makedoc.sh
new file mode 100644
index 0000000000..aa5342bc7a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/makedoc.sh
@@ -0,0 +1,9 @@
+#! /bin/sh
+
+mpt 3d
+tex 3d \\end
+dvips -Z -t a4 -o 3d.ps 3d.dvi
+
+mpt poly
+tex poly \\end
+dvips -Z -t a4 -o poly.ps poly.dvi
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2.mft b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2.mft
new file mode 100644
index 0000000000..a1f0b36f97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2.mft
@@ -0,0 +1,146 @@
+%%%% ========================================================================
+%%%% @MFT-file{
+%%%% author = "Ulrik Vieth",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% filename = "mp2.mft",
+%%%% version = "0.10",
+%%%% date = "29 January 1996",
+%%%% time = "00:30:06 MET",
+%%%% codetable = "ISO/ASCII",
+%%%% checksum = "00449 146 841 6351",
+%%%% supported = "yes",
+%%%% keywords = "MFT, METAFONT, MetaPost, pretty-printing",
+%%%% abstract = "",
+%%%% docstring = "",
+%%%% }
+%%%% ========================================================================
+%%%%
+%%%% MFT commands for METAPOST including "plain" and "mfplain"
+%%%%
+%%%% This file is loosely based on the file "mp.mft" by Andreas Scherer
+%%%% <scherer@genesis.informatik.rwth-aachen.de>, but numerous changes
+%%%% have been made. In particular, support for some standard MetaPost
+%%%% packages like "graph.mp" and "boxes.mp" has been added.
+%%%%
+%%%%
+%%%% METAPOST primitives not found in METAFONT
+%%%% (METAFONT primitives are hard-wired in the MFT program)
+%%%%
+%%% step within %%%% boldface binary operators
+%%% addto btex verbatimtex readfrom write %%%% boldface unary operators
+%%% addto clip setbounds
+%%% enddef etex %%%% boldface closing
+%%% true mpxbreak %%%% boldface nullary operators
+%%% length redpart greenpart bluepart %%%% unary operators in roman
+%%% length fontpart textpart pathpart penpart dashpart fontsize
+%%% length llcorner lrcorner ulcorner urcorner arclength
+%%% length stroked filled textual clipped bounded
+%%% and infont %%%% binary operators in roman
+%%% penoffset arctime %%%% operators that take "of"
+%%% withpen withcolor dashed %%%% drawing options
+%%% pair color %%%% data types
+%%% pausing tracinglostchars %%%% internals
+%%% pausing linejoin linecap miterlimit prologues truecorners
+%%%%
+%%%% Variables and macros defined both in "plain.mf" and "plain.mp"
+%%%% (from "plain.mft", but severly edited)
+%%%%
+%%% } ( ) ]] ! ^ %%%% tokens that need no special formatting
+%%% .. ... -- --- %%%% path operators made of dots and dashes
+%%% ++ ** %%%% binary operators made of two special characters
+%%% step upto downto thru %%%% boldface binary operators
+%%% addto fill unfill draw undraw %%%% boldface unary operators
+%%% addto filldraw unfilldraw drawdot undrawdot cutdraw cutoff culldraw
+%%% addto erase pickup penstroke
+%%% addto exitunless stop incr decr range
+%%% pencircle pensquare penrazor penspeck
+%%% true relax blankpicture %%%% boldface nullary operators
+%%% true clearit shipit cullit openit showit clearxy clearpen savepen
+%%% length abs dir byte %%%% unary operators to be in roman type
+%%% length unitvector inverse ceiling round hround vround counterclockwise
+%%% length tensepath reflectedabout rotatedaround rotatedabout
+%%% length magstep max min
+%%% and mod div dotprod
+%%% and intersectionpoint softjoin %%%% binary operators to be roman
+%%% penoffset direction directionpoint %%%% operators that take "of"
+%%% penoffset takepower
+%%% pausing pen_top pen_bot pen_lft pen_rt
+%%% pausing lft rt top bot llft lrt ulft urt
+%%% end bye
+%%%%
+%%%% Variables and macros defined only in "plain.mp"
+%%%%
+%%% addto beginfig %%%% boldface opening
+%%% enddef endfig %%%% boldface closing
+%%% addto dashpattern image bbox %%%% boldface operators
+%%% addto label dotlabel thelabel %%%% FIXME: handling of suffixes?
+%%% addto makelabel labels dotlabels penlabels
+%%% addto arrowhead drawarrow drawdblarrow drawoptions
+%%% length center on off %%%% unary operators in roman
+%%% and cutbefore cutafter %%%% binary operators in roman
+%%% pausing beveled butt mitered rounded squared evenly withdots
+%%% pausing EOF
+%%%%
+%%%% Variables and macros defined only in "mfplain.mp"
+%%%% (for METAFONT compatibility, partly from "plain.mft")
+%%%%
+%%% addto beginchar %%%% boldface opening
+%%% enddef endchar %%%% boldface closing
+%%% addto define_pixels define_whole_pixels define_whole_vertical_pixels
+%%% addto define_good_x_pixels define_good_y_pixels define_blacker_pixels
+%%% addto define_whole_blacker_pixels define_whole_vertical_blacker_pixels
+%%% addto define_corrected_pixels define_horizontal_corrected_pixels
+%%% addto lowres_fix screenrule proofrule proofoffset proofrulethickness
+%%% addto makebox makegrid maketicks
+%%% addto italcorr font_size font_slant
+%%% addto font_normal_space font_normal_stretch font_normal_shrink font_quad
+%%% addto font_x_height font_extra_space font_identifier font_coding_scheme
+%%% addto mode_def capsule_def
+%%% true mode_setup
+%%% true nodisplays notransforms screenchars screenstrokes
+%%% true imagerules gfcorners
+%%% pausing tolerance pixels_per_inch blacker o_correction %%%% internals
+%%% pausing screen_rows screen_cols currentwindow displaying proofing
+%%%%
+%%%% Variables and macros defined in "graph.mp", "marith.mp", "sarith.mp"
+%%%%
+%%% addto begingraph %%%% boldface opening
+%%% enddef endgraph %%%% boldface closing
+%%% addto gdraw gfill gdata %%%% boldface operators
+%%% addto glabel gdotlabel augment %%%% FIXME: handling of suffixes?
+%%% addto gdrawarrow gdrawdblarrow gdrawoptions
+%%% addto setcoords setrange
+%%% good auto
+%%% addto itick otick grid autogrid frame
+%%% addto format
+%%% length Mabs Sabs Scvnum Mlog_str %%%% unary operators in roman
+%%% and Madd Msub Mmul Mdiv Mleq %%%% binary operators in roman
+%%% and Sadd Ssub Smul Sdiv Sleq Sneq
+%%% pausing linear log OUT %%%% internals
+%%%%
+%%%% Variables and macros defined in "boxes.mp" and "rboxes.mp"
+%%%%
+%%% addto drawboxes drawboxed drawunboxed boxjoin boxit circleit rboxit
+%%% pausing defaultdx defaultdy
+%%%%
+%%%% Last minute items: override some builtin defaults
+%%%%
+%%% addto step fi makepen makepath
+%%%%
+%%%%
+%%%% Finally some TeX hackery:
+%%%%
+%%%% - comments are normally flush left, not flush right
+%%%% - comments starting with %\[ are set flush right
+%%%% - comments starting with %\ are set off by \qquad
+%%%%
+%%%% - comments ending with \] are also set flush left
+%%%% (defined in mftmac.tex)
+%%%%
+%%\def\9{$\futurelet\next\doit}
+%%\let\[=\relax
+%%\def\doit{\ifx\next\[\def\next{\hfill{\rm\%}}%
+%% \else\ifx\next\ \def\next{\qquad{\rm\%}}%
+%% \else\def\next{{\rm\%}}\fi\fi\next}
+%%%%
+%%%% End of file `mp2.mft'.
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2mft.sed b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2mft.sed
new file mode 100644
index 0000000000..397c232874
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mp2mft.sed
@@ -0,0 +1,37 @@
+### ========================================================================
+### @SED-file{
+### author = "Ulrik Vieth",
+### email = "vieth@thphy.uni-duesseldorf.de",
+### filename = "mp2mft.sed",
+### version = "0.07",
+### date = "29 January 1996",
+### time = "01:05:16 MET",
+### codetable = "ISO/ASCII",
+### checksum = "45153 37 192 1531",
+### supported = "yes",
+### keywords = "MFT, MetaPost, pretty-printing",
+### abstract = "",
+### docstring = "",
+### }
+### ========================================================================
+#
+# Convert METAPOST sources for MFT input:
+#
+# Present material in `btex ... etex' as a TeXnical MFT comment.
+# The `btex ... etex' groups may not extend across line breaks.
+# And there may be only one such group per line.
+#
+# This file is mostly based on the file "mft.sed" by Andreas Scherer
+# <scherer@genesis.informatik.rwth-aachen.de>, but some changes and
+# corrections have been made. TeX labels are now printed verbatim
+# (as quoted strings) so that their information won't get lost.
+#
+# Usage:
+#
+# sed -f mp2mft.sed < file.mp > file.mf
+# mft file[.mf] -s mp2[.mft]
+#
+# Code:
+#
+/verbatimtex/ s/\(.*\)verbatimtex[ ]\+\(.*\)[ ]\+etex\(.*\)/\1verbatimtex ... etex\3 %\\ \\TeX\\ code: |"\2"|/
+/btex/ s/\(.*\)btex[ ]\+\(.*\)[ ]\+etex\(.*\)/\1btex ... etex\3 %\\ \\TeX\\ label: |"\2"|/
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mpt b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mpt
new file mode 100644
index 0000000000..3964236bff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/mpt
@@ -0,0 +1,85 @@
+#!/bin/sh
+### ====================================================================
+### @UNIX-shell-file{
+### author = "Ulrik Vieth",
+### email = "vieth@thphy.uni-duesseldorf.de",
+### filename = "mpt",
+### version = "0.05",
+### date = "29 January 1996",
+### time = "02:28:37 MET",
+### codetable = "ISO/ASCII",
+### checksum = "21388 85 335 2331",
+### keywords = "MFT, MetaPost, pretty-printing",
+### supported = "yes",
+### abstract = "",
+### docstring = "",
+### }
+### ====================================================================
+#
+# Process METAPOST sources with MFT, converting them to a form
+# suitable for MFT processing using a sed script if necessary.
+#
+# This file assumes that some standard Unix utilities like
+# echo, grep, sed, and basename are available.
+#
+# The source file (file.mp) is assumed to exist and to be found
+# in the current directory. The target file (file.mf) will be
+# overwritten if it already exists. It is necessary to use the
+# file extension `.mf' for the target file, since newer versions
+# of MFT might produce unpredictable file names otherwise.
+#
+# Usage:
+#
+# mpt file[.mp]
+#
+# Code:
+#
+if [ $# != 1 ]; then
+ echo "Usage: mpt file[.mp]"; exit 1
+fi
+
+# Standard Unix utilities:
+GREP=grep
+SED=sed
+
+# Standard TeXware/METAFONTware utiltities:
+MFT=mft
+
+# The SED script for preprocessing:
+MP2SED=mp2mft.sed
+#MP2SED=$TEXMF/mft/mp2mft.sed
+
+# The MFT style file (without .mft):
+MP2MFT=mp2
+
+# The source and target files:
+#
+MPFILE=`basename $1 .mp`.mp
+MFFILE=`basename $1 .mp`.mf
+
+if [ ! -f "$MPFILE" -o ! -r "$MPFILE" ]; then
+ echo "mpt: Can't read from source file \"$MPFILE\"!"; exit 1
+fi
+if [ -f "$MFFILE" -a ! -w "$MFFILE" ]; then
+ echo "mpt: Can't write to target file \"$MFFILE\"!"; exit 1
+fi
+
+# Check if preprocessing $MPFILE with sed is needed:
+#
+$GREP "\(btex\|etex\|verbatimtex\)" $MPFILE > /dev/null
+case $? in
+ 0)
+ # there were matches, so convert it
+ #
+ $SED -f $MP2SED < $MPFILE > $MFFILE
+ $MFT $MFFILE -s $MP2MFT
+ exit 0
+ ;;
+ 1)
+ # there were no matches, so copy it
+ #
+ $SED $MPFILE $MFFILE
+ $MFT $MPFILE -s $MP2MFT
+ exit 0
+ ;;
+esac
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/octa.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/octa.ps
new file mode 100644
index 0000000000..c983fb01d9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/octa.ps
@@ -0,0 +1,40 @@
+%!PS
+%%BoundingBox: -39 -8 36 84
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath fill
+ 0 setgray
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.aux b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.aux
new file mode 100644
index 0000000000..57ae505d41
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.aux
@@ -0,0 +1,57 @@
+\relax
+\bibstyle{ltugbib}
+\citation{hobby1992}
+\citation{Goossens:LGC97}
+\citation{knuth1997}
+\citation{netpbm}
+\citation{gifmerge}
+\citation{knuth1989}
+\@writefile{toc}{\contentsline {section}{Abstract}{274}}
+\@writefile{toc}{\contentsline {section}{Introduction}{274}}
+\@writefile{toc}{\contentsline {section}{Animations}{274}}
+\@writefile{toc}{\contentsline {section}{Objects in space}{274}}
+\@writefile{toc}{\contentsline {subsection}{Introduction}{274}}
+\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Script created by \textlogo {META}\discretionary {-}{}{}\textlogo {POST}\spacefactor \@m {} (with some additional comments)}}{275}}
+\newlabel{animation-script}{{1}{275}}
+\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Vector rotation}}{276}}
+\newlabel{vector-rotation}{{2}{276}}
+\@writefile{toc}{\contentsline {subsection}{Objects and classes}{276}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces An icosahedron}}{277}}
+\newlabel{icosahedron}{{3}{277}}
+\@writefile{toc}{\contentsline {subsection}{Animating objects}{278}}
+\@writefile{toc}{\contentsline {subsection}{Putting the pieces together}{278}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Projection on the screen}}{279}}
+\newlabel{proj-screen}{{4}{279}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces Orientation of the observer}}{279}}
+\newlabel{obs-orientation}{{5}{279}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces Five views of an animation}}{279}}
+\newlabel{anim-five-views}{{6}{279}}
+\bibdata{paper}
+\bibcite{netpbm}{\citeauthoryear {Davidsen}{Davidsen}{1993}}
+\bibcite{Goossens:LGC97}{\citeauthoryear {Goossens, Rahtz, and Mittelbach}{Goossens et\,al.\spacefactor \@m {}}{1997}}
+\bibcite{hobby1992}{\citeauthoryear {Hobby}{Hobby}{1992}}
+\bibcite{knuth1989}{\citeauthoryear {Knuth}{Knuth}{1989}}
+\bibcite{knuth1997}{\citeauthoryear {Knuth}{Knuth}{1997}}
+\bibcite{gifmerge}{\citeauthoryear {M{\"u}ller}{M{\"u}ller}{1996}}
+\@writefile{toc}{\contentsline {section}{Future}{280}}
+\@writefile{toc}{\contentsline {section}{Acknowledgments}{280}}
+\@writefile{toc}{\contentsline {section}{Appendix A\\ Summary of the \texttt {3d} package}{280}}
+\@writefile{toc}{\contentsline {subsection}{Types}{280}}
+\@writefile{toc}{\contentsline {subsection}{Low level vector commands}{281}}
+\@writefile{toc}{\contentsline {subsection}{Operations on objects}{281}}
+\@writefile{toc}{\contentsline {subsection}{Building new points in space}{281}}
+\@writefile{toc}{\contentsline {subsection}{Drawing points, axes, objects}{281}}
+\@writefile{toc}{\contentsline {subsection}{Setting faces}{281}}
+\@writefile{toc}{\contentsline {subsection}{View points, distance}{282}}
+\@writefile{toc}{\contentsline {subsection}{Vector and point allocation}{282}}
+\@writefile{toc}{\contentsline {subsection}{Debugging}{282}}
+\@writefile{toc}{\contentsline {subsection}{Normalization}{282}}
+\@writefile{toc}{\contentsline {subsection}{Parameters}{282}}
+\@writefile{toc}{\contentsline {subsection}{Constants}{282}}
+\@writefile{toc}{\contentsline {subsection}{Defining new object points and faces}{282}}
+\@writefile{toc}{\contentsline {subsection}{Offsets}{282}}
+\@writefile{toc}{\contentsline {subsection}{Standard classes}{282}}
+\@writefile{toc}{\contentsline {subsection}{Standard animations}{282}}
+\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces Motion of the observer}}{283}}
+\newlabel{observer-motion}{{7}{283}}
+\@writefile{toc}{\contentsline {section}{Appendix B\\ Coding an object}{283}}
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bbl b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bbl
new file mode 100644
index 0000000000..775a33739b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bbl
@@ -0,0 +1,40 @@
+\begin{thebibliography}{}
+
+\bibitem[\protect\citeauthoryear{Davidsen}{Davidsen}{1993}]{netpbm}
+Davidsen, Bill.
+\newblock ``NETPBM''.
+\newblock 1993.
+\newblock Available for instance at
+ \url{ftp://ftp.wustl.edu/graphics/graphics/packages/NetPBM}.
+
+\bibitem[\protect\citeauthoryear{Goossens, Rahtz, and Mittelbach}{Goossens
+ \etal{}}{1997}]{Goossens:LGC97}
+Goossens, Michel, S.~Rahtz, and F.~Mittelbach.
+\newblock {\em The {\LaTeX} Graphics Companion}.
+\newblock Ad{\-d}i{\-s}on-Wes{\-l}ey, Reading, MA, USA, 1997.
+
+\bibitem[\protect\citeauthoryear{Hobby}{Hobby}{1992}]{hobby1992}
+Hobby, John~D.
+\newblock ``{A User's Manual for MetaPost}''.
+\newblock Technical Report 162, AT\&T Bell Laboratories, Murray Hill, New
+ Jersey, 1992.
+
+\bibitem[\protect\citeauthoryear{Knuth}{Knuth}{1989}]{knuth1989}
+Knuth, Donald~E.
+\newblock ``{MFT, version 2.0}''.
+\newblock 1989.
+\newblock Standard {\TeX} distribution.
+
+\bibitem[\protect\citeauthoryear{Knuth}{Knuth}{1997}]{knuth1997}
+Knuth, Donald~E.
+\newblock {\em {The Art of Computer Programming, volumes 1, 2 and 3}}.
+\newblock Addison-Wesley Publishing Company, 1997.
+\newblock New editions.
+
+\bibitem[\protect\citeauthoryear{M{\"u}ller}{M{\"u}ller}{1996}]{gifmerge}
+M{\"u}ller, Ren{\'e}~K.
+\newblock ``GIFMerge, version 1.33''.
+\newblock 1996.
+\newblock Available at \url{http://www.iis.ee.ethz.ch/~kiwi/GIFMerge/}.
+
+\end{thebibliography}
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bib b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bib
new file mode 100644
index 0000000000..bd0af801e7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.bib
@@ -0,0 +1,71 @@
+@String{pub-AW = "Ad{\-d}i{\-s}on-Wes{\-l}ey"}
+@String{pub-AW:adr = "Reading, MA, USA"}
+
+@Book{Goossens:LGC97,
+ author = "Michel Goossens and Sebastian Rahtz and Frank Mittelbach",
+ title = "The {\LaTeX} Graphics Companion",
+ publisher = pub-AW,
+ year = "1997",
+ ISBN = "0-201-85469-4",
+ pages = "xxvi + 554",
+ address = pub-AW:adr
+}
+
+
+@TechReport{ hobby1992,
+ author = "John D. Hobby",
+ title = "{A User's Manual for MetaPost}",
+ year = "1992",
+ month = apr,
+ language = "english",
+ institution = "AT\&T Bell Laboratories, Murray Hill, New Jersey",
+ date = "April 1992",
+ number = "162",
+ npages = "ii+88~pages",
+}
+
+@Book{ knuth1997,
+ author = "Donald E. Knuth",
+ title = "{The Art of Computer Programming, volumes 1, 2 and 3}",
+ year = "1997",
+ publisher = "Addison-Wesley Publishing Company",
+ editor = "",
+ language = "english",
+ npages = "",
+ note = "New editions."
+}
+
+@Misc{knuth1989,
+ author = "Donald E. Knuth",
+ title = "{MFT, version 2.0}",
+ year = "1989",
+ publisher = "",
+ editor = "",
+ language = "english",
+ npages = "",
+ note = "Standard {\TeX} distribution"
+}
+
+@Misc{gifmerge,
+ author = "Ren{\'e} K. M{\"u}ller",
+ title = "GIFMerge, version 1.33",
+ year = "1996",
+ date = "July 1996",
+ note = "Available at
+ \url{http://www.iis.ee.ethz.ch/~kiwi/GIFMerge/}.",
+}
+
+@Misc{netpbm,
+ author = "Bill Davidsen",
+ title = "NETPBM",
+ year = "1993",
+ note = "Available for instance
+ at \url{ftp://ftp.wustl.edu/graphics/graphics/packages/NetPBM}.",
+}
+
+@Misc{truchet1995,
+ author = "Denis Roegel",
+ title = "{A \MP{} solution to the Truchet tiling problem}",
+ year = "1995",
+ note = "On CTAN under \texttt{graphics/metapost/macros/truchet}"
+ } \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.blg b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.blg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.blg
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.dvi b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.dvi
new file mode 100644
index 0000000000..adea1a4a8d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.log b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.log
new file mode 100644
index 0000000000..c4e660eb89
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.log
@@ -0,0 +1,223 @@
+This is TeX, Version 3.14159 (C version 6.1) (format=latex 97.11.16) 9 APR 1998 14:17
+**paper
+(paper.tex
+LaTeX2e <1997/06/01>
+(ltugboat.cls
+Document Class: ltugboat 1996/10/14 v1.4b TUGboat journal class
+(/home/cou/facguest/sas/roegel/TeX/inputs/base/article.cls
+Document Class: article 1997/06/16 v1.3v Standard LaTeX document class
+(/home/cou/facguest/sas/roegel/TeX/inputs/base/size10.clo
+File: size10.clo 1997/06/16 v1.3v Standard LaTeX file (size option)
+)
+\c@part=\count82
+\c@section=\count83
+\c@subsection=\count84
+\c@subsubsection=\count85
+\c@paragraph=\count86
+\c@subparagraph=\count87
+\c@figure=\count88
+\c@table=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/usr/local/pkg/teTeX/texmf/tex/latex/mflogo/mflogo.sty
+Package: mflogo 1995/12/04 v1.5c LaTeX package for METAFONT and MetaPost logos
+)
+LaTeX Info: Redefining \TeX on input line 197.
+\normalparindent=\dimen103
+\T@stBox=\box26
+\TestBox=\box27
+\T@stCount=\count90
+\TestCount=\count91
+\T@stDimen=\dimen104
+\TestDimen=\dimen105
+\hours=\count92
+\minutes=\count93
+\raggedskip=\dimen106
+\raggedstretch=\dimen107
+\raggedparfill=\skip43
+\issueseqno=\count94
+\@TBremarkfile=\write3
+\pagewd=\dimen108
+\trimwd=\dimen109
+\trimlgt=\dimen110
+\headmargin=\dimen111
+LaTeX Info: Redefining \LaTeX on input line 471.
+\signaturewidth=\dimen112
+\authornumber=\count95
+\stbaselineskip=\dimen113
+\stfontheight=\dimen114
+\PreTitleDrop=\dimen115
+\AboveTitleSkip=\skip44
+\BelowTitleSkip=\skip45
+\strulethickness=\dimen116
+\bibhang=\skip46
+\bibindent=\dimen117
+)
+(/usr/local/pkg/teTeX/texmf/tex/latex/misc/url.sty
+Package: url 1996/02/06 ver 1.1 Verb mode for urls, email addresses, and file
+ names
+)
+(/home/cou/facguest/sas/roegel/TeX/inputs/graphics/graphicx.sty
+Package: graphicx 1997/06/09 v1.0d Enhanced LaTeX Graphics (DPC,SPQR)
+
+(/home/cou/facguest/sas/roegel/TeX/inputs/graphics/keyval.sty
+Package: keyval 1995/09/21 v1.09 key=value parser (DPC)
+)
+(/home/cou/facguest/sas/roegel/TeX/inputs/graphics/graphics.sty
+Package: graphics 1997/06/07 v1.0d Standard LaTeX Graphics (DPC,SPQR)
+
+(/home/cou/facguest/sas/roegel/TeX/inputs/graphics/trig.sty
+Package: trig 1994/10/16 v1.08 sin cos tan (DPC)
+)
+(/usr/local/pkg/teTeX/texmf/tex/latex/config/graphics.cfg)
+Package graphics Info: Driver file: dvips.def on input line 84.
+
+(/home/cou/facguest/sas/roegel/TeX/inputs/graphics/dvips.def
+File: dvips.def 1996/12/12 v3.0d Driver-dependant file (DPC,SPQR)
+))
+\Gin@req@height=\dimen118
+\Gin@req@width=\dimen119
+) (paper.aux)
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 125.
+LaTeX Font Info: ... okay on input line 125.
+LaTeX Font Info: Try loading font information for U+logo on input line 138.
+
+(/usr/local/pkg/teTeX/texmf/tex/latex/mflogo/ulogo.fd
+File: Ulogo.fd 1995/12/04 v1.5c LaTeX font definitions for METAFONT logo fonts
+)
+LaTeX Font Info: Font shape `U/logo/bx/n' in size <10> not available
+(Font) Font shape `U/logo/b/n' tried instead on input line 138.
+
+
+Class ltugboat Warning: *-form of \section inappropriate on input line 140.
+
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <7> on input line 174.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <5> on input line 174.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <8> on input line 256.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <6> on input line 256.
+[274
+
+
+]
+File: vect-fig.9 Graphic file (type eps)
+ <vect-fig.9>
+File: vect-fig.10 Graphic file (type eps)
+ <vect-fig.10>
+Underfull \vbox (badness 10000) has occurred while \output is active []
+
+ [275]
+Underfull \hbox (badness 4096) in paragraph at lines 392--411
+\OT1/cmr/m/n/10 Five points are de-fined, four of them with
+ []
+
+
+Underfull \vbox (badness 10000) has occurred while \output is active []
+
+File: tetra.ps Graphic file (type eps)
+
+<tetra.ps>
+Underfull \vbox (badness 6808) has occurred while \output is active []
+
+ [276]
+File: icosa.ps Graphic file (type eps)
+
+<icosa.ps>
+File: cube.ps Graphic file (type eps)
+ <cube.ps>
+File: octa.ps Graphic file (type eps)
+ <octa.ps>
+File: dodeca.ps Graphic file (type eps)
+ <dodeca.ps>
+File: icosa-w.ps Graphic file (type eps)
+ <icosa-w.ps>
+Underfull \vbox (badness 10000) has occurred while \output is active []
+
+ [277]
+File: vect-fig.8 Graphic file (type eps)
+
+<vect-fig.8>
+File: vect-fig.16 Graphic file (type eps)
+ <vect-fig.16>
+File: anim.1 Graphic file (type eps)
+ <anim.1>
+File: anim.2 Graphic file (type eps)
+ <anim.2>
+File: anim.3 Graphic file (type eps)
+ <anim.3>
+File: anim.4 Graphic file (type eps)
+ <anim.4>
+File: anim.5 Graphic file (type eps)
+ <anim.5>
+[278] [279] (paper.bbl
+Underfull \vbox (badness 10000) has occurred while \output is active []
+
+
+Underfull \hbox (badness 5862) in paragraph at lines 35--39
+[]\OT1/cmr/m/n/10 M^^?uller, Ren^^Se K. ``GIFMerge, ver-sion 1.33''.
+ []
+
+)
+LaTeX Font Info: Font shape `OT1/cmtt/bx/n' in size <10> not available
+(Font) Font shape `OT1/cmtt/m/n' tried instead on input line 735.
+LaTeX Font Info: Try loading font information for OMS+cmr on input line 743.
+
+ (/home/cou/facguest/sas/roegel/TeX/inputs/base/omscmr.fd
+File: omscmr.fd 1997/06/16 v2.5e Standard LaTeX font definitions
+)
+LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 743.
+ [280]
+Underfull \hbox (badness 10000) in paragraph at lines 840--843
+[][]\OT1/cmtt/m/n/10 rotate_obj_abs_pv($\OMS/cmsy/m/n/10 h$\OT1/cmr/m/it/10 obj
+$\OMS/cmsy/m/n/10 i$\OT1/cmtt/m/n/10 ,$\OMS/cmsy/m/n/10 h$\OT1/cmr/m/it/10 apn$
+\OMS/cmsy/m/n/10 i$\OT1/cmtt/m/n/10 ,$\OMS/cmsy/m/n/10 h$\OT1/cmr/m/it/10 avn$\
+OMS/cmsy/m/n/10 i$\OT1/cmtt/m/n/10 ,$\OML/cmm/m/it/10 a$[]\OT1/cmtt/m/n/10 )\OT
+1/cmr/m/n/10 :
+ []
+
+
+Overfull \hbox (3.36049pt too wide) in paragraph at lines 848--849
+[][]\OT1/cmtt/m/n/10 scale_obj($\OMS/cmsy/m/n/10 h$\OT1/cmr/m/it/10 obj$\OMS/cm
+sy/m/n/10 i$\OT1/cmtt/m/n/10 ,$\OML/cmm/m/it/10 v$[]\OT1/cmtt/m/n/10 )\OT1/cmr/
+m/n/10 : ob-ject $\OMS/cmsy/m/n/10 h$\OT1/cmr/m/it/10 obj$\OMS/cmsy/m/n/10 i$ \
+OT1/cmr/m/n/10 is scaled by $\OML/cmm/m/it/10 v$\OT1/cmr/m/n/10 .
+ []
+
+File: vect-fig.11 Graphic file (type eps)
+<vect-fig.11>
+File: vect-fig.7 Graphic file (type eps)
+ <vect-fig.7> [281]
+File: vect-fig.17 Graphic file (type eps)
+ <vect-fig.17> [282]
+Underfull \vbox (badness 3954) has occurred while \output is active []
+
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <9> on input line 1127.
+ [283]
+(paper.aux) )
+Here is how much of TeX's memory you used:
+ 1167 strings out of 10884
+ 11324 string characters out of 72869
+ 66029 words of memory out of 262141
+ 3960 multiletter control sequences out of 9500
+ 8605 words of font info for 34 fonts, out of 150000 for 255
+ 20 hyphenation exceptions out of 607
+ 29i,13n,21p,233b,327s stack positions out of 300i,40n,60p,3000b,4000s
+
+Output written on paper.dvi (10 pages, 49796 bytes).
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.ps
new file mode 100644
index 0000000000..8263c8d7a6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.ps
@@ -0,0 +1,6074 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: paper.dvi
+%%Pages: 10
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentPaperSizes: A4
+%%EndComments
+%DVIPSCommandLine: dvips -t a4 -Z -o paper.ps paper.dvi
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1998.04.09:1417
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: finclude.pro
+/fstore{dup dict exch{dup 4 2 roll put}repeat def}bind def /fshow{gsave
+72 TeXDict /Resolution get div -72 TeXDict /VResolution get div scale 1
+DVImag div dup scale get cvx exec show grestore}bind def
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale true def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (paper.dvi)
+@start /Fa 17 127 df<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A728927>46
+D<1538157C15FCA2140115F8140315F0140715E0140F15C0141F1580143F1500A25C147E
+14FE5C13015C13035C13075C130F5CA2131F5C133F91C7FC5B137E13FE5B12015B12035B
+A212075B120F5B121F5B123F90C8FC5A127E12FE5AA25A12781E3A7CB327>I<121EEA7F
+80A2EAFFC0A4EA7F80A2EA1E00C7FCAC121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2072
+9F27>58 D<EB01FE903807FF80011F13C0017F13E090B512F048EB03F83803FC013907F0
+00FC390FE01F7C9038C07FFE381F80FF1301485A393E07F1FF007E13E0397C0FC07FEC80
+3FA2EAFC1F00F8EB001FA800FCEB803FD87C0F133EA2ECC07E397E07E0FC003E13F1393F
+03FFF86C6C13F0018013E0390FC07FC09038E01F1E3907F0003FD803FC137F3901FF03FF
+6CEBFFFE6D13FC011F13F0010713C001011300202E7DAD27>64 D<3803FFC0000F13F048
+13FC4813FF811380EC1FC0381F000F000480C71207A2EB0FFF137F0003B5FC120F5A383F
+FC07EA7FC0130012FE5AA46C130F007F131FEBC0FF6CB612806C15C07E000313F1C69038
+807F8022207C9F27>97 D<EB0FF8EB3FFE90B51280000314C04814E0390FFC0FF0391FE0
+03F8EBC001D83F8013FC48C7FC127E157E12FEB612FEA415FC00FCC8FC7E127E127F6C14
+3C6D137E6C7E01F013FE390FFC07FC6CB5FC000114F86C14F0013F13C0903807FE001F20
+7D9F27>101 D<EC1FF0ECFFF84913FC4913FE5BEB0FF014C0011F137CEC8000A6007FB5
+12F0B612F8A36C14F039001F8000B3A4003FB512C04814E0A36C14C01F2E7EAD27>I<15
+3F90391FC0FF80D97FF313C048B612E05A4814EF390FF07F873A1FC01FC3C0EDC000EB80
+0F48486C7EA66C6C485AEBC01FA2390FF07F8090B5C7FC5C485BEB7FF0EB1FC090C9FCA2
+7F6CB5FC15E015F84814FE4880EB8001007EC7EA3F80007C140F00FC15C0481407A46C14
+0F007C1580007F143F6C6CEB7F009038F807FF6CB55A000714F86C5CC614C0D90FFCC7FC
+23337EA027>I<EA7FE0487EA3127F1203A9147F9038F1FFC001F713F090B5FC8114C1EC
+01FCEBFE005B5BA25BB03A7FFF83FFE0B500C713F0A36C018313E0242E7FAD27>I<130F
+497E497EA46D5A6DC7FC90C8FCA7383FFF80487FA37EEA000FB3A4007FB512F0B6FC15F8
+15F07E1D2F7BAE27>I<387FFF80B57EA37EEA000FB3B2007FB512F8B612FCA36C14F81E
+2E7CAD27>108 D<EB1FE0EB7FF83801FFFE487F481480390FF03FC0391FC00FE0393F80
+07F0EB00034814F8007E1301A248EB00FCA76C1301007E14F8A2007F1303393F8007F0A2
+391FE01FE0390FF03FC06CB512806C14006C5B38007FF8EB1FE01E207C9F27>111
+D<387FE0FFD8FFF313C090B512F0816C800003EB81FE49C67E49EB3F8049131F16C04913
+0FA216E01507A6150F16C07F151F6DEB3F80157F6DEBFF009038FF83FEECFFFC5D5D01F3
+13C0D9F0FEC7FC91C8FCAC387FFF80B57EA36C5B23317F9F27>I<397FFC03FC39FFFE0F
+FF023F13804A13C0007F90B5FC39007FFE1F14F89138F00F809138E002004AC7FC5CA291
+C8FCA2137EAD007FB57EB67EA36C5C22207E9F27>114 D<133C137EA8007FB512F0B612
+F8A36C14F0D8007EC7FCAE1518157EA415FE6D13FC1483ECFFF86D13F06D13E0010313C0
+010013001F297EA827>116 D<3A7FFE07FFE000FF15F06D5A497E007F15E03A0F80001F
+00A36D5B0007143EA414F0EBC1F83903E3FC7CA4EBE79EA200011478A301F713F8A2EBFF
+0F6C5CA3EBFE0790387C03E024207F9F27>119 D<3901F003803903FC07C0000F130F38
+1FFE1F393FFF7F80397FBFFF0038FE1FFE486C5A00F813F0387003E01A0A7AAD27>126
+D E /Fb 46 122 df<127812FCA27E7EEA7F80121FEA0FC0EA07E01203EA00F01378133C
+13080E0E78B326>18 D<D907F0EB01FCD93FFEEB0FFF903BFC0F803E0FC03C01F003E07C
+03E02807E001F0F813F03C0FC000F9F001F849EBFFE0001F027FEB00FC48C75B153F4817
+7EA2007E6E5A12FEA293B512FEA20480C7FCA5127E007F4A7EA26C17064B7E6C6C160E00
+0F4A6C130C6DD9F9F8131C2707E001F014382801F007E07E13703C00FC0F801F01E0903B
+3FFE0007FF80D907F0903801FE0037237EA13C>27 D<14C01301EB0380EB0F00130E5B13
+3C5B5BA2485A485AA212075B120F90C7FC5AA2121E123EA3123C127CA55AB0127CA5123C
+123EA3121E121FA27E7F12077F1203A26C7E6C7EA213787F131C7F130FEB0380EB01C013
+00124A79B71E>40 D<12C07E1270123C121C7E120F6C7E6C7EA26C7E6C7EA27F1378137C
+133C133EA2131E131FA37F1480A5EB07C0B0EB0F80A514005BA3131E133EA2133C137C13
+7813F85BA2485A485AA2485A48C7FC120E5A123C12705A5A124A7CB71E>I<B512F0A514
+057F921A>45 D<EB0FE0EB7FFCEBF83E3903E00F803907C007C0EB8003000F14E0391F00
+01F0A24814F8A2003E1300007E14FCA500FE14FEB2007E14FCA56CEB01F8A36C14F0A239
+0F8003E03907C007C0A23903E00F803900F83E00EB7FFCEB0FE01F347DB126>48
+D<EB3FC0EBFFF0000313FC380F80FF391E007F80001CEB3FC048EB1FE048130F15F00060
+130712FC6C14F87E1403A3007E1307123CC7FC15F0A2140F15E0EC1FC0A2EC3F80150014
+7E5C495A5C495A495A495A49C7FC133E133C4913185B485A48481330485A48C7FC001C14
+70001FB512F05A5AB612E0A31D327CB126>50 D<EB1FE0EBFFFC4813FF3907E03F80390F
+001FC0001EEB0FE0001CEB07F0123F018013F8140313C01380A2381F0007C7FC15F0A2EC
+0FE015C0141FEC3F80EC7E00EB01F8EB7FE014FCEB003FEC1FC0EC0FE0EC07F015F81403
+15FC140115FEA3127EB4FCA415FC48130312780070EB07F86C14F0003C130F001FEB1FE0
+390FE03F800003B51200C613FCEB1FE01F347DB126>I<EC01C0A214031407A2140F141F
+A2143F147F146F14CF1301EB038F140F1307130E130C131C13381330137013E013C0EA01
+80120313001206120E120C5A123812305A12E0B71280A3C7380FC000A94A7E0107B51280
+A321337EB226>I<000C14C0380FC00F90B5128015005C5C14F014C0D80C18C7FC90C8FC
+A9EB0FC0EB7FF8EBF07C380FC03F9038001F80EC0FC0120E000CEB07E0A2C713F01403A2
+15F8A41218127E12FEA315F0140712F8006014E01270EC0FC06C131F003C14806CEB7F00
+380F80FE3807FFF8000113E038003F801D347CB126>I<14FE903807FF80011F13E09038
+3F00F0017C13703901F801F8EBF003EA03E01207EA0FC0EC01F04848C7FCA248C8FCA35A
+127EEB07F0EB1FFC38FE381F9038700F809038E007C039FFC003E0018013F0EC01F81300
+15FC1400A24814FEA5127EA4127F6C14FCA26C1301018013F8000F14F0EBC0030007EB07
+E03903E00FC03901F81F806CB51200EB3FFCEB0FE01F347DB126>I<EB0FE0EB7FF8EBFF
+FE3803F83F3907E00F80390FC007C0D81F8013E0EC03F0EA3F0048EB01F8127EA200FE14
+FC1400A415FEA5007E1301A2127F7E1403EA1F80000F13073807C00E3803E01C3801F038
+38007FF090381FC0FC90C7FC1401A215F8A215F01403001F14E0383F800715C0140FEC1F
+809038003F00001C137E381F01FC380FFFF0000313C0C690C7FC1F347DB126>57
+D<123C127E12FFA4127E123C1200B0123C127E12FFA4127E123C08207A9F15>I<15E0A3
+4A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA34A6C7EA202707FEC601FA202E07FECC00F
+A2D901807F1507A249486C7EA301066D7EA2010E80010FB5FCA249800118C77EA2498116
+3FA2496E7EA3496E7EA20001821607487ED81FF04A7ED8FFFE49B512E0A333367DB53A>
+65 D<B7FC16E016F83A03FC0003FE0001EC00FFEE7F80EE3FC0161F17E0160F17F0A617
+E0161F17C0EE3F80EE7F0016FEED03FC90B612F05E9039FC0007FCED00FEEE3F80EE1FC0
+EE0FE017F0160717F8160317FCA617F81607A2EE0FF0EE1FE0163FEE7FC00003913803FF
+00B75A16F816C02E337DB236>I<DA03FE130C91393FFF801C91B512E0903A03FE01F83C
+903A0FF0003C7CD91FC0EB0EFCD97F80130701FEC7120348481401000315005B4848157C
+485A173C485A171C123F5B007F160CA390C9FC481600AB7E6D150CA3123F7F001F161C17
+186C7E17386C6C15306C6C15706D15E012016C6CEC01C0D97F80EB0380D91FC0EB0F00D9
+0FF0131ED903FE13FC0100B512F0023F13C0DA03FEC7FC2E377CB437>I<B77E16F016FE
+3A01FE0001FF00009138003FC0EE0FE0707E707E707E707E177E177FEF3F80A2EF1FC0A3
+EF0FE0A418F0AA18E0A3171F18C0A21880173F18005F17FE5F4C5AEE07F04C5AEE3FC000
+014AB45AB748C7FC16F8168034337EB23B>I<B812C0A3D803FCC7127F0001150FEE03E0
+1601A21600A21760A403061330A41700150EA2151E157E90B512FEA39038FC007E151E15
+0EA21506170CA3171892C7FCA41738A21770A217F01601160316070003157FB812E0A32E
+337DB234>I<B81280A3D803FCC7FC0001151FEE07C01603A21601A21600A41760150CA3
+1700A2151CA2153C15FC90B5FCA3EBFC00153C151CA2150CA592C8FCAB487EB512FEA32B
+337DB232>I<B512FEA3000113006C5AB3B3A7487EB512FEA317337EB21C>73
+D<B512FEA3D803FEC9FC6C5AB3A9EE0180A416031700A45EA25E5E5E5E16FE00031407B7
+FCA329337DB230>76 D<D8FFFE91381FFFF87F80C6030013006E143CD9DFE01418EBCFF0
+A2EBC7F8EBC3FCA2EBC1FEEBC0FF6E7EA26E7E6E7EA26E7E6E7E6E7EA26E7E6E7EA2ED7F
+80ED3FC0ED1FE0A2ED0FF0ED07F8A2ED03FCED01FEED00FFA2EE7F98EE3FD8A2EE1FF816
+0F1607A216031601A2486C1400D807F81578B500C01438A2171835337EB23A>78
+D<EC07FC91387FFFC0903901FC07F0903907E000FCD90F80133E013FC76C7E017E6E7E49
+6E7E48486E7E48486E7EA248486E7E000F8249157E001F167FA24848ED3F80A2007F17C0
+A290C9121FA24817E0AB6C17C06D153FA3003F17806D157FA2001F17006D5D000F5E6C6C
+4A5AA26C6C4A5A00015E6C6C4A5A017E4A5A6D4A5AD91FC0017FC7FCD907E013FC903901
+FC07F09039007FFFC0DA07FCC8FC33377CB43C>I<B612FEEDFFC016F03A03FC0007FC00
+01EC00FE167FEE3F80EE1FC017E0160FA217F0A617E0A2EE1FC0A2EE3F80EE7F0016FEED
+07F890B65A168001FCC9FCB3A2487EB512F8A32C337DB234>I<B612FCEDFF8016F03A01
+FE0007FC0000EC01FEED007F707E707E83160F83A65FA24C5AA24C5A047EC7FC4B5AED0F
+F090B612C093C8FC9039FE001FC0ED07F06F7E6F7E150082167E167FA583A5180C17C0A2
+043F131C486C1618B500FEEB1FE0040F1338933807F070C93801FFE09338003F8036357E
+B239>82 D<B500F0903803FFF8A3D807FEC8EA7FC06C48ED1F000001161E6D151C000016
+18A26D15386D1530A26D6C5CA26E14E0011F5DA26D6C495AA28001074AC7FCA26D6C1306
+A28001015CA26E131C01001418806E5BA2ED8070023F1360A26E6C5AA215E1020F5BA2DA
+07F3C8FCA215FBEC03FEA36E5AA26E5AA31570A235357EB23A>86
+D<1320137013F8487EEA03DEEA078F380F0780381E03C0383C01E0387800F000E0133800
+401310150C78B326>94 D<EB7F803803FFF0380F80FC381C003E003F133F6D6C7E6E7EA2
+6E7EEA1F00C7FCA4EB01FF131FEBFF873803FC07EA0FF0EA1FC0EA3F80127F13004815C0
+5AA3140FA26C131F6C133B3A3F8071F180391FC1E1FF2607FFC013003900FE003C22237D
+A126>97 D<EB07F8EB3FFF9038FC07C03901F000E03903E003F03807C007120FEA1F8012
+3F90380003E04890C7FCA2127E12FEAA127FA26C14187F001F14386D1330000F14706C6C
+13E03903F001C03900FC0F8090383FFE00EB07F01D237EA122>99
+D<153FEC0FFFA3EC007F81AEEB07F0EB3FFCEBFC0F3901F003BF3907E001FF48487E4848
+7F8148C7FCA25A127E12FEAA127E127FA27E6C6C5BA26C6C5B6C6C4813803A03F007BFFC
+3900F81E3FEB3FFCD90FE0130026357DB32B>I<EB0FE0EB7FFCEBF83F3903F00F80D807
+E013C0390FC007E0381F800315F0EA3F0014014814F8127EA212FEA2B6FCA248C8FCA512
+7E127FA26C1418A26C6C1338000F14306D13706C6C13E03901F003C03900FC0F00EB3FFE
+EB07F01D237EA122>I<EB01FCEB07FF90381F078090383E0FC0EB7C1F13FCEA01F8A200
+03EB070049C7FCACB512F0A3D803F0C7FCB3A7487E387FFFE0A31A357FB417>I<151F90
+391FC07F809039FFF8E3C03901F07FC73907E03F033A0FC01F83809039800F8000001F80
+EB00074880A66C5CEB800F000F5CEBC01F6C6C48C7FCEBF07C380EFFF8380C1FC0001CC9
+FCA3121EA2121F380FFFFEECFFC06C14F06C14FC4880381F0001003EEB007F4880ED1F80
+48140FA56C141F007C15006C143E6C5C390FC001F83903F007E0C6B51280D91FFCC7FC22
+337EA126>I<EA03F012FFA312071203AEEC1FC0EC7FF09038F1E0FC9038F3807C9038F7
+007E13FE497FA25BA25BB3486CEB7F80B538C7FFFCA326347EB32B>I<EA0780EA0FC0EA
+1FE0A4EA0FC0EA0780C7FCAAEA07E012FFA3120F1207B3A6EA0FF0B5FCA310337EB215>
+I<EA07E012FFA3120F1207B3B3A7EA0FF0B5FCA310347EB315>108
+D<2703F01FE013FF00FF90267FF80313C0903BF1E07C0F03E0903BF3803E1C01F02807F7
+003F387FD803FE1470496D486C7EA2495CA2495CB3486C496C487EB53BC7FFFE3FFFF0A3
+3C217EA041>I<3903F01FC000FFEB7FF09038F1E0FC9038F3807C3907F7007EEA03FE49
+7FA25BA25BB3486CEB7F80B538C7FFFCA326217EA02B>I<EB07F0EB3FFE9038FC1F8039
+01F007C03903C001E000078048486C7E48C7127CA248147E003E143E007E143FA300FE15
+80A8007E1500A36C147EA26C147C6D13FC6C6C485A00075C3903F007E03900FC1F80D93F
+FEC7FCEB07F021237EA126>I<903807F00390383FFC07EBFC0F3901F8038F3807E00100
+0F14DF48486CB4FC497F123F90C77E5AA25A5AA9127FA36C6C5B121F6D5B000F5B3907E0
+03BF3903F0073F3800F81EEB3FF8EB0FE090C7FCAAED7F8091380FFFFCA326307DA029>
+113 D<3803E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049C7FC
+A35BB2487EB512E0A31A217FA01E>I<EBFF06000713CE381F00FE003C133E48131E140E
+5A1406A27EA200FE90C7FC6C7EEA7FFC383FFFC014F0000F7F6C7FC67FEB0FFF1300EC3F
+8000C0131F140F6C1307A37E15006C5B6C130E6C5B38F7807838E1FFE038C07F8019237E
+A11E>I<1330A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403A814
+073801F806A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>I<D803F0133F00FFEB0FFF
+A30007EB007F000380B35DA35D12016D4813800000903803BFFC90387E073FEB1FFED907
+F8130026227EA02B>I<B5EBFFF0A3D80FF0EB3F800007EC1F000003140E150C6D131C00
+011418A26C6C5BA26D1370017E1360137F6D5BA290381F8180A214C3010F90C7FCA2EB07
+E6A214FE6D5AA26D5AA36D5AA2146024217E9F29>I<3A7FFF807FF8A33A07F8001FC000
+03EC0F800001EC070015066C6C5BA26D131C017E1318A26D5BA2EC8070011F1360ECC0E0
+010F5BA2903807E180A214F3010390C7FC14FBEB01FEA26D5AA31478A21430A25CA214E0
+5CA2495A1278D8FC03C8FCA21306130EEA701CEA7838EA1FF0EA0FC025307F9F29>121
+D E /Fc 1 6 df<146014F8497E497E497E90380FDF8090381F8FC090383F07E090387E
+03F0496C7E48486C7E4848137E48487F4848EB1F804848EB0FC048C7EA07E0007EEC03F0
+481401A2007E14036CEC07E06C6CEB0FC06C6CEB1F806C6CEB3F006C6C137E6C6C5B6C6C
+485A90387E03F06D485A90381F8FC090380FDF806DB4C7FC6D5A6D5A6D5A146024247FA4
+27>5 D E /Fd 1 101 df<197C953807FFC0067F13FC0507B612C0057F15FC040FB50083
+EBFFE093B526F0001F13FE030F01FCC8387FFFE092B50080030313FE020F01F0CA381FFF
+E0DAFFFCCCEA7FFE011F0180963803FFF02601FFF0CEEA1FFFD81FFED013F0D8FF80F503
+FE00F0D2121E771080BF78>100 D E /Fe 1 66 df<ED0780150FA2151FA2153F157FA2
+15EFEDE7C0EC01C714031587EC0707A2140E141E141C02387F1503147014F014E0EB01C0
+A2EB038049B5FC8290380E0001A25B5BA25B13F05B12014848801207120FD8FFF890381F
+FF80A2292A7CA932>65 D E /Ff 8 123 df<130E131F5BA2133E131C90C7FCA7EA03E0
+487EEA0C78EA187C1230A212605B12C0A2EA01F0A3485AA2485AA2EBC180EA0F81A2381F
+0300A213066C5A131CEA07F06C5A11287DA617>105 D<1407EC0F80141FA21500140E91
+C7FCA7EB03E0EB07F8EB0C3C1318EB303E136013C0A248485AA2C7FCA25CA4495AA4495A
+A4495AA4495AA21238D87C1FC7FC12FC133E485AEA70F8EA7FE0EA1F80193380A61B>I<
+133EEA07FEA2EA007CA213FCA25BA21201A25BA21203EC07809038E01FC0EC38600007EB
+61E014C3EBC187EBC307D80FC613C09038CC038001B8C7FC13E0487E13FEEB3F80EB0FC0
+486C7E1303003E1460A2127EECC0C0127CECC18012FC903801E30038F800FE0070137C1B
+297CA723>I<3907801FC0390FE07FF03918F0E0F83930F1807CEBFB00D860FE133C5B5B
+00C1147C5B1201A248485BA34A5AEA07C01660EC03E0A23A0F8007C0C0A2EDC180913803
+C300D81F0013C7EC01FE000EEB00F8231B7D9929>110 D<9038F007C03901FC1FF03903
+1E78780006EBE03C90381FC01C000CEB801E14005B0018141F133E1200137E153E137CA2
+13FC157C5B1578000114F0A2EC01E0EC03C03903FC07809038FE1F00EBE7FCEBE1F0D807
+E0C7FCA25BA2120FA25B121FEAFFF8A22025809922>112 D<90387C03C03901FF0FF039
+07079C30390E03B078000CEBF0F8001813E1123015F0396007C0E015001200A2495AA449
+C7FC15301238007C1460EAFC3E15C0EAF87E39F06F03803970C70700383F83FE381F01F8
+1D1B7D9926>120 D<EA03E0486C1370D80C7813F8EA187C0030EB01F0A2126013F800C0
+EB03E0A2EA01F0A2EC07C0EA03E0A33907C00F80A4EC1F00A25C00035B3801E0FE3800FF
+BEEB3F3E13005C121E003F5B5C387E01E0383C03C038300780D81C1FC7FCEA0FFCEA07F0
+1D267D9922>I<013E13C0137F9038FF818048EBC3004813FF380701FE3806000C00045B
+C75A5C5CEB03800106C7FC5B5B5B5B9038C00180EA038039060003005C380FF81E381FFF
+FE38383FFC38601FF86D5A38C007C01A1B7D9920>I E /Fg 7 108
+df<007FB81280B912C0A26C17803204799641>0 D<EB0FE0EB7FFC497E0003EBFF804814
+C04814E04814F04814F8A24814FCA3B612FEA86C14FCA36C14F8A26C14F06C14E06C14C0
+6C1480C6EBFE006D5AEB0FE01F207BA42A>15 D<181EA4181F84A285180785727EA2727E
+727E85197E85F11F80F10FC0F107F0007FBA12FCBCFCA26C19FCCCEA07F0F10FC0F11F80
+F13F00197E61614E5A4E5AA24E5A61180F96C7FCA260181EA4482C7BAA53>33
+D<15301578B3B3AD007FB812F8B912FCA26C17F836367BB541>63
+D<14C0EB01E01303A214C01307A21480130FA2EB1F00A2131E133EA25BA2137813F8A248
+5AA25B1203A25B1207A2485AA290C7FC5AA2123EA2123C127CA2127812F8A41278127CA2
+123C123EA27EA27E7FA26C7EA212037FA212017FA26C7EA21378137CA27FA2131E131FA2
+EB0F80A2130714C0A2130314E0A21301EB00C0135278BD20>104
+D<126012F07EA21278127CA2123C123EA27EA27E7FA26C7EA212037FA26C7EA212007FA2
+1378137CA27FA2131E131FA2EB0F80A2130714C0A2130314E0A414C01307A21480130FA2
+EB1F00A2131E133EA25BA2137813F8A25B1201A2485AA25B1207A2485AA290C7FC5AA212
+3EA2123C127CA2127812F8A25A126013527CBD20>I<0070131C00F0131EB3B3B3B3A800
+70131C175277BD2A>107 D E /Fh 5 116 df<B612F815FF3A03F8001FC00001EC07E0ED
+01F8150016FC167EA2167FA6167EA216FC16F81501ED07E0ED1FC090B6120015F801F8C8
+FCB2487EB512F0A2282D7DAC31>80 D<14E0A2497EA3497EA3EB067CA2EB0E7EEB0C3EA2
+497EA3496C7EA201707FEB6007A2496C7E90B5FC4880EB8001A2D803007F1400A2000614
+7CA2000F147E123F3AFFC003FFE0A223237EA229>97 D<903803F80290381FFE0690387E
+038E3901F800DED803E0137E4848133E485A48C7121EA2003E140EA2127E007C1406A212
+FC1500A7007C1406A2127E123E150C7EA26C6C13186C6C13306C6C1360D801F813C03900
+7E038090381FFF00EB03F81F247DA227>99 D<B5FCA2EA0FE06C5AB21530A41570A21560
+15E014011403000F130FB6FCA21C227EA122>108 D<3801F8083807FF18381E07B8383C
+01F8383800785A143812F01418A36C13007E127EEA7FE0EA3FFE381FFF806C13C0000313
+E038007FF0EB07F81301EB007CA2143C12C0A46C133814786C137000FC13E038EF01C038
+C7FF803880FE0016247DA21E>115 D E /Fi 7 85 df<EB1FFF90B512E0000314F84880
+390FF803FE391FC0007F90C7121F003EEC0F80A248EC07C0A448EC03E0A8B7FCA400F8C7
+1203B00070EC01C0232A79A831>65 D<007FB6FCB71280A2160000F8C9FCB0B612F081A2
+5D00F8C9FCACB7FC1680A26C1500212879A72E>69 D<007016E000F8ED01F0A26C15036C
+1507A26C150FA26D141FA26D143F6D147F00FB157DD8F9F014F9A2D8F8F8EB01F1A2017C
+EB03E1017E1307013E14C16DEB0F81A290390F801F01A2903807C03EECE07E0103137C90
+3801F0F8A2903800F9F0A2EC7FE0A2EC3FC0EC1F80A2EC0F00A291C7FCA30070ED00E02C
+2A79A83A>77 D<90380FFFF8017F13FF48B612C048813A07FC001FF0D80FE0EB03F8D81F
+80EB00FC90C8127C003E81A24881A448ED0F80B1007CED1F00A36C153E003F157ED81FC0
+495AD80FF8EB0FF86CB65A6C5DC61580011F01FCC7FC292A7CA831>79
+D<007FB512F0B612FC15FF168000F8C7EA3FC0ED0FE01503A2ED01F0A8ED03E0A2150FED
+3FC0B71280160015FC15F000F8C9FCB01270242979A72E>I<0003B512FE000F805A485C
+48C9FC127CA25AAA127CA2127F6CB512F86C14FF6C1580000315C0C8EA1FE01503ED01F0
+A8ED03E0151F007FB612C0B7128016006C14F8242879A72E>83 D<007FB712C0B812E0A2
+6C16C0C7001FC8FCB3B2140E2B2980A72B>I E /Fj 23 118 df<EC0380EC07C0140FA2
+141F1580143F15005C147EA214FE5C13015C13035C13075CA2130F5C131F5C133F91C7FC
+A25B137E13FE5B12015BA212035B12075B120F5B121F5BA2123F90C8FC5A127E12FE5AA2
+5A12781A347CAD23>47 D<EB7FC03801FFF0000713FC487F487F393FE07F809038801FC0
+140F1407A3EA0E00C7120FA2EC1F80143F903801FF00EB7FFE495A5C806DB4FC9038007F
+80EC1FC0EC0FE01407EC03F0A21401A2127C12FE1403A2EC07E048130F6CEB1FC0387FC0
+7F6CB512806C14006C13FC00035B38007FC01C2B7DA923>51 D<007FB512FCB612FEA37E
+3907C0003EA5151C1500A3140E141FA390B5FCA5EBC01FA3140E91C7FCA9EA7FFEB5FCA3
+6C5A1F297FA823>70 D<90381FC1C090387FF3E090B5FC12035AEBF83F380FE01F381FC0
+0F1380003F13071300007E1303A3007CEB01C000FC90C7FCA25AA6EC7FF815FCA27E15F8
+007CEB03E0127E1407A27EEB800F121FEBC01FEA0FE03807F87F90B5FC7EC613FB90387F
+F1C090381FC0001E2B7EA923>I<39FF8001FFA26D5AA3391EE00778A3EBF00FEB700EA2
+EB781EA2EB381CEB3C3CA2EB1C38EB1E78A2EB0E70A3EB07E0A3EB03C0A290C7FCA939FF
+C003FFA520297FA823>77 D<007FB512F8B612FCA439F807C07CA50070143800001400B3
+A7EBFFFE487FA36C5B1E297EA823>84 D<3803FF80000F13E04813F8487F80EB80FFEC3F
+80381F001FC7FC140F14FF137F0003B5FC120F5A387FF00F130012FCA25A141F7E6C133F
+387F81FF90B512FC6C14FE7E000713C73901FE01FC1F1D7D9C23>97
+D<B47E7FA41207A7EBC1FCEBC7FF01DF13C090B512E015F09038FE0FF8EBF8039038F001
+FCEBE000A249137EA2153EA5157E7F15FC7F14019038F803F89038FE0FF090B5FC15E001
+DF138001CF1300380383F81F297FA823>I<EB3FF0EBFFFC000313FF5A5A381FE07FEA3F
+80387F003E007E90C7FCA25AA25AA57EA2007E1307007FEB0F80141FEA3FC0391FF07F00
+6CB5FC6C5B6C5BC613F0EB3FC0191D7B9C23>I<ECFF8015C0A41407A7EB7F873801FFE7
+4813F7000F13FF5A13E0383F803F387F001F007E130FA2481307A25AA56C130FA2127E14
+1F007F133F383F807FEBE0FF6CB512FE7E000313F76C13C738007F031F297EA823>I<EB
+3FC0EBFFF800037F4813FF481480381FF07F393F801FC0EB000F007E130715E05AB6FCA4
+15C000F8C8FC7EA2007EEB01C0007FEB03E0383F800713E0391FF81FC06CB5FC6C148000
+01EBFE006C6C5AEB1FE01B1D7D9C23>I<EC01F090383F07FC9038FFDFFE000313FF5A48
+147E381FE1FE9038807E18393F003F00A2003E7FA4003F5BA2381F807EEBE1FE6CB45A48
+5B5C001E13C0013FC7FC90C8FC121F1340380FFFFCECFF804814C04814F0397E0007F800
+7C130048147CA248143CA36C147C6C14FC007FEB03F8EBE01F6CB512F0000F14C06C1480
+0001EBFE0038003FF01F2E7E9D23>103 D<B47E7FA41207A7EBC1FCEBC7FF01DF138090
+B512C0A29038FE0FE0EBF807EBF00313E0A313C0AD39FFFE1FFF5CA38020297FA823>I<
+133813FEA5133890C7FCA6EA7FFC487EA3127FEA003EB3387FFFFEB6FCA36C13FE182A7A
+A923>I<EA7FFEB5FCA37EEA001FB3AD007FB512C0B612E0A36C14C01B297CA823>108
+D<397E1F01F039FF7FC7FC9038FFEFFE14FF6C80390FE1FE1FEBC1FC01C07FEB80F8A2EB
+00F0AE3A7FE3FE3FE026FFF3FF13F0A3267FE3FE13E0241D819C23>I<38FF81FCEBC7FF
+01DF138090B512C0A23907FE0FE0EBF807EBF00313E0A313C0AD39FFFE1FFF5CA380201D
+7F9C23>I<133F3801FFE0487F487F487F381FC0FE383F807F383E001F007E1480007C13
+0F00FC14C0481307A66C130FA2007C1480007E131F6CEB3F006D5A381FE1FE6CB45A6C5B
+6C5B6C5BD8003FC7FC1A1D7C9C23>I<38FF81FCEBC7FF01DF13C090B512E015F03907FE
+0FF8EBF8039038F001FCEBE000A249137EA2153EA5157E7F15FC7F14019038F803F89038
+FE0FF090B5FC15E001DF138001CF1300EBC3F801C0C7FCAAEAFFFEA51F2C7F9C23>I<39
+7FF00FE039FFF87FF8ECFFFC13FB6CB5FCC613F8ECC078EC800091C7FC5BA25BA35BAA38
+7FFFFCB57EA36C5B1E1D7E9C23>114 D<3801FF9C000F13FE5A127FA2EAFF0000FC137E
+48133EA26C131C6C1300EA7FF0383FFF80000F13E06C13F838007FFCEB01FEEB007F0070
+133F00F8131F7E143F7E38FF80FFEBFFFE14FC14F814F000701380181D7B9C23>I<1370
+13F8A7007FB51280B612C0A36C1480D800F8C7FCACEC01C0EC03E0A3EBFC07140F9038FE
+1FC0EB7FFF158090383FFE00EB0FFCEB07F01B257EA423>I<39FF807FC001C013E0A400
+071303B01407140FEBE03F90B6FC7EA2C613F3EB3FC1201D7F9C23>I
+E /Fk 46 123 df<123C127EB4FCA21380A2127F123D1201A312031300A25A1206120E5A
+5A5A126009157AAD14>39 D<13031307130E131C1338137013F0EA01E013C01203EA0780
+A2EA0F00A2121EA35AA45AA512F8A25AAB7EA21278A57EA47EA37EA2EA0780A2EA03C012
+0113E0EA00F013701338131C130E1307130310437AB11B>I<12C07E12707E7E7E120FEA
+0780120313C0EA01E0A2EA00F0A21378A3133CA4131EA5131FA2130FAB131FA2131EA513
+3CA41378A313F0A2EA01E0A2EA03C013801207EA0F00120E5A5A5A5A5A10437CB11B>I<
+123C127EB4FCA21380A2127F123D1201A312031300A25A1206120E5A5A5A126009157A87
+14>44 D<B512C0A412047F9018>I<123C127E12FFA4127E123C08087A8714>I<EB3FC0EB
+FFF03803E07C48487E48487E497E001EEB0780A2003E14C0A248EB03E0A500FC14F0B000
+7C14E0A3007E1307003E14C0A36CEB0F806C14006D5A3807C03E3803F0FC3800FFF0EB3F
+C01C2D7DAB23>48 D<130C133C137CEA03FC12FFEAFC7C1200B3B113FE387FFFFEA2172C
+7AAB23>I<EB1FC0EBFFF03803E07C3807801E48487E001EEB0780A248EB03C0A4123E14
+07003F1480381FC00F01E01300EBF81E6C6C5A3807FFF86C13E0C6FCEB3FF8EBFFFC3803
+C7FFD807831380D81F0013C0001E133F48EB1FE0007C13070078EB03F012F84813011400
+A46C14E000781301007C14C0003C13036CEB0780390F800F003807E03C3801FFF038003F
+C01C2D7DAB23>56 D<EB3F80EBFFF03803E0783807C03E48487E48487E003E1480140700
+7E14C0127C00FC14E01403A315F0A5007C1307127EA2003E130F7E6C131F3807803B3803
+E0F33800FFC390383F03E013001407A215C0A2140F001E1480003F14005C143E143C003E
+5B001C5B380E03E03807FF80D801FEC7FC1C2D7DAB23>I<4A7E4A7EA34A7EA24A7EA3EC
+1BF81419A2EC30FCA2EC70FEEC607EA24A7EA349486C7EA2010380EC000FA201066D7EA3
+496D7EA2011FB57EA29038180001496D7EA349147EA201E0147F4980A20001ED1F801203
+000716C0D80FF0EC3FE0D8FFFC0103B5FCA2302F7EAE35>65 D<DA1FF013C09138FFFE01
+903903F00F8390390F8001E3013FC71277017C143F4848141F4848140F48481407A24848
+1403121F491401123F90C8FC481500A300FE1600AB127F17C0A27E7F001F15016D158012
+0F6C6C1403EE07006C6C14066C6C140ED8007C5C013F147890390F8001E0903903F00FC0
+902600FFFEC7FCEC1FF02A2F7CAD33>67 D<B512F0A23803FC006C5AB3B3A3487EB512F0
+A2142D7EAC19>73 D<B500F0EB7FFEA2D803FCC7EA1FF06C48EC0FC01700161E16385E5E
+4B5A4B5A4BC7FC150E5D5D15F0EC01C04A5A4A7E4A7E141F4A7EEC73F8ECE1FCEBF9C090
+38FF80FE9038FE007F497F49806F7E6F7E1507826F7E6F7EA26F7E167F821780EE1FC017
+E0486CEC3FF0B5D8F001B5FCA2302D7DAC37>75 D<B512F8A2D803FCC8FC6C5AB3A7160C
+A41618A41638A2167816F81501ED07F00003141FB7FCA2262D7EAC2C>I<D8FFF8903803
+FFFC7F00019138003FC06DEC0F006D1406EBBF80A2EB9FC0EB8FE0138780EB83F8138180
+EB80FE147E147FEC3F80EC1FC0140F15E0EC07F0140315F8EC01FC140015FE157FED3F86
+151F16C6ED0FE6150716F6ED03FE1501A21500167E163EA2486C141ED80FF0140EB5FC16
+062E2D7DAC35>78 D<EC3FF0903801FFFE903907E01F8090391F8007E090393E0001F001
+FCEB00FC4848147E4848804848EC1F8049140F000F16C04848EC07E0A248C8EA03F0A248
+16F8A2007E1501A200FE16FCAA007FED03F8A36C16F06D1407001F16E0A26C6CEC0FC06D
+141F000716806C6CEC3F006C6C147E6C6C5C017E495A90391F8007E0903907E01F809026
+01FFFEC7FC9038003FF02E2F7CAD37>I<B612C015FC3903F8007F0001EC0FC06F7E6F7E
+6F7E82150082A55E15015E4B5A4B5A4B5A037FC7FC90B512FC15F09038F800FC153E6F7E
+150F826F7EA582A5170316F815031707486C903801FC0EB539F000FE1CEE3FF8C9EA07E0
+302E7DAC34>82 D<007FB712F8A29039000FC003007C150000701638A200601618A200E0
+161CA248160CA5C71500B3A94A7E011FB512E0A22E2D7EAC33>84
+D<B539F003FFFCA2D803FCC7EA3FC06C48EC0F001606B3AB160E0000150C7F161C017C14
+18017E14386D5C6D146090390F8001E0903907E00380902601F80FC7FC9038007FFCEC0F
+F02E2E7DAC35>I<B53C801FFFF001FFF8A22707FC000190C7EA3FC0D803F06D48EC1F00
+047E140EA26C6C027F140CA26D171C0000DBDF801318A26D1738017E9026018FC01330A2
+017F17706D90260307E01360A2028016E0011F90260603F05BA202C01501010F90260C01
+F85BA202E01503010790261800FC90C7FCA202F05D010349EB7E06A202F8150E010149EB
+3F0CA202FC151C010049EB1F98A202FE15B8DA7F80EB0FF0A2023F5D92C71207A26E5D02
+1E1403A2020E5D020C1401452E7FAC48>87 D<13FF000713C0380F01F0381C00F8003F13
+7C80A2143F001E7FC7FCA4EB07FF137F3801FE1FEA07F0EA1FC0EA3F80EA7F00127E00FE
+14065AA3143F7E007E137F007FEBEF8C391F83C7FC390FFF03F83901FC01E01F207D9E23
+>97 D<EA07C012FFA2120F1207AC14FE9038C7FF809038CF03E09038DC01F09038F8007C
+49137E49133E497F1680A2150F16C0A9ED1F80A216005D6D133E6D5B01B05B9038BC01F0
+90380E07E0390607FF80260001FCC7FC222F7EAD27>I<EB1FE0EB7FFC3801F01E3803E0
+073907C01F80EA0F80EA1F005A003EEB0F00007E90C7FCA2127C12FCA9127EA215C07E6C
+130101801380380FC0033907E007003801F03E38007FF8EB1FC01A207E9E1F>I<15F814
+1FA214011400ACEB0FE0EB7FF83801F81E3803E0073807C003380F8001EA1F0048130012
+3E127EA25AA9127C127EA2003E13017EEB8003000F13073903E00EFC3A01F03CFFC03800
+7FF090391FC0F800222F7EAD27>I<EB1F80EBFFF03803E0783807C03E380F801E381F00
+1FEC0F80123E007E130715C0127C12FCA3B6FCA200FCC8FCA5127EA2003E14C0123F6C13
+01390F80038001C013003803E00F3801F03C38007FF8EB1FC01A207E9E1F>I<EB03F0EB
+0FFCEB3E1EEB7C3F13F8EA01F0A23803E00C1400AAB512E0A23803E000B3A6487E387FFF
+80A2182F7FAE16>I<013F13F89038FFC3FE3903E1FF1E3807807C000F140C391F003E00
+A2003E7FA76C133EA26C6C5A00071378380FE1F0380CFFC0D81C3FC7FC90C8FCA3121E12
+1F380FFFF814FF6C14C04814F0391E0007F848130048147C12F848143CA46C147C007C14
+F86CEB01F06CEB03E03907E01F803901FFFE0038003FF01F2D7E9D23>I<EA07C012FFA2
+120F1207AC14FE9038C3FF809038C703E09038DE01F013F8496C7EA25BA25BB2486C487E
+3AFFFE1FFFC0A2222E7EAD27>I<EA0780EA0FC0EA1FE0A4EA0FC0EA0780C7FCA8EA07C0
+12FFA2120F1207B3A5EA0FE0EAFFFCA20E2E7EAD14>I<EA07C012FFA2120F1207ADEC1F
+FEA2EC0FF0EC07C05D020EC7FC5C5C5C5CEBC3C013C7EBCFE0EBDFF013F9EBF0F8497EEB
+C07E143E80816E7E14076E7E816E7E486C487E3AFFFE07FF80A2212E7EAD25>107
+D<EA07C012FFA2120F1207B3B3A3EA0FE0EAFFFEA20F2E7EAD14>I<2607C07FEB07F03B
+FFC3FFC03FFC903AC783F0783F3C0FCE01F8E01F803B07DC00F9C00F01F8D9FF8013C049
+90387F000749137EA249137CB2486C01FEEB0FE03CFFFE0FFFE0FFFEA2371E7E9D3C>I<
+3807C0FE39FFC3FF809038C703E0390FDE01F0EA07F8496C7EA25BA25BB2486C487E3AFF
+FE1FFFC0A2221E7E9D27>I<EB1FE0EB7FF83801F03E3803C00F3907800780390F0003C0
+4814E0003EEB01F0A248EB00F8A300FC14FCA9007C14F8A26CEB01F0A26CEB03E0A2390F
+8007C03907C00F803901F03E0038007FF8EB1FE01E207E9E23>I<3807C0FE39FFC7FF80
+9038CF03E0390FDC01F03907F800FC49137E49133E49133FED1F80A3ED0FC0A8151F1680
+A2ED3F00A26D137E6D137C5D9038FC01F09038CE07E09038C7FF80D9C1FCC7FC01C0C8FC
+A9487EEAFFFEA2222B7E9D27>I<90380FE01890387FF8383801F81C3903E00E783807C0
+07390F8003F8001F1301EA3F00A2007E1300A212FE5AA8127EA36C13017EEB8003380FC0
+073803E00E3801F03C38007FF0EB1FC090C7FCA94A7E91381FFFC0A2222B7E9D25>I<38
+0781F838FF87FEEB8E3FEA0F9CEA07B813B0EBF01EEBE000A45BB0487EB5FCA2181E7E9D
+1C>I<3801FE183807FFB8381E01F8EA3C00481378481338A21418A27E7EB41300EA7FF0
+6CB4FC6C13C06C13F0000113F838001FFC130138C0007E143EA26C131EA27EA26C133CA2
+6C137838FF01F038E3FFC000C0130017207E9E1C>I<1360A413E0A312011203A2120712
+1FB512F0A23803E000AF1418A714383801F03014703800F860EB3FE0EB0F80152A7FA81B
+>I<D807C013F800FF131FA2000F130100071300B21401A314033803E007EC0EFC3A01F8
+1CFFC038007FF890391FE0F800221F7E9D27>I<3AFFFC01FFC0A23A0FE0007E00000714
+7C15380003143015706C6C1360A26C6C5BA390387C0180A26D48C7FCA2EB3F07EB1F06A2
+EB0F8CA214DCEB07D8A2EB03F0A36D5AA26D5A221E7F9C25>I<3BFFFC3FFE07FFA23B0F
+E003F001F801C09038E000F00007010114E0812603E00314C0A2913807F8012701F00678
+1380A29039F80E7C030000D90C3C1300A290397C181E06A2151F6D486C5AA2168C90391F
+600798A216D890390FC003F0A36D486C5AA36DC75A301E7F9C33>I<3AFFFC07FF80A23A
+0FF003FC000003EB01F0000114C06D485A000091C7FCEB7C06EB3E0E6D5A14B8EB0FB0EB
+07E013036D7E497E1307EB067C497EEB1C1F01387FEB700F496C7E6E7ED803C07F00076D
+7E391FE003FC3AFFF007FFC0A2221D7F9C25>I<3AFFFC01FFC0A23A0FE0007E00000714
+7C1538000314306D137000011460A26C6C5BA2EBFC01017C5BEB7E03013E90C7FCA2EB1F
+06A2148EEB0F8CA2EB07D8A2EB03F0A36D5AA26D5AA2495AA2130391C8FC1278EAFC06A2
+5B131CEA7838EA7070EA3FE0EA0F80222B7F9C25>I<003FB51280A2EB003F003C140000
+38137E00305BEA700100605B495A495A130F00005B495A49C7FC5B137E9038FC0180EA01
+F8120313F03807E003EA0FC0001F1400138048485A007E5B00FE133FB6FCA2191D7E9C1F
+>I E /Fl 3 52 df<13E01201120712FF12F91201B3A7487EB512C0A212217AA01E>49
+D<EA01FC3807FF80381C0FC0383003E0386001F0EB00F812F86C13FCA2147C1278003013
+FCC7FC14F8A2EB01F0EB03E014C0EB0780EB0F00131E13385B5B3801C00CEA0380380600
+185A5A383FFFF85AB512F0A216217CA01E>I<13FF000313C0380F03E0381C00F014F800
+3E13FC147CA2001E13FC120CC712F8A2EB01F0EB03E0EB0FC03801FF00A2380003E0EB00
+F01478147C143E143F1230127812FCA2143E48137E0060137C003813F8381E03F0380FFF
+C00001130018227DA01E>I E /Fm 3 52 df<13381378EA01F8121F12FE12E01200B3AB
+487EB512F8A215267BA521>49 D<13FF000313E0380E03F0381800F848137C48137E0078
+7F12FC6CEB1F80A4127CC7FC15005C143E147E147C5C495A495A5C495A010EC7FC5B5B90
+3870018013E0EA0180390300030012065A001FB5FC5A485BB5FCA219267DA521>I<13FF
+000313E0380F01F8381C007C0030137E003C133E007E133FA4123CC7123E147E147C5C49
+5AEB07E03801FF8091C7FC380001E06D7E147C80143F801580A21238127C12FEA2150048
+5B0078133E00705B6C5B381F01F03807FFC0C690C7FC19277DA521>I
+E /Fn 32 127 df<EC3FC0ECFFF8903807E07C90380F801FD93F00EB800C017E130F4990
+3807C01C4848ECE018485A484801031338000FEDF0305B001F16704848156017E0007F16
+C090C713F1178016F34816004815F716FE5EA2485D5EA4007E1407150F003E91381DF818
+003F14796C02E11338270F8007C013303B07E03F007CF02601FFF8EB3FC026003FC0EB0F
+802E267DA435>11 D<EC03F0EC0FFCEC3E1EEC780F14F001011480903803E007D907C013
+C0EB0F80131F14004914E0137EA25BA2485A1203A249130F1207A2485AA2ED1FC0121F5B
+A290B6FC481580A3903880007F007F150090C7FCA215FEA2127E4A5AA200FE5C1403A200
+7C5C4A5AA24A5AA24A5A92C7FC5C6C137E147C001E5B495A6C485A380787806CB4C8FCEA
+00F8233C7EBA27>18 D<1503A35DA21506A2150EA2150CA2151CA21518A21538A21530A2
+1570A2EC07FE91383FFFC0903901FCE3F0903907E0E0F890391F80C03ED93E007FEB7C01
+D801F8EC0F80D803F0018013C0D807E014071403D80FC015E0D81F801300A248485AA200
+7E1306A2020E130F12FE48010C14C0A2021CEB1F80A20218EB3F00A20238137E007C5D14
+30007E4A5A003E90387003F06CEC07C09138600F80D80F80013FC7FC3903E0E0FC3901F8
+E7F039007FFF80D90FFCC8FCEB01C0A25CA21303A291C9FCA25BA21306A2130EA2130CA2
+2B4B7CB931>30 D<160C161C1618A316381630A316701660A316E05EA315015EA301F801
+03130FD803FE9138001F80D8070F153F000E018015C0001C5C001814060038161F003016
+0FD8701F010E13070060140C1703D8E03F168000C0EB001C491318EA007E180001FE1338
+4913305F000116064913700360130E5F000316184901E013384B133017705F0201495AD8
+01F849485A4CC7FC160E2600FC035B017EEB0078013FEB01E090390FE30F80902603FFFE
+C8FC9038003FF00206C9FCA2140E140CA3141C1418A314381430A314701460324B7EB936
+>32 D<121C127FEAFF80A5EA7F00121C0909798817>58 D<121C127FEAFF80A213C0A312
+7F121C1200A412011380A2120313005A1206120E5A5A5A12600A19798817>I<150C151E
+153EA2153C157CA2157815F8A215F01401A215E01403A215C01407A21580140FA215005C
+A2141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA2
+131E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A25B120FA290C8FC5AA2
+121E123EA2123C127CA2127812F8A25A12601F537BBD2A>61 D<4BB4FC031F13F09238FE
+01FC913903F0007EDA07C0EB1F80DA1F80EB0FC0023EC7EA07E002FCEC03F0495A4948EC
+01F8495A4948EC00FC495A49C912FE49167E13FE49167F1201485AA2485AA2120F5B001F
+17FFA2485AA34848ED01FEA400FFEE03FC90C9FCA2EF07F8A2EF0FF0A218E0171F18C0EF
+3F806C167F180017FE4C5A6C6C5D1603001F4B5A6D4A5A000FED1F806C6C4AC7FC6D147E
+0003EC01F8D801FC495AD8007EEB0FC090263F807FC8FC903807FFF801001380383D7CBA
+3F>79 D<147E903803FF8090390FC1C38090391F00EFC0017E137F49133F485A4848EB1F
+8012075B000F143F48481400A2485A5D007F147E90C7FCA215FE485C5AA214015D48150C
+A21403EDF01C16181407007C1538007E010F1330003E131F027B13706C01E113E03A0F83
+C0F9C03A03FF007F80D800FCEB1F0026267DA42C>97 D<133FEA1FFFA3C67E137EA313FE
+5BA312015BA312035BA31207EBE0FCEBE3FF9038E707C0390FFE03E09038F801F001F013
+F8EBE000485A15FC5BA2123F90C7FCA214015A127EA2140312FE4814F8A2140715F05AEC
+0FE0A215C0EC1F80143F00781400007C137E5C383C01F86C485A380F07C06CB4C7FCEA01
+FC1E3B7CB924>I<EC3FC0903801FFF0903807E03C90380F800E90383F0007017E131F49
+137F484813FF485A485A120F4913FE001F143848481300A2127F90C8FCA35A5AA45AA315
+031507007E1406150E003E143C003F14706C14E0390F8007C03907C03F003801FFF83800
+3FC020267DA424>I<163FED1FFFA3ED007F167EA216FEA216FCA21501A216F8A21503A2
+16F0A21507A2027E13E0903803FF8790380FC1CF90381F00EF017EEB7FC049133F485A48
+48131F000715805B000F143F485A1600485A5D127F90C7127EA215FE5A485CA21401A248
+ECF80CA21403161CEDF0181407007C1538007E010F1330003E131F027B13706C01E113E0
+3A0F83C0F9C03A03FF007F80D800FCEB1F00283B7DB92B>I<16F8ED03FEED0F8792381F
+0F80ED3E3F167F157CA215FC1700161C4A48C7FCA414035DA414075DA20107B512F0A390
+26000FE0C7FC5DA4141F5DA4143F92C8FCA45C147EA514FE5CA413015CA4495AA45C1307
+A25C121E123F387F8F80A200FF90C9FC131E12FEEA7C3CEA7878EA1FF0EA07C0294C7CBA
+29>102 D<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C9FCA35B90387E03
+F8EC0FFF91383C0F809039FEF007C0D9FDC07FEBFF80EC0003485A5BA249130712035BA2
+150F00075D5BA2151F000F5D5B153F93C7FC121F4990387F0180157EEDFE03003F02FC13
+0090C7FC5EEDF80648150E007E150C161C5E00FEEC787048EC3FE00038EC0F80293B7CB9
+30>104 D<14E0EB03F8A21307A314F0EB01C090C7FCAB13F8EA03FEEA070F000E138012
+1C121812381230EA701F1260133F00E0130012C05BEA007EA213FE5B1201A25B12035BA2
+0007131813E01438000F133013C01470EB806014E014C01381EB838038078700EA03FEEA
+00F815397EB71D>I<150FED3F80A2157FA31600151C92C7FCABEC0F80EC3FE0ECF0F090
+3801C0F849487E14005B130E130C131CEB1801133801305BA2EB0003A25DA21407A25DA2
+140FA25DA2141FA25DA2143FA292C7FCA25CA2147EA214FEA25CA21301001E5B123F387F
+83F0A238FF87E0495A00FE5BD87C1FC8FCEA707EEA3FF8EA0FC0214981B722>I<EB03F0
+EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C8FCA35B017EEB07C0ED1FF0ED783801
+FEEBE0F89039FC01C1FCEC0383EC07070001130ED9F81C13F891383803F091387001E000
+0349C7FCEBF1C0EBF38001F7C8FCEA07FEA2EBFFE0EBE7F8380FE0FEEBC07F6E7E141F00
+1F80D9800F1330A21670003F011F136001001380A216E04815C0007E1481020F13801583
+00FE903807870048EB03FE0038EB00F8263B7CB92B>I<D803E0017F14FE3D07F801FFE0
+03FFC03D0E3C0781F00F03E03D1C3E1E00F83C01F026383F38D9FC707F00304914E04A90
+387DC000007049EB7F8000604991C7FCA200E090C700FE1301485A017E5CA20000020114
+0301FE5F495CA203031407000160495C180F03075D1203494A011F13601980030F023F13
+E00007F000C0495C1901031F023E1380000F1803494A150061033F150E001FEF1E1C4991
+C7EA0FF80007C7000EEC03E043267EA449>109 D<D803E0137F3A07F801FFE03A0E3C07
+81F03A1C3E1E00F826383F387F00305B4A137C00705B00605BA200E090C712FC485A137E
+A20000140101FE5C5BA2150300015D5B15075E120349010F133016C0031F13700007ED80
+605B17E0EE00C0000F15014915801603EE0700001FEC0F0E49EB07FC0007C7EA01F02C26
+7EA432>I<EC1FC0ECFFF8903807E07E90380F801F90393F000F80017E14C04913074848
+14E0485A4848EB03F0120F5B121F48481307A2127F90C7FCA2150F5A4815E0A2151F16C0
+A248EC3F8016005D157E007E5C4A5A003E495A003F495A6C495A6C6C48C7FC3807E07E38
+01FFF038003F8024267DA428>I<90390F8003F090391FE00FFC903939F03C1F903A70F8
+700F80903AE0FDE007C09038C0FF80030013E00001491303018015F05CEA038113015CA2
+D800031407A25CA20107140FA24A14E0A2010F141F17C05CEE3F80131FEE7F004A137E16
+FE013F5C6E485A4B5A6E485A90397F700F80DA383FC7FC90387E1FFCEC07E001FEC9FCA2
+5BA21201A25BA21203A25B1207B512C0A32C3583A42A>I<14FF010313C090380F80F090
+383E00380178131C153C4913FC0001130113E0A33903F000F06D13007F3801FFE014FC14
+FF6C14806D13C0011F13E013039038003FF014071403001E1301127FA24814E0A348EB03
+C012F800E0EB07800070EB0F006C133E001E13F83807FFE0000190C7FC1E267CA427>
+115 D<EB01C0497E1307A4130F5CA3131F5CA3133F91C7FC007FB51280A2B6FCD8007EC7
+FCA313FE5BA312015BA312035BA312075BA3120FEBC006A2140E001F130CEB801C141814
+385C146014E0380F81C038078780D803FEC7FCEA00F819357EB31E>I<13F8D803FE1438
+D8070F147C000E6D13FC121C1218003814011230D8701F5C12601503EAE03F00C001005B
+5BD8007E1307A201FE5C5B150F1201495CA2151F120349EC80C0A2153F1681EE0180A2ED
+7F0303FF130012014A5B3A00F8079F0E90397C0E0F1C90393FFC07F8903907F001F02A26
+7EA430>I<01F8EB03C0D803FEEB07E0D8070F130F000E018013F0121C12180038140700
+301403D8701F130112601500D8E03F14E000C090C7FC5BEA007E16C013FE5B1501000115
+805B150316001203495B1506150E150C151C151815385D00015C6D485A6C6C485AD97E0F
+C7FCEB1FFEEB07F024267EA428>I<01F816F0D803FE9138E001F8D8070F903801F00300
+0ED9800314FC121C12180038020713010030EDE000D8701F167C1260030F143CD8E03F16
+3800C001005B5BD8007E131F183001FE5C5B033F1470000117604991C7FCA218E000034A
+14C049137E17011880170318005F03FE1306170E000101015C01F801BF5B3B00FC039F80
+70903A7E0F0FC0E0903A1FFC03FFC0902703F0007FC7FC36267EA43B>I<903907E001F0
+90391FF807FC9039783E0E0F9039E01F1C1FD801C09038383F803A03800FF07F0100EBE0
+FF5A000E4A1300000C157E021F133C001C4AC7FC1218A2C7123FA292C8FCA25CA2147EA2
+14FEA24A130CA20101141C001E1518003F5BD87F81143801835C00FF1560010714E03AFE
+0E7C01C0D87C1C495A2778383E0FC7FC391FF00FFC3907C003F029267EA42F>I<13F8D8
+03FE1470D8070F14F8000EEB8001121C121800381403003015F0EA701F1260013F130700
+E0010013E012C05BD8007E130F16C013FE5B151F000115805BA2153F000315005BA25D15
+7EA315FE5D1401000113033800F80790387C1FF8EB3FF9EB0FE1EB00035DA2000E1307D8
+3F805B007F495AA24A5A92C7FCEB003E007C5B00705B6C485A381E07C06CB4C8FCEA01FC
+25367EA429>I<D901E01360D90FF813E0496C13C090383FFE0190397FFF038090B5EA07
+009038F81FFF3901E003FE9038C0001C495B5DC85A4A5A4A5A4AC7FC140E5C5C14F0495A
+EB038049C8FC130E5B4913035B495B484813064848130E48C75AD80FFC137C391FFF81F8
+381E0FFFD838075B486C5B00605CD8E00190C7FC38C0007C23267DA427>I<13F8EA03FE
+EA070F000E1380121C121812381230EA701F1260133F00E0130012C05BEA007EA213FE5B
+1201A25B12035BA20007131813E01438000F133013C01470EB806014E014C01381EB8380
+38078700EA03FEEA00F815267EA41B>I<EC0F80EC3FE0ECF0F0903801C0F890380380FC
+14005B130E130C131CEB18011338013013F8A2EB0003A215F0A21407A215E0A2140FA215
+C0A2141FA21580A2143FA21500A25CA2147EA214FEA25CA21301001E5B123F387F83F0A2
+38FF87E0EB07C048485AD87C1FC7FCEA783EEA1FF8EA07E01E3681A420>I<1504151E15
+1FA2ED0F8016C0ED07E0007FB612F0B712F8A26C15F0C8EA1FC0ED3F00157E5D5D5D1560
+251271BB2A>126 D E /Fo 42 121 df<EA03C0EA07F0120F121F13F8A313F0EA07B0EA
+003013701360A213E013C01201EA038013005A120E5A5A5A5A5A0D197A8819>44
+D<387FFFF8A2B5FCA214F0150579941E>I<15181538157815F0140114031407EC0FE014
+1F147FEB03FF90383FEFC0148FEB1C1F13001580A2143FA21500A25CA2147EA214FEA25C
+A21301A25CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA291C7FC497EB612
+80A31D3877B72A>49 D<EC03F8EC0FFE91383C0F809138F007C0903901E003E0D903C013
+F09038078001020013F8130E131E90391C6000FCEB3870EC30011370A213F013E0EC7003
+0001016013F813C014E0ECC00701C114F0903881800F018314E09039C7001FC001FEEB3F
+80D80078140090C7127E5D4A5A4A5AEC07C0EC1F80023EC7FC14FCEB01F0EB07C0495A01
+1EC8FC137C4914C0484813015B485A4848130348C71380000E1407001E140F48EC1F00D8
+3FF85B397FFFC07E39783FFFFCEA700FD8F0075BD8E0015B6D13C0021FC7FC263A79B72A
+>I<EC03FCEC1FFF91387E07C09138F003E0903903C001F0D9078013F849C7FC131E011C
+14FC133CEB38C0EB78E0EB7060150101F014F813E0A2ECE003D971C013F090387F8007D9
+1E0013E090C7EA0FC0ED1F80ED3F00157E5D49B45A4913E092C7FC9038000FC0EC03F014
+016E7E81A381A5007E130100FE5CA31403485C00E05C14074A5A5D4A5A007049C7FC0078
+137E6C13F8381E07F03807FF80D801FCC8FC263A78B72A>I<EE01C01603A21607160FA2
+161F83163FA2167F16FF16EF150116CFED038FA2ED070FA2150E151E151C1538A203707F
+A2EDE007A2EC01C014031580EC0700A2140EA25CA25C027FB5FCA291B6FC9139E00007F8
+49481303A2495A130791C7FC5B130E5BA25B1378137013F0EA03F8486C4A7EB56C48B512
+F0A3343C7BBB3E>65 D<0107B612FCEFFF8018C0903B000FF0001FF04BEB07F81703021F
+15FC17014B14FEA2023F1400A24B1301A2147F18FC92C7120318F84A140718F04AEC0FE0
+EF1FC00101ED3F80EF7F004AEB01FEEE07F849B612E05F9139F80007F0EE01FC01076E7E
+177F4AEC3F80A2010F16C0171F5CA2131F173F5CA2133FEF7F805C1800017F5D4C5A91C7
+485A5F49140FEE1FE0494A5A00014AB45AB748C7FC16F816C037397BB83A>I<DB03FE13
+0E92393FFF801E92B5EAE03C913903FE01F0913A0FF000787CDA3FC0EB3CFC4AC7EA1FF8
+02FE140FEB03FC49481407494815F049481403495A5C49C813E05B485A5B000317C0485A
+A2485A1880485A94C7FCA2485AA3127F5BA312FF90CBFCA41738A217784816707E17F06C
+5E16015F16036C6C4A5A94C7FC001F150E6D141E000F5D6D5C6C6C495A6C6CEB03C0D801
+FEEB0F8027007F807EC8FC6DB45A010F13E0010090C9FC373D74BA3B>I<0107B8FCA390
+3A000FF000034BEB007F183E141F181E5DA2143FA25D181C147FA29238000380A24A1307
+18004A91C7FC5E13015E4A133E167E49B512FEA25EECF8000107147C163C4A1338A2010F
+147818E04A13701701011F16C016004A14031880013F150718004A5CA2017F151E173E91
+C8123C177C4915FC4C5A4914070001ED7FF0B8FCA25F38397BB838>69
+D<0107B712FEA3903A000FF000074B1300187C021F153CA25DA2143FA25D1838147FA292
+C8FCEE03804A130718004A91C7FCA201015CA24A131E163E010314FE91B5FC5EA2903807
+F800167C4A1378A2130FA24A1370A2011F14F0A24A90C8FCA2133FA25CA2137FA291CAFC
+A25BA25B487EB6FCA337397BB836>I<DB03FE130E92393FFF801E92B5EAE03C913903FE
+01F0913A0FF000787CDA3FC0EB3CFC4AC7EA1FF802FE140FEB03FC49481407494815F049
+481403495A5C49C813E05B485A5B000317C0485AA2485A1880485A94C7FCA2485AA3127F
+5BA312FF90CBFC0307B512E0A392390007FC00705A16075FA36C150F5FA36C6C141FA200
+1F5E6D143F6C7E167F6C6C4A5A6C6CEB03EFD801FEEB07C73A007FC03F0790273FFFFC03
+C7FC010F01F0C8FC01001380373D74BA40>I<0103B5D8F80FB512E0A390260007F8C738
+1FE0004B5DA2020F153F615DA2021F157F96C7FC5DA2023F5D605DA2027F14016092C7FC
+A24A1403605CA249B7FC60A202FCC712070103150F605CA20107151F605CA2010F153F60
+5CA2011F157F95C8FC5CA2013F5D5F5CA2017F14015F91C7FC491403007FD9FE01B512F8
+B55BA243397CB83E>I<0107B512FCA25E9026000FF8C7FC5D5D141FA25DA2143FA25DA2
+147FA292C8FCA25CA25CA21301A25CA21303A25CA21307A25CA2130F170C4A141CA2011F
+153C17384A1478A2013F157017F04A14E01601017F140317C091C71207160F49EC1F8016
+3F4914FF000102071300B8FCA25E2E397BB834>76 D<902603FFF891B512E0A281D90007
+923807F8006F6E5A61020F5E81DA0E7F5DA2021E6D1307033F92C7FC141C82DA3C1F5C70
+130EEC380FA202786D131E0307141C147082DAF003143C70133814E0150101016E137803
+0014705C8201036E13F0604A1480163F010715C1041F5B91C7FC17E149EC0FE360010E15
+F31607011E15FF95C8FC011C80A2013C805F1338160013785F01F8157CEA03FC267FFFE0
+143CB51538A243397CB83E>78 D<ED03FE92383FFFC09238FC07F0913903E001F891390F
+80007C023FC77E027E8002F815804948EC0FC0EB07E04948EC07E0131F4A15F049C81203
+137E01FE16F8485AA2485AA2485AA2120F5B001F16075B123FA34848ED0FF0A448C9EA1F
+E0A3EF3FC0A21880177F18005F5F16015F6C4B5A4C5AA24C5A6C4B5A6D4A5A001F93C7FC
+6D147E000F5D6C6CEB03F06C6C495A6C6CEB0F806C6C013FC8FC90383F01FC90381FFFE0
+010190C9FC353D74BA40>I<0107B612F817FF1880903B000FF0003FE04BEB0FF0EF03F8
+141FEF01FC5DA2023F15FEA25DA2147FEF03FC92C7FCA24A15F817074A15F0EF0FE01301
+EF1FC04AEC3F80EFFE0001034A5AEE0FF091B612C04CC7FCD907F8C9FCA25CA2130FA25C
+A2131FA25CA2133FA25CA2137FA291CAFCA25BA25B1201B512FCA337397BB838>I<9238
+3FC00E913901FFF01C020713FC91391FC07E3C91393F001F7C027CEB0FF84A1307494813
+03495A4948EB01F0A2495AA2011F15E091C7FCA34915C0A36E90C7FCA2806D7E14FCECFF
+806D13F015FE6D6D7E6D14E0010080023F7F14079138007FFC150F15031501A21500A216
+7C120EA3001E15FC5EA3003E4A5AA24B5AA2007F4A5A4B5A6D49C7FC6D133ED8F9F013FC
+39F8FC03F839F07FFFE0D8E01F138026C003FCC8FC2F3D7ABA2F>83
+D<0007B812E0A25AD9F800EB001F01C049EB07C0485AD900011403121E001C5C003C1780
+1403123800785C00701607140700F01700485CA2140FC792C7FC5DA2141FA25DA2143FA2
+5DA2147FA292C9FCA25CA25CA21301A25CA21303A25CA21307A25CA2130FA25CEB3FF000
+7FB512F8B6FCA2333971B83B>I<B500F8903803FFFEA218FCD803FEC8EA7FC049ED3F00
+0001163E173C17385FA25F16015F6D4A5AA200004BC7FC5E160E5EA25EA25E5EA26D495A
+7F4B5A150793C8FC150EA25D153C15385D1480013F5B14815DEC8380A20287C9FCA2148E
+149E149C14F8A26D5AA25C5CA25CA291CAFC131EA2373B6FB83E>86
+D<49B5D8F007B5FCA3D9000790C713E0DA03FCEC7F00187C020115786F5C4D5A02005D6F
+495A4DC7FC6F5BEE801E5F033F5BEEC0705F92381FC1C016E3EEE780DB0FEFC8FC16FE6F
+5A5EA2150382A2150782150F151CED3CFF5D4B7EDA01E07FEDC03FDA03807FEC0700020E
+131F021E805C4A130F0270805C49481307494880130749C71203011E81133E01FE81D807
+FF1407B500E090387FFFFC93B5FC6040397CB83E>88 D<14F8EB07FE90381F871C90383E
+03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F801403007F5C1300A214
+07485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F1300ECFF076C485B90
+38038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97 D<133FEA1FFFA3C67E13
+7EA313FE5BA312015BA312035BA31207EBE0F8EBE7FE9038EF0F80390FFC07C013F89038
+F003E013E0D81FC013F0A21380A2123F1300A214075A127EA2140F12FE4814E0A2141F15
+C05AEC3F80A215005C147E5C387801F8007C5B383C03E0383E07C0381E1F80D80FFEC7FC
+EA01F01C3B77B926>I<147F903803FFC090380FC1E090381F0070017E13784913383901
+F801F83803F003120713E0120FD81FC013F091C7FC485AA2127F90C8FCA35A5AA45AA315
+3015381578007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00380F81F83803FFE0C690
+C7FC1D2677A426>I<ED01F815FFA3150316F0A21507A216E0A2150FA216C0A2151FA216
+80A2153FA202F81300EB07FE90381F877F90383E03FF017C5BEBF80112013803F0004848
+5B120FEBC001121F5DEA3F801403127F01005BA214075A485CA2140FA248ECC1C0A2141F
+15C3ED8380143F1587007C017F1300ECFF076C485B9038038F8E391F0F079E3907FE03FC
+3901F000F0253B77B92A>I<147F903803FFC090380FC1E090383F00F0017E13785B485A
+485A485A120F4913F8001F14F0383F8001EC07E0EC1F80397F81FF00EBFFF891C7FC90C8
+FC5A5AA55AA21530007C14381578007E14F0003EEB01E0EC03C06CEB0F806CEB3E003807
+81F83803FFE0C690C7FC1D2677A426>I<ED07C0ED1FF0ED3E38ED7C3CEDF8FC15F91401
+15F1020313F8EDF0F0160014075DA4140F5DA4141F5D010FB512C05B16809039003F8000
+92C7FCA45C147EA414FE5CA413015CA413035CA413075CA4130F5CA3131F5CA391C8FC5B
+121CEA7E3EA2EAFE3C137C1378EAF8F01278EA3FC0EA0F80264C82BA19>I<EC07C0EC3F
+F09138FC38E0903901F01FF0EB03E0903807C00FEB0F80011F1307D93F0013E05B017E13
+0F13FE4914C01201151F1203491480A2153F1207491400A25DA249137EA215FEA25D0003
+1301140314076C6C485A0000131FEB787BEB3FF390380FC3F0EB00031407A25DA2140F5D
+121C007E131F5D00FE49C7FC147E5C387801F8387C07E0381FFF80D803FEC8FC24367CA4
+26>I<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C8FCA35B90387E07F0EC
+1FFCEC783E9038FFE01F02C01380EC800F1400485A16C05B49EB1F8012035BA2153F0007
+15005BA25D000F147E5B15FE5D121FD98001131C15F8163C003F01031338010013F0A216
+704814E0007E15F016E0EDE1C000FE903801E38048903800FF000038143C263B7BB92A>
+I<EB01C0EB07E014F0130F14E01307EB038090C7FCAB13F0EA03FCEA071EEA0E1F121CA2
+12385B1270A25BEAF07E12E013FEC65AA212015B1203A25B12075BA2000F13E013C013C1
+001F13C01381A2EB83801303EB0700A2130E6C5AEA07F8EA01E0143879B619>I<150E15
+3F157FA3157E151C1500ABEC1F80EC7FC0ECF1F0EB01C090380380F813071401130F130E
+131EEB1C03133C013813F0A2EB0007A215E0A2140FA215C0A2141FA21580A2143FA21500
+A25CA2147EA214FEA25CA21301A25CA213035C121C387E07E0A238FE0FC05C49C7FCEAF8
+3EEA787CEA3FF0EA0FC0204883B619>I<EB0FC0EA07FFA3EA001F1480A2133FA21400A2
+5BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA25BA212
+3FA290C7FCA25AA2EA7E0EA212FE131EEAFC1CA2133C133812F81378EA7870EA7CE0121F
+EA0F80123B79B915>108 D<D801E001FEEB07F03C07F803FF801FFC3C0E3C0F07C0783E
+3C1E3E3C03E1E01F261C1F78D9F3C013803C383FF001F7800F02E01400007801C013FE00
+7018C002805B4A4848EB1F80EAF07FD8E07E5CA200000207143F01FE1700495CA2030F5C
+0001177E495C18FE031F5C120349DA8001131C18F8033F153C00070403133849020013F0
+A24B1570000F17E049017E15F019E003FEECE1C0001FEE01E34949903800FF000007C700
+38143C3E2679A444>I<D801E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F
+787F39383FF00114E0007813C000708114804A485AEAF07FEAE07EA20000140701FE5C5B
+A2150F00015D5B151F5E12034990383F8380160316070007027F130049137EA2160E000F
+147C49141E161C5E001FEC3C7849EB1FE00007C7EA0780292679A42F>I<147F903803FF
+C090380FC1F090381F00F8017E137C5B4848137E4848133E0007143F5B120F485AA2485A
+157F127F90C7FCA215FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C000
+7EEB1F80003EEB3F00147E6C13F8380F83F03803FFC0C648C7FC202677A42A>I<903907
+8007C090391FE03FF090393CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE
+148013E05CEA01E113C15CA2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A
+131F5EEC80035E013F495A6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FE
+C9FCA25BA21201A25BA21203A25B1207B512C0A3293580A42A>I<3903C003F0390FF01F
+FC391E783C0F381C7C703A3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E
+90C7FCEAE0FE5BA2120012015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC12
+0E212679A423>114 D<14FE903807FF8090380F83C090383E00E04913F00178137001F8
+13F00001130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F
+13C01300143F141F140F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03
+E06CB45AD801FEC7FC1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B
+137E007FB5FCA2B6FC3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2
+143C003F1338EB0078147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F018
+3579B31C>I<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F00
+7815C01270013F131F00F0130000E015805BD8007E133FA201FE14005B5D120149137EA2
+15FE120349EBFC0EA20201131E161C15F813E0163CD9F003133814070001ECF07091381E
+F8F03A00F83C78E090393FF03FC090390FC00F00272679A42D>I<01F0130ED803FC133F
+D8071EEB7F80EA0E1F121C123C0038143F49131F0070140FA25BD8F07E140000E08013FE
+C6485B150E12015B151E0003141C5BA2153C000714385B5DA35DA24A5A140300035C6D48
+C7FC0001130E3800F83CEB7FF8EB0FC0212679A426>I<01F01507D803FC903903801F80
+D8071E903907C03FC0D80E1F130F121C123C0038021F131F49EC800F00701607A249133F
+D8F07E168000E0ED000313FEC64849130718000001147E5B03FE5B0003160E495BA2171E
+00070101141C01E05B173C1738A217781770020314F05F0003010713016D486C485A0001
+90391E7C07802800FC3C3E0FC7FC90393FF81FFE90390FE003F0322679A437>I<903907
+E007C090391FF81FF89039787C383C9038F03E703A01E01EE0FE3803C01F018013C0D807
+0014FC481480000E1570023F1300001E91C7FC121CA2C75AA2147EA214FEA25CA21301A2
+4A1370A2010314F016E0001C5B007E1401010714C000FEEC0380010F1307010EEB0F0039
+781CF81E9038387C3C393FF03FF03907C00FC027267CA427>I E
+/Fp 86 127 df<121C127FEAFF80B1EA7F00AF123EC7FCA8121C127FA2EAFF80A3EA7F00
+A2121C09346FB32C>33 D<003C131E007F137F481480A66C1400A6007E7FA6003E133EA3
+003C131E001C131C191977B32C>I<010F133C90381F807EA8013F13FE4A5AA4007FB612
+F0B712F8A4003F15F03A007E01F800A5EBFE0301FC5BA6003FB612F0B712F8A46C15F03A
+01F807E000A30003130F01F05BA86C486C5A25337DB22C>I<EB01C0497EA6EB0FFC9038
+7FFF8048B512E00007804880391FFBEFFC393FC3E1FE903803E07F007E80127C00FC1580
+12F8157FA300FCEC3F00A2007E91C7FC127FEA3FC313FBEA1FFF6C13FC6C13FF000114C0
+6C6C7F011F13F801037F14E7ECE1FEECE07F81001880007E1580150F12FFA312FE151F16
+00007E5C007F143ED83F8313FE9038C3E1FC391FFBEFF86CB55A6C5C6C5CC691C7FCEB1F
+F8EB03E0A66D5A21417BB92C>I<D807801307D81FE0EB0F80151F487E486C133F160000
+7C5CD8FCFC137EEAF87C15FE5D14015DA21403D8FCFC5BEA7CF8007F13075D383FF00FD8
+1FE05BA23807801FC75B143F92C7FCA25C147E14FE5CA213015CA213035C13075CA2130F
+5C131FEC800FED3FC0013FEB7FE0140049EBFFF0017E13F9A2D9FE0113F801FC13F0A212
+0113F8120313F015F90007010013F05B000F14FF49EB7FE0A20007EC3FC06C48EB0F0025
+417DB92C>I<EB0FC0EB3FE0497E497E80EA01F8EBF07C147E0003133E13E0A5147E147C
+9138FC3FF89039F0F87FFCEA01F1EBF3F001F7EB3FF89138E01F009038FFC03F6CEB803E
+A2EC007E49137C485A486C13FC00075CEBFF01D80FDF5B381F9F81383F8F8390380FC3E0
+387E07E75D38FC03F7EB01FF5D6D1410ED007C80A26CEBFF80D87E0113C0D87F03EBE0FC
+3A3F87F7F1F89038FFE3FF6C01C113F06C13806C9038007FC0D801FCEB1F8026357EB32C
+>I<EA0F80EA1FC0EA3FE013F0A213F8A2121F120F1200A4120113F0A2120313E01207EA
+0FC0121FEA3F80EA7F0012FE5A5A12700D1B71B22C>I<143814FC13011303EB07F8EB0F
+F0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A127EA3
+12FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F80EB1F
+C0EB0FF0EB07F8EB03FC130113001438164272B92C>I<127012FC7E7E6C7E6C7EEA0FE0
+6C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301A314FC13
+00AC130114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE485A485A48
+5A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EB0380497EA60020140800F8143E
+00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14E0000314806C140038007FFCA248
+B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB07C100FE13C000F8143E00201408
+00001400A66D5A1F247AAA2C>I<147814FCAF007FB612F0B712F8A46C15F0C700FCC7FC
+AF147825267DAB2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8
+A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E17718A2C>I<007FB6FCB712
+80A46C150021067B9B2C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B70
+8A2C>I<1507ED0F80151FA2153F16005D157E15FE5D14015D14035DA214075D140F5D14
+1F5D143F92C7FC5C147E14FE5CA213015C13035C13075C130F5C131F5CA2133F91C8FC5B
+137E13FE5B12015B12035B12075BA2120F5B121F5B123F90C9FC5A127E12FE5AA25A1278
+21417BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF03903F803F848486C
+7EEBE0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A3007C140700FC15E0
+AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C48
+5A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2
+133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E0
+1C3477B32C>I<EB0FF890387FFF8048B512E00007804814FC391FF80FFE393FE001FF90
+3880007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E123CC8FCA2150F16C0
+151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7FC495A495A495A
+EB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FCB7FCA36C15C023
+347CB32C>I<EB0FFC90387FFF8048B512E0000714F84880391FF807FEEBC0004848137F
+6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1FF890381FFFF0495BA2
+15F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA216E01507A2123C127EB4FC150F16
+C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C6C14E0C66C1380D90F
+FCC7FC23357CB32C>I<EC07F04A7E141F143FA2147EA214FCEB01F8A2EB03F0EB07E0A2
+EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B1207485AA2485A48C7FCA2127E5AB712
+FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E13F027347EB32C>I<000FB512
+FE4880A35D0180C8FCADEB83FE90389FFF8090B512E015F8819038FE03FE9038F000FF01
+C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127EB4FC150F16C0A248141F00
+7EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C000114C06C6C90C7FCEB0F
+F823347CB22C>I<EC3FC0903801FFF801077F011F7F497F90387FE07F9039FF003F8048
+48137FEA03F8485A5B000FEC3F004848131E4990C7FC123F90C9FCA25A127EEB03FE9038
+1FFF80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE9038C0007F49EB3F8090C712
+1F16C048140F16E01507A3127EA47E150F6D14C0001F141F6D1480000F143F6DEB7F0039
+07F801FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7FC23357CB32C>I<1278B712
+C016E0A316C000FCC7EA3F80ED7F0015FE00785CC712014A5A4A5A5D140F5D4A5A143F92
+C7FC5C147E14FE5C13015CA2495AA213075CA3495AA4495AA5133F91C8FCAA131E23357C
+B32C>I<EB07FC90383FFF8090B512E0000314F84880390FFC07FE391FF001FF9038C000
+7F4848EB3F8090C7121F4815C0007E140FA56CEC1F80A26C6CEB3F006D5B390FF001FE39
+03FC07F86CB55A6C6C13C0D907FCC7FC90387FFFC048B512F03903FC07F8390FF001FE39
+1FC0007F497F48C7EA1F80007EEC0FC0A248EC07E0A7007EEC0FC0A2007F141F6C6CEB3F
+806C6CEB7F009038F001FF390FFC07FE6CB55A6C5CC614E0013F1380D907FCC7FC23357C
+B32C>I<EB07FCEB3FFF90B512C0488048803907FC07F8390FF001FC48486C7ED83F8013
+7E157F48C77E007EEC1F8012FE5AED0FC0A416E0A37E127E007F141F7E6D133F6C6C137F
+390FF001FF3807FC0F6CB6FC6C14F76C14C7013F130FD90FF813C090C7FCA2151F168015
+3F1600000F5C486C137E486C13FE4A5A4A5A14079038801FF0391FE07FE090B55A6C91C7
+FC6C5B000113F838007FC023357CB32C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80
+EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F
+80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA0F80EA1FC0EA3FE0127F13F0
+A4123F121F120F1201120313E01207EA0FC0A2EA3F80EA7F005A5A12F812700C3071A32C
+>I<1507ED1F80153F15FF14034A1300EC1FFC4A5AECFFE0491380010790C7FCEB0FFCEB
+3FF8EB7FE048485A4890C8FCEA0FFEEA1FF8EA7FF0EAFFC05BA27FEA7FF0EA1FF8EA0FFE
+EA03FF6C13C06C6C7EEB3FF8EB0FFC6DB4FC01017F6D13E0EC3FF86E7EEC07FF6E138014
+00153F151FED0700212A7BAD2C>I<007FB612F0B712F8A4003F15F0CAFCA8003FB612F0
+B712F8A46C15F025147DA22C>I<127012FC7E6C7E13E06C7EEA1FFC6C7E3803FF80C67F
+EB7FF0EB1FF8EB0FFEEB03FF6D13C06D6C7EEC3FF8EC0FFC6EB4FC0201138080A25C0207
+1300EC0FFCEC3FF8EC7FE049485A4990C7FCEB0FFEEB1FF8EB7FF0EBFFC000035BD80FFE
+C8FC485AEA7FF0485A138048C9FC5A1270212A7BAD2C>I<14FE497EA4497FA214EFA213
+0781A214C7A2010F7FA314C390381F83F0A590383F01F8A490387E00FCA549137E90B512
+FEA34880A29038F8003FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C
+15FC497E27347EB32C>65 D<007FB512E015F8B612FE6C8016C03903F0003FED0FE0ED07
+F01503A2ED01F8A6ED03F0A21507ED0FE0ED1FC0EDFF8090B612005D5D15FF16C09039F0
+001FE0ED07F0ED03F81501ED00FCA216FE167EA616FE16FC1501ED03F8150FED3FF0007F
+B612E016C0B712806CECFE0015F027337FB22C>I<02FF13700107EBE0F84913F9013F13
+FD4913FFEBFF813901FE007F4848131FD807F0130F1507485A491303485A150148C7FCA2
+5A007EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C13036D14F0
+6C6C130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13F00100
+138025357DB32C>I<007FB5FCB612C015F0816C803907E003FEEC00FFED7F80153FED1F
+C0ED0FE0A2150716F0150316F81501A4ED00FCACED01F8A3150316F0A2150716E0150FED
+1FC0153FED7F80EDFF00EC03FE007FB55AB65A5D15C06C91C7FC26337EB22C>I<007FB6
+12F0B712F8A37E3903F00001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91
+C8FCA5163C167EA8007FB612FEB7FCA36C15FC27337EB22C>I<007FB612F8B712FCA37E
+D803F0C7FCA716781600A515F04A7EA490B5FCA5EBF001A46E5A92C7FCAD387FFFE0B5FC
+805C7E26337EB22C>I<903901FC038090390FFF87C04913EF017F13FF90B6FC48130738
+03FC01497E4848137F4848133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA2
+12FE5AA8913803FFF84A13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F12
+0F6D137F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC
+26357DB32C>I<007FB512F8B612FCA36C14F839000FC000B3B3A5007FB512F8B612FCA3
+6C14F81E3379B22C>73 D<0107B512804914C0A36D148090390003F000B3AF1218127EA2
+B4FCA24A5A48130F007F131F9038C07FC06CB55A6C91C7FC6C5B000313F838007FC02234
+7BB22C>I<D87FFCEB7FF8486CEBFFFCA36C48EB7FF8D807C0EB1F80153FED7F00157E5D
+4A5A14034A5A5D4A5A4A5A143F4AC7FC147E5CEBC1F813C3EBC7FCA2EBCFFEEBDFBEEBFF
+BF141F01FE7F496C7E13F86E7EEBF00301E07FEBC001816E7EA2157E153E153F811680ED
+0FC0A2ED07E0D87FFCEB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<D87FE0EB0FFC
+486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3A3EB9F01A2018F13E3A2
+1483A2018713C314C7A201831383A214EFA201811303A214FFEB80FEA3147C14381400AC
+D87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>77 D<D87FF0EB7FFC486CEBFFFE
+A27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C714C0A213C314E0A213C114
+F0A213C014F8A2147CA3143EA2141E141FA2140F1587A2140715C7A2140315E71401A215
+F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB22C>I<EB7FFF0003B512E0
+000F14F848804880EBE003EB800048C7127FA2007E80A300FE158048141FB3A86C143FA2
+007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C000314E0C66C90C7FC21357BB3
+2C>I<007FB512C0B612F88115FF6C15802603F00013C0153FED0FE0ED07F0A2150316F8
+1501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D15C001F0C8FCB0387F
+FF80B57EA36C5B25337EB22C>I<387FFFFCB67E15E015F86C803907E007FE1401EC007F
+6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E081819038E007FCEC01
+FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8EA01F029347E
+B22C>82 D<90381FF80790B5EA0F804814CF000714FF5A381FF01F383FC003497E48C7FC
+007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFCEBFFC06C13FC
+0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02001380153FED1FC0A2ED0FE0A2
+0078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90B55A5D00F914
+F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC007E007EA700
+78153CC71400B3AF90383FFFFCA2497F6D5BA227337EB22C>I<3B7FFF803FFFC0B56C48
+13E0A36C496C13C03B03F00001F800B3AF6D130300015DA26D130700005D6D130F017F49
+5A6D6C485AECE0FF6DB5C7FC6D5B010313F86D5B9038003F802B3480B22C>I<D87FFCEB
+7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F000715C0A36D131F00031580A36D
+133F00011500A36D5B0000147EA4017E5BA46D485AA490381F83F0A4010F5B14C7A30107
+5BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB22C>I<003FB612C04815E0A400
+7EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5AA24A5A4AC7
+FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB03C049EB07
+E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>90
+D<387FFFFCB512FEA314FC00FCC7FCB3B3B3B512FC14FEA36C13FC17416FB92C>I<1278
+12F87EA27E127E127F7E7F121F7F120F7F1207A27F12037F12017F12007F137E137F7F80
+131FA280130F801307801303801301801300A280147E147F8081141F81140F8114078114
+03A281140181140081157E157F811680151FA2150FED070021417BB92C>I<387FFFFCB5
+12FEA37EC7127EB3B3B3387FFFFEB5FCA36C13FC17417DB92C>I<130EEB3F80EBFFE000
+0313F8000F13FE487FD87FF113C0D8FFE013E0EB803F38FE000F007CEB07C00030EB0180
+1B0C78B22C>I<007FB6FCB71280A46C150021067B7D2C>I<137013F812011203EA07F0EA
+0FE0EA1FC01380EA3F00123E127E127CA212FC5AA4EAFF8013C013E0A2127FA2123FEA1F
+C0EA0F800D1B71B82C>I<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01
+FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC0
+90C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A00
+3FF007FC27247CA32C>I<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16
+809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D
+14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F8
+13F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FC
+EA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D
+133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<
+EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E
+497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807
+FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFF
+C0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F
+5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0
+130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023247CA3
+2C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA600
+7FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03
+F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A
+0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048
+B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E0
+4815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15
+FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F80107
+13C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6
+FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014
+0029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7E
+A2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC
+3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E133FB4
+14005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE0487EA3127F12
+01AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FE
+EBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E81
+1680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFFE0B57EA37E
+EA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1F
+F83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E0
+13C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D
+2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC0
+1F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I<
+EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E0180133F003F
+158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C
+6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA3
+2C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091
+380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07
+F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFF
+E0B57EA36C5B27367FA32C>I<903903FC078090391FFF0FC0017F13CF48B512EF4814FF
+3807FE07380FF00148487E49137F4848133F90C7FC48141F127E150F5AA87E007E141FA2
+6C143F7F6C6C137F6D13FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D130FEB07F890
+C7FCAD0203B5FC4A1480A36E140029367DA32C>I<D87FFEEB3FC0B53801FFF0020713F8
+021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007F
+B512E0B67EA36C5C26247EA32C>I<90387FF8700003B512F8120F5A5A387FC00F387E00
+034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F801
+0113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90
+B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C
+1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D
+13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A315
+1FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<
+3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B000014
+3EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075B
+A214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515
+806C16004A7ED807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214F7A201
+F113C700005D9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F5B9038
+1F007C29247FA32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D9038
+7E01F8013F5BEB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE
+130180903803EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C4913
+7E0001803A7FFF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB50081
+13FE148314816C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E
+013E137CA2013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB
+00FFA292C7FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F49
+5A387FFF806C90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0A4007EC7EA
+1FE0ED3FC0ED7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495A
+EB0FF0495A495A495A49C8FC4848EB01E04848EB03F0485A485A485A485A485AB7FCA46C
+15E024247DA32C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307
+EB1FE013FF007F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13
+FF6E1380141F14070200130021417BB92C>I<127812FCB3B3B3A9127806416DB92C>I<EA
+7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F
+147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F5BB55A49C8FC13F8EA7F
+C021417BB92C>I<01F81370D803FE13F8380FFF0148138748EBCFF0397F9FFFE0D8FF0F
+13C0D8FC07138039F803FE00387000F81D0A79B22C>I E /Fq 9
+85 df<903803FFF8011F13FF017F14C048B612F04881489038001FFCD80FF8EB03FE01E0
+13004848147F4980003F168090C8121FA2007EED0FC0A448ED07E0A9B8FCA500FCC81207
+B3A20078ED03C02B347AB237>65 D<007FB7FCB81280A3170000FCCAFCB3A2B712E082A3
+5E00FCCAFCAFB8FC1780A36C160029327AB134>69 D<007FB7FCB81280A3170000FCCAFC
+B3A2B712E082A35E00FCCAFCB3A2127829337AB134>I<0078177800FC17FCA26C16016C
+1603A26D1507A26D150FA26D151F6D153FA26D157F00FD167E6D15FE00FC16FC6D140101
+7FEC03F8A26D6CEB07F0011F15E06E130F010F15C06E131F010715806E133F6D6CEB7F00
+A26D6C13FE01005CECFE01027E5BEC7F0391383F87F0A291381FCFE0020F5B15FF6E5BA2
+6E90C7FCA26E5A6E5AA2157892C8FCA40078177836347AB242>77
+D<0078ED03C000FCED07E07E7E7FA27F7F7F7F7FEAFDFEEAFCFF6D7E133F6D7E6D7E806D
+7E6D7E6D7E6D7E80EC3F80EC1FC015E0EC0FF0EC07F8EC03FCEC01FE1400157FED3F8716
+C7ED1FE7ED0FF7ED07FF818181167F163FA2161F160F1607A60078ED03C02B347AB237>
+I<49B512C0011F14FC017F14FF48B712C0488248D980007FD80FF8C7EA0FF801E0140348
+486E7E491400003F8290C9127EA2007E82A448EE1F80B3A3007EEE3F00A3007F5E6C167E
+6D15FE6C6C4A5A01F014076CB4EC7FF86C90B65A6C5EC61680013F4AC7FC010314E03134
+7DB237>I<007FB67EB712F08216FE8200FCC700011380ED003FEE1FC0160FA2EE07E0AA
+EE0FC0A2161FEE3F80ED01FFB812005E16F85E168000FCCAFCB3A212782B337AB134>I<
+90B612FE000381120F5A485D01C0C9FC48CAFC127EA25AAC127EA2127FEA3FC090B612C0
+6C15F86C15FE000381C6168090C8FCEE1FC0160F17E01607A7160F17C0161FEEFF80007F
+B7FCB812005E16F86C15C02B327AB134>83 D<007FB712FEB9FCA36C16FEC7D807E0C7FC
+B3B3A96E5A303380B130>I E /Fr 7 85 df<903801FFFE011FEBFFE0017F14F848B612
+FE48814816804816C0EC8007D81FFCC713E0D83FF0EC3FF049141F49140F007F16F8A249
+1407A200FF16FCA290C81203A790B7FCA790C81203B2007EED01F8A22E347AB23A>65
+D<003FB712C05AB812E0A317C0A290CAFCB190B612F8A282A35EA290CAFCAC90B712C0A2
+17E0A36C16C07E2B327AB136>69 D<007EEF1F80A2B4EF3FC06D167FA26D16FF6D5DA26D
+5DA26D5D6D5DA26D5D6D5DA26E5CA26D6CECFFBF6E5B013F163F6D6CEB03FE16076D6C14
+FC6EEB0FF813076D6CEB1FF06E133F6D15E06D9038807FC0A291397FC0FF8015E1023F14
+0091381FF3FE15FF6E5B6E5BA26E5BA26E5B6E5BA26F5A6FC7FCA292C8FCA3007EEF1F80
+A23A347AB246>77 D<91387FFFF80107B67E013F15F090B712FC48824882481780489026
+E0001F13C049C71201D81FF89138007FE04848ED3FF049151F49150F007F17F8A2491507
+A200FF17FCA290C91203B16D1507A2007F17F86D150FA26C6CED1FF06D153FD81FFCEDFF
+E0D9FFC0130F6C90B712C06C17806C17006C5E6C6C15F8010F15C0010002FCC7FC36347E
+B23A>79 D<003FB612C04815FCB8FC178017C017E0A290C813F0161FEE0FF8A21607A916
+0FA2EE1FF016FF90B712E0A217C01780170016FC16C090CAFCB2127EA22D337AB136>I<
+017FB612800003B7FC000F16C05A5A17805A01E0C9FCEAFF80A290CAFCAB7FA2EA7FE090
+B612E06C15FEEEFF806C16C06C16E01203C66C15F090C8127FEE0FF8A21607A6160FA2EE
+7FF0003FB7FC4816E0B8FC17C017806CEDFE006C15E02D327AB136>83
+D<007FB81280A2B912C0A36C1780A2C7D807F8C8FCB3B3A66E5AA2323380B132>I
+E /Fs 49 123 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00
+FFFE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF0
+81F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938
+>11 D<913803FFC0027F13F00103B512FC010FEB00FED93FF8133FD97FE0EBFF8049485A
+5A1480484A13C04A6C1380A36F1300167E93C7FCA592383FFFC0B8FCA4000390C7FCB3AB
+B5D8FC3F13FFA4303A7EB935>I<EA0F80EA3FE0EA7FF0A2EAFFF8A213FCA3127FA2123F
+EA0F9CEA001C133C1338A31378137013F0EA01E0A2EA03C0EA0780EA0F005A121C12180E
+1D798C1B>44 D<141E143E14FE1307133FB5FCA313CFEA000FB3B3A6007FB61280A42137
+79B630>49 D<EB0FFC90387FFFC048B512F0000714FC390FF03FFF261F800F1380263F00
+0313C05AD9C00113E0486C6C13F07FA2ED7FF8A46C5A6C5A000FC7FCC8FCEDFFF0A216E0
+5C16C04A138016004A5A5D4A5A4A5A4A5AEC7F8092C7FC14FEEB01F849481378495A495A
+495A013EC712F84914F05B4848130148B6FCA25A5A5A5A4815E0B7FCA425377BB630>I<
+EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0FF001FC
+14F0121F7FA56C4814E0A23803F001C714C04A138016004A5A4A5AEC3FF090380FFFC092
+C7FC15F090380007FE913801FF806E13C016E0ED7FF016F816FC153FA216FEEA1FC0487E
+487E487EA416FCA249EB7FF8127F01C0EBFFF06C4814E06C6C4813C0260FFC0713806CB6
+1200000114FC6C6C13F0010790C7FC27387CB630>I<ED07C0150FA2151F153F157F15FF
+A25C5C5C5CA2141E5C147C5C5C495A495A1307495A5C131E5B137C5B5B485A485A120748
+5A90C7FC121E5A127C5AB81280A4C70001EBC000AA0103B61280A429377DB630>I<001C
+15C0D81F80130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA8EB07
+FE90383FFFE090B512F89038FC07FC9038E003FFD98001138090C713C0120EC813E0157F
+16F0A216F8A21206EA3F80EA7FE012FF7FA44914F0A26C4813FF90C713E0007C15C06C5B
+6C491380D9C0071300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25387BB630
+>I<EC0FF8ECFFFE0103EBFF8090390FF80FC090393FE003E090397FC001F09038FF000F
+48EC1FF84848133F485A120F5B121FA2003FEC1FF0ED0FE04990C7FC127FA21408EC7FF0
+39FFF1FFFC01F313FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914
+FEA5127FA5123F16FCA26C7E16F8000F143F6C6C14F0ED7FE06C6C14C03A01FF81FF806C
+90B51200013F13FC010F13F00101138027387CB630>I<123C123EEA3FE090B71280A417
+00485D5E5E5EA25E007CC7EA0FC000784A5A4BC7FC00F8147E48147C15FC4A5A4A5AC748
+5A5D140F4A5A143F92C8FC5C147E14FE1301A2495AA31307A2130F5CA2131FA5133FA96D
+5A6D5A6D5A293A7BB830>I<ED03E04B7EA24B7EA34B7EA24B7EA34B7EA292B57EA34A80
+15F302038015E1A202078015C0020F80ED807FA2021F80ED003F4A80023E131FA2027E80
+027C7F02FC814A7FA20101824A7F49B77EA3498202C0C7FC010F824A147FA2011F8291C8
+123F4982013E151FA2017E82017C8101FE83B500F80107B61280A4413A7DB948>65
+D<B812C017FC17FF18C028007FF000037F04007F717E717E171F84A2717EA74D5AA26017
+3F4D5A4D5A4C13C0040F5B91B600FCC7FCA2EFFF8002F0C713F0EF3FF8717E717E717E19
+807113C0A319E0A719C0A25F4D138019005FEF7FFE4C485AB912F018C095C7FC17F03B39
+7DB844>I<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F49
+01C0EB1FFFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9FC181F
+485A180F123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707A26C6C
+1780180F6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0EB0F
+E06D01FCEBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945>I<
+B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0A27113
+E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0FF
+E0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397DB8
+49>I<B912C0A43A007FF800039338007FE0171F170F1707A21703A21701A318F0EE7800
+A41800A216F8A21501150791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397D
+B83C>70 D<B612FCA439007FF800B3B3ADB612FCA41E397DB824>73
+D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F5F5E5EEE0FFE167FB8FC
+A431397DB839>76 D<B500FC0203B512F0A28080C66C6D90390003F0006F6E5A81017B7F
+13798101787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F826F13806F13C06F13
+E06F13F06F13F88117FCEE7FFEEE3FFF7013817013C17013E18218F17013F97013FDEF7F
+FF8383A28383838383187FA2183F181F01FC160FB500FC150718031801A244397DB84B>
+78 D<EDFFF8020FEBFF80027F14F0903A01FFC01FFC010790380007FFD91FFC010113C0
+D93FF06D6C7E49486E7E49486E7E48496E7E48834890C86C7EA248486F1380A248486F13
+C0A2003F18E0A348486F13F0A400FF18F8AC007F18F06D5DA3003F18E0A26D5D001F18C0
+A26C6C4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC49485A6DB401075B
+0107D9C01F90C7FC010190B512FC6D6C14F0020F1480020001F8C8FC3D3B7BB948>I<B8
+FC17F017FEEFFF8028007FF8000F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FF
+A818FEA2EF3FFCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B6
+12FCA438397DB841>I<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E71
+7EA2717EA284A760A24D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003F
+FCEE0FFF707F707F8284A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F13
+0394390FFF87C071EBFF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE0
+1E90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F14
+0090C8FC167E5A163EA27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C
+816C15F06C816C81C681133F010F801301D9000F1480EC007F030F13C01503818100F015
+7FA3163FA27E17807E167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B5
+12E0D8F83F5CD8F00749C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003
+D87FC09238007FC049161F007EC7150FA2007C1707A200781703A400F818E0481701A4C8
+92C7FCB3AE010FB7FCA43B387DB742>I<B600F00103B512E0A4C601F0C83807F0006E5E
+017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F147E6D167CA26F14FC6D5E6F
+13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F021F92C8FC815F6E143EEE80
+7E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F90C9FCA26F5AA36F
+5AA26F5AA26F5A433A7EB848>86 D<EB3FFE0003B512E0000F14F8391FF00FFE003FEB03
+FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F3901FFF87F0007
+1380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F263FF00713F83B1FFC1FBFFFC039
+0FFFFE1F0003EBF80F39003FE0032A257DA42E>97 D<13FFB5FCA412077EAF4AB47E020F
+13F0023F13FC9138FE03FFDAF00013804AEB7FC00280EB3FE091C713F0EE1FF8A217FC16
+0FA217FEAA17FCA3EE1FF8A217F06E133F6EEB7FE06E14C0903AFDF001FF80903AF8FC07
+FE009039F03FFFF8D9E00F13E0D9C00390C7FC2F3A7EB935>I<903801FFC0010F13FC01
+7F13FFD9FF8013802603FE0013C048485AEA0FF8121F13F0123F6E13804848EB7F00151C
+92C7FC12FFA9127FA27F123FED01E06C7E15036C6CEB07C06C6C14806C6C131FC69038C0
+7E006DB45A010F13F00101138023257DA42A>I<EE7F80ED7FFFA4150381AF903801FF81
+010F13F1013F13FD9038FFC07F0003EB001FD807FC1307000F8048487F5B123FA2485AA3
+12FFAA127FA27F123FA26C6C5B000F5C6C6C5B6C6C4913C02701FF80FD13FE39007FFFF9
+011F13E1010313012F3A7DB935>I<903803FF80011F13F0017F13FC3901FF83FE3A03FE
+007F804848133F484814C0001FEC1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA3
+01E0C8FCA4127FA36C7E1678121F6C6C14F86D14F000071403D801FFEB0FE06C9038C07F
+C06DB51200010F13FC010113E025257DA42C>I<EC1FF0903801FFFC010713FF90391FF8
+7F8090383FE0FFD9FFC113C0A2481381A24813016E1380A2ED3E0092C7FCA8B6FCA40003
+90C8FCB3ABB512FEA4223A7DB91D>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607
+FE07138F260FF801131F48486C138F003F15CF4990387FC7C0EEC000007F81A6003F5DA2
+6D13FF001F5D6C6C4890C7FC3907FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E
+123F7F6C7E90B512F8EDFF8016E06C15F86C816C815A001F81393FC0000F48C813804815
+7F5A163FA36C157F6C16006D5C6C6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C
+91C7FC010713F02B377DA530>I<13FFB5FCA412077EAFED7FC0913803FFF8020F13FE91
+381F03FFDA3C01138014784A7E4A14C05CA25CA291C7FCB3A3B5D8FC3F13FFA4303A7DB9
+35>I<EA01F0EA07FC487EA2487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9
+B512F8A4153B7DBA1B>I<141FEC7FC0ECFFE0A24913F0A56D13E0A2EC7FC0EC1F0091C7
+FCA9EC0FF0EB0FFFA4EB007F143FB3B0121FEA3F80EA7FC0EAFFE0EC7FE0A215C014FF6C
+481380903883FE006CB45A000F13F0000113801C4B86BA1D>I<13FFB5FCA412077EAF92
+380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7F
+E04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13
+F8A42D3A7EB932>I<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97FE0EB
+0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C009038
+87801F000749DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC
+1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F03FF
+DA3C011380000713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430257D
+A435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D7E48
+486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA26C6C
+495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>I<90
+39FF01FF80B5000F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7FE091
+C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEBFFC0
+DAF00313809139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F357E
+A435>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5CA291
+38807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114
+D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E
+7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE
+140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400
+38E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7
+FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425>
+I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90
+387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA3F00161E6E
+133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5C
+ECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D
+257EA432>I<B500F1B538803FFFA43D07FE000FF80003E06C6C010715C082028015076C
+6E6C148015076C01C0ED0F00826E485C017FED801E5D90273FF01E7F5B17C0DAF83E147C
+011F90393C3FE078037C14F8903B0FFC781FF0F0A29139FEF00FF10107EDF9E002FF14FB
+6D496CB45AA24B7E6D5EA26D496C90C7FCA292C7FC6E5CA2023E147C023C143C40257EA4
+45>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C485A6E48
+C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E903801
+F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7EB59038
+3FFFF8A42D257EA432>I<B539F001FFF8A4000390C7EA3F00161E6E133E6C153C6E137C
+6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC
+6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA292C8FCA25C141E003F
+133E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80D83FFFC9FCEA1FFCEA
+07F02D357EA432>I<003FB612C0A3D9F0031380EB800749481300003E5C003C495A007C
+133F5D0078495A14FF5D495B5BC6485B92C7FC495A131F5C495A017FEB03C0EBFFF014E0
+4813C05AEC80074813005A49EB0F80485A003F141F4848133F9038F001FFB7FCA322257D
+A42A>I E /Ft 13 117 df<041FB57E047F14E093B67EA24B81A24B81A34B81A34B81A3
+4B82A34B01FB8017F3A24B82A292B500E180A34A02E0805FA24A834D7EA24A834D7EA24A
+834C7FA24A84845E4A84845E4A84845E91B583A24C7F4985A24C7F4985A24C804985A293
+C87E4985A249496F80A349496F80A292BAFC4986A390BC7EA34887A34887A3480280C96C
+7FA2864891CA80A24A83481C80A24A83481CC0A24A83481CE0A24A83B51BF0A24A834A83
+6C497213E06C90CC001F13C05C647AE369>65 D<94383FFFF8040FB612E093B712FE0307
+EEFFC0033F17F092B912FC020318FF020F19C04A19E0147F91BBFC5B5B491AC05B499238
+FC003F49038013014902FCC8123F04F0150F90B600C003031380484B8193CAFC484A173F
+4B171F484AEF0F004B83484A94C7FCA2485CA25DA24891CDFCA35C5AA25CA4B5FCA25CAC
+0607B612F04E15F8A580A27EA480846C94C77E80A36C80A281A26C80A26C80816C80816C
+80826C816D14F016FC6DECFF806D03FC011FB5FC6D92B8FC7F7F7F7F80141F6E19F00203
+19C002001900033F17FC030717E003004CC7FC040F15E0DC003F01F8C8FC556A77E669>
+71 D<92B512C0021F14FC91B77E010716E0011F16F8017F8248B9FC48188019C0A2DBF0
+0F14E09126FE000314F002F87F02C06D14F86C5B49C87E5B4917FC49815B6C5A90C9FCA7
+043FB5FC033FB6FC0207B7FC147F0103B8FC130F013F15BF90B6EAC03F48ECFC004814F0
+000F14C04891C7FC5C485B485BA25CB5FCA25CA35FA26E91B5FCA25E6C6D5B806E130F6C
+6D5B03C0B6FC6C91B7FC17BF6C163F6C15FE6C15FC6C15F86C4B6C13F8013F14C06DDA00
+0713E0010701FC90C8FC010013E03E477CC44B>97 D<92383FFFE00207B6FC023F15C091
+B712F8010316FE49EEFF80011F17C04917E05B90B9FC5A5A9226FC007F13C04802E01307
+484A13014BEB007F4891C8123F4A151FF00F804849150395C7FCA2485BA45CB5FCB26C7F
+A4806C18C0F003E06E15076C170F6E151F6C6E147F6F903801FFF06C6E130F03FC90B5FC
+6C91B7FC7E7E7F6D17E06D17C0010717006D16FC010016F0023F1580020702FCC7FCDA00
+3F13803C477BC446>99 D<381FFF804813E05AB57EB3AB93380FFF80047F13F84BB512FE
+0307804B15C0033F15E04B15F092B7FC02F116F814F302F716FC16019139FFF8007F15E0
+4B6D13FE5D92C7FC835C5CA25CA45CB3B3A46C496E13FC7E6C0180020313F03F6478E350
+>104 D<381FFFC04813F05AB512F8AE6C13F0A2001F13C0C8FCAF380FFFC04813F05A48
+13F8B3B3B3A66C13F07E6C13C0156579E425>I<381FFF804813E05AB512F0B3B3B3B3B3
+A46C13E07E6C1380146478E325>108 D<93380FFF80D81FFF027F13F848D9C001B512FE
+48020780B56C4815C0033F15E04B15F092B7FC02E116F814E302E716FC16019139EFF800
+7FECFFE04B6D13FE5D92C7FC835C5CA25CA45CB3B3A46C496E13FC7E6C0180020313F03F
+4478C350>110 D<92381FFFE00203B6FC021F15E0027F15F849B712FE0107707E498349
+83017F17F890B97EA248DAFC00804802F0013F7F4802C0010F14804B7F4891C76C14C04A
+8048496E14E0A348496F13F0A34819F84A81A4B518FCB06C19F8A26E5DA36C19F06E92B5
+FCA36C6D4A14E06E5C6C6E4914C06F5B6C02F0013F148003FC90B6FC6C91B812006C606C
+606D5F6D5F6D5F010717806D94C7FC010016FC021F15E0020392C8FCDA001F13E046477C
+C44F>I<EE1FFC4BB512C0271FFF800F14F048D9E03F14FC4891B67EB500F16F7E02F782
+91B87E85A28585EDF01FDB8003804AC7FC02F8804A8283831A8083A3831AC0A383B05F1A
+80A35FA34D1400A25F616E5C6E91B55A6E5B6E01075CEDE03F92B75A61616196C7FC02F7
+15FC02F35D02F015E06F1480031F01FCC8FC030313C092CBFCB3A56C5B7E6C1380426078
+C350>I<EE1F80D81FFFECFFC048EBC003485CB5EAE01F5D5D92B5FC14E1A214E314E7A2
+14EF178091B5EAF00093C7FC15FC15F05D5D5D92C8FCA25C5CA25CA45CB3B06C5B7E6C13
+802A4478C335>114 D<91383FFFC00103B512FE011FECFFC04915F090B712FE48824817
+805A5A5AA248D9F00114009138C0001F4A130716014890C8FC83171E170E94C7FC8080A2
+14F014FEECFFF06CECFF8016F016FE6C8117C06C8217F86C826C826C826C7E6D16806D16
+C01307010116E0EB003F1401DA000F14F01500163F82A2001881003C81123E123F487E7F
+01F05C6D16E001FE5CD9FFC05BB5D8FC01B5FC91B712C0A21880A26C17006C5E000F5E00
+0316F0C65E011F158001034AC7FCD9001F13E034477CC43C>I<90380FFF804913E05B49
+7FB0001FB712F04816FC5AB87EA56C5EA2001F16F0C66C01F0C8FCB3B3A281A2170C173E
+6F137E6D4AB4FCEDFE0F92B6FC1880A27FA26D160017FC6D15F06D15C001004AC7FC6E13
+F0DA1FFEC8FC31577DD43A>I E /Fu 81 128 df<DA0FF813FC91397FFF07FF903B01F8
+07DF83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F0078048
+48010790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A333
+3B7FBA30>11 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007
+017E497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C49
+7E267FFFE0B512C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F
+903C07E001CFC00380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA2
+48485C03076E5A03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA48
+6C496C497E267FFFE0B500C1B51280A3413B7FBA45>14 D<133C137EA213FE1201EA03FC
+13F0EA07E0EA0FC0EA1F80EA1E005A5A5A12C00F0F6FB92A>19 D<1440EB03C0131F137F
+3803FE00EA1FF0EAFF8000FCC7FC12F01280120A7EA017>32 D<001C131C007F137F39FF
+80FF80A26D13C0A3007F137F001C131C00001300A40001130101801380A2000313030100
+1300485B00061306000E130E485B485B485B006013601A197DB92A>34
+D<141FEC7FC0903801F0E0903803C0600107137090380F803090381F00381518A25BA213
+3E133F15381530A215705D5D140190381F838092CAFC1487148E02DC49B51280EB0FF85C
+4A9039003FF8000107ED0FC06E5D71C7FC6E140E010F150CD91DFC141C01391518D970FE
+143801E015302601C07F1470D803805D00076D6C5BD80F00EBC00148011F5C4890380FE0
+03003E6E48C8FC007E903807F8060203130E00FE6E5A6E6C5A1400ED7F706C4B13036F5A
+6F7E6C6C6D6C5B7013066C6C496C130E6DD979FE5B281FF001F07F133C3C07F80FE03FC0
+F86CB539800FFFF0C69026FE000313C0D91FF0D9007FC7FC393E7DBB41>38
+D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A
+12600A1979B917>I<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA2
+12075B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F
+1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C0
+7E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480
+A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA248
+5A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<15301578B3A6007FB812F8B912
+FCA26C17F8C80078C8FCB3A6153036367BAF41>43 D<121C127FEAFF80A213C0A3127F12
+1C1200A412011380A2120313005A1206120E5A5A5A12600A19798817>I<B512FCA51605
+7F941C>I<121C127FEAFF80A5EA7F00121C0909798817>I<150C151E153EA2153C157CA2
+157815F8A215F01401A215E01403A215C01407A21580140FA215005CA2141E143EA2143C
+147CA2147814F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C13
+7CA2137813F8A25B1201A25B1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C12
+7CA2127812F8A25A12601F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E03901E0
+00F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A600FE15E0B3007E15
+C0A4007F141F6C1580A36C15006D5B000F143EA26C6C5B6C6C5B6C6C485A6C6C485A9038
+7E0FC0D91FFFC7FCEB03F8233A7DB72A>I<EB01C013031307131F13FFB5FCA2131F1200
+B3B3A8497E007FB512F0A31C3879B72A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000F
+F0000E6D7E486D7E486D7E123000706D7E126012FCB4EC7F807FA56CC7FC121CC8FCEDFF
+00A34A5A5D14035D4A5A5D140F4A5A4A5A92C7FC147C5C495A495A495A495A91C8FC011E
+EB01805B5B49130348481400485A485A000EC75A000FB6FC5A5A485CB6FCA321387CB72A
+>I<EB07F8EB3FFF4913C03901F80FF03903C007F848486C7E380E0001000F80381FE000
+6D7FA56C5A6C5AC85A1401A25D4A5AA24A5A5DEC0F80027EC7FCEB1FFCECFF809038000F
+E06E7EEC01FC816E7EED7F80A216C0A2153F16E0A2121EEA7F80487EA416C049137F007F
+1580007EC7FC0070ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FC
+EB0FF8233A7DB72A>I<1538A2157815F8A2140114031407A2140F141F141B1433147314
+6314C313011483EB030313071306130C131C131813301370136013C01201EA038013005A
+120E120C5A123812305A12E0B712F8A3C73803F800AB4A7E0103B512F8A325397EB82A>
+I<0006140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCABEB
+07F8EB3FFE9038780F803907E007E090388003F0496C7E12066E7EC87EA28181A21680A4
+123E127F487EA490C71300485C12E000605C12700030495A00385C6C1303001E495A6C6C
+485A3907E03F800001B5C7FC38007FFCEB1FE0213A7CB72A>I<EC3FC0903801FFF00107
+13FC90380FE03E90383F800790387E001F49EB3F804848137F485AA2485A000FEC3F0049
+131E001F91C7FCA2485AA3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C
+7E01607F01E0137E497FA249148016C0151FA290C713E0A57EA56C7E16C0A2121FED3F80
+7F000F15006C6C5B15FE6C6C5B6C6C485A3900FE07F090383FFFC06D90C7FCEB03FC233A
+7DB72A>I<12301238123E003FB612E0A316C05A168016000070C712060060140E5D1518
+00E01438485C5D5DC712014A5A92C7FC5C140E140C141C5CA25CA214F0495AA21303A25C
+1307A2130FA3495AA3133FA5137FA96DC8FC131E233B7BB82A>I<EB03F8EB1FFF017F13
+C09038FC07F03901E001F848486C7E4848137C90C77E48141E000E141F001E80A3121FA2
+7F5D01E0131E6C6C133E01FC133C6D5B6C6C6C5AECC1E06CEBF3C06C01FFC7FC6C5BEB3F
+FF6D13C081017F13F801F07F3903E07FFE3907801FFF48486C1380481303003E6D13C000
+3CEB007F007C143F0078EC0FE000F814075A1503A21501A36C15C012781503007C15806C
+EC07006C5C6C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC233A7DB72A
+>I<EB03F8EB1FFF017F13C09038FC07E03903F803F048486C7E48486C7E49137E121F48
+487FA2007F158090C7FCA248EC1FC0A616E0A56C143FA27F123F001F147FA26C6C13FF6C
+6C13DF000313013901F0039F3900FC0F1FD93FFC13C0EB07F090C7FC153F1680A316005D
+000F147E487E486C5BA24A5A4A5A49485A6C48485A001C495A260F807FC7FC3807FFFC00
+0113F038003FC0233A7DB72A>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF
+80A5EA7F00121C092479A317>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127F5A13
+80A4127F121D1201A412031300A25A1206A2120E5A121812385A1260093479A317>I<00
+7FB812F8B912FCA26C17F8CCFCAE007FB812F8B912FCA26C17F836167B9F41>61
+D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC18
+0FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F167FA20106
+810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D8
+0FFC02071380B56C90B512FEA3373C7DBB3E>65 D<B712E016FC16FF0001903980007FC0
+6C90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A4C5AEEFF8091B500
+FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18C0A7188017FFA24C
+13005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B>I<913A01FF8001
+80020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD9
+3F80EB00FF49C8127F01FE153F12014848151F4848150FA248481507A2485A1703123F5B
+007F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C
+6C150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF
+803FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C016F816FE00019039
+8001FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0
+A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE
+0FF0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FCA30001903880000F6C
+90C71201EE007E173E171E170EA31706A317078316C0A394C7FCA31501A21503150F91B5
+FCA3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2170F17
+3F177F486D903807FF00B9FCA333397DB839>I<B812F8A30001903880001F6C90C71201
+EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91B5FCA3
+EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013C0020F
+EBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948147F49
+48143F49C8121F485A4848150F48481507A248481503A2485A1701123F5B007F1600A448
+481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E6C7E6C
+6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191393FFF
+FC00020F01F0130002001380383D7CBA41>I<B648B512FEA30001902680000313006C90
+C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>I<B612C0A3
+C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512E0A39039001FFC00EC07
+F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C5C6C495A6C49C7FC3807
+81FC3801FFF038007F80233B7DB82B>I<B649B5FCA3000101809038007FF06C90C8EA3F
+80053EC7FC173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5AED0780030EC9FC5D153E
+157E15FF5C4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E14804A6C7E6F7EA26F7F
+707EA2707E707EA2707EA2707E707EA2707E707F8484486D497FB6011FEBFF80A339397D
+B841>I<B612E0A3000101C0C8FC6C90C9FCB3AD1718A517381730A31770A317F0A21601
+1603160FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807FFF86E5DA20001F0FC0026
+00DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC
+0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C1360A26E6C13C0A3913901
+FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC
+6D48497EB500C00203B512F8A2ED018045397DB84C>I<B5913807FFFE8080C69238007F
+E06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E
+7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED
+01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E486C153E
+487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF021F13E09138FE01FC9039
+01F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE6E7E48486E7E49157E00
+03167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17F0A3007F17F8491507A300
+FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6CED3FC0000717806D157F00
+0317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD907E0EB1F80D903F8017FC7
+FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<B712C016F816FE0001903980
+01FF806C90C7EA3FC0EE0FE0EE07F0EE03F817FC17FE1601A217FFA717FEA2EE03FCA2EE
+07F817F0EE0FE0EE3FC0923801FF0091B512FC16F091C9FCB3A5487FB6FCA330397DB839
+>I<B612FEEDFFE016F8000190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283
+A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE
+82707E707EA2161F83A583A6F00180A217F8160F1803486D01071400B66D6C5A04011306
+933800FE0ECAEA3FFCEF07F0393B7DB83D>82 D<D90FF813C090383FFE0190B512813903
+F807E33907E000F74848137F4848133F48C7121F003E140F007E1407A2007C140312FC15
+01A36C1400A37E6D14006C7E7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC68001
+3F1480010714C0EB007F020713E0EC007FED3FF0151F150FED07F8A200C01403A21501A3
+7EA216F07E15036C15E06C14076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E0
+3FFFF8010F13E0D8C00190C7FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001
+FE130348EE01F00078160000701770A300601730A400E01738481718A4C71600B3B09138
+07FF80011FB612E0A335397DB83C>I<B6903807FFFEA3000101809038007FE06C90C8EA
+1F80EF0F001706B3B2170E6D150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C49
+5A6D6CEB07806D6C49C7FC91387F807E91381FFFF8020713E09138007F80373B7DB83E>
+I<B500FC91387FFF80A30003018091380FFC006C90C8EA07E0715A6C705A6E1403017F93
+C7FCA280013F1506A26E140E011F150C80010F5DA28001075DA26E147001031560A26D6C
+5CA2806D4A5AA2ED8003027F91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A2
+6E6C5AA215FC02035BA2EDFEE002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E
+>I<B5D8FC07B5D8F001B5FCA30007902780001FFEC7EA1FF86C48C7D80FF8EC07E00001
+0307ED03C01B807F6C6F6C1500A26E5F017F6E6C1406A280013F4A6C5CA280011F4A6D5B
+EE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5BEE181FA26D6C6F5BEE300FA26D6C6F48
+5AEE6007A26D6C4CC7FC9338C003FCA203805D913B7F818001FE06A203C1150EDA3FC3C7
+EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFCEC3FF0A302075E4B141FA202035E4B14
+0FA202015E4B1407A2020093C8FC4B80503B7EB855>I<007FB590383FFFFCA3C601F801
+071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C1306160E
+6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D1403
+6E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03FE140C
+4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C6E
+7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E>I<B5
+00FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C140395C7
+FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383FE0015F91
+381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13B016E015
+7F6F5AB3A24B7E023FB512C0A33B397FB83E>I<3901800180000313033907000700000E
+130E485B0018131800381338003013300070137000601360A200E013E0485BA400CE13CE
+39FF80FF806D13C0A3007F137FA2393F803F80390E000E001A1974B92A>92
+D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A
+C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314
+01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007
+C026277DA52A>97 D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F
+809039F7000FC001FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16
+FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E9038
+00FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F8
+3907E001FC380FC003A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127F
+A26C14067F001F140E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381F
+FF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F
+9038F801EF3903F0007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA12
+7E127FA27EA26C6C131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90
+381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001
+F0D807E013F8380FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5
+127EA2127FA26C14037F001F14076C6C13060007140E6D131CD801F013386C6C13709038
+7E03E090381FFF80903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790
+383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8
+A31C3B7FBA19>I<ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903
+E007C03A07C003E010000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D
+48C7FC38073FFC38060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815
+C03A0F80007FE048C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0
+003F1407D80F80EB0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A
+>I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF7
+0013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0
+487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<
+EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C12
+7E00FF13F01303A214E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F0
+12FFA3120F1203B1913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E14
+38147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F
+811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3
+AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E0
+7E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2
+495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000
+FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C
+497EB500C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848
+137C48487F48487F4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9
+007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C
+13F890387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038
+F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016
+FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F0090
+38F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C09038
+1FFE0190387E07819038FC01C33903F000E3000714774848133749133F001F141F485A15
+0F48C7FCA312FEAA127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39
+007E078F90381FFE0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00
+FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300
+A45BB3A2487EB512F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F
+00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380
+EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1
+FFF038C03F801A277DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FC
+A2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220
+>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F00
+00EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538
+803FFEA33A0FF8000FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E
+017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7
+FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000F
+F86C48017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E
+9038EFC00C15C7A2D93F016D5A15830281EBF038D91F831430150102C3EBF87090260FC6
+001360A2D907E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100141E
+4A130E0260130C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7FC
+017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F804A
+7E8114CF903801C7E090380383F090380703F8EB0601496C7E011C137E49137F01787F49
+6D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8000F
+F06C48EB07C00003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2ECC0
+70010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430A2
+14701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC02735
+7EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1FC0
+EC3F800060137F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA248
+5A485A0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F247E
+A325>I<BD12C0A25202809653>124 D<001C131C007F137F39FF80FF80A5397F007F0000
+1C131C190978B72A>127 D E(cmmi10)cvn 9.96265 /Fn 1 fstore(cmsy10)cvn
+9.96265 /Fg 1 fstore(cmr10)cvn 9.96265 /Fu 1 fstore(cmmi7)cvn
+6.97385 /Ff 1 fstore end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 274 1
+274 0 bop 0 -149 a Fu(274)2470 b(TUGb)r(oat,)28 b(V)-7
+b(olume)27 b(18)g(\(1997\),)f(No.)i(4)p 0 22 1868 5 v
+0 320 5 299 v 239 221 a Ft(Graphics)i(Applications)p
+1863 320 V 0 325 1868 5 v 0 491 a Fs(Creating)i(3D)f(animations)f(with)
+i Fr(MET)n(AP)t(OST)166 624 y Fu(Denis)c(Ro)r(egel)0
+790 y Fs(Abstract)0 923 y Fq(MET)n(AP)t(OST)33 b Fu(can)e(b)r(e)h(used)
+g(to)f(create)g(animations.)48 b(W)-7 b(e)0 1022 y(sho)n(w)38
+b(here)g(an)g(example)h(of)f(animation)g(of)h(p)r(olyhedra,)0
+1122 y(in)n(tro)r(ducing)27 b(the)h Fp(3d)f Fu(pac)n(k)-5
+b(age.)0 1288 y Fs(In)m(tro)s(duction)0 1421 y Fq(MET)n(AP)t(OST)27
+b Fu(\(Hobb)n(y)f(\(1992\);)f(see)g(also)g(the)h(description)0
+1521 y(in)c(Go)r(ossens)f(et)14 b(al.)21 b(\(1997\)\))g(is)g(a)h(dra)n
+(wing)e(language)g(v)n(ery)0 1620 y(similar)37 b(to)h
+Fq(MET)n(AF)l(ONT)r Fu(,)j(but)e(whose)e(output)h(is)g(P)n(ost-)0
+1720 y(Script.)43 b Fq(MET)n(AP)t(OST)31 b Fu(is)f(esp)r(ecially)f
+(suited)h(for)f(geomet-)0 1819 y(rical)34 b(and)g(tec)n(hnical)h(dra)n
+(wings,)g(where)f(a)g(dra)n(wing)f(can)0 1919 y(naturally)24
+b(b)r(e)h(decomp)r(osed)g(in)g(sev)n(eral)e(parts,)i(related)f(in)0
+2019 y(some)19 b(logical)g(w)n(a)n(y)-7 b(.)33 b(Kn)n(uth)20
+b(is)g(using)h Fq(MET)n(AP)t(OST)g Fu(for)f(the)0 2118
+y(revisions)28 b(of)h(and)g(additions)g(to)g Fo(The)j(A)n(rt)e(Of)h
+(Computer)0 2218 y(Pr)l(o)l(gr)l(amming)40 b Fu(\(Kn)n(uth,)34
+b(1997\),)e(and)g(it)h(is)f(or)f(will)i(b)r(e)f(a)0 2318
+y(comp)r(onen)n(t)27 b(of)h(ev)n(ery)e(standard)h(T)1131
+2333 y(E)1177 2318 y(X)h(distribution.)166 2417 y(Unfortunately)-7
+b(,)46 b Fq(MET)n(AP)t(OST)e Fu(is)e(still)g(quite)h(bare)0
+2517 y(and)26 b(the)g(user)f(is)h(only)f(o\013ered)h(the)g(ra)n(w)e(p)r
+(o)n(w)n(er)13 b(|)h(a)25 b(little)0 2616 y(bit)40 b(lik)n(e)f(the)g(T)
+505 2632 y(E)552 2616 y(X)g(user)g(who)g(only)f(has)h(plain)g(T)1646
+2632 y(E)1693 2616 y(X)g(at)0 2716 y(his/her)c(disp)r(osal.)62
+b(The)37 b(lac)n(k)e(of)h(libraries)f(is)h(certainly)0
+2816 y(due)g(to)f(the)h(infancy)g(of)42 b Fq(MET)n(AP)t(OST)c
+Fu(\(whic)n(h)e(came)f(in)0 2915 y(the)41 b(public)f(domain)g(at)g(the)
+h(b)r(eginning)f(of)h(1995\))d(and)0 3015 y(th)n(us)28
+b(to)f(the)h(small)f(n)n(um)n(b)r(er)h(of)f(its)h(users.)166
+3115 y(In)45 b(this)g(pap)r(er,)k(w)n(e)44 b(presen)n(t)g(a)g(w)n(a)n
+(y)g(to)g(pro)r(duce)0 3214 y(animations)i(using)h Fq(MET)n(AP)t(OST)r
+Fu(.)94 b(The)47 b(tec)n(hnique)f(is)0 3314 y(quite)c(general)e(and)h
+(w)n(e)g(illustrate)g(it)g(through)g(the)h Fp(3d)0 3413
+y Fu(pac)n(k)-5 b(age.)0 3579 y Fs(Animations)0 3712
+y Fu(The)25 b(W)-7 b(orld)25 b(Wide)g(W)-7 b(eb)26 b(has)e(accustomed)g
+(us)h(to)g(v)-5 b(arious)0 3812 y(animations,)39 b(esp)r(ecially)e
+Fp(java)e Fu(animations.)65 b(Common)0 3912 y(comp)r(onen)n(ts)23
+b(of)h(w)n(eb)g(pages)e(are)h(animated)h(GIF)g(images.)166
+4011 y(Pro)r(ducing)37 b(animations)g(in)i Fq(MET)n(AP)t(OST)h
+Fu(is)e(actu-)0 4111 y(ally)46 b(quite)i(easy)-7 b(.)93
+b(A)48 b(n)n(um)n(b)r(er)e(of)h Fn(n)g Fu(images)f(will)h(b)r(e)0
+4210 y(computed)35 b(and)f(their)g(sequence)g(pro)r(duces)f(the)i
+(anima-)0 4310 y(tion.)83 b(The)43 b(animation)g(will)g(b)r(e)g
+(similar)f(to)h(a)g(mo)n(vie,)0 4410 y(with)28 b(no)g(in)n(teraction.)
+37 b(More)27 b(precisely)-7 b(,)27 b(if)i Fp(an_image\()p
+Fn(i)p Fp(\))0 4509 y Fu(pro)r(duces)d(a)h(picture)g(parameterized)e(b)
+n(y)i Fn(i)p Fu(,)f(it)i(su\016ces)e(to)0 4609 y(wrap)h(this)h(macro)e
+(b)r(et)n(w)n(een)i Fp(beginfig)c Fu(and)j Fp(endfig)p
+Fu(:)0 4739 y Fp(def)42 b(one_image_out\(exp)o(r)37 b(i\)=)87
+4838 y(beginfig\(<figure)g(number>\);)174 4938 y(an_image\(i\);)87
+5037 y(endfig;)0 5137 y(enddef;)0 5267 y Fu(and)27 b(to)h(lo)r(op)f(o)n
+(v)n(er)f Fp(one_image_out)p Fu(:)0 5396 y Fp(for)42
+b(j:=1)g(upto)g(100:one_image_out)o(\(j)o(\);e)o(nd)o(fo)o(r;)2183
+100 y Fu(Assuming)i(that)h Fp(<figure)c(number>)g Fu(is)j(equal)g(to)
+2017 199 y(the)30 b(parameter)d(of)i Fp(an_image)p Fu(,)d(the)k
+(compilation)e(of)h(this)2017 299 y(program)17 b(will)j(pro)r(duce)e(a)
+h(h)n(undred)g(\014les)g(with)g(extensions)2017 399 y
+Fp(.1)p Fu(,)27 b Fp(.2)p Fu(,)g(.)14 b(.)g(.)g(,)27
+b Fp(.100)p Fu(.)35 b(All)28 b(these)g(\014les)f(are)f(P)n(ostScript)h
+(\014les)2017 498 y(and)39 b(all)f(w)n(e)h(need)g(to)f(do)h(is)f(to)h
+(\014nd)g(a)f(w)n(a)n(y)g(to)g(collate)2017 598 y(them)33
+b(in)e(one)h(piece.)48 b(Ho)n(w)31 b(to)h(do)f(this)h(dep)r(ends)g(on)f
+(the)2017 697 y(op)r(erating)i(system.)55 b(On)33 b(UNIX)i(for)e
+(instance,)i(one)e(can)2017 797 y(use)26 b Fp(Ghostscript)21
+b Fu(to)k(transform)g(a)g(P)n(ostScript)f(\014le)i(in)n(to)2017
+897 y Fp(ppm)g Fu(and)g(then)i(transform)d(eac)n(h)h
+Fp(ppm)g Fu(\014le)g(in)n(to)h(GIF)g(with)2017 996 y
+Fp(ppmtogif)p Fu(.)46 b(These)31 b(programs)f(are)g(part)h(of)h(the)g
+Fp(NETPBM)2017 1096 y Fu(pac)n(k)-5 b(age)30 b(\(Da)n(vidsen,)h
+(1993\).)44 b(Finally)-7 b(,)32 b(a)e(program)f(suc)n(h)2017
+1196 y(as)46 b Fp(gifmerge)c Fu(\(M)r(\177)-44 b(uller,)51
+b(1996\))44 b(creates)g(an)i(animated)2017 1295 y(GIF)c(\014le)g
+(\(GIF89A\))g(out)g(of)f(the)h(h)n(undred)f(individual)2017
+1395 y(simple)19 b(GIFs.)34 b(Ho)n(w)n(ev)n(er,)19 b(v)-5
+b(arious)17 b(details)h(m)n(ust)h(b)r(e)g(tak)n(en)2017
+1494 y(care)27 b(of.)38 b(F)-7 b(or)27 b(instance,)h(only)f(a)h(part)f
+(of)34 b Fp(Ghostscript)p Fu('s)2017 1594 y(output)40
+b(is)e(needed)h(and)g(selection)f(can)g(b)r(e)h(made)g(with)2017
+1694 y Fp(pnmcut)p Fu(.)2183 1793 y(The)47 b(whole)f(pro)r(cess)g(of)g
+(creating)g(an)g(animation)2017 1893 y(out)30 b(of)36
+b Fq(MET)n(AP)t(OST)r Fu('s)30 b(outputs)g(can)f(b)r(e)h(summed)g(up)g
+(in)2017 1993 y(a)41 b(shell)g(script,)i(similar)d(to)h(the)g(one)f(in)
+h(\014gure)f(1.)76 b(As)2017 2092 y(w)n(e)32 b(will)f(see,)h(this)g
+(script)g(\(including)f(the)h(argumen)n(ts)f(of)2017
+2192 y Fp(awk)23 b Fu(and)g Fp(pnmcut)p Fu(\))f(can)h(b)r(e)h
+(generated)e(automatically)h(b)n(y)2017 2291 y Fq(MET)n(AP)t(OST)30
+b Fu(itself.)2017 2457 y Fs(Ob)5 b(jects)32 b(in)g(space)2017
+2590 y(In)m(tro)s(duction)45 b Fu(The)30 b(author)f(applied)h(this)g
+(idea)g(to)g(the)2017 2690 y(animation)36 b(of)f(ob)5
+b(jects)36 b(in)g(space.)60 b(The)36 b(macros)e(in)i(the)2017
+2790 y Fp(3d.mp)31 b Fu(pac)n(k)-5 b(age)2551 2759 y
+Fm(1)2620 2790 y Fu(pro)n(vide)32 b(a)g(basis)h(for)f(the)i(represen)n
+(ta-)2017 2889 y(tion)i(of)f(three-dimensional)g(ob)5
+b(jects.)60 b(The)35 b(basic)g(com-)2017 2989 y(p)r(onen)n(ts)26
+b(of)g(the)g(ob)5 b(jects)25 b(are)g(the)h(p)r(oin)n(ts)g(or)f(the)h(v)
+n(ectors.)2017 3088 y(Both)h(are)f(stored)g(as)h(triplets.)37
+b(More)26 b(precisely)-7 b(,)26 b(w)n(e)h(ha)n(v)n(e)2017
+3188 y(three)h(arra)n(ys)2455 3158 y Fm(2)2517 3188 y
+Fu(of)g(t)n(yp)r(e)f Fp(numeric)p Fu(:)2017 3331 y Fp(numeric)41
+b(vect[]x,vect[]y,v)o(ec)o(t[)o(]z;)2183 3474 y Fu(V)-7
+b(ector)30 b Fn(i)p Fu('s)g(comp)r(onen)n(ts)f(are)g
+Fp(vect[)p Fn(i)p Fp(]x)p Fu(,)f Fp(vect[)p Fn(i)p Fp(]y)2017
+3573 y Fu(and)34 b Fp(vect[)p Fn(i)p Fp(]z)p Fu(.)51
+b(It)33 b(is)h(then)g(straigh)n(tforw)n(ard)c(to)j(de\014ne)2017
+3673 y(the)j(usual)f(op)r(erations)e(on)i(v)n(ectors)f(using)h(this)g
+(con)n(v)n(en-)2017 3772 y(tion.)i(F)-7 b(or)27 b(instance,)h(v)n
+(ector)e(addition)i(is)f(de\014ned)h(as:)2017 3915 y
+Fp(def)43 b(vect_sum\(expr)38 b(k,i,j\)=)2105 4015 y(vect[k]x:=vect[)o
+(i]x)o(+v)o(ect)o([j)o(]x)o(;)2105 4115 y(vect[k]y:=vect[)o(i]y)o(+v)o
+(ect)o([j)o(]y)o(;)2105 4214 y(vect[k]z:=vect[)o(i]z)o(+v)o(ect)o([j)o
+(]z)o(;)2017 4314 y(enddef;)p 2017 4451 748 4 v 2124
+4505 a Fl(1)2178 4529 y Fk(On)27 b(CT)-6 b(AN,)26 b(under)h
+Fj(graphics/metapost/macr)q(os/)q(3d)p Fk(.)47 b(The)2017
+4607 y(co)r(de)30 b(is)d(do)r(cumen)n(ted)i(with)f Fj(MFT)h
+Fk(\(Kn)n(uth,)h(1989\))g(and)e(illustrated)2017 4686
+y(with)33 b Fi(MET)n(AP)s(OST)r Fk(.)53 b(This)32 b(pap)r(er)g(describ)
+r(es)h(v)n(ersion)f(1.0)g(of)f(the)2017 4765 y(macros.)2124
+4821 y Fl(2)2178 4844 y Fi(MET)n(AP)s(OST)h Fk(has)h(a)g(few)f(simple)f
+(t)n(yp)r(es)j(suc)n(h)f(as)g Fj(numeric)p Fk(,)2017
+4923 y Fj(boolean)p Fk(,)41 b Fj(string)p Fk(,)f Fj(path)p
+Fk(,)g(.)11 b(.)g(.)h(.)67 b(It)37 b(also)f(has)g(pairs)f(\()p
+Fj(pair)p Fk(\))j(and)2017 5002 y(triples)32 b(\()p Fj(color)p
+Fk(\).)60 b(W)-6 b(e)34 b(migh)n(t)d(ha)n(v)n(e)j(c)n(heated)h(and)e
+(stored)g(p)r(oin)n(ts)2017 5081 y(as)27 b(colors,)f(but)h(instead,)h
+(w)n(e)f(found)f(it)h(in)n(teresting)g(to)g(illustrate)f(a)2017
+5160 y(construction)21 b(equiv)l(alen)n(t)f(to)f Fh(P)-6
+b(ascal)p Fk('s)19 b(records)f(or)g(C's)g(structures.)2017
+5239 y(In)44 b Fi(MET)n(AP)s(OST)r Fk(,)i(instead)e(of)f(ha)n(ving)h(a)
+g(list)f(or)g(an)g(arra)n(y)h(of)2017 5318 y(structures,)37
+b(w)n(e)d(use)g(sev)n(eral)g(lists)f(or)g(arra)n(ys,)j(so)d(that)i(a)f
+(record)2017 5396 y(is)23 b(a)h(cross-section)g(o)n(v)n(er)g(sev)n
+(eral)g(arra)n(ys.)p eop
+%%Page: 275 2
+275 1 bop 0 -149 a Fu(TUGb)r(oat,)28 b(V)-7 b(olume)28
+b(18)e(\(1997\),)h(No.)g(4)2471 b(275)0 74 y Fp(#!)43
+b(/bin/sh)0 274 y(/bin/rm)e(-f)h(animpoly.log)0 373 y(for)g(i)i(in)e
+(`ls)h(animpoly.*|)c(grep)j('animpoly.[0-9])o('`;)o(do)0
+473 y(echo)g($i)0 572 y(echo)g('==============')0 672
+y(#)h(shift)f(each)g(picture)e(so)j(that)f(it)h(lies)f(in)g(the)h
+(page:)0 772 y(awk)86 b(<)43 b($i)g('{print})d(/^\045\045Page:)g
+(/{print)h("172)h(153)g(translate\\n"}')c(>)43 b($i.ps)0
+871 y(#)g(produce)e(ppm)h(format:)0 971 y(gs)h(-sDEVICE=ppmraw)37
+b(-sPAPERSIZE=a4)h(-dNOPAUSE)i(-r36)i(-sOutputFile=$i.)o(pp)o(m)37
+b(-q)43 b(--)g($i.ps)0 1071 y(/bin/rm)e(-f)h($i.ps)0
+1170 y(#)h(produce)e(gif:)0 1270 y(ppmquant)f(32)j($i.ppm)e(|)i(pnmcut)
+e(15)i(99)g(141)f(307)h(|)g(ppmtogif)d(>)j(`expr)f($i.ppm)f(:)i
+('\\\(.*\\\)ppm'`gif)0 1369 y(/bin/rm)e(-f)h($i.ppm)0
+1469 y(done)0 1569 y(/bin/rm)f(-f)h(animpoly.gif)0 1668
+y(#)h(merge)f(the)g(gif)g(files:)0 1768 y(gifmerge)e(-10)j(-l1000)e
+(animpoly.*.gif)d(>)43 b(animpoly.gif)0 1868 y(/bin/rm)e(-f)h
+(animpoly.*.gif)574 2075 y Fs(Figure)31 b(1)p Fu(:)37
+b(Script)28 b(created)e(b)n(y)j Fq(MET)n(AP)t(OST)g Fu(\(with)g(some)e
+(additional)g(commen)n(ts\))166 2345 y(Often,)h(w)n(e)f(need)h(some)f
+(scratc)n(h)f(v)n(ectors)g(or)h(v)n(ectors)0 2445 y(lo)r(cal)j(to)g(a)g
+(macro.)43 b(A)31 b(simple)f(v)n(ector)f(allo)r(cation)h(mec)n(h-)0
+2544 y(anism)d(solv)n(es)f(the)h(problem:)36 b(w)n(e)27
+b(use)g(a)g(stac)n(k)f(of)i(v)n(ectors)0 2644 y(and)k(w)n(e)g(reserv)n
+(e)f(and)h(free)h(v)n(ectors)d(only)j(on)f(top)g(of)h(the)0
+2743 y(stac)n(k.)76 b(F)-7 b(or)40 b(instance,)k(the)d(allo)r(cation)f
+(of)g(a)h(v)n(ector)e(is)0 2843 y(de\014ned)28 b(b)n(y:)0
+2981 y Fp(def)42 b(new_vect=incr\(las)o(t_)o(vec)o(t_)o(\))c(enddef;)0
+3118 y Fu(where)i Fp(last_vect_)d Fu(is)k(the)g(index)g(of)g(the)g(top)
+g(of)g(the)0 3218 y(stac)n(k.)49 b(Hence,)33 b(a)f(v)n(ector)e(is)i
+(manipulated)g(b)n(y)g(its)g(index)0 3317 y(on)h(the)h(stac)n(k.)53
+b(W)-7 b(riting)33 b Fp(v:=new_vect;)c Fu(lets)k Fp(v)g
+Fu(b)r(e)h(the)0 3417 y(index)28 b(of)f(the)h(newly)g(allo)r(cated)f(v)
+n(ector.)166 3517 y(F)-7 b(reeing)23 b(a)g(v)n(ector)g(is)g(also)g
+(easy)f(and)i(is)f(only)g(allo)n(w)n(ed)0 3616 y(at)k(the)h(top)g(of)g
+(the)g(stac)n(k:)0 3754 y Fp(def)42 b(free_vect\(expr)c(i\)=)87
+3853 y(if)43 b(i=last_vect_:)218 3953 y(last_vect_:=last)o(_v)o(ect)o
+(_-)o(1;)87 4053 y(else:)f(errmessage\("Vec)o(tor)37
+b(")43 b(&)218 4152 y(decimal)e(i)i(&)g(")g(can't)f(be)g(freed!"\);)87
+4252 y(fi;)0 4352 y(enddef;)166 4489 y Fu(Ho)n(w)30 b(these)h(macros)d
+(are)i(used)g(is)h(made)f(explicit)h(in)0 4589 y(the)f
+Fp(vect_rotate)c Fu(macro)j(whic)n(h)h(do)r(es)g(a)f(rotation)g(of)h(a)
+0 4688 y(v)n(ector)j Fp(v)g Fu(around)g(a)h(v)n(ector)e
+Fp(axis)h Fu(b)n(y)g(an)h(angle)f Fp(alpha)p Fu(.)0 4788
+y(This)20 b(rotation)f(is)h(illustrated)g(in)h(\014gure)e(2.)31
+b Fn(~)-39 b(v)23 b Fu(is)d(written)h(as)0 4888 y(the)i(sum)g(of)393
+4866 y Fn(~)398 4888 y(h)g Fu(and)17 b Fn(~)-37 b(a)23
+b Fu(where)922 4866 y Fn(~)927 4888 y(h)g Fg(?)17 b Fn(~)-36
+b(a)o Fu(.)36 b(If)1256 4866 y Fn(~)1266 4888 y(b)22
+b Fu(is)1403 4841 y Fg(\000)-27 b(\000)g(!)1403 4888
+y Fn(axis=)p Fg(k)1646 4841 y(\000)f(\000)g(!)1646 4888
+y Fn(axis)n Fg(k)p Fu(,)-5 4998 y Fn(~)-37 b(c)28 b Fu(is)g(computed)h
+(as)f(the)g(v)n(ector)f(pro)r(duct)i(of)1427 4976 y Fn(~)1436
+4998 y(b)f Fu(and)23 b Fn(~)-37 b(a)28 b Fu(and)-5 5098
+y Fn(~)-37 b(a)28 b Fu(is)f(then)h(rotated)f(in)h(a)f(simple)h(w)n(a)n
+(y)e(resulting)h(in)1678 5076 y Fn(~)1667 5098 y(f)9
+b Fu(.)166 5197 y(The)34 b(v)n(ectors)f(declared)g(with)i
+Fp(new_vect)c Fu(are)i(freed)0 5297 y(in)21 b(the)f(in)n(v)n(erse)f
+(order.)34 b(The)20 b Fp(vect_rotate)c Fu(macro)j(mak)n(es)0
+5396 y(use)29 b(of)h(a)f(few)h(other)f(macros:)40 b Fp(vect_mod)26
+b Fu(computes)k(the)2017 2345 y(mo)r(dulus)38 b(of)e(a)h(v)n(ector;)j
+Fp(vect_dprod\(a,b\))31 b Fu(is)36 b(the)i(dot)2017 2445
+y(pro)r(duct)28 b(of)g(v)n(ectors)f Fp(a)g Fu(and)h Fp(b)p
+Fu(;)g Fp(vect_mult\(b,a,x\))21 b Fu(lets)2017 2544 y(v)n(ector)45
+b Fp(b)h Fu(equal)f(v)n(ector)g Fp(a)g Fu(m)n(ultiplied)i(b)n(y)f(the)g
+(scalar)2017 2644 y Fp(x)p Fu(;)35 b Fp(vect_sum)29 b
+Fu(and)j Fp(vect_diff)d Fu(compute)j(as)g(their)g(\014rst)2017
+2743 y(argumen)n(t)24 b(the)i(sum)f(or)g(the)g(di\013erence)g(of)g(the)
+h(t)n(w)n(o)e(other)2017 2843 y(v)n(ectors;)34 b Fp(vect_prod\(c,a,b)o
+(\))26 b Fu(lets)33 b(v)n(ector)d Fp(c)i Fu(equal)g(the)2017
+2943 y(v)n(ectorial)c(pro)r(duct)g(of)h(v)n(ectors)e
+Fp(a)i Fu(and)f Fp(b)p Fu(.)41 b(These)28 b(macros)2017
+3042 y(are)f(describ)r(ed)g(in)h(app)r(endix)g(A.)2017
+3223 y Fp(vardef)42 b(vect_rotate\(exp)o(r)c(v,axis,alpha\)=)2105
+3323 y(save)k(v_a,v_b,v_c,v_d)o(,v_)o(e,)o(v_)o(f;)2105
+3422 y(v_a:=new_vect;v)o(_b:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3522 y(v_c:=new_vect;v)o(_d:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3622 y(v_e:=new_vect;v)o(_f:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3721 y(v_g:=new_vect;v)o(_h:)o(=n)o(ew_)o(ve)o(ct)o(;)2105
+3821 y(vect_mult\(v_b,a)o(xis)o(,1)o(/ve)o(ct)o(_m)o(od\()o(ax)o(is\))o
+(\);)2105 3920 y(vect_mult\(v_h,v)o(_b,)o(ve)o(ct_)o(dp)o(ro)o(d\(v)o
+(_b)o(,v\))o(\);)2105 4020 y(vect_diff\(v_a,v)o(,v_)o(h\))o(;)2105
+4120 y(vect_prod\(v_c,v)o(_b,)o(v_)o(a\);)2105 4219 y(vect_mult\(v_d,v)
+o(_a,)o(co)o(sd\()o(al)o(ph)o(a\)\))o(;)2105 4319 y(vect_mult\(v_e,v)o
+(_c,)o(si)o(nd\()o(al)o(ph)o(a\)\))o(;)2105 4419 y(vect_sum\(v_f,v_)o
+(d,v)o(_e)o(\);)2105 4518 y(vect_sum\(v,v_f,)o(v_h)o(\);)2105
+4618 y(free_vect\(v_h\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(g\);)2105
+4717 y(free_vect\(v_f\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(e\);)2105
+4817 y(free_vect\(v_d\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(c\);)2105
+4917 y(free_vect\(v_b\);)o(fre)o(e_)o(vec)o(t\()o(v_)o(a\);)2017
+5016 y(enddef;)2183 5197 y Fu(The)35 b Fp(3d)f Fu(pac)n(k)-5
+b(age)33 b(de\014nes)i(other)f(macros)f(in)i(order)2017
+5297 y(to)30 b(set)h(the)f(observ)n(er,)f(to)h(compute)g(a)g(reference)
+f(matrix,)2017 5396 y(etc.)37 b(Pro)n(vision)26 b(is)h(giv)n(en)g(for)g
+(manipulating)g(ob)5 b(jects.)p eop
+%%Page: 276 3
+276 2 bop 0 -149 a Fu(276)2470 b(TUGb)r(oat,)28 b(V)-7
+b(olume)27 b(18)g(\(1997\),)f(No.)i(4)850 883 y @beginspecial
+-23 @llx -6 @lly 112 @urx 86 @ury 1350 @rwi @setspecial
+%%BeginDocument: vect-fig.9
+%*Font: cmmi10 9.96265 9.96265 61:81802504
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+111.6626 19.68887 lineto stroke
+newpath 107.90381 18.32079 moveto
+111.6626 19.68887 lineto
+107.66257 19.68886 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 38.19089 lineto stroke
+newpath 52.97243 35.39383 moveto
+55.8313 38.19089 lineto
+52.18819 36.54028 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 28.34645 moveto
+55.8313 38.19089 lineto stroke
+ [] 0 setdash
+newpath 52.07251 36.8228 moveto
+55.8313 38.19089 lineto
+51.83127 38.19087 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath 55.8313 9.84444 moveto
+55.8313 38.19089 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath 56.5259 34.2516 moveto
+55.8313 38.19089 lineto
+55.1367 34.2516 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 28.34645 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 24.40717 moveto
+0 28.34645 lineto
+-0.6946 24.40717 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 52.07251 8.47635 moveto
+55.8313 9.84444 lineto
+51.83127 9.84442 lineto
+ closepath
+gsave fill grestore stroke
+-22.0623 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-17.5124 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 56.98946 moveto
+(!) cmsy10 9.96265 fshow
+-22.0623 50.58485 moveto
+(axis) cmmi10 9.96265 fshow
+-9.4037 11.92883 moveto
+(~) cmmi10 9.96265 fshow
+-8.7401 9.29984 moveto
+(h) cmmi10 9.96265 fshow
+24.6588 -5.19548 moveto
+(~) cmmi10 9.96265 fshow
+25.2826 -5.19548 moveto
+(a) cmmi10 9.96265 fshow
+20.24216 21.19543 moveto
+(~) cmmi10 9.96265 fshow
+20.62906 21.19543 moveto
+(v) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 1361 w @beginspecial -13 @llx -18 @lly 86
+@urx 86 @ury 990 @rwi @setspecial
+%%BeginDocument: vect-fig.10
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000039000001
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+85.03935 0 lineto stroke
+newpath 81.09966 -0.69467 moveto
+85.03935 0 lineto
+81.09966 0.69467 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 56.6929 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 52.75362 moveto
+0 56.6929 lineto
+-0.6946 52.75362 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+56.6929 0 lineto stroke
+newpath 52.75362 -0.6946 moveto
+56.6929 0 lineto
+52.75362 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+43.42886 36.44173 lineto stroke
+newpath 40.85773 33.37752 moveto
+43.42886 36.44173 lineto
+39.96478 34.44167 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 4.2518 0 moveto
+4.2518 1.1277 3.80376 2.20908 3.00641 3.00641 curveto
+2.20908 3.80376 1.1277 4.2518 0 4.2518 curveto
+-1.1277 4.2518 -2.20908 3.80376 -3.00641 3.00641 curveto
+-3.80376 2.20908 -4.2518 1.1277 -4.2518 0 curveto
+-4.2518 -1.1277 -3.80376 -2.20908 -3.00641 -3.00641 curveto
+-2.20908 -3.80376 -1.1277 -4.2518 0 -4.2518 curveto
+1.1277 -4.2518 2.20908 -3.80376 3.00641 -3.00641 curveto
+3.80376 -2.20908 4.2518 -1.1277 4.2518 0 curveto closepath stroke
+newpath 0.99626 0 moveto
+0.99626 0.26422 0.8913 0.51764 0.70447 0.70447 curveto
+0.51764 0.8913 0.26422 0.99626 0 0.99626 curveto
+-0.26422 0.99626 -0.51764 0.8913 -0.70447 0.70447 curveto
+-0.8913 0.51764 -0.99626 0.26422 -0.99626 0 curveto
+-0.99626 -0.26422 -0.8913 -0.51764 -0.70447 -0.70447 curveto
+-0.51764 -0.8913 -0.26422 -0.99626 0 -0.99626 curveto
+0.26422 -0.99626 0.51764 -0.8913 0.70447 -0.70447 curveto
+0.8913 -0.51764 0.99626 -0.26422 0.99626 0 curveto closepath fill
+ [3 3 ] 0 setdash
+newpath 0 36.44173 moveto
+43.42886 36.44173 lineto
+43.42886 0 lineto stroke
+ [] 0 setdash
+newpath 56.6929 0 moveto
+56.6929 13.32878 51.99652 26.23135 43.42886 36.44173 curveto
+32.65703 49.2789 16.75783 56.6929 0 56.6929 curveto stroke
+newpath 17.00804 0 moveto
+17.00804 3.99867 15.59912 7.86949 13.0288 10.93263 curveto stroke
+newpath 15.76941 8.01904 moveto
+14.979 9.08745 14.06085 10.06664 13.0288 10.93263 curveto
+13.70242 9.76588 14.23032 8.53172 14.60764 7.25742 curveto
+ closepath
+gsave fill grestore stroke
+-7.8591 53.13405 moveto
+(~) cmmi10 9.96265 fshow
+-7.3114 53.13405 moveto
+(c) cmmi10 9.96265 fshow
+-13.16432 -14.88742 moveto
+(~) cmmi10 9.96265 fshow
+-12.04523 -17.51642 moveto
+(b) cmmi10 9.96265 fshow
+25.0896 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+25.7134 -10.1177 moveto
+(a) cmmi10 9.96265 fshow
+15.04314 24.88705 moveto
+(~) cmmi10 9.96265 fshow
+13.66454 22.25806 moveto
+(f) cmmi10 9.96265 fshow
+24.30934 5.6113 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 1461 1091 a Fs(Figure)j(2)p Fu(:)37 b(V)-7
+b(ector)27 b(rotation)0 1356 y Fs(Ob)5 b(jects)32 b(and)g(classes)41
+b Fu(The)22 b Fp(3d)g Fu(pac)n(k)-5 b(age)21 b(understands)0
+1456 y(a)k(notion)g(of)h Fo(class)p Fu(.)37 b(A)26 b
+Fo(class)33 b Fu(is)25 b(a)g(parameterized)f(ob)5 b(ject.)0
+1555 y(F)-7 b(or)20 b(instance,)h(w)n(e)f(ha)n(v)n(e)f(the)i(class)e
+(of)i(regular)d(tetrahedra,)0 1655 y(the)32 b(class)f(of)h(regular)e
+(cub)r(es,)j(etc.)49 b(Our)31 b(classes)g(are)g(the)0
+1755 y(lo)n(w)n(est)38 b(lev)n(el)g(of)h(abstraction)e(and)i(classes)e
+(can)i(not)g(b)r(e)0 1854 y(comp)r(osed.)34 b(They)21
+b(can)g(only)g(b)r(e)g Fo(instanciate)l(d)p Fu(.)36 b(When)21
+b(w)n(e)0 1954 y(need)32 b(a)f(sp)r(eci\014c)h(tetrahedron,)f(w)n(e)h
+(call)f(a)g(generic)g(func-)0 2053 y(tion)g(to)g(create)f(a)h
+(tetrahedron,)g(but)h(with)f(an)g(iden)n(ti\014er)0 2153
+y(sp)r(eci\014c)d(to)f(one)g(instance.)166 2253 y(A)39
+b(class)e(is)h(a)g(set)g(of)g(v)n(ertices)f(in)i(space,)h(together)0
+2352 y(with)50 b(a)g(w)n(a)n(y)e(to)i(dra)n(w)e(faces,)55
+b(and)50 b(therefore)f(edges.)0 2452 y(The)43 b(author's)f(fo)r(cus)h
+(w)n(as)e(to)i(manipulate)g(\(and)g(later)0 2552 y(animate\))35
+b(p)r(olyhedra.)59 b(As)35 b(an)g(example,)i(the)f Fp(poly.mp)0
+2651 y Fu(pac)n(k)-5 b(age)35 b(pro)n(vides)h(the)h(de\014nition)h(of)f
+(eac)n(h)f(of)h(the)g(\014v)n(e)0 2751 y(regular)26 b(con)n(v)n(ex)g(p)
+r(olyhedra.)166 2850 y(Eac)n(h)k(class)h(consists)g(of)h(t)n(w)n(o)e
+(macros:)44 b(one)31 b(de\014nes)0 2950 y(the)21 b(p)r(oin)n(ts,)h(the)
+f(other)f(calls)f(the)i(\014rst)g(macro)e(and)h(de\014nes)0
+3050 y(the)41 b(faces.)75 b(Eac)n(h)39 b(macro)g(has)h(a)g(parameter)f
+(whic)n(h)h(is)0 3149 y(a)35 b(string)f(iden)n(tifying)i(the)g
+(particular)e(instance)h(of)g(that)0 3249 y(class.)166
+3349 y(The)47 b(p)r(oin)n(ts)g(of)f(a)h(regular)e(tetrahedron)g(are)h
+(de-)0 3448 y(\014ned)62 b(in)g Fp(set_tetrahedron_p)o(oin)o(ts)o
+Fu(,)j(an)c(example)0 3548 y(of)54 b(the)g(general)e(macro)g(name)h
+Fp(set_)p Fg(h)p Fo(class)7 b Fg(i)p Fp(_points)p Fu(.)0
+3647 y(Fiv)n(e)75 b(p)r(oin)n(ts)g(are)g(de\014ned,)87
+b(four)75 b(of)h(them)g(with)0 3747 y Fp(set_obj_point)p
+Fu(,)25 b(a)30 b(macro)f(whic)n(h)h(de\014nes)g(p)r(oin)n(ts)g
+Fo(lo)l(c)l(al)0 3847 y Fu(to)44 b(an)g(ob)5 b(ject.)86
+b(The)45 b(\014rst)f(four)f(p)r(oin)n(ts)i(are)e(the)h(v)n(er-)0
+3946 y(tices)32 b(and)f(the)i(\014fth)f(is)g(the)g(cen)n(ter)f(of)h
+(the)g(tetrahedron.)0 4046 y Fp(set_obj_point)p Fu('s)25
+b(\014rst)31 b(parameter)e(is)i(the)g(p)r(oin)n(t)g(n)n(um-)0
+4146 y(b)r(er)41 b(and)f(the)h(other)f(three)g(are)g(the)h(cartesian)e
+(co)r(ordi-)0 4245 y(nates.)g(The)29 b(\014rst)f(three)h(p)r(oin)n(ts)f
+(are)g(in)h(a)f(plane)g(and)h(the)0 4345 y(fourth)24
+b(is)f(obtained)h(with)g(the)g Fp(new_face_point)18 b
+Fu(macro,)0 4444 y(whic)n(h)32 b(folds)f(a)h(face)f(\(see)h(the)g
+(description)f(in)h(app)r(endix)0 4544 y(A)39 b(for)e(more)h
+(details\).)69 b(The)38 b Fp(new_face_point)32 b Fu(macro)0
+4644 y(is)45 b(used)g(with)h(the)f(angle)g Fp(an)f Fu(whic)n(h)h(is)g
+(computed)h(in)0 4743 y(adv)-5 b(ance.)36 b(Once)28 b(the)g(four)f(p)r
+(oin)n(ts)g(are)g(set,)h(the)g(ob)5 b(ject)27 b(is)0
+4843 y(normalized,)c(whic)n(h)g(means)g(that)h(it)f(is)g(cen)n(tered)g
+(with)h(re-)0 4943 y(sp)r(ect)h(to)g(the)g(list)g(of)f(v)n(ertices)g
+(giv)n(en)g(as)g(parameter)f(\(here)0 5042 y Fp(1,2,3,4)p
+Fu(\))29 b(and)j(the)h(last)e(v)n(ertex)g(is)h(put)h(on)e(a)h(sphere)f
+(of)0 5142 y(radius)d(1,)h(cen)n(tered)f(on)g(the)h(origin.)40
+b(Therefore,)28 b(p)r(oin)n(t)g(5)0 5241 y(is)21 b(the)h(cen)n(ter)f
+(of)h(the)f(tetrahedron,)h(and)f(the)h(tetrahedron)0
+5341 y(is)27 b(set)h(symmetrically)f(with)h(resp)r(ect)f(to)h(the)g
+(origin.)2183 1356 y(All)d(\014v)n(e)g(con)n(v)n(ex)e(regular)f(p)r
+(olyhedra)i(are)f(de\014ned)i(in)2017 1456 y(this)i(w)n(a)n(y)d(and)i
+(ma)n(y)f(therefore)g(b)r(e)h(inscrib)r(ed)g(in)g(a)f(sphere)2017
+1555 y(of)j(radius)f(1.)2017 1714 y Fp(def)43 b(set_tetrahedron_)o(po)o
+(int)o(s\()o(ex)o(pr)37 b(inst\)=)2105 1813 y(set_obj_point\(1)o(,0,)o
+(0,)o(0\);)2105 1913 y(set_obj_point\(2)o(,1,)o(0,)o(0\);)2105
+2013 y(set_obj_point\(3)o(,co)o(sd)o(\(60)o(\),)o(si)o(nd\()o(60)o
+(\),0)o(\);)2105 2112 y(sinan=1/sqrt\(3\))o(;)2105 2212
+y(cosan=sqrt\(1-si)o(nan)o(**)o(2\);)2105 2312 y(an=180-2*angle\()o
+(\(co)o(sa)o(n,s)o(in)o(an)o(\)\);)2105 2411 y(new_face_point\()o(4,1)o
+(,2)o(,3,)o(an)o(\);)2105 2511 y(normalize_obj\(i)o(nst)o(\)\()o(1,2)o
+(,3)o(,4)o(\);)2105 2610 y(set_obj_point\(5)o(,0,)o(0,)o(0\);)2017
+2710 y(enddef;)2183 2868 y Fu(The)43 b(second)g(macro,)i
+Fp(def_tetrahedron)37 b Fu(de\014nes)2017 2968 y(the)26
+b(n)n(um)n(b)r(er)e(of)h(p)r(oin)n(ts)f(and)h(faces)f(of)h(the)g
+(instance,)g(calls)2017 3068 y(the)36 b(previous)f(macro)f(and)h
+(de\014nes)g(the)h(faces)f(with)h(the)2017 3167 y(macro)g
+Fp(set_obj_face)p Fu(.)60 b(The)38 b(\014rst)e(argumen)n(t)g(of)h(that)
+2017 3267 y(macro)28 b(is)g(a)g Fo(lo)l(c)l(al)38 b Fu(face)28
+b(n)n(um)n(b)r(er,)h(the)g(second)e(is)i(a)f(list)h(of)2017
+3367 y(v)n(ertices)j(suc)n(h)h(that)g(the)g(list)g(go)r(es)e(clo)r(c)n
+(kwise)h(when)h(the)2017 3466 y(face)27 b(is)f(visible.)36
+b(The)27 b(last)f(argumen)n(t)f(is)h(the)h(color)e(of)h(the)2017
+3566 y(face)i(in)g(R)n(GB.)2017 3724 y Fp(vardef)42 b(def_tetrahedron)o
+(\(ex)o(pr)37 b(inst\)=)2105 3824 y(new_obj_points\()o(ins)o(t,)o(5\);)
+2105 3924 y(new_obj_faces\(i)o(nst)o(,4)o(\);)2105 4023
+y(set_tetrahedron)o(_po)o(in)o(ts\()o(in)o(st)o(\);)2105
+4123 y(set_obj_face\(1,)o("1,)o(2,)o(4",)o("b)o(4f)o(efe)o("\))o(;)2105
+4222 y(set_obj_face\(2,)o("2,)o(3,)o(4",)o("b)o(49)o(bc0)o("\))o(;)2105
+4322 y(set_obj_face\(3,)o("1,)o(4,)o(3",)o("b)o(4c)o(8fe)o("\))o(;)2105
+4422 y(set_obj_face\(4,)o("1,)o(3,)o(2",)o("b)o(4f)o(e40)o("\))o(;)2017
+4521 y(enddef;)2183 4680 y Fu(The)28 b(result)f(of)h(the)g(dra)n(wing)e
+(is:)2681 5396 y @beginspecial -42 @llx 8 @lly 23 @urx
+84 @ury 650 @rwi @setspecial
+%%BeginDocument: tetra.ps
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath fill
+ 0 setgray
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial eop
+%%Page: 277 4
+277 3 bop 0 -149 a Fu(TUGb)r(oat,)28 b(V)-7 b(olume)28
+b(18)e(\(1997\),)h(No.)g(4)2471 b(277)166 100 y(A)45
+b(more)f(complex)g(example)g(is)h(the)g(icosahedron)0
+199 y(whic)n(h)28 b(is)f(de\014ned)h(b)r(elo)n(w.)0 338
+y Fp(def)42 b(set_icosahedron_p)o(oi)o(nts)o(\(e)o(xpr)37
+b(inst\)=)87 437 y(set_obj_point\(1,0)o(,0)o(,0)o(\);)87
+537 y(set_obj_point\(2,1)o(,0)o(,0)o(\);)87 637 y(set_obj_point\(3,c)o
+(os)o(d\()o(60\))o(,s)o(ind)o(\(6)o(0\),)o(0\))o(;)87
+736 y(cosan=1-8/3*cosd\()o(36)o(\)*)o(cos)o(d\()o(36\))o(;)87
+836 y(sinan=sqrt\(1-cosa)o(n*)o(co)o(san)o(\);)87 935
+y(an=180-angle\(\(cos)o(an)o(,s)o(ina)o(n\))o(\);)87
+1035 y(new_face_point\(4,)o(1,)o(2,)o(3,a)o(n\))o(;)87
+1135 y(new_face_point\(5,)o(2,)o(3,)o(1,a)o(n\))o(;)87
+1234 y(new_face_point\(6,)o(3,)o(1,)o(2,a)o(n\))o(;)87
+1334 y(new_face_point\(7,)o(2,)o(4,)o(3,a)o(n\))o(;)87
+1434 y(new_face_point\(8,)o(3,)o(5,)o(1,a)o(n\))o(;)87
+1533 y(new_face_point\(9,)o(1,)o(6,)o(2,a)o(n\))o(;)87
+1633 y(new_face_point\(10)o(,3)o(,4)o(,7,)o(an)o(\);)87
+1732 y(new_face_point\(11)o(,3)o(,7)o(,5,)o(an)o(\);)87
+1832 y(new_face_point\(12)o(,1)o(,8)o(,6,)o(an)o(\);)87
+1932 y(\045)43 b(1)h(and)e(10)h(are)f(opposite)e(vertices)87
+2031 y(normalize_obj\(ins)o(t\))o(\(1)o(,10)o(\);)87
+2131 y(\045)j(center)e(of)i(icosahedron)87 2231 y(set_obj_point\(13,)o
+(0,)o(0,)o(0\);)0 2330 y(enddef;)0 2469 y(vardef)e(def_icosahedron\()o
+(exp)o(r)c(inst\)=)87 2568 y(save)42 b(cosan,sinan,an;)87
+2668 y(new_obj_points\(in)o(st)o(,1)o(3\);)87 2767 y
+(new_obj_faces\(ins)o(t,)o(20)o(\);)87 2867 y(set_icosahedron_p)o(oi)o
+(nt)o(s\(i)o(ns)o(t\);)87 2967 y(set_obj_face\(1,"3)o(,2)o(,1)o(",")o
+(b4)o(000)o(0")o(\);)87 3066 y(set_obj_face\(2,"2)o(,3)o(,4)o(",")o(ff)
+o(0fa)o(1")o(\);)87 3166 y(set_obj_face\(3,"3)o(,7)o(,4)o(",")o(b4)o
+(9b4)o(9")o(\);)87 3266 y(set_obj_face\(4,"3)o(,5)o(,7)o(",")o(b4)o
+(9bc)o(0")o(\);)87 3365 y(set_obj_face\(5,"3)o(,1)o(,5)o(",")o(b4)o
+(c8f)o(e")o(\);)87 3465 y(set_obj_face\(6,"1)o(,8)o(,5)o(",")o(b4)o
+(fef)o(e")o(\);)87 3564 y(set_obj_face\(7,"1)o(,6)o(,8)o(",")o(b4)o
+(fe4)o(0")o(\);)87 3664 y(set_obj_face\(8,"1)o(,2)o(,6)o(",")o(45)o
+(d04)o(0")o(\);)87 3764 y(set_obj_face\(9,"2)o(,9)o(,6)o(",")o(45)o
+(a11)o(4")o(\);)87 3863 y(set_obj_face\(10,")o(2,)o(4,)o(9",)o("4)o
+(5a1)o(d4)o("\);)87 3963 y(set_obj_face\(11,")o(9,)o(4,)o(10")o(,")o
+(456)o(9d)o(4"\))o(;)87 4063 y(set_obj_face\(12,")o(4,)o(7,)o(10")o(,")
+o(112)o(da)o(1"\))o(;)87 4162 y(set_obj_face\(13,")o(7,)o(5,)o(11")o
+(,")o(b4f)o(ef)o(e"\))o(;)87 4262 y(set_obj_face\(14,")o(5,)o(8,)o(11")
+o(,")o(b49)o(bc)o(0"\))o(;)87 4361 y(set_obj_face\(15,")o(8,)o(6,)o
+(12")o(,")o(45a)o(11)o(4"\))o(;)87 4461 y(set_obj_face\(16,")o(6,)o(9,)
+o(12")o(,")o(b49)o(b4)o(9"\))o(;)87 4561 y(set_obj_face\(17,")o(8,)o
+(12)o(,11)o(",)o("b4)o(00)o(00")o(\);)87 4660 y(set_obj_face\(18,")o
+(7,)o(11)o(,10)o(",)o("45)o(a1)o(d4")o(\);)87 4760 y
+(set_obj_face\(19,")o(12)o(,1)o(0,1)o(1")o(,"b)o(4c)o(8fe)o("\))o(;)87
+4860 y(set_obj_face\(20,")o(9,)o(10)o(,12)o(",)o("ff)o(0f)o(a1")o(\);)0
+4959 y(enddef;)166 5098 y Fu(Since)36 b(all)f(p)r(oin)n(ts)h(of)f(the)h
+(ob)5 b(jects)35 b(are)g(stored)g(in)g(a)0 5197 y(unique)29
+b(global)e(arra)n(y)-7 b(,)26 b(they)i(are)g(in)n(ternally)f(accessed)g
+(b)n(y)0 5297 y(the)20 b(lo)r(cal)g(n)n(um)n(b)r(ers)f(and)h(an)g
+(o\013set)g(de\014ned)g(b)n(y)g(the)g(macro)0 5396 y
+Fp(new_obj_points)p Fu(.)50 b(The)35 b(icosahedron)d(example)h(sho)n
+(ws)2017 100 y(a)h(systematic)g(use)h(of)f(the)h Fp(new_face_point)29
+b Fu(macro)k(to)2017 199 y(compute)39 b(a)g(p)r(oin)n(t)f(on)h(an)f
+(adjacen)n(t)g(face.)70 b(Displa)n(ying)2017 299 y(suc)n(h)28
+b(an)f(icosahedron)f(results)h(in)h(the)g(\014gure)e(3.)2576
+1245 y @beginspecial -45 @llx -9 @lly 45 @urx 74 @ury
+900 @rwi @setspecial
+%%BeginDocument: icosa.ps
+ 0.9 0 0.2 setrgbcolor
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath stroke
+ 0.5 0.3 0 setrgbcolor
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 0.3 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 1 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath stroke
+ 0.4 0 0.6 setrgbcolor
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 0.4 0.2 setrgbcolor
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 0.2 1 0.3 setrgbcolor
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath stroke
+ 0.1 0.2 0.9 setrgbcolor
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 1 0.2 setrgbcolor
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 2466 1453 a Fs(Figure)31 b(3)p Fu(:)37 b(An)28
+b(icosahedron)2183 1791 y(The)g(other)f(three)h(regular)d(con)n(v)n(ex)
+h(p)r(olyhedra)h(are:)2689 2451 y @beginspecial -33 @llx
+0 @lly 30 @urx 65 @ury 630 @rwi @setspecial
+%%BeginDocument: cube.ps
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath fill
+ 0 setgray
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 2017 3320 a @beginspecial -39 @llx -8 @lly
+36 @urx 84 @ury 750 @rwi @setspecial
+%%BeginDocument: octa.ps
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath fill
+ 0 setgray
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 1102 w @beginspecial -46 @llx -8 @lly 46
+@urx 74 @ury 920 @rwi @setspecial
+%%BeginDocument: dodeca.ps
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath fill
+ 0 setgray
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath fill
+ 0 setgray
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath fill
+ 0 setgray
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 2183 3514 a(The)37 b(do)r(decahedron)d(co)r(de)i(is)g(a)f
+(bit)i(sp)r(ecial,)h(since)2017 3614 y(the)45 b(v)n(ertices)d(are)h
+(built)i(using)e(ten)h(additional)g(p)r(oin)n(ts)2017
+3713 y(corresp)r(onding)h(to)h(face)h(cen)n(ters.)93
+b(These)46 b(p)r(oin)n(ts)h(are)2017 3813 y(de\014ned)36
+b(as)f(an)g(arra)n(y)e(of)i(v)-5 b(ariables)34 b Fp(fc1)g
+Fu(through)h Fp(fc10)2017 3913 y Fu(with)30 b Fp(new_points\(fc\)\(1)o
+(0\))p Fu(.)35 b Fp(free_points\(fc\)\(1)o(0\))2017 4012
+y Fu(frees)e(them)h(when)f(they)g(are)g(no)f(longer)g(necessary)-7
+b(.)52 b(An)2017 4112 y(excerpt)28 b(of)f(the)h(do)r(decahedron)e(co)r
+(de)i(is:)2017 4306 y Fp(def)43 b(set_dodecahedron)o(_p)o(oin)o(ts)o
+(\(e)o(xpr)37 b(inst\)=)2105 4406 y(new_points\(fc\)\()o(10\))o(;\045)g
+(face)42 b(centers)2105 4505 y(set_point\(fc1,0)o(,0,)o(0\))o(;)2105
+4605 y(set_obj_point\(1)o(,1,)o(0,)o(0\);)2105 4704 y(set_obj_point\(2)
+o(,co)o(sd)o(\(72)o(\),)o(si)o(nd\()o(72)o(\),0)o(\);)2105
+4804 y(rotate_in_plane)o(\(3,)o(fc)o(1,1)o(,2)o(\);)2105
+4904 y(...)2105 5003 y(free_points\(fc\))o(\(10)o(\);)2017
+5103 y(enddef;)2183 5297 y Fu(Finally)-7 b(,)32 b(wire)e(dra)n(wings)f
+(can)i(b)r(e)g(obtained)f(b)n(y)h(set-)2017 5396 y(ting)d(the)g(b)r(o)r
+(olean)f Fp(filled_faces)c Fu(to)k(false:)p eop
+%%Page: 278 5
+278 4 bop 0 -149 a Fu(278)2470 b(TUGb)r(oat,)28 b(V)-7
+b(olume)27 b(18)g(\(1997\),)f(No.)i(4)192 1358 y @beginspecial
+-117 @llx -31 @lly 61 @urx 130 @ury 1780 @rwi @setspecial
+%%BeginDocument: icosa-w.ps
+ 1 setgray 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash 1 setlinecap
+newpath -77.9753 -13.86514 moveto
+-0.00359 0.00238 lineto
+-0.19029 -30.73163 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-77.9753 -13.86514 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-116.7492 70.0534 lineto
+-60.8034 51.93527 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.19029 -30.73163 moveto
+-0.00359 0.00238 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+14.7046 80.81752 lineto
+60.1313 36.75247 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -0.00359 0.00238 moveto
+-60.8034 51.93527 lineto
+14.7046 80.81752 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-60.8034 51.93527 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -60.8034 51.93527 moveto
+-116.7492 70.0534 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 60.1313 36.75247 moveto
+14.7046 80.81752 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath -116.7492 70.0534 moveto
+-64.09882 124.84016 lineto
+-51.86171 129.12445 lineto
+ closepath stroke
+ 1 setgray [] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ 0 setgray [3 3 ] 0 setdash
+newpath 14.7046 80.81752 moveto
+-51.86171 129.12445 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+ [] 0 setdash
+newpath -77.9753 -13.86514 moveto
+-83.98907 15.99922 lineto
+-116.7492 70.0534 lineto
+ closepath stroke
+newpath -77.9753 -13.86514 moveto
+-0.19029 -30.73163 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+20.03435 55.02917 lineto
+-83.98907 15.99922 lineto
+ closepath stroke
+newpath -0.19029 -30.73163 moveto
+60.1313 36.75247 lineto
+20.03435 55.02917 lineto
+ closepath stroke
+newpath -116.7492 70.0534 moveto
+-83.98907 15.99922 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath -83.98907 15.99922 moveto
+20.03435 55.02917 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+60.1313 36.75247 lineto
+28.53722 127.19768 lineto
+ closepath stroke
+newpath 20.03435 55.02917 moveto
+28.53722 127.19768 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+newpath 28.53722 127.19768 moveto
+-51.86171 129.12445 lineto
+-64.09882 124.84016 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 1524 a Fs(Animating)i(ob)5 b(jects)42
+b Fu(The)29 b(animation)e(of)i(one)e(or)h(sev-)0 1624
+y(eral)h(ob)5 b(jects)30 b(in)n(v)n(olv)n(es)e(the)j(ob)5
+b(ject\(s\))30 b(and)g(an)g(observ)n(er.)0 1724 y(The)25
+b(animation)f(is)g(a)h(set)f(of)h(images)f(and)g(from)g(an)h(image)0
+1823 y(to)k(the)h(next)g(one,)f(the)h(observ)n(er)d(as)i(w)n(ell)g(as)g
+(the)h(ob)5 b(jects)0 1923 y(can)40 b(mo)n(v)n(e.)74
+b(F)-7 b(or)40 b(instance)g(the)h(macro)e Fp(one_image)e
+Fu(in)0 2022 y Fp(3d.mp)26 b Fu(is:)0 2165 y Fp(def)42
+b(one_image\(expr)c(name,i,a,rd,ang\)=)87 2265 y(beginfig\(i\);)174
+2364 y(set_point\(Obs,)218 2464 y(-rd*cosd\(a*ang\),)o(-r)o(d*s)o(in)o
+(d\(a)o(*a)o(ng\))o(,1)o(\);)174 2564 y(Obs_phi:=90;Obs_d)o(is)o(t:=)o
+(2;)174 2663 y(\045)44 b(fix)e(point)f(1)j(of)e(object)f(|name|)174
+2763 y(point_of_view_obj)o(\(n)o(ame)o(,1)o(,Ob)o(s_)o(phi)o(\);)174
+2863 y(draw_obj\(name\);)174 2962 y(rotate_obj_pv\(nam)o(e,)o(1,v)o(ec)
+o(t_I)o(,a)o(ng\))o(;)174 3062 y(\045)j(show)d(the)i(rotation)d(point)
+174 3161 y(draw_point\(name,1)o(\);)174 3261 y(draw_axes\(red,gre)o(en)
+o(,bl)o(ue)o(\);)87 3361 y(endfig;)0 3460 y(enddef;)166
+3603 y Fu(The)26 b(parameters)e(of)i(this)g(macro)f(are)f(a)i(name)g
+(of)f(an)0 3703 y(ob)5 b(ject)27 b(\()p Fp(name)p Fu(\),)f(an)h(image)f
+(index)h(\()p Fp(i)p Fu(\),)h(and)f(three)f(v)-5 b(alues)0
+3802 y(de\014ning)30 b(the)h(p)r(osition)f(of)h(the)g(observ)n(er.)43
+b(The)30 b(observ)n(er)0 3902 y(\()p Fp(Obs)48 b Fu(is)g(a)g(global)g
+(p)r(oin)n(t)h(and)f(set)h(with)g Fp(set_point)p Fu(,)0
+4002 y(not)32 b(with)g Fp(set_obj_point)p Fu(\))27 b(follo)n(ws)k(a)g
+(circle)g(of)h(radius)0 4101 y Fp(rd)p Fu(.)62 b(The)36
+b(parameter)e Fp(a)p Fu(,)k(whic)n(h)e(is)g(usually)g(a)f(function)0
+4201 y(of)43 b Fp(i)p Fu(,)j(determines)d(the)g(n)n(um)n(b)r(er)f(of)h
+(rotation)e(steps)i(of)0 4301 y(the)f(observ)n(er,)h(eac)n(h)e(step)h
+(b)r(eing)f(a)h(rotation)e(of)i(angle)0 4400 y Fp(ang)p
+Fu(.)74 b(The)40 b(distance)g(b)r(et)n(w)n(een)h(the)f(observ)n(er)f
+(and)h(the)0 4500 y(pro)5 b(jection)27 b(plane)g(is)g(2)h(\(see)f
+(\014gure)g(4\).)166 4599 y(The)40 b(orien)n(tation)f(of)g(the)i
+(observ)n(er)c(is)j(de\014ned)g(b)n(y)0 4699 y(three)d(angles)g(\(see)g
+(\014gure)g(5\).)66 b(The)38 b Fp(Obs_phi)d Fu(angle)h(is)0
+4799 y(giv)n(en)20 b(and)h(the)h(t)n(w)n(o)e(others)g(are)g(computed)h
+(with)h(a)f(call)f(to)0 4898 y Fp(point_of_view_ob)o(j\(n)o(am)o(e,)o
+(1,O)o(bs)o(_ph)o(i\))27 b Fu(whic)n(h)34 b(con-)0 4998
+y(strains)19 b(the)i(observ)n(er)d(to)i(lo)r(ok)f(to)n(w)n(ards)f(p)r
+(oin)n(t)j(1)e(of)h(ob)5 b(ject)0 5098 y Fp(name)p Fu(.)54
+b(Therefore,)34 b(this)g(p)r(oin)n(t)g(will)h(seem)e(\014xed)h(on)g
+(the)0 5197 y(animation)c(and)g Fp(draw_point\(name,1)o(\))25
+b Fu(dra)n(ws)k(it)i(later)0 5297 y(so)26 b(that)g(this)g(feature)g
+(can)g(b)r(e)h(observ)n(ed.)35 b(There)25 b(is)h(noth-)0
+5396 y(ing)h(sp)r(ecial)g(ab)r(out)g(that)g(p)r(oin)n(t,)h(except)f
+(that)g(it)h(remains)2017 100 y(\014x)g(when)g(the)h(ob)5
+b(ject)27 b(is)h(rotated.)37 b(The)28 b(ob)5 b(ject)28
+b(is)g(dra)n(wn)2017 199 y(with)37 b Fp(draw_obj\(name\))31
+b Fu(and)36 b Fp(rotate_obj_pv)c Fu(rotates)2017 299
+y(the)23 b(ob)5 b(ject)21 b Fp(name)f Fu(b)n(y)i Fp(ang)e
+Fu(degrees)h(around)f(an)i(axis)f(going)2017 399 y(through)30
+b(p)r(oin)n(t)g(1)g(and)g(directed)g(b)n(y)g(v)n(ector)e
+Fp(vect_I)g Fu(\()-11 b Fn(~)-31 b({)p Fu(\).)2017 509
+y(The)29 b(reference)e(v)n(ectors)f(\()-11 b Fn(~)-31
+b({)p Fu(,)24 b Fn(~)-38 b(|)28 b Fu(and)3148 487 y Fn(~)3152
+509 y(k)s Fu(\))g(are)g(dra)n(wn)f(in)h(red,)2017 608
+y(green)f(and)g(blue)h(with)g Fp(draw_axes)p Fu(.)2183
+708 y(Finally)-7 b(,)22 b(a)e(complete)g(animation)f(of)i(an)e
+(icosahedron)2017 808 y(is)28 b(obtained)f(with)2017
+956 y Fp(animate_object\("i)o(cos)o(ah)o(edr)o(on)o(",)o(1,1)o(00)o
+(,10)o(0\))o(;)2017 1105 y Fu(whic)n(h)g(generates)e(\014les)h
+Fp(anim.101)p Fu(,)d(.)14 b(.)g(.)g(,)27 b Fp(anim.200)c
+Fu(from)2017 1204 y(the)52 b(main)f(\014le)h Fp(anim.mp)p
+Fu(.)105 b(The)51 b(\014rst)g(parameter)f(of)2017 1304
+y Fp(animate_object)32 b Fu(is)37 b(the)g(name)g(of)h(the)f(ob)5
+b(ject)37 b(to)g(an-)2017 1403 y(imate,)25 b(the)e(second)g(and)g
+(third)g(parameters)f(are)g(minimal)2017 1503 y(and)g(maximal)f(v)-5
+b(alues)22 b(of)g(the)g(index)g(lo)r(op)g(and)f(the)i(fourth)2017
+1603 y(parameter)36 b(is)i(an)f(o\013set)g(added)h(to)f(the)h(index)f
+(lo)r(op)g(in)2017 1702 y(order)24 b(to)i(get)f(the)g(\014le)h
+(extension,)f(whic)n(h)h(m)n(ust)f(lie)h(in)f(the)2017
+1802 y(in)n(terv)-5 b(al)27 b(0)p Fn(::)p Fu(4096.)2183
+1902 y(After)20 b(eac)n(h)f(image)g(is)g(dra)n(wn,)i(the)f(v)-5
+b(alues)19 b(of)g(the)h(cur-)2017 2001 y(ren)n(t)28 b(b)r(ounding)g(b)r
+(o)n(x)g(are)f(used)h(to)g(compute)g(the)g(b)r(ound-)2017
+2101 y(ing)42 b(b)r(o)n(x)f(of)g(the)h(sequence)f(of)h(images.)78
+b(The)41 b(in)n(ternal)2017 2201 y(v)-5 b(alues)45 b
+Fp(xmin_)p Fu(,)j Fp(ymin_)p Fu(,)f Fp(xmax_)c Fu(and)i
+Fp(ymax_)e Fu(hold)i(the)2017 2300 y(minimal)36 b(and)f(maximal)f(v)-5
+b(alues)35 b(of)g(the)g(co)r(ordinates)f(of)2017 2400
+y(the)41 b(past)f(images')g(corners.)73 b(They)41 b(are)e(up)r(dated)i
+(just)2017 2499 y(b)r(efore)28 b(eac)n(h)f(image)f(is)i(shipp)r(ed)g
+(out.)2017 2665 y Fs(Putting)k(the)g(pieces)f(together)44
+b Fu(Once)31 b(all)g(the)g(views)2017 2765 y(ha)n(v)n(e)36
+b(b)r(een)h(computed,)i(they)e(can)f(b)r(e)h(used)g(separately)2017
+2865 y(\(see)30 b(for)g(instance)f(the)i(\014v)n(e)e(views)h(of)f
+(\014gure)h(6\))f(or)g(more)2017 2964 y(in)n(terestingly)-7
+b(,)51 b(they)c(can)g(b)r(e)g(merged.)94 b(This)46 b(task)h(is)2017
+3064 y(made)32 b(almost)f(straigh)n(tforw)n(ard)e(b)n(y)k
+Fq(MET)n(AP)t(OST)h Fu(itself.)2017 3164 y(Indeed,)29
+b(ev)n(ery)d(time)i Fp(animate_object)23 b Fu(is)k(used,)h(a)g(shell)
+2017 3263 y(script)42 b(named)f Fp(create_animation.)o(sh)35
+b Fu(is)42 b(generated,)2017 3363 y(as)33 b(a)h(side-e\013ect)f(of)h(a)
+f(call)h(to)f Fp(show_animation_bb)o(ox)o Fu(.)2017 3462
+y(The)49 b(script)e(is)h(similar)g(to)g(that)g(sho)n(wn)f(in)i
+(\014gure)e(1.)2017 3562 y(This)29 b(script)g(uses)g(the)g(v)-5
+b(alues)29 b(computed)g(for)f(the)i(global)2017 3662
+y(b)r(ounding)35 b(b)r(o)n(x)f(of)h(the)g(sequence)f(of)h(images,)g
+(for)f(these)2017 3761 y(v)-5 b(alues)40 b(are)f(necessary)f(in)i
+(order)f(to)h(extract)f(the)h(righ)n(t)2017 3861 y(parts)29
+b(of)g(the)g(images)f(and)h(get)g(correct)e(alignmen)n(ts;)i(the)2017
+3961 y(parts)k(are)f(extracted)g(with)i Fp(pnmcut)p Fu(.)3234
+3930 y Fm(3)3322 3961 y Fu(If)g(y)n(ou)e(ha)n(v)n(e)g(the)2017
+4060 y(programs)38 b(used)i(in)g(this)g(script)f(\()p
+Fp(Ghostscript)p Fu(,)g(etc.\),)2017 4160 y(y)n(ou)29
+b(can)g(just)h(run)g(it)g(with)g Fp(sh)42 b(create_animation.)o(sh)2017
+4259 y Fu(on)29 b(UNIX.)g(Y)-7 b(ou)28 b(ma)n(y)g(need)h(to)f(adapt)g
+(it)h(to)f(y)n(our)g(needs,)2017 4359 y(and)41 b(for)g(that)g(purp)r
+(ose,)k(y)n(ou)40 b(can)h(mo)r(dify)g(the)h(macro)2017
+4459 y Fp(write_script)23 b Fu(in)28 b Fp(3d.mp)p Fu(.)2183
+4558 y(Some)39 b(examples)g(are)f(included)h(in)g(the)h
+Fp(3d)e Fu(distri-)2017 4658 y(bution,)j(and)d(they)g(can)f(b)r(e)i
+(view)n(ed)e(for)g(instance)h(with)2017 4758 y Fp(netscape)25
+b Fu(or)i(sp)r(ecial)g(programs)e(suc)n(h)i(as)g Fp(xanim)p
+Fu(.)p 2017 4925 748 4 v 2124 4979 a Fl(3)2178 5002 y
+Fk(One)20 b(migh)n(t)e(think)i(of)f(using)h Fj(Ghostscript)j
+Fk(for)18 b(generating)j(an)2017 5081 y(excerpt)28 b(of)e(an)h(image,)f
+(but)i(if)i Fj(Ghostscript)g Fk(is)c(used)h(to)g(generate)2017
+5160 y(the)40 b(b)r(ounding)g(b)r(o)n(x)f(of)g(an)g(image,)i(it)e(will)
+f(in)g(general)h(not)h(b)r(e)2017 5239 y(p)r(ossible)28
+b(to)g(ha)n(v)n(e)h(a)f(go)r(o)r(d)g(alignmen)n(t)f(b)r(et)n(w)n(een)j
+(all)d(images.)42 b(The)2017 5318 y(sizes)32 b(of)f(the)h(excerpts)h
+(are)f(only)f(kno)n(wn)i(when)f(all)f(images)f(ha)n(v)n(e)2017
+5396 y(b)r(een)25 b(pro)r(duced.)p eop
+%%Page: 279 6
+279 5 bop 0 -149 a Fu(TUGb)r(oat,)28 b(V)-7 b(olume)28
+b(18)e(\(1997\),)h(No.)g(4)2471 b(279)564 1500 y @beginspecial
+-25 @llx -25 @lly 306 @urx 150 @ury 3310 @rwi @setspecial
+%%BeginDocument: vect-fig.8
+%*Font: cmmi10 9.96265 9.96265 4f:800014224c6
+%*Font: cmr10 9.96265 9.96265 61:a8d75
+%*Font: cmmi7 6.97385 6.97385 69:e1
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 45.35449 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 41.4152 moveto
+0 45.35449 lineto
+-0.6946 41.4152 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+35.96683 -16.77173 lineto stroke
+newpath 32.10292 -15.7364 moveto
+35.96683 -16.77173 lineto
+32.69005 -14.47731 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+53.27417 19.39043 lineto stroke
+newpath 49.81003 17.3904 moveto
+53.27417 19.39043 lineto
+49.3349 18.69582 lineto
+ closepath
+gsave fill grestore stroke
+newpath 159.82251 148.88026 moveto
+159.82251 58.17128 lineto
+231.75616 24.62782 lineto stroke
+ [3 3 ] 0 setdash
+newpath 53.27417 19.39043 moveto
+159.82251 58.17128 lineto stroke
+newpath 0 0 moveto
+267.72299 143.91957 lineto stroke
+ [0 5 ] 2.5 setdash
+newpath 187.40527 100.74326 moveto
+159.8223 113.60522 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 187.40527 100.74326 moveto
+187.40549 45.30931 lineto stroke
+147.3327 112.88567 moveto
+(y) cmmi10 9.96265 fshow
+152.21721 111.39127 moveto
+(p) cmmi7 6.97385 fshow
+182.25598 38.0198 moveto
+(x) cmmi10 9.96265 fshow
+187.94987 36.5254 moveto
+(p) cmmi7 6.97385 fshow
+-24.0194 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-18.49089 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 24.57285 moveto
+(!) cmsy10 9.96265 fshow
+-24.0194 17.82045 moveto
+(O) cmmi10 9.96265 fshow
+-16.14339 17.82045 moveto
+(bs) cmmi10 9.96265 fshow
+-7.1978 16.32605 moveto
+(j) cmmi7 6.97385 fshow
+-5.83998 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+0.04042 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+5.92082 -16.29745 moveto
+(!) cmsy10 9.96265 fshow
+-5.83998 -23.04985 moveto
+(O) cmmi10 9.96265 fshow
+2.03603 -23.04985 moveto
+(bs) cmmi10 9.96265 fshow
+10.98161 -24.54425 moveto
+(k) cmmi7 6.97385 fshow
+28.73708 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+33.82507 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+38.91287 1.78363 moveto
+(!) cmsy10 9.96265 fshow
+28.73708 -4.96877 moveto
+(O) cmmi10 9.96265 fshow
+36.61308 -4.96877 moveto
+(bs) cmmi10 9.96265 fshow
+45.55867 -6.46317 moveto
+(i) cmmi7 6.97385 fshow
+75.05598 12.73616 moveto
+(O) cmmi10 9.96265 fshow
+82.93199 12.73616 moveto
+(bs) cmmi10 9.96265 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 92.47539 12.93536 moveto
+95.46419 12.93536 lineto stroke
+95.46419 12.73616 moveto
+(dist) cmmi10 9.96265 fshow
+184.89902 93.45375 moveto
+(p) cmmi10 9.96265 fshow
+270.72299 141.77481 moveto
+(m) cmmi10 9.96265 fshow
+newpath 188.40154 100.74326 moveto
+188.40154 101.00748 188.29657 101.2609 188.10974 101.44772 curveto
+187.92291 101.63455 187.6695 101.73952 187.40527 101.73952 curveto
+187.14105 101.73952 186.88763 101.63455 186.7008 101.44772 curveto
+186.51398 101.2609 186.40901 101.00748 186.40901 100.74326 curveto
+186.40901 100.47903 186.51398 100.22562 186.7008 100.03879 curveto
+186.88763 99.85196 187.14105 99.747 187.40527 99.747 curveto
+187.6695 99.747 187.92291 99.85196 188.10974 100.03879 curveto
+188.29657 100.22562 188.40154 100.47903 188.40154 100.74326 curveto closepath
+ fill
+newpath 268.71925 143.91957 moveto
+268.71925 144.18379 268.61429 144.43721 268.42746 144.62404 curveto
+268.24063 144.81087 267.98721 144.91583 267.72299 144.91583 curveto
+267.45877 144.91583 267.20535 144.81087 267.01852 144.62404 curveto
+266.8317 144.43721 266.72673 144.18379 266.72673 143.91957 curveto
+266.72673 143.65535 266.8317 143.40193 267.01852 143.2151 curveto
+267.20535 143.02827 267.45877 142.92331 267.72299 142.92331 curveto
+267.98721 142.92331 268.24063 143.02827 268.42746 143.2151 curveto
+268.61429 143.40193 268.71925 143.65535 268.71925 143.91957 curveto closepath
+ fill
+newpath 188.40175 45.30931 moveto
+188.40175 45.57353 188.29678 45.82695 188.10995 46.01378 curveto
+187.92313 46.2006 187.66971 46.30557 187.40549 46.30557 curveto
+187.14127 46.30557 186.88785 46.2006 186.70102 46.01378 curveto
+186.51419 45.82695 186.40923 45.57353 186.40923 45.30931 curveto
+186.40923 45.04509 186.51419 44.79167 186.70102 44.60484 curveto
+186.88785 44.41801 187.14127 44.31305 187.40549 44.31305 curveto
+187.66971 44.31305 187.92313 44.41801 188.10995 44.60484 curveto
+188.29678 44.79167 188.40175 45.04509 188.40175 45.30931 curveto closepath fill
+newpath 160.81856 113.60522 moveto
+160.81856 113.86945 160.7136 114.12286 160.52676 114.3097 curveto
+160.33994 114.49652 160.08652 114.60149 159.8223 114.60149 curveto
+159.55807 114.60149 159.30466 114.49652 159.11783 114.3097 curveto
+158.931 114.12286 158.82603 113.86945 158.82603 113.60522 curveto
+158.82603 113.341 158.931 113.08759 159.11783 112.90076 curveto
+159.30466 112.71393 159.55807 112.60896 159.8223 112.60896 curveto
+160.08652 112.60896 160.33994 112.71393 160.52676 112.90076 curveto
+160.7136 113.08759 160.81856 113.341 160.81856 113.60522 curveto closepath fill
+-18.92159 -9.0185 moveto
+(O) cmmi10 9.96265 fshow
+-11.04558 -9.0185 moveto
+(bs) cmmi10 9.96265 fshow
+234.75616 22.13716 moveto
+(pro) cmr10 9.96265 fshow
+249.72786 22.13716 moveto
+(jection) cmr10 9.96265 fshow
+282.10646 22.13716 moveto
+(plane) cmr10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 1295 1708 a Fs(Figure)31 b(4)p Fu(:)37 b(Pro)5
+b(jection)26 b(on)h(the)h(screen)976 3274 y @beginspecial
+-110 @llx -56 @lly 122 @urx 116 @ury 2320 @rwi @setspecial
+%%BeginDocument: vect-fig.16
+%*Font: cmmi10 9.96265 9.96265 12:800a000000000004000080005f8
+%*Font: cmmi7 6.97385 6.97385 78:e
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+-106.54832 -38.78087 lineto stroke
+newpath -103.08418 -36.78084 moveto
+-106.54832 -38.78087 lineto
+-102.60905 -38.08626 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+82.14182 -22.00984 lineto stroke
+newpath 78.15659 -21.66115 moveto
+82.14182 -22.00984 lineto
+78.51617 -20.31917 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+80.17596 80.17596 lineto stroke
+newpath 77.88162 76.89932 moveto
+80.17596 80.17596 lineto
+76.89932 77.88162 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-80.17596 80.17596 lineto stroke
+newpath -76.89932 77.88162 moveto
+-80.17596 80.17596 lineto
+-77.88162 76.89932 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+83.46436 -48.18889 lineto stroke
+ [] 0 setdash
+newpath 79.70563 -46.82079 moveto
+83.46436 -48.18889 lineto
+80.4002 -45.61775 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+106.54832 38.78087 lineto stroke
+ [] 0 setdash
+newpath 103.08418 36.78084 moveto
+106.54832 38.78087 lineto
+102.60905 38.08626 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+-29.34647 109.52243 lineto stroke
+ [] 0 setdash
+newpath -27.65599 105.89716 moveto
+-29.34647 109.52243 lineto
+-28.99785 105.53763 lineto
+ closepath
+gsave fill grestore stroke
+-109.39528 -46.07037 moveto
+(x) cmmi10 9.96265 fshow
+80.61275 -55.4784 moveto
+(u) cmmi10 9.96265 fshow
+71.22307 -31.92834 moveto
+(O) cmmi10 9.96265 fshow
+79.09908 -31.92834 moveto
+(bs) cmmi10 9.96265 fshow
+88.04466 -33.42274 moveto
+(x) cmmi7 6.97385 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+83.17596 78.1419 moveto
+(O) cmmi10 9.96265 fshow
+91.05197 78.1419 moveto
+(bs) cmmi10 9.96265 fshow
+99.99756 76.6475 moveto
+(y) cmmi7 6.97385 fshow
+-8.0713 111.24104 moveto
+(z) cmmi10 9.96265 fshow
+-104.58806 77.4639 moveto
+(O) cmmi10 9.96265 fshow
+-96.71205 77.4639 moveto
+(bs) cmmi10 9.96265 fshow
+-87.76646 75.9695 moveto
+(z) cmmi7 6.97385 fshow
+109.54832 36.63611 moveto
+(v) cmmi10 9.96265 fshow
+-39.74696 107.37767 moveto
+(w) cmmi10 9.96265 fshow
+newpath -21.30934 -7.75606 moveto
+-9.00943 -12.23291 4.40096 -14.11148 16.69261 -9.63763 curveto stroke
+newpath 13.13445 -11.46506 moveto
+14.3417 -10.9175 15.52881 -10.30956 16.69261 -9.63763 curveto
+15.36917 -9.87099 14.04575 -10.03627 12.72401 -10.13791 curveto
+ closepath
+gsave fill grestore stroke
+newpath 41.73218 -24.09445 moveto
+42.8361 -19.97456 43.169 -15.68611 42.7141 -11.4452 curveto stroke
+newpath 43.60097 -15.34569 moveto
+43.38118 -14.0319 43.08534 -12.72954 42.7141 -11.4452 curveto
+42.6237 -12.77907 42.45625 -14.10408 42.21346 -15.4138 curveto
+ closepath
+gsave fill grestore stroke
+newpath 21.30934 7.75606 moveto
+20.17679 10.86769 18.3764 13.69347 16.03494 16.03494 curveto stroke
+newpath 19.09639 13.46066 moveto
+18.1564 14.40456 17.1324 15.26648 16.03494 16.03494 curveto
+16.80339 14.93747 17.47086 13.7773 18.03133 12.56885 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 34.01608 moveto
+-2.97272 34.01608 -5.93262 33.62646 -8.80403 32.85707 curveto stroke
+newpath -5.08572 34.33142 moveto
+-6.35167 33.91377 -7.5933 33.42163 -8.80403 32.85707 curveto
+-7.47322 32.97351 -6.13814 33.0113 -4.8057 32.9708 curveto
+ closepath
+gsave fill grestore stroke
+-8.34605 47.58096 moveto
+(\022) cmmi10 9.96265 fshow
+-8.04022 -27.3122 moveto
+( ) cmmi10 9.96265 fshow
+52.68236 -24.51909 moveto
+(\022) cmmi10 9.96265 fshow
+30.10892 21.88089 moveto
+(\036) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 1246 3481 a Fs(Figure)j(5)p Fu(:)37 b(Orien)n(tation)26
+b(of)i(the)g(observ)n(er)0 5173 y @beginspecial -64 @llx
+-9 @lly 60 @urx 353 @ury 620 @rwi @setspecial
+%%BeginDocument: anim.1
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-60.7216 54.01521 lineto
+-56.01912 33.86879 lineto
+-35.5998 -2.59695 lineto
+-26.17119 -7.60794 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath fill
+ 0 setgray
+newpath 31.38417 28.01994 moveto
+-6.19823 51.40517 lineto
+-41.97015 28.40355 lineto
+-26.17119 -7.60794 lineto
+18.01135 -7.9353 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath fill
+ 0 setgray
+newpath 54.259 33.37036 moveto
+54.37656 53.62486 lineto
+31.38417 28.01994 lineto
+18.01135 -7.9353 lineto
+32.75333 -3.0823 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath fill
+ 0 setgray
+newpath -41.97015 28.40355 moveto
+-6.19823 51.40517 lineto
+-4.64227 91.221 lineto
+-38.32088 91.61578 lineto
+-60.7216 54.01521 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath fill
+ 0 setgray
+newpath -6.19823 51.40517 moveto
+31.38417 28.01994 lineto
+54.37656 53.62486 lineto
+32.61066 91.55344 lineto
+-4.64227 91.221 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath fill
+ 0 setgray
+newpath 20.5737 92.11674 moveto
+-21.33087 92.14589 lineto
+-38.32088 91.61578 lineto
+-4.64227 91.221 lineto
+32.61066 91.55344 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+17.85571 237.19475 lineto
+15.0942 247.00903 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+-38.08377 290.83273 lineto
+-63.19696 303.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath -39.677 241.42 moveto
+15.0942 247.00903 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+26.71532 317.29495 lineto
+-38.08377 290.83273 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+58.96852 281.13652 lineto
+26.71532 317.29495 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 15.0942 247.00903 moveto
+17.85571 237.19475 lineto
+58.96852 281.13652 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -63.19696 303.71031 moveto
+-38.08377 290.83273 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath -38.08377 290.83273 moveto
+26.71532 317.29495 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+58.96852 281.13652 lineto
+35.79742 344.3768 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath fill
+ 0 setgray
+newpath 26.71532 317.29495 moveto
+35.79742 344.3768 lineto
+-24.1127 352.41925 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath fill
+ 0 setgray
+newpath -25.76637 167.44743 moveto
+18.56937 167.63895 lineto
+-2.24568 197.28311 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+18.56937 167.63895 lineto
+-25.76637 167.44743 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath fill
+ 0 setgray
+newpath -2.22827 135.05194 moveto
+20.26825 164.69673 lineto
+18.56937 167.63895 lineto
+ closepath stroke
+newpath 2.49242 -0.00175 moveto
+2.49242 0.65881 2.23 1.29231 1.76291 1.7594 curveto
+1.29582 2.22649 0.66232 2.4889 0.00175 2.4889 curveto
+-0.65881 2.4889 -1.29231 2.22649 -1.7594 1.7594 curveto
+-2.22649 1.29231 -2.4889 0.65881 -2.4889 -0.00175 curveto
+-2.4889 -0.66232 -2.22649 -1.29582 -1.7594 -1.76291 curveto
+-1.29231 -2.23 -0.65881 -2.49242 0.00175 -2.49242 curveto
+0.66232 -2.49242 1.29582 -2.23 1.76291 -1.76291 curveto
+2.23 -1.29582 2.49242 -0.66232 2.49242 -0.00175 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -2.20303 43.50117 moveto
+1.35403 47.26656 lineto stroke
+ [] 0 setdash
+newpath -0.07095 43.52895 moveto
+1.35403 47.26656 lineto
+-2.29651 45.63136 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-62.25195 43.74171 lineto stroke
+ [] 0 setdash
+newpath -58.55077 45.25749 moveto
+-62.25195 43.74171 lineto
+-58.56303 42.19633 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -2.20303 43.50117 moveto
+-2.21994 104.30948 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -0.68816 100.6144 moveto
+-2.21994 104.30948 lineto
+-3.74968 100.61354 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EndDocument
+ @endspecial 829 w @beginspecial -68 @llx -12 @lly 57
+@urx 349 @ury 625 @rwi @setspecial
+%%BeginDocument: anim.2
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-58.40764 61.08926 lineto
+-52.27348 40.92462 lineto
+-37.68939 2.16019 lineto
+-33.747 -4.42633 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath fill
+ 0 setgray
+newpath 24.70987 22.78036 moveto
+-10.70743 50.94922 lineto
+-46.89163 33.08153 lineto
+-33.747 -4.42633 lineto
+9.34586 -10.90018 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath fill
+ 0 setgray
+newpath 55.70592 25.56766 moveto
+54.23592 45.4547 lineto
+24.70987 22.78036 lineto
+9.34586 -10.90018 lineto
+29.10857 -7.80455 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath fill
+ 0 setgray
+newpath -46.89163 33.08153 moveto
+-10.70743 50.94922 lineto
+-1.46478 90.4717 lineto
+-31.3017 95.39561 lineto
+-58.40764 61.08926 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath fill
+ 0 setgray
+newpath -10.70743 50.94922 moveto
+24.70987 22.78036 lineto
+54.23592 45.4547 lineto
+38.25067 86.23784 lineto
+-1.46478 90.4717 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath fill
+ 0 setgray
+newpath 30.97842 88.71394 moveto
+-10.18344 94.11969 lineto
+-31.3017 95.39561 lineto
+-1.46478 90.4717 lineto
+38.25067 86.23784 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+17.97495 241.2484 lineto
+7.23056 242.4668 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+-48.3909 282.502 lineto
+-66.68076 302.42326 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath -42.04855 240.3242 moveto
+7.23056 242.4668 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+14.48093 310.91444 lineto
+-48.3909 282.502 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+54.13312 282.45135 lineto
+14.48093 310.91444 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath fill
+ 0 setgray
+newpath 7.23056 242.4668 moveto
+17.97495 241.2484 lineto
+54.13312 282.45135 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -66.68076 302.42326 moveto
+-48.3909 282.502 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath -48.3909 282.502 moveto
+14.48093 310.91444 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+54.13312 282.45135 lineto
+29.87636 346.89992 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath fill
+ 0 setgray
+newpath 14.48093 310.91444 moveto
+29.87636 346.89992 lineto
+-33.87617 348.49208 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath 7.3686 167.81244 moveto
+14.6936 164.909 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath fill
+ 0 setgray
+newpath -36.14781 167.26599 moveto
+7.3686 167.81244 lineto
+-10.28217 197.26285 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+7.3686 167.81244 lineto
+-36.14781 167.26599 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath fill
+ 0 setgray
+newpath -10.20235 135.0931 moveto
+14.6936 164.909 lineto
+7.3686 167.81244 lineto
+ closepath stroke
+newpath 2.4792 0.00705 moveto
+2.4792 0.66762 2.21678 1.30112 1.7497 1.7682 curveto
+1.28261 2.23529 0.64911 2.49771 -0.01146 2.49771 curveto
+-0.67203 2.49771 -1.30553 2.23529 -1.77261 1.7682 curveto
+-2.2397 1.30112 -2.50212 0.66762 -2.50212 0.00705 curveto
+-2.50212 -0.65352 -2.2397 -1.28702 -1.77261 -1.7541 curveto
+-1.30553 -2.22119 -0.67203 -2.48361 -0.01146 -2.48361 curveto
+0.64911 -2.48361 1.28261 -2.22119 1.7497 -1.7541 curveto
+2.21678 -1.28702 2.4792 -0.65352 2.4792 0.00705 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -6.61095 43.56754 moveto
+4.01413 47.28503 lineto stroke
+ [] 0 setdash
+newpath 1.0315 44.6197 moveto
+4.01413 47.28503 lineto
+0.02042 47.50948 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-65.25195 44.28316 lineto stroke
+ [] 0 setdash
+newpath -61.53806 45.76872 moveto
+-65.25195 44.28316 lineto
+-61.57541 42.70741 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -6.61095 43.56754 moveto
+-6.66168 104.37543 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -5.12784 100.68123 moveto
+-6.66168 104.37543 lineto
+-8.18936 100.67867 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EndDocument
+ @endspecial 832 w @beginspecial -70 @llx -15 @lly 56
+@urx 350 @ury 630 @rwi @setspecial
+%%BeginDocument: anim.3
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath fill
+ 0 setgray
+newpath 16.80681 16.99638 moveto
+-15.52559 49.47597 lineto
+-50.85753 37.04466 lineto
+-40.4291 -1.23546 lineto
+0.20456 -13.71031 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath fill
+ 0 setgray
+newpath 55.35011 17.15427 moveto
+52.05627 36.27171 lineto
+16.80681 16.99638 lineto
+0.20456 -13.71031 lineto
+24.52193 -12.437 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath fill
+ 0 setgray
+newpath -50.85753 37.04466 moveto
+-15.52559 49.47597 lineto
+1.0295 88.12372 lineto
+-24.1016 97.59258 lineto
+-54.96175 67.00015 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath fill
+ 0 setgray
+newpath -15.52559 49.47597 moveto
+16.80681 16.99638 lineto
+52.05627 36.27171 lineto
+42.2704 79.34215 lineto
+1.0295 88.12372 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath fill
+ 0 setgray
+newpath 40.18736 83.80806 moveto
+0.77538 94.59879 lineto
+-24.1016 97.59258 lineto
+1.0295 88.12372 lineto
+42.2704 79.34215 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+-57.01149 274.39024 lineto
+-69.46364 301.02345 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath -42.36235 240.14241 moveto
+1.06075 238.78436 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+1.96469 304.05075 lineto
+-57.01149 274.39024 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+48.8186 284.05615 lineto
+1.96469 304.05075 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath fill
+ 0 setgray
+newpath 1.06075 238.78436 moveto
+19.06789 246.21735 lineto
+48.8186 284.05615 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -69.46364 301.02345 moveto
+-57.01149 274.39024 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath -57.01149 274.39024 moveto
+1.96469 304.05075 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+48.8186 284.05615 lineto
+21.89719 348.58525 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath fill
+ 0 setgray
+newpath 1.96469 304.05075 moveto
+21.89719 348.58525 lineto
+-44.4021 343.49475 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -3.48651 167.90521 moveto
+9.3347 165.08533 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath fill
+ 0 setgray
+newpath -45.35768 167.00255 moveto
+-3.48651 167.90521 lineto
+-17.6529 197.14261 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+-3.48651 167.90521 lineto
+-45.35768 167.00255 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath fill
+ 0 setgray
+newpath -17.51752 135.13754 moveto
+9.3347 165.08533 lineto
+-3.48651 167.90521 lineto
+ closepath stroke
+newpath 2.49773 -0.00089 moveto
+2.49773 0.65968 2.2353 1.29318 1.76822 1.76027 curveto
+1.30113 2.22736 0.66763 2.48978 0.00706 2.48978 curveto
+-0.6535 2.48978 -1.287 2.22736 -1.75409 1.76027 curveto
+-2.22118 1.29318 -2.4836 0.65968 -2.4836 -0.00089 curveto
+-2.4836 -0.66145 -2.22118 -1.29495 -1.75409 -1.76204 curveto
+-1.287 -2.22913 -0.6535 -2.49155 0.00706 -2.49155 curveto
+0.66763 -2.49155 1.30113 -2.22913 1.76822 -1.76204 curveto
+2.2353 -1.29495 2.49773 -0.66145 2.49773 -0.00089 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -10.89844 43.68222 moveto
+6.65823 47.29353 lineto stroke
+ [] 0 setdash
+newpath 3.34695 45.04964 moveto
+6.65823 47.29353 lineto
+2.73013 48.04836 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-67.24995 44.8544 lineto stroke
+ [] 0 setdash
+newpath -63.52336 46.30801 moveto
+-67.24995 44.8544 lineto
+-63.58702 43.2471 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -10.89844 43.68222 moveto
+-10.98207 104.49692 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -9.44606 100.80312 moveto
+-10.98207 104.49692 lineto
+-12.50792 100.7989 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EndDocument
+ @endspecial 837 w @beginspecial -73 @llx -18 @lly 54
+@urx 350 @ury 635 @rwi @setspecial
+%%BeginDocument: anim.4
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath fill
+ 0 setgray
+newpath 7.59955 10.80762 moveto
+-20.97694 47.04895 lineto
+-54.1671 40.26668 lineto
+-46.24283 1.92815 lineto
+-9.26555 -16.27017 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+47.54732 26.23619 lineto
+7.59955 10.80762 lineto
+-9.26555 -16.27017 lineto
+19.07965 -16.8529 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath fill
+ 0 setgray
+newpath -54.1671 40.26668 moveto
+-20.97694 47.04895 lineto
+2.23363 84.23103 lineto
+-17.39175 98.19728 lineto
+-50.93253 71.72728 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath fill
+ 0 setgray
+newpath -20.97694 47.04895 moveto
+7.59955 10.80762 lineto
+47.54732 26.23619 lineto
+44.09486 70.93459 lineto
+2.23363 84.23103 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath fill
+ 0 setgray
+newpath 52.9991 8.2899 moveto
+52.85178 39.73671 lineto
+47.60143 77.42984 lineto
+44.09486 70.93459 lineto
+47.54732 26.23619 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath fill
+ 0 setgray
+newpath 47.60143 77.42984 moveto
+10.90344 93.56757 lineto
+-17.39175 98.19728 lineto
+2.23363 84.23103 lineto
+44.09486 70.93459 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -40.85495 240.93068 moveto
+-3.34824 236.13675 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+-10.31633 296.91393 lineto
+-63.64687 266.714 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+42.99202 285.88174 lineto
+-10.31633 296.91393 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath fill
+ 0 setgray
+newpath -3.34824 236.13675 moveto
+20.79428 252.1126 lineto
+42.99202 285.88174 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -71.53963 299.54337 moveto
+-63.64687 266.714 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -63.64687 266.714 moveto
+-10.31633 296.91393 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+42.99202 285.88174 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath fill
+ 0 setgray
+newpath 42.99202 285.88174 moveto
+30.04013 317.65685 lineto
+11.97253 349.28381 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath -10.31633 296.91393 moveto
+11.97253 349.28381 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath fill
+ 0 setgray
+newpath 11.97253 349.28381 moveto
+-27.38483 348.10648 lineto
+-55.23152 337.43776 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -13.53088 167.96365 moveto
+4.5278 165.27698 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath fill
+ 0 setgray
+newpath -53.0076 166.7251 moveto
+-13.53088 167.96365 lineto
+-23.99298 197.01134 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+-13.53088 167.96365 lineto
+-53.0076 166.7251 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath fill
+ 0 setgray
+newpath -23.80833 135.21603 moveto
+4.5278 165.27698 lineto
+-13.53088 167.96365 lineto
+ closepath stroke
+newpath 2.49155 0.00531 moveto
+2.49155 0.66588 2.22913 1.29938 1.76204 1.76646 curveto
+1.29495 2.23355 0.66145 2.49597 0.00089 2.49597 curveto
+-0.65968 2.49597 -1.29318 2.23355 -1.76027 1.76646 curveto
+-2.22736 1.29938 -2.48978 0.66588 -2.48978 0.00531 curveto
+-2.48978 -0.65526 -2.22736 -1.28876 -1.76027 -1.75584 curveto
+-1.29318 -2.22293 -0.65968 -2.48535 0.00089 -2.48535 curveto
+0.66145 -2.48535 1.29495 -2.22293 1.76204 -1.75584 curveto
+2.22913 -1.28876 2.49155 -0.65526 2.49155 0.00531 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -15.05333 43.85922 moveto
+9.20341 47.31767 lineto stroke
+ [] 0 setdash
+newpath 5.76093 45.2806 moveto
+9.20341 47.31767 lineto
+5.3288 48.31151 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-68.28326 45.46832 lineto stroke
+ [] 0 setdash
+newpath -64.54356 46.8866 moveto
+-68.28326 45.46832 lineto
+-64.63606 43.82675 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -15.05333 43.85922 moveto
+-15.16887 104.67435 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -13.63092 100.98135 moveto
+-15.16887 104.67435 lineto
+-16.69278 100.97552 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EndDocument
+ @endspecial 842 w @beginspecial -74 @llx -22 @lly 57
+@urx 352 @ury 655 @rwi @setspecial
+%%BeginDocument: anim.5
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath fill
+ 0 setgray
+newpath -2.79128 4.3378 moveto
+-27.24666 43.69762 lineto
+-57.05525 42.69945 lineto
+-51.15636 4.99045 lineto
+-18.78836 -18.52954 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+40.64778 15.51149 lineto
+-2.79128 4.3378 lineto
+-18.78836 -18.52954 lineto
+13.00822 -20.96506 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath fill
+ 0 setgray
+newpath -57.05525 42.69945 moveto
+-27.24666 43.69762 lineto
+1.69247 78.78209 lineto
+-11.74504 97.18791 lineto
+-46.7815 75.21912 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath fill
+ 0 setgray
+newpath -27.24666 43.69762 moveto
+-2.79128 4.3378 lineto
+40.64778 15.51149 lineto
+43.3176 61.06078 lineto
+1.69247 78.78209 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath fill
+ 0 setgray
+newpath 48.68602 -0.8737 moveto
+55.74875 32.1639 lineto
+52.76607 69.58298 lineto
+43.3176 61.06078 lineto
+40.64778 15.51149 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath fill
+ 0 setgray
+newpath 52.76607 69.58298 moveto
+19.67119 91.01648 lineto
+-11.74504 97.18791 lineto
+1.69247 78.78209 lineto
+43.3176 61.06078 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -37.72517 242.65907 moveto
+-5.96199 234.57092 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+-21.7873 289.62483 lineto
+-68.02747 259.64507 lineto
+ closepath stroke
+ 0.70589 0.99608 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+36.74194 288.00768 lineto
+-21.7873 289.62483 lineto
+ closepath stroke
+ 0.27058 0.81569 0.25098 setrgbcolor
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath fill
+ 0 setgray
+newpath -5.96199 234.57092 moveto
+22.87648 258.89992 lineto
+36.74194 288.00768 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -72.81863 298.03569 moveto
+-68.02747 259.64507 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -68.02747 259.64507 moveto
+-21.7873 289.62483 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+36.74194 288.00768 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0.60785 0.28627 setrgbcolor
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath fill
+ 0 setgray
+newpath 36.74194 288.00768 moveto
+27.30992 325.58543 lineto
+0.4442 348.88733 lineto
+ closepath stroke
+ 0.70589 0 0 setrgbcolor
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath -21.7873 289.62483 moveto
+0.4442 348.88733 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath fill
+ 0 setgray
+newpath 0.4442 348.88733 moveto
+-32.9949 350.83015 lineto
+-65.77263 330.44775 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -22.29236 168.01274 moveto
+0.63905 165.49756 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath fill
+ 0 setgray
+newpath -58.72351 166.46785 moveto
+-22.29236 168.01274 lineto
+-28.91785 196.86642 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+-22.29236 168.01274 lineto
+-58.72351 166.46785 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath fill
+ 0 setgray
+newpath -28.69435 135.3288 moveto
+0.63905 165.49756 lineto
+-22.29236 168.01274 lineto
+ closepath stroke
+newpath 2.49864 0.00887 moveto
+2.49864 0.66943 2.23622 1.30293 1.76913 1.77002 curveto
+1.30205 2.2371 0.66855 2.49953 0.00798 2.49953 curveto
+-0.65259 2.49953 -1.28609 2.2371 -1.75317 1.77002 curveto
+-2.22026 1.30293 -2.48268 0.66943 -2.48268 0.00887 curveto
+-2.48268 -0.6517 -2.22026 -1.2852 -1.75317 -1.75229 curveto
+-1.28609 -2.21938 -0.65259 -2.4818 0.00798 -2.4818 curveto
+0.66855 -2.4818 1.30205 -2.21938 1.76913 -1.75229 curveto
+2.23622 -1.2852 2.49864 -0.6517 2.49864 0.00887 curveto closepath fill
+ 1 0 0 setrgbcolor 0 0.3985 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap
+newpath -18.98454 44.09567 moveto
+11.65569 47.35223 lineto stroke
+ [] 0 setdash
+newpath 8.14252 45.43936 moveto
+11.65569 47.35223 lineto
+7.81891 48.48389 lineto
+ closepath
+gsave fill grestore stroke
+ 0 1 0 setrgbcolor [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-68.329 46.1137 lineto stroke
+ [] 0 setdash
+newpath -64.57408 47.49214 moveto
+-68.329 46.1137 lineto
+-64.6992 44.43321 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0 1 setrgbcolor 0.3985
+ 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath -18.98454 44.09567 moveto
+-19.13023 104.91757 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath -17.59064 101.22575 moveto
+-19.13023 104.91757 lineto
+-20.65216 101.21843 lineto
+ closepath
+gsave fill grestore stroke
+showpage
+%%EndDocument
+ @endspecial 1247 5355 a Fs(Figure)j(6)p Fu(:)37 b(Fiv)n(e)27
+b(views)g(of)h(an)f(animation)p eop
+%%Page: 280 7
+280 6 bop 0 -149 a Fu(280)2470 b(TUGb)r(oat,)28 b(V)-7
+b(olume)27 b(18)g(\(1997\),)f(No.)i(4)0 100 y Fs(F)-8
+b(uture)0 232 y Fu(It)22 b(is)g(quite)g(easy)e(to)i(impro)n(v)n(e)e
+(and)i(extend)g(the)g Fp(3d)f Fu(macros)0 332 y(but)46
+b(the)f(author)f(decided)h(to)g(go)f(no)g(further)h(for)g(the)0
+432 y(momen)n(t.)k(Other)32 b(ob)5 b(jects)31 b(can)g(b)r(e)i(implemen)
+n(ted)f(easily)0 531 y(and)g(new)f(algorithms)g(can)g(b)r(e)h(added.)49
+b(F)-7 b(or)31 b(instance)h(in)0 631 y(order)25 b(to)i(tak)n(e)f(ligh)n
+(t)g(sources)g(or)f(shado)n(ws)g(in)n(to)i(accoun)n(t,)0
+731 y(one)46 b(can)g(compute)h(the)g(angles)e(under)i(whic)n(h)f(a)g
+(face)0 830 y(gets)33 b(its)h(ligh)n(t,)h(and)e(the)h(angle)f(under)h
+(whic)n(h)f(this)h(v)n(ery)0 930 y(face)40 b(is)g(seen,)k(in)c(order)f
+(to)i(decide)f(ho)n(w)g(m)n(uc)n(h)g(dark)n(er)0 1029
+y(or)f(ligh)n(ter)g(it)h(m)n(ust)g(b)r(e)g(rendered.)72
+b(Another)40 b(problem)0 1129 y(is)46 b(to)g(represen)n(t)f(o)n(v)n
+(erlapping)f(ob)5 b(jects)46 b(correctly)-7 b(.)92 b(In)0
+1229 y(the)40 b(curren)n(t)f(implemen)n(tation,)j(eac)n(h)d(ob)5
+b(ject)40 b(is)f(dra)n(wn)0 1328 y(indep)r(enden)n(tly)f(from)f(the)h
+(other)e(ob)5 b(jects,)40 b(so)c(that)i(the)0 1428 y(o)n(v)n(erlapping)
+48 b(ma)n(y)h(b)r(e)h(wrong.)103 b(One)50 b(solution)f(is)h(to)0
+1528 y(sort)30 b(all)g(the)h(faces)g(according)d(to)j(their)g(distance)
+f(to)h(the)0 1627 y(observ)n(er)18 b(and,)j(if)f(t)n(w)n(o)g(faces)f
+(can)h(not)f(b)r(e)i(ordered,)f(to)g(split)0 1727 y(them.)53
+b(Then,)34 b(the)f(faces)f(can)g(b)r(e)h(dra)n(wn)f(starting)g(with)0
+1826 y(the)i(most)f(distan)n(t,)h(and)f(ending)h(with)f(the)h(closest)e
+(one.)0 1926 y(App)r(endix)g(B)f(explains)f(the)i(in)n(ternal)e
+(represen)n(tation)f(of)0 2026 y(the)38 b(ob)5 b(jects)38
+b(and)g(sho)n(ws)f(that)h(this)g(algorithm)f(can)h(b)r(e)0
+2125 y(implemen)n(ted)e(without)g(m)n(uc)n(h)f(surgery)f(to)h(the)h
+(presen)n(t)0 2225 y(co)r(de.)0 2391 y Fs(Ac)m(kno)m(wledgmen)m(ts)0
+2524 y Fu(Thanks)30 b(to)h(John)f(Hobb)n(y)g(who)g(alw)n(a)n(ys)f(answ)
+n(ers)g(all)h(m)n(y)0 2623 y(queries)h(on)g(the)h Fq(MET)n(AF)l(ONT)j
+Fu(mailing)c(list.)49 b(Thanks)31 b(to)0 2723 y(Alain)37
+b(Filb)r(ois)f(who)g(help)r(ed)h(me)g(with)g(the)g(shell)f(script)0
+2823 y(syn)n(tax,)j(to)f(Thomas)f(Lam)n(b)r(olais)f(and)i(Thomas)f
+(Genet)0 2922 y(who)d(ga)n(v)n(e)e(some)i(feedbac)n(k)f(on)h(this)g(w)n
+(ork,)h(and)e(to)h(Do-)0 3022 y(minique)29 b(Larc)n(hey)d(who)i(p)r
+(oin)n(ted)h(out)f(a)g(shortcoming)f(in)0 3122 y(the)34
+b(conclusion.)55 b(Thanks)33 b(to)g(Denis)h(Barbier)f(who)g(w)n(as)0
+3221 y(one)19 b(of)h(the)g(\014rst)g(users)f(of)h(these)f(macros)g(and)
+g(con)n(tributed)0 3321 y(the)k(animated)f(cra)n(y)n(ons)d(in)k(the)f
+(distribution.)36 b(Thanks)21 b(to)0 3421 y(Bogus )-23
+b(la)n(w)31 b(Jac)n(k)n(o)n(wski)f(who)i(made)h(v)-5
+b(aluable)32 b(commen)n(ts)0 3520 y(on)49 b(some)g(p)r(eculiarities)g
+(of)h(the)g(co)r(de.)102 b(And)50 b(\014nally)-7 b(,)0
+3620 y(sp)r(ecial)31 b(thanks)f(to)h(Ulrik)f(Vieth)i(who)f(not)f(only)h
+(pushed)0 3719 y(me)k(to)g(p)r(olish)g(m)n(y)f(co)r(de)h(and)f(this)i
+(pap)r(er)e(more)g(than)h(I)0 3819 y(had)30 b(\014rst)f(in)n(tended,)i
+(but)f(also)f(made)h(it)g(p)r(ossible)g(to)f(use)0 3919
+y Fq(MET)n(AP)t(OST)g Fu(under)f Fp(web2c)p Fu(.)0 4085
+y Fs(References)0 4218 y Fu(Da)n(vidsen,)56 b(Bill.)51
+b(\\NETPBM".)f(1993.)f(Av)-5 b(ailable)51 b(for)125 4317
+y(instance)j(at)h Fp(ftp://ftp.wustl.)o(edu)o(/g)o(ra)o(phi)o(cs)o(/)
+125 4417 y(graphics/packag)o(es)o(/Ne)o(tP)o(BM)p Fu(.)0
+4577 y(Go)r(ossens,)f(Mic)n(hel,)i(S.)50 b(Rah)n(tz,)55
+b(and)50 b(F.)g(Mittelbac)n(h.)125 4677 y Fo(The)36 b(L)327
+4660 y Fe(A)354 4677 y Fo(T)399 4692 y(E)445 4677 y(X)f(Gr)l(aphics)j
+(Comp)l(anion)p Fu(.)e(Addison-W)-7 b(es-)125 4777 y(ley)g(,)27
+b(Reading,)g(MA,)h(USA,)h(1997.)0 4937 y(Hobb)n(y)-7
+b(,)36 b(John)e(D.)h(\\A)f(User's)g(Man)n(ual)g(for)g(MetaP)n(ost".)125
+5037 y(T)-7 b(ec)n(hnical)27 b(Rep)r(ort)h(162,)f(A)-7
+b(T&T)28 b(Bell)g(Lab)r(oratories,)125 5136 y(Murra)n(y)d(Hill,)k(New)e
+(Jersey)-7 b(,)27 b(1992.)0 5297 y(Kn)n(uth,)j(Donald)g(E.)f(\\MFT,)g
+(v)n(ersion)f(2.0".)h(1989.)e(Stan-)125 5396 y(dard)f(T)364
+5412 y(E)411 5396 y(X)i(distribution.)2017 100 y(Kn)n(uth,)37
+b(Donald)d(E.)g Fo(The)j(A)n(rt)e(of)i(Computer)f(Pr)l(o)l(gr)l(am-)
+2142 199 y(ming,)29 b(volumes)f(1,)i(2)e(and)g(3)p Fu(.)f(Addison-W)-7
+b(esley)25 b(Pub-)2142 299 y(lishing)i(Compan)n(y)-7
+b(,)27 b(1997.)f(New)i(editions.)2017 404 y(M)r(\177)-44
+b(uller,)95 b(Ren)n(\023)-39 b(e)81 b(K.)g(\\GIFMerge,)93
+b(v)n(ersion)80 b(1.33".)2142 504 y(1996.)45 b(Av)-5
+b(ailable)47 b(at)g Fp(http://www.iis.e)o(e.)o(eth)o(z.)2142
+604 y(ch/~kiwi/GIFMerg)o(e/)p Fu(.)2017 770 y Fs(App)s(endix)32
+b(A)2017 869 y(Summary)f(of)g(the)h Fp(3d)f Fs(pac)m(k)-5
+b(age)2017 1002 y(T)m(yp)s(es)47 b Fu(The)32 b(commands)f(in)h(the)g
+Fp(3d)g Fu(pac)n(k)-5 b(age)30 b(tak)n(e)h(pa-)2017 1102
+y(rameters)k(of)h(sev)n(eral)f(di\013eren)n(t)h(t)n(yp)r(es.)63
+b(The)36 b(t)n(yp)r(es)h(are)2017 1201 y(describ)r(ed)28
+b(here.)2100 1324 y Fg(\017)41 b Fu(An)34 b Fg(h)p Fo(avn)6
+b Fg(i)34 b Fu(\()p Fo(A)n(bsolute)h(V)-6 b(e)l(ctor)34
+b(Numb)l(er)9 b Fu(\))32 b(is)h(the)h(in-)2183 1423 y(ternal)c(n)n(um)n
+(b)r(er)f(iden)n(tifying)h(a)f(v)n(ector)f(in)i(the)g
+Fp(vect)2183 1523 y Fu(arra)n(y)c(\(an)h(in)n(teger\).)2100
+1634 y Fg(\017)41 b Fu(An)32 b Fg(h)p Fo(apn)6 b Fg(i)32
+b Fu(\()p Fo(A)n(bsolute)h(Point)g(Numb)l(er)9 b Fu(\))30
+b(refers)g(to)h(a)2183 1734 y(v)n(ector)20 b(in)i(the)g(same)e(w)n(a)n
+(y)h(as)f(an)h Fg(h)p Fo(avn)6 b Fg(i)23 b Fu(\(an)e(in)n(teger\).)2100
+1846 y Fg(\017)41 b Fu(A)21 b Fg(h)p Fo(lpn)6 b Fg(i)22
+b Fu(\()p Fo(L)l(o)l(c)l(al)i(Point)g(Numb)l(er)9 b Fu(\))20
+b(is)g(a)g(n)n(um)n(b)r(er)h(iden-)2183 1945 y(tifying)40
+b(a)e(p)r(oin)n(t)h Fo(within)47 b Fu(an)38 b(ob)5 b(ject)39
+b(\(an)g(in)n(teger\).)2183 2045 y(Tw)n(o)23 b Fg(h)p
+Fo(lpn)6 b Fg(i)p Fu(s)25 b(with)f(the)g(same)f(v)-5
+b(alue)23 b(can)g(corresp)r(ond)2183 2144 y(to)28 b(di\013eren)n(t)g(p)
+r(oin)n(ts)f(in)h(di\013eren)n(t)g(ob)5 b(jects.)2100
+2256 y Fg(\017)41 b Fu(An)19 b Fg(h)p Fo(afn)6 b Fg(i)20
+b Fu(\()p Fo(A)n(bsolute)i(F)-6 b(ac)l(e)21 b(Numb)l(er)9
+b Fu(\))18 b(is)g(the)h(in)n(ternal)2183 2356 y(n)n(um)n(b)r(er)28
+b(iden)n(tifying)g(a)f(face.)2100 2467 y Fg(\017)41 b
+Fu(A)28 b Fg(h)p Fo(lfn)6 b Fg(i)29 b Fu(\()p Fo(L)l(o)l(c)l(al)h(F)-6
+b(ac)l(e)30 b(Numb)l(er)9 b Fu(\))27 b(is)g(a)g(n)n(um)n(b)r(er)g
+(iden-)2183 2567 y(tifying)47 b(a)e(face)h Fo(within)53
+b Fu(an)46 b(ob)5 b(ject)45 b(\(an)h(in)n(teger\).)2183
+2666 y(As)37 b(for)e(p)r(oin)n(ts,)k(t)n(w)n(o)c Fg(h)p
+Fo(lfn)6 b Fg(i)p Fu(s)38 b(with)e(the)h(same)f(v)-5
+b(alue)2183 2766 y(can)44 b(corresp)r(ond)f(to)h(di\013eren)n(t)g
+(faces)g(in)g(di\013eren)n(t)2183 2866 y(ob)5 b(jects.)2100
+2977 y Fg(\017)41 b Fu(A)34 b Fg(h)p Fo(cl)9 b Fg(i)34
+b Fu(\()p Fo(Class)7 b Fu(\))34 b(is)g(a)e(string)h(represen)n(ting)f
+(a)g(class,)2183 3077 y(for)e(instance)g Fp("tetrahedron")p
+Fu(.)39 b(It)31 b(ma)n(y)e(only)h(con-)2183 3176 y(tain)e(letters)g
+(and)f(underscores.)2100 3288 y Fg(\017)41 b Fu(An)f
+Fg(h)p Fo(obj)12 b Fg(i)42 b Fu(\()p Fo(Obje)l(ct)8 b
+Fu(\))40 b(is)f(a)g(string)g(represen)n(ting)f(an)2183
+3388 y(ob)5 b(ject,)38 b(that)e(is)g(an)g(instance)f(of)h(a)f(class.)61
+b(Suc)n(h)36 b(a)2183 3487 y(string)19 b(ma)n(y)g(only)g(con)n(tain)g
+(letters)g(and)g(underscores.)2100 3599 y Fg(\017)41
+b Fu(A)31 b Fg(h)p Fo(vl)9 b Fg(i)30 b Fu(\()p Fo(V)-6
+b(ertex)31 b(List)8 b Fu(\))30 b(is)g(a)g(list)g(of)g(in)n(tegers,)f
+(where)2183 3698 y(eac)n(h)36 b(in)n(teger)g(iden)n(ti\014es)g(a)g(v)n
+(ertex.)63 b(F)-7 b(or)36 b(instance,)2183 3798 y Fp(1,7)27
+b Fu(is)g(the)h(list)g(of)g(v)n(ertices)e(1)h(and)h(7.)2100
+3910 y Fg(\017)41 b Fu(A)c Fg(h)p Fo(vsl)9 b Fg(i)38
+b Fu(\()p Fo(V)-6 b(ertex)37 b(String)g(List)8 b Fu(\))37
+b(is)f(a)h(string)e(corre-)2183 4009 y(sp)r(onding)20
+b(to)g(a)f(list)i(of)f(in)n(tegers,)g(where)f(eac)n(h)g(in)n(teger)2183
+4109 y(iden)n(ti\014es)32 b(a)e(v)n(ertex.)47 b(F)-7
+b(or)30 b(instance,)i Fp("1,2,6,5")c Fu(is)2183 4208
+y(the)g(list)g(of)g(v)n(ertices)e(1,)i(2,)f(6)g(and)g(5.)2100
+4320 y Fg(\017)41 b(h)p Fo(hc)5 b Fg(i)23 b Fu(\()p Fo(Hex)h(Color)9
+b Fu(\))23 b(is)f(a)f(string)g(represen)n(ting)f(a)h(color)2183
+4420 y(with)41 b(the)g(three)g(R)n(GB)f(comp)r(onen)n(ts)g(in)g
+(hexadec-)2183 4519 y(imal)45 b(and)f(in)g(the)h(range)e(0)p
+Fn(::)p Fu(255.)85 b(F)-7 b(or)44 b(instance,)2183 4619
+y Fp("b4fe40")p Fu(.)2100 4730 y Fg(\017)d(h)p Fo(c)l(ol)9
+b Fg(i)24 b Fu(\()p Fo(Color)9 b Fu(\))25 b(is)e(a)f(standard)g
+Fq(MET)n(AP)t(OST)i Fu(color)e(\(a)2183 4830 y(triplet)33
+b(of)g(R)n(GB)g(comp)r(onen)n(ts)f(in)h(the)g(range)e(0)p
+Fn(::)p Fu(1\),)2183 4930 y(suc)n(h)d(as)f Fp(red)p Fu(.)2100
+5041 y Fg(\017)41 b(h)p Fo(str)9 b Fg(i)28 b Fu(\()p
+Fo(String)7 b Fu(\))28 b(is)g(a)f(string.)2100 5153 y
+Fg(\017)41 b(h)p Fo(p)l(air)9 b Fg(i)30 b Fu(\()p Fo(Pair)9
+b Fu(\))29 b(is)f(a)f(pair)g(of)g(n)n(umerics.)2100 5264
+y Fg(\017)41 b(h)p Fo(num)6 b Fg(i)28 b Fu(\()p Fo(Numeric)5
+b Fu(\))28 b(is)g(a)f(n)n(um)n(b)r(er.)2100 5376 y Fg(\017)41
+b(h)p Fo(b)l(o)l(ol)9 b Fg(i)29 b Fu(\()p Fo(Bo)l(ole)l(an)6
+b Fu(\))30 b(is)e(a)f(b)r(o)r(olean.)p eop
+%%Page: 281 8
+281 7 bop 0 -149 a Fu(TUGb)r(oat,)28 b(V)-7 b(olume)28
+b(18)e(\(1997\),)h(No.)g(4)2471 b(281)0 100 y Fs(Lo)m(w)32
+b(lev)m(el)f(v)m(ector)i(commands)45 b Fu(The)32 b(lo)n(w)h(lev)n(el)f
+(v)n(ec-)0 199 y(tor)24 b(commands)f(de\014ne)i(the)g(classical)d(op)r
+(erations)h(in)i(v)n(ec-)0 299 y(tor)i(algebra.)83 428
+y Fg(\017)41 b Fp(vect_def\()p Fg(h)p Fo(avn)6 b Fg(i)p
+Fp(,)p Fn(x)p Fp(,)p Fn(y)s Fp(,)p Fn(z)t Fp(\))p Fu(:)44
+b(de\014nes)34 b(v)n(ector)e Fg(h)p Fo(avn)6 b Fg(i)166
+528 y Fu(as)27 b(\()p Fn(x;)14 b(y)s(;)g(z)t Fu(\);)83
+653 y Fg(\017)41 b Fp(set_point)p Fu(;)c(synon)n(ym)f(of)g
+Fp(vect_def)p Fu(:)51 b(a)36 b(p)r(oin)n(t)g(is)166 753
+y(stored)27 b(in)h(the)g(same)f(arra)n(y)e(as)i(v)n(ectors.)83
+878 y Fg(\017)41 b Fp(set_obj_point\()p Fg(h)p Fo(lpn)6
+b Fg(i)p Fp(,)p Fn(x)p Fp(,)p Fn(y)s Fp(,)p Fn(z)t Fp(\))o
+Fu(:)30 b(this)25 b(de\014nes)g(the)166 978 y(p)r(oin)n(t)j
+Fg(h)p Fo(lpn)6 b Fg(i)29 b Fu(as)e(\()p Fn(x;)14 b(y)s(;)g(z)t
+Fu(\);)83 1104 y Fg(\017)41 b Fp(vect_def_vect\()p Fg(h)p
+Fo(avn)6 b Fg(i)979 1116 y Fm(1)1012 1104 y Fp(,)p Fg(h)p
+Fo(avn)g Fg(i)1253 1116 y Fm(2)1291 1104 y Fp(\))p Fu(:)33
+b(v)n(ector)19 b Fg(h)p Fo(avn)6 b Fg(i)1830 1116 y Fm(1)166
+1203 y Fu(b)r(ecomes)27 b(equal)g(to)h(v)n(ector)e Fg(h)p
+Fo(avn)6 b Fg(i)1263 1215 y Fm(2)1302 1203 y Fu(;)83
+1329 y Fg(\017)41 b Fp(vect_sum\()p Fg(h)p Fo(avn)6 b
+Fg(i)759 1341 y Fm(1)794 1329 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1035 1341 y Fm(2)1073 1329 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1314 1341 y Fm(3)1352 1329 y Fp(\))p Fu(:)68 b(the)44
+b(v)n(ector)166 1428 y Fg(h)p Fo(avn)6 b Fg(i)363 1440
+y Fm(1)432 1428 y Fu(b)r(ecomes)29 b(the)h(sum)g(of)g(v)n(ectors)f
+Fg(h)p Fo(avn)6 b Fg(i)1666 1440 y Fm(2)1734 1428 y Fu(and)166
+1528 y Fg(h)p Fo(avn)g Fg(i)363 1540 y Fm(3)402 1528
+y Fu(.)83 1654 y Fg(\017)41 b Fp(vect_translate\()p Fg(h)p
+Fo(avn)6 b Fg(i)1023 1666 y Fm(1)1055 1654 y Fp(,)p Fg(h)p
+Fo(avn)g Fg(i)1296 1666 y Fm(2)1334 1654 y Fp(\))p Fu(:)68
+b(add)43 b(v)n(ector)166 1753 y Fg(h)p Fo(avn)6 b Fg(i)363
+1765 y Fm(2)430 1753 y Fu(to)29 b(v)n(ector)e Fg(h)p
+Fo(avn)6 b Fg(i)980 1765 y Fm(1)1019 1753 y Fu(;)29 b(v)n(ector)f
+Fg(h)p Fo(avn)6 b Fg(i)1519 1765 y Fm(2)1586 1753 y Fu(remains)166
+1853 y(unc)n(hanged.)83 1979 y Fg(\017)41 b Fp(vect_diff\()p
+Fg(h)p Fo(avn)6 b Fg(i)803 1991 y Fm(1)837 1979 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1078 1991 y Fm(2)1116 1979 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1357 1991 y Fm(3)1396 1979 y Fp(\))p
+Fu(:)39 b(the)29 b(v)n(ector)166 2078 y Fg(h)p Fo(avn)6
+b Fg(i)363 2090 y Fm(1)433 2078 y Fu(b)r(ecomes)31 b(the)h
+(di\013erence)f(b)r(et)n(w)n(een)h(v)n(ectors)166 2178
+y Fg(h)p Fo(avn)6 b Fg(i)363 2190 y Fm(2)429 2178 y Fu(and)28
+b Fg(h)p Fo(avn)6 b Fg(i)788 2190 y Fm(3)826 2178 y Fu(.)83
+2303 y Fg(\017)41 b Fp(vect_dprod\()p Fg(h)p Fo(avn)6
+b Fg(i)847 2315 y Fm(1)881 2303 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1122 2315 y Fm(2)1160 2303 y Fp(\))18 b Fg(!)h(h)p
+Fo(num)6 b Fg(i)p Fu(:)32 b(returns)166 2403 y(the)c(dot)g(pro)r(duct)f
+(of)h(v)n(ectors)e Fg(h)p Fo(avn)6 b Fg(i)1342 2415 y
+Fm(1)1408 2403 y Fu(and)27 b Fg(h)p Fo(avn)6 b Fg(i)1766
+2415 y Fm(2)1805 2403 y Fu(.)83 2529 y Fg(\017)41 b Fp(vect_mod\()p
+Fg(h)p Fo(avn)6 b Fg(i)p Fp(\))29 b Fg(!)i(h)p Fo(num)6
+b Fg(i)p Fu(:)45 b(returns)30 b(the)i(mo)r(d-)166 2628
+y(ulus)c(of)f(v)n(ector)g Fg(h)p Fo(avn)6 b Fg(i)p Fu(.)83
+2754 y Fg(\017)41 b Fp(vect_prod\()p Fg(h)p Fo(avn)6
+b Fg(i)803 2766 y Fm(1)837 2754 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1078 2766 y Fm(2)1116 2754 y Fp(,)p Fg(h)p Fo(avn)g
+Fg(i)1357 2766 y Fm(3)1396 2754 y Fp(\))p Fu(:)39 b(the)29
+b(v)n(ector)166 2853 y Fg(h)p Fo(avn)6 b Fg(i)363 2865
+y Fm(1)439 2853 y Fu(b)r(ecomes)36 b(the)h(v)n(ector)f(pro)r(duct)h(of)
+g(v)n(ectors)166 2953 y Fg(h)p Fo(avn)6 b Fg(i)363 2965
+y Fm(2)429 2953 y Fu(and)28 b Fg(h)p Fo(avn)6 b Fg(i)788
+2965 y Fm(3)826 2953 y Fu(.)83 3079 y Fg(\017)41 b Fp(vect_mult\()p
+Fg(h)p Fo(avn)6 b Fg(i)803 3091 y Fm(1)837 3079 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1078 3091 y Fm(2)1116 3079 y Fp(,)p
+Fg(h)p Fo(num)g Fg(i)p Fp(\))p Fu(:)36 b Fg(h)p Fo(avn)6
+b Fg(i)1690 3091 y Fm(1)1755 3079 y Fu(b)r(e-)166 3178
+y(comes)27 b(v)n(ector)f Fg(h)p Fo(avn)6 b Fg(i)857 3190
+y Fm(2)923 3178 y Fu(scaled)27 b(b)n(y)h Fg(h)p Fo(num)6
+b Fg(i)p Fu(.)83 3304 y Fg(\017)41 b Fp(mid_point\()p
+Fg(h)p Fo(avn)6 b Fg(i)803 3316 y Fm(1)837 3304 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1078 3316 y Fm(2)1116 3304 y Fp(,)p
+Fg(h)p Fo(avn)g Fg(i)1357 3316 y Fm(3)1396 3304 y Fp(\))p
+Fu(:)45 b(v)n(ector)31 b(\(or)166 3403 y(p)r(oin)n(t\))26
+b Fg(h)p Fo(avn)6 b Fg(i)610 3415 y Fm(1)673 3403 y Fu(b)r(ecomes)25
+b(the)g(mid-p)r(oin)n(t)h(of)f(v)n(ectors)166 3503 y(\(or)37
+b(of)g(the)h(line)f(joining)g(the)h(p)r(oin)n(ts\))f
+Fg(h)p Fo(avn)6 b Fg(i)1658 3515 y Fm(2)1734 3503 y Fu(and)166
+3603 y Fg(h)p Fo(avn)g Fg(i)363 3615 y Fm(3)402 3603
+y Fu(.)83 3728 y Fg(\017)41 b Fp(vect_rotate\()p Fg(h)p
+Fo(avn)6 b Fg(i)891 3740 y Fm(1)925 3728 y Fp(,)p Fg(h)p
+Fo(avn)g Fg(i)1166 3740 y Fm(2)1204 3728 y Fp(,)p Fn(a)p
+Fp(\))p Fu(:)32 b(v)n(ector)19 b Fg(h)p Fo(avn)6 b Fg(i)1830
+3740 y Fm(1)166 3828 y Fu(is)26 b(rotated)g(around)g(v)n(ector)f
+Fg(h)p Fo(avn)6 b Fg(i)1264 3840 y Fm(2)1329 3828 y Fu(b)n(y)26
+b(the)h(angle)f Fn(a)p Fu(.)0 3994 y Fs(Op)s(erations)31
+b(on)g(ob)5 b(jects)47 b Fu(Sev)n(eral)32 b(op)r(erations)f(apply)0
+4094 y(globally)26 b(on)i(ob)5 b(jects:)83 4223 y Fg(\017)41
+b Fp(assign_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p
+Fg(h)p Fo(cl)d Fg(i)p Fp(\))p Fu(:)80 b(create)50 b Fg(h)p
+Fo(obj)12 b Fg(i)52 b Fu(as)e(an)166 4322 y(instance)27
+b(of)h(class)f Fg(h)p Fo(cl)9 b Fg(i)p Fu(.)83 4448 y
+Fg(\017)41 b Fp(reset_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p
+Fp(\))p Fu(:)31 b(put)23 b Fg(h)p Fo(obj)12 b Fg(i)23
+b Fu(bac)n(k)e(where)h(it)g(w)n(as)166 4548 y(just)28
+b(after)f(it)i(w)n(as)d(initialized.)83 4673 y Fg(\017)41
+b Fp(put_obj\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p
+Fo(avn)6 b Fg(i)p Fp(,)p Fn(s)p Fp(,)p Fn( )s Fp(,)p
+Fn(\022)r Fp(,)p Fn(\036)p Fp(\))p Fu(:)55 b(ob)5 b(ject)37
+b Fg(h)p Fo(obj)12 b Fg(i)166 4773 y Fu(is)49 b(scaled)f(b)n(y)g
+Fn(s)p Fu(,)54 b(shifted)49 b(b)n(y)g(v)n(ector)e Fg(h)p
+Fo(avn)6 b Fg(i)50 b Fu(and)166 4872 y(orien)n(ted)43
+b(with)h(the)g(angles)e Fn( )s Fu(,)48 b Fn(\022)r Fu(,)g
+Fn(\036)p Fu(,)g(as)43 b(for)g(the)166 4972 y(observ)n(er)25
+b(orien)n(tation)i(\(\014gure)g(5\).)83 5098 y Fg(\017)41
+b Fp(rotate_obj_pv\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p
+Fg(h)p Fo(lpn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(avn)g Fg(i)p
+Fp(,)p Fn(a)p Fp(\))p Fu(:)61 b(ob)5 b(ject)166 5197
+y Fg(h)p Fo(obj)12 b Fg(i)36 b Fu(is)d(rotated)h(around)e(an)i(axis)f
+(going)g(through)166 5297 y(lo)r(cal)c(p)r(oin)n(t)h
+Fg(h)p Fo(lpn)6 b Fg(i)31 b Fu(and)e(directed)h(b)n(y)f(v)n(ector)g
+Fg(h)p Fo(avn)6 b Fg(i)p Fu(;)166 5396 y(the)28 b(rotation)f(is)g(b)n
+(y)g Fn(a)h Fu(degrees.)2100 100 y Fg(\017)41 b Fp(rotate_obj_abs_pv)o
+(\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(apn)6
+b Fg(i)p Fp(,)p Fg(h)p Fo(avn)g Fg(i)p Fp(,)p Fn(a)p
+Fp(\))p Fu(:)2183 199 y(the)24 b(ob)5 b(ject)23 b Fg(h)p
+Fo(obj)12 b Fg(i)25 b Fu(is)d(rotated)h(around)f(an)g(axis)h(going)2183
+299 y(through)35 b(absolute)g(p)r(oin)n(t)g Fg(h)p Fo(apn)6
+b Fg(i)37 b Fu(and)e(directed)g(b)n(y)2183 399 y(v)n(ector)27
+b Fg(h)p Fo(avn)6 b Fg(i)p Fu(;)29 b(the)f(rotation)e(is)i(b)n(y)f
+Fn(a)h Fu(degrees.)2100 508 y Fg(\017)41 b Fp(rotate_obj_pp\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(lpn)6 b Fg(i)3204
+520 y Fm(1)3238 508 y Fp(,)p Fg(h)p Fo(lpn)g Fg(i)3462
+520 y Fm(2)3501 508 y Fp(,)p Fn(a)p Fp(\))p Fu(:)47 b
+Fg(h)p Fo(obj)12 b Fg(i)2183 608 y Fu(is)36 b(rotated)f(around)g(an)h
+(axis)f(going)g(through)g(lo)r(cal)2183 708 y(p)r(oin)n(ts)h
+Fg(h)p Fo(lpn)6 b Fg(i)2621 720 y Fm(1)2696 708 y Fu(and)36
+b Fg(h)p Fo(lpn)6 b Fg(i)3046 720 y Fm(2)3084 708 y Fu(;)41
+b(the)36 b(rotation)f(is)h(b)n(y)g Fn(a)2183 807 y Fu(degrees.)2100
+917 y Fg(\017)41 b Fp(translate_obj\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(avn)6 b Fg(i)p Fp(\))p Fu(:)57
+b(ob)5 b(ject)39 b Fg(h)p Fo(obj)12 b Fg(i)41 b Fu(is)2183
+1017 y(translated)27 b(b)n(y)h(v)n(ector)e Fg(h)p Fo(avn)6
+b Fg(i)p Fu(.)2100 1127 y Fg(\017)41 b Fp(scale_obj\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fn(v)s Fp(\))p Fu(:)30
+b(ob)5 b(ject)18 b Fg(h)p Fo(obj)12 b Fg(i)20 b Fu(is)e(scaled)g(b)n(y)
+g Fn(v)s Fu(.)2017 1293 y Fs(Building)31 b(new)g(p)s(oin)m(ts)g(in)h
+(space)41 b Fu(Three)21 b(macros)g(are)2017 1392 y(esp)r(ecially)j
+(useful)g(for)f(the)h(de\014nition)g(of)g(regular)e(p)r(olyhe-)2017
+1492 y(dra:)2100 1613 y Fg(\017)41 b Fp(rotate_in_plane\()p
+Fn(k)s Fp(,)o Fn(o)p Fp(,)p Fn(i)p Fp(,)o Fn(j)5 b Fp(\))p
+Fu(:)39 b(get)31 b(p)r(oin)n(t)g Fn(k)k Fu(from)2183
+1713 y(p)r(oin)n(t)28 b Fn(j)33 b Fu(b)n(y)27 b(rotation)f(around)h(p)r
+(oin)n(t)g Fn(o)h Fu(b)n(y)f(an)g(angle)2183 1813 y Fn(\013)i
+Fu(equal)e(to)h(the)h(angle)e(from)g Fn(i)h Fu(to)g Fn(j)5
+b Fu(;)28 b Fn(i)p Fu(,)g Fn(j)33 b Fu(and)28 b Fn(k)j
+Fu(are)2183 1912 y(of)d(t)n(yp)r(e)g Fg(h)p Fo(lpn)6
+b Fg(i)p Fu(,)29 b(whereas)d Fn(o)i Fu(is)g(of)f(t)n(yp)r(e)h
+Fg(h)p Fo(apn)6 b Fg(i)p Fu(.)2764 2501 y @beginspecial
+-7 @llx -7 @lly 58 @urx 57 @ury 650 @rwi @setspecial
+%%BeginDocument: vect-fig.11
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000000388
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 0 0 moveto
+43.42923 36.44121 lineto stroke
+newpath 0 0 moveto
+19.3903 53.27371 lineto stroke
+newpath 22.33218 3.93771 moveto
+21.64098 7.85783 19.93013 11.52698 17.37143 14.57626 curveto stroke
+newpath 20.19688 11.74487 moveto
+19.34358 12.76617 18.39877 13.71422 17.37143 14.57626 curveto
+18.04199 13.41484 18.60558 12.20084 19.05812 10.94928 curveto
+ closepath
+gsave fill grestore stroke
+newpath 17.37143 14.57626 moveto
+14.81273 17.62555 11.49652 19.94771 7.756 21.30916 curveto stroke
+newpath 11.6186 20.26982 moveto
+10.36897 20.72763 9.07674 21.07628 7.756 21.30916 curveto
+8.91743 20.6386 10.0125 19.86902 11.0302 19.01143 curveto
+ closepath
+gsave fill grestore stroke
+25.05493 11.03316 moveto
+(\013) cmmi10 9.96265 fshow
+14.67989 23.39748 moveto
+(\013) cmmi10 9.96265 fshow
+-6.9291 -6.3895 moveto
+(o) cmmi10 9.96265 fshow
+54.11514 0.27383 moveto
+(i) cmmi10 9.96265 fshow
+45.52922 27.77061 moveto
+(j) cmmi10 9.96265 fshow
+10.8901 49.81445 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 2100 2628 a Fg(\017)41 b Fp(new_face_point\()p
+Fn(c)p Fp(,)p Fn(o)p Fp(,)p Fn(i)o Fp(,)p Fn(j)5 b Fp(,)o
+Fn(\013)p Fp(\))p Fu(:)30 b(the)25 b(middle)h Fn(m)f
+Fu(of)2183 2743 y(p)r(oin)n(ts)34 b Fn(i)f Fu(and)h Fn(j)39
+b Fu(is)33 b(suc)n(h)g(that)3312 2717 y Fd(d)3210 2743
+y Fu(\()3242 2716 y Fg(\000)-34 b(!)3242 2743 y Fn(om)q(;)3393
+2716 y Fg(\000)-40 b(!)3393 2743 y Fn(mc)o Fu(\))34 b(=)f
+Fn(\013)h Fu(and)2183 2816 y Fg(\000)-39 b(!)2183 2843
+y Fn(mc)32 b Fu(is)2411 2816 y Fg(\000)-35 b(!)2411 2843
+y Fn(om)32 b Fu(rotated)f(around)3136 2797 y Fg(\000)-65
+b(!)3144 2843 y Fn(j)5 b(i)i Fu(.)49 b Fn(c)p Fu(,)33
+b Fn(o)p Fu(,)f Fn(i)g Fu(and)f Fn(j)37 b Fu(are)2183
+2943 y(of)28 b(t)n(yp)r(e)g Fg(h)p Fo(lpn)6 b Fg(i)p
+Fu(.)2676 3515 y @beginspecial -8 @llx -9 @lly 78 @urx
+53 @ury 860 @rwi @setspecial
+%%BeginDocument: vect-fig.7
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008308
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+34.97847 18.22087 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 0 0 moveto
+45.83568 9.11044 lineto
+75.09138 45.55219 lineto stroke
+newpath 45.83568 9.11044 moveto
+68.75352 13.66566 lineto stroke
+ [] 0 setdash
+newpath 57.2946 11.38806 moveto
+57.2946 14.34955 55.87602 17.22853 53.1496 18.22089 curveto stroke
+65.54852 16.66566 moveto
+(\013) cmmi10 9.96265 fshow
+-7.8291 -2.14476 moveto
+(o) cmmi10 9.96265 fshow
+28.20547 22.25806 moveto
+(j) cmmi10 9.96265 fshow
+58.7929 -8.6706 moveto
+(i) cmmi10 9.96265 fshow
+72.93568 48.55219 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 2100 3642 a Fg(\017)41 b Fp(new_abs_face_poin)o(t\()p
+Fn(c)p Fp(,)o Fn(o)p Fp(,)p Fn(i)p Fp(,)o Fn(j)5 b Fp(,)p
+Fn(\013)p Fp(\))p Fu(:)65 b(similar)45 b(to)2183 3741
+y(the)28 b(previous)f(de\014nition,)h(but)g Fn(c)f Fu(and)h
+Fn(o)f Fu(are)g(of)g(t)n(yp)r(e)2183 3841 y Fg(h)p Fo(apn)6
+b Fg(i)p Fu(.)2017 4007 y Fs(Dra)m(wing)33 b(p)s(oin)m(ts,)d(axes,)i
+(ob)5 b(jects)2100 4128 y Fg(\017)41 b Fp(draw_point\()p
+Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(lpn)6 b Fg(i)p
+Fp(\))p Fu(:)39 b(dra)n(w)29 b(p)r(oin)n(t)h Fg(h)p Fo(lpn)6
+b Fg(i)31 b Fu(in)2183 4228 y(ob)5 b(ject)28 b Fg(h)p
+Fo(obj)12 b Fg(i)p Fu(.)2100 4338 y Fg(\017)41 b Fp(draw_axes\()p
+Fg(h)p Fo(c)l(ol)9 b Fg(i)2793 4350 y Fm(1)2827 4338
+y Fp(,)p Fg(h)p Fo(c)l(ol)g Fg(i)3041 4350 y Fm(2)3079
+4338 y Fp(,)p Fg(h)p Fo(c)l(ol)g Fg(i)3293 4350 y Fm(3)3330
+4338 y Fp(\))p Fu(:)34 b(dra)n(w)21 b(v)n(ectors)2172
+4448 y Fn(~)-31 b({)p Fu(,)24 b Fn(~)-38 b(|)28 b Fu(and)2478
+4426 y Fn(~)2482 4448 y(k)i Fu(in)e(colors)e Fg(h)p Fo(c)l(ol)9
+b Fg(i)3058 4460 y Fm(1)3096 4448 y Fu(,)28 b Fg(h)p
+Fo(c)l(ol)9 b Fg(i)3317 4460 y Fm(2)3383 4448 y Fu(and)27
+b Fg(h)p Fo(c)l(ol)9 b Fg(i)3714 4460 y Fm(3)3752 4448
+y Fu(.)2100 4558 y Fg(\017)41 b Fp(draw_obj\()p Fg(h)p
+Fo(obj)12 b Fg(i)p Fp(\))p Fu(:)35 b(dra)n(w)26 b(ob)5
+b(ject)28 b Fg(h)p Fo(obj)12 b Fg(i)p Fu(.)2017 4724
+y Fs(Setting)32 b(faces)2100 4846 y Fg(\017)41 b Fp(set_face\()p
+Fg(h)p Fo(afn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(vsl)j Fg(i)p
+Fp(,)p Fg(h)p Fo(hc)c Fg(i)p Fp(\))p Fu(:)45 b(set)32
+b(absolute)g(face)2183 4945 y Fg(h)p Fo(afn)6 b Fg(i)27
+b Fu(as)d(delimited)i(b)n(y)f(the)g(v)n(ertex)f(list)h
+Fg(h)p Fo(vsl)9 b Fg(i)26 b Fu(\(lo)r(cal)2183 5045 y(p)r(oin)n(t)i(n)n
+(um)n(b)r(ers\))g(and)f(colored)f(b)n(y)i(color)e Fg(h)p
+Fo(hc)5 b Fg(i)p Fu(.)2100 5155 y Fg(\017)41 b Fp(set_obj_face\()p
+Fg(h)p Fo(lfn)6 b Fg(i)p Fp(,)p Fg(h)p Fo(vsl)j Fg(i)p
+Fp(,)p Fg(h)p Fo(hc)c Fg(i)p Fp(\))p Fu(:)33 b(set)27
+b(lo)r(cal)f(face)2183 5254 y Fg(h)p Fo(lfn)6 b Fg(i)29
+b Fu(as)e(delimited)i(b)n(y)e(the)h(v)n(ertex)f(list)h
+Fg(h)p Fo(vsl)9 b Fg(i)28 b Fu(\(lo)r(cal)2183 5354 y(p)r(oin)n(t)g(n)n
+(um)n(b)r(ers\))g(and)f(colored)f(b)n(y)i(color)e Fg(h)p
+Fo(hc)5 b Fg(i)p Fu(.)p eop
+%%Page: 282 9
+282 8 bop 0 -149 a Fu(282)2470 b(TUGb)r(oat,)28 b(V)-7
+b(olume)27 b(18)g(\(1997\),)f(No.)i(4)0 100 y Fs(View)j(p)s(oin)m(ts,)g
+(distance)83 226 y Fg(\017)41 b Fp(compute_referenc)o(e\()p
+Fn( )s Fp(,)o Fn(\022)r Fp(,)p Fn(\036)p Fp(\))p Fu(:)50
+b(de\014nes)38 b(the)f(ori-)166 325 y(en)n(tation)29
+b(of)f(the)i(observ)n(er)c(b)n(y)j(the)g(three)g(angles)f
+Fn( )s Fu(,)166 425 y Fn(\022)i Fu(and)d Fn(\036)p Fu(.)38
+b(See)27 b(\014gure)g(5.)83 544 y Fg(\017)41 b Fp(point_of_view_ob)o
+(j\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(lpn)6
+b Fg(i)p Fp(,)p Fn(\036)p Fp(\))p Fu(:)63 b(the)43 b(ori-)166
+644 y(en)n(tation)38 b(of)h(the)g(observ)n(er)d(is)i(de\014ned)h(as)f
+(lo)r(oking)166 744 y(lo)r(cal)28 b(p)r(oin)n(t)h Fg(h)p
+Fo(lpn)6 b Fg(i)29 b Fu(of)g(ob)5 b(ject)28 b Fg(h)p
+Fo(obj)12 b Fg(i)p Fu(,)31 b(with)e(an)f(angle)166 843
+y(of)g Fn(\036)p Fu(;)83 963 y Fg(\017)41 b Fp(point_of_view_ab)o(s\()p
+Fg(h)p Fo(apn)6 b Fg(i)p Fp(,)p Fn(\036)p Fp(\))p Fu(:)44
+b(the)34 b(observ)n(er's)166 1062 y(orien)n(tation)26
+b(is)i(de\014ned)g(as)f(lo)r(oking)g(absolute)g(p)r(oin)n(t)166
+1162 y Fg(h)p Fo(apn)6 b Fg(i)p Fu(,)29 b(with)f(an)g(angle)e(of)i
+Fn(\036)p Fu(;)83 1281 y Fg(\017)41 b Fp(obs_distance\()p
+Fn(v)s Fp(\)\()p Fg(h)p Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p
+Fo(lpn)6 b Fg(i)p Fp(\))p Fu(:)29 b(let)19 b Fn(v)j Fu(equal)c(the)166
+1381 y(distance)34 b(b)r(et)n(w)n(een)g(the)h(observ)n(er)d(and)i(lo)r
+(cal)g(p)r(oin)n(t)166 1480 y Fg(h)p Fo(lpn)6 b Fg(i)29
+b Fu(in)f(ob)5 b(ject)27 b Fg(h)p Fo(obj)12 b Fg(i)p
+Fu(.)0 1647 y Fs(V)-8 b(ector)32 b(and)h(p)s(oin)m(t)e(allo)s(cation)83
+1773 y Fg(\017)41 b Fp(new_vect)p Fg(!)24 b(h)p Fo(avn)6
+b Fg(i)p Fu(:)39 b(return)27 b(a)g(new)h(v)n(ector;)83
+1892 y Fg(\017)41 b Fp(new_point)p Fu(:)33 b(synon)n(ym)27
+b(of)h Fp(new_vect)p Fu(;)83 2011 y Fg(\017)41 b Fp(new_points\()p
+Fn(v)s Fp(\)\()p Fn(n)p Fp(\))p Fu(:)27 b(de\014nes)20
+b(the)h(absolute)e(p)r(oin)n(ts)166 2111 y Fn(v)206 2123
+y Fm(1)244 2111 y Fn(;)14 b(:)g(:)g(:)f(;)h(v)468 2123
+y Ff(n)513 2111 y Fu(,)28 b(using)f Fp(new_point)p Fu(;)83
+2230 y Fg(\017)41 b Fp(free_vect\()p Fg(h)p Fo(avn)6
+b Fg(i)p Fp(\))p Fu(:)34 b(free)27 b(v)n(ector)f Fg(h)p
+Fo(avn)6 b Fg(i)p Fu(;)83 2350 y Fg(\017)41 b Fp(free_point\()p
+Fg(h)p Fo(apn)6 b Fg(i)p Fp(\))p Fu(:)34 b(free)27 b(p)r(oin)n(t)h
+Fg(h)p Fo(apn)6 b Fg(i)p Fu(;)83 2469 y Fg(\017)41 b
+Fp(free_points\()p Fn(v)s Fp(\)\()p Fn(n)p Fp(\))p Fu(:)35
+b(frees)29 b(the)h(absolute)f(p)r(oin)n(ts)166 2569 y
+Fn(v)206 2581 y Fm(1)244 2569 y Fn(;)14 b(:)g(:)g(:)f(;)h(v)468
+2581 y Ff(n)513 2569 y Fu(,)28 b(using)f Fp(free_point)p
+Fu(.)0 2735 y Fs(Debugging)83 2861 y Fg(\017)41 b Fp(show_vect\()p
+Fg(h)p Fo(str)9 b Fg(i)p Fp(,)p Fg(h)p Fo(avn)d Fg(i)p
+Fp(\))p Fu(:)54 b(sho)n(ws)37 b(v)n(ector)g Fg(h)p Fo(avn)6
+b Fg(i)p Fu(,)166 2961 y(with)28 b(string)f Fg(h)p Fo(str)9
+b Fg(i)p Fu(.)83 3080 y Fg(\017)41 b Fp(show_point)p
+Fu(:)33 b(synon)n(ym)27 b(of)g Fp(show_vect)83 3199 y
+Fg(\017)41 b Fp(show_pair\()p Fg(h)p Fo(str)9 b Fg(i)p
+Fp(,)p Fg(h)p Fo(p)l(air)g Fg(i)p Fp(\))p Fu(:)30 b(this)21
+b(sho)n(ws)f(a)g(n)n(umeric)166 3299 y(pair,)27 b(with)h(string)f
+Fg(h)p Fo(str)9 b Fg(i)p Fu(.)0 3465 y Fs(Normalization)83
+3591 y Fg(\017)41 b Fp(normalize_obj\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(vl)d Fg(i)p Fp(\))p Fu(:)51
+b(normalize)35 b(ob)5 b(ject)166 3691 y Fg(h)p Fo(obj)12
+b Fg(i)29 b Fu(with)f(resp)r(ect)g(to)f(the)h(list)g(of)g(v)n(ertices)e
+Fg(h)p Fo(vl)9 b Fg(i)p Fu(.)0 3857 y Fs(P)m(arameters)83
+3983 y Fg(\017)41 b Fp(Obs_dist)28 b Fg(!)j(h)p Fo(num)6
+b Fg(i)p Fu(:)43 b(distance)31 b(b)r(et)n(w)n(een)f(the)i(ob-)166
+4082 y(serv)n(er)26 b(and)h(the)h(pro)5 b(jection)27
+b(plane.)83 4202 y Fg(\017)41 b Fp(h_field)k Fg(!)j(h)p
+Fo(num)6 b Fg(i)p Fu(:)77 b(horizon)n(tal)46 b(\014eld)i(of)f(view)166
+4301 y(\(default:)38 b(100)26 b(degrees\))83 4421 y Fg(\017)41
+b Fp(v_field)33 b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)53
+b(v)n(ertical)34 b(\014eld)i(of)g(view)f(\(de-)166 4520
+y(fault:)i(70)27 b(degrees\))83 4640 y Fg(\017)41 b Fp(Obs_phi)26
+b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)39 b(angle)29 b Fn(\036)g
+Fu(for)f(the)h(orien)n(tation)166 4739 y(of)f(the)g(observ)n(er;)83
+4859 y Fg(\017)41 b Fp(Obs_theta)30 b Fg(!)j(h)p Fo(num)6
+b Fg(i)p Fu(:)49 b(angle)32 b Fn(\022)k Fu(for)d(the)h(orien)n(ta-)166
+4958 y(tion)28 b(of)f(the)h(observ)n(er;)83 5078 y Fg(\017)41
+b Fp(Obs_psi)25 b Fg(!)j(h)p Fo(num)6 b Fg(i)p Fu(:)38
+b(angle)27 b Fn( )k Fu(for)c(the)h(orien)n(tation)166
+5177 y(of)g(the)g(observ)n(er;)83 5297 y Fg(\017)41 b
+Fp(drawing_scale)24 b Fg(!)29 b(h)p Fo(num)6 b Fg(i)p
+Fu(:)39 b(scale)28 b(factor)g(applied)166 5396 y(for)f(dra)n(wing;)2100
+100 y Fg(\017)41 b Fp(filled_faces)24 b Fg(!)29 b(h)p
+Fo(b)l(o)l(ol)9 b Fg(i)p Fu(:)40 b(if)c Fp(true)p Fu(,)27
+b(the)i(faces)g(are)2183 199 y(dra)n(wn)19 b(\014lled;)k(if)j
+Fp(false)p Fu(,)20 b(only)f(the)h(edges)f(are)f(dra)n(wn,)2183
+299 y(and)28 b(hidden)g(edges)f(are)f(dra)n(wn)h(dashed;)2100
+406 y Fg(\017)41 b Fp(draw_contours)17 b Fg(!)22 b(h)p
+Fo(b)l(o)l(ol)9 b Fg(i)p Fu(:)35 b(if)29 b Fp(true)p
+Fu(,)22 b(the)g(con)n(tours)2183 505 y(of)51 b(the)h(faces)e(are)g(dra)
+n(wn,)56 b(and)51 b(the)g(lines)g(ha)n(v)n(e)2183 605
+y(the)e(thic)n(kness)f Fp(contour_width)p Fu(;)53 b(if)j
+Fp(false)p Fu(,)51 b(the)2183 705 y(con)n(tours)27 b(are)f(not)i(dra)n
+(wn;)2100 811 y Fg(\017)41 b Fp(contour_width)27 b Fg(!)32
+b(h)p Fo(num)6 b Fg(i)p Fu(:)45 b(dimension)32 b(used)g(for)2183
+911 y(dra)n(wing)27 b(con)n(tours)f(of)h(faces)g(\(default:)38
+b(1pt\).)2017 1077 y Fs(Constan)m(ts)65 b Fu(These)50
+b(v)-5 b(alues)50 b(represen)n(t)f(constan)n(t)h(ob-)2017
+1177 y(jects)37 b(suc)n(h)g(as)f(reference)g(v)n(ectors,)h(and)g
+(should)f(not)h(b)r(e)2017 1276 y(c)n(hanged.)2100 1396
+y Fg(\017)k Fp(vect_null)24 b Fg(!)k(h)p Fo(avn)6 b Fg(i)p
+Fu(:)38 b(in)n(ternal)27 b(index)h(for)3624 1378 y Fn(~)3630
+1396 y Fu(0.)2100 1503 y Fg(\017)41 b Fp(vect_I)26 b
+Fg(!)h(h)p Fo(avn)6 b Fg(i)p Fu(:)39 b(in)n(ternal)27
+b(index)g(for)16 b Fn(~)-31 b({)p Fu(.)2100 1609 y Fg(\017)41
+b Fp(vect_J)26 b Fg(!)h(h)p Fo(avn)6 b Fg(i)p Fu(:)39
+b(in)n(ternal)27 b(index)g(for)c Fn(~)-38 b(|)p Fu(.)2100
+1727 y Fg(\017)41 b Fp(vect_K)26 b Fg(!)h(h)p Fo(avn)6
+b Fg(i)p Fu(:)39 b(in)n(ternal)27 b(index)g(for)3495
+1705 y Fn(~)3499 1727 y(k)s Fu(.)2100 1834 y Fg(\017)41
+b Fp(point_null)24 b Fg(!)k(h)p Fo(apn)6 b Fg(i)p Fu(:)38
+b(in)n(ternal)27 b(index)h(for)3671 1816 y Fn(~)3678
+1834 y Fu(0)o(.)2100 1940 y Fg(\017)41 b Fp(Obs)20 b
+Fg(!)i(h)p Fo(apn)6 b Fg(i)p Fu(:)35 b(observ)n(er's)19
+b(in)n(ternal)h(p)r(oin)n(t)i(n)n(um)n(b)r(er.)2017 2106
+y Fs(De\014ning)32 b(new)f(ob)5 b(ject)33 b(p)s(oin)m(ts)e(and)h(faces)
+2100 2226 y Fg(\017)41 b Fp(new_obj_points\()p Fg(h)p
+Fo(obj)12 b Fg(i)p Fp(,)p Fg(h)p Fo(num)6 b Fg(i)p Fp(\))p
+Fu(:)30 b(de\014nes)24 b(p)r(oin)n(ts)2183 2326 y(1)f(to)g
+Fg(h)p Fo(num)6 b Fg(i)24 b Fu(in)f(ob)5 b(ject)23 b
+Fg(h)p Fo(obj)12 b Fg(i)p Fu(;)27 b(m)n(ust)c(b)r(e)h(used)f(b)r(efore)
+2183 2425 y(setting)28 b(the)g(p)r(oin)n(ts;)2100 2532
+y Fg(\017)41 b Fp(new_obj_faces\()p Fg(h)p Fo(obj)12
+b Fg(i)p Fp(,)p Fg(h)p Fo(num)6 b Fg(i)p Fp(\))p Fu(:)52
+b(de\014nes)37 b Fg(h)p Fo(num)6 b Fg(i)2183 2632 y Fu(faces)31
+b(in)h(ob)5 b(ject)31 b Fg(h)p Fo(obj)12 b Fg(i)p Fu(;)35
+b(m)n(ust)d(b)r(e)f(used)h(b)r(efore)f(set-)2183 2731
+y(ting)d(the)g(faces;)2017 2897 y Fs(O\013sets)2100 3017
+y Fg(\017)41 b Fp(pnt\()p Fg(h)p Fo(lpn)6 b Fg(i)p Fp(\))19
+b Fg(!)h(h)p Fo(apn)6 b Fg(i)p Fu(:)34 b(returns)19 b(the)h(absolute)e
+(p)r(oin)n(t)2183 3117 y(n)n(um)n(b)r(er)28 b(for)f(a)g(giv)n(en)g(lo)r
+(cal)g(p)r(oin)n(t)h(index.)2100 3224 y Fg(\017)41 b
+Fp(face\()p Fg(h)p Fo(lfn)6 b Fg(i)p Fp(\))26 b Fg(!)g(h)p
+Fo(afn)6 b Fg(i)p Fu(:)38 b(returns)26 b(the)h(absolute)f(face)2183
+3323 y(n)n(um)n(b)r(er)i(for)f(a)g(giv)n(en)g(lo)r(cal)g(face)g(index.)
+2017 3489 y Fs(Standard)34 b(classes)60 b Fu(Fiv)n(e)47
+b(standard)f(classes)g(are)g(de-)2017 3589 y(\014ned)22
+b(in)g Fp(poly.mp)p Fu(:)31 b(they)22 b(de\014ne)g(the)g(\014v)n(e)f
+(regular)f(con)n(v)n(ex)2017 3689 y(p)r(olyhedra.)84
+b(F)-7 b(or)42 b(eac)n(h)h(class)f Fg(h)p Fo(class)7
+b Fg(i)p Fu(,)49 b(there)43 b(are)f(t)n(w)n(o)2017 3788
+y(macros:)2100 3908 y Fg(\017)f Fp(set_)p Fg(h)p Fo(class)7
+b Fg(i)p Fp(_points)25 b Fu(\(e.g.)36 b Fp(set_cube_points)p
+Fu(\))2100 4015 y Fg(\017)41 b Fp(def_)p Fg(h)p Fo(class)7
+b Fg(i)28 b Fu(\(e.g.)36 b Fp(def_cube)p Fu(\))2183 4134
+y(Eac)n(h)25 b(of)g(these)h(macros)e(is)h(de\014ned)h(with)g(a)f
+(parame-)2017 4234 y(ter)j(whic)n(h)f(is)h(the)g(instance)f(name.)2017
+4400 y Fs(Standard)34 b(animations)55 b Fu(The)44 b Fp(3d)f
+Fu(pac)n(k)-5 b(age)42 b(pro)n(vides)2017 4500 y(a)36
+b(few)h(standard)e(animations)h(using)f(the)i(con)n(v)n(ex)e(p)r(oly-)
+2017 4599 y(hedra.)74 b(In)40 b(eac)n(h)g(of)g(these)g(animations,)i
+(the)f(observ)n(er)2017 4699 y(follo)n(ws)c(a)g(circular)e(path)j
+(pictured)f(in)h(\014gure)e(7.)66 b(Eac)n(h)2017 4799
+y(standard)22 b(animation)h(is)g(divided)g(in)n(to)g(t)n(w)n(o)f
+(macros.)33 b(The)2017 4898 y(\014rst,)c(suc)n(h)f(as)g
+Fp(animate_object)p Fu(,)c(de\014nes)k(the)h(class\(es\))2017
+4998 y(that)23 b(are)e(used)h(and)g(sets)g(the)g(ob)5
+b(jects.)35 b(The)22 b(second,)h(suc)n(h)2017 5098 y(as)f
+Fp(one_image)p Fu(,)e(sets)h(the)i(observ)n(er,)e(dra)n(ws)g(the)h(ob)5
+b(ject\(s\))2017 5197 y(and)46 b(mo)n(v)n(es)e(the)h(ob)5
+b(ject\(s\))46 b(and)f(the)h(observ)n(er.)87 b(The)2017
+5297 y(\014le)38 b Fp(animpoly.mp)32 b Fu(giv)n(es)k(examples)g(of)h
+(the)g(use)g(of)g(the)2017 5396 y(standard)27 b(animations.)p
+eop
+%%Page: 283 10
+283 9 bop 0 -149 a Fu(TUGb)r(oat,)28 b(V)-7 b(olume)28
+b(18)e(\(1997\),)h(No.)g(4)2471 b(283)1047 1450 y @beginspecial
+-93 @llx -51 @lly 122 @urx 121 @ury 2150 @rwi @setspecial
+%%BeginDocument: vect-fig.17
+%*Font: cmmi10 9.96265 9.96265 6b:8007d
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 50.07999 62.92972 moveto
+36.41684 62.92972 22.81273 61.40129 9.35458 59.05609 curveto
+-5.27846 56.50616 -19.72882 52.99411 -33.87776 48.4729 curveto
+-45.68634 44.69954 -57.29236 40.2167 -68.03217 34.01608 curveto
+-74.78679 30.1163 -83.48495 27.2732 -83.95775 19.55927 curveto
+-84.22949 15.12558 -81.22559 11.34346 -77.38675 8.97607 curveto
+-69.35762 4.02454 -59.47366 5.10245 -50.07999 5.10245 curveto
+-36.41684 5.10245 -22.81273 6.63087 -9.35458 8.97607 curveto
+5.27846 11.526 19.72882 15.03806 33.87776 19.55927 curveto
+45.68634 23.33263 57.29236 27.81546 68.03217 34.01608 curveto
+74.78679 37.91586 83.48495 40.75897 83.95775 48.4729 curveto
+84.22949 52.90659 81.22559 56.6887 77.38675 59.05609 curveto
+69.35762 64.00763 59.47366 62.92972 50.07999 62.92972 curveto stroke
+ [] 0 setdash
+newpath 54.01132 63.66803 moveto
+52.697 63.41296 51.38556 63.15993 50.07999 62.92972 curveto
+51.38556 62.69951 52.70445 62.48877 54.02676 62.27893 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-25.04 -14.45682 lineto stroke
+newpath -21.97597 -11.88579 moveto
+-25.04 -14.45682 lineto
+-21.28142 -13.08879 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+34.01608 0 lineto stroke
+newpath 30.07712 -0.69453 moveto
+34.01608 0 lineto
+30.07712 0.69453 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 34.01608 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.69453 30.07712 moveto
+0 34.01608 lineto
+-0.69453 30.07712 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+-83.46582 -48.18889 lineto stroke
+newpath -80.40158 -45.61774 moveto
+-83.46582 -48.18889 lineto
+-79.707 -46.8208 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.3985 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+-92.15971 -50.33365 moveto
+(x) cmmi10 9.96265 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+-2.53566 116.3858 moveto
+(z) cmmi10 9.96265 fshow
+-24.3139 -23.67451 moveto
+(~) cmmi10 9.96265 fshow
+-22.94 -23.67451 moveto
+({) cmmi10 9.96265 fshow
+31.58937 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+32.10307 -10.1177 moveto
+(|) cmmi10 9.96265 fshow
+-9.007 31.77168 moveto
+(~) cmmi10 9.96265 fshow
+-8.5002 29.14268 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 1324 1657 a Fs(Figure)32 b(7)p Fu(:)k(Motion)28
+b(of)f(the)h(observ)n(er)0 1923 y Fs(App)s(endix)j(B)0
+2022 y(Co)s(ding)g(an)h(ob)5 b(ject)0 2155 y Fu(In)25
+b(order)f(to)i(extend)f(the)h Fp(3d)e Fu(pac)n(k)-5 b(age,)25
+b(it)g(is)h(necessary)d(to)0 2255 y(understand)f(ho)n(w)f(the)h(ob)5
+b(jects)22 b(are)f(co)r(ded.)35 b(W)-7 b(e)22 b(giv)n(e)g(here)0
+2354 y(an)h(o)n(v)n(erview)f(of)h(this)h(co)r(ding,)g(but)g(the)f
+(reader)f(is)i(advised)0 2454 y(to)f(p)r(eek)g(in)g(the)g(co)r(de)g(to)
+g(get)f(a)h(b)r(etter)g(understanding)f(on)0 2554 y(ho)n(w)27
+b(all)g(the)h(functions)g(in)n(teract.)166 2653 y(First,)23
+b(an)f(ob)5 b(ject)21 b(has)h(a)f(name,)i(for)e(instance)h
+Fp("box")p Fu(.)0 2753 y(The)41 b(macro)f Fp(box_class)e
+Fu(\(whic)n(h)k(can)f(b)r(e)h(called)f(with)0 2853 y
+Fp(obj_class_\("box")o(\))p Fu(\))21 b(is)27 b(the)h(string)e(corresp)r
+(onding)f(to)0 2952 y(the)20 b(class)e(of)h Fp("box")p
+Fu(,)g(for)g(instance)g Fp("cube")p Fu(.)32 b(The)19
+b(v)-5 b(ariable)0 3052 y Fp(cube_point_offse)o(tbo)o(x)p
+Fu(,)29 b(of)k(t)n(yp)r(e)g Fp(numeric)p Fu(,)g(and)g(ob-)0
+3151 y(tained)40 b(with)h Fp(obj_point_offset)o(_\(")o(bo)o(x")o(\))p
+Fu(,)d(is)i(equal)0 3251 y(to)35 b(the)h(absolute)f(index)h(of)f(the)h
+(last)g(p)r(oin)n(t)f(of)h(the)g(pre-)0 3351 y(vious)d(ob)5
+b(ject.)55 b(A)33 b(cub)r(e)h(is)g(de\014ned)g(with)g(8)22
+b(+)g(1)33 b(p)r(oin)n(ts.)0 3450 y(Assuming)22 b(it)g(w)n(as)e
+(de\014ned)j(after)e(an)g(icosahedron)f(\(12)7 b(+)g(1)0
+3550 y(p)r(oin)n(ts\))33 b(named)f Fp("ico")p Fu(,)g
+Fp(cube_point_offset)o(box)26 b Fu(will)0 3650 y(b)r(e)40
+b(a)e Fp(numeric)f Fu(equal)h(to)h(13.)71 b Fp(cube_pointsbox)33
+b Fu(\(ob-)0 3749 y(tained)26 b(with)g Fp(obj_points_\("bo)o(x"\))o
+Fu(\))20 b(is)25 b(a)g(macro)g(equal)0 3849 y(to)36 b(9.)60
+b(The)36 b(v)-5 b(ariable)35 b Fp(cube_face_offset)o(bo)o(x)p
+Fu(,)d(similar)0 3948 y(to)e Fp(cube_point_offset)o(box)o
+Fu(,)c(obtained)k(with)h(a)f(call)g(to)0 4048 y Fp(obj_face_offset_)o
+(\("b)o(ox)o("\))o Fu(,)e(equals)j(20.)49 b(The)32 b(macro)0
+4148 y Fp(cube_facesbox)26 b Fu(\(obtained)32 b(b)n(y)f
+Fp(obj_faces_\("box")o(\))p Fu(\))0 4247 y(is)c(equal)h(to)f(6.)166
+4347 y(The)35 b Fp(obj_name)d Fu(macro)i(is)g(extended)i(eac)n(h)e
+(time)h(a)0 4447 y(new)29 b(ob)5 b(ject)29 b(is)f(de\014ned.)41
+b(T)-7 b(o)29 b(an)f(absolute)h(face)f(n)n(um)n(b)r(er,)0
+4546 y(it)34 b(asso)r(ciates)e(an)h(ob)5 b(ject)34 b(name.)54
+b(Hence,)36 b(it)e(is)f(p)r(ossible)0 4646 y(to)g(go)g(through)g(all)g
+(faces.)54 b Fp(last_point_offse)o(t_)27 b Fu(and)0 4745
+y Fp(last_face_offset)o(_)12 b Fu(are)18 b(the)h(absolute)e(n)n(um)n(b)
+r(ers)h(of)h(the)0 4845 y(last)27 b(p)r(oin)n(ts)h(and)f(faces)g
+(de\014ned)h(up)g(to)g(no)n(w.)0 4998 y Fp(def)42 b(obj_name\(expr)d
+(i\)=)87 5098 y(if)k(i<1:)f(elseif)f(i<=20:"ico")436
+5197 y(elseif)g(i<=26:"box")87 5297 y(fi;)0 5396 y(enddef;)2183
+1923 y(pnt\(i\))22 b Fu(giv)n(es)h(the)i(absolute)f(v)n(ector)e
+(corresp)r(onding)2017 2022 y(to)42 b(lo)r(cal)g(p)r(oin)n(t)g
+Fn(i)p Fu(.)80 b Fp(ipnt_\(i\))39 b Fu(is)j(the)h(absolute)e(p)r(oin)n
+(t)2017 2122 y(n)n(um)n(b)r(er,)28 b(that)g(is)f Fn(i)g
+Fu(plus)h(the)g(n)n(um)n(b)r(er)f(of)h(p)r(oin)n(ts)f(de\014ned)2017
+2222 y(b)r(eforehand)46 b(in)g(other)f(ob)5 b(jects.)92
+b Fp(points_[j])41 b Fu(is)46 b(the)2017 2321 y(absolute)i(v)n(ector)f
+(corresp)r(onding)g(to)h(absolute)g(ob)5 b(ject)2017
+2421 y(p)r(oin)n(t)45 b Fn(j)5 b Fu(.)87 b(Similarly)-7
+b(,)48 b Fp(face\(i\))42 b Fu(is)i(the)h(absolute)f(face)2017
+2520 y(corresp)r(onding)26 b(to)i(lo)r(cal)f(face)g Fn(i)p
+Fu(.)2183 2620 y(The)38 b(list)f(of)g(v)n(ertices)f(of)h(absolute)f
+(face)h(n)n(um)n(b)r(er)g Fn(i)2017 2720 y Fu(is)45 b
+Fp(face_points_[i])o Fu(.)82 b(The)44 b(color)f(of)h(absolute)g(face)
+2017 2819 y(n)n(um)n(b)r(er)28 b Fn(i)f Fu(is)h Fp(face_color_[i])p
+Fu(.)2183 2919 y(When)k(the)g(macros)e Fp(pnt)g Fu(or)h
+Fp(face)f Fu(are)g(to)i(b)r(e)f(used,)2017 3019 y(the)36
+b(calls)e Fp(define_current_p)o(oi)o(nt_)o(of)o(fse)o(t_)o(\(")o(box)o
+("\))2017 3118 y Fu(and)j Fp(define_current_fa)o(ce)o(_of)o(fs)o(et_)o
+(\(")o(bo)o(x"\))30 b Fu(m)n(ust)2017 3218 y(b)r(e)e(issued.)2613
+3378 y Fc(\005)38 b Fb(Denis)26 b(Ro)r(egel)2690 3469
+y(CRIN)f(\(Cen)n(tre)g(de)h(Rec)n(herc)n(he)f(en)2790
+3560 y(Informatique)f(de)i(Nancy\))2690 3652 y(B^)-38
+b(atimen)n(t)25 b(LORIA)2690 3743 y(BP)h(239)2690 3834
+y(54506)h(V)-6 b(and\033uvre-l)n(\022)-36 b(es-Nancy)2690
+3926 y(FRANCE)2690 4017 y Fa(roegel@loria.fr)2690 4108
+y Fk(URL)p Fb(:)38 b Fa(http://www.loria.fr/)2790 4200
+y(~roegel)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.tex b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.tex
new file mode 100644
index 0000000000..f057c11e2a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/paper.tex
@@ -0,0 +1,1130 @@
+%===========================================================================
+% Denis Roegel: Creating 3D animations with METAPOST
+% Appeared in volume 18, number 4 (december 1997) of TUGboat (57th issue)
+% Pages 274-283.
+%---------------------------------------------------------------------------
+% This file is NOT the source file used by the TUGboat production,
+% but should mimic it exactly. (The file used for the production of
+% the article is `tb57roegel.ltx', which is also part of the
+% distribution. It is based on an earlier draft of this file.
+% Apply a diff to convince yourself of the identity of the two files.)
+%===========================================================================
+% D. Roegel, dd/m/yyyy
+% 25/2/1997 : first draft
+% 26/2/1997
+% 23/4/1997 : appendix, types added
+% 24/4/1997 : better formatting of appendix
+% 25/4/1997 : two columns
+% 27/4/1997 : some improvements
+% 28/4/1997 : changes to take new syntax into account
+% 30/4/1997 : cleaning and additions
+% 1/5/1997 : ltugboat macros
+% addition of appendix b
+% all overfull hboxes removed; this needed a lot
+% of rephrasing!
+% lots of cleaning
+% 2/5/1997 : extension of future part
+% 12/5/1997 : several small improvements to take Ulrik Vieth's
+% comments into account.
+% 17/5/1997 : some corrections to take modifications in
+% the source code into account
+% 18/5/1997 : commas in the syntax have been put in \texttt
+% some renamings in order to get rid of the overfull
+% hboxes resulting from the comma changes ...
+% 29/5/1997 : some renamings of ``object'' into ``obj'' to
+% be in accordance with the code (version 0.993)
+% some reformatting of pieces of code with respect
+% to the indentation
+% 19/6/1997 : - the `future' part has been corrected with respect
+% to the general algorithm for drawing the faces
+% (thanks to Dominique Larchey)
+% - reference to the ``LaTeX Graphics Companion''
+% 11/2/1998 : - description of draw_contours and contour_width
+% - acknowledgment of Denis Barbier and Boguslaw
+% Jackowski
+% - one_image changed to an_image at the beginning
+% of the paper, in order to avoid being misleading
+% by comparison with the real one_image macro
+% - a few more lines describing the parameters of
+% one_image
+% - ghostscript -> Ghostscript
+% - footnote added to explain why Ghostscript
+% has not been used to generate the excerpts
+% of the images.
+% - some lines to explain why the color type
+% was not used for 3d vectors
+% 12/2/1998 : - rewording to avoid overfull hboxes
+% 8/4/1998 : - final corrections for publication on CTAN
+% (the TUGboat paper was just shipped a few
+% days ago)
+% [ This includes the following corrections,
+% in the final LaTeX file used for the TUGboat
+% production:
+%
+% 19/2/1998 : - minor ``english'' editing (RF)
+% and file sent to author for review (mb)
+% 3/4/1998: - EM fonts removed/ not to
+% be used this issue
+% 8/4/1998: - TUB-specific inputs modified
+% for portability to
+% CTAN archives (mb)
+% ]
+%
+%
+\documentclass[nonumber,harvardcite]{ltugboat}
+\usepackage{mflogo}
+\usepackage{url}
+\usepackage[dvips]{graphicx}
+
+\DeclareRobustCommand\meta[1]{%
+ \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+\newcommand{\AVN}{\meta{avn}}
+\newcommand{\LVN}{\meta{lvn}}
+\newcommand{\APN}{\meta{apn}}
+\newcommand{\LPN}{\meta{lpn}}
+\newcommand{\AFN}{\meta{afn}}
+\newcommand{\LFN}{\meta{lfn}}
+\newcommand{\CN}{\meta{cl}}
+\newcommand{\IN}{\meta{obj}}
+\newcommand{\VL}{\meta{vl}}
+\newcommand{\VSL}{\meta{vsl}}
+\newcommand{\HEXCOL}{\meta{hc}}
+\newcommand{\COL}{\meta{col}}
+\newcommand{\STR}{\meta{str}}
+\newcommand{\PAIR}{\meta{pair}}
+\newcommand{\NUM}{\meta{num}}
+\newcommand{\BOOL}{\meta{bool}}
+
+\newcommand{\tc}{\texttt{,}}
+
+%%%%%TUGboat production-specific files
+\vol 18, 4. % volume, issue.
+\issueseqno=57 % sequential issue number
+\issdate December 1997. % month, year of publication
+\setcounter{page}{274}
+\NoBlackBoxes
+\PrelimDraftfalse
+
+\widowpenalty=10000
+\clubpenalty=10000
+\renewcommand{\topfraction}{0.9}
+\renewcommand{\bottomfraction}{0.5}
+\renewcommand{\floatpagefraction}{0.8}
+\renewcommand{\textfraction}{0.1}
+\setcounter{bottomnumber}{2}
+\setcounter{totalnumber}{4}
+\renewcommand{\dbltopfraction}{0.9}
+\renewcommand{\dblfloatpagefraction}{0.8}
+
+\pretolerance=500
+\tolerance=1000
+\hbadness=3000
+\vbadness=3000
+\hyphenpenalty=400
+
+\begin{document}
+
+\sectitle{Graphics Applications}
+
+\title{Creating 3D animations with \MP}
+\author{Denis Roegel}
+\address{CRIN (Centre de Recherche en Informatique de Nancy)\\
+ B\^atiment LORIA\\
+ BP 239\\
+ 54506 Vand\oe uvre-l\`es-Nancy\\
+ FRANCE}
+\netaddress{roegel@loria.fr}
+\personalURL{http://www.loria.fr/~roegel}
+\maketitle
+
+\begin{abstract}
+\MP{} can be used to create animations. We show here an example
+of animation of polyhedra, introducing the \texttt{3d} package.
+\end{abstract}
+
+\section{Introduction}
+
+\MP{} (\citeN{hobby1992}; see also the description in
+\shortciteN{Goossens:LGC97})
+is a drawing language very similar to \MF,
+but whose output is \PS. \MP{} is especially suited for geometrical
+and technical drawings, where a drawing can naturally be decomposed
+in several parts, related in some logical way.
+Knuth is using \MP{} for the revisions of and additions to
+\emph{The Art Of Computer Programming}~\cite{knuth1997},
+and it is or will be a component of every standard \TeX{} distribution.
+
+Unfortunately, \MP{} is still quite bare and the user is only offered
+the raw power\Dash a little bit like the \TeX{} user who only has
+plain \TeX{} at his/her disposal. The lack of libraries is certainly
+due to the infancy of \MP{} (which came in the public domain at the
+beginning of 1995) and thus to the small number of its users.
+
+In this paper, we present a way to produce animations using \MP.
+The technique is quite general and we illustrate it through the \texttt{3d}
+package.
+
+\section{Animations}
+
+The World Wide Web has accustomed us to various animations,
+especially \texttt{java} animations.
+Common components of web pages are animated GIF images.
+
+Producing animations in \MP{} is actually quite easy. A number of
+$n$ images will be computed and their sequence produces the animation.
+The animation will be similar to a movie, with no interaction. More precisely,
+if \verb|an_image(|$i$\verb|)|
+produces a picture parameterized by $i$,
+it suffices to wrap this macro
+between \verb|beginfig| and \verb|endfig|:
+
+\begin{verbatim}
+def one_image_out(expr i)=
+ beginfig(<figure number>);
+ an_image(i);
+ endfig;
+enddef;
+\end{verbatim}
+
+\noindent and to loop over \verb|one_image_out|:
+
+\begin{verbatim}
+for j:=1 upto 100:one_image_out(j);endfor;
+\end{verbatim}
+
+Assuming that \verb|<figure number>|
+is equal to the parameter of \verb|an_image|,
+the compilation of this program will produce
+a hundred files with extensions \verb|.1|, \verb|.2|, \ldots, \verb|.100|.
+All these files are \PS{} files and all we need to do is to find a way
+to collate them in one piece. How to do this depends on the operating
+system. On UNIX for instance, one can use \texttt{Ghostscript}
+to transform a \PS{} file
+into \texttt{ppm} and then transform each \texttt{ppm} file into
+GIF with \texttt{ppmtogif}. These programs are part of the
+\texttt{NETPBM} package~\cite{netpbm}. Finally, a program such as
+\texttt{gifmerge}~\cite{gifmerge}
+creates an animated GIF file (GIF89A)
+out of the hundred individual simple GIFs.
+However, various details must be taken care of. For instance,
+only a part of \texttt{Ghostscript}'s output is needed
+and selection can be made with \texttt{pnmcut}.
+%(which is also part of \texttt{NETPBM}).
+
+The whole process of creating an animation out of \MP's outputs can
+be summed up in a shell script, similar to the one
+in figure~\ref{animation-script}. As we will see, this script (including
+the arguments of \texttt{awk} and \texttt{pnmcut}) can be generated
+automatically by \MP{} itself.
+
+%%fig 1
+\begin{figure*}
+\begin{verbatim}
+#! /bin/sh
+
+/bin/rm -f animpoly.log
+for i in `ls animpoly.*| grep 'animpoly.[0-9]'`;do
+echo $i
+echo '=============='
+# shift each picture so that it lies in the page:
+awk < $i '{print} /^%%Page: /{print "172 153 translate\n"}' > $i.ps
+# produce ppm format:
+gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE -r36 -sOutputFile=$i.ppm -q -- $i.ps
+/bin/rm -f $i.ps
+# produce gif:
+ppmquant 32 $i.ppm | pnmcut 15 99 141 307 | ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif
+/bin/rm -f $i.ppm
+done
+/bin/rm -f animpoly.gif
+# merge the gif files:
+gifmerge -10 -l1000 animpoly.*.gif > animpoly.gif
+/bin/rm -f animpoly.*.gif
+\end{verbatim}
+\caption{Script created by \MP{} (with some additional comments)}
+\label{animation-script}
+\end{figure*}
+
+
+\section{Objects in space}
+
+\subsection{Introduction}
+
+The author applied this idea to the animation of objects
+in space. The macros in the \texttt{3d.mp} package\footnote{On CTAN,
+under \texttt{graphics/metapost/macros/3d}. The code is documented
+with \texttt{MFT}~\cite{knuth1989}
+and illustrated with \MP. This paper describes version 1.0 of the macros.}
+provide a basis for the
+representation of three-dimensional objects. The basic components of
+the objects are the points or the vectors. Both are stored as triplets.
+More precisely, we have three
+arrays\footnote{\MP{} has a few simple types such as \texttt{numeric},
+\texttt{boolean}, \texttt{string}, \texttt{path}, \ldots.
+It also has pairs (\texttt{pair}) and triples (\texttt{color}). We might
+have cheated and stored points as colors, but instead, we found it
+interesting to illustrate a construction equivalent
+to \textsc{Pascal}'s records or C's structures. In \MP, instead of
+having a list or an array of structures, we use several lists or arrays,
+so that a record is a cross-section over several arrays.}
+of type \verb|numeric|:
+
+\begin{verbatim}
+numeric vect[]x,vect[]y,vect[]z;
+\end{verbatim}
+
+Vector $i$'s components are \verb|vect[|$i$\verb|]x|, \verb|vect[|$i$\verb|]y|
+and \verb|vect[|$i$\verb|]z|. It is then straightforward to define the usual
+operations on vectors using this convention. For instance,
+vector addition is defined as:
+
+\begin{verbatim}
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+\end{verbatim}
+
+Often, we need some scratch vectors or vectors local to a macro.
+A simple vector allocation mechanism solves the problem: we use a stack
+of vectors and we reserve and free vectors only on top of the stack.
+For instance, the allocation of a vector is defined by:
+
+\begin{verbatim}
+def new_vect=incr(last_vect_) enddef;
+\end{verbatim}
+
+\noindent where \verb|last_vect_| is the index of the top of the stack.
+Hence, a vector is manipulated by its index on the stack.
+Writing \verb|v:=new_vect;| lets \verb|v| be the index of the newly allocated
+vector.
+
+Freeing a vector is also easy and is only allowed at the top of the stack:
+
+\begin{verbatim}
+def free_vect(expr i)=
+ if i=last_vect_:
+ last_vect_:=last_vect_-1;
+ else: errmessage("Vector " &
+ decimal i & " can't be freed!");
+ fi;
+enddef;
+\end{verbatim}
+
+How these macros are used is made explicit in the \verb|vect_rotate| macro
+which does a rotation of a vector \verb|v| around a vector \verb|axis|
+by an angle \verb|alpha|. This rotation is illustrated
+in figure~\ref{vector-rotation}.
+$\vec{v}$ is written as the sum of $\vec{h}$ and $\vec{a}$ where
+$\vec{h} \perp \vec{a}$. If $\vec{b}$ is
+$\overrightarrow{axis}/{\|\overrightarrow{axis}\|}$, $\vec{c}$ is computed
+as the vector product of $\vec{b}$ and $\vec{a}$ and $\vec{a}$ is then
+rotated in a simple way resulting in $\vec{f}$.
+
+The vectors declared with \verb|new_vect| are freed in the inverse order.
+The \verb|vect_rotate| macro makes use of a few other macros:
+\verb|vect_mod| computes the modulus of a vector; \verb|vect_dprod(a,b)| is
+the dot product of vectors \texttt{a} and \texttt{b}; \verb|vect_mult(b,a,x)|
+lets vector \texttt{b} equal vector \texttt{a} multiplied by the scalar
+\texttt{x}; \verb|vect_sum| and \verb|vect_diff| compute as their first
+argument the sum or the difference of the two other vectors;
+\verb|vect_prod(c,a,b)| lets vector \texttt{c} equal the vectorial
+product of vectors \texttt{a} and \texttt{b}. These macros are
+described in appendix A.
+
+%% fig2
+\begin{figure*}
+\begin{center}
+\includegraphics{vect-fig.9}\hspace{1cm}\includegraphics{vect-fig.10}
+\end{center}
+\caption{Vector rotation}\label{vector-rotation}
+\end{figure*}
+
+\begin{verbatim}
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;v_d:=new_vect;
+ v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v));
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);
+ free_vect(v_d);free_vect(v_c);
+ free_vect(v_b);free_vect(v_a);
+enddef;
+\end{verbatim}
+
+The \verb|3d| package defines other macros in order to set the observer,
+to compute a reference matrix, etc. Provision is given for
+manipulating objects.
+
+
+\subsection{Objects and classes}
+
+The \texttt{3d} package understands a notion of \emph{class}.
+A \emph{class} is a parameterized object. For instance, we have the class
+of regular tetrahedra, the class of regular cubes, etc. Our classes
+are the lowest level of abstraction and classes can not be composed.
+They can only be \emph{instanciated}. When we need a specific tetrahedron,
+we call a generic function to create a tetrahedron, but with an identifier
+specific to one instance.
+
+A class is a set of vertices in space, together with a way to draw
+faces, and therefore edges.
+The author's focus was to manipulate (and later animate) polyhedra.
+As an example, the \verb|poly.mp| package provides the definition of
+each of the five regular convex polyhedra.
+
+Each class consists of two macros: one defines the points,
+the other calls the first macro and defines the faces.
+Each macro has a parameter which is a string identifying
+the particular instance of that class.
+
+\tolerance=4500
+The points of a regular tetrahedron are defined in
+\verb|set_tetrahedron_points|,
+an example of the general macro name \verb|set_|\meta{class}\verb|_points|.
+Five points are defined, four of
+them with \verb|set_obj_point|, a macro which defines points \emph{local}
+to an object. The first four points are the vertices and the fifth
+is the center of the tetrahedron. \verb|set_obj_point|'s first parameter
+is the point number and the other three are the cartesian coordinates.
+The first three points are in a plane and the fourth is obtained with
+the \verb|new_face_point| macro, which folds a face
+(see the description in appendix A for more details).
+The \verb|new_face_point| macro
+is used with the angle \verb|an| which is computed in advance.
+Once the four points are set, the object is normalized, which means
+that it is centered with respect to the list of vertices given
+as parameter (here \verb|1,2,3,4|) and the last vertex is put on a sphere
+of radius 1, centered on the origin. Therefore, point 5 is the center
+of the tetrahedron, and the tetrahedron is set symmetrically
+with respect to the origin.
+
+\tolerance=1000
+All five convex regular polyhedra are defined in this way and may
+therefore be inscribed in a sphere of radius 1.
+
+\begin{verbatim}
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ sinan=1/sqrt(3);
+ cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);
+enddef;
+\end{verbatim}
+
+The second macro, \verb|def_tetrahedron| defines the number of points and
+faces of the instance, calls the previous macro and defines the faces
+with the macro \verb|set_obj_face|.
+The first argument of that macro is a \emph{local}
+face number, the second is a list of vertices such that the list goes clockwise
+when the face is visible. The last argument is the color of the face in RGB.
+
+\begin{verbatim}
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);
+ new_obj_faces(inst,4);
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+\end{verbatim}
+
+The result of the drawing is:
+
+\begin{center}
+\includegraphics{tetra.ps}
+\end{center}
+
+A more complex example is the icosahedron which is defined below.
+
+\begin{verbatim}
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ cosan=1-8/3*cosd(36)*cosd(36);
+ sinan=sqrt(1-cosan*cosan);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ % 1 and 10 are opposite vertices
+ normalize_obj(inst)(1,10);
+ % center of icosahedron
+ set_obj_point(13,0,0,0);
+enddef;
+\end{verbatim}
+
+\begin{verbatim}
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);
+ new_obj_faces(inst,20);
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+\end{verbatim}
+
+Since all points of the objects are stored in a unique global array,
+they are internally
+accessed by the local numbers and an offset defined by the
+macro \verb|new_obj_points|.
+The icosahedron example shows a systematic use of the
+\verb|new_face_point| macro to compute a point on an adjacent face.
+Displaying such an icosahedron results in the figure~\ref{icosahedron}.
+%% fig3
+\begin{figure}[h]
+\begin{center}
+\includegraphics{icosa.ps}
+\end{center}
+\caption{An icosahedron}\label{icosahedron}
+\end{figure}
+
+The other three regular convex polyhedra are:
+\begin{center}
+\includegraphics{cube.ps}
+\end{center}
+
+\begin{center}
+\includegraphics{octa.ps}\hfill\includegraphics{dodeca.ps}
+\end{center}
+
+The dodecahedron code is a bit special, since the vertices are built
+using ten additional points corresponding to face centers. These points
+are defined as an array of variables \verb|fc1| through \verb|fc10|
+with \verb|new_points(fc)(10)|.
+\verb|free_points(fc)(10)| frees them when they are no longer
+necessary. An excerpt of the dodecahedron code is:
+
+\begin{verbatim}
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);
+ set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);
+ rotate_in_plane(3,fc1,1,2);
+ ...
+ free_points(fc)(10);
+enddef;
+\end{verbatim}
+
+
+Finally, wire drawings can be obtained by setting the boolean
+\verb|filled_faces| to false:
+
+\begin{center}
+\includegraphics{icosa-w.ps}
+\end{center}
+
+\subsection{Animating objects}
+
+The animation of one or several objects involves the object(s) and an observer.
+The animation is a set of images and from an image to the next one,
+the observer as well as the objects can move. For instance
+the macro \verb|one_image| in \verb|3d.mp| is:
+
+\begin{verbatim}
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,
+ -rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ % fix point 1 of object |name|
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ % show the rotation point
+ draw_point(name,1);
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+\end{verbatim}
+
+The parameters of this macro are a name of an object (\verb|name|),
+an image index (\verb|i|), and three values defining the position
+of the observer.
+The observer (\verb|Obs| is a global point and set with \verb|set_point|,
+not with \verb|set_obj_point|)
+follows a circle of radius \verb|rd|.
+The parameter \verb|a|, which is usually a function of \verb|i|,
+determines the number of rotation steps
+of the observer, each step being a rotation of angle \verb|ang|.
+The distance between the observer and the
+projection plane is $2$ (see figure~\ref{proj-screen}).
+
+%% fig4
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.8}
+\end{center}
+\caption{Projection on the screen}\label{proj-screen}
+\end{figure*}
+
+%% fig5
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.16}
+\end{center}
+\caption{Orientation of the observer}\label{obs-orientation}
+\end{figure*}
+
+
+The orientation of the observer is defined by three angles
+(see figure~\ref{obs-orientation}). The \verb|Obs_phi| angle
+is given and the two others are computed with a call to
+\verb|point_of_view_obj(name,1,Obs_phi)| which constrains the observer
+to look towards point 1 of object \verb|name|. Therefore, this
+point will seem fixed on the animation and \verb|draw_point(name,1)|
+draws it later so that this feature can be observed.
+There is nothing special about that point, except that it
+remains fix when the object is rotated. The object is drawn
+with \verb|draw_obj(name)| and
+\verb|rotate_obj_pv| rotates the object \verb|name|
+by \verb|ang| degrees around an axis going through point 1
+and directed by vector \verb|vect_I| ($\vec{\imath}$).
+The reference vectors ($\vec\imath$,
+$\vec\jmath$ and $\vec k$) are drawn in red, green and blue with
+\verb|draw_axes|.
+
+Finally, a complete animation of an icosahedron is obtained
+with
+
+\begin{verbatim}
+animate_object("icosahedron",1,100,100);
+\end{verbatim}
+
+\noindent which generates files \verb|anim.101|,
+\ldots, \verb|anim.200| from the main file \verb|anim.mp|.
+The first parameter of \verb|animate_object| is the name of the object
+to animate, the second and third parameters are minimal and maximal
+values of the index loop and the fourth parameter is an offset added
+to the index loop in order to get the file extension, which must lie
+in the interval $0..4096$.
+
+After each image is drawn, the values of the current bounding box
+are used to compute the bounding box of the sequence of images.
+The internal values \verb|xmin_|, \verb|ymin_|, \verb|xmax_|
+and \verb|ymax_| hold the minimal and maximal values of the coordinates
+of the past images' corners.
+They are updated just before each image is shipped out.
+
+\subsection{Putting the pieces together}
+
+Once all the views have been computed, they can be used separately
+(see for instance the five views of figure~\ref{anim-five-views})
+or more interestingly, they can be merged.
+This task is made almost straightforward by \MP{} itself.
+Indeed, every time \verb|animate_object| is used, a shell script
+named \verb|create_animation.sh|
+is generated, as a side-effect of a call to
+\verb|show_animation_bbox|. The script is
+similar to that shown in figure~\ref{animation-script}.
+This script uses the values
+computed for the global bounding box of the sequence of images,
+for these values are necessary in order to extract the right parts
+of the images and get correct alignments; the parts are extracted
+with \texttt{pnmcut}.\footnote{One might think of using
+\texttt{Ghostscript} for generating an excerpt of an image,
+but if \texttt{Ghostscript} is used to generate the bounding box
+of an image, it will in general not be possible to have a good alignment
+between all images. The sizes of the excerpts are only known when all images
+have been produced.}
+If you have the programs
+used in this script (\texttt{Ghostscript}, etc.), you can just run
+it with \verb|sh create_animation.sh| on UNIX. You may need
+to adapt it to your needs, and for that purpose, you can modify the macro
+\verb|write_script| in \verb|3d.mp|.
+
+Some examples are included in the \verb|3d| distribution, and they
+can be viewed for instance with \texttt{netscape} or
+special programs such as \verb|xanim|.
+
+%% fig6
+\begin{figure*}
+\includegraphics[scale=0.5]{anim.1}\hfill
+\includegraphics[scale=0.5]{anim.2}\hfill
+\includegraphics[scale=0.5]{anim.3}\hfill
+\includegraphics[scale=0.5]{anim.4}\hfill
+\includegraphics[scale=0.5]{anim.5}
+
+\caption{Five views of an animation}\label{anim-five-views}
+\end{figure*}
+
+\section{Future}
+
+It is quite easy to improve and extend the \verb|3d| macros but the
+author decided to go no further for the moment. Other objects can
+be implemented easily and new algorithms can be added. For instance
+in order to take light sources or shadows into account, one can compute
+the angles under which a face gets its light, and the angle under which
+this very face is seen, in order to decide how much darker or lighter
+it must be rendered. Another problem is to represent
+overlapping objects correctly. In the current implementation, each
+object is drawn
+independently from the other objects, so that the overlapping may be wrong.
+One solution is to sort all the faces according to their distance
+to the observer and, if two faces can not be ordered, to split them.
+Then, the faces can be drawn starting with the most distant, and
+ending with the closest one.
+Appendix B explains the internal representation of the objects and
+shows that this algorithm can be implemented without much surgery to
+the present code.
+
+\section{Acknowledgments}
+
+Thanks to John Hobby who always answers all my queries on the \MF{} mailing
+list. Thanks to Alain Filbois who helped me with the shell script
+syntax, to Thomas Lambolais and Thomas Genet who gave some feedback
+on this work, and to Dominique Larchey who pointed out a shortcoming
+in the conclusion. Thanks to Denis Barbier who
+was one of the first users of these
+macros and contributed the animated crayons in the distribution. Thanks to
+Bogus\l aw Jackowski who made valuable comments on some peculiarities of
+the code.
+And finally, special thanks to Ulrik Vieth who not only
+pushed me to polish my code and this paper more than I had first intended,
+but also made it possible to use \MP{} under \texttt{web2c}.
+
+\bibliography{paper}
+
+\appendix
+
+\section{Appendix A\\
+Summary of the \texttt{3d} package}
+
+\subsection{Types}
+
+The commands in the \texttt{3d} package take parameters
+of several different types. The types are described here.
+
+\begin{itemize}
+\item An \AVN{} (\emph{Absolute Vector Number}) is the internal
+number identifying a vector in the \verb|vect| array (an integer).
+\item An \APN{} (\emph{Absolute Point Number}) refers to a vector
+in the same way as an \AVN{} (an integer).
+\item A \LPN{} (\emph{Local Point Number}) is a number identifying a
+point \emph{within} an object (an integer). Two \LPN{}s with the same value
+can correspond to different points in different objects.
+\item An \AFN{} (\emph{Absolute Face Number}) is the internal
+number identifying a face.
+\item A \LFN{} (\emph{Local Face Number}) is a number identifying a face
+\emph{within} an object (an integer). As for points, two \LFN{}s with
+the same value
+can correspond to different faces in different objects.
+\item A \CN{} (\emph{Class}) is a string representing a class,
+for instance \verb|"tetrahedron"|. It may only contain
+letters and underscores.
+\item An \IN{} (\emph{Object}) is a string representing an object, that is
+an instance of a class. Such a string may only contain
+letters and underscores.
+\item A \VL{} (\emph{Vertex List}) is a list
+of integers, where each integer identifies a vertex. For instance, \verb|1,7|
+is the list of vertices 1 and 7.
+\item A \VSL{} (\emph{Vertex String List}) is a string corresponding to a list
+of integers, where each integer identifies a vertex. For instance,
+\verb|"1,2,6,5"| is the list of vertices 1, 2, 6 and 5.
+\item \HEXCOL{} (\emph{Hex Color}) is a string representing a color with
+the three RGB components in hexadecimal and in the range
+$0..255$. For instance, \verb|"b4fe40"|.
+\item \COL{} (\emph{Color}) is a standard \MP{} color
+(a triplet of RGB components in the range $0..1$),
+such as \verb|red|.
+\item \STR{} (\emph{String}) is a string.
+\item \PAIR{} (\emph{Pair}) is a pair of numerics.
+\item \NUM{} (\emph{Numeric}) is a number.
+\item \BOOL{} (\emph{Boolean}) is a boolean.
+\end{itemize}
+
+\subsection{Low level vector commands}
+
+The low level vector commands define the classical operations in vector
+algebra.
+
+\begin{itemize}
+\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|: defines vector \AVN{}
+as $(x,y,z)$;
+\item \verb|set_point|; synonym of \verb|vect_def|: a point is stored in the
+same array as vectors.
+\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|:
+this defines the point \LPN{} as $(x,y,z)$;
+\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+vector \AVN$_1$ becomes equal to vector \AVN$_2$;
+\item \verb|vect_sum(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$ becomes the sum of vectors \AVN$_2$ and \AVN$_3$.
+\item \verb|vect_translate(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+add vector \AVN$_2$
+to vector \AVN$_1$; vector \AVN$_2$ remains unchanged.
+\item \verb|vect_diff(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the difference between vectors \AVN$_2$ and \AVN$_3$.
+\item \verb|vect_dprod(|\AVN$_1$\tc\AVN$_2$\verb|)| $\rightarrow $ \NUM{}:
+returns the dot product of vectors \AVN$_1$ and \AVN$_2$.
+\item \verb|vect_mod(|\AVN\verb|)| $\rightarrow $ \NUM{}: returns the
+modulus of vector \AVN.
+\item \verb|vect_prod(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the vector product of vectors \AVN$_2$ and \AVN$_3$.
+
+\tolerance=1000
+\item \verb|vect_mult(|\AVN$_1$\tc\AVN$_2$\tc\NUM\verb|)|: \AVN$_1$
+becomes vector \AVN$_2$ scaled by \NUM.
+\item \verb|mid_point(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+vector (or point) \AVN$_1$ becomes the mid-point of vectors (or of the
+line joining the points)
+\AVN$_2$ and \AVN$_3$.
+\item \verb|vect_rotate(|\AVN$_1$\tc\AVN$_2$\tc$a$\verb|)|: vector \AVN$_1$ is
+rotated around vector \AVN$_2$ by the angle $a$.
+\end{itemize}
+
+
+\tolerance=1000
+\subsection{Operations on objects}
+
+Several operations apply globally on objects:
+
+\begin{itemize}
+\item \verb|assign_obj(|\IN\tc\CN\verb|)|:
+ create \IN{} as an instance of class \CN.
+\item \verb|reset_obj(|\IN\verb|)|: put \IN{} back where it
+ was just after it was initialized.
+\item \verb|put_obj(|\IN\tc\AVN\tc$s$\tc$\psi$\tc$\theta$\tc$\phi$\verb|)|:
+ object \IN{} is scaled by $s$, shifted by vector \AVN{} and
+ oriented with the angles $\psi$, $\theta$, $\phi$,
+ as for the observer orientation (figure~\ref{obs-orientation}).
+\item \verb|rotate_obj_pv(|\IN\tc\LPN\tc\AVN\tc$a$\verb|)|:
+ object \IN{} is rotated
+ around an axis going through local point \LPN{}
+ and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_abs_pv(|\IN\tc\APN\tc\AVN\tc$a$\verb|)|:\break
+ the object \IN{} is rotated around an axis going through absolute
+ point \APN{} and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_pp(|\IN\tc\LPN$_1$\tc\LPN$_2$\tc$a$\verb|)|:
+ \IN{} is rotated around an axis going through local points
+ \LPN$_1$ and \LPN$_2$; the rotation is by $a$ degrees.
+\item \verb|translate_obj(|\IN\tc\AVN\verb|)|: object \IN{} is translated
+ by vector \AVN.
+\item \verb|scale_obj(|\IN\tc$v$\verb|)|: object~\IN{}~is~scaled~by~$v$.
+\end{itemize}
+
+\subsection{Building new points in space}
+
+Three macros are especially useful for the definition of regular polyhedra:
+
+\begin{itemize}
+\item \verb|rotate_in_plane(|$k$\tc$o$\tc$i$\tc$j$\verb|)|:
+get point $k$ from point $j$ by rotation
+around point $o$ by an angle $\alpha$ equal to the angle from $i$ to $j$;
+$i$, $j$ and $k$ are of type \LPN, whereas $o$ is of type \APN.
+
+\begin{center}
+ \includegraphics{vect-fig.11}
+\end{center}
+
+\item \verb|new_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+the middle $m$ of points $i$ and $j$ is such that
+$\widehat{(\overrightarrow{om},\overrightarrow{mc})}=\alpha$
+and $\overrightarrow{mc}$ is $\overrightarrow{om}$ rotated around
+$\overrightarrow{ji}$. $c$, $o$, $i$ and $j$ are of type \LPN.
+
+\begin{center}
+ \includegraphics{vect-fig.7}
+\end{center}
+
+\item \verb|new_abs_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+similar to the previous definition, but $c$ and $o$ are of type \APN.
+
+\end{itemize}
+
+\subsection{Drawing points, axes, objects}
+
+\begin{itemize}
+\item \verb|draw_point(|\IN\tc\LPN\verb|)|: draw point \LPN{} in
+ object \IN.
+\item \verb|draw_axes(|\COL$_1$\tc\COL$_2$\tc\COL$_3$\verb|)|:
+ draw vectors $\vec\imath$, $\vec\jmath$ and $\vec{k}$ in colors
+ \COL$_1$, \COL$_2$ and \COL$_3$.
+\item \verb|draw_obj(|\IN\verb|)|: draw object \IN.
+\end{itemize}
+
+\subsection{Setting faces}
+
+\begin{itemize}
+\item \verb|set_face(|\AFN\tc\VSL\tc\HEXCOL\verb|)|:
+set absolute face \AFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+\item \verb|set_obj_face(|\LFN\tc\VSL\tc\HEXCOL\verb|)|:
+set local face \LFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+
+\end{itemize}
+
+\break
+
+\subsection{View points, distance}
+
+\begin{itemize}
+\item \verb|compute_reference(|$\psi$\tc$\theta$\tc$\phi$\verb|)|: defines
+the orientation of the observer by the three angles $\psi$,
+$\theta$ and $\phi$. See figure~\ref{obs-orientation}.
+
+\item \verb|point_of_view_obj(|\IN\tc\LPN\tc$\phi$\verb|)|: the orientation
+of the observer is defined as looking local point \LPN{} of object \IN,
+with an angle of $\phi$;
+\item \verb|point_of_view_abs(|\APN\tc$\phi$\verb|)|: the observer's
+orientation is defined as looking absolute point \APN{},
+with an angle of $\phi$;
+\item \verb|obs_distance(|$v$\verb|)(|\IN\tc\LPN\verb|)|: let $v$ equal
+the distance between the observer and local point \LPN{} in object \IN{}.
+\end{itemize}
+
+\subsection{Vector and point allocation}
+
+\begin{itemize}
+\item \verb|new_vect|$\rightarrow $ \AVN{}: return a new vector;
+\item \verb|new_point|: synonym of \verb|new_vect|;
+\item \verb|new_points(|$v$\verb|)(|$n$\verb|)|: defines the absolute points
+ $v_1, \ldots, v_n$, using \verb|new_point|;
+\item \verb|free_vect(|\AVN\verb|)|: free vector \AVN;
+\item \verb|free_point(|\APN\verb|)|: free point \APN;
+\item \verb|free_points(|$v$\verb|)(|$n$\verb|)|: frees the absolute points
+ $v_1, \ldots, v_n$, using \verb|free_point|.
+\end{itemize}
+
+\subsection{Debugging}
+
+\begin{itemize}
+\item \verb|show_vect(|\STR\tc\AVN\verb|)|:
+shows vector \AVN, with string \STR.
+\item \verb|show_point|: synonym of \verb|show_vect|
+\item \verb|show_pair(|\STR\tc\PAIR\verb|)|: this shows a numeric pair,
+ with string \STR.
+\end{itemize}
+
+\subsection{Normalization}
+
+\begin{itemize}
+\item \verb|normalize_obj(|\IN\tc\VL\verb|)|: normalize object \IN{}
+with respect to the list of vertices \VL.
+\end{itemize}
+
+\subsection{Parameters}
+
+\begin{itemize}
+\item \verb|Obs_dist| $\rightarrow$ \NUM: distance between the observer
+ and the projection plane.
+\item \verb|h_field| $\rightarrow$ \NUM: horizontal field of view
+ (default: 100 degrees)
+\item \verb|v_field| $\rightarrow$ \NUM: vertical field of view
+ (default: 70 degrees)
+\item \verb|Obs_phi| $\rightarrow$ \NUM: angle $\phi$ for the orientation
+ of the observer;
+\item \verb|Obs_theta| $\rightarrow$ \NUM: angle $\theta$ for the orientation
+ of the observer;
+\item \verb|Obs_psi| $\rightarrow$ \NUM: angle $\psi$ for the orientation
+ of the observer;
+\item \verb|drawing_scale| $\rightarrow$ \NUM: scale factor applied for
+ drawing;
+\item \verb|filled_faces| $\rightarrow$ \BOOL: if \texttt{true}, the faces
+ are drawn filled; if \texttt{false}, only the edges are drawn,
+ and hidden edges are drawn dashed;
+\item \verb|draw_contours| $\rightarrow$ \BOOL: if \texttt{true}, the contours
+ of the faces are drawn, and the lines have the thickness
+ \verb|contour_width|; if \texttt{false}, the contours are not drawn;
+\item \verb|contour_width| $\rightarrow$ \NUM: dimension used for drawing
+ contours of faces (default: 1pt).
+\end{itemize}
+
+\subsection{Constants}
+
+These values represent constant objects such
+as reference vectors, and should not be changed.
+
+\begin{itemize}
+\item \verb|vect_null| $\rightarrow$ \AVN: internal index for $\vec0$.
+\item \verb|vect_I| $\rightarrow$ \AVN: internal index for $\vec\imath$.
+\item \verb|vect_J| $\rightarrow$ \AVN: internal index for $\vec\jmath$.
+\item \verb|vect_K| $\rightarrow$ \AVN: internal index for $\vec k$.
+\item \verb|point_null| $\rightarrow$ \APN: internal index for $\vec0$.
+\item \verb|Obs| $\rightarrow$ \APN: observer's internal point number.
+\end{itemize}
+
+\subsection{Defining new object points and faces}
+
+\begin{itemize}
+\item \verb|new_obj_points(|\IN\tc\NUM\verb|)|:
+ defines points $1$ to \NUM{} in object \IN; must be used before setting
+ the points;
+\item \verb|new_obj_faces(|\IN\tc\NUM\verb|)|:
+ defines \NUM{} faces in object \IN; must be used before setting
+ the faces;
+\end{itemize}
+
+\subsection{Offsets}
+
+\begin{itemize}
+\item \verb|pnt(|\LPN\verb|)| $\rightarrow$ \APN: returns the absolute point
+number for a given local point index.
+\item \verb|face(|\LFN\verb|)| $\rightarrow$ \AFN: returns the absolute face
+number for a given local face index.
+\end{itemize}
+
+\subsection{Standard classes}
+
+Five standard classes are defined in \texttt{poly.mp}:
+they define the five regular convex polyhedra. For each class \meta{class},
+there are two macros:
+
+\begin{itemize}
+
+\item \verb|set_|\meta{class}\verb|_points|
+ (e.g. \verb|set_cube_points|)
+
+\item \verb|def_|\meta{class} (e.g. \verb|def_cube|)
+
+\end{itemize}
+
+Each of these macros is defined with a parameter which is the instance
+name.
+
+\subsection{Standard animations}
+
+The \texttt{3d} package provides a few standard animations using
+the convex polyhedra. In each of these animations, the observer
+follows a circular path pictured in figure~\ref{observer-motion}.
+Each standard animation is divided into two macros. The first,
+such as \verb|animate_object|, defines the class(es) that are used
+and sets the objects. The second, such as \verb|one_image|, sets
+the observer, draws the object(s) and moves the object(s) and the
+observer. The file \verb|animpoly.mp| gives examples of the use
+of the standard animations.
+
+\iffalse
+\begin{itemize}
+\item \verb|one_image(name,i,a)|
+\item \verb|one_image_two_objects(name_a,name_b,i,a)|
+\item \verb|one_image_three_objects(name_a,name_b,name_c,i,a)|
+\item \verb|one_image_two_identical_objects(name_a,name_b,i,a)|
+\item \verb|animate_object(name,imin,imax,index)|
+\item \verb|animate_two_objects(name_a,name_b,imin,imax,index)|
+\item \verb|animate_three_objects(name_a,name_b,name_c,imin,imax,index)|
+\item \verb|animate_two_identical_objects(name,imin,imax,index)|
+\end{itemize}
+\fi
+
+%% fig7
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.17}
+\end{center}
+\caption{Motion of the observer}\label{observer-motion}
+\end{figure*}
+
+\section{Appendix B\\
+Coding an object}
+
+In order to extend the \texttt{3d} package, it is necessary to
+understand how the objects are coded. We give here an overview of
+this coding, but the reader is advised to peek in the code to get
+a better understanding on how all the functions interact.
+
+First, an object has a name, for instance \verb|"box"|.
+The macro \verb|box_class| (which can be called with \verb|obj_class_("box")|)
+is the string corresponding to the class of
+\verb|"box"|, for instance \verb|"cube"|.
+The variable \verb|cube_point_offsetbox|, of type \texttt{numeric},
+and obtained with \verb|obj_point_offset_("box")|,
+is equal to the absolute index of the last
+point of the previous object. A cube is defined with $8+1$ points. Assuming
+it was defined after an icosahedron ($12+1$ points) named
+\verb|"ico"|, \verb|cube_point_offsetbox| will be a \verb|numeric|
+equal to $13$. \verb|cube_pointsbox|
+(obtained with \verb|obj_points_("box")|)
+is a macro equal to $9$.
+%(\verb|current_point_offset_| is equal to \verb|cube_point_offsetbox|.)
+The variable \verb|cube_face_offsetbox|,
+similar to \verb|cube_point_offsetbox|,
+obtained with a call to \verb|obj_face_offset_("box")|,
+equals $20$.
+The macro \verb|cube_facesbox|
+(obtained by \verb|obj_faces_("box")|)
+is equal to $6$.
+%(\verb|current_face_offset_| is equal to \verb|cube_face_offsetbox|.)
+
+The \verb|obj_name| macro is extended each time a new object is defined.
+To an absolute face number, it associates an object name. Hence, it is possible
+to go through all faces. \verb|last_point_offset_| and
+\verb|last_face_offset_| are the absolute numbers of the last points and faces
+defined up to now.
+
+\begin{verbatim}
+def obj_name(expr i)=
+ if i<1: elseif i<=20:"ico"
+ elseif i<=26:"box"
+ fi;
+enddef;
+\end{verbatim}
+
+\verb|pnt(i)| gives the absolute vector corresponding to local point $i$.
+\verb|ipnt_(i)| is the absolute point number, that is $i$ plus the number
+of points defined beforehand in other objects.
+\verb|points_[j]| is the absolute vector corresponding to absolute object
+point $j$. Similarly, \verb|face(i)|
+is the absolute face corresponding to local face $i$.
+
+The list of vertices of absolute face number $i$ is \verb|face_points_[i]|.
+The color of absolute face number $i$ is \verb|face_color_[i]|.
+
+
+When the macros \verb|pnt| or \verb|face| are to be used, the calls
+\verb|define_current_point_offset_("box")| and
+\verb|define_current_face_offset_("box")| must be issued.
+
+
+\makesignature
+
+\end{document}
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.dvi b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.dvi
new file mode 100644
index 0000000000..f17ba557d8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.log b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.log
new file mode 100644
index 0000000000..e4189be548
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.log
@@ -0,0 +1,18 @@
+This is TeX, Version 3.14159 (C version 6.1) (format=tex 97.10.9) 9 APR 1998 14:12
+**poly \end
+(poly.tex
+Babel <v3.6h> and hyphenation patterns for american, german, loaded.
+(/usr/local/pkg/teTeX/texmf/tex/plain/base/mftmac.tex
+\shorthyf=\box16
+)
+(/usr/local/pkg/teTeX/texmf/tex/generic/dvips/epsf.tex
+\epsffilein=\read0
+\epsfxsize=\dimen16
+\epsfysize=\dimen17
+\epsftsize=\dimen18
+\epsfrsize=\dimen19
+\epsftmp=\dimen20
+\pspoints=\dimen21
+) [1] [2] [3] [4]
+[5] [6] [7] [8]) [9]
+Output written on poly.dvi (9 pages, 23940 bytes).
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.mp
new file mode 100644
index 0000000000..0fc106877e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.mp
@@ -0,0 +1,274 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\def\vc#1{$\vcenter{#1}$}
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf POLY.MP: DEFINITION OF REGULAR CONVEX POLYHEDRA IN METAPOST}}
+
+%% version 1.0, 8 April 1998
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+%%
+%%This package defines the five regular convex polyhedra classes and
+%%must be used with the {\bf 3d} package.
+
+%%Each object definition is parameterized by
+%%an instance identification.
+
+%%All polyhedra are normalized (centered on the origin and inscriptible
+%%in a sphere of radius 1).
+
+%%The polyhedra are defined with a certain number of points and faces.
+%%The points comprise both the vertices and the center of the object.
+
+%%It might be useful to remind the Euler formula linking
+%%the number of faces $f$,
+%%vertices $v$ and edges $e$ in polyhedra with no hole in dimension 3:
+%%$f+v-e=2$. This can be verified in the following table:
+
+%%\centerline{\vbox{\halign{\quad#\hfil\quad&&\quad\hfil#\quad\cr
+%% \omit \hfil type\hfil&\omit\hfil faces\hfil
+%% &\omit\hfil vertices\hfil&\omit\hfil edges\hfil\cr
+%% tetrahedron&4&4&6\cr
+%% cube&6&8&12\cr
+%% octahedron&8&6&12\cr
+%% dodecahedron&12&20&30\cr
+%% icosahedron&20&12&30\cr}}}
+
+%%For more details, see the documentation enclosed in the distribution.
+
+message "*** poly, version 1.0 (c) D. Roegel, 8 April 1998 ***";
+
+%%\newpage\title{TETRAHEDRON (4 faces)\kern1cm\epsfbox{tetra.ps}}
+
+%% Construction of a tetrahedron:
+
+%% One face is \vc{\epsfbox{vect-fig.1}} with $h=c\sqrt{3}/2$
+
+%% The angle $\alpha$ between two faces is given by
+%% $\sin(\alpha/2)={\displaystyle c/2\over \displaystyle c\sqrt{3}/2}=1/\sqrt3$
+
+%% \figure{vect-fig.2}
+
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);% $60=360/6$
+ sinan=1/sqrt(3);cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);% center of tetrahedron
+enddef;
+
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);% 4 vertices and the center
+ new_obj_faces(inst,4);% 4 faces in the definition
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+
+%%\newpage\title{CUBE (HEXAHEDRON) (6 faces)\kern1cm\epsfbox{cube.ps}}
+
+%%The definition of a cube is straightforward.
+
+def set_cube_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,1,1,0);
+ set_obj_point(4,0,1,0);
+ set_obj_point(5,0,0,1);
+ set_obj_point(6,1,0,1);
+ set_obj_point(7,1,1,1);
+ set_obj_point(8,0,1,1);
+ normalize_obj(inst)(1,7);% 1 and 7 are opposite vertices
+ set_obj_point(9,0,0,0);% center of cube
+enddef;
+
+vardef def_cube(expr inst)=
+ new_obj_points(inst,9);% 8 vertices and the center
+ new_obj_faces(inst,6);% 6 faces in the definition
+ set_cube_points(inst);
+ set_obj_face(1,"1,2,6,5","b4fe40");
+ set_obj_face(2,"2,3,7,6","45d040");
+ set_obj_face(3,"4,8,7,3","45a114");
+ set_obj_face(4,"1,5,8,4","45a1d4");
+ set_obj_face(5,"5,6,7,8","4569d4");
+ set_obj_face(6,"4,3,2,1","112da1");
+enddef;
+
+
+%%\newpage\title{OCTAHEDRON (8 faces)\kern1cm\epsfbox{octa.ps}}
+
+%% A section of a pyramid is: \vc{\epsfbox{vect-fig.3}}
+
+%% The height of this pyramid is given
+%% by $H^2={(c\sqrt3/2)}^2-{(c/2)}^2=c^2/2$, hence $H=c/\sqrt2$
+
+def set_octahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,1,1,0);
+ set_obj_point(4,0,1,0);
+ set_obj_point(5,.5,.5,1/sqrt(2));
+ set_obj_point(6,.5,.5,-1/sqrt(2));
+ normalize_obj(inst)(5,6);% 5 and 6 are opposite vertices
+ set_obj_point(7,0,0,0);% center of octahedron
+enddef;
+
+vardef def_octahedron(expr inst)=
+ new_obj_points(inst,7);% 6 vertices and the center
+ new_obj_faces(inst,8);% 8 faces in the definition
+ set_octahedron_points(inst);
+ set_obj_face(1,"1,2,5","b4fefe");
+ set_obj_face(2,"2,3,5","45d040");
+ set_obj_face(3,"3,4,5","4569d4");
+ set_obj_face(4,"4,1,5","b49bc0");
+ set_obj_face(5,"6,1,4","45a1d4");
+ set_obj_face(6,"6,2,1","b4c8fe");
+ set_obj_face(7,"6,3,2","b49b49");
+ set_obj_face(8,"6,4,3","112da1");
+enddef;
+
+
+%%\newpage\title{DODECAHEDRON (12 faces)\kern1cm\epsfbox{dodeca.ps}}
+
+%% Two adjacent faces (pentagons) of the dodecahedron are as follows:
+%%\figure{vect-fig.13}
+%% The angle between the faces is the angle between $\overrightarrow{OA}$
+%% and $\overrightarrow{OB}$.
+%% $OA=OB=d_3$ as defined in \figure{vect-fig.14}
+%% $d_1=2r\sin(\pi/5)$, $d_2=2r\sin(2\pi/5)$
+%% and $d_3=d_1\sin(2\pi/5)=2r\sin(\pi/5)\sin(2\pi/5)$
+%%
+%% The angle $\alpha$ is defined by the following conditions:
+%% \figure{vect-fig.15}
+%% Thus $d_2^2=d_3^2+d_3^2-2d_3^2\cos\alpha$, which leads to
+%% $\cos\alpha=1-{\displaystyle d_2^2\over\displaystyle2d_3^2}
+%% =-{\displaystyle\cos(2\pi/5)\over\displaystyle2\sin^2(\pi/5)}$
+%%\newpage
+
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);% 72=360/5
+ rotate_in_plane(3,fc1,1,2);
+ rotate_in_plane(4,fc1,2,3);
+ rotate_in_plane(5,fc1,3,4);
+ cosan=-cosd(72)/(2*sind(36)*sind(36));sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_abs_face_point(fc2,fc1,1,2,an);
+ new_abs_face_point(fc3,fc1,2,3,an);
+ new_abs_face_point(fc4,fc1,3,4,an);
+ new_abs_face_point(fc5,fc1,4,5,an);
+ new_abs_face_point(fc6,fc1,5,1,an);
+ rotate_in_plane(6,fc2,2,1);
+ rotate_in_plane(7,fc2,1,6);
+ rotate_in_plane(8,fc2,6,7);
+ rotate_in_plane(9,fc3,2,8);
+ rotate_in_plane(10,fc3,8,9);
+ rotate_in_plane(11,fc4,3,10);
+ rotate_in_plane(12,fc4,10,11);
+ rotate_in_plane(13,fc5,4,12);
+ rotate_in_plane(14,fc5,12,13);
+ rotate_in_plane(15,fc6,5,14);
+ new_abs_face_point(fc7,fc2,6,7,an);
+ new_abs_face_point(fc8,fc3,8,9,an);
+ new_abs_face_point(fc9,fc4,10,11,an);
+ new_abs_face_point(fc10,fc5,12,13,an);
+ rotate_in_plane(16,fc7,6,15);
+ rotate_in_plane(17,fc7,15,16);
+ rotate_in_plane(18,fc8,7,17);
+ rotate_in_plane(19,fc9,9,18);
+ rotate_in_plane(20,fc10,11,19);
+ normalize_obj(inst)(2,20);% opposite vertices
+ set_obj_point(21,0,0,0);% center of dodecahedron
+ free_points(fc)(10);
+enddef;
+%%\newpage
+vardef def_dodecahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,21);% 21 points in the definition
+ new_obj_faces(inst,12);% 12 faces in the definition
+ set_dodecahedron_points(inst);
+ set_obj_face(1,"5,4,3,2,1","ff0fa1");
+ set_obj_face(2,"8,7,6,1,2","b40000");
+ set_obj_face(3,"10,9,8,2,3","b49b49");
+ set_obj_face(4,"12,11,10,3,4","b49bc0");
+ set_obj_face(5,"14,13,12,4,5","b4c8fe");
+ set_obj_face(6,"6,15,14,5,1","b4fefe");
+ set_obj_face(7,"6,7,17,16,15","b4fe40");
+ set_obj_face(8,"8,9,18,17,7","45d040");
+ set_obj_face(9,"10,11,19,18,9","45a114");
+ set_obj_face(10,"11,12,13,20,19","45a1d4");
+ set_obj_face(11,"14,15,16,20,13","4569d4");
+ set_obj_face(12,"16,17,18,19,20","112da1");
+enddef;
+
+%%\newpage\title{ICOSAHEDRON (20 faces)\kern1cm\epsfbox{icosa.ps}}
+
+%%Two faces of an icosahedron are linked in the following way:
+
+%% \vc{\epsfbox{vect-fig.4}} where $h=c\sqrt3/2$
+
+%% $d$ is also a diagonal in a pentagon: \vc{\epsfbox{vect-fig.5}}
+
+%% $c=2r\sin(\pi/5)$,
+%% $d=2r\sin(2\pi/5)=2c\cos(\pi/5)$
+
+%% The angle between two faces is computed as follows:
+%% \vc{\epsfbox{vect-fig.6}}
+
+%% We have ${(2\cos(\pi/5))}^2=2{(\sqrt3/2)}^2-2{(\sqrt3/2)}^2\cos\alpha$
+
+%% Thus $cos\alpha=1-{8\over3}\cos^2(\pi/5)$
+%%\newpage
+
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);% 60=360/6
+ cosan=1-8/3*cosd(36)*cosd(36);sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ normalize_obj(inst)(1,10);% opposite vertices
+ set_obj_point(13,0,0,0);% center of icosahedron
+enddef;
+
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);% 12 vertices and the center
+ new_obj_faces(inst,20);% 20 faces in the definition
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.ps
new file mode 100644
index 0000000000..0e3b833404
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.ps
@@ -0,0 +1,1861 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: poly.dvi
+%%Pages: 9
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentPaperSizes: A4
+%%EndComments
+%DVIPSCommandLine: dvips -Z -t a4 -o poly.ps poly.dvi
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1998.04.09:1412
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: finclude.pro
+/fstore{dup dict exch{dup 4 2 roll put}repeat def}bind def /fshow{gsave
+72 TeXDict /Resolution get div -72 TeXDict /VResolution get div scale 1
+DVImag div dup scale get cvx exec show grestore}bind def
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale true def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (poly.dvi)
+@start /Fa 20 123 df<14F8EB07FE90381F871C90383E03FE137CEBF801120148486C
+5A485A120FEBC001001F5CA2EA3F801403007F5C1300A21407485C5AA2140F5D48ECC1C0
+A2141F15831680143F1587007C017F1300ECFF076C485B9038038F8E391F0F079E3907FE
+03FC3901F000F0222677A42A>97 D<133FEA1FFFA3C67E137EA313FE5BA312015BA31203
+5BA31207EBE0F8EBE7FE9038EF0F80390FFC07C013F89038F003E013E0D81FC013F0A213
+80A2123F1300A214075A127EA2140F12FE4814E0A2141F15C05AEC3F80A215005C147E5C
+387801F8007C5B383C03E0383E07C0381E1F80D80FFEC7FCEA01F01C3B77B926>I<147F
+903803FFC090380FC1E090381F0070017E13784913383901F801F83803F003120713E012
+0FD81FC013F091C7FC485AA2127F90C8FCA35A5AA45AA3153015381578007C14F0007EEB
+01E0003EEB03C0EC0F806CEB3E00380F81F83803FFE0C690C7FC1D2677A426>I<ED01F8
+15FFA3150316F0A21507A216E0A2150FA216C0A2151FA21680A2153FA202F81300EB07FE
+90381F877F90383E03FF017C5BEBF80112013803F00048485B120FEBC001121F5DEA3F80
+1403127F01005BA214075A485CA2140FA248ECC1C0A2141F15C3ED8380143F1587007C01
+7F1300ECFF076C485B9038038F8E391F0F079E3907FE03FC3901F000F0253B77B92A>I<
+147F903803FFC090380FC1E090383F00F0017E13785B485A485A485A120F4913F8001F14
+F0383F8001EC07E0EC1F80397F81FF00EBFFF891C7FC90C8FC5A5AA55AA21530007C1438
+1578007E14F0003EEB01E0EC03C06CEB0F806CEB3E00380781F83803FFE0C690C7FC1D26
+77A426>I<ED07C0ED1FF0ED3E38ED7C3CEDF8FC15F9140115F1020313F8EDF0F0160014
+075DA4140F5DA4141F5D010FB512C05B16809039003F800092C7FCA45C147EA414FE5CA4
+13015CA413035CA413075CA4130F5CA3131F5CA391C8FC5B121CEA7E3EA2EAFE3C137C13
+78EAF8F01278EA3FC0EA0F80264C82BA19>I<EB03F0EA01FFA3EA00075CA3130F5CA313
+1F5CA3133F91C8FCA35B90387E07F0EC1FFCEC783E9038FFE01F02C01380EC800F140048
+5A16C05B49EB1F8012035BA2153F000715005BA25D000F147E5B15FE5D121FD98001131C
+15F8163C003F01031338010013F0A216704814E0007E15F016E0EDE1C000FE903801E380
+48903800FF000038143C263B7BB92A>104 D<EB01C0EB07E014F0130F14E01307EB0380
+90C7FCAB13F0EA03FCEA071EEA0E1F121CA212385B1270A25BEAF07E12E013FEC65AA212
+015B1203A25B12075BA2000F13E013C013C1001F13C01381A2EB83801303EB0700A2130E
+6C5AEA07F8EA01E0143879B619>I<150E153F157FA3157E151C1500ABEC1F80EC7FC0EC
+F1F0EB01C090380380F813071401130F130E131EEB1C03133C013813F0A2EB0007A215E0
+A2140FA215C0A2141FA21580A2143FA21500A25CA2147EA214FEA25CA21301A25CA21303
+5C121C387E07E0A238FE0FC05C49C7FCEAF83EEA787CEA3FF0EA0FC0204883B619>I<EB
+0FC0EA07FFA3EA001F1480A2133FA21400A25BA2137EA213FEA25BA21201A25BA21203A2
+5BA21207A25BA2120FA25BA2121FA25BA2123FA290C7FCA25AA2EA7E0EA212FE131EEAFC
+1CA2133C133812F81378EA7870EA7CE0121FEA0F80123B79B915>108
+D<D801E001FEEB07F03C07F803FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F
+78D9F3C013803C383FF001F7800F02E01400007801C013FE007018C002805B4A4848EB1F
+80EAF07FD8E07E5CA200000207143F01FE1700495CA2030F5C0001177E495C18FE031F5C
+120349DA8001131C18F8033F153C00070403133849020013F0A24B1570000F17E049017E
+15F019E003FEECE1C0001FEE01E34949903800FF000007C70038143C3E2679A444>I<D8
+01E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F787F39383FF00114E00078
+13C000708114804A485AEAF07FEAE07EA20000140701FE5C5BA2150F00015D5B151F5E12
+034990383F8380160316070007027F130049137EA2160E000F147C49141E161C5E001FEC
+3C7849EB1FE00007C7EA0780292679A42F>I<147F903803FFC090380FC1F090381F00F8
+017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7FCA215FF5A
+4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003EEB3F00147E
+6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391FE03FF09039
+3CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA01E113C15C
+A2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E013F495A
+6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201A25BA212
+03A25B1207B512C0A3293580A42A>I<3903C003F0390FF01FFC391E783C0F381C7C703A
+3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FCEAE0FE5BA2120012
+015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E212679A423>114
+D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F00001130313F0A2
+15E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C01300143F141F14
+0F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB45AD801FEC7FC
+1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E007FB5FCA2B6FC
+3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C003F1338EB0078
+147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B31C>I<13F8D8
+03FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C01270013F131F
+00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE120349EBFC0EA2
+0201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A00F83C78E090
+393FF03FC090390FC00F00272679A42D>I<01F01507D803FC903903801F80D8071E9039
+07C03FC0D80E1F130F121C123C0038021F131F49EC800F00701607A249133FD8F07E1680
+00E0ED000313FEC64849130718000001147E5B03FE5B0003160E495BA2171E0007010114
+1C01E05B173C1738A217781770020314F05F0003010713016D486C485A000190391E7C07
+802800FC3C3E0FC7FC90393FF81FFE90390FE003F0322679A437>119
+D<903903C0038090380FF007D91FF81300496C5A017F130E9038FFFE1E9038F83FFC3901
+F007F849C65A495B1401C7485A4A5A4AC7FC141E5C5C5C495A495A495A49C8FC131E5B49
+131C5B4848133C48481338491378000714F8390FF801F0391FFF07E0383E1FFFD83C0F5B
+00785CD8700790C7FC38F003FC38E000F021267BA422>122 D E
+/Fb 10 58 df<EB3F803801FFF03803E0F83807803C48487E001E7F003E1480A2003C13
+07007C14C0A400FC14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A3803E0F86C
+B45A38003F801B277EA521>48 D<13381378EA01F8121F12FE12E01200B3AB487EB512F8
+A215267BA521>I<13FF000313E0380E03F0381800F848137C48137E00787F12FC6CEB1F
+80A4127CC7FC15005C143E147E147C5C495A495A5C495A010EC7FC5B5B903870018013E0
+EA0180390300030012065A001FB5FC5A485BB5FCA219267DA521>I<13FF000313E0380F
+01F8381C007C0030137E003C133E007E133FA4123CC7123E147E147C5C495AEB07E03801
+FF8091C7FC380001E06D7E147C80143F801580A21238127C12FEA21500485B0078133E00
+705B6C5B381F01F03807FFC0C690C7FC19277DA521>I<1438A2147814F81301A2130313
+071306130C131C131813301370136013C012011380EA03005A120E120C121C5A12305A12
+E0B612E0A2C7EAF800A7497E90383FFFE0A21B277EA621>I<0018130C001F137CEBFFF8
+5C5C1480D819FCC7FC0018C8FCA7137F3819FFE0381F81F0381E0078001C7F0018133EC7
+FC80A21580A21230127C12FCA3150012F00060133E127000305B001C5B380F03E03803FF
+C0C648C7FC19277DA521>I<EB0FE0EB3FF8EBF81C3801E0063803C01F48485AEA0F005A
+121E003E131E91C7FC5AA21304EB3FC038FCFFF038FDC078B4C67E143E48131E141FA248
+1480A4127CA4003C1400123E001E131E143E6C133C6C6C5A3803C1F03801FFC06C6CC7FC
+19277DA521>I<1230123C003FB512E0A215C0481480A239700007000060130E140C4813
+1C5C5CC75A5C1301495AA249C7FC5B130E131EA3133E133CA2137CA413FCA813781B287D
+A621>I<137F3803FFE0380781F8380E007C48131E5A801278A3127C007E131EEA3F80EB
+E03C6C6C5A380FFCF03807FFC06C5BC613E0487F38079FFC380F07FEEA1E0348C67E4813
+3FEC1F8048130FA21407A315001278140E6C5B6C5B380F80F03803FFE0C66CC7FC19277D
+A521>I<137F3801FFC03807C1E0380F0070001E1378003E7F003C133E007C131EA200FC
+131FA41580A4007C133FA2123C003E137F121E380F01DF3807FF9F3801FE1FD800101300
+1300A2143E123C007E133CA25C5C007C5B383003C0381C0780D80FFFC7FCEA03F819277D
+A521>I E /Fc 1 113 df<186018E0170118C0170318801707EF0F00170E171E171C173C
+17381778177017F05F16014C5A5F160794C7FC5E160E161E161C163C1638486C14780007
+5DD81FC05C003F1401D8F7E05C00C31403D803F05C000114076D91C8FC00005C6D130E01
+7C131E017E5B013E1338013F13786D1370EC80F0010F5B14C101075B14E301035B14F76D
+B4C9FC5C13005C147C14781438333A7B8237>112 D E /Fd 35 122
+df<003C131E007F137F481480A66C1400A6007E7FA6003E133EA3003C131E001C131C19
+1977B32C>34 D<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A
+5B12075B120F5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7EA27F121FA2
+6C7E7F12077F12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC130113001438
+164272B92C>40 D<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F
+14C0130FEB07E0A214F01303A214F81301A314FC1300AC130114F8A3130314F0A2130714
+E0A2EB0FC0131F1480133F14005B13FE485A485A485A485AEA3FC0485A48C7FC5A5A1270
+164279B92C>I<EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF00
+3FB512F8000F14E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839FF
+E7CFFEEBC7C7EB07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>I<EA
+0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0
+EA7FC0EAFF80130012FC12700E17718A2C>44 D<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA
+3F80EA1F000B0B708A2C>46 D<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF03903
+F803F848486C7EEBE0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A3007C
+140700FC15E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE00075C
+EBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>48
+D<1307497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB5
+12E0B612F0A36C14E01C3477B32C>I<EB0FF890387FFF8048B512E00007804814FC391F
+F80FFE393FE001FF903880007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E
+123CC8FCA2150F16C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF8049
+48C7FC495A495A495AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48
+B6FCB7FCA36C15C023347CB32C>I<EB0FFC90387FFF8048B512E0000714F84880391FF8
+07FEEBC0004848137F6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1F
+F890381FFFF0495BA215F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA216E01507A2
+123C127EB4FC150F16C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C
+6C14E0C66C1380D90FFCC7FC23357CB32C>I<EC07F04A7E141F143FA2147EA214FCEB01
+F8A2EB03F0EB07E0A2EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B1207485AA2485A
+48C7FCA2127E5AB712FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E13F02734
+7EB32C>I<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E015F8819038
+FE03FE9038F000FF01C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127EB4FC
+150F16C0A248141F007EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C0001
+14C06C6C90C7FCEB0FF823347CB22C>I<EC3FC0903801FFF801077F011F7F497F90387F
+E07F9039FF003F804848137FEA03F8485A5B000FEC3F004848131E4990C7FC123F90C9FC
+A25A127EEB03FE90381FFF80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE9038C0
+007F49EB3F8090C7121F16C048140F16E01507A3127EA47E150F6D14C0001F141F6D1480
+000F143F6DEB7F003907F801FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7FC2335
+7CB32C>I<1278B712C016E0A316C000FCC7EA3F80ED7F0015FE00785CC712014A5A4A5A
+5D140F5D4A5A143F92C7FC5C147E14FE5C13015CA2495AA213075CA3495AA4495AA5133F
+91C8FCAA131E23357CB32C>I<EB07FC90383FFF8090B512E0000314F84880390FFC07FE
+391FF001FF9038C0007F4848EB3F8090C7121F4815C0007E140FA56CEC1F80A26C6CEB3F
+006D5B390FF001FE3903FC07F86CB55A6C6C13C0D907FCC7FC90387FFFC048B512F03903
+FC07F8390FF001FE391FC0007F497F48C7EA1F80007EEC0FC0A248EC07E0A7007EEC0FC0
+A2007F141F6C6CEB3F806C6CEB7F009038F001FF390FFC07FE6CB55A6C5CC614E0013F13
+80D907FCC7FC23357CB32C>I<EB07FCEB3FFF90B512C0488048803907FC07F8390FF001
+FC48486C7ED83F80137E157F48C77E007EEC1F8012FE5AED0FC0A416E0A37E127E007F14
+1F7E6D133F6C6C137F390FF001FF3807FC0F6CB6FC6C14F76C14C7013F130FD90FF813C0
+90C7FCA2151F1680153F1600000F5C486C137E486C13FE4A5A4A5A14079038801FF0391F
+E07FE090B55A6C91C7FC6C5B000113F838007FC023357CB32C>I<14FE497EA4497FA214
+EFA2130781A214C7A2010F7FA314C390381F83F0A590383F01F8A490387E00FCA549137E
+90B512FEA34880A29038F8003FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB5
+14FE6C15FC497E27347EB32C>65 D<007FB5FCB612C015F0816C803907E003FEEC00FFED
+7F80153FED1FC0ED0FE0A2150716F0150316F81501A4ED00FCACED01F8A3150316F0A215
+0716E0150FED1FC0153FED7F80EDFF00EC03FE007FB55AB65A5D15C06C91C7FC26337EB2
+2C>68 D<387FFFFCB67E15E015F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5A
+A2153F4BC7FCEC01FE140790B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE
+1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8EA01F029347EB22C>82
+D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8
+127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F
+14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>
+97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16809138F07FC09138
+801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13
+036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F83900F03FC027
+337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49137E
+4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F0039
+07FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<EC0FFE4A7EA380EC
+003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E497E48487F90C7FC
+007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807FC1F6CB612FC6CEC
+BFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFFC0017F13F048B57E
+48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E15E015075A
+B7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001
+FF13FF000190B512806C1500013F13FC010F13F00101138023247CA32C>I<EC0FF8EC3F
+FE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA6007FB512FEB7FCA36C
+5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03F8903907F80FFC90
+391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A0FE001FC1CD9C000
+1300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048B5FC5D481480D99F
+FEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E04815F03A3FC0001F
+F848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15FCD87F801303D83F
+E0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F8010713C028387EA42C>
+I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A800
+7FB512FCB612FEA36C14FC1F3479B32C>105 D<387FFFE0B57EA37EEA0003B3B3A5007F
+B61280B712C0A36C158022337BB22C>108 D<397FF01FE039FFF87FFC9038F9FFFE01FB
+7F6CB6FC00019038F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480
+A36C01E0140029247FA32C>110 D<EB07FCEB1FFF017F13C048B512F048803907FC07FC
+390FF001FE48486C7E0180133F003F158090C7121F007EEC0FC0A348EC07E0A76C140F00
+7E15C0A2007F141F6C15806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C
+6C13C0011F90C7FCEB07FC23247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C
+158000019038F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA8
+16FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB
+5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B27367FA32C>I<D87FFEEB3FC0B538
+01FFF0020713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5C
+A391C8FCAF007FB512E0B67EA36C5C26247EA32C>114 D<90387FF8700003B512F8120F
+5A5A387FC00F387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80
+000314E0C66C13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E
+6D13FE9038F007FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<3A7FFF01FF
+FCB514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E
+017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF0103
+5BA214FF6D90C7FCA26D5A147C27247EA32C>118 D<3A7FFF01FFFCB5008113FE148314
+816C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA2
+013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7
+FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF80
+6C90C8FC6C5A6C5AEA07E027367EA32C>121 D E /Fe 4 113 df<007FB81280B912C0A2
+6C17803204799641>0 D<EB0380497EA7397803803C00FC147E00FE14FE397F8383FC39
+3FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE3903FBBF
+80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007C000A76D
+5A1F247BA62A>3 D<181EA4181F84A285180785727EA2727E727E85197E85F11F80F10F
+C0F107F0007FBA12FCBCFCA26C19FCCCEA07F0F10FC0F11F80F13F00197E61614E5A4E5A
+A24E5A61180F96C7FCA260181EA4482C7BAA53>33 D<F10180F103C01907A2F10F80A2F1
+1F00A2193EA261A261A24E5AA24E5AA24E5AA24E5AA296C7FC60A2183EA260A260A24D5A
+A24D5AA24D5AA24D5AA24DC8FCA20130153E13F000015EEA07F8000F5E487E00794B5AEA
+E1FE00C04B5AC67E6D4A5AA26E495A133F6E49C9FC131F6E133E130F6E5B13076E137801
+0314F8A26E485A13016E485A13006E485A147FED8F80143F039FCAFC15DFEC1FFEA26E5A
+A26E5AA26E5AA26E5A5D42547B8345>112 D E /Ff 18 119 df<EC3FC0ECFFF8903807
+E07C90380F801FD93F00EB800C017E130F49903807C01C4848ECE018485A484801031338
+000FEDF0305B001F16704848156017E0007F16C090C713F1178016F34816004815F716FE
+5EA2485D5EA4007E1407150F003E91381DF818003F14796C02E11338270F8007C013303B
+07E03F007CF02601FFF8EB3FC026003FC0EB0F802E267DA435>11
+D<013FB612E090B712F05A120717E0270F807006C7FC391E00600E48140C003813E04813
+C048141CEAC0011200148001035BA213071400A25B1578011E137CA3133E133C137C157E
+13FC5B1201157F1203497FA3D801C0131C2C257EA32F>25 D<121C127FEAFF80A5EA7F00
+121C0909798817>58 D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313
+005A1206120E5A5A5A12600A19798817>I<150C151E153EA2153C157CA2157815F8A215
+F01401A215E01403A215C01407A21580140FA215005CA2141E143EA2143C147CA2147814
+F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C137CA2137813F8
+A25B1201A25B1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C127CA2127812F8
+A25A12601F537BBD2A>61 D<1760177017F01601A21603A21607160FA24C7EA216331673
+166316C3A2ED0183A2ED0303150683150C160115181530A21560A215C014011580DA0300
+7FA202061300140E140C5C021FB5FC5CA20260C7FC5C83495A8349C8FC1306A25BA25B13
+385B01F01680487E000716FFB56C013F13FF5EA2383C7DBB3E>65
+D<0103B77E4916F018FC903B0007F80003FE4BEB00FFF07F80020FED3FC0181F4B15E0A2
+141FA25DA2143F19C04B143F1980027F157F190092C812FE4D5A4A4A5AEF0FF04AEC1FC0
+05FFC7FC49B612FC5F02FCC7B4FCEF3FC00103ED0FE0717E5C717E1307844A1401A2130F
+17035CA2131F4D5A5C4D5A133F4D5A4A4A5A4D5A017F4BC7FC4C5A91C7EA07FC49EC3FF0
+B812C094C8FC16F83B397DB83F>I<0103B5D8F803B512F8495DA290260007F8C73807F8
+004B5DA2020F150F615DA2021F151F615DA2023F153F615DA2027F157F96C7FC92C8FCA2
+4A5D605CA249B7FC60A202FCC7120101031503605CA201071507605CA2010F150F605CA2
+011F151F605CA2013F153F605CA2017F157F95C8FC91C8FC496C4A7EB690B6FCA345397D
+B845>72 D<4BB4FC031F13F09238FE01FC913903F0007EDA07C0EB1F80DA1F80EB0FC002
+3EC7EA07E002FCEC03F0495A4948EC01F8495A4948EC00FC495A49C912FE49167E13FE49
+167F1201485AA2485AA2120F5B001F17FFA2485AA34848ED01FEA400FFEE03FC90C9FCA2
+EF07F8A2EF0FF0A218E0171F18C0EF3F806C167F180017FE4C5A6C6C5D1603001F4B5A6D
+4A5A000FED1F806C6C4AC7FC6D147E0003EC01F8D801FC495AD8007EEB0FC090263F807F
+C8FC903807FFF801001380383D7CBA3F>79 D<EC3FC0903801FFF0903807E03C90380F80
+0E90383F0007017E131F49137F484813FF485A485A120F4913FE001F143848481300A212
+7F90C8FCA35A5AA45AA315031507007E1406150E003E143C003F14706C14E0390F8007C0
+3907C03F003801FFF838003FC020267DA424>99 D<163FED1FFFA3ED007F167EA216FEA2
+16FCA21501A216F8A21503A216F0A21507A2027E13E0903803FF8790380FC1CF90381F00
+EF017EEB7FC049133F485A4848131F000715805B000F143F485A1600485A5D127F90C712
+7EA215FE5A485CA21401A248ECF80CA21403161CEDF0181407007C1538007E010F133000
+3E131F027B13706C01E113E03A0F83C0F9C03A03FF007F80D800FCEB1F00283B7DB92B>
+I<EC3FC0903801FFF0903807E07890381F801C90387E001E49130E485A485A1207485A49
+131E001F141C153C484813F8EC03E0007FEB3FC09038FFFE0014E090C8FC5A5AA7007E14
+0315071506003E140E153C6C14706C6C13E0EC07C03903E03F003801FFF838003FC02026
+7DA427>I<16F8ED03FEED0F8792381F0F80ED3E3F167F157CA215FC1700161C4A48C7FC
+A414035DA414075DA20107B512F0A39026000FE0C7FC5DA4141F5DA4143F92C8FCA45C14
+7EA514FE5CA413015CA4495AA45C1307A25C121E123F387F8F80A200FF90C9FC131E12FE
+EA7C3CEA7878EA1FF0EA07C0294C7CBA29>I<EB03F0EA01FFA3EA00075CA3130F5CA313
+1F5CA3133F91C9FCA35B90387E03F8EC0FFF91383C0F809039FEF007C0D9FDC07FEBFF80
+EC0003485A5BA249130712035BA2150F00075D5BA2151F000F5D5B153F93C7FC121F4990
+387F0180157EEDFE03003F02FC130090C7FC5EEDF80648150E007E150C161C5E00FEEC78
+7048EC3FE00038EC0F80293B7CB930>104 D<EC1FC0ECFFF8903807E07E90380F801F90
+393F000F80017E14C0491307484814E0485A4848EB03F0120F5B121F48481307A2127F90
+C7FCA2150F5A4815E0A2151F16C0A248EC3F8016005D157E007E5C4A5A003E495A003F49
+5A6C495A6C6C48C7FC3807E07E3801FFF038003F8024267DA428>111
+D<3903E001F83907F807FE390E3C1E07391C3E381F3A183F703F800038EBE07F0030EBC0
+FF00705B00601500EC007E153CD8E07F90C7FCEAC07EA2120013FE5BA312015BA312035B
+A312075BA3120F5BA3121F5B0007C9FC21267EA425>114 D<14FF010313C090380F80F0
+90383E00380178131C153C4913FC0001130113E0A33903F000F06D13007F3801FFE014FC
+14FF6C14806D13C0011F13E013039038003FF014071403001E1301127FA24814E0A348EB
+03C012F800E0EB07800070EB0F006C133E001E13F83807FFE0000190C7FC1E267CA427>
+I<01F8EB03C0D803FEEB07E0D8070F130F000E018013F0121C12180038140700301403D8
+701F130112601500D8E03F14E000C090C7FC5BEA007E16C013FE5B1501000115805B1503
+16001203495B1506150E150C151C151815385D00015C6D485A6C6C485AD97E0FC7FCEB1F
+FEEB07F024267EA428>118 D E /Fg 10 115 df<121FEA3F80EA7FC0EAFFE0A5EA7FC0
+EA3F80EA1F000B0B708A2C>46 D<EC7F80903803FFE0010F7F013F7F497F9038FFC0FE39
+01FE007FD803F87F4848EB1F809038E00FCF390FC03FFF48484813C091B5FCEA3F01393E
+03F87F903907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A900FCEB80
+07D87C0F14C0A2ECC00F3A7E07E01F80003EEBF03F903903F87F00393F01FFFED81F805B
+6E5A6C6C6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF6DB512C0
+6D1480010FEBFE00010313F89038007FC023337CB22C>64 D<3801FFF0000713FE001F6D
+7E15E048809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC12
+03120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612
+FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>97 D<EB03FE90381FFFC0017F
+13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E
+15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C
+6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023247CA32C>
+101 D<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA600
+7FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03
+F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A
+0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048
+B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E0
+4815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15
+FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F80107
+13C028387EA42C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC
+7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>105
+D<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>108
+D<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E0180133F00
+3F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F
+6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247C
+A32C>111 D<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B39003F7FE1ECFF0191
+38FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C26247EA32C>
+114 D E /Fh 63 123 df<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090
+383F0007017E497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3
+AA486C497E267FFFE0B512C0A32A3B7FBA2E>12 D<017C166048B416F02607C380140126
+0F81C01403D900E04A5A001E01784A5A003E6D141F003C013FEC7F80007C90271BE003FF
+C7FC0218B512BF007891381FFC3E00F8011CC75A020C14FC5F4C5A16035F4C5A160F5F4C
+C8FC021C5B00780118133E007C5D16FC003C01385B003E90383001F0001EEB70036C01E0
+5B903981C007C03907C3800F2601FF005BD8007C49C9FC90C748EB07C0033EEB1FF04BEB
+3C3803FCEBF81C4B497E913A01F001E00602030103130703E0497E912607C0071480020F
+15011580DA1F00018013C04A010F1300143E5C14FC5C495A13035C495A130F4A01071301
+49C701C013805B013E1603490203140001FC6F5A49020113064848913800F00E0003705A
+49ED3C3849ED1FF06C48ED07C03A437BBD45>37 D<146014E0EB01C0EB0380EB0700130E
+131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA35AA65AB2127CA67E
+A3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00
+E01460135278BD20>40 D<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C
+133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131E
+A2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<
+15301578B3A6007FB812F8B912FCA26C17F8C80078C8FCB3A6153036367BAF41>43
+D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A
+12600A19798817>I<121C127FEAFF80A5EA7F00121C0909798817>46
+D<150C151E153EA2153C157CA2157815F8A215F01401A215E01403A215C01407A2158014
+0FA215005CA2141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA25C130FA2
+91C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A25B120FA2
+90C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F537BBD2A>I<EB03F8EB1FFF
+90387E0FC09038F803E03901E000F0484813780007147C48487FA248C77EA2481580A300
+7EEC0FC0A600FE15E0B3007E15C0A4007F141F6C1580A36C15006D5B000F143EA26C6C5B
+6C6C5B6C6C485A6C6C485A90387E0FC0D91FFFC7FCEB03F8233A7DB72A>I<EB01C01303
+1307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C3879B72A>I<EB0FF0EB7F
+FE48B57E3903E03FE0390F000FF0000E6D7E486D7E486D7E123000706D7E126012FCB4EC
+7F807FA56CC7FC121CC8FCEDFF00A34A5A5D14035D4A5A5D140F4A5A4A5A92C7FC147C5C
+495A495A495A495A91C8FC011EEB01805B5B49130348481400485A485A000EC75A000FB6
+FC5A5A485CB6FCA321387CB72A>I<EB07F8EB3FFF4913C03901F80FF03903C007F84848
+6C7E380E0001000F80381FE0006D7FA56C5A6C5AC85A1401A25D4A5AA24A5A5DEC0F8002
+7EC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0A2153F16E0A2121E
+EA7F80487EA416C049137F007F1580007EC7FC0070ECFF006C495A121E390F8003F83907
+F00FF00001B512C06C6C90C7FCEB0FF8233A7DB72A>I<1538A2157815F8A21401140314
+07A2140F141F141B14331473146314C313011483EB030313071306130C131C1318133013
+70136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3C73803F800AB4A
+7E0103B512F8A325397EB82A>I<0006140CD80780133C9038F003F890B5FC5D5D158092
+C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F803907E007E090388003F0496C7E
+12066E7EC87EA28181A21680A4123E127F487EA490C71300485C12E000605C1270003049
+5A00385C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1FE0213A7CB7
+2A>I<EC3FC0903801FFF0010713FC90380FE03E90383F800790387E001F49EB3F804848
+137F485AA2485A000FEC3F0049131E001F91C7FCA2485AA3127F90C9FCEB01FC903807FF
+8039FF1E07E090383801F0496C7E01607F01E0137E497FA249148016C0151FA290C713E0
+A57EA56C7E16C0A2121FED3F807F000F15006C6C5B15FE6C6C5B6C6C485A3900FE07F090
+383FFFC06D90C7FCEB03FC233A7DB72A>I<12301238123E003FB612E0A316C05A168016
+000070C712060060140E5D151800E01438485C5D5DC712014A5A92C7FC5C140E140C141C
+5CA25CA214F0495AA21303A25C1307A2130FA3495AA3133FA5137FA96DC8FC131E233B7B
+B82A>I<EB03F8EB1FFF017F13C09038FC07F03901E001F848486C7E4848137C90C77E48
+141E000E141F001E80A3121FA27F5D01E0131E6C6C133E01FC133C6D5B6C6C6C5AECC1E0
+6CEBF3C06C01FFC7FC6C5BEB3FFF6D13C081017F13F801F07F3903E07FFE3907801FFF48
+486C1380481303003E6D13C0003CEB007F007C143F0078EC0FE000F814075A1503A21501
+A36C15C012781503007C15806CEC07006C5C6C6C131ED807E0137C3903F803F0C6B55A01
+3F1380D907FCC7FC233A7DB72A>I<EB03F8EB1FFF017F13C09038FC07E03903F803F048
+486C7E48486C7E49137E121F48487FA2007F158090C7FCA248EC1FC0A616E0A56C143FA2
+7F123F001F147FA26C6C13FF6C6C13DF000313013901F0039F3900FC0F1FD93FFC13C0EB
+07F090C7FC153F1680A316005D000F147E487E486C5BA24A5A4A5A49485A6C48485A001C
+495A260F807FC7FC3807FFFC000113F038003FC0233A7DB72A>I<121C127FEAFF80A5EA
+7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<121C127FEAFF80A5EA
+7F00121CC7FCB2121C127F5A1380A4127F121D1201A412031300A25A1206A2120E5A1218
+12385A1260093479A317>I<007FB812F8B912FCA26C17F8CCFCAE007FB812F8B912FCA2
+6C17F836167B9F41>61 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E
+7FEC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F
+81A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA2
+13E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>65
+D<B712E016FC16FF0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16
+035F4C5A4C5A4C5A4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83
+707EA21880177F18C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7
+FC16F832397DB83B>I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03
+FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F48
+48150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A312
+3F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE0
+5C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D
+7BBA3C>I<B712C016F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E
+177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F
+18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397D
+B83F>I<B812FCA30001903880000F6C90C71201EE007E173E171E170EA31706A3170783
+16C0A394C7FCA31501A21503150F91B5FCA3EC000F15031501A21500A21860A318E093C7
+12C0A41701A3EF0380A21707A2170F173F177F486D903807FF00B9FCA333397DB839>I<
+B812F8A30001903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706A2ED01
+80A21700A41503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612
+C0A32F397DB836>I<B648B512FEA30001902680000313006C90C76C5AB3A491B6FCA391
+C71201B3A6486D497EB648B512FEA337397DB83E>72 D<B612C0A3C6EBC0006D5AB3B3AD
+497EB612C0A31A397EB81E>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F
+001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E
+7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE
+3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0
+140EA2170637397DB83E>78 D<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F
+8049486D7ED93F80EB07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A2
+4848ED1FC0A2001F17E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D
+150FA3003F17F0A26C6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C
+6C4A5A017F4A5A6D6C495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC9138
+1FFFE0020390C8FC363D7BBA41>I<B612FEEDFFE016F8000190388007FE6C90C76C7EEE
+3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512
+E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A583A6F00180A217F8160F180348
+6D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF07F0393B7DB83D>82
+D<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F4848133F48C712
+1F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E7F13F86CB47E6C
+13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F020713E0EC007FED3F
+F0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14076C15C06C140F
+6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7FC253D7CBA2E>
+I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000701770A3006017
+30A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397DB83C>I<B69038
+07FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F
+17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381F
+FFF8020713E09138007F80373B7DB83E>I<B5D8FC07B5D8F001B5FCA30007902780001F
+FEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E6C
+1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5B
+EE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D91
+3B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFC
+EC3FF0A302075E4B141FA202035E4B140FA202015E4B1407A2020093C8FC4B80503B7EB8
+55>87 D<007FB590383FFFFCA3C601F801071380D97FE0D903FCC7FC013FEC01F06D6C5C
+5F6D6C5C6D6C13034CC8FC6D6C1306160E6D6C5B6DEB8018163891387FC0306E6C5A16E0
+6E6C5A91380FF18015FB6EB4C9FC5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138
+038FF8150F91380607FC91380E03FE140C4A6C7EEC38000230804A6D7E14E04A6D7E4948
+6D7E130391C76C7E01066E7E130E010C6E7E011C1401013C8101FE822607FF80010713E0
+B500E0013FEBFF80A339397EB83E>I<EB1FE0EBFFFC3803E03F3907000F80390F8007E0
+486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA
+1FC0123F485A90C7FC160C12FEA31401A26C13036CEB077C903980063E18383FC01E3A0F
+E0781FF03A03FFF00FE03A007F8007C026277DA52A>97 D<EA03F012FFA3120F1203B0EC
+1FE0EC7FF89038F1E03E9039F3801F809039F7000FC001FEEB07E049EB03F049EB01F85B
+ED00FCA216FEA2167E167FAA167E16FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB
+0FC09039C7801F00903881E07E903800FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF
+8090387E03E03901F80070484813F83907E001FC380FC003A2EA1F80123F90380001F848
+EB00F01500A2127E12FEAA127E127FA26C14067F001F140E6D130C000F141C6C6C13386C
+6C13706C6C13E039007C07C090381FFF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC00
+3F150FB0EB03F8EB1FFF90387E078F9038F801EF3903F0007F4848133F4848131FA24848
+130F123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C131FA26C6C133F6C6C137F6C6C
+EBEFF03A01F801CFFF39007C078F90381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1F
+FF90387C0FC03901F803E03903F001F0D807E013F8380FC0004848137CA248C7127E153E
+5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14037F001F14076C6C1306000714
+0E6D131CD801F013386C6C137090387E03E090381FFF80903803FC0020277EA525>I<14
+7E903803FF8090380FC1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512
+FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I<ED03F090390FF00FF890393FFC
+3C3C9039F81F707C3901F00FE03903E007C03A07C003E010000FECF000A248486C7EA86C
+6C485AA200075C6C6C485A6D485A6D48C7FC38073FFC38060FF0000EC9FCA4120FA213C0
+6CB512C015F86C14FE6CECFF804815C03A0F80007FE048C7EA0FF0003E140348140116F8
+481400A56C1401007C15F06CEC03E0003F1407D80F80EB0F80D807E0EB3F003901FC01FC
+39007FFFF0010790C7FC26387EA52A>I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF0
+3F9039F1C01F809039F3800FC0EBF70013FE496D7EA25BA35BB3A3486C497EB500C1B512
+80A3293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380C8FCAAEA03F012FFA312071203
+B3AA487EB512C0A312387EB717>I<EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB
+01F813FFA313071301B3B3A2123C127E00FF13F01303A214E038FE07C0127C383C0F00EA
+0FFEEA03F8154984B719>I<EA03F012FFA3120F1203B1913801FFFCA39138007FC01600
+157C15705D4A5A4A5A4AC7FC141E1438147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C
+7E8114076E7E6E7E811400157E157F811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB9
+2C>I<EA03F012FFA3120F1203B3B3AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE0
+00FFD93FFCEB7FF8913AF03F01E07E903BF1C01F83803F3D0FF3800FC7001F802603F700
+13CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FC
+A340257EA445>I<3903F00FF000FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F7
+0013FE496D7EA25BA35BB3A3486C497EB500C1B51280A329257EA42E>I<EB03FE90380F
+FF8090383E03E09038F800F84848137C48487F48487F4848EB0F80001F15C090C7120748
+15E0A2007EEC03F0A400FE15F8A9007E15F0A2007F14076C15E0A26C6CEB0FC0000F1580
+6D131F6C6CEB3F006C6C137EC66C13F890387E03F090381FFFC0D903FEC7FC25277EA52A
+>I<3903F01FE000FFEB7FF89038F1E07E9039F3801F803A07F7000FC0D803FEEB07E049
+EB03F04914F849130116FC150016FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076D
+EB0FE001F614C09039F7803F009038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A3
+28357EA42E>I<D903F813C090381FFE0190387E07819038FC01C33903F000E300071477
+4848133749133F001F141F485A150F48C7FCA312FEAA127FA37E6D131F121F6D133F120F
+6C6C137F6C6C13EF3901F801CF39007E078F90381FFE0FEB07F890C7FCABED1FE00203B5
+FCA328357DA42C>I<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613
+EE9038EC03E09038FC0080491300A45BB3A2487EB512F0A31C257EA421>I<EBFF030003
+13E7380F80FF381E003F487F487F00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E0
+6C13F86C7F00037FC67F01071380EB007F141F00C0EB0FC01407A26C1303A37E15806C13
+077EEC0F00B4131E38F3C07C38E1FFF038C03F801A277DA521>I<1318A51338A31378A3
+13F8120112031207001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E13
+006D5AEB0FFEEB01F81A347FB220>I<D803F0EB07E000FFEB01FFA3000FEB001F000314
+07B3A4150FA3151F12016D133F0000EC77F86D9038E7FF8090383F03C790381FFF87903A
+03FC07E00029267EA42E>I<B538803FFEA33A0FF8000FF06C48EB07E00003EC03C06D14
+8000011500A26C6C1306A26D130E017E130CA26D5BA2EC8038011F1330A26D6C5AA214E0
+01075BA2903803F180A3D901FBC7FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A
+1FFFE03FFEA3260FF8009038000FF86C48017EEB03E018C00003023EEB0180A26C6C013F
+EB0300A36C6CEC8006156FA2017E9038EFC00C15C7A2D93F016D5A15830281EBF038D91F
+831430150102C3EBF87090260FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A13
+3FA2010192C7FC4A7FA20100141E4A130E0260130C37257EA33C>I<B538807FFFA33A03
+FE003FF00001EC1F80000092C7FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180
+EB03FB6DB4C8FC6D5AA2147F804A7E8114CF903801C7E090380383F090380703F8EB0601
+496C7E011C137E49137F01787F496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA3
+2C>I<B538803FFEA33A0FF8000FF06C48EB07C00003EC03806C7E16007F00001406A201
+7E5BA2137F6D5BA26D6C5AA2ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA2
+14FF6D5AA2147CA31438A21430A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC
+0EEA701C6C5AEA1FF0EA0FC027357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB
+07F00038EB0FE012300070EB1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A
+495A495AA290387F000613FEA2485A485A0007140E5B4848130C4848131CA24848133C48
+C7127C48EB03FC90B5FCA21F247EA325>I E /Fi 40 121 df<EA0F80EA3FE0EA7FF0A2
+EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>46 D<EB03FF011F13F0017F13FC3901FC
+07FF2603F003138048486C13C0496C13E0EA0FF001FC14F0121F7FA56C4814E0A23803F0
+01C714C04A138016004A5A4A5AEC3FF090380FFFC092C7FC15F090380007FE913801FF80
+6E13C016E0ED7FF016F816FC153FA216FEEA1FC0487E487E487EA416FCA249EB7FF8127F
+01C0EBFFF06C4814E06C6C4813C0260FFC0713806CB61200000114FC6C6C13F0010790C7
+FC27387CB630>51 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F80C7FCAB
+EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D2579A41B>58
+D<ED03E04B7EA24B7EA34B7EA24B7EA34B7EA292B57EA34A8015F302038015E1A2020780
+15C0020F80ED807FA2021F80ED003F4A80023E131FA2027E80027C7F02FC814A7FA20101
+824A7F49B77EA3498202C0C7FC010F824A147FA2011F8291C8123F4982013E151FA2017E
+82017C8101FE83B500F80107B61280A4413A7DB948>65 D<DB3FFCEB01C00203B5EAC003
+021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1FFFD91FFEC77E49481403D97FF0
+80494880485B48177F4849153F4890C9FC181F485A180F123F5B1807127FA24993C7FC12
+FFAD127F7FF003C0123FA27F001F1707A26C6C1780180F6C6D16006C6D5D6C173E6C6D15
+7ED97FF85D6D6C4A5A6DB44A5A010701C0EB0FE06D01FCEBFF80010090B548C7FC021F14
+F8020314E09126003FFEC8FC3A3B7BB945>67 D<B87E17F817FF18C028007FF8000713F0
+9338007FF8EF1FFE717E050313807113C0A27113E0F07FF0A2F03FF8A219FC181FA219FE
+A419FFAC19FEA419FC183FA219F8187F19F0F0FFE0A24D13C04D13804D1300EF1FFEEF7F
+FC933807FFF0B912C095C7FC17FC178040397DB849>I<B912F0A426007FF8C7FCEF1FF8
+170717031701A21700A21878A3043C137C183CA41800167CA216FC150391B5FCA4ECF803
+1500167CA2163C180FA3181EA293C7FCA2183EA2183C187CA218FCA2EF01F81703170F17
+3FEE01FFB9FC18F0A338397DB83F>I<B912C0A43A007FF800039338007FE0171F170F17
+07A21703A21701A318F0EE7800A41800A216F8A21501150791B5FCA4ECF80715011500A2
+1678A693C8FCADB7FCA434397DB83C>I<DB3FFCEB01C00203B5EAC003021FECF00791B6
+EAFC0F01039039FC00FF3F4901C0EB1FFFD91FFEC77E49481403D97FF080494880485B48
+177F4849153F4890C9FC181F485A180F123F5B1807127FA24993C8FC12FFAB043FB61280
+A2127F7FDC0003EBC000123FA27F121FA26C7EA26C7F6C7F6C7F7ED97FF85C6D7E6DB45C
+010701C05B6D01FCEBFF3F010090B5EAFE0F021FECF8030203ECE0009126003FFEC9FC41
+3B7BB94B>I<B6D8FC03B612F0A426007FF8C70001EBE000B3A391B8FCA402F8C71201B3
+A6B6D8FC03B612F0A444397DB84B>I<B612FCA439007FF800B3B3ADB612FCA41E397DB8
+24>I<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F5F5E5EEE0FFE167F
+B8FCA431397DB839>76 D<B500F80403B512F06E5EA26E5ED8007FF1E000A2D97BFF161E
+A201796D5DA201786D5DA26E6C5DA36E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C4A5AA26E
+6C141EA36E6D5BA26E6D5BA26F6C5BA26F6C485AA36F6C485AA26F6C485AA26F6C48C7FC
+A2923803FF1EA36F13BCA26F13F8A2705AA2705AA213FCB500FC6D4848B612F0A2EE0F80
+EE070054397DB85B>I<B500FC0203B512F0A28080C66C6D90390003F0006F6E5A81017B
+7F13798101787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F826F13806F13C06F
+13E06F13F06F13F88117FCEE7FFEEE3FFF7013817013C17013E18218F17013F97013FDEF
+7FFF8383A28383838383187FA2183F181F01FC160FB500FC150718031801A244397DB84B
+>I<EDFFF8020FEBFF80027F14F0903A01FFC01FFC010790380007FFD91FFC010113C0D9
+3FF06D6C7E49486E7E49486E7E48496E7E48834890C86C7EA248486F1380A248486F13C0
+A2003F18E0A348486F13F0A400FF18F8AC007F18F06D5DA3003F18E0A26D5D001F18C0A2
+6C6C4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC49485A6DB401075B01
+07D9C01F90C7FC010190B512FC6D6C14F0020F1480020001F8C8FC3D3B7BB948>I<B8FC
+17F017FEEFFF8028007FF8000F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA8
+18FEA2EF3FFCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612
+FCA438397DB841>I<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717E
+A2717EA284A760A24D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFC
+EE0FFF707F707F8284A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F1303
+94390FFF87C071EBFF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E
+90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F1400
+90C8FC167E5A163EA27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C81
+6C15F06C816C81C681133F010F801301D9000F1480EC007F030F13C01503818100F0157F
+A3163FA27E17807E167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512
+E0D8F83F5CD8F00749C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D8
+7FC09238007FC049161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892
+C7FCB3AE010FB7FCA43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725A
+B3B3181F013F94C7FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01
+F0EB1FE0DA7FFEEBFFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F0
+0103B512E0A4C601F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D
+6D163E6F147E6D167CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F
+5D6F131F021F92C8FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16
+FF6F5BA36F5BA26F90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<007FB5D8F803
+B512F8A4C66C48C7D80FF0C7FC6D6C5D6D5E6F495A6D6D49C8FC7F6D6D137E6F5B6DEBF8
+016D5D6F485A6E6C485A023F130FDA1FFF5BEE9F806E01FFC9FC805E6E5B6E5B80826F7E
+153F826F7F5D4B7F92B57EA2DA01F97FDA03F17F03F07F913807E07FDA0FC07F021F6D7E
+4B7E4A486C7F027E8102FE6D7F4A7F49488149486D7F0107804A6E7E49488149486E7E01
+3F81017F83B60107B61280A441397DB848>88 D<B600F049B512E0A4C601FCC8380FF000
+017F705A6E4B5A6D6C4B5A6D7F4EC7FC6D6D147E6D7F606D6D495A6D7F4D5A6D6D495A6E
+7E4D5A6E6C495A6E13804DC8FC6EEBC07E6E13E05F6EEBF1F86E13F9EEFBF06EEBFFE081
+5F6F5B816F90C9FCB3A2021FB6FCA443397EB848>I<EB3FFE0003B512E0000F14F8391F
+F00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F
+3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F263FF00713F83B
+1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>97
+D<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC07F0003EB001FD8
+07FC1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C5B000F5C6C6C5B
+6C6C4913C02701FF80FD13FE39007FFFF9011F13E1010313012F3A7DB935>100
+D<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC
+1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F
+6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025
+257DA42C>I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0A248
+1381A24813016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7DB91D
+>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C13
+8F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC3907
+FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016E0
+6C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C6C
+6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<
+EA01F0EA07FC487EA2487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9B512F8
+A4153B7DBA1B>105 D<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>108
+D<01FED97FE0EB0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F81903983F0
+3FF0DA3C00903887801F000749DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291
+C75BB3A3B5D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F
+13FE91381F03FFDA3C011380000713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC
+3F13FFA430257DA435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE04848
+6D7E48486D7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D13
+07001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029
+257DA430>I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDAF00113800003496C13
+C00280EB7FE091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F
+6E14E06EEBFFC0DAF00313809139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCAC
+B512FCA42F357EA435>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC00007
+5B6C6C5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114
+D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E
+7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE
+140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400
+38E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7
+FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425>
+I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90
+387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA3F00161E6E
+133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5C
+ECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D
+257EA432>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C48
+5A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E
+903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7E
+B590383FFFF8A42D257EA432>120 D E(cmmi10)cvn 9.96265 /Ff
+1 fstore(cmsy7)cvn 6.97385 /Fc 1 fstore(cmr7)cvn 6.97385
+/Fb 1 fstore(cmr10)cvn 9.96265 /Fh 1 fstore end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 0 83 3900 4 v 0 164 a Fi(POL)-8 b(Y.MP:)31 b(DEFINITION)h(OF)g
+(REGULAR)g(CONVEX)f(POL)-8 b(YHEDRA)32 b(IN)g(MET)-8
+b(APOST)p 0 191 V 0 421 a Fh(v)n(ersion)26 b(1.0,)h(8)g(April)h(1998)d
+Fi(Denis)31 b(Ro)s(egel)26 b Fh(\()p Fg(roegel@loria.fr)p
+Fh(\))0 520 y(This)i(pac)n(k)-5 b(age)26 b(de\014nes)h(the)h(\014v)n(e)
+f(regular)f(con)n(v)n(ex)g(p)r(olyhedra)h(classes)f(and)i(m)n(ust)f(b)r
+(e)h(used)g(with)g(the)g Fi(3d)g Fh(pac)n(k)-5 b(age.)0
+670 y(Eac)n(h)26 b(ob)5 b(ject)28 b(de\014nition)g(is)f(parameterized)f
+(b)n(y)i(an)f(instance)g(iden)n(ti\014cation.)0 819 y(All)h(p)r
+(olyhedra)f(are)f(normalized)h(\(cen)n(tered)g(on)h(the)f(origin)g(and)
+g(inscriptible)h(in)g(a)f(sphere)g(of)h(radius)e(1\).)0
+969 y(The)f(p)r(olyhedra)g(are)f(de\014ned)i(with)f(a)g(certain)g(n)n
+(um)n(b)r(er)g(of)g(p)r(oin)n(ts)g(and)g(faces.)36 b(The)25
+b(p)r(oin)n(ts)h(comprise)e(b)r(oth)i(the)f(v)n(ertices)0
+1068 y(and)i(the)h(cen)n(ter)f(of)h(the)g(ob)5 b(ject.)0
+1218 y(It)36 b(migh)n(t)f(b)r(e)i(useful)f(to)f(remind)h(the)g(Euler)e
+(form)n(ula)h(linking)g(the)h(n)n(um)n(b)r(er)g(of)f(faces)g
+Ff(f)9 b Fh(,)38 b(v)n(ertices)c Ff(v)39 b Fh(and)d(edges)e
+Ff(e)i Fh(in)0 1317 y(p)r(olyhedra)27 b(with)h(no)f(hole)g(in)h
+(dimension)g(3:)36 b Ff(f)27 b Fh(+)18 b Ff(v)k Fe(\000)c
+Ff(e)27 b Fh(=)h(2.)36 b(This)28 b(can)f(b)r(e)h(v)n(eri\014ed)f(in)g
+(the)h(follo)n(wing)f(table:)1485 1449 y(t)n(yp)r(e)292
+b(faces)37 b(v)n(ertices)26 b(edges)1314 1549 y(tetrahedron)282
+b(4)231 b(4)207 b(6)1314 1649 y(cub)r(e)540 b(6)231 b(8)166
+b(12)1314 1748 y(o)r(ctahedron)303 b(8)231 b(6)166 b(12)1314
+1848 y(do)r(decahedron)f(12)189 b(20)165 b(30)1314 1947
+y(icosahedron)240 b(20)189 b(12)165 b(30)0 2097 y(F)-7
+b(or)27 b(more)g(details,)g(see)g(the)h(do)r(cumen)n(tation)g(enclosed)
+f(in)h(the)f(distribution.)0 2246 y Fi(message)e Fd("***)42
+b(poly,)g(version)f(1.0)h(\(c\))g(D.)h(Roegel,)e(8)i(April)e(1998)h
+(***")o Fh(;)1929 5539 y(1)p eop
+%%Page: 2 2
+2 1 bop 0 83 3900 4 v 0 740 a Fh(TETRAHEDR)n(ON)27 b(\(4)h(faces\))236
+b @beginspecial -42 @llx 8 @lly 23 @urx 84 @ury 650 @rwi
+@setspecial
+%%BeginDocument: tetra.ps
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath fill
+ 0 setgray
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 788 V 0 1013 a(Construction)27 b(of)g(a)h(tetrahedron:)0
+1334 y(One)f(face)h(is)427 1555 y @beginspecial -1 @llx
+-8 @lly 57 @urx 50 @ury 580 @rwi @setspecial
+%%BeginDocument: vect-fig.1
+%*Font: cmmi10 9.96265 9.96265 63:84
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+28.34645 49.09763 lineto
+ closepath stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 28.34645 49.09763 moveto
+28.34645 0 lineto stroke
+7.76184 26.6488 moveto
+(c) cmmi10 9.96265 fshow
+31.34645 21.08955 moveto
+(h) cmmi10 9.96265 fshow
+26.19075 -7.2895 moveto
+(c) cmmi10 9.96265 fshow
+44.61966 26.6488 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 938 1334 a(with)g Ff(h)g Fh(=)f Ff(c)1331
+1265 y Fe(p)p 1400 1265 42 4 v 69 x Fh(3)p Ff(=)p Fh(2)0
+1722 y(The)h(angle)e Ff(\013)j Fh(b)r(et)n(w)n(een)e(t)n(w)n(o)g(faces)
+g(is)g(giv)n(en)g(b)n(y)h(sin\()p Ff(\013=)p Fh(2\))f(=)2051
+1675 y Ff(c=)p Fh(2)p 1995 1702 230 4 v 1995 1785 a Ff(c)2031
+1712 y Fe(p)p 2101 1712 42 4 v 2101 1785 a Fh(3)o Ff(=)p
+Fh(2)2263 1722 y(=)g(1)p Ff(=)2439 1653 y Fe(p)p 2507
+1653 V 2507 1722 a Fh(3)1692 2397 y @beginspecial -1
+@llx -17 @lly 61 @urx 47 @ury 620 @rwi @setspecial
+%%BeginDocument: vect-fig.2
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+49.09764 0 lineto
+32.73126 46.28975 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 39.27826 0 moveto
+39.27826 4.16127 41.90115 7.8707 45.82442 9.25781 curveto stroke
+9.95424 25.24487 moveto
+(c) cmmi10 9.96265 fshow
+15.93953 -13.4138 moveto
+(c) cmmi10 9.96265 fshow
+21.44643 -3.6775 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop 0 setlinecap
+newpath 27.99133 -3.5081 moveto
+31.96263 -3.5081 lineto stroke
+27.99133 -9.4912 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 21.44643 -10.9231 moveto
+31.96263 -10.9231 lineto stroke
+24.71893 -16.8493 moveto
+(2) cmr7 6.97385 fshow
+43.01443 28.68037 moveto
+(c) cmmi10 9.96265 fshow
+48.52133 38.41667 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 55.06624 38.58607 moveto
+59.03754 38.58607 lineto stroke
+55.06624 32.60298 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 48.52133 31.17108 moveto
+59.03754 31.17108 lineto stroke
+51.79384 25.24487 moveto
+(2) cmr7 6.97385 fshow
+29.52663 9.42769 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2547 a Fi(def)37 b Fa(set)p 276 2547 26
+4 v 38 w(tetr)l(ahe)l(dr)l(on)p 717 2547 V 37 w(p)l(oints)7
+b Fh(\()p Fi(expr)29 b Fa(inst)7 b Fh(\))28 b(=)166 2646
+y Fa(set)p 279 2646 V 38 w(obj)p 427 2646 V 44 w(p)l(oint)8
+b Fh(\(1)p Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)51
+b Fa(set)p 1197 2646 V 38 w(obj)p 1345 2646 V 44 w(p)l(oint)8
+b Fh(\(2)p Ff(;)23 b Fh(1)p Ff(;)f Fh(0)p Ff(;)h Fh(0\);)166
+2746 y Fa(set)p 279 2746 V 38 w(obj)p 427 2746 V 44 w(p)l(oint)8
+b Fh(\(3)p Ff(;)23 b Fh(cosd)o(\(60\))p Ff(;)g Fh(sind\(60\))p
+Ff(;)g Fh(0\);)k(\045)h(60)f(=)g(360)p Ff(=)p Fh(6)166
+2846 y Fa(sinan)34 b Fh(=)28 b(1)p Ff(=)22 b Fh(sqrt)o(\(3\);)51
+b Fa(c)l(osan)34 b Fh(=)28 b(sqrt)o(\(1)18 b Fe(\000)g
+Fa(sinan)25 b Fe(\003\003)18 b Fh(2\);)166 2945 y Fa(an)34
+b Fh(=)27 b(180)17 b Fe(\000)h Fh(2)g Fe(\003)g Fh(angle)o(\(\()p
+Fa(c)l(osan)8 b Ff(;)23 b Fa(sinan)7 b Fh(\)\);)166 3045
+y Fa(new)p 320 3045 V 40 w(fac)l(e)p 496 3045 V 37 w(p)l(oint)i
+Fh(\(4)p Ff(;)23 b Fh(1)p Ff(;)f Fh(2)p Ff(;)h Fh(3)p
+Ff(;)f Fa(an)7 b Fh(\);)166 3145 y Fa(normalize)p 529
+3145 V 38 w(obj)13 b Fh(\()p Fa(inst)8 b Fh(\)\(1)p Ff(;)23
+b Fh(2)p Ff(;)g Fh(3)p Ff(;)f Fh(4\);)166 3244 y Fa(set)p
+279 3244 V 38 w(obj)p 427 3244 V 44 w(p)l(oint)8 b Fh(\(5)p
+Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)28 b(\045)g(cen)n(ter)f
+(of)g(tetrahedron)0 3344 y Fi(enddef)9 b Fh(;)0 3493
+y Fi(v)-5 b(ardef)38 b Fa(def)p 422 3493 V 49 w(tetr)l(ahe)l(dr)l(on)7
+b Fh(\()p Fi(expr)28 b Fa(inst)8 b Fh(\))28 b(=)166 3593
+y Fa(new)p 320 3593 V 40 w(obj)p 469 3593 V 43 w(p)l(oints)7
+b Fh(\()p Fa(inst)h Ff(;)23 b Fh(5\);)28 b(\045)g(4)f(v)n(ertices)f
+(and)i(the)g(cen)n(ter)166 3693 y Fa(new)p 320 3693 V
+40 w(obj)p 469 3693 V 43 w(fac)l(es)8 b Fh(\()p Fa(inst)g
+Ff(;)23 b Fh(4\);)k(\045)h(4)g(faces)f(in)g(the)h(de\014nition)166
+3792 y Fa(set)p 279 3792 V 38 w(tetr)l(ahe)l(dr)l(on)p
+720 3792 V 37 w(p)l(oints)7 b Fh(\()p Fa(inst)h Fh(\);)166
+3892 y Fa(set)p 279 3892 V 38 w(obj)p 427 3892 V 44 w(fac)l(e)f
+Fh(\(1)p Ff(;)23 b Fd("1,2,4")m Ff(;)g Fd("b4fefe")m
+Fh(\);)166 3991 y Fa(set)p 279 3991 V 38 w(obj)p 427
+3991 V 44 w(fac)l(e)7 b Fh(\(2)p Ff(;)23 b Fd("2,3,4")m
+Ff(;)g Fd("b49bc0")m Fh(\);)166 4091 y Fa(set)p 279 4091
+V 38 w(obj)p 427 4091 V 44 w(fac)l(e)7 b Fh(\(3)p Ff(;)23
+b Fd("1,4,3")m Ff(;)g Fd("b4c8fe")m Fh(\);)166 4191 y
+Fa(set)p 279 4191 V 38 w(obj)p 427 4191 V 44 w(fac)l(e)7
+b Fh(\(4)p Ff(;)23 b Fd("1,3,2")m Ff(;)g Fd("b4fe40")m
+Fh(\);)0 4290 y Fi(enddef)9 b Fh(;)1929 5539 y(2)p eop
+%%Page: 3 3
+3 2 bop 0 83 3900 4 v 0 648 a Fh(CUBE)27 b(\(HEXAHEDR)n(ON\))i(\(6)e
+(faces\))236 b @beginspecial -33 @llx 0 @lly 30 @urx
+65 @ury 630 @rwi @setspecial
+%%BeginDocument: cube.ps
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 26.26239 0.89726 moveto
+28.69226 58.63724 lineto
+-32.03369 59.01389 lineto
+-29.35919 2.07295 lineto
+ closepath stroke
+ 0.27058 0.41176 0.83138 setrgbcolor
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath fill
+ 0 setgray
+newpath 28.69226 58.63724 moveto
+25.95778 63.47554 lineto
+-22.5975 63.71516 lineto
+-32.03369 59.01389 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 696 V 0 922 a(The)28 b(de\014nition)g(of)f(a)g(cub)r(e)h
+(is)g(straigh)n(tforw)n(ard.)0 1071 y Fi(def)37 b Fa(set)p
+276 1071 26 4 v 38 w(cub)l(e)p 467 1071 V 37 w(p)l(oints)7
+b Fh(\()p Fi(expr)28 b Fa(inst)8 b Fh(\))28 b(=)166 1171
+y Fa(set)p 279 1171 V 38 w(obj)p 427 1171 V 44 w(p)l(oint)8
+b Fh(\(1)p Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)166
+1270 y Fa(set)p 279 1270 V 38 w(obj)p 427 1270 V 44 w(p)l(oint)8
+b Fh(\(2)p Ff(;)23 b Fh(1)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)166
+1370 y Fa(set)p 279 1370 V 38 w(obj)p 427 1370 V 44 w(p)l(oint)8
+b Fh(\(3)p Ff(;)23 b Fh(1)p Ff(;)g Fh(1)p Ff(;)f Fh(0\);)166
+1470 y Fa(set)p 279 1470 V 38 w(obj)p 427 1470 V 44 w(p)l(oint)8
+b Fh(\(4)p Ff(;)23 b Fh(0)p Ff(;)g Fh(1)p Ff(;)f Fh(0\);)166
+1569 y Fa(set)p 279 1569 V 38 w(obj)p 427 1569 V 44 w(p)l(oint)8
+b Fh(\(5)p Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(1\);)166
+1669 y Fa(set)p 279 1669 V 38 w(obj)p 427 1669 V 44 w(p)l(oint)8
+b Fh(\(6)p Ff(;)23 b Fh(1)p Ff(;)g Fh(0)p Ff(;)f Fh(1\);)166
+1768 y Fa(set)p 279 1768 V 38 w(obj)p 427 1768 V 44 w(p)l(oint)8
+b Fh(\(7)p Ff(;)23 b Fh(1)p Ff(;)g Fh(1)p Ff(;)f Fh(1\);)166
+1868 y Fa(set)p 279 1868 V 38 w(obj)p 427 1868 V 44 w(p)l(oint)8
+b Fh(\(8)p Ff(;)23 b Fh(0)p Ff(;)g Fh(1)p Ff(;)f Fh(1\);)166
+1968 y Fa(normalize)p 529 1968 V 38 w(obj)13 b Fh(\()p
+Fa(inst)8 b Fh(\)\(1)p Ff(;)23 b Fh(7\);)28 b(\045)g(1)f(and)g(7)g(are)
+g(opp)r(osite)g(v)n(ertices)166 2067 y Fa(set)p 279 2067
+V 38 w(obj)p 427 2067 V 44 w(p)l(oint)8 b Fh(\(9)p Ff(;)23
+b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)28 b(\045)g(cen)n(ter)f(of)g(cub)
+r(e)0 2167 y Fi(enddef)9 b Fh(;)0 2316 y Fi(v)-5 b(ardef)38
+b Fa(def)p 422 2316 V 49 w(cub)l(e)6 b Fh(\()p Fi(expr)29
+b Fa(inst)7 b Fh(\))28 b(=)166 2416 y Fa(new)p 320 2416
+V 40 w(obj)p 469 2416 V 43 w(p)l(oints)7 b Fh(\()p Fa(inst)h
+Ff(;)23 b Fh(9\);)28 b(\045)g(8)f(v)n(ertices)f(and)i(the)g(cen)n(ter)
+166 2516 y Fa(new)p 320 2516 V 40 w(obj)p 469 2516 V
+43 w(fac)l(es)8 b Fh(\()p Fa(inst)g Ff(;)23 b Fh(6\);)k(\045)h(6)g
+(faces)f(in)g(the)h(de\014nition)166 2615 y Fa(set)p
+279 2615 V 38 w(cub)l(e)p 470 2615 V 37 w(p)l(oints)7
+b Fh(\()p Fa(inst)h Fh(\);)166 2715 y Fa(set)p 279 2715
+V 38 w(obj)p 427 2715 V 44 w(fac)l(e)f Fh(\(1)p Ff(;)23
+b Fd("1,2,6,5")l Ff(;)g Fd("b4fe40")m Fh(\);)166 2814
+y Fa(set)p 279 2814 V 38 w(obj)p 427 2814 V 44 w(fac)l(e)7
+b Fh(\(2)p Ff(;)23 b Fd("2,3,7,6")l Ff(;)g Fd("45d040")m
+Fh(\);)166 2914 y Fa(set)p 279 2914 V 38 w(obj)p 427
+2914 V 44 w(fac)l(e)7 b Fh(\(3)p Ff(;)23 b Fd("4,8,7,3")l
+Ff(;)g Fd("45a114")m Fh(\);)166 3014 y Fa(set)p 279 3014
+V 38 w(obj)p 427 3014 V 44 w(fac)l(e)7 b Fh(\(4)p Ff(;)23
+b Fd("1,5,8,4")l Ff(;)g Fd("45a1d4")m Fh(\);)166 3113
+y Fa(set)p 279 3113 V 38 w(obj)p 427 3113 V 44 w(fac)l(e)7
+b Fh(\(5)p Ff(;)23 b Fd("5,6,7,8")l Ff(;)g Fd("4569d4")m
+Fh(\);)166 3213 y Fa(set)p 279 3213 V 38 w(obj)p 427
+3213 V 44 w(fac)l(e)7 b Fh(\(6)p Ff(;)23 b Fd("4,3,2,1")l
+Ff(;)g Fd("112da1")m Fh(\);)0 3313 y Fi(enddef)9 b Fh(;)1929
+5539 y(3)p eop
+%%Page: 4 4
+4 3 bop 0 83 3900 4 v 0 873 a Fh(OCT)-7 b(AHEDR)n(ON)27
+b(\(8)h(faces\))236 b @beginspecial -39 @llx -8 @lly
+36 @urx 84 @ury 750 @rwi @setspecial
+%%BeginDocument: octa.ps
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 34.58917 26.87885 moveto
+30.04236 39.91695 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath fill
+ 0 setgray
+newpath -38.49222 27.92935 moveto
+34.58917 26.87885 lineto
+0 82.53862 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath fill
+ 0 setgray
+newpath 0 -7.12994 moveto
+34.58917 26.87885 lineto
+-38.49222 27.92935 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 921 V 0 1314 a(A)28 b(section)f(of)h(a)f(p)n(yramid)g
+(is:)974 1497 y @beginspecial -6 @llx -8 @lly 62 @urx
+41 @ury 680 @rwi @setspecial
+%%BeginDocument: vect-fig.3
+%*Font: cmmi10 9.96265 9.96265 48:8000001
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+28.34645 40.08789 lineto
+ closepath stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 28.34645 40.08789 moveto
+28.34645 0 lineto stroke
+-5.14536 25.57944 moveto
+(c) cmmi10 9.96265 fshow
+0.36154 35.31573 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 6.90645 35.48514 moveto
+10.87775 35.48514 lineto stroke
+6.90645 29.50204 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.36154 28.07014 moveto
+10.87775 28.07014 lineto stroke
+3.63405 22.14394 moveto
+(2) cmr7 6.97385 fshow
+44.61966 25.57944 moveto
+(c) cmmi10 9.96265 fshow
+50.12656 35.31573 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 56.67146 35.48514 moveto
+60.64276 35.48514 lineto stroke
+56.67146 29.50204 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 50.12656 28.07014 moveto
+60.64276 28.07014 lineto stroke
+53.39906 22.14394 moveto
+(2) cmr7 6.97385 fshow
+31.34645 16.64005 moveto
+(H) cmmi10 9.96265 fshow
+26.19075 -7.2895 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 1648 a(The)h(heigh)n(t)f(of)h(this)f(p)n(yramid)g(is)h
+(giv)n(en)e(b)n(y)i Ff(H)1498 1617 y Fb(2)1562 1648 y
+Fh(=)g(\()p Ff(c)1723 1579 y Fe(p)p 1792 1579 42 4 v
+69 x Fh(3)p Ff(=)p Fh(2\))1949 1593 y Fb(2)2005 1648
+y Fe(\000)18 b Fh(\()p Ff(c=)p Fh(2\))2271 1606 y Fb(2)2336
+1648 y Fh(=)27 b Ff(c)2464 1617 y Fb(2)2501 1648 y Ff(=)p
+Fh(2,)g(hence)h Ff(H)34 b Fh(=)28 b Ff(c=)3140 1579 y
+Fe(p)p 3208 1579 V 3208 1648 a Fh(2)0 1797 y Fi(def)37
+b Fa(set)p 276 1797 26 4 v 38 w(o)l(ctahe)l(dr)l(on)p
+696 1797 V 38 w(p)l(oints)7 b Fh(\()p Fi(expr)29 b Fa(inst)7
+b Fh(\))28 b(=)166 1897 y Fa(set)p 279 1897 V 38 w(obj)p
+427 1897 V 44 w(p)l(oint)8 b Fh(\(1)p Ff(;)23 b Fh(0)p
+Ff(;)g Fh(0)p Ff(;)f Fh(0\);)166 1996 y Fa(set)p 279
+1996 V 38 w(obj)p 427 1996 V 44 w(p)l(oint)8 b Fh(\(2)p
+Ff(;)23 b Fh(1)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)166 2096
+y Fa(set)p 279 2096 V 38 w(obj)p 427 2096 V 44 w(p)l(oint)8
+b Fh(\(3)p Ff(;)23 b Fh(1)p Ff(;)g Fh(1)p Ff(;)f Fh(0\);)166
+2196 y Fa(set)p 279 2196 V 38 w(obj)p 427 2196 V 44 w(p)l(oint)8
+b Fh(\(4)p Ff(;)23 b Fh(0)p Ff(;)g Fh(1)p Ff(;)f Fh(0\);)166
+2295 y Fa(set)p 279 2295 V 38 w(obj)p 427 2295 V 44 w(p)l(oint)8
+b Fh(\(5)p Ff(;)23 b(:)p Fh(5)p Ff(;)g(:)p Fh(5)p Ff(;)f
+Fh(1)p Ff(=)g Fh(sqrt\(2\)\);)166 2395 y Fa(set)p 279
+2395 V 38 w(obj)p 427 2395 V 44 w(p)l(oint)8 b Fh(\(6)p
+Ff(;)23 b(:)p Fh(5)p Ff(;)g(:)p Fh(5)p Ff(;)f Fe(\000)p
+Fh(1)p Ff(=)g Fh(sqrt)o(\(2\)\);)166 2494 y Fa(normalize)p
+529 2494 V 38 w(obj)13 b Fh(\()p Fa(inst)8 b Fh(\)\(5)p
+Ff(;)23 b Fh(6\);)28 b(\045)g(5)f(and)g(6)g(are)g(opp)r(osite)g(v)n
+(ertices)166 2594 y Fa(set)p 279 2594 V 38 w(obj)p 427
+2594 V 44 w(p)l(oint)8 b Fh(\(7)p Ff(;)23 b Fh(0)p Ff(;)g
+Fh(0)p Ff(;)f Fh(0\);)28 b(\045)g(cen)n(ter)f(of)g(o)r(ctahedron)0
+2694 y Fi(enddef)9 b Fh(;)0 2843 y Fi(v)-5 b(ardef)38
+b Fa(def)p 422 2843 V 49 w(o)l(ctahe)l(dr)l(on)7 b Fh(\()p
+Fi(expr)29 b Fa(inst)8 b Fh(\))27 b(=)166 2943 y Fa(new)p
+320 2943 V 40 w(obj)p 469 2943 V 43 w(p)l(oints)7 b Fh(\()p
+Fa(inst)h Ff(;)23 b Fh(7\);)28 b(\045)g(6)f(v)n(ertices)f(and)i(the)g
+(cen)n(ter)166 3042 y Fa(new)p 320 3042 V 40 w(obj)p
+469 3042 V 43 w(fac)l(es)8 b Fh(\()p Fa(inst)g Ff(;)23
+b Fh(8\);)k(\045)h(8)g(faces)f(in)g(the)h(de\014nition)166
+3142 y Fa(set)p 279 3142 V 38 w(o)l(ctahe)l(dr)l(on)p
+699 3142 V 38 w(p)l(oints)7 b Fh(\()p Fa(inst)h Fh(\);)166
+3242 y Fa(set)p 279 3242 V 38 w(obj)p 427 3242 V 44 w(fac)l(e)f
+Fh(\(1)p Ff(;)23 b Fd("1,2,5")m Ff(;)g Fd("b4fefe")m
+Fh(\);)166 3341 y Fa(set)p 279 3341 V 38 w(obj)p 427
+3341 V 44 w(fac)l(e)7 b Fh(\(2)p Ff(;)23 b Fd("2,3,5")m
+Ff(;)g Fd("45d040")m Fh(\);)166 3441 y Fa(set)p 279 3441
+V 38 w(obj)p 427 3441 V 44 w(fac)l(e)7 b Fh(\(3)p Ff(;)23
+b Fd("3,4,5")m Ff(;)g Fd("4569d4")m Fh(\);)166 3541 y
+Fa(set)p 279 3541 V 38 w(obj)p 427 3541 V 44 w(fac)l(e)7
+b Fh(\(4)p Ff(;)23 b Fd("4,1,5")m Ff(;)g Fd("b49bc0")m
+Fh(\);)166 3640 y Fa(set)p 279 3640 V 38 w(obj)p 427
+3640 V 44 w(fac)l(e)7 b Fh(\(5)p Ff(;)23 b Fd("6,1,4")m
+Ff(;)g Fd("45a1d4")m Fh(\);)166 3740 y Fa(set)p 279 3740
+V 38 w(obj)p 427 3740 V 44 w(fac)l(e)7 b Fh(\(6)p Ff(;)23
+b Fd("6,2,1")m Ff(;)g Fd("b4c8fe")m Fh(\);)166 3839 y
+Fa(set)p 279 3839 V 38 w(obj)p 427 3839 V 44 w(fac)l(e)7
+b Fh(\(7)p Ff(;)23 b Fd("6,3,2")m Ff(;)g Fd("b49b49")m
+Fh(\);)166 3939 y Fa(set)p 279 3939 V 38 w(obj)p 427
+3939 V 44 w(fac)l(e)7 b Fh(\(8)p Ff(;)23 b Fd("6,4,3")m
+Ff(;)g Fd("112da1")m Fh(\);)0 4039 y Fi(enddef)9 b Fh(;)1929
+5539 y(4)p eop
+%%Page: 5 5
+5 4 bop 0 83 3900 4 v 0 790 a Fh(DODECAHEDR)n(ON)28 b(\(12)f(faces\))
+236 b @beginspecial -46 @llx -8 @lly 46 @urx 74 @ury
+920 @rwi @setspecial
+%%BeginDocument: dodeca.ps
+ 0.70589 0.60785 0.75294 setrgbcolor
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 27.58994 16.27606 moveto
+-3.45157 34.20074 lineto
+-32.32631 17.31656 lineto
+-18.01517 -6.33716 lineto
+15.26155 -7.11217 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath fill
+ 0 setgray
+newpath 40.43793 28.8239 moveto
+44.6589 40.25279 lineto
+27.58994 16.27606 lineto
+15.26155 -7.11217 lineto
+24.43878 3.13652 lineto
+ closepath stroke
+ 0.27058 0.63138 0.07843 setrgbcolor
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath fill
+ 0 setgray
+newpath -32.32631 17.31656 moveto
+-3.45157 34.20074 lineto
+-2.06815 70.74196 lineto
+-28.81992 71.82803 lineto
+-45.45721 41.23878 lineto
+ closepath stroke
+ 0.27058 0.63138 0.83138 setrgbcolor
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath fill
+ 0 setgray
+newpath -3.45157 34.20074 moveto
+27.58994 16.27606 lineto
+44.6589 40.25279 lineto
+28.08289 71.66339 lineto
+-2.06815 70.74196 lineto
+ closepath stroke
+ 0.06667 0.17647 0.63138 setrgbcolor
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath fill
+ 0 setgray
+newpath 16.8359 73.02051 moveto
+-14.04814 73.09763 lineto
+-28.81992 71.82803 lineto
+-2.06815 70.74196 lineto
+28.08289 71.66339 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 838 V 0 1068 a(Tw)n(o)27 b(adjacen)n(t)g(faces)g(\(p)r
+(en)n(tagons\))g(of)h(the)g(do)r(decahedron)e(are)h(as)f(follo)n(ws:)
+1438 1839 y @beginspecial -50 @llx -39 @lly 73 @urx 50
+@ury 1230 @rwi @setspecial
+%%BeginDocument: vect-fig.13
+%*Font: cmmi10 9.96265 9.96265 41:c002
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 25.48448 40.89903 moveto
+-13.43895 49.55603 lineto
+-49.46008 16.86882 lineto
+-25.61407 -14.23572 lineto
+13.92094 1.30045 lineto
+ closepath stroke
+newpath 61.91747 -12.66066 moveto
+13.92094 1.30045 lineto
+-25.61407 -14.23572 lineto
+-2.051 -37.7988 lineto
+52.04662 -36.82523 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 25.48448 40.89903 moveto
+31.95728 8.38797 lineto
+61.91747 -12.66066 lineto stroke
+newpath 13.92094 1.30045 moveto
+31.95728 8.38797 lineto stroke
+28.48448 37.49513 moveto
+(A) cmmi10 9.96265 fshow
+64.91747 -16.06456 moveto
+(B) cmmi10 9.96265 fshow
+34.05727 10.48796 moveto
+(O) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 1938 a(The)i(angle)e(b)r(et)n(w)n(een)i(the)g(faces)f
+(is)h(the)g(angle)e(b)r(et)n(w)n(een)1816 1890 y Fe(\000)-20
+b(!)1816 1938 y Ff(O)r(A)28 b Fh(and)2133 1890 y Fe(\000)-40
+b(\000)g(!)2133 1938 y Ff(O)r(B)5 b Fh(.)37 b Ff(O)r(A)28
+b Fh(=)f Ff(O)r(B)33 b Fh(=)27 b Ff(d)2869 1950 y Fb(3)2934
+1938 y Fh(as)g(de\014ned)h(in)1421 2954 y @beginspecial
+-47 @llx -55 @lly 80 @urx 64 @ury 1270 @rwi @setspecial
+%%BeginDocument: vect-fig.14
+%*Font: cmmi10 9.96265 9.96265 41:8002000010004
+%*Font: cmr7 6.97385 6.97385 31:e
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 56.6929 0 moveto
+17.5193 53.91777 lineto
+-45.86575 33.32317 lineto
+-45.86575 -33.32317 lineto
+17.5193 -53.91777 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 17.5193 53.91777 moveto
+-45.86575 -33.32317 lineto stroke
+newpath 56.6929 0 moveto
+68.79836 16.66171 lineto
+17.5193 53.91777 lineto stroke
+ [] 0 setdash
+newpath 0 0 moveto
+17.5193 -53.91777 lineto stroke
+13.7833 56.91777 moveto
+(A) cmmi10 9.96265 fshow
+71.79836 13.25781 moveto
+(O) cmmi10 9.96265 fshow
+25.3513 17.9404 moveto
+(d) cmmi10 9.96265 fshow
+30.5367 16.446 moveto
+(1) cmr7 6.97385 fshow
+-25.92802 13.8917 moveto
+(d) cmmi10 9.96265 fshow
+-20.74263 12.3973 moveto
+(2) cmr7 6.97385 fshow
+45.25882 38.88412 moveto
+(d) cmmi10 9.96265 fshow
+50.44421 37.38972 moveto
+(3) cmr7 6.97385 fshow
+11.75966 -29.10365 moveto
+(r) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 3054 a Ff(d)43 3066 y Fb(1)108 3054 y
+Fh(=)f(2)p Ff(r)f Fh(sin\()p Ff(\031)s(=)p Fh(5\),)h
+Ff(d)698 3066 y Fb(2)763 3054 y Fh(=)h(2)p Ff(r)d Fh(sin\(2)p
+Ff(\031)s(=)p Fh(5\))i(and)g Ff(d)1533 3066 y Fb(3)1599
+3054 y Fh(=)g Ff(d)1734 3066 y Fb(1)1794 3054 y Fh(sin\(2)p
+Ff(\031)s(=)p Fh(5\))g(=)h(2)p Ff(r)d Fh(sin\()p Ff(\031)s(=)p
+Fh(5\))e(sin\(2)p Ff(\031)s(=)p Fh(5\))0 3154 y(The)28
+b(angle)e Ff(\013)j Fh(is)e(de\014ned)h(b)n(y)f(the)h(follo)n(wing)f
+(conditions:)1542 3736 y @beginspecial -4 @llx -12 @lly
+94 @urx 55 @ury 980 @rwi @setspecial
+%%BeginDocument: vect-fig.15
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000003000000004
+%*Font: cmr7 6.97385 6.97385 32:c
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+82.04709 50.70752 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 45.35449 0 moveto
+45.35449 8.4288 54.22473 13.91087 61.76366 10.14134 curveto stroke
+29.26875 28.94815 moveto
+(d) cmmi10 9.96265 fshow
+34.45415 27.45375 moveto
+(2) cmr7 6.97385 fshow
+23.51904 -9.9185 moveto
+(d) cmmi10 9.96265 fshow
+28.70444 -11.4129 moveto
+(3) cmr7 6.97385 fshow
+71.46999 16.33527 moveto
+(d) cmmi10 9.96265 fshow
+76.65538 14.84087 moveto
+(3) cmr7 6.97385 fshow
+49.57056 4.19368 moveto
+(\013) cmmi10 9.96265 fshow
+85.04709 47.30362 moveto
+(B) cmmi10 9.96265 fshow
+-3.73601 -9.8078 moveto
+(A) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 3863 a(Th)n(us)g Ff(d)253 3832 y Fb(2)253
+3883 y(2)318 3863 y Fh(=)h Ff(d)454 3832 y Fb(2)454 3883
+y(3)510 3863 y Fh(+)18 b Ff(d)636 3832 y Fb(2)636 3883
+y(3)692 3863 y Fe(\000)g Fh(2)p Ff(d)860 3832 y Fb(2)860
+3883 y(3)920 3863 y Fh(cos)k Ff(\013)p Fh(,)28 b(whic)n(h)f(leads)h(to)
+f(cos)22 b Ff(\013)28 b Fh(=)g(1)17 b Fe(\000)2186 3816
+y Ff(d)2229 3782 y Fb(2)2229 3837 y(2)p 2165 3844 122
+4 v 2165 3919 a Fh(2)p Ff(d)2250 3884 y Fb(2)2250 3939
+y(3)2325 3863 y Fh(=)27 b Fe(\000)2517 3816 y Fh(cos\(2)p
+Ff(\031)s(=)p Fh(5\))p 2492 3844 402 4 v 2492 3919 a(2)22
+b(sin)2658 3884 y Fb(2)2696 3919 y Fh(\()p Ff(\031)s(=)p
+Fh(5\))1929 5539 y(5)p eop
+%%Page: 6 6
+6 5 bop 0 83 a Fi(def)37 b Fa(set)p 276 83 26 4 v 38
+w(do)l(de)l(c)l(ahe)l(dr)l(on)p 782 83 V 39 w(p)l(oints)7
+b Fh(\()p Fi(expr)29 b Fa(inst)7 b Fh(\))28 b(=)166 183
+y Fa(new)p 320 183 V 40 w(p)l(oints)7 b Fh(\()p Fa(fc)e
+Fh(\)\(10\);)28 b(\045)g(face)f(cen)n(ters)166 282 y
+Fa(set)p 279 282 V 38 w(p)l(oint)8 b Fh(\()p Fa(fc)593
+303 y Fb(1)630 282 y Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)g
+Fh(0\);)50 b Fa(set)p 1112 282 V 38 w(obj)p 1261 282
+V 44 w(p)l(oint)8 b Fh(\(1)p Ff(;)23 b Fh(1)p Ff(;)g
+Fh(0)p Ff(;)f Fh(0\);)166 382 y Fa(set)p 279 382 V 38
+w(obj)p 427 382 V 44 w(p)l(oint)8 b Fh(\(2)p Ff(;)23
+b Fh(cosd)o(\(72\))p Ff(;)g Fh(sind\(72\))p Ff(;)g Fh(0\);)k(\045)h
+(72=360/5)166 482 y Fa(r)l(otate)p 386 482 V 37 w(in)p
+495 482 V 37 w(plane)7 b Fh(\(3)p Ff(;)23 b Fa(fc)906
+502 y Fb(1)944 482 y Ff(;)g Fh(1)p Ff(;)f Fh(2\);)166
+581 y Fa(r)l(otate)p 386 581 V 37 w(in)p 495 581 V 37
+w(plane)7 b Fh(\(4)p Ff(;)23 b Fa(fc)906 601 y Fb(1)944
+581 y Ff(;)g Fh(2)p Ff(;)f Fh(3\);)166 681 y Fa(r)l(otate)p
+386 681 V 37 w(in)p 495 681 V 37 w(plane)7 b Fh(\(5)p
+Ff(;)23 b Fa(fc)906 701 y Fb(1)944 681 y Ff(;)g Fh(3)p
+Ff(;)f Fh(4\);)166 780 y Fa(c)l(osan)35 b Fh(=)27 b Fe(\000)22
+b Fh(cosd\(72\))p Ff(=)p Fh(\(2)17 b Fe(\003)h Fh(sind\(36\))g
+Fe(\003)g Fh(sind\(36\)\);)51 b Fa(sinan)34 b Fh(=)27
+b(sqrt\(1)18 b Fe(\000)g Fa(c)l(osan)25 b Fe(\003\003)18
+b Fh(2\);)166 880 y Fa(an)34 b Fh(=)27 b(180)17 b Fe(\000)h
+Fh(angle\(\()p Fa(c)l(osan)7 b Ff(;)23 b Fa(sinan)7 b
+Fh(\)\);)166 980 y Fa(new)p 320 980 V 40 w(abs)p 472
+980 V 37 w(fac)l(e)p 647 980 V 38 w(p)l(oint)i Fh(\()p
+Fa(fc)963 1000 y Fb(2)1000 980 y Ff(;)24 b Fa(fc)1115
+1000 y Fb(1)1152 980 y Ff(;)f Fh(1)p Ff(;)g Fh(2)p Ff(;)g
+Fa(an)6 b Fh(\);)166 1079 y Fa(new)p 320 1079 V 40 w(abs)p
+472 1079 V 37 w(fac)l(e)p 647 1079 V 38 w(p)l(oint)j
+Fh(\()p Fa(fc)963 1100 y Fb(3)1000 1079 y Ff(;)24 b Fa(fc)1115
+1100 y Fb(1)1152 1079 y Ff(;)f Fh(2)p Ff(;)g Fh(3)p Ff(;)g
+Fa(an)6 b Fh(\);)166 1179 y Fa(new)p 320 1179 V 40 w(abs)p
+472 1179 V 37 w(fac)l(e)p 647 1179 V 38 w(p)l(oint)j
+Fh(\()p Fa(fc)963 1199 y Fb(4)1000 1179 y Ff(;)24 b Fa(fc)1115
+1199 y Fb(1)1152 1179 y Ff(;)f Fh(3)p Ff(;)g Fh(4)p Ff(;)g
+Fa(an)6 b Fh(\);)166 1279 y Fa(new)p 320 1279 V 40 w(abs)p
+472 1279 V 37 w(fac)l(e)p 647 1279 V 38 w(p)l(oint)j
+Fh(\()p Fa(fc)963 1299 y Fb(5)1000 1279 y Ff(;)24 b Fa(fc)1115
+1299 y Fb(1)1152 1279 y Ff(;)f Fh(4)p Ff(;)g Fh(5)p Ff(;)g
+Fa(an)6 b Fh(\);)166 1378 y Fa(new)p 320 1378 V 40 w(abs)p
+472 1378 V 37 w(fac)l(e)p 647 1378 V 38 w(p)l(oint)j
+Fh(\()p Fa(fc)963 1398 y Fb(6)1000 1378 y Ff(;)24 b Fa(fc)1115
+1398 y Fb(1)1152 1378 y Ff(;)f Fh(5)p Ff(;)g Fh(1)p Ff(;)g
+Fa(an)6 b Fh(\);)166 1478 y Fa(r)l(otate)p 386 1478 V
+37 w(in)p 495 1478 V 37 w(plane)h Fh(\(6)p Ff(;)23 b
+Fa(fc)906 1498 y Fb(2)944 1478 y Ff(;)g Fh(2)p Ff(;)f
+Fh(1\);)166 1577 y Fa(r)l(otate)p 386 1577 V 37 w(in)p
+495 1577 V 37 w(plane)7 b Fh(\(7)p Ff(;)23 b Fa(fc)906
+1598 y Fb(2)944 1577 y Ff(;)g Fh(1)p Ff(;)f Fh(6\);)166
+1677 y Fa(r)l(otate)p 386 1677 V 37 w(in)p 495 1677 V
+37 w(plane)7 b Fh(\(8)p Ff(;)23 b Fa(fc)906 1697 y Fb(2)944
+1677 y Ff(;)g Fh(6)p Ff(;)f Fh(7\);)166 1777 y Fa(r)l(otate)p
+386 1777 V 37 w(in)p 495 1777 V 37 w(plane)7 b Fh(\(9)p
+Ff(;)23 b Fa(fc)906 1797 y Fb(3)944 1777 y Ff(;)g Fh(2)p
+Ff(;)f Fh(8\);)166 1876 y Fa(r)l(otate)p 386 1876 V 37
+w(in)p 495 1876 V 37 w(plane)7 b Fh(\(10)p Ff(;)22 b
+Fa(fc)948 1897 y Fb(3)985 1876 y Ff(;)h Fh(8)p Ff(;)g
+Fh(9\);)166 1976 y Fa(r)l(otate)p 386 1976 V 37 w(in)p
+495 1976 V 37 w(plane)7 b Fh(\(11)p Ff(;)22 b Fa(fc)948
+1996 y Fb(4)985 1976 y Ff(;)h Fh(3)p Ff(;)g Fh(10\);)166
+2076 y Fa(r)l(otate)p 386 2076 V 37 w(in)p 495 2076 V
+37 w(plane)7 b Fh(\(12)p Ff(;)22 b Fa(fc)948 2096 y Fb(4)985
+2076 y Ff(;)h Fh(10)p Ff(;)f Fh(11\);)166 2175 y Fa(r)l(otate)p
+386 2175 V 37 w(in)p 495 2175 V 37 w(plane)7 b Fh(\(13)p
+Ff(;)22 b Fa(fc)948 2195 y Fb(5)985 2175 y Ff(;)h Fh(4)p
+Ff(;)g Fh(12\);)166 2275 y Fa(r)l(otate)p 386 2275 V
+37 w(in)p 495 2275 V 37 w(plane)7 b Fh(\(14)p Ff(;)22
+b Fa(fc)948 2295 y Fb(5)985 2275 y Ff(;)h Fh(12)p Ff(;)f
+Fh(13\);)166 2374 y Fa(r)l(otate)p 386 2374 V 37 w(in)p
+495 2374 V 37 w(plane)7 b Fh(\(15)p Ff(;)22 b Fa(fc)948
+2395 y Fb(6)985 2374 y Ff(;)h Fh(5)p Ff(;)g Fh(14\);)166
+2474 y Fa(new)p 320 2474 V 40 w(abs)p 472 2474 V 37 w(fac)l(e)p
+647 2474 V 38 w(p)l(oint)9 b Fh(\()p Fa(fc)963 2494 y
+Fb(7)1000 2474 y Ff(;)24 b Fa(fc)1115 2494 y Fb(2)1152
+2474 y Ff(;)f Fh(6)p Ff(;)g Fh(7)p Ff(;)g Fa(an)6 b Fh(\);)166
+2574 y Fa(new)p 320 2574 V 40 w(abs)p 472 2574 V 37 w(fac)l(e)p
+647 2574 V 38 w(p)l(oint)j Fh(\()p Fa(fc)963 2594 y Fb(8)1000
+2574 y Ff(;)24 b Fa(fc)1115 2594 y Fb(3)1152 2574 y Ff(;)f
+Fh(8)p Ff(;)g Fh(9)p Ff(;)g Fa(an)6 b Fh(\);)166 2673
+y Fa(new)p 320 2673 V 40 w(abs)p 472 2673 V 37 w(fac)l(e)p
+647 2673 V 38 w(p)l(oint)j Fh(\()p Fa(fc)963 2694 y Fb(9)1000
+2673 y Ff(;)24 b Fa(fc)1115 2694 y Fb(4)1152 2673 y Ff(;)f
+Fh(10)p Ff(;)f Fh(11)p Ff(;)h Fa(an)6 b Fh(\);)166 2773
+y Fa(new)p 320 2773 V 40 w(abs)p 472 2773 V 37 w(fac)l(e)p
+647 2773 V 38 w(p)l(oint)j Fh(\()p Fa(fc)963 2793 y Fb(10)1034
+2773 y Ff(;)23 b Fa(fc)1148 2793 y Fb(5)1185 2773 y Ff(;)g
+Fh(12)p Ff(;)f Fh(13)p Ff(;)h Fa(an)6 b Fh(\);)166 2873
+y Fa(r)l(otate)p 386 2873 V 37 w(in)p 495 2873 V 37 w(plane)h
+Fh(\(16)p Ff(;)22 b Fa(fc)948 2893 y Fb(7)985 2873 y
+Ff(;)h Fh(6)p Ff(;)g Fh(15\);)166 2972 y Fa(r)l(otate)p
+386 2972 V 37 w(in)p 495 2972 V 37 w(plane)7 b Fh(\(17)p
+Ff(;)22 b Fa(fc)948 2992 y Fb(7)985 2972 y Ff(;)h Fh(15)p
+Ff(;)f Fh(16\);)166 3072 y Fa(r)l(otate)p 386 3072 V
+37 w(in)p 495 3072 V 37 w(plane)7 b Fh(\(18)p Ff(;)22
+b Fa(fc)948 3092 y Fb(8)985 3072 y Ff(;)h Fh(7)p Ff(;)g
+Fh(17\);)166 3171 y Fa(r)l(otate)p 386 3171 V 37 w(in)p
+495 3171 V 37 w(plane)7 b Fh(\(19)p Ff(;)22 b Fa(fc)948
+3192 y Fb(9)985 3171 y Ff(;)h Fh(9)p Ff(;)g Fh(18\);)166
+3271 y Fa(r)l(otate)p 386 3271 V 37 w(in)p 495 3271 V
+37 w(plane)7 b Fh(\(20)p Ff(;)22 b Fa(fc)948 3291 y Fb(10)1018
+3271 y Ff(;)h Fh(11)p Ff(;)f Fh(19\);)166 3371 y Fa(normalize)p
+529 3371 V 38 w(obj)13 b Fh(\()p Fa(inst)8 b Fh(\)\(2)p
+Ff(;)23 b Fh(20\);)k(\045)h(opp)r(osite)f(v)n(ertices)166
+3470 y Fa(set)p 279 3470 V 38 w(obj)p 427 3470 V 44 w(p)l(oint)8
+b Fh(\(21)p Ff(;)22 b Fh(0)p Ff(;)h Fh(0)p Ff(;)g Fh(0\);)k(\045)h(cen)
+n(ter)f(of)h(do)r(decahedron)166 3570 y Fa(fr)l(e)l(e)p
+305 3570 V 37 w(p)l(oints)7 b Fh(\()p Fa(fc)f Fh(\)\(10\);)0
+3670 y Fi(enddef)j Fh(;)1929 5539 y(6)p eop
+%%Page: 7 7
+7 6 bop 0 83 a Fi(v)-5 b(ardef)38 b Fa(def)p 422 83 26
+4 v 49 w(do)l(de)l(c)l(ahe)l(dr)l(on)8 b Fh(\()p Fi(expr)29
+b Fa(inst)8 b Fh(\))27 b(=)166 183 y Fi(sa)m(v)m(e)i
+Fa(c)l(osan)7 b Ff(;)23 b Fa(sinan)6 b Ff(;)23 b Fa(an)7
+b Fh(;)166 282 y Fa(new)p 320 282 V 40 w(obj)p 469 282
+V 43 w(p)l(oints)g Fh(\()p Fa(inst)h Ff(;)23 b Fh(21\);)k(\045)h(21)f
+(p)r(oin)n(ts)g(in)h(the)g(de\014nition)166 382 y Fa(new)p
+320 382 V 40 w(obj)p 469 382 V 43 w(fac)l(es)8 b Fh(\()p
+Fa(inst)g Ff(;)23 b Fh(12\);)k(\045)h(12)f(faces)g(in)h(the)f
+(de\014nition)166 482 y Fa(set)p 279 482 V 38 w(do)l(de)l(c)l(ahe)l(dr)
+l(on)p 785 482 V 39 w(p)l(oints)7 b Fh(\()p Fa(inst)h
+Fh(\);)166 581 y Fa(set)p 279 581 V 38 w(obj)p 427 581
+V 44 w(fac)l(e)f Fh(\(1)p Ff(;)23 b Fd("5,4,3,2,1")-5
+b Ff(;)24 b Fd("ff0fa1")l Fh(\);)166 681 y Fa(set)p 279
+681 V 38 w(obj)p 427 681 V 44 w(fac)l(e)7 b Fh(\(2)p
+Ff(;)23 b Fd("8,7,6,1,2")-5 b Ff(;)24 b Fd("b40000")l
+Fh(\);)166 780 y Fa(set)p 279 780 V 38 w(obj)p 427 780
+V 44 w(fac)l(e)7 b Fh(\(3)p Ff(;)23 b Fd("10,9,8,2,3")-5
+b Ff(;)23 b Fd("b49b49")m Fh(\);)166 880 y Fa(set)p 279
+880 V 38 w(obj)p 427 880 V 44 w(fac)l(e)7 b Fh(\(4)p
+Ff(;)23 b Fd("12,11,10,3,4")-6 b Ff(;)23 b Fd("b49bc0")m
+Fh(\);)166 980 y Fa(set)p 279 980 V 38 w(obj)p 427 980
+V 44 w(fac)l(e)7 b Fh(\(5)p Ff(;)23 b Fd("14,13,12,4,5")-6
+b Ff(;)23 b Fd("b4c8fe")m Fh(\);)166 1079 y Fa(set)p
+279 1079 V 38 w(obj)p 427 1079 V 44 w(fac)l(e)7 b Fh(\(6)p
+Ff(;)23 b Fd("6,15,14,5,1")-5 b Ff(;)23 b Fd("b4fefe")l
+Fh(\);)166 1179 y Fa(set)p 279 1179 V 38 w(obj)p 427
+1179 V 44 w(fac)l(e)7 b Fh(\(7)p Ff(;)23 b Fd("6,7,17,16,15")-6
+b Ff(;)23 b Fd("b4fe40")m Fh(\);)166 1279 y Fa(set)p
+279 1279 V 38 w(obj)p 427 1279 V 44 w(fac)l(e)7 b Fh(\(8)p
+Ff(;)23 b Fd("8,9,18,17,7")-5 b Ff(;)23 b Fd("45d040")l
+Fh(\);)166 1378 y Fa(set)p 279 1378 V 38 w(obj)p 427
+1378 V 44 w(fac)l(e)7 b Fh(\(9)p Ff(;)23 b Fd("10,11,19,18,9")-6
+b Ff(;)23 b Fd("45a114")m Fh(\);)166 1478 y Fa(set)p
+279 1478 V 38 w(obj)p 427 1478 V 44 w(fac)l(e)7 b Fh(\(10)p
+Ff(;)23 b Fd("11,12,13,20,19)o(")-6 b Ff(;)23 b Fd("45a1d4")m
+Fh(\);)166 1577 y Fa(set)p 279 1577 V 38 w(obj)p 427
+1577 V 44 w(fac)l(e)7 b Fh(\(11)p Ff(;)23 b Fd("14,15,16,20,13)o(")-6
+b Ff(;)23 b Fd("4569d4")m Fh(\);)166 1677 y Fa(set)p
+279 1677 V 38 w(obj)p 427 1677 V 44 w(fac)l(e)7 b Fh(\(12)p
+Ff(;)23 b Fd("16,17,18,19,20)o(")-6 b Ff(;)23 b Fd("112da1")m
+Fh(\);)0 1777 y Fi(enddef)9 b Fh(;)1929 5539 y(7)p eop
+%%Page: 8 8
+8 7 bop 0 83 3900 4 v 0 798 a Fh(ICOSAHEDR)n(ON)27 b(\(20)g(faces\))236
+b @beginspecial -45 @llx -9 @lly 45 @urx 74 @ury 900
+@rwi @setspecial
+%%BeginDocument: icosa.ps
+ 0.9 0 0.2 setrgbcolor
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -25.68799 1.55798 moveto
+-28.42604 16.43794 lineto
+-44.1566 43.59232 lineto
+ closepath stroke
+ 0.5 0.3 0 setrgbcolor
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath -25.68799 1.55798 moveto
+12.74963 -7.66377 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 0.3 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+23.86919 35.2901 lineto
+-28.42604 16.43794 lineto
+ closepath stroke
+ 0 1 1 setrgbcolor
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath fill
+ 0 setgray
+newpath 12.74963 -7.66377 moveto
+44.05013 25.7487 lineto
+23.86919 35.2901 lineto
+ closepath stroke
+ 0.4 0 0.6 setrgbcolor
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -44.1566 43.59232 moveto
+-28.42604 16.43794 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 0.4 0.2 setrgbcolor
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath -28.42604 16.43794 moveto
+23.86919 35.2901 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 0.2 1 0.3 setrgbcolor
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+44.05013 25.7487 lineto
+29.03177 72.06873 lineto
+ closepath stroke
+ 0.1 0.2 0.9 setrgbcolor
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 23.86919 35.2901 moveto
+29.03177 72.06873 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+ 1 1 0.2 setrgbcolor
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath fill
+ 0 setgray
+newpath 29.03177 72.06873 moveto
+-11.5942 73.15201 lineto
+-17.74438 70.99686 lineto
+ closepath stroke
+showpage
+%%EndDocument
+ @endspecial 0 846 V 0 1072 a(Tw)n(o)27 b(faces)g(of)g(an)h
+(icosahedron)d(are)i(link)n(ed)h(in)f(the)h(follo)n(wing)f(w)n(a)n(y:)0
+1671 y @beginspecial -1 @llx -3 @lly 85 @urx 60 @ury
+860 @rwi @setspecial
+%%BeginDocument: vect-fig.4
+%*Font: cmmi10 9.96265 9.96265 63:c4
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto
+84.178 58.94121 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 0 0 moveto
+34.52216 17.60036 lineto
+84.178 58.94121 lineto stroke
+newpath 55.8313 9.84444 moveto
+34.52216 17.60036 lineto stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+45.17673 13.7224 lineto
+84.178 58.94121 lineto stroke
+34.80362 31.5706 moveto
+(d) cmmi10 9.96265 fshow
+25.75995 -2.36728 moveto
+(c) cmmi10 9.96265 fshow
+19.7183 9.8612 moveto
+(h) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 744 1429 a(where)g Ff(h)h Fh(=)f Ff(c)1188
+1360 y Fe(p)p 1257 1360 42 4 v 69 x Fh(3)p Ff(=)p Fh(2)0
+2208 y Ff(d)h Fh(is)f(also)g(a)g(diagonal)f(in)i(a)f(p)r(en)n(tagon:)
+1280 2646 y @beginspecial -47 @llx -55 @lly 57 @urx 55
+@ury 1040 @rwi @setspecial
+%%BeginDocument: vect-fig.5
+%*Font: cmmi10 9.96265 9.96265 63:c001
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 56.6929 0 moveto
+17.5193 53.91777 lineto
+-45.86575 33.32317 lineto
+-45.86575 -33.32317 lineto
+17.5193 -53.91777 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 56.6929 0 moveto
+-45.86575 33.32317 lineto stroke
+ [] 0 setdash
+newpath 0 0 moveto
+-45.86575 -33.32317 lineto stroke
+39.20609 29.05888 moveto
+(c) cmmi10 9.96265 fshow
+-16.32893 46.62047 moveto
+(c) cmmi10 9.96265 fshow
+7.51357 18.76158 moveto
+(d) cmmi10 9.96265 fshow
+-29.80437 -14.5616 moveto
+(r) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 2766 a Ff(c)h Fh(=)f(2)p Ff(r)e Fh(sin\()p
+Ff(\031)s(=)p Fh(5\),)j Ff(d)g Fh(=)f(2)p Ff(r)e Fh(sin\(2)p
+Ff(\031)s(=)p Fh(5\))i(=)g(2)p Ff(c)c Fh(cos)o(\()p Ff(\031)s(=)p
+Fh(5\))0 3099 y(The)28 b(angle)e(b)r(et)n(w)n(een)i(t)n(w)n(o)f(faces)g
+(is)g(computed)h(as)f(follo)n(ws:)1939 3312 y @beginspecial
+-1 @llx -17 @lly 100 @urx 39 @ury 1010 @rwi @setspecial
+%%BeginDocument: vect-fig.6
+%*Font: cmmi10 9.96265 9.96265 0b:8002000000002
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+%*Font: cmr10 9.96265 9.96265 28:c024000000000010011
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+98.9496 37.79556 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 45.35449 0 moveto
+45.35449 10.4087 58.20499 15.31717 65.14412 7.55899 curveto stroke
+3.64642 23.48848 moveto
+(2) cmr10 9.96265 fshow
+10.28812 23.48848 moveto
+(cos\() cmr10 9.96265 fshow
+27.50142 23.48848 moveto
+(\031) cmmi10 9.96265 fshow
+33.53783 23.48848 moveto
+(=) cmmi10 9.96265 fshow
+38.51912 23.48848 moveto
+(5\)) cmr10 9.96265 fshow
+23.08835 -3.6775 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop 0 setlinecap
+newpath 29.63326 -3.5081 moveto
+33.60455 -3.5081 lineto stroke
+29.63326 -9.4912 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 23.08835 -10.9231 moveto
+33.60455 -10.9231 lineto stroke
+26.36086 -16.8493 moveto
+(2) cmr7 6.97385 fshow
+81.11674 16.12029 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 87.66165 16.28969 moveto
+91.63295 16.28969 lineto stroke
+87.66165 10.3066 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 81.11674 8.8747 moveto
+91.63295 8.8747 lineto stroke
+84.38925 2.94849 moveto
+(2) cmr7 6.97385 fshow
+51.68338 2.57968 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EndDocument
+ @endspecial 0 3462 a(W)-7 b(e)28 b(ha)n(v)n(e)e(\(2)d(cos)o(\()p
+Ff(\031)s(=)p Fh(5\)\))773 3420 y Fb(2)838 3462 y Fh(=)k(2\()1004
+3393 y Fe(p)p 1073 3393 V 69 x Fh(3)o Ff(=)p Fh(2\))1230
+3407 y Fb(2)1285 3462 y Fe(\000)18 b Fh(2\()1442 3393
+y Fe(p)p 1511 3393 V 69 x Fh(3)p Ff(=)p Fh(2\))1668 3407
+y Fb(2)1728 3462 y Fh(cos)23 b Ff(\013)0 3611 y Fh(Th)n(us)k
+Ff(cos\013)i Fh(=)e(1)18 b Fe(\000)652 3579 y Fb(8)p
+652 3593 34 4 v 652 3640 a(3)718 3611 y Fh(cos)829 3581
+y Fb(2)866 3611 y Fh(\()p Ff(\031)s(=)p Fh(5\))1929 5539
+y(8)p eop
+%%Page: 9 9
+9 8 bop 0 83 a Fi(def)37 b Fa(set)p 276 83 26 4 v 38
+w(ic)l(osahe)l(dr)l(on)p 727 83 V 39 w(p)l(oints)7 b
+Fh(\()p Fi(expr)29 b Fa(inst)7 b Fh(\))28 b(=)166 183
+y Fa(set)p 279 183 V 38 w(obj)p 427 183 V 44 w(p)l(oint)8
+b Fh(\(1)p Ff(;)23 b Fh(0)p Ff(;)g Fh(0)p Ff(;)f Fh(0\);)51
+b Fa(set)p 1197 183 V 38 w(obj)p 1345 183 V 44 w(p)l(oint)8
+b Fh(\(2)p Ff(;)23 b Fh(1)p Ff(;)f Fh(0)p Ff(;)h Fh(0\);)166
+282 y Fa(set)p 279 282 V 38 w(obj)p 427 282 V 44 w(p)l(oint)8
+b Fh(\(3)p Ff(;)23 b Fh(cosd)o(\(60\))p Ff(;)g Fh(sind\(60\))p
+Ff(;)g Fh(0\);)k(\045)h(60=360/6)166 382 y Fa(c)l(osan)35
+b Fh(=)27 b(1)18 b Fe(\000)643 364 y Fb(8)668 382 y Ff(=)698
+391 y Fb(3)748 382 y Fe(\003)g Fh(cosd\(36\))g Fe(\003)g
+Fh(cosd)o(\(36\);)50 b Fa(sinan)35 b Fh(=)27 b(sqrt)o(\(1)18
+b Fe(\000)g Fa(c)l(osan)26 b Fe(\003\003)17 b Fh(2\);)166
+482 y Fa(an)34 b Fh(=)27 b(180)17 b Fe(\000)h Fh(angle\(\()p
+Fa(c)l(osan)7 b Ff(;)23 b Fa(sinan)7 b Fh(\)\);)166 581
+y Fa(new)p 320 581 V 40 w(fac)l(e)p 496 581 V 37 w(p)l(oint)i
+Fh(\(4)p Ff(;)23 b Fh(1)p Ff(;)f Fh(2)p Ff(;)h Fh(3)p
+Ff(;)f Fa(an)7 b Fh(\);)166 681 y Fa(new)p 320 681 V
+40 w(fac)l(e)p 496 681 V 37 w(p)l(oint)i Fh(\(5)p Ff(;)23
+b Fh(2)p Ff(;)f Fh(3)p Ff(;)h Fh(1)p Ff(;)f Fa(an)7 b
+Fh(\);)166 780 y Fa(new)p 320 780 V 40 w(fac)l(e)p 496
+780 V 37 w(p)l(oint)i Fh(\(6)p Ff(;)23 b Fh(3)p Ff(;)f
+Fh(1)p Ff(;)h Fh(2)p Ff(;)f Fa(an)7 b Fh(\);)166 880
+y Fa(new)p 320 880 V 40 w(fac)l(e)p 496 880 V 37 w(p)l(oint)i
+Fh(\(7)p Ff(;)23 b Fh(2)p Ff(;)f Fh(4)p Ff(;)h Fh(3)p
+Ff(;)f Fa(an)7 b Fh(\);)166 980 y Fa(new)p 320 980 V
+40 w(fac)l(e)p 496 980 V 37 w(p)l(oint)i Fh(\(8)p Ff(;)23
+b Fh(3)p Ff(;)f Fh(5)p Ff(;)h Fh(1)p Ff(;)f Fa(an)7 b
+Fh(\);)166 1079 y Fa(new)p 320 1079 V 40 w(fac)l(e)p
+496 1079 V 37 w(p)l(oint)i Fh(\(9)p Ff(;)23 b Fh(1)p
+Ff(;)f Fh(6)p Ff(;)h Fh(2)p Ff(;)f Fa(an)7 b Fh(\);)166
+1179 y Fa(new)p 320 1179 V 40 w(fac)l(e)p 496 1179 V
+37 w(p)l(oint)i Fh(\(10)p Ff(;)22 b Fh(3)p Ff(;)h Fh(4)p
+Ff(;)f Fh(7)p Ff(;)h Fa(an)6 b Fh(\);)166 1279 y Fa(new)p
+320 1279 V 40 w(fac)l(e)p 496 1279 V 37 w(p)l(oint)j
+Fh(\(11)p Ff(;)22 b Fh(3)p Ff(;)h Fh(7)p Ff(;)f Fh(5)p
+Ff(;)h Fa(an)6 b Fh(\);)166 1378 y Fa(new)p 320 1378
+V 40 w(fac)l(e)p 496 1378 V 37 w(p)l(oint)j Fh(\(12)p
+Ff(;)22 b Fh(1)p Ff(;)h Fh(8)p Ff(;)f Fh(6)p Ff(;)h Fa(an)6
+b Fh(\);)166 1478 y Fa(normalize)p 529 1478 V 38 w(obj)13
+b Fh(\()p Fa(inst)8 b Fh(\)\(1)p Ff(;)23 b Fh(10\);)k(\045)h(opp)r
+(osite)f(v)n(ertices)166 1577 y Fa(set)p 279 1577 V 38
+w(obj)p 427 1577 V 44 w(p)l(oint)8 b Fh(\(13)p Ff(;)22
+b Fh(0)p Ff(;)h Fh(0)p Ff(;)g Fh(0\);)k(\045)h(cen)n(ter)f(of)h
+(icosahedron)0 1677 y Fi(enddef)9 b Fh(;)0 1826 y Fi(v)-5
+b(ardef)38 b Fa(def)p 422 1826 V 49 w(ic)l(osahe)l(dr)l(on)8
+b Fh(\()p Fi(expr)29 b Fa(inst)7 b Fh(\))28 b(=)166 1926
+y Fi(sa)m(v)m(e)h Fa(c)l(osan)7 b Ff(;)23 b Fa(sinan)6
+b Ff(;)23 b Fa(an)7 b Fh(;)166 2026 y Fa(new)p 320 2026
+V 40 w(obj)p 469 2026 V 43 w(p)l(oints)g Fh(\()p Fa(inst)h
+Ff(;)23 b Fh(13\);)k(\045)h(12)f(v)n(ertices)f(and)i(the)g(cen)n(ter)
+166 2125 y Fa(new)p 320 2125 V 40 w(obj)p 469 2125 V
+43 w(fac)l(es)8 b Fh(\()p Fa(inst)g Ff(;)23 b Fh(20\);)k(\045)h(20)f
+(faces)g(in)h(the)f(de\014nition)166 2225 y Fa(set)p
+279 2225 V 38 w(ic)l(osahe)l(dr)l(on)p 730 2225 V 39
+w(p)l(oints)7 b Fh(\()p Fa(inst)h Fh(\);)166 2325 y Fa(set)p
+279 2325 V 38 w(obj)p 427 2325 V 44 w(fac)l(e)f Fh(\(1)p
+Ff(;)23 b Fd("3,2,1")m Ff(;)g Fd("b40000")m Fh(\);)166
+2424 y Fa(set)p 279 2424 V 38 w(obj)p 427 2424 V 44 w(fac)l(e)7
+b Fh(\(2)p Ff(;)23 b Fd("2,3,4")m Ff(;)g Fd("ff0fa1")m
+Fh(\);)166 2524 y Fa(set)p 279 2524 V 38 w(obj)p 427
+2524 V 44 w(fac)l(e)7 b Fh(\(3)p Ff(;)23 b Fd("3,7,4")m
+Ff(;)g Fd("b49b49")m Fh(\);)166 2623 y Fa(set)p 279 2623
+V 38 w(obj)p 427 2623 V 44 w(fac)l(e)7 b Fh(\(4)p Ff(;)23
+b Fd("3,5,7")m Ff(;)g Fd("b49bc0")m Fh(\);)166 2723 y
+Fa(set)p 279 2723 V 38 w(obj)p 427 2723 V 44 w(fac)l(e)7
+b Fh(\(5)p Ff(;)23 b Fd("3,1,5")m Ff(;)g Fd("b4c8fe")m
+Fh(\);)166 2823 y Fa(set)p 279 2823 V 38 w(obj)p 427
+2823 V 44 w(fac)l(e)7 b Fh(\(6)p Ff(;)23 b Fd("1,8,5")m
+Ff(;)g Fd("b4fefe")m Fh(\);)166 2922 y Fa(set)p 279 2922
+V 38 w(obj)p 427 2922 V 44 w(fac)l(e)7 b Fh(\(7)p Ff(;)23
+b Fd("1,6,8")m Ff(;)g Fd("b4fe40")m Fh(\);)166 3022 y
+Fa(set)p 279 3022 V 38 w(obj)p 427 3022 V 44 w(fac)l(e)7
+b Fh(\(8)p Ff(;)23 b Fd("1,2,6")m Ff(;)g Fd("45d040")m
+Fh(\);)166 3122 y Fa(set)p 279 3122 V 38 w(obj)p 427
+3122 V 44 w(fac)l(e)7 b Fh(\(9)p Ff(;)23 b Fd("2,9,6")m
+Ff(;)g Fd("45a114")m Fh(\);)166 3221 y Fa(set)p 279 3221
+V 38 w(obj)p 427 3221 V 44 w(fac)l(e)7 b Fh(\(10)p Ff(;)23
+b Fd("2,4,9")m Ff(;)g Fd("45a1d4")l Fh(\);)166 3321 y
+Fa(set)p 279 3321 V 38 w(obj)p 427 3321 V 44 w(fac)l(e)7
+b Fh(\(11)p Ff(;)23 b Fd("9,4,10")l Ff(;)g Fd("4569d4")m
+Fh(\);)166 3421 y Fa(set)p 279 3421 V 38 w(obj)p 427
+3421 V 44 w(fac)l(e)7 b Fh(\(12)p Ff(;)23 b Fd("4,7,10")l
+Ff(;)g Fd("112da1")m Fh(\);)166 3520 y Fa(set)p 279 3520
+V 38 w(obj)p 427 3520 V 44 w(fac)l(e)7 b Fh(\(13)p Ff(;)23
+b Fd("7,5,11")l Ff(;)g Fd("b4fefe")m Fh(\);)166 3620
+y Fa(set)p 279 3620 V 38 w(obj)p 427 3620 V 44 w(fac)l(e)7
+b Fh(\(14)p Ff(;)23 b Fd("5,8,11")l Ff(;)g Fd("b49bc0")m
+Fh(\);)166 3719 y Fa(set)p 279 3719 V 38 w(obj)p 427
+3719 V 44 w(fac)l(e)7 b Fh(\(15)p Ff(;)23 b Fd("8,6,12")l
+Ff(;)g Fd("45a114")m Fh(\);)166 3819 y Fa(set)p 279 3819
+V 38 w(obj)p 427 3819 V 44 w(fac)l(e)7 b Fh(\(16)p Ff(;)23
+b Fd("6,9,12")l Ff(;)g Fd("b49b49")m Fh(\);)166 3919
+y Fa(set)p 279 3919 V 38 w(obj)p 427 3919 V 44 w(fac)l(e)7
+b Fh(\(17)p Ff(;)23 b Fd("8,12,11")l Ff(;)g Fd("b40000")m
+Fh(\);)166 4018 y Fa(set)p 279 4018 V 38 w(obj)p 427
+4018 V 44 w(fac)l(e)7 b Fh(\(18)p Ff(;)23 b Fd("7,11,10")l
+Ff(;)g Fd("45a1d4")m Fh(\);)166 4118 y Fa(set)p 279 4118
+V 38 w(obj)p 427 4118 V 44 w(fac)l(e)7 b Fh(\(19)p Ff(;)23
+b Fd("12,10,11")-5 b Ff(;)24 b Fd("b4c8fe")l Fh(\);)166
+4218 y Fa(set)p 279 4218 V 38 w(obj)p 427 4218 V 44 w(fac)l(e)7
+b Fh(\(20)p Ff(;)23 b Fd("9,10,12")l Ff(;)g Fd("ff0fa1")m
+Fh(\);)0 4317 y Fi(enddef)9 b Fh(;)0 4467 y Fi(endinput)1929
+5539 y Fh(9)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.tex b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.tex
new file mode 100644
index 0000000000..ec36219e81
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/poly.tex
@@ -0,0 +1,287 @@
+\input mftmac
+\def\9{$\futurelet\next\doit}
+\let\[=\relax
+\def\doit{\ifx\next\[\def\next{\hfill{\rm\%}}%
+ \else\ifx\next\ \def\next{\qquad{\rm\%}}%
+ \else\def\next{{\rm\%}}\fi\fi\next}
+\input epsf
+\def\newpage{\vfill\eject}
+\def\vc#1{$\vcenter{#1}$}
+\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+\def\figure#1{\par\centerline{\epsfbox{#1}}}
+\title{{\bf POLY.MP: DEFINITION OF REGULAR CONVEX POLYHEDRA IN METAPOST}}
+\BL
+ version 1.0, 8 April 1998
+ {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+This package defines the five regular convex polyhedra classes and
+must be used with the {\bf 3d} package.
+\BL
+Each object definition is parameterized by
+an instance identification.
+\BL
+All polyhedra are normalized (centered on the origin and inscriptible
+in a sphere of radius 1).
+\BL
+The polyhedra are defined with a certain number of points and faces.
+The points comprise both the vertices and the center of the object.
+\BL
+It might be useful to remind the Euler formula linking
+the number of faces $f$,
+vertices $v$ and edges $e$ in polyhedra with no hole in dimension 3:
+$f+v-e=2$. This can be verified in the following table:
+\BL
+\centerline{\vbox{\halign{\quad#\hfil\quad&&\quad\hfil#\quad\cr
+ \omit \hfil type\hfil&\omit\hfil faces\hfil
+ &\omit\hfil vertices\hfil&\omit\hfil edges\hfil\cr
+ tetrahedron&4&4&6\cr
+ cube&6&8&12\cr
+ octahedron&8&6&12\cr
+ dodecahedron&12&20&30\cr
+ icosahedron&20&12&30\cr}}}
+\BL
+For more details, see the documentation enclosed in the distribution.
+\BL
+$\2{message}\7"*** poly, version 1.0 (c) D. Roegel, 8 April 1998 ***";$\par
+\BL
+\newpage\title{TETRAHEDRON (4 faces)\kern1cm\epsfbox{tetra.ps}}
+\BL
+ Construction of a tetrahedron:
+\BL
+ One face is \vc{\epsfbox{vect-fig.1}} with $h=c\sqrt{3}/2$
+\BL
+ The angle $\alpha$ between two faces is given by
+ $\sin(\alpha/2)={\displaystyle c/2\over \displaystyle c\sqrt{3}/2}=1/\sqrt3$
+\BL
+ \figure{vect-fig.2}
+\BL
+$\2{def}\\{set\_tetrahedron\_points}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{set\_obj\_point}(1,0,0,0);\ \\{set\_obj\_point}(2,1,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(3,\1{cosd}(60),\1{sind}(60),0);\ \9 $60=360/6$%
+\par
+\quad\quad$\\{sinan}=1/\1{sqrt}(3);\ \\{cosan}=\1{sqrt}(1-\\{sinan}\6{\ast \ast
+}2);$\par
+\quad\quad$\\{an}=180-2\ast \1{angle}((\\{cosan},\\{sinan}));$\par
+\quad\quad$\\{new\_face\_point}(4,1,2,3,\\{an});$\par
+\quad\quad$\\{normalize\_obj}(\\{inst})(1,2,3,4);$\par
+\quad\quad$\\{set\_obj\_point}(5,0,0,0);\ \9 center of tetrahedron\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{def\_tetrahedron}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{new\_obj\_points}(\\{inst},5);\ \9 4 vertices and the center\par
+\quad\quad$\\{new\_obj\_faces}(\\{inst},4);\ \9 4 faces in the definition\par
+\quad\quad$\\{set\_tetrahedron\_points}(\\{inst});$\par
+\quad\quad$\\{set\_obj\_face}(1,\7"1,2,4",\7"b4fefe");$\par
+\quad\quad$\\{set\_obj\_face}(2,\7"2,3,4",\7"b49bc0");$\par
+\quad\quad$\\{set\_obj\_face}(3,\7"1,4,3",\7"b4c8fe");$\par
+\quad\quad$\\{set\_obj\_face}(4,\7"1,3,2",\7"b4fe40");$\par
+$\!\3{enddef};$\par
+\BL
+\newpage\title{CUBE (HEXAHEDRON) (6 faces)\kern1cm\epsfbox{cube.ps}}
+\BL
+The definition of a cube is straightforward.
+\BL
+$\2{def}\\{set\_cube\_points}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{set\_obj\_point}(1,0,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(2,1,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(3,1,1,0);$\par
+\quad\quad$\\{set\_obj\_point}(4,0,1,0);$\par
+\quad\quad$\\{set\_obj\_point}(5,0,0,1);$\par
+\quad\quad$\\{set\_obj\_point}(6,1,0,1);$\par
+\quad\quad$\\{set\_obj\_point}(7,1,1,1);$\par
+\quad\quad$\\{set\_obj\_point}(8,0,1,1);$\par
+\quad\quad$\\{normalize\_obj}(\\{inst})(1,7);\ \9 1 and 7 are opposite vertices%
+\par
+\quad\quad$\\{set\_obj\_point}(9,0,0,0);\ \9 center of cube\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{def\_cube}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{new\_obj\_points}(\\{inst},9);\ \9 8 vertices and the center\par
+\quad\quad$\\{new\_obj\_faces}(\\{inst},6);\ \9 6 faces in the definition\par
+\quad\quad$\\{set\_cube\_points}(\\{inst});$\par
+\quad\quad$\\{set\_obj\_face}(1,\7"1,2,6,5",\7"b4fe40");$\par
+\quad\quad$\\{set\_obj\_face}(2,\7"2,3,7,6",\7"45d040");$\par
+\quad\quad$\\{set\_obj\_face}(3,\7"4,8,7,3",\7"45a114");$\par
+\quad\quad$\\{set\_obj\_face}(4,\7"1,5,8,4",\7"45a1d4");$\par
+\quad\quad$\\{set\_obj\_face}(5,\7"5,6,7,8",\7"4569d4");$\par
+\quad\quad$\\{set\_obj\_face}(6,\7"4,3,2,1",\7"112da1");$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage\title{OCTAHEDRON (8 faces)\kern1cm\epsfbox{octa.ps}}
+\BL
+ A section of a pyramid is: \vc{\epsfbox{vect-fig.3}}
+\BL
+ The height of this pyramid is given
+ by $H^2={(c\sqrt3/2)}^2-{(c/2)}^2=c^2/2$, hence $H=c/\sqrt2$
+\BL
+$\2{def}\\{set\_octahedron\_points}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{set\_obj\_point}(1,0,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(2,1,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(3,1,1,0);$\par
+\quad\quad$\\{set\_obj\_point}(4,0,1,0);$\par
+\quad\quad$\\{set\_obj\_point}(5,.5,.5,1/\1{sqrt}(2));$\par
+\quad\quad$\\{set\_obj\_point}(6,.5,.5,-1/\1{sqrt}(2));$\par
+\quad\quad$\\{normalize\_obj}(\\{inst})(5,6);\ \9 5 and 6 are opposite vertices%
+\par
+\quad\quad$\\{set\_obj\_point}(7,0,0,0);\ \9 center of octahedron\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{def\_octahedron}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{new\_obj\_points}(\\{inst},7);\ \9 6 vertices and the center\par
+\quad\quad$\\{new\_obj\_faces}(\\{inst},8);\ \9 8 faces in the definition\par
+\quad\quad$\\{set\_octahedron\_points}(\\{inst});$\par
+\quad\quad$\\{set\_obj\_face}(1,\7"1,2,5",\7"b4fefe");$\par
+\quad\quad$\\{set\_obj\_face}(2,\7"2,3,5",\7"45d040");$\par
+\quad\quad$\\{set\_obj\_face}(3,\7"3,4,5",\7"4569d4");$\par
+\quad\quad$\\{set\_obj\_face}(4,\7"4,1,5",\7"b49bc0");$\par
+\quad\quad$\\{set\_obj\_face}(5,\7"6,1,4",\7"45a1d4");$\par
+\quad\quad$\\{set\_obj\_face}(6,\7"6,2,1",\7"b4c8fe");$\par
+\quad\quad$\\{set\_obj\_face}(7,\7"6,3,2",\7"b49b49");$\par
+\quad\quad$\\{set\_obj\_face}(8,\7"6,4,3",\7"112da1");$\par
+$\!\3{enddef};$\par
+\BL
+\BL
+\newpage\title{DODECAHEDRON (12 faces)\kern1cm\epsfbox{dodeca.ps}}
+\BL
+ Two adjacent faces (pentagons) of the dodecahedron are as follows:
+\figure{vect-fig.13}
+ The angle between the faces is the angle between $\overrightarrow{OA}$
+ and $\overrightarrow{OB}$.
+ $OA=OB=d_3$ as defined in \figure{vect-fig.14}
+ $d_1=2r\sin(\pi/5)$, $d_2=2r\sin(2\pi/5)$
+ and $d_3=d_1\sin(2\pi/5)=2r\sin(\pi/5)\sin(2\pi/5)$
+
+ The angle $\alpha$ is defined by the following conditions:
+ \figure{vect-fig.15}
+ Thus $d_2^2=d_3^2+d_3^2-2d_3^2\cos\alpha$, which leads to
+ $\cos\alpha=1-{\displaystyle d_2^2\over\displaystyle2d_3^2}
+ =-{\displaystyle\cos(2\pi/5)\over\displaystyle2\sin^2(\pi/5)}$
+\newpage
+\BL
+$\2{def}\\{set\_dodecahedron\_points}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{new\_points}(\\{fc})(10);\ \9 face centers\par
+\quad\quad$\\{set\_point}(\\{fc}_{1},0,0,0);\ \\{set\_obj\_point}(1,1,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(2,\1{cosd}(72),\1{sind}(72),0);\ \9 72=360/5\par
+\quad\quad$\\{rotate\_in\_plane}(3,\\{fc}_{1},1,2);$\par
+\quad\quad$\\{rotate\_in\_plane}(4,\\{fc}_{1},2,3);$\par
+\quad\quad$\\{rotate\_in\_plane}(5,\\{fc}_{1},3,4);$\par
+\quad\quad$\\{cosan}=-\1{cosd}(72)/(2\ast \1{sind}(36)\ast \1{sind}(36));\ %
+\\{sinan}=\1{sqrt}(1-\\{cosan}\6{\ast \ast }2);$\par
+\quad\quad$\\{an}=180-\1{angle}((\\{cosan},\\{sinan}));$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{2},\\{fc}_{1},1,2,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{3},\\{fc}_{1},2,3,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{4},\\{fc}_{1},3,4,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{5},\\{fc}_{1},4,5,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{6},\\{fc}_{1},5,1,\\{an});$\par
+\quad\quad$\\{rotate\_in\_plane}(6,\\{fc}_{2},2,1);$\par
+\quad\quad$\\{rotate\_in\_plane}(7,\\{fc}_{2},1,6);$\par
+\quad\quad$\\{rotate\_in\_plane}(8,\\{fc}_{2},6,7);$\par
+\quad\quad$\\{rotate\_in\_plane}(9,\\{fc}_{3},2,8);$\par
+\quad\quad$\\{rotate\_in\_plane}(10,\\{fc}_{3},8,9);$\par
+\quad\quad$\\{rotate\_in\_plane}(11,\\{fc}_{4},3,10);$\par
+\quad\quad$\\{rotate\_in\_plane}(12,\\{fc}_{4},10,11);$\par
+\quad\quad$\\{rotate\_in\_plane}(13,\\{fc}_{5},4,12);$\par
+\quad\quad$\\{rotate\_in\_plane}(14,\\{fc}_{5},12,13);$\par
+\quad\quad$\\{rotate\_in\_plane}(15,\\{fc}_{6},5,14);$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{7},\\{fc}_{2},6,7,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{8},\\{fc}_{3},8,9,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{9},\\{fc}_{4},10,11,\\{an});$\par
+\quad\quad$\\{new\_abs\_face\_point}(\\{fc}_{10},\\{fc}_{5},12,13,\\{an});$\par
+\quad\quad$\\{rotate\_in\_plane}(16,\\{fc}_{7},6,15);$\par
+\quad\quad$\\{rotate\_in\_plane}(17,\\{fc}_{7},15,16);$\par
+\quad\quad$\\{rotate\_in\_plane}(18,\\{fc}_{8},7,17);$\par
+\quad\quad$\\{rotate\_in\_plane}(19,\\{fc}_{9},9,18);$\par
+\quad\quad$\\{rotate\_in\_plane}(20,\\{fc}_{10},11,19);$\par
+\quad\quad$\\{normalize\_obj}(\\{inst})(2,20);\ \9 opposite vertices\par
+\quad\quad$\\{set\_obj\_point}(21,0,0,0);\ \9 center of dodecahedron\par
+\quad\quad$\\{free\_points}(\\{fc})(10);$\par
+$\!\3{enddef};$\par
+\newpage
+$\2{vardef}\\{def\_dodecahedron}(\2{expr}\\{inst})=$\par
+\quad\quad$\2{save}\\{cosan},\\{sinan},\\{an};$\par
+\quad\quad$\\{new\_obj\_points}(\\{inst},21);\ \9 21 points in the definition%
+\par
+\quad\quad$\\{new\_obj\_faces}(\\{inst},12);\ \9 12 faces in the definition\par
+\quad\quad$\\{set\_dodecahedron\_points}(\\{inst});$\par
+\quad\quad$\\{set\_obj\_face}(1,\7"5,4,3,2,1",\7"ff0fa1");$\par
+\quad\quad$\\{set\_obj\_face}(2,\7"8,7,6,1,2",\7"b40000");$\par
+\quad\quad$\\{set\_obj\_face}(3,\7"10,9,8,2,3",\7"b49b49");$\par
+\quad\quad$\\{set\_obj\_face}(4,\7"12,11,10,3,4",\7"b49bc0");$\par
+\quad\quad$\\{set\_obj\_face}(5,\7"14,13,12,4,5",\7"b4c8fe");$\par
+\quad\quad$\\{set\_obj\_face}(6,\7"6,15,14,5,1",\7"b4fefe");$\par
+\quad\quad$\\{set\_obj\_face}(7,\7"6,7,17,16,15",\7"b4fe40");$\par
+\quad\quad$\\{set\_obj\_face}(8,\7"8,9,18,17,7",\7"45d040");$\par
+\quad\quad$\\{set\_obj\_face}(9,\7"10,11,19,18,9",\7"45a114");$\par
+\quad\quad$\\{set\_obj\_face}(10,\7"11,12,13,20,19",\7"45a1d4");$\par
+\quad\quad$\\{set\_obj\_face}(11,\7"14,15,16,20,13",\7"4569d4");$\par
+\quad\quad$\\{set\_obj\_face}(12,\7"16,17,18,19,20",\7"112da1");$\par
+$\!\3{enddef};$\par
+\BL
+\newpage\title{ICOSAHEDRON (20 faces)\kern1cm\epsfbox{icosa.ps}}
+\BL
+Two faces of an icosahedron are linked in the following way:
+\BL
+ \vc{\epsfbox{vect-fig.4}} where $h=c\sqrt3/2$
+\BL
+ $d$ is also a diagonal in a pentagon: \vc{\epsfbox{vect-fig.5}}
+\BL
+ $c=2r\sin(\pi/5)$,
+ $d=2r\sin(2\pi/5)=2c\cos(\pi/5)$
+\BL
+ The angle between two faces is computed as follows:
+ \vc{\epsfbox{vect-fig.6}}
+\BL
+ We have ${(2\cos(\pi/5))}^2=2{(\sqrt3/2)}^2-2{(\sqrt3/2)}^2\cos\alpha$
+\BL
+ Thus $cos\alpha=1-{8\over3}\cos^2(\pi/5)$
+\newpage
+\BL
+$\2{def}\\{set\_icosahedron\_points}(\2{expr}\\{inst})=$\par
+\quad\quad$\\{set\_obj\_point}(1,0,0,0);\ \\{set\_obj\_point}(2,1,0,0);$\par
+\quad\quad$\\{set\_obj\_point}(3,\1{cosd}(60),\1{sind}(60),0);\ \9 60=360/6\par
+\quad\quad$\\{cosan}=1-\frac8/{3}\ast \1{cosd}(36)\ast \1{cosd}(36);\ %
+\\{sinan}=\1{sqrt}(1-\\{cosan}\6{\ast \ast }2);$\par
+\quad\quad$\\{an}=180-\1{angle}((\\{cosan},\\{sinan}));$\par
+\quad\quad$\\{new\_face\_point}(4,1,2,3,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(5,2,3,1,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(6,3,1,2,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(7,2,4,3,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(8,3,5,1,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(9,1,6,2,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(10,3,4,7,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(11,3,7,5,\\{an});$\par
+\quad\quad$\\{new\_face\_point}(12,1,8,6,\\{an});$\par
+\quad\quad$\\{normalize\_obj}(\\{inst})(1,10);\ \9 opposite vertices\par
+\quad\quad$\\{set\_obj\_point}(13,0,0,0);\ \9 center of icosahedron\par
+$\!\3{enddef};$\par
+\BL
+$\2{vardef}\\{def\_icosahedron}(\2{expr}\\{inst})=$\par
+\quad\quad$\2{save}\\{cosan},\\{sinan},\\{an};$\par
+\quad\quad$\\{new\_obj\_points}(\\{inst},13);\ \9 12 vertices and the center\par
+\quad\quad$\\{new\_obj\_faces}(\\{inst},20);\ \9 20 faces in the definition\par
+\quad\quad$\\{set\_icosahedron\_points}(\\{inst});$\par
+\quad\quad$\\{set\_obj\_face}(1,\7"3,2,1",\7"b40000");$\par
+\quad\quad$\\{set\_obj\_face}(2,\7"2,3,4",\7"ff0fa1");$\par
+\quad\quad$\\{set\_obj\_face}(3,\7"3,7,4",\7"b49b49");$\par
+\quad\quad$\\{set\_obj\_face}(4,\7"3,5,7",\7"b49bc0");$\par
+\quad\quad$\\{set\_obj\_face}(5,\7"3,1,5",\7"b4c8fe");$\par
+\quad\quad$\\{set\_obj\_face}(6,\7"1,8,5",\7"b4fefe");$\par
+\quad\quad$\\{set\_obj\_face}(7,\7"1,6,8",\7"b4fe40");$\par
+\quad\quad$\\{set\_obj\_face}(8,\7"1,2,6",\7"45d040");$\par
+\quad\quad$\\{set\_obj\_face}(9,\7"2,9,6",\7"45a114");$\par
+\quad\quad$\\{set\_obj\_face}(10,\7"2,4,9",\7"45a1d4");$\par
+\quad\quad$\\{set\_obj\_face}(11,\7"9,4,10",\7"4569d4");$\par
+\quad\quad$\\{set\_obj\_face}(12,\7"4,7,10",\7"112da1");$\par
+\quad\quad$\\{set\_obj\_face}(13,\7"7,5,11",\7"b4fefe");$\par
+\quad\quad$\\{set\_obj\_face}(14,\7"5,8,11",\7"b49bc0");$\par
+\quad\quad$\\{set\_obj\_face}(15,\7"8,6,12",\7"45a114");$\par
+\quad\quad$\\{set\_obj\_face}(16,\7"6,9,12",\7"b49b49");$\par
+\quad\quad$\\{set\_obj\_face}(17,\7"8,12,11",\7"b40000");$\par
+\quad\quad$\\{set\_obj\_face}(18,\7"7,11,10",\7"45a1d4");$\par
+\quad\quad$\\{set\_obj\_face}(19,\7"12,10,11",\7"b4c8fe");$\par
+\quad\quad$\\{set\_obj\_face}(20,\7"9,10,12",\7"ff0fa1");$\par
+$\!\3{enddef};$\par
+\BL
+$\5{endinput}$\par
+\BL
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/tetra.ps b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/tetra.ps
new file mode 100644
index 0000000000..5012e61fc9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/tetra.ps
@@ -0,0 +1,30 @@
+%!PS
+%%BoundingBox: -42 8 23 84
+%%Creator: MetaPost
+%%CreationDate: 1997.02.25:2122
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0.70589 0.99608 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath fill
+ 0 setgray 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 21.79984 8.75485 moveto
+20.07991 27.9324 lineto
+0.00073 82.53789 lineto
+ closepath stroke
+ 0.70589 0.78432 0.99608 setrgbcolor
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath fill
+ 0 setgray
+newpath 21.79984 8.75485 moveto
+0.00073 82.53789 lineto
+-40.95468 20.78085 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1
new file mode 100644
index 0000000000..13b4f7514b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.1
@@ -0,0 +1,28 @@
+%!PS
+%%BoundingBox: -1 -8 57 50
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 63:84
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+28.34645 49.09763 lineto
+ closepath stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 28.34645 49.09763 moveto
+28.34645 0 lineto stroke
+7.76184 26.6488 moveto
+(c) cmmi10 9.96265 fshow
+31.34645 21.08955 moveto
+(h) cmmi10 9.96265 fshow
+26.19075 -7.2895 moveto
+(c) cmmi10 9.96265 fshow
+44.61966 26.6488 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.10 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.10
new file mode 100644
index 0000000000..6229a42ebf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.10
@@ -0,0 +1,102 @@
+%!PS
+%%BoundingBox: -13 -18 86 86
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000039000001
+%%EndProlog
+%%Page: 1 1
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+85.03935 0 lineto stroke
+newpath 81.09966 -0.69467 moveto
+85.03935 0 lineto
+81.09966 0.69467 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 56.6929 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 52.75362 moveto
+0 56.6929 lineto
+-0.6946 52.75362 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+56.6929 0 lineto stroke
+newpath 52.75362 -0.6946 moveto
+56.6929 0 lineto
+52.75362 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+43.42886 36.44173 lineto stroke
+newpath 40.85773 33.37752 moveto
+43.42886 36.44173 lineto
+39.96478 34.44167 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 4.2518 0 moveto
+4.2518 1.1277 3.80376 2.20908 3.00641 3.00641 curveto
+2.20908 3.80376 1.1277 4.2518 0 4.2518 curveto
+-1.1277 4.2518 -2.20908 3.80376 -3.00641 3.00641 curveto
+-3.80376 2.20908 -4.2518 1.1277 -4.2518 0 curveto
+-4.2518 -1.1277 -3.80376 -2.20908 -3.00641 -3.00641 curveto
+-2.20908 -3.80376 -1.1277 -4.2518 0 -4.2518 curveto
+1.1277 -4.2518 2.20908 -3.80376 3.00641 -3.00641 curveto
+3.80376 -2.20908 4.2518 -1.1277 4.2518 0 curveto closepath stroke
+newpath 0.99626 0 moveto
+0.99626 0.26422 0.8913 0.51764 0.70447 0.70447 curveto
+0.51764 0.8913 0.26422 0.99626 0 0.99626 curveto
+-0.26422 0.99626 -0.51764 0.8913 -0.70447 0.70447 curveto
+-0.8913 0.51764 -0.99626 0.26422 -0.99626 0 curveto
+-0.99626 -0.26422 -0.8913 -0.51764 -0.70447 -0.70447 curveto
+-0.51764 -0.8913 -0.26422 -0.99626 0 -0.99626 curveto
+0.26422 -0.99626 0.51764 -0.8913 0.70447 -0.70447 curveto
+0.8913 -0.51764 0.99626 -0.26422 0.99626 0 curveto closepath fill
+ [3 3 ] 0 setdash
+newpath 0 36.44173 moveto
+43.42886 36.44173 lineto
+43.42886 0 lineto stroke
+ [] 0 setdash
+newpath 56.6929 0 moveto
+56.6929 13.32878 51.99652 26.23135 43.42886 36.44173 curveto
+32.65703 49.2789 16.75783 56.6929 0 56.6929 curveto stroke
+newpath 17.00804 0 moveto
+17.00804 3.99867 15.59912 7.86949 13.0288 10.93263 curveto stroke
+newpath 15.76941 8.01904 moveto
+14.979 9.08745 14.06085 10.06664 13.0288 10.93263 curveto
+13.70242 9.76588 14.23032 8.53172 14.60764 7.25742 curveto
+ closepath
+gsave fill grestore stroke
+-7.8591 53.13405 moveto
+(~) cmmi10 9.96265 fshow
+-7.3114 53.13405 moveto
+(c) cmmi10 9.96265 fshow
+-13.16432 -14.88742 moveto
+(~) cmmi10 9.96265 fshow
+-12.04523 -17.51642 moveto
+(b) cmmi10 9.96265 fshow
+25.0896 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+25.7134 -10.1177 moveto
+(a) cmmi10 9.96265 fshow
+15.04314 24.88705 moveto
+(~) cmmi10 9.96265 fshow
+13.66454 22.25806 moveto
+(f) cmmi10 9.96265 fshow
+24.30934 5.6113 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.11 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.11
new file mode 100644
index 0000000000..5609021a7e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.11
@@ -0,0 +1,44 @@
+%!PS
+%%BoundingBox: -7 -7 58 57
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000000388
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 0 0 moveto
+43.42923 36.44121 lineto stroke
+newpath 0 0 moveto
+19.3903 53.27371 lineto stroke
+newpath 22.33218 3.93771 moveto
+21.64098 7.85783 19.93013 11.52698 17.37143 14.57626 curveto stroke
+newpath 20.19688 11.74487 moveto
+19.34358 12.76617 18.39877 13.71422 17.37143 14.57626 curveto
+18.04199 13.41484 18.60558 12.20084 19.05812 10.94928 curveto
+ closepath
+gsave fill grestore stroke
+newpath 17.37143 14.57626 moveto
+14.81273 17.62555 11.49652 19.94771 7.756 21.30916 curveto stroke
+newpath 11.6186 20.26982 moveto
+10.36897 20.72763 9.07674 21.07628 7.756 21.30916 curveto
+8.91743 20.6386 10.0125 19.86902 11.0302 19.01143 curveto
+ closepath
+gsave fill grestore stroke
+25.05493 11.03316 moveto
+(\013) cmmi10 9.96265 fshow
+14.67989 23.39748 moveto
+(\013) cmmi10 9.96265 fshow
+-6.9291 -6.3895 moveto
+(o) cmmi10 9.96265 fshow
+54.11514 0.27383 moveto
+(i) cmmi10 9.96265 fshow
+45.52922 27.77061 moveto
+(j) cmmi10 9.96265 fshow
+10.8901 49.81445 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.12 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.12
new file mode 100644
index 0000000000..19d0abaca6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.12
@@ -0,0 +1,119 @@
+%!PS
+%%BoundingBox: -110 -62 122 116
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 12:800a00000000000400008000538
+%*Font: cmmi7 6.97385 6.97385 78:e
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+-106.54832 -38.78087 lineto stroke
+newpath -103.08418 -36.78084 moveto
+-106.54832 -38.78087 lineto
+-102.60905 -38.08626 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+79.91124 -29.08565 lineto stroke
+newpath 75.97153 -28.39096 moveto
+79.91124 -29.08565 lineto
+76.44672 -27.08542 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+80.17596 80.17596 lineto stroke
+newpath 77.88162 76.89932 moveto
+80.17596 80.17596 lineto
+76.89932 77.88162 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-80.17596 80.17596 lineto stroke
+newpath -76.89932 77.88162 moveto
+-80.17596 80.17596 lineto
+-77.88162 76.89932 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+65.1433 -54.6626 lineto stroke
+ [] 0 setdash
+newpath 61.67879 -52.66234 moveto
+65.1433 -54.6626 lineto
+62.57185 -51.59804 lineto
+ closepath
+gsave fill grestore stroke
+-109.39528 -46.07037 moveto
+(x) cmmi10 9.96265 fshow
+62.29169 -61.9521 moveto
+(u) cmmi10 9.96265 fshow
+68.9925 -39.00415 moveto
+(O) cmmi10 9.96265 fshow
+76.8685 -39.00415 moveto
+(bs) cmmi10 9.96265 fshow
+85.81409 -40.49855 moveto
+(x) cmmi7 6.97385 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+83.17596 78.1419 moveto
+(O) cmmi10 9.96265 fshow
+91.05197 78.1419 moveto
+(bs) cmmi10 9.96265 fshow
+99.99756 76.6475 moveto
+(y) cmmi7 6.97385 fshow
+-8.0713 111.24104 moveto
+(z) cmmi10 9.96265 fshow
+-104.58806 77.4639 moveto
+(O) cmmi10 9.96265 fshow
+-96.71205 77.4639 moveto
+(bs) cmmi10 9.96265 fshow
+-87.76646 75.9695 moveto
+(z) cmmi7 6.97385 fshow
+newpath -21.30934 -7.75606 moveto
+-10.14537 -11.81946 1.87169 -14.99313 13.02846 -10.93236 curveto stroke
+newpath 9.43907 -12.69742 moveto
+10.66005 -12.19362 11.85788 -11.60818 13.02846 -10.93236 curveto
+11.69733 -11.16708 10.3715 -11.30751 9.05186 -11.36334 curveto
+ closepath
+gsave fill grestore stroke
+newpath 32.57166 -27.3313 moveto
+35.75995 -23.53171 38.25917 -19.20375 39.95563 -14.54283 curveto stroke
+newpath 39.07645 -18.4449 moveto
+39.43004 -17.16064 39.7236 -15.85858 39.95563 -14.54283 curveto
+39.2876 -15.69989 38.56639 -16.82303 37.79489 -17.90889 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 34.01608 moveto
+-9.02162 34.01608 -17.67378 30.4323 -24.05304 24.05304 curveto stroke
+newpath -21.57004 27.18929 moveto
+-22.4541 26.19843 -23.28369 25.1518 -24.05304 24.05304 curveto
+-22.95428 24.82239 -21.81677 25.52219 -20.64713 26.15092 curveto
+ closepath
+gsave fill grestore stroke
+-18.5118 41.71176 moveto
+(\022) cmmi10 9.96265 fshow
+-11.70439 -28.60692 moveto
+( ) cmmi10 9.96265 fshow
+38.36363 -29.95555 moveto
+(\036) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.13 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.13
new file mode 100644
index 0000000000..58c664d863
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.13
@@ -0,0 +1,36 @@
+%!PS
+%%BoundingBox: -50 -39 73 50
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 41:c002
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 25.48448 40.89903 moveto
+-13.43895 49.55603 lineto
+-49.46008 16.86882 lineto
+-25.61407 -14.23572 lineto
+13.92094 1.30045 lineto
+ closepath stroke
+newpath 61.91747 -12.66066 moveto
+13.92094 1.30045 lineto
+-25.61407 -14.23572 lineto
+-2.051 -37.7988 lineto
+52.04662 -36.82523 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 25.48448 40.89903 moveto
+31.95728 8.38797 lineto
+61.91747 -12.66066 lineto stroke
+newpath 13.92094 1.30045 moveto
+31.95728 8.38797 lineto stroke
+28.48448 37.49513 moveto
+(A) cmmi10 9.96265 fshow
+64.91747 -16.06456 moveto
+(B) cmmi10 9.96265 fshow
+34.05727 10.48796 moveto
+(O) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.14 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.14
new file mode 100644
index 0000000000..dfcebabfb6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.14
@@ -0,0 +1,46 @@
+%!PS
+%%BoundingBox: -47 -55 80 64
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 41:8002000010004
+%*Font: cmr7 6.97385 6.97385 31:e
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 56.6929 0 moveto
+17.5193 53.91777 lineto
+-45.86575 33.32317 lineto
+-45.86575 -33.32317 lineto
+17.5193 -53.91777 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 17.5193 53.91777 moveto
+-45.86575 -33.32317 lineto stroke
+newpath 56.6929 0 moveto
+68.79836 16.66171 lineto
+17.5193 53.91777 lineto stroke
+ [] 0 setdash
+newpath 0 0 moveto
+17.5193 -53.91777 lineto stroke
+13.7833 56.91777 moveto
+(A) cmmi10 9.96265 fshow
+71.79836 13.25781 moveto
+(O) cmmi10 9.96265 fshow
+25.3513 17.9404 moveto
+(d) cmmi10 9.96265 fshow
+30.5367 16.446 moveto
+(1) cmr7 6.97385 fshow
+-25.92802 13.8917 moveto
+(d) cmmi10 9.96265 fshow
+-20.74263 12.3973 moveto
+(2) cmr7 6.97385 fshow
+45.25882 38.88412 moveto
+(d) cmmi10 9.96265 fshow
+50.44421 37.38972 moveto
+(3) cmr7 6.97385 fshow
+11.75966 -29.10365 moveto
+(r) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.15 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.15
new file mode 100644
index 0000000000..3628966f83
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.15
@@ -0,0 +1,38 @@
+%!PS
+%%BoundingBox: -4 -12 94 55
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000003000000004
+%*Font: cmr7 6.97385 6.97385 32:c
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+82.04709 50.70752 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 45.35449 0 moveto
+45.35449 8.4288 54.22473 13.91087 61.76366 10.14134 curveto stroke
+29.26875 28.94815 moveto
+(d) cmmi10 9.96265 fshow
+34.45415 27.45375 moveto
+(2) cmr7 6.97385 fshow
+23.51904 -9.9185 moveto
+(d) cmmi10 9.96265 fshow
+28.70444 -11.4129 moveto
+(3) cmr7 6.97385 fshow
+71.46999 16.33527 moveto
+(d) cmmi10 9.96265 fshow
+76.65538 14.84087 moveto
+(3) cmr7 6.97385 fshow
+49.57056 4.19368 moveto
+(\013) cmmi10 9.96265 fshow
+85.04709 47.30362 moveto
+(B) cmmi10 9.96265 fshow
+-3.73601 -9.8078 moveto
+(A) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.16 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.16
new file mode 100644
index 0000000000..993aa4e787
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.16
@@ -0,0 +1,150 @@
+%!PS
+%%BoundingBox: -110 -56 122 116
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 12:800a000000000004000080005f8
+%*Font: cmmi7 6.97385 6.97385 78:e
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+-106.54832 -38.78087 lineto stroke
+newpath -103.08418 -36.78084 moveto
+-106.54832 -38.78087 lineto
+-102.60905 -38.08626 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+82.14182 -22.00984 lineto stroke
+newpath 78.15659 -21.66115 moveto
+82.14182 -22.00984 lineto
+78.51617 -20.31917 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+80.17596 80.17596 lineto stroke
+newpath 77.88162 76.89932 moveto
+80.17596 80.17596 lineto
+76.89932 77.88162 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-80.17596 80.17596 lineto stroke
+newpath -76.89932 77.88162 moveto
+-80.17596 80.17596 lineto
+-77.88162 76.89932 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+83.46436 -48.18889 lineto stroke
+ [] 0 setdash
+newpath 79.70563 -46.82079 moveto
+83.46436 -48.18889 lineto
+80.4002 -45.61775 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+106.54832 38.78087 lineto stroke
+ [] 0 setdash
+newpath 103.08418 36.78084 moveto
+106.54832 38.78087 lineto
+102.60905 38.08626 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+-29.34647 109.52243 lineto stroke
+ [] 0 setdash
+newpath -27.65599 105.89716 moveto
+-29.34647 109.52243 lineto
+-28.99785 105.53763 lineto
+ closepath
+gsave fill grestore stroke
+-109.39528 -46.07037 moveto
+(x) cmmi10 9.96265 fshow
+80.61275 -55.4784 moveto
+(u) cmmi10 9.96265 fshow
+71.22307 -31.92834 moveto
+(O) cmmi10 9.96265 fshow
+79.09908 -31.92834 moveto
+(bs) cmmi10 9.96265 fshow
+88.04466 -33.42274 moveto
+(x) cmmi7 6.97385 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+83.17596 78.1419 moveto
+(O) cmmi10 9.96265 fshow
+91.05197 78.1419 moveto
+(bs) cmmi10 9.96265 fshow
+99.99756 76.6475 moveto
+(y) cmmi7 6.97385 fshow
+-8.0713 111.24104 moveto
+(z) cmmi10 9.96265 fshow
+-104.58806 77.4639 moveto
+(O) cmmi10 9.96265 fshow
+-96.71205 77.4639 moveto
+(bs) cmmi10 9.96265 fshow
+-87.76646 75.9695 moveto
+(z) cmmi7 6.97385 fshow
+109.54832 36.63611 moveto
+(v) cmmi10 9.96265 fshow
+-39.74696 107.37767 moveto
+(w) cmmi10 9.96265 fshow
+newpath -21.30934 -7.75606 moveto
+-9.00943 -12.23291 4.40096 -14.11148 16.69261 -9.63763 curveto stroke
+newpath 13.13445 -11.46506 moveto
+14.3417 -10.9175 15.52881 -10.30956 16.69261 -9.63763 curveto
+15.36917 -9.87099 14.04575 -10.03627 12.72401 -10.13791 curveto
+ closepath
+gsave fill grestore stroke
+newpath 41.73218 -24.09445 moveto
+42.8361 -19.97456 43.169 -15.68611 42.7141 -11.4452 curveto stroke
+newpath 43.60097 -15.34569 moveto
+43.38118 -14.0319 43.08534 -12.72954 42.7141 -11.4452 curveto
+42.6237 -12.77907 42.45625 -14.10408 42.21346 -15.4138 curveto
+ closepath
+gsave fill grestore stroke
+newpath 21.30934 7.75606 moveto
+20.17679 10.86769 18.3764 13.69347 16.03494 16.03494 curveto stroke
+newpath 19.09639 13.46066 moveto
+18.1564 14.40456 17.1324 15.26648 16.03494 16.03494 curveto
+16.80339 14.93747 17.47086 13.7773 18.03133 12.56885 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 34.01608 moveto
+-2.97272 34.01608 -5.93262 33.62646 -8.80403 32.85707 curveto stroke
+newpath -5.08572 34.33142 moveto
+-6.35167 33.91377 -7.5933 33.42163 -8.80403 32.85707 curveto
+-7.47322 32.97351 -6.13814 33.0113 -4.8057 32.9708 curveto
+ closepath
+gsave fill grestore stroke
+-8.34605 47.58096 moveto
+(\022) cmmi10 9.96265 fshow
+-8.04022 -27.3122 moveto
+( ) cmmi10 9.96265 fshow
+52.68236 -24.51909 moveto
+(\022) cmmi10 9.96265 fshow
+30.10892 21.88089 moveto
+(\036) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.17 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.17
new file mode 100644
index 0000000000..9e187b1f7f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.17
@@ -0,0 +1,96 @@
+%!PS
+%%BoundingBox: -93 -51 122 121
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 6b:8007d
+%%EndProlog
+%%Page: 1 1
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [3 3 ] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 50.07999 62.92972 moveto
+36.41684 62.92972 22.81273 61.40129 9.35458 59.05609 curveto
+-5.27846 56.50616 -19.72882 52.99411 -33.87776 48.4729 curveto
+-45.68634 44.69954 -57.29236 40.2167 -68.03217 34.01608 curveto
+-74.78679 30.1163 -83.48495 27.2732 -83.95775 19.55927 curveto
+-84.22949 15.12558 -81.22559 11.34346 -77.38675 8.97607 curveto
+-69.35762 4.02454 -59.47366 5.10245 -50.07999 5.10245 curveto
+-36.41684 5.10245 -22.81273 6.63087 -9.35458 8.97607 curveto
+5.27846 11.526 19.72882 15.03806 33.87776 19.55927 curveto
+45.68634 23.33263 57.29236 27.81546 68.03217 34.01608 curveto
+74.78679 37.91586 83.48495 40.75897 83.95775 48.4729 curveto
+84.22949 52.90659 81.22559 56.6887 77.38675 59.05609 curveto
+69.35762 64.00763 59.47366 62.92972 50.07999 62.92972 curveto stroke
+ [] 0 setdash
+newpath 54.01132 63.66803 moveto
+52.697 63.41296 51.38556 63.15993 50.07999 62.92972 curveto
+51.38556 62.69951 52.70445 62.48877 54.02676 62.27893 curveto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+-25.04 -14.45682 lineto stroke
+newpath -21.97597 -11.88579 moveto
+-25.04 -14.45682 lineto
+-21.28142 -13.08879 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+34.01608 0 lineto stroke
+newpath 30.07712 -0.69453 moveto
+34.01608 0 lineto
+30.07712 0.69453 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 34.01608 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.69453 30.07712 moveto
+0 34.01608 lineto
+-0.69453 30.07712 lineto
+ closepath
+gsave fill grestore stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0 0 moveto
+-83.46582 -48.18889 lineto stroke
+newpath -80.40158 -45.61774 moveto
+-83.46582 -48.18889 lineto
+-79.707 -46.8208 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+113.3858 0 lineto stroke
+newpath 109.44652 -0.6946 moveto
+113.3858 0 lineto
+109.44652 0.6946 lineto
+ closepath
+gsave fill grestore stroke
+ 0.3985 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 113.3858 lineto stroke
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 109.44652 moveto
+0 113.3858 lineto
+-0.6946 109.44652 lineto
+ closepath
+gsave fill grestore stroke
+-92.15971 -50.33365 moveto
+(x) cmmi10 9.96265 fshow
+116.3858 -1.17616 moveto
+(y) cmmi10 9.96265 fshow
+-2.53566 116.3858 moveto
+(z) cmmi10 9.96265 fshow
+-24.3139 -23.67451 moveto
+(~) cmmi10 9.96265 fshow
+-22.94 -23.67451 moveto
+({) cmmi10 9.96265 fshow
+31.58937 -10.1177 moveto
+(~) cmmi10 9.96265 fshow
+32.10307 -10.1177 moveto
+(|) cmmi10 9.96265 fshow
+-9.007 31.77168 moveto
+(~) cmmi10 9.96265 fshow
+-8.5002 29.14268 moveto
+(k) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.2 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.2
new file mode 100644
index 0000000000..f68d9f9066
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.2
@@ -0,0 +1,53 @@
+%!PS
+%%BoundingBox: -1 -17 61 47
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+49.09764 0 lineto
+32.73126 46.28975 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 39.27826 0 moveto
+39.27826 4.16127 41.90115 7.8707 45.82442 9.25781 curveto stroke
+9.95424 25.24487 moveto
+(c) cmmi10 9.96265 fshow
+15.93953 -13.4138 moveto
+(c) cmmi10 9.96265 fshow
+21.44643 -3.6775 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop 0 setlinecap
+newpath 27.99133 -3.5081 moveto
+31.96263 -3.5081 lineto stroke
+27.99133 -9.4912 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 21.44643 -10.9231 moveto
+31.96263 -10.9231 lineto stroke
+24.71893 -16.8493 moveto
+(2) cmr7 6.97385 fshow
+43.01443 28.68037 moveto
+(c) cmmi10 9.96265 fshow
+48.52133 38.41667 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 55.06624 38.58607 moveto
+59.03754 38.58607 lineto stroke
+55.06624 32.60298 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 48.52133 31.17108 moveto
+59.03754 31.17108 lineto stroke
+51.79384 25.24487 moveto
+(2) cmr7 6.97385 fshow
+29.52663 9.42769 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.3 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.3
new file mode 100644
index 0000000000..b13832daba
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.3
@@ -0,0 +1,55 @@
+%!PS
+%%BoundingBox: -6 -8 62 41
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 48:8000001
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+28.34645 40.08789 lineto
+ closepath stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 28.34645 40.08789 moveto
+28.34645 0 lineto stroke
+-5.14536 25.57944 moveto
+(c) cmmi10 9.96265 fshow
+0.36154 35.31573 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 6.90645 35.48514 moveto
+10.87775 35.48514 lineto stroke
+6.90645 29.50204 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 0.36154 28.07014 moveto
+10.87775 28.07014 lineto stroke
+3.63405 22.14394 moveto
+(2) cmr7 6.97385 fshow
+44.61966 25.57944 moveto
+(c) cmmi10 9.96265 fshow
+50.12656 35.31573 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 56.67146 35.48514 moveto
+60.64276 35.48514 lineto stroke
+56.67146 29.50204 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 50.12656 28.07014 moveto
+60.64276 28.07014 lineto stroke
+53.39906 22.14394 moveto
+(2) cmr7 6.97385 fshow
+31.34645 16.64005 moveto
+(H) cmmi10 9.96265 fshow
+26.19075 -7.2895 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.4 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.4
new file mode 100644
index 0000000000..f318a6c6b4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.4
@@ -0,0 +1,32 @@
+%!PS
+%%BoundingBox: -1 -3 85 60
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 63:c4
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+55.8313 9.84444 lineto
+84.178 58.94121 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 0 0 moveto
+34.52216 17.60036 lineto
+84.178 58.94121 lineto stroke
+newpath 55.8313 9.84444 moveto
+34.52216 17.60036 lineto stroke
+ [3 3 ] 0 setdash
+newpath 0 0 moveto
+45.17673 13.7224 lineto
+84.178 58.94121 lineto stroke
+34.80362 31.5706 moveto
+(d) cmmi10 9.96265 fshow
+25.75995 -2.36728 moveto
+(c) cmmi10 9.96265 fshow
+19.7183 9.8612 moveto
+(h) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.5 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.5
new file mode 100644
index 0000000000..cc2e27a6e0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.5
@@ -0,0 +1,32 @@
+%!PS
+%%BoundingBox: -47 -55 57 55
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 63:c001
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 56.6929 0 moveto
+17.5193 53.91777 lineto
+-45.86575 33.32317 lineto
+-45.86575 -33.32317 lineto
+17.5193 -53.91777 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 56.6929 0 moveto
+-45.86575 33.32317 lineto stroke
+ [] 0 setdash
+newpath 0 0 moveto
+-45.86575 -33.32317 lineto stroke
+39.20609 29.05888 moveto
+(c) cmmi10 9.96265 fshow
+-16.32893 46.62047 moveto
+(c) cmmi10 9.96265 fshow
+7.51357 18.76158 moveto
+(d) cmmi10 9.96265 fshow
+-29.80437 -14.5616 moveto
+(r) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.6 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.6
new file mode 100644
index 0000000000..5fe2d2ad16
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.6
@@ -0,0 +1,58 @@
+%!PS
+%%BoundingBox: -1 -17 100 39
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:8002000000002
+%*Font: cmsy7 6.97385 6.97385 70:8
+%*Font: cmr7 6.97385 6.97385 32:c
+%*Font: cmr10 9.96265 9.96265 28:c024000000000010011
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+98.9496 37.79556 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 45.35449 0 moveto
+45.35449 10.4087 58.20499 15.31717 65.14412 7.55899 curveto stroke
+3.64642 23.48848 moveto
+(2) cmr10 9.96265 fshow
+10.28812 23.48848 moveto
+(cos\() cmr10 9.96265 fshow
+27.50142 23.48848 moveto
+(\031) cmmi10 9.96265 fshow
+33.53783 23.48848 moveto
+(=) cmmi10 9.96265 fshow
+38.51912 23.48848 moveto
+(5\)) cmr10 9.96265 fshow
+23.08835 -3.6775 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop 0 setlinecap
+newpath 29.63326 -3.5081 moveto
+33.60455 -3.5081 lineto stroke
+29.63326 -9.4912 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 23.08835 -10.9231 moveto
+33.60455 -10.9231 lineto stroke
+26.36086 -16.8493 moveto
+(2) cmr7 6.97385 fshow
+81.11674 16.12029 moveto
+(p) cmsy7 6.97385 fshow
+ 0 0.3387 dtransform truncate idtransform setlinewidth pop
+newpath 87.66165 16.28969 moveto
+91.63295 16.28969 lineto stroke
+87.66165 10.3066 moveto
+(3) cmr7 6.97385 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop
+newpath 81.11674 8.8747 moveto
+91.63295 8.8747 lineto stroke
+84.38925 2.94849 moveto
+(2) cmr7 6.97385 fshow
+51.68338 2.57968 moveto
+(\013) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.7 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.7
new file mode 100644
index 0000000000..31bff4da78
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.7
@@ -0,0 +1,35 @@
+%!PS
+%%BoundingBox: -8 -9 78 53
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 0b:80000000000000000000008308
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+56.6929 0 lineto
+34.97847 18.22087 lineto
+ closepath stroke
+ [3 3 ] 0 setdash 1 setlinecap
+newpath 0 0 moveto
+45.83568 9.11044 lineto
+75.09138 45.55219 lineto stroke
+newpath 45.83568 9.11044 moveto
+68.75352 13.66566 lineto stroke
+ [] 0 setdash
+newpath 57.2946 11.38806 moveto
+57.2946 14.34955 55.87602 17.22853 53.1496 18.22089 curveto stroke
+65.54852 16.66566 moveto
+(\013) cmmi10 9.96265 fshow
+-7.8291 -2.14476 moveto
+(o) cmmi10 9.96265 fshow
+28.20547 22.25806 moveto
+(j) cmmi10 9.96265 fshow
+58.7929 -8.6706 moveto
+(i) cmmi10 9.96265 fshow
+72.93568 48.55219 moveto
+(c) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.8 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.8
new file mode 100644
index 0000000000..d0189cc6ed
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.8
@@ -0,0 +1,157 @@
+%!PS
+%%BoundingBox: -25 -25 306 150
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 4f:800014224c6
+%*Font: cmr10 9.96265 9.96265 61:a8d75
+%*Font: cmmi7 6.97385 6.97385 69:e1
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+%%EndProlog
+%%Page: 1 1
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 45.35449 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 41.4152 moveto
+0 45.35449 lineto
+-0.6946 41.4152 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+35.96683 -16.77173 lineto stroke
+newpath 32.10292 -15.7364 moveto
+35.96683 -16.77173 lineto
+32.69005 -14.47731 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+53.27417 19.39043 lineto stroke
+newpath 49.81003 17.3904 moveto
+53.27417 19.39043 lineto
+49.3349 18.69582 lineto
+ closepath
+gsave fill grestore stroke
+newpath 159.82251 148.88026 moveto
+159.82251 58.17128 lineto
+231.75616 24.62782 lineto stroke
+ [3 3 ] 0 setdash
+newpath 53.27417 19.39043 moveto
+159.82251 58.17128 lineto stroke
+newpath 0 0 moveto
+267.72299 143.91957 lineto stroke
+ [0 5 ] 2.5 setdash
+newpath 187.40527 100.74326 moveto
+159.8223 113.60522 lineto stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 187.40527 100.74326 moveto
+187.40549 45.30931 lineto stroke
+147.3327 112.88567 moveto
+(y) cmmi10 9.96265 fshow
+152.21721 111.39127 moveto
+(p) cmmi7 6.97385 fshow
+182.25598 38.0198 moveto
+(x) cmmi10 9.96265 fshow
+187.94987 36.5254 moveto
+(p) cmmi7 6.97385 fshow
+-24.0194 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-18.49089 24.57285 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 24.57285 moveto
+(!) cmsy10 9.96265 fshow
+-24.0194 17.82045 moveto
+(O) cmmi10 9.96265 fshow
+-16.14339 17.82045 moveto
+(bs) cmmi10 9.96265 fshow
+-7.1978 16.32605 moveto
+(j) cmmi7 6.97385 fshow
+-5.83998 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+0.04042 -16.29745 moveto
+(\000) cmsy10 9.96265 fshow
+5.92082 -16.29745 moveto
+(!) cmsy10 9.96265 fshow
+-5.83998 -23.04985 moveto
+(O) cmmi10 9.96265 fshow
+2.03603 -23.04985 moveto
+(bs) cmmi10 9.96265 fshow
+10.98161 -24.54425 moveto
+(k) cmmi7 6.97385 fshow
+28.73708 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+33.82507 1.78363 moveto
+(\000) cmsy10 9.96265 fshow
+38.91287 1.78363 moveto
+(!) cmsy10 9.96265 fshow
+28.73708 -4.96877 moveto
+(O) cmmi10 9.96265 fshow
+36.61308 -4.96877 moveto
+(bs) cmmi10 9.96265 fshow
+45.55867 -6.46317 moveto
+(i) cmmi7 6.97385 fshow
+75.05598 12.73616 moveto
+(O) cmmi10 9.96265 fshow
+82.93199 12.73616 moveto
+(bs) cmmi10 9.96265 fshow
+ 0 0.3985 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 0 setlinecap
+newpath 92.47539 12.93536 moveto
+95.46419 12.93536 lineto stroke
+95.46419 12.73616 moveto
+(dist) cmmi10 9.96265 fshow
+184.89902 93.45375 moveto
+(p) cmmi10 9.96265 fshow
+270.72299 141.77481 moveto
+(m) cmmi10 9.96265 fshow
+newpath 188.40154 100.74326 moveto
+188.40154 101.00748 188.29657 101.2609 188.10974 101.44772 curveto
+187.92291 101.63455 187.6695 101.73952 187.40527 101.73952 curveto
+187.14105 101.73952 186.88763 101.63455 186.7008 101.44772 curveto
+186.51398 101.2609 186.40901 101.00748 186.40901 100.74326 curveto
+186.40901 100.47903 186.51398 100.22562 186.7008 100.03879 curveto
+186.88763 99.85196 187.14105 99.747 187.40527 99.747 curveto
+187.6695 99.747 187.92291 99.85196 188.10974 100.03879 curveto
+188.29657 100.22562 188.40154 100.47903 188.40154 100.74326 curveto closepath
+ fill
+newpath 268.71925 143.91957 moveto
+268.71925 144.18379 268.61429 144.43721 268.42746 144.62404 curveto
+268.24063 144.81087 267.98721 144.91583 267.72299 144.91583 curveto
+267.45877 144.91583 267.20535 144.81087 267.01852 144.62404 curveto
+266.8317 144.43721 266.72673 144.18379 266.72673 143.91957 curveto
+266.72673 143.65535 266.8317 143.40193 267.01852 143.2151 curveto
+267.20535 143.02827 267.45877 142.92331 267.72299 142.92331 curveto
+267.98721 142.92331 268.24063 143.02827 268.42746 143.2151 curveto
+268.61429 143.40193 268.71925 143.65535 268.71925 143.91957 curveto closepath
+ fill
+newpath 188.40175 45.30931 moveto
+188.40175 45.57353 188.29678 45.82695 188.10995 46.01378 curveto
+187.92313 46.2006 187.66971 46.30557 187.40549 46.30557 curveto
+187.14127 46.30557 186.88785 46.2006 186.70102 46.01378 curveto
+186.51419 45.82695 186.40923 45.57353 186.40923 45.30931 curveto
+186.40923 45.04509 186.51419 44.79167 186.70102 44.60484 curveto
+186.88785 44.41801 187.14127 44.31305 187.40549 44.31305 curveto
+187.66971 44.31305 187.92313 44.41801 188.10995 44.60484 curveto
+188.29678 44.79167 188.40175 45.04509 188.40175 45.30931 curveto closepath fill
+newpath 160.81856 113.60522 moveto
+160.81856 113.86945 160.7136 114.12286 160.52676 114.3097 curveto
+160.33994 114.49652 160.08652 114.60149 159.8223 114.60149 curveto
+159.55807 114.60149 159.30466 114.49652 159.11783 114.3097 curveto
+158.931 114.12286 158.82603 113.86945 158.82603 113.60522 curveto
+158.82603 113.341 158.931 113.08759 159.11783 112.90076 curveto
+159.30466 112.71393 159.55807 112.60896 159.8223 112.60896 curveto
+160.08652 112.60896 160.33994 112.71393 160.52676 112.90076 curveto
+160.7136 113.08759 160.81856 113.341 160.81856 113.60522 curveto closepath fill
+-18.92159 -9.0185 moveto
+(O) cmmi10 9.96265 fshow
+-11.04558 -9.0185 moveto
+(bs) cmmi10 9.96265 fshow
+234.75616 22.13716 moveto
+(pro) cmr10 9.96265 fshow
+249.72786 22.13716 moveto
+(jection) cmr10 9.96265 fshow
+282.10646 22.13716 moveto
+(plane) cmr10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.9 b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.9
new file mode 100644
index 0000000000..28105fb8c6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.9
@@ -0,0 +1,91 @@
+%!PS
+%%BoundingBox: -23 -6 112 86
+%%Creator: MetaPost
+%%CreationDate: 1997.04.22:2242
+%%Pages: 1
+%*Font: cmmi10 9.96265 9.96265 61:81802504
+%*Font: cmsy10 9.96265 9.96265 00:800000004
+%%EndProlog
+%%Page: 1 1
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+111.6626 19.68887 lineto stroke
+newpath 107.90381 18.32079 moveto
+111.6626 19.68887 lineto
+107.66257 19.68886 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 85.03935 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath 0.69467 81.09966 moveto
+0 85.03935 lineto
+-0.69467 81.09966 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 38.19089 lineto stroke
+newpath 52.97243 35.39383 moveto
+55.8313 38.19089 lineto
+52.18819 36.54028 lineto
+ closepath
+gsave fill grestore stroke
+ [3 3 ] 0 setdash
+newpath 0 28.34645 moveto
+55.8313 38.19089 lineto stroke
+ [] 0 setdash
+newpath 52.07251 36.8228 moveto
+55.8313 38.19089 lineto
+51.83127 38.19087 lineto
+ closepath
+gsave fill grestore stroke
+ 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth
+ [3 3 ] 0 setdash
+newpath 55.8313 9.84444 moveto
+55.8313 38.19089 lineto stroke
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+newpath 56.5259 34.2516 moveto
+55.8313 38.19089 lineto
+55.1367 34.2516 lineto
+ closepath
+gsave fill grestore stroke
+ 0.99626 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 0 moveto
+0 28.34645 lineto stroke
+ 0 0.99626 dtransform truncate idtransform setlinewidth pop
+newpath 0.6946 24.40717 moveto
+0 28.34645 lineto
+-0.6946 24.40717 lineto
+ closepath
+gsave fill grestore stroke
+newpath 0 0 moveto
+55.8313 9.84444 lineto stroke
+newpath 52.07251 8.47635 moveto
+55.8313 9.84444 lineto
+51.83127 9.84442 lineto
+ closepath
+gsave fill grestore stroke
+-22.0623 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-17.5124 56.98946 moveto
+(\000) cmsy10 9.96265 fshow
+-12.9626 56.98946 moveto
+(!) cmsy10 9.96265 fshow
+-22.0623 50.58485 moveto
+(axis) cmmi10 9.96265 fshow
+-9.4037 11.92883 moveto
+(~) cmmi10 9.96265 fshow
+-8.7401 9.29984 moveto
+(h) cmmi10 9.96265 fshow
+24.6588 -5.19548 moveto
+(~) cmmi10 9.96265 fshow
+25.2826 -5.19548 moveto
+(a) cmmi10 9.96265 fshow
+20.24216 21.19543 moveto
+(~) cmmi10 9.96265 fshow
+20.62906 21.19543 moveto
+(v) cmmi10 9.96265 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.log b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.log
new file mode 100644
index 0000000000..8ad636be6d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.log
@@ -0,0 +1,5 @@
+This is MetaPost, Version 0.63 (C version 6.1) (mem=plain 95.4.24) 22 APR 1997 22:42
+**&plain vect-fig
+(vect-fig.mp [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]
+[16] [17] )
+17 output files written: vect-fig.1 .. vect-fig.17
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.mp
new file mode 100644
index 0000000000..ecb98f971e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/doc/vect-fig.mp
@@ -0,0 +1,350 @@
+% Figures for the illustration of the metapost packages `3d.mp' and `poly.mp'
+% Metapost
+% Denis Roegel (roegel@loria.fr), 21,23,24,25,26,27/2/1997
+% 11/3/1997
+% 21/3/1997 (figure 17)
+% 22/4/1997 (figure 10)
+
+numeric u;
+u=2cm;
+
+ahangle:=20;
+
+
+beginfig(1);
+z1=origin;
+z2-z1=(u,0);z4=.5[z1,z2];z3-z1=(z2-z1) rotated 60;
+draw z1--z2--z3--cycle;draw z3--z4 dashed evenly;
+label.ulft(btex $c$ etex,.5[z1,z3]);
+label.rt(btex $h$ etex,.5[z3,z4]);
+label.bot(btex $c$ etex,z4);
+label.urt(btex $c$ etex,.5[z2,z3]);
+endfig;
+
+beginfig(2);
+numeric cosan,sinan,an;
+z1=origin;
+sinan=1/sqrt(3);cosan=sqrt(1-sinan**2);
+an=2*angle((cosan,sinan));
+z2-z1=(u*sqrt(3)/2,0);
+z3-z2=(z1-z2) rotated (-an);
+draw z1--z2--z3--cycle;
+draw .2[z2,z1]{up}..{dir(90-an)}(.2[z2,z3]);
+label.ulft(btex $c$ etex,.5[z1,z3]);
+label.bot(btex $c{\sqrt{3}\over2}$ etex,.5[z1,z2]);
+label.urt(btex $c{\sqrt{3}\over2}$ etex,.5[z2,z3]);
+label(btex $\alpha$ etex,.5[z2,.5[z1,z3]]);
+endfig;
+
+beginfig(3);
+z1=origin;
+z2-z1=(u,0);z4=.5[z1,z2];z3=(.5u,u/sqrt(2));
+draw z1--z2--z3--cycle;draw z3--z4 dashed evenly;
+label.ulft(btex $c{\sqrt{3}\over2}$ etex,.5[z1,z3]);
+label.urt(btex $c{\sqrt{3}\over2}$ etex,.5[z2,z3]);
+label.rt(btex $H$ etex,.5[z3,z4]);
+label.bot(btex $c$ etex,z4);
+endfig;
+
+beginfig(4);
+z1=origin;
+z2-z1=(u,0) rotated 10;
+z3-z2=(z2-z1) rotated 50; % angle sans signification
+z4-z2=(.4(z2-z1)) rotated 150;
+z5=.5[z2,z4];
+draw z1--z2--z3--cycle;draw z1--z4--z3;
+draw z2--z4;draw z1--z5--z3 dashed evenly;
+label.ulft(btex $d$ etex,.5[z1,z3]);
+label.bot(btex $c$ etex,.5[z1,z2]);
+label.top(btex $h$ etex,.5[z1,z5]);
+endfig;
+
+beginfig(5);
+z0=origin;
+z1=u*dir(0);z2=u*dir(72);z3=u*dir(2*72);z4=u*dir(3*72);z5=u*dir(4*72);
+draw z1--z2--z3--z4--z5--cycle;
+draw z1--z3 dashed evenly;
+draw z0--z4;
+label.urt(btex $c$ etex,.5[z1,z2]);
+label.top(btex $c$ etex,.5[z2,z3]);
+label.urt(btex $d$ etex,.5[z1,z3]);
+label.ulft(btex $r$ etex,.5[z0,z4]);
+endfig;
+
+beginfig(6);
+numeric cosan,sinan,an;
+z1=origin;
+z2-z1=(u,0);
+cosan=1-8/3*(cosd(36)**2);
+sinan=sqrt(1-cosan**2);
+an=angle((cosan,sinan));
+z3-z2=(z2-z1) rotated (180-an);
+draw z1--z2--z3--cycle;
+draw (.2[z2,z1]){up}..{dir(90-an)}(.2[z2,z3]);
+label.ulft(btex $2\cos(\pi/5)$ etex,.5[z1,z3]);
+label.bot(btex $\sqrt{3}\over 2$ etex,.5[z1,z2]);
+label.lrt(btex $\sqrt{3}\over 2$ etex,.5[z2,z3]);
+label(btex $\alpha$ etex,.25[z2,.5[z1,z3]]);
+endfig;
+
+beginfig(7);
+numeric a,b;
+z1=origin;
+z2-z1=(u,0);
+z4-z2=(.5(z2-z1)) rotated 140;
+z5=.5[z2,z4];
+z3-z5=(z5-z1) rotated 40; % angle sans signification
+z6-z5=.5(z5-z1);
+a=angle(z3-z5);b=angle(z6-z5);
+z7-z5=(.5[z5,z6]-z5) rotated (a-b);
+draw z1--z2--z4--cycle;
+draw z1--z5--z3 dashed evenly;
+draw z5--z6 dashed evenly;
+draw (.5[z5,z6]){up}..{dir(90+70)}z7;
+label.top(btex $\alpha$ etex,z6);
+label.lft(btex $o$ etex,z1);
+label.ulft(btex $j$ etex,z4);
+label.lrt(btex $i$ etex,z2);
+label.top(btex $c$ etex,z3);
+endfig;
+
+beginfig(8);
+z1=origin;
+z9-z1=(u,0) rotated 20;
+z2-z1=(.7u,0) rotated -25;
+z3-z1=(0,.8u);z4-z1=3*(z9-z1);
+z6-z4=2*(z3-z1);z5-z4=2*(z2-z1);
+z8-z4=1.5(z6-z4+z5-z4);
+z7-z1=.7(z8-z1);
+z7-z13=z5-z4;z7-z12=z6-z4;
+z11=(z7--z13) intersectionpoint (z4--z6);
+z10=(z7--z12) intersectionpoint (z4--z5);
+drawarrow z1--z3;drawarrow z1--z2;drawarrow z1--z9;
+draw z6--z4--z5;
+draw z9--z4 dashed evenly;
+draw z1--z8 dashed evenly;
+draw z7--z11 dashed withdots;
+draw z7--z10 dashed withdots;
+label.lft(btex $y_p$etex,z11);
+label.bot(btex $x_p$etex,z10);
+label.lft(btex $\overrightarrow{Obs_j}$ etex,.5[z1,z3]);
+label.llft(btex $\overrightarrow{Obs_k}$ etex,.5[z1,z2]);
+label.lrt(btex $\overrightarrow{Obs_i}$ etex,.5[z1,z9]);
+label.bot(btex $Obs\_dist$ etex,.5[z1,z10]);
+label.bot(btex $p$ etex,z7);
+label.rt(btex $m$ etex,z8);
+pickup pencircle scaled 2pt;
+drawdot(z7);drawdot(z8);drawdot(z10);drawdot(z11);
+pickup pencircle scaled 0.4pt;
+label.llft(btex $Obs$ etex,z1);
+label.rt(btex projection plane etex,z5);
+endfig;
+
+% 23/2/1997
+beginfig(9);
+z1=origin;
+z2=(u,0) rotated 10;
+z3-z2=z2-z1;
+z4-z1=(0,.5u);z6-z4=2*(z4-z1);
+z5-z2=z4-z1;
+drawarrow z1--z3;drawarrow z1--z6;
+drawarrow z1--z5;
+drawarrow z4--z5 dashed evenly;
+drawarrow z2--z5 dashed evenly;
+pickup pencircle scaled 1pt;
+drawarrow z1--z4;drawarrow z1--z2;
+pickup pencircle scaled 0.4pt;
+label.lft(btex $\overrightarrow{axis}$ etex,.5[z4,z6]);
+label.lft(btex $\vec{h}$ etex,.5[z1,z4]);
+label.bot(btex $\vec{a}$ etex,.5[z1,z2]);
+label.ulft(btex $\vec{v}$ etex,.5[z1,z5]);
+endfig;
+
+% 23/2/1997
+beginfig(10);
+z1=origin;
+z2-z1=(u,0);z4-z1=(0,u);z3-z1=(z2-z1) rotated 40;
+z5-z2=.5(z2-z1);z6-z4=.5(z4-z1);
+z7=(x1,y3);z8=(x3,y1);
+drawarrow z1--z6;drawarrow z1--z5;
+pickup pencircle scaled 1pt;
+drawarrow z1--z4;drawarrow z1--z2;drawarrow z1--z3;
+pickup pencircle scaled 0.4pt;
+draw fullcircle scaled .15u shifted z1;
+pickup pencircle scaled 2pt;
+drawdot(z1);
+pickup pencircle scaled 0.4pt;
+draw z7--z3--z8 dashed evenly;
+draw z2{up}..z3{dir(90+40)}..{left}z4;
+drawarrow (.3z2){up}..(.3z3){dir(90+40)};
+label.lft(btex $\vec{c}$ etex,z4);
+label.llft(btex $\vec{b}$ etex,z1+(-.1u,-.1u));
+label.bot(btex $\vec{a}$ etex,.5[z1,z2]);
+label.ulft(btex $\vec{f}$ etex,.5[z1,z3]);
+label.rt(btex $\alpha$ etex,.4u*dir(20));
+endfig;
+
+% 24/2/1997
+beginfig(11);
+z1=origin;
+z2-z1=(u,0) rotated 10;
+z3-z1=(z2-z1) rotated 30;
+z4-z1=(z3-z1) rotated 30;
+draw z1--z2;draw z1--z3;draw z1--z4;
+drawarrow (.4z2){dir(90+10)}..(.4z3){dir(90+40)};
+drawarrow (.4z3){dir(90+40)}..(.4z4){dir(90+70)};
+label(btex $\alpha$ etex,.55u*dir(25));
+label(btex $\alpha$ etex,.55u*dir(55));
+label.llft(btex $o$ etex,z1);
+label.bot(btex $i$ etex,z2);
+label.lrt(btex $j$ etex,z3);
+label.lft(btex $k$ etex,z4);
+endfig;
+
+% 24/2/1997
+% Euler angles
+beginfig(12);
+z1=origin;
+z5-z1=(2u,0);z7-z1=(0,2u);z1-z2=2u*unitvector(dir(20));
+z3-z1=1.5u*unitvector(dir(-40));
+z4-z1=1.5u*unitvector(dir(-20));
+z6-z1=2u*unitvector(dir(45));
+z8-z1=2u*unitvector(dir(135));
+drawarrow z1--z2;drawarrow z1--z5;drawarrow z1--z7;
+drawarrow z1--z4;drawarrow z1--z6;drawarrow z1--z8;
+drawarrow z1--z3 dashed evenly;
+label.bot(btex $x$ etex,z2);
+label.bot(btex $u$ etex,z3);
+label.bot(btex $Obs_x$ etex,z4);
+label.rt(btex $y$ etex,z5);
+label.rt(btex $Obs_y$ etex,z6);
+label.lft(btex $z$ etex,z7);
+label.lft(btex $Obs_z$ etex,z8);
+drawarrow (.2[z1,z2]){dir(-20)}..{dir(90-70)}(.2[z1,z3]);
+drawarrow (.5[z1,z3]){dir(90-40)}..{dir(90-20)}(.5[z1,z4]);
+drawarrow (.3[z1,z7]){dir(180)}..{dir(135+90)}(.3[z1,z8]);
+label.top(btex $\theta$ etex,.4[z1,.5[z7,z8]]);
+label.bot(btex $\psi$ etex,.4[z1,.5[z2,z3]]);
+label.lrt(btex $\phi$ etex,.5[z1,.5[z3,z4]]);
+endfig;
+
+def ellipse_point(expr a,b,c,an)=
+ c+(a*cosd(an)+b*sind(an))
+ enddef;
+
+% 25/2/1997
+beginfig(13);
+save a,b;
+numeric v;
+v=.5u;
+pair a,b;
+z0=origin;z1-z0=(v,0) rotated -45;z2-z0=(v,0) rotated 120;
+z3-z1=(1.5v,0) rotated 10;z4-z2=(z3-z1) rotated 20;
+a=z3-z1;b=z0-z1;
+for i:=0 upto 4: z[10+i]=ellipse_point(a,b,z1,i*72);endfor;
+a:=z4-z2;b:=z2-z0;
+for i:=0 upto 4: z[20+i]=ellipse_point(a,b,.8[z0,z2],i*72);endfor;
+draw z20--z21--z22--z12--z11--cycle;
+draw z10--z11--z12--z13--z14--cycle;
+z5=(z12--(z12+3*(z11-z12))) intersectionpoint (z10--(z10+3*(z0-z1)));
+z6=.9[z12,z5]; % 20/3/1997
+draw z20--z6--z10 dashed evenly;
+draw z11--z6 dashed evenly;
+label.rt(btex $A$ etex,z20);
+label.rt(btex $B$ etex,z10);
+label.urt(btex $O$ etex,z6);
+endfig;
+
+% 25/2/1997
+beginfig(14);
+z0=origin;
+z1=u*dir(0);z2=u*dir(72);z3=u*dir(2*72);z4=u*dir(3*72);z5=u*dir(4*72);
+z6=(z5--(z5+2*(z1-z5))) intersectionpoint (z2--(z2+2*(.5[z1,z5]-z0)));
+draw z1--z2--z3--z4--z5--cycle;
+draw z2--z4 dashed evenly;
+draw z1--z6--z2 dashed evenly;
+draw z0--z5;
+label.top(btex $A$ etex,z2);
+label.rt(btex $O$ etex,z6);
+label.llft(btex $d_1$ etex,.5[z1,z2]);
+label.ulft(btex $d_2$ etex,.5[z2,z4]);
+label.urt(btex $d_3$ etex,.5[z2,z6]);
+label.rt(btex $r$ etex,.5[z0,z5]);
+endfig;
+
+% 25/2/1997
+beginfig(15);
+numeric cosan,sinan,an;
+z1=origin;
+z2-z1=(u,0);
+cosan=-cosd(72)/(2*sind(36)*sind(36));
+sinan=sqrt(1/(sind(36)**2)*(1-1/(4*(sind(36)**2))));
+an=180-angle((cosan,sinan));
+z3-z2=(z2-z1) rotated an;
+draw z1--z2--z3--cycle;
+draw (.2[z2,z1]){up}..{dir(an-90)}(.2[z2,z3]);
+label.ulft(btex $d_2$ etex,.5[z1,z3]);
+label.bot(btex $d_3$ etex,.5[z1,z2]);
+label.lrt(btex $d_3$ etex,.5[z2,z3]);
+label(btex $\alpha$ etex,.25[z2,.5[z1,z3]]);
+label.rt(btex $B$ etex,z3);
+label.bot(btex $A$ etex,z1);
+endfig;
+
+% 27/2/1997
+%
+beginfig(16);
+z1=origin;
+z5-z1=(2u,0);z7-z1=(0,2u);z1-z2=2u*unitvector(dir(20));
+z3-z1=1.7u*unitvector(dir(-30));
+z4-z1=1.5u*unitvector(dir(-15));
+z6-z1=2u*unitvector(dir(45));
+z8-z1=2u*unitvector(dir(135));
+z9-z1=2u*unitvector(dir(20));
+z10-z1=2u*unitvector(dir(105));
+drawarrow z1--z2;drawarrow z1--z5;drawarrow z1--z7;
+drawarrow z1--z4;drawarrow z1--z6;drawarrow z1--z8;
+drawarrow z1--z3 dashed evenly;
+drawarrow z1--z9 dashed evenly;
+drawarrow z1--z10 dashed evenly;
+label.bot(btex $x$ etex,z2);
+label.bot(btex $u$ etex,z3);
+label.bot(btex $Obs_x$ etex,z4);
+label.rt(btex $y$ etex,z5);
+label.rt(btex $Obs_y$ etex,z6);
+label.lft(btex $z$ etex,z7);
+label.lft(btex $Obs_z$ etex,z8);
+label.rt(btex $v$ etex,z9);
+label.lft(btex $w$ etex,z10);
+drawarrow (.2[z1,z2]){dir(-20)}..{dir(90-70)}(.2[z1,z3]);
+drawarrow (.5[z1,z3]){dir(75)}..(.52[z1,z4]);
+drawarrow (.2[z1,z9]){dir(90+20)}..{dir(90+45)}(.2[z1,z6]);
+drawarrow (.3[z1,z7]){dir(180)}..{dir(105+90)}(.3[z1,z10]);
+label.top(btex $\theta$ etex,.4[z1,.5[z7,z10]]);
+label.bot(btex $\psi$ etex,.4[z1,.5[z2,z3]]);
+label.rt(btex $\theta$ etex,.6[z1,.5[z3,z4]]);
+label.urt(btex $\phi$ etex,.3[z1,.5[z6,z9]]);
+endfig;
+
+% 21/3/1997
+beginfig(17);
+z0=origin;z2-z0=(2u,0);z0-z1=(1.7u,0) rotated 30;
+z3-z0=(0,2u);z4=.3[z0,z1];z5=.3[z0,z2];z6=.3[z0,z3];
+for i:=0 upto 11:
+ z[10+i]=2*cosd(i*30)*(z0-z4)+2*sind(i*30)*(z0-z5)+z6;
+ endfor;
+pickup pencircle scaled 1pt;
+drawarrow z10{left}..z11..z12..z13{z4-z0}..z14..z15..z16{right}
+ ..z17..z18..z19{z0-z4}..z20..z21..z10{left} dashed evenly;
+drawarrow z0--z4;drawarrow z0--z5;drawarrow z0--z6;
+pickup pencircle scaled .4pt;
+drawarrow z0--z1;drawarrow z0--z2;drawarrow z0--z3;
+label.lft(btex $x$ etex,z1);
+label.rt(btex $y$ etex,z2);
+label.top(btex $z$ etex,z3);
+label.lrt(btex $\vec\imath$ etex,z4);
+label.bot(btex $\vec\jmath$ etex,z5);
+label.lft(btex $\vec k$ etex,z6);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-dode.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-dode.gif
new file mode 100644
index 0000000000..a57ae904d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-dode.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico-octa.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico-octa.gif
new file mode 100644
index 0000000000..3470183514
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico-octa.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico.gif
new file mode 100644
index 0000000000..49f4fe5878
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dode-ico.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron.gif
new file mode 100644
index 0000000000..26dbaca5d7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron2.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron2.gif
new file mode 100644
index 0000000000..975a818784
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron2.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron3.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron3.gif
new file mode 100644
index 0000000000..787300a5ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron3.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron4.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron4.gif
new file mode 100644
index 0000000000..157bc71a05
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron4.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron5.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron5.gif
new file mode 100644
index 0000000000..287dc069c9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron5.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron6.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron6.gif
new file mode 100644
index 0000000000..2157db2b66
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron6.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron7.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron7.gif
new file mode 100644
index 0000000000..4e54bbdabd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron7.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron8.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron8.gif
new file mode 100644
index 0000000000..7727477d48
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron8.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron9.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron9.gif
new file mode 100644
index 0000000000..4f67e275cc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/dodecahedron9.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/examples/icosahedron-small.gif b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/icosahedron-small.gif
new file mode 100644
index 0000000000..10c8468b8c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/examples/icosahedron-small.gif
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/3d-1.0.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/3d-1.0.mp
new file mode 100644
index 0000000000..0bffe5dafb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/3d-1.0.mp
@@ -0,0 +1,1040 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\advance\vsize1in
+%%\let\ora\overrightarrow
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf 3D.MP : 3-DIMENSIONAL REPRESENTATIONS
+%% AND ANIMATIONS IN METAPOST}}
+
+%% version 1.0, 8 April 1998
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+
+%% This package provides definitions enabling the manipulation
+%% and animation of 3-dimensional objects.
+%% Such objects can be included in a \TeX{} file or used on web pages
+%% for instance. See the documentation enclosed in the distribution for
+%% more details.
+
+%% Thanks to John Hobby and Ulrik Vieth for helpful hints.
+
+%% LIMITATIONS:
+
+%% $-$ an object can not include \TeX{} labels; to overcome this limitation
+%% would need to wrap the metapost output with dvips so that the
+%% necessary fonts are loaded (easy to do, but not done here)
+
+%% PROJECTS FOR THE FUTURE:
+
+%% $-$ take light sources into account and show shadows and darker faces
+
+%% $-$ handle overlapping of objects ({\it obj\_name\/} can be used when
+%% going through all faces)
+
+if known three_d_version:
+ expandafter endinput % avoids loading this package twice
+fi;
+
+message "*** 3d, version 1.0 (c) D. Roegel, 8 April 1998 ***";
+numeric three_d_version;
+three_d_version=1.0;
+
+%%\newpage
+%%\title{Vector operations}
+
+% definition of vector |i| by its coordinates
+def vect_def(expr i,xi,yi,zi)= vect[i]x:=xi;vect[i]y:=yi;vect[i]z:=zi; enddef;
+
+% a point is stored as a vector
+let set_point = vect_def;
+
+% |set_obj_point| is like |set_point|, but the first parameter
+% is a local point number
+def set_obj_point(expr i,xi,yi,zi)=set_point(pnt(i),xi,yi,zi) enddef;
+
+% definition of a vector by an other vector
+def vect_def_vect(expr i,j)=
+ vect[i]x:=vect[j]x;vect[i]y:=vect[j]y;vect[i]z:=vect[j]z;
+enddef;
+
+% vector sum: |vect[k]| $\leftarrow$ |vect[i]|$+$|vect[j]|
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+
+% vector translation: |vect[i]| $\leftarrow$ |vect[i]|$+$|vect[v]|
+def vect_translate(expr i,v)=vect_sum(i,i,v) enddef;
+
+% vector difference: |vect[k]| $\leftarrow$ |vect[i]|$-$|vect[j]|
+def vect_diff(expr k,i,j)=
+ vect[k]x:=vect[i]x-vect[j]x;
+ vect[k]y:=vect[i]y-vect[j]y;
+ vect[k]z:=vect[i]z-vect[j]z;
+enddef;
+
+% dot product of |vect[i]| and |vect[j]|
+vardef vect_dprod(expr i,j)=
+ (vect[i]x*vect[j]x+vect[i]y*vect[j]y+vect[i]z*vect[j]z)
+enddef;
+
+% modulus of |vect[i]|
+vardef vect_mod(expr i)= sqrt(vect_dprod(i,i)) enddef;
+
+% vector product: |vect[k]| $\leftarrow$ |vect[i]| $\land$ |vect[j]|
+def vect_prod(expr k,i,j)=
+ vect[k]x:=vect[i]y*vect[j]z-vect[i]z*vect[j]y;
+ vect[k]y:=vect[i]z*vect[j]x-vect[i]x*vect[j]z;
+ vect[k]z:=vect[i]x*vect[j]y-vect[i]y*vect[j]x;
+enddef;
+
+% scalar multiplication: |vect[j]| $\leftarrow$ |vect[i]*v|
+def vect_mult(expr j,i,v)=
+ vect[j]x:=v*vect[i]x;vect[j]y:=v*vect[i]y;vect[j]z:=v*vect[i]z;
+enddef;
+
+% middle of two points
+def mid_point(expr k,i,j)= vect_sum(k,i,j);vect_mult(k,k,.5); enddef;
+
+%%\newpage
+%%\title{Vector rotation}
+% Rotation of |vect[v]| around |vect[axis]| by an angle |alpha|
+
+%% The vector $\vec{v}$ is first projected on the axis
+%% giving vectors $\vec{a}$ and $\vec{h}$:
+%%\figure{vect-fig.9}
+%% If we set
+%% $\vec{b}={\ora{axis}\over \left\Vert\vcenter{\ora{axis}}\right\Vert}$,
+%% the rotated vector $\vec{v'}$ is equal to $\vec{h}+\vec{f}$
+%% where $\vec{f}=\cos\alpha \cdot \vec{a} + \sin\alpha\cdot \vec{c}$.
+%% and $\vec{h}=(\vec{v}\cdot\vec{b})\vec{b}$
+%%\figure{vect-fig.10}
+
+% The rotation is independent of |vect[axis]|'s module.
+% |v| = old and new vector
+% |axis| = rotation axis
+% |alpha| = rotation angle
+%
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ v_d:=new_vect;v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v)); % projection of |v| on |axis|
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);free_vect(v_d);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Operations on objects}
+% |iname| is the handler for an instance of an object of class |name|
+% |iname| must be a letter string
+vardef assign_obj(expr iname,name)=
+ save tmpdef;
+ string tmpdef; % we need to add double quotes (char 34)
+ tmpdef="def " & iname & "_class=" & ditto & name & ditto & " enddef";
+ scantokens tmpdef;
+ def_obj(iname);
+enddef;
+
+% |name| is the the name of an object instance
+% It must be made only of letters (or underscores), but no digits.
+def def_obj(expr name)=
+ scantokens begingroup
+ save tmpdef;string tmpdef;
+ tmpdef="def_" & obj_class_(name) & "(" & ditto & name & ditto & ")";
+ tmpdef
+ endgroup
+enddef;
+
+% This macro puts an object back where it was right at the beginning.
+% |iname| is the name of an object instance.
+vardef reset_obj(expr iname)=
+ save tmpdef;
+ string tmpdef;
+ define_current_point_offset_(iname);
+ tmpdef="set_" & obj_class_(iname) & "_points";
+ scantokens tmpdef(iname);
+enddef;
+
+% Put an object at position given by |pos| (a vector) and
+% with orientations given by angles |psi|, |theta|, |phi|.
+% The object is scaled by |scale|.
+% |iname| is the name of an object instance.
+vardef put_obj(expr iname,pos,scale,psi,theta,phi)=
+ reset_obj(iname);scale_obj(iname,scale);
+ v_x:=new_vect;v_y:=new_vect;v_z:=new_vect;
+ vect_def_vect(v_x,vect_I);
+ vect_def_vect(v_y,vect_J);
+ vect_def_vect(v_z,vect_K);
+ rotate_obj_abs_pv(iname,point_null,v_z,psi);
+ vect_rotate(v_x,v_z,psi);vect_rotate(v_y,v_z,psi);
+ rotate_obj_abs_pv(iname,point_null,v_y,theta);
+ vect_rotate(v_x,v_y,theta);vect_rotate(v_z,v_y,theta);
+ rotate_obj_abs_pv(iname,point_null,v_x,phi);
+ vect_rotate(v_y,v_x,phi);vect_rotate(v_z,v_x,phi);
+ free_vect(v_z);free_vect(v_y);free_vect(v_x);
+ translate_obj(iname,pos);
+enddef;
+
+%%\newpage
+%%\title{Rotation, translation and scaling of objects}
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector |vect[v]|. The angle of rotation is |a|.
+vardef rotate_obj_pv(expr name,p,v,a)=
+ define_current_point_offset_(name);
+ rotate_obj_abs_pv(name,pnt(p),v,a);
+enddef;
+
+vardef rotate_obj_abs_pv(expr name,p,v,a)=
+ save v_a;
+ define_current_point_offset_(name);
+ v_a:=new_vect;
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),p);
+ vect_rotate(v_a,v,a);
+ vect_sum(pnt(i),v_a,p);
+ endfor;
+ free_vect(v_a);
+enddef;
+
+% Rotation of an object instance |name| around an axis
+% going through a point |p| (local to the object)
+% and directed by vector $\ora{pq}$. The angle of rotation is |a|.
+vardef rotate_obj_pp(expr name,p,q,a)=
+ save v_a,axis;
+ define_current_point_offset_(name);
+ v_a:=new_vect;axis:=new_vect;
+ vect_diff(axis,pnt(q),pnt(p));
+ for i:=1 upto obj_points_(name):
+ vect_diff(v_a,pnt(i),pnt(p));
+ vect_rotate(v_a,axis,a);
+ vect_sum(pnt(i),v_a,pnt(p));
+ endfor;
+ free_vect(axis);free_vect(v_a);
+enddef;
+
+% Translation of an object instance |name| by a vector |vect[v]|.
+vardef translate_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_sum(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+% Scalar multiplication of an object instance |name| by a scalar |v|.
+vardef scale_obj(expr name,v)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):
+ vect_mult(pnt(i),pnt(i),v);
+ endfor;
+enddef;
+
+
+%%\newpage
+%%\title{Functions to build new points in space}
+% Rotation in a plane: this is useful to define a regular polygon.
+% |k| is a new point obtained from point |j| by rotation around |o|
+% by a angle $\alpha$ equal to the angle from |i| to |j|.
+%%\figure{vect-fig.11}
+vardef rotate_in_plane_(expr k,o,i,j)=
+ save cosalpha,sinalpha,alpha,v_a,v_b,v_c;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);vect_prod(v_c,v_a,v_b);
+ cosalpha=vect_dprod(v_a,v_b)/vect_mod(v_a)/vect_mod(v_b);
+ sinalpha=sqrt(1-cosalpha**2);
+ alpha=angle((cosalpha,sinalpha));
+ vect_rotate(v_b,v_c,alpha);
+ vect_sum(k,o,v_b);
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+vardef rotate_in_plane(expr k,o,i,j)=
+ rotate_in_plane_(pnt(k),o,pnt(i),pnt(j))
+enddef;
+
+% Build a point on a adjacent face.
+%% The middle $m$ of points $i$ and $j$ is such that
+%% $\widehat{(\ora{om},\ora{mc})}=\alpha$
+%% This is useful to define regular polyhedra
+%%\figure{vect-fig.7}
+vardef new_face_point_(expr c,o,i,j,alpha)=
+ save v_a,v_b,v_c,v_d,v_e;
+ v_a:=new_vect;v_b:=new_vect;v_c:=new_vect;v_d:=new_vect;v_e:=new_vect;
+ vect_diff(v_a,i,o);vect_diff(v_b,j,o);
+ vect_sum(v_c,v_a,v_b);
+ vect_mult(v_d,v_c,.5);
+ vect_diff(v_e,i,j);
+ vect_sum(c,v_d,o);
+ vect_rotate(v_d,v_e,alpha);
+ vect_sum(c,v_d,c);
+ free_vect(v_e);free_vect(v_d);free_vect(v_c);free_vect(v_b);free_vect(v_a);
+enddef;
+
+
+vardef new_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(pnt(c),pnt(o),pnt(i),pnt(j),alpha)
+enddef;
+
+vardef new_abs_face_point(expr c,o,i,j,alpha)=
+ new_face_point_(c,o,pnt(i),pnt(j),alpha)
+enddef;
+
+%%\newpage
+%%\title{Computation of the projection of a point on the ``screen''}
+% |p| is the projection of |m|
+% |m| = point in space (3 coordinates)
+% |p| = point of the intersection plane
+%%\figure{vect-fig.8}
+vardef project_point(expr p,m)=
+ save tmpalpha,v_a,v_b;
+ v_a:=new_vect;v_b:=new_vect;
+ vect_diff(v_b,m,Obs); % vector |Obs|-|m|
+ % |vect[v_a]| is |vect[v_b]| expressed in (|ObsI|,|ObsJ|,|ObsK|)
+ % coordinates.
+ vect[v_a]x:=vect[IObsI_]x*vect[v_b]x
+ +vect[IObsJ_]x*vect[v_b]y+vect[IObsK_]x*vect[v_b]z;
+ vect[v_a]y:=vect[IObsI_]y*vect[v_b]x
+ +vect[IObsJ_]y*vect[v_b]y+vect[IObsK_]y*vect[v_b]z;
+ vect[v_a]z:=vect[IObsI_]z*vect[v_b]x
+ +vect[IObsJ_]z*vect[v_b]y+vect[IObsK_]z*vect[v_b]z;
+ if vect[v_a]x<Obs_dist: % then, point |m| is too close
+ message "Point " & decimal m & " too close -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ if (angle(vect[v_a]x,vect[v_a]z)>h_field/2)
+ or (angle(vect[v_a]x,vect[v_a]y)>v_field/2):
+ message "Point " & decimal m & " out of screen -> not drawn";
+ x[p]:=too_big_;y[p]=too_big_;
+ else:
+ tmpalpha:=Obs_dist/vect[v_a]x;
+ y[p]:=drawing_scale*tmpalpha*vect[v_a]y;
+ x[p]:=drawing_scale*tmpalpha*vect[v_a]z;
+ fi;
+ fi;
+ free_vect(v_b);free_vect(v_a);
+enddef;
+
+% Object projection
+% This is a mere iteration on |project_point|
+def project_obj(expr name)=
+ define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):project_point(ipnt_(i),pnt(i));endfor;
+enddef;
+
+%%\newpage
+%%\title{Draw one face, hiding it if it is hidden}
+% The order of the vertices determines what is the visible side
+% of the face. The order must be clockwise when the face is seen.
+% |drawhidden| is a boolean; if |true| only hidden faces are drawn; if |false|,
+% only visible faces are drawn. Therefore, |draw_face| is called twice
+% by |draw_faces|.
+vardef draw_face(text vertices)(expr col,drawhidden)=
+ save p,num,normal_vect,v_a,v_b,v_c,overflow;
+ path p;boolean overflow;
+ overflow=false;
+ forsuffixes $=vertices:
+ if z[ipnt_($)]=(too_big_,too_big_):overflow:=true; fi;
+ exitif overflow;
+ endfor;
+ if overflow: message "Face can not be drawn, due to overflow";
+ else:
+ p=forsuffixes $=vertices:z[ipnt_($)]--endfor cycle;
+ num0:=0;num1:=0;num2:=0;
+ % get the three last suffixes:
+ forsuffixes $=vertices:num0:=num1;num1:=num2;num2:=$;endfor;
+ normal_vect:=new_vect;v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;
+ vect_diff(v_a,pnt(num1),pnt(num0));
+ vect_diff(v_b,pnt(num2),pnt(num1));
+ vect_prod(normal_vect,v_a,v_b);
+ vect_diff(v_c,pnt(num1),Obs);
+ if filled_faces:
+ if vect_dprod(normal_vect,v_c)<0:
+ fill p withcolor col;if draw_contours:drawcontour(p,contourwidth);fi;
+ else: % |draw p dashed evenly;| if this is done, you must ensure
+ % that hidden faces are (re)drawn at the end
+ fi;
+ else:
+ if vect_dprod(normal_vect,v_c)<0:%visible
+ if not drawhidden:draw p;fi;
+ else: % hidden
+ if drawhidden:
+ draw p withcolor background;% avoid strange overlapping dashes
+ draw p dashed evenly;
+ fi;
+ fi;
+ fi;
+ free_vect(v_c);free_vect(v_b);free_vect(v_a);free_vect(normal_vect);
+ fi;
+enddef;
+
+% |p| is the path to draw (a face contour) and |thickness| is the pen width
+def drawcontour(expr p,thickness)=
+ pickup pencircle scaled thickness;
+ draw p;
+ pickup pencircle scaled .4pt;
+enddef;
+
+%%\newpage
+% Variables for face handling. First, we have an array for lists of vertices
+% corresponding to faces.
+string face_points_[];% analogous to |vect| arrays
+
+% Then, we have an array of colors. A color needs to be a string
+% representing an hexadecimal RGB coding of a color.
+string face_color_[];
+
+% |name| is the name of an object instance
+vardef draw_faces(expr name)=
+ save tmpdef;string tmpdef;
+ define_current_face_offset_(name);
+ % first the hidden faces (dashes must be drawn first):
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),true)";scantokens tmpdef;
+ endfor;
+ % then, the visible faces:
+ for i:=1 upto obj_faces_(name):
+ tmpdef:="draw_face(" & face_points_[face(i)]
+ & ")(hexcolor(" & ditto & face_color_[face(i)] & ditto
+ & "),false)";scantokens tmpdef;
+ endfor;
+enddef;
+
+% Draw point |n| of object instance |name|
+vardef draw_point(expr name,n)=
+ define_current_point_offset_(name);
+ project_point(ipnt_(n),pnt(n));
+ if z[ipnt_(n)] <> (too_big_,too_big_):
+ pickup pencircle scaled 5pt;
+ drawdot(z[ipnt_(n)]);
+ pickup pencircle scaled .4pt;
+ fi;
+enddef;
+
+vardef draw_axes(expr r,g,b)=
+ project_point(1,vect_null);
+ project_point(2,vect_I);
+ project_point(3,vect_J);
+ project_point(4,vect_K);
+ if (z1<>(too_big_,too_big_)):
+ if (z2<>(too_big_,too_big_)):
+ drawarrow z1--z2 dashed evenly withcolor r;
+ fi;
+ if (z3<>(too_big_,too_big_)):
+ drawarrow z1--z3 dashed evenly withcolor g;
+ fi;
+ if (z4<>(too_big_,too_big_)):
+ drawarrow z1--z4 dashed evenly withcolor b;
+ fi;
+ fi;
+enddef;
+
+
+%%\newpage
+% Definition of a macro |obj_name| returning an object name
+% when given an absolute
+% face number. This definition is built incrementally through a string,
+% everytime a new object is defined.
+% |obj_name| is defined by |redefine_obj_name_|.
+
+% Initial definition
+string index_to_name_;
+index_to_name_="def obj_name(expr i)=if i<1:";
+
+% |name| is the name of an object instance
+% |n| is the absolute index of its last face
+def redefine_obj_name_(expr name,n)=
+ index_to_name_:=index_to_name_ & "elseif i<=" & decimal n & ":" & ditto
+ & name & ditto;
+ scantokens begingroup index_to_name_ & "fi;enddef;" endgroup;
+enddef;
+
+% |i| is an absolute face number
+% |vertices| is a string representing a list of vertices
+% |rgbcolor| is a string representing a color in rgb hexadecimal
+def set_face(expr i,vertices,rgbcolor)=
+ face_points_[i]:=vertices;face_color_[i]:=rgbcolor;
+enddef;
+
+% |i| is a local face number
+%|vertices| is a string representing a list of vertices
+%|rgbcolor| is a string representing a color in rgb hexadecimal
+def set_obj_face(expr i,vertices,rgbcolor)=set_face(face(i),vertices,rgbcolor)
+enddef;
+
+%%\newpage
+%%\title{Compute the vectors corresponding to the observer's viewpoint}
+% (vectors |ObsI_|,|ObsJ_| and |ObsK_| in the |vect_I|,|vect_J|,
+% |vect_K| reference; and vectors |IObsI_|,|IObsJ_| and |IObsK_|
+% which are |vect_I|,|vect_J|,|vect_K|
+% in the |ObsI_|,|ObsJ_|,|ObsK_| reference)
+%%\figure{vect-fig.16}
+%% (here, $\psi>0$, $\theta<0$ and $\phi>0$; moreover,
+%% $\vert\theta\vert \leq 90^\circ$)
+
+def compute_reference(expr psi,theta,phi)=
+ % |ObsI_| defines the direction of observation;
+ % |ObsJ_| and |ObsK_| the orientation
+ % (but one of these two vectors is enough,
+ % since |ObsK_| = |ObsI_| $\land$ |ObsJ_|)
+ % The vectors are found by rotations of |vect_I|,|vect_J|,|vect_K|.
+ vect_def_vect(ObsI_,vect_I);vect_def_vect(ObsJ_,vect_J);
+ vect_def_vect(ObsK_,vect_K);
+ vect_rotate(ObsI_,ObsK_,psi);
+ vect_rotate(ObsJ_,ObsK_,psi);% gives ($u$,$v$,$z$)
+ vect_rotate(ObsI_,ObsJ_,theta);
+ vect_rotate(ObsK_,ObsJ_,theta);% gives ($Obs_x$,$v$,$w$)
+ vect_rotate(ObsJ_,ObsI_,phi);
+ vect_rotate(ObsK_,ObsI_,phi);% gives ($Obs_x$,$Obs_y$,$Obs_z$)
+ % The passage matrix $P$ from |vect_I|,|vect_J|,|vect_K|
+ % to |ObsI_|,|ObsJ_|,|ObsK_| is the matrix
+ % composed of the vectors |ObsI_|,|ObsJ_| and |ObsK_| expressed
+ % in the base |vect_I|,|vect_J|,|vect_K|.
+ % We have $X=P X'$ where $X$ are the coordinates of a point
+ % in |vect_I|,|vect_J|,|vect_K|
+ % and $X'$ the coordinates of the same point in |ObsI_|,|ObsJ_|,|ObsK_|.
+ % In order to get $P^{-1}$, it suffices to build vectors using
+ % the previous rotations in the inverse order.
+ vect_def_vect(IObsI_,vect_I);vect_def_vect(IObsJ_,vect_J);
+ vect_def_vect(IObsK_,vect_K);
+ vect_rotate(IObsK_,IObsI_,-phi);vect_rotate(IObsJ_,IObsI_,-phi);
+ vect_rotate(IObsK_,IObsJ_,-theta);vect_rotate(IObsI_,IObsJ_,-theta);
+ vect_rotate(IObsJ_,IObsK_,-psi);vect_rotate(IObsI_,IObsK_,-psi);
+enddef;
+
+%%\newpage
+%%\title{Point of view}
+% This macro computes the three angles necessary for |compute_reference|
+% |name| = name of an instance of an object
+% |target| = target point (local to object |name|)
+% |phi| = angle
+vardef point_of_view_obj(expr name,target,phi)=
+ define_current_point_offset_(name);% enables |pnt|
+ point_of_view_abs(pnt(target),phi);
+enddef;
+
+% Compute absolute perspective. |target| is an absolute point number
+vardef point_of_view_abs(expr target,phi)=
+ save v_a,psi,theta;
+ v_a:=new_vect;
+ vect_diff(v_a,target,Obs);
+ vect_mult(v_a,v_a,1/vect_mod(v_a));
+ psi=angle((vect[v_a]x,vect[v_a]y));
+ theta=-angle((vect[v_a]x++vect[v_a]y,vect[v_a]z));
+ compute_reference(psi,theta,phi);
+ free_vect(v_a);
+enddef;
+
+
+
+% Distance between the observer and point |n| of object |name|
+% Result is put in |dist|
+vardef obs_distance(text dist)(expr name,n)=
+ save v_a;
+ v_a:=new_vect;
+ define_current_point_offset_(name);% enables |pnt|
+ dist:=vect_mod(v_a,pnt(n),Obs);
+ free_vect(v_a);
+enddef;
+
+%%\newpage
+%%\title{Vector and point allocation}
+% Allocation is done through a stack of vectors
+numeric last_vect_;
+last_vect_=0;
+
+% vector allocation
+def new_vect=incr(last_vect_)
+ % |message "Vector " & decimal last_vect_ & " allocated";|
+enddef;
+
+let new_point = new_vect;
+
+def new_points(text p)(expr n)=
+ save p;
+ numeric p[];
+ for i:=1 upto n:p[i]:=new_point;endfor;
+enddef;
+
+% Free a vector
+% A vector can only be freed safely when it was the last vector created.
+def free_vect(expr i)=
+ if i=last_vect_: last_vect_:=last_vect_-1;
+ else: errmessage("Vector " & decimal i & " can't be freed!");
+ fi;
+enddef;
+
+let free_point = free_vect;
+
+def free_points(text p)(expr n)=
+ for i:=10 step-1 until 1:free_point(p[i]);endfor;
+enddef;
+
+%%\title{Debugging}
+
+def show_vect(expr t,i)=
+ message "Vector " & t & "="
+ & "(" & decimal vect[i]x & "," & decimal vect[i]y & ","
+ & decimal vect[i]z & ")";
+enddef;
+
+let show_point=show_vect;
+
+def show_pair(expr t,zz)=
+ message t & "=(" & decimal xpart(zz) & "," & decimal ypart(zz) & ")";
+enddef;
+
+
+%%\newpage
+%%\title{Access to object features}
+% |a| must be a string representing an class name, such as |"dodecahedron"|.
+% |b| is the tail of a macro name.
+
+def obj_(expr a,b,i)=
+ scantokens
+ begingroup save n;string n;n=a & b & i;n
+ endgroup
+enddef;
+
+def obj_points_(expr name)=
+ obj_(obj_class_(name),"_points",name)
+enddef;
+
+def obj_faces_(expr name)=
+ obj_(obj_class_(name),"_faces",name)
+enddef;
+
+vardef obj_point_offset_(expr name)=
+ obj_(obj_class_(name),"_point_offset",name)
+enddef;
+
+vardef obj_face_offset_(expr name)=
+ obj_(obj_class_(name),"_face_offset",name)
+enddef;
+
+def obj_class_(expr name)=obj_(name,"_class","") enddef;
+
+%%\newpage
+def define_point_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_point_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_point_offset_;
+ last_point_offset_:=last_point_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_points" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_face_offset_(expr name,o)=
+ begingroup save n,tmpdef;
+ string n,tmpdef;
+ n=obj_class_(name) & "_face_offset" & name;
+ expandafter numeric scantokens n;
+ scantokens n:=last_face_offset_;
+ last_face_offset_:=last_face_offset_+o;
+ tmpdef="def " & obj_class_(name) & "_faces" & name &
+ "=" & decimal o & " enddef";
+ scantokens tmpdef;
+ endgroup
+enddef;
+
+def define_current_point_offset_(expr name)=
+ save current_point_offset_;
+ numeric current_point_offset_;
+ current_point_offset_:=obj_point_offset_(name);
+enddef;
+
+def define_current_face_offset_(expr name)=
+ save current_face_offset_;
+ numeric current_face_offset_;
+ current_face_offset_:=obj_face_offset_(name);
+enddef;
+
+
+%%\newpage
+%%\title{Drawing an object}
+% |name| is an object instance
+def draw_obj(expr name)=project_obj(name);draw_faces(name);enddef;
+
+%%\title{Normalization of an object}
+% This macro translates an object so that a list of vertices is centered
+% on the origin, and the last vertex is put on a sphere whose radius is 1.
+% |name| is the name of the object and |vertices| is a list
+% of points whose barycenter will define the center of the object.
+% (|vertices| need not be the list of all vertices)
+vardef normalize_obj(expr name)(text vertices)=
+ save v_a,nvertices,last;
+ numeric v_a,last;
+ nvertices=0;
+ v_a=new_vect;vect_def(v_a,0,0,0)
+ forsuffixes $=vertices:
+ vect_sum(v_a,v_a,pnt($));
+ nvertices:=nvertices+1;
+ last:=$;
+ endfor;
+ vect_mult(v_a,v_a,-1/nvertices);
+ translate_obj(name,v_a);% object centered on the origin
+ scale_obj(name,1/vect_mod(pnt(last)));
+ free_vect(v_a);
+enddef;
+
+
+%%\newpage
+%%\title{General definitions}
+% Vector arrays
+numeric vect[]x,vect[]y,vect[]z;
+
+% Observer
+numeric Obs;
+Obs=new_point;
+% default value:
+set_point(Obs,0,0,20);
+
+% Observer's vectors
+ObsI_=new_vect;ObsJ_=new_vect;ObsK_=new_vect;
+IObsI_=new_vect;IObsJ_=new_vect;IObsK_=new_vect;
+
+% distance observer/plane (must be $>0$)
+numeric Obs_dist; % represents |Obs_dist| $\times$ |drawing_scale|
+% default value:
+Obs_dist=2; % means |Obs_dist| $\times$ |drawing_scale|
+
+% Screen Size
+% The screen size is defined through two angles: the horizontal field
+% and the vertical field
+numeric h_field,v_field;
+h_field=100; % degrees
+v_field=70; % degrees
+
+% Reference vectors $\vec{0}$, $\vec{\imath}$, $\vec{\jmath}$ and $\vec{k}$
+% and their definition
+numeric vect_null,vect_I,vect_J,vect_K;
+vect_null=new_vect;vect_I=new_vect;vect_J=new_vect;vect_K=new_vect;
+vect_def(vect_null,0,0,0);
+vect_def(vect_I,1,0,0);vect_def(vect_J,0,1,0);vect_def(vect_K,0,0,1);
+numeric point_null;
+point_null=vect_null;
+
+% Observer's orientation, defined by three angles
+numeric Obs_psi,Obs_theta,Obs_phi;
+% default value:
+Obs_psi=0;Obs_theta=90;Obs_phi=0;
+
+% Points for the figures
+numeric points_[];
+
+% |name| is the name of an object instance
+% |npoints| is its number of defining points
+def new_obj_points(expr name,npoints)=
+ define_point_offset_(name,npoints);define_current_point_offset_(name);
+ for i:=1 upto obj_points_(name):pnt(i):=new_point;endfor;
+enddef;
+
+% |name| is the name of an object instance
+% |nfaces| is its number of defining faces
+def new_obj_faces(expr name,nfaces)=
+ define_face_offset_(name,nfaces);define_current_face_offset_(name);
+ redefine_obj_name_(name,current_face_offset_+nfaces);
+enddef;
+
+%%\newpage
+% Absolute point number corresponding to object point number |i|
+% This macro must only be used within the function defining an object
+% (such as |def_cube|) or the function drawing an object (such as
+% |draw_cube|).
+def ipnt_(expr i)=i+current_point_offset_ enddef;
+def pnt(expr i)=points_[ipnt_(i)] enddef;
+
+def face(expr i)=(i+current_face_offset_) enddef;
+
+% Absolute point number corresponding to local point |n|
+% in object instance |name|
+vardef pnt_obj(expr name,n)=
+ hide(define_current_point_offset_(name);) pnt(n)
+enddef;
+
+% Absolute face number corresponding to local face |n|
+% in object instance |name|
+vardef face_obj(expr name,n)=
+ hide(define_current_face_offset_(name);) face(n)
+enddef;
+
+
+% Scale
+numeric drawing_scale;
+drawing_scale=2cm;
+
+% Color
+% This function is useful when a color is expressed in hexadecimal.
+def hexcolor(expr s)=
+ (hex(substring (0,2) of s)/255,hex(substring (2,4) of s)/255,
+ hex(substring (4,6) of s)/255)
+enddef;
+
+% Filling and contours
+boolean filled_faces,draw_contours;
+filled_faces=true;
+draw_contours=true;
+numeric contourwidth; % thickness of contours
+contourwidth=1pt;
+
+% Overflow control
+% An overflow can occur when an object is too close from the observer
+% or if an object is out of sight. We use a special value to mark
+% coordinates which would lead to an overflow.
+numeric too_big_;
+too_big_=4000;
+
+
+% Object offset (the points defining an object are arranged
+% in a single array, and the objects are easier to manipulate
+% if the point numbers are divided into a number and an offset).
+numeric last_point_offset_,last_face_offset_;
+last_point_offset_=0;last_face_offset_=0;
+
+
+%%\newpage
+%%\title{Computation of field parameters of an animation}
+numeric xmin_,ymin_,xmax_,ymax_;
+
+def compute_bbox=
+ if known xmin_:
+ xmin_:=min(xmin_,xpart(llcorner(currentpicture)));
+ ymin_:=min(ymin_,ypart(llcorner(currentpicture)));
+ xmax_:=max(xmax_,xpart(urcorner(currentpicture)));
+ ymax_:=max(ymax_,ypart(urcorner(currentpicture)));
+ else:
+ xmin_=xpart(llcorner(currentpicture));
+ ymin_=ypart(llcorner(currentpicture));
+ xmax_=xpart(urcorner(currentpicture));
+ ymax_=ypart(urcorner(currentpicture));
+ fi;
+enddef;
+
+boolean show_animation_parameters;
+show_animation_parameters=false;
+numeric paper_height;
+paper_height=29.7; % paper height in cm
+
+% show bounding box of an animation, in PostScript points
+% and parameters for animation script
+vardef show_animation_bbox=
+ save trx,try,h,w,delta,pnmx,pnmy,pnmw,pnmh,res;
+ res=36; % 36 dots per inch in bitmap
+ w=xmax_-xmin_;h=ymax_-ymin_;
+ if show_animation_parameters:
+ message "animation bbox: (llx=" & decimal round(xmin_)
+ & ",lly=" & decimal round(ymin_)
+ & ",w=" & decimal round(w) & ",h=" & decimal round(h) & ")";
+ fi;
+ if xmin_ <=20: trx=50-xmin_;else: trx=0;fi;
+ if ymin_ <=20: try=50-ymin_;else: try=0;fi;
+ if show_animation_parameters:
+ message "translate parameters: "
+ & decimal round(trx) & " " & decimal round(try);
+ fi;
+ xmin_:=xmin_+trx;ymin_:=ymin_+try;
+ delta=10;
+ pnmx=round(xmin_*(res/72)-delta);
+ pnmy=round((paper_height/2.54*72-ymin_-h)*(res/72)-delta);
+ pnmw=round(w*(res/72)+2*delta);
+ pnmh=round(h*(res/72)+2*delta);
+ if show_animation_parameters:
+ message "pnmcut parameters (with -r36): "
+ & decimal pnmx & " " & decimal pnmy & " "
+ & decimal pnmw & " " & decimal pnmh;
+ fi;
+ write_script(round(trx),round(try),
+ pnmx,pnmy,pnmw,pnmh,res,jobname,"create_animation.sh");
+enddef;
+
+%%\newpage
+%%\title{Creation of a shell script to automate the animation}
+% This is UNIX targetted and may need to be customized.
+
+vardef write_script(expr trx,try,xmin,ymin,w,h,res,output,file)=
+ save s;
+ string s;
+ def write_to_file(text arg)=write arg to file; enddef;
+ write_to_file("#! /bin/sh");
+ write_to_file("");
+ write_to_file("/bin/rm -f "&output&".log");
+ write_to_file("for i in `ls "&output&".*| grep '"&output&".[0-9]'`;do");
+ if false: "endfor" fi % indentation hack for meta-mode.el
+ write_to_file("echo $i");
+ write_to_file("echo '=============='");
+ s:="awk < $i '{print} /^%%Page: /{print "&ditto;
+ s:=s&decimal trx&" "&decimal try&" translate\n"&ditto&"}' > $i.ps";
+ write_to_file(s);
+ % ghostscript PostScript into ppm
+ s:="gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE ";
+ s:=s&"-r"&decimal res &" -sOutputFile=$i.ppm -q -- $i.ps";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ps");
+ % possible alternative:
+ % |s:="mogrify -compress -crop " & decimal(w) & "x" & decimal(h);|
+ % |s:=s&"+"& decimal(xmin) &"+"&decimal(ymin);|
+ % |s:=s&" -colors 32 -format gif $i.ppm";|
+ s:="ppmquant 32 $i.ppm | pnmcut "& decimal(xmin) &" "&decimal(ymin);
+ s:=s&" "&decimal(w)&" "&decimal(h) &" | ";
+ s:=s&"ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f $i.ppm");
+ write_to_file("done");
+ write_to_file("/bin/rm -f "&output&".gif");
+ s:="gifmerge -10 -l1000 ";
+ s:=s&output&".*.gif > "&output&".gif";
+ write_to_file(s);
+ write_to_file("/bin/rm -f "&output&".*.gif");
+ write_to_file(EOF);% end of file
+enddef;
+
+%%\newpage
+%%\title{Standard animation definitions}
+% These definitions produce {\it one\/} image of some kind.
+
+extra_endfig:="compute_bbox";
+
+% In the standard animations, the observer follows a circle, shown below:
+%%\figure{vect-fig.17}
+
+% Standard image 1: this is an example and may be adapted.
+% |name| is an object instance
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name,1,Obs_phi);% fix point 1 of object |name|
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ draw_point(name,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 2: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+%%\newpage
+% Standard image 3: this is an example and may be adapted.
+% |name_a|, |name_b| and |name_c| are object instances.
+def one_image_three_objects(expr name_a,name_b,name_c,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;h_field:=100;v_field:=150;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);draw_obj(name_c);
+ v_a:=new_vect;
+ vect_def(v_a,.03*cosd(-a*ang+90),.03*sind(-a*ang+90),0);
+ translate_obj(name_c,v_a);
+ free_vect(v_a);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_b,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+% Standard image 4: this is an example and may be adapted.
+% |name_a| and |name_b| are object instances.
+def one_image_two_identical_objects(expr name_a,name_b,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,-rd*cosd(a*ang),-rd*sind(a*ang),2);
+ Obs_phi:=90;Obs_dist:=2;
+ point_of_view_obj(name_a,1,Obs_phi);% fix point 1 of object |name_a|
+ draw_obj(name_a);draw_obj(name_b);
+ rotate_obj_pv(name_a,1,vect_I,ang);
+ rotate_obj_pv(name_b,13,vect_J,-ang);
+ %|rotate_obj_pp(name_a,13,7,-ang);|
+ draw_point(name_a,1);% show the rotation point
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+
+
+%%\newpage
+% An animation is a series of images, and these series are produced here.
+
+% Standard animation 1
+% |name| is a class name
+def animate_object(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obj",name);
+ for i:=imin upto imax:one_image("obj",i+index,i,5,ang);endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 2
+% |name_a| and |name_b| are class names
+def animate_two_objects(expr name_a,name_b,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_objects("obja","objb",i+index,i,5,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 3
+% |name_a|, |name_b| and |name_c| are class names
+vardef animate_three_objects(expr name_a,name_b,name_c,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name_a);assign_obj("objb",name_b);
+ assign_obj("objc",name_c);
+ scale_obj("objb",.7);
+ numeric v_a;v_a:=new_vect;
+ vect_def_vect(v_a,vect_K);vect_mult(v_a,v_a,4);put_obj("objb",v_a,1,0,0,0);
+ free_vect(v_a);
+ scale_obj("objc",.5);
+ translate_obj("objc",vect_K);translate_obj("objc",vect_K);
+ for i:=imin upto imax:
+ one_image_three_objects("obja","objb","objc",i+index,i,7,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+% Standard animation 4
+% |name| is a class name
+def animate_two_identical_objects(expr name,imin,imax,index)=
+ numeric ang;ang=360/(imax-imin+1);
+ assign_obj("obja",name);assign_obj("objb",name);
+ translate_obj("objb",vect_K);translate_obj("objb",vect_K);
+ for i:=imin upto imax:
+ one_image_two_identical_objects("obja","objb",i+index,i,10,ang);
+ endfor;
+ show_animation_bbox;
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/animpoly.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/animpoly.mp
new file mode 100644
index 0000000000..729637050b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/animpoly.mp
@@ -0,0 +1,32 @@
+% Animation of polyhedra
+% Example of use of 3d and poly packages
+% METAPOST
+% Denis Roegel, 8 April 1998
+
+% package 3d
+input 3d-1.0
+
+% polyhedra definitions
+input poly
+
+% set scale
+drawing_scale:=8cm;
+
+%
+filled_faces:=true; % default value
+%filled_faces:=false;
+
+%
+%show_animation_parameters:=true; % default value is |false|
+
+% animations
+%animate_object("tetrahedron",1,100,100);
+%animate_object("cube",1,100,100);
+%animate_object("octahedron",1,100,100);
+%animate_object("dodecahedron",1,100,100);
+%animate_object("icosahedron",1,100,100);
+%animate_two_objects("dodecahedron","icosahedron",1,100,100);
+animate_three_objects("dodecahedron","icosahedron","octahedron",1,100,100);
+%animate_two_identical_objects("dodecahedron",1,100,100);
+
+end
diff --git a/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/poly.mp b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/poly.mp
new file mode 100644
index 0000000000..0fc106877e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp3d/v1.0/inputs/poly.mp
@@ -0,0 +1,274 @@
+%%\input epsf
+%%\def\newpage{\vfill\eject}
+%%\def\vc#1{$\vcenter{#1}$}
+%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm}
+%%\def\figure#1{\par\centerline{\epsfbox{#1}}}
+%%\title{{\bf POLY.MP: DEFINITION OF REGULAR CONVEX POLYHEDRA IN METAPOST}}
+
+%% version 1.0, 8 April 1998
+%% {\bf Denis Roegel} ({\tt roegel@loria.fr})
+%%
+%%This package defines the five regular convex polyhedra classes and
+%%must be used with the {\bf 3d} package.
+
+%%Each object definition is parameterized by
+%%an instance identification.
+
+%%All polyhedra are normalized (centered on the origin and inscriptible
+%%in a sphere of radius 1).
+
+%%The polyhedra are defined with a certain number of points and faces.
+%%The points comprise both the vertices and the center of the object.
+
+%%It might be useful to remind the Euler formula linking
+%%the number of faces $f$,
+%%vertices $v$ and edges $e$ in polyhedra with no hole in dimension 3:
+%%$f+v-e=2$. This can be verified in the following table:
+
+%%\centerline{\vbox{\halign{\quad#\hfil\quad&&\quad\hfil#\quad\cr
+%% \omit \hfil type\hfil&\omit\hfil faces\hfil
+%% &\omit\hfil vertices\hfil&\omit\hfil edges\hfil\cr
+%% tetrahedron&4&4&6\cr
+%% cube&6&8&12\cr
+%% octahedron&8&6&12\cr
+%% dodecahedron&12&20&30\cr
+%% icosahedron&20&12&30\cr}}}
+
+%%For more details, see the documentation enclosed in the distribution.
+
+message "*** poly, version 1.0 (c) D. Roegel, 8 April 1998 ***";
+
+%%\newpage\title{TETRAHEDRON (4 faces)\kern1cm\epsfbox{tetra.ps}}
+
+%% Construction of a tetrahedron:
+
+%% One face is \vc{\epsfbox{vect-fig.1}} with $h=c\sqrt{3}/2$
+
+%% The angle $\alpha$ between two faces is given by
+%% $\sin(\alpha/2)={\displaystyle c/2\over \displaystyle c\sqrt{3}/2}=1/\sqrt3$
+
+%% \figure{vect-fig.2}
+
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);% $60=360/6$
+ sinan=1/sqrt(3);cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);% center of tetrahedron
+enddef;
+
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);% 4 vertices and the center
+ new_obj_faces(inst,4);% 4 faces in the definition
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+
+%%\newpage\title{CUBE (HEXAHEDRON) (6 faces)\kern1cm\epsfbox{cube.ps}}
+
+%%The definition of a cube is straightforward.
+
+def set_cube_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,1,1,0);
+ set_obj_point(4,0,1,0);
+ set_obj_point(5,0,0,1);
+ set_obj_point(6,1,0,1);
+ set_obj_point(7,1,1,1);
+ set_obj_point(8,0,1,1);
+ normalize_obj(inst)(1,7);% 1 and 7 are opposite vertices
+ set_obj_point(9,0,0,0);% center of cube
+enddef;
+
+vardef def_cube(expr inst)=
+ new_obj_points(inst,9);% 8 vertices and the center
+ new_obj_faces(inst,6);% 6 faces in the definition
+ set_cube_points(inst);
+ set_obj_face(1,"1,2,6,5","b4fe40");
+ set_obj_face(2,"2,3,7,6","45d040");
+ set_obj_face(3,"4,8,7,3","45a114");
+ set_obj_face(4,"1,5,8,4","45a1d4");
+ set_obj_face(5,"5,6,7,8","4569d4");
+ set_obj_face(6,"4,3,2,1","112da1");
+enddef;
+
+
+%%\newpage\title{OCTAHEDRON (8 faces)\kern1cm\epsfbox{octa.ps}}
+
+%% A section of a pyramid is: \vc{\epsfbox{vect-fig.3}}
+
+%% The height of this pyramid is given
+%% by $H^2={(c\sqrt3/2)}^2-{(c/2)}^2=c^2/2$, hence $H=c/\sqrt2$
+
+def set_octahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,1,1,0);
+ set_obj_point(4,0,1,0);
+ set_obj_point(5,.5,.5,1/sqrt(2));
+ set_obj_point(6,.5,.5,-1/sqrt(2));
+ normalize_obj(inst)(5,6);% 5 and 6 are opposite vertices
+ set_obj_point(7,0,0,0);% center of octahedron
+enddef;
+
+vardef def_octahedron(expr inst)=
+ new_obj_points(inst,7);% 6 vertices and the center
+ new_obj_faces(inst,8);% 8 faces in the definition
+ set_octahedron_points(inst);
+ set_obj_face(1,"1,2,5","b4fefe");
+ set_obj_face(2,"2,3,5","45d040");
+ set_obj_face(3,"3,4,5","4569d4");
+ set_obj_face(4,"4,1,5","b49bc0");
+ set_obj_face(5,"6,1,4","45a1d4");
+ set_obj_face(6,"6,2,1","b4c8fe");
+ set_obj_face(7,"6,3,2","b49b49");
+ set_obj_face(8,"6,4,3","112da1");
+enddef;
+
+
+%%\newpage\title{DODECAHEDRON (12 faces)\kern1cm\epsfbox{dodeca.ps}}
+
+%% Two adjacent faces (pentagons) of the dodecahedron are as follows:
+%%\figure{vect-fig.13}
+%% The angle between the faces is the angle between $\overrightarrow{OA}$
+%% and $\overrightarrow{OB}$.
+%% $OA=OB=d_3$ as defined in \figure{vect-fig.14}
+%% $d_1=2r\sin(\pi/5)$, $d_2=2r\sin(2\pi/5)$
+%% and $d_3=d_1\sin(2\pi/5)=2r\sin(\pi/5)\sin(2\pi/5)$
+%%
+%% The angle $\alpha$ is defined by the following conditions:
+%% \figure{vect-fig.15}
+%% Thus $d_2^2=d_3^2+d_3^2-2d_3^2\cos\alpha$, which leads to
+%% $\cos\alpha=1-{\displaystyle d_2^2\over\displaystyle2d_3^2}
+%% =-{\displaystyle\cos(2\pi/5)\over\displaystyle2\sin^2(\pi/5)}$
+%%\newpage
+
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);% 72=360/5
+ rotate_in_plane(3,fc1,1,2);
+ rotate_in_plane(4,fc1,2,3);
+ rotate_in_plane(5,fc1,3,4);
+ cosan=-cosd(72)/(2*sind(36)*sind(36));sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_abs_face_point(fc2,fc1,1,2,an);
+ new_abs_face_point(fc3,fc1,2,3,an);
+ new_abs_face_point(fc4,fc1,3,4,an);
+ new_abs_face_point(fc5,fc1,4,5,an);
+ new_abs_face_point(fc6,fc1,5,1,an);
+ rotate_in_plane(6,fc2,2,1);
+ rotate_in_plane(7,fc2,1,6);
+ rotate_in_plane(8,fc2,6,7);
+ rotate_in_plane(9,fc3,2,8);
+ rotate_in_plane(10,fc3,8,9);
+ rotate_in_plane(11,fc4,3,10);
+ rotate_in_plane(12,fc4,10,11);
+ rotate_in_plane(13,fc5,4,12);
+ rotate_in_plane(14,fc5,12,13);
+ rotate_in_plane(15,fc6,5,14);
+ new_abs_face_point(fc7,fc2,6,7,an);
+ new_abs_face_point(fc8,fc3,8,9,an);
+ new_abs_face_point(fc9,fc4,10,11,an);
+ new_abs_face_point(fc10,fc5,12,13,an);
+ rotate_in_plane(16,fc7,6,15);
+ rotate_in_plane(17,fc7,15,16);
+ rotate_in_plane(18,fc8,7,17);
+ rotate_in_plane(19,fc9,9,18);
+ rotate_in_plane(20,fc10,11,19);
+ normalize_obj(inst)(2,20);% opposite vertices
+ set_obj_point(21,0,0,0);% center of dodecahedron
+ free_points(fc)(10);
+enddef;
+%%\newpage
+vardef def_dodecahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,21);% 21 points in the definition
+ new_obj_faces(inst,12);% 12 faces in the definition
+ set_dodecahedron_points(inst);
+ set_obj_face(1,"5,4,3,2,1","ff0fa1");
+ set_obj_face(2,"8,7,6,1,2","b40000");
+ set_obj_face(3,"10,9,8,2,3","b49b49");
+ set_obj_face(4,"12,11,10,3,4","b49bc0");
+ set_obj_face(5,"14,13,12,4,5","b4c8fe");
+ set_obj_face(6,"6,15,14,5,1","b4fefe");
+ set_obj_face(7,"6,7,17,16,15","b4fe40");
+ set_obj_face(8,"8,9,18,17,7","45d040");
+ set_obj_face(9,"10,11,19,18,9","45a114");
+ set_obj_face(10,"11,12,13,20,19","45a1d4");
+ set_obj_face(11,"14,15,16,20,13","4569d4");
+ set_obj_face(12,"16,17,18,19,20","112da1");
+enddef;
+
+%%\newpage\title{ICOSAHEDRON (20 faces)\kern1cm\epsfbox{icosa.ps}}
+
+%%Two faces of an icosahedron are linked in the following way:
+
+%% \vc{\epsfbox{vect-fig.4}} where $h=c\sqrt3/2$
+
+%% $d$ is also a diagonal in a pentagon: \vc{\epsfbox{vect-fig.5}}
+
+%% $c=2r\sin(\pi/5)$,
+%% $d=2r\sin(2\pi/5)=2c\cos(\pi/5)$
+
+%% The angle between two faces is computed as follows:
+%% \vc{\epsfbox{vect-fig.6}}
+
+%% We have ${(2\cos(\pi/5))}^2=2{(\sqrt3/2)}^2-2{(\sqrt3/2)}^2\cos\alpha$
+
+%% Thus $cos\alpha=1-{8\over3}\cos^2(\pi/5)$
+%%\newpage
+
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);% 60=360/6
+ cosan=1-8/3*cosd(36)*cosd(36);sinan=sqrt(1-cosan**2);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ normalize_obj(inst)(1,10);% opposite vertices
+ set_obj_point(13,0,0,0);% center of icosahedron
+enddef;
+
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);% 12 vertices and the center
+ new_obj_faces(inst,20);% 20 faces in the definition
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+
+endinput
+
diff --git a/graphics/metapost/contrib/macros/mparrows/LICENSE b/graphics/metapost/contrib/macros/mparrows/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/graphics/metapost/contrib/macros/mparrows/README b/graphics/metapost/contrib/macros/mparrows/README
new file mode 100644
index 0000000000..66f69a8f97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/README
@@ -0,0 +1,21 @@
+mparrows.mp
+
+This MetaPost module contains macros for changing the look of arrows
+in MetaPost.
+
+The full documentation is in mparrows.pdf
+
+All the files in the arrows bundle are copyright 2016 Palle Jorgensen
+The file mparrows.mp is public domain. The other files are released
+under Gnu GPL (see LICENSE for details)
+
+Files in the bundle:
+mparrowsexamples.mp Source of the examples in the manual
+mparrows.pdf Manual
+mparrows.tex Source of the manual
+mparrows.mp The MetaPost module
+LICENSE License file
+README This file
+
+Palle Jorgensen
+hamselv(a)pallej.dk \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mparrows/mparrows.mp b/graphics/metapost/contrib/macros/mparrows/mparrows.mp
new file mode 100644
index 0000000000..dcfc0470f0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/mparrows.mp
@@ -0,0 +1,170 @@
+% Public domain.
+% Created 2012-2016, Palle Joergensen, hamselv(at)pallej.dk
+
+numeric barbedarrowindent; barbedarrowindent:=.75;
+
+let drawarrow_orig = drawarrow;
+let drawdblarrow_orig = drawdblarrow;
+
+def drawarrow_default expr p = _apth:=p; _finarr_default enddef;
+def drawarrow_default_unfilled expr p = _apth:=p; _finarr_default_unfilled enddef;
+def drawarrow_default_sharp expr p = _apth:=p; _finarr_default_sharp enddef;
+def drawarrow_barbed expr p = _apth:=p; _finarr_barbed enddef;
+def drawarrow_barbed_unfilled expr p = _apth:=p; _finarr_barbed_unfilled enddef;
+def drawarrow_barbed_sharp expr p = _apth:=p; _finarr_barbed_sharp enddef;
+def drawarrow_open expr p = _apth:=p; _finarr_open enddef;
+
+def drawdblarrow_default expr p = _apth:=p; _findarr_default enddef;
+def drawdblarrow_default_unfilled expr p = _apth:=p; _findarr_default_unfilled enddef;
+def drawdblarrow_default_sharp expr p = _apth:=p; _findarr_default_sharp enddef;
+def drawdblarrow_barbed expr p = _apth:=p; _findarr_barbed enddef;
+def drawdblarrow_barbed_unfilled expr p = _apth:=p; _findarr_barbed_unfilled enddef;
+def drawdblarrow_barbed_sharp expr p = _apth:=p; _findarr_barbed_sharp enddef;
+def drawdblarrow_open expr p = _apth:=p; _findarr_open enddef;
+
+vardef arrowhead_default expr p = %% For default like arrow heads
+ save q,r,e,s;
+ path q,r,s; pair e;
+ e = point length p of p;
+ q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) cuttings;
+ r = ((q rotated .5ahangle)--(reverse q rotated -.5ahangle)--cycle) shifted e;
+ s = (point length r of r)--(point (length r-1) of r);
+ _apth:= gobble(_apth cutbefore s) cuttings;
+ r
+enddef;
+
+vardef arrowhead_barbed expr p = %% For barbed arrow heads
+ save q,e,f,r;
+ path q,r; pair e,f;
+ e = point length p of p;
+ f = (p shifted -e) intersectionpoint (makepath(pencircle scaled (barbedarrowindent*2*ahlength)));
+ q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) cuttings;
+ r = ((q rotated .5ahangle)--(reverse q rotated -.5ahangle)--f--cycle) shifted e;
+ _apth:= gobble(_apth cutbefore f shifted e) cuttings;
+ r
+enddef;
+
+vardef arrowhead_open expr p = %% For open arrow head
+ save q,r,e;
+ path q,r; pair e;
+ e = point length p of p;
+ q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) cuttings;
+ r = ((q rotated .5ahangle)--(reverse q rotated -.5ahangle)) shifted e;
+ r
+enddef;
+
+def _finarr_default text t =
+ filldraw arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_default text t =
+ filldraw arrowhead_default _apth t;
+ _apth:= reverse _apth;
+ filldraw arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_default_unfilled text t =
+ draw arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_default_unfilled text t =
+ draw arrowhead_default _apth t;
+ _apth:= reverse _apth;
+ draw arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_default_sharp text t =
+ fill arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_default_sharp text t =
+ fill arrowhead_default _apth t;
+ _apth:= reverse _apth;
+ fill arrowhead_default _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_barbed text t =
+ filldraw arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_barbed text t =
+ filldraw arrowhead_barbed _apth t;
+ _apth:= reverse _apth;
+ filldraw arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_barbed_unfilled text t =
+ draw arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_barbed_unfilled text t =
+ draw arrowhead_barbed _apth t;
+ _apth:= reverse _apth;
+ draw arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_barbed_sharp text t =
+ fill arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_barbed_sharp text t =
+ fill arrowhead_barbed _apth t;
+ _apth:= reverse _apth;
+ fill arrowhead_barbed _apth t;
+ draw _apth t
+enddef;
+
+def _finarr_open text t =
+ draw arrowhead_open _apth t;
+ draw _apth t
+enddef;
+
+def _findarr_open text t =
+ draw arrowhead_open _apth t;
+ _apth:= reverse _apth;
+ draw arrowhead_open _apth t;
+ draw _apth t
+enddef;
+
+numeric orig, default, defaultunfilled, defaultsharp, barbed, barbedunfilled, barbedsharp, open;
+
+orig = 0; default = 1; defaultunfilled = 2; defaultsharp = 3; barbed = 4; barbedunfilled = 5; barbedsharp = 6; open = 7;
+
+def setarrows expr t =
+ if t = orig:
+ let drawarrow = drawarrow_orig;
+ let drawdblarrow = drawdblarrow_orig;
+ elseif t = default:
+ let drawarrow = drawarrow_default;
+ let drawdblarrow = drawdblarrow_default;
+ elseif t = defaultunfilled:
+ let drawarrow = drawarrow_default_unfilled;
+ let drawdblarrow = drawdblarrow_default_unfilled;
+ elseif t = defaultsharp:
+ let drawarrow = drawarrow_default_sharp;
+ let drawdblarrow = drawdblarrow_default_sharp;
+ elseif t = barbed:
+ let drawarrow = drawarrow_barbed;
+ let drawdblarrow = drawdblarrow_barbed;
+ elseif t = barbedunfilled:
+ let drawarrow = drawarrow_barbed_unfilled;
+ let drawdblarrow = drawdblarrow_barbed_unfilled;
+ elseif t = barbedsharp:
+ let drawarrow = drawarrow_barbed_sharp;
+ let drawdblarrow = drawdblarrow_barbed_sharp;
+ elseif t = open:
+ let drawarrow = drawarrow_open;
+ let drawdblarrow = drawdblarrow_open;
+ fi
+enddef;
diff --git a/graphics/metapost/contrib/macros/mparrows/mparrows.pdf b/graphics/metapost/contrib/macros/mparrows/mparrows.pdf
new file mode 100644
index 0000000000..355e3f9264
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/mparrows.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mparrows/mparrows.tex b/graphics/metapost/contrib/macros/mparrows/mparrows.tex
new file mode 100644
index 0000000000..4590a4fb88
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/mparrows.tex
@@ -0,0 +1,282 @@
+%% Copyright 2016, Palle Jorgensen, hamselv(at)pallej.dk
+%
+% This file is part of the mparrows MetaPost module.
+%
+% mparrows is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% mparrows is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with mparrows. If not, see <http://www.gnu.org/licenses/>.
+\pdfoutput1 %
+\documentclass[paper=a4,11pt,UKenglish,DIV=calc,BCOR=0mm,parskip=half,fleqn]{scrartcl}
+\usepackage[T1]{fontenc} %
+\usepackage[utf8]{inputenc} %
+\usepackage{babel} %
+\usepackage{tgpagella} %
+\usepackage{listings} %
+\usepackage{calc} %
+\usepackage[scaled]{luximono} %
+\usepackage{textcomp} %
+\renewcommand*\sfdefault{uop} %
+\linespread{1.045} %
+\usepackage{graphicx} %
+\usepackage{mflogo} %
+\usepackage{varioref} %
+\usepackage[colorlinks]{hyperref} %
+\usepackage[final]{microtype} %
+\setcounter{secnumdepth}{2} %
+\setcounter{tocdepth}{1} %
+\setkomafont{captionlabel}{\usekomafont{sectioning}} %
+\setkomafont{caption}{\small} %
+\author{Palle J\o rgensen} %
+\title{The \texttt{mparrows} \MP\ module\quad \raisebox{-1ex}{\includegraphics[scale=.5]{mparrowsexamples2.mps}}} %
+\hypersetup{pdftitle={The Mparrows MetaPost module}, pdfauthor={Palle Jorgensen}}
+\lstset{language=metapost,breaklines,morekeywords={setarrows,barbedarrowindent}}
+\newenvironment{example}[1]{%
+ \def\myfile{#1}
+ \begin{tabular}{@{}p{.67\linewidth-\tabcolsep}p{.33\linewidth}@{}}
+ \begin{minipage}[c]{\linewidth}}{%
+ \end{minipage}
+ &\parbox[c]{\linewidth}{\centering\includegraphics{\myfile}}
+ \end{tabular}}
+\protected\def\barbedarrowindent{\lstinline{barbedarrowindent}}
+
+\begin{document}
+\maketitle
+
+\tableofcontents
+\clearpage
+
+\section{Introduction}
+\label{sec:introduction}
+
+This MetaPost module provides some different types of arrow heads for
+use with the \lstinline{drawarrow} and \lstinline{drawdblarrow}
+commands.
+
+\section{Usage}
+\label{sec:usage}
+
+To load the mparrows module put the following line into the start of
+your MetaPost file:
+\begin{lstlisting}
+input mparrows;
+\end{lstlisting}
+
+\section{The new arrow types}
+\label{sec:new-arrow-types}
+
+The new arrows are defined with the same parameters as the original
+MetaPost arrows; \lstinline{ahlength} and \lstinline{ahangle}.
+
+\subsection{The original arrows of \MP}
+\label{sec:original-arrows-of-mp}
+
+\begin{example}{mparrowsexamples0.mps}
+ To the right the original arrows of MetaPost are shown.
+
+ They are shown here mostly for comparison. The picture is as most of
+ the other pictures scaled by five.
+
+ To use the original arrows type
+\begin{lstlisting}
+setarrows(orig);
+\end{lstlisting}
+\end{example}
+
+\subsection{The default arrows of the \texttt{mparrows} module}
+\label{sec:stand-arrows-mparrows}
+
+\begin{example}{mparrowsexamples1.mps}
+ The default arrow of the \texttt{mparrows} module look similar to the
+ original arrows of MetaPost.
+
+ However there is a little difference. See
+ section~\vref{sec:diff-betw-orig}.
+
+ To use the default arrows type
+\begin{lstlisting}
+setarrows(default);
+\end{lstlisting}
+ or do nothing -- it's default.
+\end{example}
+
+\subsection{Unfilled arrow heads}
+\label{sec:unfilled-arrow-heads}
+
+\begin{example}{mparrowsexamples2.mps}
+ Arrows just with the same outline as the default arrows but not
+ filled.
+
+ To use the unfilled default arrows type
+\begin{lstlisting}
+setarrows(defaultunfilled);
+\end{lstlisting}
+\end{example}
+
+\subsection{Sharp arrow heads}
+\label{sec:sharp-arrow-heads}
+
+\begin{example}{mparrowsexamples3.mps}
+ Arrows just with the same path for the arrow head as the default
+ arrows but only filled -- the outline is not drawn.
+
+ The tip of the arrow is exactly at the end of the path.
+
+ To use the sharp default arrows type
+\begin{lstlisting}
+setarrows(defaultsharp);
+\end{lstlisting}
+\end{example}
+
+\subsection{Barbed arrows}
+\label{sec:barbed-arrows-1}
+
+
+\begin{example}{mparrowsexamples4.mps}
+ With the same `outer' lines as the default arrow but the back of the
+ arrow head has barbs.
+
+ To use the barbed arrows type
+\begin{lstlisting}
+setarrows(barbed);
+\end{lstlisting}
+\end{example}
+
+\subsection{Unfilled barbed arrows}
+\label{sec:unfill-barb-arrows}
+
+\begin{example}{mparrowsexamples5.mps}
+ The barbed arrow unfilled.
+
+ To use the unfilled barbed arrows type
+\begin{lstlisting}
+setarrows(barbedunfilled);
+\end{lstlisting}
+\end{example}
+
+\subsection{Sharp barbed arrows}
+\label{sec:sharp-barbed-arrows}
+
+\begin{example}{mparrowsexamples6.mps}
+ The barbed arrow sharp.
+
+ To use the sharp barbed arrows type
+\begin{lstlisting}
+setarrows(barbedsharp);
+\end{lstlisting}
+\end{example}
+
+\subsection{Open arrowheads}
+\label{sec:open-arrowheads}
+
+\begin{example}{mparrowsexamples7.mps}
+ With the same `outer' lines as the default arrow but the back of the
+ arrow head is not drawn.
+
+ To use the open arrows type
+\begin{lstlisting}
+setarrows(open);
+\end{lstlisting}
+\end{example}
+
+\section{The \texttt{barbed} arrows}
+\label{sec:barbed-arrows}
+
+\begin{example}{mparrowsexamples33.mps}
+ The \texttt{barbed} arrows are configured via the
+ \barbedarrowindent\ value. \barbedarrowindent\ is the ratio of the
+ inner diameter of the barbed arrows (\textcolor{green}{green}
+ circle) to the outer diameter of the barbed arrows
+ (\textcolor{red}{red} circle).
+\end{example}
+%\includegraphics{mparrowsexamples33.mps}
+
+The \barbedarrowindent\ value is set with
+\begin{lstlisting}
+barbedarrowindent:=.6;
+\end{lstlisting}
+
+Below arrows with different values of \barbedarrowindent\ are displayed.
+\begin{description}
+\item[\includegraphics{mparrowsexamples10.mps}] %0
+%\item[\includegraphics{mparrowsexamples11.mps}] %0.2
+\item[\includegraphics{mparrowsexamples12.mps}] %0.4
+%\item[\includegraphics{mparrowsexamples13.mps}] %0.6
+\item[\includegraphics{mparrowsexamples14.mps}] %0.8
+%\item[\includegraphics{mparrowsexamples15.mps}] %1
+\item[\includegraphics{mparrowsexamples16.mps}] %1.2
+%\item[\includegraphics{mparrowsexamples17.mps}] %1.4
+\item[\includegraphics{mparrowsexamples18.mps}] %1.6
+%\item[\includegraphics{mparrowsexamples19.mps}] %1.8
+\item[\includegraphics{mparrowsexamples20.mps}] %2.0
+\end{description}
+
+\subsection{Negative values}
+\label{sec:negative-values}
+
+As the arrows are defined using circles negative values of
+\barbedarrowindent\ gives the same as the positives.
+\begin{description}
+\item[\includegraphics{mparrowsexamples13.mps}]
+\item[\includegraphics{mparrowsexamples30.mps}]
+\end{description}
+
+\section{The difference between the original and the default arrows}
+\label{sec:diff-betw-orig}
+
+The only (and invisible) difference between the original arrows of
+MetaPost and the default arrows of the \texttt{mparrows} module is how
+the path is drawn:
+
+\begin{example}{mparrowsexamples31.mps}
+ In the original definition the path is drawn as normal.
+\end{example}
+
+\begin{example}{mparrowsexamples32.mps}
+ In the \texttt{mparrows} default the path is cut after the arrow
+ head. This allows for making the arrow heads unfilled (see
+ section~\ref{sec:unfilled-arrow-heads}) or sharp (see
+ section~\ref{sec:sharp-arrow-heads}).
+\end{example}
+
+\clearpage
+% \section{Source of \texttt{mparrows.mp}}
+% \label{sec:source-texttt}
+
+% \lstinputlisting{mparrows.mp}
+% \clearpage
+
+\section{Copyright and license}
+\label{sec:license}
+
+Copyright 2016, Palle Jørgensen, hamselv(at)pallej.dk
+
+This file is part of the mparrows MetaPost module.
+
+mparrows is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation, either version 3 of the License, or (at your
+option) any later version.
+
+mparrows is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with mparrows. If not, see <http://www.gnu.org/licenses/>.
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/metapost/contrib/macros/mparrows/mparrowsexamples.mp b/graphics/metapost/contrib/macros/mparrows/mparrowsexamples.mp
new file mode 100644
index 0000000000..d642e03079
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mparrows/mparrowsexamples.mp
@@ -0,0 +1,90 @@
+% Copyright 2016, Palle Jorgensen, hamselv(at)pallej.dk
+%
+% This file is part of the mparrows MetaPost module.
+%
+% mparrows is free software: you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Foobar is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+verbatimtex
+%&latex
+\documentclass[11pt]{scrbook}
+\usepackage{tgpagella}
+\usepackage[T1]{fontenc}
+
+\begin{document}
+etex;
+
+input mparrows;
+
+filenametemplate "%j%c.mps";
+
+for s within btex text etex:
+ defaultfont:=fontpart.s;
+ defaultscale:=xxpart.s;
+ exitif true;
+endfor
+
+for i = 0 upto 7:
+ beginfig(i);
+ setarrows(i);
+ drawarrow (origin{right}..{up}(0,2mm));
+ drawdblarrow ((0,-2mm){up}..origin{right}..{up}(0,2mm)) shifted (5mm,0);
+ currentpicture:=currentpicture scaled 5;
+ endfig;
+endfor
+
+setarrows(barbed);
+for i = 0 upto 10:
+ beginfig(i+10);
+ barbedarrowindent:=2*i/10;
+ drawarrow origin{dir 20}..{dir 20}(1cm,0);
+ currentpicture:=currentpicture scaled 5;
+ label.rt("barbedarrowindent=" & decimal.barbedarrowindent, (55mm,0mm));
+ endfig;
+endfor;
+
+beginfig(30);
+ barbedarrowindent:=-.6;
+ drawarrow origin{dir 20}..{dir 20}(1cm,0);
+ currentpicture:=currentpicture scaled 5;
+ label.rt("barbedarrowindent=" & decimal.barbedarrowindent, (55mm,0mm));
+endfig;
+
+setarrows(orig);
+
+beginfig(31);
+ drawarrow (origin{right}..{up}(0,2mm));
+ draw _apth withcolor red;
+ currentpicture:=currentpicture scaled 5;
+endfig;
+
+setarrows(default);
+
+beginfig(32);
+ drawarrow (origin{right}..{up}(0,2mm));
+ draw _apth withcolor red;
+ currentpicture:=currentpicture scaled 5;
+endfig;
+
+setarrows(barbedunfilled);
+
+beginfig(33);
+ barbedarrowindent:=.6;
+ drawarrow (origin{right}..{up}(0,2mm));
+ draw (makepath pencircle scaled 2ahlength) shifted (0,2mm) withcolor red withpen currentpen scaled .2;
+ draw (makepath pencircle scaled (2*barbedarrowindent*ahlength)) shifted (0,2mm) withcolor green withpen currentpen scaled .2;
+ currentpicture:=currentpicture scaled 5;
+
+endfig;
+
+
+end.
diff --git a/graphics/metapost/contrib/macros/mpattern/README b/graphics/metapost/contrib/macros/mpattern/README
new file mode 100644
index 0000000000..5f6441c018
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/README
@@ -0,0 +1,129 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is part of the MPATTERN package
+%
+% Author: Piotr Bolek
+% wersja: 0.5 (Jun 25, 2001)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Description
+===========
+
+Package MPATTERN gives ability to define and use patterns in
+MetaPost. It uses Pattern Color Space available in PostScript Level 2.
+
+Package contains:
+- mpattern.mp: MetaPost macros for defining and using patterns.
+- README: short description in English.
+- README.PL: short description in Polish.
+- test.mp, test.tex, test.ps: usage examples.
+
+Using package
+=============
+
+Include the file mpattern.mp with the input command at the beginning
+of the source file and process the source file with the standard mpost
+program.
+
+User Interface
+==============
+
+Defining pattern
+----------------
+
+Patterns are defined using the following construct:
+
+beginpattern(<name_of_pattern>);
+...
+endpattern;
+
+Parameter <name_of_pattern> is the name by which the pattern is
+identified. This name can contain letters and underscore characters
+"_" but not digits. This name should NOT be given in quotes.
+
+One or more of the following macros can be invoked in any place
+inside pattern definition (between beginpattern and endpattern):
+- patternbbox(<pair>,<pair>)
+- patternbbox((<numeric>,<numeric>,<numeric>,<numeric>)
+ Explicit coordinates of bounding box of pattern cell
+
+- patternxstep(<numeric>)
+- patternystep(<numeric>)
+- patternstep(<numeric>,<numeric>)
+- patternstep(<pair>)
+ Pattern spacing
+
+- patterntransform(<transform>)
+ Transformation of pattern shape
+
+- patterncolor(0<= <numeric> <= 1)
+ Explicit color replaced later by pattern
+
+Each pattern is temporarily written as picture with big number
+(default is 999) but when user will use this number for his own
+picture then for temporal storing of next patterns the greatest free
+number less then 999 will be used.
+
+Using patterns
+--------------
+
+Already defined pattern can be used for filling objects with
+two argument withpattern macro. It is used as follows:
+
+<path> withpattern <name_of_pattern>;
+
+where <path> is any valid expression defining closed path and
+<name_of_pattern> is the name given in definition of the pattern.
+
+Example
+-------
+
+Here is code to draw two circles filled with different checker
+patterns.
+
+input mpattern;
+
+beginpattern(checker);
+ d:=4mm;
+ fill unitsquare scaled d;
+ fill unitsquare scaled d shifted (d,d);
+ patternbbox(0,0,2d,2d);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+Distribution of the package
+===========================
+
+The package MPATTERN belongs to the public domain. You can use any
+actuall version of GPL Licence if you want to modify or redistribute
+this package.
+
+Problems
+========
+
+06-2001: Filling text with patterns can make problems. The current
+ solution is unstable.
+
+Changes
+=======
+
+06-2001: By the inspiration by the Piotr Strzelczyk's tutorial at the
+ BachoTeX'2001 conference the necesity of Perl postprocessing
+ is eliminated. The substitution of colors to patterns is now
+ performed with help of dictionaries at the PostScript level.
+
+Contact with author
+=================
+
+e-mail: P.Bolek@gust.org.pl
diff --git a/graphics/metapost/contrib/macros/mpattern/README.PL b/graphics/metapost/contrib/macros/mpattern/README.PL
new file mode 100644
index 0000000000..1872a33c5e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/README.PL
@@ -0,0 +1,133 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Ten plik jest czê¶ci± pakietu MPATTERN
+%
+% Autor: Piotr Bolek
+% wersja: 0.5 (Jun 25, 2001)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Opis
+====
+
+Pakiet MPATTERN s³u¿y do definiowania i u¿ywania wype³nieñ wzorkowych
+w programie MetaPost. W pakiecie wykorzystywana jest dostêpna w jêzyku
+PostScript Level 2 Wzorkowa Przestrzeñ Kolorów (Pattern Color Space).
+
+Zawarto¶æ:
+- mpattern.mp: makra dla programu MetaPost s³u¿±ce do definiowania
+ i u¿ywania wzorków.
+- README: krótki opis po angielsku.
+- README.PL: krótki opis po polsku.
+- test.mp, test.tex, test.ps: przyk³ady u¿ycia.
+
+Sposób u¿ycia
+=============
+
+W pliku ¼ród³owym nale¿y na pocz±tku w³±czyæ poleceniem input plik
+mpattern.mp, a nastêpnie przetworzyæ plik standardowym programem
+mpost.
+
+Interfejs u¿ytkownika
+=====================
+
+Definiowanie wzorku
+--------------------
+
+Wzorki s± definiowane przy u¿yciu konstrukcji:
+
+beginpattern(<nazwa_wzorku>);
+...
+endpattern;
+
+Parametr <nazwa_wzorku> jest nazw±, która s³u¿y do identyfikacji
+wzorku. Nazwa ta mo¿e zawieraæ litery i znaki podkre¶lenia ,,_'', ale
+nie mo¿e zawieraæ cyfr. NIE nale¿y podawaæ tej nazwy w cudzys³owach.
+
+W definicji wzorku (w dowolnym miejscu miêdzy beginpattern a
+endpattern) mo¿na podaæ dodatkowe polecenia:
+- patternbbox(<pair>,<pair>)
+- patternbbox((<numeric>,<numeric>,<numeric>,<numeric>)
+ Jawne podanie wspó³rzêdnych prostok±ta ograniczaj±cego komórkê wzorka
+
+- patternxstep(<numeric>)
+- patternystep(<numeric>)
+- patternstep(<numeric>,<numeric>)
+- patternstep(<pair>)
+ Odstêpy miêdzy komórkami wzorka
+
+- patterntransform(<transform>)
+ Modyfikacja kszta³tu komórki wzorka
+
+- patterncolor(0<= <numeric> <= 1)
+ Jawne podanie koloru zwi±zanego z danym wzorkiem
+
+Ka¿dy wzorek jest tymczasowo zapisywany jako rysunek o du¿ym numerze
+(domy¶lnie 999), ale je¶li u¿ytkownik wykorzysta ten numer do swojego
+rysunku, to dla wzorku bêdzie u¿yty najwiêkszy wolny numer mniejszy od
+999.
+
+U¿ywanie wzorku
+---------------
+
+Do wykorzystania zdefiniowanego wzorku s³u¿y makro dzia³aj±ce jak
+operator dwuargumentowy (primary) withpattern. Sposób u¿ycie jest
+nastêpuj±cy:
+
+<¶cie¿ka> withpattern <nazwa_wzorku>;
+
+gdzie <¶cie¿ka> jest dowolnym wyra¿eniem okre¶laj±cym zamkniêt±
+¶cie¿kê, a <nazwa_wzorku> jest nazw± podan± w definicji wzorku.
+
+Przyk³ad
+--------
+
+Oto kod s³u¿±cy do narysowania dwóch kó³ek wype³nionych ró¿nymi
+szachownicami.
+
+input mpattern;
+
+beginpattern(checker);
+ d:=4mm;
+ fill unitsquare scaled d;
+ fill unitsquare scaled d shifted (d,d);
+ patternbbox(0,0,2d,2d);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+Zasady rozpowszechniania
+========================
+
+Pakiet MPATTERN jest dobrem wspólnym (ang. ,,public domain''). W
+przypadku modyfikacji lub redystrybucji pakietu mo¿na stosowaæ dowoln±
+aktualn± licencjê GPL.
+
+Problemy
+========
+
+06-2001: Mog± byæ problemy z wype³nianiem wzorkami napisów. Aktualne
+ rozwi±zanie jest prowizoryczne.
+
+Zmiany
+======
+
+06-2001: Dziêki inspiracji tutorialem Piotra Strzelczyka na
+ konferencji BachoTeX'2001 wyeliminowana zosta³a konieczno¶æ
+ postprocesingu z wykorzystaniem Perla. Podmiana kolorów na
+ wzorki jest obecnie realizowana z wykorzystaniem s³owników na
+ poziomie PostScriptu.
+
+Kontakt z autorem
+=================
+
+e-mail: P.Bolek@gust.org.pl
diff --git a/graphics/metapost/contrib/macros/mpattern/mpattern.mp b/graphics/metapost/contrib/macros/mpattern/mpattern.mp
new file mode 100644
index 0000000000..2b7cd79e38
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/mpattern.mp
@@ -0,0 +1,287 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is part of the MPATTERN package
+%
+% mpattern.mp: MetaPost macros for pattern defining and filling
+%
+% Author: Piotr Bolek
+% version 0.5: (Jun 25, 2001)
+%
+% $Id: mpattern.mp,v 1.3 2001/06/25 07:28:14 piotrek Exp $
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+boolean P_dict_;
+boolean P_used_already_;
+% Record all numbers (charcode) of pictures
+extra_beginfig := extra_beginfig
+ & "numeric Pwritten_[]; Pcharcode_[charcode]=1; P_used_already_:=false; P_dict_:=false;";
+
+% Working variables to store fragments of Pattern definition
+string PBBox_, PHead_, PTail_, PPaintProc_, Pname_, Pdefs_;
+string Pmatrix_;
+
+PHead_="<< /PaintType 1 /PatternType 1 /TilingType 1 ";
+% 11.08.98 PPaintProc_="/PaintProc { begin ";
+PPaintProc_="/PaintProc { pop ";
+% 11.08.98 PTail_=" end } >>"; % matrix makepattern";
+PTail_=" } >>"; % matrix makepattern";
+Pdefs_="";
+
+% New line string
+string Pnl_; Pnl_=char 13;
+
+% Number of defined patterns
+numeric Pnum_; Pnum_=0;
+
+% Split string defining pattern on new line chars
+% and use each piece as argument to special
+vardef Psplit_and_write_(expr s)=
+ save Pfirst_, Plast_;
+ Pfirst_:=0; Plast_:=0;
+ for i=0 upto length(s):
+ if ( substring (i,i+1) of s = Pnl_ ):
+ Plast_:=i;
+ special substring (Pfirst_,Plast_) of s;
+ Pfirst_:=i+1;
+ fi;
+ endfor;
+enddef;
+
+% Find maximum charcode not used for picture yet
+vardef Pmax_charcode_=
+ save Pn_;
+ for i=999 downto 1:
+ Pn_:=i;
+ exitif unknown Pcharcode_[i];
+ endfor;
+ Pn_
+enddef;
+
+def PmakeBB_=
+ PBBox_ := "/BBox [" & decimal Plft_ & " " & decimal Plow_ & " "
+ & decimal Prt_ & " " & decimal Pup_ & "]" & Pnl_;
+enddef;
+
+def Psteps_=
+ PBBox_ := PBBox_ & "/XStep " & decimal
+ if unknown PXStep_: (Prt_-Plft_) else: PXStep_ fi & Pnl_
+ & "/YStep " & decimal
+ if unknown PYStep_: (Pup_-Plow_) else: PYStep_ fi;
+enddef;
+
+vardef Pfindbounds_=
+% save Plow_, Plft_, Pup_, Prt_;
+% numeric Plow_, Plft_, Pup_, Prt_;
+
+ Plow_ = ypart (llcorner currentpicture);
+ Plft_ = xpart (llcorner currentpicture);
+ Pup_ = ypart (urcorner currentpicture);
+ Prt_ = xpart (urcorner currentpicture);
+
+ PmakeBB_;
+enddef;
+
+% Read file in which the body of patterns PaintProc is stored
+vardef PReadFile_=
+ save Pfile_, Pline_, Pall_;
+ string Pfile_, Pline_, Pall_;
+ Pline_=Pall_="";
+ Pfile_:=jobname & "." & decimal charcode;
+ forever:
+ Pline_ := readfrom Pfile_;
+ exitif Pline_ = EOF;
+ if (substring(length Pline_-3,length Pline_) of Pline_ = "def")
+ and (substring (0,6) of Pline_ <> "/fshow"):
+ Pdefs_ := Pdefs_ & Pline_ & Pnl_;
+ else:
+ if (substring (0,2) of Pline_ = "%%")
+ or (substring (0,8) of Pline_ = "showpage")
+ or (substring (0,4) of Pline_ = "%!PS")
+ or (substring (0,6) of Pline_ = "/fshow"):
+ else:
+ Pall_:=Pall_ & Pline_ & Pnl_;
+ fi;
+ fi;
+ endfor;
+ Pall_
+enddef;
+
+% Join all parts of pattern definition
+vardef PmakePattern_(expr name)=
+ save Pread_;
+ string Pread_;
+
+ Pread_ = PReadFile_;
+
+ % Write string used later to identify pattern
+% batchmode;
+% message "Defining pattern " & name & "->" & decimal (Pnum_*epsilon);
+% errorstopmode;
+ "% Pattern:" &
+ if (not known PColor_):
+ decimal (Pnum_*epsilon)
+ else:
+ decimal (PColor_)
+ fi
+ & ":" & name & Pnl_
+ & PHead_ & Pnl_
+ & PBBox_ & Pnl_
+ & Pdefs_
+ & PPaintProc_ & Pnl_
+ & Pread_
+ & PTail_ & Pnl_
+ & Pmatrix_ & " makepattern" & Pnl_
+ & "/" & name & " exch def" & Pnl_
+ & "MPP " &
+ if (not known PColor_):
+ decimal (Pnum_*epsilon)
+ else:
+ decimal (PColor_)
+ fi
+ & " " & name & " put" & Pnl_
+enddef;
+
+% find PatternColor -- color which will be replaced by pattern
+vardef Pfindcolor_(expr s)=
+ save Pfirst_, Plast_;
+ numeric Pfirst_, Plast_;
+ Pfirst_=Plast_=0;
+ for i=0 upto 255:
+ if substring(i,i+1) of s=":":
+ if Pfirst_=0:
+ Pfirst_:=i+1;
+ else:
+ Plast_:=i;
+ fi;
+ fi;
+ exitif Plast_<>0;
+ endfor;
+ scantokens (substring (Pfirst_,Plast_) of s)
+enddef;
+
+%%%%%%%%%%%%%% User interface macros
+
+% Define BoundingBox of pattern
+vardef patternbbox(expr a)(text b)=
+% save Plft_, Plow_, Prt_, Pup_, Pi_, Pz_;
+% numeric Plft_, Plow_, Prt_, Pup_, Pi_, Pz_[];
+ save Pi_, Pz_;
+ numeric Pi_, Pz_[];
+ if pair a:
+ Plft_:=min(xpart(a),xpart(b)); Plow_:=min(ypart(a),ypart(b));
+ Prt_:=max(xpart(a),xpart(b)); Pup_:=max(ypart(a),ypart(b));
+ else:
+ Pi_=1;
+ for t=b:
+ Pz_[Pi_]=t;
+ Pi_:=Pi_+1;
+ endfor;
+ Plft_:=min(a,Pz_2); Plow_:=min(Pz_1,Pz_3);
+ Prt_:=max(a,Pz_2); Pup_:=max(Pz_1,Pz_3);
+ fi;
+
+ PmakeBB_;
+enddef;
+
+def beginpattern(suffix name)=
+ numeric PXStep_, PYStep_;
+ numeric Plow_, Plft_, Pup_, Prt_;
+ numeric PColor_;
+ Pmatrix_:=" matrix ";
+
+ % Declare variable in which the pattern definition will be stored
+ string name;
+ Pname_:=str name;
+
+ Pnum_:=Pnum_+1;
+
+ % Use the largest available picture number (charcode)
+ % for storing the body od patten PaintProc
+ beginfig(Pmax_charcode_);
+enddef;
+
+def endpattern=
+ if unknown PBBox_:
+ Pfindbounds_;
+ fi;
+ endfig;
+ Psteps_;
+
+ begingroup;
+ save Punknown_, Ppattern_;
+ string Punknown_, Ppattern_;
+
+ Ppattern_=PmakePattern_(Pname_);
+ % free used charcode
+ Pcharcode_[charcode]:=whatever;
+ PBBox_:=Punknown_;
+ Pdefs_:="";
+ % Assign pattern to string variable
+ scantokens(Pname_ & "=Ppattern_;");
+ endgroup;
+enddef;
+
+primarydef p withpattern s=
+ hide(
+ if not P_dict_:
+ special "/MPP 100 dict def";
+ special "/MPPshow {exch findfont exch scalefont setfont show}bind def";
+ special "/fill { MPP currentgray known " & char 10
+ & " { MPP currentgray get setpattern fill } { fill } " & char 10
+ & " ifelse } bind def";
+ special "/fshow { MPP currentgray known " & char 10
+ & " { MPP currentgray get setpattern MPPshow } { MPPshow } " & char 10
+ & " ifelse } bind def";
+ P_dict_:=true;
+ fi;
+ Pc_:=Pfindcolor_(s);
+ % write definition of pattern used in picture
+ % but not yet written to output file;
+ if unknown Pwritten_[Pc_]:
+ Psplit_and_write_(s);
+ Pwritten_[Pc_]:=1;
+ fi;
+ if not P_used_already_:
+ batchmode;
+ message "Pattern:" & decimal charcode;
+ errorstopmode;
+ P_used_already_:=true;
+ fi;
+ %show p;
+ )
+ p withcolor Pc_*white
+enddef;
+
+def patterntransform expr t=
+ Pmatrix_ := "[ " & decimal xxpart t
+ & " " & decimal yxpart t
+ & " " & decimal xypart t
+ & " " & decimal yypart t
+ & " " & decimal xpart t
+ & " " & decimal ypart t & " ]";
+% show Pmatrix_;
+enddef;
+
+def patternxstep expr t=
+ show t;
+ PXStep_ = t;
+enddef;
+
+def patternystep expr t=
+ show t;
+ PYStep_ = t;
+enddef;
+
+def patternstep text t=
+ show t;
+ if pair t:
+ PXStep_ = xpart t;
+ PYStep_ = ypart t;
+ else:
+ (PXStep_,PYStep_)=t;
+ fi;
+enddef;
+
+def patterncolor expr t=
+ show t;
+ PColor_ = t;
+enddef;
diff --git a/graphics/metapost/contrib/macros/mpattern/mpattern_test.pdf b/graphics/metapost/contrib/macros/mpattern/mpattern_test.pdf
new file mode 100644
index 0000000000..2fbe69d37a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/mpattern_test.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mpattern/mpattern_test.ps b/graphics/metapost/contrib/macros/mpattern/mpattern_test.ps
new file mode 100644
index 0000000000..f4ec41d132
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/mpattern_test.ps
@@ -0,0 +1,1249 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software
+%%Title: test.dvi
+%%Pages: 1
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentFonts: PLRoman10-Regular Times-Roman Times-BoldItalic
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips test
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 2005.05.31:1929
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/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{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+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}
+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{
+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
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: plrm.enc
+/encplrm[
+/Gamma
+/Delta
+/Theta
+/Lambda
+/Xi
+/Pi
+/Sigma
+/Upsilon
+/Phi
+/Psi
+/Omega
+/ff
+/fi
+/fl
+/ffi
+/ffl
+/dotlessi
+/dotlessj
+/grave
+/acute
+/caron
+/breve
+/macron
+/ring
+/cedilla
+/germandbls
+/ae
+/oe
+/oslash
+/AE
+/OE
+/Oslash
+/suppress
+/exclam
+/quotedblright
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+/eight
+/nine
+/colon
+/semicolon
+/exclamdown
+/equal
+/questiondown
+/question
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+/X
+/Y
+/Z
+/bracketleft
+/quotedblleft
+/bracketright
+/circumflex
+/dotaccent
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+/x
+/y
+/z
+/endash
+/emdash
+/hungarumlaut
+/tilde
+/dieresis
+/.notdef
+/Aogonek
+/Cacute
+/.notdef
+/.notdef
+/.notdef
+/Eogonek
+/.notdef
+/.notdef
+/.notdef
+/Lslash
+/Nacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Sacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Zacute
+/.notdef
+/Zdotaccent
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/aogonek
+/cacute
+/.notdef
+/.notdef
+/.notdef
+/eogonek
+/.notdef
+/.notdef
+/.notdef
+/lslash
+/nacute
+/.notdef
+/.notdef
+/guillemotleft
+/guillemotright
+/.notdef
+/sacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/zacute
+/.notdef
+/zdotaccent
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/Oacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/oacute
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/quotedblbase
+] def
+
+%%EndProcSet
+%%BeginProcSet: 8r.enc
+% File 8r.enc as of 2002-03-12 for PSNFSS 9
+%
+% This is the encoding vector for Type1 and TrueType fonts to be used
+% with TeX. This file is part of the PSNFSS bundle, version 9
+%
+% Authors: S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, W. Schmidt
+%
+% Idea is to have all the characters normally included in Type 1 fonts
+% available for typesetting. This is effectively the characters in Adobe
+% Standard Encoding + ISO Latin 1 + extra characters from Lucida + Euro.
+%
+% Character code assignments were made as follows:
+%
+% (1) the Windows ANSI characters are almost all in their Windows ANSI
+% positions, because some Windows users cannot easily reencode the
+% fonts, and it makes no difference on other systems. The only Windows
+% ANSI characters not available are those that make no sense for
+% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen
+% (173). quotesingle and grave are moved just because it's such an
+% irritation not having them in TeX positions.
+%
+% (2) Remaining characters are assigned arbitrarily to the lower part
+% of the range, avoiding 0, 10 and 13 in case we meet dumb software.
+%
+% (3) Y&Y Lucida Bright includes some extra text characters; in the
+% hopes that other PostScript fonts, perhaps created for public
+% consumption, will include them, they are included starting at 0x12.
+%
+% (4) Remaining positions left undefined are for use in (hopefully)
+% upward-compatible revisions, if someday more characters are generally
+% available.
+%
+% (5) hyphen appears twice for compatibility with both ASCII and Windows.
+%
+% (6) /Euro is assigned to 128, as in Windows ANSI
+%
+/TeXBase1Encoding [
+% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
+ /.notdef /dotaccent /fi /fl
+ /fraction /hungarumlaut /Lslash /lslash
+ /ogonek /ring /.notdef
+ /breve /minus /.notdef
+% These are the only two remaining unencoded characters, so may as
+% well include them.
+ /Zcaron /zcaron
+% 0x10
+ /caron /dotlessi
+% (unusual TeX characters available in, e.g., Lucida Bright)
+ /dotlessj /ff /ffi /ffl
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ % very contentious; it's so painful not having quoteleft and quoteright
+ % at 96 and 145 that we move the things normally found there down to here.
+ /grave /quotesingle
+% 0x20 (ASCII begins)
+ /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef % rubout; ASCII ends
+% 0x80
+ /Euro /.notdef /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /.notdef /.notdef /Ydieresis
+% 0xA0
+ /.notdef % nobreakspace
+ /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot
+ /hyphen % Y&Y (also at 45); Windows' softhyphen
+ /registered
+ /macron
+% 0xD0
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis
+] def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginProcSet: special.pro
+%!
+TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
+/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
+/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
+/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
+/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
+X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
+/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
+/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
+{userdict/md get type/dicttype eq{userdict begin md length 10 add md
+maxlength ge{/md md dup length 20 add dict copy def}if end md begin
+/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
+atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
+itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
+transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
+curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
+pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
+if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
+-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
+yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
+noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
+90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
+neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
+1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
+2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
+-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
+TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
+Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
+}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
+save N userdict maxlength dict begin/magscale true def normalscale
+currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
+/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
+psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
+psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
+TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
+@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
+newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
+closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
+/@beginspecial{SDict begin/SpecialSave save N gsave normalscale
+currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
+N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
+neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
+rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
+scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
+lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
+ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
+/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
+pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
+restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
+/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
+setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
+moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
+matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
+savematrix setmatrix}N end
+
+%%EndProcSet
+%%BeginFont: PLRoman10-Regular
+%!PS-AdobeFont-1.0: PLRoman10-Regular 1.11
+%%CreationDate: Thu Apr 13 18:00:00 2000
+%%VMusage: 1024 31776
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. Adaptacja PL JMN 1997
+% ADL: 694 194 0
+%%EndComments
+FontDirectory/PLRoman10-Regular known{/PLRoman10-Regular findfont dup/UniqueID known{dup
+/UniqueID get 0 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+17 dict begin
+/FontInfo 13 dict dup begin
+/version(1.11)readonly def
+/Notice(Copyright (C) 1997 American Mathematical Society. All Rights Reserved. Adaptacja PL JMN 1997)readonly def
+/FullName(PLRoman10-Regular)readonly def
+/FamilyName(PLRoman10)readonly def
+/Weight(Normal)readonly def
+/isFixedPitch false def
+/ItalicAngle 0 def
+/UnderlinePosition -146 def
+/UnderlineThickness 40 def
+end readonly def
+/FontName /PLRoman10-Regular def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/StrokeWidth 0 def
+/FontMatrix[0.001 0 0 0.001 0 0]readonly def
+%/UniqueID 0 def
+/FontBBox{-40 -250 1009 912}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0525392EECAC163E584A9104D99AD0BC
+1B1844A0E222653FA481B8809B26A46F4C483A5D7E95816EA6582584156CFEDE
+B994ADCFF4645140E3617E4D7E1B0E4541CB9F562E55829B4DD880AABE2229E9
+4A9FA259A734D29BBA91BA1E2055CBEA4339BCBFF98D32CEFF11F296225CAABA
+DCA10577A5D431B714726C1278D8101ABD1BD8D0BD0174FFF9148F8C61C241D9
+2AD360A28616CB4A0670C1BF13E40F36AEF0A4DD20E57977ACD8549245C478D3
+847EB8A0CFA7CE67B5ECA4F182C85F02E26380FDDA459734CFB07F5D3EF76DF8
+B0B6ED087E15B9FBCC3B3448F1A3D1F9190CF7B9AF9453489A6954042CEE8CDC
+0776D2E062CCBA3EA49E20BC847D71571B571F981004B6A0E1FCF9F993344AF9
+A5C913D4DBB04D8DA0B3061FF90803F49CEE5174268D51E1186D639852E46A1F
+D4069008ABD3765A006B11572C9BA66662EFA0E710E229F2202A1BFE48F75DBA
+2FC2A41C494029A55990E51A7A0393994D28358536194716F19186198704C178
+C75F7C2CD3BBA670C623A0469010A36F8C813E334065DD8FEF5F9ECD30C9DAE5
+F4B7D24209F4D5E9371D8F37AC24949376CCDEC69AE3DE6D901AA4EF5690A21C
+4CE6EDF6E48B9AB1A57F10F03083BB89F311F30BEEA87416E0D16129C60E2669
+45D9077600B03DFEFD1C4E9301ACECA89492A161AED9AFB1B259A7B19DC09BD4
+D0FC8AFBF4EE5E7A2CE280328B5DB6C18852EAAA0B86CD121E11712C9DB2DD05
+1A85066E4C8A831785480A2DFEF409AC79B9EFF2FD4A5C7FCDDEEF5C791A341A
+949FB7671F3DCB141F5395AD9CB286C8B6C0725F3100E650C89539B2AF2E61A6
+2B64A00691C60947DAA664E4646B8F09669DDCB94F7ACDB29826C09D16AB4F43
+972FF957469563D0C9922640E5FAE583B53BF3E745C7C96F9B7010371E9BD19A
+71244D1C6795BEDABC7C47532B4B80F77BF6EE43CFD08C950E719066FF7CD953
+856542DDB97C686FC32389A0081A6846E796269C90FFA27C5A51513DF558A8B4
+99C7B6158E517606AE4A6A86F7EECC222CA705C035DC49777BD5D2C9B8E295CA
+FE8CB6024D40E18F1FCC7BAC5F87330C9C40B2123936DBF7D6E0C043CD6D918C
+8C67320F67C68DAE93DEB86AB350C47262033C9FAAF70818A5D7F8B72134B62A
+AAD92F23C66BD8C217B0CB4310039F0917DE40B5AB834A276E31B6EF8785AFFD
+0AE83089985D38C578EFE0B2F85E94E9F28134691588EBD908411036E974E512
+71CC0063DA24EED171179933973AE6D78E6DCD1BD872B08567D66421C3F8D00B
+0082A9CC279C47C863FB0F906C8A37B82E3DE8401D69391E55590D512BCC84C6
+59E06B2F8407B51B983FB76F571DC28E809F4BF0BDD676AD4FE71C0D49B5278E
+1BE5859B9D7D602DBC212AF23A97E281E39E68B80534BF71185D838E564A9DA1
+858C6D43BCA16F7DB74AF6D8B7583DA8B560CFEFFD5FE0A665E590FD8DB06C90
+9001288FB61B61C6631B40A686A52C93BCF81D3522518E6F4D1336298BEB1309
+D5313DDDAE77C7EDC2C01CC6D24E50F93B44605F41C9F92E6046241B48399D31
+48AB83A323675CCF6E56386C460CBAC48646408B9D35CCB3ED7E2D4540031BB0
+990F9918EDD4A9F45E13CAD5624115DD269CA344EADB4FF27C763A6E1A4628B2
+C011EB11C8B451D87CB0F5BDAD1CB1F65A6B2EA9EC0111D574BA4192FAE078D5
+DB276CEEA8E344D59FA04D1743B0445E2BF9764A594B1F458F9F148CE480314E
+BE6ED76A3C8C41B013E56246C51B1558ACA5E0047A2EB6FED9A8F6AC625547B3
+06482584CDE835E0E10462A1F245381836712F4114B87C19A431F3AC4F69A84E
+19A0CD8F3AA627419FB1001B13E5263DA6B41BF42430C43E2ACD89BA1F5C253F
+B87444F07DE38907B58D17A9BF7B55736D607CA8EB562EA58298B3E3D2A5F771
+911A2DD32E88D4F181ACB11681B3993696664E76EB9804C06063D007CF36EC3C
+75F72A32208E50AFE57B3241E1C59A1A9EC693AC79DA80FBF5EE77770B9F012D
+C8BCCD7B45E7327251B0A0C1616A741331D5E456D2DE750086910D16FD2F315C
+72B31AB0E0721BF6B14C2F3295817E73A24020E65A9BD114ECEAE9E2018FFE5B
+97E3F9B57EC471115B84117638778AADBEB1FD0E5F2B9AE9468DEFC7A4E25FB4
+C8DC685582EAFFDEA1A157BEA4E695EBA28EFA757B58111136E78A0F241B505B
+2A5D4F2146422C130E93CB13D0ACAC77D04CE1DBE33ADA0D3B051D9375381A1E
+0AB6224C117FE4CAAB7A0A0CF644408CFD33EA035C27AA4FC1D718EF3FAA5A3B
+4643E1D8A19BBF1E1FF19BD0B3277A85DEB4062E5D6F6EAD6CE7A4023D6E0192
+1ACD3C48F937880B6D5DC23F5ED6AD03379E20373C4AF6A699F4C319CE41F5FE
+9113BA3F8F2A0690AD9C9E0C854FAA7A230473BF69CA8BFA161D2A049E862656
+87368475A3873B15A45D75B0B15671B93C815E835BE7EF5ADD47219F12F592FD
+22DB1DC08255EAE618CD26F16BD4CE7F6645D8BAAC838647F2BD6FEC49B2C3BF
+84FAA7F786E08574289BA85FF0466DED2743FC862C057CAE5071C516BBFABB12
+DE585B297E55A609522A90C4D60FB704C5DE06C86869BDE4B8F35C341C90E60D
+B0FC6B0654E77CA2BB35988541C99CC0FFCD61E8E49424F21132794D9A35E64D
+D08DEBD5D1986D9A31472A5366140A675F62AFE849C8F14B98CC255735AF2F9D
+CCC97C6B9A2B857EDA0C60CAA9659600B0A889A7C1F039CF76DA9ABCF82ADB06
+C3155277E02ACCC3A523B1DFEB9B86D5E9D423EA39E046EBD6B23B98717C2234
+DFE67384E619A5DAA1BB4B059CC82F94B2AC6F11D99FC74ABDDF3D15AD474C61
+894BCD0043968B640B25AE94683447D93F98308CC588D457B18050702BBBC5DF
+FA81E87141280F66D638BB3B9406917E1E7ECA1CB0DD465D5E3F7E0696D0AE90
+B9F3164E2A29FBB7BFDF5D0A48DEAAA63DC107C8352E4BD2361E66C3A58021D6
+6F223A6ED2EAE1534A139466F7F62EFEB81ACE4ABFBFA159B07ED5C93D976CCA
+D20691B072DA279221682416405BCCE8D4187F05E429ECAC5780EB693B9350DB
+57C7F73CB9C48A0B985C85E5A29E58326F64CEF8D2A2D56AAF4EFEA97553935D
+448D505F73A5206C64EAB478BB22982B3551649724D35DF8F12E312D993C61A6
+BB6E9C8149EC3551FB0EDEA669E0D4E0B323FDEE31310BB47122439547FB155A
+AA3970D82BF3FA4DC4369115AF77F8A49579DDF488E5850C8DD4EB768A107FD1
+1D6C02F967E4972D6BC1206AE144FDA6C03120F6891A4FFC14BA96475D3AF367
+496E34A2E63D693D006CF3E86F4D8274594181BB8AD7FDB6C541B3D526D321A3
+B25754F0FBB4B98CDD23C4D7A4185722A4CD1DF2EFBC6462CA4B3F7693FE4708
+FA0799E6322D443DD7D34EBB60CB9F823AFB9A0AE11F4124E4CE6FB1E7E6B5ED
+862302DF7CDA597A49335CC40D38644E0BCC3E3E57052444394E46201B34B583
+A55D565C0210871AD97A31979E71EB80DA85B9AA0C6DC537C7DB1DDDF75353BF
+0CB3E7444A286C3272C05FB96EEEF159DC33AB828E9D80023BAC482F8B93AD55
+F1D27AD21B50C64747E1C99FB6B98A20C530C9BD04C4512CC1C67243B29E58C9
+B86656C5F1C8B98E2250014139A2A9511094B7D2DB2C726B63EF3A983B84C7B0
+62CF1C4F391CD65F797C3D0219ED495FE30A88149C84C2ACE7CA99C10A9B7550
+B239E8B5BF060558EF733D0BA0F06289D19C9765FB5D92581B570CA2EC86F170
+3A4DF4C12C78DFA328105490615328AAB0231173D3D82A3D0635C98A57B5FC17
+9775121E940B83EC26AB75E5BF34FF593DF7B97A8B133BA65A3DAD459F9B8816
+9A8AE46A4FC2842BF6F964C0FBC114419BDC00CF57932BA4C9DB0F15FAFF7CBD
+701050A1DB9CFFBA1A6971678EA3492A1641851FF8280D2C1BDD3A42D5719BE5
+1EA4DED86D7A4B06AE62A2771727EDE77C12A19A316267E1B0C1452F196D8B20
+6ED266C2A411D1447846216EAA9017CEAD458F7A4D93E6230237AD87FB5E3C70
+7D6C1FB41BA747BCD98377DE82C1F71F958F1A6B52D6FF2F1F28DE13E4B52524
+5B82998FD8C09EDA896ECFFB9944EB7EEADEC7BD012E823A34E290454D6D6F0B
+20513119A844E6A8FB598FE53D06AF9CA3E4FEB31389910EA623CA02C2C98D02
+ACF9EDFFD70D7EF21FC21CBED006BB36BAF7F46022AB0919886C154CEFB4D82E
+EA79856D927069B08A4EDB0707BAB6C0E886FF45165E55F7518429B69EF95917
+64BBD23EA7BC464E3BA579A8F3E8DAE7F579B28640470608F44538ED3C5E9E5A
+35D543A977EBB86480FA9072E4E58620CFFBC8C6E51250F22B8626D812E03D1E
+C098C144D60A4400399B74FC84F60779F7A7860379D847EF9A5245AE6897ED24
+4DA0E4AB11C078B7D4EF0B1211236D9752D9686BF8FDE9E3BE549209591265FB
+006B41EEEFCF837941C0D958BC17B3EDB6200034954AA910243AD968B0C259DF
+ED1E1C0DDB2999F26EED9D32C373613F2E788C56EB0B50909123BCA3DDFA0ADC
+2283C623DE81693159167E8C3DA38049BD66A3B6DFD76B716299A87FBF268C15
+83F49A74CF39D369C449686F7A74D985BEC536E96633BEA4CBC1B060F4B4BD81
+EBED69E888FBA1E2544DE0BB152A0901F7BF080687AEA01E611D2A9C5C0AB254
+86AC71014AF1E2168C488F11D9AEF8DBAB34EE26443381C8DB3FA8E9C66C5154
+A211D8F0B67EB861F1B4CCA12CF4B24818A5675A46F39F52077A8589EFA48FD7
+D66FA9DB00F6C558E5BC5668A2A524C6D1CCA0DB0CB9D110A8BAF38856297391
+7F554A38570C82707A727B4F38BF32513D5EAD289F209C4E4A3C202A37840905
+4CF5621B38147EAD5998CE615829401D2A36C026389F840C8578B6D7B384C4A0
+C7E5795345F31C4B7933B4E82623DBED8135D5DDBB4124C19325430B6C2F801B
+2AB47AC7FA2645FB9444F2C07CB7B9CBF2CC354C1B0371A976F0AF6125EF2A39
+AC82D44CEEAB043429CFBA88DF8D87F32A7BB5B06672CAD5E073D10EC5CF566B
+A5D32733B6EA08A26163A6DD3B7F2DF84E708318F4FCFC42D1B2C4274B6C0F87
+8942C47687B430D76693C8E5802D85F42A98D7B03617FC2E2F4134AAAA70D4FD
+962E477F8CB7ABD8D3AE38A9804EB69286B17E34E40EBB657B75FE0EFE70CA9F
+3CA1DAB4094E9E9616BC8A57E24F836CB6EB788ACD2FB347260CBC0E82213C70
+F87A96421CCFE075A774ABB5FFB92FD9E1417E02C197B010E470D166459380A5
+08DB607C5BFD99A05B08C8FA4034A89D71013C889A519B13FCE4F7F2B47010EA
+A2E00F54E619E4E3F439AED02288EE6F1D9DAB1935A620BC89DA1CBE24B60A06
+1F7489E2A0997B704ABAF6EA68ACA35EA4550BE4DAEE9941D44D8DB9838FA3B5
+4439E0BA329AE76F2C1DE9FC980F4EE28732ECC969F983EA236E20C260DA37FE
+D1316088E59E34413B4EA27C60C6CD394D7C4B65B30DDB72F10385C4F945F89E
+9AEB9FA7473A2EBB10C17DF9C1BBC150E0933A11BA9D3838B433765CC86429BE
+FF3952918F80A4C2EACE08F35C72E4DACF93BC085DF99A963886D696C3FA34DD
+2F9ED0316BA7F79C65B235A5E16055DBA539CBA73FACC5D089AF1685F2E7B545
+C8A993519A9571D680AD687DE340AA5780160FD615B9A7F40F4DD67702B5749F
+DC61D95A044104D28DC2816C7FDC815FE8996EFC0A63E473238F8D0D9E80956D
+0373B89C844A610AD58F47531C43A95984A61BAF224E6F019DDCF87444EC6CF2
+5A029B25FCA4E0F2786270F4A1339E0441A402CE425F49C65EDF59B435F979F6
+6B9837FC27F39EF1EA6EB84F46ABD78DAB385970E5753599EC0DDC420692AB61
+5DE580010E1C567252015E5238F38AA5A86C887742EE60A9D67E9B6950FA616B
+B062091FB870A343BF2840778B6C1B613FDF2B68CCA040711859C68A07822E06
+59637A9837D9330DB6278862DE187EB429B7B9E227C74E8E5AFBCFD91900B198
+CBBCD16D9C4438229CEC8C479F309C598599347C33CEFF0527C78CA55EAEBB58
+86449C5AF2DA372AFD78DE13FCC9A2CF9701FD2D9533DDB30B64AE7526626272
+C637A81BAEECB5F5DE12B5A6EC4A0DEF7F699390B56A06E5923F6F691B96CC0E
+05B087F2BD2DEE1D3D2A68F5216F327750A23EA6BB45EBD86D7109546579A7A0
+399FBFBF102973F836E02C11AF819B0FD1B5FF4A2747535B5E40A6FD2DE5B292
+D9DB361100ABE6695050A6EFC8C904519B84496F1726F8FBD95DC5D29ACE08B6
+A0C021CF6979E96945C82041DEBCB1FC8F4F9DC8B7A3199D1B404F4683E47F38
+03F15CBB59C02FD8CB926AE8E7EF965438A14779033D36B84A272257DF17A6A1
+86E45EF7A12314F305A8D770A357E3883A498B114BD14CC9FE5C5D22B7BD53E7
+6EA596F19CDD943E91CD012B1B965C91EEEFC9B0D28EEF35BC570326D19F8F88
+8F7247A9AA0A054BA9F428C8FAD7C18467B9B0FD9C35561696958DD7D187D6DE
+9DAEBC300A638507D0D9C6ED0CE2AD2EAEC84A33201B140514366F2123DD4F51
+9643D621BD4F8167897A34138E89415B6BE7EA8B1EAD26DC83E88F12E5DED1A8
+B39EAF75D9E8C078ACAC400D2AB4949B881181642CB1F664406FC6319DFA90F8
+E42D459D185021A11CE4C25D6FD17FE0996A8DC5E9C321C35FC86606C0E0C84D
+6EA44804FEC9F3CADABCBDC8680CFAFB608A17338E92F2A51E166EB3E28291A5
+C46DD9289BAB15D1FFD954378ADD8A31A0090A7C0F7A286753AC144965B6C1E0
+DA15D8630A1F93AD0FCF11CC5A13B3C602E26C5C41EE04BD765306D08A74DB5D
+7FB8E31149EB6617AF2D625EE88279AF83CE380E6847B0959F418D6588F3B5F0
+7315EADBC698EE308926ACB783A4385C7AD1BA868C3254916BED082BA7FD5CDD
+A831DCA50BA4440178B5EF841A7ADB4387BFEA65EFCEF90BFD7BF8EB96E9256E
+BCA72A6720AE6A6BD57EE399C91C5BA4741B716E8D1D1C25DA73365DFFB69DCD
+1606D77F42783908A42C4D7CBB37F15CEC262F87D65926B71F7591074F797AA9
+9E55CB7236EEEB14375D6DB6DD263A23E8FB99B541BCA24600000742DE7361A8
+D5D4D3E69BA69439D7F4B21BA79E98A0AFF80796DCF99E4B7081EC975ABAA648
+AE15FF9A90DEC4F7AE7F4E063A64CA224FB7C711B68D61B7B626C4D532F05C52
+2DA1810E2353F352C8CE0C6794B253F4F8134E1B35956F6C2C2C8BD574A5D877
+2088360FD5998C0DD1AF1FD93DABD619F94F0237F1891E70B91DCA12879D021E
+AA8300D8C91355F78AB1C531331CF12AB4059AA1278E6F6470A7107259E83265
+0B394D2E65346D59CF96CBEE0B868365B900C45F16583F57AA425F81CB85C6C0
+A15D1EEB87B5F27BA0651E024929F778AD5F4D24C24648E5EF62F869CFAF548F
+70DBF0768D2437F4652FC3F2D19B7DEE179E9AB651FE9FE5B1B565CC1C22A83B
+B45CF8F2860561A50966B57C14C26611DA251267D6EBA93BC2E2AA54E6E38E71
+800D53D45AB822987CA15F1861AD739202021F692FFC7C22D05627DC3BA0BF73
+667E832047EC3D7B05348587FE150B177C29BA56033A2BA7F77886E7F5C52C19
+18A1DC87F84ACD33D7AE582B3BB98E0FEB74C8BDB3F7E1011574D94B0429AF18
+0706E9393C95FF16FC2515B4D3E75A81905D3CF1898340CEF4B112E776852E31
+AF8787CC19DD9D95152C21F7B8F3F9876CBC5161569678ADF633ABD99C9B75C0
+E7D5C99562EBC9D7E87A768516CC9208E4220B0460BF86519DE608E636D07C76
+C628A1C9D632E2B07C7D96A59B53020EB8080B4064B58A7EAA6A7CAB9C27E33F
+B90456642714D9BDF20A3EDE90982929BFE5451387A24E7843911ACD5FD2DD65
+6343E09D0ABECD090761F71A37543E3387169C29CC311F7791C847AB8E361E1D
+A6BD35477799F7B532647689F1F2BF210E0C221A7317269086D50B947D0AB11C
+6601DD166A0E46E311DC426A696AD6E040F3F7E42312F4FCAE6E619D6AF56DBB
+6BCAFF13E0A311752BD2E1051DF5C84AD4F7DB1DE703DC5576ED48F25F94493E
+0223A971F5C308A9C2828811407A81DAC1CBC9EE116C26308DF463C88E1730DB
+448467B6252BA3AE494FEF32B56C20632C4A808F1EF5527E6DD5DF0A6A0E8ED8
+DA8A8A2DDB228549723CAB1128B900D04C4B9965AB8F84A862624ED7D5C0E8F5
+3BC157D08BABB02B5B1AE4B5ED70D2464BA6BFEDDDA813E12027067B8BA56F9B
+B6F232903C039B06645E86888C6653667EB20387A4E0494078C48984B9C8E36E
+1C8BC0EFF9FFA10C43DF8C6974CA3C5FBCC171D7A8C1B9E6C12B0C577DF22473
+C89EDB3F662DF62237F211FA5D85386432E0E8C26C8BEACED720F5538B6CD3CA
+431DC00A4D1B9B04853292FC85A1BDD4F847458027CC4D5F00CF078AEEF66591
+140F640B559EC6D08C216C1F313B0613D157310C7C06520CD574A2DC3D49F280
+16B446DB79B3EC8A6EB76C83D31DFD7B24CE20A9E7D22013BE17CEF5638A8CFF
+0128382D2BA0C8F981879AB07A8EF80104C73C8041A1493AD8C6A8BD172C60DD
+3FF8C6A44A6090ABF8A8F65AA9ACAE4BCCA3934A920BA6D3BCAC304430CD4094
+E3C061715AE130EFE498C9AD0B6923B65BD71514FD00B82109FCA34BF375F4DF
+E63E916EB4C63A7D49BB0E12A90CDC2333EFCD105F783314EC7A9D24EF35FF22
+1F929EE0FAE6175AA50442C3D9AE76259C18D1316ACD791BBA960FE22BFB735D
+DBB49B72E210001FF808B42A745A3644D631C41E2B8718D5FB22321A531185DE
+528791D0994BCDD2934D1EDD52EA68A03F37F3C0F8C8B4CAD98D7505EFC9934C
+FF59958476211E793D254FFBB82E8A7153F0FCE79C75C506E215858D637C0050
+2F452F8CE7C08AE2487C43C0297E7F19CA5421911E614BA577EDDF55E1B9A456
+CFB82628A56311A3B2918671BA47419424C0F23D6A22972E62EAB99A5F76A9B2
+EB5E657E102E4A8C8DB07BB0C410CEA24A54F85658ED74CF55D85593FB908B76
+9BF409EF64156C79C91B98067B8A55878AF2855B4CDD3892FE10B4D30DDCDBB9
+942372DBDBCCC4F3D5662CB375E1A49E3072EBF05366A8A21B042C27EBEDC753
+80651CC79401BD1F616997DC7E8F2DB14ECFE36AA084F61A5ACD7FB0EC3C041C
+B14B4C19A7FDFA4081A52E5A530C041567A281B0F91DB34779A985959B455507
+8A6B574F706ECB1D0931ABCA8B402DF4537A70593BBB8876991D80C7D1E50C6D
+6C73A2E5A378E78D514FCE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+TeXDict begin 39158280 55380996 1000 600 600 (test.dvi)
+@start /Fa 135[44 60 1[46 32 33 33 1[46 42 46 69 23 2[23
+46 42 25 37 46 37 46 42 12[60 46 12[54 57 19[42 49[{
+ encplrm ReEncodeFont }25 83.022 /PLRoman10-Regular rf
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 166 600 a @beginspecial -9 @llx
+-15 @lly 57 @urx 57 @ury 660 @rwi @setspecial
+%%BeginDocument: test.1
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -9 -15 57 57
+%%Creator: MetaPost
+%%CreationDate: 2005.05.31:1927
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+/MPP 100 dict def
+/MPPshow {exch findfont exch scalefont setfont show}bind def
+/fill { MPP currentgray known
+ { MPP currentgray get setpattern fill } { fill }
+ ifelse } bind def
+/fshow { MPP currentgray known
+ { MPP currentgray get setpattern MPPshow } { MPPshow }
+ ifelse } bind def
+% Pattern:0.8:szachy_i
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [0 0 22.67712 22.67712]
+/XStep 22.67712
+/YStep 22.67712
+/PaintProc { pop
+newpath 0 0 moveto
+11.33856 0 lineto
+11.33856 11.33856 lineto
+0 11.33856 lineto
+ closepath fill
+newpath 11.33856 11.33856 moveto
+22.67712 11.33856 lineto
+22.67712 22.67712 lineto
+11.33856 22.67712 lineto
+ closepath fill
+ } >>
+ matrix makepattern
+/szachy_i exch def
+MPP 0.8 szachy_i put
+% Pattern:0.00003:szachy_ii
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [0 0 17.00784 17.00784]
+/XStep 17.00784
+/YStep 17.00784
+/PaintProc { pop
+ 0.7 setgray
+newpath 0 0 moveto
+8.50392 0 lineto
+8.50392 8.50392 lineto
+0 8.50392 lineto
+ closepath fill
+newpath 8.50392 8.50392 moveto
+17.00784 8.50392 lineto
+17.00784 17.00784 lineto
+8.50392 17.00784 lineto
+ closepath fill
+ } >>
+ matrix makepattern
+/szachy_ii exch def
+MPP 0.00003 szachy_ii put
+ 0.8 setgray
+newpath 30.68597 17.7165 moveto
+27.86662 22.59978 23.22292 26.16232 17.77675 27.62163 curveto
+12.3306 29.08092 6.52776 28.31754 1.64449 25.49818 curveto
+-3.2388 22.67883 -6.80133 18.03514 -8.26064 12.58897 curveto
+-9.71994 7.1428 -8.95654 1.33997 -6.13719 -3.5433 curveto
+-3.31784 -8.42657 1.32587 -11.98912 6.77203 -13.44843 curveto
+12.2182 -14.90771 18.02103 -14.14433 22.9043 -11.32498 curveto
+27.78757 -8.50563 31.35011 -3.86192 32.8094 1.58424 curveto
+34.2687 7.03041 33.50533 12.83324 30.68597 17.7165 curveto closepath fill
+ 0.00003 setgray
+newpath 0 0 moveto
+56.69281 0 lineto
+56.69281 56.69281 lineto
+0 56.69281 lineto
+ closepath fill
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 578 w Fa(Simple)28 b(patterns)166 1674 y
+@beginspecial -43 @llx -43 @lly 71 @urx 71 @ury 1140
+@rwi @setspecial
+%%BeginDocument: test.11
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -43 -43 71 71
+%%Creator: MetaPost
+%%CreationDate: 2005.05.31:1927
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+/MPP 100 dict def
+/MPPshow {exch findfont exch scalefont setfont show}bind def
+/fill { MPP currentgray known
+ { MPP currentgray get setpattern fill } { fill }
+ ifelse } bind def
+/fshow { MPP currentgray known
+ { MPP currentgray get setpattern MPPshow } { MPPshow }
+ ifelse } bind def
+% Pattern:0.00005:checker
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [0 0 5.66928 5.66928]
+/XStep 5.66928
+/YStep 5.66928
+/PaintProc { pop
+newpath 0 0 moveto
+2.83464 0 lineto
+2.83464 2.83464 lineto
+0 2.83464 lineto
+ closepath fill
+newpath 2.83464 2.83464 moveto
+5.66928 2.83464 lineto
+5.66928 5.66928 lineto
+2.83464 5.66928 lineto
+ closepath fill
+ } >>
+[ 1 0 0.17 1 0 0 ] makepattern
+/checker exch def
+MPP 0.00005 checker put
+% Pattern:0.00006:rotated_checker
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-8.01758 0 8.01758 16.03516]
+/XStep 16.03516
+/YStep 16.03516
+/PaintProc { pop
+ 0.7 setgray
+newpath 0 0 moveto
+8.01758 8.01758 lineto
+0 16.03516 lineto
+-8.01758 8.01758 lineto
+ closepath fill
+ } >>
+[ 0.86603 0.5 -0.5 0.86603 0 0 ] makepattern
+/rotated_checker exch def
+MPP 0.00006 rotated_checker put
+ 0.00005 setgray
+newpath 42.51968 0 moveto
+42.51968 11.27742 38.03908 22.0916 30.06534 30.06534 curveto
+22.0916 38.03908 11.27742 42.51968 0 42.51968 curveto
+-11.27742 42.51968 -22.0916 38.03908 -30.06534 30.06534 curveto
+-38.03908 22.0916 -42.51968 11.27742 -42.51968 0 curveto
+-42.51968 -11.27742 -38.03908 -22.0916 -30.06534 -30.06534 curveto
+-22.0916 -38.03908 -11.27742 -42.51968 0 -42.51968 curveto
+11.27742 -42.51968 22.0916 -38.03908 30.06534 -30.06534 curveto
+38.03908 -22.0916 42.51968 -11.27742 42.51968 0 curveto closepath fill
+ 1 setgray
+newpath 70.86613 28.34645 moveto
+70.86613 39.62387 66.38553 50.43805 58.41179 58.41179 curveto
+50.43805 66.38553 39.62387 70.86613 28.34645 70.86613 curveto
+17.06903 70.86613 6.25485 66.38553 -1.71889 58.41179 curveto
+-9.69263 50.43805 -14.17323 39.62387 -14.17323 28.34645 curveto
+-14.17323 17.06903 -9.69263 6.25485 -1.71889 -1.71889 curveto
+6.25485 -9.69263 17.06903 -14.17323 28.34645 -14.17323 curveto
+39.62387 -14.17323 50.43805 -9.69263 58.41179 -1.71889 curveto
+66.38553 6.25485 70.86613 17.06903 70.86613 28.34645 curveto closepath fill
+ 0.00006 setgray
+newpath 70.86613 28.34645 moveto
+70.86613 39.62387 66.38553 50.43805 58.41179 58.41179 curveto
+50.43805 66.38553 39.62387 70.86613 28.34645 70.86613 curveto
+17.06903 70.86613 6.25485 66.38553 -1.71889 58.41179 curveto
+-9.69263 50.43805 -14.17323 39.62387 -14.17323 28.34645 curveto
+-14.17323 17.06903 -9.69263 6.25485 -1.71889 -1.71889 curveto
+6.25485 -9.69263 17.06903 -14.17323 28.34645 -14.17323 curveto
+39.62387 -14.17323 50.43805 -9.69263 58.41179 -1.71889 curveto
+66.38553 6.25485 70.86613 17.06903 70.86613 28.34645 curveto closepath fill
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 978 w(Explicit)f(b)r(ounding)h(b)r(o)n(x)f(and)g
+(transformations)166 2756 y @beginspecial -43 @llx -43
+@lly 72 @urx 72 @ury 1150 @rwi @setspecial
+%%BeginDocument: test.12
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -43 -43 72 72
+%%Creator: MetaPost
+%%CreationDate: 2005.05.31:1927
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+/MPP 100 dict def
+/MPPshow {exch findfont exch scalefont setfont show}bind def
+/fill { MPP currentgray known
+ { MPP currentgray get setpattern fill } { fill }
+ ifelse } bind def
+/fshow { MPP currentgray known
+ { MPP currentgray get setpattern MPPshow } { MPPshow }
+ ifelse } bind def
+% Pattern:0.00008:tt
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-4.00879 0 4.00879 8.01758]
+/XStep 8.81938
+/YStep 5.3451
+/PaintProc { pop
+ 0.5 setgray
+newpath 0 0 moveto
+4.00879 4.00879 lineto
+0 8.01758 lineto
+-4.00879 4.00879 lineto
+ closepath fill
+ } >>
+[ 0.96603 1.5 -0.3268 2.59808 0 0 ] makepattern
+/tt exch def
+MPP 0.00008 tt put
+% Pattern:0.0001:tr
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [0 0 11.33856 22.67712]
+/XStep 13.60625
+/YStep 27.21248
+/PaintProc { pop
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 5.66928 0 moveto
+11.33856 11.33856 lineto
+5.66928 22.67712 lineto
+0 11.33856 lineto
+ closepath stroke
+ 1 setlinecap
+newpath 11.33856 11.33856 moveto
+0 11.33856 lineto stroke
+newpath 0 0 moveto
+11.33856 0 lineto stroke
+newpath 11.33856 22.67712 moveto
+0 22.67712 lineto stroke
+ } >>
+[ 0.98163 0.19081 -0.09264 1.00072 0 0 ] makepattern
+/tr exch def
+MPP 0.0001 tr put
+ 0.00008 setgray
+newpath 42.51968 0 moveto
+42.51968 11.27742 38.03908 22.0916 30.06534 30.06534 curveto
+22.0916 38.03908 11.27742 42.51968 0 42.51968 curveto
+-11.27742 42.51968 -22.0916 38.03908 -30.06534 30.06534 curveto
+-38.03908 22.0916 -42.51968 11.27742 -42.51968 0 curveto
+-42.51968 -11.27742 -38.03908 -22.0916 -30.06534 -30.06534 curveto
+-22.0916 -38.03908 -11.27742 -42.51968 0 -42.51968 curveto
+11.27742 -42.51968 22.0916 -38.03908 30.06534 -30.06534 curveto
+38.03908 -22.0916 42.51968 -11.27742 42.51968 0 curveto closepath fill
+ 0 setgray 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 42.51968 0 moveto
+42.51968 11.27742 38.03908 22.0916 30.06534 30.06534 curveto
+22.0916 38.03908 11.27742 42.51968 0 42.51968 curveto
+-11.27742 42.51968 -22.0916 38.03908 -30.06534 30.06534 curveto
+-38.03908 22.0916 -42.51968 11.27742 -42.51968 0 curveto
+-42.51968 -11.27742 -38.03908 -22.0916 -30.06534 -30.06534 curveto
+-22.0916 -38.03908 -11.27742 -42.51968 0 -42.51968 curveto
+11.27742 -42.51968 22.0916 -38.03908 30.06534 -30.06534 curveto
+38.03908 -22.0916 42.51968 -11.27742 42.51968 0 curveto closepath stroke
+ 1 setgray
+newpath 70.86613 28.34645 moveto
+70.86613 39.62387 66.38553 50.43805 58.41179 58.41179 curveto
+50.43805 66.38553 39.62387 70.86613 28.34645 70.86613 curveto
+17.06903 70.86613 6.25485 66.38553 -1.71889 58.41179 curveto
+-9.69263 50.43805 -14.17323 39.62387 -14.17323 28.34645 curveto
+-14.17323 17.06903 -9.69263 6.25485 -1.71889 -1.71889 curveto
+6.25485 -9.69263 17.06903 -14.17323 28.34645 -14.17323 curveto
+39.62387 -14.17323 50.43805 -9.69263 58.41179 -1.71889 curveto
+66.38553 6.25485 70.86613 17.06903 70.86613 28.34645 curveto closepath fill
+ 0.0001 setgray
+newpath 70.86613 28.34645 moveto
+70.86613 39.62387 66.38553 50.43805 58.41179 58.41179 curveto
+50.43805 66.38553 39.62387 70.86613 28.34645 70.86613 curveto
+17.06903 70.86613 6.25485 66.38553 -1.71889 58.41179 curveto
+-9.69263 50.43805 -14.17323 39.62387 -14.17323 28.34645 curveto
+-14.17323 17.06903 -9.69263 6.25485 -1.71889 -1.71889 curveto
+6.25485 -9.69263 17.06903 -14.17323 28.34645 -14.17323 curveto
+39.62387 -14.17323 50.43805 -9.69263 58.41179 -1.71889 curveto
+66.38553 6.25485 70.86613 17.06903 70.86613 28.34645 curveto closepath fill
+ 0 setgray
+newpath 70.86613 28.34645 moveto
+70.86613 39.62387 66.38553 50.43805 58.41179 58.41179 curveto
+50.43805 66.38553 39.62387 70.86613 28.34645 70.86613 curveto
+17.06903 70.86613 6.25485 66.38553 -1.71889 58.41179 curveto
+-9.69263 50.43805 -14.17323 39.62387 -14.17323 28.34645 curveto
+-14.17323 17.06903 -9.69263 6.25485 -1.71889 -1.71889 curveto
+6.25485 -9.69263 17.06903 -14.17323 28.34645 -14.17323 curveto
+39.62387 -14.17323 50.43805 -9.69263 58.41179 -1.71889 curveto
+66.38553 6.25485 70.86613 17.06903 70.86613 28.34645 curveto closepath stroke
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 986 w(T)-7 b(ransformations)25 b(and)j(cell)g(spacing)166
+3397 y @beginspecial -125 @llx -31 @lly 125 @urx 31 @ury
+2500 @rwi @setspecial
+%%BeginDocument: test.13
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -125 -31 125 31
+%%Creator: MetaPost
+%%CreationDate: 2005.05.31:1927
+%%Pages: 1
+%%DocumentFonts: Times-Roman
+ /ptmr8r /Times-Roman def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndProlog
+%%Page: 1 1
+/MPP 100 dict def
+/MPPshow {exch findfont exch scalefont setfont show}bind def
+/fill { MPP currentgray known
+ { MPP currentgray get setpattern fill } { fill }
+ ifelse } bind def
+/fshow { MPP currentgray known
+ { MPP currentgray get setpattern MPPshow } { MPPshow }
+ ifelse } bind def
+% Pattern:0.00012:ll
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-1 0 1 4]
+/XStep 2
+/YStep 4
+/PaintProc { pop
+ 0.3 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 4 lineto stroke
+ } >>
+[ 0.7071 -0.7071 0.7071 0.7071 0 0 ] makepattern
+/ll exch def
+MPP 0.00012 ll put
+ 0.00012 setgray
+-124.542 -30.08174 moveto
+(ABCD) ptmr8r 89.66382 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2111 w(Filling)g(lab)r(el)166 4555 y @beginspecial
+0 @llx -2 @lly 275 @urx 122 @ury 2750 @rwi @setspecial
+%%BeginDocument: test.14
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 -2 275 122
+%%Creator: MetaPost
+%%CreationDate: 2005.05.31:1927
+%%Pages: 1
+%%DocumentFonts: Times-BoldItalic
+ /ptmbi8r /Times-BoldItalic def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndProlog
+%%Page: 1 1
+/MPP 100 dict def
+/MPPshow {exch findfont exch scalefont setfont show}bind def
+/fill { MPP currentgray known
+ { MPP currentgray get setpattern fill } { fill }
+ ifelse } bind def
+/fshow { MPP currentgray known
+ { MPP currentgray get setpattern MPPshow } { MPPshow }
+ ifelse } bind def
+% Pattern:0.00015:literki
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-4.70235 -1.7061 4.70235 1.7061]
+/XStep 9.4047
+/YStep 3.4122
+ /ptmr8r /Times-Roman def
+/PaintProc { pop
+-4.70235 -1.6712 moveto
+(abcd) ptmr8r 4.98132 fshow
+ } >>
+[ 1 0 0.17 1 0 0 ] makepattern
+/literki exch def
+MPP 0.00015 literki put
+% Pattern:0.00005:checker
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [0 0 5.66928 5.66928]
+/XStep 5.66928
+/YStep 5.66928
+/PaintProc { pop
+newpath 0 0 moveto
+2.83464 0 lineto
+2.83464 2.83464 lineto
+0 2.83464 lineto
+ closepath fill
+newpath 2.83464 2.83464 moveto
+5.66928 2.83464 lineto
+5.66928 5.66928 lineto
+2.83464 5.66928 lineto
+ closepath fill
+ } >>
+[ 1 0 0.17 1 0 0 ] makepattern
+/checker exch def
+MPP 0.00005 checker put
+% Pattern:0.00014:lll
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-1 0 1 4]
+/XStep 2
+/YStep 4
+/PaintProc { pop
+ 0.3 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 4 lineto stroke
+ } >>
+[ 0.7071 0.7071 -0.7071 0.7071 0 0 ] makepattern
+/lll exch def
+MPP 0.00014 lll put
+% Pattern:0.00012:ll
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-1 0 1 4]
+/XStep 2
+/YStep 4
+/PaintProc { pop
+ 0.3 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash
+ 1 setlinecap 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+0 4 lineto stroke
+ } >>
+[ 0.7071 -0.7071 0.7071 0.7071 0 0 ] makepattern
+/ll exch def
+MPP 0.00012 ll put
+% Pattern:0.00017:cm_literki
+<< /PaintType 1 /PatternType 1 /TilingType 1
+/BBox [-27.54985 -2.17735 27.54985 2.17734]
+/XStep 55.0997
+/YStep 4.35469
+ /cmr5 /CMR5 def
+/PaintProc { pop
+-27.54985 -1.20876 moveto
+(xyz) cmr5 4.98132 fshow
+-15.02725 -1.20876 moveto
+(XYZ) cmr5 4.98132 fshow
+1.17615 -1.20876 moveto
+(ZYX) cmr5 4.98132 fshow
+17.37955 -1.20876 moveto
+(zyx) cmr5 4.98132 fshow
+ } >>
+[ 1 0 0.17 1 0 0 ] makepattern
+/cm_literki exch def
+MPP 0.00017 cm_literki put
+ 0.00015 setgray
+0 0 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 1 setgray
+10 20 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 0.00005 setgray
+10 20 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 1 setgray
+20 40 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 0.00014 setgray
+20 40 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 0.00012 setgray
+20 40 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 1 setgray
+30 60 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+ 0.00017 setgray
+30 60 moveto
+(ABCD) ptmbi8r 89.66382 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 2319 w(Filling)g(text)g(and)g(with)g(text)1929
+5539 y(1)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mpattern/mpattern_test.tex b/graphics/metapost/contrib/macros/mpattern/mpattern_test.tex
new file mode 100644
index 0000000000..3f3886958a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/mpattern_test.tex
@@ -0,0 +1,22 @@
+\input epsf
+
+\epsfbox{test.1}
+Simple patterns
+\bigskip
+
+\epsfbox{test.11}
+Explicit bounding box and transformations
+\bigskip
+
+\epsfbox{test.12}
+Transformations and cell spacing
+\bigskip
+
+\epsfbox{test.13}
+Filling label
+\bigskip
+
+\epsfbox{test.14}
+Filling text and with text
+
+\bye
diff --git a/graphics/metapost/contrib/macros/mpattern/test.mp b/graphics/metapost/contrib/macros/mpattern/test.mp
new file mode 100644
index 0000000000..a6cd1a8f86
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpattern/test.mp
@@ -0,0 +1,146 @@
+input mpattern;
+prologues:=1;
+
+beginpattern(szachy_i);
+ patterncolor(.8);
+ fill unitsquare scaled 4mm;
+ fill unitsquare scaled 4mm shifted (4mm,4mm);
+endpattern;
+
+beginpattern(szachy_ii);
+ fill unitsquare scaled 3mm withcolor .7white;
+ fill unitsquare scaled 3mm shifted (3mm,3mm) withcolor .7white;
+endpattern;
+
+beginfig(1);
+ fill fullcircle scaled 30mm withpattern szachy_i;
+
+ picture q;
+ q:=currentpicture; clearit;
+
+ draw q shifted (10mm*right) rotated 30 scaled .5;
+
+ fill unitsquare scaled 20mm withpattern szachy_ii;
+endfig;
+
+beginpattern(checker);
+ u:=1mm;
+ fill unitsquare scaled u;
+ fill unitsquare scaled u shifted (u,u);
+ patternbbox(0,0,2u,2u);
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginpattern(rotated_checker);
+ fill unitsquare scaled 4mm rotated 45 withcolor .7white;
+ patterntransform(identity rotated 30);
+endpattern;
+
+beginfig(11);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern checker;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern rotated_checker;
+endfig;
+
+beginpattern(tt);
+ fill unitsquare scaled 2mm rotated 45 withcolor .5white;
+ z1=llcorner currentpicture;
+ z2=lrcorner currentpicture;
+ z3=urcorner currentpicture;
+ z4=ulcorner currentpicture;
+% draw z1--z2--z3--z4--cycle;
+ patterntransform(identity rotated 30 slanted .2 yscaled 3);
+ patternstep((1.1*xpart(urcorner currentpicture-ulcorner currentpicture),
+ 2/3*xpart(urcorner currentpicture-ulcorner currentpicture)));
+endpattern;
+
+beginpattern(ttt);
+ fill unitsquare scaled 2mm rotated 45 withcolor .5white;
+ z1=llcorner currentpicture;
+ z2=lrcorner currentpicture;
+ z3=urcorner currentpicture;
+ z4=ulcorner currentpicture;
+% draw z1--z2--z3--z4--cycle;
+ patterntransform(identity rotated 30 slanted .2);
+ patternstep((1.1*xpart(urcorner currentpicture-ulcorner currentpicture),
+ 2/3*xpart(urcorner currentpicture-ulcorner currentpicture)));
+endpattern;
+
+beginpattern(tr);
+ u:=4mm;
+ z1=(0,0);
+ z2=(u,0);
+ z3=(u,2u);
+ z4=(0,2u);
+ z12=.5[z1,z2];
+ z23=.5[z2,z3];
+ z34=.5[z3,z4];
+ z41=.5[z4,z1];
+ draw z12--z23--z34--z41--cycle;
+ draw z23--z41;
+ draw z1--z2;
+ draw z3--z4;
+ patternbbox(z1,z3);
+ patterntransform(identity slanted .1 rotated 11);
+ patternstep(1.2(x2-x1),1.2(y3-y1));
+endpattern;
+
+beginfig(12);
+ path p;
+ z1=(1cm,1cm);
+ p=fullcircle scaled 3cm;
+ fill p withpattern tt;
+ draw p;
+ unfill p shifted z1;
+ fill p shifted z1 withpattern tr;
+ draw p shifted z1;
+endfig;
+
+beginpattern(ll);
+ pickup pencircle scaled .3;
+ draw origin--4up;
+ patternbbox(left,4up+right);
+ patterntransform(identity rotated -45);
+endpattern;
+
+beginpattern(lll);
+ pickup pencircle scaled .3;
+ draw origin--4up;
+ patternbbox(left,4up+right);
+ patterntransform(identity rotated 45);
+endpattern;
+
+beginpattern(literki);
+ label(btex \font\q=ptmr8r at 5pt\q abcd etex,origin);
+ z1=ulcorner currentpicture;
+ z2=urcorner currentpicture;
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginpattern(cm_literki);
+ label(btex \font\q=cmr5\q xyz XYZ ZYX zyx etex,origin);
+ z1=ulcorner currentpicture;
+ z2=urcorner currentpicture;
+ patterntransform(identity slanted .17);
+endpattern;
+
+beginfig(13);
+ label(btex \font\q=ptmr8r at 90pt\q ABCD etex, origin) withpattern ll;
+endfig;
+
+beginfig(14);
+ picture a; a=btex \font\q=ptmbi8r at 90pt\q ABCD etex;
+ draw a withpattern literki;
+ undraw a shifted (20up+10right);
+ draw a shifted (20up+10right) withpattern checker;
+ undraw a shifted (40up+20right);
+ draw a shifted (40up+20right) withpattern lll;
+ draw a shifted (40up+20right) withpattern ll;
+ undraw a shifted (60up+30right);
+ draw a shifted (60up+30right) withpattern cm_literki;
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/mpcolornames/README b/graphics/metapost/contrib/macros/mpcolornames/README
new file mode 120000
index 0000000000..bb9f5a9271
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/README
@@ -0,0 +1 @@
+doc/metapost/mpcolornames/README \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/CHANGES b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/CHANGES
new file mode 100644
index 0000000000..7a17a44ea4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/CHANGES
@@ -0,0 +1,35 @@
+# Changes
+
+## v0.20 (2011-07-14)
+
+* Change package name: `colordef` => `mpcolornames`.
+
+* First upload to CTAN.
+
+* Color specification files are translated into MetaPost code via
+ scripts.
+
+* Remove 'smart colors'.
+
+* Remove generalization of `background`.
+
+
+## v0.15 (2009-02-10)
+
+* Rename color model contants.
+
+* Show proof tables.
+
+
+## v0.14 (2009-02-05)
+
+* First public preview.
+
+
+
+<!--
+%%% Local Variables:
+%%% coding: utf-8
+%%% mode: markdown
+%%% End:
+-->
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/LICENSE b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/LICENSE
new file mode 100644
index 0000000000..7966e59a19
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/LICENSE
@@ -0,0 +1,14 @@
+%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Stephan Hennig.
+%
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/README b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/README
new file mode 100644
index 0000000000..af04bbcde7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/README
@@ -0,0 +1,20 @@
+Package: mpcolornames
+Version: v0.20
+Date: 2011-07-14
+License: LPPL
+Maintenance status: maintained
+Current maintainer: Stephan Hennig <stephanhennig@arcor.de>
+
+
+The MetaPost format plain.mp provides only five built-in color names
+(variables), all defined in the RGB model: red, green and blue for the
+primary colors and black and white. The mpcolornames package makes more
+than 500 color names from different color sets in different color models
+available to MetaPost. Color sets include X11, SVG, DVIPS and xcolor
+specifications.
+
+
+Documentation can be found in file mpcolornames.pdf.
+
+
+END.
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/expl-array-index.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/expl-array-index.mp
new file mode 100644
index 0000000000..3d8b042900
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/expl-array-index.mp
@@ -0,0 +1,13 @@
+%%% file expl-array-index.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+input mpcolornames
+for i=1 upto 4:
+ show VioletRed[i];
+endfor
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/fig-clash-svg-dvips.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/fig-clash-svg-dvips.mp
new file mode 100644
index 0000000000..ce8b5359dd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/fig-clash-svg-dvips.mp
@@ -0,0 +1,21 @@
+%%% file fig-clash-svg-dvips.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+outputtemplate := "%j-%c.mps";
+input mpcolornames
+dvipsnames;
+picture disc; disc := image(fill fullcircle scaled 50);
+beginfig(1);
+ draw disc withcolor Lavender;
+ begingroup
+ svgnames;
+ draw disc shifted (75,0) withcolor Lavender;
+ endgroup;
+ draw disc shifted (150,0) withcolor Lavender;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.pdf b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.pdf
new file mode 100644
index 0000000000..96e7efd2dd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.tex
new file mode 100644
index 0000000000..68fe0fe8f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/mpcolornames.tex
@@ -0,0 +1,359 @@
+%%% file mpcolornames.tex
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+\RequirePackage{cmap}
+\documentclass[DIV=9, captions=tableheading]{scrartcl}
+\usepackage[T1]{fontenc}
+\usepackage[charter]{mathdesign}
+\usepackage{berasans}
+\usepackage{textcomp}
+\renewcommand*{\ttdefault}{fvs}
+\setkomafont{disposition}{\normalfont\bfseries}
+\usepackage{caption}
+\captionsetup[table]{position=top}
+\usepackage{amsmath}
+% \usepackage{amssymb}
+\usepackage[x11names]{xcolor}
+\colorlet{framecol}{black!50}
+\usepackage{listings}
+\lstloadlanguages{MetaPost, [LaTeX]TeX}
+\lstdefinelanguage[ext]{MetaPost}[]{MetaPost}{
+ morekeywords={verbatimtex},
+ morekeywords=[2]{blackpart, cmykcolor, colormodel, colorpart,
+ cyanpart, greypart, magentapart, rgbcolor, yellowpart},
+ morekeywords=[3]{withcmykcolor, withgreyscale, withoutcolor,
+ withpostscript, withprescript, withrgbcolor},
+ morekeywords=[5]{defaultcolormodel, mpprocset, outputformat,
+ outputtemplate},
+ morekeywords=[6]{mpversion},
+% morecomment=[s][basicstyle]{\%}{&},
+ deletekeywords=[4]{z}
+}
+\colorlet{mpcolor}{RoyalBlue4}
+\colorlet{latexcolor}{IndianRed4}
+\colorlet{textcolor}{black}
+\lstset{
+ columns=fullflexible, breaklines=true, breakatwhitespace=true,
+ escapechar=|,
+ aboveskip=10pt, belowskip=10pt,
+ frame=tb, framerule=2pt, framesep=6pt,
+ framexleftmargin=10pt, framexrightmargin=10pt,
+ xleftmargin=20pt, xrightmargin=20pt,
+}
+\lstdefinestyle{MP}{
+ language=[ext]MetaPost,
+ basicstyle=\normalfont\ttfamily,%\color{mpcolor},
+ keywordstyle=\bfseries,
+ commentstyle=\itshape,
+ rulecolor=\color{mpcolor!40},
+}
+\lstdefinestyle{LaTeX}{
+ language=[LaTeX]TeX,
+ basicstyle=\normalfont\sffamily,%\color{latexcolor},
+ keywordstyle={}, commentstyle=\itshape,
+ rulecolor=\color{latexcolor!40},
+}
+\lstdefinestyle{text}{
+ basicstyle=\normalfont\sffamily,%\color{textcolor},
+ keywordstyle={}, commentstyle={},
+ rulecolor=\color{textcolor!40},
+}
+\lstdefinestyle{textnof}{
+ style=text,
+ frame=none
+}
+\lstMakeShortInline[style=MP,
+basicstyle=\normalfont\ttfamily\color{mpcolor}, keywordstyle={},
+commentstyle={}]|
+
+\usepackage{array}
+\usepackage{booktabs}
+\usepackage{longtable}
+\usepackage{multicol}
+\usepackage{graphicx}
+\setcounter{topnumber}{2}
+\setcounter{bottomnumber}{0}
+\usepackage[USenglish]{babel}
+\usepackage{hyperref}
+\hypersetup{
+ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer.
+ pdfpagemode=UseNone,
+ colorlinks=true,
+ linkcolor=DarkOrange2,
+ urlcolor=Chocolate4,
+ citecolor=DeepPink2
+}
+
+\newcommand*{\cmd}[1]{\texttt{#1}}
+\newcommand*{\name}[1]{\textsf{\mdseries\emph{#1}}}
+\newcommand*{\pkg}{\name{mpcolornames}}
+\newcommand{\user}[1]{\emph{#1}}
+\newcommand*{\macro}[1]{%
+ \marginpar{%
+ \hspace*{-\marginparsep}%
+ \hspace*{-\textwidth}%
+ \hspace*{-\marginparsep}%
+ \hspace*{-\marginparwidth}%
+ \makebox[\marginparwidth][r]{%
+ \color{mpcolor}%
+ \texttt{#1}%
+ }%
+ }%
+}
+
+\urlstyle{same}% See url.sty.
+\newcommand*{\colorproof}[2][]{%
+ \includegraphics{proof-spec-#1-#2.mps}%
+ \hspace{5pt}%
+ \nolinkurl{#2}%
+}
+
+\typearea{last}
+
+\begin{document}
+\title{The \pkg\ package\thanks{This document describes \pkg\ v0.20,
+ last revised 2011/07/14.}}
+\author{Stephan Hennig\thanks{stephanhennig@arcor.de}}
+\maketitle
+
+\begin{abstract}
+ The MetaPost format \cmd{plain.mp} provides only five built-in color
+ names (variables), all defined in the RGB model: |red|, |green| and
+ |blue| for the primary colors and |black| and |white|
+ (\autoref{tab:spec-plain-mp}). The \pkg\ package makes more than 500
+ color names from different color sets in different color models
+ available to MetaPost. Color sets include X11, SVG, DVIPS and
+ \name{xcolor} specifications.
+\end{abstract}
+
+\setcounter{secnumdepth}{3}
+\setcounter{tocdepth}{3}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+
+\section{Color model constants}
+\label{sec:color-model-constants}
+Before discussing color names, lets have a look at some other constants
+that are provided by the \pkg\ package. MetaPost supports the CMYK and
+grey scale color models since version~1.000. At that time a new
+internal variable |defaultcolormodel| was introduced, whose value
+determines the color model of the black color used for drawing and
+filling in absence of a |withcolor| statement---either explicit or via
+|drawoptions|---and if the output format supports more than one color
+model (cf. section~9 of the MetaPost manual). Note, |defaultcolormodel|
+never triggers a color model conversion.
+
+Do you remember what value of variable |defaultcolormodel| corresponds
+to the CMYK color model? And do you remember what color model
+corresponds to a value of~3? Memoizing these numbers, which you need to
+know only once in a while, isn't easy and in code they are less
+descriptive than names. For that reason, the \pkg\ package declares a
+few internal variables with the values shown in
+\autoref{tab:color-model-constants} that should help switching between
+color models.
+
+\begin{table}
+ \centering
+ \caption{Color model constants.}
+ \label{tab:color-model-constants}
+ \begin{tabular}{lc}
+ internal variable & value\\
+ \addlinespace\toprule\addlinespace
+ |nomodel| & 1\\
+ |greyscalemodel| & 3\\
+ |rgbmodel| & 5\\
+ |cmykmodel| & 7\\
+ \end{tabular}
+\end{table}
+
+
+\section{Color sets}
+\label{sec:colorsets}
+This package provides color names from four color sets in three
+different color models. Color definitions are taken from X11
+(\autoref{tab:spec-x11nam-def}), SVG (\autoref{tab:spec-svgnam-def}) and
+DVIPS (\autoref{tab:spec-dvipsnam-def}) specifications as distributed by
+packages \name{color} and \name{xcolor}. Additionally, there is a small
+set of colors that are defined by package \name{xcolor}
+(\autoref{tab:spec-xcolor-sty}). All color specifications have
+automatically been translated into MetaPost code by scripts.
+
+Colors defined in the X11 and SVG specifications are in the RGB color
+space, i.e., the corresponding variables are of type |rgbcolor|. Colors
+defined in the DVIPS specification are in the CMYK color space, i.e.,
+the corresponding variables are of type |cmykcolor|. The set of colors
+from the \name{xcolor} package are in the CMYK, RGB and grey scale color
+model. The corresponding variable identifiers have been augmented by a
+prefix |cmyk_|, |rgb_| and |grey_| that indicates the color model used.
+Variables are of type |cmykcolor|, |rgbcolor| and |numeric|, resp.
+
+The package can be loaded by writing
+
+\begin{lstlisting}[style=MP]
+input mpcolornames
+\end{lstlisting}
+%
+in the MetaPost source file. After that, all color names defined in the
+above mentioned color specifications are available as (array) variables.
+This is possible, because the sets of color names defined in the color
+specifications are nearly disjoint. Only a few color names are defined
+in more than one color specification.
+
+Array variables can be indexed the usual way. As long as the index is a
+constant number, brackets can be omitted. That way, color names, like
+e.g., |VioletRed1| from X11 specification, can easily be used in
+MetaPost. If the index is a not a constant, brackets are mandatory. As
+an example, the color definitions of colors |VioletRed1| to |VioletRed4|
+can be output like this
+
+\lstinputlisting[style=MP, firstline=9]{expl-array-index.mp}
+%
+and the result would look like
+
+\lstinputlisting[style=text, firstline=9]{expl-array-index.log}
+
+
+\section{SVG and DVIPS color name clash}
+\label{sec:nameclash}
+There is a name clash between forty of the color names defined by the
+SVG and DVIPS specifications. The problem is that both specifications
+define colors in different color models, RGB for the SVG specification
+and CMYK for the DVIPS specification. Additionally, the visual
+impression of most colors with the same name varies quite drastically,
+e.g., for the name |Lavender| (see \autoref{fig:clash-svg-dvips}). The
+set of clashing color names is listed in \autoref{tab:clash-svg-dvips}.
+Here is how name clashes are handled by the \pkg\ package: When loading
+the \pkg\ package, definitions of the SVG specification are processed
+after those of the DVIPS specification and hence, for the clashing
+names, definitions of the SVG specification ``win.'' Note, the variable
+type of all clashing color names is therefore |rgbcolor|.
+
+To control the active set of clashing color definitions two user macro
+are provided: |svgnames|\macro{svgnames} and
+|dvipsnames|\macro{dvipsnames}. Calling any of both macros re-applies
+all SVG or DVIPS color name declarations, overwriting all current
+definitions of the respective set. As an example, DVIPS definitions for
+all clashing color names can be activated in the preamble by loading the
+\pkg\ package as follows:
+
+\begin{lstlisting}[style=MP]
+input mpcolornames
+dvipsnames;
+\end{lstlisting}
+
+One can switch back and forth between SVG and DVIPS definitions by
+repeatedly calling macros |dvipsnames| and |svgnames| within one figure.
+A better alternative, however, is to call these macros within a group,
+since both macros save the set of clashing identifiers w.\,r.\,t. the
+current group before setting the new definitions into effect. As an
+example, \autoref{fig:clash-svg-dvips} has been drawn with the following
+code:
+
+\lstinputlisting[style=MP, firstline=10]{fig-clash-svg-dvips.mp}
+
+\begin{figure}
+ \centering
+ \includegraphics{fig-clash-svg-dvips-1.mps}
+ \caption{Color \texttt{\color{mpcolor}Lavender} with DVIPS and SVG
+ definitions within one figure.}
+ \label{fig:clash-svg-dvips}
+\end{figure}
+
+
+\section{Related packages}
+\label{sec:relatedpkg}
+Package \name{mfpic} distributes a file \cmd{dvipsnam.mp} that contains
+the same color definitions from the DVIPS specification that this
+package provides. For backwards compatibility, package \name{mfpic}
+converts all colors into the RGB color model for MetaPost version that
+don't support the CMYK color model. Be careful when using both packages
+in parallel!
+
+\begin{flushleft}
+ \itshape%
+ Happy \TeX ing!\par
+ Stephan Hennig
+\end{flushleft}
+
+
+\appendix
+\section{Proof tables}
+\label{sec:prooftables}
+The following proof tables are sorted by color model.
+
+
+\clearpage
+% Enlarge width of typearea.
+\areaset{1.2\textwidth}{\textheight}
+\setlength{\columnsep}{3pt}
+
+\subsection{Color names for multiple color models}
+\label{sec:multinames}
+
+%%% names from xcolor.sty
+\newlength{\tabcolwidth}
+\begingroup
+\renewcommand*{\colorproof}[2][]{%
+ \includegraphics{proof-spec-#1-rgb_#2.mps}%
+ \hspace{5pt}%
+ \nolinkurl{rgb_#2}%
+ & \includegraphics{proof-spec-#1-cmyk_#2.mps}%
+ \hspace{5pt}%
+ \nolinkurl{cmyk_#2}%
+ & \includegraphics{proof-spec-#1-grey_#2.mps}%
+ \hspace{5pt}%
+ \nolinkurl{grey_#2}%
+}
+\input{tab-spec-xcolor-sty}
+\endgroup
+
+\clearpage
+\subsection{RGB color names}
+\label{sec:rgbnames}
+
+%%% names from plain.mp
+\input{tab-spec-plain-mp}
+
+%%% names from x11nam.def
+\input{tab-spec-x11nam-def}
+
+%%% names from svgnam.def
+\input{tab-spec-svgnam-def}
+
+\clearpage
+\subsection{CMYK color names}
+\label{sec:cmyknames}
+
+%%% names from dvipsnam.def
+\input{tab-spec-dvipsnam-def}
+
+
+\clearpage
+\section{Color name clashes}
+\label{sec:nameclashes}
+
+% svgnam.def and dvipsnam.def name clash
+\begingroup
+\renewcommand*{\colorproof}[2][]{%
+ \includegraphics{proof-spec-svgnam-def-#2.mps}%
+ \includegraphics{proof-spec-dvipsnam-def-#2.mps}%
+ \hspace{5pt}%
+ \nolinkurl{#2}%
+}
+\input{tab-clash-svg-dvips}
+\endgroup
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-mpcolornames.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-mpcolornames.mp
new file mode 100644
index 0000000000..563dcd1d86
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-mpcolornames.mp
@@ -0,0 +1,28 @@
+%%% file proof-mpcolornames.mp
+%%% Copyright 2009,2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+input mpcolornames
+
+boxh := 7.5bp;
+boxw := 12.5bp;
+penw := .3bp;
+string specname;
+
+def colorbox=
+ unitsquare xscaled boxw yscaled boxh
+enddef;
+
+def proof(suffix col)=
+ outputtemplate := "proof-spec-" & specname & "-" & str col & ".mps";
+ beginfig(1);
+ fill colorbox withcolor col;
+ draw colorbox withpen pencircle scaled penw;
+ endfig;
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-dvipsnam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-dvipsnam-def.mp
new file mode 100644
index 0000000000..786f5d0bb7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-dvipsnam-def.mp
@@ -0,0 +1,74 @@
+%%% file proof-spec-dvipsnam-def.mp
+input proof-mpcolornames
+dvipsnames;
+defaultcolormodel := 7;% CMYK
+specname := "dvipsnam-def";
+proof(GreenYellow);
+proof(Yellow);
+proof(Goldenrod);
+proof(Dandelion);
+proof(Apricot);
+proof(Peach);
+proof(Melon);
+proof(YellowOrange);
+proof(Orange);
+proof(BurntOrange);
+proof(Bittersweet);
+proof(RedOrange);
+proof(Mahogany);
+proof(Maroon);
+proof(BrickRed);
+proof(Red);
+proof(OrangeRed);
+proof(RubineRed);
+proof(WildStrawberry);
+proof(Salmon);
+proof(CarnationPink);
+proof(Magenta);
+proof(VioletRed);
+proof(Rhodamine);
+proof(Mulberry);
+proof(RedViolet);
+proof(Fuchsia);
+proof(Lavender);
+proof(Thistle);
+proof(Orchid);
+proof(DarkOrchid);
+proof(Purple);
+proof(Plum);
+proof(Violet);
+proof(RoyalPurple);
+proof(BlueViolet);
+proof(Periwinkle);
+proof(CadetBlue);
+proof(CornflowerBlue);
+proof(MidnightBlue);
+proof(NavyBlue);
+proof(RoyalBlue);
+proof(Blue);
+proof(Cerulean);
+proof(Cyan);
+proof(ProcessBlue);
+proof(SkyBlue);
+proof(Turquoise);
+proof(TealBlue);
+proof(Aquamarine);
+proof(BlueGreen);
+proof(Emerald);
+proof(JungleGreen);
+proof(SeaGreen);
+proof(Green);
+proof(ForestGreen);
+proof(PineGreen);
+proof(LimeGreen);
+proof(YellowGreen);
+proof(SpringGreen);
+proof(OliveGreen);
+proof(RawSienna);
+proof(Sepia);
+proof(Brown);
+proof(Tan);
+proof(Gray);
+proof(Black);
+proof(White);
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-plain-mp.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-plain-mp.mp
new file mode 100644
index 0000000000..bed474144e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-plain-mp.mp
@@ -0,0 +1,10 @@
+%%% file proof-spec-plain-mp.mp
+input proof-mpcolornames
+defaultcolormodel := 5;% RGB
+specname := "plain-mp";
+proof(black);
+proof(white);
+proof(red);
+proof(green);
+proof(blue);
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-svgnam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-svgnam-def.mp
new file mode 100644
index 0000000000..6ec2aa8718
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-svgnam-def.mp
@@ -0,0 +1,156 @@
+%%% file proof-spec-svgnam-def.mp
+input proof-mpcolornames
+defaultcolormodel := 5;% RGB
+specname := "svgnam-def";
+proof(AliceBlue);
+proof(AntiqueWhite);
+proof(Aqua);
+proof(Aquamarine);
+proof(Azure);
+proof(Beige);
+proof(Bisque);
+proof(Black);
+proof(BlanchedAlmond);
+proof(Blue);
+proof(BlueViolet);
+proof(Brown);
+proof(BurlyWood);
+proof(CadetBlue);
+proof(Chartreuse);
+proof(Chocolate);
+proof(Coral);
+proof(CornflowerBlue);
+proof(Cornsilk);
+proof(Crimson);
+proof(Cyan);
+proof(DarkBlue);
+proof(DarkCyan);
+proof(DarkGoldenrod);
+proof(DarkGray);
+proof(DarkGreen);
+proof(DarkGrey);
+proof(DarkKhaki);
+proof(DarkMagenta);
+proof(DarkOliveGreen);
+proof(DarkOrange);
+proof(DarkOrchid);
+proof(DarkRed);
+proof(DarkSalmon);
+proof(DarkSeaGreen);
+proof(DarkSlateBlue);
+proof(DarkSlateGray);
+proof(DarkSlateGrey);
+proof(DarkTurquoise);
+proof(DarkViolet);
+proof(DeepPink);
+proof(DeepSkyBlue);
+proof(DimGray);
+proof(DimGrey);
+proof(DodgerBlue);
+proof(FireBrick);
+proof(FloralWhite);
+proof(ForestGreen);
+proof(Fuchsia);
+proof(Gainsboro);
+proof(GhostWhite);
+proof(Gold);
+proof(Goldenrod);
+proof(Gray);
+proof(Green);
+proof(GreenYellow);
+proof(Grey);
+proof(Honeydew);
+proof(HotPink);
+proof(IndianRed);
+proof(Indigo);
+proof(Ivory);
+proof(Khaki);
+proof(Lavender);
+proof(LavenderBlush);
+proof(LawnGreen);
+proof(LemonChiffon);
+proof(LightBlue);
+proof(LightCoral);
+proof(LightCyan);
+proof(LightGoldenrod);
+proof(LightGoldenrodYellow);
+proof(LightGray);
+proof(LightGreen);
+proof(LightGrey);
+proof(LightPink);
+proof(LightSalmon);
+proof(LightSeaGreen);
+proof(LightSkyBlue);
+proof(LightSlateBlue);
+proof(LightSlateGray);
+proof(LightSlateGrey);
+proof(LightSteelBlue);
+proof(LightYellow);
+proof(Lime);
+proof(LimeGreen);
+proof(Linen);
+proof(Magenta);
+proof(Maroon);
+proof(MediumAquamarine);
+proof(MediumBlue);
+proof(MediumOrchid);
+proof(MediumPurple);
+proof(MediumSeaGreen);
+proof(MediumSlateBlue);
+proof(MediumSpringGreen);
+proof(MediumTurquoise);
+proof(MediumVioletRed);
+proof(MidnightBlue);
+proof(MintCream);
+proof(MistyRose);
+proof(Moccasin);
+proof(NavajoWhite);
+proof(Navy);
+proof(NavyBlue);
+proof(OldLace);
+proof(Olive);
+proof(OliveDrab);
+proof(Orange);
+proof(OrangeRed);
+proof(Orchid);
+proof(PaleGoldenrod);
+proof(PaleGreen);
+proof(PaleTurquoise);
+proof(PaleVioletRed);
+proof(PapayaWhip);
+proof(PeachPuff);
+proof(Peru);
+proof(Pink);
+proof(Plum);
+proof(PowderBlue);
+proof(Purple);
+proof(Red);
+proof(RosyBrown);
+proof(RoyalBlue);
+proof(SaddleBrown);
+proof(Salmon);
+proof(SandyBrown);
+proof(SeaGreen);
+proof(Seashell);
+proof(Sienna);
+proof(Silver);
+proof(SkyBlue);
+proof(SlateBlue);
+proof(SlateGray);
+proof(SlateGrey);
+proof(Snow);
+proof(SpringGreen);
+proof(SteelBlue);
+proof(Tan);
+proof(Teal);
+proof(Thistle);
+proof(Tomato);
+proof(Turquoise);
+proof(Violet);
+proof(VioletRed);
+proof(Wheat);
+proof(White);
+proof(WhiteSmoke);
+proof(Yellow);
+proof(YellowGreen);
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-x11nam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-x11nam-def.mp
new file mode 100644
index 0000000000..16ff4b70a8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-x11nam-def.mp
@@ -0,0 +1,322 @@
+%%% file proof-spec-x11nam-def.mp
+input proof-mpcolornames
+defaultcolormodel := 5;% RGB
+specname := "x11nam-def";
+proof(AntiqueWhite1);
+proof(AntiqueWhite2);
+proof(AntiqueWhite3);
+proof(AntiqueWhite4);
+proof(Aquamarine1);
+proof(Aquamarine2);
+proof(Aquamarine3);
+proof(Aquamarine4);
+proof(Azure1);
+proof(Azure2);
+proof(Azure3);
+proof(Azure4);
+proof(Bisque1);
+proof(Bisque2);
+proof(Bisque3);
+proof(Bisque4);
+proof(Blue1);
+proof(Blue2);
+proof(Blue3);
+proof(Blue4);
+proof(Brown1);
+proof(Brown2);
+proof(Brown3);
+proof(Brown4);
+proof(Burlywood1);
+proof(Burlywood2);
+proof(Burlywood3);
+proof(Burlywood4);
+proof(CadetBlue1);
+proof(CadetBlue2);
+proof(CadetBlue3);
+proof(CadetBlue4);
+proof(Chartreuse1);
+proof(Chartreuse2);
+proof(Chartreuse3);
+proof(Chartreuse4);
+proof(Chocolate1);
+proof(Chocolate2);
+proof(Chocolate3);
+proof(Chocolate4);
+proof(Coral1);
+proof(Coral2);
+proof(Coral3);
+proof(Coral4);
+proof(Cornsilk1);
+proof(Cornsilk2);
+proof(Cornsilk3);
+proof(Cornsilk4);
+proof(Cyan1);
+proof(Cyan2);
+proof(Cyan3);
+proof(Cyan4);
+proof(DarkGoldenrod1);
+proof(DarkGoldenrod2);
+proof(DarkGoldenrod3);
+proof(DarkGoldenrod4);
+proof(DarkOliveGreen1);
+proof(DarkOliveGreen2);
+proof(DarkOliveGreen3);
+proof(DarkOliveGreen4);
+proof(DarkOrange1);
+proof(DarkOrange2);
+proof(DarkOrange3);
+proof(DarkOrange4);
+proof(DarkOrchid1);
+proof(DarkOrchid2);
+proof(DarkOrchid3);
+proof(DarkOrchid4);
+proof(DarkSeaGreen1);
+proof(DarkSeaGreen2);
+proof(DarkSeaGreen3);
+proof(DarkSeaGreen4);
+proof(DarkSlateGray1);
+proof(DarkSlateGray2);
+proof(DarkSlateGray3);
+proof(DarkSlateGray4);
+proof(DeepPink1);
+proof(DeepPink2);
+proof(DeepPink3);
+proof(DeepPink4);
+proof(DeepSkyBlue1);
+proof(DeepSkyBlue2);
+proof(DeepSkyBlue3);
+proof(DeepSkyBlue4);
+proof(DodgerBlue1);
+proof(DodgerBlue2);
+proof(DodgerBlue3);
+proof(DodgerBlue4);
+proof(Firebrick1);
+proof(Firebrick2);
+proof(Firebrick3);
+proof(Firebrick4);
+proof(Gold1);
+proof(Gold2);
+proof(Gold3);
+proof(Gold4);
+proof(Goldenrod1);
+proof(Goldenrod2);
+proof(Goldenrod3);
+proof(Goldenrod4);
+proof(Green1);
+proof(Green2);
+proof(Green3);
+proof(Green4);
+proof(Honeydew1);
+proof(Honeydew2);
+proof(Honeydew3);
+proof(Honeydew4);
+proof(HotPink1);
+proof(HotPink2);
+proof(HotPink3);
+proof(HotPink4);
+proof(IndianRed1);
+proof(IndianRed2);
+proof(IndianRed3);
+proof(IndianRed4);
+proof(Ivory1);
+proof(Ivory2);
+proof(Ivory3);
+proof(Ivory4);
+proof(Khaki1);
+proof(Khaki2);
+proof(Khaki3);
+proof(Khaki4);
+proof(LavenderBlush1);
+proof(LavenderBlush2);
+proof(LavenderBlush3);
+proof(LavenderBlush4);
+proof(LemonChiffon1);
+proof(LemonChiffon2);
+proof(LemonChiffon3);
+proof(LemonChiffon4);
+proof(LightBlue1);
+proof(LightBlue2);
+proof(LightBlue3);
+proof(LightBlue4);
+proof(LightCyan1);
+proof(LightCyan2);
+proof(LightCyan3);
+proof(LightCyan4);
+proof(LightGoldenrod1);
+proof(LightGoldenrod2);
+proof(LightGoldenrod3);
+proof(LightGoldenrod4);
+proof(LightPink1);
+proof(LightPink2);
+proof(LightPink3);
+proof(LightPink4);
+proof(LightSalmon1);
+proof(LightSalmon2);
+proof(LightSalmon3);
+proof(LightSalmon4);
+proof(LightSkyBlue1);
+proof(LightSkyBlue2);
+proof(LightSkyBlue3);
+proof(LightSkyBlue4);
+proof(LightSteelBlue1);
+proof(LightSteelBlue2);
+proof(LightSteelBlue3);
+proof(LightSteelBlue4);
+proof(LightYellow1);
+proof(LightYellow2);
+proof(LightYellow3);
+proof(LightYellow4);
+proof(Magenta1);
+proof(Magenta2);
+proof(Magenta3);
+proof(Magenta4);
+proof(Maroon1);
+proof(Maroon2);
+proof(Maroon3);
+proof(Maroon4);
+proof(MediumOrchid1);
+proof(MediumOrchid2);
+proof(MediumOrchid3);
+proof(MediumOrchid4);
+proof(MediumPurple1);
+proof(MediumPurple2);
+proof(MediumPurple3);
+proof(MediumPurple4);
+proof(MistyRose1);
+proof(MistyRose2);
+proof(MistyRose3);
+proof(MistyRose4);
+proof(NavajoWhite1);
+proof(NavajoWhite2);
+proof(NavajoWhite3);
+proof(NavajoWhite4);
+proof(OliveDrab1);
+proof(OliveDrab2);
+proof(OliveDrab3);
+proof(OliveDrab4);
+proof(Orange1);
+proof(Orange2);
+proof(Orange3);
+proof(Orange4);
+proof(OrangeRed1);
+proof(OrangeRed2);
+proof(OrangeRed3);
+proof(OrangeRed4);
+proof(Orchid1);
+proof(Orchid2);
+proof(Orchid3);
+proof(Orchid4);
+proof(PaleGreen1);
+proof(PaleGreen2);
+proof(PaleGreen3);
+proof(PaleGreen4);
+proof(PaleTurquoise1);
+proof(PaleTurquoise2);
+proof(PaleTurquoise3);
+proof(PaleTurquoise4);
+proof(PaleVioletRed1);
+proof(PaleVioletRed2);
+proof(PaleVioletRed3);
+proof(PaleVioletRed4);
+proof(PeachPuff1);
+proof(PeachPuff2);
+proof(PeachPuff3);
+proof(PeachPuff4);
+proof(Pink1);
+proof(Pink2);
+proof(Pink3);
+proof(Pink4);
+proof(Plum1);
+proof(Plum2);
+proof(Plum3);
+proof(Plum4);
+proof(Purple1);
+proof(Purple2);
+proof(Purple3);
+proof(Purple4);
+proof(Red1);
+proof(Red2);
+proof(Red3);
+proof(Red4);
+proof(RosyBrown1);
+proof(RosyBrown2);
+proof(RosyBrown3);
+proof(RosyBrown4);
+proof(RoyalBlue1);
+proof(RoyalBlue2);
+proof(RoyalBlue3);
+proof(RoyalBlue4);
+proof(Salmon1);
+proof(Salmon2);
+proof(Salmon3);
+proof(Salmon4);
+proof(SeaGreen1);
+proof(SeaGreen2);
+proof(SeaGreen3);
+proof(SeaGreen4);
+proof(Seashell1);
+proof(Seashell2);
+proof(Seashell3);
+proof(Seashell4);
+proof(Sienna1);
+proof(Sienna2);
+proof(Sienna3);
+proof(Sienna4);
+proof(SkyBlue1);
+proof(SkyBlue2);
+proof(SkyBlue3);
+proof(SkyBlue4);
+proof(SlateBlue1);
+proof(SlateBlue2);
+proof(SlateBlue3);
+proof(SlateBlue4);
+proof(SlateGray1);
+proof(SlateGray2);
+proof(SlateGray3);
+proof(SlateGray4);
+proof(Snow1);
+proof(Snow2);
+proof(Snow3);
+proof(Snow4);
+proof(SpringGreen1);
+proof(SpringGreen2);
+proof(SpringGreen3);
+proof(SpringGreen4);
+proof(SteelBlue1);
+proof(SteelBlue2);
+proof(SteelBlue3);
+proof(SteelBlue4);
+proof(Tan1);
+proof(Tan2);
+proof(Tan3);
+proof(Tan4);
+proof(Thistle1);
+proof(Thistle2);
+proof(Thistle3);
+proof(Thistle4);
+proof(Tomato1);
+proof(Tomato2);
+proof(Tomato3);
+proof(Tomato4);
+proof(Turquoise1);
+proof(Turquoise2);
+proof(Turquoise3);
+proof(Turquoise4);
+proof(VioletRed1);
+proof(VioletRed2);
+proof(VioletRed3);
+proof(VioletRed4);
+proof(Wheat1);
+proof(Wheat2);
+proof(Wheat3);
+proof(Wheat4);
+proof(Yellow1);
+proof(Yellow2);
+proof(Yellow3);
+proof(Yellow4);
+proof(Gray0);
+proof(Green0);
+proof(Grey0);
+proof(Maroon0);
+proof(Purple0);
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-xcolor-sty.mp b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-xcolor-sty.mp
new file mode 100644
index 0000000000..0d002c2e9e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/proof-spec-xcolor-sty.mp
@@ -0,0 +1,64 @@
+%%% file proof-spec-xcolor-sty.mp
+input proof-mpcolornames
+specname := "xcolor-sty";
+defaultcolormodel := 5;% RGB
+proof(rgb_red);
+proof(rgb_green);
+proof(rgb_blue);
+proof(rgb_brown);
+proof(rgb_lime);
+proof(rgb_orange);
+proof(rgb_pink);
+proof(rgb_purple);
+proof(rgb_teal);
+proof(rgb_violet);
+proof(rgb_cyan);
+proof(rgb_magenta);
+proof(rgb_yellow);
+proof(rgb_olive);
+proof(rgb_black);
+proof(rgb_darkgray);
+proof(rgb_gray);
+proof(rgb_lightgray);
+proof(rgb_white);
+defaultcolormodel := 7;% CMYK
+proof(cmyk_red);
+proof(cmyk_green);
+proof(cmyk_blue);
+proof(cmyk_brown);
+proof(cmyk_lime);
+proof(cmyk_orange);
+proof(cmyk_pink);
+proof(cmyk_purple);
+proof(cmyk_teal);
+proof(cmyk_violet);
+proof(cmyk_cyan);
+proof(cmyk_magenta);
+proof(cmyk_yellow);
+proof(cmyk_olive);
+proof(cmyk_black);
+proof(cmyk_darkgray);
+proof(cmyk_gray);
+proof(cmyk_lightgray);
+proof(cmyk_white);
+defaultcolormodel := 3;% grey scale
+proof(grey_red);
+proof(grey_green);
+proof(grey_blue);
+proof(grey_brown);
+proof(grey_lime);
+proof(grey_orange);
+proof(grey_pink);
+proof(grey_purple);
+proof(grey_teal);
+proof(grey_violet);
+proof(grey_cyan);
+proof(grey_magenta);
+proof(grey_yellow);
+proof(grey_olive);
+proof(grey_black);
+proof(grey_darkgray);
+proof(grey_gray);
+proof(grey_lightgray);
+proof(grey_white);
+end
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-clash-svg-dvips.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-clash-svg-dvips.tex
new file mode 100644
index 0000000000..89234e606c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-clash-svg-dvips.tex
@@ -0,0 +1,50 @@
+%%% file tab-clash-svg-dvips.tex
+\vspace{\floatsep}
+\begin{multicols}{4}[\noindent\parbox{\textwidth}{%
+ \captionof{table}{Color names clashing in SVG (left) and DVIPS (right) specifications.}%
+ \label{tab:clash-svg-dvips}%
+ }]
+ \raggedcolumns
+ \setlength{\parindent}{0pt}
+ \ttfamily\small\color{mpcolor}
+\colorproof{Aquamarine}\par
+\colorproof{Black}\par
+\colorproof{Blue}\par
+\colorproof{BlueViolet}\par
+\colorproof{Brown}\par
+\colorproof{CadetBlue}\par
+\colorproof{CornflowerBlue}\par
+\colorproof{Cyan}\par
+\colorproof{DarkOrchid}\par
+\colorproof{ForestGreen}\par
+\colorproof{Fuchsia}\par
+\colorproof{Goldenrod}\par
+\colorproof{Gray}\par
+\colorproof{Green}\par
+\colorproof{GreenYellow}\par
+\colorproof{Lavender}\par
+\colorproof{LimeGreen}\par
+\colorproof{Magenta}\par
+\colorproof{Maroon}\par
+\colorproof{MidnightBlue}\par
+\colorproof{NavyBlue}\par
+\colorproof{Orange}\par
+\colorproof{OrangeRed}\par
+\colorproof{Orchid}\par
+\colorproof{Plum}\par
+\colorproof{Purple}\par
+\colorproof{Red}\par
+\colorproof{RoyalBlue}\par
+\colorproof{Salmon}\par
+\colorproof{SeaGreen}\par
+\colorproof{SkyBlue}\par
+\colorproof{SpringGreen}\par
+\colorproof{Tan}\par
+\colorproof{Thistle}\par
+\colorproof{Turquoise}\par
+\colorproof{Violet}\par
+\colorproof{VioletRed}\par
+\colorproof{White}\par
+\colorproof{Yellow}\par
+\colorproof{YellowGreen}\par
+\end{multicols}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-dvipsnam-def.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-dvipsnam-def.tex
new file mode 100644
index 0000000000..e1d4ab93af
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-dvipsnam-def.tex
@@ -0,0 +1,79 @@
+%%% file tab-spec-dvipsnam-def.tex
+\vspace{\floatsep}
+\begin{multicols}{4}[\noindent\parbox{\textwidth}{%
+ \captionof{table}{CMYK colors from DVIPS specification.}%
+ \label{tab:spec-dvipsnam-def}%
+ \footnotesize Taken from file \texttt{dvipsnam.def} v3.0i as distributed by \LaTeX\ package \name{color} (68 colors).
+ }]
+ \raggedcolumns
+ \setlength{\parindent}{0pt}
+ \ttfamily\small\color{mpcolor}
+\colorproof[dvipsnam-def]{GreenYellow}\par
+\colorproof[dvipsnam-def]{Yellow}\par
+\colorproof[dvipsnam-def]{Goldenrod}\par
+\colorproof[dvipsnam-def]{Dandelion}\par
+\colorproof[dvipsnam-def]{Apricot}\par
+\colorproof[dvipsnam-def]{Peach}\par
+\colorproof[dvipsnam-def]{Melon}\par
+\colorproof[dvipsnam-def]{YellowOrange}\par
+\colorproof[dvipsnam-def]{Orange}\par
+\colorproof[dvipsnam-def]{BurntOrange}\par
+\colorproof[dvipsnam-def]{Bittersweet}\par
+\colorproof[dvipsnam-def]{RedOrange}\par
+\colorproof[dvipsnam-def]{Mahogany}\par
+\colorproof[dvipsnam-def]{Maroon}\par
+\colorproof[dvipsnam-def]{BrickRed}\par
+\colorproof[dvipsnam-def]{Red}\par
+\colorproof[dvipsnam-def]{OrangeRed}\par
+\colorproof[dvipsnam-def]{RubineRed}\par
+\colorproof[dvipsnam-def]{WildStrawberry}\par
+\colorproof[dvipsnam-def]{Salmon}\par
+\colorproof[dvipsnam-def]{CarnationPink}\par
+\colorproof[dvipsnam-def]{Magenta}\par
+\colorproof[dvipsnam-def]{VioletRed}\par
+\colorproof[dvipsnam-def]{Rhodamine}\par
+\colorproof[dvipsnam-def]{Mulberry}\par
+\colorproof[dvipsnam-def]{RedViolet}\par
+\colorproof[dvipsnam-def]{Fuchsia}\par
+\colorproof[dvipsnam-def]{Lavender}\par
+\colorproof[dvipsnam-def]{Thistle}\par
+\colorproof[dvipsnam-def]{Orchid}\par
+\colorproof[dvipsnam-def]{DarkOrchid}\par
+\colorproof[dvipsnam-def]{Purple}\par
+\colorproof[dvipsnam-def]{Plum}\par
+\colorproof[dvipsnam-def]{Violet}\par
+\colorproof[dvipsnam-def]{RoyalPurple}\par
+\colorproof[dvipsnam-def]{BlueViolet}\par
+\colorproof[dvipsnam-def]{Periwinkle}\par
+\colorproof[dvipsnam-def]{CadetBlue}\par
+\colorproof[dvipsnam-def]{CornflowerBlue}\par
+\colorproof[dvipsnam-def]{MidnightBlue}\par
+\colorproof[dvipsnam-def]{NavyBlue}\par
+\colorproof[dvipsnam-def]{RoyalBlue}\par
+\colorproof[dvipsnam-def]{Blue}\par
+\colorproof[dvipsnam-def]{Cerulean}\par
+\colorproof[dvipsnam-def]{Cyan}\par
+\colorproof[dvipsnam-def]{ProcessBlue}\par
+\colorproof[dvipsnam-def]{SkyBlue}\par
+\colorproof[dvipsnam-def]{Turquoise}\par
+\colorproof[dvipsnam-def]{TealBlue}\par
+\colorproof[dvipsnam-def]{Aquamarine}\par
+\colorproof[dvipsnam-def]{BlueGreen}\par
+\colorproof[dvipsnam-def]{Emerald}\par
+\colorproof[dvipsnam-def]{JungleGreen}\par
+\colorproof[dvipsnam-def]{SeaGreen}\par
+\colorproof[dvipsnam-def]{Green}\par
+\colorproof[dvipsnam-def]{ForestGreen}\par
+\colorproof[dvipsnam-def]{PineGreen}\par
+\colorproof[dvipsnam-def]{LimeGreen}\par
+\colorproof[dvipsnam-def]{YellowGreen}\par
+\colorproof[dvipsnam-def]{SpringGreen}\par
+\colorproof[dvipsnam-def]{OliveGreen}\par
+\colorproof[dvipsnam-def]{RawSienna}\par
+\colorproof[dvipsnam-def]{Sepia}\par
+\colorproof[dvipsnam-def]{Brown}\par
+\colorproof[dvipsnam-def]{Tan}\par
+\colorproof[dvipsnam-def]{Gray}\par
+\colorproof[dvipsnam-def]{Black}\par
+\colorproof[dvipsnam-def]{White}\par
+\end{multicols}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-plain-mp.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-plain-mp.tex
new file mode 100644
index 0000000000..9b60f2f482
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-plain-mp.tex
@@ -0,0 +1,16 @@
+%%% file tab-spec-plain-mp.tex
+\vspace{\floatsep}
+\begin{multicols}{5}[\noindent\parbox{\textwidth}{%
+ \captionof{table}{Default RGB colors in MetaPost.}%
+ \label{tab:spec-plain-mp}%
+ \footnotesize Taken from file \texttt{plain.mp} 1.004 as distributed by MetaPost (5 colors).
+ }]
+ \raggedcolumns
+ \setlength{\parindent}{0pt}
+ \ttfamily\small\color{mpcolor}
+\colorproof[plain-mp]{black}\par
+\colorproof[plain-mp]{white}\par
+\colorproof[plain-mp]{red}\par
+\colorproof[plain-mp]{green}\par
+\colorproof[plain-mp]{blue}\par
+\end{multicols}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-svgnam-def.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-svgnam-def.tex
new file mode 100644
index 0000000000..a1a81a8356
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-svgnam-def.tex
@@ -0,0 +1,162 @@
+%%% file tab-spec-svgnam-def.tex
+\vspace{\floatsep}
+\begin{multicols}{4}[\noindent\parbox{\textwidth}{%
+ \captionof{table}{RGB colors from SVG specification.}%
+ \label{tab:spec-svgnam-def}%
+ \footnotesize Taken from file \texttt{svgnam.def} v2.11 as distributed by \LaTeX\ package \name{xcolor} (151 colors).
+ }]
+ \raggedcolumns
+ \setlength{\parindent}{0pt}
+ \ttfamily\small\color{mpcolor}
+\colorproof[svgnam-def]{AliceBlue}\par
+\colorproof[svgnam-def]{AntiqueWhite}\par
+\colorproof[svgnam-def]{Aqua}\par
+\colorproof[svgnam-def]{Aquamarine}\par
+\colorproof[svgnam-def]{Azure}\par
+\colorproof[svgnam-def]{Beige}\par
+\colorproof[svgnam-def]{Bisque}\par
+\colorproof[svgnam-def]{Black}\par
+\colorproof[svgnam-def]{BlanchedAlmond}\par
+\colorproof[svgnam-def]{Blue}\par
+\colorproof[svgnam-def]{BlueViolet}\par
+\colorproof[svgnam-def]{Brown}\par
+\colorproof[svgnam-def]{BurlyWood}\par
+\colorproof[svgnam-def]{CadetBlue}\par
+\colorproof[svgnam-def]{Chartreuse}\par
+\colorproof[svgnam-def]{Chocolate}\par
+\colorproof[svgnam-def]{Coral}\par
+\colorproof[svgnam-def]{CornflowerBlue}\par
+\colorproof[svgnam-def]{Cornsilk}\par
+\colorproof[svgnam-def]{Crimson}\par
+\colorproof[svgnam-def]{Cyan}\par
+\colorproof[svgnam-def]{DarkBlue}\par
+\colorproof[svgnam-def]{DarkCyan}\par
+\colorproof[svgnam-def]{DarkGoldenrod}\par
+\colorproof[svgnam-def]{DarkGray}\par
+\colorproof[svgnam-def]{DarkGreen}\par
+\colorproof[svgnam-def]{DarkGrey}\par
+\colorproof[svgnam-def]{DarkKhaki}\par
+\colorproof[svgnam-def]{DarkMagenta}\par
+\colorproof[svgnam-def]{DarkOliveGreen}\par
+\colorproof[svgnam-def]{DarkOrange}\par
+\colorproof[svgnam-def]{DarkOrchid}\par
+\colorproof[svgnam-def]{DarkRed}\par
+\colorproof[svgnam-def]{DarkSalmon}\par
+\colorproof[svgnam-def]{DarkSeaGreen}\par
+\colorproof[svgnam-def]{DarkSlateBlue}\par
+\colorproof[svgnam-def]{DarkSlateGray}\par
+\colorproof[svgnam-def]{DarkSlateGrey}\par
+\colorproof[svgnam-def]{DarkTurquoise}\par
+\colorproof[svgnam-def]{DarkViolet}\par
+\colorproof[svgnam-def]{DeepPink}\par
+\colorproof[svgnam-def]{DeepSkyBlue}\par
+\colorproof[svgnam-def]{DimGray}\par
+\colorproof[svgnam-def]{DimGrey}\par
+\colorproof[svgnam-def]{DodgerBlue}\par
+\colorproof[svgnam-def]{FireBrick}\par
+\colorproof[svgnam-def]{FloralWhite}\par
+\colorproof[svgnam-def]{ForestGreen}\par
+\colorproof[svgnam-def]{Fuchsia}\par
+\colorproof[svgnam-def]{Gainsboro}\par
+\colorproof[svgnam-def]{GhostWhite}\par
+\colorproof[svgnam-def]{Gold}\par
+\colorproof[svgnam-def]{Goldenrod}\par
+\colorproof[svgnam-def]{Gray}\par
+\colorproof[svgnam-def]{Green}\par
+\colorproof[svgnam-def]{GreenYellow}\par
+\colorproof[svgnam-def]{Grey}\par
+\colorproof[svgnam-def]{Honeydew}\par
+\colorproof[svgnam-def]{HotPink}\par
+\colorproof[svgnam-def]{IndianRed}\par
+\colorproof[svgnam-def]{Indigo}\par
+\colorproof[svgnam-def]{Ivory}\par
+\colorproof[svgnam-def]{Khaki}\par
+\colorproof[svgnam-def]{Lavender}\par
+\colorproof[svgnam-def]{LavenderBlush}\par
+\colorproof[svgnam-def]{LawnGreen}\par
+\colorproof[svgnam-def]{LemonChiffon}\par
+\colorproof[svgnam-def]{LightBlue}\par
+\colorproof[svgnam-def]{LightCoral}\par
+\colorproof[svgnam-def]{LightCyan}\par
+\colorproof[svgnam-def]{LightGoldenrod}\par
+\colorproof[svgnam-def]{LightGoldenrodYellow}\par
+\colorproof[svgnam-def]{LightGray}\par
+\colorproof[svgnam-def]{LightGreen}\par
+\colorproof[svgnam-def]{LightGrey}\par
+\colorproof[svgnam-def]{LightPink}\par
+\colorproof[svgnam-def]{LightSalmon}\par
+\colorproof[svgnam-def]{LightSeaGreen}\par
+\colorproof[svgnam-def]{LightSkyBlue}\par
+\colorproof[svgnam-def]{LightSlateBlue}\par
+\colorproof[svgnam-def]{LightSlateGray}\par
+\colorproof[svgnam-def]{LightSlateGrey}\par
+\colorproof[svgnam-def]{LightSteelBlue}\par
+\colorproof[svgnam-def]{LightYellow}\par
+\colorproof[svgnam-def]{Lime}\par
+\colorproof[svgnam-def]{LimeGreen}\par
+\colorproof[svgnam-def]{Linen}\par
+\colorproof[svgnam-def]{Magenta}\par
+\colorproof[svgnam-def]{Maroon}\par
+\colorproof[svgnam-def]{MediumAquamarine}\par
+\colorproof[svgnam-def]{MediumBlue}\par
+\colorproof[svgnam-def]{MediumOrchid}\par
+\colorproof[svgnam-def]{MediumPurple}\par
+\colorproof[svgnam-def]{MediumSeaGreen}\par
+\colorproof[svgnam-def]{MediumSlateBlue}\par
+\colorproof[svgnam-def]{MediumSpringGreen}\par
+\colorproof[svgnam-def]{MediumTurquoise}\par
+\colorproof[svgnam-def]{MediumVioletRed}\par
+\colorproof[svgnam-def]{MidnightBlue}\par
+\colorproof[svgnam-def]{MintCream}\par
+\colorproof[svgnam-def]{MistyRose}\par
+\colorproof[svgnam-def]{Moccasin}\par
+\colorproof[svgnam-def]{NavajoWhite}\par
+\colorproof[svgnam-def]{Navy}\par
+\colorproof[svgnam-def]{NavyBlue}\par
+\colorproof[svgnam-def]{OldLace}\par
+\colorproof[svgnam-def]{Olive}\par
+\colorproof[svgnam-def]{OliveDrab}\par
+\colorproof[svgnam-def]{Orange}\par
+\colorproof[svgnam-def]{OrangeRed}\par
+\colorproof[svgnam-def]{Orchid}\par
+\colorproof[svgnam-def]{PaleGoldenrod}\par
+\colorproof[svgnam-def]{PaleGreen}\par
+\colorproof[svgnam-def]{PaleTurquoise}\par
+\colorproof[svgnam-def]{PaleVioletRed}\par
+\colorproof[svgnam-def]{PapayaWhip}\par
+\colorproof[svgnam-def]{PeachPuff}\par
+\colorproof[svgnam-def]{Peru}\par
+\colorproof[svgnam-def]{Pink}\par
+\colorproof[svgnam-def]{Plum}\par
+\colorproof[svgnam-def]{PowderBlue}\par
+\colorproof[svgnam-def]{Purple}\par
+\colorproof[svgnam-def]{Red}\par
+\colorproof[svgnam-def]{RosyBrown}\par
+\colorproof[svgnam-def]{RoyalBlue}\par
+\colorproof[svgnam-def]{SaddleBrown}\par
+\colorproof[svgnam-def]{Salmon}\par
+\colorproof[svgnam-def]{SandyBrown}\par
+\colorproof[svgnam-def]{SeaGreen}\par
+\colorproof[svgnam-def]{Seashell}\par
+\colorproof[svgnam-def]{Sienna}\par
+\colorproof[svgnam-def]{Silver}\par
+\colorproof[svgnam-def]{SkyBlue}\par
+\colorproof[svgnam-def]{SlateBlue}\par
+\colorproof[svgnam-def]{SlateGray}\par
+\colorproof[svgnam-def]{SlateGrey}\par
+\colorproof[svgnam-def]{Snow}\par
+\colorproof[svgnam-def]{SpringGreen}\par
+\colorproof[svgnam-def]{SteelBlue}\par
+\colorproof[svgnam-def]{Tan}\par
+\colorproof[svgnam-def]{Teal}\par
+\colorproof[svgnam-def]{Thistle}\par
+\colorproof[svgnam-def]{Tomato}\par
+\colorproof[svgnam-def]{Turquoise}\par
+\colorproof[svgnam-def]{Violet}\par
+\colorproof[svgnam-def]{VioletRed}\par
+\colorproof[svgnam-def]{Wheat}\par
+\colorproof[svgnam-def]{White}\par
+\colorproof[svgnam-def]{WhiteSmoke}\par
+\colorproof[svgnam-def]{Yellow}\par
+\colorproof[svgnam-def]{YellowGreen}\par
+\end{multicols}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-x11nam-def.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-x11nam-def.tex
new file mode 100644
index 0000000000..ebafafbe72
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-x11nam-def.tex
@@ -0,0 +1,328 @@
+%%% file tab-spec-x11nam-def.tex
+\vspace{\floatsep}
+\begin{multicols}{4}[\noindent\parbox{\textwidth}{%
+ \captionof{table}{RGB colors from X11 specification.}%
+ \label{tab:spec-x11nam-def}%
+ \footnotesize Taken from file \texttt{x11nam.def} v2.11 as distributed by \LaTeX\ package \name{xcolor} (317 colors).
+ }]
+ \raggedcolumns
+ \setlength{\parindent}{0pt}
+ \ttfamily\small\color{mpcolor}
+\colorproof[x11nam-def]{AntiqueWhite1}\par
+\colorproof[x11nam-def]{AntiqueWhite2}\par
+\colorproof[x11nam-def]{AntiqueWhite3}\par
+\colorproof[x11nam-def]{AntiqueWhite4}\par
+\colorproof[x11nam-def]{Aquamarine1}\par
+\colorproof[x11nam-def]{Aquamarine2}\par
+\colorproof[x11nam-def]{Aquamarine3}\par
+\colorproof[x11nam-def]{Aquamarine4}\par
+\colorproof[x11nam-def]{Azure1}\par
+\colorproof[x11nam-def]{Azure2}\par
+\colorproof[x11nam-def]{Azure3}\par
+\colorproof[x11nam-def]{Azure4}\par
+\colorproof[x11nam-def]{Bisque1}\par
+\colorproof[x11nam-def]{Bisque2}\par
+\colorproof[x11nam-def]{Bisque3}\par
+\colorproof[x11nam-def]{Bisque4}\par
+\colorproof[x11nam-def]{Blue1}\par
+\colorproof[x11nam-def]{Blue2}\par
+\colorproof[x11nam-def]{Blue3}\par
+\colorproof[x11nam-def]{Blue4}\par
+\colorproof[x11nam-def]{Brown1}\par
+\colorproof[x11nam-def]{Brown2}\par
+\colorproof[x11nam-def]{Brown3}\par
+\colorproof[x11nam-def]{Brown4}\par
+\colorproof[x11nam-def]{Burlywood1}\par
+\colorproof[x11nam-def]{Burlywood2}\par
+\colorproof[x11nam-def]{Burlywood3}\par
+\colorproof[x11nam-def]{Burlywood4}\par
+\colorproof[x11nam-def]{CadetBlue1}\par
+\colorproof[x11nam-def]{CadetBlue2}\par
+\colorproof[x11nam-def]{CadetBlue3}\par
+\colorproof[x11nam-def]{CadetBlue4}\par
+\colorproof[x11nam-def]{Chartreuse1}\par
+\colorproof[x11nam-def]{Chartreuse2}\par
+\colorproof[x11nam-def]{Chartreuse3}\par
+\colorproof[x11nam-def]{Chartreuse4}\par
+\colorproof[x11nam-def]{Chocolate1}\par
+\colorproof[x11nam-def]{Chocolate2}\par
+\colorproof[x11nam-def]{Chocolate3}\par
+\colorproof[x11nam-def]{Chocolate4}\par
+\colorproof[x11nam-def]{Coral1}\par
+\colorproof[x11nam-def]{Coral2}\par
+\colorproof[x11nam-def]{Coral3}\par
+\colorproof[x11nam-def]{Coral4}\par
+\colorproof[x11nam-def]{Cornsilk1}\par
+\colorproof[x11nam-def]{Cornsilk2}\par
+\colorproof[x11nam-def]{Cornsilk3}\par
+\colorproof[x11nam-def]{Cornsilk4}\par
+\colorproof[x11nam-def]{Cyan1}\par
+\colorproof[x11nam-def]{Cyan2}\par
+\colorproof[x11nam-def]{Cyan3}\par
+\colorproof[x11nam-def]{Cyan4}\par
+\colorproof[x11nam-def]{DarkGoldenrod1}\par
+\colorproof[x11nam-def]{DarkGoldenrod2}\par
+\colorproof[x11nam-def]{DarkGoldenrod3}\par
+\colorproof[x11nam-def]{DarkGoldenrod4}\par
+\colorproof[x11nam-def]{DarkOliveGreen1}\par
+\colorproof[x11nam-def]{DarkOliveGreen2}\par
+\colorproof[x11nam-def]{DarkOliveGreen3}\par
+\colorproof[x11nam-def]{DarkOliveGreen4}\par
+\colorproof[x11nam-def]{DarkOrange1}\par
+\colorproof[x11nam-def]{DarkOrange2}\par
+\colorproof[x11nam-def]{DarkOrange3}\par
+\colorproof[x11nam-def]{DarkOrange4}\par
+\colorproof[x11nam-def]{DarkOrchid1}\par
+\colorproof[x11nam-def]{DarkOrchid2}\par
+\colorproof[x11nam-def]{DarkOrchid3}\par
+\colorproof[x11nam-def]{DarkOrchid4}\par
+\colorproof[x11nam-def]{DarkSeaGreen1}\par
+\colorproof[x11nam-def]{DarkSeaGreen2}\par
+\colorproof[x11nam-def]{DarkSeaGreen3}\par
+\colorproof[x11nam-def]{DarkSeaGreen4}\par
+\colorproof[x11nam-def]{DarkSlateGray1}\par
+\colorproof[x11nam-def]{DarkSlateGray2}\par
+\colorproof[x11nam-def]{DarkSlateGray3}\par
+\colorproof[x11nam-def]{DarkSlateGray4}\par
+\colorproof[x11nam-def]{DeepPink1}\par
+\colorproof[x11nam-def]{DeepPink2}\par
+\colorproof[x11nam-def]{DeepPink3}\par
+\colorproof[x11nam-def]{DeepPink4}\par
+\colorproof[x11nam-def]{DeepSkyBlue1}\par
+\colorproof[x11nam-def]{DeepSkyBlue2}\par
+\colorproof[x11nam-def]{DeepSkyBlue3}\par
+\colorproof[x11nam-def]{DeepSkyBlue4}\par
+\colorproof[x11nam-def]{DodgerBlue1}\par
+\colorproof[x11nam-def]{DodgerBlue2}\par
+\colorproof[x11nam-def]{DodgerBlue3}\par
+\colorproof[x11nam-def]{DodgerBlue4}\par
+\colorproof[x11nam-def]{Firebrick1}\par
+\colorproof[x11nam-def]{Firebrick2}\par
+\colorproof[x11nam-def]{Firebrick3}\par
+\colorproof[x11nam-def]{Firebrick4}\par
+\colorproof[x11nam-def]{Gold1}\par
+\colorproof[x11nam-def]{Gold2}\par
+\colorproof[x11nam-def]{Gold3}\par
+\colorproof[x11nam-def]{Gold4}\par
+\colorproof[x11nam-def]{Goldenrod1}\par
+\colorproof[x11nam-def]{Goldenrod2}\par
+\colorproof[x11nam-def]{Goldenrod3}\par
+\colorproof[x11nam-def]{Goldenrod4}\par
+\colorproof[x11nam-def]{Green1}\par
+\colorproof[x11nam-def]{Green2}\par
+\colorproof[x11nam-def]{Green3}\par
+\colorproof[x11nam-def]{Green4}\par
+\colorproof[x11nam-def]{Honeydew1}\par
+\colorproof[x11nam-def]{Honeydew2}\par
+\colorproof[x11nam-def]{Honeydew3}\par
+\colorproof[x11nam-def]{Honeydew4}\par
+\colorproof[x11nam-def]{HotPink1}\par
+\colorproof[x11nam-def]{HotPink2}\par
+\colorproof[x11nam-def]{HotPink3}\par
+\colorproof[x11nam-def]{HotPink4}\par
+\colorproof[x11nam-def]{IndianRed1}\par
+\colorproof[x11nam-def]{IndianRed2}\par
+\colorproof[x11nam-def]{IndianRed3}\par
+\colorproof[x11nam-def]{IndianRed4}\par
+\colorproof[x11nam-def]{Ivory1}\par
+\colorproof[x11nam-def]{Ivory2}\par
+\colorproof[x11nam-def]{Ivory3}\par
+\colorproof[x11nam-def]{Ivory4}\par
+\colorproof[x11nam-def]{Khaki1}\par
+\colorproof[x11nam-def]{Khaki2}\par
+\colorproof[x11nam-def]{Khaki3}\par
+\colorproof[x11nam-def]{Khaki4}\par
+\colorproof[x11nam-def]{LavenderBlush1}\par
+\colorproof[x11nam-def]{LavenderBlush2}\par
+\colorproof[x11nam-def]{LavenderBlush3}\par
+\colorproof[x11nam-def]{LavenderBlush4}\par
+\colorproof[x11nam-def]{LemonChiffon1}\par
+\colorproof[x11nam-def]{LemonChiffon2}\par
+\colorproof[x11nam-def]{LemonChiffon3}\par
+\colorproof[x11nam-def]{LemonChiffon4}\par
+\colorproof[x11nam-def]{LightBlue1}\par
+\colorproof[x11nam-def]{LightBlue2}\par
+\colorproof[x11nam-def]{LightBlue3}\par
+\colorproof[x11nam-def]{LightBlue4}\par
+\colorproof[x11nam-def]{LightCyan1}\par
+\colorproof[x11nam-def]{LightCyan2}\par
+\colorproof[x11nam-def]{LightCyan3}\par
+\colorproof[x11nam-def]{LightCyan4}\par
+\colorproof[x11nam-def]{LightGoldenrod1}\par
+\colorproof[x11nam-def]{LightGoldenrod2}\par
+\colorproof[x11nam-def]{LightGoldenrod3}\par
+\colorproof[x11nam-def]{LightGoldenrod4}\par
+\colorproof[x11nam-def]{LightPink1}\par
+\colorproof[x11nam-def]{LightPink2}\par
+\colorproof[x11nam-def]{LightPink3}\par
+\colorproof[x11nam-def]{LightPink4}\par
+\colorproof[x11nam-def]{LightSalmon1}\par
+\colorproof[x11nam-def]{LightSalmon2}\par
+\colorproof[x11nam-def]{LightSalmon3}\par
+\colorproof[x11nam-def]{LightSalmon4}\par
+\colorproof[x11nam-def]{LightSkyBlue1}\par
+\colorproof[x11nam-def]{LightSkyBlue2}\par
+\colorproof[x11nam-def]{LightSkyBlue3}\par
+\colorproof[x11nam-def]{LightSkyBlue4}\par
+\colorproof[x11nam-def]{LightSteelBlue1}\par
+\colorproof[x11nam-def]{LightSteelBlue2}\par
+\colorproof[x11nam-def]{LightSteelBlue3}\par
+\colorproof[x11nam-def]{LightSteelBlue4}\par
+\colorproof[x11nam-def]{LightYellow1}\par
+\colorproof[x11nam-def]{LightYellow2}\par
+\colorproof[x11nam-def]{LightYellow3}\par
+\colorproof[x11nam-def]{LightYellow4}\par
+\colorproof[x11nam-def]{Magenta1}\par
+\colorproof[x11nam-def]{Magenta2}\par
+\colorproof[x11nam-def]{Magenta3}\par
+\colorproof[x11nam-def]{Magenta4}\par
+\colorproof[x11nam-def]{Maroon1}\par
+\colorproof[x11nam-def]{Maroon2}\par
+\colorproof[x11nam-def]{Maroon3}\par
+\colorproof[x11nam-def]{Maroon4}\par
+\colorproof[x11nam-def]{MediumOrchid1}\par
+\colorproof[x11nam-def]{MediumOrchid2}\par
+\colorproof[x11nam-def]{MediumOrchid3}\par
+\colorproof[x11nam-def]{MediumOrchid4}\par
+\colorproof[x11nam-def]{MediumPurple1}\par
+\colorproof[x11nam-def]{MediumPurple2}\par
+\colorproof[x11nam-def]{MediumPurple3}\par
+\colorproof[x11nam-def]{MediumPurple4}\par
+\colorproof[x11nam-def]{MistyRose1}\par
+\colorproof[x11nam-def]{MistyRose2}\par
+\colorproof[x11nam-def]{MistyRose3}\par
+\colorproof[x11nam-def]{MistyRose4}\par
+\colorproof[x11nam-def]{NavajoWhite1}\par
+\colorproof[x11nam-def]{NavajoWhite2}\par
+\colorproof[x11nam-def]{NavajoWhite3}\par
+\colorproof[x11nam-def]{NavajoWhite4}\par
+\colorproof[x11nam-def]{OliveDrab1}\par
+\colorproof[x11nam-def]{OliveDrab2}\par
+\colorproof[x11nam-def]{OliveDrab3}\par
+\colorproof[x11nam-def]{OliveDrab4}\par
+\colorproof[x11nam-def]{Orange1}\par
+\colorproof[x11nam-def]{Orange2}\par
+\colorproof[x11nam-def]{Orange3}\par
+\colorproof[x11nam-def]{Orange4}\par
+\colorproof[x11nam-def]{OrangeRed1}\par
+\colorproof[x11nam-def]{OrangeRed2}\par
+\colorproof[x11nam-def]{OrangeRed3}\par
+\colorproof[x11nam-def]{OrangeRed4}\par
+\colorproof[x11nam-def]{Orchid1}\par
+\colorproof[x11nam-def]{Orchid2}\par
+\colorproof[x11nam-def]{Orchid3}\par
+\colorproof[x11nam-def]{Orchid4}\par
+\colorproof[x11nam-def]{PaleGreen1}\par
+\colorproof[x11nam-def]{PaleGreen2}\par
+\colorproof[x11nam-def]{PaleGreen3}\par
+\colorproof[x11nam-def]{PaleGreen4}\par
+\colorproof[x11nam-def]{PaleTurquoise1}\par
+\colorproof[x11nam-def]{PaleTurquoise2}\par
+\colorproof[x11nam-def]{PaleTurquoise3}\par
+\colorproof[x11nam-def]{PaleTurquoise4}\par
+\colorproof[x11nam-def]{PaleVioletRed1}\par
+\colorproof[x11nam-def]{PaleVioletRed2}\par
+\colorproof[x11nam-def]{PaleVioletRed3}\par
+\colorproof[x11nam-def]{PaleVioletRed4}\par
+\colorproof[x11nam-def]{PeachPuff1}\par
+\colorproof[x11nam-def]{PeachPuff2}\par
+\colorproof[x11nam-def]{PeachPuff3}\par
+\colorproof[x11nam-def]{PeachPuff4}\par
+\colorproof[x11nam-def]{Pink1}\par
+\colorproof[x11nam-def]{Pink2}\par
+\colorproof[x11nam-def]{Pink3}\par
+\colorproof[x11nam-def]{Pink4}\par
+\colorproof[x11nam-def]{Plum1}\par
+\colorproof[x11nam-def]{Plum2}\par
+\colorproof[x11nam-def]{Plum3}\par
+\colorproof[x11nam-def]{Plum4}\par
+\colorproof[x11nam-def]{Purple1}\par
+\colorproof[x11nam-def]{Purple2}\par
+\colorproof[x11nam-def]{Purple3}\par
+\colorproof[x11nam-def]{Purple4}\par
+\colorproof[x11nam-def]{Red1}\par
+\colorproof[x11nam-def]{Red2}\par
+\colorproof[x11nam-def]{Red3}\par
+\colorproof[x11nam-def]{Red4}\par
+\colorproof[x11nam-def]{RosyBrown1}\par
+\colorproof[x11nam-def]{RosyBrown2}\par
+\colorproof[x11nam-def]{RosyBrown3}\par
+\colorproof[x11nam-def]{RosyBrown4}\par
+\colorproof[x11nam-def]{RoyalBlue1}\par
+\colorproof[x11nam-def]{RoyalBlue2}\par
+\colorproof[x11nam-def]{RoyalBlue3}\par
+\colorproof[x11nam-def]{RoyalBlue4}\par
+\colorproof[x11nam-def]{Salmon1}\par
+\colorproof[x11nam-def]{Salmon2}\par
+\colorproof[x11nam-def]{Salmon3}\par
+\colorproof[x11nam-def]{Salmon4}\par
+\colorproof[x11nam-def]{SeaGreen1}\par
+\colorproof[x11nam-def]{SeaGreen2}\par
+\colorproof[x11nam-def]{SeaGreen3}\par
+\colorproof[x11nam-def]{SeaGreen4}\par
+\colorproof[x11nam-def]{Seashell1}\par
+\colorproof[x11nam-def]{Seashell2}\par
+\colorproof[x11nam-def]{Seashell3}\par
+\colorproof[x11nam-def]{Seashell4}\par
+\colorproof[x11nam-def]{Sienna1}\par
+\colorproof[x11nam-def]{Sienna2}\par
+\colorproof[x11nam-def]{Sienna3}\par
+\colorproof[x11nam-def]{Sienna4}\par
+\colorproof[x11nam-def]{SkyBlue1}\par
+\colorproof[x11nam-def]{SkyBlue2}\par
+\colorproof[x11nam-def]{SkyBlue3}\par
+\colorproof[x11nam-def]{SkyBlue4}\par
+\colorproof[x11nam-def]{SlateBlue1}\par
+\colorproof[x11nam-def]{SlateBlue2}\par
+\colorproof[x11nam-def]{SlateBlue3}\par
+\colorproof[x11nam-def]{SlateBlue4}\par
+\colorproof[x11nam-def]{SlateGray1}\par
+\colorproof[x11nam-def]{SlateGray2}\par
+\colorproof[x11nam-def]{SlateGray3}\par
+\colorproof[x11nam-def]{SlateGray4}\par
+\colorproof[x11nam-def]{Snow1}\par
+\colorproof[x11nam-def]{Snow2}\par
+\colorproof[x11nam-def]{Snow3}\par
+\colorproof[x11nam-def]{Snow4}\par
+\colorproof[x11nam-def]{SpringGreen1}\par
+\colorproof[x11nam-def]{SpringGreen2}\par
+\colorproof[x11nam-def]{SpringGreen3}\par
+\colorproof[x11nam-def]{SpringGreen4}\par
+\colorproof[x11nam-def]{SteelBlue1}\par
+\colorproof[x11nam-def]{SteelBlue2}\par
+\colorproof[x11nam-def]{SteelBlue3}\par
+\colorproof[x11nam-def]{SteelBlue4}\par
+\colorproof[x11nam-def]{Tan1}\par
+\colorproof[x11nam-def]{Tan2}\par
+\colorproof[x11nam-def]{Tan3}\par
+\colorproof[x11nam-def]{Tan4}\par
+\colorproof[x11nam-def]{Thistle1}\par
+\colorproof[x11nam-def]{Thistle2}\par
+\colorproof[x11nam-def]{Thistle3}\par
+\colorproof[x11nam-def]{Thistle4}\par
+\colorproof[x11nam-def]{Tomato1}\par
+\colorproof[x11nam-def]{Tomato2}\par
+\colorproof[x11nam-def]{Tomato3}\par
+\colorproof[x11nam-def]{Tomato4}\par
+\colorproof[x11nam-def]{Turquoise1}\par
+\colorproof[x11nam-def]{Turquoise2}\par
+\colorproof[x11nam-def]{Turquoise3}\par
+\colorproof[x11nam-def]{Turquoise4}\par
+\colorproof[x11nam-def]{VioletRed1}\par
+\colorproof[x11nam-def]{VioletRed2}\par
+\colorproof[x11nam-def]{VioletRed3}\par
+\colorproof[x11nam-def]{VioletRed4}\par
+\colorproof[x11nam-def]{Wheat1}\par
+\colorproof[x11nam-def]{Wheat2}\par
+\colorproof[x11nam-def]{Wheat3}\par
+\colorproof[x11nam-def]{Wheat4}\par
+\colorproof[x11nam-def]{Yellow1}\par
+\colorproof[x11nam-def]{Yellow2}\par
+\colorproof[x11nam-def]{Yellow3}\par
+\colorproof[x11nam-def]{Yellow4}\par
+\colorproof[x11nam-def]{Gray0}\par
+\colorproof[x11nam-def]{Green0}\par
+\colorproof[x11nam-def]{Grey0}\par
+\colorproof[x11nam-def]{Maroon0}\par
+\colorproof[x11nam-def]{Purple0}\par
+\end{multicols}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-xcolor-sty.tex b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-xcolor-sty.tex
new file mode 100644
index 0000000000..e766872a88
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/doc/metapost/mpcolornames/tab-spec-xcolor-sty.tex
@@ -0,0 +1,34 @@
+%%% file tab-spec-xcolor-sty.tex
+\begingroup
+\ttfamily\small\color{mpcolor}
+\setlength{\tabcolsep}{.5\columnsep}
+\setlength{\tabcolwidth}{\textwidth}
+\addtolength{\tabcolwidth}{-4\tabcolsep}
+\setlength{\tabcolwidth}{.333\tabcolwidth}
+\begin{longtable}{@{}*{3}{p{\tabcolwidth}}@{}}
+ \caption{RGB, CMYK, and grey~scale colors from \LaTeX\ package \name{xcolor}.}%
+ \label{tab:spec-xcolor-sty}\\
+\multicolumn{3}{l}{\normalfont\footnotesize\normalcolor Taken from file \texttt{xcolor.sty} v1.0i as distributed by \LaTeX\ package \name{xcolor} (19 colors, with augmented names).}
+\endfirsthead
+
+\colorproof[xcolor-sty]{red}\\
+\colorproof[xcolor-sty]{green}\\
+\colorproof[xcolor-sty]{blue}\\
+\colorproof[xcolor-sty]{brown}\\
+\colorproof[xcolor-sty]{lime}\\
+\colorproof[xcolor-sty]{orange}\\
+\colorproof[xcolor-sty]{pink}\\
+\colorproof[xcolor-sty]{purple}\\
+\colorproof[xcolor-sty]{teal}\\
+\colorproof[xcolor-sty]{violet}\\
+\colorproof[xcolor-sty]{cyan}\\
+\colorproof[xcolor-sty]{magenta}\\
+\colorproof[xcolor-sty]{yellow}\\
+\colorproof[xcolor-sty]{olive}\\
+\colorproof[xcolor-sty]{black}\\
+\colorproof[xcolor-sty]{darkgray}\\
+\colorproof[xcolor-sty]{gray}\\
+\colorproof[xcolor-sty]{lightgray}\\
+\colorproof[xcolor-sty]{white}\\
+\end{longtable}
+\endgroup
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-dvipsnam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-dvipsnam-def.mp
new file mode 100644
index 0000000000..cb84fc8d32
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-dvipsnam-def.mp
@@ -0,0 +1,148 @@
+%%% file mpcolornames-spec-dvipsnam-def.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+def _mpcolornames_spec_dvipsnam_def=
+cmykcolor
+GreenYellow,
+Yellow,
+Goldenrod,
+Dandelion,
+Apricot,
+Peach,
+Melon,
+YellowOrange,
+Orange,
+BurntOrange,
+Bittersweet,
+RedOrange,
+Mahogany,
+Maroon,
+BrickRed,
+Red,
+OrangeRed,
+RubineRed,
+WildStrawberry,
+Salmon,
+CarnationPink,
+Magenta,
+VioletRed,
+Rhodamine,
+Mulberry,
+RedViolet,
+Fuchsia,
+Lavender,
+Thistle,
+Orchid,
+DarkOrchid,
+Purple,
+Plum,
+Violet,
+RoyalPurple,
+BlueViolet,
+Periwinkle,
+CadetBlue,
+CornflowerBlue,
+MidnightBlue,
+NavyBlue,
+RoyalBlue,
+Blue,
+Cerulean,
+Cyan,
+ProcessBlue,
+SkyBlue,
+Turquoise,
+TealBlue,
+Aquamarine,
+BlueGreen,
+Emerald,
+JungleGreen,
+SeaGreen,
+Green,
+ForestGreen,
+PineGreen,
+LimeGreen,
+YellowGreen,
+SpringGreen,
+OliveGreen,
+RawSienna,
+Sepia,
+Brown,
+Tan,
+Gray,
+Black,
+White;
+GreenYellow:=(0.15,0,0.69,0);
+Yellow:=(0,0,1,0);
+Goldenrod:=(0,0.10,0.84,0);
+Dandelion:=(0,0.29,0.84,0);
+Apricot:=(0,0.32,0.52,0);
+Peach:=(0,0.50,0.70,0);
+Melon:=(0,0.46,0.50,0);
+YellowOrange:=(0,0.42,1,0);
+Orange:=(0,0.61,0.87,0);
+BurntOrange:=(0,0.51,1,0);
+Bittersweet:=(0,0.75,1,0.24);
+RedOrange:=(0,0.77,0.87,0);
+Mahogany:=(0,0.85,0.87,0.35);
+Maroon:=(0,0.87,0.68,0.32);
+BrickRed:=(0,0.89,0.94,0.28);
+Red:=(0,1,1,0);
+OrangeRed:=(0,1,0.50,0);
+RubineRed:=(0,1,0.13,0);
+WildStrawberry:=(0,0.96,0.39,0);
+Salmon:=(0,0.53,0.38,0);
+CarnationPink:=(0,0.63,0,0);
+Magenta:=(0,1,0,0);
+VioletRed:=(0,0.81,0,0);
+Rhodamine:=(0,0.82,0,0);
+Mulberry:=(0.34,0.90,0,0.02);
+RedViolet:=(0.07,0.90,0,0.34);
+Fuchsia:=(0.47,0.91,0,0.08);
+Lavender:=(0,0.48,0,0);
+Thistle:=(0.12,0.59,0,0);
+Orchid:=(0.32,0.64,0,0);
+DarkOrchid:=(0.40,0.80,0.20,0);
+Purple:=(0.45,0.86,0,0);
+Plum:=(0.50,1,0,0);
+Violet:=(0.79,0.88,0,0);
+RoyalPurple:=(0.75,0.90,0,0);
+BlueViolet:=(0.86,0.91,0,0.04);
+Periwinkle:=(0.57,0.55,0,0);
+CadetBlue:=(0.62,0.57,0.23,0);
+CornflowerBlue:=(0.65,0.13,0,0);
+MidnightBlue:=(0.98,0.13,0,0.43);
+NavyBlue:=(0.94,0.54,0,0);
+RoyalBlue:=(1,0.50,0,0);
+Blue:=(1,1,0,0);
+Cerulean:=(0.94,0.11,0,0);
+Cyan:=(1,0,0,0);
+ProcessBlue:=(0.96,0,0,0);
+SkyBlue:=(0.62,0,0.12,0);
+Turquoise:=(0.85,0,0.20,0);
+TealBlue:=(0.86,0,0.34,0.02);
+Aquamarine:=(0.82,0,0.30,0);
+BlueGreen:=(0.85,0,0.33,0);
+Emerald:=(1,0,0.50,0);
+JungleGreen:=(0.99,0,0.52,0);
+SeaGreen:=(0.69,0,0.50,0);
+Green:=(1,0,1,0);
+ForestGreen:=(0.91,0,0.88,0.12);
+PineGreen:=(0.92,0,0.59,0.25);
+LimeGreen:=(0.50,0,1,0);
+YellowGreen:=(0.44,0,0.74,0);
+SpringGreen:=(0.26,0,0.76,0);
+OliveGreen:=(0.64,0,0.95,0.40);
+RawSienna:=(0,0.72,1,0.45);
+Sepia:=(0,0.83,1,0.70);
+Brown:=(0,0.81,1,0.60);
+Tan:=(0.14,0.42,0.56,0);
+Gray:=(0,0,0,0.50);
+Black:=(0,0,0,1);
+White:=(0,0,0,0);
+enddef;
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-plain-mp.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-plain-mp.mp
new file mode 100644
index 0000000000..e49c4a37c5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-plain-mp.mp
@@ -0,0 +1,22 @@
+%%% file mpcolornames-spec-plain-mp.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+def _mpcolornames_spec_plain_mp=
+rgbcolor
+black,
+white,
+red,
+green,
+blue;
+black:=(0,0,0);
+white:=(1,1,1);
+red:=(1,0,0);
+green:=(0,1,0);
+blue:=(0,0,1);
+enddef;
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-svgnam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-svgnam-def.mp
new file mode 100644
index 0000000000..283b4011f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-svgnam-def.mp
@@ -0,0 +1,314 @@
+%%% file mpcolornames-spec-svgnam-def.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+def _mpcolornames_spec_svgnam_def=
+rgbcolor
+AliceBlue,
+AntiqueWhite,
+Aqua,
+Aquamarine,
+Azure,
+Beige,
+Bisque,
+Black,
+BlanchedAlmond,
+Blue,
+BlueViolet,
+Brown,
+BurlyWood,
+CadetBlue,
+Chartreuse,
+Chocolate,
+Coral,
+CornflowerBlue,
+Cornsilk,
+Crimson,
+Cyan,
+DarkBlue,
+DarkCyan,
+DarkGoldenrod,
+DarkGray,
+DarkGreen,
+DarkGrey,
+DarkKhaki,
+DarkMagenta,
+DarkOliveGreen,
+DarkOrange,
+DarkOrchid,
+DarkRed,
+DarkSalmon,
+DarkSeaGreen,
+DarkSlateBlue,
+DarkSlateGray,
+DarkSlateGrey,
+DarkTurquoise,
+DarkViolet,
+DeepPink,
+DeepSkyBlue,
+DimGray,
+DimGrey,
+DodgerBlue,
+FireBrick,
+FloralWhite,
+ForestGreen,
+Fuchsia,
+Gainsboro,
+GhostWhite,
+Gold,
+Goldenrod,
+Gray,
+Green,
+GreenYellow,
+Grey,
+Honeydew,
+HotPink,
+IndianRed,
+Indigo,
+Ivory,
+Khaki,
+Lavender,
+LavenderBlush,
+LawnGreen,
+LemonChiffon,
+LightBlue,
+LightCoral,
+LightCyan,
+LightGoldenrod,
+LightGoldenrodYellow,
+LightGray,
+LightGreen,
+LightGrey,
+LightPink,
+LightSalmon,
+LightSeaGreen,
+LightSkyBlue,
+LightSlateBlue,
+LightSlateGray,
+LightSlateGrey,
+LightSteelBlue,
+LightYellow,
+Lime,
+LimeGreen,
+Linen,
+Magenta,
+Maroon,
+MediumAquamarine,
+MediumBlue,
+MediumOrchid,
+MediumPurple,
+MediumSeaGreen,
+MediumSlateBlue,
+MediumSpringGreen,
+MediumTurquoise,
+MediumVioletRed,
+MidnightBlue,
+MintCream,
+MistyRose,
+Moccasin,
+NavajoWhite,
+Navy,
+NavyBlue,
+OldLace,
+Olive,
+OliveDrab,
+Orange,
+OrangeRed,
+Orchid,
+PaleGoldenrod,
+PaleGreen,
+PaleTurquoise,
+PaleVioletRed,
+PapayaWhip,
+PeachPuff,
+Peru,
+Pink,
+Plum,
+PowderBlue,
+Purple,
+Red,
+RosyBrown,
+RoyalBlue,
+SaddleBrown,
+Salmon,
+SandyBrown,
+SeaGreen,
+Seashell,
+Sienna,
+Silver,
+SkyBlue,
+SlateBlue,
+SlateGray,
+SlateGrey,
+Snow,
+SpringGreen,
+SteelBlue,
+Tan,
+Teal,
+Thistle,
+Tomato,
+Turquoise,
+Violet,
+VioletRed,
+Wheat,
+White,
+WhiteSmoke,
+Yellow,
+YellowGreen;
+AliceBlue:=(.94,.972,1);
+AntiqueWhite:=(.98,.92,.844);
+Aqua:=(0,1,1);
+Aquamarine:=(.498,1,.83);
+Azure:=(.94,1,1);
+Beige:=(.96,.96,.864);
+Bisque:=(1,.894,.77);
+Black:=(0,0,0);
+BlanchedAlmond:=(1,.92,.804);
+Blue:=(0,0,1);
+BlueViolet:=(.54,.17,.888);
+Brown:=(.648,.165,.165);
+BurlyWood:=(.87,.72,.53);
+CadetBlue:=(.372,.62,.628);
+Chartreuse:=(.498,1,0);
+Chocolate:=(.824,.41,.116);
+Coral:=(1,.498,.312);
+CornflowerBlue:=(.392,.585,.93);
+Cornsilk:=(1,.972,.864);
+Crimson:=(.864,.08,.235);
+Cyan:=(0,1,1);
+DarkBlue:=(0,0,.545);
+DarkCyan:=(0,.545,.545);
+DarkGoldenrod:=(.72,.525,.044);
+DarkGray:=(.664,.664,.664);
+DarkGreen:=(0,.392,0);
+DarkGrey:=(.664,.664,.664);
+DarkKhaki:=(.74,.716,.42);
+DarkMagenta:=(.545,0,.545);
+DarkOliveGreen:=(.332,.42,.185);
+DarkOrange:=(1,.55,0);
+DarkOrchid:=(.6,.196,.8);
+DarkRed:=(.545,0,0);
+DarkSalmon:=(.912,.59,.48);
+DarkSeaGreen:=(.56,.736,.56);
+DarkSlateBlue:=(.284,.24,.545);
+DarkSlateGray:=(.185,.31,.31);
+DarkSlateGrey:=(.185,.31,.31);
+DarkTurquoise:=(0,.808,.82);
+DarkViolet:=(.58,0,.828);
+DeepPink:=(1,.08,.576);
+DeepSkyBlue:=(0,.75,1);
+DimGray:=(.41,.41,.41);
+DimGrey:=(.41,.41,.41);
+DodgerBlue:=(.116,.565,1);
+FireBrick:=(.698,.132,.132);
+FloralWhite:=(1,.98,.94);
+ForestGreen:=(.132,.545,.132);
+Fuchsia:=(1,0,1);
+Gainsboro:=(.864,.864,.864);
+GhostWhite:=(.972,.972,1);
+Gold:=(1,.844,0);
+Goldenrod:=(.855,.648,.125);
+Gray:=(.5,.5,.5);
+Green:=(0,.5,0);
+GreenYellow:=(.68,1,.185);
+Grey:=(.5,.5,.5);
+Honeydew:=(.94,1,.94);
+HotPink:=(1,.41,.705);
+IndianRed:=(.804,.36,.36);
+Indigo:=(.294,0,.51);
+Ivory:=(1,1,.94);
+Khaki:=(.94,.9,.55);
+Lavender:=(.9,.9,.98);
+LavenderBlush:=(1,.94,.96);
+LawnGreen:=(.488,.99,0);
+LemonChiffon:=(1,.98,.804);
+LightBlue:=(.68,.848,.9);
+LightCoral:=(.94,.5,.5);
+LightCyan:=(.88,1,1);
+LightGoldenrod:=(.933,.867,.51);
+LightGoldenrodYellow:=(.98,.98,.824);
+LightGray:=(.828,.828,.828);
+LightGreen:=(.565,.932,.565);
+LightGrey:=(.828,.828,.828);
+LightPink:=(1,.712,.756);
+LightSalmon:=(1,.628,.48);
+LightSeaGreen:=(.125,.698,.668);
+LightSkyBlue:=(.53,.808,.98);
+LightSlateBlue:=(.518,.44,1);
+LightSlateGray:=(.468,.532,.6);
+LightSlateGrey:=(.468,.532,.6);
+LightSteelBlue:=(.69,.77,.87);
+LightYellow:=(1,1,.88);
+Lime:=(0,1,0);
+LimeGreen:=(.196,.804,.196);
+Linen:=(.98,.94,.9);
+Magenta:=(1,0,1);
+Maroon:=(.5,0,0);
+MediumAquamarine:=(.4,.804,.668);
+MediumBlue:=(0,0,.804);
+MediumOrchid:=(.73,.332,.828);
+MediumPurple:=(.576,.44,.86);
+MediumSeaGreen:=(.235,.7,.444);
+MediumSlateBlue:=(.484,.408,.932);
+MediumSpringGreen:=(0,.98,.604);
+MediumTurquoise:=(.284,.82,.8);
+MediumVioletRed:=(.78,.084,.52);
+MidnightBlue:=(.098,.098,.44);
+MintCream:=(.96,1,.98);
+MistyRose:=(1,.894,.884);
+Moccasin:=(1,.894,.71);
+NavajoWhite:=(1,.87,.68);
+Navy:=(0,0,.5);
+NavyBlue:=(0,0,.5);
+OldLace:=(.992,.96,.9);
+Olive:=(.5,.5,0);
+OliveDrab:=(.42,.556,.136);
+Orange:=(1,.648,0);
+OrangeRed:=(1,.27,0);
+Orchid:=(.855,.44,.84);
+PaleGoldenrod:=(.932,.91,.668);
+PaleGreen:=(.596,.985,.596);
+PaleTurquoise:=(.688,.932,.932);
+PaleVioletRed:=(.86,.44,.576);
+PapayaWhip:=(1,.936,.835);
+PeachPuff:=(1,.855,.725);
+Peru:=(.804,.52,.248);
+Pink:=(1,.752,.796);
+Plum:=(.868,.628,.868);
+PowderBlue:=(.69,.88,.9);
+Purple:=(.5,0,.5);
+Red:=(1,0,0);
+RosyBrown:=(.736,.56,.56);
+RoyalBlue:=(.255,.41,.884);
+SaddleBrown:=(.545,.27,.075);
+Salmon:=(.98,.5,.448);
+SandyBrown:=(.956,.644,.376);
+SeaGreen:=(.18,.545,.34);
+Seashell:=(1,.96,.932);
+Sienna:=(.628,.32,.176);
+Silver:=(.752,.752,.752);
+SkyBlue:=(.53,.808,.92);
+SlateBlue:=(.415,.352,.804);
+SlateGray:=(.44,.5,.565);
+SlateGrey:=(.44,.5,.565);
+Snow:=(1,.98,.98);
+SpringGreen:=(0,1,.498);
+SteelBlue:=(.275,.51,.705);
+Tan:=(.824,.705,.55);
+Teal:=(0,.5,.5);
+Thistle:=(.848,.75,.848);
+Tomato:=(1,.39,.28);
+Turquoise:=(.25,.88,.815);
+Violet:=(.932,.51,.932);
+VioletRed:=(.816,.125,.565);
+Wheat:=(.96,.87,.7);
+White:=(1,1,1);
+WhiteSmoke:=(.96,.96,.96);
+Yellow:=(1,1,0);
+YellowGreen:=(.604,.804,.196);
+enddef;
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-x11nam-def.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-x11nam-def.mp
new file mode 100644
index 0000000000..034235d3f4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-x11nam-def.mp
@@ -0,0 +1,409 @@
+%%% file mpcolornames-spec-x11nam-def.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+def _mpcolornames_spec_xelevennam_def=
+rgbcolor
+AntiqueWhite[],
+Aquamarine[],
+Azure[],
+Bisque[],
+Blue[],
+Brown[],
+Burlywood[],
+CadetBlue[],
+Chartreuse[],
+Chocolate[],
+Coral[],
+Cornsilk[],
+Cyan[],
+DarkGoldenrod[],
+DarkOliveGreen[],
+DarkOrange[],
+DarkOrchid[],
+DarkSeaGreen[],
+DarkSlateGray[],
+DeepPink[],
+DeepSkyBlue[],
+DodgerBlue[],
+Firebrick[],
+Gold[],
+Goldenrod[],
+Green[],
+Honeydew[],
+HotPink[],
+IndianRed[],
+Ivory[],
+Khaki[],
+LavenderBlush[],
+LemonChiffon[],
+LightBlue[],
+LightCyan[],
+LightGoldenrod[],
+LightPink[],
+LightSalmon[],
+LightSkyBlue[],
+LightSteelBlue[],
+LightYellow[],
+Magenta[],
+Maroon[],
+MediumOrchid[],
+MediumPurple[],
+MistyRose[],
+NavajoWhite[],
+OliveDrab[],
+Orange[],
+OrangeRed[],
+Orchid[],
+PaleGreen[],
+PaleTurquoise[],
+PaleVioletRed[],
+PeachPuff[],
+Pink[],
+Plum[],
+Purple[],
+Red[],
+RosyBrown[],
+RoyalBlue[],
+Salmon[],
+SeaGreen[],
+Seashell[],
+Sienna[],
+SkyBlue[],
+SlateBlue[],
+SlateGray[],
+Snow[],
+SpringGreen[],
+SteelBlue[],
+Tan[],
+Thistle[],
+Tomato[],
+Turquoise[],
+VioletRed[],
+Wheat[],
+Yellow[],
+Gray[],
+Grey[];
+AntiqueWhite1:=(1,.936,.86);
+AntiqueWhite2:=(.932,.875,.8);
+AntiqueWhite3:=(.804,.752,.69);
+AntiqueWhite4:=(.545,.512,.47);
+Aquamarine1:=(.498,1,.83);
+Aquamarine2:=(.464,.932,.776);
+Aquamarine3:=(.4,.804,.668);
+Aquamarine4:=(.27,.545,.455);
+Azure1:=(.94,1,1);
+Azure2:=(.88,.932,.932);
+Azure3:=(.756,.804,.804);
+Azure4:=(.512,.545,.545);
+Bisque1:=(1,.894,.77);
+Bisque2:=(.932,.835,.716);
+Bisque3:=(.804,.716,.62);
+Bisque4:=(.545,.49,.42);
+Blue1:=(0,0,1);
+Blue2:=(0,0,.932);
+Blue3:=(0,0,.804);
+Blue4:=(0,0,.545);
+Brown1:=(1,.25,.25);
+Brown2:=(.932,.23,.23);
+Brown3:=(.804,.2,.2);
+Brown4:=(.545,.136,.136);
+Burlywood1:=(1,.828,.608);
+Burlywood2:=(.932,.772,.57);
+Burlywood3:=(.804,.668,.49);
+Burlywood4:=(.545,.45,.332);
+CadetBlue1:=(.596,.96,1);
+CadetBlue2:=(.556,.898,.932);
+CadetBlue3:=(.48,.772,.804);
+CadetBlue4:=(.325,.525,.545);
+Chartreuse1:=(.498,1,0);
+Chartreuse2:=(.464,.932,0);
+Chartreuse3:=(.4,.804,0);
+Chartreuse4:=(.27,.545,0);
+Chocolate1:=(1,.498,.14);
+Chocolate2:=(.932,.464,.13);
+Chocolate3:=(.804,.4,.112);
+Chocolate4:=(.545,.27,.075);
+Coral1:=(1,.448,.336);
+Coral2:=(.932,.415,.312);
+Coral3:=(.804,.356,.27);
+Coral4:=(.545,.244,.185);
+Cornsilk1:=(1,.972,.864);
+Cornsilk2:=(.932,.91,.804);
+Cornsilk3:=(.804,.785,.694);
+Cornsilk4:=(.545,.532,.47);
+Cyan1:=(0,1,1);
+Cyan2:=(0,.932,.932);
+Cyan3:=(0,.804,.804);
+Cyan4:=(0,.545,.545);
+DarkGoldenrod1:=(1,.725,.06);
+DarkGoldenrod2:=(.932,.68,.055);
+DarkGoldenrod3:=(.804,.585,.048);
+DarkGoldenrod4:=(.545,.396,.03);
+DarkOliveGreen1:=(.792,1,.44);
+DarkOliveGreen2:=(.736,.932,.408);
+DarkOliveGreen3:=(.635,.804,.352);
+DarkOliveGreen4:=(.43,.545,.24);
+DarkOrange1:=(1,.498,0);
+DarkOrange2:=(.932,.464,0);
+DarkOrange3:=(.804,.4,0);
+DarkOrange4:=(.545,.27,0);
+DarkOrchid1:=(.75,.244,1);
+DarkOrchid2:=(.698,.228,.932);
+DarkOrchid3:=(.604,.196,.804);
+DarkOrchid4:=(.408,.132,.545);
+DarkSeaGreen1:=(.756,1,.756);
+DarkSeaGreen2:=(.705,.932,.705);
+DarkSeaGreen3:=(.608,.804,.608);
+DarkSeaGreen4:=(.41,.545,.41);
+DarkSlateGray1:=(.592,1,1);
+DarkSlateGray2:=(.552,.932,.932);
+DarkSlateGray3:=(.475,.804,.804);
+DarkSlateGray4:=(.32,.545,.545);
+DeepPink1:=(1,.08,.576);
+DeepPink2:=(.932,.07,.536);
+DeepPink3:=(.804,.064,.464);
+DeepPink4:=(.545,.04,.312);
+DeepSkyBlue1:=(0,.75,1);
+DeepSkyBlue2:=(0,.698,.932);
+DeepSkyBlue3:=(0,.604,.804);
+DeepSkyBlue4:=(0,.408,.545);
+DodgerBlue1:=(.116,.565,1);
+DodgerBlue2:=(.11,.525,.932);
+DodgerBlue3:=(.094,.455,.804);
+DodgerBlue4:=(.064,.305,.545);
+Firebrick1:=(1,.19,.19);
+Firebrick2:=(.932,.172,.172);
+Firebrick3:=(.804,.15,.15);
+Firebrick4:=(.545,.1,.1);
+Gold1:=(1,.844,0);
+Gold2:=(.932,.79,0);
+Gold3:=(.804,.68,0);
+Gold4:=(.545,.46,0);
+Goldenrod1:=(1,.756,.145);
+Goldenrod2:=(.932,.705,.132);
+Goldenrod3:=(.804,.608,.112);
+Goldenrod4:=(.545,.41,.08);
+Green1:=(0,1,0);
+Green2:=(0,.932,0);
+Green3:=(0,.804,0);
+Green4:=(0,.545,0);
+Honeydew1:=(.94,1,.94);
+Honeydew2:=(.88,.932,.88);
+Honeydew3:=(.756,.804,.756);
+Honeydew4:=(.512,.545,.512);
+HotPink1:=(1,.43,.705);
+HotPink2:=(.932,.415,.655);
+HotPink3:=(.804,.376,.565);
+HotPink4:=(.545,.228,.385);
+IndianRed1:=(1,.415,.415);
+IndianRed2:=(.932,.39,.39);
+IndianRed3:=(.804,.332,.332);
+IndianRed4:=(.545,.228,.228);
+Ivory1:=(1,1,.94);
+Ivory2:=(.932,.932,.88);
+Ivory3:=(.804,.804,.756);
+Ivory4:=(.545,.545,.512);
+Khaki1:=(1,.965,.56);
+Khaki2:=(.932,.9,.52);
+Khaki3:=(.804,.776,.45);
+Khaki4:=(.545,.525,.305);
+LavenderBlush1:=(1,.94,.96);
+LavenderBlush2:=(.932,.88,.898);
+LavenderBlush3:=(.804,.756,.772);
+LavenderBlush4:=(.545,.512,.525);
+LemonChiffon1:=(1,.98,.804);
+LemonChiffon2:=(.932,.912,.75);
+LemonChiffon3:=(.804,.79,.648);
+LemonChiffon4:=(.545,.536,.44);
+LightBlue1:=(.75,.936,1);
+LightBlue2:=(.698,.875,.932);
+LightBlue3:=(.604,.752,.804);
+LightBlue4:=(.408,.512,.545);
+LightCyan1:=(.88,1,1);
+LightCyan2:=(.82,.932,.932);
+LightCyan3:=(.705,.804,.804);
+LightCyan4:=(.48,.545,.545);
+LightGoldenrod1:=(1,.925,.545);
+LightGoldenrod2:=(.932,.864,.51);
+LightGoldenrod3:=(.804,.745,.44);
+LightGoldenrod4:=(.545,.505,.298);
+LightPink1:=(1,.684,.725);
+LightPink2:=(.932,.635,.68);
+LightPink3:=(.804,.55,.585);
+LightPink4:=(.545,.372,.396);
+LightSalmon1:=(1,.628,.48);
+LightSalmon2:=(.932,.585,.448);
+LightSalmon3:=(.804,.505,.385);
+LightSalmon4:=(.545,.34,.26);
+LightSkyBlue1:=(.69,.888,1);
+LightSkyBlue2:=(.644,.828,.932);
+LightSkyBlue3:=(.552,.712,.804);
+LightSkyBlue4:=(.376,.484,.545);
+LightSteelBlue1:=(.792,.884,1);
+LightSteelBlue2:=(.736,.824,.932);
+LightSteelBlue3:=(.635,.71,.804);
+LightSteelBlue4:=(.43,.484,.545);
+LightYellow1:=(1,1,.88);
+LightYellow2:=(.932,.932,.82);
+LightYellow3:=(.804,.804,.705);
+LightYellow4:=(.545,.545,.48);
+Magenta1:=(1,0,1);
+Magenta2:=(.932,0,.932);
+Magenta3:=(.804,0,.804);
+Magenta4:=(.545,0,.545);
+Maroon1:=(1,.204,.7);
+Maroon2:=(.932,.19,.655);
+Maroon3:=(.804,.16,.565);
+Maroon4:=(.545,.11,.385);
+MediumOrchid1:=(.88,.4,1);
+MediumOrchid2:=(.82,.372,.932);
+MediumOrchid3:=(.705,.32,.804);
+MediumOrchid4:=(.48,.215,.545);
+MediumPurple1:=(.67,.51,1);
+MediumPurple2:=(.624,.475,.932);
+MediumPurple3:=(.536,.408,.804);
+MediumPurple4:=(.365,.28,.545);
+MistyRose1:=(1,.894,.884);
+MistyRose2:=(.932,.835,.824);
+MistyRose3:=(.804,.716,.71);
+MistyRose4:=(.545,.49,.484);
+NavajoWhite1:=(1,.87,.68);
+NavajoWhite2:=(.932,.81,.63);
+NavajoWhite3:=(.804,.7,.545);
+NavajoWhite4:=(.545,.475,.37);
+OliveDrab1:=(.752,1,.244);
+OliveDrab2:=(.7,.932,.228);
+OliveDrab3:=(.604,.804,.196);
+OliveDrab4:=(.41,.545,.132);
+Orange1:=(1,.648,0);
+Orange2:=(.932,.604,0);
+Orange3:=(.804,.52,0);
+Orange4:=(.545,.352,0);
+OrangeRed1:=(1,.27,0);
+OrangeRed2:=(.932,.25,0);
+OrangeRed3:=(.804,.215,0);
+OrangeRed4:=(.545,.145,0);
+Orchid1:=(1,.512,.98);
+Orchid2:=(.932,.48,.912);
+Orchid3:=(.804,.41,.79);
+Orchid4:=(.545,.28,.536);
+PaleGreen1:=(.604,1,.604);
+PaleGreen2:=(.565,.932,.565);
+PaleGreen3:=(.488,.804,.488);
+PaleGreen4:=(.33,.545,.33);
+PaleTurquoise1:=(.732,1,1);
+PaleTurquoise2:=(.684,.932,.932);
+PaleTurquoise3:=(.59,.804,.804);
+PaleTurquoise4:=(.4,.545,.545);
+PaleVioletRed1:=(1,.51,.67);
+PaleVioletRed2:=(.932,.475,.624);
+PaleVioletRed3:=(.804,.408,.536);
+PaleVioletRed4:=(.545,.28,.365);
+PeachPuff1:=(1,.855,.725);
+PeachPuff2:=(.932,.796,.68);
+PeachPuff3:=(.804,.688,.585);
+PeachPuff4:=(.545,.468,.396);
+Pink1:=(1,.71,.772);
+Pink2:=(.932,.664,.72);
+Pink3:=(.804,.57,.62);
+Pink4:=(.545,.39,.424);
+Plum1:=(1,.732,1);
+Plum2:=(.932,.684,.932);
+Plum3:=(.804,.59,.804);
+Plum4:=(.545,.4,.545);
+Purple1:=(.608,.19,1);
+Purple2:=(.57,.172,.932);
+Purple3:=(.49,.15,.804);
+Purple4:=(.332,.1,.545);
+Red1:=(1,0,0);
+Red2:=(.932,0,0);
+Red3:=(.804,0,0);
+Red4:=(.545,0,0);
+RosyBrown1:=(1,.756,.756);
+RosyBrown2:=(.932,.705,.705);
+RosyBrown3:=(.804,.608,.608);
+RosyBrown4:=(.545,.41,.41);
+RoyalBlue1:=(.284,.464,1);
+RoyalBlue2:=(.264,.43,.932);
+RoyalBlue3:=(.228,.372,.804);
+RoyalBlue4:=(.152,.25,.545);
+Salmon1:=(1,.55,.41);
+Salmon2:=(.932,.51,.385);
+Salmon3:=(.804,.44,.33);
+Salmon4:=(.545,.298,.224);
+SeaGreen1:=(.33,1,.624);
+SeaGreen2:=(.305,.932,.58);
+SeaGreen3:=(.264,.804,.5);
+SeaGreen4:=(.18,.545,.34);
+Seashell1:=(1,.96,.932);
+Seashell2:=(.932,.898,.87);
+Seashell3:=(.804,.772,.75);
+Seashell4:=(.545,.525,.51);
+Sienna1:=(1,.51,.28);
+Sienna2:=(.932,.475,.26);
+Sienna3:=(.804,.408,.224);
+Sienna4:=(.545,.28,.15);
+SkyBlue1:=(.53,.808,1);
+SkyBlue2:=(.494,.752,.932);
+SkyBlue3:=(.424,.65,.804);
+SkyBlue4:=(.29,.44,.545);
+SlateBlue1:=(.512,.435,1);
+SlateBlue2:=(.48,.404,.932);
+SlateBlue3:=(.41,.35,.804);
+SlateBlue4:=(.28,.235,.545);
+SlateGray1:=(.776,.888,1);
+SlateGray2:=(.725,.828,.932);
+SlateGray3:=(.624,.712,.804);
+SlateGray4:=(.424,.484,.545);
+Snow1:=(1,.98,.98);
+Snow2:=(.932,.912,.912);
+Snow3:=(.804,.79,.79);
+Snow4:=(.545,.536,.536);
+SpringGreen1:=(0,1,.498);
+SpringGreen2:=(0,.932,.464);
+SpringGreen3:=(0,.804,.4);
+SpringGreen4:=(0,.545,.27);
+SteelBlue1:=(.39,.72,1);
+SteelBlue2:=(.36,.675,.932);
+SteelBlue3:=(.31,.58,.804);
+SteelBlue4:=(.21,.392,.545);
+Tan1:=(1,.648,.31);
+Tan2:=(.932,.604,.288);
+Tan3:=(.804,.52,.248);
+Tan4:=(.545,.352,.17);
+Thistle1:=(1,.884,1);
+Thistle2:=(.932,.824,.932);
+Thistle3:=(.804,.71,.804);
+Thistle4:=(.545,.484,.545);
+Tomato1:=(1,.39,.28);
+Tomato2:=(.932,.36,.26);
+Tomato3:=(.804,.31,.224);
+Tomato4:=(.545,.21,.15);
+Turquoise1:=(0,.96,1);
+Turquoise2:=(0,.898,.932);
+Turquoise3:=(0,.772,.804);
+Turquoise4:=(0,.525,.545);
+VioletRed1:=(1,.244,.59);
+VioletRed2:=(.932,.228,.55);
+VioletRed3:=(.804,.196,.47);
+VioletRed4:=(.545,.132,.32);
+Wheat1:=(1,.905,.73);
+Wheat2:=(.932,.848,.684);
+Wheat3:=(.804,.73,.59);
+Wheat4:=(.545,.494,.4);
+Yellow1:=(1,1,0);
+Yellow2:=(.932,.932,0);
+Yellow3:=(.804,.804,0);
+Yellow4:=(.545,.545,0);
+Gray0:=(.745,.745,.745);
+Green0:=(0,1,0);
+Grey0:=(.745,.745,.745);
+Maroon0:=(.69,.19,.376);
+Purple0:=(.628,.125,.94);
+enddef;
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-xcolor-sty.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-xcolor-sty.mp
new file mode 100644
index 0000000000..5f573414b7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames-spec-xcolor-sty.mp
@@ -0,0 +1,128 @@
+%%% file mpcolornames-spec-xcolor-sty.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+def _mpcolornames_spec_xcolor_sty=
+rgbcolor
+rgb_red,
+rgb_green,
+rgb_blue,
+rgb_brown,
+rgb_lime,
+rgb_orange,
+rgb_pink,
+rgb_purple,
+rgb_teal,
+rgb_violet,
+rgb_cyan,
+rgb_magenta,
+rgb_yellow,
+rgb_olive,
+rgb_black,
+rgb_darkgray,
+rgb_gray,
+rgb_lightgray,
+rgb_white;
+cmykcolor
+cmyk_red,
+cmyk_green,
+cmyk_blue,
+cmyk_brown,
+cmyk_lime,
+cmyk_orange,
+cmyk_pink,
+cmyk_purple,
+cmyk_teal,
+cmyk_violet,
+cmyk_cyan,
+cmyk_magenta,
+cmyk_yellow,
+cmyk_olive,
+cmyk_black,
+cmyk_darkgray,
+cmyk_gray,
+cmyk_lightgray,
+cmyk_white;
+numeric
+grey_red,
+grey_green,
+grey_blue,
+grey_brown,
+grey_lime,
+grey_orange,
+grey_pink,
+grey_purple,
+grey_teal,
+grey_violet,
+grey_cyan,
+grey_magenta,
+grey_yellow,
+grey_olive,
+grey_black,
+grey_darkgray,
+grey_gray,
+grey_lightgray,
+grey_white;
+rgb_red:=(1,0,0);
+rgb_green:=(0,1,0);
+rgb_blue:=(0,0,1);
+rgb_brown:=(.75,.5,.25);
+rgb_lime:=(.75,1,0);
+rgb_orange:=(1,.5,0);
+rgb_pink:=(1,.75,.75);
+rgb_purple:=(.75,0,.25);
+rgb_teal:=(0,.5,.5);
+rgb_violet:=(.5,0,.5);
+rgb_cyan:=(0,1,1);
+rgb_magenta:=(1,0,1);
+rgb_yellow:=(1,1,0);
+rgb_olive:=(.5,.5,0);
+rgb_black:=(0,0,0);
+rgb_darkgray:=(.25,.25,.25);
+rgb_gray:=(.5,.5,.5);
+rgb_lightgray:=(.75,.75,.75);
+rgb_white:=(1,1,1);
+cmyk_red:=(0,1,1,0);
+cmyk_green:=(1,0,1,0);
+cmyk_blue:=(1,1,0,0);
+cmyk_brown:=(0,.25,.5,.25);
+cmyk_lime:=(.25,0,1,0);
+cmyk_orange:=(0,.5,1,0);
+cmyk_pink:=(0,.25,.25,0);
+cmyk_purple:=(0,.75,.5,.25);
+cmyk_teal:=(.5,0,0,.5);
+cmyk_violet:=(0,.5,0,.5);
+cmyk_cyan:=(1,0,0,0);
+cmyk_magenta:=(0,1,0,0);
+cmyk_yellow:=(0,0,1,0);
+cmyk_olive:=(0,0,1,.5);
+cmyk_black:=(0,0,0,1);
+cmyk_darkgray:=(0,0,0,.75);
+cmyk_gray:=(0,0,0,.5);
+cmyk_lightgray:=(0,0,0,.25);
+cmyk_white:=(0,0,0,0);
+grey_red:=.3;
+grey_green:=.59;
+grey_blue:=.11;
+grey_brown:=.5475;
+grey_lime:=.815;
+grey_orange:=.595;
+grey_pink:=.825;
+grey_purple:=.2525;
+grey_teal:=.35;
+grey_violet:=.205;
+grey_cyan:=.7;
+grey_magenta:=.41;
+grey_yellow:=.89;
+grey_olive:=.39;
+grey_black:=0;
+grey_darkgray:=.25;
+grey_gray:=.5;
+grey_lightgray:=.75;
+grey_white:=1;
+enddef;
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames.mp b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames.mp
new file mode 100644
index 0000000000..68414cef2a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/metapost/mpcolornames/mpcolornames.mp
@@ -0,0 +1,60 @@
+%%% file mpcolornames.mp
+%%% Copyright 2009, 2011 Stephan Hennig
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+if known mpcolornames_fileversion: endinput fi;
+string mpcolornames_fileversion;
+mpcolornames_fileversion := "v0.20 (2011/07/14)";
+message "Loading package mpcolornames.mp " & mpcolornames_fileversion;
+
+%%% Load color name definitions.
+input mpcolornames-spec-dvipsnam-def
+input mpcolornames-spec-svgnam-def
+input mpcolornames-spec-x11nam-def
+input mpcolornames-spec-xcolor-sty
+
+%%% Declare all color variable identifiers.
+_mpcolornames_spec_dvipsnam_def;
+_mpcolornames_spec_svgnam_def;
+_mpcolornames_spec_xelevennam_def;
+_mpcolornames_spec_xcolor_sty;
+
+
+%%% This user macro saves all color identifiers clashing
+%%% in DVIPS and SVG specification and re-declares all
+%%% DVIPS color names (see macro svgnames).
+def dvipsnames=
+save Aquamarine, Black, Blue, BlueViolet, Brown, CadetBlue,
+ CornflowerBlue, Cyan, DarkOrchid, ForestGreen, Fuchsia, Goldenrod,
+ Gray, Green, GreenYellow, Lavender, LimeGreen, Magenta, Maroon,
+ MidnightBlue, NavyBlue, Orange, OrangeRed, Orchid, Plum, Purple, Red,
+ RoyalBlue, Salmon, SeaGreen, SkyBlue, SpringGreen, Tan, Thistle,
+ Turquoise, Violet, VioletRed, White, Yellow, YellowGreen;
+ _mpcolornames_spec_dvipsnam_def;
+enddef;
+
+%%% This user macro saves all color identifiers clashing
+%%% in DVIPS and SVG specification and re-declares all
+%%% SVG color names (see macro dvipsnames).
+def svgnames=
+save Aquamarine, Black, Blue, BlueViolet, Brown, CadetBlue,
+ CornflowerBlue, Cyan, DarkOrchid, ForestGreen, Fuchsia, Goldenrod,
+ Gray, Green, GreenYellow, Lavender, LimeGreen, Magenta, Maroon,
+ MidnightBlue, NavyBlue, Orange, OrangeRed, Orchid, Plum, Purple, Red,
+ RoyalBlue, Salmon, SeaGreen, SkyBlue, SpringGreen, Tan, Thistle,
+ Turquoise, Violet, VioletRed, White, Yellow, YellowGreen;
+ _mpcolornames_spec_svgnam_def;
+enddef;
+
+%%% Define color model constants.
+newinternal nomodel, greyscalemodel, rgbmodel, cmykmodel;
+nomodel := 1;
+greyscalemodel := 3;
+rgbmodel := 5;
+cmykmodel := 7;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/Makefile b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/Makefile
new file mode 100644
index 0000000000..e4464e71fc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/Makefile
@@ -0,0 +1,76 @@
+PDFLATEX = pdflatex
+MPOST = mpost
+MARKDOWN = markdown
+AWK = gawk
+CD = cd
+CP = cp
+RM = rm -f
+ZIP = zip
+PACKAGE=mpcolornames
+VERSION=v020
+
+
+.PHONY: all note clean doc todo release colorspecs
+
+
+note:
+ @echo "*** Makefile for $(PACKAGE) package ***"
+ @echo "Please type:"
+ @echo "make doc to build documentation."
+ @echo "make todo to build TODO list."
+ @echo "make clean to clean this directory."
+ @echo "make release to build a CTAN package."
+ @echo "make colorspecs to process .def files."
+
+
+all: doc
+
+
+doc: $(PACKAGE).pdf
+
+
+todo: TODO.html
+
+clean:
+ $(RM) *.aux *.bbl *.blg *.log *.out *.toc *.mps
+ $(RM) mpcolornames-spec-*.mp proof-spec-*.mp tab-spec-*.tex tab-clash-*.tex
+
+
+$(PACKAGE).pdf: colorspecs tab-clash
+ $(MPOST) expl-array-index
+ $(MPOST) fig-clash-svg-dvips
+ $(MPOST) proof-spec-dvipsnam-def
+ $(MPOST) proof-spec-svgnam-def
+ $(MPOST) proof-spec-x11nam-def
+ $(MPOST) proof-spec-xcolor-sty
+ $(MPOST) proof-spec-plain-mp
+ $(PDFLATEX) $(PACKAGE)
+ $(PDFLATEX) $(PACKAGE)
+ $(PDFLATEX) $(PACKAGE)
+
+
+TODO.html: TODO.mkd
+ $(MARKDOWN) $<
+
+
+colorspecs:
+ $(AWK) -f spec-svgnam-def.awk svgnam.def
+ $(AWK) -f spec-dvipsnam-def.awk dvipsnam.def
+ $(AWK) -f spec-x11nam-def.awk x11nam.def
+ $(AWK) -f spec-xcolor-sty.awk xcolor.sty
+ $(AWK) -f spec-plain-mp.awk plain.mp
+
+
+tab-clash:
+ $(AWK) -f tab-clash-svg-dvips.awk mpcolornames-spec-svgnam-def.mp mpcolornames-spec-dvipsnam-def.mp
+
+
+release: doc
+ $(RM) package/$(PACKAGE)-*.zip
+ $(RM) package/texmf/metapost/$(PACKAGE)/*
+ $(RM) package/texmf/doc/metapost/$(PACKAGE)/*
+ $(RM) package/texmf/source/metapost/$(PACKAGE)/*
+ $(CP) $(PACKAGE)*.mp package/texmf/metapost/$(PACKAGE)/
+ $(CP) $(PACKAGE).tex tab-*.tex expl-*.mp fig-*.mp CHANGES LICENSE README $(PACKAGE).pdf proof-*.mp package/texmf/doc/metapost/$(PACKAGE)/
+ $(CP) *.awk Makefile package/texmf/source/metapost/$(PACKAGE)/
+ $(CD) package && $(ZIP) -9r $(PACKAGE)-$(VERSION) texmf && $(CD) ..
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-dvipsnam-def.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-dvipsnam-def.awk
new file mode 100644
index 0000000000..5d57ac5c0d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-dvipsnam-def.awk
@@ -0,0 +1,72 @@
+### file spec-dvipsnam-def.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = "{|}|,"
+ i = 0
+}
+# file version
+/\[[0-9]+\/[0-9]+\/[0-9]+ v[0-9.]+[a-z]* .*\]/ {
+ match($0, "v[0-9.]+[a-z]*")
+ version = substr($0, RSTART, RLENGTH)
+}
+# CMYK color spec
+/^\\DefineNamedColor\{named\}\{[a-zA-Z]+\} *\{cmyk\}\{[0-9.]+,[0-9.]+,[0-9.]+,[0-9.]+\}/ {
+ i++
+ name[i] = $4
+ c[i] = $8
+ m[i] = $9
+ y[i] = $10
+ k[i] = $11
+# print name[i] "=(" c[i] "," m[i] "," y[i] "," k[i] ")"
+}
+END {
+ print "Found " i " DVIPS colors (" version ")."
+# Build file mpcolornames-spec-dvipsnam-def.mp.
+ file = "mpcolornames-spec-dvipsnam-def.mp"
+ print "%%% file " file > file
+ print "%%% Copyright 2009, 2011 Stephan Hennig" >> file
+ print "%" >> file
+ print "% This work may be distributed and/or modified under the conditions of" >> file
+ print "% the LaTeX Project Public License, either version 1.3 of this license" >> file
+ print "% or (at your option) any later version. The latest version of this" >> file
+ print "% license is in http://www.latex-project.org/lppl.txt" >> file
+ print "%" >> file
+ print "def _mpcolornames_spec_dvipsnam_def=" >> file
+ print "cmykcolor" >> file
+ for (j = 1; j < i; j++) print name[j] "," >> file
+ print name[i] ";" >> file
+ for (j = 1; j <= i; j++) print name[j] ":=(" c[j] "," m[j] "," y[j] "," k[j] ");" >> file
+ print "enddef;" >> file
+ print "endinput" >> file
+
+# Build file proof-spec-dvipsnam-def.mp.
+ file = "proof-spec-dvipsnam-def.mp"
+ print "%%% file " file > file
+ print "input proof-mpcolornames" >> file
+ print "dvipsnames;" >> file
+ print "defaultcolormodel := 7;% CMYK" >> file
+ print "specname := \"dvipsnam-def\";" >> file
+ for (j = 1; j <= i; j++) print "proof(" name[j] ");" >> file
+ print "end" >> file
+
+# Build file tab-spec-dvipsnam-def.tex.
+ file = "tab-spec-dvipsnam-def.tex"
+ print "%%% file " file > file
+ print "\\vspace{\\floatsep}" >> file
+ print "\\begin{multicols}{4}[\\noindent\\parbox{\\textwidth}{%" >> file
+ print " \\captionof{table}{CMYK colors from DVIPS specification.}%" >> file
+ print " \\label{tab:spec-dvipsnam-def}%" >> file
+ print " \\footnotesize Taken from file \\texttt{dvipsnam.def} " version " as distributed by \\LaTeX\\ package \\name{color} (" i " colors)." >> file
+ print " }]" >> file
+ print " \\raggedcolumns" >> file
+ print " \\setlength{\\parindent}{0pt}" >> file
+ print " \\ttfamily\\small\\color{mpcolor}" >> file
+ for (j = 1; j <= i; j++) print "\\colorproof[dvipsnam-def]{" name[j] "}\\par" >> file
+ print "\\end{multicols}" >> file
+}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-plain-mp.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-plain-mp.awk
new file mode 100644
index 0000000000..ab9c64eb97
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-plain-mp.awk
@@ -0,0 +1,72 @@
+### file spec-plain-mp.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = " = |\\(|\\)|,"
+ i = 0
+}
+# file version
+/base_version=\"[0-9.]+[a-z]*\";/ {
+ match($0, "base_version=\"[0-9.]+[a-z]*\"")
+ version = substr($0, RSTART, RLENGTH)
+ match($0, "[0-9.]+[a-z]*")
+ version = substr($0, RSTART, RLENGTH)
+}
+# RGB color spec
+/^[a-z]+ = \([0-9.]+,[0-9.]+,[0-9.]+\);$/ {
+ i++
+ name[i] = $1
+ r[i] = $3
+ g[i] = $4
+ b[i] = $5
+# print name[i] "=(" r[i] "," g[i] "," b[i] ")"
+}
+END {
+ print "Found " i " plain.mp colors (" version ")."
+# Build file mpcolornames-spec-plain-mp.mp.
+ file = "mpcolornames-spec-plain-mp.mp"
+ print "%%% file " file > file
+ print "%%% Copyright 2009, 2011 Stephan Hennig" >> file
+ print "%" >> file
+ print "% This work may be distributed and/or modified under the conditions of" >> file
+ print "% the LaTeX Project Public License, either version 1.3 of this license" >> file
+ print "% or (at your option) any later version. The latest version of this" >> file
+ print "% license is in http://www.latex-project.org/lppl.txt" >> file
+ print "%" >> file
+ print "def _mpcolornames_spec_plain_mp=" >> file
+ print "rgbcolor" >> file
+ for (j = 1; j < i; j++) print name[j] "," >> file
+ print name[i] ";" >> file
+ for (j = 1; j <= i; j++) print name[j] ":=(" r[j] "," g[j] "," b[j] ");" >> file
+ print "enddef;" >> file
+ print "endinput" >> file
+
+# Build file proof-spec-plain-mp.mp.
+ file = "proof-spec-plain-mp.mp"
+ print "%%% file " file > file
+ print "input proof-mpcolornames" >> file
+ print "defaultcolormodel := 5;% RGB" >> file
+ print "specname := \"plain-mp\";" >> file
+ for (j = 1; j <= i; j++) print "proof(" name[j] ");" >> file
+ print "end" >> file
+
+# Build file tab-spec-plain-mp.tex.
+ file = "tab-spec-plain-mp.tex"
+ print "%%% file " file > file
+ print "\\vspace{\\floatsep}" >> file
+ print "\\begin{multicols}{5}[\\noindent\\parbox{\\textwidth}{%" >> file
+ print " \\captionof{table}{Default RGB colors in MetaPost.}%" >> file
+ print " \\label{tab:spec-plain-mp}%" >> file
+ print " \\footnotesize Taken from file \\texttt{plain.mp} " version " as distributed by MetaPost (" i " colors)." >> file
+ print " }]" >> file
+ print " \\raggedcolumns" >> file
+ print " \\setlength{\\parindent}{0pt}" >> file
+ print " \\ttfamily\\small\\color{mpcolor}" >> file
+ for (j = 1; j <= i; j++) print "\\colorproof[plain-mp]{" name[j] "}\\par" >> file
+ print "\\end{multicols}" >> file
+}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-svgnam-def.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-svgnam-def.awk
new file mode 100644
index 0000000000..060be65b73
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-svgnam-def.awk
@@ -0,0 +1,70 @@
+### file spec-svgnam-def.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = ",|;|}"
+ i = 0
+}
+# file version
+/\[[0-9]+\/[0-9]+\/[0-9]+ v[0-9.]+[a-z]* .*\]/ {
+ match($0, "v[0-9.]+[a-z]*")
+ version = substr($0, RSTART, RLENGTH)
+}
+# RGB color spec
+/[a-z]+,[0-9.]+,[0-9.]+,[0-9.]+[;}]/ {
+ i++
+ name[i] = $1
+ r[i] = $2
+ g[i] = $3
+ b[i] = $4
+# print name[i] "=(" r[i] "," g[i] "," b[i] ")"
+}
+END {
+ print "Found " i " SVG colors (" version ")."
+# Build file mpcolornames-spec-svgnam-def.mp.
+ file = "mpcolornames-spec-svgnam-def.mp"
+ print "%%% file " file > file
+ print "%%% Copyright 2009, 2011 Stephan Hennig" >> file
+ print "%" >> file
+ print "% This work may be distributed and/or modified under the conditions of" >> file
+ print "% the LaTeX Project Public License, either version 1.3 of this license" >> file
+ print "% or (at your option) any later version. The latest version of this" >> file
+ print "% license is in http://www.latex-project.org/lppl.txt" >> file
+ print "%" >> file
+ print "def _mpcolornames_spec_svgnam_def=" >> file
+ print "rgbcolor" >> file
+ for (j = 1; j < i; j++) print name[j] "," >> file
+ print name[i] ";" >> file
+ for (j = 1; j <= i; j++) print name[j] ":=(" r[j] "," g[j] "," b[j] ");" >> file
+ print "enddef;" >> file
+ print "endinput" >> file
+
+# Build file proof-spec-svgnam-def.mp.
+ file = "proof-spec-svgnam-def.mp"
+ print "%%% file " file > file
+ print "input proof-mpcolornames" >> file
+ print "defaultcolormodel := 5;% RGB" >> file
+ print "specname := \"svgnam-def\";" >> file
+ for (j = 1; j <= i; j++) print "proof(" name[j] ");" >> file
+ print "end" >> file
+
+# Build file tab-spec-svgnam-def.tex.
+ file = "tab-spec-svgnam-def.tex"
+ print "%%% file " file > file
+ print "\\vspace{\\floatsep}" >> file
+ print "\\begin{multicols}{4}[\\noindent\\parbox{\\textwidth}{%" >> file
+ print " \\captionof{table}{RGB colors from SVG specification.}%" >> file
+ print " \\label{tab:spec-svgnam-def}%" >> file
+ print " \\footnotesize Taken from file \\texttt{svgnam.def} " version " as distributed by \\LaTeX\\ package \\name{xcolor} (" i " colors)." >> file
+ print " }]" >> file
+ print " \\raggedcolumns" >> file
+ print " \\setlength{\\parindent}{0pt}" >> file
+ print " \\ttfamily\\small\\color{mpcolor}" >> file
+ for (j = 1; j <= i; j++) print "\\colorproof[svgnam-def]{" name[j] "}\\par" >> file
+ print "\\end{multicols}" >> file
+}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-x11nam-def.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-x11nam-def.awk
new file mode 100644
index 0000000000..64e4e9c6b4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-x11nam-def.awk
@@ -0,0 +1,81 @@
+### file spec-x11nam-def.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = ",|;|}"
+ i = 0
+ j = 0
+}
+# file version
+/\[[0-9]+\/[0-9]+\/[0-9]+ v[0-9.]+[a-z]* .*\]/ {
+ match($0, "v[0-9.]+[a-z]*")
+ version = substr($0, RSTART, RLENGTH)
+}
+# RGB color spec
+/^[a-zA-Z]+[0-9],[0-9.]+,[0-9.]+,[0-9.]+[;}]/ {
+ i++
+ name[i] = $1
+ r[i] = $2
+ g[i] = $3
+ b[i] = $4
+ basename = name[i]
+ sub(/[0-9]+$/, "", basename)
+ flag = 0
+ for (n = 1; n <= j; n++)
+ if (bname[n] == basename) flag = 1
+ if (flag == 0) {
+ j++
+ bname[j] = basename
+ }
+# print basename ":" name[i] "=(" r[i] "," g[i] "," b[i] ")"
+}
+END {
+ print "Found " i " X11 colors (" version ")."
+ print "Found " j " X11 color base names."
+# Build file mpcolornames-spec-x11nam-def.mp.
+ file = "mpcolornames-spec-x11nam-def.mp"
+ print "%%% file " file > file
+ print "%%% Copyright 2009, 2011 Stephan Hennig" >> file
+ print "%" >> file
+ print "% This work may be distributed and/or modified under the conditions of" >> file
+ print "% the LaTeX Project Public License, either version 1.3 of this license" >> file
+ print "% or (at your option) any later version. The latest version of this" >> file
+ print "% license is in http://www.latex-project.org/lppl.txt" >> file
+ print "%" >> file
+ print "def _mpcolornames_spec_xelevennam_def=" >> file
+ print "rgbcolor" >> file
+ for (n = 1; n < j; n++) print bname[n] "[]," >> file
+ print bname[j] "[];" >> file
+ for (n = 1; n <= i; n++) print name[n] ":=(" r[n] "," g[n] "," b[n] ");" >> file
+ print "enddef;" >> file
+ print "endinput" >> file
+
+# Build file proof-spec-x11nam-def.mp.
+ file = "proof-spec-x11nam-def.mp"
+ print "%%% file " file > file
+ print "input proof-mpcolornames" >> file
+ print "defaultcolormodel := 5;% RGB" >> file
+ print "specname := \"x11nam-def\";" >> file
+ for (n = 1; n <= i; n++) print "proof(" name[n] ");" >> file
+ print "end" >> file
+
+# Build file tab-spec-x11nam-def.tex.
+ file = "tab-spec-x11nam-def.tex"
+ print "%%% file " file > file
+ print "\\vspace{\\floatsep}" >> file
+ print "\\begin{multicols}{4}[\\noindent\\parbox{\\textwidth}{%" >> file
+ print " \\captionof{table}{RGB colors from X11 specification.}%" >> file
+ print " \\label{tab:spec-x11nam-def}%" >> file
+ print " \\footnotesize Taken from file \\texttt{x11nam.def} " version " as distributed by \\LaTeX\\ package \\name{xcolor} (" i " colors)." >> file
+ print " }]" >> file
+ print " \\raggedcolumns" >> file
+ print " \\setlength{\\parindent}{0pt}" >> file
+ print " \\ttfamily\\small\\color{mpcolor}" >> file
+ for (n = 1; n <= i; n++) print "\\colorproof[x11nam-def]{" name[n] "}\\par" >> file
+ print "\\end{multicols}" >> file
+}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-xcolor-sty.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-xcolor-sty.awk
new file mode 100644
index 0000000000..fbf5e3db85
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/spec-xcolor-sty.awk
@@ -0,0 +1,130 @@
+### file spec-xcolor-sty.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = ",|;|}|{| |/"
+ i = 0
+}
+# file version
+/\[[0-9]+\/[0-9]+\/[0-9]+ v[0-9.]+[a-z]* .*\]/ {
+ match($0, "v[0-9.]+[a-z]*")
+ version = substr($0, RSTART, RLENGTH)
+}
+# rgb/hsb/cmyk/gray
+/[a-z]+,[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+[;}]/ {
+ i++
+ name[i] = $3
+ r[i] = $4
+ g[i] = $5
+ b[i] = $6
+ hu[i] = $7
+ sa[i] = $8
+ br[i] = $9
+ c[i] = $10
+ m[i] = $11
+ y[i] = $12
+ k[i] = $13
+ gry[i] = $14
+# print name[i] "=(" r[i] "," g[i] "," b[i] ")(" hu[i] "," sa[i] "," br[i] ")(" c[i] "," m[i] "," y[i] "," k[i] ")(" gry[i] ")"
+}
+# cmyk/rgb/hsb/gray
+/[a-z]+,[0-9.]+,[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+[;}]/ {
+ i++
+ name[i] = $3
+ c[i] = $4
+ m[i] = $5
+ y[i] = $6
+ k[i] = $7
+ r[i] = $8
+ g[i] = $9
+ b[i] = $10
+ hu[i] = $11
+ sa[i] = $12
+ br[i] = $13
+ gry[i] = $14
+# print name[i] "=(" c[i] "," m[i] "," y[i] "," k[i] ")(" r[i] "," g[i] "," b[i] ")(" hu[i] "," sa[i] "," br[i] ")(" gry[i] ")"
+}
+# gray/rgb/hsb/cmyk
+/[a-z]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+\/[0-9.]+,[0-9.]+,[0-9.]+,[0-9.]+[;}]/ {
+ i++
+ name[i] = $3
+ gry[i] = $4
+ r[i] = $5
+ g[i] = $6
+ b[i] = $7
+ hu[i] = $8
+ sa[i] = $9
+ br[i] = $10
+ c[i] = $11
+ m[i] = $12
+ y[i] = $13
+ k[i] = $14
+# print name[i] "=(" gry[i] ")(" r[i] "," g[i] "," b[i] ")(" hu[i] "," sa[i] "," br[i] ")(" c[i] "," m[i] "," y[i] "," k[i] ")"
+}
+END {
+ print "Found " i " base colors (" version ")."
+# Build file mpcolornames-spec-xcolor-sty.mp.
+ file = "mpcolornames-spec-xcolor-sty.mp"
+ print "%%% file " file > file
+ print "%%% Copyright 2009, 2011 Stephan Hennig" >> file
+ print "%" >> file
+ print "% This work may be distributed and/or modified under the conditions of" >> file
+ print "% the LaTeX Project Public License, either version 1.3 of this license" >> file
+ print "% or (at your option) any later version. The latest version of this" >> file
+ print "% license is in http://www.latex-project.org/lppl.txt" >> file
+ print "%" >> file
+ print "def _mpcolornames_spec_xcolor_sty=" >> file
+ print "rgbcolor" >> file
+ for (j = 1; j < i; j++) print "rgb_" name[j] "," >> file
+ print "rgb_" name[i] ";" >> file
+ print "cmykcolor" >> file
+ for (j = 1; j < i; j++) print "cmyk_" name[j] "," >> file
+ print "cmyk_" name[i] ";" >> file
+ print "numeric" >> file
+ for (j = 1; j < i; j++) print "grey_" name[j] "," >> file
+ print "grey_" name[i] ";" >> file
+ for (j = 1; j <= i; j++) print "rgb_" name[j] ":=(" r[j] "," g[j] "," b[j] ");" >> file
+ for (j = 1; j <= i; j++) print "cmyk_" name[j] ":=(" c[j] "," m[j] "," y[j] "," k[j] ");" >> file
+ for (j = 1; j <= i; j++) print "grey_" name[j] ":=" gry[j] ";" >> file
+ print "enddef;" >> file
+ print "endinput" >> file
+
+
+# Build file proof-spec-xcolor-sty.mp.
+ file = "proof-spec-xcolor-sty.mp"
+ print "%%% file " file > file
+ print "input proof-mpcolornames" >> file
+ print "specname := \"xcolor-sty\";" >> file
+ print "defaultcolormodel := 5;% RGB" >> file
+ for (j = 1; j <= i; j++) print "proof(rgb_" name[j] ");" >> file
+ print "defaultcolormodel := 7;% CMYK" >> file
+ for (j = 1; j <= i; j++) print "proof(cmyk_" name[j] ");" >> file
+ print "defaultcolormodel := 3;% grey scale" >> file
+ for (j = 1; j <= i; j++) print "proof(grey_" name[j] ");" >> file
+ print "end" >> file
+
+# Build file tab-spec-xcolor-sty.tex.
+ file = "tab-spec-xcolor-sty.tex"
+ print "%%% file " file > file
+# print "\\vspace{\\floatsep}" >> file
+ print "\\begingroup" >> file
+ print "\\ttfamily\\small\\color{mpcolor}" >> file
+ print "\\setlength{\\tabcolsep}{.5\\columnsep}" >> file
+ print "\\setlength{\\tabcolwidth}{\\textwidth}" >> file
+ print "\\addtolength{\\tabcolwidth}{-4\\tabcolsep}" >> file
+ print "\\setlength{\\tabcolwidth}{.333\\tabcolwidth}" >> file
+ print "\\begin{longtable}{@{}*{3}{p{\\tabcolwidth}}@{}}" >> file
+ print " \\caption{RGB, CMYK, and grey~scale colors from \\LaTeX\\ package \\name{xcolor}.}%" >> file
+ print " \\label{tab:spec-xcolor-sty}\\\\" >> file
+ print "\\multicolumn{3}{l}{\\normalfont\\footnotesize\\normalcolor Taken from file \\texttt{xcolor.sty} " version " as distributed by \\LaTeX\\ package \\name{xcolor} (" i " colors, with augmented names).}" >> file
+ print "\\endfirsthead" >> file
+ print "" >> file
+ for (j = 1; j <= i; j++) print "\\colorproof[xcolor-sty]{" name[j] "}\\\\" >> file
+ print "\\end{longtable}" >> file
+ print "\\endgroup" >> file
+}
diff --git a/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/tab-clash-svg-dvips.awk b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/tab-clash-svg-dvips.awk
new file mode 100644
index 0000000000..0fd63a95f8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpcolornames/source/metapost/mpcolornames/tab-clash-svg-dvips.awk
@@ -0,0 +1,40 @@
+### file tab-clash-svg-dvips.awk
+### Copyright 2009, 2011 Stephan Hennig
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, either version 1.3 of this license
+# or (at your option) any later version. The latest version of this
+# license is in http://www.latex-project.org/lppl.txt
+#
+BEGIN {
+ FS = ":=|(|)|,"
+}
+/^[^:]+:=[(]*[0-9.,]+[)]*);$/ {
+ name = $1
+ color[$1] = color[$1] + 1
+# print name
+}
+END {
+# Build file tab-clash-dvips-svg.tex.
+ file = "tab-clash-svg-dvips.tex"
+ print "%%% file " file > file
+ print "\\vspace{\\floatsep}" >> file
+ print "\\begin{multicols}{4}[\\noindent\\parbox{\\textwidth}{%" >> file
+ print " \\captionof{table}{Color names clashing in SVG (left) and DVIPS (right) specifications.}%" >> file
+ print " \\label{tab:clash-svg-dvips}%" >> file
+ print " }]" >> file
+ print " \\raggedcolumns" >> file
+ print " \\setlength{\\parindent}{0pt}" >> file
+ print " \\ttfamily\\small\\color{mpcolor}" >> file
+ ncolors = asorti(color, sortcolor)# requires gawk
+ n = 0
+ for (i = 1; i <= ncolors; i++) {
+ name = sortcolor[i]
+ if (color[name] > 1) {
+ n++
+ print "\\colorproof{" name "}\\par" >> file
+ }
+ }
+ print "\\end{multicols}" >> file
+ print "Found " n " color names clashing in SVG and DVIPS specs."
+}
diff --git a/graphics/metapost/contrib/macros/mptrees/README.md b/graphics/metapost/contrib/macros/mptrees/README.md
new file mode 100644
index 0000000000..ee9e901cea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mptrees/README.md
@@ -0,0 +1,8 @@
+Package mptrees - Version 17.06 - June 1, 2017
+
+This package provides MetaPost tools for drawing simple probability trees.
+One command and several parameters to control the output are provided.
+
+
+License LPPL 1.3
+
diff --git a/graphics/metapost/contrib/macros/mptrees/mptrees-doc.pdf b/graphics/metapost/contrib/macros/mptrees/mptrees-doc.pdf
new file mode 100644
index 0000000000..816b302304
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mptrees/mptrees-doc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mptrees/mptrees-doc.tex b/graphics/metapost/contrib/macros/mptrees/mptrees-doc.tex
new file mode 100644
index 0000000000..e1a2387913
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mptrees/mptrees-doc.tex
@@ -0,0 +1,717 @@
+\documentclass[11pt,a4paper,english]{article}
+
+% To compile:
+% (pdf)latex mptrees-doc.tex
+% mpost mptrees-doc.mp
+% mpost mptrees-doc.mp
+% (pdf)latex mptrees-doc.tex
+
+ \usepackage{calc,ifthen}
+
+ \usepackage[utf8]{inputenc}
+ \usepackage[T1]{fontenc}
+ \usepackage{lmodern}
+ \usepackage{textcomp}
+ \usepackage{mathtools}
+
+ \usepackage{geometry}
+ \geometry{twoside,hmargin=2cm,vmargin={1.5cm,1.8cm},includefoot}
+
+ \usepackage[bottom]{footmisc}
+
+ \usepackage{mflogo}
+
+
+ \usepackage{multicol}
+ \setlength{\multicolsep}{3pt}
+ \setlength{\columnsep}{0pt}
+
+ \usepackage[toc]{multitoc}
+
+ \usepackage{enumitem}
+ \setlist[description]{font=\ttfamily\bfseries\color{blue}}
+
+ \usepackage[svgnames]{xcolor}
+
+ \usepackage{graphicx}
+ \usepackage{ifpdf}
+ \ifpdf
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+
+ \usepackage{url}
+ \usepackage{verbatim}
+ \usepackage{fancyvrb}
+
+% \usepackage{array}
+% \usepackage{tabularx}
+% \renewcommand{\tabularxcolumn}[1]{>{\arraybackslash}m{#1}}
+
+ \usepackage{tcolorbox}
+ \tcbset{colframe=black,boxsep=0pt,left=3pt,right=3pt,top=0pt,bottom=0pt,boxrule=0.4pt,colback=LightGoldenrod}
+
+ \usepackage{listings}
+ \lstset{columns=flexible,%
+ language=MetaPost,%
+ showstringspaces=false,%
+ basicstyle=\ttfamily,
+ literate={é}{{\'e}}1}
+
+
+ \usepackage{babel}
+ \usepackage[colorlinks=true,urlcolor=blue]{hyperref}
+
+
+
+%%%%%%%%%%%%%%%%%%% moreverb.sty
+\makeatletter
+\newwrite\verbatim@out
+ \immediate\openout \verbatim@out \jobname.mp
+\newwrite\temp@code
+\def\verbatimwrite{%
+ \@bsphack
+ \immediate\openout \temp@code figtmp.mp
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active \catcode`\^^I=12
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out
+ {\the\verbatim@line}%
+ \immediate\write\temp@code
+ {\the\verbatim@line}
+ }%
+ \immediate\write\temp@code{beginfig(\thenumfig)}
+ \verbatim@start}
+
+\def\endverbatimwrite{%
+ \immediate\closeout\temp@code
+ \@esphack
+ }%
+\makeatother
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newlength{\largeurcode}
+\newlength{\largeurfig}
+\newcounter{numfig}
+\setcounter{numfig}{-1}
+
+\newcommand{\codedeuxcol}{%
+ \begin{tcolorbox}
+ \begin{minipage}[c]{\largeurcode}
+ \begin{multicols}{2}
+ \lstinputlisting{figtmp.mp}
+ \end{multicols}
+ \end{minipage}
+ \end{tcolorbox}
+ \par\noindent
+ }
+
+
+\newcommand{\codehoriz}{%
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \hfill
+ }
+
+\newcommand{\codevert}{%
+ {\centering
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \par\noindent}
+ }
+
+\makeatletter
+\newenvironment{codefigure}[3]%
+ {%
+ \refstepcounter{numfig}
+ \setlength{\largeurcode}{#2\linewidth}
+ \ifnum#1=0
+ \setlength{\largeurfig}{\linewidth-\largeurcode-2\fboxsep-2\fboxrule}
+ \def\inscode{\codehoriz}
+ \else
+ \setlength{\largeurfig}{\linewidth}
+ \def\inscode{\codevert}
+ \ifnum#3=1
+ \relax
+ \else
+ \def\inscode{\codedeuxcol}
+ \fi
+ \fi
+ \immediate\write\verbatim@out{beginfig(\thenumfig)}
+ \verbatimwrite
+ }%
+ {%
+ \immediate\write\temp@code{endfig;}
+ \immediate\write\verbatim@out{endfig;}
+
+ \endverbatimwrite
+ \par
+ \noindent
+ \inscode
+ \IfFileExists{\jobname.\thenumfig}%
+ {\begin{minipage}[c]{\largeurfig}
+ \centering \includegraphics{\jobname.\thenumfig}\par
+ \end{minipage}}{}
+ \par}
+\makeatother
+
+\newenvironment{codecache}%
+ {\verbatimwrite}{\endverbatimwrite}
+
+\newcounter{reptmp}
+
+
+\newcounter{repexemple}
+\setcounter{repexemple}{0}
+
+\newcommand{\debutexemple}{\par\vspace{2ex}
+ \refstepcounter{repexemple}
+ \noindent {\bfseries \color{blue!20!black}
+ Example \arabic{repexemple}}
+ \par\nopagebreak\vspace{1ex}
+ }
+
+
+\newenvironment{exemple}[1][0.5]%
+ {\debutexemple
+ \codefigure{0}{#1}{1}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+\newenvironment{exemplev}[2][1]%
+ {\debutexemple
+ \codefigure{1}{#1}{#2}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+
+\newenvironment{figreperedoc}%
+ {\refstepcounter{numfig}
+ \verbatimwrite}%
+ {%
+ \endverbatimwrite%
+ \IfFileExists{\jobname.\thenumfig}%
+ {\includegraphics{\jobname.\thenumfig}}{}
+ }
+
+
+
+\begin{document}
+\title{Documentation of \texttt{mptrees.mp}}
+\date{\today}
+\author{Olivier \textsc{Péault}%
+\footnote{E-mail : \href{mailto:o.peault@posteo.net}{\texttt{o.peault@posteo.net}}}}
+\maketitle
+
+\setcounter{tocdepth}{2}
+
+\setlength{\columnsep}{25pt}
+\tableofcontents
+\setlength{\columnsep}{10pt}
+
+
+\newcommand{\ijc}{[i][j]}
+
+\begin{codecache}
+input mptrees;
+%input latexmp;
+setupLaTeXMP(inputencoding="utf8",
+ packages="fourier,amsmath,nicefrac,babel[english]");
+dirtree:=0;
+\end{codecache}
+
+
+
+
+\section{Overview}
+
+This package is intended to simplify the drawing of probability trees with \MP. It provides one main command and several parameters to control the output.
+
+It can be used in standalone files with two compilations (\verb|latexmp| package is loaded) but it can also be used with Lua\LaTeX{} and \verb|luamplib| package.
+
+
+\begin{description}
+\item[tree\ijc (dim1,dim2,...)(ev1,prob1,ev2,prob2,...)] probability tree located in column \verb|i| and row \verb|j| (see figure below). \verb|dim1|, \verb|dim2|,... can be numerics or pairs and control the dimension of the tree. \verb|ev1|, \verb|prob1|... can be strings or pictures and will be printed (using \verb|latexmp| if strings) at the end of the edge (the event) and above the edge (the probability).
+
+%\item[shiftev, scaleprob, posprob, typeprob, proboffset, dirtree] numerics controlling the scale and position of the probability label, the direction of the tree...
+
+\end{description}
+
+\begin{center}
+\begin{figreperedoc}
+beginfig(0)
+draw tree[1][1](3cm,2cm)("$A$","$p$","$\overline{A}$","$q$");
+draw tree[2][1](3cm,1cm)("$B$","$\nicefrac{1}{4}$","$\overline{B}$","$\nicefrac{3}{4}$");
+draw tree[2][2](3cm,1cm)("$B$","$0.5$","$\overline{B}$","$0.5$");
+draw tree[3][2](3cm,1cm)("$C$","$c$","$\overline{C}$","$1-c$");
+draw tree[4][2](3cm,1cm)("$D$","$a$","$\overline{D}$","$b$");
+drawoptions(dashed evenly);
+draw (Orig_arbre[2][1]+(0,0.5cm))--(Orig_arbre[2][2]-(0,0.5cm))--(Orig_arbre[2][2]-(3.5cm,0.5cm))--(Orig_arbre[2][1]+(-3.5cm,0.5cm))--cycle withcolor red;
+label.bot(textext("\verb|tree[1][1]|"),0.5[Orig_arbre[2][2]-(0,0.5cm),Orig_arbre[2][2]-(3.5cm,0.5cm)]) withcolor red;
+draw (Orig_arbre[3][1]+(0,0.5cm))--(Orig_arbre[3][2]-(0,0.5cm))--(Orig_arbre[2][1]-(0,1cm))--(Orig_arbre[2][1]+(0,1cm))--cycle withcolor 0.5green;
+label.top(textext("\verb|tree[2][1]|"),0.5[Orig_arbre[3][1]+(0,0.5cm),Orig_arbre[2][1]+(0,1cm)]) withcolor 0.5green;
+draw (Orig_arbre[3][3]+(0,0.5cm))--(Orig_arbre[3][4]-(0,0.5cm))--(Orig_arbre[2][2]-(0,1cm))--(Orig_arbre[2][2]+(0,1cm))--cycle withcolor 0.5green;
+label.bot(textext("\verb|tree[2][2]|"),0.5[Orig_arbre[3][4]-(0,0.5cm),Orig_arbre[2][2]-(0,1cm)]) withcolor 0.5green;
+draw (Orig_arbre[4][1]+(0,0.5cm))--(Orig_arbre[4][2]-(0,0.5cm))--(Orig_arbre[3][2]-(0,1cm))--(Orig_arbre[3][2]+(0,1cm))--cycle withcolor blue;
+label.bot(textext("\verb|tree[3][2]|"),0.5[Orig_arbre[4][2]-(0,0.5cm),Orig_arbre[3][2]-(0,1cm)]) withcolor blue;
+draw (Orig_arbre[5][1]+(0,0.5cm))--(Orig_arbre[5][2]-(0,0.5cm))--(Orig_arbre[4][2]-(0,1cm))--(Orig_arbre[4][2]+(0,1cm))--cycle withcolor red;
+label.bot(textext("\verb|tree[4][2]|"),0.5[Orig_arbre[5][2]-(0,0.5cm),Orig_arbre[4][2]-(0,1cm)]) withcolor red;
+endfig;
+
+\end{figreperedoc}
+
+\end{center}
+
+
+\section{Trees}
+\subsection{Different kinds of trees}
+
+\begin{description}
+\item[tree\ijc (width,vspace)(ev1,prob1,ev2,prob2,...)] regular tree where \verb|width| is the horizontal width of the tree and \verb|vspace| the vertical space between two consecutive nodes.
+
+\begin{codecache}
+string dim[];
+dim[4]:="4 cm";dim[3]:="3 cm";dim[2]:="2 cm";dim[1]:="1 cm";
+dim[15]:="1.5 cm";dim[25]:="2.5 cm";dim[11]:="-1 cm";
+dim[22]:="-2 cm";dim[7]:="7cm";
+
+\end{codecache}
+
+\begin{codecache}
+extra_endfig:="drawoptions(withcolor red);";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(4cm,0)) shifted (0,2.25cm);label.top(textext(dim[4]),(2cm,2.25cm));";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(0,2.5cm)) shifted (Orig_arbre[2][2]-(5cm,0));label.lft(textext(dim[25]),(-1cm,0));";
+extra_endfig:=extra_endfig & "drawoptions(withcolor 0.5green);";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(3cm,0)) shifted (Orig_arbre[2][1]+(0,1cm));label.top(textext(dim[3]),(6cm,2.25cm));";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(0,1.5cm)) shifted (Orig_arbre[3][2]+(0.25cm,0));label.rt(textext(dim[15]),Orig_arbre[3][2]+(0.25cm,0.75cm));";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(0,1cm)) shifted (Orig_arbre[3][4]+(0.25cm,0));label.rt(textext(dim[1]),Orig_arbre[3][4]+(0.25cm,0.5cm));";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(0,1cm)) shifted (Orig_arbre[3][5]+(0.25cm,0));label.rt(textext(dim[1]),Orig_arbre[3][5]+(0.25cm,0.5cm));";
+
+\end{codecache}
+
+{\small \begin{exemplev}{1}
+draw tree[1][1](4cm,2.5cm)("$A_1$","$\nicefrac{1}{3}$","$A_2$","$\nicefrac{2}{3}$");
+draw tree[2][1](3cm,1.5cm)("$B$","$\nicefrac{1}{4}$","$C$","$\nicefrac{3}{4}$");
+draw tree[2][2](3cm,1cm)("$D$","$p$","$E$","$q$","$F$","$r$");
+\end{exemplev}
+}
+
+\item[tree\ijc (width,vspace1,vspace2...)(ev1,prob1,ev2,prob2,...)] tree where \verb|width| is the horizontal width of the tree while each \verb|vspace| indicates the vertical space between the node and the origin of the tree.
+
+\begin{codecache}
+extra_endfig:="drawoptions(withcolor 0.5green);";
+extra_endfig:=extra_endfig & "draw Orig_arbre[2][1] -- (Orig_arbre[2][1]+(4.5cm,0)) dashed evenly;";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(3cm,0)) shifted (Orig_arbre[2][1]+(0,2.25cm));label.top(textext(dim[3]),(5cm,3.25cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,-2cm)--(0,0)) shifted (Orig_arbre[3][1]+(0.25cm,0));label.rt(textext(dim[2]),Orig_arbre[3][1]+(0.25cm,-0.7cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,-1cm)--(0,0)) shifted (Orig_arbre[3][2]+(0.5cm,0));label.rt(textext(dim[1]),Orig_arbre[3][2]+(0.5cm,-0.5cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,1cm)--(0,0)) shifted (Orig_arbre[3][3]+(0.75cm,0));label.rt(textext(dim[11]),Orig_arbre[3][3]+(0.75cm,0.5cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,0)--(0,-2cm)) shifted (Orig_arbre[3][4]+(0.25cm,0));label.rt(textext(dim[22]),Orig_arbre[3][4]+(0.25cm,-1cm));";
+\end{codecache}
+\begin{exemplev}{1}
+draw tree[1][1](3cm,2cm)("$A$","$p$","$\overline{A}$","$q$");
+draw tree[2][1](3cm,2cm,1cm,-1cm)("$B$","$p$","$C$","$q$","$D$","$r$");
+draw tree[2][2](3cm,0cm,-2cm)("$E$","$0.5$","$F$","$0.5$");
+\end{exemplev}
+
+\begin{codecache}
+extra_endfig:="";
+\end{codecache}
+
+\item[tree\ijc (pair1,pair2,...)(ev1,prob1,ev2,prob2,...)] tree where \verb|pair1|, \verb|pair2|... indicate the coordinates of each node from the origin of the tree.
+
+
+\begin{codecache}
+extra_endfig:="drawoptions(withcolor 0.5green);";
+extra_endfig:=extra_endfig & "draw Orig_arbre[2][1] -- (Orig_arbre[2][1]+(5cm,0)) dashed evenly;";
+extra_endfig:=extra_endfig & "drawarrow ((0,0)--(3cm,0)) shifted (Orig_arbre[2][1]+(0,2.25cm));label.top(textext(dim[3]),(5cm,3.25cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,-2cm)--(0,0)) shifted (Orig_arbre[3][1]+(0.25cm,0));label.rt(textext(dim[2]),Orig_arbre[3][1]+(0.25cm,-0.7cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,0)--(4cm,0)) shifted (Orig_arbre[2][1]+(0,-1.25cm));label.bot(textext(dim[4]),(5.5cm,-0.25cm));";
+extra_endfig:=extra_endfig & "drawarrow ((0,0)--(0,-1cm)) shifted (Orig_arbre[3][2]+(0,1cm));label.rt(textext(dim[11]),Orig_arbre[3][2]+(0,0.5cm));";
+\end{codecache}
+
+\begin{exemplev}{1}
+draw tree[1][1](3cm,2cm)("$A$","$p$","$\overline{A}$","$1-p$");
+draw tree[2][1]((3cm,2cm),(4cm,-1cm))("$B$","$q$","$C$","$r$");
+\end{exemplev}
+
+\begin{codecache}
+extra_endfig:="";
+\end{codecache}
+\end{description}
+
+\subsection{Start and end labels}
+\begin{description}
+\item[startlabel(s)] Print \verb|s| (can be a string or a picture) at the origin of the tree.
+
+\begin{exemple}[0.65]
+ draw startlabel("$S$");
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+\end{exemple}
+
+\item[endlabel\ijc(s)] Print \verb|s| at the end of a branch. The space between the previous label ans \verb|s| is controlled by the numeric \verb|endlabelspace| which defaults to \verb|1cm|.
+
+\begin{exemplev}{1}
+ draw startlabel("$S$");
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+ draw tree[2][2](2cm,1cm)("$A$","$p$","$B$","$q$");
+ draw endlabel[2][1]("$SA$");
+ draw endlabel[3][1]("$SBA$");
+ draw endlabel[3][2]("$SBB$");
+\end{exemplev}
+
+\end{description}
+
+\section{Direction}
+\begin{description}
+\item[dirtree] All trees are construct horizontally by default. \verb|ditree| indicates the angle in degrees between the horizontal and the main direction of the tree. Default is $0$.
+
+
+
+\begin{exemplev}{1}
+dirtree:=135;
+draw tree[1][1](3cm,2cm)("$A_1$","$a_1$","$A_2$","$a_2$");
+draw tree[2][1](3cm,1cm)("$B$","$b$","$C$","$c$");
+draw tree[2][2](3cm,1cm)("$D$","$p$","$E$","$q$");
+\end{exemplev}
+
+
+\begin{exemplev}{1}
+dirtree:=-60;
+draw tree[1][1](3cm,2cm)("$A_1$","$a_1$","$A_2$","$a_2$");
+draw tree[2][1](3cm,1cm)("$B$","$b$","$C$","$c$");
+draw tree[2][2](3cm,1cm)("$D$","$p$","$E$","$q$");
+\end{exemplev}
+
+\begin{codecache}
+dirtree:=0;dirlabel:=0;
+\end{codecache}
+
+\item[dirlabel] With dirtree, the whole tree is rotated. With \verb|dirlabel|, only the position of the labels is changed so the given coordinates are the real ones. May be useful for vertical trees.
+
+\begin{exemplev}{1}
+dirlabel:=90;
+draw tree[1][1]((-1cm,2cm),(1cm,2cm))("$A$","$p$","$B$","$q$");
+draw tree[2][1]((-0.5cm,2cm),(0.5cm,2cm))("$C$","$c$","$D$","$d$");
+draw tree[2][2]((-0.5cm,2cm),(0.5cm,2cm))("$E$","$e$","$F$","$f$");
+\end{exemplev}
+
+\begin{codecache}
+dirlabel:=0;
+\end{codecache}
+
+\end{description}
+
+\section{Dealing with alignment}
+\begin{description}
+\item[shiftev] The origin of each tree is located where the bounding box of the previous event's name ends. Thus subtrees may begin at different places. The numeric \verb|shiftev| indicates the horizontal space between the end of the edges and the beginning of following trees.
+
+It can be used inside the first set of parameters of the tree (see example below) or as a global variable.
+
+
+\begin{exemplev}{1}
+ draw tree[1][1](80,120)("$A$","$0.5$","$\overline{A}$","$0.5$");
+ draw tree[2][1](70,40)("Yes","$p$","No","$q$","Maybe","$r$");
+ draw tree[2][2](70,40,"shiftev:=1.5cm")("Yes","$p$","No","$q$","Maybe","$r$");
+ draw tree[3][1](50,20)("$B$","$b$","$C$","$c$");
+ draw tree[3][2](50,20)("$B$","$b$","$C$","$c$");
+ draw tree[3][3](50,20)("$B$","$b$","$C$","$c$");
+ draw tree[3][4](50,20)("$B$","$b$","$C$","$c$");
+ draw tree[3][5](50,20)("$B$","$b$","$C$","$c$");
+ draw tree[3][6](50,20)("$B$","$b$","$C$","$c$");
+\end{exemplev}
+
+
+\item[abscoord] With the boolean \verb|abscoord| set to \verb|true|, all the coordinates are given from the origin of the \emph{first} tree instead of the origin of the subtree, which make easier the alignment of all the subtrees.
+\end{description}
+
+
+\begin{codecache}
+extra_endfig:="drawoptions(withcolor red);";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(7cm,0)) shifted (0,2.25cm);label.top(textext(dim[7]),(3.5cm,2.25cm));";
+extra_endfig:=extra_endfig & "drawdblarrow ((0,0)--(0,2cm)) shifted (-0.5cm,0);label.lft(textext(dim[2]),(-0.5cm,1cm));";
+\end{codecache}
+
+\begin{exemplev}{1}
+abscoord:=true;
+draw tree[1][1](3cm,2cm)("$A$","$p$","Blabla","$q$");
+draw tree[2][1]((7cm,2cm),(7cm,0.5cm))("$A$","$p$","$B$","$q$");
+draw tree[2][2]((7cm,-0.5cm),(7cm,-2cm))("$A$","$p$","$B$","$q$");
+\end{exemplev}
+
+\begin{codecache}
+extra_endfig:="";
+abscoord:=false;
+\end{codecache}
+
+
+\section{Parameters}
+\begin{description}
+
+
+\item[scaleprob] numeric controlling the scale of the label above the edge (the probability). Default is $0.85$.
+
+\begin{exemple}[0.65]
+ scaleprob:=1.5;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+\end{exemple}
+
+\begin{codecache}
+scaleprob:=0.85;
+\end{codecache}
+
+
+\item[scaleev] numeric controlling the scale of the label at the end of the edge (the event). Default is $1$.
+
+\begin{exemple}[0.65]
+ scaleev:=2;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+\end{exemple}
+
+\begin{codecache}
+scaleev:=1;
+\end{codecache}
+
+
+\item[posprob] numeric controlling the position of the label above the edge. Default is $0.6$.
+
+
+\begin{exemple}[0.65]
+ posprob:=0.8;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+\end{exemple}
+
+\item[typeprob] numeric controlling how the label is printed. Values can be 1 (the default, label is printed above the edge), 2 (the label is printed on the edge), 3 (the label is printed above the edge and rotated) or 4 (the label is printed on the edge and rotated).
+
+\begin{codecache}
+posprob:=0.6;
+\end{codecache}
+
+\begin{exemple}[0.7]
+ typeprob:=2;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$1-p$");
+\end{exemple}
+
+\begin{exemple}[0.7]
+ typeprob:=3;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$1-p$");
+\end{exemple}
+
+\begin{exemple}[0.7]
+ typeprob:=4;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$1-p$");
+\end{exemple}
+
+
+\item[proboffset] numeric controlling the amount by which the label above the edge is offset. Default is \verb|labeloffset| (\verb|3bp|).
+
+\begin{codecache}
+typeprob:=1;
+\end{codecache}
+
+\begin{exemple}[0.75]
+ draw tree[1][1](3cm,3cm)("$A$","$p+q+r$","$B$","$s$");
+\end{exemple}
+
+
+
+\begin{exemple}[0.75]
+ proboffset:=6bp;
+ draw tree[1][1](3cm,3cm)("$A$","$p+q+r$","$B$","$s$");
+\end{exemple}
+
+\begin{codecache}
+proboffset:=3bp;
+\end{codecache}
+
+\item[edgearrow] When the boolean \verb|edgearrow| is set to true, edges end with an arrow. Default is \verb|false|.
+
+\begin{exemple}[0.65]
+ edgearrow:=true;
+ draw tree[1][1](3cm,2cm)("$A$","$p$","$B$","$q$");
+\end{exemple}
+
+\begin{codecache}
+edgearrow:=false;
+\end{codecache}
+
+\item[endedgeshift] vertical space added at the end of the edge. Default is $0$. Useful when various edges end at the same point
+
+\begin{exemple}[0.65]
+ draw startlabel("$S$");
+ draw tree[1][1]((3cm,-1cm))("$A$","$p$");
+\end{exemple}
+
+
+\begin{exemple}[0.65]
+ endedgeshift:=10;
+ draw startlabel("$S$");
+ draw tree[1][1]((3cm,-1cm))("$A$","$p$");
+\end{exemple}
+
+\begin{codecache}
+endedgeshift:=0;
+\end{codecache}
+
+\end{description}
+
+
+\section{Embedded code in \LaTeX{} files}
+
+You can embed your code in \LaTeX{} files.
+
+\subsection{With \texttt{pdftex}}
+
+\medskip
+
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Using \texttt{emp} package}\par}
+
+
+
+\verb|pdflatex myfile.tex|
+
+\verb|mpost myfile.mp|
+
+\verb|mpost myfile.mp|
+
+\verb|pdflatex myfile.tex|
+
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{emp}
+\usepackage{ifpdf}
+ \ifpdf % allows pdflatex compilation
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+\begin{document}
+\begin{empfile}
+\begin{empcmds}
+ input mptrees;
+\end{empcmds}
+\begin{emp}(0,0)
+ draw tree[1][1](3cm,3cm)(...);
+\end{emp}
+\end{empfile}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Using \texttt{mpgraphics} package}\par}
+
+
+\verb|pdflatex -shell-escape myfile.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage[runs=2]{mpgraphics}
+\begin{document}
+\begin{mpdefs}
+ input mptrees;
+\end{mpdefs}
+\begin{mpdisplay}
+ draw tree[1][1](3cm,3cm)(...);
+\end{mpdisplay}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+
+\subsection{With \texttt{luatex}}
+
+\begin{center}
+\begin{minipage}[t]{0.6\linewidth}
+{\centering \textbf{Using Lua\LaTeX}\par}
+
+
+\verb|lualatex myfile.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{fontspec}
+\usepackage{luamplib}
+\begin{document}
+\everymplib{input mptrees;}
+\begin{mplibcode}
+beginfig(1);
+ draw tree[1][1](3cm,3cm)("$A$","$p$","$B$","$q$");
+endfig;
+\end{mplibcode}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\end{center}
+
+\section{Examples}
+
+\begin{exemplev}[0.9]{1}
+u:=0.4cm;
+dirlabel:=90;
+abscoord:=true;
+endlabelspace:=0.5cm;
+draw startlabel("S");
+draw tree[1][1]((-5.5u,4u),(5.5u,8u))("NP","","VP","");
+draw tree[2][1]((-8.5u,12u),(-2.5u,8u))("A","","NP","");
+draw tree[2][2]((3.5u,12u),(7.5u,12u))("V","","Adv","");
+draw tree[3][2]((-4.5u,12u),(-0.5u,12u))("A","","N","");
+draw endlabel[3][1]("Colorless");
+draw endlabel[4][1]("green");
+draw endlabel[4][2]("ideas");
+draw endlabel[3][3]("sleep");
+draw endlabel[3][4]("furiously");
+\end{exemplev}
+
+\begin{codecache}
+endlabelspace:=1cm;
+\end{codecache}
+
+\begin{exemplev}[0.9]{1}
+u:=1cm;
+dirlabel:=-90;
+abscoord:=true;
+scaleev:=2;
+label.top(textext("\Large Tree diagram of $(2x+1)(x-1)$"),(0,1cm));
+draw startlabel("$\times$");
+draw tree[1][1]((-2u,-1.5u),(2u,-1.5u))("$+$","","$-$","");
+draw tree[2][1]((-3u,-3.5u),(-1u,-3.5u))("$\times$","","$1$","");
+draw tree[2][2]((1u,-3.5u),(3u,-3.5u))("$x$","","$2$","");
+draw tree[3][1]((-4u,-5.5u),(-2u,-5.5u))("$2$","","$x$","");
+\end{exemplev}
+
+\begin{codecache}
+dirlabel:=0;
+abscoord:=false;
+scaleev:=1;
+\end{codecache}
+
+\begin{exemplev}{1}
+posprob:=0.5;
+typeprob:=3;
+shiftev:=1.5cm;
+edgearrow:=true;
+u:=0.2cm;
+vardef paral = ((2,-2)--(6,2)--(0,2)--(-4,-2)--cycle) scaled u enddef;
+vardef rhombus = ((3,0)--(0,6)--(-3,0)--(0,-6)--cycle) scaled u enddef;
+vardef rectangle = ((3,5)--(-3,5)--(-3,-5)--(3,-5)--cycle) scaled u enddef;
+vardef square = ((3,3)--(-3,3)--(-3,-3)--(3,-3)--cycle) scaled u enddef;
+draw startlabel(paral);
+draw tree[1][1](5cm,4cm)(rhombus,"Diagonals perpendicular",%
+ rectangle,"Diagonals of equal length");
+endedgeshift:=5;
+draw tree[2][1]((5cm,-2cm))("","Diagonals of equal length");
+draw tree[2][2]((5cm,2cm))(square,"Diagonals perpendicular");
+\end{exemplev}
+
+\begin{codecache}
+end
+\end{codecache}
+
+\makeatletter
+\immediate\closeout\verbatim@out
+\makeatother
+\end{document}
+
+
diff --git a/graphics/metapost/contrib/macros/mptrees/mptrees.mp b/graphics/metapost/contrib/macros/mptrees/mptrees.mp
new file mode 100644
index 0000000000..d9a5e49833
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mptrees/mptrees.mp
@@ -0,0 +1,469 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% mptrees.mp %%
+%% Probability trees with MetaPost %%
+%% o.peault@posteo.net %%
+%% Version 17.06 (June 2017) %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if not known mplib: input latexmp fi;
+
+boolean arbres_latexmp;
+arbres_latexmp:=true;
+
+numeric posprob; % position de l'étiquette sur la branche
+posprob:=0.6;
+
+numeric scaleprob;
+scaleprob:=0.85; % échelle de l'étiquette sur la branche
+
+numeric scaleev;
+scaleev:=1; % échelle de l'évènement
+
+numeric dirtree,dirlabel; % direction de l'arbre
+dirtree:=0;
+dirlabel:=0;
+
+numeric proboffset; % redéfinition temporaire de labeloffset pour affichage probas
+proboffset:=labeloffset;
+
+numeric endedgeshift;
+endedgeshift:=0;
+
+pair Orig_arbre[][]; % sommet de l'arbre i,j
+Orig_arbre[1][1]:=origin;
+
+numeric colonne_cour,ligne_cour;
+
+numeric countligne[]; % nombre de ligne pour le niveau i
+
+numeric typedec; % 0 origine dépend de la taille de l'évènement, 1 taille fixée
+numeric shiftev; % taille du décalage dans le cas où typedec=1
+shiftev:=0; % dans ce cas, typedec =0
+extra_beginfig:=extra_beginfig & "shiftev:=0;"; % remise à zéro en début de figure
+
+
+numeric typeprob; % affichage de la proba sur la branche
+typeprob:=1;
+
+boolean abscoord; % Coordonnée absolues
+abscoord=false;
+
+string branchtype,endlabeltype;
+branchtype="segment";
+endlabeltype="none";
+
+boolean edgearrow;
+edgearrow:=false;
+
+numeric endlabelspace;
+endlabelspace:=1cm;
+
+
+% Étiquette au début de l'arbre
+vardef startlabel(expr s)=
+ if dirtree<>0: dirlabel:=dirtree fi;
+ if dirlabel>0:
+ theevlabel(labelarbres(s) scaled scaleev,origin,-180+dirlabel)
+ else:
+ theevlabel(labelarbres(s) scaled scaleev,origin,180+dirlabel)
+ fi
+enddef;
+
+
+% Étiquettes de fin d'arbre
+vardef colonne.endlabel[]=
+ @
+enddef;
+
+vardef endlabel[][](expr s)=
+ save i,j,tmpbranchtype,tmpabscoord,tmps;
+ numeric i,j;
+ string tmpbranchtype,tmps;
+ boolean tmpabscoord;
+ i:=colonne.#@;
+ j:=@;
+ if string s: tmps:= "\strut " & s else: tmps:=s fi;
+ tmpbranchtype:=branchtype;
+ branchtype:=endlabeltype;
+ tmpabscoord:=abscoord;
+ abscoord:=false;
+ tree[i][j]((endlabelspace,0) rotated (dirlabel-dirtree))(tmps,"")
+ hide(branchtype:=tmpbranchtype;abscoord:=tmpabscoord;)
+enddef;
+
+
+vardef labelarbres(expr s)=
+ save p; picture p;
+ if picture s: p=s
+ elseif path s: p=image(draw s)
+ else: p=textext(s)
+ fi;
+ p
+enddef;
+
+
+% longueur du segment qui traverse la figure p selon l'angle inc
+vardef longdir(expr p,inc)=
+ if urcorner p = llcorner p:
+ 0
+ elseif (abs inc <= abs angle (urcorner p -llcorner p)) or (abs inc > 180 - abs angle (urcorner p -llcorner p)):
+ abs((lrcorner p - llcorner p)/cosd(inc))
+ else:
+ abs((ulcorner p - llcorner p)/sind(inc))
+ fi
+enddef;
+
+vardef theevlabel(expr s,z,inc)=
+ save p; picture p;
+ save d; numeric d;
+ if picture s: p=s
+ else: p = textext(s)
+ fi;
+ d=0.5*longdir(p,inc);
+% p shifted (z - 0.5(lrcorner p - llcorner p) - 0.5(ulcorner p - llcorner p) + (d+labeloffset)*dir(inc))
+ p shifted (z - center p + (d+labeloffset)*dir(inc))
+enddef;
+
+def evlabel = draw theevlabel enddef;
+
+
+
+vardef thelabelbranchehaut(expr Ori,Fin,Fig)=
+ interim labeloffset:=proboffset;
+ save M,pp;
+ pair M; path pp;
+ pp=dessinbranche(Ori,Fin);
+ M= point (arctime posprob*(arclength pp) of pp) of pp;
+ M:=M + 0.5(llcorner Fig - lrcorner Fig);
+ if xpart Ori <= xpart Fin:
+ M:=M+proboffset*unitvector(dir (dirlabel+90))
+ else:
+ M:=M-proboffset*unitvector(dir (dirlabel+90))
+ fi;
+ Fig shifted M
+enddef;
+
+
+vardef thelabelbranchehautrot(expr Ori,Fin,Fig)=
+ interim labeloffset:=proboffset;
+ if xpart Ori <= xpart Fin:
+ Fig shifted (0.5*(ulcorner Fig - lrcorner Fig) + llcorner Fig+(0,proboffset)) rotated (angle(Fin-Ori)) shifted posprob[Ori,Fin]
+ else:
+ Fig shifted (0.5*(ulcorner Fig - lrcorner Fig) + llcorner Fig+(0,proboffset)) rotated (angle(Ori-Fin)) shifted posprob[Ori,Fin]
+ fi
+enddef;
+
+
+
+vardef thelabelbranchesuper(expr Ori,Fin,Fig)=
+ save figtmp;
+ picture figtmp;
+ figtmp:=Fig shifted (posprob[Ori,Fin]-0.5*(lrcorner Fig + ulcorner Fig));
+ image(fill bbox figtmp withcolor background;
+ draw figtmp)
+enddef;
+
+
+vardef thelabelbranchesuperrot(expr Ori,Fin,Fig)=
+ save figtmp;
+ picture figtmp;
+ figtmp:=Fig shifted (-0.5*(lrcorner Fig + ulcorner Fig)) rotated (angle(Fin-Ori)) shifted posprob[Ori,Fin];
+ image(fill bbox figtmp withcolor background;
+ draw figtmp)
+enddef;
+
+
+
+vardef thelabelbranche(expr Ori,Fin,Fig)=
+ if typeprob=1:
+ thelabelbranchehaut(Ori,Fin,Fig)
+ elseif typeprob=2:
+ thelabelbranchesuper(Ori,Fin,Fig)
+ elseif typeprob=3:
+ thelabelbranchehautrot(Ori,Fin,Fig)
+ elseif typeprob=4:
+ thelabelbranchesuperrot(Ori,Fin,Fig)
+ fi
+enddef;
+
+%%%%%%%% Dessin de la branche
+vardef dessinbranche(expr Ori,Fin)=
+ if branchtype="segment":
+ Ori--Fin
+ else:
+ Ori--Fin
+ fi
+enddef;
+
+
+%%%%%%%% Dessin complet de la branche (avec proba, évènement
+
+vardef branche_abs(expr Ori,Fin,Eve,Pro)=
+ save figtmp,thelab,figlab,tmpshft;
+ picture figtmp,thelab,figlab;
+ numeric tmpshft;
+ thelab:=labelarbres(Pro) scaled scaleprob;
+ if ypart Ori > ypart Fin: %le décalage se fait en fonction de la direction de la branche
+ tmpshft:=endedgeshift
+ else:
+ tmpshft:=-endedgeshift
+ fi;
+ figlab:=thelabelbranche(Ori,(Fin+ (0,tmpshft)) rotatedaround(Ori,dirtree),thelab);
+ figtmp=image(%
+ if branchtype<>"none":
+ if edgearrow:
+ drawarrow
+ else:
+ draw
+ fi
+ dessinbranche(Ori,Fin + (0,tmpshft)) rotatedaround(Ori,dirtree)
+ fi;
+ draw figlab;
+ evlabel(Eve,Fin rotatedaround(Ori,dirtree),dirlabel)
+ );
+ figtmp
+enddef;
+
+
+vardef branche_rel(expr Ori,dx,dy,Eve,Pro)=
+ branche_abs(Ori,Ori+(dx,dy),Eve,Pro)
+enddef;
+
+
+vardef _arbre_(expr Ori)(text t)(text r)= % (pt)(pt1,pt2...)(ev,proba,ev,proba...)
+ save figtmp,n,Fintmp,labeltmp,counttmp,countlab;
+ picture figtmp,labeltmp[];
+ numeric counttmp,countlab;
+ pair Fintmp[];
+ if dirtree<>0: dirlabel:=dirtree fi;
+ if colonne_cour=1: for i=1 upto 6: countligne[i]:=0; endfor fi
+ figtmp=image(%
+ counttmp:=0;
+ for i=t:
+ counttmp:=counttmp+1;
+ Fintmp[counttmp]:=i;
+ endfor;
+ counttmp:=0;countlab:=0;
+ for i=r:
+ countlab:=countlab+1;
+ labeltmp[countlab]:=labelarbres(i);
+ if countlab=2:
+ counttmp:=counttmp+1;countligne[colonne_cour+1]:=countligne[colonne_cour+1]+1;
+ draw branche_abs(Ori,Fintmp[counttmp],labeltmp[1] scaled scaleev,labeltmp[2]);
+ Orig_arbre[colonne_cour+1][countligne[colonne_cour+1]]:=Fintmp[counttmp] shifted
+ if typedec=0: ((longdir(labeltmp[1] scaled scaleev,dirlabel)+2labeloffset)*(1,0))
+ else: (shiftev,0)
+ fi
+ if dirtree=0: rotatedaround(Fintmp[counttmp],dirlabel) fi
+ rotatedaround(Ori,dirtree);
+ countlab:=0
+ fi;
+ endfor);
+ figtmp
+enddef;
+
+
+vardef arbre_var(expr Ori,horiz,Ymax)(text t)(text r)= % (pt,dec horiz,Ymax)(dy1,dy2...)(ev,proba,ev,proba...)
+ save Fin,compt,Ytmp;
+ numeric compt,Ytmp;
+ pair Fin[];
+ Fin[0]:=Ori+(horiz,Ymax);
+ compt:=0;Ytmp:=Ymax;
+ for i=t:
+ compt:=compt+1;Ytmp:=Ytmp-i;
+ Fin[compt]:=Ori+(horiz,Ytmp);
+ endfor
+ def ptarr=
+ Fin[0]
+ for i=1 upto compt:
+ ,Fin[i]
+ endfor
+ enddef;
+ _arbre_(Ori)(ptarr)(r)
+enddef;
+
+
+vardef arbre_decv(expr Ori,horiz,Ymax)(text t)(text r)=
+ % (pt,dec horiz)(dy1,dy2...)(ev,proba,ev,proba...)
+ save Fin,compt,Ytmp;
+ numeric compt,Ytmp;
+ pair Fin[];
+ if abscoord:
+ Fin[0]:=(horiz,Ymax)
+ else:
+ Fin[0]:=Ori+(horiz,Ymax)
+ fi;
+ compt:=0;Ytmp:=Ymax;
+ for i=t:
+ compt:=compt+1;Ytmp:=i;
+ if abscoord:
+ Fin[compt]:=(horiz,Ytmp)
+ else:
+ Fin[compt]:=Ori+(horiz,Ytmp)
+ fi;
+ endfor
+ def ptarr=
+ Fin[0]
+ for i=1 upto compt:
+ ,Fin[i]
+ endfor
+ enddef;
+ _arbre_(Ori)(ptarr)(r)
+enddef;
+
+
+vardef arbre_fixe(expr Ori,horiz,Ymax,decy)(text r)=
+ save Fin,compt,compt_par;
+ numeric compt,compt_par;
+ pair Fin[];
+ if abscoord:
+ Fin[0]:=(horiz,Ymax + ypart Ori)
+ else:
+ Fin[0]:=Ori+(horiz,Ymax)
+ fi;
+ compt:=0;compt_par:=0;
+ for i=r:
+ compt:=compt+1;compt_par:=compt_par+1;
+ if compt_par=2:
+ compt_par:=0;
+ if abscoord:
+ Fin[compt/2]:=(0, ypart Ori) + (horiz,Ymax-decy*compt/2)
+ else:
+ Fin[compt/2]:=Ori+(horiz,Ymax-decy*compt/2)
+ fi;
+ fi
+ endfor
+ def ptarr=
+ Fin[0]
+ for i=1 upto compt:
+ ,Fin[i]
+ endfor
+ enddef;
+ _arbre_(Ori)(ptarr)(r)
+enddef;
+
+
+vardef colonne.reg.arbre[]=
+ @
+enddef;
+
+vardef colonne.comp.arbre[]=
+ @
+enddef;
+
+vardef colonne.dec.arbre[]=
+ @
+enddef;
+
+
+vardef reg.arbre[][](text t)(text r)=
+ save compt,decal;
+ numeric compt,decal[];
+ colonne_cour:=colonne.#@;
+ ligne_cour:=@;
+ typedec:=0;
+ if shiftev<>0: typedec:=1 fi;
+ compt:=0;
+ for i=t:
+ if numeric i:
+ compt:=compt+1;
+ decal[compt]:=i
+ else:
+ typedec:=1;
+ scantokens i
+ fi;
+ endfor
+ compt:=0;
+ for i=r:
+ compt:=compt+1;
+ endfor
+ arbre_fixe(Orig_arbre[colonne_cour][ligne_cour],decal[1],(compt/2-1)*decal[2]/2,decal[2])(r)
+enddef;
+
+
+
+vardef comp.arbre[][](text t)(text r)=
+ colonne_cour:=colonne.#@;
+ ligne_cour:=@;
+ typedec:=0;
+ if shiftev<>0: typedec:=1 fi;
+ save tmp_compt;
+ numeric tmp_compt;
+ tmp_compt:=0;
+ for i=t:
+ if string i:
+ typedec:=1;
+ scantokens i
+ fi;
+ endfor
+ if abscoord:
+ def tmp_text=t enddef
+ else:
+ def tmp_text= % Si abscoord tmp_text=t
+ for i=t:
+ hide(tmp_compt:=tmp_compt+1;)
+ if (tmp_compt>1) and (not string i):
+ ,Orig_arbre[colonne_cour][ligne_cour]+i
+ elseif not string i:
+ Orig_arbre[colonne_cour][ligne_cour]+i
+ fi
+ endfor
+ enddef
+ fi;
+ _arbre_(Orig_arbre[colonne_cour][ligne_cour])(tmp_text)(r)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Modif 10/16 - Décalage par rapport à l'origine
+vardef dec.arbre[][](text t)(text r)=
+ save decal;
+ numeric decal[];
+ colonne_cour:=colonne.#@;
+ ligne_cour:=@;
+ typedec:=0;
+ if shiftev<>0: typedec:=1 fi;
+ save tmp_compt;
+ numeric tmp_compt;
+ tmp_compt:=0;
+ for i=t:
+ if numeric i:
+ tmp_compt:=tmp_compt+1;
+ decal[tmp_compt]:=i
+ else:
+ typedec:=1;
+ scantokens i
+ fi;
+ endfor
+ def tmp_text=
+ decal[3]
+ for i=4 upto tmp_compt:
+ ,decal[i]
+ endfor
+ enddef;
+ arbre_decv(Orig_arbre[colonne_cour][ligne_cour],decal[1],decal[2])(tmp_text)(r)
+enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
+
+vardef arbre[][](text t)(text r)=
+ save tmp_type,tmp_compt;
+ numeric tmp_type,tmp_compt;
+ tmp_compt:=0;
+ for i=t:
+ if numeric i: tmp_compt:=tmp_compt+1 fi;
+ endfor
+ if tmp_compt=0: % Arbre défini par des points (dec_horiz,dec_vert)
+ comp.#@.@(t)(r)
+ elseif tmp_compt=2: % Arbre régulier, on donne largeur et esp. vert.
+ reg.#@.@(t)(r)
+ else:
+ dec.#@.@(t)(r) % Arbre semi-régulier, largeur fixe, decalages vert.
+ fi
+enddef;
+
+def tree = arbre enddef;
diff --git a/graphics/metapost/contrib/macros/piechartmp/INSTALL b/graphics/metapost/contrib/macros/piechartmp/INSTALL
new file mode 100644
index 0000000000..15bb25d7d0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/INSTALL
@@ -0,0 +1,20 @@
+piechartMP installation:
+
+Copy the files shown on the left side in the directories
+shown on the right side and update the file database LS-R
+if necessary.
+
+piechartmp.mp --> TEXMF/metapost/piechartmp/
+LEGAL, README --> TEXMF/doc/metapost/piechartmp/
+piechartmp.pdf --> TEXMF/doc/metapost/piechartmp/
+/examples/* --> TEXMF/doc/metapost/piechartmp/examples/
+
+TEXMF means the root of your system TEX tree, e.g.:
+ C:\texmf\ (win)
+ C:\texmf-local\ (win)
+ /usr/share/texmf/ (Unix)
+ /usr/local/share/texmf/ (Unix)
+ /usr/share/texmf-local/ (Unix)
+ /opt/texmf/ (Unix)
+You should prefer "local" paths for the installation.
+Please consult the documentation of your TeX-system. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/piechartmp/LEGAL b/graphics/metapost/contrib/macros/piechartmp/LEGAL
new file mode 100644
index 0000000000..b02acc87c0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/LEGAL
@@ -0,0 +1,104 @@
+ piechartMP
+ Terms And Conditions For Copying, Distribution And Modification
+ Like LaTeX Project Public License Version 1.0
+
+
+WARRANTY
+========
+
+There is no warranty for piechartMP, to the extent permitted by
+applicable law. Except when otherwise stated in writing, the
+Copyright holder provides piechartMP `as is' without warranty of any
+kind, either expressed or implied, including, but not limited to, the
+implied warranties of merchantability and fitness for a particular
+purpose. The entire risk as to the quality and performance of the
+program is with you. Should piechartMP prove defective, you assume
+the cost of all necessary servicing, repair or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will the Copyright holder, or any of the individual authors named in
+the source for piechartMP, be liable to you for damages, including
+any general, special, incidental or consequential damages arising out
+of any use of piechartMP or out of inability to use piechartMP
+(including but not limited to loss of data or data being rendered
+inaccurate or losses sustained by you or by third parties as a result
+of a failure of The Program to operate with any other programs), even
+if such holder or other party has been advised of the possibility of
+such damages.
+
+
+DISTRIBUTION
+============
+
+Redistribution of unchanged files is allowed provided that all files
+that make up the distribution of piechartMP are distributed.
+In particular this means that piechartMP has to be distributed
+including the files in the piechartMP-README.
+If you distribute piechartMP together with a installation programm
+or installation programms, you have to take care, that users cannot
+skip or delete parts of piechartMP without be well informed about
+this action.
+
+The distribution of piechartMP contain a listing of all the files
+covered by this license at README.
+
+If you receive only some of these files from someone, complain!
+
+The distribution of changed versions of certain files included in the
+piechartMP, and the reuse of code from piechartMP, are allowed
+under the following restrictions:
+
+ * It is allowed only if the legal notice in the file does not
+ expressly forbid it.
+ See note below, under "Conditions on individual files".
+
+ * You rename the file before you make any changes to it, unless the
+ file explicitly says that renaming is not required. Any such changed
+ files must be distributed under a license that forbids distribution
+ of those files, and any files derived from them, under the names used
+ by the original files in the distribution of piechartMP.
+
+ * You change any `identification string' in piechartMP to clearly
+ indicate that the file is not part of the standard system.
+
+ * You change the `error report address' in any modified versions of
+ piechartMP, so that reports for files not maintained by the
+ original program maintainers are directed to the maintainers of the
+ changed files.
+
+ * You acknowledge the source and authorship of the original version
+ in the modified file.
+
+ * You also distribute the unmodified version of the file.
+
+ * You distribute an appropriate documentation.
+
+The above restrictions are not intended to prohibit, and hence do
+not apply to, the updating, by any method, of a file so that it
+becomes identical to the latest version of that file in piechartMP.
+
+========================================================================
+
+
+Conditions on individual files
+==============================
+
+The individual files may bear additional conditions which supersede
+the general conditions on distribution and modification contained in
+this file.
+
+Typical examples of files with more restrictive modification
+conditions would be files that contain the text of copyright notices.
+
+ * The conditions on individual files differ only in the
+ extent of *modification* that is allowed.
+
+ * The conditions on *distribution* are the same for all the files.
+ Thus a (re)distributor of a complete, unchanged copy of The Program
+ need meet only the conditions in this file; it is not necessary to
+ check the header of every file in the distribution to check that a
+ distribution meets these requirements.
+
+Such files are:
+
+ * LEGAL, README: You are not allowed to modify these files.
diff --git a/graphics/metapost/contrib/macros/piechartmp/README b/graphics/metapost/contrib/macros/piechartmp/README
new file mode 100644
index 0000000000..95db7438b2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/README
@@ -0,0 +1,17 @@
+This is the README of the piechartMP MetaPost package.
+For license informations see LEGAL.
+
+The package consists of the files:
+- README (this file)
+- LEGAL (license information)
+- piechartmp.mp (the MetaPost module)
+- piechartmp.pdf (english documentation)
+
+
+This is a BETA-release, but I believe that
+the user interface will not change anymore.
+Please send bug-reports and suggestions to:
+Jens-Uwe Morawski <morawski@gmx.net>
+
+Jens-Uwe Morawski
+May 14, 2002; piechartMP version 0.3.0 \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.mp b/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.mp
new file mode 100644
index 0000000000..92d39d1112
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.mp
@@ -0,0 +1,146 @@
+%H
+%H piechartMP example - world energy consumption 2000
+%H (extended MetaFun version)
+%H Jens-Uwe Morawski, 2002
+%H
+
+
+%I this MetaPost example requires the MetaFun package
+%I (see piechartMP documentation)
+%I The purpose of this example is to show how pie-charts
+%I can be placed in a figure using the pc_Centre variable.
+%I wec-mfun.pdf in the same directory contains the final
+%I figure.
+
+
+%D This example uses the 'externalfigure' macro from
+%D the MetaFun package. If piechartMP is loaded after
+%D MetaFun then piechertMP detects MetaFun and will
+%D draw segment outsides as gradients.
+%D Since here many charts will be drawn it can cause
+%D an overflow of the MetaPost buffer-size,
+%D therefore piechertMP is loaded prior MetaFun.
+%D If the buffer-size of your MetaPost installation is
+%D large enough then you can load piechartMP after
+%D MetaFun and segment outsides will be drawn as gradients.
+input piechartmp ;
+input metafun ;
+
+%D Helvetica-Bold
+% This should work on most systems. If not, comment the next line.
+defaultfont := "phvb8r" ;
+defaultscale := 0.7 ;
+
+%D
+Scale := 5mm ;
+
+%D define some colors
+color oil_color, gas_color, coal_color, nuclear_color, water_color ;
+oil_color := (0.4, 0 , 0 ) ;
+gas_color := (0 , 0.5, 0 ) ;
+coal_color := (0.5, 0.3, 0 ) ;
+nuclear_color := (0.8, 0.8, 0.2) ;
+water_color := (0.3, 0.3, 1.0) ;
+
+
+%D define some points to place the charts
+pair place[] ;
+place[1] := (2cm,5cm) ;% North America
+place[2] := (7.5cm,3.5cm) ;% Asia
+place[3] := (5cm,5.3cm) ;% Europe
+place[4] := (6.5cm,5.8cm) ;% CIS
+place[5] := (5.6cm,4.2cm) ;% Middle East
+place[6] := (2.5cm,2.7cm) ;% South America
+place[7] := (5cm,3cm) ;% Africa
+
+
+%D
+def AChart (expr Size, Name, Place, Water, Nuclear, Coal, Gas, Oil) =
+ begingroup;
+ save label_pnt, Radius ;
+ pair label_pnt ; numeric Radius ;
+
+ % the 'Size' is the absolute energy consumption
+ % that means the 'Size' is proportional to the area
+ % of the pie-chart and not the radius.
+ Radius := (sqrt Size)*Scale ;
+
+ ResetSegments ; % documented in piechartMP Internals
+
+ if Water>0:
+ Segment(Water, "", water_color) ;
+ fi;
+ if Nuclear>0:
+ Segment(Nuclear, "", nuclear_color) ;
+ fi;
+ if Coal>0:
+ Segment(Coal, "", coal_color) ;
+ fi;
+ if Gas>0:
+ Segment(Gas, "", gas_color) ;
+ fi;
+ if Oil>0:
+ Segment(Oil, "", oil_color) ;
+ fi;
+
+ pc_Centre := place[Place] ; % documented in piechartMP Internals
+ PieChart(Radius, 0.3, 65, 90, 0) ;
+ label_pnt := SegmentPoint(1,(1,0));
+ label.top (Name & "; " & (decimal Size), label_pnt) withcolor white;
+
+ endgroup;
+enddef;
+
+
+beginfig(1);
+
+%D 'externalfigure' is a macro from the MetaFun package.
+%D It embeds the external JPG-Background, the file worldmap.jpg
+%D should be available from the same location as this
+%D MP file.
+externalfigure "worldmap.jpg" xscaled 10cm yscaled 7cm ;
+
+AChart (3.8, "North-America", 1, 2, 6, 25, 32, 35 ) ;
+AChart (3.4, "Asia/Oceania", 2, 2, 5, 46, 10, 38 ) ;
+AChart (2.6, "Europe", 3, 4, 16, 18, 20, 42 ) ;
+AChart (1.3, "CIS", 4, 2, 6, 18, 50, 24 ) ;
+AChart (0.5, "Middle East", 5, 0, 0, 0, 35, 65 ) ;
+AChart (0.5, "South-America",6 , 15, 0, 5, 15, 65 ) ;
+AChart (0.4, "Africa",7 , 0, 0, 37, 18, 45 ) ;
+
+
+%D the legend
+x := 3mm ;
+y := 2.5cm ;
+fill fullcircle scaled 2mm shifted (x,y) withcolor oil_color;
+label.rt ("Oil", (x+2mm,y)) ;
+fill fullcircle scaled 2mm shifted (x,(y-5mm)) withcolor gas_color;
+label.rt ("Gas", (x+2mm,y-5mm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-1cm)) withcolor coal_color;
+label.rt ("Coal", (x+2mm,y-1cm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-1.5cm)) withcolor nuclear_color;
+label.rt ("Nuclear Power", (x+2mm,y-1.5cm)) ;
+fill fullcircle scaled 2mm shifted (x,(y-2cm)) withcolor water_color;
+label.rt ("Water Power", (x+2mm,y-2cm)) ;
+
+
+%D some labels
+label.top ("(in billion t MCU)", (7cm,0)) ;
+defaultfont:="ptmbi8r" ; defaultscale:= 1.2;
+label("World Energy Consumption 2000", origin)
+ rotated 90 shifted (9.5cm,3cm) withcolor white;
+
+
+%D Next follows the grid I have used to determine the co-ordinates
+%D saved in place[]. Now it is not drawn because of the if..fi
+%D statement.
+if false:
+for i=1 upto 10:
+ draw (origin--(0,7cm)) shifted (i*1cm,0) withcolor white ;
+endfor;
+for i=1 upto 7:
+ draw (origin--(10cm,0)) shifted (0,i*1cm) withcolor white ;
+endfor;
+fi;
+endfig;
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.pdf b/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.pdf
new file mode 100644
index 0000000000..3b29ac5263
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/examples/wec-mfun.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/piechartmp/examples/wec.mp b/graphics/metapost/contrib/macros/piechartmp/examples/wec.mp
new file mode 100644
index 0000000000..7f45ad33ff
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/examples/wec.mp
@@ -0,0 +1,122 @@
+%H
+%H piechartMP example - world energy consumption 2000
+%H Jens-Uwe Morawski, 2002
+%H
+
+
+%I The piechartMP documentation includes many useful
+%I examples which not require MetaPost experience.
+%I In contrast this example employs many MetaPost
+%I commands and definitions. Thus it is not meant
+%I for piechart "beginners".
+%I The chief purpose of this example is to show
+%I how you can draw pie-charts with different data-sets
+%I using ResetSegments and how to save them in
+%I MetaPost pictures.
+%I The file wec.pdf in the same directory is the
+%I result of this MP-file.
+
+input piechartmp ;
+
+%D Helvetica-Bold
+% This should work on most systems. If not, comment the next line.
+defaultfont := "phvb8r" ;
+
+%D
+pair NameShift ; NameShift := (-3.5cm,0) ;
+Scale := 8mm ;
+
+%D define some colors
+color oil_color, gas_color, coal_color, nuclear_color, water_color ;
+oil_color := (0.4, 0 , 0 ) ;
+gas_color := (0 , 0.5, 0 ) ;
+coal_color := (0.5, 0.3, 0 ) ;
+nuclear_color := (0.8, 0.8, 0.2) ;
+water_color := (0.3, 0.3, 1.0) ;
+
+
+ChartCounter := 0 ;
+picture Charts[] ;
+
+%D
+def AChart (expr Size, Name, Water, Nuclear, Coal, Gas, Oil) =
+ begingroup;
+ save s , Radius ; string s ;
+
+ % the 'Size' is the absolute energy consumption
+ % that means the 'Size' is proportional to the area
+ % of the pie-chart and not the radius.
+ Radius := (sqrt Size)*Scale ;
+
+
+ s := Name & "; " & (decimal Size) & " billion t MCU" ;
+
+ ResetSegments ; % not documented in piechartMP doc
+
+ if Water>0:
+ Segment(Water, "", water_color) ;
+ fi;
+ if Nuclear>0:
+ Segment(Nuclear, "", nuclear_color) ;
+ fi;
+ if Coal>0:
+ Segment(Coal, "", coal_color) ;
+ fi;
+ if Gas>0:
+ Segment(Gas, "", gas_color) ;
+ fi;
+ if Oil>0:
+ Segment(Oil, "", oil_color) ;
+ fi;
+
+ PieChart(Radius, 0.3, 65, 90, 0) ;
+ label.lft (s, NameShift) ;
+ ChartCounter := ChartCounter + 1 ;
+ Charts[ChartCounter] := currentpicture ;
+ currentpicture := nullpicture ;
+ endgroup;
+enddef;
+
+def ShipoutCharts =
+ begingroup;
+ save h, t ; numeric h, t ;
+ h := 0 ; t := 0 ;
+ for i=1 upto ChartCounter:
+ t := ypart(ulcorner currentpicture) ;
+ h := -1*(ypart(lrcorner Charts[i])) ;
+ h := h + t + 5mm ;
+ draw Charts[i] shifted (0, (h));
+ endfor;
+ endgroup;
+enddef;
+
+beginfig(1);
+AChart (3.8, "North-America", 2, 6, 25, 32, 35 ) ;
+AChart (3.4, "Asia/Oceania", 2, 5, 46, 10, 38 ) ;
+AChart (2.6, "Europe", 4, 16, 18, 20, 42 ) ;
+AChart (1.3, "CIS", 2, 6, 18, 50, 24 ) ;
+AChart (0.5, "Middle East", 0, 0, 0, 35, 65 ) ;
+AChart (0.5, "South-America", 15, 0, 5, 15, 65 ) ;
+AChart (0.4, "Africa", 0, 0, 37, 18, 45 ) ;
+ShipoutCharts ;
+
+x := 5mm+(xpart(lrcorner currentpicture)) ;
+y := ypart(ulcorner currentpicture) ;
+
+fill fullcircle scaled 5mm shifted (x,y) withcolor oil_color;
+label.rt ("Oil", (x+5mm,y)) ;
+fill fullcircle scaled 5mm shifted (x,(y-1cm)) withcolor gas_color;
+label.rt ("Gas", (x+5mm,y-1cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-2cm)) withcolor coal_color;
+label.rt ("Coal", (x+5mm,y-2cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-3cm)) withcolor nuclear_color;
+label.rt ("Nuclear Power", (x+5mm,y-3cm)) ;
+fill fullcircle scaled 5mm shifted (x,(y-4cm)) withcolor water_color;
+label.rt ("Water Power", (x+5mm,y-4cm)) ;
+
+%D
+defaultfont:="ptmbi8r" ; defaultscale:= 2;
+label.top("World Energy Consumption 2000", (0, y+5mm)) ;
+
+endfig;
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/piechartmp/examples/wec.pdf b/graphics/metapost/contrib/macros/piechartmp/examples/wec.pdf
new file mode 100644
index 0000000000..76deef4432
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/examples/wec.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/piechartmp/examples/worldmap.jpg b/graphics/metapost/contrib/macros/piechartmp/examples/worldmap.jpg
new file mode 100644
index 0000000000..f3c64b6d95
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/examples/worldmap.jpg
Binary files differ
diff --git a/graphics/metapost/contrib/macros/piechartmp/piechartmp.mp b/graphics/metapost/contrib/macros/piechartmp/piechartmp.mp
new file mode 100644
index 0000000000..2c1631e424
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/piechartmp.mp
@@ -0,0 +1,1108 @@
+%H package name: piechartMP
+%H description: Metapost package for 2D/3D pie charts
+%H file: piechartmp.mp
+%H author: Jens-Uwe Morawski <morawski@gmx.net>
+%H version: 0.3.0 2002/05/14
+
+%L Copyright 2002, Jens-Uwe Morawski
+%L License: LPPL 1.0, see LEGAL
+
+
+%I * all user commands start with uppercase letters:
+%I Segment, SegmentState,
+%I SetupColors, SetupNumbers, SetupText,
+%I SetupValue, SetupPercent, SetupName,
+%I PieChart, Label
+%I * user variables start with uppercase letters:
+%I PiechartBBox, R
+%I * all internal functions start with '_' except
+%I SegmentColor, SegmentPoint
+%I * all internal variables start with 'pc_' except
+%I auto, hidden, normal, invisible, this,
+%I inwards, outwards, name, percent, value
+
+%\
+% initialisation
+%\
+if known piechart_module: endinput ; fi ;
+boolean piechart_module ; piechart_module := true ;
+
+% === data / input routines === (pc-input.mp)
+%\
+% vars / internals
+%\
+newinternal hidden ; hidden := -1 ;
+newinternal invisible ; invisible := 0 ;
+newinternal normal ; normal := 1 ;
+
+%\
+% data input/ user values / segment state
+%\
+numeric pc_Count ; pc_Count := 0 ; % number of defined segments
+numeric pc_xValue[], pc_xOffset[], pc_xState[];
+color pc_xFill[] ;
+string pc_n_Label[], pc_v_Label[] ;
+
+def Segment(text s) =
+ begingroup;
+ save i ; numeric i ; i:=0;
+ pc_Count := pc_Count + 1 ;
+ for e=s:
+ i := i+1 ;
+ if i=1:
+ pc_xValue[pc_Count] := e ;
+ pc_n_Label[pc_Count] := _numericToString(pc_Count, -1) ;
+ pc_xFill[pc_Count] := auto ;
+ pc_v_Label[pc_Count] := _numericToString(e, -1) ;
+ elseif i=2:
+ pc_n_Label[pc_Count] := e ;
+ elseif i=3:
+ pc_xFill[pc_Count] := _applyColorOrPattern(e) ;
+ elseif i=4:
+ pc_v_Label[pc_Count] := e ;
+ fi;
+ endfor;
+
+ if i=0:
+ errmessage "Segment: too few arguments for segment " &
+ (decimal pc_Count) ;
+ fi;
+
+ pc_xState[pc_Count] := normal ;
+ pc_xOffset[pc_Count] := 0 ;
+ endgroup;
+enddef;
+
+def SegmentState(expr s, st, sh ) =
+ if not _isThis(st):
+ pc_xState[s] := st ;
+ fi;
+
+ if not _isThis(sh):
+ pc_xOffset[s] := sh ;
+ fi;
+enddef;
+
+%C reset diagramm data
+def ResetSegments =
+ pc_Count := 0 ;
+enddef;
+
+% === drawing routines === (pc-draw.mp)
+%\
+% vars / internals
+%\
+
+newinternal R;
+pair pc_Centre; pc_Centre := origin ;
+numeric pc_Offset ;
+numeric pc_Depth ;
+numeric pc_View ;
+numeric pc_Sum ;
+numeric pc_xStart[], pc_xEnd[] ;
+
+
+boolean pc_Metafun ; pc_Metafun := false ;
+if known context_spec : pc_Metafun := true ; fi ;
+
+
+%\
+% diagram drawing
+%\
+
+%C PieChart(<diagramm radius>, <thickness in R>, <angle>, <rotation>,<global offset in R>)
+def PieChart (expr u, d, va, r, go) =
+ begingroup ;
+ save rot, pointer ; numeric rot , pointer;
+ R := u ;
+ if ( va < 90 ) and ( va >= 0 ):
+ pc_View := va ;
+ else:
+ message "Warning: Observation angle of " & ( decimal va ) & " is not valid. Substituted with 65." ;
+ pc_View := 65 ;
+ fi ;
+
+ pc_Offset := go ;
+
+ pc_Sum := 0 ;
+ for i=1 upto pc_Count:
+ if (pc_xState[i] >= 0):
+ pc_Sum := pc_Sum + pc_xValue[i] ;
+ fi ;
+ endfor;
+
+ if (( r >= 0 ) and ( r <= 359 )):
+ rot := r ;
+ else:
+ rot := 0 ;
+ message "Warning: Rotation " & (decimal r) & " is not within 0-359. Defaults to 0" ;
+ fi ;
+ pointer := rot ;
+ for i=1 upto pc_Count:
+ if ( pc_xState[i] >= 0 ):
+ pc_xStart[i] := pointer ;
+ pc_xEnd[i] := pc_xStart[i] + (pc_xValue[i] / pc_Sum)*360.00 ;
+ else:
+ pc_xStart[i] := pointer ;
+ pc_xEnd[i] := pointer ;
+ fi ;
+ pointer := pc_xEnd[i] ;
+ endfor;
+
+ pc_Depth := d*R*(sind pc_View) ;
+ if (pc_View > 0): _drawSides ; fi ;
+ _drawTop ;
+ endgroup ;
+enddef;
+
+%C draws top sides of all visible segments
+def _drawTop =
+ begingroup ;
+ save c , a, e, p ; path c, a, e ; picture p ;
+ for i=1 upto pc_Count:
+ if ( pc_xState[i] > 0) :
+ c := fullcircle rotated (pc_xStart[i]) scaled (2*R) ;
+ e := origin--(1.1*R*(cosd pc_xEnd[i]) , 1.1*R*(sind pc_xEnd[i]) ) ;
+ c := c cutafter e ; c := origin--c--cycle ;
+ fill ( c yscaled (cosd pc_View) ) shifted _calcSegmentShift(i) withcolor SegmentColor(i) ;
+ if ( greenpart pc_xFill[i]) = -2 :
+ p := _makePattern(i, c) ;
+ draw ( p yscaled (cosd pc_View) ) shifted _calcSegmentShift(i) withcolor _patternColor(i) ;
+ fi;
+ fi ;
+ endfor;
+ endgroup ;
+enddef;
+
+%C visual ordering of side elements
+def _drawSides =
+ begingroup ;
+ save _etd, c , a , e;
+ numeric _etd[][] , c , a , e;
+ c := 0 ;
+ for i=1 upto pc_Count:
+ if (pc_xState[i] > 0) :
+ if _visibleStart(i):
+ c := c + 1 ;
+ _etd[c][1] := 1 ;
+ _etd[c][2] := sind ( _normalizeAngle(pc_xStart[i])) ;
+ _etd[c][3] := i ;
+ _etd[c][4] := _normalizeAngle(pc_xStart[i]) ;
+ fi
+ if _visibleEnd(i):
+ c := c + 1 ;
+ _etd[c][1] := 1 ;
+ _etd[c][2] := sind ( _normalizeAngle(pc_xEnd[i])) ;
+ _etd[c][3] := i ;
+ _etd[c][4] := _normalizeAngle(pc_xEnd[i]) ;
+ fi
+ if _visibleOutside(i):
+ c := c + 1 ;
+ if _outsideIsDivided(i):
+ _etd[c][1] := 2 ;
+ _etd[c][3] := i ;
+ _etd[c][4] := _normalizeAngle(pc_xStart[i]) ;
+ _etd[c][5] := 360 ;
+ c := c + 1 ;
+ _etd[c][1] := 2 ;
+ _etd[c][3] := i ;
+ _etd[c][4] := 180 ;
+ _etd[c][5] := _normalizeAngle(pc_xEnd[i]) ;
+ else :
+ a := pc_xStart[i] ;
+ e := pc_xEnd[i] ;
+
+ if ( (sind a) >= 0 ):
+ a := 180 ;
+ fi ;
+ if ( (sind e) >= 0 ) :
+ e := 360 ;
+ fi ;
+
+ _etd[c][1] := 2 ;
+ _etd[c][3] := i ;
+ _etd[c][4] := _normalizeAngle(a) ;
+ _etd[c][5] := _normalizeAngle(e) ;
+ fi
+ fi
+ fi
+ endfor;
+
+ for i=1 upto c:
+ if (_etd[i][1] = 2 ):
+ if (( (cosd _etd[i][4])*(cosd _etd[i][5]) ) >= 0):
+ _etd[i][2] := sind (0.5*(_etd[i][4] + _etd[i][5]));
+ else :
+ _etd[i][2] := -1 ;
+ fi
+ fi
+ endfor;
+
+ for i=1 upto c :
+ a := -2 ; e := 0 ;
+ for j=1 upto c:
+ if (_etd[j][1] > 0) and (_etd[j][2] > a):
+ e := j ;
+ a := _etd[j][2] ;
+ fi
+ endfor;
+ if (e > 0):
+ if (_etd[e][1] = 1):
+ _drawInside(_etd[e][3],_etd[e][4]) ;
+ else:
+ _drawOutside(_etd[e][3],_etd[e][4],_etd[e][5]) ;
+ fi
+ _etd[e][1] := 0 ;
+ fi
+ endfor;
+ endgroup ;
+enddef;
+
+def _drawInside (expr s, a) =
+ begingroup ;
+ save b, e; path e, b;
+
+ e := origin--(R*(cosd a), R*(sind a)*(cosd pc_View) ) ;
+ b := (R*(cosd a), R*(sind a)*(cosd pc_View) )--origin ;
+ %if ( (sind a) > 0): b := b yscaled (1 + (0.1*(sind a)*(sind pc_View))); fi ;
+
+ b := b shifted (0, -pc_Depth) ;
+ e := b--e--cycle ; e := e shifted _calcSegmentShift(s) ;
+ fill e withcolor _calcInsideColor(s,a) ;
+ endgroup ;
+enddef;
+
+
+def _drawOutside (expr s, a, e) =
+ begingroup ;
+ save p, h, g ;
+ path p, h, g ;
+ if (pc_Metafun and (a < 270) and (e > 270)) :
+ _drawOutside(s,a,270) ;
+ _drawOutside(s,270,e) ;
+ else :
+ g := fullcircle xscaled (2*R) yscaled (2*R*(cosd pc_View));
+ g := subpath (4,8) of g ; %top
+ h := g shifted (0, -pc_Depth) ; % below
+ g := g xscaled -1 ; % in the reverse direction
+
+ p := (R*(cosd e),0)--(R*(cosd e),-1.1*(R*(cosd pc_View)+pc_Depth)) ;
+ h := h cutafter p ;
+ g := g cutbefore p ;
+
+ p := (R*(cosd a),0)--(R*(cosd a),-1.1*(R*(cosd pc_View)+pc_Depth)) ;
+ h := h cutbefore p ;
+ g := g cutafter p ;
+
+ p := h--g--cycle ; p := p shifted _calcSegmentShift(s) ;
+ if pc_Metafun:
+ linear_shade(p,0,_calcOutsideColor(s,a),_calcOutsideColor(s,e)) ;
+ else :
+ fill p withcolor _calcOutsideColor(s, (0.5*(a+e)) ) ;
+ fi ;
+ fi ;
+ endgroup ;
+enddef;
+
+%\
+% help macros
+%\
+
+vardef _visibleStart (expr s) =
+ save b; boolean b;
+ b:= ( ( cosd ( _normalizeAngle(pc_xStart[s]) )) > 0 ) and
+ ( (pc_Offset > 0) or (pc_xOffset[s] > 0) or
+ (pc_xState[ _prevSegment(s) ] = 0) or
+ (pc_xOffset[_prevSegment(s)] > 0) );
+ b
+enddef;
+
+vardef _visibleEnd (expr s) =
+ save b; boolean b;
+ b:= ( ( cosd ( _normalizeAngle(pc_xEnd[s]) )) < 0 ) and
+ ( (pc_Offset > 0) or (pc_xOffset[s] > 0) or
+ (pc_xState[ _nextSegment(s) ] = 0) or
+ (pc_xOffset[_nextSegment(s)] > 0) );
+ b
+enddef;
+
+vardef _visibleOutside (expr s) =
+ save b; boolean b;
+ b := ((sind pc_xStart[s] < 0) or (sind (pc_xEnd[s]) < 0) or
+ (sind (0.5*(pc_xStart[s] + pc_xEnd[s])) < 0)) ;
+ b
+enddef;
+
+vardef _outsideIsDivided (expr s) =
+ save b; boolean b;
+ b := ( ( (sind pc_xStart[s]) < 0 ) and
+ ( (sind pc_xEnd[s] ) < 0 ) and
+ ( (sind (0.5*(pc_xStart[s]+pc_xEnd[s])) ) >= 0 ) );
+ b
+enddef;
+
+% === colors ==== (pc-color.mp)
+%\
+% vars / internals
+%\
+color auto ; auto := (-1,-1,-1) ;
+
+%\
+% color
+%\
+
+%C returns the color of the segment with number s;
+%C if the segment uses pattern fill it returns the
+%C background color
+vardef SegmentColor(expr s) =
+ save tC; color tC;
+ if pc_xFill[s] = (-1,-1,-1):
+ tC := _autoColor( 0.5*(pc_xStart[s]+pc_xEnd[s]) - pc_xStart[1] ) ;
+ elseif ( (greenpart pc_xFill[s]) = -2 ) :
+ tC := pc_patternBGColor[(bluepart pc_xFill[s])] ;
+ if tC = (-1,-1,-1):
+ tC := _autoColor( 0.5*(pc_xStart[s]+pc_xEnd[s]) - pc_xStart[1] ) ;
+ fi ;
+ else:
+ tC := pc_xFill[s] ;
+ fi;
+ if pc_sGrayscale:
+ tC := (0.3*(redpart tC) + 0.59*(greenpart tC) + 0.11*(bluepart tC))*white ;
+ fi ;
+ tC
+enddef;
+
+%C returns the foreground color of the pattern
+vardef _patternColor (expr s) =
+ save tC, v, h ; color tC; numeric v, h ;
+ tC := pc_patternFGColor[(bluepart pc_xFill[s])] ;
+ if tC = (-1,-1,-1):
+ tC := SegmentColor(s) ;
+ tC := _rgbToHsv(tC) ;
+ h := redpart tC ;
+ h := h - 180 ;
+ if h<0: h := h + 360 ; fi ;
+ v := bluepart tC ;
+ v := 1 - v ;
+ tC := ( h , greenpart tC , v) ;
+ tC := _hsvToRgb(tC) ;
+ fi;
+ if pc_sGrayscale:
+ tC := (0.3*(redpart tC) + 0.59*(greenpart tC) + 0.11*(bluepart tC))*white ;
+ fi ;
+ tC
+enddef;
+
+%C returns the color of the insides in 3D view of the segment s
+%C a is the angle/direction of the side in the diagram
+vardef _calcInsideColor (expr s, a) =
+ save tC, f; color tC; numeric f ;
+ f := cosd ( (abs(cosd a))*pc_View ) ;
+ tC := SegmentColor(s) + f*(xpart pc_sShadeSV)*( _minSaturation(SegmentColor(s)) - SegmentColor(s) ) ;
+ tC := tC + f*(ypart pc_sShadeSV)*( black - tC ) ;
+ tC
+enddef;
+
+%C returns the color of the outsides in 3D view of the segment s
+%C a is the angle/direction of the side in the diagram
+vardef _calcOutsideColor (expr s, a) =
+ save tC, f; color tC; numeric f ;
+ f := cosd ( (abs(sind a))*pc_View ) ;
+ tC := SegmentColor(s) + f*(xpart pc_sShadeSV)*( _minSaturation(SegmentColor(s)) - SegmentColor(s) ) ;
+ tC := tC + f*(ypart pc_sShadeSV)*( black - tC ) ;
+ tC
+enddef;
+
+%\
+% help macros
+%\
+
+%C return a color from c as if saturation is set to zero
+vardef _minSaturation (expr c)=
+ save sat; numeric sat; sat := 0 ;
+ sat := 0.3*(redpart c) + 0.59*(greenpart c) + 0.11*(bluepart c) ;
+ sat*white
+enddef;
+
+
+%C automatic color values
+vardef _autoColor(expr a) =
+ _hsvToRgb( (a, (xpart pc_sAutoSV), (ypart pc_sAutoSV)) )
+enddef;
+
+vardef _hsvToRgb(expr c) =
+ save h,s,v, H,o, b, d, pc, sc;
+ numeric h,s,v,H, o, b, d, pc, sc ;
+
+ h := redpart c ;
+ s := greenpart c ;
+ v := bluepart c ;
+
+ H := _normalizeAngle(h) / 60 ;
+ pc := floor H ;
+ sc := H - pc ;
+ o := (1 - s)*v ;
+ b := (1 - (sc*s) )*v;
+ d := (1 - ((1-sc)*s) )*v ;
+
+ if (pc = 0) or (pc = 6):
+ (v,d,o)
+ elseif pc = 1:
+ (b,v,o)
+ elseif pc = 2:
+ (o,v,d)
+ elseif pc = 3:
+ (o,b,v)
+ elseif pc = 4:
+ (d,o,v)
+ else:
+ (v,o,b)
+ fi
+enddef;
+
+vardef _rgbToHsv (expr c) =
+ save r,g,b,h,s,v, _r, _g, _b, min, max ;
+ numeric r,g,b,h,s,v, _r, _g, _b, min, max ;
+
+ r := redpart c ;
+ g := greenpart c ;
+ b := bluepart c ;
+
+ min := r ; max := r ;
+
+ if (g < min): min := g ; fi ;
+ if (g > max): max := g ; fi ;
+ if (b < min): min := b ; fi ;
+ if (b > max): max := b ; fi ;
+
+ if max > 0:
+ s := (max - min)/max ; v := max ;
+ else:
+ s := 0; v := 0 ;
+ fi ;
+
+
+ if (s = 0):
+ h := 0 ; % is undefined
+ else:
+ _r := (max - r)/(max - min) ;
+ _g := (max - g)/(max - min) ;
+ _b := (max - b)/(max - min) ;
+
+ if ((r = max ) and (g = min)): h := 5 + _b ;
+ elseif ((r = max ) and (g <> min)): h := 1 - _g ;
+ elseif ((g = max ) and (b = min)): h := 1 + _r ;
+ elseif ((g = max ) and (b <> min)): h := 3 - _b ;
+ elseif (r = max): h := 3 + _g ;
+ else: h := 5 - _r ;
+ fi ;
+ fi ;
+ h := 60 * h ;
+ (h,s,v)
+enddef;
+% === pattern routines === (pc-pattr.mp)
+
+%\
+% vars
+%\
+numeric pc_patternType[] ;
+color pc_patternFGColor[], pc_patternBGColor[] ;
+pair pc_patternDimen[] ;
+
+%\
+% routines
+%\
+
+%C called via Segment();
+vardef _applyColorOrPattern (expr c) =
+ if color c:
+ c
+ else:
+ if ( numeric c ):
+ if known pc_patternType[c]:
+ (-1,-2,c)
+ else:
+ errmessage "Pattern number " & (decimal c) & " not defined" ;
+ (-1,-1,-1)
+ fi
+ else:
+ show c ;
+ hide(errmessage "Not a valid pattern number.") ;
+ (-1,-1,-1)
+ fi
+ fi
+enddef;
+
+%C defines a pattern with number n, of type t
+%C with foreground color f and background color b
+%C with dimensions (pair) d
+def DefinePattern (expr n, t, b, f, d) =
+ pc_patternType[n] := t ;
+ pc_patternFGColor[n] := f ;
+ pc_patternBGColor[n] := b ;
+ pc_patternDimen[n] := d ;
+enddef;
+
+
+%C returns a picture including the pattern
+%C for segment s in path p
+vardef _makePattern (expr s, p) =
+ save o, u, type, spacing, dimen, b, xs, ys, q ;
+ pair o, u ; numeric type, spacing, dimen ;
+ picture b ;
+ b := nullpicture ;
+ type := pc_patternType[(bluepart pc_xFill[s])] ;
+ dimen := ypart pc_patternDimen[(bluepart pc_xFill[s])] ;
+ spacing := xpart pc_patternDimen[(bluepart pc_xFill[s])] ;
+ o := ulcorner p ;
+ u := lrcorner p ;
+
+ if type = 0:
+ b := PrivatePattern (o, u, spacing, dimen) ;
+ elseif type = 1:
+ numeric ys ; path line ;
+ ys := ( ypart o ) + ypart (o - u ) - spacing ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ line := (xpart o, ys)--(xpart u, ys - ypart(o-u)) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ elseif type = 2:
+ numeric ys ; path line ;
+ ys := ( ypart o ) + ypart (o - u ) - spacing ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ line := (xpart o, ys - ypart(o-u) )--(xpart u, ys ) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ elseif type = 3:
+ numeric ys ; path line ;
+ ys := ( ypart o ) + ypart (o - u ) - spacing ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ line := (xpart o, ys - ypart(o-u) )--(xpart u, ys ) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ line := (xpart o, ys )--(xpart u, ys - ypart(o-u) ) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ elseif type = 4:
+ numeric ys ; path line ;
+ ys := ( ypart o ) - spacing ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ line := (xpart o, ys )--(xpart u, ys ) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ elseif type = 5:
+ numeric xs ; path line ;
+ xs := ( xpart o ) - spacing ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ line := (xs, ypart o)--(xs, ypart u) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ xs := xs + spacing ;
+ endfor;
+ elseif type = 6:
+ numeric xs, ys ; path line ;
+ xs := ( xpart o ) - spacing ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ line := (xs, ypart o)--(xs, ypart u) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ xs := xs + spacing ;
+ endfor;
+ ys := ( ypart o ) - spacing ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ line := (xpart o, ys )--(xpart u, ys ) ;
+ addto b doublepath line withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ elseif type = 7:
+ numeric xs, ys ;
+ xs := ( xpart o ) ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ ys := ( ypart o ) ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ addto b doublepath (xs,ys) withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ xs := xs + spacing ;
+ endfor;
+ elseif type = 8:
+ numeric xs, ys ;
+ xs := ( xpart o ) ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ ys := ( ypart o ) ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ addto b doublepath (xs,ys) withpen pencircle scaled dimen ;
+ addto b doublepath (xs+.5*spacing,ys+.5*spacing) withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ xs := xs + spacing ;
+ endfor;
+ elseif type = 9:
+ numeric xs, ys ; path q[] ;
+ q1 := (0,0){curl 0}..(0.25*spacing, -0.2*spacing )..{curl 0}(0.5*spacing, 0) ;
+ q2 := q1..(q1 yscaled -1 shifted (.5*spacing, 0)) ;
+ xs := ( xpart o ) ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ ys := ( ypart o ) ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ addto b doublepath (q[2] shifted (xs,ys)) withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ xs := xs + spacing ;
+ endfor;
+ elseif type = 10:
+ numeric xs, ys ; path q ;
+ q := (0,0)--(0.5*spacing, -0.5*spacing )--(0,-spacing) ;
+ xs := ( xpart o ) ;
+ forever:
+ exitif ( xs >= xpart u ) ;
+ ys := ( ypart o ) ;
+ forever:
+ exitif ( ys <= ypart u ) ;
+ addto b doublepath (q shifted (xs,ys)) withpen pencircle scaled dimen ;
+ ys := ys - spacing ;
+ endfor;
+ xs := xs + spacing ;
+ endfor;
+ else:
+ errmessage "pattern type " & (decimal type) & " not defined."
+ b := nullpicture;
+ fi;
+ clip b to p ;
+ b
+enddef;
+
+vardef PrivatePattern (expr ulc, lrc, spc, lwd) =
+ save pic, cntr, c, k ;
+ picture pic ; pic := nullpicture ;
+ pair cntr ;
+ numeric c ;
+ path k ;
+
+ cntr := 0.5*( lrc + ulc ) ;
+
+ c := ((xpart (ulc - cntr))++(ypart (ulc - cntr))) / spc ;
+ c := ( floor c ) ;
+
+ for i=1 upto c:
+ k := fullcircle scaled (i*2*spc) shifted cntr ;
+ addto pic doublepath k withpen pencircle scaled lwd ;
+ endfor;
+ pic
+enddef;
+
+% === label commands === (pc-label.mp)
+
+%\
+% vars
+%\
+
+
+%C
+color name, percent, value ;
+name := (-1,-4,1) ; percent := (-1,-4,2) ; value := (-1,-4,3) ;
+%C additional label positioning parameters
+pair laboff.auto; laboff.auto=(-3,-3) ;
+labxf.auto=0; labyf.auto=0;
+
+%\
+% text / labels / legend
+%\
+
+def Label = draw _theLabel enddef ;
+
+vardef _theLabel@#(text t)(text d)(expr sp, sh) =
+ save pic ; picture pic ; pic := nullpicture ;
+ for S=t:
+ if S=0:
+ for i=1 upto pc_Count:
+ if pc_xState[i] = 1:
+ addto pic also _makeSegLabel.@#(i,sp,sh)(d) ;
+ fi;
+ endfor;
+ else:
+ if (S > 0) and (S <= pc_Count):
+ if pc_xState[S]= 1 :
+ addto pic also _makeSegLabel.@#(S,sp,sh)(d) ;
+ fi;
+ else:
+ message "Label: segment " & (decimal S) & " not defined.";
+ fi;
+ fi;
+ endfor;
+ pic
+enddef;
+
+
+
+vardef _makeSegLabel@# (expr s, sp, sh)(text dat) =
+ save d , t, p, o , pic, l;
+ numeric l;
+ pair p, o ;
+ picture t, pic ; pic := nullpicture ;
+ string d ; d := "" ;
+
+ for f=dat:
+ if color f:
+ if (bluepart f = 1 ):% name of segment
+ d := d & pc_n_Pre & pc_n_Label[s] & pc_n_Post ;
+ elseif (bluepart f = 2 ):% percent value
+ d := d & pc_p_Pre &
+ _numericToString( 100*(pc_xValue[s]/pc_Sum), pc_sPrecision) &
+ pc_p_Post ;
+ elseif (bluepart f = 3 ):%segment value
+ d := d & pc_v_Pre & pc_v_Label[s] & pc_v_Post ;
+ fi;
+ elseif string f:% free string
+ d := d & f ;
+ else:
+ errmessage "Not a valid label-data: "; show f ;
+ fi;
+ endfor;
+
+ t := _makeText(d) ;
+
+ if pair sh :
+ if sh = (0,0):
+ o := SegmentPoint(s,(0,0)) ;
+ p := SegmentPoint(s,sp) ;
+ addto pic doublepath p withpen currentpen ;
+ else:
+ o := SegmentPoint(s,sp) ;
+ p := o shifted sh ;
+ addto pic doublepath o--p withpen currentpen ;
+ fi;
+ else:
+ p := SegmentPoint(s,sp) ;
+ o := SegmentPoint(s,(0,0)) ;
+
+ fi;
+
+ if laboff.@# = (-3,-3): % auto justification
+
+ l := _normalizeAngle( angle(p-o) ) ;
+ laboff.auto := ((cosd l),(sind l)) ;
+ labxf.auto := ((cosd l) - 1) / -2 ;
+ labyf.auto := ((sind l) - 1) / -2 ;
+
+ if (not pair sh) and ((xpart sp) >= 1):
+ if (sind _normalizeAngle( angle(p-o) )) < 0 :
+ p := p + (0,-pc_Depth) ;
+ fi;
+ fi;
+
+ fi;
+ addto pic also thelabel.@#(t,p) ;
+
+ laboff.auto := (-3,-3) ;
+ pic
+enddef;
+
+
+%\
+% help functions
+%\
+
+vardef _numericToString (expr n , c) =
+ save l, s ;
+ string l, s ;l := "";
+ if (c < 0):
+ s := decimal n ;
+ for i=1 upto (length s):
+ if ((substring (i-1,i) of s) = "."):
+ l := l & pc_sDelimiter;
+ else:
+ l := l & (substring (i-1,i) of s);
+ fi;
+ endfor;
+ elseif ( (c=3) and (n>32.767) ):
+ hide(message("Warning: Decrease precision for value " & decimal n & " to 2.")) ;
+ s := decimal ( round(n*(10**(c-1))) ) ;
+ l := substring (0,(length s)-2) of s &
+ pc_sDelimiter &
+ substring ((length s)-2,length s) of s ;
+ else:
+ s := decimal ( round(n*(10**c)) ) ;
+ if (c>0):
+ l := substring (0,(length s)-c) of s &
+ pc_sDelimiter &
+ substring ((length s)-c,length s) of s ;
+ else:
+ l := substring (0,(length s)-c) of s ;
+ fi ;
+ fi;
+ l
+enddef;
+
+% === text routines === (pc-text.mp)
+%\
+% vars
+%\
+string pc_TeXFile ;
+pc_TeXFile := jobname & ".pct" ;
+
+
+%\
+% TeX
+%\
+
+vardef _makeText primary s =
+ if ( pc_sTextScheme > 0 ) :
+ write "verbatimtex" to pc_TeXFile ;
+ if ( pc_sTextScheme = 3 ):
+ write "%&latex" to pc_TeXFile ;
+ else:
+ write pc_sTeXFormat to pc_TeXFile ;
+ fi;
+ if ( pc_sTextScheme > 1 ):
+ write "\documentclass{minimal}" to pc_TeXFile ;
+ write pc_sTeXSettings to pc_TeXFile ;
+ write "\begin{document}" to pc_TeXFile ;
+ else:
+ write pc_sTeXSettings to pc_TeXFile ;
+ fi;
+ write "etex" to pc_TeXFile ;
+ write "btex "&s&" etex" to pc_TeXFile;
+ write EOF to pc_TeXFile;
+ scantokens ("input " & pc_TeXFile )
+ else:
+ s infont defaultfont scaled defaultscale
+ fi
+enddef;
+
+% === support routines === (pc-supp.mp)
+%\
+% vars / internals
+%\
+pair inwards, outwards ;
+inwards := (.66, .5) ; outwards := (1.05, .5) ;
+
+%\
+% macros
+%\
+vardef SegmentPoint (expr s, t) =
+ save p, a ; pair p ;
+ numeric a ;
+ if (( ( xpart t) >=0 ) and
+ ( ( ypart t) >=0 ) and
+ ( ( ypart t) <=1 ) ):
+ a := pc_xStart[s] + (ypart t)*(pc_xEnd[s] - pc_xStart[s]) ;
+ p := ( ( xpart t)*R*(cosd a) , ( xpart t)*R*(sind a)*(cosd pc_View) ) ;
+ p := p + _calcSegmentShift(s) ;
+ else :
+ errmessage "SegmentPoint: point definition for segment " & (decimal s) & " is not valid. Substituted with default." ;
+ p := SegmentPoint(s,(1,0.5)) ;
+ fi ;
+ p
+enddef;
+
+vardef _calcSegmentShift(expr s) =
+ save o, x, y ;
+ numeric o, x, y ;
+ o := R*(pc_Offset + pc_xOffset[s]) ;
+ x := o*(cosd (0.5*(pc_xStart[s] + pc_xEnd[s]))) ;
+ y := o*(sind (0.5*(pc_xStart[s] + pc_xEnd[s])))*(cosd pc_View) ;
+ (x,y) + pc_Centre
+enddef;
+
+vardef _normalizeAngle (expr a) =
+ if a > 360:
+ a - 360
+ elseif a < 0:
+ 360 + a
+ else:
+ a
+ fi
+enddef;
+
+vardef _nextSegment(expr s) =
+ if s < pc_Count:
+ if pc_xState[s+1] >= 0:
+ s+1
+ else:
+ _nextSegment(s+1)
+ fi
+ else:
+ if pc_xState[1] >= 0:
+ 1
+ else:
+ _nextSegment(1)
+ fi
+ fi
+enddef;
+
+vardef _prevSegment(expr s) =
+ if s = 1:
+ if pc_xState[pc_Count] >= 0:
+ pc_Count
+ else:
+ _prevSegment(pc_Count)
+ fi
+ else:
+ if pc_xState[s-1] >= 0:
+ s-1
+ else:
+ _prevSegment(s-1)
+ fi
+ fi
+enddef;
+
+% === setup routines === (pc-setup.mp)
+
+%\
+% vars
+%\
+
+boolean pc_sGrayscale ; pc_sGrayscale := false ;
+pair pc_sAutoSV ; pc_sAutoSV := (1,1) ;
+pair pc_sShadeSV ; pc_sShadeSV := (.4,.3) ;
+
+numeric pc_sPrecision ; pc_sPrecision := 0 ;
+string pc_sDelimiter ; pc_sDelimiter := "." ;
+
+string pc_sTeXFormat, pc_sTeXSettings ;
+pc_sTeXFormat := "" ; pc_sTeXSettings := "" ;
+numeric pc_sTextScheme ; pc_sTextScheme := 0 ;
+
+
+string pc_p_Pre, pc_p_Post, pc_v_Pre, pc_v_Post,
+ pc_n_Pre, pc_n_Post ;
+pc_p_Pre := "" ; pc_p_Post := "" ;
+pc_v_Pre := "" ; pc_v_Post := "" ;
+pc_n_Pre := "" ; pc_n_Post := "" ;
+
+
+color this ; this := (-9,-9,-9) ;
+
+vardef _isThis (expr t) =
+ if color t :
+ if t = this:
+ true
+ else:
+ false
+ fi
+ else:
+ false
+ fi
+enddef;
+
+def SetupColors (expr a, s, g) =
+ if not _isThis(a) : pc_sAutoSV := a ; fi ;
+ if not _isThis(s) : pc_sShadeSV := s ; fi ;
+ if not _isThis(g) : pc_sGrayscale := g ; fi ;
+enddef;
+
+def SetupNumbers (expr p, d) =
+ if not _isThis(p) : pc_sPrecision := p ; fi ;
+ if not _isThis(d) : pc_sDelimiter := d ; fi ;
+enddef;
+
+def SetupText (expr l, f, s) =
+ if not _isThis(l) : pc_sTextScheme := l ; fi ;
+ if not _isThis(f) : pc_sTeXFormat := f ; fi ;
+ if not _isThis(s) : pc_sTeXSettings := s ; fi ;
+enddef;
+
+def SetupPercent (expr r, o) =
+ if not _isThis(r) : pc_p_Pre := r ; fi ;
+ if not _isThis(o) : pc_p_Post := o ; fi ;
+enddef;
+
+def SetupValue (expr r, o) =
+ if not _isThis(r) : pc_v_Pre := r ; fi ;
+ if not _isThis(o) : pc_v_Post := o ; fi ;
+enddef;
+
+def SetupName (expr r, o) =
+ if not _isThis(r) : pc_n_Pre := r ; fi ;
+ if not _isThis(o) : pc_n_Post := o ; fi ;
+enddef;
+
+%C only activate bounding box code if PiechartBBox variable
+%C is set by user
+if not known PiechartBBox: endinput ; fi;
+% === Bounding Box === (pc-bbox.mp)
+%\
+% vars
+%\
+
+pair pc_bULC, pc_bLRC ;
+string pc_BBoxFile ; pc_BBoxFile := jobname & ".pcb" ;
+
+%\
+% init
+%\
+begingroup;
+save L ; string L ;
+L := readfrom pc_BBoxFile ;
+if ( L = EOF ): % file not readable
+ pc_bULC := origin ; pc_bLRC := origin ;
+else:
+ scantokens L ;
+ L := readfrom pc_BBoxFile ;
+ scantokens L ;
+fi ;
+endgroup;
+
+%\
+% macros
+%\
+
+extra_endfig := extra_endfig & "_pcFitBBox ;" ;
+
+%C merges bbox size of current picture with
+%C the size saved in variables pc_bULC/LRC to obtain
+%C ths size of a maximum bbox
+def _pcFitBBox =
+ begingroup;
+ save L, YO, YU, XR, XL ; string L ;
+ numeric YO, YU, XR, XL ;
+
+
+ if (xpart (ulcorner currentpicture)) < (xpart pc_bULC) :
+ XL := xpart ( ulcorner currentpicture ) ;
+ else:
+ XL := xpart pc_bULC ;
+ fi ;
+ if (ypart (ulcorner currentpicture)) > (ypart pc_bULC) :
+ YO := ypart ( ulcorner currentpicture ) ;
+ else:
+ YO := ypart pc_bULC ;
+ fi ;
+ if (xpart ( lrcorner currentpicture)) > (xpart pc_bLRC) :
+ XR := xpart ( lrcorner currentpicture ) ;
+ else:
+ XR := xpart pc_bLRC ;
+ fi ;
+ if (ypart ( lrcorner currentpicture)) < (ypart pc_bLRC) :
+ YU := ypart ( lrcorner currentpicture ) ;
+ else:
+ YU := ypart pc_bLRC ;
+ fi ;
+
+ setbounds currentpicture to (XL,YO)--(XR,YO)--(XR,YU)--(XL,YU)--cycle ;
+ write "pc_bULC := ( " &
+ decimal (xpart (ulcorner currentpicture)) & " , " &
+ decimal (ypart (ulcorner currentpicture)) & " )" to pc_BBoxFile ;
+ write "pc_bLRC := ( " &
+ decimal (xpart (lrcorner currentpicture)) & " , " &
+ decimal (ypart (lrcorner currentpicture)) & " )" to pc_BBoxFile ;
+ write EOF to pc_BBoxFile ;
+
+ pc_bULC := (XL, YO) ; pc_bLRC := (XR, YU) ;
+ endgroup;
+enddef; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/piechartmp/piechartmp.pdf b/graphics/metapost/contrib/macros/piechartmp/piechartmp.pdf
new file mode 100644
index 0000000000..89b7fc3cdb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/piechartmp/piechartmp.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/repere/README.md b/graphics/metapost/contrib/macros/repere/README.md
new file mode 100644
index 0000000000..9759657f6a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/repere/README.md
@@ -0,0 +1,13 @@
+Package repere - Version 19.06 - June 11, 2019
+
+This package provides MetaPost macros for drawing sec­ondary school math­e­mat­ics figures in a coordinate system :
+- axis, grids
+- points, vectors
+- functions (curves, tangents, integrals, sequences)
+- statistic diagrams
+- plane geometry (polygons, circles)
+
+The doc is in french...
+
+License LPPL 1.3
+
diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.pdf b/graphics/metapost/contrib/macros/repere/repere-doc.pdf
new file mode 100644
index 0000000000..2ba3e22bec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/repere/repere-doc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.tex b/graphics/metapost/contrib/macros/repere/repere-doc.tex
new file mode 100644
index 0000000000..b13edafcd6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/repere/repere-doc.tex
@@ -0,0 +1,1949 @@
+\documentclass[11pt,a4paper,french]{article}
+% Needs geometriesyr16.mp
+%http://melusine.eu.org/syracuse/poulecl/geometriesyr16/distrib/geometriesyr16-050408.tgz
+
+% To compile:
+% pdflatex repere-doc.tex
+% mptopdf repere-doc.mp
+% mptopdf repere-doc.mp
+% pdflatex repere-doc.tex
+
+ \usepackage{calc,ifthen}
+
+ \usepackage[utf8]{inputenc}
+ \usepackage[T1]{fontenc}
+ \usepackage{lmodern}
+ \usepackage{textcomp}
+ \usepackage{mathtools}
+
+ \usepackage{geometry}
+ \geometry{twoside,hmargin=2cm,vmargin={1.5cm,1.8cm},includefoot}
+
+ \usepackage[bottom]{footmisc}
+
+ \usepackage{mflogo}
+
+ \usepackage[output-decimal-marker={,}]{siunitx}
+
+ \usepackage{multicol}
+ \setlength{\multicolsep}{3pt}
+ \setlength{\columnsep}{0pt}
+
+ \usepackage[toc]{multitoc}
+
+ \usepackage{enumitem}
+ \setlist[description]{font=\ttfamily\bfseries\color{blue}}
+
+ \usepackage[svgnames]{xcolor}
+
+ \usepackage{graphicx}
+ \usepackage{ifpdf}
+ \ifpdf
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+
+ \usepackage{url}
+ \usepackage{verbatim}
+ \usepackage{fancyvrb}
+
+ \usepackage{array}
+ \usepackage{tabularx}
+ \renewcommand{\tabularxcolumn}[1]{>{\arraybackslash}m{#1}}
+
+ \usepackage{tcolorbox}
+ \tcbset{colframe=black,boxsep=0pt,left=3pt,right=3pt,top=0pt,bottom=0pt,boxrule=0.4pt,colback=LightGoldenrod}
+
+ \usepackage{listings}
+ \lstset{columns=flexible,%
+ language=MetaPost,%
+ showstringspaces=false,%
+ basicstyle=\ttfamily,
+ literate={é}{{\'e}}1}
+
+
+ \usepackage{babel}
+ \usepackage[colorlinks=true,urlcolor=blue]{hyperref}
+
+
+
+%%%%%%%%%%%%%%%%%%% moreverb.sty
+\makeatletter
+\newwrite\verbatim@out
+ \immediate\openout \verbatim@out \jobname.mp
+\newwrite\temp@code
+\def\verbatimwrite{%
+ \@bsphack
+ \immediate\openout \temp@code figtmp.mp
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active \catcode`\^^I=12
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out
+ {\the\verbatim@line}%
+ \immediate\write\temp@code
+ {\the\verbatim@line}
+ }%
+ \verbatim@start}
+
+\def\endverbatimwrite{%
+ \immediate\closeout\temp@code
+ \@esphack
+ }%
+\makeatother
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newlength{\largeurcode}
+\newlength{\largeurfig}
+\newcounter{numfig}
+\setcounter{numfig}{0}
+
+\newcommand{\codedeuxcol}{%
+ \begin{tcolorbox}
+ \begin{minipage}[c]{\largeurcode}
+ \begin{multicols}{2}
+ \lstinputlisting{figtmp.mp}
+ \end{multicols}
+ \end{minipage}
+ \end{tcolorbox}
+ \par\noindent
+ }
+
+
+\newcommand{\codehoriz}{%
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \hfill
+ }
+
+\newcommand{\codevert}{%
+ {\centering
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \par\noindent}
+ }
+
+\newenvironment{codefigure}[3]%
+ {%
+ \refstepcounter{numfig}
+ \setlength{\largeurcode}{#2\linewidth}
+ \ifnum#1=0
+ \setlength{\largeurfig}{\linewidth-\largeurcode-2\fboxsep-2\fboxrule}
+ \def\inscode{\codehoriz}
+ \else
+ \setlength{\largeurfig}{\linewidth}
+ \def\inscode{\codevert}
+ \ifnum#3=1
+ \relax
+ \else
+ \def\inscode{\codedeuxcol}
+ \fi
+ \fi
+ \verbatimwrite
+ }%
+ {%
+ \endverbatimwrite
+ \par
+ \noindent
+ \inscode
+ \IfFileExists{\jobname.\thenumfig}%
+ {\begin{minipage}[c]{\largeurfig}
+ \centering \includegraphics{\jobname.\thenumfig}\par
+% \centering a\includegraphics{reperedocfig2.mps}a\par
+ \end{minipage}}{}
+ \par}
+
+
+\newenvironment{codecache}%
+ {\verbatimwrite}{\endverbatimwrite}
+
+\newcounter{reptmp}
+
+\newenvironment{codefigureinter}[2][1]%
+ {%
+ \setcounter{reptmp}{\value{numfig}+#2}
+ \setlength{\largeurcode}{#1\linewidth}
+ \def\inscode{\codevert}
+ \verbatimwrite
+ }%
+ {\endverbatimwrite
+ \par
+ \noindent
+ \inscode
+ \whiledo{\value{numfig}<\value{reptmp}}
+ {\refstepcounter{numfig}
+ \IfFileExists{\jobname.\thenumfig}%
+ {\includegraphics{\jobname.\thenumfig}
+ \qquad}{}
+ }
+ \par}
+
+
+\newcounter{repexemple}
+\setcounter{repexemple}{0}
+
+\newcommand{\debutexemple}{\par\vspace{2ex}
+ \refstepcounter{repexemple}
+ \noindent {\bfseries \color{blue!20!black}
+ Exemple \arabic{repexemple}}
+ \par\nopagebreak\vspace{1ex}
+ }
+
+
+\newenvironment{exemple}[1][0.5]%
+ {\debutexemple
+ \codefigure{0}{#1}{1}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+\newenvironment{exemplev}[2][1]%
+ {\debutexemple
+ \codefigure{1}{#1}{#2}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+\newenvironment{exemplefiginter}[2][1]%
+ {\debutexemple
+ \codefigureinter[#1]{#2}
+ }%
+ {\endcodefigureinter
+ \par\vspace{2ex}}
+
+\newenvironment{figreperedoc}%
+ {\refstepcounter{numfig}
+ \verbatimwrite}%
+ {%
+ \endverbatimwrite%
+ \IfFileExists{\jobname.\thenumfig}%
+ {\includegraphics{\jobname.\thenumfig}}{}
+ }
+
+
+\newcommand{\vect}[1]{\overrightarrow{#1\rule{0.1em}{0ex}}}
+
+\begin{document}
+\title{Documentation de \texttt{repere.mp}}
+\date{\today}
+\author{Olivier \textsc{Péault}%
+\footnote{E-mail : \href{mailto:o.peault@posteo.net}{\texttt{o.peault@posteo.net}}}}
+\maketitle
+
+\setcounter{tocdepth}{2}
+
+\setlength{\columnsep}{25pt}
+\tableofcontents
+\setlength{\columnsep}{10pt}
+
+
+
+
+\begin{codecache}
+%outputtemplate := "%j-%c.mps";
+input geometriesyr16;
+input repere;
+\end{codecache}
+
+
+\section{Utilisation du fichier}
+Les macros du fichier \verb+repere.mp+ ont pour but de simplifier la création de figures dans un repère du plan avec \MP{}. L'idée de départ est de coller le plus possible aux besoins de l'enseignement secondaire de mathématiques.
+
+Il est possible d'utiliser \verb+repere+ et \verb+geometriesyr+ (les macros de Christophe \textsc{Poulain} pour la géométrie disponibles à l'adresse \url{http://melusine.eu.org/syracuse/poulecl/macros/}) dans une même figure comme le montre l'exemple page \pageref{exgeom}.
+
+Le fichier \verb+repere.mp+ doit être placé dans un répertoire accessible à \MP{} (Par ex. le répertoire \verb+metapost+ du \verb+texmf+). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures.
+
+
+Les étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} avec le package \verb+latexmp.mp+. Il est donc nécessaire de compiler deux fois les documents.
+
+
+\section{Repère utilisateur}
+
+\subsection{Numérotation des figures}
+Chaque figure devra débuter par une instruction \verb|repere()| et se terminer par \verb|fin| (voir ci-dessous). Si ces instructions se trouvent en dehors d'un environnement \verb|beginfig()|-\verb|endfig| la numérotation est automatique :
+
+\bigskip
+\begin{minipage}[c]{0.3\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]
+beginfig(2);
+repere(...);
+<instructions de dessin>
+fin;
+endfig;
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{0.6\linewidth}
+La figure porte le numéro 2
+\end{minipage}
+
+\bigskip
+\begin{minipage}[c]{0.3\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]
+repere(...);
+<instructions de dessin>
+fin;
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{0.6\linewidth}
+La numérotation est automatique. La figure porte le numéro qui suit la figure précédemment dessinée. S'il s'agit de la première, elle porte le numéro 1.
+\end{minipage}
+
+
+
+\subsection{Définition du repère}
+\begin{description}
+\item[repere(xmin,xmax,ux,ymin,ymax,uy,theta)] débute une figure et définit le repère utilisateur : axe des abscisses de \verb+xmin+ à \verb+xmax+, unité \verb+ux+, axe des ordonnées de \verb+ymin+ à \verb+ymax+, unité \verb+uy+ et \verb+theta+ est l'angle en degrés entre les axes. Le paramètre \verb+theta+ est optionnel. Il est égal à 90 par défaut.
+
+\item[repere.larg(xmin,xmax,Lx,ymin,ymax,Ly,theta)] définit un repère tel que la largeur totale de la figure produite soit \verb+Lx+ et sa hauteur \verb+Ly+.
+
+\item[repere.orth(xmin,xmax,Lx,ymin,ymax)] définit un repère orthonormé de largeur totale \verb+Lx+.
+
+\item[interaxes(x,y)] définit les coordonnées du point d'intersection des axes. Par défaut ces coordonnées sont $(0,0)$.
+
+\item[cadre] chemin fermé qui fait le tour du repère.
+
+\item[fin] termine la figure et la découpe pour ne garder que la partie limitée par le repère utilisateur.
+\end{description}
+
+
+
+
+\subsection{Axes}
+
+\subsubsection{Généralités}
+\begin{description}
+\item[axex.pos(grad,val)] axe des abscisses gradué avec un pas de \verb+grad+ et étiqueté avec un pas de \verb+val+.
+
+Si \verb+grad+ est négatif ou nul, l'axe n'est pas gradué et si \verb+val+ est négatif ou nul, l'axe n'est pas étiqueté.
+
+\verb+pos+ est un paramètre optionnel qui désigne la position (au sens de \MP : \verb+rt+, \verb+urt+, \verb+top+, \verb+ulft+, \verb+lft+, \verb+llft+, \verb+bot+ ou \verb+lrt+) des étiquettes. \verb+pos+ peut être omis, la valeur par défaut est \verb+bot+.
+
+Les étiquettes qui ne sont pas entièrement à l'intérieur du cadre ne sont pas dessinées.
+
+\item[axey.pos(grad,val)] axe des ordonnées. La valeur par défaut de \verb+pos+ est \verb+lft+.
+\end{description}
+
+
+Au niveau de l'intersection des axes, les étiquettes sont tracées à la position \verb+pos+ si l'abscisse est différente de l'ordonnée ou si un seul axe est tracé. Dans le cas contraire, une seule étiquette est tracée pour les deux axes à une position \og intermédiaire \fg{} (pour \verb+axex.bot+ et \verb+axey.lft+, on obtient la position \verb+llft+)
+
+\begin{description}
+\item[axes.pos(grad,val)] figure formée par les deux axes gradués avec le même pas \verb+grad+ et étiquetés avec le même pas \verb+val+. \verb+pos+ désigne la position de l'étiquette de l'intersection des axes, sa valeur par défaut est \verb|llft|. La position des étiquettes des axes est définie à partir de \verb+pos+ (pour \verb+urt+ on obtient \verb+top+ pour l'axe des abscisses et \verb+rt+ pour l'axe des ordonnées.
+
+\end{description}
+
+
+
+\begin{exemple}
+repere(-3,3,1cm,-1,1,1cm);
+draw axex(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,1cm,-1,1,1cm);
+draw axex.top(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw axes(1,1) withcolor pourpre;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm,60);
+draw axes.lrt(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere.orth(-3,3,5cm,-2.5,2.5);
+draw axex.top(0.5,1) withcolor bleu;
+draw axey(1,1) withcolor bleu;
+fin;
+\end{exemple}
+
+
+
+
+\subsubsection{Réglages des axes}
+
+Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes :
+
+
+\begin{description}
+\item[setaxes(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les axes.
+
+\item[setgrad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les graduations.
+
+\item[setval(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour l'étiquetage.
+
+\item[flecheaxe] booléen égal à \verb|true| par défaut qui permet de dessiner, ou non, des flèches au bout des axes.
+\end{description}
+
+\begin{exemple}
+repere.larg(110,160,5cm,2000,7000,5cm);
+interaxes(120,3000);
+setaxes(120,160,3000,7000);
+setgrad(120,160,3000,7000);
+draw axex(10,10);
+draw axey(1000,1000);
+fin;
+\end{exemple}
+
+
+\begin{description}
+ \item[axexo.pos(grad,val), axeyo.pos(grad,val), axeso.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée.
+
+ \item[axexn.pos(grad,val), axeyn.pos(grad,val), axesn.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.5,3,0.8cm,-0.5,2.5,1cm);
+setaxes(0,3,0,2.5);
+draw axeso(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere.larg(-3,3,6cm,-3,4,3.5cm,60);
+draw axexn(1,2) withcolor rouge;
+draw axeyn(1,1) withcolor olive;
+draw cadre;
+fin;
+\end{exemple}
+
+\subsubsection{Graduations multiples de $\pi$}
+
+\begin{description}
+\item[axexpi.pos(n,d)] axe des abscisses gradué et étiqueté avec un pas de $\frac{n\pi}{d}$. Les fractions sont composées en mode normal. Pour les obtenir en mode \og displaystyle \fg, la variable de type booléen \verb+displayfrac+ doit être égale à \verb+true+.
+
+\item[axeypi.pos(n,d)] axe des ordonnées gradué et étiqueté avec un pas de $\frac{n\pi}{d}$.
+
+\item[axespi.pos(n,d)] les deux axes gradués et étiquetés avec un pas de $\frac{n\pi}{d}$.
+
+\item[axexpio.pos(n,d), axeypio.pos(n,d), axespio.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée.
+
+\item[axexpin.pos(n,d), axeypin.pos(n,d), axespin.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,2.5,1.3cm,-3.5,3.5,0.8cm);
+draw axexpi(1,6) withcolor grisfonce;
+draw axeypi(1,4) withcolor grisfonce;
+draw cadre;
+fin;
+\end{exemple}
+
+\subsubsection{Graduations isolées}
+
+\begin{description}
+\item[axexpart.pos(x1,lab1,x2,lab2,...)] graduation et étiquetage partiels de l'axe des abscisses pour les valeurs \verb+x1+, \verb+x2+... et les étiquettes \verb+lab1+, \verb+lab2+... à la position \verb+pos+. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+bot+. Les étiquettes peuvent être soit des chaînes de caractères ("aa", "bonjour"), soit des expressions du type \verb+btex $\pi$ etex+ (ou \verb|LaTeX("$\pi$")| voir page \pageref{latex}), soit d'autres figures. Si \verb+labn+ est omis, la valeur de \verb+xn+ sera utilisée comme étiquette. Pour obtenir une graduation sans étiquette, on peut utiliser la chaîne vide \verb+""+.
+
+On peut désactiver le dessin de la graduation en donnant la valeur \verb|false| à \verb|boolgradxpart|.
+
+\item[axeypart.pos(y1,lab1,y2,lab2,...)] même chose sur l'axe des ordonnées. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+lft+.
+\end{description}
+
+
+
+\begin{exemple}[0.55]
+repere.orth(-4,5,6cm,-3,4.5);
+setgrad(0,5,0,3);
+setval(0,5,0,3);
+draw axex(1,2);
+draw axey(1,0);
+draw axexpart(-1.8,-pi,LaTeX("$-\pi$"))
+ withcolor bleu;
+draw axeypart.rt(-2.5,"dd",-1,2.5,"")
+ withcolor rouge;
+fin;
+\end{exemple}
+
+\subsubsection{Ajout de texte sur les graduations}
+
+\begin{description}
+\item[extranumx] chaine de caractères qui sera ajoutée après les valeurs des graduations sur l'axe des abscisses avant d'être composée avec la commande \verb|\num| de \verb|siunitx|.
+\item[extranumy] même chose sur l'axe des ordonnées.
+
+\end{description}
+
+\begin{exemple}
+repere(-1,4,1.2cm,-1,3.5,1cm);
+extranumx:="e3";
+extranumy:="0000";
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+
+\subsection{Quadrillages}
+\begin{description}
+\VerbatimFootnotes
+\item[setquad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour le tracé des quadrillages.\footnote{Il existe une macro \verb|settout| qui appelle successivement \verb+setaxes+, \verb+setgrad+, \verb+setval+ et \verb+setquad+.}
+
+\item[quadrillage(x,y)] quadrillage avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. L'épaisseur des traits par défaut est \verb+0.3bp+ et la couleur par défaut est \verb+0.7white+.
+\end{description}
+
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw quadrillage(1,0.5);
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw quadrillage(1,1) dashed evenly
+ withcolor (1,0.5,0.5);
+draw axes(1,1) withcolor marine;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[papiermillimetre] comme son nom l'indique... Les couleurs et les épaisseurs des traits sont stockées dans \verb+pm_coula+, \verb+pm_coulb+, \verb+pm_coulc+ et \verb+pm_epa+, \verb+pm_epb+, \verb+pm_epc+.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,2.5,1cm,-2.5,2.5,1cm);
+setquad(-2,2,-2,2);
+draw papiermillimetre;
+draw axes(1,1);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[papierpointe(x,y)] quadrillage formé de points avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. La taille des points par défaut est \verb+2bp+.
+\end{description}
+
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+setquad(0,3,0,2.5);
+draw papierpointe(0.5,0.5);
+setquad(-3,0,-2.5,2.5);
+draw quadrillage(1,1) dashed
+ withdots withcolor magenta;
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\subsection{Base}
+\begin{description}
+\item[base(O,i,j)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux vecteurs de la base et leurs noms (\verb+i+ et \verb+j+ surmontés d'une flèche). Si les noms sont de la forme \og lettre + nombre\fg, le nombre est affiché en indice.
+
+\item[basep(O,I,J)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux points qui définissent le repère.
+\end{description}
+
+
+\begin{exemple}
+repere(-1.5,3.5,0.8cm,-1,3,1cm);
+flecheaxe:=false;
+draw axesn(1,1);
+drawoptions(withcolor marine);
+draw base(O,i,j);
+interaxes(2,1);
+draw base(I,e1,e2);
+drawoptions();
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-1,2.5,0.8cm,-1,2,1cm);
+flecheaxe:=false;
+draw axes(1,0);
+draw basep(O,I,J);
+draw cadre;
+fin;
+\end{exemple}
+
+
+
+
+\section{Points, vecteurs}
+
+\subsection{Points}
+\label{points}
+\begin{description}
+\item[(x,y)] désigne le point (ou le vecteur) de coordonnées cartésiennes \verb+x+ et \verb+y+ dans le repère utilisateur.
+
+\item[pol(r,t)] désigne le point (ou le vecteur) de coordonnées $(r\cos t;r\sin t)$ dans le repère utilisateur.
+
+\item[pold(r,t)] même chose avec l'angle donné en degrés.
+\end{description}
+
+Les macros suivantes sont directement inspirées des macros similaires de \verb+geometriesyr16.mp+.
+
+
+\begin{description}
+\item[MarquePoint(A)] marque le point \verb+A+. Le style de marque est contrôlé par le paramètre \verb+marque_p+ qui peut prendre les valeurs \verb+"plein"+ (valeur par défaut), \verb+"creux"+ ou \verb+"croix"+. Une autre valeur que celles-ci ne produira aucune marque.
+
+\item[pointe(A,B,C...)] permet de marquer plusieurs points.
+
+\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+ (qui peut être \verb|rt|, \verb|urt|, \verb|top|, \verb|ulft|...). \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-3,3,0.9cm,-2.5,5,0.9cm);
+pair A,B,C[],D,E,F;
+A=(1,1);B=(2,3);
+D=(-2,-1);E=(-1,-1);F=(-1,-2);
+draw axes(1,0);
+marque_p:="";drawoptions(withcolor magenta);
+nomme.llft(A);nomme.top(B);draw A--B;
+marque_p:="croix";drawoptions(withcolor rouge);
+pointe(D,E,F);
+marque_p:="creux";drawoptions(withcolor orange);
+nomme.bot(pol(sqrt(2),-pi/4),
+ "$\sqrt{2}e^{-i\frac{\pi}{4}}$");
+nomme.bot((-1.5,1),"$(-1,5;1)$");
+marque_p:="plein";drawoptions(withcolor violet);
+for i=2 upto 4:
+ C[i]=(-3+i/2,i);nomme.lft(C[i]);
+endfor
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[nomme{[a]}(A,nom)] Il est possible d'obtenir un placement plus fin des étiquettes en remplaçant la position au sens de \MP{} (\verb|rt|, \verb|urt|...) par un nombre qui représente alors la position de l'étiquette par rapport au point en degrés.
+\end{description}
+
+\begin{exemple}[0.55]
+repere(-3,3.5,1cm,-3,3,1cm);
+ pair A,B,C[];
+ A=(-2,-1);B=(1,-2);
+ nomme[40](A);nomme[70](A);nomme[100](A);
+ nomme[-110](B);
+ for i=0 upto 8:
+ C[i]:= (1+1.5*cosd(40i),1+1.5*sind(40i));
+ nomme[40*i](C[i]) couleur pourpre;
+ endfor
+draw cadre;
+fin;
+\end{exemple}
+
+
+\subsection{Vecteurs}
+\begin{description}
+\item[vecteur.pos(A,u,nom)] figure formée du représentant du vecteur \verb+u+ d'origine \verb+A+ ainsi que de \verb+nom+ placé à la position \verb+pos+ par rapport au milieu de la flèche. Si \verb+nom+ est une chaine de caractère, il sera affiché avec une flèche. Si \verb+nom+ est omis, \verb+u+ surmonté d'une flèche est utilisé. S'il s'agit d'un élément d'un tableau de points (\verb+u1+, \verb+u2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-1,5.5,0.7cm,-4,4,0.8cm);
+pair A,B,C[],u,v,w[];
+u=(2,2);v=(2,-1);
+A=(1,1);B=A+u;
+draw axes(1,0);
+draw base(O,i,j);
+drawoptions(withcolor cyan);
+nomme.llft(A);nomme.top(B);
+draw vecteur.ulft(A,u,"AB");
+draw vecteur.urt(B,v);
+draw vecteur.bot(A,u+v,%
+ LaTeX("$\vect{u}+\vect{v}$"));
+drawoptions(withcolor marine);
+for i=1 upto 3:
+ C[i]=(1,i-4);w[i]=(1.5,0.5*i-1);
+draw vecteur.bot(C[i],w[i]);
+endfor
+draw cadre;
+fin;
+\end{exemple}
+
+
+
+\section{Droites, courbes...}
+
+\subsection{Droites}
+\begin{description}
+\item[droite(A,B)] droite $(AB)$.
+
+\item[droite(a,b,c)] droite d'équation $ax+by+c=0$ dans le repère utilisateur.
+
+\item[droite(a,b)] droite d'équation $y=ax+b$ dans le repère utilisateur.
+
+\item[droite(c)] droite d'équation $x=c$ dans le repère utilisateur.
+\end{description}
+
+
+\begin{exemple}[0.65]
+repere(-2,3,1cm,-2,3,1cm);
+pair A,B;
+A=(-0.5,-1);B=(1.5,1.5);
+draw axes(1,0);
+nomme.ulft(A);
+nomme.lrt(B);
+drawoptions(withpen pencircle scaled 1);
+draw droite(A,B) withcolor olive;
+draw droite(1) withcolor vertfonce; %x=1
+draw droite(1/3,3/2) withcolor vertfonce; %y=(1/3)x+3/2
+draw droite(2,3,-1) withcolor vertfonce; %2x+3y-1=0
+fin;
+\end{exemple}
+
+\subsection{Demi-droites}
+\begin{description}
+\item[demidroite(A,B)] demi-droite $[AB)$.
+
+\item[demidroite(A,a)] demi-droite d'origine $A$ qui fait un angle $a$ avec la direction $(Ox)$.
+\end{description}
+
+
+\begin{exemple}
+repere(-4,4,0.9cm,-3,4,0.9cm);
+pair A,B,C;
+numeric a;
+A=(-1,1);B=(2,2);C=(-1,-2);
+draw axes(1,0);
+draw demidroite(A,B);
+nomme.llft(A);nomme.lrt(B);
+draw demidroite(C,0) dashed evenly;
+draw demidroite(C,120);
+nomme.llft(C);
+fin;
+\end{exemple}
+
+\subsection{Courbes et fonctions}
+\MP{} permet de définir simplement des fonctions (en utilisant par exemple la syntaxe suivante :
+\verb|vardef f(expr x)=2x+1 enddef;|) et de définir des courbes passant par des points donnés (\verb+A..B..C+). Ces possibilités sont utilisées dans les macros qui suivent.
+
+\begin{description}
+\item[courbefonc(f)()] courbe représentant la fonction $f$ sur l'intervalle définissant le repère.
+
+\item[courbefonc(f)(xmin,xmax)] courbe représentant la fonction $f$ sur l'intervalle $[xmin;xmax]$.
+
+\item[courbefonc(f)(xmin,xmax,n)] courbe représentant la fonction $f$ sur l'intervalle $[xmin;xmax]$ en utilisant \verb+n+ points d'interpolation. La valeur par défaut de \verb|n| est 60.
+
+\item[courbepoints(f)(xmin,xmax,n)] ne trace que les \verb+n+ points sans les relier. Les points sont dessinés en fonction de la valeur de \verb+marque_p+ (voir \ref{points}).
+
+\item[fonccourbe.p(x)] image de \verb+x+ par la fonction dont la courbe représentative est le chemin \verb+p+. La macro renvoie 0 si la fonction n'est pas définie.
+
+\item[nomme.pos(p,x,nom)] affiche \verb+nom+ au point d'abscisse \verb+x+ de la courbe \verb+p+ à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+p+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+p1+, \verb+p2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.5]
+repere(-2,5,0.7cm,-3,3,0.7cm);
+vardef f(expr x)=-0.5(x**2)+2*x enddef;
+vardef g(expr x)=exp(x)/10-3 enddef;
+path C_f;
+draw axes(1,1);
+drawoptions(withcolor moutarde);
+C_f= courbefonc(f)();
+draw C_f withpen pencircle scaled 1;
+nomme.llft(C_f,4.7);
+drawoptions(withcolor beige);
+draw courbepoints(g)(0,4,9);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[intercourbes(P,p,q)] stocke dans le tableau de points \verb+P+ les points d'intersection des chemins \verb+p+ et \verb+q+. \verb+P1+ est un des points d'intersection, \verb+P2+ un autre etc. Il faut, avant d'utiliser cette macro, déclarer le tableau \verb+P+ de la façon suivante : \verb+pair P[];+
+
+\item[ptantecedents(P,y,p)] stocke dans le tableau de points \verb+P+ les points du chemin \verb+p+ d'ordonnée \verb+y+. De même que précédemment, le tableau \verb+P+ doit être déclaré avant d'utiliser cette macro.
+
+\item[antecedents(X,y,p)] stocke dans le tableau de nombres \verb+X+ les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+. De même que précédemment, le tableau \verb+X+ doit être déclaré avant d'utiliser cette macro.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,C_f;
+pair I[],A[];
+vardef f(expr x)= x**2-2x enddef;
+p=(-2,-2)..(-1,1)..(0,2)..(1,1)
+ ..(2,-2)..(3,-3)..(3.5,-2.5)
+ ..(4,-1);
+C_f= courbefonc(f)(-2,2.5);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+draw C_f withcolor rouge;
+intercourbes(I,C_f,p);
+drawoptions(withcolor violet);
+nomme.lft(I1);nomme.rt(I2);
+draw droite(0,-1.5) dashed evenly;
+ptantecedents(A,-1.5,p);
+nomme.lrt(A1);nomme.llft(A2);
+nomme.lrt(A3);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[marquepointcourbe(p,x1,x2,...)] marque les points de la courbe \verb+p+ d'abscisses \verb+x1+, \verb+x2+... La marque dépend de la valeur de \verb+marque_p+.
+
+\item[marquepointchemin(p,n1,n2,...)] dans le cas d'un chemin défini par \verb+A..B..C..+, marque le \verb+n1+-ième point, le \verb+n2+-ième point... La marque dépend de la valeur de \verb+marque_p+. Attention, le premier point est numéroté 0.
+
+\end{description}
+
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,C_f;
+pair I[],A[];
+vardef f(expr x)= x**2-2x enddef;
+p=(-2,-2)..(-1,1)..(0,2)
+ ..(1,1)..(2,-2)..(3,-3)
+ ..(3.5,-2.5)..(4,-1);
+C_f= courbefonc(f)(-2,3);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+draw C_f withcolor rouge;
+drawoptions(withcolor violet);
+marquepointcourbe(C_f,-0.5,0.8,2.2,2.6);
+marquepointchemin(p,0,2,3,5);
+fin;
+\end{exemple}
+
+
+\subsection{Nommage automatique des courbes}
+\begin{description}
+\item[nomme(p,nom)] affiche \verb|nom| au niveau d'un point d'intersection de \verb|p| et du contour de la figure. Ce point est choisi en fonction de la chaine \verb|prefnomme| qui peut prendre les valeurs \verb|"right"| (valeur par défaut), \verb|"left"|, \verb|"top"| ou \verb|"bottom"|.
+\end{description}
+
+\begin{exemple}
+prefnomme:="left";
+
+repere(-5,5,0.7cm,-5,5,0.7cm);
+path d,C_f;
+d=droite(-1,3);
+vardef f(expr x)=0.5(x**2)-x -4 enddef;
+C_f=courbefonc(f)();
+draw axes(1,1);
+draw d epaisseur 1 couleur bleu;
+draw C_f epaisseur 1 couleur bleu;
+nomme(d,"$d_2$") couleur bleu;
+nomme(C_f) couleur bleu;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+prefnomme:="bottom";
+
+repere(-5,5,0.7cm,-5,5,0.7cm);
+path d,C_f;
+d=droite(-1,3);
+vardef f(expr x)=0.5(x**2)-x -4 enddef;
+C_f=courbefonc(f)();
+draw axes(1,1);
+draw d epaisseur 1 couleur bleu;
+draw C_f epaisseur 1 couleur bleu;
+nomme(d,"$d_2$") couleur bleu;
+nomme(C_f) couleur bleu;
+draw cadre;
+fin;
+\end{exemple}
+
+\subsection{Dérivée et tangentes}
+\begin{description}
+\item[der.p(x)] image de \verb+x+ par la dérivée de la fonction dont la courbe représentative est \verb+p+.
+%\item[der2.f(x)] image de \verb+x+ par la dérivée de la fonction \verb+f+.
+
+\item[tangente(p,x)] tangente à la courbe \verb+p+ au point d'abscisse \verb+x+.
+
+\item[tangente.gauche(p,x,long)] flèche de longueur \verb+long+ représentant la demi-tangente gauche à la courbe \verb+p+ au point d'abscisse \verb+x+. Le paramètre \verb+long+ est optionnel. Sa valeur par défaut est \verb+20bp+.
+
+\item[tangente.droite(p,x,long)] idem à droite.
+
+\item[tangente.double(p,x,long)] idem des deux côtés.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,q;
+p=(-2,-2){dir 60}..(-1,1)
+ ..(0,2){right}..(1,1)..(2,-2)
+ ..(3,-3){right}..(4,-2){(1,2)};
+q= courbefonc(der.p)(-1,4);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+nomme.rt(p,0.7,"$y=f(x)$");
+draw q withcolor rouge;
+nomme.lft(q,3.7,"$y=f'(x)$");
+drawoptions(withpen pencircle scaled 1
+ withcolor violet);
+draw tangente.double(p,0);
+draw tangente.droite(p,-2,40);
+draw tangente.gauche(p,4,30);
+draw tangente(p,2.5);
+fin;
+\end{exemple}
+
+\subsection{Interpolation}
+
+
+
+\MP{} propose les commandes suivantes (qui peuvent être combinées dans une même courbe) :
+
+\begin{description}
+\item[A-{}-B-{}-C-{}-] Ligne brisée passant par les points $A$, $B$, $C$...
+\item[A..B..C..] Courbe de Bézier passant par les points $A$, $B$, $C$...
+\end{description}
+
+\subsubsection*{Interpolation polynomiale}
+\verb|repere.mp| propose aussi les commandes ci-dessous (pas toujours la meilleure méthode d'approximation...). À compiler avec \verb|mpost -numbersystem="decimal" fichier.mp| pour gagner en précision.
+
+\begin{description}
+\item[lagrange(A,B,C,...)()] Courbe passant par $A$, $B$, $C$... représentant le polynôme de degré maximal $n-1$ tel que $P(x_A)=y_A$, $P(x_B)=y_B$... sur l'intervalle définissant le repère.
+\item[lagrange(A,B,C,...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\item[lagrange(x1,y1,x2,y2,x3,y3...)()] Courbe passant par les points $(x_1;y_1)$, $(x_2;y_2)$, $(x_3;y_3)$... représentant le polynôme de degré maximal $n-1$ tel que $P(x_i)=y_i$ sur l'intervalle définissant le repère.
+\item[lagrange(x1,y1,x2,y2,x3,y3...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\end{description}
+
+\begin{exemple}[0.55]
+repere.orth(-1,10,7cm,-1,10);
+pair A[],B[];
+A[1]=(1,1);A[2]=(3,5);A[3]=(5,8);
+A[4]=(7,2);A[5]=(9,4);
+B[1]=(1,6);B[2]=(3,7);B[3]=(6,4);B[4]=(8,9);
+path L;L=lagrange(A[1],A[2],A[3],A[4],A[5])();
+path C;C=lagrange(1,6,3,7,6,4,8,9)(0,8);
+draw quadrillage(1,1);
+draw axes(1,1);
+draw L epaisseur 1 couleur rouge;
+draw C epaisseur 1 couleur bleu;
+for i=1 upto 5: nomme.llft(A[i]) couleur rouge;
+endfor
+for i=1 upto 4: nomme.llft(B[i]) couleur bleu;
+endfor
+fin;
+\end{exemple}
+
+
+\begin{description}
+\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)()] Courbe passant par les points $(x_1;y_1)$, $(x_2;y_2)$, $(x_3;y_3)$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_i)=y_i$ et $P'(x_i)=y'_i$ sur l'intervalle définissant le repère.
+\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\item[hermite(A,y'A,B,y'B,C,y'C...)()] Courbe passant par les points $A$, $B$, $C$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_A)=y_A$ et $P'(x_A)=y'_A$... sur l'intervalle définissant le repère.
+\item[hermite(A,y'A,B,y'B,C,y'C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\end{description}
+
+\begin{exemple}[0.55]
+repere.orth(-1,10,7cm,-1,10);
+draw quadrillage(1,1);
+draw axes(1,1);
+path H;H=hermite((1,2,0.5),(4,8,0),(8,2,2))();
+draw H epaisseur 1 couleur bleu;
+draw tangente.double(H,1) couleur bleu;
+draw tangente.double(H,4) couleur bleu;
+draw tangente.double(H,8) couleur bleu;
+pair A,B,C; A:=(1,8);B:=(4,4);C:=(7,6);
+path I;I=hermite(A,-1,B,0.5,C,2)(0,7.5);
+draw I epaisseur 1 couleur rouge;
+draw tangente.double(I,1) couleur rouge;
+draw tangente.double(I,4) couleur rouge;
+draw tangente.double(I,7) couleur rouge;
+fin;
+\end{exemple}
+
+
+\subsubsection*{Interpolation à l'aide de splines cubiques}
+
+\begin{description}
+\item[splineder(A,y'A,B,y'B,C,y'C...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$ et $f'(x_A)=y'_A$ sur l'intervalle définissant le repère.
+\item[splineder(A,y'A,B,y'B,C,y'C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\item[splineder(xA,yA,y'A,xB,yB,y'B,...)()] Même courbe que précédemment (sur l'intervalle définissant le repère) mais les valeurs sont données sous forme de liste.
+\item[splineder(xA,yA,y'A,xB,yB,y'B,...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\end{description}
+
+\begin{exemple}[0.55]
+repere.orth(-1,10,7cm,-1,10);
+draw quadrillage(1,1);
+draw axes(1,1);
+path H;H=splineder(1,2,0.5,4,8,0,8,2,2)();
+draw H epaisseur 1 couleur bleu;
+draw tangente.double(H,1) couleur bleu;
+draw tangente.double(H,4) couleur bleu;
+draw tangente.double(H,8) couleur bleu;
+pair A,B,C; A:=(1,8);B:=(4,4);C:=(7,6);
+path I;I=splineder(A,-1,B,0.5,C,2)(0,7.5);
+draw I epaisseur 1 couleur rouge;
+draw tangente.double(I,1) couleur rouge;
+draw tangente.double(I,4) couleur rouge;
+draw tangente.double(I,7) couleur rouge;
+fin;
+\end{exemple}
+
+
+
+\begin{description}
+\item[spline(A,B,C...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$, $f(x_B)=y_B$... sur l'intervalle définissant le repère.
+\item[spline(A,B,C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\item[spline(xA,yA,xB,yB,xC,yC,...)()] Même courbe que précédemment (sur l'intervalle définissant le repère) mais les valeurs sont données sous forme de liste.
+\item[spline(xA,yA,xB,yB,xC,yC...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\end{description}
+
+\begin{exemple}[0.55]
+repere.orth(-1,10,7cm,-1,10);
+pair A[],B[];
+A[1]=(1,1);A[2]=(3,5);A[3]=(5,8);
+A[4]=(7,2);A[5]=(9,4);
+B[1]=(1,6);B[2]=(3,7);B[3]=(6,4);B[4]=(8,9);
+path L;L=spline(A[1],A[2],A[3],A[4],A[5])();
+path C;C=spline(1,6,3,7,6,4,8,9)(0,8);
+draw quadrillage(1,1);
+draw axes(1,1);
+draw L epaisseur 1 couleur rouge;
+draw C epaisseur 1 couleur bleu;
+for i=1 upto 5: nomme.llft(A[i]) couleur rouge;
+endfor
+for i=1 upto 4: nomme.llft(B[i]) couleur bleu;
+endfor
+fin;
+\end{exemple}
+
+\begin{description}
+\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$, $f(x_B)=y_B$... et, le cas échéant, $f'(x_A)=y'_A$, $f'(x_B)=y'_B$... sur l'intervalle définissant le repère.
+\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\end{description}
+
+\begin{exemple}[0.55]
+repere.orth(-1,10,7cm,-1,10);
+pair A,B,C,D;
+A=(0,1);B=(3,7);C=(6,2);D=(9,6);
+path S,T;
+S=spline(A,B,C,D)();
+T=spline(A,0.5,B,C,0,D,-2)();
+draw quadrillage(1,1);
+draw axes(1,1);
+draw S epaisseur 1 couleur bleu;
+draw T epaisseur 1 couleur rouge;
+draw tangente.double(T,0) couleur rouge;
+draw tangente.double(T,6) couleur rouge;
+draw tangente.double(T,9) couleur rouge;
+nomme.lrt(A);nomme.top(B);
+nomme.llft(C);nomme.rt(D);
+fin;
+\end{exemple}
+
+
+\section{Suites}
+\begin{description}
+\item[suite(u,deb,fin)] figure formée des points $(i;u_i)$ pour $i$ variant entre \verb+deb+ et \verb+fin+.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.9,7,0.8cm,-1.2,1.2,1.5cm);
+vardef u(expr n)=(-1)**n/n enddef;
+taillepoint:=4;
+draw axes(1,1);
+draw suite(u,1,6) withcolor vertfonce;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[suiterec(f,deb,fin,init)] ligne brisée (\og escalier \fg{} ou \og escargot \fg) permettant de visualiser les termes de la suite définie par $u_{n+1}=f(u_n)$ de premier terme $u_{deb}=init$ et de dernier terme $u_{fin}$.
+
+\item[suiterecprojx.pos(lab,min,max)] figure formée des segments joignant les points $(u_n;u_n)$ et $(u_n;0)$ pour $n$ compris entre \verb+min+ et \verb+max+. La suite $u$ et sa valeur initiale sont définies par le dernier appel de la macro \verb+suiterec+. \verb+lab+ désigne l'étiquette au niveau de l'axe des abscisse placée à la position \verb+pos+. Si \verb+lab+ est la chaîne vide \verb+""+, rien n'est écrit ; si \verb+lab+ est une autre chaîne de caractère (par ex. \verb+"u"+), elle est utilisée comme nom de la suite (on obtiendra $u_0$, $u_1$...) ; si \verb+lab+ est un nombre, les valeurs de la suites seront affichées et arrondies à \verb+lab+ décimales. Les valeurs \verb+min+ et \verb+max+ sont facultatives et égales par défaut aux valeurs \verb+deb+ et \verb+fin+ passées à la macro \verb+suiterec+.
+
+\item[suiterecprojy.pos(lab,min,max)] même chose sur l'axe des ordonnées.
+
+\item[suiterecproj(lab,min,max)] même chose sur les deux axes. Les positions sont \verb+bot+ sur l'axe des abscisses et \verb+lft+ sur l'axe des ordonnées.
+
+
+\begin{exemple}[0.55]
+repere(-2,4.5,1cm,-1,4,1cm);
+vardef f(expr x)=sqrt(2*x+4) enddef;
+path C_f,sr;
+C_f= courbefonc(f)();
+sr=suiterec(f,0,3,-1.2);
+draw axes(1,0);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor bleu;
+draw droite(1,0);
+drawoptions(withcolor rouge);
+draw suiterecprojx.bot(1) dashed evenly;
+draw suiterecprojy.lft("") dashed evenly;
+draw sr withcolor rouge;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+vardef f(expr x)=4-0.8*x enddef;
+path C_f,sr;
+C_f= courbefonc(f)();
+sr=suiterec(f,0,5,0.2);
+draw axes(1,0);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor bleu;
+draw droite(1,0);
+drawoptions(withcolor rouge);
+draw suiterecproj("u",1,3) dashed evenly;
+draw sr withcolor rouge;
+fin;
+\end{exemple}
+
+
+
+\end{description}
+
+
+
+\section{Surfaces}
+
+\subsection{Calcul intégral}
+\begin{description}
+\item[entrecourbes(p,q,xmin,xmax)] chemin fermé délimitant la zone comprise entre les courbes \verb+p+ et \verb+q+ et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$. Il peut donc être dessiné, rempli...
+
+\item[souscourbe(p,xmin,xmax)] chemin fermé délimitant la zone comprise entre la courbe \verb+p+, l'axe des abscisses et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$.
+\end{description}
+
+
+\begin{exemple}
+repere(-3.5,6,0.7cm,-2.5,4.5,0.7cm);
+vardef f(expr x)= -(x/4)**3+0.75x enddef;
+vardef g(expr x)= -((x-2)**2)/9+4 enddef;
+path C_f,C_g,p,q;
+C_f:= courbefonc(f)();
+C_g:= courbefonc(g)();
+p:=entrecourbes(C_f,C_g,-2,1);
+q:=souscourbe(C_f,3,5);
+fill p withcolor 0.5Violet;
+draw p withpen pencircle scaled 2
+ withcolor Violet;
+fill q withcolor 0.5Bleu;
+draw q dashed evenly withcolor Bleu;
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor Bleu;
+draw C_g withcolor Rouge;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[rectangles.type(p,a,b,n)] figure formée de \verb+n+ rectangles s'appuyant sur la courbe \verb+p+ entre les abscisses \verb+a+ et \verb+b+. \verb+type+ peut être \verb+min+, \verb+max+, \verb+droite+ ou \verb+gauche+.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,6,0.8cm,-2,5,0.8cm);
+vardef f(expr x)=
+ -((x-2)**4)/32+((x-2)**2)/2+1
+enddef;
+path Cf,r[];
+Cf= courbefonc(f)();
+r1=rectangles.max(Cf,2,5.5,8);
+r2=rectangles.min(Cf,2,5.5,8);
+r3=rectangles.droite(Cf,-2,1,10);
+fill r1 withcolor 0.8Rouge;
+fill r2 withcolor 0.4Rouge;
+fill r3 withcolor 0.5Bleu;
+draw r1;draw r2 withcolor 0.8Rouge;
+draw r3;
+draw axes(1,0);
+draw Cf withcolor Bleu
+ withpen pencircle scaled 1;
+fin;
+\end{exemple}
+
+\subsection{Demi-plans}
+\begin{description}
+ \item[demiplaninf(d)] chemin fermé délimité par la droite \verb+d+ et par la partie inférieure de \verb+cadre+ (ou la partie gauche si \verb+d+ est parallèle à l'axe des ordonnées.
+ \item[demiplansup(d)] chemin fermé délimité par la droite \verb+d+ et par la partie supérieure de \verb+cadre+ (ou la partie droite si \verb+d+ est parallèle à l'axe des ordonnées.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,3.5,1cm,-2.5,3.5,1cm);
+numeric qqw;qqw=6;
+path d[],dp[];
+d1=droite(2);
+d2=droite(1,1);
+d3=droite(-0.5,-0.5);
+dp1=demiplansup(d1);
+dp2=demiplansup(d2);
+dp3=demiplaninf(d3);
+for i=1 upto 3:
+fill dp[i] withcolor 0.7Lime;
+endfor
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1
+ withcolor Vertfonce);
+draw d1;draw d2;
+draw d3 dashed evenly;
+drawoptions();
+draw cadre;
+fin;
+\end{exemple}
+
+
+
+
+
+\section{Projections sur les axes}
+
+\subsection{Projetés}
+\begin{description}
+\item[projetex(A)] projeté de \verb+A+ sur l'axe des abscisses parallèlement à l'axe des ordonnées.
+
+\item[projetey(A)] projeté de \verb+A+ sur l'axe des ordonnées parallèlement à l'axe des abscisses.
+
+\item[projectionx.pos(A,lab,dec)] figure constituée du segment joignant \verb+A+ à son projeté sur l'axe des abscisses ainsi que de l'étiquette \verb+lab+ placée à la position \verb+pos+ par rapport à ce projeté. La valeur \verb+dec+ indique un décalage par rapport à l'axe des abscisses. L'étiquette et le décalage sont optionnels.
+
+\item[projectiony.pos(A,lab,dec)] même chose sur l'axe des ordonnées.
+
+\item[projectionaxes(A,labx,laby,dec)] figure constituée des segments joignant \verb+A+ à ses projetés sur les axes ainsi que des étiquettes \verb+labx+ et \verb+laby+ positionnées automatiquement avec un décalage \verb+dec+ par rapport aux axes. Les étiquettes et le décalage sont optionnels.
+\end{description}
+
+
+
+\begin{exemple}[0.6]
+repere(-1.5,3.5,1cm,-2.2,2.5,1cm);
+path Cf; pair A[];
+vardef f(expr x)= x**2-2x-0.5 enddef;
+Cf= courbefonc(f)();
+ptantecedents(A,2,Cf);
+draw axes(1,1);
+draw Cf withpen pencircle scaled 1 withcolor bleu;
+drawoptions(dashed evenly withcolor rouge);
+draw projectionaxes((1.3,f(1.3)),"$x$","$f(x)$");
+draw projectionx.urt(A1,"$x_1$");
+draw projectionx.llft(A2,"$x_2$",-6);
+draw A1--A2;
+fin;
+\end{exemple}
+
+\subsection{Intervalles}
+\begin{description}
+\item[intervallex.bornes(a,b)] intervalle dessiné sur l'axe des abscisses entre \verb+a+ et \verb+b+ avec une épaisseur par défaut de \verb+1.5bp+. \verb+bornes+ peut être \verb+OO+ (ouvert à gauche, ouvert à droite), \verb+OF+, \verb+FO+ ou \verb+FF+.
+
+\item[intervalley.bornes(a,b)] même chose sur l'axe des ordonnées.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-1,5,0.9cm,-1,4.5,1cm);
+vardef f(expr x)=x**2-5x+7 enddef;
+draw axes(1,1);
+draw courbefonc(f)()
+ withpen pencircle scaled 1 withcolor bleu;
+drawoptions(dashed evenly withcolor rouge);
+draw projectionx.bot((1,f(1)));
+draw projectiony.llft((2.5,f(2.5)),"0,75");
+draw projectionaxes((4,f(4)));
+drawoptions(withcolor violet);
+draw intervallex.OF(1,4);
+draw intervalley.FF(0.75,3);
+label("$f(]1;4])=[0,75;3]$",(2.5,4));
+draw cadre;
+fin;
+\end{exemple}
+
+
+
+\section{Statistiques et probabilités}
+
+\subsection{Boite à moustache}
+\begin{description}
+\item[boitemoustache(min,Q1,Me,Q3,max,dec,larg)] \og Boite à moustache \fg{} correspondant aux données en argument. Elle est située à un distance \verb|dec| de l'axe des abscisses et le rectangle a une largeur de \verb|larg|. Ces deux dernières valeurs sont optionnelles et valent par défaut \SI{1,5}{cm} et \SI{1}{cm}.
+
+\item[projboitemoustache(t)] Figure formée des lignes joignant les cinq valeurs du dernier diagramme en boite dessiné à son projeté sur l'axe des abscisses ainsi que de certaines étiquettes : Si \verb|t| est vide, les textes $X_{min}$, $Q_1$, $M_e$, $Q_3$ et $X_{max}$ sont affichés ; si \verb|t| est un entier, les valeurs arrondies à $10^{-t}$ sont affichées ; si \verb|t| est une liste de cinq textes (ou valeurs), ceux-ci sont affichés.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.5,10,0.7cm,-1,5,0.7cm);
+ setaxes(0,10,0,1);
+ draw axex(1,0);
+ draw boitemoustache(1,4,5,7,9)
+ withcolor marine;
+ draw projboitemoustache.bot()
+ withcolor 0.7rouge dashed evenly;
+fin;
+\end{exemple}
+
+\begin{exemplev}[1]{1}
+repere(-1,11,0.8cm,-1,5,0.7cm);
+ settout(-0.5,10.5,0,1);
+ draw axex(1,0);
+ drawoptions(withcolor rouge);
+ draw boitemoustache(1.22,3.9,5,7.18,9.05,1cm,0.7cm);
+ draw projboitemoustache.bot(1) dashed evenly;
+ drawoptions(withcolor blue);
+ draw boitemoustache(0,3.14,6,8,10,2cm,0.7cm);
+ draw projboitemoustache.bot(0.0456,"$\pi$","$\num{2x3}$","$x$","Max") dashed evenly;
+fin;
+\end{exemplev}
+
+
+\subsection{Diagrammes}
+\begin{description}
+\item[diagrammebatons((v1,e1),(v2,e2),...(vn,en))] Figure formée des \verb|n| segments joignant les points \verb|(v1,e1),(v2,e2),...(vn,en)| et leur projeté sur l'axe des abscisses. Les bâtons sont surmontés d'un point dont le diamètre est égal à la largeur des segments multiplié par \verb|diampointsbatons|. \verb|diampointsbatons| est égal à 5 par défaut. On peut lui donner la valeur 0 pour ne pas avoir ces points.
+\end{description}
+
+\begin{exemple}[0.6]
+repere(-0.5,5,1cm,-0.5,5,1cm);
+ picture diag;
+ draw axes(1,1);
+ diag:=diagrammebatons((1,2),(2,4),(3,2),(4,1));
+ draw diag epaisseur 2 withcolor rouge;
+fin
+\end{exemple}
+
+
+\begin{description}
+\item[diagrammebarres((a1,h1),(a2,h2),...(an,hn))] Figure formée de \verb|n| barres rectangulaires de hauteurs \verb|h1| \dots \verb|hn| aux abscisses \verb|a1| \dots \verb|an|. La largeur de ces barres est le nombre \verb|largbarres| qui vaut \verb|20bp| par défaut.
+\end{description}
+
+\begin{exemple}[0.6]
+repere(-0.5,5,1cm,-0.5,5,1cm);
+ path diag;
+ draw axey(1,1);
+ diag:=diagrammebarres((1,2),(2,4),(3,2),(4,1));
+ fill diag withcolor cyan;
+ draw diag epaisseur 1 withcolor marine;
+ flecheaxe:=false;
+ draw axex(0,0);
+ boolgradxpart:=false;
+ draw axexpart.bot(1,"A",2,"B",3,"C",4,"D");
+fin
+\end{exemple}
+
+\subsection{Probabilités}
+
+Quelques fonctions mathématiques sont proposées. Pour les grandes valeurs, on dépasse rapidement les capacités de \MP. Il est dans ce cas conseillé de compiler en utilisant la ligne de commande \verb|mpost -numbersystem="decimal" <fichier>.mp|.
+
+
+\begin{description}
+\item[factorielle(n)] Entier égal à $n!$.
+\item[binom(n,k)] Entier égal à $\binom{n}{k}$.
+\item[binomiale(n,p,k)] $P(X=k)$ pour $X$ suivant la loi binomiale de paramètres $n$ et $p$.
+\item[diagrammebinomiale(n,p)] Diagramme en bâtons de la loi binomiale de paramètres $n$ et $p$.
+\item[diagrammeuniforme(n,m)] Diagramme en bâtons de la loi uniforme discrète sur les entiers consécutifs de \verb|n| à \verb|m|.
+\item[diagrammegeometrique(p)] Diagramme en bâtons de la loi géométrique de paramètre \verb|p|.
+\item[diagrammepoisson(lambda)] Diagramme en bâtons de la loi de Poisson de moyenne \verb|lambda|.
+\end{description}
+
+
+\begin{exemple}
+repere(-2,16,0.45cm,-0.1,0.25,15cm);
+setall(0,16,0,0.25);
+draw axex(1,1);
+draw axey(0.1,0.1);
+picture diag;
+diampointsbatons:=0;
+diag:=diagrammebinomiale(15,0.6);
+draw diag withcolor vertfonce epaisseur 4;
+fin;
+\end{exemple}
+
+\begin{codecache}
+diampointsbatons:=5;
+\end{codecache}
+
+\begin{exemple}
+repere.larg(-2,10,8cm,-0.1,0.5,6cm);
+ setall(0,10,0,0.5);
+ draw axex(1,1);
+ draw axey(0.05,0.05);
+ draw diagrammegeometrique(0.4)
+ epaisseur 2 couleur bleu;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-2,16,0.45cm,-0.1,0.25,15cm);
+setall(0,16,0,0.25);
+draw axex(1,1);
+draw axey(0.1,0.1);
+picture diag;
+diampointsbatons:=0;
+diag:=diagrammepoisson(6);
+draw diag withcolor orange epaisseur 4;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[densitenormale(mu,sigma,a,b)] Courbe représentant la densité de la loi normale de moyenne \verb|mu| et d'écart type \verb|sigma| entre \verb|a| et \verb|b|. Si \verb|a| et \verb|b| sont omis, le tracé est fait sur l'intervalle définissant le repère.
+\item[densiteexponentielle(lambda)] Courbe représentant la densité de la loi normale de paramètre \verb|lambda|.
+\end{description}
+
+\begin{codecache}
+prefnomme:="top";
+\end{codecache}
+
+\begin{exemple}[0.45]
+repere(-4,32,0.23cm,-0.01,0.12,46cm);
+ draw axex(2,2);
+ draw axey(0.02,0.02);
+ path C,d;
+ C=densitenormale(16,4);
+ fill souscourbe(C,0,14) couleur gris;
+ draw souscourbe(C,0,14);
+ draw C epaisseur 2 couleur rouge;
+ d=droite(16);
+ draw d dashed evenly;
+ drawarrow (5,0.06)--(11,0.02);
+ label.top("$P(X\leq 14)$",(5,0.06));
+ nomme(d,"$\mu$");
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere.larg(-1,9,8cm,-0.05,0.6,6cm);
+ setall(0,9,0,0.6);
+ draw axex(1,1);
+ draw axey(0.1,0.1);
+ path C,D;
+ C=densiteexponentielle(0.5);
+ D=densiteexponentielle(0.3);
+ draw C epaisseur 2 couleur rouge;
+ draw D epaisseur 2 couleur violet;
+fin;
+\end{exemple}
+
+
+\section{Géométrie}
+Certaines des macros suivantes sont largement inspirées des macros de \verb|geometriesyr16.mp| de Christophe \bsc{Poulain}.
+
+\subsection{Polygones}
+\begin{description}
+\item[polygone(A,B,C,...)] Chemin fermé représentant le polygone $ABC...$
+
+\item[triangle(A,B,C)] Cas particulier du précédent. Chemin fermé représentant le triangle $ABC$.
+
+\item[parallélogramme(A,B,C)] Chemin fermé représentant $ABCD$ où $D$ est le quatrième point du parallélogramme.
+
+\item[polygoneregulier(A,B,n)] Chemin fermé représentant le polygone régulier de sens direct à $n$ côtés dont un des côtés est $[AB]$.
+
+\item[equilateral(A,B)] Cas particulier du précédent. Triangle équilatéral de sens direct de côté $[AB]$.
+
+\item[carre(A,B)] Autre cas particulier. Carré de sens direct de côté $[AB]$.
+
+\item[sommetpolygoneregulier(A,B,n,i)] Sommet numéro $i$ du polygone régulier à $n$ côtés dont un des côtés est $[AB]$. $A$ est le sommet numéro 1 et $B$ est le sommet numéro 2.
+\end{description}
+
+\begin{exemple}[0.51]
+repere(-1,5,1cm,-1,4,1cm);
+draw axes(1,1);
+pair A,B,C,D,E,F,G;
+A=(0,1);B=(2,0);C=(4,2);D=(3,3);E=(1,3);
+F=(4,0);G=(3,2);
+fill triangle(A,F,G) withcolor orange;
+draw triangle(A,F,G);
+draw polygone(A,B,C,D,E);
+draw parallelogramme(D,G,E) withcolor vert;
+fin;
+\end{exemple}
+
+
+\begin{exemple}[0.53]
+repere(-1,5,1cm,-1,4,1cm);
+draw axes(1,1);
+pair A,B,M;
+A=(1,1);B=(3,0.5);
+fill polygoneregulier(A,B,5) withcolor bleu;
+fill equilateral(A,B) withcolor cyan;
+draw polygoneregulier(A,B,5);
+M=sommetpolygoneregulier(A,B,5,3);
+nomme.rt(M);
+draw equilateral(A,B);
+fin;
+\end{exemple}
+
+\subsection{Cercles et arcs}
+
+\begin{description}
+\item[cercle(A,B,C)] Cercle circonscrit au triangle $ABC$.
+\item[cercle(O,A)] Cercle de centre $O$ passant par $A$.
+\item[cercle(O,r)] Cercle de centre $O$ et de rayon $r$. L'unité de longueur est l'unité de l'axe des abscisses.
+\item[arccercle(A,O,B)] Arc de cercle de sens direct de centre $O$, passant par $A$ et s'appuyant sur la demi-droite $[OB)$.
+\end{description}
+
+
+\begin{exemple}
+repere(-1,5,1cm,-0.5,4,1cm);
+draw axes(1,1);
+pair A,B,C;
+A=(1,1);B=(2,0);C=(3.5,2);
+nomme.lft(A);nomme.urt(C);nomme.top(B);
+draw triangle(A,B,C) withcolor bleu;
+draw cercle(A,B,C) withcolor marine;
+draw A--B withcolor rouge epaisseur 1;
+draw cercle(A,B) withcolor rouge;
+fin;
+\end{exemple}
+
+
+\begin{exemple}
+repere(-1,5,1cm,-2,8,0.5cm);
+draw axes(1,1);
+pair A,M,B;
+A=(2,2);M=(2,6);B=(3,2);
+nomme.bot(A);nomme.rt(B);nomme.top(M);
+draw B--A--M;
+draw cercle(A,2);
+draw arccercle(B,A,M);
+fin;
+\end{exemple}
+
+
+
+\subsection{Codage des segments et des angles}
+
+\begin{description}
+\item[taille\_marque\_a] Valeur numérique (qui vaut par défaut \verb|0.4cm|) donnant le rayon des arcs de cercles servant à marquer les angles.
+
+\item[sep\_marque\_a] Valeur numérique (qui vaut par défaut \verb|1.5bp|) donnant la différence de rayon entre les différents arcs servant à marquer les angles.
+
+\item[marqueangle(A,O,B,n)] Figure formée de \verb|n| arcs de cercle de centre $O$ et de rayon moyen \verb|taille_marque_a| permettant de marquer l'angle géométrique $\widehat{AOB}$. Les arcs (si \verb|n| est supérieur à 1) sont séparés de \verb|sep_marque_a|.
+
+Il s'agit d'un chemin fermé qui peut donc être rempli.
+
+\item[marqueangle(A,O,B)] Arc de cercle de centre \verb|O| et de rayon \verb|taille_marque_a| permettant de marquer l'angle orienté avec \verb|drawarrow|.
+
+\item[nomme.pos(A,O,B,texte)] Place le texte à la position \verb|pos| par rapport au point central de l'arc de cercle de centre $O$ et de rayon \verb|taille_marque_a|. \verb|pos| peut être \verb|rt|, \verb|urt|, \verb|top|, etc. ou un angle donné par rapport à la direction $(Ox)$.
+
+\item[nomme(A,O,B,texte)] Même chose que précédemment mais la position est calculée automatiquement en fonction de l'angle.
+\end{description}
+
+
+\begin{exemple}
+repere(-2,12,0.4cm,-2,10,0.4cm);
+pair A,B,C;
+A=(1,2);B=(11,2);C=(8,9);
+draw axes(0,0);
+draw triangle(A,B,C);
+nomme.llft(A);nomme.lrt(B);nomme.top(C);
+fill marqueangle(C,B,A,3) withcolor red;
+draw marqueangle(C,B,A,3);
+drawarrow marqueangle(A,C,B);
+fill marqueangle(B,A,C,1) withcolor vert;
+draw marqueangle(B,A,C,1);
+nomme[20](B,A,C,"\ang{45}");
+nomme(C,B,A,"$\alpha$");
+fin;
+\end{exemple}
+
+\begin{description}
+\item[marqueangledroit(A,O,B)] Chemin fermé permettant de marquer l'angle droit $\widehat{AOB}$ sous forme d'un losange (il s'agit donc d'un carré si l'angle est réellement droit). Le côté du losange est \verb|taille_marque_ad| et vaut \verb|0.3cm| par défaut.
+\item[marquesegment(A,B,n)] Figure formées de \verb|n| marques sur le segment $[AB]$. Ces marques ont une taille de \verb|taille_marque_s| (\verb|0.3cm| par défaut), forment un angle en degrés de \verb|angle_marque_s| avec le segment (\verb|60| par défaut) et sont séparées de \verb|sep_marque_s| (\verb|2| par défaut).
+\end{description}
+
+\begin{exemple}[0.6]
+repere(-1,10,0.5cm,-1,9,0.5cm);
+pair A,B,C,A',B',C',u;
+A=(3,1);B=(5,2);C=(1,5);u=(3,3);
+A'-A=B'-B=C'-C=u;
+draw projectionaxes(A,"$x_A$","$y_A$") dashed evenly;
+draw axes(0,0);
+drawoptions(withcolor pourpre);
+draw triangle(A,B,C);draw triangle(A',B',C');
+draw marqueangledroit(B,A,C);
+draw marqueangledroit(B',A',C');
+draw marquesegment(B,C,2);
+draw marquesegment(B',C',2);
+nomme.llft(A);nomme.lrt(B);nomme.ulft(C);
+nomme.llft(A');nomme.lrt(B');nomme.ulft(C');
+drawoptions(withcolor vertfonce);
+draw vecteur.lrt(B,u);draw vecteur.lrt(C,u);
+fin;
+\end{exemple}
+
+\section{Divers}
+\subsection{Composition des étiquettes}
+Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous.
+\begin{description}
+ \item[LaTeX(ch)] \label{latex} Figure formée de la chaîne \verb+ch+ composée avec \LaTeX{} et mise à l'échelle \verb|defaultscale|. Cette macro utilise la commande \verb|textext| de \verb|luamplib| dans le cas de l'utilsation de Lua\LaTeX{} et \verb|textext| de \verb|latexmp| dans le cas d'une compilation \MP{} \og standard \fg. Ce dernier cas nécessite alors deux compilations.
+\end{description}
+
+
+\begin{exemple}[0.65]
+repere(-1,7,1cm,-1,1,1cm);
+for i=2 upto 6:
+label(LaTeX("$\frac{1}{"&decimal(i)&"}$"),(i,0));
+endfor
+fin;
+\end{exemple}
+
+\begin{description}
+\item[label.pos(fig,point)] Commande de \MP{} qui permet de placer la figure \verb|fig| au niveau du point \verb|point|.
+\end{description}
+
+\begin{exemple}[0.55]
+repere(-1,5,1cm,-1,4,1cm);
+draw axes(1,1);
+label.ulft("Abscisses",(5,0.1));
+label.lrt("Ordonnées",(0.1,4));
+label("$f(x)=\pi^2\sqrt{x}$",(2,2));
+fin;
+\end{exemple}
+
+\begin{description}
+\item[legende.pos(fig,p)] Figure formée du chemin \verb|p| dessiné avec une flèche et de la figure ou de la chaine \verb|fig| située à la position \verb|pos| par rapport au premier point du chemin.
+\end{description}
+
+\begin{exemple}[0.6]
+repere(-0.5,5,1cm,-0.5,4,1cm);
+ draw axes(1,1);
+ pair A,B;
+ A=(2,1);B=(2,2);
+ nomme.rt(A) couleur rouge;
+ nomme.top(B) couleur rouge;
+ legende.top("Le point $A$",(1,3){down}..{down}A);
+ legende.bot("Le point $B$",(4,1)--B);
+fin;
+\end{exemple}
+
+\subsection{Couleurs}
+Certaines couleurs sont définies par leur nom et peuvent être utilisées directement :
+
+\begin{center}
+\begin{figreperedoc}
+repere(0,18,1cm,-3,1,1cm);
+ path rectangle;
+ save a,b,dech,decv;
+ a:=25;b:=12;dech:=70;decv:=-20;
+ rectangle = ((0,0)--(a,0)--(a,b)--(0,b)--cycle) transformed inverse _T;
+ vardef couleur(expr t)=
+ image(%
+ fill rectangle withcolor scantokens(t);
+ label.rt(LaTeX("\smash{" & t & "}"),(a,b/4) transformed inverse _T)
+ )
+ enddef;
+ draw couleur("rouge");
+ draw couleur("vert") shifted (dech,0);
+ draw couleur("bleu") shifted (2*dech,0);
+ draw couleur("cyan") shifted (3*dech,0);
+ draw couleur("magenta") shifted (4*dech,0);
+ draw couleur("jaune") shifted (5*dech,0);
+ draw couleur("noir") shifted (6*dech,0);
+ draw couleur("marron") shifted (0,decv);
+ draw couleur("lime") shifted (dech,decv);
+ draw couleur("orange") shifted (2*dech,decv);
+ draw couleur("rose") shifted (3*dech,decv);
+ draw couleur("pourpre") shifted (4*dech,decv);
+ draw couleur("olive") shifted (5*dech,decv);
+ draw couleur("violet") shifted (6*dech,decv);
+ draw couleur("beige") shifted (0,2decv);
+ draw couleur("marine") shifted (dech,2decv);
+ draw couleur("moutarde") shifted (2*dech,2decv);
+ draw couleur("grisclair") shifted (3*dech,2decv);
+ draw couleur("gris") shifted (4*dech,2decv);
+ draw couleur("grisfonce") shifted (5*dech,2decv);
+ draw couleur("vertfonce") shifted (6*dech,2decv);
+fin;
+\end{figreperedoc}
+\end{center}
+
+Toutes ces couleurs sont définies selon le modèle \og rgb \fg. Pour les obtenir selon le modèle \og cmyk \fg, remplacer la première lettre par une majuscule.
+
+
+\subsection{Remplissage}
+Pour remplir des chemins fermés avec autre chose que de la couleur, \verb+repere+ permet l'utilisation de la syntaxe \verb+fill p avec motif+ où \verb+motif+ est un des motifs décrits ci-dessous. Cette instruction peut être complétée par des options de dessin (\verb+withpen+, \verb+withcolor+...).
+
+\begin{description}
+\item[hachures(pas,angle)] hachures espacées de \verb+pas+ et formant un angle en degrés de \verb+angle+ avec l'horizontale. Si les valeurs sont omises, \verb|pas| vaut 5 et \verb+angle+ vaut 60.
+
+
+\item[briques(larg,haut,dec)] briques de largeur \verb+larg+, de hauteur \verb+haut+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|larg| vaut 12, \verb|haut| vaut 6 et \verb+dec+ vaut 6.
+
+
+\item[vagues(per,amp,dec)] (d'après le manuel de l'utilisateur) \og vagues \fg{} de période \verb+per+, d'amplitude \verb+amp+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|per| vaut 20, \verb|amp| vaut 3 et \verb+dec+ vaut 10.
+\end{description}
+
+
+
+\begin{exemple}[0.55]
+repere(-1.5,4.5,1cm,-1.5,7.5,1cm);
+path c[];picture lab;
+c1=fullcircle scaled 2.5;
+for k=1 upto 6:
+ i:=(k-1) mod 2;j:=(k-1) div 2;
+ c[k]:=c1 shifted (3*i,3*j);
+endfor;
+fill c1 withcolor lime;
+fill c1 avec hachures(10,30) dashed evenly;
+fill c2 withcolor lime;
+fill c2 avec hachures();
+fill c3 withcolor (0,0.65,0.8,0.48);
+fill c3 avec briques(15,5,4);
+fill c4 withcolor (0,0.65,0.8,0.48);
+fill c4 avec briques();
+fill c5 withcolor (1,0,0,0.2);
+fill c5 avec vagues(30,10,20)
+ withpen pencircle scaled 2;
+fill c6 withcolor (1,0,0,0.2);
+fill c6 avec vagues();
+for k=1 upto 6:
+ i:=(k-1) mod 2;j:=(k-1) div 2;
+ draw c[k];
+ lab:=thelabel("c"&decimal(k),3*(i,j));
+ unfill bbox lab;draw lab;
+endfor;
+fin;
+\end{exemple}
+
+
+
+\subsection{Figures pour une présentation}
+\begin{description}
+\item[figureinter] exporte la figure telle qu'elle est au moment où cette commande apparait. La numérotation est incrémentée et la figure peut continuer.
+\end{description}
+ L'exemple ci-dessous crée trois figures :
+
+ \begin{exemplefiginter}[0.7]{3}
+ repere(-3,3,0.7cm,-1,5,0.7cm);
+ path C_f;
+ vardef f(expr x)=x**2 enddef;
+ C_f= courbefonc(f)();
+ draw quadrillage(1,1);
+ draw axes(1,1);
+ draw cadre;
+ figureinter;
+ draw courbepoints(f)(-2,2,9) withcolor rouge;
+ figureinter;
+ draw C_f withcolor bleu withpen pencircle scaled 1;
+ fin;
+ \end{exemplefiginter}
+
+
+Si ces trois figures s'appellent \verb|mafigure.1|, \verb|mafigure.2| et \verb|mafigure.3|, elles peuvent être incluses dans un document de la classe \verb|beamer| avec le code ci-dessous :
+
+\begin{center}
+\begin{minipage}{0.6\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{beamer}
+ \ifpdf % Pour utiliser pdflatex
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+\begin{document}
+\begin{frame}
+\includegraphics<+>{mafigure.1}%
+\includegraphics<+>{mafigure.2}%
+\includegraphics<+>{mafigure.3}%
+\end{frame}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\end{center}
+
+
+
+
+\subsection{Code embarqué dans un document \LaTeX}
+
+Certains packages permettent d'écrire du code \MP{} directement dans un document \LaTeX. \verb|repere| est compatible avec, entre autres, \verb|emp| et \verb|mpgraphics|.
+
+\medskip
+
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Utilisation du package \texttt{emp}}\par}
+
+
+
+\verb|pdflatex monfichier.tex|
+
+\verb|mpost monfichier.mp|
+
+\verb|mpost monfichier.mp|
+
+\verb|pdflatex monfichier.tex|
+
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{emp}
+\usepackage{ifpdf}
+ \ifpdf % Pour utiliser pdflatex
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+\begin{document}
+\begin{empfile}
+\begin{empcmds}
+ input repere;
+\end{empcmds}
+\begin{emp}(0,0)
+ repere(-3,3,1cm,-2,2,1cm);
+ draw axes(1,1);
+ fin;
+\end{emp}
+\end{empfile}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Utilisation du package \texttt{mpgraphics}}\par}
+
+
+\verb|pdflatex -shell-escape monfichier.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage[runs=2]{mpgraphics}
+\begin{document}
+\begin{mpdefs}
+ input repere;
+\end{mpdefs}
+\begin{mpdisplay}
+ repere(-3,3,1cm,-2,2,1cm);
+ draw axes(1,1);
+ fin;
+\end{mpdisplay}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+
+
+Il est aussi possible d'utiliser Lua\LaTeX{} avex le package \verb|luamplib|. Il faut alors charger les packages \verb|siunitx| et \verb|esvect| utilisés par \verb|repere|.
+
+\begin{center}
+\begin{minipage}[t]{0.5\linewidth}
+{\centering \textbf{Utilisation de Lua\LaTeX}\par}
+
+
+\verb|lualatex monfichier.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{fontspec}
+\usepackage{siunitx}
+\usepackage{esvect}
+\usepackage{luamplib}
+\mplibnumbersystem{double} % Si nécessaire
+\begin{document}
+\everymplib{input repere;}
+\begin{mplibcode}
+ repere(-3,3,1cm,-2,2,1cm);
+ draw axes(1,1);
+fin;
+\end{mplibcode}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\end{center}
+
+\section{Dessin à main levée avec \texttt{geometriesyr}}
+
+\label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser le \og dessin à main levée \fg{} de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere| et utiliser les fonctions de dessin telles que \verb|cercles|, \verb|triangle|...
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+pair A,B,C,D;
+A=(0.5,0.5);B=(4,1);C=(3,4);
+typetrace:="mainlevee";
+draw axes(1,1);
+drawoptions(withcolor violet);
+draw triangle(A,B,C);
+nomme.llft(A);nomme.lrt(B);
+nomme.top(C);
+draw marqueangle(B,A,C,1);
+drawoptions(withcolor vertfonce);
+draw cercles(CentreCercleC(A,B,C),A);
+fin;
+\end{exemple}
+
+
+
+\begin{codecache}
+end
+\end{codecache}
+
+\makeatletter
+\immediate\closeout\verbatim@out
+\makeatother
+\end{document}
+
+
+\vspace{2em}
+
+
+\begin{exemplev}[1]{2}
+repere(-9.5,6,1cm,-1.25,1.25,2cm);
+%cercle
+pair O,A,A',B,B',M,S,C;
+numeric x;x=pi/4;
+O=_c(-7,0);A=_c(-5,0);
+B=_c(-7,1);A+A'=B+B'=2O;
+M=rotation(A,O,180*x/pi);
+C=projection(M,A,A');
+S=projection(M,B,B');
+draw cerclepoint(O,A);
+drawarrow A'--A;drawarrow B'--B;
+nomme.rt(A);nomme.top(B);nomme.llft(O);
+drawoptions(withcolor rouge);
+draw O--M;draw C--M--S dashed evenly;
+draw codeperp(M,C,O,5);
+draw codeperp(O,S,M,5);
+draw codeangle.urt(A,O,M,0,
+ LaTeX("$x$"));
+marque_p:="";
+nomme.urt(M);
+label.lft(LaTeX("$\sin x$"),S);
+%repere
+settout(-4.5,6,-1.25,1.25);
+path C_f;
+C_f=courbefonc(sin,-4.5,6,80);
+pair m;m=_c(x,sin(x));
+drawoptions();
+draw axexpi.bot(1,2);
+draw axey(0.5,1);
+drawoptions(withcolor bleu);
+draw C_f withpen pencircle scaled 1.5;
+nomme.urt(C_f,2.5,LaTeX("$y=\sin x$"));
+drawoptions(withcolor rouge);
+draw projectionx.bot(m,LaTeX("$x$"))
+ dashed evenly;
+%
+draw M--m dashed evenly;
+fin;
+\end{exemplev}
+
+\vspace{3em}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+coulpoint:=blue;coullabel:=blue;
+pair A,B,C,D;
+A=_c(0.5,0.5);B=_c(4,1);C=_c(3,4);
+typetrace:="mainlevee";
+draw axes(1,1);
+drawoptions(withcolor violet);
+draw triangle(A,B,C);
+nomme.llft(A);nomme.lrt(B);
+nomme.top(C);
+draw marqueangle(B,A,C,0);
+drawoptions(withcolor vertfonce);
+draw cercles(CentreCercleC(A,B,C),A);
+fin;
+\end{exemple}
+
+
+
+
+
+\begin{codecache}
+end
+\end{codecache}
+
+\makeatletter
+\immediate\closeout\verbatim@out
+\makeatother
+\end{document}
+
+
diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp
new file mode 100644
index 0000000000..02595f91aa
--- /dev/null
+++ b/graphics/metapost/contrib/macros/repere/repere.mp
@@ -0,0 +1,2919 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% repere.mp %%
+%% Macros pour la construction de figures dans un repère %%
+%% o.peault@posteo.net %%
+%% Version 19.06 (Juin 2019) %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Mars 2019 : changement spline
+% Juin 2019 : demi-droites, nomme[<angle>]
+% À faire : extratextx, extratexty
+
+input format;
+if not known mplib: input latexmp fi;
+
+warningcheck:=0;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% REPERE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+numeric _nfig,_nbaxes,theta,taillegrad,taillepoint,taillecroix,facteurx,facteury;
+boolean flecheaxe,displayfrac,coupe,boolgradxpart,boolgradypart;
+_nfig:=1;
+path cadre;
+numeric _diag,_largcadre,_hautcadre,_tfig;
+pair _O,_I,_J,_O_;
+transform _T;
+picture _axorlab; pair poslabO;
+
+string marque_p,fraction;
+
+facteury:=1;
+
+boolean rep_groupe;
+rep_groupe:=false;
+
+%%%%%%%%%%% Sauvegarde macros plain
+
+let oldbeginfig=beginfig;
+let oldendfig=endfig;
+
+let olddraw = draw;
+let olddrawarrow = drawarrow;
+let olddrawdblarrow = drawdblarrow;
+let oldfill = fill;
+vardef theoldlabel@#(expr s,z) = % Position s near z
+ save p; picture p;
+ if picture s: p=s
+ else: p = s infont defaultfont scaled defaultscale
+ fi;
+ p shifted (z + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p
+ )
+ )
+enddef;
+vardef oldbbox primary p =
+ llcorner p-(bboxmargin,bboxmargin) -- lrcorner p+(bboxmargin,-bboxmargin)
+ -- urcorner p+(bboxmargin,bboxmargin) -- ulcorner p+(-bboxmargin,bboxmargin)
+ -- cycle
+enddef;
+
+
+%%%%%%% Redéfinition beginfig
+
+def beginfig(expr c)=
+ oldbeginfig(c);
+ _nfig:=c;
+ rep_groupe:=true
+enddef;
+
+def endfig=
+ oldendfig;
+ _nfig:=_nfig+1;
+ rep_groupe:=false
+enddef;
+
+
+%%%%%%%%%% Définition du repère
+
+vardef repere@#(text t)=
+ if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"):
+ definitionrepere@#(t)
+ else:
+ reperenum@#(t)
+ fi
+enddef;
+
+
+vardef reperenum[]@#(text t)=
+ _nfig:=@;
+ definitionrepere@#(t)
+enddef;
+
+boolean bf;
+bf:=false;
+
+vardef definitionrepere@#(text t) =
+ save i,_def;
+ if not rep_groupe: oldbeginfig(_nfig);bf:=true fi;
+ numeric _def[],i,unitex,unitey,unite;
+ numeric Xmin,Xmax,Ymin,Ymax,XmiN,XmaX,YmiN,YmaX;
+ _def[7]:=90;i:=1;
+ for _i=t: _def[i]:=_i; i:=i+1; endfor;
+ Xmin:=_def1; Xmax:=_def2; Ymin:=_def4; Ymax:=_def5; theta:=_def7;
+ if str @#="larg": _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta))
+ elseif str @#="orth": _def3:=_def3/(Xmax-Xmin); _def6:=_def3;theta:=90
+ elseif str @#="prop": _def3:=_def3/(Xmax-Xmin); _def6:=_def6*_def3;theta:=90
+ fi;
+ Ux:=_def3;Uy:=_def6;
+ _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta);
+ _defcadre;
+ settout(Xmin,Xmax,Ymin,Ymax);
+ _O:=_cart(0,0); xO:=0 ; yO:=0;_O_:=(0,0);
+ _I:=_cart(1,0); _J:=_cart(0,1);
+ taillegrad:=0.8mm;taillepoint:=3;taillecroix:=1mm;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0);
+ marque_p := "plein";displayfrac:=false;flecheaxe:=true;coupe:=true;
+ boolgradxpart:=true;boolgradypart:=true;
+ defaultscale:=1;
+ unitex:=abs(_I);unitey:=abs(_J);unite:=unitex;
+ facteurx:=1;facteury:=1;
+ string extranumx,extranumy;
+ extranumx=extranumy="";
+ init_traces;
+enddef;
+
+%%%% Initialisations tracés (redéfinition draw etc.)
+def init_traces =
+ %% draw
+ def draw expr p =
+ addto currentpicture
+ if picture p:
+ also p
+ else:
+ doublepath p transformed _T withpen currentpen
+ fi
+ _op_
+ enddef;
+ %% fill
+ def fill expr c =
+ if path c:
+ addto currentpicture contour (c transformed _T) _op_
+ else:
+ olddraw c
+ fi
+ enddef;
+ %% thelabel
+ vardef thelabel@#(expr s,z) = % Position s near z
+ save p; picture p;
+ if picture s: p=s
+% else: p = s infont defaultfont scaled defaultscale
+ else: p = LaTeX(s)
+ fi;
+ p shifted (_cart(z) + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p
+ )
+ )
+ enddef;
+ %% drawarrow
+ def drawarrow expr p = _apth:=p transformed _T; _finarr enddef;
+ def drawdblarrow expr p = _apth:=p transformed _T; _findarr enddef;
+ %% bbox
+ vardef bbox primary p =
+ if picture p: oldbbox p transformed inverse _T
+ else: oldbbox p
+ fi
+ enddef;
+enddef;
+
+def traces_orig =
+ def fill expr c = addto currentpicture contour c _op_ enddef;
+ def draw expr p =
+ addto currentpicture
+ if picture p:
+ also p
+ else:
+ doublepath p withpen currentpen
+ fi
+ _op_
+ enddef;
+ vardef thelabel@#(expr s,z) = % Position s near z
+ save p; picture p;
+ if picture s: p=s
+ else: p = s infont defaultfont scaled defaultscale
+ fi;
+ p shifted (z + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p
+ )
+ )
+ enddef;
+ vardef bbox primary p =
+ llcorner p-(bboxmargin,bboxmargin) -- lrcorner p+(bboxmargin,-bboxmargin)
+ -- urcorner p+(bboxmargin,bboxmargin) -- ulcorner p+(-bboxmargin,bboxmargin)-- cycle
+ enddef;
+ def drawarrow expr p = _apth:=p; _finarr enddef;
+ def drawdblarrow expr p = _apth:=p; _findarr enddef;
+
+enddef;
+
+def _finarr text t =
+ olddraw _apth t;
+ filldraw arrowhead _apth t
+enddef;
+
+def _findarr text t =
+ olddraw _apth t;
+ filldraw arrowhead _apth withpen currentpen t;
+ filldraw arrowhead reverse _apth withpen currentpen t
+enddef;
+
+vardef arrowhead expr p = %redéfinition flèches
+ save q,e; path q; pair e;
+ e = point length p of p;
+ q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength))
+ cuttings;
+ (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e
+enddef;
+
+def setaxes(expr a,b,c,d)=
+ AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d
+enddef;
+
+def setgrad(expr a,b,c,d)=
+ GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d
+enddef;
+
+def setval(expr a,b,c,d)=
+ ValXmin:=a;ValXmax:=b;ValYmin:=c;ValYmax:=d
+enddef;
+
+def setquad(expr a,b,c,d)=
+ QuadXmin:=a;QuadXmax:=b;QuadYmin:=c;QuadYmax:=d
+enddef;
+
+def settout(expr a,b,c,d)=
+ setaxes(a,b,c,d);
+ setgrad(a,b,c,d);
+ setval(a,b,c,d);
+ setquad(a,b,c,d);
+enddef;
+
+let setall=settout;
+
+def fin =
+ if _nbaxes=1: olddraw _axorlab fi;
+ if coupe: clip currentpicture to (cadre transformed _T) fi;
+ if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi;
+ traces_orig;
+enddef;
+
+def _defcadre=
+ cadre:=(Xmin,Ymin)--(Xmin,Ymax)--(Xmax,Ymax)--(Xmax,Ymin)--cycle;
+ XmiN:=Xmin-0.05(Xmax-Xmin);XmaX:=Xmax+0.05(Xmax-Xmin);
+ YmiN:=Ymin-0.05(Ymax-Ymin);YmaX:=Ymax+0.05(Ymax-Ymin);
+ _diag:=abs(llcorner cadre - urcorner cadre);
+ _diag_:=abs(llcorner _cart(cadre) - urcorner _cart(cadre));
+ _largcadre:=abs(llcorner cadre - lrcorner cadre);
+ _largcadre_:=abs(llcorner _cart(cadre) - lrcorner _cart(cadre));
+ _hautcadre:=abs(llcorner cadre - ulcorner cadre);
+ _hautcadre_:=abs(llcorner _cart(cadre) - ulcorner _cart(cadre));
+ _tfig:=max(_largcadre,_hautcadre); % compatibilité geometriesyr
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% ORIGINE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def interaxes(expr a,b) =
+ _O:=_cart(a,b);_O_:=(a,b);
+ xO:=a;
+ yO:=b;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% AXES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pair _posgradx, _posgradx.lft, _posgradx.rt, _posgradx.ulft, _posgradx.top, _posgradx.urt, _posgradx.llft, _posgradx.bot, _posgradx.lrt;
+_posgradx=_posgradx.bot=_posgradx.lft=_posgradx.rt=-_posgradx.top=(0,-1);
+-_posgradx.llft=_posgradx.urt=(0.5,0.5);_posgradx.lrt=-_posgradx.ulft=(0.5,-0.5);
+
+
+pair _posgrady, _posgrady.lft, _posgrady.rt, _posgrady.ulft, _posgrady.top, _posgrady.urt, _posgrady.llft, _posgrady.bot, _posgrady.lrt;
+_posgrady=_posgrady.bot=_posgrady.lft=_posgrady.top=-_posgrady.rt=(-1,0);
+-_posgrady.llft=_posgrady.urt=(0.5,0.5);_posgrady.lrt=-_posgrady.ulft=(0.5,-0.5);
+
+vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses
+ save pic;
+ picture pic;
+ if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$")
+ elseif string st: pic:=LaTeX(st)
+ else: pic:=st fi;
+ theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#))
+enddef;
+
+vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées
+ save pic;
+ picture pic;
+ if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$")
+ elseif string st: pic:=LaTeX(st)
+ else: pic:=st fi;
+ theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#))
+enddef;
+
+
+vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses
+ ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO)
+enddef;
+
+
+vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées
+ ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y)
+enddef;
+
+vardef etiquettex@#(expr x)=
+ _etiqx_@#(x,taillegrad,x*facteurx)
+enddef;
+
+
+vardef etiquettey@#(expr y)=
+ _etiqy_@#(y,taillegrad,y*facteury)
+enddef;
+
+
+vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef;
+
+vardef dessinaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef;
+
+
+vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses
+ save $;picture $;
+ $=image(%
+ imax:=floor((GradXmax-xO)/grad);imin:=ceiling((GradXmin-xO)/grad);
+ for i=imin upto imax-1:
+ olddraw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp;
+ endfor
+ % dernière graduation
+ if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: olddraw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi);
+ $
+enddef;
+
+vardef graduationsaxey(expr grad)= %%%% ensemble des graduations ordonnées
+ save $;picture $;
+ $=image(%
+ imax:=floor((GradYmax-yO)/grad);imin:=ceiling((GradYmin-yO)/grad);
+ for i=imin upto imax-1:
+ olddraw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp;
+ endfor;
+ % dernière graduation
+ if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: olddraw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi);
+ $
+enddef;
+
+
+vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses
+ save $,imin,imax,labmin,labmax;
+ picture $,labmin,labmax;
+ numeric imin,imax;
+ $=image(%
+ imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettex.@#(arrondimil(imin*val)+xO)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettex.@#(arrondimil(imax*val)+xO)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: olddraw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ olddraw etiquettex.@#(arrondimil(i*val)+xO)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi;
+ );
+ $
+enddef;
+
+vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées
+ save $,imin,imax,labmin,labmax;
+ picture $,labmin,labmax;
+ numeric imin,imax;
+ $=image(%
+ imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettey.@#(arrondimil(imin*val)+yO)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettey.@#(arrondimil(imax*val)+yO)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): olddraw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ olddraw etiquettey.@#(arrondimil(i*val)+yO)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi
+ );
+ $
+enddef;
+
+vardef _axex_@#(expr grad,val,nn)=
+ save $;
+ picture $;
+ $=image(
+ % axe
+ if flecheaxe: olddrawarrow else: olddraw fi dessinaxex;
+ % graduations
+ if grad>0: olddraw graduationsaxex(grad) fi;
+ % étiquettes
+ if val>0:
+ if nn=1:
+ if str @#<>"":
+ olddraw etiquettesaxex@#(val);
+ _axorlab:=etiquettex@#(xO)
+ else:
+ olddraw etiquettesaxex.bot(val);
+ _axorlab:=etiquettex.bot(xO)
+ fi;
+ poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
+ if xO<>yO:
+ olddraw _axorlab
+ elseif _nbaxes=2:
+ olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ olddraw etiquettesaxex@#(val);
+ olddraw etiquettex@#(xO)
+ else:
+ olddraw etiquettesaxex.bot(val);
+ olddraw etiquettex.bot(xO)
+ fi
+ else:
+ if str @#<>"":
+ olddraw etiquettesaxex@#(val)
+ else:
+ olddraw etiquettesaxex.bot(val)
+ fi
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef _axey_@#(expr grad,val,nn)=
+ save $;
+ picture $;
+ $=image(
+ % axe
+ if flecheaxe: olddrawarrow else: olddraw fi dessinaxey;
+ % graduations
+ if grad>0: olddraw graduationsaxey(grad) fi;
+ % étiquettes
+ if val>0:
+ if nn=1:
+ if str @#<>"":
+ olddraw etiquettesaxey@#(val);
+ _axorlab:=etiquettey@#(yO)
+ else:
+ olddraw etiquettesaxey.lft(val);
+ _axorlab:=etiquettey.lft(yO)
+ fi;
+ poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
+ if xO<>yO:
+ olddraw _axorlab
+ elseif _nbaxes=2:
+ olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ olddraw etiquettesaxey@#(val);
+ olddraw etiquettey@#(yO)
+ else:
+ olddraw etiquettesaxey.lft(val);
+ olddraw etiquettey.lft(yO)
+ fi
+ else:
+ if str @#<>"":
+ olddraw etiquettesaxey@#(val)
+ else:
+ olddraw etiquettesaxey.lft(val)
+ fi
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef axex@# (expr grad,val)= %%%%%%axe des abscisses avec gestion graduation origine
+ _nbaxes:=_nbaxes+1;
+ _axex_@#(grad,val,1)
+enddef;
+
+vardef axey@# (expr grad,val)= %%%%%%axe des ordonnées avec gestion graduation origine
+ _nbaxes:=_nbaxes+1;
+ _axey_@#(grad,val,1)
+enddef;
+
+vardef axexo@#(expr grad,val)= %%%%%%axe des abscisses avec graduation origine
+ _axex_@#(grad,val,2)
+enddef;
+
+vardef axeyo@#(expr grad,val)= %%%%%%axe des ordonnées avec graduation origine
+ _axey_@#(grad,val,2)
+enddef;
+
+vardef axexn@#(expr grad,val)= %%%%%%axe des abscisses sans graduation origine
+ _axex_@#(grad,val,3)
+enddef;
+
+vardef axeyn@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine
+ _axey_@#(grad,val,3)
+enddef;
+
+vardef axes@# (expr grad,val)= %%%% les deux axes
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axex.top(grad,val) else: draw axex.bot(grad,val) fi;
+ if posy>0: draw axey.rt(grad,val) else: draw axey.lft(grad,val) fi
+ );
+ $
+enddef;
+
+vardef axeso@# (expr grad,val)= %%%% les deux axes avec origine
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexo.top(grad,val) else: draw axexo.bot(grad,val) fi;
+ if posy>0: draw axeyo.rt(grad,val) else: draw axeyo.lft(grad,val) fi
+ );
+ $
+enddef;
+
+vardef axesn@# (expr grad,val)= %%%% les deux axes sans origine
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexn.top(grad,val) else: draw axexn.bot(grad,val) fi;
+ if posy>0: draw axeyn.rt(grad,val) else: draw axeyn.lft(grad,val) fi
+ );
+ $
+enddef;
+
+% axes gradués avec multiples de pi
+
+vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d
+ save nn,dd,s,fr,$,fraction;
+ string s,fr,fraction;
+ picture $;
+ numeric nn,dd;
+ nn:=abs((n)/pgcd(n,d));dd:=d/pgcd(n,d);
+ if displayfrac:
+ fraction:="d"
+ else: fraction:=""
+ fi;
+ if dd=1:
+ if nn=1:
+ fr:=tt
+ else: fr:=decimal nn & tt
+ fi
+ else:
+ if nn=1:
+ fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}"
+ else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}"
+ fi
+ fi;
+ if n<0:
+ s:="-"
+ else: s:="";
+ if n=0:
+ fr:= "0"
+ fi
+ fi;
+ $=LaTeX("$" & s & fr & "$");
+ $
+enddef;
+
+vardef fracmultpi(expr n,d)=
+ fracmulttext(n,d,"\pi")
+enddef;
+
+
+vardef etiquettexpi@#(expr n,d)=
+ _etiqx_@#(n*pi/d,taillegrad,fracmultpi(n,d))
+enddef;
+
+vardef etiquetteypi@#(expr n,d)=
+ _etiqy_@#(n*pi/d,taillegrad,fracmultpi(n,d))
+enddef;
+
+
+vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi abscisses
+ save $,imin,imax,labmin,labmax,val;
+ picture $,labmin,labmax;
+ numeric imin,imax,val;
+ val:=n*pi/d;
+ $=image(%
+ imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettexpi.@#(imin*n,d)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettexpi.@#(imax*n,d)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquettexpi.@#(i*n,d)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi;
+ );
+ $
+enddef;
+
+vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi ordonnées
+ save $,imin,imax,labmin,labmax,val;
+ picture $,labmin,labmax;
+ numeric imin,imax,val;
+ val:=n*pi/d;
+ $=image(%
+ imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquetteypi.@#(imin*n,d)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquetteypi.@#(imax*n,d)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquetteypi.@#(i*n,d)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): draw labmax fi
+ );
+ $
+enddef;
+
+vardef _axexpi_@#(expr num,den,nn)=
+ save $,grad;
+ numeric grad;
+ picture $;
+ grad:=num*pi/den;
+ $=image(
+ % axe
+ if flecheaxe: olddrawarrow else: olddraw fi dessinaxex;
+ % graduations
+ if grad>0: draw graduationsaxex(grad) fi;
+ % étiquettes
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den);
+ _axorlab:=etiquettexpi@#(xO/pi,1)
+ else:
+ draw etiquettesaxexpi.bot(num,den);
+ _axorlab:=etiquettexpi.bot(xO/pi,1)
+ fi;
+ poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den);
+ draw etiquettexpi@#(xO/pi,1)
+ else:
+ draw etiquettesaxexpi.bot(num,den);
+ draw etiquettexpi.bot(xO/pi,1)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den)
+ else:
+ draw etiquettesaxexpi.bot(num,den)
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef _axeypi_@#(expr num,den,nn)=
+ save $,grad;
+ numeric grad;
+ picture $;
+ grad:=num*pi/den;
+ $=image(
+ % axe
+ if flecheaxe: olddrawarrow else: olddraw fi dessinaxey;
+ % graduations
+ if grad>0: draw graduationsaxey(grad) fi;
+ % étiquettes
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den);
+ _axorlab:=etiquetteypi@#(yO/pi,1)
+ else:
+ draw etiquettesaxeypi.lft(num,den);
+ _axorlab:=etiquetteypi.lft(yO/pi,1)
+ fi;
+ poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den);
+ draw etiquetteypi@#(yO/pi,1)
+ else:
+ draw etiquettesaxeypi.lft(num,den);
+ draw etiquetteypi.lft(yO/pi,1)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den)
+ else:
+ draw etiquettesaxeypi.lft(num,den)
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef axexpi@# (expr n,d)= %%%%%%axe des abscisses avec gestion graduation origine mult pi
+ _nbaxes:=_nbaxes+1;
+ _axexpi_@#(n,d,1)
+enddef;
+
+vardef axeypi@# (expr n,d)= %%%%%%axe des ordonnées avec gestion graduation origine mult pi
+ _nbaxes:=_nbaxes+1;
+ _axeypi_@#(n,d,1)
+enddef;
+
+vardef axexpio@#(expr n,d)= %%%%%%axe des abscisses avec graduation origine mult pi
+ _axexpi_@#(n,d,2)
+enddef;
+
+vardef axeypio@#(expr n,d)= %%%%%%axe des ordonnées avec graduation origine mult pi
+ _axeypi_@#(n,d,2)
+enddef;
+
+vardef axexpin@#(expr n,d)= %%%%%%axe des abscisses sans graduation origine mult pi
+ _axexpi_@#(n,d,3)
+enddef;
+
+vardef axeypin@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine mult pi
+ _axeypi_@#(n,d,3)
+enddef;
+
+vardef axespi@# (expr n,d)= %%%% les deux axes mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpi.top(n,d) else: draw axexpi.bot(n,d) fi;
+ if posy>0: draw axeypi.rt(n,d) else: draw axeypi.lft(n,d) fi
+ );
+ $
+enddef;
+
+vardef axespio@# (expr n,d)= %%%% les deux axes avec origine mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpio.top(n,d) else: draw axexpio.bot(n,d) fi;
+ if posy>0: draw axeypio.rt(n,d) else: draw axeypio.lft(n,d) fi
+ );
+ $
+enddef;
+
+vardef axespin@# (expr n,d)= %%%% les deux axes sans origine mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpin.top(n,d) else: draw axexpin.bot(n,d) fi;
+ if posy>0: draw axeypin.rt(n,d) else: draw axeypin.lft(n,d) fi
+ );
+ $
+enddef;
+
+
+%%%%%%%% graduations isolées
+
+vardef axexpart@#(text t)=
+ save $,tmp,var;
+ picture $;
+ numeric tmp;
+ boolean var;
+ var:=false;
+ $=image(%
+ for _i=t:
+ if numeric _i:
+ if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi;
+ if boolgradxpart:
+ olddraw graduationx(_i) withpen pencircle scaled 0.8bp
+ fi;
+ tmp:=_i;
+ var:=true
+ else:
+ if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi;
+ var:=false
+ fi;
+ endfor;
+ if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi);
+ $
+enddef;
+
+vardef axeypart@#(text t)=
+ save $,tmp,var;
+ picture $;
+ numeric tmp;
+ boolean var;
+ var:=false;
+ $=image(%
+ for _i=t:
+ if numeric _i:
+ if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi;
+ olddraw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp;
+ tmp:=_i;
+ var:=true
+ else:
+ if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi;
+ var:=false
+ fi;
+ endfor;
+ if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi);
+ $
+enddef;
+
+
+vardef axesunit=
+ save $;
+ picture $;
+ $=image(%
+ draw axes(0,0);
+ draw axexpart(1);
+ draw axeypart(1);
+ label.llft("$0$",_cart(0,0));
+ );
+ $
+enddef;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% POINTS - VECTEURS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef _ccoord(expr xA,yA)=
+ (xA,yA) transformed _T
+enddef;
+
+vardef _coord(expr xA,yA)=
+ (xA,yA)
+enddef;
+
+vardef _cobjet(expr obj)=
+ obj transformed _T
+enddef;
+
+vardef _cart(text t)=
+ if long_texte(t)=2: _ccoord(t)
+ else: _cobjet(t)
+ fi
+enddef;
+
+vardef _c(text t)=
+ if long_texte(t)=2: _coord(t)
+ else: t
+ fi
+enddef;
+
+
+vardef pol(expr r,theta)=
+ (r*cos(theta),r*sin(theta))
+enddef;
+
+vardef pold(expr r,theta)=
+ (r*cosd(theta),r*sind(theta))
+enddef;
+
+color coulpoint,coullabel,coullabelfonc;
+coulpoint:=black;coullabel:=black;coullabelfonc:=black;
+
+
+vardef MarquePointFig(expr pp)= % compatibilité geometriesyr15
+ save $;
+ picture $;
+ if marque_p = "plein":
+ $:=image(oldfill fullcircle scaled taillepoint shifted _cart(pp) withcolor coulpoint);
+ elseif marque_p = "creux":
+ $:=image(%
+ oldfill fullcircle scaled taillepoint shifted _cart(pp) withcolor background;
+ olddraw fullcircle scaled taillepoint shifted _cart(pp) withcolor coulpoint);
+ elseif marque_p = "croix":
+ $:=image(%
+ olddraw ((-taillecroix,0)--(taillecroix,0)) shifted _cart(pp) withcolor coulpoint;
+ olddraw ((0,-taillecroix)--(0,taillecroix)) shifted _cart(pp) withcolor coulpoint)
+ else: $:=nullpicture
+ fi;
+ $
+enddef;
+
+def MarquePoint(expr pp)= % compatibilité geometriesyr15
+ draw MarquePointFig(pp)
+enddef;
+
+
+vardef pointe(text t) = %geometriesyr15
+ for p_ = t: if pair p_: MarquePoint(p_); fi endfor;
+enddef;
+
+% Juin 2019 : placement fin des étiquettes (angle donné)
+vardef thelabelang@#(expr s,z)=
+ save tmpang,tmpfig,tmppt,tmppath,tmpstr;
+ string tmpstr;
+ numeric tmpang;
+ pair tmppt;
+ path tmppath;
+ save p; picture p;
+ tmpstr := str @#;
+ if picture s: p=s
+ else: p = LaTeX(s)
+ fi;
+ tmppath := llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle;
+ if ASCII tmpstr = 91:
+ tmpang := scantokens substring(1,length(tmpstr)-1) of tmpstr
+ else:
+ tmpang := scantokens tmpstr
+ fi;
+ tmppt := tmppath intersectionpoint (0.5urcorner p-- (0.5urcorner p + 100 * (dir (180+tmpang))));
+ p shifted (-tmppt + _cart(z) + labeloffset*(cosd(tmpang),sind(tmpang)) )
+enddef;
+
+def labelang = draw thelabelang enddef;
+
+
+vardef nommepoint@#(text t)=
+ save $,ch,dess,latch;
+ pair $;
+ string ch,latch;
+ picture dess;
+ if (ASCII str @# < 58) or (ASCII str @# = 91):
+ def mylabel = labelang enddef
+ else:
+ def mylabel = label enddef
+ fi;
+ if long_texte(t)=1:
+ dess:=image(draw MarquePointFig(t);
+ ch:=_chaine(t);
+ mylabel@#("$" & ch & "$",t) withcolor coullabel)
+ else:
+ dess:=image(%
+ for PP=t:
+ if pair PP: MarquePoint(PP); $:=PP
+ else: if string PP: mylabel@#(PP,$) else: mylabel@#(PP scaled defaultscale,$) fi withcolor coullabel
+ fi;
+ endfor)
+ fi;
+ dess
+enddef;
+
+
+
+
+vardef nommecourbe@#(suffix p)(text t)=
+ save A,ch,dess;
+ pair A;
+ string ch;
+ picture dess;
+ if long_texte(t)=1:
+ dess:=image(ch:=_chaine(p);
+ A:=(t,fonccourbe.p(t));
+ label@#("$" & ch & "$",A) withcolor coullabelfonc)
+ else:
+ dess:=image(%
+ for _a=t:
+ if numeric _a: A:=(_a,fonccourbe.p(_a))
+ else: if string _a: label@#(_a,A) else: label@#(_a scaled defaultscale,A) fi withcolor coullabelfonc
+ fi;
+ endfor)
+ fi;
+ dess
+enddef;
+
+
+
+
+
+
+vardef nommeobj@#(text t)=
+ save $;
+ picture $;
+ if long_texte(t)=4: $:=nommeangle@#(t)
+ else:
+ for i=t:
+ if pair i: $:=nommepoint@#(t)
+ elseif str @#="": $:=nommeautoobj(t)
+ else: $:=nommecourbe@#(t)
+ fi;
+ exitif true;
+ endfor
+ fi;
+ $
+enddef;
+
+def nomme = draw nommeobj enddef;
+
+
+%
+% Notation automatique des chemins 02/17
+%
+string prefnomme;
+prefnomme:="right";
+
+% Permet de savoir si un point est mieux placé relativement à prefnomme
+tertiarydef A estmieuxplace B =
+ if prefnomme="right": xpart A > xpart B
+ elseif prefnomme="left": xpart A < xpart B
+ elseif prefnomme="top": ypart A > ypart B
+ elseif prefnomme="bottom": ypart A < ypart B
+ else: hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom")
+ fi
+enddef;
+
+% Cherche le "time" du meilleur point
+vardef pointnommetime(expr p)=
+ save Pt, nbint, P, T,pp;
+ pair Pt,P[];
+ numeric nbint,pp,T[];
+ intercourbestimes(T)(cadre,p);
+ show T[1];
+ Pt:=_O;pp:=0;
+ if known T[1]:
+ Pt:= point T[1] of p;
+ pp:=T[1];
+ nbint:=1;
+ forever:
+ exitif not known T[nbint+1];
+ nbint:=nbint+1;
+ if (point T[nbint] of p) estmieuxplace Pt:
+ Pt:=point T[nbint] of p;
+ pp:=T[nbint];
+ fi;
+ endfor
+ fi;
+ pp
+enddef;
+
+% Cherche la "meilleure" position du label du point pp de time tt du chemin courbe
+vardef position(expr pp,tt,courbe)=
+ save pos,tmpdir;
+ string pos;
+ numeric tmpdir;
+ tmpdir := angle(direction tt of courbe);
+ if arrondimil((Ymax-ypart pp)/(Ymax-Ymin))=0:
+ if tmpdir <0: pos:="llft"
+ else: pos:="lrt"
+ fi
+ elseif arrondimil((Ymin-ypart pp)/(Ymax-Ymin))=0:
+ if tmpdir <0: pos:="urt"
+ else: pos:="ulft"
+ fi
+ elseif arrondimil((Xmax-xpart pp)/(Xmax-Xmin))=0:
+ if tmpdir <0: pos:="llft"
+ else: pos:="ulft"
+ fi
+ elseif arrondimil((Xmin-xpart pp)/(Xmax-Xmin))=0:
+ if tmpdir <0: pos:="urt"
+ else: pos:="lrt"
+ fi
+ fi;
+ pos
+enddef;
+
+% Notation automatique des chemins
+
+% Avec label automatique
+vardef nommeautoobjsuf(suffix p)=
+ nommeautoobjtex(p,"$" & _chaine(p) & "$")
+enddef;
+
+vardef estcadree primary f =
+ show llcorner f; show llcorner cadre transformed _T;
+ show urcorner f; show urcorner cadre;
+ (xpart urcorner f <= xpart urcorner (cadre transformed _T))
+ and (ypart urcorner f <= ypart urcorner (cadre transformed _T))
+ and (xpart llcorner f >= xpart llcorner (cadre transformed _T))
+ and (ypart llcorner f >= ypart llcorner (cadre transformed _T))
+enddef;
+
+% Avec label donné
+vardef nommeautoobjtex(expr p,leg)=
+ save ptA,pos,ttmp,tmpfig;
+ pair ptA;
+ picture tmpfig;
+ numeric ttmp;
+ string pos;
+ ttmp:=pointnommetime(p);
+ ptA:= point ttmp of p;
+ pos:=position(ptA,ttmp,p);
+ for i=0 upto 120:
+ tmpfig :=
+ if string leg:
+ scantokens("thelabel." & pos)(leg,ptA)
+ else:
+ scantokens("thelabel." & pos)(leg scaled defaultscale,ptA)
+ fi;
+ exitif estcadree tmpfig;
+ ptA := point (ttmp + ((-1)**(i+1))*round((i+1)/2)*length(p)/60) of p;
+ endfor
+ tmpfig
+enddef;
+
+
+vardef nommeautoobj(text t)=
+ if long_texte(t)=1: nommeautoobjsuf(t)
+ else: nommeautoobjtex(t)
+ fi
+enddef;
+
+
+
+vardef vecteur@#(expr A)(text t)=
+ save $,ch,m;
+ picture $;
+ pair m;
+ string ch;
+ $=image(%
+ if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#("$\vv{" & ijmath(ch) & "}$",A+t/2)
+ else:
+ for u=t:
+ if pair u: drawarrow A--A+u; m:=A+u/2
+ else: if string u: if u<>"": label@#("$\vv{" & u & "}$",m) fi else: label@#(u,m) fi
+ fi;
+ endfor
+ fi);
+ $
+enddef;
+
+vardef marquepointcourbefig(suffix p)(text t)=
+ save $;
+ picture $;
+ $=image(%
+ for i=t:
+ MarquePoint((i,fonccourbe.p(i)));
+ endfor);
+ $
+enddef;
+
+def marquepointcourbe= draw marquepointcourbefig enddef;
+
+vardef marquepointcheminfig(suffix p)(text t)=
+ save $;
+ picture $;
+ $=image(%
+ for i=t:
+ MarquePoint(point i of p);
+ endfor);
+ $
+enddef;
+
+def marquepointchemin= draw marquepointcheminfig enddef;
+
+vardef marquecheminouvertdroitefig(expr p)=
+ halfcircle shifted (0,-0.5)
+ scaled (2*taillepoint)
+ rotated (90+angle(direction infinity of _cart(p)))
+ shifted (point infinity of _cart(p))
+enddef;
+
+def marquecheminouvertdroite= olddraw marquecheminouvertdroitefig enddef;
+
+vardef marquecheminouvertgauchefig(expr p)=
+ halfcircle shifted (0,-0.5)
+ scaled (2*taillepoint)
+ rotated (-90+angle(direction 0 of _cart(p)))
+ shifted (point 0 of _cart(p))
+enddef;
+
+def marquecheminouvertgauche= olddraw marquecheminouvertgauchefig enddef;
+
+def marquecheminouvert(expr p) text t=
+ marquecheminouvertdroite(p) t;
+ marquecheminouvertgauche(p) t
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% BASE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef ijmath(suffix s)=
+ if (substring (0,1) of s)="i": s:="\imath" & substring (1,infinity) of s fi;
+ if (substring (0,1) of s)="j": s:="\jmath" & substring (1,infinity) of s fi;
+ s
+enddef;
+
+
+color coulbase;
+coulbase:=black;
+
+vardef base(suffix a,b,c)=
+ save O,I,J,$;
+ string O,I,J;
+ picture $;
+ O:=_chaine(a); I:=_chaine(b); J:=_chaine(c);
+ $:=image(%
+ draw vecteur.bot(_O_,(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase;
+ draw vecteur.lft(_O_,(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase;
+ nomme.llft(_O_,"$" & O & "$") withcolor coulbase
+ );
+ $
+enddef;
+
+
+vardef basep(suffix a,b,c)=
+ save O,I,J,$;
+ string O,I,J;
+ picture $;
+ O:=_chaine(a); I:=_chaine(b); J:=_chaine(c);
+ $:=image(%
+ nomme.llft(_O_,"$" & O & "$") withcolor coulbase;
+ draw axexpart(1,"$" & I & "$") withcolor coulbase;
+ draw axeypart(1,"$" & J & "$") withcolor coulbase;
+ );
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% QUADRILLAGE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ numeric ep; color coul;
+ ep:= .3bp; %%%%%%%% épaisseur du trait
+ coul := .7white; %%%%%%%% couleur du trait
+ def quadstyle= enddef;
+
+ vardef quadrillage(expr quadx,quady) =
+ save $;
+ picture $;
+ $=image(if quadx>0:
+ for i=ceiling((QuadXmin-xO)/quadx) upto floor((QuadXmax-xO)/quadx):
+ olddraw _cart(arrondimil(i*quadx)+xO,QuadYmin)--_cart(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul;
+ endfor;
+ fi;
+ if quady>0:
+ for i=ceiling((QuadYmin-yO)/quady) upto floor((QuadYmax-yO)/quady):
+ olddraw _cart(QuadXmin,arrondimil(i*quady)+yO)--_cart(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle;
+ endfor;
+ fi);
+ $
+ enddef;
+
+ vardef papierpointe(expr quadx,quady) =
+ save $;
+ picture $;
+ $=image(if (quadx>0) and (quady>0):
+ for i=ceiling(QuadXmin/quadx) upto floor(QuadXmax/quadx):
+ for j=ceiling(QuadYmin/quady) upto floor(QuadYmax/quady):
+ olddraw (0,0) shifted _cart(i*quadx,j*quady) withpen pencircle scaled 2;
+ endfor;
+ endfor;
+ fi);
+ $
+ enddef;
+
+ numeric pm_epa, pm_epb, pm_epc;
+ color pm_coula, pm_coulb, pm_coulc;
+ pm_epa := .2bp; pm_epb := .3bp; pm_epc := .4bp; %%%%%%%%%% épaisseurs des traits
+ pm_coula := .6*white; pm_coulb := .4*white; pm_coulc := black; %%%%%%%%%% couleurs des traits
+
+vardef papiermillimetre =
+ save $;
+ picture $;
+ $=image(%
+ for i= ceiling(QuadXmin*Ux*10/cm) upto floor(QuadXmax*Ux*10/cm):
+ if i mod 5 <> 0: olddraw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi;
+ endfor
+ for i= ceiling(QuadYmin*Uy*10/cm) upto floor(QuadYmax*Uy*10/cm):
+ if i mod 5<> 0: olddraw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi;
+ endfor
+ %
+ for i= ceiling(QuadXmin*Ux/cm)*2+1 step 2 until floor(QuadXmax*Ux/cm)*2-1:
+ olddraw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb;
+ endfor
+ for i= ceiling(QuadYmin*Uy/cm)*2+1 step 2 until floor(QuadYmax*Uy/cm)*2-1:
+ olddraw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb;
+ endfor
+ %
+ for i= ceiling(QuadXmin*Ux/cm) upto floor(QuadXmax*Ux/cm):
+ olddraw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc;
+ endfor
+ for i= ceiling(QuadYmin*Uy/cm) upto floor(QuadYmax*Uy/cm):
+ olddraw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc;
+ endfor);
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% FONCTIONS - COURBES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef courbef_(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction
+ save $,x;
+ path $;
+ $=((xmin,f(xmin))
+ for i=1 upto n-1:
+ ..(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))
+ endfor );
+ $
+enddef;
+
+
+vardef courbef_l(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction
+ save $,x;
+ path $;
+ $=((xmin,f(xmin))
+ for i=1 upto n-1:
+ ...(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))
+ endfor );
+ $
+enddef;
+
+
+vardef courbefonc(suffix f)(text t)=
+ save cc;path cc;
+ save k,Val;numeric k,Val[];
+ Val[1]:=Xmin;Val[2]:=Xmax;Val[3]:=60;
+ k:=1;
+ for i=t:
+ Val[k]:=i;
+ k:=k+1;
+ endfor
+ courbef_(f,Val[1],Val[2],Val[3])
+enddef;
+
+
+vardef courbefoncl(suffix f)(text t)=
+ save cc;path cc;
+ save k,Val;numeric k,Val[];
+ Val[1]:=Xmin;Val[2]:=Xmax;Val[3]:=100;
+ k:=1;
+ for i=t:
+ Val[k]:=i;
+ k:=k+1;
+ endfor
+ courbef_l(f,Val[1],Val[2],Val[3])
+enddef;
+
+
+
+
+vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés
+ save $,x;
+ picture $;
+ $=image(MarquePoint((xmin,f(xmin)));
+ for i=1 upto n-1:
+ MarquePoint((xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))));
+ endfor );
+ $
+enddef;
+
+vardef fonccourbe@#(expr x)= %Ordonnée du point de la courbe @# d'abscisse x (dans le repère utilisateur)
+ ypart pointcourbe@#(x)
+enddef;
+
+vardef pointcourbe@#(expr x)= %Point de la courbe @# d'abscisse x dans le repère utilisateur
+save _P_,t;
+ numeric t; pair _P_;
+ (t,whatever)=@# intersectiontimes ((x,2*Ymin-Ymax)--(x,2*Ymax-Ymin));
+ if t=-1: _P_:=(x,0)
+ else: _P_:=point t of @#
+ fi;
+ _P_
+enddef;
+
+vardef der@#(expr x)= %Fonction dérivée
+ save pp,t,v,w,d;
+ path pp;
+ pair v,w;
+ pp:=@#;
+ (t,whatever) = pp intersectiontimes ((x,2*Ymin-Ymax)--(x,2*Ymax-Ymin));
+ v:=direction t of pp;
+% w:=unitvector(v transformed inverse _T);
+ if xpart v = 0: d:=0 else: d:= (ypart v)/(xpart v) fi;
+ d
+enddef;
+
+vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de p et q dans P[]
+ save i,pp;
+ numeric i;
+ path pp;
+ pp:=p;
+ i:=1;
+ forever:
+ exitif xpart(pp intersectiontimes q)=-1;
+ P[i]:=point xpart(pp intersectiontimes q) of pp;
+ pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp;
+ %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin...
+ i:=i+1;
+ endfor;
+enddef;
+
+vardef intercourbestimes(suffix T)(expr p,q)= %renvoie le "time" de q des points d'intersections de p et q dans T[]
+ save i,pp;
+ numeric i;
+ path pp;
+ pp:=p;
+ i:=1;
+ forever:
+ exitif xpart(pp intersectiontimes q)=-1;
+ T[i]:=ypart(pp intersectiontimes q);
+ pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp;
+ %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin...
+ i:=i+1;
+ exitif i=10;
+ endfor;
+enddef;
+
+vardef ptantecedents(suffix P)(expr y,p)=
+ intercourbes(P,(Xmin,y)--(Xmax,y),p)
+enddef;
+
+vardef antecedents(suffix P)(expr y,p)=
+ pair PP[];
+ ptantecedents(PP,y,p);
+ for i=1 upto 10: P[i]:=xpart (PP[i]); endfor
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% INTERPOLATION %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%Novembre 2017
+vardef polynomelagrangept(text t)(expr x)=
+ 0
+ for i=t:
+ + ypart i
+ for j=t:
+ if i<>j: *((x-xpart j)/(xpart i - xpart j)) fi
+ endfor
+ endfor
+enddef;
+
+%Novembre 2017
+vardef polynomelagrangeval(text t)(expr x)=
+save tmp,k,j,ab,or;
+pair tmp[];numeric k,j,ab,or;
+k:=0;j:=0;
+for i=t:
+ if j=0: ab:=i else: or:=i; k:=k+1; tmp[k]=(ab,or) fi;
+ j:=1-j;
+endfor
+polynomelagrangept(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
+enddef;
+
+%Novembre 2017
+vardef polynomelagrange(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if pair i: tmp:=polynomelagrangept(t)(x)
+ else: tmp:=polynomelagrangeval(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+
+%Novembre 2017
+vardef lagrange(text t)(text q)=
+ vardef _tmp_poly_lag(expr x)= polynomelagrange(t)(x) enddef;
+ courbefonc(_tmp_poly_lag)(q)
+enddef;
+
+
+%Novembre 2017
+vardef polynomehermitetriplet(text t)(expr x)=
+%t=(x1,y1,z1),(x2,y2,z2)...
+%H(X)=Σqi(X)Pi(X) avec qi(X)=Li(X)² et Pi(X)=yi+(X-xi)(zi-qi'(xi)yi)
+%qi'(xi)=Σ2/(xi-xj)
+0
+for i=t:
+ +
+ (greenpart i+(x-redpart i)*(bluepart i -
+ (0
+ for j=t: %qi'(xi)
+ if i<>j: + 2/(redpart i - redpart j) fi
+ endfor
+ )
+ *greenpart i))
+ for j=t: % qi(X)
+ if i<>j: *(((x-redpart j)/(redpart i - redpart j))**2) fi
+ endfor
+endfor
+enddef;
+
+%Novembre 2017
+vardef polynomehermiteptder(text t)(expr x)=
+save tmp,k,j,re,gr,bl,i;
+color tmp[];numeric k,j,re,gr,bl,i;
+k:=0;j:=0;
+for i=t:
+ if pair i: re:= xpart i; gr:= ypart i else: bl:=i; k:=k+1; tmp[k]=(re,gr,bl) fi;
+endfor
+polynomehermitetriplet(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
+enddef;
+
+%Novembre 2017
+vardef polynomehermite(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if color i: tmp:=polynomehermitetriplet(t)(x)
+ else: tmp:=polynomehermiteptder(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+
+%Novembre 2017
+vardef hermite(text t)(text q)=
+ vardef _tmp_poly_her(expr x)= polynomehermite(t)(x) enddef;
+ courbefoncl(_tmp_poly_her)(q)
+enddef;
+
+
+% Novembre 2017
+vardef spcuhezz (expr t)= 2*(t**3)-3*(t**2)+1 enddef;
+vardef spcuheuz (expr t)= t**3-2*(t**2)+t enddef;
+vardef spcuhezu (expr t)= -2*(t**3)+3*(t**2) enddef;
+vardef spcuheuu (expr t)= t**3-t**2 enddef;
+
+
+% Novembre 2017
+vardef splinecubique (expr xa,ya,da,xb,yb,db)(expr x)=
+% On donne deux points et les dérivées en ces points
+ save t;
+ numeric t;
+ t=(x-xa)/(xb-xa);
+ (spcuhezz(t))*ya + (spcuheuz(t))*da*(xb - xa) + (spcuhezu(t))*yb + (spcuheuu(t))*db*(xb - xa)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_coul(text t)(expr x)=
+% On donne points et dérivées sous forme de triplets (x,y,y')
+ save pta,ptb,prem,sortie;
+ color pta,ptb;
+ boolean prem,sortie;
+ prem:=true;sortie:=false;
+ for i=t:
+ if prem: ptb:=i; prem:=false
+ else:
+ pta:=ptb;
+ ptb:=i;
+ if x< redpart ptb: sortie:=true fi;
+ fi;
+ exitif sortie;
+ endfor
+ splinecubique(redpart pta, greenpart pta, bluepart pta,redpart ptb, greenpart ptb, bluepart ptb)(x)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_pt(text t)(expr x)=
+% On donne points et dérivées sous forme de liste (A,y'A,B,y'B...)
+ save tmp,k,re,gr,bl;
+ color tmp[];
+ numeric re,gr,bl,k;
+ k:=0;
+ for i=t:
+ if pair i: k:=k+1; re:= xpart i; gr:= ypart i
+ else: bl:=i; tmp[k]:=(re,gr,bl)
+ fi;
+ endfor
+ splineinterpolderfonct_coul(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_listeval(text t)(expr x)=
+% On donne points et dérivées sous forme de liste de valeurs (xA,yA,y'A,xB,yB,y'B...)
+ save tmp,k,j,re,gr,bl;
+ color tmp[];
+ k:=0;j:=0;
+ for i=t:
+ if j=0: re:= i; j:=1
+ elseif j=1: gr:=i; j:=2
+ else: bl:=i; tmp[k]:=(re,gr,bl); j:=0;k:=k+1
+ fi;
+ endfor
+ splineinterpolderfonct_coul(tmp[0] for ii=1 upto k-1: ,tmp[ii] endfor)(x)
+enddef;
+
+
+% Novembre 2017
+vardef splinederfonct(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if color i: tmp:=splineinterpolderfonct_coul(t)(x)
+ elseif pair i: tmp:=splineinterpolderfonct_pt(t)(x)
+ else: tmp:=splineinterpolderfonct_listeval(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+% Novembre 2017
+vardef splineder(text t)(text q)=
+ vardef _tmp_poly_splineder(expr x)= splinederfonct(t)(x) enddef;
+ courbefoncl(_tmp_poly_splineder)(q)
+enddef;
+
+
+%% Novembre 2017
+%vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
+%% renvoie les dérivées pour interpolation avec splines cubiques
+%% source : https://en.wikipedia.org/wiki/Spline_interpolation
+%% xs[] et ys[] sont des listes, n est le nombre de valeurs
+%% Renvoie les dérivées dans la liste k[]
+% (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2);
+% for i=1 upto n-1:
+% k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2);
+% endfor
+% (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2);
+%enddef;
+
+%Mars 2019
+vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
+% renvoie les dérivées pour interpolation avec splines cubiques
+% source : https://en.wikipedia.org/wiki/Spline_interpolation
+% xs[] et ys[] sont des listes, n est le nombre de valeurs
+% Renvoie les dérivées dans la liste k[]
+ if not derex[0]:
+ (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2)
+ fi;
+ for i=1 upto n-1:
+ if not derex[i]:
+ k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2)
+ fi;
+ endfor
+ if not derex[n]:
+ (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2)
+ fi;
+enddef;
+
+%% Novembre 2017
+%vardef splineinterpolfonct_pt(text t)(expr x)=
+%% t est la liste des points A,B,C...
+% save xa,ya,dd,n;
+% numeric xa[],ya[],dd[],n;
+% n:=-1;
+% for i=t:
+% n := n + 1;
+% xa[n] := xpart i; ya[n] := ypart i;
+% endfor
+% deriveesplinecubique(dd)(xa,ya)(n);
+% splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x)
+%enddef;
+
+% Mars 2019
+vardef splineinterpolfonct_pt(text t)(expr x)=
+% t est la liste A,[y'1,]B,[y'2,]C,[y'3,]...
+ save xa,ya,dd,n,derex;
+ numeric xa[],ya[],dd[],n;
+ boolean derex[];
+ n:=-1;
+ for i=t:
+ if numeric i:
+ dd[n]:=i;derex[n]:=true;
+ else:
+ n := n + 1;
+ derex[n]:=false;
+ xa[n] := xpart i; ya[n] := ypart i
+ fi;
+ endfor
+ deriveesplinecubique(dd)(xa,ya)(n);
+ splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x)
+enddef;
+
+vardef splineinterpolfonct_listeval(text t)(expr x)=
+% t est la liste des valeurs (x1,y1,x2,y2,x3,y3...)
+ save xa,ya,tmp,k,j;
+ numeric xa,ya,k,j;
+ pair tmp[];
+ k:=0;j:=0;
+ for i=t:
+ if j=0: xa:= i
+ else: ya:=i; tmp[k]:= (xa,ya); k:= k+1
+ fi;
+ j:=1-j;
+ endfor
+ splineinterpolfonct_pt(tmp[0] for ii=1 upto k-1: ,tmp[ii] endfor)(x)
+enddef;
+
+% Novembre 2017
+vardef splinefonct(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if pair i: tmp:=splineinterpolfonct_pt(t)(x)
+ else: tmp:=splineinterpolfonct_listeval(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+% Novembre 2017
+vardef spline(text t)(text q)=
+ vardef _tmp_poly_spline(expr x)= splinefonct(t)(x) enddef;
+ courbefonc(_tmp_poly_spline)(q)
+enddef;
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% TANGENTES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+numeric longtan;
+longtan:=20;
+
+vardef tangentefleche@# (suffix p)(text tt) =
+ save t,$,pp,i,N;
+pair senstan.gauche,senstan.droite,senstan.double;
+senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
+ numeric N[],i;
+ i:=0;
+ pair _v,M;
+ picture $;
+ for n=tt: i:=incr i ; N[i]:=n; endfor;
+ if i=1: N2:=longtan fi;
+ (t,whatever) = p intersectiontimes ((N1,Ymin)--(N1,Ymax));
+ M:=point t of p;
+ _v:=N2*unitvector(direction t of p);
+ $=image(%
+ MarquePoint(M);
+ if (xpart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)-_v*(xpart senstan@#) fi;
+ if (ypart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)+_v*(ypart senstan@#) fi;
+ );
+ $
+enddef;
+
+vardef tangentedroite(expr p,a) =
+ save $,m,M,t;
+ path $;
+ numeric m,t;
+ pair M;
+ (t,whatever) = p intersectiontimes ((a,Ymin)--(a,Ymax));
+ M:=point t of p;
+ $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ $
+enddef;
+
+vardef tangente@#(suffix p)(text tt) =
+ if str @#="": tangentedroite(p)(tt)
+ else: tangentefleche@#(p)(tt)
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% CALCUL INTÉGRAL %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef entrecourbes(expr p,q,xmin,xmax)=
+ buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),q)
+enddef;
+
+vardef souscourbe(expr p,xmin,xmax)=
+ buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),(Xmin,0)--(Xmax,0))
+enddef;
+
+
+vardef rectangles@#(suffix p)(expr a,b,n)= %Riemann, renvoie un chemin fermé
+ save pas,_rect_;
+ numeric pas;
+ path _rect_;
+ pas=(b-a)/n;
+ _rect_ =
+ for i=0 upto n-1:
+ (a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)--
+ endfor
+ (b,yO)--cycle;
+ _rect_
+enddef;
+
+numeric _typerect.min,_typerect.max,_typerect.droite,_typerect.gauche;
+_typerect.min=1;_typerect.max=2;_typerect.droite=3;_typerect.gauche=4;
+
+vardef _segmrect_@#(suffix p)(expr a,pas)=
+ save _sousp;
+ path _sousp;
+ _sousp=subpath (xpart(p intersectiontimes droiteeqx(a)),xpart(p intersectiontimes droiteeqx(a+pas))) of p;
+ if _typerect@#=1: llcorner _sousp -- lrcorner _sousp
+ elseif _typerect@#=2: ulcorner _sousp -- urcorner _sousp
+ elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted (pas,0))
+ elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted (-pas,0))--(pointcourbe.p(a+pas))
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DROITES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef droiteeqred(expr a,b)=
+ save $;
+ path $;
+ if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a):
+ $:=(XmiN,a*XmiN+b)--(XmaX,a*XmaX+b);
+ elseif a>0:
+ $:=(YmiN/a-b/a,YmiN)--(YmaX/a-b/a,YmaX);
+ else:
+ $:=(YmaX/a-b/a,YmaX)--(YmiN/a-b/a,YmiN);
+ fi;
+ $
+enddef;
+
+vardef droiteeqx(expr c)=
+ (c,2*Ymin-Ymax)--(c,2*Ymax-Ymin)
+enddef;
+
+vardef droiteeqcart(expr a,b,c)=
+ save $;
+ path $;
+ if b=0:
+ $=droiteeqx(-c/a)
+ else:
+ $:=droiteeqred(-a/b,-c/b)
+ fi;
+ $
+enddef;
+
+vardef droiteeq(text t)=
+ save $;
+ path $;
+ if long_texte(t)=1: $:= droiteeqx(t) fi;
+ if long_texte(t)=2: $:= droiteeqred(t) fi;
+ if long_texte(t)=3: $:= droiteeqcart(t) fi;
+ $
+enddef;
+
+
+vardef droitept(expr A,B)= %geometrie15syr
+ (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B]
+enddef;
+
+vardef droite(text t)=
+ save $;
+ path $;
+ for i=t:
+ if pair i: $:=droitept(t) else: $:=droiteeq(t) fi;
+ exitif true;
+ endfor;
+ $
+enddef;
+
+
+% demi-droites juin 2019
+vardef demidroitept(expr A,B)=
+ A--(_diag/abs(A-B))[A,B]
+enddef;
+
+vardef demidroiteangle(expr A,alpha)=
+ demidroitept(A,A + dir alpha)
+enddef;
+
+vardef demidroite(text t)=
+ save reptmp,repbool;
+ path reptmp;
+ boolean repbool;
+ repbool:=false;
+ for i=t:
+ if numeric i: repbool := true fi;
+ endfor
+ if repbool:
+ reptmp := demidroiteangle(t)
+ else:
+ reptmp := demidroitept(t)
+ fi;
+ reptmp
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DEMI-PLANS %%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef demiplaninf(expr d)=
+ save $,A,B;
+ path $;
+ pair A,B;
+ if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1:
+ A:=point 0 of d; B:= point infinity of d
+ else: B:=point 0 of d; A:= point infinity of d
+ fi;
+ $=A--
+ if ypart A>=ypart (Xmin,Ymax): (Xmin,Ymax)-- fi
+ if ypart A>ypart (Xmin,Ymin): (Xmin,Ymin)-- fi
+ if ypart B>ypart (Xmax,Ymin): (Xmax,Ymin)-- fi
+ if ypart B>=ypart (Xmax,Ymax): (Xmax,Ymax)-- fi
+ B--cycle;
+ $
+enddef;
+
+vardef demiplansup(expr d)=
+ save $,A,B;
+ path $;
+ pair A,B;
+ if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1:
+ A:=point 0 of d; B:= point infinity of d
+ else: B:=point 0 of d; A:= point infinity of d
+ fi;
+ $=A--
+ if ypart A<=ypart (Xmin,Ymin): (Xmin,Ymin)-- fi
+ if ypart A<ypart (Xmin,Ymax): (Xmin,Ymax)-- fi
+ if ypart B<ypart (Xmax,Ymax): (Xmax,Ymax)-- fi
+ if ypart B<=ypart (Xmax,Ymin): (Xmax,Ymin)-- fi
+ B--cycle;
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% PROJECTIONS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef projetex(expr A)=
+ (xpart (A),yO)
+enddef;
+
+vardef projetey(expr A)=
+ (xO,ypart (A))
+enddef;
+
+vardef projectionx@#(text t)=
+ save $,_a,_fg,dec;
+ picture $,_fg;_fg:=nullpicture;
+ numeric dec;dec=0;
+ pair _a;
+ $=image(%
+ for i=t:
+ if pair i: draw i--projetex(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetex(_a)) fi;
+ endfor;
+ draw _fg shifted (0,dec));
+ $
+enddef;
+
+vardef projectiony@#(text t)=
+ save $,_a,_fg,dec;
+ picture $,_fg;_fg:=nullpicture;
+ numeric dec;dec=0;
+ pair _a;
+ $=image(%
+ for i=t:
+ if pair i: draw i--projetey(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetey(_a)) fi;
+ endfor;
+ draw _fg shifted (dec,0));
+ $
+enddef;
+
+
+vardef projectionaxes(text t)=
+ save $,_A,n;
+ picture $,_fg[];_fg1=_fg2=nullpicture;
+ pair _A;
+ numeric n,dd;n=1;dd=0;
+ $=image(%
+ for i=t: if numeric i: dd:=i fi; endfor
+ for i=t:
+ if not numeric i:
+ if pair i: _A:=i;
+ elseif n=1: if ypart _A > ypart _O_: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1
+ else: if xpart _A > xpart _O_: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1
+ fi;
+ fi;
+ endfor;
+ if n<=2: draw projectiony(_A) fi; if n=1: draw projectionx(_A) fi);
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%% SUITES %%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef suite(suffix u)(expr deb,fin)=
+ save $;
+ picture $;
+ $=courbepoints(u,deb,fin,fin-deb+1);
+ $
+enddef;
+
+vardef _suiterecfonc_(expr x)=0 enddef;
+numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_;
+
+vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init
+ vardef _suiterecfonc_(expr x)=f(x) enddef;
+ _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation
+ save $,un;
+ path $;
+ numeric un;
+ un=init;
+ $=(un,yO)
+ for i=deb upto fin-1:
+ --(un,f(un))--(f(un),f(un))
+ hide(un:=f(un))
+ endfor;
+ $
+enddef;
+
+vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec
+ save $,deb,fin,nom,_qw_,un,lab;
+ picture $;
+ string nom,lab;
+ numeric deb,fin,_qw_,un,_prec;
+ deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_;
+ _qw_:=1;
+ for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin
+ if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi;
+ elseif _qw_=2:
+ deb:=i;
+ for j=_suiterecdeb_ upto i-1:
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif _qw_=3: fin:=i
+ fi;
+ _qw_:=_qw_+1;
+ endfor;
+ $=image(%
+ if nom="":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+ draw projectionx.@#((un,un));
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif nom="_val":
+ if deb=_suiterecdeb_:
+ draw etiquettex.@#(arrondi(10**_prec,un));
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+ lab:="$\num{" & decimal(arrondi(10**_prec,un)) & "}$";
+ draw projectionx.@#((un,un),lab,-taillegrad);
+ un:=_suiterecfonc_(un);
+ endfor
+ else:
+ if deb=_suiterecdeb_:
+ label.@#("$" & nom & "_{" & decimal(deb) & "}" & "$",(un,yO));
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+ lab:="$" & nom & "_{" & decimal(i) & "}" & "$";
+ draw projectionx.@#((un,un),lab);
+ un:=_suiterecfonc_(un);
+ endfor
+ fi);
+ $
+enddef;
+
+vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec
+ save $,deb,fin,nom,_qw_,un,lab;
+ picture $;
+ string nom,lab;
+ numeric deb,fin,_qw_,un,_prec;
+ deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_;
+ _qw_:=1;
+ for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin
+ if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi;
+ elseif _qw_=2:
+ deb:=i;
+ for j=_suiterecdeb_ upto i-2:
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif _qw_=3: fin:=i
+ fi;
+ _qw_:=_qw_+1;
+ endfor;
+ $=image(%
+ if nom="":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ draw projectiony.@#((un,_suiterecfonc_(un)));
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif nom="_val":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ lab:="$\num{" & decimal(arrondi(10**_prec,un)) & "}$";
+ draw projectiony.@#((un,_suiterecfonc_(un)),lab,-taillegrad);
+ un:=_suiterecfonc_(un);
+ endfor
+ else:
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ lab:="$" & nom & "_{" & decimal(i+1) & "}" & "$";
+ draw projectiony.@#((un,_suiterecfonc_(un)),lab);
+ un:=_suiterecfonc_(un);
+ endfor
+ fi);
+ $
+enddef;
+
+
+vardef suiterecproj(text t)=
+ save $;
+ picture $;
+ $=image(%
+ draw suiterecprojx.bot(t);
+ draw suiterecprojy.lft(t));
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% INTERVALLES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef bornex[](expr val)=
+ ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _cart(val,xO)
+enddef;
+
+vardef borney[](expr val)=
+ ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _cart(yO,val)
+enddef;
+
+pair sensborne.FF,sensborne.FO,sensborne.OF,sensborne.OO;
+sensborne.FF=-sensborne.OO=(1,-1);sensborne.FO=-sensborne.OF=(1,1);
+
+vardef intervallex@#(expr vmin,vmax)=
+ save $;
+ picture $;
+ $=image(%
+ olddraw _cart(vmin,xO)--_cart(vmax,xO) withpen pencircle scaled 2pt;
+ olddraw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt;
+ olddraw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt);
+ $
+enddef;
+
+vardef intervalley@#(expr vmin,vmax)=
+ save $;
+ picture $;
+ $=image(%
+ olddraw _cart(yO,vmin)--_cart(yO,vmax) withpen pencircle scaled 2pt;
+ olddraw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt;
+ olddraw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt);
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%% STATISTIQUES %%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+numeric _decboitemoustache_,_largboitemoustache_;
+
+
+vardef boitemoustache(text t)=
+ _decboitemoustache_:=1.5cm;
+ _largboitemoustache_:=1cm;
+ save $,n;
+ picture $;
+ numeric n,_valeursboitemoustache_[];
+ n:=1;
+ for i=t:
+ _valeursboitemoustache_[n]:=i;
+ n:=n+1;
+ endfor;
+ if known _valeursboitemoustache_[6]: _decboitemoustache_:=_valeursboitemoustache_[6] fi;
+ if known _valeursboitemoustache_[7]: _largboitemoustache_:=_valeursboitemoustache_[7] fi;
+ $=image(%
+ oldfill fullcircle scaled 3 shifted _cart(_valeursboitemoustache_[1],yO);
+ olddraw _cart(_valeursboitemoustache_[1],yO)--_cart(_valeursboitemoustache_[2],yO);
+ olddraw _cart(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_cart(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_cart(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_cart(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle;
+ olddraw _cart(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_cart(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2);
+ olddraw _cart(_valeursboitemoustache_[4],yO)--_cart(_valeursboitemoustache_[5],yO);
+ oldfill fullcircle scaled 3 shifted _cart(_valeursboitemoustache_[5],yO)%
+ ) shifted (0,_decboitemoustache_);
+ $
+enddef;
+
+vardef projboitemoustache@#(text t)=
+ save $,n,_lab_,_comp_,A,tmp;
+ pair A;
+ picture $;
+ string _lab_[];
+ numeric n_comp_,tmp;
+ n:=long_texte(t);
+ if n=0:
+ _lab_[1]:="$X_{min}$";
+ _lab_[2]:="$Q_1$";
+ _lab_[3]:="$M_e$";
+ _lab_[4]:="$Q_3$";
+ _lab_[5]:="$X_{max}$";
+ elseif n=1:
+ if t=0: for i=1 upto 5: _lab_[i]:=""; endfor
+ else:
+ tmp:=floor(t);
+ for i=1 upto 5:
+ _lab_[i]:="\num{" & decimal(arrondi(10**tmp,_valeursboitemoustache_[i])) & "}";
+ endfor
+ fi
+ else: _comp_:=1; for i=t:
+ if numeric i: _lab_[_comp_]:="\num{" & decimal(i) & "}"
+ elseif string i: _lab_[_comp_]:=i
+ else: _lab_[_comp_]:=i
+ fi;
+ _comp_:=_comp_+1;
+ endfor
+ fi;
+ $=image(%
+ for i=1 upto 5:
+ if (i=1) or (i=5):
+ A:=_cart(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_)
+ else: A:=_cart(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2)
+ fi;
+ draw projectionx@#(A transformed inverse _T,_lab_[i]);
+ endfor);
+ $
+enddef;
+
+
+numeric diampointsbatons;
+diampointsbatons:=5;
+
+vardef diagrammebatons(text t) =
+ save $;
+ picture $;
+ numeric tmp_taillepoint;
+ string tmp_marque_p;
+ tmp_taillepoint:=taillepoint;
+ tmp_marque_p := marque_p;
+ $=image(%
+ interim linecap:=butt;
+ marque_p:="plein";
+ taillepoint:=diampointsbatons*0.5;
+ for i=t:
+ draw i--projetex(i);
+ MarquePoint(i);
+ endfor
+ );
+ taillepoint:=tmp_taillepoint;
+ marque_p := tmp_marque_p;
+ $
+enddef;
+
+
+numeric largbarres;
+largbarres := 20;
+
+def barrei(expr p)=
+ (projetex(_cart(p)-0.5(largbarres,0))--(_cart(p)-0.5(largbarres,0))--(_cart(p)+0.5(largbarres,0))--projetex(_cart(p)+0.5(largbarres,0))) transformed inverse _T
+enddef;
+
+vardef diagrammebarres(text t)=
+ save tmp;
+ path tmp;
+ tmp:= for i=t: barrei(i)-- endfor cycle;
+ tmp
+enddef;
+
+%octobre 2016
+%diagramme en batons de la loi binomiale
+vardef diagrammebinomiale(expr n,p)=
+ save tmp;
+ picture tmp;
+ tmp:=scantokens("diagrammebatons("&
+ "(0," & decimal(binomiale(n,p,0)) & ")" &
+ for i=1 upto n: ",(" & decimal(i) & "," & decimal(binomiale(n,p,i)) & ")" &
+ endfor
+ ")");
+ tmp
+enddef;
+
+%mai 2017
+%diagramme en batons de la loi uniforme discrète
+vardef diagrammeuniforme(expr n,m)=
+ save tmp;
+ picture tmp;
+ tmp:=scantokens("diagrammebatons("&
+ "(" & decimal(n) & "," & decimal(1/(m-n+1)) & ")" &
+ for i=n+1 upto m: ",(" & decimal(i) & "," & decimal(1/(m-n+1)) & ")" &
+ endfor
+ ")");
+ tmp
+enddef;
+
+%mai 2017
+%diagramme en batons de la loi géométrique
+vardef diagrammegeometrique(expr p)=
+ save tmp;
+ picture tmp;
+ tmp:=scantokens("diagrammebatons("&
+ "(1," & decimal(p) & ")" &
+ for i=2 upto Xmax: ",(" & decimal(i) & "," & decimal(((1-p)**(i-1))*p) & ")" &
+ endfor
+ ")");
+ tmp
+enddef;
+
+%mai 2017
+%diagramme en batons de la loi de Poisson
+vardef diagrammepoisson(expr lambda)=
+ save tmp;
+ picture tmp;
+ tmp:=scantokens("diagrammebatons("&
+ "(0," & decimal(poisson(lambda,0)) & ")" &
+ for i=1 upto Xmax: ",(" & decimal(i) & "," & decimal(poisson(lambda,i)) & ")" &
+ endfor
+ ")");
+ tmp
+enddef;
+
+
+% mai 2017
+% courbe de la densité de la loi normale
+vardef densitenormale(text t)=
+ if long_texte(t)=2: %les bornes ne sont pas précisées donc on prend Xmin et Xmax
+ densitenormalebornes(t,Xmin,Xmax)
+ else: % les bornes sont précisées
+ densitenormalebornes(t)
+ fi
+enddef;
+
+%courbe de la densité de la loi normale entre a et b
+vardef densitenormalebornes(expr mu,sigma,a,b)=
+ vardef tmpdens(expr x)=
+ (1/(sigma*sqrt(2*pi)))*exp(-0.5*(((x-mu)/sigma)**2))
+ enddef;
+ courbefonc(tmpdens)(a,b)
+enddef;
+
+
+% Mai 2017
+% courbe de la densité de la loi exponentielle
+vardef densiteexponentielle(expr lambda)=
+ vardef tmpdens(expr x)=
+ lambda*exp(-lambda*x)
+ enddef;
+ courbefonc(tmpdens)(0,Xmax)
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%% POLYGONES %%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef polygone(text t)=
+ save poly;
+ path poly;
+ poly :=
+ for i=t:
+ i--
+ endfor
+ cycle;
+ poly
+enddef;
+
+if not known typetrace:
+ vardef triangle(expr A,B,C)=
+ polygone(A,B,C)
+ enddef;
+fi
+
+vardef parallelogramme(expr A,O,B)=
+ O--A--(A+B-O)--B--cycle
+enddef;
+
+vardef polygoneregulier(expr A,B,n)=
+ save poly,centre;
+ path poly;pair centre;
+ _cart(B)-centre = (_cart(A)-centre) rotated (360/n);
+ poly:= _cart(A)
+ for i = 1 upto n-1:
+ -- (_cart(A) rotatedaround(centre,(i*360)/n))
+ endfor
+ --cycle;
+ poly transformed inverse _T
+enddef;
+
+vardef sommetpolygoneregulier(expr A,B,n,i)=
+ save $,centre;
+ pair $,centre;
+ _cart(B)-centre = (_cart(A)-centre) rotated (360/n);
+ $= _cart(A) rotatedaround(centre,((i-1)*360)/n);
+ $ transformed inverse _T
+enddef;
+
+vardef equilateral(expr A,B)=
+ polygoneregulier(A,B,3)
+enddef;
+
+vardef carre(expr A,B)=
+ polygoneregulier(A,B,4)
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%% CERCLES ET ARCS %%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef arccercle(expr A,O,B)=
+ path tmp,arc;
+ tmp:=fullcircle scaled (2*(abs(_cart(A)-_cart(O)))) rotated angle(_cart(A)-_cart(O)) shifted _cart(O);
+ if angle(_cart(B)-_cart(O))>angle(_cart(A)-_cart(O)):
+ arc:=subpath(0,(angle(_cart(B)-_cart(O))-angle(_cart(A)-_cart(O)))*(length tmp)/360) of tmp;
+ else:
+ arc:=subpath(0,(360-(angle(_cart(A)-_cart(O))-angle(_cart(B)-_cart(O))))*(length tmp)/360) of tmp;
+ fi
+ arc transformed inverse _T
+enddef;
+
+vardef cerclecr(expr O,r)=
+ fullcircle scaled (2*r*Ux) shifted _cart(O) transformed inverse _T
+enddef;
+
+vardef cerclecp(expr O,A)=
+ fullcircle scaled (2*abs(_cart(A)-_cart(O))) shifted _cart(O) transformed inverse _T
+enddef;
+
+vardef cerclecir(expr A,B,C)=
+ save O;pair O;
+ _cart(O)-0.5[_cart(A),_cart(B)]=whatever * (_cart(B)-_cart(A)) rotated 90;
+ _cart(O)-0.5[_cart(A),_cart(C)]=whatever * (_cart(C)-_cart(A)) rotated 90;
+ cerclecp(O,A)
+enddef;
+
+vardef cercle(text t)=
+ save $;path $;
+ save r;boolean r;
+ r:=false;
+ if long_texte(t)=3:
+ $:=cerclecir(t)
+ else:
+ for i=t:
+ if numeric i: r:=true fi;
+ endfor
+ if r: $:=cerclecr(t) else: $:=cerclecp(t) fi;
+ fi;
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%% MARQUES ANGLES, SEGMENTS... %%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+taille_marque_a:=0.4cm;
+sep_marque_a:=1.5;
+
+
+vardef arc_marqueangle(expr A,O,B,t)=
+ arccercle((_cart(O)+t*unitvector(_cart(A)-_cart(O))) transformed inverse _T,O,(_cart(O)+t*unitvector(_cart(B)-_cart(O))) transformed inverse _T)
+enddef;
+
+vardef marqueanglegeo(expr A,O,B,n)=
+ O--arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2)
+ for i=1 upto n-1:
+ --reverse arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2+(i-1)*sep_marque_a)--
+ arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2+i*sep_marque_a)
+ endfor
+ --cycle
+enddef;
+
+
+vardef marqueangleor(expr A,O,B)=
+ arc_marqueangle(A,O,B,taille_marque_a)
+enddef;
+
+vardef marqueangle(text t)=
+ if long_texte(t)=4: marqueanglegeo(t)
+ else: marqueangleor(t)
+ fi
+enddef;
+
+vardef nommeangle@#(expr A,O,B,p)=
+ save P,a;pair P;path a;
+ save marque_p; string marque_p;
+ marque_p:="";
+ a:=arc_marqueangle(A,O,B,taille_marque_a);
+ P:= point (arctime 0.5*arclength a of a) of a;
+ if str @# = "":
+ nommepoint[angle (P-O)](P,p)
+ else:
+ nommepoint@#(P,p)
+ fi
+enddef;
+
+
+taille_marque_ad:=0.3cm;
+
+vardef marqueangledroit(expr A,O,B)=
+ parallelogramme((_cart(O)+taille_marque_ad*unitvector(_cart(A)-_cart(O))) transformed inverse _T,O,(_cart(O)+taille_marque_ad*unitvector(_cart(B)-_cart(O))) transformed inverse _T)
+enddef;
+
+taille_marque_s:=0.3cm;
+angle_marque_s:=60;
+sep_marque_s:=2;
+
+vardef milieu(expr A,B)=
+ 0.5[A,B]
+enddef;
+
+vardef marqueunique_s(expr A,B)=
+ ((-taille_marque_s*unitvector(_cart(A)-_cart(B))/2)--(taille_marque_s*unitvector(_cart(A)-_cart(B))/2)) rotated angle_marque_s
+enddef;
+
+vardef marquesegment(expr A,B,n)=
+ save $;
+ picture $;
+ $=image(
+ for i=1 upto n:
+ draw marqueunique_s(A,B) shifted ((i-1-(n-1)/2)*sep_marque_s*unitvector(_cart(B)-_cart(A))) transformed inverse _T;
+ endfor
+ );
+ $ shifted milieu(_cart(A),_cart(B))
+enddef;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% FONCTIONS USUELLES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pi:=3.141592654;
+e:=2.718281828;
+
+vardef sin(expr x) = sind(180*x/pi) enddef;
+
+vardef cos(expr x) = cosd(180*x/pi) enddef;
+
+vardef tan(expr x) = sin(x)/cos(x) enddef;
+
+vardef exp(expr x) = mexp(x*256) enddef;
+
+vardef ln(expr x) = mlog(x)/256 enddef;
+
+vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef;
+
+vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
+
+vardef Arctan(expr x)= pi*angle(1,x)/180 enddef;
+
+vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef;
+
+vardef Arccos(expr x)= pi/2-Arcsin(x) enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% REMPLISSAGE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+let _fill_ = fill;
+
+def fill expr c=
+if path c: _fill_ c else: draw c fi
+enddef;
+
+numeric largbriques,hautbriques,decbriques;
+largbriques=12;hautbriques=6;decbriques=6;
+
+vardef briques(text t)=
+ if long_texte(t)=0:
+ repbriques(largbriques,hautbriques,decbriques)
+ else:
+ repbriques(t)
+ fi
+enddef;
+
+
+
+vardef repbriques(expr larg,haut,dec)=
+ numeric d;d=0;
+ image(%
+ for j=0 upto _hautcadre_/haut:
+ olddraw ((0,0)--(_largcadre_,0)) shifted (0,j*haut);
+ d:=d+dec;if d>larg: d:=d-larg fi;
+ for i=0 upto _largcadre_/larg:
+ olddraw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut);
+ endfor;
+ endfor) shifted llcorner _cart(cadre)
+enddef;
+
+
+numeric pashach,anglehach;
+pashach=5;anglehach=60;
+
+vardef hachures(text t)=
+ if long_texte(t)=0:
+ rephachures(pashach,anglehach)
+ else:
+ rephachures(t)
+ fi
+enddef;
+
+vardef rephachures(expr pas,angle)=
+ image(%
+ for i=floor(-_diag_/(2*pas)) upto ceiling(_diag_/(2*pas)):
+ olddraw ((-_diag_/2,0)--(_diag_/2,0)) shifted (0,i*pas);
+ endfor) rotated angle shifted center _cart(cadre)
+enddef;
+
+numeric pervagues,ampvagues,decvagues;
+pervagues=20;ampvagues=3;decvagues=10;
+
+vardef vagues(text t)=
+ if long_texte(t)=0:
+ repvagues(pervagues,ampvagues,decvagues)
+ else:
+ repvagues(t)
+ fi
+enddef;
+
+
+vardef repvagues(expr per,amp,dec)= %D'après le manuel de l'utilisateur de MetaPost
+ image(%
+ for j=0 upto _hautcadre_/dec:
+ for i=0 upto _largcadre_/amp:
+ olddraw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec);
+ endfor;
+ endfor) shifted llcorner _cart(cadre)
+enddef;
+
+
+primarydef p avec c =
+ begingroup
+ save _des_;
+ picture _des_;
+ _des_:=c;
+ clip _des_ to (p transformed _T);
+ _des_
+ endgroup
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DIVERS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string LaTeX_packages[],LaTeX_preamble,LaTeX_inputenc;
+LaTeX_preamble:="";LaTeX_inputenc:="";
+
+numeric n_packages;
+n_packages:=0;
+
+def LaTeX_AjoutPackage(expr t)=
+ latexmp_packages:=latexmp_packages & "," & t
+enddef;
+
+def LaTeX_AjoutCommande(expr t)=
+ LaTeX_preamble:=LaTeX_preamble & t
+enddef;
+
+def LaTeX_Encodage(expr t)=
+ LaTeX_inputenc:= t
+enddef;
+
+
+
+boolean LaTeXprem;
+LaTeXprem:=true;
+
+def LaTeXsetup =
+ if LaTeXprem:
+ LaTeXprem:=false;
+ latexmp_preamble:=LaTeX_preamble;
+ latexmp_inputenc:=LaTeX_inputenc;
+ if latexmp_inputenc="": latexmp_inputenc:="utf8" fi;
+ if latexmp_packages="": latexmp_packages:="fourier" fi;
+ latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[french]";
+ latexmp_preamble:=latexmp_preamble & "\newcommand{\vect}[1]{\vv{#1}}" & "\newcommand{\calc}{\mathscr{C}}" & "\newcommand{\calp}{\mathscr{P}}" & "\DecimalMathComma" ;
+ fi
+enddef;
+
+vardef LaTeX primary sc =
+ if known mplib: textext(sc) scaled defaultscale
+ else: LaTeXsetup; textext(sc) scaled defaultscale
+ fi
+enddef;
+%vardef LaTeX primary sc =
+% LaTeXsetup; textext(sc) scaled defaultscale
+%enddef;
+
+
+% Mai 2017
+% Légende avec flèche
+vardef thelegende@#(expr lab,p) =
+ image(%
+ label@#(lab,point 0 of p);
+ drawarrow p)
+enddef;
+
+def legende = draw thelegende enddef;
+
+
+%%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%%
+def figureinter=
+ clip currentpicture to (cadre transformed _T);
+ shipit;
+ _nfig:=_nfig+1;
+ charcode:=charcode+1;
+enddef;
+
+
+
+def epaisseur=withpen pencircle scaled enddef;
+def couleur=withcolor enddef;
+
+
+vardef long_texte(text t)=
+ save i;
+ numeric i;
+ i:=0;
+ for n=t: i:=i+1; endfor
+ i
+enddef;
+
+vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre
+ save c,d;
+ string c,d;
+ d:= str s;
+ if length(d)=1:
+ c:=d
+ elseif isdigit (substring (1,2) of d):
+ c:= (substring (0,1) of d) & "_{" & substring (1,infinity) of d & "}"
+ else: c:=str s
+ fi;
+ c
+enddef;
+
+
+%%%%%%%%%%%%%%% MATHS %%%%%%%%%%%%%%%%%
+
+vardef arrondi(expr p,x)= %arrondi de x au p-ième
+ round((x-floor(x))*p)/p+floor(x)
+enddef;
+
+vardef arrondimil(expr x)=
+ arrondi(1000,x)
+enddef;
+
+vardef pgcd(expr a,b)=
+ save r_,a_,b_;
+ numeric r_,a_,b_;
+ a_=a;b_=b;
+ forever:
+ r_:=a_ mod b_;
+ exitif r_=0;
+ a_:=b_;
+ b_:=r_;
+ endfor;
+ b_
+enddef;
+
+vardef factorielle(expr n)= % Calcul de n!
+ save $;
+ numeric $;
+ $:= 1 for i=1 upto n: * i endfor;
+ $
+enddef;
+
+vardef binom(expr n,k)= % calcul du coefficient binomial k parmi n
+ save $,p;
+ numeric $,p;
+ p:= min(k,n-k);
+ $:=1;
+ for i=1 upto p:
+ $:= ($*(n-i+1))/i;
+ endfor
+ $
+enddef;
+
+vardef binomiale(expr n,p,k)=
+ save $,ktmp,ptmp;
+ numeric $,ktmp,ptmp;
+ if k>n-k:
+ ktmp:=n-k;
+ ptmp:=1-p
+ else:
+ ktmp:=k;
+ ptmp:=p
+ fi;
+ $:=1;
+ for i=1 upto ktmp:
+ $:=((n-i+1)/i)*ptmp*$;
+ endfor
+ for i=1 upto n-ktmp:
+ $:=$*(1-ptmp);
+ endfor
+ $
+enddef;
+
+% Mai 2017
+% P(X=k) pour X suivant la loi de Poisson de paramètre lambda
+vardef poisson(expr lambda,k)=
+ exp(-lambda)
+ for i=1 upto k:
+ *(lambda/i)
+ endfor
+enddef;
+
+%%%%%%%%%%%%%%% COULEURS %%%%%%%%%%%%%%%%%%%
+cmykcolor Rouge,Vert,Bleu,Marron,Lime,Orange,Rose,Pourpre,Violet,Cyan,Magenta,Jaune,Olive,Noir,Grisfonce,Gris,Grisclair,Blanc,Beige,Marine,Moutarde,Vertfonce;
+
+Rouge:=(0,1,1,0);
+Vert:=(1,0,1,0);
+Bleu:=(1,1,0,0);
+Marron:=(0,0.53,1,0.65);
+Lime:=(0.38,0,0.78,0.01);
+Orange:=(0,0.5,1,0);
+Rose:=(0,0.57,0.38,0.01);
+Pourpre:=(0,0.91,0.59,0.38);
+Violet:=(0.5,1,0,0.4);
+Cyan:=(1,0,0,0);
+Magenta:=(0,1,0,0);
+Jaune:=(0,0,1,0);
+Olive:=(0.21,0,0.75,0.45);
+Noir:=(0,0,0,1);
+Grisfonce:=(0,0,0,0.75);
+Gris:=(0,0,0,0.5);
+Grisclair:=(0,0,0,0.25);
+Blanc:=(0,0,0,0);
+Beige:=(0,0.14,0.37,0.22);
+Marine:=(1,1,0,0.5);
+Moutarde:=(0.04,0,1,0.19);
+Vertfonce:=(1,0,1,0.5);
+
+
+vardef conversion_cmyn_rvb(expr coul)=
+ ((1-cyanpart coul)*(1-blackpart coul),(1-magentapart coul)*(1-blackpart coul),(1-yellowpart coul)*(1-blackpart coul))
+enddef;
+
+color rouge,vert,bleu,marron,lime,orange,rose,pourpre,violet,cyan,magenta,jaune,olive,noir,grisfonce,gris,grisclair,blanc,beige,marine,moutarde,vertfonce;
+
+rouge:=conversion_cmyn_rvb(Rouge);
+vert:=conversion_cmyn_rvb(Vert);
+bleu:=conversion_cmyn_rvb(Bleu);
+marron:=conversion_cmyn_rvb(Marron);
+lime:=conversion_cmyn_rvb(Lime);
+orange:=conversion_cmyn_rvb(Orange);
+rose:=conversion_cmyn_rvb(Rose);
+pourpre:=conversion_cmyn_rvb(Pourpre);
+violet:=conversion_cmyn_rvb(Violet);
+cyan:=conversion_cmyn_rvb(Cyan);
+magenta:=conversion_cmyn_rvb(Magenta);
+jaune:=conversion_cmyn_rvb(Jaune);
+olive:=conversion_cmyn_rvb(Olive);
+noir:=conversion_cmyn_rvb(Noir);
+grisfonce:=conversion_cmyn_rvb(Grisfonce);
+gris:=conversion_cmyn_rvb(Gris);
+grisclair:=conversion_cmyn_rvb(Grisclair);
+blanc:=conversion_cmyn_rvb(Blanc);
+beige:=conversion_cmyn_rvb(Beige);
+marine:=conversion_cmyn_rvb(Marine);
+moutarde:=conversion_cmyn_rvb(Moutarde);
+vertfonce:=conversion_cmyn_rvb(Vertfonce);
+
diff --git a/graphics/metapost/contrib/macros/roundrect/CHANGES b/graphics/metapost/contrib/macros/roundrect/CHANGES
new file mode 100644
index 0000000000..bf7566e20a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/CHANGES
@@ -0,0 +1,19 @@
+v2.2, released on 19 February 2016: added the ability to
+include arbitrary packages (or indeed, arbitrary TeX
+definitions) for typesetting labels, with the string
+rrusepackage.
+
+v2.1, released on 7 August 2015: incremental improvements.
+Added in dropshadows and parameters for controlling them.
+Updated and rearranged the documentation.
+
+v2.0, released on 1 August 2015: complete rewrite. The
+code is much cleaner and works better and more consistently.
+Removed all the "titlebar" options; it's better to form such
+things out of an entirely separate rectangle. Much more
+granular control over appearance. Also several
+"convenience" macros to allow adjusting multiple, related
+settings at one time.
+
+v1.0, released on 29 July 2015: initial release. All basic
+functionality implemented.
diff --git a/graphics/metapost/contrib/macros/roundrect/README b/graphics/metapost/contrib/macros/roundrect/README
new file mode 100644
index 0000000000..6cd870a773
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/README
@@ -0,0 +1,24 @@
++AMDG
+
+This document is copyright 11EE (2015) by Donald P. Goodman, and is
+released publicly under the LaTeX Project Public License. The
+distribution and modification of this work is constrained by the
+conditions of that license. See
+ http://www.latex-project.org/lppl.txt
+for the text of the license. This document is released
+under version 1.3 of that license, and this work may be distributed
+or modified under the terms of that license or, at your option, any
+later version.
+
+This work has the LPPL maintenance status 'maintained'.
+
+The Current Maintainer of this work is Donald P. Goodman
+(dgoodmaniii@gmail.com).
+
+This work consists of the files roundrect.dtx and roundrect.ins,
+along with the generated files roundrect.mp and roundrect.pdf,
+along with this README.
+
+The roundrect macros for Metapost provide ways to produce
+rounded rectangles, which may or may not contain or text.
+They are extremely configurable.
diff --git a/graphics/metapost/contrib/macros/roundrect/lppl.txt b/graphics/metapost/contrib/macros/roundrect/lppl.txt
new file mode 100644
index 0000000000..2244313901
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/lppl.txt
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/graphics/metapost/contrib/macros/roundrect/roundrect.dtx b/graphics/metapost/contrib/macros/roundrect/roundrect.dtx
new file mode 100644
index 0000000000..20abd6dbbf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/roundrect.dtx
@@ -0,0 +1,737 @@
+% \iffalse
+% +AMDG This document was begun on 1E June 11EE, the vigil
+% of the Nativity of St. John the Baptist, and it is humbly
+% dedicated to him and to the Immaculate Heart of Mary, for
+% their prayers, and to the Sacred Heart of Jesus, for His
+% mercy.
+%
+% This document is copyright 2015 by Donald P. Goodman, and is
+% released publicly under the LaTeX Project Public License. The
+% distribution and modification of this work is constrained by the
+% conditions of that license. See
+% http://www.latex-project.org/lppl.txt
+% for the text of the license. This document is released
+% under version 1.3 of that license, and this work may be distributed
+% or modified under the terms of that license or, at your option, any
+% later version.
+%
+% This work has the LPPL maintenance status 'maintained'.
+%
+% The Current Maintainer of this work is Donald P. Goodman
+% (dgoodmaniii@gmail.com).
+%
+% This work consists of the files roundrect.dtx and
+% roundrect.ins, along with the generated file roundrect.mp
+% and roundrect.pdf, and the README.
+% \fi
+
+% \iffalse
+%<*driver>
+
+\documentclass{ltxdoc}
+\usepackage{docmfp}
+\usepackage{url}
+\usepackage[typeone]{dozenal}
+\usepackage{verbatim}
+\usepackage{mflogo}
+\usepackage[everymp={input roundrect;},latex]{gmp}
+\usepackage{makeidx}
+\makeindex
+\def\hanger{\parindent=0em\hangindent=2em\hangafter=1}
+\def\thepar#1{\hbox{\parbox{0.5\linewidth}{\hanger\raggedright\ttfamily #1}}}
+\long\def\demonstrate#1#2{%
+ \bigskip%
+ \hrule%
+ \hbox to\linewidth{%
+ \hbox to0.5\linewidth{%
+ \vbox to2in{\vfil#1\vfil}%
+ }\hbox to0.5\linewidth{%
+ \vbox to2in{\vfil#2\vfil}%
+ }%
+ }%
+ \hrule%
+ \bigskip%
+}
+
+\begin{document}
+\DocInput{roundrect.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The \texttt{roundrect} Macros, v2.2}
+% \author{Donald P.\ Goodman III}
+% \date{\today}
+%
+% \maketitle
+% \begin{abstract}\noindent
+% The |roundrect| macros for \MP\ provide extremely
+% configurable, extremely versatile rectangles (including
+% rounded corners), intended primarily for inclusion in
+% documents produced by \TeX\ and friends. The idea was to
+% provide a \MP-based replacement for the incredibly
+% versatile |tcolorbox| package; the macros are far from
+% achieving that goal. But they are nevertheless extremely
+% useful.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% While Ti\textit{k}Z and its many accompanying packages,
+% particularly |tcolorbox|, are wonderful and powerful
+% tools, whenever using them I inevitably feel completely
+% lost, and I exert great effort doing comparatively simple
+% things. Contrariwise, thanks to my experience with the
+% |drm| and |dozenal| packages, writing in \MP\ is quite
+% straightforward for me. So I decided to try to write some
+% generalized macros to provide functionality similar to
+% that of |tcolorbox|. It's not even close to that kind of
+% flexibility or power, but it's still quite useful and
+% versatile, so I make it available for anyone who might be
+% interested.
+%
+% This document was typeset in accordance with the
+% |docstrip| utility, which allows the automatic extraction
+% of code and documentation from the same document.
+%
+% \section{Prerequisites and Conventions}
+%
+% Some prerequesites for using this package are \MP\ itself
+% (obviously). If you're using the package with \LaTeX, the
+% |gmp| package would probably be helpful; be sure to use
+% the |latex| package option. Finally, the
+% package internally calls |TEX.mp|, so that is also
+% required. All of these should be packaged in any
+% reasonably modern \LaTeX\ system, such as \TeX Live or
+% Mik\TeX.
+%
+% This documentation assumes nothing about your personal
+% \TeX\ or \MP\ environment. Con\TeX t and the various
+% forms of Lua\TeX\ have \MP\ built-in; with pdf\LaTeX, the
+% author's choice, one can use the |gmp| package to
+% include the source directly in one's document (that's
+% what's been done in this documentation) or develop a
+% simple script to compile them afterwards and include them
+% in the source via |\includegraphics| (probably the
+% quickest option, since compilation is done in advance).
+% Here, we simply post the plain vanilla \MP\ code, and let
+% you work out those details however you prefer.
+%
+% \section{Shapes and Styles}
+%
+% The core of all the action is the
+% \DescribeMacro{roundrect}|roundrect| macro; this
+% will set up your rounded rectangle in the plainest
+% way possible. The first argument is the box's height, the
+% second its width, and the third its name, by which you
+% will draw it later:
+%
+% \demonstrate{%
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% All the corners don't \emph{have} to be rounded; we can
+% make them square if we want. To do things like this, we
+% use the macro
+% \DescribeMacro{rrborderrad()}|rrborderrad()|, which takes
+% a single argument giving the border radius we want; that
+% is, how rounded we want the corners of our rectangle.
+% Higher values will be more rounded, lower values will be
+% less:
+%
+% \demonstrate{%
+% \thepar{rrborderrad(10pt);}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrborderrad(10pt);
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% Notice that the corners in this, with |rrborderrad()| set
+% to |10pt|, are much less rounded than the previous
+% example. The default border radius is |40pt|, which is
+% quite rounded.
+%
+% |rrborderrad()| provides an easy way to set the border
+% radius of all four corners at once; however, we can also
+% control each corner individually, with
+% \DescribeMacro{rrtoplftborderrad}|rrtoplftborderrad|,
+% \DescribeMacro{rrbotlftborderrad}|rrbotlftborderrad|,
+% \DescribeMacro{rrtoprtborderrad}|rrtoprtborderrad|, and
+% \DescribeMacro{rrbotrtborderrad}|rrbotrtborderrad|, which
+% are parameters rather than macros; that is, we define them
+% using |:=| rather than as an argument in parentheses:
+%
+% \demonstrate{%
+% \thepar{rrtoplftborderrad := 20pt;}
+% \thepar{rrbotlftborderrad := 40pt;}
+% \thepar{rrtoprtborderrad := 10pt;}
+% \thepar{rrbotrtborderrad := 60pt;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrtoplftborderrad := 20pt;
+% rrbotlftborderrad := 40pt;
+% rrtoprtborderrad := 10pt;
+% rrbotrtborderrad := 60pt;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% As you can see, this makes it possible to create a large
+% variety of shapes, including the ability to arbitrarily
+% flatten any side of the rectangle desired just by setting
+% the border radius of the appropriate corners to |0pt|:
+%
+% \demonstrate{%
+% \thepar{rrtoplftborderrad := 0pt;}
+% \thepar{rrtoprtborderrad := 0pt;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrtoplftborderrad := 0pt;
+% rrtoprtborderrad := 0pt;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% Here, we've flattened the top border by setting the top
+% right and top left corners' border radii to |0pt|.
+% This ability to flatten any given side of the rectangle
+% makes it much easier to combine multiple rectangles into
+% interesting forms, which we'll see a bit more about later.
+%
+% \section{Coloring the Parts}
+% \label{sect:colorpart}
+%
+% The colors of the |roundrect| are extremely configurable,
+% both on the whole and for individual parts. The
+% background color of the |roundrect| is controlled by
+% \DescribeMacro{rrinnercolor}|rrinnercolor|, while the
+% border is colored by
+% \DescribeMacro{rrbordercolor}|rrbordercolor()|.
+%
+% \demonstrate{%
+% \thepar{rrbordercolor(blue);}
+% \thepar{rrinnercolor := red;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbordercolor(blue);
+% rrinnercolor := red;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% By default, |rrinnercolor| is white and |rrbordercolor| is
+% black. Notice that |rrbordercolor| is a \emph{macro}, not
+% a parameter; that's because each border can be
+% individually colored, and this macro simply does all of
+% them at once. We'll see more about that later.
+%
+% You can also completely suppress the border by using
+% \DescribeMacro{rrnotop}|rrnotop|,
+% \DescribeMacro{rrnobot}|rrnobot|,
+% \DescribeMacro{rrnolft}|rrnolft|, and
+% \DescribeMacro{rrnort}|rrnort|, which is particularly
+% useful when you want to combine multiple rectangles
+% without making an obvious border between them. You can
+% combine these in any way you like:
+%
+% \demonstrate{%
+% \thepar{rrbordercolor(blue);}
+% \thepar{rrinnercolor := red;}
+% \thepar{rrnotop := true;}
+% \thepar{rrnobot := true;}
+% \thepar{rrborderrad(0pt);}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbordercolor(blue);
+% rrinnercolor := red;
+% rrnotop := true;
+% rrnobot := true;
+% rrborderrad(0pt);
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% Here we've squared all the corners to make it easier to
+% see what's going on.
+%
+% Each border can be colored individually and separately
+% from the others, using the commands you'd expect:
+%
+% \demonstrate{%
+% \thepar{rrtopbordercolor := blue;}
+% \thepar{rrbotbordercolor := green;}
+% \thepar{rrlftbordercolor := red;}
+% \thepar{rrrtbordercolor := black;}
+% \thepar{rrborderrad(20pt);}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrtopbordercolor := blue;
+% rrbotbordercolor := green;
+% rrlftbordercolor := red;
+% rrrtbordercolor := black;
+% rrborderrad(20pt);
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% There is obviously some difficulty in determining what
+% part of each rounded corner should be colored how; this
+% ability is typically more useful with a single, flattened
+% side, to help it blend in better when combined with other
+% constructs:
+%
+% \demonstrate{%
+% \thepar{rrbordercolor(black);}
+% \thepar{rrbotbordercolor := green;}
+% \thepar{rrinnercolor := red;}
+% \thepar{rrborderrad(20pt);}
+% \thepar{rrbotlftborderrad := 0pt;}
+% \thepar{rrbotrtborderrad := 0pt;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbordercolor(black);
+% rrbotbordercolor := green;
+% rrinnercolor := red;
+% rrborderrad(20pt);
+% rrbotlftborderrad := 0pt;
+% rrbotrtborderrad := 0pt;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% Perhaps you don't like the border; you'd like it thicker,
+% or drawn with a square rather than a circular pen. You're
+% in luck; \DescribeMacro{rrborderpen()}|rrborderpen()|
+% takes the single argument of the pen you'd like to draw
+% the border with, defined like any other \MP\ pen:
+%
+% \demonstrate{%
+% \thepar{rrborderpen(pensquare scaled 3);}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrborderpen(pensquare scaled 3);
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% The default border pen is |pencircle scaled 1.5|, so this
+% results in a square pen rather than a circular one, twice
+% as thick. You can also use individual pens for each
+% border, as expected:
+%
+% \demonstrate{%
+% \thepar{rrbotlftborderrad := 0pt;}
+% \thepar{rrbotrtborderrad := 0pt;}
+% \thepar{rrbotbordercolor := green;}
+% \thepar{rrbotborderpen := pensquare yscaled 6;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbotlftborderrad := 0pt;
+% rrbotrtborderrad := 0pt;
+% rrbotbordercolor := green;
+% rrbotborderpen := pensquare yscaled 6;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% Here we've flattened the bottom border, colored it green,
+% and drawn it with a square pen scaled on the y-axis only
+% by 6. Clearly, there are huge possibilities here.
+%
+% \section{Drop Shadows}
+% \label{sect:dropshadows}
+%
+% We can also put a \emph{shadow} on the boxes using
+% \DescribeMacro{rrdropshadow}|rrdropshadow|, a boolean
+% value which defaults to |false|:
+%
+% \demonstrate{%
+% \thepar{rrdropshadow := true;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrdropshadow := true;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% The drop shadow always mimics the shape of the box itself;
+% there is presently no way to avoid that. If for some
+% reason you want to, you'll have to create a separate
+% |roundrect| and place it manually.
+%
+% We can control the size and direction of the drop shadow
+% fairly easily, however, along with its color. Its color
+% is controlled by
+% \DescribeMacro{rrshadowcolor}|rrshadowcolor|, which
+% can be set to any arbitrary \MP\ color:
+%
+% \demonstrate{%
+% \thepar{rrdropshadow := true;}
+% \thepar{rrshadowcolor := blue;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrdropshadow := true;
+% rrshadowcolor := blue;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }%
+%
+% The position of the drop shadow is governed by
+% \DescribeMacro{rrshadowx}|rrshadowx| and
+% \DescribeMacro{rrshadowy}|rrshadowy|, which will shift the
+% |roundrect| on the |x| or |y| axis, respectively. By
+% default, these are set to one quarter of the border radius
+% in effect for the bottom left corner:
+%
+% \demonstrate{%
+% \thepar{rrdropshadow := true;}
+% \thepar{rrshadowcolor := blue;}
+% \thepar{rrshadowx := -rrbotlftborderrad/4;}
+% \thepar{rrshadowy := rrbotlftborderrad/4;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrdropshadow := true;
+% rrshadowcolor := blue;
+% rrshadowx := -rrbotlftborderrad/4;
+% rrshadowy := rrbotlftborderrad/4;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle shifted (1in,0.5in);
+% \end{mpost}
+% }%
+%
+% \section{Including Text}
+% \label{sect:text}
+%
+% Finally, we can put text in the rectangles; this is as
+% configurable as everything else:
+%
+% \demonstrate{%
+% \thepar{rrbodytext := "Let's put some text into this rectangle and see if it typesets correctly!";}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbodytext := "Let's put some text into this rectangle and see if it typesets correctly!";
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% The font and style of the text can be controlled with
+% \DescribeMacro{rrtextfont}|rrtextfont|, and the color of
+% the text can be controlled with
+% \DescribeMacro{rrtextcolor}|rrtextcolor|:
+%
+% \demonstrate{%
+% \thepar{rrbodytext := "Text in a label";}
+% \thepar{rrtextcolor := green;}
+% \thepar{rrtextalign := "$\backslash$raggedleft";}
+% \thepar{rrtextfont := "$\backslash$fontsize{17pt}{19pt}$\backslash$ selectfont$\backslash$ itshape";}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbodytext := "Text in a label";
+% rrtextcolor := green;
+% rrtextalign := "\unexpanded{\raggedleft}";
+% rrtextfont := "\unexpanded{\fontsize{17pt}{19pt}\selectfont\itshape"};
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% We also used, without explaining it first,
+% \DescribeMacro{rrtextalign}|rrtextalign|, which allows
+% insertion of text alignment commands. This can also be
+% inserted in the |rrtextfont| variable, but it seemed
+% logical to have a separate parameter for it. It's default
+% is |\centering|.
+%
+% The width of the text is governed by
+% \DescribeMacro{rrtextwd}|rrtextwd|, which defaults to the
+% same width as the rectangle with a |3pt| buffer on either
+% side. The buffer is not directly controllable, but the
+% width can be set however you like:
+%
+% \demonstrate{%
+% \thepar{rrbodytext := "Let's put some text into this rectangle and see if it typesets correctly!";}
+% \thepar{rrtextwd := 80pt;}
+% \thepar{roundrect(1in,2in)(rectangle);}
+% \thepar{draw rectangle;}
+% }{%
+% \begin{mpost}
+% rrbodytext := "Let's put some text into this rectangle and see if it typesets correctly!";
+% rrtextwd := 80pt;
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% Finally, to restore all these values to the default, use
+% the |rrrestorevals;| directive. This will clear
+% everything to default so you can have a completely
+% different |roundrect| in the same figure.
+%
+% \section{Using External Packages in Text}
+%
+% Frequently, of course, the |rrtextfont| options will be
+% either insufficient or overly cumbersome for your needs.
+% For example, you might want \emph{all} the text in your
+% labels to be in a different font; to match your main body
+% font, for example.
+%
+% |roundrect| offers
+% \DescribeMacro{rrusepackage}|rrusepackage| for this
+% purpose. It is a string, designed specifically for the
+% purpose of including arbitrary \LaTeX\ packages for
+% typesetting text. For example, if your main body font is
+% EB Garamond, the easiest way to get your text to match
+% that is to ask \MP\ to use the |ebgaramond| package when
+% it typesets:
+%
+% \demonstrate{%
+% \thepar{rrusepackage := "$\backslash$usepackage\{ebgaramond\}";\hfill\break}
+% \thepar{rrbodytext := "This is $\backslash$textsw\{EB\} Garamond, not Computer Modern.";\hfill\break}
+% \thepar{roundrect(1in,2in)(rectangle);\hfill\break}
+% \thepar{draw rectangle;\hfill\break}
+% }{%
+% \begin{mpost}
+% rrbodytext := "This is \unexpanded{\textsw{EB}} Garamond, not Computer Modern.";
+% rrusepackage := "\unexpanded{\usepackage{ebgaramond}}";
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% Notice that |rrusepackage := "\usepackage{ebgaramond}";|
+% takes care of changing the body font \emph{and} of
+% defining the |\textsw| environment (itself defined in
+% |ebgaramond|), which we would otherwise have to do
+% separately.
+%
+% To switch this back, simply reset the string to empty:
+%
+% \demonstrate{%
+% \thepar{rrusepackage := "";\hfill\break}
+% \thepar{rrbodytext := "This is Computer Modern, not EB Garamond.";\hfill\break}
+% \thepar{roundrect(1in,2in)(rectangle);\hfill\break}
+% \thepar{draw rectangle;\hfill\break}
+% }{%
+% \begin{mpost}
+% rrbodytext := "This is Computer Modern, not EB Garamond.";
+% rrusepackage := "";
+% roundrect(1in,2in)(rectangle);
+% draw rectangle;
+% \end{mpost}
+% }
+%
+% Using color commands (e.g., from |color| or |xcolor|) will
+% not throw errors, provided the appropriate package is
+% included; however, it will not work. This seems to be an
+% unavoidable consequence of the way that |TEX.mp| works;
+% \TeX\ |\special| commands are destroyed in the process,
+% and there isn't really a robust way to do it without this
+% effect.
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+input TEX;
+color rrinnercolor; rrinnercolor := white;
+numeric rrtoprtborderrad; rrtoprtborderrad := 40pt;
+numeric rrbotrtborderrad; rrbotrtborderrad := 40pt;
+numeric rrbotlftborderrad; rrbotlftborderrad := 40pt;
+numeric rrtoplftborderrad; rrtoplftborderrad := 40pt;
+numeric rrtextwd; rrtextwd := 0;
+numeric rrshadowx; rrshadowx := rrbotrtborderrad/4;
+numeric rrshadowy; rrshadowy := -rrbotrtborderrad/4;
+string rrtextfont; rrtextfont := "\fontsize{10pt}{12pt}\selectfont ";
+color rrtextcolor; rrtextcolor := black;
+string rrbodytext; rrbodytext := "";
+string rrtextalign; rrtextalign := "\centering";
+string rrusepackage; rrusepackage := "";
+boolean rrnotop; rrnotop := false;
+boolean rrnobot; rrnobot := false;
+boolean rrnolft; rrnolft := false;
+boolean rrnort; rrnort := false;
+boolean rrdropshadow; rrdropshadow := false;
+color rrtopbordercolor; rrtopbordercolor := black;
+color rrbotbordercolor; rrbotbordercolor := black;
+color rrlftbordercolor; rrlftbordercolor := black;
+color rrrtbordercolor; rrrtbordercolor := black;
+color rrshadowcolor; rrshadowcolor := black;
+def rrbordercolor(expr x) =
+ rrtopbordercolor := x;
+ rrbotbordercolor := x;
+ rrlftbordercolor := x;
+ rrrtbordercolor := x;
+enddef;
+def rrborderrad(expr x) =
+ rrtoplftborderrad := x;
+ rrbotlftborderrad := x;
+ rrtoprtborderrad := x;
+ rrbotrtborderrad := x;
+enddef;
+pen rrtopborderpen; rrtopborderpen := pencircle scaled 1.5;
+pen rrbotborderpen; rrbotborderpen := pencircle scaled 1.5;
+pen rrlftborderpen; rrlftborderpen := pencircle scaled 1.5;
+pen rrrtborderpen; rrrtborderpen := pencircle scaled 1.5;
+def rrborderpen(expr x) =
+ rrtopborderpen := x;
+ rrbotborderpen := x;
+ rrlftborderpen := x;
+ rrrtborderpen := x;
+enddef;
+def rrrestorevals =
+ rrborderrad(40pt);
+ rrbordercolor(black);
+ rrborderpen(pencircle scaled 1.5);
+ rrinnercolor := white;
+ rrnotop := false;
+ rrnobot := false;
+ rrnolft := false;
+ rrnort := false;
+ rrtextwd := 0;
+ rrtextfont := "\fontsize{10pt}{12pt}\selectfont ";
+ rrtextcolor := black;
+ rrbodytext := "";
+ rrtextalign; rrtextalign := "\centering";
+ rrdropshadow := false;
+ rrshadowcolor := black;
+ rrshadowx := rrbotrtborderrad/4;
+ rrshadowy := -rrbotrtborderrad/4;
+enddef;
+def roundrect(expr rrht, rrwd)(suffix name) =
+ TEXPRE("%&latex" & char(10) & "\documentclass{article}" & rrusepackage & "\begin{document}");
+ TEXPOST("\end{document}");
+ if (rrtextwd = 0):
+ rrtextwd := rrwd - 12pt;
+ fi
+ path rra; path rrb; path rrc; path rrd;
+ pair a; pair b; pair c; pair d;
+ a := (0,0) shifted (-rrwd/2,-rrht/2);
+ b := (0,0) shifted (rrwd/2,-rrht/2);
+ c := (0,0) shifted (rrwd/2,rrht/2);
+ d := (0,0) shifted (-rrwd/2,rrht/2);
+ rra := fullcircle scaled rrbotlftborderrad shifted (xpart a +
+ (rrbotlftborderrad/2),ypart a + (rrbotlftborderrad/2));
+ rrb := fullcircle scaled rrbotrtborderrad shifted (xpart b -
+ (rrbotrtborderrad/2),ypart b + (rrbotrtborderrad/2));
+ rrd := fullcircle scaled rrtoplftborderrad shifted (xpart d +
+ (rrtoplftborderrad/2),ypart d - (rrtoplftborderrad/2));
+ rrc := fullcircle scaled rrtoprtborderrad shifted (xpart c -
+ (rrtoprtborderrad/2),ypart c - (rrtoprtborderrad/2));
+ pair f; f := (a--b) intersectionpoint rra;
+ pair g; g := (a--b) intersectionpoint rrb;
+ pair h; h := (b--c) intersectionpoint rrb;
+ pair i; i := (b--c) intersectionpoint rrc;
+ pair j; j := (c--d) intersectionpoint rrc;
+ pair k; k := (c--d) intersectionpoint rrd;
+ pair l; l := (d--a) intersectionpoint rrd;
+ pair m; m := (d--a) intersectionpoint rra;
+ picture name;
+ picture border;
+ picture rrtext;
+ pair n; pair o;
+ path rrtoplftcorner; path rrbotlftcorner;
+ path rrtoprtcorner; path rrbotrtcorner;
+ path rrtopborder; path rrbotborder;
+ path rrlftborder; path rrrtborder;
+ rrtoplftcorner := l{up}..{right}k;
+ rrtoprtcorner := j{right}..{down}i;
+ rrbotrtcorner := h{down}..{left}g;
+ rrbotlftcorner := f{left}..{up}m;
+ rrtopborder := rrtoplftcorner--rrtoprtcorner;
+ rrbotborder := rrbotrtcorner--rrbotlftcorner;
+ rrlftborder := rrbotlftcorner--rrtoplftcorner;
+ rrrtborder := rrtoprtcorner--rrbotrtcorner;
+ picture rrdropshadowpic;
+ if (rrdropshadow = true):
+ rrdropshadowpic := image(fill rrtoplftcorner--rrtoprtcorner--
+ rrbotrtcorner--rrbotlftcorner--cycle
+ shifted (rrshadowx,rrshadowy) withcolor
+ rrshadowcolor);
+ else:
+ rrdropshadowpic := currentpicture;
+ fi
+ name := currentpicture;
+ addto name also rrdropshadowpic;
+ rrdropshadowpic := image(fill rrtoplftcorner--rrtoprtcorner--
+ rrbotrtcorner--rrbotlftcorner--cycle withcolor
+ rrinnercolor);
+ addto name also rrdropshadowpic;
+% name := image(fill rrtoplftcorner--rrtoprtcorner--
+% rrbotrtcorner--rrbotlftcorner--cycle withcolor
+% rrinnercolor);
+ picture rrtmpborder;
+ border := currentpicture;
+ if (rrnotop = false):
+ rrtmpborder := image(draw rrtopborder withcolor
+ rrtopbordercolor withpen rrtopborderpen);
+ addto border also rrtmpborder;
+ fi
+ if (rrnobot = false):
+ rrtmpborder := image(draw rrbotborder withcolor
+ rrbotbordercolor withpen rrbotborderpen);
+ addto border also rrtmpborder;
+ fi
+ if (rrnolft = false):
+ rrtmpborder := image(draw rrlftborder withcolor
+ rrlftbordercolor withpen rrlftborderpen);
+ addto border also rrtmpborder;
+ fi
+ if (rrnort = false):
+ rrtmpborder := image(draw rrrtborder withcolor
+ rrrtbordercolor withpen rrrtborderpen);
+ addto border also rrtmpborder;
+ fi
+ addto name also border;
+ rrtext :=
+ image(label(TEX("\parbox{"&decimal(rrtextwd)&"bp}{"&rrtextalign&rrtextfont&" "&rrbodytext&"}"),(0,0)) withcolor rrtextcolor;);
+ addto name also rrtext;
+enddef;
+% \end{macrocode}
diff --git a/graphics/metapost/contrib/macros/roundrect/roundrect.ins b/graphics/metapost/contrib/macros/roundrect/roundrect.ins
new file mode 100644
index 0000000000..df936f0383
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/roundrect.ins
@@ -0,0 +1,69 @@
+% +AMDG This document was begun on 1E June 11EE, the vigil
+% of the Nativity of St. John the Baptist, and it is humbly
+% dedicated to him and to the Immaculate Heart of Mary, for
+% their prayers, and to the Sacred Heart of Jesus, for His
+% mercy.
+%
+% This document is copyright 2015 by Donald P. Goodman, and is
+% released publicly under the LaTeX Project Public License. The
+% distribution and modification of this work is constrained by the
+% conditions of that license. See
+% http://www.latex-project.org/lppl.txt
+% for the text of the license. This document is released
+% under version 1.3 of that license, and this work may be distributed
+% or modified under the terms of that license or, at your option, any
+% later version.
+%
+% This work has the LPPL maintenance status 'maintained'.
+%
+% The Current Maintainer of this work is Donald P. Goodman
+% (dgoodmaniii@gmail.com).
+%
+% This work consists of the files roundrect.dtx and
+% roundrect.ins, along with the generated file roundrect.mp
+% and roundrect.pdf, and the README.
+
+\def\batchfile{roundrect.ins}
+\input docstrip.tex
+
+\preamble
+This is a generated file.
+
+This document is copyright 2015 by Donald P. Goodman, and is
+released publicly under the LaTeX Project Public License. The
+distribution and modification of this work is constrained by the
+conditions of that license. See
+ http://www.latex-project.org/lppl.txt
+for the text of the license. This document is released
+under version 1.3 of that license, and this work may be distributed
+or modified under the terms of that license or, at your option, any
+later version.
+
+This work has the LPPL maintenance status 'maintained'.
+
+The Current Maintainer of this work is Donald P. Goodman
+(dgoodmaniii@gmail.com).
+
+This work consists of the files roundrect.dtx and
+roundrect.ins, along with the generated file roundrect.mp
+and roundrect.pdf, and the README.
+\endpreamble
+
+\keepsilent
+\generate{\file{roundrect.mp}{\from{roundrect.dtx}{package}}}
+
+\Msg{******************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by Metapost:}
+\Msg{*}
+\Msg{* \space\space roundrect.mp}
+\Msg{*}
+\Msg{* To produce the documentation run the file roundrect.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy Metaposting!}
+\Msg{******************************************************}
+
+\endbatchfile
+\endinput
diff --git a/graphics/metapost/contrib/macros/roundrect/roundrect.pdf b/graphics/metapost/contrib/macros/roundrect/roundrect.pdf
new file mode 100644
index 0000000000..06b2d1888a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/roundrect/roundrect.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/shapes/CHANGES b/graphics/metapost/contrib/macros/shapes/CHANGES
new file mode 100644
index 0000000000..9071273923
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/CHANGES
@@ -0,0 +1,6 @@
+v1.1, released on 1 August 2015: updated; now allows ticks
+around the circle of the modular shapes at arbitrary
+intervals. The ticks can be styled by length and pen.
+
+v1.0, released on 18 July 2015: initial release. All basic
+functionality implemented.
diff --git a/graphics/metapost/contrib/macros/shapes/README b/graphics/metapost/contrib/macros/shapes/README
new file mode 100644
index 0000000000..0310f8914c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/README
@@ -0,0 +1,25 @@
++AMDG
+
+This document is copyright 11EE (2015) by Donald P. Goodman, and is
+released publicly under the LaTeX Project Public License. The
+distribution and modification of this work is constrained by the
+conditions of that license. See
+ http://www.latex-project.org/lppl.txt
+for the text of the license. This document is released
+under version 1.3 of that license, and this work may be distributed
+or modified under the terms of that license or, at your option, any
+later version.
+
+This work has the LPPL maintenance status 'maintained'.
+
+The Current Maintainer of this work is Donald P. Goodman
+(dgoodmaniii@gmail.com).
+
+This work consists of the files shapes.dtx and shapes.ins,
+along with the generated files shapes.mp and shapes.pdf,
+along with this README.
+
+The shapes macros for Metapost provide regular polygons,
+their corresponding reentrant stars, and images
+demonstrating fractions. These macros are quite
+configurable.
diff --git a/graphics/metapost/contrib/macros/shapes/lppl.txt b/graphics/metapost/contrib/macros/shapes/lppl.txt
new file mode 100644
index 0000000000..2244313901
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/lppl.txt
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/graphics/metapost/contrib/macros/shapes/shapes.dtx b/graphics/metapost/contrib/macros/shapes/shapes.dtx
new file mode 100644
index 0000000000..9a7c4b2125
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/shapes.dtx
@@ -0,0 +1,471 @@
+% \iffalse
+% +AMDG This document was begun on 1E June 11EE, the vigil
+% of the Nativity of St. John the Baptist, and it is humbly
+% dedicated to him and to the Immaculate Heart of Mary, for
+% their prayers, and to the Sacred Heart of Jesus, for His
+% mercy.
+%
+% This document is copyright 2015 by Donald P. Goodman, and is
+% released publicly under the LaTeX Project Public License. The
+% distribution and modification of this work is constrained by the
+% conditions of that license. See
+% http://www.latex-project.org/lppl.txt
+% for the text of the license. This document is released
+% under version 1.3 of that license, and this work may be distributed
+% or modified under the terms of that license or, at your option, any
+% later version.
+%
+% This work has the LPPL maintenance status 'maintained'.
+%
+% The Current Maintainer of this work is Donald P. Goodman
+% (dgoodmaniii@gmail.com).
+%
+% This work consists of the files shapes.dtx and
+% shapes.ins, along with the generated file shapes.mp
+% and shapes.pdf, and the README.
+% \fi
+
+% \iffalse
+%<*driver>
+
+\documentclass{ltxdoc}
+\usepackage{docmfp}
+\usepackage{url}
+\usepackage[typeone]{dozenal}
+\usepackage{verbatim}
+\usepackage{mflogo}
+\usepackage[everymp={input shapes;},latex]{gmp}
+\usepackage{makeidx}
+\makeindex
+\long\def\demonstrate#1#2{%
+ \bigskip%
+ \hrule%
+ \hbox to\linewidth{%
+ \hbox to0.65\linewidth{%
+ \vbox to1.4in{\vfil#1\vfil}%
+ }\hbox to0.35\linewidth{%
+ \vbox to1.4in{\vfil#2\vfil}%
+ }%
+ }%
+ \hrule%
+ \bigskip%
+}
+
+\begin{document}
+\DocInput{shapes.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The \texttt{shapes} Macros, v1.0}
+% \author{Donald P.\ Goodman III}
+% \date{\today}
+%
+% \maketitle
+% \begin{abstract}\noindent
+% The |shapes| macros for \MP\ provide regular polygons,
+% their corresponding reentrant stars, and images
+% demonstrating fractions. These macros are quite
+% configurable.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The |shapes| macros are not revolutionary, and in fact are
+% quite simple; however, I spent some time generalizing them
+% for a text I'm currently working on, and so I thought they
+% might be useful for the general populace. They are
+% divided into two main groups: regular polygons and their
+% corresponding reentrant star shapes; and fractionals,
+% circles divided into a certain number of parts with the
+% desired fraction filled in.
+%
+% This document was typeset in accordance with the
+% |docstrip| utility, which allows the automatic extraction
+% of code and documentation from the same document.
+%
+% \section{Prerequisites and Conventions}
+%
+% Some prerequesites for using this package are \MP\ itself
+% (obviously). If you're using the package with \LaTeX, the
+% |gmp| package would probably be helpful; be sure to use
+% the |latex| package option.
+% These should be packaged in any
+% reasonably modern \LaTeX\ system, such as \TeX Live or
+% Mik\TeX.
+%
+% This documentation assumes nothing about your personal
+% \TeX\ or \MP\ environment. Con\TeX t and the various
+% forms of Lua\TeX\ have \MP\ built-in; with pdf\LaTeX, the
+% author's choice, one can use the |gmp| package to
+% include the source directly in one's document (that's
+% what's been done in this documentation) or develop a
+% simple script to compile them afterwards and include them
+% in the source via |\includegraphics| (probably the
+% quickest option, since compilation is done in advance).
+% Here, we simply post the plain vanilla \MP\ code, and let
+% you work out those details however you prefer.
+%
+% \section{The Shapes Macros}
+%
+% We begin with the simple shapes macros, which are about as
+% basic as they can be.
+%
+% All of these shapes default to
+% circles with a one inch diameter, so you can scaled them
+% with that kept in mind.
+%
+% The simplest case is with a regular
+% polygon, like so:
+%
+% \demonstrate{%
+% \hbox{|modfig(6,0);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modfig(6,0); draw modfigure;
+% \end{mpost}
+% }%
+%
+% Of course, these drawn figures can be manipulated in the
+% usual ways:
+%
+% \demonstrate{%
+% \hbox{|modfig(6,0);|}
+% \hbox{|draw modfigure rotated (45) withcolor red;|}
+% }{%
+% \begin{mpost}
+% modfig(6,0); draw modfigure rotated (45) withcolor red;
+% \end{mpost}
+% }%
+%
+% The two arguments to |modfig| are simple: the first tells
+% the number of sides desired, while the second means
+% \emph{no numbers are printed} if 0, and \emph{print
+% numbers} if 1:
+%
+% \demonstrate{%
+% \hbox{|modfig(8,1);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modfig(8,1); draw modfigure;
+% \end{mpost}
+% }%
+%
+% If you don't want the circle to be printed, simply tell
+% \MP\ with |modcircle := false;| and it will not print it:
+%
+% \demonstrate{%
+% \hbox{|modcircle := false;|}
+% \hbox{|modfig(8,1);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modcircle := false;
+% modfig(8,1); draw modfigure;
+% \end{mpost}
+% }%
+%
+% |modcircle| defaults to |true|.
+%
+% Notice that |modfig| doesn't care if there's a circle or
+% not; if you want numbers on the vertices, it will print
+% them there.
+%
+% You can adjust the width of the lines by specifying
+% |modcirclepen| and |modshapepen|:
+%
+% \demonstrate{%
+% \hbox{|modcirclepen := pencircle scaled 3;|}
+% \hbox{|modshapepen := pencircle scaled 2;|}
+% \hbox{|modfig(4,0);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modcirclepen := pencircle scaled 3;
+% modshapepen := pencircle scaled 2;
+% modfig(4,0); draw modfigure;
+% \end{mpost}
+% }%
+%
+% Both |modcirclepen| and |modshapepen| default to
+% |pencircle scaled 1|.
+%
+% We can also put ticks around the outside of the circle,
+% at whatever intervals we want. The parameters here are
+% \DescribeMacro{modticks}|modticks|, which is a boolean set
+% to |false| by default. Set it to |true| if you want
+% ticks. You can control the number of ticks with
+% \DescribeMacro{nummodticks}|nummodticks|, which defaults
+% to twelve. You can control the length of those ticks with
+% \DescribeMacro{ticklen}|ticklen|, which defaults to
+% |0.1in|. Finally, you can control the pen that is used to
+% draw the ticks, which is \DescribeMacro{tickpen}|tickpen|,
+% which defaults to |pencircle scaled 1|:
+%
+% \demonstrate{%
+% \hbox{|nummodticks := 6;|}
+% \hbox{|ticklen := 0.2in;|}
+% \hbox{|modticks := true;|}
+% \hbox{|tickpen := pensquare scaled 2;|}
+% \hbox{|modshapepen := pensquare scaled 4;|}
+% \hbox{|modfig(4,0);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% nummodticks := 6;
+% ticklen := 0.2in;
+% modticks := true;
+% tickpen := pensquare scaled 2;
+% modshapepen := pensquare scaled 4;
+% modfig(4,0); draw modfigure;
+% \end{mpost}
+% }%
+%
+% We can do essentially the same thing with reentrant star
+% figures with |modstar|. Unlike |modfig|, |modstar| takes
+% \emph{three} arguments: the number of vertices, whether
+% or not you want those vertices numbered, and how many
+% points you want to skip as you go around the circle.
+%
+% \demonstrate{%
+% \hbox{|modstar(11,1,3);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modstar(11,1,3); draw modfigure;
+% \end{mpost}
+% }%
+%
+% Note that the third argument actually skips $n - 1$
+% points, not $n$ points. But all the same parameters we
+% saw when looking at |modfig| will still work in the same
+% way:
+%
+% \demonstrate{%
+% \hbox{|modcirclepen := pencircle scaled 1;|}
+% \hbox{|modshapepen := pencircle scaled 2;|}
+% \hbox{|modstar(11,1,4);|}
+% \hbox{|draw modfigure;|}
+% }{%
+% \begin{mpost}
+% modcirclepen := pencircle scaled 1;
+% modshapepen := pencircle scaled 2;
+% modstar(11,1,4); draw modfigure;
+% \end{mpost}
+% }%
+%
+% And that's about all there is to it.
+%
+% \section{Fraction Images}
+% \label{sect:fraimg}
+%
+% The following macros are useful for demonstrating the
+% nature and size of fractions in a visible way. The name
+% of the game here is |fraccirc|, which takes two arguments:
+% the number of parts to be filled, and the number of parts
+% in the whole:
+%
+% \demonstrate{%
+% \hbox{|fraccirc(7)(12);|}
+% \hbox{|draw thefrac;|}
+% }{%
+% \begin{mpost}
+% fraccirc(7)(12);
+% draw thefrac;
+% \end{mpost}
+% }
+%
+% Note that, due to the internal implementation, these two
+% arguments must each be enclosed in their own parentheses.
+%
+% We can adjust these things as appropriate. For example,
+% we can fill with blue rather than red, and use thicker
+% lines:
+%
+% \demonstrate{%
+% \hbox{|fracfillcolor := blue;|}
+% \hbox{|fraccirclepen := pencircle scaled 1;|}
+% \hbox{|fractionpen := pencircle scaled 2;|}
+% \hbox{|fraccirc(4)(7);|}
+% \hbox{|draw thefrac;|}
+% }{%
+% \begin{mpost}
+% fracfillcolor := blue;
+% fraccirclepen := pencircle scaled 1;
+% fractionpen := pencircle scaled 2;
+% fraccirc(4)(7);
+% draw thefrac;
+% \end{mpost}
+% }
+%
+% As the above example suggests, |fracfillcolor| gives the
+% color with which the portion of the fraction should be
+% filled; it defaults to |red|. |fraccirclepen| is the pen
+% used to draw the circle around the fraction; it defaults
+% to |pencircle scaled 1.5|. Finally, |fractionpen| is the
+% pen used to draw the partition and the circle immediately
+% surrounding them; it defaults to |pencircle scaled 1|.
+%
+% \section{Implementation}
+% \label{sect:implem}
+%
+% \begin{macrocode}
+color fracfillcolor; fracfillcolor := red;
+pen fraccirclepen; fraccirclepen := pencircle scaled 1.5;
+pen fractionpen; fractionpen := pencircle scaled 1;
+def fraccirc(suffix x)(expr y) =
+ radius := 1in;
+ ticklen := radius/24;
+ path circ; circ := fullcircle scaled radius;
+ pair p[]; pair q[]; pair r[]; pair s[];
+ p[0] := (0,0) shifted (0,radius/2);
+ q[0] := p[0] shifted (0,ticklen);
+ r[0] := p[0] shifted (0,-ticklen);
+ s[0] := r[0];
+ picture thefrac;
+ picture addition;
+ thefrac := image(pickup fraccirclepen; draw circ;);
+ addition := image(pickup fractionpen; draw p[0]--q[0];);
+ addto thefrac also addition;
+ for i=1 upto 12:
+ p[i] := p[i-1] rotatedaround ((0,0),-30);
+ q[i] := q[i-1] rotatedaround ((0,0),-30);
+ addition := image(pickup fractionpen; draw p[i]--q[i];);
+ addto thefrac also addition;
+ endfor;
+ addition := image(pickup fractionpen; draw (0,0)--r[0];);
+ addto thefrac also addition;
+ pair t; pair q;
+ addition := image(
+ t = r[0] rotatedaround ((0,0),-((360/y)*x)/2);
+ q = r[0] rotatedaround ((0,0),-((360/y)*x));
+ fill r[0]--(0,0)--q..t..cycle withcolor fracfillcolor;
+ draw r[0]--(0,0)--q..t..cycle;
+ );
+ addto thefrac also addition;
+ for i=1 upto y:
+ r[i] := r[i-1] rotatedaround ((0,0),-(360/y));
+ s[i] := r[i-1] rotatedaround ((0,0),-(360/y)/2);
+ addition := image(%
+ pickup fractionpen;%
+ draw (0,0)--r[i];
+ draw r[i-1]..s[i]..r[i];
+ );
+ addto thefrac also addition;
+ endfor;
+enddef;
+% put in the pens for the modular shapes
+boolean modcircle; modcircle := true;
+pen modcirclepen; modcirclepen := pencircle scaled 1;
+pen modshapepen; modshapepen := pencircle scaled 1;
+boolean modticks; modticks := false;
+numeric nummodticks; nummodticks := 12;
+numeric ticklen; ticklen := 0.1in;
+pen tickpen; tickpen := pencircle scaled 1;
+def modstar(expr numpoints,numbers,numstar) =
+ picture modfigure;
+ if (modcircle = true):
+ modfigure := image(draw fullcircle scaled 1in withpen modcirclepen;);
+ else:
+ modfigure := image();
+ fi;
+ picture modtickpic;
+ if (modticks = true):
+ modtickpic := image(
+ pair tickstart[]; pair tickend[];
+ tickstart[0] = (0,0) shifted (0,0.5in);
+ tickend[0] = tickstart[0] shifted (0,ticklen);
+ draw tickstart[0]--tickend[0] withpen tickpen;
+ for i=1 upto (nummodticks-1):
+ tickstart[i] = tickstart[i-1] rotatedaround
+ ((0,0), (360/nummodticks));
+ tickend[i] = tickend[i-1] rotatedaround
+ ((0,0), (360/nummodticks));
+ draw tickstart[i]--tickend[i] withpen tickpen;
+ endfor;
+ );
+ addto modfigure also modtickpic;
+ fi
+ pickup modshapepen;
+ pair p[]; pair q[];
+ picture addition;
+ p[0] = (0,0.5in);
+ q[0] = (0,0.6in);
+ if (numbers = 1):
+ addition := image(label("0",q[0]));
+ addto modfigure also addition;
+ fi
+ for i=1 upto numpoints:
+ p[i] = p[i-1] rotatedaround ((0,0),-(360/numpoints));
+ q[i] = q[i-1] rotatedaround ((0,0),-(360/numpoints));
+ if (numbers = 1):
+ if (i <> numpoints):
+ addition := image(label(decimal i,q[i]));
+ addto modfigure also addition;
+ fi
+ fi
+ endfor
+ for i=0 upto numpoints:
+ if (i < numstar):
+ addition := image(%
+ draw p[i]--p[i+numstar];
+ draw p[i]--p[numpoints - numstar + i];
+ );
+ addto modfigure also addition;
+ elseif (i >= (numstar*2)):
+ addition := image(draw p[i-numstar]--p[i]);
+ addto modfigure also addition;
+ fi
+ endfor
+ addto modfigure also addition;
+enddef;
+def modfig(expr numpoints,numbers) =
+ picture modfigure;
+ if (modcircle = true):
+ modfigure := image(draw fullcircle scaled 1in withpen modcirclepen);
+ else:
+ modfigure := image();
+ fi
+ picture modtickpic;
+ if (modticks = true):
+ modtickpic := image(
+ pair tickstart[]; pair tickend[];
+ tickstart[0] = (0,0) shifted (0,0.5in);
+ tickend[0] = tickstart[0] shifted (0,ticklen);
+ draw tickstart[0]--tickend[0] withpen tickpen;
+ for i=1 upto (nummodticks-1):
+ tickstart[i] = tickstart[i-1] rotatedaround
+ ((0,0), (360/nummodticks));
+ tickend[i] = tickend[i-1] rotatedaround
+ ((0,0), (360/nummodticks));
+ draw tickstart[i]--tickend[i] withpen tickpen;
+ endfor;
+ );
+ addto modfigure also modtickpic;
+ fi
+ pair p[]; pair q[];
+ picture addition;
+ pickup modshapepen;
+ p[0] = (0,0.5in);
+ q[0] = (0,0.6in);
+ if (numbers = 1):
+ addition := image(label("0",q[0]));
+ addto modfigure also addition;
+ fi
+ for i=1 upto numpoints:
+ p[i] = p[i-1] rotatedaround ((0,0),-(360/numpoints));
+ q[i] = q[i-1] rotatedaround ((0,0),-(360/numpoints));
+ addition := image(draw p[i-1]--p[i]);
+ addto modfigure also addition;
+ if (numbers = 1):
+ if (i <> numpoints):
+ addition := image(label(decimal i,q[i]));
+ addto modfigure also addition;
+ fi
+ fi
+ endfor;
+enddef;
+% \end{macrocode}
diff --git a/graphics/metapost/contrib/macros/shapes/shapes.ins b/graphics/metapost/contrib/macros/shapes/shapes.ins
new file mode 100644
index 0000000000..d7c4a2f537
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/shapes.ins
@@ -0,0 +1,69 @@
+% +AMDG This document was begun on 1E June 11EE, the vigil
+% of the Nativity of St. John the Baptist, and it is humbly
+% dedicated to him and to the Immaculate Heart of Mary, for
+% their prayers, and to the Sacred Heart of Jesus, for His
+% mercy.
+%
+% This document is copyright 2015 by Donald P. Goodman, and is
+% released publicly under the LaTeX Project Public License. The
+% distribution and modification of this work is constrained by the
+% conditions of that license. See
+% http://www.latex-project.org/lppl.txt
+% for the text of the license. This document is released
+% under version 1.3 of that license, and this work may be distributed
+% or modified under the terms of that license or, at your option, any
+% later version.
+%
+% This work has the LPPL maintenance status 'maintained'.
+%
+% The Current Maintainer of this work is Donald P. Goodman
+% (dgoodmaniii@gmail.com).
+%
+% This work consists of the files shapes.dtx and
+% shapes.ins, along with the generated file shapes.mp
+% and shapes.pdf, and the README.
+
+\def\batchfile{shapes.ins}
+\input docstrip.tex
+
+\preamble
+This is a generated file.
+
+This document is copyright 2015 by Donald P. Goodman, and is
+released publicly under the LaTeX Project Public License. The
+distribution and modification of this work is constrained by the
+conditions of that license. See
+ http://www.latex-project.org/lppl.txt
+for the text of the license. This document is released
+under version 1.3 of that license, and this work may be distributed
+or modified under the terms of that license or, at your option, any
+later version.
+
+This work has the LPPL maintenance status 'maintained'.
+
+The Current Maintainer of this work is Donald P. Goodman
+(dgoodmaniii@gmail.com).
+
+This work consists of the files shapes.dtx and
+shapes.ins, along with the generated file shapes.mp
+and shapes.pdf, and the README.
+\endpreamble
+
+\keepsilent
+\generate{\file{shapes.mp}{\from{shapes.dtx}{package}}}
+
+\Msg{******************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by Metapost:}
+\Msg{*}
+\Msg{* \space\space shapes.mp}
+\Msg{*}
+\Msg{* To produce the documentation run the file shapes.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy Metaposting!}
+\Msg{******************************************************}
+
+\endbatchfile
+\endinput
diff --git a/graphics/metapost/contrib/macros/shapes/shapes.pdf b/graphics/metapost/contrib/macros/shapes/shapes.pdf
new file mode 100644
index 0000000000..69510315a6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/shapes/shapes.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/slideshow/pathalong.mp b/graphics/metapost/contrib/macros/slideshow/pathalong.mp
new file mode 100644
index 0000000000..bc57cd6e26
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/pathalong.mp
@@ -0,0 +1,53 @@
+%% draw some text (t) along a curve (p)
+
+vardef pathalong (expr _p, t) =
+ save l, ll, del,let, pos, p;
+ picture let, ll;
+ path del, p;
+
+ l := length(t) - 1;
+ pos = 0;
+ p := _p;
+
+ ll := nullpicture;
+
+ for i := 0 upto l:
+
+ let := substring (i,i+1) of t infont defaultfont scaled defaultscale;
+
+ addto ll also (let rotated(angle(direction pos of p)))
+ shifted point pos of p;
+
+ del := (((xpart urcorner let, infinity)--(xpart urcorner let, -infinity))
+ rotated(angle(direction pos of p)))
+ shifted point pos of p;
+
+ p := subpath(pos,length(p)) of p;
+ pos := ypart (del intersectiontimes p);
+ exitif pos <= 0;
+
+ endfor;
+
+ ll
+enddef;
+
+%% draw the text contained in t so that the bottoms of the letters are on
+%% the base-line and the tops abut path p
+vardef textunder(expr p,t) =
+ save l, ll, pos, h, i;
+ picture l, ll;
+ numeric pos, h, i;
+ ll := nullpicture;
+ pos := 0;
+ for i = 0 upto (length t - 1):
+ l := substring(i, i+1) of t infont defaultfont scaled defaultscale;
+ h := ypart urcorner l;
+ if h > 0:
+ addto ll also (l yscaled ((ypart (((pos,-infinity)--(pos,infinity)) intersectionpoint p)) / ypart ulcorner l)) shifted (pos, 0);
+ fi;
+ pos := pos + xpart lrcorner l;
+ endfor;
+
+ ll
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/slideshow/slideshow.mp b/graphics/metapost/contrib/macros/slideshow/slideshow.mp
new file mode 100644
index 0000000000..f7afbfadb4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/slideshow.mp
@@ -0,0 +1,387 @@
+%% simple metapost slide show
+%%
+%% Copyright 2001, Patrick TJ McPhee
+%% everyone is welcome to use this code for any purpose, to modify it, and
+%% to copy it in whole or in part for use in other macro sets, with the
+%% conditions that this copyright notice be preserved with any significant
+%% portion of the code, and that modifications to this file be clearly
+%% marked.
+%%
+%% see the file slideshow.txt for documentation
+%% $Header: /usr/home/ptjm/texmf/metapost/RCS/slideshow.mp 1.8 2001/08/06 18:48:17 pmcphee Exp $
+
+newinternal slideshowversion;
+slideshowversion := 1.0;
+
+%%
+%% basic figure handling
+%%
+
+picture lastpicture, background;
+
+% set the aspect ratio of the picture to match a 640x480 screen
+if not known lawidth:
+ lawidth := 6.4in;
+ laheight := 4.8in;
+fi;
+
+% make a sophisticated gradient background -- note that this can be done
+% natively in pdf 1.3 if you know how....
+def drawgradient(expr topcolour, botcolour) :=
+ save pw,l,r,t,b,shade,grad;
+
+ numeric l,r,t,b,pw;
+ color shade, grad;
+
+ % we will draw 100 coloured stripes across the screen
+ pw = laheight/100;
+ pickup pensquare scaled pw;
+ lft l = 0 = bot b;
+ rt r = lawidth;
+ t = laheight; % don't say `top t' because I want to over-extend
+
+ % shade is the colour of the current stripe, while grad
+ % is the amount to change on each stripe
+ shade := botcolour;
+ grad := (1/100)*(topcolour - botcolour);
+
+ for ypos := b step pw until t:
+ draw (l, ypos)--(r, ypos) withcolor shade;
+ shade := shade + grad;
+ endfor;
+enddef;
+
+% draw the background -- we'll make it blue, just like power point
+background := image(drawgradient((0,0,.3), (0,0,.5)););
+
+% `keep track' of figure numbers
+def nextfig := beginfig(charcode+1) enddef;
+
+% always save the current picture at the end of each figure,
+% so it can be used in the next one
+extra_endfig := extra_endfig & "lastpicture := currentpicture; currentpicture := background; if known lastpicture: draw lastpicture; fi;";
+
+% continue overlays the current picture with the last picture shipped out
+% this allows slides to be built up
+newinternal continuations;
+continuations := 0;
+def docontinue = if known lastpicture and (continuations = 1): currentpicture := lastpicture; bpos := bpos.prev; else: bpos := 0; fi; enddef;
+extra_beginfig := extra_beginfig & "docontinue;";
+
+% one might want to do that by default
+def continue = continuations := 1; enddef;
+% or not
+def endcontinue = continuations := 0; enddef;
+
+% break in continuation
+def discontinue = clearit; lastpicture := nullpicture; bpos := 0; bpos.prev := 0; enddef;
+
+
+%%
+%% drawing assists
+%%
+
+
+% we'll use two pens to draw figures
+pickup pencircle xscaled 5 pt yscaled 4 pt rotated 20;
+thick nib := savepen;
+
+pickup pencircle xscaled 2 pt yscaled 1 pt rotated 20;
+thin nib := savepen;
+
+%%
+%% text manipulation assists
+%%
+
+
+% and we'll make the text yellow, just like power-point
+color textcolour;
+textcolour := red+green;
+defaultfont := "phvr8r";
+
+
+% this is the thing we use as a bullet
+picture bulletpic;
+bulletpic := image(draw char(226) infont "pzdr" withcolor textcolour;);
+
+pair headerpos, footerpos, boff, borigin, borigin.in, blimit;
+numeric baselineskip, parskip, parskip.in, bpos;
+
+% positions of the bottom left corner of the header, and the bottom right
+% corner of the footer
+headerpos = (1in, 4in);
+footerpos = (6in, .2in);
+
+% offset of text from the bullet
+boff = (20bp, 0);
+
+% upper-left start position for bulletted text
+borigin = (1.5in,3.4in);
+
+% upper-left start position for indented bulletted text
+borigin.in = borigin + boff;
+
+% lower-right limit of bulletted text
+blimit = (4.4in,1in);
+
+% distance between baselines in bulletted text
+baselineskip = 11bp;
+
+% distance between bullet points for normal bullets
+parskip = 5 pt;
+
+% distance between bullet points for indented bullets
+parskip.in = 1pt;
+
+% current bullet position
+bpos = 0;
+
+% internal use - bullet position at the end of the last slide
+bpos.prev = 0;
+
+vardef breaktowidth(expr s, w)(text sheight) =
+ save p;
+ picture p;
+
+ p := s infont defaultfont scaled defaultscale;
+ % if the string is too long to fit within bounds, we break it up on
+ % word boundaries.
+ if xpart(lrcorner p - llcorner p) > w:
+ save q, offs, len, goodlen; picture q; numeric offs, len, goodlen;
+ picture q;
+ p := nullpicture;
+ offs := 0;
+ len := 1;
+ goodlen := 0;
+ forever:
+ exitunless len < length(s);
+ q := (substring(offs, len) of s) infont defaultfont scaled defaultscale;
+ if xpart (lrcorner q - llcorner q) > w:
+ sheight := sheight + baselineskip;
+ p := image(draw p shifted (0, baselineskip);
+ draw (substring(offs, goodlen) of s) infont defaultfont
+ scaled defaultscale;);
+ offs := goodlen + 1;
+ len := offs + 1;
+ fi;
+ if substring(len, len+1) of s = " ": goodlen := len; fi;
+ len := len + 1;
+ endfor;
+
+ p := image(draw p shifted (0, baselineskip);
+ draw (substring(offs, length s) of s) infont defaultfont
+ scaled defaultscale;);
+ fi;
+ p
+enddef;
+
+% bullet(text) or bullet(picture) writes bulletpic and text or picture
+% in the next bullet position on the screen
+% bullet.in(text) does the same thing, but indented. This can be
+% extended for arbitrary suffix tag by defining a pair called borigin.tag,
+% and a numeric called parskip.tag. Note that bpos is shared, so this really
+% only works for additional levels of indentation
+vardef bullet@#(expr s) =
+ save p, sheight;
+ numeric sheight;
+ picture p;
+
+ % add the parskip for this bullet type, unless we're at the top
+ if bpos > 0: bpos := bpos + parskip@#; fi
+
+ if picture s:
+ p := s;
+ sheight := ypart(ulcorner p - llcorner p) - baselineskip;
+ else:
+ sheight := 0;
+ p := image(draw breaktowidth(s, xpart(blimit - borigin@#))(sheight)
+ withcolor textcolour;);
+ fi;
+
+ % start a new slide if this bullet won't fit. If we're in continuation mode,
+ % the previous slide already has the previous bullets, so just clear this
+ % slide and put the bullet at the top. In discontinous mode, we need to end
+ % the figure, but this causes some problems as it ends the group started by
+ % vardef, so we lose p and sheight (which were saved).
+ if ypart borigin@# - sheight - bpos < ypart blimit:
+ if continuations = 1: discontinue;
+ else:
+ begingroup;
+ endfig;
+ bpos.prev := 0;
+ nextfig;
+ endgroup;
+ fi;
+ fi;
+ draw bulletpic shifted (borigin@# - (0, bpos));
+ draw p shifted (borigin@# + boff - (0, bpos+sheight));
+ bpos := bpos + sheight + baselineskip;
+ bpos.prev := bpos;
+enddef;
+
+% handy abbreviation for a common paradigm
+vardef bpoint@#(expr s) = nextfig; bullet@#(s); endfig; enddef;
+
+% the same as the plain metapost label, but using textcolour
+vardef blabel@#(expr s,z) = draw thelabel@#(s,z) withcolor textcolour; enddef;
+
+vardef dotblabel@#(expr s,z) =
+ blabel@#(s,z);
+ interim linecap:=rounded;
+ draw z withpen pencircle scaled dotlabeldiam withcolor textcolour;
+enddef;
+
+% a label which is also a hyperlink
+def dolink(expr p, n) =
+ special "[ /Rect [ " & decimal xpart llcorner p & " " &
+ decimal ypart llcorner p & " " &
+ decimal xpart urcorner p & " " &
+ decimal ypart urcorner p & " ] /Dest /" & n &
+ " /Border [ 0 0 0 ] /Subtype /Link /ANN pdfmark";
+enddef;
+
+vardef hyperlabel@#(expr s,z, n) =
+ save p;
+ picture p;
+ p := thelabel@#(s,z);
+ dolink(p, n);
+ draw p withcolor textcolour;
+enddef;
+
+vardef hyperbullet@#(expr s, n) =
+ save p;
+ picture p;
+ p := image(bullet@#(s););
+ dolink(p, n);
+ draw p;
+enddef;
+
+def hyperdest(expr n) = special "[ /Dest /" & n & " /View [ /Fit ] /DEST pdfmark"; enddef;
+
+
+picture headerpic, footerpic;
+
+% header saves a string or picture which will be displayed at headerpos
+% on each slide. The header is added after the slide is saved to lastpicture
+def header(expr s) =
+ if picture s: headerpic := s;
+ else: headerpic := image(
+ draw s infont defaultfont scaled (defaultscale*magstep1)
+ shifted headerpos
+ withcolor textcolour;);
+ fi;
+enddef;
+
+def drawheader = if known headerpic: draw headerpic; fi; enddef;
+
+% header saves a string or picture which will be displayed to the left of
+% footerpos on each slide. The footer is added after the slide is saved
+% to lastpicture
+def footer(expr s) =
+ if picture s: footerpic := s;
+ else: footerpic := s infont defaultfont scaled defaultscale;
+ footerpic := image(
+ draw footerpic
+ shifted (footerpos - (lrcorner footerpic - llcorner footerpic))
+ withcolor textcolour;);
+ fi;
+enddef;
+
+def drawfooter = if known footerpic: draw footerpic; fi; enddef;
+extra_endfig := extra_endfig & "drawheader; drawfooter;";
+
+% current slide number
+def folio = decimal charcode enddef;
+
+%%
+%% font encoding -- currently, only to 8r (I just couldn't bear putting this in
+%% a source file)
+%%
+def encodefont(expr tfm, fn) =
+ special "/" & tfm & " /" & fn & "8r def";
+ special "/" & fn & " findfont dup length dict copy dup /Encoding";
+ special "[ /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash";
+ special "/ogonek /ring /.notdef /breve /minus /.notdef /Zcaron /zcaron /caron /dotlessi";
+ special "/dotlessj /ff /ffi /ffl /.notdef /.notdef /.notdef /.notdef";
+ special "/.notdef /.notdef /.notdef /.notdef /grave /quotesingle /space /exclam /quotedbl /numbersign";
+ special "/dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash";
+ special "/zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question";
+ special "/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z";
+ special "/bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft";
+ special "/a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z";
+ special "/braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /quotesinglbase /florin";
+ special "/quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft";
+ special "/OE /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash";
+ special "/tilde /trademark /scaron /guilsinglright /oe /.notdef /.notdef /Ydieresis /.notdef";
+ special "/exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft";
+ special "/logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior";
+ special "/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright";
+ special "/onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla";
+ special "/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis";
+ special "/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex";
+ special "/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla";
+ special "/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis";
+ special "/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex";
+ special "/udieresis /yacute /thorn /ydieresis ] put /" & fn & "8r exch definefont pop";
+enddef;
+
+%%
+%% pdf macros and assists
+%%
+
+
+% maintain a ps file which loads all the slides in order
+% this is specific to gs
+string psfile;
+psfile := jobname & ".ps";
+
+extra_endfig := extra_endfig & "write " & ditto & "(" & ditto & "& jobname &"
+ & ditto & "." & ditto
+ & "& folio &" & ditto & ") run" & ditto & " to psfile;";
+
+% put the viewer into full screen mode by default, and define a document-default
+% page transition (I'm using the random transition with 1/2 second duration)
+% since there is no way to specify a document-default, the transition has to be
+% added to each page dictionary
+special "[ /PageMode /FullScreen /DOCVIEW pdfmark";
+
+special "[ /_objdef {mytrans} /type /dict /OBJ pdfmark";
+special "[ {mytrans} << /Type /Trans /D .5 /S /Random /Dm /H /M /O /Di 315 >> /PUT pdfmark ";
+
+extra_endfig := extra_endfig & "special " & ditto
+ & "[ {ThisPage} << /Trans {mytrans} >> /PUT pdfmark" & ditto & ";";
+
+special "[ /CropBox [ 0 0 " & decimal(lawidth) & " " & decimal(laheight) & " ] /PAGES pdfmark";
+
+% allow the user to specify document info
+def author(expr s) :=
+ special "[ /Author (" & s & ") /DOCINFO pdfmark";
+enddef;
+def title(expr s) :=
+ special "[ /Title (" & s & ") /DOCINFO pdfmark";
+enddef;
+def subject(expr s) :=
+ special "[ /Subject (" & s & ") /DOCINFO pdfmark";
+enddef;
+def keywords(expr s) :=
+ special "[ /Keywords (" & s & ") /DOCINFO pdfmark";
+enddef;
+def copyright(expr s) :=
+ special "[ /Copyright (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+def moddate(expr s) :=
+ special "[ /ModificationDate (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+def createdate(expr s) :=
+ special "[ /CreationDate (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+% except for the document info we specify ourselves
+createdate("D:" & decimal year & decimal month & if day < 10: "0" fi & decimal(day) & decimal time);
+special "[ /Creator (Metapost " & base_name & " base, version " & base_version & ") /DOCINFO pdfmark";
+
+% gs will need this
+prologues:=2;
+
diff --git a/graphics/metapost/contrib/macros/slideshow/slideshow.txt b/graphics/metapost/contrib/macros/slideshow/slideshow.txt
new file mode 100644
index 0000000000..539b8c32a4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/slideshow.txt
@@ -0,0 +1,431 @@
+Making pdf slides with metapost and ghostscript
+
+Patrick McPhee
+
+Introduction
+
+slideshow is a small macro package which simplifies the process of
+creating slide-show style presentations using plain metapost and
+ghostscript. The package assists in producing slides with dimensions
+6.4 inches wide by 4.8 inches high, which the user is then expected to
+convert into a pdf file using ghostscript as a PS distiller.
+
+This is probably not the best way of producing presentations, but it's
+put forward for interest's sake. I do not intend to formally support
+this package, however I will accept bug reports at ptjm@interlog.com,
+and will endeavour to fix incompatibilities with tremendously useful
+metapost packages such as metaobj.
+
+Usage
+
+Simply inputing slideshow.mp has several effects:
+ - each slide is given a default background which is a hundred-step
+ gradient from fairly-dark blue to medium-dark blue;
+ - the default font is changed to helvetica 8r;
+ - prologues is set to 2;
+ - a list of figures suitable for passing as an input file to ghostscript
+ is written to a file called `jobname'.ps;
+ - pdfmarks are written which cause the pdf file to automatically go
+ into full-screen mode, have a random transition pattern with
+ duration of .5 seconds between each page, crop the pages to 6.4 by
+ 4.8 inches, and set the creation date and creator in the pdf info
+ dictionary;
+ - several macros and variables are defined, which might conflict with
+ other packages. They should all be documented in this report.
+
+After creating all the metapost figures, run the file `jobname'.ps
+through ghostscript, using the pdfwrite device. ghostscript comes with a
+batch file called ps2pdf which can be used to do this, but a sufficient
+command line is:
+ gs -sDEVICE=pdfwrite -sOutputfile=jobname.pdf -dNOPAUSE jobname.ps quit.ps
+
+other parameters are possible. I've noticed smaller pdf files are
+generated by specifying a high resolution and a corresponding geometry
+(e.g., adding the flags -r10000 -g64000x48000 generates a smaller file
+than the above).
+
+The macros defined by slideshow provide support for
+ - storing author and document information in the PDF info directory;
+ - automatically generating new figure numbers;
+ - automatically saving and restoring the contents of the previous
+ figure, to allow slides to be built up, step-by-step;
+ - maintaining a vertical list of bullet points;
+ - drawing labels and bullets in yellow, after the default style of the
+ leading presentation graphics package;
+ - wrapping long text to fit within boundaries;
+ - adding hyperlinks within the presentation.
+
+Reference
+
+This section is intended to be a complete reference to all the macros
+and variables defined or changed by slideshow. If naming conflicts
+arise between this and truly useful macro packages, I will likely
+change some or all of these names to use a common prefix.
+
+ Document information
+
+ The document information macros add entries to the PDF docinfo
+ dictionary. Except for copyright, these can be seen in the acrobat
+ reader document info dialog box, and in equivalent places in other PDF
+ viewers.
+
+ These macros should be called once at the start, although they can be
+ called more than once (the last call wins) anywhere before the last
+ slide is shipped out. They are all optional. Do not include parentheses
+ in the arguments.
+
+ author(string)
+ sets the /Author entry;
+ title(string)
+ sets the /Title entry;
+ subject(string)
+ sets the /Subject entry;
+ keywords(string)
+ sets the /Keywords entry;
+ copyright(string)
+ adds a dictionary entry called /Copyright. Copyright is not a standard
+ docinfo entry, but non-standard entries are explicitly allowed by the
+ language specification, and it seems like a good idea;
+ moddate(string)
+ overrides the /ModificationDate entry. The format should be
+ D:yyyymmddhhmiss+GMTOFFSET, but everything after year is optional,
+ and the specification suggests that other formats are just fine, too;
+ createdate(string)
+ overrides the /CreationDate entry. slideshow.mp always calls createdate
+ with the current date as an argument. However, some common metapost
+ implementations don't actually return the current date, or you may have
+ your own reasons for wanting to override the automatically-generated
+ date. The format is the same as for moddate.
+
+ Constants and pseudo constants -- these could be left alone, or set once
+ once at the start:
+
+ slideshowversion - internal
+ 1.0 for this release. The decimal portion will change if the file
+ changes in an upwardly compatible manner, and the integer portion will
+ change if the file changes in an upwardly incompatible manner (e.g., the
+ names of macros change).
+
+ lawidth - number
+ the width of the figure. Can be used for positioning or drawing a frame
+ without worrying about the actual dimensions. The default is 6.4
+ inches. If lawidth is set, it must be set before slideshow.mp is input,
+ and laheight must also be set;
+
+ laheight - number
+ the height of the figure. The default is 4.8 inches. If laheight is
+ set, it must be set before slideshow.mp is input, and lawidth must also
+ be set;
+
+ background - picture
+ a lawidth by laheight rectangle filled with a blue gradiant. It is
+ placed behind the user's figure during endfig processing, after lastpicture
+ has been saved. A new background can be set by assigning a picture to
+ background (but see also header and footer). This can be done even in
+ the midst of a series of continuations.
+
+ textcolour - color
+ The colour used by the bullet, blabel, header, and footer macros. By
+ default, yellow.
+
+ defaultfont - string
+ set to phvr8r (helvetica in 8r encoding) rather than the metapost
+ default cmr10
+
+ defaultscale - number
+ amount of scaling for bullet points. takes mp default of 1
+
+ thick nib - pen
+ a relatively thick pen
+
+ thin nib - pen
+ a relatively thin pen
+
+ borigin - pair
+ The upper left corner of the bounding box for bullet points;
+
+ borigin.in - pair
+ The upper left corner of the bounding box for indented bullet points.
+ Indented bullet points are generated using bullet.in or bpoint.in;
+
+ blimit - pair
+ The lower right corner of the bounding box for all bullet points. It
+ could be useful to adjust blimit on the fly, e.g., to make room for a
+ figure at the right-hand side of a slide;
+
+ bulletpic - picture
+ The picture used as a bullet when displaying bulletted text. The
+ default is a right-pointing arrow taken from the Zapf Dingbats font. It
+ needs to be reset if textcolour is set;
+
+ baselineskip - number
+ distance between lines of text in a multi-line bullet point (default 11 bp)
+
+ parskip - number
+ distance between bullet points (default 5 bp)
+
+ parskip.in - number
+ distance between indented bullet points (default 1 bp)
+
+ boff - pair
+ the offset between the bullet and the corresponding text. The y
+ component is normally 0, but could be non-zero if it needed to;
+
+ bpos - number
+ current vertical offset from borigin. This is shared by bullets and
+ indented bullets. It might be useful to set this rather than using the
+ y component of boff;
+
+ bpos.prev - number
+ Internal-use variable which saves and restores bpos in continuous mode;
+
+ headerpos - pair
+ The location for the slide header. The header is set to the right of
+ the headerpos;
+
+ footerpos - pair
+ The location for the slide footer. The footer is set to the left of the
+ footerpos;
+
+ psfile - string
+ The name of a file which will be fed to ghostscript. The default name
+ is <jobname>.ps where the metapost input file is <jobname>.mp. If this
+ is set, it must be set before the first slide.
+
+ prologues - number
+ slideshow sets this to 2
+
+ extra_beginfig
+ slideshow adds stuff to extra_beginfig, which might cause conflicts
+ with other packages;
+
+ extra_endfig
+ slideshow adds stuff to extra_endfig, which might cause conflicts
+ with other packages;
+
+
+ Slide management
+
+ nextfig
+ calls beginfig with a figure number one larger than the previous call.
+ The advantage of this is that you don't have to keep track of the
+ figure numbers;
+
+ lastpicture - picture
+ the image of the last slide to be shipped out. This is saved
+ automatically at the end of each slide, and restored automatically if
+ continuations is set to 1;
+
+ continuations - numeric
+ Internal variable used to determine whether continuation mode is on or
+ off (1 for on, 0 for off). This should not be manipulated directly -- use
+ the continue, endcontinue, and discontinue macros instead;
+
+ docontinue - macro
+ overlays currentpicture with lastpicture. This is called automatically
+ by extra_beginfig, and has effect only if continuations is 1;
+
+ continue - macro
+ sets continuations to 1. This causes lastpicture to be assigned to each
+ new slide automatically, which allows slides to be built up
+ incrementally without repeating the previous part of the definition;
+
+ discontinue - macro
+ suspends continuation for the next slide
+
+ endcontinue - macro
+ sets continuations to 0. This stops lastpicture being assigned to each
+ new slide, and is the default behaviour;
+
+ Useful macros and variables for creating individual slides
+
+ drawgradient(colour1, colour2)
+ fills a rectangle lawidth by laheight with a hundred-step gradient from
+ colour1 at the top to colour2 at the bottom. This is used to assign a
+ gradient to background, for that oh-so-professional look;
+
+ bullet(string or picture)
+ Adjusts bpos down by parskip (unless there are no bullets on the
+ slide), then adds a bullet point to the current picture at (borigin -
+ (0, bpos)). If the argument is a string, it will be roughly broken into
+ line fragments up to xpart blimit - xpart borigin lines long, and
+ printed in defaultfont scaled defaultscale, with colour textcolour. If
+ the bullet doesn't fit on the current slide, a new slide will be
+ started with only that bullet point on the background. The formatted
+ argument is offset from the bulletpic by boff;
+
+ bullet.in(string or picture)
+ the same as bullet, but using borigin.in instead of borigin, and
+ parskip.in instead of parskip. Additional bullet types bullet.<tag> can be added by
+ defining a pair called borigin.<tag> and a numeric called
+ parskip.<tag>. Note that bpos is shared by all bullets, so it may have
+ to be manipulated to get the desired effect;
+
+ bpoint(string or picture)
+ creates a single-bullet figure (useful in continuation mode);
+
+ bpoint.in(string or picture)
+ creates a single-indented-bullet figure;
+
+ blabel(string or picture, pair)
+ as label, but withcolor textcolour. blable.rt et al also work
+
+ dotblabel(text or picture, pair)
+ as blabel, but with a dot. dotblabel.lft et al also work
+
+ breaktowidth(string, numeric)(height) -> picture
+ Sets the string infont defaultfont scaled defaultscale. If the string
+ is wider than the numeric argument, breaks it on spaces using the naive
+ algorithm (i.e, add characters to a picture until it's too wide, then
+ break at the most recent space). height should be passed the name of a
+ numeric variable, which will be set to the height of the figure less
+ baselineskip. Each line of text is set baselineskip apart.
+
+ headerpic - picture
+ If this is set, it is automatically drawn on each figure after the
+ lastpicture has been saved, but before the figure is shipped out. The
+ headerpic is not shifted before being drawn;
+
+ footerpic - picture
+ If this is set, it is automatically drawn on each figure after the
+ lastpicture has been saved, but before the figure is shipped out. The
+ footerpicis not shifted before being drawn;
+
+ header(string or picture)
+ assigns a value to headerpic. If the argument is a string, it is set in
+ defaultfont scaled defaultscale * magstep 1 and positioned with its
+ lower-left corner at headerpos. header and footer can be called at any
+ time, and the macro will take effect the next time a figure is shipped
+ out;
+
+ footer(string or picture)
+ assigns a value to headerpic. If the argument is a string, it is set in
+ defaultfont scaled defaultscale and positioned with its lower-right
+ corner at footerpos;
+
+ drawheader
+ called internally to draw headerpic
+
+ drawfooter
+ called internally to draw footerpic
+
+ folio -> string
+ expands to a string with the current figure number
+
+ encodefont(string, string)
+ The first string is the tfm-file name and the second is the postscript
+ font name. The macro defines a new font which is encoded using the 8r
+ encoding. This is necessary if you want to use most characters outside
+ the normal ascii range. If you look at the top of a metapost output
+ file which was generated with prologues=2, you'll see something like
+ this:
+ /phvr8r /Helvetica def
+ to re-encode the font, put
+ encodefont("phvr8r", "Helvetica");
+ before the first figure.
+
+ To use encodefont, you must set prologues to 0, and you must copy
+ the definitions for fshow and all other fonts (by default, pzdr)
+ using specials. Alternately, if 8r encoding is needed for only one
+ slide, you could use encodefont only for that figure.
+
+ Hyperlinking
+
+ hyperbullet(string or picture, string)
+ as bullet, but defines a pdfmark to link to a destination with the same
+ name as the second argument. The link boundary is the bounding box.
+ There is no border drawn;
+
+ hyperlabel(string or picture, pair, string)
+ as blabel, but defines a pdfmark to link to a destination with the
+ same name as the second argument. The link boundary is the bounding
+ box. There is no border drawn;
+
+ hyperdest(string)
+ labels the current page for hyperlinks using the name given as the
+ argument.
+
+ dolink(path or picture, string)
+ creates a hyperlink with the boundary being the bounding box of
+ the first argument, and the destination named in the second argument.
+ Does not draw anything, so it can be used to put a link which
+ isn't strictly related to drawing elements.
+
+Additional notes
+
+In addition to document info pdfmarks generated in response to the
+author, title, subject, keywords, and copyright macros, slideshow
+automatically generates pdfmarks which automatically put the pdf file in
+full-screen mode, and which set the transition for each page to random
+with a duration of .5 seconds.
+
+I use 6.4x4.8 inches for the dimensions because this matches the
+proportions of a PC screen.
+
+Metapost and ghostscript generally require some configuration. If you
+use the computer modern fonts (e.g., in a btex ... etex section for math),
+you need to obtain PS versions of these fonts and configure both dvips
+and ghostscript to use them. dvips has a file called psfonts.map, which
+maps TeX font metric file names to postscript font names and font files.
+dvips can look in other places for mapping information, and many
+installations will have a separate file called bsr.map. So far as I can
+tell, metapost always uses psfonts.map from the dvips configuration.
+The contents of bsr.map must be added to psfonts.map for the CM fonts
+to work. Similarly, ghostscript has a file called Fontmap which contains
+equivalent mappings. There is a Fontmap-format file for the CM fonts
+on CTAN, which should be copied to the ghostscript lib directory. The
+ghostscript Fontmap file should be edited and the line
+
+ (Fontmap.BSR) .runlibfile
+
+added to the end (Fontmap.BSR might not be the name of the file on CTAN
+-- please use the correct file name instead). Once this configuration
+change is made, everything should work well.
+
+Example
+
+Here's an example, which draws a triangle and puts text at each corner,
+then links back to the start so we can see it happen again:
+
+ input slideshow;
+ pair points[];
+ nextfig;
+ points0 = (.5lawidth, .9laheight);
+ ypart points1 = ypart points2 = .1laheight;
+ xpart points1 = lawidth - xpart points2 = .3lawidth;
+
+ pickup thin nib;
+
+ draw points1..points0 withcolor textcolour;
+ hyperdest("start");
+ endfig;
+
+ % build on previous slide for next few
+ continue;
+ nextfig;
+ pickup thin nib;
+
+ draw points0..points2 withcolor textcolour;
+ endfig;
+ nextfig;
+ pickup thin nib;
+
+ draw points2..points1 withcolor textcolour;
+ endfig;
+
+ nextfig;
+ blabel.top("A", points0);
+ endfig;
+ nextfig;
+ blabel.lft("B", points1);
+ endfig;
+ nextfig;
+ blabel.rt("C", points2);
+ endfig;
+
+ % new sequence of slides ...
+ discontinue;
+ nextfig;
+ hyperlabel("The End" infont defaultfont scaled magstep 2, (.5lawidth, .5laheight), "start");
+ endfig;
+ end
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex.mp b/graphics/metapost/contrib/macros/slideshow/sshowex.mp
new file mode 100644
index 0000000000..dc1414ced8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex.mp
@@ -0,0 +1,42 @@
+ input slideshow;
+ pair points[];
+ nextfig;
+ points0 = (.5lawidth, .9laheight);
+ ypart points1 = ypart points2 = .1laheight;
+ xpart points1 = lawidth - xpart points2 = .3lawidth;
+
+ pickup thin nib;
+
+ draw points1..points0 withcolor textcolour;
+ hyperdest("start");
+ endfig;
+
+ % build on previous slide for next few
+ continue;
+ nextfig;
+ pickup thin nib;
+
+ draw points0..points2 withcolor textcolour;
+ endfig;
+ nextfig;
+ pickup thin nib;
+
+ draw points2..points1 withcolor textcolour;
+ endfig;
+
+ nextfig;
+ blabel.top("A", points0);
+ endfig;
+ nextfig;
+ blabel.lft("B", points1);
+ endfig;
+ nextfig;
+ blabel.rt("C", points2);
+ endfig;
+
+ % new sequence of slides ...
+ discontinue;
+ nextfig;
+ hyperlabel("The End" infont defaultfont scaled magstep 2, (.5lawidth, .5laheight), "start");
+ endfig;
+ end
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex.pdf b/graphics/metapost/contrib/macros/slideshow/sshowex.pdf
new file mode 100644
index 0000000000..e9351c39b6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex2.mp b/graphics/metapost/contrib/macros/slideshow/sshowex2.mp
new file mode 100644
index 0000000000..788bbf55b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex2.mp
@@ -0,0 +1,36 @@
+%%
+%% slide-show example which demonstrates text wrapping, and changing the background
+%% on the fly
+%%
+
+
+input slideshow;
+
+% start with a blue to red gradient, then `gradually' shift it to red to blue
+noslides := 11;
+def doback =
+ background := image(drawgradient((charcode/noslides)[blue,red], (charcode/noslides)[red,blue]););
+enddef;
+
+doback;
+
+extra_endfig := extra_endfig & "doback;";
+
+continue;
+nextfig;
+ header("A Walk in the Park");
+endfig;
+bpoint("I was walking in the park one day, when the most remarkable thing happened.");
+bpoint("There was a lady there, well, I say lady because I was brought up to believe one should use this term to refer to adult members of the fair sex, but from her behaviour, I'm not sure it's the right term at all.");
+bpoint("This lady, as I call her, was conveying herself by way of two-wheeled roller skates, and she was wearing a tiny pair of short pants, and a top which, although it completely covered her torso, was extremely revealing as to her form.");
+bpoint("Well, she noticed that she had my attention, and behaved in a manner which I can only describe as provacative in the extreme.");
+bpoint(ditto & "Do you want a closer look, Jack?" & ditto & " she asked (but my name is not Jack, nor John for that matter), and then she lifted her top, exposing the most disgusting protuberances.");
+bpoint("Needless to say, I was shocked.");
+bpoint("I quickly found a park warden and reported the vixen (I can't bring myself to call her a lady again).");
+bpoint(ditto & "What, the one in the white spandex top?" & ditto & " he exclaimed.");
+bpoint("I supposed that's what that material was, and he assured me that he would seek her out and speak to her about the matter.");
+bpoint("It seemed to me that more severe handling was suggested by the circumstances, but he was eager to do the job, so I left him to it.");
+
+
+
+end
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex2.pdf b/graphics/metapost/contrib/macros/slideshow/sshowex2.pdf
new file mode 100644
index 0000000000..7ae3d57826
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex2.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex3.mp b/graphics/metapost/contrib/macros/slideshow/sshowex3.mp
new file mode 100644
index 0000000000..7e65e918bd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex3.mp
@@ -0,0 +1,23 @@
+%%
+%% slide-show example which demonstrates text wrapping in discontinous mode
+%%
+
+input slideshow;
+
+nextfig;
+ header("A Walk in the Park");
+
+bullet("I was walking in the park one day, when the most remarkable thing happened.");
+bullet("There was a lady there, well, I say lady because I was brought up to believe one should use this term to refer to adult members of the fair sex, but from her behaviour, I'm not sure it's the right term at all.");
+bullet("This lady, as I call her, was conveying herself by way of two-wheeled roller skates, and she was wearing a tiny pair of short pants, and a top which, although it completely covered her torso, was extremely revealing as to her form.");
+bullet("Well, she noticed that she had my attention, and behaved in a manner which I can only describe as provacative in the extreme.");
+bullet(ditto & "Do you want a closer look, Jack?" & ditto & " she asked (but my name is not Jack, nor John for that matter), and then she lifted her top, exposing the most disgusting protuberances.");
+bullet("Needless to say, I was shocked.");
+bullet("I quickly found a park warden and reported the vixen (I can't bring myself to call her a lady again).");
+bullet(ditto & "What, the one in the white spandex top?" & ditto & " he exclaimed.");
+bullet("I supposed that's what that material was, and he assured me that he would seek her out and speak to her about the matter.");
+bullet("It seemed to me that more severe handling was suggested by the circumstances, but he was eager to do the job, so I left him to it.");
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowex3.pdf b/graphics/metapost/contrib/macros/slideshow/sshowex3.pdf
new file mode 100644
index 0000000000..60006b14c1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowex3.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowintro.mp b/graphics/metapost/contrib/macros/slideshow/sshowintro.mp
new file mode 100644
index 0000000000..7dd856ec52
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowintro.mp
@@ -0,0 +1,206 @@
+%%
+%% A quick presentation about the macros
+%%
+
+input pathalong;
+input slideshow;
+
+author("Patrick TJ McPhee");
+title("Introducing slide-show macros");
+keywords("presentations metapost");
+copyright("Copyright 2001 Patrick TJ McPhee. You may redistribute and modify for any purpose, but must acknowledge significant quotation.");
+
+continue;
+
+nextfig;
+ defaultscale := 2;
+ draw textunder((0,.5in){up}..{right}(2in,1in), "Introducing") shifted (1in,3in) withcolor textcolour;
+endfig;
+
+nextfig;
+ blabel.rt("Slide Show Macros", (2in,2in));
+endfig;
+
+defaultscale := 1;
+
+nextfig;
+ draw pathalong((0,.5in){up}..{right}(2in,1in), "by Patrick TJ McPhee") shifted (1in,3in) withcolor textcolour;
+ hyperdest("Start");
+endfig;
+
+discontinue;
+
+header("Rationale");
+
+bpoint("Primarily an intellectual exercise");
+bpoint("But may be useful for graphics-intensive presentations which don't use much text");
+bpoint("Slideshow provides support for this irritating style of bullet presentation");
+bpoint("And writes out some pdfmarks, which you would otherwise have to look up yourself");
+
+picture dimtieb;
+dimtieb := image(draw pathalong((0,.5in){up}..(.5in,1in){right}..(.5in, 0in){-1,-1}..{.1,-1}(.5in,-.5in),
+ "Did I mention the intellectual exercise bit?") withcolor textcolour;);
+dimtieb := dimtieb rotatedaround(center dimtieb, 90);
+dimtieb := dimtieb shifted - llcorner dimtieb;
+
+bpoint(dimtieb);
+
+discontinue;
+
+header("Current practice");
+
+bpoint("A presentation might have several components:");
+
+vardef procbox(expr s) =
+ save p;
+ picture p;
+
+ p := s infont defaultfont scaled defaultscale;
+ pickup thin nib;
+ addto p doublepath bbox p withpen currentpen;
+ p
+enddef;
+
+vardef resultbox(expr s) =
+ save p;
+ picture p;
+
+ p := s infont defaultfont scaled defaultscale;
+ pickup thin nib;
+ addto p doublepath (ulcorner p)..tension 2..(urcorner p)..(lrcorner p)..
+ tension 2..(llcorner p)..cycle
+ withpen currentpen;
+ p
+enddef;
+
+picture lt, mp, dvi, gs, postp, vres, pres, fpres;
+
+lt := procbox("laTeX") shifted (.05 lawidth, .2laheight);
+mp := procbox("metapost") shifted (.05 lawidth, .1laheight);
+dvi := procbox("DVI processor") shifted (.2 lawidth, .15laheight);
+vres := resultbox("viewable result") shifted (.4 lawidth, .15 laheight);
+gs := procbox("distiller") shifted (.65 lawidth, .15laheight);
+pres := resultbox("presentation") shifted (.8 lawidth, .15laheight);
+postp := procbox("post-processor") shifted (.7 lawidth, .3laheight);
+fpres := resultbox("final presentation") shifted (.45 lawidth, .3laheight);
+
+nextfig;
+ bullet.in("text prepared with laTeX");
+ draw lt withcolor white;
+endfig;
+
+nextfig;
+ bullet.in("graphics prepared with metapost (okay, 2 components)");
+ draw mp withcolor red;
+endfig;
+
+nextfig;
+ bullet.in("which are combined with dvi processing software");
+ pickup thin nib;
+ drawarrow (.5[lrcorner mp,urcorner mp]){right}..{right}(.5[llcorner dvi,ulcorner dvi])
+ withcolor .25[red,white];
+ drawarrow (.5[lrcorner lt,urcorner lt]){right}..{right}(.5[llcorner dvi,ulcorner dvi])
+ withcolor .25[white,red];
+
+ draw dvi withcolor .5[white,red];
+endfig;
+
+nextfig;
+ bullet.in("the resulting postscript is viewable, but must be distilled into the presentation");
+ pickup thin nib;
+ drawarrow (.5[lrcorner dvi,urcorner dvi])..(.5[llcorner vres,ulcorner vres])
+ withcolor .1[.5[red,white],green];
+ draw vres withcolor .5[.5[white,red],green];
+endfig;
+
+nextfig;
+ pickup thin nib;
+ drawarrow (.5[lrcorner vres,urcorner vres])..(.5[llcorner gs,ulcorner gs])
+ withcolor .6[.5[red,white],green];
+ draw gs withcolor .75[.5[white,red],green];
+endfig;
+
+nextfig;
+ pickup thin nib;
+ drawarrow (.5[lrcorner gs,urcorner gs])..(.5[llcorner pres,ulcorner pres])
+ withcolor .75[.5[white,red],green];
+ draw pres withcolor green;
+endfig;
+
+nextfig;
+ pickup thin nib;
+ bullet.in("and it's often post-processed to make it slick and professional-looking like this one");
+ pickup thin nib;
+ drawarrow (.5[lrcorner pres,urcorner pres]){right}..{left}(.5[lrcorner postp,urcorner postp])
+ withcolor .5[green,white];
+ draw postp withcolor .75[green,white];
+endfig;
+
+nextfig;
+ pickup thin nib;
+ drawarrow (.5[llcorner postp,ulcorner postp])..(.5[lrcorner fpres,urcorner fpres])
+ withcolor .95[green,white];
+ draw fpres withcolor white;
+endfig;
+
+discontinue;
+
+header("The slideshow advantage");
+bpoint("With the slideshow macros:");
+
+nextfig;
+ bullet.in("Only one input format is possible");
+ draw mp withcolor red;
+endfig;
+
+nextfig;
+ bullet.in("Which converts rapidly into viewable output");
+ pickup thick nib;
+ drawarrow (.5[lrcorner mp,urcorner mp]){right}..{right}(.5[llcorner vres,ulcorner vres])
+ withcolor .5[red,.5[.5[white,red],green]];
+ % I hope it's clear by this point that I'm playing this for laughs
+ draw vres withcolor .5[.5[white,red],green];
+endfig;
+
+nextfig;
+ bullet.in("And then distills into the presentation");
+ pickup thick nib;
+ drawarrow (.5[lrcorner vres,urcorner vres]){right}
+ ..{right}(.5[llcorner fpres,ulcorner fpres])
+ withcolor .5[.5[.5[white,red],green],white];
+ draw fpres withcolor white;
+endfig;
+
+nextfig;
+ bullet.in("From which no post-processing is needed, since there are no post-processors supporting these macros");
+endfig;
+
+discontinue;
+header("Limitations");
+
+bpoint("Metapost doesn't handle text very well");
+bpoint("It's difficult to include non-metapost graphics (e.g., bit-maps)");
+bpoint("There's no provision for producing print-only versions of the information");
+bpoint("There's no concept of presentation styles");
+bpoint("It generally requires some configuration of ghostscript and metapost, especially if you use math");
+bpoint("The other methods for producing presentations using TeX-family tools aren't as complicated as I suggested");
+bpoint.in("I personally use my own plain-TeX style with just TeX, metapost, and dvipdfm");
+
+discontinue;
+header("Strengths");
+
+bpoint("Measurably less complex than metaobj");
+bpoint("Small and simple, so shouldn't conflict with too many truly useful metapost packages");
+bpoint("The ability to build up drawings can be helpful");
+bpoint("And so are the pdfmarks");
+bpoint("It's useful for cases where laTeX is used as a framework for a bunch of metapost slides");
+bpoint("So it was worth uploading to CTAN, but it's not going to change the world");
+
+discontinue;
+header(nullpicture);
+
+nextfig;
+ hyperlabel(breaktowidth("Thanks for sticking to the end. Click on this text to start over.", .5lawidth)(ignore), (.5lawidth, .5laheight), "Start");
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/slideshow/sshowintro.pdf b/graphics/metapost/contrib/macros/slideshow/sshowintro.pdf
new file mode 100644
index 0000000000..6bff15103a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/slideshow/sshowintro.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/splines/README b/graphics/metapost/contrib/macros/splines/README
new file mode 100644
index 0000000000..20998c92f1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/splines/README
@@ -0,0 +1,44 @@
+Splines -- version 0.2a
+
+This package consists of a few macros useful for producing cubic splines
+in MetaPost (or Metafont).
+
+Given a sequence of N+1 points, a spline is a path $z = f(t)$, $0 \le t
+\le N$, connecting them, which is a cubic function of $t$ between
+points, and has continuous first and second derivatives.
+
+Such a spline is two dimensional and can wander about anywhere in the
+picture plane. Another type of spline is one dimensional: given a
+sequence of $N$ locations $x_0 < x_1 < \dots < x_N$ on the $x$-axis and
+corresponding values $y_j$, a cubic spline interpolant is a function $y
+= f(x)$ satisfying $f(x_j) = y_j$, which is cubic between the $x_j$ and
+which has continuous first and second derivatives.
+
+With these macros one can draw two-dimensional cubic splines and the
+graphs of cubic spline interpolants.
+
+The files of this package consist of:
+ splines.dtx The documented source code.
+ splines.ins LaTeX this to produce the file splines.mp.
+ splines.pdf The documentation.
+ testsplines.mp Uses the macros to produce a few splines.
+ README The file you are reading
+
+The files of this package are Copyright 2002--2005, Daniel H. Luecking
+
+Splines.mp may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, either version 1.3 of this license or
+(at your option) any later version. The latest version of this license
+is in
+ <http://www.latex-project.org/lppl.txt>
+and version 1.3 or later is part of all distributions of LaTeX version
+2003/12/01 or later.
+
+Splines has maintenance status "author-maintained". The Current
+Maintainer is Daniel H. Luecking. The Base Interpreter is MetaPost
+(or Metafont).
+
+You may email problem reports to luecking {at} uark {dot} edu.
+
+--
+Dan Luecking
diff --git a/graphics/metapost/contrib/macros/splines/splines.dtx b/graphics/metapost/contrib/macros/splines/splines.dtx
new file mode 100644
index 0000000000..da89dda74d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/splines/splines.dtx
@@ -0,0 +1,393 @@
+% \iffalse
+% -------------------------------------------------------------------
+%
+% Copyright 2002--2004, Daniel H. Luecking
+%
+% Splines.mp may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License, either version 1.3 of this license or (at
+% your option) any later version. The latest version of this license is in
+% <http://www.latex-project.org/lppl.txt>
+% and version 1.3 or later is part of all distributions of LaTeX version
+% 2003/12/01 or later.
+%
+% Splines has maintenance status "author-maintained". The Current Maintainer
+% is Daniel H. Luecking. The Base Interpreter is MetaPost (or Metafont).
+%
+%<*driver>
+\ProvidesFile{splines.dtx}
+ [2005/02/05 v0.2 Metafont/post macros to compute splines.]%
+\documentclass[draft]{ltxdoc}
+\usepackage{docmfp}
+
+\addtolength{\textwidth}{.5878pt}
+
+\def\mytt{\upshape\mdseries\ttfamily}
+\renewcommand\marg[1]{{\mytt \{#1\}}}
+\renewcommand\oarg[1]{{\mytt [#1]}}
+\renewcommand\parg[1]{{\mytt (#1)}}
+\renewcommand{\meta}[1]{{$\langle$\rmfamily\itshape#1$\rangle$}}
+\DeclareRobustCommand\cs[1]{{\mytt\char`\\#1}}
+\def\prog#1{{\mdseries\scshape #1}}
+
+
+
+
+\def\MF{\prog{meta\-font}}
+\def\MP{\prog{meta\-post}}
+
+\def\CMF{\prog{Meta\-font}}
+\def\CMP{\prog{Meta\-post}}
+\def\opt#1{{\sffamily\upshape#1}}
+\def\mfc#1{{\mytt#1}}
+\let\env\mfc
+\let\file\mfc
+\let\gbc\mfc
+\renewcommand\{{{\mytt\char`\{}}
+\renewcommand\}{{\mytt\char`\}}}
+\renewcommand\|{${}\mathrel{|}{}$}
+
+\makeatletter
+\newcommand\bsl{{\mytt\@backslashchar}}
+% Stupid lists!
+\def\@listi{\leftmargin\leftmargini
+ \parsep \z@ \@plus\p@ \@minus\z@
+ \topsep 4\p@ \@plus\p@ \@minus2\p@
+ \itemsep\parsep}
+\let\@listI\@listi \@listi
+\renewcommand\labelitemi{\normalfont\bfseries \textendash}
+\renewcommand\labelitemii{\textasteriskcentered}
+\renewcommand\labelitemiii{\textperiodcentered}
+\leftmargini\parindent
+% Stupid index!
+\def\usage#1{\textrm{#1}}
+\def\index@prologue{\section*{Index}\markboth{Index}{Index}Numbers
+refer to the page where the corresponding entry is described.}
+\def\IndexParms{%
+ \parindent \z@ \columnsep 15pt
+ \parskip 0pt plus 1pt
+ \rightskip 5pt plus2em \mathsurround \z@
+ \parfillskip=-5pt \small
+ % less hanging:
+ \def\@idxitem{\par\hangindent 20pt}%
+ \def\subitem{\@idxitem\hspace*{15pt}}%
+ \def\subsubitem{\@idxitem\hspace*{25pt}}%
+ \def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}}
+\renewcommand\routinestring{}
+\renewcommand\variablestring{\space(var.)}
+% Why does every command have to be indexed twice?
+\renewcommand\SpecialMfpIndex[3]{\@bsphack
+ \index{%
+ \string#1\actualchar
+ \string\verb\quotechar*\verbatimchar\string#1\verbatimchar
+ #2 \encapchar usage}%
+ \@esphack}
+\def\close@crossref{\SpecialEscapechar{:}}
+\makeatother
+\def\VariableIndex#1{\SpecialMfpIndex{#1}{\variablestring}{}}
+\def\RoutineIndex #1{\SpecialMfpIndex{#1}{}{}}
+
+\title{Macros to Compute Splines\thanks{This file has version number
+ \fileversion, last revised \filedate.}}
+\author{Dan Luecking}
+\date{\filedate}
+\SpecialEscapechar{:}
+\def\bslash{:}
+\DisableCrossrefs
+\CodelineIndex
+\AlsoImplementation
+
+\begin{document}
+ \DeleteShortVerb{\|}
+ \DocInput{splines.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \CheckSum{25}
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \catcode`\_=12
+% \GetFileInfo{splines.dtx}
+% \maketitle
+%
+% \StopEventually{\PrintIndex}
+% A cubic spline through a set of points is a curve obtained by joining
+% each point to the next with a cubic parametrized curve, where adjoining
+% cubics must have matching first and second derivative at their common
+% point.
+%
+% It is possible for \MP{} to compute the necessary controls.
+% Unfortunately, the controls are not uniquely determined unless the curve
+% is required to be closed. For open curves, there is need for two
+% additional equations at the end points. A `relaxed spline' is produced
+% if we require that the second derivative is $(0,0)$ at those points.
+% For a closed curve, the equality of the first and second derivatives at
+% the common beginning/ending point gives the needed additional equations.
+%
+% Note that this equates \emph{time} derivatives, so this works best when
+% points are relatively evenly spaced and so the speed is relatively
+% uniform. If points are differently spaced then the relatively slower
+% speed between closely spaced points allows sharper turns without large
+% second derivatives. Curves produced tend to have a more natural look,
+% and relaxed splines are most suitable for smoothing data that is
+% obtained by taking observations at evenly spaced times. Still, the
+% technique is somewhat unstable when points are closely spaced, for
+% example when a small change in the position of one point can produce a
+% large change in its direction when viewed from another point.
+%
+% Start with version control information.
+% \begin{macrocode}
+%<*package>
+if known splines_fileversion: endinput fi;
+string splines_fileversion;
+splines_fileversion := "2006/09/25, v0.2a";
+message "Loading splines.mp " & splines_fileversion;
+
+% \end{macrocode}
+%
+% \DescribeRoutine{list_to_array}
+% Now for a command that takes a variable name \gbc{(suffix arr)} and
+% copies a list of pairs to \mfc{arr1}, \mfc{arr2}, etc..
+% The suffix must be declared by the calling program so that \mfc{arr}
+% is numeric but \mfc{arr[\,]} are pairs, for example by ``\mfc{save arr; pair
+% arr[\,];}''.
+% \begin{macrocode}
+def list_to_array (suffix arr) (text list) =
+ arr := 0;
+ for _itm = list :
+ arr[incr arr] := _itm;
+ endfor
+enddef;
+
+% \end{macrocode}
+%
+% \DescribeRoutine{compute_spline}
+% In this command we generate the equations common to all cubic
+% splines: the equality of derivatives at all interior points.
+% This command accepts three suffixes: \gbc{points}, \gbc{pr}, and
+% \gbc{po} which should represent previously declared arrays of pairs.
+% \gbc{points} is the array of points to be connected, and must be known.
+% Arrays \gbc{pr} and \gbc{po} \emph{must} be unknown and will hold the
+% computed control points. See the code of \mfc{mkrelaxedspline} for
+% an example of how this was arranged for the variables \mfc{rs_pr} and
+% \mfc{rs_po}.
+%
+% Contrary to the previous (unreleased) version, \mfc{compute_spline}
+% takes a boolean argument and appends the same equations at the first (=
+% last) point.
+%
+% \DescribeRoutine{mkrelaxedspline}
+% The first of these macros appends the necessary additional equations to
+% get zero second derivatives at the ends.
+% \DescribeRoutine{mkclosedspline}
+% The second simply calls \mfc{compute_spline} with the boolean set to
+% true. Both return the computed path. In theory the knowledgeable user
+% can call \gbc{compute_spline (false)}, append a choice of equations for
+% the ends, and then call \gbc{mksplinepath (false)}.
+%
+% \DescribeRoutine{dospline}
+% This version accepts a list of pairs and produces a spline through
+% them. It simply stores the list in an array and calls the appropriate
+% version that operates on an array.
+% \begin{macrocode}
+def compute_spline (expr closed) (suffix points, pr, po) =
+ % interior equations:
+ for j= 2 upto points - 1 :
+ % equate first derivatives:
+ po[j] + pr[j] = 2 points[j];
+ % and second derivatives:
+ pr[j+1] + 2 pr[j] = 2 po[j] + po[j-1];
+ endfor
+ % for a closed curve, the first and last are also interior:
+ if closed:
+ po 1 + pr 1 = 2 points 1;
+ po[points] + pr[points] = 2 points[points];
+ pr 2 + 2 pr 1 = 2 po 1 + po[points];
+ pr 1 + 2 pr[points] = 2 po[points] + po[points-1];
+ fi
+enddef;
+
+vardef mksplinepath (expr closed) (suffix points, pr, po) =
+ points1..controls po1 and
+ for j = 2 upto points if not closed: -1 fi:
+ pr[j]..points[j]..controls po[j] and
+ endfor
+ if closed: pr 1..cycle else: pr[points]..points[points] fi
+enddef;
+
+vardef mkrelaxedspline (suffix pnts) =
+ save rs_pr, rs_po;
+ pair rs_po[], rs_pr[];
+ % Equate second derivative to zero at both end points
+ rs_pr 2 + pnts 1 = 2 rs_po 1 ;
+ pnts[pnts] + rs_po[pnts-1] = 2 rs_pr[pnts];
+ compute_spline (false) (pnts, rs_pr, rs_po);
+ mksplinepath (false) (pnts, rs_pr, rs_po)
+enddef;
+
+vardef mkclosedspline (suffix pnts) =
+ save cs_pr, cs_po;
+ pair cs_pr[], cs_po[];
+ compute_spline (true) (pnts, cs_pr, cs_po);
+ mksplinepath (true) (pnts, cs_pr, cs_po)
+enddef;
+
+vardef dospline (expr closed) (text the_list) =
+ save _sp; pair _sp[];
+ list_to_array (_sp) (the_list);
+ if closed :
+ mkclosedspline (_sp)
+ else:
+ mkrelaxedspline (_sp)
+ fi
+enddef;
+
+% \end{macrocode}
+% The above computations produce a $2$-dimensional spline. A $1$-dimensional
+% cubic spline would be a function $f(t)$ with numeric values rather
+% than pair values. Such are often used to interpolate functions. That is,
+% given pairs $(x\sb j,y\sb{j})$, and assuming they lie on the graph of
+% some function (generally unknown), fill in the graph with $y = f(x)$
+% where $f$ is a cubic function of $x$ in each interval $x\sb j < x < x\sb
+% {j+1}$, making sure that the resulting graph is as smooth as possible at
+% the points $x\sb j$.
+%
+% The requirements on our $2$-dimensional path are the following:
+% \begin{enumerate}
+% \item The $j$th link should connect $(x\sb{j},y\sb{j})$ to $(x\sb{j+1},
+% y\sb{j+1})$.
+% \item The $x$-part of that link should increase linearly from $x\sb{j}$ to
+% $x\sb{j+1}$ as $t$ goes from $0$ to $1$.
+% \item The $y$-part should be a cubic $y = f(x)$.
+% \item The $x$-derivatives $df/dx$ and $d^2f/dx^2$ should match at the
+% connecting points.
+% \end{enumerate}
+%
+% Two necessary equations for converting between $x$ and $t$ coordinates
+% are:
+% \begin{equation}\label{first}
+% x = x\sb{j} + t \Delta x\sb{j}
+% \end{equation}
+% (where $\Delta x\sb{j} = x\sb{j+1} - x\sb{j}$) and
+% \begin{equation}\label{second}
+% \frac{df}{dt} = \frac{dx}{dt}\frac{df}{dx} = (x\sb{j+1} -
+% x\sb{j}) \frac{df}{dx}.
+% \end{equation}
+% Thus we want to choose controls so that (\ref{first}) is maintained and
+% so that $x$-derivatives match. It turns out that this requires controls
+% at
+% \begin{equation}
+% \begin{array}{c}
+% (x\sb{j}, y\sb{j}) - (\Delta x\sb{j-1}, s\sb{j} \Delta x\sb{j-1})/3\\
+% (x\sb{j}, y\sb{j}) + (\Delta x\sb{j} , s\sb{j} \Delta x\sb{j} )/3
+% \end{array}
+% \end{equation}
+% where $s\sb{j}$ is the slope (derivative) at $x\sb{j}$. These control
+% points will produce matching slopes regardless of the values
+% chosen for the $s\sb j$. To get matching second derivatives we need the
+% same conditions as in parametric splines. But those equations simplify
+% to the form:
+% \begin{displaymath}
+% s\sb{j+1} dx\sb{j} - 2s\sb{j} (dx\sb{j} + dx\sb{j-1}) +
+% s\sb{j-1}dx\sb{j-1}
+% = 3y\sb{j+1} - 3y\sb{j-1}.
+% \end{displaymath}
+% As with 2-D splines there can be almost any equations at the end points.
+% For a relaxed spline we equate the second derivatives to 0. To get a
+% periodic function, we equate the slope and second derivative at
+% beginning to those at the end. This makes it possible to put a shifted
+% copy of the graph with starting point at the end of the original and
+% have the same smoothness at that connection as at the other points.
+%
+% \DescribeRoutine{compute_fcnspline}
+% This issues the equation for the slopes (array \gbc{sl} of
+% \emph{unknown} numerics). The array \gbc{points} contains the $(x,y)$
+% values and \gbc{dx} is a temporary numeric array which will be
+% overwritten if known.
+%
+% \DescribeRoutine{mkfcnsplinepath}
+% This simply assembles the path from the information computed by the
+% above equations (and the extra equations given in the calling command).
+%
+% \DescribeRoutine{mkrelaxedfcnspline}
+% This sets up arrays for the \gbc{dx} and \gbc{sl} parameters of
+% \mfc{compute_fcnspline}, emit the necessary endpoint equations (zero
+% second derivatives) and calls the previous two routines.
+%
+% \DescribeRoutine{mkperiodicfcnspline}
+% This does the same as the previous command, but the endpoint equations
+% make the first and second derivatives at the start equal to those at
+% the end.
+%
+% \DescribeRoutine{fcnspline}
+% Finally, this command copies a list of pairs into an array and calls the
+% appropriate command to process them.
+% \begin{macrocode}
+def compute_fcnspline (suffix points, dx, sl) =
+ % Get delta_x:
+ for j = 1 upto points - 1: dx[j] := xpart (points[j+1]-points[j]);
+ endfor
+ for j=2 upto points - 1:
+ sl[j + 1] * dx[j] + 2sl[j]*(dx[j] + dx[j-1]) + sl[j-1]*dx[j-1]
+ = 3*ypart(points[j+1] - points[j-1]);
+ endfor
+enddef;
+
+vardef mkfcnsplinepath (suffix points, dx, sl) =
+ points1..controls (points1 + (1, sl1)*dx1/3) and
+ for j = 2 upto points - 1:
+ (points[j] - (1, sl[j])*dx[j-1]/3) ..points[j]..
+ controls (points[j] + (1,sl[j])*dx[j]/3) and
+ endfor
+ (points[points] - (1,sl[points])*dx[points-1]/3)..points[points]
+enddef;
+
+vardef mkperiodicfcnspline (suffix pnts) =
+ save _sl, _dx; numeric _dx[], _sl[];
+ compute_fcnspline (pnts, _dx, _sl);
+ % periodicity equations:
+ _sl 1 = _sl[pnts];
+ _sl 2 * _dx 1 + 2 _sl 1 * _dx 1 + 2 _sl[pnts] * _dx[pnts-1]
+ + _sl[pnts-1] * _dx[pnts-1]
+ = 3 * ypart(pnts[2] - pnts[pnts-1]);
+ mkfcnsplinepath (pnts, _dx, _sl)
+enddef;
+
+vardef mkrelaxedfcnspline (suffix pnts) =
+ save _sl, _dx; numeric _dx[], _sl[];
+ compute_fcnspline (pnts, _dx, _sl);
+ % relaxation equations.
+ _sl 2 * _dx 1 + 2 _sl1 * _dx 1 = 3 * ypart(pnts2 - pnts1);
+ _sl[pnts-1] * _dx[pnts-1] + 2 _sl[pnts] * _dx[pnts-1]
+ = 3 * ypart(pnts[pnts] - pnts[pnts-1]);
+ mkfcnsplinepath (pnts, _dx, _sl)
+enddef;
+
+vardef fcnspline (expr periodic) (text the_list) =
+ save _fs; pair _fs[];
+ list_to_array (_fs) (the_list);
+ if periodic:
+ mkperiodicfcnspline (_fs)
+ else:
+ mkrelaxedfcnspline (_fs)
+ fi
+enddef;
+
+%</package>
+% \end{macrocode}
+% \clearpage
+%\Finale
diff --git a/graphics/metapost/contrib/macros/splines/splines.ins b/graphics/metapost/contrib/macros/splines/splines.ins
new file mode 100644
index 0000000000..ac047affa3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/splines/splines.ins
@@ -0,0 +1,48 @@
+\input docstrip
+\keepsilent
+\preamble
+
+-------------------------------------------------------------------
+
+Copyright 2002--2005, Daniel H. Luecking
+
+Splines.mp may be distributed and/or modified under the conditions of the
+LaTeX Project Public License, either version 1.3 of this license or (at
+your option) any later version. The latest version of this license is in
+ <http://www.latex-project.org/lppl.txt>
+and version 1.3 or later is part of all distributions of LaTeX version
+2003/12/01 or later.
+
+Splines has maintenance status "author-maintained". The Current Maintainer
+is Daniel H. Luecking. The Base Interpreter is MetaPost (or Metafont).
+
+\endpreamble
+\edef\zyx{%
+endinput.^^J%
+\DoubleperCent^^J%
+\DoubleperCent\space End of file `\outFileName'.}
+
+\askforoverwritefalse
+\usepostamble\zyx
+\generate{\file{splines.mp}{\from{splines.dtx}{package}}}
+
+\def\sJ{^^J \space\space\space}
+\immediate\write16{%
+^^J*******************************************************************
+^^J
+^^J To finish the installation:
+^^J
+^^J -- Copy the file splines.mp to a location where MetaPost
+\sJ will find it, for example TEXMF/metapost/splines/ .
+^^J
+^^J -- If desired, copy splines.mp to a location where Metafont will
+\sJ find it, e.g., TEXMF/metafont/splines/ . Rename it splines.mf.
+^^J
+^^J -- To generate the documentation, run latex on splines.dtx (requires
+\sJ the package docmfp).
+^^J
+^^J -- Refresh the filename database if your TeX system requires it.
+^^J
+^^J*******************************************************************}
+
+\endbatchfile
diff --git a/graphics/metapost/contrib/macros/splines/splines.pdf b/graphics/metapost/contrib/macros/splines/splines.pdf
new file mode 100644
index 0000000000..55604fa53a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/splines/splines.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/splines/testsplines.mp b/graphics/metapost/contrib/macros/splines/testsplines.mp
new file mode 100644
index 0000000000..a6ad01d0ad
--- /dev/null
+++ b/graphics/metapost/contrib/macros/splines/testsplines.mp
@@ -0,0 +1,122 @@
+input splines;
+
+numeric u; u:=1cm;
+
+path xaxis, yaxis;
+xaxis := (-2.5u,0)--(1.5u,0);
+yaxis := (0,-.5u)--(0,1.5u);
+
+def shiftit =
+ currentpicture := currentpicture shifted -llcorner currentpicture;
+enddef;
+
+def dodots (text t) =
+ for _loc = t:
+ fill (fullcircle scaled 2pt) shifted (u*_loc);
+ endfor
+enddef;
+
+
+
+beginfig(1);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ path p;
+ p := dospline (true)
+ ((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ draw p scaled u;
+label(btex From {\tt dospline (true)}. etex,(.25u,-.75u));
+dodots ((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+shiftit;
+endfig;
+
+beginfig(2);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ save A; pair A[];
+ list_to_array (A)((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ path p;
+ p := mkclosedspline (A);
+ draw p scaled u;
+label(btex From {\tt mkclosedspline}. etex,(.25u,-.75u));
+dodots (A1, A2, A3, A4, A5, A6, A7);
+shiftit;
+endfig;
+
+beginfig(3);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ path p;
+ p := dospline (false)
+ ((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ draw p scaled u;
+label(btex From {\tt dospline (false)}. etex,(.25u,-.75u));
+dodots ((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+shiftit;
+endfig;
+
+beginfig(4);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ save A; pair A[];
+ list_to_array (A)((-1,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ path p;
+ p := mkrelaxedspline (A);
+ draw p scaled u;
+label(btex From {\tt mkrelaxedspline}. etex,(.25u,-.75u));
+dodots (A1, A2, A3, A4, A5, A6, A7);
+shiftit;
+endfig;
+
+beginfig(5);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ path p;
+ p := fcnspline (true)
+ ((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ draw p scaled u;
+label(btex From {\tt fcnspline (true)}. etex,(.25u,-.75u));
+dodots ((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+shiftit;
+endfig;
+
+beginfig(6);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ save A; pair A[];
+ list_to_array(A) ((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ path p;
+ p := mkperiodicfcnspline (A);
+ draw p scaled u;
+label(btex From {\tt mkperiodicfcnspline}. etex,(.25u,-.75u));
+dodots (A1, A2, A3, A4, A5, A6, A7);
+shiftit;
+endfig;
+
+beginfig(7);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ path p;
+ p := fcnspline (false)
+ ((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ draw p scaled u;
+label(btex From {\tt fcnspline (false)}. etex,(.25u,-.75u));
+dodots((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+shiftit;
+endfig;
+
+beginfig(8);
+ drawarrow xaxis;
+ drawarrow yaxis;
+ save A; pair A[];
+ list_to_array(A) ((-2,0), (-1,1), (-.5,.8), (0,1),(.5,.4), (1,0), (1.5,1));
+ path p;
+ p := mkrelaxedfcnspline (A);
+ draw p scaled u;
+label(btex From {\tt mkrelaxedfcnspline}. etex,(.25u,-.75u));
+dodots (A1, A2, A3, A4, A5, A6, A7);
+shiftit;
+endfig;
+
+end.
+
diff --git a/graphics/metapost/contrib/macros/suanpan/README b/graphics/metapost/contrib/macros/suanpan/README
new file mode 100644
index 0000000000..5bbee910e4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/suanpan/README
@@ -0,0 +1,6 @@
+suanpan.mp is the macro file, and abacus.mp is the user file.
+To process abacus.mp, write
+
+ metapost abacus.mp
+
+The macros are released under the LPPL.
diff --git a/graphics/metapost/contrib/macros/suanpan/abacus.mp b/graphics/metapost/contrib/macros/suanpan/abacus.mp
new file mode 100644
index 0000000000..fbd23eed72
--- /dev/null
+++ b/graphics/metapost/contrib/macros/suanpan/abacus.mp
@@ -0,0 +1,138 @@
+input suanpan
+
+setup_abacus(N=13,NBL=5,NBU=2,bead="suanpan",units=0);
+
+% initial value of a suanpan
+beginfig(1);
+ rod_numbers:=false;
+ reset_abacus;
+ draw_abacus;
+endfig;
+
+
+setup_abacus(N=13,NBL=4,NBU=1,bead="soroban",units=1);
+
+% initial value of a soroban
+beginfig(2);
+ rod_numbers:=false;
+ reset_abacus;
+ draw_abacus;
+endfig;
+
+setup_abacus(N=13,NBL=5,NBU=2,bead="suanpan",units=0);
+beginfig(3);
+ rod_numbers:=true;
+ reset_abacus;
+ valL[1]:=2;
+ valL[3]:=5;
+ valU[2]:=1;
+ valU[4]:=2;
+ draw_abacus;
+endfig;
+
+beginfig(4);
+ reset_abacus;
+ set_abacus_val("10552");
+ draw_abacus;
+endfig;
+
+beginfig(10);
+ reset_abacus;
+ valL[1]:=2;
+ valL[3]:=5;
+ valU[2]:=1;
+ valU[4]:=2;
+ draw_abacus;
+endfig;
+
+beginfig(20);
+ reset_abacus;
+ valL[1]:=3;
+ valL[3]:=5;
+ valU[2]:=1;
+ valU[4]:=2;
+ draw_abacus;
+endfig;
+
+% soroban?
+beginfig(30);
+ setup_abacus(N=13,NBL=4,NBU=1,bead="soroban",units=1);
+ set_abacus_val("651324");
+ set_abacus_gray(deck="lower",below="000011",
+ above="000010");
+ set_abacus_gray(deck="upper",below="000001",
+ above="000010");
+ draw_abacus;
+ mark_abacus(i=1,j=5)(btex 1 etex);
+ mark_abacus(i=2,j=2)(btex 2 etex);
+ mark_abacus(i=2,j=3)(btex 3 etex);
+endfig;
+
+
+%show_val;
+
+setup_abacus(N=13,NBL=4,NBU=1,bead="soroban",units=1);
+set_abacus_val("651324");
+reset_abacus_gray;
+add_val(v="82363456",iv=100,fig=true);
+%message "**********************************";
+%show_val;
+
+setup_abacus(N=13,NBL=5,NBU=2,bead="suanpan",units=0);
+
+% detailing one of the addition cases
+beginfig(200);
+ reset_abacus;
+ reset_abacus_gray;
+ set_abacus_val("82951324");
+ draw_abacus;
+endfig;
+
+beginfig(201);
+ set_abacus_val("82951324");
+ add_val(v="60000",iv=100,fig=false);
+ draw_abacus;
+endfig;
+
+%-------------------------------------------
+
+beginfig(202);
+ reset_abacus;
+ reset_abacus_gray;
+ set_abacus_val("82951324");
+ set_abacus_gray(deck="lower",below="1010000",
+ above="0400000");
+ set_abacus_gray(deck="upper",below="0110000",
+ above="0000000");
+ draw_abacus;
+endfig;
+
+beginfig(203);
+ reset_abacus_gray;
+ add_val(v="60000",iv=100,fig=false);
+ set_abacus_gray(deck="lower",below="0400000",
+ above="1010000");
+ set_abacus_gray(deck="upper",below="0000000",
+ above="0110000");
+ draw_abacus;
+ mark_abacus(i=5,j=5)(btex 1 etex);
+endfig;
+
+% the following two commands enable a base-8 abacus
+vbu:=4; % value of a bead in the upper deck
+setup_abacus(N=13,NBL=3,NBU=1,bead="suanpan",units=0);
+
+beginfig(300);
+ reset_abacus;
+ reset_abacus_gray;
+ set_abacus_val("3401256");
+ draw_abacus;
+endfig;
+
+beginfig(301);
+ add_val(v="1234",iv=100,fig=false);
+ draw_abacus;
+endfig;
+
+end
+
diff --git a/graphics/metapost/contrib/macros/suanpan/article.txt b/graphics/metapost/contrib/macros/suanpan/article.txt
new file mode 100644
index 0000000000..1fad3a977c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/suanpan/article.txt
@@ -0,0 +1,5 @@
+Metapost macros used in
+
+ Denis Roegel: MetaPost macros for drawing Chinese and Japanese abaci,
+ TUGboat (volume 30, number 1, 2009, pages 74-79)
+
diff --git a/graphics/metapost/contrib/macros/suanpan/suanpan.mp b/graphics/metapost/contrib/macros/suanpan/suanpan.mp
new file mode 100644
index 0000000000..37745ea3a7
--- /dev/null
+++ b/graphics/metapost/contrib/macros/suanpan/suanpan.mp
@@ -0,0 +1,501 @@
+% modeling of a suanpan (Chinese abacus)
+% D. Roegel 9 September - 12 October 2008
+%
+% These macros provide basic functions for producing suanpan (Chinese abacus)
+% figures as well as soroban ones (Japanese abacus)
+
+numeric u;
+u=1cm;
+
+% key-val mechanism (from LGC2, p. 59-60)
+vardef executekeyval(text k)=
+ save _equals;
+ let _equals= =;
+ tertiarydef _ll_ _assign _rr_ =
+ hide(_ll_ _equals _rr_ ) 1
+ enddef;
+ save =;
+ let = _equals _assign ;
+ for _xx_ _equals k:endfor;
+enddef;
+
+numeric n; % number of digits
+numeric nbl,vbu,nbu; % number of beads (lower/upper)
+ % vbu=value of a bead in the upper deck
+numeric hsep,vsep,beadw,thframe,beadsp,wdvline,hlwindow,huwindow;
+numeric wdframe,huwindow;
+
+numeric beadtype;
+boolean rod_numbers;
+rod_numbers=true; % default
+
+boolean overflow;
+
+numeric abacus_units;
+abacus_units=0; % a value of 1 marks every third rod by a dot
+ % other values may be used in the future
+
+n=13; % default
+vbu=5; % value of a bead in the upper deck
+nbl=5; % total beads below (lower deck)
+nbu=2; % total beads above (upper deck)
+hsep=.8u; % distance between lines of beads
+ihsep=.5hsep; % initial hsep
+vsep=.5u; % smallest distance between bead centers
+beadw=.4hsep; % bead width
+thframe=.3u; % frame thickness
+beadsp=u; % bead spacing
+wdvline=.1u; % thickness of bamboo lines
+beadtype=1; % 1=round (suanpan), 2=biconal (soroban)
+
+vardef setup_abacus(text kv)=
+ save N,NBL,NBU,bead,units; % key names
+ numeric N,NBL,NBU,units;
+ string bead;
+ executekeyval(kv);
+ n:=N;
+ nbl:=NBL;
+ nbu:=NBU;
+ abacus_units:=units;
+ wdframe:=(n-1)*hsep+2ihsep+2thframe;
+ htframe:=3thframe+(nbl+nbu-2)*vsep+vsep+vsep+2beadsp;
+ hlwindow:=(nbl-1)*vsep+vsep+beadsp; % height of lower window
+ huwindow:=htframe-3thframe-hlwindow; % height of upper window
+ if bead="suanpan":
+ beadtype:=1;
+ elseif bead="soroban":
+ beadtype:=2;
+ fi;
+enddef;
+
+vardef draw_abacus_frame=
+ save P;pair P[];
+ % -------------- outer frame --------------
+ P0=origin;
+ P1-P0=P2-P3=wdframe*right;
+ P2-P1=htframe*up;
+ draw P0--P1--P2--P3--cycle;
+ %--------- lower inner frame --------------
+ P4-P0=(thframe,thframe);
+ P5-P1=(-thframe,thframe);
+ P9=P0+(1.5thframe+hlwindow)*up;
+ P10-P9=P1-P0;
+ P7=P9+(thframe,-.5thframe);
+ P6-P7=P5-P4;
+ draw P4--P5--P6--P7--cycle;
+ %--------- upper inner frame --------------
+ P14-P9=(thframe,.5thframe);
+ P15-P10=(-thframe,.5thframe);
+ P16-P2=(-thframe,-thframe);
+ P17-P3=(thframe,-thframe);
+ draw P14--P15--P16--P17--cycle;
+enddef;
+
+vardef draw_abacus_rods=
+ save h,ha,hb,savep;
+ savep=savepen;
+ ha=hlwindow;
+ hb=huwindow;
+ h=ha+hb+thframe;
+ for i=1 upto n:
+ draw (thframe+ihsep+(i-1)*hsep-.5wdvline,thframe)
+ --(thframe+ihsep+(i-1)*hsep-.5wdvline,thframe+ha);
+ draw (thframe+ihsep+(i-1)*hsep+.5wdvline,thframe)
+ --(thframe+ihsep+(i-1)*hsep+.5wdvline,thframe+ha);
+ draw (thframe+ihsep+(i-1)*hsep-.5wdvline,thframe+h-hb)
+ --(thframe+ihsep+(i-1)*hsep-.5wdvline,thframe+h);
+ draw (thframe+ihsep+(i-1)*hsep+.5wdvline,thframe+h-hb)
+ --(thframe+ihsep+(i-1)*hsep+.5wdvline,thframe+h);
+ if rod_numbers:
+ label.bot(decimal i,(thframe+ihsep+(n-i)*hsep,0));
+ label.top(decimal i,(thframe+ihsep+(n-i)*hsep,2thframe+h));
+ fi
+ endfor;
+ pickup pencircle scaled 3pt;
+ if abacus_units=1:
+ for i=3 step 3 until n:
+ draw (thframe+ihsep+(n-i)*hsep,thframe+ha+.5thframe);
+ endfor;
+ fi;
+ pickup savep;
+enddef;
+
+numeric valU[],valL[],vl; % stores the abacus values and the number of digits
+numeric valUMu[],valUMs[],valLMs[],valLMu[]; % moved values will be in gray
+
+def reset_abacus=
+ for i=1 upto n:
+ valU[i]:=0;
+ valL[i]:=0;
+ endfor;
+ reset_abacus_gray_above;
+ reset_abacus_gray_below;
+enddef;
+
+def reset_abacus_gray_above=
+ for i=1 upto n:
+ valUMs[i]:=0;valUMu[i]:=0;
+ endfor;
+enddef;
+
+def reset_abacus_gray_below=
+ for i=1 upto n:
+ valLMu[i]:=0;valLMs[i]:=0;
+ endfor;
+enddef;
+
+def suanpan_bead(expr X,Y)=
+ fullcircle xscaled 2beadw yscaled vsep shifted (X,Y)
+enddef;
+
+def draw_suanpan_bead(expr X,Y) text options=
+ fill suanpan_bead(X,Y) options;
+enddef;
+
+def draw_suanpan_gray_bead(expr X,Y) text options=
+ fill suanpan_bead(X,Y) options;
+ draw suanpan_bead(X,Y);
+enddef;
+
+def draw_suanpan_bead_contour(expr X,Y) text options=
+ draw_suanpan_gray_bead(X,Y) withcolor white;
+enddef;
+
+def define_soroban_bead_points(expr X,Y)=
+ save p,pa;pair p[];path pa;
+ p0=(X,Y);p1=p0+(beadw,.5wdvline);p2=p0+(.5wdvline,.5vsep);
+ p3=p0+(-.5wdvline,.5vsep);p4=p0+(-beadw,.5wdvline);
+ p5=p0+(-beadw,-.5wdvline);p6=p0+(-.5wdvline,-.5vsep);
+ p7=p0+(.5wdvline,-.5vsep);p8=p0+(beadw,-.5wdvline);
+ pa=p1--p2--p3--p4--p5--p6--p7--p8--cycle;
+enddef;
+
+% this macro draws a biconal bead, like on a soroban
+vardef draw_soroban_bead(expr X,Y) text options=
+ define_soroban_bead_points(X,Y);
+ unfill pa;
+ draw pa;draw p1--p4;draw p5--p8;
+enddef;
+
+% this macro draws a biconal bead, like on a soroban
+vardef draw_soroban_gray_bead(expr X,Y) text options=
+ define_soroban_bead_points(X,Y);
+ fill pa withcolor .7white;
+ draw pa;draw p1--p4;draw p5--p8;
+enddef;
+
+vardef draw_soroban_bead_contour(expr X,Y)=
+ define_soroban_bead_points(X,Y);
+ unfill pa;
+ draw pa;
+enddef;
+
+def draw_bead_contour(expr X,Y) text options=
+ if beadtype=1:
+ draw_suanpan_bead_contour(X,Y);
+ else:
+ draw_soroban_bead_contour(X,Y);
+ fi;
+enddef;
+
+def draw_bead(expr X,Y) text options=
+ if beadtype=1:
+ draw_suanpan_bead(X,Y) options;
+ elseif beadtype=2:
+ draw_soroban_bead(X,Y) options;
+ fi;
+enddef;
+
+def draw_gray_bead(expr X,Y)=
+ if beadtype=1:
+ draw_suanpan_gray_bead(X,Y) withcolor .7white;
+ elseif beadtype=2:
+ draw_soroban_gray_bead(X,Y) withcolor .7white;
+ fi;
+enddef;
+
+vardef draw_abacus_beads=
+ save na,nb,X,Y;
+ % we go through every bead line:
+ for i=1 upto n:
+ X:=thframe+ihsep+(n-i)*hsep;
+ % first, we handle the lower beads:
+ na:=nbl-valL[i];
+ nb:=valL[i];
+ % ------------------------------------------------------------
+ % these are the lower beads which have not been raised (unset)
+ for j=1 upto na:
+ Y:=thframe+.5vsep+(j-1)*vsep;
+ draw_bead(X,Y);
+ endfor;
+ % some of the previous ones are in gray:
+ for j=na downto na-(valLMu[i]-1):
+ Y:=thframe+.5vsep+(j-1)*vsep;
+ draw_gray_bead(X,Y);
+
+ endfor;
+ %-------------------------------------------------------------
+ % these are the lower beads which have been raised (set)
+ for j=1 upto nb:
+ Y:=thframe+hlwindow-(.5vsep+(j-1)*vsep);
+ draw_bead(X,Y);
+ endfor;
+ % some of the previous ones are in gray:
+ for j=nb downto nb-(valLMs[i]-1):
+ Y:=thframe+hlwindow-(.5vsep+(j-1)*vsep);
+ draw_gray_bead(X,Y);
+ endfor;
+ %-------------------------------------------------------------
+ % then we handle the upper beads:
+ na:=nbu-valU[i];
+ nb:=valU[i];
+ %--------------------------------------------------------------
+ % these are the upper beads which have not been lowered (unset)
+ for j=1 upto na:
+ Y:=htframe-(thframe+.5vsep+(j-1)*vsep);
+ draw_bead(X,Y);
+ endfor;
+ for j=na downto na-(valUMu[i]-1):
+ Y:=htframe-(thframe+.5vsep+(j-1)*vsep);
+ draw_gray_bead(X,Y);
+ endfor;
+ %--------------------------------------------------------------
+ % these are the upper beads which have been lowered (set)
+ for j=1 upto nb:
+ Y:=2thframe+hlwindow+(.5vsep+(j-1)*vsep);
+ draw_bead(X,Y);
+ endfor;
+ for j=nb downto nb-(valUMs[i]-1):
+ Y:=2thframe+hlwindow+(.5vsep+(j-1)*vsep);
+ draw_gray_bead(X,Y);
+ endfor;
+ %--------------------------------------------------------------
+ endfor;
+enddef;
+
+def draw_abacus=
+ draw_abacus_frame;
+ draw_abacus_rods;
+ draw_abacus_beads;
+enddef;
+
+% v must be a string
+vardef set_abacus_val(expr v)=
+ save vx;
+ numeric vx[];
+ reset_abacus;
+ vl:=min(length(v),n)-1; % handle overflows in the input
+ for i=0 upto length(v)-1:
+ vx[i]=ASCII(substring(i,i+1) of v)-ASCII("0");
+ endfor;
+ for i=1 upto length(v):
+ valL[i]:=vx[length(v)-i];
+ if valL[i]>vbu-1: % we must use vbu and not nbl, although
+ % they are usually the same
+ valU[i]:=1;
+ valL[i]:=valL[i]-vbu; % same remark
+ fi;
+ endfor;
+enddef;
+
+vardef reset_abacus_gray=
+ save s;
+ string s;
+ s="";
+ for i=1 upto n:s:=s & "0";endfor;
+ set_abacus_gray(deck="lower",below=s,above=s);
+ set_abacus_gray(deck="upper",below=s,above=s);
+enddef;
+
+vardef set_abacus_gray_below=
+ save vx;
+ numeric vx[];
+ reset_abacus_gray_below;
+ % reading the first string, for the lower part (which beads are gray)
+ for i=0 upto length(below)-1:
+ vx[i]:=ASCII(substring(i,i+1) of below)-ASCII("0");
+ endfor;
+ for i=1 upto length(below):
+ valLMu[i]:=vx[length(below)-i];
+ endfor;
+ % reading the second string, for the upper part (which beads are gray)
+ for i=0 upto length(above)-1:
+ vx[i]:=ASCII(substring(i,i+1) of above)-ASCII("0");
+ endfor;
+ for i=1 upto length(above):
+ valLMs[i]:=vx[length(above)-i];
+ endfor;
+ % we check that there is no conflict in the graying of beads:
+ % a bead can only be grayed if it exists
+ for i=1 upto n:
+ % lower beads ...............................
+ na:=nbl-valL[i];
+ nb:=valL[i];
+ % we force threshholds if necessary:
+ if valLMs[i]>valL[i]:valLMs[i]:=valL[i];fi
+ if valLMu[i]>na:valLMu[i]:=na;fi
+ endfor;
+enddef;
+
+vardef set_abacus_gray_above=
+ save vx;
+ numeric vx[];
+ reset_abacus_gray_above;
+ % reading the first string, for the lower part (which beads are gray)
+ for i=0 upto length(below)-1:
+ vx[i]:=ASCII(substring(i,i+1) of below)-ASCII("0");
+ endfor;
+ for i=1 upto length(below):
+ valUMs[i]:=vx[length(below)-i];
+ endfor;
+ % reading the second string, for the upper part (which beads are gray)
+ for i=0 upto length(above)-1:
+ vx[i]:=ASCII(substring(i,i+1) of above)-ASCII("0");
+ endfor;
+ for i=1 upto length(above):
+ valUMu[i]:=vx[length(above)-i];
+ endfor;
+ % we check that there is no conflict in the graying of beads:
+ % a bead can only be grayed if it exists
+ for i=1 upto n:
+ % upper beads ...............................
+ na:=nbu-valU[i];
+ nb:=valU[i];
+ % we force threshholds if necessary:
+ if valUMs[i]>valU[i]:valUMs[i]:=valU[i];fi
+ if valUMu[i]>na:valUMu[i]:=na;fi
+ endfor;
+enddef;
+
+vardef set_abacus_gray(text kv)=
+ save deck,below,above; % key names
+ string deck,below,above;
+ executekeyval(kv);
+ if deck="lower":
+ set_abacus_gray_below;
+ elseif deck="upper":
+ set_abacus_gray_above;
+ fi;
+enddef;
+
+% put the label `lab' on the j-th bead on row i (i=1 at the right)
+vardef mark_abacus(text kv)(expr lab)=
+ save i,j; % key names
+ numeric i,j;
+ executekeyval(kv);
+
+ save X,Y,na,nb,ju;
+ X:=thframe+ihsep+(n-i)*hsep;
+ if j<=nbl: % the bead to mark is below:
+ % first, we handle the lower beads:
+ na:=nbl-valL[i];
+ nb:=valL[i];
+ % ------------------------------------------------------------
+ if j<=na:
+ % these are the lower beads which have not been raised (unset)
+ Y:=thframe+.5vsep+(j-1)*vsep;
+ else:
+ %-------------------------------------------------------------
+ % these are the lower beads which have been raised (set)
+ Y:=thframe+hlwindow-(.5vsep+(nb-(j-na))*vsep);
+ fi
+ else: % the bead to mark is above:
+ ju=j-nbl;
+ %-------------------------------------------------------------
+ % then we handle the upper beads:
+ na:=nbu-valU[i];
+ nb:=valU[i];
+ if ju>nb:
+ %--------------------------------------------------------------
+ % these are the upper beads which have not been lowered (unset)
+ Y:=htframe-(thframe+.5vsep+(na-(ju-nb))*vsep);
+ else:
+ %--------------------------------------------------------------
+ % these are the upper beads which have been lowered (set)
+ Y:=2thframe+hlwindow+(.5vsep+(ju-1)*vsep);
+ fi;
+ fi;
+ draw_bead_contour(X,Y);
+ draw thelabel(lab,(X,Y)); % withcolor white;
+enddef;
+
+def show_val=
+ for i=1 upto vl+1:
+ message "valU[" & decimal i & "]=" & decimal (valU[i]);
+ message "valL[" & decimal i & "]=" & decimal (valL[i]);
+ endfor;
+enddef;
+
+% v=value, iv=image view
+def add_val(text kv)=
+ save v,iv,fig; % key names
+ string v;numeric iv;boolean fig;
+ executekeyval(kv);
+ save vx,VL,VU,carry;
+ numeric vx[],vL[],vU[],vx.len;
+ overflow:=false;
+ % we store the new value to add in one array
+ vx.len=min(length(v),n)-1; % we consider at most n digits
+ %message "vx.len=" & decimal vx.len;
+ for i=0 upto vx.len:
+ vx[i]=ASCII(substring(i,i+1) of v)-ASCII("0");
+ endfor;
+ for i=1 upto length(v):
+ vL[i]:=vx[length(v)-i];
+ endfor;
+
+ % if necessary, we modify the size of the first number:
+ if vx.len>vl:vl:=vx.len;fi
+ % the result will be either this wide, or will have one more digit
+ % to the left
+
+ if fig:
+ % the initial configuration:
+ beginfig(iv);
+ draw_abacus;
+ endfig;
+ fi
+
+ % we add the digits from left to right:
+ for i=vx.len+1 downto 1:
+ valL[i]:=valL[i]+vL[i];
+ % if there would be too many beads below, we adjust the upper ones:
+ forever:
+ if valL[i]>vbu-1:
+ valL[i]:=valL[i]-vbu;
+ valU[i]:=valU[i]+1;
+ fi
+ exitif valL[i]<vbu;
+ endfor;
+ % then, we propagate a carry if necessary:
+ carry:=0;
+ if valU[i]>1: % valU[i]=2 or 3 are possible values
+ carry:=1;
+ % propagate carry
+ valU[i]:=valU[i]-2;
+ for j=i+1 upto vl+1:
+ valL[j]:=valL[j]+carry;
+ if valL[j]>4:valL[j]:=0;valU[j]:=valU[j]+1;fi
+ if valU[j]>1:carry:=1;valU[j]:=valU[j]-2;else:carry:=0;fi
+ exitif carry=0; % no need to go all the way through,
+ % if the carry becomes 0
+ endfor;
+ if carry=1:
+ % we increment vl and we add the carry:
+ vl:=vl+1;
+ valL[vl+1]:=1;
+ if vl+1>n:overflow:=true;fi
+ fi
+ fi
+ %message "adding " & decimal vL[i] & " at position " & decimal i
+ % & " and generating view " & decimal (iv+(vx.len+1-i)+1);
+ if fig:
+ beginfig(iv+(vx.len+1-i)+1);
+ draw_abacus;
+ endfig;
+ fi
+ endfor;
+
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/tableauvariations/README b/graphics/metapost/contrib/macros/tableauvariations/README
new file mode 100644
index 0000000000..7c2d1509e3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/tableauvariations/README
@@ -0,0 +1 @@
+This metapost package help creating variation tables. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/tableauvariations/copyright b/graphics/metapost/contrib/macros/tableauvariations/copyright
new file mode 100644
index 0000000000..db639d875b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/tableauvariations/copyright
@@ -0,0 +1,12 @@
+This software is copyright (c) 2005 by Frédéric Mazoit
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
diff --git a/graphics/metapost/contrib/macros/tableauvariations/doc_fr.pdf b/graphics/metapost/contrib/macros/tableauvariations/doc_fr.pdf
new file mode 100644
index 0000000000..eeeb4c1c76
--- /dev/null
+++ b/graphics/metapost/contrib/macros/tableauvariations/doc_fr.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/tableauvariations/exemples.mp b/graphics/metapost/contrib/macros/tableauvariations/exemples.mp
new file mode 100644
index 0000000000..7b36fa9a91
--- /dev/null
+++ b/graphics/metapost/contrib/macros/tableauvariations/exemples.mp
@@ -0,0 +1,166 @@
+% This software is copyright (c) 2005 by Frédéric Mazoit
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+
+input tableauVariation;
+beginTableau(0)
+ newLigneVariables(btex $x$ etex);
+ val("0")
+ val(btex $+\infty$ etex);
+
+ newLigneSignes(btex $\displaystyle f'(x)=-{1\over x^2}$ etex);
+ nonDefBarre; moins;
+
+ newLigneVariations(btex $\displaystyle f(x)={1\over x}$ etex);
+ nonDefBarre;
+ limDroite(btex $+\infty$ etex,1);
+ valPos("0",0);
+
+endTableau;
+
+beginTableau(1)
+ newLigneVariables(btex $t$ etex);
+ val("0");val("1");val("2");val("3");val("4");
+
+ newLigneSignes(btex $\hbox{\bf Sgn.}\atop{\displaystyle x'(t)}$ etex);
+ plus; barre; moins; valBarre("4"); moins; nonDefBarre; plus;
+
+ newLigneVariations(btex $\hbox{\bf Var.}\atop{\displaystyle x}$ etex);
+ valPos("2",.5);
+ valPos("4",1);
+ valPos("2",.5);
+ valPos("0",0);
+ valPos("2",.5);
+
+ newLigneVariations(btex $\hbox{\bf Var.}\atop{\displaystyle y}$ etex);
+ valPos("0",0);
+ valPos("4",2/3);
+ valPos("6",1);
+ valPos("44444",2/3);
+ valPos("0",0);
+
+ newLigneSignes(btex $\hbox{\bf Sgn.}\atop{\displaystyle y'(t)}$ etex);
+ plus;plus;moins;moins;
+endTableau;
+
+beginTableau(2)
+ newLigneVariables(btex $t$ etex);
+ val("0");
+ val("1");
+ val("2");
+ val("3");
+ val("4");
+
+ newLigneSignes(btex $\hbox{\bf Sgn.}\atop{\displaystyle x'(t)}$ etex);
+ plus; barre; moins; valBarre("4"); moins; nonDefBarre; plus;
+
+ newLigneVariations(btex $\hbox{\bf Var.}\atop{\displaystyle x}$ etex);
+ valPos(btex $+\infty$ etex,1);
+ vide;
+ valPos("2",.5);
+ valPos("0",0);
+ limDroite(btex $+\infty$ etex,.66);
+ valPos("2",.5);
+
+ newLigneVariations(btex $\hbox{\bf Var.}\atop{\displaystyle y}$ etex);
+ valPos("0",.5);%valPos("4",2/3);
+
+ limGauche(btex $-\infty$ etex,0);
+ debutNonDef;
+ vide;
+ finNonDef;
+ limDroite(btex $+\infty$ etex,1);
+
+ valPos("0",0);
+
+ newLigneSignes(btex $\hbox{\bf Sgn.}\atop{\displaystyle y'(t)}$ etex);
+ plus;debutNonDef;
+ vide;
+ finNonDef;
+ moins;
+endTableau;
+
+beginTableau(3)
+ newLigneVariables(btex $x$ etex);
+ val("0");
+ val("2");
+ val("5");
+ val("8");
+ val(btex $+\infty$ etex);
+
+ newLigneSignes(btex $f'$ etex);
+ plus;
+ valBarre("0");
+ moins;
+ debutNonDef;
+ finNonDef;
+ plus;
+
+ newLigneVariations(btex $f$ etex);
+ valPos("0",0);
+ valPos("6",2/3);
+ limGauche("0",0);
+ debutNonDef;
+ finNonDef;
+ limDroite("0",0);
+ valPos(btex $+\infty$ etex,1);
+% newLigneVariations(
+endTableau;
+
+beginTableau(4)
+ deltaXsignes:=10pt;
+ newLigneVariables(btex $x$ etex);
+ val(btex $-\infty$ etex);
+ val(btex $-3$ etex);
+ val(btex $-\alpha$ etex);
+ val(btex $-1$ etex);
+ val(btex $0$ etex);
+ val(btex $1$ etex);
+ val(btex $\alpha$ etex);
+ val(btex $3$ etex);
+ val(btex $+\infty$ etex);
+
+ newLigneSignes(btex $g'$ etex);
+ plus;
+ debutNonDef;
+ finNonDef;
+ plus;
+ nonDefBarre;
+ moins;
+ valBarre("0");
+ plus;
+ nonDefBarre;
+ moins;
+ debutNonDef;
+ finNonDef;
+ moins;
+
+ newLigneVariations(btex $g$ etex);
+ valPos("0",0);
+ limGauche(btex $+\infty$ etex,1);
+ debutNonDef;
+ finNonDef;
+ limDroite("0",0);
+ limGauche(btex $+\infty$ etex,1);
+ nonDefBarre;
+ limDroite(btex $+\infty$ etex,1);
+ valPos(btex $\displaystyle 2\over{\displaystyle \sqrt3}$ etex,1/3);
+ limGauche(btex $+\infty$ etex, 1);
+ nonDefBarre;
+ limDroite(btex $+\infty$ etex, 1);
+ limGauche("0",0);
+ debutNonDef;
+ finNonDef;
+ limDroite(btex $+\infty$ etex, 1);
+ valPos("0",0);
+endTableau;
+end
+
diff --git a/graphics/metapost/contrib/macros/tableauvariations/tableauVariation.mp b/graphics/metapost/contrib/macros/tableauvariations/tableauVariation.mp
new file mode 100644
index 0000000000..5164b5b1c9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/tableauvariations/tableauVariation.mp
@@ -0,0 +1,368 @@
+% This software is copyright (c) 2005 by Frédéric Mazoit
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+
+
+
+deltaX=10pt;
+deltaY=5pt;
+deltaYvariations=20pt;
+deltaXsignes=30pt;
+
+Variables_=0;
+Signes_=1;
+Variations_=2;
+
+Plus_=0;
+Moins_=1;
+Fleche_=2;
+Valeur_=3;
+ValeurBarree_=4;
+Vide_=5;
+Barre_=6;
+NonDefBarre_=7;
+NonDefRegion_=8;
+VidePos_=9;
+Trait_=10;
+
+def mkLabel(expr x)=
+ if picture x: x
+ else: x infont defaultfont fi
+enddef;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def exists(expr i,j)=
+ known typeEl.[i][j]c
+enddef;
+
+def getH(expr x)= if known x: ypart(ulcorner x-llcorner x) else: 0 fi enddef;
+def getL(expr x)= if known x: xpart(urcorner x-ulcorner x) else: 0 fi enddef;
+
+vardef getHcase(expr i,j)=
+ max(
+ max(
+ deltaY,
+ if known el.[i][j]l: getH(el.[i][j]l) else: 0 fi),
+ max(
+ if known el.[i][j]c: getH(el.[i][j]c) else: 0 fi,
+ if known el.[i][j]r: getH(el.[i][j]r) else: 0 fi)
+ )
+enddef;
+
+vardef getMcase(expr i,j)=
+ save type;
+
+ if exists(i,j):
+ type:=typeEl.[i][j]c;
+
+ if (type=Plus_) or (type=Moins_) or (type=Fleche_) or (type=NonDefRegion_):
+ .5deltaXsignes+.5deltaX
+ elseif (type=NonDefBarre_): 2pt+.5deltaX
+ elseif (type=Barre_) or (type=Vide_): 0
+ else: .5deltaX+if known el.[i][j]c:.5getL(el.[i][j]c) else: 0 fi
+ fi
+ else: 0 fi
+enddef;
+
+vardef getGcase(expr i,j)=
+ getMcase(i,j)+ if known el.[i][j]l:getL(el.[i][j]l) else: 0 fi
+enddef;
+
+vardef getDcase(expr i,j)=
+ getMcase(i,j)+ if known el.[i][j]r:getL(el.[i][j]r) else: 0 fi
+enddef;
+
+vardef getGcol(expr col)=
+ save res,i;
+ res=0;
+ for i=1 upto nbLgn: res:=max(res,getGcase(i,col)); endfor;
+ res
+enddef;
+
+vardef getDcol(expr col)=
+ save res,i;
+ res=0;
+ for i=1 upto nbLgn: res:=max(res,getDcase(i,col)); endfor;
+ res
+enddef;
+
+vardef getHelsLgn(expr line)=
+ save res, j;
+ res:=11pt;
+ for j=0 upto nbCol: res:=max(res,getHcase(line,j)); endfor;
+ res
+enddef;
+
+vardef getHLgn(expr line)=
+ if typeLgn[line]=Variations_:
+ max(getHelsLgn(line)+deltaYvariations,40pt)+deltaY
+ else:
+ getHelsLgn(line)+deltaY
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def valSmp_(expr s,type,b)=
+ vd:=0;
+ col:=col+1;
+ if col>nbCol: nbCol:=col; fi;
+
+ typeEl.[nbLgn][col]c=type;
+ pos.[nbLgn][col]c=b;
+ el.[nbLgn][col]c=mkLabel(s);
+enddef;
+
+def sgnSmp_(expr s)=
+ vd:=0;
+ col:=col+1;
+ if col>nbCol: nbCol:=col; fi;
+
+ typeEl.[nbLgn][col]c=s;
+enddef;
+
+def chkCol(expr a)=
+ if (col mod 2)=a:
+ if ndf=1: sgn_(NonDefRegion_,1);
+ elseif (typeLgn[nbLgn]=Variations_) and (vd=0): fleche;
+ else: sgnSmp_(Vide_);
+ fi
+ fi
+enddef;
+
+def valeur_(expr s,type,b)=
+ chkCol(0);
+ valSmp_(s,type,b);
+enddef;
+
+def sgn_(expr s,a)=
+ chkCol(a);
+ sgnSmp_(s);
+enddef;
+
+def flecheBrisee(expr b)=
+ sgn_(Trait_,1);
+ vd:=0;
+ col:=col+1;
+ if col>nbCol: nbCol:=col; fi;
+
+ typeEl.[nbLgn][col]c=VidePos_;
+ pos.[nbLgn][col]c=b;
+enddef;
+
+def vide=vd:=1;sgn_(Vide_,0);enddef;
+def val(expr s)=valeur_(s,Valeur_,.5); enddef;
+def valBarre(expr s)=valeur_(s,ValeurBarree_,.5); enddef;
+def valPos(expr s,b)=valeur_(s,Valeur_,b); enddef;
+def valPosBarre(expr s,b)=valeur_(s,ValeurBarree_,b); enddef;
+def barre=sgn_(Barre_,0); enddef;
+def nonDefBarre=sgn_(NonDefBarre_,0); enddef;
+def debutNonDef=ndf:=1;barre;enddef;
+def finNonDef=barre;ndf:=0; enddef;
+
+def bord=sgn_(Barre_,1); enddef;
+def plus=sgn_(Plus_,1); enddef;
+def moins=sgn_(Moins_,1); enddef;
+def fleche=sgn_(Fleche_,1); enddef;
+
+def limGauche(expr s,b)=
+ chkCol(0);
+ pos.[nbLgn][col+1]l=b;
+ el.[nbLgn][col+1]l=mkLabel(s);
+enddef;
+
+def limDroite(expr s,b)=
+ pos.[nbLgn][col]r=b;
+ el.[nbLgn][col]r=mkLabel(s);
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def newLgn_(expr x,type)=
+ nbLgn:=nbLgn+1;
+ col:=0;
+ typeLgn[nbLgn]=type;
+
+ sgnSmp_(Vide_);
+ val(x);
+ bord;
+enddef;
+
+def newLigneVariables(expr x)=newLgn_(x,Variables_); enddef;
+def newLigneSignes(expr x)=newLgn_(x,Signes_); enddef;
+def newLigneVariations(expr x)=newLgn_(x,Variations_); enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def calculPos=
+ xCol[1]:=0;
+
+ for i=1 upto nbCol:
+ x[i]:=xCol[i]+getGcol(i);
+ xCol[i+1]:=x[i]+getDcol(i);
+ endfor
+
+ yLgn[1]:=0;
+ for i=1 upto nbLgn:
+ y[i]:=yLgn[i]-.5getHLgn(i);
+ yLgn[i+1]:=y[i]-0.5*getHLgn(i);
+ endfor;
+enddef;
+
+vardef calcP(expr i,j)=
+ if exists(i,j):
+ if (typeEl.[i][j]c=Valeur_) or (typeEl.[i][j]c=VidePos_):
+ (x[j],y[i]+(pos.[i][j]c-.5)*(getHLgn(i)-getHelsLgn(i)))
+ else: (x[j],y[i]) fi
+ else: (x[j],y[i]) fi
+enddef;
+
+vardef calcPl(expr i,j)=
+ (x[j]-2pt-.5(getL(el.[i][j]c)+getL(el.[i][j]l)),y[i]+(pos.[i][j]l-.5)*(getHLgn(i)-getHelsLgn(i)))
+enddef;
+
+vardef calcPr(expr i,j)=
+ (x[j]+2pt+.5(getL(el.[i][j]c)+getL(el.[i][j]r)),y[i]+(pos.[i][j]r-.5)*(getHLgn(i)-getHelsLgn(i)))
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef drawFleche(expr i,j,k)=
+ save aa,bb;
+ aa=j-1;
+ bb=j+1;
+ forever:
+ exitif typeEl.[i][aa]c<>Vide_;
+ aa:=aa-1;
+ endfor
+ forever:
+ exitif typeEl.[i][bb]c<>Vide_;
+ bb:=bb+1;
+ endfor
+
+ if k=Fleche_: drawarrow else: draw fi(
+ if known el.[i][aa]r: calcPr(i,aa) else: calcP(i,aa) fi--
+ if known el.[i][bb]l: calcPl(i,bb) else: calcP(i,bb) fi)
+ if known el.[i][aa]r: cutbefore(bbox(thelabel(el.[i][aa]r,calcPr(i,aa)))) fi
+ if known el.[i][aa]c: cutbefore(bbox(thelabel(el.[i][aa]c,calcP(i,aa)))) fi
+
+ if known el.[i][bb]l: cutafter(bbox(thelabel(el.[i][bb]l,calcPl(i,bb)))) fi
+ if known el.[i][bb]c: cutafter(bbox(thelabel(el.[i][bb]c,calcP(i,bb)))) fi;
+enddef;
+
+vardef rempli(expr xa,xb,ya,yb)=
+ save i;
+ for i=1 step 5pt until xb-xa+ya-yb-1:
+ draw (xa,ya-i)--(xa+i,ya) cutbefore ((xa,yb)--(xb,yb)) cutafter ((xb,ya)--(xb,yb));
+ endfor
+enddef;
+
+def afficheSigne(expr s,i,j)=
+ label(s,.5[calcP(i,j-1),calcP(i,j+1)]);
+enddef;
+
+def afficheTableau=
+ picture _pict_;
+ calculPos;
+ for i=1 upto nbLgn:
+ for j=1 upto nbCol:
+ if exists(i,j):
+ t:=typeEl.[i][j]c;
+ if t=Plus_:
+ afficheSigne(btex $+$ etex,i,j);
+ elseif t=Moins_:
+ afficheSigne(btex $-$ etex,i,j);
+ elseif t=Fleche_:
+ drawFleche(i,j,Fleche_);
+
+ elseif t=Trait_:
+ drawFleche(i,j,Trait_);
+
+ elseif t=NonDefRegion_:
+ rempli(x[j-1],x[j+1],yLgn[i],yLgn[i+1]);
+
+ elseif t=Barre_:
+ draw (x[j],yLgn[i])--(x[j],yLgn[i+1]);
+
+ elseif t=ValeurBarree_:
+ label(el.[i][j]c,calcP(i,j));
+ draw (x[j],yLgn[i])--(x[j],yLgn[i+1]) dashed evenly;
+
+ elseif t=NonDefBarre_:
+ draw (x[j]-1pt,yLgn[i])--(x[j]-1pt,yLgn[i+1]);
+ draw (x[j]+1pt,yLgn[i])--(x[j]+1pt,yLgn[i+1]);
+
+ elseif t=Valeur_:
+ label(el.[i][j]c,calcP(i,j));
+ fi
+ if known el.[i][j]l: label(el.[i][j]l,calcPl(i,j)); fi;
+ if known el.[i][j]r: label(el.[i][j]r,calcPr(i,j)); fi;
+ fi
+ endfor
+ endfor
+
+ for i=2 upto nbLgn:
+ draw (xCol[1],yLgn[i])--(xCol[nbCol+1],yLgn[i]);
+ endfor;
+
+ draw(xCol[1],yLgn[1])--(xCol[nbCol+1],yLgn[1]);
+ draw(xCol[1],yLgn[nbLgn+1])--(xCol[nbCol+1],yLgn[nbLgn+1]);
+ draw(xCol[1],yLgn[1])--(xCol[1],yLgn[nbLgn+1]);
+ draw(xCol[nbCol+1],yLgn[1])--(xCol[nbCol+1],yLgn[nbLgn+1]);
+
+ _pict_:=currentpicture; clearit; draw _pict_ scaled defaultscale;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def beginTableau(expr c) =
+ begingroup
+ charcode:=c;
+ clearxy; clearit; clearpen;
+ pickup defaultpen;
+ drawoptions();
+
+ initTableau;
+enddef;
+
+def initTableau=
+ picture el.[][]l;
+ picture el.[][]c;
+ picture el.[][]r;
+ numeric typeLgn[];
+ numeric col;
+ numeric nbLgn;
+ numeric nbCol;
+ numeric pos.[][]l;
+ numeric pos.[][]c;
+ numeric pos.[][]r;
+ numeric typeEl.[][]c;
+ numeric yLgn[];
+ numeric xCol[];
+
+ ndf:=0;
+ vd:=0;
+ col=0;
+ nbLgn=0;
+ nbCol=0;
+enddef;
+
+def endTableau=
+ afficheTableau;
+
+ shipit;
+ endgroup
+enddef;
diff --git a/graphics/metapost/contrib/macros/textpath/CHANGES b/graphics/metapost/contrib/macros/textpath/CHANGES
new file mode 100644
index 0000000000..6602622515
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/CHANGES
@@ -0,0 +1,12 @@
+Version 1.6 released on 2007-02-11:
+* Fixed: a problem with multiple root signs and textpathCureSqrt=1
+
+* Added: configuration variables
+ textpathAutoScale
+ textpathDraft
+ textpathDebug
+ These options, especially textpathAutoScale, were introduced
+ to help with automatic document generation.
+* Added: Numeric restrictions are now discussed in the manual.
+
+* Changed: Default value of textpathClip is now 0.
diff --git a/graphics/metapost/contrib/macros/textpath/README b/graphics/metapost/contrib/macros/textpath/README
new file mode 100644
index 0000000000..4c1d1f85f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/README
@@ -0,0 +1,41 @@
+% This material is subject to the LaTeX Project Public License. See
+% http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+% for the details of that license.
+
+package: textpath v1.6 2007/02/11
+author: Stephan Hennig (stephanhennig@arcor.de)
+
+
+Description
+-----------
+This MetaPost package provides macros to typeset text along
+a free path with the help of LaTeX, thereby preserving kerning
+and allowing for 8-bit input (accented characters).
+
+
+Installation
+------------
+To install the package put the files into the following
+directories in a local textmf tree and update the file
+name data base.
+
+<localtexmftree>/doc/metapost/textpath:
+ textpath.pdf
+ textpath.tex
+ textpathfigs.mp
+ textpathfigs.tex
+
+<localtexmftree>/metapost/textpath:
+ textpath.mp
+
+<localtexmftree>/tex/latex/textpath:
+ textpathmp.sty
+
+
+Usage Notes
+-----------
+See file textpath.pdf.
+
+
+Happy TeXing!
+Stephan Hennig
diff --git a/graphics/metapost/contrib/macros/textpath/textpath.mp b/graphics/metapost/contrib/macros/textpath/textpath.mp
new file mode 100644
index 0000000000..2da8387927
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpath.mp
@@ -0,0 +1,454 @@
+%%% textpath.mp
+%%% Copyright 2007 Stephan Hennig <stephanhennig@arcor.de>
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+
+if known textpath_fileversion: endinput fi;
+string textpath_fileversion;
+textpath_fileversion := "v1.6 (2007/02/11)";
+message "Loading textpath " & textpath_fileversion;
+
+
+%%% Global variables.
+
+%%% Global variable.
+%%% Character coordinates that lay outside path boundaries after
+%%% transformation are clipped to the boundaries.
+%%% Variable textpathClip determines if such characters should be
+%%% output at path boundaries, thereby acting as a visual indicator
+%%% that something went wrong, or if text outside path boundaries
+%%% should be omitted. Variable textpathClip can be either one (omit)
+%%% or zero (don't omit).
+newinternal textpathClip;
+textpathClip := 0;
+
+%%% Global variable.
+%%% Variable textpathLetterSpace determines the amount of space that
+%%% is additionally inserted between all characters. This can be
+%%% useful, when drawing text along a concacve shape or in general
+%%% along paths with a high curvature. Variable textpathLetterSpace
+%%% can contain positive or negative values.
+newinternal textpathLetterSpace;
+textpathLetterSpace := 0bp;
+
+%%% Global variable.
+newinternal textpathRotation;
+textpathRotation := 0;
+
+%%% Global variable.
+newinternal textpathAbsRotation;
+textpathAbsRotation := 0;
+
+newinternal textpathRepeat;
+textpathRepeat := 1;
+
+newinternal textpathStretch;
+textpathStretch := 1;
+
+newinternal textpathHSpace;
+textpathHSpace := 0;
+
+newinternal textpathShift;
+textpathShift := 0;
+
+newinternal textpathSoulLetterSpace;
+textpathSoulLetterSpace := 10bp;
+
+newinternal textpathFancyStrokes;
+textpathFancyStrokes := 1;
+
+newinternal textpathStrokePrecision;
+textpathStrokePrecision := 10;
+
+newinternal textpathCureSqrt;
+textpathCureSqrt := 1;
+
+newinternal textpathAutoScale;
+textpathAutoScale := 0;
+
+newinternal textpathDraft;
+textpathDraft := 0;
+
+newinternal textpathDebug;
+textpathDebug := 1;
+
+pair textpathHookCoord, textpathHookPoint;
+newinternal textpathHookRot;
+textpathHookCoord := origin;
+textpathHookPoint := origin;
+textpathHookRot := 0;
+
+
+
+%%% User Macros.
+
+%%% User macro.
+%%% Set text along a path.
+%%% Parameters:
+%%% * a text string t that is fed into TeX through latexmp,
+%%% * a path p the text should follow.
+%%% * a numeric variable j that controls justification:
+%%% j=0: text is left aligned on the path,
+%%% j=0.5: text is centered on the path,
+%%% j=1: text is right aligned on the path,
+%%% The general rule is the character at fraction j of the total
+%%% text width is transformed to the point at fraction j of the total
+%%% path width. j should be from the interval [0, 1].
+%%% Return value:
+%%% * a picture variable containing text following a path.
+def textpath(expr t, p, j)=
+ textpathFont("", t, p, j)
+enddef;
+
+
+%%% User macro.
+%%% Set text in arbitrary font along a path.
+%%% Parameters:
+%%% * a string f that is a valid LaTeX font selection command, e.g., \itshape,
+%%% * a text string t that is fed into TeX through latexmp,
+%%% * a path p the text should follow.
+%%% * a numeric variable j that controls justification:
+%%% j=0: text is left aligned on the path,
+%%% j=0.5: text is centered on the path,
+%%% j=1: text is right aligned on the path,
+%%% The general rule is the character at fraction j of the total
+%%% text width is transformed to the point at fraction j of the total
+%%% path width. j should be from the interval [0, 1].
+%%% Return value:
+%%% * a picture variable containing text following a path.
+vardef textpathFont(expr f, t, p, j)=
+save pre, post;
+string pre, post;
+ pre := f & "\spaced{";
+ post := "}";
+ textpathToPic(strToPic(pre & t & post), p, j)
+enddef;
+
+
+%%% User macro.
+%%% Set text along a path.
+%%% Parameters:
+%%% * a text string t that is fed into TeX through latexmp,
+%%% * a path p the text should follow.
+%%% * a numeric variable j that controls justification:
+%%% j=0: text is left aligned on the path,
+%%% j=0.5: text is centered on the path,
+%%% j=1: text is right aligned on the path,
+%%% The general rule is the character at fraction j of the total
+%%% text width is transformed to the point at fraction j of the total
+%%% path width. j should be from the interval [0, 1].
+%%% Return value:
+%%% * a picture variable containing text following a path.
+vardef textpathRaw(expr t, p, j)=
+save pre, post;
+string pre, post;
+ pre := "\rule[-30bp]{0pt}{30bp}";
+ post := "";
+ textpathRawToPic(strToPic(pre & t & post), p, j)
+enddef;
+
+
+
+%%% Internal Macros.
+
+%%% Internal macro.
+%%% Convert a string into a picture using TeX via latexmp package.
+%%% Parameters:
+%%% * a string.
+%%% Return value:
+%%% * a picture variable.
+vardef strToPic(expr s)=
+interim labeloffset := 0bp;
+ thelabel.urt(textext(s), origin)
+enddef;
+
+
+%%% Internal macro.
+%%% Computes the length of a textual picture, thereby correcting
+%%% for textpathSoulLetterSpace and textpathLetterSpace
+vardef getPictureWidth(expr textpic, scale)=
+save lenpic, k, w;
+numeric lenpic, k, w;
+ lenpic := 0;
+ k := 0;
+ for item within textpic:
+ if textual item:
+ w := xpart lrcorner ( item shifted (scale*k*(textpathLetterSpace-textpathSoulLetterSpace), 0bp) );
+ if w > lenpic:
+ lenpic := w;
+ fi
+ k := k + 1;
+ fi
+ endfor
+ lenpic
+enddef;
+
+
+%%% Internal macro.
+%%% Does pre-processing for macros textpath(Raw)ToPic, such as
+%%% calculating variables startOffset, autoScale, ltextpathHSpace etc.
+def preprocessTextPic(expr rawMode, atextpic, p, j)=
+ save textpic, pic, lenp, lenpic, startOffset, ltextpathHSpace, autoScale, overfullPath;
+ interim bboxmargin := 0bp;
+ numeric lenp, lenpic, startOffset, ltextpathHSpace, autoScale;
+ picture textpic, pic;
+ boolean overfullPath;
+
+ textpic := atextpic;
+ pic := nullpicture;
+%%% Compute path length.
+ lenp := arclength(p);
+%%% Compute picture length, i.e., correct plain picture dimensions
+%%% for soul and textpath letter spacing.
+ if rawMode:%%% Called from textpathRawToPic.
+ lenpic := xpart (lrcorner textpic - llcorner textpic);
+ else:%%% Called from textpathToPic.
+ lenpic := getPictureWidth(textpic, 1);%%% Get corrected picture with scale = 1.
+ fi
+%%% Compute inter-copy space (for textpathRepeat > 1).
+ if textpathStretch = 0:
+ ltextpathHSpace := textpathHSpace;
+ else:
+ ltextpathHSpace := lenp/textpathRepeat - lenpic;
+ fi
+%%% Compute startOffset as j * remaining space.
+ startOffset := j * (lenp - textpathRepeat*lenpic - (textpathRepeat-1)*ltextpathHSpace);
+%%% By default, assume path isn't overfull.
+ overfullPath := false;
+ autoScale := 1;
+%%% Overfull path?
+ if startOffset < 0:
+ overfullPath := true;
+ if textpathAutoScale <> 0:%%% Calculate scaling factor.
+ if textpathStretch <> 0:
+ ltextpathHSpace := 0;%%% No inter-copy space when stretching allowed.
+ fi
+ autoScale := lenp/(textpathRepeat*lenpic + (textpathRepeat-1)*ltextpathHSpace1);
+ startOffset := 0;
+ if textpathDraft = 0:
+ textpic := atextpic scaled autoScale;
+ else:
+ textpic := atextpic xscaled autoScale;%%% Don't scale y in draft mode.
+ fi
+ lenpic := getPictureWidth(textpic, autoScale);
+%%% Compute inter-copy space (for textpathRepeat > 1).
+ if textpathStretch = 0:
+ ltextpathHSpace := textpathHSpace*autoScale;
+ else:
+ ltextpathHSpace := lenp/textpathRepeat - lenpic;%%% Should be equal to zero.
+ fi
+%%% Finally, output a warning.
+ message "Package textpath warning: Overfull path! Scaled to " & decimal autoScale & ".";
+ else:%%% No scaling.
+ autoScale := 1;
+ if textpathClip = 0:%%% Warn the user about overfull paths.
+ message "Package textpath warning: Overfull path! Not clipped.";
+ else:
+ message "Package textpath warning: Overfull path! Clipped.";
+ fi
+ fi
+ fi
+enddef;
+
+
+
+%%% Internal macro.
+def transformSimpleItem(expr rawMode, item, p)=
+%%% bitem is a character or straight rule to transform.
+%%% banker is its original anchor position.
+ if rawMode:
+ bitem := item;
+ banker := (xpart center bitem, autoScale*30bp);%%% Why 30bp?
+ else:
+ bitem := item shifted (k*autoScale*(textpathLetterSpace-textpathSoulLetterSpace), 0bp);
+ banker := (xpart center bitem, ypart item);
+ fi
+%%% bx is the anchor position of a first item copy.
+ bx := (xpart banker) + startOffset;
+%%% Shift anchor to origin and raise baseline.
+ bitem := bitem shifted -banker shifted (0bp, textpathShift);
+%%% Iterate over all copies of an item.
+ for i=1 upto textpathRepeat:
+%%% cx is the anchor position of an item copy.
+ cx := (i-1)*(lenpic + ltextpathHSpace) + bx;
+%%% Draw items with valid positions or if no clipping.
+ if ((cx>=0) and (cx<=lenp)) or (textpathClip=0):
+%%% Compute path time value.
+ tb := arctime cx of p;
+%%% Compute rotation angle.
+ if textpathAbsRotation=0:
+ db := textpathRotation + angle direction tb of p;
+ else:
+ db := textpathRotation;
+ fi
+%%% Draw item's bounding box?
+ if odd (textpathDebug div 2):
+ addto pic doublepath bbox bitem rotated db shifted point tb of p withpen currentpen;
+ fi
+%%% Draw item?
+ if odd (textpathDebug div 1):
+%%% In draft mode fill bounding box if path is overfull.
+ if overfullPath and (textpathDraft<>0):
+ addto pic contour bbox bitem rotated db shifted point tb of p;
+ else:
+ addto pic also bitem rotated db shifted point tb of p;
+ fi
+ fi
+%%% Draw item's anchor point?
+ if odd (textpathDebug div 4):
+ addto pic contour fullcircle scaled 3bp shifted point tb of p;
+ fi
+ fi
+ endfor
+%%% Save top right corner of supported square root glyphs in variable textpathHookCoord.
+ if rawMode and (textpathCureSqrt <> 0):
+ if ((fontpart item="cmex10") and ((ASCII textpart item>=112) and (ASCII textpart item<=116))) or
+ ((fontpart item="cmsy5") and (ASCII textpart item=112)) or
+ ((fontpart item="cmsy6") and (ASCII textpart item=112)) or
+ ((fontpart item="cmsy7") and (ASCII textpart item=112)) or
+ ((fontpart item="cmsy8") and (ASCII textpart item=112)) or
+ ((fontpart item="cmsy9") and (ASCII textpart item=112)) or
+ ((fontpart item="cmsy10") and (ASCII textpart item=112)) or
+ ((fontpart item="cmbsy10") and (ASCII textpart item=112)) or
+ ((fontpart item="fourier-mex") and (ASCII textpart item=114)) or
+ ((fontpart item="fourier-ms") and (ASCII textpart item=112)) or
+ ((fontpart item="MnSymbolE5") and (ASCII textpart item=186)) or
+ ((fontpart item="MnSymbolE5") and (ASCII textpart item=189)) or
+ ((fontpart item="MnSymbolE10") and (ASCII textpart item=186)):%%% \sqrt glyph?
+ textpathHookCoord := urcorner item shifted (-xpart center item, -autoScale*30bp + textpathShift);
+ textpathHookRot := db;
+ textpathHookPoint := point tb of p;
+% addto pic contour fullcircle scaled 2bp shifted textpathHookCoord rotated db shifted point tb of p withcolor green;
+ else:
+ textpathHookCoord := origin;
+ fi
+ fi
+enddef;
+
+
+%%% Internal macro.
+def transformStrokedItem(expr rawMode, item, p)=
+ if textpathFancyStrokes = 0:
+ transformSimpleItem(true, item, p);
+ else:
+ pp := pathpart item;
+ for i=1 upto textpathRepeat:
+ if (textpathHookCoord=origin) or (textpathCureSqrt=0):
+ banker := (0, ypart point 0 of pp - autoScale*30bp + textpathShift);
+ bx := (xpart point 0 of pp) + startOffset;
+ dpp := angle direction 0 of pp;
+ cx := (i-1)*(lenpic + ltextpathHSpace) + bx;
+ tb := arctime cx of p;
+ if textpathAbsRotation=0:
+ db := textpathRotation + angle direction tb of p;
+ else:
+ db := textpathRotation;
+ fi
+ np := banker rotated db shifted point tb of p%{dir (dpp+db)}
+ elseif textpathCureSqrt=1:
+ np := textpathHookCoord shifted (dir(-90)*xpart point 0 of makepath penpart item);
+ np := np rotated textpathHookRot shifted textpathHookPoint%{dir textpathHookRot}
+ fi
+ for h=1 upto textpathStrokePrecision:
+ hide(
+ banker := (0, ypart point (h/textpathStrokePrecision) of pp - autoScale*30bp + textpathShift);
+ bx := (xpart point (h/textpathStrokePrecision) of pp) + startOffset;
+ cx := (i-1)*(lenpic + ltextpathHSpace) + bx;
+ dpp := angle direction (h/textpathStrokePrecision) of pp;
+ tb := arctime cx of p;
+ if textpathAbsRotation=0:
+ db := textpathRotation + angle direction tb of p;
+ else:
+ db := textpathRotation;
+ fi
+ )
+ ..banker rotated db shifted point tb of p%{dir (dpp+db)}
+ endfor;
+ if odd (textpathDebug div 2):
+ addto pic doublepath bbox np withpen currentpen;
+ fi
+ if odd (textpathDebug div 1):
+ addto pic doublepath np withpen penpart item;
+ fi
+ if odd (textpathDebug div 4):
+%%% Doesn't work.
+% addto pic contour fullcircle scaled 3bp shifted point tb of p;
+ fi
+ endfor
+ fi
+enddef;
+
+
+
+
+%%% Internal working macro.
+%%% Set text from picture variable along a path with justification j.
+%%% Parameters:
+%%% * a picture that contains the text that has to be transformed onto a path,
+%%% * a path p the text should follow,
+%%% * a numeric variable that controls justification,
+%%% Return value:
+%%% * a picture variable containing text following a path.
+vardef textpathToPic(expr atextpic, p, j)=
+ save bitem, banker, k, bx, cx, tb, db;
+ numeric k, bx, cx, tb, db;
+ picture bitem;
+ pair banker;
+
+ %%% Calculate variables such as startOffset, autoScale, ltextpathHSpace etc.
+ preprocessTextPic(false, atextpic, p, j);
+ %%%
+ %%% Now iterate over all picture elements.
+ %%%
+ k := 0;
+ for item within textpic:
+ if textual item:%%% Process textual elements.
+ transformSimpleItem(false, item, p);
+ k := k + 1;
+ else:
+ message "Package textpath warning: Unsupported picture element found!";
+ fi
+ endfor
+ %%% Return pic.
+ pic
+enddef;
+
+
+
+%%% Internal working macro.
+%%% Set text from picture variable along a path with justification j.
+%%% Parameters:
+%%% * a picture that contains the text that has to be transformed onto a path,
+%%% * a path p the text should follow,
+%%% * a numeric variable that controls justification,
+%%% Return value:
+%%% * a picture variable containing text following a path.
+vardef textpathRawToPic(expr atextpic, p, j)=
+ save bitem, banker, bx, cx, tb, db, pp, np, dpp;
+ numeric bx, cx, tb, db, dpp;
+ picture bitem;
+ pair banker;
+ path pp, np;
+
+ %%% Calculate variables such as startOffset, autoScale, ltextpathHSpace etc.
+ preprocessTextPic(true, atextpic, p, j);
+%%% Reset last sqrt glyph's top right bounding box corner.
+ textpathHookCoord := origin;
+ %%%
+ %%% Now iterate over all picture elements.
+ %%%
+ for item within textpic:
+ if textual item:%%% Process textual elements.
+ transformSimpleItem(true, item, p);
+ elseif stroked item:%%% Process stroked elements.
+ transformStrokedItem(true, item, p);
+ else:
+ message "Package textpath warning: Unsupported picture element found!";
+ fi
+ endfor
+ pic
+enddef;
diff --git a/graphics/metapost/contrib/macros/textpath/textpath.pdf b/graphics/metapost/contrib/macros/textpath/textpath.pdf
new file mode 100644
index 0000000000..0d7972b563
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpath.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/textpath/textpath.tex b/graphics/metapost/contrib/macros/textpath/textpath.tex
new file mode 100644
index 0000000000..6ef2623523
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpath.tex
@@ -0,0 +1,601 @@
+\documentclass{article}
+\usepackage{amssymb}
+\usepackage{booktabs}
+\usepackage{array}
+\usepackage{graphicx}
+\DeclareGraphicsRule{*}{mps}{*}{}
+\usepackage{verbatim}
+\newcommand*{\cmd}[1]{\texttt{#1}}
+\newcommand*{\pkg}{\cmd{textpath.mp}}
+\newcommand{\user}[1]{\emph{#1}}
+\newenvironment{listing}{%
+ \small%
+ \verbatim%
+}{%
+ \endverbatim%
+}
+\begin{document}
+\title{The \pkg\ package\thanks{This document describes \pkg\ v1.6.}}
+\author{Stephan Hennig\thanks{stephanhennig@arcor.de}}
+\date{\today}
+\maketitle
+
+\begin{abstract}
+The MetaPost package \pkg\ provides macros to typeset text along a free path. It differs from the \cmd{txp.mp} package in that is uses \LaTeX\ to typeset the text and therefore 8-bit characters, \emph{e.g.}, accented characters, are supported and text is kerned. Moreover, even mathematical copy can be handled.
+\end{abstract}
+
+\suppressfloats
+
+
+\section{A first example}\label{sec:firstexample}
+The \pkg\ package provides a \cmd{textpath} macro, that takes three arguments:
+\begin{enumerate}
+\item a text string that is valid \LaTeX\ input,
+\item a path the text should follow, and
+\item a numeric value that controls justification of the text on the path.
+\end{enumerate}
+The macro returns a picture that contains the text transformed to the path. A sample call to \cmd{textpath} could be
+
+\begin{listing}
+draw textpath("Greetings from MetaPost!", fullcircle scaled 50bp, 0);
+\end{listing}
+
+The resulting output is shown in figure~\ref{fig:firstexample}.
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.1}
+ \caption{Our first application.}
+ \label{fig:firstexample}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.2}
+ \caption{A refined variant.}
+ \label{fig:secondexample}
+\end{minipage}
+\end{figure}
+
+\user{Interesting, but not what I'd expect.} Well, figure~\ref{fig:firstexample} looks exactly as what we formulated in our MetaPost programme above. The text is drawn along a circle segment that starts at an angle of zero, runs counter clockwise and the text is left aligned on the path. Left aligned in this context means that text starts at the beginning of the path.
+
+\user{But the text is inside the circle.} Yes, by default, text is typeset on the left-hand side of a path---if you were virtually walking down the path. There are configuration options to change that behaviour (see section~\ref{sec:Rotating}), but those won't help in this situation, since as a result text would run right-to-left. Instead, have a look at the following changes to our code and the resulting figure~\ref{fig:secondexample}:
+
+\begin{listing}
+path p;
+p := reverse fullcircle rotated -90 scaled 50bp;
+draw textpath("Greetings from MetaPost!", p, 0.5);
+\end{listing}
+
+\user{What a magic path declaration!} The path now starts at an angle of $-90$ degrees and runs clockwise. Did you notice the last parameter to \cmd{textpath} changed to $0.5$ in the programme? If it were zero, the text would start at the bottom of the circle and run clockwise along the outside of the circle. With the alignment parameter set to $0.5$ the text is centered on the path. That's the reason for rotating start and end points of the circle to $-90$ degrees.
+
+By the way, do you notice anything wrong with figure~\ref{fig:secondexample}? We'll come back to that problem at the end of this manual. The next section discusses the parameters of the \cmd{textpath} macro in detail.
+
+\subsection{Text strings}
+\subsubsection{Setting up the \pkg\ package}
+Internally, the string you pass to \cmd{textpath} as the first argument is processed by \LaTeX\ by means of the \cmd{latexmp} package. This is hardcoded, currently, but may change in future versions so that you can use conventional \cmd{btex...etex} commands or the \cmd{TEX} macro.
+
+The \cmd{latexmp} package has to be set up with a proper \LaTeX\ preamble. The easiest way to do so is by providing a preamble file (without \verb+\begin{document}+) and input \cmd{latexmp.mp} using the following lines:
+
+\begin{listing}
+input latexmp
+setupLaTeXMP(preamblefile="mypreamble");
+\end{listing}
+
+The last step in setting up the \pkg\ package is adding the following line to the \LaTeX\ preamble in file \cmd{mypreamble.tex}:
+
+\begin{listing}
+\usepackage{textpathmp}
+\end{listing}
+Note the trailing ``mp'' in the \LaTeX\ package name!
+
+\subsubsection{Restrictions on text input and output}\label{sec:restrictions}
+Transforming text onto a path, \emph{i.e.}, rotating and shifting the text, should be done character by character, since otherwise there could be characters that move too far away from the path (cf. figure~\ref{fig:rawMetaPost}). Unfortunately, MetaPost doesn't provide guaranteed character-wise access to a text picture generated by \LaTeX. Therefore, some provisions have to be taken to enable characer-wise access. Internally, on the \LaTeX\ side the text string passed to \cmd{textpath} is pre-processed by the \cmd{soul} package.
+
+\paragraph{Invalid input} Therefore, input must not contain any material \cmd{soul} can't handle. If you're encountering errors from the \cmd{soul} package on the console delete the corresponding \cmd{ltx-???.tmp} file in your working directory and try with a simpler text string. Explicitely, the following restrictions apply to input:
+\begin{itemize}
+\item Vertical material is not valid.
+\item Font selection commands aren't allowed inside a text string. See section~\ref{sec:textpathFont} for a solution.
+\item If you want to add arbitrary horizontal space in the copy, you should do that with \verb+\<{\kernXpt}+, where X is the desired space.
+\end{itemize}
+In general, try to stick to simple text.
+
+\paragraph{Valid input} However, input may contain:
+\begin{itemize}
+\item plain horizontal material,
+\item accented characters: These are fine in the input as long as you choose the correct input encoding in the \LaTeX\ preamble and you have a font that provides true accented characters, \emph{e.g.}, a font supporting T1 encoding.
+\item mathematical formulae: These are supported by a raw interface, see section~\ref{sec:textpathRaw}. The standard macros don't support mathematical copy.
+\item rules: There's quite sophisticated support for rules in mathematical formulae, but only in the raw interface (see section~\ref{sec:textpathRaw}).
+\end{itemize}
+
+\paragraph{Output} The following restrictions apply to the output of \cmd{textpath} \emph{et al.}:
+\begin{itemize}
+\item Ligatures are broken in the output.
+\end{itemize}
+
+
+\subsection{Paths}\label{sec:paths}
+As mentioned before, by default, text is typeset on the left-hand side of a path. That is, the text is rotated to have the natural slope of the path at the desired location. Configuration options to change that behaviour are described in section~\ref{sec:Rotating}.
+
+When a path is too short to carry all text, characters exceeding path boundaries are drawn at the boundaries, by default. Alternatively, text can be clipped or scaled automatically to fits onto the path. All configuration options of the \pkg\ package are described in detail in section~\ref{sec:ClippingScalingDraft}.
+
+\begin{figure}
+\centering
+% \begin{minipage}[t]{.45\linewidth}
+% \centering
+ \includegraphics{textpathfigs.3}
+ \caption{Using different fonts in a MetaPost graphic.}
+ \label{fig:textpathFont}
+% \end{minipage}
+\end{figure}
+
+
+\subsection{Text justification}
+Justification of the text on the path can be controlled by the third parameter~\cmd{j}, which is a numeric value. Setting it to zero makes the text left aligned, \emph{i.e.}, text starts right at be beginning of a path. A value of one makes the text right aligned, \emph{i.e.}, text ends at the end point of a path. A value of $0.5$ centers text on a path.
+
+There is a general rule: the point at fraction \cmd{j} of total text width is transformed to the point on the path at fraction \cmd{j} of total path length. Therefore, \cmd{j} should be from the intervall $[0,1]$.
+
+
+
+\section{Handling different fonts}\label{sec:textpathFont}
+Since the \cmd{soul} package can't handle font selection commands in the copy, one were stuck to the font that is setup in the \LaTeX\ preamble for the whole MetaPost document. The \cmd{textpathFont} macro provides an additional macro \cmd{textpathFont} that accepts \LaTeX\ font selection commands in an additional string argument and applies those before the \cmd{soul} package comes into play. Unfortunately, switching the font inside text still isn't possible that way.
+
+The font selection string has to be given as the first argument. The remaining arguments are the same as for \cmd{textpath} (see figure~\ref{fig:textpathFont}).
+
+\begin{listing}
+p := reverse fullcircle rotated -90;
+draw textpathFont("\usefont{T1}{pzc}{m}{n}\huge", "Happy Birthday to",
+ p scaled 400bp, 0.5) withcolor (1, 0.6, 0.2);
+draw textpathFont("\usefont{T1}{bch}{m}{n}\large", "Daisy Duck!",
+ p scaled 350bp, 0.5) withcolor (0.9, 0.3, 0.1);
+\end{listing}
+
+
+
+\section{The raw interface}\label{sec:textpathRaw}
+In case you're fine with \cmd{textpath} and \cmd{textpathFont} and you do not intend to typeset mathematical formulae along a path, you may savely skip this section and read on with section~\ref{sec:Configuration} where configuration options are described.
+
+The \pkg\ package provides a third macro \cmd{textpathRaw} to typeset material along a path. This is the so called raw interface. As we've seen in section~\ref{sec:restrictions}, input to \cmd{textpath} and \cmd{textpathFont} is pre-processed by the \cmd{soul} package. In contrast, input to the raw interface isn't pre-processed. Have a look at figure~\ref{fig:rawMetaPost} to see how MetaPost accesses arbitrary chunks of characters at once without pre-processing on the \LaTeX\ side.
+
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.4}
+ \caption{Transforming arbitrary chunks of characters at once using the raw interface.}
+ \label{fig:rawMetaPost}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.5}
+ \caption{A formula typeset along a path.}
+ \label{fig:rawFormula}
+\end{minipage}
+\end{figure}
+
+\user{Why is the word ``MetaPost'' broken between letters ``P'' and ``o''?} In fact, MetaPost doesn't process \emph{arbitrary} chunks of characters. It rather collects and processes chunks of characters that are typeset without artificial horizontal space between them. That is, text is broken into chunks by MetaPost at inter-word space, kerning, \emph{etc.} Clearly, in our example kerning took place between glyphs ``P'' and ``o'' while other glyph pairs weren't kerned.
+
+Arguments to the \cmd{textpathRaw} macro are the same as to the \cmd{textpath} macro. The differences between \cmd{textpath} and \cmd{textpathRaw} are:
+\begin{itemize}
+\item Font selection commands are allowed in input to \cmd{textpathRaw}.
+\item Rules are supported.
+\item Manual horizontal space is allowed in the input.
+\item Ligatures are preserved.
+\end{itemize}
+
+As we see in figure~\ref{fig:rawMetaPost}, macros \cmd{textpath} and \cmd{textpathFont} are much better suited to typeset plain text along a path than \cmd{textpathRaw}. However, there is one application where \cmd{textpathRaw} performs better than \cmd{textpath}: mathematical formulae. Have a look at figure~\ref{fig:rawFormula}. Have you ever seen stuff like that with any other text processing or graphics application?
+
+The reason \cmd{textpathRaw} doesn't fail as badly on mathematical input as it does on plain text is that in formulae characters are rarely typeset without extra space between each other. That is, MetaPost quite often breaks formulae into chunks and hence naturally processes them character-wise. The exception to this are operator names such as $\log$, $\sin$, $\arctan$ \emph{etc.\@} and sometimes products of variables. The latter can be avoided by explicitely inserting \verb+\cdot+ between factors.
+
+\user{What about more complicated formulae with fractions \emph{etc.}?} Have a look at figure~\ref{fig:rawFraction}. Since rules are explicitely supported by \cmd{textpathRaw} fractions are no problem.
+
+\begin{figure}
+ \centering
+ \includegraphics{textpathfigs.6}
+ \caption{A formula containing fractions.}
+ \label{fig:rawFraction}
+\end{figure}
+
+\user{Awesome! The rules are curved, too!} Yes, since formulae can look awful otherwise the \pkg\ package puts some efforts into that. Section~\ref{sec:OptionsRaw} describes an option that lets you choose between curved and straight rules.
+
+\user{Any restrictions?} Well, on concave shapes formulae look even more ugly than plain text. For a technical restriction, formulae shouldn't be of too large height and depth. Section~\ref{sec:OptionsRaw} shows a solution to another problem with root operators not discussed so far.
+
+That's it---almost. The remaining chapter describes global variables to configure the \pkg\ package, \emph{i.e.}, the way macros \cmd{textpath}, \cmd{textpathFont} and \cmd{textpathRaw} work. Quite some interesting effects can be achieved with certain settings. So don't miss the last chapter!
+
+
+
+\section{Configuration variables}\label{sec:Configuration}
+The \pkg\ offers several configuration options through global variables. Some of them have already been mentioned in the other sections. This chapter discusses all configuration variables in detail.
+
+Since all of the global variables have been defined as \cmd{newinternal}, changing a setting locally to a group is possible using an \cmd{interim} declaration. That is, the following code \emph{temporarily} switches clipping on inside \cmd{begingroup \ldots\ endgroup}:
+
+\begin{listing}
+draw textpath("A text too long to fit onto p", p, 0);
+begingroup
+ interim textpathClip := 1;
+ draw textpath("A text too long to fit onto p", p, 0);
+endgroup;
+\end{listing}
+
+This is convenient since every \cmd{beginfig()} statement already opens a group.
+
+
+\subsection{Repeating and Shifting}
+
+\subsubsection{Variable \cmd{textpathRepeat}}
+If you want to place multiple copies of a piece of text along a path you don't have to manually copy it in the input. Instead, just pass the original text as an argument to \cmd{textpath} and set variable \cmd{textpathRepeat} to the required number of copies before calling \cmd{textpath}. Valid numbers for \cmd{textpathRepeat} are integer values greater or equal to one. By default, \cmd{textpathRepeat} is set to one.
+
+Note, that the alignment parameter \cmd{j} still works when setting \cmd{textpathRepeat} to values greater than one. That is, for \cmd{j=0} the first text copy still starts at the beginning of a path and for \cmd{j=1} the last text copy ends at the end of a path.
+
+\subsubsection{Variables \cmd{textpathStretch} and \cmd{textpathHSpace}}
+When variable \cmd{textpathRepeat} is to a value greater than one, ``horizontal'' spacing between single copies of the text string is determined manually or automatically, depending on variable \cmd{textpathStretch}. If \cmd{textpathStretch} is set to one, the amount of space that is inserted between text copies is automatically determined, which is the default. If \cmd{textpathStretch} is set to zero variable \cmd{textpathHSpace} determines the amount of space between text copies. Note, that \cmd{textpathStretch} has only effect when variable \cmd{textpathRepeat} is set to a value larger than one.
+
+Figures~\ref{fig:textpathHSpace} and~\ref{fig:textpathStretch} show examples of manually and automatically spaced text copies. Note, that when text copies are automatically spaced the sum of space before and after all text copies equals the space between text copies. This is quite handy when typesetting text along a cyclic path as in figure~\ref{fig:textpathShift}. You shouldn't be able to spot the start and end points of the path there other than by inspecting the code.
+
+\begin{listing}
+f := "\usefont{T1}{pzc}{m}{n}\Large";
+p := subpath (5.7,6.3) of fullcircle scaled 1400bp;
+draw p withcolor .8white;
+textpathRepeat := 3;
+textpathStretch := 0;
+textpathHSpace := 10pt;
+draw textpathFont(f, "Happy Birthday", p, 0.5) withcolor (1, 0.6, 0.2);
+\end{listing}
+
+\begin{figure}
+ \centering
+ \includegraphics{textpathfigs.7}
+ \caption{Repeated text manually spaced and centered.}
+ \label{fig:textpathHSpace}
+ \vspace{\baselineskip}
+ \includegraphics{textpathfigs.8}
+ \caption{The same text automatically spaced, centered and left aligned.}
+ \label{fig:textpathStretch}
+\end{figure}
+
+
+
+\subsubsection{Variable \cmd{textpathShift}}
+Variable \cmd{textpathShift} determines the ``vertical'' shifting of characters. That is, text can be shifted orthogonally to a path (\emph{i.e.,} the baseline). Positive values of \cmd{textpathShift} result in characters shifted to the left of a path---looking into the natural direction of a path---, while negative values shift characters to the right of a path.
+
+In figure~\ref{fig:textpathShift} the thick black border should be both, the path our text follows and the background of the text. Therefore, we need to ``vertically'' center the text on the path. A small negative value for \cmd{textpathShift} serves our purposes well.
+
+\begin{listing}
+% Font Brush ScriptX Italic is available on CTAN.
+f := "\usefont{T1}{pbsi}{xl}{n}\fontsize{2.1pt}{2.1pt}\selectfont";
+w := 210bp;
+h := .276w;
+r := .19h;
+p := (-.5w,0)--(-.5w,.5h-r)--quartercircle rotated -90 scaled (2r)
+ shifted (-.5w,.5h)--(0,.5h);
+p := p--reverse p reflectedabout ((0,-1),(0,1));
+p := p--reverse p reflectedabout ((-1,0),(1,0))--cycle;
+draw p withpen pensquare scaled 3.5pt;
+textpathRepeat := 30;
+textpathShift := -.6pt;
+draw textpathFont(f, "Fa\ss' Dich kurz!", p, 0.5) withcolor white;
+label(textext
+ ("\usefont{T1}{bfu}{mb}{n}\fontsize{22pt}{22pt}\selectfont
+ Telephonzelle"), origin);% Bitstream Futura
+\end{listing}
+
+\begin{figure}
+ \centering
+ \includegraphics{textpathfigs.9}
+ \caption{An attempt to resemble the style of classic labels (failing badly). At least this is an example of automatically spacing and shifting text on a path.}
+ \label{fig:textpathShift}
+\end{figure}
+
+\subsubsection{Variable \cmd{textpathLetterSpace}}
+When typesetting text along a path with a high curvature the resulting curved text may look squeezed or letter-spaced, depending on path shape. That's because natural inter-letter space refers to unrotated characters and is only proper near the baseline of rotated characters. On a convex shape, therefore, text tends to look letter-spaced where, in fact, it isn't. In contrast, on a concave shape glyphs may touch each other. Comparing figures~\ref{fig:firstexample} and~\ref{fig:secondexample} the latter looks lighter, since inter-letter space raises with the distance from the baseline. The same effect can be seen in figure~\ref{fig:anchor}, \emph{e.g.}, between characters ``a'' and ``i''.
+
+The \pkg\ package provides means to manually adjust inter-letter space. Before transforming a character onto the path the \pkg\ package inserts an additional amount of horizontal space of width \cmd{textpathLetterSpace} between all characters. This variable is a good friend when shifting or rotating characters. Finding a good value can be a tricky task, but activating debug bit~1 may help here (see section~\ref{sec:Debugging}).
+
+By default, \cmd{textpathLetterSpace} is set to zero, that is, text is typeset at its natural width. Variable \cmd{textpathLetterSpace} has only effect when typesetting text through macros \cmd{textpath} and \cmd{textpathFont}. In macro \cmd{textpathRaw} this variable is ignored.
+
+
+\subsection{Rotating}\label{sec:Rotating}
+
+\subsubsection{Variable \cmd{textpathRotation}}
+In section~\ref{sec:paths} it was already mentioned that text turns out on the left-hand side of a path, by default. This is an appropriate setting for left-to-right reading cultures.
+
+The \pkg\ package, internally, calculates for each character in the text string the position of its anchor point on the path and the slope of the path at that location. The anchor point of a character lies on the baseline at the horizontal center of its bounding box (see figure~\ref{fig:anchor}). The character is then rotated around its anchor point by an angle corresponding to the slope. Finally, the anchor point is translated to the required coordinates on the path. As a result, characters appear on the left-hand side of a path.
+
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.10}
+ \caption{The anchor point of a character.}
+ \label{fig:anchor}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.11}
+ \caption{Text with an additional rotation of 90 degrees.}
+ \label{fig:textpathRotation}
+\end{minipage}
+\end{figure}
+
+You can manually apply an additional rotation to all character by setting variable \cmd{textpathRotation} to a non-zero value. A value of, \emph{e.g.}, 180 degrees turns each character upside down, so that it turns out on the right-hand side of a path. A value of, \emph{e.g.}, 90 degrees results in characters ``floating'' with the path. By default, \cmd{textpathRotation} is set to zero.
+
+In figure~\ref{fig:textpathRotation}, note, that the heart shape is derived from half circles and the text would have been running on the inside of the path by default, cf. figure~\ref{fig:firstexample}.
+
+\begin{listing}
+string f, t;
+path heart;
+f := "\usefont{T1}{pzc}{m}{it}\tiny";
+t := "Love";
+heart := halfcircle shifted (-0.5bp,0bp)..{dir-50}(0bp,-1.5bp);
+heart := heart--reverse heart reflectedabout ((0,0),(0,1))--cycle;
+heart := heart scaled 60bp;
+textpathRotation := 90;
+textpathLetterSpace := 1pt;
+textpathRepeat := 30;
+draw textpathFont(f, t, heart, 0) withcolor red+0.1green;
+\end{listing}
+
+
+\subsubsection{Variable \cmd{textpathAbsRotation}}
+The interpretation of variable \cmd{textpathRotation} changes when variable \cmd{textpathAbsRotation} is set to a value of one. Then characters are rotated by a fixed angle of \cmd{textpathRotation} degrees, ignoring path slope (see figure~\ref{fig:textpathAbsRotation}). By default, \cmd{textpathAbsRotation} is set to zero.
+
+\begin{figure}
+ \centering
+ \makebox[0pt][c]{%
+ \includegraphics{textpathfigs.12}%
+ }
+ \caption{Text with an absolute rotation of zero degrees.}
+ \label{fig:textpathAbsRotation}
+\end{figure}
+
+\begin{listing}
+picture pic;
+f := "\usefont{T1}{fwb}{m}{n}\Large";% From the emerald package
+t := "Don't panic! Don't panic! Don't panic!";
+p := origin
+for i:=1 upto 20: ..(i, sind(i*45)) endfor;
+p := p xscaled 20 yscaled 35;
+textpathRotation := 0;
+textpathAbsRotation := 1;
+textpathLetterSpace := 6pt;
+pic := textpathFont(f, t, p, 0);
+background := black;
+bboxmargin := 30bp;
+unfill bbox pic;
+draw pic withcolor red+green;
+\end{listing}
+
+We could have used \cmd{textpathRepeat} instead of repeating the text manually in the last example as well. But since that required some more letters to type I chose not to do so. In case the path definition inside the for loop---or rather the for loop inside the path definition---in the last listing looks uncommon to you, have a look at chapter~10 of the MetaPost manual, where this convenient feature is explained.
+
+
+\subsection{Clipping, Scaling and Draft Mode}\label{sec:ClippingScalingDraft}
+
+\subsubsection{Variable \cmd{textpathClip}}
+As explained in section~\ref{sec:paths} when total text width is larger than path length characters that don't fit into the path boundaries are clipped. Actually, characters whose anchor point exceeds path boundaries are moved to the corresponding end point of the path, first. Then variable \cmd{textpathClip} is asked whether those characters should be drawn or clipped. If variable \cmd{textpathClip} is set to one, such characters are clipped (first line in figure~\ref{fig:textpathClipAutoScale}). If it is set to zero value the characters are drawn at the boundaries, acting as a visual marker that something went wrong (second line in figure~\ref{fig:textpathClipAutoScale}). By default, \cmd{textpathClip} is set to zero, that is, no characters are lost.
+
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.13}
+ \caption{Text on a short horizontal path clipped, not clipped and automatically scaled.}
+ \label{fig:textpathClipAutoScale}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.14}
+ \caption{The same text in draft mode.}
+ \label{fig:textpathDraft}
+\end{minipage}
+\end{figure}
+
+Whenever the \pkg\ package notices text exceeding path boundaries one of the following warnings is shown on the console depending on variable \cmd{textpathClip}:
+
+\begin{verbatim}
+ Package textpath warning: Overfull path! Clipped.
+\end{verbatim}
+or
+\begin{verbatim}
+ Package textpath warning: Overfull path! Not Clipped.
+\end{verbatim}
+
+Clipping works well with \cmd{textpathRepeat} set to values larger than one.
+
+
+\subsubsection{Variable \cmd{textpathAutoScale}}
+When automatically generating documents clipping might not be an option due to potential loss of information. However, finding proper settings for all kinds of input may be a difficult---or impossible---task. Actually, when input is too long to fit onto a path the clean solution were to reflow text or rearrange the layout. If you can't afford that manual work, but still want to be sure that all text appears in the output you can instruct the \pkg\ package to automatically scale input so that it fits onto a path (last line in figure~\ref{fig:textpathClipAutoScale}). Clearly, legibility will suffer from scaling, too. But at least all text remains in order this way.
+
+Automatic scaling can be activated by setting variable \cmd{textpathAutoScale} to one. Variable \cmd{textpathClip} is ignored in that case. If \cmd{textpathAutoScale} is set to zero, which is the default, scaling is never applied and \cmd{textpathClip} may take effect.
+
+Whenever text is scaled the following warning is output on the console (the scaling value might be different):
+
+\begin{verbatim}
+ Package textpath warning: Overfull path! Scaled to 0.66368.
+\end{verbatim}
+
+Scaling works well with \cmd{textpathRepeat} set to values larger than one.
+
+
+\subsubsection{Variable \cmd{textpathDraft}}
+So far, two ways to recognize overfull paths have been mentioned. When switching off clipping and scaling text that doesn't fit onto a path acts as a visual marker at path boundaries. Additionally, a warning is output on the console.
+
+To further help spotting overfull paths the \pkg\ package provides a draft mode that can be activated by setting variable \cmd{textpathDraft} to one. In draft mode, if a path is overfull, instead of glyphs the filled bounding boxes of all glyphs are ouput. Clipping and scaling still takes place in draft mode (see figure~\ref{fig:textpathDraft}). However, when scaling is activated in draft mode, input is only scaled in width so that it remains large enough to be easy to spot.
+
+By default, \cmd{textpathDraft} is set to zero, that is, draft mode is deactivated.
+
+
+
+\subsection{Options for the raw interface}\label{sec:OptionsRaw}
+
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.15}
+ \caption{A formula with straight rules.}
+ \label{fig:textpathFancyStrokesZero}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.16}
+ \caption{A formula with curved rules.}
+ \label{fig:textpathFancyStrokesOne}
+\end{minipage}
+\end{figure}
+
+\subsubsection{Variable \cmd{textpathFancyStrokes}}
+The remaining three variables apply only to macro \cmd{textpathRaw}. Figure~\ref{fig:rawFraction} in section~\ref{sec:textpathRaw} showed a formula containing fractions, where the rules were automatically bent to the shape of the path. Variable \cmd{textpathFancyStrokes} determines if rules in the input to \cmd{textpathRaw} should appear curved or straight in the output. A value of zero results in straight rules. If \cmd{textpathFancyStrokes} is set to one, which is the default, the \pkg\ package tries to adjust the shape of rules to that of the path.
+
+Figures~\ref{fig:textpathFancyStrokesZero} and~\ref{fig:textpathFancyStrokesOne} show a formula similar to that in figure~\ref{fig:rawFraction}. Clearly, both, the square root and the fraction look more decent with curved strokes.
+
+
+\subsubsection{Variable \cmd{textpathStrokePrecision}}
+When you're typesetting formulae along paths with a high curvature it may be difficult for rules to follow the path. Variable \cmd{textpathStrokePrecision} determines the number of auxillary points that are calculated along a stroke. For higher values of \cmd{textpathStrokePrecision} strokes follow a path more precisely.
+
+By default, \cmd{textpathStrokePrecision} is set to a value of ten, which should be enough for most cases. This variable applies only if \cmd{textpathFancyStrokes} is set to one. Otherwise, it is ignored.
+
+
+\subsubsection{Variable \cmd{textpathCureSqrt}}
+Did you notice the small gap that is still present in the square root operator in figure~\ref{fig:textpathFancyStrokesOne}? A root sign actually consists of two parts, a leading V part and a trailing horizontal rule spanning the arguments. The V part, in fact, is a single glyph, while the rule is not a glyph, but in most cases a plain rule. If typeset horizontally, both parts overlap so that they visually melt into one glyph.
+
+\begin{figure}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.17}
+ \caption{A curved square root without a gap.}
+ \label{fig:textpathCureSqrt}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.18}
+ \caption{Another logo that didn't fit as an example in the other sections.}
+ \label{fig:proetcontra}
+\end{minipage}
+\end{figure}
+
+When typeset onto a path the V part is rotated according to the slope of the path at its anchor point, which lies at the \emph{horizontal center} of a glyph (cf. figure~\ref{fig:anchor}). The left-most point of the rule, however, is rotated according to the slope of the path at the \emph{right-most point} of the V part glyph. Both angles are slightly different in general and therefore, V and rule part of a square root miss each other and a gap might become visible.
+
+For some mathematical fonts the \pkg\ package tries to fill this gap automatically when variable \cmd{textpathCureSqrt} is set to a value of one, which is the default. In fact, in figure~\ref{fig:textpathFancyStrokesOne} this variable was manually set to zero to provoke the gap. In figure~\ref{fig:textpathCureSqrt} the gap has been filled. Don't expect too fancy results from this option in difficult cases.
+
+This variable applies only if \cmd{textpathFancyStrokes} is set to one. Otherwise, it is ignored. Moreover, it only works when \cmd{textpathRepeat} is set to a value of one, \emph{i.e.}, there are no multiple copies of formulae. Multiple root operators in \emph{one} formula are ok, however.
+
+Table~\ref{tab:textpathCureSqrt} lists the font names and slots that are currently supported (known to the author to contain a root sign glyph). If you happen to use a mathematical character set that isn't supported, don't hesitate to contact me. I'd be happy to add them.
+
+\begin{table}
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \begin{tabular}[t]{>{\ttfamily}l>{\ttfamily}r}
+ \normalfont font name & \normalfont slot\\
+ \addlinespace\toprule\addlinespace
+ cmex10 & 112 \textrm{to} 116\\
+ cmsy5 & 112\\
+ cmsy6 & 112\\
+ cmsy7 & 112\\
+ cmsy8 & 112\\
+ cmsy9 & 112\\
+ cmsy10 & 112\\
+ cmbsy10 & 112\\
+ fourier-mex & 114\\
+ fourier-ms & 112\\
+ MnSymbolE5 & 186\\
+ MnSymbolE5 & 189\\
+ MnSymbolE10 & 186\\
+ \end{tabular}
+ \caption{Fonts supported by option \cmd{textpathCureSqrt}.}
+ \label{tab:textpathCureSqrt}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \begin{tabular}[t]{cl}
+ bit & output\\
+ \addlinespace\toprule\addlinespace
+ 0 & item\\
+ 1 & item's bounding box\\
+ 2 & item's anchor point\\
+ \end{tabular}
+\caption{The bits of variable \cmd{textpathDebug}.}
+\label{tab:textpathDebug}
+\end{minipage}
+\end{table}
+
+
+% \suppressfloats
+
+
+\subsection{Debugging}\label{sec:Debugging}
+
+\subsubsection{Variable \cmd{textpathDebug}}
+There is one variable left to be described. For debugging purposes variable \cmd{textpathDebug} lets you control if and how all items, \emph{i.e.}, glyphs and rules, are output. For every item in the input it can be controlled if the item, the item's bounding box, and the item's anchor point shall be drawn. Bits 0 to~2 of variable \cmd{textpathDebug} determine what to output. Table~\ref{tab:textpathDebug} shows the correspondence between bits in \cmd{textpathDebug} and the details to output.
+
+Bits can be set independently. That is, for a value of, \emph{e.g.}, $3=1+2=2^0+2^1$ all text (and rules) are drawn together with the glyph's bounding box (see figure~\ref{fig:textpathDebug3}), whereas for a value of $6=2+4=2^1+2^2$ bounding boxes and anchor points are drawn (see figure~\ref{fig:textpathDebug6}).
+
+\begin{figure}%[t]
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.19}
+ \caption{Debug mode showing glyphs and bounding boxes.}
+ \label{fig:textpathDebug3}
+\end{minipage}\hfill
+\begin{minipage}[t]{.45\linewidth}
+ \centering
+ \includegraphics{textpathfigs.20}
+ \caption{Debug mode showing bounding boxes and anchor points.}
+ \label{fig:textpathDebug6}
+\end{minipage}
+\end{figure}
+
+Bounding boxes are drawn with the \cmd{currentpen}. Anchor points are represented by filled circles with a diameter of 3bp. An exception are anchor points of fancy rules, that can't be shown, currently.
+
+Do you remember when we asked about a problem with figure~\ref{fig:secondexample} in section~\ref{sec:firstexample}? \user{Yes, the first and last characters do not visually line up properly!} Well spotted! Actually, the code is correct. When drawing the bounding boxes of the characters one realizes that the left-most and right-most points of the glyph's bounding boxes on the path do line up (see, \emph{e.g.}, figure~\ref{fig:textpathDebug3}).
+
+\user{Is there a fix?} There's no automatic solution. The problem is that ``G'' and ``!'' have quite different glyph shapes. If the text started, \emph{e.g.}, with letters ``B'', ``E'' or even ``W'' \emph{etc.\@} those characters would visually line up with an exclamation mark. As a work around for letters ``C'', ``G'' \emph{etc.\@} the alignment parameter could be reduced to a value slightly less that 0.5. But honestly, did you really notice the difference?
+
+
+
+\subsection{Summary}
+Table~\ref{tab:configuration} lists all configuration variables, their default values and in what macros they have effect.
+
+\begin{table}
+ \centering
+ \makebox[0pt][c]{%
+ \begin{tabular}{>{\ttfamily}l>{\raggedleft}p{3em}ccc}
+ \normalfont variable name & \makebox[0pt][r]{default value} & \multicolumn{2}{c}{valid in macros}\\
+ & & \cmd{textpath,} \\ & & \cmd{textpathFont} & \cmd{textpathRaw}\\
+ \addlinespace\toprule\addlinespace
+ textpathRepeat & 1 & \checkmark & \checkmark\\
+ textpathStretch & 1 & \checkmark & \checkmark\\
+ textpathHSpace & 0pt & \checkmark & \checkmark\\
+ textpathShift & 0pt & \checkmark & \checkmark\\
+ textpathLetterSpace & 0pt & \checkmark & \\
+ textpathRotation & 0 & \checkmark & \checkmark\\
+ textpathAbsRotation & 0 & \checkmark & \checkmark\\
+ textpathClip & 1 & \checkmark & \checkmark\\
+ textpathAutoScale & 0 & \checkmark & \checkmark\\
+ textpathDraft & 0 & \checkmark & \checkmark\\
+ textpathFancyStrokes & 1 & & \checkmark\\
+ textpathStrokePrecision & 10 & & \checkmark\\
+ textpathCureSqrt & 1 & & \checkmark\\
+ textpathDebug & 1 & \checkmark & \checkmark\\
+ \end{tabular}%
+ }
+ \caption{Summary of configuration variables.}
+ \label{tab:configuration}
+\end{table}
+
+
+
+\section{Numeric considerations}
+Internally, current MetaPost versions use 16-bit fixed point calculations. However, the largest value that can be stored in a variable is $4096=2^{12}$ (big points). At one point, the \pkg\ package needs to calculate and store the length of a path \cmd{p}. The largest radius of a full circle passed to \cmd{textpath} is therefore approx. 651bp = 9in = 22cm, a bit more than the width of paper formats letter or \textsc{din}~A4. MetaPost is able to handle full circles with a larger radius, however, it cannot compute and store their path length.
+
+To typeset text along circular paths with a larger radius, the solution is just not to pass to \cmd{textpath} a \cmd{fullcircle scaled 2r}, but to build paths with \cmd{halfcircle}, \cmd{quartercircle} or, even better, just select a minimal sub-path of, \emph{e.g.}, a \cmd{fullcircle} with the \cmd{subpath} command.
+
+
+
+\section{Epilogue}
+\user{Where's the source code of the last examples?} The code of all figures shown in this manual can be found in file \cmd{textpathfigs.mp}, which is part of this package.
+
+\user{What is the nice calligraphic font you're using throughout this manual?} Since we're mostly dealing with decorative graphics here, \textsc{urw} Zapf Chancery Medium Italic is used in many exampless. This font is part of the \textsc{psnfss} package and should already be installed in your \cmd{texmf} tree. Other decorative fonts with ready-made \LaTeX\ support are Brush ScriptX Italic or the fonts from the Emerald package. All packages are available on \textsc{ctan}.
+
+\user{Anything else?} While you're asking, don't try to do too fancy stuff with this package. Text---and mathematical copy---is most legible when typeset horizontally. With increasing curvature of the baseline legibility decreases fastly. A decorative, but elegant look can be achieved best with large fonts and just slightly indicating a curved baseline, similar to figure~\ref{fig:textpathFont}.
+
+\bigskip
+\raggedright\itshape
+Happy \TeX ing!\par
+Stephan Hennig
+
+\end{document}
diff --git a/graphics/metapost/contrib/macros/textpath/textpathfigs.mp b/graphics/metapost/contrib/macros/textpath/textpathfigs.mp
new file mode 100644
index 0000000000..8aed0b4021
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpathfigs.mp
@@ -0,0 +1,263 @@
+input latexmp
+setupLaTeXMP(preamblefile="textpathfigs");
+input textpath
+
+prologues := 0;
+
+beginfig(1);
+ draw textpath("Greetings from MetaPost!", fullcircle scaled 50bp, 0)
+ withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(2);
+path p;
+ p := reverse fullcircle rotated -90 scaled 50bp;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(3);
+path p;
+ p := reverse fullcircle rotated -90;
+ draw textpathFont("\usefont{T1}{pzc}{m}{n}\huge", "Happy Birthday to",
+ p scaled 400bp, 0.5) withcolor (1, 0.6, 0.2);
+ draw textpathFont("\usefont{T1}{bch}{m}{n}\large", "Daisy Duck!",
+ p scaled 350bp, 0.5) withcolor (0.9, 0.3, 0.1);
+endfig;
+
+
+beginfig(4);
+path p;
+ p := reverse fullcircle rotated -90 scaled 50bp;
+ draw p withcolor .8white;
+ draw textpathRaw("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(5);
+path p;
+ p := reverse halfcircle scaled 80bp;
+ draw p withcolor .8white;
+ draw textpathRaw("\LARGE$x^2+y^2=r^2$", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(6);
+path p;
+ p := reverse halfcircle xscaled 150bp yscaled 80;
+ draw p withcolor .8white;
+ interim textpathShift := 7pt;
+ draw textpathRaw("\Large$\frac{(x-u)^2}{a^2}+\frac{(y-v)^2}{b^2}=1$", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+
+beginfig(7);
+path p;
+string f;
+ f := "\usefont{T1}{pzc}{m}{n}\Large";
+ p := subpath (5.7,6.3) of fullcircle scaled 1400bp;
+ draw p withcolor .8white;
+ interim textpathRepeat := 3;
+ interim textpathStretch := 0;
+ interim textpathHSpace := 10pt;
+ draw textpathFont(f, "Happy Birthday!", p, 0.5) withcolor (1, 0.6, 0.2);
+endfig;
+
+
+beginfig(8);
+path p[];
+string f;
+ f := "\usefont{T1}{pzc}{m}{n}\Large";
+ p1 := subpath (5.7,6.3) of fullcircle scaled 1400bp;
+ p2 := p1 shifted (0bp,-30bp);
+ draw p1 withcolor .8white;
+ draw p2 withcolor .8white;
+ interim textpathRepeat := 3;
+ interim textpathStretch := 1;
+ draw textpathFont(f, "Happy Birthday!", p1, 0.5) withcolor (1, 0.6, 0.2);
+ draw textpathFont(f, "Happy Birthday!", p2, 0) withcolor (1, 0.6, 0.2);
+endfig;
+
+
+beginfig(9);
+string f;
+path p;
+numeric r,h,w;
+picture pic;
+% Font Brush Script Italic is available on CTAN.
+ f := "\usefont{T1}{pbsi}{xl}{n}\fontsize{2.1pt}{2.1pt}\selectfont";
+ w := 210bp;
+ h := .276w;
+ r := .19h;
+ p := (-.5w,0)--(-.5w,.5h-r)--quartercircle rotated -90 scaled (2r)
+ shifted (-.5w,.5h)--(0,.5h);
+ p := p--reverse p reflectedabout ((0,-1),(0,1));
+ p := p--reverse p reflectedabout ((-1,0),(1,0))--cycle;
+ draw p withpen pensquare scaled 3.5pt;
+ interim textpathRepeat := 30;
+ interim textpathShift := -.6pt;
+ draw textpathFont(f, "Fa\ss' Dich kurz!", p, 0.5) withcolor white;
+ label(textext
+ ("\usefont{T1}{bfu}{mb}{n}\fontsize{22pt}{22pt}\selectfont Telephonzelle"),
+ origin);% Bitstream Futura
+endfig;
+
+
+beginfig(10);
+string f;
+path p;
+picture pic;
+numeric lenp, lenpic, tb, k;
+color daisy;
+ daisy := (0.9, 0.3, 0.1);
+ f := "\usefont{T1}{bch}{m}{n}\fontsize{48pt}{48pt}\selectfont";
+ p := subpath (2.7,5.3) of reverse fullcircle rotated -90 scaled 120bp;
+ draw p withcolor .8white;
+ interim textpathAbsRotation := 1;
+ draw textpathFont(f, "Daisy", p, 0.5) withcolor daisy + 0.85(white-daisy);
+ textpathAbsRotation := 0;
+ interim textpathDebug := 2;
+ pickup pencircle scaled .2bp;
+ draw textpathFont(f, "Daisy", p, 0.5) withcolor .6white;
+ textpathDebug := 1;
+ draw textpathFont(f, "Daisy", p, 0.5) withcolor daisy;
+ textpathDebug := 4;
+ draw textpathFont(f, "Daisy", p, 0.5) withcolor .6white;
+endfig;
+
+
+beginfig(11);
+string f, t;
+path heart;
+ f := "\usefont{T1}{pzc}{m}{it}\tiny";
+ t := "Love";
+ heart := halfcircle shifted (-0.5bp,0bp)..{dir-50}(0bp,-1.5bp);
+ heart := heart--reverse heart reflectedabout ((0,0),(0,1))--cycle;
+ heart := heart scaled 60bp;
+ interim textpathRotation := 90;
+ interim textpathLetterSpace := 1pt;
+ interim textpathRepeat := 30;
+ draw textpathFont(f, t, heart, 0.5) withcolor red+0.1green;
+endfig;
+
+
+beginfig(12);
+path p;
+string f, t;
+picture pic;
+ f := "\usefont{T1}{fwb}{m}{n}\Large";% From the emerald package
+ t := "Don't panic! Don't panic! Don't panic!";
+ p := origin
+ for i:=1 upto 20: ..(i, sind(i*45)) endfor;
+ p := p xscaled 20 yscaled 35;
+ interim textpathRotation := 0;
+ interim textpathAbsRotation := 1;
+ interim textpathLetterSpace := 6pt;
+ pic := textpathFont(f, t, p, 0);
+ background := black;
+ interim bboxmargin := 30bp;
+ unfill bbox pic;
+ draw pic withcolor red+green;
+endfig;
+
+
+beginfig(13);
+path p;
+ p := (origin--(1bp,0bp)) scaled 75bp;
+ draw p withcolor .8white;
+ interim textpathClip := 1;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+ p := p shifted (0,-20bp);
+ draw p withcolor .8white;
+ textpathClip := 0;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+ p := p shifted (0,-20bp);
+ draw p withcolor .8white;
+ interim textpathAutoScale := 1;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(14);
+path p;
+ interim textpathDraft := 1;
+ p := (origin--(1bp,0bp)) scaled 75bp;
+ draw p withcolor .8white;
+ interim textpathClip := 1;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+ p := p shifted (0,-20bp);
+ draw p withcolor .8white;
+ textpathClip := 0;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+ p := p shifted (0,-20bp);
+ draw p withcolor .8white;
+ interim textpathAutoScale := 1;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(15);
+path p;
+ p := reverse halfcircle xscaled 150bp yscaled 80;
+ draw p withcolor .8white;
+ interim textpathShift := 9pt;
+ interim textpathFancyStrokes := 0;
+ draw textpathRaw("\Large$y = v+b\sqrt{1-\frac{(x-u)^2}{a^2}}$", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(16);
+path p;
+ p := reverse halfcircle xscaled 150bp yscaled 80;
+ draw p withcolor .8white;
+ interim textpathShift := 9pt;
+ interim textpathFancyStrokes := 1;
+ interim textpathCureSqrt := 0;
+ draw textpathRaw("\Large$y = v+b\sqrt{1-\frac{(x-u)^2}{a^2}}$", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(17);
+path p;
+ p := reverse halfcircle xscaled 150bp yscaled 80;
+ draw p withcolor .8white;
+ interim textpathShift := 9pt;
+ interim textpathFancyStrokes := 1;
+ interim textpathCureSqrt := 1;
+ draw textpathRaw("\Large$y = v+b\sqrt{1-\frac{(x-u)^2}{a^2}}$", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(18);
+string f;
+path p;
+ f := "\usefont{T1}{pzc}{m}{it}\fontsize{56pt}{56pt}\selectfont";
+ p := reverse fullcircle rotated 33 scaled 150bp;
+ interim textpathLetterSpace := -3pt;
+ draw textpathFont(f, "Pro \&", p, 1) withcolor (1, 0.6, 0.2);
+ interim textpathLetterSpace := 0pt;
+ f := "\usefont{T1}{pzc}{m}{it}\fontsize{48pt}{48pt}\selectfont";
+ p := fullcircle rotated 33 scaled 145bp;
+ draw textpathFont(f, "Con\<{\kern-2pt}tra", p, 0.0) withcolor (1, 0.6, 0.2);
+endfig;
+
+
+beginfig(19);
+path p;
+ p := reverse fullcircle rotated -90 scaled 50bp;
+ interim textpathDebug := 1 + 2;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+beginfig(20);
+path p;
+ p := reverse fullcircle rotated -90 scaled 50bp;
+ interim textpathDebug := 2 + 4;
+ draw textpath("Greetings from MetaPost!", p, 0.5) withcolor (0.2,0.2,0.6);
+endfig;
+
+
+end
diff --git a/graphics/metapost/contrib/macros/textpath/textpathfigs.tex b/graphics/metapost/contrib/macros/textpath/textpathfigs.tex
new file mode 100644
index 0000000000..3dedccd934
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpathfigs.tex
@@ -0,0 +1,12 @@
+\RequirePackage{fix-cm}
+\documentclass{article}
+% \usepackage[T1]{fontenc}
+% \usepackage{MinionPro}
+% \usepackage{fourier}
+\usepackage{textpathmp}
+% \usepackage{amsmath}
+% \def\hksqrt{\mathpalette\DHLhksqrt}
+% \def\DHLhksqrt#1#2{\setbox0=\hbox{$#1\sqrt{#2\,}$}\dimen0=\ht0
+% \advance\dimen0-0.2\ht0
+% \setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
+% {\box0\lower0.4pt\box2}}
diff --git a/graphics/metapost/contrib/macros/textpath/textpathmp.sty b/graphics/metapost/contrib/macros/textpath/textpathmp.sty
new file mode 100644
index 0000000000..1dc4d52008
--- /dev/null
+++ b/graphics/metapost/contrib/macros/textpath/textpathmp.sty
@@ -0,0 +1,14 @@
+%%% Support package for the textpath.mp package for MetaPost.
+%%% This package provides the \spaced command that is used
+%%% by textpath and has to be inserted in your LaTeX preamble.
+\RequirePackage{soul}
+\newlength{\textpath@inter}
+\newlength{\textpath@inner}
+\newcommand*{\spaced}[2][]{%
+ #1%
+ \setlength{\textpath@inter}{10bp}%
+ \settowidth{\textpath@inner}{\ }%
+ \addtolength{\textpath@inner}{\textpath@inter}%
+ \sodef\textpath@spacedText{}{\textpath@inter}{\textpath@inner}{2\textpath@inner}%
+ \textpath@spacedText{#2}%
+}
diff --git a/graphics/metapost/contrib/macros/threeddice/README b/graphics/metapost/contrib/macros/threeddice/README
new file mode 100644
index 0000000000..147846dc04
--- /dev/null
+++ b/graphics/metapost/contrib/macros/threeddice/README
@@ -0,0 +1,39 @@
+Files: threeddice.mp, threeddice-doc.tex, threeddice-doc.pdf
+
+Purpose:
+
+ The file threeddice.mp consists of MetaPost code to produce pictures of
+ dice with one, two, or three faces visible.
+
+Licence:
+
+ This material is subject to the LaTeX Project Public Licence. See
+ http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+ for the details of that licence.
+
+Usage:
+
+ Run mpost on threeddice.mp. If your mpost has version at least 0.9,
+ this will produce 26 EPS files named die3d-1.mps through
+ die3d-456.mps. If your mpost is too old the filenames will be threeddice.1
+ through threeddice.456.
+
+ The digits indicate which faces are showing. For two digits, the first
+ digit represents the face on top, the second represents the front face
+ (visually below the first). For three digits, the first is the face on
+ top, the second is the face below and left of that, and the third is
+ below and right.
+
+ These files can be included in a LaTeX document using the graphics or
+ graphicx package, or in a plain TeX document using miniltx + graphicx,
+ or the epsf macros.
+
+Documentation:
+
+ See threeddice-doc.pdf for complete documentation. It may be
+ regenerated by running mpost of threeddice.mp followed by running
+ pdflatex (once) on threeddice-doc.tex.
+
+--
+Dan Luecking
+luecking AT-SIGN uark DOT edu
diff --git a/graphics/metapost/contrib/macros/threeddice/threeddice-doc.pdf b/graphics/metapost/contrib/macros/threeddice/threeddice-doc.pdf
new file mode 100644
index 0000000000..495bf36731
--- /dev/null
+++ b/graphics/metapost/contrib/macros/threeddice/threeddice-doc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/threeddice/threeddice-doc.tex b/graphics/metapost/contrib/macros/threeddice/threeddice-doc.tex
new file mode 100644
index 0000000000..f936b26e28
--- /dev/null
+++ b/graphics/metapost/contrib/macros/threeddice/threeddice-doc.tex
@@ -0,0 +1,139 @@
+\documentclass{article}
+\usepackage{graphicx}
+\title{The \texttt{threeddice} package}
+\author{Dan Luecking}
+\date{2010/11/30}
+\begin{document}
+
+\catcode`_=12
+{\catcode`\_=\active \global\let_\sb}
+
+\maketitle
+\section{Introduction}
+
+Running \texttt{mpost} on \texttt{threeddice.mp} produces 26 figure files.
+Six of them are are \texttt{die3d-1.mps}%
+ \footnote{If your \texttt{mpost} version is less that 0.9, you will
+ get figure files with names like \texttt{threeddice.1}. You should
+ update your \TeX{} system.}
+through \texttt{die3d-6.mps}. These are pictures of a single die face
+with the number of dots indicated by the numerical part. Three of these
+would look the same if rotated by multiples of $90$ degrees. The other
+three could look different. It is up to the users to perform this
+rotation if they want a different view.
+
+The twelve files with 2-digit numerical part are 3D pictures of dice with
+two faces showing, as if your were looking directly at a horizontal
+edge. You will have to rotate it $\pm90$ degrees if you want the edge to be
+vertical, or $180$ degrees if you prefer the positions of the top and
+front face to be exchanged.
+
+The eight files with 3-digit numerical suffix are 3D pictures of dice with
+three faces showing, as if your were looking directly at one of the
+corners. They show a top face and a left and right face flanking a
+vertical edge. You can get 16 other views by rotating them $\pm120$
+degrees. These rotations put one of the side faces on top.
+
+\section{Modifications}
+
+These figures were taken from an actual right handed die, and are all
+the permissable views of such a die, apart from size of dots and the
+actual orientation of the patterns of dots. As near as I could determine
+from internet searches, there are no official standards for the
+following.
+\begin{itemize}
+ \item The 2-spot face has dots in opposite corners, but which two
+ corners? On my die, if the 1-spot is on top, the 2-spot to the
+ left and the 3-spot to the right (figure
+ \texttt{die3d-123.mps}), the dots on the 2-spot face are in
+ upper left and lower right. It seems it could just as well have
+ been the other two corners.
+
+ \item Similar question for the 3-spot face: three dots in a diagonal
+ between opposite corners, but which two corners? In the previous
+ example (figure \texttt{die3d-123.mps}), the diagonal is from
+ lower left to upper right.
+
+ \item The 6-spot face has two lines of three, parallel to two edges,
+ but which two edges? In \texttt{die3d-246.mps} the lines of dots are
+ horizontal, but it seems they could just as well have been
+ vertical.
+\end{itemize}
+
+If you want some other orientation of these faces you will need to edit
+\texttt{threeddice.mp}: for the 2-spot face exchange the definitions of
+\texttt{pips2} and \texttt{pips7}; for the 3-spot face exchange
+\texttt{pips3} and \texttt{pips8}; for the 6-spot face exchange
+\texttt{pips6} and \texttt{pips11}.
+
+You can also change the size of the dots by giving a different value to
+\texttt{dot_diam}. The dice have rounded corners, you can change their
+radius by changing \texttt{corner_rad}. The dots are placed so there is
+at least \texttt{face_margin} of space between the dots and the straight
+edge of the face. You can change this variable as well.
+
+For other effects, you are on your own. A common requirement is that
+faces with fewer dots have larger dots. This is relatively easy to do,
+but requires changing the definitions of the 9 picture variables
+\texttt{pips1} through \texttt{pips11}.
+
+Naturally, the \texttt{graphics} and \texttt{graphicx} packages let you
+scale these as you want. If you would prefer to change the unscaled
+sizes, edit \texttt{threeddice.mp} to change \texttt{die_size} from 1cm to
+the desired size.
+
+Finally, to get views of a left-handed die, simply reflect the views of
+the right-handed die.
+
+\section{Appendix}
+
+\parindent 0pt
+These are the six single faces:
+
+\bigskip
+\includegraphics{die3d-1.mps}\quad
+\includegraphics{die3d-2.mps}\quad
+\includegraphics{die3d-3.mps}\quad
+\includegraphics{die3d-4.mps}\quad
+\includegraphics{die3d-5.mps}\quad
+\includegraphics{die3d-6.mps}
+
+\bigskip
+\filbreak
+The two-faced dice are ugly, so let me first show you the eight
+three-faced dice:
+
+\bigskip
+\includegraphics{die3d-123.mps}\quad
+\includegraphics{die3d-135.mps}\quad
+\includegraphics{die3d-142.mps}\quad
+\includegraphics{die3d-154.mps}
+
+\bigskip
+\includegraphics{die3d-246.mps}\quad
+\includegraphics{die3d-263.mps}\quad
+\includegraphics{die3d-365.mps}\quad
+\includegraphics{die3d-456.mps}
+
+\bigskip
+\filbreak
+Finally, the twelve two-faced dice:
+
+\bigskip
+\includegraphics{die3d-12.mps}\quad
+\includegraphics{die3d-13.mps}\quad
+\includegraphics{die3d-14.mps}\quad
+\includegraphics{die3d-15.mps}\quad
+\includegraphics{die3d-23.mps}\quad
+\includegraphics{die3d-24.mps}
+
+\bigskip
+\includegraphics{die3d-26.mps}\quad
+\includegraphics{die3d-35.mps}\quad
+\includegraphics{die3d-36.mps}\quad
+\includegraphics{die3d-45.mps}\quad
+\includegraphics{die3d-46.mps}\quad
+\includegraphics{die3d-56.mps}
+
+\filbreak
+\end{document}
diff --git a/graphics/metapost/contrib/macros/threeddice/threeddice.mp b/graphics/metapost/contrib/macros/threeddice/threeddice.mp
new file mode 100644
index 0000000000..29c2700c6e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/threeddice/threeddice.mp
@@ -0,0 +1,261 @@
+% File threeddice.mp
+% Version 1.0
+%%%%%%%%%%%%%%%%%%%%
+numeric dot_diam, corner_rad, face_margin, die_size;
+
+% diameter of a dot
+dot_diam := 1/6;
+
+% distance from edge of face to edge of dot.
+face_margin := dot_diam/2;
+
+% rounded corner radius
+corner_rad := dot_diam/2;
+
+% size of a single die face:
+die_size := 1cm;
+
+% Outline of a face.
+path die_face;
+die_face := (0,corner_rad){down}
+ ..{right}(corner_rad,0)..(1-corner_rad,0){right}
+ ..{up}(1,corner_rad)..(1,1-corner_rad){up}
+ ..{left}(1-corner_rad,1)..(corner_rad,1){left}
+ ..{down}(0,1-corner_rad)..cycle;
+
+% dot shape
+path dot;
+dot := fullcircle scaled dot_diam;
+
+% distance from nearest edge to center of dot:
+numeric dot_shift;
+dot_shift := dot_diam/2 + face_margin;
+
+% Five of 9 locations where a dot could be located.
+pair die_face[];
+
+die_face 1 := ( 0, 1) + dot_shift*( 1,-1); % TL
+die_face 2 := ( 0,.5) + dot_shift*( 1, 0); % TC
+die_face 3 := (.5,.5) ; % CC
+die_face 4 := ( 1,.5) + dot_shift*(-1, 0); % BC
+die_face 5 := ( 1, 0) + dot_shift*(-1, 1); % BR
+
+
+picture pips[];
+pips 1 := pips 2 := nullpicture;
+
+% dot in center
+addto pips 1 contour dot shifted die_face 3;
+
+% dots in TL and BR corners
+addto pips 2 contour dot shifted die_face 1;
+addto pips 2 contour dot shifted die_face 5;
+
+% dots in TR and BL corners
+pips 7 := pips 2 rotatedabout ((.5,.5), 90);
+
+% 3 dots on TL to BR diagonal
+pips 3 := pips 2;
+addto pips 3 also pips 1;
+
+% 3 dots on BL to TR diagonal
+pips 8 := pips3 rotatedabout ((.5,.5),90);
+
+% Dots in all 4 corners
+pips 4 := pips 2;
+addto pips 4 also pips 7;
+
+% dots in all four corners and center
+pips 5 := pips 4;
+addto pips 5 also pips 1;
+
+% 6 dots, 3 dots on top and three on bottom
+pips 6 := pips 4;
+addto pips 6 contour dot shifted die_face 2;
+addto pips 6 contour dot shifted die_face 4;
+
+% 6 dots, 3 at left and 3 at right
+pips 11 := pips6 rotatedabout ((.5,.5),90);
+
+% When three faces are showing, alternates 7, 8 and 11 for 2, 3 and 6 are
+% used when the total of the pips is odd (). This is an ad hoc rule that
+% matches what I see on my reference die.
+vardef pips_sel_iii (expr X)=
+ X if odd pips_total: if (X=2) or (X=3) or (X=6): + 5 fi fi
+enddef;
+%
+% Choices are less easy when only two faces show:
+vardef pips_sel_ii (expr X,Y)=
+ X if ((X=2) and ((Y=3) or (Y=4))) or
+ ((X=3) and ((Y=1) or (Y=6))) or
+ ((X=6) and ((Y=2) or (Y=5))): + 5
+ fi
+enddef;
+
+% for die with 3 faces showing:
+path topface[], llftface, lrtface;
+topface 1 = die_face rotated 45 yscaled (1/sqrt(3));
+llftface = topface 1 rotated 120;
+lrtface = topface 1 rotated -120;
+
+% for die with 2 faces showing:
+path frontface;
+topface 2 := (die_face shifted (-.5,0)) yscaled (1/sqrt(2));
+frontface := topface 2 rotated 180;
+
+pair D[];
+D1 := dir 30;
+D2 := dir 150;
+
+path corner_connect[];
+corner_connect1 := (point 6 of lrtface){up}..{D2}(point 3 of topface 1);
+corner_connect2 := (point 6 of topface 1){-D1}..{down}(point 3 of llftface);
+corner_connect3 := (point 6 of llftface){-D2}..{D1}(point 3 of lrtface);
+corner_connect4 := (point 0 of frontface){up}..(point 3 of topface 2){up};
+corner_connect5 := (point 0 of topface 2){down}..(point 3 of frontface){down};
+
+% Text parameter is for drawing options (transformation, withcolor, etc.);
+% expression parameters are the # of pips on top, left and right.
+def die_three(expr T, L, R) text _do_ =
+ numeric pips_total;
+ pips_total := T + L + R;
+ draw topface 1 _do_;
+ draw llftface _do_;
+ draw lrtface _do_;
+ for n = 1 upto 3:
+ draw corner_connect[n] _do_;
+ endfor
+ draw pips[pips_sel_iii(T)] rotated 45 yscaled (1/sqrt(3)) _do_;
+ draw pips[pips_sel_iii(L)] rotated 45 yscaled (1/sqrt(3)) rotated 120 _do_;
+ draw pips[pips_sel_iii(R)] rotated 45 yscaled (1/sqrt(3)) rotated -120 _do_;
+enddef;
+
+def die_two (expr T, F) text _do_ =
+ draw topface 2 _do_;
+ draw frontface _do_;
+ draw (pips[pips_sel_ii(T,F)] shifted .5left) yscaled (1/sqrt(2)) _do_;
+ draw (pips[pips_sel_ii(F,T)] shifted .5left) yscaled (1/sqrt(2)) rotated 180 _do_;
+ draw corner_connect4 _do_;
+ draw corner_connect5 _do_;
+enddef;
+
+def die_one (expr F) text _do_ =
+ draw die_face _do_;
+ draw pips[F] _do_;
+enddef;
+
+if known outputtemplate:
+ outputtemplate := "die3d-%c.mps";
+elseif known mpversion:
+ filenametemplate "die3d-%c.mps";
+fi
+% The 8 permissible views (up to rotation) with three faces equally
+% visible of a right handed die:
+beginfig(123);
+ die_three(1,2,3) scaled die_size;
+endfig;
+
+beginfig(135);
+ die_three(1,3,5) scaled die_size;
+endfig;
+
+beginfig(154);
+ die_three(1,5,4) scaled die_size;
+endfig;
+
+beginfig(142);
+ die_three(1,4,2) scaled die_size;
+endfig;
+
+beginfig(246);
+ die_three(2,4,6) scaled die_size;
+endfig;
+
+beginfig(263);
+ die_three(2,6,3) scaled die_size;
+endfig;
+
+beginfig(365);
+ die_three(3,6,5) scaled die_size;
+endfig;
+
+beginfig(456);
+ die_three(4,5,6) scaled die_size;
+endfig;
+
+% The 12 permissible views (up to rotation) with only two faces equally
+% visible of a right handed die:
+beginfig(12);
+ die_two(1,2) scaled die_size;
+endfig;
+
+beginfig(13);
+ die_two(1,3) scaled die_size;
+endfig;
+
+beginfig(14);
+ die_two(1,4) scaled die_size;
+endfig;
+
+beginfig(15);
+ die_two(1,5) scaled die_size;
+endfig;
+
+beginfig(23);
+ die_two(2,3) scaled die_size;
+endfig;
+
+beginfig(24);
+ die_two(2,4) scaled die_size;
+endfig;
+
+beginfig(26);
+ die_two(2,6) scaled die_size;
+endfig;
+
+beginfig(35);
+ die_two(3,5) scaled die_size;
+endfig;
+
+beginfig(36);
+ die_two(3,6) scaled die_size;
+endfig;
+
+beginfig(45);
+ die_two(4,5) scaled die_size;
+endfig;
+
+beginfig(46);
+ die_two(4,6) scaled die_size;
+endfig;
+
+beginfig(56);
+ die_two(5,6) scaled die_size;
+endfig;
+
+% The 6 possible single faces
+beginfig(1);
+ die_one(1) scaled die_size;
+endfig;
+
+beginfig(2);
+ die_one(2) scaled die_size;
+endfig;
+
+beginfig(3);
+ die_one(3) scaled die_size;
+endfig;
+
+beginfig(4);
+ die_one(4) scaled die_size;
+endfig;
+
+beginfig(5);
+ die_one(5) scaled die_size;
+endfig;
+
+beginfig(6);
+ die_one(6) scaled die_size;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/truchet/README b/graphics/metapost/contrib/macros/truchet/README
new file mode 100644
index 0000000000..bf54bfa3bb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/README
@@ -0,0 +1,37 @@
+Truchet tiling
+--------------
+
+This directory contains what I wrote for the contest proposed by
+Denis Girou and Philippe Esperet at the GUTenberg congress on
+June 1 & 2, 1995. The problem is known as `Truchet tiling'. There were
+two parts: coloration of lines, and colorations of surfaces.
+Initially, the problem would have to be solved using pure PostScript
+or PSTricks. I prefered to use METAPOST. A survey of all the solutions
+will appear in a forthcoming issue of ``Les Cahiers GUTenberg''.
+
+
+Main files in this directory:
+
+ example.mp : the METAPOST source file
+ example.dvi : the example.mp source file formatted with `mft'.
+ example.1 : METAPOST output (PostScript file)
+ ...
+ example.5 : METAPOST output (PostScript file)
+
+ mproof.ps : Output #5 formatted with mproof.tex.
+ (i.e. in writing tex 'mproof example.5')
+
+ plain.mft : the style needed for the application of `mft'
+
+ readme.tex : a presentation of the METAPOST techniques used (*in french*)
+ (this file uses the `logo' fonts extended by Knuth)
+
+ text.tex : test file showing the five previous figures.
+
+ tiling.mp : the METAPOST macro file.
+ tiling.dvi : the tiling.mp source formatted with `mft'.
+
+
+D. Roegel, 20 July 1995
+
+
diff --git a/graphics/metapost/contrib/macros/truchet/README.french b/graphics/metapost/contrib/macros/truchet/README.french
new file mode 100644
index 0000000000..122970cea5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/README.french
@@ -0,0 +1,28 @@
+Pavage de Truchet
+-----------------
+
+Principaux fichiers de ce repertoire:
+
+ example.mp : le fichier source METAPOST
+ example.dvi : le source example.mp formate' avec `mft'.
+ example.1 : sortie METAPOST (fichier ps)
+ ...
+ example.5 : sortie METAPOST (fichier ps)
+
+ mproof.ps : la sortie 5 mise en page avec mproof.tex.
+ (c'est-a-dire en ecrivant: tex 'mproof example.5')
+
+ plain.mft : le style necessaire a l'application de `mft'
+
+ readme.tex : une presentation des techniques METAPOST employees.
+ (ce fichier utilise les polices `logo' etendues par Knuth)
+
+ text.tex : fichier de test montrant les cinq figures precedentes.
+
+ tiling.mp : le fichier de macros METAPOST
+ tiling.dvi : le source tiling.mp formate' avec `mft'.
+
+
+D. Roegel, 9/7/1995
+
+
diff --git a/graphics/metapost/contrib/macros/truchet/example.1 b/graphics/metapost/contrib/macros/truchet/example.1
new file mode 100644
index 0000000000..ed53907522
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.1
@@ -0,0 +1,101 @@
+%!PS
+%%BoundingBox: -3 -3 88 117
+%%Creator: MetaPost
+%%CreationDate: 1995.07.20:0132
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 114.80313 lineto
+86.45668 114.80313 lineto
+86.45668 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 113.3858 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 113.3858 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+85.03935 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+85.03935 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+85.03935 85.03935 lineto stroke
+ 0.875 0.125 0 setrgbcolor 0 2.83464
+ dtransform truncate idtransform setlinewidth pop
+newpath 0 14.17323 moveto
+7.82755 14.17323 14.17323 20.5189 14.17323 28.34645 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 28.34647 14.17323 moveto
+20.51892 14.17323 14.17323 7.82756 14.17323 0.00002 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto stroke
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 28.34647 70.86613 moveto
+20.51892 70.86613 14.17323 64.52046 14.17323 56.69292 curveto stroke
+ 0.625 0.375 0 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 28.34647 99.21259 moveto
+20.51892 99.21259 14.17323 92.86691 14.17323 85.03937 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 28.34645 14.17323 moveto
+36.174 14.17323 42.51968 20.5189 42.51968 28.34645 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 56.69292 14.17323 moveto
+48.86537 14.17323 42.51968 7.82756 42.51968 0.00002 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 28.34645 42.51968 moveto
+36.174 42.51968 42.51968 48.86536 42.51968 56.6929 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 56.69292 42.51968 moveto
+48.86537 42.51968 42.51968 36.17401 42.51968 28.34647 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 56.69292 99.21259 moveto
+48.86537 99.21259 42.51968 92.86691 42.51968 85.03937 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto stroke
+ 0.25 0.75 0 setrgbcolor
+newpath 85.03937 14.17323 moveto
+77.21182 14.17323 70.86613 7.82756 70.86613 0.00002 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 85.03937 42.51968 moveto
+77.21182 42.51968 70.86613 36.17401 70.86613 28.34647 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 85.03937 70.86613 moveto
+77.21182 70.86613 70.86613 64.52046 70.86613 56.69292 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto stroke
+ 0.125 0.875 0 setrgbcolor
+newpath 70.86613 113.38582 moveto
+70.86613 105.55827 77.2118 99.21259 85.03935 99.21259 curveto stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/example.2 b/graphics/metapost/contrib/macros/truchet/example.2
new file mode 100644
index 0000000000..c59b704f39
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.2
@@ -0,0 +1,293 @@
+%!PS
+%%BoundingBox: -3 -3 287 173
+%%Creator: MetaPost
+%%CreationDate: 1995.07.20:0132
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 171.49603 lineto
+284.88184 171.49603 lineto
+284.88184 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 56.6929 0 moveto
+56.6929 170.0787 lineto stroke
+newpath 113.3858 0 moveto
+113.3858 170.0787 lineto stroke
+newpath 170.0787 0 moveto
+170.0787 170.0787 lineto stroke
+newpath 226.7716 0 moveto
+226.7716 170.0787 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 56.6929 moveto
+283.46451 56.6929 lineto stroke
+newpath 0 113.3858 moveto
+283.46451 113.3858 lineto stroke
+ 1 0 0 setrgbcolor
+newpath 0 28.34645 moveto
+15.65508 28.34645 28.34645 41.03783 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 0 28.34645 moveto
+15.65508 28.34645 28.34645 41.03783 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+56.6929 28.34645 lineto
+41.03783 28.34645 28.34645 15.65508 28.34645 0 curveto
+0 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 28.34645 moveto
+41.03783 28.34645 28.34645 15.65508 28.34645 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 85.03935 lineto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 56.6929 85.03935 moveto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+newpath 28.34645 170.0787 moveto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 170.0787 lineto
+28.34645 170.0787 lineto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 113.3858 lineto
+ closepath fill
+newpath 56.6929 28.34645 moveto
+72.34798 28.34645 85.03935 41.03783 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 28.34645 moveto
+72.34798 28.34645 85.03935 41.03783 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+113.3858 28.34645 lineto
+97.73073 28.34645 85.03935 15.65508 85.03935 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 28.34645 moveto
+97.73073 28.34645 85.03935 15.65508 85.03935 0 curveto
+113.3858 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+113.3858 85.03935 lineto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 85.03935 moveto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+newpath 85.03935 170.0787 moveto
+85.03935 154.42363 97.73073 141.73225 113.3858 141.73225 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 85.03935 113.3858 moveto
+85.03935 129.04088 72.34798 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+85.03935 170.0787 lineto
+85.03935 154.42363 97.73073 141.73225 113.3858 141.73225 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 85.03935 113.3858 moveto
+85.03935 129.04088 72.34798 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+newpath 113.3858 28.34645 moveto
+129.04088 28.34645 141.73225 41.03783 141.73225 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 28.34645 moveto
+129.04088 28.34645 141.73225 41.03783 141.73225 56.6929 curveto
+170.0787 56.6929 lineto
+170.0787 28.34645 lineto
+154.42363 28.34645 141.73225 15.65508 141.73225 0 curveto
+113.3858 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 28.34645 moveto
+154.42363 28.34645 141.73225 15.65508 141.73225 0 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 85.03935 moveto
+129.04088 85.03935 141.73225 97.73073 141.73225 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 85.03935 moveto
+129.04088 85.03935 141.73225 97.73073 141.73225 113.3858 curveto
+170.0787 113.3858 lineto
+170.0787 85.03935 lineto
+154.42363 85.03935 141.73225 72.34798 141.73225 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 170.0787 85.03935 moveto
+154.42363 85.03935 141.73225 72.34798 141.73225 56.6929 curveto
+170.0787 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 141.73225 moveto
+129.04088 141.73225 141.73225 154.42363 141.73225 170.0787 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 141.73225 moveto
+129.04088 141.73225 141.73225 154.42363 141.73225 170.0787 curveto
+170.0787 170.0787 lineto
+170.0787 141.73225 lineto
+154.42363 141.73225 141.73225 129.04088 141.73225 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 141.73225 moveto
+154.42363 141.73225 141.73225 129.04088 141.73225 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+newpath 198.42516 56.6929 moveto
+198.42516 41.03783 211.11653 28.34645 226.7716 28.34645 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 0 moveto
+198.42516 15.65508 185.73378 28.34645 170.0787 28.34645 curveto
+170.0787 56.6929 lineto
+198.42516 56.6929 lineto
+198.42516 41.03783 211.11653 28.34645 226.7716 28.34645 curveto
+226.7716 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 198.42516 0 moveto
+198.42516 15.65508 185.73378 28.34645 170.0787 28.34645 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 113.3858 moveto
+198.42516 97.73073 211.11653 85.03935 226.7716 85.03935 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 198.42516 56.6929 moveto
+198.42516 72.34798 185.73378 85.03935 170.0787 85.03935 curveto
+170.0787 113.3858 lineto
+198.42516 113.3858 lineto
+198.42516 97.73073 211.11653 85.03935 226.7716 85.03935 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 56.6929 moveto
+198.42516 72.34798 185.73378 85.03935 170.0787 85.03935 curveto
+170.0787 56.6929 lineto
+ closepath fill
+newpath 170.0787 141.73225 moveto
+185.73378 141.73225 198.42516 154.42363 198.42516 170.0787 curveto
+170.0787 170.0787 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 141.73225 moveto
+185.73378 141.73225 198.42516 154.42363 198.42516 170.0787 curveto
+226.7716 170.0787 lineto
+226.7716 141.73225 lineto
+211.11653 141.73225 198.42516 129.04088 198.42516 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 141.73225 moveto
+211.11653 141.73225 198.42516 129.04088 198.42516 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 226.7716 28.34645 moveto
+242.42668 28.34645 255.11806 41.03783 255.11806 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 28.34645 moveto
+242.42668 28.34645 255.11806 41.03783 255.11806 56.6929 curveto
+283.46451 56.6929 lineto
+283.46451 28.34645 lineto
+267.80943 28.34645 255.11806 15.65508 255.11806 0 curveto
+226.7716 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 283.46451 28.34645 moveto
+267.80943 28.34645 255.11806 15.65508 255.11806 0 curveto
+283.46451 0 lineto
+ closepath fill
+newpath 255.11806 113.3858 moveto
+255.11806 97.73073 267.80943 85.03935 283.46451 85.03935 curveto
+283.46451 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 255.11806 56.6929 moveto
+255.11806 72.34798 242.42668 85.03935 226.7716 85.03935 curveto
+226.7716 113.3858 lineto
+255.11806 113.3858 lineto
+255.11806 97.73073 267.80943 85.03935 283.46451 85.03935 curveto
+283.46451 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 255.11806 56.6929 moveto
+255.11806 72.34798 242.42668 85.03935 226.7716 85.03935 curveto
+226.7716 56.6929 lineto
+ closepath fill
+newpath 226.7716 141.73225 moveto
+242.42668 141.73225 255.11806 154.42363 255.11806 170.0787 curveto
+226.7716 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 141.73225 moveto
+242.42668 141.73225 255.11806 154.42363 255.11806 170.0787 curveto
+283.46451 170.0787 lineto
+283.46451 141.73225 lineto
+267.80943 141.73225 255.11806 129.04088 255.11806 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 283.46451 141.73225 moveto
+267.80943 141.73225 255.11806 129.04088 255.11806 113.3858 curveto
+283.46451 113.3858 lineto
+ closepath fill
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/example.3 b/graphics/metapost/contrib/macros/truchet/example.3
new file mode 100644
index 0000000000..d45822df3a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.3
@@ -0,0 +1,130 @@
+%!PS
+%%BoundingBox: -3 -3 117 173
+%%Creator: MetaPost
+%%CreationDate: 1995.07.20:0132
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 171.49603 lineto
+114.80313 171.49603 lineto
+114.80313 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 56.6929 0 moveto
+56.6929 170.0787 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 56.6929 moveto
+113.3858 56.6929 lineto stroke
+newpath 0 113.3858 moveto
+113.3858 113.3858 lineto stroke
+ 1 setgray
+newpath 28.34645 56.6929 moveto
+28.34645 41.03783 41.03783 28.34645 56.6929 28.34645 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 setgray
+newpath 28.34645 0 moveto
+28.34645 15.65508 15.65508 28.34645 0 28.34645 curveto
+0 56.6929 lineto
+28.34645 56.6929 lineto
+28.34645 41.03783 41.03783 28.34645 56.6929 28.34645 curveto
+56.6929 0 lineto
+ closepath fill
+ 1 setgray
+newpath 28.34645 0 moveto
+28.34645 15.65508 15.65508 28.34645 0 28.34645 curveto
+0 0 lineto
+ closepath fill
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 setgray
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 85.03935 lineto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 85.03935 moveto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+newpath 28.34645 170.0787 moveto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 0 setgray
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 170.0787 lineto
+28.34645 170.0787 lineto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 setgray
+newpath 85.03935 56.6929 moveto
+85.03935 41.03783 97.73073 28.34645 113.3858 28.34645 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 85.03935 0 moveto
+85.03935 15.65508 72.34798 28.34645 56.6929 28.34645 curveto
+56.6929 56.6929 lineto
+85.03935 56.6929 lineto
+85.03935 41.03783 97.73073 28.34645 113.3858 28.34645 curveto
+113.3858 0 lineto
+ closepath fill
+ 0 setgray
+newpath 85.03935 0 moveto
+85.03935 15.65508 72.34798 28.34645 56.6929 28.34645 curveto
+56.6929 0 lineto
+ closepath fill
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+113.3858 85.03935 lineto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 setgray
+newpath 113.3858 85.03935 moveto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 141.73225 moveto
+72.34798 141.73225 85.03935 154.42363 85.03935 170.0787 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 0 setgray
+newpath 56.6929 141.73225 moveto
+72.34798 141.73225 85.03935 154.42363 85.03935 170.0787 curveto
+113.3858 170.0787 lineto
+113.3858 141.73225 lineto
+97.73073 141.73225 85.03935 129.04088 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 113.3858 141.73225 moveto
+97.73073 141.73225 85.03935 129.04088 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/example.4 b/graphics/metapost/contrib/macros/truchet/example.4
new file mode 100644
index 0000000000..01671a8b1e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.4
@@ -0,0 +1,312 @@
+%!PS
+%%BoundingBox: -3 -3 117 117
+%%Creator: MetaPost
+%%CreationDate: 1995.07.20:0132
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 114.80313 lineto
+114.80313 114.80313 lineto
+114.80313 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 113.3858 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 113.3858 lineto stroke
+newpath 85.03935 0 moveto
+85.03935 113.3858 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+113.3858 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+113.3858 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+113.3858 85.03935 lineto stroke
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 28.34647 moveto
+14.17323 20.51892 20.5189 14.17323 28.34645 14.17323 curveto
+28.34645 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 28.34645 lineto
+14.17323 28.34645 lineto
+14.17323 20.5189 20.51892 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 0 lineto
+ closepath fill
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+28.34645 56.6929 lineto
+28.34645 42.51968 lineto
+20.5189 42.51968 14.17323 36.174 14.17323 28.34645 curveto
+0 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto
+28.34647 28.34647 lineto
+ closepath fill
+newpath 14.17323 85.03937 moveto
+14.17323 77.21182 20.5189 70.86613 28.34645 70.86613 curveto
+28.34645 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 56.6929 moveto
+14.17323 64.52045 7.82756 70.86613 0.00002 70.86613 curveto
+0.00002 85.03935 lineto
+14.17323 85.03935 lineto
+14.17323 77.2118 20.51892 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 56.6929 moveto
+14.17323 64.52045 7.82756 70.86613 0.00002 70.86613 curveto
+0.00002 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 113.38582 moveto
+14.17323 105.55827 20.5189 99.21259 28.34645 99.21259 curveto
+28.34645 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 85.03935 moveto
+14.17323 92.8669 7.82756 99.21259 0.00002 99.21259 curveto
+0.00002 113.3858 lineto
+14.17323 113.3858 lineto
+14.17323 105.55826 20.51892 99.21259 28.34647 99.21259 curveto
+28.34647 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 85.03935 moveto
+14.17323 92.8669 7.82756 99.21259 0.00002 99.21259 curveto
+0.00002 85.03935 lineto
+ closepath fill
+newpath 42.51968 28.34647 moveto
+42.51968 20.51892 48.86536 14.17323 56.6929 14.17323 curveto
+56.6929 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 28.34645 lineto
+42.51968 28.34645 lineto
+42.51968 20.5189 48.86537 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.69292 moveto
+42.51968 48.86537 48.86536 42.51968 56.6929 42.51968 curveto
+56.6929 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 56.6929 lineto
+42.51968 56.6929 lineto
+42.51968 48.86536 48.86537 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto
+56.6929 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 85.03935 lineto
+42.51968 85.03935 lineto
+42.51968 77.2118 48.86537 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto
+28.34645 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 99.21259 lineto
+48.86536 99.21259 42.51968 92.8669 42.51968 85.03935 curveto
+28.34645 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.69292 99.21259 moveto
+48.86537 99.21259 42.51968 92.86691 42.51968 85.03937 curveto
+56.69292 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 28.34647 moveto
+70.86613 20.51892 77.2118 14.17323 85.03935 14.17323 curveto
+85.03935 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 0 moveto
+70.86613 7.82755 64.52046 14.17323 56.69292 14.17323 curveto
+56.69292 28.34645 lineto
+70.86613 28.34645 lineto
+70.86613 20.5189 77.21182 14.17323 85.03937 14.17323 curveto
+85.03937 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 0 moveto
+70.86613 7.82755 64.52046 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto
+85.03935 56.6929 lineto
+85.03935 42.51968 lineto
+77.2118 42.51968 70.86613 36.174 70.86613 28.34645 curveto
+56.6929 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 42.51968 moveto
+77.21182 42.51968 70.86613 36.17401 70.86613 28.34647 curveto
+85.03937 28.34647 lineto
+ closepath fill
+newpath 70.86613 85.03937 moveto
+70.86613 77.21182 77.2118 70.86613 85.03935 70.86613 curveto
+85.03935 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 56.6929 moveto
+70.86613 64.52045 64.52046 70.86613 56.69292 70.86613 curveto
+56.69292 85.03935 lineto
+70.86613 85.03935 lineto
+70.86613 77.2118 77.21182 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 56.6929 moveto
+70.86613 64.52045 64.52046 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 113.38582 moveto
+70.86613 105.55827 77.2118 99.21259 85.03935 99.21259 curveto
+85.03935 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto
+56.69292 113.3858 lineto
+70.86613 113.3858 lineto
+70.86613 105.55826 77.21182 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto
+56.69292 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+113.3858 28.34645 lineto
+113.3858 14.17323 lineto
+105.55826 14.17323 99.21259 7.82755 99.21259 0 curveto
+85.03935 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 14.17323 moveto
+105.55827 14.17323 99.21259 7.82756 99.21259 0.00002 curveto
+113.38582 0.00002 lineto
+ closepath fill
+newpath 99.21259 56.69292 moveto
+99.21259 48.86537 105.55826 42.51968 113.3858 42.51968 curveto
+113.3858 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 28.34645 moveto
+99.21259 36.174 92.86691 42.51968 85.03937 42.51968 curveto
+85.03937 56.6929 lineto
+99.21259 56.6929 lineto
+99.21259 48.86536 105.55827 42.51968 113.38582 42.51968 curveto
+113.38582 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 28.34645 moveto
+99.21259 36.174 92.86691 42.51968 85.03937 42.51968 curveto
+85.03937 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03937 moveto
+99.21259 77.21182 105.55826 70.86613 113.3858 70.86613 curveto
+113.3858 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 85.03935 lineto
+99.21259 85.03935 lineto
+99.21259 77.2118 105.55827 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.38582 moveto
+99.21259 105.55827 105.55826 99.21259 113.3858 99.21259 curveto
+113.3858 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 113.3858 lineto
+99.21259 113.3858 lineto
+99.21259 105.55826 105.55827 99.21259 113.38582 99.21259 curveto
+113.38582 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/example.5 b/graphics/metapost/contrib/macros/truchet/example.5
new file mode 100644
index 0000000000..1c0b983167
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.5
@@ -0,0 +1,1806 @@
+%!PS
+%%BoundingBox: -3 -3 287 287
+%%Creator: MetaPost
+%%CreationDate: 1995.07.20:0132
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 284.88184 lineto
+284.88184 284.88184 lineto
+284.88184 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 283.46451 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 283.46451 lineto stroke
+newpath 85.03935 0 moveto
+85.03935 283.46451 lineto stroke
+newpath 113.3858 0 moveto
+113.3858 283.46451 lineto stroke
+newpath 141.73225 0 moveto
+141.73225 283.46451 lineto stroke
+newpath 170.0787 0 moveto
+170.0787 283.46451 lineto stroke
+newpath 198.42516 0 moveto
+198.42516 283.46451 lineto stroke
+newpath 226.7716 0 moveto
+226.7716 283.46451 lineto stroke
+newpath 255.11806 0 moveto
+255.11806 283.46451 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+283.46451 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+283.46451 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+283.46451 85.03935 lineto stroke
+newpath 0 113.3858 moveto
+283.46451 113.3858 lineto stroke
+newpath 0 141.73225 moveto
+283.46451 141.73225 lineto stroke
+newpath 0 170.0787 moveto
+283.46451 170.0787 lineto stroke
+newpath 0 198.42516 moveto
+283.46451 198.42516 lineto stroke
+newpath 0 226.7716 moveto
+283.46451 226.7716 lineto stroke
+newpath 0 255.11806 moveto
+283.46451 255.11806 lineto stroke
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 28.34647 moveto
+14.17323 20.51892 20.5189 14.17323 28.34645 14.17323 curveto
+28.34645 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 28.34645 lineto
+14.17323 28.34645 lineto
+14.17323 20.5189 20.51892 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 0 lineto
+ closepath fill
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+28.34645 56.6929 lineto
+28.34645 42.51968 lineto
+20.5189 42.51968 14.17323 36.174 14.17323 28.34645 curveto
+0 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto
+28.34647 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+28.34645 85.03935 lineto
+28.34645 70.86613 lineto
+20.5189 70.86613 14.17323 64.52045 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 70.86613 moveto
+20.51892 70.86613 14.17323 64.52046 14.17323 56.69292 curveto
+28.34647 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+28.34645 113.3858 lineto
+28.34645 99.21259 lineto
+20.5189 99.21259 14.17323 92.8669 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 99.21259 moveto
+20.51892 99.21259 14.17323 92.86691 14.17323 85.03937 curveto
+28.34647 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+0 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+28.34645 141.73225 lineto
+28.34645 127.55904 lineto
+20.5189 127.55904 14.17323 121.21335 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 127.55904 moveto
+20.51892 127.55904 14.17323 121.21336 14.17323 113.38582 curveto
+28.34647 113.38582 lineto
+ closepath fill
+newpath 14.17323 170.07872 moveto
+14.17323 162.25117 20.5189 155.90549 28.34645 155.90549 curveto
+28.34645 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 170.0787 lineto
+14.17323 170.0787 lineto
+14.17323 162.25116 20.51892 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 141.73225 lineto
+ closepath fill
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+0 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+28.34645 198.42516 lineto
+28.34645 184.25194 lineto
+20.5189 184.25194 14.17323 177.90625 14.17323 170.0787 curveto
+0 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 184.25194 moveto
+20.51892 184.25194 14.17323 177.90627 14.17323 170.07872 curveto
+28.34647 170.07872 lineto
+ closepath fill
+newpath 14.17323 226.77162 moveto
+14.17323 218.94408 20.5189 212.59839 28.34645 212.59839 curveto
+28.34645 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 226.7716 lineto
+14.17323 226.7716 lineto
+14.17323 218.94406 20.51892 212.59839 28.34647 212.59839 curveto
+28.34647 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11807 moveto
+14.17323 247.29053 20.5189 240.94484 28.34645 240.94484 curveto
+28.34645 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 255.11806 lineto
+14.17323 255.11806 lineto
+14.17323 247.29051 20.51892 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 283.46452 moveto
+14.17323 275.63698 20.5189 269.29129 28.34645 269.29129 curveto
+28.34645 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 283.46451 lineto
+14.17323 283.46451 lineto
+14.17323 275.63696 20.51892 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 255.11806 lineto
+ closepath fill
+newpath 42.51968 28.34647 moveto
+42.51968 20.51892 48.86536 14.17323 56.6929 14.17323 curveto
+56.6929 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 28.34645 lineto
+42.51968 28.34645 lineto
+42.51968 20.5189 48.86537 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.69292 moveto
+42.51968 48.86537 48.86536 42.51968 56.6929 42.51968 curveto
+56.6929 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 56.6929 lineto
+42.51968 56.6929 lineto
+42.51968 48.86536 48.86537 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto
+56.6929 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 85.03935 lineto
+42.51968 85.03935 lineto
+42.51968 77.2118 48.86537 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 113.38582 moveto
+42.51968 105.55827 48.86536 99.21259 56.6929 99.21259 curveto
+56.6929 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 113.3858 lineto
+42.51968 113.3858 lineto
+42.51968 105.55826 48.86537 99.21259 56.69292 99.21259 curveto
+56.69292 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 85.03935 lineto
+ closepath fill
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+28.34645 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+56.6929 141.73225 lineto
+56.6929 127.55904 lineto
+48.86536 127.55904 42.51968 121.21335 42.51968 113.3858 curveto
+28.34645 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 127.55904 moveto
+48.86537 127.55904 42.51968 121.21336 42.51968 113.38582 curveto
+56.69292 113.38582 lineto
+ closepath fill
+newpath 42.51968 170.07872 moveto
+42.51968 162.25117 48.86536 155.90549 56.6929 155.90549 curveto
+56.6929 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 170.0787 lineto
+42.51968 170.0787 lineto
+42.51968 162.25116 48.86537 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+56.6929 198.42516 lineto
+56.6929 184.25194 lineto
+48.86536 184.25194 42.51968 177.90625 42.51968 170.0787 curveto
+28.34645 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 184.25194 moveto
+48.86537 184.25194 42.51968 177.90627 42.51968 170.07872 curveto
+56.69292 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+28.34645 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+56.6929 226.7716 lineto
+56.6929 212.59839 lineto
+48.86536 212.59839 42.51968 206.2527 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.69292 212.59839 moveto
+48.86537 212.59839 42.51968 206.25272 42.51968 198.42517 curveto
+56.69292 198.42517 lineto
+ closepath fill
+newpath 42.51968 255.11807 moveto
+42.51968 247.29053 48.86536 240.94484 56.6929 240.94484 curveto
+56.6929 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 255.11806 lineto
+42.51968 255.11806 lineto
+42.51968 247.29051 48.86537 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 283.46452 moveto
+42.51968 275.63698 48.86536 269.29129 56.6929 269.29129 curveto
+56.6929 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 283.46451 lineto
+42.51968 283.46451 lineto
+42.51968 275.63696 48.86537 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+56.6929 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+85.03935 28.34645 lineto
+85.03935 14.17323 lineto
+77.2118 14.17323 70.86613 7.82755 70.86613 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 14.17323 moveto
+77.21182 14.17323 70.86613 7.82756 70.86613 0.00002 curveto
+85.03937 0.00002 lineto
+ closepath fill
+newpath 70.86613 56.69292 moveto
+70.86613 48.86537 77.2118 42.51968 85.03935 42.51968 curveto
+85.03935 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 56.6929 lineto
+70.86613 56.6929 lineto
+70.86613 48.86536 77.21182 42.51968 85.03937 42.51968 curveto
+85.03937 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+85.03935 85.03935 lineto
+85.03935 70.86613 lineto
+77.2118 70.86613 70.86613 64.52045 70.86613 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 70.86613 moveto
+77.21182 70.86613 70.86613 64.52046 70.86613 56.69292 curveto
+85.03937 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+85.03935 113.3858 lineto
+85.03935 99.21259 lineto
+77.2118 99.21259 70.86613 92.8669 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 99.21259 moveto
+77.21182 99.21259 70.86613 92.86691 70.86613 85.03937 curveto
+85.03937 85.03937 lineto
+ closepath fill
+newpath 70.86613 141.73227 moveto
+70.86613 133.90472 77.2118 127.55904 85.03935 127.55904 curveto
+85.03935 141.73227 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 141.73225 lineto
+70.86613 141.73225 lineto
+70.86613 133.90471 77.21182 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.07872 moveto
+70.86613 162.25117 77.2118 155.90549 85.03935 155.90549 curveto
+85.03935 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 170.0787 lineto
+70.86613 170.0787 lineto
+70.86613 162.25116 77.21182 155.90549 85.03937 155.90549 curveto
+85.03937 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 198.42517 moveto
+70.86613 190.59763 77.2118 184.25194 85.03935 184.25194 curveto
+85.03935 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 198.42516 lineto
+70.86613 198.42516 lineto
+70.86613 190.59761 77.21182 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 170.0787 lineto
+ closepath fill
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+56.6929 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+85.03935 226.7716 lineto
+85.03935 212.59839 lineto
+77.2118 212.59839 70.86613 206.2527 70.86613 198.42516 curveto
+56.6929 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 212.59839 moveto
+77.21182 212.59839 70.86613 206.25272 70.86613 198.42517 curveto
+85.03937 198.42517 lineto
+ closepath fill
+newpath 70.86613 255.11807 moveto
+70.86613 247.29053 77.2118 240.94484 85.03935 240.94484 curveto
+85.03935 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 255.11806 lineto
+70.86613 255.11806 lineto
+70.86613 247.29051 77.21182 240.94484 85.03937 240.94484 curveto
+85.03937 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 283.46452 moveto
+70.86613 275.63698 77.2118 269.29129 85.03935 269.29129 curveto
+85.03935 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 283.46451 lineto
+70.86613 283.46451 lineto
+70.86613 275.63696 77.21182 269.29129 85.03937 269.29129 curveto
+85.03937 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+113.3858 28.34645 lineto
+113.3858 14.17323 lineto
+105.55826 14.17323 99.21259 7.82755 99.21259 0 curveto
+85.03935 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 14.17323 moveto
+105.55827 14.17323 99.21259 7.82756 99.21259 0.00002 curveto
+113.38582 0.00002 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+85.03935 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+113.3858 56.6929 lineto
+113.3858 42.51968 lineto
+105.55826 42.51968 99.21259 36.174 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 42.51968 moveto
+105.55827 42.51968 99.21259 36.17401 99.21259 28.34647 curveto
+113.38582 28.34647 lineto
+ closepath fill
+newpath 99.21259 85.03937 moveto
+99.21259 77.21182 105.55826 70.86613 113.3858 70.86613 curveto
+113.3858 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 85.03935 lineto
+99.21259 85.03935 lineto
+99.21259 77.2118 105.55827 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.38582 moveto
+99.21259 105.55827 105.55826 99.21259 113.3858 99.21259 curveto
+113.3858 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 113.3858 lineto
+99.21259 113.3858 lineto
+99.21259 105.55826 105.55827 99.21259 113.38582 99.21259 curveto
+113.38582 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 141.73227 moveto
+99.21259 133.90472 105.55826 127.55904 113.3858 127.55904 curveto
+113.3858 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 141.73225 lineto
+99.21259 141.73225 lineto
+99.21259 133.90471 105.55827 127.55904 113.38582 127.55904 curveto
+113.38582 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+85.03935 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+113.3858 170.0787 lineto
+113.3858 155.90549 lineto
+105.55826 155.90549 99.21259 149.5598 99.21259 141.73225 curveto
+85.03935 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 155.90549 moveto
+105.55827 155.90549 99.21259 149.55981 99.21259 141.73227 curveto
+113.38582 141.73227 lineto
+ closepath fill
+newpath 99.21259 198.42517 moveto
+99.21259 190.59763 105.55826 184.25194 113.3858 184.25194 curveto
+113.3858 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 198.42516 lineto
+99.21259 198.42516 lineto
+99.21259 190.59761 105.55827 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 226.77162 moveto
+99.21259 218.94408 105.55826 212.59839 113.3858 212.59839 curveto
+113.3858 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 226.7716 lineto
+99.21259 226.7716 lineto
+99.21259 218.94406 105.55827 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 198.42516 lineto
+ closepath fill
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+113.3858 255.11806 lineto
+113.3858 240.94484 lineto
+105.55826 240.94484 99.21259 234.59915 99.21259 226.7716 curveto
+85.03935 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 240.94484 moveto
+105.55827 240.94484 99.21259 234.59917 99.21259 226.77162 curveto
+113.38582 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+85.03935 283.46451 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+113.3858 283.46451 lineto
+113.3858 269.29129 lineto
+105.55826 269.29129 99.21259 262.9456 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 269.29129 moveto
+105.55827 269.29129 99.21259 262.94562 99.21259 255.11807 curveto
+113.38582 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34647 moveto
+127.55904 20.51892 133.90471 14.17323 141.73225 14.17323 curveto
+141.73225 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 28.34645 lineto
+127.55904 28.34645 lineto
+127.55904 20.5189 133.90472 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.69292 moveto
+127.55904 48.86537 133.90471 42.51968 141.73225 42.51968 curveto
+141.73225 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 56.6929 lineto
+127.55904 56.6929 lineto
+127.55904 48.86536 133.90472 42.51968 141.73227 42.51968 curveto
+141.73227 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 85.03937 moveto
+127.55904 77.21182 133.90471 70.86613 141.73225 70.86613 curveto
+141.73225 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 85.03935 lineto
+127.55904 85.03935 lineto
+127.55904 77.2118 133.90472 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+141.73225 113.3858 lineto
+141.73225 99.21259 lineto
+133.90471 99.21259 127.55904 92.8669 127.55904 85.03935 curveto
+113.3858 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 99.21259 moveto
+133.90472 99.21259 127.55904 92.86691 127.55904 85.03937 curveto
+141.73227 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+141.73225 141.73225 lineto
+141.73225 127.55904 lineto
+133.90471 127.55904 127.55904 121.21335 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 127.55904 moveto
+133.90472 127.55904 127.55904 121.21336 127.55904 113.38582 curveto
+141.73227 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+141.73225 170.0787 lineto
+141.73225 155.90549 lineto
+133.90471 155.90549 127.55904 149.5598 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 155.90549 moveto
+133.90472 155.90549 127.55904 149.55981 127.55904 141.73227 curveto
+141.73227 141.73227 lineto
+ closepath fill
+newpath 127.55904 198.42517 moveto
+127.55904 190.59763 133.90471 184.25194 141.73225 184.25194 curveto
+141.73225 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 198.42516 lineto
+127.55904 198.42516 lineto
+127.55904 190.59761 133.90472 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 226.77162 moveto
+127.55904 218.94408 133.90471 212.59839 141.73225 212.59839 curveto
+141.73225 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 226.7716 lineto
+127.55904 226.7716 lineto
+127.55904 218.94406 133.90472 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+113.3858 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+141.73225 255.11806 lineto
+141.73225 240.94484 lineto
+133.90471 240.94484 127.55904 234.59915 127.55904 226.7716 curveto
+113.3858 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 240.94484 moveto
+133.90472 240.94484 127.55904 234.59917 127.55904 226.77162 curveto
+141.73227 226.77162 lineto
+ closepath fill
+newpath 127.55904 283.46452 moveto
+127.55904 275.63698 133.90471 269.29129 141.73225 269.29129 curveto
+141.73225 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 283.46451 lineto
+127.55904 283.46451 lineto
+127.55904 275.63696 133.90472 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 255.11806 lineto
+ closepath fill
+newpath 155.90549 28.34647 moveto
+155.90549 20.51892 162.25116 14.17323 170.0787 14.17323 curveto
+170.0787 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 28.34645 lineto
+155.90549 28.34645 lineto
+155.90549 20.5189 162.25117 14.17323 170.07872 14.17323 curveto
+170.07872 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+141.73225 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+170.0787 56.6929 lineto
+170.0787 42.51968 lineto
+162.25116 42.51968 155.90549 36.174 155.90549 28.34645 curveto
+141.73225 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 42.51968 moveto
+162.25117 42.51968 155.90549 36.17401 155.90549 28.34647 curveto
+170.07872 28.34647 lineto
+ closepath fill
+newpath 155.90549 85.03937 moveto
+155.90549 77.21182 162.25116 70.86613 170.0787 70.86613 curveto
+170.0787 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 85.03935 lineto
+155.90549 85.03935 lineto
+155.90549 77.2118 162.25117 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.38582 moveto
+155.90549 105.55827 162.25116 99.21259 170.0787 99.21259 curveto
+170.0787 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 113.3858 lineto
+155.90549 113.3858 lineto
+155.90549 105.55826 162.25117 99.21259 170.07872 99.21259 curveto
+170.07872 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 141.73227 moveto
+155.90549 133.90472 162.25116 127.55904 170.0787 127.55904 curveto
+170.0787 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 141.73225 lineto
+155.90549 141.73225 lineto
+155.90549 133.90471 162.25117 127.55904 170.07872 127.55904 curveto
+170.07872 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 113.3858 lineto
+ closepath fill
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+141.73225 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+170.0787 170.0787 lineto
+170.0787 155.90549 lineto
+162.25116 155.90549 155.90549 149.5598 155.90549 141.73225 curveto
+141.73225 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 155.90549 moveto
+162.25117 155.90549 155.90549 149.55981 155.90549 141.73227 curveto
+170.07872 141.73227 lineto
+ closepath fill
+newpath 155.90549 198.42517 moveto
+155.90549 190.59763 162.25116 184.25194 170.0787 184.25194 curveto
+170.0787 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 198.42516 lineto
+155.90549 198.42516 lineto
+155.90549 190.59761 162.25117 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.77162 moveto
+155.90549 218.94408 162.25116 212.59839 170.0787 212.59839 curveto
+170.0787 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 226.7716 lineto
+155.90549 226.7716 lineto
+155.90549 218.94406 162.25117 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11807 moveto
+155.90549 247.29053 162.25116 240.94484 170.0787 240.94484 curveto
+170.0787 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 255.11806 lineto
+155.90549 255.11806 lineto
+155.90549 247.29051 162.25117 240.94484 170.07872 240.94484 curveto
+170.07872 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 283.46452 moveto
+155.90549 275.63698 162.25116 269.29129 170.0787 269.29129 curveto
+170.0787 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 283.46451 lineto
+155.90549 283.46451 lineto
+155.90549 275.63696 162.25117 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+198.42516 28.34645 lineto
+198.42516 14.17323 lineto
+190.59761 14.17323 184.25194 7.82755 184.25194 0 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 14.17323 moveto
+190.59763 14.17323 184.25194 7.82756 184.25194 0.00002 curveto
+198.42517 0.00002 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+170.0787 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+198.42516 56.6929 lineto
+198.42516 42.51968 lineto
+190.59761 42.51968 184.25194 36.174 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 42.51968 moveto
+190.59763 42.51968 184.25194 36.17401 184.25194 28.34647 curveto
+198.42517 28.34647 lineto
+ closepath fill
+newpath 184.25194 85.03937 moveto
+184.25194 77.21182 190.59761 70.86613 198.42516 70.86613 curveto
+198.42516 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 85.03935 lineto
+184.25194 85.03935 lineto
+184.25194 77.2118 190.59763 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+198.42516 113.3858 lineto
+198.42516 99.21259 lineto
+190.59761 99.21259 184.25194 92.8669 184.25194 85.03935 curveto
+170.0787 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 99.21259 moveto
+190.59763 99.21259 184.25194 92.86691 184.25194 85.03937 curveto
+198.42517 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+198.42516 141.73225 lineto
+198.42516 127.55904 lineto
+190.59761 127.55904 184.25194 121.21335 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 127.55904 moveto
+190.59763 127.55904 184.25194 121.21336 184.25194 113.38582 curveto
+198.42517 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+170.0787 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+198.42516 170.0787 lineto
+198.42516 155.90549 lineto
+190.59761 155.90549 184.25194 149.5598 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 155.90549 moveto
+190.59763 155.90549 184.25194 149.55981 184.25194 141.73227 curveto
+198.42517 141.73227 lineto
+ closepath fill
+newpath 184.25194 198.42517 moveto
+184.25194 190.59763 190.59761 184.25194 198.42516 184.25194 curveto
+198.42516 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 198.42516 lineto
+184.25194 198.42516 lineto
+184.25194 190.59761 190.59763 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 226.77162 moveto
+184.25194 218.94408 190.59761 212.59839 198.42516 212.59839 curveto
+198.42516 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 226.7716 lineto
+184.25194 226.7716 lineto
+184.25194 218.94406 190.59763 212.59839 198.42517 212.59839 curveto
+198.42517 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+170.0787 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+198.42516 255.11806 lineto
+198.42516 240.94484 lineto
+190.59761 240.94484 184.25194 234.59915 184.25194 226.7716 curveto
+170.0787 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 240.94484 moveto
+190.59763 240.94484 184.25194 234.59917 184.25194 226.77162 curveto
+198.42517 226.77162 lineto
+ closepath fill
+newpath 184.25194 283.46452 moveto
+184.25194 275.63698 190.59761 269.29129 198.42516 269.29129 curveto
+198.42516 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 283.46451 lineto
+184.25194 283.46451 lineto
+184.25194 275.63696 190.59763 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+newpath 212.59839 28.34647 moveto
+212.59839 20.51892 218.94406 14.17323 226.7716 14.17323 curveto
+226.7716 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 28.34645 lineto
+212.59839 28.34645 lineto
+212.59839 20.5189 218.94408 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.69292 moveto
+212.59839 48.86537 218.94406 42.51968 226.7716 42.51968 curveto
+226.7716 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 56.6929 lineto
+212.59839 56.6929 lineto
+212.59839 48.86536 218.94408 42.51968 226.77162 42.51968 curveto
+226.77162 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03937 moveto
+212.59839 77.21182 218.94406 70.86613 226.7716 70.86613 curveto
+226.7716 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 85.03935 lineto
+212.59839 85.03935 lineto
+212.59839 77.2118 218.94408 70.86613 226.77162 70.86613 curveto
+226.77162 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 113.38582 moveto
+212.59839 105.55827 218.94406 99.21259 226.7716 99.21259 curveto
+226.7716 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 113.3858 lineto
+212.59839 113.3858 lineto
+212.59839 105.55826 218.94408 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 85.03935 lineto
+ closepath fill
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+198.42516 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+226.7716 141.73225 lineto
+226.7716 127.55904 lineto
+218.94406 127.55904 212.59839 121.21335 212.59839 113.3858 curveto
+198.42516 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.77162 127.55904 moveto
+218.94408 127.55904 212.59839 121.21336 212.59839 113.38582 curveto
+226.77162 113.38582 lineto
+ closepath fill
+newpath 212.59839 170.07872 moveto
+212.59839 162.25117 218.94406 155.90549 226.7716 155.90549 curveto
+226.7716 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 170.0787 lineto
+212.59839 170.0787 lineto
+212.59839 162.25116 218.94408 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 198.42517 moveto
+212.59839 190.59763 218.94406 184.25194 226.7716 184.25194 curveto
+226.7716 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 198.42516 lineto
+212.59839 198.42516 lineto
+212.59839 190.59761 218.94408 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+198.42516 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+226.7716 226.7716 lineto
+226.7716 212.59839 lineto
+218.94406 212.59839 212.59839 206.2527 212.59839 198.42516 curveto
+198.42516 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.77162 212.59839 moveto
+218.94408 212.59839 212.59839 206.25272 212.59839 198.42517 curveto
+226.77162 198.42517 lineto
+ closepath fill
+newpath 212.59839 255.11807 moveto
+212.59839 247.29053 218.94406 240.94484 226.7716 240.94484 curveto
+226.7716 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 255.11806 lineto
+212.59839 255.11806 lineto
+212.59839 247.29051 218.94408 240.94484 226.77162 240.94484 curveto
+226.77162 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 283.46452 moveto
+212.59839 275.63698 218.94406 269.29129 226.7716 269.29129 curveto
+226.7716 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 283.46451 lineto
+212.59839 283.46451 lineto
+212.59839 275.63696 218.94408 269.29129 226.77162 269.29129 curveto
+226.77162 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+newpath 240.94484 28.34647 moveto
+240.94484 20.51892 247.29051 14.17323 255.11806 14.17323 curveto
+255.11806 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 28.34645 lineto
+240.94484 28.34645 lineto
+240.94484 20.5189 247.29053 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+255.11806 56.6929 lineto
+255.11806 42.51968 lineto
+247.29051 42.51968 240.94484 36.174 240.94484 28.34645 curveto
+226.7716 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 42.51968 moveto
+247.29053 42.51968 240.94484 36.17401 240.94484 28.34647 curveto
+255.11807 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+226.7716 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+255.11806 85.03935 lineto
+255.11806 70.86613 lineto
+247.29051 70.86613 240.94484 64.52045 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 70.86613 moveto
+247.29053 70.86613 240.94484 64.52046 240.94484 56.69292 curveto
+255.11807 56.69292 lineto
+ closepath fill
+newpath 240.94484 113.38582 moveto
+240.94484 105.55827 247.29051 99.21259 255.11806 99.21259 curveto
+255.11806 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 113.3858 lineto
+240.94484 113.3858 lineto
+240.94484 105.55826 247.29053 99.21259 255.11807 99.21259 curveto
+255.11807 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+226.7716 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+255.11806 141.73225 lineto
+255.11806 127.55904 lineto
+247.29051 127.55904 240.94484 121.21335 240.94484 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 127.55904 moveto
+247.29053 127.55904 240.94484 121.21336 240.94484 113.38582 curveto
+255.11807 113.38582 lineto
+ closepath fill
+newpath 240.94484 170.07872 moveto
+240.94484 162.25117 247.29051 155.90549 255.11806 155.90549 curveto
+255.11806 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 170.0787 lineto
+240.94484 170.0787 lineto
+240.94484 162.25116 247.29053 155.90549 255.11807 155.90549 curveto
+255.11807 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 198.42517 moveto
+240.94484 190.59763 247.29051 184.25194 255.11806 184.25194 curveto
+255.11806 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 198.42516 lineto
+240.94484 198.42516 lineto
+240.94484 190.59761 247.29053 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+255.11806 226.7716 lineto
+255.11806 212.59839 lineto
+247.29051 212.59839 240.94484 206.2527 240.94484 198.42516 curveto
+226.7716 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 212.59839 moveto
+247.29053 212.59839 240.94484 206.25272 240.94484 198.42517 curveto
+255.11807 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+255.11806 255.11806 lineto
+255.11806 240.94484 lineto
+247.29051 240.94484 240.94484 234.59915 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 240.94484 moveto
+247.29053 240.94484 240.94484 234.59917 240.94484 226.77162 curveto
+255.11807 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+226.7716 283.46451 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+255.11806 283.46451 lineto
+255.11806 269.29129 lineto
+247.29051 269.29129 240.94484 262.9456 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 269.29129 moveto
+247.29053 269.29129 240.94484 262.94562 240.94484 255.11807 curveto
+255.11807 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 28.34647 moveto
+269.29129 20.51892 275.63696 14.17323 283.46451 14.17323 curveto
+283.46451 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 28.34645 lineto
+269.29129 28.34645 lineto
+269.29129 20.5189 275.63698 14.17323 283.46452 14.17323 curveto
+283.46452 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+255.11806 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+283.46451 56.6929 lineto
+283.46451 42.51968 lineto
+275.63696 42.51968 269.29129 36.174 269.29129 28.34645 curveto
+255.11806 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 42.51968 moveto
+275.63698 42.51968 269.29129 36.17401 269.29129 28.34647 curveto
+283.46452 28.34647 lineto
+ closepath fill
+newpath 269.29129 85.03937 moveto
+269.29129 77.21182 275.63696 70.86613 283.46451 70.86613 curveto
+283.46451 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 85.03935 lineto
+269.29129 85.03935 lineto
+269.29129 77.2118 275.63698 70.86613 283.46452 70.86613 curveto
+283.46452 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 56.6929 lineto
+ closepath fill
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+255.11806 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+283.46451 113.3858 lineto
+283.46451 99.21259 lineto
+275.63696 99.21259 269.29129 92.8669 269.29129 85.03935 curveto
+255.11806 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 99.21259 moveto
+275.63698 99.21259 269.29129 92.86691 269.29129 85.03937 curveto
+283.46452 85.03937 lineto
+ closepath fill
+newpath 269.29129 141.73227 moveto
+269.29129 133.90472 275.63696 127.55904 283.46451 127.55904 curveto
+283.46451 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 141.73225 lineto
+269.29129 141.73225 lineto
+269.29129 133.90471 275.63698 127.55904 283.46452 127.55904 curveto
+283.46452 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 113.3858 lineto
+ closepath fill
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+255.11806 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+283.46451 170.0787 lineto
+283.46451 155.90549 lineto
+275.63696 155.90549 269.29129 149.5598 269.29129 141.73225 curveto
+255.11806 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 155.90549 moveto
+275.63698 155.90549 269.29129 149.55981 269.29129 141.73227 curveto
+283.46452 141.73227 lineto
+ closepath fill
+newpath 269.29129 198.42517 moveto
+269.29129 190.59763 275.63696 184.25194 283.46451 184.25194 curveto
+283.46451 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 198.42516 lineto
+269.29129 198.42516 lineto
+269.29129 190.59761 275.63698 184.25194 283.46452 184.25194 curveto
+283.46452 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.77162 moveto
+269.29129 218.94408 275.63696 212.59839 283.46451 212.59839 curveto
+283.46451 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 226.7716 lineto
+269.29129 226.7716 lineto
+269.29129 218.94406 275.63698 212.59839 283.46452 212.59839 curveto
+283.46452 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11807 moveto
+269.29129 247.29053 275.63696 240.94484 283.46451 240.94484 curveto
+283.46451 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 255.11806 lineto
+269.29129 255.11806 lineto
+269.29129 247.29051 275.63698 240.94484 283.46452 240.94484 curveto
+283.46452 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 283.46452 moveto
+269.29129 275.63698 275.63696 269.29129 283.46451 269.29129 curveto
+283.46451 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 283.46451 lineto
+269.29129 283.46451 lineto
+269.29129 275.63696 275.63698 269.29129 283.46452 269.29129 curveto
+283.46452 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 255.11806 lineto
+ closepath fill
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/example.dvi b/graphics/metapost/contrib/macros/truchet/example.dvi
new file mode 100644
index 0000000000..a5138b9448
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/truchet/example.mp b/graphics/metapost/contrib/macros/truchet/example.mp
new file mode 100644
index 0000000000..774e950a72
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.mp
@@ -0,0 +1,49 @@
+% {\bf Truchet's problem: examples}
+%==================================================
+% D. Roegel's solution for Denis Girou's {\tt pstricks} competition.
+% This solution is written in {\tt METAPOST}.
+% The source file may be formatted using the {\tt mft} program.
+% (the program used for volumes B and E of {\it Computers \& Typesetting\/})
+% Send comments and improvements to {\tt roegel@loria.fr}.
+% -------------------------------------------------------------------------
+% Here are several examples. Each |beginfig| |endfig| environment
+% produces one PostScript file.
+%
+% We load the tiling macros.
+input tiling
+
+randomseed:=23; % this is useful when you want to have always the same tilings.
+
+beginfig(1);
+TilingLineWidth:=1mm;
+TruchetTiling(3,4);
+endfig;
+
+beginfig(2);
+TilingUnit:=2cm;
+TruchetTilingFill:=true;
+TileColors(red,blue);
+TruchetTiling(5,3);
+endfig;
+
+beginfig(3);
+TilingUnit:=2cm;
+TruchetTilingFill:=true;
+TileColors((1,1,1),(0,0,0));
+TruchetTiling(2,3);
+endfig;
+
+beginfig(4);
+TilingUnit:=1cm;
+TruchetTilingFill:=true;
+TileColors((0.5,0,1),(0,1,0));
+TruchetTiling(4,4);
+endfig;
+
+beginfig(5);
+TilingUnit:=1cm;
+TruchetTilingFill:=true;
+TruchetTiling(10,10);
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/truchet/example.tex b/graphics/metapost/contrib/macros/truchet/example.tex
new file mode 100644
index 0000000000..d1e52ebce9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/example.tex
@@ -0,0 +1,53 @@
+\input mftmac
+$\9 {\bf Truchet's problem: examples}\par
+$\9==================================================\par
+$\9 D. Roegel's solution for Denis Girou's {\tt pstricks} competition.\par
+$\9 This solution is written in {\tt METAPOST}.\par
+$\9 The source file may be formatted using the {\tt mft} program.\par
+$\9 (the program used for volumes B and E of {\it Computers \& Typesetting\/})%
+\par
+$\9 Send comments and improvements to {\tt roegel@loria.fr}.\par
+$\9 -------------------------------------------------------------------------%
+\par
+$\9 Here are several examples. Each $\\{beginfig}$ $\\{endfig}$ environment\par
+$\9 produces one PostScript file.\par
+$\9\par
+$\9 We load the tiling macros.\par
+$\2{input}\hbox{\tt tiling}$\par
+\BL
+$\2{randomseed}:=23;\ \9 this is useful when you want to have always the same
+tilings.\par
+\BL
+$\\{beginfig}(1);$\par
+$\\{TilingLineWidth}:=1\\{mm};$\par
+$\\{TruchetTiling}(3,4);$\par
+$\\{endfig};$\par
+\BL
+$\\{beginfig}(2);$\par
+$\\{TilingUnit}:=2\\{cm};$\par
+$\\{TruchetTilingFill}:=\5{true};$\par
+$\\{TileColors}(\\{red},\\{blue});$\par
+$\\{TruchetTiling}(5,3);$\par
+$\\{endfig};$\par
+\BL
+$\\{beginfig}(3);$\par
+$\\{TilingUnit}:=2\\{cm};$\par
+$\\{TruchetTilingFill}:=\5{true};$\par
+$\\{TileColors}((1,1,1),(0,0,0));$\par
+$\\{TruchetTiling}(2,3);$\par
+$\\{endfig};$\par
+\BL
+$\\{beginfig}(4);$\par
+$\\{TilingUnit}:=1\\{cm};$\par
+$\\{TruchetTilingFill}:=\5{true};$\par
+$\\{TileColors}((0.5,0,1),(0,1,0));$\par
+$\\{TruchetTiling}(4,4);$\par
+$\\{endfig};$\par
+\BL
+$\\{beginfig}(5);$\par
+$\\{TilingUnit}:=1\\{cm};$\par
+$\\{TruchetTilingFill}:=\5{true};$\par
+$\\{TruchetTiling}(10,10);$\par
+$\\{endfig};$\par
+\BL
+$\!\3{end}$\par
diff --git a/graphics/metapost/contrib/macros/truchet/mproof.dvi b/graphics/metapost/contrib/macros/truchet/mproof.dvi
new file mode 100644
index 0000000000..36cd796d91
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/mproof.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/truchet/mproof.ps b/graphics/metapost/contrib/macros/truchet/mproof.ps
new file mode 100644
index 0000000000..70526d99eb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/mproof.ps
@@ -0,0 +1,1966 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: mproof.dvi
+%%Pages: 1
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSCommandLine: dvips -Z -o mproof.ps mproof.dvi
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1995.07.09:1833
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get
+round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{
+statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0
+0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn
+begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X
+array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo
+setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx
+FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{
+pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}
+B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup
+length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B
+/ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
+/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp
+0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2
+index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff
+ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice
+ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]/id
+ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N /cp 0 N{
+rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id gp get
+/gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp add /cp
+X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add /gp X
+adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{dup
+255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 adv}
+B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv
+S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley
+false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley
+scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave
+transform round exch round exch itransform moveto rulex 0 rlineto 0
+ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta
+0 N /tail{dup /delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{
+3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (mproof.dvi)
+@start /Fa 1 50 df<497E1307130F133FEA01FFB5FC13DFEAFE1F1200B3B3A7497E00
+7FB512E0A31B3779B62A>49 D E /Fb 8 121 df<121EEA7F80A2EAFFC0A4EA7F80A2EA
+1E000A0A6F892C>46 D<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E0
+15F8819038FC03FEEBF00001C0137F49EB3F8090C7121F6C15C0C8120FA2ED07E0A41210
+127C12FE150F16C05A6C141F007EEC3F80007FEC7F006C6C5B6D485A391FF00FFC6CB55A
+6C5C000114C06C6C90C7FCEB0FF823347CB22C>53 D<EBFFF0000713FE486D7E4814E081
+9038C01FF81407390F8001FC6CC7FCC87E157EA3ECFFFE130F137F0003B5FC120F48EB80
+7E383FF00013C048C7FC12FE5AA47E007F14FEEB8003383FE00F6CB612FC6C15FE6C14BF
+0001EBFE1F3A003FF003FC27247CA32C>97 D<EB03FE90381FFFC0017F13F048B57E4880
+3907FE03FE390FF800FF01E0EB3F804848131F484814C090C7120F5A007E15E015075AB7
+FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001FE
+13FF0001B612806C1500013F13FC010F13F00101138023247CA32C>101
+D<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>108
+D<3A7F81F003E09039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEB
+F83F9039F00FE01FA201E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8
+D87FFC4913F0023F137F2D2481A32C>I<397FF01FC039FFF8FFF801FB13FE90B6FC6C15
+8000019038E03FC09138801FE091380007F049130349EB01F816FC491300A216FE167EA8
+16FE6D14FCA2ED01F86D1303ED07F06D130F9138801FE09138E07FC091B51280160001FB
+5B01F813F0EC1F8091C8FCAD387FFFE0B57EA36C5B27367FA32C>112
+D<3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83
+EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF8090
+3807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FF
+FC1483B514FE6C15FC140127247EA32C>120 D E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 166 83 a Fb(example.5)742 2526 y @beginspecial
+-3 @llx -3 @lly 287 @urx 287 @ury 2900 @rwi @setspecial
+%%BeginDocument: example.5
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 284.88184 lineto
+284.88184 284.88184 lineto
+284.88184 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 283.46451 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 283.46451 lineto stroke
+newpath 85.03935 0 moveto
+85.03935 283.46451 lineto stroke
+newpath 113.3858 0 moveto
+113.3858 283.46451 lineto stroke
+newpath 141.73225 0 moveto
+141.73225 283.46451 lineto stroke
+newpath 170.0787 0 moveto
+170.0787 283.46451 lineto stroke
+newpath 198.42516 0 moveto
+198.42516 283.46451 lineto stroke
+newpath 226.7716 0 moveto
+226.7716 283.46451 lineto stroke
+newpath 255.11806 0 moveto
+255.11806 283.46451 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+283.46451 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+283.46451 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+283.46451 85.03935 lineto stroke
+newpath 0 113.3858 moveto
+283.46451 113.3858 lineto stroke
+newpath 0 141.73225 moveto
+283.46451 141.73225 lineto stroke
+newpath 0 170.0787 moveto
+283.46451 170.0787 lineto stroke
+newpath 0 198.42516 moveto
+283.46451 198.42516 lineto stroke
+newpath 0 226.7716 moveto
+283.46451 226.7716 lineto stroke
+newpath 0 255.11806 moveto
+283.46451 255.11806 lineto stroke
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 28.34647 moveto
+14.17323 20.51892 20.5189 14.17323 28.34645 14.17323 curveto
+28.34645 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 28.34645 lineto
+14.17323 28.34645 lineto
+14.17323 20.5189 20.51892 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 0 lineto
+ closepath fill
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+28.34645 56.6929 lineto
+28.34645 42.51968 lineto
+20.5189 42.51968 14.17323 36.174 14.17323 28.34645 curveto
+0 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto
+28.34647 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+28.34645 85.03935 lineto
+28.34645 70.86613 lineto
+20.5189 70.86613 14.17323 64.52045 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 70.86613 moveto
+20.51892 70.86613 14.17323 64.52046 14.17323 56.69292 curveto
+28.34647 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+28.34645 113.3858 lineto
+28.34645 99.21259 lineto
+20.5189 99.21259 14.17323 92.8669 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 99.21259 moveto
+20.51892 99.21259 14.17323 92.86691 14.17323 85.03937 curveto
+28.34647 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+0 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+28.34645 141.73225 lineto
+28.34645 127.55904 lineto
+20.5189 127.55904 14.17323 121.21335 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 127.55904 moveto
+20.51892 127.55904 14.17323 121.21336 14.17323 113.38582 curveto
+28.34647 113.38582 lineto
+ closepath fill
+newpath 14.17323 170.07872 moveto
+14.17323 162.25117 20.5189 155.90549 28.34645 155.90549 curveto
+28.34645 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 170.0787 lineto
+14.17323 170.0787 lineto
+14.17323 162.25116 20.51892 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 141.73225 lineto
+ closepath fill
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+0 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+28.34645 198.42516 lineto
+28.34645 184.25194 lineto
+20.5189 184.25194 14.17323 177.90625 14.17323 170.0787 curveto
+0 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 184.25194 moveto
+20.51892 184.25194 14.17323 177.90627 14.17323 170.07872 curveto
+28.34647 170.07872 lineto
+ closepath fill
+newpath 14.17323 226.77162 moveto
+14.17323 218.94408 20.5189 212.59839 28.34645 212.59839 curveto
+28.34645 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 226.7716 lineto
+14.17323 226.7716 lineto
+14.17323 218.94406 20.51892 212.59839 28.34647 212.59839 curveto
+28.34647 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11807 moveto
+14.17323 247.29053 20.5189 240.94484 28.34645 240.94484 curveto
+28.34645 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 255.11806 lineto
+14.17323 255.11806 lineto
+14.17323 247.29051 20.51892 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 283.46452 moveto
+14.17323 275.63698 20.5189 269.29129 28.34645 269.29129 curveto
+28.34645 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 283.46451 lineto
+14.17323 283.46451 lineto
+14.17323 275.63696 20.51892 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 255.11806 lineto
+ closepath fill
+newpath 42.51968 28.34647 moveto
+42.51968 20.51892 48.86536 14.17323 56.6929 14.17323 curveto
+56.6929 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 28.34645 lineto
+42.51968 28.34645 lineto
+42.51968 20.5189 48.86537 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.69292 moveto
+42.51968 48.86537 48.86536 42.51968 56.6929 42.51968 curveto
+56.6929 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 56.6929 lineto
+42.51968 56.6929 lineto
+42.51968 48.86536 48.86537 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto
+56.6929 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 85.03935 lineto
+42.51968 85.03935 lineto
+42.51968 77.2118 48.86537 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 113.38582 moveto
+42.51968 105.55827 48.86536 99.21259 56.6929 99.21259 curveto
+56.6929 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 113.3858 lineto
+42.51968 113.3858 lineto
+42.51968 105.55826 48.86537 99.21259 56.69292 99.21259 curveto
+56.69292 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 85.03935 lineto
+ closepath fill
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+28.34645 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+56.6929 141.73225 lineto
+56.6929 127.55904 lineto
+48.86536 127.55904 42.51968 121.21335 42.51968 113.3858 curveto
+28.34645 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 127.55904 moveto
+48.86537 127.55904 42.51968 121.21336 42.51968 113.38582 curveto
+56.69292 113.38582 lineto
+ closepath fill
+newpath 42.51968 170.07872 moveto
+42.51968 162.25117 48.86536 155.90549 56.6929 155.90549 curveto
+56.6929 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 170.0787 lineto
+42.51968 170.0787 lineto
+42.51968 162.25116 48.86537 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+56.6929 198.42516 lineto
+56.6929 184.25194 lineto
+48.86536 184.25194 42.51968 177.90625 42.51968 170.0787 curveto
+28.34645 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 184.25194 moveto
+48.86537 184.25194 42.51968 177.90627 42.51968 170.07872 curveto
+56.69292 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+28.34645 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+56.6929 226.7716 lineto
+56.6929 212.59839 lineto
+48.86536 212.59839 42.51968 206.2527 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.69292 212.59839 moveto
+48.86537 212.59839 42.51968 206.25272 42.51968 198.42517 curveto
+56.69292 198.42517 lineto
+ closepath fill
+newpath 42.51968 255.11807 moveto
+42.51968 247.29053 48.86536 240.94484 56.6929 240.94484 curveto
+56.6929 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 255.11806 lineto
+42.51968 255.11806 lineto
+42.51968 247.29051 48.86537 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 283.46452 moveto
+42.51968 275.63698 48.86536 269.29129 56.6929 269.29129 curveto
+56.6929 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 283.46451 lineto
+42.51968 283.46451 lineto
+42.51968 275.63696 48.86537 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+56.6929 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+85.03935 28.34645 lineto
+85.03935 14.17323 lineto
+77.2118 14.17323 70.86613 7.82755 70.86613 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 14.17323 moveto
+77.21182 14.17323 70.86613 7.82756 70.86613 0.00002 curveto
+85.03937 0.00002 lineto
+ closepath fill
+newpath 70.86613 56.69292 moveto
+70.86613 48.86537 77.2118 42.51968 85.03935 42.51968 curveto
+85.03935 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 56.6929 lineto
+70.86613 56.6929 lineto
+70.86613 48.86536 77.21182 42.51968 85.03937 42.51968 curveto
+85.03937 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+85.03935 85.03935 lineto
+85.03935 70.86613 lineto
+77.2118 70.86613 70.86613 64.52045 70.86613 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 70.86613 moveto
+77.21182 70.86613 70.86613 64.52046 70.86613 56.69292 curveto
+85.03937 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+85.03935 113.3858 lineto
+85.03935 99.21259 lineto
+77.2118 99.21259 70.86613 92.8669 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 99.21259 moveto
+77.21182 99.21259 70.86613 92.86691 70.86613 85.03937 curveto
+85.03937 85.03937 lineto
+ closepath fill
+newpath 70.86613 141.73227 moveto
+70.86613 133.90472 77.2118 127.55904 85.03935 127.55904 curveto
+85.03935 141.73227 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 141.73225 lineto
+70.86613 141.73225 lineto
+70.86613 133.90471 77.21182 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.07872 moveto
+70.86613 162.25117 77.2118 155.90549 85.03935 155.90549 curveto
+85.03935 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 170.0787 lineto
+70.86613 170.0787 lineto
+70.86613 162.25116 77.21182 155.90549 85.03937 155.90549 curveto
+85.03937 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 198.42517 moveto
+70.86613 190.59763 77.2118 184.25194 85.03935 184.25194 curveto
+85.03935 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 198.42516 lineto
+70.86613 198.42516 lineto
+70.86613 190.59761 77.21182 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 170.0787 lineto
+ closepath fill
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+56.6929 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+85.03935 226.7716 lineto
+85.03935 212.59839 lineto
+77.2118 212.59839 70.86613 206.2527 70.86613 198.42516 curveto
+56.6929 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 212.59839 moveto
+77.21182 212.59839 70.86613 206.25272 70.86613 198.42517 curveto
+85.03937 198.42517 lineto
+ closepath fill
+newpath 70.86613 255.11807 moveto
+70.86613 247.29053 77.2118 240.94484 85.03935 240.94484 curveto
+85.03935 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 255.11806 lineto
+70.86613 255.11806 lineto
+70.86613 247.29051 77.21182 240.94484 85.03937 240.94484 curveto
+85.03937 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 283.46452 moveto
+70.86613 275.63698 77.2118 269.29129 85.03935 269.29129 curveto
+85.03935 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 283.46451 lineto
+70.86613 283.46451 lineto
+70.86613 275.63696 77.21182 269.29129 85.03937 269.29129 curveto
+85.03937 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+113.3858 28.34645 lineto
+113.3858 14.17323 lineto
+105.55826 14.17323 99.21259 7.82755 99.21259 0 curveto
+85.03935 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 14.17323 moveto
+105.55827 14.17323 99.21259 7.82756 99.21259 0.00002 curveto
+113.38582 0.00002 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+85.03935 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+113.3858 56.6929 lineto
+113.3858 42.51968 lineto
+105.55826 42.51968 99.21259 36.174 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 42.51968 moveto
+105.55827 42.51968 99.21259 36.17401 99.21259 28.34647 curveto
+113.38582 28.34647 lineto
+ closepath fill
+newpath 99.21259 85.03937 moveto
+99.21259 77.21182 105.55826 70.86613 113.3858 70.86613 curveto
+113.3858 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 85.03935 lineto
+99.21259 85.03935 lineto
+99.21259 77.2118 105.55827 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.38582 moveto
+99.21259 105.55827 105.55826 99.21259 113.3858 99.21259 curveto
+113.3858 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 113.3858 lineto
+99.21259 113.3858 lineto
+99.21259 105.55826 105.55827 99.21259 113.38582 99.21259 curveto
+113.38582 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 141.73227 moveto
+99.21259 133.90472 105.55826 127.55904 113.3858 127.55904 curveto
+113.3858 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 141.73225 lineto
+99.21259 141.73225 lineto
+99.21259 133.90471 105.55827 127.55904 113.38582 127.55904 curveto
+113.38582 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+85.03935 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+113.3858 170.0787 lineto
+113.3858 155.90549 lineto
+105.55826 155.90549 99.21259 149.5598 99.21259 141.73225 curveto
+85.03935 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 155.90549 moveto
+105.55827 155.90549 99.21259 149.55981 99.21259 141.73227 curveto
+113.38582 141.73227 lineto
+ closepath fill
+newpath 99.21259 198.42517 moveto
+99.21259 190.59763 105.55826 184.25194 113.3858 184.25194 curveto
+113.3858 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 198.42516 lineto
+99.21259 198.42516 lineto
+99.21259 190.59761 105.55827 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 226.77162 moveto
+99.21259 218.94408 105.55826 212.59839 113.3858 212.59839 curveto
+113.3858 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 226.7716 lineto
+99.21259 226.7716 lineto
+99.21259 218.94406 105.55827 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 198.42516 lineto
+ closepath fill
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+113.3858 255.11806 lineto
+113.3858 240.94484 lineto
+105.55826 240.94484 99.21259 234.59915 99.21259 226.7716 curveto
+85.03935 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 240.94484 moveto
+105.55827 240.94484 99.21259 234.59917 99.21259 226.77162 curveto
+113.38582 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+85.03935 283.46451 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+113.3858 283.46451 lineto
+113.3858 269.29129 lineto
+105.55826 269.29129 99.21259 262.9456 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 269.29129 moveto
+105.55827 269.29129 99.21259 262.94562 99.21259 255.11807 curveto
+113.38582 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34647 moveto
+127.55904 20.51892 133.90471 14.17323 141.73225 14.17323 curveto
+141.73225 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 28.34645 lineto
+127.55904 28.34645 lineto
+127.55904 20.5189 133.90472 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.69292 moveto
+127.55904 48.86537 133.90471 42.51968 141.73225 42.51968 curveto
+141.73225 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 56.6929 lineto
+127.55904 56.6929 lineto
+127.55904 48.86536 133.90472 42.51968 141.73227 42.51968 curveto
+141.73227 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 85.03937 moveto
+127.55904 77.21182 133.90471 70.86613 141.73225 70.86613 curveto
+141.73225 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 85.03935 lineto
+127.55904 85.03935 lineto
+127.55904 77.2118 133.90472 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+141.73225 113.3858 lineto
+141.73225 99.21259 lineto
+133.90471 99.21259 127.55904 92.8669 127.55904 85.03935 curveto
+113.3858 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 99.21259 moveto
+133.90472 99.21259 127.55904 92.86691 127.55904 85.03937 curveto
+141.73227 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+141.73225 141.73225 lineto
+141.73225 127.55904 lineto
+133.90471 127.55904 127.55904 121.21335 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 127.55904 moveto
+133.90472 127.55904 127.55904 121.21336 127.55904 113.38582 curveto
+141.73227 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+141.73225 170.0787 lineto
+141.73225 155.90549 lineto
+133.90471 155.90549 127.55904 149.5598 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 155.90549 moveto
+133.90472 155.90549 127.55904 149.55981 127.55904 141.73227 curveto
+141.73227 141.73227 lineto
+ closepath fill
+newpath 127.55904 198.42517 moveto
+127.55904 190.59763 133.90471 184.25194 141.73225 184.25194 curveto
+141.73225 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 198.42516 lineto
+127.55904 198.42516 lineto
+127.55904 190.59761 133.90472 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 226.77162 moveto
+127.55904 218.94408 133.90471 212.59839 141.73225 212.59839 curveto
+141.73225 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 226.7716 lineto
+127.55904 226.7716 lineto
+127.55904 218.94406 133.90472 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+113.3858 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+141.73225 255.11806 lineto
+141.73225 240.94484 lineto
+133.90471 240.94484 127.55904 234.59915 127.55904 226.7716 curveto
+113.3858 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 240.94484 moveto
+133.90472 240.94484 127.55904 234.59917 127.55904 226.77162 curveto
+141.73227 226.77162 lineto
+ closepath fill
+newpath 127.55904 283.46452 moveto
+127.55904 275.63698 133.90471 269.29129 141.73225 269.29129 curveto
+141.73225 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 283.46451 lineto
+127.55904 283.46451 lineto
+127.55904 275.63696 133.90472 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 255.11806 lineto
+ closepath fill
+newpath 155.90549 28.34647 moveto
+155.90549 20.51892 162.25116 14.17323 170.0787 14.17323 curveto
+170.0787 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 28.34645 lineto
+155.90549 28.34645 lineto
+155.90549 20.5189 162.25117 14.17323 170.07872 14.17323 curveto
+170.07872 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+141.73225 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+170.0787 56.6929 lineto
+170.0787 42.51968 lineto
+162.25116 42.51968 155.90549 36.174 155.90549 28.34645 curveto
+141.73225 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 42.51968 moveto
+162.25117 42.51968 155.90549 36.17401 155.90549 28.34647 curveto
+170.07872 28.34647 lineto
+ closepath fill
+newpath 155.90549 85.03937 moveto
+155.90549 77.21182 162.25116 70.86613 170.0787 70.86613 curveto
+170.0787 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 85.03935 lineto
+155.90549 85.03935 lineto
+155.90549 77.2118 162.25117 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.38582 moveto
+155.90549 105.55827 162.25116 99.21259 170.0787 99.21259 curveto
+170.0787 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 113.3858 lineto
+155.90549 113.3858 lineto
+155.90549 105.55826 162.25117 99.21259 170.07872 99.21259 curveto
+170.07872 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 141.73227 moveto
+155.90549 133.90472 162.25116 127.55904 170.0787 127.55904 curveto
+170.0787 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 141.73225 lineto
+155.90549 141.73225 lineto
+155.90549 133.90471 162.25117 127.55904 170.07872 127.55904 curveto
+170.07872 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 113.3858 lineto
+ closepath fill
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+141.73225 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+170.0787 170.0787 lineto
+170.0787 155.90549 lineto
+162.25116 155.90549 155.90549 149.5598 155.90549 141.73225 curveto
+141.73225 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 155.90549 moveto
+162.25117 155.90549 155.90549 149.55981 155.90549 141.73227 curveto
+170.07872 141.73227 lineto
+ closepath fill
+newpath 155.90549 198.42517 moveto
+155.90549 190.59763 162.25116 184.25194 170.0787 184.25194 curveto
+170.0787 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 198.42516 lineto
+155.90549 198.42516 lineto
+155.90549 190.59761 162.25117 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.77162 moveto
+155.90549 218.94408 162.25116 212.59839 170.0787 212.59839 curveto
+170.0787 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 226.7716 lineto
+155.90549 226.7716 lineto
+155.90549 218.94406 162.25117 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11807 moveto
+155.90549 247.29053 162.25116 240.94484 170.0787 240.94484 curveto
+170.0787 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 255.11806 lineto
+155.90549 255.11806 lineto
+155.90549 247.29051 162.25117 240.94484 170.07872 240.94484 curveto
+170.07872 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 283.46452 moveto
+155.90549 275.63698 162.25116 269.29129 170.0787 269.29129 curveto
+170.0787 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 283.46451 lineto
+155.90549 283.46451 lineto
+155.90549 275.63696 162.25117 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+198.42516 28.34645 lineto
+198.42516 14.17323 lineto
+190.59761 14.17323 184.25194 7.82755 184.25194 0 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 14.17323 moveto
+190.59763 14.17323 184.25194 7.82756 184.25194 0.00002 curveto
+198.42517 0.00002 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+170.0787 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+198.42516 56.6929 lineto
+198.42516 42.51968 lineto
+190.59761 42.51968 184.25194 36.174 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 42.51968 moveto
+190.59763 42.51968 184.25194 36.17401 184.25194 28.34647 curveto
+198.42517 28.34647 lineto
+ closepath fill
+newpath 184.25194 85.03937 moveto
+184.25194 77.21182 190.59761 70.86613 198.42516 70.86613 curveto
+198.42516 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 85.03935 lineto
+184.25194 85.03935 lineto
+184.25194 77.2118 190.59763 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+198.42516 113.3858 lineto
+198.42516 99.21259 lineto
+190.59761 99.21259 184.25194 92.8669 184.25194 85.03935 curveto
+170.0787 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 99.21259 moveto
+190.59763 99.21259 184.25194 92.86691 184.25194 85.03937 curveto
+198.42517 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+198.42516 141.73225 lineto
+198.42516 127.55904 lineto
+190.59761 127.55904 184.25194 121.21335 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 127.55904 moveto
+190.59763 127.55904 184.25194 121.21336 184.25194 113.38582 curveto
+198.42517 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+170.0787 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+198.42516 170.0787 lineto
+198.42516 155.90549 lineto
+190.59761 155.90549 184.25194 149.5598 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 155.90549 moveto
+190.59763 155.90549 184.25194 149.55981 184.25194 141.73227 curveto
+198.42517 141.73227 lineto
+ closepath fill
+newpath 184.25194 198.42517 moveto
+184.25194 190.59763 190.59761 184.25194 198.42516 184.25194 curveto
+198.42516 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 198.42516 lineto
+184.25194 198.42516 lineto
+184.25194 190.59761 190.59763 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 226.77162 moveto
+184.25194 218.94408 190.59761 212.59839 198.42516 212.59839 curveto
+198.42516 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 226.7716 lineto
+184.25194 226.7716 lineto
+184.25194 218.94406 190.59763 212.59839 198.42517 212.59839 curveto
+198.42517 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+170.0787 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+198.42516 255.11806 lineto
+198.42516 240.94484 lineto
+190.59761 240.94484 184.25194 234.59915 184.25194 226.7716 curveto
+170.0787 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 240.94484 moveto
+190.59763 240.94484 184.25194 234.59917 184.25194 226.77162 curveto
+198.42517 226.77162 lineto
+ closepath fill
+newpath 184.25194 283.46452 moveto
+184.25194 275.63698 190.59761 269.29129 198.42516 269.29129 curveto
+198.42516 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 283.46451 lineto
+184.25194 283.46451 lineto
+184.25194 275.63696 190.59763 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+newpath 212.59839 28.34647 moveto
+212.59839 20.51892 218.94406 14.17323 226.7716 14.17323 curveto
+226.7716 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 28.34645 lineto
+212.59839 28.34645 lineto
+212.59839 20.5189 218.94408 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.69292 moveto
+212.59839 48.86537 218.94406 42.51968 226.7716 42.51968 curveto
+226.7716 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 56.6929 lineto
+212.59839 56.6929 lineto
+212.59839 48.86536 218.94408 42.51968 226.77162 42.51968 curveto
+226.77162 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03937 moveto
+212.59839 77.21182 218.94406 70.86613 226.7716 70.86613 curveto
+226.7716 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 85.03935 lineto
+212.59839 85.03935 lineto
+212.59839 77.2118 218.94408 70.86613 226.77162 70.86613 curveto
+226.77162 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 113.38582 moveto
+212.59839 105.55827 218.94406 99.21259 226.7716 99.21259 curveto
+226.7716 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 113.3858 lineto
+212.59839 113.3858 lineto
+212.59839 105.55826 218.94408 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 85.03935 lineto
+ closepath fill
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+198.42516 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+226.7716 141.73225 lineto
+226.7716 127.55904 lineto
+218.94406 127.55904 212.59839 121.21335 212.59839 113.3858 curveto
+198.42516 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.77162 127.55904 moveto
+218.94408 127.55904 212.59839 121.21336 212.59839 113.38582 curveto
+226.77162 113.38582 lineto
+ closepath fill
+newpath 212.59839 170.07872 moveto
+212.59839 162.25117 218.94406 155.90549 226.7716 155.90549 curveto
+226.7716 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 170.0787 lineto
+212.59839 170.0787 lineto
+212.59839 162.25116 218.94408 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 198.42517 moveto
+212.59839 190.59763 218.94406 184.25194 226.7716 184.25194 curveto
+226.7716 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 198.42516 lineto
+212.59839 198.42516 lineto
+212.59839 190.59761 218.94408 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+198.42516 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+226.7716 226.7716 lineto
+226.7716 212.59839 lineto
+218.94406 212.59839 212.59839 206.2527 212.59839 198.42516 curveto
+198.42516 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.77162 212.59839 moveto
+218.94408 212.59839 212.59839 206.25272 212.59839 198.42517 curveto
+226.77162 198.42517 lineto
+ closepath fill
+newpath 212.59839 255.11807 moveto
+212.59839 247.29053 218.94406 240.94484 226.7716 240.94484 curveto
+226.7716 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 255.11806 lineto
+212.59839 255.11806 lineto
+212.59839 247.29051 218.94408 240.94484 226.77162 240.94484 curveto
+226.77162 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 283.46452 moveto
+212.59839 275.63698 218.94406 269.29129 226.7716 269.29129 curveto
+226.7716 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 283.46451 lineto
+212.59839 283.46451 lineto
+212.59839 275.63696 218.94408 269.29129 226.77162 269.29129 curveto
+226.77162 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+newpath 240.94484 28.34647 moveto
+240.94484 20.51892 247.29051 14.17323 255.11806 14.17323 curveto
+255.11806 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 28.34645 lineto
+240.94484 28.34645 lineto
+240.94484 20.5189 247.29053 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+255.11806 56.6929 lineto
+255.11806 42.51968 lineto
+247.29051 42.51968 240.94484 36.174 240.94484 28.34645 curveto
+226.7716 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 42.51968 moveto
+247.29053 42.51968 240.94484 36.17401 240.94484 28.34647 curveto
+255.11807 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+226.7716 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+255.11806 85.03935 lineto
+255.11806 70.86613 lineto
+247.29051 70.86613 240.94484 64.52045 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 70.86613 moveto
+247.29053 70.86613 240.94484 64.52046 240.94484 56.69292 curveto
+255.11807 56.69292 lineto
+ closepath fill
+newpath 240.94484 113.38582 moveto
+240.94484 105.55827 247.29051 99.21259 255.11806 99.21259 curveto
+255.11806 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 113.3858 lineto
+240.94484 113.3858 lineto
+240.94484 105.55826 247.29053 99.21259 255.11807 99.21259 curveto
+255.11807 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+226.7716 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+255.11806 141.73225 lineto
+255.11806 127.55904 lineto
+247.29051 127.55904 240.94484 121.21335 240.94484 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 127.55904 moveto
+247.29053 127.55904 240.94484 121.21336 240.94484 113.38582 curveto
+255.11807 113.38582 lineto
+ closepath fill
+newpath 240.94484 170.07872 moveto
+240.94484 162.25117 247.29051 155.90549 255.11806 155.90549 curveto
+255.11806 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 170.0787 lineto
+240.94484 170.0787 lineto
+240.94484 162.25116 247.29053 155.90549 255.11807 155.90549 curveto
+255.11807 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 198.42517 moveto
+240.94484 190.59763 247.29051 184.25194 255.11806 184.25194 curveto
+255.11806 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 198.42516 lineto
+240.94484 198.42516 lineto
+240.94484 190.59761 247.29053 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+255.11806 226.7716 lineto
+255.11806 212.59839 lineto
+247.29051 212.59839 240.94484 206.2527 240.94484 198.42516 curveto
+226.7716 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 212.59839 moveto
+247.29053 212.59839 240.94484 206.25272 240.94484 198.42517 curveto
+255.11807 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+255.11806 255.11806 lineto
+255.11806 240.94484 lineto
+247.29051 240.94484 240.94484 234.59915 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 240.94484 moveto
+247.29053 240.94484 240.94484 234.59917 240.94484 226.77162 curveto
+255.11807 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+226.7716 283.46451 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+255.11806 283.46451 lineto
+255.11806 269.29129 lineto
+247.29051 269.29129 240.94484 262.9456 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 269.29129 moveto
+247.29053 269.29129 240.94484 262.94562 240.94484 255.11807 curveto
+255.11807 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 28.34647 moveto
+269.29129 20.51892 275.63696 14.17323 283.46451 14.17323 curveto
+283.46451 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 28.34645 lineto
+269.29129 28.34645 lineto
+269.29129 20.5189 275.63698 14.17323 283.46452 14.17323 curveto
+283.46452 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+255.11806 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+283.46451 56.6929 lineto
+283.46451 42.51968 lineto
+275.63696 42.51968 269.29129 36.174 269.29129 28.34645 curveto
+255.11806 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 42.51968 moveto
+275.63698 42.51968 269.29129 36.17401 269.29129 28.34647 curveto
+283.46452 28.34647 lineto
+ closepath fill
+newpath 269.29129 85.03937 moveto
+269.29129 77.21182 275.63696 70.86613 283.46451 70.86613 curveto
+283.46451 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 85.03935 lineto
+269.29129 85.03935 lineto
+269.29129 77.2118 275.63698 70.86613 283.46452 70.86613 curveto
+283.46452 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 56.6929 lineto
+ closepath fill
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+255.11806 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+283.46451 113.3858 lineto
+283.46451 99.21259 lineto
+275.63696 99.21259 269.29129 92.8669 269.29129 85.03935 curveto
+255.11806 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 99.21259 moveto
+275.63698 99.21259 269.29129 92.86691 269.29129 85.03937 curveto
+283.46452 85.03937 lineto
+ closepath fill
+newpath 269.29129 141.73227 moveto
+269.29129 133.90472 275.63696 127.55904 283.46451 127.55904 curveto
+283.46451 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 141.73225 lineto
+269.29129 141.73225 lineto
+269.29129 133.90471 275.63698 127.55904 283.46452 127.55904 curveto
+283.46452 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 113.3858 lineto
+ closepath fill
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+255.11806 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+283.46451 170.0787 lineto
+283.46451 155.90549 lineto
+275.63696 155.90549 269.29129 149.5598 269.29129 141.73225 curveto
+255.11806 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 155.90549 moveto
+275.63698 155.90549 269.29129 149.55981 269.29129 141.73227 curveto
+283.46452 141.73227 lineto
+ closepath fill
+newpath 269.29129 198.42517 moveto
+269.29129 190.59763 275.63696 184.25194 283.46451 184.25194 curveto
+283.46451 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 198.42516 lineto
+269.29129 198.42516 lineto
+269.29129 190.59761 275.63698 184.25194 283.46452 184.25194 curveto
+283.46452 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.77162 moveto
+269.29129 218.94408 275.63696 212.59839 283.46451 212.59839 curveto
+283.46451 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 226.7716 lineto
+269.29129 226.7716 lineto
+269.29129 218.94406 275.63698 212.59839 283.46452 212.59839 curveto
+283.46452 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11807 moveto
+269.29129 247.29053 275.63696 240.94484 283.46451 240.94484 curveto
+283.46451 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 255.11806 lineto
+269.29129 255.11806 lineto
+269.29129 247.29051 275.63698 240.94484 283.46452 240.94484 curveto
+283.46452 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 283.46452 moveto
+269.29129 275.63698 275.63696 269.29129 283.46451 269.29129 curveto
+283.46451 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 283.46451 lineto
+269.29129 283.46451 lineto
+269.29129 275.63696 275.63698 269.29129 283.46452 269.29129 curveto
+283.46452 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 255.11806 lineto
+ closepath fill
+showpage
+%%EndDocument
+ @endspecial 1929 5539 a Fa(1)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/plain.mft b/graphics/metapost/contrib/macros/truchet/plain.mft
new file mode 100644
index 0000000000..0a456060fd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/plain.mft
@@ -0,0 +1,27 @@
+%%%% MFT commands for the PLAIN base
+%%% } ( ) ]] ! ^ %%%% tokens that need no special formatting
+%%% step upto downto %%%% boldface binary operators
+%%% addto fill unfill draw undraw %%%% boldface unary operators
+%%% addto filldraw unfilldraw drawdot undrawdot erase pickup
+%%% addto exitunless stop incr decr proofrulethickness screenrule
+%%% addto define_pixels define_whole_pixels define_whole_vertical_pixels
+%%% addto define_blacker_pixels define_whole_blacker_pixels
+%%% addto define_corrected_pixels lowres_fix proofoffset penstroke
+%%% addto beginchar italcorr font_size font_slant labels
+%%% addto font_normal_space font_normal_stretch font_normal_shrink font_quad
+%%% addto font_x_height font_extra_space font_identifier font_coding_scheme
+%%% enddef endchar %%%% boldface closing
+%%% true relax mode_setup %%%% boldface nullary operators
+%%% true clearit shipit cullit openit showit clearxy clearpen
+%%% true nodisplay notransforms screenchars screenstrokes imagerules
+%%% .. ... -- --- %%%% path operators made of dots and dashes
+%%% length flex abs dir %%%% unary operators to be in roman type
+%%% length unitvector inverse ceiling round hround vround counterclockwise
+%%% length tensepath byte reflectedabout rotatedaround magstep max min
+%%% and mod dotprod intersectionpoint softjoin %%%% binary operators to be roman
+%%% ++ ** %%%% binary operators made of two special characters
+%%% penoffset goodval direction directionpoint %%%% operators that take "of"
+%%% pausing tolerance pixels_per_inch blacker o_correction %%%% internals
+%%% pausing screen_rows screen_cols currentwindow displaying
+%%% pausing pen_top pen_bot pen_lft pen_rt rt lft top bot
+%%% = <= >= <> %%%% conversions for the SAIL character set only
diff --git a/graphics/metapost/contrib/macros/truchet/readme.pdf b/graphics/metapost/contrib/macros/truchet/readme.pdf
new file mode 100644
index 0000000000..3a8241a282
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/readme.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/truchet/readme.tex b/graphics/metapost/contrib/macros/truchet/readme.tex
new file mode 100644
index 0000000000..d4405a1b37
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/readme.tex
@@ -0,0 +1,120 @@
+% DR, 4-5/7/1995
+
+\documentclass[a4paper]{article}
+\usepackage{mflogo,% definit \MF et \MP -> a utiliser avec la derniere
+ % version de la police `logo', incluant P et S.
+ fullpage}
+\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
+\usepackage{french}
+\begin{document}
+
+\def\pst{\texttt{PSTricks}}
+\def\PS{\emph{PostScript}}
+
+\title{\MP{} et le probl\`eme de Truchet}
+\author{Denis Roegel}
+\date{5 juillet 1995}
+\maketitle
+\thispagestyle{empty}
+
+{\small
+
+Le probl\`eme de Truchet devait \^etre r\'esolu soit par l'emploi
+de macros \pst, soit par une solution \PS\ directe.
+Je n'ai suivi aucune de ces voies, non pas parce
+qu'elles m'apparaissaient difficiles, mais parce que je ne pouvais
+pas m'investir dans ces langages. J'ai pr\'ef\'er\'e profiter de cet
+exercice pour perfectionner ma connaissance de \MP. Je crois qu'il
+vaut mieux ma\^\i triser un langage unique,
+plut\^ot que d'en conna\^\i tre beaucoup superficiellement.
+
+\bigskip
+\MP{}\footnote{\MP{} a \'et\'e d\'evelopp\'e par John~D. Hobby,
+ATT Bell Laboratories, USA.
+Le manuel et d'autres documents
+sont disponibles sur CTAN ainsi que sur \texttt{http://www.loria.fr/tex}.}
+est un langage graphique d\'eriv\'e de \MF{}
+et partage donc un certain nombre de caract\'eristiques avec \pst/\TeX\null.
+C'est un \emph{macrolangage}---tout
+comme \TeX{}---et un programme \MP{} g\'en\`ere des fichiers
+\PS{} pouvant \^etre
+r\'eutilis\'es par \TeX\ ou \'eventuellement un autre logiciel.
+\pst{} g\'en\`ere aussi du \PS{} mais les commandes y sont directement
+\'ecrites dans le fichier \texttt{.dvi}. Parmi les acquis de \MF,
+on trouve en particulier la structure d\'eclarative :
+il est possible de sp\'ecifier les coordonn\'ees des points cl\'es
+par des ensembles d'\'equations lin\'eaires. Avec un peu d'habitude,
+cette structure d\'eclarative devient tr\`es naturelle et accro\^\i t
+notablement la souplesse des figures produites.
+
+\bigskip
+Ma solution au probl\`eme de Truchet n'est pas un exercice \MP{}
+typique, en ce sens qu'elle n'utilise pas ces potentialit\'es
+d\'eclaratives. J'ai plut\^ot tir\'e profit des
+caract\'eristiques suivantes :
+
+\begin{itemize}
+\item la possibilit\'e de d\'eclarer des tableaux de dimension
+quelconque, dont le nombre d'\'el\'ements n'est pas connu \`a l'avance ;
+par exemple \verb|numeric tilecolor[][][]| d\'eclare un tableau de nombres
+(entiers ou r\'eels) qui pourront \^etre acc\'ed\'es par trois index ;
+ceci n'est qu'un exemple, car en g\'en\'eral, le nom d'une variable
+de tableau est compos\'e de \emph{tags} et de \emph{suffixes}, un peu
+comme les param\`etres d'une macro \TeX\ peuvent \^etre s\'epar\'es
+par des d\'elimiteurs\ldots ;
+
+\item la pr\'esence des structures de contr\^ole usuelles :
+ \texttt{for}, \texttt{forever}, \texttt{exitif}, \texttt{endfor} ;
+
+\item la g\'en\'eration de nombres al\'eatoires (distributions uniforme et
+ normale) ;
+
+\item le trac\'e de courbes de B\'ezier
+passant par certains points et soumis \`a des
+contraintes ; les courbes sont des objets de type \texttt{path},
+elles peuvent subir diverses transformations (translations, rotations,
+d\'eformations) et \^etre colori\'ees, par d\'efaut dans le syst\`eme RGB ;
+
+\item le remplissage de zones d\'elimit\'ees par une courbe
+de type \texttt{path} ;
+\item le d\'ecoupage en \emph{macros} pour l'organisation des
+ fonctionnalit\'es et en particulier la possibilit\'e d'\'evaluer
+ ou non les param\`etres d'une commande (type \texttt{expr}
+ ou \texttt{text}).
+\end{itemize}
+
+Dans la solution que je propose, un pavage consiste en un tableau de pav\'es
+et pour chacun d'eux, la donn\'ee de
+son orientation et la coloration de ses lignes et
+parties. Les algorithmes employ\'es sont les suivants :
+
+\begin{description}
+\item[lignes] leur coloriage repose sur une op\'eration plus simple,
+le \emph{suivi} d'une ligne : une ligne encore non colori\'ee est choisie et
+parcourue d'un bout \`a l'autre ; on change de couleur
+\`a chaque nouvelle ligne.
+\item[surfaces] leur coloriage repose sur l'observation que deux
+couleurs suffisent \`a colorier tout pavage du type consid\'er\'e ;
+l'algorithme consiste \`a colorier un premier pav\'e et \`a diffuser ses
+couleurs sur ses voisins, jusqu'\`a avoir rempli tout le pavage ;
+le remplissage est donc r\'ealis\'e pav\'e par pav\'e
+au sein m\^eme de \MP{} ; il eut \'et\'e possible de d\'efinir une macro \MP{}
+prenant en argument un point d'un pavage, construisant la courbe bordant
+la r\'egion s\'electionn\'ee et remplissant alors cette r\'egion avec
+les commandes de \MP{} ; une telle macro peut s'av\'erer int\'eressante
+dans un cas plus g\'en\'eral, mais pas pour un probl\`eme aussi simple
+et abord\'e avec une structure de tableau comme j'ai choisi de le faire.
+\end{description}
+
+\MP{} offre de tr\`es nombreuses autres possibilit\'es,
+en particulier l'int\'egration
+de portions de texte dans les figures gr\^ace \`a l'ex\'ecution de
+sous-processus \TeX\null. Les sorties g\'en\'er\'ees sont des fichiers \PS,
+pouvant \^etre inclus directement par \verb|\includegraphics| dans un fichier
+\LaTeX, sans que des calculs complexes doivent encore
+\^etre faits par \TeX\null.
+
+}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/truchet/test.dvi b/graphics/metapost/contrib/macros/truchet/test.dvi
new file mode 100644
index 0000000000..e4da48303b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/test.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/truchet/test.ps b/graphics/metapost/contrib/macros/truchet/test.ps
new file mode 100644
index 0000000000..f00f796999
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/test.ps
@@ -0,0 +1,2771 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: test.dvi
+%%Pages: 2
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSCommandLine: dvips -Z -o test.ps test.dvi
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource: TeX output 1995.07.20:0131
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get
+round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{
+statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0
+0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn
+begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X
+array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo
+setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx
+FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{
+pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}
+B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup
+length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B
+/ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
+/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp
+0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2
+index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff
+ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice
+ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]/id
+ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N /cp 0 N{
+rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id gp get
+/gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp add /cp
+X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add /gp X
+adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{dup
+255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 adv}
+B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv
+S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley
+false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley
+scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave
+transform round exch round exch itransform moveto rulex 0 rlineto 0
+ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta
+0 N /tail{dup /delta X 0 rmoveto}B /M{S p 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}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{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 rmoveto}B /y{
+3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+%%BeginProcSet: special.pro
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale false def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (test.dvi)
+@start /Fa 2 51 df<497E1307130F133FEA01FFB5FC13DFEAFE1F1200B3B3A7497E00
+7FB512E0A31B3779B62A>49 D<EB1FF0EB7FFE48B57E3903E03FE03907000FF0000CEB03
+F84880486D7E00701300006080127CB48016807FA36CC7FCA2121CC81300A25D5DA24A5A
+5D14035D4A5A4A5A5D4AC7FC143E5C5C5CEB01C0495A49C8FC130E5B49EB01805B5B49EB
+0300485A48C7FC1206485C001FB6FC5A485CB6FCA321377CB62A>I
+E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 1568 1440 a @beginspecial -3 @llx -3 @lly 88
+@urx 117 @ury 910 @rwi @setspecial
+%%BeginDocument: example.1
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 114.80313 lineto
+86.45668 114.80313 lineto
+86.45668 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 113.3858 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 113.3858 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+85.03935 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+85.03935 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+85.03935 85.03935 lineto stroke
+ 0.875 0.125 0 setrgbcolor 0 1.41733
+ dtransform truncate idtransform setlinewidth pop
+newpath 0 14.17323 moveto
+7.82755 14.17323 14.17323 20.5189 14.17323 28.34645 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 28.34647 14.17323 moveto
+20.51892 14.17323 14.17323 7.82756 14.17323 0.00002 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto stroke
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 28.34647 70.86613 moveto
+20.51892 70.86613 14.17323 64.52046 14.17323 56.69292 curveto stroke
+ 0.625 0.375 0 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 28.34647 99.21259 moveto
+20.51892 99.21259 14.17323 92.86691 14.17323 85.03937 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 28.34645 14.17323 moveto
+36.174 14.17323 42.51968 20.5189 42.51968 28.34645 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 56.69292 14.17323 moveto
+48.86537 14.17323 42.51968 7.82756 42.51968 0.00002 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 28.34645 42.51968 moveto
+36.174 42.51968 42.51968 48.86536 42.51968 56.6929 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 56.69292 42.51968 moveto
+48.86537 42.51968 42.51968 36.17401 42.51968 28.34647 curveto stroke
+ 0.875 0.125 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto stroke
+ 0.75 0.25 0 setrgbcolor
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 56.69292 99.21259 moveto
+48.86537 99.21259 42.51968 92.86691 42.51968 85.03937 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto stroke
+ 0.25 0.75 0 setrgbcolor
+newpath 85.03937 14.17323 moveto
+77.21182 14.17323 70.86613 7.82756 70.86613 0.00002 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto stroke
+ 0.5 0.5 0 setrgbcolor
+newpath 85.03937 42.51968 moveto
+77.21182 42.51968 70.86613 36.17401 70.86613 28.34647 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto stroke
+ 1 0 0 setrgbcolor
+newpath 85.03937 70.86613 moveto
+77.21182 70.86613 70.86613 64.52046 70.86613 56.69292 curveto stroke
+ 0.375 0.625 0 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto stroke
+ 0.125 0.875 0 setrgbcolor
+newpath 70.86613 113.38582 moveto
+70.86613 105.55827 77.2118 99.21259 85.03935 99.21259 curveto stroke
+showpage
+%%EndDocument
+ @endspecial 739 2915 a @beginspecial -3 @llx -3 @lly
+287 @urx 173 @ury 2900 @rwi @setspecial
+%%BeginDocument: example.2
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 171.49603 lineto
+284.88184 171.49603 lineto
+284.88184 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 56.6929 0 moveto
+56.6929 170.0787 lineto stroke
+newpath 113.3858 0 moveto
+113.3858 170.0787 lineto stroke
+newpath 170.0787 0 moveto
+170.0787 170.0787 lineto stroke
+newpath 226.7716 0 moveto
+226.7716 170.0787 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 56.6929 moveto
+283.46451 56.6929 lineto stroke
+newpath 0 113.3858 moveto
+283.46451 113.3858 lineto stroke
+ 1 0 0 setrgbcolor
+newpath 0 28.34645 moveto
+15.65508 28.34645 28.34645 41.03783 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 0 28.34645 moveto
+15.65508 28.34645 28.34645 41.03783 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+56.6929 28.34645 lineto
+41.03783 28.34645 28.34645 15.65508 28.34645 0 curveto
+0 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 28.34645 moveto
+41.03783 28.34645 28.34645 15.65508 28.34645 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 85.03935 lineto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 56.6929 85.03935 moveto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+newpath 28.34645 170.0787 moveto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 170.0787 lineto
+28.34645 170.0787 lineto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 113.3858 lineto
+ closepath fill
+newpath 56.6929 28.34645 moveto
+72.34798 28.34645 85.03935 41.03783 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 28.34645 moveto
+72.34798 28.34645 85.03935 41.03783 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+113.3858 28.34645 lineto
+97.73073 28.34645 85.03935 15.65508 85.03935 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 28.34645 moveto
+97.73073 28.34645 85.03935 15.65508 85.03935 0 curveto
+113.3858 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+113.3858 85.03935 lineto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 85.03935 moveto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+newpath 85.03935 170.0787 moveto
+85.03935 154.42363 97.73073 141.73225 113.3858 141.73225 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 85.03935 113.3858 moveto
+85.03935 129.04088 72.34798 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+85.03935 170.0787 lineto
+85.03935 154.42363 97.73073 141.73225 113.3858 141.73225 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 85.03935 113.3858 moveto
+85.03935 129.04088 72.34798 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+newpath 113.3858 28.34645 moveto
+129.04088 28.34645 141.73225 41.03783 141.73225 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 28.34645 moveto
+129.04088 28.34645 141.73225 41.03783 141.73225 56.6929 curveto
+170.0787 56.6929 lineto
+170.0787 28.34645 lineto
+154.42363 28.34645 141.73225 15.65508 141.73225 0 curveto
+113.3858 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 28.34645 moveto
+154.42363 28.34645 141.73225 15.65508 141.73225 0 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 85.03935 moveto
+129.04088 85.03935 141.73225 97.73073 141.73225 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 85.03935 moveto
+129.04088 85.03935 141.73225 97.73073 141.73225 113.3858 curveto
+170.0787 113.3858 lineto
+170.0787 85.03935 lineto
+154.42363 85.03935 141.73225 72.34798 141.73225 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 170.0787 85.03935 moveto
+154.42363 85.03935 141.73225 72.34798 141.73225 56.6929 curveto
+170.0787 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 113.3858 141.73225 moveto
+129.04088 141.73225 141.73225 154.42363 141.73225 170.0787 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 113.3858 141.73225 moveto
+129.04088 141.73225 141.73225 154.42363 141.73225 170.0787 curveto
+170.0787 170.0787 lineto
+170.0787 141.73225 lineto
+154.42363 141.73225 141.73225 129.04088 141.73225 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 141.73225 moveto
+154.42363 141.73225 141.73225 129.04088 141.73225 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+newpath 198.42516 56.6929 moveto
+198.42516 41.03783 211.11653 28.34645 226.7716 28.34645 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 0 moveto
+198.42516 15.65508 185.73378 28.34645 170.0787 28.34645 curveto
+170.0787 56.6929 lineto
+198.42516 56.6929 lineto
+198.42516 41.03783 211.11653 28.34645 226.7716 28.34645 curveto
+226.7716 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 198.42516 0 moveto
+198.42516 15.65508 185.73378 28.34645 170.0787 28.34645 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 113.3858 moveto
+198.42516 97.73073 211.11653 85.03935 226.7716 85.03935 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 198.42516 56.6929 moveto
+198.42516 72.34798 185.73378 85.03935 170.0787 85.03935 curveto
+170.0787 113.3858 lineto
+198.42516 113.3858 lineto
+198.42516 97.73073 211.11653 85.03935 226.7716 85.03935 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 198.42516 56.6929 moveto
+198.42516 72.34798 185.73378 85.03935 170.0787 85.03935 curveto
+170.0787 56.6929 lineto
+ closepath fill
+newpath 170.0787 141.73225 moveto
+185.73378 141.73225 198.42516 154.42363 198.42516 170.0787 curveto
+170.0787 170.0787 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 170.0787 141.73225 moveto
+185.73378 141.73225 198.42516 154.42363 198.42516 170.0787 curveto
+226.7716 170.0787 lineto
+226.7716 141.73225 lineto
+211.11653 141.73225 198.42516 129.04088 198.42516 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 141.73225 moveto
+211.11653 141.73225 198.42516 129.04088 198.42516 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 226.7716 28.34645 moveto
+242.42668 28.34645 255.11806 41.03783 255.11806 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 28.34645 moveto
+242.42668 28.34645 255.11806 41.03783 255.11806 56.6929 curveto
+283.46451 56.6929 lineto
+283.46451 28.34645 lineto
+267.80943 28.34645 255.11806 15.65508 255.11806 0 curveto
+226.7716 0 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 283.46451 28.34645 moveto
+267.80943 28.34645 255.11806 15.65508 255.11806 0 curveto
+283.46451 0 lineto
+ closepath fill
+newpath 255.11806 113.3858 moveto
+255.11806 97.73073 267.80943 85.03935 283.46451 85.03935 curveto
+283.46451 113.3858 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 255.11806 56.6929 moveto
+255.11806 72.34798 242.42668 85.03935 226.7716 85.03935 curveto
+226.7716 113.3858 lineto
+255.11806 113.3858 lineto
+255.11806 97.73073 267.80943 85.03935 283.46451 85.03935 curveto
+283.46451 56.6929 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 255.11806 56.6929 moveto
+255.11806 72.34798 242.42668 85.03935 226.7716 85.03935 curveto
+226.7716 56.6929 lineto
+ closepath fill
+newpath 226.7716 141.73225 moveto
+242.42668 141.73225 255.11806 154.42363 255.11806 170.0787 curveto
+226.7716 170.0787 lineto
+ closepath fill
+ 0 0 1 setrgbcolor
+newpath 226.7716 141.73225 moveto
+242.42668 141.73225 255.11806 154.42363 255.11806 170.0787 curveto
+283.46451 170.0787 lineto
+283.46451 141.73225 lineto
+267.80943 141.73225 255.11806 129.04088 255.11806 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 1 0 0 setrgbcolor
+newpath 283.46451 141.73225 moveto
+267.80943 141.73225 255.11806 129.04088 255.11806 113.3858 curveto
+283.46451 113.3858 lineto
+ closepath fill
+showpage
+%%EndDocument
+ @endspecial 933 4390 a @beginspecial -3 @llx -3 @lly
+117 @urx 173 @ury 1200 @rwi @setspecial
+%%BeginDocument: example.3
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 171.49603 lineto
+114.80313 171.49603 lineto
+114.80313 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 56.6929 0 moveto
+56.6929 170.0787 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 56.6929 moveto
+113.3858 56.6929 lineto stroke
+newpath 0 113.3858 moveto
+113.3858 113.3858 lineto stroke
+ 1 setgray
+newpath 28.34645 56.6929 moveto
+28.34645 41.03783 41.03783 28.34645 56.6929 28.34645 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 setgray
+newpath 28.34645 0 moveto
+28.34645 15.65508 15.65508 28.34645 0 28.34645 curveto
+0 56.6929 lineto
+28.34645 56.6929 lineto
+28.34645 41.03783 41.03783 28.34645 56.6929 28.34645 curveto
+56.6929 0 lineto
+ closepath fill
+ 1 setgray
+newpath 28.34645 0 moveto
+28.34645 15.65508 15.65508 28.34645 0 28.34645 curveto
+0 0 lineto
+ closepath fill
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 setgray
+newpath 0 85.03935 moveto
+15.65508 85.03935 28.34645 97.73073 28.34645 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 85.03935 lineto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 85.03935 moveto
+41.03783 85.03935 28.34645 72.34798 28.34645 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+newpath 28.34645 170.0787 moveto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 0 setgray
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 170.0787 lineto
+28.34645 170.0787 lineto
+28.34645 154.42363 41.03783 141.73225 56.6929 141.73225 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 28.34645 113.3858 moveto
+28.34645 129.04088 15.65508 141.73225 0 141.73225 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 setgray
+newpath 85.03935 56.6929 moveto
+85.03935 41.03783 97.73073 28.34645 113.3858 28.34645 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 85.03935 0 moveto
+85.03935 15.65508 72.34798 28.34645 56.6929 28.34645 curveto
+56.6929 56.6929 lineto
+85.03935 56.6929 lineto
+85.03935 41.03783 97.73073 28.34645 113.3858 28.34645 curveto
+113.3858 0 lineto
+ closepath fill
+ 0 setgray
+newpath 85.03935 0 moveto
+85.03935 15.65508 72.34798 28.34645 56.6929 28.34645 curveto
+56.6929 0 lineto
+ closepath fill
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 85.03935 moveto
+72.34798 85.03935 85.03935 97.73073 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+113.3858 85.03935 lineto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 setgray
+newpath 113.3858 85.03935 moveto
+97.73073 85.03935 85.03935 72.34798 85.03935 56.6929 curveto
+113.3858 56.6929 lineto
+ closepath fill
+ 1 setgray
+newpath 56.6929 141.73225 moveto
+72.34798 141.73225 85.03935 154.42363 85.03935 170.0787 curveto
+56.6929 170.0787 lineto
+ closepath fill
+ 0 setgray
+newpath 56.6929 141.73225 moveto
+72.34798 141.73225 85.03935 154.42363 85.03935 170.0787 curveto
+113.3858 170.0787 lineto
+113.3858 141.73225 lineto
+97.73073 141.73225 85.03935 129.04088 85.03935 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 1 setgray
+newpath 113.3858 141.73225 moveto
+97.73073 141.73225 85.03935 129.04088 85.03935 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+showpage
+%%EndDocument
+ @endspecial 1028 w @beginspecial -3 @llx -3 @lly 117
+@urx 117 @ury 1200 @rwi @setspecial
+%%BeginDocument: example.4
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 114.80313 lineto
+114.80313 114.80313 lineto
+114.80313 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 113.3858 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 113.3858 lineto stroke
+newpath 85.03935 0 moveto
+85.03935 113.3858 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+113.3858 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+113.3858 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+113.3858 85.03935 lineto stroke
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 28.34647 moveto
+14.17323 20.51892 20.5189 14.17323 28.34645 14.17323 curveto
+28.34645 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 28.34645 lineto
+14.17323 28.34645 lineto
+14.17323 20.5189 20.51892 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 0 lineto
+ closepath fill
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+28.34645 56.6929 lineto
+28.34645 42.51968 lineto
+20.5189 42.51968 14.17323 36.174 14.17323 28.34645 curveto
+0 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto
+28.34647 28.34647 lineto
+ closepath fill
+newpath 14.17323 85.03937 moveto
+14.17323 77.21182 20.5189 70.86613 28.34645 70.86613 curveto
+28.34645 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 56.6929 moveto
+14.17323 64.52045 7.82756 70.86613 0.00002 70.86613 curveto
+0.00002 85.03935 lineto
+14.17323 85.03935 lineto
+14.17323 77.2118 20.51892 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 56.6929 moveto
+14.17323 64.52045 7.82756 70.86613 0.00002 70.86613 curveto
+0.00002 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 113.38582 moveto
+14.17323 105.55827 20.5189 99.21259 28.34645 99.21259 curveto
+28.34645 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 85.03935 moveto
+14.17323 92.8669 7.82756 99.21259 0.00002 99.21259 curveto
+0.00002 113.3858 lineto
+14.17323 113.3858 lineto
+14.17323 105.55826 20.51892 99.21259 28.34647 99.21259 curveto
+28.34647 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 85.03935 moveto
+14.17323 92.8669 7.82756 99.21259 0.00002 99.21259 curveto
+0.00002 85.03935 lineto
+ closepath fill
+newpath 42.51968 28.34647 moveto
+42.51968 20.51892 48.86536 14.17323 56.6929 14.17323 curveto
+56.6929 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 28.34645 lineto
+42.51968 28.34645 lineto
+42.51968 20.5189 48.86537 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.69292 moveto
+42.51968 48.86537 48.86536 42.51968 56.6929 42.51968 curveto
+56.6929 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 56.6929 lineto
+42.51968 56.6929 lineto
+42.51968 48.86536 48.86537 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto
+56.6929 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 85.03935 lineto
+42.51968 85.03935 lineto
+42.51968 77.2118 48.86537 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto
+28.34645 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34645 99.21259 moveto
+36.174 99.21259 42.51968 105.55826 42.51968 113.3858 curveto
+56.6929 113.3858 lineto
+56.6929 99.21259 lineto
+48.86536 99.21259 42.51968 92.8669 42.51968 85.03935 curveto
+28.34645 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.69292 99.21259 moveto
+48.86537 99.21259 42.51968 92.86691 42.51968 85.03937 curveto
+56.69292 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 28.34647 moveto
+70.86613 20.51892 77.2118 14.17323 85.03935 14.17323 curveto
+85.03935 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 0 moveto
+70.86613 7.82755 64.52046 14.17323 56.69292 14.17323 curveto
+56.69292 28.34645 lineto
+70.86613 28.34645 lineto
+70.86613 20.5189 77.21182 14.17323 85.03937 14.17323 curveto
+85.03937 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 0 moveto
+70.86613 7.82755 64.52046 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 42.51968 moveto
+64.52045 42.51968 70.86613 48.86536 70.86613 56.6929 curveto
+85.03935 56.6929 lineto
+85.03935 42.51968 lineto
+77.2118 42.51968 70.86613 36.174 70.86613 28.34645 curveto
+56.6929 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 42.51968 moveto
+77.21182 42.51968 70.86613 36.17401 70.86613 28.34647 curveto
+85.03937 28.34647 lineto
+ closepath fill
+newpath 70.86613 85.03937 moveto
+70.86613 77.21182 77.2118 70.86613 85.03935 70.86613 curveto
+85.03935 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 56.6929 moveto
+70.86613 64.52045 64.52046 70.86613 56.69292 70.86613 curveto
+56.69292 85.03935 lineto
+70.86613 85.03935 lineto
+70.86613 77.2118 77.21182 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 56.6929 moveto
+70.86613 64.52045 64.52046 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 113.38582 moveto
+70.86613 105.55827 77.2118 99.21259 85.03935 99.21259 curveto
+85.03935 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto
+56.69292 113.3858 lineto
+70.86613 113.3858 lineto
+70.86613 105.55826 77.21182 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 85.03935 moveto
+70.86613 92.8669 64.52046 99.21259 56.69292 99.21259 curveto
+56.69292 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+113.3858 28.34645 lineto
+113.3858 14.17323 lineto
+105.55826 14.17323 99.21259 7.82755 99.21259 0 curveto
+85.03935 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 14.17323 moveto
+105.55827 14.17323 99.21259 7.82756 99.21259 0.00002 curveto
+113.38582 0.00002 lineto
+ closepath fill
+newpath 99.21259 56.69292 moveto
+99.21259 48.86537 105.55826 42.51968 113.3858 42.51968 curveto
+113.3858 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 28.34645 moveto
+99.21259 36.174 92.86691 42.51968 85.03937 42.51968 curveto
+85.03937 56.6929 lineto
+99.21259 56.6929 lineto
+99.21259 48.86536 105.55827 42.51968 113.38582 42.51968 curveto
+113.38582 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 28.34645 moveto
+99.21259 36.174 92.86691 42.51968 85.03937 42.51968 curveto
+85.03937 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03937 moveto
+99.21259 77.21182 105.55826 70.86613 113.3858 70.86613 curveto
+113.3858 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 85.03935 lineto
+99.21259 85.03935 lineto
+99.21259 77.2118 105.55827 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.38582 moveto
+99.21259 105.55827 105.55826 99.21259 113.3858 99.21259 curveto
+113.3858 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 113.3858 lineto
+99.21259 113.3858 lineto
+99.21259 105.55826 105.55827 99.21259 113.38582 99.21259 curveto
+113.38582 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+showpage
+%%EndDocument
+ @endspecial 1926 5255 a Fa(1)p eop
+%%Page: 2 2
+2 1 bop 739 2857 a @beginspecial -3 @llx -3 @lly 287
+@urx 287 @ury 2900 @rwi @setspecial
+%%BeginDocument: example.5
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -1.41733 -1.41733 moveto
+-1.41733 284.88184 lineto
+284.88184 284.88184 lineto
+284.88184 -1.41733 lineto
+ closepath stroke
+ 2.83466 0 dtransform exch truncate exch idtransform pop setlinewidth
+ 1 setlinecap
+newpath 28.34645 0 moveto
+28.34645 283.46451 lineto stroke
+newpath 56.6929 0 moveto
+56.6929 283.46451 lineto stroke
+newpath 85.03935 0 moveto
+85.03935 283.46451 lineto stroke
+newpath 113.3858 0 moveto
+113.3858 283.46451 lineto stroke
+newpath 141.73225 0 moveto
+141.73225 283.46451 lineto stroke
+newpath 170.0787 0 moveto
+170.0787 283.46451 lineto stroke
+newpath 198.42516 0 moveto
+198.42516 283.46451 lineto stroke
+newpath 226.7716 0 moveto
+226.7716 283.46451 lineto stroke
+newpath 255.11806 0 moveto
+255.11806 283.46451 lineto stroke
+ 0 2.83466 dtransform truncate idtransform setlinewidth pop
+newpath 0 28.34645 moveto
+283.46451 28.34645 lineto stroke
+newpath 0 56.6929 moveto
+283.46451 56.6929 lineto stroke
+newpath 0 85.03935 moveto
+283.46451 85.03935 lineto stroke
+newpath 0 113.3858 moveto
+283.46451 113.3858 lineto stroke
+newpath 0 141.73225 moveto
+283.46451 141.73225 lineto stroke
+newpath 0 170.0787 moveto
+283.46451 170.0787 lineto stroke
+newpath 0 198.42516 moveto
+283.46451 198.42516 lineto stroke
+newpath 0 226.7716 moveto
+283.46451 226.7716 lineto stroke
+newpath 0 255.11806 moveto
+283.46451 255.11806 lineto stroke
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 28.34647 moveto
+14.17323 20.51892 20.5189 14.17323 28.34645 14.17323 curveto
+28.34645 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 28.34645 lineto
+14.17323 28.34645 lineto
+14.17323 20.5189 20.51892 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 0 moveto
+14.17323 7.82755 7.82756 14.17323 0.00002 14.17323 curveto
+0.00002 0 lineto
+ closepath fill
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 42.51968 moveto
+7.82755 42.51968 14.17323 48.86536 14.17323 56.6929 curveto
+28.34645 56.6929 lineto
+28.34645 42.51968 lineto
+20.5189 42.51968 14.17323 36.174 14.17323 28.34645 curveto
+0 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 42.51968 moveto
+20.51892 42.51968 14.17323 36.17401 14.17323 28.34647 curveto
+28.34647 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 70.86613 moveto
+7.82755 70.86613 14.17323 77.2118 14.17323 85.03935 curveto
+28.34645 85.03935 lineto
+28.34645 70.86613 lineto
+20.5189 70.86613 14.17323 64.52045 14.17323 56.6929 curveto
+0 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 70.86613 moveto
+20.51892 70.86613 14.17323 64.52046 14.17323 56.69292 curveto
+28.34647 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 99.21259 moveto
+7.82755 99.21259 14.17323 105.55826 14.17323 113.3858 curveto
+28.34645 113.3858 lineto
+28.34645 99.21259 lineto
+20.5189 99.21259 14.17323 92.8669 14.17323 85.03935 curveto
+0 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34647 99.21259 moveto
+20.51892 99.21259 14.17323 92.86691 14.17323 85.03937 curveto
+28.34647 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+0 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 127.55904 moveto
+7.82755 127.55904 14.17323 133.90471 14.17323 141.73225 curveto
+28.34645 141.73225 lineto
+28.34645 127.55904 lineto
+20.5189 127.55904 14.17323 121.21335 14.17323 113.3858 curveto
+0 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 127.55904 moveto
+20.51892 127.55904 14.17323 121.21336 14.17323 113.38582 curveto
+28.34647 113.38582 lineto
+ closepath fill
+newpath 14.17323 170.07872 moveto
+14.17323 162.25117 20.5189 155.90549 28.34645 155.90549 curveto
+28.34645 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 170.0787 lineto
+14.17323 170.0787 lineto
+14.17323 162.25116 20.51892 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 141.73225 moveto
+14.17323 149.5598 7.82756 155.90549 0.00002 155.90549 curveto
+0.00002 141.73225 lineto
+ closepath fill
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+0 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 0 184.25194 moveto
+7.82755 184.25194 14.17323 190.59761 14.17323 198.42516 curveto
+28.34645 198.42516 lineto
+28.34645 184.25194 lineto
+20.5189 184.25194 14.17323 177.90625 14.17323 170.0787 curveto
+0 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34647 184.25194 moveto
+20.51892 184.25194 14.17323 177.90627 14.17323 170.07872 curveto
+28.34647 170.07872 lineto
+ closepath fill
+newpath 14.17323 226.77162 moveto
+14.17323 218.94408 20.5189 212.59839 28.34645 212.59839 curveto
+28.34645 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 226.7716 lineto
+14.17323 226.7716 lineto
+14.17323 218.94406 20.51892 212.59839 28.34647 212.59839 curveto
+28.34647 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 198.42516 moveto
+14.17323 206.2527 7.82756 212.59839 0.00002 212.59839 curveto
+0.00002 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11807 moveto
+14.17323 247.29053 20.5189 240.94484 28.34645 240.94484 curveto
+28.34645 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 255.11806 lineto
+14.17323 255.11806 lineto
+14.17323 247.29051 20.51892 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 226.7716 moveto
+14.17323 234.59915 7.82756 240.94484 0.00002 240.94484 curveto
+0.00002 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 283.46452 moveto
+14.17323 275.63698 20.5189 269.29129 28.34645 269.29129 curveto
+28.34645 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 283.46451 lineto
+14.17323 283.46451 lineto
+14.17323 275.63696 20.51892 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 14.17323 255.11806 moveto
+14.17323 262.9456 7.82756 269.29129 0.00002 269.29129 curveto
+0.00002 255.11806 lineto
+ closepath fill
+newpath 42.51968 28.34647 moveto
+42.51968 20.51892 48.86536 14.17323 56.6929 14.17323 curveto
+56.6929 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 28.34645 lineto
+42.51968 28.34645 lineto
+42.51968 20.5189 48.86537 14.17323 56.69292 14.17323 curveto
+56.69292 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 0 moveto
+42.51968 7.82755 36.17401 14.17323 28.34647 14.17323 curveto
+28.34647 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.69292 moveto
+42.51968 48.86537 48.86536 42.51968 56.6929 42.51968 curveto
+56.6929 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 56.6929 lineto
+42.51968 56.6929 lineto
+42.51968 48.86536 48.86537 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 28.34645 moveto
+42.51968 36.174 36.17401 42.51968 28.34647 42.51968 curveto
+28.34647 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03937 moveto
+42.51968 77.21182 48.86536 70.86613 56.6929 70.86613 curveto
+56.6929 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 85.03935 lineto
+42.51968 85.03935 lineto
+42.51968 77.2118 48.86537 70.86613 56.69292 70.86613 curveto
+56.69292 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 56.6929 moveto
+42.51968 64.52045 36.17401 70.86613 28.34647 70.86613 curveto
+28.34647 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 113.38582 moveto
+42.51968 105.55827 48.86536 99.21259 56.6929 99.21259 curveto
+56.6929 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 113.3858 lineto
+42.51968 113.3858 lineto
+42.51968 105.55826 48.86537 99.21259 56.69292 99.21259 curveto
+56.69292 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 85.03935 moveto
+42.51968 92.8669 36.17401 99.21259 28.34647 99.21259 curveto
+28.34647 85.03935 lineto
+ closepath fill
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+28.34645 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 127.55904 moveto
+36.174 127.55904 42.51968 133.90471 42.51968 141.73225 curveto
+56.6929 141.73225 lineto
+56.6929 127.55904 lineto
+48.86536 127.55904 42.51968 121.21335 42.51968 113.3858 curveto
+28.34645 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 127.55904 moveto
+48.86537 127.55904 42.51968 121.21336 42.51968 113.38582 curveto
+56.69292 113.38582 lineto
+ closepath fill
+newpath 42.51968 170.07872 moveto
+42.51968 162.25117 48.86536 155.90549 56.6929 155.90549 curveto
+56.6929 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 170.0787 lineto
+42.51968 170.0787 lineto
+42.51968 162.25116 48.86537 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 141.73225 moveto
+42.51968 149.5598 36.17401 155.90549 28.34647 155.90549 curveto
+28.34647 141.73225 lineto
+ closepath fill
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 184.25194 moveto
+36.174 184.25194 42.51968 190.59761 42.51968 198.42516 curveto
+56.6929 198.42516 lineto
+56.6929 184.25194 lineto
+48.86536 184.25194 42.51968 177.90625 42.51968 170.0787 curveto
+28.34645 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.69292 184.25194 moveto
+48.86537 184.25194 42.51968 177.90627 42.51968 170.07872 curveto
+56.69292 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+28.34645 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 28.34645 212.59839 moveto
+36.174 212.59839 42.51968 218.94406 42.51968 226.7716 curveto
+56.6929 226.7716 lineto
+56.6929 212.59839 lineto
+48.86536 212.59839 42.51968 206.2527 42.51968 198.42516 curveto
+28.34645 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.69292 212.59839 moveto
+48.86537 212.59839 42.51968 206.25272 42.51968 198.42517 curveto
+56.69292 198.42517 lineto
+ closepath fill
+newpath 42.51968 255.11807 moveto
+42.51968 247.29053 48.86536 240.94484 56.6929 240.94484 curveto
+56.6929 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 255.11806 lineto
+42.51968 255.11806 lineto
+42.51968 247.29051 48.86537 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 226.7716 moveto
+42.51968 234.59915 36.17401 240.94484 28.34647 240.94484 curveto
+28.34647 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 283.46452 moveto
+42.51968 275.63698 48.86536 269.29129 56.6929 269.29129 curveto
+56.6929 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 283.46451 lineto
+42.51968 283.46451 lineto
+42.51968 275.63696 48.86537 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 42.51968 255.11806 moveto
+42.51968 262.9456 36.17401 269.29129 28.34647 269.29129 curveto
+28.34647 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+56.6929 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 14.17323 moveto
+64.52045 14.17323 70.86613 20.5189 70.86613 28.34645 curveto
+85.03935 28.34645 lineto
+85.03935 14.17323 lineto
+77.2118 14.17323 70.86613 7.82755 70.86613 0 curveto
+56.6929 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 14.17323 moveto
+77.21182 14.17323 70.86613 7.82756 70.86613 0.00002 curveto
+85.03937 0.00002 lineto
+ closepath fill
+newpath 70.86613 56.69292 moveto
+70.86613 48.86537 77.2118 42.51968 85.03935 42.51968 curveto
+85.03935 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 56.6929 lineto
+70.86613 56.6929 lineto
+70.86613 48.86536 77.21182 42.51968 85.03937 42.51968 curveto
+85.03937 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 28.34645 moveto
+70.86613 36.174 64.52046 42.51968 56.69292 42.51968 curveto
+56.69292 28.34645 lineto
+ closepath fill
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 70.86613 moveto
+64.52045 70.86613 70.86613 77.2118 70.86613 85.03935 curveto
+85.03935 85.03935 lineto
+85.03935 70.86613 lineto
+77.2118 70.86613 70.86613 64.52045 70.86613 56.6929 curveto
+56.6929 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03937 70.86613 moveto
+77.21182 70.86613 70.86613 64.52046 70.86613 56.69292 curveto
+85.03937 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+56.6929 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 99.21259 moveto
+64.52045 99.21259 70.86613 105.55826 70.86613 113.3858 curveto
+85.03935 113.3858 lineto
+85.03935 99.21259 lineto
+77.2118 99.21259 70.86613 92.8669 70.86613 85.03935 curveto
+56.6929 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 99.21259 moveto
+77.21182 99.21259 70.86613 92.86691 70.86613 85.03937 curveto
+85.03937 85.03937 lineto
+ closepath fill
+newpath 70.86613 141.73227 moveto
+70.86613 133.90472 77.2118 127.55904 85.03935 127.55904 curveto
+85.03935 141.73227 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 141.73225 lineto
+70.86613 141.73225 lineto
+70.86613 133.90471 77.21182 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 113.3858 moveto
+70.86613 121.21335 64.52046 127.55904 56.69292 127.55904 curveto
+56.69292 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.07872 moveto
+70.86613 162.25117 77.2118 155.90549 85.03935 155.90549 curveto
+85.03935 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 170.0787 lineto
+70.86613 170.0787 lineto
+70.86613 162.25116 77.21182 155.90549 85.03937 155.90549 curveto
+85.03937 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 141.73225 moveto
+70.86613 149.5598 64.52046 155.90549 56.69292 155.90549 curveto
+56.69292 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 198.42517 moveto
+70.86613 190.59763 77.2118 184.25194 85.03935 184.25194 curveto
+85.03935 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 198.42516 lineto
+70.86613 198.42516 lineto
+70.86613 190.59761 77.21182 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 170.0787 moveto
+70.86613 177.90625 64.52046 184.25194 56.69292 184.25194 curveto
+56.69292 170.0787 lineto
+ closepath fill
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+56.6929 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 56.6929 212.59839 moveto
+64.52045 212.59839 70.86613 218.94406 70.86613 226.7716 curveto
+85.03935 226.7716 lineto
+85.03935 212.59839 lineto
+77.2118 212.59839 70.86613 206.2527 70.86613 198.42516 curveto
+56.6929 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03937 212.59839 moveto
+77.21182 212.59839 70.86613 206.25272 70.86613 198.42517 curveto
+85.03937 198.42517 lineto
+ closepath fill
+newpath 70.86613 255.11807 moveto
+70.86613 247.29053 77.2118 240.94484 85.03935 240.94484 curveto
+85.03935 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 255.11806 lineto
+70.86613 255.11806 lineto
+70.86613 247.29051 77.21182 240.94484 85.03937 240.94484 curveto
+85.03937 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 226.7716 moveto
+70.86613 234.59915 64.52046 240.94484 56.69292 240.94484 curveto
+56.69292 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 283.46452 moveto
+70.86613 275.63698 77.2118 269.29129 85.03935 269.29129 curveto
+85.03935 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 283.46451 lineto
+70.86613 283.46451 lineto
+70.86613 275.63696 77.21182 269.29129 85.03937 269.29129 curveto
+85.03937 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 70.86613 255.11806 moveto
+70.86613 262.9456 64.52046 269.29129 56.69292 269.29129 curveto
+56.69292 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 14.17323 moveto
+92.8669 14.17323 99.21259 20.5189 99.21259 28.34645 curveto
+113.3858 28.34645 lineto
+113.3858 14.17323 lineto
+105.55826 14.17323 99.21259 7.82755 99.21259 0 curveto
+85.03935 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 14.17323 moveto
+105.55827 14.17323 99.21259 7.82756 99.21259 0.00002 curveto
+113.38582 0.00002 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+85.03935 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 42.51968 moveto
+92.8669 42.51968 99.21259 48.86536 99.21259 56.6929 curveto
+113.3858 56.6929 lineto
+113.3858 42.51968 lineto
+105.55826 42.51968 99.21259 36.174 99.21259 28.34645 curveto
+85.03935 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 42.51968 moveto
+105.55827 42.51968 99.21259 36.17401 99.21259 28.34647 curveto
+113.38582 28.34647 lineto
+ closepath fill
+newpath 99.21259 85.03937 moveto
+99.21259 77.21182 105.55826 70.86613 113.3858 70.86613 curveto
+113.3858 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 85.03935 lineto
+99.21259 85.03935 lineto
+99.21259 77.2118 105.55827 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 56.6929 moveto
+99.21259 64.52045 92.86691 70.86613 85.03937 70.86613 curveto
+85.03937 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.38582 moveto
+99.21259 105.55827 105.55826 99.21259 113.3858 99.21259 curveto
+113.3858 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 113.3858 lineto
+99.21259 113.3858 lineto
+99.21259 105.55826 105.55827 99.21259 113.38582 99.21259 curveto
+113.38582 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 85.03935 moveto
+99.21259 92.8669 92.86691 99.21259 85.03937 99.21259 curveto
+85.03937 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 141.73227 moveto
+99.21259 133.90472 105.55826 127.55904 113.3858 127.55904 curveto
+113.3858 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 141.73225 lineto
+99.21259 141.73225 lineto
+99.21259 133.90471 105.55827 127.55904 113.38582 127.55904 curveto
+113.38582 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 113.3858 moveto
+99.21259 121.21335 92.86691 127.55904 85.03937 127.55904 curveto
+85.03937 113.3858 lineto
+ closepath fill
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+85.03935 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 155.90549 moveto
+92.8669 155.90549 99.21259 162.25116 99.21259 170.0787 curveto
+113.3858 170.0787 lineto
+113.3858 155.90549 lineto
+105.55826 155.90549 99.21259 149.5598 99.21259 141.73225 curveto
+85.03935 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 155.90549 moveto
+105.55827 155.90549 99.21259 149.55981 99.21259 141.73227 curveto
+113.38582 141.73227 lineto
+ closepath fill
+newpath 99.21259 198.42517 moveto
+99.21259 190.59763 105.55826 184.25194 113.3858 184.25194 curveto
+113.3858 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 198.42516 lineto
+99.21259 198.42516 lineto
+99.21259 190.59761 105.55827 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 170.0787 moveto
+99.21259 177.90625 92.86691 184.25194 85.03937 184.25194 curveto
+85.03937 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 226.77162 moveto
+99.21259 218.94408 105.55826 212.59839 113.3858 212.59839 curveto
+113.3858 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 226.7716 lineto
+99.21259 226.7716 lineto
+99.21259 218.94406 105.55827 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 99.21259 198.42516 moveto
+99.21259 206.2527 92.86691 212.59839 85.03937 212.59839 curveto
+85.03937 198.42516 lineto
+ closepath fill
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 240.94484 moveto
+92.8669 240.94484 99.21259 247.29051 99.21259 255.11806 curveto
+113.3858 255.11806 lineto
+113.3858 240.94484 lineto
+105.55826 240.94484 99.21259 234.59915 99.21259 226.7716 curveto
+85.03935 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.38582 240.94484 moveto
+105.55827 240.94484 99.21259 234.59917 99.21259 226.77162 curveto
+113.38582 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+85.03935 283.46451 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 85.03935 269.29129 moveto
+92.8669 269.29129 99.21259 275.63696 99.21259 283.46451 curveto
+113.3858 283.46451 lineto
+113.3858 269.29129 lineto
+105.55826 269.29129 99.21259 262.9456 99.21259 255.11806 curveto
+85.03935 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.38582 269.29129 moveto
+105.55827 269.29129 99.21259 262.94562 99.21259 255.11807 curveto
+113.38582 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34647 moveto
+127.55904 20.51892 133.90471 14.17323 141.73225 14.17323 curveto
+141.73225 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 28.34645 lineto
+127.55904 28.34645 lineto
+127.55904 20.5189 133.90472 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 0 moveto
+127.55904 7.82755 121.21336 14.17323 113.38582 14.17323 curveto
+113.38582 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.69292 moveto
+127.55904 48.86537 133.90471 42.51968 141.73225 42.51968 curveto
+141.73225 56.69292 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 56.6929 lineto
+127.55904 56.6929 lineto
+127.55904 48.86536 133.90472 42.51968 141.73227 42.51968 curveto
+141.73227 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 28.34645 moveto
+127.55904 36.174 121.21336 42.51968 113.38582 42.51968 curveto
+113.38582 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 85.03937 moveto
+127.55904 77.21182 133.90471 70.86613 141.73225 70.86613 curveto
+141.73225 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 85.03935 lineto
+127.55904 85.03935 lineto
+127.55904 77.2118 133.90472 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 56.6929 moveto
+127.55904 64.52045 121.21336 70.86613 113.38582 70.86613 curveto
+113.38582 56.6929 lineto
+ closepath fill
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 99.21259 moveto
+121.21335 99.21259 127.55904 105.55826 127.55904 113.3858 curveto
+141.73225 113.3858 lineto
+141.73225 99.21259 lineto
+133.90471 99.21259 127.55904 92.8669 127.55904 85.03935 curveto
+113.3858 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 99.21259 moveto
+133.90472 99.21259 127.55904 92.86691 127.55904 85.03937 curveto
+141.73227 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 127.55904 moveto
+121.21335 127.55904 127.55904 133.90471 127.55904 141.73225 curveto
+141.73225 141.73225 lineto
+141.73225 127.55904 lineto
+133.90471 127.55904 127.55904 121.21335 127.55904 113.3858 curveto
+113.3858 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 127.55904 moveto
+133.90472 127.55904 127.55904 121.21336 127.55904 113.38582 curveto
+141.73227 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+113.3858 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 113.3858 155.90549 moveto
+121.21335 155.90549 127.55904 162.25116 127.55904 170.0787 curveto
+141.73225 170.0787 lineto
+141.73225 155.90549 lineto
+133.90471 155.90549 127.55904 149.5598 127.55904 141.73225 curveto
+113.3858 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73227 155.90549 moveto
+133.90472 155.90549 127.55904 149.55981 127.55904 141.73227 curveto
+141.73227 141.73227 lineto
+ closepath fill
+newpath 127.55904 198.42517 moveto
+127.55904 190.59763 133.90471 184.25194 141.73225 184.25194 curveto
+141.73225 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 198.42516 lineto
+127.55904 198.42516 lineto
+127.55904 190.59761 133.90472 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 170.0787 moveto
+127.55904 177.90625 121.21336 184.25194 113.38582 184.25194 curveto
+113.38582 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 226.77162 moveto
+127.55904 218.94408 133.90471 212.59839 141.73225 212.59839 curveto
+141.73225 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 226.7716 lineto
+127.55904 226.7716 lineto
+127.55904 218.94406 133.90472 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 198.42516 moveto
+127.55904 206.2527 121.21336 212.59839 113.38582 212.59839 curveto
+113.38582 198.42516 lineto
+ closepath fill
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+113.3858 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 113.3858 240.94484 moveto
+121.21335 240.94484 127.55904 247.29051 127.55904 255.11806 curveto
+141.73225 255.11806 lineto
+141.73225 240.94484 lineto
+133.90471 240.94484 127.55904 234.59915 127.55904 226.7716 curveto
+113.3858 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 141.73227 240.94484 moveto
+133.90472 240.94484 127.55904 234.59917 127.55904 226.77162 curveto
+141.73227 226.77162 lineto
+ closepath fill
+newpath 127.55904 283.46452 moveto
+127.55904 275.63698 133.90471 269.29129 141.73225 269.29129 curveto
+141.73225 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 283.46451 lineto
+127.55904 283.46451 lineto
+127.55904 275.63696 133.90472 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 127.55904 255.11806 moveto
+127.55904 262.9456 121.21336 269.29129 113.38582 269.29129 curveto
+113.38582 255.11806 lineto
+ closepath fill
+newpath 155.90549 28.34647 moveto
+155.90549 20.51892 162.25116 14.17323 170.0787 14.17323 curveto
+170.0787 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 28.34645 lineto
+155.90549 28.34645 lineto
+155.90549 20.5189 162.25117 14.17323 170.07872 14.17323 curveto
+170.07872 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 0 moveto
+155.90549 7.82755 149.55981 14.17323 141.73227 14.17323 curveto
+141.73227 0 lineto
+ closepath fill
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+141.73225 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 42.51968 moveto
+149.5598 42.51968 155.90549 48.86536 155.90549 56.6929 curveto
+170.0787 56.6929 lineto
+170.0787 42.51968 lineto
+162.25116 42.51968 155.90549 36.174 155.90549 28.34645 curveto
+141.73225 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 42.51968 moveto
+162.25117 42.51968 155.90549 36.17401 155.90549 28.34647 curveto
+170.07872 28.34647 lineto
+ closepath fill
+newpath 155.90549 85.03937 moveto
+155.90549 77.21182 162.25116 70.86613 170.0787 70.86613 curveto
+170.0787 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 85.03935 lineto
+155.90549 85.03935 lineto
+155.90549 77.2118 162.25117 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 56.6929 moveto
+155.90549 64.52045 149.55981 70.86613 141.73227 70.86613 curveto
+141.73227 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.38582 moveto
+155.90549 105.55827 162.25116 99.21259 170.0787 99.21259 curveto
+170.0787 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 113.3858 lineto
+155.90549 113.3858 lineto
+155.90549 105.55826 162.25117 99.21259 170.07872 99.21259 curveto
+170.07872 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 85.03935 moveto
+155.90549 92.8669 149.55981 99.21259 141.73227 99.21259 curveto
+141.73227 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 141.73227 moveto
+155.90549 133.90472 162.25116 127.55904 170.0787 127.55904 curveto
+170.0787 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 141.73225 lineto
+155.90549 141.73225 lineto
+155.90549 133.90471 162.25117 127.55904 170.07872 127.55904 curveto
+170.07872 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 113.3858 moveto
+155.90549 121.21335 149.55981 127.55904 141.73227 127.55904 curveto
+141.73227 113.3858 lineto
+ closepath fill
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+141.73225 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 141.73225 155.90549 moveto
+149.5598 155.90549 155.90549 162.25116 155.90549 170.0787 curveto
+170.0787 170.0787 lineto
+170.0787 155.90549 lineto
+162.25116 155.90549 155.90549 149.5598 155.90549 141.73225 curveto
+141.73225 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.07872 155.90549 moveto
+162.25117 155.90549 155.90549 149.55981 155.90549 141.73227 curveto
+170.07872 141.73227 lineto
+ closepath fill
+newpath 155.90549 198.42517 moveto
+155.90549 190.59763 162.25116 184.25194 170.0787 184.25194 curveto
+170.0787 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 198.42516 lineto
+155.90549 198.42516 lineto
+155.90549 190.59761 162.25117 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 170.0787 moveto
+155.90549 177.90625 149.55981 184.25194 141.73227 184.25194 curveto
+141.73227 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.77162 moveto
+155.90549 218.94408 162.25116 212.59839 170.0787 212.59839 curveto
+170.0787 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 226.7716 lineto
+155.90549 226.7716 lineto
+155.90549 218.94406 162.25117 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 198.42516 moveto
+155.90549 206.2527 149.55981 212.59839 141.73227 212.59839 curveto
+141.73227 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11807 moveto
+155.90549 247.29053 162.25116 240.94484 170.0787 240.94484 curveto
+170.0787 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 255.11806 lineto
+155.90549 255.11806 lineto
+155.90549 247.29051 162.25117 240.94484 170.07872 240.94484 curveto
+170.07872 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 226.7716 moveto
+155.90549 234.59915 149.55981 240.94484 141.73227 240.94484 curveto
+141.73227 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 283.46452 moveto
+155.90549 275.63698 162.25116 269.29129 170.0787 269.29129 curveto
+170.0787 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 283.46451 lineto
+155.90549 283.46451 lineto
+155.90549 275.63696 162.25117 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 155.90549 255.11806 moveto
+155.90549 262.9456 149.55981 269.29129 141.73227 269.29129 curveto
+141.73227 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 14.17323 moveto
+177.90625 14.17323 184.25194 20.5189 184.25194 28.34645 curveto
+198.42516 28.34645 lineto
+198.42516 14.17323 lineto
+190.59761 14.17323 184.25194 7.82755 184.25194 0 curveto
+170.0787 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 14.17323 moveto
+190.59763 14.17323 184.25194 7.82756 184.25194 0.00002 curveto
+198.42517 0.00002 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+170.0787 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 42.51968 moveto
+177.90625 42.51968 184.25194 48.86536 184.25194 56.6929 curveto
+198.42516 56.6929 lineto
+198.42516 42.51968 lineto
+190.59761 42.51968 184.25194 36.174 184.25194 28.34645 curveto
+170.0787 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 42.51968 moveto
+190.59763 42.51968 184.25194 36.17401 184.25194 28.34647 curveto
+198.42517 28.34647 lineto
+ closepath fill
+newpath 184.25194 85.03937 moveto
+184.25194 77.21182 190.59761 70.86613 198.42516 70.86613 curveto
+198.42516 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 85.03935 lineto
+184.25194 85.03935 lineto
+184.25194 77.2118 190.59763 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 56.6929 moveto
+184.25194 64.52045 177.90627 70.86613 170.07872 70.86613 curveto
+170.07872 56.6929 lineto
+ closepath fill
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 99.21259 moveto
+177.90625 99.21259 184.25194 105.55826 184.25194 113.3858 curveto
+198.42516 113.3858 lineto
+198.42516 99.21259 lineto
+190.59761 99.21259 184.25194 92.8669 184.25194 85.03935 curveto
+170.0787 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 99.21259 moveto
+190.59763 99.21259 184.25194 92.86691 184.25194 85.03937 curveto
+198.42517 85.03937 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 127.55904 moveto
+177.90625 127.55904 184.25194 133.90471 184.25194 141.73225 curveto
+198.42516 141.73225 lineto
+198.42516 127.55904 lineto
+190.59761 127.55904 184.25194 121.21335 184.25194 113.3858 curveto
+170.0787 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 127.55904 moveto
+190.59763 127.55904 184.25194 121.21336 184.25194 113.38582 curveto
+198.42517 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+170.0787 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 170.0787 155.90549 moveto
+177.90625 155.90549 184.25194 162.25116 184.25194 170.0787 curveto
+198.42516 170.0787 lineto
+198.42516 155.90549 lineto
+190.59761 155.90549 184.25194 149.5598 184.25194 141.73225 curveto
+170.0787 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42517 155.90549 moveto
+190.59763 155.90549 184.25194 149.55981 184.25194 141.73227 curveto
+198.42517 141.73227 lineto
+ closepath fill
+newpath 184.25194 198.42517 moveto
+184.25194 190.59763 190.59761 184.25194 198.42516 184.25194 curveto
+198.42516 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 198.42516 lineto
+184.25194 198.42516 lineto
+184.25194 190.59761 190.59763 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 170.0787 moveto
+184.25194 177.90625 177.90627 184.25194 170.07872 184.25194 curveto
+170.07872 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 226.77162 moveto
+184.25194 218.94408 190.59761 212.59839 198.42516 212.59839 curveto
+198.42516 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 226.7716 lineto
+184.25194 226.7716 lineto
+184.25194 218.94406 190.59763 212.59839 198.42517 212.59839 curveto
+198.42517 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 198.42516 moveto
+184.25194 206.2527 177.90627 212.59839 170.07872 212.59839 curveto
+170.07872 198.42516 lineto
+ closepath fill
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+170.0787 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 170.0787 240.94484 moveto
+177.90625 240.94484 184.25194 247.29051 184.25194 255.11806 curveto
+198.42516 255.11806 lineto
+198.42516 240.94484 lineto
+190.59761 240.94484 184.25194 234.59915 184.25194 226.7716 curveto
+170.0787 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42517 240.94484 moveto
+190.59763 240.94484 184.25194 234.59917 184.25194 226.77162 curveto
+198.42517 226.77162 lineto
+ closepath fill
+newpath 184.25194 283.46452 moveto
+184.25194 275.63698 190.59761 269.29129 198.42516 269.29129 curveto
+198.42516 283.46452 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 283.46451 lineto
+184.25194 283.46451 lineto
+184.25194 275.63696 190.59763 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 184.25194 255.11806 moveto
+184.25194 262.9456 177.90627 269.29129 170.07872 269.29129 curveto
+170.07872 255.11806 lineto
+ closepath fill
+newpath 212.59839 28.34647 moveto
+212.59839 20.51892 218.94406 14.17323 226.7716 14.17323 curveto
+226.7716 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 28.34645 lineto
+212.59839 28.34645 lineto
+212.59839 20.5189 218.94408 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 0 moveto
+212.59839 7.82755 206.25272 14.17323 198.42517 14.17323 curveto
+198.42517 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.69292 moveto
+212.59839 48.86537 218.94406 42.51968 226.7716 42.51968 curveto
+226.7716 56.69292 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 56.6929 lineto
+212.59839 56.6929 lineto
+212.59839 48.86536 218.94408 42.51968 226.77162 42.51968 curveto
+226.77162 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 28.34645 moveto
+212.59839 36.174 206.25272 42.51968 198.42517 42.51968 curveto
+198.42517 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03937 moveto
+212.59839 77.21182 218.94406 70.86613 226.7716 70.86613 curveto
+226.7716 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 85.03935 lineto
+212.59839 85.03935 lineto
+212.59839 77.2118 218.94408 70.86613 226.77162 70.86613 curveto
+226.77162 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 56.6929 moveto
+212.59839 64.52045 206.25272 70.86613 198.42517 70.86613 curveto
+198.42517 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 113.38582 moveto
+212.59839 105.55827 218.94406 99.21259 226.7716 99.21259 curveto
+226.7716 113.38582 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 113.3858 lineto
+212.59839 113.3858 lineto
+212.59839 105.55826 218.94408 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 85.03935 moveto
+212.59839 92.8669 206.25272 99.21259 198.42517 99.21259 curveto
+198.42517 85.03935 lineto
+ closepath fill
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+198.42516 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 198.42516 127.55904 moveto
+206.2527 127.55904 212.59839 133.90471 212.59839 141.73225 curveto
+226.7716 141.73225 lineto
+226.7716 127.55904 lineto
+218.94406 127.55904 212.59839 121.21335 212.59839 113.3858 curveto
+198.42516 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.77162 127.55904 moveto
+218.94408 127.55904 212.59839 121.21336 212.59839 113.38582 curveto
+226.77162 113.38582 lineto
+ closepath fill
+newpath 212.59839 170.07872 moveto
+212.59839 162.25117 218.94406 155.90549 226.7716 155.90549 curveto
+226.7716 170.07872 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 170.0787 lineto
+212.59839 170.0787 lineto
+212.59839 162.25116 218.94408 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 141.73225 moveto
+212.59839 149.5598 206.25272 155.90549 198.42517 155.90549 curveto
+198.42517 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 198.42517 moveto
+212.59839 190.59763 218.94406 184.25194 226.7716 184.25194 curveto
+226.7716 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 198.42516 lineto
+212.59839 198.42516 lineto
+212.59839 190.59761 218.94408 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 170.0787 moveto
+212.59839 177.90625 206.25272 184.25194 198.42517 184.25194 curveto
+198.42517 170.0787 lineto
+ closepath fill
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+198.42516 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 198.42516 212.59839 moveto
+206.2527 212.59839 212.59839 218.94406 212.59839 226.7716 curveto
+226.7716 226.7716 lineto
+226.7716 212.59839 lineto
+218.94406 212.59839 212.59839 206.2527 212.59839 198.42516 curveto
+198.42516 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.77162 212.59839 moveto
+218.94408 212.59839 212.59839 206.25272 212.59839 198.42517 curveto
+226.77162 198.42517 lineto
+ closepath fill
+newpath 212.59839 255.11807 moveto
+212.59839 247.29053 218.94406 240.94484 226.7716 240.94484 curveto
+226.7716 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 255.11806 lineto
+212.59839 255.11806 lineto
+212.59839 247.29051 218.94408 240.94484 226.77162 240.94484 curveto
+226.77162 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 226.7716 moveto
+212.59839 234.59915 206.25272 240.94484 198.42517 240.94484 curveto
+198.42517 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 283.46452 moveto
+212.59839 275.63698 218.94406 269.29129 226.7716 269.29129 curveto
+226.7716 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 283.46451 lineto
+212.59839 283.46451 lineto
+212.59839 275.63696 218.94408 269.29129 226.77162 269.29129 curveto
+226.77162 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 212.59839 255.11806 moveto
+212.59839 262.9456 206.25272 269.29129 198.42517 269.29129 curveto
+198.42517 255.11806 lineto
+ closepath fill
+newpath 240.94484 28.34647 moveto
+240.94484 20.51892 247.29051 14.17323 255.11806 14.17323 curveto
+255.11806 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 28.34645 lineto
+240.94484 28.34645 lineto
+240.94484 20.5189 247.29053 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 0 moveto
+240.94484 7.82755 234.59917 14.17323 226.77162 14.17323 curveto
+226.77162 0 lineto
+ closepath fill
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 42.51968 moveto
+234.59915 42.51968 240.94484 48.86536 240.94484 56.6929 curveto
+255.11806 56.6929 lineto
+255.11806 42.51968 lineto
+247.29051 42.51968 240.94484 36.174 240.94484 28.34645 curveto
+226.7716 28.34645 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 42.51968 moveto
+247.29053 42.51968 240.94484 36.17401 240.94484 28.34647 curveto
+255.11807 28.34647 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+226.7716 85.03935 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 70.86613 moveto
+234.59915 70.86613 240.94484 77.2118 240.94484 85.03935 curveto
+255.11806 85.03935 lineto
+255.11806 70.86613 lineto
+247.29051 70.86613 240.94484 64.52045 240.94484 56.6929 curveto
+226.7716 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 70.86613 moveto
+247.29053 70.86613 240.94484 64.52046 240.94484 56.69292 curveto
+255.11807 56.69292 lineto
+ closepath fill
+newpath 240.94484 113.38582 moveto
+240.94484 105.55827 247.29051 99.21259 255.11806 99.21259 curveto
+255.11806 113.38582 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 113.3858 lineto
+240.94484 113.3858 lineto
+240.94484 105.55826 247.29053 99.21259 255.11807 99.21259 curveto
+255.11807 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 85.03935 moveto
+240.94484 92.8669 234.59917 99.21259 226.77162 99.21259 curveto
+226.77162 85.03935 lineto
+ closepath fill
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+226.7716 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 127.55904 moveto
+234.59915 127.55904 240.94484 133.90471 240.94484 141.73225 curveto
+255.11806 141.73225 lineto
+255.11806 127.55904 lineto
+247.29051 127.55904 240.94484 121.21335 240.94484 113.3858 curveto
+226.7716 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 127.55904 moveto
+247.29053 127.55904 240.94484 121.21336 240.94484 113.38582 curveto
+255.11807 113.38582 lineto
+ closepath fill
+newpath 240.94484 170.07872 moveto
+240.94484 162.25117 247.29051 155.90549 255.11806 155.90549 curveto
+255.11806 170.07872 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 170.0787 lineto
+240.94484 170.0787 lineto
+240.94484 162.25116 247.29053 155.90549 255.11807 155.90549 curveto
+255.11807 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 141.73225 moveto
+240.94484 149.5598 234.59917 155.90549 226.77162 155.90549 curveto
+226.77162 141.73225 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 198.42517 moveto
+240.94484 190.59763 247.29051 184.25194 255.11806 184.25194 curveto
+255.11806 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 198.42516 lineto
+240.94484 198.42516 lineto
+240.94484 190.59761 247.29053 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 240.94484 170.0787 moveto
+240.94484 177.90625 234.59917 184.25194 226.77162 184.25194 curveto
+226.77162 170.0787 lineto
+ closepath fill
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 212.59839 moveto
+234.59915 212.59839 240.94484 218.94406 240.94484 226.7716 curveto
+255.11806 226.7716 lineto
+255.11806 212.59839 lineto
+247.29051 212.59839 240.94484 206.2527 240.94484 198.42516 curveto
+226.7716 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 212.59839 moveto
+247.29053 212.59839 240.94484 206.25272 240.94484 198.42517 curveto
+255.11807 198.42517 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 240.94484 moveto
+234.59915 240.94484 240.94484 247.29051 240.94484 255.11806 curveto
+255.11806 255.11806 lineto
+255.11806 240.94484 lineto
+247.29051 240.94484 240.94484 234.59915 240.94484 226.7716 curveto
+226.7716 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 255.11807 240.94484 moveto
+247.29053 240.94484 240.94484 234.59917 240.94484 226.77162 curveto
+255.11807 226.77162 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+226.7716 283.46451 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 226.7716 269.29129 moveto
+234.59915 269.29129 240.94484 275.63696 240.94484 283.46451 curveto
+255.11806 283.46451 lineto
+255.11806 269.29129 lineto
+247.29051 269.29129 240.94484 262.9456 240.94484 255.11806 curveto
+226.7716 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11807 269.29129 moveto
+247.29053 269.29129 240.94484 262.94562 240.94484 255.11807 curveto
+255.11807 255.11807 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 28.34647 moveto
+269.29129 20.51892 275.63696 14.17323 283.46451 14.17323 curveto
+283.46451 28.34647 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 28.34645 lineto
+269.29129 28.34645 lineto
+269.29129 20.5189 275.63698 14.17323 283.46452 14.17323 curveto
+283.46452 0 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 0 moveto
+269.29129 7.82755 262.94562 14.17323 255.11807 14.17323 curveto
+255.11807 0 lineto
+ closepath fill
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+255.11806 56.6929 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 42.51968 moveto
+262.9456 42.51968 269.29129 48.86536 269.29129 56.6929 curveto
+283.46451 56.6929 lineto
+283.46451 42.51968 lineto
+275.63696 42.51968 269.29129 36.174 269.29129 28.34645 curveto
+255.11806 28.34645 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 42.51968 moveto
+275.63698 42.51968 269.29129 36.17401 269.29129 28.34647 curveto
+283.46452 28.34647 lineto
+ closepath fill
+newpath 269.29129 85.03937 moveto
+269.29129 77.21182 275.63696 70.86613 283.46451 70.86613 curveto
+283.46451 85.03937 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 85.03935 lineto
+269.29129 85.03935 lineto
+269.29129 77.2118 275.63698 70.86613 283.46452 70.86613 curveto
+283.46452 56.6929 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 56.6929 moveto
+269.29129 64.52045 262.94562 70.86613 255.11807 70.86613 curveto
+255.11807 56.6929 lineto
+ closepath fill
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+255.11806 113.3858 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 99.21259 moveto
+262.9456 99.21259 269.29129 105.55826 269.29129 113.3858 curveto
+283.46451 113.3858 lineto
+283.46451 99.21259 lineto
+275.63696 99.21259 269.29129 92.8669 269.29129 85.03935 curveto
+255.11806 85.03935 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 99.21259 moveto
+275.63698 99.21259 269.29129 92.86691 269.29129 85.03937 curveto
+283.46452 85.03937 lineto
+ closepath fill
+newpath 269.29129 141.73227 moveto
+269.29129 133.90472 275.63696 127.55904 283.46451 127.55904 curveto
+283.46451 141.73227 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 141.73225 lineto
+269.29129 141.73225 lineto
+269.29129 133.90471 275.63698 127.55904 283.46452 127.55904 curveto
+283.46452 113.3858 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 113.3858 moveto
+269.29129 121.21335 262.94562 127.55904 255.11807 127.55904 curveto
+255.11807 113.3858 lineto
+ closepath fill
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+255.11806 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 255.11806 155.90549 moveto
+262.9456 155.90549 269.29129 162.25116 269.29129 170.0787 curveto
+283.46451 170.0787 lineto
+283.46451 155.90549 lineto
+275.63696 155.90549 269.29129 149.5598 269.29129 141.73225 curveto
+255.11806 141.73225 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 283.46452 155.90549 moveto
+275.63698 155.90549 269.29129 149.55981 269.29129 141.73227 curveto
+283.46452 141.73227 lineto
+ closepath fill
+newpath 269.29129 198.42517 moveto
+269.29129 190.59763 275.63696 184.25194 283.46451 184.25194 curveto
+283.46451 198.42517 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 198.42516 lineto
+269.29129 198.42516 lineto
+269.29129 190.59761 275.63698 184.25194 283.46452 184.25194 curveto
+283.46452 170.0787 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 170.0787 moveto
+269.29129 177.90625 262.94562 184.25194 255.11807 184.25194 curveto
+255.11807 170.0787 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.77162 moveto
+269.29129 218.94408 275.63696 212.59839 283.46451 212.59839 curveto
+283.46451 226.77162 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 226.7716 lineto
+269.29129 226.7716 lineto
+269.29129 218.94406 275.63698 212.59839 283.46452 212.59839 curveto
+283.46452 198.42516 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 198.42516 moveto
+269.29129 206.2527 262.94562 212.59839 255.11807 212.59839 curveto
+255.11807 198.42516 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11807 moveto
+269.29129 247.29053 275.63696 240.94484 283.46451 240.94484 curveto
+283.46451 255.11807 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 255.11806 lineto
+269.29129 255.11806 lineto
+269.29129 247.29051 275.63698 240.94484 283.46452 240.94484 curveto
+283.46452 226.7716 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 226.7716 moveto
+269.29129 234.59915 262.94562 240.94484 255.11807 240.94484 curveto
+255.11807 226.7716 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 283.46452 moveto
+269.29129 275.63698 275.63696 269.29129 283.46451 269.29129 curveto
+283.46451 283.46452 lineto
+ closepath fill
+ 0 1 0 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 283.46451 lineto
+269.29129 283.46451 lineto
+269.29129 275.63696 275.63698 269.29129 283.46452 269.29129 curveto
+283.46452 255.11806 lineto
+ closepath fill
+ 0.5 0 1 setrgbcolor
+newpath 269.29129 255.11806 moveto
+269.29129 262.9456 262.94562 269.29129 255.11807 269.29129 curveto
+255.11807 255.11806 lineto
+ closepath fill
+showpage
+%%EndDocument
+ @endspecial 1926 5255 a Fa(2)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/truchet/test.tex b/graphics/metapost/contrib/macros/truchet/test.tex
new file mode 100644
index 0000000000..66c5d9e50d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/test.tex
@@ -0,0 +1,13 @@
+\documentclass{article}
+\usepackage[dvips]{graphics}
+\begin{document}
+
+\begin{center}
+\includegraphics{example.1}
+\includegraphics{example.2}
+\includegraphics{example.3}
+\includegraphics{example.4}
+\includegraphics{example.5}
+\end{center}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/truchet/tiling.dvi b/graphics/metapost/contrib/macros/truchet/tiling.dvi
new file mode 100644
index 0000000000..000f10e862
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/tiling.dvi
Binary files differ
diff --git a/graphics/metapost/contrib/macros/truchet/tiling.mp b/graphics/metapost/contrib/macros/truchet/tiling.mp
new file mode 100644
index 0000000000..5ed25bd11e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/tiling.mp
@@ -0,0 +1,471 @@
+% {\tt tiling.mp}
+% {\bf Truchet's problem: macros}
+%==================================================
+% D. Roegel's solution for Denis Girou's {\tt pstricks} competition.
+% This solution is written in {\tt METAPOST}.
+% The source file may be formatted using the {\tt mft} program.
+% (the program used for volumes B and E of {\it Computers \& Typesetting\/})
+% Send comments and improvements to {\tt roegel@loria.fr}.
+% -------------------------------------------------------------------------
+% \underbar{History}:
+% 9-10 June 1995 (lines)
+% 13-14 June 1995 (surfaces)
+% 16 June 1995 (comments and restructuring)
+% 21 June 1995 (some more formatting for {\tt mft})
+% 26 June 1995 (some simplifications)
+% 9 July 1995 (macros and examples were split and code better organized)
+%
+% This is my first ``large'' {\tt METAPOST} program. I'm still learning!
+% Therefore lots of things are clumsy and I don't pretend this
+% is an example of good {\tt METAPOST} programming.
+% I had however great fun writing it!
+%
+% \underbar{Some highlights}:
+% The coloring of lines worked after circa 4 hours $\ldots$
+% The only real problem I met was that an infinite loop occured
+% when |follow_line| was following a cyclic path.
+%
+% Concerning the coloration of surfaces, I needed some time
+% until I noticed that two colors were sufficient!
+% Once you notice this and draw all the conclusions, the task is trivial.
+% -------------------------------------------------------------------------
+%
+% A tiling |Nx| $\times$ |Ny| is a matrix of tiles indexed by |x|
+% ranging between
+% |0| and |Nx-1| and |y| ranging between |0| and |Ny-1|.
+% Two kinds of tiles are considered. We will refer to them as `tile 0'
+% and `tile 1'. Each tile has three parts, marked {\tt*}, {\tt+} and {\tt x}.
+% {\catcode`\.=13\gdef\os{\obeyspaces\tt\frenchspacing
+% \catcode`\.=13\def.{\char124 }}}
+% {\os
+% Tile 0: |" ------ "| Tile 1: |" ------ "|
+% |".* . ."| |". . * ."|
+% |"._/ + _."| |"._ +\ _."|
+% |". /x."| |".x\ ."|
+% |".___.__."| |".__.___."|}
+%
+% ---------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Tiling orientation and color initialization: BEGINNING
+%-----------------------------------------------------------------------------
+
+% We define the tiling randomly.
+def init_tiling(expr nx,ny) =
+ for i:=0 upto nx-1:
+ for j:=0 upto ny-1:
+ tile[i][j]:=coin; % we throw a coin for each tile.
+ endfor;
+ endfor;
+ enddef;
+
+% The `coin' macro behaves like a coin and yields randomly |0| or |1|.
+% This is used for the initial tiling.
+def coin = floor(uniformdeviate 2) enddef;
+
+% We let |-1| mean ``no color yet''.
+def init_colors =
+ for i:=0 upto Nx-1: for j:=0 upto Ny-1:
+ tilecolor[i][j][0]:=-1; % right
+ tilecolor[i][j][1]:=-1; % up
+ tilecolor[i][j][2]:=-1; % left
+ tilecolor[i][j][3]:=-1; % down
+ endfor; endfor;
+ enddef;
+
+def init_partcolors =
+ for i:=0 upto Nx-1:
+ for j:=0 upto Ny-1:
+ tilepartcolor[i][j][0]:=-1; % up left or up right
+ tilepartcolor[i][j][1]:=-1; % middle
+ tilepartcolor[i][j][2]:=-1; % down right or down left
+ endfor;
+ endfor;
+ enddef;
+
+% The macro |TileColors| allows to define or redefine the colors.
+% Only two colors are necessary.
+
+def TileColors(expr ca, cb) =
+ def partcolor(expr c) =
+ if c=0: ca
+ else: cb
+ fi
+ enddef;
+ enddef;
+
+% The default colors are |red| and |(1,1,0)| (in RGB coordinates)
+TileColors(red, (1,1,0));
+
+% A useful color. We might also have used the \.{color} type.
+def yellow = (1,1,0) enddef; % RGB definition
+
+% The basic pattern is the following quartercircle;
+% It is used later on, shifted and rotated.
+def define_basetile(expr u) =
+ path upperleft;
+ upperleft:=((0,0.5){right}..{up}(0.5,1)) scaled u;
+ enddef;
+
+% Here, we define the paths corresponding to the upper left and middle
+% parts of the tile 0.
+
+def define_basetilepart(expr u) =
+ path tilepart[];
+ % left upper corner of a standard tile
+ tilepart0:=((0,0.5){right}..{up}(0.5,1)--(0,1)--cycle) scaled u;
+ % middle part of the standard tile
+ tilepart1:=((0,0.5){right}..{up}(0.5,1)--(1,1)--
+ (1,0.5){left}..{down}(0.5,0)--(0,0)--cycle) scaled u;
+ enddef;
+
+% The external frame is drawn outside the rectangle (0,0) -- (nx*u,ny*u).
+% Guess why ?
+vardef draw_boundaries(expr nx,ny) =
+ numeric u,delta;
+ u=TilingUnit;delta=.5mm;
+ pickup pencircle scaled (2*delta);
+ draw(0-delta,0-delta)--(0-delta,ny*u+delta)--
+ (nx*u+delta,ny*u+delta)--(nx*u+delta,0-delta)--cycle;
+ for i:=1 upto nx-1:draw(i*u,0)--(i*u,ny*u);endfor;
+ for i:=1 upto ny-1:draw(0,i*u)--(nx*u,i*u);endfor;
+ enddef;
+
+%-----------------------------------------------------------------------------
+% Tiling orientation and color initialization: END
+%-----------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Computation of line colors: BEGINNING
+%-----------------------------------------------------------------------------
+% The macro |compute_linecolors| `computes' the colors of the lines.
+% As a matter of fact, all what it does is going through all
+% the tiles, choose a not yet colored line, and follow it on
+% both directions, and simultaneously coloring it.
+% For each line a new color is used.
+%
+vardef compute_linecolors =
+ numeric k;
+ init_colors;
+ for i:=0 upto Nx-1:
+ for j:=0 upto Ny-1:
+ forever:
+ k:=not_colored_direction(i,j);% choose a non colored line.
+ exitif k=-1; % there is none, go to the next tile.
+ follow_line(i,j,k,nextcolor); % Follow this line and color it with
+ % |nextcolor|.
+ k:=dual(i,j,k); % Get the opposite direction.
+ if tilecolor[i][j][k] = -1: % If it is not yet colored,
+ follow_line(i,j,k,nextcolor); % follow the line.
+ fi;
+ nextcolor:=nextcolor+1;
+ endfor;
+ endfor;
+ endfor;
+ enddef;
+
+% This macro gives a direction not yet colored.
+% If there is none, it yields |-1|.
+def not_colored_direction(expr x,y) =
+ if tilecolor[x][y][0] = -1 : 0
+ elseif tilecolor[x][y][1] = -1 : 1
+ elseif tilecolor[x][y][2] = -1 : 2
+ elseif tilecolor[x][y][3] = -1 : 3
+ else: -1
+ fi
+ enddef;
+
+% Colour a line and follow it.
+% Notice that for each tile except the first one, two directions
+% must be colored.
+%
+vardef follow_line(expr x,y,d,c) = % |x|,|y| are the beginning coordinates
+ % |d| is the direction in which we advance
+ % |c| is the color used
+ tilecolor[x][y][d]:=c;xx:=x;yy:=y;dd:=d;
+ forever:
+ exitif last_tile(xx,yy,dd); % are we at an edge ?
+ next_tile;% get the new values of |xx|, |yy| and |dd|.
+ du:=dual(xx,yy,dd);
+ exitif tilecolor[xx][yy][du] > -1; % are we in a cycle ?
+ tilecolor[xx][yy][du]:=c;tilecolor[xx][yy][dd]:=c;
+ endfor;
+ enddef;
+
+
+% This macro gives the direction dual to |d| in a tile.
+def dual(expr x,y,d) =
+ (((2*tile[x][y]) + if d=0: 3 elseif d=1: 2 elseif d=2: 1 else: 0 fi) mod 4)
+ enddef;
+
+% This macro is true if a line goes outside the rectangle.
+def last_tile(expr x,y,d) =
+ if (x=0) and (d=2) or
+ (x=Nx-1) and (d=0) or
+ (y=0) and (d=3) or
+ (y=Ny-1) and (d=1): true
+ else: false
+ fi;
+ enddef;
+
+def next_tile =
+ if dd=0: xx:=xx+1;dd:=(1+2*tile[xx][yy]) mod 4;
+ elseif dd=1: yy:=yy+1;dd:=(0+2*tile[xx][yy]) mod 4;
+ elseif dd=2: xx:=xx-1;dd:=(3+2*tile[xx][yy]) mod 4;
+ else: yy:=yy-1;dd:=(2+2*tile[xx][yy]) mod 4;
+ fi
+ enddef;
+
+%-----------------------------------------------------------------------------
+% Computation of line colors: END
+%-----------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Drawing of the colored lines: BEGINNING
+%-----------------------------------------------------------------------------
+
+% For each tile, we color the lines.
+vardef draw_coloredlines(expr nx,ny) =
+ save u;
+ u=TilingUnit;
+ pickup pencircle scaled TilingLineWidth;
+ for i:=0 upto nx-1:
+ for j:=0 upto ny-1:
+ color_thetile(i,j); % here we draw the colored tiles.
+ endfor;
+ endfor;
+ enddef;
+
+% This macro just draws the left and right part of a tile.
+def color_thetile(expr x,y) =
+ draw_upperleft(x,y,tile[x][y]*90,tilecolor[x][y][2]);
+ draw_upperleft(x,y,180+90*tile[x][y],tilecolor[x][y][0]);
+ enddef;
+
+% The macro |draw_upperleft| draws the |upperleft| path, rotated by angle |a|,
+% and with a color depending on |c|.
+
+def draw_upperleft(expr x,y,a,c) =
+ draw upperleft shifted (-.5u,-.5u) rotated a
+ shifted (.5u,.5u) shifted ((x,y)*u)
+ withcolor (linecolor(c));
+ enddef;
+
+% The kind of line color is chosen here; this may be changed.
+def linecolor(expr c) = (c/nextcolor)[red,green] enddef;
+
+%-----------------------------------------------------------------------------
+% Drawing of the colored lines: END
+%-----------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Computation of tile colors: BEGINNING
+%-----------------------------------------------------------------------------
+
+% In order to color the tiling, we need only two colors.
+% These colors are numbered |0| and |1|.
+% The whole tiling can be performed at once.
+
+def compute_partcolors =
+ init_partcolors;
+ for i:=0 upto Nx-1:
+ for j:=0 upto Ny-1:
+ fill_tile(i,j);
+ endfor;
+ endfor;
+ enddef;
+
+% This macro collects the colors of the neighbours (only down and left)
+% and updates the current tile, where possible.
+%
+def fill_tile(expr x,y) =
+ init_neighbours(x,y); % get the color of the neighbouring tiles
+ if tile[x][y]=0:
+ handle_edges(7)(x,y,0);
+ handle_edges(5,6)(x,y,1);
+ handle_edges(4)(x,y,2);
+ else:
+ handle_edges(5,6)(x,y,2);
+ handle_edges(4,7)(x,y,1);
+ fi;
+ complete_tile(x,y);
+ enddef;
+
+% Neighbours are initialized in an obvious way.
+% The numbering of the neighbours is dual to the numbering
+% of edges (see below).
+% (commented lines are just given for sake of completeness;
+% they are not actually used)
+%
+
+def init_neighbours(expr x,y) =
+ for i:=0 upto 7:neighbour_edgecolors[i]:=-1;endfor;
+ if x>0:
+ neighbour_edgecolors[7]:=edge_color(x-1,y,2);
+ neighbour_edgecolors[6]:=edge_color(x-1,y,3);
+ fi;
+% |if x<Nx-1 : neighbour_edgecolors[2]:=edge_color(x+1,y,7);|
+% |neighbour_edgecolors[3]:=edge_color(x+1,y,6); fi;|
+ if y>0:
+ neighbour_edgecolors[5]:=edge_color(x,y-1,0);
+ neighbour_edgecolors[4]:=edge_color(x,y-1,1);
+ fi;
+% |if y<Ny-1 : neighbour_edgecolors[0]:=edge_color(x,y+1,5);|
+% |neighbour_edgecolors[1]:=edge_color(x,y+1,4); fi;|
+ enddef;
+
+% This macro spreads the colors of the neighbours in the list |e|
+% onto the part |f| of tile |[x,y]|.
+%
+def handle_edges(text e)(expr x,y,f) =
+ forsuffixes s:=e:
+ if neighbour_edgecolors[s]>-1 :
+ tilepartcolor[x][y][f]:=neighbour_edgecolors[s];
+ fi;
+ endfor;
+ enddef;
+
+% The macro |edge_color| gives the color of an edge, if any.
+% There are eight edges, and they are numbered from |0| to |7|.
+%
+%
+%{\os *0 0 0 1 1 1*
+% 7 2
+% 7 2
+% 7 2
+% 6 3
+% 6 3
+% 6 3
+% *5 5 5 4 4 4*}
+%
+%
+def edge_color(expr x,y,e) =
+ if tile[x][y]=0:
+ if (e=0) or (e=7): tilepartcolor[x][y][0];
+ elseif (e=3) or (e=4): tilepartcolor[x][y][2];
+ else: tilepartcolor[x][y][1];
+ fi;
+ else:
+ if (e=1) or (e=2): tilepartcolor[x][y][0];
+ elseif (e=5) or (e=6): tilepartcolor[x][y][2];
+ else: tilepartcolor[x][y][1];
+ fi;
+ fi;
+ enddef;
+
+% Since two colors are enough, as soon as one part of a tile
+% is colored, we can immediately color the others.
+def complete_tile(expr x,y) =
+ if tilepartcolor[x][y][0] > -1:
+ tilepartcolor[x][y][1]:=1-tilepartcolor[x][y][0];
+ tilepartcolor[x][y][2]:=tilepartcolor[x][y][0];
+ fi;
+ if tilepartcolor[x][y][1] > -1:
+ tilepartcolor[x][y][0]:=1-tilepartcolor[x][y][1];
+ tilepartcolor[x][y][2]:=1-tilepartcolor[x][y][1];
+ fi;
+ if tilepartcolor[x][y][2] > -1:
+ tilepartcolor[x][y][1]:=1-tilepartcolor[x][y][2];
+ tilepartcolor[x][y][0]:=tilepartcolor[x][y][2];
+ fi;
+ if tilepartcolor[x][y][0] = -1: % this part is only used at
+ % the very beginning of a tiling, and
+ % serves as initialization.
+ tilepartcolor[x][y][0]:=0;
+ tilepartcolor[x][y][1]:=1;
+ tilepartcolor[x][y][2]:=0;
+ fi;
+ enddef;
+
+%-----------------------------------------------------------------------------
+% Computation of tile colors: END
+%-----------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Drawing of tile colors: BEGINNING
+%-----------------------------------------------------------------------------
+
+% For each tile, we color the three parts.
+vardef draw_coloredparts(expr nx,ny) =
+ save u;
+ u=TilingUnit;
+ for i:=0 upto nx-1:
+ for j:=0 upto ny-1:
+ fill_tilepart(i,j,1);
+ fill_tilepart(i,j,2);
+ fill_tilepart(i,j,3);
+ endfor;
+ endfor;
+ enddef;
+
+% |fill_tilepart| fills part |part| at position |x|, |y|.
+def fill_tilepart(expr x,y,part) =
+ if part=1:
+ colorpart(x,y,0,-90*tile[x][y],partcolor(tilepartcolor[x][y][0]));
+ elseif part=2:
+ colorpart(x,y,1,90*tile[x][y],partcolor(tilepartcolor[x][y][1]));
+ else:
+ colorpart(x,y,0,180-90*tile[x][y],partcolor(tilepartcolor[x][y][2]));
+ fi;
+ enddef;
+
+% |colorpart| colors a part |p| (0 is corner, 1 is middle)
+% at position |x|, |y|, using the fundamental
+% |tilepart[p]| pattern, rotated by |a| degrees and colored according to |c|.
+
+vardef colorpart(expr x,y,p,a,c) =
+ fill (tilepart[p] shifted (-.5u,-.5u)
+ rotated a
+ shifted (.5u,.5u)
+ shifted ((x,y)*u)) withcolor (c);
+ enddef;
+
+%-----------------------------------------------------------------------------
+% Drawing of tile colors: END
+%-----------------------------------------------------------------------------
+%\vfill\eject
+%-----------------------------------------------------------------------------
+% Main definition
+%-----------------------------------------------------------------------------
+
+% This is the main definition.
+% Two cases are considered: either the lines are colored, and the surfaces
+% are not filled, or the surfaces are colored, but the lines are not.
+
+vardef TruchetTiling(expr x,y) =
+ save Nx,Ny;
+ Nx=x;
+ Ny=y;
+ init_tiling(Nx,Ny);
+ draw_boundaries(Nx,Ny);
+ if not TruchetTilingFill:
+ define_basetile(TilingUnit);
+ numeric nextcolor,tilecolor[][][];
+ nextcolor:=0;
+ compute_linecolors; % the colors of the lines are computed here,
+ % but not drawn;
+ draw_coloredlines(Nx,Ny);
+ else:
+ define_basetilepart(TilingUnit);
+ numeric tilepartcolor[][][],neighbour_edgecolors[];
+ compute_partcolors;
+ draw_coloredparts(Nx,Ny);
+ fi;
+ enddef;
+
+%-----------------------------------------------------------------------------
+% Global variables and default values
+%-----------------------------------------------------------------------------
+
+numeric tile[][];
+boolean TruchetTilingFill;
+TruchetTilingFill=false;
+numeric TilingUnit,TilingLineWidth;
+% default values
+TilingUnit:=1cm;
+TilingLineWidth:=1mm;
+
+%-----------------------------------------------------------------------------
+% End of file tiling.mp
+%-----------------------------------------------------------------------------
+
diff --git a/graphics/metapost/contrib/macros/truchet/tiling.tex b/graphics/metapost/contrib/macros/truchet/tiling.tex
new file mode 100644
index 0000000000..720169e63b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/truchet/tiling.tex
@@ -0,0 +1,609 @@
+\input mftmac
+$\9 {\tt tiling.mp}\par
+$\9 {\bf Truchet's problem: macros}\par
+$\9==================================================\par
+$\9 D. Roegel's solution for Denis Girou's {\tt pstricks} competition.\par
+$\9 This solution is written in {\tt METAPOST}.\par
+$\9 The source file may be formatted using the {\tt mft} program.\par
+$\9 (the program used for volumes B and E of {\it Computers \& Typesetting\/})%
+\par
+$\9 Send comments and improvements to {\tt roegel@loria.fr}.\par
+$\9 -------------------------------------------------------------------------%
+\par
+$\9 \underbar{History}:\par
+$\9 9-10 June 1995 (lines)\par
+$\9 13-14 June 1995 (surfaces)\par
+$\9 16 June 1995 (comments and restructuring)\par
+$\9 21 June 1995 (some more formatting for {\tt mft})\par
+$\9 26 June 1995 (some simplifications)\par
+$\9 9 July 1995 (macros and examples were split and code better organized)\par
+$\9\par
+$\9 This is my first ``large'' {\tt METAPOST} program. I'm still learning!\par
+$\9 Therefore lots of things are clumsy and I don't pretend this\par
+$\9 is an example of good {\tt METAPOST} programming.\par
+$\9 I had however great fun writing it!\par
+$\9\par
+$\9 \underbar{Some highlights}:\par
+$\9 The coloring of lines worked after circa 4 hours $\ldots$\par
+$\9 The only real problem I met was that an infinite loop occured\par
+$\9 when $\\{follow\_line}$ was following a cyclic path.\par
+$\9\par
+$\9 Concerning the coloration of surfaces, I needed some time\par
+$\9 until I noticed that two colors were sufficient!\par
+$\9 Once you notice this and draw all the conclusions, the task is trivial.\par
+$\9 -------------------------------------------------------------------------%
+\par
+$\9\par
+$\9 A tiling $\\{Nx}$ $\times$ $\\{Ny}$ is a matrix of tiles indexed by $x$\par
+$\9 ranging between\par
+$\9 $0$ and $\\{Nx}-1$ and $y$ ranging between $0$ and $\\{Ny}-1$.\par
+$\9 Two kinds of tiles are considered. We will refer to them as `tile 0'\par
+$\9 and `tile 1'. Each tile has three parts, marked {\tt*}, {\tt+} and {\tt x}.%
+\par
+$\9 {\catcode`\.=13\gdef\os{\obeyspaces\tt\frenchspacing\par
+$\9 \catcode`\.=13\def.{\char124 }}}\par
+$\9 {\os\par
+$\9 Tile 0: $\7" ------ "$ Tile 1: $\7" ------ "$\par
+$\9 $\7".* . ."$ $\7". . * ."$\par
+$\9 $\7"._/ + _."$ $\7"._ +\ _."$\par
+$\9 $\7". /x."$ $\7".x\ ."$\par
+$\9 $\7".___.__."$ $\7".__.___."$}\par
+$\9\par
+$\9 ---------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Tiling orientation and color initialization: BEGINNING\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\9 We define the tiling randomly.\par
+$\2{def}\\{init\_tiling}(\2{expr}\\{nx},\\{ny})=$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{nx}-1\?:$\par
+\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad$\\{tile}[i][j]:=\\{coin};\ \9 we throw a
+coin for each tile.\par
+\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The `coin' macro behaves like a coin and yields randomly $0$ or $1$.\par
+$\9 This is used for the initial tiling.\par
+$\2{def}\\{coin}=\1{floor}(\1{uniformdeviate}2)\3{enddef};$\par
+\BL
+$\9 We let ${}-1$ mean ``no color yet''.\par
+$\2{def}\\{init\_colors}=$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{Nx}-1\?:\2{for}j:=0\4{upto}\\{Ny}-1\?:$%
+\par
+\quad\quad\quad\quad\quad$\\{tilecolor}[i][j][0]:=-1;\ \9 right\par
+\quad\quad\quad\quad\quad$\\{tilecolor}[i][j][1]:=-1;\ \9 up\par
+\quad\quad\quad\quad\quad$\\{tilecolor}[i][j][2]:=-1;\ \9 left\par
+\quad\quad\quad\quad\quad$\\{tilecolor}[i][j][3]:=-1;\ \9 down\par
+\quad\quad\quad$\!\3{endfor};\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\2{def}\\{init\_partcolors}=$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{Nx}-1\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{Ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{tilepartcolor}[i][j][0]:=-1;\ %
+\9 up left or up right\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{tilepartcolor}[i][j][1]:=-1;\ %
+\9 middle\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{tilepartcolor}[i][j][2]:=-1;\ %
+\9 down right or down left\par
+\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The macro $\\{TileColors}$ allows to define or redefine the colors.\par
+$\9 Only two colors are necessary.\par
+\BL
+$\2{def}\\{TileColors}(\2{expr}\\{ca},\\{cb})=$\par
+\quad\quad\quad$\2{def}\\{partcolor}(\2{expr}c)=$\par
+\quad\quad\quad\quad\quad\quad$\2{if}c=0\?:\\{ca}$\par
+\quad\quad\quad\quad\quad\quad$\2{else}\?:\\{cb}$\par
+\quad\quad\quad\quad\quad\quad$\!\3{fi}$\par
+\quad\quad\quad$\!\3{enddef};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The default colors are $\\{red}$ and $(1,1,0)$ (in RGB coordinates)\par
+$\\{TileColors}(\\{red},(1,1,0));$\par
+\BL
+$\9 A useful color. We might also have used the \.{color} type.\par
+$\2{def}\\{yellow}=(1,1,0)\3{enddef};\ \9 RGB definition\par
+\BL
+$\9 The basic pattern is the following quartercircle;\par
+$\9 It is used later on, shifted and rotated.\par
+$\2{def}\\{define\_basetile}(\2{expr}u)=$\par
+\quad\quad\quad\quad$\2{path}\\{upperleft};$\par
+\quad\quad\quad\quad$\\{upperleft}:=((0,0.5)\{\\{right}\}\8{..}\{\\{up}%
+\}(0.5,1))\6{scaled}u;$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 Here, we define the paths corresponding to the upper left and middle\par
+$\9 parts of the tile 0.\par
+\BL
+$\2{def}\\{define\_basetilepart}(\2{expr}u)=$\par
+\quad\quad\quad\quad$\2{path}\\{tilepart}[];$\par
+\quad\quad\quad\quad$\9 left upper corner of a standard tile\par
+\quad\quad\quad\quad$\\{tilepart}_{0}:=((0,0.5)\{\\{right}\}\8{..}\{\\{up}%
+\}(0.5,1)\8{--}(0,1)\8{--}\1{cycle})\6{scaled}u;$\par
+\quad\quad\quad\quad$\9 middle part of the standard tile\par
+\quad\quad\quad\quad$\\{tilepart}_{1}:=((0,0.5)\{\\{right}\}\8{..}\{\\{up}%
+\}(0.5,1)\8{--}(1,1)\8{--}$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad$(1,0.5)\{\\{left}\}\8{..}\{\\{down}\}(0.5,0)\8{--}(0,0)\8{--}\1{cycle})%
+\6{scaled}u;$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The external frame is drawn outside the rectangle (0,0) -- (nx*u,ny*u).\par
+$\9 Guess why ?\par
+$\2{vardef}\\{draw\_boundaries}(\2{expr}\\{nx},\\{ny})=$\par
+\quad\quad\quad\quad$\2{numeric}u,\\{delta};$\par
+\quad\quad\quad\quad$u=\\{TilingUnit};\ \\{delta}=.5\\{mm};$\par
+\quad\quad\quad\quad$\2{pickup}\5{pencircle}\6{scaled}(2\ast \\{delta});$\par
+\quad\quad\quad\quad$\2{draw}(0-\\{delta},0-\\{delta})\8{--}(0-\\{delta},\\{ny}%
+\ast u+\\{delta})\8{--}$\par
+\quad\quad\quad\quad\quad\quad\quad\quad$(\\{nx}\ast u+\\{delta},\\{ny}\ast u+%
+\\{delta})\8{--}(\\{nx}\ast u+\\{delta},0-\\{delta})\8{--}\1{cycle};$\par
+\quad\quad\quad\quad$\2{for}i:=1\4{upto}\\{nx}-1\?:\2{draw}(i\ast u,0)\8{--}(i%
+\ast u,\\{ny}\ast u);\3{endfor};$\par
+\quad\quad\quad\quad$\2{for}i:=1\4{upto}\\{ny}-1\?:\2{draw}(0,i\ast u)\8{--}(%
+\\{nx}\ast u,i\ast u);\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Tiling orientation and color initialization: END\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Computation of line colors: BEGINNING\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 The macro $\\{compute\_linecolors}$ `computes' the colors of the lines.\par
+$\9 As a matter of fact, all what it does is going through all\par
+$\9 the tiles, choose a not yet colored line, and follow it on\par
+$\9 both directions, and simultaneously coloring it.\par
+$\9 For each line a new color is used.\par
+$\9\par
+$\2{vardef}\\{compute\_linecolors}=$\par
+\quad\quad\quad$\2{numeric}k;$\par
+\quad\quad\quad$\\{init\_colors};$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{Nx}-1\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{Ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad$\2{forever}\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$k:=\\{not\_colored%
+\_direction}(i,j);\ \9 choose a non colored line.\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\2{exitif}k=-1;\ %
+\9 there is none, go to the next tile.\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{follow%
+\_line}(i,j,k,\\{nextcolor});\ \9 Follow this line and color it with\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad$\9 $\\{nextcolor}$.\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$k:=%
+\\{dual}(i,j,k);\ \9 Get the opposite direction.\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\2{if}%
+\\{tilecolor}[i][j][k]=-1\?:\9 If it is not yet colored,\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad$\\{follow\_line}(i,j,k,\\{nextcolor});\ \9 follow the line.\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{nextcolor}:=%
+\\{nextcolor}+1;$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 This macro gives a direction not yet colored.\par
+$\9 If there is none, it yields ${}-1$.\par
+$\2{def}\\{not\_colored\_direction}(\2{expr}x,y)=$\par
+\quad\quad\quad$\2{if}\\{tilecolor}[x][y][0]=-1\?:0$\par
+\quad\quad\quad$\2{elseif}\\{tilecolor}[x][y][1]=-1\?:1$\par
+\quad\quad\quad$\2{elseif}\\{tilecolor}[x][y][2]=-1\?:2$\par
+\quad\quad\quad$\2{elseif}\\{tilecolor}[x][y][3]=-1\?:3$\par
+\quad\quad\quad$\2{else}\?:-1$\par
+\quad\quad\quad$\!\3{fi}$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 Colour a line and follow it.\par
+$\9 Notice that for each tile except the first one, two directions\par
+$\9 must be colored.\par
+$\9\par
+$\2{vardef}\\{follow\_line}(\2{expr}x,y,d,c)=\9 $x$,$y$ are the beginning
+coordinates\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\9 $d$ is the
+direction in which we advance\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\9 $c$ is the
+color used\par
+\quad\quad\quad$\\{tilecolor}[x][y][d]:=c;\ \\{xx}:=x;\ \\{yy}:=y;\ \\{dd}:=d;$%
+\par
+\quad\quad\quad$\2{forever}\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{exitif}\\{last\_tile}(\\{xx},\\{yy},\\{dd});\
+\9 are we at an edge ?\par
+\quad\quad\quad\quad\quad\quad$\\{next\_tile};\ \9 get the new values of $%
+\\{xx}$, $\\{yy}$ and $\\{dd}$.\par
+\quad\quad\quad\quad\quad\quad$\\{du}:=\\{dual}(\\{xx},\\{yy},\\{dd});$\par
+\quad\quad\quad\quad\quad\quad$\2{exitif}\\{tilecolor}[\\{xx}][\\{yy}][%
+\\{du}]>-1;\ \9 are we in a cycle ?\par
+\quad\quad\quad\quad\quad\quad$\\{tilecolor}[\\{xx}][\\{yy}][\\{du}]:=c;\ %
+\\{tilecolor}[\\{xx}][\\{yy}][\\{dd}]:=c;$\par
+\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+\BL
+$\9 This macro gives the direction dual to $d$ in a tile.\par
+$\2{def}\\{dual}(\2{expr}x,y,d)=$\par
+\quad\quad\quad\quad$(((2\ast \\{tile}[x][y])+\2{if}d=0\?:3\2{elseif}d=1\?:2%
+\2{elseif}d=2\?:1\2{else}\?:0\3{fi})\6{mod}4)$\par
+\quad\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 This macro is true if a line goes outside the rectangle.\par
+$\2{def}\\{last\_tile}(\2{expr}x,y,d)=$\par
+\quad\quad\quad$\2{if}(x=0)\6{and}(d=2)\6{or}$\par
+\quad\quad\quad\quad\quad\quad$(x=\\{Nx}-1)\6{and}(d=0)\6{or}$\par
+\quad\quad\quad\quad\quad\quad$(y=0)\6{and}(d=3)\6{or}$\par
+\quad\quad\quad\quad\quad\quad$(y=\\{Ny}-1)\6{and}(d=1)\?:\5{true}$\par
+\quad\quad\quad$\2{else}\?:\5{false}$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\2{def}\\{next\_tile}=$\par
+\quad\quad\quad$\2{if}\\{dd}=0\?:\\{xx}:=\\{xx}+1;\ \\{dd}:=(1+2\ast \\{tile}[%
+\\{xx}][\\{yy}])\6{mod}4;$\par
+\quad\quad\quad$\2{elseif}\\{dd}=1\?:\\{yy}:=\\{yy}+1;\ \\{dd}:=(0+2\ast %
+\\{tile}[\\{xx}][\\{yy}])\6{mod}4;$\par
+\quad\quad\quad$\2{elseif}\\{dd}=2\?:\\{xx}:=\\{xx}-1;\ \\{dd}:=(3+2\ast %
+\\{tile}[\\{xx}][\\{yy}])\6{mod}4;$\par
+\quad\quad\quad$\2{else}\?:\\{yy}:=\\{yy}-1;\ \\{dd}:=(2+2\ast \\{tile}[%
+\\{xx}][\\{yy}])\6{mod}4;$\par
+\quad\quad\quad$\!\3{fi}$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Computation of line colors: END\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Drawing of the colored lines: BEGINNING\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\9 For each tile, we color the lines.\par
+$\2{vardef}\\{draw\_coloredlines}(\2{expr}\\{nx},\\{ny})=$\par
+\quad\quad\quad$\2{save}u;$\par
+\quad\quad\quad$u=\\{TilingUnit};$\par
+\quad\quad\quad$\2{pickup}\5{pencircle}\6{scaled}\\{TilingLineWidth};$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{nx}-1\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad$\\{color\_thetile}(i,j);\ \9 here we
+draw the colored tiles.\par
+\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 This macro just draws the left and right part of a tile.\par
+$\2{def}\\{color\_thetile}(\2{expr}x,y)=$\par
+\quad\quad\quad\quad$\\{draw\_upperleft}(x,y,\\{tile}[x][y]\ast 90,%
+\\{tilecolor}[x][y][2]);$\par
+\quad\quad\quad\quad$\\{draw\_upperleft}(x,y,180+90\ast \\{tile}[x][y],%
+\\{tilecolor}[x][y][0]);$\par
+\quad\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The macro $\\{draw\_upperleft}$ draws the $\\{upperleft}$ path, rotated by
+angle $a$,\par
+$\9 and with a color depending on $c$.\par
+\BL
+$\2{def}\\{draw\_upperleft}(\2{expr}x,y,a,c)=$\par
+\quad\quad\quad$\2{draw}\\{upperleft}\6{shifted}(-.5u,-.5u)\6{rotated}a$\par
+\quad\quad\quad\quad\quad${}\6{shifted}(.5u,.5u)\6{shifted}((x,y)\ast u)$\par
+\quad\quad\quad\quad\quad$\\{withcolor}(\\{linecolor}(c));$\par
+\quad\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The kind of line color is chosen here; this may be changed.\par
+$\2{def}\\{linecolor}(\2{expr}c)=(c/\\{nextcolor})[\\{red},\\{green}]%
+\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Drawing of the colored lines: END\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Computation of tile colors: BEGINNING\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\9 In order to color the tiling, we need only two colors.\par
+$\9 These colors are numbered $0$ and $1$.\par
+$\9 The whole tiling can be performed at once.\par
+\BL
+$\2{def}\\{compute\_partcolors}=$\par
+\quad\quad\quad$\\{init\_partcolors};$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{Nx}-1\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{Ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{fill\_tile}(i,j);$\par
+\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 This macro collects the colors of the neighbours (only down and left)\par
+$\9 and updates the current tile, where possible.\par
+$\9\par
+$\2{def}\\{fill\_tile}(\2{expr}x,y)=$\par
+\quad\quad\quad$\\{init\_neighbours}(x,y);\ \9 get the color of the
+neighbouring tiles\par
+\quad\quad\quad$\2{if}\\{tile}[x][y]=0\?:$\par
+\quad\quad\quad\quad\quad$\\{handle\_edges}(7)(x,y,0);$\par
+\quad\quad\quad\quad\quad$\\{handle\_edges}(5,6)(x,y,1);$\par
+\quad\quad\quad\quad\quad$\\{handle\_edges}(4)(x,y,2);$\par
+\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad$\\{handle\_edges}(5,6)(x,y,2);$\par
+\quad\quad\quad\quad\quad$\\{handle\_edges}(4,7)(x,y,1);$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\\{complete\_tile}(x,y);$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 Neighbours are initialized in an obvious way.\par
+$\9 The numbering of the neighbours is dual to the numbering\par
+$\9 of edges (see below).\par
+$\9 (commented lines are just given for sake of completeness;\par
+$\9 they are not actually used)\par
+$\9\par
+\BL
+$\2{def}\\{init\_neighbours}(\2{expr}x,y)=$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}7\?:\\{neighbour\_edgecolors}[i]:=-1;%
+\3{endfor};$\par
+\quad\quad\quad$\2{if}x>0\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{neighbour\_edgecolors}[7]:=\\{edge%
+\_color}(x-1,y,2);$\par
+\quad\quad\quad\quad\quad\quad$\\{neighbour\_edgecolors}[6]:=\\{edge%
+\_color}(x-1,y,3);$\par
+\quad\quad\quad$\!\3{fi};$\par
+$\9 $\2{if}x<\\{Nx}-1\?:\\{neighbour\_edgecolors}[2]:=\\{edge%
+\_color}(x+1,y,7);$\par
+$\9 $\\{neighbour\_edgecolors}[3]:=\\{edge\_color}(x+1,y,6);%
+\3{fi};$\par
+\quad\quad\quad$\2{if}y>0\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{neighbour\_edgecolors}[5]:=\\{edge%
+\_color}(x,y-1,0);$\par
+\quad\quad\quad\quad\quad\quad$\\{neighbour\_edgecolors}[4]:=\\{edge%
+\_color}(x,y-1,1);$\par
+\quad\quad\quad$\!\3{fi};$\par
+$\9 $\2{if}y<\\{Ny}-1\?:\\{neighbour\_edgecolors}[0]:=\\{edge%
+\_color}(x,y+1,5);$\par
+$\9 $\\{neighbour\_edgecolors}[1]:=\\{edge\_color}(x,y+1,4);%
+\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 This macro spreads the colors of the neighbours in the list $e$\par
+$\9 onto the part $f$ of tile $[x,y]$.\par
+$\9\par
+$\2{def}\\{handle\_edges}(\2{text}e)(\2{expr}x,y,f)=$\par
+\quad\quad\quad$\2{forsuffixes}s:=e\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{if}\\{neighbour\_edgecolors}[s]>-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][f]:=%
+\\{neighbour\_edgecolors}[s];$\par
+\quad\quad\quad\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 The macro $\\{edge\_color}$ gives the color of an edge, if any.\par
+$\9 There are eight edges, and they are numbered from $0$ to $7$.\par
+$\9\par
+$\9\par
+$\9{\os *0 0 0 1 1 1*\par
+$\9 7 2\par
+$\9 7 2\par
+$\9 7 2\par
+$\9 6 3\par
+$\9 6 3\par
+$\9 6 3\par
+$\9 *5 5 5 4 4 4*}\par
+$\9\par
+$\9\par
+$\2{def}\\{edge\_color}(\2{expr}x,y,e)=$\par
+\quad\quad\quad$\2{if}\\{tile}[x][y]=0\?:$\par
+\quad\quad\quad\quad\quad$\2{if}(e=0)\6{or}(e=7)\?:\\{tilepartcolor}[x][y][0];$%
+\par
+\quad\quad\quad\quad\quad$\2{elseif}(e=3)\6{or}(e=4)\?:%
+\\{tilepartcolor}[x][y][2];$\par
+\quad\quad\quad\quad\quad$\2{else}\?:\\{tilepartcolor}[x][y][1];$\par
+\quad\quad\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad$\2{if}(e=1)\6{or}(e=2)\?:\\{tilepartcolor}[x][y][0];$%
+\par
+\quad\quad\quad\quad\quad$\2{elseif}(e=5)\6{or}(e=6)\?:%
+\\{tilepartcolor}[x][y][2];$\par
+\quad\quad\quad\quad\quad$\2{else}\?:\\{tilepartcolor}[x][y][1];$\par
+\quad\quad\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 Since two colors are enough, as soon as one part of a tile\par
+$\9 is colored, we can immediately color the others.\par
+$\2{def}\\{complete\_tile}(\2{expr}x,y)=$\par
+\quad\quad\quad$\2{if}\\{tilepartcolor}[x][y][0]>-1\?:$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][1]:=1-%
+\\{tilepartcolor}[x][y][0];$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][2]:=%
+\\{tilepartcolor}[x][y][0];$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\2{if}\\{tilepartcolor}[x][y][1]>-1\?:$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][0]:=1-%
+\\{tilepartcolor}[x][y][1];$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][2]:=1-%
+\\{tilepartcolor}[x][y][1];$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\2{if}\\{tilepartcolor}[x][y][2]>-1\?:$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][1]:=1-%
+\\{tilepartcolor}[x][y][2];$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][0]:=%
+\\{tilepartcolor}[x][y][2];$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad\quad$\2{if}\\{tilepartcolor}[x][y][0]=-1\?:\9 this part is only used
+at\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad$\9 the very beginning of a tiling, and\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad$\9 serves as initialization.\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][0]:=0;$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][1]:=1;$\par
+\quad\quad\quad\quad\quad$\\{tilepartcolor}[x][y][2]:=0;$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Computation of tile colors: END\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Drawing of tile colors: BEGINNING\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\9 For each tile, we color the three parts.\par
+$\2{vardef}\\{draw\_coloredparts}(\2{expr}\\{nx},\\{ny})=$\par
+\quad\quad\quad$\2{save}u;$\par
+\quad\quad\quad$u=\\{TilingUnit};$\par
+\quad\quad\quad$\2{for}i:=0\4{upto}\\{nx}-1\?:$\par
+\quad\quad\quad\quad\quad\quad$\2{for}j:=0\4{upto}\\{ny}-1\?:$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{fill%
+\_tilepart}(i,j,1);$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{fill%
+\_tilepart}(i,j,2);$\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\\{fill%
+\_tilepart}(i,j,3);$\par
+\quad\quad\quad\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad\quad$\!\3{endfor};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 $\\{fill\_tilepart}$ fills part $\\{part}$ at position $x$, $y$.\par
+$\2{def}\\{fill\_tilepart}(\2{expr}x,y,\\{part})=$\par
+\quad\quad\quad$\2{if}\\{part}=1\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{colorpart}(x,y,0,-90\ast \\{tile}[x][y],%
+\\{partcolor}(\\{tilepartcolor}[x][y][0]));$\par
+\quad\quad\quad$\2{elseif}\\{part}=2\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{colorpart}(x,y,1,90\ast \\{tile}[x][y],%
+\\{partcolor}(\\{tilepartcolor}[x][y][1]));$\par
+\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{colorpart}(x,y,0,180-90\ast \\{tile}[x][y],%
+\\{partcolor}(\\{tilepartcolor}[x][y][2]));$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$\9 $\\{colorpart}$ colors a part $p$ (0 is corner, 1 is middle)\par
+$\9 at position $x$, $y$, using the fundamental\par
+$\9 $\\{tilepart}[p]$ pattern, rotated by $a$ degrees and colored according to
+$c$.\par
+\BL
+$\2{vardef}\\{colorpart}(\2{expr}x,y,p,a,c)=$\par
+\quad\quad\quad$\2{fill}(\\{tilepart}[p]\6{shifted}(-.5u,-.5u)$\par
+\quad\quad\quad\quad\quad\quad${}\6{rotated}a$\par
+\quad\quad\quad\quad\quad\quad${}\6{shifted}(.5u,.5u)$\par
+\quad\quad\quad\quad\quad\quad${}\6{shifted}((x,y)\ast u))\\{withcolor}(c);$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Drawing of tile colors: END\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9\vfill\eject\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Main definition\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\9 This is the main definition.\par
+$\9 Two cases are considered: either the lines are colored, and the surfaces\par
+$\9 are not filled, or the surfaces are colored, but the lines are not.\par
+\BL
+$\2{vardef}\\{TruchetTiling}(\2{expr}x,y)=$\par
+\quad\quad\quad$\2{save}\\{Nx},\\{Ny};$\par
+\quad\quad\quad$\\{Nx}=x;$\par
+\quad\quad\quad$\\{Ny}=y;$\par
+\quad\quad\quad$\\{init\_tiling}(\\{Nx},\\{Ny});$\par
+\quad\quad\quad$\\{draw\_boundaries}(\\{Nx},\\{Ny});$\par
+\quad\quad\quad$\2{if}\1{not}\\{TruchetTilingFill}\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{define\_basetile}(\\{TilingUnit});$\par
+\quad\quad\quad\quad\quad\quad$\2{numeric}\\{nextcolor},\\{tilecolor}[][][];$%
+\par
+\quad\quad\quad\quad\quad\quad$\\{nextcolor}:=0;$\par
+\quad\quad\quad\quad\quad\quad$\\{compute\_linecolors};\ \9 the colors of the
+lines are computed here,\par
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad%
+\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad$\9 but not drawn;\par
+\quad\quad\quad\quad\quad\quad$\\{draw\_coloredlines}(\\{Nx},\\{Ny});$\par
+\quad\quad\quad$\2{else}\?:$\par
+\quad\quad\quad\quad\quad\quad$\\{define\_basetilepart}(\\{TilingUnit});$\par
+\quad\quad\quad\quad\quad\quad$\2{numeric}\\{tilepartcolor}[][][],\\{neighbour%
+\_edgecolors}[];$\par
+\quad\quad\quad\quad\quad\quad$\\{compute\_partcolors};$\par
+\quad\quad\quad\quad\quad\quad$\\{draw\_coloredparts}(\\{Nx},\\{Ny});$\par
+\quad\quad\quad$\!\3{fi};$\par
+\quad\quad$\!\3{enddef};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 Global variables and default values\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
+$\2{numeric}\\{tile}[][];$\par
+$\2{boolean}\\{TruchetTilingFill};$\par
+$\\{TruchetTilingFill}=\5{false};$\par
+$\2{numeric}\\{TilingUnit},\\{TilingLineWidth};$\par
+$\9 default values\par
+$\\{TilingUnit}:=1\\{cm};$\par
+$\\{TilingLineWidth}:=1\\{mm};$\par
+\BL
+$%
+\9-----------------------------------------------------------------------------%
+\par
+$\9 End of file tiling.mp\par
+$%
+\9-----------------------------------------------------------------------------%
+\par
+\BL
diff --git a/graphics/metapost/contrib/macros/txp/DOCUMENT.pdf b/graphics/metapost/contrib/macros/txp/DOCUMENT.pdf
new file mode 100644
index 0000000000..4a5d7bd0ae
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/DOCUMENT.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/txp/README.txt b/graphics/metapost/contrib/macros/txp/README.txt
new file mode 100644
index 0000000000..bf394eab13
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/README.txt
@@ -0,0 +1,18 @@
+In the file DOCUMENT.ps you will find a detailed description with
+all the details of the construction of TXP. Also you will find
+a general explanation about the way to use it and the small AWK
+routine: gentyp.awk, and a few examples with the last one included
+in this distribution under the name "example.mp" that covers all
+the major items and show how to use it.
+
+One point not really explained clearly is the way to use Computer
+Modern fonts, the standard fonts used by TeX, corresponding to
+"fcmr10".
+The only thing to do when using these fonts is to change the limits of
+the loop in "txp.mp" where it is written: "for j=15 upto 243:",
+to "for j = 1 upto 127:". This is due to the fact that Computer
+Modern are fonts of the type "7", so limited to seven bits.
+Also it must be said that for using the routine gentyp.awk with this
+kind of fonts, it must be modified, but once the file "fcmr10" has
+been obtained (and it is in the distribution) there is no reason to
+use gentyp.awk with this font . \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/txp/example.mp b/graphics/metapost/contrib/macros/txp/example.mp
new file mode 100644
index 0000000000..46cd431da0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/example.mp
@@ -0,0 +1,50 @@
+beginfig(1);
+input txp; u=0.25mm;
+color loc; string s; path a;
+es:=1; ef:=1; hy:=0; tt:=0; sep:=0; loc:=black; lin=0;
+
+input fptmbi8r;
+defaultfont:="ptmbi8r";
+s:="WRITING ON THE PATH IS AMUSING AND EASY...WRITING ON THE PATH IS AMUSING AND EASY...WRITING ON THE PATH IS AMUSING AND EASY...WRITING ON THE PATH IS AMUSING AND EASY...WRITING ON THE PATH IS AMUSING AND EASY...";
+a:=(192u,768.0u).. controls (124u,824.0u) and (128u,904.0u)..(166u,934.0u).. controls (204u,964.0u) and (268u,944.0u)..(320u,886.0u).. controls (372u,828.0u) and (380u,768.0u)..(438u,742.0u).. controls (496u,716.0u) and (584u,752.0u)..(590u,832.0u).. controls (596u,912.0u) and (548u,952.0u)..(504u,974.0u).. controls (460u,996.0u) and (348u,1004.0u)..(294u,938.0u).. controls (240u,872.0u) and (260u,776.0u)..(330u,732.0u).. controls (400u,688.0u) and (660u,676.0u)..(688u,860.0u);
+hy:=-3;sep:=0.2;loc:=blue;ef:=0.8;es:=0.8;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+input fpzcmi8r;
+defaultfont:="pzcmi8r";
+s:="YES !!";
+a:=(400u,850u)--(500u,850u);
+es:=4;hy:=0.;sep:=0.;loc:=red;ef:=1;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+input fphvb8r;
+defaultfont:="phvb8r";
+s:="Although sometimes, it can be cumbersome.";
+a:=(600u,1000u)..(425u,1100u)..(250u,1000u);
+es:=1.3; sep:=.0; loc:=black;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+input fpplbo8r;
+defaultfont:="pplbo8r";
+s:="But, anyway, I like it !! ...";
+a:=(250u,600u)--(600u,600u);
+es:=1.8; sep:=0.3;loc:=green;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+input fphvb8r;
+defaultfont:="phvb8r";
+s:=":-)";
+a:=(400u,500u)--(400u,400u);
+es:=4;hy:=0.;sep:=0.;loc:=red;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+input fphvr8r;
+defaultfont:="phvr8r";
+s:="O";
+a:=(355u,500u)--(390u,500u);
+es:=11;hy:=-5.4;sep:=0.;loc:=blue;
+txp(s,a,es,ef,hy,tt,sep,loc,lin,alt);
+
+
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/txp/example.ps b/graphics/metapost/contrib/macros/txp/example.ps
new file mode 100644
index 0000000000..41df3f2dde
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/example.ps
@@ -0,0 +1,938 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86d Copyright 1999 Radical Eye Software
+%%Title: mproof.dvi
+%%Pages: 1
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentFonts: Times-BoldItalic ZapfChancery-MediumItalic
+%%+ Helvetica-Bold Palatino-Bold Helvetica
+%%DocumentPaperSizes: a4
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips mproof -o
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 2000.09.13:1224
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/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{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+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}
+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{
+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
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: 8r.enc
+% @@psencodingfile@{
+% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry",
+% version = "0.6",
+% date = "1 July 1998",
+% filename = "8r.enc",
+% email = "tex-fonts@@tug.org",
+% docstring = "Encoding for TrueType or Type 1 fonts
+% to be used with TeX."
+% @}
+%
+% Idea is to have all the characters normally included in Type 1 fonts
+% available for typesetting. This is effectively the characters in Adobe
+% Standard Encoding + ISO Latin 1 + extra characters from Lucida.
+%
+% Character code assignments were made as follows:
+%
+% (1) the Windows ANSI characters are almost all in their Windows ANSI
+% positions, because some Windows users cannot easily reencode the
+% fonts, and it makes no difference on other systems. The only Windows
+% ANSI characters not available are those that make no sense for
+% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen
+% (173). quotesingle and grave are moved just because it's such an
+% irritation not having them in TeX positions.
+%
+% (2) Remaining characters are assigned arbitrarily to the lower part
+% of the range, avoiding 0, 10 and 13 in case we meet dumb software.
+%
+% (3) Y&Y Lucida Bright includes some extra text characters; in the
+% hopes that other PostScript fonts, perhaps created for public
+% consumption, will include them, they are included starting at 0x12.
+%
+% (4) Remaining positions left undefined are for use in (hopefully)
+% upward-compatible revisions, if someday more characters are generally
+% available.
+%
+% (5) hyphen appears twice for compatibility with both
+% ASCII and Windows.
+%
+/TeXBase1Encoding [
+% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
+ /.notdef /dotaccent /fi /fl
+ /fraction /hungarumlaut /Lslash /lslash
+ /ogonek /ring /.notdef
+ /breve /minus /.notdef
+% These are the only two remaining unencoded characters, so may as
+% well include them.
+ /Zcaron /zcaron
+% 0x10
+ /caron /dotlessi
+% (unusual TeX characters available in, e.g., Lucida Bright)
+ /dotlessj /ff /ffi /ffl
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ % very contentious; it's so painful not having quoteleft and quoteright
+ % at 96 and 145 that we move the things normally found there to here.
+ /grave /quotesingle
+% 0x20 (ASCII begins)
+ /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef % rubout; ASCII ends
+% 0x80
+ /.notdef /.notdef /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /.notdef /.notdef /Ydieresis
+% 0xA0
+ /.notdef % nobreakspace
+ /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot
+ /hyphen % Y&Y (also at 45); Windows' softhyphen
+ /registered
+ /macron
+% 0xD0
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis
+] def
+
+%%EndProcSet
+%%BeginProcSet: finclude.pro
+%!
+/fstore{dup dict exch{dup 4 2 roll put}repeat def}bind def/fshow{gsave
+72 TeXDict/Resolution get div -72 TeXDict/VResolution get div scale 1
+DVImag div dup scale get cvx exec show grestore}bind def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub
+dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict
+end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{
+dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1
+roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def
+dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}
+if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}
+def end
+
+%%EndProcSet
+%%BeginProcSet: special.pro
+%!
+TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
+/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
+/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
+/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
+/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
+X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
+/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
+/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
+{userdict/md get type/dicttype eq{userdict begin md length 10 add md
+maxlength ge{/md md dup length 20 add dict copy def}if end md begin
+/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
+atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
+itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
+transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
+curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
+pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
+if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
+-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
+yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
+noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
+90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
+neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
+1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
+2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
+-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
+TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
+Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
+}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
+save N userdict maxlength dict begin/magscale true def normalscale
+currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
+/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
+psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
+psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
+TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict
+begin/SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{
+CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N
+/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end}
+repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N
+/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX
+currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY
+moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X
+/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0
+1 startangle endangle arc savematrix setmatrix}N end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (mproof.dvi)
+@start
+%DVIPSBitmapFont: Fa cmr10 10 1
+/Fa 1 50 df<EB01C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C
+3879B72A>49 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmr7 7 14
+/Fb 14 117 df<1238127C12FE12FFA2127F123B1203A31206A3120C1218123812701220
+08127B8613>44 D<EB3F803801FFF03803E0F83807803C48487E001E7F003E1480A2003C
+1307007C14C0A400FC14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A3803E0F8
+6CB45A38003F801B277EA521>48 D<13381378EA01F8121F12FE12E01200B3AB487EB512
+F8A215267BA521>I<13FF000313E0380E03F0381800F848137C48137E00787F12FC6CEB
+1F80A4127CC7FC15005C143E147E147C5C495A495A5C495A010EC7FC5B5B903870018013
+E0EA0180390300030012065A001FB5FC5A485BB5FCA219267DA521>I<13FF000313E038
+0F01F8381C007C0030137E003C133E007E133FA4123CC7123E147E147C5C495AEB07E038
+01FF8091C7FC380001E06D7E147C80143F801580A21238127C12FEA21500485B0078133E
+00705B6C5B381F01F03807FFC0C690C7FC19277DA521>I<1438A2147814F81301A21303
+13071306130C131C131813301370136013C012011380EA03005A120E120C121C5A12305A
+12E0B612E0A2C7EAF800A7497E90383FFFE0A21B277EA621>I<90387F80203903FFF060
+39078078E0380E000E481307481303007813010070130012F0A21560A27E1500127C127F
+EA3FE013FF6C13F06C13FC000313FFC61480010F13C0010013E0EC0FF014031401EC00F8
+A200C01478A46C1470A26C14F06C14E06CEB01C000EFEB078039E3E01F0038C0FFFC3880
+1FF01D2A7DA825>83 D<13FE3807FFC0380F03E0381C00F0003E1378003F137C143C143E
+121EC7FCA3EB3FFEEA01FF3807F03EEA1FC0EA3F00127EA2481418A3147E127EECDF3839
+3F838FF0390FFE0FE03903F807C01D1C7E9A21>97 D<EA0F8012FFA2121F120FAAEB81FC
+EB8FFF9038BC0FC09038F003E09038C001F0EB800015F815FC157CA2157EA7157CA215FC
+15F89038C001F015E090387003C0390E3C0F80390C0FFF00380003F81F297EA725>I<13
+3F3801FFE03803E1F0380F80F8381F007C143E123E007E131E141F127C12FCA2B6FCA200
+FCC7FCA4127C127E1403123E6C1307380F800E3807C01C3803E0783800FFE0EB3F80181C
+7E9A1E>101 D<260F81FC137F3BFF8FFF03FFC0903A9C0F8703E03B1FB007CC01F0D80F
+E013D8903AC003F000F8A301805BAF486C486C487E3CFFF83FFE0FFF80A2311A7E9937>
+109 D<380F81FC38FF8FFF9038BC0FC0391FF007E0390FC003F0EB800115F8EC00FCA215
+7C157EA7157C15FCA2EC01F801C013F0EC03E09038F007C09038BC1F8090388FFF00EB83
+F80180C7FCA7487EEAFFF8A21F257E9925>112 D<380F07C038FF1FF0EB38F8EA1F71EA
+0F6113C1EBC0F014005BAF487EEAFFFCA2151A7E991A>114 D<13C0A41201A312031207
+120F121FB512E0A23807C000AC1430A73803E060A23801F0C03800FF80EB3F0014257FA3
+1A>116 D E
+%EndDVIPSBitmapFont
+/Fc 197[111 12[111 3[111 41[{TeXBase1Encoding ReEncodeFont}3
+332.088 /Helvetica-Bold rf /Fd 176[710 79[{
+TeXBase1Encoding ReEncodeFont}1 913.243 /Helvetica rf
+/Fe 134[83 1[124 1[91 50 5[91 1[50 91 1[50 3[75 3[75
+23[58 6[100 19[37 1[37 10[42 33[{
+.167 SlantFont TeXBase1Encoding ReEncodeFont}15 149.44
+/Palatino-Bold rf /Ff 138[66 36 60 42 2[66 66 96 30 2[30
+66 66 1[60 1[60 66 60 31[78 18[30 1[30 44[{
+TeXBase1Encoding ReEncodeFont}18 107.93 /Helvetica-Bold
+rf /Fg 166[186 5[153 13[206 35[93 33[{TeXBase1Encoding ReEncodeFont}4
+332.088 /ZapfChancery-MediumItalic rf /Fh 166[41 1[59
+1[48 41 37 44 1[41 48 48 59 3[26 52 48 1[44 48 2[44 18[17
+46[{TeXBase1Encoding ReEncodeFont}17 66.4179 /Times-BoldItalic
+rf
+%DVIPSBitmapFont: Fi cmtex10 10 6
+/Fi 6 106 df<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>46
+D<1307497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB5
+12E0B612F0A36C14E01C3477B32C>49 D<EC07F04A7E141F143FA2147EA214FCEB01F8A2
+EB03F0EB07E0A2EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B1207485AA2485A48C7
+FCA2127E5AB712FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E13F027347EB3
+2C>52 D<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA6
+007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>102
+D<ED03F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003
+133E3A0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC
+0FF048B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF80
+4815E04815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E
+007E15FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13
+F8010713C028387EA42C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC0
+80B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>105
+D E
+%EndDVIPSBitmapFont
+(ptmbi8r)cvn 7.97015 /Fh 1 fstore(pzcmi8r)cvn 39.85059
+/Fg 1 fstore(phvb8r)cvn 39.85059 /Fc 12.95163 /Ff 2 fstore(pplbo8r)cvn
+17.9328 /Fe 1 fstore(phvr8r)cvn 109.58911 /Fd 1 fstore
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: a4
+a4
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 166 83 a Fi(fig4.1)633 4176 y @beginspecial 134
+@llx 293 @lly 450 @urx 781 @ury 3160 @rwi @setspecial
+%%BeginDocument: fig4.1
+%!PS
+%%BoundingBox: 134 293 450 781
+%%Creator: MetaPost
+%%CreationDate: 2000.08.28:1448
+%%Pages: 1
+%*Font: ptmbi8r 7.97015 9.96265 2e:80001371ef5
+%*Font: pzcmi8r 39.85059 9.96265 21:800000000800208
+%*Font: phvb8r 12.95163 9.96265 2c:a00004000000075cf3c
+%*Font: pplbo8r 17.9328 9.96265 21:801400004080000088b41a8
+%*Font: phvr8r 109.58911 9.96265 4f:8
+%*Font: phvb8r 39.85059 9.96265 29:88004
+%%EndProlog
+%%Page: 1 1
+ 0 0 1 setrgbcolor
+gsave [-0.74675 0.66512 -0.66512 -0.74675 168.75877 557.49355
+] concat 0 0 moveto
+(W) ptmbi8r 7.97015 fshow grestore
+gsave [-0.69746 0.71663 -0.71663 -0.69746 163.14732 562.518 ] concat 0 0 moveto
+(R) ptmbi8r 7.97015 fshow grestore
+gsave [-0.66 0.75127 -0.75127 -0.66 159.23938 566.54872 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.62144 0.78346 -0.78346 -0.62144 157.01411 569.08917
+] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.57979 0.81477 -0.81477 -0.57979 153.8255 573.12442
+] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.52985 0.8481 -0.8481 -0.52985 151.85878 575.89787 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.45906 0.8884 -0.8884 -0.45906 148.62285 581.1078 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [-0.35355 0.93542 -0.93542 -0.35355 144.96638 588.4939
+] concat 0 0 moveto
+(O) ptmbi8r 7.97015 fshow grestore
+gsave [-0.26773 0.9635 -0.9635 -0.26773 142.82118 594.21703 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.14993 0.9887 -0.9887 -0.14993 140.77873 602.14217 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.05415 0.99854 -0.99854 -0.05415 140.013 607.27814 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.05153 0.99867 -0.99867 0.05153 139.68005 613.78935 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.1903 0.98174 -0.98174 0.1903 140.24327 621.44606 ] concat 0 0 moveto
+(P) ptmbi8r 7.97015 fshow grestore
+gsave [0.29625 0.95511 -0.95511 0.29625 141.22975 626.46619 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.40718 0.91335 -0.91335 0.40718 142.88594 631.75243 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.53236 0.84651 -0.84651 0.53236 144.96588 636.38893 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.68407 0.72943 -0.72943 0.68407 149.64719 643.34155 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.76636 0.64243 -0.64243 0.76636 151.8304 645.66626 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.88576 0.46417 -0.46417 0.88576 157.01483 649.73026 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.95721 0.28937 -0.28937 0.95721 161.87254 652.26569 ] concat 0 0 moveto
+(M) ptmbi8r 7.97015 fshow grestore
+gsave [0.99348 0.11415 -0.11415 0.99348 168.85432 654.35399 ] concat 0 0 moveto
+(U) ptmbi8r 7.97015 fshow grestore
+gsave [0.99994 -0.0112 0.0112 0.99994 174.77577 655.02022 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.99554 -0.09428 0.09428 0.99554 179.38155 654.96039 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.98338 -0.18152 0.18152 0.98338 182.69887 654.64108 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.96014 -0.27948 0.27948 0.96014 188.68118 653.52188 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.92268 -0.38559 0.38559 0.92268 196.53703 651.08218 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.8926 -0.45085 0.45085 0.8926 201.78903 648.87395 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.86038 -0.50966 0.50966 0.86038 207.28908 646.08165 ] concat 0 0 moveto
+(D) ptmbi8r 7.97015 fshow grestore
+gsave [0.81778 -0.57555 0.57555 0.81778 214.3848 641.75627 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.78777 -0.61598 0.61598 0.78777 219.0613 638.45311 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.76042 -0.64943 0.64943 0.76042 223.54626 634.93481 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.73451 -0.67862 0.67862 0.73451 227.1945 631.81061 ] concat 0 0 moveto
+(Y) ptmbi8r 7.97015 fshow grestore
+gsave [0.7155 -0.69861 0.69861 0.7155 230.96516 628.30806 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.70453 -0.70967 0.70967 0.70453 232.50499 626.80287 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.69359 -0.72038 0.72038 0.69359 234.0223 625.27272 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.66878 -0.74347 0.74347 0.66878 235.66734 623.57257 ] concat 0 0 moveto
+(W) ptmbi8r 7.97015 fshow grestore
+gsave [0.63525 -0.77231 0.77231 0.63525 240.74005 617.9152 ] concat 0 0 moveto
+(R) ptmbi8r 7.97015 fshow grestore
+gsave [0.61293 -0.79016 0.79016 0.61293 244.33598 613.53374 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.59256 -0.80553 0.80553 0.59256 246.44044 610.81548 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.57336 -0.8193 0.8193 0.57336 249.52557 606.61385 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.55397 -0.83253 0.83253 0.55397 251.52144 603.75594 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.53278 -0.84625 0.84625 0.53278 254.99008 598.53265 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.51387 -0.85786 0.85786 0.51387 259.47339 591.34833 ] concat 0 0 moveto
+(O) ptmbi8r 7.97015 fshow grestore
+gsave [0.50896 -0.86081 0.86081 0.50896 262.71895 585.92921 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.51657 -0.85625 0.85625 0.51657 267.05191 578.61827 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.53432 -0.84528 0.84528 0.53432 269.88449 573.93544 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.56488 -0.82518 0.82518 0.56488 273.5649 568.14204 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.61957 -0.78494 0.78494 0.61957 278.26183 561.44731 ] concat 0 0 moveto
+(P) ptmbi8r 7.97015 fshow grestore
+gsave [0.66904 -0.74324 0.74324 0.66904 281.70662 557.11865 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.72401 -0.68979 0.68979 0.72401 285.74709 552.67346 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.78528 -0.61914 0.61914 0.78528 289.85782 548.80457 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.85295 -0.522 0.522 0.85295 297.15718 543.31465 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.88568 -0.46428 0.46428 0.88568 300.26552 541.43047 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.9389 -0.34418 0.34418 0.9389 306.91377 538.13612 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.97491 -0.22256 0.22256 0.97491 312.78716 536.03914 ] concat 0 0 moveto
+(M) ptmbi8r 7.97015 fshow grestore
+gsave [0.99478 -0.10225 0.10225 0.99478 320.6108 534.31293 ] concat 0 0 moveto
+(U) ptmbi8r 7.97015 fshow grestore
+gsave [0.99994 -0.01128 0.01128 0.99994 327.05913 533.68524 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.99857 0.05356 -0.05356 0.99857 332.01982 533.64844 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.99185 0.12743 -0.12743 0.99185 335.7344 533.86595 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.97548 0.22017 -0.22017 0.97548 342.22765 534.73785 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.94148 0.33707 -0.33707 0.94148 350.75343 536.85635 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.90729 0.42052 -0.42052 0.90729 356.46909 538.93832 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.86299 0.50523 -0.50523 0.86299 362.40051 541.73024 ] concat 0 0 moveto
+(D) ptmbi8r 7.97015 fshow grestore
+gsave [0.79047 0.61252 -0.61252 0.79047 369.89449 546.35074 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.72864 0.6849 -0.6849 0.72864 374.67227 550.09914 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.66402 0.74771 -0.74771 0.66402 379.0322 554.24367 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.5955 0.80336 -0.80336 0.5955 382.40117 558.0816 ] concat 0 0 moveto
+(Y) ptmbi8r 7.97015 fshow grestore
+gsave [0.54103 0.841 -0.841 0.54103 385.58797 562.40201 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.50803 0.86134 -0.86134 0.50803 386.81937 564.32663 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.47415 0.88045 -0.88045 0.47415 387.97527 566.29759 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.39432 0.91898 -0.91898 0.39432 389.21092 568.65018 ] concat 0 0 moveto
+(W) ptmbi8r 7.97015 fshow grestore
+gsave [0.28183 0.95946 -0.95946 0.28183 392.30542 576.0112 ] concat 0 0 moveto
+(R) ptmbi8r 7.97015 fshow grestore
+gsave [0.2053 0.9787 -0.9787 0.2053 393.94829 581.70145 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.13411 0.99097 -0.99097 0.13411 394.68463 585.29756 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.069 0.99762 -0.99762 0.069 395.39122 590.67615 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.02155 0.99977 -0.99977 0.02155 395.63612 594.32335 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.04572 0.99898 -0.99898 -0.04572 395.75044 600.8118
+] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [-0.1457 0.98933 -0.98933 -0.1457 395.20184 609.55225 ] concat 0 0 moveto
+(O) ptmbi8r 7.97015 fshow grestore
+gsave [-0.22581 0.97418 -0.97418 -0.22581 394.21948 616.00159
+] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.33168 0.94339 -0.94339 -0.33168 392.07953 624.47125
+] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.41223 0.91109 -0.91109 -0.41223 390.1838 629.77087
+] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [-0.49335 0.86983 -0.86983 -0.49335 387.26698 636.12509
+] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [-0.58582 0.81046 -0.81046 -0.58582 383.0388 643.23871
+] concat 0 0 moveto
+(P) ptmbi8r 7.97015 fshow grestore
+gsave [-0.64545 0.76381 -0.76381 -0.64545 379.76253 647.7283
+] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [-0.6985 0.71562 -0.71562 -0.6985 375.87405 652.29185 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.74858 0.66306 -0.66306 -0.74858 371.94804 656.27989
+] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [-0.79874 0.60167 -0.60167 -0.79874 365.08931 662.17296
+] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.82275 0.56839 -0.56839 -0.82275 362.22871 664.31758
+] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [-0.85938 0.51135 -0.51135 -0.85938 356.19452 668.37256
+] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [-0.88554 0.46454 -0.46454 -0.88554 350.97408 671.45892
+] concat 0 0 moveto
+(M) ptmbi8r 7.97015 fshow grestore
+gsave [-0.92644 0.37645 -0.37645 -0.92644 343.90836 675.11945
+] concat 0 0 moveto
+(U) ptmbi8r 7.97015 fshow grestore
+gsave [-0.95215 0.30563 -0.30563 -0.95215 337.93248 677.52359
+] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [-0.96504 0.2621 -0.2621 -0.96504 333.24866 679.01524 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.97621 0.21678 -0.21678 -0.97621 329.71928 679.96367
+] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.98648 0.16388 -0.16388 -0.98648 323.41069 681.34639
+] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [-0.99496 0.10028 -0.10028 -0.99496 314.86201 682.66898
+] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [-0.99847 0.05533 -0.05533 -0.99847 308.91272 683.25447
+] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.99997 0.00888 -0.00888 -0.99997 302.48312 683.59454
+] concat 0 0 moveto
+(D) ptmbi8r 7.97015 fshow grestore
+gsave [-0.9986 -0.05287 0.05287 -0.9986 293.83582 683.5804 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [-0.99518 -0.09799 0.09799 -0.99518 287.88927 683.2509
+] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [-0.99 -0.14098 0.14098 -0.99 282.01439 682.6586 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [-0.98299 -0.18372 0.18372 -0.98299 277.06575 681.94148
+] concat 0 0 moveto
+(Y) ptmbi8r 7.97015 fshow grestore
+gsave [-0.97632 -0.21643 0.21643 -0.97632 271.86343 680.96814
+] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [-0.97176 -0.23598 0.23598 -0.97176 269.67812 680.48111
+] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [-0.9667 -0.25587 0.25587 -0.9667 267.50063 679.94972 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [-0.95308 -0.30272 0.30272 -0.95308 265.02728 679.27806
+] concat 0 0 moveto
+(W) ptmbi8r 7.97015 fshow grestore
+gsave [-0.92899 -0.3701 0.3701 -0.92899 257.5322 676.86305 ] concat 0 0 moveto
+(R) ptmbi8r 7.97015 fshow grestore
+gsave [-0.9085 -0.41794 0.41794 -0.9085 252.09523 674.67822 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.88553 -0.46463 0.46463 -0.88553 248.8076 673.15303
+] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.8588 -0.51233 0.51233 -0.8588 244.03514 670.62943 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [-0.82439 -0.56601 0.56601 -0.82439 240.86974 668.72363
+] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.77197 -0.63567 0.63567 -0.77197 235.50182 664.99586
+] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [-0.68802 -0.7257 0.7257 -0.68802 228.82082 659.25175 ] concat 0 0 moveto
+(O) ptmbi8r 7.97015 fshow grestore
+gsave [-0.6198 -0.78477 0.78477 -0.6198 224.346 654.47795 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [-0.38531 -0.92278 0.92278 -0.38531 212.4287 635.73969
+] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [-0.31001 -0.95073 0.95073 -0.31001 210.29097 630.54874
+] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [-0.2296 -0.97328 0.97328 -0.2296 208.16107 623.90744 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [-0.1291 -0.99165 0.99165 -0.1291 206.41568 615.83562 ] concat 0 0 moveto
+(P) ptmbi8r 7.97015 fshow grestore
+gsave [-0.05663 -0.9984 0.9984 -0.05663 205.72285 610.32803 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.0155 -0.9999 0.9999 0.0155 205.40843 604.33984 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.09302 -0.99567 0.99567 0.09302 205.52162 598.73279 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.18431 -0.98288 0.98288 0.18431 206.52333 589.71649 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.23502 -0.97198 0.97198 0.23502 207.19804 586.179 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.3252 -0.94565 0.94565 0.3252 209.04678 579.08418 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.40378 -0.91484 0.91484 0.40378 211.07205 573.29045 ] concat 0 0 moveto
+(M) ptmbi8r 7.97015 fshow grestore
+gsave [0.48195 -0.87622 0.87622 0.48195 214.31116 566.05008 ] concat 0 0 moveto
+(U) ptmbi8r 7.97015 fshow grestore
+gsave [0.54132 -0.84082 0.84082 0.54132 217.43071 560.43109 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.58363 -0.81203 0.81203 0.58363 220.1117 556.29378 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.6314 -0.77548 0.77548 0.6314 222.2745 553.30786 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.69006 -0.72379 0.72379 0.69006 226.4114 548.2741 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.76033 -0.64957 0.64957 0.76033 232.55507 542.05771 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.80676 -0.59088 0.59088 0.80676 237.16953 538.1502 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.85252 -0.52269 0.52269 0.85252 242.45013 534.3205 ] concat 0 0 moveto
+(D) ptmbi8r 7.97015 fshow grestore
+gsave [0.91498 -0.40353 0.40353 0.91498 250.09352 529.93033 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.93921 -0.34335 0.34335 0.93921 255.59297 527.526 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.95457 -0.29802 0.29802 0.95457 261.15427 525.50711 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.96542 -0.26065 0.26065 0.96542 265.91858 524.0302 ] concat 0 0 moveto
+(Y) ptmbi8r 7.97015 fshow grestore
+gsave [0.97182 -0.23576 0.23576 0.97182 271.0102 522.65288 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.97502 -0.22212 0.22212 0.97502 273.17332 522.12968 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.97792 -0.209 0.209 0.97792 275.34337 521.63687 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.98357 -0.18062 0.18062 0.98357 277.80591 521.12344 ] concat 0 0 moveto
+(W) ptmbi8r 7.97015 fshow grestore
+gsave [0.98952 -0.14458 0.14458 0.98952 285.47331 519.72935 ] concat 0 0 moveto
+(R) ptmbi8r 7.97015 fshow grestore
+gsave [0.9926 -0.12138 0.12138 0.9926 291.20361 518.89868 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.99498 -0.10005 0.10005 0.99498 294.72763 518.47168 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.99686 -0.07925 0.07925 0.99686 300.02065 517.9447 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.9984 -0.05649 0.05649 0.9984 303.6069 517.66362 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.99963 -0.02722 0.02722 0.99963 309.99622 517.31143 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.99992 0.01212 -0.01212 0.99992 318.6096 517.13303 ] concat 0 0 moveto
+(O) ptmbi8r 7.97015 fshow grestore
+gsave [0.99913 0.04167 -0.04167 0.99913 325.01218 517.22021 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.9968 0.07997 -0.07997 0.9968 333.56784 517.63396 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.99394 0.10986 -0.10986 0.99394 339.04608 518.08208 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.98987 0.14194 -0.14194 0.98987 345.85484 518.84613 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.98311 0.1831 -0.1831 0.98311 353.88274 520.05742 ] concat 0 0 moveto
+(P) ptmbi8r 7.97015 fshow grestore
+gsave [0.97685 0.214 -0.214 0.97685 359.24077 521.0645 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.96924 0.24615 -0.24615 0.96924 365.00717 522.33826 ] concat 0 0 moveto
+(T) ptmbi8r 7.97015 fshow grestore
+gsave [0.95924 0.2826 -0.2826 0.95924 370.34778 523.70604 ] concat 0 0 moveto
+(H) ptmbi8r 7.97015 fshow grestore
+gsave [0.94447 0.3286 -0.3286 0.94447 378.93138 526.31837 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.93456 0.35579 -0.35579 0.93456 382.27852 527.4886 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.91316 0.4076 -0.4076 0.91316 389.0195 530.13373 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.88965 0.45665 -0.45665 0.88965 394.55334 532.62354 ] concat 0 0 moveto
+(M) ptmbi8r 7.97015 fshow grestore
+gsave [0.86044 0.50955 -0.50955 0.86044 401.54106 536.24011 ] concat 0 0 moveto
+(U) ptmbi8r 7.97015 fshow grestore
+gsave [0.83337 0.55273 -0.55273 0.83337 407.0251 539.5087 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.81093 0.58516 -0.58516 0.81093 411.10448 542.22748 ] concat 0 0 moveto
+(I) ptmbi8r 7.97015 fshow grestore
+gsave [0.78181 0.62354 -0.62354 0.78181 414.06656 544.37753 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.73943 0.67325 -0.67325 0.73943 419.11943 548.43846 ] concat 0 0 moveto
+(G) ptmbi8r 7.97015 fshow grestore
+gsave [0.67622 0.7367 -0.7367 0.67622 425.47032 554.40414 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.6246 0.78094 -0.78094 0.6246 429.5313 558.86325 ] concat 0 0 moveto
+(N) ptmbi8r 7.97015 fshow grestore
+gsave [0.56697 0.82375 -0.82375 0.56697 433.56963 563.95634 ] concat 0 0 moveto
+(D) ptmbi8r 7.97015 fshow grestore
+gsave [0.48709 0.87335 -0.87335 0.48709 438.39534 571.2209 ] concat 0 0 moveto
+(E) ptmbi8r 7.97015 fshow grestore
+gsave [0.42888 0.90335 -0.90335 0.42888 441.29803 576.47179 ] concat 0 0 moveto
+(A) ptmbi8r 7.97015 fshow grestore
+gsave [0.37521 0.92696 -0.92696 0.37521 443.82938 581.8477 ] concat 0 0 moveto
+(S) ptmbi8r 7.97015 fshow grestore
+gsave [0.32436 0.94592 -0.94592 0.32436 445.70084 586.51294 ] concat 0 0 moveto
+(Y) ptmbi8r 7.97015 fshow grestore
+gsave [0.28743 0.9578 -0.9578 0.28743 447.41934 591.5308 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.2663 0.9639 -0.9639 0.2663 448.06296 593.68507 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+gsave [0.24539 0.96942 -0.96942 0.24539 448.65767 595.84819 ] concat 0 0 moveto
+(.) ptmbi8r 7.97015 fshow grestore
+ 1 0 0 setrgbcolor
+283.46558 602.39932 moveto
+(Y) pzcmi8r 39.85059 fshow
+305.7811 602.41013 moveto
+(E) pzcmi8r 39.85059 fshow
+330.48853 602.4028 moveto
+(S) pzcmi8r 39.85059 fshow
+354.33197 602.4072 moveto
+(!) pzcmi8r 39.85059 fshow
+354.33197 602.4072 moveto
+(!) pzcmi8r 39.85059 fshow
+ 0 setgray
+gsave [-0.53532 0.84465 -0.84465 -0.53532 425.18355 708.65456
+] concat 0 0 moveto
+(A) phvb8r 12.95163 fshow grestore
+gsave [-0.57271 0.81973 -0.81973 -0.57271 420.17928 716.55052
+] concat 0 0 moveto
+(l) phvb8r 12.95163 fshow grestore
+gsave [-0.59503 0.80371 -0.80371 -0.59503 418.11774 719.50334
+] concat 0 0 moveto
+(t) phvb8r 12.95163 fshow grestore
+gsave [-0.62865 0.77768 -0.77768 -0.62865 415.55167 722.96738
+] concat 0 0 moveto
+(h) phvb8r 12.95163 fshow grestore
+gsave [-0.67047 0.74191 -0.74191 -0.67047 410.58156 729.1229
+] concat 0 0 moveto
+(o) phvb8r 12.95163 fshow grestore
+gsave [-0.71028 0.70389 -0.70389 -0.71028 405.27776 734.99292
+] concat 0 0 moveto
+(u) phvb8r 12.95163 fshow grestore
+gsave [-0.74792 0.66376 -0.66376 -0.74792 399.66005 740.56596
+] concat 0 0 moveto
+(g) phvb8r 12.95163 fshow grestore
+gsave [-0.78328 0.62164 -0.62164 -0.78328 393.73663 745.8103
+] concat 0 0 moveto
+(h) phvb8r 12.95163 fshow grestore
+gsave [-0.82904 0.55917 -0.55917 -0.82904 384.63593 752.85516
+] concat 0 0 moveto
+(s) phvb8r 12.95163 fshow grestore
+gsave [-0.85721 0.51492 -0.51492 -0.85721 378.66597 756.88176
+] concat 0 0 moveto
+(o) phvb8r 12.95163 fshow grestore
+gsave [-0.88997 0.45604 -0.45604 -0.88997 371.88559 760.95445
+] concat 0 0 moveto
+(m) phvb8r 12.95163 fshow grestore
+gsave [-0.91766 0.3973 -0.3973 -0.91766 361.64108 766.20442 ] concat 0 0 moveto
+(e) phvb8r 12.95163 fshow grestore
+gsave [-0.93282 0.36032 -0.36032 -0.93282 355.03276 769.0619
+] concat 0 0 moveto
+(t) phvb8r 12.95163 fshow grestore
+gsave [-0.94237 0.33455 -0.33455 -0.94237 351.01091 770.61417
+] concat 0 0 moveto
+(i) phvb8r 12.95163 fshow grestore
+gsave [-0.95863 0.28459 -0.28459 -0.95863 347.61996 771.82233
+] concat 0 0 moveto
+(m) phvb8r 12.95163 fshow grestore
+gsave [-0.97511 0.22165 -0.22165 -0.97511 336.58516 775.09863
+] concat 0 0 moveto
+(e) phvb8r 12.95163 fshow grestore
+gsave [-0.98499 0.17253 -0.17253 -0.98499 329.56493 776.69435
+] concat 0 0 moveto
+(s) phvb8r 12.95163 fshow grestore
+gsave [-0.99077 0.13542 -0.13542 -0.99077 322.47687 777.95033
+] concat 0 0 moveto
+(,) phvb8r 12.95163 fshow grestore
+gsave [-0.9963 0.08568 -0.08568 -0.9963 315.32791 778.81766 ] concat 0 0 moveto
+(i) phvb8r 12.95163 fshow grestore
+gsave [-0.99829 0.05826 -0.05826 -0.99829 311.74342 779.12706
+] concat 0 0 moveto
+(t) phvb8r 12.95163 fshow grestore
+gsave [-0.99997 -0.00652 0.00652 -0.99997 303.8386 779.49281
+] concat 0 0 moveto
+(c) phvb8r 12.95163 fshow grestore
+gsave [-0.9984 -0.05641 0.05641 -0.9984 296.64139 779.44585 ] concat 0 0 moveto
+(a) phvb8r 12.95163 fshow grestore
+gsave [-0.99408 -0.10872 0.10872 -0.99408 289.45131 779.03935
+] concat 0 0 moveto
+(n) phvb8r 12.95163 fshow grestore
+gsave [-0.98218 -0.18788 0.18788 -0.98218 278.02715 777.64125
+] concat 0 0 moveto
+(b) phvb8r 12.95163 fshow grestore
+gsave [-0.97095 -0.23924 0.23924 -0.97095 270.25682 776.15907
+] concat 0 0 moveto
+(e) phvb8r 12.95163 fshow grestore
+gsave [-0.95026 -0.31143 0.31143 -0.95026 259.80614 773.44487
+] concat 0 0 moveto
+(c) phvb8r 12.95163 fshow grestore
+gsave [-0.9326 -0.36087 0.36087 -0.9326 252.96326 771.20308 ] concat 0 0 moveto
+(u) phvb8r 12.95163 fshow grestore
+gsave [-0.90616 -0.42291 0.42291 -0.90616 245.58562 768.34715
+] concat 0 0 moveto
+(m) phvb8r 12.95163 fshow grestore
+gsave [-0.87563 -0.48299 0.48299 -0.87563 235.15881 763.47687
+] concat 0 0 moveto
+(b) phvb8r 12.95163 fshow grestore
+gsave [-0.84909 -0.52823 0.52823 -0.84909 228.22903 759.65923
+] concat 0 0 moveto
+(e) phvb8r 12.95163 fshow grestore
+gsave [-0.8259 -0.5638 0.5638 -0.8259 222.11563 755.85577 ] concat 0 0 moveto
+(r) phvb8r 12.95163 fshow grestore
+gsave [-0.80121 -0.59837 0.59837 -0.80121 217.95547 753.01637
+] concat 0 0 moveto
+(s) phvb8r 12.95163 fshow grestore
+gsave [-0.76872 -0.63959 0.63959 -0.76872 212.18697 748.70842
+] concat 0 0 moveto
+(o) phvb8r 12.95163 fshow grestore
+gsave [-0.7238 -0.68999 0.68999 -0.7238 206.10527 743.64807 ] concat 0 0 moveto
+(m) phvb8r 12.95163 fshow grestore
+gsave [-0.67738 -0.73561 0.73561 -0.67738 197.77432 735.70703
+] concat 0 0 moveto
+(e) phvb8r 12.95163 fshow grestore
+gsave [-0.64929 -0.76053 0.76053 -0.64929 192.88884 730.4162
+] concat 0 0 moveto
+(.) phvb8r 12.95163 fshow grestore
+ 0 1 0 setrgbcolor
+178.06297 425.22058 moveto
+(B) pplbo8r 17.9328 fshow
+191.74077 425.21327 moveto
+(u) pplbo8r 17.9328 fshow
+203.96906 425.21886 moveto
+(t) pplbo8r 17.9328 fshow
+210.72469 425.19719 moveto
+(,) pplbo8r 17.9328 fshow
+221.37099 425.21327 moveto
+(a) pplbo8r 17.9328 fshow
+231.8318 425.21327 moveto
+(n) pplbo8r 17.9328 fshow
+244.3591 425.20471 moveto
+(y) pplbo8r 17.9328 fshow
+256.19756 425.21327 moveto
+(w) pplbo8r 17.9328 fshow
+272.9258 425.21327 moveto
+(a) pplbo8r 17.9328 fshow
+283.31474 425.20471 moveto
+(y) pplbo8r 17.9328 fshow
+294.36978 425.19719 moveto
+(,) pplbo8r 17.9328 fshow
+304.86845 425.22058 moveto
+(I) pplbo8r 17.9328 fshow
+317.97098 425.22182 moveto
+(l) pplbo8r 17.9328 fshow
+324.83638 425.22182 moveto
+(i) pplbo8r 17.9328 fshow
+332.07646 425.22182 moveto
+(k) pplbo8r 17.9328 fshow
+344.52805 425.21327 moveto
+(e) pplbo8r 17.9328 fshow
+359.77272 425.22182 moveto
+(i) pplbo8r 17.9328 fshow
+366.63812 425.21886 moveto
+(t) pplbo8r 17.9328 fshow
+378.5863 425.22058 moveto
+(!) pplbo8r 17.9328 fshow
+384.32011 425.22058 moveto
+(!) pplbo8r 17.9328 fshow
+395.17076 425.2026 moveto
+(.) pplbo8r 17.9328 fshow
+400.3255 425.2026 moveto
+(.) pplbo8r 17.9328 fshow
+405.484 425.2026 moveto
+(.) pplbo8r 17.9328 fshow
+ 1 0 0 setrgbcolor
+gsave [0 -1 1 0 283.50458 354.33197 ] concat 0 0 moveto
+(:) phvb8r 39.85059 fshow grestore
+gsave [0 -1 1 0 283.50671 341.06291 ] concat 0 0 moveto
+(-) phvb8r 39.85059 fshow grestore
+gsave [0 -1 1 0 283.50336 327.79276 ] concat 0 0 moveto
+(\)) phvb8r 39.85059 fshow grestore
+ 0 0 1 setrgbcolor
+251.5757 295.07857 moveto
+(O) phvr8r 109.58911 fshow
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 0 5539 a Fb(Septem)n(b)r(er)19 b(13,)k(2000)f(at)h(1224)
+1528 b Fa(1)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fcmr10 b/graphics/metapost/contrib/macros/txp/fontdata/fcmr10
new file mode 100644
index 0000000000..a1bd2151a5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fcmr10
@@ -0,0 +1,228 @@
+alt[1]=3.41666;
+alt[2]=3.41666;
+alt[3]=3.41666;
+alt[4]=3.41666;
+alt[5]=3.41666;
+alt[6]=3.41666;
+alt[7]=3.41666;
+alt[8]=3.41666;
+alt[9]=3.41666;
+alt[10]=3.41666;
+alt[11]=3.41666;
+alt[12]=3.47222;
+alt[13]=3.47222;
+alt[14]=3.47222;
+alt[15]=3.47222;
+alt[16]=3.47222;
+alt[17]=2.15278;
+alt[18]=1.18055;
+alt[19]=3.47222;
+alt[20]=3.47222;
+alt[21]=3.14236;
+alt[22]=3.47222;
+alt[23]=2.83888;
+alt[24]=2.62153;
+alt[25]=3.47222;
+alt[26]=2.15278;
+alt[27]=2.15278;
+alt[28]=2.15278;
+alt[29]=3.41666;
+alt[30]=3.41666;
+alt[31]=3.41666;
+alt[32]=2.15278;
+alt[33]=3.47222;
+alt[34]=3.47222;
+alt[35]=2.50001;
+alt[36]=3.47222;
+alt[37]=3.47222;
+alt[38]=3.47222;
+alt[39]=3.47222;
+alt[40]=2.5;
+alt[41]=2.5;
+alt[42]=3.75;
+alt[43]=2.5;
+alt[44]=-0.444445;
+alt[45]=2.15278;
+alt[46]=0.52778;
+alt[47]=2.5;
+alt[48]=3.22222;
+alt[49]=3.22222;
+alt[50]=3.22222;
+alt[51]=3.22222;
+alt[52]=3.22222;
+alt[53]=3.22222;
+alt[54]=3.22222;
+alt[55]=3.22222;
+alt[56]=3.22222;
+alt[57]=3.22222;
+alt[58]=2.15278;
+alt[59]=1.18055;
+alt[60]=1.52777;
+alt[61]=2.5;
+alt[62]=1.52777;
+alt[63]=3.47222;
+alt[64]=3.47222;
+alt[65]=3.41666;
+alt[66]=3.41666;
+alt[67]=3.41666;
+alt[68]=3.41666;
+alt[69]=3.41666;
+alt[70]=3.41666;
+alt[71]=3.41666;
+alt[72]=3.41666;
+alt[73]=3.41666;
+alt[74]=3.41666;
+alt[75]=3.41666;
+alt[76]=3.41666;
+alt[77]=3.41666;
+alt[78]=3.41666;
+alt[79]=3.41666;
+alt[80]=3.41666;
+alt[81]=2.44444;
+alt[82]=3.41666;
+alt[83]=3.41666;
+alt[84]=3.41666;
+alt[85]=3.41666;
+alt[86]=3.41666;
+alt[87]=3.41666;
+alt[88]=3.41666;
+alt[89]=3.41666;
+alt[90]=3.41666;
+alt[91]=2.5;
+alt[92]=3.47222;
+alt[93]=2.5;
+alt[94]=3.47222;
+alt[95]=3.33929;
+alt[96]=3.47222;
+alt[97]=2.15278;
+alt[98]=3.47222;
+alt[99]=2.15278;
+alt[100]=3.47222;
+alt[101]=2.15278;
+alt[102]=3.47222;
+alt[103]=1.18055;
+alt[104]=3.47222;
+alt[105]=3.33929;
+alt[106]=2.36707;
+alt[107]=3.47222;
+alt[108]=3.47222;
+alt[109]=2.15278;
+alt[110]=2.15278;
+alt[111]=2.15278;
+alt[112]=1.18055;
+alt[113]=1.18055;
+alt[114]=2.15278;
+alt[115]=2.15278;
+alt[116]=3.0754;
+alt[117]=2.15278;
+alt[118]=2.15278;
+alt[119]=2.15278;
+alt[120]=2.15278;
+alt[121]=1.18055;
+alt[122]=2.15278;
+alt[123]=2.15278;
+alt[124]=2.15278;
+alt[125]=3.47222;
+alt[126]=3.33929;
+alt[127]=3.33929;
+alt[128]=0;
+alt[129]=0;
+alt[130]=0;
+alt[131]=0;
+alt[132]=0;
+alt[133]=0;
+alt[134]=0;
+alt[135]=0;
+alt[136]=0;
+alt[137]=0;
+alt[138]=0;
+alt[139]=0;
+alt[140]=0;
+alt[141]=0;
+alt[142]=0;
+alt[143]=0;
+alt[144]=0;
+alt[145]=0;
+alt[146]=0;
+alt[147]=0;
+alt[148]=0;
+alt[149]=0;
+alt[150]=0;
+alt[151]=0;
+alt[152]=0;
+alt[153]=0;
+alt[154]=0;
+alt[155]=0;
+alt[156]=0;
+alt[157]=0;
+alt[158]=0;
+alt[159]=0;
+alt[160]=0;
+alt[161]=0;
+alt[162]=0;
+alt[163]=0;
+alt[164]=0;
+alt[165]=0;
+alt[166]=0;
+alt[167]=0;
+alt[168]=0;
+alt[169]=0;
+alt[170]=0;
+alt[171]=0;
+alt[172]=0;
+alt[173]=0;
+alt[174]=0;
+alt[175]=0;
+alt[176]=0;
+alt[177]=0;
+alt[178]=0;
+alt[179]=0;
+alt[180]=0;
+alt[181]=0;
+alt[182]=0;
+alt[183]=0;
+alt[184]=0;
+alt[185]=0;
+alt[186]=0;
+alt[187]=0;
+alt[188]=0;
+alt[189]=0;
+alt[190]=0;
+alt[191]=0;
+alt[192]=0;
+alt[193]=0;
+alt[194]=0;
+alt[195]=0;
+alt[196]=0;
+alt[197]=0;
+alt[198]=0;
+alt[199]=0;
+alt[200]=0;
+alt[201]=0;
+alt[202]=0;
+alt[203]=0;
+alt[204]=0;
+alt[205]=0;
+alt[206]=0;
+alt[207]=0;
+alt[208]=0;
+alt[209]=0;
+alt[210]=0;
+alt[211]=0;
+alt[212]=0;
+alt[213]=0;
+alt[214]=0;
+alt[215]=0;
+alt[216]=0;
+alt[217]=0;
+alt[218]=0;
+alt[219]=0;
+alt[220]=0;
+alt[221]=0;
+alt[222]=0;
+alt[223]=0;
+alt[224]=0;
+alt[225]=0;
+alt[226]=0;
+alt[227]=0;
+alt[228]=0;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fphvb8r b/graphics/metapost/contrib/macros/txp/fontdata/fphvb8r
new file mode 100644
index 0000000000..a15aabf61b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fphvb8r
@@ -0,0 +1,229 @@
+alt[15]:=3.60998;
+alt[16]:=3.60998;
+alt[17]:=3.60998;
+alt[18]:=3.53998;
+alt[19]:=6.73746;
+alt[20]:=3.60998;
+alt[21]:=3.60998;
+alt[22]:=-1.08746;
+alt[23]:=3.87748;
+alt[24]:=3.7175;
+alt[25]:=2.66495;
+alt[26]:=4.62747;
+alt[27]:=3.7175;
+alt[28]:=3.7175;
+alt[29]:=2.60998;
+alt[30]:=3.7175;
+alt[31]:=5.80994;
+alt[32]:=0;
+alt[33]:=3.60998;
+alt[34]:=5.80994;
+alt[35]:=3.43998;
+alt[36]:=3.22501;
+alt[37]:=3.53998;
+alt[38]:=3.53998;
+alt[39]:=5.80994;
+alt[40]:=2.52253;
+alt[41]:=2.52253;
+alt[42]:=5.54499;
+alt[43]:=2.47498;
+alt[44]:=-0.227505;
+alt[45]:=2.75745;
+alt[46]:=0.682465;
+alt[47]:=3.64749;
+alt[48]:=3.53998;
+alt[49]:=3.60998;
+alt[50]:=3.60998;
+alt[51]:=3.53998;
+alt[52]:=3.60998;
+alt[53]:=3.36997;
+alt[54]:=3.53998;
+alt[55]:=3.43998;
+alt[56]:=3.53998;
+alt[57]:=3.53998;
+alt[58]:=2.60998;
+alt[59]:=1.70002;
+alt[60]:=2.53998;
+alt[61]:=2.58246;
+alt[62]:=2.53998;
+alt[63]:=3.60998;
+alt[64]:=3.64749;
+alt[65]:=3.60998;
+alt[66]:=3.60998;
+alt[67]:=3.64749;
+alt[68]:=3.60998;
+alt[69]:=3.60998;
+alt[70]:=3.60998;
+alt[71]:=3.64749;
+alt[72]:=3.60998;
+alt[73]:=3.60998;
+alt[74]:=3.53998;
+alt[75]:=3.60998;
+alt[76]:=3.60998;
+alt[77]:=3.60998;
+alt[78]:=3.60998;
+alt[79]:=3.64749;
+alt[80]:=3.60998;
+alt[81]:=3.48255;
+alt[82]:=3.60998;
+alt[83]:=3.64749;
+alt[84]:=3.60998;
+alt[85]:=3.53998;
+alt[86]:=3.60998;
+alt[87]:=3.60998;
+alt[88]:=3.60998;
+alt[89]:=3.60998;
+alt[90]:=3.60998;
+alt[91]:=2.70001;
+alt[92]:=3.64749;
+alt[93]:=2.70001;
+alt[94]:=5.01246;
+alt[95]:=-1.02746;
+alt[96]:=5.80994;
+alt[97]:=2.69497;
+alt[98]:=3.53998;
+alt[99]:=2.69497;
+alt[100]:=3.53998;
+alt[101]:=2.69497;
+alt[102]:=3.60998;
+alt[103]:=1.67752;
+alt[104]:=3.60998;
+alt[105]:=3.60998;
+alt[106]:=2.52253;
+alt[107]:=3.60998;
+alt[108]:=3.60998;
+alt[109]:=2.76498;
+alt[110]:=2.76498;
+alt[111]:=2.69497;
+alt[112]:=1.67752;
+alt[113]:=1.67752;
+alt[114]:=2.76498;
+alt[115]:=2.69497;
+alt[116]:=3.36997;
+alt[117]:=2.53998;
+alt[118]:=2.60998;
+alt[119]:=2.60998;
+alt[120]:=2.60998;
+alt[121]:=1.52253;
+alt[122]:=2.60998;
+alt[123]:=2.70001;
+alt[124]:=3.64749;
+alt[125]:=2.70001;
+alt[126]:=2.51242;
+alt[127]:=0.03;
+alt[128]:=2.63004;
+alt[129]:=0.03;
+alt[130]:=0.682465;
+alt[131]:=2.70001;
+alt[132]:=2.70001;
+alt[133]:=3.7175;
+alt[134]:=3.53998;
+alt[135]:=4.55746;
+alt[136]:=2.85492;
+alt[137]:=3.64749;
+alt[138]:=5.80994;
+alt[139]:=5.80994;
+alt[140]:=3.52496;
+alt[141]:=2.66495;
+alt[142]:=2.66495;
+alt[143]:=3.7175;
+alt[144]:=5.18247;
+alt[145]:=3.64749;
+alt[146]:=2.85492;
+alt[147]:=2.69497;
+alt[148]:=4.62747;
+alt[149]:=1.70002;
+alt[150]:=2.5075;
+alt[151]:=3.53998;
+alt[152]:=3.53991;
+alt[153]:=3.43998;
+alt[154]:=3.64749;
+alt[155]:=2.70001;
+alt[156]:=3.60998;
+alt[157]:=3.64749;
+alt[158]:=5.10248;
+alt[159]:=2.85492;
+alt[160]:=2.58246;
+alt[161]:=1.69748;
+alt[162]:=3.64749;
+alt[163]:=3.43998;
+alt[164]:=5.80994;
+alt[165]:=2.47498;
+alt[166]:=4.99497;
+alt[167]:=4.99497;
+alt[168]:=3.7175;
+alt[169]:=1.52253;
+alt[170]:=2.53001;
+alt[171]:=2.61246;
+alt[172]:=-1.08746;
+alt[173]:=4.99497;
+alt[174]:=5.10248;
+alt[175]:=2.85492;
+alt[176]:=3.53998;
+alt[177]:=3.53998;
+alt[178]:=3.53998;
+alt[179]:=1.70002;
+alt[180]:=4.62747;
+alt[181]:=4.62747;
+alt[182]:=4.62747;
+alt[183]:=4.62747;
+alt[184]:=4.62747;
+alt[185]:=4.81;
+alt[186]:=3.60998;
+alt[187]:=2.63004;
+alt[188]:=4.62747;
+alt[189]:=4.62747;
+alt[190]:=4.62747;
+alt[191]:=4.62747;
+alt[192]:=4.62747;
+alt[193]:=4.62747;
+alt[194]:=4.62747;
+alt[195]:=4.62747;
+alt[196]:=3.60998;
+alt[197]:=4.62747;
+alt[198]:=4.55746;
+alt[199]:=4.55746;
+alt[200]:=4.55746;
+alt[201]:=4.55746;
+alt[202]:=4.55746;
+alt[203]:=2.40497;
+alt[204]:=3.64749;
+alt[205]:=4.55746;
+alt[206]:=4.55746;
+alt[207]:=4.55746;
+alt[208]:=4.55746;
+alt[209]:=4.62747;
+alt[210]:=3.60998;
+alt[211]:=3.53998;
+alt[212]:=3.64749;
+alt[213]:=3.64749;
+alt[214]:=3.64749;
+alt[215]:=3.64749;
+alt[216]:=3.53998;
+alt[217]:=3.80747;
+alt[218]:=2.69497;
+alt[219]:=1.67752;
+alt[220]:=3.64749;
+alt[221]:=3.64749;
+alt[222]:=3.64749;
+alt[223]:=3.53998;
+alt[224]:=3.7175;
+alt[225]:=3.7175;
+alt[226]:=3.7175;
+alt[227]:=3.60998;
+alt[228]:=3.64749;
+alt[229]:=3.7175;
+alt[230]:=3.64749;
+alt[231]:=3.64749;
+alt[232]:=3.64749;
+alt[233]:=3.64749;
+alt[234]:=3.53998;
+alt[235]:=2.53003;
+alt[236]:=2.69497;
+alt[237]:=3.64749;
+alt[238]:=3.64749;
+alt[239]:=3.64749;
+alt[240]:=3.53998;
+alt[241]:=2.63004;
+alt[242]:=2.52253;
+alt[243]:=2.52253;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fphvbo8r b/graphics/metapost/contrib/macros/txp/fontdata/fphvbo8r
new file mode 100644
index 0000000000..a15aabf61b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fphvbo8r
@@ -0,0 +1,229 @@
+alt[15]:=3.60998;
+alt[16]:=3.60998;
+alt[17]:=3.60998;
+alt[18]:=3.53998;
+alt[19]:=6.73746;
+alt[20]:=3.60998;
+alt[21]:=3.60998;
+alt[22]:=-1.08746;
+alt[23]:=3.87748;
+alt[24]:=3.7175;
+alt[25]:=2.66495;
+alt[26]:=4.62747;
+alt[27]:=3.7175;
+alt[28]:=3.7175;
+alt[29]:=2.60998;
+alt[30]:=3.7175;
+alt[31]:=5.80994;
+alt[32]:=0;
+alt[33]:=3.60998;
+alt[34]:=5.80994;
+alt[35]:=3.43998;
+alt[36]:=3.22501;
+alt[37]:=3.53998;
+alt[38]:=3.53998;
+alt[39]:=5.80994;
+alt[40]:=2.52253;
+alt[41]:=2.52253;
+alt[42]:=5.54499;
+alt[43]:=2.47498;
+alt[44]:=-0.227505;
+alt[45]:=2.75745;
+alt[46]:=0.682465;
+alt[47]:=3.64749;
+alt[48]:=3.53998;
+alt[49]:=3.60998;
+alt[50]:=3.60998;
+alt[51]:=3.53998;
+alt[52]:=3.60998;
+alt[53]:=3.36997;
+alt[54]:=3.53998;
+alt[55]:=3.43998;
+alt[56]:=3.53998;
+alt[57]:=3.53998;
+alt[58]:=2.60998;
+alt[59]:=1.70002;
+alt[60]:=2.53998;
+alt[61]:=2.58246;
+alt[62]:=2.53998;
+alt[63]:=3.60998;
+alt[64]:=3.64749;
+alt[65]:=3.60998;
+alt[66]:=3.60998;
+alt[67]:=3.64749;
+alt[68]:=3.60998;
+alt[69]:=3.60998;
+alt[70]:=3.60998;
+alt[71]:=3.64749;
+alt[72]:=3.60998;
+alt[73]:=3.60998;
+alt[74]:=3.53998;
+alt[75]:=3.60998;
+alt[76]:=3.60998;
+alt[77]:=3.60998;
+alt[78]:=3.60998;
+alt[79]:=3.64749;
+alt[80]:=3.60998;
+alt[81]:=3.48255;
+alt[82]:=3.60998;
+alt[83]:=3.64749;
+alt[84]:=3.60998;
+alt[85]:=3.53998;
+alt[86]:=3.60998;
+alt[87]:=3.60998;
+alt[88]:=3.60998;
+alt[89]:=3.60998;
+alt[90]:=3.60998;
+alt[91]:=2.70001;
+alt[92]:=3.64749;
+alt[93]:=2.70001;
+alt[94]:=5.01246;
+alt[95]:=-1.02746;
+alt[96]:=5.80994;
+alt[97]:=2.69497;
+alt[98]:=3.53998;
+alt[99]:=2.69497;
+alt[100]:=3.53998;
+alt[101]:=2.69497;
+alt[102]:=3.60998;
+alt[103]:=1.67752;
+alt[104]:=3.60998;
+alt[105]:=3.60998;
+alt[106]:=2.52253;
+alt[107]:=3.60998;
+alt[108]:=3.60998;
+alt[109]:=2.76498;
+alt[110]:=2.76498;
+alt[111]:=2.69497;
+alt[112]:=1.67752;
+alt[113]:=1.67752;
+alt[114]:=2.76498;
+alt[115]:=2.69497;
+alt[116]:=3.36997;
+alt[117]:=2.53998;
+alt[118]:=2.60998;
+alt[119]:=2.60998;
+alt[120]:=2.60998;
+alt[121]:=1.52253;
+alt[122]:=2.60998;
+alt[123]:=2.70001;
+alt[124]:=3.64749;
+alt[125]:=2.70001;
+alt[126]:=2.51242;
+alt[127]:=0.03;
+alt[128]:=2.63004;
+alt[129]:=0.03;
+alt[130]:=0.682465;
+alt[131]:=2.70001;
+alt[132]:=2.70001;
+alt[133]:=3.7175;
+alt[134]:=3.53998;
+alt[135]:=4.55746;
+alt[136]:=2.85492;
+alt[137]:=3.64749;
+alt[138]:=5.80994;
+alt[139]:=5.80994;
+alt[140]:=3.52496;
+alt[141]:=2.66495;
+alt[142]:=2.66495;
+alt[143]:=3.7175;
+alt[144]:=5.18247;
+alt[145]:=3.64749;
+alt[146]:=2.85492;
+alt[147]:=2.69497;
+alt[148]:=4.62747;
+alt[149]:=1.70002;
+alt[150]:=2.5075;
+alt[151]:=3.53998;
+alt[152]:=3.53991;
+alt[153]:=3.43998;
+alt[154]:=3.64749;
+alt[155]:=2.70001;
+alt[156]:=3.60998;
+alt[157]:=3.64749;
+alt[158]:=5.10248;
+alt[159]:=2.85492;
+alt[160]:=2.58246;
+alt[161]:=1.69748;
+alt[162]:=3.64749;
+alt[163]:=3.43998;
+alt[164]:=5.80994;
+alt[165]:=2.47498;
+alt[166]:=4.99497;
+alt[167]:=4.99497;
+alt[168]:=3.7175;
+alt[169]:=1.52253;
+alt[170]:=2.53001;
+alt[171]:=2.61246;
+alt[172]:=-1.08746;
+alt[173]:=4.99497;
+alt[174]:=5.10248;
+alt[175]:=2.85492;
+alt[176]:=3.53998;
+alt[177]:=3.53998;
+alt[178]:=3.53998;
+alt[179]:=1.70002;
+alt[180]:=4.62747;
+alt[181]:=4.62747;
+alt[182]:=4.62747;
+alt[183]:=4.62747;
+alt[184]:=4.62747;
+alt[185]:=4.81;
+alt[186]:=3.60998;
+alt[187]:=2.63004;
+alt[188]:=4.62747;
+alt[189]:=4.62747;
+alt[190]:=4.62747;
+alt[191]:=4.62747;
+alt[192]:=4.62747;
+alt[193]:=4.62747;
+alt[194]:=4.62747;
+alt[195]:=4.62747;
+alt[196]:=3.60998;
+alt[197]:=4.62747;
+alt[198]:=4.55746;
+alt[199]:=4.55746;
+alt[200]:=4.55746;
+alt[201]:=4.55746;
+alt[202]:=4.55746;
+alt[203]:=2.40497;
+alt[204]:=3.64749;
+alt[205]:=4.55746;
+alt[206]:=4.55746;
+alt[207]:=4.55746;
+alt[208]:=4.55746;
+alt[209]:=4.62747;
+alt[210]:=3.60998;
+alt[211]:=3.53998;
+alt[212]:=3.64749;
+alt[213]:=3.64749;
+alt[214]:=3.64749;
+alt[215]:=3.64749;
+alt[216]:=3.53998;
+alt[217]:=3.80747;
+alt[218]:=2.69497;
+alt[219]:=1.67752;
+alt[220]:=3.64749;
+alt[221]:=3.64749;
+alt[222]:=3.64749;
+alt[223]:=3.53998;
+alt[224]:=3.7175;
+alt[225]:=3.7175;
+alt[226]:=3.7175;
+alt[227]:=3.60998;
+alt[228]:=3.64749;
+alt[229]:=3.7175;
+alt[230]:=3.64749;
+alt[231]:=3.64749;
+alt[232]:=3.64749;
+alt[233]:=3.64749;
+alt[234]:=3.53998;
+alt[235]:=2.53003;
+alt[236]:=2.69497;
+alt[237]:=3.64749;
+alt[238]:=3.64749;
+alt[239]:=3.64749;
+alt[240]:=3.53998;
+alt[241]:=2.63004;
+alt[242]:=2.52253;
+alt[243]:=2.52253;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fphvr8r b/graphics/metapost/contrib/macros/txp/fontdata/fphvr8r
new file mode 100644
index 0000000000..aaf3ae0737
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fphvr8r
@@ -0,0 +1,229 @@
+alt[15]:=3.56247;
+alt[16]:=3.655;
+alt[17]:=3.655;
+alt[18]:=3.4725;
+alt[19]:=6.61996;
+alt[20]:=3.56247;
+alt[21]:=3.56247;
+alt[22]:=-1.06498;
+alt[23]:=3.82748;
+alt[24]:=3.655;
+alt[25]:=2.5849;
+alt[26]:=4.64996;
+alt[27]:=3.655;
+alt[28]:=3.655;
+alt[29]:=2.66999;
+alt[30]:=3.655;
+alt[31]:=5.89493;
+alt[32]:=0;
+alt[33]:=3.56247;
+alt[34]:=5.89493;
+alt[35]:=3.39245;
+alt[36]:=3.22751;
+alt[37]:=3.4725;
+alt[38]:=3.4725;
+alt[39]:=5.89493;
+alt[40]:=2.59002;
+alt[41]:=2.59002;
+alt[42]:=5.66746;
+alt[43]:=2.52997;
+alt[44]:=-0.235015;
+alt[45]:=2.7374;
+alt[46]:=0.52997;
+alt[47]:=3.56503;
+alt[48]:=3.4725;
+alt[49]:=3.56247;
+alt[50]:=3.56247;
+alt[51]:=3.4725;
+alt[52]:=3.56247;
+alt[53]:=3.30248;
+alt[54]:=3.4725;
+alt[55]:=3.39245;
+alt[56]:=3.4725;
+alt[57]:=3.4725;
+alt[58]:=2.52997;
+alt[59]:=1.76499;
+alt[60]:=2.53998;
+alt[61]:=2.48493;
+alt[62]:=2.53998;
+alt[63]:=3.655;
+alt[64]:=3.56503;
+alt[65]:=3.56247;
+alt[66]:=3.56247;
+alt[67]:=3.56503;
+alt[68]:=3.56247;
+alt[69]:=3.56247;
+alt[70]:=3.56247;
+alt[71]:=3.56503;
+alt[72]:=3.56247;
+alt[73]:=3.56247;
+alt[74]:=3.4725;
+alt[75]:=3.56247;
+alt[76]:=3.56247;
+alt[77]:=3.56247;
+alt[78]:=3.56247;
+alt[79]:=3.56503;
+alt[80]:=3.56247;
+alt[81]:=3.37503;
+alt[82]:=3.56247;
+alt[83]:=3.56503;
+alt[84]:=3.56247;
+alt[85]:=3.4725;
+alt[86]:=3.56247;
+alt[87]:=3.56247;
+alt[88]:=3.56247;
+alt[89]:=3.56247;
+alt[90]:=3.56247;
+alt[91]:=2.63998;
+alt[92]:=3.56503;
+alt[93]:=2.63998;
+alt[94]:=4.75492;
+alt[95]:=-0.974975;
+alt[96]:=5.98746;
+alt[97]:=2.58002;
+alt[98]:=3.4725;
+alt[99]:=2.58002;
+alt[100]:=3.4725;
+alt[101]:=2.58002;
+alt[102]:=3.655;
+alt[103]:=1.60501;
+alt[104]:=3.56247;
+alt[105]:=3.56247;
+alt[106]:=2.49749;
+alt[107]:=3.56247;
+alt[108]:=3.56247;
+alt[109]:=2.66999;
+alt[110]:=2.66999;
+alt[111]:=2.58002;
+alt[112]:=1.60501;
+alt[113]:=1.60501;
+alt[114]:=2.66999;
+alt[115]:=2.58002;
+alt[116]:=3.40247;
+alt[117]:=2.58002;
+alt[118]:=2.66999;
+alt[119]:=2.66999;
+alt[120]:=2.66999;
+alt[121]:=1.60501;
+alt[122]:=2.66999;
+alt[123]:=2.63998;
+alt[124]:=3.56503;
+alt[125]:=2.63998;
+alt[126]:=2.5524;
+alt[127]:=-0.235015;
+alt[128]:=2.59002;
+alt[129]:=-0.235015;
+alt[130]:=0.52997;
+alt[131]:=2.79748;
+alt[132]:=2.79748;
+alt[133]:=3.655;
+alt[134]:=3.4725;
+alt[135]:=4.55999;
+alt[136]:=2.76495;
+alt[137]:=3.56503;
+alt[138]:=5.98746;
+alt[139]:=5.89493;
+alt[140]:=3.48493;
+alt[141]:=2.7374;
+alt[142]:=2.7374;
+alt[143]:=3.56247;
+alt[144]:=5.08743;
+alt[145]:=3.56503;
+alt[146]:=2.76495;
+alt[147]:=2.58002;
+alt[148]:=4.54495;
+alt[149]:=1.7475;
+alt[150]:=2.465;
+alt[151]:=3.4725;
+alt[152]:=3.59995;
+alt[153]:=3.39245;
+alt[154]:=3.56503;
+alt[155]:=2.73251;
+alt[156]:=3.56247;
+alt[157]:=3.56503;
+alt[158]:=5.17996;
+alt[159]:=2.76495;
+alt[160]:=2.48493;
+alt[161]:=1.59745;
+alt[162]:=3.56503;
+alt[163]:=3.39245;
+alt[164]:=5.66746;
+alt[165]:=2.52997;
+alt[166]:=4.92493;
+alt[167]:=4.92493;
+alt[168]:=3.655;
+alt[169]:=1.60501;
+alt[170]:=2.63998;
+alt[171]:=2.5524;
+alt[172]:=-1.06498;
+alt[173]:=4.92493;
+alt[174]:=5.17996;
+alt[175]:=2.76495;
+alt[176]:=3.4725;
+alt[177]:=3.4725;
+alt[178]:=3.4725;
+alt[179]:=1.60501;
+alt[180]:=4.64996;
+alt[181]:=4.64996;
+alt[182]:=4.64996;
+alt[183]:=4.54495;
+alt[184]:=4.54495;
+alt[185]:=4.64996;
+alt[186]:=3.56247;
+alt[187]:=2.59002;
+alt[188]:=4.64996;
+alt[189]:=4.64996;
+alt[190]:=4.64996;
+alt[191]:=4.54495;
+alt[192]:=4.64996;
+alt[193]:=4.64996;
+alt[194]:=4.64996;
+alt[195]:=4.54495;
+alt[196]:=3.56247;
+alt[197]:=4.54495;
+alt[198]:=4.55999;
+alt[199]:=4.55999;
+alt[200]:=4.55999;
+alt[201]:=4.45498;
+alt[202]:=4.45498;
+alt[203]:=2.52997;
+alt[204]:=3.56503;
+alt[205]:=4.55999;
+alt[206]:=4.55999;
+alt[207]:=4.55999;
+alt[208]:=4.45498;
+alt[209]:=4.64996;
+alt[210]:=3.56247;
+alt[211]:=3.56503;
+alt[212]:=3.56503;
+alt[213]:=3.56503;
+alt[214]:=3.56503;
+alt[215]:=3.4725;
+alt[216]:=3.4725;
+alt[217]:=3.73752;
+alt[218]:=2.58002;
+alt[219]:=1.60501;
+alt[220]:=3.56503;
+alt[221]:=3.56503;
+alt[222]:=3.56503;
+alt[223]:=3.4725;
+alt[224]:=3.655;
+alt[225]:=3.655;
+alt[226]:=3.655;
+alt[227]:=3.56247;
+alt[228]:=3.56503;
+alt[229]:=3.56247;
+alt[230]:=3.56503;
+alt[231]:=3.56503;
+alt[232]:=3.56503;
+alt[233]:=3.4725;
+alt[234]:=3.4725;
+alt[235]:=2.58002;
+alt[236]:=2.58002;
+alt[237]:=3.56503;
+alt[238]:=3.56503;
+alt[239]:=3.56503;
+alt[240]:=3.4725;
+alt[241]:=2.59002;
+alt[242]:=2.49749;
+alt[243]:=2.49749;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fphvro8r b/graphics/metapost/contrib/macros/txp/fontdata/fphvro8r
new file mode 100644
index 0000000000..aaf3ae0737
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fphvro8r
@@ -0,0 +1,229 @@
+alt[15]:=3.56247;
+alt[16]:=3.655;
+alt[17]:=3.655;
+alt[18]:=3.4725;
+alt[19]:=6.61996;
+alt[20]:=3.56247;
+alt[21]:=3.56247;
+alt[22]:=-1.06498;
+alt[23]:=3.82748;
+alt[24]:=3.655;
+alt[25]:=2.5849;
+alt[26]:=4.64996;
+alt[27]:=3.655;
+alt[28]:=3.655;
+alt[29]:=2.66999;
+alt[30]:=3.655;
+alt[31]:=5.89493;
+alt[32]:=0;
+alt[33]:=3.56247;
+alt[34]:=5.89493;
+alt[35]:=3.39245;
+alt[36]:=3.22751;
+alt[37]:=3.4725;
+alt[38]:=3.4725;
+alt[39]:=5.89493;
+alt[40]:=2.59002;
+alt[41]:=2.59002;
+alt[42]:=5.66746;
+alt[43]:=2.52997;
+alt[44]:=-0.235015;
+alt[45]:=2.7374;
+alt[46]:=0.52997;
+alt[47]:=3.56503;
+alt[48]:=3.4725;
+alt[49]:=3.56247;
+alt[50]:=3.56247;
+alt[51]:=3.4725;
+alt[52]:=3.56247;
+alt[53]:=3.30248;
+alt[54]:=3.4725;
+alt[55]:=3.39245;
+alt[56]:=3.4725;
+alt[57]:=3.4725;
+alt[58]:=2.52997;
+alt[59]:=1.76499;
+alt[60]:=2.53998;
+alt[61]:=2.48493;
+alt[62]:=2.53998;
+alt[63]:=3.655;
+alt[64]:=3.56503;
+alt[65]:=3.56247;
+alt[66]:=3.56247;
+alt[67]:=3.56503;
+alt[68]:=3.56247;
+alt[69]:=3.56247;
+alt[70]:=3.56247;
+alt[71]:=3.56503;
+alt[72]:=3.56247;
+alt[73]:=3.56247;
+alt[74]:=3.4725;
+alt[75]:=3.56247;
+alt[76]:=3.56247;
+alt[77]:=3.56247;
+alt[78]:=3.56247;
+alt[79]:=3.56503;
+alt[80]:=3.56247;
+alt[81]:=3.37503;
+alt[82]:=3.56247;
+alt[83]:=3.56503;
+alt[84]:=3.56247;
+alt[85]:=3.4725;
+alt[86]:=3.56247;
+alt[87]:=3.56247;
+alt[88]:=3.56247;
+alt[89]:=3.56247;
+alt[90]:=3.56247;
+alt[91]:=2.63998;
+alt[92]:=3.56503;
+alt[93]:=2.63998;
+alt[94]:=4.75492;
+alt[95]:=-0.974975;
+alt[96]:=5.98746;
+alt[97]:=2.58002;
+alt[98]:=3.4725;
+alt[99]:=2.58002;
+alt[100]:=3.4725;
+alt[101]:=2.58002;
+alt[102]:=3.655;
+alt[103]:=1.60501;
+alt[104]:=3.56247;
+alt[105]:=3.56247;
+alt[106]:=2.49749;
+alt[107]:=3.56247;
+alt[108]:=3.56247;
+alt[109]:=2.66999;
+alt[110]:=2.66999;
+alt[111]:=2.58002;
+alt[112]:=1.60501;
+alt[113]:=1.60501;
+alt[114]:=2.66999;
+alt[115]:=2.58002;
+alt[116]:=3.40247;
+alt[117]:=2.58002;
+alt[118]:=2.66999;
+alt[119]:=2.66999;
+alt[120]:=2.66999;
+alt[121]:=1.60501;
+alt[122]:=2.66999;
+alt[123]:=2.63998;
+alt[124]:=3.56503;
+alt[125]:=2.63998;
+alt[126]:=2.5524;
+alt[127]:=-0.235015;
+alt[128]:=2.59002;
+alt[129]:=-0.235015;
+alt[130]:=0.52997;
+alt[131]:=2.79748;
+alt[132]:=2.79748;
+alt[133]:=3.655;
+alt[134]:=3.4725;
+alt[135]:=4.55999;
+alt[136]:=2.76495;
+alt[137]:=3.56503;
+alt[138]:=5.98746;
+alt[139]:=5.89493;
+alt[140]:=3.48493;
+alt[141]:=2.7374;
+alt[142]:=2.7374;
+alt[143]:=3.56247;
+alt[144]:=5.08743;
+alt[145]:=3.56503;
+alt[146]:=2.76495;
+alt[147]:=2.58002;
+alt[148]:=4.54495;
+alt[149]:=1.7475;
+alt[150]:=2.465;
+alt[151]:=3.4725;
+alt[152]:=3.59995;
+alt[153]:=3.39245;
+alt[154]:=3.56503;
+alt[155]:=2.73251;
+alt[156]:=3.56247;
+alt[157]:=3.56503;
+alt[158]:=5.17996;
+alt[159]:=2.76495;
+alt[160]:=2.48493;
+alt[161]:=1.59745;
+alt[162]:=3.56503;
+alt[163]:=3.39245;
+alt[164]:=5.66746;
+alt[165]:=2.52997;
+alt[166]:=4.92493;
+alt[167]:=4.92493;
+alt[168]:=3.655;
+alt[169]:=1.60501;
+alt[170]:=2.63998;
+alt[171]:=2.5524;
+alt[172]:=-1.06498;
+alt[173]:=4.92493;
+alt[174]:=5.17996;
+alt[175]:=2.76495;
+alt[176]:=3.4725;
+alt[177]:=3.4725;
+alt[178]:=3.4725;
+alt[179]:=1.60501;
+alt[180]:=4.64996;
+alt[181]:=4.64996;
+alt[182]:=4.64996;
+alt[183]:=4.54495;
+alt[184]:=4.54495;
+alt[185]:=4.64996;
+alt[186]:=3.56247;
+alt[187]:=2.59002;
+alt[188]:=4.64996;
+alt[189]:=4.64996;
+alt[190]:=4.64996;
+alt[191]:=4.54495;
+alt[192]:=4.64996;
+alt[193]:=4.64996;
+alt[194]:=4.64996;
+alt[195]:=4.54495;
+alt[196]:=3.56247;
+alt[197]:=4.54495;
+alt[198]:=4.55999;
+alt[199]:=4.55999;
+alt[200]:=4.55999;
+alt[201]:=4.45498;
+alt[202]:=4.45498;
+alt[203]:=2.52997;
+alt[204]:=3.56503;
+alt[205]:=4.55999;
+alt[206]:=4.55999;
+alt[207]:=4.55999;
+alt[208]:=4.45498;
+alt[209]:=4.64996;
+alt[210]:=3.56247;
+alt[211]:=3.56503;
+alt[212]:=3.56503;
+alt[213]:=3.56503;
+alt[214]:=3.56503;
+alt[215]:=3.4725;
+alt[216]:=3.4725;
+alt[217]:=3.73752;
+alt[218]:=2.58002;
+alt[219]:=1.60501;
+alt[220]:=3.56503;
+alt[221]:=3.56503;
+alt[222]:=3.56503;
+alt[223]:=3.4725;
+alt[224]:=3.655;
+alt[225]:=3.655;
+alt[226]:=3.655;
+alt[227]:=3.56247;
+alt[228]:=3.56503;
+alt[229]:=3.56247;
+alt[230]:=3.56503;
+alt[231]:=3.56503;
+alt[232]:=3.56503;
+alt[233]:=3.4725;
+alt[234]:=3.4725;
+alt[235]:=2.58002;
+alt[236]:=2.58002;
+alt[237]:=3.56503;
+alt[238]:=3.56503;
+alt[239]:=3.56503;
+alt[240]:=3.4725;
+alt[241]:=2.59002;
+alt[242]:=2.49749;
+alt[243]:=2.49749;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fpplb8r b/graphics/metapost/contrib/macros/txp/fontdata/fpplb8r
new file mode 100644
index 0000000000..dc1bcd2092
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fpplb8r
@@ -0,0 +1,229 @@
+alt[15]:=3.35996;
+alt[16]:=3.48501;
+alt[17]:=3.48501;
+alt[18]:=3.35996;
+alt[19]:=6.06995;
+alt[20]:=3.30499;
+alt[21]:=3.48501;
+alt[22]:=-1.30994;
+alt[23]:=3.53998;
+alt[24]:=3.35996;
+alt[25]:=2.50745;
+alt[26]:=4.445;
+alt[27]:=3.48501;
+alt[28]:=3.35996;
+alt[29]:=2.2175;
+alt[30]:=3.53998;
+alt[31]:=5.37994;
+alt[32]:=0;
+alt[33]:=3.30499;
+alt[34]:=5.37994;
+alt[35]:=3.35996;
+alt[36]:=2.96749;
+alt[37]:=3.48501;
+alt[38]:=3.30499;
+alt[39]:=5.56494;
+alt[40]:=2.96749;
+alt[41]:=2.96749;
+alt[42]:=5.19995;
+alt[43]:=2.49747;
+alt[44]:=-0.17502;
+alt[45]:=2.50745;
+alt[46]:=0.63;
+alt[47]:=3.48501;
+alt[48]:=3.30499;
+alt[49]:=3.30499;
+alt[50]:=3.30499;
+alt[51]:=3.30499;
+alt[52]:=3.30499;
+alt[53]:=3.30499;
+alt[54]:=3.30499;
+alt[55]:=3.30499;
+alt[56]:=3.30499;
+alt[57]:=3.30499;
+alt[58]:=2.2175;
+alt[59]:=1.41248;
+alt[60]:=2.57501;
+alt[61]:=2.50495;
+alt[62]:=2.57501;
+alt[63]:=3.30499;
+alt[64]:=3.30499;
+alt[65]:=3.30499;
+alt[66]:=3.30499;
+alt[67]:=3.48501;
+alt[68]:=3.30499;
+alt[69]:=3.30499;
+alt[70]:=3.30499;
+alt[71]:=3.48501;
+alt[72]:=3.30499;
+alt[73]:=3.30499;
+alt[74]:=2.25;
+alt[75]:=3.30499;
+alt[76]:=3.30499;
+alt[77]:=3.30499;
+alt[78]:=3.30499;
+alt[79]:=3.48501;
+alt[80]:=3.30499;
+alt[81]:=2.67999;
+alt[82]:=3.30499;
+alt[83]:=3.48501;
+alt[84]:=3.30499;
+alt[85]:=3.30499;
+alt[86]:=3.30499;
+alt[87]:=3.30499;
+alt[88]:=3.48501;
+alt[89]:=3.48501;
+alt[90]:=3.30499;
+alt[91]:=2.96749;
+alt[92]:=3.53998;
+alt[93]:=2.96749;
+alt[94]:=4.69996;
+alt[95]:=-0.94748;
+alt[96]:=5.56494;
+alt[97]:=2.2175;
+alt[98]:=3.48501;
+alt[99]:=2.2175;
+alt[100]:=3.48501;
+alt[101]:=2.2175;
+alt[102]:=3.48501;
+alt[103]:=0.942505;
+alt[104]:=3.48501;
+alt[105]:=3.48501;
+alt[106]:=2.21002;
+alt[107]:=3.48501;
+alt[108]:=3.48501;
+alt[109]:=2.2175;
+alt[110]:=2.2175;
+alt[111]:=2.2175;
+alt[112]:=1.02249;
+alt[113]:=1.02249;
+alt[114]:=2.2175;
+alt[115]:=2.2175;
+alt[116]:=3.04752;
+alt[117]:=2.2175;
+alt[118]:=2.2175;
+alt[119]:=2.2175;
+alt[120]:=2.2175;
+alt[121]:=0.942505;
+alt[122]:=2.2175;
+alt[123]:=2.96749;
+alt[124]:=3.53998;
+alt[125]:=2.96749;
+alt[126]:=2.52744;
+alt[127]:=-0.17502;
+alt[128]:=2.29001;
+alt[129]:=-0.17502;
+alt[130]:=0.63;
+alt[131]:=3.30499;
+alt[132]:=2.10999;
+alt[133]:=3.35996;
+alt[134]:=3.48501;
+alt[135]:=4.445;
+alt[136]:=2.43494;
+alt[137]:=3.48501;
+alt[138]:=5.56494;
+alt[139]:=5.56494;
+alt[140]:=3.33243;
+alt[141]:=2.50745;
+alt[142]:=2.50745;
+alt[143]:=3.35996;
+alt[144]:=4.69996;
+alt[145]:=3.48501;
+alt[146]:=2.43494;
+alt[147]:=2.2175;
+alt[148]:=4.445;
+alt[149]:=1.1625;
+alt[150]:=2.19748;
+alt[151]:=3.30499;
+alt[152]:=3.15494;
+alt[153]:=3.48501;
+alt[154]:=3.53998;
+alt[155]:=2.43002;
+alt[156]:=3.35996;
+alt[157]:=3.48501;
+alt[158]:=5.19992;
+alt[159]:=2.43494;
+alt[160]:=2.50495;
+alt[161]:=1.48996;
+alt[162]:=3.48501;
+alt[163]:=3.10248;
+alt[164]:=5.19992;
+alt[165]:=2.49747;
+alt[166]:=4.69996;
+alt[167]:=4.69996;
+alt[168]:=3.53998;
+alt[169]:=1.1625;
+alt[170]:=2.49997;
+alt[171]:=2.52744;
+alt[172]:=-1.16992;
+alt[173]:=4.69996;
+alt[174]:=5.19992;
+alt[175]:=2.43494;
+alt[176]:=3.30499;
+alt[177]:=3.30499;
+alt[178]:=3.30499;
+alt[179]:=1.1625;
+alt[180]:=4.445;
+alt[181]:=4.445;
+alt[182]:=4.445;
+alt[183]:=4.445;
+alt[184]:=4.445;
+alt[185]:=4.56503;
+alt[186]:=3.30499;
+alt[187]:=2.43002;
+alt[188]:=4.445;
+alt[189]:=4.445;
+alt[190]:=4.445;
+alt[191]:=4.445;
+alt[192]:=4.445;
+alt[193]:=4.445;
+alt[194]:=4.445;
+alt[195]:=4.445;
+alt[196]:=3.30499;
+alt[197]:=4.445;
+alt[198]:=4.445;
+alt[199]:=4.445;
+alt[200]:=4.445;
+alt[201]:=4.445;
+alt[202]:=4.445;
+alt[203]:=2.65995;
+alt[204]:=3.48501;
+alt[205]:=4.445;
+alt[206]:=4.445;
+alt[207]:=4.445;
+alt[208]:=4.445;
+alt[209]:=4.445;
+alt[210]:=3.30499;
+alt[211]:=3.48501;
+alt[212]:=3.48501;
+alt[213]:=3.48501;
+alt[214]:=3.48501;
+alt[215]:=3.30499;
+alt[216]:=3.48501;
+alt[217]:=3.48501;
+alt[218]:=2.2175;
+alt[219]:=1.1625;
+alt[220]:=3.48501;
+alt[221]:=3.48501;
+alt[222]:=3.48501;
+alt[223]:=3.48501;
+alt[224]:=3.48501;
+alt[225]:=3.48501;
+alt[226]:=3.48501;
+alt[227]:=3.48501;
+alt[228]:=3.48501;
+alt[229]:=3.30499;
+alt[230]:=3.48501;
+alt[231]:=3.48501;
+alt[232]:=3.48501;
+alt[233]:=3.30499;
+alt[234]:=3.48501;
+alt[235]:=2.49747;
+alt[236]:=2.2175;
+alt[237]:=3.48501;
+alt[238]:=3.48501;
+alt[239]:=3.48501;
+alt[240]:=3.48501;
+alt[241]:=2.21002;
+alt[242]:=2.29001;
+alt[243]:=2.21002;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fpplbo8r b/graphics/metapost/contrib/macros/txp/fontdata/fpplbo8r
new file mode 100644
index 0000000000..dc1bcd2092
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fpplbo8r
@@ -0,0 +1,229 @@
+alt[15]:=3.35996;
+alt[16]:=3.48501;
+alt[17]:=3.48501;
+alt[18]:=3.35996;
+alt[19]:=6.06995;
+alt[20]:=3.30499;
+alt[21]:=3.48501;
+alt[22]:=-1.30994;
+alt[23]:=3.53998;
+alt[24]:=3.35996;
+alt[25]:=2.50745;
+alt[26]:=4.445;
+alt[27]:=3.48501;
+alt[28]:=3.35996;
+alt[29]:=2.2175;
+alt[30]:=3.53998;
+alt[31]:=5.37994;
+alt[32]:=0;
+alt[33]:=3.30499;
+alt[34]:=5.37994;
+alt[35]:=3.35996;
+alt[36]:=2.96749;
+alt[37]:=3.48501;
+alt[38]:=3.30499;
+alt[39]:=5.56494;
+alt[40]:=2.96749;
+alt[41]:=2.96749;
+alt[42]:=5.19995;
+alt[43]:=2.49747;
+alt[44]:=-0.17502;
+alt[45]:=2.50745;
+alt[46]:=0.63;
+alt[47]:=3.48501;
+alt[48]:=3.30499;
+alt[49]:=3.30499;
+alt[50]:=3.30499;
+alt[51]:=3.30499;
+alt[52]:=3.30499;
+alt[53]:=3.30499;
+alt[54]:=3.30499;
+alt[55]:=3.30499;
+alt[56]:=3.30499;
+alt[57]:=3.30499;
+alt[58]:=2.2175;
+alt[59]:=1.41248;
+alt[60]:=2.57501;
+alt[61]:=2.50495;
+alt[62]:=2.57501;
+alt[63]:=3.30499;
+alt[64]:=3.30499;
+alt[65]:=3.30499;
+alt[66]:=3.30499;
+alt[67]:=3.48501;
+alt[68]:=3.30499;
+alt[69]:=3.30499;
+alt[70]:=3.30499;
+alt[71]:=3.48501;
+alt[72]:=3.30499;
+alt[73]:=3.30499;
+alt[74]:=2.25;
+alt[75]:=3.30499;
+alt[76]:=3.30499;
+alt[77]:=3.30499;
+alt[78]:=3.30499;
+alt[79]:=3.48501;
+alt[80]:=3.30499;
+alt[81]:=2.67999;
+alt[82]:=3.30499;
+alt[83]:=3.48501;
+alt[84]:=3.30499;
+alt[85]:=3.30499;
+alt[86]:=3.30499;
+alt[87]:=3.30499;
+alt[88]:=3.48501;
+alt[89]:=3.48501;
+alt[90]:=3.30499;
+alt[91]:=2.96749;
+alt[92]:=3.53998;
+alt[93]:=2.96749;
+alt[94]:=4.69996;
+alt[95]:=-0.94748;
+alt[96]:=5.56494;
+alt[97]:=2.2175;
+alt[98]:=3.48501;
+alt[99]:=2.2175;
+alt[100]:=3.48501;
+alt[101]:=2.2175;
+alt[102]:=3.48501;
+alt[103]:=0.942505;
+alt[104]:=3.48501;
+alt[105]:=3.48501;
+alt[106]:=2.21002;
+alt[107]:=3.48501;
+alt[108]:=3.48501;
+alt[109]:=2.2175;
+alt[110]:=2.2175;
+alt[111]:=2.2175;
+alt[112]:=1.02249;
+alt[113]:=1.02249;
+alt[114]:=2.2175;
+alt[115]:=2.2175;
+alt[116]:=3.04752;
+alt[117]:=2.2175;
+alt[118]:=2.2175;
+alt[119]:=2.2175;
+alt[120]:=2.2175;
+alt[121]:=0.942505;
+alt[122]:=2.2175;
+alt[123]:=2.96749;
+alt[124]:=3.53998;
+alt[125]:=2.96749;
+alt[126]:=2.52744;
+alt[127]:=-0.17502;
+alt[128]:=2.29001;
+alt[129]:=-0.17502;
+alt[130]:=0.63;
+alt[131]:=3.30499;
+alt[132]:=2.10999;
+alt[133]:=3.35996;
+alt[134]:=3.48501;
+alt[135]:=4.445;
+alt[136]:=2.43494;
+alt[137]:=3.48501;
+alt[138]:=5.56494;
+alt[139]:=5.56494;
+alt[140]:=3.33243;
+alt[141]:=2.50745;
+alt[142]:=2.50745;
+alt[143]:=3.35996;
+alt[144]:=4.69996;
+alt[145]:=3.48501;
+alt[146]:=2.43494;
+alt[147]:=2.2175;
+alt[148]:=4.445;
+alt[149]:=1.1625;
+alt[150]:=2.19748;
+alt[151]:=3.30499;
+alt[152]:=3.15494;
+alt[153]:=3.48501;
+alt[154]:=3.53998;
+alt[155]:=2.43002;
+alt[156]:=3.35996;
+alt[157]:=3.48501;
+alt[158]:=5.19992;
+alt[159]:=2.43494;
+alt[160]:=2.50495;
+alt[161]:=1.48996;
+alt[162]:=3.48501;
+alt[163]:=3.10248;
+alt[164]:=5.19992;
+alt[165]:=2.49747;
+alt[166]:=4.69996;
+alt[167]:=4.69996;
+alt[168]:=3.53998;
+alt[169]:=1.1625;
+alt[170]:=2.49997;
+alt[171]:=2.52744;
+alt[172]:=-1.16992;
+alt[173]:=4.69996;
+alt[174]:=5.19992;
+alt[175]:=2.43494;
+alt[176]:=3.30499;
+alt[177]:=3.30499;
+alt[178]:=3.30499;
+alt[179]:=1.1625;
+alt[180]:=4.445;
+alt[181]:=4.445;
+alt[182]:=4.445;
+alt[183]:=4.445;
+alt[184]:=4.445;
+alt[185]:=4.56503;
+alt[186]:=3.30499;
+alt[187]:=2.43002;
+alt[188]:=4.445;
+alt[189]:=4.445;
+alt[190]:=4.445;
+alt[191]:=4.445;
+alt[192]:=4.445;
+alt[193]:=4.445;
+alt[194]:=4.445;
+alt[195]:=4.445;
+alt[196]:=3.30499;
+alt[197]:=4.445;
+alt[198]:=4.445;
+alt[199]:=4.445;
+alt[200]:=4.445;
+alt[201]:=4.445;
+alt[202]:=4.445;
+alt[203]:=2.65995;
+alt[204]:=3.48501;
+alt[205]:=4.445;
+alt[206]:=4.445;
+alt[207]:=4.445;
+alt[208]:=4.445;
+alt[209]:=4.445;
+alt[210]:=3.30499;
+alt[211]:=3.48501;
+alt[212]:=3.48501;
+alt[213]:=3.48501;
+alt[214]:=3.48501;
+alt[215]:=3.30499;
+alt[216]:=3.48501;
+alt[217]:=3.48501;
+alt[218]:=2.2175;
+alt[219]:=1.1625;
+alt[220]:=3.48501;
+alt[221]:=3.48501;
+alt[222]:=3.48501;
+alt[223]:=3.48501;
+alt[224]:=3.48501;
+alt[225]:=3.48501;
+alt[226]:=3.48501;
+alt[227]:=3.48501;
+alt[228]:=3.48501;
+alt[229]:=3.30499;
+alt[230]:=3.48501;
+alt[231]:=3.48501;
+alt[232]:=3.48501;
+alt[233]:=3.30499;
+alt[234]:=3.48501;
+alt[235]:=2.49747;
+alt[236]:=2.2175;
+alt[237]:=3.48501;
+alt[238]:=3.48501;
+alt[239]:=3.48501;
+alt[240]:=3.48501;
+alt[241]:=2.21002;
+alt[242]:=2.29001;
+alt[243]:=2.21002;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fpplr8r b/graphics/metapost/contrib/macros/txp/fontdata/fpplr8r
new file mode 100644
index 0000000000..116f0faf8b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fpplr8r
@@ -0,0 +1,229 @@
+alt[15]:=3.19497;
+alt[16]:=3.54499;
+alt[17]:=3.54499;
+alt[18]:=3.40247;
+alt[19]:=5.83994;
+alt[20]:=3.36997;
+alt[21]:=3.54499;
+alt[22]:=-0.90998;
+alt[23]:=3.40247;
+alt[24]:=3.40247;
+alt[25]:=2.50492;
+alt[26]:=4.55496;
+alt[27]:=3.36997;
+alt[28]:=3.40247;
+alt[29]:=2.32499;
+alt[30]:=3.40247;
+alt[31]:=6.01496;
+alt[32]:=0;
+alt[33]:=3.36997;
+alt[34]:=6.01496;
+alt[35]:=3.40247;
+alt[36]:=3.01252;
+alt[37]:=3.54499;
+alt[38]:=3.36997;
+alt[39]:=5.73245;
+alt[40]:=2.51502;
+alt[41]:=2.51502;
+alt[42]:=5.11242;
+alt[43]:=2.57499;
+alt[44]:=-0.252505;
+alt[45]:=2.50492;
+alt[46]:=0.54999;
+alt[47]:=3.01252;
+alt[48]:=3.36997;
+alt[49]:=3.36997;
+alt[50]:=3.36997;
+alt[51]:=3.36997;
+alt[52]:=3.36997;
+alt[53]:=3.36997;
+alt[54]:=3.36997;
+alt[55]:=3.36997;
+alt[56]:=3.36997;
+alt[57]:=3.36997;
+alt[58]:=2.19247;
+alt[59]:=1.38998;
+alt[60]:=2.60749;
+alt[61]:=2.70996;
+alt[62]:=2.60749;
+alt[63]:=3.36997;
+alt[64]:=3.36997;
+alt[65]:=3.54499;
+alt[66]:=3.36997;
+alt[67]:=3.54499;
+alt[68]:=3.36997;
+alt[69]:=3.36997;
+alt[70]:=3.36997;
+alt[71]:=3.54499;
+alt[72]:=3.36997;
+alt[73]:=3.36997;
+alt[74]:=2.34;
+alt[75]:=3.36997;
+alt[76]:=3.36997;
+alt[77]:=3.36997;
+alt[78]:=3.36997;
+alt[79]:=3.54499;
+alt[80]:=3.36997;
+alt[81]:=2.74249;
+alt[82]:=3.36997;
+alt[83]:=3.54499;
+alt[84]:=3.36997;
+alt[85]:=3.36997;
+alt[86]:=3.36997;
+alt[87]:=3.54499;
+alt[88]:=3.54499;
+alt[89]:=3.54499;
+alt[90]:=3.36997;
+alt[91]:=2.74249;
+alt[92]:=3.57749;
+alt[93]:=2.74249;
+alt[94]:=4.77994;
+alt[95]:=-0.93997;
+alt[96]:=5.73245;
+alt[97]:=2.32499;
+alt[98]:=3.54499;
+alt[99]:=2.32499;
+alt[100]:=3.54499;
+alt[101]:=2.32499;
+alt[102]:=3.54499;
+alt[103]:=0.94751;
+alt[104]:=3.54499;
+alt[105]:=3.36997;
+alt[106]:=1.99249;
+alt[107]:=3.54499;
+alt[108]:=3.54499;
+alt[109]:=2.32499;
+alt[110]:=2.32499;
+alt[111]:=2.32499;
+alt[112]:=0.94751;
+alt[113]:=0.94751;
+alt[114]:=2.32499;
+alt[115]:=2.32499;
+alt[116]:=3.16248;
+alt[117]:=2.32499;
+alt[118]:=2.19247;
+alt[119]:=2.32499;
+alt[120]:=2.32499;
+alt[121]:=0.815;
+alt[122]:=2.19247;
+alt[123]:=2.74249;
+alt[124]:=3.57749;
+alt[125]:=2.74249;
+alt[126]:=2.44494;
+alt[127]:=-0.252505;
+alt[128]:=2.33249;
+alt[129]:=-0.252505;
+alt[130]:=0.54999;
+alt[131]:=3.36997;
+alt[132]:=2.15747;
+alt[133]:=3.40247;
+alt[134]:=3.54499;
+alt[135]:=4.55496;
+alt[136]:=2.49246;
+alt[137]:=3.54499;
+alt[138]:=5.73245;
+alt[139]:=5.73245;
+alt[140]:=3.38746;
+alt[141]:=2.50492;
+alt[142]:=2.50492;
+alt[143]:=3.19497;
+alt[144]:=4.77994;
+alt[145]:=3.36997;
+alt[146]:=2.49246;
+alt[147]:=2.32499;
+alt[148]:=4.34497;
+alt[149]:=1.29501;
+alt[150]:=2.31751;
+alt[151]:=3.36997;
+alt[152]:=3.14747;
+alt[153]:=3.54499;
+alt[154]:=3.57749;
+alt[155]:=2.51502;
+alt[156]:=3.19497;
+alt[157]:=3.54499;
+alt[158]:=5.73245;
+alt[159]:=2.49246;
+alt[160]:=2.46997;
+alt[161]:=1.41495;
+alt[162]:=3.54499;
+alt[163]:=2.88247;
+alt[164]:=5.34741;
+alt[165]:=2.60749;
+alt[166]:=4.77994;
+alt[167]:=4.77994;
+alt[168]:=3.40247;
+alt[169]:=1.11248;
+alt[170]:=2.56747;
+alt[171]:=2.75494;
+alt[172]:=-1.13746;
+alt[173]:=4.77994;
+alt[174]:=5.73245;
+alt[175]:=2.49246;
+alt[176]:=3.36997;
+alt[177]:=3.36997;
+alt[178]:=3.36997;
+alt[179]:=1.29501;
+alt[180]:=4.55496;
+alt[181]:=4.55496;
+alt[182]:=4.55496;
+alt[183]:=4.34497;
+alt[184]:=4.34497;
+alt[185]:=4.55496;
+alt[186]:=3.36997;
+alt[187]:=2.51502;
+alt[188]:=4.55496;
+alt[189]:=4.55496;
+alt[190]:=4.55496;
+alt[191]:=4.34497;
+alt[192]:=4.55496;
+alt[193]:=4.55496;
+alt[194]:=4.55496;
+alt[195]:=4.34497;
+alt[196]:=3.36997;
+alt[197]:=4.34497;
+alt[198]:=4.55496;
+alt[199]:=4.55496;
+alt[200]:=4.55496;
+alt[201]:=4.34497;
+alt[202]:=4.34497;
+alt[203]:=2.62497;
+alt[204]:=3.54499;
+alt[205]:=4.55496;
+alt[206]:=4.55496;
+alt[207]:=4.55496;
+alt[208]:=4.34497;
+alt[209]:=4.55496;
+alt[210]:=3.36997;
+alt[211]:=3.54499;
+alt[212]:=3.36997;
+alt[213]:=3.36997;
+alt[214]:=3.36997;
+alt[215]:=3.16248;
+alt[216]:=3.16248;
+alt[217]:=3.54499;
+alt[218]:=2.32499;
+alt[219]:=1.29501;
+alt[220]:=3.36997;
+alt[221]:=3.36997;
+alt[222]:=3.36997;
+alt[223]:=3.16248;
+alt[224]:=3.36997;
+alt[225]:=3.36997;
+alt[226]:=3.36997;
+alt[227]:=3.16248;
+alt[228]:=3.54499;
+alt[229]:=3.16248;
+alt[230]:=3.36997;
+alt[231]:=3.36997;
+alt[232]:=3.36997;
+alt[233]:=3.16248;
+alt[234]:=3.16248;
+alt[235]:=2.57499;
+alt[236]:=2.32499;
+alt[237]:=3.36997;
+alt[238]:=3.36997;
+alt[239]:=3.36997;
+alt[240]:=3.16248;
+alt[241]:=1.99249;
+alt[242]:=2.16751;
+alt[243]:=1.785;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fpplri8r b/graphics/metapost/contrib/macros/txp/fontdata/fpplri8r
new file mode 100644
index 0000000000..d1a17868c3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fpplri8r
@@ -0,0 +1,229 @@
+alt[15]:=3.23498;
+alt[16]:=2.30753;
+alt[17]:=2.30753;
+alt[18]:=3.46747;
+alt[19]:=6.12744;
+alt[20]:=3.4025;
+alt[21]:=3.54751;
+alt[22]:=-1.15741;
+alt[23]:=3.46747;
+alt[24]:=3.46747;
+alt[25]:=2.52493;
+alt[26]:=4.45249;
+alt[27]:=3.4025;
+alt[28]:=3.46747;
+alt[29]:=2.42999;
+alt[30]:=3.46747;
+alt[31]:=6.12744;
+alt[32]:=0;
+alt[33]:=3.54751;
+alt[34]:=6.12744;
+alt[35]:=3.46747;
+alt[36]:=3.06;
+alt[37]:=3.4025;
+alt[38]:=3.4025;
+alt[39]:=6.12744;
+alt[40]:=3.06;
+alt[41]:=3.06;
+alt[42]:=5.30744;
+alt[43]:=2.49497;
+alt[44]:=-0.174985;
+alt[45]:=2.52493;
+alt[46]:=0.52252;
+alt[47]:=3.06;
+alt[48]:=3.4025;
+alt[49]:=3.4025;
+alt[50]:=3.4025;
+alt[51]:=3.4025;
+alt[52]:=3.4025;
+alt[53]:=3.4025;
+alt[54]:=3.4025;
+alt[55]:=3.4025;
+alt[56]:=3.4025;
+alt[57]:=3.4025;
+alt[58]:=2.22;
+alt[59]:=1.52249;
+alt[60]:=2.42999;
+alt[61]:=2.4924;
+alt[62]:=2.42999;
+alt[63]:=3.4025;
+alt[64]:=3.4025;
+alt[65]:=3.4025;
+alt[66]:=3.4025;
+alt[67]:=3.4025;
+alt[68]:=3.4025;
+alt[69]:=3.4025;
+alt[70]:=3.4025;
+alt[71]:=3.4025;
+alt[72]:=3.4025;
+alt[73]:=3.4025;
+alt[74]:=2.40003;
+alt[75]:=3.4025;
+alt[76]:=3.4025;
+alt[77]:=3.4025;
+alt[78]:=3.4025;
+alt[79]:=3.4025;
+alt[80]:=3.4025;
+alt[81]:=2.40003;
+alt[82]:=3.4025;
+alt[83]:=3.4025;
+alt[84]:=3.4025;
+alt[85]:=3.4025;
+alt[86]:=3.4025;
+alt[87]:=3.4025;
+alt[88]:=3.4025;
+alt[89]:=3.4025;
+alt[90]:=3.4025;
+alt[91]:=3.06;
+alt[92]:=3.61249;
+alt[93]:=3.06;
+alt[94]:=4.86246;
+alt[95]:=-0.92749;
+alt[96]:=6.12744;
+alt[97]:=2.42999;
+alt[98]:=3.54751;
+alt[99]:=2.42999;
+alt[100]:=3.54751;
+alt[101]:=2.42999;
+alt[102]:=2.30753;
+alt[103]:=1.19001;
+alt[104]:=3.54751;
+alt[105]:=3.54751;
+alt[106]:=2.30753;
+alt[107]:=3.54751;
+alt[108]:=3.54751;
+alt[109]:=2.42999;
+alt[110]:=2.42999;
+alt[111]:=2.42999;
+alt[112]:=1.19001;
+alt[113]:=1.19001;
+alt[114]:=2.42999;
+alt[115]:=2.42999;
+alt[116]:=3.17001;
+alt[117]:=2.42999;
+alt[118]:=2.42999;
+alt[119]:=2.42999;
+alt[120]:=2.42999;
+alt[121]:=1.19001;
+alt[122]:=2.42999;
+alt[123]:=3.06;
+alt[124]:=3.61249;
+alt[125]:=3.06;
+alt[126]:=2.53495;
+alt[127]:=0.035005;
+alt[128]:=2.16251;
+alt[129]:=0.035005;
+alt[130]:=0.52252;
+alt[131]:=3.46747;
+alt[132]:=2.70499;
+alt[133]:=3.46747;
+alt[134]:=3.54751;
+alt[135]:=4.45249;
+alt[136]:=2.63495;
+alt[137]:=3.4025;
+alt[138]:=6.12744;
+alt[139]:=6.12744;
+alt[140]:=3.59992;
+alt[141]:=2.52493;
+alt[142]:=2.52493;
+alt[143]:=3.23498;
+alt[144]:=4.86246;
+alt[145]:=3.4025;
+alt[146]:=2.63495;
+alt[147]:=2.42999;
+alt[148]:=4.2175;
+alt[149]:=0.980015;
+alt[150]:=2.13996;
+alt[151]:=3.4025;
+alt[152]:=3.5174;
+alt[153]:=3.4025;
+alt[154]:=3.61249;
+alt[155]:=2.40003;
+alt[156]:=3.23498;
+alt[157]:=3.4025;
+alt[158]:=5.44993;
+alt[159]:=2.63495;
+alt[160]:=2.4924;
+alt[161]:=1.39746;
+alt[162]:=3.4025;
+alt[163]:=2.91495;
+alt[164]:=5.44993;
+alt[165]:=2.49497;
+alt[166]:=4.86246;
+alt[167]:=4.86246;
+alt[168]:=3.46747;
+alt[169]:=1.42752;
+alt[170]:=2.40003;
+alt[171]:=2.53495;
+alt[172]:=-1.06744;
+alt[173]:=4.86246;
+alt[174]:=5.44993;
+alt[175]:=2.63495;
+alt[176]:=3.4025;
+alt[177]:=3.4025;
+alt[178]:=3.4025;
+alt[179]:=0.980015;
+alt[180]:=4.45249;
+alt[181]:=4.45249;
+alt[182]:=4.45249;
+alt[183]:=4.2175;
+alt[184]:=4.2175;
+alt[185]:=4.45249;
+alt[186]:=3.4025;
+alt[187]:=2.40003;
+alt[188]:=4.45249;
+alt[189]:=4.45249;
+alt[190]:=4.45249;
+alt[191]:=4.2175;
+alt[192]:=4.45249;
+alt[193]:=4.45249;
+alt[194]:=4.45249;
+alt[195]:=4.2175;
+alt[196]:=3.4025;
+alt[197]:=4.2175;
+alt[198]:=4.45249;
+alt[199]:=4.45249;
+alt[200]:=4.45249;
+alt[201]:=4.2175;
+alt[202]:=4.2175;
+alt[203]:=2.46497;
+alt[204]:=3.41754;
+alt[205]:=4.45249;
+alt[206]:=4.45249;
+alt[207]:=4.45249;
+alt[208]:=4.2175;
+alt[209]:=4.45249;
+alt[210]:=3.4025;
+alt[211]:=2.30753;
+alt[212]:=3.4025;
+alt[213]:=3.4025;
+alt[214]:=3.4025;
+alt[215]:=3.17001;
+alt[216]:=3.17001;
+alt[217]:=3.54751;
+alt[218]:=2.42999;
+alt[219]:=1.42752;
+alt[220]:=3.4025;
+alt[221]:=3.4025;
+alt[222]:=3.4025;
+alt[223]:=3.17001;
+alt[224]:=3.4025;
+alt[225]:=3.4025;
+alt[226]:=3.4025;
+alt[227]:=3.17001;
+alt[228]:=3.54751;
+alt[229]:=3.17001;
+alt[230]:=3.4025;
+alt[231]:=3.4025;
+alt[232]:=3.4025;
+alt[233]:=3.17001;
+alt[234]:=3.17001;
+alt[235]:=2.49497;
+alt[236]:=2.42999;
+alt[237]:=3.4025;
+alt[238]:=3.4025;
+alt[239]:=3.4025;
+alt[240]:=3.17001;
+alt[241]:=2.16251;
+alt[242]:=2.30753;
+alt[243]:=1.93002;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fptmb8r b/graphics/metapost/contrib/macros/txp/fontdata/fptmb8r
new file mode 100644
index 0000000000..ec3177d167
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fptmb8r
@@ -0,0 +1,229 @@
+alt[15]:=3.24247;
+alt[16]:=3.44998;
+alt[17]:=3.44998;
+alt[18]:=3.45498;
+alt[19]:=6.29742;
+alt[20]:=3.44998;
+alt[21]:=3.44998;
+alt[22]:=-0.66501;
+alt[23]:=3.65747;
+alt[24]:=3.44998;
+alt[25]:=2.39497;
+alt[26]:=4.47745;
+alt[27]:=3.44998;
+alt[28]:=3.44998;
+alt[29]:=2.37747;
+alt[30]:=3.65747;
+alt[31]:=5.45246;
+alt[32]:=0;
+alt[33]:=3.45498;
+alt[34]:=5.45246;
+alt[35]:=3.44998;
+alt[36]:=3.22498;
+alt[37]:=3.45498;
+alt[38]:=3.33502;
+alt[39]:=5.22995;
+alt[40]:=2.565;
+alt[41]:=2.565;
+alt[42]:=4.75748;
+alt[43]:=2.59497;
+alt[44]:=-0.10751;
+alt[45]:=2.27997;
+alt[46]:=0.78247;
+alt[47]:=3.33502;
+alt[48]:=3.45498;
+alt[49]:=3.44998;
+alt[50]:=3.44998;
+alt[51]:=3.45498;
+alt[52]:=3.44998;
+alt[53]:=3.45498;
+alt[54]:=3.45498;
+alt[55]:=3.44998;
+alt[56]:=3.45498;
+alt[57]:=3.45498;
+alt[58]:=2.38247;
+alt[59]:=1.49249;
+alt[60]:=2.59997;
+alt[61]:=2.57745;
+alt[62]:=2.59997;
+alt[63]:=3.45498;
+alt[64]:=3.33502;
+alt[65]:=3.44998;
+alt[66]:=3.44998;
+alt[67]:=3.33502;
+alt[68]:=3.44998;
+alt[69]:=3.44998;
+alt[70]:=3.44998;
+alt[71]:=3.33502;
+alt[72]:=3.44998;
+alt[73]:=3.44998;
+alt[74]:=3.01749;
+alt[75]:=3.44998;
+alt[76]:=3.44998;
+alt[77]:=3.44998;
+alt[78]:=3.33502;
+alt[79]:=3.33502;
+alt[80]:=3.44998;
+alt[81]:=2.565;
+alt[82]:=3.44998;
+alt[83]:=3.33502;
+alt[84]:=3.44998;
+alt[85]:=3.33502;
+alt[86]:=3.33502;
+alt[87]:=3.33502;
+alt[88]:=3.44998;
+alt[89]:=3.44998;
+alt[90]:=3.44998;
+alt[91]:=2.75;
+alt[92]:=3.33502;
+alt[93]:=2.75;
+alt[94]:=5.00498;
+alt[95]:=-1.07499;
+alt[96]:=5.22995;
+alt[97]:=2.38247;
+alt[98]:=3.45498;
+alt[99]:=2.38247;
+alt[100]:=3.45498;
+alt[101]:=2.38247;
+alt[102]:=3.44998;
+alt[103]:=1.33001;
+alt[104]:=3.44998;
+alt[105]:=3.44998;
+alt[106]:=2.40253;
+alt[107]:=3.44998;
+alt[108]:=3.44998;
+alt[109]:=2.37747;
+alt[110]:=2.37747;
+alt[111]:=2.38247;
+alt[112]:=1.33001;
+alt[113]:=1.33001;
+alt[114]:=2.37747;
+alt[115]:=2.38247;
+alt[116]:=3.24747;
+alt[117]:=2.38247;
+alt[118]:=2.38247;
+alt[119]:=2.38247;
+alt[120]:=2.37747;
+alt[121]:=1.33001;
+alt[122]:=2.37747;
+alt[123]:=2.565;
+alt[124]:=3.33502;
+alt[125]:=2.565;
+alt[126]:=2.52496;
+alt[127]:=-0.10751;
+alt[128]:=2.75;
+alt[129]:=-0.10751;
+alt[130]:=0.78247;
+alt[131]:=2.75;
+alt[132]:=2.75;
+alt[133]:=3.44998;
+alt[134]:=3.33502;
+alt[135]:=4.36249;
+alt[136]:=2.28247;
+alt[137]:=3.45498;
+alt[138]:=5.22995;
+alt[139]:=5.22995;
+alt[140]:=3.35245;
+alt[141]:=2.39497;
+alt[142]:=2.39497;
+alt[143]:=3.44998;
+alt[144]:=4.75748;
+alt[145]:=3.45498;
+alt[146]:=2.28247;
+alt[147]:=2.38247;
+alt[148]:=4.47745;
+alt[149]:=1.54752;
+alt[150]:=2.30245;
+alt[151]:=3.45498;
+alt[152]:=3.24493;
+alt[153]:=3.44998;
+alt[154]:=3.33502;
+alt[155]:=2.75;
+alt[156]:=3.24247;
+alt[157]:=3.33502;
+alt[158]:=5.45246;
+alt[159]:=2.28247;
+alt[160]:=2.57745;
+alt[161]:=1.41999;
+alt[162]:=3.33502;
+alt[163]:=3.24247;
+alt[164]:=5.45246;
+alt[165]:=2.59497;
+alt[166]:=4.75748;
+alt[167]:=4.75748;
+alt[168]:=3.65747;
+alt[169]:=1.33001;
+alt[170]:=2.565;
+alt[171]:=3.34747;
+alt[172]:=-1.04746;
+alt[173]:=4.75748;
+alt[174]:=5.45246;
+alt[175]:=2.28247;
+alt[176]:=3.45498;
+alt[177]:=3.45498;
+alt[178]:=3.45498;
+alt[179]:=1.54752;
+alt[180]:=4.64499;
+alt[181]:=4.64499;
+alt[182]:=4.47745;
+alt[183]:=4.47745;
+alt[184]:=4.47745;
+alt[185]:=4.64499;
+alt[186]:=3.44998;
+alt[187]:=2.40253;
+alt[188]:=4.64499;
+alt[189]:=4.64499;
+alt[190]:=4.47745;
+alt[191]:=4.47745;
+alt[192]:=4.64499;
+alt[193]:=4.64499;
+alt[194]:=4.47745;
+alt[195]:=4.47745;
+alt[196]:=3.44998;
+alt[197]:=4.36249;
+alt[198]:=4.53003;
+alt[199]:=4.53003;
+alt[200]:=4.36249;
+alt[201]:=4.36249;
+alt[202]:=4.36249;
+alt[203]:=2.38247;
+alt[204]:=3.22498;
+alt[205]:=4.53003;
+alt[206]:=4.53003;
+alt[207]:=4.36249;
+alt[208]:=4.36249;
+alt[209]:=4.64499;
+alt[210]:=3.44998;
+alt[211]:=3.45498;
+alt[212]:=3.66247;
+alt[213]:=3.66247;
+alt[214]:=3.45498;
+alt[215]:=3.45498;
+alt[216]:=3.24747;
+alt[217]:=3.66247;
+alt[218]:=2.38247;
+alt[219]:=1.33001;
+alt[220]:=3.66247;
+alt[221]:=3.66247;
+alt[222]:=3.45498;
+alt[223]:=3.24747;
+alt[224]:=3.65747;
+alt[225]:=3.65747;
+alt[226]:=3.44998;
+alt[227]:=3.24247;
+alt[228]:=3.45498;
+alt[229]:=3.44998;
+alt[230]:=3.66247;
+alt[231]:=3.66247;
+alt[232]:=3.45498;
+alt[233]:=3.45498;
+alt[234]:=3.24747;
+alt[235]:=2.48001;
+alt[236]:=2.3125;
+alt[237]:=3.66247;
+alt[238]:=3.66247;
+alt[239]:=3.45498;
+alt[240]:=3.24747;
+alt[241]:=2.61002;
+alt[242]:=2.40253;
+alt[243]:=2.19501;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fptmbi8r b/graphics/metapost/contrib/macros/txp/fontdata/fptmbi8r
new file mode 100644
index 0000000000..23e66670af
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fptmbi8r
@@ -0,0 +1,229 @@
+alt[15]:=3.19497;
+alt[16]:=2.39499;
+alt[17]:=2.39499;
+alt[18]:=3.3475;
+alt[19]:=6.01993;
+alt[20]:=3.43998;
+alt[21]:=3.3475;
+alt[22]:=-0.792515;
+alt[23]:=3.73245;
+alt[24]:=3.43998;
+alt[25]:=2.45996;
+alt[26]:=4.39749;
+alt[27]:=2.995;
+alt[28]:=3.43998;
+alt[29]:=2.18503;
+alt[30]:=3.43998;
+alt[31]:=5.43247;
+alt[32]:=0;
+alt[33]:=3.3475;
+alt[34]:=5.43247;
+alt[35]:=3.43998;
+alt[36]:=3.28748;
+alt[37]:=3.3475;
+alt[38]:=3.3475;
+alt[39]:=5.28495;
+alt[40]:=2.525;
+alt[41]:=2.525;
+alt[42]:=4.74747;
+alt[43]:=2.53748;
+alt[44]:=-0.24249;
+alt[45]:=2.27493;
+alt[46]:=0.58002;
+alt[47]:=3.3475;
+alt[48]:=3.3475;
+alt[49]:=3.43998;
+alt[50]:=3.43998;
+alt[51]:=3.3475;
+alt[52]:=3.43998;
+alt[53]:=3.3475;
+alt[54]:=3.3475;
+alt[55]:=3.43998;
+alt[56]:=3.3475;
+alt[57]:=3.3475;
+alt[58]:=2.18503;
+alt[59]:=1.36252;
+alt[60]:=2.44501;
+alt[61]:=2.57245;
+alt[62]:=2.44501;
+alt[63]:=3.3475;
+alt[64]:=3.3475;
+alt[65]:=3.43998;
+alt[66]:=3.43998;
+alt[67]:=3.3475;
+alt[68]:=3.43998;
+alt[69]:=3.43998;
+alt[70]:=3.43998;
+alt[71]:=3.3475;
+alt[72]:=3.43998;
+alt[73]:=3.43998;
+alt[74]:=2.995;
+alt[75]:=3.43998;
+alt[76]:=3.43998;
+alt[77]:=3.3475;
+alt[78]:=3.3475;
+alt[79]:=3.3475;
+alt[80]:=3.43998;
+alt[81]:=2.39499;
+alt[82]:=3.43998;
+alt[83]:=3.3475;
+alt[84]:=3.43998;
+alt[85]:=3.3475;
+alt[86]:=3.3475;
+alt[87]:=3.3475;
+alt[88]:=3.43998;
+alt[89]:=3.43998;
+alt[90]:=3.43998;
+alt[91]:=2.67999;
+alt[92]:=3.3475;
+alt[93]:=2.67999;
+alt[94]:=4.95993;
+alt[95]:=-1.02997;
+alt[96]:=5.28495;
+alt[97]:=2.18503;
+alt[98]:=3.3475;
+alt[99]:=2.18503;
+alt[100]:=3.3475;
+alt[101]:=2.18503;
+alt[102]:=2.39499;
+alt[103]:=1.23251;
+alt[104]:=3.3475;
+alt[105]:=3.3475;
+alt[106]:=2.39499;
+alt[107]:=3.3475;
+alt[108]:=3.3475;
+alt[109]:=2.18503;
+alt[110]:=2.18503;
+alt[111]:=2.18503;
+alt[112]:=1.23251;
+alt[113]:=1.23251;
+alt[114]:=2.2775;
+alt[115]:=2.18503;
+alt[116]:=2.83249;
+alt[117]:=2.18503;
+alt[118]:=2.18503;
+alt[119]:=2.18503;
+alt[120]:=2.18503;
+alt[121]:=1.23251;
+alt[122]:=1.83252;
+alt[123]:=2.525;
+alt[124]:=3.3475;
+alt[125]:=2.525;
+alt[126]:=2.52493;
+alt[127]:=-0.24249;
+alt[128]:=2.67999;
+alt[129]:=-0.24249;
+alt[130]:=0.58002;
+alt[131]:=2.67999;
+alt[132]:=2.785;
+alt[133]:=3.43998;
+alt[134]:=3.3475;
+alt[135]:=4.30502;
+alt[136]:=2.15995;
+alt[137]:=3.3475;
+alt[138]:=5.28495;
+alt[139]:=5.28495;
+alt[140]:=3.39743;
+alt[141]:=2.27493;
+alt[142]:=2.27493;
+alt[143]:=3.19497;
+alt[144]:=4.74747;
+alt[145]:=3.3475;
+alt[146]:=2.15995;
+alt[147]:=2.18503;
+alt[148]:=4.39749;
+alt[149]:=1.49249;
+alt[150]:=2.26999;
+alt[151]:=3.3475;
+alt[152]:=3.04993;
+alt[153]:=3.43998;
+alt[154]:=3.3475;
+alt[155]:=2.785;
+alt[156]:=3.19497;
+alt[157]:=3.3475;
+alt[158]:=5.43247;
+alt[159]:=2.15995;
+alt[160]:=2.57245;
+alt[161]:=1.41498;
+alt[162]:=3.3475;
+alt[163]:=3.19497;
+alt[164]:=5.43247;
+alt[165]:=2.53748;
+alt[166]:=4.74747;
+alt[167]:=4.74747;
+alt[168]:=3.43998;
+alt[169]:=1.23251;
+alt[170]:=2.525;
+alt[171]:=3.34247;
+alt[172]:=-0.92252;
+alt[173]:=4.74747;
+alt[174]:=5.43247;
+alt[175]:=2.15995;
+alt[176]:=3.3475;
+alt[177]:=3.3475;
+alt[178]:=3.3475;
+alt[179]:=1.49249;
+alt[180]:=4.56247;
+alt[181]:=4.56247;
+alt[182]:=4.39749;
+alt[183]:=4.39749;
+alt[184]:=4.39749;
+alt[185]:=4.56247;
+alt[186]:=3.43998;
+alt[187]:=2.39499;
+alt[188]:=4.56247;
+alt[189]:=4.56247;
+alt[190]:=4.39749;
+alt[191]:=4.39749;
+alt[192]:=4.56247;
+alt[193]:=4.56247;
+alt[194]:=4.39749;
+alt[195]:=4.39749;
+alt[196]:=3.43998;
+alt[197]:=4.30502;
+alt[198]:=4.47;
+alt[199]:=4.47;
+alt[200]:=4.30502;
+alt[201]:=4.30502;
+alt[202]:=4.30502;
+alt[203]:=2.66245;
+alt[204]:=3.07749;
+alt[205]:=4.47;
+alt[206]:=4.47;
+alt[207]:=4.30502;
+alt[208]:=4.30502;
+alt[209]:=4.56247;
+alt[210]:=3.43998;
+alt[211]:=2.39499;
+alt[212]:=3.3475;
+alt[213]:=3.3475;
+alt[214]:=3.3475;
+alt[215]:=3.1025;
+alt[216]:=3.1025;
+alt[217]:=3.63998;
+alt[218]:=2.18503;
+alt[219]:=1.23251;
+alt[220]:=3.3475;
+alt[221]:=3.3475;
+alt[222]:=3.3475;
+alt[223]:=3.1025;
+alt[224]:=3.3475;
+alt[225]:=3.3475;
+alt[226]:=3.3475;
+alt[227]:=3.1025;
+alt[228]:=3.3475;
+alt[229]:=3.1025;
+alt[230]:=3.3475;
+alt[231]:=3.3475;
+alt[232]:=3.3475;
+alt[233]:=3.1025;
+alt[234]:=3.1025;
+alt[235]:=2.64502;
+alt[236]:=2.08252;
+alt[237]:=3.3475;
+alt[238]:=3.3475;
+alt[239]:=3.3475;
+alt[240]:=3.1025;
+alt[241]:=2.39499;
+alt[242]:=2.39499;
+alt[243]:=2.14999;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fptmr8r b/graphics/metapost/contrib/macros/txp/fontdata/fptmr8r
new file mode 100644
index 0000000000..21594c2468
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fptmr8r
@@ -0,0 +1,229 @@
+alt[15]:=3.05997;
+alt[16]:=3.38996;
+alt[17]:=3.38996;
+alt[18]:=3.35495;
+alt[19]:=5.92493;
+alt[20]:=3.25495;
+alt[21]:=3.38996;
+alt[22]:=-0.81497;
+alt[23]:=3.59998;
+alt[24]:=3.25495;
+alt[25]:=2.52496;
+alt[26]:=4.45999;
+alt[27]:=3.38996;
+alt[28]:=3.38996;
+alt[29]:=2.29248;
+alt[30]:=3.38996;
+alt[31]:=5.54993;
+alt[32]:=0;
+alt[33]:=3.35495;
+alt[34]:=5.54993;
+alt[35]:=3.25495;
+alt[36]:=3.1825;
+alt[37]:=3.35495;
+alt[38]:=3.35495;
+alt[39]:=5.54993;
+alt[40]:=2.57499;
+alt[41]:=2.57499;
+alt[42]:=4.69242;
+alt[43]:=2.53247;
+alt[44]:=-0.1275;
+alt[45]:=2.30246;
+alt[46]:=0.46997;
+alt[47]:=3.35495;
+alt[48]:=3.35495;
+alt[49]:=3.38996;
+alt[50]:=3.38996;
+alt[51]:=3.35495;
+alt[52]:=3.38996;
+alt[53]:=3.35495;
+alt[54]:=3.35495;
+alt[55]:=3.21994;
+alt[56]:=3.35495;
+alt[57]:=3.35495;
+alt[58]:=2.25748;
+alt[59]:=1.66001;
+alt[60]:=2.49747;
+alt[61]:=2.57496;
+alt[62]:=2.49747;
+alt[63]:=3.35495;
+alt[64]:=3.35495;
+alt[65]:=3.38996;
+alt[66]:=3.25495;
+alt[67]:=3.35495;
+alt[68]:=3.25495;
+alt[69]:=3.25495;
+alt[70]:=3.25495;
+alt[71]:=3.35495;
+alt[72]:=3.25495;
+alt[73]:=3.25495;
+alt[74]:=3.21994;
+alt[75]:=3.25495;
+alt[76]:=3.25495;
+alt[77]:=3.25495;
+alt[78]:=3.21994;
+alt[79]:=3.35495;
+alt[80]:=3.25495;
+alt[81]:=2.57499;
+alt[82]:=3.25495;
+alt[83]:=3.35495;
+alt[84]:=3.25495;
+alt[85]:=3.21994;
+alt[86]:=3.21994;
+alt[87]:=3.21994;
+alt[88]:=3.25495;
+alt[89]:=3.25495;
+alt[90]:=3.25495;
+alt[91]:=2.43998;
+alt[92]:=3.35495;
+alt[93]:=2.43998;
+alt[94]:=4.67243;
+alt[95]:=-1.00747;
+alt[96]:=5.54993;
+alt[97]:=2.25748;
+alt[98]:=3.35495;
+alt[99]:=2.25748;
+alt[100]:=3.35495;
+alt[101]:=2.25748;
+alt[102]:=3.38996;
+alt[103]:=1.21002;
+alt[104]:=3.38996;
+alt[105]:=3.38996;
+alt[106]:=2.30749;
+alt[107]:=3.38996;
+alt[108]:=3.38996;
+alt[109]:=2.29248;
+alt[110]:=2.29248;
+alt[111]:=2.25748;
+alt[112]:=1.21002;
+alt[113]:=1.21002;
+alt[114]:=2.29248;
+alt[115]:=2.25748;
+alt[116]:=2.78994;
+alt[117]:=2.25748;
+alt[118]:=2.25748;
+alt[119]:=2.25748;
+alt[120]:=2.29248;
+alt[121]:=1.21002;
+alt[122]:=2.29248;
+alt[123]:=2.465;
+alt[124]:=3.35495;
+alt[125]:=2.465;
+alt[126]:=2.52997;
+alt[127]:=-0.1275;
+alt[128]:=2.465;
+alt[129]:=-0.1275;
+alt[130]:=0.46997;
+alt[131]:=2.57499;
+alt[132]:=2.57499;
+alt[133]:=3.38996;
+alt[134]:=3.56497;
+alt[135]:=4.42498;
+alt[136]:=2.23245;
+alt[137]:=3.35495;
+alt[138]:=5.54993;
+alt[139]:=5.54993;
+alt[140]:=3.32746;
+alt[141]:=2.30246;
+alt[142]:=2.30246;
+alt[143]:=3.25495;
+alt[144]:=4.55741;
+alt[145]:=3.35495;
+alt[146]:=2.23245;
+alt[147]:=2.25748;
+alt[148]:=4.21249;
+alt[149]:=1.21002;
+alt[150]:=2.19247;
+alt[151]:=3.35495;
+alt[152]:=3.28745;
+alt[153]:=3.25495;
+alt[154]:=3.35495;
+alt[155]:=2.57499;
+alt[156]:=3.05997;
+alt[157]:=3.35495;
+alt[158]:=5.34992;
+alt[159]:=2.23245;
+alt[160]:=2.57496;
+alt[161]:=1.26748;
+alt[162]:=3.35495;
+alt[163]:=3.05997;
+alt[164]:=5.34992;
+alt[165]:=2.53247;
+alt[166]:=4.80743;
+alt[167]:=4.69242;
+alt[168]:=3.38996;
+alt[169]:=1.21002;
+alt[170]:=2.43998;
+alt[171]:=2.52496;
+alt[172]:=-1.08246;
+alt[173]:=4.80743;
+alt[174]:=5.34992;
+alt[175]:=2.23245;
+alt[176]:=3.35495;
+alt[177]:=3.35495;
+alt[178]:=3.35495;
+alt[179]:=1.21002;
+alt[180]:=4.45999;
+alt[181]:=4.45999;
+alt[182]:=4.45999;
+alt[183]:=4.21249;
+alt[184]:=4.21249;
+alt[185]:=4.45999;
+alt[186]:=3.25495;
+alt[187]:=2.30749;
+alt[188]:=4.45999;
+alt[189]:=4.45999;
+alt[190]:=4.45999;
+alt[191]:=4.21249;
+alt[192]:=4.45999;
+alt[193]:=4.45999;
+alt[194]:=4.45999;
+alt[195]:=4.21249;
+alt[196]:=3.25495;
+alt[197]:=4.17749;
+alt[198]:=4.42498;
+alt[199]:=4.42498;
+alt[200]:=4.42498;
+alt[201]:=4.17749;
+alt[202]:=4.17749;
+alt[203]:=2.49747;
+alt[204]:=3.1825;
+alt[205]:=4.42498;
+alt[206]:=4.42498;
+alt[207]:=4.42498;
+alt[208]:=4.17749;
+alt[209]:=4.45999;
+alt[210]:=3.25495;
+alt[211]:=3.35495;
+alt[212]:=3.35495;
+alt[213]:=3.35495;
+alt[214]:=3.35495;
+alt[215]:=3.21994;
+alt[216]:=3.02497;
+alt[217]:=3.56497;
+alt[218]:=2.25748;
+alt[219]:=1.21002;
+alt[220]:=3.35495;
+alt[221]:=3.35495;
+alt[222]:=3.35495;
+alt[223]:=3.02497;
+alt[224]:=3.38996;
+alt[225]:=3.38996;
+alt[226]:=3.38996;
+alt[227]:=3.05997;
+alt[228]:=3.35495;
+alt[229]:=3.25495;
+alt[230]:=3.35495;
+alt[231]:=3.35495;
+alt[232]:=3.35495;
+alt[233]:=3.21994;
+alt[234]:=3.02497;
+alt[235]:=2.49747;
+alt[236]:=2.19247;
+alt[237]:=3.35495;
+alt[238]:=3.35495;
+alt[239]:=3.35495;
+alt[240]:=3.02497;
+alt[241]:=2.30749;
+alt[242]:=2.30749;
+alt[243]:=1.97751;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fptmri8r b/graphics/metapost/contrib/macros/txp/fontdata/fptmri8r
new file mode 100644
index 0000000000..2004c4e845
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fptmri8r
@@ -0,0 +1,229 @@
+alt[15]:=3.07498;
+alt[16]:=2.28253;
+alt[17]:=2.37753;
+alt[18]:=3.315;
+alt[19]:=5.81247;
+alt[20]:=3.3425;
+alt[21]:=3.315;
+alt[22]:=-0.625;
+alt[23]:=3.55497;
+alt[24]:=3.3425;
+alt[25]:=2.56498;
+alt[26]:=4.38999;
+alt[27]:=2.87753;
+alt[28]:=3.3425;
+alt[29]:=2.19497;
+alt[30]:=3.3425;
+alt[31]:=5.48498;
+alt[32]:=0;
+alt[33]:=3.315;
+alt[34]:=5.48498;
+alt[35]:=3.3425;
+alt[36]:=3.09;
+alt[37]:=3.315;
+alt[38]:=3.315;
+alt[39]:=5.48498;
+alt[40]:=2.37753;
+alt[41]:=2.37753;
+alt[42]:=4.63748;
+alt[43]:=2.44247;
+alt[44]:=-0.16251;
+alt[45]:=2.18243;
+alt[46]:=0.474975;
+alt[47]:=3.315;
+alt[48]:=3.315;
+alt[49]:=3.3425;
+alt[50]:=3.3425;
+alt[51]:=3.315;
+alt[52]:=3.3425;
+alt[53]:=3.315;
+alt[54]:=3.315;
+alt[55]:=3.315;
+alt[56]:=3.315;
+alt[57]:=3.315;
+alt[58]:=2.19497;
+alt[59]:=1.55749;
+alt[60]:=2.64246;
+alt[61]:=2.54245;
+alt[62]:=2.64246;
+alt[63]:=3.315;
+alt[64]:=3.315;
+alt[65]:=3.3425;
+alt[66]:=3.3425;
+alt[67]:=3.315;
+alt[68]:=3.3425;
+alt[69]:=3.3425;
+alt[70]:=3.3425;
+alt[71]:=3.315;
+alt[72]:=3.3425;
+alt[73]:=3.3425;
+alt[74]:=3.315;
+alt[75]:=3.3425;
+alt[76]:=3.3425;
+alt[77]:=3.3425;
+alt[78]:=3.315;
+alt[79]:=3.315;
+alt[80]:=3.3425;
+alt[81]:=2.37753;
+alt[82]:=3.3425;
+alt[83]:=3.315;
+alt[84]:=3.3425;
+alt[85]:=3.315;
+alt[86]:=3.315;
+alt[87]:=3.315;
+alt[88]:=3.3425;
+alt[89]:=3.3425;
+alt[90]:=3.3425;
+alt[91]:=2.51755;
+alt[92]:=3.315;
+alt[93]:=2.51755;
+alt[94]:=4.84744;
+alt[95]:=-1.03998;
+alt[96]:=5.48498;
+alt[97]:=2.19497;
+alt[98]:=3.315;
+alt[99]:=2.19497;
+alt[100]:=3.315;
+alt[101]:=2.19497;
+alt[102]:=2.28253;
+alt[103]:=1.2575;
+alt[104]:=3.315;
+alt[105]:=3.315;
+alt[106]:=2.28253;
+alt[107]:=3.315;
+alt[108]:=3.315;
+alt[109]:=2.19497;
+alt[110]:=2.19497;
+alt[111]:=2.19497;
+alt[112]:=1.2575;
+alt[113]:=1.1625;
+alt[114]:=2.22247;
+alt[115]:=2.19497;
+alt[116]:=2.64246;
+alt[117]:=2.19497;
+alt[118]:=2.19497;
+alt[119]:=2.19497;
+alt[120]:=2.19497;
+alt[121]:=1.2575;
+alt[122]:=1.7575;
+alt[123]:=2.51755;
+alt[124]:=3.315;
+alt[125]:=2.51755;
+alt[126]:=2.45997;
+alt[127]:=-0.16251;
+alt[128]:=2.37753;
+alt[129]:=-0.16251;
+alt[130]:=0.474975;
+alt[131]:=2.51755;
+alt[132]:=2.67752;
+alt[133]:=3.3425;
+alt[134]:=3.52747;
+alt[135]:=4.36249;
+alt[136]:=2.19745;
+alt[137]:=3.315;
+alt[138]:=5.48498;
+alt[139]:=5.48498;
+alt[140]:=3.15994;
+alt[141]:=2.28744;
+alt[142]:=2.28744;
+alt[143]:=3.07498;
+alt[144]:=4.63748;
+alt[145]:=3.315;
+alt[146]:=2.19745;
+alt[147]:=2.19497;
+alt[148]:=4.13498;
+alt[149]:=1.47751;
+alt[150]:=2.22751;
+alt[151]:=3.315;
+alt[152]:=3.11746;
+alt[153]:=3.3425;
+alt[154]:=3.315;
+alt[155]:=2.51755;
+alt[156]:=3.07498;
+alt[157]:=3.315;
+alt[158]:=5.33246;
+alt[159]:=2.19745;
+alt[160]:=2.54245;
+alt[161]:=1.24496;
+alt[162]:=3.315;
+alt[163]:=2.89249;
+alt[164]:=5.33246;
+alt[165]:=2.44247;
+alt[166]:=4.63748;
+alt[167]:=4.63748;
+alt[168]:=3.3425;
+alt[169]:=1.1625;
+alt[170]:=2.67752;
+alt[171]:=2.56498;
+alt[172]:=-1.05997;
+alt[173]:=4.63748;
+alt[174]:=5.33246;
+alt[175]:=2.19745;
+alt[176]:=3.315;
+alt[177]:=3.315;
+alt[178]:=3.315;
+alt[179]:=1.47751;
+alt[180]:=4.38999;
+alt[181]:=4.38999;
+alt[182]:=4.38999;
+alt[183]:=4.13498;
+alt[184]:=4.13498;
+alt[185]:=4.38999;
+alt[186]:=3.3425;
+alt[187]:=2.28253;
+alt[188]:=4.38999;
+alt[189]:=4.38999;
+alt[190]:=4.38999;
+alt[191]:=4.13498;
+alt[192]:=4.38999;
+alt[193]:=4.38999;
+alt[194]:=4.38999;
+alt[195]:=4.13498;
+alt[196]:=3.3425;
+alt[197]:=4.10748;
+alt[198]:=4.36249;
+alt[199]:=4.36249;
+alt[200]:=4.36249;
+alt[201]:=4.10748;
+alt[202]:=4.10748;
+alt[203]:=2.41498;
+alt[204]:=3.09;
+alt[205]:=4.36249;
+alt[206]:=4.36249;
+alt[207]:=4.36249;
+alt[208]:=4.10748;
+alt[209]:=4.38999;
+alt[210]:=3.3425;
+alt[211]:=2.28253;
+alt[212]:=3.315;
+alt[213]:=3.315;
+alt[214]:=3.315;
+alt[215]:=3.04749;
+alt[216]:=3.04749;
+alt[217]:=3.52747;
+alt[218]:=2.19497;
+alt[219]:=1.1625;
+alt[220]:=3.315;
+alt[221]:=3.315;
+alt[222]:=3.315;
+alt[223]:=3.04749;
+alt[224]:=3.315;
+alt[225]:=3.315;
+alt[226]:=3.315;
+alt[227]:=3.04749;
+alt[228]:=3.315;
+alt[229]:=3.04749;
+alt[230]:=3.315;
+alt[231]:=3.315;
+alt[232]:=3.315;
+alt[233]:=3.04749;
+alt[234]:=3.04749;
+alt[235]:=2.64246;
+alt[236]:=2.00497;
+alt[237]:=3.315;
+alt[238]:=3.315;
+alt[239]:=3.315;
+alt[240]:=3.04749;
+alt[241]:=2.37753;
+alt[242]:=2.37753;
+alt[243]:=2.11002;
diff --git a/graphics/metapost/contrib/macros/txp/fontdata/fpzcmi8r b/graphics/metapost/contrib/macros/txp/fontdata/fpzcmi8r
new file mode 100644
index 0000000000..42ba42eeca
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/fontdata/fpzcmi8r
@@ -0,0 +1,229 @@
+alt[15]:=2.96997;
+alt[16]:=2.02252;
+alt[17]:=2.02252;
+alt[18]:=2.86749;
+alt[19]:=5.79492;
+alt[20]:=2.86749;
+alt[21]:=3.45501;
+alt[22]:=-0.94751;
+alt[23]:=3.33496;
+alt[24]:=3.16498;
+alt[25]:=2.19745;
+alt[26]:=4.0275;
+alt[27]:=3.23248;
+alt[28]:=3.33496;
+alt[29]:=2.02249;
+alt[30]:=3.33496;
+alt[31]:=4.63745;
+alt[32]:=0;
+alt[33]:=2.86749;
+alt[34]:=4.63745;
+alt[35]:=2.96997;
+alt[36]:=2.89502;
+alt[37]:=2.73255;
+alt[38]:=2.86749;
+alt[39]:=4.63745;
+alt[40]:=2.19251;
+alt[41]:=2.19251;
+alt[42]:=4.21243;
+alt[43]:=2.12497;
+alt[44]:=0.027495;
+alt[45]:=2.19745;
+alt[46]:=0.58749;
+alt[47]:=2.86749;
+alt[48]:=2.86749;
+alt[49]:=2.96997;
+alt[50]:=2.86749;
+alt[51]:=2.86749;
+alt[52]:=2.86749;
+alt[53]:=3.23248;
+alt[54]:=2.86749;
+alt[55]:=3.0625;
+alt[56]:=2.86749;
+alt[57]:=2.86749;
+alt[58]:=2.02249;
+alt[59]:=1.46249;
+alt[60]:=2.28247;
+alt[61]:=2.05247;
+alt[62]:=2.28247;
+alt[63]:=2.86749;
+alt[64]:=2.86749;
+alt[65]:=3.0625;
+alt[66]:=3.0625;
+alt[67]:=2.86749;
+alt[68]:=3.0625;
+alt[69]:=3.0625;
+alt[70]:=2.50251;
+alt[71]:=1.82752;
+alt[72]:=3.45501;
+alt[73]:=2.96997;
+alt[74]:=2.3075;
+alt[75]:=2.14502;
+alt[76]:=2.86749;
+alt[77]:=3.45501;
+alt[78]:=2.73255;
+alt[79]:=2.86749;
+alt[80]:=3.16498;
+alt[81]:=2.14502;
+alt[82]:=2.34003;
+alt[83]:=2.57251;
+alt[84]:=3.33496;
+alt[85]:=3.0625;
+alt[86]:=3.45501;
+alt[87]:=3.45501;
+alt[88]:=2.86749;
+alt[89]:=2.34003;
+alt[90]:=3.0625;
+alt[91]:=2.35748;
+alt[92]:=2.86749;
+alt[93]:=2.35748;
+alt[94]:=4.21243;
+alt[95]:=-1.03748;
+alt[96]:=4.63745;
+alt[97]:=2.02249;
+alt[98]:=3.45501;
+alt[99]:=2.02249;
+alt[100]:=3.45501;
+alt[101]:=2.02249;
+alt[102]:=2.02252;
+alt[103]:=0.589995;
+alt[104]:=3.45501;
+alt[105]:=3.0625;
+alt[106]:=1.63;
+alt[107]:=2.58002;
+alt[108]:=3.45501;
+alt[109]:=2.02249;
+alt[110]:=2.02249;
+alt[111]:=2.02249;
+alt[112]:=0.589995;
+alt[113]:=0.95999;
+alt[114]:=2.02249;
+alt[115]:=2.02249;
+alt[116]:=2.60248;
+alt[117]:=2.02249;
+alt[118]:=2.39249;
+alt[119]:=2.39249;
+alt[120]:=1.14749;
+alt[121]:=0.589995;
+alt[122]:=2.17999;
+alt[123]:=2.35748;
+alt[124]:=3.45501;
+alt[125]:=2.35748;
+alt[126]:=2.60495;
+alt[127]:=0.027495;
+alt[128]:=1.43499;
+alt[129]:=0.027495;
+alt[130]:=0.58749;
+alt[131]:=2.71749;
+alt[132]:=2.71749;
+alt[133]:=3.16498;
+alt[134]:=2.73255;
+alt[135]:=3.73251;
+alt[136]:=2.22494;
+alt[137]:=2.86749;
+alt[138]:=4.63745;
+alt[139]:=4.63745;
+alt[140]:=3.02747;
+alt[141]:=2.19745;
+alt[142]:=2.19745;
+alt[143]:=3.16498;
+alt[144]:=3.94995;
+alt[145]:=3.23248;
+alt[146]:=2.22494;
+alt[147]:=2.02249;
+alt[148]:=3.00504;
+alt[149]:=1.14749;
+alt[150]:=2.04249;
+alt[151]:=2.71749;
+alt[152]:=2.92246;
+alt[153]:=2.34003;
+alt[154]:=3.45501;
+alt[155]:=1.82752;
+alt[156]:=2.96997;
+alt[157]:=2.86749;
+alt[158]:=4.63745;
+alt[159]:=2.22494;
+alt[160]:=2.05247;
+alt[161]:=1.21747;
+alt[162]:=2.86749;
+alt[163]:=2.96997;
+alt[164]:=4.63745;
+alt[165]:=2.12497;
+alt[166]:=4.21243;
+alt[167]:=4.21243;
+alt[168]:=3.33496;
+alt[169]:=0.589995;
+alt[170]:=1.99249;
+alt[171]:=2.60495;
+alt[172]:=-0.94751;
+alt[173]:=4.21243;
+alt[174]:=4.63745;
+alt[175]:=2.22494;
+alt[176]:=2.86749;
+alt[177]:=2.86749;
+alt[178]:=2.86749;
+alt[179]:=1.14749;
+alt[180]:=4.0275;
+alt[181]:=4.0275;
+alt[182]:=4.0275;
+alt[183]:=3.72751;
+alt[184]:=3.72751;
+alt[185]:=4.0275;
+alt[186]:=2.86749;
+alt[187]:=1.99249;
+alt[188]:=4.0275;
+alt[189]:=4.0275;
+alt[190]:=4.0275;
+alt[191]:=3.72751;
+alt[192]:=4.12997;
+alt[193]:=4.12997;
+alt[194]:=4.12997;
+alt[195]:=3.82999;
+alt[196]:=3.0625;
+alt[197]:=3.00504;
+alt[198]:=4.0275;
+alt[199]:=4.0275;
+alt[200]:=4.0275;
+alt[201]:=3.72751;
+alt[202]:=3.72751;
+alt[203]:=2.22494;
+alt[204]:=2.9375;
+alt[205]:=4.0275;
+alt[206]:=4.0275;
+alt[207]:=4.0275;
+alt[208]:=3.72751;
+alt[209]:=3.30503;
+alt[210]:=3.16498;
+alt[211]:=2.02252;
+alt[212]:=3.23248;
+alt[213]:=3.23248;
+alt[214]:=3.0625;
+alt[215]:=3.0625;
+alt[216]:=2.86749;
+alt[217]:=3.23248;
+alt[218]:=2.17999;
+alt[219]:=1.14749;
+alt[220]:=3.23248;
+alt[221]:=3.23248;
+alt[222]:=3.0625;
+alt[223]:=2.86749;
+alt[224]:=3.23248;
+alt[225]:=3.23248;
+alt[226]:=3.0625;
+alt[227]:=2.86749;
+alt[228]:=3.45501;
+alt[229]:=3.0625;
+alt[230]:=3.23248;
+alt[231]:=3.23248;
+alt[232]:=3.0625;
+alt[233]:=3.0625;
+alt[234]:=2.86749;
+alt[235]:=2.02249;
+alt[236]:=2.24249;
+alt[237]:=3.23248;
+alt[238]:=3.23248;
+alt[239]:=3.0625;
+alt[240]:=2.86749;
+alt[241]:=1.79998;
+alt[242]:=2.02252;
+alt[243]:=1.43499;
diff --git a/graphics/metapost/contrib/macros/txp/gentyp.awk b/graphics/metapost/contrib/macros/txp/gentyp.awk
new file mode 100644
index 0000000000..4f9da96007
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/gentyp.awk
@@ -0,0 +1,5 @@
+BEGIN {i=0}
+ $1 == "(CHARACTER" { letter[i]=$3; i++}
+ $1 == "(CHARHT" { high[i-1]=10*$3;}
+ $1 == "(CHARDP" { deph[i-1] = 10*$3 ;}
+END{for(j=0;j<229;j++) print "alt["j+15"]:="(high[j]+deph[j])/2-deph[j]";" > "fontdat";}
diff --git a/graphics/metapost/contrib/macros/txp/txp.mp b/graphics/metapost/contrib/macros/txp/txp.mp
new file mode 100644
index 0000000000..58f878d3d9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/txp/txp.mp
@@ -0,0 +1,25 @@
+def txp(expr s, pat, es, ef, hi, tr, se, lc, th, hig) =
+picture pt ,pic; string sp, ps; path pi;
+truecorners:=1; long[0]:=tr;
+pi := pat scaled ef shifted(-xpart center pat*(ef-1),-ypart center pat*(ef-1));
+for i = length s step -1 until 1:
+ ps:=substring(0,i) of s;
+ pic:=thelabel(ps,(0,0)) scaled es;
+ long[i]:=((2+se)*(xpart urcorner pic) + tr);
+endfor;
+for i=0 upto (length s) - 1:
+ sp:= substring(i,i+1) of s;
+ if sp <> " ":
+ x:= (long[i]+long[i+1])/2;
+ pt:= thelabel(sp ,(0,0)) scaled es shifted (x,0);
+ for j = 16 upto 243:
+ if sp = char(j): k:=j; fi; endfor;
+ h:=es*(alt[k] + hi);
+ draw pt shifted (-xpart pt,h) rotated angle direction arctime x of pi of pi shifted point arctime xpart pt of pi of pi withcolor lc;
+ fi; endfor;
+if th <> 0:
+ pickup pencircle scaled th;
+ draw pi withcolor red;
+fi;
+enddef;
+
diff --git a/graphics/metapost/contrib/macros/venn/README b/graphics/metapost/contrib/macros/venn/README
new file mode 100644
index 0000000000..125813016b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/venn/README
@@ -0,0 +1,19 @@
+VENN.MP
+
+This package allow you to draw Venn diagrams, properly shaded, with Metapost.
+
+For example:
+
+ draw_venn_two(true,false,true,false) shifted (2in,1in);
+
+draws a diagram with the outer box shaded, with the first circle but not
+the second unshaded, with the intersection of the two shaded, and with the
+second circle but not the first unshaded. That is, this is a picture of
+the complement of the symmetric difference of A and B.
+
+There are commands also for draw_venn_three and for completeness
+draw_venn_one and draw_venn_none (go ahead and laugh; see if I care).
+
+The license is the LaTeX Project Public License.
+
+Jim Hefferon
diff --git a/graphics/metapost/contrib/macros/venn/venn.mp b/graphics/metapost/contrib/macros/venn/venn.mp
new file mode 100644
index 0000000000..8f1ff12e9f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/venn/venn.mp
@@ -0,0 +1,218 @@
+% venn.mp
+% MetaPost input file for venn diagrams.
+%
+% LICENSE
+% This is released under the LaTeX Project Public License.
+%
+% HISTORY
+% 2001-Apr-15 Jim Hefferon jim@joshua.smcvt.edu Written
+%
+
+%defaultscale := 9pt/fontsize defaultfont;
+
+newinternal venn_width, venn_height;
+venn_width := 100pt; venn_height := .618venn_width;
+newinternal venn_circle_diameter;
+venn_circle_diameter := .5venn_height;
+newinternal venn_pen;
+venn_pen := 0.4pt;
+vardef venn_shade = .9white enddef;
+vardef venn_unshade = white enddef;
+
+path venn_box; % box that borders a Venn diagram; `U'
+ venn_box = (0,0)--(venn_width,0)--(venn_width,venn_height)
+ --(0,venn_height)--cycle;
+newinternal venn_circle_left_shift,
+ venn_circle_right_shift,
+ venn_circle_top_shift,
+ venn_circle_bottom_shift;
+venn_circle_left_shift := .5venn_width;
+venn_circle_right_shift := venn_width-venn_circle_left_shift;
+venn_circle_top_shift := .5venn_height;
+venn_circle_bottom_shift := venn_height-venn_circle_bottom_shift;
+
+
+% ..... venn_color .......
+% Return either venn_shade or venn_unshade, as chosen.
+% ARGS
+% b A boolean
+% RETURNS
+% a color
+% USAGE
+% fill circle withcolor venn_color(true);
+%
+def venn_color(expr b) =
+ if b: venn_shade else: venn_unshade fi
+enddef;
+
+% ...... draw_venn_none ...........
+% Draw a Venn diagram with no enclosed circles (just the universal set)
+% ARGS
+% univ A boolean; color the set or not?
+% RETURNS
+% --
+% USAGE
+% draw_venn_none(true);
+% draws a shaded set.
+%
+def draw_venn_none(expr univ)text t =
+ begingroup
+ fill venn_box t withcolor venn_color(univ);
+ pickup pensquare scaled venn_pen; draw venn_box t;
+ endgroup
+enddef;
+
+% ...... draw_venn_one ...........
+% Draw a Venn diagram with one enclosed circle
+% ARGS
+% univ A boolean; color the universal set or not?
+% cl A boolean; color the circle?
+% RETURNS
+% --
+% USAGE
+% draw_venn_one(true,false);
+% draws a shaded set with the unshaded circle.
+%
+def draw_venn_one(expr univ, cl)text t =
+ begingroup
+ venn_circle_left_shift := .5venn_width;
+ venn_circle_right_shift := venn_width-venn_circle_left_shift;
+ venn_circle_top_shift := .5venn_height;
+ venn_circle_bottom_shift := venn_height-venn_circle_top_shift;
+
+ fill venn_box t withcolor venn_color(univ);
+ pickup pensquare scaled venn_pen; draw venn_box t;
+
+ save circle; path circle;
+ circle = fullcircle scaled venn_circle_diameter
+ shifted (venn_circle_left_shift,venn_circle_top_shift) t;
+ fill circle withcolor venn_color(cl);
+ pickup pencircle scaled venn_pen; draw circle;
+ endgroup
+enddef;
+
+% ...... draw_venn_two ...........
+% Draw a Venn diagram with two enclosed circles
+% ARGS
+% univ A boolean; color the universal set or not?
+% cl A boolean; color the left circle?
+% lr A boolean; color the intersection wedge?
+% cr A boolean; color the right circle?
+% RETURNS
+% --
+% USAGE
+% draw_venn_two(true,false,true,false) shifted (2in,1in);
+% draws a diagram, shifted.
+% NOTE
+% The trick here is to use mpost's buildcycle to define the
+% path `lr' outlining the intersection of the left and right
+% circles. Below the left circle is defined to be rotated -180.
+% That's because otherwise the intersection with the right
+% circle occurs on top early in the path, and on bottom late in
+% the path, and so the left of the lr region crosses through the
+% `point 0 of circle_left' boundary, which confuses buildcycle.
+% So, it's a hack.
+%
+def draw_venn_two(expr univ, cl, lr, cr)text t =
+ begingroup
+ venn_circle_left_shift := .4venn_width;
+ venn_circle_right_shift := venn_width-venn_circle_left_shift;
+ venn_circle_top_shift := .5venn_height;
+ venn_circle_bottom_shift := venn_height-venn_circle_top_shift;
+
+ fill venn_box t withcolor venn_color(univ);
+ pickup pensquare scaled venn_pen; draw venn_box t;
+
+ save circle_left, circle_right; path circle_left, circle_right;
+ circle_left = fullcircle rotated -180 scaled venn_circle_diameter
+ shifted (venn_circle_left_shift,venn_circle_top_shift) t;
+ circle_right = fullcircle scaled venn_circle_diameter
+ shifted (venn_circle_right_shift,venn_circle_top_shift) t;
+ save area_lr; path area_lr;
+ area_lr = buildcycle(circle_left,circle_right);
+
+ fill circle_left withcolor venn_color(cl);
+ fill circle_right withcolor venn_color(cr);
+ fill area_lr withcolor venn_color(lr);
+ pickup pencircle scaled venn_pen;
+ draw circle_left; draw circle_right;
+ endgroup
+enddef;
+
+
+
+% ...... draw_venn_three ...........
+% Draw a Venn diagram with three enclosed circles
+% ARGS
+% univ A boolean; color the universal set or not?
+% cl A boolean; color the left circle?
+% lr A boolean; color the intersection wedge?
+% cr A boolean; color the right circle?
+% lb A boolean; color the intersection of left and bot right circles?
+% rb A boolean; color the intersection of right and bot circles?
+% lrb A boolean; color the intersection of all three circles?
+% cb A boolean; color the bottom circle?
+% RETURNS
+% --
+% USAGE
+% draw_venn_three(true,false, ...) shifted (2in,1in);
+% draws a diagram, shifted.
+% NOTE
+% The trick here is to use mpost's buildcycle to define the
+% paths `lr' (outlining the intersection of the left and right
+% circles), `rb', `lb', and `lrb'.
+% To do that I had to fiddle with the times along the circles.
+% So, it's a hack.
+%
+def draw_venn_three(expr univ, cl, lr, cr, lb, rb, lrb, cb)text t =
+ begingroup
+ venn_circle_left_shift := .4venn_width;
+ venn_circle_right_shift := venn_width-venn_circle_left_shift;
+ venn_circle_top_shift := .63venn_height;
+ venn_circle_bottom_shift := venn_height-venn_circle_top_shift;
+
+ fill venn_box t withcolor venn_color(univ);
+ pickup pensquare scaled venn_pen; draw venn_box t;
+
+ save circle_left, circle_right, circle_bottom;
+ path circle_left, circle_right, circle_bottom;
+ circle_left = (reverse fullcircle) rotated -180 scaled venn_circle_diameter
+ shifted (venn_circle_left_shift,venn_circle_top_shift) t;
+ circle_right = (reverse fullcircle) scaled venn_circle_diameter
+ shifted (venn_circle_right_shift,venn_circle_top_shift) t;
+ circle_bottom = (reverse fullcircle) rotated -90 scaled venn_circle_diameter
+ shifted (.5venn_width,venn_circle_bottom_shift) t;
+ save area_lr, area_lb, area_rb, area_lrb;
+ path area_lr, area_lb, area_rb, area_lrb;
+ area_lr = buildcycle(circle_left,circle_right);
+ area_lb = buildcycle(circle_left,circle_bottom);
+ area_rb = buildcycle(circle_right,circle_bottom);
+ area_lrb = buildcycle(circle_left,circle_right,circle_bottom);
+
+ fill circle_left withcolor venn_color(cl);
+ fill circle_right withcolor venn_color(cr);
+ fill circle_bottom withcolor venn_color(cb);
+ fill area_lr withcolor venn_color(lr);
+ fill area_lb withcolor venn_color(lb);
+ fill area_rb withcolor venn_color(rb);
+ fill area_lrb withcolor venn_color(lrb);
+ pickup pencircle scaled venn_pen;
+ draw circle_left; draw circle_right; draw circle_bottom;
+ endgroup
+enddef;
+
+
+% test: This works for me under Linux (2001-Apr-15)
+% > mpost venn
+% > tex mproof venn.0
+% > dvips -Pwww -omproof.ps mproof
+% results in a document mproof.ps in PostScript that I can see with
+% > gv mproof.ps (type that from an XWindow xterm).
+
+% To run the test, uncomment the next five lines (including the `end').
+%beginfig(0);
+% draw_venn_three(false,true,false,true,false,true,true,false);
+% draw_venn_three(false,true,false,true,false,true,true,false) shifted (2in,3in);
+%endfig;
+%end
+
diff --git a/graphics/metapost/contrib/misc/mp.mft b/graphics/metapost/contrib/misc/mp.mft
new file mode 100644
index 0000000000..b1a5a7b0ae
--- /dev/null
+++ b/graphics/metapost/contrib/misc/mp.mft
@@ -0,0 +1,62 @@
+%%%% MFT commands for METAPOST including PLAIN and MFPLAIN
+%%% } ( ) ]] ! ^ %%%% tokens that need no special formatting
+%%% step upto downto %%%% boldface binary operators
+%%% addto fill unfill draw undraw %%%% boldface unary operators
+%%% addto filldraw unfilldraw drawdot undrawdot erase pickup
+%%% addto exitunless stop incr decr proofrulethickness screenrule
+%%% addto define_pixels define_whole_pixels define_whole_vertical_pixels
+%%% addto define_blacker_pixels define_whole_blacker_pixels
+%%% addto define_corrected_pixels lowres_fix proofoffset penstroke
+%%% addto beginchar italcorr font_size font_slant labels
+%%% addto font_normal_space font_normal_stretch font_normal_shrink font_quad
+%%% addto font_x_height font_extra_space font_identifier font_coding_scheme
+%%% enddef endchar %%%% boldface closing
+%%% true relax mode_setup %%%% boldface nullary operators
+%%% true clearit shipit cullit openit showit clearxy clearpen
+%%% true nodisplay notransforms screenchars screenstrokes imagerules
+%%% .. ... -- --- %%%% path operators made of dots and dashes
+%%% length flex abs dir %%%% unary operators to be in roman type
+%%% length unitvector inverse ceiling round hround vround counterclockwise
+%%% length tensepath byte reflectedabout rotatedaround magstep max min
+%%% and mod dotprod intersectionpoint softjoin %%%% binary operators to be roman
+%%% ++ ** %%%% binary operators made of two special characters
+%%% penoffset goodval direction directionpoint %%%% operators that take "of"
+%%% pausing tolerance pixels_per_inch blacker o_correction %%%% internals
+%%% pausing screen_rows screen_cols currentwindow displaying
+%%% pausing pen_top pen_bot pen_lft pen_rt rt lft top bot
+%%% = <= >= <> %%%% conversions for the SAIL character set only
+%%%% METAPOST primitives not found in METAFONT
+%%% beginchar btex %%%% boldface opening
+%%% endchar etex %%%% boldface closing
+%%% addto clip mpxbreak setbounds verbatimtex %%%% boldface operators
+%%% font_size fontsize
+%%% length bluepart greenpart redpart %%%% operators in roman
+%%% length llcorner lrcorner ulcorner urcorner
+%%% scaled dashed withcolor
+%%% pair color
+%%%% Variables and macros defined only in plain METAPOST
+%%% beginchar beginfig %%%% boldface opening
+%%% endchar endfig %%%% boldface closing
+%%% addto bbox buildcycle center dashpattern %%%% boldface operators
+%%% addto dotlabel dotlabels label thelabel
+%%% addto drawarrow drawdblarrow drawoptions
+%%% scaled beveled butt evenly mitered rounded squared
+%%%% Macros and internal variables defined only in the MFPLAIN package
+%%% define_blacker_pixels define_good_x_pixels define_good_y_pixels
+%%% define_corrected_pixels define_horizontal_corrected_pixels
+%%% define_whole_blacker_pixels define_whole_vertical_blacker_pixels
+%%% addto makebox makegrid maketicks
+%%% mode_setup mode_def capsule_def
+%%% proofrulethickness proofrule
+%%%% defined as no-ops in the MFPLAIN package
+%%% addto nodisplays unitpixel
+%%%%
+%%%% In case you feel that some more elements of standard METAPOST
+%%%% require special treatment or if you think that some of my choices
+%%%% of roman and bold type were inadequate, please let me know.
+%%%%
+%%%% Enjoy!
+%%%%
+%%%% Andreas Scherer
+%%%% AaXen University of TeXnology, Germany
+%%%% <scherer@genesis.informatik.rwth-aachen.de>
diff --git a/graphics/metapost/contrib/misc/mp2.mft b/graphics/metapost/contrib/misc/mp2.mft
new file mode 100644
index 0000000000..a1f0b36f97
--- /dev/null
+++ b/graphics/metapost/contrib/misc/mp2.mft
@@ -0,0 +1,146 @@
+%%%% ========================================================================
+%%%% @MFT-file{
+%%%% author = "Ulrik Vieth",
+%%%% email = "vieth@thphy.uni-duesseldorf.de",
+%%%% filename = "mp2.mft",
+%%%% version = "0.10",
+%%%% date = "29 January 1996",
+%%%% time = "00:30:06 MET",
+%%%% codetable = "ISO/ASCII",
+%%%% checksum = "00449 146 841 6351",
+%%%% supported = "yes",
+%%%% keywords = "MFT, METAFONT, MetaPost, pretty-printing",
+%%%% abstract = "",
+%%%% docstring = "",
+%%%% }
+%%%% ========================================================================
+%%%%
+%%%% MFT commands for METAPOST including "plain" and "mfplain"
+%%%%
+%%%% This file is loosely based on the file "mp.mft" by Andreas Scherer
+%%%% <scherer@genesis.informatik.rwth-aachen.de>, but numerous changes
+%%%% have been made. In particular, support for some standard MetaPost
+%%%% packages like "graph.mp" and "boxes.mp" has been added.
+%%%%
+%%%%
+%%%% METAPOST primitives not found in METAFONT
+%%%% (METAFONT primitives are hard-wired in the MFT program)
+%%%%
+%%% step within %%%% boldface binary operators
+%%% addto btex verbatimtex readfrom write %%%% boldface unary operators
+%%% addto clip setbounds
+%%% enddef etex %%%% boldface closing
+%%% true mpxbreak %%%% boldface nullary operators
+%%% length redpart greenpart bluepart %%%% unary operators in roman
+%%% length fontpart textpart pathpart penpart dashpart fontsize
+%%% length llcorner lrcorner ulcorner urcorner arclength
+%%% length stroked filled textual clipped bounded
+%%% and infont %%%% binary operators in roman
+%%% penoffset arctime %%%% operators that take "of"
+%%% withpen withcolor dashed %%%% drawing options
+%%% pair color %%%% data types
+%%% pausing tracinglostchars %%%% internals
+%%% pausing linejoin linecap miterlimit prologues truecorners
+%%%%
+%%%% Variables and macros defined both in "plain.mf" and "plain.mp"
+%%%% (from "plain.mft", but severly edited)
+%%%%
+%%% } ( ) ]] ! ^ %%%% tokens that need no special formatting
+%%% .. ... -- --- %%%% path operators made of dots and dashes
+%%% ++ ** %%%% binary operators made of two special characters
+%%% step upto downto thru %%%% boldface binary operators
+%%% addto fill unfill draw undraw %%%% boldface unary operators
+%%% addto filldraw unfilldraw drawdot undrawdot cutdraw cutoff culldraw
+%%% addto erase pickup penstroke
+%%% addto exitunless stop incr decr range
+%%% pencircle pensquare penrazor penspeck
+%%% true relax blankpicture %%%% boldface nullary operators
+%%% true clearit shipit cullit openit showit clearxy clearpen savepen
+%%% length abs dir byte %%%% unary operators to be in roman type
+%%% length unitvector inverse ceiling round hround vround counterclockwise
+%%% length tensepath reflectedabout rotatedaround rotatedabout
+%%% length magstep max min
+%%% and mod div dotprod
+%%% and intersectionpoint softjoin %%%% binary operators to be roman
+%%% penoffset direction directionpoint %%%% operators that take "of"
+%%% penoffset takepower
+%%% pausing pen_top pen_bot pen_lft pen_rt
+%%% pausing lft rt top bot llft lrt ulft urt
+%%% end bye
+%%%%
+%%%% Variables and macros defined only in "plain.mp"
+%%%%
+%%% addto beginfig %%%% boldface opening
+%%% enddef endfig %%%% boldface closing
+%%% addto dashpattern image bbox %%%% boldface operators
+%%% addto label dotlabel thelabel %%%% FIXME: handling of suffixes?
+%%% addto makelabel labels dotlabels penlabels
+%%% addto arrowhead drawarrow drawdblarrow drawoptions
+%%% length center on off %%%% unary operators in roman
+%%% and cutbefore cutafter %%%% binary operators in roman
+%%% pausing beveled butt mitered rounded squared evenly withdots
+%%% pausing EOF
+%%%%
+%%%% Variables and macros defined only in "mfplain.mp"
+%%%% (for METAFONT compatibility, partly from "plain.mft")
+%%%%
+%%% addto beginchar %%%% boldface opening
+%%% enddef endchar %%%% boldface closing
+%%% addto define_pixels define_whole_pixels define_whole_vertical_pixels
+%%% addto define_good_x_pixels define_good_y_pixels define_blacker_pixels
+%%% addto define_whole_blacker_pixels define_whole_vertical_blacker_pixels
+%%% addto define_corrected_pixels define_horizontal_corrected_pixels
+%%% addto lowres_fix screenrule proofrule proofoffset proofrulethickness
+%%% addto makebox makegrid maketicks
+%%% addto italcorr font_size font_slant
+%%% addto font_normal_space font_normal_stretch font_normal_shrink font_quad
+%%% addto font_x_height font_extra_space font_identifier font_coding_scheme
+%%% addto mode_def capsule_def
+%%% true mode_setup
+%%% true nodisplays notransforms screenchars screenstrokes
+%%% true imagerules gfcorners
+%%% pausing tolerance pixels_per_inch blacker o_correction %%%% internals
+%%% pausing screen_rows screen_cols currentwindow displaying proofing
+%%%%
+%%%% Variables and macros defined in "graph.mp", "marith.mp", "sarith.mp"
+%%%%
+%%% addto begingraph %%%% boldface opening
+%%% enddef endgraph %%%% boldface closing
+%%% addto gdraw gfill gdata %%%% boldface operators
+%%% addto glabel gdotlabel augment %%%% FIXME: handling of suffixes?
+%%% addto gdrawarrow gdrawdblarrow gdrawoptions
+%%% addto setcoords setrange
+%%% good auto
+%%% addto itick otick grid autogrid frame
+%%% addto format
+%%% length Mabs Sabs Scvnum Mlog_str %%%% unary operators in roman
+%%% and Madd Msub Mmul Mdiv Mleq %%%% binary operators in roman
+%%% and Sadd Ssub Smul Sdiv Sleq Sneq
+%%% pausing linear log OUT %%%% internals
+%%%%
+%%%% Variables and macros defined in "boxes.mp" and "rboxes.mp"
+%%%%
+%%% addto drawboxes drawboxed drawunboxed boxjoin boxit circleit rboxit
+%%% pausing defaultdx defaultdy
+%%%%
+%%%% Last minute items: override some builtin defaults
+%%%%
+%%% addto step fi makepen makepath
+%%%%
+%%%%
+%%%% Finally some TeX hackery:
+%%%%
+%%%% - comments are normally flush left, not flush right
+%%%% - comments starting with %\[ are set flush right
+%%%% - comments starting with %\ are set off by \qquad
+%%%%
+%%%% - comments ending with \] are also set flush left
+%%%% (defined in mftmac.tex)
+%%%%
+%%\def\9{$\futurelet\next\doit}
+%%\let\[=\relax
+%%\def\doit{\ifx\next\[\def\next{\hfill{\rm\%}}%
+%% \else\ifx\next\ \def\next{\qquad{\rm\%}}%
+%% \else\def\next{{\rm\%}}\fi\fi\next}
+%%%%
+%%%% End of file `mp2.mft'.
diff --git a/graphics/metapost/contrib/misc/mp2mft.sed b/graphics/metapost/contrib/misc/mp2mft.sed
new file mode 100644
index 0000000000..397c232874
--- /dev/null
+++ b/graphics/metapost/contrib/misc/mp2mft.sed
@@ -0,0 +1,37 @@
+### ========================================================================
+### @SED-file{
+### author = "Ulrik Vieth",
+### email = "vieth@thphy.uni-duesseldorf.de",
+### filename = "mp2mft.sed",
+### version = "0.07",
+### date = "29 January 1996",
+### time = "01:05:16 MET",
+### codetable = "ISO/ASCII",
+### checksum = "45153 37 192 1531",
+### supported = "yes",
+### keywords = "MFT, MetaPost, pretty-printing",
+### abstract = "",
+### docstring = "",
+### }
+### ========================================================================
+#
+# Convert METAPOST sources for MFT input:
+#
+# Present material in `btex ... etex' as a TeXnical MFT comment.
+# The `btex ... etex' groups may not extend across line breaks.
+# And there may be only one such group per line.
+#
+# This file is mostly based on the file "mft.sed" by Andreas Scherer
+# <scherer@genesis.informatik.rwth-aachen.de>, but some changes and
+# corrections have been made. TeX labels are now printed verbatim
+# (as quoted strings) so that their information won't get lost.
+#
+# Usage:
+#
+# sed -f mp2mft.sed < file.mp > file.mf
+# mft file[.mf] -s mp2[.mft]
+#
+# Code:
+#
+/verbatimtex/ s/\(.*\)verbatimtex[ ]\+\(.*\)[ ]\+etex\(.*\)/\1verbatimtex ... etex\3 %\\ \\TeX\\ code: |"\2"|/
+/btex/ s/\(.*\)btex[ ]\+\(.*\)[ ]\+etex\(.*\)/\1btex ... etex\3 %\\ \\TeX\\ label: |"\2"|/
diff --git a/graphics/metapost/contrib/misc/mpt b/graphics/metapost/contrib/misc/mpt
new file mode 100644
index 0000000000..3964236bff
--- /dev/null
+++ b/graphics/metapost/contrib/misc/mpt
@@ -0,0 +1,85 @@
+#!/bin/sh
+### ====================================================================
+### @UNIX-shell-file{
+### author = "Ulrik Vieth",
+### email = "vieth@thphy.uni-duesseldorf.de",
+### filename = "mpt",
+### version = "0.05",
+### date = "29 January 1996",
+### time = "02:28:37 MET",
+### codetable = "ISO/ASCII",
+### checksum = "21388 85 335 2331",
+### keywords = "MFT, MetaPost, pretty-printing",
+### supported = "yes",
+### abstract = "",
+### docstring = "",
+### }
+### ====================================================================
+#
+# Process METAPOST sources with MFT, converting them to a form
+# suitable for MFT processing using a sed script if necessary.
+#
+# This file assumes that some standard Unix utilities like
+# echo, grep, sed, and basename are available.
+#
+# The source file (file.mp) is assumed to exist and to be found
+# in the current directory. The target file (file.mf) will be
+# overwritten if it already exists. It is necessary to use the
+# file extension `.mf' for the target file, since newer versions
+# of MFT might produce unpredictable file names otherwise.
+#
+# Usage:
+#
+# mpt file[.mp]
+#
+# Code:
+#
+if [ $# != 1 ]; then
+ echo "Usage: mpt file[.mp]"; exit 1
+fi
+
+# Standard Unix utilities:
+GREP=grep
+SED=sed
+
+# Standard TeXware/METAFONTware utiltities:
+MFT=mft
+
+# The SED script for preprocessing:
+MP2SED=mp2mft.sed
+#MP2SED=$TEXMF/mft/mp2mft.sed
+
+# The MFT style file (without .mft):
+MP2MFT=mp2
+
+# The source and target files:
+#
+MPFILE=`basename $1 .mp`.mp
+MFFILE=`basename $1 .mp`.mf
+
+if [ ! -f "$MPFILE" -o ! -r "$MPFILE" ]; then
+ echo "mpt: Can't read from source file \"$MPFILE\"!"; exit 1
+fi
+if [ -f "$MFFILE" -a ! -w "$MFFILE" ]; then
+ echo "mpt: Can't write to target file \"$MFFILE\"!"; exit 1
+fi
+
+# Check if preprocessing $MPFILE with sed is needed:
+#
+$GREP "\(btex\|etex\|verbatimtex\)" $MPFILE > /dev/null
+case $? in
+ 0)
+ # there were matches, so convert it
+ #
+ $SED -f $MP2SED < $MPFILE > $MFFILE
+ $MFT $MFFILE -s $MP2MFT
+ exit 0
+ ;;
+ 1)
+ # there were no matches, so copy it
+ #
+ $SED $MPFILE $MFFILE
+ $MFT $MPFILE -s $MP2MFT
+ exit 0
+ ;;
+esac
diff --git a/graphics/metapost/contrib/tools/MPEdit/Readme.txt b/graphics/metapost/contrib/tools/MPEdit/Readme.txt
new file mode 100644
index 0000000000..1cfaa9bb8b
--- /dev/null
+++ b/graphics/metapost/contrib/tools/MPEdit/Readme.txt
@@ -0,0 +1,38 @@
+MetaPost Editor MPEdit
+**********************
+Version 1.0
+
+The MetaPost system implements a picture-drawing language very
+much like Knuth's METAFONT except that it outputs PostScript
+commands instead of run-length-encoded bitmaps. MetaPost is a
+powerful language for producing gures for documents to be printed
+on PostScript printers. It provides easy access to all the
+features of PostScript and it includes facilities for integrating
+text and graphics.
+
+MPEdit is developed to provide main possibilities on creation and
+editing of MetaPost files. MPEdit use of the standard Multiple
+Document Interface (MDI) and work with MS Windows™ 9x, Windows NT
+and Windows 2000.
+
+MPEdit works in LaTex environment. For production and review of a
+figure in PostScript format the programs mp, latex, dvips and
+gsview are used.
+
+MPEdit can be used for general purposes and is free distributed.
+There is no necessity to register for using MPEdit, or moreover,
+to buy a licence to use it. But you may not change a single bit,
+you may not exclude any files or add something to the package and
+you may not make another package on this basis.
+
+We do not warrant that the software is error free.
+
+Installation
+************
+MPEdit is distributed as MPEdit.exe. Run MPEdit.exe and simply
+follow the on-screen instructions to install MPEdit.
+
+MPEdit is copyright (C) 2001, by Petr and Nikolay Vabishchevich.
+Contact: e-mail: vab@imamod.ru
+
+
diff --git a/graphics/metapost/contrib/tools/mpstoeps/README b/graphics/metapost/contrib/tools/mpstoeps/README
new file mode 100644
index 0000000000..41c48a0758
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mpstoeps/README
@@ -0,0 +1,15 @@
+This script converts MetaPost output files (with .mps file extensions )
+into stand-alone (self-contained) Encapsulated PostScript files (with
+all necessary fonts included. Although MetaPost figures' final
+destination are often inclusion into TeX documents, it is often useful
+to view the figures during their development process. To this end,
+stand-alone EPS figures are often desired.
+
+Usage: mpstoeps foo.mps
+
+converts foo.mps into the stand-alone EPS foo.eps
+
+Note: The canonical naming scheme for MetaPost output files (with source
+foo.mp) is foo.1, foo.2, etc. For philosophical reasons, this script
+requires an alternative naming scheme (e.g. foo_1.mps, foo_2.mps, etc.)
+so that the .mps file extension is appended to the MetaPost jobname.
diff --git a/graphics/metapost/contrib/tools/mpstoeps/mpstoeps b/graphics/metapost/contrib/tools/mpstoeps/mpstoeps
new file mode 100644
index 0000000000..54c93e0e1d
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mpstoeps/mpstoeps
@@ -0,0 +1,121 @@
+#!/usr/bin/env perl
+
+###########################################################################
+# This script converts MetaPost output files (with .mps file extensions ) #
+# into stand-alone (self-contained) Encapsulated PostScript files (with #
+# all necessary fonts included. Although MetaPost figures' final #
+# destination are often inclusion into TeX documents, it is often useful #
+# to view the figures during their development process. To this end, #
+# stand-alone EPS figures are often desired. #
+###########################################################################
+
+##################################################
+# Author : Troy Henderson #
+# Created On : Tue Jun 29 14:27:08 CDT 2004 #
+# Last Modified By: Troy Henderson #
+# Last Modified On: Thu Dec 22 04:30:59 EST 2005 #
+# Update Count : 3 #
+##################################################
+
+use POSIX qw(ceil);
+use File::Temp;
+use File::Copy;
+use Cwd;
+
+########################################
+# Make sure input argument are correct #
+########################################
+$0 =~/.*[\/\\](.*)/;$scriptname = $1;
+
+if (@ARGV != 1 & @ARGV != 2) {
+ &usage;
+}
+if (@ARGV == 1 ) {
+ $MPSfile=$ARGV[0];
+} else {
+ &usage;
+}
+
+$MPSfile =~ /(.*)\.mps$/; $basename = $1;
+if ( $MPSfile ne "$basename\.mps" ) {
+ &usage;
+}
+
+########################################
+# Start the process of embedding fonts #
+########################################
+$cwd = getcwd;
+$dir = File::Temp::tempnam(".","");
+mkdir $dir;
+copy("$MPSfile","$dir");
+chdir($dir);
+
+open(MYFILE,"< $MPSfile");
+foreach $line (<MYFILE>) {
+ if($line =~ "\%\%BoundingBox: ") {
+ $line =~ s/\%\%BoundingBox: //;
+ $line =~ s/\n//;
+ @line = split(/ /,$line);
+ $width=$line[2]-$line[0];
+ $height=$line[3]-$line[1];
+ $width=$line[2]-$line[0];
+ $height=$line[3]-$line[1];
+ last;
+ }
+}
+close(MYFILE);
+
+open MYFILE, "> $basename.tex";
+#$width+=24;
+#$height+=24;
+$width++;
+$height++;
+print MYFILE "\\documentclass[12pt]{article}\n";
+print MYFILE "\\usepackage{graphicx}\n";
+print MYFILE "\\usepackage[papersize={$width"."bp,$height"."bp},margin={0pt,0pt},noheadfoot,nomarginpar]{geometry}\n";
+print MYFILE "\\begin{document}\n";
+print MYFILE "\\thispagestyle{empty}\n";
+print MYFILE "\\noindent\\includegraphics{$MPSfile}\n";
+print MYFILE "\\end{document}";
+close(MYFILE);
+$command="latex --interaction=nonstopmode $basename.tex > null;
+dvips -T $width"."bp,$height"."bp -E -q -o $basename.eps $basename.dvi > null";
+close MYFILE;
+system($command);
+
+######################################################
+# Strip out unwanted lines for the newly created EPS #
+######################################################
+open MYFILE, "$basename.eps";
+open MYFILE2,"> $cwd/$basename.eps";
+$BBOX = 0;
+foreach $line (<MYFILE>) {
+ if ($BBOX == 0 & $line =~ /^%%BoundingBox:/ ) {
+ @nums = $line =~ /(\d+) (\d+) (\d+) (\d+)/;
+# $nums[0]++; $nums[1]++; $nums[2]--; $nums[3]--;
+ $nums[0]--; $nums[1]++; $nums[2]--; $nums[3]--;
+ $BBOX = 1;
+ print MYFILE2 ("%%BoundingBox: $nums[0] $nums[1] $nums[2] $nums[3]\n");
+ } else {
+ print MYFILE2 $line unless $line =~ /^%DVIPS|^%%Creator|^%%Title/;
+ }
+}
+close MYFILE2;
+close MYFILE;
+
+#################
+# Clean up mess #
+#################
+system("rm -f *");
+chdir $cwd;
+
+##############################
+# Remove temporary directory #
+##############################
+rmdir($dir);
+
+sub usage {
+ print("Usage: $scriptname <MetaPost Output file>\n\n");
+ print("Note: MetaPost Output filename MUST have a \.mps extension\n");
+ exit;
+}
diff --git a/graphics/metapost/contrib/tools/mptopdf/scripts/context/perl/mptopdf.pl b/graphics/metapost/contrib/tools/mptopdf/scripts/context/perl/mptopdf.pl
new file mode 100644
index 0000000000..ec08c5306b
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/scripts/context/perl/mptopdf.pl
@@ -0,0 +1,154 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+# MikTeX users can set environment variable TEXSYSTEM to "miktex".
+
+#D \module
+#D [ file=mptopdf.pl,
+#D version=2010.05.28, % 2000.05.29
+#D title=converting MP to PDF,
+#D subtitle=\MPTOPDF,
+#D author=Hans Hagen,
+#D date=\currentdate,
+#D url=www.pragma-ade.nl,
+#D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+#C
+#C This module is part of the \CONTEXT\ macro||package and is
+#C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+#C details.
+
+# use File::Copy ; # not in every perl
+
+use Config ;
+use Getopt::Long ;
+use strict ;
+use File::Basename ;
+
+$Getopt::Long::passthrough = 1 ; # no error message
+$Getopt::Long::autoabbrev = 1 ; # partial switch accepted
+
+my $Help = 0;
+my $Latex = 0;
+my $RawMP = 1;
+my $MetaFun = 0 ;
+my $PassOn = '' ;
+
+&GetOptions
+ ( "help" => \$Help ,
+ "rawmp" => \$RawMP, # option is now default, but keep for compat
+ "metafun" => \$MetaFun,
+ "passon" => \$PassOn, # option is ignored, but keep for compat
+ "latex" => \$Latex ) ;
+
+my $program = "MPtoPDF 1.4.0" ;
+my $pattern = "@ARGV" ; # was $ARGV[0]
+my $miktex = 0 ;
+my $done = 0 ;
+my $report = '' ;
+my $mplatexswitch = " --tex=latex " ;
+
+my $dosish = ($Config{'osname'} =~/^(ms)?dos|^os\/2|^mswin/i) ;
+my $escapeshell = (($ENV{'SHELL'}) && ($ENV{'SHELL'} =~ m/sh/i ));
+
+if ($ENV{"TEXSYSTEM"}) {
+ $miktex = ($ENV{"TEXSYSTEM"} =~ /miktex/io) ;
+}
+
+my @files ;
+my $command = my $mpbin = '' ;
+
+# agressive copy, works for open files like in gs
+
+sub CopyFile {
+ my ($From,$To) = @_ ;
+ return unless open(INP,"<$From") ;
+ return unless open(OUT,">$To") ;
+ binmode INP ;
+ binmode OUT ;
+ while (<INP>) {
+ print OUT $_ ;
+ }
+ close (INP) ;
+ close (OUT) ;
+}
+
+if (($pattern eq '')||($Help)) {
+ print "\n$program : provide MP output file (or pattern)\n" ;
+ exit ;
+} elsif ($pattern =~ /\.mp$/io) {
+ shift @ARGV ; my $rest = join(" ", @ARGV) ;
+ if (open(INP,$pattern)) {
+ while (<INP>) {
+ if (/(documentstyle|documentclass|begin\{document\})/io) {
+ $Latex = 1 ; last ;
+ }
+ }
+ close (INP) ;
+ }
+ if ($Latex) {
+ $rest .= " $mplatexswitch" ;
+ }
+ if ($MetaFun) {
+ $mpbin = "mpost --progname=mpost --mem=metafun" ;
+ } else {
+ $mpbin = "mpost --mem=mpost" ;
+ }
+ my $runner = "$mpbin $rest $pattern" ;
+ print "\n$program : running '$runner'\n" ;
+ my $error = system ($runner) ;
+ if ($error) {
+ print "\n$program : error while processing mp file\n" ;
+ exit 1 ;
+ } else {
+ $pattern =~ s/\.mp$//io ;
+ @files = glob "$pattern.*" ;
+ }
+} elsif (-e $pattern) {
+ @files = ($pattern) ;
+} elsif ($pattern =~ /.\../o) {
+ @files = glob "$pattern" ;
+} else {
+ $pattern .= '.*' ;
+ @files = glob "$pattern" ;
+}
+
+foreach my $file (@files) {
+ $_ = $file ;
+ if (s/\.(\d+|mps)$// && -e $file) {
+ if ($miktex) {
+ $command = "pdftex -undump=mptopdf" ;
+ } else {
+ $command = "pdftex -fmt=mptopdf -progname=context" ;
+ }
+ if ($dosish) {
+ $command = "$command \\relax $file" ;
+ } else {
+ $command = "$command \\\\relax $file" ;
+ }
+ my $error = system($command) ;
+ if ($error) {
+ print "\n$program : error while processing tex file\n" ;
+ exit 1 ;
+ }
+ my $pdfsrc = basename($_).".pdf";
+ rename ($pdfsrc, "$_-$1.pdf") ;
+ if (-e $pdfsrc) {
+ CopyFile ($pdfsrc, "$_-$1.pdf") ;
+ }
+ if ($done) {
+ $report .= " +" ;
+ }
+ $report .= " $_-$1.pdf" ;
+ ++$done ;
+ }
+}
+
+if ($report eq '') {
+ $report = '*' ;
+}
+
+if ($done) {
+ print "\n$program : $pattern is converted to$report\n" ;
+} else {
+ print "\n$program : no filename matches $pattern\n" ;
+}
diff --git a/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mis.mkii b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mis.mkii
new file mode 100644
index 0000000000..f3bde453ba
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mis.mkii
@@ -0,0 +1,733 @@
+%D \module
+%D [ file=supp-mis,
+%D version=2004.10.26, % 1997.01.04,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Missing (For Generic Use),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D I will clean up this module (a la supp-pdf.tex preamble).
+
+%D Some support modules are more or less independant. This
+%D module, which is not part of plain \CONTEXT, provides the
+%D missing macros and declarations of registers.
+
+\ifx \undefined \writestatus \else \expandafter \endinput \fi
+
+%D Because \LATEX\ has no safe package loading mechanism, we
+%D need to take care of possible interference.
+
+\def\StartLatexHack % replace this by the one in supp-pdf
+ {\edef\StopLatexHack
+ {\catcode\string`\noexpand/=\the\catcode\string`/
+ \catcode\string`\noexpand-=\the\catcode\string`-
+ \catcode\string`\noexpand:=\the\catcode\string`:
+ \catcode\string`\noexpand;=\the\catcode\string`;
+ \catcode\string`\noexpand"=\the\catcode\string`"
+ \catcode\string`\noexpand<=\the\catcode\string`<
+ \catcode\string`\noexpand>=\the\catcode\string`>
+ \catcode\string`\noexpand`=\the\catcode\string``}%
+ \catcode\string`/=12 \catcode\string`-=12
+ \catcode\string`:=12 \catcode\string`;=12
+ \catcode\string`"=12 \catcode\string`<=12
+ \catcode\string`>=12 \catcode\string``=12 }
+
+%D This hack is needed especially for \LATEX\ users who use
+%D the Babel package. The Germans have active \type {"}'s, the
+%D Poles have \type {/}, while the French have \type {:} and
+%D \type {;} defines as command (thanks to Daniel Flipo for
+%D pointing that out and testing). Potentially active \type
+%D {?}'s and \type {!}'s are less dangerous since they are
+%D handled by the \type {\protect} and \type {\unprotect}
+%D macros.
+
+\StartLatexHack
+
+%D \macros
+%D {ifnocontextobject}
+%D
+%D First we take care of redundant defining. The next set of
+%D macros are a bit complicated by the fact that Plain
+%D \TEX\ defines the \type{\new}||macros as being outer.
+%D Furthermore nested \type{\if}'s can get us into
+%D trouble.
+
+\def\definecontextobject
+ {\iftrue}
+
+\def\gobblecontextobject
+ {\setbox0\hbox
+ \bgroup
+ \long\def\gobblecontextobject##1\fi{\egroup}%
+ \expandafter\gobblecontextobject\string}
+
+\long\def\ifnocontextobject#1\do
+ {\ifx#1\undefined
+ \expandafter\definecontextobject
+ \else
+ %\writestatus{system}{beware of conflicting \string#1}%
+ \expandafter\gobblecontextobject
+ \fi}
+
+%D \macros
+%D {beginETEX,beginTEX}
+%D
+%D Outside \CONTEXT\ we will not be \ETEX||aware.
+
+\long\def\beginETEX #1\endETEX {}
+
+\let\beginTEX\relax \let\endTEX\relax
+
+%D \macros
+%D {writestatus}
+%D
+%D We start each module with a message. Normally the output is
+%D formatted, but here we keep things simple.
+
+\ifnocontextobject \writestatus \do
+
+ \def\writestatus#1#2{\immediate\write16{#1 : #2}}
+
+\fi
+
+%D Let's see if it works.
+
+\writestatus{loading}{ConTeXt Support Macros / Miscellaneous (2004.10.26)}
+
+%D \macros
+%D {protect,unprotect}
+%D
+%D Next we present a poor mans alternative for \type{\protect}
+%D and \type{\unprotect}, two commands that enable us to use
+%D the characters \type{@}, \type{!} and \type{?} in macro
+%D names.
+
+\ifnocontextobject \protect \do
+
+ \let\protect\relax
+
+\fi
+
+\newcount\protectiondepth
+
+\ifnocontextobject \unprotect \do
+
+ \def\unprotect
+ {\advance\protectiondepth 1
+ \ifnum\protectiondepth=1
+ \let\normalprotect=\protect
+ \def\protect
+ {\ifnum\protectiondepth>0
+ \advance\protectiondepth -1
+ \ifnum\protectiondepth=0
+ \doprotect
+ \let\protect=\normalprotect
+ \fi
+ \fi}
+ \edef\doprotect
+ {\catcode`\noexpand @=\the\catcode`@\relax
+ \catcode`\noexpand !=\the\catcode`!\relax
+ \catcode`\noexpand ?=\the\catcode`?\relax}
+ \catcode`@=11
+ \catcode`!=11
+ \catcode`?=11
+ \fi}
+
+\fi
+
+%D We start using this one it at once.
+
+\unprotect
+
+%D \macros
+%D {scratch...,if...,next...}
+%D
+%D We need some scratch registers. Users are free to use them,
+%D but can never be sure of their value once another macro is
+%D called. We only allocate things when they are yet
+%D undefined. This way we can't mess up other macro packages,
+%D but of course previous definitions can mess up our modules.
+
+\ifnocontextobject \donetrue \do \newif\ifdone \fi
+
+% no time now, will do a better test later (based on dimendef)
+
+\def\!!stringa{plain} \ifx\!!stringa\fmtname \donetrue \else
+\def\!!stringa{eplain} \ifx\!!stringa\fmtname \donetrue \else
+\def\!!stringa{babel-plain} \ifx\!!stringa\fmtname \donetrue \else
+ \donefalse \fi \fi \fi
+
+\ifdone
+ % plain defines some 15 dimens, so we need to define a few
+ % dummies in order to get out of the scratch area
+ \newdimen\scratchdimen % 16
+ \newdimen\scratchdimen % 17
+ \newdimen\scratchdimen % 18
+ \newdimen\scratchdimen % 19
+ \newdimen\scratchdimen % 20
+ \newdimen\scratchdimen % 21
+\fi
+
+\def\stripnewabove#1%
+ {\ifnum10<9#1 #1\else\expandafter\stripnewabove\fi}%
+
+\def\newabove\csname#1\endcsname#2% \dimen \name
+ {\csname#1\endcsname#2%
+ \ifnum\expandafter\stripnewabove\meaning#2>20\else
+ \newabove\csname#1\endcsname#2%
+ \fi}
+
+\ifnocontextobject \scratchcounter \do \newabove \csname newcount\endcsname \scratchcounter \fi
+\ifnocontextobject \scratchtoks \do \newabove \csname newtoks\endcsname \scratchtoks \fi
+\ifnocontextobject \scratchdimen \do \newabove \csname newdimen\endcsname \scratchdimen \fi
+\ifnocontextobject \scratchskip \do \newabove \csname newskip\endcsname \scratchskip \fi
+\ifnocontextobject \scratchmuskip \do \newabove \csname newmuskip\endcsname \scratchmuskip \fi
+\ifnocontextobject \scratchbox \do \csname newbox\endcsname \scratchbox \fi
+\ifnocontextobject \scratchread \do \csname newread\endcsname \scratchread \fi
+\ifnocontextobject \scratchwrite \do \csname newwrite\endcsname \scratchwrite \fi
+
+%D Watch out, in the past we ran into troubles with \type {\onepoint}
+%D (and others) mening something different in \LATEX\ then here. In
+%D such situations clashes are bound to happen. For this reason the
+%D assignments are no inside the test. We try to catch those situations
+%D but we cannot keep ahead of the future.
+
+\ifnocontextobject \zeropoint \do \newdimen \zeropoint \zeropoint = 0pt \fi % else problems with dimen12
+\ifnocontextobject \onepoint \do \newdimen \onepoint \onepoint = 1pt \fi
+\ifnocontextobject \onebasepoint \do \newdimen \onebasepoint \onebasepoint = 1bp \fi
+\ifnocontextobject \zerocount \do \chardef \zerocount = 0 \fi
+\ifnocontextobject \plusone \do \chardef \plusone = 1 \fi
+\ifnocontextobject \minusone \do \newcount \minusone \minusone = -1 \fi
+\ifnocontextobject \thousandpoint \do \newdimen \thousandpoint \thousandpoint = 1000pt \fi
+\ifnocontextobject \onerealpoint \do \newdimen \onerealpoint \onerealpoint = 1pt \fi % latex has a funny \onepoint
+
+\ifnocontextobject \emptytoks \do \newtoks \emptytoks \fi
+\ifnocontextobject \nextbox \do \newbox \nextbox \fi
+\ifnocontextobject \nextdepth \do \newdimen \nextdepth \fi
+
+\ifnocontextobject \CONTEXTtrue \do \newif\ifCONTEXT \fi
+\ifnocontextobject \eightbitcharacterstrue \do \newif\ifeightbitcharacters \fi
+\ifnocontextobject \MPdrawingdonetrue \do \newif\ifMPdrawingdone \fi
+
+\ifnocontextobject \ifzeropt \do \let\ifzeropt\ifcase \fi
+
+%D \macros
+%D {@@...}
+%D
+%D We use symbolic name for \CATCODES. They can only be used
+%D when we are in unprotected state.
+
+\ifnocontextobject \@@escape \do \chardef\@@escape = 0 \fi
+\ifnocontextobject \@@begingroup \do \chardef\@@begingroup = 1 \fi
+\ifnocontextobject \@@endgroup \do \chardef\@@endgroup = 2 \fi
+\ifnocontextobject \@@endofline \do \chardef\@@endofline = 5 \fi
+\ifnocontextobject \@@ignore \do \chardef\@@ignore = 9 \fi
+\ifnocontextobject \@@space \do \chardef\@@space = 10 \fi
+\ifnocontextobject \@@letter \do \chardef\@@letter = 11 \fi
+\ifnocontextobject \@@other \do \chardef\@@other = 12 \fi
+\ifnocontextobject \@@active \do \chardef\@@active = 13 \fi
+\ifnocontextobject \@@comment \do \chardef\@@comment = 14 \fi
+
+\def\s!sp{sp}
+\def\s!pt{pt}
+\def\s!bp{bp}
+
+%D \macros
+%D {@EA,expanded,expandoneargafter,expandtwoargsafter}
+%D
+%D Also needed:
+
+\let\@EA=\expandafter \let\@@expanded\empty
+
+\def\expanded#1%
+ {\long\xdef\@@expanded{\noexpand#1}\@@expanded}
+
+\def\expandoneargafter#1#2%
+ {\@EA#1\@EA{#2}}
+
+\def\expandtwoargsafter#1#2#3%
+ {\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA{#3}}
+
+\def\@EAEAEA{\@EA\@EA\@EA}
+
+%D \macros
+%D {everyline,EveryLine,EveryPar}
+%D
+%D In \CONTEXT\ we use \type{\everypar} for special purposes
+%D and provide \type{\EveryPar} as an alternative. The same
+%D goes for \type{\everyline} and \type{\EveryLine}.
+
+\ifnocontextobject \everyline \do \newtoks\everyline \fi
+\ifnocontextobject \EveryPar \do \let\EveryPar =\everypar \fi
+\ifnocontextobject \EveryLine \do \let\EveryLine=\everyline \fi
+
+%D \macros
+%D {globallet}
+
+\def\globallet{\global\let}
+
+%D \macros
+%D {!!...}
+%D
+%D We reserve ourselves some scratch strings (i.e. macros)
+%D and some more counters.
+
+\ifnocontextobject \!!stringa \do \def\!!stringa {} \fi
+\ifnocontextobject \!!stringb \do \def\!!stringb {} \fi
+\ifnocontextobject \!!stringc \do \def\!!stringc {} \fi
+\ifnocontextobject \!!stringd \do \def\!!stringd {} \fi
+
+\ifnocontextobject \!!counta \do \newcount\!!counta {} \fi
+\ifnocontextobject \!!countb \do \newcount\!!countb {} \fi
+
+%D \macros
+%D {!!...}
+%D
+%D The next set of definitions speed up processing a bit.
+%D Furthermore it saves memory.
+
+\ifnocontextobject \!!zeropoint \do \def\!!zeropoint {0pt} \fi
+\ifnocontextobject \!!zerocount \do \def\!!zerocount {0} \fi
+\ifnocontextobject \!!tenthousand \do \def\!!tenthousand {10000} \fi
+
+\ifnocontextobject \!!width \do \def\!!width {width} \fi
+\ifnocontextobject \!!height \do \def\!!height {height} \fi
+\ifnocontextobject \!!depth \do \def\!!depth {depth} \fi
+
+\ifnocontextobject \!!plus \do \def\!!plus {plus} \fi
+\ifnocontextobject \!!minus \do \def\!!minus {minus} \fi
+\ifnocontextobject \!!to \do \def\!!to {to} \fi
+
+%D \macros
+%D {smashbox}
+%D
+%D The system modules offer a range of smashing macros, of
+%D which we only copied \type{\smashbox}.
+
+\ifnocontextobject \smashbox \do
+
+ \def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\fi
+
+%D \macros
+%D {dowithnextbox}
+%D
+%D Also without further comment, we introduce a macro that
+%D gets the next box and does something usefull with it.
+%D Because the \type{\afterassignment} is executed inside the
+%D box, we have to use a \type{\aftergroup} too.
+
+\ifnocontextobject \dowithnextbox \do
+
+ \def\dowithnextbox#1%
+ {\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+ \def\dododowithnextbox%
+ {\aftergroup\dodowithnextbox}
+
+\fi
+
+%D \macros
+%D {setvalue,setevalue,setxvalue,,setgvalue,
+%D getvalue,
+%D letvalue,letgvalue}
+%D
+%D The next two macros expand their argument to
+%D \type{\argument}. The first one is used to define macro's
+%D the second one executes them.
+
+\ifnocontextobject \setvalue \do
+
+ \def\setvalue #1{\expandafter\def\csname#1\endcsname}
+ \def\setevalue#1{\expandafter\edef\csname#1\endcsname}
+ \def\setgvalue#1{\expandafter\gdef\csname#1\endcsname}
+ \def\setxvalue#1{\expandafter\xdef\csname#1\endcsname}
+ \def\getvalue #1{\csname#1\endcsname}
+ \def\letvalue #1{\expandafter\let\csname#1\endcsname}
+ \def\letgvalue#1{\global\expandafter\let\csname#1\endcsname}
+\fi
+
+%D \macros
+%D {unexpanded}
+%D
+%D The next command can be used as prefixed for commands that
+%D need protection during tests and writing to files. This
+%D is a very \CONTEXT\ specific one.
+
+\ifnocontextobject \unexpanded \do
+
+ \let\unexpanded\relax
+
+\fi
+
+%D \macros
+%D {convertargument}
+%D
+%D The original one offers a bit more, like global assignment, the
+%D the next implementation is however a bit more byte saving.
+
+\ifnocontextobject \convertargument \do
+
+ \def\doconvertargument#1>{}
+
+ \long\def\convertargument#1\to#2%
+ {\long\def\@@convertedargument{#1}%
+ \edef#2{\expandafter\doconvertargument\meaning\@@convertedargument}}
+
+\fi
+
+%D \macros
+%D {forgetall}
+%D
+%D Sometimes we have to disable interference of whatever kind
+%D of skips and mechanisms. The next macro resets some.
+
+\ifnocontextobject \forgetall \do
+
+ \def\forgetall
+ {\parskip\zeropoint
+ \leftskip\zeropoint
+ \parindent\zeropoint
+ \everypar{}}
+
+\fi
+
+%D \macros
+%D {withoutpt,
+%D ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D \TEX\ lacks some real datastructure. We can however use
+%D \DIMENSIONS. This kind of trickery is needed when we want
+%D \TEX\ to communicate with the outside world (by means of
+%D \type{\specials}).
+
+\ifnocontextobject \withoutpt \do
+
+ {\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+ \def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+ \def\ScaledPointsToBigPoints#1#2%
+ {\scratchdimen=#1sp\relax
+ \scratchdimen=.996264\scratchdimen
+ \edef#2{\withoutpt{\the\scratchdimen}}}
+
+ \def\ScaledPointsToWholeBigPoints#1#2%
+ {\scratchdimen=#1sp
+ \scratchdimen=.996264\scratchdimen
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by 32768
+ \divide\scratchcounter by 65536
+ \edef#2{\the\scratchcounter}}
+
+\fi
+
+%D \macros
+%D {doprocessfile}
+%D
+%D This macro takes three arguments: the file number, the
+%D filename and a macro that handles the content of a read
+%D line.
+
+\newif\iffileprocessed
+
+\ifnocontextobject \doprocessfile \do
+
+ \def\doprocessfile#1#2#3%
+ {\openin#1=#2\relax
+ \ifeof#1%
+ \fileprocessedfalse
+ \closein#1\relax
+ \else
+ \fileprocessedtrue
+ \gdef\dofinishfile%
+ {\closein#1\relax
+ \global\let\doprocessline\relax}%
+ \gdef\doprocessline%
+ {\ifeof#1%
+ \dofinishfile
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \expandafter\doprocessline
+ \fi}%
+ \expandafter\doprocessline
+ \fi}
+
+\fi
+
+%D \macros
+%D {uncatcodespecials}
+%D
+%D This one is taken from the \TEX\ book. The \CONTEXT\
+%D alternative is a bit different, but we hope this one works
+%D here.
+
+\ifx\dospecials\undefined
+
+ \def\dospecials
+ {\do\ \do\\\do\{\do\}\do\$%
+ \do\#\do\^\do\_\do\&\do\%%
+ \do\~\do\^^A\do\^^K}
+
+\fi
+
+\ifnocontextobject \uncatcodespecials \do
+
+ \def\uncatcodespecials
+ {\def\do##1{\catcode`##1=12 }\dospecials
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+\fi
+
+\ifnocontextobject \setnaturalcatcodes \do
+
+\def\setnaturalcatcodes
+ {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other
+ \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other
+ \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other
+ \catcode`\*=\@@other \catcode`\/=\@@other
+ \catcode`\-=\@@other \catcode`+=\@@other
+ \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other
+ \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other
+ \catcode`\:=\@@other \catcode`\;=\@@other
+ \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other
+ \catcode`\(=\@@other \catcode`\)=\@@other
+ \catcode`\{=\@@other \catcode`\}=\@@other
+ \catcode`\\=\@@other \catcode`\%=\@@other }
+
+\fi
+
+%D \macros
+%D {doglobal}
+%D
+%D Some \CONTEXT\ low level macros can have a \type{\doglobal}
+%D prefix. Let's just forget about that here:
+
+\ifnocontextobject \doglobal \do \let\doglobal\relax \fi
+
+%D The next obscure one is needed in the generic verbatim
+%D environment. When we end up with more of these, it's time
+%D to load the module \type{syst-gen}.
+
+\ifnocontextobject \doifincsnameelse \do
+
+ \def\dodoifincsnameelse#1#2%
+ {\def\dododoifincsnameelse##1#1##2##3\war%
+ {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ \expandafter\dododoifincsnameelse#2#1@@\war}
+
+ \long\def\doifincsnameelse#1#2#3#4%
+ {\edef\@@instring{#1}%
+ \expandafter\dodoifincsnameelse\expandafter{\@@instring}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\fi
+
+%D \macros
+%D {dostepwiserecurse, dorecurse, doloop, exitloop}
+%D
+%D The next loop macro is a real weak one, and does not offer
+%D the full \CONTEXT\ functionality, let alone nesting, but
+%D for simple purposes, its behaviour is acceptable.
+
+\newcount\recursecounter
+
+\def\dostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\ifnum#2<#1\relax\else\dodostepwiserecurse{#1}{#2}{#3}{#4}\fi}
+
+\def\dodostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\recursecounter=#1\relax
+ \loop
+ \edef\recurselevel{\the\recursecounter}%
+ #4\relax
+ \ifnum\recursecounter<#2\relax
+ \advance\recursecounter by #3\relax
+ \repeat}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse{1}{#1}{1}}
+
+\def\doloop
+ {\dostepwiserecurse{1}{\maxdimen}{1}}
+
+\def\exitloop
+ {\recursecounter=\maxdimen}
+
+%D \macros
+%D {ifundefined,doifdefined,doifundefined,
+%D doifdefinedelse,doifundefinedelse}
+%D
+%D These alteratives are not robust but suitable for simple
+%D usage. The official ones are a bit faster.
+
+\ifnocontextobject \doifdefined \do
+
+ \def\ifundefined#1%
+ {\expandafter\ifx\csname#1\endcsname\relax}
+
+ \def\doifdefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#3\else#2\fi}
+
+ \def\doifundefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\else#3\fi}
+
+ \def\doifdefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax\else#2\fi}
+
+ \def\doifundefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\fi}
+
+\fi
+
+%D \macros
+%D {doifinstringelse}
+%D
+%D It seems like we end up with more and more macros here.
+%D Sigh.
+
+\ifnocontextobject \doifinstringelse \do
+
+ \def\p!doifinstringelse#1#2%
+ {\def\pp!doifinstringelse##1#1##2##3\war%
+ {\csname if\if##2@fals\else tru\fi e\endcsname}%
+ \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}}
+
+ \long\def\doifinstringelse#1#2#3#4%
+ {\edef\@@@instring{#1}%
+ \@EA\p!doifinstringelse\@EA{\@@@instring}{#2}#3\else#4\fi}
+
+\fi
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D We don't support rounding outside \CONTEXT. Sorry.
+
+\def\twodigitrounding#1{#1}
+
+%D \macros
+%D {lineheight}
+%D
+%D In \CONTEXT\ we have \type{\lineheight}, which in many
+%D cases matches \type {\baselineskip}.
+
+\ifnocontextobject \lineheight \do
+
+ \def\lineheight{\baselineskip}
+
+\fi
+
+%D \macros
+%D {dohandletokens}
+%D
+%D The following macro is the simplified version, but good
+%D enough for day to day hacks.
+%D
+%D \starttyping
+%D \dohandletokens some text\with\somemacro
+%D \stoptyping
+
+\ifnocontextobject \dohandletokens \do
+
+\def\dodohandletokens
+ {\ifx\next\end \else
+ \docommand{\next}%
+ \expandafter\dohandletokens
+ \fi}
+
+\def\dohandletokens
+ {\afterassignment\dodohandletokens\let\next= }
+
+\long\def\handletokens#1\with#2%
+ {\let\docommand=#2%
+ \dohandletokens#1\end}
+
+\fi
+
+%D Very reduced:
+
+\long\def\appendtoks#1\to#2%
+ {\scratchtoks{#1}\expanded{#2{\the#2\the\scratchtoks}}}
+
+%D Well, also handy.
+
+\def\doiffileelse#1#2#3%
+ {\immediate\openin\scratchread=#1\relax
+ \ifeof\scratchread
+ \def\next{#3}%
+ \else
+ \def\next{#2}%
+ \fi
+ \immediate\closein\scratchread
+ \next}
+
+%D New.
+
+\let\donothing\empty
+
+%D Also new:
+
+\def\letempty #1{\let#1\empty}
+\def\globalletempty#1{\global\let#1\empty}
+
+\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
+\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+
+%D Sigh
+
+\def\settrue #1{\chardef#1\zerocount}
+\def\setfalse#1{\chardef#1\plusone}
+
+\let\newconditional = \setfalse
+\let\ifconditional = \ifcase
+
+%D We could load \type {norm-tex} but this takes less hash space:
+
+\let \normalif = \if
+\let \normalifcase = \ifcase
+\let \normalifcat = \ifcat
+\let \normalifdim = \ifdim
+\let \normalifeof = \ifeof
+\let \normaliffalse = \iffalse
+\let \normalifhbox = \ifhbox
+\let \normalifhmode = \ifhmode
+\let \normalifinner = \ifinner
+\let \normalifmmode = \ifmmode
+\let \normalifnum = \ifnum
+\let \normalifodd = \ifodd
+\let \normaliftrue = \iftrue
+\let \normalifvbox = \ifvbox
+\let \normalifvmode = \ifvmode
+\let \normalifvoid = \ifvoid
+\let \normalifx = \ifx
+\let \normalfi = \fi
+\let \normalelse = \else
+
+\let \normalunexpanded = \unexpanded % beware the primitive, not the context one
+
+%D That's it. Please forget this junk and take a look at how
+%D it should be done.
+
+\StopLatexHack \protect \endinput
diff --git a/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mpe.mkii b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mpe.mkii
new file mode 100644
index 0000000000..67b27919c0
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-mpe.mkii
@@ -0,0 +1,1370 @@
+%D \module
+%D [ file=supp-mpe,
+%D version=1999.07.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=METAPOST Special Extensions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% fuzzy and complicating is the fact that we need to support
+% context as well as mptopdf, so we cannot fall back on the
+% special drivers and color module (although there may be
+% good reasons to use a smaller context instead); also,
+% shading is handled here while it should move to the special
+% driver - to do!
+
+%D This module is still experimental and deals with some
+%D extensions to \METAPOST. When using \POSTSCRIPT\ output,
+%D these extensions can be supplied by means of proper
+%D preamble definitions, but when producing \PDF\ we have to
+%D set up the appropriate datastructures ourselves. It acts as
+%D a plug in into \type {supp-pdf}. As soon as we need more
+%D extensions, we will generalize these macro. Some
+%D definitions will move to the special drivers.
+
+%D For usage in plain \TEX, say something:
+%D
+%D \starttyping
+%D \input supp-pdf
+%D \input supp-mpe
+%D
+%D \MPcmykcolorstrue
+%D \MPspotcolorstrue
+%D \chardef\makeMPintoPDFobject\plusone
+%D \stoptyping
+
+\ifx\writestatus\undefined
+ \immediate\write16{[Loading MPS to PDF extensions.]}
+\else
+ \writestatus{loading}{ConTeXt Support Macros / MPS extensions}
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial <size> <data> <number> <identifier>
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline : <data> <number> <identifier> <size> special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+%D
+%D The implementation below saves the data on the stack in
+%D a way similar to the macros in \type {supp-pdf.tex}, and
+%D just overload a few already defined handlers. That way,
+%D the existing macros are still generic. \footnote {Actually,
+%D the macros here are just as generic.}
+%D
+%D Currently the only extension concerns shading, which is
+%D accomplished by handling yet another value of \type
+%D {\finiMPpath}. The recource disctionary is stored and
+%D later picked up by the general \CONTEXT\ figure inclusion
+%D macros.
+
+\unprotect
+
+%D The \type {%%MetaPostSpecials: version.revision signal} line
+%D triggers this module into handling color specifications kind
+%D of special. We need this safeguard for non||special
+%D usage.
+
+\chardef\MPspecialversion = 0 % specials when >1
+\chardef\MPspecialrevision = 0 % specials when >1
+\chardef\MPspecialsignal = 0 % passed on by graphic
+
+\chardef\inlineMPspecials = 1 % only needed for stack resetting
+
+%D This macro handles the special definitions that are
+%D passed as comment.
+
+\def\dohandleMPspecialcomment#1
+ {\setMPargument{#1}%
+ \advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \handleMPspecialcommand
+ \donetrue
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+\def\handleMPspecialcomment #1 % number of arguments
+ {\doresetMPstack
+ \scratchcounter#1\relax
+ \ifcase\scratchcounter % when zero, inline shading is used
+ \chardef\inlineMPspecials\plusone
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \chardef\inlineMPspecials\zerocount
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+%D When defined inline, we use another macro to handle the
+%D definitions. Actually, this macro is called by the
+%D previous ones.
+
+\def\handleMPspecialcommand
+ {\ifcase\inlineMPspecials\or
+ \advance\nofMParguments \minusone % pop the size
+ \fi
+ \ifundefined\MPspecial
+ \message{[unknown \MPspecial]}%
+ \else
+ \csname\MPspecial\endcsname
+ \fi
+ \ifcase\inlineMPspecials
+ \doresetMPstack % 0
+ \else
+ \resetMPstack % 1
+ \fi}
+
+%D This macro triggers special support. Currently, the
+%D version and revision number are not used. Any version number
+%D greater than zero will enable special support.
+
+\newconditional\manyMPspecials % \settrue\manyMPspecials
+
+\def\handleMPspecialscomment #1.#2 #3 % version.revision signal #4=div=1000|10000
+ {\doresetMPstack
+ \chardef\MPspecialversion #1%
+ \chardef\MPspecialrevision#2%
+ \chardef\MPspecialsignal #3%
+ \let\handleMPsequence\dohandleMPsequence
+ \ifnum#1=\plusone
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\handleMPspecialscommentx
+ \fi}
+
+\def\handleMPspecialscommentx #1 % version 2
+% {\doifelsedoifelse{#1}{10000}{\settrue\manyMPspecials}{\setfalse\manyMPspecials}% local
+ {\ifnum10000=0#1\relax
+ \settrue \manyMPspecials
+ \else
+ \setfalse\manyMPspecials
+ \fi
+ \setMPextensions
+ \handleMPsequence}
+
+% one can say (in meta-ini):
+%
+% \prependtoks
+% _special_div_ := 1000\ifconditional\manyMPspecials0\fi ;
+% \to \MPextensions
+
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
+
+\def\startMPresources
+ {\the\MPstartresources
+ \ifx\currentPDFresources\empty\else
+ \message{[unused resources]}%
+ \fi
+ \global\let\currentPDFresources\empty}
+
+\def\stopMPresources
+ {\let\currentPDFresources\empty
+ \the\MPstopresources}
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+\ifx\normalhandleMPrgbcolor\undefined % in case we reload this module
+
+ \let\normalhandleMPrgbcolor \handleMPrgbcolor
+ \let\normalhandleMPcmykcolor\handleMPcmykcolor
+ \let\normalhandleMPgraycolor\handleMPgraycolor
+ \let\normalhandleMPspotcolor\handleMPspotcolor
+
+\fi
+
+%D When we are using \CONTEXT, we will fall back to the
+%D better color conversion routines. This also has the advantage
+%D that we don't have to parse and convert the file. In this
+%D alternative, \type {\!MP} is not (yet) supported. Because
+%D we can (for efficiency reasons) turn off strokecolor,
+%D something we cannot do in \METAPOST\ converted code.
+
+\newif\ifPDFMPstrokecolor \PDFMPstrokecolortrue
+
+%D [This code should move to meta-ini.]
+
+\ifCONTEXT % we can use this for a better xgstate handling
+
+ \def\checkPDFMPstrokecolor
+ {\ifPDFMPstrokecolor \PDFstrokecolortrue \fi}
+
+ \def\normalhandleMPrgbcolor
+ {{\checkPDFMPstrokecolor\execcolorR\gMPa1:\gMPa2:\gMPa3:0:0\od}}
+
+ \def\normalhandleMPcmykcolor
+ {{\checkPDFMPstrokecolor\execcolorC\gMPa1:\gMPa2:\gMPa3:\gMPa4:0:0\od}}
+
+ \def\normalhandleMPgraycolor
+ {{\checkPDFMPstrokecolor\execcolorS\gMPa1:0:0\od}}
+
+% \def\normalhandleMPspotcolor
+% {{\checkPDFMPstrokecolor\execcolorP\gMPa1:\gMPa2:0:0\od}}
+
+ \def\normalhandleMPspotcolor % ???
+ {{\checkPDFMPstrokecolor\execcolorP\gMPa1:\gMPa2:\gMPa3:\gMPa4:0:0\od}}
+
+\fi
+
+% In the previous macros we use the special drivers. A more
+% direct approach would have been:
+%
+% \def\doPDFstartrgbcolormode#1#2#3%
+% {\PDFcode{#1 #2 #3 rg #1 #2 #3 RG}}
+%
+% \def\doPDFstartcmykcolormode#1#2#3#4%
+% {\PDFcode{#1 #2 #3 #4 k #1 #2 #3 #4 K}}
+%
+% \def\doPDFstartgraycolormode#1%
+% {\PDFcode{#1 g #1 G}}
+%
+% \appendtoks
+% \let\dostartrgbcolormode \doPDFstartrgbcolormode
+% \let\dostartcmykcolormode\doPDFstartcmykcolormode
+% \let\dostartgraycolormode\doPDFstartgraycolormode
+% \to \everyMPtoPDFconversion
+
+%D Now we can handle special color signals. We only do this
+%D when special are detected.
+
+% \def\MPrgbnumber#1{\expandafter\doMPrgbnumber#1000.0000\relax}
+% \def\doMPrgbnumber#1.#2#3#4#5\relax{#2#3#4}
+
+%D We cannot use \type {\everyMPtoPDFconversion} because in \MPTOPDF\
+%D we don't have the \type {\appendtoks} macro available.
+
+\def\setMPextensions
+ {\ifconditional\manyMPspecials
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##10000.00000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5##6\relax{##2##3##4##5}%
+ \else
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##1000.0000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5\relax{##2##3##4}%
+ \fi}
+
+%D The naive case looks like:
+%D
+%D \starttyping
+%D \def\handleMPrgbcolor%
+%D {\setMPcolor
+%D \ifcase\MPspecialversion
+%D \resetMPcolor\normalhandleMPrgbcolor
+%D \else\ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
+%D % consider it to be a signal
+%D \else
+%D \resetMPcolor\normalhandleMPrgbcolor
+%D \fi\fi}
+%D \stoptyping
+%D
+%D However, since we want \CMYK\ support, we will use the
+%D following implementation:
+
+% \def\setMPcolor
+% {\edef\lastMPrvalue{\gMPa1}%
+% \edef\lastMPgvalue{\gMPa2}%
+% \edef\lastMPbvalue{\gMPa3}}
+%
+% speed up (hardly called, so no let is needed)
+
+\def\setMPcolor
+ {\edef\lastMPrvalue{\csname\@@MP01\endcsname}%
+ \edef\lastMPgvalue{\csname\@@MP02\endcsname}%
+ \edef\lastMPbvalue{\csname\@@MP03\endcsname}}
+
+\def\zeroMPrgbvalue{0.0}
+
+\def\resetMPcolor
+ {\let\lastMPrvalue\zeroMPrgbvalue
+ \let\lastMPgvalue\zeroMPrgbvalue
+ \let\lastMPbvalue\zeroMPrgbvalue}
+
+\resetMPcolor
+
+\def\@@MPSK{@MPSK@}
+\def\@@MPSP{@MPSP@}
+
+\def\interceptMPcmykcolor % todo : \ifMPcmykcolors
+ {\ifcase\MPrgbnumber\lastMPgvalue
+ % cannot happen
+ \or
+ % 1 == cmyk color spec
+ \ifMPcmykcolors \dointerceptMPcmykcolor \fi
+ \or
+ % 2 == spot color
+ \ifMPspotcolors \dointerceptMPspotcolor \fi
+ \or
+ % 3 == rgb transparency
+ \invokeMPtransparencyspecial
+ \or
+ % 4 == cmyk transparency
+ \ifMPcmykcolors \invokeMPtransparencyspecial \fi
+ \or
+ % 5 == spot transparency
+ \ifMPspotcolors \invokeMPtransparencyspecial \fi
+ \else
+ % \writestatus{MPtoPDF}{unknown direct special}%
+ \fi}
+
+% ifcsname
+
+\def\dointerceptMPcmykcolor
+ {\revokeMPtransparencyspecial
+ \@EA\ifx\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+ \@EA\@EA\@EA\setMPcmyk\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname
+ \normalhandleMPcmykcolor
+ \fi}
+
+\def\dointerceptMPspotcolor
+ {\revokeMPtransparencyspecial
+ \@EA\ifx\csname\@@MPSP\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+ \@EA\@EA\@EA\setMPspot\csname\@@MPSP\number\MPrgbnumber\lastMPbvalue\endcsname
+ \normalhandleMPspotcolor
+ \fi}
+
+\def\handleMPrgbcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion
+ \normalhandleMPrgbcolor
+ \else
+ \setMPcolor
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal\relax
+ \interceptMPcmykcolor
+ \else
+ \revokeMPtransparencyspecial
+ \normalhandleMPrgbcolor
+ \fi
+ \fi}
+
+\def\handleMPgraycolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPgraycolor}
+
+\def\handleMPcmykcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPcmykcolor}
+
+%D Specials are define and recalled using:
+
+\def\MPspecial
+ {MP special \gMPs\nofMParguments}
+
+\def\defineMPspecial#1#2%
+ {\setvalue{MP special #1}{#2}}
+
+%D The path processing macro is slightly extended.
+
+\newtoks \invokeMPspecials
+
+\def\finishMPpath
+ {\PDFcode
+ {\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi
+ \extraMPpathcode}}
+
+\def\processMPpath
+ {\checkMPpath % !
+ \ifcase\nofMPsegments\else
+ \let\extraMPpathcode\empty
+ \ifcase\MPspecialversion\else
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
+ \ifnum\MPrgbnumber\lastMPgvalue>10 % really needed
+ \scratchcounter\MPrgbnumber\lastMPbvalue
+ \edef\currentMPspecial{\the\scratchcounter}%
+\let\previousMPcolorspec\currentMPcolorspec
+\edef\currentMPcolorspec{\lastMPrvalue\lastMPgvalue\lastMPbvalue}%
+\ifx\previousMPcolorspec\currentMPcolorspec \else
+ \revokeMPtransparencyspecial
+\fi
+ \ifnum\finiMPpath=2 % to outer level
+ \the\invokeMPspecials
+ \fi
+ \fi
+ \fi
+ \fi
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments0
+ \handleMPsequence}
+
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D {\framed[background=demo 1]{\bfd \white Demo 1}} {}
+%D {\framed[background=demo 2]{\bfd \white Demo 2}} {}
+%D {\framed[background=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D {\startuniqueMPgraphic{Shade-#1}
+%D width := \overlaywidth ;
+%D height := \overlayheight ;
+%D path p ; p := unitsquare xscaled width yscaled height ;
+%D #2_shade(p,#3,#4,#5) ;
+%D \stopuniqueMPgraphic
+%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0 \NC inner shade \NC \NR
+%D \NC /C1 \NC outer shade \NC \NR
+%D \NC /N \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+
+\newcount\currentPDFshade % 0 % global (document wide) counter
+\let\currentMPshades\empty
+
+\def\startMPshading#1%
+ {\edef\currentMPspecial{\gMPs{#1}}}
+
+\def\stopMPshading
+ {\global\advance\currentPDFshade \plusone
+ \setxvalue{obj:Sh:\currentMPspecial}%
+ {/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
+ \setxvalue{mps:Sh:\currentMPspecial}%
+ {\the\currentPDFshade}}
+
+\appendtoks
+ \global\let\currentMPshades\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPshades\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /Shading <<\currentMPshades>>}%
+ \fi
+\to \MPstopresources
+
+\def\invokeMPshadespecial
+ {\ifundefined{mps:Sh:\currentMPspecial}\else
+ \edef\currentMPshade{\getvalue{obj:Sh:\currentMPspecial}}%
+ \doifinstringelse\currentMPshade\currentMPshades \donothing
+ {\xdef\currentMPshades{\currentMPshades\currentMPshade}}%
+ \def\extraMPpathcode{/Sh\getvalue{mps:Sh:\currentMPspecial} sh Q}%
+ \chardef\finiMPpath\zerocount
+ \PDFcode{q /Pattern cs}%
+ \fi}
+
+\appendtoks \invokeMPshadespecial \to \invokeMPspecials
+
+%D We need to convert the \CMYK\ specials into colors, because
+%D we have to do it twice, we define a macro.
+
+% \def\checkMPshadingcolor#1#2#3#4#5%
+% {\edef\tempMPrvalue{\csname\@@MP0#1\endcsname}%
+% \edef\tempMPgvalue{\csname\@@MP0#2\endcsname}%
+% \edef\tempMPbvalue{\csname\@@MP0#3\endcsname}%
+% \edef#5%
+% {\ifx\tempMPrvalue\tempMPgvalue
+% \ifx\tempMPrvalue\tempMPbvalue
+% \ifx\tempMPgvalue\tempMPbvalue
+% \tempMPbvalue
+% \fi
+% \fi
+% \fi}%
+% \edef#4% todo : spotcolors
+% {\ifnum\MPrgbnumber\tempMPrvalue=\MPspecialsignal\space
+% \ifMPcmykcolors\getvalue{\@@MPSK\number\MPrgbnumber\tempMPbvalue}\fi
+% \fi}}
+
+\def\checkMPshadingcolor#1#2#3#4#5%
+ {\edef\tempMPrvalue{\csname\@@MP0#1\endcsname}%
+ \edef\tempMPgvalue{\csname\@@MP0#2\endcsname}%
+ \edef\tempMPbvalue{\csname\@@MP0#3\endcsname}%
+ \global\let\MPresolvedspace\MPgrayspace
+ \global\let\MPresolvedcolor\!!zerocount
+ \ifnum\MPrgbnumber\tempMPrvalue=\MPspecialsignal\relax
+ \ifcase\MPrgbnumber\tempMPgvalue
+ \or % 1 = cmyk
+ \ifMPcmykcolors
+ \expanded{\resolveMPcmykcolor\getvalue{\@@MPSK\number\MPrgbnumber\tempMPbvalue}}\end
+ \fi
+ \or % 2 = spot
+ \ifMPspotcolors
+ \expanded{\resolveMPspotcolor\getvalue{\@@MPSP\number\MPrgbnumber\tempMPbvalue}}\end
+ \fi
+ \or
+ % 3 = rgb transparency
+ % to do
+ \or
+ % 4 == cmyk transparency
+ % \ifMPcmykcolors
+ % to do
+ % \fi
+ \or
+ % 5 == spot transparency
+ % \ifMPspotcolors
+ % to do
+ % \fi
+ \fi
+ \else
+ \ifx\tempMPrvalue\tempMPgvalue
+ \ifx\tempMPrvalue\tempMPbvalue
+ \expanded{\resolveMPgraycolor\tempMPbvalue}\end
+ \else
+ \expanded{\resolveMPrgbcolor\tempMPrvalue\space\tempMPgvalue\space\tempMPbvalue}\end
+ \fi
+ \else
+ \expanded{\resolveMPrgbcolor\tempMPrvalue\space\tempMPgvalue\space\tempMPbvalue}\end
+ \fi
+ \fi
+ \let#4\MPresolvedcolor
+ \let#5\MPresolvedspace}
+
+%D We also need to make sure that we have two \RGB\ or
+%D \CMYK colors, since we have to set the colorspace.
+
+\def\setMPshadingcolors#1#2#3#4#5#6% color space
+ {\checkMPshadingcolor{#1}{#2}{#3}\MPshadeAc\MPshadeAs
+ \checkMPshadingcolor{#4}{#5}{#6}\MPshadeBc\MPshadeBs
+ \ifx\MPshadeAs\MPshadeBs
+ \let\MPshadeA\MPshadeAc
+ \let\MPshadeB\MPshadeBc
+ \let\MPshadeC\MPshadeAs
+ \else\ifx\MPshadeAs\MPgrayspace
+ \ifx\MPshadeBs\MPrgbspace
+ \edef\MPshadeA{\MPshadeAc\space\MPshadeAc\space\MPshadeAc}%
+ \else
+ \negatecolorcomponent\MPshadeAc
+ \edef\MPshadeA{0 0 0 \MPshadeAc}%
+ \fi
+ \let\MPshadeB\MPshadeBc
+ \let\MPshadeC\MPshadeBs
+ \else\ifx\MPshadeBs\MPgrayspace
+ \let\MPshadeA\MPshadeAc
+ \ifx\MPshadeAs\MPrgbspace
+ \edef\MPshadeB{\MPshadeBc\space\MPshadeBc\space\MPshadeBc}%
+ \else
+ \negatecolorcomponent\MPshadeBc
+ \edef\MPshadeB{0 0 0 \MPshadeBc}%
+ \fi
+ \let\MPshadeC\MPshadeAs
+ \else
+ % different color spaces
+ \def\MPshadeA{1}%
+ \def\MPshadeB{1}%
+ \let\MPshadeC\MPgrayspace
+ \fi\fi\fi}
+
+\let\MPshadeA\MPcmykWhite
+\let\MPshadeB\MPcmykBlack
+\let\MPshadeC\MPgrayspace
+
+%D The reason why this macro is a bit complicates is that we
+%D handle black and white situations (otherwise we would have
+%D to use \CMYK\ b/w in case of a \CMYK\ shade).
+
+%D Here are the special handlers:
+
+\defineMPspecial{30}
+ {\startMPshading{14}% type 2
+ \setMPshadingcolors{4}{5}{6}{9}{10}{11}%
+ \immediate\pdfobj
+ {<</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \immediate\pdfobj
+ {<</ShadingType 2
+ /ColorSpace /\MPshadeC\space
+ /Function \the\pdflastobj\space 0 R
+ /Coords [\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+\defineMPspecial{31}
+ {\startMPshading{16}% type 3
+ \setMPshadingcolors{4}{5}{6}{10}{11}{12}%
+ \immediate\pdfobj
+ {<</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \immediate\pdfobj
+ {<</ShadingType 3
+ /ColorSpace /\MPshadeC\space
+ /Function \the\pdflastobj\space 0 R
+ /Coords [\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+%D Figure inclusion is kind of strange to \METAPOST, but when
+%D Santiago Muelas started discussing this with me, I was able
+%D to cook up a solution using specials.
+
+\def\invokeMPfigurespecial%
+ {\getvalue{mps:gr:\currentMPspecial}} % or \relax
+
+\appendtoks \invokeMPfigurespecial \to \invokeMPspecials
+
+\defineMPspecial{10}
+ {\setxvalue{mps:gr:\gMPs8}%
+ {\noexpand\handleMPfigurespecial
+ {\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}%
+ \noexpand\setxvalue{mps:gr:\gMPs8}{}}}
+
+% \def\handleMPfigurespecial#1#2#3#4#5#6#7%
+% {\vbox to 0pt
+% {\vss
+% \hbox to 0pt
+% {\pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
+% \pdfimage width 1bp height 1bp {#7}% maybe 10 is better
+% \pdfliteral{Q}%
+% \hss}}}
+%
+% better, since xform reuse
+
+\def\handleMPfigurespecial#1#2#3#4#5#6#7% todo : combine with ext fig
+ {\vbox to \zeropoint
+ {\vss
+ \hbox to \zeropoint
+ {\ifcase\pdfoutput\or % will be hooked into the special driver
+ \doiffileelse{#7}
+ {\doifundefinedelse{mps:x:#7}
+ {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
+ \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
+ {\message{[reusing figure #7]}}%
+ \PDFcode{q #1 #2 #3 #4 #5 #6 cm}%
+ \rlap{\getvalue{mps:x:#7}}%
+ \PDFcode{Q}}
+ {\message{[unknown figure #7]}}%
+ \fi
+ \hss}}}
+
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm);
+%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ;
+%D path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D path q ; q := p rotatedaround(center p,90) ;
+%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D circular_shade(s,0,.2red,.9red) ;
+%D addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+%D This is some experimental hyperlink driver that I wrote
+%D for Mark Wicks.
+
+\defineMPspecial{20}
+ {\setxvalue{mps:hl:\gMPs6}%
+ {\noexpand\handleMPhyperlink
+ {\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
+ \noexpand\setxvalue{mps:hl:\gMPs6}{}}}
+
+\def\handleMPhyperlink#1#2#3#4#5%
+ {%\ifcase\pdfoutput\or
+ \setbox\scratchbox\hbox
+ {\setbox\scratchbox\null
+ \scratchdimen#1\onebasepoint\scratchdimen-\scratchdimen
+ \advance\scratchdimen#3\onebasepoint
+ \wd\scratchbox\scratchdimen
+ \scratchdimen#2\onebasepoint\scratchdimen-\scratchdimen
+ \advance\scratchdimen#4\onebasepoint
+ \ht\scratchbox\scratchdimen
+ \incolorfalse
+ \gotobox{\box\scratchbox}[#5]}%
+ \setbox\scratchbox\hbox
+ {\scratchdimen\MPxoffset\onebasepoint\advance\scratchdimen#1\onebasepoint
+ \hskip\scratchdimen
+ \scratchdimen\MPyoffset\onebasepoint\advance\scratchdimen#2\onebasepoint
+ \raise\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ }%\fi}
+
+\def\invokeMPhyperlinkspecial%
+ {\getvalue{mps:hl:\currentMPspecial}} % or \relax
+
+\appendtoks \invokeMPhyperlinkspecial \to \invokeMPspecials
+
+%D Special number~1 is dedicated to \CMYK\ support. If you
+%D want to know why: look at this:
+%D
+%D \startbuffer[mp]
+%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15}
+%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8}
+%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D {\CMYK\ support disabled,
+%D conversion to \RGB.}
+%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no support in \METAPOST.}
+%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
+%D support in \METAPOST}
+%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+
+\defineMPspecial{1}
+ {\ifMPcmykcolors
+ \setxvalue{\@@MPSK\gMPs1}{\gMPs2 \gMPs3 \gMPs4 \gMPs5 }%
+ \fi}
+
+\def\setMPcmyk#1 #2 #3 #4 %
+ {\setvalue{\@@MP01}{#1}%
+ \setvalue{\@@MP02}{#2}%
+ \setvalue{\@@MP03}{#3}%
+ \setvalue{\@@MP04}{#4}}
+
+%\defineMPspecial{2}
+% {\ifMPspotcolors
+% \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 }%
+% \fi}
+
+% \defineMPspecial{2}
+% {\ifMPspotcolors
+% \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 }%
+% \checkMPspot{\gMPs2}{\gMPs3}%
+% \fi}
+%
+% \def\setMPspot#1 #2 %
+% {\setvalue{\@@MP01}{#1}%
+% \setvalue{\@@MP02}{#2}}
+%
+% \def\checkMPspot#1#2%
+% {\expanded{\resolveMPspotcolor#1 #2}\end
+% \ifx\MPspotspace\MPresolvedspace
+% \edef\MPspotspacespec{/\MPspotspace\space}%
+% \doifinstringelse\MPspotspacespec\currentMPcolorspaces
+% \donothing\registerMPcolorspace
+% \fi}
+
+\defineMPspecial{2}
+ {\ifMPspotcolors
+ \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 \gMPs4 \gMPs5 }% space is essential
+ \checkMPspot{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
+ \fi}
+
+\def\setMPspot#1 #2 #3 #4 %
+ {\setvalue{\@@MP01}{#1}%
+ \setvalue{\@@MP02}{#2}%
+ \setvalue{\@@MP03}{#3}%
+ \setvalue{\@@MP04}{#4}}
+
+\def\checkMPspot#1#2#3#4%
+ {\expanded{\resolveMPspotcolor#1 #2 #3 #4}\end
+ \ifx\MPspotspace\MPresolvedspace
+ \edef\MPspotspacespec{/\MPspotspace\space}%
+ \doifinstringelse\MPspotspacespec\currentMPcolorspaces
+ \donothing\registerMPcolorspace
+ \fi}
+
+%D This special (number 50) passes positions to a tex file.
+%D This method uses a two||pass approach an (mis|)|used the
+%D context positioning macros. In \type {core-pos} we will
+%D implement the low level submacro needed.
+%D
+%D \startbuffer
+%D \definelayer[test]
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-1},y=\MPy{somepos-1}]
+%D {Whatever we want here!}
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-2},y=\MPy{somepos-2}]
+%D {Whatever we need there!}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 6cm withcolor red ;
+%D register ("somepos-1",1cm,2cm,center currentpicture) ;
+%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here the width and height are not realy used, but one can
+%D imagine situations where tex has to work with values
+%D calculated by \METAPOST.
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D Later we will implement a more convenient macro:
+%D
+%D \starttyping
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \stoptyping
+
+\ifx\dosavepositionwhd\undefined
+ \let\dosavepositionwhd\gobblesevenarguments
+\fi
+
+\defineMPspecial{50} % x y width height label
+ {\bgroup
+ \scratchdimen\MPllx\onebasepoint\scratchdimen-\scratchdimen
+ % \scratchdimen-\MPllx\onebasepoint % moet ook werken
+ \advance\scratchdimen\gMPs1\onebasepoint
+ \edef\x{\number\scratchdimen}%
+ \scratchdimen\gMPs2\onebasepoint
+ \scratchdimen-\scratchdimen
+ \advance\scratchdimen\MPury\onebasepoint
+ \edef\y{\number\scratchdimen}%
+ \scratchdimen\gMPs3\onebasepoint
+ \edef\w{\number\scratchdimen}%
+ \scratchdimen\gMPs4\onebasepoint
+ \edef\h{\number\scratchdimen}%
+ \dosavepositionwhd{\gMPs5}0\x\y\w\h0%
+ \egroup}
+
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan] [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D We save all the three components needed in one macro,
+%D just to save hash space.
+
+\def\@@MPST{@MPST@}
+
+\def\assignMPStransparency#1#2#3%
+ {\edef\PDFtransparencyidentifier{#1}%
+ \edef\PDFtransparencyreference {#2}%
+ \edef\PDFtransparencycolorspecs{#3}}
+
+% \def\PDFtransparencyspec
+% {\ifx\MPresolvedspace\MPgrayspace
+% \MPresolvedcolor\space g \MPresolvedcolor\space G%
+% \else\ifx\MPresolvedspace\MPrgbspace
+% \MPresolvedcolor\space rg \MPresolvedcolor\space RG%
+% \else\ifx\MPresolvedspace\MPcmykspace
+% \MPresolvedcolor\space k \MPresolvedcolor\space K%
+% \else\ifx\MPresolvedspace\empty\else
+% /\MPresolvedspace\space cs \MPresolvedcolor\space sc
+% /\MPresolvedspace\space CS \MPresolvedcolor\space SC%
+% \fi\fi\fi\fi}
+
+\def\PDFtransparencyspec % todo
+ {\ifx\MPresolvedspace\MPgrayspace
+ \MPresolvedcolor\space g
+ \MPresolvedcolor\space G%
+ \else\ifx\MPresolvedspace\MPrgbspace
+ \MPresolvedcolor\space rg
+ \MPresolvedcolor\space RG%
+ \else\ifx\MPresolvedspace\MPcmykspace
+ \MPresolvedcolor\space k
+ \MPresolvedcolor\space K%
+ \else\ifx\MPresolvedspace\empty\else
+ /\MPresolvedspace\space cs
+ /\MPresolvedspace\space CS
+ \PDFgetspotcolorspec\MPresolvedcolor
+ \fi\fi\fi\fi}
+
+\defineMPspecial{3} % rgb
+ {\edef\currentMPspecial{\gMPs6}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \expanded{\resolveMPrgbcolor\gMPs3 \gMPs4 \gMPs5}\end
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+\defineMPspecial{4} % cmyk
+ {\edef\currentMPspecial{\gMPs7}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \expanded{\resolveMPcmykcolor\gMPs3 \gMPs4 \gMPs5 \gMPs6}\end
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+% \defineMPspecial{5} % spot
+% {\edef\currentMPspecial{\gMPs5}%
+% \presetPDFtransparency{\gMPs1}{\gMPs2}%
+% \checkMPspot{\gMPs3}{\gMPs4}%
+% \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+% {\noexpand\assignMPStransparency
+% {\PDFtransparencyidentifier}%
+% {\PDFtransparencyreference}%
+% {\PDFtransparencyspec}}}
+
+\defineMPspecial{5} % spot
+ {\edef\currentMPspecial{\gMPs7}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \checkMPspot{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}%
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+% beware: for the moment only supported in pdftex; needs a cleanup!
+
+\def\registerMPcolorspace
+ {\doifobjectreferencefoundelse{PDFCS}\MPspotspace
+ {\doPDFgetobjectreference{PDFCS}\MPspotspace\PDFobjectreference
+ \xdef\currentMPcolorspaces
+ {\currentMPcolorspaces\MPspotspacespec\PDFobjectreference\space}}
+ \donothing}
+
+%D We need to add resource specifications!
+
+\appendtoks
+ \global\let\currentMPcolorspaces\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPcolorspaces\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /ColorSpace <<\currentMPcolorspaces>>}%
+ \fi
+\to \MPstopresources
+
+%D For efficiency reasons, we fall back on the allocation
+%D mechanisms already present. For use within \MPTOPDF, we
+%D provide a fall back routine.
+
+\let\currentMPtransparencies\empty
+
+% \def\invokeMPtransparencyspecial
+% {\doifdefined{\@@MPST\currentMPspecial}
+% {\getvalue{\@@MPST\currentMPspecial}%
+% \doifinstringelse
+% {\PDFtransparencyidentifier}{\currentMPtransparencies}
+% {}
+% {\xdef\currentMPtransparencies
+% {\currentMPtransparencies
+% \PDFtransparencyidentifier\space
+% \PDFtransparencyreference\space}}%
+% \def\extraMPpathcode{ Q}%
+% \PDFcode{q
+% \PDFtransparencycolorspecs\space
+% \PDFtransparencyidentifier\space gs}}}
+
+% this one triggers a new graphic state
+
+\def\invokeMPtransparencyspecial
+ {\scratchcounter\MPrgbnumber\lastMPbvalue
+ \edef\currentMPspecial{\the\scratchcounter}%
+ \ifundefined{\@@MPST\currentMPspecial}\else
+ \getvalue{\@@MPST\currentMPspecial}%
+ \doifinstringelse\PDFtransparencyidentifier\currentMPtransparencies
+ \donothing\registerMPtransparencyresource % slow
+ \PDFcode
+ {\PDFtransparencycolorspecs\space
+ \PDFtransparencyidentifier\space gs}%
+ % potential optimization
+ % \setevalue{\@@MPST\currentMPspecial}%
+ % {\PDFcode
+ % {\PDFtransparencycolorspecs\space
+ % \PDFtransparencyidentifier\space gs}}%
+ % \getvalue{\@@MPST\currentMPspecial}%
+ \let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial
+ \fi}
+
+% this one does a reset
+
+\let\revokeMPtransparencyspecial\relax
+
+\appendtoks
+ \revokeMPtransparencyspecial
+\to \MPstopresources
+
+\def\dorevokeMPtransparencyspecial % only called if state is set
+ {\ifx\PDFtransparencyresetidentifier\empty\else
+ \doifinstringelse\PDFtransparencyresetidentifier\currentMPtransparencies
+ \donothing\registerMPtransparencyresetresource
+ \PDFcode{\PDFtransparencyresetidentifier\space gs}%
+ % potential optimization
+ % \def\dorevokeMPtransparencyspecial
+ % {\PDFcode
+ % {\PDFtransparencycolorspecs\space
+ % \PDFtransparencyidentifier\space gs}}%
+ \let\dorevokeMPtransparencyspecial\dodorevokeMPtransparencyspecial
+ \let\revokeMPtransparencyspecial\relax % invoke sets it
+ \fi}
+
+% and this one a simplified reset
+
+% \def\dodorevokeMPtransparencyspecial % used after first invocation
+% {\getvalue{\@@MPST0}%
+% \PDFcode{\PDFtransparencyidentifier\space gs}}
+
+\def\dodorevokeMPtransparencyspecial % used after first invocation
+ {\PDFcode{\PDFtransparencyresetidentifier\space gs}%
+ \let\revokeMPtransparencyspecial\relax} % invoke sets it
+
+% add a resource entry
+
+\def\registerMPtransparencyresource
+ {\xdef\currentMPtransparencies
+ {\currentMPtransparencies
+ \PDFtransparencyidentifier\space
+ \PDFtransparencyreference\space}}
+
+\def\registerMPtransparencyresetresource
+ {\xdef\currentMPtransparencies
+ {\currentMPtransparencies
+ \PDFtransparencyresetidentifier\space
+ \PDFtransparencyresetreference\space}}
+
+\appendtoks \invokeMPtransparencyspecial \to \invokeMPspecials
+
+\ifCONTEXT \else
+
+ \def\@@MPSTN{@MPSTN@}
+ \def\@@MPSTO{@MPSTO@}
+
+ \newcount\PDFcurrenttransparency
+
+ \let\PDFtransparencyresetidentifier\empty
+ \let\PDFtransparencyresetreference \empty
+
+ \let\PDFtransparencyidentifier\empty
+ \let\PDFtransparencyreference \empty
+
+ \def\initializePDFtransparency
+ {\global\let\initializePDFtransparency\relax
+ \presetPDFtransparency{1}{1}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ \xdef\PDFtransparencyresetreference{\the\pdflastobj\space 0 R}}
+
+ \def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \@EA\ifx\csname\@@MPSTO#1:#2\endcsname\relax
+ \global\advance\PDFcurrenttransparency \plusone
+ \immediate\pdfobj{\PDFtransparencydictionary{#1}{#2}{}}%
+ \setxvalue{\@@MPSTN#1:#2}{\the\PDFcurrenttransparency}%
+ \setxvalue{\@@MPSTO#1:#2}{\the\pdflastobj}%
+ \fi
+ \edef\PDFtransparencyidentifier{/Tr\getvalue{\@@MPSTN#1:#2}}%
+ \edef\PDFtransparencyreference{\getvalue{\@@MPSTO#1:#2} 0 R}}
+
+ \def\PDFtransparencydictionary#1#2#3% type fraction extras
+ {<</Type /ExtGState
+ /ca #2 /CA #2
+ /BM /\ifcase#1 Normal\or Normal\or Multiply\or Screen\or
+ Overlay\or SoftLight\or HardLight\or ColorDodge\or
+ ColorBurn\or Darken\or Lighten\or Difference\or
+ Exclusion\else Compatible\fi
+ #3>>}
+
+\fi
+
+\appendtoks
+ \global\let\currentMPtransparencies\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPtransparencies\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /ExtGState <<\currentMPtransparencies>>}%
+ \fi
+\to \MPstopresources
+
+%D In all cases, we need to keep track of the resources
+%D used.
+
+%D A few auxiliary macros:
+
+\def\MPgrayspace{DeviceGray}
+\def\MPrgbspace {DeviceRGB}
+\def\MPcmykspace{DeviceCMYK}
+\let\MPspotspace\MPgrayspace
+
+\def\MPcmykBlack{0 0 0 0}
+\def\MPcmykWhite{0 0 0 1}
+
+\ifCONTEXT
+
+ \def\startMPcolorresolve
+ {\bgroup
+ \def\dostartgraycolormode##1%
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{##1}}%
+ \def\dostartrgbcolormode ##1##2##3%
+ {\global\let\MPresolvedspace\MPrgbspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3}}%
+ \def\dostartcmykcolormode##1##2##3##4%
+ {\global\let\MPresolvedspace\MPcmykspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3 ##4}}%
+ \def\dostartspotcolormode##1##2%
+ {\global\let\MPspotspace\empty
+ \xdef\MPresolvedspace{##1}%
+ \xdef\MPresolvedcolor{##2}%
+ \global\let\MPspotspace\MPresolvedspace}% signal
+ \dostartgraycolormode\!!zerocount} % kind of hackery initialization
+
+ \let\stopMPcolorresolve\egroup
+
+ \def\resolveMPrgbcolor#1 #2 #3\end
+ {\startMPcolorresolve
+ \execcolorR#1:#2:#3:0:0\od
+ \stopMPcolorresolve}
+
+ \def\resolveMPcmykcolor#1 #2 #3 #4\end
+ {\startMPcolorresolve
+ \execcolorC#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve}
+
+ \def\resolveMPgraycolor#1\end
+ {\startMPcolorresolve
+ \execcolorS#1:0:0\od
+ \stopMPcolorresolve}
+
+% \def\resolveMPspotcolor#1 #2\end
+% {\startMPcolorresolve
+% \execcolorP#1:#2:0:0\od
+% \stopMPcolorresolve}
+
+ \def\resolveMPspotcolor#1 #2 #3 #4\end
+ {\startMPcolorresolve
+ \ifnum#2>\plusone
+ \checkmultitonecolor{#1}%
+ \fi
+ \execcolorP#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve}
+
+\else
+
+ \def\resolveMPspotcolor#1 #2\end
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{0}}
+
+ \def\resolveMPrgbcolor#1 #2 #3\end
+ {\global\let\MPresolvedspace\MPrgbspace
+ \xdef\MPresolvedcolor{#1 #2 #3}}
+
+ \def\resolveMPcmykcolor#1 #2 #3 #4\end
+ {\global\let\MPresolvedspace\MPcmykspace
+ \xdef\MPresolvedcolor{#1 #2 #3 #4}}
+
+ \def\resolveMPgraycolor#1\end
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{#1}} % should be inverted
+
+\fi
+
+\protect \endinput
diff --git a/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-pdf.mkii b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-pdf.mkii
new file mode 100644
index 0000000000..c54b0c6bc2
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/supp-pdf.mkii
@@ -0,0 +1,2187 @@
+%D \module
+%D [ file=supp-pdf,
+%D version=2006.09.02, % 2004.12.16,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\writestatus\undefined
+ \immediate\write16{[Loading MPS to PDF converter (version 2006.09.02).]}
+\else
+ \writestatus{loading}{ConTeXt Support Macros / PDF}
+\fi
+
+%D This module is not optimized because it is used outside
+%D \CONTEXT\ and we cannot forsee what interference will take
+%D place. We no longer load supp-mis. I got too tired of
+%D keeping track of interferences with non \CONTEXT\ usage so
+%D I moved the necessary code in here and use a derived version
+%D in \CONTEXT. When I have the time I will clean up some of the
+%D code that is of no use for non||\CONTEXT\ users.
+
+\ifx\contextversion\undefined
+
+ \chardef\mptopdfstoredatcode\catcode`\@
+
+ \catcode\string`@=11
+
+ \def\unprotect
+ {\let\@@mpstopdf@@unprotect \unprotect
+ \let\@@mpstopdf@@protect \protect
+ \edef\protect
+ {\noexpand \let \noexpand \protect \noexpand \@@mpstopdf@@protect
+ \noexpand \let \noexpand \unprotect \noexpand \@@mpstopdf@@unprotect
+ % context specific
+ \catcode\string`\noexpand @=\the\catcode\string`@
+ \catcode\string`\noexpand !=\the\catcode\string`!
+ \catcode\string`\noexpand ?=\the\catcode\string`?
+ % latex specific
+ \catcode\string`\noexpand /=\the\catcode\string`/
+ \catcode\string`\noexpand -=\the\catcode\string`-
+ \catcode\string`\noexpand :=\the\catcode\string`:
+ \catcode\string`\noexpand ;=\the\catcode\string`;
+ \catcode\string`\noexpand "=\the\catcode\string`"
+ \catcode\string`\noexpand <=\the\catcode\string`<
+ \catcode\string`\noexpand >=\the\catcode\string`>
+ \catcode\string`\noexpand `=\the\catcode\string``}
+ \catcode\string`@=11 \catcode\string`!=11 \catcode\string`?=11
+ \catcode\string`/=12 \catcode\string`-=12
+ \catcode\string`:=12 \catcode\string`;=12
+ \catcode\string`>=12 \catcode\string`<=12
+ \catcode\string`"=12 \catcode\string``=12 }
+
+ \def\defineMPtoPDFfallbacks
+ {% shortcuts
+ \chardef\@@escape 0
+ \chardef\@@begingroup 1
+ \chardef\@@endgroup 2
+ \chardef\@@endofline 5
+ \chardef\@@ignore 9
+ \chardef\@@space 10
+ \chardef\@@letter 11
+ \chardef\@@other 12
+ \chardef\@@active 13
+ \chardef\@@comment 14
+ % placeholders
+ \ifx\withoutpt \undefined \let\withoutpt \@@mptopdf@@withoutpt \fi
+ \ifx\twodigitrounding \undefined \let\twodigitrounding \@@mptopdf@@twodigitrounding \fi
+ \ifx\forgetall \undefined \let\forgetall \@@mptopdf@@forgetall \fi
+ \ifx\uncatcodespecials \undefined \let\uncatcodespecials \@@mptopdf@@uncatcodespecials \fi
+ \ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\@@mptopdf@@setnaturalcatcodes \fi
+ \ifx\dospecials \undefined \let\dospecials \@@mptopdf@@dospecials \fi}
+
+ \def\@@mptopdf@@forgetall
+ {\parskip0pt\leftskip0pt\parindent0pt\everypar{}}
+
+ \def\@@mptopdf@@twodigitrounding#1%
+ {#1}%
+
+ \def\@@mptopdf@@uncatcodespecials
+ {\def\do##1{\catcode`##1=\@@other}\dospecials
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+ \def\@@mptopdf@@setnaturalcatcodes
+ {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other
+ \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other
+ \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other
+ \catcode`\*=\@@other \catcode`\/=\@@other
+ \catcode`\-=\@@other \catcode`+=\@@other
+ \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other
+ \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other
+ \catcode`\:=\@@other \catcode`\;=\@@other
+ \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other
+ \catcode`\(=\@@other \catcode`\)=\@@other
+ \catcode`\{=\@@other \catcode`\}=\@@other
+ \catcode`\\=\@@other \catcode`\%=\@@other}
+
+ \def\@@mptopdf@@dospecials
+ {\do\ \do\\\do\{\do\}\do\$%
+ \do\#\do\^\do\_\do\&\do\%%
+ \do\~\do\^^A\do\^^K}
+
+ {
+ \catcode`\.=12
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\@@MPTOPDF@@WITHOUTPT#1pt{#1}
+ }
+
+ \def\@@mptopdf@@withoutpt#1%
+ {\expandafter\@@MPTOPDF@@WITHOUTPT#1}
+
+% \def\@@mptopdf@@newabove#1#2% \dimen \name
+% {#1#2%
+% \ifnum\expandafter\gobblesixarguments\meaning#2>20\else
+% \expandafter\@@mptopdf@@newabove\expandafter#1\expandafter#2%
+% \fi}
+
+ \def\@@mptopdf@@stripnewabove#1%
+ {\ifnum10<9#1 #1\else\expandafter\@@mptopdf@@stripnewabove\fi}%
+
+ \def\@@mptopdf@@newabove\csname#1\endcsname#2% \dimen \name
+ {\csname#1\endcsname#2%
+ \ifnum\expandafter\@@mptopdf@@stripnewabove\meaning#2>20\else
+ \@@mptopdf@@newabove\csname#1\endcsname#2%
+ \fi}
+
+ \@@mptopdf@@newabove \csname newcount\endcsname \scratchcounter
+ \@@mptopdf@@newabove \csname newdimen\endcsname \scratchdimen
+ \csname newbox\endcsname \scratchbox
+
+ \expandafter \newif \csname ifdone\endcsname
+
+ \catcode`\@=\mptopdfstoredatcode
+
+\else
+
+ \let\defineMPtoPDFfallbacks\relax
+
+\fi
+
+%D These macros are written as generic as possible. Some
+%D general support macro's are loaded from a small module
+%D especially made for non \CONTEXT\ use. In this module I
+%D use a matrix transformation macro written by Tanmoy
+%D Bhattacharya. Thanks to extensive testing by Sebastian
+%D Ratz I was able to complete this module within reasonable
+%D time. This module has support for \METAPOST\ extensions
+%D built in.
+%D
+%D Daniel H. Luecking came up with a better (more precise)
+%D transformation method. You can recognize his comment by
+%D his initials. (We keep the old code around because it's a
+%D nice illustration on how a module like this evolves.)
+
+%D Beware, we cannot use \type{\zeropoint} here since it may be
+%D defined in the range \type{\dimen0} - 20 which we happen to use
+%D as scratch registers; inside context we may consider
+%D using dedicated registers.
+
+%D This module handles some \PDF\ conversion and insertions
+%D topics. By default, the macros use the \PDFTEX\ primitive
+%D \type{\pdfliteral} when available. Since \PDFTEX\ is now the
+%D default engine for \TEX\ distributions, we need a more complex
+%D test.
+
+\unprotect
+
+\ifx\PDFcode\undefined
+ \ifx\pdfliteral\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifx\pdfoutput\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifcase\pdfoutput
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else % pdftex as well as in pdf mode
+ \let\PDFcode\pdfliteral
+ \fi\fi\fi
+\else
+ % we probably use context
+\fi
+
+%D First we define a handy constant:
+
+\bgroup \defineMPtoPDFfallbacks \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D {pdfimage,pdfimages,pdfclippedimage}
+%D
+%D Starting with pdftex version 14, images are included more
+%D natural to the form embedding. This enables alternative
+%D images to be embedded.
+%D
+%D \starttyping
+%D \pdfimage <optional dimensions> {file}
+%D \pdfimages <optional dimensions> {high res file} {low res file}
+%D \stoptyping
+%D
+%D The first one replaces the pre||version||14 original,
+%D while the latter provides alternative images.
+%D
+%D The next macro is dedicated to Maarten Gelderman, who
+%D needed to paste prepared \PDF\ pages into conference
+%D proceedings.
+%D
+%D \starttyping
+%D \pdfclippedimage <optional dimensions> {file} {l} {r} {t} {b}
+%D \stoptyping
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \def\pdfimage#1#%
+ {\dopdfimage{#1}}
+
+ \def\dopdfimage#1#2%
+ {\immediate\pdfximage#1{#2}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfimages#1#%
+ {\dopdfimages{#1}}
+
+ \def\dopdfimages#1#2#3%
+ {\immediate\pdfximage#1{#2}%
+ \immediate\pdfobj{[ << /Image \the\pdflastximage\space0 R /DefaultForPrinting true >> ]}%
+ \immediate\pdfximage#1 attr {/Alternates \the\pdflastobj\space0 R}{#3}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfclippedimage#1#% specs {file}{left}{right}{top}{bottom}
+ {\dopdfclippedimage{#1}}
+
+ \def\dopdfclippedimage#1#2#3#4#5#6%
+ {\bgroup
+ \pdfximage#1{#2}%
+ \setbox\scratchbox\hbox
+ {\pdfrefximage\pdflastximage}%
+ \hsize\wd\scratchbox
+ \advance\hsize -#3
+ \advance\hsize -#4
+ \vsize\ht\scratchbox
+ \advance\vsize -#5
+ \advance\vsize -#6
+ \setbox\scratchbox\vbox to \vsize
+ {\vskip-#5\hbox to \hsize{\hskip-#3\box\scratchbox\hss}}%
+ \pdfxform\scratchbox
+ \pdfrefxform\pdflastxform
+ \egroup}
+
+\fi \fi
+
+%D If you want to save a few hash entries, you may prefer the
+%D less readable alternatives, like:
+%D
+%D \starttyping
+%D \def\pdfimage#1#% This one is less readable but needs no additional
+%D {\bgroup % hash entry for the second stage macro.
+%D \def\pdfimage##1%
+%D {\immediate\pdfximage##1{#2}%
+%D \pdfrefximage\pdflastximage\egroup}}
+%D \stoptyping
+
+%D For old times sake we provide a few aliases. These will be
+%D removed some day.
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \let\pdfform =\pdfxform
+ \let\pdflastform=\pdflastxform
+ \let\pdfrefform =\pdfrefxform
+
+\fi \fi
+
+%D The main conversion macro wraps the \PDF\ codes in a box
+%D that is output as an object. The graphics are embedded
+%D in~\type{q} and~\type{Q} and are scaled and positioned using
+%D one transform call (\type{cm}). This saves some additional
+%D scaling.
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. Because we want to test as fast as possible, we
+%D first define the \POSTSCRIPT\ operators that \METAPOST\
+%D uses. We don't define irrelevant ones, because these are
+%D skipped anyway.
+
+%D The converter can be made a bit faster by replacing the
+%D two test macros (the ones with the many \type {\if's}) by
+%D a call to named branch macros (something \typ {\getvalue
+%D {xPSmoveto}}. For everyday documents with relatively
+%D small graphics the gain in speed can be neglected.
+
+\def \PScurveto {curveto}
+\def \PSlineto {lineto}
+\def \PSmoveto {moveto}
+\def \PSshowpage {showpage}
+\def \PSnewpath {newpath}
+\def \PSfshow {fshow}
+\def \PSclosepath {closepath}
+\def \PSfill {fill}
+\def \PSstroke {stroke}
+\def \PSclip {clip}
+\def \PSrlineto {rlineto}
+\def \PSsetlinejoin {setlinejoin}
+\def \PSsetlinecap {setlinecap}
+\def \PSsetmiterlimit {setmiterlimit}
+\def \PSsetgray {setgray}
+\def \PSsetrgbcolor {setrgbcolor}
+\def \PSsetcmykcolor {setcmykcolor}
+\def \PSsetdash {setdash}
+\def \PSgsave {gsave}
+\def \PSgrestore {grestore}
+\def \PStranslate {translate}
+\def \PSscale {scale}
+\def \PSconcat {concat}
+\def \PSdtransform {dtransform}
+\def \PSsetlinewidth {setlinewidth}
+\def \PSpop {pop}
+
+\def \PSnfont {nfont} % was needed for TUG98 proceedings
+\def \PSspecial {special} % extensions to MetaPost
+
+%D A previous version set \type {%} to ignore, which
+%D simplified the following definitions. At the start of
+%D conversion the percent character was made active again.
+%D Because the whole graphic is one paragraph (there are no
+%D empty lines) this does not give the desired effect. This
+%D went unnoticed untill Scott Pakin sent me a test file
+%D percent characters in a string. So, from now on we have
+%D to prefix the following strings with percentages.
+
+%D Some day I'll figure out a better solution (line by line reading
+%D using \ETEX).
+
+\edef \PSBoundingBox {\letterpercent\letterpercent BoundingBox:}
+\edef \PSHiResBoundingBox {\letterpercent\letterpercent HiResBoundingBox:}
+\edef \PSExactBoundingBox {\letterpercent\letterpercent ExactBoundingBox:}
+\edef \PSMetaPostSpecial {\letterpercent\letterpercent MetaPostSpecial:}
+\edef \PSMetaPostSpecials {\letterpercent\letterpercent MetaPostSpecials:}
+\edef \PSPage {\letterpercent\letterpercent Page:}
+\edef \PSBeginProlog {\letterpercent\letterpercent BeginProlog}
+\edef \PSEndProlog {\letterpercent\letterpercent EndProlog}
+\edef \PSEof {\letterpercent\letterpercent EOF}
+
+%D By the way, the \type {setcmykcolor} operator is not
+%D output by \METAPOST\ but can result from converting the
+%D \cap{RGB} color specifications, as implemented in
+%D \type{supp-mps}.
+
+%D In \POSTSCRIPT\ arguments precede the operators. Due to the
+%D fact that in some translations we need access to those
+%D arguments, and also because sometimes we have to skip them,
+%D we stack them up. The stack is one||dimensional for non path
+%D operators and two||dimensional for operators inside a path.
+%D This is because we have to save the whole path for
+%D (optional) postprocessing. Values are pushed onto the stack
+%D by:
+%D
+%D \starttyping
+%D \setMPargument {value}
+%D \stoptyping
+%D
+%D They can be retrieved by the short named macros:
+%D
+%D \starttyping
+%D \gMPa {number}
+%D \gMPs {number}
+%D \stoptyping
+%D
+%D When scanning a path specification, we also save the
+%D operator, using
+%D
+%D \starttyping
+%D \setMPkeyword {n}
+%D \stoptyping
+%D
+%D The path drawing operators are coded for speed: \type{clip},
+%D \type{stroke}, \type{fill} and \type{fillstroke} become
+%D 1, 2, 3 and~4.
+%D
+%D When processing the path this code can be retrieved
+%D using
+%D
+%D \starttyping
+%D \getMPkeyword % {n}
+%D \stoptyping
+%D
+%D When setting an argument, the exact position on the stack
+%D depends on the current value of the \COUNTERS\
+%D \type{\nofMPsegments} and \type{\nofMParguments}.
+
+\newcount\nofMPsegments
+\newcount\nofMParguments
+
+%D These variables hold the coordinates. The argument part of
+%D the stack is reset by:
+%D
+%D \starttyping
+%D \resetMPstack
+%D \stoptyping
+%D
+%D We use the prefix \type{@@MP} to keep the stack from
+%D conflicting with existing macros. To speed up things a bit
+%D more, we use the constant \type{\@@MP}.
+
+\def\@@MP{@@MP}
+
+\def\setMPargument% #1%
+ {\advance\nofMParguments 1
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} % {#1}
+
+\def\letMPargument
+ {\advance\nofMParguments 1
+ \expandafter\let
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname}
+
+\def\setMPsequence#1 %
+ {\advance\nofMParguments 1
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{#1}%
+ \handleMPsequence}
+
+\def\gMPa#1%
+ {\csname\@@MP0\number#1\endcsname}
+
+\def\gMPs#1%
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}
+
+\def\dogMPa#1%
+ {\expandafter\expandafter\expandafter\do\csname\@@MP0\number#1\endcsname}
+
+\def\setMPkeyword#1 %
+ {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
+ \advance\nofMPsegments 1
+ \nofMParguments0}
+
+\def\getMPkeyword% #1%
+ {\csname\@@MP\the\nofMPsegments0\endcsname} % {\csname\@@MP#10\endcsname}
+
+\def\docleanupMPargument#1% we need this because args can have [ or ] pre/appended
+ {\expandafter\edef\csname\@@MP\the\nofMPsegments\number#1\endcsname
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}}
+
+%D When we reset the stack, we can assume that all further
+%D comment is to be ignored and handled in strings.
+%D By redefining the reset macro after the first call, we
+%D save some run time. Only use this macro after all
+%D comments are processed and use the simple alternative
+%D when dealing with comments.
+
+\def\doresetMPstack
+ {\nofMParguments0\relax}
+
+\def\resetMPstack
+ {\let\handleMPgraphic\handleMPendgraphic
+ \let\resetMPstack\doresetMPstack
+ \resetMPstack}
+
+%D The arguments are saved with the preceding command
+%D \type{\do}. By default this command expands to nothing, but
+%D when we deal with strings it's used to strip off the
+%D \type{(} and \type{)}.
+%D
+%D Strings are kind of tricky, because characters can be
+%D passed verbatim \type{(hello)}, by octal number
+%D \type{(\005)} or as command \type{(\()}. We therefore
+%D cannot simply ignore \type{(} and \type{)}, the way we do
+%D with \type{[} and \type{]}. Another complication is that
+%D strings may contain characters that normally have a
+%D special meaning in \TEX, like \type{$} and \type{{}}.
+%D
+%D A previous solution made \type{\} an active character and
+%D let it look ahead for a number or characters. We had to
+%D abandon this scheme because of the need for verbatim
+%D support. The next solution involved some \CATCODE\
+%D trickery but works well.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+%D curly braces and squarly brackets are stored in the argument stack
+%D as part of strings, for instance in:
+%D
+%D \starttyping
+%D /fshow {exch findfont exch scalefont setfont show}bind def
+%D [3 3 ] 0 setdash
+%D \stoptyping
+%D
+%D but we need to keep them in situation like
+%D
+%D \starttyping
+%D ([bla bla] bla bla) ec-lmr10 9.96265 fshow
+%D ({bla bla} bla bla) ec-lmr10 9.96265 fshow
+%D \stoptyping
+%D
+%D So, when we store the snippets, we keep the special tokens, and
+%D when needed we either ignore or obey them
+
+\bgroup
+\defineMPtoPDFfallbacks
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\keepMPspecials|
+ B\let%\letterpercent|
+ \def[B\noexpand[E|
+ \def]B\noexpand]E|
+ \def{B\noexpand{E|
+ \def}B\noexpand}EE
+\gdef\ignoreMPspecials|
+ B\let%\letterpercent|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\setnaturalcatcodes
+ \catcode`\\=\@@escape
+ \catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \lccode`\-=0 | latex sets this to `\-
+ \lccode`\%=`\% | otherwise it's seen as a number
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D We use the comment symbol as a sort of trigger. Beware!
+%D The whole graphic is seen as on eparagraph, which means
+%D that we cannot change the catcodes in between.
+
+\bgroup
+\defineMPtoPDFfallbacks
+\catcode`\%=\@@active
+\gdef\startMPscanning{\let%=\startMPconversion}
+\egroup
+
+%D In earlier versions we used the sequence
+%D
+%D \starttyping
+%D \expandafter\handleMPsequence\input filename\relax
+%D \stoptyping
+%D
+%D Persistent problems in \LATEX\ however forced us to use a
+%D different scheme. Every \POSTSCRIPT\ file starts with a
+%D \type{%}, so we temporary make this an active character
+%D that starts the scanning and redefines itself. (The problem
+%D originates in the redefinition by \LATEX\ of the
+%D \type{\input} primitive.)
+
+\def\startMPconversion
+ {\keepMPspecials
+ \handleMPsequence}
+
+%D Here comes the main loop. Most arguments are numbers. This
+%D means that they can be recognized by their \type{\lccode}.
+%D This method saves a lot of processing time. We could
+%D speed up the conversion by handling the \type{path}
+%D seperately.
+
+\def\dohandleMPsequence#1%
+ {\ifdone
+ \ifcase\lccode`#1\relax
+ \expandafter\expandafter\expandafter\dohandleMPsequenceA
+ \else
+ \expandafter\expandafter\expandafter\dohandleMPsequenceB
+ \fi
+ \else
+ \expandafter\dohandleMPsequenceC
+ \fi#1}
+
+\let\dohandleMPsequenceA\setMPsequence
+
+\def\installMPSkeywordN#1#2%
+ {\expandafter\def\csname\@@MP:N:#1\endcsname{#2}}
+
+\def\installMPSshortcutN#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:N:#1\expandafter\endcsname\csname\@@MP:N:#2\endcsname}
+
+\def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \ifcsname\@@MP:N:\somestring\endcsname
+ \csname\@@MP:N:\somestring\expandafter\endcsname
+ \else
+ \expandafter\handleMPgraphic
+ \fi
+ \handleMPsequence}
+
+\ifx\eTeXversion\undefined
+ \def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \expandafter\ifx\csname\@@MP:N:\somestring\endcsname\relax
+ \expandafter\handleMPgraphic
+ \else
+ \csname\@@MP:N:\somestring\expandafter\endcsname
+ \fi
+ \handleMPsequence}
+\fi
+
+\installMPSkeywordN \PSmoveto
+ {\edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \resetMPstack}
+\installMPSkeywordN \PSnewpath
+ {\let\handleMPsequence\handleMPpath}
+\installMPSkeywordN \PSgsave
+ {\PDFcode{q}%
+ \resetMPstack}
+\installMPSkeywordN \PSgrestore
+ {\PDFcode{Q}%
+ \resetMPstack}
+\installMPSkeywordN \PSdtransform % == setlinewidth
+ {\let\handleMPsequence\handleMPdtransform}
+ % after that we will encounter more tokens until setlinewidth+pop
+ % or pop+setlinewidth which we catch next; we explicitly need to
+ % reset the stack since [] n setdash may follow; a more clever
+ % approach would be to read on till the condition is met, but it's
+ % the only pop / setlinewidth we will encounter so ...
+\installMPSkeywordN \PSsetlinewidth
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSpop
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSconcat
+ {\cleanupMPconcat
+ \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetrgbcolor
+ {\handleMPrgbcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetcmykcolor
+ {\handleMPcmykcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetgray
+ {\handleMPgraycolor
+ \resetMPstack}
+\installMPSkeywordN \PStranslate
+ {\PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetdash
+ {\handleMPsetdash
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinejoin
+ {\PDFcode{\gMPa1 j}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetmiterlimit
+ {\PDFcode{\gMPa1 M}%
+ \resetMPstack}
+\installMPSkeywordN \PSfshow
+ {%\PDFcode{n}% removed !
+ \handleMPfshow
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinecap
+ {\PDFcode{\gMPa1 J}%
+ \resetMPstack}
+\installMPSkeywordN \PSrlineto
+ {\flushMPmoveto
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPmoveto
+ \resetMPstack}
+\installMPSkeywordN \PSscale
+ {\PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSspecial
+ {\handleMPspecialcommand
+ \resetMPstack}
+
+\installMPSshortcutN {n} \PSnewpath
+\installMPSshortcutN {p} \PSclosepath
+\installMPSshortcutN {l} \PSlineto
+\installMPSshortcutN {r} \PSrlineto
+\installMPSshortcutN {m} \PSmoveto
+\installMPSshortcutN {c} \PScurveto
+\installMPSshortcutN {C} \PSsetcmykcolor
+\installMPSshortcutN {G} \PSsetgray
+\installMPSshortcutN {R} \PSsetrgbcolor
+\installMPSshortcutN {lj} \PSsetlinejoin
+\installMPSshortcutN {ml} \PSsetmiterlimit
+\installMPSshortcutN {lc} \PSsetlinecap
+\installMPSshortcutN {sd} \PSsetdash
+\installMPSshortcutN {S} \PSstroke
+\installMPSshortcutN {F} \PSfill
+\installMPSshortcutN {W} \PSclip
+
+\installMPSshortcutN {q} \PSgsave
+\installMPSshortcutN {Q} \PSgrestore
+
+\installMPSshortcutN {s} \PSscale
+\installMPSshortcutN {t} \PSconcat
+\installMPSshortcutN {P} \PSshowpage
+
+\installMPSkeywordN {hlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {vlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {rd} {\PDFcode{[] 0 d}\resetMPstack}
+
+\def\dohandleMPsequenceC#1 %
+ {\edef\somestring{#1}%
+ \handleMPgraphic % {#1}%
+ \handleMPsequence}
+
+%D Since colors are not sensitive to transformations, they
+%D are sometimes used for signaling. Therefore, we handle them
+%D separately. The next macro can be redefined if needed.
+
+\def\handleMPrgbcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}}
+
+\def\handleMPcmykcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}}
+
+\def\handleMPgraycolor
+ {\PDFcode{\!MPgMPa1 g
+ \!MPgMPa1 G}}
+
+\def\handleMPspotcolor
+ {\PDFcode{0 g
+ 0 G}}
+
+%D Beginning and ending the graphics is taken care of by the
+%D macro \type{\handleMPgraphic}, which is redefined when
+%D the first graphics operator is met.
+
+\def\handleMPendgraphic % #1%
+ {\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi}
+
+\def\handleMPbegingraphic % #1%
+ {\ifx\somestring\PSBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox1}%
+ \else\ifx\somestring\PSHiResBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox2}%
+ \else\ifx\somestring\PSExactBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox3}%
+ \else\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSPage
+ \let\handleMPsequence\handleMPpage
+ \else\ifx\somestring\PSMetaPostSpecials
+ \let\handleMPsequence\handleMPspecialscomment
+ \else\ifx\somestring\PSMetaPostSpecial
+ \let\handleMPsequence\handleMPspecialcomment
+ \else\ifx\somestring\PSBeginProlog
+ \let\handleMPsequence\handleMPprolog
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\let\handleMPgraphic=\handleMPbegingraphic
+
+%D New: we can best filter the prolog because nowdays it can contain
+%D quite some code.
+
+% hm, catcode mess, so we need to tweak %'s catcode here
+% \long\expandafter\def\expandafter\handleMPprolog\expandafter#\expandafter1\PSEndProlog%
+% but today i'm not in the mood for ugly stuff
+
+\long\def\handleMPprolog#1EndProlog %
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D We check for three kind of bounding boxes: the normal one
+%D and two high precision ones:
+%D
+%D \starttyping
+%D BoundingBox: llx lly ucx ucy
+%D HiResBoundingBox: llx lly ucx ucy
+%D ExactBoundingBox: llx lly ucx ucy
+%D \stoptyping
+%D
+%D The original as well as the recalculated dimensions are
+%D saved for later use.
+
+\newif\ifskipemptyMPgraphic \skipemptyMPgraphicfalse
+
+\chardef\currentMPboundingbox=0
+
+\def\handleMPboundingbox#1#2 #3 #4 #5
+ {\ifnum#1>\currentMPboundingbox
+ \xdef\MPllx{#2}\xdef\MPlly{#3}%
+ \xdef\MPurx{#4}\xdef\MPury{#5}%
+ \dimen0=#2pt
+ \dimen0=-\MPxscale\dimen0
+ \dimen2=#3pt
+ \dimen2=-\MPyscale\dimen2
+ \xdef\MPxoffset{\withoutpt\the\dimen0}%
+ \xdef\MPyoffset{\withoutpt\the\dimen2}%
+ \dimen0=#2bp
+ \dimen0=-\dimen0
+ \dimen2=#3bp
+ \dimen2=-\dimen2
+ \advance\dimen0 #4bp
+ \dimen0=\MPxscale\dimen0
+ \xdef\MPwidth{\the\dimen0}%
+ \advance\dimen2 #5bp
+ \xdef\MPyshift{\the\dimen2}% unscaled
+ \dimen2=\MPyscale\dimen2
+ \xdef\MPheight{\the\dimen2}%
+ \chardef\currentMPboundingbox#1\relax
+ \fi
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \let\next\handleMPsequence
+ \ifskipemptyMPgraphic
+ \ifdim\MPheight=0pt\relax\ifdim\MPwidth=0pt\relax
+ \def\next{\endinput\finishMPgraphic}%
+ \fi\fi
+ \fi
+ \next}
+
+%D Unless defined otherwise, we simply ignore specialcomments.
+
+\def\handleMPspecialcomment
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+\let\handleMPspecialscomment\handleMPspecialcomment
+
+%D We use the \type{page} comment as a signal that
+%D stackbuilding can be started.
+
+\def\handleMPpage #1 #2
+ {\doresetMPstack
+ \donetrue
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D The same applies to the special extensions.
+
+\def\handleMPspecialcommand
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D \METAPOST\ draws its dots by moving to a location and
+%D invoking \type{0 0 rlineto}. This operator is not
+%D available in \PDF. Our solution is straightforward: we draw
+%D a line from $(current\_x, current\_y)$ to itself. This
+%D means that the arguments of the preceding \type{moveto} have
+%D to be saved.
+
+\def\lastMPmoveX{0}
+\def\lastMPmoveY{0}
+
+%D These saved coordinates are also used when we handle the
+%D texts. Text handling proved to be a bit of a nuisance, but
+%D finally I saw the light. It proved that we also had to
+%D take care of \type{(split arguments)}.
+
+% \def\setMPfshowfont#1#2%
+% {\font\temp=#1\space at #2\relax\temp}
+
+% \startMPcode
+% draw btex Ga toch effe f\kern0ptietsen?{}` etex ;
+% \stopMPcode
+
+\newtoks \everyMPshowfont
+
+\def\setMPfshowfont#1#2%
+ {\font\temp=#1\space at #2\relax\temp
+ \the\everyMPshowfont}
+
+\let\MPfshowcommand\empty
+
+%D The next hackery handles characters one by one. We only support this
+%D for the latest greatest \METAPOST\ binaries, the ones that escape
+%D problematic chars.
+
+\def\doflushMPtext#1%
+ {\edef\!!stringa{#1}%
+ \expandafter\dodoflushMPtext\!!stringa\relax}
+
+\def\dodoflushMPtext
+ {\afterassignment\dododoflushMPtext\let\nexttoken=}
+
+\def\dododoflushMPtext
+ {\ifx\nexttoken\relax
+ % done
+ \else\ifx\nexttoken\char
+ \expandafter\expandafter\expandafter\dodododoflushMPtext
+ \else
+ {\nexttoken}%
+ \expandafter\expandafter\expandafter\dodoflushMPtext
+ \fi\fi}
+
+\def\dodododoflushMPtext
+ {\afterassignment\dododododoflushMPtext\scratchcounter}
+
+\def\dododododoflushMPtext
+ {{\char\scratchcounter}\let\next\dodoflushMPtext}
+
+\def\dohandleMPfshow
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\obeyMPspecials
+ \let\ \relax % mp breaks long lines and appends a \
+ \edef\size{\gMPa\nofMParguments}%
+ \ifx\size\PSnfont % round font size (to pt)
+ \advance\nofMParguments -1
+ \expandafter\scratchdimen\gMPa\nofMParguments pt\relax
+ \ifdim\scratchdimen<1pt
+ \def\size{1pt}%
+ \else
+ \advance\scratchdimen .5pt
+ \def\size##1.##2\relax{\def\size{##1pt}}%
+ \expandafter\size\the\scratchdimen\relax
+ \fi
+ \else
+ \edef\size{\size bp}%
+ \fi
+ \advance\nofMParguments -1
+ %\font\temp=\gMPa\nofMParguments\space at \size
+ \let\temp\relax % to be sure
+ \setMPfshowfont{\gMPa\nofMParguments}\size
+ \advance\nofMParguments -1
+ \temp
+ \MPfshowcommand
+ {\ifnum\nofMParguments=1
+ \def\do(##1){##1}%
+ \doflushMPtext{\dogMPa1}% only latest mp gets this treatment
+ \else
+ % we need to catch ( a ) (a a a) (\123 \123 \123) etc
+ \scratchcounter1
+ \def\dodo##1% Andreas Fieger's bug: (\304...)
+ {\edef\!!stringa{##1\empty\empty}% and another one: ( 11) -> \ifx 11
+ \ifx\!!stringa\MPspacechar\MPspacechar\else\expandafter##1\fi}%
+ \def\do(##1{\dodo{##1}}%
+ \dogMPa\scratchcounter\MPspacechar
+ \let\do\relax
+ \loop
+ \advance\scratchcounter 1
+ \ifnum\scratchcounter<\nofMParguments\relax
+ \gMPa\scratchcounter\MPspacechar
+ \repeat
+ \def\do##1){\dodo{##1}}%
+ \dogMPa\scratchcounter
+ \fi
+ \unskip}}%
+ \setbox\scratchbox\hbox
+ {\hskip\lastMPmoveX bp\raise\lastMPmoveY bp\box\scratchbox}%
+ \ht\scratchbox0pt%
+ \dp\scratchbox0pt%
+ \wd\scratchbox0pt%
+ \box\scratchbox
+ \egroup}
+
+\let\handleMPfshow\dohandleMPfshow % so we can overload this one later
+
+%D You could consider the following definition to be the most
+%D natural one.
+
+% \def\MPspacechar{\space} % normal case
+
+\def\MPspacechar{\char32\relax} % old solution does not work with math
+
+%D However, the following implementation is more robust, since
+%D some fonts have funny visible spaces in the space slot. This
+%D gives a mismatch between the space that \METAPOST\ took into
+%D account and the \quote {natural} space. This only happens in
+%D labels, since \type {btex}||\type {etex} thingies don't have
+%D spaces. This phenomena showed up when preparing the
+%D \METAFUN\ manual, where Palatino fonts are used. We can
+%D safely assume that \METAPOST\ considers \type {\char32} to
+%D be the space.
+
+\def\MPspacechar{\setbox\scratchbox\hbox{\char32}\kern\wd\scratchbox}
+
+%D Well, this does not work with math fonts, so:
+
+\def\MPspacechar{\char32\relax}
+
+%D Most operators are just converted and keep their
+%D arguments. Dashes however need a bit different treatment,
+%D otherwise \PDF\ viewers complain loudly. Another
+%D complication is that one argument comes after the \type{]}.
+%D When reading the data, we simply ignore the array boundary
+%D characters. We save ourselves some redundant newlines and
+%D at the same time keep the output readable by packing the
+%D literals.
+
+\def\handleMPsetdash
+ {\bgroup
+ \ignoreMPspecials
+ \def\somestring{[}%
+ \scratchcounter1
+ \loop
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa\scratchcounter}%
+ \advance\scratchcounter 1
+ \repeat
+ \edef\somestring{\somestring]\gMPa\scratchcounter\space d}%
+ \PDFcode{\somestring}%
+ \egroup}
+
+%D The \type{setlinewidth} commands looks a bit complicated. There are
+%D two alternatives, that result in a similar look in both
+%D $x$- and $y$-dorection. As John Hobby says:
+%D
+%D \startnarrower \switchtobodyfont[ss]
+%D \starttyping
+%D x 0 dtransform exch truncate exch idtransform pop setlinewidth
+%D 0 y dtransform truncate idtransform setlinewidth pop
+%D \stoptyping
+%D
+%D These are just fancy versions of \type{x setlinewidth} and
+%D \type{y setlinewidth}. The \type{x 0 ...} form is used if
+%D the path is {\em primarily vertical}. It rounds the width
+%D so that vertical lines come out an integer number of pixels
+%D wide in device space. The \type{0 y ...} form does the same
+%D for paths that are {\em primarily horizontal}. The reason
+%D why I did this is Knuth insists on getting exactly the
+%D widths \TEX\ intends for the horizontal and vertical rules
+%D in \type{btex...etex} output. (Note that PostScript scan
+%D conversion rules cause a horizontal or vertical line of
+%D integer width $n$ in device space to come out $n+1$ pixels
+%D wide, regardless of the phase relative to the pixel grid.)
+%D \stopnarrower
+%D
+%D The common operator in these sequences is \type{dtransform},
+%D so we can use this one to trigger setting the linewidth.
+
+\def\handleMPdtransform
+ {\ifdim\gMPa1 pt>0pt
+ \PDFcode{\gMPa1 w}%
+ \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}%
+ \else
+ \PDFcode{\gMPa2 w}%
+ \def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \next}
+
+%D The most complicated command is \type{concat}. \METAPOST\
+%D applies this operator to \type{stroke}. At that moment the
+%D points set by \type{curveto} and \type{moveto}, are already
+%D fixed. In \PDF\ however the \type{cm} operator affects the
+%D points as well as the pen (stroke). Like more \PDF\
+%D operators, \type{cm} is defined in a bit ambiguous way.
+%D The only save route for non||circular penshapes, is saving
+%D the path, recalculating the points and applying the
+%D transformation matrix in such a way that we can be sure
+%D that its behavior is well defined. This comes down to
+%D inverting the path and applying \type{cm} to that path as
+%D well as the pen. This all means that we have to save the
+%D path.
+
+%D In \METAPOST\ there are three ways to handle a path $p$:
+%D
+%D \starttyping
+%D draw p; fill p; filldraw p;
+%D \stoptyping
+%D
+%D The last case outputs a \type{gsave fill grestore} before
+%D \type{stroke}. Handling the path outside the main loops
+%D saves about 40\% run time.\footnote{We can save some more by
+%D following the \METAPOST\ output routine, but for the moment
+%D we keep things simple.} Switching between the main loop and
+%D the path loop is done by means of the recursely called
+%D macro \type{\handleMPsequence}.
+
+\def\handleMPpath
+ {\chardef\finiMPpath0
+ \let\closeMPpath\relax
+ \let\flushMPpath\flushnormalMPpath
+ \resetMPstack
+ \nofMPsegments1
+ \let\handleMPsequence\dohandleMPpath
+ \dohandleMPpath}
+
+%D Most paths are drawn with simple round pens. Therefore we've
+%D split up the routine in two.
+
+\def\flushnormalMPsegment
+ {\ifcase\getMPkeyword\relax
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 l}%
+ \or
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}%
+ \or
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l}%
+ \or
+ \edef\lastMPmoveX{\gMPs1}% evt \!MP here
+ \edef\lastMPmoveY{\gMPs2}%
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}%
+ \fi}
+
+\def\flushconcatMPsegment
+ {\ifcase\getMPkeyword\relax
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l}%
+ \or
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \doMPconcat{\gMPs3}\c{\gMPs4}\d%
+ \doMPconcat{\gMPs5}\e{\gMPs6}\f%
+ \PDFcode{\!MP\a\space\!MP\b\space
+ \!MP\c\space\!MP\d\space
+ \!MP\e\space\!MP\f\space c}%
+ \or
+ \bgroup
+ \noMPtranslate
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l S}%
+ \egroup
+ \or
+ \edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space m}%
+ \fi}
+
+% \def\flushnormalMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments 1
+% \loop
+% \flushnormalMPsegment
+% \advance\nofMPsegments 1
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% \def\flushconcatMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments 1
+% \loop
+% \flushconcatMPsegment
+% \advance\nofMPsegments 1
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% an alternative is presented below: (no \def assignment)
+
+\def\doflushsomeMPpath
+ {\dodoflushsomeMPpath
+ \advance\nofMPsegments 1
+ \ifnum\nofMPsegments<\scratchcounter
+ \expandafter\doflushsomeMPpath
+ \fi}
+
+\def\flushsomeMPpath
+ {\scratchcounter\nofMPsegments
+ \nofMPsegments 1
+ \doflushsomeMPpath}
+
+\def\flushnormalMPpath{\let\dodoflushsomeMPpath\flushnormalMPsegment\flushsomeMPpath}
+
+%OLD \def\flushconcatMPpath{\let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%NEW pre-calculate 1/D so it needn't be repeated for each control point.
+
+\def\flushconcatMPpath
+ {\MPreciprocaldeterminant
+ \let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%D The transformation of the coordinates is handled by one of
+%D the macros Tanmoy posted to the \PDFTEX\ mailing list.
+%D I rewrote and optimized the original macro to suit the other
+%D macros in this module.
+%D
+%D \starttyping
+%D \doMPconcat {x position} \xresult {y position} \yresult
+%D \stoptyping
+%D
+%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto
+%D \type{\dimen10} only once per path, we save over 20\% run
+%D time. Some more speed was gained by removing some parameter
+%D passing. These macros can be optimized a bit more by using
+%D more constants. There is however not much need for further
+%D optimization because penshapes usually are round and
+%D therefore need no transformation. Nevertheless we move the
+%D factor to the outer level and use a bit different \type{pt}
+%D removal macro. Although the values represent base points,
+%D we converted them to pure points, simply because those can
+%D be converted back.
+
+%OLD \mathchardef\MPconcatfactor=256 % beware don't remove spaces before it
+
+%OLD \def\doMPreducedimen#1
+%OLD {\count0\MPconcatfactor
+%OLD \advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\count0
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD % too inaccurate (see old pragma logo)
+%OLD
+%OLD \def\doMPreducedimen#1
+%OLD {\count0=\MPconcatfactor
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD \def\doMPreducedimen#1
+%OLD {\advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\MPconcatfactor
+%OLD \divide\dimen#1 \MPconcatfactor}
+
+%D The transformation code is rewritten by Daniel H. Luecking who
+%D describes his patch as follows:
+%D
+%D We would like to divide 1 by $X$, but all divisions are integer so
+%D for accuracy we want to convert to large integers and make sure the
+%D integer quotient has as many significant digits as possible. Thus we
+%D need to replace $1/X$ with $M/N$ where $N$ is as large as possible
+%D and $M/N$ is as large as possible. Also for simplicity $M$ should be
+%D a power of 2. So we make $M = 2^{30}$ \footnote{$2^{31} - 1$ is the
+%D largest legal integer. Using it (and simply ignoring the inaccuracy
+%D caused by $-1$) turns out to be at least as accurate in all cases,
+%D and more accurate in some.} (largest legal power of 2) and adjust
+%D $X$ downward (if necessary) to the the range $1-2^{16}$. This gives
+%D at least 15 significant binary digits, (almost as accurate as
+%D \METAPOST\ for numbers near 1) or almost 5 significant figures
+%D (decimal).
+
+\newcount\MPscratchCnt
+\newdimen\MPscratchDim % will be assigned global
+
+\def\MPadjustdimen % sets \MPscratchDim and \MPscratchCnt
+ {\MPscratchCnt0
+ \doMPadjustdimen}
+
+\def\doMPadjustdimen
+ {\ifdim\MPscratchDim>1pt
+ \divide\MPscratchDim 2
+ \advance\MPscratchCnt 1
+ \expandafter\doMPadjustdimen
+ \fi}
+
+%OLD \def\doMPexpanddimen#1
+%OLD {\multiply\dimen#1 \MPconcatfactor\relax}
+
+%D DHL: When viewed as an integer, $1 \hbox{pt}=2^{16}$ so $2^{32}/X$
+%D is the right way to do $(1 \hbox{pt})/(X \hbox{pt})$ and get the
+%D answer in points. But we are limited to $2^{30}/X$. However, we
+%D actually do $[ 2^{30} / (X/2^K) ]*2^{2-K}$ where $K$ is the number
+%D of halvings it takes to bring $X$ below $1 \hbox{pt}$. If $K$ is 0
+%D or 1 we readjust by multiplying by 4 or 2, otherwise by halving
+%D $(K-2)$ times \type {\MPscratchCnt} holds the value of $K$ from
+%D \type {\MPadjustdimen}.
+
+\def\MPreadjustdimen % acts on \MPscratchDim and MPscratchCnt
+ {\ifcase\MPscratchCnt
+ \multiply\scratchdimen 4
+ \or
+ \multiply\scratchdimen 2
+ \else
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\doMPreadjustdimen
+ {\ifnum\MPscratchCnt>2
+ \divide\scratchdimen 2
+ \advance\MPscratchCnt -1
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\MPreciprocaldeterminant
+ {\scratchdimen\withoutpt\the\dimen0 \dimen6 % s_x*s_y
+ \advance\scratchdimen - \withoutpt\the\dimen2 \dimen4 % s_x*s_y - r_x*r_y
+ \ifdim\scratchdimen<0pt % we need a positive dimension
+ \scratchdimen-\scratchdimen % for \MPadjustdimen (?)
+ \doMPreciprocal
+ \scratchdimen-\scratchdimen
+ \else
+ \doMPreciprocal
+ \fi
+ \edef\MPreciprocal{\withoutpt\the\scratchdimen}}
+
+\newcount\MPnumerator \MPnumerator = 1073741824 % 2^{30}
+
+% todo: dimexpr
+
+\def\doMPreciprocal % replace \scratchdimen with its reciprocal
+ {\ifdim\scratchdimen=1pt \else
+ \MPadjustdimen
+ \scratchcounter\MPnumerator
+ \divide\scratchcounter\scratchdimen
+ \scratchdimen1\scratchcounter % 1 needed !
+ \MPreadjustdimen
+ \fi}
+
+%OLD \def\presetMPconcat
+%OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0 % r_x
+%OLD \dimen 2=\gMPs2pt \doMPreducedimen 2 % s_x
+%OLD \dimen 4=\gMPs3pt \doMPreducedimen 4 % s_y
+%OLD \dimen 6=\gMPs4pt \doMPreducedimen 6 % r_y
+%OLD \dimen 8=\gMPs5pt \doMPreducedimen 8 % t_x
+%OLD \dimen10=\gMPs6pt \doMPreducedimen10 } % t_y
+%OLD
+%OLD \def\presetMPscale
+%OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0
+%OLD \dimen 2=0pt
+%OLD \dimen 4=0pt
+%OLD \dimen 6=\gMPs2pt \doMPreducedimen 6
+%OLD \dimen 8=0pt
+%OLD \dimen10=0pt}
+
+\def\cleanupMPconcat
+ {\ignoreMPspecials
+ \docleanupMPargument1%
+ \docleanupMPargument6%
+ \keepMPspecials}
+
+\def\presetMPconcat
+ {\dimen 0=\gMPs1pt % s_x
+ \dimen 2=\gMPs2pt % r_x
+ \dimen 4=\gMPs3pt % r_y
+ \dimen 6=\gMPs4pt % s_y
+ \dimen 8=\gMPs5pt % t_x
+ \dimen10=\gMPs6pt} % t_y
+
+\def\presetMPscale
+ {\dimen 0=\gMPs1pt
+ \dimen 2=0pt
+ \dimen 4=0pt
+ \dimen 6=\gMPs2pt
+ \dimen 8=0pt
+ \dimen10=0pt}
+
+\def\noMPtranslate % use this one grouped
+ {\dimen 8=0pt % t_x
+ \dimen10=0pt} % t_y
+
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+
+%D The following optimization resulted from some tests by
+%D and email exchanges with Sanjoy Mahajan.
+%D
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D %\ifdim\dimen16>1pt % oeps, can be < 1pt too
+%D \ifdim\dimen16=1pt \else
+%D \ifdim\dimen16>\MPconcatfactor pt
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D \else
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+%D \fi
+%D \fi
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+%D
+%D But, this one is still too inaccurate, so we now have:
+
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1pt % p_x
+% \dimen14=#3pt % p_y
+% %
+% % we should test for >-1024 too, but for the moment take the gamble
+% \chardef\MPfactor1\ifdim\dimen12<1024pt \ifdim\dimen14<1024pt 6\fi\fi
+% %
+% \multiply\dimen12 \MPfactor
+% \multiply\dimen14 \MPfactor
+% %
+% \doMPreducedimen12
+% \doMPreducedimen14
+% %
+% \dimen16 \dimen 0
+% \multiply \dimen16 \dimen 6
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 4
+% \advance \dimen16 -\dimen20
+% %
+% \dimen18 \dimen12
+% \multiply \dimen18 \dimen 6
+% \dimen20 \dimen14
+% \multiply \dimen20 \dimen 4
+% \advance \dimen18 -\dimen20
+% \dimen20 \dimen 4
+% \multiply \dimen20 \dimen10
+% \advance \dimen18 \dimen20
+% \dimen20 \dimen 6
+% \multiply \dimen20 \dimen 8
+% \advance \dimen18 -\dimen20
+% %
+% \multiply \dimen12 -\dimen 2
+% \multiply \dimen14 \dimen 0
+% \advance \dimen12 \dimen14
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 8
+% \advance \dimen12 \dimen20
+% \dimen20 \dimen 0
+% \multiply \dimen20 \dimen10
+% \advance \dimen12 -\dimen20
+% %
+% \ifdim\dimen16=1pt \else
+% \ifdim\dimen16>\MPconcatfactor pt
+% \doMPreducedimen16
+% \divide \dimen18 \dimen16 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12
+% \else
+% \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+% \fi
+% \fi
+% %
+% \divide\dimen18 \MPfactor
+% \divide\dimen12 \MPfactor
+% %
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+
+%D DHL: Ideally, $r_x$, $r_y$, $s_x$, $s_y$ should be in macros, not
+%D dimensions (they are scalar quantities after all, not lengths). I
+%D suppose the authors decided to do calculations with integer
+%D arithmetic instead of using real factors because it's faster.
+%D However, the actual macros test slower, possibly because I've
+%D omitted three nested loops. In my test files, my approach is more
+%D accurate. It is also far simpler and overflow does not seem to be a
+%D significant concern. The scale factors written by Metapost are (?)
+%D always $<=1$ (it scales coordinates internally) and coordinates are
+%D always likely to be less than \type {\maxdimen}.
+%D
+%D If this should ever cause problems, the scale factors can be reduced.
+
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1pt % p_x % #1pt
+% \dimen14=#3pt % p_y % #3pt
+% \advance\dimen12 -\dimen8 % p_x - t_x
+% \advance\dimen14 -\dimen10 % p_y - t_y
+% \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+% \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+% \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+% \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+% % \MPscratchDim contains precomputed 1/D:
+% \dimen18=\withoutpt\the\MPscratchDim \dimen18
+% \dimen14=\withoutpt\the\MPscratchDim \dimen14
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+
+\def\doMPconcat#1#2#3#4%
+ {\dimen12=#1pt % p_x % #1pt
+ \dimen14=#3pt % p_y % #3pt
+ \advance\dimen12 -\dimen8 % p_x - t_x
+ \advance\dimen14 -\dimen10 % p_y - t_y
+ \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+ \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+ \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+ \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+ % \MPreciprocal contains precomputed 1/D:
+ \dimen18=\MPreciprocal\dimen18
+ \dimen14=\MPreciprocal\dimen14
+ \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+ \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+
+% faster but not that often used
+%
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12\dimexpr#1\points-\dimen 8\relax % p_x-t_x
+% \dimen14\dimexpr#3\points-\dimen10\relax % p_y-t_y
+% \dimen18\dimexpr\withoutpt\the\dimen6\dimen12-\withoutpt\the\dimen4\dimen14\relax % s_y(p_x-t_x)-r_y(p_y-t_y)
+% \dimen14\dimexpr\withoutpt\the\dimen0\dimen14-\withoutpt\the\dimen2\dimen12\relax % s_x(p_y-t_y)-r_x(p_x-t_x)
+% \edef#2{\withoutpt\the\dimexpr\MPreciprocal\dimen18\relax}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimexpr\MPreciprocal\dimen14\relax}} % p_y^\prime
+
+%D One reason for Daniel to write this patch was that at small sizes
+%D the accuracy was less than optimal. Here is a test that demonstrates
+%D that his alternative is pretty good:
+%D
+%D \startlinecorrection
+%D \startMPcode
+%D for i = 5cm,1cm,5mm,1mm,.5mm,.1mm,.01mm :
+%D draw fullcircle scaled i withpen pencircle xscaled (i/10) yscaled (i/20) rotated 45 ;
+%D endfor ;
+%D \stopMPcode
+%D \stoplinecorrection
+
+%D The following explanation of the conversion process was
+%D posted to the \PDFTEX\ mailing list by Tanmoy. The original
+%D macro was part of a set of macro's that included sinus and
+%D cosinus calculations as well as scaling and translating. The
+%D \METAPOST\ to \PDF\ conversion however only needs
+%D transformation.
+
+%M \start \switchtobodyfont [ss]
+
+%D Given a point $(U_x, U_y)$ in user coordinates, the business
+%D of \POSTSCRIPT\ is to convert it to device space. Let us say
+%D that the device space coordinates are $(D_x, D_y)$. Then, in
+%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of
+%D $(U_x, U_y)$ in matrix notation, either as
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr}
+%D \pmatrix{s_x&r_x&0\cr
+%D r_y&s_y&0\cr
+%D t_x&t_y&1\cr}
+%D \stopformula
+%D
+%D or
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D both of which is a shorthand for the same set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D D_x = s_x U_x + r_y U_y + t_x
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D D_y = r_x U_x + s_y U_y + t_y
+%D \stopformula
+%D
+%D which define what is called an `affine transformation'.
+%D
+%D \POSTSCRIPT\ represents the `transformation matrix' as a
+%D six element matrix instead of a $3\times 3$ array because
+%D three of the elements are always~0, 0 and~1. Thus the above
+%D transformation is written in postscript as $[s_x\, r_x\,
+%D r_y\, s_y\, t_x\, t_y]$. However, when doing any
+%D calculations, it is useful to go back to the original
+%D matrix notation (whichever: I will use the second) and
+%D continue from there.
+%D
+%D As an example, if the current transformation matrix is
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b
+%D c d e f] concat}, this means:
+%D
+%D \startnarrower
+%D Take the user space coordinates and transform them to an
+%D intermediate set of coordinates using array $[a\, b\, c\, d\,
+%D e\, f]$ as the transformation matrix.
+%D
+%D Take the intermediate set of coordinates and change them to
+%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$
+%D as the transformation matrix.
+%D \stopnarrower
+%D
+%D Well, what is the net effect? In matrix notation, it is
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr
+%D b&d&f\cr
+%D 0&0&1\cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{I_x\cr
+%D I_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where $(I_x, I_y)$ is the intermediate coordinate.
+%D
+%D Now, the beauty of the matrix notation is that when there is
+%D a chain of such matrix equations, one can always compose
+%D them into one matrix equation using the standard matrix
+%D composition law. The composite matrix from two matrices can
+%D be derived very easily: the element in the $i$\high{th}
+%D horizontal row and $j$\high{th} vertical column is
+%D calculated by`multiplying' the $i$\high{th} row of the first
+%D matrix and the $j$\high{th} column of the second matrix (and
+%D summing over the elements). Thus, in the above:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &0 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D with
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {s_x^\prime & = s_x a + r_y b \cr
+%D r_x^\prime & = r_x a + s_y b \cr
+%D r_y^\prime & = s_x c + r_y d \cr
+%D s_y^\prime & = r_x c + s_y d \cr
+%D t_x^\prime & = s_x e + r_y f + t_x \cr
+%D t_y^\prime & = r_x e + s_y f + t_y \cr}
+%D \stopformula
+
+%D In fact, the same rule is true not only when one is going
+%D from user coordinates to device coordinates, but whenever
+%D one is composing two `transformations' together
+%D (transformations are `associative'). Note that the formula
+%D is not symmetric: you have to keep track of which
+%D transformation existed before (i.e.\ the equivalent of
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was
+%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\,
+%D e\, f]$). Note also that the language can be rather
+%D confusing: the one specified later `acts earlier',
+%D converting the user space coordinates to intermediate
+%D coordinates, which are then acted upon by the pre||existing
+%D transformation. The important point is that order of
+%D transformation matrices cannot be flipped (transformations
+%D are not `commutative').
+%D
+%D Now what does it mean to move a transformation matrix
+%D before a drawing? What it means is that given a point
+%D $(P_x, P_y)$ we need a different set of coordinates
+%D $(P_x^\prime, P_y^\prime)$ such that if the transformation
+%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x,
+%D P_y)$. That is we need to solve the set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x^\prime\cr
+%D P_y^\prime\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D Again matrix notation comes in handy (i.e. someone has
+%D already solved the problem for us): we need the inverse
+%D transformation matrix. The inverse transformation matrix can
+%D be calculated very easily:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} =
+%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x\cr
+%D P_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where, the inverse transformation matrix is given by
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {D & = s_x s_y - r_x r_y \cr
+%D s_x^\prime & = s_y / D \cr
+%D s_y^\prime & = s_x / D \cr
+%D r_x^\prime & = - r_x / D \cr
+%D r_y^\prime & = - r_y / D \cr
+%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr
+%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr}
+%D \stopformula
+%D
+%D And you can see that when expanded out, this does
+%D give the formulas:
+%D
+%D \placeformula
+%D \startformula
+%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over
+%D { s_x s_y-r_x r_y } }
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformula
+%D
+%D The code works by representing a real number by converting
+%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would
+%D be represented as 2.3pt for example. In this scheme,
+%D multiplying two numbers involves multiplying the \DIMENSION\
+%D registers and dividing by 65536. Accuracy demands that the
+%D division be done as late as possible, but overflow
+%D considerations need early division.
+%D
+%D Division involves dividing the two \DIMENSION\ registers and
+%D multiplying the result by 65536. Again, accuracy would
+%D demand that the numerator be multiplied (and|/|or the
+%D denominator divided) early: but that can lead to overflow
+%D which needs to be avoided.
+%D
+%D If nothing is known about the numbers to start with (in
+%D concat), I have chosen to divide the 65536 as a 256 in each
+%D operand. However, in the series calculating the sine and
+%D cosine, I know that the terms are small (because I never
+%D have an angle greater than 45 degrees), so I chose to
+%D apportion the factor in a different way.
+
+%M \stop
+
+%D The path is output using the values saved on the stack. If
+%D needed, all coordinates are recalculated.
+
+\def\finishMPpath
+ {\PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\fi}}
+
+\def\processMPpath
+ {\checkMPpath
+ \ifcase\nofMPsegments\else
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments0
+ \handleMPsequence}
+
+%D The following \METAPOST\ code is quite valid but, when
+%D processed and converted to \PDF, will make a file
+%D unprintable on a Hewlett Packard printer (from Acrobat
+%D $v<=5$). Who is to blame, the driver of the OS layer in
+%D between, is hard to determine, so we add an additional
+%D check.
+%D
+%D \starttyping
+%D clip currentpicture to origin -- cycle ;
+%D setbounds currentpicture to fullsquare scaled 5cm ;
+%D \stoptyping
+
+\def\checkMPpath
+ {\ifcase\finiMPpath
+ \ifnum\nofMPsegments<3 % n is one ahead
+ \message{omitting zero clip path}%
+ \nofMPsegments0
+ \fi
+ \fi}
+
+%D In \PDF\ the \type{cm} operator must precede the path
+%D specification. We therefore can output the \type{cm} at
+%D the moment we encounter it.
+
+\def\handleMPpathconcat
+ {\presetMPconcat
+ \PDFcode{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}%
+ \resetMPstack}
+
+\def\handleMPpathscale
+ {\presetMPscale
+ \PDFcode{\gMPs1 0 0 \gMPs2 0 0 cm}%
+ \resetMPstack}
+
+%D This macro interprets the path and saves it as compact as
+%D possible.
+
+\def\dohandleMPpath#1%
+ {\ifcase\lccode`#1\relax
+ \expandafter\dohandleMPpathA
+ \else
+ \expandafter\dohandleMPpathB
+ \fi#1}
+
+%\def\dohandleMPpathA#1 %
+% {\setMPargument{#1}%
+% \handleMPsequence}
+
+\let\dohandleMPpathA\setMPsequence
+
+% \def\dohandleMPpathB#1 %
+% {\def\somestring{#1}%
+% \ifx\somestring\PSlineto
+% \setMPkeyword0
+% \else\ifx\somestring\PScurveto
+% \setMPkeyword1
+% \else\ifx\somestring\PSrlineto
+% \setMPkeyword2
+% \else\ifx\somestring\PSmoveto
+% \setMPkeyword3
+% \else\ifx\somestring\PSclip
+% % \chardef\finiMPpath0 % already
+% \let\handleMPsequence\processMPpath
+% \else\ifx\somestring\PSgsave
+% \chardef\finiMPpath3
+% \else\ifx\somestring\PSgrestore
+% \else\ifx\somestring\PSfill
+% \ifcase\finiMPpath
+% \chardef\finiMPpath2
+% \let\handleMPsequence\processMPpath
+% \fi
+% \else\ifx\somestring\PSstroke
+% \ifcase\finiMPpath
+% \chardef\finiMPpath1
+% \fi
+% \let\handleMPsequence\processMPpath
+% \else\ifx\somestring\PSclosepath
+% \def\closeMPpath{\PDFcode{h}}%
+% \else\ifx\somestring\PSconcat
+% \cleanupMPconcat
+% \let\flushMPpath\flushconcatMPpath
+% \handleMPpathconcat
+% \else\ifx\somestring\PSscale
+% \let\flushMPpath\flushconcatMPpath
+% \handleMPpathscale
+% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+% \handleMPsequence}
+
+\def\installMPSkeywordP#1#2%
+ {\expandafter\def\csname\@@MP:P:#1\endcsname{#2}}
+
+\def\installMPSshortcutP#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:P:#1\expandafter\endcsname\csname\@@MP:P:#2\endcsname}
+
+\def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \ifcsname\@@MP:P:\somestring\endcsname
+ \csname\@@MP:P:\somestring\expandafter\endcsname
+ \fi
+ \handleMPsequence}
+
+\ifx\eTeXversion\undefined
+ \def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \csname\@@MP:P:\somestring\endcsname
+ \handleMPsequence}
+\fi
+
+\installMPSkeywordP \PSlineto
+ {\setMPkeyword0 }
+\installMPSkeywordP \PScurveto
+ {\setMPkeyword1 }
+\installMPSkeywordP \PSrlineto
+ {\setMPkeyword2 }
+\installMPSkeywordP \PSmoveto
+ {\edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \resetMPstack
+ \setMPkeyword3 }
+\installMPSkeywordP \PSclip
+ {% \chardef\finiMPpath\zerocount % already
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSgsave
+ {\chardef\finiMPpath3 }
+\installMPSkeywordP \PSgrestore
+ {}
+\installMPSkeywordP \PSfill
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath2
+ \let\handleMPsequence\processMPpath
+ \fi}
+\installMPSkeywordP \PSstroke
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath1
+ \fi
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSclosepath
+ {\def\closeMPpath{\PDFcode{h}}}
+\installMPSkeywordP \PSconcat
+ {\cleanupMPconcat
+ \let\flushMPpath\flushconcatMPpath
+ \handleMPpathconcat}
+\installMPSkeywordP \PSscale
+ {\let\flushMPpath\flushconcatMPpath
+ \handleMPpathscale}
+
+\installMPSshortcutP {l} \PSlineto
+\installMPSshortcutP {r} \PSrlineto
+\installMPSshortcutP {m} \PSmoveto
+\installMPSshortcutP {c} \PScurveto
+
+\installMPSshortcutP {q} \PSgsave
+\installMPSshortcutP {Q} \PSgrestore
+\installMPSshortcutP {S} \PSstroke
+\installMPSshortcutP {F} \PSfill
+\installMPSshortcutP {B} \PSgsave
+\installMPSshortcutP {W} \PSclip
+\installMPSshortcutP {p} \PSclosepath
+
+\installMPSshortcutP {s} \PSscale
+\installMPSshortcutP {t} \PSconcat
+
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never \NC don't use an object \NC\NR
+%D \NC 1 \NC always \NC always use an object \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject\undefined \chardef\makeMPintoPDFobject=0 \fi
+
+\def\lastPDFMPobject{0}
+
+%D The additional code needed can be made available in the
+%D (global) macro \type {\currentPDFresources}.
+
+\let\currentPDFresources\empty
+
+\newtoks\everyMPtoPDFconversion
+
+\def\convertMPtoPDF % #1#2#3%
+ {\bgroup
+ \defineMPtoPDFfallbacks
+ \ifx\pdfdecimaldigits\undefined\else \pdfdecimaldigits=5 \fi % new
+ \setbox\scratchbox\vbox\bgroup
+ \xdef\MPheight{0pt}%
+ \xdef\MPwidth {0pt}%
+ \forgetall
+ \offinterlineskip
+ \startMPresources
+ \doprocessMPtoPDFfile} %
+
+%D The next one is kind of private and probably will become obsolete):
+
+\def\processMPtoPDFfile % file xscale yscale
+ {\bgroup
+ \let\finishMPgraphic\egroup
+ \doprocessMPtoPDFfile}
+
+\let\setMPextensions\relax
+
+\def\doprocessMPtoPDFfile#1#2#3% file xscale yscale
+ {\setMPspecials
+ \setMPextensions
+ \the\everyMPtoPDFconversion
+ \catcode`\^^M=\@@endofline
+ \startMPscanning
+ \let\do\empty
+ \xdef\MPxscale{#2}%
+ \xdef\MPyscale{#3}%
+ \xdef\MPxoffset{0}%
+ \xdef\MPyoffset{0}%
+ \xdef\MPyshift{0pt}%
+ \donefalse
+ \let\handleMPsequence\dohandleMPsequence
+ \message{[MP to PDF]}% was: [MP to PDF #1] but there is a (#1) anyway
+ \input#1\relax}
+
+\def\PDFMPformoffset
+ {\ifx\objectoffset\undefined0pt\else\objectoffset\fi}
+
+\chardef\blackoutMPgraphic0 % in ConTeXt 1
+
+\def\finishMPgraphic
+ {\stopMPresources
+ \egroup
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \hbox
+ {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space \MPxoffset\space \MPyoffset\space cm}%
+ \ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi
+ \lower\MPyshift\box\scratchbox % unscaled shift
+ \PDFcode{Q}}}%
+ \ht\scratchbox\MPheight
+ \wd\scratchbox\MPwidth
+ \dp\scratchbox0pt\relax
+ \dopackageMPgraphic\scratchbox
+ \egroup
+ \endinput}
+
+%D Alternative for \PDFTEX. We cannot come up with something more contexy
+%D because this module is also used in \LATEX.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+ {%\ifx\pdfxform\undefined
+ % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ %\else\ifx\pdftexversion\undefined
+ % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ %\else\ifnum\pdftexversion<14
+ % \chardef\makeMPintoPDFobject0 % no resource support
+ %\else
+ % % keep the default value
+ %\fi\fi\fi
+ \ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+ % an existing value of 2 signals object support (set elsewhere)
+ \chardef\makeMPintoPDFobject1
+ \fi\fi
+ \ifcase\makeMPintoPDFobject
+ \box#1%
+ \or
+ \scratchdimen\PDFMPformoffset\relax
+ \ifdim\scratchdimen>0pt % compensate for error
+ \setbox#1\vbox spread 2\scratchdimen
+ {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+ \fi
+ \setMPPDFobject{\currentPDFresources}{#1}%
+ \ifdim\scratchdimen>0pt % compensate for error
+ \vbox to \MPheight
+ {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+ \else
+ \getMPPDFobject
+ \fi
+ \global\let\currentPDFresources\empty
+ \else
+ \box#1%
+ \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\ifx\pdfxform\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifx\pdftexversion\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifnum\pdftexversion<14
+ \def\getMPPDFobject{\box#2}%
+ \else
+ \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}%
+ \fi\fi\fi}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+%D
+%D Here are a few hooks for \CONTEXT\ specific things.
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D \macros
+%D {twodigitMPoutput}
+%D
+%D We can limit the precision to two digits after the comma
+%D by saying:
+%D
+%D \starttyping
+%D \twodigitMPoutput
+%D \stoptyping
+%D
+%D This option only works in \CONTEXT\ combined with \ETEX.
+
+\def\twodigitMPoutput
+ {\let\!MP \twodigitrounding
+ \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}%
+ \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}}
+
+\let\!MP \empty
+\let\!MPgMPa\gMPa
+\let\!MPgMPs\gMPs
+
+%D This kind of conversion is possible because \METAPOST\
+%D does all the calculations. Converting other \POSTSCRIPT\
+%D files would drive both me and \TEX\ crazy.
+
+\protect \endinput
diff --git a/graphics/metapost/contrib/tools/mptopdf/tex/context/base/syst-tex.mkii b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/syst-tex.mkii
new file mode 100644
index 0000000000..a8aea26838
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/tex/context/base/syst-tex.mkii
@@ -0,0 +1,314 @@
+%D \module
+%D [ file=syst-tex,
+%D version=1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Efficient \PLAIN\ \TEX\ loading,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is used by mptopdf.
+
+%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we
+%D want to make the format file as independant as possible of
+%D machine dependant font encodings, we have to bypass the
+%D loading of fonts.
+%D
+%D Let's start at the beginning. Because \PLAIN\ is not yet
+%D loaded we have to define some \CATCODES\ ourselves.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 % circumflex is for superscripts
+
+%D To prevent all kind of end||of||file problems, for the
+%D moment we simply ignore the Control~Z token.
+
+\catcode`\^^Z=9
+
+%D We are going to report to the user what we are skipping.
+
+\def\skipmessage#1{\immediate\write16{skipping #1 in plain}}
+
+%D We want to be able to use the \type{\newsomething}
+%D declarations not only on the \type{\outer} level. This can
+%D be done by redefining \type{\outer} so we have to save its
+%D original meaning.
+
+\let\normalouter = \outer
+\let\outer = \relax
+
+%D We also want to postpone the loading of hyphenation patters,
+%D so we redefine and therefore save \type{\input}.
+
+\let\normalinput = \input
+\def\input #1 {\skipmessage{\string\input}}
+
+%D Finaly are going to we redefine some font specification
+%D commands and that's why we save them too. The redefinitions
+%D are straightforward because the macros have to do nothing
+%D but skipping.
+
+\let\normalskewchar = \skewchar
+\def\skewchar #1=#2 {\skipmessage{\string\skewchar}}
+
+\let\normaltextfont = \textfont
+\let\normalscriptfont = \scriptfont
+\let\normalscriptscriptfont = \scriptscriptfont
+
+\def\textfont #1=#2{\skipmessage{\string\textfont}}
+\def\scriptfont #1=#2{\skipmessage{\string\scriptfont}}
+\def\scriptscriptfont #1=#2{\skipmessage{\string\scriptscriptfont}}
+
+%D The redefinition of \type{\font} is a bit more complicated,
+%D because in version 3.14159 a scaled specification was
+%D introduced.
+
+\let\normalfont = \font
+
+\def\skipscaled scaled #1 {}
+
+\long\def\font#1=#2 #3%
+ {\ifx#3s%
+ \skipmessage{scaled \string\font}%
+ \let\next\skipscaled
+ \else
+ \skipmessage{\string\font}%
+ \let\next\relax
+ \fi
+ \next#3}
+
+% or:
+%
+% \long\def\font#1=#2 #3%
+% {\ifx#3s%
+% \skipmessage{scaled \string\font}%
+% \expandafter\skipscaled
+% \else
+% \skipmessage{\string\font}%
+% \fi
+% #3}
+
+%D Relaxing some font switching macros is needed because we
+%D don't want any error messages during loading. These
+%D unharmfull messages could be ingored.
+%D
+%D The next substitution is needed for determining
+%D \type{\p@renwd} in the macro \type{\bordermatrix}.
+
+\def\tenex#1%
+ {\skipmessage{used \string\tenex}\hskip8.75002pt}
+
+%D We need to define \type{\tenrm} for switching to
+%D \type{\rm}.
+
+\def\tenrm%
+ {\skipmessage{\string\tenrm}}
+
+%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just
+%D like \type{\p@renwd}. We only postpone loading them until
+%D they are actually needed.
+
+%D By bypassing fonts, some definitions become less valid so
+%D we have to redefine them afterwards.
+%D
+%D \starttyping
+%D \let\normalbordermatrix=\bordermatrix
+%D
+%D \def\bordermatrix%
+%D {\bgroup
+%D \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+%D \global\p@renwd=\wd0\relax
+%D \egroup
+%D \normalbordermatrix}
+%D \stoptyping
+
+%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use
+%D \type{\normalinput} and not \type{\input}.
+
+\normalinput plain.tex \let\normalfmtversion\fmtversion
+
+%D We have to take care of unwanted \PDFTEX\
+%D initializations. We just want to default to \DVI\ output.
+
+\ifx\pdftexversion\undefined
+ \chardef\pdfoutput=0
+\else
+ \pdfoutput=0
+\fi
+
+%D When applicable, we also load the \ETEX\ source and
+%D definition files.
+
+\bgroup \obeylines
+
+\ifx\eTeXversion\undefined
+
+ \long\gdef\beginETEX#1\endETEX%
+ {}
+
+ \gdef\beginTEX%
+ {\bgroup\obeylines\dobeginTEX}
+
+ \gdef\dobeginTEX#1
+ {\egroup}
+
+ \global\let\endTEX\relax
+
+\else
+
+ \long\gdef\beginTEX#1\endTEX%
+ {}
+
+ \gdef\beginETEX%
+ {\bgroup\obeylines\dobeginETEX}
+
+% \gdef\dobeginETEX#1
+% {\egroup\immediate\write16%
+% {system (E-TEX) : [line \the\inputlineno] \detokenize{#1}}}
+
+ \gdef\dobeginETEX#1
+ {\egroup}
+
+ \global\let\endETEX\relax
+
+\fi
+
+\egroup
+
+% \ifx\eTeXversion\undefined
+% \long\def\onlyTEX #1{#1}
+% \long\def\onlyETEX#1{}
+% \else
+% \long\def\only TEX#1{}
+% \long\def\onlyETEX#1{#1}
+% \fi
+
+%D Well, this redefintion of \type {\input} fails on \ETEX,
+%D because of some \type {\cs\fi} constructs. So now we use:
+
+% \beginETEX etex.src etexdefs.lib
+%
+% \def\input#1%
+% {\bgroup
+% \skipmessage{\string\input}%
+% \expandafter\ifx\expandafter#1\csname l@ngdefnfile\endcsname
+% \let\input\egroup
+% \else
+% \def\input##1 {\egroup}%
+% \fi
+% \input}
+%
+% \normalinput etex.src \relax
+% \normalinput etexdefs.lib \relax
+%
+% \let\fmtversion\normalfmtversion
+%
+% \savinghyphcodes=1
+%
+% \endETEX
+%
+% \ifx\normalprotected \undefined \let\normalprotected \protected \fi
+% \ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
+% \ifx\normalexpanded \undefined \let\normalexpanded \expanded \fi
+
+\beginETEX \savinghyphcodes
+
+ \savinghyphcodes=1
+
+\endETEX
+
+%D We restore some redefined primitives to their old meaning.
+
+\let\font = \normalfont
+\let\skewchar = \normalskewchar
+\let\textfont = \normaltextfont
+\let\scriptfont = \normalscriptfont
+\let\scriptscriptfont = \normalscriptscriptfont
+\let\input = \normalinput
+\let\outer = \normalouter
+
+%D We reset some of the used auxiliary macro's to
+%D \type{\undefined}. One never knows what testing on them is
+%D done elsewhere.
+
+\let\skipmessage = \undefined
+\let\skipscaled = \undefined
+\let\normalfont = \undefined
+\let\normalskewchar = \undefined
+\let\normaltextfont = \undefined
+\let\normalscriptfont = \undefined
+\let\normalscriptscriptfont = \undefined
+
+% \let\normalinput = \undefined
+% \let\normalouter = \undefined
+
+%D We want a bit more statistics and some less logging info
+%D in the \type{log} file.
+
+\def\wlog#1{}
+
+% \let\normalwlog\wlog
+%
+% \def\wlog#1{\normalwlog{system (\string\wlog) : #1}}
+
+%D To prevent clashes, we slightly redefine the phantom
+%D macros: we let them hide their behaviour by grouping.
+
+\catcode`@=11
+
+%D Somehow this one does not work ok in math mode:
+
+\def\ph@nt%
+ {\bgroup
+ \ifmmode
+ \expandafter\mathpalette\expandafter\mathph@nt
+ \else
+ \expandafter\makeph@nt
+ \fi}
+
+\def\finph@nt%
+ {\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
+ \ifh@ \wd\tw@\wd\z@ \fi
+ \box\tw@
+ \egroup}
+
+%D But this one does work.
+
+\def\ph@nt%
+ {\ifmmode
+ \expandafter\mathpalette\expandafter\mathph@nt
+ \else
+ \bgroup\expandafter\makeph@nt
+ \fi}
+
+\def\finph@nt%
+ {\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
+ \ifh@ \wd\tw@\wd\z@ \fi
+ \box\tw@
+ \ifmmode\else\egroup\fi}
+
+\catcode`@=12
+
+%D Just for tracing purposes wet set:
+
+\tracingstats=1
+
+%D To circumvent dependencies, we can postpone certain
+%D initializations to dumping time, by appending them to the
+%D \type {\everydump} token register.
+
+\newtoks \everydump
+
+\let\normaldump \dump
+
+\def\dump{\the\everydump\normaldump}
+
+\endinput
diff --git a/graphics/metapost/contrib/tools/mptopdf/tex/generic/context/mptopdf.tex b/graphics/metapost/contrib/tools/mptopdf/tex/generic/context/mptopdf.tex
new file mode 100644
index 0000000000..1f229678da
--- /dev/null
+++ b/graphics/metapost/contrib/tools/mptopdf/tex/generic/context/mptopdf.tex
@@ -0,0 +1,176 @@
+%D \module
+%D [ file=mptopdf,
+%D version=2000.03.27,
+%D title=\METAPOST,
+%D subtitle=conversion to \PDF,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The file \type {mptopdf} provides a quick way to convert
+%D \METAPOST\ files to \PDF\ using a slightly stripped down
+%D plain \TEX, \PDFTEX, and a few \CONTEXT\ modules.
+%D
+%D First generate a format, which in \WEBC\ looks like:
+%D
+%D \starttyping
+%D pdftex --ini mptopdf
+%D \stoptyping
+%D
+%D or:
+%D
+%D \starttyping
+%D texexec --make --tex=pdftex --format=mptopdf --alone
+%D \stoptyping
+%D
+%D Since this conversion only works with \PDFTEX\ or \PDFETEX,
+%D the session is aborted when another \TEX\ is used. When
+%D finished, the resulting \type {fmt} file should be moved to
+%D the right location.
+%D
+%D The conversion itself is accomplished by:
+%D
+%D \starttyping
+%D pdftex &mptopdf \relax filename.number
+%D \stoptyping
+%D
+%D The \type {\relax} is needed since we don't want to process
+%D the file directly. Instead we pick up the filename using
+%D \type {\everypar}. Since this file is still the first one
+%D we load, although delayed, the jobname is as we expect. So,
+%D at least in \WEBC, the result of the conversion comes
+%D available in the file \type {filename.pdf}. This conversion
+%D process is roughly compatible with:
+%D
+%D \starttyping
+%D texexec --pdf --fig=c --result=filename filename.number
+%D \stoptyping
+%D
+%D This uses \CONTEXT, and is therefore slower. Therefore,
+%D we provide a small \PERL\ script that does a faster job,
+%D using the minimal format. Given that a format is
+%D generated, one can say:
+%D
+%D \starttyping
+%D mptopdf somefile
+%D mptopdf somefile.123
+%D mptopdf mp*.*
+%D \stoptyping
+%D
+%D The results are copied into files named \type
+%D {somefile-number}. This mechanism will also be available
+%D in a next release of \TEXUTIL.
+
+%D The \TEX\ implementation is rather simple, since we use some
+%D generic \CONTEXT\ modules. Because we need a few register
+%D allocation macros, we preload plain \TEX. We don't load
+%D fonts yet.
+
+\input syst-tex.mkii
+
+%D We check for the usage of \PDFTEX, and quit if another
+%D \TEX\ is used.
+
+\ifx\pdfoutput\undefined
+ \message{Sorry, you should use pdf(e)TeX instead.}
+ \expandafter \endinput
+\fi
+
+%D The conversion to \PDF\ is carried out by macros, that
+%D are collected in the file:
+
+\input supp-mis.mkii
+\input supp-pdf.mkii
+\input supp-mpe.mkii \MPcmykcolorstrue \MPspotcolorstrue
+
+%D We use no output routine.
+
+\output{}
+
+%D Since we need to calculate and set the bounding box,
+%D we definitely don't want to indent paragraphs.
+
+\parindent=0pt
+
+%D We use \type {\everypar} to pick up the filename and
+%D process the \METAPOST\ graphic.
+
+\everypar{\processMPfile}
+
+%D The main macro shows a few \PDFTEX\ primitives. The main
+%D work is done by the macro \type {\convertMPtoPDF} which is
+%D defined in \type supp-pdf}. This macro interprets the
+%D \METAPOST\ file. Close reading of this macro will probably
+%D learn a few (\PDF) tricks. Apart from some path
+%D transformations, which are needed since \PDF\ has a
+%D different vision on paths, the graphic is positioned in
+%D such a way that accuracy in \PDF\ xforms is guaranteed.
+
+\def\processMPfile#1 %
+ {\pdfoutput=1
+ \pdfpkresolution600
+ \pdfcompresslevel=9
+ \chardef\makeMPintoPDFobject=1
+ \hsize=100in
+ \vsize=\hsize
+ \hoffset=-1in
+ \voffset=\hoffset
+ \topskip=0pt
+ \setbox0=\vbox{\convertMPtoPDF{#1}{1}{1}}%
+ \ifdim\wd0<1in \message{[warning: the width is less than 1in]}\fi
+ \ifdim\ht0<1in \message{[warning: the height is less than 1in]}\fi
+ \pdfpageheight=\ht0
+ \pdfpagewidth=\wd0
+ \box0
+ \bye}
+
+%D The \type {\chardef} forces the converter to build a so
+%D called xform object. This is needed in case the graphic
+%D uses special trickery, like shading.
+
+%D Since \ACROBAT\ has troubles with figures smaller than
+%D 1~inch, we issue a warning. When embedding graphics in
+%D documents, a size less that 1~inch does not harm. In
+%D order to overload runtime directives in the \PDFTEX\
+%D configuration file, we set the offsets and output method
+%D in the macro.
+%D
+%D The resulting \PDF\ file is about as efficient as such a
+%D self contained file can be. However, if needed, this \PDF\
+%D file can be converted to \EPS\ using for instance the
+%D \PDFTOPS\ program (in \WEBC) or \GHOSTSCRIPT.
+
+%D A few helpers:
+
+{\catcode`\.=12
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\scratchdimen1pt\advance\scratchdimen-#1\onepoint
+ \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
+ \edef#1{\withoutpt\the\scratchdimen}}
+
+\let\negatedcolorcomponent\firstofoneargument
+
+\def\negatedcolorcomponent#1%
+ {\ifdim\dimexpr1pt-#1pt\relax<\zeropoint
+ 0pt%
+ \else
+ \expandafter\withoutpt\the\dimexpr1pt-#1pt\relax
+ \fi}
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\edef#1{\negatedcolorcomponent{#1}}}
+
+\countdef\realpageno=0 % to satisfy mkiv status reports
+
+\dump
diff --git a/graphics/metapost/tools b/graphics/metapost/tools
new file mode 120000
index 0000000000..177230c47b
--- /dev/null
+++ b/graphics/metapost/tools
@@ -0,0 +1 @@
+contrib/tools \ No newline at end of file